JAL-1761 need to pass molecule type when generating superposition commands
[jalview.git] / src / jalview / ext / rbvi / chimera / ChimeraCommands.java
index ac10b0b..bfad8fb 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.ext.rbvi.chimera;
 
+import java.util.Locale;
+
 import java.awt.Color;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -40,12 +42,30 @@ import jalview.util.ColorUtils;
  */
 public class ChimeraCommands extends StructureCommandsBase
 {
+  // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/focus.html
+  private static final StructureCommand FOCUS_VIEW = new StructureCommand("focus");
+
+  // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/listen.html#listresattr
+  private static final StructureCommand LIST_RESIDUE_ATTRIBUTES = new StructureCommand("list resattr");
+
+  // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/stop.html
+  private static final StructureCommand CLOSE_CHIMERA = new StructureCommand("stop really");
+
+  // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/listen.html
+  private static final StructureCommand STOP_NOTIFY_SELECTION = new StructureCommand("listen stop selection");
+
+  private static final StructureCommand STOP_NOTIFY_MODELS = new StructureCommand("listen stop models");
+
+  // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/listen.html#listselection
+  private static final StructureCommand GET_SELECTION = new StructureCommand("list selection level residue");
+
   private static final StructureCommand SHOW_BACKBONE = new StructureCommand(
           "~display all;~ribbon;chain @CA|P");
 
   private static final StructureCommandI COLOUR_BY_CHARGE = new StructureCommand(
           "color white;color red ::ASP,GLU;color blue ::LYS,ARG;color yellow ::CYS");
 
+  // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/rainbow.html
   private static final StructureCommandI COLOUR_BY_CHAIN = new StructureCommand(
           "rainbow chain");
 
@@ -154,6 +174,7 @@ public class ChimeraCommands extends StructureCommandsBase
    * @return
    * @see https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/setattr.html
    */
+  @Override
   protected String makeAttributeName(String featureType)
   {
     String attName = super.makeAttributeName(featureType);
@@ -162,7 +183,7 @@ public class ChimeraCommands extends StructureCommandsBase
      * Chimera treats an attribute name ending in 'color' as colour-valued;
      * Jalview doesn't, so prevent this by appending an underscore
      */
-    if (attName.toUpperCase().endsWith("COLOR"))
+    if (attName.toUpperCase(Locale.ROOT).endsWith("COLOR"))
     {
       attName += "_";
     }
@@ -198,8 +219,7 @@ public class ChimeraCommands extends StructureCommandsBase
   @Override
   public StructureCommandI focusView()
   {
-    // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/focus.html
-    return new StructureCommand("focus");
+    return FOCUS_VIEW;
   }
 
   @Override
@@ -239,7 +259,7 @@ public class ChimeraCommands extends StructureCommandsBase
 
   @Override
   public List<StructureCommandI> superposeStructures(AtomSpecModel ref,
-          AtomSpecModel spec)
+          AtomSpecModel spec, boolean isNucleotide)
   {
     /*
      * Form Chimera match command to match spec to ref
@@ -370,31 +390,59 @@ public class ChimeraCommands extends StructureCommandsBase
     return new StructureCommand("open " + file);
   }
 
-  /**
-   * Overrides the default method to concatenate colour commands into one
-   */
   @Override
-  public List<StructureCommandI> colourBySequence(
-          Map<Object, AtomSpecModel> colourMap)
+  public StructureCommandI openSession(String filepath)
   {
-    List<StructureCommandI> commands = new ArrayList<>();
-    StringBuilder sb = new StringBuilder(colourMap.size() * 20);
-    boolean first = true;
-    for (Object key : colourMap.keySet())
-    {
-      Color colour = (Color) key;
-      final AtomSpecModel colourData = colourMap.get(colour);
-      StructureCommandI command = getColourCommand(colourData, colour);
-      if (!first)
-      {
-        sb.append(getCommandSeparator());
-      }
-      first = false;
-      sb.append(command.getCommand());
-    }
+    // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/filetypes.html
+    // this version of the command has no dependency on file extension
+    return new StructureCommand("open chimera:" + filepath);
+  }
 
-    commands.add(new StructureCommand(sb.toString()));
-    return commands;
+  @Override
+  public StructureCommandI closeViewer()
+  {
+    return CLOSE_CHIMERA;
+  }
+
+  @Override
+  public List<StructureCommandI> startNotifications(String uri)
+  {
+    // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/listen.html
+    List<StructureCommandI> cmds = new ArrayList<>();
+    cmds.add(new StructureCommand("listen start models url " + uri));
+    cmds.add(new StructureCommand("listen start select prefix SelectionChanged url " + uri));
+    return cmds;
+  }
+
+  @Override
+  public List<StructureCommandI> stopNotifications()
+  {
+    List<StructureCommandI> cmds = new ArrayList<>();
+    cmds.add(STOP_NOTIFY_MODELS);
+    cmds.add(STOP_NOTIFY_SELECTION);
+    return cmds;
+  }
+
+  @Override
+  public StructureCommandI getSelectedResidues()
+  {
+    return GET_SELECTION;
+  }
+
+  @Override
+  public StructureCommandI listResidueAttributes()
+  {
+    return LIST_RESIDUE_ATTRIBUTES;
+  }
+
+  @Override
+  public StructureCommandI getResidueAttributes(String attName)
+  {
+    // this alternative command
+    // list residues spec ':*/attName' attr attName
+    // doesn't report 'None' values (which is good), but
+    // fails for 'average.bfactor' (which is bad):
+    return new StructureCommand("list residues attr '" + attName + "'");
   }
 
 }