UNPKG

molstar

Version:

A comprehensive macromolecular library.

102 lines (101 loc) 5.89 kB
"use strict"; /** * Copyright (c) 2019-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.createEllipsoidMesh = exports.EllipsoidMeshVisual = exports.EllipsoidMeshParams = void 0; var tslib_1 = require("tslib"); var param_definition_1 = require("../../../mol-util/param-definition"); var units_visual_1 = require("../../../mol-repr/structure/units-visual"); var element_1 = require("../../../mol-repr/structure/visual/util/element"); var structure_1 = require("../../../mol-model/structure"); var mesh_1 = require("../../../mol-geo/geometry/mesh/mesh"); var sphere_1 = require("../../../mol-geo/primitive/sphere"); var mesh_builder_1 = require("../../../mol-geo/geometry/mesh/mesh-builder"); var linear_algebra_1 = require("../../../mol-math/linear-algebra"); var common_1 = require("../../../mol-repr/structure/visual/util/common"); var ellipsoid_1 = require("../../../mol-geo/geometry/mesh/builder/ellipsoid"); var anisotropic_1 = require("../../../mol-model-formats/structure/property/anisotropic"); var common_2 = require("../../../mol-math/linear-algebra/3d/common"); var sphere_2 = require("../../../mol-geo/geometry/mesh/builder/sphere"); var geometry_1 = require("../../../mol-math/geometry"); var base_1 = require("../../../mol-geo/geometry/base"); var sorted_array_1 = require("../../../mol-data/int/sorted-array"); exports.EllipsoidMeshParams = tslib_1.__assign(tslib_1.__assign({}, units_visual_1.UnitsMeshParams), { sizeFactor: param_definition_1.ParamDefinition.Numeric(1, { min: 0, max: 10, step: 0.1 }), detail: param_definition_1.ParamDefinition.Numeric(0, { min: 0, max: 3, step: 1 }, base_1.BaseGeometry.CustomQualityParamInfo), ignoreHydrogens: param_definition_1.ParamDefinition.Boolean(false) }); function EllipsoidMeshVisual(materialId) { return (0, units_visual_1.UnitsMeshVisual)({ defaultProps: param_definition_1.ParamDefinition.getDefaultValues(exports.EllipsoidMeshParams), createGeometry: createEllipsoidMesh, createLocationIterator: element_1.ElementIterator.fromGroup, getLoci: element_1.getElementLoci, eachLocation: element_1.eachElement, setUpdateState: function (state, newProps, currentProps) { state.createGeometry = (newProps.sizeFactor !== currentProps.sizeFactor || newProps.detail !== currentProps.detail || newProps.ignoreHydrogens !== currentProps.ignoreHydrogens); } }, materialId); } exports.EllipsoidMeshVisual = EllipsoidMeshVisual; function createEllipsoidMesh(ctx, unit, structure, theme, props, mesh) { var child = structure.child; var childUnit = child === null || child === void 0 ? void 0 : child.unitMap.get(unit.id); if (child && !childUnit) return mesh_1.Mesh.createEmpty(mesh); var detail = props.detail, sizeFactor = props.sizeFactor, ignoreHydrogens = props.ignoreHydrogens; var elements = unit.elements, model = unit.model; var atomicNumber = unit.model.atomicHierarchy.derived.atom.atomicNumber; var elementCount = elements.length; var vertexCount = elementCount * (0, sphere_1.sphereVertexCount)(detail); var builderState = mesh_builder_1.MeshBuilder.createState(vertexCount, vertexCount / 2, mesh); var atomSiteAnisotrop = anisotropic_1.AtomSiteAnisotrop.Provider.get(model); if (!atomSiteAnisotrop) return mesh_1.Mesh.createEmpty(mesh); var v = (0, linear_algebra_1.Vec3)(); var mat = (0, linear_algebra_1.Mat3)(); var eigvals = (0, linear_algebra_1.Vec3)(); var eigvec1 = (0, linear_algebra_1.Vec3)(); var eigvec2 = (0, linear_algebra_1.Vec3)(); var elementToAnsiotrop = atomSiteAnisotrop.elementToAnsiotrop, data = atomSiteAnisotrop.data; var U = data.U; var space = data._schema.U.space; var pos = unit.conformation.invariantPosition; var l = structure_1.StructureElement.Location.create(structure); l.unit = unit; for (var i = 0; i < elementCount; i++) { var ei = elements[i]; var ai = elementToAnsiotrop[ei]; if (ai === -1) continue; if (((!!childUnit && !sorted_array_1.SortedArray.has(childUnit.elements, ei))) || (ignoreHydrogens && (0, common_1.isH)(atomicNumber, ei))) continue; l.element = ei; pos(ei, v); builderState.currentGroup = i; linear_algebra_1.Tensor.toMat3(mat, space, U.value(ai)); linear_algebra_1.Mat3.symmtricFromLower(mat, mat); linear_algebra_1.Mat3.symmetricEigenvalues(eigvals, mat); linear_algebra_1.Mat3.eigenvector(eigvec1, mat, eigvals[1]); linear_algebra_1.Mat3.eigenvector(eigvec2, mat, eigvals[2]); for (var j = 0; j < 3; ++j) { // show 50% probability surface, needs sqrt as U matrix is in angstrom-squared // take abs of eigenvalue to avoid reflection // multiply by given size-factor eigvals[j] = sizeFactor * 1.5958 * Math.sqrt(Math.abs(eigvals[j])); } if ((0, common_2.equalEps)(eigvals[0], eigvals[1], linear_algebra_1.EPSILON) && (0, common_2.equalEps)(eigvals[1], eigvals[2], linear_algebra_1.EPSILON)) { (0, sphere_2.addSphere)(builderState, v, eigvals[0], detail); } else { (0, ellipsoid_1.addEllipsoid)(builderState, v, eigvec2, eigvec1, eigvals, detail); } } var m = mesh_builder_1.MeshBuilder.getMesh(builderState); var sphere = geometry_1.Sphere3D.expand((0, geometry_1.Sphere3D)(), (childUnit || unit).boundary.sphere, 1 * sizeFactor); m.setBoundingSphere(sphere); return m; } exports.createEllipsoidMesh = createEllipsoidMesh;