summaryrefslogtreecommitdiff
path: root/application.rb
blob: 7920b920f4efeaecd4f9e50f93674560e31c6786 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
[ 'rubygems', 'sinatra', 'rest_client', 'sinatra/url_for', 'sinatra/respond_to', 'openbabel' ].each do |lib|
	require lib
end

mime :uid, "text/plain"
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/"

set :default_content, :smiles

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.uid   { URI.escape(cansmi, /[^#{URI::PATTERN::UNRESERVED}]/) }
		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')
	elsif params[:name]
		cansmi = RestClient.get "#{CACTUS_URI}#{params[:name]}/smiles"
	end
	url_for("/", :full) + URI.escape(cansmi.gsub(/\s+/,''), /[^#{URI::PATTERN::UNRESERVED}]/)
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