molstar
Version:
A comprehensive macromolecular library.
107 lines • 4.63 kB
JavaScript
/**
* Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
* @author Fred Ludlow <Fred.Ludlow@astx.com>
*
* based in part on NGL (https://github.com/arose/ngl)
*/
import { ParamDefinition as PD } from '../../../mol-util/param-definition';
import { calcAngles } from '../chemistry/geometry';
import { Features } from './features';
import { typeSymbol, eachBondedAtom } from '../chemistry/util';
import { degToRad } from '../../../mol-math/misc';
var HalogenBondsParams = {
distanceMax: PD.Numeric(4.0, { min: 1, max: 5, step: 0.1 }),
angleMax: PD.Numeric(30, { min: 0, max: 60, step: 1 }),
};
var halBondElements = ["CL" /* CL */, "BR" /* BR */, "I" /* I */, "AT" /* AT */];
/**
* Halogen bond donors (X-C, with X one of Cl, Br, I or At) not F!
*/
function addUnitHalogenDonors(structure, unit, builder) {
var elements = unit.elements;
var _a = unit.model.atomicConformation, x = _a.x, y = _a.y, z = _a.z;
for (var i = 0, il = elements.length; i < il; ++i) {
var element = typeSymbol(unit, i);
if (halBondElements.includes(element)) {
builder.add(6 /* HalogenDonor */, 0 /* None */, x[elements[i]], y[elements[i]], z[elements[i]], i);
}
}
}
var X = ["N" /* N */, "O" /* O */, "S" /* S */];
var Y = ["C" /* C */, "N" /* N */, "P" /* P */, "S" /* S */];
/**
* Halogen bond acceptors (Y-{O|N|S}, with Y=C,P,N,S)
*/
function addUnitHalogenAcceptors(structure, unit, builder) {
var elements = unit.elements;
var _a = unit.model.atomicConformation, x = _a.x, y = _a.y, z = _a.z;
var _loop_1 = function (i, il) {
var element = typeSymbol(unit, i);
if (X.includes(element)) {
var flag_1 = false;
eachBondedAtom(structure, unit, i, function (unitB, indexB) {
if (Y.includes(typeSymbol(unitB, indexB))) {
flag_1 = true;
}
});
if (flag_1) {
builder.add(7 /* HalogenAcceptor */, 0 /* None */, x[elements[i]], y[elements[i]], z[elements[i]], i);
}
}
};
for (var i = 0, il = elements.length; i < il; ++i) {
_loop_1(i, il);
}
}
function isHalogenBond(ti, tj) {
return ((ti === 7 /* HalogenAcceptor */ && tj === 6 /* HalogenDonor */) ||
(ti === 6 /* HalogenDonor */ && tj === 7 /* HalogenAcceptor */));
}
// http://www.pnas.org/content/101/48/16789.full
var OptimalHalogenAngle = degToRad(180); // adjusted from 165 to account for spherical statistics
var OptimalAcceptorAngle = degToRad(120);
function getOptions(props) {
return {
angleMax: degToRad(props.angleMax),
};
}
function testHalogenBond(structure, infoA, infoB, opts) {
var typeA = infoA.types[infoA.feature];
var typeB = infoB.types[infoB.feature];
if (!isHalogenBond(typeA, typeB))
return;
var _a = typeA === 6 /* HalogenDonor */ ? [infoA, infoB] : [infoB, infoA], don = _a[0], acc = _a[1];
var donIndex = don.members[don.offsets[don.feature]];
var accIndex = acc.members[acc.offsets[acc.feature]];
var halogenAngles = calcAngles(structure, don.unit, donIndex, acc.unit, accIndex);
// Singly bonded halogen only (not bromide ion for example)
if (halogenAngles.length !== 1)
return;
if (OptimalHalogenAngle - halogenAngles[0] > opts.angleMax)
return;
var acceptorAngles = calcAngles(structure, acc.unit, accIndex, don.unit, donIndex);
// Angle must be defined. Excludes water as acceptor. Debatable
if (acceptorAngles.length === 0)
return;
if (acceptorAngles.some(function (acceptorAngle) { return OptimalAcceptorAngle - acceptorAngle > opts.angleMax; }))
return;
return 5 /* HalogenBond */;
}
//
export var HalogenDonorProvider = Features.Provider([6 /* HalogenDonor */], addUnitHalogenDonors);
export var HalogenAcceptorProvider = Features.Provider([7 /* HalogenAcceptor */], addUnitHalogenAcceptors);
export var HalogenBondsProvider = {
name: 'halogen-bonds',
params: HalogenBondsParams,
createTester: function (props) {
var opts = getOptions(props);
return {
maxDistance: props.distanceMax,
requiredFeatures: new Set([6 /* HalogenDonor */, 7 /* HalogenAcceptor */]),
getType: function (structure, infoA, infoB) { return testHalogenBond(structure, infoA, infoB, opts); }
};
}
};
//# sourceMappingURL=halogen-bonds.js.map