/ 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=>"#neighbors", :title=>"Measured Activity", :tabindex=>"0", data: {trigger:"focus", container:"body", toggle:"popover", placement:"left", 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=>"#neighbors", :title=>"Similarity", :tabindex=>"0", data: {trigger:"focus", container:"body", toggle:"popover", placement:"left", html:"true", content:"Tanimoto/Jaccard similarity based on Molprint2D 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["_id"])
%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(neighbor["_id"])}/details"), :id=>"link#{j+1}#{count}"}}
%p= c.svg
%p= c.smiles
- mw = c.molecular_weight
/ Measured Activity = compound.features
%td{:style =>"vertical-align:middle;padding-left:1em;width:20%;white-space:nowrap;"}
- features = c.features.collect{|k,v| v if k == predictionFeature[j]["id"] }.compact.flatten
= (predictionFeature[j]["type"] == "numeric") ? features.collect{|v| weight = c.mmol_to_mg(v); '%.2e' % v + " (#{@models[j].unit})"+" , #{'%.2e' % weight} #{(unit == "mmol/L") ? "(mg/L)" : "(mg/kg_bw/day)"}"}.join("") : features.join("")
/ Similarity = tanimoto
%td{:style =>"vertical-align:middle;padding-left:1em;width:20%;"}
/ TODO differentiate between no neighbors found and compound found in dataset, display neighbors for compounds in dataset?
= neighbor[:tanimoto] != nil ? neighbor[:tanimoto].to_f.round(3) : "Not enough similar compounds in training dataset."
- 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