JAL-3551 working proof of concept of Jalview driving PyMOL
[jalview.git] / src / jalview / ext / jmol / JmolCommands.java
index 6f682be..bd44921 100644 (file)
@@ -29,6 +29,8 @@ import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SequenceI;
 import jalview.renderer.seqfeatures.FeatureColourFinder;
 import jalview.structure.AtomSpecModel;
+import jalview.structure.StructureCommand;
+import jalview.structure.StructureCommandI;
 import jalview.structure.StructureCommandsBase;
 import jalview.structure.StructureMapping;
 import jalview.structure.StructureSelectionManager;
@@ -36,6 +38,7 @@ import jalview.util.Comparison;
 
 import java.awt.Color;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -47,10 +50,20 @@ import java.util.Map;
  */
 public class JmolCommands extends StructureCommandsBase
 {
-  private static final String CMD_COLOUR_BY_CHARGE = "select *;color white;select ASP,GLU;color red;"
-          + "select LYS,ARG;color blue;select CYS;color yellow";
+  private static final StructureCommand SHOW_BACKBONE = new StructureCommand(
+          "select *; cartoons off; backbone");
 
-  private static final String CMD_COLOUR_BY_CHAIN = "select *;color chain";
+  private static final StructureCommand FOCUS_VIEW = new StructureCommand("zoom 0");
+
+  private static final StructureCommand COLOUR_ALL_WHITE = new StructureCommand(
+          "select *;color white;");
+
+  private static final StructureCommandI COLOUR_BY_CHARGE = new StructureCommand(
+          "select *;color white;select ASP,GLU;color red;"
+                  + "select LYS,ARG;color blue;select CYS;color yellow");
+
+  private static final StructureCommandI COLOUR_BY_CHAIN = new StructureCommand(
+          "select *;color chain");
 
   private static final String PIPE = "|";
 
@@ -240,41 +253,39 @@ public class JmolCommands extends StructureCommandsBase
   }
 
   @Override
-  public String colourByChain()
+  public StructureCommandI colourByChain()
   {
-    return CMD_COLOUR_BY_CHAIN;
+    return COLOUR_BY_CHAIN;
   }
 
   @Override
-  public String colourByCharge()
+  public List<StructureCommandI> colourByCharge()
   {
-    return CMD_COLOUR_BY_CHARGE;
+    return Arrays.asList(COLOUR_BY_CHARGE);
   }
 
   @Override
-  public String colourByResidues(Map<String, Color> colours)
+  public List<StructureCommandI> colourByResidues(Map<String, Color> colours)
   {
-    StringBuilder cmd = new StringBuilder(128);
-    cmd.append("select *;color white;");
-    cmd.append(super.colourByResidues(colours));
-
-    return cmd.toString();
+    List<StructureCommandI> cmds = super.colourByResidues(colours);
+    cmds.add(0, COLOUR_ALL_WHITE);
+    return cmds;
   }
 
   @Override
-  public String setBackgroundColour(Color col)
+  public StructureCommandI setBackgroundColour(Color col)
   {
-    return "background " + getColourString(col);
+    return new StructureCommand("background " + getColourString(col));
   }
 
   @Override
-  public String focusView()
+  public StructureCommandI focusView()
   {
-    return "zoom 0";
+    return FOCUS_VIEW;
   }
 
   @Override
-  public String showChains(List<String> toShow)
+  public List<StructureCommandI> showChains(List<String> toShow)
   {
     StringBuilder atomSpec = new StringBuilder(128);
     boolean first = true;
@@ -295,7 +306,7 @@ public class JmolCommands extends StructureCommandsBase
     String spec = atomSpec.toString();
     String command = "select *;restrict " + spec + ";cartoon;center "
             + spec;
-    return command;
+    return Arrays.asList(new StructureCommand(command));
   }
 
   /**
@@ -319,13 +330,13 @@ public class JmolCommands extends StructureCommandsBase
    * @see https://chemapps.stolaf.edu/jmol/docs/#compare
    */
   @Override
-  public String superposeStructures(AtomSpecModel refAtoms,
+  public List<StructureCommandI> superposeStructures(AtomSpecModel refAtoms,
           AtomSpecModel atomSpec)
   {
     StringBuilder sb = new StringBuilder(64);
-    int refModel = refAtoms.getModels().iterator().next();
-    int model2 = atomSpec.getModels().iterator().next();
-    sb.append(String.format("compare {%d.1} {%d.1}", model2, refModel));
+    String refModel = refAtoms.getModels().iterator().next();
+    String model2 = atomSpec.getModels().iterator().next();
+    sb.append(String.format("compare {%s.1} {%s.1}", model2, refModel));
     sb.append(" SUBSET {(*.CA | *.P) and conformation=1} ATOMS {");
 
     /*
@@ -344,36 +355,36 @@ public class JmolCommands extends StructureCommandsBase
     sb.append(getAtomSpec(refAtoms, false)).append(getCommandSeparator())
             .append("cartoons");
 
-    return sb.toString();
+    return Arrays.asList(new StructureCommand(sb.toString()));
   }
 
   @Override
-  public String openCommandFile(String path)
+  public StructureCommandI openCommandFile(String path)
   {
     /*
      * https://chemapps.stolaf.edu/jmol/docs/#script
      * not currently used in Jalview
      */
-    return "script " + path;
+    return new StructureCommand("script " + path);
   }
 
   @Override
-  public String saveSession(String filepath)
+  public StructureCommandI saveSession(String filepath)
   {
     /*
      * https://chemapps.stolaf.edu/jmol/docs/#write
      * not currently used in Jalview
      */
-    return "write \"" + filepath + "\"";
+    return new StructureCommand("write \"" + filepath + "\"");
   }
 
   @Override
-  protected String getColourCommand(String atomSpec, Color colour)
+  protected StructureCommandI getColourCommand(String atomSpec, Color colour)
   {
     StringBuilder sb = new StringBuilder(atomSpec.length()+20);
     sb.append("select ").append(atomSpec).append(getCommandSeparator())
             .append("color").append(getColourString(colour));
-    return sb.toString();
+    return new StructureCommand(sb.toString());
   }
 
   @Override
@@ -398,7 +409,7 @@ public class JmolCommands extends StructureCommandsBase
     StringBuilder sb = new StringBuilder(128);
 
     boolean first = true;
-    for (int modelNo : model.getModels())
+    for (String modelNo : model.getModels())
     {
       for (String chain : model.getChains(modelNo))
       {
@@ -427,8 +438,14 @@ public class JmolCommands extends StructureCommandsBase
   }
 
   @Override
-  public String showBackbone()
+  public List<StructureCommandI> showBackbone()
+  {
+    return Arrays.asList(SHOW_BACKBONE);
+  }
+
+  @Override
+  public StructureCommandI loadFile(String file)
   {
-    return "select *; cartoons off; backbone";
+    return null;
   }
 }