Skip to content
Snippets Groups Projects
Select Git revision
  • 4c5eb4a93f28d0e9b47992db5f063b622924d8cc
  • master default protected
  • rednatco-v2
  • base-pairs-ladder
  • rednatco
  • test
  • ntc-tube-uniform-color
  • ntc-tube-missing-atoms
  • restore-vertex-array-per-program
  • watlas2
  • dnatco_new
  • cleanup-old-nodejs
  • webmmb
  • fix_auth_seq_id
  • update_deps
  • ext_dev
  • ntc_balls
  • nci-2
  • plugin
  • bugfix-0.4.5
  • nci
  • v0.5.0-dev.1
  • v0.4.5
  • v0.4.4
  • v0.4.3
  • v0.4.2
  • v0.4.1
  • v0.4.0
  • v0.3.12
  • v0.3.11
  • v0.3.10
  • v0.3.9
  • v0.3.8
  • v0.3.7
  • v0.3.6
  • v0.3.5
  • v0.3.4
  • v0.3.3
  • v0.3.2
  • v0.3.1
  • v0.3.0
41 results

gaussian.ts

Blame
  • gaussian.ts 4.50 KiB
    /**
     * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
     *
     * @author Alexander Rose <alexander.rose@weirdbyte.de>
     */
    
    import { Unit, StructureElement, ElementIndex, 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 } 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';
    
    export const GaussianDensityParams = {
        resolution: PD.Numeric(1, { min: 0.1, max: 10, step: 0.1 }),
        radiusOffset: PD.Numeric(0, { min: 0, max: 10, step: 0.1 }),
        smoothness: PD.Numeric(1.5, { min: 0.5, max: 2.5, step: 0.1 }),
        useGpu: PD.Boolean(false),
    }
    export const DefaultGaussianDensityProps = PD.getDefaultValues(GaussianDensityParams)
    export type GaussianDensityProps = typeof DefaultGaussianDensityProps
    
    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 => {
            return await GaussianDensity(ctx, position, unit.lookup3d.boundary.box, radius, props, webgl);
        });
    }
    
    export function computeUnitGaussianDensityTexture(unit: Unit, props: GaussianDensityProps, webgl: WebGLContext, texture?: Texture) {
        const { position, radius } = getUnitConformationAndRadius(unit)
        return Task.create('Gaussian Density', async ctx => {
            return await GaussianDensityTexture(ctx, webgl, position, unit.lookup3d.boundary.box, radius, props, texture);
        });
    }
    
    //
    
    function getStructureConformationAndRadius(structure: Structure) {