Переглянути джерело

Merge remote-tracking branch 'origin/dev-sb-v2' into dev-sb-v2

Sebastian Bittrich 3 роки тому
батько
коміт
7253dfb10a
3 змінених файлів з 14 додано та 9 видалено
  1. 1 1
      package.json
  2. 8 3
      src/viewer/helpers/selection.ts
  3. 5 5
      src/viewer/helpers/viewer.ts

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
     "name": "@rcsb/rcsb-molstar",
-    "version": "2.0.0-dev.9",
+    "version": "2.0.0-dev.10",
     "description": "RCSB PDB apps and props based on Mol*.",
     "homepage": "https://github.com/rcsb/rcsb-molstar#readme",
     "repository": {

+ 8 - 3
src/viewer/helpers/selection.ts

@@ -44,6 +44,7 @@ export type Target = {
 export type SelectBase = {
     readonly modelId: string
     readonly labelAsymId: string
+    readonly operatorName?: string
 }
 export type SelectSingle = {
     readonly labelSeqId: number
@@ -186,14 +187,18 @@ const labelFromProps = (entryId: string, labelAsymId?: string, range?: number[])
         (range && range.length > 1 ? `-${range[range.length - 1]}` : '');
 };
 
-export function rangeToTest(asymId: string, residues: number[]) {
+export function rangeToTest(asymId: string, residues: number[], operatorName?: string) {
+    const chainTests: Expression[] = [MS.core.rel.eq([MS.ammp('label_asym_id'), asymId])];
+    if(operatorName)
+        chainTests.push(MS.core.rel.eq([operatorName, MS.acp('operatorName')]));
+
     if (residues.length > 0) {
         return {
-            'chain-test': MS.core.rel.eq([MS.ammp('label_asym_id'), asymId]),
+            'chain-test': MS.core.logic.and(chainTests),
             'residue-test': MS.core.set.has([MS.set(...residues), MS.ammp('label_seq_id')])
         };
     } else {
-        return { 'chain-test': MS.core.rel.eq([MS.ammp('label_asym_id'), asymId]) };
+        return { 'chain-test': MS.core.logic.and(chainTests) };
     }
 }
 

+ 5 - 5
src/viewer/helpers/viewer.ts

@@ -47,11 +47,11 @@ export function getStructureRefWithModelId(structures: StructureRef[], target: {
 export function select(plugin: PluginContext, targets: SelectTarget | SelectTarget[], mode: 'select' | 'hover', modifier: 'add' | 'set') {
     if (modifier === 'set')
         clearSelection(plugin, mode);
-    (Array.isArray(targets) ? targets : [targets]).forEach(target => {
-        const data = getStructureWithModelId(plugin.managers.structure.hierarchy.current.structures, target);
-        if (!data) return;
+    (Array.isArray(targets) ? targets : [targets]).forEach((target, n)=>{
+        const structure = getStructureWithModelId(plugin.managers.structure.hierarchy.current.structures, target);
+        if (!structure) return;
 
-        const loci = targetToLoci(target, data);
+        const loci = targetToLoci(target, structure);
         if (!loci) return;
 
         if (mode === 'hover') {
@@ -87,7 +87,7 @@ export async function createComponent(plugin: PluginContext, componentLabel: str
 
         const residues = toResidues(target);
         const sel = StructureSelectionQuery('innerQuery_' + Math.random().toString(36).substring(2),
-            MS.struct.generator.atomGroups(rangeToTest(target.labelAsymId, residues)));
+            MS.struct.generator.atomGroups(rangeToTest(target.labelAsymId, residues, target.operatorName)));
         await plugin.managers.structure.component.add({
             selection: sel,
             options: { checkExisting: false, label: componentLabel },