opentox-ruby-api-wrapper 1.1.3 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|