diff options
author | Christoph Helma <helma@in-silico.de> | 2009-09-08 16:04:23 +0200 |
---|---|---|
committer | Christoph Helma <helma@in-silico.de> | 2009-09-08 16:04:23 +0200 |
commit | 6a2c3f2100d030c30b7d8ac8c95dcece7edb040c (patch) | |
tree | c2e8069b3787b7ad2b90f062957d23eb12d955dd /lib/compound.rb | |
parent | 4d343f7c584ce09638005665b4ed2de718ff17a6 (diff) |
api separated into individual components, adapted for new webservice versions
Diffstat (limited to 'lib/compound.rb')
-rw-r--r-- | lib/compound.rb | 67 |
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 |