BioJava:CookBook:PDB:Jmol
How to interact with Jmol
Jmol is a popular open source 3D viewer written in Java. This example demonstrates how you can send a BioJava structure object to Jmol. This can be used e.g. to visualize a protein structure alignment as calculated with <BioJava:CookBook:PDB:alignGUI>.
The BiojavaJmol class provides a simple display of a Structure object, if Jmol is on the classpath.
```java public static void main(String[] args){
try {
PDBFileReader pdbr = new PDBFileReader();
pdbr.setPath("/Path/To/PDBFiles/");
String pdbCode = "5pti";
Structure struc = pdbr.getStructureById(pdbCode);
BiojavaJmol jmolPanel = new BiojavaJmol();
jmolPanel.setStructure(struc);
// send some RASMOL style commands to Jmol
jmolPanel.evalString("select * ; color chain;");
jmolPanel.evalString("select *; spacefill off; wireframe off; backbone 0.4; ");
} catch (Exception e){
e.printStackTrace();
}
}
Longer Example
==============
This example shows how you can Integrate Jmol into your appication
together with BioJava
```java /\*
Jmol.jar needs to be in your classpath for this example to work. You can
get it from <http://jmol.sourceforge.net>
- /
package org.biojava.jmoltest;
import java.awt.Container; import java.awt.Dimension; import
java.awt.Graphics; import java.awt.Rectangle; import
java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import
javax.swing.JFrame; import javax.swing.JPanel; import
org.biojava.nbio.structure.Structure; import
org.biojava.nbio.structure.io.PDBFileReader; import
org.jmol.adapter.smarter.SmarterJmolAdapter; import
org.jmol.api.JmolAdapter; import org.jmol.api.JmolSimpleViewer;
public class SimpleJmolExample {
` JmolSimpleViewer viewer;`
` Structure structure; `
` JmolPanel jmolPanel;`
` JFrame frame ;`
` public static void main(String[] args){`
` try {`
` PDBFileReader pdbr = new PDBFileReader(); `
` pdbr.setPath("/Path/To/PDBFiles/");`
` String pdbCode = "5pti";`
` Structure struc = pdbr.getStructureById(pdbCode);`
` SimpleJmolExample ex = new SimpleJmolExample();`
` ex.setStructure(struc);`
` `
` `
` } catch (Exception e){`
` e.printStackTrace();`
` }`
` }`
` public SimpleJmolExample() {`
` frame = new JFrame();`
` frame.addWindowListener(new ApplicationCloser());`
` Container contentPane = frame.getContentPane();`
` jmolPanel = new JmolPanel();`
` `
` jmolPanel.setPreferredSize(new Dimension(200,200));`
` contentPane.add(jmolPanel);`
` frame.pack();`
` frame.setVisible(true); `
` }`
` public void setStructure(Structure s) {`
` `
` frame.setName(s.getPDBCode());`
` // actually this is very simple`
` // just convert the structure to a PDB file`
` `
` String pdb = s.toPDB();`
` `
` structure = s;`
` JmolSimpleViewer viewer = jmolPanel.getViewer();`
` // Jmol could also read the file directly from your file system`
` //viewer.openFile("/Path/To/PDB/1tim.pdb");`
` `
` // send the PDB file to Jmol.`
` // there are also other ways to interact with Jmol, but they require more`
` // code. See the link to SPICE above...`
` viewer.openStringInline(pdb);`
` viewer.evalString("select *; spacefill off; wireframe off; backbone 0.4; ");`
` viewer.evalString("color chain; ");`
` this.viewer = viewer;`
` }`
` public void setTitle(String label){`
` frame.setTitle(label);`
` }`
` public JmolSimpleViewer getViewer(){`
` return jmolPanel.getViewer();`
` }`
` static class ApplicationCloser extends WindowAdapter {`
` public void windowClosing(WindowEvent e) {`
` System.exit(0);`
` }`
` }`
` static class JmolPanel extends JPanel {`
` /**`
` * `
` */`
` private static final long serialVersionUID = -3661941083797644242L;`
` JmolSimpleViewer viewer;`
` JmolAdapter adapter;`
` JmolPanel() {`
` adapter = new SmarterJmolAdapter();`
` viewer = JmolSimpleViewer.allocateSimpleViewer(this, adapter);`
` `
` }`
` public JmolSimpleViewer getViewer() {`
` return viewer;`
` }`
` public void executeCmd(String rasmolScript){`
` viewer.evalString(rasmolScript);`
` }`
` final Dimension currentSize = new Dimension();`
` final Rectangle rectClip = new Rectangle();`
` public void paint(Graphics g) {`
` getSize(currentSize);`
` g.getClipBounds(rectClip);`
` viewer.renderScreenImage(g, currentSize, rectClip);`
` }`
` }`
}
For a more complex example that includes a number of classes that interact with Jmol on a deeper level see the SVN repository of SPICE