X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fjmol%2FJalviewJmolBinding.java;h=8cecf6eba5f3d47abb24fbe2590fd6c5003df90f;hb=6bf5604d306cbcd55289639967411ddbafcac682;hp=82e188f0c5c012f9d9c34f63a096e490b52f1407;hpb=799c26111d6936a2e70cb5f1fd7d7312311e6db9;p=jalview.git diff --git a/src/jalview/ext/jmol/JalviewJmolBinding.java b/src/jalview/ext/jmol/JalviewJmolBinding.java index 82e188f..8cecf6e 100644 --- a/src/jalview/ext/jmol/JalviewJmolBinding.java +++ b/src/jalview/ext/jmol/JalviewJmolBinding.java @@ -21,18 +21,19 @@ package jalview.ext.jmol; import jalview.api.AlignViewportI; +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.ext.rbvi.chimera.AtomSpecModel; +import jalview.gui.IProgressIndicator; 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.StructureSelectionManager; import jalview.structures.models.AAStructureBindingModel; import jalview.util.MessageManager; @@ -43,7 +44,6 @@ 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.ArrayList; import java.util.BitSet; import java.util.Hashtable; @@ -72,7 +72,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel */ private boolean associateNewStructs = false; - Vector atomsPicked = new Vector(); + Vector atomsPicked = new Vector<>(); private List chainNames; @@ -134,15 +134,12 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel /** * 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) + public void centerViewer() { StringBuilder cmd = new StringBuilder(128); int mlength, p; - for (String lbl : chainList) + for (String lbl : chainsToShow) { mlength = 0; do @@ -158,13 +155,14 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel { cmd.setLength(cmd.length() - 4); } - evalStateCommand("select *;restrict " + cmd + ";cartoon;center " + cmd); + String command = "select *;restrict " + cmd + ";cartoon;center " + cmd; + evalStateCommand(command); } public void closeViewer() { // remove listeners for all structures in viewer - getSsm().removeStructureViewerListener(this, this.getPdbFile()); + getSsm().removeStructureViewerListener(this, this.getStructureFiles()); viewer.dispose(); lastCommand = null; viewer = null; @@ -222,11 +220,11 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel * TODO */ 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 }); } /** @@ -234,7 +232,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel */ @Override public String superposeStructures(AlignmentI[] _alignment, - int[] _refStructure, ColumnSelection[] _hiddenCols) + int[] _refStructure, HiddenColumns[] _hiddenCols) { while (viewer.isScriptExecuting()) { @@ -250,7 +248,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel * get the distinct structure files modelled * (a file with multiple chains may map to multiple sequences) */ - String[] files = getPdbFile(); + String[] files = getStructureFiles(); if (!waitForFileLoad(files)) { return null; @@ -278,19 +276,17 @@ 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; } @@ -332,8 +328,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel int nmatched = matched.cardinality(); if (nmatched < 4) { - return (MessageManager.formatMessage( -"label.insufficient_residues", + return (MessageManager.formatMessage("label.insufficient_residues", nmatched)); } @@ -429,7 +424,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++) // { @@ -461,7 +457,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel // 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()); + // evalStateCommand("select *; backbone; select "+selcom.toString()+"; + // cartoons; center "+selcom.toString()); } return null; @@ -478,38 +475,47 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel lastCommand = command; } + Thread colourby = null; + /** * Sends a set of colour commands to the structure viewer * - * @param colourBySequenceCommands + * @param commands */ @Override - protected void colourBySequence( - StructureMappingcommandSet[] colourBySequenceCommands) + protected void colourBySequence(final String[] commands) { - for (StructureMappingcommandSet cpdbbyseq : colourBySequenceCommands) + if (colourby != null) + { + colourby.interrupt(); + colourby = null; + } + colourby = new Thread(new Runnable() { - for (String cbyseq : cpdbbyseq.commands) + @Override + public void run() { - executeWhenReady(cbyseq); + for (String cmd : commands) + { + executeWhenReady(cmd); + } } - } + }); + colourby.start(); } /** * @param files - * @param sr - * @param fr - * @param viewport + * @param viewPanel * @return */ @Override - protected StructureMappingcommandSet[] getColourBySequenceCommands( - String[] files, SequenceRenderer sr, FeatureRenderer fr, - AlignViewportI viewport) + protected String[] getColourBySequenceCommands( + String[] files, AlignmentViewPanel viewPanel) { - return JmolCommands.getColourBySequenceCommand(getSsm(), files, - getSequence(), sr, fr, viewport); + Map map = buildColoursMap(viewPanel); + + return JmolCommands.getColourBySequenceCommand(map); } /** @@ -551,7 +557,8 @@ 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; @@ -579,7 +586,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel private int getModelNum(String modelFileName) { - String[] mfn = getPdbFile(); + String[] mfn = getStructureFiles(); if (mfn == null) { return -1; @@ -601,71 +608,30 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel */ private int _modelFileNameMap[]; - // //////////////////////////////// - // /StructureListener @Override - public synchronized String[] getPdbFile() + public synchronized String[] getStructureFiles() { + List mset = new ArrayList<>(); if (viewer == null) { return new String[0]; } + if (modelFileNames == null) { - List mset = new ArrayList(); - _modelFileNameMap = new int[viewer.ms.mc]; - String m = viewer.ms.getModelFileName(0); - if (m != null) - { - String filePath = m; - try - { - filePath = 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 (filePath.indexOf("/file:") != -1) - { - // applet path with docroot - discard as format won't match pdbfile - filePath = m; - } - mset.add(filePath); - _modelFileNameMap[0] = 0; // filename index for first model is always 0. - } - int j = 1; - for (int i = 1; i < viewer.ms.mc; i++) + int modelCount = viewer.ms.mc; + String filePath = null; + for (int i = 0; i < modelCount; ++i) { - m = viewer.ms.getModelFileName(i); - String filePath = m; - if (m != null) - { - try - { - filePath = 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); - } - } - - /* - * add this model unless it is read from a structure file we have - * already seen (example: 2MJW is an NMR structure with 10 models) - */ + filePath = viewer.ms.getModelFileName(i); if (!mset.contains(filePath)) { mset.add(filePath); - _modelFileNameMap[j] = i; // record the model index for the filename - j++; } } modelFileNames = mset.toArray(new String[mset.size()]); } + return modelFileNames; } @@ -679,8 +645,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel return null; } - - // /////////////////////////////// // JmolStatusListener @@ -803,14 +767,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; @@ -832,24 +796,36 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel { 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(viewer.ms.getModelFileName(mnumber)) + .getAbsolutePath(); + } + } } catch (Exception e) { } @@ -879,7 +855,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 @@ -950,6 +927,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]); @@ -962,8 +940,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."); @@ -976,8 +954,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) @@ -1034,10 +1012,10 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel fileLoadingError = null; String[] oldmodels = modelFileNames; modelFileNames = null; - chainNames = new ArrayList(); - chainFile = new Hashtable(); + chainNames = new ArrayList<>(); + 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) { @@ -1086,8 +1064,8 @@ 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 = viewer.getData( + "" + (1 + _modelFileNameMap[modelnum]) + ".0", "PDB"); } // search pdbentries and sequences to find correct pdbentry for this // model @@ -1101,7 +1079,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel // see JAL-623 - need method of matching pasted data up { pdb = getSsm().setMapping(getSequence()[pe], getChains()[pe], - pdbfile, DataSourceType.PASTE); + pdbfile, DataSourceType.PASTE, + getIProgressIndicator()); getPdbEntry(modelnum).setFile("INLINE" + pdb.getId()); matches = true; foundEntry = true; @@ -1133,7 +1112,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); } @@ -1143,8 +1122,8 @@ 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); + String chid = new String( + pdb.getId() + ":" + pdb.getChains().elementAt(i).id); chainFile.put(chid, fileName); chainNames.add(chid); } @@ -1176,7 +1155,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel // } if (!isLoadingFromArchive()) { - viewer.evalStringQuiet("model *; select backbone;restrict;cartoon;wireframe off;spacefill off"); + viewer.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. @@ -1200,6 +1180,11 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel return chainNames; } + protected IProgressIndicator getIProgressIndicator() + { + return null; + } + public void notifyNewPickingModeMeasurement(int iatom, String strMeasure) { notifyAtomPicked(iatom, strMeasure, null); @@ -1256,8 +1241,9 @@ public abstract class JalviewJmolBinding 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("select " + resName + ";color[" + col.getRed() + "," + col.getGreen() + "," + col.getBlue() + "];"); @@ -1336,8 +1322,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel commandOptions = ""; } viewer = (Viewer) JmolViewer.allocateViewer(renderPanel, - (jmolfileio ? new SmarterJmolAdapter() : null), htmlName - + ((Object) this).toString(), documentBase, codeBase, + (jmolfileio ? new SmarterJmolAdapter() : null), + htmlName + ((Object) this).toString(), documentBase, codeBase, commandOptions, this); viewer.setJmolStatusListener(this); // extends JmolCallbackListener @@ -1425,4 +1411,40 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel { showConsole(false); } + + @Override + public void showStructures(AlignViewportI av, boolean refocus) + { + StringBuilder cmd = new StringBuilder(128); + + if (isShowAlignmentOnly()) + { + cmd.append("hide *;"); + + AtomSpecModel model = getShownResidues(av); + String atomSpec = JmolCommands.getAtomSpec(model); + + cmd.append("display ").append(atomSpec); + } + else + { + cmd.append("display *"); + } + cmd.append("; cartoon"); + if (refocus) + { + cmd.append("; zoom 100"); + } + evalStateCommand(cmd.toString()); + } + + /** + * Answers a Jmol syntax style structure model specification. Model number 0, 1, + * 2... is formatted as "1.1", "2.1", "3.1" etc. + */ + @Override + public String getModelSpec(int model) + { + return String.valueOf(model + 1) + ".1"; + } }