From e5b63460933112573a4e5ed1f2825c9267370ce0 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 17 Aug 2009 11:04:41 +0200 Subject: lazar prediction class added, tests finished --- lib/opentox-ruby-api-wrapper.rb | 70 ++++++++++++++++++++++------------- test/opentox-ruby-api-wrapper_test.rb | 46 +++++++---------------- test/start-local-webservices.rb | 13 +++++++ 3 files changed, 71 insertions(+), 58 deletions(-) create mode 100755 test/start-local-webservices.rb diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 001c9ac..3f9d739 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -19,19 +19,21 @@ module OpenTox URI.escape(string, /[^\w]/) end + # Returns true if object creation has finished (for asynchronous processes) def finished? YAML.load(RestClient.get(@uri))[:finished] end - def finished - print "closing " - puts @uri + '/finished' - RestClient.post @uri + '/finished' + # Get the object name + def name + RestClient.get @uri + '/name' end + # Deletes an object def destroy RestClient.delete @uri end + end class Compound < OpenTox @@ -87,11 +89,6 @@ module OpenTox RestClient.get @uri + '/' + property end - # Get the name of the feature - def name - RestClient.get @uri + '/name' - end - end class Dataset < OpenTox @@ -102,29 +99,18 @@ module OpenTox @uri = params[:uri].to_s elsif params[:name] and params[:filename] @uri = `curl -X POST -F file=@#{params[:filename]} -F name="#{params[:name]}" #{ENV['OPENTOX_DATASET']}` - elsif params[:name] - @uri = RestClient.post ENV['OPENTOX_DATASET'], :name => params[:name] + elsif params[:name] + @uri = RestClient.post ENV['OPENTOX_DATASET'], :name => params[:name], :data => params[:data].to_yaml end end - def finished - print "closing " - puts @uri + '/finished' - RestClient.post(@uri + '/finished',nil) - end - - # Get the dataset name - def name - RestClient.get @uri + '/name' - end - # Get all compounds from a dataset def compounds RestClient.get(@uri + '/compounds').split("\n").collect{ |c| Compound.new(:uri => c) } end - # Get all compounds and features from a dataset, returns a hash with compound_uris as keys and arrays of features as values - def all_compounds_and_features + # Get all compounds and features from a dataset, returns a hash with compound_uris as keys and arrays of feature_uris as values + def all_compounds_and_features_uris YAML.load(RestClient.get(@uri + '/compounds/features')) end @@ -140,7 +126,13 @@ module OpenTox # Add a compound and a feature to a dataset def add(compound,feature) - RestClient.post @uri, :compound_uri => compound.uri, :feature_uri => feature.uri + RestClient.put @uri, :compound_uri => compound.uri, :feature_uri => feature.uri + end + + # Tell the dataset that it is complete + def close + puts @uri + '/finished' + RestClient.put @uri + '/finished', nil end end @@ -171,7 +163,33 @@ module OpenTox # Predict a compound def predict(compound) - RestClient.post @uri, :compound_uri => compound.uri + LazarPrediction.new(:uri => RestClient.post(@uri, :compound_uri => compound.uri)) + end + + end + + class LazarPrediction < OpenTox + + def initialize(params) + if params[:uri] + @uri = params[:uri] + end + end + + def classification + YAML.load(RestClient.get @uri)[:classification] + end + + def confidence + YAML.load(RestClient.get @uri)[:confidence] + end + + def neighbors + RestClient.get @uri + '/neighbors' + end + + def features + RestClient.get @uri + '/features' end end diff --git a/test/opentox-ruby-api-wrapper_test.rb b/test/opentox-ruby-api-wrapper_test.rb index 256a06a..6b09c4a 100644 --- a/test/opentox-ruby-api-wrapper_test.rb +++ b/test/opentox-ruby-api-wrapper_test.rb @@ -3,62 +3,44 @@ require 'test_helper' class OpentoxRubyApiWrapperTest < Test::Unit::TestCase def setup - @pids = [] - port = 5000 - [ "opentox-compound", "opentox-feature" , "opentox-dataset" , "opentox-fminer" , "opentox-lazar" ].each do |component| - ENV[component.upcase.gsub(/-/,'_')] = "http://localhost:#{port}/" -=begin - Dir.chdir ENV['HOME'] + '/webservices/' + component - Dir["test.sqlite3"].each { |f| FileUtils.rm_rf(f) } - file = 'application.rb' - @pids << fork {`urxvt -title #{component} -e thin --debug --rackup config.ru start -p #{port} -e test`} - Process.detach(@pids.last) -=end - port += 1 - end - end - -=begin - def teardown - @pids.each do |pid| - begin - Process.kill(9,pid) - puts "killed " + pid.to_s - rescue - puts "failed to kill process" + pid.to_s + if ENV['LOCAL'] + port = 5000 + [ "opentox-compound", "opentox-feature" , "opentox-dataset" , "opentox-fminer" , "opentox-lazar" ].each do |component| + ENV[component.upcase.gsub(/-/,'_')] = "http://localhost:#{port}/" + port += 1 end end end -=end def test_create_dataset_and_model_and_make_a_prediction - #sleep 15 dataset = OpenTox::Dataset.new :name => "Hamster Carcinogenicity", :filename => "test/hamster_carcinogenicity.csv" puts dataset.uri wait_for_completion dataset assert_match(/#{ENV['OPENTOX_DATASET']}\d+$/,dataset.uri) assert_equal("Hamster Carcinogenicity",dataset.name) + assert_equal(true,dataset.finished?) lazar = OpenTox::Lazar.new :dataset_uri => dataset.uri puts lazar.uri wait_for_completion lazar + assert_equal(true,lazar.finished?) assert_match(/#{ENV['OPENTOX_LAZAR']}model\/\d+$/,lazar.uri) query_structure = OpenTox::Compound.new :smiles => 'c1ccccc1NN' + puts query_structure.uri prediction = lazar.predict query_structure puts prediction.uri wait_for_completion prediction - puts prediction.to_yaml + puts prediction.classification + puts prediction.confidence + puts prediction.neighbors + puts prediction.features assert_equal(true, prediction.classification) - assert_match(/\d+/, prediction.classification) + assert_match(/0\.\d+/, prediction.confidence.to_s) end end def wait_for_completion(object) - timeout = 60 - time = 0 - while (!object.finished? and time < timeout) + while (!object.finished?) sleep 1 - time += 1 end - puts "timeout" if timeout >= 60 end diff --git a/test/start-local-webservices.rb b/test/start-local-webservices.rb new file mode 100755 index 0000000..66dea29 --- /dev/null +++ b/test/start-local-webservices.rb @@ -0,0 +1,13 @@ +#!/usr/bin/env ruby +require 'fileutils' + +port = 5000 +[ "opentox-compound", "opentox-feature" , "opentox-dataset" , "opentox-fminer" , "opentox-lazar" ].each do |component| + ENV[component.upcase.gsub(/-/,'_')] = "http://localhost:#{port}/" + Dir.chdir ENV['HOME'] + '/webservices/' + component + Dir["test.sqlite3"].each { |f| FileUtils.rm_rf(f) } + file = 'application.rb' + pid = fork {`urxvt -title #{component} -e thin --debug --rackup config.ru start -p #{port} -e test`} + Process.detach(pid) + port += 1 +end -- cgit v1.2.3