molstar
Version:
A comprehensive macromolecular library.
331 lines • 14.6 kB
JavaScript
"use strict";
/**
* Copyright (c) 2018-2021 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.Loci = exports.DataLoci = exports.isDataLociEmpty = exports.areDataLociEqual = exports.isDataLoci = exports.isEmptyLoci = exports.EmptyLoci = exports.isEveryLoci = exports.EveryLoci = void 0;
var structure_1 = require("./structure");
var bonds_1 = require("./structure/structure/unit/bonds");
var shape_1 = require("./shape");
var geometry_1 = require("../mol-math/geometry");
var linear_algebra_1 = require("../mol-math/linear-algebra");
var structure_2 = require("./structure/structure");
var param_definition_1 = require("../mol-util/param-definition");
var mol_util_1 = require("../mol-util");
var boundary_helper_1 = require("../mol-math/geometry/boundary-helper");
var string_1 = require("../mol-util/string");
var volume_1 = require("./volume/volume");
/** A Loci that includes every loci */
exports.EveryLoci = { kind: 'every-loci' };
function isEveryLoci(x) {
return !!x && x.kind === 'every-loci';
}
exports.isEveryLoci = isEveryLoci;
/** A Loci that is empty */
exports.EmptyLoci = { kind: 'empty-loci' };
function isEmptyLoci(x) {
return !!x && x.kind === 'empty-loci';
}
exports.isEmptyLoci = isEmptyLoci;
function isDataLoci(x) {
return !!x && x.kind === 'data-loci';
}
exports.isDataLoci = isDataLoci;
function areDataLociEqual(a, b) {
// use shallowEqual to allow simple data objects that are contructed on-the-fly
if (!(0, mol_util_1.shallowEqual)(a.data, b.data) || a.tag !== b.tag)
return false;
if (a.elements.length !== b.elements.length)
return false;
for (var i = 0, il = a.elements.length; i < il; ++i) {
if (!(0, mol_util_1.shallowEqual)(a.elements[i], b.elements[i]))
return false;
}
return true;
}
exports.areDataLociEqual = areDataLociEqual;
function isDataLociEmpty(loci) {
return loci.elements.length === 0 ? true : false;
}
exports.isDataLociEmpty = isDataLociEmpty;
function DataLoci(tag, data, elements, getBoundingSphere, getLabel) {
return { kind: 'data-loci', tag: tag, data: data, elements: elements, getBoundingSphere: getBoundingSphere, getLabel: getLabel };
}
exports.DataLoci = DataLoci;
var Loci;
(function (Loci) {
var boundaryHelper = new boundary_helper_1.BoundaryHelper('98');
function getBundleBoundingSphere(bundle) {
var spheres = bundle.loci.map(function (l) { return getBoundingSphere(l); }).filter(function (s) { return !!s; });
boundaryHelper.reset();
for (var _i = 0, spheres_1 = spheres; _i < spheres_1.length; _i++) {
var s = spheres_1[_i];
boundaryHelper.includePositionRadius(s.center, s.radius);
}
boundaryHelper.finishedIncludeStep();
for (var _a = 0, spheres_2 = spheres; _a < spheres_2.length; _a++) {
var s = spheres_2[_a];
boundaryHelper.radiusPositionRadius(s.center, s.radius);
}
return boundaryHelper.getSphere();
}
Loci.getBundleBoundingSphere = getBundleBoundingSphere;
function areEqual(lociA, lociB) {
if (isEveryLoci(lociA) && isEveryLoci(lociB))
return true;
if (isEmptyLoci(lociA) && isEmptyLoci(lociB))
return true;
if (isDataLoci(lociA) && isDataLoci(lociB)) {
return areDataLociEqual(lociA, lociB);
}
if (structure_2.Structure.isLoci(lociA) && structure_2.Structure.isLoci(lociB)) {
return structure_2.Structure.areLociEqual(lociA, lociB);
}
if (structure_1.StructureElement.Loci.is(lociA) && structure_1.StructureElement.Loci.is(lociB)) {
return structure_1.StructureElement.Loci.areEqual(lociA, lociB);
}
if (bonds_1.Bond.isLoci(lociA) && bonds_1.Bond.isLoci(lociB)) {
return bonds_1.Bond.areLociEqual(lociA, lociB);
}
if (shape_1.Shape.isLoci(lociA) && shape_1.Shape.isLoci(lociB)) {
return shape_1.Shape.areLociEqual(lociA, lociB);
}
if (shape_1.ShapeGroup.isLoci(lociA) && shape_1.ShapeGroup.isLoci(lociB)) {
return shape_1.ShapeGroup.areLociEqual(lociA, lociB);
}
if (volume_1.Volume.isLoci(lociA) && volume_1.Volume.isLoci(lociB)) {
return volume_1.Volume.areLociEqual(lociA, lociB);
}
if (volume_1.Volume.Isosurface.isLoci(lociA) && volume_1.Volume.Isosurface.isLoci(lociB)) {
return volume_1.Volume.Isosurface.areLociEqual(lociA, lociB);
}
if (volume_1.Volume.Cell.isLoci(lociA) && volume_1.Volume.Cell.isLoci(lociB)) {
return volume_1.Volume.Cell.areLociEqual(lociA, lociB);
}
return false;
}
Loci.areEqual = areEqual;
function isEvery(loci) {
return !!loci && loci.kind === 'every-loci';
}
Loci.isEvery = isEvery;
function isEmpty(loci) {
if (isEveryLoci(loci))
return false;
if (isEmptyLoci(loci))
return true;
if (isDataLoci(loci))
return isDataLociEmpty(loci);
if (structure_2.Structure.isLoci(loci))
return structure_2.Structure.isLociEmpty(loci);
if (structure_1.StructureElement.Loci.is(loci))
return structure_1.StructureElement.Loci.isEmpty(loci);
if (bonds_1.Bond.isLoci(loci))
return bonds_1.Bond.isLociEmpty(loci);
if (shape_1.Shape.isLoci(loci))
return shape_1.Shape.isLociEmpty(loci);
if (shape_1.ShapeGroup.isLoci(loci))
return shape_1.ShapeGroup.isLociEmpty(loci);
if (volume_1.Volume.isLoci(loci))
return volume_1.Volume.isLociEmpty(loci);
if (volume_1.Volume.Isosurface.isLoci(loci))
return volume_1.Volume.Isosurface.isLociEmpty(loci);
if (volume_1.Volume.Cell.isLoci(loci))
return volume_1.Volume.Cell.isLociEmpty(loci);
return false;
}
Loci.isEmpty = isEmpty;
function remap(loci, data) {
if (data instanceof structure_2.Structure) {
if (structure_1.StructureElement.Loci.is(loci)) {
loci = structure_1.StructureElement.Loci.remap(loci, data);
}
else if (structure_2.Structure.isLoci(loci)) {
loci = structure_2.Structure.remapLoci(loci, data);
}
else if (bonds_1.Bond.isLoci(loci)) {
loci = bonds_1.Bond.remapLoci(loci, data);
}
}
return loci;
}
Loci.remap = remap;
function getBoundingSphere(loci, boundingSphere) {
var _a;
if (loci.kind === 'every-loci' || loci.kind === 'empty-loci')
return void 0;
if (!boundingSphere)
boundingSphere = (0, geometry_1.Sphere3D)();
if (loci.kind === 'structure-loci') {
return geometry_1.Sphere3D.copy(boundingSphere, loci.structure.boundary.sphere);
}
else if (loci.kind === 'element-loci') {
return geometry_1.Sphere3D.copy(boundingSphere, structure_1.StructureElement.Loci.getBoundary(loci).sphere);
}
else if (loci.kind === 'bond-loci') {
return bonds_1.Bond.getBoundingSphere(loci, boundingSphere);
}
else if (loci.kind === 'shape-loci') {
return geometry_1.Sphere3D.copy(boundingSphere, loci.shape.geometry.boundingSphere);
}
else if (loci.kind === 'group-loci') {
return shape_1.ShapeGroup.getBoundingSphere(loci, boundingSphere);
}
else if (loci.kind === 'data-loci') {
return (_a = loci.getBoundingSphere) === null || _a === void 0 ? void 0 : _a.call(loci, boundingSphere);
}
else if (loci.kind === 'volume-loci') {
return volume_1.Volume.getBoundingSphere(loci.volume, boundingSphere);
}
else if (loci.kind === 'isosurface-loci') {
return volume_1.Volume.Isosurface.getBoundingSphere(loci.volume, loci.isoValue, boundingSphere);
}
else if (loci.kind === 'cell-loci') {
return volume_1.Volume.Cell.getBoundingSphere(loci.volume, loci.indices, boundingSphere);
}
}
Loci.getBoundingSphere = getBoundingSphere;
var tmpSphere3D = geometry_1.Sphere3D.zero();
function getCenter(loci, center) {
var boundingSphere = getBoundingSphere(loci, tmpSphere3D);
return boundingSphere ? linear_algebra_1.Vec3.copy(center || (0, linear_algebra_1.Vec3)(), boundingSphere.center) : undefined;
}
Loci.getCenter = getCenter;
function getPrincipalAxes(loci) {
if (loci.kind === 'every-loci' || loci.kind === 'empty-loci')
return void 0;
if (loci.kind === 'structure-loci') {
return structure_1.StructureElement.Loci.getPrincipalAxes(structure_2.Structure.toStructureElementLoci(loci.structure));
}
else if (loci.kind === 'element-loci') {
return structure_1.StructureElement.Loci.getPrincipalAxes(loci);
}
else if (loci.kind === 'bond-loci') {
// TODO
return void 0;
}
else if (loci.kind === 'shape-loci') {
// TODO
return void 0;
}
else if (loci.kind === 'group-loci') {
// TODO
return void 0;
}
else if (loci.kind === 'data-loci') {
// TODO maybe add loci.getPrincipalAxes()???
return void 0;
}
else if (loci.kind === 'volume-loci') {
// TODO
return void 0;
}
else if (loci.kind === 'isosurface-loci') {
// TODO
return void 0;
}
else if (loci.kind === 'cell-loci') {
// TODO
return void 0;
}
}
Loci.getPrincipalAxes = getPrincipalAxes;
//
var Granularity = {
'element': function (loci) { return loci; },
'residue': function (loci) {
return structure_1.StructureElement.Loci.is(loci)
? structure_1.StructureElement.Loci.extendToWholeResidues(loci, true)
: loci;
},
'chain': function (loci) {
return structure_1.StructureElement.Loci.is(loci)
? structure_1.StructureElement.Loci.extendToWholeChains(loci)
: loci;
},
'entity': function (loci) {
return structure_1.StructureElement.Loci.is(loci)
? structure_1.StructureElement.Loci.extendToWholeEntities(loci)
: loci;
},
'model': function (loci) {
return structure_1.StructureElement.Loci.is(loci)
? structure_1.StructureElement.Loci.extendToWholeModels(loci)
: loci;
},
'operator': function (loci) {
return structure_1.StructureElement.Loci.is(loci)
? structure_1.StructureElement.Loci.extendToWholeOperators(loci)
: loci;
},
'structure': function (loci) {
return structure_1.StructureElement.Loci.is(loci)
? structure_2.Structure.toStructureElementLoci(loci.structure)
: shape_1.ShapeGroup.isLoci(loci)
? shape_1.Shape.Loci(loci.shape)
: loci;
},
'elementInstances': function (loci) {
return structure_1.StructureElement.Loci.is(loci)
? structure_1.StructureElement.Loci.extendToAllInstances(loci)
: loci;
},
'residueInstances': function (loci) {
return structure_1.StructureElement.Loci.is(loci)
? structure_1.StructureElement.Loci.extendToAllInstances(structure_1.StructureElement.Loci.extendToWholeResidues(loci, true))
: loci;
},
'chainInstances': function (loci) {
return structure_1.StructureElement.Loci.is(loci)
? structure_1.StructureElement.Loci.extendToAllInstances(structure_1.StructureElement.Loci.extendToWholeChains(loci))
: loci;
},
};
Loci.GranularityOptions = param_definition_1.ParamDefinition.objectToOptions(Granularity, function (k) {
switch (k) {
case 'element': return 'Atom/Coarse Element';
case 'elementInstances': return ['Atom/Coarse Element Instances', 'With Symmetry'];
case 'structure': return 'Structure/Shape';
default: return k.indexOf('Instances')
? [(0, string_1.stringToWords)(k), 'With Symmetry'] : (0, string_1.stringToWords)(k);
}
});
/** Exclude `Instances` granularity kinds */
function simpleGranularity(granularity) {
return granularity.replace('Instances', '');
}
Loci.simpleGranularity = simpleGranularity;
function applyGranularity(loci, granularity) {
return Granularity[granularity](loci);
}
Loci.applyGranularity = applyGranularity;
/**
* Converts structure related loci to StructureElement.Loci and applies
* granularity if given
*/
function normalize(loci, granularity, alwaysConvertBonds) {
if (alwaysConvertBonds === void 0) { alwaysConvertBonds = false; }
if ((granularity !== 'element' || alwaysConvertBonds) && bonds_1.Bond.isLoci(loci)) {
// convert Bond.Loci to a StructureElement.Loci so granularity can be applied
loci = bonds_1.Bond.toStructureElementLoci(loci);
}
if (structure_2.Structure.isLoci(loci)) {
// convert to StructureElement.Loci
loci = structure_2.Structure.toStructureElementLoci(loci.structure);
}
if (structure_1.StructureElement.Loci.is(loci)) {
// ensure the root structure is used
loci = structure_1.StructureElement.Loci.remap(loci, loci.structure.root);
}
if (granularity) {
// needs to be applied AFTER remapping to root
loci = applyGranularity(loci, granularity);
}
return loci;
}
Loci.normalize = normalize;
})(Loci || (Loci = {}));
exports.Loci = Loci;
//# sourceMappingURL=loci.js.map