diff --git a/src/mol-math/geometry/gaussian-density.ts b/src/mol-math/geometry/gaussian-density.ts index 0493f1d2118d62718bbd37f5e47eb4760a83e602..9e4cc3ddede86891e0ce29b0947cb9930cb777f8 100644 --- a/src/mol-math/geometry/gaussian-density.ts +++ b/src/mol-math/geometry/gaussian-density.ts @@ -5,7 +5,6 @@ */ import { Box3D } from '../geometry'; -import { Vec3 } from '../linear-algebra'; import { RuntimeContext, Task } from 'mol-task'; import { PositionData, DensityData } from './common'; import { GaussianDensityCPU } from './gaussian-density/cpu'; @@ -34,14 +33,6 @@ export const DefaultGaussianDensityProps = { } export type GaussianDensityProps = typeof DefaultGaussianDensityProps -export function getDelta(box: Box3D, resolution: number) { - const extent = Vec3.sub(Vec3.zero(), box.max, box.min) - const size = Vec3.zero() - Vec3.ceil(size, Vec3.scale(size, extent, resolution)) - const delta = Vec3.div(Vec3.zero(), extent, size) - return delta -} - export function computeGaussianDensity(position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, webgl?: WebGLContext) { return Task.create('Gaussian Density', async ctx => { return await GaussianDensity(ctx, position, box, radius, props, webgl) diff --git a/src/mol-math/geometry/gaussian-density/cpu.ts b/src/mol-math/geometry/gaussian-density/cpu.ts index a0676f7d722784d302765ab53b68c48f95813ad0..b2d82b4910d3b161e31bdf418902417bf19697e8 100644 --- a/src/mol-math/geometry/gaussian-density/cpu.ts +++ b/src/mol-math/geometry/gaussian-density/cpu.ts @@ -9,7 +9,7 @@ import { Vec3, Mat4, Tensor } from '../../linear-algebra'; import { RuntimeContext } from 'mol-task'; import { PositionData, DensityData } from '../common'; import { OrderedSet } from 'mol-data/int'; -import { GaussianDensityProps, getDelta } from '../gaussian-density'; +import { GaussianDensityProps } from '../gaussian-density'; export async function GaussianDensityCPU(ctx: RuntimeContext, position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps): Promise<DensityData> { const { resolution, radiusOffset, smoothness } = props @@ -31,14 +31,11 @@ export async function GaussianDensityCPU(ctx: RuntimeContext, position: Position } const pad = maxRadius * 2 + resolution - const expandedBox = Box3D.expand(Box3D.empty(), box, Vec3.create(pad, pad, pad)) - const extent = Vec3.sub(Vec3(), expandedBox.max, expandedBox.min) + const expandedBox = Box3D.expand(Box3D(), box, Vec3.create(pad, pad, pad)); const min = expandedBox.min - - const delta = getDelta(Box3D.expand(Box3D.empty(), box, Vec3.create(pad, pad, pad)), resolution) - const dim = Vec3() - Vec3.ceil(dim, Vec3.mul(dim, extent, delta)) - // console.log('grid dim cpu', dim) + const scaledBox = Box3D.scale(Box3D(), expandedBox, scaleFactor) + const dim = Box3D.size(Vec3(), scaledBox) + Vec3.ceil(dim, dim) const space = Tensor.Space(dim, [0, 1, 2], Float32Array) const data = space.create() @@ -59,7 +56,7 @@ export async function GaussianDensityCPU(ctx: RuntimeContext, position: Position const alpha = smoothness const updateChunk = Math.ceil(1000000 / (Math.pow(maxRadius * 2, 3) * resolution)) - // console.time('gaussian density cpu') + console.time('gaussian density cpu') for (let i = 0; i < n; ++i) { const j = OrderedSet.getAt(indices, i) const vx = x[j], vy = y[j], vz = z[j] @@ -118,10 +115,10 @@ export async function GaussianDensityCPU(ctx: RuntimeContext, position: Position await ctx.update({ message: 'filling density grid', current: i, max: n }) } } - // console.timeEnd('gaussian density cpu') + console.timeEnd('gaussian density cpu') const transform = Mat4.identity() - Mat4.fromScaling(transform, Vec3.inverse(Vec3.zero(), delta)) + Mat4.fromScaling(transform, Vec3.create(resolution, resolution, resolution)) Mat4.setTranslation(transform, expandedBox.min) return { field, idField, transform } diff --git a/src/mol-math/geometry/molecular-surface.ts b/src/mol-math/geometry/molecular-surface.ts index 678af0245ae89f3b24c898074548907972d2f102..254c348155141f0af78576034a760e42ab170b21 100644 --- a/src/mol-math/geometry/molecular-surface.ts +++ b/src/mol-math/geometry/molecular-surface.ts @@ -16,7 +16,6 @@ import { OrderedSet } from 'mol-data/int'; import { PositionData } from './common'; import { Mat4 } from 'mol-math/linear-algebra/3d'; import { Box3D, GridLookup3D, fillGridDim } from 'mol-math/geometry'; -import { getDelta } from './gaussian-density'; function normalToLine (out: Vec3, p: Vec3) { out[0] = out[1] = out[2] = 1.0 @@ -308,8 +307,6 @@ interface MolSurfCalcState { lookup3d: Lookup3D position: Required<PositionData> - delta: Vec3 - invDelta: Vec3 min: Vec3 maxRadius: number @@ -337,7 +334,6 @@ interface MolSurfCalcState { async function createState(ctx: RuntimeContext, position: Required<PositionData>, maxRadius: number, props: MolecularSurfaceCalculationProps): Promise<MolSurfCalcState> { const { resolution, probeRadius, probePositions } = props - const scaleFactor = 1 / resolution const lookup3d = GridLookup3D(position) @@ -346,15 +342,11 @@ async function createState(ctx: RuntimeContext, position: Required<PositionData> const n = OrderedSet.size(indices) const pad = maxRadius * 2 + resolution - const expandedBox = Box3D.expand(Box3D.empty(), box, Vec3.create(pad, pad, pad)) - const extent = Vec3.sub(Vec3.zero(), expandedBox.max, expandedBox.min) + const expandedBox = Box3D.expand(Box3D(), box, Vec3.create(pad, pad, pad)); const min = expandedBox.min - - const delta = getDelta(Box3D.expand(Box3D.empty(), box, Vec3.create(pad, pad, pad)), resolution) - const dim = Vec3.zero() - Vec3.ceil(dim, Vec3.mul(dim, extent, delta)) - console.log('grid dim surf', dim) - const invDelta = Vec3.inverse(Vec3(), delta) + const scaledBox = Box3D.scale(Box3D(), expandedBox, scaleFactor) + const dim = Box3D.size(Vec3(), scaledBox) + Vec3.ceil(dim, dim) const { cosTable, sinTable } = getAngleTables(probePositions) @@ -377,8 +369,6 @@ async function createState(ctx: RuntimeContext, position: Required<PositionData> lookup3d, position, - delta, - invDelta, min, maxRadius, @@ -437,9 +427,10 @@ export async function calcMolecularSurface(ctx: RuntimeContext, position: Requir const field = Tensor.create(state.space, state.data) const idField = Tensor.create(state.space, state.idData) + const { resolution, expandedBox } = state const transform = Mat4.identity() - Mat4.fromScaling(transform, Vec3.inverse(Vec3.zero(), state.delta)) - Mat4.setTranslation(transform, state.expandedBox.min) + Mat4.fromScaling(transform, Vec3.create(resolution, resolution, resolution)) + Mat4.setTranslation(transform, expandedBox.min) console.log({ field, idField, transform, state }) return { field, idField, transform } } \ No newline at end of file