2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Software
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.gui;
\r
21 import java.util.regex.*;
\r
24 import javax.swing.*;
\r
25 import javax.swing.event.*;
\r
26 import java.awt.event.*;
\r
29 import jalview.jbgui.GStructureViewer;
\r
30 import jalview.datamodel.*;
\r
31 import jalview.gui.*;
\r
32 import jalview.structure.*;
\r
33 import jalview.datamodel.PDBEntry;
\r
34 import jalview.io.*;
\r
36 import org.jmol.api.*;
\r
37 import org.jmol.adapter.smarter.SmarterJmolAdapter;
\r
38 import org.jmol.popup.*;
\r
41 public class AppJMol
\r
42 extends GStructureViewer
\r
43 implements StructureListener, JmolStatusListener, Runnable
\r
47 JmolPopup jmolpopup;
\r
48 ScriptWindow scriptWindow;
\r
50 SequenceI[] sequence;
\r
51 StructureSelectionManager ssm;
\r
52 RenderPanel renderPanel;
\r
54 String fileLoadingError;
\r
56 public AppJMol(PDBEntry pdbentry, SequenceI[] seq, AlignmentPanel ap)
\r
58 //////////////////////////////////
\r
59 //Is the pdb file already loaded?
\r
60 String alreadyMapped = StructureSelectionManager
\r
61 .getStructureSelectionManager()
\r
62 .alreadyMappedToFile(pdbentry.getId());
\r
63 if (alreadyMapped != null)
\r
65 int option = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
\r
66 pdbentry.getId() + " is already displayed."
\r
67 + "\nDo you want to map sequences to the visible structure?",
\r
68 "Map Sequences to Visible Window: " + pdbentry.getId(),
\r
69 JOptionPane.YES_NO_OPTION);
\r
71 if (option == JOptionPane.YES_OPTION)
\r
73 StructureSelectionManager.getStructureSelectionManager()
\r
74 .setMapping(seq, alreadyMapped, AppletFormatAdapter.FILE);
\r
78 ///////////////////////////////////
\r
81 this.pdbentry = pdbentry;
\r
82 this.sequence = seq;
\r
84 renderPanel = new RenderPanel();
\r
85 this.getContentPane().add(renderPanel, java.awt.BorderLayout.CENTER);
\r
87 jalview.gui.Desktop.addInternalFrame(this, "Loading File", 400, 400);
\r
89 if (pdbentry.getFile() != null)
\r
95 Thread worker = new Thread(this);
\r
99 this.addInternalFrameListener(new InternalFrameAdapter()
\r
101 public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
\r
110 StringBuffer title = new StringBuffer(sequence[0].getName() + ":" +
\r
113 if (pdbentry.getProperty() != null)
\r
115 if (pdbentry.getProperty().get("method") != null)
\r
117 title.append(" Method: ");
\r
118 title.append(pdbentry.getProperty().get("method"));
\r
120 if (pdbentry.getProperty().get("chains") != null)
\r
122 title.append(" Chain:");
\r
123 title.append(pdbentry.getProperty().get("chains"));
\r
127 this.setTitle(title.toString());
\r
129 viewer = org.jmol.api.JmolViewer.allocateViewer(renderPanel,
\r
130 new SmarterJmolAdapter());
\r
132 viewer.setAppletContext("", null, null, "");
\r
134 viewer.setJmolStatusListener(this);
\r
136 scriptWindow = new ScriptWindow(viewer);
\r
138 jmolpopup = JmolPopup.newJmolPopup(viewer);
\r
140 viewer.openFile(pdbentry.getFile());
\r
145 void setChainMenuItems(Vector chains)
\r
147 chainMenu.removeAll();
\r
149 JMenuItem menuItem = new JMenuItem("All");
\r
150 menuItem.addActionListener(new ActionListener()
\r
152 public void actionPerformed(ActionEvent evt)
\r
154 allChainsSelected = true;
\r
155 for(int i=0; i<chainMenu.getItemCount(); i++)
\r
157 if (chainMenu.getItem(i) instanceof JCheckBoxMenuItem)
\r
158 ( (JCheckBoxMenuItem) chainMenu.getItem(i)).setSelected(true);
\r
161 allChainsSelected = false;
\r
165 chainMenu.add(menuItem);
\r
167 for (int c = 0; c < chains.size(); c++)
\r
169 menuItem = new JCheckBoxMenuItem(chains.elementAt(c).toString(), true);
\r
170 menuItem.addItemListener(new ItemListener()
\r
172 public void itemStateChanged(ItemEvent evt)
\r
174 if (!allChainsSelected)
\r
179 chainMenu.add(menuItem);
\r
183 boolean allChainsSelected = false;
\r
184 void centerViewer()
\r
186 StringBuffer cmd = new StringBuffer();
\r
187 for(int i=0; i<chainMenu.getItemCount(); i++)
\r
189 if (chainMenu.getItem(i) instanceof JCheckBoxMenuItem)
\r
191 JCheckBoxMenuItem item = (JCheckBoxMenuItem) chainMenu.getItem(i);
\r
192 if(item.isSelected())
\r
193 cmd.append(":"+item.getText()+" or ");
\r
197 if (cmd.length() > 0)
\r
198 cmd.setLength(cmd.length() - 4);
\r
200 viewer.evalStringQuiet("select *;restrict "
\r
201 +cmd+";cartoon;center "+cmd);
\r
206 viewer.setModeMouse(org.jmol.viewer.JmolConstants.MOUSE_NONE);
\r
207 viewer.evalStringQuiet("zap");
\r
208 viewer.setJmolStatusListener(null);
\r
211 //We'll need to find out what other
\r
212 // listeners need to be shut down in Jmol
\r
213 StructureSelectionManager
\r
214 .getStructureSelectionManager()
\r
215 .removeStructureViewerListener(this, pdbentry.getFile());
\r
222 EBIFetchClient ebi = new EBIFetchClient();
\r
223 String query = "pdb:" + pdbentry.getId();
\r
224 pdbentry.setFile(ebi.fetchDataAsFile(query, "default", "raw")
\r
225 .getAbsolutePath());
\r
228 catch (Exception ex)
\r
230 ex.printStackTrace();
\r
234 public void pdbFile_actionPerformed(ActionEvent actionEvent)
\r
236 JalviewFileChooser chooser = new JalviewFileChooser(
\r
237 jalview.bin.Cache.getProperty(
\r
238 "LAST_DIRECTORY"));
\r
240 chooser.setFileView(new JalviewFileView());
\r
241 chooser.setDialogTitle("Save PDB File");
\r
242 chooser.setToolTipText("Save");
\r
244 int value = chooser.showSaveDialog(this);
\r
246 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
250 BufferedReader in = new BufferedReader(new FileReader(pdbentry.getFile()));
\r
251 File outFile = chooser.getSelectedFile();
\r
253 PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
\r
255 while ( (data = in.readLine()) != null)
\r
258 ! (data.indexOf("<PRE>") > -1 || data.indexOf("</PRE>") > -1)
\r
266 catch (Exception ex)
\r
268 ex.printStackTrace();
\r
273 public void viewMapping_actionPerformed(ActionEvent actionEvent)
\r
275 jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();
\r
276 jalview.gui.Desktop.addInternalFrame(cap, "PDB - Sequence Mapping", 550,
\r
279 StructureSelectionManager.getStructureSelectionManager().printMapping(
\r
280 pdbentry.getFile())
\r
287 * @param e DOCUMENT ME!
\r
289 public void eps_actionPerformed(ActionEvent e)
\r
291 makePDBImage(jalview.util.ImageMaker.EPS);
\r
297 * @param e DOCUMENT ME!
\r
299 public void png_actionPerformed(ActionEvent e)
\r
301 makePDBImage(jalview.util.ImageMaker.PNG);
\r
304 void makePDBImage(int type)
\r
306 int width = getWidth();
\r
307 int height = getHeight();
\r
309 jalview.util.ImageMaker im;
\r
311 if (type == jalview.util.ImageMaker.PNG)
\r
313 im = new jalview.util.ImageMaker(this,
\r
314 jalview.util.ImageMaker.PNG,
\r
315 "Make PNG image from view",
\r
321 im = new jalview.util.ImageMaker(this,
\r
322 jalview.util.ImageMaker.EPS,
\r
323 "Make EPS file from view",
\r
325 null, this.getTitle());
\r
328 if (im.getGraphics() != null)
\r
330 Rectangle rect = new Rectangle(width, height);
\r
331 viewer.renderScreenImage(im.getGraphics(),
\r
332 rect.getSize(), rect);
\r
337 //////////////////////////////////
\r
338 ///StructureListener
\r
339 public String getPdbFile()
\r
341 return pdbentry.getFile();
\r
344 Pattern pattern = Pattern.compile(
\r
345 "\\[(.*)\\]([0-9]+)(:[a-zA-Z]*)?\\.([a-zA-Z]+)(/[0-9]*)?"
\r
348 String lastMessage;
\r
349 public void mouseOverStructure(int atomIndex, String strInfo)
\r
351 Matcher matcher = pattern.matcher(strInfo);
\r
354 int pdbResNum = Integer.parseInt(matcher.group(2));
\r
355 String chainId = matcher.group(3);
\r
357 if (chainId != null)
\r
358 chainId = chainId.substring(1, chainId.length());
\r
364 if (lastMessage == null || !lastMessage.equals(strInfo))
\r
365 ssm.mouseOverStructure(pdbResNum, chainId, pdbentry.getFile());
\r
367 lastMessage = strInfo;
\r
370 StringBuffer resetLastRes = new StringBuffer();
\r
371 StringBuffer eval = new StringBuffer();
\r
373 public void highlightAtom(int atomIndex, int pdbResNum, String chain, String pdbfile)
\r
375 if (!pdbfile.equals(pdbentry.getFile()))
\r
378 if (resetLastRes.length() > 0)
\r
380 viewer.evalStringQuiet(resetLastRes.toString());
\r
384 eval.append("select " + pdbResNum);
\r
386 resetLastRes.setLength(0);
\r
387 resetLastRes.append("select " + pdbResNum);
\r
389 if (!chain.equals(" "))
\r
391 eval.append(":" + chain);
\r
392 resetLastRes.append(":" + chain);
\r
395 eval.append(";color gold;wireframe 100");
\r
397 Color col = new Color(viewer.getAtomArgb(atomIndex));
\r
399 resetLastRes.append(";color["
\r
400 + col.getRed() + ","
\r
401 + col.getGreen() + ","
\r
402 + col.getBlue() + "];wireframe 0");
\r
404 viewer.evalStringQuiet(eval.toString());
\r
408 public void updateColours(Object source)
\r
410 colourBySequence( (AlignmentPanel) source);
\r
413 //End StructureListener
\r
414 ////////////////////////////
\r
416 FeatureRenderer fr;
\r
417 public void colourBySequence(AlignmentPanel ap)
\r
419 StructureMapping[] mapping = ssm.getMapping(pdbentry.getFile());
\r
421 if (mapping.length < 1)
\r
424 SequenceRenderer sr = ap.seqPanel.seqCanvas.getSequenceRenderer();
\r
426 boolean showFeatures = false;
\r
427 if (ap.av.showSequenceFeatures)
\r
429 showFeatures = true;
\r
432 fr = new jalview.gui.FeatureRenderer(ap.av);
\r
435 fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer());
\r
438 StringBuffer command = new StringBuffer();
\r
441 for (int s = 0; s < sequence.length; s++)
\r
443 for (int m = 0; m < mapping.length; m++)
\r
445 if (mapping[m].getSequence() == sequence[s])
\r
447 for (int r = 0; r < sequence[s].getLength(); r++)
\r
449 int pos = mapping[m].getPDBResNum(
\r
450 sequence[s].findPosition(r));
\r
452 if (pos < 1 || pos==lastPos)
\r
457 command.append(";select " + pos);
\r
459 if (!mapping[m].getChain().equals(" "))
\r
461 command.append(":" + mapping[m].getChain());
\r
464 Color col = sr.getResidueBoxColour(sequence[s], r);
\r
467 col = fr.findFeatureColour(col, sequence[s], r);
\r
469 command.append("; color ["
\r
470 + col.getRed() + ","
\r
471 + col.getGreen() + ","
\r
472 + col.getBlue() + "]");
\r
479 viewer.evalStringQuiet(command.toString());
\r
482 /////////////////////////////////
\r
483 //JmolStatusListener
\r
485 public String eval(String strEval)
\r
487 // System.out.println(strEval);
\r
488 //"# 'eval' is implemented only for the applet.";
\r
492 public void createImage(String file, String type, int quality)
\r
494 System.out.println("JMOL CREATE IMAGE");
\r
497 public void setCallbackFunction(String callbackType,
\r
498 String callbackFunction)
\r
501 public void notifyFileLoaded(String fullPathName, String fileName,
\r
502 String modelName, Object clientFile,
\r
507 fileLoadingError = errorMsg;
\r
512 fileLoadingError = null;
\r
514 if (fileName != null)
\r
518 ssm = StructureSelectionManager.getStructureSelectionManager();
\r
519 MCview.PDBfile pdbFile = ssm.setMapping(sequence, pdbentry.getFile(), AppletFormatAdapter.FILE);
\r
520 ssm.addStructureViewerListener(this);
\r
522 Vector chains = new Vector();
\r
523 for(int i=0; i<pdbFile.chains.size(); i++)
\r
525 chains.addElement(((MCview.PDBChain)pdbFile.chains.elementAt(i)).id);
\r
527 setChainMenuItems(chains);
\r
529 jmolpopup.updateComputedMenus();
\r
530 viewer.evalStringQuiet(
\r
531 "select backbone;restrict;cartoon;wireframe off;spacefill off");
\r
533 colourBySequence(ap);
\r
539 public void notifyFrameChanged(int frameNo)
\r
541 boolean isAnimationRunning = (frameNo <= -2);
\r
544 public void notifyScriptStart(String statusMessage, String additionalInfo)
\r
547 public void sendConsoleEcho(String strEcho)
\r
549 if (scriptWindow != null)
\r
550 scriptWindow.sendConsoleEcho(strEcho);
\r
553 public void sendConsoleMessage(String strStatus)
\r
555 if (scriptWindow != null)
\r
556 scriptWindow.sendConsoleMessage(strStatus);
\r
559 public void notifyScriptTermination(String strStatus, int msWalltime)
\r
561 if (scriptWindow != null)
\r
562 scriptWindow.notifyScriptTermination(strStatus, msWalltime);
\r
565 public void handlePopupMenu(int x, int y)
\r
567 jmolpopup.show(x, y);
\r
570 public void notifyNewPickingModeMeasurement(int iatom, String strMeasure)
\r
572 notifyAtomPicked(iatom, strMeasure);
\r
575 public void notifyNewDefaultModeMeasurement(int count, String strInfo)
\r
578 public void notifyAtomPicked(int atomIndex, String strInfo)
\r
580 if (scriptWindow != null)
\r
582 scriptWindow.sendConsoleMessage(strInfo);
\r
583 scriptWindow.sendConsoleMessage("\n");
\r
587 public void notifyAtomHovered(int atomIndex, String strInfo)
\r
589 mouseOverStructure(atomIndex, strInfo);
\r
592 public void sendSyncScript(String script, String appletName)
\r
595 public void showUrl(String url)
\r
598 public void showConsole(boolean showConsole)
\r
600 final String title = "Jmol Script Window for: "+this.getTitle();
\r
601 if (scriptWindow == null)
\r
605 javax.swing.SwingUtilities.invokeLater(new Runnable()
\r
609 jalview.gui.Desktop.addInternalFrame(scriptWindow,
\r
618 scriptWindow.setVisible(false);
\r
621 public float functionXY(String functionName, int x, int y)
\r
626 ///End JmolStatusListener
\r
627 ///////////////////////////////
\r
633 final Dimension currentSize = new Dimension();
\r
634 final Rectangle rectClip = new Rectangle();
\r
636 public void paintComponent(Graphics g)
\r
638 getSize(currentSize);
\r
639 g.getClipBounds(rectClip);
\r
641 if (viewer == null)
\r
643 g.setColor(Color.black);
\r
644 g.fillRect(0, 0, currentSize.width, currentSize.height);
\r
645 g.setColor(Color.white);
\r
646 g.setFont(new Font("Verdana", Font.BOLD, 14));
\r
647 g.drawString("Retrieving PDB data....", 20, currentSize.height / 2);
\r
649 else if(fileLoadingError!=null)
\r
651 g.setColor(Color.black);
\r
652 g.fillRect(0, 0, currentSize.width, currentSize.height);
\r
653 g.setColor(Color.white);
\r
654 g.setFont(new Font("Verdana", Font.BOLD, 14));
\r
655 g.drawString("Error loading file..." + pdbentry.getId(), 20,
\r
656 currentSize.height / 2);
\r
660 viewer.renderScreenImage(g, currentSize, rectClip);
\r