UNPKG

molstar

Version:

A comprehensive macromolecular library.

111 lines 5.47 kB
"use strict"; /** * Copyright (c) 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.calcHelixOrientation = void 0; var segmentation_1 = require("../../../mol-data/int/segmentation"); var sorted_ranges_1 = require("../../../mol-data/int/sorted-ranges"); var int_1 = require("../../../mol-data/int"); var linear_algebra_1 = require("../../../mol-math/linear-algebra"); /** Usees same definition as GROMACS' helixorient */ function calcHelixOrientation(model) { var _a = model.atomicConformation, x = _a.x, y = _a.y, z = _a.z; var _b = model.atomicHierarchy.derived.residue, polymerType = _b.polymerType, traceElementIndex = _b.traceElementIndex; var n = polymerType.length; var elements = int_1.OrderedSet.ofBounds(0, model.atomicConformation.atomId.rowCount); var polymerIt = sorted_ranges_1.SortedRanges.transientSegments(model.atomicRanges.polymerRanges, elements); var residueIt = segmentation_1.Segmentation.transientSegments(model.atomicHierarchy.residueAtomSegments, elements); var centers = new Float32Array(n * 3); var axes = new Float32Array(n * 3); var i = 0; var j = -1; var s = -1; var a1 = (0, linear_algebra_1.Vec3)(); var a2 = (0, linear_algebra_1.Vec3)(); var a3 = (0, linear_algebra_1.Vec3)(); var a4 = (0, linear_algebra_1.Vec3)(); var r12 = (0, linear_algebra_1.Vec3)(); var r23 = (0, linear_algebra_1.Vec3)(); var r34 = (0, linear_algebra_1.Vec3)(); var v1 = (0, linear_algebra_1.Vec3)(); var v2 = (0, linear_algebra_1.Vec3)(); var vt = (0, linear_algebra_1.Vec3)(); var diff13 = (0, linear_algebra_1.Vec3)(); var diff24 = (0, linear_algebra_1.Vec3)(); var axis = (0, linear_algebra_1.Vec3)(); var prevAxis = (0, linear_algebra_1.Vec3)(); while (polymerIt.hasNext) { var ps = polymerIt.move(); residueIt.setSegment(ps); i = -1; s = -1; while (residueIt.hasNext) { i += 1; var index = residueIt.move().index; if (i === 0) s = index; j = (index - 2); var j3 = j * 3; linear_algebra_1.Vec3.copy(a1, a2); linear_algebra_1.Vec3.copy(a2, a3); linear_algebra_1.Vec3.copy(a3, a4); var eI_1 = traceElementIndex[index]; linear_algebra_1.Vec3.set(a4, x[eI_1], y[eI_1], z[eI_1]); if (i < 3) continue; linear_algebra_1.Vec3.sub(r12, a2, a1); linear_algebra_1.Vec3.sub(r23, a3, a2); linear_algebra_1.Vec3.sub(r34, a4, a3); linear_algebra_1.Vec3.sub(diff13, r12, r23); linear_algebra_1.Vec3.sub(diff24, r23, r34); linear_algebra_1.Vec3.cross(axis, diff13, diff24); linear_algebra_1.Vec3.normalize(axis, axis); linear_algebra_1.Vec3.toArray(axis, axes, j3); var tmp = Math.cos(linear_algebra_1.Vec3.angle(diff13, diff24)); var diff13Length = linear_algebra_1.Vec3.magnitude(diff13); var diff24Length = linear_algebra_1.Vec3.magnitude(diff24); var r = (Math.sqrt(diff24Length * diff13Length) / // clamp, to avoid numerical instabilities for when // angle between diff13 and diff24 is close to 0 Math.max(2.0, 2.0 * (1.0 - tmp))); linear_algebra_1.Vec3.scale(v1, diff13, r / diff13Length); linear_algebra_1.Vec3.sub(v1, a2, v1); linear_algebra_1.Vec3.toArray(v1, centers, j3); linear_algebra_1.Vec3.scale(v2, diff24, r / diff24Length); linear_algebra_1.Vec3.sub(v2, a3, v2); linear_algebra_1.Vec3.toArray(v2, centers, j3 + 3); linear_algebra_1.Vec3.copy(prevAxis, axis); } // calc axis as dir of second and third center pos // project first trace atom onto axis to get first center pos var s3 = s * 3; linear_algebra_1.Vec3.fromArray(v1, centers, s3 + 3); linear_algebra_1.Vec3.fromArray(v2, centers, s3 + 6); linear_algebra_1.Vec3.normalize(axis, linear_algebra_1.Vec3.sub(axis, v1, v2)); var sI = traceElementIndex[s]; linear_algebra_1.Vec3.set(a1, x[sI], y[sI], z[sI]); linear_algebra_1.Vec3.copy(vt, a1); linear_algebra_1.Vec3.projectPointOnVector(vt, vt, axis, v1); linear_algebra_1.Vec3.toArray(vt, centers, s3); // calc axis as dir of n-1 and n-2 center pos // project last traceAtom onto axis to get last center pos var e = j + 2; var e3 = e * 3; linear_algebra_1.Vec3.fromArray(v1, centers, e3 - 3); linear_algebra_1.Vec3.fromArray(v2, centers, e3 - 6); linear_algebra_1.Vec3.normalize(axis, linear_algebra_1.Vec3.sub(axis, v1, v2)); var eI = traceElementIndex[e]; linear_algebra_1.Vec3.set(a1, x[eI], y[eI], z[eI]); linear_algebra_1.Vec3.copy(vt, a1); linear_algebra_1.Vec3.projectPointOnVector(vt, vt, axis, v1); linear_algebra_1.Vec3.toArray(vt, centers, e3); } return { centers: centers }; } exports.calcHelixOrientation = calcHelixOrientation; //# sourceMappingURL=helix-orientation.js.map