seedlot upload with accession synonyms. seedlot upload works to update existing seedlots
[sgn.git] / js / anova.js
blob20872fdaddc5ebcb28594406cffd6b3967d094d9
1 /**
2 * ANOVA analysis
3 * Isaak Y Tecle <iyt2@cornell.edu>
5 */
8 jQuery(document).ready( function() {
10 var url = document.URL;
12 if (url.match(/\/breeders_toolbox\/trial|breeders\/trial|\/solgs\/population\//)) {
13 allowAnova();
16 });
19 function allowAnova () {
21 checkDesign();
26 function checkDesign () {
28 var trialId = getTrialId();
30 jQuery.ajax({
31 type: 'POST',
32 dataType: 'json',
33 data: {'trial_id': trialId},
34 url: '/anova/check/design/',
35 success: function(response) {
37 if (response.Error) {
38 showMessage(response.Error);
39 jQuery("#run_anova").hide();
40 } else {
42 listAnovaTraits();
45 error: function(response) {
46 showMessage("Error occured running the ANOVA.");
47 jQuery("#run_anova").show();
49 });
54 jQuery(document).ready(function () {
55 jQuery(document).on("click", "#run_anova", function() {
57 var traitId = jQuery("#anova_selected_trait_id").val();
59 if (traitId) {
61 queryPhenoData(traitId);
63 jQuery("#run_anova").hide();
65 showMessage("Running anova analysis...");
66 } else {
67 var msg = 'You need to select a trait first.'
68 anovaAlert(msg);
71 });
73 });
76 function anovaAlert(msg) {
78 jQuery('<div />')
79 .html(msg)
80 .dialog({
81 modal : true,
82 title : 'Alert',
83 buttons: {
84 OK: {
85 click: function () {
86 jQuery(this).dialog('close');
88 class: 'btn btn-success',
89 text : 'OK',
92 });
97 function queryPhenoData(traitId) {
99 var trialId = getTrialId();
101 jQuery.ajax({
102 type: 'POST',
103 dataType: 'json',
104 data: {'trial_id': trialId, 'traits_ids': [traitId]},
105 url: '/anova/phenotype/data/',
106 success: function(response) {
108 if (response.Error) {
109 showMessage(response.Error);
110 jQuery("#run_anova").show();
111 } else {
112 var traitsAbbrs = response.traits_abbrs;
113 runAnovaAnalysis(traitsAbbrs);
116 error: function(response) {
117 showMessage("Error occured running the ANOVA.");
118 jQuery("#run_anova").show();
124 function showMessage (msg) {
125 jQuery("#anova_message")
126 .css({"padding-left": '0px'})
127 .html(msg);
132 function runAnovaAnalysis(traits) {
134 var trialId = getTrialId();
136 var captions = jQuery('#anova_table table').find('caption').text();
137 var analyzedTraits = captions.replace(/ANOVA result:/g, ' ');
139 for (var i = 0; i < traits.length; i++) {
140 var traitAbbr = traits[i].trait_abbr;
142 if (analyzedTraits.match(traitAbbr) == null) {
143 var anovaTraits = JSON.stringify(traits);
145 jQuery.ajax({
146 type: 'POST',
147 dataType: 'json',
148 data: {'trial_id': trialId, 'traits': [anovaTraits]},
149 url: '/anova/analysis/',
150 success: function(response) {
152 if (response) {
153 var anovaTable = response.anova_html_table;
155 jQuery("#anova_table").append('<div style="margin-top: 20px">' + anovaTable + '</div>').show();
157 var anovaFile = response.anova_table_file;
158 var modelFile = response.anova_model_file;
159 var meansFile = response.adj_means_file;
160 var diagnosticsFile = response.anova_diagnostics_file;
162 var fileNameAnova = anovaFile.split('/').pop();
163 var fileNameModel = modelFile.split('/').pop();
164 var fileNameMeans = meansFile.split('/').pop();
165 var fileNameDiagnostics = diagnosticsFile.split('/').pop()
167 anovaFile = "<a href=\"" + anovaFile + "\" download=" + fileNameAnova + ">[Anova table]</a>";
168 modelFile = "<a href=\"" + modelFile + "\" download=" + fileNameModel + ">[Model Summary]</a>";
169 meansFile = "<a href=\"" + meansFile + "\" download=" + fileNameMeans + ">[Adjusted Means]</a>";
171 diagnosticsFile = "<a href=\"" + diagnosticsFile
172 + "\" download=" + fileNameDiagnostics + ">[Model Diagnostics]</a>";
174 jQuery("#anova_table")
175 .append('<br /> <strong>Download:</strong> '
176 + anovaFile + ' | '
177 + modelFile + ' | '
178 + meansFile + ' | '
179 + diagnosticsFile)
180 .show();
182 jQuery("#anova_message").empty();
184 jQuery("#run_anova").show();
185 } else {
186 showMessage("There is no anova output for this dataset.");
187 jQuery("#run_anova").show();
190 clearTraitSelection();
192 error: function(response) {
193 showMessage("Error occured running the anova analysis.");
194 jQuery("#run_anova").show();
195 clearTraitSelection();
198 } else {
199 jQuery("#anova_message").empty();
200 jQuery("#run_anova").show();
201 clearTraitSelection();
208 function listAnovaTraits () {
210 var trialId = getTrialId();
212 jQuery.ajax({
213 type: 'POST',
214 dataType: 'json',
215 data: {'trial_id': trialId},
216 url: '/anova/traits/list/',
217 success: function(response) {
218 var traits = response.anova_traits;
220 if (traits.length) {
221 formatAnovaTraits(traits);
222 jQuery("#run_anova").show();
223 } else {
224 showMessage('This trial has no phenotyped traits.');
225 jQuery("#run_anova").hide();
228 error: function(response) {
229 showMessage("Error occured listing anova traits.");
230 jQuery("#run_anova").hide();
237 function formatAnovaTraits(traits) {
239 var traitsList = '';
241 for (var i = 0; i < traits.length; i++) {
242 var traitName = traits[i].trait_name;
244 var idName = JSON.stringify(traits[i]);
245 traitsList +='<li>'
246 + '<a href="#">' + traitName + '<span class=value>' + idName + '</span></a>'
247 + '</li>';
250 var traitsList = '<dl id="anova_selected_trait" class="anova_dropdown">'
251 + '<dt> <a href="#"><span>Select a trait</span></a></dt>'
252 + '<dd>'
253 + '<ul>'
254 + traitsList
255 + '</ul></dd></dl>';
257 jQuery("#anova_select_a_trait_div").empty().append(traitsList).show();
259 jQuery(".anova_dropdown dt a").click(function() {
260 jQuery(".anova_dropdown dd ul").toggle();
263 jQuery(".anova_dropdown dd ul li a").click(function() {
265 var text = jQuery(this).html();
267 jQuery(".anova_dropdown dt a span").html(text);
268 jQuery(".anova_dropdown dd ul").hide();
270 var traitIdName = jQuery("#anova_selected_trait").find("dt a span.value").html();
271 traitIdName = JSON.parse(traitIdName);
273 var traitId = traitIdName.trait_id;
274 var traitName = traitIdName.trait_name;
276 console.log('id ' + traitId + ' name ' + traitName)
278 jQuery("#anova_selected_trait_name").val(traitName);
279 jQuery("#anova_selected_trait_id").val(traitId);
283 jQuery(".anova_dropdown").bind('click', function(e) {
284 var clicked = jQuery(e.target);
286 if (!clicked.parents().hasClass("anova_dropdown"))
287 jQuery(".anova_dropdown dd ul").hide();
289 e.preventDefault();
292 });
297 function clearTraitSelection () {
299 jQuery("#anova_selected_trait_name").val('');
300 jQuery("#anova_selected_trait_id").val('');
305 function getTrialId () {
307 var trialId = jQuery("#trial_id").val();
309 if (!trialId) {
311 trialId = jQuery("#population_id").val();
314 return trialId;