* Routines for generating Chimera commands for Jalview/Chimera binding
*
* @author JimP
+ * @see https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/framecommand.html
*
*/
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");
* </pre>
*
* @param featureMap
+ * @param binding
* @return
*/
@Override
@Override
public StructureCommandI focusView()
{
- // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/focus.html
- return new StructureCommand("focus");
- }
-
- @Override
- public List<StructureCommandI> showChains(List<String> toShow)
- {
- /*
- * Construct a chimera command like
- *
- * ~display #*;~ribbon #*;ribbon :.A,:.B
- */
- StringBuilder cmd = new StringBuilder(64);
- boolean first = true;
- for (String chain : toShow)
- {
- String[] tokens = chain.split(":");
- if (tokens.length == 2)
- {
- String showChainCmd = tokens[0] + ":." + tokens[1];
- if (!first)
- {
- cmd.append(",");
- }
- cmd.append(showChainCmd);
- first = false;
- }
- }
-
- /*
- * could append ";focus" to this command to resize the display to fill the
- * window, but it looks more helpful not to (easier to relate chains to the
- * whole)
- */
- final String command = "~display #*; ~ribbon #*; ribbon :"
- + cmd.toString();
- return Arrays.asList(new StructureCommand(command));
+ return FOCUS_VIEW;
}
@Override
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())
+ // 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);
+ }
+
+ @Override
+ public StructureCommandI showStructures(AtomSpecModel restrictTo)
+ {
+ if (restrictTo == null)
{
- 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());
+ return new StructureCommand("ribbon");
}
- commands.add(new StructureCommand(sb.toString()));
- return commands;
+ String atomSpec = getAtomSpec(restrictTo, false);
+ String cmd = "ribbon " + atomSpec;
+ return new StructureCommand(cmd);
}
@Override
- public StructureCommandI openSession(String filepath)
+ public StructureCommandI hideChain(String modelId, String chainId)
{
- // 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);
+ String what = "#" + modelId + ":." + chainId;
+ return new StructureCommand("~ribbon " + what + ";~display " + what);
}
@Override
+ public StructureCommandI hideAll()
+ {
+ return new StructureCommand("~display; ~ribbon");
+ }
public StructureCommandI closeViewer()
{
- // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/stop.html
- return new StructureCommand("stop really");
+ 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 + "'");
}
}