summaryrefslogtreecommitdiff
path: root/test/Rakefile
blob: 230234ba713cea9d669a65f7d23a14d7d69e2699 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
namespace :renew do
  desc "renews the triple store backend in case of damage or disfunction."
  task :backend do
    #TODO finish
    require_relative '../setup.rb'
    STDOUT.puts "Remind this command does not enable data save of a destroyed backend!"
    STDOUT.puts "do you really want to proceed (y/n)"
    answer = STDIN.gets.strip
    case answer
    when "y"
      puts "delete"
    when "n"
      puts "exit"
    else
      puts "exit"
    end
  end
end

namespace :service_uri do
  desc "Rewriting service uris for prediction models and components"
  task :rewrite do
    #TODO fix sed
    STDOUT.puts "Please enter models directory name.\n#{`ls -d */`}\n"
    input = STDIN.gets.strip
    dir = File.join(File.dirname(File.expand_path __FILE__), input)
    if File.directory?(dir)
      STDOUT.puts "Directory found."
    else
      STDOUT.puts "Directory not found."
    end
    # change working directory
    Dir.chdir dir
    original = IO.readlines("logfile.txt")[1].gsub(/\/model\/[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/, "") 
    STDOUT.puts "Service url is: #{original}\nPlease enter new service path:"
    new = STDIN.gets.strip
    if new != ""# and new.uri?
      puts "processing with '#{new}'"
      #cmd for rewriting service url
      `sed -i 's,#{original},#{new},g' *.nt`
      `sed -i 's,#{original},#{new},g' *.txt`
    else
      STDOUT.puts "Original service url is #{}.\nPlease enter new service url:"
    end
  end #task
end #namespace

namespace :save do
  desc "Save models used to predict compounds"
  task :prediction_models do
    
    require_relative '../setup.rb'
    d = Time.new
    date = d.strftime("%d-%m-%Y_%H-%M-%S")
    dir = File.join File.dirname(File.expand_path __FILE__), "models_save_#{date}"
    puts "Created dir 'models_save_#{date}'."
    `mkdir #{dir}`
    File.new("#{dir}/logfile.txt", "w")
    File.new("#{dir}/details.txt", "w")
    models = `curl -Lk -X GET -H accept:text/plain #{$model[:uri]}`.chomp.split("\n")
    model_uris = models.collect{|m| m.split(" ").first.gsub(/\<|\>/, "")} 
    puts "#{model_uris.size} models found." unless model_uris.size == 0
    puts "-----------------------------"
    puts "service uri is: #{$model[:uri]}"
    model_uris.each_with_index do |model_uri, idx|
      # get model by uri
      model = OpenTox::Model::Lazar.find "#{model_uri}"
      puts "model details:\n#{model.metadata}\n"
      if model.type.include?(RDF::OT.PredictionModel)
        # store model as nt file
        `curl -Lk -X GET -H accept:text/plain #{model_uri} -o #{dir}/model_#{idx}.nt`.chomp
        puts "model #{idx}:\t#{model.title} stored."
        # write to logfile
        File.open("#{dir}/logfile.txt", 'a'){|f| f.write("model_#{idx}\n#{model_uri}\n\n")}
        # write details
        File.open("#{dir}/details.txt", 'a'){|f| f.write("ID:\tmodel_#{idx}\ntitle:\t#{model.title}\nuri:\t#{model_uri}\n---\n")}
        # get models features
        model_features = []
        model_features << model[RDF::OT.dependentVariables]
        model_features << model[RDF::OT.predictedVariables]
        puts "#{model_features.flatten.size} features for model #{idx} found."
        model_features.flatten!.each_with_index do |uri, i|
          `curl -Lk -X GET -H accept:text/plain #{uri} -o #{dir}/feature_#{i}_model#{idx}.nt`.chomp
          # write to logfile
          File.open("#{dir}/logfile.txt", 'a'){|f| f.write("feature_#{i}_model#{idx}\n#{uri}\n\n")}
          puts "model feature #{i} stored."
        end
        puts " | | "    
        
        # get all datasets and single dataset features
        puts "collect datasets."
        [model[RDF::OT.trainingDataset], model[RDF::OT.featureDataset]].each_with_index do |dataset_uri, index|
          if index == 0
            which = "trainingDataset"
          else
            which = "featureDataset"
          end
          # get dataset
          dataset = OpenTox::Dataset.find "#{dataset_uri}"
          # store dataset
          puts "#{which}: #{dataset_uri}"
          `curl -Lk -X GET -H accept:text/plain #{dataset_uri} -o #{dir}/#{which}_model_#{idx}.nt`.chomp
          puts "#{which} of model #{idx} stored."
          # write to logfile
          File.open("#{dir}/logfile.txt", 'a'){|f| f.write("#{which}_model_#{idx}\n#{dataset_uri}\n\n")}
          features =[]
          feature_uris =[]
          dataset.features.each{|f| features << f}
          features.each{|f| feature_uris << f.uri}
          # store each feature as file
          feature_uris.each_with_index do |uri, i| 
            `curl -Lk -X GET -H accept:text/plain #{uri} -o #{dir}/feature_#{i}_#{which}_model_#{idx}.nt`.chomp
            puts "feature #{i} of #{which} stored."
            # write to logfile
            File.open("#{dir}/logfile.txt", 'a'){|f| f.write("feature_#{i}_#{which}_model_#{idx}\n#{uri}\n\n")}
          end
        end
      else
        puts "ignore #{model.title}, is no prediction model."
      end
    puts "#######################################"

    end
    puts "------------------------------\n"
    puts "all prediction models from #{$model[:uri]} locally stored !"
    puts "------------------------------\n"
    puts "Execute 'rake models:rewrite' to set a new service uri inside the saved models and components."
  end # task
end # namespace

namespace :prediction_models do
  desc "Imports local models to service backend."
  task :import do

    require_relative "../setup.rb"
    require File.join "../../../opentox-server/lib/4store.rb"
    pair = {}
    #files = Dir["models_save/*.nt"]
    
    STDOUT.puts "Please enter models directory name.\n#{`ls -d */`}\n"
    input = STDIN.gets.strip
    dir = File.join(File.dirname(File.expand_path __FILE__), input)
    if File.directory?(dir)
      STDOUT.puts "Directory found."
    else
      STDOUT.puts "Directory not found."
    end
    files = Dir["#{input}/*.nt"]
    # change working directory
    Dir.chdir dir

    uris = File.read(File.join "logfile.txt")
    uris.split("\n\n").each do |u|
      pair["#{u.split.first}"] = u.split.last
    end
    files.each do |file|
      file = file.split("/").last
      f = file.split("/").last.gsub(".nt", "")
      puts "file:\t#{file}\ntarget:\t#{pair[f]}\n"
      OpenTox::Backend::FourStore.put pair[f].to_s, File.read(file), "text/plain"
      puts "imported."
    end

  end #task
end #namespace