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
61
62
63
64
65
66
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
|