summaryrefslogtreecommitdiff
path: root/model.rb
blob: 6e2441ad74f72c17227352214f36d1965d197105 (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
class ToxCreateModel

	include DataMapper::Resource
	property :id, Serial
	property :name, String, :length => 255
	property :uri, String, :length => 255
	property :task_uri, String, :length => 255
	property :validation_task_uri, String, :length => 255
	property :validation_uri, String, :length => 255
	property :validation_report_task_uri, String, :length => 255
	property :validation_report_uri, String, :length => 255
	property :warnings, Text, :length => 2**32-1 
	property :nr_compounds, Integer
	property :type, String
	property :created_at, DateTime

	def status
		RestClient.get(File.join(@task_uri, 'hasStatus')).body
	end

	def validation_status
		begin
			RestClient.get(File.join(@validation_task_uri, 'hasStatus')).body
		rescue
			"Service offline"
		end
	end

	def validation_report_status
		begin
			RestClient.get(File.join(@validation_report_task_uri, 'hasStatus')).body
		rescue
			"Service offline"
		end
	end

	def algorithm
		begin
			RestClient.get(File.join(@uri, 'algorithm')).body
		rescue
			""
		end
	end

	def training_dataset
		begin
			RestClient.get(File.join(@uri, 'trainingDataset')).body
		rescue
			""
		end
	end

	def feature_dataset
		begin
			RestClient.get(File.join(@uri, 'feature_dataset')).body
		rescue
			""
		end
	end

	def classification_validation
		begin
			uri = File.join(@validation_uri, 'statistics')
			yaml = RestClient.get(uri).body
			v = YAML.load(yaml)
			tp=0; tn=0; fp=0; fn=0; n=0
			v[:classification_statistics][:confusion_matrix][:confusion_matrix_cell].each do |cell|
				if cell[:confusion_matrix_predicted] == "true" and cell[:confusion_matrix_actual] == "true"
					tp = cell[:confusion_matrix_value]
					n += tp
				elsif cell[:confusion_matrix_predicted] == "false" and cell[:confusion_matrix_actual] == "false"
					tn = cell[:confusion_matrix_value]
					n += tn
				elsif cell[:confusion_matrix_predicted] == "false" and cell[:confusion_matrix_actual] == "true"
					fn = cell[:confusion_matrix_value]
					n += fn
				elsif cell[:confusion_matrix_predicted] == "true" and cell[:confusion_matrix_actual] == "false"
					fp = cell[:confusion_matrix_value]
					n += fp
				end
			end
			{
				:n => n,
				:tp => tp,
				:fp => fp,
				:tn => tn,
				:fn => fn, 
				:correct_predictions => sprintf("%.2f", 100*(tp+tn).to_f/n),
				:weighted_area_under_roc => sprintf("%.3f", v[:classification_statistics][:weighted_area_under_roc].to_f),
				:sensitivity => sprintf("%.3f", tp.to_f/(tp+fn)),
				:specificity => sprintf("%.3f", tn.to_f/(tn+fp))
			}
		rescue
			"Service offline"
		end
	end

	def regression_validation
		begin
			uri = File.join(@validation_uri, 'statistics')
			yaml = RestClient.get(uri).body
			v = YAML.load(yaml)
		rescue
			"Service offline"
		end
	end

  def process

    if !@uri and status == "Completed"
			@uri = RestClient.get(File.join(@task_uri, 'resultURI')).body
			lazar = YAML.load(RestClient.get(@uri, :accept => "application/x-yaml").body)
			case lazar.dependentVariables
			when /classification/
				@type = "classification"
			when /regression/
				@type = "regression"
			else
				@type = "unknown"
			end
			save
		end

		if !@validation_uri and validation_status == "Completed"
			begin
				@validation_uri = RestClient.get(File.join(@validation_task_uri, 'resultURI')).body
				LOGGER.debug "Validation URI: #{@validation_uri}"
				@validation_report_task_uri = RestClient.post(File.join(@@config[:services]["opentox-validation"],"/report/crossvalidation"), :validation_uris => @validation_uri).body
				LOGGER.debug "Validation Report Task URI: #{@validation_report_task_uri}"
				save
			rescue
			end
		end
		if @validation_report_task_uri and !@validation_report_uri and validation_report_status == 'Completed'
			@validation_report_uri = RestClient.get(File.join(@validation_report_task_uri, 'resultURI')).body
		end
  end

end

DataMapper.auto_upgrade!