Browse Source

various params tweaks

- added more descriptions
- cleaned-up structure related params
- added missing quality categorisation
- clearer picking/granularity param
Alexander Rose 5 years ago
parent
commit
4c91e730a2

+ 2 - 2
src/mol-geo/geometry/base.ts

@@ -35,8 +35,8 @@ export const VisualQualityOptions = PD.arrayToOptions(VisualQualityNames)
 
 export namespace BaseGeometry {
     export const Params = {
-        alpha: PD.Numeric(1, { min: 0, max: 1, step: 0.01 }, { label: 'Opacity', isEssential: true }),
-        quality: PD.Select<VisualQuality>('auto', VisualQualityOptions, PD.Essential),
+        alpha: PD.Numeric(1, { min: 0, max: 1, step: 0.01 }, { label: 'Opacity', isEssential: true, description: 'How opaque/transparent the representation is rendered.' }),
+        quality: PD.Select<VisualQuality>('auto', VisualQualityOptions, { isEssential: true, description: 'Visual/rendering quality of the representation.' }),
     }
     export type Params = typeof Params
 

+ 4 - 3
src/mol-math/geometry/molecular-surface.ts

@@ -14,6 +14,7 @@ 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 { BaseGeometry } from '../../mol-geo/geometry/base';
 
 function normalToLine (out: Vec3, p: Vec3) {
     out[0] = out[1] = out[2] = 1.0
@@ -45,9 +46,9 @@ function getAngleTables (probePositions: number): AnglesTables {
 //
 
 export const MolecularSurfaceCalculationParams = {
-    resolution: PD.Numeric(0.5, { min: 0.01, max: 20, step: 0.01 }),
-    probeRadius: PD.Numeric(1.4, { min: 0, max: 10, step: 0.1 }),
-    probePositions: PD.Numeric(30, { min: 12, max: 90, step: 1 }),
+    probeRadius: PD.Numeric(1.4, { min: 0, max: 10, step: 0.1 }, { description: 'Radius of the probe tracing the molecular surface.' }),
+    resolution: PD.Numeric(0.5, { min: 0.01, max: 20, step: 0.01 }, { description: 'Grid resolution/cell spacing.', ...BaseGeometry.CustomQualityParamInfo }),
+    probePositions: PD.Numeric(30, { min: 12, max: 90, step: 1 }, { description: 'Number of positions tested for probe target intersection.', ...BaseGeometry.CustomQualityParamInfo }),
 }
 export const DefaultMolecularSurfaceCalculationProps = PD.getDefaultValues(MolecularSurfaceCalculationParams)
 export type MolecularSurfaceCalculationProps = typeof DefaultMolecularSurfaceCalculationProps

+ 2 - 3
src/mol-model-props/computed/representations/interactions.ts

@@ -8,9 +8,8 @@ import { ParamDefinition as PD } from '../../../mol-util/param-definition';
 import { Representation, RepresentationParamsGetter, RepresentationContext } from '../../../mol-repr/representation';
 import { ThemeRegistryContext } from '../../../mol-theme/theme';
 import { Structure } from '../../../mol-model/structure';
-import { UnitsRepresentation, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationProvider, ComplexRepresentation } from '../../../mol-repr/structure/representation';
+import { UnitsRepresentation, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationProvider, ComplexRepresentation, getUnitKindsParam } from '../../../mol-repr/structure/representation';
 import { InteractionsIntraUnitParams, InteractionsIntraUnitVisual } from './interactions-intra-unit-cylinder';
-import { UnitKindOptions, UnitKind } from '../../../mol-repr/structure/visual/util/common';
 import { InteractionsProvider } from '../interactions';
 import { InteractionsInterUnitParams, InteractionsInterUnitVisual } from './interactions-inter-unit-cylinder';
 import { CustomProperty } from '../../common/custom-property';
@@ -23,7 +22,7 @@ const InteractionsVisuals = {
 export const InteractionsParams = {
     ...InteractionsIntraUnitParams,
     ...InteractionsInterUnitParams,
-    unitKinds: PD.MultiSelect<UnitKind>(['atomic'], UnitKindOptions),
+    unitKinds: getUnitKindsParam(['atomic']),
     sizeFactor: PD.Numeric(0.3, { min: 0.01, max: 10, step: 0.01 }),
     visuals: PD.MultiSelect(['intra-unit', 'inter-unit'], PD.objectToOptions(InteractionsVisuals)),
 }

+ 0 - 2
src/mol-model-props/integrative/cross-link-restraint/representation.ts

@@ -20,7 +20,6 @@ import { createLinkCylinderMesh, LinkCylinderParams } from '../../../mol-repr/st
 import { ComplexMeshParams, ComplexVisual, ComplexMeshVisual } from '../../../mol-repr/structure/complex-visual';
 import { VisualUpdateState } from '../../../mol-repr/util';
 import { ComplexRepresentation, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationProvider } from '../../../mol-repr/structure/representation';
-import { UnitKind, UnitKindOptions } from '../../../mol-repr/structure/visual/util/common';
 import { CustomProperty } from '../../common/custom-property';
 import { CrossLinkRestraintProvider, CrossLinkRestraint } from './property';
 
@@ -122,7 +121,6 @@ const CrossLinkRestraintVisuals = {
 
 export const CrossLinkRestraintParams = {
     ...CrossLinkRestraintCylinderParams,
-    unitKinds: PD.MultiSelect<UnitKind>(['atomic', 'spheres'], UnitKindOptions),
 }
 export type CrossLinkRestraintParams = typeof CrossLinkRestraintParams
 export function getCrossLinkRestraintParams(ctx: ThemeRegistryContext, structure: Structure) {

+ 2 - 3
src/mol-model-props/rcsb/representations/validation-report-clashes.ts

@@ -13,8 +13,7 @@ import { PickingId } from '../../../mol-geo/geometry/picking';
 import { EmptyLoci, Loci, DataLoci } from '../../../mol-model/loci';
 import { Interval } from '../../../mol-data/int';
 import { RepresentationContext, RepresentationParamsGetter, Representation } from '../../../mol-repr/representation';
-import { UnitsRepresentation, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationProvider, ComplexRepresentation } from '../../../mol-repr/structure/representation';
-import { UnitKind, UnitKindOptions } from '../../../mol-repr/structure/visual/util/common';
+import { UnitsRepresentation, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationProvider, ComplexRepresentation, getUnitKindsParam } from '../../../mol-repr/structure/representation';
 import { VisualContext } from '../../../mol-repr/visual';
 import { createLinkCylinderMesh, LinkCylinderParams, LinkCylinderStyle } from '../../../mol-repr/structure/visual/util/link';
 import { UnitsMeshParams, UnitsVisual, UnitsMeshVisual, StructureGroup } from '../../../mol-repr/structure/units-visual';
@@ -263,7 +262,7 @@ const ClashesVisuals = {
 export const ClashesParams = {
     ...IntraUnitClashParams,
     ...InterUnitClashParams,
-    unitKinds: PD.MultiSelect<UnitKind>(['atomic'], UnitKindOptions),
+    unitKinds: getUnitKindsParam(['atomic']),
     visuals: PD.MultiSelect(['intra-clash', 'inter-clash'], PD.objectToOptions(ClashesVisuals))
 }
 export type ClashesParams = typeof ClashesParams

+ 11 - 7
src/mol-model/loci.ts

@@ -15,6 +15,7 @@ import { ParamDefinition } from '../mol-util/param-definition';
 import { shallowEqual } from '../mol-util';
 import { FiniteArray } from '../mol-util/type-helpers';
 import { BoundaryHelper } from '../mol-math/geometry/boundary-helper';
+import { stringToWords } from '../mol-util/string';
 
 /** A Loci that includes every loci */
 export const EveryLoci = { kind: 'every-loci' as 'every-loci' }
@@ -219,16 +220,19 @@ namespace Loci {
         'structure': (loci: Loci) => {
             return StructureElement.Loci.is(loci)
                 ? Structure.toStructureElementLoci(loci.structure)
-                : loci
-        },
-        'shape': (loci: Loci) => {
-            return ShapeGroup.isLoci(loci)
-                ? Shape.Loci(loci.shape)
-                : loci
+                : ShapeGroup.isLoci(loci)
+                    ? Shape.Loci(loci.shape)
+                    : loci
         },
     }
     export type Granularity = keyof typeof Granularity
-    export const GranularityOptions = ParamDefinition.objectToOptions(Granularity);
+    export const GranularityOptions = ParamDefinition.objectToOptions(Granularity, k => {
+        switch (k) {
+            case 'element': return'Atom/Coarse Element'
+            case 'structure': return'Structure/Shape'
+            default: return stringToWords(k)
+        }
+    });
 
     export function applyGranularity(loci: Loci, granularity: Granularity) {
         return Granularity[granularity](loci)

+ 1 - 1
src/mol-plugin-state/manager/interactivity.ts

@@ -65,7 +65,7 @@ namespace InteractivityManager {
     }
 
     export const Params = {
-        granularity: PD.Select('residue', ModelLoci.GranularityOptions, { description: 'Controls if selections are expanded to whole residues, chains, structures, or left as atoms and coarse elements' }),
+        granularity: PD.Select('residue', ModelLoci.GranularityOptions, { label: 'Picking', description: 'Controls if selections are expanded upon picking to whole residues, chains, structures, instances, or left as atoms and coarse elements' }),
     }
     export type Params = typeof Params
     export type Props = PD.Values<Params>

+ 3 - 1
src/mol-plugin-state/transforms/representation.ts

@@ -114,7 +114,9 @@ const StructureRepresentation3D = PluginStateTransform.BuiltIn({
 })({
     canAutoUpdate({ a, oldParams, newParams }) {
         // TODO: other criteria as well?
-        return a.data.elementCount < 10000 || oldParams.type.name === newParams.type.name;
+        return a.data.elementCount < 10000 || (
+            oldParams.type.name === newParams.type.name && newParams.type.params.quality !== 'custom'
+        );
     },
     apply({ a, params }, plugin: PluginContext) {
         return Task.create('Structure Representation', async ctx => {

+ 1 - 1
src/mol-repr/structure/complex-representation.ts

@@ -6,7 +6,7 @@
  */
 
 import { ParamDefinition as PD } from '../../mol-util/param-definition';
-import { StructureParams, ComplexVisual, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationState } from './representation';
+import { ComplexVisual, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationState, StructureParams } from './representation';
 import { RepresentationContext, RepresentationParamsGetter } from '../representation';
 import { Structure, StructureElement, Bond } from '../../mol-model/structure';
 import { Subject } from 'rxjs';

+ 11 - 27
src/mol-repr/structure/complex-visual.ts

@@ -1,11 +1,11 @@
 /**
- * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
 import { ParamDefinition as PD } from '../../mol-util/param-definition';
-import { StructureParams, StructureMeshParams, StructureDirectVolumeParams, StructureTextParams } from './representation';
+import { StructureMeshParams, StructureDirectVolumeParams, StructureTextParams, StructureParams } from './representation';
 import { Visual, VisualContext } from '../visual';
 import { Structure, StructureElement } from '../../mol-model/structure';
 import { Geometry, GeometryUtils } from '../../mol-geo/geometry/geometry';
@@ -13,7 +13,6 @@ import { LocationIterator } from '../../mol-geo/util/location-iterator';
 import { Theme } from '../../mol-theme/theme';
 import { createIdentityTransform } from '../../mol-geo/geometry/transform-data';
 import { createRenderObject, RenderObjectValues, GraphicsRenderObject } from '../../mol-gl/render-object';
-import { UnitKind, UnitKindOptions } from './visual/util/common';
 import { PickingId } from '../../mol-geo/geometry/picking';
 import { Loci, isEveryLoci, EmptyLoci } from '../../mol-model/loci';
 import { Interval } from '../../mol-data/int';
@@ -42,13 +41,7 @@ function createComplexRenderObject<G extends Geometry>(structure: Structure, geo
     return createRenderObject(geometry.kind, values, state, materialId)
 }
 
-const ComplexParams = {
-    ...StructureParams,
-    unitKinds: PD.MultiSelect<UnitKind>(['atomic', 'spheres'], UnitKindOptions),
-}
-type ComplexParams = typeof ComplexParams
-
-interface ComplexVisualBuilder<P extends ComplexParams, G extends Geometry> {
+interface ComplexVisualBuilder<P extends StructureParams, G extends Geometry> {
     defaultProps: PD.Values<P>
     createGeometry(ctx: VisualContext, structure: Structure, theme: Theme, props: PD.Values<P>, geometry?: G): Promise<G> | G
     createLocationIterator(structure: Structure): LocationIterator
@@ -57,11 +50,11 @@ interface ComplexVisualBuilder<P extends ComplexParams, G extends Geometry> {
     setUpdateState(state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructure: Structure, currentStructure: Structure): void
 }
 
-interface ComplexVisualGeometryBuilder<P extends ComplexParams, G extends Geometry> extends ComplexVisualBuilder<P, G> {
+interface ComplexVisualGeometryBuilder<P extends StructureParams, G extends Geometry> extends ComplexVisualBuilder<P, G> {
     geometryUtils: GeometryUtils<G>
 }
 
-export function ComplexVisual<G extends Geometry, P extends ComplexParams & Geometry.Params<G>>(builder: ComplexVisualGeometryBuilder<P, G>, materialId: number): ComplexVisual<P> {
+export function ComplexVisual<G extends Geometry, P extends StructureParams & Geometry.Params<G>>(builder: ComplexVisualGeometryBuilder<P, G>, materialId: number): ComplexVisual<P> {
     const { defaultProps, createGeometry, createLocationIterator, getLoci, eachLocation, setUpdateState } = builder
     const { updateValues, updateBoundingSphere, updateRenderableState } = builder.geometryUtils
     const updateState = VisualUpdateState.create()
@@ -233,16 +226,13 @@ export function ComplexVisual<G extends Geometry, P extends ComplexParams & Geom
 
 // mesh
 
-export const ComplexMeshParams = {
-    ...StructureMeshParams,
-    unitKinds: PD.MultiSelect<UnitKind>([ 'atomic', 'spheres' ], UnitKindOptions),
-}
+export const ComplexMeshParams = { ...StructureMeshParams, ...StructureParams }
 export type ComplexMeshParams = typeof ComplexMeshParams
 
 export interface ComplexMeshVisualBuilder<P extends ComplexMeshParams> extends ComplexVisualBuilder<P, Mesh> { }
 
 export function ComplexMeshVisual<P extends ComplexMeshParams>(builder: ComplexMeshVisualBuilder<P>, materialId: number): ComplexVisual<P> {
-    return ComplexVisual<Mesh, StructureMeshParams & ComplexParams>({
+    return ComplexVisual<Mesh, P>({
         ...builder,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructure: Structure, currentStructure: Structure) => {
             builder.setUpdateState(state, newProps, currentProps, newTheme, currentTheme, newStructure, currentStructure)
@@ -254,16 +244,13 @@ export function ComplexMeshVisual<P extends ComplexMeshParams>(builder: ComplexM
 
 // text
 
-export const ComplexTextParams = {
-    ...StructureTextParams,
-    unitKinds: PD.MultiSelect<UnitKind>([ 'atomic', 'spheres' ], UnitKindOptions),
-}
+export const ComplexTextParams = { ...StructureTextParams, ...StructureParams }
 export type ComplexTextParams = typeof ComplexTextParams
 
 export interface ComplexTextVisualBuilder<P extends ComplexTextParams> extends ComplexVisualBuilder<P, Text> { }
 
 export function ComplexTextVisual<P extends ComplexTextParams>(builder: ComplexTextVisualBuilder<P>, materialId: number): ComplexVisual<P> {
-    return ComplexVisual<Text, StructureTextParams & ComplexParams>({
+    return ComplexVisual<Text, P>({
         ...builder,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructure: Structure, currentStructure: Structure) => {
             builder.setUpdateState(state, newProps, currentProps, newTheme, currentTheme, newStructure, currentStructure)
@@ -281,16 +268,13 @@ export function ComplexTextVisual<P extends ComplexTextParams>(builder: ComplexT
 
 // direct-volume
 
-export const ComplexDirectVolumeParams = {
-    ...StructureDirectVolumeParams,
-    unitKinds: PD.MultiSelect<UnitKind>(['atomic', 'spheres', 'gaussians'], UnitKindOptions),
-}
+export const ComplexDirectVolumeParams = { ...StructureDirectVolumeParams, ...StructureParams }
 export type ComplexDirectVolumeParams = typeof ComplexDirectVolumeParams
 
 export interface ComplexDirectVolumeVisualBuilder<P extends ComplexDirectVolumeParams> extends ComplexVisualBuilder<P, DirectVolume> { }
 
 export function ComplexDirectVolumeVisual<P extends ComplexDirectVolumeParams>(builder: ComplexDirectVolumeVisualBuilder<P>, materialId: number): ComplexVisual<P> {
-    return ComplexVisual<DirectVolume, StructureDirectVolumeParams & ComplexParams>({
+    return ComplexVisual<DirectVolume, P>({
         ...builder,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructure: Structure, currentStructure: Structure) => {
             builder.setUpdateState(state, newProps, currentProps, newTheme, currentTheme, newStructure, currentStructure)

+ 18 - 12
src/mol-repr/structure/representation.ts

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  * @author David Sehnal <david.sehnal@gmail.com>
@@ -9,7 +9,6 @@ import { ParamDefinition as PD } from '../../mol-util/param-definition';
 import { Representation, RepresentationProps, RepresentationProvider } from '../representation';
 import { StructureUnitTransforms } from '../../mol-model/structure/structure/util/unit-transforms';
 import { Structure } from '../../mol-model/structure';
-import { BaseGeometry } from '../../mol-geo/geometry/base';
 import { Mesh } from '../../mol-geo/geometry/mesh/mesh';
 import { Spheres } from '../../mol-geo/geometry/spheres/spheres';
 import { Points } from '../../mol-geo/geometry/points/points';
@@ -17,6 +16,16 @@ import { Lines } from '../../mol-geo/geometry/lines/lines';
 import { DirectVolume } from '../../mol-geo/geometry/direct-volume/direct-volume';
 import { TextureMesh } from '../../mol-geo/geometry/texture-mesh/texture-mesh';
 import { Text } from '../../mol-geo/geometry/text/text';
+import { UnitKind, UnitKindOptions } from './visual/util/common';
+
+export function getUnitKindsParam(defaultValue: UnitKind[]) {
+    return PD.MultiSelect<UnitKind>(defaultValue, UnitKindOptions, { description: 'For which kinds of units/chains to show the representation visuals.' })
+}
+
+export const StructureParams = {
+    unitKinds: getUnitKindsParam(['atomic', 'spheres']),
+}
+export type StructureParams = typeof StructureParams
 
 export interface StructureRepresentationState extends Representation.State {
     unitTransforms: StructureUnitTransforms | null,
@@ -42,28 +51,25 @@ export type StructureRepresentationProvider<P extends PD.Params, Id extends stri
 export function StructureRepresentationProvider<P extends PD.Params, Id extends string>(p: StructureRepresentationProvider<P, Id>): StructureRepresentationProvider<P, Id> { return p; }
 //
 
-export const StructureParams = { ...BaseGeometry.Params }
-export type StructureParams = typeof StructureParams
-
-export const StructureMeshParams = { ...Mesh.Params, ...StructureParams }
+export const StructureMeshParams = { ...Mesh.Params }
 export type StructureMeshParams = typeof StructureMeshParams
 
-export const StructureSpheresParams = { ...Spheres.Params, ...StructureParams }
+export const StructureSpheresParams = { ...Spheres.Params }
 export type StructureSpheresParams = typeof StructureSpheresParams
 
-export const StructurePointsParams = { ...Points.Params, ...StructureParams }
+export const StructurePointsParams = { ...Points.Params }
 export type StructurePointsParams = typeof StructurePointsParams
 
-export const StructureLinesParams = { ...Lines.Params, ...StructureParams }
+export const StructureLinesParams = { ...Lines.Params }
 export type StructureLinesParams = typeof StructureLinesParams
 
-export const StructureTextParams = { ...Text.Params, ...StructureParams }
+export const StructureTextParams = { ...Text.Params }
 export type StructureTextParams = typeof StructureTextParams
 
-export const StructureDirectVolumeParams = { ...DirectVolume.Params, ...StructureParams }
+export const StructureDirectVolumeParams = { ...DirectVolume.Params }
 export type StructureDirectVolumeParams = typeof StructureDirectVolumeParams
 
-export const StructureTextureMeshParams = { ...TextureMesh.Params, ...StructureParams }
+export const StructureTextureMeshParams = { ...TextureMesh.Params }
 export type StructureTextureMeshParams = typeof StructureTextureMeshParams
 
 export { ComplexRepresentation } from './complex-representation'

+ 2 - 3
src/mol-repr/structure/representation/ball-and-stick.ts

@@ -10,11 +10,10 @@ import { InterUnitBondVisual, InterUnitBondParams } from '../visual/bond-inter-u
 import { ParamDefinition as PD } from '../../../mol-util/param-definition';
 import { UnitsRepresentation } from '../units-representation';
 import { ComplexRepresentation } from '../complex-representation';
-import { StructureRepresentation, StructureRepresentationProvider, StructureRepresentationStateBuilder } from '../representation';
+import { StructureRepresentation, StructureRepresentationProvider, StructureRepresentationStateBuilder, getUnitKindsParam } from '../representation';
 import { Representation, RepresentationParamsGetter, RepresentationContext } from '../../../mol-repr/representation';
 import { ThemeRegistryContext } from '../../../mol-theme/theme';
 import { Structure } from '../../../mol-model/structure';
-import { UnitKind, UnitKindOptions } from '../visual/util/common';
 
 const BallAndStickVisuals = {
     'element-sphere': (ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, ElementSphereParams>) => UnitsRepresentation('Element sphere mesh', ctx, getParams, getElementSphereVisual(ctx.webgl)),
@@ -26,7 +25,7 @@ export const BallAndStickParams = {
     ...ElementSphereParams,
     ...IntraUnitBondParams,
     ...InterUnitBondParams,
-    unitKinds: PD.MultiSelect<UnitKind>(['atomic'], UnitKindOptions),
+    unitKinds: getUnitKindsParam(['atomic']),
     sizeFactor: PD.Numeric(0.15, { min: 0.01, max: 10, step: 0.01 }),
     sizeAspectRatio: PD.Numeric(2/3, { min: 0.01, max: 3, step: 0.01 }),
     visuals: PD.MultiSelect(['element-sphere', 'intra-bond', 'inter-bond'], PD.objectToOptions(BallAndStickVisuals))

+ 2 - 3
src/mol-repr/structure/representation/ellipsoid.ts

@@ -8,9 +8,8 @@ import { ParamDefinition as PD } from '../../../mol-util/param-definition';
 import { RepresentationParamsGetter, RepresentationContext, Representation } from '../../../mol-repr/representation';
 import { ThemeRegistryContext } from '../../../mol-theme/theme';
 import { Structure } from '../../../mol-model/structure';
-import { UnitsRepresentation, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationProvider, ComplexRepresentation } from '../../../mol-repr/structure/representation';
+import { UnitsRepresentation, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationProvider, ComplexRepresentation, getUnitKindsParam } from '../../../mol-repr/structure/representation';
 import { EllipsoidMeshParams, EllipsoidMeshVisual } from '../visual/ellipsoid-mesh';
-import { UnitKind, UnitKindOptions } from '../../../mol-repr/structure/visual/util/common';
 import { AtomSiteAnisotrop } from '../../../mol-model-formats/structure/property/anisotropic';
 import { IntraUnitBondParams, IntraUnitBondVisual } from '../visual/bond-intra-unit-cylinder';
 import { InterUnitBondParams, InterUnitBondVisual } from '../visual/bond-inter-unit-cylinder';
@@ -25,7 +24,7 @@ export const EllipsoidParams = {
     ...EllipsoidMeshParams,
     ...IntraUnitBondParams,
     ...InterUnitBondParams,
-    unitKinds: PD.MultiSelect<UnitKind>(['atomic'], UnitKindOptions),
+    unitKinds: getUnitKindsParam(['atomic']),
     sizeFactor: PD.Numeric(1, { min: 0.01, max: 10, step: 0.01 }),
     sizeAspectRatio: PD.Numeric(0.1, { min: 0.01, max: 3, step: 0.01 }),
     bondCap: PD.Boolean(true),

+ 0 - 2
src/mol-repr/structure/representation/point.ts

@@ -11,7 +11,6 @@ import { StructureRepresentation, StructureRepresentationProvider, StructureRepr
 import { Representation, RepresentationParamsGetter, RepresentationContext } from '../../../mol-repr/representation';
 import { ThemeRegistryContext } from '../../../mol-theme/theme';
 import { Structure } from '../../../mol-model/structure';
-import { UnitKind, UnitKindOptions } from '../visual/util/common';
 
 const PointVisuals = {
     'element-point': (ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, ElementPointParams>) => UnitsRepresentation('Points', ctx, getParams, ElementPointVisual),
@@ -19,7 +18,6 @@ const PointVisuals = {
 
 export const PointParams = {
     ...ElementPointParams,
-    unitKinds: PD.MultiSelect<UnitKind>(['atomic', 'spheres'], UnitKindOptions),
 }
 export type PointParams = typeof PointParams
 export function getPointParams(ctx: ThemeRegistryContext, structure: Structure) {

+ 0 - 2
src/mol-repr/structure/representation/spacefill.ts

@@ -11,7 +11,6 @@ import { StructureRepresentation, StructureRepresentationProvider, StructureRepr
 import { RepresentationParamsGetter, RepresentationContext, Representation } from '../../../mol-repr/representation';
 import { ThemeRegistryContext } from '../../../mol-theme/theme';
 import { Structure } from '../../../mol-model/structure';
-import { UnitKind, UnitKindOptions } from '../visual/util/common';
 
 const SpacefillVisuals = {
     'element-sphere': (ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, ElementSphereParams>) => UnitsRepresentation('Sphere mesh', ctx, getParams, getElementSphereVisual(ctx.webgl)),
@@ -19,7 +18,6 @@ const SpacefillVisuals = {
 
 export const SpacefillParams = {
     ...ElementSphereParams,
-    unitKinds: PD.MultiSelect<UnitKind>(['atomic', 'spheres'], UnitKindOptions),
 }
 export type SpacefillParams = typeof SpacefillParams
 export function getSpacefillParams(ctx: ThemeRegistryContext, structure: Structure) {

+ 4 - 11
src/mol-repr/structure/units-representation.ts

@@ -6,8 +6,7 @@
  */
 
 import { ParamDefinition as PD } from '../../mol-util/param-definition';
-import { StructureParams, StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationState } from './representation';
-import { UnitKind, UnitKindOptions } from './visual/util/common';
+import { StructureRepresentation, StructureRepresentationStateBuilder, StructureRepresentationState, StructureParams } from './representation';
 import { Visual } from '../visual';
 import { StructureGroup } from './units-visual';
 import { RepresentationContext, RepresentationParamsGetter } from '../representation';
@@ -24,15 +23,9 @@ import { Transparency } from '../../mol-theme/transparency';
 import { Mat4, EPSILON } from '../../mol-math/linear-algebra';
 import { Interval } from '../../mol-data/int';
 
-export const UnitsParams = {
-    ...StructureParams,
-    unitKinds: PD.MultiSelect<UnitKind>(['atomic', 'spheres'], UnitKindOptions),
-}
-export type UnitsParams = typeof UnitsParams
+export interface UnitsVisual<P extends StructureParams> extends Visual<StructureGroup, P> { }
 
-export interface UnitsVisual<P extends UnitsParams> extends Visual<StructureGroup, P> { }
-
-export function UnitsRepresentation<P extends UnitsParams>(label: string, ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, P>, visualCtor: (materialId: number) => UnitsVisual<P>): StructureRepresentation<P> {
+export function UnitsRepresentation<P extends StructureParams>(label: string, ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, P>, visualCtor: (materialId: number) => UnitsVisual<P>): StructureRepresentation<P> {
     let version = 0
     const updated = new Subject<number>()
     const materialId = getNextMaterialId()
@@ -90,7 +83,7 @@ export function UnitsRepresentation<P extends UnitsParams>(label: string, ctx: R
                         visuals.set(group.hashCode, { visual, group })
                         oldVisuals.delete(group.hashCode)
 
-                        // Remove highlight 
+                        // Remove highlight
                         // TODO: remove selection too??
                         if (visual.renderObject) {
                             const arr = visual.renderObject.values.tMarker.ref.value.array;

+ 19 - 20
src/mol-repr/structure/units-visual.ts

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
@@ -13,7 +13,6 @@ import { LocationIterator } from '../../mol-geo/util/location-iterator';
 import { Theme } from '../../mol-theme/theme';
 import { createUnitsTransform, includesUnitKind } from './visual/util/common';
 import { createRenderObject, RenderObjectValues, GraphicsRenderObject } from '../../mol-gl/render-object';
-import { UnitsParams } from './units-representation';
 import { PickingId } from '../../mol-geo/geometry/picking';
 import { Loci, isEveryLoci, EmptyLoci } from '../../mol-model/loci';
 import { Interval } from '../../mol-data/int';
@@ -27,7 +26,7 @@ import { createColors } from '../../mol-geo/geometry/color-data';
 import { Mat4 } from '../../mol-math/linear-algebra';
 import { Overpaint } from '../../mol-theme/overpaint';
 import { Transparency } from '../../mol-theme/transparency';
-import { StructureMeshParams, StructureSpheresParams, StructurePointsParams, StructureLinesParams, StructureDirectVolumeParams, StructureTextureMeshParams, StructureTextParams } from './representation';
+import { StructureMeshParams, StructureSpheresParams, StructurePointsParams, StructureLinesParams, StructureDirectVolumeParams, StructureTextureMeshParams, StructureTextParams, StructureParams } from './representation';
 import { Mesh } from '../../mol-geo/geometry/mesh/mesh';
 import { SizeTheme } from '../../mol-theme/size';
 import { Spheres } from '../../mol-geo/geometry/spheres/spheres';
@@ -50,7 +49,7 @@ function createUnitsRenderObject<G extends Geometry>(group: Unit.SymmetryGroup,
     return createRenderObject(geometry.kind, values, state, materialId)
 }
 
-interface UnitsVisualBuilder<P extends UnitsParams, G extends Geometry> {
+interface UnitsVisualBuilder<P extends StructureParams, G extends Geometry> {
     defaultProps: PD.Values<P>
     createGeometry(ctx: VisualContext, unit: Unit, structure: Structure, theme: Theme, props: PD.Values<P>, geometry?: G): Promise<G> | G
     createLocationIterator(structureGroup: StructureGroup): LocationIterator
@@ -59,11 +58,11 @@ interface UnitsVisualBuilder<P extends UnitsParams, G extends Geometry> {
     setUpdateState(state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructureGroup: StructureGroup, currentStructureGroup: StructureGroup): void
 }
 
-interface UnitsVisualGeometryBuilder<P extends UnitsParams, G extends Geometry> extends UnitsVisualBuilder<P, G> {
+interface UnitsVisualGeometryBuilder<P extends StructureParams, G extends Geometry> extends UnitsVisualBuilder<P, G> {
     geometryUtils: GeometryUtils<G>
 }
 
-export function UnitsVisual<G extends Geometry, P extends UnitsParams & Geometry.Params<G>>(builder: UnitsVisualGeometryBuilder<P, G>, materialId: number): UnitsVisual<P> {
+export function UnitsVisual<G extends Geometry, P extends StructureParams & Geometry.Params<G>>(builder: UnitsVisualGeometryBuilder<P, G>, materialId: number): UnitsVisual<P> {
     const { defaultProps, createGeometry, createLocationIterator, getLoci, eachLocation, setUpdateState } = builder
     const { createEmpty: createEmptyGeometry, updateValues, updateBoundingSphere, updateRenderableState } = builder.geometryUtils
     const updateState = VisualUpdateState.create()
@@ -278,12 +277,12 @@ export function UnitsVisual<G extends Geometry, P extends UnitsParams & Geometry
 
 // mesh
 
-export const UnitsMeshParams = { ...StructureMeshParams, ...UnitsParams }
+export const UnitsMeshParams = { ...StructureMeshParams, ...StructureParams }
 export type UnitsMeshParams = typeof UnitsMeshParams
 export interface UnitsMeshVisualBuilder<P extends UnitsMeshParams> extends UnitsVisualBuilder<P, Mesh> { }
 
 export function UnitsMeshVisual<P extends UnitsMeshParams>(builder: UnitsMeshVisualBuilder<P>, materialId: number): UnitsVisual<P> {
-    return UnitsVisual<Mesh, StructureMeshParams & UnitsParams>({
+    return UnitsVisual<Mesh, P>({
         ...builder,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructureGroup: StructureGroup, currentStructureGroup: StructureGroup) => {
             builder.setUpdateState(state, newProps, currentProps, newTheme, currentTheme, newStructureGroup, currentStructureGroup)
@@ -295,12 +294,12 @@ export function UnitsMeshVisual<P extends UnitsMeshParams>(builder: UnitsMeshVis
 
 // spheres
 
-export const UnitsSpheresParams = { ...StructureSpheresParams, ...UnitsParams }
+export const UnitsSpheresParams = { ...StructureSpheresParams, ...StructureParams }
 export type UnitsSpheresParams = typeof UnitsSpheresParams
 export interface UnitsSpheresVisualBuilder<P extends UnitsSpheresParams> extends UnitsVisualBuilder<P, Spheres> { }
 
 export function UnitsSpheresVisual<P extends UnitsSpheresParams>(builder: UnitsSpheresVisualBuilder<P>, materialId: number): UnitsVisual<P> {
-    return UnitsVisual<Spheres, StructureSpheresParams & UnitsParams>({
+    return UnitsVisual<Spheres, P>({
         ...builder,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructureGroup: StructureGroup, currentStructureGroup: StructureGroup) => {
             builder.setUpdateState(state, newProps, currentProps, newTheme, currentTheme, newStructureGroup, currentStructureGroup)
@@ -312,12 +311,12 @@ export function UnitsSpheresVisual<P extends UnitsSpheresParams>(builder: UnitsS
 
 // points
 
-export const UnitsPointsParams = { ...StructurePointsParams, ...UnitsParams }
+export const UnitsPointsParams = { ...StructurePointsParams, ...StructureParams }
 export type UnitsPointsParams = typeof UnitsPointsParams
 export interface UnitsPointVisualBuilder<P extends UnitsPointsParams> extends UnitsVisualBuilder<P, Points> { }
 
 export function UnitsPointsVisual<P extends UnitsPointsParams>(builder: UnitsPointVisualBuilder<P>, materialId: number): UnitsVisual<P> {
-    return UnitsVisual<Points, StructurePointsParams & UnitsParams>({
+    return UnitsVisual<Points, P>({
         ...builder,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructureGroup: StructureGroup, currentStructureGroup: StructureGroup) => {
             builder.setUpdateState(state, newProps, currentProps, newTheme, currentTheme, newStructureGroup, currentStructureGroup)
@@ -329,12 +328,12 @@ export function UnitsPointsVisual<P extends UnitsPointsParams>(builder: UnitsPoi
 
 // lines
 
-export const UnitsLinesParams = { ...StructureLinesParams, ...UnitsParams }
+export const UnitsLinesParams = { ...StructureLinesParams, ...StructureParams }
 export type UnitsLinesParams = typeof UnitsLinesParams
 export interface UnitsLinesVisualBuilder<P extends UnitsLinesParams> extends UnitsVisualBuilder<P, Lines> { }
 
 export function UnitsLinesVisual<P extends UnitsLinesParams>(builder: UnitsLinesVisualBuilder<P>, materialId: number): UnitsVisual<P> {
-    return UnitsVisual<Lines, StructureLinesParams & UnitsParams>({
+    return UnitsVisual<Lines, P>({
         ...builder,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructureGroup: StructureGroup, currentStructureGroup: StructureGroup) => {
             builder.setUpdateState(state, newProps, currentProps, newTheme, currentTheme, newStructureGroup, currentStructureGroup)
@@ -346,12 +345,12 @@ export function UnitsLinesVisual<P extends UnitsLinesParams>(builder: UnitsLines
 
 // text
 
-export const UnitsTextParams = { ...StructureTextParams, ...UnitsParams }
+export const UnitsTextParams = { ...StructureTextParams, ...StructureParams }
 export type UnitsTextParams = typeof UnitsTextParams
 export interface UnitsTextVisualBuilder<P extends UnitsTextParams> extends UnitsVisualBuilder<P, Text> { }
 
 export function UnitsTextVisual<P extends UnitsTextParams>(builder: UnitsTextVisualBuilder<P>, materialId: number): UnitsVisual<P> {
-    return UnitsVisual<Text, StructureTextParams & UnitsParams>({
+    return UnitsVisual<Text, P>({
         ...builder,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructureGroup: StructureGroup, currentStructureGroup: StructureGroup) => {
             builder.setUpdateState(state, newProps, currentProps, newTheme, currentTheme, newStructureGroup, currentStructureGroup)
@@ -369,12 +368,12 @@ export function UnitsTextVisual<P extends UnitsTextParams>(builder: UnitsTextVis
 
 // direct-volume
 
-export const UnitsDirectVolumeParams = { ...StructureDirectVolumeParams, ...UnitsParams }
+export const UnitsDirectVolumeParams = { ...StructureDirectVolumeParams, ...StructureParams }
 export type UnitsDirectVolumeParams = typeof UnitsDirectVolumeParams
 export interface UnitsDirectVolumeVisualBuilder<P extends UnitsDirectVolumeParams> extends UnitsVisualBuilder<P, DirectVolume> { }
 
 export function UnitsDirectVolumeVisual<P extends UnitsDirectVolumeParams>(builder: UnitsDirectVolumeVisualBuilder<P>, materialId: number): UnitsVisual<P> {
-    return UnitsVisual<DirectVolume, StructureDirectVolumeParams & UnitsParams>({
+    return UnitsVisual<DirectVolume, P>({
         ...builder,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructureGroup: StructureGroup, currentStructureGroup: StructureGroup) => {
             builder.setUpdateState(state, newProps, currentProps, newTheme, currentTheme, newStructureGroup, currentStructureGroup)
@@ -386,12 +385,12 @@ export function UnitsDirectVolumeVisual<P extends UnitsDirectVolumeParams>(build
 
 // texture-mesh
 
-export const UnitsTextureMeshParams = { ...StructureTextureMeshParams, ...UnitsParams }
+export const UnitsTextureMeshParams = { ...StructureTextureMeshParams, ...StructureParams }
 export type UnitsTextureMeshParams = typeof UnitsTextureMeshParams
 export interface UnitsTextureMeshVisualBuilder<P extends UnitsTextureMeshParams> extends UnitsVisualBuilder<P, TextureMesh> { }
 
 export function UnitsTextureMeshVisual<P extends UnitsTextureMeshParams>(builder: UnitsTextureMeshVisualBuilder<P>, materialId: number): UnitsVisual<P> {
-    return UnitsVisual<TextureMesh, StructureTextureMeshParams & UnitsParams>({
+    return UnitsVisual<TextureMesh, P>({
         ...builder,
         setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme, newStructureGroup: StructureGroup, currentStructureGroup: StructureGroup) => {
             builder.setUpdateState(state, newProps, currentProps, newTheme, currentTheme, newStructureGroup, currentStructureGroup)

+ 0 - 1
src/mol-repr/structure/visual/gaussian-surface-mesh.ts

@@ -26,7 +26,6 @@ export const GaussianSurfaceMeshParams = {
     ...UnitsMeshParams,
     ...UnitsTextureMeshParams,
     ...GaussianDensityParams,
-    ignoreHydrogens: PD.Boolean(false),
 }
 export type GaussianSurfaceMeshParams = typeof GaussianSurfaceMeshParams
 

+ 2 - 3
src/mol-repr/structure/visual/util/common.ts

@@ -85,8 +85,7 @@ export const UnitKindInfo = {
     'gaussians': {},
 }
 export type UnitKind = keyof typeof UnitKindInfo
-export const UnitKindNames = Object.keys(UnitKindInfo)
-export const UnitKindOptions = UnitKindNames.map(n => [n, n] as [UnitKind, string])
+export const UnitKindOptions = PD.objectToOptions(UnitKindInfo)
 
 export function includesUnitKind(unitKinds: UnitKind[], unit: Unit) {
     for (let i = 0, il = unitKinds.length; i < il; ++i) {
@@ -108,7 +107,7 @@ export function getConformation(unit: Unit) {
 }
 
 export const CommonSurfaceParams = {
-    ignoreHydrogens: PD.Boolean(false),
+    ignoreHydrogens: PD.Boolean(false, { description: 'Whether or not to include hydrogen atoms in the surface calculation.' }),
     includeParent: PD.Boolean(false, { description: 'Include elements of the parent structure in surface calculation to get a surface patch of the current structure.' }),
 }
 export const DefaultCommonSurfaceProps = PD.getDefaultValues(CommonSurfaceParams)

+ 4 - 3
src/mol-repr/structure/visual/util/gaussian.ts

@@ -12,11 +12,12 @@ import { GaussianDensityTexture, GaussianDensityTexture2d } from '../../../../mo
 import { Texture } from '../../../../mol-gl/webgl/texture';
 import { WebGLContext } from '../../../../mol-gl/webgl/context';
 import { getUnitConformationAndRadius, getStructureConformationAndRadius, CommonSurfaceParams } from './common';
+import { BaseGeometry } from '../../../../mol-geo/geometry/base';
 
 const SharedGaussianDensityParams = {
-    resolution: PD.Numeric(1, { min: 0.1, max: 20, 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 }),
+    resolution: PD.Numeric(1, { min: 0.1, max: 20, step: 0.1 }, { description: 'Grid resolution/cell spacing.', ...BaseGeometry.CustomQualityParamInfo }),
+    radiusOffset: PD.Numeric(0, { min: 0, max: 10, step: 0.1 }, { description: 'Extra/offset radius added to the atoms/coarse elements for gaussian calculation. Useful to create coarse, low resolution surfaces.' }),
+    smoothness: PD.Numeric(1.5, { min: 0.5, max: 2.5, step: 0.1 }, { description: 'Smoothness of the gausian surface, lower is smoother.' }),
     ...CommonSurfaceParams
 }