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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/"
require 'openbabel'
module OpenTox
# Ruby wrapper for OpenTox Compound Webservices (http://opentox.org/dev/apis/api-1.2/structure).
class Compound
attr_reader :inchi
def initialize inchi
@inchi = inchi
end
def == compound
self.inchi == compound.inchi
end
# Create a compound from smiles string
# @example
# compound = OpenTox::Compound.from_smiles("c1ccccc1")
# @param [String] smiles Smiles string
# @return [OpenTox::Compound] Compound
def self.from_smiles smiles
OpenTox::Compound.new obconversion(smiles,"smi","inchi")
end
# Create a compound from inchi string
# @param inchi [String] smiles InChI string
# @return [OpenTox::Compound] Compound
def self.from_inchi inchi
OpenTox::Compound.new inchi
end
# Create a compound from sdf string
# @param sdf [String] smiles SDF string
# @return [OpenTox::Compound] Compound
def self.from_sdf sdf
OpenTox::Compound.new obconversion(sdf,"sdf","inchi")
end
# Create a compound from name. Relies on an external service for name lookups.
# @example
# compound = OpenTox::Compound.from_name("Benzene")
# @param name [String] can be also an InChI/InChiKey, CAS number, etc
# @return [OpenTox::Compound] Compound
def self.from_name name
OpenTox::Compound.new RestClientWrapper.get File.join(CACTUS_URI,URI.escape(name),"stdinchi")
end
# Get InChIKey
# @return [String] InChI string
def inchikey
obconversion(@inchi,"inchi","inchikey")
end
# Get (canonical) smiles
# @return [String] Smiles string
def smiles
obconversion(@inchi,"inchi","smi") # "can" gives nonn-canonical smiles??
end
# Get sdf
# @return [String] SDF string
def sdf
obconversion(@inchi,"inchi","sdf")
end
# Get gif image
# @return [image/gif] Image data
def gif
RestClientWrapper.get File.join(CACTUS_URI,inchi,"image")
end
# Get png image
# @example
# image = compound.png
# @return [image/png] Image data
def png
obconversion(@inchi,"inchi","_png2")
end
=begin
# Get URI of compound image
# @return [String] Compound image URI
def image_uri
File.join @data["uri"], "image"
end
=end
# Get all known compound names. Relies on an external service for name lookups.
# @example
# names = compound.names
# @return [String] Compound names
def names
RestClientWrapper.get("#{CACTUS_URI}#{inchi}/names").split("\n")
end
# @return [String] PubChem Compound Identifier (CID), derieved via restcall to pubchem
def cid
pug_uri = "http://pubchem.ncbi.nlm.nih.gov/rest/pug/"
@cid ||= RestClientWrapper.post(File.join(pug_uri, "compound", "inchi", "cids", "TXT"),{:inchi => inchi}).strip
end
# @todo
def chebi
internal_server_error "not yet implemented"
end
# @return [String] ChEMBL database compound id, derieved via restcall to chembl
def chemblid
# https://www.ebi.ac.uk/chembldb/ws#individualCompoundByInChiKey
uri = "http://www.ebi.ac.uk/chemblws/compounds/smiles/#{smiles}.json"
@chemblid = JSON.parse(RestClientWrapper.get(uri))["compounds"].first["chemblId"]
end
private
def self.obconversion(identifier,input_format,output_format,option=nil)
obconversion = OpenBabel::OBConversion.new
obconversion.set_options(option, OpenBabel::OBConversion::OUTOPTIONS) if option
obmol = OpenBabel::OBMol.new
obconversion.set_in_and_out_formats input_format, output_format
obconversion.read_string obmol, identifier
case output_format
when /smi|can|inchi/
obconversion.write_string(obmol).gsub(/\s/,'').chomp
else
obconversion.write_string(obmol)
end
end
def obconversion(identifier,input_format,output_format,option=nil)
self.class.obconversion(identifier,input_format,output_format,option=nil)
end
end
end
|