Browse Source

grid size calc fixes

Alexander Rose 6 years ago
parent
commit
a7ceb307e9

+ 0 - 9
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)

+ 8 - 11
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 }

+ 7 - 16
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 }
 }