molstar
Version:
A comprehensive macromolecular library.
126 lines (125 loc) • 5.68 kB
JavaScript
"use strict";
/**
* Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkStructureMaxRadiusDistance = exports.checkStructureMinMaxDistance = void 0;
var linear_algebra_1 = require("../../../../mol-math/linear-algebra");
function checkStructureMinMaxDistance(ctx, a, b, minDist, maxDist, elementRadius) {
if (a.elementCount === 0 || b.elementCount === 0)
return true;
if (a.elementCount <= b.elementCount)
return MinMaxDist.check(ctx, a, b, minDist, maxDist, elementRadius);
return MinMaxDist.check(ctx, b, a, minDist, maxDist, elementRadius);
}
exports.checkStructureMinMaxDistance = checkStructureMinMaxDistance;
function checkStructureMaxRadiusDistance(ctx, a, b, maxDist, elementRadius) {
if (a.elementCount === 0 || b.elementCount === 0)
return true;
if (a.elementCount <= b.elementCount)
return MaxRadiusDist.check(ctx, a, b, maxDist, elementRadius);
return MaxRadiusDist.check(ctx, b, a, maxDist, elementRadius);
}
exports.checkStructureMaxRadiusDistance = checkStructureMaxRadiusDistance;
var MinMaxDist;
(function (MinMaxDist) {
var distVec = linear_algebra_1.Vec3.zero();
function inUnit(ctx, unit, p, eRadius, minDist, maxDist, elementRadius) {
var elements = unit.elements, position = unit.conformation.position, dV = distVec;
ctx.element.unit = unit;
var withinRange = false;
for (var i = 0, _i = elements.length; i < _i; i++) {
var e = elements[i];
ctx.element.element = e;
var d = Math.max(0, linear_algebra_1.Vec3.distance(p, position(e, dV)) - eRadius - elementRadius(ctx));
if (d < minDist)
return 0 /* Result.BelowMin */;
if (d < maxDist)
withinRange = true;
}
return withinRange ? 1 /* Result.WithinMax */ : 2 /* Result.Miss */;
}
function toPoint(ctx, s, point, radius, minDist, maxDist, elementRadius) {
var units = s.units;
var withinRange = false;
for (var i = 0, _i = units.length; i < _i; i++) {
var iu = inUnit(ctx, units[i], point, radius, minDist, maxDist, elementRadius);
if (iu === 0 /* Result.BelowMin */)
return 0 /* Result.BelowMin */;
if (iu === 1 /* Result.WithinMax */)
withinRange = true;
}
return withinRange ? 1 /* Result.WithinMax */ : 2 /* Result.Miss */;
}
MinMaxDist.toPoint = toPoint;
var distPivot = linear_algebra_1.Vec3.zero();
function check(ctx, a, b, minDist, maxDist, elementRadius) {
if (a.elementCount === 0 || b.elementCount === 0)
return 0;
var units = a.units;
var withinRange = false;
ctx.element.structure = a;
for (var i = 0, _i = units.length; i < _i; i++) {
var unit = units[i];
var elements = unit.elements, position = unit.conformation.position;
ctx.element.unit = unit;
for (var i_1 = 0, _i_1 = elements.length; i_1 < _i_1; i_1++) {
var e = elements[i_1];
ctx.element.element = e;
var tp = toPoint(ctx, b, position(e, distPivot), elementRadius(ctx), minDist, maxDist, elementRadius);
if (tp === 0 /* Result.BelowMin */)
return 0 /* Result.BelowMin */;
if (tp === 1 /* Result.WithinMax */)
withinRange = true;
}
}
return withinRange;
}
MinMaxDist.check = check;
})(MinMaxDist || (MinMaxDist = {}));
var MaxRadiusDist;
(function (MaxRadiusDist) {
var distVec = linear_algebra_1.Vec3.zero();
function inUnit(ctx, unit, p, eRadius, maxDist, elementRadius) {
var elements = unit.elements, position = unit.conformation.position, dV = distVec;
ctx.element.unit = unit;
for (var i = 0, _i = elements.length; i < _i; i++) {
var e = elements[i];
ctx.element.element = e;
if (Math.max(0, linear_algebra_1.Vec3.distance(p, position(e, dV)) - eRadius - elementRadius(ctx)) <= maxDist)
return true;
}
return false;
}
function toPoint(ctx, s, point, radius, maxDist, elementRadius) {
var units = s.units;
for (var i = 0, _i = units.length; i < _i; i++) {
if (inUnit(ctx, units[i], point, radius, maxDist, elementRadius))
return true;
}
return false;
}
MaxRadiusDist.toPoint = toPoint;
var distPivot = linear_algebra_1.Vec3.zero();
function check(ctx, a, b, maxDist, elementRadius) {
if (a.elementCount === 0 || b.elementCount === 0)
return 0;
var units = a.units;
ctx.element.structure = a;
for (var i = 0, _i = units.length; i < _i; i++) {
var unit = units[i];
ctx.element.unit = unit;
var elements = unit.elements, position = unit.conformation.position;
for (var i_2 = 0, _i_2 = elements.length; i_2 < _i_2; i_2++) {
var e = elements[i_2];
ctx.element.element = e;
if (toPoint(ctx, b, position(e, distPivot), elementRadius(ctx), maxDist, elementRadius))
return true;
}
}
return false;
}
MaxRadiusDist.check = check;
})(MaxRadiusDist || (MaxRadiusDist = {}));