molstar
Version:
A comprehensive macromolecular library.
129 lines (128 loc) • 5.44 kB
JavaScript
/**
* Copyright (c) 2017-2023 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.checkStructureMinMaxDistance = checkStructureMinMaxDistance;
exports.checkStructureMaxRadiusDistance = checkStructureMaxRadiusDistance;
const 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);
}
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);
}
var MinMaxDist;
(function (MinMaxDist) {
let Result;
(function (Result) {
Result[Result["BelowMin"] = 0] = "BelowMin";
Result[Result["WithinMax"] = 1] = "WithinMax";
Result[Result["Miss"] = 2] = "Miss";
})(Result || (Result = {}));
const distVec = (0, linear_algebra_1.Vec3)();
function inUnit(ctx, unit, p, eRadius, minDist, maxDist, elementRadius) {
const { elements, conformation: c } = unit, dV = distVec;
ctx.element.unit = unit;
let withinRange = false;
for (let i = 0, _i = elements.length; i < _i; i++) {
const e = elements[i];
ctx.element.element = e;
const d = Math.max(0, linear_algebra_1.Vec3.distance(p, c.position(e, dV)) - eRadius - elementRadius(ctx));
if (d < minDist)
return Result.BelowMin;
if (d < maxDist)
withinRange = true;
}
return withinRange ? Result.WithinMax : Result.Miss;
}
function toPoint(ctx, s, point, radius, minDist, maxDist, elementRadius) {
const { units } = s;
let withinRange = false;
for (let i = 0, _i = units.length; i < _i; i++) {
const iu = inUnit(ctx, units[i], point, radius, minDist, maxDist, elementRadius);
if (iu === Result.BelowMin)
return Result.BelowMin;
if (iu === Result.WithinMax)
withinRange = true;
}
return withinRange ? Result.WithinMax : Result.Miss;
}
const distPivot = (0, linear_algebra_1.Vec3)();
function check(ctx, a, b, minDist, maxDist, elementRadius) {
if (a.elementCount === 0 || b.elementCount === 0)
return 0;
const { units } = a;
let withinRange = false;
ctx.element.structure = a;
for (let i = 0, _i = units.length; i < _i; i++) {
const unit = units[i];
const { elements, conformation: c } = unit;
ctx.element.unit = unit;
for (let i = 0, _i = elements.length; i < _i; i++) {
const e = elements[i];
ctx.element.element = e;
const tp = toPoint(ctx, b, c.position(e, distPivot), elementRadius(ctx), minDist, maxDist, elementRadius);
if (tp === Result.BelowMin)
return false;
if (tp === Result.WithinMax)
withinRange = true;
}
}
return withinRange;
}
MinMaxDist.check = check;
})(MinMaxDist || (MinMaxDist = {}));
var MaxRadiusDist;
(function (MaxRadiusDist) {
const distVec = (0, linear_algebra_1.Vec3)();
function inUnit(ctx, unit, p, eRadius, maxDist, elementRadius) {
const { elements, conformation: c } = unit, dV = distVec;
ctx.element.unit = unit;
for (let i = 0, _i = elements.length; i < _i; i++) {
const e = elements[i];
ctx.element.element = e;
if (Math.max(0, linear_algebra_1.Vec3.distance(p, c.position(e, dV)) - eRadius - elementRadius(ctx)) <= maxDist)
return true;
}
return false;
}
function toPoint(ctx, s, point, radius, maxDist, elementRadius) {
const { units } = s;
for (let i = 0, _i = units.length; i < _i; i++) {
if (inUnit(ctx, units[i], point, radius, maxDist, elementRadius))
return true;
}
return false;
}
const distPivot = (0, linear_algebra_1.Vec3)();
function check(ctx, a, b, maxDist, elementRadius) {
if (a.elementCount === 0 || b.elementCount === 0)
return 0;
const { units } = a;
ctx.element.structure = a;
for (let i = 0, _i = units.length; i < _i; i++) {
const unit = units[i];
ctx.element.unit = unit;
const { elements, conformation: c } = unit;
for (let i = 0, _i = elements.length; i < _i; i++) {
const e = elements[i];
ctx.element.element = e;
if (toPoint(ctx, b, c.position(e, distPivot), elementRadius(ctx), maxDist, elementRadius))
return true;
}
}
return false;
}
MaxRadiusDist.check = check;
})(MaxRadiusDist || (MaxRadiusDist = {}));
;