molstar
Version:
A comprehensive macromolecular library.
60 lines (59 loc) • 3.27 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 { DSSPType } from './common';
/**
* A minimal helix is defined by two consecutive n-turns.
* For example, a 4-helix, of minimal length 4 from residues i to i + 3,
* requires 4-turns at residues i - 1 and i,
*
* 3-helix(i,i + 2)=: [3-turn(i - 1) and 3-turn(i)]
* 4-helix(i,i + 3)=: [4-turn(i - 1) and 4-turn(i)]
* 5-helix(i,i + 4)=: [5-turn(i - 1) and 5-turn(i)]
*
* Type: G (n=3), H (n=4), I (n=5)
*/
export function assignHelices(ctx) {
var proteinInfo = ctx.proteinInfo, flags = ctx.flags;
var residueCount = proteinInfo.residueIndices.length;
var turnFlag = [1024 /* DSSPType.Flag.T3S */, 2048 /* DSSPType.Flag.T4S */, 4096 /* DSSPType.Flag.T5S */, 128 /* DSSPType.Flag.T3 */, 256 /* DSSPType.Flag.T4 */, 512 /* DSSPType.Flag.T5 */];
var helixFlag = [0, 0, 0, 8 /* DSSPType.Flag.G */, 1 /* DSSPType.Flag.H */, 16 /* DSSPType.Flag.I */];
var helixCheckOrder = ctx.params.oldOrdering ? [4, 3, 5] : [3, 4, 5];
for (var ni = 0; ni < helixCheckOrder.length; ni++) {
var n = helixCheckOrder[ni];
for (var i = 1, il = residueCount - n; i < il; i++) {
var fI = DSSPType.create(flags[i]);
var fI1 = DSSPType.create(flags[i - 1]);
var fI2 = DSSPType.create(flags[i + 1]);
// TODO rework to elegant solution which will not break instantly
if (ctx.params.oldOrdering) {
if ((n === 3 && (DSSPType.is(fI, 1 /* DSSPType.Flag.H */) || DSSPType.is(fI2, 1 /* DSSPType.Flag.H */)) || // for 3-10 yield to alpha helix
(n === 5 && ((DSSPType.is(fI, 1 /* DSSPType.Flag.H */) || DSSPType.is(fI, 8 /* DSSPType.Flag.G */)) || (DSSPType.is(fI2, 1 /* DSSPType.Flag.H */) || DSSPType.is(fI2, 8 /* DSSPType.Flag.G */)))))) { // for pi yield to all other helices
continue;
}
}
else {
if ((n === 4 && (DSSPType.is(fI, 8 /* DSSPType.Flag.G */) || DSSPType.is(fI2, 8 /* DSSPType.Flag.G */)) || // for alpha helix yield to 3-10
(n === 5 && ((DSSPType.is(fI, 1 /* DSSPType.Flag.H */) || DSSPType.is(fI, 8 /* DSSPType.Flag.G */)) || (DSSPType.is(fI2, 1 /* DSSPType.Flag.H */) || DSSPType.is(fI2, 8 /* DSSPType.Flag.G */)))))) { // for pi yield to all other helices
continue;
}
}
if (DSSPType.is(fI, turnFlag[n]) && DSSPType.is(fI, turnFlag[n - 3]) && // check fI for turn start of proper type
DSSPType.is(fI1, turnFlag[n]) && DSSPType.is(fI1, turnFlag[n - 3])) { // check fI1 accordingly
if (ctx.params.oldDefinition) {
for (var k = 0; k < n; k++) {
flags[i + k] |= helixFlag[n];
}
}
else {
for (var k = -1; k <= n; k++) {
flags[i + k] |= helixFlag[n];
}
}
}
}
}
}