summaryrefslogtreecommitdiff
path: root/lazar.rb
blob: 631b7bfe3660ec2298eda471fdeb5672ecd9439f (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
require "haml" 

# Get model representation
# @return [application/rdf+xml,application/x-yaml] Model representation
get '/:id/?' do
  halt 404, "Model #{params[:id]} not found." unless File.exists? @yaml_file
  case @accept
  when /application\/rdf\+xml/
    s = OpenTox::Serializer::Owl.new
    s.add_model(@uri,YAML.load_file(@yaml_file).metadata)
    s.to_rdfxml
  when /yaml/
    File.read @yaml_file
  when /html/
    OpenTox.text_to_html File.read(@yaml_file) 
  else
    halt 400, "Unsupported MIME type '#{@accept}'"
  end
end

get '/:id/metadata.?:ext?' do
  halt 404, "Model #{params[:id]} not found." unless File.exists? @yaml_file
  metadata = YAML.load_file(@yaml_file).metadata
  case @accept
  when /yaml/
    metadata.to_yaml
  else #when /rdf/ and anything else
    serializer = OpenTox::Serializer::Owl.new
    serializer.add_metadata @uri, metadata
    serializer.to_rdfxml
  end
end

get '/:id/dependent' do
  halt 404, "Model #{params[:id]} not found." unless File.exists? @yaml_file
  feature_uri = YAML.load_file(@yaml_file).metadata[OT.dependentVariables]
  case @accept
  when /yaml/
    OpenTox::Feature.find(feature_uri).to_yaml
  when "text/uri-list"
    feature_uri
  when /rdf/ 
    OpenTox::Feature.find(feature_uri).to_rdfxml
  when /html/
    OpenTox.text_to_html OpenTox::Feature.find(feature_uri).to_yaml
  else
    halt 400, "Unsupported MIME type '#{@accept}'"
  end
end

get '/:id/predicted' do
  halt 404, "Model #{params[:id]} not found." unless File.exists? @yaml_file
  return  feature_uri if @accept == "text/uri-list"
  predicted = OpenTox::Feature.new(File.join @uri,"predicted")
  dependent = OpenTox::Feature.find(YAML.load_file(@yaml_file).metadata[OT.dependentVariables])
  predicted.metadata[RDF.type] = dependent.metadata[RDF.type]
  #predicted.metadata[OT.hasSource] = @uri
  #predicted.metadata[DC.creator] = @uri
  predicted.metadata[DC.title] = dependent.metadata[DC.title]
  case @accept
  when /yaml/
    predicted.to_yaml
  when /rdf/ 
    predicted.to_rdfxml
  when /html/
    OpenTox.text_to_html predicted.to_yaml
  else
    halt 400, "Unsupported MIME type '#{@accept}'"
  end
end

# Store a lazar model. This method should not be called directly, use OpenTox::Algorithm::Lazr to create a lazar model
# @param [Body] lazar Model representation in YAML format
# @return [String] Model URI
post '/?' do # create model
  halt 400, "MIME type \"#{request.content_type}\" not supported." unless request.content_type.match(/yaml/)
  @id = next_id
  @uri = uri @id
  @yaml_file = "public/#{@id}.yaml"
  lazar = YAML.load request.env["rack.input"].read
  lazar.uri = @uri
  File.open(@yaml_file,"w+"){|f| f.puts lazar.to_yaml}
  OpenTox::Authorization.check_policy(@uri, @subjectid) if File.exists? @yaml_file
  response['Content-Type'] = 'text/uri-list'
  @uri
end

# Make a lazar prediction. Predicts either a single compound or all compounds from a dataset 
# @param [optional,String] dataset_uri URI of the dataset to be predicted
# @param [optional,String] compound_uri URI of the compound to be predicted
# @param [optional,Header] Accept Content-type of prediction, can be either `application/rdf+xml or application/x-yaml`
# @return [text/uri-list] URI of prediction task (dataset prediction) or prediction dataset (compound prediction)
post '/:id/?' do

  halt 404, "Model #{params[:id]} does not exist." unless File.exists? @yaml_file
  
  halt 404, "No compound_uri or dataset_uri parameter." unless compound_uri = params[:compound_uri] or dataset_uri = params[:dataset_uri]
  @lazar = YAML.load_file @yaml_file

  response['Content-Type'] = 'text/uri-list'

  if compound_uri
    cache = PredictionCache.find(:model_uri => @lazar.uri, :compound_uri => compound_uri).first
    return cache.dataset_uri if cache and uri_available?(cache.dataset_uri)
    begin
      prediction_uri = @lazar.predict(compound_uri,true,@subjectid).uri
      PredictionCache.create(:model_uri => @lazar.uri, :compound_uri => compound_uri, :dataset_uri => prediction_uri)
      prediction_uri
    rescue
      LOGGER.error "Lazar prediction failed for #{compound_uri} with #{$!} "
      halt 500, "Prediction of #{compound_uri} with #{@lazar.uri} failed."
    end
  elsif dataset_uri
    task = OpenTox::Task.create("Predict dataset",url_for("/#{@lazar.id}", :full)) do |task|
      @lazar.predict_dataset(dataset_uri, @subjectid, task).uri
    end
    halt 503,task.uri+"\n" if task.status == "Cancelled"
    halt 202,task.uri
  end

end