summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgebele <gebele@alfadeo.de>2011-08-22 12:49:09 +0200
committergebele <gebele@alfadeo.de>2011-08-22 12:49:09 +0200
commit7947128ea346ef96aa703fc5070bd9b00588d425 (patch)
tree5bf1673dae40f6d32a523bcd16f76d9808b1fd40
parentb68548f0c56b6384cd7e7f3c5463ec4d6a4afeec (diff)
merge from development -> lazar-gui
-rw-r--r--application.rb91
-rw-r--r--helper.rb30
-rw-r--r--model.rb2
-rwxr-xr-xpublic/javascripts/toxcreate.js4
-rw-r--r--views/classification_validation.haml4
-rw-r--r--views/help.haml28
-rw-r--r--views/model.haml4
7 files changed, 67 insertions, 96 deletions
diff --git a/application.rb b/application.rb
index ee851d9..104003e 100644
--- a/application.rb
+++ b/application.rb
@@ -9,8 +9,9 @@ require 'ftools'
require File.join(File.dirname(__FILE__),'model.rb')
require File.join(File.dirname(__FILE__),'helper.rb')
-use Rack::Session::Cookie, :expire_after => 28800,
- :secret => "ui6vaiNi-change_me"
+#moved to wrapper->environment
+#use Rack::Session::Cookie, :expire_after => 28800,
+# :secret => "ui6vaiNi-change_me"
use Rack::Flash
set :lock, true
@@ -31,7 +32,7 @@ helpers do
private
def delete_model(model, subjectid=nil)
- task = OpenTox::Task.create("Deleting model: #{model.uri}",url_for("/delete",:full)) do |task|
+ task = OpenTox::Task.create("Deleting model: #{model.web_uri}", url_for("/delete",:full)) do |task|
begin OpenTox::RestClientWrapper.put(File.join(model.task_uri, "Cancelled"), "Cancelled",{:subjectid => subjectid}) if model.task_uri rescue LOGGER.warn "Cannot cancel task #{model.task_uri}" end
task.progress(15)
delete_dependent(model.uri, subjectid) if model.uri
@@ -49,15 +50,25 @@ helpers do
if model.feature_dataset
delete_dependent(model.feature_dataset, subjectid) if model.feature_dataset.match(CONFIG[:services]["opentox-dataset"])
end
+ task.progress(95)
+ model.delete
+ unless ToxCreateModel.get(model.id)
+ begin
+ aa = OpenTox::Authorization.delete_policies_from_uri(model.web_uri, @subjectid)
+ LOGGER.debug "Policy deleted for ToxCreateModel URI: #{model.web_uri} with result: #{aa}"
+ rescue
+ LOGGER.warn "Policy delete error for ToxCreateModel URI: #{model.web_uri}"
+ end
+ end
task.progress(100)
- ""
+ url_for("/models",:full)
end
end
def delete_dependent(uri, subjectid=nil)
begin
- RestClient.delete(uri, :subjectid => subjectid) if subjectid
- RestClient.delete(uri) if !subjectid
+ OpenTox::RestClientWrapper.delete(uri, :subjectid => subjectid) if subjectid
+ OpenTox::RestClientWrapper.delete(uri) if !subjectid
rescue
LOGGER.warn "Can not delete uri: #{uri}"
end
@@ -81,7 +92,7 @@ end
get '/models/?' do
@models = ToxCreateModel.all.sort(:order => "DESC")
@models.each{|m| raise "internal redis error: model is nil" unless m}
- subjectstring = session[:subjectid] ? "?subjectid=#{CGI.escape(session[:subjectid])}" : ""
+ subjectstring = @subjectid ? "?subjectid=#{CGI.escape(@subjectid)}" : ""
haml :models, :locals=>{:models=>@models, :subjectstring => subjectstring}
end
@@ -145,7 +156,7 @@ end
get '/model/:id/:view/?' do
response['Content-Type'] = 'text/plain'
model = ToxCreateModel.get(params[:id])
- subjectstring = session[:subjectid] ? "?subjectid=#{CGI.escape(session[:subjectid])}" : ""
+ subjectstring = @subjectid ? "?subjectid=#{CGI.escape(@subjectid)}" : ""
begin
case params[:view]
when "model"
@@ -199,7 +210,7 @@ end
post '/feature' do
session[:dataset] = params[:dataset]
@features = []
- OpenTox::Dataset.new(params[:dataset]).load_features.each do |uri,metadata|
+ OpenTox::Dataset.new(params[:dataset], @subjectid).load_features(@subjectid).each do |uri,metadata|
@features << OpenTox::Feature.find(uri, @subjectid) if metadata[OWL.sameAs].match(/#{session[:echa]}/)
end
haml :feature
@@ -218,18 +229,16 @@ post '/models' do # create a new model
redirect url_for('/create')
end
- subjectid = session[:subjectid] ? session[:subjectid] : nil
-
if params[:dataset] and params[:prediction_feature]
- @dataset = OpenTox::Dataset.new(params[:dataset],subjectid)
+ @dataset = OpenTox::Dataset.new(params[:dataset], @subjectid)
name = @dataset.load_metadata[DC.title]
- @prediction_feature = OpenTox::Feature.find params[:prediction_feature], subjectid
+ @prediction_feature = OpenTox::Feature.find params[:prediction_feature], @subjectid
@dataset.load_compounds
elsif params[:file][:filename]
name = params[:file][:filename].sub(/\..*$/,"")
end
- @model = ToxCreateModel.create(:name => name, :subjectid => subjectid)
+ @model = ToxCreateModel.create(:name => name, :subjectid => @subjectid)
@model.update :web_uri => url_for("/model/#{@model.id}", :full), :warnings => ""
task = OpenTox::Task.create("Toxcreate Task - Uploading dataset and creating lazar model",url_for("/models",:full)) do |task|
@@ -238,33 +247,33 @@ post '/models' do # create a new model
unless params[:dataset] and params[:prediction_feature]
begin
- @dataset = OpenTox::Dataset.create(nil, subjectid)
+ @dataset = OpenTox::Dataset.create(nil, @subjectid)
# check format by extension - not all browsers provide correct content-type])
case File.extname(params[:file][:filename])
when ".csv"
csv = params[:file][:tempfile].read
- @dataset.load_csv(csv, subjectid)
+ @dataset.load_csv(csv, @subjectid)
when ".xls", ".xlsx"
excel_file = params[:file][:tempfile].path + File.extname(params[:file][:filename])
File.rename(params[:file][:tempfile].path, excel_file) # add extension, spreadsheet does not read files without extensions
- @dataset.load_spreadsheet(Excel.new excel_file, subjectid)
+ @dataset.load_spreadsheet(Excel.new excel_file, @subjectid)
if @dataset.metadata[OT.Errors]
raise "Incorrect file format. Please follow the instructions for #{link_to "Excel", "/help"} or #{link_to "CSV", "/help"} formats."
end
when ".sdf"
sdf = params[:file][:tempfile].read
- @dataset.load_sdf(sdf, subjectid)
+ @dataset.load_sdf(sdf, @subjectid)
else
raise "#{params[:file][:filename]} has an unsupported file type."
end
- @dataset.save(subjectid)
+ @dataset.save(@subjectid)
rescue => e
error "Dataset creation failed '#{e.message}'",e
end
if @dataset.features.keys.size != 1
error "More than one feature in dataset #{params[:file][:filename]}. Please delete irrelvant columns and try again."
else
- @prediction_feature = OpenTox::Feature.find(@dataset.features.keys.first,subjectid)
+ @prediction_feature = OpenTox::Feature.find(@dataset.features.keys.first,@subjectid)
end
end
@@ -276,7 +285,7 @@ post '/models' do # create a new model
@model.update :warnings => @dataset.metadata[OT.Warnings] unless @dataset.metadata[OT.Warnings] and @dataset.metadata[OT.Warnings].empty?
task.progress(15)
begin
- lazar = OpenTox::Model::Lazar.create( {:dataset_uri => @dataset.uri, :prediction_feature => @prediction_feature.uri, :subjectid => subjectid},
+ lazar = OpenTox::Model::Lazar.create( {:dataset_uri => @dataset.uri, :prediction_feature => @prediction_feature.uri, :subjectid => @subjectid},
OpenTox::SubTask.new(task,15,25))
rescue => e
error "Model creation failed",e # Please check if the input file is in a valid #{link_to "Excel", "/help"} or #{link_to "CSV", "/help"} format."
@@ -297,7 +306,7 @@ post '/models' do # create a new model
crossvalidation = OpenTox::Crossvalidation.create( {
:algorithm_uri => lazar.metadata[OT.algorithm],
:dataset_uri => lazar.parameter("dataset_uri"),
- :subjectid => subjectid,
+ :subjectid => @subjectid,
:prediction_feature => lazar.parameter("prediction_feature"),
:algorithm_params => "feature_generation_uri=#{lazar.parameter("feature_generation_uri")}" },
nil, OpenTox::SubTask.new(task,25,80))
@@ -306,12 +315,12 @@ post '/models' do # create a new model
LOGGER.debug "Validation URI: #{@model.validation_uri}"
# create summary
- validation = crossvalidation.statistics(subjectid)
+ validation = crossvalidation.statistics(@subjectid)
@model.update(:nr_predictions => validation.metadata[OT.numInstances].to_i - validation.metadata[OT.numUnpredicted].to_i)
if validation.metadata[OT.classificationStatistics]
@model.update(:correct_predictions => validation.metadata[OT.classificationStatistics][OT.percentCorrect].to_f)
@model.update(:confusion_matrix => validation.confusion_matrix.to_yaml)
- @model.update(:weighted_area_under_roc => validation.metadata[OT.classificationStatistics][OT.weightedAreaUnderRoc].to_f)
+ @model.update(:average_area_under_roc => validation.metadata[OT.classificationStatistics][OT.averageAreaUnderRoc].to_f)
validation.metadata[OT.classificationStatistics][OT.classValueStatistics].each do |m|
if m[OT.classValue] =~ TRUE_REGEXP
#HACK: estimate true feature value correctly
@@ -332,9 +341,9 @@ post '/models' do # create a new model
begin
@model.update :status => "Creating validation report"
- validation_report_uri = crossvalidation.find_or_create_report(subjectid, OpenTox::SubTask.new(task,80,90)) #unless @model.dirty?
+ validation_report_uri = crossvalidation.find_or_create_report(@subjectid, OpenTox::SubTask.new(task,80,90)) #unless @model.dirty?
@model.update :validation_report_uri => validation_report_uri, :status => "Creating QMRF report"
- qmrf_report = OpenTox::Crossvalidation::QMRFReport.create(@model.uri, subjectid, OpenTox::SubTask.new(task,90,99))
+ qmrf_report = OpenTox::Crossvalidation::QMRFReport.create(@model.uri, @subjectid, OpenTox::SubTask.new(task,90,99))
@model.update(:validation_qmrf_uri => qmrf_report.uri, :status => "Completed")
rescue => e
error "Model report creation failed",e
@@ -353,14 +362,14 @@ post '/models' do # create a new model
end
post '/predict/?' do # post chemical name to model
- subjectid = session[:subjectid] ? session[:subjectid] : nil
+
@identifier = params[:identifier]
unless params[:selection] and params[:identifier] != ''
flash[:notice] = "Please enter a compound identifier and select an endpoint from the list."
redirect url_for('/predict')
end
begin
- @compound = OpenTox::Compound.from_name(params[:identifier])
+ @compound = OpenTox::Compound.from_smiles(params[:identifier])
rescue
flash[:notice] = "Could not find a structure for '#{@identifier}'. Please try again."
redirect url_for('/predict')
@@ -372,15 +381,15 @@ post '/predict/?' do # post chemical name to model
confidence = nil
title = nil
db_activities = []
- lazar = OpenTox::Model::Lazar.find model.uri
- prediction_dataset_uri = lazar.run({:compound_uri => @compound.uri, :subjectid => subjectid})
+ lazar = OpenTox::Model::Lazar.find model.uri, @subjectid
+ prediction_dataset_uri = lazar.run({:compound_uri => @compound.uri, :subjectid => @subjectid})
LOGGER.debug "Prediction dataset_uri: #{prediction_dataset_uri}"
if lazar.value_map
@value_map = lazar.value_map
else
@value_map = nil
end
- prediction_dataset = OpenTox::LazarPrediction.find(prediction_dataset_uri, subjectid)
+ prediction_dataset = OpenTox::LazarPrediction.find(prediction_dataset_uri, @subjectid)
if prediction_dataset.metadata[OT.hasSource].match(/dataset/)
@predictions << {
:title => model.name,
@@ -388,7 +397,7 @@ post '/predict/?' do # post chemical name to model
}
else
predicted_feature = prediction_dataset.metadata[OT.dependentVariables]
- prediction = OpenTox::Feature.find(predicted_feature, subjectid)
+ prediction = OpenTox::Feature.find(predicted_feature, @subjectid)
if prediction.metadata[OT.error]
@predictions << {
:title => model.name,
@@ -418,14 +427,14 @@ post "/lazar/?" do # get detailed prediction
@page = 0
@page = params[:page].to_i if params[:page]
@model_uri = params[:model_uri]
- lazar = OpenTox::Model::Lazar.find @model_uri
- prediction_dataset_uri = lazar.run(:compound_uri => params[:compound_uri], :subjectid => session[:subjectid])
+ lazar = OpenTox::Model::Lazar.find @model_uri, @subjectid
+ prediction_dataset_uri = lazar.run(:compound_uri => params[:compound_uri], :subjectid => @subjectid)
if lazar.value_map
@value_map = lazar.value_map
else
@value_map = nil
end
- @prediction = OpenTox::LazarPrediction.find(prediction_dataset_uri, session[:subjectid])
+ @prediction = OpenTox::LazarPrediction.find(prediction_dataset_uri, @subjectid)
@compound = OpenTox::Compound.new(params[:compound_uri])
haml :lazar
end
@@ -453,18 +462,10 @@ delete '/model/:id/?' do
model = ToxCreateModel.get(params[:id])
raise OpenTox::NotFoundError.new("Model with id: #{params[:id]} not found!") unless model
begin
- delete_model(model, @subjectid)
- model.delete
- unless ToxCreateModel.get(params[:id])
- begin
- aa = OpenTox::Authorization.delete_policies_from_uri(model.web_uri, @subjectid)
- LOGGER.debug "Policy deleted for Dataset URI: #{uri} with result: #{aa}"
- rescue
- LOGGER.warn "Policy delete error for Dataset URI: #{uri}"
- end
- end
+ delete_model(model, @subjectid)
flash[:notice] = "#{model.name} model deleted."
rescue
+ LOGGER.error "#{model.name} model delete error."
flash[:notice] = "#{model.name} model delete error."
end
redirect url_for('/models')
diff --git a/helper.rb b/helper.rb
index 698fd3e..80707c3 100644
--- a/helper.rb
+++ b/helper.rb
@@ -1,35 +1,5 @@
helpers do
- def login(username, password)
- logout
- session[:subjectid] = OpenTox::Authorization.authenticate(username, password)
- #LOGGER.debug "ToxCreate login user #{username} with subjectid: " + session[:subjectid].to_s
- if session[:subjectid] != nil
- session[:username] = username
- return true
- else
- session[:username] = ""
- return false
- end
- end
-
- def logout
- if session[:subjectid] != nil
- session[:subjectid] = nil
- session[:username] = ""
- return true
- end
- return false
- end
-
- def logged_in()
- return true if !AA_SERVER
- if session[:subjectid] != nil
- return OpenTox::Authorization.is_token_valid(session[:subjectid])
- end
- return false
- end
-
def is_authorized(uri, action)
if OpenTox::Authorization.server && session[:subjectid] != nil
return OpenTox::Authorization.authorized?(uri, action, session[:subjectid])
diff --git a/model.rb b/model.rb
index e433893..bab5bde 100644
--- a/model.rb
+++ b/model.rb
@@ -31,7 +31,7 @@ class ToxCreateModel < Ohm::Model
attribute :nr_compounds
attribute :nr_predictions
attribute :correct_predictions
- attribute :weighted_area_under_roc
+ attribute :average_area_under_roc
attribute :sensitivity
attribute :specificity
attribute :r_square
diff --git a/public/javascripts/toxcreate.js b/public/javascripts/toxcreate.js
index a5dc44c..ee783ce 100755
--- a/public/javascripts/toxcreate.js
+++ b/public/javascripts/toxcreate.js
@@ -77,8 +77,7 @@ $(function() {
if (progress == "100") return -1;
$("div#model_" + id + "_progress").progressbar("value", parseInt(progress));
- $("div#model_" + id + "_progress").attr({title: parseInt(progress) + "%", alt: parseInt(progress) + "%"});
- //$("div#model_" + id + "_progress").attr("alt", parseInt(progress) + "%");
+ $("div#model_" + id + "_progress").attr({title: parseInt(progress) + "%"});
},
error: function(data) {
id = -1;
@@ -208,6 +207,7 @@ jQuery.fn.deleteModel = function(type, options) {
if(confirm(opts.confirm_message)) {
$("div#model_" + opts.id).fadeTo("slow",0.5);
$("span#model_" + opts.id + "_status").html("Deleting");
+ $("a#delete_" + opts.id).html("");
$.ajax({
type: opts.method,
url: opts.action,
diff --git a/views/classification_validation.haml b/views/classification_validation.haml
index f25a321..9f5c2c9 100644
--- a/views/classification_validation.haml
+++ b/views/classification_validation.haml
@@ -3,9 +3,9 @@
= sprintf("%.2f", model.correct_predictions.to_f) if model.correct_predictions
= '%'
%dt
- %a{:href => "http://en.wikipedia.org/wiki/Receiver_operating_characteristic", :rel => "external"} Weighted area under ROC:
+ %a{:href => "http://en.wikipedia.org/wiki/Receiver_operating_characteristic", :rel => "external"} Average area under ROC:
%dd
- = sprintf("%.3f", model.weighted_area_under_roc.to_f) if model.weighted_area_under_roc
+ = sprintf("%.3f", model.average_area_under_roc.to_f) if model.average_area_under_roc
%dt
%a{:href => "http://en.wikipedia.org/wiki/Sensitivity_and_specificity", :rel => "external"} Specificity:
%dd= sprintf("%.3f", model.specificity.to_f) if model.specificity
diff --git a/views/help.haml b/views/help.haml
index 2b39d6c..f602dff 100644
--- a/views/help.haml
+++ b/views/help.haml
@@ -87,13 +87,13 @@
%p
Excel examples for download:
- %ul
- %li
- = link_to "hamster_carcinogenicity.xls", "/hamster_carcinogenicity.xls"
- (classification)
- %li
- = link_to "EPAFHM.xls", "/EPAFHM.xls"
- (regression)
+%ul
+ %li
+ = link_to "hamster_carcinogenicity.xls", "/hamster_carcinogenicity.xls"
+ (classification)
+ %li
+ = link_to "EPAFHM.xls", "/EPAFHM.xls"
+ (regression)
%h3 CSV example
@@ -113,13 +113,13 @@
%p
CSV examples for download:
- %ul
- %li
- = link_to "hamster_carcinogenicity.csv", "/hamster_carcinogenicity.csv"
- (classification)
- %li
- = link_to "EPAFHM.csv", "/EPAFHM.csv"
- (regression)
+%ul
+ %li
+ = link_to "hamster_carcinogenicity.csv", "/hamster_carcinogenicity.csv"
+ (classification)
+ %li
+ = link_to "EPAFHM.csv", "/EPAFHM.csv"
+ (regression)
%p You can create CSV files in Excel: Create a sheet with two columns and export them as CSV file with the "Save As" option from the menu, selecting the CSV (comma delimited) format.
diff --git a/views/model.haml b/views/model.haml
index 899bb6a..266fe19 100644
--- a/views/model.haml
+++ b/views/model.haml
@@ -24,7 +24,7 @@
#{js}
});
- %div{:id => "model_#{model.id}_progress", :class => "model_progress", :title => "#{percentage_completed}%", :alt => "#{percentage_completed}%"}
+ %div{:id => "model_#{model.id}_progress", :class => "model_progress", :title => "#{percentage_completed}%"}
//= haml :model_progress, :locals=>{:percentage_completed=>percentage_completed}, :layout => false
%span
@@ -41,7 +41,7 @@
- if CONFIG[:logger]=="debug"
%dt Task:
%dd
- %a{:href => "#{model.task_uri}", :rel => "external"}
+ %a{:href => "#{model.task_uri}", :id => "model_#{model.id}_task_link", :rel => "external"}
= model.task_uri
- if model.warnings
%dt Warnings: