*/
public class JmolCommands extends StructureCommandsBase
{
+ private static final String COMMA = ",";
+
private static final StructureCommand SHOW_BACKBONE = new StructureCommand(
"select *; cartoons off; backbone");
private static final String SLASH = "/";
/**
- * {@inheritDoc}
- *
- * @return
- */
- @Override
- public int getModelStartNo()
- {
- return 1;
- }
-
- /**
* Returns a string representation of the given colour suitable for inclusion
* in Jmol commands
*
return FOCUS_VIEW;
}
- @Override
- public List<StructureCommandI> showChains(List<String> toShow)
- {
- StringBuilder atomSpec = new StringBuilder(128);
- boolean first = true;
- for (String chain : toShow)
- {
- String[] tokens = chain.split(":");
- if (tokens.length == 2)
- {
- if (!first)
- {
- atomSpec.append(" or ");
- }
- first = false;
- atomSpec.append(":").append(tokens[1]).append(" /").append(tokens[0]);
- }
- }
-
- String spec = atomSpec.toString();
- String command = "select *;restrict " + spec + ";cartoon;center "
- + spec;
- return Arrays.asList(new StructureCommand(command));
- }
-
/**
* Returns a command to superpose atoms in {@code atomSpec} to those in
* {@code refAtoms}, restricted to alpha carbons only (Phosphorous for rna).
* Generates a Jmol atomspec string like
*
* <pre>
- * 2-5:A/1.1,8:A/1.1,5-10:B/2.1
+ * (61-64,70)&:A/1.1,(12-25,41-44)&:B/1.1,12:A/2.1
+ * for model 1, chain A, residues 61-64 and 70, chain B residues 12-25 and 41-44, model 2 chain A residue 12
* </pre>
*
+ * Note the brackets to group multiple residue ranges for the same chain
+ * (without bracketing, ranges would apply to all chains)
+ *
* Parameter {@code alphaOnly} is not used here - this restriction is made by
* a separate clause in the {@code compare} (superposition) command.
*/
{
StringBuilder sb = new StringBuilder(128);
- boolean first = true;
+ boolean firstChain = true;
for (String modelNo : model.getModels())
{
for (String chain : model.getChains(modelNo))
{
- for (int[] range : model.getRanges(modelNo, chain))
+ if (!firstChain)
{
- if (!first)
- {
- sb.append(PIPE);
- }
- first = false;
- if (range[0] == range[1])
+ sb.append(COMMA);
+ }
+ firstChain = false;
+ List<int[]> rangeList = model.getRanges(modelNo, chain);
+ if (rangeList.size() > 1)
+ {
+ sb.append("(");
+ }
+ boolean firstRange = true;
+ for (int[] range : rangeList)
+ {
+ if (!firstRange)
{
- sb.append(range[0]);
+ sb.append(COMMA);
}
- else
+ firstRange = false;
+ firstChain = false;
+ sb.append(range[0]);
+ if (range[0] != range[1])
{
- sb.append(range[0]).append(HYPHEN).append(range[1]);
+ sb.append(HYPHEN).append(range[1]);
}
- sb.append(COLON).append(chain.trim()).append(SLASH);
- sb.append(String.valueOf(modelNo)).append(".1");
}
+ if (rangeList.size() > 1)
+ {
+ sb.append(")&");
+ }
+ sb.append(COLON).append(chain.trim()).append(SLASH);
+ sb.append(String.valueOf(modelNo)).append(".1");
}
}
}
@Override
+ public StructureCommandI showStructures(AtomSpecModel restrictTo)
+ {
+ if (restrictTo == null)
+ {
+ return new StructureCommand("display *; cartoon only");
+ }
+ String atomSpec = getAtomSpec(restrictTo, false);
+ String cmd = "display " + atomSpec + "; select displayed; cartoon only";
+ return new StructureCommand(cmd);
+ }
+
+ @Override
+ public StructureCommandI hideChain(String modelId, String chainId)
+ {
+ return new StructureCommand("hide add :" + chainId + "/" + modelId);
+ }
+
+ @Override
+ public StructureCommandI hideAll()
+ {
+ return new StructureCommand("hide *");
+ }
+
public StructureCommandI closeViewer()
{
return null; // not an external viewer