UNPKG

molstar

Version:

A comprehensive macromolecular library.

137 lines (136 loc) 5.84 kB
/** * Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { Loci } from '../mol-model/loci'; import { StructureElement } from '../mol-model/structure'; import { Script } from '../mol-script/script'; import { Material } from '../mol-util/material'; import { shallowEqual } from '../mol-util/object'; export { Substance }; function Substance(layers) { return { layers: layers }; } (function (Substance) { Substance.Empty = { layers: [] }; function areEqual(sA, sB) { if (sA.layers.length === 0 && sB.layers.length === 0) return true; if (sA.layers.length !== sB.layers.length) return false; for (var i = 0, il = sA.layers.length; i < il; ++i) { if (sA.layers[i].clear !== sB.layers[i].clear) return false; if (!shallowEqual(sA.layers[i].material, sB.layers[i].material)) return false; if (!Loci.areEqual(sA.layers[i].loci, sB.layers[i].loci)) return false; } return true; } Substance.areEqual = areEqual; function isEmpty(overpaint) { return overpaint.layers.length === 0; } Substance.isEmpty = isEmpty; function remap(substance, structure) { var layers = []; for (var _i = 0, _a = substance.layers; _i < _a.length; _i++) { var layer = _a[_i]; var loci = layer.loci, material = layer.material, clear = layer.clear; loci = StructureElement.Loci.remap(loci, structure); if (!StructureElement.Loci.isEmpty(loci)) { layers.push({ loci: loci, material: material, clear: clear }); } } return { layers: layers }; } Substance.remap = remap; function merge(substance) { if (isEmpty(substance)) return substance; var structure = substance.layers[0].loci.structure; var clearLoci = void 0; var map = new Map(); var shadowed = StructureElement.Loci.none(structure); for (var i = 0, il = substance.layers.length; i < il; ++i) { var _a = substance.layers[il - i - 1], loci = _a.loci, material = _a.material, clear = _a.clear; // process from end loci = StructureElement.Loci.subtract(loci, shadowed); shadowed = StructureElement.Loci.union(loci, shadowed); if (!StructureElement.Loci.isEmpty(loci)) { if (clear) { clearLoci = clearLoci ? StructureElement.Loci.union(loci, clearLoci) : loci; } else { if (map.has(material)) { loci = StructureElement.Loci.union(loci, map.get(material)); } map.set(material, loci); } } } var layers = []; if (clearLoci) { layers.push({ loci: clearLoci, material: Material(), clear: true }); } map.forEach(function (loci, material) { layers.push({ loci: loci, material: material, clear: false }); }); return { layers: layers }; } Substance.merge = merge; function filter(substance, filter) { if (isEmpty(substance)) return substance; var structure = substance.layers[0].loci.structure; var layers = []; for (var _i = 0, _a = substance.layers; _i < _a.length; _i++) { var layer = _a[_i]; var loci = layer.loci, material = layer.material, clear = layer.clear; // filter by first map to the `filter` structure and // then map back to the original structure of the substance loci var filtered = StructureElement.Loci.remap(loci, filter); loci = StructureElement.Loci.remap(filtered, structure); if (!StructureElement.Loci.isEmpty(loci)) { layers.push({ loci: loci, material: material, clear: clear }); } } return { layers: layers }; } Substance.filter = filter; function ofScript(scriptLayers, structure) { var layers = []; for (var i = 0, il = scriptLayers.length; i < il; ++i) { var _a = scriptLayers[i], script = _a.script, material = _a.material, clear = _a.clear; var loci = Script.toLoci(script, structure); if (!StructureElement.Loci.isEmpty(loci)) { layers.push({ loci: loci, material: material, clear: clear }); } } return { layers: layers }; } Substance.ofScript = ofScript; function ofBundle(bundleLayers, structure) { var layers = []; for (var i = 0, il = bundleLayers.length; i < il; ++i) { var _a = bundleLayers[i], bundle = _a.bundle, material = _a.material, clear = _a.clear; var loci = StructureElement.Bundle.toLoci(bundle, structure.root); layers.push({ loci: loci, material: material, clear: clear }); } return { layers: layers }; } Substance.ofBundle = ofBundle; function toBundle(overpaint) { var layers = []; for (var i = 0, il = overpaint.layers.length; i < il; ++i) { var _a = overpaint.layers[i], loci = _a.loci, material = _a.material, clear = _a.clear; var bundle = StructureElement.Bundle.fromLoci(loci); layers.push({ bundle: bundle, material: material, clear: clear }); } return { layers: layers }; } Substance.toBundle = toBundle; })(Substance || (Substance = {}));