summaryrefslogtreecommitdiff
path: root/lib/compound.rb
diff options
context:
space:
mode:
authorChristoph Helma <helma@in-silico.de>2009-09-08 16:04:23 +0200
committerChristoph Helma <helma@in-silico.de>2009-09-08 16:04:23 +0200
commit6a2c3f2100d030c30b7d8ac8c95dcece7edb040c (patch)
treec2e8069b3787b7ad2b90f062957d23eb12d955dd /lib/compound.rb
parent4d343f7c584ce09638005665b4ed2de718ff17a6 (diff)
api separated into individual components, adapted for new webservice versions
Diffstat (limited to 'lib/compound.rb')
-rw-r--r--lib/compound.rb67
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/compound.rb b/lib/compound.rb
new file mode 100644
index 0000000..4652770
--- /dev/null
+++ b/lib/compound.rb
@@ -0,0 +1,67 @@
+module OpenTox
+
+ # uri: /compound/:inchi
+ class Compound < OpenTox
+
+ attr_reader :inchi
+
+ # Initialize with <tt>:uri => uri</tt>, <tt>:smiles => smiles</tt> or <tt>:name => name</tt> (name can be also an InChI/InChiKey, CAS number, etc)
+ def initialize(params)
+ @@cactus_uri="http://cactus.nci.nih.gov/chemical/structure/"
+ if params[:smiles]
+ @inchi = smiles2inchi(params[:smiles])
+ @uri = File.join(@@config[:services]["opentox-dataset"],"compound",@inchi)
+ elsif params[:inchi]
+ @inchi = inchi
+ @uri = File.join(@@config[:services]["opentox-dataset"],"compound",@inchi)
+ elsif params[:name]
+ @inchi = RestClient.get "#{@@cactus_uri}#{params[:name]}/stdinchi"
+ @uri = File.join(@@config[:services]["opentox-dataset"],"compound",@inchi)
+ elsif params[:uri]
+ @inchi = params[:uri].sub(/^.*InChI/, 'InChI')
+ @uri = params[:uri]
+ end
+ end
+
+ # Get the (canonical) smiles
+ def smiles
+ obconversion(@inchi,'inchi','can')
+ end
+
+ def sdf
+ obconversion(@inchi,'inchi','sdf')
+ end
+
+ # Matchs a smarts string
+ def match?(smarts)
+ obconversion = OpenBabel::OBConversion.new
+ obmol = OpenBabel::OBMol.new
+ obconversion.set_in_format('inchi')
+ obconversion.read_string(obmol,@inchi)
+ smarts_pattern = OpenBabel::OBSmartsPattern.new
+ smarts_pattern.init(smarts)
+ smarts_pattern.match(obmol)
+ end
+
+ # Match an array of smarts features, returns matching features
+ def match(smarts_features)
+ smarts_features.all_features.collect{ |smarts| smarts if self.match?(smarts.name) }.compact
+ end
+
+ def smiles2inchi(smiles)
+ obconversion(smiles,'smi','inchi')
+ end
+
+ def smiles2cansmi(smiles)
+ obconversion(smiles,'smi','can')
+ end
+
+ def obconversion(identifier,input_format,output_format)
+ obconversion = OpenBabel::OBConversion.new
+ obmol = OpenBabel::OBMol.new
+ obconversion.set_in_and_out_formats input_format, output_format
+ obconversion.read_string obmol, identifier
+ obconversion.write_string(obmol).gsub(/\s/,'').chomp
+ end
+ end
+end