_buildAlphaHelices()

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;
        }
      }
    }
  }