molstar
Version:
A comprehensive macromolecular library.
137 lines (136 loc) • 5.84 kB
JavaScript
/**
* 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 = {}));