From e0c6ebd2194619b6ab39ae1c181071734de74ece Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Fri, 5 Apr 2019 17:11:20 -0700 Subject: [PATCH] repr tweaks --- src/mol-math/geometry/gaussian-density/cpu.ts | 10 +-- src/mol-repr/structure/visual/util/common.ts | 67 ++++++++++++++++++- .../structure/visual/util/gaussian.ts | 67 +------------------ 3 files changed, 73 insertions(+), 71 deletions(-) diff --git a/src/mol-math/geometry/gaussian-density/cpu.ts b/src/mol-math/geometry/gaussian-density/cpu.ts index a52619139..b4c65cd53 100644 --- a/src/mol-math/geometry/gaussian-density/cpu.ts +++ b/src/mol-math/geometry/gaussian-density/cpu.ts @@ -17,8 +17,8 @@ export async function GaussianDensityCPU(ctx: RuntimeContext, position: Position const { indices, x, y, z } = position const n = OrderedSet.size(indices) - const v = Vec3.zero() - const p = Vec3.zero() + const v = Vec3() + const p = Vec3() let maxRadius = 0 for (let i = 0; i < n; ++i) { @@ -49,7 +49,7 @@ export async function GaussianDensityCPU(ctx: RuntimeContext, position: Position const densData = space.create() - const c = Vec3.zero() + const c = Vec3() const alpha = smoothness @@ -58,8 +58,8 @@ export async function GaussianDensityCPU(ctx: RuntimeContext, position: Position Vec3.mul(_radius2, _radius2, delta) const updateChunk = Math.ceil(10000 / (_radius2[0] * _radius2[1] * _radius2[2])) - const beg = Vec3.zero() - const end = Vec3.zero() + const beg = Vec3() + const end = Vec3() const gridPad = 1 / Math.max(...delta) diff --git a/src/mol-repr/structure/visual/util/common.ts b/src/mol-repr/structure/visual/util/common.ts index cd0e2271a..f2f8faa6d 100644 --- a/src/mol-repr/structure/visual/util/common.ts +++ b/src/mol-repr/structure/visual/util/common.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ @@ -9,6 +9,7 @@ import { Mat4 } from 'mol-math/linear-algebra'; import { TransformData, createTransform } from 'mol-geo/geometry/transform-data'; import { OrderedSet, SortedArray } from 'mol-data/int'; import { EmptyLoci, Loci } from 'mol-model/loci'; +import { PhysicalSizeTheme } from 'mol-theme/size/physical'; /** Return a Loci for the elements of a whole residue the elementIndex belongs to. */ export function getResidueLoci(structure: Structure, unit: Unit.Atomic, elementIndex: ElementIndex): Loci { @@ -55,4 +56,68 @@ export function includesUnitKind(unitKinds: UnitKind[], unit: Unit) { if (Unit.isGaussians(unit) && unitKinds[i] === 'gaussians') return true } return false +} + +// + +export function getConformation(unit: Unit) { + switch (unit.kind) { + case Unit.Kind.Atomic: return unit.model.atomicConformation + case Unit.Kind.Spheres: return unit.model.coarseConformation.spheres + case Unit.Kind.Gaussians: return unit.model.coarseConformation.gaussians + } +} + +export function getUnitConformationAndRadius(unit: Unit) { + const conformation = getConformation(unit) + const { elements } = unit + const position = { + indices: elements, + x: conformation.x, + y: conformation.y, + z: conformation.z + } + + const l = StructureElement.create(unit) + const sizeTheme = PhysicalSizeTheme({}, {}) + const radius = (index: number) => { + l.element = index as ElementIndex + return sizeTheme.size(l) + } + + return { position, radius } +} + +export function getStructureConformationAndRadius(structure: Structure) { + const n = structure.elementCount + + const xs = new Float32Array(n) + const ys = new Float32Array(n) + const zs = new Float32Array(n) + const rs = new Float32Array(n) + + const l = StructureElement.create() + const sizeTheme = PhysicalSizeTheme({}, {}) + + let m = 0 + for (let i = 0, il = structure.units.length; i < il; ++i) { + const unit = structure.units[i] + const { elements } = unit + const { x, y, z } = unit.conformation + l.unit = unit + for (let j = 0, jl = elements.length; j < jl; ++j) { + const eI = elements[j] + xs[m + j] = x(eI) + ys[m + j] = y(eI) + zs[m + j] = z(eI) + l.element = eI + rs[m + j] = sizeTheme.size(l) + } + m += elements.length + } + + const position = { indices: OrderedSet.ofRange(0, n), x: xs, y: ys, z: zs } + const radius = (index: number) => rs[index] + + return { position, radius } } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/util/gaussian.ts b/src/mol-repr/structure/visual/util/gaussian.ts index d50d95c8f..cf5c77264 100644 --- a/src/mol-repr/structure/visual/util/gaussian.ts +++ b/src/mol-repr/structure/visual/util/gaussian.ts @@ -4,15 +4,14 @@ * @author Alexander Rose <alexander.rose@weirdbyte.de> */ -import { Unit, StructureElement, ElementIndex, Structure } from 'mol-model/structure'; +import { Unit, Structure } from 'mol-model/structure'; import { GaussianDensity } from 'mol-math/geometry/gaussian-density'; import { Task } from 'mol-task'; import { ParamDefinition as PD } from 'mol-util/param-definition'; import { GaussianDensityTexture, GaussianDensityTexture2d } from 'mol-math/geometry/gaussian-density/gpu'; import { Texture } from 'mol-gl/webgl/texture'; import { WebGLContext } from 'mol-gl/webgl/context'; -import { PhysicalSizeTheme } from 'mol-theme/size/physical'; -import { OrderedSet } from 'mol-data/int'; +import { getUnitConformationAndRadius, getStructureConformationAndRadius } from './common'; export const GaussianDensityParams = { resolution: PD.Numeric(1, { min: 0.1, max: 10, step: 0.1 }), @@ -33,34 +32,6 @@ export type GaussianDensityTextureProps = typeof DefaultGaussianDensityTexturePr // -function getConformation(unit: Unit) { - switch (unit.kind) { - case Unit.Kind.Atomic: return unit.model.atomicConformation - case Unit.Kind.Spheres: return unit.model.coarseConformation.spheres - case Unit.Kind.Gaussians: return unit.model.coarseConformation.gaussians - } -} - -function getUnitConformationAndRadius(unit: Unit) { - const conformation = getConformation(unit) - const { elements } = unit - const position = { - indices: elements, - x: conformation.x, - y: conformation.y, - z: conformation.z - } - - const l = StructureElement.create(unit) - const sizeTheme = PhysicalSizeTheme({}, {}) - const radius = (index: number) => { - l.element = index as ElementIndex - return sizeTheme.size(l) - } - - return { position, radius } -} - export function computeUnitGaussianDensity(unit: Unit, props: GaussianDensityProps, webgl?: WebGLContext) { const { position, radius } = getUnitConformationAndRadius(unit) return Task.create('Gaussian Density', async ctx => { @@ -84,40 +55,6 @@ export function computeUnitGaussianDensityTexture2d(unit: Unit, props: GaussianD // -function getStructureConformationAndRadius(structure: Structure) { - const n = structure.elementCount - - const xs = new Float32Array(n) - const ys = new Float32Array(n) - const zs = new Float32Array(n) - const rs = new Float32Array(n) - - const l = StructureElement.create() - const sizeTheme = PhysicalSizeTheme({}, {}) - - let m = 0 - for (let i = 0, il = structure.units.length; i < il; ++i) { - const unit = structure.units[i] - const { elements } = unit - const { x, y, z } = unit.conformation - l.unit = unit - for (let j = 0, jl = elements.length; j < jl; ++j) { - const eI = elements[j] - xs[m + j] = x(eI) - ys[m + j] = y(eI) - zs[m + j] = z(eI) - l.element = eI - rs[m + j] = sizeTheme.size(l) - } - m += elements.length - } - - const position = { indices: OrderedSet.ofRange(0, n), x: xs, y: ys, z: zs } - const radius = (index: number) => rs[index] - - return { position, radius } -} - export function computeStructureGaussianDensity(structure: Structure, props: GaussianDensityProps, webgl?: WebGLContext) { const { position, radius } = getStructureConformationAndRadius(structure) return Task.create('Gaussian Density', async ctx => { -- GitLab