UNPKG

molstar

Version:

A comprehensive macromolecular library.

146 lines (145 loc) 7.52 kB
"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; }