Browse Source

AssemblySymmetryControls fixes

Alexander Rose 5 years ago
parent
commit
d97d7e3b14

+ 1 - 1
src/mol-plugin-state/builder/structure/hierarchy-preset.ts

@@ -56,7 +56,7 @@ const defaultPreset = TrajectoryHierarchyPresetProvider({
         const structureProperties = await builder.insertStructureProperties(structure, params.structureProperties);
 
         const unitcell = params.showUnitcell === void 0 || !!params.showUnitcell ? await builder.tryCreateUnitcell(modelProperties, undefined, { isHidden: true }) : void 0;
-        const representation =  await plugin.builders.structure.representation.applyPreset(structureProperties, params.representationPreset || 'auto');
+        const representation = await plugin.builders.structure.representation.applyPreset(structureProperties, params.representationPreset || 'auto');
 
         return {
             model,

+ 15 - 6
src/mol-plugin/behavior/dynamic/custom-props/rcsb/assembly-symmetry.ts

@@ -43,7 +43,7 @@ export const RCSBAssemblySymmetry = PluginBehavior.create<{ autoAttach: boolean
                 return [refs, 'Symmetries']
             })
             this.ctx.customStructureControls.set(Tag.Representation, AssemblySymmetryControls as any)
-            this.ctx.builders.structure.representation.registerPreset(assemblySymmetryPreset)
+            this.ctx.builders.structure.representation.registerPreset(AssemblySymmetryPreset)
         }
 
         update(p: { autoAttach: boolean }) {
@@ -60,7 +60,7 @@ export const RCSBAssemblySymmetry = PluginBehavior.create<{ autoAttach: boolean
 
             this.ctx.genericRepresentationControls.delete(Tag.Representation)
             this.ctx.customStructureControls.delete(Tag.Representation)
-            this.ctx.builders.structure.representation.unregisterPreset(assemblySymmetryPreset)
+            this.ctx.builders.structure.representation.unregisterPreset(AssemblySymmetryPreset)
         }
     },
     params: () => ({
@@ -144,14 +144,23 @@ const AssemblySymmetry3D = PluginStateTransform.BuiltIn({
 
 //
 
-const assemblySymmetryPreset = StructureRepresentationPresetProvider({
+const AssemblySymmetryPresetParams = {
+    ...StructureRepresentationPresetProvider.CommonParams,
+    symmetryIndex: PD.Numeric(0)
+}
+
+export const AssemblySymmetryPreset = StructureRepresentationPresetProvider({
     id: 'preset-structure-representation-rcsb-assembly-symmetry',
     display: { name: 'Assembly Symmetry', group: 'Annotation' },
-    params: () => StructureRepresentationPresetProvider.CommonParams,
+    params: () => AssemblySymmetryPresetParams,
     async apply(ref, params, plugin) {
         const structureCell = StateObjectRef.resolveAndCheck(plugin.state.data, ref);
-        const model = structureCell?.obj?.data.model;
-        if (!structureCell || !model) return {};
+        const structure = structureCell?.obj?.data;
+        if (!structureCell || !structure) return {};
+
+        await plugin.runTask(Task.create('Assembly Symmetry', async runtime => {
+            await AssemblySymmetryProvider.attach({ fetch: plugin.fetch, runtime }, structure, { symmetryIndex: params.symmetryIndex })
+        }))
 
         const assemblySymmetry = await tryCreateAssemblySymmetry(plugin, structureCell);
         const preset = await PresetStructureRepresentations.auto.apply(ref, { ...params, globalThemeName: Tag.Cluster as any }, plugin);

+ 21 - 16
src/mol-plugin/behavior/dynamic/custom-props/rcsb/ui/assembly-symmetry.tsx

@@ -15,7 +15,6 @@ import { StructureHierarchyManager } from '../../../../../../mol-plugin-state/ma
 
 interface AssemblySymmetryControlState extends CollapsableState {
     isBusy: boolean
-    options: AssemblySymmetryProps
 }
 
 export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySymmetryControlState> {
@@ -24,18 +23,18 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy
             header: 'Assembly Symmetry',
             isCollapsed: false,
             isBusy: false,
-            isHidden: true,
-            options: PD.getDefaultValues(AssemblySymmetryProvider.defaultParams)
+            isHidden: true
         };
     }
 
     componentDidMount() {
-        this.subscribe(this.plugin.managers.structure.hierarchy.behaviors.selection, () => this.setState({ isHidden: !this.canEnable() }));
+        this.subscribe(this.plugin.managers.structure.hierarchy.behaviors.selection, () => {
+            this.setState({
+                isHidden: !this.canEnable(),
+                description: StructureHierarchyManager.getSelectedStructuresDescription(this.plugin)
+            })
+        });
         this.subscribe(this.plugin.behaviors.state.isBusy, v => this.setState({ isBusy: v }));
-
-        this.subscribe(this.plugin.managers.structure.hierarchy.behaviors.selection, c => this.setState({
-            description: StructureHierarchyManager.getSelectedStructuresDescription(this.plugin)
-        }));
     }
 
     get pivot() {
@@ -69,14 +68,21 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy
         return params
     }
 
+    get values() {
+        const structure = this.pivot.cell.obj?.data
+        if (structure) {
+            return AssemblySymmetryProvider.props(structure)
+        } else {
+            return { ...PD.getDefaultValues(AssemblySymmetryProvider.defaultParams), symmetryIndex: -1 }
+        }
+    }
+
     async updateAssemblySymmetry(values: AssemblySymmetryProps) {
         const s = this.pivot
-        const assemblySymmetryParams = AssemblySymmetryProvider.getParams(s.cell.obj?.data!);
+        const currValues = AssemblySymmetryProvider.props(s.cell.obj!.data)
+        if (PD.areEqual(AssemblySymmetryProvider.defaultParams, currValues, values)) return;
 
         if (s.properties) {
-            const oldParams = s.properties.cell.transform.params?.properties[AssemblySymmetryProvider.descriptor.name];
-            if (PD.areEqual(assemblySymmetryParams, oldParams, values)) return;
-
             const b = this.plugin.state.data.build();
             b.to(s.properties.cell).update(old => {
                 old.properties[AssemblySymmetryProvider.descriptor.name] = values;
@@ -85,14 +91,13 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy
         } else {
             const pd = this.plugin.customStructureProperties.getParams(s.cell.obj?.data);
             const params = PD.getDefaultValues(pd);
-            if (PD.areEqual(assemblySymmetryParams, params.properties[AssemblySymmetryProvider.descriptor.name], values)) return;
             params.properties[AssemblySymmetryProvider.descriptor.name] = values;
             await this.plugin.builders.structure.insertStructureProperties(s.cell, params);
         }
+        this.forceUpdate()
     }
 
     paramsOnChange = (options: AssemblySymmetryProps) => {
-        this.setState({ options })
         this.updateAssemblySymmetry(options)
     }
 
@@ -101,7 +106,7 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy
     }
 
     get enable() {
-        return !this.hasAssemblySymmetry3D && this.state.options.symmetryIndex !== -1
+        return !this.hasAssemblySymmetry3D && this.values.symmetryIndex !== -1
     }
 
     get noSymmetries() {
@@ -112,7 +117,7 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy
 
     renderParams() {
         return <>
-            <ParameterControls params={this.params} values={this.state.options} onChangeValues={this.paramsOnChange} />
+            <ParameterControls params={this.params} values={this.values} onChangeValues={this.paramsOnChange} />
         </>;
     }
 

+ 3 - 3
src/mol-plugin/behavior/dynamic/custom-props/rcsb/validation-report.ts

@@ -53,7 +53,7 @@ export const RCSBValidationReport = PluginBehavior.create<{ autoAttach: boolean,
 
             this.ctx.representation.structure.registry.add(ClashesRepresentationProvider)
             this.ctx.query.structure.registry.add(hasClash)
-            this.ctx.builders.structure.representation.registerPreset(validationReportPreset)
+            this.ctx.builders.structure.representation.registerPreset(ValidationReportPreset)
         }
 
         update(p: { autoAttach: boolean, showTooltip: boolean }) {
@@ -78,7 +78,7 @@ export const RCSBValidationReport = PluginBehavior.create<{ autoAttach: boolean,
 
             this.ctx.representation.structure.registry.remove(ClashesRepresentationProvider)
             this.ctx.query.structure.registry.remove(hasClash)
-            this.ctx.builders.structure.representation.unregisterPreset(validationReportPreset)
+            this.ctx.builders.structure.representation.unregisterPreset(ValidationReportPreset)
         }
     },
     params: () => ({
@@ -288,7 +288,7 @@ const hasClash = StructureSelectionQuery('Residues with Clashes', MS.struct.modi
 
 //
 
-const validationReportPreset = StructureRepresentationPresetProvider({
+export const ValidationReportPreset = StructureRepresentationPresetProvider({
     id: 'preset-structure-representation-rcsb-validation-report',
     display: { name: 'Validation Report', group: 'Annotation' },
     params: () => StructureRepresentationPresetProvider.CommonParams,

+ 1 - 1
src/mol-plugin/behavior/dynamic/volume-streaming/behavior.ts

@@ -236,7 +236,7 @@ export namespace VolumeStreaming {
 
             this.subscribeObservable(this.plugin.managers.structure.focus.behaviors.current, (entry) => {
                 const loci = entry ? entry.loci : EmptyLoci
-    
+
                 if (this.params.entry.params.view.name !== 'selection-box') {
                     this.lastLoci = loci;
                 } else {