JAL-1761 need to pass molecule type when generating superposition commands
[jalview.git] / src / jalview / ext / pymol / PymolCommands.java
index 1e4885e..ae91aa5 100644 (file)
@@ -2,6 +2,7 @@ package jalview.ext.pymol;
 
 import java.awt.Color;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -22,23 +23,31 @@ import jalview.structure.StructureCommandsBase;
  */
 public class PymolCommands extends StructureCommandsBase
 {
-  private static final StructureCommand COLOUR_BY_CHAIN = new StructureCommand("spectrum", "chain");
-
-  private static final List<StructureCommandI> COLOR_BY_CHARGE = new ArrayList<>();
-
-  private static final List<StructureCommandI> SHOW_BACKBONE = new ArrayList<>();
-
-  static {
-    COLOR_BY_CHARGE.add(new StructureCommand("color", "white", "*"));
-    COLOR_BY_CHARGE
-            .add(new StructureCommand("color", "red", "resn ASP resn GLU"));
-    COLOR_BY_CHARGE.add(
-            new StructureCommand("color", "blue", "resn LYS resn ARG"));
-    COLOR_BY_CHARGE
-            .add(new StructureCommand("color", "yellow", "resn CYS"));
-    SHOW_BACKBONE.add(new StructureCommand("hide", "everything"));
-    SHOW_BACKBONE.add(new StructureCommand("show", "ribbon"));
-  }
+  // https://pymol.org/dokuwiki/doku.php?id=command:zoom
+  // not currently documented on
+  // https://pymolwiki.org/index.php/Category:Commands
+  private static final StructureCommand FOCUS_VIEW = new StructureCommand(
+          "zoom");
+
+  // https://pymolwiki.org/index.php/Quit
+  private static final StructureCommand CLOSE_PYMOL = new StructureCommand(
+          "quit");
+
+  // not currently documented on
+  // https://pymolwiki.org/index.php/Category:Commands
+  private static final StructureCommand COLOUR_BY_CHAIN = new StructureCommand(
+          "spectrum", "chain");
+
+  private static final List<StructureCommandI> COLOR_BY_CHARGE = Arrays
+          .asList(new StructureCommand("color", "white", "*"),
+                  new StructureCommand("color", "red", "resn ASP resn GLU"),
+                  new StructureCommand("color", "blue",
+                          "resn LYS resn ARG"),
+                  new StructureCommand("color", "yellow", "resn CYS"));
+
+  private static final List<StructureCommandI> SHOW_BACKBONE = Arrays
+          .asList(new StructureCommand("hide", "everything"),
+                  new StructureCommand("show", "ribbon"));
 
   @Override
   public StructureCommandI colourByChain()
@@ -75,8 +84,7 @@ public class PymolCommands extends StructureCommandsBase
   @Override
   public StructureCommandI focusView()
   {
-    // TODO what?
-    return null;
+    return FOCUS_VIEW;
   }
 
   @Override
@@ -91,20 +99,22 @@ public class PymolCommands extends StructureCommandsBase
     {
       chains.append(" chain ").append(chain);
     }
-    commands.add(new StructureCommand("show", "cartoon", chains.toString()));
+    commands.add(
+            new StructureCommand("show", "cartoon", chains.toString()));
     return commands;
   }
 
   @Override
   public List<StructureCommandI> superposeStructures(AtomSpecModel refAtoms,
-          AtomSpecModel atomSpec)
+          AtomSpecModel atomSpec, boolean isNucleotide)
   {
     // https://pymolwiki.org/index.php/Super
     List<StructureCommandI> commands = new ArrayList<>();
-    String refAtomsAlphaOnly = getAtomSpec(refAtoms, true);
-    String atomSpec2AlphaOnly = getAtomSpec(atomSpec, true);
-    commands.add(new StructureCommand("super", refAtomsAlphaOnly,
-            atomSpec2AlphaOnly));
+    String refAtomsAlphaOnly = "("+getAtomSpec(refAtoms, true)+" and (altloc '' or altloc 'a'))";
+    String atomSpec2AlphaOnly = "("+getAtomSpec(atomSpec, true)+" and (altloc '' or altloc 'a'))";
+    // pair_fit mobile -> reference
+    commands.add(new StructureCommand("pair_fit", 
+            atomSpec2AlphaOnly, refAtomsAlphaOnly));
 
     /*
      * and show superposed residues as cartoon
@@ -229,7 +239,7 @@ public class PymolCommands extends StructureCommandsBase
       final AtomSpecModel colourData = colourMap.get(colour);
       commands.add(getColourCommand(colourData, colour));
     }
-  
+
     return commands;
   }
 
@@ -247,8 +257,7 @@ public class PymolCommands extends StructureCommandsBase
    * @return
    */
   protected StructureCommandI setAttribute(String attributeName,
-          String attributeValue,
-          AtomSpecModel atomSpecModel)
+          String attributeValue, AtomSpecModel atomSpecModel)
   {
     StringBuilder sb = new StringBuilder(128);
     sb.append("p.").append(attributeName).append("='")
@@ -282,13 +291,13 @@ public class PymolCommands extends StructureCommandsBase
     for (String featureType : featureMap.keySet())
     {
       String attributeName = makeAttributeName(featureType);
-  
+
       /*
        * todo: clear down existing attributes for this feature?
        */
       // commands.add(new StructureCommand("iterate", "all",
       // "p."+attributeName+"='None'"); //?
-  
+
       Map<Object, AtomSpecModel> values = featureMap.get(featureType);
       for (Object value : values.keySet())
       {
@@ -305,7 +314,7 @@ public class PymolCommands extends StructureCommandsBase
         commands.add(cmd);
       }
     }
-  
+
     return commands;
   }
 
@@ -313,7 +322,15 @@ public class PymolCommands extends StructureCommandsBase
   public StructureCommandI openSession(String filepath)
   {
     // https://pymolwiki.org/index.php/Load
+    // this version of the command has no dependency on file extension
     return new StructureCommand("load", filepath, "", "0", "pse");
   }
 
+  @Override
+  public StructureCommandI closeViewer()
+  {
+    // https://pymolwiki.org/index.php/Quit
+    return CLOSE_PYMOL;
+  }
+
 }