in packages/miew/src/chem/SecondaryStructureMap.js [71:157]
_buildAlphaHelices(inResidues, chainLength, inPreferPiHelices) {
// Helix and Turn
for (let stride = 3; stride <= 5; ++stride) {
if (inResidues.length < stride) {
break;
}
for (let i = 0; i + stride < chainLength; ++i) {
if (this._hbonds.isBond(inResidues[i + stride]._index, inResidues[i]._index)
/* && NoChainBreak(res[i], res[i + stride]) */) {
this._helixFlags[stride][inResidues[i + stride]._index] = HelixFlag.END;
for (let j = i + 1; j < i + stride; ++j) {
if (typeof this._helixFlags[stride][inResidues[j]._index] === 'undefined') {
this._helixFlags[stride][inResidues[j]._index] = HelixFlag.MIDDLE;
}
}
if (this._helixFlags[stride][inResidues[i]._index] === HelixFlag.END) {
this._helixFlags[stride][inResidues[i]._index] = HelixFlag.START_AND_END;
} else {
this._helixFlags[stride][inResidues[i]._index] = HelixFlag.START;
}
}
}
}
for (let i = 2; i < chainLength - 2; ++i) {
const kappa = this._kappa(inResidues[i - 2], inResidues[i], inResidues[i + 2]);
this._bend[inResidues[i]._index] = (kappa !== 360 && kappa > 70);
}
for (let i = 1; i + 4 < chainLength; ++i) {
if (this._isHelixStart(inResidues[i]._index, 4) && this._isHelixStart(inResidues[i - 1]._index, 4)) {
for (let j = i; j <= i + 3; ++j) {
this._ss[inResidues[j]._index] = StructureType.HELIX_ALPHA;
}
}
}
for (let i = 1; i + 3 < chainLength; ++i) {
if (this._isHelixStart(inResidues[i]._index, 3) && this._isHelixStart(inResidues[i - 1]._index, 3)) {
let empty = true;
for (let j = i; empty && j <= i + 2; ++j) {
empty = typeof this._ss[inResidues[j]._index] === 'undefined'
|| this._ss[inResidues[j]._index] === StructureType.HELIX_310;
}
if (empty) {
for (let j = i; j <= i + 2; ++j) {
this._ss[inResidues[j]._index] = StructureType.HELIX_310;
}
}
}
}
for (let i = 1; i + 5 < chainLength; ++i) {
if (this._isHelixStart(inResidues[i]._index, 5) && this._isHelixStart(inResidues[i - 1]._index, 5)) {
let empty = true;
for (let j = i; empty && j <= i + 4; ++j) {
empty = typeof this._ss[inResidues[j]._index] === 'undefined'
|| this._ss[inResidues[j]._index] === StructureType.HELIX_PI
|| (inPreferPiHelices && this._ss[inResidues[j]._index] === StructureType.HELIX_ALPHA);
}
if (empty) {
for (let j = i; j <= i + 4; ++j) {
this._ss[inResidues[j]._index] = StructureType.HELIX_PI;
}
}
}
}
for (let i = 1; i + 1 < chainLength; ++i) {
if (typeof this._ss[inResidues[i]._index] === 'undefined') {
let isTurn = false;
for (let stride = 3; stride <= 5 && !isTurn; ++stride) {
for (let k = 1; k < stride && !isTurn; ++k) {
isTurn = (i >= k) && this._isHelixStart(inResidues[i - k]._index, stride);
}
}
if (isTurn) {
this._ss[inResidues[i]._index] = StructureType.TURN;
} else if (this._bend[inResidues[i]._index]) {
this._ss[inResidues[i]._index] = StructureType.BEND;
}
}
}
}