import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import jalview.structure.AtomSpecModel;
*/
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");
* @return
*/
protected StructureCommandI setAttribute(String attributeName,
- String attributeValue,
- AtomSpecModel atomSpecModel)
+ String attributeValue, AtomSpecModel atomSpecModel)
{
StringBuilder sb = new StringBuilder(128);
sb.append("setattr res ").append(attributeName).append(" '")
.append(attributeValue).append("' ");
- sb.append(getAtomSpec(atomSpecModel, false));
+ sb.append(getAtomSpec(atomSpecModel, AtomSpecType.RESIDUE_ONLY));
return new StructureCommand(sb.toString());
}
* 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 += "_";
}
@Override
public StructureCommandI focusView()
{
- // https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/focus.html
- return new StructureCommand("focus");
+ return FOCUS_VIEW;
}
@Override
@Override
public List<StructureCommandI> superposeStructures(AtomSpecModel ref,
- AtomSpecModel spec)
+ AtomSpecModel spec, AtomSpecType backbone)
{
/*
* Form Chimera match command to match spec to ref
* @see https://www.cgl.ucsf.edu/chimera/docs/UsersGuide/midas/match.html
*/
StringBuilder cmd = new StringBuilder();
- String atomSpecAlphaOnly = getAtomSpec(spec, true);
- String refSpecAlphaOnly = getAtomSpec(ref, true);
- cmd.append("match ").append(atomSpecAlphaOnly).append(" ").append(refSpecAlphaOnly);
+ String atomSpecAlphaOnly = getAtomSpec(spec, backbone);
+ String refSpecAlphaOnly = getAtomSpec(ref, backbone);
+ cmd.append("match ").append(atomSpecAlphaOnly).append(" ")
+ .append(refSpecAlphaOnly);
/*
* show superposed residues as ribbon
*/
- String atomSpec = getAtomSpec(spec, false);
- String refSpec = getAtomSpec(ref, false);
+ String atomSpec = getAtomSpec(spec, AtomSpecType.RESIDUE_ONLY);
+ String refSpec = getAtomSpec(ref, AtomSpecType.RESIDUE_ONLY);
cmd.append("; ribbon ");
cmd.append(atomSpec).append("|").append(refSpec).append("; focus");
* <pre>
*
* @param model
- * @param alphaOnly
+ * @param specType
* @return
* @see https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/frameatom_spec.html
*/
@Override
- public String getAtomSpec(AtomSpecModel atomSpec, boolean alphaOnly)
+ public String getAtomSpec(AtomSpecModel atomSpec, AtomSpecType specType)
{
StringBuilder sb = new StringBuilder(128);
boolean firstModel = true;
sb.append("|");
}
firstModel = false;
- appendModel(sb, model, atomSpec, alphaOnly);
+ appendModel(sb, model, atomSpec, specType);
}
return sb.toString();
}
* @param alphaOnly
*/
protected void appendModel(StringBuilder sb, String model,
- AtomSpecModel atomSpec, boolean alphaOnly)
+ AtomSpecModel atomSpec, AtomSpecType specType)
{
sb.append("#").append(model).append(":");
firstPositionForModel = false;
}
}
- if (alphaOnly)
+ if (specType == AtomSpecType.ALPHA)
{
/*
* restrict to alpha carbon, no alternative locations
* (needed to ensuring matching atom counts for superposition)
*/
- // TODO @P instead if RNA - add nucleotide flag to AtomSpecModel?
sb.append("@CA").append(NO_ALTLOCS);
}
+ if (specType == AtomSpecType.PHOSPHATE)
+ {
+ sb.append("@P").append(NO_ALTLOCS);
+ }
}
@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())
- {
- 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 StructureCommandI openSession(String filepath)
+ public List<StructureCommandI> startNotifications(String uri)
{
- // 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);
+ // 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 + "'");
+ }
+
+ @Override
+ public List<StructureCommandI> centerViewOn(List<AtomSpecModel> residues)
+ {
+ // TODO Auto-generated method stub
+ return null;
}
}