From 25f2fb2e55f8a0db9f3b22781a5bcfb3fbb1bf0e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 19 Jul 2010 11:39:07 +0200 Subject: initial cdk structure visualizer added --- application.rb | 22 +++++++-- public/java/Display.java | 125 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 public/java/Display.java diff --git a/application.rb b/application.rb index 6a7e4c6..cc0279b 100644 --- a/application.rb +++ b/application.rb @@ -1,9 +1,25 @@ +# Java environment +ENV["JAVA_HOME"] = "/usr/lib/jvm/java-6-sun" unless ENV["JAVA_HOME"] +java_dir = File.join File.expand_path(File.dirname(__FILE__)),"public/java" +cdk = File.join java_dir, "cdk-1.3.5.jar" +jchempaint = File.join java_dir, "cdk-jchempaint-15.jar" +ENV["CLASSPATH"] = "#{ENV["CLASSPATH"]}:#{java_dir}:#{cdk}:#{jchempaint}" + require 'rubygems' +require 'rjb' gem "opentox-ruby-api-wrapper", "= 1.5.7" require 'opentox-ruby-api-wrapper' -set :lock, true -CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" +#set :lock, true + +get %r{/(.+)/image} do |inchi| # catches all remaining get requests + + smiles = OpenTox::Compound.new(:inchi => inchi).smiles + content_type "image/png" + attachment "#{smiles}.png" + Rjb::import('Display').new(smiles,600).image + +end get %r{/(.+)} do |inchi| # catches all remaining get requests inchi = URI.unescape request.env['REQUEST_URI'].sub(/^\//,'').sub(/.*compound\//,'') # hack to avoid sinatra's URI/CGI unescaping, splitting, ..." @@ -28,7 +44,7 @@ get %r{/(.+)} do |inchi| # catches all remaining get requests OpenTox::Compound.new(:inchi => inchi).png when "text/plain" response['Content-Type'] = "text/plain" - uri = File.join CACTUS_URI,inchi,"names" + uri = File.join @@cactus_uri,inchi,"names" RestClient.get(uri).body else halt 400, "Unsupported MIME type '#{request.env['HTTP_ACCEPT']}'" diff --git a/public/java/Display.java b/public/java/Display.java new file mode 100644 index 0000000..4a3e221 --- /dev/null +++ b/public/java/Display.java @@ -0,0 +1,125 @@ +import java.util.List; +import java.util.Arrays; +import java.util.*; +import java.io.*; + +import java.awt.*; +import java.awt.image.*; +import java.awt.geom.*; + +import javax.imageio.*; + +import org.openscience.cdk.*; +import org.openscience.cdk.interfaces.*; +import org.openscience.cdk.layout.*; +import org.openscience.cdk.renderer.*; +import org.openscience.cdk.renderer.font.*; +import org.openscience.cdk.renderer.generators.*; +import org.openscience.cdk.renderer.visitor.*; +import org.openscience.cdk.templates.*; +import org.openscience.cdk.smiles.*; +import org.openscience.cdk.smiles.smarts.*; +import org.openscience.cdk.graph.*; +import org.openscience.cdk.geometry.*; + +public class Display{ + + int size; + Rectangle drawArea; + IMolecule molecule = new Molecule(); + IMoleculeSet moleculeSet; + IMolecule[] coordinated_mols; + StructureDiagramGenerator sdg = new StructureDiagramGenerator(); + SmilesParser sp = new SmilesParser(DefaultChemObjectBuilder.getInstance()); + AtomContainer matches = new AtomContainer(); + Vector idlist = new Vector(); + List generators = new ArrayList(); + Renderer renderer; + BufferedImage image; + Graphics2D g2; + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + public Display (String smiles, int s) { + + size = s; + // generators make the image elements + generators.add(new BasicSceneGenerator()); + generators.add(new BasicBondGenerator()); + generators.add(new RingGenerator()); + generators.add(new BasicAtomGenerator()); + renderer = new Renderer(generators, new AWTFontManager()); + try { molecule = sp.parseSmiles(smiles); } + catch (Exception ex) { ex.printStackTrace(); } + moleculeSet = ConnectivityChecker.partitionIntoMolecules(molecule); + coordinated_mols = new IMolecule[moleculeSet.getMoleculeCount()]; + drawArea = new Rectangle(size, size); + image = new BufferedImage(size, size , BufferedImage.TYPE_INT_RGB); + g2 = (Graphics2D)image.getGraphics(); + g2.setColor(Color.yellow); + g2.fillRect(0, 0, size, size); + } + + public byte[] image() { + try { + Rectangle2D last = new Rectangle(0,0); + for (int i = 0; i < moleculeSet.getMoleculeCount(); i++) { + IAtomContainer mol = moleculeSet.getMolecule(i); + sdg.setMolecule((IMolecule) mol); + sdg.generateCoordinates(); + mol = sdg.getMolecule(); + GeometryTools.translateAllPositive(mol); + + // get size of previous mol and shift + last = GeometryTools.shiftContainer(mol, GeometryTools.getRectangle2D(mol), last,2); + coordinated_mols[i] = (IMolecule) mol; + } + moleculeSet.setMolecules(coordinated_mols); + renderer.paintMoleculeSet(moleculeSet, new AWTDrawVisitor(g2), drawArea, true); + //matchSmarts("NN",Color.green); + ImageIO.write(image, "png", out); + } catch (Exception ex) { + ex.printStackTrace(); + } + return out.toByteArray(); + } + +// public Image match(String smiles, String smarts) { +// } + private void matchSmarts(String smarts, Color color) { + try { + // map smarts + SMARTSQueryTool querytool = new SMARTSQueryTool(smarts); + boolean status = querytool.matches(molecule); + if (status) { + List> mappings = querytool.getMatchingAtoms(); + int nmatch = querytool.countMatches(); + for (int i = 0; i < nmatch; i++) { + List atomIndices = (List) mappings.get(i); + for (int n = 0; n < atomIndices.size(); n++) { + Integer atomID = (Integer) atomIndices.get(n); + idlist.add(atomID); + } + } + } + + // get a unique list of bond ID's and add them to an AtomContainer + HashSet hs = new HashSet(idlist); + for (Integer h : hs) { + IAtom a = molecule.getAtom(h); + List bond_list = molecule.getConnectedBondsList(a); + for (int i = 0; i < bond_list.size(); i++) { + IBond b = (IBond) bond_list.get(i); + Integer connectedNr = molecule.getAtomNumber(b.getConnectedAtom(a)); + //if (hs.contains(connectedNr)) renderer.getRenderer2DModel().getColorHash().put(b, color); + } + } + + } catch (Exception exc) { + exc.printStackTrace(); + } + + } + +} + -- cgit v1.2.3