summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorist <ist@ist.opentox.org>2010-10-19 12:50:59 +0200
committerist <ist@ist.opentox.org>2010-10-19 12:50:59 +0200
commit06ecc8947efd544a9b008fdc861ee510f6f0cd74 (patch)
tree96c0b9c3d6b38cd09fa7b5df373c3fdf196d275a
parent20887f5aca9a684169bae2c1893df77cc9783f77 (diff)
BBRC as default descriptors
-rw-r--r--fminer.rb145
1 files changed, 142 insertions, 3 deletions
diff --git a/fminer.rb b/fminer.rb
index 9300bac..d48b363 100644
--- a/fminer.rb
+++ b/fminer.rb
@@ -1,7 +1,6 @@
ENV['FMINER_SMARTS'] = 'true'
ENV['FMINER_NO_AROMATIC'] = 'true'
ENV['FMINER_PVALUES'] = 'true'
-@@fminer = Bbrc::Bbrc.new
get '/fminer/?' do
owl = OpenTox::Owl.create 'Algorithm', url_for('/fminer',:full)
@@ -17,8 +16,148 @@ get '/fminer/?' do
rdf
end
-post '/fminer/?' do
-
+
+['/fminer/bbrc/?','/fminer/?'].each do |path| # AM LAST: set bbrc as default
+ post path do
+ @@fminer = Bbrc::Bbrc.new
+ halt 404, "Please submit a dataset_uri." unless params[:dataset_uri] and !params[:dataset_uri].nil?
+ halt 404, "Please submit a feature_uri." unless params[:feature_uri] and !params[:feature_uri].nil?
+ LOGGER.debug "Dataset: " + params[:dataset_uri]
+ LOGGER.debug "Endpoint: " + params[:feature_uri]
+ feature_uri = params[:feature_uri]
+ begin
+ LOGGER.debug "Retrieving #{params[:dataset_uri]}"
+ training_dataset = OpenTox::Dataset.find "#{params[:dataset_uri]}"
+ rescue
+ LOGGER.error "Dataset #{params[:dataset_uri]} not found"
+ halt 404, "Dataset #{params[:dataset_uri]} not found." if training_dataset.nil?
+ end
+ halt 404, "No feature #{params[:feature_uri]} in dataset #{params[:dataset_uri]}" unless training_dataset.features and training_dataset.features.include?(params[:feature_uri])
+
+ task_uri = OpenTox::Task.as_task("Mine features", url_for('/fminer',:full)) do
+
+ feature_dataset = OpenTox::Dataset.new
+ title = "BBRC representatives for " + training_dataset.title
+ feature_dataset.title = title
+ feature_dataset.creator = url_for('/fminer',:full)
+ bbrc_uri = url_for("/fminer#BBRC_representative",:full)
+ feature_dataset.features << bbrc_uri
+
+ id = 1 # fminer start id is not 0
+ compounds = []
+
+ g_hash = Hash.new# DV: for effect calculation in regression part
+ @@fminer.Reset
+ #@@fminer.SetChisqSig(0.99)
+ LOGGER.debug "Fminer: initialising ..."
+ training_dataset.data.each do |c,features|
+ begin
+ smiles = OpenTox::Compound.new(:uri => c.to_s).smiles
+ rescue
+ LOGGER.warn "No resource for #{c.to_s}"
+ next
+ end
+ if smiles == '' or smiles.nil?
+ LOGGER.warn "Cannot find smiles for #{c.to_s}."
+ else
+ feature_dataset.compounds << c.to_s
+ features.each do |feature|
+ act = feature[feature_uri]
+ if act.nil?
+ LOGGER.warn "No #{feature_uri} activiity for #{c.to_s}."
+ else
+ case act.to_s
+ when "true"
+ #LOGGER.debug id.to_s + ' "' + smiles +'"' + "\t" + true.to_s
+ activity = 1
+ when "false"
+ #LOGGER.debug id.to_s + ' "' + smiles +'"' + "\t" + false.to_s
+ activity = 0
+ else
+ # AM: add quantitative activity
+ activity = act.to_f
+ @@fminer.SetRegression(true)
+ end
+ compounds[id] = c.to_s
+ begin
+ @@fminer.AddCompound(smiles,id)
+ @@fminer.AddActivity(activity, id)
+ g_hash[id]=activity # DV: insert global information
+ rescue
+ LOGGER.warn "Could not add " + smiles + "\t" + act.to_s + " to fminer"
+ end
+ end
+ end
+ id += 1
+ end
+ end
+ g_array=g_hash.values # DV: calculation of global median for effect calculation
+ g_median=OpenTox::Utils.median(g_array)
+ minfreq = (0.02*id).round
+ #minfreq = 5
+ @@fminer.SetMinfreq(minfreq)
+ LOGGER.debug "Fminer: initialised with #{id} compounds, minimum frequency #{minfreq}"
+
+ raise "no compounds" if compounds.size==0
+
+ values = {}
+ # run @@fminer
+ LOGGER.debug "Fminer: mining ..."
+ (0 .. @@fminer.GetNoRootNodes()-1).each do |j|
+ results = @@fminer.MineRoot(j)
+ results.each do |result|
+ f = YAML.load(result)[0]
+ smarts = f[0]
+ p_value = f[1]
+ # AM: f[3] missing on regression
+ if (!@@fminer.GetRegression)
+ ids = f[2] + f[3]
+ if f[2].size > f[3].size
+ effect = 'activating'
+ else
+ effect = 'deactivating'
+ end
+ else #regression part
+ ids = f[2]
+ # DV: effect calculation
+ f_arr=Array.new
+ f[2].each do |id|
+ f_arr.push(g_hash[id])
+ end
+ f_median=OpenTox::Utils.median(f_arr)
+ if g_median >= f_median
+ effect = 'activating'
+ else
+ effect = 'deactivating'
+ end
+ end
+
+ tuple = {
+ url_for('/fminer#smarts',:full) => smarts,
+ url_for('/fminer#p_value',:full) => p_value.to_f,
+ url_for('/fminer#effect',:full) => effect
+ }
+ #LOGGER.debug "#{f[0]}\t#{f[1]}\t#{effect}"
+ ids.each do |id|
+ feature_dataset.data[compounds[id]] = [] unless feature_dataset.data[compounds[id]]
+ feature_dataset.data[compounds[id]] << {bbrc_uri => tuple}
+ end
+ end
+ end
+
+ uri = feature_dataset.save
+ LOGGER.debug "Fminer finished, dataset #{uri} created."
+ uri
+ end
+ LOGGER.debug "Fimer task started: "+task_uri.to_s
+ response['Content-Type'] = 'text/uri-list'
+ halt 202,task_uri.to_s+"\n"
+ end
+end
+
+
+post '/fminer/last/?' do
+ @@fminer = Last::Last.new
halt 404, "Please submit a dataset_uri." unless params[:dataset_uri] and !params[:dataset_uri].nil?
halt 404, "Please submit a feature_uri." unless params[:feature_uri] and !params[:feature_uri].nil?
LOGGER.debug "Dataset: " + params[:dataset_uri]