Skip to content
Snippets Groups Projects
Commit a7ceb307 authored by Alexander Rose's avatar Alexander Rose
Browse files

grid size calc fixes

parent a3e95fdf
Branches
Tags
No related merge requests found
......@@ -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)
......
......@@ -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 }
......
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment