opentox-ruby-api-wrapper 1.1.3 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -5
- data/VERSION +1 -1
- data/lib/algorithm.rb +27 -25
- data/lib/compound.rb +18 -7
- data/lib/dataset.rb +210 -55
- data/lib/environment.rb +8 -0
- data/lib/feature.rb +3 -4
- data/lib/model.rb +51 -19
- data/lib/opentox-ruby-api-wrapper.rb +2 -2
- data/lib/owl.rb +102 -0
- data/lib/task.rb +6 -5
- metadata +3 -43
- data/lib/opentox.rb +0 -27
data/Rakefile
CHANGED
@@ -15,15 +15,11 @@ begin
|
|
15
15
|
gem.add_dependency "rack"
|
16
16
|
gem.add_dependency "rack-contrib"
|
17
17
|
gem.add_dependency "thin"
|
18
|
-
gem.add_dependency "ezmobius-redis-rb"
|
19
18
|
gem.add_dependency "emk-sinatra-url-for"
|
20
19
|
gem.add_dependency "cehoffman-sinatra-respond_to"
|
21
|
-
gem.add_dependency "dm-core"
|
22
|
-
gem.add_dependency "datamapper"
|
23
|
-
gem.add_dependency "do_sqlite3"
|
24
20
|
gem.add_development_dependency "cucumber"
|
25
21
|
gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore']
|
26
|
-
gem.files.include %w(lib/tasks/
|
22
|
+
gem.files.include %w(lib/tasks/owl.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/utils.rb, lib/templates/*)
|
27
23
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
28
24
|
end
|
29
25
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/lib/algorithm.rb
CHANGED
@@ -1,35 +1,37 @@
|
|
1
1
|
module OpenTox
|
2
2
|
module Algorithm
|
3
3
|
|
4
|
-
class Fminer
|
5
|
-
|
6
|
-
def self.create(params)
|
7
|
-
puts params[:dataset_uri]
|
8
|
-
uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"],'fminer'), :dataset_uri => params[:dataset_uri]
|
9
|
-
print "fminer finsihed "
|
10
|
-
puts uri
|
11
|
-
uri
|
12
|
-
end
|
13
|
-
end
|
4
|
+
class Fminer #< OpenTox
|
5
|
+
include Owl
|
14
6
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
self.uri = File.join(@@config[:services]["opentox-algorithm"],'fminer')
|
10
|
+
self.title = "fminer"
|
11
|
+
self.source = "http://github.com/amaunz/libfminer"
|
12
|
+
self.parameters = {
|
13
|
+
"Dataset URI" => { :scope => "mandatory", :value => "dataset_uri" },
|
14
|
+
"Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri" }
|
15
|
+
}
|
19
16
|
end
|
20
|
-
|
21
|
-
def self.weighted_tanimoto(dataset1,compound1,dataset2,compound2)
|
22
|
-
# URI.escape does not work here
|
23
|
-
uri = File.join(@@config[:services]["opentox-algorithm"], 'weighted_tanimoto/dataset',CGI.escape(dataset1.name),'compound',CGI.escape(compound1.inchi),'dataset',CGI.escape(dataset2.name),'compound',CGI.escape(compound2.inchi))
|
24
|
-
RestClient.get uri
|
25
|
-
end
|
26
|
-
|
27
17
|
end
|
28
18
|
|
29
|
-
class Lazar
|
30
|
-
|
31
|
-
|
32
|
-
|
19
|
+
class Lazar #< OpenTox
|
20
|
+
include Owl
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
super
|
24
|
+
self.uri = File.join(@@config[:services]["opentox-algorithm"],'lazar')
|
25
|
+
self.title = "lazar"
|
26
|
+
self.source = "http://github.com/helma/opentox-algorithm"
|
27
|
+
self.parameters = {
|
28
|
+
"Dataset URI" =>
|
29
|
+
{ :scope => "mandatory", :value => "dataset_uri" },
|
30
|
+
"Feature URI for dependent variable" =>
|
31
|
+
{ :scope => "mandatory", :value => "feature_uri" },
|
32
|
+
"Feature generation URI" =>
|
33
|
+
{ :scope => "mandatory", :value => "feature_generation_uri" }
|
34
|
+
}
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
data/lib/compound.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
module OpenTox
|
2
2
|
|
3
|
-
|
4
|
-
class Compound < OpenTox
|
3
|
+
class Compound #< OpenTox
|
5
4
|
|
6
|
-
attr_reader :inchi
|
5
|
+
attr_reader :inchi, :uri
|
7
6
|
|
8
7
|
# 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)
|
9
8
|
def initialize(params)
|
@@ -14,8 +13,11 @@ module OpenTox
|
|
14
13
|
elsif params[:inchi]
|
15
14
|
@inchi = params[:inchi]
|
16
15
|
@uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi))
|
16
|
+
elsif params[:sdf]
|
17
|
+
@inchi = sdf2inchi(params[:sdf])
|
18
|
+
@uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi))
|
17
19
|
elsif params[:name]
|
18
|
-
@inchi = RestClient.get
|
20
|
+
@inchi = RestClient.get("#{@@cactus_uri}#{params[:name]}/stdinchi").chomp
|
19
21
|
@uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi))
|
20
22
|
elsif params[:uri]
|
21
23
|
@inchi = params[:uri].sub(/^.*InChI/, 'InChI')
|
@@ -44,8 +46,12 @@ module OpenTox
|
|
44
46
|
end
|
45
47
|
|
46
48
|
# Match an array of smarts features, returns matching features
|
47
|
-
def match(
|
48
|
-
|
49
|
+
def match(smarts_array)
|
50
|
+
smarts_array.collect{|s| s if match?(s)}.compact
|
51
|
+
end
|
52
|
+
|
53
|
+
def sdf2inchi(sdf)
|
54
|
+
obconversion(sdf,'sdf','inchi')
|
49
55
|
end
|
50
56
|
|
51
57
|
def smiles2inchi(smiles)
|
@@ -61,7 +67,12 @@ module OpenTox
|
|
61
67
|
obmol = OpenBabel::OBMol.new
|
62
68
|
obconversion.set_in_and_out_formats input_format, output_format
|
63
69
|
obconversion.read_string obmol, identifier
|
64
|
-
|
70
|
+
case output_format
|
71
|
+
when /smi|can|inchi/
|
72
|
+
obconversion.write_string(obmol).gsub(/\s/,'').chomp
|
73
|
+
else
|
74
|
+
obconversion.write_string(obmol)
|
75
|
+
end
|
65
76
|
end
|
66
77
|
end
|
67
78
|
end
|
data/lib/dataset.rb
CHANGED
@@ -1,79 +1,184 @@
|
|
1
1
|
module OpenTox
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
# key: /dataset/:dataset/compounds
|
6
|
-
# set: compound uris
|
7
|
-
# key: /dataset/:dataset/compound/:inchi
|
8
|
-
# set: feature uris
|
9
|
-
class Dataset < OpenTox
|
3
|
+
class Dataset
|
4
|
+
include Owl
|
10
5
|
|
11
|
-
#
|
12
|
-
|
13
|
-
|
6
|
+
#attr_accessor :model
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super
|
14
10
|
end
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
# find or create a new compound and return the resource
|
13
|
+
def find_or_create_compound(uri)
|
14
|
+
compound = @model.subject(DC["identifier"], uri)
|
15
|
+
if compound.nil?
|
16
|
+
compound = @model.create_resource
|
17
|
+
@model.add compound, RDF['type'], OT["Compound"]
|
18
|
+
@model.add compound, DC["identifier"], uri
|
19
|
+
end
|
20
|
+
compound
|
19
21
|
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
rescue
|
31
|
-
nil
|
23
|
+
# find or create a new feature and return the resource
|
24
|
+
def find_or_create_feature(f)
|
25
|
+
feature = @model.subject(DC["title"], f[:name].to_s)
|
26
|
+
if feature.nil?
|
27
|
+
feature = @model.create_resource
|
28
|
+
@model.add feature, RDF['type'], OT["Feature"]
|
29
|
+
@model.add feature, DC["identifier"], File.join("feature",feature.to_s.gsub(/[()]/,'')) # relative uri as we don know the final uri
|
30
|
+
@model.add feature, DC["title"], f[:name].to_s
|
31
|
+
@model.add feature, OT['hasSource'], f[:source].to_s if f[:source]
|
32
32
|
end
|
33
|
+
feature
|
33
34
|
end
|
34
35
|
|
35
|
-
|
36
|
-
|
36
|
+
# find or create a new value and return the resource
|
37
|
+
def find_or_create_value(v)
|
38
|
+
value = @model.subject OT["value"], v.to_s
|
39
|
+
if value.nil?
|
40
|
+
value = @model.create_resource
|
41
|
+
@model.add value, RDF['type'], OT["FeatureValue"]
|
42
|
+
@model.add value, OT["value"], v.to_s
|
43
|
+
end
|
44
|
+
value
|
37
45
|
end
|
38
46
|
|
39
|
-
def
|
40
|
-
|
47
|
+
def tuple?(t)
|
48
|
+
statements = []
|
49
|
+
has_tuple = true
|
50
|
+
t.each do |name,v|
|
51
|
+
feature = self.find_or_create_feature(:name => name)
|
52
|
+
value = self.find_or_create_value(v)
|
53
|
+
tuple = @model.subject(feature,value)
|
54
|
+
has_tuple = false if tuple.nil?
|
55
|
+
statements << [tuple,feature,value]
|
56
|
+
end
|
57
|
+
tuples_found = statements.collect{|s| s[0]}.uniq
|
58
|
+
has_tuple = false unless tuples_found.size == 1
|
59
|
+
has_tuple
|
41
60
|
end
|
42
61
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
62
|
+
def create_tuple(t)
|
63
|
+
tuple = @model.create_resource
|
64
|
+
@model.add tuple, RDF['type'], OT["Tuple"]
|
65
|
+
t.each do |name,value|
|
66
|
+
feature = self.find_or_create_feature(:name => name)
|
67
|
+
value = self.find_or_create_value(value)
|
68
|
+
pair = @model.create_resource
|
69
|
+
@model.add tuple, OT['tuple'], pair
|
70
|
+
@model.add pair, OT['feature'], feature
|
71
|
+
@model.add pair, OT['value'], value
|
48
72
|
end
|
73
|
+
tuple
|
49
74
|
end
|
50
75
|
|
51
|
-
def
|
52
|
-
|
76
|
+
def find_or_create_tuple(t)
|
77
|
+
if self.tuple?(t)
|
78
|
+
t
|
79
|
+
else
|
80
|
+
self.create_tuple(t)
|
81
|
+
end
|
53
82
|
end
|
54
83
|
|
55
|
-
|
56
|
-
|
57
|
-
|
84
|
+
def add_data_entry(compound,feature,value)
|
85
|
+
data_entry = @model.create_resource
|
86
|
+
@model.add data_entry, RDF['type'], OT["DataEntry"]
|
87
|
+
@model.add data_entry, OT['compound'], compound
|
88
|
+
@model.add data_entry, OT['feature'], feature
|
89
|
+
@model.add data_entry, OT['values'], value
|
58
90
|
end
|
59
91
|
|
60
|
-
def
|
61
|
-
|
92
|
+
def self.create(data, content_type = 'application/rdf+xml')
|
93
|
+
uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => content_type
|
94
|
+
dataset = Dataset.new
|
95
|
+
dataset.read uri.to_s
|
96
|
+
dataset
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.find(uri)
|
100
|
+
begin
|
101
|
+
RestClient.get uri # check if the resource is available
|
102
|
+
dataset = Dataset.new
|
103
|
+
dataset.read uri.to_s
|
104
|
+
dataset
|
105
|
+
rescue
|
106
|
+
nil
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def features
|
62
111
|
end
|
63
112
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
113
|
+
def feature_values(uri)
|
114
|
+
features = {}
|
115
|
+
feature = @model.subject(DC["identifier"],uri)
|
116
|
+
@model.subjects(RDF['type'], OT["Compound"]).each do |compound_node|
|
117
|
+
compound = @model.object(compound_node, DC["identifier"]).to_s.sub(/^\[(.*)\]$/,'\1')
|
118
|
+
features[compound] = [] unless features[compound]
|
119
|
+
@model.subjects(OT['compound'], compound_node).each do |data_entry|
|
120
|
+
if feature == @model.object(data_entry, OT['feature'])
|
121
|
+
values_node = @model.object(data_entry, OT['values'])
|
122
|
+
@model.find(values_node, OT['value'], nil) do |s,p,value|
|
123
|
+
case value.to_s
|
124
|
+
when "true"
|
125
|
+
features[compound] << true
|
126
|
+
when "false"
|
127
|
+
features[compound] << false
|
128
|
+
else
|
129
|
+
features[compound] << value.to_s
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
features
|
68
136
|
end
|
69
137
|
|
70
|
-
|
71
|
-
|
72
|
-
|
138
|
+
def tuples
|
139
|
+
tuples = []
|
140
|
+
@model.subjects(RDF['type'], OT["Tuple"]).each do |t|
|
141
|
+
tuple = {}
|
142
|
+
compounds = []
|
143
|
+
@model.subjects(OT['values'], t).each do |data_entry|
|
144
|
+
compound_node = @model.object(data_entry,OT['compound'])
|
145
|
+
compounds << @model.object(compound_node, DC["identifier"]).to_s
|
146
|
+
end
|
147
|
+
@model.find(t, OT['tuple'],nil) do |s,p,pair|
|
148
|
+
feature_node = @model.object(pair, OT['feature'])
|
149
|
+
feature_name = @model.object(feature_node, DC['title']).to_s
|
150
|
+
value_node = @model.object(pair, OT['value'])
|
151
|
+
value = @model.object(value_node, OT['value']).to_s
|
152
|
+
value = value.to_f if value.match(/^[\d\.]+$/)
|
153
|
+
tuple[feature_name.to_sym] = value
|
154
|
+
end
|
155
|
+
tuple[:compounds] = compounds
|
156
|
+
tuples << tuple
|
157
|
+
end
|
158
|
+
tuples
|
73
159
|
end
|
74
160
|
|
75
|
-
def
|
76
|
-
|
161
|
+
def tuple(compound_uri)
|
162
|
+
compound_node = @model.subject(DC["identifier"],compound_uri)
|
163
|
+
#puts compound_uri
|
164
|
+
@model.subjects(OT['compound'], compound_node).each do |data_entry|
|
165
|
+
values_node = @model.object(data_entry, OT['values'])
|
166
|
+
@model.find(values_node, OT['tuple'], nil) do |s,p,tuple|
|
167
|
+
@model.find(tuple, OT['feature'], nil) do |s,p,feature|
|
168
|
+
name = @model.object(feature,DC['title']).to_s
|
169
|
+
#puts name
|
170
|
+
end
|
171
|
+
end
|
172
|
+
#puts values_node
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def compounds
|
177
|
+
compounds = []
|
178
|
+
@model.subjects(RDF['type'], OT["Compound"]).each do |compound_node|
|
179
|
+
compounds << @model.object(compound_node, DC["identifier"])#.to_s.sub(/^\[(.*)\]$/,'\1')
|
180
|
+
end
|
181
|
+
compounds
|
77
182
|
end
|
78
183
|
|
79
184
|
# Delete a dataset
|
@@ -81,14 +186,64 @@ module OpenTox
|
|
81
186
|
RestClient.delete @uri
|
82
187
|
end
|
83
188
|
|
84
|
-
def
|
85
|
-
RestClient.
|
86
|
-
end
|
87
|
-
|
88
|
-
def weighted_tanimoto(dataset)
|
89
|
-
RestClient.get(File.join(@uri,'weighted_tanimoto',dataset.path))
|
189
|
+
def save
|
190
|
+
RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s
|
90
191
|
end
|
91
192
|
|
92
193
|
end
|
93
194
|
|
94
195
|
end
|
196
|
+
|
197
|
+
|
198
|
+
# def tanimoto(dataset)
|
199
|
+
# RestClient.get(File.join(@uri,'tanimoto',dataset.path))
|
200
|
+
# end
|
201
|
+
#
|
202
|
+
# def weighted_tanimoto(dataset)
|
203
|
+
# RestClient.get(File.join(@uri,'weighted_tanimoto',dataset.path))
|
204
|
+
# end
|
205
|
+
=begin
|
206
|
+
def data_entries
|
207
|
+
data = {}
|
208
|
+
@model.subjects(RDF['type'], OT["Compound"]).each do |compound_node|
|
209
|
+
compound = @model.object(compound_node, DC["identifier"]).to_s#.sub(/^\[(.*)\]$/,'\1')
|
210
|
+
#compound = OpenTox::Compound.new(:inchi => compound).smiles
|
211
|
+
data[compound] = [] unless data[compound]
|
212
|
+
#puts compound
|
213
|
+
@model.subjects(OT['compound'], compound_node).each do |data_entry|
|
214
|
+
feature_node = @model.object(data_entry, OT['feature'])
|
215
|
+
feature = @model.object(feature_node, DC["identifier"]).to_s
|
216
|
+
values_node = @model.object(data_entry, OT['values'])
|
217
|
+
type = @model.object(values_node,RDF['type']).to_s
|
218
|
+
case type
|
219
|
+
when /FeatureValue/
|
220
|
+
@model.find(values_node, OT['value'], nil) do |s,p,value|
|
221
|
+
case value.to_s
|
222
|
+
when "true"
|
223
|
+
data[compound] << {feature => true}
|
224
|
+
when "false"
|
225
|
+
data[compound] << {feature => false}
|
226
|
+
else
|
227
|
+
data[compound] << {feature => value.to_s}
|
228
|
+
end
|
229
|
+
end
|
230
|
+
when /Tuple/ # this is really slow
|
231
|
+
t = {}
|
232
|
+
@model.find(values_node, OT['tuple'], nil) do |s,p,tuple|
|
233
|
+
@model.find(tuple, OT['feature'], nil) do |s,p,feature|
|
234
|
+
@name = @model.object(feature,DC['title']).to_s
|
235
|
+
end
|
236
|
+
@model.find(tuple, OT['value'], nil) do |s,p,value|
|
237
|
+
v = @model.object(value,OT['value']).to_s
|
238
|
+
t[@name] = v
|
239
|
+
#print @name + ": "
|
240
|
+
#puts v
|
241
|
+
end
|
242
|
+
end
|
243
|
+
data[compound] << t
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
data
|
248
|
+
end
|
249
|
+
=end
|
data/lib/environment.rb
CHANGED
@@ -17,7 +17,14 @@ else
|
|
17
17
|
exit
|
18
18
|
end
|
19
19
|
|
20
|
+
# RDF namespaces
|
21
|
+
RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
|
22
|
+
OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#'
|
23
|
+
DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/'
|
24
|
+
OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#'
|
25
|
+
|
20
26
|
# configure redis database
|
27
|
+
=begin
|
21
28
|
begin
|
22
29
|
case ENV['RACK_ENV']
|
23
30
|
when 'production'
|
@@ -31,3 +38,4 @@ begin
|
|
31
38
|
rescue
|
32
39
|
puts "Redis database not running, please start it with 'rake redis:start'."
|
33
40
|
end
|
41
|
+
=end
|
data/lib/feature.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
module OpenTox
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
class Feature
|
4
|
+
include Owl
|
5
5
|
|
6
|
-
|
6
|
+
def self.find_or_create(feature)
|
7
7
|
|
8
|
-
def initialize(params)
|
9
8
|
if params[:uri]
|
10
9
|
@uri = params[:uri]
|
11
10
|
items = URI.split(@uri)[5].split(/\//)
|
data/lib/model.rb
CHANGED
@@ -1,38 +1,69 @@
|
|
1
1
|
module OpenTox
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
module Model
|
3
|
+
class Lazar
|
4
|
+
include Owl
|
5
|
+
|
7
6
|
# Create a new prediction model from a dataset
|
8
|
-
def initialize
|
9
|
-
super
|
7
|
+
def initialize
|
8
|
+
super
|
10
9
|
end
|
11
10
|
|
12
|
-
def
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
def read_yaml(id,yaml)
|
12
|
+
@lazar = YAML.load yaml
|
13
|
+
self.identifier = File.join(@@config[:services]["opentox-model"],'lazar',id)
|
14
|
+
self.title = "lazar model for #{@lazar[:endpoint]}"
|
15
|
+
self.source = "http://github.com/helma/opentox-model"
|
16
|
+
self.parameters = {
|
17
|
+
"Dataset URI" => { :scope => "mandatory", :value => "dataset_uri=#{@lazar[:activity_dataset]}" },
|
18
|
+
"Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri=#{@lazar[:endpoint]}" },
|
19
|
+
"Feature generation URI" => { :scope => "mandatory", :value => "feature_generation_uri=" } #TODO write to yaml
|
20
|
+
}
|
21
|
+
self.algorithm = File.join(@@config[:services]["opentox-model"],"lazar")
|
22
|
+
self.trainingDataset = @lazar[:activity_dataset]
|
23
|
+
self.dependentVariables = @lazar[:endpoint]
|
24
|
+
self.predictedVariables = @lazar[:endpoint] + " lazar prediction"
|
16
25
|
end
|
17
26
|
|
18
|
-
def self.find(
|
19
|
-
|
20
|
-
|
27
|
+
def self.find(uri)
|
28
|
+
begin
|
29
|
+
YAML.load(RestClient.get uri)
|
30
|
+
Lazar.new uri
|
31
|
+
rescue
|
32
|
+
halt 404, "Model #{uri} not found."
|
33
|
+
end
|
21
34
|
end
|
22
35
|
|
23
36
|
def self.find_all
|
24
|
-
RestClient.get
|
37
|
+
RestClient.get(@@config[:services]["opentox-model"]).split("\n")
|
25
38
|
end
|
26
|
-
|
39
|
+
|
27
40
|
# Predict a compound
|
28
41
|
def predict(compound)
|
29
|
-
|
42
|
+
RestClient.post(@uri, :compound_uri => compound.uri)
|
30
43
|
end
|
31
44
|
|
32
45
|
def self.base_uri
|
33
46
|
@@config[:services]["opentox-model"]
|
34
47
|
end
|
35
48
|
|
49
|
+
def self.create(data)
|
50
|
+
RestClient.post(@@config[:services]["opentox-model"], data, :content_type => "application/x-yaml").to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
def endpoint
|
54
|
+
YAML.load(RestClient.get uri)[:endpoint]
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
=begin
|
62
|
+
module Model
|
63
|
+
|
64
|
+
class LazarClassification < OpenTox
|
65
|
+
|
66
|
+
|
36
67
|
end
|
37
68
|
|
38
69
|
end
|
@@ -48,11 +79,11 @@ module OpenTox
|
|
48
79
|
end
|
49
80
|
|
50
81
|
def classification
|
51
|
-
YAML.load(RestClient.get
|
82
|
+
YAML.load(RestClient.get(@uri))[:classification]
|
52
83
|
end
|
53
84
|
|
54
85
|
def confidence
|
55
|
-
YAML.load(RestClient.get
|
86
|
+
YAML.load(RestClient.get(@uri))[:confidence]
|
56
87
|
end
|
57
88
|
|
58
89
|
def neighbors
|
@@ -68,4 +99,5 @@ module OpenTox
|
|
68
99
|
end
|
69
100
|
|
70
101
|
end
|
102
|
+
=end
|
71
103
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
['rubygems', 'sinatra', 'sinatra/url_for',
|
1
|
+
['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'redland', 'rdf/redland', 'rdf/redland/util', 'environment'].each do |lib|
|
2
2
|
require lib
|
3
3
|
end
|
4
4
|
|
@@ -8,6 +8,6 @@ rescue LoadError
|
|
8
8
|
puts "Please install Openbabel with 'rake openbabel:install' in the compound component"
|
9
9
|
end
|
10
10
|
|
11
|
-
['
|
11
|
+
['owl', 'compound','dataset','algorithm','model','task','utils'].each do |lib|
|
12
12
|
require lib
|
13
13
|
end
|
data/lib/owl.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
module OpenTox
|
2
|
+
|
3
|
+
module Owl
|
4
|
+
|
5
|
+
attr_reader :uri, :model
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
|
9
|
+
@model = Redland::Model.new Redland::MemoryStore.new
|
10
|
+
@parser = Redland::Parser.new
|
11
|
+
@serializer = Redland::Serializer.ntriples
|
12
|
+
|
13
|
+
# explicit typing
|
14
|
+
# this should come from http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file (does not pass OWL-DL validation)
|
15
|
+
@model.add @uri, RDF['type'], OWL['Ontology']
|
16
|
+
# annotation properties
|
17
|
+
@model.add DC['source'], RDF['type'], OWL["AnnotationProperty"]
|
18
|
+
@model.add DC['identifier'], RDF['type'], OWL["AnnotationProperty"]
|
19
|
+
@model.add DC['title'], RDF['type'], OWL["AnnotationProperty"]
|
20
|
+
# object properties
|
21
|
+
@model.add OT['feature'], RDF['type'], OWL["ObjectProperty"]
|
22
|
+
@model.add OT['compound'], RDF['type'], OWL["ObjectProperty"]
|
23
|
+
@model.add OT['values'], RDF['type'], OWL["ObjectProperty"]
|
24
|
+
@model.add OT['tuple'], RDF['type'], OWL["ObjectProperty"] # added by ch
|
25
|
+
@model.add OT['parameters'], RDF['type'], OWL["ObjectProperty"]
|
26
|
+
# datatype properties
|
27
|
+
@model.add OT['value'], RDF['type'], OWL["DatatypeProperty"]
|
28
|
+
@model.add OT['paramValue'], RDF['type'], OWL["DatatypeProperty"]
|
29
|
+
@model.add OT['paramScope'], RDF['type'], OWL["DatatypeProperty"]
|
30
|
+
@model.add OT['hasSource'], RDF['type'], OWL["DatatypeProperty"]
|
31
|
+
# classes
|
32
|
+
@model.add OT['Dataset'], RDF['type'], OWL["Class"]
|
33
|
+
@model.add OT['FeatureValue'], RDF['type'], OWL["Class"]
|
34
|
+
@model.add OT['Tuple'], RDF['type'], OWL["Class"] # added by ch
|
35
|
+
@model.add OT['Feature'], RDF['type'], OWL["Class"]
|
36
|
+
@model.add OT['Compound'], RDF['type'], OWL["Class"]
|
37
|
+
@model.add OT['DataEntry'], RDF['type'], OWL["Class"]
|
38
|
+
@model.add OT['Parameter'], RDF['type'], OWL["Class"]
|
39
|
+
@model.add OT['Algorithm'], RDF['type'], OWL["Class"]
|
40
|
+
end
|
41
|
+
|
42
|
+
def owl_class
|
43
|
+
self.class.to_s.sub(/^OpenTox::/,'')
|
44
|
+
#@model.subject RDF['type'], OT[self.class.to_s.sub(/^OpenTox::/,'')]
|
45
|
+
end
|
46
|
+
|
47
|
+
def read(uri)
|
48
|
+
@parser.parse_into_model(@model,uri)
|
49
|
+
@uri = uri
|
50
|
+
end
|
51
|
+
|
52
|
+
def rdf=(rdf)
|
53
|
+
@uri = '/' unless @uri
|
54
|
+
@parser.parse_string_into_model(@model,rdf,@uri)
|
55
|
+
end
|
56
|
+
|
57
|
+
def rdf
|
58
|
+
@model.to_string
|
59
|
+
end
|
60
|
+
|
61
|
+
def uri=(uri)
|
62
|
+
identifier = uri
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_ntriples
|
66
|
+
@serializer.model_to_string(Redland::Uri.new(@uri), @model)
|
67
|
+
end
|
68
|
+
|
69
|
+
def title
|
70
|
+
puts OT[self.owl_class]
|
71
|
+
@model.object(OT[self.owl_class], DC['title']).to_s
|
72
|
+
end
|
73
|
+
|
74
|
+
def parameters=(params)
|
75
|
+
params.each do |name, settings|
|
76
|
+
parameter = @model.create_resource
|
77
|
+
@model.add parameter, RDF['type'], OT['Parameter']
|
78
|
+
@model.add parameter, DC['title'], name
|
79
|
+
@model.add parameter, OT['paramScope'], settings[:scope]
|
80
|
+
@model.add parameter, OT['paramValue'], settings[:value]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def create_owl_statement(name,value)
|
85
|
+
r = @model.create_resource
|
86
|
+
@model.add r, RDF['type'], DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter
|
87
|
+
@model.add r, DC[name], value
|
88
|
+
end
|
89
|
+
|
90
|
+
def method_missing(name, *args)
|
91
|
+
# create magic setter methods
|
92
|
+
if /=/ =~ name.to_s
|
93
|
+
puts "create_owl_statement #{name.to_s.sub(/=/,'')}, #{args.first}"
|
94
|
+
create_owl_statement name.to_s.sub(/=/,''), args.first
|
95
|
+
else
|
96
|
+
raise "No method #{name}"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
data/lib/task.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
module OpenTox
|
2
2
|
|
3
|
-
class Task
|
4
|
-
#private :new
|
3
|
+
class Task #< OpenTox
|
5
4
|
|
6
5
|
def initialize(uri)
|
7
6
|
super(uri)
|
8
7
|
end
|
9
8
|
|
10
|
-
def self.create(
|
11
|
-
|
12
|
-
|
9
|
+
#def self.create(uri)
|
10
|
+
def self.create
|
11
|
+
puts @@config[:services]["opentox-task"]
|
12
|
+
uri = RestClient.post @@config[:services]["opentox-task"], ''#, :dataset_uri => uri
|
13
|
+
Task.new(uri)
|
13
14
|
end
|
14
15
|
|
15
16
|
def self.find(params)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opentox-ruby-api-wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christoph Helma
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-16 00:00:00 +01:00
|
13
13
|
default_executable: opentox-install-debian.sh
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -62,16 +62,6 @@ dependencies:
|
|
62
62
|
- !ruby/object:Gem::Version
|
63
63
|
version: "0"
|
64
64
|
version:
|
65
|
-
- !ruby/object:Gem::Dependency
|
66
|
-
name: ezmobius-redis-rb
|
67
|
-
type: :runtime
|
68
|
-
version_requirement:
|
69
|
-
version_requirements: !ruby/object:Gem::Requirement
|
70
|
-
requirements:
|
71
|
-
- - ">="
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
version: "0"
|
74
|
-
version:
|
75
65
|
- !ruby/object:Gem::Dependency
|
76
66
|
name: emk-sinatra-url-for
|
77
67
|
type: :runtime
|
@@ -92,36 +82,6 @@ dependencies:
|
|
92
82
|
- !ruby/object:Gem::Version
|
93
83
|
version: "0"
|
94
84
|
version:
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: dm-core
|
97
|
-
type: :runtime
|
98
|
-
version_requirement:
|
99
|
-
version_requirements: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: "0"
|
104
|
-
version:
|
105
|
-
- !ruby/object:Gem::Dependency
|
106
|
-
name: datamapper
|
107
|
-
type: :runtime
|
108
|
-
version_requirement:
|
109
|
-
version_requirements: !ruby/object:Gem::Requirement
|
110
|
-
requirements:
|
111
|
-
- - ">="
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
version: "0"
|
114
|
-
version:
|
115
|
-
- !ruby/object:Gem::Dependency
|
116
|
-
name: do_sqlite3
|
117
|
-
type: :runtime
|
118
|
-
version_requirement:
|
119
|
-
version_requirements: !ruby/object:Gem::Requirement
|
120
|
-
requirements:
|
121
|
-
- - ">="
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: "0"
|
124
|
-
version:
|
125
85
|
- !ruby/object:Gem::Dependency
|
126
86
|
name: cucumber
|
127
87
|
type: :development
|
@@ -155,7 +115,7 @@ files:
|
|
155
115
|
- lib/helper.rb
|
156
116
|
- lib/model.rb
|
157
117
|
- lib/opentox-ruby-api-wrapper.rb
|
158
|
-
- lib/
|
118
|
+
- lib/owl.rb
|
159
119
|
- lib/spork.rb
|
160
120
|
- lib/task.rb
|
161
121
|
- lib/tasks/opentox.rb
|
data/lib/opentox.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module OpenTox
|
2
|
-
|
3
|
-
class OpenTox
|
4
|
-
attr_accessor :uri
|
5
|
-
|
6
|
-
def initialize(uri)
|
7
|
-
@uri = uri
|
8
|
-
end
|
9
|
-
|
10
|
-
# Get the object name
|
11
|
-
def name
|
12
|
-
RestClient.get @uri + '/name'
|
13
|
-
end
|
14
|
-
|
15
|
-
# Deletes an object
|
16
|
-
def destroy
|
17
|
-
RestClient.delete @uri
|
18
|
-
end
|
19
|
-
|
20
|
-
# Object path without hostname
|
21
|
-
def path
|
22
|
-
URI.split(@uri)[5]
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|