molstar
Version:
A comprehensive macromolecular library.
197 lines • 9.47 kB
JavaScript
"use strict";
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.IndexedCustomProperty = void 0;
var structure_1 = require("../../../structure");
var int_1 = require("../../../../../mol-data/int");
var mol_util_1 = require("../../../../../mol-util");
var IndexedCustomProperty;
(function (IndexedCustomProperty) {
function getCifDataSource(structure, prop, cache) {
if (!prop)
return { rowCount: 0 };
if (cache && cache[prop.id])
return cache[prop.id];
var data = prop.getElements(structure);
var ret = { data: data, rowCount: data.elements.length };
if (cache)
cache[prop.id] = ret;
return ret;
}
IndexedCustomProperty.getCifDataSource = getCifDataSource;
function fromAtomMap(map) {
return new ElementMappedCustomProperty(map);
}
IndexedCustomProperty.fromAtomMap = fromAtomMap;
function fromAtomArray(array) {
// TODO: create "array based custom property" as optimization
return new ElementMappedCustomProperty(arrayToMap(array));
}
IndexedCustomProperty.fromAtomArray = fromAtomArray;
var getResidueSegments = function (model) { return model.atomicHierarchy.residueAtomSegments; };
function fromResidueMap(map) {
return new SegmentedMappedIndexedCustomProperty('residue', map, getResidueSegments, 0 /* Atomic */);
}
IndexedCustomProperty.fromResidueMap = fromResidueMap;
function fromResidueArray(array) {
// TODO: create "array based custom property" as optimization
return new SegmentedMappedIndexedCustomProperty('residue', arrayToMap(array), getResidueSegments, 0 /* Atomic */);
}
IndexedCustomProperty.fromResidueArray = fromResidueArray;
var getChainSegments = function (model) { return model.atomicHierarchy.chainAtomSegments; };
function fromChainMap(map) {
return new SegmentedMappedIndexedCustomProperty('chain', map, getChainSegments, 0 /* Atomic */);
}
IndexedCustomProperty.fromChainMap = fromChainMap;
function fromChainArray(array) {
// TODO: create "array based custom property" as optimization
return new SegmentedMappedIndexedCustomProperty('chain', arrayToMap(array), getChainSegments, 0 /* Atomic */);
}
IndexedCustomProperty.fromChainArray = fromChainArray;
function fromEntityMap(map) {
return new EntityMappedCustomProperty(map);
}
IndexedCustomProperty.fromEntityMap = fromEntityMap;
})(IndexedCustomProperty = exports.IndexedCustomProperty || (exports.IndexedCustomProperty = {}));
function arrayToMap(array) {
var ret = new Map();
for (var i = 0, _i = array.length; i < _i; i++)
ret.set(i, array[i]);
return ret;
}
var SegmentedMappedIndexedCustomProperty = /** @class */ (function () {
function SegmentedMappedIndexedCustomProperty(level, map, segmentGetter, kind) {
this.level = level;
this.map = map;
this.segmentGetter = segmentGetter;
this.id = mol_util_1.UUID.create22();
this.kind = kind;
}
SegmentedMappedIndexedCustomProperty.prototype.has = function (idx) { return this.map.has(idx); };
SegmentedMappedIndexedCustomProperty.prototype.get = function (idx) { return this.map.get(idx); };
SegmentedMappedIndexedCustomProperty.prototype.getStructureElements = function (structure) {
var models = structure.models;
if (models.length !== 1)
throw new Error("Only works on structures with a single model.");
var seenIndices = new Set();
var unitGroups = structure.unitSymmetryGroups;
var loci = [];
var segments = this.segmentGetter(models[0]);
for (var _a = 0, unitGroups_1 = unitGroups; _a < unitGroups_1.length; _a++) {
var unitGroup = unitGroups_1[_a];
var unit = unitGroup.units[0];
if (unit.kind !== this.kind) {
continue;
}
var chains = int_1.Segmentation.transientSegments(segments, unit.elements);
while (chains.hasNext) {
var seg = chains.move();
if (!this.has(seg.index) || seenIndices.has(seg.index))
continue;
seenIndices.add(seg.index);
loci[loci.length] = structure_1.StructureElement.Location.create(structure, unit, unit.elements[seg.start]);
}
}
loci.sort(function (x, y) { return x.element - y.element; });
return loci;
};
SegmentedMappedIndexedCustomProperty.prototype.getElements = function (structure) {
var _this = this;
var index = this.segmentGetter(structure.model).index;
var elements = this.getStructureElements(structure);
return { elements: elements, property: function (i) { return _this.get(index[elements[i].element]); } };
};
return SegmentedMappedIndexedCustomProperty;
}());
var ElementMappedCustomProperty = /** @class */ (function () {
function ElementMappedCustomProperty(map) {
this.map = map;
this.id = mol_util_1.UUID.create22();
this.level = 'atom';
this.kind = 0 /* Atomic */;
}
ElementMappedCustomProperty.prototype.has = function (idx) { return this.map.has(idx); };
ElementMappedCustomProperty.prototype.get = function (idx) { return this.map.get(idx); };
ElementMappedCustomProperty.prototype.getStructureElements = function (structure) {
var models = structure.models;
if (models.length !== 1)
throw new Error("Only works on structures with a single model.");
var seenIndices = new Set();
var unitGroups = structure.unitSymmetryGroups;
var loci = [];
for (var _a = 0, unitGroups_2 = unitGroups; _a < unitGroups_2.length; _a++) {
var unitGroup = unitGroups_2[_a];
var unit = unitGroup.units[0];
if (unit.kind !== this.kind) {
continue;
}
var elements = unit.elements;
for (var i = 0, _i = elements.length; i < _i; i++) {
var e = elements[i];
if (!this.has(e) || seenIndices.has(e))
continue;
seenIndices.add(elements[i]);
loci[loci.length] = structure_1.StructureElement.Location.create(structure, unit, e);
}
}
loci.sort(function (x, y) { return x.element - y.element; });
return loci;
};
ElementMappedCustomProperty.prototype.getElements = function (structure) {
var _this = this;
var elements = this.getStructureElements(structure);
return { elements: elements, property: function (i) { return _this.get(elements[i].element); } };
};
return ElementMappedCustomProperty;
}());
var EntityMappedCustomProperty = /** @class */ (function () {
function EntityMappedCustomProperty(map) {
this.map = map;
this.id = mol_util_1.UUID.create22();
this.level = 'entity';
this.kind = 0 /* Atomic */;
}
EntityMappedCustomProperty.prototype.has = function (idx) { return this.map.has(idx); };
EntityMappedCustomProperty.prototype.get = function (idx) { return this.map.get(idx); };
EntityMappedCustomProperty.prototype.getStructureElements = function (structure) {
var models = structure.models;
if (models.length !== 1)
throw new Error("Only works on structures with a single model.");
var index = models[0].atomicHierarchy.index;
var seenIndices = new Set();
var unitGroups = structure.unitSymmetryGroups;
var loci = [];
var segments = models[0].atomicHierarchy.chainAtomSegments;
for (var _a = 0, unitGroups_3 = unitGroups; _a < unitGroups_3.length; _a++) {
var unitGroup = unitGroups_3[_a];
var unit = unitGroup.units[0];
if (unit.kind !== this.kind) {
continue;
}
var chains = int_1.Segmentation.transientSegments(segments, unit.elements);
while (chains.hasNext) {
var seg = chains.move();
var eI = index.getEntityFromChain(seg.index);
if (!this.has(eI) || seenIndices.has(eI))
continue;
seenIndices.add(eI);
loci[loci.length] = structure_1.StructureElement.Location.create(structure, unit, unit.elements[seg.start]);
}
}
loci.sort(function (x, y) { return x.element - y.element; });
return loci;
};
EntityMappedCustomProperty.prototype.getElements = function (structure) {
var _this = this;
var elements = this.getStructureElements(structure);
var chainIndex = structure.model.atomicHierarchy.chainAtomSegments.index;
var index = structure.model.atomicHierarchy.index;
return { elements: elements, property: function (i) { return _this.get(index.getEntityFromChain(chainIndex[elements[i].element])); } };
};
return EntityMappedCustomProperty;
}());
//# sourceMappingURL=indexed.js.map