summaryrefslogtreecommitdiff
path: root/views/neighbors.haml
blob: 2d7c4a5ff9a8c72f0cea2ca892a5f0f2f5d3ac5d (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
/ unpacks multi prediction array ;
/ prepare it for neighbors ;
/ align single prediction to endpoint ;
/ display preordered in table view ;

%div.results
  %h3 Neighbors:
  / tabs div
  #tabs
    %ul.nav.nav-tabs.nav-justified{:id=>"neighborTabs", :role=>"tablist"}
      / each model a tab head ;
      / hash for predictionFeature
      - predictionFeature = {}
      - @models.each_with_index do |model,i|
        / get predictionFeature type
        - m = Model::Lazar.find model.model_id.to_s
        - predFeature = Feature.find m.prediction_feature_id.to_s
        / define feature type (numeric : nominal)
        - predFeatureType = (predFeature.numeric? ? "numeric" : "nominal")
        / use prediction feature id for neighbor compound features
        - predFeatureId = m.prediction_feature_id.to_s
        - predictionFeature[i] = {"id" => predFeatureId, "type" => predFeatureType}
        %li{:class => ("active" if i == 0)}
          %a{:href => "#results_#{i+1}", :id => "linkTab#{i+1}", data: {toggle:"tab"}}
            = "#{model.endpoint} (#{model.species})"
    %div.tab-content
      / unpack to single arrays
      - @predictions.each_with_index do |prediction,j|
        / pass model type for significant fragments view
        #results.tab-pane{:id=>"#{j+1}", :class => ("active" if j == 0)}
          / prepare dataset for neighbors table ;
          / delete first array which contains prediction ;
          / following arrays are the neighbor predictions ;
          / call the tablesorter plugin ;
          / presort by similarity ;
          :javascript
            $(document).ready(function(){
              $("table##{j+1}").tablesorter({
                debug: false,
                theme: "bootstrap",
                headerTemplate: '',
                widgets: ['columns', 'uitheme', 'stickyHeaders'],
                widgetOptions: {
                  stickyHeaders_attachTo : '.tab-content',
                  stickyHeaders : '',
                  stickyHeaders_offset : 0,
                  stickyHeaders_cloneId : '-sticky',
                  stickyHeaders_addResizeEvent : true,
                  stickyHeaders_includeCaption : true,
                  stickyHeaders_zIndex : 2,
                  stickyHeaders_attachTo : null,
                  stickyHeaders_xScroll : null,
                  stickyHeaders_yScroll : null,
                  stickyHeaders_filteredToTop: true
                },
                sortList: [[2,1]],
                headers: {sorter: false},
                widthFixed: false
              });
            });
          - if prediction[:neighbors].size > 0
            %div.table-responsive
              %table{:id=>"#{j+1}", :style=>"border-style: solid;"}
                %thead
                  %tr
                    %th.sorter-false{:style =>"vertical-align:middle;"}
                      Compound
                    %th.sorter-false{:style =>"vertical-align:middle;"}
                      Measured Activity
                      %a.btn.glyphicon.glyphicon-info-sign{:href=>"javascript:void(0)", :title=>"Measured Activity", :tabindex=>"0", data: {trigger:"focus", container:"body", toggle:"popover", placement:"auto", html:"true", content:"Experimental result(s) from the training dataset."}, :style=>"z-index:auto+10;"}
                    %th.sorter-false{:style =>"vertical-align:middle;"}
                      Similarity
                      %a.btn.glyphicon.glyphicon-info-sign{:href=>"javascript:void(0)", :title=>"Similarity", :tabindex=>"0", data: {trigger:"focus", container:"body", toggle:"popover", placement:"auto", html:"true", content:"<a alt=\"Link opens in new window.\" title=\"Link opens in new window.\" target=\"_blank\" href=\"https://en.wikipedia.org/wiki/Jaccard_index\">Tanimoto/Jaccard</a> similarity based on <a alt=\"Link opens in new window.\" title=\"Link opens in new window.\" target=\"_blank\" href=\"https://openbabel.org/docs/dev/FileFormats/MolPrint2D_format.html\">Molprint2D</a> fingerprints."}, :style=>"z-index:auto+10;"}
                    / %th{:style =>"vertical-align:middle;"}
                    / Supporting Information
                %tbody
                  - type = @model_types[j]
                  - unit = @models[j].unit
                - prediction[:neighbors].uniq.each_with_index do |neighbor,count|
                  %tr
                    / Compound
                    - c = Compound.find(neighbor)
                    %td{:style =>"vertical-align:middle;padding-left:1em;width:50%;"}
                      %a.btn.btn-link{:href => "#details#{j+1}", data: { toggle: "modal", remote: to("/prediction/#{CGI.escape(c.id.to_s)}/details"), :id=>"link#{j+1}#{count}"}}
                        = c.svg
                      %p= c.smiles
                    
                    / Measured Activity
                    %td{:style =>"vertical-align:middle;padding-left:1em;width:20%;white-space:nowrap;"}
                      - if neighbor[:measurement].is_a?(Array)
                        = (type == "Regression") ? neighbor[:measurement].collect{|value| "#{value.delog10.signif(3)} (#{unit})</br>#{c.mmol_to_mg(value.delog10).signif(3)} #{unit =~ /mmol\/L/ ? "(mg/L)" : "(mg/kg_bw/day)"}"}.join("</br>") : neighbor[:measurement].join(", ")
                      - else
                        = (type == "Regression") ? "#{neighbor[:measurement].delog10.signif(3)} (#{unit})</br>#{c.mmol_to_mg(neighbor[:measurement].delog10).signif(3)} #{(unit =~ /\b(mol\/L)\b/) ? "(mg/L)" : "(mg/kg_bw/day)"}" : neighbor[:measurement]
                    
                    / Similarity = tanimoto
                    %td{:style =>"vertical-align:middle;padding-left:1em;width:20%;"}
                      = neighbor[:similarity].round(3)

          - else
            %span.btn.btn-default.disabled
              = "Not enough similar compounds in training dataset"

          %div.modal.fade{:id=>"details#{j+1}", :role=>"dialog"}
            %div.modal-dialog.modal-lg
              %div.modal-content