opentox-ruby-api-wrapper 1.5.6 → 1.5.7
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/dataset.rb +15 -12
- data/lib/environment.rb +4 -2
- data/lib/model.rb +2 -8
- data/lib/owl.rb +28 -4
- data/lib/rest_client_wrapper.rb +11 -13
- data/lib/task.rb +2 -2
- data/lib/templates/config.yaml +0 -5
- data/lib/utils.rb +3 -1
- metadata +5 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.5.
|
1
|
+
1.5.7
|
data/lib/dataset.rb
CHANGED
@@ -22,7 +22,6 @@ module OpenTox
|
|
22
22
|
accept_header = "application/rdf+xml"
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
26
25
|
case accept_header
|
27
26
|
when "application/x-yaml"
|
28
27
|
d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s
|
@@ -52,6 +51,7 @@ module OpenTox
|
|
52
51
|
# returns uri of new dataset
|
53
52
|
def create_new_dataset( new_compounds, new_features, new_title, new_creator )
|
54
53
|
|
54
|
+
LOGGER.debug "create new dataset with "+new_compounds.size.to_s+"/"+compounds.size.to_s+" compounds"
|
55
55
|
raise "no new compounds selected" unless new_compounds and new_compounds.size>0
|
56
56
|
|
57
57
|
# load require features
|
@@ -69,6 +69,7 @@ module OpenTox
|
|
69
69
|
# PENDING: why storing feature values in an array?
|
70
70
|
new_compounds.each do |c|
|
71
71
|
data_c = []
|
72
|
+
raise "no data for compound '"+c.to_s+"'" if @data[c]==nil
|
72
73
|
@data[c].each do |d|
|
73
74
|
m = {}
|
74
75
|
new_features.each do |f|
|
@@ -76,7 +77,6 @@ module OpenTox
|
|
76
77
|
end
|
77
78
|
data_c << m
|
78
79
|
end
|
79
|
-
|
80
80
|
dataset.data[c] = data_c
|
81
81
|
end
|
82
82
|
return dataset.save
|
@@ -91,15 +91,16 @@ module OpenTox
|
|
91
91
|
else
|
92
92
|
return "no classification key"
|
93
93
|
end
|
94
|
-
|
95
|
-
raise "predicted class value is
|
94
|
+
elsif v.is_a?(Array)
|
95
|
+
raise "predicted class value is an array\n"+
|
96
96
|
"value "+v.to_s+"\n"+
|
97
97
|
"value-class "+v.class.to_s+"\n"+
|
98
98
|
"dataset "+@uri.to_s+"\n"+
|
99
99
|
"compound "+compound.to_s+"\n"+
|
100
100
|
"feature "+feature.to_s+"\n"
|
101
|
+
else
|
102
|
+
return v
|
101
103
|
end
|
102
|
-
|
103
104
|
end
|
104
105
|
|
105
106
|
# returns prediction confidence if available
|
@@ -113,12 +114,14 @@ module OpenTox
|
|
113
114
|
raise "no confidence key"
|
114
115
|
end
|
115
116
|
else
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
"
|
120
|
-
"
|
121
|
-
"
|
117
|
+
LOGGER.warn "no confidence for compound: "+compound.to_s+", feature: "+feature.to_s
|
118
|
+
return 1
|
119
|
+
# raise "prediction confidence value is not a hash value\n"+
|
120
|
+
# "value "+v.to_s+"\n"+
|
121
|
+
# "value-class "+v.class.to_s+"\n"+
|
122
|
+
# "dataset "+@uri.to_s+"\n"+
|
123
|
+
# "compound "+compound.to_s+"\n"+
|
124
|
+
# "feature "+feature.to_s+"\n"
|
122
125
|
end
|
123
126
|
end
|
124
127
|
|
@@ -173,7 +176,7 @@ module OpenTox
|
|
173
176
|
|
174
177
|
@features.uniq!
|
175
178
|
@compounds.uniq!
|
176
|
-
|
179
|
+
OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "application/x-yaml"},self.to_yaml).strip
|
177
180
|
end
|
178
181
|
|
179
182
|
def init_dirty_features(owl)
|
data/lib/environment.rb
CHANGED
@@ -13,6 +13,7 @@ LOG_DIR = File.join(basedir, "log")
|
|
13
13
|
|
14
14
|
if File.exist?(config_file)
|
15
15
|
@@config = YAML.load_file(config_file)
|
16
|
+
raise "could not load config, config file: "+config_file.to_s unless @@config
|
16
17
|
else
|
17
18
|
FileUtils.mkdir_p TMP_DIR
|
18
19
|
FileUtils.mkdir_p LOG_DIR
|
@@ -44,7 +45,7 @@ end
|
|
44
45
|
load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.rb")
|
45
46
|
|
46
47
|
# hack: store sinatra in global var to make url_for and halt methods accessible
|
47
|
-
before
|
48
|
+
before{ $sinatra = self unless $sinatra }
|
48
49
|
|
49
50
|
class Sinatra::Base
|
50
51
|
# overwriting halt to log halts (!= 202)
|
@@ -82,7 +83,7 @@ class MyLogger < Logger
|
|
82
83
|
end
|
83
84
|
|
84
85
|
def format(msg)
|
85
|
-
pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace+" :: "+
|
86
|
+
pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace+" :: "+($sinatra ? $sinatra.request.env['REMOTE_ADDR'] : nil).to_s
|
86
87
|
end
|
87
88
|
|
88
89
|
def debug(msg)
|
@@ -132,6 +133,7 @@ RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
|
|
132
133
|
OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#'
|
133
134
|
DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/'
|
134
135
|
OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#'
|
136
|
+
#OT = Redland::Namespace.new 'http://ortona.informatik.uni-freiburg.de/opentox.owl#'
|
135
137
|
XML = Redland::Namespace.new 'http://www.w3.org/2001/XMLSchema#'
|
136
138
|
|
137
139
|
# Regular expressions for parsing classification data
|
data/lib/model.rb
CHANGED
@@ -44,12 +44,6 @@ module OpenTox
|
|
44
44
|
|
45
45
|
def self.build( algorithm_uri, algorithm_params )
|
46
46
|
|
47
|
-
if algorithm_uri =~ /ambit2/
|
48
|
-
LOGGER.warn "Ambit hack, replacing 'prediction_feature' with 'target'"
|
49
|
-
algorithm_params[:target] = algorithm_params[:prediction_feature]
|
50
|
-
algorithm_params.delete(:prediction_feature)
|
51
|
-
end
|
52
|
-
|
53
47
|
LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s
|
54
48
|
uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s
|
55
49
|
LOGGER.debug "Build model done: "+uri.to_s
|
@@ -60,7 +54,7 @@ module OpenTox
|
|
60
54
|
def predict_dataset( dataset_uri )
|
61
55
|
|
62
56
|
LOGGER.debug "Predict dataset: "+dataset_uri.to_s+" with model "+@uri.to_s
|
63
|
-
uri = RestClientWrapper.post(@uri, {:dataset_uri=>dataset_uri})
|
57
|
+
uri = RestClientWrapper.post(@uri, {:accept => "text/uri-list", :dataset_uri=>dataset_uri})
|
64
58
|
RestClientWrapper.raise_uri_error("Prediciton result no dataset uri: "+uri.to_s, @uri, {:dataset_uri=>dataset_uri} ) unless Utils.dataset_uri?(uri)
|
65
59
|
uri
|
66
60
|
end
|
@@ -73,7 +67,7 @@ module OpenTox
|
|
73
67
|
return false
|
74
68
|
elsif @uri =~/tu-muenchen/ and @title =~ /regression|M5P|GaussP/
|
75
69
|
return false
|
76
|
-
elsif @uri =~/ambit2/ and @title =~ /pKa/
|
70
|
+
elsif @uri =~/ambit2/ and @title =~ /pKa/ || @title =~ /Regression|Caco/
|
77
71
|
return false
|
78
72
|
elsif @uri =~/majority/
|
79
73
|
return (@uri =~ /class/) != nil
|
data/lib/owl.rb
CHANGED
@@ -32,6 +32,7 @@ class Redland::Literal
|
|
32
32
|
@@type_date = XML["date"].uri
|
33
33
|
@@type_boolean = XML["boolean"].uri
|
34
34
|
@@type_datetime = XML["dateTime"].uri
|
35
|
+
@@type_integer = XML["integer"].uri
|
35
36
|
|
36
37
|
# parses value according to datatype uri
|
37
38
|
def self.parse_value(string_value, datatype_uri)
|
@@ -54,6 +55,8 @@ class Redland::Literal
|
|
54
55
|
return string_value #PENDING date as string?
|
55
56
|
when @@type_datetime.to_s
|
56
57
|
return string_value #PENDING date as string?
|
58
|
+
when @@type_integer.to_s
|
59
|
+
return string_value.to_i
|
57
60
|
else
|
58
61
|
raise "unknown literal datatype: '"+datatype_uri.to_s+"', value is "+string_value
|
59
62
|
end
|
@@ -74,6 +77,12 @@ class Redland::Literal
|
|
74
77
|
return @@type_float
|
75
78
|
elsif value.is_a?(TrueClass) or value.is_a?(FalseClass)
|
76
79
|
return @@type_boolean
|
80
|
+
elsif value.is_a?(Integer)
|
81
|
+
return @@type_integer
|
82
|
+
elsif value.is_a?(DateTime)
|
83
|
+
return @@type_datetime
|
84
|
+
elsif value.is_a?(Time)
|
85
|
+
return @@type_datetime
|
77
86
|
else
|
78
87
|
raise "illegal datatype: "+value.class.to_s+" "+value.to_s
|
79
88
|
end
|
@@ -98,7 +107,7 @@ module OpenTox
|
|
98
107
|
owl = OpenTox::Owl.new
|
99
108
|
owl.ot_class = ot_class
|
100
109
|
owl.root_node = Redland::Resource.new(uri.to_s.strip)
|
101
|
-
owl.set("type",owl.node(owl.ot_class))
|
110
|
+
owl.set("type",owl.node(owl.ot_class)) #,true))
|
102
111
|
owl
|
103
112
|
end
|
104
113
|
|
@@ -169,8 +178,9 @@ module OpenTox
|
|
169
178
|
|
170
179
|
public
|
171
180
|
def set(name, value, datatype=nil)
|
181
|
+
|
172
182
|
raise "uri is no prop, cannot set uri" if name=="uri"
|
173
|
-
property_node = node(name.to_s)
|
183
|
+
property_node = node(name.to_s) #, true)
|
174
184
|
begin # delete existing entry
|
175
185
|
t = @model.object(@root_node, property_node)
|
176
186
|
@model.delete @root_node, property_node, t
|
@@ -355,16 +365,30 @@ module OpenTox
|
|
355
365
|
"date" => DC["date"],
|
356
366
|
"format" => DC["format"]}
|
357
367
|
|
358
|
-
|
368
|
+
# @object_prop = OWL["ObjectProperty"]
|
369
|
+
# @@type = { "Validation" => OWL["Class"],
|
370
|
+
# "Model" => OWL["Class"],
|
371
|
+
# "title" => OWL["AnnotationProperty"],
|
372
|
+
# "creator" => OWL["AnnotationProperty"],
|
373
|
+
# "date" => OWL["AnnotationProperty"],
|
374
|
+
# "format" => OWL["AnnotationProperty"],
|
375
|
+
# "predictedVariables" => @object_prop}
|
376
|
+
|
377
|
+
# this method has two purposes:
|
359
378
|
# * distinguishing ot-properties from dc- and rdf- properties
|
360
379
|
# * caching nodes, as creating nodes is costly
|
361
|
-
def node(name)
|
380
|
+
def node(name) #, write_type_to_model=false)
|
362
381
|
raise "dc[identifier] deprecated, use owl.uri" if name=="identifier"
|
363
382
|
n = @@property_nodes[name]
|
364
383
|
unless n
|
365
384
|
n = OT[name]
|
366
385
|
@@property_nodes[name] = n
|
367
386
|
end
|
387
|
+
|
388
|
+
# if write_type_to_model and name!="type"
|
389
|
+
# raise "no type defined for '"+name+"'" unless @@type[name]
|
390
|
+
# @model.add n,RDF['type'],@@type[name]
|
391
|
+
# end
|
368
392
|
return n
|
369
393
|
end
|
370
394
|
|
data/lib/rest_client_wrapper.rb
CHANGED
@@ -9,7 +9,7 @@ module OpenTox
|
|
9
9
|
|
10
10
|
def initialize(code, body, uri, payload, headers)
|
11
11
|
self.code = code
|
12
|
-
self.body = body
|
12
|
+
self.body = body.to_s[0..1000]
|
13
13
|
self.uri = uri
|
14
14
|
self.payload = payload
|
15
15
|
self.headers = headers
|
@@ -90,8 +90,6 @@ module OpenTox
|
|
90
90
|
raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200
|
91
91
|
return res
|
92
92
|
|
93
|
-
rescue RestClient::RequestFailed => ex
|
94
|
-
do_halt ex.http_code,ex.http_body,uri,headers,payload
|
95
93
|
rescue RestClient::RequestTimeout => ex
|
96
94
|
do_halt 408,ex.message,uri,headers,payload
|
97
95
|
rescue => ex
|
@@ -112,7 +110,7 @@ module OpenTox
|
|
112
110
|
|
113
111
|
task = nil
|
114
112
|
case res.content_type
|
115
|
-
when /application\/rdf\+xml|
|
113
|
+
when /application\/rdf\+xml|application\/x-yaml/
|
116
114
|
task = OpenTox::Task.from_data(res, res.content_type, res.code, base_uri)
|
117
115
|
when /text\//
|
118
116
|
raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and
|
@@ -142,15 +140,15 @@ module OpenTox
|
|
142
140
|
error = [Error.new(code, body, uri, payload, headers)]
|
143
141
|
end
|
144
142
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
143
|
+
#debug utility: write error to file
|
144
|
+
error_dir = "/tmp/ot_errors"
|
145
|
+
FileUtils.mkdir(error_dir) unless File.exist?(error_dir)
|
146
|
+
raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir)
|
147
|
+
file_name = "error"
|
148
|
+
time=Time.now.strftime("%m.%d.%Y-%H:%M:%S")
|
149
|
+
count = 1
|
150
|
+
count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s))
|
151
|
+
File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body)
|
154
152
|
|
155
153
|
# handle error
|
156
154
|
# we are either in a task, or in sinatra
|
data/lib/task.rb
CHANGED
@@ -71,7 +71,7 @@ module OpenTox
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def error(description)
|
74
|
-
|
74
|
+
RestClientWrapper.put(File.join(@uri,'Error'),{:description => description.to_s[0..2000]})
|
75
75
|
reload
|
76
76
|
end
|
77
77
|
|
@@ -113,7 +113,7 @@ module OpenTox
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
LOGGER.debug "
|
116
|
+
LOGGER.debug "Task '"+@hasStatus+"': "+@uri.to_s+", Result: "+@resultURI.to_s
|
117
117
|
end
|
118
118
|
|
119
119
|
def check_state
|
data/lib/templates/config.yaml
CHANGED
@@ -43,23 +43,18 @@
|
|
43
43
|
- "text/plain"
|
44
44
|
opentox-dataset:
|
45
45
|
- "application/x-yaml"
|
46
|
-
- "text/x-yaml"
|
47
46
|
- "application/rdf+xml"
|
48
47
|
opentox-algorithm:
|
49
48
|
- "application/x-yaml"
|
50
|
-
- "text/x-yaml"
|
51
49
|
- "application/rdf+xml"
|
52
50
|
opentox-model:
|
53
51
|
- "application/x-yaml"
|
54
|
-
- "text/x-yaml"
|
55
52
|
- "application/rdf+xml"
|
56
53
|
opentox-task:
|
57
54
|
- "application/x-yaml"
|
58
|
-
- "text/x-yaml"
|
59
55
|
- "application/rdf+xml"
|
60
56
|
opentox-validation:
|
61
57
|
- "application/x-yaml"
|
62
|
-
- "text/x-yaml"
|
63
58
|
- "application/rdf+xml"
|
64
59
|
|
65
60
|
# Timeouts:
|
data/lib/utils.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opentox-ruby-api-wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 5
|
9
|
-
-
|
10
|
-
version: 1.5.
|
9
|
+
- 7
|
10
|
+
version: 1.5.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Christoph Helma, Martin Guetlein
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-06-
|
18
|
+
date: 2010-06-28 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -357,8 +357,8 @@ dependencies:
|
|
357
357
|
description: Ruby wrapper for the OpenTox REST API (http://www.opentox.org)
|
358
358
|
email: helma@in-silico.ch
|
359
359
|
executables:
|
360
|
-
- opentox-install-ubuntu.sh
|
361
360
|
- yaml2owl.rb
|
361
|
+
- opentox-install-ubuntu.sh
|
362
362
|
- opentox-install-debian.sh
|
363
363
|
extensions: []
|
364
364
|
|