molstar
Version:
A comprehensive macromolecular library.
47 lines (46 loc) • 2.24 kB
JavaScript
/**
* 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 };
}