about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--wqflask/wqflask/api/router.py116
-rw-r--r--wqflask/wqflask/static/new/javascript/plotly_probability_plot.js11
-rw-r--r--wqflask/wqflask/static/new/javascript/show_trait.js23
-rw-r--r--wqflask/wqflask/templates/show_trait.html19
-rw-r--r--wqflask/wqflask/templates/show_trait_calculate_correlations.html2
-rw-r--r--wqflask/wqflask/templates/show_trait_edit_data.html2
-rw-r--r--wqflask/wqflask/templates/show_trait_transform_and_filter.html8
7 files changed, 156 insertions, 25 deletions
diff --git a/wqflask/wqflask/api/router.py b/wqflask/wqflask/api/router.py
index 845873a0..4ecd6699 100644
--- a/wqflask/wqflask/api/router.py
+++ b/wqflask/wqflask/api/router.py
@@ -290,6 +290,106 @@ def get_dataset_info(dataset_name, group_name = None, file_format="json"):
     else:
         return return_error(code=204, source=request.url_rule.rule, title="No Results", details="")
 
+@app.route("/api/v_{}/traits/<path:dataset_name>".format(version), methods=('GET',))
+@app.route("/api/v_{}/traits/<path:dataset_name>.<path:file_format>".format(version), methods=('GET',))
+def fetch_traits(dataset_name, file_format = "csv"):
+    trait_ids, _trait_names, data_type, dataset_id = get_dataset_trait_ids(dataset_name)
+    if ('ids_only' in request.args) and (len(trait_ids) > 0):
+        if file_format == "json":
+            filename = dataset_name + "_trait_ids.json"
+            return flask.jsonify(trait_ids)
+        else:
+            filename = dataset_name + "_trait_ids.csv"
+
+            si = StringIO.StringIO()
+            csv_writer = csv.writer(si)
+            csv_writer.writerows([[trait_id] for trait_id in trait_ids])
+            output = make_response(si.getvalue())
+            output.headers["Content-Disposition"] = "attachment; filename=" + filename
+            output.headers["Content-type"] = "text/csv"
+            return output
+    else:
+        if len(trait_ids) > 0:
+            if data_type == "ProbeSet":
+                query = """
+                            SELECT
+                                ProbeSet.Id, ProbeSet.Name, ProbeSet.Symbol, ProbeSet.description, ProbeSet.Chr, ProbeSet.Mb, ProbeSet.alias,
+                                ProbeSetXRef.mean, ProbeSetXRef.se, ProbeSetXRef.Locus, ProbeSetXRef.LRS, ProbeSetXRef.pValue, ProbeSetXRef.additive, ProbeSetXRef.h2
+                            FROM
+                                ProbeSet, ProbeSetXRef
+                            WHERE
+                                ProbeSetXRef.ProbeSetFreezeId = '{0}' AND
+                                ProbeSetXRef.ProbeSetId = ProbeSet.Id
+                            ORDER BY
+                                ProbeSet.Id
+                        """
+
+                field_list = ["Id", "Name", "Symbol", "Description", "Chr", "Mb", "Aliases", "Mean", "SE", "Locus", "LRS", "P-Value", "Additive", "h2"]
+            elif data_type == "Geno":
+                query = """
+                            SELECT
+                                Geno.Id, Geno.Name, Geno.Marker_Name, Geno.Chr, Geno.Mb, Geno.Sequence, Geno.Source
+                            FROM
+                                Geno, GenoXRef
+                            WHERE
+                                GenoXRef.GenoFreezeId = '{0}' AND
+                                GenoXRef.GenoId = Geno.Id
+                            ORDER BY
+                                Geno.Id
+                        """
+
+                field_list = ["Id", "Name", "Marker_Name", "Chr", "Mb", "Sequence", "Source"]
+            else:
+                query = """
+                            SELECT
+                                PublishXRef.Id, PublishXRef.PhenotypeId, PublishXRef.PublicationId, PublishXRef.Locus, PublishXRef.LRS, PublishXRef.additive, PublishXRef.Sequence
+                            FROM
+                                PublishXRef
+                            WHERE
+                                PublishXRef.InbredSetId = {0}
+                            ORDER BY
+                                PublishXRef.Id
+                        """
+
+                field_list = ["Id", "PhenotypeId", "PublicationId", "Locus", "LRS", "Additive", "Sequence"]
+
+            if file_format == "json":
+                filename = dataset_name + "_traits.json"
+
+                final_query = query.format(dataset_id)
+
+                result_list = []
+                for result in g.db.execute(final_query).fetchall():
+                    trait_dict = {}
+                    for i, field in enumerate(field_list):
+                        if result[i]:
+                            trait_dict[field] = result[i]
+                    result_list.append(trait_dict)
+
+                return flask.jsonify(result_list)
+            elif file_format == "csv":
+                filename = dataset_name + "_traits.csv"
+
+                results_list = []
+                header_list = []
+                header_list += field_list
+                results_list.append(header_list)
+
+                final_query = query.format(dataset_id)
+                for result in g.db.execute(final_query).fetchall():
+                    results_list.append(result)
+
+                si = StringIO.StringIO()
+                csv_writer = csv.writer(si)
+                csv_writer.writerows(results_list)
+                output = make_response(si.getvalue())
+                output.headers["Content-Disposition"] = "attachment; filename=" + filename
+                output.headers["Content-type"] = "text/csv"
+                return output
+            else:
+                return return_error(code=400, source=request.url_rule.rule, title="Invalid Output Format", details="Current formats available are JSON and CSV, with CSV as default")
+        else:
+            return return_error(code=204, source=request.url_rule.rule, title="No Results", details="")
 
 @app.route("/api/v_{}/sample_data/<path:dataset_name>".format(version))
 @app.route("/api/v_{}/sample_data/<path:dataset_name>.<path:file_format>".format(version))
@@ -528,8 +628,6 @@ def get_trait_info(dataset_name, trait_name, file_format = "json"):
                              PublishXRef.Id = '{0}' AND
                              PublishXRef.InbredSetId = '{1}'
                       """.format(trait_name, group_id)
-        
-        logger.debug("QUERY:", pheno_query)
 
         pheno_results = g.db.execute(pheno_query)
 
@@ -612,13 +710,6 @@ def get_genotypes(group_name, file_format="csv"):
 
     return output
 
-@app.route("/api/v_{}/traits/<path:dataset_name>".format(version), methods=('GET',))
-@app.route("/api/v_{}/traits/<path:dataset_name>.<path:file_format>".format(version), methods=('GET',))
-def get_traits(dataset_name, file_format = "json"):
-    #ZS: Need to check about the "start" and "stop" stuff since it seems to just limit the number of results to stop - start + 1 in Pjotr's elixir code
-
-    NotImplemented
-
 def return_error(code, source, title, details):
     json_ob = {"errors": [
         {
@@ -652,7 +743,7 @@ def get_dataset_trait_ids(dataset_name):
         dataset_id = results[0][2]
         return trait_ids, trait_names, data_type, dataset_id
 
-    elif "Publish" in dataset_name:
+    elif "Publish" in dataset_name or get_group_id(dataset_name):
         data_type = "Publish"
         dataset_name = dataset_name.replace("Publish", "")
         dataset_id = get_group_id(dataset_name)
@@ -743,7 +834,10 @@ def get_group_id_from_dataset(dataset_name):
 
     result = g.db.execute(query).fetchone()
 
-    return result[0]
+    if len(result) > 0:
+        return result[0]
+    else:
+        return None
 
 def get_group_id(group_name):
     query = """
diff --git a/wqflask/wqflask/static/new/javascript/plotly_probability_plot.js b/wqflask/wqflask/static/new/javascript/plotly_probability_plot.js
index 14b0e056..d52cb100 100644
--- a/wqflask/wqflask/static/new/javascript/plotly_probability_plot.js
+++ b/wqflask/wqflask/static/new/javascript/plotly_probability_plot.js
@@ -161,8 +161,14 @@
         intercept_line['samples_all'] = [[first_x, last_x], [first_value, last_value]]
     }
 
+    if (Math.max(y_values['samples_all']) - Math.min(y_values['samples_all']) < 6){
+      tick_digits = '.1f'
+    } else {
+      tick_digits = 'f'
+    }
+
     var layout = {
-        title: 'Quantile-Quantile Plot<a href="https://en.wikipedia.org/wiki/Q-Q_plot"><sup>?</sup></a>',
+        title: js_data.trait_id,
         margin: {
             l: 65,
             r: 30,
@@ -196,7 +202,8 @@
             ticklen: 4,
             tickfont: {
               size: 16
-            }
+            },
+            tickformat: tick_digits
         },
         hovermode: "closest"
     }
diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js
index 31f59a13..167fafcb 100644
--- a/wqflask/wqflask/static/new/javascript/show_trait.js
+++ b/wqflask/wqflask/static/new/javascript/show_trait.js
@@ -922,6 +922,11 @@ get_bar_range = function(sample_list){
 }
 
 root.chart_range = get_bar_range(sample_lists[0])
+if (root.chart_range[1] - root.chart_range[0] < 4){
+  tick_digits = '.1f'
+} else {
+  tick_digits = 'f'
+}
 
 if (js_data.num_values < 256) {
   bar_chart_width = 25 * get_sample_vals(sample_lists[0]).length
@@ -930,6 +935,7 @@ if (js_data.num_values < 256) {
   bottom_margin = get_bar_bottom_margin(sample_lists[0])
 
   root.bar_layout = {
+    title: js_data.trait_id,
     xaxis: {
         titlefont: {
           size: 16
@@ -941,6 +947,7 @@ if (js_data.num_values < 256) {
         }
     },
     yaxis: {
+        title: js_data.unit_type,
         range: root.chart_range,
         titlefont: {
           size: 16
@@ -949,12 +956,13 @@ if (js_data.num_values < 256) {
         ticklen: 4,
         tickfont: {
           size: 16
-        }
+        },
+        tickformat: tick_digits
     },
     width: bar_chart_width,
     height: 600,
     margin: {
-        l: 50,
+        l: 55,
         r: 30,
         t: 30,
         b: bottom_margin
@@ -979,7 +987,7 @@ var hist_trace = {
 root.histogram_data = [hist_trace];
 root.histogram_layout = {
   bargap: 0.05,
-  title: "Sample Values",
+  title: js_data.trait_id,
   xaxis: {
            autorange: true,
            title: "Value",
@@ -1025,6 +1033,7 @@ $('.histogram_samples_group').change(function() {
 });
 
 root.box_layout = {
+    title: js_data.trait_id,
     xaxis: {
         showline: true,
         tickfont: {
@@ -1032,12 +1041,14 @@ root.box_layout = {
         },
     },
     yaxis: {
+        title: js_data.unit_type,
         autorange: true,
         showline: true,
         ticklen: 4,
         tickfont: {
           size: 16
-        }
+        },
+        tickformat: tick_digits
     },
     margin: {
         l: 50,
@@ -1136,7 +1147,7 @@ $('.box_plot_tab').click(function() {
 // Violin Plot
 
 root.violin_layout = {
-  title: "Violin Plot",
+  title: js_data.trait_id,
   xaxis: {
       showline: true,
       tickfont: {
@@ -1144,12 +1155,14 @@ root.violin_layout = {
       }
   },
   yaxis: {
+      title: js_data.unit_type,
       autorange: true,
       showline: true,
       ticklen: 4,
       tickfont: {
         size: 16
       },
+      tickformat: tick_digits,
       zeroline: false
   },
   margin: {
diff --git a/wqflask/wqflask/templates/show_trait.html b/wqflask/wqflask/templates/show_trait.html
index 6ab7d635..378f91b1 100644
--- a/wqflask/wqflask/templates/show_trait.html
+++ b/wqflask/wqflask/templates/show_trait.html
@@ -271,7 +271,7 @@
                       'data': null,
                       'orderDataType': "dom-checkbox",
                       'render': function(data, type, row, meta) {
-                        return '<input type="checkbox" name="searchResult" style="min-height: 20px;" class="checkbox edit_sample_checkbox" value="" checked="checked">'
+                        return '<input type="checkbox" name="searchResult" style="min-height: 20px;" class="checkbox edit_sample_checkbox" value="">'
                       }
                     },
                     {
@@ -403,7 +403,7 @@
                       'data': null,
                       'orderDataType': "dom-checkbox",
                       'render': function(data, type, row, meta) {
-                        return '<input type="checkbox" name="searchResult" style="min-height: 20px;" class="checkbox edit_sample_checkbox" value="" checked="checked">'
+                        return '<input type="checkbox" name="searchResult" style="min-height: 20px;" class="checkbox edit_sample_checkbox" value="">'
                       }
                     },
                     {
@@ -491,7 +491,20 @@
                 } );
                 {% endif %}
 
-                $('#samples_primary, #samples_other').find("tr.outlier").css('background-color', 'yellow')
+                $('#samples_primary, #samples_other').find("tr.outlier").css('background-color', 'orange')
+
+                $('.edit_sample_checkbox:checkbox').change(function() {
+                    if ($(this).is(":checked")) {
+                        if (!$(this).closest('tr').hasClass('selected')) {
+                            $(this).closest('tr').addClass('selected')
+                        }
+                    }
+                    else {
+                        if ($(this).closest('tr').hasClass('selected')) {
+                            $(this).closest('tr').removeClass('selected')
+                        }
+                    }
+                });
 
                 var slider = document.getElementById('p_range_slider');
                 noUiSlider.create(slider, {
diff --git a/wqflask/wqflask/templates/show_trait_calculate_correlations.html b/wqflask/wqflask/templates/show_trait_calculate_correlations.html
index ef233333..8ceec4fa 100644
--- a/wqflask/wqflask/templates/show_trait_calculate_correlations.html
+++ b/wqflask/wqflask/templates/show_trait_calculate_correlations.html
@@ -73,6 +73,7 @@
                 </select>
             </div>
         </div>
+        {% if dataset.type != "Publish" %}
         <div class="form-group">
             <label class="col-xs-2 control-label">Min Expr</label>
             <div class="col-xs-3 controls">
@@ -89,6 +90,7 @@
                 <br>
             </div>
         </div>
+        {% endif %}
         <div class="form-group">
             <label class="col-xs-2 control-label">Range</label>
             <div class="col-xs-5 controls">
diff --git a/wqflask/wqflask/templates/show_trait_edit_data.html b/wqflask/wqflask/templates/show_trait_edit_data.html
index 667d557c..fec141dc 100644
--- a/wqflask/wqflask/templates/show_trait_edit_data.html
+++ b/wqflask/wqflask/templates/show_trait_edit_data.html
@@ -1,6 +1,6 @@
 <div>
     <div style="padding-bottom: 10px;">
-      <input type="button" class="btn btn-primary reset" value="Reset">
+      <input type="button" class="btn btn-success reset" value="Reset">
       <span class="input-append">
         <input type="button" class="btn btn-default export" value="Export">
         <select class="select optional span2 export_format">
diff --git a/wqflask/wqflask/templates/show_trait_transform_and_filter.html b/wqflask/wqflask/templates/show_trait_transform_and_filter.html
index 94b3fda3..fbdebcd0 100644
--- a/wqflask/wqflask/templates/show_trait_transform_and_filter.html
+++ b/wqflask/wqflask/templates/show_trait_transform_and_filter.html
@@ -16,7 +16,7 @@
                     {{ sample_group_types['samples_other'] }}
                   </option>
                 </select>
-                <input type="button" id="block_by_index" class="btn" value="Block">
+                <input type="button" id="block_by_index" class="btn btn-danger" value="Block">
             </div>
             <div id="remove_samples_invalid" class="alert alert-error" style="display:none;">
                   Please check that your input is formatted correctly, e.g. <strong>3, 5-10, 12</strong>
@@ -38,7 +38,7 @@
             <div>
               <input type="button" id="hide_no_value" class="btn btn-default" value="Hide No Value">
               <input type="button" id="block_outliers" class="btn btn-default" value="Block Outliers">
-              <input type="button" class="btn btn-primary reset" value="Reset">
+              <input type="button" class="btn btn-success reset" value="Reset">
               <span class="input-append">
                 <input type="button" class="btn btn-default export" value="Export">
                 <select class="select optional span2 export_format">
@@ -48,9 +48,11 @@
               </span>
               <br>
               <div style="margin-top:10px;">
-              <input type="button" id="normalize" class="btn btn-default" value="Normalize">
+              <input type="button" id="normalize" class="btn btn-success" value="Normalize">
               <select id="norm_method" class="select optional span2">
+                {% if negative_vals_exist == "false" %}
                 <option value="log2">Log2</option>
+                {% endif %}
                 <option value="zscore">Z-score</option>
                 <option value="qnorm">Quantile</option>
                 <option value="sqrt">Square Root</option>