molstar
Version:
A comprehensive macromolecular library.
146 lines (145 loc) • 7.52 kB
JavaScript
"use strict";
/**
* Copyright (c) 2018-2022 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.CarbohydrateTerminalLinkVisual = exports.CarbohydrateTerminalLinkParams = void 0;
var tslib_1 = require("tslib");
var param_definition_1 = require("../../../mol-util/param-definition");
var structure_1 = require("../../../mol-model/structure");
var linear_algebra_1 = require("../../../mol-math/linear-algebra");
var link_1 = require("./util/link");
var units_visual_1 = require("../units-visual");
var complex_visual_1 = require("../complex-visual");
var location_iterator_1 = require("../../../mol-geo/util/location-iterator");
var int_1 = require("../../../mol-data/int");
var loci_1 = require("../../../mol-model/loci");
var common_1 = require("../../../mol-model/structure/structure/unit/bonds/common");
var common_2 = require("./util/common");
var geometry_1 = require("../../../mol-math/geometry");
function createCarbohydrateTerminalLinkCylinderMesh(ctx, structure, theme, props, mesh) {
var _a = structure.carbohydrates, terminalLinks = _a.terminalLinks, elements = _a.elements;
var terminalLinkSizeFactor = props.terminalLinkSizeFactor;
var location = structure_1.StructureElement.Location.create(structure);
var builderProps = {
linkCount: terminalLinks.length,
position: function (posA, posB, edgeIndex) {
var l = terminalLinks[edgeIndex];
if (l.fromCarbohydrate) {
linear_algebra_1.Vec3.copy(posA, elements[l.carbohydrateIndex].geometry.center);
l.elementUnit.conformation.position(l.elementUnit.elements[l.elementIndex], posB);
}
else {
l.elementUnit.conformation.position(l.elementUnit.elements[l.elementIndex], posA);
linear_algebra_1.Vec3.copy(posB, elements[l.carbohydrateIndex].geometry.center);
}
},
radius: function (edgeIndex) {
var l = terminalLinks[edgeIndex];
if (l.fromCarbohydrate) {
var carb = elements[l.carbohydrateIndex];
var ring = carb.unit.rings.all[carb.ringIndex];
location.unit = carb.unit;
location.element = carb.unit.elements[ring[0]];
}
else {
location.unit = l.elementUnit;
location.element = l.elementUnit.elements[l.elementIndex];
}
return theme.size.size(location) * terminalLinkSizeFactor;
},
style: function (edgeIndex) {
var l = terminalLinks[edgeIndex];
var eI = l.elementUnit.elements[l.elementIndex];
var beI = (0, common_1.getElementIdx)(l.elementUnit.model.atomicHierarchy.atoms.type_symbol.value(eI));
return common_1.MetalsSet.has(beI) ? 1 /* LinkStyle.Dashed */ : 0 /* LinkStyle.Solid */;
}
};
var _b = (0, link_1.createLinkCylinderMesh)(ctx, builderProps, props, mesh), m = _b.mesh, boundingSphere = _b.boundingSphere;
if (boundingSphere) {
m.setBoundingSphere(boundingSphere);
}
else if (m.triangleCount > 0) {
var sphere = geometry_1.Sphere3D.expand((0, geometry_1.Sphere3D)(), structure.boundary.sphere, 1 * terminalLinkSizeFactor);
m.setBoundingSphere(sphere);
}
return m;
}
exports.CarbohydrateTerminalLinkParams = tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, units_visual_1.UnitsMeshParams), link_1.LinkCylinderParams), { terminalLinkSizeFactor: param_definition_1.ParamDefinition.Numeric(0.2, { min: 0, max: 3, step: 0.01 }) });
function CarbohydrateTerminalLinkVisual(materialId) {
return (0, complex_visual_1.ComplexMeshVisual)({
defaultProps: param_definition_1.ParamDefinition.getDefaultValues(exports.CarbohydrateTerminalLinkParams),
createGeometry: createCarbohydrateTerminalLinkCylinderMesh,
createLocationIterator: CarbohydrateTerminalLinkIterator,
getLoci: getTerminalLinkLoci,
eachLocation: eachTerminalLink,
setUpdateState: function (state, newProps, currentProps) {
state.createGeometry = (newProps.terminalLinkSizeFactor !== currentProps.terminalLinkSizeFactor ||
newProps.radialSegments !== currentProps.radialSegments ||
newProps.linkCap !== currentProps.linkCap);
}
}, materialId);
}
exports.CarbohydrateTerminalLinkVisual = CarbohydrateTerminalLinkVisual;
function CarbohydrateTerminalLinkIterator(structure) {
var _a = structure.carbohydrates, elements = _a.elements, terminalLinks = _a.terminalLinks;
var groupCount = terminalLinks.length;
var instanceCount = 1;
var location = structure_1.StructureElement.Location.create(structure);
var getLocation = function (groupIndex) {
var terminalLink = terminalLinks[groupIndex];
if (terminalLink.fromCarbohydrate) {
var carb = elements[terminalLink.carbohydrateIndex];
var ring = carb.unit.rings.all[carb.ringIndex];
location.unit = carb.unit;
location.element = carb.unit.elements[ring[0]];
}
else {
location.unit = terminalLink.elementUnit;
location.element = terminalLink.elementUnit.elements[terminalLink.elementIndex];
}
return location;
};
return (0, location_iterator_1.LocationIterator)(groupCount, instanceCount, 1, getLocation, true);
}
function getTerminalLinkLoci(pickingId, structure, id) {
var objectId = pickingId.objectId, groupId = pickingId.groupId;
if (id === objectId) {
var _a = structure.carbohydrates, terminalLinks = _a.terminalLinks, elements = _a.elements;
var l = terminalLinks[groupId];
var carb = elements[l.carbohydrateIndex];
return structure_1.StructureElement.Loci.union((0, common_2.getAltResidueLociFromId)(structure, carb.unit, carb.residueIndex, carb.altId), (0, common_2.getAltResidueLoci)(structure, l.elementUnit, l.elementUnit.elements[l.elementIndex]));
}
return loci_1.EmptyLoci;
}
var __linkIndicesSet = new Set();
function eachTerminalLink(loci, structure, apply) {
var changed = false;
if (!structure_1.StructureElement.Loci.is(loci))
return false;
if (!structure_1.Structure.areEquivalent(loci.structure, structure))
return false;
var getTerminalLinkIndices = structure.carbohydrates.getTerminalLinkIndices;
var _loop_1 = function (unit, indices) {
if (!structure_1.Unit.isAtomic(unit))
return "continue";
__linkIndicesSet.clear();
int_1.OrderedSet.forEach(indices, function (v) {
var linkIndices = getTerminalLinkIndices(unit, unit.elements[v]);
for (var i = 0, il = linkIndices.length; i < il; ++i) {
if (!__linkIndicesSet.has(linkIndices[i])) {
__linkIndicesSet.add(linkIndices[i]);
if (apply(int_1.Interval.ofSingleton(linkIndices[i])))
changed = true;
}
}
});
};
for (var _i = 0, _a = loci.elements; _i < _a.length; _i++) {
var _b = _a[_i], unit = _b.unit, indices = _b.indices;
_loop_1(unit, indices);
}
return changed;
}