JAL-4089 use column selection to superpose if 4 or more selected
authorJim Procter <j.procter@dundee.ac.uk>
Fri, 28 Oct 2022 14:48:32 +0000 (15:48 +0100)
committerJim Procter <j.procter@dundee.ac.uk>
Fri, 28 Oct 2022 15:29:30 +0000 (16:29 +0100)
src/jalview/structures/models/AAStructureBindingModel.java

index 906cb59..8436b48 100644 (file)
@@ -42,6 +42,7 @@ import jalview.api.StructureSelectionManagerProvider;
 import jalview.api.structures.JalviewStructureDisplayI;
 import jalview.bin.Console;
 import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.MappedFeatures;
 import jalview.datamodel.PDBEntry;
@@ -870,21 +871,39 @@ public abstract class AAStructureBindingModel
     {
       AlignmentI alignment = view.getAlignment();
       HiddenColumns hiddenCols = alignment.getHiddenColumns();
-
       /*
        * 'matched' bit i will be set for visible alignment columns i where
        * all sequences have a residue with a mapping to their PDB structure
        */
-      BitSet matched = new BitSet();
       final int width = alignment.getWidth();
-      for (int m = 0; m < width; m++)
+      BitSet matched = new BitSet();
+      ColumnSelection cs = view.getAlignViewport().getColumnSelection();
+      // restrict to active column selection, if there is one
+      if (cs != null && cs.hasSelectedColumns()
+              && cs.getSelected().size() >= 4)
       {
-        if (hiddenCols == null || hiddenCols.isVisible(m))
+        for (int s : cs.getSelected())
         {
-          matched.set(m);
+          if (hiddenCols == null)
+          {
+            matched.set(s);
+          }
+          else
+          {
+            matched.set(hiddenCols.visibleToAbsoluteColumn(s));
+          }
+        }
+      }
+      else
+      {
+        for (int m = 0; m < width; m++)
+        {
+          if (hiddenCols == null || hiddenCols.isVisible(m))
+          {
+            matched.set(m);
+          }
         }
       }
-
       AAStructureBindingModel.SuperposeData[] structures = new AAStructureBindingModel.SuperposeData[files.length];
       for (int f = 0; f < files.length; f++)
       {
@@ -927,6 +946,8 @@ public abstract class AAStructureBindingModel
       AtomSpecType backbone = structures[refStructure].isRna
               ? AtomSpecType.PHOSPHATE
               : AtomSpecType.ALPHA;
+      List<AtomSpecModel> models = new ArrayList<AtomSpecModel>();
+      models.add(refAtoms);
       /*
        * superpose each (other) structure to the reference in turn
        */
@@ -947,10 +968,13 @@ public abstract class AAStructureBindingModel
               error += "; " + reply;
             }
           }
+          models.add(atomSpec);
         }
       }
+      List<StructureCommandI> finalView = commandGenerator
+              .centerViewOn(models);
+      executeCommands(finalView, false, "Centered on Superposition");
     }
-
     return error;
   }