diff options
author | Christoph Helma <helma@in-silico.de> | 2009-09-02 17:42:54 +0200 |
---|---|---|
committer | Christoph Helma <helma@in-silico.de> | 2009-09-02 17:42:54 +0200 |
commit | 7eb5449788d55bd268d3dab6025a2cabc26c248a (patch) | |
tree | 394b9fb72a097ec685f99af4abd4628d4140a932 | |
parent | 34124d5b002f15980bf1c36ddfa837e8d123991f (diff) |
dataset class separated from application
-rw-r--r-- | application.rb | 161 | ||||
-rw-r--r-- | dataset.rb | 148 | ||||
-rw-r--r-- | test/test.rb | 6 |
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 |