From baff5eb1e890a4a8b33fb1917a1c17d3b1737959 Mon Sep 17 00:00:00 2001 From: zsloan Date: Fri, 26 Jun 2015 18:29:49 +0000 Subject: Fixed bug where mapping results sometimes wouldn't display. This would occur due to a chromosome (in this case the last) not having any markers. Improved the way plink gets its path/command to use a method similar to the one Pjotr used with pylmm. I'll also do this for the other mapping methods. Fixed issue where the Y axis would always say LOD score. It now says LRS for mapping methods that return LRS Switched interval mapping (qtl reaper) to use the marker_regression template and removed the interval_mapping template (since it's unnecessary) Some commented out changes remain (in show_trait_mapping_tools and create_lodchart) from when I was attempting to open the mapping results in a new page. I had resolved every issue but the mapping javascript (lod_chart) not being able to access js_data (which has all the result data; markers, p-values, etc). I'm pretty sure that this is because js_data was inserted into the html after the page was loaded while the chart code ran immediately. I experimented with adding a short timeout to the mapping javascript and data table javascript, but while it worked for the table it did not work for the mapping figure. I don't know why this is. --- wqflask/utility/tools.py | 18 + wqflask/wqflask/do_search.py | 2 +- .../wqflask/interval_mapping/interval_mapping.py | 3 +- .../wqflask/marker_regression/marker_regression.py | 28 +- .../static/new/javascript/create_lodchart.coffee | 11 +- .../static/new/javascript/create_lodchart.js | 10 +- .../wqflask/static/new/javascript/lod_chart.coffee | 1031 ++++++++++---------- wqflask/wqflask/static/new/javascript/lod_chart.js | 54 +- .../wqflask/static/new/javascript/panelutil.coffee | 19 +- wqflask/wqflask/static/new/javascript/panelutil.js | 13 +- .../new/javascript/show_trait_mapping_tools.coffee | 44 +- .../new/javascript/show_trait_mapping_tools.js | 413 ++++---- wqflask/wqflask/templates/interval_mapping.html | 117 --- wqflask/wqflask/templates/old_index_page.html | 320 ------ wqflask/wqflask/views.py | 6 +- 15 files changed, 838 insertions(+), 1251 deletions(-) delete mode 100755 wqflask/wqflask/templates/interval_mapping.html delete mode 100755 wqflask/wqflask/templates/old_index_page.html (limited to 'wqflask') diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index 1a5c19d9..6e35f00a 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -49,3 +49,21 @@ def pylmm_command(default=None): path = get_setting('PYLMM_PATH',default,guess,get_valid_path) pylmm_command = 'python '+path+'/pylmm_gn2/lmm.py' return path,pylmm_command + +def plink_command(default=None): + """ + Return the path to the repository and the python command to call + """ + def get_valid_path(path): + """Test for a valid repository""" + if path: + sys.stderr.write("Trying PLINK_PATH in "+path+"\n") + if path and os.path.isfile(path+'/plink'): + return path + else: + None + + guess = os.environ.get('HOME')+'/plink' + path = get_setting('PLINK_PATH',default,guess,get_valid_path) + plink_command = path+'/plink' + return path,plink_command \ No newline at end of file diff --git a/wqflask/wqflask/do_search.py b/wqflask/wqflask/do_search.py index 8c1b6730..cec71777 100755 --- a/wqflask/wqflask/do_search.py +++ b/wqflask/wqflask/do_search.py @@ -115,7 +115,7 @@ class MrnaAssaySearch(DoSearch): DoSearch.search_types['ProbeSet'] = "MrnaAssaySearch" - base_query = """SELECT ProbeSet.Name as TNAME, + base_query = """SELECT distinct ProbeSet.Name as TNAME, 0 as thistable, ProbeSetXRef.Mean as TMEAN, ProbeSetXRef.LRS as TLRS, diff --git a/wqflask/wqflask/interval_mapping/interval_mapping.py b/wqflask/wqflask/interval_mapping/interval_mapping.py index 5f491652..672a9401 100755 --- a/wqflask/wqflask/interval_mapping/interval_mapping.py +++ b/wqflask/wqflask/interval_mapping/interval_mapping.py @@ -74,6 +74,7 @@ class IntervalMapping(object): json.dumps(self.json_data, webqtlConfig.TMPDIR + json_filename) self.js_data = dict( + result_score_type = "LRS", manhattan_plot = self.manhattan_plot, additive = self.additive, chromosomes = chromosome_mb_lengths, @@ -88,7 +89,7 @@ class IntervalMapping(object): if start_vars['num_perm'] == "": self.num_permutations = 0 else: - self.num_permutations = start_vars['num_perm'] + self.num_permutations = int(start_vars['num_perm']) if start_vars['manhattan_plot'] == "true": self.manhattan_plot = True else: diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index 2b0e89b3..c003f5e8 100755 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -39,9 +39,10 @@ from utility import helper_functions from utility import Plot, Bunch from utility import temp_data from utility.benchmark import Bench -from utility.tools import pylmm_command +from utility.tools import pylmm_command, plink_command PYLMM_PATH,PYLMM_COMMAND = pylmm_command() +PLINK_PATH,PLINK_COMMAND = plink_command() class MarkerRegression(object): @@ -178,6 +179,7 @@ class MarkerRegression(object): self.js_data = dict( + result_score_type = "LOD", json_data = self.json_data, this_trait = self.this_trait.name, data_set = self.dataset.name, @@ -458,29 +460,16 @@ class MarkerRegression(object): def run_plink(self): - - os.chdir("/home/zas1024/plink") - plink_output_filename = webqtlUtil.genRandStr("%s_%s_"%(self.dataset.group.name, self.this_trait.name)) self.gen_pheno_txt_file_plink(pheno_filename = plink_output_filename) - plink_command = './plink --noweb --ped %s.ped --no-fid --no-parents --no-sex --no-pheno --map %s.map --pheno %s/%s.txt --pheno-name %s --maf %s --missing-phenotype -9999 --out %s%s --assoc ' % (self.dataset.group.name, self.dataset.group.name, webqtlConfig.TMPDIR, plink_output_filename, self.this_trait.name, self.maf, webqtlConfig.TMPDIR, plink_output_filename) - + plink_command = PLINK_COMMAND + ' --noweb --ped %s/%s.ped --no-fid --no-parents --no-sex --no-pheno --map %s/%s.map --pheno %s%s.txt --pheno-name %s --maf %s --missing-phenotype -9999 --out %s%s --assoc ' % (PLINK_PATH, self.dataset.group.name, PLINK_PATH, self.dataset.group.name, webqtlConfig.TMPDIR, plink_output_filename, self.this_trait.name, self.maf, webqtlConfig.TMPDIR, plink_output_filename) + print("plink_command:", plink_command) + os.system(plink_command) count, p_values = self.parse_plink_output(plink_output_filename) - #gemma_command = './gemma -bfile %s -k output_%s.cXX.txt -lmm 1 -o %s_output' % ( - # self.dataset.group.name, - # self.dataset.group.name, - # self.dataset.group.name) - #print("gemma_command:" + gemma_command) - # - #os.system(gemma_command) - # - #included_markers, p_values = self.parse_gemma_output() - # - #self.dataset.group.get_specified_markers(markers = included_markers) #for marker in self.dataset.group.markers.markers: # if marker['name'] not in included_markers: @@ -567,10 +556,7 @@ class MarkerRegression(object): # get strain name from ped file in order def get_samples_from_ped_file(self): - - os.chdir("/home/zas1024/plink") - - ped_file= open("{}.ped".format(self.dataset.group.name),"r") + ped_file= open("{}/{}.ped".format(PLINK_PATH, self.dataset.group.name),"r") line = ped_file.readline() sample_list=[] diff --git a/wqflask/wqflask/static/new/javascript/create_lodchart.coffee b/wqflask/wqflask/static/new/javascript/create_lodchart.coffee index f1da65d7..df176f52 100644 --- a/wqflask/wqflask/static/new/javascript/create_lodchart.coffee +++ b/wqflask/wqflask/static/new/javascript/create_lodchart.coffee @@ -1,4 +1,4 @@ -create_manhattan_plot = -> +create_lod_chart = -> h = 500 w = 1200 margin = {left:60, top:40, right:40, bottom: 40, inner:5} @@ -18,7 +18,7 @@ create_manhattan_plot = -> .height(h) .width(w) .margin(margin) - .ylab("LOD score") + .ylab(js_data.result_score_type + " score") .manhattanPlot(js_data.manhattan_plot) #.additive(additive) @@ -45,7 +45,12 @@ create_manhattan_plot = -> .transition().duration(500).attr("r", r*3) .transition().duration(500).attr("r", r) -root.create_manhattan_plot = create_manhattan_plot +$ -> + #window.setTimeout ( -> + # console.log(js_data) + #), 1000 + #window.setTimeout(create_lod_chart(), 1000) + root.create_lod_chart = create_lod_chart $("#export").click => #Get d3 SVG element diff --git a/wqflask/wqflask/static/new/javascript/create_lodchart.js b/wqflask/wqflask/static/new/javascript/create_lodchart.js index 546d7c18..a7cea8a5 100644 --- a/wqflask/wqflask/static/new/javascript/create_lodchart.js +++ b/wqflask/wqflask/static/new/javascript/create_lodchart.js @@ -1,8 +1,8 @@ -// Generated by CoffeeScript 1.9.2 +// Generated by CoffeeScript 1.8.0 (function() { - var create_manhattan_plot; + var create_lod_chart; - create_manhattan_plot = function() { + create_lod_chart = function() { var additive, chrrect, data, h, halfh, margin, mychart, totalh, totalw, w; h = 500; w = 1200; @@ -22,7 +22,7 @@ additive = false; } console.log("js_data:", js_data); - mychart = lodchart().lodvarname("lod.hk").height(h).width(w).margin(margin).ylab("LOD score").manhattanPlot(js_data.manhattan_plot); + mychart = lodchart().lodvarname("lod.hk").height(h).width(w).margin(margin).ylab(js_data.result_score_type + " score").manhattanPlot(js_data.manhattan_plot); data = js_data.json_data; d3.select("div#topchart").datum(data).call(mychart); chrrect = mychart.chrSelect(); @@ -43,7 +43,7 @@ }); }; - root.create_manhattan_plot = create_manhattan_plot; + root.create_lod_chart = create_lod_chart; $("#export").click((function(_this) { return function() { diff --git a/wqflask/wqflask/static/new/javascript/lod_chart.coffee b/wqflask/wqflask/static/new/javascript/lod_chart.coffee index b0f4b2f5..55ffdce0 100644 --- a/wqflask/wqflask/static/new/javascript/lod_chart.coffee +++ b/wqflask/wqflask/static/new/javascript/lod_chart.coffee @@ -1,514 +1,517 @@ -lodchart = () -> - width = 800 - height = 500 - margin = {left:60, top:40, right:40, bottom: 40, inner:5} - axispos = {xtitle:25, ytitle:30, xlabel:5, ylabel:5} - titlepos = 20 - manhattanPlot = false - additive = false - ylim = null - additive_ylim = null - nyticks = 5 - yticks = null - additive_yticks = null - chrGap = 8 - darkrect = "#F1F1F9" - lightrect = "#FBFBFF" - lodlinecolor = "darkslateblue" - additivelinecolor = "red" - linewidth = 2 - suggestivecolor = "gainsboro" - significantcolor = "#EBC7C7" - pointcolor = "#E9CFEC" # pink - pointsize = 0 # default = no visible points at markers - pointstroke = "black" - title = "" - xlab = "Chromosome" - ylab = "LRS score" - additive_ylab = "Additive Effect" - rotate_ylab = null - yscale = d3.scale.linear() - additive_yscale = d3.scale.linear() - xscale = null - pad4heatmap = false - lodcurve = null - lodvarname = null - markerSelect = null - chrSelect = null - pointsAtMarkers = true - - - ## the main function - chart = (selection) -> - selection.each (data) -> - - #console.log("data:", data) - - if manhattanPlot == true - pointcolor = "darkslateblue" - pointsize = 2 - - lodvarname = lodvarname ? data.lodnames[0] - data[lodvarname] = (Math.abs(x) for x in data[lodvarname]) # take absolute values - ylim = ylim ? [0, d3.max(data[lodvarname])] - if additive - data['additive'] = (Math.abs(x) for x in data['additive']) - additive_ylim = additive_ylim ? [0, d3.max(data['additive'])] - - lodvarnum = data.lodnames.indexOf(lodvarname) - - # Select the svg element, if it exists. - svg = d3.select(this).selectAll("svg").data([data]) - - # Otherwise, create the skeletal chart. - gEnter = svg.enter().append("svg").append("g") - - # Update the outer dimensions. - svg.attr("width", width+margin.left+margin.right) - .attr("height", height+margin.top+margin.bottom) - - # Update the inner dimensions. - g = svg.select("g") - - # box - g.append("rect") - .attr("x", margin.left) - .attr("y", margin.top) - .attr("height", height) - .attr("width", width) - .attr("fill", darkrect) - .attr("stroke", "none") - - yscale.domain(ylim) - .range([height+margin.top, margin.top+margin.inner]) - - # if yticks not provided, use nyticks to choose pretty ones - yticks = yticks ? yscale.ticks(nyticks) - - #if data['additive'].length > 0 - if additive - additive_yscale.domain(additive_ylim) - .range([height+margin.top, margin.top+margin.inner + height/2]) - - additive_yticks = additive_yticks ? additive_yscale.ticks(nyticks) - - # reorganize lod,pos by chromosomes - reorgLodData(data, lodvarname) - - # add chromosome scales (for x-axis) - data = chrscales(data, width, chrGap, margin.left, pad4heatmap) - xscale = data.xscale - - # chr rectangles - chrSelect = - g.append("g").attr("class", "chrRect") - .selectAll("empty") - .data(data.chrnames) - .enter() - .append("rect") - .attr("id", (d) -> "chrrect#{d[0]}") - .attr("x", (d,i) -> - return data.chrStart[i] if i==0 and pad4heatmap - data.chrStart[i]-chrGap/2) - .attr("width", (d,i) -> - return data.chrEnd[i] - data.chrStart[i]+chrGap/2 if (i==0 or i+1 == data.chrnames.length) and pad4heatmap - data.chrEnd[i] - data.chrStart[i]+chrGap) - .attr("y", margin.top) - .attr("height", height) - .attr("fill", (d,i) -> - return darkrect if i % 2 - lightrect) - .attr("stroke", "none") - .on("click", (d) -> - console.log("d is:", d) - redraw_plot(d) - ) - - # x-axis labels - xaxis = g.append("g").attr("class", "x axis") - xaxis.selectAll("empty") - .data(data.chrnames) - .enter() - .append("text") - .text((d) -> d[0]) - .attr("x", (d,i) -> (data.chrStart[i]+data.chrEnd[i])/2) - .attr("y", margin.top+height+axispos.xlabel) - .attr("dominant-baseline", "hanging") - .attr("text-anchor", "middle") - .attr("cursor", "pointer") - .on("click", (d) -> - redraw_plot(d) - ) - - xaxis.append("text").attr("class", "title") - .attr("y", margin.top+height+axispos.xtitle) - .attr("x", margin.left+width/2) - .attr("fill", "slateblue") - .text(xlab) - - - redraw_plot = (chr_ob) -> - #console.log("chr_name is:", chr_ob[0]) - #console.log("chr_length is:", chr_ob[1]) - $('#topchart').remove() - $('#chart_container').append('
') - chr_plot = new Chr_Lod_Chart(600, 1200, chr_ob, manhattanPlot) - - # y-axis - rotate_ylab = rotate_ylab ? (ylab.length > 1) - yaxis = g.append("g").attr("class", "y axis") - yaxis.selectAll("empty") - .data(yticks) - .enter() - .append("line") - .attr("y1", (d) -> yscale(d)) - .attr("y2", (d) -> yscale(d)) - .attr("x1", margin.left) - .attr("x2", margin.left+7) - .attr("fill", "none") - .attr("stroke", "white") - .attr("stroke-width", 1) - .style("pointer-events", "none") - - yaxis.selectAll("empty") - .data(yticks) - .enter() - .append("text") - .attr("y", (d) -> yscale(d)) - .attr("x", margin.left-axispos.ylabel) - .attr("fill", "blue") - .attr("dominant-baseline", "middle") - .attr("text-anchor", "end") - .text((d) -> formatAxis(yticks)(d)) - - yaxis.append("text").attr("class", "title") - .attr("y", margin.top+height/2) - .attr("x", margin.left-axispos.ytitle) - .text(ylab) - .attr("transform", if rotate_ylab then "rotate(270,#{margin.left-axispos.ytitle},#{margin.top+height/2})" else "") - .attr("text-anchor", "middle") - .attr("fill", "slateblue") - - #if data['additive'].length > 0 - if additive - rotate_additive_ylab = rotate_additive_ylab ? (additive_ylab.length > 1) - additive_yaxis = g.append("g").attr("class", "y axis") - additive_yaxis.selectAll("empty") - .data(additive_yticks) - .enter() - .append("line") - .attr("y1", (d) -> additive_yscale(d)) - .attr("y2", (d) -> additive_yscale(d)) - .attr("x1", margin.left + width) - .attr("x2", margin.left + width - 7) - .attr("fill", "none") - .attr("stroke", "white") - .attr("stroke-width", 1) - .style("pointer-events", "none") - - additive_yaxis.selectAll("empty") - .data(additive_yticks) - .enter() - .append("text") - .attr("y", (d) -> additive_yscale(d)) - .attr("x", (d) -> margin.left + width + axispos.ylabel + 20) - .attr("fill", "green") - .attr("dominant-baseline", "middle") - .attr("text-anchor", "end") - .text((d) -> formatAxis(additive_yticks)(d)) - - additive_yaxis.append("text").attr("class", "title") - .attr("y", margin.top+1.5*height) - .attr("x", margin.left + width + axispos.ytitle) - .text(additive_ylab) - .attr("transform", if rotate_additive_ylab then "rotate(270,#{margin.left + width + axispos.ytitle}, #{margin.top+height*1.5})" else "") - .attr("text-anchor", "middle") - .attr("fill", "green") - - if 'suggestive' of data - suggestive_bar = g.append("g").attr("class", "suggestive") - suggestive_bar.selectAll("empty") - .data([data.suggestive]) - .enter() - .append("line") - .attr("y1", (d) -> yscale(d)) - .attr("y2", (d) -> yscale(d)) - .attr("x1", margin.left) - .attr("x2", margin.left+width) - .attr("fill", "none") - .attr("stroke", suggestivecolor) - .attr("stroke-width", 5) - .style("pointer-events", "none") - - suggestive_bar = g.append("g").attr("class", "significant") - suggestive_bar.selectAll("empty") - .data([data.significant]) - .enter() - .append("line") - .attr("y1", (d) -> yscale(d)) - .attr("y2", (d) -> yscale(d)) - .attr("x1", margin.left) - .attr("x2", margin.left+width) - .attr("fill", "none") - .attr("stroke", significantcolor) - .attr("stroke-width", 5) - .style("pointer-events", "none") - - if manhattanPlot == false - # lod curves by chr - lodcurve = (chr, lodcolumn) -> - d3.svg.line() - .x((d) -> xscale[chr](d)) - .y((d,i) -> yscale(data.lodByChr[chr][i][lodcolumn])) - - if additive - additivecurve = (chr, lodcolumn) -> - d3.svg.line() - .x((d) -> xscale[chr](d)) - .y((d,i) -> additive_yscale(data.additiveByChr[chr][i][lodcolumn])) - - curves = g.append("g").attr("id", "curves") - - for chr in data.chrnames - curves.append("path") - .datum(data.posByChr[chr[0]]) - .attr("d", lodcurve(chr[0], lodvarnum)) - .attr("stroke", lodlinecolor) - .attr("fill", "none") - .attr("stroke-width", linewidth) - .style("pointer-events", "none") - - if additive - for chr in data.chrnames - curves.append("path") - .datum(data.posByChr[chr[0]]) - .attr("d", additivecurve(chr[0], lodvarnum)) - .attr("stroke", additivelinecolor) - .attr("fill", "none") - .attr("stroke-width", 1) - .style("pointer-events", "none") - - # points at markers - console.log("before pointsize") - if pointsize > 0 - console.log("pointsize > 0 !!!") - markerpoints = g.append("g").attr("id", "markerpoints_visible") - markerpoints.selectAll("empty") - .data(data.markers) - .enter() - .append("circle") - .attr("cx", (d) -> xscale[d.chr](d.pos)) - .attr("cy", (d) -> yscale(d.lod)) - .attr("r", pointsize) - .attr("fill", pointcolor) - .attr("stroke", pointstroke) - .attr("pointer-events", "hidden") - - # title - titlegrp = g.append("g").attr("class", "title") - .append("text") - .attr("x", margin.left+width/2) - .attr("y", margin.top-titlepos) - .text(title) - - # another box around edge - g.append("rect") - .attr("x", margin.left) - .attr("y", margin.top) - .attr("height", height) - .attr("width", () -> - return(data.chrEnd[-1..][0]-margin.left) if pad4heatmap - data.chrEnd[-1..][0]-margin.left+chrGap/2) - .attr("fill", "none") - .attr("stroke", "black") - .attr("stroke-width", "none") - - if pointsAtMarkers - # these hidden points are what gets selected...a bit larger - hiddenpoints = g.append("g").attr("id", "markerpoints_hidden") - - markertip = d3.tip() - .attr('class', 'd3-tip') - .html((d) -> - [d.name, " LRS = #{d3.format('.2f')(d.lod)}"]) - .direction("e") - .offset([0,10]) - svg.call(markertip) - - markerSelect = - hiddenpoints.selectAll("empty") - .data(data.markers) - .enter() - .append("circle") - .attr("cx", (d) -> xscale[d.chr](d.pos)) - .attr("cy", (d) -> yscale(d.lod)) - .attr("id", (d) -> d.name) - .attr("r", d3.max([pointsize*2, 3])) - .attr("opacity", 0) - .attr("fill", pointcolor) - .attr("stroke", pointstroke) - .attr("stroke-width", "1") - .on "mouseover.paneltip", (d) -> - d3.select(this).attr("opacity", 1) - markertip.show(d) - .on "mouseout.paneltip", -> - d3.select(this).attr("opacity", 0) - .call(markertip.hide) - - ## configuration parameters - chart.width = (value) -> - return width unless arguments.length - width = value - chart - - chart.height = (value) -> - return height unless arguments.length - height = value - chart - - chart.margin = (value) -> - return margin unless arguments.length - margin = value - chart - - chart.titlepos = (value) -> - return titlepos unless arguments.length - titlepos - chart - - chart.axispos = (value) -> - return axispos unless arguments.length - axispos = value - chart - - chart.manhattanPlot = (value) -> - return manhattanPlot unless arguments.length - manhattanPlot = value - chart - - chart.ylim = (value) -> - return ylim unless arguments.length - ylim = value - chart - - #if data['additive'].length > 0 - chart.additive_ylim = (value) -> - return additive_ylim unless arguments.length - additive_ylim = value - chart - - chart.nyticks = (value) -> - return nyticks unless arguments.length - nyticks = value - chart - - chart.yticks = (value) -> - return yticks unless arguments.length - yticks = value - chart - - chart.chrGap = (value) -> - return chrGap unless arguments.length - chrGap = value - chart - - chart.darkrect = (value) -> - return darkrect unless arguments.length - darkrect = value - chart - - chart.lightrect = (value) -> - return lightrect unless arguments.length - lightrect = value - chart - - chart.linecolor = (value) -> - return linecolor unless arguments.length - linecolor = value - chart - - chart.linewidth = (value) -> - return linewidth unless arguments.length - linewidth = value - chart - - chart.pointcolor = (value) -> - return pointcolor unless arguments.length - pointcolor = value - chart - - chart.pointsize = (value) -> - return pointsize unless arguments.length - pointsize = value - chart - - chart.pointstroke = (value) -> - return pointstroke unless arguments.length - pointstroke = value - chart - - chart.title = (value) -> - return title unless arguments.length - title = value - chart - - chart.xlab = (value) -> - return xlab unless arguments.length - xlab = value - chart - - chart.ylab = (value) -> - return ylab unless arguments.length - ylab = value - chart - - chart.rotate_ylab = (value) -> - return rotate_ylab if !arguments.length - rotate_ylab = value - chart - - chart.lodvarname = (value) -> - return lodvarname unless arguments.length - lodvarname = value - chart - - chart.pad4heatmap = (value) -> - return pad4heatmap unless arguments.length - pad4heatmap = value - chart - - chart.pointsAtMarkers = (value) -> - return pointsAtMarkers unless arguments.length - pointsAtMarkers = value - chart - - chart.yscale = () -> - return yscale - - chart.additive = () -> - return additive - - #if data['additive'].length > 0 - chart.additive_yscale = () -> - return additive_yscale - - chart.xscale = () -> - return xscale - - if manhattanPlot == false - chart.lodcurve = () -> - return lodcurve - - #if data['additive'].length > 0 - chart.additivecurve = () -> - return additivecurve - - chart.markerSelect = () -> - return markerSelect - - chart.chrSelect = () -> - return chrSelect - - # return the chart function - chart - +lodchart = () -> + width = 800 + height = 500 + margin = {left:60, top:40, right:40, bottom: 40, inner:5} + axispos = {xtitle:25, ytitle:30, xlabel:5, ylabel:5} + titlepos = 20 + manhattanPlot = false + additive = false + ylim = null + additive_ylim = null + nyticks = 5 + yticks = null + additive_yticks = null + chrGap = 8 + darkrect = "#F1F1F9" + lightrect = "#FBFBFF" + lodlinecolor = "darkslateblue" + additivelinecolor = "red" + linewidth = 2 + suggestivecolor = "gainsboro" + significantcolor = "#EBC7C7" + pointcolor = "#E9CFEC" # pink + pointsize = 0 # default = no visible points at markers + pointstroke = "black" + title = "" + xlab = "Chromosome" + ylab = "LRS score" + additive_ylab = "Additive Effect" + rotate_ylab = null + yscale = d3.scale.linear() + additive_yscale = d3.scale.linear() + xscale = null + pad4heatmap = false + lodcurve = null + lodvarname = null + markerSelect = null + chrSelect = null + pointsAtMarkers = true + + + ## the main function + chart = (selection) -> + selection.each (data) -> + + #console.log("data:", data) + + if manhattanPlot == true + pointcolor = "darkslateblue" + pointsize = 2 + + lodvarname = lodvarname ? data.lodnames[0] + data[lodvarname] = (Math.abs(x) for x in data[lodvarname]) # take absolute values + ylim = ylim ? [0, d3.max(data[lodvarname])] + if additive + data['additive'] = (Math.abs(x) for x in data['additive']) + additive_ylim = additive_ylim ? [0, d3.max(data['additive'])] + + lodvarnum = data.lodnames.indexOf(lodvarname) + + # Select the svg element, if it exists. + svg = d3.select(this).selectAll("svg").data([data]) + + # Otherwise, create the skeletal chart. + gEnter = svg.enter().append("svg").append("g") + + # Update the outer dimensions. + svg.attr("width", width+margin.left+margin.right) + .attr("height", height+margin.top+margin.bottom) + + # Update the inner dimensions. + g = svg.select("g") + + # box + g.append("rect") + .attr("x", margin.left) + .attr("y", margin.top) + .attr("height", height) + .attr("width", width) + .attr("fill", darkrect) + .attr("stroke", "none") + + yscale.domain(ylim) + .range([height+margin.top, margin.top+margin.inner]) + + # if yticks not provided, use nyticks to choose pretty ones + yticks = yticks ? yscale.ticks(nyticks) + + #if data['additive'].length > 0 + if additive + additive_yscale.domain(additive_ylim) + .range([height+margin.top, margin.top+margin.inner + height/2]) + + additive_yticks = additive_yticks ? additive_yscale.ticks(nyticks) + + # reorganize lod,pos by chromosomes + reorgLodData(data, lodvarname) + + # add chromosome scales (for x-axis) + data = chrscales(data, width, chrGap, margin.left, pad4heatmap) + xscale = data.xscale + + # chr rectangles + chrSelect = + g.append("g").attr("class", "chrRect") + .selectAll("empty") + .data(data.chrnames) + .enter() + .append("rect") + .attr("id", (d) -> "chrrect#{d[0]}") + .attr("x", (d,i) -> + return data.chrStart[i] if i==0 and pad4heatmap + data.chrStart[i]-chrGap/2) + .attr("width", (d,i) -> + return data.chrEnd[i] - data.chrStart[i]+chrGap/2 if (i==0 or i+1 == data.chrnames.length) and pad4heatmap + data.chrEnd[i] - data.chrStart[i]+chrGap) + .attr("y", margin.top) + .attr("height", height) + .attr("fill", (d,i) -> + return darkrect if i % 2 + + lightrect) + .attr("stroke", "none") + .on("click", (d) -> + console.log("d is:", d) + redraw_plot(d) + ) + + # x-axis labels + xaxis = g.append("g").attr("class", "x axis") + xaxis.selectAll("empty") + .data(data.chrnames) + .enter() + .append("text") + .text((d) -> d[0]) + .attr("x", (d,i) -> (data.chrStart[i]+data.chrEnd[i])/2) + .attr("y", margin.top+height+axispos.xlabel) + .attr("dominant-baseline", "hanging") + .attr("text-anchor", "middle") + .attr("cursor", "pointer") + .on("click", (d) -> + redraw_plot(d) + ) + + xaxis.append("text").attr("class", "title") + .attr("y", margin.top+height+axispos.xtitle) + .attr("x", margin.left+width/2) + .attr("fill", "slateblue") + .text(xlab) + + + redraw_plot = (chr_ob) -> + #console.log("chr_name is:", chr_ob[0]) + #console.log("chr_length is:", chr_ob[1]) + $('#topchart').remove() + $('#chart_container').append('
') + chr_plot = new Chr_Lod_Chart(600, 1200, chr_ob, manhattanPlot) + + # y-axis + rotate_ylab = rotate_ylab ? (ylab.length > 1) + yaxis = g.append("g").attr("class", "y axis") + yaxis.selectAll("empty") + .data(yticks) + .enter() + .append("line") + .attr("y1", (d) -> yscale(d)) + .attr("y2", (d) -> yscale(d)) + .attr("x1", margin.left) + .attr("x2", margin.left+7) + .attr("fill", "none") + .attr("stroke", "white") + .attr("stroke-width", 1) + .style("pointer-events", "none") + + yaxis.selectAll("empty") + .data(yticks) + .enter() + .append("text") + .attr("y", (d) -> yscale(d)) + .attr("x", margin.left-axispos.ylabel) + .attr("fill", "blue") + .attr("dominant-baseline", "middle") + .attr("text-anchor", "end") + .text((d) -> formatAxis(yticks)(d)) + + yaxis.append("text").attr("class", "title") + .attr("y", margin.top+height/2) + .attr("x", margin.left-axispos.ytitle) + .text(ylab) + .attr("transform", if rotate_ylab then "rotate(270,#{margin.left-axispos.ytitle},#{margin.top+height/2})" else "") + .attr("text-anchor", "middle") + .attr("fill", "slateblue") + + #if data['additive'].length > 0 + if additive + rotate_additive_ylab = rotate_additive_ylab ? (additive_ylab.length > 1) + additive_yaxis = g.append("g").attr("class", "y axis") + additive_yaxis.selectAll("empty") + .data(additive_yticks) + .enter() + .append("line") + .attr("y1", (d) -> additive_yscale(d)) + .attr("y2", (d) -> additive_yscale(d)) + .attr("x1", margin.left + width) + .attr("x2", margin.left + width - 7) + .attr("fill", "none") + .attr("stroke", "white") + .attr("stroke-width", 1) + .style("pointer-events", "none") + + additive_yaxis.selectAll("empty") + .data(additive_yticks) + .enter() + .append("text") + .attr("y", (d) -> additive_yscale(d)) + .attr("x", (d) -> margin.left + width + axispos.ylabel + 20) + .attr("fill", "green") + .attr("dominant-baseline", "middle") + .attr("text-anchor", "end") + .text((d) -> formatAxis(additive_yticks)(d)) + + additive_yaxis.append("text").attr("class", "title") + .attr("y", margin.top+1.5*height) + .attr("x", margin.left + width + axispos.ytitle) + .text(additive_ylab) + .attr("transform", if rotate_additive_ylab then "rotate(270,#{margin.left + width + axispos.ytitle}, #{margin.top+height*1.5})" else "") + .attr("text-anchor", "middle") + .attr("fill", "green") + + if 'suggestive' of data + suggestive_bar = g.append("g").attr("class", "suggestive") + suggestive_bar.selectAll("empty") + .data([data.suggestive]) + .enter() + .append("line") + .attr("y1", (d) -> yscale(d)) + .attr("y2", (d) -> yscale(d)) + .attr("x1", margin.left) + .attr("x2", margin.left+width) + .attr("fill", "none") + .attr("stroke", suggestivecolor) + .attr("stroke-width", 5) + .style("pointer-events", "none") + + suggestive_bar = g.append("g").attr("class", "significant") + suggestive_bar.selectAll("empty") + .data([data.significant]) + .enter() + .append("line") + .attr("y1", (d) -> yscale(d)) + .attr("y2", (d) -> yscale(d)) + .attr("x1", margin.left) + .attr("x2", margin.left+width) + .attr("fill", "none") + .attr("stroke", significantcolor) + .attr("stroke-width", 5) + .style("pointer-events", "none") + + if manhattanPlot == false + # lod curves by chr + lodcurve = (chr, lodcolumn) -> + d3.svg.line() + .x((d) -> xscale[chr](d)) + .y((d,i) -> yscale(data.lodByChr[chr][i][lodcolumn])) + + if additive + additivecurve = (chr, lodcolumn) -> + d3.svg.line() + .x((d) -> xscale[chr](d)) + .y((d,i) -> additive_yscale(data.additiveByChr[chr][i][lodcolumn])) + + curves = g.append("g").attr("id", "curves") + + for chr in data.chrnames + if chr.indexOf(data['chr']) + curves.append("path") + .datum(data.posByChr[chr[0]]) + .attr("d", lodcurve(chr[0], lodvarnum)) + .attr("stroke", lodlinecolor) + .attr("fill", "none") + .attr("stroke-width", linewidth) + .style("pointer-events", "none") + + if additive + for chr in data.chrnames + if chr.indexOf(data['chr']) + curves.append("path") + .datum(data.posByChr[chr[0]]) + .attr("d", additivecurve(chr[0], lodvarnum)) + .attr("stroke", additivelinecolor) + .attr("fill", "none") + .attr("stroke-width", 1) + .style("pointer-events", "none") + + # points at markers + console.log("before pointsize") + if pointsize > 0 + console.log("pointsize > 0 !!!") + markerpoints = g.append("g").attr("id", "markerpoints_visible") + markerpoints.selectAll("empty") + .data(data.markers) + .enter() + .append("circle") + .attr("cx", (d) -> xscale[d.chr](d.pos)) + .attr("cy", (d) -> yscale(d.lod)) + .attr("r", pointsize) + .attr("fill", pointcolor) + .attr("stroke", pointstroke) + .attr("pointer-events", "hidden") + + # title + titlegrp = g.append("g").attr("class", "title") + .append("text") + .attr("x", margin.left+width/2) + .attr("y", margin.top-titlepos) + .text(title) + + # another box around edge + g.append("rect") + .attr("x", margin.left) + .attr("y", margin.top) + .attr("height", height) + .attr("width", () -> + return(data.chrEnd[-1..][0]-margin.left) if pad4heatmap + data.chrEnd[-1..][0]-margin.left+chrGap/2) + .attr("fill", "none") + .attr("stroke", "black") + .attr("stroke-width", "none") + + if pointsAtMarkers + # these hidden points are what gets selected...a bit larger + hiddenpoints = g.append("g").attr("id", "markerpoints_hidden") + + markertip = d3.tip() + .attr('class', 'd3-tip') + .html((d) -> + [d.name, " LRS = #{d3.format('.2f')(d.lod)}"]) + .direction("e") + .offset([0,10]) + svg.call(markertip) + + markerSelect = + hiddenpoints.selectAll("empty") + .data(data.markers) + .enter() + .append("circle") + .attr("cx", (d) -> xscale[d.chr](d.pos)) + .attr("cy", (d) -> yscale(d.lod)) + .attr("id", (d) -> d.name) + .attr("r", d3.max([pointsize*2, 3])) + .attr("opacity", 0) + .attr("fill", pointcolor) + .attr("stroke", pointstroke) + .attr("stroke-width", "1") + .on "mouseover.paneltip", (d) -> + d3.select(this).attr("opacity", 1) + markertip.show(d) + .on "mouseout.paneltip", -> + d3.select(this).attr("opacity", 0) + .call(markertip.hide) + + ## configuration parameters + chart.width = (value) -> + return width unless arguments.length + width = value + chart + + chart.height = (value) -> + return height unless arguments.length + height = value + chart + + chart.margin = (value) -> + return margin unless arguments.length + margin = value + chart + + chart.titlepos = (value) -> + return titlepos unless arguments.length + titlepos + chart + + chart.axispos = (value) -> + return axispos unless arguments.length + axispos = value + chart + + chart.manhattanPlot = (value) -> + return manhattanPlot unless arguments.length + manhattanPlot = value + chart + + chart.ylim = (value) -> + return ylim unless arguments.length + ylim = value + chart + + #if data['additive'].length > 0 + chart.additive_ylim = (value) -> + return additive_ylim unless arguments.length + additive_ylim = value + chart + + chart.nyticks = (value) -> + return nyticks unless arguments.length + nyticks = value + chart + + chart.yticks = (value) -> + return yticks unless arguments.length + yticks = value + chart + + chart.chrGap = (value) -> + return chrGap unless arguments.length + chrGap = value + chart + + chart.darkrect = (value) -> + return darkrect unless arguments.length + darkrect = value + chart + + chart.lightrect = (value) -> + return lightrect unless arguments.length + lightrect = value + chart + + chart.linecolor = (value) -> + return linecolor unless arguments.length + linecolor = value + chart + + chart.linewidth = (value) -> + return linewidth unless arguments.length + linewidth = value + chart + + chart.pointcolor = (value) -> + return pointcolor unless arguments.length + pointcolor = value + chart + + chart.pointsize = (value) -> + return pointsize unless arguments.length + pointsize = value + chart + + chart.pointstroke = (value) -> + return pointstroke unless arguments.length + pointstroke = value + chart + + chart.title = (value) -> + return title unless arguments.length + title = value + chart + + chart.xlab = (value) -> + return xlab unless arguments.length + xlab = value + chart + + chart.ylab = (value) -> + return ylab unless arguments.length + ylab = value + chart + + chart.rotate_ylab = (value) -> + return rotate_ylab if !arguments.length + rotate_ylab = value + chart + + chart.lodvarname = (value) -> + return lodvarname unless arguments.length + lodvarname = value + chart + + chart.pad4heatmap = (value) -> + return pad4heatmap unless arguments.length + pad4heatmap = value + chart + + chart.pointsAtMarkers = (value) -> + return pointsAtMarkers unless arguments.length + pointsAtMarkers = value + chart + + chart.yscale = () -> + return yscale + + chart.additive = () -> + return additive + + #if data['additive'].length > 0 + chart.additive_yscale = () -> + return additive_yscale + + chart.xscale = () -> + return xscale + + if manhattanPlot == false + chart.lodcurve = () -> + return lodcurve + + #if data['additive'].length > 0 + chart.additivecurve = () -> + return additivecurve + + chart.markerSelect = () -> + return markerSelect + + chart.chrSelect = () -> + return chrSelect + + # return the chart function + chart + diff --git a/wqflask/wqflask/static/new/javascript/lod_chart.js b/wqflask/wqflask/static/new/javascript/lod_chart.js index 92289bfe..631d8632 100644 --- a/wqflask/wqflask/static/new/javascript/lod_chart.js +++ b/wqflask/wqflask/static/new/javascript/lod_chart.js @@ -1,4 +1,4 @@ -// Generated by CoffeeScript 1.8.0 +// Generated by CoffeeScript 1.9.2 var lodchart; lodchart = function() { @@ -53,33 +53,33 @@ lodchart = function() { pointsAtMarkers = true; chart = function(selection) { return selection.each(function(data) { - var additive_yaxis, additivecurve, chr, curves, g, gEnter, hiddenpoints, lodvarnum, markerpoints, markertip, redraw_plot, rotate_additive_ylab, suggestive_bar, svg, titlegrp, x, xaxis, yaxis, _i, _j, _len, _len1, _ref, _ref1; + var additive_yaxis, additivecurve, chr, curves, g, gEnter, hiddenpoints, j, k, len, len1, lodvarnum, markerpoints, markertip, redraw_plot, ref, ref1, rotate_additive_ylab, suggestive_bar, svg, titlegrp, x, xaxis, yaxis; if (manhattanPlot === true) { pointcolor = "darkslateblue"; pointsize = 2; } lodvarname = lodvarname != null ? lodvarname : data.lodnames[0]; data[lodvarname] = (function() { - var _i, _len, _ref, _results; - _ref = data[lodvarname]; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - x = _ref[_i]; - _results.push(Math.abs(x)); + var j, len, ref, results; + ref = data[lodvarname]; + results = []; + for (j = 0, len = ref.length; j < len; j++) { + x = ref[j]; + results.push(Math.abs(x)); } - return _results; + return results; })(); ylim = ylim != null ? ylim : [0, d3.max(data[lodvarname])]; if (additive) { data['additive'] = (function() { - var _i, _len, _ref, _results; - _ref = data['additive']; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - x = _ref[_i]; - _results.push(Math.abs(x)); + var j, len, ref, results; + ref = data['additive']; + results = []; + for (j = 0, len = ref.length; j < len; j++) { + x = ref[j]; + results.push(Math.abs(x)); } - return _results; + return results; })(); additive_ylim = additive_ylim != null ? additive_ylim : [0, d3.max(data['additive'])]; } @@ -196,16 +196,20 @@ lodchart = function() { }; } curves = g.append("g").attr("id", "curves"); - _ref = data.chrnames; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - chr = _ref[_i]; - curves.append("path").datum(data.posByChr[chr[0]]).attr("d", lodcurve(chr[0], lodvarnum)).attr("stroke", lodlinecolor).attr("fill", "none").attr("stroke-width", linewidth).style("pointer-events", "none"); + ref = data.chrnames; + for (j = 0, len = ref.length; j < len; j++) { + chr = ref[j]; + if (chr.indexOf(data['chr'])) { + curves.append("path").datum(data.posByChr[chr[0]]).attr("d", lodcurve(chr[0], lodvarnum)).attr("stroke", lodlinecolor).attr("fill", "none").attr("stroke-width", linewidth).style("pointer-events", "none"); + } } if (additive) { - _ref1 = data.chrnames; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - chr = _ref1[_j]; - curves.append("path").datum(data.posByChr[chr[0]]).attr("d", additivecurve(chr[0], lodvarnum)).attr("stroke", additivelinecolor).attr("fill", "none").attr("stroke-width", 1).style("pointer-events", "none"); + ref1 = data.chrnames; + for (k = 0, len1 = ref1.length; k < len1; k++) { + chr = ref1[k]; + if (chr.indexOf(data['chr'])) { + curves.append("path").datum(data.posByChr[chr[0]]).attr("d", additivecurve(chr[0], lodvarnum)).attr("stroke", additivelinecolor).attr("fill", "none").attr("stroke-width", 1).style("pointer-events", "none"); + } } } } @@ -450,4 +454,4 @@ lodchart = function() { return chrSelect; }; return chart; -}; +}; \ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/panelutil.coffee b/wqflask/wqflask/static/new/javascript/panelutil.coffee index a3bc0b44..f7b51457 100644 --- a/wqflask/wqflask/static/new/javascript/panelutil.coffee +++ b/wqflask/wqflask/static/new/javascript/panelutil.coffee @@ -30,16 +30,15 @@ reorgLodData = (data, lodvarname=null) -> data.lodByChr = {} for chr,i in data.chrnames - #console.log("chr:", chr) - data.posByChr[chr[0]] = [] - data.lodByChr[chr[0]] = [] - for pos, j in data.pos - if data.chr[j].toString() == chr[0] - #console.log(data.chr[j] + " AND " + chr[0]) - data.posByChr[chr[0]].push(pos) - data.lodnames = [data.lodnames] unless Array.isArray(data.lodnames) - lodval = (data[lodcolumn][j] for lodcolumn in data.lodnames) - data.lodByChr[chr[0]].push(lodval) + if data.chr.indexOf(chr[0]) + data.posByChr[chr[0]] = [] + data.lodByChr[chr[0]] = [] + for pos, j in data.pos + if data.chr[j].toString() == chr[0] + data.posByChr[chr[0]].push(pos) + data.lodnames = [data.lodnames] unless Array.isArray(data.lodnames) + lodval = (data[lodcolumn][j] for lodcolumn in data.lodnames) + data.lodByChr[chr[0]].push(lodval) #console.log("data.posByChr:", data.posByChr) diff --git a/wqflask/wqflask/static/new/javascript/panelutil.js b/wqflask/wqflask/static/new/javascript/panelutil.js index 3a180e60..7c14f4de 100644 --- a/wqflask/wqflask/static/new/javascript/panelutil.js +++ b/wqflask/wqflask/static/new/javascript/panelutil.js @@ -106,10 +106,13 @@ chrscales = function(data, width, chrGap, leftMargin, pad4heatmap) { if (d > maxd) { maxd = d; } - rng = d3.extent(data.posByChr[chr[0]]); - chrStart.push(rng[0]); - chrEnd.push(rng[1]); - L = rng[1] - rng[0]; + //rng = d3.extent(data.posByChr[chr[0]]); + //chrStart.push(rng[0]); + //chrEnd.push(rng[1]); + //L = rng[1] - rng[0]; + chrStart.push(0); + chrEnd.push(chr[1]); + L = chr[1] chrLength.push(L); totalChrLength += L; } @@ -436,4 +439,4 @@ abs = function(x) { return x; } return Math.abs(x); -}; +}; \ No newline at end of file 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 29a637ee..df58eb39 100755 --- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee +++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee @@ -76,37 +76,22 @@ do_ajax_post = (url, form_data) -> return false open_mapping_results = (data) -> + #results_window = window.open("/mapping_results_container") + #results_window.onload = -> + # results_window.document.getElementById("mapping_results_container").innerHTML = data + $.colorbox( html: data href: "#mapping_results_holder" height: "90%" width: "90%" - onComplete: => root.create_manhattan_plot() + onComplete: => root.create_lod_chart() ) showalert = (message,alerttype) -> $('#alert_placeholder').append('
×'+message+'
') -$("#interval_mapping_compute").on("click", => - showalert("One or more outliers exist in this data set. Please review values before mapping. \ - Including outliers when mapping may lead to misleading results. \ - We recommend winsorising the outliers \ - or simply deleting them.", "alert-success") - console.log("In interval mapping") - $("#progress_bar_container").modal() - url = "/interval_mapping" - - $('input[name=method]').val("reaper") - $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val()) - $('input[name=mapping_display_all]').val($('input[name=display_all_reaper]')) - $('input[name=suggestive]').val($('input[name=suggestive_reaper]')) - form_data = $('#trait_data_form').serialize() - console.log("form_data is:", form_data) - - do_ajax_post(url, form_data) -) - $('#suggestive').hide() $('input[name=display_all]').change(() => @@ -178,6 +163,25 @@ $("#gemma_compute").on("click", => do_ajax_post(url, form_data) ) +$("#interval_mapping_compute").on("click", => + showalert("One or more outliers exist in this data set. Please review values before mapping. \ + Including outliers when mapping may lead to misleading results. \ + We recommend winsorising the outliers \ + or simply deleting them.", "alert-success") + console.log("In interval mapping") + $("#progress_bar_container").modal() + url = "/interval_mapping" + + $('input[name=method]').val("reaper") + $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val()) + $('input[name=mapping_display_all]').val($('input[name=display_all_reaper]')) + $('input[name=suggestive]').val($('input[name=suggestive_reaper]')) + form_data = $('#trait_data_form').serialize() + console.log("form_data is:", form_data) + + do_ajax_post(url, form_data) +) + #$(".submit_special").click(submit_special) composite_mapping_fields = -> 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 03862cf8..259e4685 100755 --- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js +++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js @@ -1,227 +1,224 @@ // Generated by CoffeeScript 1.9.2 -(function() { - var block_outliers, composite_mapping_fields, do_ajax_post, get_progress, mapping_method_fields, open_mapping_results, showalert, submit_special, toggle_enable_disable, update_time_remaining; - - submit_special = function() { - var url; - console.log("In submit_special"); - console.log("this is:", this); - console.log("$(this) is:", $(this)); - url = $(this).data("url"); - console.log("url is:", url); - $("#trait_data_form").attr("action", url); - return $("#trait_data_form").submit(); - }; - - update_time_remaining = function(percent_complete) { - var minutes_remaining, now, period, total_seconds_remaining; - now = new Date(); - period = now.getTime() - root.start_time; - console.log("period is:", period); - if (period > 8000) { - total_seconds_remaining = (period / percent_complete * (100 - percent_complete)) / 1000; - minutes_remaining = Math.round(total_seconds_remaining / 60); - if (minutes_remaining < 3) { - return $('#time_remaining').text(Math.round(total_seconds_remaining) + " seconds remaining"); - } else { - return $('#time_remaining').text(minutes_remaining + " minutes remaining"); - } +var block_outliers, composite_mapping_fields, do_ajax_post, get_progress, mapping_method_fields, open_mapping_results, showalert, submit_special, toggle_enable_disable, update_time_remaining; + +submit_special = function() { + var url; + console.log("In submit_special"); + console.log("this is:", this); + console.log("$(this) is:", $(this)); + url = $(this).data("url"); + console.log("url is:", url); + $("#trait_data_form").attr("action", url); + return $("#trait_data_form").submit(); +}; + +update_time_remaining = function(percent_complete) { + var minutes_remaining, now, period, total_seconds_remaining; + now = new Date(); + period = now.getTime() - root.start_time; + console.log("period is:", period); + if (period > 8000) { + total_seconds_remaining = (period / percent_complete * (100 - percent_complete)) / 1000; + minutes_remaining = Math.round(total_seconds_remaining / 60); + if (minutes_remaining < 3) { + return $('#time_remaining').text(Math.round(total_seconds_remaining) + " seconds remaining"); + } else { + return $('#time_remaining').text(minutes_remaining + " minutes remaining"); } + } +}; + +get_progress = function() { + var params, params_str, temp_uuid, url; + console.log("temp_uuid:", $("#temp_uuid").val()); + temp_uuid = $("#temp_uuid").val(); + params = { + key: temp_uuid }; - - get_progress = function() { - var params, params_str, temp_uuid, url; - console.log("temp_uuid:", $("#temp_uuid").val()); - temp_uuid = $("#temp_uuid").val(); - params = { - key: temp_uuid - }; - params_str = $.param(params); - url = "/get_temp_data?" + params_str; - console.log("url:", url); - $.ajax({ - type: "GET", - url: url, - success: (function(_this) { - return function(progress_data) { - var percent_complete; - percent_complete = progress_data['percent_complete']; - console.log("in get_progress data:", progress_data); - $('#marker_regression_progress').css("width", percent_complete + "%"); - if (root.start_time) { - if (!isNaN(percent_complete)) { - return update_time_remaining(percent_complete); - } - } else { - return root.start_time = new Date().getTime(); + params_str = $.param(params); + url = "/get_temp_data?" + params_str; + console.log("url:", url); + $.ajax({ + type: "GET", + url: url, + success: (function(_this) { + return function(progress_data) { + var percent_complete; + percent_complete = progress_data['percent_complete']; + console.log("in get_progress data:", progress_data); + $('#marker_regression_progress').css("width", percent_complete + "%"); + if (root.start_time) { + if (!isNaN(percent_complete)) { + return update_time_remaining(percent_complete); } - }; - })(this) - }); - return false; - }; - - block_outliers = function() { - return $('.outlier').each((function(_this) { - return function(_index, element) { - return $(element).find('.trait_value_input').val('x'); + } else { + return root.start_time = new Date().getTime(); + } }; - })(this)); - }; - - do_ajax_post = function(url, form_data) { - $.ajax({ - type: "POST", - url: url, - data: form_data, - error: (function(_this) { - return 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."); - }; - })(this), - success: (function(_this) { - return function(data) { - clearInterval(_this.my_timer); - $('#progress_bar_container').modal('hide'); - return open_mapping_results(data); - }; - })(this) - }); - console.log("settingInterval"); - this.my_timer = setInterval(get_progress, 1000); - return false; - }; - - open_mapping_results = function(data) { - return $.colorbox({ - html: data, - href: "#mapping_results_holder", - height: "90%", - width: "90%", - onComplete: (function(_this) { - return function() { - return root.create_manhattan_plot(); - }; - })(this) - }); - }; - - showalert = function(message, alerttype) { - return $('#alert_placeholder').append('
�' + message + '
'); - }; - - $("#interval_mapping_compute").on("click", (function(_this) { - return function() { - var form_data, url; - showalert("One or more outliers exist in this data set. Please review values before mapping. Including outliers when mapping may lead to misleading results. We recommend winsorising the outliers or simply deleting them.", "alert-success"); - console.log("In interval mapping"); - $("#progress_bar_container").modal(); - url = "/interval_mapping"; - $('input[name=method]').val("reaper"); - $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val()); - $('input[name=mapping_display_all]').val($('input[name=display_all_reaper]')); - $('input[name=suggestive]').val($('input[name=suggestive_reaper]')); - form_data = $('#trait_data_form').serialize(); - console.log("form_data is:", form_data); - return do_ajax_post(url, form_data); - }; - })(this)); - - $('#suggestive').hide(); - - $('input[name=display_all]').change((function(_this) { - return function() { - console.log("check"); - if ($('input[name=display_all]:checked').val() === "False") { - return $('#suggestive').show(); - } else { - return $('#suggestive').hide(); - } - }; - })(this)); - - $("#pylmm_compute").on("click", (function(_this) { - return function() { - var form_data, url; - $("#progress_bar_container").modal(); - url = "/marker_regression"; - $('input[name=method]').val("pylmm"); - $('input[name=num_perm]').val($('input[name=num_perm_pylmm]').val()); - $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_pylmm]:checked').val()); - form_data = $('#trait_data_form').serialize(); - console.log("form_data is:", form_data); - return do_ajax_post(url, form_data); - }; - })(this)); + })(this) + }); + return false; +}; - $("#rqtl_geno_compute").on("click", (function(_this) { - return function() { - var form_data, url; - $("#progress_bar_container").modal(); - url = "/marker_regression"; - $('input[name=method]').val("rqtl_geno"); - $('input[name=num_perm]').val($('input[name=num_perm_rqtl_geno]').val()); - $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_rqtl]:checked').val()); - $('input[name=control_marker]').val($('input[name=control_rqtl_geno]').val()); - form_data = $('#trait_data_form').serialize(); - console.log("form_data is:", form_data); - return do_ajax_post(url, form_data); +block_outliers = function() { + return $('.outlier').each((function(_this) { + return function(_index, element) { + return $(element).find('.trait_value_input').val('x'); }; })(this)); +}; + +do_ajax_post = function(url, form_data) { + $.ajax({ + type: "POST", + url: url, + data: form_data, + error: (function(_this) { + return 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."); + }; + })(this), + success: (function(_this) { + return function(data) { + clearInterval(_this.my_timer); + $('#progress_bar_container').modal('hide'); + return open_mapping_results(data); + }; + })(this) + }); + console.log("settingInterval"); + this.my_timer = setInterval(get_progress, 1000); + return false; +}; + +open_mapping_results = function(data) { + return $.colorbox({ + html: data, + href: "#mapping_results_holder", + height: "90%", + width: "90%", + onComplete: (function(_this) { + return function() { + return root.create_lod_chart(); + }; + })(this) + }); +}; - $("#plink_compute").on("click", (function(_this) { - return function() { - var form_data, url; - $("#static_progress_bar_container").modal(); - url = "/marker_regression"; - $('input[name=method]').val("plink"); - $('input[name=maf]').val($('input[name=maf_plink]').val()); - form_data = $('#trait_data_form').serialize(); - console.log("form_data is:", form_data); - return do_ajax_post(url, form_data); - }; - })(this)); +showalert = function(message, alerttype) { + return $('#alert_placeholder').append('
×' + message + '
'); +}; - $("#gemma_compute").on("click", (function(_this) { - return function() { - var form_data, url; - console.log("RUNNING GEMMA"); - $("#static_progress_bar_container").modal(); - url = "/marker_regression"; - $('input[name=method]').val("gemma"); - $('input[name=maf]').val($('input[name=maf_gemma]').val()); - form_data = $('#trait_data_form').serialize(); - console.log("form_data is:", form_data); - return do_ajax_post(url, form_data); - }; - })(this)); +$('#suggestive').hide(); - composite_mapping_fields = function() { - return $(".composite_fields").toggle(); +$('input[name=display_all]').change((function(_this) { + return function() { + console.log("check"); + if ($('input[name=display_all]:checked').val() === "False") { + return $('#suggestive').show(); + } else { + return $('#suggestive').hide(); + } }; - - mapping_method_fields = function() { - return $(".mapping_method_fields").toggle(); +})(this)); + +$("#pylmm_compute").on("click", (function(_this) { + return function() { + var form_data, url; + $("#progress_bar_container").modal(); + url = "/marker_regression"; + $('input[name=method]').val("pylmm"); + $('input[name=num_perm]').val($('input[name=num_perm_pylmm]').val()); + $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_pylmm]:checked').val()); + form_data = $('#trait_data_form').serialize(); + console.log("form_data is:", form_data); + return do_ajax_post(url, form_data); + }; +})(this)); + +$("#rqtl_geno_compute").on("click", (function(_this) { + return function() { + var form_data, url; + $("#progress_bar_container").modal(); + url = "/marker_regression"; + $('input[name=method]').val("rqtl_geno"); + $('input[name=num_perm]').val($('input[name=num_perm_rqtl_geno]').val()); + $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_rqtl]:checked').val()); + $('input[name=control_marker]').val($('input[name=control_rqtl_geno]').val()); + form_data = $('#trait_data_form').serialize(); + console.log("form_data is:", form_data); + return do_ajax_post(url, form_data); + }; +})(this)); + +$("#plink_compute").on("click", (function(_this) { + return function() { + var form_data, url; + $("#static_progress_bar_container").modal(); + url = "/marker_regression"; + $('input[name=method]').val("plink"); + $('input[name=maf]').val($('input[name=maf_plink]').val()); + form_data = $('#trait_data_form').serialize(); + console.log("form_data is:", form_data); + return do_ajax_post(url, form_data); + }; +})(this)); + +$("#gemma_compute").on("click", (function(_this) { + return function() { + var form_data, url; + console.log("RUNNING GEMMA"); + $("#static_progress_bar_container").modal(); + url = "/marker_regression"; + $('input[name=method]').val("gemma"); + $('input[name=maf]').val($('input[name=maf_gemma]').val()); + form_data = $('#trait_data_form').serialize(); + console.log("form_data is:", form_data); + return do_ajax_post(url, form_data); }; +})(this)); + +$("#interval_mapping_compute").on("click", (function(_this) { + return function() { + var form_data, url; + showalert("One or more outliers exist in this data set. Please review values before mapping. Including outliers when mapping may lead to misleading results. We recommend winsorising the outliers or simply deleting them.", "alert-success"); + console.log("In interval mapping"); + $("#progress_bar_container").modal(); + url = "/interval_mapping"; + $('input[name=method]').val("reaper"); + $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val()); + $('input[name=mapping_display_all]').val($('input[name=display_all_reaper]')); + $('input[name=suggestive]').val($('input[name=suggestive_reaper]')); + form_data = $('#trait_data_form').serialize(); + console.log("form_data is:", form_data); + return do_ajax_post(url, form_data); + }; +})(this)); - $("#use_composite_choice").change(composite_mapping_fields); +composite_mapping_fields = function() { + return $(".composite_fields").toggle(); +}; - $("#mapping_method_choice").change(mapping_method_fields); +mapping_method_fields = function() { + return $(".mapping_method_fields").toggle(); +}; - toggle_enable_disable = function(elem) { - return $(elem).prop("disabled", !$(elem).prop("disabled")); - }; +$("#use_composite_choice").change(composite_mapping_fields); - $("#choose_closet_control").change(function() { - return toggle_enable_disable("#control_locus"); - }); +$("#mapping_method_choice").change(mapping_method_fields); - $("#display_all_lrs").change(function() { - return toggle_enable_disable("#suggestive_lrs"); - }); +toggle_enable_disable = function(elem) { + return $(elem).prop("disabled", !$(elem).prop("disabled")); +}; + +$("#choose_closet_control").change(function() { + return toggle_enable_disable("#control_locus"); +}); -}).call(this); +$("#display_all_lrs").change(function() { + return toggle_enable_disable("#suggestive_lrs"); +}); \ No newline at end of file diff --git a/wqflask/wqflask/templates/interval_mapping.html b/wqflask/wqflask/templates/interval_mapping.html deleted file mode 100755 index b0866a35..00000000 --- a/wqflask/wqflask/templates/interval_mapping.html +++ /dev/null @@ -1,117 +0,0 @@ -{% block css %} - - - - - - - -{% endblock %} -{% block content %} - - -
-
-

- Whole Genome Mapping -

-
- - - -
-
- - - -
-
-
-
- -
-
-
-

- Results -

-
- - - - - - - - - - - - - {% for marker in qtl_results %} - - - - - - - - - {% endfor %} - -
IndexLRS ScoreChrMbLocusAdditive Effect
{{ loop.index }}{{ marker.lrs_value|float }}{{ marker.chr|int }}{{ marker.Mb|float }}{{ marker.name }}{{ marker.additive|float }}
- -
- - - -{% endblock %} - -{% block js %} - - - - - - - - - - - - - - - - - - - -{% endblock %} \ No newline at end of file diff --git a/wqflask/wqflask/templates/old_index_page.html b/wqflask/wqflask/templates/old_index_page.html deleted file mode 100755 index db0b2d9e..00000000 --- a/wqflask/wqflask/templates/old_index_page.html +++ /dev/null @@ -1,320 +0,0 @@ -{% extends "base.html" %} -{% block title %}GeneNetwork{% endblock %} -{% block content %} - - - - - - - - - - -
-

Select and - Search

- - - -

 ______________________________________________________

- -

  Quick HELP - Examples and User's Guide

  You can also use advanced - commands. Copy these simple examples
-   into the Get Any or Combined search fields: - -
    -
  • POSITION=(chr1 25 30) finds genes, markers, or transcripts on - chromosome 1 between 25 and 30 Mb.
  • - -
  • MEAN=(15 16) LRS=(23 46) in the Combined field finds - highly expressed genes (15 to 16 log2 units) AND with peak LRS linkage between 23 and 46.
  • - -
  • RIF=mitochondrial searches RNA databases for GeneRIF links.
  • - -
  • WIKI=nicotine searches GeneWiki for genes that you or other users have annotated - with the word nicotine.
  • - -
  • GO:0045202 searches for synapse-associated genes listed in the - Gene Ontology.
  • - -
  • GO:0045202 LRS=(9 99 Chr4 122 155) cisLRS=(9 999 10)
    - in Combined finds synapse-associated genes with cis eQTL on Chr 4 from 122 and 155 Mb with LRS scores - between 9 and 999.
  • - -
  • RIF=diabetes LRS=(9 999 Chr2 100 105) transLRS=(9 999 10)
    - in Combined finds diabetes-associated transcripts with peak trans eQTLs on Chr 2 between 100 and 105 Mb with LRS - scores between 9 and 999.
  • -
-
-

Websites Affiliated with - GeneNetwork

- -

- - - -

____________________________

- -

Getting Started -   

- -
    -
  1. Select Species (or select All)
  2. - -
  3. Select Group (a specific sample)
  4. - -
  5. Select Type of data: - -
      -
    • Phenotype (traits)
    • - -
    • Genotype (markers)
    • - -
    • Expression (mRNAs)
    • -
    -
  6. - -
  7. Select a Database
  8. - -
  9. Enter search terms in the Get Any or Combined field: words, - genes, ID numbers, probes, advanced search commands
  10. - -
  11. Click on the Search button
  12. - -
  13. Optional: Use the Make Default button to save your preferences
  14. -
- -

____________________________

- -

How to Use - GeneNetwork

- -
-

Take a 20-40 minute - GeneNetwork Tour that includes screen shots and - typical steps in the analysis.

-
- -
-

For information about - resources and methods, select the INFO buttons.

- -

Try the Workstation site to explore data and features that are - being implemented.

- -

Review the Conditions - and Contacts pages for information on the status of data sets - and advice on their use and citation.

-
- -

Mirror and Development - Sites

- - - -

History and - Archive

- -
-

GeneNetwork's Time - Machine links to earlier versions that correspond to specific - publication dates.

-
-
- - - - - -{% endblock %} - diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index c16c22df..f9b27207 100755 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -288,6 +288,10 @@ def heatmap_page(): return rendered_template +@app.route("/mapping_results_container") +def mapping_results_container_page(): + return render_template("mapping_results_container.html") + @app.route("/marker_regression", methods=('POST',)) def marker_regression_page(): initial_start_vars = request.form @@ -439,7 +443,7 @@ def interval_mapping_page(): Redis.expire(key, 60*60) with Bench("Rendering template"): - rendered_template = render_template("interval_mapping.html", **result) + rendered_template = render_template("marker_regression.html", **result) return rendered_template -- cgit v1.2.3