X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Frbvi%2Fchimera%2FJalviewChimeraBinding.java;h=3f2d5e44e939209bb357820ca4942fcb96d0b62b;hb=d3a2fdc864b586b5c604335dd715ec215b679197;hp=a39f355c85e1c6ec5b4b4a4ce962808a2e6594ee;hpb=9b748cf747fedad98cb9c1f4e2f9aaf565c176cb;p=jalview.git diff --git a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java index a39f355..3f2d5e4 100644 --- a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java +++ b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java @@ -44,10 +44,9 @@ import java.io.File; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; -import java.util.Hashtable; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Vector; import ext.edu.ucsf.rbvi.strucviz2.ChimeraManager; import ext.edu.ucsf.rbvi.strucviz2.ChimeraModel; @@ -59,6 +58,10 @@ public abstract class JalviewChimeraBinding extends SequenceStructureBinding, StructureSelectionManagerProvider { + private static final String PHOSPHORUS = "P"; + + private static final String ALPHACARBON = "CA"; + private StructureManager csm; private ChimeraManager viewer; @@ -95,18 +98,18 @@ public abstract class JalviewChimeraBinding extends /** * when true, try to search the associated datamodel for sequences that are - * associated with any unknown structures in the Jmol view. + * associated with any unknown structures in the Chimera view. */ private boolean associateNewStructs = false; - Vector atomsPicked = new Vector(); + List atomsPicked = new ArrayList(); - public Vector chainNames; + public List chainNames; - Hashtable chainFile; + private Map chainFile; /** - * array of target chains for seuqences - tied to pdbentry and sequence[] + * array of target chains for sequences - tied to pdbentry and sequence[] */ protected String[][] chains; @@ -116,7 +119,7 @@ public abstract class JalviewChimeraBinding extends public String fileLoadingError; - private Map> chimmaps = new HashMap>(); + private Map> chimmaps = new LinkedHashMap>(); private List mdlToFile = new ArrayList(); @@ -138,7 +141,7 @@ public abstract class JalviewChimeraBinding extends try { List oldList = viewer.getModelList(); - viewer.openModel(file, ModelType.PDB_MODEL); + viewer.openModel(file, pe.getId(), ModelType.PDB_MODEL); List newList = viewer.getModelList(); if (oldList.size() < newList.size()) { @@ -288,31 +291,32 @@ public abstract class JalviewChimeraBinding extends * prepare the view for a given set of models/chains. chainList contains * strings of the form 'pdbfilename:Chaincode' * - * @param chainList + * @param toshow * list of chains to make visible */ - public void centerViewer(Vector chainList) + public void centerViewer(List toshow) { - StringBuffer cmd = new StringBuffer(); - String lbl; + StringBuilder cmd = new StringBuilder(64); int mlength, p; - for (int i = 0, iSize = chainList.size(); i < iSize; i++) + for (String lbl : toshow) { mlength = 0; - lbl = (String) chainList.elementAt(i); 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("#" + getModelNum((String) chainFile.get(lbl)) + "." + cmd.append("#" + getModelNum(chainFile.get(lbl)) + "." + lbl.substring(mlength + 1) + " or "); } if (cmd.length() > 0) + { cmd.setLength(cmd.length() - 4); - evalStateCommand("~display #*; ~ribbon #*; ribbon " + cmd + ";focus " - + cmd,false); + } + String cmdstring = cmd.toString(); + evalStateCommand("~display #*; ~ribbon #*; ribbon " + cmdstring + + ";focus " + cmdstring, false); } public void closeViewer() @@ -394,7 +398,7 @@ public abstract class JalviewChimeraBinding extends int[] _refStructure, ColumnSelection[] _hiddenCols) { assert (_alignment.length == _refStructure.length && _alignment.length != _hiddenCols.length); - StringBuffer allComs = new StringBuffer(); // whole shebang for superposition + StringBuilder allComs = new StringBuilder(128); // Chimera superposition cmd String[] files = getPdbFile(); // check to see if we are still waiting for Jmol files long starttime = System.currentTimeMillis(); @@ -427,7 +431,7 @@ public abstract class JalviewChimeraBinding extends if (waiting) { System.err - .println("RUNTIME PROBLEM: Jmol seems to be taking a long time to process all the structures."); + .println("RUNTIME PROBLEM: Chimera seems to be taking a long time to process all the structures."); return; } refreshPdbEntries(); @@ -455,7 +459,6 @@ public abstract class JalviewChimeraBinding extends { refStructure = -1; } - StringBuffer command = new StringBuffer(); boolean matched[] = new boolean[alignment.getWidth()]; for (int m = 0; m < matched.length; m++) @@ -466,10 +469,9 @@ public abstract class JalviewChimeraBinding extends int commonrpositions[][] = new int[files.length][alignment.getWidth()]; String isel[] = new String[files.length]; - // reference structure - all others are superposed in it String[] targetC = new String[files.length]; String[] chainNames = new String[files.length]; - String[] atomS = new String[files.length]; + String[] atomSpec = new String[files.length]; for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++) { StructureMapping[] mapping = ssm.getMapping(files[pdbfnum]); @@ -536,7 +538,7 @@ public abstract class JalviewChimeraBinding extends } chainNames[pdbfnum] = mapping[m].getPdbId() + targetC[pdbfnum]; - atomS[pdbfnum] = asp.getRNA()!=null ? "P" : "CA"; + atomSpec[pdbfnum] = asp.getRNA() != null ? PHOSPHORUS : ALPHACARBON; // move on to next pdb file s = sequence[pdbfnum].length; break; @@ -619,6 +621,7 @@ public abstract class JalviewChimeraBinding extends } } } + StringBuilder command = new StringBuilder(256); for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++) { if (pdbfnum == refStructure || selcom[pdbfnum] == null @@ -626,23 +629,31 @@ public abstract class JalviewChimeraBinding extends { continue; } - if (command.length()>0) + if (command.length() > 0) { command.append(";"); } - command.append("match"); - // form the matched pair strings - for (int s = 0; s < 2; s++) - { - command.append(" #"+(s == 0 ? pdbfnum : refStructure)+".1"); - // note - need to select on first model, otherwise it all goes wrong! - command.append(selcom[(s == 0 ? pdbfnum : refStructure)]); - command.append("@"+atomS[(s == 0 ? pdbfnum : refStructure)]); // match on backbone alpha/polyphosphate - } + /* + * Form Chimera match command, from the 'new' structure to the + * 'reference' structure e.g. (residues 1-91, chain B/A, alphacarbons): + * + * match #1:1-91.B@CA #0:1-91.A@CA + * + * @see + * https://www.cgl.ucsf.edu/chimera/docs/UsersGuide/midas/match.html + */ + command.append("match #" + pdbfnum /* +".1" */); + // TODO: handle sub-models + command.append(selcom[pdbfnum]); + command.append("@" + atomSpec[pdbfnum]); + command.append(" #" + refStructure /* +".1" */); + command.append(selcom[refStructure]); + command.append("@" + atomSpec[refStructure]); } if (selectioncom.length() > 0) { + // TODO remove debug output System.out.println("Select regions:\n" + selectioncom.toString()); System.out .println("Superimpose command(s):\n" + command.toString()); @@ -661,7 +672,7 @@ public abstract class JalviewChimeraBinding extends allComs.append("; ~display all; chain @CA|P; ribbon " + selectioncom.toString() + ""); // evalStateCommand("select *; backbone; select "+selcom.toString()+"; cartoons; center "+selcom.toString()); - evalStateCommand(allComs.toString(),false); + evalStateCommand(allComs.toString(), true /* false */); } } @@ -689,8 +700,9 @@ public abstract class JalviewChimeraBinding extends // @Override // public void run() // { - lastReply = viewer.sendChimeraCommand(command, resp); - if (debug) + // trim command or it may never find a match in the replyLog!! + lastReply = viewer.sendChimeraCommand(command.trim(), resp); + if (debug && resp) { log("Response from command ('" + command + "') was:\n" + lastReply); @@ -719,7 +731,9 @@ public abstract class JalviewChimeraBinding extends jalview.api.AlignmentViewPanel alignmentv) { if (!colourBySequence || !loadingFinished) + { return; + } if (ssm == null) { return; @@ -738,12 +752,14 @@ public abstract class JalviewChimeraBinding extends for (jalview.structure.StructureMappingcommandSet cpdbbyseq : ChimeraCommands .getColourBySequenceCommand(ssm, files, sequence, sr, fr, alignment)) + { for (String cbyseq : cpdbbyseq.commands) { waitForChimera(); evalStateCommand(cbyseq, false); waitForChimera(); } + } } private void waitForChimera() @@ -767,25 +783,6 @@ public abstract class JalviewChimeraBinding extends this.colourBySequence = colourBySequence; } - public void createImage(String file, String type, int quality) - { - System.out.println("JMOL CREATE IMAGE"); - } - - public String createImage(String fileName, String type, - Object textOrBytes, int quality) - { - System.out.println("JMOL CREATE IMAGE"); - return null; - } - - public String eval(String strEval) - { - // System.out.println(strEval); - // "# 'eval' is implemented only for the applet."; - return null; - } - // End StructureListener // ////////////////////////// @@ -804,7 +801,9 @@ public abstract class JalviewChimeraBinding extends String pdbfile) { if (getModelNum(pdbfile) < 0) + { return null; + } log("get model / residue colour attribute unimplemented"); return null; } @@ -837,7 +836,9 @@ public abstract class JalviewChimeraBinding extends for (int i = 0; i < mfn.length; i++) { if (mfn[i].equalsIgnoreCase(modelFileName)) + { return i; + } } return -1; } @@ -996,8 +997,10 @@ public abstract class JalviewChimeraBinding extends String chainId; if (strInfo.indexOf(":") > -1) + { chainId = strInfo.substring(strInfo.indexOf(":") + 1, strInfo.indexOf(".")); + } else { chainId = " "; @@ -1035,7 +1038,9 @@ public abstract class JalviewChimeraBinding extends ; } if (lastMessage == null || !lastMessage.equals(strInfo)) + { ssm.mouseOverStructure(pdbResNum, chainId, pdbfilename); + } lastMessage = strInfo; } @@ -1054,13 +1059,17 @@ public abstract class JalviewChimeraBinding extends 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) { @@ -1073,12 +1082,12 @@ public abstract class JalviewChimeraBinding extends if (!atomsPicked.contains(picked)) { viewer.select(picked); - atomsPicked.addElement(picked); + atomsPicked.add(picked); } else { viewer.select("not " + picked); - atomsPicked.removeElement(picked); + atomsPicked.remove(picked); } viewerCommandHistory(true); // TODO: in application this happens @@ -1093,7 +1102,7 @@ public abstract class JalviewChimeraBinding extends // incremented every time a load notification is successfully handled - // lightweight mechanism for other threads to detect when they can start - // referrring to new structures. + // referring to new structures. private long loadNotifiesHandled = 0; public long getLoadNotifiesHandled() @@ -1119,8 +1128,8 @@ public abstract class JalviewChimeraBinding extends fileLoadingError = null; String[] oldmodels = modelFileNames; modelFileNames = null; - chainNames = new Vector(); - chainFile = new Hashtable(); + chainNames = new ArrayList(); + chainFile = new HashMap(); boolean notifyLoaded = false; String[] modelfilenames = getPdbFile(); // first check if we've lost any structures @@ -1181,7 +1190,9 @@ public abstract class JalviewChimeraBinding extends colourBySequence = false; if (cs == null) + { return; + } String res; int index; @@ -1195,7 +1206,9 @@ public abstract class JalviewChimeraBinding extends res = en.nextElement().toString(); index = ((Integer) ResidueProperties.aa3Hash.get(res)).intValue(); if (index > 20) + { continue; + } col = cs.findColour(ResidueProperties.aa[index].charAt(0)); // TODO: need colour string function and res selection here @@ -1289,21 +1302,20 @@ public abstract class JalviewChimeraBinding extends public synchronized PDBEntry[] addSequenceAndChain(PDBEntry[] pdbe, SequenceI[][] seq, String[][] chns) { - int pe = -1; - Vector v = new Vector(); - Vector rtn = new Vector(); + List v = new ArrayList(); + List rtn = new ArrayList(); for (int i = 0; i < pdbentry.length; i++) { - v.addElement(pdbentry[i]); + v.add(pdbentry[i]); } for (int i = 0; i < pdbe.length; i++) { int r = v.indexOf(pdbe[i]); if (r == -1 || r >= pdbentry.length) { - rtn.addElement(new int[] + rtn.add(new int[] { v.size(), i }); - v.addElement(pdbe[i]); + v.add(pdbe[i]); } else { @@ -1311,12 +1323,11 @@ public abstract class JalviewChimeraBinding extends addSequenceAndChain(r, seq[i], chns[i]); } } - pdbe = new PDBEntry[v.size()]; - v.copyInto(pdbe); + pdbe = v.toArray(new PDBEntry[v.size()]); pdbentry = pdbe; if (rtn.size() > 0) { - // expand the tied seuqence[] and string[] arrays + // expand the tied sequence[] and string[] arrays SequenceI[][] sqs = new SequenceI[pdbentry.length][]; String[][] sch = new String[pdbentry.length][]; System.arraycopy(sequence, 0, sqs, 0, sequence.length); @@ -1326,7 +1337,7 @@ public abstract class JalviewChimeraBinding extends pdbe = new PDBEntry[rtn.size()]; for (int r = 0; r < pdbe.length; r++) { - int[] stri = ((int[]) rtn.elementAt(r)); + int[] stri = (rtn.get(r)); // record the pdb file as a new addition pdbe[r] = pdbentry[stri[0]]; // and add the new sequence/chain entries @@ -1340,9 +1351,14 @@ public abstract class JalviewChimeraBinding extends return pdbe; } + /** + * Adds sequences to the pe'th pdbentry's sequence set. + * + * @param pe + * @param seq + */ public void addSequence(int pe, SequenceI[] seq) { - // add sequences to the pe'th pdbentry's seuqence set. addSequenceAndChain(pe, seq, null); } @@ -1350,11 +1366,14 @@ public abstract class JalviewChimeraBinding extends { if (pe < 0 || pe >= pdbentry.length) { - throw new Error(MessageManager.formatMessage("error.implementation_error_no_pdbentry_from_index", new String[]{Integer.valueOf(pe).toString()})); + throw new Error(MessageManager.formatMessage( + "error.implementation_error_no_pdbentry_from_index", + new Object[] + { Integer.valueOf(pe).toString() })); } final String nullChain = "TheNullChain"; - Vector s = new Vector(); - Vector c = new Vector(); + List s = new ArrayList(); + List c = new ArrayList(); if (chains == null) { chains = new String[pdbentry.length][]; @@ -1363,23 +1382,23 @@ public abstract class JalviewChimeraBinding extends { for (int i = 0; i < sequence[pe].length; i++) { - s.addElement(sequence[pe][i]); + s.add(sequence[pe][i]); if (chains[pe] != null) { if (i < chains[pe].length) { - c.addElement(chains[pe][i]); + c.add(chains[pe][i]); } else { - c.addElement(nullChain); + c.add(nullChain); } } else { if (tchain != null && tchain.length > 0) { - c.addElement(nullChain); + c.add(nullChain); } } } @@ -1388,20 +1407,18 @@ public abstract class JalviewChimeraBinding extends { if (!s.contains(seq[i])) { - s.addElement(seq[i]); + s.add(seq[i]); if (tchain != null && i < tchain.length) { - c.addElement(tchain[i] == null ? nullChain : tchain[i]); + c.add(tchain[i] == null ? nullChain : tchain[i]); } } } - SequenceI[] tmp = new SequenceI[s.size()]; - s.copyInto(tmp); + SequenceI[] tmp = s.toArray(new SequenceI[s.size()]); sequence[pe] = tmp; if (c.size() > 0) { - String[] tch = new String[c.size()]; - c.copyInto(tch); + String[] tch = c.toArray(new String[c.size()]); for (int i = 0; i < tch.length; i++) { if (tch[i] == nullChain)