Browse Source

better asa label, moved asa theme to props

Alexander Rose 5 years ago
parent
commit
bac5ea7ea6

+ 10 - 10
src/mol-theme/color/accessible-surface-area.ts → src/mol-model-props/computed/themes/accessible-surface-area.ts

@@ -5,16 +5,16 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-import { ThemeDataContext } from '../theme';
-import { ColorTheme, LocationColor } from '../color';
-import { ParamDefinition as PD } from '../../mol-util/param-definition'
-import { ColorScale, Color } from '../../mol-util/color';
-import { Unit, StructureElement, StructureProperties } from '../../mol-model/structure';
-import { Location } from '../../mol-model/location';
-import { AccessibleSurfaceAreaProvider } from '../../mol-model-props/computed/accessible-surface-area';
-import { ColorListName, ColorListOptionsScale } from '../../mol-util/color/lists';
-import { AccessibleSurfaceArea } from '../../mol-model-props/computed/accessible-surface-area/shrake-rupley';
-import { CustomProperty } from '../../mol-model-props/common/custom-property';
+import { ColorListName, ColorListOptionsScale } from '../../../mol-util/color/lists'
+import { ParamDefinition as PD } from '../../../mol-util/param-definition'
+import { Color, ColorScale } from '../../../mol-util/color'
+import { ThemeDataContext } from '../../../mol-theme/theme'
+import { ColorTheme, LocationColor } from '../../../mol-theme/color'
+import { StructureProperties, StructureElement, Unit } from '../../../mol-model/structure'
+import { AccessibleSurfaceAreaProvider } from '../accessible-surface-area'
+import { AccessibleSurfaceArea } from '../accessible-surface-area/shrake-rupley'
+import { CustomProperty } from '../../common/custom-property'
+import { Location } from '../../../mol-model/location';
 
 const DefaultColor = Color(0xFAFAFA)
 const Description = 'Assigns a color based on the relative accessible surface area of a residue.'

+ 36 - 9
src/mol-plugin/behavior/dynamic/custom-props/computed/accessible-surface-area.ts

@@ -8,6 +8,9 @@ import { PluginBehavior } from '../../../behavior';
 import { ParamDefinition as PD } from '../../../../../mol-util/param-definition';
 import { AccessibleSurfaceAreaProvider } from '../../../../../mol-model-props/computed/accessible-surface-area';
 import { Loci } from '../../../../../mol-model/loci';
+import { AccessibleSurfaceAreaColorThemeProvider } from '../../../../../mol-model-props/computed/themes/accessible-surface-area';
+import { OrderedSet } from '../../../../../mol-data/int';
+import { arraySum } from '../../../../../mol-util/array';
 
 export const AccessibleSurfaceArea = PluginBehavior.create<{ autoAttach: boolean, showTooltip: boolean }>({
     name: 'computed-accessible-surface-area-prop',
@@ -17,18 +20,40 @@ export const AccessibleSurfaceArea = PluginBehavior.create<{ autoAttach: boolean
         private provider = AccessibleSurfaceAreaProvider
 
         private label = (loci: Loci): string | undefined => {
-            if (!this.params.showTooltip) return void 0;
+            if (!this.params.showTooltip) return
 
-            switch (loci.kind) {
-                case 'element-loci':
-                    if (loci.elements.length === 0) return void 0;
-                    // const e = loci.elements[0];
-                    // const u = e.unit;
-                    if (!this.provider.get(loci.structure).value) return;
+            const { granularity } = this.ctx.interactivity.props
+            if (granularity === 'element' || granularity === 'elementInstances') return
 
-                    return `Accessible Surface Area: ${'TODO'} \u212B<sup>3</sup>`;
+            if(loci.kind === 'element-loci') {
+                if (loci.elements.length === 0) return;
 
-                default: return void 0;
+                const accessibleSurfaceArea = AccessibleSurfaceAreaProvider.get(loci.structure).value
+                if (!accessibleSurfaceArea) return;
+
+                const { getSerialIndex } = loci.structure.root.serialMapping
+                const { area, serialResidueIndex } = accessibleSurfaceArea
+                const seen = new Set<number>()
+                let cummulativeArea = 0
+
+                for (const { indices, unit } of loci.elements) {
+                    OrderedSet.forEach(indices, idx => {
+                        const rSI = serialResidueIndex[getSerialIndex(unit, unit.elements[idx])]
+                        if (rSI !== -1 && !seen.has(rSI)) {
+                            cummulativeArea += area[rSI]
+                            seen.add(rSI)
+                        }
+                    })
+                }
+                if (seen.size === 0) return
+
+                return `Accessible Surface Area: ${cummulativeArea.toFixed(2)} \u212B<sup>3</sup>`;
+
+            } else if(loci.kind === 'structure-loci') {
+                const accessibleSurfaceArea = AccessibleSurfaceAreaProvider.get(loci.structure).value
+                if (!accessibleSurfaceArea) return;
+
+                return `Accessible Surface Area: ${arraySum(accessibleSurfaceArea.area).toFixed(2)} \u212B<sup>3</sup>`;
             }
         }
 
@@ -45,11 +70,13 @@ export const AccessibleSurfaceArea = PluginBehavior.create<{ autoAttach: boolean
 
         register(): void {
             this.ctx.customStructureProperties.register(this.provider, this.params.autoAttach);
+            this.ctx.structureRepresentation.themeCtx.colorThemeRegistry.add('accessible-surface-area', AccessibleSurfaceAreaColorThemeProvider)
             this.ctx.lociLabels.addProvider(this.label);
         }
 
         unregister() {
             this.ctx.customStructureProperties.unregister(this.provider.descriptor.name);
+            this.ctx.structureRepresentation.themeCtx.colorThemeRegistry.remove('accessible-surface-area')
             this.ctx.lociLabels.removeProvider(this.label);
         }
     },

+ 0 - 2
src/mol-theme/color.ts

@@ -34,7 +34,6 @@ import { OccupancyColorThemeProvider } from './color/occupancy';
 import { OperatorNameColorThemeProvider } from './color/operator-name';
 import { OperatorHklColorThemeProvider } from './color/operator-hkl';
 import { InteractionTypeColorThemeProvider } from './color/interaction-type';
-import { AccessibleSurfaceAreaColorThemeProvider } from './color/accessible-surface-area';
 
 export type LocationColor = (location: Location, isSecondary: boolean) => Color
 
@@ -76,7 +75,6 @@ namespace ColorTheme {
 }
 
 export const BuiltInColorThemes = {
-    'accessible-surface-area': AccessibleSurfaceAreaColorThemeProvider,
     'carbohydrate-symbol': CarbohydrateSymbolColorThemeProvider,
     'chain-id': ChainIdColorThemeProvider,
     'cross-link': CrossLinkColorThemeProvider,