summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Helma <helma@in-silico.de>2009-09-02 17:42:54 +0200
committerChristoph Helma <helma@in-silico.de>2009-09-02 17:42:54 +0200
commit7eb5449788d55bd268d3dab6025a2cabc26c248a (patch)
tree394b9fb72a097ec685f99af4abd4628d4140a932
parent34124d5b002f15980bf1c36ddfa837e8d123991f (diff)
dataset class separated from application
-rw-r--r--application.rb161
-rw-r--r--dataset.rb148
-rw-r--r--test/test.rb6
3 files changed, 200 insertions, 115 deletions
diff --git a/application.rb b/application.rb
index f26d664..a23b52a 100644
--- a/application.rb
+++ b/application.rb
@@ -14,106 +14,12 @@ when 'test'
end
set :default_content, :yaml
-
-class Dataset
-
- include OpenTox::Utils
- attr_reader :uri, :name
-
- def initialize(uri)
- @name = File.basename(uri)
- @uri = uri
- end
-
- def self.create(uri)
- dataset = Dataset.new(uri)
- dataset.save
- dataset
- end
-
- def self.find(uri)
- if @@redis.set_member? "datasets", uri
- Dataset.new(uri)
- else
- nil
- end
- end
-
- def self.exists?(uri)
- @@redis.set_member? "datasets", uri
- end
-
- def self.find_all_uris
- @@redis.set_members("datasets")
- end
-
- def save
- @@redis.set_add "datasets", uri
- end
-
- def destroy
- @@redis.set_members(@uri + '::compounds').each do |compound_uri|
- @@redis.delete @uri + '::' + compound_uri
- end
- @@redis.delete @uri + '::compounds'
- @@redis.set_members(@uri + '::features').each do |feature_uri|
- @@redis.delete @uri + '::' + feature_uri
- end
- @@redis.delete @uri + '::features'
- @@redis.set_delete "datasets", @uri
- end
-
- def add(compound_uri,feature_uri)
- @@redis.set_add @uri + '::compounds', compound_uri
- @@redis.set_add @uri + '::features', feature_uri
- @@redis.set_add @uri + '::' + compound_uri + '::features', feature_uri
- @@redis.set_add @uri + '::' + feature_uri + '::compounds', compound_uri
- end
-
- def compound_uris
- @@redis.set_members(@uri + "::compounds")
- end
-
- def feature_uris
- @@redis.set_members(@uri + "::features")
- end
-
- def feature_uris_for_compound(compound_uri)
- @@redis.set_members(@uri + '::' + compound_uri + '::features')
- end
-
- def compound_uris_for_feature(feature_uri)
- @@redis.set_members(@uri + '::' + feature_uri + '::compounds')
- end
-
- def tanimoto(compound_uris)
- raise "Exactly 2 compounds are needed for similarity calculations" unless compound_uris.size == 2
- compound_keys = compound_uris.collect{ |c| @uri + '::' + c + "::features" }
- union_size = @@redis.set_union(compound_keys[0], compound_keys[1]).size
- intersect_size = @@redis.set_intersect(compound_keys[0], compound_keys[1]).size
- intersect_size.to_f/union_size.to_f
- end
-
- def weighted_tanimoto(compound_uris)
- raise "Exactly 2 compounds are needed for similarity calculations" unless compound_uris.size == 2
- compound_keys = compound_uris.collect{ |c| @uri + '::' + c + "::features" }
- union = @@redis.set_union(compound_keys[0], compound_keys[1])
- intersect = @@redis.set_intersect(compound_keys[0], compound_keys[1])
-
- p_sum_union = 0.0
- p_sum_intersect = 0.0
-
- union.each{ |f| p_sum_union += gauss(OpenTox::Feature.new(:uri => f).value('p_value').to_f) }
- intersect.each{ |f| p_sum_intersect += gauss(OpenTox::Feature.new(:uri => f).value('p_value').to_f) }
- "#{p_sum_intersect/p_sum_union}"
- end
-
-end
+load File.join(File.dirname(__FILE__), 'dataset.rb')
helpers do
def not_found?
- halt 404, "Dataset \"#{params[:name]}\" not found." unless Dataset.exists? uri(params[:name])
+ halt 404, "Dataset \"#{params[:name]}\" not found." unless @dataset = Dataset.find(uri(params[:name]))
end
def uri(name)
@@ -122,15 +28,23 @@ helpers do
end
+=begin
+# current sinatra version does not halt in before filter, should be resolved in future versions
+before do
+ if params[:name] and !request.post?
+ halt 404, "Dataset \"#{params[:name]}\" not found." unless @dataset = Dataset.find(url_for("/", :full) + name.gsub(/\s|\n/,'_'))
+ end
+end
+=end
+
## REST API
get '/?' do
- Dataset.find_all_uris.join("\n")
+ Dataset.find_all.join("\n")
end
get '/:name' do
not_found?
- @dataset = Dataset.find(uri params[:name])
respond_to do |format|
format.yaml { @dataset.to_yaml }
format.xml { builder :dataset }
@@ -144,35 +58,35 @@ end
get '/:name/compounds' do
not_found?
- Dataset.find(uri params[:name]).compound_uris.join("\n")
+ @dataset.compound_uris.join("\n")
end
get '/:name/features' do
not_found?
- Dataset.find(uri params[:name]).feature_uris.join("\n")
+ @dataset.feature_uris.join("\n")
end
get '/:name/compound/*/features' do
not_found?
compound_uri = params[:splat].first.gsub(/ /,'+')
- Dataset.find(uri params[:name]).feature_uris_for_compound(compound_uri).join("\n")
+ @dataset.feature_uris_for_compound(compound_uri).join("\n")
end
get '/:name/feature/*/compounds' do
not_found?
- Dataset.find(uri params[:name]).compound_uris_for_feature(params[:splat].first).join("\n")
+ @dataset.compound_uris_for_feature(params[:splat].first).join("\n")
end
-get '/:name/tanimoto/compound/*/compound/*/?' do
- not_found?
+get '/tanimoto/:name0/compound/*/:name1/compound/*/?' do
compound_uris = params[:splat].collect{ |c| c.gsub(/ /,'+') }
- "#{Dataset.find(uri params[:name]).tanimoto(compound_uris)}"
+ features = [ {:dataset_uri => uri(params[:name0]), :compound_uri => compound_uris[0]}, {:dataset_uri => uri(params[:name1]), :compound_uri => compound_uris[1]} ]
+ "#{Dataset.tanimoto(features)}"
end
-get '/:name/weighted_tanimoto/compound/*/compound/*/?' do
- not_found?
+get '/weighted_tanimoto/:name0/compound/*/:name1/compound/*/?' do
compound_uris = params[:splat].collect{ |c| c.gsub(/ /,'+') }
- Dataset.find(uri params[:name]).weighted_tanimoto(compound_uris)
+ features = [ {:dataset_uri => uri(params[:name0]), :compound_uri => compound_uris[0]}, {:dataset_uri => uri(params[:name1]), :compound_uri => compound_uris[1]} ]
+ Dataset.weighted_tanimoto(features)
end
post '/?' do
@@ -195,15 +109,36 @@ end
put '/:name/?' do
#protected!
not_found?
- dataset = Dataset.find(uri params[:name])
- dataset.add(params[:compound_uri],params[:feature_uri])
- dataset.uri + " sucessfully updated."
+ @dataset.add(params[:compound_uri],params[:feature_uri])
+ @dataset.uri + " sucessfully updated."
end
delete '/:name/?' do
- # dangerous, because other datasets might refer to it
#protected!
not_found?
- Dataset.find(uri params[:name]).destroy
+ @dataset.destroy
"Successfully deleted dataset \"#{params[:name]}\"."
end
+
+# Dataset collections
+get '/collections/?' do
+ DatasetCollection.find_all.join("\n")
+end
+
+get '/collection/:name/?' do
+ @collection = DatasetCollection.find(uri params[:name])
+ respond_to do |format|
+ format.yaml { @collection.to_yaml }
+ format.xml { builder :collection }
+ end
+end
+
+post '/collections/?' do
+ halt 403, "Dataset collection \"#{name}\" exists - please choose another name." if DatasetCollection.exists?(uri params[:name])
+ DatasetCollection.create(uri params[:name], :dataset_uris => params[:datasets]).uri
+end
+
+delete '/collection/:name/?' do
+ DatasetCollection.find(uri params[:name]).destroy
+ "Successfully deleted dataset collection \"#{params[:name]}\"."
+end
diff --git a/dataset.rb b/dataset.rb
new file mode 100644
index 0000000..00872b9
--- /dev/null
+++ b/dataset.rb
@@ -0,0 +1,148 @@
+class Dataset
+
+ #include OpenTox::Utils
+ attr_reader :uri, :name
+
+ def initialize(uri)
+ @name = File.basename(uri)
+ @uri = uri
+ end
+
+ def self.create(uri)
+ dataset = Dataset.new(uri)
+ dataset.save
+ dataset
+ end
+
+ def self.find(uri)
+ if @@redis.set_member? "datasets", uri
+ Dataset.new(uri)
+ else
+ nil
+ end
+ end
+
+ def self.exists?(uri)
+ @@redis.set_member? "datasets", uri
+ end
+
+ def self.find_all
+ @@redis.set_members("datasets")
+ end
+
+ def save
+ @@redis.set_add "datasets", @uri
+ end
+
+ def destroy
+ @@redis.set_members(@uri + '::compounds').each do |compound_uri|
+ @@redis.delete @uri + '::' + compound_uri
+ end
+ @@redis.delete @uri + '::compounds'
+ @@redis.set_members(@uri + '::features').each do |feature_uri|
+ @@redis.delete @uri + '::' + feature_uri
+ end
+ @@redis.delete @uri + '::features'
+ @@redis.set_delete "datasets", @uri
+ end
+
+ def add(compound_uri,feature_uri)
+ @@redis.set_add @uri + '::compounds', compound_uri
+ @@redis.set_add @uri + '::features', feature_uri
+ @@redis.set_add @uri + '::' + compound_uri + '::features', feature_uri
+ @@redis.set_add @uri + '::' + feature_uri + '::compounds', compound_uri
+ end
+
+ def compound_uris
+ @@redis.set_members(@uri + "::compounds")
+ end
+
+ def feature_uris
+ @@redis.set_members(@uri + "::features")
+ end
+
+ def feature_uris_for_compound(compound_uri)
+ @@redis.set_members(@uri + '::' + compound_uri + '::features')
+ end
+
+ def compound_uris_for_feature(feature_uri)
+ @@redis.set_members(@uri + '::' + feature_uri + '::compounds')
+ end
+
+ def self.tanimoto(features)
+ raise "Exactly 2 compounds are needed for similarity calculations" unless features.size == 2
+ compound_keys = features.collect{ |f| f[:dataset_uri] + '::' + f[:compound_uri] + "::features" }
+ union_size = @@redis.set_union(compound_keys[0], compound_keys[1]).size
+ intersect_size = @@redis.set_intersect(compound_keys[0], compound_keys[1]).size
+ intersect_size.to_f/union_size.to_f
+ end
+
+ def self.weighted_tanimoto(features)
+ raise "Exactly 2 compounds are needed for similarity calculations" unless features.size == 2
+ compound_keys = features.collect{ |f| f[:dataset_uri] + '::' + f[:compound_uri] + "::features" }
+ union = @@redis.set_union(compound_keys[0], compound_keys[1])
+ intersect = @@redis.set_intersect(compound_keys[0], compound_keys[1])
+
+ p_sum_union = 0.0
+ p_sum_intersect = 0.0
+
+ union.each{ |f| p_sum_union += OpenTox::Utils::gauss(OpenTox::Feature.new(:uri => f).value('p_value').to_f) }
+ intersect.each{ |f| p_sum_intersect += OpenTox::Utils::gauss(OpenTox::Feature.new(:uri => f).value('p_value').to_f) }
+ "#{p_sum_intersect/p_sum_union}"
+ end
+
+end
+
+class Set
+
+ attr_accessor :uri, :set_uris
+
+ def initialize(uri, set_uris)
+ @uri = uri
+ @set_uris = set_uris
+ end
+
+ def self.create(uri, set_uris)
+ collection = DatasetCollection.new(uri, set_uris)
+ collection.save
+ collection
+ end
+
+ def self.find(uri)
+ if @@redis.set_member? "collections", uri
+ set_uris = @@redis.set_members uri
+ DatasetCollection.new(uri, set_uris)
+ else
+ nil
+ end
+ end
+
+ def self.exists?(uri)
+ @@redis.set_member? "collections", uri
+ end
+
+ def self.find_all
+ @@redis.set_members("collections").collect{ |uri| self.find(uri) }
+ end
+
+ def save
+ @@redis.set_add "collections", @uri
+ @set_uris.each do |uri|
+ @@redis.set_add @uri + '::sets', uri
+ end
+ end
+
+ def destroy
+ @set_uris.each do |uri|
+ Dataset.new(uri).destroy
+ end
+ @@redis.delete @uri + '::sets'
+ @@redis.set_delete "collections", @uri
+ end
+
+ def add(set_uri)
+ @set_uris << set_uri
+ @@redis.set_add @uri, set_uri
+ end
+
+end
diff --git a/test/test.rb b/test/test.rb
index b1bae83..65959bf 100644
--- a/test/test.rb
+++ b/test/test.rb
@@ -135,6 +135,8 @@ class DatasetsTest < Test::Unit::TestCase
uri = last_response.body
get uri
assert last_response.ok?
+ get uri + '/name'
+ name = last_response.body
data.each do |smiles,features|
compound_uri = OpenTox::Compound.new(:smiles => smiles).uri
@@ -150,7 +152,7 @@ class DatasetsTest < Test::Unit::TestCase
data.each do |s,f|
unless s == smiles
neighbor_uri = OpenTox::Compound.new(:smiles => s).uri
- get uri + "/tanimoto/compound/#{compound_uri}/compound/#{neighbor_uri}"
+ get "/tanimoto/#{name}/compound/#{compound_uri}/#{name}/compound/#{neighbor_uri}"
assert last_response.ok?
sim = last_response.body
features_a = data[smiles].keys
@@ -160,7 +162,7 @@ class DatasetsTest < Test::Unit::TestCase
mysim = intersect.size.to_f/union.size.to_f
assert_equal sim, mysim.to_s
puts "tanimoto::#{smiles}::#{s}::#{last_response.body}"
- get uri + "/weighted_tanimoto/compound/#{compound_uri}/compound/#{neighbor_uri}"
+ get "/weighted_tanimoto/#{name}/compound/#{compound_uri}/#{name}/compound/#{neighbor_uri}"
assert last_response.ok?
puts "weighted_tanimoto::#{smiles}::#{s}::#{last_response.body}"
end