aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/guix_profile_setup.org39
-rw-r--r--wqflask/wqflask/correlation_matrix/show_corr_matrix.py124
-rw-r--r--wqflask/wqflask/marker_regression/display_mapping_results.py43
-rw-r--r--wqflask/wqflask/marker_regression/run_mapping.py6
-rw-r--r--wqflask/wqflask/show_trait/show_trait.py23
-rw-r--r--wqflask/wqflask/static/new/css/show_trait.css8
-rw-r--r--wqflask/wqflask/static/new/javascript/show_trait.js8
-rw-r--r--wqflask/wqflask/templates/base.html4
-rw-r--r--wqflask/wqflask/templates/mapping_results.html15
-rw-r--r--wqflask/wqflask/templates/show_trait_calculate_correlations.html2
-rw-r--r--wqflask/wqflask/templates/show_trait_transform_and_filter.html12
11 files changed, 168 insertions, 116 deletions
diff --git a/doc/guix_profile_setup.org b/doc/guix_profile_setup.org
new file mode 100644
index 00000000..c397377c
--- /dev/null
+++ b/doc/guix_profile_setup.org
@@ -0,0 +1,39 @@
+* Setting up GUIX profile for GN
+
+First create a guix profile with the latest packages:
+
+: ~/opt/guix/bin/guix pull
+
+This will create a profile with the latest packages under`~/.config/guix/current`
+
+Now you have the latest guix. Check: `$HOME/.config/guix/current/bin/guix --version`
+
+At this point, it's worth mentioning that installing
+python3-genenetwork using `$HOME/.config/guix/current/bin/guix` should
+work; but let's use the dev version(since that may come handy in
+time), and it's a nice thing to know.
+
+Next, we ensure that the appropriate GUILE<sub>PATHS</sub> are set:
+
+: export GUILE_LOAD_PATH=$HOME/.config/guix/current/share/guile/site/3.0/
+: export GUILE_LOAD_COMPILED_PATH=$HOME/.config/guix/current/lib/guile/3.0/site-ccache/
+
+Get into the container:
+
+: $HOME/.config/guix/current/bin/guix environment -C guix --ad-hoc bash gcc-toolchain
+: ./bootstrap
+: ./configure --localstatedir=/var --sysconfdir=/etc
+
+Check that everything works:
+
+: make check
+
+Clean up and build:
+
+: make clean-go
+: make -j 4
+: exit
+
+Install Python3 (substitute paths when necessary):
+
+: env GUIX_PACKAGE_PATH='/home/zas1024/guix-bioinformatics:/home/zas1024/guix-past/modules' $HOME/.config/guix/current/bin/guix install python3-genenetwork2 -p ~/opt/python3-genenetwork2 --substitute-urls="http://guix.genenetwork.org https://berlin.guixsd.org https://ci.guix.gnu.org https://mirror.hydra.gnu.org"
diff --git a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py
index 9ac02ac5..e7b16e77 100644
--- a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py
+++ b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py
@@ -23,6 +23,9 @@ import math
import random
import string
+import rpy2.robjects as ro
+from rpy2.robjects.packages import importr
+
import numpy as np
import scipy
@@ -160,23 +163,22 @@ class CorrelationMatrix:
for sample in self.all_sample_list:
groups.append(1)
- # Not doing PCA until rpy2 is excised
self.pca_works = "False"
- # try:
- # corr_result_eigen = np.linalg.eig(np.array(self.pca_corr_results))
- # corr_eigen_value, corr_eigen_vectors = sortEigenVectors(
- # corr_result_eigen)
-
- # if self.do_PCA == True:
- # self.pca_works = "True"
- # self.pca_trait_ids = []
- # pca = self.calculate_pca(
- # list(range(len(self.traits))), corr_eigen_value, corr_eigen_vectors)
- # self.loadings_array = self.process_loadings()
- # else:
- # self.pca_works = "False"
- # except:
- # self.pca_works = "False"
+ try:
+ corr_result_eigen = np.linalg.eig(np.array(self.pca_corr_results))
+ corr_eigen_value, corr_eigen_vectors = sortEigenVectors(
+ corr_result_eigen)
+
+ if self.do_PCA == True:
+ self.pca_works = "True"
+ self.pca_trait_ids = []
+ pca = self.calculate_pca(
+ list(range(len(self.traits))), corr_eigen_value, corr_eigen_vectors)
+ self.loadings_array = self.process_loadings()
+ else:
+ self.pca_works = "False"
+ except:
+ self.pca_works = "False"
self.js_data = dict(traits=[trait.name for trait in self.traits],
groups=groups,
@@ -185,51 +187,51 @@ class CorrelationMatrix:
samples=self.all_sample_list,
sample_data=self.sample_data,)
- # def calculate_pca(self, cols, corr_eigen_value, corr_eigen_vectors):
- # base = importr('base')
- # stats = importr('stats')
-
- # corr_results_to_list = robjects.FloatVector(
- # [item for sublist in self.pca_corr_results for item in sublist])
-
- # m = robjects.r.matrix(corr_results_to_list, nrow=len(cols))
- # eigen = base.eigen(m)
- # pca = stats.princomp(m, cor="TRUE")
- # self.loadings = pca.rx('loadings')
- # self.scores = pca.rx('scores')
- # self.scale = pca.rx('scale')
-
- # trait_array = zScore(self.trait_data_array)
- # trait_array_vectors = np.dot(corr_eigen_vectors, trait_array)
-
- # pca_traits = []
- # for i, vector in enumerate(trait_array_vectors):
- # # ZS: Check if below check is necessary
- # # if corr_eigen_value[i-1] > 100.0/len(self.trait_list):
- # pca_traits.append((vector * -1.0).tolist())
-
- # this_group_name = self.trait_list[0][1].group.name
- # temp_dataset = data_set.create_dataset(
- # dataset_name="Temp", dataset_type="Temp", group_name=this_group_name)
- # temp_dataset.group.get_samplelist()
- # for i, pca_trait in enumerate(pca_traits):
- # trait_id = "PCA" + str(i + 1) + "_" + temp_dataset.group.species + "_" + \
- # this_group_name + "_" + datetime.datetime.now().strftime("%m%d%H%M%S")
- # this_vals_string = ""
- # position = 0
- # for sample in temp_dataset.group.all_samples_ordered():
- # if sample in self.shared_samples_list:
- # this_vals_string += str(pca_trait[position])
- # this_vals_string += " "
- # position += 1
- # else:
- # this_vals_string += "x "
- # this_vals_string = this_vals_string[:-1]
-
- # Redis.set(trait_id, this_vals_string, ex=THIRTY_DAYS)
- # self.pca_trait_ids.append(trait_id)
-
- # return pca
+ def calculate_pca(self, cols, corr_eigen_value, corr_eigen_vectors):
+ base = importr('base')
+ stats = importr('stats')
+
+ corr_results_to_list = ro.FloatVector(
+ [item for sublist in self.pca_corr_results for item in sublist])
+
+ m = ro.r.matrix(corr_results_to_list, nrow=len(cols))
+ eigen = base.eigen(m)
+ pca = stats.princomp(m, cor="TRUE")
+ self.loadings = pca.rx('loadings')
+ self.scores = pca.rx('scores')
+ self.scale = pca.rx('scale')
+
+ trait_array = zScore(self.trait_data_array)
+ trait_array_vectors = np.dot(corr_eigen_vectors, trait_array)
+
+ pca_traits = []
+ for i, vector in enumerate(trait_array_vectors):
+ # ZS: Check if below check is necessary
+ # if corr_eigen_value[i-1] > 100.0/len(self.trait_list):
+ pca_traits.append((vector * -1.0).tolist())
+
+ this_group_name = self.trait_list[0][1].group.name
+ temp_dataset = data_set.create_dataset(
+ dataset_name="Temp", dataset_type="Temp", group_name=this_group_name)
+ temp_dataset.group.get_samplelist()
+ for i, pca_trait in enumerate(pca_traits):
+ trait_id = "PCA" + str(i + 1) + "_" + temp_dataset.group.species + "_" + \
+ this_group_name + "_" + datetime.datetime.now().strftime("%m%d%H%M%S")
+ this_vals_string = ""
+ position = 0
+ for sample in temp_dataset.group.all_samples_ordered():
+ if sample in self.shared_samples_list:
+ this_vals_string += str(pca_trait[position])
+ this_vals_string += " "
+ position += 1
+ else:
+ this_vals_string += "x "
+ this_vals_string = this_vals_string[:-1]
+
+ Redis.set(trait_id, this_vals_string, ex=THIRTY_DAYS)
+ self.pca_trait_ids.append(trait_id)
+
+ return pca
def process_loadings(self):
loadings_array = []
diff --git a/wqflask/wqflask/marker_regression/display_mapping_results.py b/wqflask/wqflask/marker_regression/display_mapping_results.py
index ec17d3b0..f941267e 100644
--- a/wqflask/wqflask/marker_regression/display_mapping_results.py
+++ b/wqflask/wqflask/marker_regression/display_mapping_results.py
@@ -861,6 +861,9 @@ class DisplayMappingResults:
(item[1], yZero - item[2] * bootHeightThresh / maxBootCount)),
fill=self.BOOTSTRAP_BOX_COLOR, outline=BLACK)
+ if maxBootCount == 0:
+ return
+
# draw boot scale
highestPercent = (maxBootCount * 100.0) / nboot
bootScale = Plot.detScale(0, highestPercent)
@@ -2286,20 +2289,9 @@ class DisplayMappingResults:
font=VERDANA_FILE, size=int(18 * zoom * 1.5))
yZero = yTopOffset + plotHeight
- # LRSHeightThresh = drawAreaHeight
- # AdditiveHeightThresh = drawAreaHeight/2
- # DominanceHeightThresh = drawAreaHeight/2
- if self.selectedChr == 1:
- LRSHeightThresh = drawAreaHeight - yTopOffset + 30 * (zoom - 1)
- AdditiveHeightThresh = LRSHeightThresh / 2
- DominanceHeightThresh = LRSHeightThresh / 2
- else:
- LRSHeightThresh = drawAreaHeight
- AdditiveHeightThresh = drawAreaHeight / 2
- DominanceHeightThresh = drawAreaHeight / 2
- # LRSHeightThresh = (yZero - yTopOffset + 30*(zoom - 1))
- # AdditiveHeightThresh = LRSHeightThresh/2
- # DominanceHeightThresh = LRSHeightThresh/2
+ LRSHeightThresh = drawAreaHeight
+ AdditiveHeightThresh = drawAreaHeight / 2
+ DominanceHeightThresh = drawAreaHeight / 2
if LRS_LOD_Max > 100:
LRSScale = 20.0
@@ -2380,8 +2372,7 @@ class DisplayMappingResults:
# ZS: I don't know if what I did here with this inner function is clever or overly complicated, but it's the only way I could think of to avoid duplicating the code inside this function
def add_suggestive_significant_lines_and_legend(start_pos_x, chr_length_dist):
- rightEdge = int(start_pos_x + chr_length_dist * \
- plotXScale - self.SUGGESTIVE_WIDTH / 1.5)
+ rightEdge = xLeftOffset + plotWidth
im_drawer.line(
xy=((start_pos_x + self.SUGGESTIVE_WIDTH / 1.5, suggestiveY),
(rightEdge, suggestiveY)),
@@ -2569,7 +2560,10 @@ class DisplayMappingResults:
Xc = startPosX + ((qtlresult['Mb'] - start_cm - startMb) * plotXScale) * (
((qtlresult['Mb'] - start_cm - startMb) * plotXScale) / ((qtlresult['Mb'] - start_cm - startMb + self.GraphInterval) * plotXScale))
else:
- Xc = startPosX + (qtlresult['Mb'] - startMb) * plotXScale
+ if self.selectedChr != -1 and qtlresult['Mb'] > endMb:
+ Xc = startPosX + endMb * plotXScale
+ else:
+ Xc = startPosX + (qtlresult['Mb'] - startMb) * plotXScale
# updated by NL 06-18-2011:
# fix the over limit LRS graph issue since genotype trait may give infinite LRS;
@@ -2580,36 +2574,29 @@ class DisplayMappingResults:
if 'lrs_value' in qtlresult:
if self.LRS_LOD == "LOD" or self.LRS_LOD == "-logP":
if qtlresult['lrs_value'] > 460 or qtlresult['lrs_value'] == 'inf':
- #Yc = yZero - webqtlConfig.MAXLRS*LRSHeightThresh/(LRSAxisList[-1]*self.LODFACTOR)
Yc = yZero - webqtlConfig.MAXLRS * \
LRSHeightThresh / \
(LRS_LOD_Max * self.LODFACTOR)
else:
- #Yc = yZero - qtlresult['lrs_value']*LRSHeightThresh/(LRSAxisList[-1]*self.LODFACTOR)
Yc = yZero - \
qtlresult['lrs_value'] * LRSHeightThresh / \
(LRS_LOD_Max * self.LODFACTOR)
else:
if qtlresult['lrs_value'] > 460 or qtlresult['lrs_value'] == 'inf':
- #Yc = yZero - webqtlConfig.MAXLRS*LRSHeightThresh/LRSAxisList[-1]
Yc = yZero - webqtlConfig.MAXLRS * LRSHeightThresh / LRS_LOD_Max
else:
- #Yc = yZero - qtlresult['lrs_value']*LRSHeightThresh/LRSAxisList[-1]
Yc = yZero - \
qtlresult['lrs_value'] * \
LRSHeightThresh / LRS_LOD_Max
else:
if qtlresult['lod_score'] > 100 or qtlresult['lod_score'] == 'inf':
- #Yc = yZero - webqtlConfig.MAXLRS*LRSHeightThresh/LRSAxisList[-1]
Yc = yZero - webqtlConfig.MAXLRS * LRSHeightThresh / LRS_LOD_Max
else:
if self.LRS_LOD == "LRS":
- #Yc = yZero - qtlresult['lod_score']*self.LODFACTOR*LRSHeightThresh/LRSAxisList[-1]
Yc = yZero - \
qtlresult['lod_score'] * self.LODFACTOR * \
LRSHeightThresh / LRS_LOD_Max
else:
- #Yc = yZero - qtlresult['lod_score']*LRSHeightThresh/LRSAxisList[-1]
Yc = yZero - \
qtlresult['lod_score'] * \
LRSHeightThresh / LRS_LOD_Max
@@ -2642,14 +2629,12 @@ class DisplayMappingResults:
AdditiveHeightThresh / additiveMax
AdditiveCoordXY.append((Xc, Yc))
+ if self.selectedChr != -1 and qtlresult['Mb'] > endMb:
+ break
+
m += 1
if self.manhattan_plot != True:
- # im_drawer.polygon(
- # xy=LRSCoordXY,
- # outline=thisLRSColor
- # #, closed=0, edgeWidth=lrsEdgeWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth)
- # )
draw_open_polygon(canvas, xy=LRSCoordXY, outline=thisLRSColor,
width=lrsEdgeWidth)
diff --git a/wqflask/wqflask/marker_regression/run_mapping.py b/wqflask/wqflask/marker_regression/run_mapping.py
index c5b980a7..f601201b 100644
--- a/wqflask/wqflask/marker_regression/run_mapping.py
+++ b/wqflask/wqflask/marker_regression/run_mapping.py
@@ -673,9 +673,9 @@ def trim_markers_for_table(markers):
sorted_markers = sorted(
markers, key=lambda k: k['lrs_value'], reverse=True)
- # ZS: So we end up with a list of just 2000 markers
- if len(sorted_markers) >= 2000:
- trimmed_sorted_markers = sorted_markers[:2000]
+ #ZS: So we end up with a list of just 2000 markers
+ if len(sorted_markers) >= 10000:
+ trimmed_sorted_markers = sorted_markers[:10000]
return trimmed_sorted_markers
else:
return sorted_markers
diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py
index 9ee6a16d..c07430dd 100644
--- a/wqflask/wqflask/show_trait/show_trait.py
+++ b/wqflask/wqflask/show_trait/show_trait.py
@@ -177,10 +177,13 @@ class ShowTrait:
sample_lists = [group.sample_list for group in self.sample_groups]
categorical_var_list = []
+ self.numerical_var_list = []
if not self.temp_trait:
# ZS: Only using first samplelist, since I think mapping only uses those samples
categorical_var_list = get_categorical_variables(
self.this_trait, self.sample_groups[0])
+ self.numerical_var_list = get_numerical_variables(
+ self.this_trait, self.sample_groups[0])
# ZS: Get list of chromosomes to select for mapping
self.chr_list = [["All", -1]]
@@ -694,6 +697,26 @@ def get_categorical_variables(this_trait, sample_list) -> list:
return categorical_var_list
+def get_numerical_variables(this_trait, sample_list) -> list:
+ numerical_var_list = []
+
+ if len(sample_list.attributes) > 0:
+ for attribute in sample_list.attributes:
+ all_numeric = True
+ all_none = True
+ for attr_val in sample_list.attributes[attribute].distinct_values:
+ if not attr_val:
+ continue
+ try:
+ val_as_float = float(attr_val)
+ all_none = False
+ except:
+ all_numeric = False
+ break
+ if all_numeric and not all_none:
+ numerical_var_list.append(sample_list.attributes[attribute].name)
+
+ return numerical_var_list
def get_genotype_scales(genofiles):
geno_scales = {}
diff --git a/wqflask/wqflask/static/new/css/show_trait.css b/wqflask/wqflask/static/new/css/show_trait.css
index 27404801..782dabc2 100644
--- a/wqflask/wqflask/static/new/css/show_trait.css
+++ b/wqflask/wqflask/static/new/css/show_trait.css
@@ -159,10 +159,10 @@ div.normalize-div {
}
div.mapping-main {
- min-width: 1200px;
+ min-width: 1400px;
}
div.mapping-options {
- min-width: 500px;
+ min-width: 700px;
}
div.covar-options {
@@ -194,7 +194,7 @@ div.select-covar-div {
.selected-covariates {
overflow-y: scroll;
resize: none;
- width: 200px;
+ width: 400px;
}
.cofactor-input {
@@ -259,4 +259,4 @@ input.trait-value-input {
div.inline-div {
display: inline;
-} \ No newline at end of file
+}
diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js
index 569046d3..77ef1720 100644
--- a/wqflask/wqflask/static/new/javascript/show_trait.js
+++ b/wqflask/wqflask/static/new/javascript/show_trait.js
@@ -747,7 +747,11 @@ filter_by_value = function() {
if (filter_column == "value" || filter_column == "stderr"){
var this_col_value = filter_val_nodes[i].childNodes[0].value;
} else {
- var this_col_value = filter_val_nodes[i].childNodes[0].data;
+ if (filter_val_nodes[i].childNodes[0] !== undefined){
+ var this_col_value = filter_val_nodes[i].childNodes[0].data;
+ } else {
+ continue
+ }
}
let this_val_node = val_nodes[i].childNodes[0];
@@ -1700,4 +1704,4 @@ $('#normalize').click(edit_data_change);
Number.prototype.countDecimals = function () {
if(Math.floor(this.valueOf()) === this.valueOf()) return 0;
return this.toString().split(".")[1].length || 0;
-} \ No newline at end of file
+}
diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html
index ddb1d272..12dddf89 100644
--- a/wqflask/wqflask/templates/base.html
+++ b/wqflask/wqflask/templates/base.html
@@ -85,7 +85,7 @@
<li><a href="/snp_browser">Variant Browser</a></li>
<li><a href="http://bnw.genenetwork.org/sourcecodes/home.php">Bayesian Network Webserver</a></li>
<li><a href="https://systems-genetics.org/">Systems Genetics PheWAS</a></li>
- <li><span class="broken_link" href="http://ucscbrowser.genenetwork.org/">Genome Browser</span></li>
+ <li><a href="http://ucscbrowser.genenetwork.org/">Genome Browser</a></li>
<li><a href="http://power.genenetwork.org">BXD Power Calculator</a></li>
<li><a href="http://datafiles.genenetwork.org">Interplanetary File System</a></li>
</ul>
@@ -208,7 +208,7 @@
<a href="http://joss.theoj.org/papers/10.21105/joss.00025"><img src="https://camo.githubusercontent.com/846b750f582ae8f1d0b4f7e8fee78bed705c88ba/687474703a2f2f6a6f73732e7468656f6a2e6f72672f7061706572732f31302e32313130352f6a6f73732e30303032352f7374617475732e737667" alt="JOSS" data-canonical-src="http://joss.theoj.org/papers/10.21105/joss.00025/status.svg" style="max-width:100%;"></a>
</p>
<p>
- Development and source code on <a href="https://github.com/genenetwork/">github</a> with <a href="https://github.com/genenetwork/genenetwork2/issues">issue tracker</a> and <a href="https://github.com/genenetwork/genenetwork2/blob/master/README.md">documentation</a>. Join the <span class="broken_link" href="http://listserv.uthsc.edu/mailman/listinfo/genenetwork-dev">mailing list</span> and find us on <a href="https://webchat.freenode.net/">IRC</a> (#genenetwork channel).
+ Development and source code on <a href="https://github.com/genenetwork/">github</a> with <a href="https://github.com/genenetwork/genenetwork2/issues">issue tracker</a> and <a href="https://github.com/genenetwork/genenetwork2/blob/master/README.md">documentation</a>. Join the <a href="http://listserv.uthsc.edu/mailman/listinfo/genenetwork-dev">mailing list</a> and find us on <span class="broken_link" href="https://webchat.freenode.net/">IRC</span> (#genenetwork channel).
{% if version: %}
<p><small>GeneNetwork {{ version }}</small></p>
{% endif %}
diff --git a/wqflask/wqflask/templates/mapping_results.html b/wqflask/wqflask/templates/mapping_results.html
index d6fc6e37..35d8a157 100644
--- a/wqflask/wqflask/templates/mapping_results.html
+++ b/wqflask/wqflask/templates/mapping_results.html
@@ -357,7 +357,9 @@
{% endif %}
<script language="javascript" type="text/javascript" src="{{ url_for('js', filename='DataTables/js/jquery.dataTables.min.js') }}"></script>
- <script language="javascript" type="text/javascript" src="{{ url_for('js', filename='DataTablesExtensions/buttons/js/dataTables.buttons.min.js') }}"></script>
+ <script language="javascript" type="text/javascript" src="{{ url_for('js', filename='DataTablesExtensions/buttons/js/dataTables.buttons.min.js') }}"></script>
+ <script language="javascript" type="text/javascript" src="{{ url_for('js', filename='DataTablesExtensions/scroller/js/dataTables.scroller.min.js') }}"></script>
+
<script language="javascript" type="text/javascript" src="{{ url_for('js', filename='DataTablesExtensions/plugins/sorting/scientific.js') }}"></script>
<script language="javascript" type="text/javascript" src="{{ url_for('js', filename='DataTablesExtensions/plugins/sorting/natural.js') }}"></script>
<script language="javascript" type="text/javascript" src="{{ url_for('js', filename='purescript-genome-browser/js/purescript-genetics-browser.js') }}"></script>
@@ -409,13 +411,12 @@
"info": "Showing from _START_ to _END_ of " + js_data.total_markers + " records",
},
"order": [[1, "asc" ]],
- "sDom": "iRZtir",
- "iDisplayLength": -1,
- "autoWidth": false,
- "deferRender": true,
+ "sDom": "itir",
+ "autoWidth": true,
"bSortClasses": false,
- "scrollCollapse": false,
- "paging": false
+ "scrollY": "100vh",
+ "scroller": true,
+ "scrollCollapse": true
} );
{% elif selectedChr != -1 and plotScale =="physic" and (dataset.group.species == 'mouse' or dataset.group.species == 'rat') %}
$('#trait_table').dataTable( {
diff --git a/wqflask/wqflask/templates/show_trait_calculate_correlations.html b/wqflask/wqflask/templates/show_trait_calculate_correlations.html
index ffbe313c..16a819fa 100644
--- a/wqflask/wqflask/templates/show_trait_calculate_correlations.html
+++ b/wqflask/wqflask/templates/show_trait_calculate_correlations.html
@@ -72,7 +72,7 @@
<select name="corr_sample_method" class="form-control">
<option value="pearson">Pearson</option>
<option value="spearman">Spearman Rank</option>
- <!-- <option value="bicor">Biweight Midcorrelation</option> -->
+ <option value="bicor">Biweight Midcorrelation</option>
</select>
</div>
</div>
diff --git a/wqflask/wqflask/templates/show_trait_transform_and_filter.html b/wqflask/wqflask/templates/show_trait_transform_and_filter.html
index e3f5ef81..20f78b48 100644
--- a/wqflask/wqflask/templates/show_trait_transform_and_filter.html
+++ b/wqflask/wqflask/templates/show_trait_transform_and_filter.html
@@ -46,19 +46,17 @@
</div>
{% endif %}
<div id="filterMenuSpan" class="input-append block-div-2">
- <label for="filter_samples_field">Filter samples by {% if not sample_groups[0].attributes %}value{% endif %} </label>
- {% if sample_groups[0].attributes %}
+ <label for="filter_samples_field">Filter samples by {% if (numerical_var_list|length == 0) and (not js_data.se_exists) %}value{% endif %} </label>
+ {% if (numerical_var_list|length > 0) or js_data.se_exists %}
<select id="filter_column">
<option value="value">Value</option>
{% if js_data.se_exists %}
<option value="stderr">SE</option>
{% endif %}
- {% for attribute in sample_groups[0].attributes %}
-
+ {% for attribute in numerical_var_list %}
<option value="{{ loop.index }}">
- {{ sample_groups[0].attributes[attribute].name }}
+ {{ attribute }}
</option>
-
{% endfor %}
</select>
{% endif %}
@@ -116,4 +114,4 @@
<p>Samples with no value (x) can be hidden by clicking<strong>Hide No Value</strong> button.</p>
</div>
-</div> \ No newline at end of file
+</div>