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
|
/ @@prediction_models and @@predictions defined in POST request '/predict'
/ unpacks multi prediction array ;
/ prepare it for neighbors ;
/ align single prediction to endpoint ;
/ display preordered in table view ;
.results{:style=>"display:none"}
- count_m = 0
/ tabs div ;
#tabs
%ul
/ each endpoint becomes a tab head ;
- @@prediction_models.each do |m|
- count_m += 1
- m_title = m.title.split(" ").first
%li
%a{:href => "#results_#{count_m}", :id => "link#{m_title}"}
= m_title
- count_rs = 0
/ unpack to single arrays
- @@predictions.each do |pa|
- count_rs += 1
#results{:id=>"#{count_rs}"}
- pa.each do |p|
/ prepare dataset for neighbors table ;
/ delete first array which contains input compound prediction ;
/ keep the following arrays they are the neighbor predictions ;
- p.data_entries.shift
- p.compounds.shift
/ call the tablesorter plugin ;
/ presort by similarity ;
:javascript
$(document).ready(function(){
$("table##{count_rs}").tablesorter({
//debug: true,
//widgets: ['zebra'],
headers: {0: {sorter: false}, 3: {sorter: false}},
sortList: [[2,1]]
});
});
/ TODO catch table error if tbody is empty
%h2= "Neighbors: "
%table{:id=>"#{count_rs}", :class=>"tablesorter", :cellspacing=>"1"}
%thead
%tr
%th
Compound
%th
%b Measured Activity
/ title must be empty for tooltip
%a{:href=>"#", :title=>"", :id=>"measured_activity"}
%img{:src=>"/images/info_white.png"}
.tooltip{:style=>"font-weight: normal; font-size: 1em; text-align: left;"}
%dt
Measured Activity
%dd
Experimental result(s) from the training dataset.
%th
%b Similarity
/ title must be empty for tooltip
%a{:href=>"#", :title=>"", :id=>"similarity"}
%img{:src=>"/images/info_white.png"}
.tooltip{:style=>"font-weight: normal; font-size: 1em; text-align: left;"}
%dt
Similarity
%dd
%code lazar
calculates
%em
activity specific
similarities based on the presence of statistically significant fragments.
This procedure will
%ul
%li consider only those parts of a chemical structure that are relevant
for a particular endpoint
%li ignore inert parts of the structure
%li lead to different similarities, depending on the toxic endpoint
Similarities of 1 may be encountered even for structurally dissimilar
compounds, because inert parts are ignored.
%th
Details
-#%tbody
- count = 0
- p.compounds.each do |neighbor_compound|
/ prevent conversion of nil
- c = p.data_entries[count][2] != nil ? p.data_entries[count][2] : ''
- $logger.debug "inspect c :#{c}\n"
- case c
- when /(0|false)/
- c = "non-carcinogen"
- when /(1|true)/
- c = "carcinogen"
- else
- c = Array.new
- c[0] = p.data_entries[count][2]
%tr
%td.compound
%img{:src=>"#{neighbor_compound.uri}/image", :alt=>"Compound image not available", :width=>"150px"}
%td{:class => c[0]}
- if c.class == String
= c
- else
= c[0]
%td{:class => c[0]}
= p.data_entries[count][3] != nil ? p.data_entries[count][3].round(3) : "Not enough similar compounds in training dataset."
%td
%a{:href => to("/prediction/#{CGI.escape(neighbor_compound.uri)}/details"), :id=>"link#{count_rs}#{count}", :target=>"details"}
%img{:src=>"/images/arrow_right_float.png", :alt=>">"}
:javascript
$(function() {
$("a#link#{count_rs}#{count}").on('click', function(e) {
$('#iframe').bPopup();
});
});
- count += 1
%iframe{:id=>"iframe", :name=>"details", :height=>"90%", :width=>"90%", :style=>"display:none;border:0px"}
|