X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Frbvi%2Fchimera%2FJalviewChimeraBinding.java;h=1731a05ff20f3edea5b63a1bb2f5285d24845d00;hb=e1a435a213f105bac3ea0258c6fe26f11df2a392;hp=b954677ffeb53d3500fe8e344c14e3fefdc98b18;hpb=954039bbfbde3648ac4c795277e788e49be5181b;p=jalview.git diff --git a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java index b954677..1731a05 100644 --- a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java +++ b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java @@ -20,6 +20,7 @@ */ package jalview.ext.rbvi.chimera; +import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.api.SequenceRenderer; import jalview.api.structures.JalviewStructureDisplayI; @@ -36,6 +37,7 @@ import jalview.io.DataSourceType; import jalview.schemes.ColourSchemeI; import jalview.schemes.ResidueProperties; import jalview.structure.AtomSpec; +import jalview.structure.StructureMapping; import jalview.structure.StructureMappingcommandSet; import jalview.structure.StructureSelectionManager; import jalview.structures.models.AAStructureBindingModel; @@ -51,6 +53,7 @@ import java.util.ArrayList; import java.util.BitSet; import java.util.Collections; import java.util.Hashtable; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -76,10 +79,10 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel private static final String ALPHACARBON = "CA"; - private List chainNames = new ArrayList(); + private List chainNames = new ArrayList<>(); + + private Hashtable chainFile = new Hashtable<>(); - private Hashtable chainFile = new Hashtable(); - /* * Object through which we talk to Chimera */ @@ -106,7 +109,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel /* * Map of ChimeraModel objects keyed by PDB full local file name */ - private Map> chimeraMaps = new LinkedHashMap>(); + private Map> chimeraMaps = new LinkedHashMap<>(); String lastHighlightCommand; @@ -133,7 +136,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel String file = pe.getFile(); try { - List modelsToMap = new ArrayList(); + List modelsToMap = new ArrayList<>(); List oldList = viewer.getModelList(); boolean alreadyOpen = false; @@ -192,7 +195,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel * @param protocol */ public JalviewChimeraBinding(StructureSelectionManager ssm, - PDBEntry[] pdbentry, SequenceI[][] sequenceIs, DataSourceType protocol) + PDBEntry[] pdbentry, SequenceI[][] sequenceIs, + DataSourceType protocol) { super(ssm, pdbentry, sequenceIs, protocol); viewer = new ChimeraManager(new StructureManager(true)); @@ -241,46 +245,9 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel viewer.startListening(chimeraListener.getUri()); } catch (BindException e) { - System.err.println("Failed to start Chimera listener: " - + e.getMessage()); - } - } - - /** - * Tells Chimera to display only the specified chains - * - * @param toshow - */ - public void showChains(List toshow) - { - /* - * Construct a chimera command like - * - * ~display #*;~ribbon #*;ribbon :.A,:.B - */ - StringBuilder cmd = new StringBuilder(64); - boolean first = true; - for (String chain : toshow) - { - int modelNumber = getModelNoForChain(chain); - String showChainCmd = modelNumber == -1 ? "" : modelNumber + ":." - + chain.split(":")[1]; - if (!first) - { - cmd.append(","); - } - cmd.append(showChainCmd); - first = false; + System.err.println( + "Failed to start Chimera listener: " + e.getMessage()); } - - /* - * 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(); - sendChimeraCommand(command, false); } /** @@ -515,11 +482,11 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel if (debug) { System.out.println("Select regions:\n" + selectioncom.toString()); - System.out.println("Superimpose command(s):\n" - + command.toString()); + System.out.println( + "Superimpose command(s):\n" + command.toString()); } - allComs.append("~display all; chain @CA|P; ribbon ") - .append(selectioncom.toString()) + allComs/*.append("~display all; chain @CA|P; ribbon ") + .append(selectioncom.toString())*/ .append(";" + command.toString()); } } @@ -536,13 +503,24 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel { System.out.println("Select regions:\n" + selectioncom.toString()); } - allComs.append("; ~display all; chain @CA|P; ribbon ") - .append(selectioncom.toString()).append("; focus"); + allComs.append("; ~display "); // all"); + if (!isShowAlignmentOnly()) + { + allComs.append("; ribbon; chain @CA|P"); + } + else + { + allComs.append("; ~ribbon"); + } + allComs.append("; ribbon ").append(selectioncom.toString()) + .append("; focus"); List chimeraReplies = sendChimeraCommand(allComs.toString(), true); for (String reply : chimeraReplies) { - if (reply.toLowerCase().contains("unequal numbers of atoms")) + String lowerCase = reply.toLowerCase(); + if (lowerCase.contains("unequal numbers of atoms") + || lowerCase.contains("at least")) { error = reply; } @@ -596,8 +574,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel return true; } - boolean launched = viewer.launchChimera(StructureManager - .getChimeraPaths()); + boolean launched = viewer + .launchChimera(StructureManager.getChimeraPaths()); if (launched) { startChimeraProcessMonitor(); @@ -741,7 +719,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel */ private int _modelFileNameMap[]; - // //////////////////////////////// // /StructureListener @Override @@ -752,8 +729,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel return new String[0]; } - return chimeraMaps.keySet().toArray( - modelFileNames = new String[chimeraMaps.size()]); + return chimeraMaps.keySet() + .toArray(modelFileNames = new String[chimeraMaps.size()]); } /** @@ -837,7 +814,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel * Parse model number, residue and chain for each selected position, * formatted as #0:123.A or #1.2:87.B (#model.submodel:residue.chain) */ - List atomSpecs = convertStructureResiduesToAlignment(selection); + List atomSpecs = convertStructureResiduesToAlignment( + selection); /* * Broadcast the selection (which may be empty, if the user just cleared all @@ -856,7 +834,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel protected List convertStructureResiduesToAlignment( List structureSelection) { - List atomSpecs = new ArrayList(); + List atomSpecs = new ArrayList<>(); for (String atomSpec : structureSelection) { try @@ -932,12 +910,13 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel false); for (String resName : residueSet) { - char res = resName.length() == 3 ? ResidueProperties - .getSingleCharacterCode(resName) : resName.charAt(0); + char res = resName.length() == 3 + ? ResidueProperties.getSingleCharacterCode(resName) + : resName.charAt(0); Color col = cs.findColour(res, 0, null, null, 0f); command.append("color " + col.getRed() / normalise + "," - + col.getGreen() / normalise + "," + col.getBlue() - / normalise + " ::" + resName + ";"); + + col.getGreen() / normalise + "," + col.getBlue() / normalise + + " ::" + resName + ";"); } sendAsynchronousCommand(command.toString(), COLOURING_CHIMERA); @@ -983,7 +962,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel /** * Send the Chimera 'background solid " command. * - * @see https + * @see https * ://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/background * .html * @param col @@ -994,8 +973,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel viewerCommandHistory(false); double normalise = 255D; final String command = "background solid " + col.getRed() / normalise - + "," + col.getGreen() / normalise + "," + col.getBlue() - / normalise + ";"; + + "," + col.getGreen() / normalise + "," + + col.getBlue() / normalise + ";"; viewer.sendChimeraCommand(command, false); viewerCommandHistory(true); } @@ -1148,9 +1127,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel sendAsynchronousCommand("open cmd:" + path, null); } catch (IOException e) { - System.err - .println("Sending commands to Chimera via file failed with " - + e.getMessage()); + System.err.println("Sending commands to Chimera via file failed with " + + e.getMessage()); } } @@ -1288,7 +1266,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel return CHIMERA_FEATURE_GROUP; } - public Hashtable getChainFile() { return chainFile; @@ -1308,4 +1285,113 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel } return -1; } + + @Override + public void showStructures(AlignViewportI av, boolean refocus) + { + StringBuilder cmd = new StringBuilder(128); + cmd.append("~display; ~ribbon;"); + String atomSpec = getMappedResidues(av); + cmd.append("ribbon ").append(atomSpec); + if (!isShowAlignmentOnly()) + { + cmd.append("chain @CA|P; ribbon"); + } + if (refocus) + { + cmd.append("; focus"); + } + sendChimeraCommand(cmd.toString(), false); + } + + /** + * Builds a Chimera atomSpec of residues mapped from sequences, of the format + * (#model:residues.chain) + * + *
+   * #0:2-94.A | #1:1-93.C | #2:1-93.A
+   * 
+ * + * Only residues visible in the alignment are included, that is, hidden columns + * and sequences are excluded. + * + * @param av + * @return + */ + private String getMappedResidues(AlignViewportI av) + { + AlignmentI alignment = av.getAlignment(); + final int width = alignment.getWidth(); + + String[] files = getStructureFiles(); + + StringBuilder atomSpec = new StringBuilder(256); + + for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++) + { + StructureMapping[] mappings = getSsm().getMapping(files[pdbfnum]); + + /* + * Find the first mapped sequence (if any) for this PDB entry which is in + * the alignment + */ + final int seqCountForPdbFile = getSequence()[pdbfnum].length; + for (int s = 0; s < seqCountForPdbFile; s++) + { + for (StructureMapping mapping : mappings) + { + final SequenceI theSequence = getSequence()[pdbfnum][s]; + if (mapping.getSequence() == theSequence + && alignment.findIndex(theSequence) > -1) + { + String chainCd = mapping.getChain(); + if (!isShowChain(mapping.getPdbId(), chainCd)) + { + continue; + } + Iterator visible; + if (isShowAlignmentOnly()) + { + visible = alignment.getHiddenColumns() + .getVisContigsIterator(0, width, true); + } + else + { + visible = Collections.singletonList(new int[] { 0, width }) + .iterator(); + } + while (visible.hasNext()) + { + int[] visibleRegion = visible.next(); + int seqStartPos = theSequence.findPosition(visibleRegion[0]); + int seqEndPos = theSequence.findPosition(visibleRegion[1]); + List residueRanges = mapping + .getPDBResNumRanges(seqStartPos, seqEndPos); + if (!residueRanges.isEmpty()) + { + if (atomSpec.length() > 0) + { + atomSpec.append("| "); + } + atomSpec.append(getModelSpec(pdbfnum)).append(":"); + boolean first = true; + for (int[] range : residueRanges) + { + if (!first) + { + atomSpec.append(","); + } + first = false; + atomSpec.append(range[0]).append("-").append(range[1]); + atomSpec.append(".").append(chainCd); + } + } + } + } + } + } + } + + return atomSpec.toString(); + } }