UNPKG

molstar

Version:

A comprehensive macromolecular library.

47 lines (46 loc) 2.24 kB
/** * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> * @author Sebastian Bittrich <sebastian.bittrich@rcsb.org> */ import { Vec3 } from '../../../../mol-math/linear-algebra'; import { radToDeg } from '../../../../mol-math/misc'; export function calculateUnitDihedralAngles(unit, proteinInfo) { var cIndices = proteinInfo.cIndices, nIndices = proteinInfo.nIndices, residueIndices = proteinInfo.residueIndices; var position = unit.conformation.position; var index = unit.model.atomicHierarchy.index; var traceElementIndex = unit.model.atomicHierarchy.derived.residue.traceElementIndex; var residueCount = residueIndices.length; var p = function (i, v) { return i === -1 ? Vec3.setNaN(v) : position(i, v); }; var cPosPrev = Vec3(), caPosPrev = Vec3(), nPosPrev = Vec3(); var cPos = Vec3(), caPos = Vec3(), nPos = Vec3(); var cPosNext = Vec3(), caPosNext = Vec3(), nPosNext = Vec3(); if (residueCount === 0) return { phi: new Float32Array(0), psi: new Float32Array(0) }; var phi = new Float32Array(residueCount - 1); var psi = new Float32Array(residueCount - 1); p(-1, cPosPrev); p(-1, caPosPrev); p(-1, nPosPrev); p(cIndices[0], cPos); p(traceElementIndex[residueIndices[0]], caPos); p(nIndices[0], nPos); p(cIndices[1], cPosNext); p(traceElementIndex[residueIndices[1]], caPosNext); p(nIndices[1], nPosNext); for (var i = 0; i < residueCount - 1; ++i) { // ignore C-terminal residue as acceptor if (index.findAtomOnResidue(residueIndices[i], 'OXT') !== -1) continue; // returns NaN for missing atoms phi[i] = radToDeg(Vec3.dihedralAngle(cPosPrev, nPos, caPos, cPos)); psi[i] = radToDeg(Vec3.dihedralAngle(nPos, caPos, cPos, nPosNext)); cPosPrev = cPos, caPosPrev = caPos, nPosPrev = nPos; cPos = cPosNext, caPos = caPosNext, nPos = nPosNext; p(cIndices[i + 1], cPosNext); p(traceElementIndex[residueIndices[i + 1]], caPosNext); p(nIndices[i + 1], nPosNext); } return { phi: phi, psi: psi }; }