|
@@ -8,24 +8,21 @@ import { Unit, Structure, StructureElement } from 'mol-model/structure';
|
|
|
import { RuntimeContext, Task } from 'mol-task'
|
|
|
import { Tensor, Vec3, Mat4 } from 'mol-math/linear-algebra';
|
|
|
import { Box3D } from 'mol-math/geometry';
|
|
|
-import { SizeThemeProps, SizeTheme } from 'mol-view/theme/size';
|
|
|
+import { SizeTheme } from 'mol-view/theme/size';
|
|
|
|
|
|
-export interface GaussianDensityProps {
|
|
|
- sizeTheme: SizeThemeProps
|
|
|
-
|
|
|
- resolutionFactor: number
|
|
|
- probeRadius: number
|
|
|
- isoValue: number
|
|
|
+export const DefaultGaussianDensityProps = {
|
|
|
+ resolutionFactor: 7,
|
|
|
+ radiusOffset: 0,
|
|
|
+ smoothness: 1.5,
|
|
|
}
|
|
|
+export type GaussianDensityProps = typeof DefaultGaussianDensityProps
|
|
|
|
|
|
function getDelta(box: Box3D, resolutionFactor: number) {
|
|
|
const extent = Vec3.sub(Vec3.zero(), box.max, box.min)
|
|
|
-
|
|
|
const n = Math.pow(Math.pow(2, resolutionFactor), 3)
|
|
|
const f = (extent[0] * extent[1] * extent[2]) / n
|
|
|
const s = Math.pow(f, 1 / 3)
|
|
|
const size = Vec3.zero()
|
|
|
- // Vec3.scale(size, extent, s)
|
|
|
Vec3.ceil(size, Vec3.scale(size, extent, s))
|
|
|
const delta = Vec3.div(Vec3.zero(), extent, size)
|
|
|
return delta
|
|
@@ -40,18 +37,18 @@ export function computeGaussianDensity(unit: Unit, structure: Structure, props:
|
|
|
}
|
|
|
|
|
|
export async function GaussianDensity(ctx: RuntimeContext, unit: Unit, structure: Structure, props: GaussianDensityProps): Promise<Density> {
|
|
|
- const { resolutionFactor, probeRadius, isoValue } = props
|
|
|
+ const { resolutionFactor, radiusOffset, smoothness } = props
|
|
|
|
|
|
const { elements } = unit;
|
|
|
const elementCount = elements.length;
|
|
|
- const sizeTheme = SizeTheme(props.sizeTheme)
|
|
|
+ const sizeTheme = SizeTheme({ name: 'physical' })
|
|
|
|
|
|
const v = Vec3.zero()
|
|
|
const p = Vec3.zero()
|
|
|
const pos = unit.conformation.invariantPosition
|
|
|
const l = StructureElement.create(unit)
|
|
|
|
|
|
- const pad = (probeRadius + 3) * 3 // TODO calculate max radius
|
|
|
+ const pad = (radiusOffset + 3) * 3 // TODO calculate max radius
|
|
|
const box = unit.lookup3d.boundary.box
|
|
|
const expandedBox = Box3D.expand(Box3D.empty(), box, Vec3.create(pad, pad, pad));
|
|
|
const extent = Vec3.sub(Vec3.zero(), expandedBox.max, expandedBox.min)
|
|
@@ -67,9 +64,9 @@ export async function GaussianDensity(ctx: RuntimeContext, unit: Unit, structure
|
|
|
|
|
|
const c = Vec3.zero()
|
|
|
|
|
|
- const alpha = isoValue // smoothness
|
|
|
+ const alpha = smoothness
|
|
|
|
|
|
- const _r2 = (probeRadius + 1.4 * 2)
|
|
|
+ const _r2 = (radiusOffset + 1.4 * 2)
|
|
|
const _radius2 = Vec3.create(_r2, _r2, _r2)
|
|
|
Vec3.mul(_radius2, _radius2, delta)
|
|
|
const updateChunk = Math.ceil(10000 / (_radius2[0] * _radius2[1] * _radius2[2]))
|
|
@@ -84,10 +81,10 @@ export async function GaussianDensity(ctx: RuntimeContext, unit: Unit, structure
|
|
|
Vec3.sub(v, v, min)
|
|
|
Vec3.mul(c, v, delta)
|
|
|
|
|
|
- const radius = sizeTheme.size(l) + probeRadius
|
|
|
+ const radius = sizeTheme.size(l) + radiusOffset
|
|
|
const rSq = radius * radius
|
|
|
|
|
|
- const r2 = (probeRadius + radius * 2)
|
|
|
+ const r2 = (radiusOffset + radius * 2)
|
|
|
const radius2 = Vec3.create(r2, r2, r2)
|
|
|
Vec3.mul(radius2, radius2, delta)
|
|
|
const r2sq = r2 * r2
|