BioJava:CookBook:PDB:Jmol

From BioJava
Jump to: navigation, search

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.

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

/* 
 
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.bio.structure.Structure;
import org.biojava.bio.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

Personal tools
Variants
Actions
Documentation
Community
Toolbox