about summary refs log tree commit diff
diff options
context:
space:
mode:
authorZachary Sloan2012-12-06 18:21:30 -0600
committerZachary Sloan2012-12-06 18:21:30 -0600
commitef464fe82d8dfd517af2fae775973c46926e4c9b (patch)
treef51aad861b40240a6b70f29f62563fbdfdec5983
parent41721f0d386c034470fe68e0017295474242ab48 (diff)
downloadgenenetwork2-ef464fe82d8dfd517af2fae775973c46926e4c9b.tar.gz
Continued work on basic statistics table in show_trait
Continued work towards getting show_trait to work with phenotype traits
-rw-r--r--wqflask/wqflask/static/new/javascript/show_trait.coffee108
-rw-r--r--wqflask/wqflask/static/new/javascript/show_trait.js101
-rw-r--r--wqflask/wqflask/static/new/javascript/stats.coffee14
-rw-r--r--wqflask/wqflask/static/new/javascript/stats.js17
-rw-r--r--wqflask/wqflask/templates/show_trait_details.html2
-rw-r--r--wqflask/wqflask/views.py12
6 files changed, 175 insertions, 79 deletions
diff --git a/wqflask/wqflask/static/new/javascript/show_trait.coffee b/wqflask/wqflask/static/new/javascript/show_trait.coffee
index 3d9fcd5a..278a134b 100644
--- a/wqflask/wqflask/static/new/javascript/show_trait.coffee
+++ b/wqflask/wqflask/static/new/javascript/show_trait.coffee
@@ -4,6 +4,61 @@ console.log("start_b")
 is_number = (o) ->
     return ! isNaN (o-0) && o != null
 
+Stat_Table_Rows = [
+                {
+                    vn: "n_of_samples"
+                    pretty: "N of Samples"
+                    digits: 0
+                },
+                {
+                    vn: "mean"
+                    pretty: "Mean"
+                    digits: 2
+                },
+                {
+                    vn: "median"
+                    pretty: "Median"
+                    digits: 2
+                },
+                {
+                    vn: "std_error"
+                    pretty: "Standard Error (SE)"
+                    digits: 2
+                },
+                {
+                    vn: "std_dev"
+                    pretty: "Standard Deviation (SD)"
+                    digits: 2
+                },
+                {
+                    vn: "min"
+                    pretty: "Minimum"
+                    digits: 2
+                },
+                {
+                    vn: "max"
+                    pretty: "Maximum"
+                    digits: 2
+                },
+                {
+                    vn: "range"
+                    pretty: "Range (log2)"
+                    digits: 2
+                },
+                {
+                    vn: "range_fold"
+                    pretty: "Range (fold)"
+                    digits: 2
+                },
+                {
+                    vn: "interquartile"
+                    pretty: "Interquartile Range"
+                    url: "/glossary.html#Interquartile"
+                    digits: 2
+                }
+
+        ]
+
 $ ->
     hide_tabs = (start) ->
         for x in [start..10]
@@ -30,19 +85,29 @@ $ ->
         the_value = sample_sets[category][value_type]()
         console.log("After running sample_sets, the_value is:", the_value)
         if decimal_places > 0
+            title_value = the_value.toFixed(decimal_places * 2)
             the_value = the_value.toFixed(decimal_places)
+        else
+            title_value = null
 
         console.log("*-* the_value:", the_value)
         console.log("*-* current_value:", current_value)
         if the_value != current_value
             $(id).html(the_value).effect("highlight")
 
+        # We go ahead and always change the title value if we have it
+        if title_value
+            $(id).attr('title', title_value)
+
     update_stat_values = (sample_sets)->
         for category in ['samples_primary', 'samples_other', 'samples_all']
-            change_stats_value(sample_sets, category, "n_of_samples", 0)
-            for stat in ["mean", "median", "std_dev", "std_error", "min", "max"]
+            #change_stats_value(sample_sets, category, "n_of_samples", 0)
+
+            #for stat in ["mean", "median", "std_dev", "std_error", "min", "max"]
+            #for stat in (row.vn for row in Stat_Table_Rows)
+            for row in Stat_Table_Rows
                 console.log("Calling change_stats_value")
-                change_stats_value(sample_sets, category, stat, 2)
+                change_stats_value(sample_sets, category, row.vn, row.digits)
 
     edit_data_change = ->
         sample_sets =
@@ -94,41 +159,10 @@ $ ->
         header += "</thead>"
         console.log("windex header is:", header)
 
-        rows = [
-                {
-                    vn: "n_of_samples"
-                    pretty: "N of Samples"
-                },
-                {
-                    vn: "mean"
-                    pretty: "Mean"
-                },
-                {
-                    vn: "median"
-                    pretty: "Median"
-                },
-                {
-                    vn: "std_error"
-                    pretty: "Standard Error (SE)"
-                },
-                {
-                    vn: "std_dev"
-                    pretty: "Standard Deviation (SD)"
-                },
-                {
-                    vn: "min"
-                    pretty: "Minimum"
-                },
-                {
-                    vn: "max"
-                    pretty: "Maximum"
-                }
-        ]
-
-        console.log("rows are:", rows)
+        #console.log("rows are:", rows)
         the_rows = "<tbody>"
-        console.log("length of rows:", rows.length)
-        for row in rows
+        #console.log("length of rows:", rows.length)
+        for row in Stat_Table_Rows
             console.log("rowing")
             row_line = """<tr>"""
             row_line += """<td id="#{ row.vn  }">#{ row.pretty }</td>"""
diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js
index 84282aef..3a7bc387 100644
--- a/wqflask/wqflask/static/new/javascript/show_trait.js
+++ b/wqflask/wqflask/static/new/javascript/show_trait.js
@@ -1,6 +1,6 @@
 // Generated by CoffeeScript 1.3.3
 (function() {
-  var is_number,
+  var Stat_Table_Rows, is_number,
     __hasProp = {}.hasOwnProperty,
     __slice = [].slice;
 
@@ -10,6 +10,51 @@
     return !isNaN((o - 0) && o !== null);
   };
 
+  Stat_Table_Rows = [
+    {
+      vn: "n_of_samples",
+      pretty: "N of Samples",
+      digits: 0
+    }, {
+      vn: "mean",
+      pretty: "Mean",
+      digits: 2
+    }, {
+      vn: "median",
+      pretty: "Median",
+      digits: 2
+    }, {
+      vn: "std_error",
+      pretty: "Standard Error (SE)",
+      digits: 2
+    }, {
+      vn: "std_dev",
+      pretty: "Standard Deviation (SD)",
+      digits: 2
+    }, {
+      vn: "min",
+      pretty: "Minimum",
+      digits: 2
+    }, {
+      vn: "max",
+      pretty: "Maximum",
+      digits: 2
+    }, {
+      vn: "range",
+      pretty: "Range (log2)",
+      digits: 2
+    }, {
+      vn: "range_fold",
+      pretty: "Range (fold)",
+      digits: 2
+    }, {
+      vn: "interquartile",
+      pretty: "Interquartile Range",
+      url: "/glossary.html#Interquartile",
+      digits: 2
+    }
+  ];
+
   $(function() {
     var block_by_attribute_value, block_by_index, block_outliers, change_stats_value, create_value_dropdown, edit_data_change, export_sample_table_data, get_sample_table_data, hide_no_value, hide_tabs, make_table, on_corr_method_change, populate_sample_attributes_values_dropdown, process_id, reset_samples_table, show_hide_outliers, stats_mdp_change, update_stat_values;
     hide_tabs = function(start) {
@@ -27,7 +72,7 @@
       return $("#stats_tabs" + selected).show();
     };
     change_stats_value = function(sample_sets, category, value_type, decimal_places) {
-      var current_value, id, in_box, the_value;
+      var current_value, id, in_box, the_value, title_value;
       id = "#" + process_id(category, value_type);
       console.log("the_id:", id);
       in_box = $(id).html;
@@ -36,29 +81,33 @@
       the_value = sample_sets[category][value_type]();
       console.log("After running sample_sets, the_value is:", the_value);
       if (decimal_places > 0) {
+        title_value = the_value.toFixed(decimal_places * 2);
         the_value = the_value.toFixed(decimal_places);
+      } else {
+        title_value = null;
       }
       console.log("*-* the_value:", the_value);
       console.log("*-* current_value:", current_value);
       if (the_value !== current_value) {
-        return $(id).html(the_value).effect("highlight");
+        $(id).html(the_value).effect("highlight");
+      }
+      if (title_value) {
+        return $(id).attr('title', title_value);
       }
     };
     update_stat_values = function(sample_sets) {
-      var category, stat, _i, _len, _ref, _results;
+      var category, row, _i, _len, _ref, _results;
       _ref = ['samples_primary', 'samples_other', 'samples_all'];
       _results = [];
       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
         category = _ref[_i];
-        change_stats_value(sample_sets, category, "n_of_samples", 0);
         _results.push((function() {
-          var _j, _len1, _ref1, _results1;
-          _ref1 = ["mean", "median", "std_dev", "std_error", "min", "max"];
+          var _j, _len1, _results1;
           _results1 = [];
-          for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
-            stat = _ref1[_j];
+          for (_j = 0, _len1 = Stat_Table_Rows.length; _j < _len1; _j++) {
+            row = Stat_Table_Rows[_j];
             console.log("Calling change_stats_value");
-            _results1.push(change_stats_value(sample_sets, category, stat, 2));
+            _results1.push(change_stats_value(sample_sets, category, row.vn, row.digits));
           }
           return _results1;
         })());
@@ -96,7 +145,7 @@
       return update_stat_values(sample_sets);
     };
     make_table = function() {
-      var header, key, row, row_line, rows, table, the_id, the_rows, value, _i, _len, _ref, _ref1;
+      var header, key, row, row_line, table, the_id, the_rows, value, _i, _len, _ref, _ref1;
       header = "<thead><tr><th>&nbsp;</th>";
       console.log("js_data.sample_group_types:", js_data.sample_group_types);
       _ref = js_data.sample_group_types;
@@ -110,35 +159,9 @@
       }
       header += "</thead>";
       console.log("windex header is:", header);
-      rows = [
-        {
-          vn: "n_of_samples",
-          pretty: "N of Samples"
-        }, {
-          vn: "mean",
-          pretty: "Mean"
-        }, {
-          vn: "median",
-          pretty: "Median"
-        }, {
-          vn: "std_error",
-          pretty: "Standard Error (SE)"
-        }, {
-          vn: "std_dev",
-          pretty: "Standard Deviation (SD)"
-        }, {
-          vn: "min",
-          pretty: "Minimum"
-        }, {
-          vn: "max",
-          pretty: "Maximum"
-        }
-      ];
-      console.log("rows are:", rows);
       the_rows = "<tbody>";
-      console.log("length of rows:", rows.length);
-      for (_i = 0, _len = rows.length; _i < _len; _i++) {
-        row = rows[_i];
+      for (_i = 0, _len = Stat_Table_Rows.length; _i < _len; _i++) {
+        row = Stat_Table_Rows[_i];
         console.log("rowing");
         row_line = "<tr>";
         row_line += "<td id=\"" + row.vn + "\">" + row.pretty + "</td>";
diff --git a/wqflask/wqflask/static/new/javascript/stats.coffee b/wqflask/wqflask/static/new/javascript/stats.coffee
index 118ee7a8..d6d39245 100644
--- a/wqflask/wqflask/static/new/javascript/stats.coffee
+++ b/wqflask/wqflask/static/new/javascript/stats.coffee
@@ -42,6 +42,20 @@ class Stats
     max: ->
         return Math.max(@the_values...)
 
+    range: ->
+        return @max() - @min()
+
+    range_fold: ->
+        return Math.pow(2, @range())
+
+    interquartile: ->
+        length = @the_values.length
+        # Todo: Consider averaging q1 and a3 when the length is odd
+        q1 = @the_values[Math.round(length * .25)]
+        q3 = @the_values[Math.round(length * .75)]
+        iq = q3 - q1
+        return Math.pow(2, iq)
+
 
 bxd_only = new Stats([3, 5, 7, 8])
 console.log("[xred] bxd_only mean:", bxd_only.mean())
diff --git a/wqflask/wqflask/static/new/javascript/stats.js b/wqflask/wqflask/static/new/javascript/stats.js
index 620f7d5d..5b7603ba 100644
--- a/wqflask/wqflask/static/new/javascript/stats.js
+++ b/wqflask/wqflask/static/new/javascript/stats.js
@@ -70,6 +70,23 @@
       return Math.max.apply(Math, this.the_values);
     };
 
+    Stats.prototype.range = function() {
+      return this.max() - this.min();
+    };
+
+    Stats.prototype.range_fold = function() {
+      return Math.pow(2, this.range());
+    };
+
+    Stats.prototype.interquartile = function() {
+      var iq, length, q1, q3;
+      length = this.the_values.length;
+      q1 = this.the_values[Math.round(length * .25)];
+      q3 = this.the_values[Math.round(length * .75)];
+      iq = q3 - q1;
+      return Math.pow(2, iq);
+    };
+
     return Stats;
 
   })();
diff --git a/wqflask/wqflask/templates/show_trait_details.html b/wqflask/wqflask/templates/show_trait_details.html
index e04fdd66..4b3862c7 100644
--- a/wqflask/wqflask/templates/show_trait_details.html
+++ b/wqflask/wqflask/templates/show_trait_details.html
@@ -7,7 +7,7 @@
 
     <dt>Database</dt>
     <dd>
-        <a href="{{ this_trait.database.url }}" target="_blank">
+        <a href="{{ url_for('static', filename='/dbdoc/' + dataset.fullname + '.html') }}" target="_blank">
             {{ dataset.name }}
         </a>
     </dd>
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index 17dc42fb..70d8cd20 100644
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -4,6 +4,7 @@ import csv
 import StringIO  # Todo: Use cStringIO?
 
 import simplejson as json
+#import json
 import yaml
 
 import flask
@@ -95,10 +96,17 @@ def show_trait_page():
     #fd = webqtlFormData.webqtlFormData(request.args)
     #print("stp y1:", pf(vars(fd)))
     template_vars = show_trait.ShowTrait(request.args)
+
+    print("js_data before dump:", template_vars.js_data)
+
     template_vars.js_data = json.dumps(template_vars.js_data,
                                        default=json_default_handler,
-                                       indent="   ",
-                                       sort_keys=True)
+                                       indent="   ")
+    # Sorting the keys messes up the ordered dictionary, so don't do that
+                                       #sort_keys=True)
+
+    print("js_data after dump:", template_vars.js_data)
+
     print("show_trait template_vars:", pf(template_vars.__dict__))
     return render_template("show_trait.html", **template_vars.__dict__)