X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Frbvi%2Fchimera%2FJalviewChimeraBinding.java;h=b05c168c50f1649db40a440e68116dabdd09c8c5;hb=734d0e761fda32cebaae59c370c5d64e1e8c99e8;hp=4c7334f66ff06400865905b284f286adc9e0156f;hpb=c3b8fbc19c04c2daec702a2bffdfab5d10555143;p=jalview.git diff --git a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java index 4c7334f..b05c168 100644 --- a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java +++ b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java @@ -23,12 +23,14 @@ package jalview.ext.rbvi.chimera; import jalview.api.AlignmentViewPanel; import jalview.api.FeatureRenderer; import jalview.api.SequenceRenderer; +import jalview.api.structures.JalviewStructureDisplayI; import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.datamodel.ColumnSelection; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; import jalview.httpserver.AbstractRequestHandler; +import jalview.io.DataSourceType; import jalview.schemes.ColourSchemeI; import jalview.schemes.ResidueProperties; import jalview.structure.AtomSpec; @@ -67,6 +69,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel private List chainNames = new ArrayList(); private Hashtable chainFile = new Hashtable(); + /* * Object through which we talk to Chimera */ @@ -90,8 +93,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel */ private boolean loadingFinished = true; - public String fileLoadingError; - /* * Map of ChimeraModel objects keyed by PDB full local file name */ @@ -114,6 +115,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel */ private long loadNotifiesHandled = 0; + private Thread chimeraMonitor; + /** * Open a PDB structure file in Chimera and set up mappings from Jalview. * @@ -191,15 +194,44 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel * @param ssm * @param pdbentry * @param sequenceIs - * @param chains * @param protocol */ public JalviewChimeraBinding(StructureSelectionManager ssm, - PDBEntry[] pdbentry, SequenceI[][] sequenceIs, String protocol) + PDBEntry[] pdbentry, SequenceI[][] sequenceIs, DataSourceType protocol) { super(ssm, pdbentry, sequenceIs, protocol); - viewer = new ChimeraManager( - new ext.edu.ucsf.rbvi.strucviz2.StructureManager(true)); + viewer = new ChimeraManager(new StructureManager(true)); + } + + /** + * Starts a thread that waits for the Chimera process to finish, so that we + * can then close the associated resources. This avoids leaving orphaned + * Chimera viewer panels in Jalview if the user closes Chimera. + */ + protected void startChimeraProcessMonitor() + { + final Process p = viewer.getChimeraProcess(); + chimeraMonitor = new Thread(new Runnable() + { + + @Override + public void run() + { + try + { + p.waitFor(); + JalviewStructureDisplayI display = getViewer(); + if (display != null) + { + display.closeViewer(false); + } + } catch (InterruptedException e) + { + // exit thread if Chimera Viewer is closed in Jalview + } + } + }); + chimeraMonitor.start(); } /** @@ -220,18 +252,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel } /** - * Construct a title string for the viewer window based on the data Jalview - * knows about - * - * @param verbose - * @return - */ - public String getViewerTitle(boolean verbose) - { - return getViewerTitle("Chimera", verbose); - } - - /** * Tells Chimera to display only the specified chains * * @param toshow @@ -247,11 +267,14 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel 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(":.").append(chain); + cmd.append(showChainCmd); first = false; } @@ -260,7 +283,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel * window, but it looks more helpful not to (easier to relate chains to the * whole) */ - final String command = "~display #*; ~ribbon #*; ribbon " + final String command = "~display #*; ~ribbon #*; ribbon :" + cmd.toString(); sendChimeraCommand(command, false); } @@ -284,9 +307,14 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel lastCommand = null; viewer = null; + if (chimeraMonitor != null) + { + chimeraMonitor.interrupt(); + } releaseUIResources(); } + @Override public void colourByChain() { colourBySequence = false; @@ -302,6 +330,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel *
  • all others - white
  • * */ + @Override public void colourByCharge() { colourBySequence = false; @@ -323,6 +352,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel * @param _hiddenCols * an array of corresponding hidden columns for each alignment */ + @Override public void superposeStructures(AlignmentI[] _alignment, int[] _refStructure, ColumnSelection[] _hiddenCols) { @@ -564,23 +594,29 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel /** * Launch Chimera, unless an instance linked to this object is already - * running. Returns true if chimera is successfully launched, or already + * running. Returns true if Chimera is successfully launched, or already * running, else false. * * @return */ public boolean launchChimera() { - if (!viewer.isChimeraLaunched()) - { - return viewer.launchChimera(StructureManager.getChimeraPaths()); - } if (viewer.isChimeraLaunched()) { return true; } - log("Failed to launch Chimera!"); - return false; + + boolean launched = viewer.launchChimera(StructureManager + .getChimeraPaths()); + if (launched) + { + startChimeraProcessMonitor(); + } + else + { + log("Failed to launch Chimera!"); + } + return launched; } /** @@ -633,34 +669,15 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel String progressMsg); /** - * colour any structures associated with sequences in the given alignment - * using the getFeatureRenderer() and getSequenceRenderer() renderers but only - * if colourBySequence is enabled. + * Sends a set of colour commands to the structure viewer + * + * @param colourBySequenceCommands */ - public void colourBySequence(boolean showFeatures, - jalview.api.AlignmentViewPanel alignmentv) + @Override + protected void colourBySequence( + StructureMappingcommandSet[] colourBySequenceCommands) { - if (!colourBySequence || !loadingFinished) - { - return; - } - if (getSsm() == null) - { - return; - } - String[] files = getPdbFile(); - - SequenceRenderer sr = getSequenceRenderer(alignmentv); - - FeatureRenderer fr = null; - if (showFeatures) - { - fr = getFeatureRenderer(alignmentv); - } - AlignmentI alignment = alignmentv.getAlignment(); - - for (jalview.structure.StructureMappingcommandSet cpdbbyseq : getColourBySequenceCommands( - files, sr, fr, alignment)) + for (StructureMappingcommandSet cpdbbyseq : colourBySequenceCommands) { for (String command : cpdbbyseq.commands) { @@ -676,6 +693,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel * @param alignment * @return */ + @Override protected StructureMappingcommandSet[] getColourBySequenceCommands( String[] files, SequenceRenderer sr, FeatureRenderer fr, AlignmentI alignment) @@ -711,40 +729,12 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel // ////////////////////////// /** - * returns the current featureRenderer that should be used to colour the - * structures - * - * @param alignment - * - * @return - */ - public abstract FeatureRenderer getFeatureRenderer( - AlignmentViewPanel alignment); - - /** * instruct the Jalview binding to update the pdbentries vector if necessary * prior to matching the viewer's contents to the list of structure files * Jalview knows about. */ public abstract void refreshPdbEntries(); - private int getModelNum(String modelFileName) - { - String[] mfn = getPdbFile(); - if (mfn == null) - { - return -1; - } - for (int i = 0; i < mfn.length; i++) - { - if (mfn[i].equalsIgnoreCase(modelFileName)) - { - return i; - } - } - return -1; - } - /** * map between index of model filename returned from getPdbFile and the first * index of models from this file in the viewer. Note - this is not trimmed - @@ -767,17 +757,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel } /** - * returns the current sequenceRenderer that should be used to colour the - * structures - * - * @param alignment - * - * @return - */ - public abstract SequenceRenderer getSequenceRenderer( - AlignmentViewPanel alignment); - - /** * Construct and send a command to highlight zero, one or more atoms. We do * this by sending an "rlabel" command to show the residue label at that * position. @@ -929,6 +908,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel return loadNotifiesHandled; } + @Override public void setJalviewColourScheme(ColourSchemeI cs) { colourBySequence = false; @@ -945,12 +925,14 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel List residueSet = ResidueProperties.getResidues(isNucleotide(), false); - for (String res : residueSet) + for (String resName : residueSet) { - Color col = cs.findColour(res.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 + " ::" + res + ";"); + / normalise + " ::" + resName + ";"); } sendAsynchronousCommand(command.toString(), COLOURING_CHIMERA); @@ -1001,6 +983,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel * .html * @param col */ + @Override public void setBackgroundColour(Color col) { viewerCommandHistory(false); @@ -1053,13 +1036,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel } /** - * Returns a list of chains mapped in this viewer. Note this list is not - * currently scoped per structure. - * - * @return - */ - - /** * Send a 'focus' command to Chimera to recentre the visible display */ public void focusView() @@ -1107,4 +1083,18 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel return chainFile; } + public List getChimeraModelByChain(String chain) + { + return chimeraMaps.get(chainFile.get(chain)); + } + + public int getModelNoForChain(String chain) + { + List foundModels = getChimeraModelByChain(chain); + if (foundModels != null && !foundModels.isEmpty()) + { + return foundModels.get(0).getModelNumber(); + } + return -1; + } }