X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fjmol%2FJmolCommands.java;h=e3625fa4fe6ae351bceab9a9edee1331f8c09b4b;hb=6bf5604d306cbcd55289639967411ddbafcac682;hp=3e7ca591c1b79ae0668cab24825a5561206b4357;hpb=d1707d4c26db76cfeb640f0dbeb3e3427fd40eb7;p=jalview.git diff --git a/src/jalview/ext/jmol/JmolCommands.java b/src/jalview/ext/jmol/JmolCommands.java index 3e7ca59..e3625fa 100644 --- a/src/jalview/ext/jmol/JmolCommands.java +++ b/src/jalview/ext/jmol/JmolCommands.java @@ -27,14 +27,17 @@ import jalview.api.SequenceRenderer; import jalview.datamodel.AlignmentI; import jalview.datamodel.HiddenColumns; import jalview.datamodel.SequenceI; +import jalview.ext.rbvi.chimera.AtomSpecModel; import jalview.renderer.seqfeatures.FeatureColourFinder; import jalview.structure.StructureMapping; import jalview.structure.StructureMappingcommandSet; import jalview.structure.StructureSelectionManager; +import jalview.structures.models.AAStructureBindingModel; import java.awt.Color; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * Routines for generating Jmol commands for Jalview/Jmol binding another @@ -46,6 +49,8 @@ import java.util.List; public class JmolCommands { + private static final String COMMA = ","; + /** * Jmol utility which constructs the commands to colour chains by the given * alignment @@ -55,6 +60,15 @@ public class JmolCommands */ public static StructureMappingcommandSet[] getColourBySequenceCommand( StructureSelectionManager ssm, String[] files, + AAStructureBindingModel binding, AlignmentViewPanel viewPanel) + { + SequenceRenderer sr = binding.getSequenceRenderer(viewPanel); + SequenceI[][] sequence = binding.getSequence(); + return getColourBySequenceCommand(ssm, files, sequence, sr, viewPanel); + } + + public static StructureMappingcommandSet[] getColourBySequenceCommand( + StructureSelectionManager ssm, String[] files, SequenceI[][] sequence, SequenceRenderer sr, AlignmentViewPanel viewPanel) { @@ -63,21 +77,20 @@ public class JmolCommands AlignViewportI viewport = viewPanel.getAlignViewport(); HiddenColumns cs = viewport.getAlignment().getHiddenColumns(); AlignmentI al = viewport.getAlignment(); - List cset = new ArrayList(); + List cset = new ArrayList<>(); for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++) { StructureMapping[] mapping = ssm.getMapping(files[pdbfnum]); StringBuffer command = new StringBuffer(); StructureMappingcommandSet smc; - ArrayList str = new ArrayList(); + ArrayList str = new ArrayList<>(); if (mapping == null || mapping.length < 1) { continue; } - int lastPos = -1; for (int s = 0; s < sequence[pdbfnum].length; s++) { for (int sp, m = 0; m < mapping.length; m++) @@ -85,6 +98,7 @@ public class JmolCommands if (mapping[m].getSequence() == sequence[pdbfnum][s] && (sp = al.findIndex(sequence[pdbfnum][s])) > -1) { + int lastPos = StructureMapping.UNASSIGNED_VALUE; SequenceI asp = al.getSequenceAt(sp); for (int r = 0; r < asp.getLength(); r++) { @@ -95,10 +109,22 @@ public class JmolCommands } int pos = mapping[m].getPDBResNum(asp.findPosition(r)); - if (pos < 1 || pos == lastPos) + if (pos == lastPos) { continue; } + if (pos == StructureMapping.UNASSIGNED_VALUE) + { + // terminate current colour op + if (command.length() > 0 + && command.charAt(command.length() - 1) != ';') + { + command.append(";"); + } + // reset lastPos + lastPos = StructureMapping.UNASSIGNED_VALUE; + continue; + } lastPos = pos; @@ -113,21 +139,14 @@ public class JmolCommands col = Color.GRAY; } - String newSelcom = (mapping[m].getChain() != " " ? ":" - + mapping[m].getChain() : "") - + "/" - + (pdbfnum + 1) - + ".1" - + ";color[" - + col.getRed() - + "," - + col.getGreen() - + "," + String newSelcom = (mapping[m].getChain() != " " + ? ":" + mapping[m].getChain() + : "") + "/" + (pdbfnum + 1) + ".1" + ";color[" + + col.getRed() + COMMA + col.getGreen() + COMMA + col.getBlue() + "]"; - if (command.length() > newSelcom.length() - && command.substring( - command.length() - newSelcom.length()) - .equals(newSelcom)) + if (command.length() > newSelcom.length() && command + .substring(command.length() - newSelcom.length()) + .equals(newSelcom)) { command = JmolCommands.condenseCommand(command, pos); continue; @@ -135,7 +154,12 @@ public class JmolCommands // TODO: deal with case when buffer is too large for Jmol to parse // - execute command and flush - command.append(";"); + if (command.length() > 0 + && command.charAt(command.length() - 1) != ';') + { + command.append(";"); + } + if (command.length() > 51200) { // add another chunk @@ -197,4 +221,77 @@ public class JmolCommands return sb; } + /** + * Answers a Jmol 'color' command to colour residues as described by the given + * map of {@code } + * + * @param map + * @return + */ + public static String[] getColourBySequenceCommand( + Map map) + { + String[] cmds = new String[map.keySet().size()]; + + int i = 0; + for (Object o : map.keySet()) + { + StringBuilder cmd = new StringBuilder(128); + Color c = (Color) o; + String atomSpec = getAtomSpec(map.get(o)); + cmd.append("select ").append(atomSpec).append(";color[") + .append(c.getRed()).append(COMMA).append(c.getGreen()) + .append(COMMA).append(c.getBlue()).append("];"); + cmds[i] = cmd.toString(); + i++; + } + + return cmds; + } + + /** + * Builds a Jmol syntax selection expression from the given model, for example + * + *
+   * 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
+   * 
+ * + * @param atomSpecModel + * @return + */ + public static String getAtomSpec(AtomSpecModel atomSpecModel) + { + StringBuilder sb = new StringBuilder(64); + for (int model : atomSpecModel.getModels()) + { + for (String chain : atomSpecModel.getChains(model)) + { + if (sb.length() > 0) + { + sb.append(COMMA); + } + boolean firstRange = true; + for (int[] range : atomSpecModel.getRanges(model, chain)) + { + if (!firstRange) + { + sb.append(COMMA); + } + firstRange = false; + sb.append(range[0]); + if (range[1] != range[0]) + { + sb.append("-").append(range[1]); + } + } + sb.append(":").append(chain).append("/") + .append(String.valueOf(model + 1)) + .append(".1"); + } + } + + return sb.toString(); + } + }