molstar
Version:
A comprehensive macromolecular library.
57 lines (56 loc) • 2.17 kB
JavaScript
/**
* Copyright (c) 2019-2023 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';
import { DSSPType } from './common';
/**
* Bend(i) =: [angle ((CW - Ca(i - 2)),(C"(i + 2) - C"(i))) > 70"]
*
* Type: S
*/
export function assignBends(ctx) {
const { unit, flags, proteinInfo } = ctx;
const c = unit.conformation;
const { traceElementIndex } = unit.model.atomicHierarchy.derived.residue;
const { residueIndices, nIndices } = proteinInfo;
const residueCount = residueIndices.length;
// const position = (i: number, v: Vec3) => Vec3.set(v, x[i], y[i], z[i])
const p = (i, v) => i === -1 ? Vec3.setNaN(v) : c.position(i, v);
const caPosPrev2 = Vec3();
const caPos = Vec3();
const caPosNext2 = Vec3();
const cPos = Vec3();
const nPosNext = Vec3();
const caMinus2 = Vec3();
const caPlus2 = Vec3();
f1: for (let i = 2; i < residueCount - 2; i++) {
// check for peptide bond
for (let k = 0; k < 4; k++) {
const index = i + k - 2;
p(traceElementIndex[index], cPos);
p(nIndices[index + 1], nPosNext);
if (Vec3.squaredDistance(cPos, nPosNext) > 6.25 /* max squared peptide bond distance allowed */) {
continue f1;
}
}
const oRIprev2 = residueIndices[i - 2];
const oRI = residueIndices[i];
const oRInext2 = residueIndices[i + 2];
const caAtomPrev2 = traceElementIndex[oRIprev2];
const caAtom = traceElementIndex[oRI];
const caAtomNext2 = traceElementIndex[oRInext2];
p(caAtomPrev2, caPosPrev2);
p(caAtom, caPos);
p(caAtomNext2, caPosNext2);
Vec3.sub(caMinus2, caPosPrev2, caPos);
Vec3.sub(caPlus2, caPos, caPosNext2);
const angle = radToDeg(Vec3.angle(caMinus2, caPlus2));
if (angle && angle > 70.00) {
flags[i] |= DSSPType.Flag.S;
}
}
}