molstar
Version:
A comprehensive macromolecular library.
197 lines • 8.99 kB
JavaScript
/**
* Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.CrossLinkRestraint = exports.CrossLinkRestraintProvider = void 0;
var tslib_1 = require("tslib");
var format_1 = require("./format");
var structure_1 = require("../../../mol-model/structure");
var pair_restraints_1 = require("../pair-restraints");
var custom_structure_property_1 = require("../../common/custom-structure-property");
var location_1 = require("../../../mol-model/location");
var loci_1 = require("../../../mol-model/loci");
var centroid_helper_1 = require("../../../mol-math/geometry/centroid-helper");
var label_1 = require("../../../mol-theme/label");
var linear_algebra_1 = require("../../../mol-math/linear-algebra");
var custom_property_1 = require("../../../mol-model/custom-property");
exports.CrossLinkRestraintProvider = custom_structure_property_1.CustomStructureProperty.createProvider({
label: 'Cross Link Restraint',
descriptor: (0, custom_property_1.CustomPropertyDescriptor)({
name: 'integrative-cross-link-restraint',
// TODO `cifExport` and `symbol`
}),
type: 'local',
defaultParams: {},
getParams: function (data) { return ({}); },
isApplicable: function (data) { return data.models.some(function (m) { return !!format_1.ModelCrossLinkRestraint.Provider.get(m); }); },
obtain: function (ctx, data, props) { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () {
return (0, tslib_1.__generator)(this, function (_a) {
return [2 /*return*/, { value: extractCrossLinkRestraints(data) }];
});
}); }
});
var CrossLinkRestraint;
(function (CrossLinkRestraint) {
var Tag;
(function (Tag) {
Tag["CrossLinkRestraint"] = "cross-link-restraint";
})(Tag = CrossLinkRestraint.Tag || (CrossLinkRestraint.Tag = {}));
function isApplicable(structure) {
return structure.models.some(function (m) { return !!format_1.ModelCrossLinkRestraint.Provider.get(m); });
}
CrossLinkRestraint.isApplicable = isApplicable;
var distVecA = (0, linear_algebra_1.Vec3)(), distVecB = (0, linear_algebra_1.Vec3)();
function distance(pair) {
pair.unitA.conformation.position(pair.unitA.elements[pair.indexA], distVecA);
pair.unitB.conformation.position(pair.unitB.elements[pair.indexB], distVecB);
return linear_algebra_1.Vec3.distance(distVecA, distVecB);
}
CrossLinkRestraint.distance = distance;
function Location(crossLinkRestraints, structure, index) {
return (0, location_1.DataLocation)('cross-link-restraints', { structure: structure, crossLinkRestraints: crossLinkRestraints }, index);
}
CrossLinkRestraint.Location = Location;
function isLocation(x) {
return !!x && x.kind === 'data-location' && x.tag === 'cross-link-restraints';
}
CrossLinkRestraint.isLocation = isLocation;
function areLocationsEqual(locA, locB) {
return (locA.data.structure === locB.data.structure &&
locA.data.crossLinkRestraints === locB.data.crossLinkRestraints &&
locA.element === locB.element);
}
CrossLinkRestraint.areLocationsEqual = areLocationsEqual;
function _label(crossLinkRestraints, element) {
var p = crossLinkRestraints.pairs[element];
return "Cross Link Restraint | Type: " + p.restraintType + " | Threshold: " + p.distanceThreshold + " \u212B | Psi: " + p.psi + " | Sigma 1: " + p.sigma1 + " | Sigma 2: " + p.sigma2 + " | Distance: " + distance(p).toFixed(2) + " \u212B";
}
function locationLabel(location) {
return _label(location.data.crossLinkRestraints, location.element);
}
CrossLinkRestraint.locationLabel = locationLabel;
function Loci(structure, crossLinkRestraints, elements) {
return (0, loci_1.DataLoci)('cross-link-restraints', { structure: structure, crossLinkRestraints: crossLinkRestraints }, elements, function (boundingSphere) { return getBoundingSphere(crossLinkRestraints, elements, boundingSphere); }, function () { return getLabel(structure, crossLinkRestraints, elements); });
}
CrossLinkRestraint.Loci = Loci;
function isLoci(x) {
return !!x && x.kind === 'data-loci' && x.tag === 'interactions';
}
CrossLinkRestraint.isLoci = isLoci;
function getBoundingSphere(crossLinkRestraints, elements, boundingSphere) {
return centroid_helper_1.CentroidHelper.fromPairProvider(elements.length, function (i, pA, pB) {
var p = crossLinkRestraints.pairs[elements[i]];
p.unitA.conformation.position(p.unitA.elements[p.indexA], pA);
p.unitB.conformation.position(p.unitB.elements[p.indexB], pB);
}, boundingSphere);
}
CrossLinkRestraint.getBoundingSphere = getBoundingSphere;
function getLabel(structure, crossLinkRestraints, elements) {
var element = elements[0];
if (element === undefined)
return '';
var p = crossLinkRestraints.pairs[element];
return [
_label(crossLinkRestraints, element),
(0, label_1.bondLabel)(structure_1.Bond.Location(structure, p.unitA, p.indexA, structure, p.unitB, p.indexB))
].join('</br>');
}
CrossLinkRestraint.getLabel = getLabel;
})(CrossLinkRestraint || (CrossLinkRestraint = {}));
exports.CrossLinkRestraint = CrossLinkRestraint;
//
function _addRestraints(map, unit, restraints) {
var elements = unit.elements;
var elementCount = elements.length;
var kind = unit.kind;
var _loop_1 = function (i) {
var e = elements[i];
restraints.getIndicesByElement(e, kind).forEach(function (ri) { return map.set(ri, i); });
};
for (var i = 0; i < elementCount; i++) {
_loop_1(i);
}
}
function extractInter(pairs, unitA, unitB) {
if (unitA.model !== unitB.model)
return;
if (unitA.model.sourceData.kind !== 'mmCIF')
return;
var restraints = format_1.ModelCrossLinkRestraint.Provider.get(unitA.model);
if (!restraints)
return;
var rA = new Map();
var rB = new Map();
_addRestraints(rA, unitA, restraints);
_addRestraints(rB, unitB, restraints);
rA.forEach(function (indexA, ri) {
var indexB = rB.get(ri);
if (indexB !== undefined) {
pairs.push(createCrossLinkRestraint(unitA, indexA, unitB, indexB, restraints, ri), createCrossLinkRestraint(unitB, indexB, unitA, indexA, restraints, ri));
}
});
}
function extractIntra(pairs, unit) {
if (unit.model.sourceData.kind !== 'mmCIF')
return;
var restraints = format_1.ModelCrossLinkRestraint.Provider.get(unit.model);
if (!restraints)
return;
var elements = unit.elements;
var elementCount = elements.length;
var kind = unit.kind;
var r = new Map();
var _loop_2 = function (i) {
var e = elements[i];
restraints.getIndicesByElement(e, kind).forEach(function (ri) {
var il = r.get(ri);
if (il)
il.push(i);
else
r.set(ri, [i]);
});
};
for (var i = 0; i < elementCount; i++) {
_loop_2(i);
}
r.forEach(function (il, ri) {
if (il.length < 2)
return;
var indexA = il[0], indexB = il[1];
pairs.push(createCrossLinkRestraint(unit, indexA, unit, indexB, restraints, ri), createCrossLinkRestraint(unit, indexB, unit, indexA, restraints, ri));
});
}
function createCrossLinkRestraint(unitA, indexA, unitB, indexB, restraints, row) {
return {
unitA: unitA,
indexA: indexA,
unitB: unitB,
indexB: indexB,
restraintType: restraints.data.restraint_type.value(row),
distanceThreshold: restraints.data.distance_threshold.value(row),
psi: restraints.data.psi.value(row),
sigma1: restraints.data.sigma_1.value(row),
sigma2: restraints.data.sigma_2.value(row),
};
}
function extractCrossLinkRestraints(structure) {
var pairs = [];
if (!structure.models.some(function (m) { return format_1.ModelCrossLinkRestraint.Provider.get(m); })) {
return new pair_restraints_1.PairRestraints(pairs);
}
var n = structure.units.length;
for (var i = 0; i < n; ++i) {
var unitA = structure.units[i];
extractIntra(pairs, unitA);
for (var j = i + 1; j < n; ++j) {
var unitB = structure.units[j];
if (unitA.model === unitB.model) {
extractInter(pairs, unitA, unitB);
}
}
}
return new pair_restraints_1.PairRestraints(pairs);
}
//# sourceMappingURL=property.js.map
;