Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / structures / models / AAStructureBindingModel.java
index 906cb59..dc3cc1e 100644 (file)
@@ -26,6 +26,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.BitSet;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -42,6 +43,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;
@@ -779,7 +781,7 @@ public abstract class AAStructureBindingModel
 
     if (waiting)
     {
-      System.err.println(
+      jalview.bin.Console.errPrintln(
               "Timed out waiting for structure viewer to load file "
                       + notLoaded);
       return false;
@@ -870,21 +872,32 @@ 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);
+          matched.set(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 +940,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 +962,16 @@ public abstract class AAStructureBindingModel
               error += "; " + reply;
             }
           }
+          models.add(atomSpec);
         }
       }
+      List<StructureCommandI> finalView = commandGenerator
+              .centerViewOn(models);
+      if (finalView != null && finalView.size() > 0)
+      {
+        executeCommands(finalView, false, "Centered on Superposition");
+      }
     }
-
     return error;
   }
 
@@ -1071,7 +1092,7 @@ public abstract class AAStructureBindingModel
    * @param getReply
    * @param msg
    */
-  protected List<String> executeCommands(List<StructureCommandI> commands,
+  public List<String> executeCommands(List<StructureCommandI> commands,
           boolean getReply, String msg)
   {
     return executeCommand(getReply, msg,
@@ -1520,6 +1541,31 @@ public abstract class AAStructureBindingModel
   }
 
   /**
+   * Use restoreSession when you want to restore a previously saved sesssion to
+   * the running viewer instance.
+   * 
+   * @param absolutePath
+   */
+  public void restoreSession(String absolutePath)
+  {
+    String prefix = getViewerType().toString();
+    try
+    {
+
+      StructureCommandI cmd = commandGenerator.restoreSession(absolutePath);
+      if (cmd != null)
+      {
+        executeCommand(cmd, false);
+      }
+    } catch (Throwable e)
+    {
+      Console.error(String.format("Error restoring %s session: %s", prefix,
+              e.toString()));
+    }
+
+  }
+
+  /**
    * Saves the structure viewer session to the given file
    * 
    * @param f
@@ -1961,4 +2007,27 @@ public abstract class AAStructureBindingModel
   {
     return 0;
   }
+
+  /**
+   * list the ligands available for display/hiding in the current view
+   * 
+   * @return HETATM CODE:Molecule name
+   */
+  public Map<String, String> getHetatmNames()
+  {
+    return Collections.EMPTY_MAP;
+  }
+
+  /**
+   * Generates and executes a command to show the given hetatm types as CPK
+   * 
+   * @param toShow
+   *          - one or more of strings from getHetatmNames
+   */
+  public void showHetatms(List<String> toShow)
+  {
+    executeCommands(commandGenerator.showHetatms(toShow), false,
+            "Adjusting hetatm visibility");
+  }
+
 }