@@ -185,7 +177,7 @@
$(document).ready( function () {
- $('.panel-heading').find('a').click(function () {
+ $('.panel-heading').click(function () {
if ($(this).hasClass('collapsed')){
$(this).find('.glyphicon-chevron-down').removeClass('glyphicon-chevron-down').addClass('glyphicon-chevron-up');
}
--
cgit v1.2.3
From e4621a2a759f55659b5c631baec5e5f497e0cff1 Mon Sep 17 00:00:00 2001
From: Artem Tarasov
Date: Thu, 18 Jun 2015 19:55:41 +0300
Subject: add missing line to webqtlUtil
---
wqflask/utility/webqtlUtil.py | 1 +
1 file changed, 1 insertion(+)
(limited to 'wqflask')
diff --git a/wqflask/utility/webqtlUtil.py b/wqflask/utility/webqtlUtil.py
index 4d7981d9..ab746228 100755
--- a/wqflask/utility/webqtlUtil.py
+++ b/wqflask/utility/webqtlUtil.py
@@ -43,6 +43,7 @@ ParInfo ={
'BXH':['BHF1', 'HBF1', 'C57BL/6J', 'C3H/HeJ'],
'AKXD':['AKF1', 'KAF1', 'AKR/J', 'DBA/2J'],
'BXD':['B6D2F1', 'D2B6F1', 'C57BL/6J', 'DBA/2J'],
+'C57BL-6JxC57BL-6NJF2':['', '', 'C57BL/6J', 'C57BL/6NJ'],
'BXD300':['B6D2F1', 'D2B6F1', 'C57BL/6J', 'DBA/2J'],
'B6BTBRF2':['B6BTBRF1', 'BTBRB6F1', 'C57BL/6J', 'BTBRT<+>tf/J'],
'BHHBF2':['B6HF2','HB6F2','C57BL/6J','C3H/HeJ'],
--
cgit v1.2.3
From 45ebe51fbee7da1617b01cff7b9ab404d6ad1aa7 Mon Sep 17 00:00:00 2001
From: Artem Tarasov
Date: Thu, 18 Jun 2015 20:05:49 +0300
Subject: fix all_samples_ordered
move duplicated code into a method,
handle the case of missing f1/f12 correctly
---
wqflask/base/data_set.py | 6 ++++++
wqflask/base/trait.py | 9 +--------
wqflask/wqflask/show_trait/show_trait.py | 9 +--------
3 files changed, 8 insertions(+), 16 deletions(-)
(limited to 'wqflask')
diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py
index acfee3d4..b17396e5 100755
--- a/wqflask/base/data_set.py
+++ b/wqflask/base/data_set.py
@@ -392,6 +392,12 @@ class DatasetGroup(object):
Redis.set(key, json.dumps(self.samplelist))
Redis.expire(key, 60*5)
+ def all_samples_ordered(self):
+ result = []
+ lists = (self.parlist, self.f1list, self.samplelist)
+ [result.extend(l) for l in lists if l]
+ return result
+
def read_genotype_file(self):
'''Read genotype from .geno file instead of database'''
#if self.group == 'BXD300':
diff --git a/wqflask/base/trait.py b/wqflask/base/trait.py
index 7f1170a9..2e0e86fb 100755
--- a/wqflask/base/trait.py
+++ b/wqflask/base/trait.py
@@ -251,14 +251,7 @@ class GeneralTrait(object):
# Todo: is this necessary? If not remove
self.data.clear()
- if self.dataset.group.parlist:
- all_samples_ordered = (self.dataset.group.parlist +
- self.dataset.group.f1list +
- self.dataset.group.samplelist)
- elif self.dataset.group.f1list:
- all_samples_ordered = self.dataset.group.f1list + self.dataset.group.samplelist
- else:
- all_samples_ordered = self.dataset.group.samplelist
+ all_samples_ordered = self.dataset.group.all_samples_ordered()
if results:
for item in results:
diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py
index bd827086..61305e9b 100755
--- a/wqflask/wqflask/show_trait/show_trait.py
+++ b/wqflask/wqflask/show_trait/show_trait.py
@@ -1148,14 +1148,7 @@ class ShowTrait(object):
def make_sample_lists(self, this_trait):
- if self.dataset.group.parlist:
- all_samples_ordered = (self.dataset.group.parlist +
- self.dataset.group.f1list +
- self.dataset.group.samplelist)
- elif self.dataset.group.f1list:
- all_samples_ordered = self.dataset.group.f1list + self.dataset.group.samplelist
- else:
- all_samples_ordered = list(self.dataset.group.samplelist)
+ all_samples_ordered = self.dataset.group.all_samples_ordered()
primary_sample_names = list(all_samples_ordered)
--
cgit v1.2.3
From 526fe5381a2d26dd5269553e2fa648e6827030ad Mon Sep 17 00:00:00 2001
From: Artem Tarasov
Date: Thu, 18 Jun 2015 21:13:13 +0300
Subject: removed unused function
---
wqflask/utility/webqtlUtil.py | 16 ----------------
1 file changed, 16 deletions(-)
(limited to 'wqflask')
diff --git a/wqflask/utility/webqtlUtil.py b/wqflask/utility/webqtlUtil.py
index 4d7981d9..4b3d0112 100755
--- a/wqflask/utility/webqtlUtil.py
+++ b/wqflask/utility/webqtlUtil.py
@@ -880,22 +880,6 @@ def cmpGenoPos(A,B):
except:
return 0
-#XZhou: Must use "BINARY" to enable case sensitive comparison.
-def authUser(name,password,db, encrypt=None):
- try:
- if encrypt:
- query = 'SELECT privilege, id,name,password, grpName FROM User WHERE name= BINARY \'%s\' and password= BINARY \'%s\'' % (name,password)
- else:
- query = 'SELECT privilege, id,name,password, grpName FROM User WHERE name= BINARY \'%s\' and password= BINARY SHA(\'%s\')' % (name,password)
- db.execute(query)
- records = db.fetchone()
- if not records:
- raise ValueError
- return records#(privilege,id,name,password,grpName)
- except:
- return (None, None, None, None, None)
-
-
def hasAccessToConfidentialPhenotypeTrait(privilege, userName, authorized_users):
access_to_confidential_phenotype_trait = 0
if webqtlConfig.USERDICT[privilege] > webqtlConfig.USERDICT['user']:
--
cgit v1.2.3
From aca78aa6f8ca1dfc1bde8237a065bccf5ccf52c8 Mon Sep 17 00:00:00 2001
From: zsloan
Date: Thu, 18 Jun 2015 23:15:38 +0000
Subject: Fixed issue that prevented multiple mapping submissions without
refreshing. Also changed to where results open in new window instead of
colorbox, though an issue remains where the css doesn't seem to be getting
imported properly.
---
.../new/javascript/show_trait_mapping_tools.coffee | 26 +-
.../new/javascript/show_trait_mapping_tools.js | 399 ++++++++++-----------
wqflask/wqflask/templates/base.html | 6 -
wqflask/wqflask/templates/interval_mapping.html | 2 +-
wqflask/wqflask/templates/marker_regression.html | 11 +-
wqflask/wqflask/templates/show_trait.html | 2 -
.../templates/show_trait_mapping_tools.html | 2 +-
.../wqflask/templates/show_trait_progress_bar.html | 15 +-
wqflask/wqflask/views.py | 2 +-
9 files changed, 218 insertions(+), 247 deletions(-)
(limited to 'wqflask')
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 881ea74d..9e070c97 100755
--- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee
+++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee
@@ -76,18 +76,20 @@ do_ajax_post = (url, form_data) ->
return false
open_mapping_results = (data) ->
- $.colorbox(
- html: data
- href: "#mapping_results_holder"
- height: "90%"
- width: "90%"
- )
+ results_window = window.open()
+ $(results_window.document.body).html(data)
+ #$.colorbox(
+ # html: data
+ # href: "#mapping_results_holder"
+ # height: "90%"
+ # width: "90%"
+ #)
showalert = (message,alerttype) ->
$('#alert_placeholder').append('
')
-$("#interval_mapping_compute").click(() =>
+$("#interval_mapping_compute").on("click", =>
showalert("One or more outliers exist in this data set. Please review values before mapping. \
Including outliers when mapping may lead to misleading results. \
We recommend
winsorising the outliers \
@@ -116,8 +118,8 @@ $('input[name=display_all]').change(() =>
$('#suggestive').hide()
)
-$("#pylmm_compute").click(() =>
- $("#progress_bar_container").modal({show:true})
+$("#pylmm_compute").on("click", =>
+ #$("#progress_bar_container").modal()
url = "/marker_regression"
$('input[name=method]').val("pylmm")
$('input[name=num_perm]').val($('input[name=num_perm_pylmm]').val())
@@ -133,7 +135,7 @@ $("#pylmm_compute").click(() =>
-$("#rqtl_geno_compute").click(() =>
+$("#rqtl_geno_compute").on("click", =>
$("#progress_bar_container").modal()
url = "/marker_regression"
$('input[name=method]').val("rqtl_geno")
@@ -150,7 +152,7 @@ $("#rqtl_geno_compute").click(() =>
)
-$("#plink_compute").click(() =>
+$("#plink_compute").on("click", =>
$("#static_progress_bar_container").modal()
url = "/marker_regression"
$('input[name=method]').val("plink")
@@ -163,7 +165,7 @@ $("#plink_compute").click(() =>
do_ajax_post(url, form_data)
)
-$("#gemma_compute").click(() =>
+$("#gemma_compute").on("click", =>
console.log("RUNNING GEMMA")
$("#static_progress_bar_container").modal()
url = "/marker_regression"
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 1779df4b..cc1ddf37 100755
--- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js
+++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js
@@ -1,223 +1,218 @@
// Generated by CoffeeScript 1.8.0
-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");
+(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");
+ }
}
- }
-};
-
-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();
- }
- };
- })(this)
- });
- return false;
-};
-block_outliers = function() {
- return $('.outlier').each((function(_this) {
- return function(_index, element) {
- return $(element).find('.trait_value_input').val('x');
+ 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
};
- })(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%"
- });
-};
-
-showalert = function(message, alerttype) {
- return $('#alert_placeholder').append('
');
-};
-
-$("#interval_mapping_compute").click((function(_this) {
- return function() {
- var form_data, url;
- showalert("One or more outliers exist in this data set. Please review values before mapping. Including outliers when mapping may lead to misleading results. We recommend
winsorising the outliers or simply deleting them.", "alert-success");
- console.log("In interval mapping");
- $("#progress_bar_container").modal();
- url = "/interval_mapping";
- $('input[name=method]').val("reaper");
- $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val());
- $('input[name=mapping_display_all]').val($('input[name=display_all_reaper]'));
- $('input[name=suggestive]').val($('input[name=suggestive_reaper]'));
- form_data = $('#trait_data_form').serialize();
- console.log("form_data is:", form_data);
- return do_ajax_post(url, form_data);
+ 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();
+ }
+ };
+ })(this)
+ });
+ return false;
};
-})(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();
- }
+ block_outliers = function() {
+ return $('.outlier').each((function(_this) {
+ return function(_index, element) {
+ return $(element).find('.trait_value_input').val('x');
+ };
+ })(this));
};
-})(this));
-$("#pylmm_compute").click((function(_this) {
- return function() {
- var form_data, url;
- $("#progress_bar_container").modal({
- show: true
+ 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)
});
- 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);
+ console.log("settingInterval");
+ this.my_timer = setInterval(get_progress, 1000);
+ return false;
};
-})(this));
-
-$("#rqtl_geno_compute").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);
+
+ open_mapping_results = function(data) {
+ var results_window;
+ results_window = window.open();
+ return $(results_window.document.body).html(data);
};
-})(this));
-
-$("#plink_compute").click((function(_this) {
- return function() {
- var form_data, url;
- $("#static_progress_bar_container").modal();
- url = "/marker_regression";
- $('input[name=method]').val("plink");
- $('input[name=mapping_display_all]').val($('input[name=display_all_plink]').val());
- $('input[name=suggestive]').val($('input[name=suggestive_plink]').val());
- $('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);
+
+ showalert = function(message, alerttype) {
+ return $('#alert_placeholder').append('
');
};
-})(this));
-
-$("#gemma_compute").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);
+
+ $("#interval_mapping_compute").on("click", (function(_this) {
+ return function() {
+ var form_data, url;
+ showalert("One or more outliers exist in this data set. Please review values before mapping. Including outliers when mapping may lead to misleading results. We recommend
winsorising the outliers or simply deleting them.", "alert-success");
+ console.log("In interval mapping");
+ $("#progress_bar_container").modal();
+ url = "/interval_mapping";
+ $('input[name=method]').val("reaper");
+ $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val());
+ $('input[name=mapping_display_all]').val($('input[name=display_all_reaper]'));
+ $('input[name=suggestive]').val($('input[name=suggestive_reaper]'));
+ form_data = $('#trait_data_form').serialize();
+ console.log("form_data is:", form_data);
+ return do_ajax_post(url, form_data);
+ };
+ })(this));
+
+ $('#suggestive').hide();
+
+ $('input[name=display_all]').change((function(_this) {
+ return function() {
+ console.log("check");
+ if ($('input[name=display_all]:checked').val() === "False") {
+ return $('#suggestive').show();
+ } else {
+ return $('#suggestive').hide();
+ }
+ };
+ })(this));
+
+ $("#pylmm_compute").on("click", (function(_this) {
+ return function() {
+ var form_data, url;
+ 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));
+
+ composite_mapping_fields = function() {
+ return $(".composite_fields").toggle();
};
-})(this));
-composite_mapping_fields = function() {
- return $(".composite_fields").toggle();
-};
+ mapping_method_fields = function() {
+ return $(".mapping_method_fields").toggle();
+ };
-mapping_method_fields = function() {
- return $(".mapping_method_fields").toggle();
-};
+ $("#use_composite_choice").change(composite_mapping_fields);
-$("#use_composite_choice").change(composite_mapping_fields);
+ $("#mapping_method_choice").change(mapping_method_fields);
-$("#mapping_method_choice").change(mapping_method_fields);
+ toggle_enable_disable = function(elem) {
+ return $(elem).prop("disabled", !$(elem).prop("disabled"));
+ };
-toggle_enable_disable = function(elem) {
- return $(elem).prop("disabled", !$(elem).prop("disabled"));
-};
+ $("#choose_closet_control").change(function() {
+ return toggle_enable_disable("#control_locus");
+ });
-$("#choose_closet_control").change(function() {
- return toggle_enable_disable("#control_locus");
-});
+ $("#display_all_lrs").change(function() {
+ return toggle_enable_disable("#suggestive_lrs");
+ });
-$("#display_all_lrs").change(function() {
- return toggle_enable_disable("#suggestive_lrs");
-});
+}).call(this);
diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html
index 462a59a2..30519e24 100755
--- a/wqflask/wqflask/templates/base.html
+++ b/wqflask/wqflask/templates/base.html
@@ -10,12 +10,6 @@
-
-
-
-
diff --git a/wqflask/wqflask/templates/interval_mapping.html b/wqflask/wqflask/templates/interval_mapping.html
index 82a96ba1..4d99d2e7 100755
--- a/wqflask/wqflask/templates/interval_mapping.html
+++ b/wqflask/wqflask/templates/interval_mapping.html
@@ -80,7 +80,7 @@
-
+
diff --git a/wqflask/wqflask/templates/marker_regression.html b/wqflask/wqflask/templates/marker_regression.html
index 6aed69d5..62146662 100755
--- a/wqflask/wqflask/templates/marker_regression.html
+++ b/wqflask/wqflask/templates/marker_regression.html
@@ -1,7 +1,8 @@
{% extends "base.html" %}
{% block title %}Interval Mapping{% endblock %}
{% block css %}
-
+
+
@@ -75,22 +76,16 @@
js_data = {{ js_data | safe }}
-
-
-
+
-
-
diff --git a/wqflask/wqflask/templates/show_trait.html b/wqflask/wqflask/templates/show_trait.html
index 1f53e089..ca530162 100755
--- a/wqflask/wqflask/templates/show_trait.html
+++ b/wqflask/wqflask/templates/show_trait.html
@@ -134,12 +134,10 @@
-
-">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/wqflask/wqflask/templates/show_trait.html b/wqflask/wqflask/templates/show_trait.html
index ca530162..cdde5d9d 100755
--- a/wqflask/wqflask/templates/show_trait.html
+++ b/wqflask/wqflask/templates/show_trait.html
@@ -12,6 +12,8 @@
+
+
{% endblock %}
{% block content %}
@@ -133,8 +135,16 @@
-
+
+
+
+
+
+
+
+
+
--
cgit v1.2.3
From 719b41035d721cdd5f4e0faced88534af2619980 Mon Sep 17 00:00:00 2001
From: Artem Tarasov
Date: Mon, 22 Jun 2015 00:06:52 +0300
Subject: fixed a few potential security issues
---
wqflask/base/data_set.py | 16 +++++++++-------
wqflask/base/trait.py | 9 +++++----
2 files changed, 14 insertions(+), 11 deletions(-)
(limited to 'wqflask')
diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py
index acfee3d4..14a2a388 100755
--- a/wqflask/base/data_set.py
+++ b/wqflask/base/data_set.py
@@ -805,11 +805,11 @@ class PhenotypeDataSet(DataSet):
WHERE
PublishXRef.InbredSetId = PublishFreeze.InbredSetId AND
PublishData.Id = PublishXRef.DataId AND PublishXRef.Id = %s AND
- PublishFreeze.Id = %d AND PublishData.StrainId = Strain.Id
+ PublishFreeze.Id = %s AND PublishData.StrainId = Strain.Id
Order BY
Strain.Name
- """ % (trait, self.id)
- results = g.db.execute(query).fetchall()
+ """
+ results = g.db.execute(query, (trait, self.id)).fetchall()
return results
@@ -892,15 +892,17 @@ class GenotypeDataSet(DataSet):
left join GenoSE on
(GenoSE.DataId = GenoData.Id AND GenoSE.StrainId = GenoData.StrainId)
WHERE
- Geno.SpeciesId = %s AND Geno.Name = '%s' AND GenoXRef.GenoId = Geno.Id AND
+ Geno.SpeciesId = %s AND Geno.Name = %s AND GenoXRef.GenoId = Geno.Id AND
GenoXRef.GenoFreezeId = GenoFreeze.Id AND
- GenoFreeze.Name = '%s' AND
+ GenoFreeze.Name = %s AND
GenoXRef.DataId = GenoData.Id AND
GenoData.StrainId = Strain.Id
Order BY
Strain.Name
- """ % (webqtlDatabaseFunction.retrieve_species_id(self.group.name), trait, self.name)
- results = g.db.execute(query).fetchall()
+ """
+ results = g.db.execute(query,
+ (webqtlDatabaseFunction.retrieve_species_id(self.group.name),
+ trait, self.name)).fetchall()
return results
diff --git a/wqflask/base/trait.py b/wqflask/base/trait.py
index 7f1170a9..7689a469 100755
--- a/wqflask/base/trait.py
+++ b/wqflask/base/trait.py
@@ -299,6 +299,7 @@ class GeneralTrait(object):
""" % (self.name, self.dataset.id)
print("query is:", query)
+ assert self.name.isdigit()
trait_info = g.db.execute(query).fetchone()
#XZ, 05/08/2009: Xiaodong add this block to use ProbeSet.Id to find the probeset instead of just using ProbeSet.Name
@@ -337,10 +338,10 @@ class GeneralTrait(object):
trait_info = g.db.execute(query).fetchone()
#print("trait_info is: ", pf(trait_info))
else: #Temp type
- query = """SELECT %s FROM %s WHERE Name = %s
- """ % (string.join(self.dataset.display_fields,','),
- self.dataset.type, self.name)
- trait_info = g.db.execute(query).fetchone()
+ query = """SELECT %s FROM %s WHERE Name = %s"""
+ trait_info = g.db.execute(query,
+ (string.join(self.dataset.display_fields,','),
+ self.dataset.type, self.name)).fetchone()
if trait_info:
self.haveinfo = True
--
cgit v1.2.3
From a41f9323ea5b86be6d2139a927586630b222af68 Mon Sep 17 00:00:00 2001
From: Artem Tarasov
Date: Mon, 22 Jun 2015 00:30:50 +0300
Subject: escape docs query
---
wqflask/wqflask/docs.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'wqflask')
diff --git a/wqflask/wqflask/docs.py b/wqflask/wqflask/docs.py
index 07b0b81a..a8363a1f 100755
--- a/wqflask/wqflask/docs.py
+++ b/wqflask/wqflask/docs.py
@@ -8,9 +8,9 @@ class Docs(object):
sql = """
SELECT Docs.title, Docs.content
FROM Docs
- WHERE Docs.entry LIKE '%s'
+ WHERE Docs.entry LIKE %s
"""
- result = g.db.execute(sql % (entry)).fetchone()
+ result = g.db.execute(sql, str(entry)).fetchone()
self.entry = entry
self.title = result[0]
self.content = result[1]
--
cgit v1.2.3
From 8c9a25122606c9715465c54b8bb706068fa578ae Mon Sep 17 00:00:00 2001
From: zsloan
Date: Mon, 22 Jun 2015 15:23:36 +0000
Subject: Just a few minor changes before pulling Artem's fix to the mapping
issue.
---
wqflask/wqflask/interval_mapping/interval_mapping.py | 5 ++++-
wqflask/wqflask/templates/interval_mapping.html | 13 +++++++------
wqflask/wqflask/templates/marker_regression.html | 2 +-
3 files changed, 12 insertions(+), 8 deletions(-)
(limited to 'wqflask')
diff --git a/wqflask/wqflask/interval_mapping/interval_mapping.py b/wqflask/wqflask/interval_mapping/interval_mapping.py
index 4b4b7f73..5f491652 100755
--- a/wqflask/wqflask/interval_mapping/interval_mapping.py
+++ b/wqflask/wqflask/interval_mapping/interval_mapping.py
@@ -85,7 +85,10 @@ class IntervalMapping(object):
def set_options(self, start_vars):
"""Sets various options (physical/genetic mapping, # permutations, which chromosome"""
- self.num_permutations = int(start_vars['num_perm'])
+ if start_vars['num_perm'] == "":
+ self.num_permutations = 0
+ else:
+ self.num_permutations = start_vars['num_perm']
if start_vars['manhattan_plot'] == "true":
self.manhattan_plot = True
else:
diff --git a/wqflask/wqflask/templates/interval_mapping.html b/wqflask/wqflask/templates/interval_mapping.html
index 4d99d2e7..b0866a35 100755
--- a/wqflask/wqflask/templates/interval_mapping.html
+++ b/wqflask/wqflask/templates/interval_mapping.html
@@ -1,5 +1,6 @@
{% block css %}
-
+
+
@@ -71,16 +72,16 @@
js_data = {{ js_data | safe }}
-
-
+
+
+
+
-
+
-
diff --git a/wqflask/wqflask/templates/marker_regression.html b/wqflask/wqflask/templates/marker_regression.html
index 62146662..ec344611 100755
--- a/wqflask/wqflask/templates/marker_regression.html
+++ b/wqflask/wqflask/templates/marker_regression.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-{% block title %}Interval Mapping{% endblock %}
+{% block title %}Marker Regression{% endblock %}
{% block css %}
--
cgit v1.2.3
From baff5eb1e890a4a8b33fb1917a1c17d3b1737959 Mon Sep 17 00:00:00 2001
From: zsloan
Date: Fri, 26 Jun 2015 18:29:49 +0000
Subject: Fixed bug where mapping results sometimes wouldn't display. This
would occur due to a chromosome (in this case the last) not having any
markers.
Improved the way plink gets its path/command to use a method similar to the
one Pjotr used with pylmm. I'll also do this for the other mapping methods.
Fixed issue where the Y axis would always say LOD score. It now says LRS for
mapping methods that return LRS
Switched interval mapping (qtl reaper) to use the marker_regression template and removed the interval_mapping template (since it's unnecessary)
Some commented out changes remain (in show_trait_mapping_tools and create_lodchart) from when I was attempting to open the mapping results
in a new page. I had resolved every issue but the mapping javascript (lod_chart) not
being able to access js_data (which has all the result data; markers, p-values, etc). I'm pretty
sure that this is because js_data was inserted into the html after the page was loaded while
the chart code ran immediately. I experimented with adding a short timeout to the mapping
javascript and data table javascript, but while it worked for the table it did not work for the
mapping figure. I don't know why this is.
---
wqflask/utility/tools.py | 18 +
wqflask/wqflask/do_search.py | 2 +-
.../wqflask/interval_mapping/interval_mapping.py | 3 +-
.../wqflask/marker_regression/marker_regression.py | 28 +-
.../static/new/javascript/create_lodchart.coffee | 11 +-
.../static/new/javascript/create_lodchart.js | 10 +-
.../wqflask/static/new/javascript/lod_chart.coffee | 1031 ++++++++++----------
wqflask/wqflask/static/new/javascript/lod_chart.js | 54 +-
.../wqflask/static/new/javascript/panelutil.coffee | 19 +-
wqflask/wqflask/static/new/javascript/panelutil.js | 13 +-
.../new/javascript/show_trait_mapping_tools.coffee | 44 +-
.../new/javascript/show_trait_mapping_tools.js | 413 ++++----
wqflask/wqflask/templates/interval_mapping.html | 117 ---
wqflask/wqflask/templates/old_index_page.html | 320 ------
wqflask/wqflask/views.py | 6 +-
15 files changed, 838 insertions(+), 1251 deletions(-)
delete mode 100755 wqflask/wqflask/templates/interval_mapping.html
delete mode 100755 wqflask/wqflask/templates/old_index_page.html
(limited to 'wqflask')
diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py
index 1a5c19d9..6e35f00a 100644
--- a/wqflask/utility/tools.py
+++ b/wqflask/utility/tools.py
@@ -49,3 +49,21 @@ def pylmm_command(default=None):
path = get_setting('PYLMM_PATH',default,guess,get_valid_path)
pylmm_command = 'python '+path+'/pylmm_gn2/lmm.py'
return path,pylmm_command
+
+def plink_command(default=None):
+ """
+ Return the path to the repository and the python command to call
+ """
+ def get_valid_path(path):
+ """Test for a valid repository"""
+ if path:
+ sys.stderr.write("Trying PLINK_PATH in "+path+"\n")
+ if path and os.path.isfile(path+'/plink'):
+ return path
+ else:
+ None
+
+ guess = os.environ.get('HOME')+'/plink'
+ path = get_setting('PLINK_PATH',default,guess,get_valid_path)
+ plink_command = path+'/plink'
+ return path,plink_command
\ No newline at end of file
diff --git a/wqflask/wqflask/do_search.py b/wqflask/wqflask/do_search.py
index 8c1b6730..cec71777 100755
--- a/wqflask/wqflask/do_search.py
+++ b/wqflask/wqflask/do_search.py
@@ -115,7 +115,7 @@ class MrnaAssaySearch(DoSearch):
DoSearch.search_types['ProbeSet'] = "MrnaAssaySearch"
- base_query = """SELECT ProbeSet.Name as TNAME,
+ base_query = """SELECT distinct ProbeSet.Name as TNAME,
0 as thistable,
ProbeSetXRef.Mean as TMEAN,
ProbeSetXRef.LRS as TLRS,
diff --git a/wqflask/wqflask/interval_mapping/interval_mapping.py b/wqflask/wqflask/interval_mapping/interval_mapping.py
index 5f491652..672a9401 100755
--- a/wqflask/wqflask/interval_mapping/interval_mapping.py
+++ b/wqflask/wqflask/interval_mapping/interval_mapping.py
@@ -74,6 +74,7 @@ class IntervalMapping(object):
json.dumps(self.json_data, webqtlConfig.TMPDIR + json_filename)
self.js_data = dict(
+ result_score_type = "LRS",
manhattan_plot = self.manhattan_plot,
additive = self.additive,
chromosomes = chromosome_mb_lengths,
@@ -88,7 +89,7 @@ class IntervalMapping(object):
if start_vars['num_perm'] == "":
self.num_permutations = 0
else:
- self.num_permutations = start_vars['num_perm']
+ self.num_permutations = int(start_vars['num_perm'])
if start_vars['manhattan_plot'] == "true":
self.manhattan_plot = True
else:
diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py
index 2b0e89b3..c003f5e8 100755
--- a/wqflask/wqflask/marker_regression/marker_regression.py
+++ b/wqflask/wqflask/marker_regression/marker_regression.py
@@ -39,9 +39,10 @@ from utility import helper_functions
from utility import Plot, Bunch
from utility import temp_data
from utility.benchmark import Bench
-from utility.tools import pylmm_command
+from utility.tools import pylmm_command, plink_command
PYLMM_PATH,PYLMM_COMMAND = pylmm_command()
+PLINK_PATH,PLINK_COMMAND = plink_command()
class MarkerRegression(object):
@@ -178,6 +179,7 @@ class MarkerRegression(object):
self.js_data = dict(
+ result_score_type = "LOD",
json_data = self.json_data,
this_trait = self.this_trait.name,
data_set = self.dataset.name,
@@ -458,29 +460,16 @@ class MarkerRegression(object):
def run_plink(self):
-
- os.chdir("/home/zas1024/plink")
-
plink_output_filename = webqtlUtil.genRandStr("%s_%s_"%(self.dataset.group.name, self.this_trait.name))
self.gen_pheno_txt_file_plink(pheno_filename = plink_output_filename)
- plink_command = './plink --noweb --ped %s.ped --no-fid --no-parents --no-sex --no-pheno --map %s.map --pheno %s/%s.txt --pheno-name %s --maf %s --missing-phenotype -9999 --out %s%s --assoc ' % (self.dataset.group.name, self.dataset.group.name, webqtlConfig.TMPDIR, plink_output_filename, self.this_trait.name, self.maf, webqtlConfig.TMPDIR, plink_output_filename)
-
+ plink_command = PLINK_COMMAND + ' --noweb --ped %s/%s.ped --no-fid --no-parents --no-sex --no-pheno --map %s/%s.map --pheno %s%s.txt --pheno-name %s --maf %s --missing-phenotype -9999 --out %s%s --assoc ' % (PLINK_PATH, self.dataset.group.name, PLINK_PATH, self.dataset.group.name, webqtlConfig.TMPDIR, plink_output_filename, self.this_trait.name, self.maf, webqtlConfig.TMPDIR, plink_output_filename)
+ print("plink_command:", plink_command)
+
os.system(plink_command)
count, p_values = self.parse_plink_output(plink_output_filename)
- #gemma_command = './gemma -bfile %s -k output_%s.cXX.txt -lmm 1 -o %s_output' % (
- # self.dataset.group.name,
- # self.dataset.group.name,
- # self.dataset.group.name)
- #print("gemma_command:" + gemma_command)
- #
- #os.system(gemma_command)
- #
- #included_markers, p_values = self.parse_gemma_output()
- #
- #self.dataset.group.get_specified_markers(markers = included_markers)
#for marker in self.dataset.group.markers.markers:
# if marker['name'] not in included_markers:
@@ -567,10 +556,7 @@ class MarkerRegression(object):
# get strain name from ped file in order
def get_samples_from_ped_file(self):
-
- os.chdir("/home/zas1024/plink")
-
- ped_file= open("{}.ped".format(self.dataset.group.name),"r")
+ ped_file= open("{}/{}.ped".format(PLINK_PATH, self.dataset.group.name),"r")
line = ped_file.readline()
sample_list=[]
diff --git a/wqflask/wqflask/static/new/javascript/create_lodchart.coffee b/wqflask/wqflask/static/new/javascript/create_lodchart.coffee
index f1da65d7..df176f52 100644
--- a/wqflask/wqflask/static/new/javascript/create_lodchart.coffee
+++ b/wqflask/wqflask/static/new/javascript/create_lodchart.coffee
@@ -1,4 +1,4 @@
-create_manhattan_plot = ->
+create_lod_chart = ->
h = 500
w = 1200
margin = {left:60, top:40, right:40, bottom: 40, inner:5}
@@ -18,7 +18,7 @@ create_manhattan_plot = ->
.height(h)
.width(w)
.margin(margin)
- .ylab("LOD score")
+ .ylab(js_data.result_score_type + " score")
.manhattanPlot(js_data.manhattan_plot)
#.additive(additive)
@@ -45,7 +45,12 @@ create_manhattan_plot = ->
.transition().duration(500).attr("r", r*3)
.transition().duration(500).attr("r", r)
-root.create_manhattan_plot = create_manhattan_plot
+$ ->
+ #window.setTimeout ( ->
+ # console.log(js_data)
+ #), 1000
+ #window.setTimeout(create_lod_chart(), 1000)
+ root.create_lod_chart = create_lod_chart
$("#export").click =>
#Get d3 SVG element
diff --git a/wqflask/wqflask/static/new/javascript/create_lodchart.js b/wqflask/wqflask/static/new/javascript/create_lodchart.js
index 546d7c18..a7cea8a5 100644
--- a/wqflask/wqflask/static/new/javascript/create_lodchart.js
+++ b/wqflask/wqflask/static/new/javascript/create_lodchart.js
@@ -1,8 +1,8 @@
-// Generated by CoffeeScript 1.9.2
+// Generated by CoffeeScript 1.8.0
(function() {
- var create_manhattan_plot;
+ var create_lod_chart;
- create_manhattan_plot = function() {
+ create_lod_chart = function() {
var additive, chrrect, data, h, halfh, margin, mychart, totalh, totalw, w;
h = 500;
w = 1200;
@@ -22,7 +22,7 @@
additive = false;
}
console.log("js_data:", js_data);
- mychart = lodchart().lodvarname("lod.hk").height(h).width(w).margin(margin).ylab("LOD score").manhattanPlot(js_data.manhattan_plot);
+ mychart = lodchart().lodvarname("lod.hk").height(h).width(w).margin(margin).ylab(js_data.result_score_type + " score").manhattanPlot(js_data.manhattan_plot);
data = js_data.json_data;
d3.select("div#topchart").datum(data).call(mychart);
chrrect = mychart.chrSelect();
@@ -43,7 +43,7 @@
});
};
- root.create_manhattan_plot = create_manhattan_plot;
+ root.create_lod_chart = create_lod_chart;
$("#export").click((function(_this) {
return function() {
diff --git a/wqflask/wqflask/static/new/javascript/lod_chart.coffee b/wqflask/wqflask/static/new/javascript/lod_chart.coffee
index b0f4b2f5..55ffdce0 100644
--- a/wqflask/wqflask/static/new/javascript/lod_chart.coffee
+++ b/wqflask/wqflask/static/new/javascript/lod_chart.coffee
@@ -1,514 +1,517 @@
-lodchart = () ->
- width = 800
- height = 500
- margin = {left:60, top:40, right:40, bottom: 40, inner:5}
- axispos = {xtitle:25, ytitle:30, xlabel:5, ylabel:5}
- titlepos = 20
- manhattanPlot = false
- additive = false
- ylim = null
- additive_ylim = null
- nyticks = 5
- yticks = null
- additive_yticks = null
- chrGap = 8
- darkrect = "#F1F1F9"
- lightrect = "#FBFBFF"
- lodlinecolor = "darkslateblue"
- additivelinecolor = "red"
- linewidth = 2
- suggestivecolor = "gainsboro"
- significantcolor = "#EBC7C7"
- pointcolor = "#E9CFEC" # pink
- pointsize = 0 # default = no visible points at markers
- pointstroke = "black"
- title = ""
- xlab = "Chromosome"
- ylab = "LRS score"
- additive_ylab = "Additive Effect"
- rotate_ylab = null
- yscale = d3.scale.linear()
- additive_yscale = d3.scale.linear()
- xscale = null
- pad4heatmap = false
- lodcurve = null
- lodvarname = null
- markerSelect = null
- chrSelect = null
- pointsAtMarkers = true
-
-
- ## the main function
- chart = (selection) ->
- selection.each (data) ->
-
- #console.log("data:", data)
-
- if manhattanPlot == true
- pointcolor = "darkslateblue"
- pointsize = 2
-
- lodvarname = lodvarname ? data.lodnames[0]
- data[lodvarname] = (Math.abs(x) for x in data[lodvarname]) # take absolute values
- ylim = ylim ? [0, d3.max(data[lodvarname])]
- if additive
- data['additive'] = (Math.abs(x) for x in data['additive'])
- additive_ylim = additive_ylim ? [0, d3.max(data['additive'])]
-
- lodvarnum = data.lodnames.indexOf(lodvarname)
-
- # Select the svg element, if it exists.
- svg = d3.select(this).selectAll("svg").data([data])
-
- # Otherwise, create the skeletal chart.
- gEnter = svg.enter().append("svg").append("g")
-
- # Update the outer dimensions.
- svg.attr("width", width+margin.left+margin.right)
- .attr("height", height+margin.top+margin.bottom)
-
- # Update the inner dimensions.
- g = svg.select("g")
-
- # box
- g.append("rect")
- .attr("x", margin.left)
- .attr("y", margin.top)
- .attr("height", height)
- .attr("width", width)
- .attr("fill", darkrect)
- .attr("stroke", "none")
-
- yscale.domain(ylim)
- .range([height+margin.top, margin.top+margin.inner])
-
- # if yticks not provided, use nyticks to choose pretty ones
- yticks = yticks ? yscale.ticks(nyticks)
-
- #if data['additive'].length > 0
- if additive
- additive_yscale.domain(additive_ylim)
- .range([height+margin.top, margin.top+margin.inner + height/2])
-
- additive_yticks = additive_yticks ? additive_yscale.ticks(nyticks)
-
- # reorganize lod,pos by chromosomes
- reorgLodData(data, lodvarname)
-
- # add chromosome scales (for x-axis)
- data = chrscales(data, width, chrGap, margin.left, pad4heatmap)
- xscale = data.xscale
-
- # chr rectangles
- chrSelect =
- g.append("g").attr("class", "chrRect")
- .selectAll("empty")
- .data(data.chrnames)
- .enter()
- .append("rect")
- .attr("id", (d) -> "chrrect#{d[0]}")
- .attr("x", (d,i) ->
- return data.chrStart[i] if i==0 and pad4heatmap
- data.chrStart[i]-chrGap/2)
- .attr("width", (d,i) ->
- return data.chrEnd[i] - data.chrStart[i]+chrGap/2 if (i==0 or i+1 == data.chrnames.length) and pad4heatmap
- data.chrEnd[i] - data.chrStart[i]+chrGap)
- .attr("y", margin.top)
- .attr("height", height)
- .attr("fill", (d,i) ->
- return darkrect if i % 2
- lightrect)
- .attr("stroke", "none")
- .on("click", (d) ->
- console.log("d is:", d)
- redraw_plot(d)
- )
-
- # x-axis labels
- xaxis = g.append("g").attr("class", "x axis")
- xaxis.selectAll("empty")
- .data(data.chrnames)
- .enter()
- .append("text")
- .text((d) -> d[0])
- .attr("x", (d,i) -> (data.chrStart[i]+data.chrEnd[i])/2)
- .attr("y", margin.top+height+axispos.xlabel)
- .attr("dominant-baseline", "hanging")
- .attr("text-anchor", "middle")
- .attr("cursor", "pointer")
- .on("click", (d) ->
- redraw_plot(d)
- )
-
- xaxis.append("text").attr("class", "title")
- .attr("y", margin.top+height+axispos.xtitle)
- .attr("x", margin.left+width/2)
- .attr("fill", "slateblue")
- .text(xlab)
-
-
- redraw_plot = (chr_ob) ->
- #console.log("chr_name is:", chr_ob[0])
- #console.log("chr_length is:", chr_ob[1])
- $('#topchart').remove()
- $('#chart_container').append('
')
- chr_plot = new Chr_Lod_Chart(600, 1200, chr_ob, manhattanPlot)
-
- # y-axis
- rotate_ylab = rotate_ylab ? (ylab.length > 1)
- yaxis = g.append("g").attr("class", "y axis")
- yaxis.selectAll("empty")
- .data(yticks)
- .enter()
- .append("line")
- .attr("y1", (d) -> yscale(d))
- .attr("y2", (d) -> yscale(d))
- .attr("x1", margin.left)
- .attr("x2", margin.left+7)
- .attr("fill", "none")
- .attr("stroke", "white")
- .attr("stroke-width", 1)
- .style("pointer-events", "none")
-
- yaxis.selectAll("empty")
- .data(yticks)
- .enter()
- .append("text")
- .attr("y", (d) -> yscale(d))
- .attr("x", margin.left-axispos.ylabel)
- .attr("fill", "blue")
- .attr("dominant-baseline", "middle")
- .attr("text-anchor", "end")
- .text((d) -> formatAxis(yticks)(d))
-
- yaxis.append("text").attr("class", "title")
- .attr("y", margin.top+height/2)
- .attr("x", margin.left-axispos.ytitle)
- .text(ylab)
- .attr("transform", if rotate_ylab then "rotate(270,#{margin.left-axispos.ytitle},#{margin.top+height/2})" else "")
- .attr("text-anchor", "middle")
- .attr("fill", "slateblue")
-
- #if data['additive'].length > 0
- if additive
- rotate_additive_ylab = rotate_additive_ylab ? (additive_ylab.length > 1)
- additive_yaxis = g.append("g").attr("class", "y axis")
- additive_yaxis.selectAll("empty")
- .data(additive_yticks)
- .enter()
- .append("line")
- .attr("y1", (d) -> additive_yscale(d))
- .attr("y2", (d) -> additive_yscale(d))
- .attr("x1", margin.left + width)
- .attr("x2", margin.left + width - 7)
- .attr("fill", "none")
- .attr("stroke", "white")
- .attr("stroke-width", 1)
- .style("pointer-events", "none")
-
- additive_yaxis.selectAll("empty")
- .data(additive_yticks)
- .enter()
- .append("text")
- .attr("y", (d) -> additive_yscale(d))
- .attr("x", (d) -> margin.left + width + axispos.ylabel + 20)
- .attr("fill", "green")
- .attr("dominant-baseline", "middle")
- .attr("text-anchor", "end")
- .text((d) -> formatAxis(additive_yticks)(d))
-
- additive_yaxis.append("text").attr("class", "title")
- .attr("y", margin.top+1.5*height)
- .attr("x", margin.left + width + axispos.ytitle)
- .text(additive_ylab)
- .attr("transform", if rotate_additive_ylab then "rotate(270,#{margin.left + width + axispos.ytitle}, #{margin.top+height*1.5})" else "")
- .attr("text-anchor", "middle")
- .attr("fill", "green")
-
- if 'suggestive' of data
- suggestive_bar = g.append("g").attr("class", "suggestive")
- suggestive_bar.selectAll("empty")
- .data([data.suggestive])
- .enter()
- .append("line")
- .attr("y1", (d) -> yscale(d))
- .attr("y2", (d) -> yscale(d))
- .attr("x1", margin.left)
- .attr("x2", margin.left+width)
- .attr("fill", "none")
- .attr("stroke", suggestivecolor)
- .attr("stroke-width", 5)
- .style("pointer-events", "none")
-
- suggestive_bar = g.append("g").attr("class", "significant")
- suggestive_bar.selectAll("empty")
- .data([data.significant])
- .enter()
- .append("line")
- .attr("y1", (d) -> yscale(d))
- .attr("y2", (d) -> yscale(d))
- .attr("x1", margin.left)
- .attr("x2", margin.left+width)
- .attr("fill", "none")
- .attr("stroke", significantcolor)
- .attr("stroke-width", 5)
- .style("pointer-events", "none")
-
- if manhattanPlot == false
- # lod curves by chr
- lodcurve = (chr, lodcolumn) ->
- d3.svg.line()
- .x((d) -> xscale[chr](d))
- .y((d,i) -> yscale(data.lodByChr[chr][i][lodcolumn]))
-
- if additive
- additivecurve = (chr, lodcolumn) ->
- d3.svg.line()
- .x((d) -> xscale[chr](d))
- .y((d,i) -> additive_yscale(data.additiveByChr[chr][i][lodcolumn]))
-
- curves = g.append("g").attr("id", "curves")
-
- for chr in data.chrnames
- curves.append("path")
- .datum(data.posByChr[chr[0]])
- .attr("d", lodcurve(chr[0], lodvarnum))
- .attr("stroke", lodlinecolor)
- .attr("fill", "none")
- .attr("stroke-width", linewidth)
- .style("pointer-events", "none")
-
- if additive
- for chr in data.chrnames
- curves.append("path")
- .datum(data.posByChr[chr[0]])
- .attr("d", additivecurve(chr[0], lodvarnum))
- .attr("stroke", additivelinecolor)
- .attr("fill", "none")
- .attr("stroke-width", 1)
- .style("pointer-events", "none")
-
- # points at markers
- console.log("before pointsize")
- if pointsize > 0
- console.log("pointsize > 0 !!!")
- markerpoints = g.append("g").attr("id", "markerpoints_visible")
- markerpoints.selectAll("empty")
- .data(data.markers)
- .enter()
- .append("circle")
- .attr("cx", (d) -> xscale[d.chr](d.pos))
- .attr("cy", (d) -> yscale(d.lod))
- .attr("r", pointsize)
- .attr("fill", pointcolor)
- .attr("stroke", pointstroke)
- .attr("pointer-events", "hidden")
-
- # title
- titlegrp = g.append("g").attr("class", "title")
- .append("text")
- .attr("x", margin.left+width/2)
- .attr("y", margin.top-titlepos)
- .text(title)
-
- # another box around edge
- g.append("rect")
- .attr("x", margin.left)
- .attr("y", margin.top)
- .attr("height", height)
- .attr("width", () ->
- return(data.chrEnd[-1..][0]-margin.left) if pad4heatmap
- data.chrEnd[-1..][0]-margin.left+chrGap/2)
- .attr("fill", "none")
- .attr("stroke", "black")
- .attr("stroke-width", "none")
-
- if pointsAtMarkers
- # these hidden points are what gets selected...a bit larger
- hiddenpoints = g.append("g").attr("id", "markerpoints_hidden")
-
- markertip = d3.tip()
- .attr('class', 'd3-tip')
- .html((d) ->
- [d.name, " LRS = #{d3.format('.2f')(d.lod)}"])
- .direction("e")
- .offset([0,10])
- svg.call(markertip)
-
- markerSelect =
- hiddenpoints.selectAll("empty")
- .data(data.markers)
- .enter()
- .append("circle")
- .attr("cx", (d) -> xscale[d.chr](d.pos))
- .attr("cy", (d) -> yscale(d.lod))
- .attr("id", (d) -> d.name)
- .attr("r", d3.max([pointsize*2, 3]))
- .attr("opacity", 0)
- .attr("fill", pointcolor)
- .attr("stroke", pointstroke)
- .attr("stroke-width", "1")
- .on "mouseover.paneltip", (d) ->
- d3.select(this).attr("opacity", 1)
- markertip.show(d)
- .on "mouseout.paneltip", ->
- d3.select(this).attr("opacity", 0)
- .call(markertip.hide)
-
- ## configuration parameters
- chart.width = (value) ->
- return width unless arguments.length
- width = value
- chart
-
- chart.height = (value) ->
- return height unless arguments.length
- height = value
- chart
-
- chart.margin = (value) ->
- return margin unless arguments.length
- margin = value
- chart
-
- chart.titlepos = (value) ->
- return titlepos unless arguments.length
- titlepos
- chart
-
- chart.axispos = (value) ->
- return axispos unless arguments.length
- axispos = value
- chart
-
- chart.manhattanPlot = (value) ->
- return manhattanPlot unless arguments.length
- manhattanPlot = value
- chart
-
- chart.ylim = (value) ->
- return ylim unless arguments.length
- ylim = value
- chart
-
- #if data['additive'].length > 0
- chart.additive_ylim = (value) ->
- return additive_ylim unless arguments.length
- additive_ylim = value
- chart
-
- chart.nyticks = (value) ->
- return nyticks unless arguments.length
- nyticks = value
- chart
-
- chart.yticks = (value) ->
- return yticks unless arguments.length
- yticks = value
- chart
-
- chart.chrGap = (value) ->
- return chrGap unless arguments.length
- chrGap = value
- chart
-
- chart.darkrect = (value) ->
- return darkrect unless arguments.length
- darkrect = value
- chart
-
- chart.lightrect = (value) ->
- return lightrect unless arguments.length
- lightrect = value
- chart
-
- chart.linecolor = (value) ->
- return linecolor unless arguments.length
- linecolor = value
- chart
-
- chart.linewidth = (value) ->
- return linewidth unless arguments.length
- linewidth = value
- chart
-
- chart.pointcolor = (value) ->
- return pointcolor unless arguments.length
- pointcolor = value
- chart
-
- chart.pointsize = (value) ->
- return pointsize unless arguments.length
- pointsize = value
- chart
-
- chart.pointstroke = (value) ->
- return pointstroke unless arguments.length
- pointstroke = value
- chart
-
- chart.title = (value) ->
- return title unless arguments.length
- title = value
- chart
-
- chart.xlab = (value) ->
- return xlab unless arguments.length
- xlab = value
- chart
-
- chart.ylab = (value) ->
- return ylab unless arguments.length
- ylab = value
- chart
-
- chart.rotate_ylab = (value) ->
- return rotate_ylab if !arguments.length
- rotate_ylab = value
- chart
-
- chart.lodvarname = (value) ->
- return lodvarname unless arguments.length
- lodvarname = value
- chart
-
- chart.pad4heatmap = (value) ->
- return pad4heatmap unless arguments.length
- pad4heatmap = value
- chart
-
- chart.pointsAtMarkers = (value) ->
- return pointsAtMarkers unless arguments.length
- pointsAtMarkers = value
- chart
-
- chart.yscale = () ->
- return yscale
-
- chart.additive = () ->
- return additive
-
- #if data['additive'].length > 0
- chart.additive_yscale = () ->
- return additive_yscale
-
- chart.xscale = () ->
- return xscale
-
- if manhattanPlot == false
- chart.lodcurve = () ->
- return lodcurve
-
- #if data['additive'].length > 0
- chart.additivecurve = () ->
- return additivecurve
-
- chart.markerSelect = () ->
- return markerSelect
-
- chart.chrSelect = () ->
- return chrSelect
-
- # return the chart function
- chart
-
+lodchart = () ->
+ width = 800
+ height = 500
+ margin = {left:60, top:40, right:40, bottom: 40, inner:5}
+ axispos = {xtitle:25, ytitle:30, xlabel:5, ylabel:5}
+ titlepos = 20
+ manhattanPlot = false
+ additive = false
+ ylim = null
+ additive_ylim = null
+ nyticks = 5
+ yticks = null
+ additive_yticks = null
+ chrGap = 8
+ darkrect = "#F1F1F9"
+ lightrect = "#FBFBFF"
+ lodlinecolor = "darkslateblue"
+ additivelinecolor = "red"
+ linewidth = 2
+ suggestivecolor = "gainsboro"
+ significantcolor = "#EBC7C7"
+ pointcolor = "#E9CFEC" # pink
+ pointsize = 0 # default = no visible points at markers
+ pointstroke = "black"
+ title = ""
+ xlab = "Chromosome"
+ ylab = "LRS score"
+ additive_ylab = "Additive Effect"
+ rotate_ylab = null
+ yscale = d3.scale.linear()
+ additive_yscale = d3.scale.linear()
+ xscale = null
+ pad4heatmap = false
+ lodcurve = null
+ lodvarname = null
+ markerSelect = null
+ chrSelect = null
+ pointsAtMarkers = true
+
+
+ ## the main function
+ chart = (selection) ->
+ selection.each (data) ->
+
+ #console.log("data:", data)
+
+ if manhattanPlot == true
+ pointcolor = "darkslateblue"
+ pointsize = 2
+
+ lodvarname = lodvarname ? data.lodnames[0]
+ data[lodvarname] = (Math.abs(x) for x in data[lodvarname]) # take absolute values
+ ylim = ylim ? [0, d3.max(data[lodvarname])]
+ if additive
+ data['additive'] = (Math.abs(x) for x in data['additive'])
+ additive_ylim = additive_ylim ? [0, d3.max(data['additive'])]
+
+ lodvarnum = data.lodnames.indexOf(lodvarname)
+
+ # Select the svg element, if it exists.
+ svg = d3.select(this).selectAll("svg").data([data])
+
+ # Otherwise, create the skeletal chart.
+ gEnter = svg.enter().append("svg").append("g")
+
+ # Update the outer dimensions.
+ svg.attr("width", width+margin.left+margin.right)
+ .attr("height", height+margin.top+margin.bottom)
+
+ # Update the inner dimensions.
+ g = svg.select("g")
+
+ # box
+ g.append("rect")
+ .attr("x", margin.left)
+ .attr("y", margin.top)
+ .attr("height", height)
+ .attr("width", width)
+ .attr("fill", darkrect)
+ .attr("stroke", "none")
+
+ yscale.domain(ylim)
+ .range([height+margin.top, margin.top+margin.inner])
+
+ # if yticks not provided, use nyticks to choose pretty ones
+ yticks = yticks ? yscale.ticks(nyticks)
+
+ #if data['additive'].length > 0
+ if additive
+ additive_yscale.domain(additive_ylim)
+ .range([height+margin.top, margin.top+margin.inner + height/2])
+
+ additive_yticks = additive_yticks ? additive_yscale.ticks(nyticks)
+
+ # reorganize lod,pos by chromosomes
+ reorgLodData(data, lodvarname)
+
+ # add chromosome scales (for x-axis)
+ data = chrscales(data, width, chrGap, margin.left, pad4heatmap)
+ xscale = data.xscale
+
+ # chr rectangles
+ chrSelect =
+ g.append("g").attr("class", "chrRect")
+ .selectAll("empty")
+ .data(data.chrnames)
+ .enter()
+ .append("rect")
+ .attr("id", (d) -> "chrrect#{d[0]}")
+ .attr("x", (d,i) ->
+ return data.chrStart[i] if i==0 and pad4heatmap
+ data.chrStart[i]-chrGap/2)
+ .attr("width", (d,i) ->
+ return data.chrEnd[i] - data.chrStart[i]+chrGap/2 if (i==0 or i+1 == data.chrnames.length) and pad4heatmap
+ data.chrEnd[i] - data.chrStart[i]+chrGap)
+ .attr("y", margin.top)
+ .attr("height", height)
+ .attr("fill", (d,i) ->
+ return darkrect if i % 2
+
+ lightrect)
+ .attr("stroke", "none")
+ .on("click", (d) ->
+ console.log("d is:", d)
+ redraw_plot(d)
+ )
+
+ # x-axis labels
+ xaxis = g.append("g").attr("class", "x axis")
+ xaxis.selectAll("empty")
+ .data(data.chrnames)
+ .enter()
+ .append("text")
+ .text((d) -> d[0])
+ .attr("x", (d,i) -> (data.chrStart[i]+data.chrEnd[i])/2)
+ .attr("y", margin.top+height+axispos.xlabel)
+ .attr("dominant-baseline", "hanging")
+ .attr("text-anchor", "middle")
+ .attr("cursor", "pointer")
+ .on("click", (d) ->
+ redraw_plot(d)
+ )
+
+ xaxis.append("text").attr("class", "title")
+ .attr("y", margin.top+height+axispos.xtitle)
+ .attr("x", margin.left+width/2)
+ .attr("fill", "slateblue")
+ .text(xlab)
+
+
+ redraw_plot = (chr_ob) ->
+ #console.log("chr_name is:", chr_ob[0])
+ #console.log("chr_length is:", chr_ob[1])
+ $('#topchart').remove()
+ $('#chart_container').append('
')
+ chr_plot = new Chr_Lod_Chart(600, 1200, chr_ob, manhattanPlot)
+
+ # y-axis
+ rotate_ylab = rotate_ylab ? (ylab.length > 1)
+ yaxis = g.append("g").attr("class", "y axis")
+ yaxis.selectAll("empty")
+ .data(yticks)
+ .enter()
+ .append("line")
+ .attr("y1", (d) -> yscale(d))
+ .attr("y2", (d) -> yscale(d))
+ .attr("x1", margin.left)
+ .attr("x2", margin.left+7)
+ .attr("fill", "none")
+ .attr("stroke", "white")
+ .attr("stroke-width", 1)
+ .style("pointer-events", "none")
+
+ yaxis.selectAll("empty")
+ .data(yticks)
+ .enter()
+ .append("text")
+ .attr("y", (d) -> yscale(d))
+ .attr("x", margin.left-axispos.ylabel)
+ .attr("fill", "blue")
+ .attr("dominant-baseline", "middle")
+ .attr("text-anchor", "end")
+ .text((d) -> formatAxis(yticks)(d))
+
+ yaxis.append("text").attr("class", "title")
+ .attr("y", margin.top+height/2)
+ .attr("x", margin.left-axispos.ytitle)
+ .text(ylab)
+ .attr("transform", if rotate_ylab then "rotate(270,#{margin.left-axispos.ytitle},#{margin.top+height/2})" else "")
+ .attr("text-anchor", "middle")
+ .attr("fill", "slateblue")
+
+ #if data['additive'].length > 0
+ if additive
+ rotate_additive_ylab = rotate_additive_ylab ? (additive_ylab.length > 1)
+ additive_yaxis = g.append("g").attr("class", "y axis")
+ additive_yaxis.selectAll("empty")
+ .data(additive_yticks)
+ .enter()
+ .append("line")
+ .attr("y1", (d) -> additive_yscale(d))
+ .attr("y2", (d) -> additive_yscale(d))
+ .attr("x1", margin.left + width)
+ .attr("x2", margin.left + width - 7)
+ .attr("fill", "none")
+ .attr("stroke", "white")
+ .attr("stroke-width", 1)
+ .style("pointer-events", "none")
+
+ additive_yaxis.selectAll("empty")
+ .data(additive_yticks)
+ .enter()
+ .append("text")
+ .attr("y", (d) -> additive_yscale(d))
+ .attr("x", (d) -> margin.left + width + axispos.ylabel + 20)
+ .attr("fill", "green")
+ .attr("dominant-baseline", "middle")
+ .attr("text-anchor", "end")
+ .text((d) -> formatAxis(additive_yticks)(d))
+
+ additive_yaxis.append("text").attr("class", "title")
+ .attr("y", margin.top+1.5*height)
+ .attr("x", margin.left + width + axispos.ytitle)
+ .text(additive_ylab)
+ .attr("transform", if rotate_additive_ylab then "rotate(270,#{margin.left + width + axispos.ytitle}, #{margin.top+height*1.5})" else "")
+ .attr("text-anchor", "middle")
+ .attr("fill", "green")
+
+ if 'suggestive' of data
+ suggestive_bar = g.append("g").attr("class", "suggestive")
+ suggestive_bar.selectAll("empty")
+ .data([data.suggestive])
+ .enter()
+ .append("line")
+ .attr("y1", (d) -> yscale(d))
+ .attr("y2", (d) -> yscale(d))
+ .attr("x1", margin.left)
+ .attr("x2", margin.left+width)
+ .attr("fill", "none")
+ .attr("stroke", suggestivecolor)
+ .attr("stroke-width", 5)
+ .style("pointer-events", "none")
+
+ suggestive_bar = g.append("g").attr("class", "significant")
+ suggestive_bar.selectAll("empty")
+ .data([data.significant])
+ .enter()
+ .append("line")
+ .attr("y1", (d) -> yscale(d))
+ .attr("y2", (d) -> yscale(d))
+ .attr("x1", margin.left)
+ .attr("x2", margin.left+width)
+ .attr("fill", "none")
+ .attr("stroke", significantcolor)
+ .attr("stroke-width", 5)
+ .style("pointer-events", "none")
+
+ if manhattanPlot == false
+ # lod curves by chr
+ lodcurve = (chr, lodcolumn) ->
+ d3.svg.line()
+ .x((d) -> xscale[chr](d))
+ .y((d,i) -> yscale(data.lodByChr[chr][i][lodcolumn]))
+
+ if additive
+ additivecurve = (chr, lodcolumn) ->
+ d3.svg.line()
+ .x((d) -> xscale[chr](d))
+ .y((d,i) -> additive_yscale(data.additiveByChr[chr][i][lodcolumn]))
+
+ curves = g.append("g").attr("id", "curves")
+
+ for chr in data.chrnames
+ if chr.indexOf(data['chr'])
+ curves.append("path")
+ .datum(data.posByChr[chr[0]])
+ .attr("d", lodcurve(chr[0], lodvarnum))
+ .attr("stroke", lodlinecolor)
+ .attr("fill", "none")
+ .attr("stroke-width", linewidth)
+ .style("pointer-events", "none")
+
+ if additive
+ for chr in data.chrnames
+ if chr.indexOf(data['chr'])
+ curves.append("path")
+ .datum(data.posByChr[chr[0]])
+ .attr("d", additivecurve(chr[0], lodvarnum))
+ .attr("stroke", additivelinecolor)
+ .attr("fill", "none")
+ .attr("stroke-width", 1)
+ .style("pointer-events", "none")
+
+ # points at markers
+ console.log("before pointsize")
+ if pointsize > 0
+ console.log("pointsize > 0 !!!")
+ markerpoints = g.append("g").attr("id", "markerpoints_visible")
+ markerpoints.selectAll("empty")
+ .data(data.markers)
+ .enter()
+ .append("circle")
+ .attr("cx", (d) -> xscale[d.chr](d.pos))
+ .attr("cy", (d) -> yscale(d.lod))
+ .attr("r", pointsize)
+ .attr("fill", pointcolor)
+ .attr("stroke", pointstroke)
+ .attr("pointer-events", "hidden")
+
+ # title
+ titlegrp = g.append("g").attr("class", "title")
+ .append("text")
+ .attr("x", margin.left+width/2)
+ .attr("y", margin.top-titlepos)
+ .text(title)
+
+ # another box around edge
+ g.append("rect")
+ .attr("x", margin.left)
+ .attr("y", margin.top)
+ .attr("height", height)
+ .attr("width", () ->
+ return(data.chrEnd[-1..][0]-margin.left) if pad4heatmap
+ data.chrEnd[-1..][0]-margin.left+chrGap/2)
+ .attr("fill", "none")
+ .attr("stroke", "black")
+ .attr("stroke-width", "none")
+
+ if pointsAtMarkers
+ # these hidden points are what gets selected...a bit larger
+ hiddenpoints = g.append("g").attr("id", "markerpoints_hidden")
+
+ markertip = d3.tip()
+ .attr('class', 'd3-tip')
+ .html((d) ->
+ [d.name, " LRS = #{d3.format('.2f')(d.lod)}"])
+ .direction("e")
+ .offset([0,10])
+ svg.call(markertip)
+
+ markerSelect =
+ hiddenpoints.selectAll("empty")
+ .data(data.markers)
+ .enter()
+ .append("circle")
+ .attr("cx", (d) -> xscale[d.chr](d.pos))
+ .attr("cy", (d) -> yscale(d.lod))
+ .attr("id", (d) -> d.name)
+ .attr("r", d3.max([pointsize*2, 3]))
+ .attr("opacity", 0)
+ .attr("fill", pointcolor)
+ .attr("stroke", pointstroke)
+ .attr("stroke-width", "1")
+ .on "mouseover.paneltip", (d) ->
+ d3.select(this).attr("opacity", 1)
+ markertip.show(d)
+ .on "mouseout.paneltip", ->
+ d3.select(this).attr("opacity", 0)
+ .call(markertip.hide)
+
+ ## configuration parameters
+ chart.width = (value) ->
+ return width unless arguments.length
+ width = value
+ chart
+
+ chart.height = (value) ->
+ return height unless arguments.length
+ height = value
+ chart
+
+ chart.margin = (value) ->
+ return margin unless arguments.length
+ margin = value
+ chart
+
+ chart.titlepos = (value) ->
+ return titlepos unless arguments.length
+ titlepos
+ chart
+
+ chart.axispos = (value) ->
+ return axispos unless arguments.length
+ axispos = value
+ chart
+
+ chart.manhattanPlot = (value) ->
+ return manhattanPlot unless arguments.length
+ manhattanPlot = value
+ chart
+
+ chart.ylim = (value) ->
+ return ylim unless arguments.length
+ ylim = value
+ chart
+
+ #if data['additive'].length > 0
+ chart.additive_ylim = (value) ->
+ return additive_ylim unless arguments.length
+ additive_ylim = value
+ chart
+
+ chart.nyticks = (value) ->
+ return nyticks unless arguments.length
+ nyticks = value
+ chart
+
+ chart.yticks = (value) ->
+ return yticks unless arguments.length
+ yticks = value
+ chart
+
+ chart.chrGap = (value) ->
+ return chrGap unless arguments.length
+ chrGap = value
+ chart
+
+ chart.darkrect = (value) ->
+ return darkrect unless arguments.length
+ darkrect = value
+ chart
+
+ chart.lightrect = (value) ->
+ return lightrect unless arguments.length
+ lightrect = value
+ chart
+
+ chart.linecolor = (value) ->
+ return linecolor unless arguments.length
+ linecolor = value
+ chart
+
+ chart.linewidth = (value) ->
+ return linewidth unless arguments.length
+ linewidth = value
+ chart
+
+ chart.pointcolor = (value) ->
+ return pointcolor unless arguments.length
+ pointcolor = value
+ chart
+
+ chart.pointsize = (value) ->
+ return pointsize unless arguments.length
+ pointsize = value
+ chart
+
+ chart.pointstroke = (value) ->
+ return pointstroke unless arguments.length
+ pointstroke = value
+ chart
+
+ chart.title = (value) ->
+ return title unless arguments.length
+ title = value
+ chart
+
+ chart.xlab = (value) ->
+ return xlab unless arguments.length
+ xlab = value
+ chart
+
+ chart.ylab = (value) ->
+ return ylab unless arguments.length
+ ylab = value
+ chart
+
+ chart.rotate_ylab = (value) ->
+ return rotate_ylab if !arguments.length
+ rotate_ylab = value
+ chart
+
+ chart.lodvarname = (value) ->
+ return lodvarname unless arguments.length
+ lodvarname = value
+ chart
+
+ chart.pad4heatmap = (value) ->
+ return pad4heatmap unless arguments.length
+ pad4heatmap = value
+ chart
+
+ chart.pointsAtMarkers = (value) ->
+ return pointsAtMarkers unless arguments.length
+ pointsAtMarkers = value
+ chart
+
+ chart.yscale = () ->
+ return yscale
+
+ chart.additive = () ->
+ return additive
+
+ #if data['additive'].length > 0
+ chart.additive_yscale = () ->
+ return additive_yscale
+
+ chart.xscale = () ->
+ return xscale
+
+ if manhattanPlot == false
+ chart.lodcurve = () ->
+ return lodcurve
+
+ #if data['additive'].length > 0
+ chart.additivecurve = () ->
+ return additivecurve
+
+ chart.markerSelect = () ->
+ return markerSelect
+
+ chart.chrSelect = () ->
+ return chrSelect
+
+ # return the chart function
+ chart
+
diff --git a/wqflask/wqflask/static/new/javascript/lod_chart.js b/wqflask/wqflask/static/new/javascript/lod_chart.js
index 92289bfe..631d8632 100644
--- a/wqflask/wqflask/static/new/javascript/lod_chart.js
+++ b/wqflask/wqflask/static/new/javascript/lod_chart.js
@@ -1,4 +1,4 @@
-// Generated by CoffeeScript 1.8.0
+// Generated by CoffeeScript 1.9.2
var lodchart;
lodchart = function() {
@@ -53,33 +53,33 @@ lodchart = function() {
pointsAtMarkers = true;
chart = function(selection) {
return selection.each(function(data) {
- var additive_yaxis, additivecurve, chr, curves, g, gEnter, hiddenpoints, lodvarnum, markerpoints, markertip, redraw_plot, rotate_additive_ylab, suggestive_bar, svg, titlegrp, x, xaxis, yaxis, _i, _j, _len, _len1, _ref, _ref1;
+ var additive_yaxis, additivecurve, chr, curves, g, gEnter, hiddenpoints, j, k, len, len1, lodvarnum, markerpoints, markertip, redraw_plot, ref, ref1, rotate_additive_ylab, suggestive_bar, svg, titlegrp, x, xaxis, yaxis;
if (manhattanPlot === true) {
pointcolor = "darkslateblue";
pointsize = 2;
}
lodvarname = lodvarname != null ? lodvarname : data.lodnames[0];
data[lodvarname] = (function() {
- var _i, _len, _ref, _results;
- _ref = data[lodvarname];
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- x = _ref[_i];
- _results.push(Math.abs(x));
+ var j, len, ref, results;
+ ref = data[lodvarname];
+ results = [];
+ for (j = 0, len = ref.length; j < len; j++) {
+ x = ref[j];
+ results.push(Math.abs(x));
}
- return _results;
+ return results;
})();
ylim = ylim != null ? ylim : [0, d3.max(data[lodvarname])];
if (additive) {
data['additive'] = (function() {
- var _i, _len, _ref, _results;
- _ref = data['additive'];
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- x = _ref[_i];
- _results.push(Math.abs(x));
+ var j, len, ref, results;
+ ref = data['additive'];
+ results = [];
+ for (j = 0, len = ref.length; j < len; j++) {
+ x = ref[j];
+ results.push(Math.abs(x));
}
- return _results;
+ return results;
})();
additive_ylim = additive_ylim != null ? additive_ylim : [0, d3.max(data['additive'])];
}
@@ -196,16 +196,20 @@ lodchart = function() {
};
}
curves = g.append("g").attr("id", "curves");
- _ref = data.chrnames;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- chr = _ref[_i];
- curves.append("path").datum(data.posByChr[chr[0]]).attr("d", lodcurve(chr[0], lodvarnum)).attr("stroke", lodlinecolor).attr("fill", "none").attr("stroke-width", linewidth).style("pointer-events", "none");
+ ref = data.chrnames;
+ for (j = 0, len = ref.length; j < len; j++) {
+ chr = ref[j];
+ if (chr.indexOf(data['chr'])) {
+ curves.append("path").datum(data.posByChr[chr[0]]).attr("d", lodcurve(chr[0], lodvarnum)).attr("stroke", lodlinecolor).attr("fill", "none").attr("stroke-width", linewidth).style("pointer-events", "none");
+ }
}
if (additive) {
- _ref1 = data.chrnames;
- for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
- chr = _ref1[_j];
- curves.append("path").datum(data.posByChr[chr[0]]).attr("d", additivecurve(chr[0], lodvarnum)).attr("stroke", additivelinecolor).attr("fill", "none").attr("stroke-width", 1).style("pointer-events", "none");
+ ref1 = data.chrnames;
+ for (k = 0, len1 = ref1.length; k < len1; k++) {
+ chr = ref1[k];
+ if (chr.indexOf(data['chr'])) {
+ curves.append("path").datum(data.posByChr[chr[0]]).attr("d", additivecurve(chr[0], lodvarnum)).attr("stroke", additivelinecolor).attr("fill", "none").attr("stroke-width", 1).style("pointer-events", "none");
+ }
}
}
}
@@ -450,4 +454,4 @@ lodchart = function() {
return chrSelect;
};
return chart;
-};
+};
\ No newline at end of file
diff --git a/wqflask/wqflask/static/new/javascript/panelutil.coffee b/wqflask/wqflask/static/new/javascript/panelutil.coffee
index a3bc0b44..f7b51457 100644
--- a/wqflask/wqflask/static/new/javascript/panelutil.coffee
+++ b/wqflask/wqflask/static/new/javascript/panelutil.coffee
@@ -30,16 +30,15 @@ reorgLodData = (data, lodvarname=null) ->
data.lodByChr = {}
for chr,i in data.chrnames
- #console.log("chr:", chr)
- data.posByChr[chr[0]] = []
- data.lodByChr[chr[0]] = []
- for pos, j in data.pos
- if data.chr[j].toString() == chr[0]
- #console.log(data.chr[j] + " AND " + chr[0])
- data.posByChr[chr[0]].push(pos)
- data.lodnames = [data.lodnames] unless Array.isArray(data.lodnames)
- lodval = (data[lodcolumn][j] for lodcolumn in data.lodnames)
- data.lodByChr[chr[0]].push(lodval)
+ if data.chr.indexOf(chr[0])
+ data.posByChr[chr[0]] = []
+ data.lodByChr[chr[0]] = []
+ for pos, j in data.pos
+ if data.chr[j].toString() == chr[0]
+ data.posByChr[chr[0]].push(pos)
+ data.lodnames = [data.lodnames] unless Array.isArray(data.lodnames)
+ lodval = (data[lodcolumn][j] for lodcolumn in data.lodnames)
+ data.lodByChr[chr[0]].push(lodval)
#console.log("data.posByChr:", data.posByChr)
diff --git a/wqflask/wqflask/static/new/javascript/panelutil.js b/wqflask/wqflask/static/new/javascript/panelutil.js
index 3a180e60..7c14f4de 100644
--- a/wqflask/wqflask/static/new/javascript/panelutil.js
+++ b/wqflask/wqflask/static/new/javascript/panelutil.js
@@ -106,10 +106,13 @@ chrscales = function(data, width, chrGap, leftMargin, pad4heatmap) {
if (d > maxd) {
maxd = d;
}
- rng = d3.extent(data.posByChr[chr[0]]);
- chrStart.push(rng[0]);
- chrEnd.push(rng[1]);
- L = rng[1] - rng[0];
+ //rng = d3.extent(data.posByChr[chr[0]]);
+ //chrStart.push(rng[0]);
+ //chrEnd.push(rng[1]);
+ //L = rng[1] - rng[0];
+ chrStart.push(0);
+ chrEnd.push(chr[1]);
+ L = chr[1]
chrLength.push(L);
totalChrLength += L;
}
@@ -436,4 +439,4 @@ abs = function(x) {
return x;
}
return Math.abs(x);
-};
+};
\ No newline at end of file
diff --git a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee
index 29a637ee..df58eb39 100755
--- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee
+++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee
@@ -76,37 +76,22 @@ do_ajax_post = (url, form_data) ->
return false
open_mapping_results = (data) ->
+ #results_window = window.open("/mapping_results_container")
+ #results_window.onload = ->
+ # results_window.document.getElementById("mapping_results_container").innerHTML = data
+
$.colorbox(
html: data
href: "#mapping_results_holder"
height: "90%"
width: "90%"
- onComplete: => root.create_manhattan_plot()
+ onComplete: => root.create_lod_chart()
)
showalert = (message,alerttype) ->
$('#alert_placeholder').append('
')
-$("#interval_mapping_compute").on("click", =>
- showalert("One or more outliers exist in this data set. Please review values before mapping. \
- Including outliers when mapping may lead to misleading results. \
- We recommend
winsorising the outliers \
- or simply deleting them.", "alert-success")
- console.log("In interval mapping")
- $("#progress_bar_container").modal()
- url = "/interval_mapping"
-
- $('input[name=method]').val("reaper")
- $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val())
- $('input[name=mapping_display_all]').val($('input[name=display_all_reaper]'))
- $('input[name=suggestive]').val($('input[name=suggestive_reaper]'))
- form_data = $('#trait_data_form').serialize()
- console.log("form_data is:", form_data)
-
- do_ajax_post(url, form_data)
-)
-
$('#suggestive').hide()
$('input[name=display_all]').change(() =>
@@ -178,6 +163,25 @@ $("#gemma_compute").on("click", =>
do_ajax_post(url, form_data)
)
+$("#interval_mapping_compute").on("click", =>
+ showalert("One or more outliers exist in this data set. Please review values before mapping. \
+ Including outliers when mapping may lead to misleading results. \
+ We recommend
winsorising the outliers \
+ or simply deleting them.", "alert-success")
+ console.log("In interval mapping")
+ $("#progress_bar_container").modal()
+ url = "/interval_mapping"
+
+ $('input[name=method]').val("reaper")
+ $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val())
+ $('input[name=mapping_display_all]').val($('input[name=display_all_reaper]'))
+ $('input[name=suggestive]').val($('input[name=suggestive_reaper]'))
+ form_data = $('#trait_data_form').serialize()
+ console.log("form_data is:", form_data)
+
+ do_ajax_post(url, form_data)
+)
+
#$(".submit_special").click(submit_special)
composite_mapping_fields = ->
diff --git a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js
index 03862cf8..259e4685 100755
--- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js
+++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js
@@ -1,227 +1,224 @@
// Generated by CoffeeScript 1.9.2
-(function() {
- var block_outliers, composite_mapping_fields, do_ajax_post, get_progress, mapping_method_fields, open_mapping_results, showalert, submit_special, toggle_enable_disable, update_time_remaining;
-
- submit_special = function() {
- var url;
- console.log("In submit_special");
- console.log("this is:", this);
- console.log("$(this) is:", $(this));
- url = $(this).data("url");
- console.log("url is:", url);
- $("#trait_data_form").attr("action", url);
- return $("#trait_data_form").submit();
- };
-
- update_time_remaining = function(percent_complete) {
- var minutes_remaining, now, period, total_seconds_remaining;
- now = new Date();
- period = now.getTime() - root.start_time;
- console.log("period is:", period);
- if (period > 8000) {
- total_seconds_remaining = (period / percent_complete * (100 - percent_complete)) / 1000;
- minutes_remaining = Math.round(total_seconds_remaining / 60);
- if (minutes_remaining < 3) {
- return $('#time_remaining').text(Math.round(total_seconds_remaining) + " seconds remaining");
- } else {
- return $('#time_remaining').text(minutes_remaining + " minutes remaining");
- }
+var block_outliers, composite_mapping_fields, do_ajax_post, get_progress, mapping_method_fields, open_mapping_results, showalert, submit_special, toggle_enable_disable, update_time_remaining;
+
+submit_special = function() {
+ var url;
+ console.log("In submit_special");
+ console.log("this is:", this);
+ console.log("$(this) is:", $(this));
+ url = $(this).data("url");
+ console.log("url is:", url);
+ $("#trait_data_form").attr("action", url);
+ return $("#trait_data_form").submit();
+};
+
+update_time_remaining = function(percent_complete) {
+ var minutes_remaining, now, period, total_seconds_remaining;
+ now = new Date();
+ period = now.getTime() - root.start_time;
+ console.log("period is:", period);
+ if (period > 8000) {
+ total_seconds_remaining = (period / percent_complete * (100 - percent_complete)) / 1000;
+ minutes_remaining = Math.round(total_seconds_remaining / 60);
+ if (minutes_remaining < 3) {
+ return $('#time_remaining').text(Math.round(total_seconds_remaining) + " seconds remaining");
+ } else {
+ return $('#time_remaining').text(minutes_remaining + " minutes remaining");
}
+ }
+};
+
+get_progress = function() {
+ var params, params_str, temp_uuid, url;
+ console.log("temp_uuid:", $("#temp_uuid").val());
+ temp_uuid = $("#temp_uuid").val();
+ params = {
+ key: temp_uuid
};
-
- get_progress = function() {
- var params, params_str, temp_uuid, url;
- console.log("temp_uuid:", $("#temp_uuid").val());
- temp_uuid = $("#temp_uuid").val();
- params = {
- key: temp_uuid
- };
- params_str = $.param(params);
- url = "/get_temp_data?" + params_str;
- console.log("url:", url);
- $.ajax({
- type: "GET",
- url: url,
- success: (function(_this) {
- return function(progress_data) {
- var percent_complete;
- percent_complete = progress_data['percent_complete'];
- console.log("in get_progress data:", progress_data);
- $('#marker_regression_progress').css("width", percent_complete + "%");
- if (root.start_time) {
- if (!isNaN(percent_complete)) {
- return update_time_remaining(percent_complete);
- }
- } else {
- return root.start_time = new Date().getTime();
+ params_str = $.param(params);
+ url = "/get_temp_data?" + params_str;
+ console.log("url:", url);
+ $.ajax({
+ type: "GET",
+ url: url,
+ success: (function(_this) {
+ return function(progress_data) {
+ var percent_complete;
+ percent_complete = progress_data['percent_complete'];
+ console.log("in get_progress data:", progress_data);
+ $('#marker_regression_progress').css("width", percent_complete + "%");
+ if (root.start_time) {
+ if (!isNaN(percent_complete)) {
+ return update_time_remaining(percent_complete);
}
- };
- })(this)
- });
- return false;
- };
-
- block_outliers = function() {
- return $('.outlier').each((function(_this) {
- return function(_index, element) {
- return $(element).find('.trait_value_input').val('x');
+ } else {
+ return root.start_time = new Date().getTime();
+ }
};
- })(this));
- };
-
- do_ajax_post = function(url, form_data) {
- $.ajax({
- type: "POST",
- url: url,
- data: form_data,
- error: (function(_this) {
- return function(xhr, ajaxOptions, thrownError) {
- alert("Sorry, an error occurred");
- console.log(xhr);
- clearInterval(_this.my_timer);
- $('#progress_bar_container').modal('hide');
- return $("body").html("We got an error.");
- };
- })(this),
- success: (function(_this) {
- return function(data) {
- clearInterval(_this.my_timer);
- $('#progress_bar_container').modal('hide');
- return open_mapping_results(data);
- };
- })(this)
- });
- console.log("settingInterval");
- this.my_timer = setInterval(get_progress, 1000);
- return false;
- };
-
- open_mapping_results = function(data) {
- return $.colorbox({
- html: data,
- href: "#mapping_results_holder",
- height: "90%",
- width: "90%",
- onComplete: (function(_this) {
- return function() {
- return root.create_manhattan_plot();
- };
- })(this)
- });
- };
-
- showalert = function(message, alerttype) {
- return $('#alert_placeholder').append('
');
- };
-
- $("#interval_mapping_compute").on("click", (function(_this) {
- return function() {
- var form_data, url;
- showalert("One or more outliers exist in this data set. Please review values before mapping. Including outliers when mapping may lead to misleading results. We recommend
winsorising the outliers or simply deleting them.", "alert-success");
- console.log("In interval mapping");
- $("#progress_bar_container").modal();
- url = "/interval_mapping";
- $('input[name=method]').val("reaper");
- $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val());
- $('input[name=mapping_display_all]').val($('input[name=display_all_reaper]'));
- $('input[name=suggestive]').val($('input[name=suggestive_reaper]'));
- form_data = $('#trait_data_form').serialize();
- console.log("form_data is:", form_data);
- return do_ajax_post(url, form_data);
- };
- })(this));
-
- $('#suggestive').hide();
-
- $('input[name=display_all]').change((function(_this) {
- return function() {
- console.log("check");
- if ($('input[name=display_all]:checked').val() === "False") {
- return $('#suggestive').show();
- } else {
- return $('#suggestive').hide();
- }
- };
- })(this));
-
- $("#pylmm_compute").on("click", (function(_this) {
- return function() {
- var form_data, url;
- $("#progress_bar_container").modal();
- url = "/marker_regression";
- $('input[name=method]').val("pylmm");
- $('input[name=num_perm]').val($('input[name=num_perm_pylmm]').val());
- $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_pylmm]:checked').val());
- form_data = $('#trait_data_form').serialize();
- console.log("form_data is:", form_data);
- return do_ajax_post(url, form_data);
- };
- })(this));
+ })(this)
+ });
+ return false;
+};
- $("#rqtl_geno_compute").on("click", (function(_this) {
- return function() {
- var form_data, url;
- $("#progress_bar_container").modal();
- url = "/marker_regression";
- $('input[name=method]').val("rqtl_geno");
- $('input[name=num_perm]').val($('input[name=num_perm_rqtl_geno]').val());
- $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_rqtl]:checked').val());
- $('input[name=control_marker]').val($('input[name=control_rqtl_geno]').val());
- form_data = $('#trait_data_form').serialize();
- console.log("form_data is:", form_data);
- return do_ajax_post(url, form_data);
+block_outliers = function() {
+ return $('.outlier').each((function(_this) {
+ return function(_index, element) {
+ return $(element).find('.trait_value_input').val('x');
};
})(this));
+};
+
+do_ajax_post = function(url, form_data) {
+ $.ajax({
+ type: "POST",
+ url: url,
+ data: form_data,
+ error: (function(_this) {
+ return function(xhr, ajaxOptions, thrownError) {
+ alert("Sorry, an error occurred");
+ console.log(xhr);
+ clearInterval(_this.my_timer);
+ $('#progress_bar_container').modal('hide');
+ return $("body").html("We got an error.");
+ };
+ })(this),
+ success: (function(_this) {
+ return function(data) {
+ clearInterval(_this.my_timer);
+ $('#progress_bar_container').modal('hide');
+ return open_mapping_results(data);
+ };
+ })(this)
+ });
+ console.log("settingInterval");
+ this.my_timer = setInterval(get_progress, 1000);
+ return false;
+};
+
+open_mapping_results = function(data) {
+ return $.colorbox({
+ html: data,
+ href: "#mapping_results_holder",
+ height: "90%",
+ width: "90%",
+ onComplete: (function(_this) {
+ return function() {
+ return root.create_lod_chart();
+ };
+ })(this)
+ });
+};
- $("#plink_compute").on("click", (function(_this) {
- return function() {
- var form_data, url;
- $("#static_progress_bar_container").modal();
- url = "/marker_regression";
- $('input[name=method]').val("plink");
- $('input[name=maf]').val($('input[name=maf_plink]').val());
- form_data = $('#trait_data_form').serialize();
- console.log("form_data is:", form_data);
- return do_ajax_post(url, form_data);
- };
- })(this));
+showalert = function(message, alerttype) {
+ return $('#alert_placeholder').append('
');
+};
- $("#gemma_compute").on("click", (function(_this) {
- return function() {
- var form_data, url;
- console.log("RUNNING GEMMA");
- $("#static_progress_bar_container").modal();
- url = "/marker_regression";
- $('input[name=method]').val("gemma");
- $('input[name=maf]').val($('input[name=maf_gemma]').val());
- form_data = $('#trait_data_form').serialize();
- console.log("form_data is:", form_data);
- return do_ajax_post(url, form_data);
- };
- })(this));
+$('#suggestive').hide();
- composite_mapping_fields = function() {
- return $(".composite_fields").toggle();
+$('input[name=display_all]').change((function(_this) {
+ return function() {
+ console.log("check");
+ if ($('input[name=display_all]:checked').val() === "False") {
+ return $('#suggestive').show();
+ } else {
+ return $('#suggestive').hide();
+ }
};
-
- mapping_method_fields = function() {
- return $(".mapping_method_fields").toggle();
+})(this));
+
+$("#pylmm_compute").on("click", (function(_this) {
+ return function() {
+ var form_data, url;
+ $("#progress_bar_container").modal();
+ url = "/marker_regression";
+ $('input[name=method]').val("pylmm");
+ $('input[name=num_perm]').val($('input[name=num_perm_pylmm]').val());
+ $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_pylmm]:checked').val());
+ form_data = $('#trait_data_form').serialize();
+ console.log("form_data is:", form_data);
+ return do_ajax_post(url, form_data);
+ };
+})(this));
+
+$("#rqtl_geno_compute").on("click", (function(_this) {
+ return function() {
+ var form_data, url;
+ $("#progress_bar_container").modal();
+ url = "/marker_regression";
+ $('input[name=method]').val("rqtl_geno");
+ $('input[name=num_perm]').val($('input[name=num_perm_rqtl_geno]').val());
+ $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_rqtl]:checked').val());
+ $('input[name=control_marker]').val($('input[name=control_rqtl_geno]').val());
+ form_data = $('#trait_data_form').serialize();
+ console.log("form_data is:", form_data);
+ return do_ajax_post(url, form_data);
+ };
+})(this));
+
+$("#plink_compute").on("click", (function(_this) {
+ return function() {
+ var form_data, url;
+ $("#static_progress_bar_container").modal();
+ url = "/marker_regression";
+ $('input[name=method]').val("plink");
+ $('input[name=maf]').val($('input[name=maf_plink]').val());
+ form_data = $('#trait_data_form').serialize();
+ console.log("form_data is:", form_data);
+ return do_ajax_post(url, form_data);
+ };
+})(this));
+
+$("#gemma_compute").on("click", (function(_this) {
+ return function() {
+ var form_data, url;
+ console.log("RUNNING GEMMA");
+ $("#static_progress_bar_container").modal();
+ url = "/marker_regression";
+ $('input[name=method]').val("gemma");
+ $('input[name=maf]').val($('input[name=maf_gemma]').val());
+ form_data = $('#trait_data_form').serialize();
+ console.log("form_data is:", form_data);
+ return do_ajax_post(url, form_data);
};
+})(this));
+
+$("#interval_mapping_compute").on("click", (function(_this) {
+ return function() {
+ var form_data, url;
+ showalert("One or more outliers exist in this data set. Please review values before mapping. Including outliers when mapping may lead to misleading results. We recommend
winsorising the outliers or simply deleting them.", "alert-success");
+ console.log("In interval mapping");
+ $("#progress_bar_container").modal();
+ url = "/interval_mapping";
+ $('input[name=method]').val("reaper");
+ $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val());
+ $('input[name=mapping_display_all]').val($('input[name=display_all_reaper]'));
+ $('input[name=suggestive]').val($('input[name=suggestive_reaper]'));
+ form_data = $('#trait_data_form').serialize();
+ console.log("form_data is:", form_data);
+ return do_ajax_post(url, form_data);
+ };
+})(this));
- $("#use_composite_choice").change(composite_mapping_fields);
+composite_mapping_fields = function() {
+ return $(".composite_fields").toggle();
+};
- $("#mapping_method_choice").change(mapping_method_fields);
+mapping_method_fields = function() {
+ return $(".mapping_method_fields").toggle();
+};
- toggle_enable_disable = function(elem) {
- return $(elem).prop("disabled", !$(elem).prop("disabled"));
- };
+$("#use_composite_choice").change(composite_mapping_fields);
- $("#choose_closet_control").change(function() {
- return toggle_enable_disable("#control_locus");
- });
+$("#mapping_method_choice").change(mapping_method_fields);
- $("#display_all_lrs").change(function() {
- return toggle_enable_disable("#suggestive_lrs");
- });
+toggle_enable_disable = function(elem) {
+ return $(elem).prop("disabled", !$(elem).prop("disabled"));
+};
+
+$("#choose_closet_control").change(function() {
+ return toggle_enable_disable("#control_locus");
+});
-}).call(this);
+$("#display_all_lrs").change(function() {
+ return toggle_enable_disable("#suggestive_lrs");
+});
\ No newline at end of file
diff --git a/wqflask/wqflask/templates/interval_mapping.html b/wqflask/wqflask/templates/interval_mapping.html
deleted file mode 100755
index b0866a35..00000000
--- a/wqflask/wqflask/templates/interval_mapping.html
+++ /dev/null
@@ -1,117 +0,0 @@
-{% block css %}
-
-
-
-
-
-
-
-{% endblock %}
-{% block content %}
-
-
-
-
-
- Whole Genome Mapping
-
-
-
-
-
-
-
- Results
-
-
-
-
-
- Index |
- LRS Score |
- Chr |
- Mb |
- Locus |
- Additive Effect |
-
-
-
- {% for marker in qtl_results %}
-
- {{ loop.index }} |
- {{ marker.lrs_value|float }} |
- {{ marker.chr|int }} |
- {{ marker.Mb|float }} |
- {{ marker.name }} |
- {{ marker.additive|float }} |
-
- {% endfor %}
-
-
-
-
-
-
-
-{% endblock %}
-
-{% block js %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{% endblock %}
\ No newline at end of file
diff --git a/wqflask/wqflask/templates/old_index_page.html b/wqflask/wqflask/templates/old_index_page.html
deleted file mode 100755
index db0b2d9e..00000000
--- a/wqflask/wqflask/templates/old_index_page.html
+++ /dev/null
@@ -1,320 +0,0 @@
-{% extends "base.html" %}
-{% block title %}GeneNetwork{% endblock %}
-{% block content %}
-
-
-
-
-
-
- Select and
- Search
-
-
-
- ______________________________________________________
-
- Quick HELP
- Examples and User's Guide You can also use advanced
- commands. Copy these simple examples
- into the Get Any or Combined search fields:
-
-
- - POSITION=(chr1 25 30) finds genes, markers, or transcripts on
- chromosome 1 between 25 and 30 Mb.
-
- - MEAN=(15 16) LRS=(23 46) in the Combined field finds
- highly expressed genes (15 to 16 log2 units) AND with peak LRS linkage between 23 and 46.
-
- - RIF=mitochondrial searches RNA databases for GeneRIF links.
-
- - WIKI=nicotine searches GeneWiki for genes that you or other users have annotated
- with the word nicotine.
-
- - GO:0045202 searches for synapse-associated genes listed in the
- Gene Ontology.
-
- - GO:0045202 LRS=(9 99 Chr4 122 155) cisLRS=(9 999 10)
- in Combined finds synapse-associated genes with cis eQTL on Chr 4 from 122 and 155 Mb with LRS scores
- between 9 and 999.
-
- - RIF=diabetes LRS=(9 999 Chr2 100 105) transLRS=(9 999 10)
- in Combined finds diabetes-associated transcripts with peak trans eQTLs on Chr 2 between 100 and 105 Mb with LRS
- scores between 9 and 999.
-
- |
-
-
-
- Websites Affiliated with
- GeneNetwork
-
-
-
-
-
- ____________________________
-
- Getting Started
-
-
-
- - Select Species (or select All)
-
- - Select Group (a specific sample)
-
- - Select Type of data:
-
-
- - Phenotype (traits)
-
- - Genotype (markers)
-
- - Expression (mRNAs)
-
-
-
- - Select a Database
-
- - Enter search terms in the Get Any or Combined field: words,
- genes, ID numbers, probes, advanced search commands
-
- - Click on the Search button
-
- - Optional: Use the Make Default button to save your preferences
-
-
- ____________________________
-
- How to Use
- GeneNetwork
-
-
- Take a 20-40 minute
- GeneNetwork Tour that includes screen shots and
- typical steps in the analysis.
-
-
-
- For information about
- resources and methods, select the buttons.
-
- Try the Workstation site to explore data and features that are
- being implemented.
-
- Review the Conditions
- and Contacts pages for information on the status of data sets
- and advice on their use and citation.
-
-
- Mirror and Development
- Sites
-
-
-
- History and
- Archive
-
-
- GeneNetwork's Time
- Machine links to earlier versions that correspond to specific
- publication dates.
-
- |
-
-
- |
-
-
-
-
-{% endblock %}
-
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index c16c22df..f9b27207 100755
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -288,6 +288,10 @@ def heatmap_page():
return rendered_template
+@app.route("/mapping_results_container")
+def mapping_results_container_page():
+ return render_template("mapping_results_container.html")
+
@app.route("/marker_regression", methods=('POST',))
def marker_regression_page():
initial_start_vars = request.form
@@ -439,7 +443,7 @@ def interval_mapping_page():
Redis.expire(key, 60*60)
with Bench("Rendering template"):
- rendered_template = render_template("interval_mapping.html", **result)
+ rendered_template = render_template("marker_regression.html", **result)
return rendered_template
--
cgit v1.2.3
From 1353414114b9595a1b207ae4da28e5e725edc550 Mon Sep 17 00:00:00 2001
From: zsloan
Date: Fri, 26 Jun 2015 18:56:26 +0000
Subject: Fixed minor bug where the static loading bar would remain after the
mapping results were displayed.
---
wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee | 2 ++
1 file changed, 2 insertions(+)
(limited to 'wqflask')
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 df58eb39..211fedae 100755
--- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee
+++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.coffee
@@ -63,10 +63,12 @@ do_ajax_post = (url, form_data) ->
console.log(xhr)
clearInterval(this.my_timer)
$('#progress_bar_container').modal('hide')
+ $('#static_progress_bar_container').modal('hide')
$("body").html("We got an error.")
success: (data) =>
clearInterval(this.my_timer)
$('#progress_bar_container').modal('hide')
+ $('#static_progress_bar_container').modal('hide')
open_mapping_results(data)
#$("body").html(data)
)
--
cgit v1.2.3
From ab730e89919f7f7c8a50a97a9a222dbf392297d8 Mon Sep 17 00:00:00 2001
From: zsloan
Date: Wed, 1 Jul 2015 22:08:18 +0000
Subject: cis and trans LRS searches now work. Still need to get them working
in combined searches
---
wqflask/wqflask/do_search.py | 98 +++++++++++++++++++++++++++-----------------
1 file changed, 60 insertions(+), 38 deletions(-)
(limited to 'wqflask')
diff --git a/wqflask/wqflask/do_search.py b/wqflask/wqflask/do_search.py
index cec71777..3d1ad583 100755
--- a/wqflask/wqflask/do_search.py
+++ b/wqflask/wqflask/do_search.py
@@ -611,64 +611,76 @@ class PhenotypeLrsSearch(LrsSearch, PhenotypeSearch):
return self.execute(self.query)
-class CisTransLrsSearch(LrsSearch):
+class CisTransLrsSearch(DoSearch):
- def real_run(self, the_operator):
- #if isinstance(self.search_term, basestring):
- # self.search_term = [self.search_term]
- print("self.search_term is:", self.search_term)
+ def get_from_clause(self):
+ return ", Geno "
+
+ def get_where_clause(self, cis_trans):
self.search_term = [float(value) for value in self.search_term]
self.mb_buffer = 5 # default
-
- self.from_clause = ", Geno "
+ if cis_trans == "cis":
+ the_operator = "<"
+ else:
+ the_operator = ">"
if self.search_operator == "=":
if len(self.search_term) == 2:
- self.lrs_min, self.lrs_max = self.search_term
+ lrs_min, lrs_max = self.search_term
#[int(value) for value in self.search_term]
elif len(self.search_term) == 3:
- self.lrs_min, self.lrs_max, self.mb_buffer = self.search_term
+ lrs_min, lrs_max, self.mb_buffer = self.search_term
else:
SomeError
- self.sub_clause = """ %sXRef.LRS > %s and
+ sub_clause = """ %sXRef.LRS > %s and
%sXRef.LRS < %s and """ % (
escape(self.dataset.type),
- escape(min(self.lrs_min, self.lrs_max)),
+ escape(str(min(lrs_min, lrs_max))),
escape(self.dataset.type),
- escape(max(self.lrs_min, self.lrs_max))
+ escape(str(max(lrs_min, lrs_max)))
)
else:
# Deal with >, <, >=, and <=
- self.sub_clause = """ %sXRef.LRS %s %s and """ % (
+ sub_clause = """ %sXRef.LRS %s %s and """ % (
escape(self.dataset.type),
escape(self.search_operator),
escape(self.search_term[0])
)
- self.where_clause = self.sub_clause + """
- ABS(%s.Mb-Geno.Mb) %s %s and
- %sXRef.Locus = Geno.name and
- Geno.SpeciesId = %s and
- %s.Chr = Geno.Chr""" % (
- escape(self.dataset.type),
- the_operator,
- escape(self.mb_buffer),
- escape(self.dataset.type),
- escape(self.species_id),
- escape(self.dataset.type)
- )
-
- print("where_clause is:", pf(self.where_clause))
-
- self.query = self.compile_final_query(self.from_clause, self.where_clause)
-
- return self.execute(self.query)
-
+ if cis_trans == "cis":
+ where_clause = sub_clause + """
+ ABS(%s.Mb-Geno.Mb) %s %s and
+ %sXRef.Locus = Geno.name and
+ Geno.SpeciesId = %s and
+ %s.Chr = Geno.Chr""" % (
+ escape(self.dataset.type),
+ the_operator,
+ escape(str(self.mb_buffer)),
+ escape(self.dataset.type),
+ escape(str(self.species_id)),
+ escape(self.dataset.type)
+ )
+ else:
+ where_clause = sub_clause + """
+ %sXRef.Locus = Geno.name and
+ Geno.SpeciesId = %s and
+ (ABS(%s.Mb-Geno.Mb) %s %s and %s.Chr = Geno.Chr) or
+ (%s.Chr != Geno.Chr)""" % (
+ escape(self.dataset.type),
+ escape(str(self.species_id)),
+ escape(self.dataset.type),
+ the_operator,
+ escape(str(self.mb_buffer)),
+ escape(self.dataset.type),
+ escape(self.dataset.type)
+ )
-class CisLrsSearch(CisTransLrsSearch):
+ return where_clause
+
+class CisLrsSearch(CisTransLrsSearch, MrnaAssaySearch):
"""
Searches for genes on a particular chromosome with a cis-eQTL within the given LRS values
@@ -685,12 +697,17 @@ class CisLrsSearch(CisTransLrsSearch):
"""
- DoSearch.search_types['CISLRS'] = "CisLrsSearch"
+ DoSearch.search_types['ProbeSet_CISLRS'] = 'CisLrsSearch'
def run(self):
- return self.real_run("<")
+ self.from_clause = self.get_from_clause()
+ self.where_clause = self.get_where_clause("cis")
-class TransLrsSearch(CisTransLrsSearch):
+ self.query = self.compile_final_query(self.from_clause, self.where_clause)
+
+ return self.execute(self.query)
+
+class TransLrsSearch(CisTransLrsSearch, MrnaAssaySearch):
"""Searches for genes on a particular chromosome with a cis-eQTL within the given LRS values
A transLRS search can take 3 forms:
@@ -706,10 +723,15 @@ class TransLrsSearch(CisTransLrsSearch):
"""
- DoSearch.search_types['TRANSLRS'] = "TransLrsSearch"
+ DoSearch.search_types['ProbeSet_TRANSLRS'] = 'TransLrsSearch'
def run(self):
- return self.real_run(">")
+ self.from_clause = self.get_from_clause()
+ self.where_clause = self.get_where_clause("trans")
+
+ self.query = self.compile_final_query(self.from_clause, self.where_clause)
+
+ return self.execute(self.query)
class MeanSearch(MrnaAssaySearch):
--
cgit v1.2.3
From bb93bb59541ecfc0d97fd7b66492a6778aca3aa2 Mon Sep 17 00:00:00 2001
From: zsloan
Date: Wed, 1 Jul 2015 22:30:31 +0000
Subject: Needed to add a couple parenthesis for transLRS searches
---
wqflask/wqflask/do_search.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'wqflask')
diff --git a/wqflask/wqflask/do_search.py b/wqflask/wqflask/do_search.py
index 3d1ad583..9e88215a 100755
--- a/wqflask/wqflask/do_search.py
+++ b/wqflask/wqflask/do_search.py
@@ -667,8 +667,8 @@ class CisTransLrsSearch(DoSearch):
where_clause = sub_clause + """
%sXRef.Locus = Geno.name and
Geno.SpeciesId = %s and
- (ABS(%s.Mb-Geno.Mb) %s %s and %s.Chr = Geno.Chr) or
- (%s.Chr != Geno.Chr)""" % (
+ ((ABS(%s.Mb-Geno.Mb) %s %s and %s.Chr = Geno.Chr) or
+ (%s.Chr != Geno.Chr))""" % (
escape(self.dataset.type),
escape(str(self.species_id)),
escape(self.dataset.type),
--
cgit v1.2.3
From f54165c5979d2e8cb10948abd027574c815a3e1c Mon Sep 17 00:00:00 2001
From: Artem Tarasov
Date: Tue, 23 Jun 2015 20:41:20 +0300
Subject: use button for returning to full view
---
.../static/new/javascript/chr_lod_chart.coffee | 16 ++----
.../wqflask/static/new/javascript/chr_lod_chart.js | 59 ++++++++++++----------
wqflask/wqflask/templates/marker_regression.html | 1 +
3 files changed, 36 insertions(+), 40 deletions(-)
(limited to 'wqflask')
diff --git a/wqflask/wqflask/static/new/javascript/chr_lod_chart.coffee b/wqflask/wqflask/static/new/javascript/chr_lod_chart.coffee
index 321957b3..e00694be 100644
--- a/wqflask/wqflask/static/new/javascript/chr_lod_chart.coffee
+++ b/wqflask/wqflask/static/new/javascript/chr_lod_chart.coffee
@@ -193,18 +193,7 @@ class Chr_Lod_Chart
.attr("fill", "black")
add_back_button: () ->
- @svg.append("text")
- .attr("class", "back")
- .text("Return to full view")
- .attr("x", @x_buffer*2)
- .attr("y", @y_buffer/2)
- .attr("dx", "0em")
- .attr("text-anchor", "middle")
- .attr("font-family", "sans-serif")
- .attr("font-size", "18px")
- .attr("cursor", "pointer")
- .attr("fill", "black")
- .on("click", @return_to_full_view)
+ $("#return_to_full_view").show().click => @return_to_full_view()
add_path: () ->
line_function = d3.svg.line()
@@ -281,9 +270,10 @@ class Chr_Lod_Chart
)
return_to_full_view: () ->
+ $("#return_to_full_view").hide()
$('#topchart').remove()
$('#chart_container').append('
')
- create_manhattan_plot()
+ create_lod_chart()
show_marker_in_table: (marker_info) ->
console.log("in show_marker_in_table")
diff --git a/wqflask/wqflask/static/new/javascript/chr_lod_chart.js b/wqflask/wqflask/static/new/javascript/chr_lod_chart.js
index 95dbb4e2..c060d9d7 100644
--- a/wqflask/wqflask/static/new/javascript/chr_lod_chart.js
+++ b/wqflask/wqflask/static/new/javascript/chr_lod_chart.js
@@ -1,4 +1,4 @@
-// Generated by CoffeeScript 1.8.0
+// Generated by CoffeeScript 1.9.2
var Chr_Lod_Chart;
Chr_Lod_Chart = (function() {
@@ -38,28 +38,28 @@ Chr_Lod_Chart = (function() {
}
Chr_Lod_Chart.prototype.get_max_chr = function() {
- var key, _results;
+ var key, results;
this.max_chr = 0;
- _results = [];
+ results = [];
for (key in js_data.chromosomes) {
console.log("key is:", key);
if (parseInt(key) > this.max_chr) {
- _results.push(this.max_chr = parseInt(key));
+ results.push(this.max_chr = parseInt(key));
} else {
- _results.push(void 0);
+ results.push(void 0);
}
}
- return _results;
+ return results;
};
Chr_Lod_Chart.prototype.filter_qtl_results = function() {
- var result, this_chr, _i, _len, _ref, _results;
+ var i, len, ref, result, results, this_chr;
this.these_results = [];
this_chr = 100;
- _ref = this.qtl_results;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- result = _ref[_i];
+ ref = this.qtl_results;
+ results = [];
+ for (i = 0, len = ref.length; i < len; i++) {
+ result = ref[i];
if (result.chr === "X") {
this_chr = this.max_chr;
} else {
@@ -71,20 +71,20 @@ Chr_Lod_Chart = (function() {
break;
}
if (parseInt(this_chr) === parseInt(this.chr[0])) {
- _results.push(this.these_results.push(result));
+ results.push(this.these_results.push(result));
} else {
- _results.push(void 0);
+ results.push(void 0);
}
}
- return _results;
+ return results;
};
Chr_Lod_Chart.prototype.get_qtl_count = function() {
- var high_qtl_count, result, _i, _len, _ref;
+ var high_qtl_count, i, len, ref, result;
high_qtl_count = 0;
- _ref = this.these_results;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- result = _ref[_i];
+ ref = this.these_results;
+ for (i = 0, len = ref.length; i < len; i++) {
+ result = ref[i];
if (result.lod_score > 1) {
high_qtl_count += 1;
}
@@ -94,16 +94,16 @@ Chr_Lod_Chart = (function() {
};
Chr_Lod_Chart.prototype.create_coordinates = function() {
- var result, _i, _len, _ref, _results;
- _ref = this.these_results;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- result = _ref[_i];
+ var i, len, ref, result, results;
+ ref = this.these_results;
+ results = [];
+ for (i = 0, len = ref.length; i < len; i++) {
+ result = ref[i];
this.x_coords.push(parseFloat(result.Mb));
this.y_coords.push(result.lod_score);
- _results.push(this.marker_names.push(result.name));
+ results.push(this.marker_names.push(result.name));
}
- return _results;
+ return results;
};
Chr_Lod_Chart.prototype.create_svg = function() {
@@ -189,7 +189,11 @@ Chr_Lod_Chart = (function() {
};
Chr_Lod_Chart.prototype.add_back_button = function() {
- return this.svg.append("text").attr("class", "back").text("Return to full view").attr("x", this.x_buffer * 2).attr("y", this.y_buffer / 2).attr("dx", "0em").attr("text-anchor", "middle").attr("font-family", "sans-serif").attr("font-size", "18px").attr("cursor", "pointer").attr("fill", "black").on("click", this.return_to_full_view);
+ return $("#return_to_full_view").show().click((function(_this) {
+ return function() {
+ return _this.return_to_full_view();
+ };
+ })(this));
};
Chr_Lod_Chart.prototype.add_path = function() {
@@ -253,9 +257,10 @@ Chr_Lod_Chart = (function() {
};
Chr_Lod_Chart.prototype.return_to_full_view = function() {
+ $("#return_to_full_view").hide();
$('#topchart').remove();
$('#chart_container').append('
');
- return create_manhattan_plot();
+ return create_lod_chart();
};
Chr_Lod_Chart.prototype.show_marker_in_table = function(marker_info) {
diff --git a/wqflask/wqflask/templates/marker_regression.html b/wqflask/wqflask/templates/marker_regression.html
index 0cd004cd..d8f64c20 100755
--- a/wqflask/wqflask/templates/marker_regression.html
+++ b/wqflask/wqflask/templates/marker_regression.html
@@ -19,6 +19,7 @@
+