diff options
Diffstat (limited to 'report/validation_access.rb')
-rwxr-xr-x | report/validation_access.rb | 176 |
1 files changed, 129 insertions, 47 deletions
diff --git a/report/validation_access.rb b/report/validation_access.rb index 299b124..aaa7bdc 100755 --- a/report/validation_access.rb +++ b/report/validation_access.rb @@ -7,27 +7,39 @@ require "lib/validation_db.rb" # class Reports::ValidationDB - def resolve_cv_uris(validation_uris, identifier=nil, subjectid=nil) + @@tmp_resources = [] + + def same_service?(uri) + self_uri = URI.parse($url_provider.url) + val_uri = URI.parse(uri) + self_uri.host == val_uri.host && self_uri.port == val_uri.port + end + + def resolve_cv_uris(validation_uris, identifier, subjectid) res = {} count = 0 validation_uris.each do |u| + if u.to_s =~ /.*\/crossvalidation\/[0-9]+/ - cv_id = u.split("/")[-1].to_i cv = nil + cv_id = u.split("/")[-1].to_i + val_uris = nil + + if same_service?u + raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+u.to_s if + AA_SERVER and !OpenTox::Authorization.authorized?(u,"GET",subjectid) + cv = Validation::Crossvalidation.get( cv_id ) + raise OpenTox::NotFoundError.new "crossvalidation with id "+cv_id.to_s+" not found" unless cv + raise OpenTox::BadRequestError.new("crossvalidation with id '"+cv_id.to_s+"' not finished") unless cv.finished + #res += Validation::Validation.find( :all, :conditions => { :crossvalidation_id => cv_id } ).collect{|v| v.validation_uri.to_s} + val_uris = Validation::Validation.find( :crossvalidation_id => cv_id, :validation_type => "crossvalidation" ).collect{|v| v.validation_uri.to_s} + else + val_base_uri = u.gsub(/\/crossvalidation\/[0-9]+/,"") + val_uris = OpenTox::RestClientWrapper.get( val_base_uri+"?crossvalidation_id="+cv_id.to_s+"&validation_type=crossvalidation", {:subjectid => subjectid, :accept => "text/uri-list" }).split("\n") + end - raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+u.to_s if - AA_SERVER and !OpenTox::Authorization.authorized?(u,"GET",subjectid) -# begin -# #cv = Lib::Crossvalidation.find( cv_id ) -# rescue => ex -# raise "could not access crossvalidation with id "+validation_id.to_s+", error-msg: "+ex.message -# end - cv = Validation::Crossvalidation.get( cv_id ) - raise OpenTox::NotFoundError.new "crossvalidation with id "+cv_id.to_s+" not found" unless cv - raise OpenTox::BadRequestError.new("crossvalidation with id '"+cv_id.to_s+"' not finished") unless cv.finished - #res += Validation::Validation.find( :all, :conditions => { :crossvalidation_id => cv_id } ).collect{|v| v.validation_uri.to_s} - Validation::Validation.find( :crossvalidation_id => cv_id, :validation_type => "crossvalidation" ).each do |v| - res[v.validation_uri.to_s] = identifier ? identifier[count] : nil + val_uris.each do |v_uri| + res[v_uri] = identifier ? identifier[count] : nil end else res[u.to_s] = identifier ? identifier[count] : nil @@ -37,40 +49,62 @@ class Reports::ValidationDB res end - def init_validation(validation, uri, subjectid=nil) - + def init_validation(validation, uri, filter_params, subjectid) + raise OpenTox::BadRequestError.new "not a validation uri: "+uri.to_s unless uri =~ /\/[0-9]+$/ validation_id = uri.split("/")[-1] raise OpenTox::BadRequestError.new "invalid validation id "+validation_id.to_s unless validation_id!=nil and (validation_id.to_i > 0 || validation_id.to_s=="0" ) + v = nil - raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+uri.to_s if - AA_SERVER and !OpenTox::Authorization.authorized?(uri,"GET",subjectid) - v = Validation::Validation.get(validation_id) + + if same_service? uri + raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+uri.to_s if + AA_SERVER and !OpenTox::Authorization.authorized?(uri,"GET",subjectid) + v = Validation::Validation.get(validation_id) + else + v = YAML::load(OpenTox::RestClientWrapper.get uri, {:subjectid=>subjectid, :accept=>"application/serialize"}) + end + v.subjectid = subjectid + v.filter_predictions(filter_params[:min_confidence], filter_params[:min_num_predictions], filter_params[:max_num_predictions]) if + filter_params + raise OpenTox::NotFoundError.new "validation with id "+validation_id.to_s+" not found" unless v raise OpenTox::BadRequestError.new "validation with id "+validation_id.to_s+" is not finished yet" unless v.finished - (Validation::VAL_PROPS + Validation::VAL_CV_PROPS).each do |p| validation.send("#{p.to_s}=".to_sym, v.send(p)) end + # set uris manually, in case external validation is used + validation.validation_uri = uri + validation.crossvalidation_uri = uri.gsub(/\/[0-9]+/,"")+"/crossvalidation/"+validation.crossvalidation_id if validation.crossvalidation_id!=nil + {:classification_statistics => Validation::VAL_CLASS_PROPS, :regression_statistics => Validation::VAL_REGR_PROPS}.each do |subset_name,subset_props| subset = v.send(subset_name) - subset_props.each{ |prop| validation.send("#{prop.to_s}=".to_sym, subset[prop]) } if subset + subset_props.each{ |prop| validation.send("#{prop.to_s}=".to_sym, subset[prop]) } if subset end end - def init_validation_from_cv_statistics( validation, cv_uri, subjectid=nil ) + def init_validation_from_cv_statistics( validation, cv_uri, filter_params, subjectid ) raise OpenTox::BadRequestError.new "not a crossvalidation uri: "+cv_uri.to_s unless cv_uri.uri? and cv_uri =~ /crossvalidation.*\/[0-9]+$/ - cv_id = cv_uri.split("/")[-1] - raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+cv_uri.to_s if - AA_SERVER and !OpenTox::Authorization.authorized?(cv_uri,"GET",subjectid) - cv = Validation::Crossvalidation.get(cv_id) - raise OpenTox::NotFoundError.new "crossvalidation with id "+crossvalidation_id.to_s+" not found" unless cv - raise OpenTox::BadRequestError.new "crossvalidation with id "+crossvalidation_id.to_s+" is not finished yet" unless cv.finished - v = Validation::Validation.from_cv_statistics(cv_id, subjectid) + + if same_service?cv_uri + cv_id = cv_uri.split("/")[-1] + raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+cv_uri.to_s if + AA_SERVER and !OpenTox::Authorization.authorized?(cv_uri,"GET",subjectid) + cv = Validation::Crossvalidation.get(cv_id) + raise OpenTox::NotFoundError.new "crossvalidation with id "+crossvalidation_id.to_s+" not found" unless cv + raise OpenTox::BadRequestError.new "crossvalidation with id "+crossvalidation_id.to_s+" is not finished yet" unless cv.finished + v = Validation::Validation.from_cv_statistics(cv_id, subjectid) + else + cv = YAML::load(OpenTox::RestClientWrapper.get cv_uri, {:subjectid=>subjectid, :accept=>"application/serialize"}) + v = YAML::load(OpenTox::RestClientWrapper.get cv_uri+"/statistics", {:subjectid=>subjectid, :accept=>"application/serialize"}) + end + v.filter_predictions(filter_params[:min_confidence], filter_params[:min_num_predictions], filter_params[:max_num_predictions]) if + filter_params + (Validation::VAL_PROPS + Validation::VAL_CV_PROPS).each do |p| validation.send("#{p.to_s}=".to_sym, v.send(p)) end @@ -84,35 +118,83 @@ class Reports::ValidationDB validation.send("#{p.to_s}=".to_sym, cv.send(p.to_s)) end validation.crossvalidation_uri = cv_uri + validation.validation_uri = cv_uri+"/statistics" end - def init_cv(validation) - - #cv = Lib::Crossvalidation.find(validation.crossvalidation_id) - cv = Validation::Crossvalidation.get(validation.crossvalidation_id) - raise OpenTox::BadRequestError.new "no crossvalidation found with id "+validation.crossvalidation_id.to_s unless cv + def init_cv(validation, subjectid) + cv = nil + if same_service?validation.crossvalidation_uri + cv = Validation::Crossvalidation.get(validation.crossvalidation_id) + raise OpenTox::BadRequestError.new "no crossvalidation found with id "+validation.crossvalidation_id.to_s unless cv + else + cv = YAML::load(OpenTox::RestClientWrapper.get validation.crossvalidation_uri, {:subjectid=>subjectid, :accept=>"application/serialize"}) + end Validation::CROSS_VAL_PROPS.each do |p| - validation.send("#{p.to_s}=".to_sym, cv.send(p.to_s)) + validation.send("#{p.to_s}=".to_sym, cv.send(p.to_s)) + end + end + + def training_feature_dataset_uri(validation, subjectid) + m = OpenTox::Model::Generic.find(validation.model_uri, subjectid) + if m + f = m.metadata[OT.featureDataset] + return f.chomp if f end + raise "no feature dataset found" end - def get_predictions(validation, subjectid=nil, task=nil) - Lib::OTPredictions.new( validation.feature_type, validation.test_dataset_uri, + def test_feature_dataset_uri(validation, subjectid) + m = OpenTox::Model::Generic.find(validation.model_uri, subjectid) + feat_gen = nil + m.metadata[OT.parameters].each do |h| + if h[DC.title] and h[DC.title]=~/feature_generation/ and h[OT.paramValue] + feat_gen = h[OT.paramValue] + break + end + end if m and m.metadata[OT.parameters] + raise "no feature creation alg found" unless feat_gen + feat_gen = File.join(feat_gen,"match") if feat_gen=~/fminer/ + uri = OpenTox::RestClientWrapper.post(feat_gen,{:subjectid => subjectid, + :feature_dataset_uri=>training_feature_dataset_uri(validation,subjectid), + :dataset_uri=>validation.test_dataset_uri}) + @@tmp_resources << uri + uri + end + + def delete_tmp_resources(subjectid) + @@tmp_resources.each do |uri| + OpenTox::RestClientWrapper.delete uri,{:subjectid=>subjectid} + end + @@tmp_resources = [] + end + + def get_predictions(validation, filter_params, subjectid, task) + # we need compound info, cannot reuse stored prediction data + data = Lib::PredictionData.create( validation.feature_type, validation.test_dataset_uri, validation.test_target_dataset_uri, validation.prediction_feature, validation.prediction_dataset_uri, - validation.predicted_variable, validation.predicted_confidence, subjectid, task) + validation.predicted_variable, validation.predicted_confidence, subjectid, OpenTox::SubTask.create(task, 0, 80 ) ) + data = Lib::PredictionData.filter_data( data.data, data.compounds, + filter_params[:min_confidence], filter_params[:min_num_predictions], filter_params[:max_num_predictions] ) if filter_params!=nil + task.progress(100) if task + Lib::OTPredictions.new( data.data, data.compounds ) end def get_accept_values( validation, subjectid=nil ) # PENDING So far, one has to load the whole dataset to get the accept_value from ambit - test_target_dataset = validation.test_target_dataset_uri - test_target_dataset = validation.test_dataset_uri unless test_target_dataset - d = Lib::DatasetCache.find( test_target_dataset, subjectid ) - raise "cannot get test target dataset for accept values, dataset: "+test_target_dataset.to_s unless d - accept_values = d.accept_values(validation.prediction_feature) - raise "cannot get accept values from dataset "+test_target_dataset.to_s+" for feature "+ - validation.prediction_feature+":\n"+d.features[validation.prediction_feature].to_yaml unless accept_values!=nil - accept_values + test_target_datasets = validation.test_target_dataset_uri + test_target_datasets = validation.test_dataset_uri unless test_target_datasets + res = nil + test_target_datasets.split(";").each do |test_target_dataset| + d = Lib::DatasetCache.find( test_target_dataset, subjectid ) + raise "cannot get test target dataset for accept values, dataset: "+test_target_dataset.to_s unless d + accept_values = d.accept_values(validation.prediction_feature) + raise "cannot get accept values from dataset "+test_target_dataset.to_s+" for feature "+ + validation.prediction_feature+":\n"+d.features[validation.prediction_feature].to_yaml unless accept_values!=nil + raise "different accept values" if res && res!=accept_values + res = accept_values + end + res end def feature_type( validation, subjectid=nil ) |