Ver Fonte

covalentlyBondedComponent query

dsehnal há 4 anos atrás
pai
commit
82dd0496c2

+ 14 - 4
src/mol-model/structure/query/queries/modifiers.ts

@@ -306,10 +306,11 @@ export interface IncludeConnectedParams {
     query: StructureQuery,
     bondTest?: QueryFn<boolean>,
     layerCount: number,
-    wholeResidues: boolean
+    wholeResidues: boolean,
+    fixedPoint: boolean
 }
 
-export function includeConnected({ query, layerCount, wholeResidues, bondTest }: IncludeConnectedParams): StructureQuery {
+export function includeConnected({ query, layerCount, wholeResidues, bondTest, fixedPoint }: IncludeConnectedParams): StructureQuery {
     const lc = Math.max(layerCount, 0);
     return function query_includeConnected(ctx) {
         const builder = StructureSelection.UniqueBuilder(ctx.inputStructure);
@@ -318,8 +319,17 @@ export function includeConnected({ query, layerCount, wholeResidues, bondTest }:
         ctx.atomicBond.setTestFn(bondTest);
         StructureSelection.forEach(src, (s, sI) => {
             let incl = s;
-            for (let i = 0; i < lc; i++) {
-                incl = includeConnectedStep(ctx, wholeResidues, incl);
+
+            if (fixedPoint) {
+                while (true) {
+                    const prevCount = incl.elementCount;
+                    incl = includeConnectedStep(ctx, wholeResidues, incl);
+                    if (incl.elementCount === prevCount) break;
+                }
+            } else {
+                for (let i = 0; i < lc; i++) {
+                    incl = includeConnectedStep(ctx, wholeResidues, incl);
+                }
             }
             builder.add(incl);
             if (sI % 10 === 0) ctx.throwIfTimedOut();

+ 11 - 0
src/mol-plugin-state/helpers/structure-selection-query.ts

@@ -446,6 +446,16 @@ const covalentlyBonded = StructureSelectionQuery('Residues Covalently Bonded to
     referencesCurrent: true
 });
 
+const covalentlyBondedComponent = StructureSelectionQuery('Covalently Bonded Component', MS.struct.modifier.union([
+    MS.struct.modifier.includeConnected({
+        0: MS.internal.generator.current(), 'fixed-point': true
+    })
+]), {
+    description: 'Select covalently bonded component based on current selection.',
+    category: StructureSelectionCategory.Manipulate,
+    referencesCurrent: true
+});
+
 const covalentlyOrMetallicBonded = StructureSelectionQuery('Residues with Cov. or Metallic Bond to Selection', MS.struct.modifier.union([
     MS.struct.modifier.includeConnected({
         0: MS.internal.generator.current(),
@@ -638,6 +648,7 @@ export const StructureSelectionQueries = {
     complement,
     covalentlyBonded,
     covalentlyOrMetallicBonded,
+    covalentlyBondedComponent,
     wholeResidues,
 };
 

+ 1 - 0
src/mol-script/language/symbol-table/structure-query.ts

@@ -159,6 +159,7 @@ const modifier = {
         0: Argument(Types.ElementSelectionQuery),
         'bond-test': Argument(Type.Bool, { isOptional: true, defaultValue: 'true for covalent bonds' as any }),
         'layer-count': Argument(Type.Num, { isOptional: true, defaultValue: 1, description: 'Number of bonded layers to include.' }),
+        'fixed-point': Argument(Type.Bool, { isOptional: true, defaultValue: false, description: 'Continue adding layers as long as new connections exist.' }),
         'as-whole-residues': Argument(Type.Bool, { isOptional: true })
     }), Types.ElementSelectionQuery, 'Pick all atom sets that are connected to the target.'),
 

+ 2 - 1
src/mol-script/runtime/query/table.ts

@@ -267,7 +267,8 @@ const symbols = [
             query: xs[0] as any,
             bondTest: xs['bond-test'],
             wholeResidues: !!(xs['as-whole-residues'] && xs['as-whole-residues'](ctx)),
-            layerCount: (xs['layer-count'] && xs['layer-count'](ctx)) || 1
+            layerCount: (xs['layer-count'] && xs['layer-count'](ctx)) || 1,
+            fixedPoint: xs['fixed-point']?.(ctx) ?? false
         })(ctx);
     }),