Skip to content
Snippets Groups Projects
Commit ece0b648 authored by Alexander Rose's avatar Alexander Rose
Browse files

polymer fixes

parent c647ab31
No related branches found
No related tags found
No related merge requests found
......@@ -33,6 +33,7 @@ const sVec = Vec3.zero()
async function createNucleotideBlockMesh(ctx: RuntimeContext, unit: Unit, props: {}, mesh?: Mesh) {
if (!Unit.isAtomic(unit)) return Mesh.createEmpty(mesh)
// TODO better vertex count estimate
const builder = MeshBuilder.create(256, 128, mesh)
const { elements, model } = unit
......
......@@ -4,7 +4,7 @@
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { Unit, StructureElement } from 'mol-model/structure';
import { Unit } from 'mol-model/structure';
import { UnitsVisual } from '..';
import { RuntimeContext } from 'mol-task'
import { Mesh } from '../../../shape/mesh';
......@@ -16,6 +16,7 @@ import { StructureElementIterator } from './util/location-iterator';
import { DefaultUnitsMeshProps, UnitsMeshVisual } from '../units-visual';
import { SizeThemeProps, SizeTheme } from 'mol-view/theme/size';
import { CylinderProps } from '../../../primitive/cylinder';
import { OrderedSet } from 'mol-data/int';
export interface PolymerBackboneCylinderProps {
sizeTheme: SizeThemeProps
......@@ -36,26 +37,21 @@ async function createPolymerBackboneCylinderMesh(ctx: RuntimeContext, unit: Unit
const pos = unit.conformation.invariantPosition
const pA = Vec3.zero()
const pB = Vec3.zero()
const l = StructureElement.create(unit)
const cylinderProps: CylinderProps = { radiusTop: 1, radiusBottom: 1, radialSegments }
let i = 0
const polymerBackboneIt = PolymerBackboneIterator(unit)
while (polymerBackboneIt.hasNext) {
const { centerA, centerB } = polymerBackboneIt.move()
const elmA = elements[centerA.element]
const elmB = elements[centerB.element]
pos(elmA, pA)
pos(elmB, pB)
pos(centerA.element, pA)
pos(centerB.element, pB)
l.element = elmA
cylinderProps.radiusTop = cylinderProps.radiusBottom = sizeTheme.size(l)
builder.setId(centerA.element)
cylinderProps.radiusTop = cylinderProps.radiusBottom = sizeTheme.size(centerA)
builder.setId(OrderedSet.findPredecessorIndex(elements, centerA.element))
builder.addCylinder(pA, pB, 0.5, cylinderProps)
l.element = elmB
cylinderProps.radiusTop = cylinderProps.radiusBottom = sizeTheme.size(l)
builder.setId(centerB.element)
cylinderProps.radiusTop = cylinderProps.radiusBottom = sizeTheme.size(centerB)
builder.setId(OrderedSet.findPredecessorIndex(elements, centerB.element))
builder.addCylinder(pB, pA, 0.5, cylinderProps)
if (i % 10000 === 0 && ctx.shouldUpdate) {
......
......@@ -5,11 +5,10 @@
*/
import { Unit, StructureElement, ElementIndex, ResidueIndex } from 'mol-model/structure';
import { Segmentation, SortedArray } from 'mol-data/int';
import { Segmentation } from 'mol-data/int';
import Iterator from 'mol-data/iterator';
import SortedRanges from 'mol-data/int/sorted-ranges';
import { getElementIndexForAtomRole } from 'mol-model/structure/util';
import { AtomRole } from 'mol-model/structure/model/types';
import { getPolymerRanges } from '../polymer';
/** Iterates over consecutive pairs of residues/coarse elements in polymers */
......@@ -44,23 +43,13 @@ export class AtomicPolymerBackboneIterator implements Iterator<PolymerBackbonePa
private residueSegment: Segmentation.Segment<ResidueIndex>
hasNext: boolean = false;
private getElementIndex(residueIndex: ResidueIndex, atomRole: AtomRole) {
const index = getElementIndexForAtomRole(this.unit.model, residueIndex, atomRole)
// TODO handle case when it returns -1
const elementIndex = SortedArray.indexOf(this.unit.elements, index) as ElementIndex
if (elementIndex === -1) {
console.log('-1', residueIndex, atomRole, index)
}
return elementIndex === -1 ? 0 as ElementIndex : elementIndex
}
move() {
if (this.state === AtomicPolymerBackboneIteratorState.nextPolymer) {
while (this.polymerIt.hasNext) {
this.residueIt.setSegment(this.polymerIt.move());
if (this.residueIt.hasNext) {
this.residueSegment = this.residueIt.move()
this.value.centerB.element = this.getElementIndex(this.residueSegment.index, 'trace')
this.value.centerB.element = getElementIndexForAtomRole(this.unit.model, this.residueSegment.index, 'trace')
this.state = AtomicPolymerBackboneIteratorState.nextResidue
break
}
......@@ -70,7 +59,7 @@ export class AtomicPolymerBackboneIterator implements Iterator<PolymerBackbonePa
if (this.state === AtomicPolymerBackboneIteratorState.nextResidue) {
this.residueSegment = this.residueIt.move()
this.value.centerA.element = this.value.centerB.element
this.value.centerB.element = this.getElementIndex(this.residueSegment.index, 'trace')
this.value.centerB.element = getElementIndexForAtomRole(this.unit.model, this.residueSegment.index, 'trace')
if (!this.residueIt.hasNext) {
if (this.unit.model.atomicHierarchy.cyclicPolymerMap.has(this.residueSegment.index)) {
this.state = AtomicPolymerBackboneIteratorState.cycle
......@@ -82,7 +71,7 @@ export class AtomicPolymerBackboneIterator implements Iterator<PolymerBackbonePa
} else if (this.state === AtomicPolymerBackboneIteratorState.cycle) {
const { cyclicPolymerMap } = this.unit.model.atomicHierarchy
this.value.centerA.element = this.value.centerB.element
this.value.centerB.element = this.getElementIndex(cyclicPolymerMap.get(this.residueSegment.index)!, 'trace')
this.value.centerB.element = getElementIndexForAtomRole(this.unit.model, cyclicPolymerMap.get(this.residueSegment.index)!, 'trace')
// TODO need to advance to a polymer that has two or more residues (can't assume it has)
this.state = AtomicPolymerBackboneIteratorState.nextPolymer
}
......
......@@ -21,6 +21,7 @@ import { CarbohydrateProps } from 'mol-geo/representation/structure/representati
const spacefillProps: Partial<SpacefillProps> = {
doubleSided: true,
colorTheme: { name: 'chain-id' },
sizeTheme: { name: 'physical', factor: 1.0 },
quality: 'auto',
useFog: false
}
......@@ -88,7 +89,7 @@ export class Stage {
// this.loadPdbid('1hrv') // viral assembly
// this.loadPdbid('1rb8') // virus
// this.loadPdbid('1blu') // metal coordination
this.loadPdbid('3pqr') // inter unit bonds, two polymer chains, ligands, water, carbohydrates linked to protein
// this.loadPdbid('3pqr') // inter unit bonds, two polymer chains, ligands, water, carbohydrates linked to protein
// this.loadPdbid('4v5a') // ribosome
// this.loadPdbid('3j3q') // ...
// this.loadPdbid('2np2') // dna
......@@ -123,25 +124,24 @@ export class Stage {
// this.loadPdbid('5u0q') // mixed dna/rna in same polymer
// this.loadPdbid('5u0q') // temp
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000001.cif`) // ok
this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000001.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000002.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000003.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000004.cif`) // TODO issue with cross-link extraction
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000004.cif`) // TODO issue with cross-link extraction, not shown
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000005.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000006.cif`) // TODO only three spacefill atoms rendered
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000007.cif`) // TODO only three spacefill atoms rendered
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000006.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000007.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000008.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000010.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000011.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000012.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000014.cif`) // ok
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000016.cif`) // TODO only three spacefill atoms rendered
// this.loadMmcifUrl(`../../../test/pdb-dev/PDBDEV_00000016.cif`) // ok
}
async loadMmcifUrl (url: string) {
const urlEntity = UrlEntity.ofUrl(this.ctx, url)
const modelEntity = await MmcifUrlToModel.apply(this.ctx, urlEntity)
console.log(modelEntity.value)
const structureEntity = await ModelToStructure.apply(this.ctx, modelEntity)
StructureToBallAndStick.apply(this.ctx, structureEntity, { ...ballAndStickProps, visible: true })
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment