From 4cfdad02e5f8ebd4bd347f078999b063041b29d2 Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Thu, 21 Nov 2013 21:39:40 +0000 Subject: Added apt-get dist-upgrade to notes --- misc/notes.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/misc/notes.txt b/misc/notes.txt index f6a2bb33..5a43ab8a 100644 --- a/misc/notes.txt +++ b/misc/notes.txt @@ -28,6 +28,7 @@ for python packages **** Upgrade system packages for security updates, etc: apt-get update +apt-get dist-upgrade (can probably be used in place of apt-get upgrade) apt-get upgrade **"apt-cache search" searches for text in the description for various packages, while -- cgit v1.2.3 From 5143738870b8872a915432225acf01508de620ee Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Fri, 22 Nov 2013 22:33:22 +0000 Subject: Did some work towards getting the interval mapping page working --- wqflask/wqflask/interval_mapping/__init__.py | 0 .../wqflask/interval_mapping/interval_mapping.py | 20 +- .../wqflask/static/new/javascript/bar_chart.coffee | 25 +- wqflask/wqflask/static/new/javascript/bar_chart.js | 15 +- .../wqflask/static/new/javascript/box_plot.coffee | 45 +- wqflask/wqflask/static/new/javascript/box_plot.js | 83 ++++ .../static/new/javascript/show_trait.coffee | 433 ++----------------- .../wqflask/static/new/javascript/show_trait.js | 477 ++------------------- .../new/javascript/show_trait_mapping_tools.coffee | 26 ++ .../new/javascript/show_trait_mapping_tools.js | 27 ++ wqflask/wqflask/templates/show_trait.html | 1 + .../templates/show_trait_mapping_tools.html | 9 +- wqflask/wqflask/user_manager.py | 30 +- wqflask/wqflask/views.py | 16 +- 14 files changed, 307 insertions(+), 900 deletions(-) create mode 100644 wqflask/wqflask/interval_mapping/__init__.py create mode 100644 wqflask/wqflask/static/new/javascript/box_plot.js diff --git a/wqflask/wqflask/interval_mapping/__init__.py b/wqflask/wqflask/interval_mapping/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wqflask/wqflask/interval_mapping/interval_mapping.py b/wqflask/wqflask/interval_mapping/interval_mapping.py index aca99cbe..f41ebd2c 100755 --- a/wqflask/wqflask/interval_mapping/interval_mapping.py +++ b/wqflask/wqflask/interval_mapping/interval_mapping.py @@ -37,6 +37,8 @@ class IntervalMapping(object): def __init__(self, start_vars, temp_uuid): + print("TESTING!!!") + #Currently only getting trait data for one trait, but will need #to change this to accept multiple traits once the collection page is implemented helper_functions.get_species_dataset_trait(self, start_vars) @@ -51,6 +53,8 @@ class IntervalMapping(object): self.samples.append(str(sample)) self.vals.append(value) + print("start_vars:", start_vars) + self.set_options(start_vars) self.gen_qtl_results(tempdata) @@ -69,24 +73,24 @@ class IntervalMapping(object): def set_options(self, start_vars): """Sets various options (physical/genetic mapping, # permutations, which chromosome""" - self.plot_scale = start_vars['scale'] + #self.plot_scale = start_vars['scale'] #if self.plotScale == 'physic' and not fd.genotype.Mbmap: # self.plotScale = 'morgan' self.num_permutations = start_vars['num_permutations'] - self.do_bootstrap = start_vars['do_bootstrap'] - self.control_locus = start_vars['control_locus'] - self.selected_chr = start_vars['selected_chr'] - self.weighted_regression = start_vars['weighted'] - self.lrs_lod = start_vars['lrs_lod'] + #self.do_bootstrap = start_vars['do_bootstrap'] + #self.control_locus = start_vars['control_locus'] + self.selected_chr = start_vars['chromosome'] + #self.weighted_regression = start_vars['weighted'] + #self.lrs_lod = start_vars['lrs_lod'] def gen_qtl_results(self, tempdata): """Generates qtl results for plotting interval map""" self.dataset.group.get_markers() - self.dataset.read_genotype_file() + self.dataset.group.read_genotype_file() - samples, values, variances = self.trait.export_informative() + samples, values, variances = self.this_trait.export_informative() if self.control_locus: if self.weighted_regression: self.qtl_results = self.dataset.genotype.regression(strains = samples, diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.coffee b/wqflask/wqflask/static/new/javascript/bar_chart.coffee index 749a7dc0..2c60d3ab 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.coffee +++ b/wqflask/wqflask/static/new/javascript/bar_chart.coffee @@ -121,6 +121,10 @@ class Bar_Chart $('.x.axis').remove() @add_x_axis(x_scale) ) + + d3.select("#color_by_trait").on("click", => + @color_by_trait() + ) get_attr_color_dict: () -> @attr_color_dict = {} @@ -299,20 +303,15 @@ class Bar_Chart .text((d) => return d ) - - + color_by_trait: () -> - console.log("Before load") - $('#collections_holder').load('/collections/list #collections_list') - $.colorbox( - inline: true - href: "#collections_holder" + $('#collections_holder').load('/collections/list #collections_list', => + $.colorbox( + inline: true + href: "#collections_holder" + ) ) - console.log("After load") - #$.colorbox({href:"/collections/list"}) - #$.get( - # url: /collections/list - # - #) + + root.Bar_Chart = Bar_Chart \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.js b/wqflask/wqflask/static/new/javascript/bar_chart.js index 20fab15c..03902741 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.js +++ b/wqflask/wqflask/static/new/javascript/bar_chart.js @@ -125,6 +125,9 @@ return _this.add_x_axis(x_scale); } }); + d3.select("#color_by_trait").on("click", function() { + return _this.color_by_trait(); + }); } Bar_Chart.prototype.get_attr_color_dict = function() { @@ -318,13 +321,13 @@ }; Bar_Chart.prototype.color_by_trait = function() { - console.log("Before load"); - $('#collections_holder').load('/collections/list #collections_list'); - $.colorbox({ - inline: true, - href: "#collections_holder" + var _this = this; + return $('#collections_holder').load('/collections/list #collections_list', function() { + return $.colorbox({ + inline: true, + href: "#collections_holder" + }); }); - return console.log("After load"); }; return Bar_Chart; diff --git a/wqflask/wqflask/static/new/javascript/box_plot.coffee b/wqflask/wqflask/static/new/javascript/box_plot.coffee index 562bd1dc..e9035456 100644 --- a/wqflask/wqflask/static/new/javascript/box_plot.coffee +++ b/wqflask/wqflask/static/new/javascript/box_plot.coffee @@ -5,46 +5,53 @@ class Box_Plot @get_samples() @margin = {top: 10, right: 50, bottom: 20, left: 50} - @plot_width = 120 - @margin.left - @margin.right + @plot_width = 200 - @margin.left - @margin.right @plot_height = 500 - @margin.top - @margin.bottom @min = d3.min(@sample_vals) - @max = d3.max(@sample_vals) * 1.1 + @max = d3.max(@sample_vals) @svg = @create_svg() - @enter_data() - + get_samples: () -> - @sample_names = (sample.name for sample in @sample_list when sample.value != null) @sample_vals = (sample.value for sample in @sample_list when sample.value != null) - @samples = _.zip(@sample_names, @sample_vals) - create_svg: () -> d3.chart.box() - .whiskers(@inter_quartile_range(1.5)) - .width(@plot_width) - .height(@plot_height) - .domain([@min, @max]) - + create_svg: () -> + svg = d3.box() + .whiskers(@inter_quartile_range(1.5)) + .width(@plot_width) + .height(@plot_height) + .domain([@min, @max]) + return svg + enter_data: () -> d3.select("#box_plot").selectAll("svg") - .data(@sample_vals) + .data([@sample_vals]) .enter().append("svg:svg") .attr("class", "box") .attr("width", @plot_width) .attr("height", @plot_height) + .append("svg:g") .call(@svg) inter_quartile_range: (k) -> return (d, i) => - q1 = d.quartiles[0], - q3 = d.quartiles[2], + console.log("iqr d:", d) + q1 = d.quartiles[0] + q3 = d.quartiles[2] inter_quartile_range = (q3 - q1) * k - i = -1 + console.log("iqr:", inter_quartile_range) + i = 0 j = d.length - while (d[++i] < q1 - inter_quartile_range) - while (d[--j] > q3 + inter_quartile_range) + console.log("d[-1]:", d[1]) + console.log("q1 - iqr:", q1 - inter_quartile_range) + i++ while (d[i] < q1 - inter_quartile_range) + j-- while (d[j] > q3 + inter_quartile_range) + #while (d[++i] < q1 - inter_quartile_range + #while d[--j] > q3 + inter_quartile_range + console.log("[i, j]", [i, j]) return [i, j] - \ No newline at end of file +root.Box_Plot = Box_Plot \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/box_plot.js b/wqflask/wqflask/static/new/javascript/box_plot.js new file mode 100644 index 00000000..2dd624e1 --- /dev/null +++ b/wqflask/wqflask/static/new/javascript/box_plot.js @@ -0,0 +1,83 @@ +// Generated by CoffeeScript 1.6.1 +(function() { + var Box_Plot, root; + + root = typeof exports !== "undefined" && exports !== null ? exports : this; + + Box_Plot = (function() { + + function Box_Plot(sample_list, sample_group) { + this.sample_list = sample_list; + this.sample_group = sample_group; + this.get_samples(); + this.margin = { + top: 10, + right: 50, + bottom: 20, + left: 50 + }; + this.plot_width = 200 - this.margin.left - this.margin.right; + this.plot_height = 500 - this.margin.top - this.margin.bottom; + this.min = d3.min(this.sample_vals); + this.max = d3.max(this.sample_vals); + this.svg = this.create_svg(); + this.enter_data(); + } + + Box_Plot.prototype.get_samples = function() { + var sample; + return this.sample_vals = (function() { + var _i, _len, _ref, _results; + _ref = this.sample_list; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + sample = _ref[_i]; + if (sample.value !== null) { + _results.push(sample.value); + } + } + return _results; + }).call(this); + }; + + Box_Plot.prototype.create_svg = function() { + var svg; + svg = d3.box().whiskers(this.inter_quartile_range(1.5)).width(this.plot_width).height(this.plot_height).domain([this.min, this.max]); + return svg; + }; + + Box_Plot.prototype.enter_data = function() { + return d3.select("#box_plot").selectAll("svg").data([this.sample_vals]).enter().append("svg:svg").attr("class", "box").attr("width", this.plot_width).attr("height", this.plot_height).append("svg:g").call(this.svg); + }; + + Box_Plot.prototype.inter_quartile_range = function(k) { + var _this = this; + return function(d, i) { + var inter_quartile_range, j, q1, q3; + console.log("iqr d:", d); + q1 = d.quartiles[0]; + q3 = d.quartiles[2]; + inter_quartile_range = (q3 - q1) * k; + console.log("iqr:", inter_quartile_range); + i = 0; + j = d.length; + console.log("d[-1]:", d[1]); + console.log("q1 - iqr:", q1 - inter_quartile_range); + while (d[i] < q1 - inter_quartile_range) { + i++; + } + while (d[j] > q3 + inter_quartile_range) { + j--; + } + console.log("[i, j]", [i, j]); + return [i, j]; + }; + }; + + return Box_Plot; + + })(); + + root.Box_Plot = Box_Plot; + +}).call(this); diff --git a/wqflask/wqflask/static/new/javascript/show_trait.coffee b/wqflask/wqflask/static/new/javascript/show_trait.coffee index 8bcca85d..7d23345f 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.coffee +++ b/wqflask/wqflask/static/new/javascript/show_trait.coffee @@ -59,373 +59,6 @@ Stat_Table_Rows = [ ] $ -> - class Bar_Chart - constructor: (@sample_list, @sample_group) -> - @get_samples() - console.log("sample names:", @sample_names) - if @sample_attr_vals.length > 0 - @get_distinct_attr_vals() - @get_attr_color_dict() - - #Used to calculate the bottom margin so sample names aren't cut off - longest_sample_name = d3.max(sample.length for sample in @sample_names) - - @margin = {top: 20, right: 20, bottom: longest_sample_name * 7, left: 40} - @plot_width = @sample_vals.length * 15 - @margin.left - @margin.right - @plot_height = 500 - @margin.top - @margin.bottom - - @x_buffer = @plot_width/20 - @y_buffer = @plot_height/20 - - @y_min = d3.min(@sample_vals) - @y_max = d3.max(@sample_vals) * 1.1 - - @svg = @create_svg() - - @plot_height -= @y_buffer - @create_scales() - @create_graph() - - d3.select("#color_attribute").on("change", => - attribute = $("#color_attribute").val() - if $("#update_bar_chart").html() == 'Sort By Name' - @svg.selectAll(".bar") - .data(@sorted_samples()) - .transition() - .duration(1000) - .style("fill", (d) => - if attribute == "None" - return "steelblue" - else - return @attr_color_dict[attribute][d[2][attribute]] - ) - .select("title") - .text((d) => - return d[1] - ) - else - @svg.selectAll(".bar") - .data(@samples) - .transition() - .duration(1000) - .style("fill", (d) => - if attribute == "None" - return "steelblue" - else - return @attr_color_dict[attribute][d[2][attribute]] - ) - @add_legend(attribute, @distinct_attr_vals[attribute]) - ) - - - d3.select("#update_bar_chart").on("click", => - if @attributes.length > 0 - attribute = $("#color_attribute").val() - if $("#update_bar_chart").html() == 'Sort By Value' - $("#update_bar_chart").html('Sort By Name') - sortItems = (a, b) -> - return a[1] - b[1] - - @svg.selectAll(".bar") - .data(@sorted_samples()) - .transition() - .duration(1000) - .attr("y", (d) => - return @y_scale(d[1]) - ) - .attr("height", (d) => - return @plot_height - @y_scale(d[1]) - ) - .style("fill", (d) => - if @attributes.length > 0 - return @attr_color_dict[attribute][d[2][attribute]] - else - return "steelblue" - ) - .select("title") - .text((d) => - return d[1] - ) - sorted_sample_names = (sample[0] for sample in @sorted_samples()) - x_scale = d3.scale.ordinal() - .domain(sorted_sample_names) - .rangeBands([0, @plot_width], .1) - $('.x.axis').remove() - @add_x_axis(x_scale) - else - $("#update_bar_chart").html('Sort By Value') - @svg.selectAll(".bar") - .data(@samples) - .transition() - .duration(1000) - .attr("y", (d) => - return @y_scale(d[1]) - ) - .attr("height", (d) => - return @plot_height - @y_scale(d[1]) - ) - .style("fill", (d) => - if @attributes.length > 0 - return @attr_color_dict[attribute][d[2][attribute]] - else - return "steelblue" - ) - .select("title") - .text((d) => - return d[1] - ) - x_scale = d3.scale.ordinal() - .domain(@sample_names) - .rangeBands([0, @plot_width], .1) - $('.x.axis').remove() - @add_x_axis(x_scale) - ) - - d3.select("#color_by_trait").on("click", => - @color_by_trait() - ) - - get_attr_color_dict: () -> - @attr_color_dict = {} - console.log("distinct_attr_vals:", @distinct_attr_vals) - for own key, distinct_vals of @distinct_attr_vals - this_color_dict = {} - if distinct_vals.length < 10 - color = d3.scale.category10() - for value, i in distinct_vals - this_color_dict[value] = color(i) - else - console.log("distinct_values:", distinct_vals) - if _.every(distinct_vals, (d) => - if isNaN(d) - return false - else - return true - ) - color_range = d3.scale.linear() - .domain([d3.min(distinct_vals), - d3.max(distinct_vals)]) - .range([0,4]) - for value, i in distinct_vals - console.log("color_range(value):", color_range(parseInt(value))) - this_color_dict[value] = d3.rgb("lightblue").darker(color_range(parseInt(value))) - #this_color_dict[value] = "rgb(0, 0, " + color_range(parseInt(value)) + ")" - @attr_color_dict[key] = this_color_dict - - get_samples: () -> - @sample_names = (sample.name for sample in @sample_list when sample.value != null) - @sample_vals = (sample.value for sample in @sample_list when sample.value != null) - @attributes = (key for key of @sample_list[0]["extra_attributes"]) - console.log("attributes:", @attributes) - @sample_attr_vals = [] - if @attributes.length > 0 - for sample in @sample_list - attr_vals = {} - for attribute in @attributes - attr_vals[attribute] = sample["extra_attributes"][attribute] - @sample_attr_vals.push(attr_vals) - @samples = _.zip(@sample_names, @sample_vals, @sample_attr_vals) - - get_distinct_attr_vals: () -> - @distinct_attr_vals = {} - for sample in @sample_attr_vals - for attribute of sample - if not @distinct_attr_vals[attribute] - @distinct_attr_vals[attribute] = [] - if sample[attribute] not in @distinct_attr_vals[attribute] - @distinct_attr_vals[attribute].push(sample[attribute]) - #console.log("distinct_attr_vals:", @distinct_attr_vals) - - create_svg: () -> - svg = d3.select("#bar_chart") - .append("svg") - .attr("class", "bar_chart") - .attr("width", @plot_width + @margin.left + @margin.right) - .attr("height", @plot_height + @margin.top + @margin.bottom) - .append("g") - .attr("transform", "translate(" + @margin.left + "," + @margin.top + ")") - - return svg - - create_scales: () -> - @x_scale = d3.scale.ordinal() - .domain(@sample_names) - .rangeBands([0, @plot_width], .1) - - @y_scale = d3.scale.linear() - .domain([@y_min * 0.75, @y_max]) - .range([@plot_height, @y_buffer]) - - create_graph: () -> - - #@add_border() - @add_x_axis(@x_scale) - @add_y_axis() - - @add_bars() - - add_x_axis: (scale) -> - xAxis = d3.svg.axis() - .scale(scale) - .orient("bottom"); - - @svg.append("g") - .attr("class", "x axis") - .attr("transform", "translate(0," + @plot_height + ")") - .call(xAxis) - .selectAll("text") - .style("text-anchor", "end") - .style("font-size", "12px") - .attr("dx", "-.8em") - .attr("dy", "-.3em") - .attr("transform", (d) => - return "rotate(-90)" - ) - - add_y_axis: () -> - yAxis = d3.svg.axis() - .scale(@y_scale) - .orient("left") - .ticks(5) - - @svg.append("g") - .attr("class", "y axis") - .call(yAxis) - .append("text") - .attr("transform", "rotate(-90)") - .attr("y", 6) - .attr("dy", ".71em") - .style("text-anchor", "end") - - add_bars: () -> - @svg.selectAll(".bar") - .data(@samples) - .enter().append("rect") - .style("fill", "steelblue") - .attr("class", "bar") - .attr("x", (d) => - return @x_scale(d[0]) - ) - .attr("width", @x_scale.rangeBand()) - .attr("y", (d) => - return @y_scale(d[1]) - ) - .attr("height", (d) => - return @plot_height - @y_scale(d[1]) - ) - .append("svg:title") - .text((d) => - return d[1] - ) - - sorted_samples: () -> - #if @sample_attr_vals.length > 0 - sample_list = _.zip(@sample_names, @sample_vals, @sample_attr_vals) - #else - # sample_list = _.zip(@sample_names, @sample_vals) - sorted = _.sortBy(sample_list, (sample) => - return sample[1] - ) - console.log("sorted:", sorted) - return sorted - - add_legend: (attribute, distinct_vals) -> - legend = @svg.append("g") - .attr("class", "legend") - .attr("height", 100) - .attr("width", 100) - .attr('transform', 'translate(-20,50)') - - legend_rect = legend.selectAll('rect') - .data(distinct_vals) - .enter() - .append("rect") - .attr("x", @plot_width - 65) - .attr("width", 10) - .attr("height", 10) - .attr("y", (d, i) => - return i * 20 - ) - .style("fill", (d) => - console.log("TEST:", @attr_color_dict[attribute][d]) - return @attr_color_dict[attribute][d] - ) - - legend_text = legend.selectAll('text') - .data(distinct_vals) - .enter() - .append("text") - .attr("x", @plot_width - 52) - .attr("y", (d, i) => - return i*20 + 9 - ) - .text((d) => - return d - ) - - color_by_trait: () -> - $('#collections_holder').load('/collections/list #collections_list', => - $.colorbox( - inline: true - href: "#collections_holder" - ) - ) - - class Box_Plot - constructor: (@sample_list, @sample_group) -> - @get_samples() - - @margin = {top: 10, right: 50, bottom: 20, left: 50} - @plot_width = 200 - @margin.left - @margin.right - @plot_height = 500 - @margin.top - @margin.bottom - - @min = d3.min(@sample_vals) - @max = d3.max(@sample_vals) - - @svg = @create_svg() - @enter_data() - - - get_samples: () -> - @sample_vals = (sample.value for sample in @sample_list when sample.value != null) - - create_svg: () -> - svg = d3.box() - .whiskers(@inter_quartile_range(1.5)) - .width(@plot_width) - .height(@plot_height) - .domain([@min, @max]) - return svg - - enter_data: () -> - d3.select("#box_plot").selectAll("svg") - .data([@sample_vals]) - .enter().append("svg:svg") - .attr("class", "box") - .attr("width", @plot_width) - .attr("height", @plot_height) - .append("svg:g") - .call(@svg) - - inter_quartile_range: (k) -> - return (d, i) => - console.log("iqr d:", d) - q1 = d.quartiles[0] - q3 = d.quartiles[2] - inter_quartile_range = (q3 - q1) * k - console.log("iqr:", inter_quartile_range) - i = 0 - j = d.length - console.log("d[-1]:", d[1]) - console.log("q1 - iqr:", q1 - inter_quartile_range) - i++ while (d[i] < q1 - inter_quartile_range) - j-- while (d[j] > q3 + inter_quartile_range) - #while (d[++i] < q1 - inter_quartile_range - #while d[--j] > q3 + inter_quartile_range - console.log("[i, j]", [i, j]) - return [i, j] - - sample_lists = js_data.sample_lists sample_group_types = js_data.sample_group_types @@ -504,39 +137,6 @@ $ -> console.log("Calling change_stats_value") change_stats_value(sample_sets, category, row.vn, row.digits) - edit_data_change = -> - already_seen = {} - sample_sets = - samples_primary: new Stats([]) - samples_other: new Stats([]) - samples_all: new Stats([]) - - console.log("at beginning:", sample_sets) - - tables = ['samples_primary', 'samples_other'] - for table in tables - rows = $("#" + table).find('tr') - for row in rows - name = $(row).find('.edit_sample_sample_name').html() - name = $.trim(name) - real_value = $(row).find('.edit_sample_value').val() - console.log("real_value:", real_value) - checkbox = $(row).find(".edit_sample_checkbox") - checked = $(checkbox).attr('checked') - - if checked and is_number(real_value) and real_value != "" - console.log("in the iffy if") - real_value = parseFloat(real_value) - - sample_sets[table].add_value(real_value) - console.log("checking name of:", name) - if not (name of already_seen) - console.log("haven't seen") - sample_sets['samples_all'].add_value(real_value) - already_seen[name] = true - console.log("towards end:", sample_sets) - update_stat_values(sample_sets) - make_table = -> header = " " @@ -585,6 +185,38 @@ $ -> processed += value return processed + edit_data_change = -> + already_seen = {} + sample_sets = + samples_primary: new Stats([]) + samples_other: new Stats([]) + samples_all: new Stats([]) + + console.log("at beginning:", sample_sets) + + tables = ['samples_primary', 'samples_other'] + for table in tables + rows = $("#" + table).find('tr') + for row in rows + name = $(row).find('.edit_sample_sample_name').html() + name = $.trim(name) + real_value = $(row).find('.edit_sample_value').val() + console.log("real_value:", real_value) + checkbox = $(row).find(".edit_sample_checkbox") + checked = $(checkbox).attr('checked') + + if checked and is_number(real_value) and real_value != "" + console.log("in the iffy if") + real_value = parseFloat(real_value) + + sample_sets[table].add_value(real_value) + console.log("checking name of:", name) + if not (name of already_seen) + console.log("haven't seen") + sample_sets['samples_all'].add_value(real_value) + already_seen[name] = true + console.log("towards end:", sample_sets) + update_stat_values(sample_sets) show_hide_outliers = -> console.log("FOOBAR in beginning of show_hide_outliers") @@ -613,7 +245,6 @@ $ -> $('select[name=corr_method]').change(on_corr_method_change) - ##End Calculate Correlations Code ##Populate Samples Attribute Values Code diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js index b562bfe2..718e365a 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.js +++ b/wqflask/wqflask/static/new/javascript/show_trait.js @@ -2,7 +2,6 @@ (function() { var Stat_Table_Rows, is_number, __hasProp = {}.hasOwnProperty, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __slice = [].slice; console.log("start_b"); @@ -57,407 +56,7 @@ ]; $(function() { - var Bar_Chart, Box_Plot, 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, sample_group_types, sample_lists, show_hide_outliers, stats_mdp_change, update_stat_values; - Bar_Chart = (function() { - - function Bar_Chart(sample_list, sample_group) { - var longest_sample_name, sample, - _this = this; - this.sample_list = sample_list; - this.sample_group = sample_group; - this.get_samples(); - console.log("sample names:", this.sample_names); - if (this.sample_attr_vals.length > 0) { - this.get_distinct_attr_vals(); - this.get_attr_color_dict(); - } - longest_sample_name = d3.max((function() { - var _i, _len, _ref, _results; - _ref = this.sample_names; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - sample = _ref[_i]; - _results.push(sample.length); - } - return _results; - }).call(this)); - this.margin = { - top: 20, - right: 20, - bottom: longest_sample_name * 7, - left: 40 - }; - this.plot_width = this.sample_vals.length * 15 - this.margin.left - this.margin.right; - this.plot_height = 500 - this.margin.top - this.margin.bottom; - this.x_buffer = this.plot_width / 20; - this.y_buffer = this.plot_height / 20; - this.y_min = d3.min(this.sample_vals); - this.y_max = d3.max(this.sample_vals) * 1.1; - this.svg = this.create_svg(); - this.plot_height -= this.y_buffer; - this.create_scales(); - this.create_graph(); - d3.select("#color_attribute").on("change", function() { - var attribute; - attribute = $("#color_attribute").val(); - if ($("#update_bar_chart").html() === 'Sort By Name') { - _this.svg.selectAll(".bar").data(_this.sorted_samples()).transition().duration(1000).style("fill", function(d) { - if (attribute === "None") { - return "steelblue"; - } else { - return _this.attr_color_dict[attribute][d[2][attribute]]; - } - }).select("title").text(function(d) { - return d[1]; - }); - } else { - _this.svg.selectAll(".bar").data(_this.samples).transition().duration(1000).style("fill", function(d) { - if (attribute === "None") { - return "steelblue"; - } else { - return _this.attr_color_dict[attribute][d[2][attribute]]; - } - }); - } - return _this.add_legend(attribute, _this.distinct_attr_vals[attribute]); - }); - d3.select("#update_bar_chart").on("click", function() { - var attribute, sortItems, sorted_sample_names, x_scale; - if (_this.attributes.length > 0) { - attribute = $("#color_attribute").val(); - } - if ($("#update_bar_chart").html() === 'Sort By Value') { - $("#update_bar_chart").html('Sort By Name'); - sortItems = function(a, b) { - return a[1] - b[1]; - }; - _this.svg.selectAll(".bar").data(_this.sorted_samples()).transition().duration(1000).attr("y", function(d) { - return _this.y_scale(d[1]); - }).attr("height", function(d) { - return _this.plot_height - _this.y_scale(d[1]); - }).style("fill", function(d) { - if (_this.attributes.length > 0) { - return _this.attr_color_dict[attribute][d[2][attribute]]; - } else { - return "steelblue"; - } - }).select("title").text(function(d) { - return d[1]; - }); - sorted_sample_names = (function() { - var _i, _len, _ref, _results; - _ref = this.sorted_samples(); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - sample = _ref[_i]; - _results.push(sample[0]); - } - return _results; - }).call(_this); - x_scale = d3.scale.ordinal().domain(sorted_sample_names).rangeBands([0, _this.plot_width], .1); - $('.x.axis').remove(); - return _this.add_x_axis(x_scale); - } else { - $("#update_bar_chart").html('Sort By Value'); - _this.svg.selectAll(".bar").data(_this.samples).transition().duration(1000).attr("y", function(d) { - return _this.y_scale(d[1]); - }).attr("height", function(d) { - return _this.plot_height - _this.y_scale(d[1]); - }).style("fill", function(d) { - if (_this.attributes.length > 0) { - return _this.attr_color_dict[attribute][d[2][attribute]]; - } else { - return "steelblue"; - } - }).select("title").text(function(d) { - return d[1]; - }); - x_scale = d3.scale.ordinal().domain(_this.sample_names).rangeBands([0, _this.plot_width], .1); - $('.x.axis').remove(); - return _this.add_x_axis(x_scale); - } - }); - d3.select("#color_by_trait").on("click", function() { - return _this.color_by_trait(); - }); - } - - Bar_Chart.prototype.get_attr_color_dict = function() { - var color, color_range, distinct_vals, i, key, this_color_dict, value, _i, _j, _len, _len1, _ref, _results, - _this = this; - this.attr_color_dict = {}; - console.log("distinct_attr_vals:", this.distinct_attr_vals); - _ref = this.distinct_attr_vals; - _results = []; - for (key in _ref) { - if (!__hasProp.call(_ref, key)) continue; - distinct_vals = _ref[key]; - this_color_dict = {}; - if (distinct_vals.length < 10) { - color = d3.scale.category10(); - for (i = _i = 0, _len = distinct_vals.length; _i < _len; i = ++_i) { - value = distinct_vals[i]; - this_color_dict[value] = color(i); - } - } else { - console.log("distinct_values:", distinct_vals); - if (_.every(distinct_vals, function(d) { - if (isNaN(d)) { - return false; - } else { - return true; - } - })) { - color_range = d3.scale.linear().domain([d3.min(distinct_vals), d3.max(distinct_vals)]).range([0, 4]); - for (i = _j = 0, _len1 = distinct_vals.length; _j < _len1; i = ++_j) { - value = distinct_vals[i]; - console.log("color_range(value):", color_range(parseInt(value))); - this_color_dict[value] = d3.rgb("lightblue").darker(color_range(parseInt(value))); - } - } - } - _results.push(this.attr_color_dict[key] = this_color_dict); - } - return _results; - }; - - Bar_Chart.prototype.get_samples = function() { - var attr_vals, attribute, key, sample, _i, _j, _len, _len1, _ref, _ref1; - this.sample_names = (function() { - var _i, _len, _ref, _results; - _ref = this.sample_list; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - sample = _ref[_i]; - if (sample.value !== null) { - _results.push(sample.name); - } - } - return _results; - }).call(this); - this.sample_vals = (function() { - var _i, _len, _ref, _results; - _ref = this.sample_list; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - sample = _ref[_i]; - if (sample.value !== null) { - _results.push(sample.value); - } - } - return _results; - }).call(this); - this.attributes = (function() { - var _results; - _results = []; - for (key in this.sample_list[0]["extra_attributes"]) { - _results.push(key); - } - return _results; - }).call(this); - console.log("attributes:", this.attributes); - this.sample_attr_vals = []; - if (this.attributes.length > 0) { - _ref = this.sample_list; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - sample = _ref[_i]; - attr_vals = {}; - _ref1 = this.attributes; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - attribute = _ref1[_j]; - attr_vals[attribute] = sample["extra_attributes"][attribute]; - } - this.sample_attr_vals.push(attr_vals); - } - } - return this.samples = _.zip(this.sample_names, this.sample_vals, this.sample_attr_vals); - }; - - Bar_Chart.prototype.get_distinct_attr_vals = function() { - var attribute, sample, _i, _len, _ref, _results; - this.distinct_attr_vals = {}; - _ref = this.sample_attr_vals; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - sample = _ref[_i]; - _results.push((function() { - var _ref1, _results1; - _results1 = []; - for (attribute in sample) { - if (!this.distinct_attr_vals[attribute]) { - this.distinct_attr_vals[attribute] = []; - } - if (_ref1 = sample[attribute], __indexOf.call(this.distinct_attr_vals[attribute], _ref1) < 0) { - _results1.push(this.distinct_attr_vals[attribute].push(sample[attribute])); - } else { - _results1.push(void 0); - } - } - return _results1; - }).call(this)); - } - return _results; - }; - - Bar_Chart.prototype.create_svg = function() { - var svg; - svg = d3.select("#bar_chart").append("svg").attr("class", "bar_chart").attr("width", this.plot_width + this.margin.left + this.margin.right).attr("height", this.plot_height + this.margin.top + this.margin.bottom).append("g").attr("transform", "translate(" + this.margin.left + "," + this.margin.top + ")"); - return svg; - }; - - Bar_Chart.prototype.create_scales = function() { - this.x_scale = d3.scale.ordinal().domain(this.sample_names).rangeBands([0, this.plot_width], .1); - return this.y_scale = d3.scale.linear().domain([this.y_min * 0.75, this.y_max]).range([this.plot_height, this.y_buffer]); - }; - - Bar_Chart.prototype.create_graph = function() { - this.add_x_axis(this.x_scale); - this.add_y_axis(); - return this.add_bars(); - }; - - Bar_Chart.prototype.add_x_axis = function(scale) { - var xAxis, - _this = this; - xAxis = d3.svg.axis().scale(scale).orient("bottom"); - return this.svg.append("g").attr("class", "x axis").attr("transform", "translate(0," + this.plot_height + ")").call(xAxis).selectAll("text").style("text-anchor", "end").style("font-size", "12px").attr("dx", "-.8em").attr("dy", "-.3em").attr("transform", function(d) { - return "rotate(-90)"; - }); - }; - - Bar_Chart.prototype.add_y_axis = function() { - var yAxis; - yAxis = d3.svg.axis().scale(this.y_scale).orient("left").ticks(5); - return this.svg.append("g").attr("class", "y axis").call(yAxis).append("text").attr("transform", "rotate(-90)").attr("y", 6).attr("dy", ".71em").style("text-anchor", "end"); - }; - - Bar_Chart.prototype.add_bars = function() { - var _this = this; - return this.svg.selectAll(".bar").data(this.samples).enter().append("rect").style("fill", "steelblue").attr("class", "bar").attr("x", function(d) { - return _this.x_scale(d[0]); - }).attr("width", this.x_scale.rangeBand()).attr("y", function(d) { - return _this.y_scale(d[1]); - }).attr("height", function(d) { - return _this.plot_height - _this.y_scale(d[1]); - }).append("svg:title").text(function(d) { - return d[1]; - }); - }; - - Bar_Chart.prototype.sorted_samples = function() { - var sample_list, sorted, - _this = this; - sample_list = _.zip(this.sample_names, this.sample_vals, this.sample_attr_vals); - sorted = _.sortBy(sample_list, function(sample) { - return sample[1]; - }); - console.log("sorted:", sorted); - return sorted; - }; - - Bar_Chart.prototype.add_legend = function(attribute, distinct_vals) { - var legend, legend_rect, legend_text, - _this = this; - legend = this.svg.append("g").attr("class", "legend").attr("height", 100).attr("width", 100).attr('transform', 'translate(-20,50)'); - legend_rect = legend.selectAll('rect').data(distinct_vals).enter().append("rect").attr("x", this.plot_width - 65).attr("width", 10).attr("height", 10).attr("y", function(d, i) { - return i * 20; - }).style("fill", function(d) { - console.log("TEST:", _this.attr_color_dict[attribute][d]); - return _this.attr_color_dict[attribute][d]; - }); - return legend_text = legend.selectAll('text').data(distinct_vals).enter().append("text").attr("x", this.plot_width - 52).attr("y", function(d, i) { - return i * 20 + 9; - }).text(function(d) { - return d; - }); - }; - - Bar_Chart.prototype.color_by_trait = function() { - var _this = this; - return $('#collections_holder').load('/collections/list #collections_list', function() { - return $.colorbox({ - inline: true, - href: "#collections_holder" - }); - }); - }; - - return Bar_Chart; - - })(); - Box_Plot = (function() { - - function Box_Plot(sample_list, sample_group) { - this.sample_list = sample_list; - this.sample_group = sample_group; - this.get_samples(); - this.margin = { - top: 10, - right: 50, - bottom: 20, - left: 50 - }; - this.plot_width = 200 - this.margin.left - this.margin.right; - this.plot_height = 500 - this.margin.top - this.margin.bottom; - this.min = d3.min(this.sample_vals); - this.max = d3.max(this.sample_vals); - this.svg = this.create_svg(); - this.enter_data(); - } - - Box_Plot.prototype.get_samples = function() { - var sample; - return this.sample_vals = (function() { - var _i, _len, _ref, _results; - _ref = this.sample_list; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - sample = _ref[_i]; - if (sample.value !== null) { - _results.push(sample.value); - } - } - return _results; - }).call(this); - }; - - Box_Plot.prototype.create_svg = function() { - var svg; - svg = d3.box().whiskers(this.inter_quartile_range(1.5)).width(this.plot_width).height(this.plot_height).domain([this.min, this.max]); - return svg; - }; - - Box_Plot.prototype.enter_data = function() { - return d3.select("#box_plot").selectAll("svg").data([this.sample_vals]).enter().append("svg:svg").attr("class", "box").attr("width", this.plot_width).attr("height", this.plot_height).append("svg:g").call(this.svg); - }; - - Box_Plot.prototype.inter_quartile_range = function(k) { - var _this = this; - return function(d, i) { - var inter_quartile_range, j, q1, q3; - console.log("iqr d:", d); - q1 = d.quartiles[0]; - q3 = d.quartiles[2]; - inter_quartile_range = (q3 - q1) * k; - console.log("iqr:", inter_quartile_range); - i = 0; - j = d.length; - console.log("d[-1]:", d[1]); - console.log("q1 - iqr:", q1 - inter_quartile_range); - while (d[i] < q1 - inter_quartile_range) { - i++; - } - while (d[j] > q3 + inter_quartile_range) { - j--; - } - console.log("[i, j]", [i, j]); - return [i, j]; - }; - }; - - return Box_Plot; - - })(); + 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, sample_group_types, sample_lists, show_hide_outliers, stats_mdp_change, update_stat_values; sample_lists = js_data.sample_lists; sample_group_types = js_data.sample_group_types; new Bar_Chart(sample_lists[0]); @@ -546,43 +145,6 @@ } return _results; }; - edit_data_change = function() { - var already_seen, checkbox, checked, name, real_value, row, rows, sample_sets, table, tables, _i, _j, _len, _len1; - already_seen = {}; - sample_sets = { - samples_primary: new Stats([]), - samples_other: new Stats([]), - samples_all: new Stats([]) - }; - console.log("at beginning:", sample_sets); - tables = ['samples_primary', 'samples_other']; - for (_i = 0, _len = tables.length; _i < _len; _i++) { - table = tables[_i]; - rows = $("#" + table).find('tr'); - for (_j = 0, _len1 = rows.length; _j < _len1; _j++) { - row = rows[_j]; - name = $(row).find('.edit_sample_sample_name').html(); - name = $.trim(name); - real_value = $(row).find('.edit_sample_value').val(); - console.log("real_value:", real_value); - checkbox = $(row).find(".edit_sample_checkbox"); - checked = $(checkbox).attr('checked'); - if (checked && is_number(real_value) && real_value !== "") { - console.log("in the iffy if"); - real_value = parseFloat(real_value); - sample_sets[table].add_value(real_value); - console.log("checking name of:", name); - if (!(name in already_seen)) { - console.log("haven't seen"); - sample_sets['samples_all'].add_value(real_value); - already_seen[name] = true; - } - } - } - } - console.log("towards end:", sample_sets); - return update_stat_values(sample_sets); - }; make_table = function() { var header, key, row, row_line, table, the_id, the_rows, value, _i, _len, _ref, _ref1; header = " "; @@ -645,6 +207,43 @@ } return processed; }; + edit_data_change = function() { + var already_seen, checkbox, checked, name, real_value, row, rows, sample_sets, table, tables, _i, _j, _len, _len1; + already_seen = {}; + sample_sets = { + samples_primary: new Stats([]), + samples_other: new Stats([]), + samples_all: new Stats([]) + }; + console.log("at beginning:", sample_sets); + tables = ['samples_primary', 'samples_other']; + for (_i = 0, _len = tables.length; _i < _len; _i++) { + table = tables[_i]; + rows = $("#" + table).find('tr'); + for (_j = 0, _len1 = rows.length; _j < _len1; _j++) { + row = rows[_j]; + name = $(row).find('.edit_sample_sample_name').html(); + name = $.trim(name); + real_value = $(row).find('.edit_sample_value').val(); + console.log("real_value:", real_value); + checkbox = $(row).find(".edit_sample_checkbox"); + checked = $(checkbox).attr('checked'); + if (checked && is_number(real_value) && real_value !== "") { + console.log("in the iffy if"); + real_value = parseFloat(real_value); + sample_sets[table].add_value(real_value); + console.log("checking name of:", name); + if (!(name in already_seen)) { + console.log("haven't seen"); + sample_sets['samples_all'].add_value(real_value); + already_seen[name] = true; + } + } + } + } + console.log("towards end:", sample_sets); + return update_stat_values(sample_sets); + }; show_hide_outliers = function() { var label; console.log("FOOBAR in beginning of show_hide_outliers"); diff --git a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee index 3c995441..8571753e 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee +++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee @@ -52,6 +52,32 @@ $ -> ) return false + $("#interval_mapping_compute").click(() => + $("#progress_bar_container").modal() + url = "/interval_mapping" + form_data = $('#trait_data_form').serialize() + console.log("form_data is:", form_data) + $.ajax( + type: "POST" + url: url + data: form_data + error: (xhr, ajaxOptions, thrownError) => + alert("Sorry, an error occurred") + console.log(xhr) + clearInterval(this.my_timer) + $('#progress_bar_container').modal('hide') + $("body").html("We got an error.") + success: (data) => + clearInterval(this.my_timer) + $('#progress_bar_container').modal('hide') + $("body").html(data) + ) + console.log("settingInterval") + + this.my_timer = setInterval(get_progress, 1000) + return false + ) + $('#suggestive').hide() $('input[name=display_all]').change(() => diff --git a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js index b309b167..1153b8ef 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js +++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js @@ -62,6 +62,33 @@ }); return false; }; + $("#interval_mapping_compute").click(function() { + var form_data, url; + $("#progress_bar_container").modal(); + url = "/interval_mapping"; + form_data = $('#trait_data_form').serialize(); + console.log("form_data is:", form_data); + $.ajax({ + type: "POST", + url: url, + data: form_data, + error: function(xhr, ajaxOptions, thrownError) { + alert("Sorry, an error occurred"); + console.log(xhr); + clearInterval(_this.my_timer); + $('#progress_bar_container').modal('hide'); + return $("body").html("We got an error."); + }, + success: function(data) { + clearInterval(_this.my_timer); + $('#progress_bar_container').modal('hide'); + return $("body").html(data); + } + }); + console.log("settingInterval"); + _this.my_timer = setInterval(get_progress, 1000); + return false; + }); $('#suggestive').hide(); $('input[name=display_all]').change(function() { console.log("check"); diff --git a/wqflask/wqflask/templates/show_trait.html b/wqflask/wqflask/templates/show_trait.html index 8a19e07b..91e6df42 100644 --- a/wqflask/wqflask/templates/show_trait.html +++ b/wqflask/wqflask/templates/show_trait.html @@ -56,6 +56,7 @@ + diff --git a/wqflask/wqflask/templates/show_trait_mapping_tools.html b/wqflask/wqflask/templates/show_trait_mapping_tools.html index c2d5211f..00301d39 100644 --- a/wqflask/wqflask/templates/show_trait_mapping_tools.html +++ b/wqflask/wqflask/templates/show_trait_mapping_tools.html @@ -30,7 +30,7 @@
- +
@@ -85,7 +85,8 @@
-
-
+
diff --git a/wqflask/wqflask/user_manager.py b/wqflask/wqflask/user_manager.py index 768415b5..1d0d9846 100644 --- a/wqflask/wqflask/user_manager.py +++ b/wqflask/wqflask/user_manager.py @@ -49,7 +49,8 @@ from utility import Bunch, Struct from base.data_set import create_datasets_list - +THREE_DAYS = 60 * 60 * 24 * 3 +#THREE_DAYS = 45 def timestamp(): return datetime.datetime.utcnow().isoformat() @@ -74,6 +75,27 @@ class UserSession(object): print("self.redis_key is:", self.redis_key) self.session_id = session_id self.record = Redis.hgetall(self.redis_key) + + + if not self.record: + # This will occur, for example, when the browser has been left open over a long + # weekend and the site hasn't been visited by the user + self.logged_in = False + + ########### Grrr...this won't work because of the way flask handles cookies + # Delete the cookie + #response = make_response(redirect(url_for('login'))) + #response.set_cookie(self.cookie_name, '', expires=0) + #flash( + # "Due to inactivity your session has expired. If you'd like please login again.") + #return response + return + + if Redis.ttl(self.redis_key) < THREE_DAYS: + # (Almost) everytime the user does something we extend the session_id in Redis... + print("Extending ttl...") + Redis.expire(self.redis_key, THREE_DAYS) + print("record is:", self.record) self.logged_in = True @@ -225,8 +247,8 @@ class VerificationEmail(object): ) Redis.set(key, data) - two_days = 60 * 60 * 24 * 2 - Redis.expire(key, two_days) + #two_days = 60 * 60 * 24 * 2 + Redis.expire(key, THREE_DAYS) to = user.email_address subject = self.subject body = render_template(self.template_name, @@ -415,7 +437,7 @@ class LoginUser(object): if self.remember_me: expire_time = self.remember_time else: - expire_time = 60 * 60 * 24 * 2 # two days + expire_time = THREE_DAYS Redis.expire(key, expire_time) db_session.add(login_rec) db_session.commit() diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index b2f08ca0..50161d41 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -32,7 +32,7 @@ from base.data_set import create_datasets_list from wqflask.show_trait import show_trait from wqflask.show_trait import export_trait_data from wqflask.marker_regression import marker_regression -#from wqflask.interval_mapping import interval_mapping +from wqflask.interval_mapping import interval_mapping from wqflask.correlation import show_corr_results from wqflask.correlation import corr_scatter_plot from utility import temp_data @@ -256,7 +256,11 @@ def interval_mapping_page(): wanted = ( 'trait_id', 'dataset', - 'suggestive' + 'chromosome', + 'num_permutations', + 'do_bootstraps', + 'default_control_locus', + 'control_locus' ) start_vars = {} @@ -308,10 +312,10 @@ def corr_scatter_plot_page(): indent=" ") return render_template("corr_scatter_plot.html", **template_vars.__dict__) -@app.route("/int_mapping", methods=('POST',)) -def interval_mapping_page(): - template_vars = interval_mapping.IntervalMapping(request.args) - return render_template("interval_mapping.html", **template_vars.__dict__) +#@app.route("/int_mapping", methods=('POST',)) +#def interval_mapping_page(): +# template_vars = interval_mapping.IntervalMapping(request.args) +# return render_template("interval_mapping.html", **template_vars.__dict__) # Todo: Can we simplify this? -Sam def sharing_info_page(): -- cgit v1.2.3 From e7142c0785a9680b56d789f1db0a738d6172de55 Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Mon, 25 Nov 2013 22:53:46 +0000 Subject: Got the interval mapping results into a table --- wqflask/base/data_set.py | 12 +- wqflask/base/trait.py | 26 +- wqflask/wqflask/collect.py | 23 +- .../wqflask/interval_mapping/interval_mapping.py | 93 +++++-- .../wqflask/static/new/css/interval_mapping.css | 27 ++ .../wqflask/static/new/javascript/bar_chart.coffee | 7 +- wqflask/wqflask/static/new/javascript/bar_chart.js | 2 +- .../javascript/get_traits_from_collection.coffee | 15 ++ .../new/javascript/get_traits_from_collection.js | 20 ++ .../static/new/javascript/interval_mapping.coffee | 293 +++++++++++++++++++++ .../static/new/javascript/interval_mapping.js | 272 +++++++++++++++++++ .../static/new/javascript/scientific_notation.js | 13 + .../DataTables/js/dataTables.scientific.js | 13 + wqflask/wqflask/templates/base.html | 2 +- wqflask/wqflask/templates/collections/list.html | 11 +- wqflask/wqflask/templates/interval_mapping.html | 104 ++++++++ wqflask/wqflask/templates/show_trait.html | 1 + .../templates/show_trait_mapping_tools.html | 1 + wqflask/wqflask/views.py | 13 +- 19 files changed, 890 insertions(+), 58 deletions(-) create mode 100644 wqflask/wqflask/static/new/css/interval_mapping.css create mode 100644 wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee create mode 100644 wqflask/wqflask/static/new/javascript/get_traits_from_collection.js create mode 100644 wqflask/wqflask/static/new/javascript/interval_mapping.coffee create mode 100644 wqflask/wqflask/static/new/javascript/interval_mapping.js create mode 100644 wqflask/wqflask/static/new/javascript/scientific_notation.js create mode 100644 wqflask/wqflask/static/new/packages/DataTables/js/dataTables.scientific.js create mode 100644 wqflask/wqflask/templates/interval_mapping.html diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py index cd8c1ac1..8296adea 100755 --- a/wqflask/base/data_set.py +++ b/wqflask/base/data_set.py @@ -318,12 +318,17 @@ class DatasetGroup(object): #determine default genotype object if self.incparentsf1 and genotype_1.type != "intercross": - self.genotype = genotype_2 + #self.genotype = genotype_2 + genotype = genotype_2 else: self.incparentsf1 = 0 - self.genotype = genotype_1 + #self.genotype = genotype_1 + genotype = genotype_1 - self.samplelist = list(self.genotype.prgy) + #self.samplelist = list(self.genotype.prgy) + self.samplelist = list(genotype.prgy) + + return genotype #class DataSets(object): @@ -1084,6 +1089,7 @@ class MrnaAssayDataSet(DataSet): Strain.Name """ % (escape(trait), escape(self.name)) results = g.db.execute(query).fetchall() + print("RETRIEVED RESULTS HERE:", results) return results diff --git a/wqflask/base/trait.py b/wqflask/base/trait.py index 731f99eb..74bc07bb 100755 --- a/wqflask/base/trait.py +++ b/wqflask/base/trait.py @@ -154,7 +154,7 @@ class GeneralTrait(object): result.append(None) return result - def export_informative(self, incVar=0): + def export_informative(self, include_variance=0): """ export informative sample mostly used in qtl regression @@ -163,12 +163,12 @@ class GeneralTrait(object): samples = [] vals = [] the_vars = [] - for sample, value in self.data.items(): - if value.val != None: - if not incVar or value.var != None: - samples.append(sample) - vals.append(value.val) - the_vars.append(value.var) + for sample_name, sample_data in self.data.items(): + if sample_data.value != None: + if not include_variance or sample_data.variance != None: + samples.append(sample_name) + vals.append(sample_data.value) + the_vars.append(sample_data.variance) return samples, vals, the_vars @@ -235,11 +235,19 @@ class GeneralTrait(object): # Todo: is this necessary? If not remove self.data.clear() + if self.dataset.group.parlist: + all_samples_ordered = (self.dataset.group.parlist + + self.dataset.group.f1list + + self.dataset.group.samplelist) + elif self.dataset.group.f1list: + all_samples_ordered = self.dataset.group.f1list + self.dataset.group.samplelist + else: + all_samples_ordered = self.dataset.group.samplelist + if results: for item in results: - #name, value, variance, num_cases = item + name, value, variance, num_cases = item if not samplelist or (samplelist and name in samplelist): - name = item[0] self.data[name] = webqtlCaseData(*item) #name, value, variance, num_cases) #def keys(self): diff --git a/wqflask/wqflask/collect.py b/wqflask/wqflask/collect.py index ef7b37df..991d281c 100644 --- a/wqflask/wqflask/collect.py +++ b/wqflask/wqflask/collect.py @@ -23,7 +23,7 @@ Redis = redis.StrictRedis() from flask import (Flask, g, render_template, url_for, request, make_response, - redirect, flash) + redirect, flash, jsonify) from wqflask import app @@ -122,16 +122,18 @@ def create_new(): @app.route("/collections/list") def list_collections(): + params = request.args user_collections = g.user_session.user_ob.user_collections return render_template("collections/list.html", + params = params, user_collections = user_collections, ) - @app.route("/collections/view") def view_collection(): params = request.args + print("params in view collection:", params) uc_id = params['uc_id'] uc = model.UserCollection.query.get(uc_id) traits = json.loads(uc.members) @@ -139,6 +141,7 @@ def view_collection(): print("in view_collection traits are:", traits) trait_obs = [] + json_version = [] for atrait in traits: name, dataset_name = atrait.split(':') @@ -146,8 +149,16 @@ def view_collection(): trait_ob = trait.GeneralTrait(name=name, dataset_name=dataset_name) trait_ob.get_info() trait_obs.append(trait_ob) - - return render_template("collections/view.html", - trait_obs=trait_obs, - uc = uc, + + json_version.append(dict(name=trait_ob.name)) + #dis=trait_ob.description)) + + collection_info = dict(trait_obs=trait_obs, + uc = uc) + if "json" in params: + print("json_version:", json_version) + return json.dumps(json_version) + else: + return render_template("collections/view.html", + **collection_info ) diff --git a/wqflask/wqflask/interval_mapping/interval_mapping.py b/wqflask/wqflask/interval_mapping/interval_mapping.py index f41ebd2c..de7a2704 100755 --- a/wqflask/wqflask/interval_mapping/interval_mapping.py +++ b/wqflask/wqflask/interval_mapping/interval_mapping.py @@ -64,10 +64,12 @@ class IntervalMapping(object): for key in self.species.chromosomes.chromosomes.keys(): chromosome_mb_lengths[key] = self.species.chromosomes.chromosomes[key].mb_length + #print("self.qtl_results:", self.qtl_results) + self.js_data = dict( - lrs_lod = self.lrs_lod, chromosomes = chromosome_mb_lengths, qtl_results = self.qtl_results, + #lrs_lod = self.lrs_lod, ) def set_options(self, start_vars): @@ -76,10 +78,13 @@ class IntervalMapping(object): #self.plot_scale = start_vars['scale'] #if self.plotScale == 'physic' and not fd.genotype.Mbmap: # self.plotScale = 'morgan' - self.num_permutations = start_vars['num_permutations'] + self.num_permutations = int(start_vars['num_permutations']) #self.do_bootstrap = start_vars['do_bootstrap'] - #self.control_locus = start_vars['control_locus'] self.selected_chr = start_vars['chromosome'] + if 'control_locus' in start_vars: + self.control_locus = start_vars['control_locus'] + else: + self.control_locus = None #self.weighted_regression = start_vars['weighted'] #self.lrs_lod = start_vars['lrs_lod'] @@ -88,40 +93,76 @@ class IntervalMapping(object): """Generates qtl results for plotting interval map""" self.dataset.group.get_markers() - self.dataset.group.read_genotype_file() + genotype = self.dataset.group.read_genotype_file() samples, values, variances = self.this_trait.export_informative() + + trimmed_samples = [] + trimmed_values = [] + for i in range(0, len(samples)): + if samples[i] in self.dataset.group.samplelist: + trimmed_samples.append(samples[i]) + trimmed_values.append(values[i]) + + #if self.weighted_regression: + # self.lrs_array = self.genotype.permutation(strains = trimmed_samples, + # trait = trimmed_values, + # variance = _vars, + # nperm=self.num_permutations) + #else: + self.lrs_array = genotype.permutation(strains = trimmed_samples, + trait = trimmed_values, + nperm= self.num_permutations) + self.suggestive = self.lrs_array[int(self.num_permutations*0.37-1)] + self.significant = self.lrs_array[int(self.num_permutations*0.95-1)] + + print("samples:", trimmed_samples) + if self.control_locus: - if self.weighted_regression: - self.qtl_results = self.dataset.genotype.regression(strains = samples, - trait = values, - variance = variances, - control = self.control_locus) - else: - self.qtl_results = self.dataset.genotype.regression(strains = samples, - trait = values, - control = self.control_locus) + #if self.weighted_regression: + # self.qtl_results = self.dataset.genotype.regression(strains = samples, + # trait = values, + # variance = variances, + # control = self.control_locus) + #else: + #reaper_results = self.dataset.group.genotype.regression(strains = trimmed_samples, + # trait = trimmed_values, + # control = self.control_locus) + reaper_results = genotype.regression(strains = trimmed_samples, + trait = trimmed_values, + control = self.control_locus) else: - if self.weighted_regression: - self.qtl_results = self.dataset.genotype.regression(strains = samples, - trait = values, - variance = variances) - else: - self.qtl_results = self.dataset.genotype.regression(strains = samples, - trait = values) + #if self.weighted_regression: + # self.qtl_results = self.dataset.genotype.regression(strains = samples, + # trait = values, + # variance = variances) + #else: + print("strains:", trimmed_samples) + print("trait:", trimmed_values) + #reaper_results = self.dataset.group.genotype.regression(strains = trimmed_samples, + # trait = trimmed_values) + reaper_results = genotype.regression(strains = trimmed_samples, + trait = trimmed_values) + #Need to convert the QTL objects that qtl reaper returns into a json serializable dictionary + self.qtl_results = [] + for qtl in reaper_results: + reaper_locus = qtl.locus + locus = {"name":reaper_locus.name, "chr":reaper_locus.chr, "cM":reaper_locus.cM, "Mb":reaper_locus.Mb} + qtl = {"lrs": qtl.lrs, "locus": locus, "additive": qtl.additive} + self.qtl_results.append(qtl) #pheno_vector = np.array([val == "x" and np.nan or float(val) for val in self.vals]) #if self.dataset.group.species == "human": # p_values, t_stats = self.gen_human_results(pheno_vector, tempdata) #else: - genotype_data = [marker['genotypes'] for marker in self.dataset.group.markers.markers] - - no_val_samples = self.identify_empty_samples() - trimmed_genotype_data = self.trim_genotypes(genotype_data, no_val_samples) - - genotype_matrix = np.array(trimmed_genotype_data).T + #genotype_data = [marker['genotypes'] for marker in self.dataset.group.markers.markers] + # + #no_val_samples = self.identify_empty_samples() + #trimmed_genotype_data = self.trim_genotypes(genotype_data, no_val_samples) + # + #genotype_matrix = np.array(trimmed_genotype_data).T #t_stats, p_values = lmm.run( # pheno_vector, diff --git a/wqflask/wqflask/static/new/css/interval_mapping.css b/wqflask/wqflask/static/new/css/interval_mapping.css new file mode 100644 index 00000000..9d23ba25 --- /dev/null +++ b/wqflask/wqflask/static/new/css/interval_mapping.css @@ -0,0 +1,27 @@ +.manhattan_plot .y_axis path, +.manhattan_plot .y_axis line { + fill: none; + stroke: black; + shape-rendering: crispEdges; +} +.manhattan_plot .y_axis text { + font-family: sans-serif; + font-size: 14px; +} + +.manhattan_plot .x_axis path, +.manhattan_plot .x_axis line { + fill: none; + stroke: black; + shape-rendering: crispEdges; +} +.manhattan_plot .x_axis text { + text-anchor: end; + font-family: sans-serif; + font-size: 8px; +} + +rect { + stroke: WhiteSmoke; + fill: lightgrey; +} \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.coffee b/wqflask/wqflask/static/new/javascript/bar_chart.coffee index 2c60d3ab..4921b55e 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.coffee +++ b/wqflask/wqflask/static/new/javascript/bar_chart.coffee @@ -276,7 +276,7 @@ class Bar_Chart .attr("height", 100) .attr("width", 100) .attr('transform', 'translate(-20,50)') - + legend_rect = legend.selectAll('rect') .data(distinct_vals) .enter() @@ -305,13 +305,12 @@ class Bar_Chart ) color_by_trait: () -> - $('#collections_holder').load('/collections/list #collections_list', => + $('#collections_holder').load('/collections/list?color_by_trait #collections_list', => $.colorbox( inline: true href: "#collections_holder" ) ) - - + root.Bar_Chart = Bar_Chart \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.js b/wqflask/wqflask/static/new/javascript/bar_chart.js index 03902741..9c2059c0 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.js +++ b/wqflask/wqflask/static/new/javascript/bar_chart.js @@ -322,7 +322,7 @@ Bar_Chart.prototype.color_by_trait = function() { var _this = this; - return $('#collections_holder').load('/collections/list #collections_list', function() { + return $('#collections_holder').load('/collections/list?color_by_trait #collections_list', function() { return $.colorbox({ inline: true, href: "#collections_holder" diff --git a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee new file mode 100644 index 00000000..6854dda5 --- /dev/null +++ b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee @@ -0,0 +1,15 @@ + +console.log("before get_traits_from_collection") + + +collection_hover = () -> + console.log("Hovering over:", $(this)) + this_collection_url = $(this).find('.collection_name').prop("href") + this_collection_url += "&json" + console.log("this_collection_url", this_collection_url) + +$ -> + console.log("inside get_traits_from_collection") + $(document).on("mouseover", ".collection_line", collection_hover) + + \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js new file mode 100644 index 00000000..9ef31088 --- /dev/null +++ b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js @@ -0,0 +1,20 @@ +// Generated by CoffeeScript 1.6.1 +(function() { + var collection_hover; + + console.log("before get_traits_from_collection"); + + collection_hover = function() { + var this_collection_url; + console.log("Hovering over:", $(this)); + this_collection_url = $(this).find('.collection_name').prop("href"); + this_collection_url += "&json"; + return console.log("this_collection_url", this_collection_url); + }; + + $(function() { + console.log("inside get_traits_from_collection"); + return $(document).on("mouseover", ".collection_line", collection_hover); + }); + +}).call(this); diff --git a/wqflask/wqflask/static/new/javascript/interval_mapping.coffee b/wqflask/wqflask/static/new/javascript/interval_mapping.coffee new file mode 100644 index 00000000..78265f27 --- /dev/null +++ b/wqflask/wqflask/static/new/javascript/interval_mapping.coffee @@ -0,0 +1,293 @@ +$ -> + + class Interval_Map + constructor: (@plot_height, @plot_width) -> + @qtl_results = js_data.qtl_results + console.log("qtl_results are:", @qtl_results) + @chromosomes = js_data.chromosomes + + @total_length = 0 + + @max_chr = @get_max_chr() + + @x_coords = [] + @y_coords = [] + @marker_names = [] + console.time('Create coordinates') + @create_coordinates() + console.log("@x_coords: ", @x_coords) + console.log("@y_coords: ", @y_coords) + console.timeEnd('Create coordinates') + [@chr_lengths, @cumulative_chr_lengths] = @get_chr_lengths() + + # Buffer to allow for the ticks/labels to be drawn + @x_buffer = @plot_width/30 + @y_buffer = @plot_height/20 + + #@x_max = d3.max(@x_coords) + @x_max = @total_length + console.log("@x_max: ", @x_max) + console.log("@x_buffer: ", @x_buffer) + @y_max = d3.max(@y_coords) * 1.2 + + @svg = @create_svg() + @plot_coordinates = _.zip(@x_coords, @y_coords, @marker_names) + + @plot_height -= @y_buffer + @create_scales() + console.time('Create graph') + @create_graph() + console.timeEnd('Create graph') + + get_max_chr: () -> + max_chr = 0 + for result in @qtl_results + chr = parseInt(result.chr) + if not _.isNaN(chr) + if chr > max_chr + max_chr = chr + return max_chr + + get_chr_lengths: () -> + ### + #Gets a list of both individual and cumulative (the position of one on the graph + #is its own length plus the lengths of all preceding chromosomes) lengths in order + #to draw the vertical lines separating chromosomes and the chromosome labels + # + ### + + console.log("@chromosomes: ", @chromosomes) + + cumulative_chr_lengths = [] + chr_lengths = [] + total_length = 0 + for key of @chromosomes + this_length = @chromosomes[key] + chr_lengths.push(this_length) + cumulative_chr_lengths.push(total_length + this_length) + total_length += this_length + + console.log("chr_lengths: ", chr_lengths) + + return [chr_lengths, cumulative_chr_lengths] + + create_coordinates: () -> + chr_lengths = [] + chr_seen = [] + for result in js_data.qtl_results + if result.locus.chr == "X" + chr_length = parseFloat(@chromosomes[20]) + else + chr_length = parseFloat(@chromosomes[result.locus.chr]) + if not(result.locus.chr in chr_seen) + chr_seen.push(result.locus.chr) + chr_lengths.push(chr_length) + if result.locus.chr != "1" + @total_length += parseFloat(chr_lengths[chr_lengths.length - 2]) + @x_coords.push(@total_length + parseFloat(result.locus.Mb)) + @y_coords.push(result.lrs) + @marker_names.push(result.locus.name) + @total_length += parseFloat(chr_lengths[chr_lengths.length-1]) + #console.log("chr_lengths: ", chr_lengths) + + create_svg: () -> + svg = d3.select("#interval_map") + .append("svg") + .attr("class", "interval_map") + .attr("width", @plot_width+@x_buffer) + .attr("height", @plot_height+@y_buffer) + + return svg + + create_graph: () -> + @add_border() + @add_x_axis() + @add_y_axis() + @add_chr_lines() + @fill_chr_areas() + @add_chr_labels() + @connect_markers() + + add_border: () -> + border_coords = [[@y_buffer, @plot_height, @x_buffer, @x_buffer], + [@y_buffer, @plot_height, @plot_width, @plot_width], + [@y_buffer, @y_buffer, @x_buffer, @plot_width], + [@plot_height, @plot_height, @x_buffer, @plot_width]] + + @svg.selectAll("line") + .data(border_coords) + .enter() + .append("line") + .attr("y1", (d) => + return d[0] + ) + .attr("y2", (d) => + return d[1] + ) + .attr("x1", (d) => + return d[2] + ) + .attr("x2", (d) => + return d[3] + ) + .style("stroke", "#000") + + create_scales: () -> + @x_scale = d3.scale.linear() + .domain([0, d3.max(@x_coords)]) + .range([@x_buffer, @plot_width]) + + @y_scale = d3.scale.linear() + .domain([0, @y_max]) + .range([@plot_height, @y_buffer]) + + create_x_axis_tick_values: () -> + tick_vals = [] + for val in [25..@cumulative_chr_lengths[0]] when val%25 == 0 + tick_vals.push(val) + + for length, i in @cumulative_chr_lengths + if i == 0 + continue + chr_ticks = [] + tick_count = Math.floor(@chr_lengths[i]/25) + tick_val = parseInt(@cumulative_chr_lengths[i-1]) + for tick in [0..(tick_count-1)] + tick_val += 25 + chr_ticks.push(tick_val) + Array::push.apply tick_vals, chr_ticks + + #console.log("tick_vals:", tick_vals) + return tick_vals + + add_x_axis: () -> + xAxis = d3.svg.axis() + .scale(@x_scale) + .orient("bottom") + .tickValues(@create_x_axis_tick_values()) + + next_chr = 1 + tmp_tick_val = 0 + xAxis.tickFormat((d) => + d3.format("d") #format as integer + if d < @cumulative_chr_lengths[0] + tick_val = d + else + next_chr_length = @cumulative_chr_lengths[next_chr] + if d > next_chr_length + next_chr += 1 + tmp_tick_val = 25 + tick_val = tmp_tick_val + else + tmp_tick_val += 25 + tick_val = tmp_tick_val + return (tick_val) + ) + + @svg.append("g") + .attr("class", "x_axis") + .attr("transform", "translate(0," + @plot_height + ")") + .call(xAxis) + .selectAll("text") + .attr("text-anchor", "right") + .attr("dx", "-1.6em") + .attr("transform", (d) => + return "translate(-12,0) rotate(-90)" + ) + #.attr("dy", "-1.0em") + + + add_y_axis: () -> + yAxis = d3.svg.axis() + .scale(@y_scale) + .orient("left") + .ticks(5) + + @svg.append("g") + .attr("class", "y_axis") + .attr("transform", "translate(" + @x_buffer + ",0)") + .call(yAxis) + + add_chr_lines: () -> + @svg.selectAll("line") + .data(@cumulative_chr_lengths, (d) => + return d + ) + .enter() + .append("line") + .attr("x1", @x_scale) + .attr("x2", @x_scale) + .attr("y1", @y_buffer) + .attr("y2", @plot_height) + .style("stroke", "#ccc") + + fill_chr_areas: () -> + @svg.selectAll("rect.chr_fill_area_1") + .data(_.zip(@chr_lengths, @cumulative_chr_lengths), (d) => + return d + ) + .enter() + .append("rect") + .attr("class", "chr_fill_area_1") + .attr("x", (d, i) => + if i == 0 + return @x_scale(0) + else + return @x_scale(@cumulative_chr_lengths[i-1]) + ) + .attr("y", @y_buffer) + .attr("width", (d) => + return @x_scale(d[0]) + ) + .attr("height", @plot_height-@y_buffer) + + add_chr_labels: () -> + chr_names = [] + for key of @chromosomes + chr_names.push(key) + chr_info = _.zip(chr_names, @chr_lengths, @cumulative_chr_lengths) + @svg.selectAll("text") + .data(chr_info, (d) => + return d + ) + .enter() + .append("text") + .text((d) => + return d[0] + ) + .attr("x", (d) => + return @x_scale(d[2] - d[1]/2) + ) + .attr("y", @plot_height * 0.1) + .attr("dx", "0em") + .attr("text-anchor", "middle") + .attr("font-family", "sans-serif") + .attr("font-size", "18px") + .attr("fill", "grey") + + connect_markers: () -> + @svg.selectAll("path") + .data(@plot_coordinates) + .enter() + .attr("x1", (d, i) => + if i == 0 + return @x_buffer + else + return parseFloat(@x_buffer) + ((parseFloat(@plot_width)-parseFloat(@x_buffer)) * @plot_coordinates[i-1][0]/parseFloat(@x_max)) + ) + .attr("y1", (d, i) => + if i == 0 + return @plot_height + else + return @plot_height - ((@plot_height-@y_buffer) * @plot_coordinates[i-1][1]/@y_max) + ) + .attr("x2", (d) => + return parseFloat(@x_buffer) + ((parseFloat(@plot_width)-parseFloat(@x_buffer)) * d[0]/parseFloat(@x_max)) + ) + .attr("y2", (d) => + return @plot_height - ((@plot_height-@y_buffer) * d[1]/@y_max) + ) + + console.time('Create manhattan plot') + new Interval_Map(600, 1200) + console.timeEnd('Create manhattan plot') \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/interval_mapping.js b/wqflask/wqflask/static/new/javascript/interval_mapping.js new file mode 100644 index 00000000..5ae8ffab --- /dev/null +++ b/wqflask/wqflask/static/new/javascript/interval_mapping.js @@ -0,0 +1,272 @@ +// Generated by CoffeeScript 1.6.1 +(function() { + var __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + $(function() { + var Interval_Map; + Interval_Map = (function() { + + function Interval_Map(plot_height, plot_width) { + var _ref; + this.plot_height = plot_height; + this.plot_width = plot_width; + this.qtl_results = js_data.qtl_results; + console.log("qtl_results are:", this.qtl_results); + this.chromosomes = js_data.chromosomes; + this.total_length = 0; + this.max_chr = this.get_max_chr(); + this.x_coords = []; + this.y_coords = []; + this.marker_names = []; + console.time('Create coordinates'); + this.create_coordinates(); + console.log("@x_coords: ", this.x_coords); + console.log("@y_coords: ", this.y_coords); + console.timeEnd('Create coordinates'); + _ref = this.get_chr_lengths(), this.chr_lengths = _ref[0], this.cumulative_chr_lengths = _ref[1]; + this.x_buffer = this.plot_width / 30; + this.y_buffer = this.plot_height / 20; + this.x_max = this.total_length; + console.log("@x_max: ", this.x_max); + console.log("@x_buffer: ", this.x_buffer); + this.y_max = d3.max(this.y_coords) * 1.2; + this.svg = this.create_svg(); + this.plot_coordinates = _.zip(this.x_coords, this.y_coords, this.marker_names); + this.plot_height -= this.y_buffer; + this.create_scales(); + console.time('Create graph'); + this.create_graph(); + console.timeEnd('Create graph'); + } + + Interval_Map.prototype.get_max_chr = function() { + var chr, max_chr, result, _i, _len, _ref; + max_chr = 0; + _ref = this.qtl_results; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + result = _ref[_i]; + chr = parseInt(result.chr); + if (!_.isNaN(chr)) { + if (chr > max_chr) { + max_chr = chr; + } + } + } + return max_chr; + }; + + Interval_Map.prototype.get_chr_lengths = function() { + /* + #Gets a list of both individual and cumulative (the position of one on the graph + #is its own length plus the lengths of all preceding chromosomes) lengths in order + #to draw the vertical lines separating chromosomes and the chromosome labels + # + */ + + var chr_lengths, cumulative_chr_lengths, key, this_length, total_length; + console.log("@chromosomes: ", this.chromosomes); + cumulative_chr_lengths = []; + chr_lengths = []; + total_length = 0; + for (key in this.chromosomes) { + this_length = this.chromosomes[key]; + chr_lengths.push(this_length); + cumulative_chr_lengths.push(total_length + this_length); + total_length += this_length; + } + console.log("chr_lengths: ", chr_lengths); + return [chr_lengths, cumulative_chr_lengths]; + }; + + Interval_Map.prototype.create_coordinates = function() { + var chr_length, chr_lengths, chr_seen, result, _i, _len, _ref, _ref1; + chr_lengths = []; + chr_seen = []; + _ref = js_data.qtl_results; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + result = _ref[_i]; + if (result.locus.chr === "X") { + chr_length = parseFloat(this.chromosomes[20]); + } else { + chr_length = parseFloat(this.chromosomes[result.locus.chr]); + } + if (!(_ref1 = result.locus.chr, __indexOf.call(chr_seen, _ref1) >= 0)) { + chr_seen.push(result.locus.chr); + chr_lengths.push(chr_length); + if (result.locus.chr !== "1") { + this.total_length += parseFloat(chr_lengths[chr_lengths.length - 2]); + } + } + this.x_coords.push(this.total_length + parseFloat(result.locus.Mb)); + this.y_coords.push(result.lrs); + this.marker_names.push(result.locus.name); + } + return this.total_length += parseFloat(chr_lengths[chr_lengths.length - 1]); + }; + + Interval_Map.prototype.create_svg = function() { + var svg; + svg = d3.select("#interval_map").append("svg").attr("class", "interval_map").attr("width", this.plot_width + this.x_buffer).attr("height", this.plot_height + this.y_buffer); + return svg; + }; + + Interval_Map.prototype.create_graph = function() { + this.add_border(); + this.add_x_axis(); + this.add_y_axis(); + this.add_chr_lines(); + this.fill_chr_areas(); + this.add_chr_labels(); + return this.connect_markers(); + }; + + Interval_Map.prototype.add_border = function() { + var border_coords, + _this = this; + border_coords = [[this.y_buffer, this.plot_height, this.x_buffer, this.x_buffer], [this.y_buffer, this.plot_height, this.plot_width, this.plot_width], [this.y_buffer, this.y_buffer, this.x_buffer, this.plot_width], [this.plot_height, this.plot_height, this.x_buffer, this.plot_width]]; + return this.svg.selectAll("line").data(border_coords).enter().append("line").attr("y1", function(d) { + return d[0]; + }).attr("y2", function(d) { + return d[1]; + }).attr("x1", function(d) { + return d[2]; + }).attr("x2", function(d) { + return d[3]; + }).style("stroke", "#000"); + }; + + Interval_Map.prototype.create_scales = function() { + this.x_scale = d3.scale.linear().domain([0, d3.max(this.x_coords)]).range([this.x_buffer, this.plot_width]); + return this.y_scale = d3.scale.linear().domain([0, this.y_max]).range([this.plot_height, this.y_buffer]); + }; + + Interval_Map.prototype.create_x_axis_tick_values = function() { + var chr_ticks, i, length, tick, tick_count, tick_val, tick_vals, val, _i, _j, _k, _len, _ref, _ref1, _ref2; + tick_vals = []; + for (val = _i = 25, _ref = this.cumulative_chr_lengths[0]; 25 <= _ref ? _i <= _ref : _i >= _ref; val = 25 <= _ref ? ++_i : --_i) { + if (val % 25 === 0) { + tick_vals.push(val); + } + } + _ref1 = this.cumulative_chr_lengths; + for (i = _j = 0, _len = _ref1.length; _j < _len; i = ++_j) { + length = _ref1[i]; + if (i === 0) { + continue; + } + chr_ticks = []; + tick_count = Math.floor(this.chr_lengths[i] / 25); + tick_val = parseInt(this.cumulative_chr_lengths[i - 1]); + for (tick = _k = 0, _ref2 = tick_count - 1; 0 <= _ref2 ? _k <= _ref2 : _k >= _ref2; tick = 0 <= _ref2 ? ++_k : --_k) { + tick_val += 25; + chr_ticks.push(tick_val); + } + Array.prototype.push.apply(tick_vals, chr_ticks); + } + return tick_vals; + }; + + Interval_Map.prototype.add_x_axis = function() { + var next_chr, tmp_tick_val, xAxis, + _this = this; + xAxis = d3.svg.axis().scale(this.x_scale).orient("bottom").tickValues(this.create_x_axis_tick_values()); + next_chr = 1; + tmp_tick_val = 0; + xAxis.tickFormat(function(d) { + var next_chr_length, tick_val; + d3.format("d"); + if (d < _this.cumulative_chr_lengths[0]) { + tick_val = d; + } else { + next_chr_length = _this.cumulative_chr_lengths[next_chr]; + if (d > next_chr_length) { + next_chr += 1; + tmp_tick_val = 25; + tick_val = tmp_tick_val; + } else { + tmp_tick_val += 25; + tick_val = tmp_tick_val; + } + } + return tick_val; + }); + return this.svg.append("g").attr("class", "x_axis").attr("transform", "translate(0," + this.plot_height + ")").call(xAxis).selectAll("text").attr("text-anchor", "right").attr("dx", "-1.6em").attr("transform", function(d) { + return "translate(-12,0) rotate(-90)"; + }); + }; + + Interval_Map.prototype.add_y_axis = function() { + var yAxis; + yAxis = d3.svg.axis().scale(this.y_scale).orient("left").ticks(5); + return this.svg.append("g").attr("class", "y_axis").attr("transform", "translate(" + this.x_buffer + ",0)").call(yAxis); + }; + + Interval_Map.prototype.add_chr_lines = function() { + var _this = this; + return this.svg.selectAll("line").data(this.cumulative_chr_lengths, function(d) { + return d; + }).enter().append("line").attr("x1", this.x_scale).attr("x2", this.x_scale).attr("y1", this.y_buffer).attr("y2", this.plot_height).style("stroke", "#ccc"); + }; + + Interval_Map.prototype.fill_chr_areas = function() { + var _this = this; + return this.svg.selectAll("rect.chr_fill_area_1").data(_.zip(this.chr_lengths, this.cumulative_chr_lengths), function(d) { + return d; + }).enter().append("rect").attr("class", "chr_fill_area_1").attr("x", function(d, i) { + if (i === 0) { + return _this.x_scale(0); + } else { + return _this.x_scale(_this.cumulative_chr_lengths[i - 1]); + } + }).attr("y", this.y_buffer).attr("width", function(d) { + return _this.x_scale(d[0]); + }).attr("height", this.plot_height - this.y_buffer); + }; + + Interval_Map.prototype.add_chr_labels = function() { + var chr_info, chr_names, key, + _this = this; + chr_names = []; + for (key in this.chromosomes) { + chr_names.push(key); + } + chr_info = _.zip(chr_names, this.chr_lengths, this.cumulative_chr_lengths); + return this.svg.selectAll("text").data(chr_info, function(d) { + return d; + }).enter().append("text").text(function(d) { + return d[0]; + }).attr("x", function(d) { + return _this.x_scale(d[2] - d[1] / 2); + }).attr("y", this.plot_height * 0.1).attr("dx", "0em").attr("text-anchor", "middle").attr("font-family", "sans-serif").attr("font-size", "18px").attr("fill", "grey"); + }; + + Interval_Map.prototype.connect_markers = function() { + var _this = this; + return this.svg.selectAll("path").data(this.plot_coordinates).enter().attr("x1", function(d, i) { + if (i === 0) { + return _this.x_buffer; + } else { + return parseFloat(_this.x_buffer) + ((parseFloat(_this.plot_width) - parseFloat(_this.x_buffer)) * _this.plot_coordinates[i - 1][0] / parseFloat(_this.x_max)); + } + }).attr("y1", function(d, i) { + if (i === 0) { + return _this.plot_height; + } else { + return _this.plot_height - ((_this.plot_height - _this.y_buffer) * _this.plot_coordinates[i - 1][1] / _this.y_max); + } + }).attr("x2", function(d) { + return parseFloat(_this.x_buffer) + ((parseFloat(_this.plot_width) - parseFloat(_this.x_buffer)) * d[0] / parseFloat(_this.x_max)); + }).attr("y2", function(d) { + return _this.plot_height - ((_this.plot_height - _this.y_buffer) * d[1] / _this.y_max); + }); + }; + + return Interval_Map; + + })(); + console.time('Create manhattan plot'); + new Interval_Map(600, 1200); + return console.timeEnd('Create manhattan plot'); + }); + +}).call(this); diff --git a/wqflask/wqflask/static/new/javascript/scientific_notation.js b/wqflask/wqflask/static/new/javascript/scientific_notation.js new file mode 100644 index 00000000..82c55fda --- /dev/null +++ b/wqflask/wqflask/static/new/javascript/scientific_notation.js @@ -0,0 +1,13 @@ +jQuery.extend( jQuery.fn.dataTableExt.oSort, { + "scientific-pre": function ( a ) { + return parseFloat(a); + }, + + "scientific-asc": function ( a, b ) { + return ((a < b) ? -1 : ((a > b) ? 1 : 0)); + }, + + "scientific-desc": function ( a, b ) { + return ((a < b) ? 1 : ((a > b) ? -1 : 0)); + } +} ); \ No newline at end of file diff --git a/wqflask/wqflask/static/new/packages/DataTables/js/dataTables.scientific.js b/wqflask/wqflask/static/new/packages/DataTables/js/dataTables.scientific.js new file mode 100644 index 00000000..82c55fda --- /dev/null +++ b/wqflask/wqflask/static/new/packages/DataTables/js/dataTables.scientific.js @@ -0,0 +1,13 @@ +jQuery.extend( jQuery.fn.dataTableExt.oSort, { + "scientific-pre": function ( a ) { + return parseFloat(a); + }, + + "scientific-asc": function ( a, b ) { + return ((a < b) ? -1 : ((a > b) ? 1 : 0)); + }, + + "scientific-desc": function ( a, b ) { + return ((a < b) ? 1 : ((a > b) ? -1 : 0)); + } +} ); \ No newline at end of file diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html index ea6db646..9b98c955 100644 --- a/wqflask/wqflask/templates/base.html +++ b/wqflask/wqflask/templates/base.html @@ -198,7 +198,7 @@
- + + {# endif #} +
@@ -41,10 +46,8 @@ {% endblock %} {% block js %} - - {% endblock %} diff --git a/wqflask/wqflask/templates/interval_mapping.html b/wqflask/wqflask/templates/interval_mapping.html new file mode 100644 index 00000000..25de2dc1 --- /dev/null +++ b/wqflask/wqflask/templates/interval_mapping.html @@ -0,0 +1,104 @@ +{% extends "base.html" %} +{% block title %}Interval Mapping{% endblock %} +{% block css %} + + + + + +{% endblock %} +{% block content %} + + {{ header("Mapping", + '{}: {}'.format(this_trait.name, this_trait.description_fmt)) }} + +
+
+

+ Whole Genome Mapping +

+
+
+ +
+
+

+ Results +

+
+ + + + + + + + + + + + + {% for marker in qtl_results %} + + + + + + + + + {% endfor %} + +
IndexLRS ScoreAdditive EffectChrMbLocus
{{ loop.index }}{{ marker.lrs|float }}{{ marker.additive|float }}{{ marker.locus.chr|int }}{{ marker.locus.Mb|float }}{{ marker.locus.name }}
+ +
+ + + +{% endblock %} + +{% block js %} + + + + + + + + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/wqflask/wqflask/templates/show_trait.html b/wqflask/wqflask/templates/show_trait.html index 91e6df42..ec729e1c 100644 --- a/wqflask/wqflask/templates/show_trait.html +++ b/wqflask/wqflask/templates/show_trait.html @@ -57,6 +57,7 @@ + diff --git a/wqflask/wqflask/templates/show_trait_mapping_tools.html b/wqflask/wqflask/templates/show_trait_mapping_tools.html index 00301d39..a835a41b 100644 --- a/wqflask/wqflask/templates/show_trait_mapping_tools.html +++ b/wqflask/wqflask/templates/show_trait_mapping_tools.html @@ -20,6 +20,7 @@
{% endif %} - - + +
@@ -56,4 +60,5 @@ + \ No newline at end of file -- cgit v1.2.3 From 467502356717c50b6cb3311facca501217092a6f Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Wed, 27 Nov 2013 23:21:51 +0000 Subject: Clicking a trait in "color by trait" now gets all of its sample values that will be used to color the bar graph --- wqflask/base/trait.py | 25 +++++++++++++- .../javascript/get_traits_from_collection.coffee | 39 ++++++++++++++-------- .../new/javascript/get_traits_from_collection.js | 39 ++++++++++++++++------ 3 files changed, 77 insertions(+), 26 deletions(-) diff --git a/wqflask/base/trait.py b/wqflask/base/trait.py index 9e4f0944..712d9af5 100755 --- a/wqflask/base/trait.py +++ b/wqflask/base/trait.py @@ -12,10 +12,13 @@ from base.data_set import create_dataset from dbFunction import webqtlDatabaseFunction from utility import webqtlUtil +from wqflask import app + +import simplejson as json from MySQLdb import escape_string as escape from pprint import pformat as pf -from flask import Flask, g +from flask import Flask, g, request def print_mem(stage=""): mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss @@ -70,6 +73,7 @@ class GeneralTrait(object): Actual turning into json doesn't happen here though""" return dict(name=self.name, + dataset=self.dataset.name, description=self.description_display, mean=self.mean) @@ -626,3 +630,22 @@ class GeneralTrait(object): ZValue = 0.5*log((1.0+self.correlation)/(1.0-self.correlation)) ZValue = ZValue*sqrt(self.overlap-3) self.p_value = 2.0*(1.0 - reaper.normp(abs(ZValue))) + + + +@app.route("/trait/get_sample_data") +def get_sample_data(): + params = request.args + trait = params['trait'] + dataset = params['dataset'] + + trait_ob = GeneralTrait(name=trait, dataset_name=dataset) + + return json.dumps({key: value.value for key, value in trait_ob.data.iteritems() }) + + #jsonable_sample_data = {} + #for sample in trait_ob.data.iteritems(): + # jsonable_sample_data[sample] = trait_ob.data[sample].value + # + #return jsonable_sample_data + \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee index c178d60d..f1d41cbe 100644 --- a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee +++ b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee @@ -1,50 +1,60 @@ console.log("before get_traits_from_collection") +# Going to be used to hold collection list +# So we can repopulate it when the back button is clicked +collection_list = null collection_click = () -> console.log("Clicking on:", $(this)) this_collection_url = $(this).find('.collection_name').prop("href") this_collection_url += "&json" console.log("this_collection_url", this_collection_url) + collection_list = $("#collections_holder").html() $.ajax( dataType: "json", url: this_collection_url, success: process_traits ) + +trait_click = () -> + console.log("Clicking on:", $(this)) + trait = $(this).find('.trait').text() + dataset = $(this).find('.dataset').text() + this_trait_url = "/trait/get_sample_data?trait="+trait+"&dataset="+dataset + console.log("this_trait_url", this_trait_url) + $.ajax( + dataType: "json", + url: this_trait_url, + success: color_by_trait + ) -# Going to be used to hold collection list -# So we can repopulate it when the back button is clicked -collection_list = null +color_by_trait = (trait_sample_data, textStatus, jqXHR) -> + console.log('in color_by_trait:', trait_sample_data) process_traits = (trait_data, textStatus, jqXHR) -> console.log('in process_traits with trait_data:', trait_data) - the_html = "
" - - the_html += "" the_html += "" - the_html += "" + the_html += "" the_html += "" for trait in trait_data - the_html += "" + the_html += "" + the_html += "" the_html += "" the_html += "" the_html += "" the_html += "
RecordDescriptionMean
RecordData SetDescriptionMean
#{ trait.name }
#{ trait.name }#{ trait.dataset }#{ trait.description }#{ trait.mean or ' ' }
" - the_html += "
" - collection_list = $("#collections_holder").html() - $("#collections_holder").replaceWith(the_html) + $("#collections_holder").html(the_html) $('#collections_holder').colorbox.resize() back_to_collections = () -> console.log("collection_list:", collection_list) - $("#collections_holder").replaceWith(collection_list) - - $("#trait_table").wrap("
") + $("#collections_holder").html(collection_list) $(document).on("click", ".collection_line", collection_click) $('#collections_holder').colorbox.resize() @@ -53,4 +63,5 @@ $ -> console.log("inside get_traits_from_collection") $(document).on("click", ".collection_line", collection_click) + $(document).on("click", ".trait_line", trait_click) $(document).on("click", "#back_to_collections", back_to_collections) diff --git a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js index c0fb7c54..104c411d 100644 --- a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js +++ b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js @@ -1,15 +1,18 @@ // Generated by CoffeeScript 1.6.1 (function() { - var back_to_collections, collection_click, collection_list, process_traits; + var back_to_collections, collection_click, collection_list, color_by_trait, process_traits, trait_click; console.log("before get_traits_from_collection"); + collection_list = null; + collection_click = function() { var this_collection_url; console.log("Clicking on:", $(this)); this_collection_url = $(this).find('.collection_name').prop("href"); this_collection_url += "&json"; console.log("this_collection_url", this_collection_url); + collection_list = $("#collections_holder").html(); return $.ajax({ dataType: "json", url: this_collection_url, @@ -17,35 +20,48 @@ }); }; - collection_list = null; + trait_click = function() { + var dataset, this_trait_url, trait; + console.log("Clicking on:", $(this)); + trait = $(this).find('.trait').text(); + dataset = $(this).find('.dataset').text(); + this_trait_url = "/trait/get_sample_data?trait=" + trait + "&dataset=" + dataset; + console.log("this_trait_url", this_trait_url); + return $.ajax({ + dataType: "json", + url: this_trait_url, + success: color_by_trait + }); + }; + + color_by_trait = function(trait_sample_data, textStatus, jqXHR) { + return console.log('in color_by_trait:', trait_sample_data); + }; process_traits = function(trait_data, textStatus, jqXHR) { var the_html, trait, _i, _len; console.log('in process_traits with trait_data:', trait_data); - the_html = "
"; - the_html += ""; the_html += ""; - the_html += ""; + the_html += ""; the_html += ""; for (_i = 0, _len = trait_data.length; _i < _len; _i++) { trait = trait_data[_i]; - the_html += ""; + the_html += ""; + the_html += ""; the_html += ""; the_html += ""; } the_html += ""; the_html += "
RecordDescriptionMean
RecordData SetDescriptionMean
" + trait.name + "
" + trait.name + "" + trait.dataset + "" + trait.description + "" + (trait.mean || ' ') + "
"; - the_html += "
"; - collection_list = $("#collections_holder").html(); - $("#collections_holder").replaceWith(the_html); + $("#collections_holder").html(the_html); return $('#collections_holder').colorbox.resize(); }; back_to_collections = function() { console.log("collection_list:", collection_list); - $("#collections_holder").replaceWith(collection_list); - $("#trait_table").wrap("
"); + $("#collections_holder").html(collection_list); $(document).on("click", ".collection_line", collection_click); return $('#collections_holder').colorbox.resize(); }; @@ -53,6 +69,7 @@ $(function() { console.log("inside get_traits_from_collection"); $(document).on("click", ".collection_line", collection_click); + $(document).on("click", ".trait_line", trait_click); return $(document).on("click", "#back_to_collections", back_to_collections); }); -- cgit v1.2.3 From 151c4614afe8c291b3154851aea9f5d670fe4efa Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Thu, 5 Dec 2013 22:54:18 +0000 Subject: Interval map graph now works properly Tried to export trait data for "color by trait" function --- wqflask/wqflask/my_pylmm/pyLMM/lmm.py | 2 -- wqflask/wqflask/static/new/css/interval_mapping.css | 21 +++++++++++++-------- .../wqflask/static/new/css/marker_regression.css | 4 ++-- .../wqflask/static/new/javascript/bar_chart.coffee | 1 + .../javascript/get_traits_from_collection.coffee | 9 +++++++-- .../new/javascript/get_traits_from_collection.js | 8 ++++++-- .../static/new/javascript/interval_mapping.coffee | 13 ++++++++----- .../static/new/javascript/interval_mapping.js | 10 +++++----- wqflask/wqflask/templates/collections/list.html | 2 +- wqflask/wqflask/templates/show_trait.html | 4 +++- 10 files changed, 46 insertions(+), 28 deletions(-) diff --git a/wqflask/wqflask/my_pylmm/pyLMM/lmm.py b/wqflask/wqflask/my_pylmm/pyLMM/lmm.py index 6ef1669b..60d36b8d 100644 --- a/wqflask/wqflask/my_pylmm/pyLMM/lmm.py +++ b/wqflask/wqflask/my_pylmm/pyLMM/lmm.py @@ -107,8 +107,6 @@ def run_human(pheno_vector, with Bench("Create list of inputs"): inputs = list(plink_input) - - print("len(genotypes): ", len(inputs)) with Bench("Divide into chunks"): results = chunks.divide_into_chunks(inputs, 64) diff --git a/wqflask/wqflask/static/new/css/interval_mapping.css b/wqflask/wqflask/static/new/css/interval_mapping.css index 9d23ba25..5ebf7742 100644 --- a/wqflask/wqflask/static/new/css/interval_mapping.css +++ b/wqflask/wqflask/static/new/css/interval_mapping.css @@ -1,27 +1,32 @@ -.manhattan_plot .y_axis path, -.manhattan_plot .y_axis line { +.interval_map .y_axis path, +.interval_map .y_axis line { fill: none; stroke: black; shape-rendering: crispEdges; } -.manhattan_plot .y_axis text { +.interval_map .y_axis text { font-family: sans-serif; font-size: 14px; } -.manhattan_plot .x_axis path, -.manhattan_plot .x_axis line { +.interval_map .x_axis path, +.interval_map .x_axis line { fill: none; stroke: black; shape-rendering: crispEdges; } -.manhattan_plot .x_axis text { +.interval_map .x_axis text { text-anchor: end; font-family: sans-serif; font-size: 8px; } -rect { +interval_map rect { stroke: WhiteSmoke; - fill: lightgrey; + fill: white; +} + +interval_map path { + stroke: steelblue; + stroke-width: 1; } \ No newline at end of file diff --git a/wqflask/wqflask/static/new/css/marker_regression.css b/wqflask/wqflask/static/new/css/marker_regression.css index 054ef93e..a737c97e 100644 --- a/wqflask/wqflask/static/new/css/marker_regression.css +++ b/wqflask/wqflask/static/new/css/marker_regression.css @@ -21,10 +21,10 @@ font-size: 8px; } -rect { +/*rect { stroke: WhiteSmoke; fill: lightgrey; -} +}*/ /*rect { stroke: WhiteSmoke; fill: Azure; diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.coffee b/wqflask/wqflask/static/new/javascript/bar_chart.coffee index 412185d8..d18cadd2 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.coffee +++ b/wqflask/wqflask/static/new/javascript/bar_chart.coffee @@ -124,6 +124,7 @@ class Bar_Chart d3.select("#color_by_trait").on("click", => @color_by_trait() + ) get_attr_color_dict: () -> diff --git a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee index f1d41cbe..23499ac5 100644 --- a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee +++ b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee @@ -1,9 +1,11 @@ +root = exports ? this console.log("before get_traits_from_collection") # Going to be used to hold collection list # So we can repopulate it when the back button is clicked collection_list = null +this_trait_data = null collection_click = () -> console.log("Clicking on:", $(this)) @@ -16,7 +18,7 @@ collection_click = () -> url: this_collection_url, success: process_traits ) - + trait_click = () -> console.log("Clicking on:", $(this)) trait = $(this).find('.trait').text() @@ -30,7 +32,9 @@ trait_click = () -> ) color_by_trait = (trait_sample_data, textStatus, jqXHR) -> - console.log('in color_by_trait:', trait_sample_data) + root.trait_sample_data = trait_sample_data + #console.log('in color_by_trait:', trait_sample_data) + process_traits = (trait_data, textStatus, jqXHR) -> console.log('in process_traits with trait_data:', trait_data) @@ -65,3 +69,4 @@ $ -> $(document).on("click", ".collection_line", collection_click) $(document).on("click", ".trait_line", trait_click) $(document).on("click", "#back_to_collections", back_to_collections) + diff --git a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js index 104c411d..b4c2c200 100644 --- a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js +++ b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js @@ -1,11 +1,15 @@ // Generated by CoffeeScript 1.6.1 (function() { - var back_to_collections, collection_click, collection_list, color_by_trait, process_traits, trait_click; + var back_to_collections, collection_click, collection_list, color_by_trait, process_traits, root, this_trait_data, trait_click; + + root = typeof exports !== "undefined" && exports !== null ? exports : this; console.log("before get_traits_from_collection"); collection_list = null; + this_trait_data = null; + collection_click = function() { var this_collection_url; console.log("Clicking on:", $(this)); @@ -35,7 +39,7 @@ }; color_by_trait = function(trait_sample_data, textStatus, jqXHR) { - return console.log('in color_by_trait:', trait_sample_data); + return root.trait_sample_data = trait_sample_data; }; process_traits = function(trait_data, textStatus, jqXHR) { diff --git a/wqflask/wqflask/static/new/javascript/interval_mapping.coffee b/wqflask/wqflask/static/new/javascript/interval_mapping.coffee index 78265f27..0aa21d97 100644 --- a/wqflask/wqflask/static/new/javascript/interval_mapping.coffee +++ b/wqflask/wqflask/static/new/javascript/interval_mapping.coffee @@ -215,10 +215,10 @@ $ -> ) .enter() .append("line") - .attr("x1", @x_scale) - .attr("x2", @x_scale) .attr("y1", @y_buffer) .attr("y2", @plot_height) + .attr("x1", @x_scale) + .attr("x2", @x_scale) .style("stroke", "#ccc") fill_chr_areas: () -> @@ -239,7 +239,8 @@ $ -> .attr("width", (d) => return @x_scale(d[0]) ) - .attr("height", @plot_height-@y_buffer) + .attr("height", @plot_height-@y_buffer) + .attr("fill", "white") add_chr_labels: () -> chr_names = [] @@ -263,12 +264,13 @@ $ -> .attr("text-anchor", "middle") .attr("font-family", "sans-serif") .attr("font-size", "18px") - .attr("fill", "grey") + #.attr("fill", "grey") connect_markers: () -> - @svg.selectAll("path") + @svg.selectAll("line") .data(@plot_coordinates) .enter() + .append("line") .attr("x1", (d, i) => if i == 0 return @x_buffer @@ -287,6 +289,7 @@ $ -> .attr("y2", (d) => return @plot_height - ((@plot_height-@y_buffer) * d[1]/@y_max) ) + .style("stroke", "black") console.time('Create manhattan plot') new Interval_Map(600, 1200) diff --git a/wqflask/wqflask/static/new/javascript/interval_mapping.js b/wqflask/wqflask/static/new/javascript/interval_mapping.js index 5ae8ffab..521a1c7a 100644 --- a/wqflask/wqflask/static/new/javascript/interval_mapping.js +++ b/wqflask/wqflask/static/new/javascript/interval_mapping.js @@ -205,7 +205,7 @@ var _this = this; return this.svg.selectAll("line").data(this.cumulative_chr_lengths, function(d) { return d; - }).enter().append("line").attr("x1", this.x_scale).attr("x2", this.x_scale).attr("y1", this.y_buffer).attr("y2", this.plot_height).style("stroke", "#ccc"); + }).enter().append("line").attr("y1", this.y_buffer).attr("y2", this.plot_height).attr("x1", this.x_scale).attr("x2", this.x_scale).style("stroke", "#ccc"); }; Interval_Map.prototype.fill_chr_areas = function() { @@ -220,7 +220,7 @@ } }).attr("y", this.y_buffer).attr("width", function(d) { return _this.x_scale(d[0]); - }).attr("height", this.plot_height - this.y_buffer); + }).attr("height", this.plot_height - this.y_buffer).attr("fill", "white"); }; Interval_Map.prototype.add_chr_labels = function() { @@ -237,12 +237,12 @@ return d[0]; }).attr("x", function(d) { return _this.x_scale(d[2] - d[1] / 2); - }).attr("y", this.plot_height * 0.1).attr("dx", "0em").attr("text-anchor", "middle").attr("font-family", "sans-serif").attr("font-size", "18px").attr("fill", "grey"); + }).attr("y", this.plot_height * 0.1).attr("dx", "0em").attr("text-anchor", "middle").attr("font-family", "sans-serif").attr("font-size", "18px"); }; Interval_Map.prototype.connect_markers = function() { var _this = this; - return this.svg.selectAll("path").data(this.plot_coordinates).enter().attr("x1", function(d, i) { + return this.svg.selectAll("line").data(this.plot_coordinates).enter().append("line").attr("x1", function(d, i) { if (i === 0) { return _this.x_buffer; } else { @@ -258,7 +258,7 @@ return parseFloat(_this.x_buffer) + ((parseFloat(_this.plot_width) - parseFloat(_this.x_buffer)) * d[0] / parseFloat(_this.x_max)); }).attr("y2", function(d) { return _this.plot_height - ((_this.plot_height - _this.y_buffer) * d[1] / _this.y_max); - }); + }).style("stroke", "black"); }; return Interval_Map; diff --git a/wqflask/wqflask/templates/collections/list.html b/wqflask/wqflask/templates/collections/list.html index ac621a61..354723d0 100644 --- a/wqflask/wqflask/templates/collections/list.html +++ b/wqflask/wqflask/templates/collections/list.html @@ -35,7 +35,7 @@ {# if "color_by_trait" in params #} - + {# endif #} diff --git a/wqflask/wqflask/templates/show_trait.html b/wqflask/wqflask/templates/show_trait.html index ec729e1c..0ad6eedb 100644 --- a/wqflask/wqflask/templates/show_trait.html +++ b/wqflask/wqflask/templates/show_trait.html @@ -2,6 +2,7 @@ {% block title %}Trait Data and Analysis{% endblock %} {% block css %} + @@ -55,9 +56,10 @@ + - + -- cgit v1.2.3 From 33b10be4e506083e906ac1ef102db3a132aeb4e2 Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Thu, 5 Dec 2013 23:56:48 +0000 Subject: Now trims selected trait's values by the samples of the primary trait and gets their distinct values Created function that creates a dictionary of distinct values and their corresponding colors --- .../wqflask/static/new/javascript/bar_chart.coffee | 41 ++++++++++++++++-- wqflask/wqflask/static/new/javascript/bar_chart.js | 48 ++++++++++++++++++++-- .../javascript/get_traits_from_collection.coffee | 4 +- .../new/javascript/get_traits_from_collection.js | 2 +- .../static/new/javascript/show_trait.coffee | 5 ++- .../wqflask/static/new/javascript/show_trait.js | 6 ++- 6 files changed, 92 insertions(+), 14 deletions(-) diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.coffee b/wqflask/wqflask/static/new/javascript/bar_chart.coffee index d18cadd2..05955188 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.coffee +++ b/wqflask/wqflask/static/new/javascript/bar_chart.coffee @@ -123,7 +123,7 @@ class Bar_Chart ) d3.select("#color_by_trait").on("click", => - @color_by_trait() + @open_trait_selection() ) @@ -138,6 +138,8 @@ class Bar_Chart this_color_dict[value] = color(i) else console.log("distinct_values:", distinct_vals) + #Check whether all values are numbers, and if they are get a corresponding + #color gradient if _.every(distinct_vals, (d) => if isNaN(d) return false @@ -147,13 +149,24 @@ class Bar_Chart color_range = d3.scale.linear() .domain([d3.min(distinct_vals), d3.max(distinct_vals)]) - .range([0,4]) + .range([0,255]) for value, i in distinct_vals console.log("color_range(value):", color_range(parseInt(value))) - this_color_dict[value] = d3.rgb("lightblue").darker(color_range(parseInt(value))) + this_color_dict[value] = d3.rgb(color_range(parseInt(value)),0, 0) + #this_color_dict[value] = d3.rgb("lightblue").darker(color_range(parseInt(value))) #this_color_dict[value] = "rgb(0, 0, " + color_range(parseInt(value)) + ")" @attr_color_dict[key] = this_color_dict + convert_into_colors: (values) -> + color_range = d3.scale.linear() + .domain([d3.min(values), + d3.max(values)]) + .range([0,255]) + for value, i in values + console.log("color_range(value):", color_range(parseInt(value))) + this_color_dict[value] = d3.rgb(color_range(parseInt(value)),0, 0) + #this_color_dict[value] = d3.rgb("lightblue").darker(color_range(parseInt(value))) + get_samples: () -> @sample_names = (sample.name for sample in @sample_list when sample.value != null) @sample_vals = (sample.value for sample in @sample_list when sample.value != null) @@ -305,7 +318,7 @@ class Bar_Chart return d ) - color_by_trait: () -> + open_trait_selection: () -> $('#collections_holder').load('/collections/list?color_by_trait #collections_list', => $.colorbox( inline: true @@ -318,6 +331,26 @@ class Bar_Chart # console.log("contents:", $(element).contents()) # $(element).contents().unwrap() ) + + color_by_trait: (trait_sample_data) -> + console.log("BXD1:", trait_sample_data["BXD1"]) + console.log("trait_sample_data:", trait_sample_data) + trimmed_samples = @trim_values(trait_sample_data) + @get_distinct_values(trimmed_samples) + + trim_values: (trait_sample_data) -> + trimmed_samples = {} + for sample in @sample_names + if sample of trait_sample_data + trimmed_samples[sample] = trait_sample_data[sample] + console.log("trimmed_samples:", trimmed_samples) + return trimmed_samples + get_distinct_values: (samples) -> + distinct_values = _.uniq(_.values(samples)) + #distinct_values = [] + #for sample in samples + # if samples[sample] in distinct_values + console.log("distinct_values:", distinct_values) root.Bar_Chart = Bar_Chart \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.js b/wqflask/wqflask/static/new/javascript/bar_chart.js index e4279d41..05625dc9 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.js +++ b/wqflask/wqflask/static/new/javascript/bar_chart.js @@ -126,7 +126,7 @@ } }); d3.select("#color_by_trait").on("click", function() { - return _this.color_by_trait(); + return _this.open_trait_selection(); }); } @@ -156,11 +156,11 @@ return true; } })) { - color_range = d3.scale.linear().domain([d3.min(distinct_vals), d3.max(distinct_vals)]).range([0, 4]); + color_range = d3.scale.linear().domain([d3.min(distinct_vals), d3.max(distinct_vals)]).range([0, 255]); for (i = _j = 0, _len1 = distinct_vals.length; _j < _len1; i = ++_j) { value = distinct_vals[i]; console.log("color_range(value):", color_range(parseInt(value))); - this_color_dict[value] = d3.rgb("lightblue").darker(color_range(parseInt(value))); + this_color_dict[value] = d3.rgb(color_range(parseInt(value)), 0, 0); } } } @@ -169,6 +169,18 @@ return _results; }; + Bar_Chart.prototype.convert_into_colors = function(values) { + var color_range, i, value, _i, _len, _results; + color_range = d3.scale.linear().domain([d3.min(values), d3.max(values)]).range([0, 255]); + _results = []; + for (i = _i = 0, _len = values.length; _i < _len; i = ++_i) { + value = values[i]; + console.log("color_range(value):", color_range(parseInt(value))); + _results.push(this_color_dict[value] = d3.rgb(color_range(parseInt(value)), 0, 0)); + } + return _results; + }; + Bar_Chart.prototype.get_samples = function() { var attr_vals, attribute, key, sample, _i, _j, _len, _len1, _ref, _ref1; this.sample_names = (function() { @@ -320,7 +332,7 @@ }); }; - Bar_Chart.prototype.color_by_trait = function() { + Bar_Chart.prototype.open_trait_selection = function() { var _this = this; return $('#collections_holder').load('/collections/list?color_by_trait #collections_list', function() { $.colorbox({ @@ -331,6 +343,34 @@ }); }; + Bar_Chart.prototype.color_by_trait = function(trait_sample_data) { + var trimmed_samples; + console.log("BXD1:", trait_sample_data["BXD1"]); + console.log("trait_sample_data:", trait_sample_data); + trimmed_samples = this.trim_values(trait_sample_data); + return this.get_distinct_values(trimmed_samples); + }; + + Bar_Chart.prototype.trim_values = function(trait_sample_data) { + var sample, trimmed_samples, _i, _len, _ref; + trimmed_samples = {}; + _ref = this.sample_names; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + sample = _ref[_i]; + if (sample in trait_sample_data) { + trimmed_samples[sample] = trait_sample_data[sample]; + } + } + console.log("trimmed_samples:", trimmed_samples); + return trimmed_samples; + }; + + Bar_Chart.prototype.get_distinct_values = function(samples) { + var distinct_values; + distinct_values = _.uniq(_.values(samples)); + return console.log("distinct_values:", distinct_values); + }; + return Bar_Chart; })(); diff --git a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee index 23499ac5..43a518b3 100644 --- a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee +++ b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee @@ -32,9 +32,9 @@ trait_click = () -> ) color_by_trait = (trait_sample_data, textStatus, jqXHR) -> - root.trait_sample_data = trait_sample_data + #trait_sample_data = trait_sample_data #console.log('in color_by_trait:', trait_sample_data) - + root.bar_chart.color_by_trait(trait_sample_data) process_traits = (trait_data, textStatus, jqXHR) -> console.log('in process_traits with trait_data:', trait_data) diff --git a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js index b4c2c200..137a6ce8 100644 --- a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js +++ b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js @@ -39,7 +39,7 @@ }; color_by_trait = function(trait_sample_data, textStatus, jqXHR) { - return root.trait_sample_data = trait_sample_data; + return root.bar_chart.color_by_trait(trait_sample_data); }; process_traits = function(trait_data, textStatus, jqXHR) { diff --git a/wqflask/wqflask/static/new/javascript/show_trait.coffee b/wqflask/wqflask/static/new/javascript/show_trait.coffee index 7d23345f..82b85436 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.coffee +++ b/wqflask/wqflask/static/new/javascript/show_trait.coffee @@ -1,3 +1,5 @@ +root = exports ? this + console.log("start_b") # this is our isNumber, do not confuse with the underscore.js one @@ -62,7 +64,8 @@ $ -> sample_lists = js_data.sample_lists sample_group_types = js_data.sample_group_types - new Bar_Chart(sample_lists[0]) + root.bar_chart = new Bar_Chart(sample_lists[0]) + new Box_Plot(sample_lists[0]) diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js index 718e365a..320f705b 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.js +++ b/wqflask/wqflask/static/new/javascript/show_trait.js @@ -1,9 +1,11 @@ // Generated by CoffeeScript 1.6.1 (function() { - var Stat_Table_Rows, is_number, + var Stat_Table_Rows, is_number, root, __hasProp = {}.hasOwnProperty, __slice = [].slice; + root = typeof exports !== "undefined" && exports !== null ? exports : this; + console.log("start_b"); is_number = function(o) { @@ -59,7 +61,7 @@ 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, sample_group_types, sample_lists, show_hide_outliers, stats_mdp_change, update_stat_values; sample_lists = js_data.sample_lists; sample_group_types = js_data.sample_group_types; - new Bar_Chart(sample_lists[0]); + root.bar_chart = new Bar_Chart(sample_lists[0]); new Box_Plot(sample_lists[0]); $('.bar_chart_samples_group').change(function() { var all_samples, group; -- cgit v1.2.3 From dacbe604011514d7db2d3827e74c47cd7913dd40 Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Wed, 11 Dec 2013 20:13:45 +0000 Subject: Got color by trait working, but still need to add a legend and make some other small changes (like removing samples that don't overlap with the selected trait) Tentatively removed jquery-ui from base.html; I'm not sure if we're still using this anywhere, but removing it doesn't seem to have had an impact on the trait page --- .../wqflask/static/new/javascript/bar_chart.coffee | 60 +++++++++++++++++----- wqflask/wqflask/static/new/javascript/bar_chart.js | 53 ++++++++++++------- .../static/new/javascript/show_trait.coffee | 6 +-- .../wqflask/static/new/javascript/show_trait.js | 1 + wqflask/wqflask/templates/base.html | 2 +- .../templates/show_trait_statistics_new.html | 10 ++-- 6 files changed, 93 insertions(+), 39 deletions(-) diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.coffee b/wqflask/wqflask/static/new/javascript/bar_chart.coffee index 05955188..6af14687 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.coffee +++ b/wqflask/wqflask/static/new/javascript/bar_chart.coffee @@ -6,7 +6,7 @@ class Bar_Chart console.log("sample names:", @sample_names) if @sample_attr_vals.length > 0 @get_distinct_attr_vals() - @get_attr_color_dict() + @get_attr_color_dict(@distinct_attr_vals) #Used to calculate the bottom margin so sample names aren't cut off longest_sample_name = d3.max(sample.length for sample in @sample_names) @@ -29,6 +29,7 @@ class Bar_Chart d3.select("#color_attribute").on("change", => attribute = $("#color_attribute").val() + console.log("attr_color_dict:", @attr_color_dict) if $("#update_bar_chart").html() == 'Sort By Name' @svg.selectAll(".bar") .data(@sorted_samples()) @@ -57,13 +58,17 @@ class Bar_Chart ) @add_legend(attribute, @distinct_attr_vals[attribute]) ) - - - d3.select("#update_bar_chart").on("click", => + + + d3.select(".update_bar_chart").on("click", => + sort_by = $('.update_bar_chart.active').val() + console.log("sort_by: ", sort_by) if @attributes.length > 0 attribute = $("#color_attribute").val() - if $("#update_bar_chart").html() == 'Sort By Value' - $("#update_bar_chart").html('Sort By Name') + if sort_by = "value" + console.log("sorting by value") + #if $("#update_bar_chart").html() == 'Sort By Value' + #$("#update_bar_chart").html('Sort By Name') sortItems = (a, b) -> return a[1] - b[1] @@ -72,6 +77,7 @@ class Bar_Chart .transition() .duration(1000) .attr("y", (d) => + return @y_scale(d[1]) ) .attr("height", (d) => @@ -94,7 +100,8 @@ class Bar_Chart $('.x.axis').remove() @add_x_axis(x_scale) else - $("#update_bar_chart").html('Sort By Value') + console.log("sorting by name") + #$("#update_bar_chart").html('Sort By Value') @svg.selectAll(".bar") .data(@samples) .transition() @@ -127,10 +134,10 @@ class Bar_Chart ) - get_attr_color_dict: () -> + get_attr_color_dict: (vals) -> @attr_color_dict = {} - console.log("distinct_attr_vals:", @distinct_attr_vals) - for own key, distinct_vals of @distinct_attr_vals + console.log("vals:", vals) + for own key, distinct_vals of vals this_color_dict = {} if distinct_vals.length < 10 color = d3.scale.category10() @@ -151,8 +158,8 @@ class Bar_Chart d3.max(distinct_vals)]) .range([0,255]) for value, i in distinct_vals - console.log("color_range(value):", color_range(parseInt(value))) - this_color_dict[value] = d3.rgb(color_range(parseInt(value)),0, 0) + console.log("color_range(value):", parseInt(color_range(value))) + this_color_dict[value] = d3.rgb(parseInt(color_range(value)),0, 0) #this_color_dict[value] = d3.rgb("lightblue").darker(color_range(parseInt(value))) #this_color_dict[value] = "rgb(0, 0, " + color_range(parseInt(value)) + ")" @attr_color_dict[key] = this_color_dict @@ -336,7 +343,31 @@ class Bar_Chart console.log("BXD1:", trait_sample_data["BXD1"]) console.log("trait_sample_data:", trait_sample_data) trimmed_samples = @trim_values(trait_sample_data) - @get_distinct_values(trimmed_samples) + distinct_values = {} + distinct_values["collection_trait"] = @get_distinct_values(trimmed_samples) + @get_attr_color_dict(distinct_values) + if $("#update_bar_chart").html() == 'Sort By Name' + @svg.selectAll(".bar") + .data(@sorted_samples()) + .transition() + .duration(1000) + .style("fill", (d) => + return @attr_color_dict["collection_trait"][trimmed_samples[d[0]]] + ) + .select("title") + .text((d) => + return d[1] + ) + else + @svg.selectAll(".bar") + .data(@samples) + .transition() + .duration(1000) + .style("fill", (d) => + return @attr_color_dict["collection_trait"][trimmed_samples[d[0]]] + ) + + trim_values: (trait_sample_data) -> trimmed_samples = {} @@ -348,9 +379,10 @@ class Bar_Chart get_distinct_values: (samples) -> distinct_values = _.uniq(_.values(samples)) + console.log("distinct_values:", distinct_values) + return distinct_values #distinct_values = [] #for sample in samples # if samples[sample] in distinct_values - console.log("distinct_values:", distinct_values) root.Bar_Chart = Bar_Chart \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.js b/wqflask/wqflask/static/new/javascript/bar_chart.js index 05625dc9..17bada7e 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.js +++ b/wqflask/wqflask/static/new/javascript/bar_chart.js @@ -17,7 +17,7 @@ console.log("sample names:", this.sample_names); if (this.sample_attr_vals.length > 0) { this.get_distinct_attr_vals(); - this.get_attr_color_dict(); + this.get_attr_color_dict(this.distinct_attr_vals); } longest_sample_name = d3.max((function() { var _i, _len, _ref, _results; @@ -48,6 +48,7 @@ d3.select("#color_attribute").on("change", function() { var attribute; attribute = $("#color_attribute").val(); + console.log("attr_color_dict:", _this.attr_color_dict); if ($("#update_bar_chart").html() === 'Sort By Name') { _this.svg.selectAll(".bar").data(_this.sorted_samples()).transition().duration(1000).style("fill", function(d) { if (attribute === "None") { @@ -69,13 +70,15 @@ } return _this.add_legend(attribute, _this.distinct_attr_vals[attribute]); }); - d3.select("#update_bar_chart").on("click", function() { - var attribute, sortItems, sorted_sample_names, x_scale; + d3.select(".update_bar_chart").on("click", function() { + var attribute, sortItems, sort_by, sorted_sample_names, x_scale; + sort_by = $('.update_bar_chart.active').val(); + console.log("sort_by: ", sort_by); if (_this.attributes.length > 0) { attribute = $("#color_attribute").val(); } - if ($("#update_bar_chart").html() === 'Sort By Value') { - $("#update_bar_chart").html('Sort By Name'); + if (sort_by = "value") { + console.log("sorting by value"); sortItems = function(a, b) { return a[1] - b[1]; }; @@ -106,7 +109,7 @@ $('.x.axis').remove(); return _this.add_x_axis(x_scale); } else { - $("#update_bar_chart").html('Sort By Value'); + console.log("sorting by name"); _this.svg.selectAll(".bar").data(_this.samples).transition().duration(1000).attr("y", function(d) { return _this.y_scale(d[1]); }).attr("height", function(d) { @@ -130,16 +133,15 @@ }); } - Bar_Chart.prototype.get_attr_color_dict = function() { - var color, color_range, distinct_vals, i, key, this_color_dict, value, _i, _j, _len, _len1, _ref, _results, + Bar_Chart.prototype.get_attr_color_dict = function(vals) { + var color, color_range, distinct_vals, i, key, this_color_dict, value, _i, _j, _len, _len1, _results, _this = this; this.attr_color_dict = {}; - console.log("distinct_attr_vals:", this.distinct_attr_vals); - _ref = this.distinct_attr_vals; + console.log("vals:", vals); _results = []; - for (key in _ref) { - if (!__hasProp.call(_ref, key)) continue; - distinct_vals = _ref[key]; + for (key in vals) { + if (!__hasProp.call(vals, key)) continue; + distinct_vals = vals[key]; this_color_dict = {}; if (distinct_vals.length < 10) { color = d3.scale.category10(); @@ -159,8 +161,8 @@ color_range = d3.scale.linear().domain([d3.min(distinct_vals), d3.max(distinct_vals)]).range([0, 255]); for (i = _j = 0, _len1 = distinct_vals.length; _j < _len1; i = ++_j) { value = distinct_vals[i]; - console.log("color_range(value):", color_range(parseInt(value))); - this_color_dict[value] = d3.rgb(color_range(parseInt(value)), 0, 0); + console.log("color_range(value):", parseInt(color_range(value))); + this_color_dict[value] = d3.rgb(parseInt(color_range(value)), 0, 0); } } } @@ -344,11 +346,25 @@ }; Bar_Chart.prototype.color_by_trait = function(trait_sample_data) { - var trimmed_samples; + var distinct_values, trimmed_samples, + _this = this; console.log("BXD1:", trait_sample_data["BXD1"]); console.log("trait_sample_data:", trait_sample_data); trimmed_samples = this.trim_values(trait_sample_data); - return this.get_distinct_values(trimmed_samples); + distinct_values = {}; + distinct_values["collection_trait"] = this.get_distinct_values(trimmed_samples); + this.get_attr_color_dict(distinct_values); + if ($("#update_bar_chart").html() === 'Sort By Name') { + return this.svg.selectAll(".bar").data(this.sorted_samples()).transition().duration(1000).style("fill", function(d) { + return _this.attr_color_dict["collection_trait"][trimmed_samples[d[0]]]; + }).select("title").text(function(d) { + return d[1]; + }); + } else { + return this.svg.selectAll(".bar").data(this.samples).transition().duration(1000).style("fill", function(d) { + return _this.attr_color_dict["collection_trait"][trimmed_samples[d[0]]]; + }); + } }; Bar_Chart.prototype.trim_values = function(trait_sample_data) { @@ -368,7 +384,8 @@ Bar_Chart.prototype.get_distinct_values = function(samples) { var distinct_values; distinct_values = _.uniq(_.values(samples)); - return console.log("distinct_values:", distinct_values); + console.log("distinct_values:", distinct_values); + return distinct_values; }; return Bar_Chart; diff --git a/wqflask/wqflask/static/new/javascript/show_trait.coffee b/wqflask/wqflask/static/new/javascript/show_trait.coffee index 82b85436..1df033d6 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.coffee +++ b/wqflask/wqflask/static/new/javascript/show_trait.coffee @@ -64,11 +64,10 @@ $ -> sample_lists = js_data.sample_lists sample_group_types = js_data.sample_group_types + $("#update_bar_chart.btn-group").button() root.bar_chart = new Bar_Chart(sample_lists[0]) - new Box_Plot(sample_lists[0]) - $('.bar_chart_samples_group').change -> $('#bar_chart').remove() $('#bar_chart_container').append('
') @@ -80,7 +79,8 @@ $ -> else if group == "samples_all" all_samples = sample_lists[0].concat sample_lists[1] new Bar_Chart(all_samples) - + #$(".btn-group").button() + $('.box_plot_samples_group').change -> $('#box_plot').remove() $('#box_plot_container').append('
') diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js index 320f705b..90fa8228 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.js +++ b/wqflask/wqflask/static/new/javascript/show_trait.js @@ -61,6 +61,7 @@ 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, sample_group_types, sample_lists, show_hide_outliers, stats_mdp_change, update_stat_values; sample_lists = js_data.sample_lists; sample_group_types = js_data.sample_group_types; + $("#update_bar_chart.btn-group").button(); root.bar_chart = new Bar_Chart(sample_lists[0]); new Box_Plot(sample_lists[0]); $('.bar_chart_samples_group').change(function() { diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html index 9b98c955..0360f619 100644 --- a/wqflask/wqflask/templates/base.html +++ b/wqflask/wqflask/templates/base.html @@ -212,7 +212,7 @@ - + diff --git a/wqflask/wqflask/templates/show_trait_statistics_new.html b/wqflask/wqflask/templates/show_trait_statistics_new.html index 33538626..e658484e 100644 --- a/wqflask/wqflask/templates/show_trait_statistics_new.html +++ b/wqflask/wqflask/templates/show_trait_statistics_new.html @@ -30,10 +30,14 @@ {% endfor %} - {% endif %} - + + + -- cgit v1.2.3 From 0695303cae83e524ca5b4db159b2c1e1adcb9f24 Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Wed, 11 Dec 2013 23:15:30 +0000 Subject: Got sort by name/value buttons working and committing before trying to put some of the d3 code into a function --- .../wqflask/static/new/javascript/bar_chart.coffee | 198 ++++++++++++++------- wqflask/wqflask/static/new/javascript/bar_chart.js | 109 ++++++------ .../javascript/get_traits_from_collection.coffee | 1 + .../new/javascript/get_traits_from_collection.js | 2 + .../templates/show_trait_statistics_new.html | 18 +- 5 files changed, 197 insertions(+), 131 deletions(-) diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.coffee b/wqflask/wqflask/static/new/javascript/bar_chart.coffee index 6af14687..f59d947d 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.coffee +++ b/wqflask/wqflask/static/new/javascript/bar_chart.coffee @@ -60,75 +60,138 @@ class Bar_Chart ) - d3.select(".update_bar_chart").on("click", => - sort_by = $('.update_bar_chart.active').val() - console.log("sort_by: ", sort_by) - if @attributes.length > 0 - attribute = $("#color_attribute").val() - if sort_by = "value" - console.log("sorting by value") - #if $("#update_bar_chart").html() == 'Sort By Value' - #$("#update_bar_chart").html('Sort By Name') - sortItems = (a, b) -> - return a[1] - b[1] - - @svg.selectAll(".bar") - .data(@sorted_samples()) - .transition() - .duration(1000) - .attr("y", (d) => - - return @y_scale(d[1]) - ) - .attr("height", (d) => - return @plot_height - @y_scale(d[1]) - ) - .style("fill", (d) => - if @attributes.length > 0 - return @attr_color_dict[attribute][d[2][attribute]] - else - return "steelblue" - ) - .select("title") - .text((d) => - return d[1] - ) - sorted_sample_names = (sample[0] for sample in @sorted_samples()) - x_scale = d3.scale.ordinal() - .domain(sorted_sample_names) - .rangeBands([0, @plot_width], .1) - $('.x.axis').remove() - @add_x_axis(x_scale) - else - console.log("sorting by name") - #$("#update_bar_chart").html('Sort By Value') - @svg.selectAll(".bar") - .data(@samples) - .transition() - .duration(1000) - .attr("y", (d) => - return @y_scale(d[1]) - ) - .attr("height", (d) => - return @plot_height - @y_scale(d[1]) - ) - .style("fill", (d) => - if @attributes.length > 0 - return @attr_color_dict[attribute][d[2][attribute]] - else - return "steelblue" - ) - .select("title") - .text((d) => - return d[1] - ) - x_scale = d3.scale.ordinal() - .domain(@sample_names) - .rangeBands([0, @plot_width], .1) - $('.x.axis').remove() - @add_x_axis(x_scale) + + $(".sort_by_value").on("click", => + console.log("sorting by value") + sortItems = (a, b) -> + return a[1] - b[1] + + @svg.selectAll(".bar") + .data(@sorted_samples()) + .transition() + .duration(1000) + .attr("y", (d) => + return @y_scale(d[1]) + ) + .attr("height", (d) => + return @plot_height - @y_scale(d[1]) + ) + .style("fill", (d) => + if @attributes.length > 0 + return @attr_color_dict[attribute][d[2][attribute]] + else + return "steelblue" + ) + .select("title") + .text((d) => + return d[1] + ) + sorted_sample_names = (sample[0] for sample in @sorted_samples()) + x_scale = d3.scale.ordinal() + .domain(sorted_sample_names) + .rangeBands([0, @plot_width], .1) + $('.x.axis').remove() + @add_x_axis(x_scale) + ) + + $(".sort_by_name").on("click", => + console.log("sorting by name") + #$("#update_bar_chart").html('Sort By Value') + @svg.selectAll(".bar") + .data(@samples) + .transition() + .duration(1000) + .attr("y", (d) => + return @y_scale(d[1]) + ) + .attr("height", (d) => + return @plot_height - @y_scale(d[1]) + ) + .style("fill", (d) => + if @attributes.length > 0 + return @attr_color_dict[attribute][d[2][attribute]] + else + return "steelblue" + ) + .select("title") + .text((d) => + return d[1] + ) + x_scale = d3.scale.ordinal() + .domain(@sample_names) + .rangeBands([0, @plot_width], .1) + $('.x.axis').remove() + @add_x_axis(x_scale) ) + #d3.select(".update_bar_chart").on("click", => + # console.log("THIS IS:", $(this)) + # sort_by = $(this).val() + # console.log("sort_by: ", sort_by) + # if @attributes.length > 0 + # attribute = $("#color_attribute").val() + # if sort_by = "value" + # console.log("sorting by value") + # sortItems = (a, b) -> + # return a[1] - b[1] + # + # @svg.selectAll(".bar") + # .data(@sorted_samples()) + # .transition() + # .duration(1000) + # .attr("y", (d) => + # + # return @y_scale(d[1]) + # ) + # .attr("height", (d) => + # return @plot_height - @y_scale(d[1]) + # ) + # .style("fill", (d) => + # if @attributes.length > 0 + # return @attr_color_dict[attribute][d[2][attribute]] + # else + # return "steelblue" + # ) + # .select("title") + # .text((d) => + # return d[1] + # ) + # sorted_sample_names = (sample[0] for sample in @sorted_samples()) + # x_scale = d3.scale.ordinal() + # .domain(sorted_sample_names) + # .rangeBands([0, @plot_width], .1) + # $('.x.axis').remove() + # @add_x_axis(x_scale) + # else + # console.log("sorting by name") + # #$("#update_bar_chart").html('Sort By Value') + # @svg.selectAll(".bar") + # .data(@samples) + # .transition() + # .duration(1000) + # .attr("y", (d) => + # return @y_scale(d[1]) + # ) + # .attr("height", (d) => + # return @plot_height - @y_scale(d[1]) + # ) + # .style("fill", (d) => + # if @attributes.length > 0 + # return @attr_color_dict[attribute][d[2][attribute]] + # else + # return "steelblue" + # ) + # .select("title") + # .text((d) => + # return d[1] + # ) + # x_scale = d3.scale.ordinal() + # .domain(@sample_names) + # .rangeBands([0, @plot_width], .1) + # $('.x.axis').remove() + # @add_x_axis(x_scale) + #) + d3.select("#color_by_trait").on("click", => @open_trait_selection() @@ -367,7 +430,6 @@ class Bar_Chart return @attr_color_dict["collection_trait"][trimmed_samples[d[0]]] ) - trim_values: (trait_sample_data) -> trimmed_samples = {} diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.js b/wqflask/wqflask/static/new/javascript/bar_chart.js index 17bada7e..63a71857 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.js +++ b/wqflask/wqflask/static/new/javascript/bar_chart.js @@ -70,63 +70,58 @@ } return _this.add_legend(attribute, _this.distinct_attr_vals[attribute]); }); - d3.select(".update_bar_chart").on("click", function() { - var attribute, sortItems, sort_by, sorted_sample_names, x_scale; - sort_by = $('.update_bar_chart.active').val(); - console.log("sort_by: ", sort_by); - if (_this.attributes.length > 0) { - attribute = $("#color_attribute").val(); - } - if (sort_by = "value") { - console.log("sorting by value"); - sortItems = function(a, b) { - return a[1] - b[1]; - }; - _this.svg.selectAll(".bar").data(_this.sorted_samples()).transition().duration(1000).attr("y", function(d) { - return _this.y_scale(d[1]); - }).attr("height", function(d) { - return _this.plot_height - _this.y_scale(d[1]); - }).style("fill", function(d) { - if (_this.attributes.length > 0) { - return _this.attr_color_dict[attribute][d[2][attribute]]; - } else { - return "steelblue"; - } - }).select("title").text(function(d) { - return d[1]; - }); - sorted_sample_names = (function() { - var _i, _len, _ref, _results; - _ref = this.sorted_samples(); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - sample = _ref[_i]; - _results.push(sample[0]); - } - return _results; - }).call(_this); - x_scale = d3.scale.ordinal().domain(sorted_sample_names).rangeBands([0, _this.plot_width], .1); - $('.x.axis').remove(); - return _this.add_x_axis(x_scale); - } else { - console.log("sorting by name"); - _this.svg.selectAll(".bar").data(_this.samples).transition().duration(1000).attr("y", function(d) { - return _this.y_scale(d[1]); - }).attr("height", function(d) { - return _this.plot_height - _this.y_scale(d[1]); - }).style("fill", function(d) { - if (_this.attributes.length > 0) { - return _this.attr_color_dict[attribute][d[2][attribute]]; - } else { - return "steelblue"; - } - }).select("title").text(function(d) { - return d[1]; - }); - x_scale = d3.scale.ordinal().domain(_this.sample_names).rangeBands([0, _this.plot_width], .1); - $('.x.axis').remove(); - return _this.add_x_axis(x_scale); - } + $(".sort_by_value").on("click", function() { + var sortItems, sorted_sample_names, x_scale; + console.log("sorting by value"); + sortItems = function(a, b) { + return a[1] - b[1]; + }; + _this.svg.selectAll(".bar").data(_this.sorted_samples()).transition().duration(1000).attr("y", function(d) { + return _this.y_scale(d[1]); + }).attr("height", function(d) { + return _this.plot_height - _this.y_scale(d[1]); + }).style("fill", function(d) { + if (_this.attributes.length > 0) { + return _this.attr_color_dict[attribute][d[2][attribute]]; + } else { + return "steelblue"; + } + }).select("title").text(function(d) { + return d[1]; + }); + sorted_sample_names = (function() { + var _i, _len, _ref, _results; + _ref = this.sorted_samples(); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + sample = _ref[_i]; + _results.push(sample[0]); + } + return _results; + }).call(_this); + x_scale = d3.scale.ordinal().domain(sorted_sample_names).rangeBands([0, _this.plot_width], .1); + $('.x.axis').remove(); + return _this.add_x_axis(x_scale); + }); + $(".sort_by_name").on("click", function() { + var x_scale; + console.log("sorting by name"); + _this.svg.selectAll(".bar").data(_this.samples).transition().duration(1000).attr("y", function(d) { + return _this.y_scale(d[1]); + }).attr("height", function(d) { + return _this.plot_height - _this.y_scale(d[1]); + }).style("fill", function(d) { + if (_this.attributes.length > 0) { + return _this.attr_color_dict[attribute][d[2][attribute]]; + } else { + return "steelblue"; + } + }).select("title").text(function(d) { + return d[1]; + }); + x_scale = d3.scale.ordinal().domain(_this.sample_names).rangeBands([0, _this.plot_width], .1); + $('.x.axis').remove(); + return _this.add_x_axis(x_scale); }); d3.select("#color_by_trait").on("click", function() { return _this.open_trait_selection(); diff --git a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee index 43a518b3..db398809 100644 --- a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee +++ b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.coffee @@ -30,6 +30,7 @@ trait_click = () -> url: this_trait_url, success: color_by_trait ) + $.colorbox.close() color_by_trait = (trait_sample_data, textStatus, jqXHR) -> #trait_sample_data = trait_sample_data diff --git a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js index 137a6ce8..fac543f8 100644 --- a/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js +++ b/wqflask/wqflask/static/new/javascript/get_traits_from_collection.js @@ -38,6 +38,8 @@ }); }; + $.colorbox.close(); + color_by_trait = function(trait_sample_data, textStatus, jqXHR) { return root.bar_chart.color_by_trait(trait_sample_data); }; diff --git a/wqflask/wqflask/templates/show_trait_statistics_new.html b/wqflask/wqflask/templates/show_trait_statistics_new.html index e658484e..6d6b1d24 100644 --- a/wqflask/wqflask/templates/show_trait_statistics_new.html +++ b/wqflask/wqflask/templates/show_trait_statistics_new.html @@ -31,16 +31,22 @@ {% endif %} -
- - +
+ +
- +
+ +
-- cgit v1.2.3 From 17ed5f2a56e03ded169b3191a7a7d280c5b584bf Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Thu, 12 Dec 2013 00:19:05 +0000 Subject: Put the code that rebuilds the bar chart into a function Still need to fix issue where attribute colors don't stay with their associated samples/strains --- .../wqflask/static/new/javascript/bar_chart.coffee | 172 +++++++++++++-------- wqflask/wqflask/static/new/javascript/bar_chart.js | 108 +++++++------ 2 files changed, 160 insertions(+), 120 deletions(-) diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.coffee b/wqflask/wqflask/static/new/javascript/bar_chart.coffee index f59d947d..e1bb36e1 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.coffee +++ b/wqflask/wqflask/static/new/javascript/bar_chart.coffee @@ -2,6 +2,7 @@ root = exports ? this class Bar_Chart constructor: (@sample_list, @sample_group) -> + @sort_by = "name" @get_samples() console.log("sample names:", @sample_names) if @sample_attr_vals.length > 0 @@ -28,18 +29,19 @@ class Bar_Chart @create_graph() d3.select("#color_attribute").on("change", => - attribute = $("#color_attribute").val() + @attribute = $("#color_attribute").val() console.log("attr_color_dict:", @attr_color_dict) - if $("#update_bar_chart").html() == 'Sort By Name' + #if $("#update_bar_chart").html() == 'Sort By Name' + if @sort_by = "name" @svg.selectAll(".bar") .data(@sorted_samples()) .transition() .duration(1000) .style("fill", (d) => - if attribute == "None" + if @attribute == "None" return "steelblue" else - return @attr_color_dict[attribute][d[2][attribute]] + return @attr_color_dict[@attribute][d[2][@attribute]] ) .select("title") .text((d) => @@ -51,79 +53,85 @@ class Bar_Chart .transition() .duration(1000) .style("fill", (d) => - if attribute == "None" + if @attribute == "None" return "steelblue" else - return @attr_color_dict[attribute][d[2][attribute]] + return @attr_color_dict[@attribute][d[2][@attribute]] ) - @add_legend(attribute, @distinct_attr_vals[attribute]) + @add_legend(@attribute, @distinct_attr_vals[@attribute]) ) - - - + $(".sort_by_value").on("click", => console.log("sorting by value") - sortItems = (a, b) -> - return a[1] - b[1] - - @svg.selectAll(".bar") - .data(@sorted_samples()) - .transition() - .duration(1000) - .attr("y", (d) => - return @y_scale(d[1]) - ) - .attr("height", (d) => - return @plot_height - @y_scale(d[1]) - ) - .style("fill", (d) => - if @attributes.length > 0 - return @attr_color_dict[attribute][d[2][attribute]] - else - return "steelblue" - ) - .select("title") - .text((d) => - return d[1] - ) - sorted_sample_names = (sample[0] for sample in @sorted_samples()) - x_scale = d3.scale.ordinal() - .domain(sorted_sample_names) - .rangeBands([0, @plot_width], .1) - $('.x.axis').remove() - @add_x_axis(x_scale) + @sort_by = "value" + if @attributes.length > 0 + @attribute = $("#color_attribute").val() + #sortItems = (a, b) -> + # return a[1] - b[1] + @rebuild_bar_graph(@sorted_samples()) + #@svg.selectAll(".bar") + # .data(@sorted_samples()) + # .transition() + # .duration(1000) + # .attr("y", (d) => + # return @y_scale(d[1]) + # ) + # .attr("height", (d) => + # return @plot_height - @y_scale(d[1]) + # ) + # .select("title") + # .text((d) => + # return d[1] + # ) + # #.style("fill", (d) => + # # if @attributes.length > 0 + # # return @attr_color_dict[attribute][d[2][attribute]] + # # else + # # return "steelblue" + # #) + #sorted_sample_names = (sample[0] for sample in @sorted_samples()) + #x_scale = d3.scale.ordinal() + # .domain(sorted_sample_names) + # .rangeBands([0, @plot_width], .1) + #$('.x.axis').remove() + #@add_x_axis(x_scale) ) $(".sort_by_name").on("click", => console.log("sorting by name") - #$("#update_bar_chart").html('Sort By Value') - @svg.selectAll(".bar") - .data(@samples) - .transition() - .duration(1000) - .attr("y", (d) => - return @y_scale(d[1]) - ) - .attr("height", (d) => - return @plot_height - @y_scale(d[1]) - ) - .style("fill", (d) => - if @attributes.length > 0 - return @attr_color_dict[attribute][d[2][attribute]] - else - return "steelblue" - ) - .select("title") - .text((d) => - return d[1] - ) - x_scale = d3.scale.ordinal() - .domain(@sample_names) - .rangeBands([0, @plot_width], .1) - $('.x.axis').remove() - @add_x_axis(x_scale) + @sort_by = "name" + if @attributes.length > 0 + @attribute = $("#color_attribute").val() + @rebuild_bar_graph(@samples) + #@svg.selectAll(".bar") + # .data(@samples) + # .transition() + # .duration(1000) + # .attr("y", (d) => + # return @y_scale(d[1]) + # ) + # .attr("height", (d) => + # return @plot_height - @y_scale(d[1]) + # ) + # .select("title") + # .text((d) => + # return d[1] + # ) + # .style("fill", (d) => + # if @attributes.length > 0 + # return @attr_color_dict[attribute][d[2][attribute]] + # else + # return "steelblue" + # ) + #x_scale = d3.scale.ordinal() + # .domain(@sample_names) + # .rangeBands([0, @plot_width], .1) + #$('.x.axis').remove() + #@add_x_axis(x_scale) ) + + #d3.select(".update_bar_chart").on("click", => # console.log("THIS IS:", $(this)) # sort_by = $(this).val() @@ -197,6 +205,40 @@ class Bar_Chart ) + + rebuild_bar_graph: (samples) -> + console.log("samples:", samples) + @svg.selectAll(".bar") + .data(samples) + .transition() + .duration(1000) + .attr("y", (d) => + return @y_scale(d[1]) + ) + .attr("height", (d) => + return @plot_height - @y_scale(d[1]) + ) + .select("title") + .text((d) => + return d[1] + ) + .style("fill", (d) => + if @attributes.length > 0 and @attribute != "None" + console.log("@attribute:", @attribute) + console.log("d[2]", d[2]) + console.log("the_color:", @attr_color_dict[@attribute][d[2][@attribute]]) + return @attr_color_dict[@attribute][d[2][@attribute]] + else + return "steelblue" + ) + sample_names = (sample[0] for sample in samples) + console.log("sample_names2:", sample_names) + x_scale = d3.scale.ordinal() + .domain(sample_names) + .rangeBands([0, @plot_width], .1) + $('.x.axis').remove() + @add_x_axis(x_scale) + get_attr_color_dict: (vals) -> @attr_color_dict = {} console.log("vals:", vals) diff --git a/wqflask/wqflask/static/new/javascript/bar_chart.js b/wqflask/wqflask/static/new/javascript/bar_chart.js index 63a71857..b02ee1da 100644 --- a/wqflask/wqflask/static/new/javascript/bar_chart.js +++ b/wqflask/wqflask/static/new/javascript/bar_chart.js @@ -13,6 +13,7 @@ _this = this; this.sample_list = sample_list; this.sample_group = sample_group; + this.sort_by = "name"; this.get_samples(); console.log("sample names:", this.sample_names); if (this.sample_attr_vals.length > 0) { @@ -46,88 +47,85 @@ this.create_scales(); this.create_graph(); d3.select("#color_attribute").on("change", function() { - var attribute; - attribute = $("#color_attribute").val(); + _this.attribute = $("#color_attribute").val(); console.log("attr_color_dict:", _this.attr_color_dict); - if ($("#update_bar_chart").html() === 'Sort By Name') { + if (_this.sort_by = "name") { _this.svg.selectAll(".bar").data(_this.sorted_samples()).transition().duration(1000).style("fill", function(d) { - if (attribute === "None") { + if (_this.attribute === "None") { return "steelblue"; } else { - return _this.attr_color_dict[attribute][d[2][attribute]]; + return _this.attr_color_dict[_this.attribute][d[2][_this.attribute]]; } }).select("title").text(function(d) { return d[1]; }); } else { _this.svg.selectAll(".bar").data(_this.samples).transition().duration(1000).style("fill", function(d) { - if (attribute === "None") { + if (_this.attribute === "None") { return "steelblue"; } else { - return _this.attr_color_dict[attribute][d[2][attribute]]; + return _this.attr_color_dict[_this.attribute][d[2][_this.attribute]]; } }); } - return _this.add_legend(attribute, _this.distinct_attr_vals[attribute]); + return _this.add_legend(_this.attribute, _this.distinct_attr_vals[_this.attribute]); }); $(".sort_by_value").on("click", function() { - var sortItems, sorted_sample_names, x_scale; console.log("sorting by value"); - sortItems = function(a, b) { - return a[1] - b[1]; - }; - _this.svg.selectAll(".bar").data(_this.sorted_samples()).transition().duration(1000).attr("y", function(d) { - return _this.y_scale(d[1]); - }).attr("height", function(d) { - return _this.plot_height - _this.y_scale(d[1]); - }).style("fill", function(d) { - if (_this.attributes.length > 0) { - return _this.attr_color_dict[attribute][d[2][attribute]]; - } else { - return "steelblue"; - } - }).select("title").text(function(d) { - return d[1]; - }); - sorted_sample_names = (function() { - var _i, _len, _ref, _results; - _ref = this.sorted_samples(); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - sample = _ref[_i]; - _results.push(sample[0]); - } - return _results; - }).call(_this); - x_scale = d3.scale.ordinal().domain(sorted_sample_names).rangeBands([0, _this.plot_width], .1); - $('.x.axis').remove(); - return _this.add_x_axis(x_scale); + _this.sort_by = "value"; + if (_this.attributes.length > 0) { + _this.attribute = $("#color_attribute").val(); + } + return _this.rebuild_bar_graph(_this.sorted_samples()); }); $(".sort_by_name").on("click", function() { - var x_scale; console.log("sorting by name"); - _this.svg.selectAll(".bar").data(_this.samples).transition().duration(1000).attr("y", function(d) { - return _this.y_scale(d[1]); - }).attr("height", function(d) { - return _this.plot_height - _this.y_scale(d[1]); - }).style("fill", function(d) { - if (_this.attributes.length > 0) { - return _this.attr_color_dict[attribute][d[2][attribute]]; - } else { - return "steelblue"; - } - }).select("title").text(function(d) { - return d[1]; - }); - x_scale = d3.scale.ordinal().domain(_this.sample_names).rangeBands([0, _this.plot_width], .1); - $('.x.axis').remove(); - return _this.add_x_axis(x_scale); + _this.sort_by = "name"; + if (_this.attributes.length > 0) { + _this.attribute = $("#color_attribute").val(); + } + return _this.rebuild_bar_graph(_this.samples); }); d3.select("#color_by_trait").on("click", function() { return _this.open_trait_selection(); }); } + Bar_Chart.prototype.rebuild_bar_graph = function(samples) { + var sample, sample_names, x_scale, + _this = this; + console.log("samples:", samples); + this.svg.selectAll(".bar").data(samples).transition().duration(1000).attr("y", function(d) { + return _this.y_scale(d[1]); + }).attr("height", function(d) { + return _this.plot_height - _this.y_scale(d[1]); + }).select("title").text(function(d) { + return d[1]; + }).style("fill", function(d) { + if (_this.attributes.length > 0 && _this.attribute !== "None") { + console.log("@attribute:", _this.attribute); + console.log("d[2]", d[2]); + console.log("the_color:", _this.attr_color_dict[_this.attribute][d[2][_this.attribute]]); + return _this.attr_color_dict[_this.attribute][d[2][_this.attribute]]; + } else { + return "steelblue"; + } + }); + sample_names = (function() { + var _i, _len, _results; + _results = []; + for (_i = 0, _len = samples.length; _i < _len; _i++) { + sample = samples[_i]; + _results.push(sample[0]); + } + return _results; + })(); + console.log("sample_names2:", sample_names); + x_scale = d3.scale.ordinal().domain(sample_names).rangeBands([0, this.plot_width], .1); + $('.x.axis').remove(); + return this.add_x_axis(x_scale); + }; + Bar_Chart.prototype.get_attr_color_dict = function(vals) { var color, color_range, distinct_vals, i, key, this_color_dict, value, _i, _j, _len, _len1, _results, _this = this; -- cgit v1.2.3 From b73346af1c423103625545168271af7f1389623f Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Tue, 17 Dec 2013 23:29:38 +0000 Subject: Added the option to choose which method to use for the interval mapping function (pyLMM or qtl reaper) --- .../wqflask/interval_mapping/interval_mapping.py | 97 +++++++++++++++------- .../wqflask/marker_regression/marker_regression.py | 1 - .../static/new/javascript/interval_mapping.coffee | 57 ++++++------- .../static/new/javascript/interval_mapping.js | 21 ++--- .../static/new/javascript/marker_regression.coffee | 8 +- .../static/new/javascript/marker_regression.js | 7 +- .../new/javascript/show_trait_mapping_tools.coffee | 5 ++ .../new/javascript/show_trait_mapping_tools.js | 7 +- wqflask/wqflask/templates/base.html | 2 +- wqflask/wqflask/templates/interval_mapping.html | 15 ++-- wqflask/wqflask/templates/show_trait.html | 4 +- .../templates/show_trait_mapping_tools.html | 16 +++- wqflask/wqflask/views.py | 1 + 13 files changed, 153 insertions(+), 88 deletions(-) diff --git a/wqflask/wqflask/interval_mapping/interval_mapping.py b/wqflask/wqflask/interval_mapping/interval_mapping.py index de7a2704..f0985cc2 100755 --- a/wqflask/wqflask/interval_mapping/interval_mapping.py +++ b/wqflask/wqflask/interval_mapping/interval_mapping.py @@ -37,8 +37,6 @@ class IntervalMapping(object): def __init__(self, start_vars, temp_uuid): - print("TESTING!!!") - #Currently only getting trait data for one trait, but will need #to change this to accept multiple traits once the collection page is implemented helper_functions.get_species_dataset_trait(self, start_vars) @@ -57,7 +55,11 @@ class IntervalMapping(object): self.set_options(start_vars) - self.gen_qtl_results(tempdata) + if self.method == "qtl_reaper": + self.gen_reaper_results(tempdata) + else: + self.gen_pylmm_results(tempdata) + #self.gen_qtl_results(tempdata) #Get chromosome lengths for drawing the interval map plot chromosome_mb_lengths = {} @@ -78,6 +80,7 @@ class IntervalMapping(object): #self.plot_scale = start_vars['scale'] #if self.plotScale == 'physic' and not fd.genotype.Mbmap: # self.plotScale = 'morgan' + self.method = start_vars['mapping_method'] self.num_permutations = int(start_vars['num_permutations']) #self.do_bootstrap = start_vars['do_bootstrap'] self.selected_chr = start_vars['chromosome'] @@ -125,9 +128,6 @@ class IntervalMapping(object): # variance = variances, # control = self.control_locus) #else: - #reaper_results = self.dataset.group.genotype.regression(strains = trimmed_samples, - # trait = trimmed_values, - # control = self.control_locus) reaper_results = genotype.regression(strains = trimmed_samples, trait = trimmed_values, control = self.control_locus) @@ -139,8 +139,6 @@ class IntervalMapping(object): #else: print("strains:", trimmed_samples) print("trait:", trimmed_values) - #reaper_results = self.dataset.group.genotype.regression(strains = trimmed_samples, - # trait = trimmed_values) reaper_results = genotype.regression(strains = trimmed_samples, trait = trimmed_values) @@ -152,29 +150,70 @@ class IntervalMapping(object): qtl = {"lrs": qtl.lrs, "locus": locus, "additive": qtl.additive} self.qtl_results.append(qtl) - #pheno_vector = np.array([val == "x" and np.nan or float(val) for val in self.vals]) - #if self.dataset.group.species == "human": - # p_values, t_stats = self.gen_human_results(pheno_vector, tempdata) - #else: - #genotype_data = [marker['genotypes'] for marker in self.dataset.group.markers.markers] - # - #no_val_samples = self.identify_empty_samples() - #trimmed_genotype_data = self.trim_genotypes(genotype_data, no_val_samples) - # - #genotype_matrix = np.array(trimmed_genotype_data).T - - #t_stats, p_values = lmm.run( - # pheno_vector, - # genotype_matrix, - # restricted_max_likelihood=True, - # refit=False, - # temp_data=tempdata - #) - - #self.dataset.group.markers.add_pvalues(p_values) + def gen_reaper_results(self, tempdata): + genotype = self.dataset.group.read_genotype_file() + + samples, values, variances = self.this_trait.export_informative() + + trimmed_samples = [] + trimmed_values = [] + for i in range(0, len(samples)): + if samples[i] in self.dataset.group.samplelist: + trimmed_samples.append(samples[i]) + trimmed_values.append(values[i]) + + self.lrs_array = genotype.permutation(strains = trimmed_samples, + trait = trimmed_values, + nperm= self.num_permutations) + self.suggestive = self.lrs_array[int(self.num_permutations*0.37-1)] + self.significant = self.lrs_array[int(self.num_permutations*0.95-1)] + + print("samples:", trimmed_samples) + + if self.control_locus: + reaper_results = genotype.regression(strains = trimmed_samples, + trait = trimmed_values, + control = self.control_locus) + else: + reaper_results = genotype.regression(strains = trimmed_samples, + trait = trimmed_values) + + #Need to convert the QTL objects that qtl reaper returns into a json serializable dictionary + self.qtl_results = [] + for qtl in reaper_results: + reaper_locus = qtl.locus + locus = {"name":reaper_locus.name, "chr":reaper_locus.chr, "cM":reaper_locus.cM, "Mb":reaper_locus.Mb} + qtl = {"lrs_value": qtl.lrs, "chr":reaper_locus.chr, "Mb":reaper_locus.Mb, + "cM":reaper_locus.cM, "name":reaper_locus.name, "additive":qtl.additive} + self.qtl_results.append(qtl) + + def gen_pylmm_results(self, tempdata): + print("USING PYLMM") + self.dataset.group.get_markers() - #self.qtl_results = self.dataset.group.markers.markers + pheno_vector = np.array([val == "x" and np.nan or float(val) for val in self.vals]) + if self.dataset.group.species == "human": + p_values, t_stats = self.gen_human_results(pheno_vector, tempdata) + else: + genotype_data = [marker['genotypes'] for marker in self.dataset.group.markers.markers] + + no_val_samples = self.identify_empty_samples() + trimmed_genotype_data = self.trim_genotypes(genotype_data, no_val_samples) + + genotype_matrix = np.array(trimmed_genotype_data).T + + t_stats, p_values = lmm.run( + pheno_vector, + genotype_matrix, + restricted_max_likelihood=True, + refit=False, + temp_data=tempdata + ) + + print("p_values:", p_values) + self.dataset.group.markers.add_pvalues(p_values) + self.qtl_results = self.dataset.group.markers.markers def gen_qtl_results_2(self, tempdata): """Generates qtl results for plotting interval map""" diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index 334ce631..006c586b 100755 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -91,7 +91,6 @@ class MarkerRegression(object): ) self.dataset.group.markers.add_pvalues(p_values) - self.qtl_results = self.dataset.group.markers.markers diff --git a/wqflask/wqflask/static/new/javascript/interval_mapping.coffee b/wqflask/wqflask/static/new/javascript/interval_mapping.coffee index 0aa21d97..81db186b 100644 --- a/wqflask/wqflask/static/new/javascript/interval_mapping.coffee +++ b/wqflask/wqflask/static/new/javascript/interval_mapping.coffee @@ -66,30 +66,30 @@ $ -> chr_lengths.push(this_length) cumulative_chr_lengths.push(total_length + this_length) total_length += this_length - + console.log("chr_lengths: ", chr_lengths) - + return [chr_lengths, cumulative_chr_lengths] - + create_coordinates: () -> chr_lengths = [] chr_seen = [] for result in js_data.qtl_results - if result.locus.chr == "X" + if result.chr == "X" chr_length = parseFloat(@chromosomes[20]) else - chr_length = parseFloat(@chromosomes[result.locus.chr]) - if not(result.locus.chr in chr_seen) - chr_seen.push(result.locus.chr) + chr_length = parseFloat(@chromosomes[result.chr]) + if not(result.chr in chr_seen) + chr_seen.push(result.chr) chr_lengths.push(chr_length) - if result.locus.chr != "1" + if result.chr != "1" @total_length += parseFloat(chr_lengths[chr_lengths.length - 2]) - @x_coords.push(@total_length + parseFloat(result.locus.Mb)) - @y_coords.push(result.lrs) - @marker_names.push(result.locus.name) + @x_coords.push(@total_length + parseFloat(result.Mb)) + @y_coords.push(result.lrs_value) + @marker_names.push(result.name) @total_length += parseFloat(chr_lengths[chr_lengths.length-1]) #console.log("chr_lengths: ", chr_lengths) - + create_svg: () -> svg = d3.select("#interval_map") .append("svg") @@ -98,7 +98,7 @@ $ -> .attr("height", @plot_height+@y_buffer) return svg - + create_graph: () -> @add_border() @add_x_axis() @@ -107,13 +107,13 @@ $ -> @fill_chr_areas() @add_chr_labels() @connect_markers() - + add_border: () -> border_coords = [[@y_buffer, @plot_height, @x_buffer, @x_buffer], [@y_buffer, @plot_height, @plot_width, @plot_width], [@y_buffer, @y_buffer, @x_buffer, @plot_width], [@plot_height, @plot_height, @x_buffer, @plot_width]] - + @svg.selectAll("line") .data(border_coords) .enter() @@ -131,16 +131,16 @@ $ -> return d[3] ) .style("stroke", "#000") - + create_scales: () -> @x_scale = d3.scale.linear() .domain([0, d3.max(@x_coords)]) .range([@x_buffer, @plot_width]) - + @y_scale = d3.scale.linear() .domain([0, @y_max]) .range([@plot_height, @y_buffer]) - + create_x_axis_tick_values: () -> tick_vals = [] for val in [25..@cumulative_chr_lengths[0]] when val%25 == 0 @@ -159,13 +159,13 @@ $ -> #console.log("tick_vals:", tick_vals) return tick_vals - + add_x_axis: () -> xAxis = d3.svg.axis() .scale(@x_scale) .orient("bottom") .tickValues(@create_x_axis_tick_values()) - + next_chr = 1 tmp_tick_val = 0 xAxis.tickFormat((d) => @@ -183,7 +183,7 @@ $ -> tick_val = tmp_tick_val return (tick_val) ) - + @svg.append("g") .attr("class", "x_axis") .attr("transform", "translate(0," + @plot_height + ")") @@ -196,7 +196,7 @@ $ -> ) #.attr("dy", "-1.0em") - + add_y_axis: () -> yAxis = d3.svg.axis() .scale(@y_scale) @@ -207,7 +207,7 @@ $ -> .attr("class", "y_axis") .attr("transform", "translate(" + @x_buffer + ",0)") .call(yAxis) - + add_chr_lines: () -> @svg.selectAll("line") .data(@cumulative_chr_lengths, (d) => @@ -241,7 +241,7 @@ $ -> ) .attr("height", @plot_height-@y_buffer) .attr("fill", "white") - + add_chr_labels: () -> chr_names = [] for key of @chromosomes @@ -265,7 +265,7 @@ $ -> .attr("font-family", "sans-serif") .attr("font-size", "18px") #.attr("fill", "grey") - + connect_markers: () -> @svg.selectAll("line") .data(@plot_coordinates) @@ -290,7 +290,8 @@ $ -> return @plot_height - ((@plot_height-@y_buffer) * d[1]/@y_max) ) .style("stroke", "black") - - console.time('Create manhattan plot') + + console.time('Create interval map') + console.log("TESTING") new Interval_Map(600, 1200) - console.timeEnd('Create manhattan plot') \ No newline at end of file + console.timeEnd('Create interval map') \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/interval_mapping.js b/wqflask/wqflask/static/new/javascript/interval_mapping.js index 521a1c7a..3a2ce6d7 100644 --- a/wqflask/wqflask/static/new/javascript/interval_mapping.js +++ b/wqflask/wqflask/static/new/javascript/interval_mapping.js @@ -85,21 +85,21 @@ _ref = js_data.qtl_results; for (_i = 0, _len = _ref.length; _i < _len; _i++) { result = _ref[_i]; - if (result.locus.chr === "X") { + if (result.chr === "X") { chr_length = parseFloat(this.chromosomes[20]); } else { - chr_length = parseFloat(this.chromosomes[result.locus.chr]); + chr_length = parseFloat(this.chromosomes[result.chr]); } - if (!(_ref1 = result.locus.chr, __indexOf.call(chr_seen, _ref1) >= 0)) { - chr_seen.push(result.locus.chr); + if (!(_ref1 = result.chr, __indexOf.call(chr_seen, _ref1) >= 0)) { + chr_seen.push(result.chr); chr_lengths.push(chr_length); - if (result.locus.chr !== "1") { + if (result.chr !== "1") { this.total_length += parseFloat(chr_lengths[chr_lengths.length - 2]); } } - this.x_coords.push(this.total_length + parseFloat(result.locus.Mb)); - this.y_coords.push(result.lrs); - this.marker_names.push(result.locus.name); + this.x_coords.push(this.total_length + parseFloat(result.Mb)); + this.y_coords.push(result.lrs_value); + this.marker_names.push(result.name); } return this.total_length += parseFloat(chr_lengths[chr_lengths.length - 1]); }; @@ -264,9 +264,10 @@ return Interval_Map; })(); - console.time('Create manhattan plot'); + console.time('Create interval map'); + console.log("TESTING"); new Interval_Map(600, 1200); - return console.timeEnd('Create manhattan plot'); + return console.timeEnd('Create interval map'); }); }).call(this); diff --git a/wqflask/wqflask/static/new/javascript/marker_regression.coffee b/wqflask/wqflask/static/new/javascript/marker_regression.coffee index 2892987e..f5f13c27 100644 --- a/wqflask/wqflask/static/new/javascript/marker_regression.coffee +++ b/wqflask/wqflask/static/new/javascript/marker_regression.coffee @@ -49,10 +49,10 @@ $ -> get_chr_lengths: () -> ### - Gets a list of both individual and cumulative (the position of one on the graph - is its own length plus the lengths of all preceding chromosomes) lengths in order - to draw the vertical lines separating chromosomes and the chromosome labels - + #Gets a list of both individual and cumulative (the position of one on the graph + #is its own length plus the lengths of all preceding chromosomes) lengths in order + #to draw the vertical lines separating chromosomes and the chromosome labels + # ### console.log("@chromosomes: ", @chromosomes) diff --git a/wqflask/wqflask/static/new/javascript/marker_regression.js b/wqflask/wqflask/static/new/javascript/marker_regression.js index ffcf1a75..cdf37671 100644 --- a/wqflask/wqflask/static/new/javascript/marker_regression.js +++ b/wqflask/wqflask/static/new/javascript/marker_regression.js @@ -57,9 +57,10 @@ Manhattan_Plot.prototype.get_chr_lengths = function() { /* - Gets a list of both individual and cumulative (the position of one on the graph - is its own length plus the lengths of all preceding chromosomes) lengths in order - to draw the vertical lines separating chromosomes and the chromosome labels + #Gets a list of both individual and cumulative (the position of one on the graph + #is its own length plus the lengths of all preceding chromosomes) lengths in order + #to draw the vertical lines separating chromosomes and the chromosome labels + # */ var chr_lengths, cumulative_chr_lengths, key, this_length, total_length; diff --git a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee index 8571753e..df9bfc9d 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee +++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee @@ -53,6 +53,7 @@ $ -> return false $("#interval_mapping_compute").click(() => + console.log("In interval mapping") $("#progress_bar_container").modal() url = "/interval_mapping" form_data = $('#trait_data_form').serialize() @@ -118,8 +119,12 @@ $ -> composite_mapping_fields = -> $(".composite_fields").toggle() + mapping_method_fields = -> + $(".mapping_method_fields").toggle() + $("#use_composite_choice").change(composite_mapping_fields) + $("#mapping_method_choice").change(mapping_method_fields) #### Todo: Redo below so its like submit_special and requires no js hardcoding diff --git a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js index 1153b8ef..b474bd80 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js +++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js @@ -5,7 +5,7 @@ root = typeof exports !== "undefined" && exports !== null ? exports : this; $(function() { - var composite_mapping_fields, get_progress, submit_special, toggle_enable_disable, update_time_remaining, + var composite_mapping_fields, get_progress, mapping_method_fields, submit_special, toggle_enable_disable, update_time_remaining, _this = this; submit_special = function() { var url; @@ -64,6 +64,7 @@ }; $("#interval_mapping_compute").click(function() { var form_data, url; + console.log("In interval mapping"); $("#progress_bar_container").modal(); url = "/interval_mapping"; form_data = $('#trait_data_form').serialize(); @@ -128,7 +129,11 @@ composite_mapping_fields = function() { return $(".composite_fields").toggle(); }; + mapping_method_fields = function() { + return $(".mapping_method_fields").toggle(); + }; $("#use_composite_choice").change(composite_mapping_fields); + $("#mapping_method_choice").change(mapping_method_fields); toggle_enable_disable = function(elem) { return $(elem).prop("disabled", !$(elem).prop("disabled")); }; diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html index 0360f619..9b98c955 100644 --- a/wqflask/wqflask/templates/base.html +++ b/wqflask/wqflask/templates/base.html @@ -212,7 +212,7 @@ - + diff --git a/wqflask/wqflask/templates/interval_mapping.html b/wqflask/wqflask/templates/interval_mapping.html index 25de2dc1..e4e08388 100644 --- a/wqflask/wqflask/templates/interval_mapping.html +++ b/wqflask/wqflask/templates/interval_mapping.html @@ -1,7 +1,6 @@ {% extends "base.html" %} {% block title %}Interval Mapping{% endblock %} {% block css %} - @@ -31,7 +30,9 @@ Index LRS Score + {% if method == "qtl_reaper" %} Additive Effect + {% endif %} Chr Mb Locus @@ -41,11 +42,13 @@ {% for marker in qtl_results %} {{ loop.index }} - {{ marker.lrs|float }} + {{ marker.lrs_value|float }} + {% if method == "qtl_reaper" %} {{ marker.additive|float }} - {{ marker.locus.chr|int }} - {{ marker.locus.Mb|float }} - {{ marker.locus.name }} + {% endif %} + {{ marker.chr|int }} + {{ marker.Mb|float }} + {{ marker.name }} {% endfor %} @@ -63,7 +66,7 @@ diff --git a/wqflask/wqflask/templates/show_trait.html b/wqflask/wqflask/templates/show_trait.html index 0ad6eedb..86891bb0 100644 --- a/wqflask/wqflask/templates/show_trait.html +++ b/wqflask/wqflask/templates/show_trait.html @@ -59,8 +59,8 @@ - - + + {% endblock %} diff --git a/wqflask/wqflask/templates/show_trait_mapping_tools.html b/wqflask/wqflask/templates/show_trait_mapping_tools.html index a835a41b..58ee8982 100644 --- a/wqflask/wqflask/templates/show_trait_mapping_tools.html +++ b/wqflask/wqflask/templates/show_trait_mapping_tools.html @@ -16,6 +16,16 @@
+
+ +
+ +
+
+
@@ -28,14 +38,14 @@
-
+
-
+
@@ -44,7 +54,7 @@
-
+