summaryrefslogtreecommitdiff
path: root/application.rb
diff options
context:
space:
mode:
authorChristoph Helma <helma@in-silico.de>2009-08-13 16:03:21 +0200
committerChristoph Helma <helma@in-silico.de>2009-08-13 16:03:21 +0200
commit632f04c25f83c9d11adaa5f1b53af296ee16a7ea (patch)
tree936ad013a09363b6605e8e5d249d74cf590e4adb /application.rb
parentcf4caa7e243b80017105f8dee8f5a85c933692d7 (diff)
smiles generation and smarts matching with openbabel, canonical smiles as identifier, rake task for installation
Diffstat (limited to 'application.rb')
-rw-r--r--application.rb58
1 files changed, 58 insertions, 0 deletions
diff --git a/application.rb b/application.rb
new file mode 100644
index 0000000..845895d
--- /dev/null
+++ b/application.rb
@@ -0,0 +1,58 @@
+[ 'rubygems', 'sinatra', 'rest_client', 'sinatra/url_for', 'sinatra/respond_to', 'openbabel' ].each do |lib|
+ require lib
+end
+
+mime :smiles, "chemical/x-daylight-smiles"
+mime :inchi, "chemical/x-inchi"
+mime :sdf, "chemical/x-mdl-sdfile"
+mime :image, "image/gif"
+mime :names, "text/plain"
+
+CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/"
+
+get '/*/match/*' do
+ smiles = URI.decode(params[:splat][0])
+ smarts = URI.decode(params[:splat][1])
+ smi2mol = OpenBabel::OBConversion.new
+ smi2mol.set_in_format('smi')
+ obmol = OpenBabel::OBMol.new
+ smi2mol.read_string(obmol,smiles)
+ obmol.add_hydrogens
+ smarts_pattern = OpenBabel::OBSmartsPattern.new
+ smarts_pattern.init(smarts)
+ if smarts_pattern.match(obmol)
+ 'true'
+ else
+ 'false'
+ end
+end
+
+get %r{/(.+)} do |cansmi| # catches all remaining get requests
+ respond_to do |format|
+ format.html { URI.unescape(cansmi).chomp }
+ format.text { URI.unescape(cansmi).chomp }
+ format.smiles { URI.unescape(cansmi).chomp }
+ format.names { RestClient.get "#{CACTUS_URI}#{cansmi}/names" }
+ format.inchi { RestClient.get "#{CACTUS_URI}#{cansmi}/stdinchi" }
+ format.sdf { RestClient.get "#{CACTUS_URI}#{cansmi}/sdf" }
+ format.image { "#{CACTUS_URI}#{cansmi}/image" }
+ end
+end
+
+post '/' do
+ if params[:smiles]
+ cansmi = canonical_smiles(URI.unescape(params[:smiles]),'smi').gsub(/\s+/,'')
+ elsif params[:name]
+ cansmi = RestClient.get "#{CACTUS_URI}#{params[:name]}/smiles"
+ end
+ url_for("/", :full) + URI.escape(cansmi, /[^\w]/)
+end
+
+def canonical_smiles(identifier,format)
+ conversion = OpenBabel::OBConversion.new
+ conversion.set_in_and_out_formats format, 'can'
+ mol = OpenBabel::OBMol.new
+ conversion.read_string mol, identifier
+ conversion.write_string mol
+end
+