X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fjmol%2FJalviewJmolBinding.java;h=6b0a696cbf7f78ed0e46bf775e328c9c19e7b689;hb=9c1a9d682a2664d525bfd0f38bae861292dc3921;hp=3f0847b21f2507e695620764add6e41683dc91b8;hpb=86e1bfc3ed99bee91069b3238eb291c3955338d3;p=jalview.git diff --git a/src/jalview/ext/jmol/JalviewJmolBinding.java b/src/jalview/ext/jmol/JalviewJmolBinding.java index 3f0847b..6b0a696 100644 --- a/src/jalview/ext/jmol/JalviewJmolBinding.java +++ b/src/jalview/ext/jmol/JalviewJmolBinding.java @@ -20,51 +20,46 @@ */ package jalview.ext.jmol; -import jalview.api.AlignmentViewPanel; import jalview.api.FeatureRenderer; -import jalview.api.SequenceRenderer; import jalview.datamodel.AlignmentI; -import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenColumns; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; -import jalview.io.AppletFormatAdapter; +import jalview.gui.IProgressIndicator; +import jalview.gui.StructureViewer.ViewerType; +import jalview.io.DataSourceType; import jalview.io.StructureFile; -import jalview.schemes.ColourSchemeI; -import jalview.schemes.ResidueProperties; import jalview.structure.AtomSpec; -import jalview.structure.StructureMappingcommandSet; +import jalview.structure.StructureCommandsI.SuperposeData; import jalview.structure.StructureSelectionManager; import jalview.structures.models.AAStructureBindingModel; +import jalview.util.MessageManager; -import java.awt.Color; import java.awt.Container; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.io.File; import java.net.URL; -import java.security.AccessControlException; -import java.util.Hashtable; +import java.util.ArrayList; +import java.util.BitSet; import java.util.List; import java.util.Map; +import java.util.StringTokenizer; import java.util.Vector; -import javajs.awt.Dimension; - import org.jmol.adapter.smarter.SmarterJmolAdapter; import org.jmol.api.JmolAppConsoleInterface; import org.jmol.api.JmolSelectionListener; import org.jmol.api.JmolStatusListener; import org.jmol.api.JmolViewer; import org.jmol.c.CBK; -import org.jmol.script.T; -import org.jmol.viewer.JC; import org.jmol.viewer.Viewer; public abstract class JalviewJmolBinding extends AAStructureBindingModel implements JmolStatusListener, JmolSelectionListener, ComponentListener { - boolean allChainsSelected = false; + private String lastMessage; /* * when true, try to search the associated datamodel for sequences that are @@ -72,42 +67,22 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel */ private boolean associateNewStructs = false; - Vector atomsPicked = new Vector(); - - public Vector chainNames; - - Hashtable chainFile; - - public String fileLoadingError; - - /* - * the default or current model displayed if the model cannot be identified - * from the selection message - */ - int frameNo = 0; + private Vector atomsPicked = new Vector<>(); - // protected JmolGenericPopup jmolpopup; // not used - remove? + private String lastCommand; - String lastCommand; + private boolean loadedInline; - String lastMessage; + private StringBuffer resetLastRes = new StringBuffer(); - boolean loadedInline; - - /** - * current set of model filenames loaded in the Jmol instance - */ - String[] modelFileNames = null; - - StringBuffer resetLastRes = new StringBuffer(); - - public Viewer viewer; + public Viewer jmolViewer; public JalviewJmolBinding(StructureSelectionManager ssm, - PDBEntry[] pdbentry, SequenceI[][] sequenceIs, String[][] chains, - String protocol) + PDBEntry[] pdbentry, SequenceI[][] sequenceIs, + DataSourceType protocol) { - super(ssm, pdbentry, sequenceIs, chains, protocol); + super(ssm, pdbentry, sequenceIs, protocol); + setStructureCommands(new JmolCommands()); /* * viewer = JmolViewer.allocateViewer(renderPanel, new SmarterJmolAdapter(), * "jalviewJmol", ap.av.applet .getDocumentBase(), @@ -122,9 +97,10 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel { super(ssm, seqs); - viewer = theViewer; - viewer.setJmolStatusListener(this); - viewer.addSelectionListener(this); + jmolViewer = theViewer; + jmolViewer.setJmolStatusListener(this); + jmolViewer.addSelectionListener(this); + setStructureCommands(new JmolCommands()); } /** @@ -138,69 +114,23 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel return getViewerTitle("Jmol", true); } - /** - * prepare the view for a given set of models/chains. chainList contains - * strings of the form 'pdbfilename:Chaincode' - * - * @param chainList - * list of chains to make visible - */ - public void centerViewer(Vector chainList) - { - StringBuilder cmd = new StringBuilder(128); - int mlength, p; - for (String lbl : chainList) - { - mlength = 0; - do - { - p = mlength; - mlength = lbl.indexOf(":", p); - } while (p < mlength && mlength < (lbl.length() - 2)); - // TODO: lookup each pdb id and recover proper model number for it. - cmd.append(":" + lbl.substring(mlength + 1) + " /" - + (1 + getModelNum(chainFile.get(lbl))) + " or "); - } - if (cmd.length() > 0) - { - cmd.setLength(cmd.length() - 4); - } - evalStateCommand("select *;restrict " + cmd + ";cartoon;center " + cmd); - } - public void closeViewer() { - viewer.acm.setModeMouse(JC.MOUSE_NONE); // remove listeners for all structures in viewer - getSsm().removeStructureViewerListener(this, this.getPdbFile()); - // and shut down jmol - viewer.evalStringQuiet("zap"); - viewer.setJmolStatusListener(null); + getSsm().removeStructureViewerListener(this, this.getStructureFiles()); + jmolViewer.dispose(); lastCommand = null; - viewer = null; + jmolViewer = null; releaseUIResources(); } - public void colourByChain() - { - colourBySequence = false; - // TODO: colour by chain should colour each chain distinctly across all - // visible models - // TODO: http://issues.jalview.org/browse/JAL-628 - evalStateCommand("select *;color chain"); - } - - public void colourByCharge() - { - colourBySequence = false; - evalStateCommand("select *;color white;select ASP,GLU;color red;" - + "select LYS,ARG;color blue;select CYS;color yellow"); - } - /** * superpose the structures associated with sequences in the alignment * according to their corresponding positions. + * + * @deprecated not used - remove? */ + @Deprecated public void superposeStructures(AlignmentI alignment) { superposeStructures(alignment, -1, null); @@ -213,7 +143,9 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel * @param refStructure * - select which pdb file to use as reference (default is -1 - the * first structure in the alignment) + * @deprecated not used - remove? */ + @Deprecated public void superposeStructures(AlignmentI alignment, int refStructure) { superposeStructures(alignment, refStructure, null); @@ -228,33 +160,24 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel * first structure in the alignment) * @param hiddenCols * TODO + * @deprecated not used - remove? */ + @Deprecated public void superposeStructures(AlignmentI alignment, int refStructure, - ColumnSelection hiddenCols) + HiddenColumns hiddenCols) { superposeStructures(new AlignmentI[] { alignment }, - new int[] { refStructure }, - new ColumnSelection[] { hiddenCols }); + new int[] + { refStructure }, new HiddenColumns[] { hiddenCols }); } /** - * Construct and send a command to align structures against a reference - * structure, based on one or more sequence alignments - * - * @param _alignment - * an array of alignments to process - * @param _refStructure - * an array of corresponding reference structures (index into pdb - * file array); if a negative value is passed, the first PDB file - * mapped to an alignment sequence is used as the reference for - * superposition - * @param _hiddenCols - * an array of corresponding hidden columns for each alignment + * {@inheritDoc} */ - public void superposeStructures(AlignmentI[] _alignment, - int[] _refStructure, ColumnSelection[] _hiddenCols) + public String superposeStructures(AlignmentI[] _alignment, + int[] _refStructure, HiddenColumns[] _hiddenCols) { - while (viewer.isScriptExecuting()) + while (jmolViewer.isScriptExecuting()) { try { @@ -262,12 +185,16 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel } catch (InterruptedException i) { } - ; } - String[] files = getPdbFile(); + + /* + * get the distinct structure files modelled + * (a file with multiple chains may map to multiple sequences) + */ + String[] files = getStructureFiles(); if (!waitForFileLoad(files)) { - return; + return null; } StringBuilder selectioncom = new StringBuilder(256); @@ -283,6 +210,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel nSeconds = " " + (2.0 / files.length) + " "; // if (nSeconds).substring(0,5)+" "; } + // see JAL-1345 - should really automatically turn off the animation for // large numbers of structures, but Jmol doesn't seem to allow that. // nSeconds = " "; @@ -291,36 +219,37 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel { int refStructure = _refStructure[a]; AlignmentI alignment = _alignment[a]; - ColumnSelection hiddenCols = _hiddenCols[a]; - if (a > 0 - && selectioncom.length() > 0 - && !selectioncom.substring(selectioncom.length() - 1).equals( - "|")) + HiddenColumns hiddenCols = _hiddenCols[a]; + if (a > 0 && selectioncom.length() > 0 && !selectioncom + .substring(selectioncom.length() - 1).equals("|")) { selectioncom.append("|"); } // process this alignment if (refStructure >= files.length) { - System.err.println("Invalid reference structure value " - + refStructure); + System.err.println( + "Invalid reference structure value " + refStructure); refStructure = -1; } /* - * 'matched' array will hold 'true' for visible alignment columns where + * 'matched' bit j will be set for visible alignment columns j where * all sequences have a residue with a mapping to the PDB structure */ - boolean matched[] = new boolean[alignment.getWidth()]; - for (int m = 0; m < matched.length; m++) + BitSet matched = new BitSet(); + for (int m = 0; m < alignment.getWidth(); m++) { - matched[m] = (hiddenCols != null) ? hiddenCols.isVisible(m) : true; + if (hiddenCols == null || hiddenCols.isVisible(m)) + { + matched.set(m); + } } SuperposeData[] structures = new SuperposeData[files.length]; for (int f = 0; f < files.length; f++) { - structures[f] = new SuperposeData(alignment.getWidth()); + structures[f] = new SuperposeData(alignment.getWidth(), f); } /* @@ -339,23 +268,18 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel } String[] selcom = new String[files.length]; - int nmatched = 0; - for (boolean b : matched) - { - if (b) - { - nmatched++; - } - } + int nmatched = matched.cardinality(); if (nmatched < 4) { - // TODO: bail out here because superposition illdefined? + return (MessageManager.formatMessage("label.insufficient_residues", + nmatched)); } /* * generate select statements to select regions to superimpose structures */ { + // TODO extract method to construct selection statements for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++) { String chainCd = ":" + structures[pdbfnum].chain; @@ -363,35 +287,35 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel boolean run = false; StringBuilder molsel = new StringBuilder(); molsel.append("{"); - for (int r = 0; r < matched.length; r++) + + int nextColumnMatch = matched.nextSetBit(0); + while (nextColumnMatch != -1) { - if (matched[r]) + int pdbResNo = structures[pdbfnum].pdbResNo[nextColumnMatch]; + if (lpos != pdbResNo - 1) { - int pdbResNo = structures[pdbfnum].pdbResNo[r]; - if (lpos != pdbResNo - 1) + // discontinuity + if (lpos != -1) { - // discontinuity - if (lpos != -1) - { - molsel.append(lpos); - molsel.append(chainCd); - molsel.append("|"); - } - run = false; + molsel.append(lpos); + molsel.append(chainCd); + molsel.append("|"); } - else + run = false; + } + else + { + // continuous run - and lpos >-1 + if (!run) { - // continuous run - and lpos >-1 - if (!run) - { - // at the beginning, so add dash - molsel.append(lpos); - molsel.append("-"); - } - run = true; + // at the beginning, so add dash + molsel.append(lpos); + molsel.append("-"); } - lpos = pdbResNo; + run = true; } + lpos = pdbResNo; + nextColumnMatch = matched.nextSetBit(nextColumnMatch + 1); } /* * add final selection phrase @@ -423,6 +347,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel } } StringBuilder command = new StringBuilder(256); + // command.append("set spinFps 10;\n"); + for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++) { if (pdbfnum == refStructure || selcom[pdbfnum] == null @@ -441,7 +367,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel command.append(".1} {"); command.append(Integer.toString(1 + refStructure)); // conformation=1 excludes alternate locations for CA (JAL-1757) - command.append(".1} SUBSET {(*.CA | *.P) and conformation=1} ATOMS "); + command.append( + ".1} SUBSET {(*.CA | *.P) and conformation=1} ATOMS "); // for (int s = 0; s < 2; s++) // { @@ -453,99 +380,41 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel } if (selectioncom.length() > 0) { - System.out.println("Select regions:\n" + selectioncom.toString()); - evalStateCommand("select *; cartoons off; backbone; select (" - + selectioncom.toString() + "); cartoons; "); - // selcom.append("; ribbons; "); String cmdString = command.toString(); - System.out.println("Superimpose command(s):\n" + cmdString); - - evalStateCommand(cmdString); + executeCommand(cmdString, false); } } if (selectioncom.length() > 0) - {// finally, mark all regions that were superposed. - if (selectioncom.substring(selectioncom.length() - 1).equals("|")) + { + /* + * finally, highlight with cartoons the residues that were superposed + */ + if (selectioncom.charAt(selectioncom.length() - 1) == '|') { selectioncom.setLength(selectioncom.length() - 1); } - System.out.println("Select regions:\n" + selectioncom.toString()); - evalStateCommand("select *; cartoons off; backbone; select (" - + selectioncom.toString() + "); cartoons; "); - // evalStateCommand("select *; backbone; select "+selcom.toString()+"; cartoons; center "+selcom.toString()); + executeCommand("select *; cartoons off; backbone; select (" + + selectioncom.toString() + "); cartoons; ", false); } + + return null; } - public void evalStateCommand(String command) + @Override + public List executeCommand(String command, boolean getReply) { + if (command == null) + { + return null; + } jmolHistory(false); if (lastCommand == null || !lastCommand.equals(command)) { - viewer.evalStringQuiet(command + "\n"); + jmolViewer.evalStringQuiet(command + "\n"); } jmolHistory(true); lastCommand = command; - } - - /** - * colour any structures associated with sequences in the given alignment - * using the getFeatureRenderer() and getSequenceRenderer() renderers but only - * if colourBySequence is enabled. - */ - public void colourBySequence(AlignmentViewPanel alignmentv) - { - boolean showFeatures = alignmentv.getAlignViewport() - .isShowSequenceFeatures(); - if (!colourBySequence || !isLoadingFinished()) - { - 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 (String cbyseq : cpdbbyseq.commands) - { - executeWhenReady(cbyseq); - } - } - } - - /** - * @param files - * @param sr - * @param fr - * @param alignment - * @return - */ - protected StructureMappingcommandSet[] getColourBySequenceCommands( - String[] files, SequenceRenderer sr, FeatureRenderer fr, - AlignmentI alignment) - { - return JmolCommands.getColourBySequenceCommand(getSsm(), files, - getSequence(), sr, fr, alignment); - } - - /** - * @param command - */ - protected void executeWhenReady(String command) - { - evalStateCommand(command); + return null; } public void createImage(String file, String type, int quality) @@ -579,60 +448,13 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel } @Override - public float[][][] functionXYZ(String functionName, int nx, int ny, int nz) + public float[][][] functionXYZ(String functionName, int nx, int ny, + int nz) { // TODO Auto-generated method stub return null; } - public Color getColour(int atomIndex, int pdbResNum, String chain, - String pdbfile) - { - if (getModelNum(pdbfile) < 0) - { - return null; - } - // TODO: verify atomIndex is selecting correct model. - // return new Color(viewer.getAtomArgb(atomIndex)); Jmol 12.2.4 - int colour = viewer.ms.at[atomIndex].atomPropertyInt(T.color); - return new Color(colour); - } - - /** - * 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 jmol view'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 - @@ -640,67 +462,30 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel */ private int _modelFileNameMap[]; - // //////////////////////////////// - // /StructureListener @Override - public synchronized String[] getPdbFile() + public synchronized String[] getStructureFiles() { - if (viewer == null) + List mset = new ArrayList<>(); + if (jmolViewer == null) { return new String[0]; } + if (modelFileNames == null) { - String mset[] = new String[viewer.ms.mc]; - _modelFileNameMap = new int[mset.length]; - String m = viewer.ms.getModelFileName(0); - if (m != null) - { - mset[0] = m; - try - { - mset[0] = new File(m).getAbsolutePath(); - } catch (AccessControlException x) - { - // usually not allowed to do this in applet - System.err - .println("jmolBinding: Using local file string from Jmol: " - + m); - } - if (mset[0].indexOf("/file:") != -1) - { - // applet path with docroot - discard as format won't match pdbfile - mset[0] = m; - } - _modelFileNameMap[0] = 0; // filename index for first model is always 0. - } - int j = 1; - for (int i = 1; i < mset.length; i++) + int modelCount = jmolViewer.ms.mc; + String filePath = null; + for (int i = 0; i < modelCount; ++i) { - m = viewer.ms.getModelFileName(i); - mset[j] = m; - if (m != null) + filePath = jmolViewer.ms.getModelFileName(i); + if (!mset.contains(filePath)) { - try - { - mset[j] = new File(m).getAbsolutePath(); - } catch (AccessControlException x) - { - // usually not allowed to do this in applet, so keep raw handle - // System.err.println("jmolBinding: Using local file string from Jmol: "+m); - } - } - _modelFileNameMap[j] = i; // record the model index for the filename - // skip any additional models in the same file (NMR structures) - if ((mset[j] == null ? mset[j] != mset[j - 1] - : (mset[j - 1] == null || !mset[j].equals(mset[j - 1])))) - { - j++; + mset.add(filePath); } } - modelFileNames = new String[j]; - System.arraycopy(mset, 0, modelFileNames, 0, j); + modelFileNames = mset.toArray(new String[mset.size()]); } + return modelFileNames; } @@ -714,17 +499,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel return null; } - /** - * returns the current sequenceRenderer that should be used to colour the - * structures - * - * @param alignment - * - * @return - */ - public abstract SequenceRenderer getSequenceRenderer( - AlignmentViewPanel alignment); - // /////////////////////////////// // JmolStatusListener @@ -744,7 +518,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel { if (resetLastRes.length() > 0) { - viewer.evalStringQuiet(resetLastRes.toString()); + jmolViewer.evalStringQuiet(resetLastRes.toString()); resetLastRes.setLength(0); } for (AtomSpec atom : atoms) @@ -780,9 +554,9 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel jmolHistory(false); StringBuilder cmd = new StringBuilder(64); - cmd.append("select " + pdbResNum); // +modelNum + cmd.append("select ").append(String.valueOf(pdbResNum)); // +modelNum - resetLastRes.append("select " + pdbResNum); // +modelNum + resetLastRes.append("select ").append(String.valueOf(pdbResNum)); // +modelNum cmd.append(":"); resetLastRes.append(":"); @@ -792,8 +566,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel resetLastRes.append(chain); } { - cmd.append(" /" + (mdlNum + 1)); - resetLastRes.append("/" + (mdlNum + 1)); + cmd.append(" /").append(String.valueOf(mdlNum + 1)); + resetLastRes.append("/").append(String.valueOf(mdlNum + 1)); } cmd.append(";wireframe 100;" + cmd.toString() + " and not hetero;"); @@ -802,16 +576,16 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel cmd.append("spacefill 200;select none"); - viewer.evalStringQuiet(cmd.toString()); + jmolViewer.evalStringQuiet(cmd.toString()); jmolHistory(true); } - boolean debug = true; + private boolean debug = true; private void jmolHistory(boolean enable) { - viewer.evalStringQuiet("History " + ((debug || enable) ? "on" : "off")); + jmolViewer.evalStringQuiet("History " + ((debug || enable) ? "on" : "off")); } public void loadInline(String string) @@ -825,10 +599,10 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel // Then, construct pass a reader for the string to Jmol. // ((org.jmol.Viewer.Viewer) viewer).loadModelFromFile(fullPathName, // fileName, null, reader, false, null, null, 0); - viewer.openStringInline(string); + jmolViewer.openStringInline(string); } - public void mouseOverStructure(int atomIndex, String strInfo) + protected void mouseOverStructure(int atomIndex, final String strInfo) { int pdbResNum; int alocsep = strInfo.indexOf("^"); @@ -847,14 +621,14 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel // handle insertion codes if (alocsep != -1) { - pdbResNum = Integer.parseInt(strInfo.substring( - strInfo.indexOf("]") + 1, alocsep)); + pdbResNum = Integer.parseInt( + strInfo.substring(strInfo.indexOf("]") + 1, alocsep)); } else { - pdbResNum = Integer.parseInt(strInfo.substring( - strInfo.indexOf("]") + 1, chainSeparator)); + pdbResNum = Integer.parseInt( + strInfo.substring(strInfo.indexOf("]") + 1, chainSeparator)); } String chainId; @@ -868,47 +642,76 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel chainId = " "; } - String pdbfilename = modelFileNames[frameNo]; // default is first or current - // model + String pdbfilename = modelFileNames[0]; // default is first model if (mdlSep > -1) { if (chainSeparator1 == -1) { chainSeparator1 = strInfo.indexOf(".", mdlSep); } - String mdlId = (chainSeparator1 > -1) ? strInfo.substring(mdlSep + 1, - chainSeparator1) : strInfo.substring(mdlSep + 1); + String mdlId = (chainSeparator1 > -1) + ? strInfo.substring(mdlSep + 1, chainSeparator1) + : strInfo.substring(mdlSep + 1); try { // recover PDB filename for the model hovered over. - int _mp = _modelFileNameMap.length - 1, mnumber = new Integer(mdlId) - .intValue() - 1; - while (mnumber < _modelFileNameMap[_mp]) + int mnumber = Integer.valueOf(mdlId).intValue() - 1; + if (_modelFileNameMap != null) { - _mp--; + int _mp = _modelFileNameMap.length - 1; + + while (mnumber < _modelFileNameMap[_mp]) + { + _mp--; + } + pdbfilename = modelFileNames[_mp]; } - pdbfilename = modelFileNames[_mp]; - if (pdbfilename == null) + else { - pdbfilename = new File(viewer.ms.getModelFileName(mnumber)) - .getAbsolutePath(); - } + if (mnumber >= 0 && mnumber < modelFileNames.length) + { + pdbfilename = modelFileNames[mnumber]; + } + if (pdbfilename == null) + { + pdbfilename = new File(jmolViewer.ms.getModelFileName(mnumber)) + .getAbsolutePath(); + } + } } catch (Exception e) { } - ; } - if (lastMessage == null || !lastMessage.equals(strInfo)) + + /* + * highlight position on alignment(s); if some text is returned, + * show this as a second line on the structure hover tooltip + */ + String label = getSsm().mouseOverStructure(pdbResNum, chainId, + pdbfilename); + if (label != null) { - getSsm().mouseOverStructure(pdbResNum, chainId, pdbfilename); + // change comma to pipe separator (newline token for Jmol) + label = label.replace(',', '|'); + StringTokenizer toks = new StringTokenizer(strInfo, " "); + StringBuilder sb = new StringBuilder(); + sb.append("select ").append(String.valueOf(pdbResNum)).append(":") + .append(chainId).append("/1"); + sb.append(";set hoverLabel \"").append(toks.nextToken()).append(" ") + .append(toks.nextToken()); + sb.append("|").append(label).append("\""); + executeCommand(sb.toString(), false); } - - lastMessage = strInfo; } public void notifyAtomHovered(int atomIndex, String strInfo, String data) { + if (strInfo.equals(lastMessage)) + { + return; + } + lastMessage = strInfo; if (data != null) { System.err.println("Ignoring additional hover info: " + data @@ -923,7 +726,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel * } } */ - public void notifyAtomPicked(int atomIndex, String strInfo, String strData) + public void notifyAtomPicked(int atomIndex, String strInfo, + String strData) { /** * this implements the toggle label behaviour copied from the original @@ -958,12 +762,12 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel if (!atomsPicked.contains(picked)) { - viewer.evalStringQuiet("select " + picked + ";label %n %r:%c"); + jmolViewer.evalStringQuiet("select " + picked + ";label %n %r:%c"); atomsPicked.addElement(picked); } else { - viewer.evalString("select " + picked + ";label off"); + jmolViewer.evalString("select " + picked + ";label off"); atomsPicked.removeElement(picked); } jmolHistory(true); @@ -994,6 +798,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel notifyAtomPicked(((Integer) data[2]).intValue(), (String) data[1], (String) data[0]); // also highlight in alignment + // deliberate fall through case HOVER: notifyAtomHovered(((Integer) data[2]).intValue(), (String) data[1], (String) data[0]); @@ -1006,8 +811,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel sendConsoleEcho((String) data[1]); break; case MESSAGE: - sendConsoleMessage((data == null) ? ((String) null) - : (String) data[1]); + sendConsoleMessage( + (data == null) ? ((String) null) : (String) data[1]); break; case ERROR: // System.err.println("Ignoring error callback."); @@ -1020,8 +825,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel case CLICK: default: - System.err.println("Unhandled callback " + type + " " - + data[1].toString()); + System.err.println( + "Unhandled callback " + type + " " + data[1].toString()); break; } } catch (Exception e) @@ -1078,10 +883,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel fileLoadingError = null; String[] oldmodels = modelFileNames; modelFileNames = null; - chainNames = new Vector(); - chainFile = new Hashtable(); boolean notifyLoaded = false; - String[] modelfilenames = getPdbFile(); + String[] modelfilenames = getStructureFiles(); // first check if we've lost any structures if (oldmodels != null && oldmodels.length > 0) { @@ -1130,21 +933,23 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel // calculate essential attributes for the pdb data imported inline. // prolly need to resolve modelnumber properly - for now just use our // 'best guess' - pdbfile = viewer.getData("" + (1 + _modelFileNameMap[modelnum]) - + ".0", "PDB"); + pdbfile = jmolViewer.getData( + "" + (1 + _modelFileNameMap[modelnum]) + ".0", "PDB"); } // search pdbentries and sequences to find correct pdbentry for this // model for (int pe = 0; pe < getPdbCount(); pe++) { boolean matches = false; + addSequence(pe, getSequence()[pe]); if (fileName == null) { if (false) // see JAL-623 - need method of matching pasted data up { pdb = getSsm().setMapping(getSequence()[pe], getChains()[pe], - pdbfile, AppletFormatAdapter.PASTE); + pdbfile, DataSourceType.PASTE, + getIProgressIndicator()); getPdbEntry(modelnum).setFile("INLINE" + pdb.getId()); matches = true; foundEntry = true; @@ -1162,12 +967,12 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel // needs // to be tested. See mantis bug // https://mantis.lifesci.dundee.ac.uk/view.php?id=36605 - String protocol = AppletFormatAdapter.URL; + DataSourceType protocol = DataSourceType.URL; try { if (fl.exists()) { - protocol = AppletFormatAdapter.FILE; + protocol = DataSourceType.FILE; } } catch (Exception e) { @@ -1176,7 +981,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel } // Explicitly map to the filename used by Jmol ; pdb = getSsm().setMapping(getSequence()[pe], getChains()[pe], - fileName, protocol); + fileName, protocol, getIProgressIndicator()); // pdbentry[pe].getFile(), protocol); } @@ -1186,10 +991,10 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel // add an entry for every chain in the model for (int i = 0; i < pdb.getChains().size(); i++) { - String chid = new String(pdb.getId() + ":" - + pdb.getChains().elementAt(i).id); - chainFile.put(chid, fileName); - chainNames.addElement(chid); + String chid = pdb.getId() + ":" + + pdb.getChains().elementAt(i).id; + addChainFile(chid, fileName); + getChainNames().add(chid); } notifyLoaded = true; } @@ -1200,7 +1005,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel // this is a foreign pdb file that jalview doesn't know about - add // it to the dataset and try to find a home - either on a matching // sequence or as a new sequence. - String pdbcontent = viewer.getData("/" + (modelnum + 1) + ".1", + String pdbcontent = jmolViewer.getData("/" + (modelnum + 1) + ".1", "PDB"); // parse pdb file into a chain, etc. // locate best match for pdb in associated views and add mapping to @@ -1219,7 +1024,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel // } if (!isLoadingFromArchive()) { - viewer.evalStringQuiet("model *; select backbone;restrict;cartoon;wireframe off;spacefill off"); + jmolViewer.evalStringQuiet( + "model *; select backbone;restrict;cartoon;wireframe off;spacefill off"); } // register ourselves as a listener and notify the gui that it needs to // update itself. @@ -1237,6 +1043,11 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel setLoadingFromArchive(false); } + protected IProgressIndicator getIProgressIndicator() + { + return null; + } + public void notifyNewPickingModeMeasurement(int iatom, String strMeasure) { notifyAtomPicked(iatom, strMeasure, null); @@ -1276,31 +1087,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel } - public void setJalviewColourScheme(ColourSchemeI cs) - { - colourBySequence = false; - - if (cs == null) - { - return; - } - - jmolHistory(false); - StringBuilder command = new StringBuilder(128); - command.append("select *;color white;"); - List residueSet = ResidueProperties.getResidues(isNucleotide(), - false); - for (String res : residueSet) - { - Color col = cs.findColour(res.charAt(0)); - command.append("select " + res + ";color[" + col.getRed() + "," - + col.getGreen() + "," + col.getBlue() + "];"); - } - - evalStateCommand(command.toString()); - jmolHistory(true); - } - public void showHelp() { showUrl("http://jmol.sourceforge.net/docs/JmolUserGuide/", "jmolHelp"); @@ -1314,13 +1100,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel public abstract void showUrl(String url, String target); /** - * called when the binding thinks the UI needs to be refreshed after a Jmol - * state change. this could be because structures were loaded, or because an - * error has occured. - */ - public abstract void refreshGUI(); - - /** * called to show or hide the associated console window container. * * @param show @@ -1369,12 +1148,12 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel { commandOptions = ""; } - viewer = (Viewer) JmolViewer.allocateViewer(renderPanel, - (jmolfileio ? new SmarterJmolAdapter() : null), htmlName - + ((Object) this).toString(), documentBase, codeBase, + jmolViewer = (Viewer) JmolViewer.allocateViewer(renderPanel, + (jmolfileio ? new SmarterJmolAdapter() : null), + htmlName + ((Object) this).toString(), documentBase, codeBase, commandOptions, this); - viewer.setJmolStatusListener(this); // extends JmolCallbackListener + jmolViewer.setJmolStatusListener(this); // extends JmolCallbackListener console = createJmolConsole(consolePanel, buttonsToShow); if (consolePanel != null) @@ -1390,16 +1169,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel protected org.jmol.api.JmolAppConsoleInterface console = null; - public void setBackgroundColour(java.awt.Color col) - { - jmolHistory(false); - viewer.evalStringQuiet("background [" + col.getRed() + "," - + col.getGreen() + "," + col.getBlue() + "];"); - jmolHistory(true); - } - @Override - public Dimension resizeInnerPanel(String data) + public int[] resizeInnerPanel(String data) { // Jalview doesn't honour resize panel requests return null; @@ -1458,4 +1229,27 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel { showConsole(false); } + + @Override + protected int getModelNoForFile(String pdbFile) + { + if (modelFileNames == null) + { + return -1; + } + for (int i = 0; i < modelFileNames.length; i++) + { + if (modelFileNames[i].equalsIgnoreCase(pdbFile)) + { + return i; + } + } + return -1; + } + + @Override + protected ViewerType getViewerType() + { + return ViewerType.JMOL; + } }