UNPKG

molstar

Version:

A comprehensive macromolecular library.

116 lines 5.91 kB
"use strict"; /** * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.CoarsePolymerBackboneIterator = exports.AtomicPolymerBackboneIterator = exports.PolymerBackboneIterator = void 0; var structure_1 = require("../../../../../mol-model/structure"); var int_1 = require("../../../../../mol-data/int"); var sorted_ranges_1 = require("../../../../../mol-data/int/sorted-ranges"); var polymer_1 = require("../polymer"); /** Iterates over consecutive pairs of residues/coarse elements in polymers */ function PolymerBackboneIterator(structure, unit) { switch (unit.kind) { case 0 /* Atomic */: return new AtomicPolymerBackboneIterator(structure, unit); case 1 /* Spheres */: case 2 /* Gaussians */: return new CoarsePolymerBackboneIterator(structure, unit); } } exports.PolymerBackboneIterator = PolymerBackboneIterator; function createPolymerBackbonePair(structure, unit) { return { centerA: structure_1.StructureElement.Location.create(structure, unit), centerB: structure_1.StructureElement.Location.create(structure, unit), }; } var AtomicPolymerBackboneIterator = /** @class */ (function () { function AtomicPolymerBackboneIterator(structure, unit) { this.unit = unit; this.state = 0 /* nextPolymer */; this.hasNext = false; this.traceElementIndex = unit.model.atomicHierarchy.derived.residue.traceElementIndex; // can assume it won't be -1 for polymer residues this.polymerIt = sorted_ranges_1.SortedRanges.transientSegments(polymer_1.getPolymerRanges(unit), unit.elements); this.residueIt = int_1.Segmentation.transientSegments(unit.model.atomicHierarchy.residueAtomSegments, unit.elements); this.value = createPolymerBackbonePair(structure, unit); this.hasNext = this.residueIt.hasNext && this.polymerIt.hasNext; } AtomicPolymerBackboneIterator.prototype.move = function () { if (this.state === 0 /* 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.traceElementIndex[this.residueSegment.index]; this.state = 2 /* nextResidue */; break; } } } if (this.state === 2 /* nextResidue */) { this.residueSegment = this.residueIt.move(); this.value.centerA.element = this.value.centerB.element; this.value.centerB.element = this.traceElementIndex[this.residueSegment.index]; if (!this.residueIt.hasNext) { if (this.unit.model.atomicRanges.cyclicPolymerMap.has(this.residueSegment.index)) { this.state = 3 /* cycle */; } else { // TODO need to advance to a polymer that has two or more residues (can't assume it has) this.state = 0 /* nextPolymer */; } } } else if (this.state === 3 /* cycle */) { var cyclicPolymerMap = this.unit.model.atomicRanges.cyclicPolymerMap; this.value.centerA.element = this.value.centerB.element; this.value.centerB.element = this.traceElementIndex[cyclicPolymerMap.get(this.residueSegment.index)]; // TODO need to advance to a polymer that has two or more residues (can't assume it has) this.state = 0 /* nextPolymer */; } this.hasNext = this.residueIt.hasNext || this.polymerIt.hasNext || this.state === 3 /* cycle */; return this.value; }; return AtomicPolymerBackboneIterator; }()); exports.AtomicPolymerBackboneIterator = AtomicPolymerBackboneIterator; var CoarsePolymerBackboneIterator = /** @class */ (function () { function CoarsePolymerBackboneIterator(structure, unit) { this.unit = unit; this.state = 0 /* nextPolymer */; this.hasNext = false; this.polymerIt = sorted_ranges_1.SortedRanges.transientSegments(polymer_1.getPolymerRanges(unit), unit.elements); this.value = createPolymerBackbonePair(structure, unit); this.hasNext = this.polymerIt.hasNext; } CoarsePolymerBackboneIterator.prototype.move = function () { if (this.state === 0 /* nextPolymer */) { if (this.polymerIt.hasNext) { this.polymerSegment = this.polymerIt.move(); this.elementIndex = this.polymerSegment.start; if (this.elementIndex + 1 < this.polymerSegment.end) { this.value.centerB.element = this.unit.elements[this.elementIndex]; this.state = 1 /* nextElement */; } else { this.state = 0 /* nextPolymer */; } } } if (this.state === 1 /* nextElement */) { this.elementIndex += 1; this.value.centerA.element = this.value.centerB.element; this.value.centerB.element = this.unit.elements[this.elementIndex]; if (this.elementIndex + 1 >= this.polymerSegment.end) { this.state = 0 /* nextPolymer */; } } this.hasNext = this.elementIndex + 1 < this.polymerSegment.end || this.polymerIt.hasNext; return this.value; }; return CoarsePolymerBackboneIterator; }()); exports.CoarsePolymerBackboneIterator = CoarsePolymerBackboneIterator; //# sourceMappingURL=backbone-iterator.js.map