UNPKG

molstar

Version:

A comprehensive macromolecular library.

61 lines (60 loc) 2.48 kB
/** * Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> */ import { Mat4, Tensor, Vec3 } from '../../mol-math/linear-algebra'; import { Box3D } from '../../mol-math/geometry'; import { arrayMin, arrayMax, arrayRms, arrayMean } from '../../mol-util/array'; // eslint-disable-next-line export function CubeGridFormat(grid) { return { name: 'custom grid', kind: 'cube-grid', data: grid }; } export function isCubeGridData(f) { return f.kind === 'cube-grid'; } export function initCubeGrid(params) { const geometry = params.basis.atoms.map(a => a.center); const { gridSpacing: spacing, boxExpand: expand } = params; const count = geometry.length; const box = Box3D.expand(Box3D(), Box3D.fromVec3Array(Box3D(), geometry), Vec3.create(expand, expand, expand)); const size = Box3D.size(Vec3(), box); const spacingThresholds = typeof spacing === 'number' ? [[0, spacing]] : [...spacing]; spacingThresholds.sort((a, b) => b[0] - a[0]); let s = 0.4; for (let i = 0; i <= spacingThresholds.length; i++) { s = spacingThresholds[i][1]; if (spacingThresholds[i][0] <= count) break; } const dimensions = Vec3.ceil(Vec3(), Vec3.scale(Vec3(), size, 1 / s)); return { params, box, dimensions, size, npoints: dimensions[0] * dimensions[1] * dimensions[2], delta: Vec3.div(Vec3(), size, Vec3.subScalar(Vec3(), dimensions, 1)), }; } const BohrToAngstromFactor = 0.529177210859; export function createGrid(gridInfo, values, axisOrder) { const boxSize = Box3D.size(Vec3(), gridInfo.box); const boxOrigin = Vec3.clone(gridInfo.box.min); Vec3.scale(boxSize, boxSize, BohrToAngstromFactor); Vec3.scale(boxOrigin, boxOrigin, BohrToAngstromFactor); const scale = Mat4.fromScaling(Mat4(), Vec3.div(Vec3(), boxSize, Vec3.sub(Vec3(), gridInfo.dimensions, Vec3.create(1, 1, 1)))); const translate = Mat4.fromTranslation(Mat4(), boxOrigin); const matrix = Mat4.mul(Mat4(), translate, scale); const grid = { transform: { kind: 'matrix', matrix }, cells: Tensor.create(Tensor.Space(gridInfo.dimensions, axisOrder, Float32Array), values), stats: { min: arrayMin(values), max: arrayMax(values), mean: arrayMean(values), sigma: arrayRms(values), }, }; return grid; }