X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fjmol%2FJalviewJmolBinding.java;h=30998bd9bbe61e29eb3b7f1dd4f8c16a1a74dcae;hb=1d21f595873869193bd4821e1af9c4eb56c5f158;hp=8dfb9fd8b5fa06547a580af43bb565851d21ee83;hpb=865a855a4ca87eadb3e5ff284ed32ed307d9c34b;p=jalview.git diff --git a/src/jalview/ext/jmol/JalviewJmolBinding.java b/src/jalview/ext/jmol/JalviewJmolBinding.java index 8dfb9fd..30998bd 100644 --- a/src/jalview/ext/jmol/JalviewJmolBinding.java +++ b/src/jalview/ext/jmol/JalviewJmolBinding.java @@ -1,19 +1,21 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1) + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) * Copyright (C) 2014 The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with Jalview. If not, see . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.ext.jmol; @@ -30,9 +32,12 @@ import jalview.datamodel.SequenceI; import jalview.io.AppletFormatAdapter; import jalview.schemes.ColourSchemeI; import jalview.schemes.ResidueProperties; +import jalview.structure.AtomSpec; import jalview.structure.StructureListener; import jalview.structure.StructureMapping; import jalview.structure.StructureSelectionManager; +import jalview.structures.models.SequenceStructureBindingModel; +import jalview.util.MessageManager; import java.awt.Color; import java.awt.Container; @@ -41,8 +46,8 @@ import java.awt.event.ComponentListener; import java.io.File; import java.net.URL; import java.security.AccessControlException; -import java.util.Enumeration; import java.util.Hashtable; +import java.util.List; import java.util.Map; import java.util.Vector; @@ -54,26 +59,13 @@ import org.jmol.api.JmolViewer; import org.jmol.constant.EnumCallback; import org.jmol.popup.JmolPopup; -public abstract class JalviewJmolBinding implements StructureListener, +public abstract class JalviewJmolBinding extends SequenceStructureBindingModel implements StructureListener, JmolStatusListener, SequenceStructureBinding, JmolSelectionListener, ComponentListener, StructureSelectionManagerProvider { /** - * set if Jmol state is being restored from some source - instructs binding - * not to apply default display style when structure set is updated for first - * time. - */ - private boolean loadingFromArchive = false; - - /** - * second flag to indicate if the jmol viewer should ignore sequence colouring - * events from the structure manager because the GUI is still setting up - */ - private boolean loadingFinished = true; - - /** * state flag used to check if the Jmol viewer's paint method can be called */ private boolean finishedInit = false; @@ -241,7 +233,9 @@ public abstract class JalviewJmolBinding implements StructureListener, + (1 + getModelNum((String) chainFile.get(lbl))) + " or "); } if (cmd.length() > 0) + { cmd.setLength(cmd.length() - 4); + } evalStateCommand("select *;restrict " + cmd + ";cartoon;center " + cmd); } @@ -328,13 +322,15 @@ public abstract class JalviewJmolBinding implements StructureListener, String[] files = getPdbFile(); // check to see if we are still waiting for Jmol files - long starttime=System.currentTimeMillis(); - boolean waiting=true; - do { - waiting=false; - for (String file:files) + long starttime = System.currentTimeMillis(); + boolean waiting = true; + do + { + waiting = false; + for (String file : files) { - try { + try + { // HACK - in Jalview 2.8 this call may not be threadsafe so we catch // every possible exception StructureMapping[] sm = ssm.getMapping(file); @@ -351,10 +347,12 @@ public abstract class JalviewJmolBinding implements StructureListener, } } // we wait around for a reasonable time before we give up - } while (waiting && System.currentTimeMillis()<(10000+1000*files.length+starttime)); + } while (waiting + && System.currentTimeMillis() < (10000 + 1000 * files.length + starttime)); if (waiting) { - System.err.println("RUNTIME PROBLEM: Jmol seems to be taking a long time to process all the structures."); + System.err + .println("RUNTIME PROBLEM: Jmol seems to be taking a long time to process all the structures."); return; } StringBuffer selectioncom = new StringBuffer(); @@ -418,7 +416,7 @@ public abstract class JalviewJmolBinding implements StructureListener, // Jmol callback has completed. if (mapping == null || mapping.length < 1) { - throw new Error("Implementation error - Jmol seems to be still working on getting its data - report at http://issues.jalview.org/browse/JAL-1016"); + throw new Error(MessageManager.getString("error.implementation_error_jmol_getting_data")); } int lastPos = -1; for (int s = 0; s < sequence[pdbfnum].length; s++) @@ -484,7 +482,7 @@ public abstract class JalviewJmolBinding implements StructureListener, } } } - + // TODO: consider bailing if nmatched less than 4 because superposition // not // well defined. @@ -543,22 +541,30 @@ public abstract class JalviewJmolBinding implements StructureListener, molsel.append(chainCd); molsel.append("}"); } - selcom[pdbfnum] = molsel.toString(); - selectioncom.append("(("); - selectioncom.append(selcom[pdbfnum].substring(1, - selcom[pdbfnum].length() - 1)); - selectioncom.append(" )& "); - selectioncom.append(pdbfnum + 1); - selectioncom.append(".1)"); - if (pdbfnum < files.length - 1) + if (molsel.length() > 1) { - selectioncom.append("|"); + selcom[pdbfnum] = molsel.toString(); + selectioncom.append("(("); + selectioncom.append(selcom[pdbfnum].substring(1, + selcom[pdbfnum].length() - 1)); + selectioncom.append(" )& "); + selectioncom.append(pdbfnum + 1); + selectioncom.append(".1)"); + if (pdbfnum < files.length - 1) + { + selectioncom.append("|"); + } + } + else + { + selcom[pdbfnum] = null; } } } for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++) { - if (pdbfnum == refStructure) + if (pdbfnum == refStructure || selcom[pdbfnum] == null + || selcom[refStructure] == null) { continue; } @@ -567,7 +573,7 @@ public abstract class JalviewJmolBinding implements StructureListener, command.append(chainNames[pdbfnum]); command.append(") against reference ("); command.append(chainNames[refStructure]); - command.append(")\";\ncompare "+nSeconds); + command.append(")\";\ncompare " + nSeconds); command.append("{"); command.append(1 + pdbfnum); command.append(".1} {"); @@ -582,13 +588,17 @@ public abstract class JalviewJmolBinding implements StructureListener, } command.append(" ROTATE TRANSLATE;\n"); } - System.out.println("Select regions:\n" + selectioncom.toString()); - evalStateCommand("select *; cartoons off; backbone; select (" - + selectioncom.toString() + "); cartoons; "); - // selcom.append("; ribbons; "); - System.out.println("Superimpose command(s):\n" + command.toString()); - - evalStateCommand(command.toString()); + if (selectioncom.length() > 0) + { + System.out.println("Select regions:\n" + selectioncom.toString()); + evalStateCommand("select *; cartoons off; backbone; select (" + + selectioncom.toString() + "); cartoons; "); + // selcom.append("; ribbons; "); + System.out + .println("Superimpose command(s):\n" + command.toString()); + + evalStateCommand(command.toString()); + } } if (selectioncom.length() > 0) {// finally, mark all regions that were superposed. @@ -622,8 +632,10 @@ public abstract class JalviewJmolBinding implements StructureListener, public void colourBySequence(boolean showFeatures, jalview.api.AlignmentViewPanel alignmentv) { - if (!colourBySequence || !loadingFinished) + if (!colourBySequence || !isLoadingFinished()) + { return; + } if (ssm == null) { return; @@ -642,10 +654,12 @@ public abstract class JalviewJmolBinding implements StructureListener, for (jalview.structure.StructureMappingcommandSet cpdbbyseq : JmolCommands .getColourBySequenceCommand(ssm, files, sequence, sr, fr, alignment)) + { for (String cbyseq : cpdbbyseq.commands) { evalStateCommand(cbyseq); } + } } public boolean isColourBySequence() @@ -695,7 +709,9 @@ public abstract class JalviewJmolBinding implements StructureListener, String pdbfile) { if (getModelNum(pdbfile) < 0) + { return null; + } // TODO: verify atomIndex is selecting correct model. return new Color(viewer.getAtomArgb(atomIndex)); } @@ -728,7 +744,9 @@ public abstract class JalviewJmolBinding implements StructureListener, for (int i = 0; i < mfn.length; i++) { if (mfn[i].equalsIgnoreCase(modelFileName)) + { return i; + } } return -1; } @@ -824,64 +842,76 @@ public abstract class JalviewJmolBinding implements StructureListener, jmolpopup.show(x, y); } - // jmol/ssm only - public void highlightAtom(int atomIndex, int pdbResNum, String chain, - String pdbfile) + /** + * Highlight the specified atoms in the structure. + * + * @param atoms + */ + @Override + public void highlightAtoms(List atoms) { if (modelFileNames == null) { return; } - // look up file model number for this pdbfile - int mdlNum = 0; - String fn; - // may need to adjust for URLencoding here - we don't worry about that yet. - while (mdlNum < modelFileNames.length - && !pdbfile.equals(modelFileNames[mdlNum])) - { - // System.out.println("nomatch:"+pdbfile+"\nmodelfn:"+fn); - mdlNum++; - } - if (mdlNum == modelFileNames.length) + for (AtomSpec atom : atoms) { - return; - } + String pdbfile = atom.getPdbId(); + int pdbResNum = atom.getPdbResNum(); + String chain = atom.getChain(); + + // look up file model number for this pdbfile + int mdlNum = 0; + String fn; + // may need to adjust for URLencoding here - we don't worry about that + // yet. + while (mdlNum < modelFileNames.length + && !pdbfile.equals(modelFileNames[mdlNum])) + { + // System.out.println("nomatch:"+pdbfile+"\nmodelfn:"+fn); + mdlNum++; + } + if (mdlNum == modelFileNames.length) + { + return; + } - jmolHistory(false); - // if (!pdbfile.equals(pdbentry.getFile())) - // return; - if (resetLastRes.length() > 0) - { - viewer.evalStringQuiet(resetLastRes.toString()); - } + jmolHistory(false); + // if (!pdbfile.equals(pdbentry.getFile())) + // return; + if (resetLastRes.length() > 0) + { + viewer.evalStringQuiet(resetLastRes.toString()); + } - eval.setLength(0); - eval.append("select " + pdbResNum); // +modelNum + eval.setLength(0); + eval.append("select " + pdbResNum); // +modelNum - resetLastRes.setLength(0); - resetLastRes.append("select " + pdbResNum); // +modelNum + resetLastRes.setLength(0); + resetLastRes.append("select " + pdbResNum); // +modelNum - eval.append(":"); - resetLastRes.append(":"); - if (!chain.equals(" ")) - { - eval.append(chain); - resetLastRes.append(chain); - } - { - eval.append(" /" + (mdlNum + 1)); - resetLastRes.append("/" + (mdlNum + 1)); - } - eval.append(";wireframe 100;" + eval.toString() + " and not hetero;"); + eval.append(":"); + resetLastRes.append(":"); + if (!chain.equals(" ")) + { + eval.append(chain); + resetLastRes.append(chain); + } + { + eval.append(" /" + (mdlNum + 1)); + resetLastRes.append("/" + (mdlNum + 1)); + } + eval.append(";wireframe 100;" + eval.toString() + " and not hetero;"); - resetLastRes.append(";wireframe 0;" + resetLastRes.toString() - + " and not hetero; spacefill 0;"); + resetLastRes.append(";wireframe 0;" + resetLastRes.toString() + + " and not hetero; spacefill 0;"); - eval.append("spacefill 200;select none"); + eval.append("spacefill 200;select none"); - viewer.evalStringQuiet(eval.toString()); - jmolHistory(true); + viewer.evalStringQuiet(eval.toString()); + jmolHistory(true); + } } @@ -937,8 +967,10 @@ public abstract class JalviewJmolBinding implements StructureListener, String chainId; if (strInfo.indexOf(":") > -1) + { chainId = strInfo.substring(strInfo.indexOf(":") + 1, strInfo.indexOf(".")); + } else { chainId = " "; @@ -976,7 +1008,9 @@ public abstract class JalviewJmolBinding implements StructureListener, ; } if (lastMessage == null || !lastMessage.equals(strInfo)) + { ssm.mouseOverStructure(pdbResNum, chainId, pdbfilename); + } lastMessage = strInfo; } @@ -1010,13 +1044,17 @@ public abstract class JalviewJmolBinding implements StructureListener, int chainSeparator = strInfo.indexOf(":"); int p = 0; if (chainSeparator == -1) + { chainSeparator = strInfo.indexOf("."); + } String picked = strInfo.substring(strInfo.indexOf("]") + 1, chainSeparator); String mdlString = ""; if ((p = strInfo.indexOf(":")) > -1) + { picked += strInfo.substring(p + 1, strInfo.indexOf(".")); + } if ((p = strInfo.indexOf("/")) > -1) { @@ -1264,7 +1302,7 @@ public abstract class JalviewJmolBinding implements StructureListener, for (int i = 0; i < pdb.chains.size(); i++) { String chid = new String(pdb.id + ":" - + ((MCview.PDBChain) pdb.chains.elementAt(i)).id); + + pdb.chains.elementAt(i).id); chainFile.put(chid, fileName); chainNames.addElement(chid); } @@ -1357,21 +1395,23 @@ public abstract class JalviewJmolBinding implements StructureListener, colourBySequence = false; if (cs == null) + { return; + } - String res; int index; Color col; jmolHistory(false); // TODO: Switch between nucleotide or aa selection expressions - Enumeration en = ResidueProperties.aa3Hash.keys(); - StringBuffer command = new StringBuffer("select *;color white;"); - while (en.hasMoreElements()) + StringBuilder command = new StringBuilder(128); + command.append("select *;color white;"); + for (String res : ResidueProperties.aa3Hash.keySet()) { - res = en.nextElement().toString(); - index = ((Integer) ResidueProperties.aa3Hash.get(res)).intValue(); + index = ResidueProperties.aa3Hash.get(res).intValue(); if (index > 20) + { continue; + } col = cs.findColour(ResidueProperties.aa[index].charAt(0)); @@ -1490,30 +1530,6 @@ public abstract class JalviewJmolBinding implements StructureListener, showConsole(false); } - public void setLoadingFromArchive(boolean loadingFromArchive) - { - this.loadingFromArchive = loadingFromArchive; - } - - /** - * - * @return true if Jmol is still restoring state or loading is still going on (see setFinsihedLoadingFromArchive) - */ - public boolean isLoadingFromArchive() - { - return loadingFromArchive && !loadingFinished; - } - - /** - * modify flag which controls if sequence colouring events are honoured by the binding. - * Should be true for normal operation - * @param finishedLoading - */ - public void setFinishedLoadingFromArchive(boolean finishedLoading) - { - loadingFinished = finishedLoading; - } - public void setBackgroundColour(java.awt.Color col) { jmolHistory(false); @@ -1591,9 +1607,7 @@ public abstract class JalviewJmolBinding implements StructureListener, { if (pe < 0 || pe >= pdbentry.length) { - throw new Error( - "Implementation error - no corresponding pdbentry (for index " - + pe + ") to add sequences mappings to"); + throw new Error(MessageManager.formatMessage("error.implementation_error_no_pdbentry_from_index", new String[]{Integer.valueOf(pe).toString()})); } final String nullChain = "TheNullChain"; Vector s = new Vector();