Merge branch 'develop' into feature/r2_11_2/JAL-3808_gff2_exonerate
[jalview.git] / src / jalview / ext / rbvi / chimera / ChimeraXCommands.java
index 314e6db..780d292 100644 (file)
@@ -28,7 +28,7 @@ import java.util.List;
 import jalview.structure.AtomSpecModel;
 import jalview.structure.StructureCommand;
 import jalview.structure.StructureCommandI;
-import jalview.util.ColorUtils;
+import jalview.structure.StructureCommandsI.AtomSpecType;
 
 /**
  * Routines for generating ChimeraX commands for Jalview/ChimeraX binding
@@ -36,15 +36,19 @@ import jalview.util.ColorUtils;
 public class ChimeraXCommands extends ChimeraCommands
 {
   // https://www.cgl.ucsf.edu/chimerax/docs/user/commands/info.html#resattr
-  private static final StructureCommand LIST_RESIDUE_ATTRIBUTES = new StructureCommand("info resattr");
+  private static final StructureCommand LIST_RESIDUE_ATTRIBUTES = new StructureCommand(
+          "info resattr");
 
   // https://www.cgl.ucsf.edu/chimerax/docs/user/commands/exit.html
-  private static final StructureCommand CLOSE_CHIMERAX = new StructureCommand("exit");
+  private static final StructureCommand CLOSE_CHIMERAX = new StructureCommand(
+          "exit");
 
   // https://www.cgl.ucsf.edu/chimerax/docs/user/commands/info.html#notify
-  private static final StructureCommand STOP_NOTIFY_SELECTION = new StructureCommand("info notify stop selection jalview");
+  private static final StructureCommand STOP_NOTIFY_SELECTION = new StructureCommand(
+          "info notify stop selection jalview");
 
-  private static final StructureCommand STOP_NOTIFY_MODELS = new StructureCommand("info notify stop models jalview");
+  private static final StructureCommand STOP_NOTIFY_MODELS = new StructureCommand(
+          "info notify stop models jalview");
 
   // https://www.cgl.ucsf.edu/chimerax/docs/user/commands/info.html#selection
   private static final StructureCommand GET_SELECTION = new StructureCommand(
@@ -99,8 +103,8 @@ public class ChimeraXCommands extends ChimeraCommands
   }
 
   /**
-   * Returns a viewer command to set the given residue attribute value on
-   * residues specified by the AtomSpecModel, for example
+   * Returns a viewer command to set the given residue attribute value on residues
+   * specified by the AtomSpecModel, for example
    * 
    * <pre>
    * setattr #0/A:3-9,14-20,39-43 res jv_strand 'strand' create true
@@ -116,7 +120,7 @@ public class ChimeraXCommands extends ChimeraCommands
           String attributeValue, AtomSpecModel atomSpecModel)
   {
     StringBuilder sb = new StringBuilder(128);
-    sb.append("setattr ").append(getAtomSpec(atomSpecModel, false));
+    sb.append("setattr ").append(getAtomSpec(atomSpecModel, AtomSpecType.RESIDUE_ONLY));
     sb.append(" res ").append(attributeName).append(" '")
             .append(attributeValue).append("'");
     sb.append(" create true");
@@ -142,11 +146,15 @@ public class ChimeraXCommands extends ChimeraCommands
    * Returns the range(s) formatted as a ChimeraX atomspec, for example
    * <p>
    * #1/A:2-20,30-40/B:10-20|#2/A:12-30
+   * <p>
+   * Note there is no need to explicitly exclude ALTLOC atoms when
+   * {@code alphaOnly == true}, as this is the default behaviour of ChimeraX (a
+   * change from Chimera)
    * 
    * @return
    */
   @Override
-  public String getAtomSpec(AtomSpecModel atomSpec, boolean alphaOnly)
+  public String getAtomSpec(AtomSpecModel atomSpec, AtomSpecType specType)
   {
     StringBuilder sb = new StringBuilder(128);
     boolean firstModel = true;
@@ -158,12 +166,14 @@ public class ChimeraXCommands extends ChimeraCommands
       }
       firstModel = false;
       appendModel(sb, model, atomSpec);
-      if (alphaOnly)
+      if (specType == AtomSpecType.ALPHA)
       {
-        // TODO @P if RNA - add nucleotide flag to AtomSpecModel?
         sb.append("@CA");
       }
-      // todo: is there ChimeraX syntax to exclude altlocs?
+      if (specType == AtomSpecType.PHOSPHATE)
+      {
+        sb.append("@P");
+      }
     }
     return sb.toString();
   }
@@ -207,7 +217,7 @@ public class ChimeraXCommands extends ChimeraCommands
 
   @Override
   public List<StructureCommandI> superposeStructures(AtomSpecModel ref,
-          AtomSpecModel spec)
+          AtomSpecModel spec, AtomSpecType backbone)
   {
     /*
      * Form ChimeraX match command to match spec to ref
@@ -217,8 +227,8 @@ public class ChimeraXCommands extends ChimeraCommands
      * @see https://www.cgl.ucsf.edu/chimerax/docs/user/commands/align.html
      */
     StringBuilder cmd = new StringBuilder();
-    String atomSpec = getAtomSpec(spec, true);
-    String refSpec = getAtomSpec(ref, true);
+    String atomSpec = getAtomSpec(spec, backbone);
+    String refSpec = getAtomSpec(ref, backbone);
     cmd.append("align ").append(atomSpec).append(" toAtoms ")
             .append(refSpec);
 
@@ -226,8 +236,8 @@ public class ChimeraXCommands extends ChimeraCommands
      * show superposed residues as ribbon, others as chain
      */
     cmd.append("; ribbon ");
-    cmd.append(getAtomSpec(spec, false)).append("|");
-    cmd.append(getAtomSpec(ref, false)).append("; view");
+    cmd.append(getAtomSpec(spec, AtomSpecType.RESIDUE_ONLY)).append("|");
+    cmd.append(getAtomSpec(ref, AtomSpecType.RESIDUE_ONLY)).append("; view");
 
     return Arrays.asList(new StructureCommand(cmd.toString()));
   }
@@ -250,8 +260,12 @@ public class ChimeraXCommands extends ChimeraCommands
   public List<StructureCommandI> startNotifications(String uri)
   {
     List<StructureCommandI> cmds = new ArrayList<>();
-    cmds.add(new StructureCommand("info notify start models prefix ModelChanged jalview url " + uri));
-    cmds.add(new StructureCommand("info notify start selection jalview prefix SelectionChanged url " + uri));
+    cmds.add(new StructureCommand(
+            "info notify start models jalview prefix ModelChanged url "
+                    + uri));
+    cmds.add(new StructureCommand(
+            "info notify start selection jalview prefix SelectionChanged url "
+                    + uri));
     return cmds;
   }