summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Helma <helma@in-silico.ch>2010-07-22 18:20:05 +0200
committerChristoph Helma <helma@in-silico.ch>2010-07-22 18:20:05 +0200
commiteecee560ffd6afccde7b0c383b42b67a9d18993c (patch)
treef8b9c59f6efb5fc51cdbd29c4b5f75c70d372756
parent040d6022a42c9e5fab97a42cded77fd20d3def3f (diff)
matching of fragemnt sets implemented
-rw-r--r--application.rb131
-rw-r--r--public/java/Structure.java154
2 files changed, 222 insertions, 63 deletions
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<Integer> idlist = new Vector<Integer>();
+ 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();
+ }
+
+ }
+
+}