Browse Source

secondary structure query/selection improvements

- secondaryStructureFlag names for query
- helix and beta selection query helper
Alexander Rose 5 years ago
parent
commit
f2740aaee2

+ 3 - 1
src/mol-plugin-ui/structure/selection.tsx

@@ -17,7 +17,9 @@ import { StructureElement } from '../../mol-model/structure';
 
 const SSQ = StructureSelectionQueries
 const DefaultQueries: (keyof typeof SSQ)[] = [
-    'all', 'polymer', 'trace', 'backbone', 'protein', 'nucleic', 'water', 'branched', 'ligand', 'nonStandardPolymer',
+    'all', 'polymer', 'trace', 'backbone', 'protein', 'nucleic',
+    'helix', 'beta',
+    'water', 'branched', 'ligand', 'nonStandardPolymer',
     'surroundings', 'complement', 'bonded'
 ]
 

+ 35 - 1
src/mol-plugin/util/structure-selection-helper.ts

@@ -13,7 +13,7 @@ import { compile } from '../../mol-script/runtime/query/compiler';
 import { Loci } from '../../mol-model/loci';
 import { PluginContext } from '../context';
 import Expression from '../../mol-script/language/expression';
-import { LinkType, ProteinBackboneAtoms, NucleicBackboneAtoms } from '../../mol-model/structure/model/types';
+import { LinkType, ProteinBackboneAtoms, NucleicBackboneAtoms, SecondaryStructureType } from '../../mol-model/structure/model/types';
 import { StateTransforms } from '../state/transforms';
 
 export interface StructureSelectionQuery {
@@ -123,6 +123,38 @@ const proteinOrNucleic = StructureSelectionQuery('Protein or Nucleic', MS.struct
     })
 ]))
 
+const helix = StructureSelectionQuery('Helix', MS.struct.modifier.union([
+    MS.struct.generator.atomGroups({
+        'entity-test': MS.core.logic.and([
+            MS.core.rel.eq([MS.ammp('entityType'), 'polymer']),
+            MS.core.str.match([
+                MS.re('(polypeptide|cyclic-pseudo-peptide)', 'i'),
+                MS.ammp('entitySubtype')
+            ])
+        ]),
+        'residue-test': MS.core.flags.hasAny([
+            MS.ammp('secondaryStructureFlags'),
+            MS.core.type.bitflags([SecondaryStructureType.Flag.Helix])
+        ])
+    })
+]))
+
+const beta = StructureSelectionQuery('Beta Strand/Sheet', MS.struct.modifier.union([
+    MS.struct.generator.atomGroups({
+        'entity-test': MS.core.logic.and([
+            MS.core.rel.eq([MS.ammp('entityType'), 'polymer']),
+            MS.core.str.match([
+                MS.re('(polypeptide|cyclic-pseudo-peptide)', 'i'),
+                MS.ammp('entitySubtype')
+            ])
+        ]),
+        'residue-test': MS.core.flags.hasAny([
+            MS.ammp('secondaryStructureFlags'),
+            MS.core.type.bitflags([SecondaryStructureType.Flag.Beta])
+        ])
+    })
+]))
+
 const water = StructureSelectionQuery('Water', MS.struct.modifier.union([
     MS.struct.generator.atomGroups({
         'entity-test': MS.core.rel.eq([MS.ammp('entityType'), 'water'])
@@ -294,6 +326,8 @@ export const StructureSelectionQueries = {
     protein,
     nucleic,
     proteinOrNucleic,
+    helix,
+    beta,
     water,
     branched,
     branchedPlusConnected,

+ 28 - 3
src/mol-script/runtime/query/table.ts

@@ -8,7 +8,7 @@
 import { MolScriptSymbolTable as MolScript } from '../../language/symbol-table';
 import { DefaultQueryRuntimeTable, QuerySymbolRuntime, QueryRuntimeArguments } from './compiler';
 import { Queries, StructureProperties, StructureElement, QueryContext, UnitRing } from '../../../mol-model/structure';
-import { ElementSymbol, LinkType } from '../../../mol-model/structure/model/types';
+import { ElementSymbol, LinkType, SecondaryStructureType } from '../../../mol-model/structure/model/types';
 import { SetUtils } from '../../../mol-util/set';
 import { upperCaseAny } from '../../../mol-util/string';
 import { VdwRadius, AtomWeight, AtomNumber } from '../../../mol-model/structure/model/properties/atomic';
@@ -185,9 +185,18 @@ const symbols = [
         return ret;
     }),
     C(MolScript.structureQuery.type.ringFingerprint, (ctx, xs) => UnitRing.elementFingerprint(getArray(ctx, xs))),
+    C(MolScript.structureQuery.type.secondaryStructureFlags, (ctx, xs) => {
+        let ret: SecondaryStructureType = SecondaryStructureType.Flag.None;
+        if (typeof xs.length === 'number') {
+            for (let i = 0, _i = xs.length; i < _i; i++) ret = secondaryStructureFlag(ret, xs[i](ctx));
+        } else {
+            for (const k of Object.keys(xs)) ret = secondaryStructureFlag(ret, xs[k](ctx));
+        }
+        return ret;
+    }),
 
     // TODO:
-    // C(MolScript.structureQuery.type.secondaryStructureFlags, (ctx, v) => StructureRuntime.AtomProperties.createSecondaryStructureFlags(env, v)),
+
     // C(MolScript.structureQuery.type.entityType, (ctx, v) => StructureRuntime.Common.entityType(v[0](ctx))),
     // C(MolScript.structureQuery.type.authResidueId, (ctx, v) => ResidueIdentifier.auth(v[0](ctx), v[1](ctx), v[2] && v[2](ctx))),
     // C(MolScript.structureQuery.type.labelResidueId, (ctx, v) => ResidueIdentifier.label(v[0](ctx), v[1](ctx), v[2](ctx), v[3] && v[3](ctx))),
@@ -347,7 +356,7 @@ function linkFlag(current: LinkType, f: string): LinkType {
     switch (f.toLowerCase()) {
         case 'covalent': return current | LinkType.Flag.Covalent;
         case 'metallic': return current | LinkType.Flag.MetallicCoordination;
-        case 'ion': return current | LinkType.Flag.Ionic;
+        case 'ionic': return current | LinkType.Flag.Ionic;
         case 'hydrogen': return current | LinkType.Flag.Hydrogen;
         case 'sulfide': return current | LinkType.Flag.Sulfide;
         case 'aromatic': return current | LinkType.Flag.Aromatic;
@@ -356,6 +365,22 @@ function linkFlag(current: LinkType, f: string): LinkType {
     }
 }
 
+function secondaryStructureFlag(current: SecondaryStructureType, f: string): SecondaryStructureType {
+    switch (f.toLowerCase()) {
+        case 'helix': return current | SecondaryStructureType.Flag.Helix;
+        case 'alpha': return current | SecondaryStructureType.Flag.Helix | SecondaryStructureType.Flag.HelixAlpha;
+        case 'pi': return current | SecondaryStructureType.Flag.Helix | SecondaryStructureType.Flag.HelixPi;
+        case '310': return current | SecondaryStructureType.Flag.Helix | SecondaryStructureType.Flag.Helix3Ten;
+        case 'beta': return current | SecondaryStructureType.Flag.Beta;
+        case 'strand': return current | SecondaryStructureType.Flag.Beta | SecondaryStructureType.Flag.BetaStrand;
+        case 'sheet': return current | SecondaryStructureType.Flag.Beta | SecondaryStructureType.Flag.BetaSheet;
+        case 'turn': return current | SecondaryStructureType.Flag.Turn;
+        case 'bend': return current | SecondaryStructureType.Flag.Bend;
+        case 'coil': return current | SecondaryStructureType.Flag.NA;
+        default: return current;
+    }
+}
+
 function getArray<T = any>(ctx: QueryContext, xs: any): T[] {
     const ret: T[] = [];
     if (!xs) return ret;