opentox-ruby-api-wrapper 1.2.3 → 1.2.4
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 +3 -7
- data/VERSION +1 -1
- data/lib/algorithm.rb +7 -4
- data/lib/compound.rb +8 -0
- data/lib/dataset.rb +8 -48
- data/lib/model.rb +18 -89
- data/lib/owl.rb +1 -1
- data/lib/task.rb +19 -18
- data/lib/tasks/opentox.rb +0 -20
- metadata +24 -4
data/Rakefile
CHANGED
@@ -10,13 +10,9 @@ begin
|
|
10
10
|
gem.email = "helma@in-silico.ch"
|
11
11
|
gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper"
|
12
12
|
gem.authors = ["Christoph Helma"]
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
gem.add_dependency "rack-contrib"
|
17
|
-
gem.add_dependency "thin"
|
18
|
-
gem.add_dependency "emk-sinatra-url-for"
|
19
|
-
gem.add_dependency "cehoffman-sinatra-respond_to"
|
13
|
+
["sinatra", "rest-client", "rack", "rack-contrib", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core"].each do |dep|
|
14
|
+
gem.add_dependency dep
|
15
|
+
end
|
20
16
|
gem.add_development_dependency "cucumber"
|
21
17
|
gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore']
|
22
18
|
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/*)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.4
|
data/lib/algorithm.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module OpenTox
|
2
2
|
module Algorithm
|
3
3
|
|
4
|
-
class Fminer
|
4
|
+
class Fminer
|
5
5
|
include Owl
|
6
6
|
|
7
7
|
def initialize
|
@@ -20,7 +20,7 @@ module OpenTox
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
class Lazar
|
23
|
+
class Lazar
|
24
24
|
include Owl
|
25
25
|
|
26
26
|
def initialize
|
@@ -37,10 +37,14 @@ module OpenTox
|
|
37
37
|
{ :scope => "mandatory", :value => "feature_generation_uri" }
|
38
38
|
}
|
39
39
|
end
|
40
|
+
|
41
|
+
def self.create_model(params)
|
42
|
+
@uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"], "lazar"), :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")
|
43
|
+
end
|
44
|
+
|
40
45
|
end
|
41
46
|
|
42
47
|
class Similarity
|
43
|
-
|
44
48
|
def self.weighted_tanimoto(fp_a,fp_b,p)
|
45
49
|
common_features = fp_a & fp_b
|
46
50
|
all_features = fp_a + fp_b
|
@@ -54,7 +58,6 @@ module OpenTox
|
|
54
58
|
0.0
|
55
59
|
end
|
56
60
|
end
|
57
|
-
|
58
61
|
end
|
59
62
|
|
60
63
|
end
|
data/lib/compound.rb
CHANGED
@@ -34,6 +34,14 @@ module OpenTox
|
|
34
34
|
obconversion(@inchi,'inchi','sdf')
|
35
35
|
end
|
36
36
|
|
37
|
+
def image
|
38
|
+
RestClient.get("#{@@cactus_uri}#{@inchi}/image")
|
39
|
+
end
|
40
|
+
|
41
|
+
def image_uri
|
42
|
+
"#{@@cactus_uri}#{@inchi}/image"
|
43
|
+
end
|
44
|
+
|
37
45
|
# Matchs a smarts string
|
38
46
|
def match?(smarts)
|
39
47
|
obconversion = OpenBabel::OBConversion.new
|
data/lib/dataset.rb
CHANGED
@@ -47,8 +47,9 @@ module OpenTox
|
|
47
47
|
@model.add tuple, OT['complexValue'], complex_value
|
48
48
|
@model.add complex_value, RDF['type'], OT["FeatureValue"]
|
49
49
|
@model.add complex_value, OT['feature'], f
|
50
|
-
@model.add complex_value, OT['value'], value.to_s
|
51
|
-
|
50
|
+
@model.add complex_value, OT['value'], value.to_s
|
51
|
+
end
|
52
|
+
|
52
53
|
tuple
|
53
54
|
end
|
54
55
|
|
@@ -77,7 +78,7 @@ module OpenTox
|
|
77
78
|
end
|
78
79
|
|
79
80
|
def self.create(data, content_type = 'application/rdf+xml')
|
80
|
-
|
81
|
+
uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => content_type
|
81
82
|
dataset = Dataset.new
|
82
83
|
dataset.read uri.to_s
|
83
84
|
dataset
|
@@ -85,9 +86,9 @@ module OpenTox
|
|
85
86
|
|
86
87
|
def self.find(uri)
|
87
88
|
begin
|
88
|
-
|
89
|
-
|
90
|
-
|
89
|
+
dataset = Dataset.new
|
90
|
+
data = RestClient.get uri, :accept => 'application/rdf+xml' # check if the resource is available
|
91
|
+
dataset.rdf = data
|
91
92
|
dataset
|
92
93
|
rescue
|
93
94
|
nil
|
@@ -157,46 +158,6 @@ module OpenTox
|
|
157
158
|
features
|
158
159
|
end
|
159
160
|
|
160
|
-
=begin
|
161
|
-
def tuples
|
162
|
-
tuples = []
|
163
|
-
@model.subjects(RDF['type'], OT["Tuple"]).each do |t|
|
164
|
-
tuple = {}
|
165
|
-
compounds = []
|
166
|
-
@model.subjects(OT['values'], t).each do |data_entry|
|
167
|
-
compound_node = @model.object(data_entry,OT['compound'])
|
168
|
-
compounds << @model.object(compound_node, DC["identifier"]).to_s
|
169
|
-
end
|
170
|
-
@model.find(t, OT['tuple'],nil) do |s,p,pair|
|
171
|
-
feature_node = @model.object(pair, OT['feature'])
|
172
|
-
feature_name = @model.object(feature_node, DC['title']).to_s
|
173
|
-
value_node = @model.object(pair, OT['value'])
|
174
|
-
value = @model.object(value_node, OT['value']).to_s
|
175
|
-
value = value.to_f if value.match(/^[\d\.]+$/)
|
176
|
-
tuple[feature_name.to_sym] = value
|
177
|
-
end
|
178
|
-
tuple[:compounds] = compounds
|
179
|
-
tuples << tuple
|
180
|
-
end
|
181
|
-
tuples
|
182
|
-
end
|
183
|
-
|
184
|
-
def tuple(compound_uri)
|
185
|
-
compound_node = @model.subject(DC["identifier"],compound_uri)
|
186
|
-
#puts compound_uri
|
187
|
-
@model.subjects(OT['compound'], compound_node).each do |data_entry|
|
188
|
-
values_node = @model.object(data_entry, OT['values'])
|
189
|
-
@model.find(values_node, OT['tuple'], nil) do |s,p,tuple|
|
190
|
-
@model.find(tuple, OT['feature'], nil) do |s,p,feature|
|
191
|
-
name = @model.object(feature,DC['title']).to_s
|
192
|
-
#puts name
|
193
|
-
end
|
194
|
-
end
|
195
|
-
#puts values_node
|
196
|
-
end
|
197
|
-
end
|
198
|
-
=end
|
199
|
-
|
200
161
|
def compounds
|
201
162
|
compounds = []
|
202
163
|
@model.subjects(RDF['type'], OT["Compound"]).each do |compound_node|
|
@@ -222,8 +183,7 @@ module OpenTox
|
|
222
183
|
:source => self.source,
|
223
184
|
:identifier => self.identifier,
|
224
185
|
:compounds => self.compounds.collect{|c| c.to_s.to_s.sub(/^\[(.*)\]$/,'\1')},
|
225
|
-
:features => self.features.collect{|f| f.to_s }
|
226
|
-
:data_entries => self.data_entries,
|
186
|
+
:features => self.features.collect{|f| f.to_s }
|
227
187
|
}.to_yaml
|
228
188
|
end
|
229
189
|
|
data/lib/model.rb
CHANGED
@@ -1,43 +1,31 @@
|
|
1
1
|
module OpenTox
|
2
2
|
module Model
|
3
|
-
|
3
|
+
|
4
4
|
class Lazar
|
5
5
|
include Owl
|
6
6
|
|
7
|
-
attr_accessor :dataset, :predictions
|
8
|
-
|
9
7
|
# Create a new prediction model from a dataset
|
10
|
-
def initialize
|
11
|
-
super
|
12
|
-
id = File.basename(yaml,'.yaml')
|
13
|
-
# TODO Untyped Individual: http://localhost:4003/lazar/{id} ????
|
14
|
-
@lazar = YAML.load_file yaml
|
15
|
-
self.uri = File.join(@@config[:services]["opentox-model"],'lazar',id)
|
16
|
-
self.title = "lazar model for #{@lazar[:endpoint]}"
|
8
|
+
def initialize
|
9
|
+
super
|
17
10
|
self.source = "http://github.com/helma/opentox-model"
|
18
|
-
self.parameters = {
|
19
|
-
"Dataset URI" => { :scope => "mandatory", :value => "dataset_uri=#{@lazar[:activity_dataset]}" },
|
20
|
-
"Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri=#{@lazar[:endpoint]}" },
|
21
|
-
"Feature generation URI" => { :scope => "mandatory", :value => "feature_generation_uri=" } #TODO write to yaml
|
22
|
-
}
|
23
11
|
self.algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar")
|
24
|
-
self.
|
25
|
-
self.dependentVariables = @lazar[:endpoint]
|
26
|
-
self.independentVariables = "http://localhost:4002/fminer#BBRC_representative" # TODO read this from dataset
|
27
|
-
self.predictedVariables = @lazar[:endpoint] #+ " lazar prediction"
|
28
|
-
@dataset = OpenTox::Dataset.new
|
29
|
-
@predictions = {}
|
12
|
+
self.independentVariables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") # TODO read this from dataset
|
30
13
|
end
|
31
14
|
|
32
|
-
def self.
|
33
|
-
=
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
15
|
+
def self.from_yaml(yaml)
|
16
|
+
yaml = YAML.load yaml
|
17
|
+
lazar = Lazar.new
|
18
|
+
lazar.title = "lazar model for #{yaml[:endpoint]}"
|
19
|
+
lazar.parameters = {
|
20
|
+
"Dataset URI" => { :scope => "mandatory", :value => "dataset_uri=#{yaml[:activity_dataset]}" },
|
21
|
+
"Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri=#{yaml[:endpoint]}" },
|
22
|
+
"Feature generation URI" => { :scope => "mandatory", :value => "feature_generation_uri=#{File.join(@@config[:services]["opentox-algorithm"],"fminer")}"} #TODO write to yaml
|
23
|
+
}
|
24
|
+
lazar.algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar")
|
25
|
+
lazar.trainingDataset = yaml[:activity_dataset]
|
26
|
+
lazar.dependentVariables = yaml[:endpoint]
|
27
|
+
lazar.predictedVariables = yaml[:endpoint] #+ " lazar prediction"
|
28
|
+
lazar
|
41
29
|
end
|
42
30
|
|
43
31
|
def self.find_all
|
@@ -49,65 +37,6 @@ module OpenTox
|
|
49
37
|
RestClient.post(@uri, :compound_uri => compound.uri)
|
50
38
|
end
|
51
39
|
|
52
|
-
def database_activity?(compound_uri)
|
53
|
-
# find database activities
|
54
|
-
db_activities = @lazar[:activities][compound_uri]
|
55
|
-
if db_activities
|
56
|
-
c = @dataset.find_or_create_compound(compound_uri)
|
57
|
-
f = @dataset.find_or_create_feature(@lazar[:endpoint])
|
58
|
-
v = db_activities.join(',')
|
59
|
-
@dataset.add c,f,v
|
60
|
-
@predictions[compound_uri] = { @lazar[:endpoint] => {:measured_activities => db_activities}}
|
61
|
-
true
|
62
|
-
else
|
63
|
-
false
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def classify(compound_uri)
|
68
|
-
|
69
|
-
compound = OpenTox::Compound.new(:uri => compound_uri)
|
70
|
-
compound_matches = compound.match @lazar[:features]
|
71
|
-
|
72
|
-
conf = 0.0
|
73
|
-
neighbors = []
|
74
|
-
classification = nil
|
75
|
-
|
76
|
-
@lazar[:fingerprints].each do |uri,matches|
|
77
|
-
|
78
|
-
sim = OpenTox::Algorithm::Similarity.weighted_tanimoto(compound_matches,matches,@lazar[:p_values])
|
79
|
-
if sim > 0.3
|
80
|
-
neighbors << uri
|
81
|
-
@lazar[:activities][uri].each do |act|
|
82
|
-
case act.to_s
|
83
|
-
when 'true'
|
84
|
-
conf += OpenTox::Utils.gauss(sim)
|
85
|
-
when 'false'
|
86
|
-
conf -= OpenTox::Utils.gauss(sim)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
conf = conf/neighbors.size
|
93
|
-
if conf > 0.0
|
94
|
-
classification = true
|
95
|
-
elsif conf < 0.0
|
96
|
-
classification = false
|
97
|
-
end
|
98
|
-
|
99
|
-
compound = @dataset.find_or_create_compound(compound_uri)
|
100
|
-
feature = @dataset.find_or_create_feature(@lazar[:endpoint])
|
101
|
-
tuple = @dataset.create_tuple(feature,{ 'lazar#classification' => classification, 'lazar#confidence' => conf})
|
102
|
-
@dataset.add_tuple compound,tuple
|
103
|
-
@predictions[compound_uri] = { @lazar[:endpoint] => { :lazar_prediction => {
|
104
|
-
:classification => classification,
|
105
|
-
:confidence => conf,
|
106
|
-
:neighbors => neighbors,
|
107
|
-
:features => compound_matches
|
108
|
-
} } }
|
109
|
-
end
|
110
|
-
|
111
40
|
def self.base_uri
|
112
41
|
@@config[:services]["opentox-model"]
|
113
42
|
end
|
data/lib/owl.rb
CHANGED
@@ -12,7 +12,7 @@ module OpenTox
|
|
12
12
|
|
13
13
|
# read OT Ontology
|
14
14
|
#@parser.parse_into_model(@model,"http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file")
|
15
|
-
|
15
|
+
#@parser.parse_string_into_model(@model,File.read(File.join(File.dirname(__FILE__),"opentox.owl")),'/')
|
16
16
|
# reate an anonymous resource for metadata
|
17
17
|
# this has to be rewritten with an URI as soon as the resource has been saved at an definitive location
|
18
18
|
tmp = @model.create_resource
|
data/lib/task.rb
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
module OpenTox
|
2
2
|
|
3
|
-
class Task
|
3
|
+
class Task
|
4
|
+
|
5
|
+
attr_accessor :uri
|
4
6
|
|
5
7
|
def initialize(uri)
|
6
|
-
super(
|
8
|
+
#super()
|
9
|
+
@uri = uri
|
7
10
|
end
|
8
11
|
|
9
|
-
#def self.create(uri)
|
10
12
|
def self.create
|
11
|
-
|
12
|
-
uri = RestClient.post @@config[:services]["opentox-task"], ''#, :dataset_uri => uri
|
13
|
+
uri = RestClient.post @@config[:services]["opentox-task"], nil
|
13
14
|
Task.new(uri)
|
14
15
|
end
|
15
16
|
|
16
|
-
def self.find(
|
17
|
-
Task.new(
|
17
|
+
def self.find(uri)
|
18
|
+
Task.new(uri)
|
18
19
|
end
|
19
20
|
|
20
21
|
def self.base_uri
|
@@ -22,32 +23,32 @@ module OpenTox
|
|
22
23
|
end
|
23
24
|
|
24
25
|
def start
|
25
|
-
RestClient.put @uri,
|
26
|
+
RestClient.put File.join(@uri,'started'), nil
|
26
27
|
end
|
27
28
|
|
28
|
-
def
|
29
|
-
RestClient.put @uri,
|
29
|
+
def cancel
|
30
|
+
RestClient.put File.join(@uri,'cancelled'), nil
|
30
31
|
end
|
31
32
|
|
32
|
-
def completed
|
33
|
-
RestClient.put @uri, :
|
33
|
+
def completed(uri)
|
34
|
+
RestClient.put File.join(@uri,'completed'), :resource => uri
|
34
35
|
end
|
35
36
|
|
36
37
|
def status
|
37
38
|
RestClient.get File.join(@uri, 'status')
|
38
39
|
end
|
39
|
-
|
40
|
-
def
|
41
|
-
|
40
|
+
|
41
|
+
def resource
|
42
|
+
RestClient.get File.join(@uri, 'resource')
|
42
43
|
end
|
43
44
|
|
44
|
-
def
|
45
|
-
|
45
|
+
def completed?
|
46
|
+
self.status.to_s == 'completed'
|
46
47
|
end
|
47
48
|
|
48
49
|
def wait_for_completion
|
49
50
|
until self.completed?
|
50
|
-
sleep 1
|
51
|
+
sleep 0.1
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
data/lib/tasks/opentox.rb
CHANGED
@@ -1,24 +1,4 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'opentox-ruby-api-wrapper.rb')
|
2
|
-
require File.join(File.dirname(__FILE__), 'redis.rb')
|
3
|
-
|
4
|
-
namespace :redis do
|
5
|
-
|
6
|
-
desc "Flush Redis testing database"
|
7
|
-
task :flush do
|
8
|
-
require 'redis'
|
9
|
-
r = Redis.new :db => 2
|
10
|
-
r.flush_db
|
11
|
-
end
|
12
|
-
|
13
|
-
desc "Flush all Redis databases"
|
14
|
-
task :flushall do
|
15
|
-
require 'redis'
|
16
|
-
r = Redis.new
|
17
|
-
r.flush_all
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
2
|
|
23
3
|
namespace :opentox do
|
24
4
|
|
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.2.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christoph Helma
|
@@ -9,11 +9,11 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-09 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: sinatra
|
17
17
|
type: :runtime
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -23,7 +23,7 @@ dependencies:
|
|
23
23
|
version: "0"
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
26
|
+
name: rest-client
|
27
27
|
type: :runtime
|
28
28
|
version_requirement:
|
29
29
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -82,6 +82,26 @@ dependencies:
|
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: "0"
|
84
84
|
version:
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: dm-more
|
87
|
+
type: :runtime
|
88
|
+
version_requirement:
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: "0"
|
94
|
+
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:
|
85
105
|
- !ruby/object:Gem::Dependency
|
86
106
|
name: cucumber
|
87
107
|
type: :development
|