molstar
Version:
A comprehensive macromolecular library.
125 lines • 5.48 kB
JavaScript
"use strict";
/**
* 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>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.calcUnitBackboneHbonds = void 0;
var graph_1 = require("../../../../mol-math/graph");
var linear_algebra_1 = require("../../../../mol-math/linear-algebra");
/** max distance between two C-alpha atoms to check for hbond */
var caMaxDist = 9.0;
/**
* Constant for electrostatic energy in kcal/mol
* f * q1 * q2
* Q = -332 * 0.42 * 0.20
*
* f is the dimensional factor
*
* q1 and q2 are partial charges which are placed on the C,O
* (+q1,-q1) and N,H (-q2,+q2)
*/
var Q = -27.888;
/** cutoff for hbonds in kcal/mol, must be lower to be consider as an hbond */
var hbondEnergyCutoff = -0.5;
/** prevent extremely low hbond energies */
var hbondEnergyMinimal = -9.9;
/**
* E = Q * (1/r(ON) + l/r(CH) - l/r(OH) - l/r(CN))
*/
function calcHbondEnergy(oPos, cPos, nPos, hPos) {
var distOH = linear_algebra_1.Vec3.distance(oPos, hPos);
var distCH = linear_algebra_1.Vec3.distance(cPos, hPos);
var distCN = linear_algebra_1.Vec3.distance(cPos, nPos);
var distON = linear_algebra_1.Vec3.distance(oPos, nPos);
var e1 = Q / distOH - Q / distCH;
var e2 = Q / distCN - Q / distON;
var e = e1 + e2;
// cap lowest possible energy
if (e < hbondEnergyMinimal)
return hbondEnergyMinimal;
return e;
}
function calcUnitBackboneHbonds(unit, proteinInfo, lookup3d) {
var residueIndices = proteinInfo.residueIndices, cIndices = proteinInfo.cIndices, hIndices = proteinInfo.hIndices, nIndices = proteinInfo.nIndices, oIndices = proteinInfo.oIndices;
var index = unit.model.atomicHierarchy.index;
var invariantPosition = unit.conformation.invariantPosition;
var traceElementIndex = unit.model.atomicHierarchy.derived.residue.traceElementIndex;
var residueCount = residueIndices.length;
var oAtomResidues = [];
var nAtomResidues = [];
var energies = [];
var oPos = (0, linear_algebra_1.Vec3)();
var cPos = (0, linear_algebra_1.Vec3)();
var caPos = (0, linear_algebra_1.Vec3)();
var nPos = (0, linear_algebra_1.Vec3)();
var hPos = (0, linear_algebra_1.Vec3)();
var cPosPrev = (0, linear_algebra_1.Vec3)();
var oPosPrev = (0, linear_algebra_1.Vec3)();
for (var i = 0, il = residueIndices.length; i < il; ++i) {
var oPI = i;
var oRI = residueIndices[i];
var oAtom = oIndices[oPI];
var cAtom = cIndices[oPI];
var caAtom = traceElementIndex[oRI];
// continue if residue is missing O or C atom
if (oAtom === -1 || cAtom === -1)
continue;
// ignore C-terminal residue as acceptor
if (index.findAtomOnResidue(oRI, 'OXT') !== -1)
continue;
invariantPosition(oAtom, oPos);
invariantPosition(cAtom, cPos);
invariantPosition(caAtom, caPos);
var _a = lookup3d.find(caPos[0], caPos[1], caPos[2], caMaxDist), indices = _a.indices, count = _a.count;
for (var j = 0; j < count; ++j) {
var nPI = indices[j];
// ignore bonds within a residue or to prev or next residue
if (nPI === oPI || nPI - 1 === oPI || nPI + 1 === oPI)
continue;
var nAtom = nIndices[nPI];
if (nAtom === -1)
continue;
invariantPosition(nAtom, nPos);
var hAtom = hIndices[nPI];
if (hAtom === -1) {
// approximate calculation of H position, TODO factor out
if (nPI === 0)
continue;
var nPIprev = nPI - 1;
var oAtomPrev = oIndices[nPIprev];
var cAtomPrev = cIndices[nPIprev];
if (oAtomPrev === -1 || cAtomPrev === -1)
continue;
invariantPosition(oAtomPrev, oPosPrev);
invariantPosition(cAtomPrev, cPosPrev);
linear_algebra_1.Vec3.sub(hPos, cPosPrev, oPosPrev);
var dist = linear_algebra_1.Vec3.distance(oPosPrev, cPosPrev);
linear_algebra_1.Vec3.scaleAndAdd(hPos, nPos, hPos, 1 / dist);
}
else {
invariantPosition(hAtom, hPos);
}
var e = calcHbondEnergy(oPos, cPos, nPos, hPos);
if (e > hbondEnergyCutoff)
continue;
oAtomResidues[oAtomResidues.length] = oPI;
nAtomResidues[nAtomResidues.length] = nPI;
energies[energies.length] = e;
}
}
return buildHbondGraph(residueCount, oAtomResidues, nAtomResidues, energies);
}
exports.calcUnitBackboneHbonds = calcUnitBackboneHbonds;
function buildHbondGraph(residueCount, oAtomResidues, nAtomResidues, energies) {
var builder = new graph_1.IntAdjacencyGraph.DirectedEdgeBuilder(residueCount, oAtomResidues, nAtomResidues);
var _energies = new Float32Array(builder.slotCount);
for (var i = 0, _i = builder.edgeCount; i < _i; i++) {
builder.addNextEdge();
builder.assignProperty(_energies, energies[i]);
}
return builder.createGraph({ energies: energies });
}
//# sourceMappingURL=backbone-hbonds.js.map