Java Main function
[algorithm] / pc.rb
1 # pc.rb
2 # (P)hysico (C)hemical descriptor calculation
3 # Author: Andreas Maunz
4
5
6 # Get a list of descriptor calculation algorithms
7 # @return [text/uri-list] URIs of descriptor calculation algorithms
8 get '/pc' do
9   algorithms = YAML::load_file File.join(ENV['HOME'], ".opentox", "config", "pc_descriptors.yaml")
10   response['Content-Type'] = 'text/uri-list'
11   list = (algorithms.keys.sort << "AllDescriptors").collect { |name| url_for("/pc/#{name}",:full) }.join("\n") + "\n"
12   case request.env['HTTP_ACCEPT']
13   when /text\/html/
14     content_type "text/html"
15     OpenTox.text_to_html list
16   else
17     content_type 'text/uri-list'
18     list
19   end
20 end
21
22 # Get representation of descriptor calculation algorithm
23 # @return [application/rdf+xml] OWL-DL representation of descriptor calculation algorithm
24 get '/pc/:descriptor' do
25   descriptors = YAML::load_file File.join(ENV['HOME'], ".opentox", "config", "pc_descriptors.yaml")
26   alg_params = [ { DC.description => "Dataset URI", OT.paramScope => "mandatory", DC.title => "dataset_uri" } ]
27       
28   if params[:descriptor] != "AllDescriptors"
29     descriptors = descriptors[params[:descriptor]]
30   else
31     alg_params << { DC.description => "Physico-chemical type, one or more of '#{descriptors.collect { |id, info| info[:pc_type] }.uniq.sort.join(",")}'", OT.paramScope => "optional", DC.title => "pc_type" }
32     alg_params << { DC.description => "Software Library, one or more of '#{descriptors.collect { |id, info| info[:lib] }.uniq.sort.join(",")}'", OT.paramScope => "optional", DC.title => "lib" }
33     descriptors = {:id => "AllDescriptors", :name => "All PC descriptors" }
34   end
35
36   if descriptors 
37
38     # Contents
39     algorithm = OpenTox::Algorithm::Generic.new(url_for("/pc/#{params[:descriptor]}",:full))
40     algorithm.metadata = {
41       DC.title => params[:descriptor],
42       DC.creator => "andreas@maunz.de",
43       DC.description => descriptors[:name],
44       RDF.type => [OTA.DescriptorCalculation],
45     }
46     algorithm.metadata[OT.parameters] = alg_params
47     algorithm.metadata[DC.description] << (", pc_type: " + descriptors[:pc_type]) unless descriptors[:id] == "AllDescriptors"
48     algorithm.metadata[DC.description] << (", lib: " + descriptors[:lib]) unless descriptors[:id] == "AllDescriptors"
49
50     # Deliver
51     case request.env['HTTP_ACCEPT']
52     when /text\/html/
53       content_type "text/html"
54       OpenTox.text_to_html algorithm.to_yaml
55     when /yaml/
56       content_type "application/x-yaml"
57       algorithm.to_yaml
58     else
59       response['Content-Type'] = 'application/rdf+xml'  
60       algorithm.to_rdfxml
61     end
62
63   else
64     raise OpenTox::NotFoundError.new "Unknown descriptor #{params[:descriptor]}."
65   end
66 end
67
68 # Run pc descriptor calculation algorithm on dataset for a set of descriptors. Can be constrained to types and libraries.
69 # @param [String] dataset_uri URI of the training dataset
70 # @param optional [String] pc_type Physico-chemical descriptor type to generate, see TODO
71 # @param optional [String] lib Library to use, see TODO
72 # @return [text/uri-list] Task URI
73 post '/pc/AllDescriptors' do
74   response['Content-Type'] = 'text/uri-list'
75   raise OpenTox::NotFoundError.new "Parameter 'dataset_uri' missing." unless params[:dataset_uri]
76
77   descriptors = YAML::load_file File.join(ENV['HOME'], ".opentox", "config", "pc_descriptors.yaml")
78   params[:pc_type] = descriptors.collect { |id,info| info[:pc_type]}.uniq.sort.join(',')  unless params[:pc_type]
79
80   task = OpenTox::Task.create("PC descriptor calculation for dataset ", @uri) do |task|
81     Rjb.load(nil,["-Xmx64m"]) # start vm
82     byteArray = Rjb::import('java.io.ByteArrayOutputStream')
83     printStream = Rjb::import('java.io.PrintStream')
84     out = byteArray.new() 
85     Rjb::import('java.lang.System').out = printStream.new(out) # suppress java output
86     Rjb::import('java.lang.System').err = printStream.new(out) # suppress java output
87     s = Rjb::import('JoelibFc') # import main class
88     t = Rjb::import('ApplyCDKDescriptors')
89
90     LOGGER.debug "Running PC with pc_type '#{params[:pc_type]}' and lib '#{params[:lib]}'"
91     OpenTox::Algorithm.pc_descriptors( { :dataset_uri => params[:dataset_uri], :pc_type => params[:pc_type], :rjb => {:jl=>s, :cdk => t}, :add_uri => true, :task => task, :lib => params[:lib], :subjectid => @subjectid} )
92   end
93   raise OpenTox::ServiceUnavailableError.newtask.uri+"\n" if task.status == "Cancelled"
94   halt 202,task.uri.to_s+"\n"
95 end
96
97 # Run pc descriptor calculation algorithm on dataset for a specific descriptor.
98 #
99 # @param [String] dataset_uri URI of the training dataset
100 # @return [text/uri-list] Task URI
101 post '/pc/:descriptor' do
102   response['Content-Type'] = 'text/uri-list'
103   raise OpenTox::NotFoundError.new "Parameter 'dataset_uri' missing." unless params[:dataset_uri]
104
105   descriptors = YAML::load_file File.join(ENV['HOME'], ".opentox", "config", "pc_descriptors.yaml")
106   params[:pc_type] = descriptors.collect { |id,info| info[:pc_type]}.uniq.sort.join(',')
107
108   task = OpenTox::Task.create("PC descriptor calculation for dataset ", @uri) do |task|
109     Rjb.load(nil,["-Xmx64m"]) # start vm
110     byteArray = Rjb::import('java.io.ByteArrayOutputStream'); printStream = Rjb::import('java.io.PrintStream'); 
111     out = byteArray.new() ; Rjb::import('java.lang.System').out = printStream.new(out) # joelib is too verbose
112     s = Rjb::import('JoelibFc') # import main class
113     t = Rjb::import('ApplyCDKDescriptors')
114     OpenTox::Algorithm.pc_descriptors( { :dataset_uri => params[:dataset_uri], :pc_type => params[:pc_type], :descriptor => params[:descriptor], :rjb => {:jl=>s, :cdk => t}, :add_uri => false, :task => task, :subjectid => @subjectid} )
115   end
116   raise OpenTox::ServiceUnavailableError.newtask.uri+"\n" if task.status == "Cancelled"
117   halt 202,task.uri.to_s+"\n"
118 end
119