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('<div class="qtlcharts" id="topchart"></div>')
-             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('<div class="qtlcharts" id="topchart"></div>')
+             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('<div id="alertdiv" class="alert ' +  alerttype + '"><a class="close" data-dismiss="alert">�</a><span>'+message+'</span></div>')
     
 
-$("#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 <A HREF=\"http://en.wikipedia.org/wiki/Winsorising\">winsorising</A> 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 <A HREF=\"http://en.wikipedia.org/wiki/Winsorising\">winsorising</A> 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('<div id="alertdiv" class="alert ' + alerttype + '"><a class="close" data-dismiss="alert">�</a><span>' + message + '</span></div>');
-  };
-
-  $("#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 <A HREF=\"http://en.wikipedia.org/wiki/Winsorising\">winsorising</A> 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('<div id="alertdiv" class="alert ' + alerttype + '"><a class="close" data-dismiss="alert">�</a><span>' + message + '</span></div>');
+};
 
-  $("#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 <A HREF=\"http://en.wikipedia.org/wiki/Winsorising\">winsorising</A> 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 %}
-    <link rel="stylesheet" type="text/css" href="/static/new/css/marker_regression.css" />
-    <link rel="stylesheet" type="text/css" href="/static/new/css/show_trait.css" />
-    <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
-    <link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" />
-    <link rel="stylesheet" type="text/css" href="/static/packages/TableTools/media/css/TableTools.css" />
-    <link rel="stylesheet" type="text/css" href="/static/new/css/d3-tip.min.css" />
-    <link rel="stylesheet" type="text/css" href="/static/new/css/panelutil.css" />
-{% endblock %}
-{% block content %} <!-- Start of body -->
-
-
-    <div id="mapping_results" class="container">
-        <div>
-            <h2>
-                Whole Genome Mapping
-            </h2>
-            <form style ='float: left; padding: 5px;' id="exportform" action="export" method="post">
-              <input type="hidden" id="data" name="data" value="">
-              <input type="hidden" id="filename" name="filename" value="">
-              <input type="submit" id="export" value="Download SVG">
-            </form>
-            <form style ='float: left; padding: 5px;' id="exportpdfform" action="export_pdf" method="post">
-              <input type="hidden" id="data" name="data" value="">
-              <input type="hidden" id="filename" name="filename" value="">
-              <input type="submit" id="export_pdf" value="Download PDF">
-            </form>
-        </div>
-        <div id="chart_container">
-            <div class="qtlcharts" id="topchart">
-                
-            </div>
-        </div>
-        <div>
-            <h2>
-                Results
-            </h2>
-        </div>
-        <table cellpadding="0" cellspacing="0" border="0" id="qtl_results" class="table table-hover table-striped table-bordered">
-            <thead>
-                <tr>
-                    <td>Index</td>
-                    <td>LRS Score</td>
-                    <td>Chr</td>
-                    <td>Mb</td>
-                    <td>Locus</td>
-                    <td>Additive Effect</td>
-                </tr>
-            </thead>
-            <tbody>
-                {% for marker in qtl_results %}
-                <tr>
-                    <td>{{ loop.index }}</td>
-                    <td>{{ marker.lrs_value|float }}</td>
-                    <td>{{ marker.chr|int }}</td>
-                    <td>{{ marker.Mb|float  }}</td>
-                    <td>{{ marker.name }}</td>
-                    <td>{{ marker.additive|float }}</td>
-                </tr>
-                {% endfor %}
-            </tbody>
-        </table>
-    
-    </div>
-
-    <!-- End of body -->
-
-{% endblock %}
-
-{% block js %}  
-    <script>
-        js_data = {{ js_data | safe }}
-    </script>
-
-    <script language="javascript" type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/js_external/d3-tip.min.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/packages/jsPDF/libs/FileSaver.js/FileSaver.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/packages/jsPDF/libs/Blob.js/BlobBuilder.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/packages/jsPDF/jspdf.plugin.standard_fonts_metrics.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/packages/jsPDF/jspdf.plugin.from_html.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/javascript/panelutil.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/javascript/chr_lod_chart.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/javascript/lod_chart.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/javascript/create_lodchart.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.min.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.scientific.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/packages/DT_bootstrap/DT_bootstrap.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/packages/TableTools/media/js/TableTools.min.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/packages/underscore/underscore-min.js"></script>
-
-    <script type="text/javascript" charset="utf-8">
-        $(document).ready( function () {
-            console.time("Creating table");
-            $('#qtl_results').dataTable( {
-                //"sDom": "<<'span3'l><'span3'T><'span4'f>'row-fluid'r>t<'row-fluid'<'span6'i><'span6'p>>",
-                "sDom": "lTftipr",
-                "oTableTools": {
-                    "aButtons": [
-                        "copy",
-                        "print",
-                        {
-                            "sExtends":    "collection",
-                            "sButtonText": 'Save <span class="caret" />',
-                            "aButtons":    [ "csv", "xls", "pdf" ]
-                        }
-                    ],
-                    "sSwfPath": "/static/packages/TableTools/media/swf/copy_csv_xls_pdf.swf"
-                },
-                "iDisplayLength": 50,
-                "bLengthChange": true,
-                "bDeferRender": true,
-                "bSortClasses": false
-            } );
-            console.timeEnd("Creating table");
-        });
-    </script>
-{% 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 %} 
-  <!-- Start of body -->
-    <tr>
-      <td bgcolor="#EEEEEE" class="solidBorder">
-        <table width="100%" cellspacing="0" cellpadding="5">
-          <tr>
-            <td valign="top" width="40%" align="left" height="10" bgcolor="#EEEEEE">
-              <p style="font-size:18px;font-family:verdana;color:black"><b>Select and
-              Search</b></p>
-
-              <form method="get" action="/search" class="form-search" name="SEARCHFORM">
-                <table width="100%">
-                  <!--  SPECIES  SELECTION -->
-
-                  <tr>
-                    <td align="right" height="35" style=
-                    "font-size:14px;font-family:verdana;color:black" width="16%">
-                    <b>Species:</b></td>
-
-                    <td width="3%"></td>
-
-                    <td nowrap width="85%" align="left">
-                      <div id="menu0">
-                        <select name="species" size="1" id="species" onchange=
-                        "fillOptions('species');">
-                          </select>
-                      </div>
-                    </td>
-                  </tr><!--  GROUP  SELECTION -->
-
-                  <tr>
-                    <td align="right" height="35" style=
-                    "font-size:14px;font-family:verdana;color:black"><b>Group:</b></td>
-
-                    <td width="3%"></td>
-
-                    <td nowrap width="85%" align="left">
-                      <div id="menu1">
-                        <select name="cross" size="1" id="cross" onchange="fillOptions('cross');">
-                          </select> <input type="button" class="btn" value="Info" onclick=
-                          "javascript:crossinfo();">
-                      </div>
-                    </td>
-                  </tr><!--  TYPE  SELECTION -->
-
-                  <tr>
-                    <td align="right" height="35" style=
-                    "font-size:14px;font-family:verdana;color:black"><b>Type:</b></td>
-
-                    <td width="3%"></td>
-
-                    <td nowrap width="85%" align="left">
-                      <div id="menu2">
-                        <select name="tissue" size="1" id="tissue" onchange=
-                        "fillOptions('tissue');">
-                          </select>
-                      </div>
-                    </td>
-                  </tr><!--  DATABASE  SELECTION -->
-
-                  <tr>
-                    <td align="right" height="35" style=
-                    "font-size:14px;font-family:verdana;color:black"><b>Database:</b></td>
-
-                    <td width="3%"></td>
-
-                    <td nowrap width="85%" align="left">
-                      <div id="menu3">
-                        <select name="database" size="1" id="database">
-                          </select> <input type="submit" class="btn" value="Info" name=
-                          "info_database">
-                      </div>
-                    </td>
-                  </tr><!--  USER HELP   -->
-
-                  <tr>
-                    <td align="right" height="20" width="10%"></td>
-
-                    <td width="3%"></td>
-
-                    <td align="left" width="85%">
-                      <p class="fs12">&nbsp;&nbsp;&nbsp;&nbsp;Databases marked with <b>**</b>
-                      suffix are not public yet.<br>
-                      &nbsp;&nbsp;&nbsp;&nbsp;Access requires <a href="/account.html" target=
-                      "_blank" class="fs14"><small>user login</small></a>.</p>
-                    </td>
-                  </tr><!--  GET ANY  SEARCH -->
-
-                  <tr>
-                    <td align="right" height="35" nowrap="on" style=
-                    "font-size:14px;font-family:verdana;color:black" width="10%">
-                    <b>Search:</b></td>
-
-                    <td width="3%"></td>
-
-                    <td nowrap width="85%" align="left"><input class="input-medium search-query"
-                    id="tfor" name="search_terms" style=
-                    "width:420px; background-color:white; font-family:verdana; font-size:14px"
-                    type="text" maxlength="500"></td>
-                  </tr><!--  GET ANY HELP   -->
-
-                  <tr>
-                    <td align="right" height="20" width="10%"></td>
-
-                    <td width="3%"></td>
-
-                    <td width="85%" align="left">
-                      <p class="fs12">&nbsp;&nbsp;&nbsp;&nbsp;Enter terms, genes, ID numbers in the
-                      <b>Search</b> field.<br>
-                      &nbsp;&nbsp;&nbsp;&nbsp;Use <b>*</b> or <b>?</b> wildcards (Cyp*a?,
-                      synap*).<br>
-                      &nbsp;&nbsp;&nbsp;&nbsp;Use <b>quotes</b> for terms such as <i>"tyrosine
-                      kinase"</i>.</p>
-                    </td>
-                  </tr><!--  SEARCH, MAKE DEFAULT, ADVANCED SEARCH -->
-
-                  <tr align="center">
-                    <td width="3%"></td>
-
-                    <td width="3%"></td>
-
-                    <td align="left" height="40" colspan="3"><input id="btsearch" type="submit"
-                    class="btn btn-primary" value="Search">&nbsp;&nbsp;&nbsp;&nbsp; <input type=
-                    "button" class="btn" value="Make Default" onclick=
-                    "setDefault(this.form);">&nbsp;&nbsp;&nbsp;&nbsp; <input type="button" class=
-                    "btn" value="Advanced Search" onclick=
-                    "javascript:window.open('/index3.html', '_self');"></td>
-                  </tr>
-                </table><input type="hidden" name="FormID" value="searchResult"> <input type=
-                "hidden" name="RISet" value="BXD"> <script src="/javascript/selectDatasetMenu.js"
-                type="text/javascript">
-</script>
-              </form><!--  QUICK HELP  -->
-
-              <p>&nbsp;______________________________________________________</p>
-
-              <p style="font-size:13px;font-family:verdana;color:black"><b>&nbsp; Quick HELP
-              Examples and</b> <a href="http://www.genenetwork.org/index4.html" target="_blank"
-              class="fs14"><b>User's Guide</b></a></p>&nbsp;&nbsp;You can also use advanced
-              commands. Copy these simple examples<br>
-              &nbsp;&nbsp;into the <b>Get Any</b> or <b>Combined</b> search fields:
-
-              <ul style="font-size:12px;font-family:verdana;color:black">
-                <li><b><i>POSITION=(chr1 25 30)</i></b> finds genes, markers, or transcripts on
-                chromosome 1 between 25 and 30 Mb.</li>
-
-                <li><b><i>MEAN=(15 16) LRS=(23 46)</i></b> in the <b>Combined</b> field finds
-                highly expressed genes (15 to 16 log2 units) AND with peak <a href=
-                "http://www.genenetwork.org/glossary.html#L" target="_blank" class=
-                "fs14"><small>LRS</small></a> linkage between 23 and 46.</li>
-
-                <li><b><i>RIF=mitochondrial</i></b> searches RNA databases for <a href=
-                "http://www.ncbi.nlm.nih.gov/projects/GeneRIF/GeneRIFhelp.html" target="_blank"
-                class="fs14"><small>GeneRIF</small></a> links.</li>
-
-                <li><b><i>WIKI=nicotine</i></b> searches <a href=
-                "http://www.genenetwork.org/webqtl/main.py?FormID=geneWiki" target="_blank" class=
-                "fs14"><small>GeneWiki</small></a> for genes that you or other users have annotated
-                with the word <i>nicotine</i>.</li>
-
-                <li><b><i>GO:0045202</i></b> searches for synapse-associated genes listed in the
-                <a href="http://www.godatabase.org/cgi-bin/amigo/go.cgi" target="_blank" class=
-                "fs14"><small>Gene Ontology</small></a>.</li>
-
-                <li><b><i>GO:0045202 LRS=(9 99 Chr4 122 155) cisLRS=(9 999 10)</i></b><br>
-                in <b>Combined</b> finds synapse-associated genes with <a href=
-                "http://www.genenetwork.org/glossary.html#E" target="_blank" class=
-                "fs14"><small>cis eQTL</small></a> on Chr 4 from 122 and 155 Mb with LRS scores
-                between 9 and 999.</li>
-
-                <li><b><i>RIF=diabetes LRS=(9 999 Chr2 100 105) transLRS=(9 999 10)</i></b><br>
-                in <b>Combined</b> finds diabetes-associated transcripts with peak <a href=
-                "http://www.genenetwork.org/glossary.html#E" target="_blank" class=
-                "fs14"><small>trans eQTLs</small></a> on Chr 2 between 100 and 105 Mb with LRS
-                scores between 9 and 999.</li>
-              </ul>
-            </td><!-- END OF FIND SELECTOR PULL-DOWN PANEL (LEFT SIDE)  -->
-            <!-- START OF TOP RIGHT PANEL  -->
-
-            <td valign="top" width="40%" bgcolor="#FFFFFF">
-              <p style="font-size:15px;font-family:verdana;color:black"><b>Websites Affiliated with
-              GeneNetwork</b></p>
-
-              <p style="font-size:12px;font-family:verdana;color:black"></p>
-
-              <ul>
-                <li><a href="http://ucscbrowser.genenetwork.org/" target="_blank">Genome
-                Browser</a> at UTHSC</li>
-
-                <li><a href="http://galaxy.genenetwork.org/" target="_blank">Galaxy</a> at
-                UTHSC</li>
-
-                <li>GeneNetwork at <a href="http://ec2.genenetwork.org/" target="_blank">Amazon
-                Cloud (EC2)</a></li>
-
-                <li>GeneNetwork Source Codes at <a href=
-                "http://sourceforge.net/projects/genenetwork/" target="_blank">SourceForge</a></li>
-
-                <li>GeneNetwork Source Codes at <a href=
-                "https://github.com/genenetwork/genenetwork" target="_blank">GitHub</a></li>
-              </ul>
-
-              <p>____________________________</p>
-
-              <p style="font-size:15px;font-family:verdana;color:black"><b>Getting Started</b>
-              &nbsp;&nbsp;</p>
-
-              <ol style="font-size:12px;font-family:verdana;color:black">
-                <li>Select <b>Species</b> (or select All)</li>
-
-                <li>Select <b>Group</b> (a specific sample)</li>
-
-                <li>Select <b>Type</b> of data:
-
-                  <ul>
-                    <li>Phenotype (traits)</li>
-
-                    <li>Genotype (markers)</li>
-
-                    <li>Expression (mRNAs)</li>
-                  </ul>
-                </li>
-
-                <li>Select a <b>Database</b></li>
-
-                <li>Enter search terms in the <b>Get Any</b> or <b>Combined</b> field: words,
-                genes, ID numbers, probes, advanced search commands</li>
-
-                <li>Click on the <b>Search</b> button</li>
-
-                <li>Optional: Use the <b>Make Default</b> button to save your preferences</li>
-              </ol>
-
-              <p>____________________________</p>
-
-              <p style="font-size:14px;font-family:verdana;color:black"><b>How to Use
-              GeneNetwork</b></p>
-
-              <blockquote>
-                <p style="font-size:12px;font-family:verdana;color:black">Take a 20-40 minute
-                GeneNetwork <a href="http://www.genenetwork.org/tutorial/WebQTLTour/" target=
-                "_blank" class="fs14"><small>Tour</small></a> that includes screen shots and
-                typical steps in the analysis.</p>
-              </blockquote>
-
-              <blockquote>
-                <p style="font-size:12px;font-family:verdana;color:black">For information about
-                resources and methods, select the <img src=
-                "http://www.genenetwork.org/images/upload/Info.png" alt="INFO" border="0" valign=
-                "middle"> buttons.</p>
-
-                <p style="font-size:12px;font-family:verdana;color:black">Try the <a href=
-                "http://alexandria.uthsc.edu/" target="_blank" class=
-                "fs14"><small>Workstation</small></a> site to explore data and features that are
-                being implemented.</p>
-
-                <p style="font-size:12px;font-family:verdana;color:black">Review the <a href=
-                "/conditionsofUse.html" target="_blank" class="fs14"><small>Conditions</small></a>
-                and <a href="/statusandContact.html" target="_blank" class=
-                "fs14"><small>Contacts</small></a> pages for information on the status of data sets
-                and advice on their use and citation.</p>
-              </blockquote>
-
-              <p style="font-size:14px;font-family:verdana;color:black"><b>Mirror and Development
-              Sites</b></p>
-
-              <ul>
-                <li><a href="http://www.genenetwork.org/" target="_blank" style=
-                "font-size:12px;font-family:verdana;color:blue">Main GN site at UTHSC</a> (main
-                site)</li>
-
-                <li><a href="http://www.genenetwork.waimr.uwa.edu.au/" target="_blank" style=
-                "font-size:12px;font-family:verdana;color:blue">Australia at the UWA</a></li>
-
-                <li><a href="http://gn.genetics.ucla.edu/" target="_blank" style=
-                "font-size:12px;font-family:verdana;color:blue">California at UCLA</a></li>
-
-                <li><a href="http://genenetwork.helmholtz-hzi.de/" target="_blank" style=
-                "font-size:12px;font-family:verdana;color:blue">Germany at the HZI</a></li>
-
-                <li><a href="https://genenetwork.hubrecht.eu/" target="_blank" style=
-                "font-size:12px;font-family:verdana;color:blue">Netherlands at the Hubrecht</a>
-                (Development)</li>
-
-                <li><a href="http://genenetwork.memphis.edu/" target="_blank" style=
-                "font-size:12px;font-family:verdana;color:blue">Memphis at the U of M</a></li>
-
-                <li><a href="http://webqtl.bic.nus.edu.sg/" target="_blank" style=
-                "font-size:12px;font-family:verdana;color:blue">Singapore at the NUS</a></li>
-
-                <li><a href="http://genenetwork.epfl.ch/" target="_blank" style=
-                "font-size:12px;font-family:verdana;color:blue">Switzerland at the EPFL</a></li>
-              </ul>
-
-              <p style="font-size:14px;font-family:verdana;color:black"><b>History and
-              Archive</b></p>
-
-              <blockquote>
-                <p style="font-size:12px;font-family:verdana;color:black">GeneNetwork's <a href=
-                "http://artemis.uthsc.edu" target="_blank" class="fs14"><small>Time
-                Machine</small></a> links to earlier versions that correspond to specific
-                publication dates.</p>
-              </blockquote>
-            </td>
-          </tr>
-        </table>
-      </td>
-    </tr>
-    <!-- End of body -->
-    <script src="/javascript/searchtip.js" type="text/javascript">
-    </script>
-    <script type="text/javascript">
-      $(document).ready(function () {
-                initialDatasetSelection();
-        });
-    </script>
-{% 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