From eecee560ffd6afccde7b0c383b42b67a9d18993c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 22 Jul 2010 18:20:05 +0200 Subject: matching of fragemnt sets implemented --- application.rb | 131 +++++++++++++++++++------------------- public/java/Structure.java | 154 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 222 insertions(+), 63 deletions(-) create mode 100644 public/java/Structure.java diff --git a/application.rb b/application.rb index b8b1d04..e0e469d 100644 --- a/application.rb +++ b/application.rb @@ -10,81 +10,86 @@ require 'rjb' gem "opentox-ruby-api-wrapper", "= 1.6.0" require 'opentox-ruby-api-wrapper' -get %r{/smiles/(.+)/smarts/(.*)} do |smiles,smarts| - content_type "image/png" - attachment "#{smiles}.png" - #LOGGER.debug "SMILES: #{smiles}, SMARTS: #{smarts}" - s = Rjb::import('Structure').new(smiles,200) - s.match(smarts) - s.show +post "/display" do + content_type "image/png" + attachment "#{params["smiles"]}.png" + s = Rjb::import('Structure').new(params["smiles"],200) + s.match_activating(params["smarts"]) + s.match_deactivating(["CC"]) + s.show end +get %r{/smiles/(.+)/smarts/(.*)} do |smiles,smarts| + content_type "image/png" + attachment "#{smiles}.png" + s = Rjb::import('Structure').new(smiles,200) + s.match(smarts) + s.show +end get %r{/smiles/(.+)} do |smiles| - content_type "image/png" - attachment "#{smiles}.png" - Rjb::import('Structure').new(smiles,200).show + content_type "image/png" + attachment "#{smiles}.png" + Rjb::import('Structure').new(smiles,200).show end 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('Structure').new(smiles,200).show - + smiles = OpenTox::Compound.new(:inchi => inchi).smiles + content_type "image/png" + attachment "#{smiles}.png" + Rjb::import('Structure').new(smiles,200).show 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, ..." - case request.env['HTTP_ACCEPT'] - when "*/*" - response['Content-Type'] = "chemical/x-daylight-smiles" - OpenTox::Compound.new(:inchi => inchi).smiles - when "chemical/x-daylight-smiles" - response['Content-Type'] = "chemical/x-daylight-smiles" - OpenTox::Compound.new(:inchi => inchi).smiles - when "chemical/x-inchi" - response['Content-Type'] = "chemical/x-inchi" - inchi - when "chemical/x-mdl-sdfile" - response['Content-Type'] = "chemical/x-mdl-sdfile" - OpenTox::Compound.new(:inchi => inchi).sdf - when "image/gif" - response['Content-Type'] = "image/gif" - OpenTox::Compound.new(:inchi => inchi).gif - when "image/png" - response['Content-Type'] = "image/png" - OpenTox::Compound.new(:inchi => inchi).png - when "text/plain" - response['Content-Type'] = "text/plain" - uri = File.join @@cactus_uri,inchi,"names" - RestClient.get(uri).body - else - halt 400, "Unsupported MIME type '#{request.env['HTTP_ACCEPT']}'" - end + inchi = URI.unescape request.env['REQUEST_URI'].sub(/^\//,'').sub(/.*compound\//,'') # hack to avoid sinatra's URI/CGI unescaping, splitting, ..." + case request.env['HTTP_ACCEPT'] + when "*/*" + response['Content-Type'] = "chemical/x-daylight-smiles" + OpenTox::Compound.new(:inchi => inchi).smiles + when "chemical/x-daylight-smiles" + response['Content-Type'] = "chemical/x-daylight-smiles" + OpenTox::Compound.new(:inchi => inchi).smiles + when "chemical/x-inchi" + response['Content-Type'] = "chemical/x-inchi" + inchi + when "chemical/x-mdl-sdfile" + response['Content-Type'] = "chemical/x-mdl-sdfile" + OpenTox::Compound.new(:inchi => inchi).sdf + when "image/gif" + response['Content-Type'] = "image/gif" + OpenTox::Compound.new(:inchi => inchi).gif + when "image/png" + response['Content-Type'] = "image/png" + OpenTox::Compound.new(:inchi => inchi).png + when "text/plain" + response['Content-Type'] = "text/plain" + uri = File.join @@cactus_uri,inchi,"names" + RestClient.get(uri).body + else + halt 400, "Unsupported MIME type '#{request.env['HTTP_ACCEPT']}'" + end end post '/?' do - input = request.env["rack.input"].read - response['Content-Type'] = 'text/uri-list' - begin - case request.content_type - when /chemical\/x-daylight-smiles/ - OpenTox::Compound.new(:smiles => input).uri + "\n" - when /chemical\/x-inchi/ - OpenTox::Compound.new(:inchi => input).uri + "\n" - when /chemical\/x-mdl-sdfile|chemical\/x-mdl-molfile/ - OpenTox::Compound.new(:sdf => input).uri + "\n" - when /text\/plain/ - OpenTox::Compound.new(:name => input).uri + "\n" - else - status 400 - "Unsupported MIME type '#{request.content_type}'" - end - rescue - status 400 - "Cannot process request '#{input}' for content type '#{request.content_type}'" - end + input = request.env["rack.input"].read + response['Content-Type'] = 'text/uri-list' + begin + case request.content_type + when /chemical\/x-daylight-smiles/ + OpenTox::Compound.new(:smiles => input).uri + "\n" + when /chemical\/x-inchi/ + OpenTox::Compound.new(:inchi => input).uri + "\n" + when /chemical\/x-mdl-sdfile|chemical\/x-mdl-molfile/ + OpenTox::Compound.new(:sdf => input).uri + "\n" + when /text\/plain/ + OpenTox::Compound.new(:name => input).uri + "\n" + else + status 400 + "Unsupported MIME type '#{request.content_type}'" + end + rescue + status 400 + "Cannot process request '#{input}' for content type '#{request.content_type}'" + end end diff --git a/public/java/Structure.java b/public/java/Structure.java new file mode 100644 index 0000000..e1b2fa6 --- /dev/null +++ b/public/java/Structure.java @@ -0,0 +1,154 @@ +import java.util.List; +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.renderer.selection.*; +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 Structure{ + + int size; + Rectangle drawArea; + IMolecule molecule = new Molecule(); + IMoleculeSet moleculeSet; + IMolecule[] coordinated_mols; + StructureDiagramGenerator sdg = new StructureDiagramGenerator(); + SmilesParser sp = new SmilesParser(DefaultChemObjectBuilder.getInstance()); + Vector idlist = new Vector(); + List generators = new ArrayList(); + Renderer renderer; + BufferedImage image; + Graphics2D g2; + MoleculeSet highBSet = new MoleculeSet(); + ChemModel chemModel = new ChemModel(); + LogicalSelection selection = new LogicalSelection(LogicalSelection.Type.ALL); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + public Structure (String smiles, int s) { + + size = s; + // generators make the image elements + generators.add(new BasicSceneGenerator()); + generators.add(new RingGenerator()); + generators.add(new BasicBondGenerator()); + generators.add(new BasicAtomGenerator()); + //generators.add(new AtomNumberGenerator()); + generators.add(new SelectBondGenerator()); + generators.add(new SelectAtomGenerator()); + 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.WHITE); + g2.fillRect(0, 0, size, size); + layout(); + } + + public byte[] show() { + + try { + + renderer.paintMoleculeSet(moleculeSet, new AWTDrawVisitor(g2), drawArea, true); + ImageIO.write(image, "png", out); + } catch (Exception ex) { + ex.printStackTrace(); + } + return out.toByteArray(); + } + + private void layout() { + 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); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + public void match_activating(String[] smarts) { + Color color = Color.RED; + for (int i = 0; i < smarts.length; i++) { + match(smarts[i], color); + } + } + + public void match_deactivating(String[] smarts) { + Color color = Color.GREEN; + for (int i = 0; i < smarts.length; i++) { + match(smarts[i], color); + } + } + + public void match(String smarts, Color color) { + try { + SMARTSQueryTool querytool = new SMARTSQueryTool(smarts); + // iterate over molecule set + for (int i = 0; i < moleculeSet.getMoleculeCount(); i++) { + IAtomContainer mol = moleculeSet.getMolecule(i); + ChemModel fragment = new ChemModel(); + // match smarts + boolean status = querytool.matches(mol); + if (status) { + List matches = querytool.getUniqueMatchingAtoms(); + System.out.print("Matches: "); + System.out.println(matches); + for (int j = 0; j < matches.size(); j++) { + IAtomContainer highB = new AtomContainer(); + List atomIndices = (List) matches.get(j); + for (int k = 0; k < atomIndices.size(); k++) { + IAtom a1 = mol.getAtom( (Integer) atomIndices.get(k)); + if (!highB.contains(a1)) { highB.addAtom(a1); } + for (int l = k + 1; l < atomIndices.size(); l++) { + IAtom a2 = mol.getAtom( (Integer) atomIndices.get(l)); + IBond bond = mol.getBond(a1,a2); + if (bond != null) { highB.addBond(bond); } + } + } + highBSet.addMolecule(new Molecule(highB)); + } + } + } + + chemModel.setMoleculeSet(highBSet); + selection.select(chemModel); + renderer.getRenderer2DModel().setSelection(selection); + renderer.getRenderer2DModel().set( SelectBondGenerator.SelectionBondColor.class,color); + + } catch (Exception exc) { + exc.printStackTrace(); + } + + } + +} -- cgit v1.2.3