molstar
Version:
A comprehensive macromolecular library.
137 lines • 4.7 kB
JavaScript
;
/*
* Copyright (c) 2016 - now, David Sehnal, licensed under Apache 2.0, See LICENSE file for more info.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.round = exports.sampleCounts = exports.gridMetrics = exports.linearGridIndex = exports.invert = exports.sub = exports.add = exports.clampGridToSamples = exports.gridToFractional = exports.fractionalToGrid = exports.cartesianToFractional = exports.clone = exports.withCoord = exports.grid = exports.fractional = exports.cartesian = exports.domain = void 0;
var linear_algebra_1 = require("../../../../mol-math/linear-algebra");
// CONSTRUCTORS
function domain(kind, info) {
var sc = info.sampleCount;
return {
kind: kind,
delta: info.delta,
dimensions: info.dimensions,
origin: info.origin,
sampleCount: info.sampleCount,
sampleVolume: sc[0] * sc[1] * sc[2]
};
}
exports.domain = domain;
function cartesian(x, y, z) {
return { 0: x, 1: y, 2: z, kind: 0 /* Cartesian */ };
}
exports.cartesian = cartesian;
function fractional(x, y, z) {
return { 0: x, 1: y, 2: z, kind: 1 /* Fractional */ };
}
exports.fractional = fractional;
function grid(domain, x, y, z) {
return { 0: x, 1: y, 2: z, kind: 2 /* Grid */, domain: domain };
}
exports.grid = grid;
function withCoord(a, x, y, z) {
switch (a.kind) {
case 0 /* Cartesian */: return cartesian(x, y, z);
case 1 /* Fractional */: return fractional(x, y, z);
case 2 /* Grid */: return grid(a.domain, x, y, z);
}
}
exports.withCoord = withCoord;
function clone(a) {
return withCoord(a, a[0], a[1], a[2]);
}
exports.clone = clone;
// CONVERSIONS
function cartesianToFractional(a, spacegroup) {
var coord = Helpers.transform(a, spacegroup.toFractional);
return fractional(coord[0], coord[1], coord[2]);
}
exports.cartesianToFractional = cartesianToFractional;
function fractionalToGrid(a, domain, snap) {
var origin = domain.origin, delta = domain.delta;
var coord = grid(domain, 0.1, 0.1, 0.1);
for (var i = 0; i < 3; i++) {
coord[i] = Helpers.snap((a[i] - origin[i]) / delta[i], snap);
}
return coord;
}
exports.fractionalToGrid = fractionalToGrid;
function gridToFractional(a) {
var _a = a.domain, origin = _a.origin, delta = _a.delta;
var coord = fractional(0.1, 0.1, 0.1);
for (var i = 0; i < 3; i++) {
coord[i] = a[i] * delta[i] + origin[i];
}
return coord;
}
exports.gridToFractional = gridToFractional;
// MISC
function clampGridToSamples(a) {
var sampleCount = a.domain.sampleCount;
var coord = withCoord(a, 0, 0, 0);
for (var i = 0; i < 3; i++) {
if (a[i] < 0)
coord[i] = 0;
else if (a[i] > sampleCount[i])
coord[i] = sampleCount[i];
else
coord[i] = a[i];
}
return coord;
}
exports.clampGridToSamples = clampGridToSamples;
function add(a, b) {
return withCoord(a, a[0] + b[0], a[1] + b[1], a[2] + b[2]);
}
exports.add = add;
function sub(a, b) {
return withCoord(a, a[0] - b[0], a[1] - b[1], a[2] - b[2]);
}
exports.sub = sub;
function invert(a) {
return withCoord(a, -a[0], -a[1], -a[2]);
}
exports.invert = invert;
/** Maps each grid point to a unique integer */
function linearGridIndex(a) {
var samples = a.domain.sampleCount;
return a[0] + samples[0] * (a[1] + a[2] * samples[1]);
}
exports.linearGridIndex = linearGridIndex;
function gridMetrics(dimensions) {
return {
sizeX: dimensions[0],
sizeXY: dimensions[0] * dimensions[1],
sizeXYZ: dimensions[0] * dimensions[1] * dimensions[2]
};
}
exports.gridMetrics = gridMetrics;
function sampleCounts(dimensions, delta) {
return [
Helpers.snap(dimensions[0] / delta[0], 'top'),
Helpers.snap(dimensions[1] / delta[1], 'top'),
Helpers.snap(dimensions[2] / delta[2], 'top')
];
}
exports.sampleCounts = sampleCounts;
// to prevent floating point rounding errors
function round(v) {
return Math.round(10000000 * v) / 10000000;
}
exports.round = round;
var Helpers;
(function (Helpers) {
function transform(x, matrix) {
return linear_algebra_1.Vec3.transformMat4(linear_algebra_1.Vec3.zero(), x, matrix);
}
Helpers.transform = transform;
function snap(v, to) {
switch (to) {
case 'bottom': return Math.floor(round(v)) | 0;
case 'top': return Math.ceil(round(v)) | 0;
}
}
Helpers.snap = snap;
})(Helpers || (Helpers = {}));
//# sourceMappingURL=coordinate.js.map