From b0ae93454b6c7ef0ed40a9df36d4e30d19eb1fc9 Mon Sep 17 00:00:00 2001 From: pjotrp Date: Sat, 13 Feb 2016 12:23:09 +0100 Subject: Removed import htmlgen as is not used (apparently) --- wqflask/wqflask/search_results.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/search_results.py b/wqflask/wqflask/search_results.py index a57bfffe..52fe2e34 100755 --- a/wqflask/wqflask/search_results.py +++ b/wqflask/wqflask/search_results.py @@ -24,7 +24,7 @@ from flask import Flask, g from MySQLdb import escape_string as escape # Instead of importing HT we're going to build a class below until we can eliminate it -from htmlgen import HTMLgen2 as HT +# from htmlgen import HTMLgen2 as HT from base import webqtlConfig from utility.benchmark import Bench -- cgit v1.2.3 From beb6a9360ecc9edca19692e4081efc15292fb7d1 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 20 Apr 2016 08:28:44 +0000 Subject: [PATCH 018/100] Find external tools: refactored code to work with GNU Guix --- etc/default_settings.py | 8 +- wqflask/utility/tools.py | 92 ++++++++++------------ .../wqflask/marker_regression/marker_regression.py | 8 +- 3 files changed, 56 insertions(+), 52 deletions(-) (limited to 'wqflask') diff --git a/etc/default_settings.py b/etc/default_settings.py index 0c7d7bad..929bd687 100644 --- a/etc/default_settings.py +++ b/etc/default_settings.py @@ -1,3 +1,5 @@ +import os + LOGFILE = "/var/log/genenetwork/wqflask.log" # This is needed because Flask turns key errors into a @@ -20,5 +22,7 @@ SERVER_PORT = 5003 SECRET_HMAC_CODE = '\x08\xdf\xfa\x93N\x80\xd9\\H@\\\x9f`\x98d^\xb4a;\xc6OM\x946a\xbc\xfc\x80:*\xebc' # Path overrides for Genenetwork -# PYLMM_PATH = 'UNUSED' - +HOME=os.environ.get('HOME') +PYLMM_PATH = HOME+"/izip/git/opensource/python/pylmm_gn2/" +PLINK_PATH = HOME+"/.guix-profile/bin" +GEMMA_PATH = HOME+"/.guix-profile/bin" diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index b8a41f60..0db195df 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -9,76 +9,70 @@ import os import sys from wqflask import app -def get_setting(id,default,guess,get_valid_path): - """ - Resolve a setting from the environment or the global settings in app.config +def get_setting(id,default,guess,find_path): + """Resolve a setting from the environment or the global settings in + app.config, with get_valid_path is a function checking whether the + path points to an expected directory an returns the full path e.g. + + guess = os.environ.get('HOME')+'/pylmm' + get_setting('PYLMM_PATH',default,guess,get_valid_path) + + first tries the environment variable in +id+, next gets the Flask + app setting for the same +id+, next tries the path passed in with + +default+ and finally does an educated +guess+. + + In all, the environment overrides the others, next is the flask + setting, then the default and finally the guess (which is + $HOME/repo). A valid path is returned. If none is resolved an + exception is thrown. + + Note that we do not use the system path. This is on purpose + because it will mess up controlled (reproducible) deployment. The + proper way is to either use the GNU Guix defaults as listed in + etc/default_settings.py or override them yourself by creating a + different settings.py file (or setting the environment). + """ # ---- Check whether environment exists - path = get_valid_path(os.environ.get(id)) + path = find_path(os.environ.get(id)) # ---- Check whether setting exists setting = app.config.get(id) if not path: - path = get_valid_path(setting) + path = find_path(setting) # ---- Check whether default exists if not path: - path = get_valid_path(default) + path = find_path(default) # ---- Guess directory if not path: + guess = os.environ.get('HOME')+guess if not setting: setting = guess - path = get_valid_path(guess) + path = find_path(guess) if not path: - raise Exception(id+' '+setting+' path unknown or faulty (update settings.py?). '+id+' should point to the root of the git repository') - + raise Exception(id+' '+setting+' path unknown or faulty (update settings.py?). '+id+' should point to the path') return path -def pylmm_command(default=None): - """ - Return the path to the repository and the python command to call - """ - def get_valid_path(path): +def find_command(command,id1,default,guess): + def find_path(path): """Test for a valid repository""" if path: - sys.stderr.write("Trying PYLMM_PATH in "+path+"\n") - if path and os.path.isfile(path+'/pylmm_gn2/lmm.py'): + sys.stderr.write("Trying "+id1+" in "+path+"\n") + binary = str.split(command)[0] + if path and os.path.isfile(path+'/'+binary): return path else: None - guess = os.environ.get('HOME')+'/pylmm_gn2' - 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 + path = get_setting(id1,default,guess,find_path) + binary = path+'/'+command + sys.stderr.write("Found "+binary+"\n") + return path,binary - guess = os.environ.get('HOME')+'/plink_gemma' - path = get_setting('PLINK_PATH',default,guess,get_valid_path) - plink_command = path+'/plink' - return path,plink_command +def pylmm_command(default=None): + return find_command('pylmm_gn2/lmm.py',"PYLMM_PATH",default,'/pylmm2') def gemma_command(default=None): - 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 + return find_command('gemma',"GEMMA_PATH",default,'/gemma') - guess = os.environ.get('HOME')+'/plink' - path = get_setting('PLINK_PATH',default,guess,get_valid_path) - gemma_command = path+'/gemma' - return path, gemma_command \ No newline at end of file +def plink_command(default=None): + return find_command('plink2',"PLINK_PATH",default,'/plink') diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index af320f65..a657510d 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -42,9 +42,15 @@ from wqflask.marker_regression import gemma_mapping #from wqflask.marker_regression import plink_mapping #from wqflask.marker_regression import rqtl_mapping +# Check for valid binary paths of pylmm, plink, rqtl etc. This code +# runs at startup, so a missing binary will balk before running the +# service + +GEMMA_PATH,GEMMA_COMMAND = gemma_command() PYLMM_PATH,PYLMM_COMMAND = pylmm_command() PLINK_PATH,PLINK_COMMAND = plink_command() -GEMMA_PATH,GEMMA_COMMAND = gemma_command() +# RQTL_PATH,RQTL_COMMAND = rqtl_command() + class MarkerRegression(object): -- cgit v1.2.3 From f1a9ce85521180b9204d14203677a92f944e2859 Mon Sep 17 00:00:00 2001 From: pjotrp Date: Tue, 16 Feb 2016 10:29:47 +0000 Subject: Remover dependency to logger_tree (may reintroduce later) --- wqflask/runserver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'wqflask') diff --git a/wqflask/runserver.py b/wqflask/runserver.py index 59ebf0d4..e4392b3f 100755 --- a/wqflask/runserver.py +++ b/wqflask/runserver.py @@ -25,8 +25,8 @@ file_handler = logging.FileHandler(app.config['LOGFILE']) file_handler.setLevel(logging.DEBUG) app.logger.addHandler(file_handler) -import logging_tree -logging_tree.printout() +# import logging_tree +# logging_tree.printout() app.run(host='0.0.0.0', port=app.config['SERVER_PORT'], -- cgit v1.2.3 From af7d0bca229f3ebaa80a16d1ce3a2bf1a8abd5df Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 20 Apr 2016 08:37:55 +0000 Subject: [PATCH 023/100] WIP fixing all paths --- README.md | 2 + doc/GUIX-Reproducible-from-source.org | 14 +++- doc/README.org | 23 +++++- etc/default_settings.py | 15 ++-- wqflask/base/data_set.py | 3 +- wqflask/utility/tools.py | 82 ++++++++++------------ wqflask/wqflask/database.py | 5 +- .../wqflask/marker_regression/marker_regression.py | 6 +- wqflask/wqflask/show_trait/show_trait.py | 10 +-- 9 files changed, 94 insertions(+), 66 deletions(-) (limited to 'wqflask') diff --git a/README.md b/README.md index 3d95d05f..db495910 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,8 @@ Elissa Chesler, Jintao Wang, Kenneth Manly, Robert W. Williams, and colleagues. Code and primary web service managed by Dr. Robert W. Williams and the University of Tennessee Health Science Center, Memphis TN, USA. +Join #genenetwork on irc.freenode.net. + Email labwilliams@gmail.com or rwilliams@uthsc.edu Older version available on SourceForge http://sourceforge.net/projects/genenetwork/ diff --git a/doc/GUIX-Reproducible-from-source.org b/doc/GUIX-Reproducible-from-source.org index 871156ed..4399ea26 100644 --- a/doc/GUIX-Reproducible-from-source.org +++ b/doc/GUIX-Reproducible-from-source.org @@ -4,6 +4,7 @@ - [[#introduction][Introduction]] - [[#binary-deployment][Binary deployment]] - [[#from-source-deployment][From source deployment]] + - [[#create-archive][Create archive]] * Introduction @@ -33,10 +34,21 @@ Once that is done we can add the guix-bioinformatics path with : env GUIX_PACKAGE_PATH=../guix-bioinformatics command -such as +So +#+begin_src sh :lang bash #+begin_src sh :lang bash gn-stable-guix$ env GUIX_PACKAGE_PATH=../guix-bioinformatics ./pre-inst-env guix package -A genenetwork genenetwork1 1.0-d622c803b out ../guix-bioinformatics/gn/packages/bioinformatics.scm:163:2 genenetwork2 2.0-9e9475053 out ../guix-bioinformatics/gn/packages/bioinformatics.scm:215:2 #+end_src sh :lang bash + +Install with + +#+begin_src sh :lang bash +gn-stable-guix$ env GUIX_PACKAGE_PATH=../guix-bioinformatics ./pre-inst-env guix package -i genenetwork2 +#+end_src sh :lang bash + +* Create archive + +: env GUIX_PACKAGE_PATH=../../genenetwork/guix-bioinformatics/ ./pre-inst-env guix archive --export -r genenetwork2 > guix_gn2-2.0-9e9475053.nar diff --git a/doc/README.org b/doc/README.org index 375a5d20..d9730948 100644 --- a/doc/README.org +++ b/doc/README.org @@ -3,6 +3,7 @@ * Table of Contents :TOC: - [[#introduction][Introduction]] - [[#binary-deployment-wip][Binary deployment (WIP)]] + - [[#install-genenetwork-server][Install genenetwork server]] - [[#run-mysql-server][Run MySQL server]] - [[#start-the-gn2-server][Start the GN2 server]] - [[#source-deployment-and-other-information-on-reproducibility][Source deployment and other information on reproducibility]] @@ -16,7 +17,27 @@ explain the GeneNetwork deployment system which is based on GNU Guix * Binary deployment (WIP) GN can be deployed either as a binary tarball or as a GNU Guix -package. +package. First install GNU Guix following the instructions of the +[[https://www.gnu.org/software/guix/manual/html_node/Binary-Installation.html#Binary-Installation][binary installation]] using a tar ball from [[https://www.gnu.org/software/guix/download/][here]] and, update guix with a +'guix pull' and make guix visible in the path. More information +exists also in my [[https://github.com/pjotrp/guix-notes/blob/master/INSTALL.org][guix-notes]]. + +With guix running you should be able to install python, for example. + +: guix package -i python2 + +This will make python appear in $HOME/.guix-profile/bin/python. Suggested +environment settings can be seen with + +: guix package --search-paths + +** Install genenetwork server + +Fetch the nar file and install it after adding the key with, for +example + +: cat signing-key.pub |.guix-profile/bin/guix archive --authorize +: guix archive --import < guix_gn2-2.0-9e9475053.nar ** Run MySQL server diff --git a/etc/default_settings.py b/etc/default_settings.py index 929bd687..48d3f66b 100644 --- a/etc/default_settings.py +++ b/etc/default_settings.py @@ -1,13 +1,14 @@ import os +import sys -LOGFILE = "/var/log/genenetwork/wqflask.log" +LOGFILE = "/tmp/genenetwork2.log" # This is needed because Flask turns key errors into a # 400 bad request response with no exception/log TRAP_BAD_REQUEST_ERRORS = True -DB_URI = "mysql://gn2:default@localhost/db_webqtl" -SQLALCHEMY_DATABASE_URI = 'mysql://gn2:default@localhost/db_webqtl' +DB_URI = "mysql://gn2:mysql_password@localhost/db_webqtl_s" +SQLALCHEMY_DATABASE_URI = 'mysql://gn2:mysql_password@localhost/db_webqtl_s' # http://pythonhosted.org/Flask-Security/configuration.html SECURITY_CONFIRMABLE = True @@ -22,7 +23,7 @@ SERVER_PORT = 5003 SECRET_HMAC_CODE = '\x08\xdf\xfa\x93N\x80\xd9\\H@\\\x9f`\x98d^\xb4a;\xc6OM\x946a\xbc\xfc\x80:*\xebc' # Path overrides for Genenetwork -HOME=os.environ.get('HOME') -PYLMM_PATH = HOME+"/izip/git/opensource/python/pylmm_gn2/" -PLINK_PATH = HOME+"/.guix-profile/bin" -GEMMA_PATH = HOME+"/.guix-profile/bin" +GENENETWORK_FILES = "../../gn2_data" +PYLMM_RUN = os.popen("which pylmm_redis").read() +PLINK_RUN = os.popen("which plink2").read() +GEMMA_RUN = os.popen("which gemma").read() diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py index e37a838f..0e5a3ac1 100755 --- a/wqflask/base/data_set.py +++ b/wqflask/base/data_set.py @@ -405,10 +405,11 @@ class DatasetGroup(object): #print("Cache not hit") from utility.tools import plink_command - PLINK_PATH,PLINK_COMMAND = plink_command() + PLINK_RUN = plink_command() geno_file_path = webqtlConfig.GENODIR+self.name+".geno" plink_file_path = PLINK_PATH+"/"+self.name+".fam" + # @FIXME PJOTR/ZACH: .fam files should go into FLATFILES if os.path.isfile(plink_file_path): self.samplelist = get_group_samplelists.get_samplelist("plink", plink_file_path) diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index 0db195df..c3c9b292 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -9,22 +9,22 @@ import os import sys from wqflask import app -def get_setting(id,default,guess,find_path): +def get_setting(command_id,guess=None): """Resolve a setting from the environment or the global settings in app.config, with get_valid_path is a function checking whether the - path points to an expected directory an returns the full path e.g. + path points to an expected directory and returns the full path to + the binary command guess = os.environ.get('HOME')+'/pylmm' - get_setting('PYLMM_PATH',default,guess,get_valid_path) + get_setting('PYLMM_PATH',guess) first tries the environment variable in +id+, next gets the Flask - app setting for the same +id+, next tries the path passed in with - +default+ and finally does an educated +guess+. + app setting for the same +id+ and finally does an educated + +guess+. In all, the environment overrides the others, next is the flask - setting, then the default and finally the guess (which is - $HOME/repo). A valid path is returned. If none is resolved an - exception is thrown. + setting, then the guess. A valid path to the binary command is + returned. If none is resolved an exception is thrown. Note that we do not use the system path. This is on purpose because it will mess up controlled (reproducible) deployment. The @@ -33,46 +33,36 @@ def get_setting(id,default,guess,find_path): different settings.py file (or setting the environment). """ - # ---- Check whether environment exists - path = find_path(os.environ.get(id)) - # ---- Check whether setting exists - setting = app.config.get(id) - if not path: - path = find_path(setting) - # ---- Check whether default exists - if not path: - path = find_path(default) - # ---- Guess directory - if not path: - guess = os.environ.get('HOME')+guess - if not setting: - setting = guess - path = find_path(guess) - if not path: - raise Exception(id+' '+setting+' path unknown or faulty (update settings.py?). '+id+' should point to the path') - return path - -def find_command(command,id1,default,guess): - def find_path(path): - """Test for a valid repository""" - if path: - sys.stderr.write("Trying "+id1+" in "+path+"\n") - binary = str.split(command)[0] - if path and os.path.isfile(path+'/'+binary): - return path + def valid(command): + if command: + sys.stderr.write("Found value "+command+"\n") + return command else: - None + return None + + # ---- Check whether environment exists + sys.stderr.write("Looking for "+command_id+"\n") + command = valid(os.environ.get(command_id)) + if not command: + # ---- Check whether setting exists in app + command = valid(app.config.get(command_id)) + if not command: + command = valid(guess) + if not command: + raise Exception(command_id+' path unknown or faulty (update settings.py?). '+command_id+' should point to the path') + return command - path = get_setting(id1,default,guess,find_path) - binary = path+'/'+command - sys.stderr.write("Found "+binary+"\n") - return path,binary +def pylmm_command(guess=None): + return get_setting("PYLMM_RUN",guess) -def pylmm_command(default=None): - return find_command('pylmm_gn2/lmm.py',"PYLMM_PATH",default,'/pylmm2') +def gemma_command(guess=None): + return get_setting("GEMMA_RUN",guess) -def gemma_command(default=None): - return find_command('gemma',"GEMMA_PATH",default,'/gemma') +def plink_command(guess=None): + return get_setting("PLINK_RUN",guess) -def plink_command(default=None): - return find_command('plink2',"PLINK_PATH",default,'/plink') +def flat_files(subdir=None): + base = get_setting("GENENETWORK_FILES") + if subdir: + return base+"/"+subdir + return base diff --git a/wqflask/wqflask/database.py b/wqflask/wqflask/database.py index 159c5d6c..2f544d44 100755 --- a/wqflask/wqflask/database.py +++ b/wqflask/wqflask/database.py @@ -24,8 +24,9 @@ def init_db(): # you will have to import them first before calling init_db() #import yourapplication.models import wqflask.model - print("Creating all..") + print("database.py: Creating all model metadata..") Base.metadata.create_all(bind=engine) - print("Done creating all...") + print("database.py: Done creating all model metadata...") + print("Point your browser at http://localhost:5003/") init_db() diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index a657510d..b0f5ed69 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -46,9 +46,9 @@ from wqflask.marker_regression import gemma_mapping # runs at startup, so a missing binary will balk before running the # service -GEMMA_PATH,GEMMA_COMMAND = gemma_command() -PYLMM_PATH,PYLMM_COMMAND = pylmm_command() -PLINK_PATH,PLINK_COMMAND = plink_command() +GEMMA_RUN = gemma_command() +PYLMM_RUN = pylmm_command() +PLINK_RUN = plink_command() # RQTL_PATH,RQTL_COMMAND = rqtl_command() diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index 2d4c952a..458e48da 100755 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -16,7 +16,8 @@ from base import webqtlConfig from base import webqtlCaseData from wqflask.show_trait.SampleList import SampleList from utility import webqtlUtil, Plot, Bunch, helper_functions -from utility.tools import pylmm_command, plink_command +# from utility.tools import plink_command +from utility.tools import flat_files from base.trait import GeneralTrait from base import data_set from dbFunction import webqtlDatabaseFunction @@ -24,8 +25,7 @@ from basicStatistics import BasicStatisticsFunctions from pprint import pformat as pf -PYLMM_PATH,PYLMM_COMMAND = pylmm_command() -PLINK_PATH,PLINK_COMMAND = plink_command() +MAPPING_FILES = flat_files("mapping") ############################################### # @@ -162,8 +162,8 @@ class ShowTrait(object): def get_mapping_methods(self): '''Only display mapping methods when the dataset group's genotype file exists''' def check_plink_gemma(): - if (os.path.isfile(PLINK_PATH+"/"+self.dataset.group.name+".bed") and - os.path.isfile(PLINK_PATH+"/"+self.dataset.group.name+".map")): + if (os.path.isfile(MAPPYING_FILES+"/"+self.dataset.group.name+".bed") and + os.path.isfile(MAPPING_FILES+"/"+self.dataset.group.name+".map")): return True else: return False -- cgit v1.2.3 From 4b80bbfe261e8d0587a637b35416834e027f0999 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 20 Apr 2016 08:46:23 +0000 Subject: [PATCH 024/100] Sanitizing file handling --- wqflask/base/data_set.py | 29 ++++++++++------------------- wqflask/utility/tools.py | 20 +++++++++++++++----- wqflask/wqflask/show_trait/show_trait.py | 11 ++++------- 3 files changed, 29 insertions(+), 31 deletions(-) (limited to 'wqflask') diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py index 0e5a3ac1..c6f34143 100755 --- a/wqflask/base/data_set.py +++ b/wqflask/base/data_set.py @@ -44,12 +44,15 @@ from dbFunction import webqtlDatabaseFunction from utility import webqtlUtil from utility.benchmark import Bench from utility import chunks +from utility.tools import flat_files from maintenance import get_group_samplelists from MySQLdb import escape_string as escape from pprint import pformat as pf +MAPPING_PATH = flat_files("mapping") + # Used by create_database to instantiate objects # Each subclass will add to this DS_NAME_MAP = {} @@ -404,15 +407,11 @@ class DatasetGroup(object): else: #print("Cache not hit") - from utility.tools import plink_command - PLINK_RUN = plink_command() - geno_file_path = webqtlConfig.GENODIR+self.name+".geno" - plink_file_path = PLINK_PATH+"/"+self.name+".fam" - # @FIXME PJOTR/ZACH: .fam files should go into FLATFILES - if os.path.isfile(plink_file_path): - self.samplelist = get_group_samplelists.get_samplelist("plink", plink_file_path) + mapping_file_path = MAPPING_PATH+"/"+self.name+".fam" + if os.path.isfile(mapping_file_path): + self.samplelist = get_group_samplelists.get_samplelist("plink", mapping_file_path) elif os.path.isfile(geno_file_path): self.samplelist = get_group_samplelists.get_samplelist("geno", geno_file_path) else: @@ -441,18 +440,10 @@ class DatasetGroup(object): # reaper barfs on unicode filenames, so here we ensure it's a string full_filename = str(os.path.join(webqtlConfig.GENODIR, self.name + '.geno')) - if os.path.isfile(full_filename): - #print("Reading file: ", full_filename) - genotype_1.read(full_filename) - #print("File read") - else: - try: - full_filename = str(os.path.join(webqtlConfig.TMPDIR, self.name + '.geno')) - #print("Reading file") - genotype_1.read(full_filename) - #print("File read") - except IOError: - print("File doesn't exist!") + if not os.path.isfile(full_filename): + raise SystemError("File "+full_filename+" does not exist") + print("Reading file: ", full_filename) + genotype_1.read(full_filename) if genotype_1.type == "group" and self.parlist: genotype_2 = genotype_1.add(Mat=self.parlist[0], Pat=self.parlist[1]) #, F1=_f1) diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index c3c9b292..44bbb1b0 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -52,17 +52,27 @@ def get_setting(command_id,guess=None): raise Exception(command_id+' path unknown or faulty (update settings.py?). '+command_id+' should point to the path') return command +def valid_bin(bin): + if os.path.islink(bin) or os.path.isfile(bin): + return bin + return None + +def valid_path(dir): + if os.path.isdir(dir): + return dir + return None + def pylmm_command(guess=None): - return get_setting("PYLMM_RUN",guess) + return valid_bin(get_setting("PYLMM_RUN",guess)) def gemma_command(guess=None): - return get_setting("GEMMA_RUN",guess) + return valid_bin(get_setting("GEMMA_RUN",guess)) def plink_command(guess=None): - return get_setting("PLINK_RUN",guess) + return valid_bin(get_setting("PLINK_RUN",guess)) def flat_files(subdir=None): base = get_setting("GENENETWORK_FILES") if subdir: - return base+"/"+subdir - return base + return valid_path(base+"/"+subdir) + return valid_path(base) diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index 458e48da..35f7fe5f 100755 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -16,8 +16,6 @@ from base import webqtlConfig from base import webqtlCaseData from wqflask.show_trait.SampleList import SampleList from utility import webqtlUtil, Plot, Bunch, helper_functions -# from utility.tools import plink_command -from utility.tools import flat_files from base.trait import GeneralTrait from base import data_set from dbFunction import webqtlDatabaseFunction @@ -25,7 +23,8 @@ from basicStatistics import BasicStatisticsFunctions from pprint import pformat as pf -MAPPING_FILES = flat_files("mapping") +from utility.tools import flat_files +MAPPING_PATH = flat_files("mapping") ############################################### # @@ -34,8 +33,6 @@ MAPPING_FILES = flat_files("mapping") # ############################################## - - class ShowTrait(object): def __init__(self, kw): @@ -162,8 +159,8 @@ class ShowTrait(object): def get_mapping_methods(self): '''Only display mapping methods when the dataset group's genotype file exists''' def check_plink_gemma(): - if (os.path.isfile(MAPPYING_FILES+"/"+self.dataset.group.name+".bed") and - os.path.isfile(MAPPING_FILES+"/"+self.dataset.group.name+".map")): + if (os.path.isfile(MAPPYING_PATH+"/"+self.dataset.group.name+".bed") and + os.path.isfile(MAPPING_PATH+"/"+self.dataset.group.name+".map")): return True else: return False -- cgit v1.2.3 From 94e3ac8e2fff5da72fd1c0358fdb6fdad9a7830c Mon Sep 17 00:00:00 2001 From: pjotrp Date: Mon, 22 Feb 2016 16:26:13 +0000 Subject: Introducing TEMPDIR --- wqflask/utility/tools.py | 14 ++++++++++---- wqflask/wqflask/views.py | 3 ++- 2 files changed, 12 insertions(+), 5 deletions(-) (limited to 'wqflask') diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index 44bbb1b0..dc7bc33c 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -9,6 +9,7 @@ import os import sys from wqflask import app + def get_setting(command_id,guess=None): """Resolve a setting from the environment or the global settings in app.config, with get_valid_path is a function checking whether the @@ -33,7 +34,7 @@ def get_setting(command_id,guess=None): different settings.py file (or setting the environment). """ - def valid(command): + def value(command): if command: sys.stderr.write("Found value "+command+"\n") return command @@ -42,12 +43,12 @@ def get_setting(command_id,guess=None): # ---- Check whether environment exists sys.stderr.write("Looking for "+command_id+"\n") - command = valid(os.environ.get(command_id)) + command = value(os.environ.get(command_id)) if not command: # ---- Check whether setting exists in app - command = valid(app.config.get(command_id)) + command = value(app.config.get(command_id)) if not command: - command = valid(guess) + command = value(guess) if not command: raise Exception(command_id+' path unknown or faulty (update settings.py?). '+command_id+' should point to the path') return command @@ -76,3 +77,8 @@ def flat_files(subdir=None): if subdir: return valid_path(base+"/"+subdir) return valid_path(base) + +def tempdir(): + return valid_path(get_setting("TEMPDIR","/tmp")) + +TEMPDIR = tempdir() diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 3bf64a18..929da649 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -50,6 +50,7 @@ from wqflask.correlation import corr_scatter_plot from wqflask.wgcna import wgcna_analysis from utility import temp_data +from utility.tools import TEMPDIR from base import webqtlFormData from utility.benchmark import Bench @@ -423,7 +424,7 @@ def marker_regression_page(): print("img_path:", img_path) initial_start_vars = request.form print("initial_start_vars:", initial_start_vars) - imgfile = open('/home/zas1024/tmp/' + img_path, 'rb') + imgfile = open(TEMPDIR + '/' + img_path, 'rb') imgdata = imgfile.read() imgB64 = imgdata.encode("base64") bytesarray = array.array('B', imgB64) -- cgit v1.2.3 From 3be9e4a0950b1ea2d560463032c6f4104baf738e Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 20 Apr 2016 08:49:59 +0000 Subject: [PATCH 026/100] Introducing cached values PYLMM_COMMAND, GEMMA_COMMAND, PLINK_COMMAND and TEMPDIR --- wqflask/utility/tools.py | 8 +++++++- wqflask/wqflask/marker_regression/marker_regression.py | 11 +---------- 2 files changed, 8 insertions(+), 11 deletions(-) (limited to 'wqflask') diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index dc7bc33c..5d69e699 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -81,4 +81,10 @@ def flat_files(subdir=None): def tempdir(): return valid_path(get_setting("TEMPDIR","/tmp")) -TEMPDIR = tempdir() +# Cached values + +PYLMM_COMMAND = pylmm_command() +GEMMA_COMMAND = pylmm_command() +PLINK_COMMAND = pylmm_command() +FLAT_FILES = flat_files() +TEMPDIR = tempdir() diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index b0f5ed69..a76a5967 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -36,21 +36,12 @@ 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, plink_command, gemma_command from wqflask.marker_regression import gemma_mapping #from wqflask.marker_regression import qtl_reaper_mapping #from wqflask.marker_regression import plink_mapping #from wqflask.marker_regression import rqtl_mapping -# Check for valid binary paths of pylmm, plink, rqtl etc. This code -# runs at startup, so a missing binary will balk before running the -# service - -GEMMA_RUN = gemma_command() -PYLMM_RUN = pylmm_command() -PLINK_RUN = plink_command() -# RQTL_PATH,RQTL_COMMAND = rqtl_command() - +from utility.tools import PYLMM_COMMAND, GEMMA_COMMAND, PLINK_COMMAND class MarkerRegression(object): -- cgit v1.2.3 From 1675f34eeff84d7ec0f43c1676f9107e202dda88 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 20 Apr 2016 08:51:57 +0000 Subject: [PATCH 027/100] Introduce tools.locate --- wqflask/utility/tools.py | 14 +++++++++++++- wqflask/wqflask/marker_regression/marker_regression.py | 5 ++--- 2 files changed, 15 insertions(+), 4 deletions(-) (limited to 'wqflask') diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index 5d69e699..624df179 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -78,11 +78,23 @@ def flat_files(subdir=None): return valid_path(base+"/"+subdir) return valid_path(base) +def locate(name, subdir=None): + base = get_setting("GENENETWORK_FILES") + if subdir: + base = base+"/"+subdir + if valid_path(base): + lookfor = base + "/" + name + if valid_path(lookfor): + return lookfor + else: + raise IOError("Can not locate "+lookfor) + raise IOError("Can not locate "+name) + def tempdir(): return valid_path(get_setting("TEMPDIR","/tmp")) + # Cached values - PYLMM_COMMAND = pylmm_command() GEMMA_COMMAND = pylmm_command() PLINK_COMMAND = pylmm_command() diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index a76a5967..36334317 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -41,7 +41,7 @@ from wqflask.marker_regression import gemma_mapping #from wqflask.marker_regression import plink_mapping #from wqflask.marker_regression import rqtl_mapping -from utility.tools import PYLMM_COMMAND, GEMMA_COMMAND, PLINK_COMMAND +from utility.tools import locate, PYLMM_COMMAND, GEMMA_COMMAND, PLINK_COMMAND class MarkerRegression(object): @@ -979,8 +979,7 @@ class MarkerRegression(object): #def gen_human_results(self, pheno_vector, tempdata): def gen_human_results(self, pheno_vector, key, temp_uuid): - file_base = os.path.join(webqtlConfig.PYLMM_PATH, self.dataset.group.name) - print("file_base:", file_base) + file_base = locate(self.dataset.group.name,"mapping") plink_input = input.plink(file_base, type='b') input_file_name = os.path.join(webqtlConfig.SNP_PATH, self.dataset.group.name + ".snps.gz") -- cgit v1.2.3 From ae8834ac9c0f15f2c397bb6727b8a8079bf175eb Mon Sep 17 00:00:00 2001 From: pjotrp Date: Tue, 23 Feb 2016 07:46:43 +0000 Subject: tools.py: add function locate_without_error --- wqflask/utility/tools.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index 624df179..af1ab353 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -79,6 +79,11 @@ def flat_files(subdir=None): return valid_path(base) def locate(name, subdir=None): + """ + Locate a static flat file in the GENENETWORK_FILES environment. + + This function throws an error when the file is not found. + """ base = get_setting("GENENETWORK_FILES") if subdir: base = base+"/"+subdir @@ -89,7 +94,24 @@ def locate(name, subdir=None): else: raise IOError("Can not locate "+lookfor) raise IOError("Can not locate "+name) - + +def locate_without_error(name, subdir=None): + """ + Locate a static flat file in the GENENETWORK_FILES environment. + + This function does not throw an error when the file is not found + but returns None. + """ + base = get_setting("GENENETWORK_FILES") + if subdir: + base = base+"/"+subdir + if valid_path(base): + lookfor = base + "/" + name + if valid_path(lookfor): + return lookfor + sys.stderr.write("WARNING: file "+name+" not found\n") + return None + def tempdir(): return valid_path(get_setting("TEMPDIR","/tmp")) -- cgit v1.2.3 From 6c0f35e56e8d26a47d210b12c171bb050d1ab150 Mon Sep 17 00:00:00 2001 From: pjotrp Date: Tue, 23 Feb 2016 09:27:57 +0000 Subject: Fine tuning file locating --- wqflask/utility/tools.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'wqflask') diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index af1ab353..dd40be99 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -54,10 +54,15 @@ def get_setting(command_id,guess=None): return command def valid_bin(bin): - if os.path.islink(bin) or os.path.isfile(bin): + if os.path.islink(bin) or valid_file(bin): return bin return None +def valid_file(fn): + if os.path.isfile(fn): + return fn + return None + def valid_path(dir): if os.path.isdir(dir): return dir @@ -89,11 +94,12 @@ def locate(name, subdir=None): base = base+"/"+subdir if valid_path(base): lookfor = base + "/" + name - if valid_path(lookfor): + if valid_file(lookfor): return lookfor else: raise IOError("Can not locate "+lookfor) - raise IOError("Can not locate "+name) + if subdir: sys.stderr.write(subdir) + raise IOError("Can not locate "+name+" in "+base) def locate_without_error(name, subdir=None): """ @@ -107,7 +113,7 @@ def locate_without_error(name, subdir=None): base = base+"/"+subdir if valid_path(base): lookfor = base + "/" + name - if valid_path(lookfor): + if valid_file(lookfor): return lookfor sys.stderr.write("WARNING: file "+name+" not found\n") return None -- cgit v1.2.3 From a5ff6520ad29266e1647ce54ad6b2c0f200dfe9a Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 20 Apr 2016 08:55:56 +0000 Subject: [PATCH 032/100] file locating: error checking is built-in --- wqflask/base/data_set.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) (limited to 'wqflask') diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py index c6f34143..9ffc09ac 100755 --- a/wqflask/base/data_set.py +++ b/wqflask/base/data_set.py @@ -44,15 +44,13 @@ from dbFunction import webqtlDatabaseFunction from utility import webqtlUtil from utility.benchmark import Bench from utility import chunks -from utility.tools import flat_files +from utility.tools import locate from maintenance import get_group_samplelists from MySQLdb import escape_string as escape from pprint import pformat as pf -MAPPING_PATH = flat_files("mapping") - # Used by create_database to instantiate objects # Each subclass will add to this DS_NAME_MAP = {} @@ -405,11 +403,10 @@ class DatasetGroup(object): #print(" type: ", type(self.samplelist)) #print(" self.samplelist: ", self.samplelist) else: - #print("Cache not hit") - - geno_file_path = webqtlConfig.GENODIR+self.name+".geno" + print("Cache not hit") - mapping_file_path = MAPPING_PATH+"/"+self.name+".fam" + geno_file_path = locate(self.name+".geno",'genotype') + mapping_file_path = locate(self.name+".fam",'mapping') if os.path.isfile(mapping_file_path): self.samplelist = get_group_samplelists.get_samplelist("plink", mapping_file_path) elif os.path.isfile(geno_file_path): @@ -439,10 +436,7 @@ class DatasetGroup(object): genotype_1 = reaper.Dataset() # reaper barfs on unicode filenames, so here we ensure it's a string - full_filename = str(os.path.join(webqtlConfig.GENODIR, self.name + '.geno')) - if not os.path.isfile(full_filename): - raise SystemError("File "+full_filename+" does not exist") - print("Reading file: ", full_filename) + full_filename = str(locate(self.name+'.geno','genotype')) genotype_1.read(full_filename) if genotype_1.type == "group" and self.parlist: -- cgit v1.2.3 From 218fd0c7666583748098f0b7b4286b6d1cbf6838 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Tue, 23 Feb 2016 11:16:33 +0000 Subject: [PATCH 033/100] Refactored file searching --- wqflask/base/data_set.py | 16 ++++++++-------- wqflask/utility/tools.py | 4 +++- 2 files changed, 11 insertions(+), 9 deletions(-) (limited to 'wqflask') diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py index 9ffc09ac..ce13dd77 100755 --- a/wqflask/base/data_set.py +++ b/wqflask/base/data_set.py @@ -44,7 +44,7 @@ from dbFunction import webqtlDatabaseFunction from utility import webqtlUtil from utility.benchmark import Bench from utility import chunks -from utility.tools import locate +from utility.tools import locate, locate_without_error from maintenance import get_group_samplelists @@ -405,15 +405,15 @@ class DatasetGroup(object): else: print("Cache not hit") - geno_file_path = locate(self.name+".geno",'genotype') - mapping_file_path = locate(self.name+".fam",'mapping') - if os.path.isfile(mapping_file_path): - self.samplelist = get_group_samplelists.get_samplelist("plink", mapping_file_path) - elif os.path.isfile(geno_file_path): - self.samplelist = get_group_samplelists.get_samplelist("geno", geno_file_path) + genotype_fn = locate_without_error(self.name+".geno",'genotype') + mapping_fn = locate_without_error(self.name+".fam",'mapping') + if mapping_fn: + self.samplelist = get_group_samplelists.get_samplelist("plink", mapping_fn) + elif genotype_fn: + self.samplelist = get_group_samplelists.get_samplelist("geno", genotype_fn) else: self.samplelist = None - #print("after get_samplelist") + print("Sample list: ",self.samplelist) Redis.set(key, json.dumps(self.samplelist)) Redis.expire(key, 60*5) diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index dd40be99..d4c10c68 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -36,7 +36,7 @@ def get_setting(command_id,guess=None): """ def value(command): if command: - sys.stderr.write("Found value "+command+"\n") + sys.stderr.write("Found path "+command+"\n") return command else: return None @@ -95,6 +95,7 @@ def locate(name, subdir=None): if valid_path(base): lookfor = base + "/" + name if valid_file(lookfor): + print("Found: file "+lookfor+"\n") return lookfor else: raise IOError("Can not locate "+lookfor) @@ -114,6 +115,7 @@ def locate_without_error(name, subdir=None): if valid_path(base): lookfor = base + "/" + name if valid_file(lookfor): + print("Found: file "+name+"\n") return lookfor sys.stderr.write("WARNING: file "+name+" not found\n") return None -- cgit v1.2.3 From e1e6adeb07536b6c4afc849e7f3a994dca3fda1d Mon Sep 17 00:00:00 2001 From: pjotrp Date: Tue, 23 Feb 2016 11:28:26 +0000 Subject: This threw an error when sample is missing in the DB. Let sample pass without data if the sample/genotype does not exist in the database. --- wqflask/wqflask/correlation/show_corr_results.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/correlation/show_corr_results.py b/wqflask/wqflask/correlation/show_corr_results.py index 98596ca4..09d5ecdb 100755 --- a/wqflask/wqflask/correlation/show_corr_results.py +++ b/wqflask/wqflask/correlation/show_corr_results.py @@ -708,12 +708,12 @@ class CorrelationResults(object): for sample in sample_names: if sample not in excluded_samples: - value = start_vars['value:' + sample] - if value.strip().lower() == 'x': - self.sample_data[str(sample)] = None - else: + print("Looking for",sample,"in",start_vars) + value = start_vars.get('value:' + sample) + if value and not value.strip().lower() == 'x': self.sample_data[str(sample)] = float(value) - + else: + self.sample_data[str(sample)] = None ##XZ, 12/16/2008: the input geneid is of mouse type -- cgit v1.2.3 From e5951ad5f3bb244e4dc53cd04c291dcbdef544a0 Mon Sep 17 00:00:00 2001 From: pjotrp Date: Tue, 23 Feb 2016 11:41:44 +0000 Subject: With missing samples to not add them to the result set --- wqflask/wqflask/correlation/show_corr_results.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/correlation/show_corr_results.py b/wqflask/wqflask/correlation/show_corr_results.py index 09d5ecdb..21a2c26c 100755 --- a/wqflask/wqflask/correlation/show_corr_results.py +++ b/wqflask/wqflask/correlation/show_corr_results.py @@ -710,10 +710,11 @@ class CorrelationResults(object): if sample not in excluded_samples: print("Looking for",sample,"in",start_vars) value = start_vars.get('value:' + sample) - if value and not value.strip().lower() == 'x': - self.sample_data[str(sample)] = float(value) - else: - self.sample_data[str(sample)] = None + if value: + if not value.strip().lower() == 'x': + self.sample_data[str(sample)] = float(value) + else: + self.sample_data[str(sample)] = None ##XZ, 12/16/2008: the input geneid is of mouse type -- cgit v1.2.3 From 92fda7557645199276bf4f8a65c40252c4d83c21 Mon Sep 17 00:00:00 2001 From: pjotrp Date: Wed, 24 Feb 2016 09:25:43 +0000 Subject: Settled on the _COMMAND syntax over _RUN --- etc/default_settings.py | 6 +++--- wqflask/utility/tools.py | 10 +++------- 2 files changed, 6 insertions(+), 10 deletions(-) (limited to 'wqflask') diff --git a/etc/default_settings.py b/etc/default_settings.py index 48d3f66b..6a218f26 100644 --- a/etc/default_settings.py +++ b/etc/default_settings.py @@ -24,6 +24,6 @@ SECRET_HMAC_CODE = '\x08\xdf\xfa\x93N\x80\xd9\\H@\\\x9f`\x98d^\xb4a;\xc6OM\x946a # Path overrides for Genenetwork GENENETWORK_FILES = "../../gn2_data" -PYLMM_RUN = os.popen("which pylmm_redis").read() -PLINK_RUN = os.popen("which plink2").read() -GEMMA_RUN = os.popen("which gemma").read() +PYLMM_COMMAND = os.popen("which pylmm_redis").read() +PLINK_COMMAND = os.popen("which plink2").read() +GEMMA_COMMAND = os.popen("which gemma").read() diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index d4c10c68..0f2e4d88 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -1,9 +1,5 @@ # Tools/paths finder resolves external paths from settings and/or environment # variables -# -# Currently supported: -# -# PYLMM_PATH finds the root of the git repository of the pylmm_gn2 tool import os import sys @@ -69,13 +65,13 @@ def valid_path(dir): return None def pylmm_command(guess=None): - return valid_bin(get_setting("PYLMM_RUN",guess)) + return valid_bin(get_setting("PYLMM_COMMAND",guess)) def gemma_command(guess=None): - return valid_bin(get_setting("GEMMA_RUN",guess)) + return valid_bin(get_setting("GEMMA_COMMAND",guess)) def plink_command(guess=None): - return valid_bin(get_setting("PLINK_RUN",guess)) + return valid_bin(get_setting("PLINK_COMMAND",guess)) def flat_files(subdir=None): base = get_setting("GENENETWORK_FILES") -- cgit v1.2.3 From 5fffa1aa4260af6663c1f9b4cf7494d3ebc6995d Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 24 Feb 2016 11:01:29 +0000 Subject: [PATCH 037/100] WebQtlConfig: sanitizing naming and used vars --- bin/genenetwork2 | 2 +- wqflask/base/data_set.py | 194 ++++++++++----------- wqflask/base/webqtlFormData.py | 2 +- .../basicStatistics/BasicStatisticsFunctions.py | 6 +- wqflask/maintenance/get_group_samplelists.py | 3 +- wqflask/utility/tools.py | 11 +- wqflask/wqflask/correlation/show_corr_results.py | 2 +- .../wqflask/correlation_matrix/show_corr_matrix.py | 1 - wqflask/wqflask/heatmap/heatmap.py | 2 - .../interval_analyst/IntervalAnalystPage.py | 138 +++++++-------- .../marker_regression/MarkerRegressionPage.py | 6 +- .../wqflask/marker_regression/marker_regression.py | 2 +- .../marker_regression/marker_regression_gn1.py | 116 ++++++------ wqflask/wqflask/search_results.py | 1 - wqflask/wqflask/show_trait/show_trait.py | 2 +- 15 files changed, 246 insertions(+), 242 deletions(-) (limited to 'wqflask') diff --git a/bin/genenetwork2 b/bin/genenetwork2 index 54eee02e..00ee09bf 100755 --- a/bin/genenetwork2 +++ b/bin/genenetwork2 @@ -1,6 +1,6 @@ #! /bin/bash # -# This will run the server with default settings +# This will run the server with default settings. # Absolute path to this script, e.g. /home/user/bin/foo.sh SCRIPT=$(readlink -f "$0") diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py index ce13dd77..6527657a 100755 --- a/wqflask/base/data_set.py +++ b/wqflask/base/data_set.py @@ -76,22 +76,22 @@ def create_dataset(dataset_name, dataset_type = None, get_samplelist = True): #def get_dataset_type_from_json(dataset_name): - + class Dataset_Types(object): - + def __init__(self): self.datasets = {} file_name = "wqflask/static/new/javascript/dataset_menu_structure.json" with open(file_name, 'r') as fh: data = json.load(fh) - + print("*" * 70) for species in data['datasets']: for group in data['datasets'][species]: for dataset_type in data['datasets'][species][group]: for dataset in data['datasets'][species][group][dataset_type]: #print("dataset is:", dataset) - + short_dataset_name = dataset[1] if dataset_type == "Phenotypes": new_type = "Publish" @@ -100,32 +100,32 @@ class Dataset_Types(object): else: new_type = "ProbeSet" self.datasets[short_dataset_name] = new_type - + def __call__(self, name): return self.datasets[name] - + # Do the intensive work at startup one time only Dataset_Getter = Dataset_Types() # #print("Running at startup:", get_dataset_type_from_json("HBTRC-MLPFC_0611")) - + def create_datasets_list(): key = "all_datasets" result = Redis.get(key) - + if result: print("Cache hit!!!") datasets = pickle.loads(result) - + else: datasets = list() with Bench("Creating DataSets object"): type_dict = {'Publish': 'PublishFreeze', 'ProbeSet': 'ProbeSetFreeze', 'Geno': 'GenoFreeze'} - + for dataset_type in type_dict: query = "SELECT Name FROM {}".format(type_dict[dataset_type]) for result in g.db.execute(query).fetchall(): @@ -134,10 +134,10 @@ def create_datasets_list(): #print("type: {}\tname: {}".format(dataset_type, result.Name)) dataset = create_dataset(result.Name, dataset_type) datasets.append(dataset) - + Redis.set(key, pickle.dumps(datasets, pickle.HIGHEST_PROTOCOL)) Redis.expire(key, 60*60) - + return datasets @@ -158,30 +158,30 @@ def mescape(*items): class Markers(object): """Todo: Build in cacheing so it saves us reading the same file more than once""" def __init__(self, name): - json_data_fh = open(os.path.join(webqtlConfig.NEWGENODIR + name + '.json')) + json_data_fh = open(locate(name + '.json','genotype/json')) try: markers = json.load(json_data_fh) except: markers = [] - + for marker in markers: if (marker['chr'] != "X") and (marker['chr'] != "Y"): marker['chr'] = int(marker['chr']) marker['Mb'] = float(marker['Mb']) - + self.markers = markers #print("self.markers:", self.markers) - - + + def add_pvalues(self, p_values): print("length of self.markers:", len(self.markers)) print("length of p_values:", len(p_values)) - + if type(p_values) is list: # THIS IS only needed for the case when we are limiting the number of p-values calculated #if len(self.markers) > len(p_values): # self.markers = self.markers[:len(p_values)] - + for marker, p_value in itertools.izip(self.markers, p_values): if not p_value: continue @@ -214,7 +214,7 @@ class Markers(object): #self.markers.remove(marker) #del self.markers[i] self.markers = filtered_markers - + #for i, marker in enumerate(self.markers): # if not 'p_value' in marker: @@ -223,9 +223,9 @@ class Markers(object): # #self.markers.remove(self.markers[i]) class HumanMarkers(Markers): - + def __init__(self, name, specified_markers = []): - marker_data_fh = open(os.path.join(webqtlConfig.PYLMM_PATH + name + '.bim')) + marker_data_fh = open(locate('genotype') + '/' + name + '.bim') self.markers = [] for line in marker_data_fh: splat = line.strip().split() @@ -244,7 +244,7 @@ class HumanMarkers(Markers): marker['name'] = splat[1] marker['Mb'] = float(splat[3]) / 1000000 self.markers.append(marker) - + #print("markers is: ", pf(self.markers)) @@ -257,26 +257,26 @@ class HumanMarkers(Markers): # marker['lod_score'] = -math.log10(marker['p_value']) # #Using -log(p) for the LRS; need to ask Rob how he wants to get LRS from p-values # marker['lrs_value'] = -math.log10(marker['p_value']) * 4.61 - + #print("p_values2:", pf(p_values)) super(HumanMarkers, self).add_pvalues(p_values) - + #with Bench("deleting markers"): # markers = [] # for marker in self.markers: # if not marker['Mb'] <= 0 and not marker['chr'] == 0: # markers.append(marker) # self.markers = markers - - + + class DatasetGroup(object): """ Each group has multiple datasets; each species has multiple groups. - + For example, Mouse has multiple groups (BXD, BXA, etc), and each group has multiple datasets associated with it. - + """ def __init__(self, dataset): """This sets self.group and self.group_id""" @@ -284,14 +284,14 @@ class DatasetGroup(object): self.name, self.id = g.db.execute(dataset.query_for_group).fetchone() if self.name == 'BXD300': self.name = "BXD" - + self.f1list = None self.parlist = None self.get_f1_parent_strains() #print("parents/f1s: {}:{}".format(self.parlist, self.f1list)) - + self.species = webqtlDatabaseFunction.retrieve_species(self.name) - + self.incparentsf1 = False self.allsamples = None self._datasets = None @@ -302,7 +302,7 @@ class DatasetGroup(object): def get_markers(self): #print("self.species is:", self.species) if self.species == "human": - marker_class = HumanMarkers + marker_class = HumanMarkers else: marker_class = Markers @@ -356,7 +356,7 @@ class DatasetGroup(object): dataset_menu.append(dict(tissue=None, datasets=[(dataset, dataset_short)])) else: dataset_sub_menu = [item[1:] for item in dataset] - + tissue_already_exists = False tissue_position = None for i, tissue_dict in enumerate(dataset_menu): @@ -384,7 +384,7 @@ class DatasetGroup(object): f1, f12, maternal, paternal = webqtlUtil.ParInfo[self.name] except KeyError: f1 = f12 = maternal = paternal = None - + if f1 and f12: self.f1list = [f1, f12] if maternal and paternal: @@ -455,18 +455,18 @@ class DatasetGroup(object): #self.samplelist = list(self.genotype.prgy) self.samplelist = list(genotype.prgy) - + return genotype #class DataSets(object): # """Builds a list of DataSets""" -# +# # def __init__(self): # self.datasets = list() -# +# + - #query = """SELECT Name FROM ProbeSetFreeze # UNION # SELECT Name From PublishFreeze @@ -501,7 +501,7 @@ class DataSet(object): self.check_confidentiality() self.retrieve_other_names() - + self.group = DatasetGroup(self) # sets self.group and self.group_id and gets genotype if get_samplelist == True: self.group.get_samplelist() @@ -511,30 +511,30 @@ class DataSet(object): def get_desc(self): """Gets overridden later, at least for Temp...used by trait's get_given_name""" return None - + #@staticmethod #def get_by_trait_id(trait_id): # """Gets the dataset object given the trait id""" - # - # # - # name = g.db.execute(""" SELECT - # + # + # + # name = g.db.execute(""" SELECT + # # """) - # + # # return DataSet(name) # Delete this eventually @property def riset(): Weve_Renamed_This_As_Group - - + + #@property #def group(self): # if not self._group: # self.get_group() - # + # # return self._group @@ -546,7 +546,7 @@ class DataSet(object): This is not meant to retrieve the data set info if no name at all is passed. """ - + try: if self.type == "ProbeSet": query_args = tuple(escape(x) for x in ( @@ -582,17 +582,17 @@ class DataSet(object): except TypeError: print("Dataset {} is not yet available in GeneNetwork.".format(self.name)) pass - + def get_trait_data(self, sample_list=None): if sample_list: self.samplelist = sample_list else: self.samplelist = self.group.samplelist - + if self.group.parlist != None and self.group.f1list != None: if (self.group.parlist + self.group.f1list) in self.samplelist: self.samplelist += self.group.parlist + self.group.f1list - + query = """ SELECT Strain.Name, Strain.Id FROM Strain, Species WHERE Strain.Name IN {} @@ -610,9 +610,9 @@ class DataSet(object): trait_sample_data = [] for sample_ids_step in chunks.divide_into_chunks(sample_ids, number_chunks): - #XZ, 09/24/2008: build one temporary table that only contains the records associated with the input GeneId + #XZ, 09/24/2008: build one temporary table that only contains the records associated with the input GeneId #tempTable = None - #if GeneId and db.type == "ProbeSet": + #if GeneId and db.type == "ProbeSet": # if method == "3": # tempTable = self.getTempLiteratureTable(species=species, # input_species_geneid=GeneId, @@ -623,7 +623,7 @@ class DataSet(object): # TissueProbeSetFreezeId=tissueProbeSetFreezeId, # method=method, # returnNumber=returnNumber) - + if self.type == "Publish": dataset_type = "Phenotype" else: @@ -644,7 +644,7 @@ class DataSet(object): left join {}Data as T{} on T{}.Id = {}XRef.DataId and T{}.StrainId={}\n """.format(*mescape(self.type, item, item, self.type, item, item)) - + if self.type == "Publish": query += """ WHERE {}XRef.InbredSetId = {}Freeze.InbredSetId @@ -661,16 +661,16 @@ class DataSet(object): order by {}.Id """.format(*mescape(self.type, self.type, self.type, self.type, self.name, dataset_type, self.type, self.type, dataset_type)) - + #print("trait data query: ", query) - + results = g.db.execute(query).fetchall() #print("query results:", results) trait_sample_data.append(results) trait_count = len(trait_sample_data[0]) self.trait_data = collections.defaultdict(list) - + # put all of the separate data together into a dictionary where the keys are # trait names and values are lists of sample values for trait_counter in range(trait_count): @@ -683,9 +683,9 @@ class PhenotypeDataSet(DataSet): DS_NAME_MAP['Publish'] = 'PhenotypeDataSet' def setup(self): - + #print("IS A PHENOTYPEDATASET") - + # Fields in the database table self.search_fields = ['Phenotype.Post_publication_description', 'Phenotype.Pre_publication_description', @@ -756,26 +756,26 @@ class PhenotypeDataSet(DataSet): def get_trait_info(self, trait_list, species = ''): for this_trait in trait_list: - + if not this_trait.haveinfo: this_trait.retrieve_info(get_qtl_info=True) description = this_trait.post_publication_description - + #If the dataset is confidential and the user has access to confidential #phenotype traits, then display the pre-publication description instead #of the post-publication description if this_trait.confidential: this_trait.description_display = "" continue # for now - + if not webqtlUtil.hasAccessToConfidentialPhenotypeTrait( privilege=self.privilege, userName=self.userName, authorized_users=this_trait.authorized_users): - + description = this_trait.pre_publication_description - + if len(description) > 0: this_trait.description_display = description.strip() else: @@ -820,7 +820,7 @@ class PhenotypeDataSet(DataSet): this_trait.LRS_score_repr = LRS_score_repr = '%3.1f' % this_trait.lrs this_trait.LRS_score_value = LRS_score_value = this_trait.lrs this_trait.LRS_location_repr = LRS_location_repr = 'Chr%s: %.6f' % (LRS_Chr, float(LRS_Mb)) - + def retrieve_sample_data(self, trait): query = """ SELECT @@ -878,7 +878,7 @@ class GenotypeDataSet(DataSet): def check_confidentiality(self): return geno_mrna_confidentiality(self) - + def get_trait_list(self): query = """ select Geno.Name @@ -912,7 +912,7 @@ class GenotypeDataSet(DataSet): this_trait.location_repr = 'Chr%s: %.6f' % (this_trait.chr, float(this_trait.mb) ) this_trait.location_value = trait_location_value - + def retrieve_sample_data(self, trait): query = """ SELECT @@ -1004,7 +1004,7 @@ class MrnaAssayDataSet(DataSet): def check_confidentiality(self): return geno_mrna_confidentiality(self) - + def get_trait_list_1(self): query = """ select ProbeSet.Name @@ -1020,7 +1020,7 @@ class MrnaAssayDataSet(DataSet): trait_data[trait[0]] = self.retrieve_sample_data(trait[0]) #print("After retrieve_sample_data") return trait_data - + #def get_trait_data(self): # self.samplelist = self.group.samplelist + self.group.parlist + self.group.f1list # query = """ @@ -1040,9 +1040,9 @@ class MrnaAssayDataSet(DataSet): # trait_sample_data = [] # for sample_ids_step in chunks.divide_into_chunks(sample_ids, number_chunks): # - # #XZ, 09/24/2008: build one temporary table that only contains the records associated with the input GeneId + # #XZ, 09/24/2008: build one temporary table that only contains the records associated with the input GeneId # #tempTable = None - # #if GeneId and db.type == "ProbeSet": + # #if GeneId and db.type == "ProbeSet": # # if method == "3": # # tempTable = self.getTempLiteratureTable(species=species, # # input_species_geneid=GeneId, @@ -1053,7 +1053,7 @@ class MrnaAssayDataSet(DataSet): # # TissueProbeSetFreezeId=tissueProbeSetFreezeId, # # method=method, # # returnNumber=returnNumber) - # + # # temp = ['T%s.value' % item for item in sample_ids_step] # query = "SELECT {}.Name,".format(escape(self.type)) # data_start_pos = 1 @@ -1067,7 +1067,7 @@ class MrnaAssayDataSet(DataSet): # left join {}Data as T{} on T{}.Id = {}XRef.DataId # and T{}.StrainId={}\n # """.format(*mescape(self.type, item, item, self.type, item, item)) - # + # # query += """ # WHERE {}XRef.{}FreezeId = {}Freeze.Id # and {}Freeze.Name = '{}' @@ -1080,7 +1080,7 @@ class MrnaAssayDataSet(DataSet): # # trait_count = len(trait_sample_data[0]) # self.trait_data = collections.defaultdict(list) - # + # # # put all of the separate data together into a dictionary where the keys are # # trait names and values are lists of sample values # for trait_counter in range(trait_count): @@ -1088,11 +1088,11 @@ class MrnaAssayDataSet(DataSet): # for chunk_counter in range(int(number_chunks)): # self.trait_data[trait_name] += ( # trait_sample_data[chunk_counter][trait_counter][data_start_pos:]) - + def get_trait_info(self, trait_list=None, species=''): - # Note: setting trait_list to [] is probably not a great idea. + # Note: setting trait_list to [] is probably not a great idea. if not trait_list: trait_list = [] @@ -1155,7 +1155,7 @@ class MrnaAssayDataSet(DataSet): #print("query is:", pf(query)) result = g.db.execute(query).fetchone() - + mean = result[0] if result else 0 if mean: @@ -1176,7 +1176,7 @@ class MrnaAssayDataSet(DataSet): Geno.SpeciesId = Species.Id """.format(species, this_trait.locus) result = g.db.execute(query).fetchone() - + if result: #if result[0] and result[1]: # lrs_chr = result[0] @@ -1184,7 +1184,7 @@ class MrnaAssayDataSet(DataSet): lrs_chr, lrs_mb = result #XZ: LRS_location_value is used for sorting lrs_location_value = self.convert_location_to_value(lrs_chr, lrs_mb) - + #try: # lrs_location_value = int(lrs_chr)*1000 + float(lrs_mb) #except: @@ -1197,7 +1197,7 @@ class MrnaAssayDataSet(DataSet): this_trait.LRS_score_repr = '%3.1f' % this_trait.lrs this_trait.LRS_score_value = this_trait.lrs this_trait.LRS_location_repr = 'Chr%s: %.6f' % (lrs_chr, float(lrs_mb)) - + def convert_location_to_value(self, chromosome, mb): try: @@ -1208,7 +1208,7 @@ class MrnaAssayDataSet(DataSet): else: location_value = (ord(str(chromosome).upper()[0])*1000 + float(mb)) - + return location_value def get_sequence(self): @@ -1225,7 +1225,7 @@ class MrnaAssayDataSet(DataSet): """ % (escape(self.name), escape(self.dataset.name)) results = g.db.execute(query).fetchone() return results[0] - + def retrieve_sample_data(self, trait): query = """ SELECT @@ -1246,8 +1246,8 @@ class MrnaAssayDataSet(DataSet): results = g.db.execute(query).fetchall() #print("RETRIEVED RESULTS HERE:", results) return results - - + + def retrieve_genes(self, column_name): query = """ select ProbeSet.Name, ProbeSet.%s @@ -1256,7 +1256,7 @@ class MrnaAssayDataSet(DataSet): ProbeSetXRef.ProbeSetId=ProbeSet.Id; """ % (column_name, escape(str(self.id))) results = g.db.execute(query).fetchall() - + return dict(results) #def retrieve_gene_symbols(self): @@ -1285,8 +1285,8 @@ class MrnaAssayDataSet(DataSet): # for item in results: # symbol_dict[item[0]] = item[1] # return symbol_dict - - + + class TempDataSet(DataSet): @@ -1308,8 +1308,8 @@ class TempDataSet(DataSet): self.id = 1 self.fullname = 'Temporary Storage' self.shortname = 'Temp' - - + + @staticmethod def handle_pca(desc): if 'PCA' in desc: @@ -1318,13 +1318,13 @@ class TempDataSet(DataSet): else: desc = desc[:desc.index('entered')].strip() return desc - + def get_desc(self): g.db.execute('SELECT description FROM Temp WHERE Name=%s', self.name) desc = g.db.fetchone()[0] desc = self.handle_pca(desc) - return desc - + return desc + def get_group(self): self.cursor.execute(""" SELECT @@ -1337,7 +1337,7 @@ class TempDataSet(DataSet): """, self.name) self.group, self.group_id = self.cursor.fetchone() #return self.group - + def retrieve_sample_data(self, trait): query = """ SELECT @@ -1351,7 +1351,7 @@ class TempDataSet(DataSet): Order BY Strain.Name """ % escape(trait.name) - + results = g.db.execute(query).fetchall() diff --git a/wqflask/base/webqtlFormData.py b/wqflask/base/webqtlFormData.py index 44fdcc3f..10251756 100755 --- a/wqflask/base/webqtlFormData.py +++ b/wqflask/base/webqtlFormData.py @@ -157,7 +157,7 @@ class webqtlFormData(object): self.genotype_1 = reaper.Dataset() - full_filename = os.path.join(webqtlConfig.GENODIR, self.group + '.geno') + full_filename = locate(self.group + '.geno','genotype') # reaper barfs on unicode filenames, so here we ensure it's a string full_filename = str(full_filename) diff --git a/wqflask/basicStatistics/BasicStatisticsFunctions.py b/wqflask/basicStatistics/BasicStatisticsFunctions.py index 74784853..e748a822 100755 --- a/wqflask/basicStatistics/BasicStatisticsFunctions.py +++ b/wqflask/basicStatistics/BasicStatisticsFunctions.py @@ -118,7 +118,7 @@ def plotNormalProbability(vals=None, RISet='', title=None, showstrains=0, specia Plot.plotXY(c, dataZ, dataX, dataLabel = dataLabel, XLabel='Expected Z score', connectdot=0, YLabel='Trait value', title=title, specialCases=specialStrains, showLabel = showLabel) filename= webqtlUtil.genRandStr("nP_") - c.save(webqtlConfig.IMGDIR+filename, format='gif') + c.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif') img=HT.Image('/image/'+filename+'.gif',border=0) @@ -145,7 +145,7 @@ def plotBoxPlot(vals): Plot.plotBoxPlot(canvas, XXX, offset=(xLeftOffset, xRightOffset, yTopOffset, yBottomOffset), XLabel= "Trait") filename= webqtlUtil.genRandStr("Box_") - canvas.save(webqtlConfig.IMGDIR+filename, format='gif') + canvas.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif') img=HT.Image('/image/'+filename+'.gif',border=0) plotLink = HT.Span("More about ", HT.Href(text="Box Plots", url="http://davidmlane.com/hyperstat/A37797.html", target="_blank", Class="fs13")) @@ -201,7 +201,7 @@ def plotBarGraph(identification='', RISet='', vals=None, type="name"): Plot.plotBarText(c, tvals, tnames, variance=tvars, YLabel='Value', title=title, sLabel = sLabel, barSpace = sw) filename= webqtlUtil.genRandStr("Bar_") - c.save(webqtlConfig.IMGDIR+filename, format='gif') + c.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif') img=HT.Image('/image/'+filename+'.gif',border=0) return img diff --git a/wqflask/maintenance/get_group_samplelists.py b/wqflask/maintenance/get_group_samplelists.py index b8397b47..a9059fad 100755 --- a/wqflask/maintenance/get_group_samplelists.py +++ b/wqflask/maintenance/get_group_samplelists.py @@ -6,7 +6,6 @@ import gzip from base import webqtlConfig - def process_genofiles(geno_dir=webqtlConfig.GENODIR): print("Yabba") #sys.exit("Dabba") @@ -54,4 +53,4 @@ def get_samplelist_from_plink(genofilename): line = line.split(" ") samplelist.append(line[0]) - return samplelist \ No newline at end of file + return samplelist diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index 0f2e4d88..c0f6a49a 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -79,6 +79,15 @@ def flat_files(subdir=None): return valid_path(base+"/"+subdir) return valid_path(base) +def assert_dir(dir): + if not valid_path(dir): + raise Exception("ERROR: can not find directory "+dir) + return dir + +def mk_dir(dir): + os.makedirs(dir) + return assert_dir(dir) + def locate(name, subdir=None): """ Locate a static flat file in the GENENETWORK_FILES environment. @@ -98,7 +107,7 @@ def locate(name, subdir=None): if subdir: sys.stderr.write(subdir) raise IOError("Can not locate "+name+" in "+base) -def locate_without_error(name, subdir=None): +def locate_ignore_error(name, subdir=None): """ Locate a static flat file in the GENENETWORK_FILES environment. diff --git a/wqflask/wqflask/correlation/show_corr_results.py b/wqflask/wqflask/correlation/show_corr_results.py index 21a2c26c..06b4860e 100755 --- a/wqflask/wqflask/correlation/show_corr_results.py +++ b/wqflask/wqflask/correlation/show_corr_results.py @@ -943,7 +943,7 @@ class CorrelationResults(object): use_tissue_corr = True DatabaseFileName = self.getFileName( target_db_name=self.target_db_name ) - datasetFile = open(webqtlConfig.TEXTDIR+DatabaseFileName,'r') + datasetFile = open(webqtlConfig.CACHEDIR+DatabaseFileName,'r') #XZ, 01/08/2009: read the first line line = datasetFile.readline() diff --git a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py index 6bc0ef77..f74e655d 100755 --- a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py +++ b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py @@ -43,7 +43,6 @@ from pprint import pformat as pf from htmlgen import HTMLgen2 as HT import reaper -from base import webqtlConfig from utility.THCell import THCell from utility.TDCell import TDCell from base.trait import GeneralTrait diff --git a/wqflask/wqflask/heatmap/heatmap.py b/wqflask/wqflask/heatmap/heatmap.py index 40f518f0..61847bc3 100644 --- a/wqflask/wqflask/heatmap/heatmap.py +++ b/wqflask/wqflask/heatmap/heatmap.py @@ -26,8 +26,6 @@ import reaper from base.trait import GeneralTrait from base import data_set from base import species -from base import webqtlConfig -from utility import webqtlUtil # from wqflask.my_pylmm.pyLMM import lmm # from wqflask.my_pylmm.pyLMM import input from utility import helper_functions diff --git a/wqflask/wqflask/interval_analyst/IntervalAnalystPage.py b/wqflask/wqflask/interval_analyst/IntervalAnalystPage.py index ec9aa29c..f45ec0c4 100755 --- a/wqflask/wqflask/interval_analyst/IntervalAnalystPage.py +++ b/wqflask/wqflask/interval_analyst/IntervalAnalystPage.py @@ -45,40 +45,40 @@ class IntervalAnalystPage(templatePage): #A dictionary that lets us map the html form names "txStart_mm6" -> "Mb Start (mm8)" #the first item is the short name (column headers) and the second item is the long name (dropdown list) # [short name, long name, category] - columnNames = {"GeneSymbol" : ["Gene", "Gene Name", 'gene'], + columnNames = {"GeneSymbol" : ["Gene", "Gene Name", 'gene'], "GeneDescription" : ["Description", "Gene Description", 'species'], - 'GeneNeighborsCount' : ["Neighbors", "Gene Neighbors", 'gene'], - 'GeneNeighborsRange' : ["Neighborhood", "Gene Neighborhood (Mb)", 'gene'], - 'GeneNeighborsDensity' : ["Gene Density", "Gene Density (Neighbors/Mb)", 'gene'], + 'GeneNeighborsCount' : ["Neighbors", "Gene Neighbors", 'gene'], + 'GeneNeighborsRange' : ["Neighborhood", "Gene Neighborhood (Mb)", 'gene'], + 'GeneNeighborsDensity' : ["Gene Density", "Gene Density (Neighbors/Mb)", 'gene'], "ProteinID" : ["Prot ID", "Protein ID", 'protein'], - "Chromosome" : ["Chr", "Chromosome", 'species'], - "TxStart" : ["Start", "Mb Start", 'species'], - "TxEnd" : ["End", "Mb End", 'species'], - "GeneLength" : ["Length", "Kb Length", 'species'], - "cdsStart" : ["CDS Start", "Mb CDS Start", 'species'], + "Chromosome" : ["Chr", "Chromosome", 'species'], + "TxStart" : ["Start", "Mb Start", 'species'], + "TxEnd" : ["End", "Mb End", 'species'], + "GeneLength" : ["Length", "Kb Length", 'species'], + "cdsStart" : ["CDS Start", "Mb CDS Start", 'species'], "cdsEnd" : ["CDS End", "Mb CDS End", 'species'], - "exonCount" : ["Num Exons", "Exon Count", 'species'], - "exonStarts" : ["Exon Starts", "Exon Starts", 'species'], - "exonEnds" : ["Exon Ends", "Exon Ends", 'species'], - "Strand" : ["Strand", "Strand", 'species'], + "exonCount" : ["Num Exons", "Exon Count", 'species'], + "exonStarts" : ["Exon Starts", "Exon Starts", 'species'], + "exonEnds" : ["Exon Ends", "Exon Ends", 'species'], + "Strand" : ["Strand", "Strand", 'species'], "GeneID" : ["Gene ID", "Gene ID", 'species'], - "GenBankID" : ["GenBank", "GenBank ID", 'species'], + "GenBankID" : ["GenBank", "GenBank ID", 'species'], "UnigenID" : ["Unigen", "Unigen ID", 'species'], - "NM_ID" : ["NM ID", "NM ID", 'species'], + "NM_ID" : ["NM ID", "NM ID", 'species'], "kgID" : ["kg ID", "kg ID", 'species'], - "snpCount" : ["SNPs", "SNP Count", 'species'], - "snpDensity" : ["SNP Density", "SNP Density", 'species'], - "lrs" : ["LRS", "Likelihood Ratio Statistic", 'misc'], - "lod" : ["LOD", "Likelihood Odds Ratio", 'misc'], - "pearson" : ["Pearson", "Pearson Product Moment", 'misc'], - "literature" : ["Lit Corr", "Literature Correlation", 'misc'], + "snpCount" : ["SNPs", "SNP Count", 'species'], + "snpDensity" : ["SNP Density", "SNP Density", 'species'], + "lrs" : ["LRS", "Likelihood Ratio Statistic", 'misc'], + "lod" : ["LOD", "Likelihood Odds Ratio", 'misc'], + "pearson" : ["Pearson", "Pearson Product Moment", 'misc'], + "literature" : ["Lit Corr", "Literature Correlation", 'misc'], } ###Species Freeze speciesFreeze = {'mouse':'mm9', 'rat':'rn3', 'human':'hg19'} for key in speciesFreeze.keys(): speciesFreeze[speciesFreeze[key]] = key - + def __init__(self, fd): templatePage.__init__(self, fd) @@ -86,7 +86,7 @@ class IntervalAnalystPage(templatePage): fd.formdata['remote_ip'] = fd.remote_ip if not self.openMysql(): return - + self.species = fd.formdata.getvalue("species", "mouse") try: self.startMb = float(fd.formdata.getvalue("startMb")) @@ -96,7 +96,7 @@ class IntervalAnalystPage(templatePage): self.endMb = float(fd.formdata.getvalue("endMb")) except: self.endMb = self.startMb + 10 - + self.Chr = fd.formdata.getvalue("chromosome", "1") self.xls = fd.formdata.getvalue("xls", "1") try: @@ -107,38 +107,38 @@ class IntervalAnalystPage(templatePage): self.diffColDefault = self.diffCol = [] if self.species != 'mouse': self.diffColDefault = [2, 3]#default is B6 and D2 for other species - + controlFrm, dispFields = self.genControlForm(fd) geneTable, filename = self.genGeneTable(fd, dispFields) - + infoTD = HT.TD(width=400, valign= "top") - infoTD.append(HT.Paragraph("Interval Analyst : Chr %s" % self.Chr, Class="title"), - HT.Strong("Species : "), self.species.title(), HT.BR(), - HT.Strong("Database : "), "UCSC %s" % self.speciesFreeze[self.species], HT.BR(), - HT.Strong("Range : "), "%2.6f Mb - %2.6f Mb" % (self.startMb, self.endMb), HT.BR(), + infoTD.append(HT.Paragraph("Interval Analyst : Chr %s" % self.Chr, Class="title"), + HT.Strong("Species : "), self.species.title(), HT.BR(), + HT.Strong("Database : "), "UCSC %s" % self.speciesFreeze[self.species], HT.BR(), + HT.Strong("Range : "), "%2.6f Mb - %2.6f Mb" % (self.startMb, self.endMb), HT.BR(), ) if filename: infoTD.append(HT.BR(), HT.BR(), HT.Href(text="Download", url = "/tmp/" + filename, Class="normalsize") , " output in MS excel format.") - + mainTable = HT.TableLite(HT.TR(infoTD, HT.TD(controlFrm, Class="doubleBorder", width=400), HT.TD(" ", width="")), cellpadding=10) mainTable.append(HT.TR(HT.TD(geneTable, colspan=3))) self.dict['body'] = HT.TD(mainTable) self.dict['title'] = "Interval Analyst" - + def genGeneTable(self, fd, dispFields): filename = "" if self.xls: #import pyXLWriter as xl filename = "IntAn_Chr%s_%2.6f-%2.6f" % (self.Chr, self.startMb, self.endMb) filename += ".xls" - + # Create a new Excel workbook workbook = xl.Writer(os.path.join(webqtlConfig.TMPDIR, filename)) worksheet = workbook.add_worksheet() titleStyle = workbook.add_format(align = 'left', bold = 0, size=18, border = 1, border_color="gray") headingStyle = workbook.add_format(align = 'center', bold = 1, size=13, fg_color = 0x1E, color="white", border = 1, border_color="gray") - + ##Write title Info worksheet.write([0, 0], "GeneNetwork Interval Analyst Table", titleStyle) worksheet.write([1, 0], "%s%s" % (webqtlConfig.PORTADDR, os.path.join(webqtlConfig.CGIDIR, self._scriptfile))) @@ -148,12 +148,12 @@ class IntervalAnalystPage(templatePage): worksheet.write([4, 0], "Search by : %s" % fd.formdata['remote_ip']) worksheet.write([5, 0], "view region : Chr %s %2.6f - %2.6f Mb" % (self.Chr, self.startMb, self.endMb)) nTitleRow = 7 - + geneTable = HT.TableLite(Class="collap", cellpadding=5) headerRow = HT.TR(HT.TD(" ", Class="fs13 fwb ffl b1 cw cbrb", width="1")) if self.xls: worksheet.write([nTitleRow, 0], "Index", headingStyle) - + for ncol, column in enumerate(dispFields): if len(column) == 1: headerRow.append(HT.TD(self.columnNames[column[0]][0], Class="fs13 fwb ffl b1 cw cbrb", NOWRAP=1,align="Center")) @@ -162,24 +162,24 @@ class IntervalAnalystPage(templatePage): worksheet.write([nTitleRow, ncol+1], colTitle, headingStyle) worksheet.set_column([ncol+1, ncol+1], 2*len(colTitle)) else: - headerRow.append(HT.TD(self.columnNames[column[0]][0], HT.BR(), " (%s)" % self.speciesFreeze[column[1]], + headerRow.append(HT.TD(self.columnNames[column[0]][0], HT.BR(), " (%s)" % self.speciesFreeze[column[1]], Class="fs13 fwb ffl b1 cw cbrb", NOWRAP=1, align="Center")) if self.xls: colTitle = self.columnNames[column[0]][0] + " (%s)" % self.speciesFreeze[column[1]] worksheet.write([nTitleRow, ncol+1], colTitle, headingStyle) worksheet.set_column([ncol+1, ncol+1], 2*len(colTitle)) - #headerRow.append(HT.TD(self.columnNames[column[0]][0], HT.BR(), - # "(%s %s)" % (column[1].title(), self.speciesFreeze[column[1]]), + #headerRow.append(HT.TD(self.columnNames[column[0]][0], HT.BR(), + # "(%s %s)" % (column[1].title(), self.speciesFreeze[column[1]]), # Class="colorBlue", NOWRAP=1, align="Center")) geneTable.append(headerRow) - + geneCol = GeneUtil.loadGenes(self.cursor, self.Chr, self.diffColDefault, self.startMb, self.endMb, species=self.species) for gIndex, theGO in enumerate(geneCol): geneRow = HT.TR(HT.TD(gIndex+1, Class="fs12 fwn b1", align="right")) if self.xls: nTitleRow += 1 worksheet.write([nTitleRow, 0], gIndex + 1) - + for ncol, column in enumerate(dispFields): if len(column) == 1 or column[1]== self.species: keyValue = "" @@ -196,17 +196,17 @@ class IntervalAnalystPage(templatePage): curGO = theGO[subGO] if theGO[subGO].has_key(fieldName): keyValue = theGO[subGO][fieldName] - + if self.xls: worksheet.write([nTitleRow, ncol+1], keyValue) geneRow.append(self.formatTD(keyValue, fieldName, curSpecies, curGO)) - + geneTable.append(geneRow) - + if self.xls: workbook.close() return geneTable, filename - + def formatTD(self, keyValue, fieldName, Species, theGO): if keyValue is None: keyValue = "" @@ -219,7 +219,7 @@ class IntervalAnalystPage(templatePage): keyValue = "" return HT.TD(keyValue, Class="fs12 fwn b1", width=300) elif fieldName in ("GeneSymbol"): - webqtlLink = HT.Href("./%s?cmd=sch&gene=%s&alias=1&species=%s" % (webqtlConfig.SCRIPTFILE, keyValue, Species), + webqtlLink = HT.Href("./%s?cmd=sch&gene=%s&alias=1&species=%s" % (webqtlConfig.SCRIPTFILE, keyValue, Species), HT.Image("/images/webqtl_search.gif", border=0, valign="top"), target="_blank") if theGO['GeneID']: geneSymbolLink = HT.Href(webqtlConfig.NCBI_LOCUSID % theGO['GeneID'], keyValue, Class="normalsize", target="_blank") @@ -236,8 +236,8 @@ class IntervalAnalystPage(templatePage): return HT.TD(keyValue, Class="fs12 fwn b1",align="right") elif fieldName in ("snpCount"): if keyValue: - snpString = HT.Href(url="%s&chr=%s&start=%s&end=%s&geneName=%s&s1=%d&s2=%d" % (os.path.join(webqtlConfig.CGIDIR, 'main.py?FormID=snpBrowser'), - theGO["Chromosome"], theGO["TxStart"], theGO["TxEnd"], theGO["GeneSymbol"], self.diffColDefault[0], self.diffColDefault[1]), + snpString = HT.Href(url="%s&chr=%s&start=%s&end=%s&geneName=%s&s1=%d&s2=%d" % (os.path.join(webqtlConfig.CGIDIR, 'main.py?FormID=snpBrowser'), + theGO["Chromosome"], theGO["TxStart"], theGO["TxEnd"], theGO["GeneSymbol"], self.diffColDefault[0], self.diffColDefault[1]), text=theGO["snpCount"], target="_blank", Class="normalsize") else: snpString = keyValue @@ -252,13 +252,13 @@ class IntervalAnalystPage(templatePage): return HT.TD(keyValue, Class="fs12 fwn b1",NOWRAP=1) else: return HT.TD(keyValue, Class="fs12 fwn b1",NOWRAP=1,align="right") - + def genControlForm(self, fd): ##desc GeneList self.cursor.execute("Desc GeneList") GeneListFields = self.cursor.fetchall() GeneListFields = map(lambda X: X[0], GeneListFields) - + #group columns by category--used for creating the dropdown list of possible columns categories = {} for item in self.columnNames.keys(): @@ -267,7 +267,7 @@ class IntervalAnalystPage(templatePage): categories[category[-1]] = [item ] else: categories[category[-1]] = categories[category[-1]]+[item] - + ##List All Species in the Gene Table speciesDict = {} self.cursor.execute("select Species.Name, GeneList.SpeciesId from Species, GeneList where \ @@ -292,34 +292,34 @@ class IntervalAnalystPage(templatePage): pass AppliedField.append(item2) categories[specName] = AppliedField - + categoriesOrder += ['misc'] - + ############################################################ ## Create the list of possible columns for the dropdown list ############################################################ allColumnsList = HT.Select(name="allColumns", Class="snpBrowserDropBox") - + for category in categoriesOrder: allFields = categories[category] if allFields: geneOpt = HT.Optgroup(label=category.title()) for item in allFields: if category in self.speciesFreeze.keys(): - geneOpt.append(("%s (%s %s)" % (self.columnNames[item][1], category.title(), self.speciesFreeze[category]), + geneOpt.append(("%s (%s %s)" % (self.columnNames[item][1], category.title(), self.speciesFreeze[category]), "%s__%s" % (item, self.speciesFreeze[category]))) else: geneOpt.append((self.columnNames[item][1], item)) geneOpt.sort() allColumnsList.append(geneOpt) - + ###################################### ## Create the list of selected columns ###################################### - + #cols contains the value of all the selected columns submitCols = cols = fd.formdata.getvalue("columns", "default") - + if cols == "default": if self.species=="mouse": #these are the same columns that are shown on intervalPage.py cols = ['GeneSymbol', 'GeneDescription', 'Chromosome', 'TxStart', 'Strand', 'GeneLength', 'GeneID', 'NM_ID', 'snpCount', 'snpDensity'] @@ -331,12 +331,12 @@ class IntervalAnalystPage(templatePage): else: if type(cols)==type(""): cols = [cols] - + colsLst = [] dispFields = [] for column in cols: if submitCols == "default" and column not in ('GeneSymbol') and (column in GeneListFields or column in speciesField): - colsLst.append(("%s (%s %s)" % (self.columnNames[column][1], self.species.title(), self.speciesFreeze[self.species]), + colsLst.append(("%s (%s %s)" % (self.columnNames[column][1], self.species.title(), self.speciesFreeze[self.species]), "%s__%s" % (column, self.speciesFreeze[self.species]))) dispFields.append([column, self.species]) else: @@ -346,17 +346,17 @@ class IntervalAnalystPage(templatePage): dispFields.append([column]) else: thisSpecies = self.speciesFreeze[column2[1]] - colsLst.append(("%s (%s %s)" % (self.columnNames[column2[0]][1], thisSpecies.title(), column2[1]), + colsLst.append(("%s (%s %s)" % (self.columnNames[column2[0]][1], thisSpecies.title(), column2[1]), column)) dispFields.append((column2[0], thisSpecies)) selectedColumnsList = HT.Select(name="columns", Class="snpBrowserSelectBox", multiple="true", data=colsLst, size=6) - + ########################## ## Create the columns form - ########################## + ########################## columnsForm = HT.Form(name="columnsForm", submit=HT.Input(type='hidden'), cgi=os.path.join(webqtlConfig.CGIDIR, self._scriptfile), enctype="multipart/form-data") columnsForm.append(HT.Input(type="hidden", name="fromdatabase", value= fd.formdata.getvalue("fromdatabase", "unknown"))) - columnsForm.append(HT.Input(type="hidden", name="species", value=self.species)) + columnsForm.append(HT.Input(type="hidden", name="species", value=self.species)) if self.diffCol: columnsForm.append(HT.Input(type="hidden", name="s1", value=self.diffCol[0])) columnsForm.append(HT.Input(type="hidden", name="s2", value=self.diffCol[1])) @@ -366,8 +366,8 @@ class IntervalAnalystPage(templatePage): removeButton = HT.Input(type="button", name="remove", value="Remove", Class="button", onClick="removeFromList(this.form.columns.selectedIndex, this.form.columns)") upButton = HT.Input(type="button", name="up", value="Up", Class="button", onClick="swapOptions(this.form.columns.selectedIndex, this.form.columns.selectedIndex-1, this.form.columns)") downButton = HT.Input(type="button", name="down", value="Down", Class="button", onClick="swapOptions(this.form.columns.selectedIndex, this.form.columns.selectedIndex+1, this.form.columns)") - clearButton = HT.Input(type="button", name="clear", value="Clear", Class="button", onClick="deleteAllElements(this.form.columns)") - submitButton = HT.Input(type="submit", value="Refresh", Class="button", onClick="selectAllElements(this.form.columns)") + clearButton = HT.Input(type="button", name="clear", value="Clear", Class="button", onClick="deleteAllElements(this.form.columns)") + submitButton = HT.Input(type="submit", value="Refresh", Class="button", onClick="selectAllElements(this.form.columns)") selectChrBox = HT.Select(name="chromosome") self.cursor.execute(""" @@ -375,11 +375,11 @@ class IntervalAnalystPage(templatePage): Chr_Length.Name, Length from Chr_Length, Species where Chr_Length.SpeciesId = Species.Id AND - Species.Name = '%s' + Species.Name = '%s' Order by Chr_Length.OrderId """ % self.species) - + results = self.cursor.fetchall() for chrInfo in results: selectChrBox.append((chrInfo[0], chrInfo[0])) @@ -401,5 +401,5 @@ class IntervalAnalystPage(templatePage): #columnsForm.append(HT.Input(type="hidden", name="sort", value=diffCol), # HT.Input(type="hidden", name="identification", value=identification), # HT.Input(type="hidden", name="traitInfo", value=traitInfo)) - + return columnsForm, dispFields diff --git a/wqflask/wqflask/marker_regression/MarkerRegressionPage.py b/wqflask/wqflask/marker_regression/MarkerRegressionPage.py index d02d80b3..455fcf95 100755 --- a/wqflask/wqflask/marker_regression/MarkerRegressionPage.py +++ b/wqflask/wqflask/marker_regression/MarkerRegressionPage.py @@ -140,7 +140,7 @@ class MarkerRegressionPage(templatePage): intCanvas = pid.PILCanvas(size=(self.graphWidth,self.graphHeight)) gifmap = self.plotIntMappingForPLINK(fd, intCanvas, startMb = self.startMb, endMb = self.endMb, plinkResultDict=plinkResultDict) - intCanvas.save(os.path.join(webqtlConfig.IMGDIR, filename), format='png') + intCanvas.save(os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, filename), format='png') intImg=HT.Image('/image/'+filename+'.png', border=0, usemap='#WebQTLImageMap') TD_LR = HT.TR(HT.TD(HT.Blockquote(gifmap,intImg, HT.P()), bgColor='#eeeeee', height = 200)) @@ -249,7 +249,7 @@ class MarkerRegressionPage(templatePage): intCanvas = pid.PILCanvas(size=(self.graphWidth,self.graphHeight)) gifmap = self.plotIntMapping(fd, intCanvas, startMb = self.startMb, endMb = self.endMb, showLocusForm= "") filename= webqtlUtil.genRandStr("Itvl_") - intCanvas.save(os.path.join(webqtlConfig.IMGDIR, filename), format='png') + intCanvas.save(os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, filename), format='png') intImg=HT.Image('/image/'+filename+'.png', border=0, usemap='#WebQTLImageMap') ################################################################ @@ -458,7 +458,7 @@ class MarkerRegressionPage(templatePage): #plotBar(myCanvas,10,10,390,290,LRSArray,XLabel='LRS',YLabel='Frequency',title=' Histogram of Permutation Test',identification=fd.identification) Plot.plotBar(myCanvas, LRSArray,XLabel='LRS',YLabel='Frequency',title=' Histogram of Permutation Test') filename= webqtlUtil.genRandStr("Reg_") - myCanvas.save(webqtlConfig.IMGDIR+filename, format='gif') + myCanvas.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif') img=HT.Image('/image/'+filename+'.gif',border=0,alt='Histogram of Permutation Test') if fd.suggestive == None: diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index 36334317..265f9473 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -30,7 +30,7 @@ from flask import Flask, g from base.trait import GeneralTrait from base import data_set from base import species -from base import webqtlConfig +# from base import webqtlConfig from utility import webqtlUtil from utility import helper_functions from utility import Plot, Bunch diff --git a/wqflask/wqflask/marker_regression/marker_regression_gn1.py b/wqflask/wqflask/marker_regression/marker_regression_gn1.py index 01303b0f..decde579 100644 --- a/wqflask/wqflask/marker_regression/marker_regression_gn1.py +++ b/wqflask/wqflask/marker_regression/marker_regression_gn1.py @@ -178,8 +178,8 @@ class MarkerRegression(object): self.species = start_vars['species'] #Needing for form submission when doing single chr mapping or remapping after changing options - self.vals = start_vars['vals'] - self.mapping_method = start_vars['mapping_method'] + self.vals = start_vars['vals'] + self.mapping_method = start_vars['mapping_method'] if self.mapping_method == "rqtl_geno": self.mapmethod_rqtl_geno = start_vars['method'] self.mapmodel_rqtl_geno = start_vars['model'] @@ -232,7 +232,7 @@ class MarkerRegression(object): self.significant = start_vars['significant'] else: self.nperm = 0 - + if 'bootCheck' in start_vars.keys(): self.bootChecked = start_vars['bootCheck'] else: @@ -308,7 +308,7 @@ class MarkerRegression(object): if 'showSNP' in start_vars.keys(): self.SNPChecked = start_vars['showSNP'] else: - self.SNPChecked = False + self.SNPChecked = False if 'showGenes' in start_vars.keys(): self.geneChecked = start_vars['showGenes'] else: @@ -321,7 +321,7 @@ class MarkerRegression(object): self.endMb = float(start_vars['endMb']) except: self.endMb = -1 - try: + try: self.lrsMax = float(start_vars['lrsMax']) except: self.lrsMax = 0 @@ -363,7 +363,7 @@ class MarkerRegression(object): self.ChrList.append((indChr.name, i)) - + self.ChrLengthMbList = g.db.execute(""" Select Length from Chr_Length, InbredSet @@ -517,7 +517,7 @@ class MarkerRegression(object): chrName = self.selectedChr # Draw the genes for this chromosome / region of this chromosome webqtldatabase = self.dataset.name - + if self.dataset.group.species == "mouse": self.geneCol = GeneUtil.loadGenes(chrName, self.diffCol, self.startMb, self.endMb, webqtldatabase, "mouse") elif self.dataset.group.species == "rat": @@ -533,11 +533,11 @@ class MarkerRegression(object): # # #GENEID = fd.formdata.getvalue('GeneId') or None # GENEID = None - # + # # geneTableContainer = HT.Div(Id="sortable") #Div to hold table # geneTable = self.geneTable(self.geneCol,GENEID) # geneTableContainer.append(geneTable) - # + # # mainfmName = webqtlUtil.genRandStr("fm_") # tableForm = HT.Form(cgi=os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), enctype='multipart/form-data', name=mainfmName, submit=HT.Input(type='hidden')) # tableForm.append(HT.Input(name='FormID', value='', type='hidden')) @@ -552,22 +552,22 @@ class MarkerRegression(object): #else: showLocusForm = "" intCanvas = pid.PILCanvas(size=(self.graphWidth, self.graphHeight)) - gifmap = self.plotIntMapping(intCanvas, startMb = self.startMb, endMb = self.endMb, showLocusForm= showLocusForm) + gifmap = self.plotIntMapping(intCanvas, startMb = self.startMb, endMb = self.endMb, showLocusForm= showLocusForm) self.gifmap = gifmap.__str__() #print("GIFMAP:", gifmap.__str__()) self.filename= webqtlUtil.genRandStr("Itvl_") - intCanvas.save(os.path.join(webqtlConfig.IMGDIR, self.filename), format='jpeg') + intCanvas.save(os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, self.filename), format='jpeg') intImg=HT.Image('/image/'+self.filename+'.png', border=0, usemap='#WebQTLImageMap') #Scales plot differently for high resolution if self.draw2X: intCanvasX2 = pid.PILCanvas(size=(self.graphWidth*2,self.graphHeight*2)) gifmapX2 = self.plotIntMapping(intCanvasX2, startMb = self.startMb, endMb = self.endMb, showLocusForm= showLocusForm, zoom=2) - intCanvasX2.save(os.path.join(webqtlConfig.IMGDIR, self.filename+"X2"), format='png') + intCanvasX2.save(os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, self.filename+"X2"), format='png') #DLintImgX2=HT.Href(text='Download',url = '/image/'+self.filename+'X2.png', Class='smallsize', target='_blank') - + #textUrl = self.writeQTL2Text(fd, self.filename) ################################################################ @@ -597,7 +597,7 @@ class MarkerRegression(object): showLocusForm.append(intImg) else: showLocusForm = intImg - + if self.permChecked and self.nperm > 0 and not self.multipleInterval and 0 < self.nperm: self.perm_filename = self.drawPermutationHistogram() #perm_text_file = self.permutationTextFile() @@ -667,7 +667,7 @@ class MarkerRegression(object): TD_LR.append(HT.Blockquote(tableForm)) self.body = TD_LR - + #self.dict['body'] = TD_LR #self.dict['title'] = "Mapping" @@ -858,7 +858,7 @@ class MarkerRegression(object): BootCoord = [] i = 0 startX = xLeftOffset - + if self.selectedChr == -1: #ZS: If viewing full genome/all chromosomes for j, _chr in enumerate(self.genotype): BootCoord.append( []) @@ -881,8 +881,8 @@ class MarkerRegression(object): else: Xc = startX + (_locus.cM-_chr[0].cM)*plotXScale BootCoord[-1].append([Xc, self.bootResult[i]]) - i += 1 - + i += 1 + #reduce bootResult if self.selectedChr > -1: maxBootBar = 80.0 @@ -1411,7 +1411,7 @@ class MarkerRegression(object): if _strains[ii] in self.dataset.group.samplelist: temp = GeneralObject(name=_strains[ii], value=_val) smd.append(temp) - + smd.sort(lambda A, B: cmp(A.value, B.value)) smd.reverse() @@ -1566,14 +1566,14 @@ class MarkerRegression(object): firstGene = 0 else: lastGene = 0 - + for j, _geno in enumerate (self.genotype[0][1].genotype): plotbxd=0 for item in smd: if item.name == samplelist[j]: - plotbxd=1 - + plotbxd=1 + if (plotbxd == 1): ind = 0 @@ -1620,28 +1620,28 @@ class MarkerRegression(object): currentChromosome = self.genotype[0].name i = 0 - + paddingTop = yTopOffset ucscPaddingTop = paddingTop + self.WEBQTL_BAND_HEIGHT + self.BAND_SPACING ensemblPaddingTop = ucscPaddingTop + self.UCSC_BAND_HEIGHT + self.BAND_SPACING - + if zoom == 1: for pixel in range(xLeftOffset, xLeftOffset + plotWidth, pixelStep): - + calBase = self.kONE_MILLION*(startMb + (endMb-startMb)*(pixel-xLeftOffset-0.0)/plotWidth) - + xBrowse1 = pixel xBrowse2 = min(xLeftOffset + plotWidth, (pixel + pixelStep - 1)) - + WEBQTL_COORDS = "%d, %d, %d, %d" % (xBrowse1, paddingTop, xBrowse2, (paddingTop+self.WEBQTL_BAND_HEIGHT)) bandWidth = xBrowse2 - xBrowse1 WEBQTL_HREF = "javascript:rangeView('%s', %f, %f)" % (self.selectedChr - 1, max(0, (calBase-webqtlZoomWidth))/1000000.0, (calBase+webqtlZoomWidth)/1000000.0) - + WEBQTL_TITLE = "Click to view this section of the genome in WebQTL" gifmap.areas.append(HT.Area(shape='rect',coords=WEBQTL_COORDS,href=WEBQTL_HREF, title=WEBQTL_TITLE)) canvas.drawRect(xBrowse1, paddingTop, xBrowse2, (paddingTop + self.WEBQTL_BAND_HEIGHT), edgeColor=self.CLICKABLE_WEBQTL_REGION_COLOR, fillColor=self.CLICKABLE_WEBQTL_REGION_COLOR) canvas.drawLine(xBrowse1, paddingTop, xBrowse1, (paddingTop + self.WEBQTL_BAND_HEIGHT), color=self.CLICKABLE_WEBQTL_REGION_OUTLINE_COLOR) - + UCSC_COORDS = "%d, %d, %d, %d" %(xBrowse1, ucscPaddingTop, xBrowse2, (ucscPaddingTop+self.UCSC_BAND_HEIGHT)) if self.species == "mouse": UCSC_HREF = "http://genome.ucsc.edu/cgi-bin/hgTracks?db=%s&position=chr%s:%d-%d&hgt.customText=%s/snp/chr%s" % (self._ucscDb, self.selectedChr, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases, webqtlConfig.PORTADDR, self.selectedChr) @@ -1651,7 +1651,7 @@ class MarkerRegression(object): gifmap.areas.append(HT.Area(shape='rect',coords=UCSC_COORDS,href=UCSC_HREF, title=UCSC_TITLE)) canvas.drawRect(xBrowse1, ucscPaddingTop, xBrowse2, (ucscPaddingTop+self.UCSC_BAND_HEIGHT), edgeColor=self.CLICKABLE_UCSC_REGION_COLOR, fillColor=self.CLICKABLE_UCSC_REGION_COLOR) canvas.drawLine(xBrowse1, ucscPaddingTop, xBrowse1, (ucscPaddingTop+self.UCSC_BAND_HEIGHT), color=self.CLICKABLE_UCSC_REGION_OUTLINE_COLOR) - + ENSEMBL_COORDS = "%d, %d, %d, %d" %(xBrowse1, ensemblPaddingTop, xBrowse2, (ensemblPaddingTop+self.ENSEMBL_BAND_HEIGHT)) if self.species == "mouse": ENSEMBL_HREF = "http://www.ensembl.org/Mus_musculus/contigview?highlight=&chr=%s&vc_start=%d&vc_end=%d&x=35&y=12" % (self.selectedChr, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases) @@ -1766,7 +1766,7 @@ class MarkerRegression(object): ChrAInfo = [] preLpos = -1 distinctCount = 0.0 - + #if len(self.genotype) > 1: if self.selectedChr == -1: #ZS: If viewing full genome/all chromosomes for i, _chr in enumerate(self.genotype): @@ -1809,7 +1809,7 @@ class MarkerRegression(object): offsetA = -stepA lineColor = pid.lightblue startPosX = xLeftOffset - + for j, ChrInfo in enumerate(ChrAInfo): preLpos = -1 for i, item in enumerate(ChrInfo): @@ -1877,7 +1877,7 @@ class MarkerRegression(object): # lodm = self.LODFACTOR # else: # lodm = 1.0 - + #ZS: This is a mess, but I don't know a better way to account for different mapping methods returning results in different formats + the option to change between LRS and LOD if self.lrsMax <= 0: #sliding scale if "lrs_value" in self.qtlresults[0]: @@ -1890,7 +1890,7 @@ class MarkerRegression(object): else: if self.permChecked and self.nperm > 0 and not self.multipleInterval: self.significant = min(self.significant, webqtlConfig.MAXLRS) - self.suggestive = min(self.suggestive, webqtlConfig.MAXLRS) + self.suggestive = min(self.suggestive, webqtlConfig.MAXLRS) else: pass else: @@ -1903,10 +1903,10 @@ class MarkerRegression(object): else: if self.permChecked and self.nperm > 0 and not self.multipleInterval: self.significant = min(self.significant, webqtlConfig.MAXLRS) - self.suggestive = min(self.suggestive, webqtlConfig.MAXLRS) + self.suggestive = min(self.suggestive, webqtlConfig.MAXLRS) else: pass - + if self.permChecked and self.nperm > 0 and not self.multipleInterval: LRS_LOD_Max = max(self.significant, LRS_LOD_Max) @@ -1923,7 +1923,7 @@ class MarkerRegression(object): LRSScale = 2.5 else: LRSScale = 1.0 - + LRSAxisList = Plot.frange(LRSScale, LRS_LOD_Max, LRSScale) #make sure the user's value appears on the y-axis #update by NL 6-21-2011: round the LOD value to 100 when LRS_LOD_Max is equal to 460 @@ -1953,7 +1953,7 @@ class MarkerRegression(object): #"Significant" and "Suggestive" Drawing Routine # ======= Draw the thick lines for "Significant" and "Suggestive" ===== (crowell: I tried to make the SNPs draw over these lines, but piddle wouldn't have it...) - + #ZS: I don't know if what I did here with this inner function is clever or overly complicated, but it's the only way I could think of to avoid duplicating the code inside this function def add_suggestive_significant_lines_and_legend(start_pos_x, chr_length_dist): rightEdge = int(start_pos_x + chr_length_dist*plotXScale - self.SUGGESTIVE_WIDTH/1.5) @@ -1976,13 +1976,13 @@ class MarkerRegression(object): start_pos_x += (chr_length_dist+self.GraphInterval)*plotXScale return start_pos_x - + for i, _chr in enumerate(self.genotype): if self.selectedChr != -1: if _chr.name == self.ChrList[self.selectedChr][0]: startPosX = add_suggestive_significant_lines_and_legend(startPosX, self.ChrLengthDistList[0]) break - else: + else: continue else: startPosX = add_suggestive_significant_lines_and_legend(startPosX, self.ChrLengthDistList[i]) @@ -1997,7 +1997,7 @@ class MarkerRegression(object): #else: # dominanceMax = -1 lrsEdgeWidth = 2 - + if zoom == 2: lrsEdgeWidth = 2 * lrsEdgeWidth @@ -2018,7 +2018,7 @@ class MarkerRegression(object): if qtlresult['chr'] != previous_chr and self.selectedChr == -1: if self.manhattan_plot != True: canvas.drawPolygon(LRSCoordXY,edgeColor=thisLRSColor,closed=0, edgeWidth=lrsEdgeWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth)) - + if not self.multipleInterval and self.additiveChecked: plusColor = self.ADDITIVE_COLOR_POSITIVE minusColor = self.ADDITIVE_COLOR_NEGATIVE @@ -2048,7 +2048,7 @@ class MarkerRegression(object): canvas.drawLine(Xc0, Yc0, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth)) else: canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xc, yZero - (Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth)) - + LRSCoordXY = [] AdditiveCoordXY = [] previous_chr = qtlresult['chr'] @@ -2061,7 +2061,7 @@ class MarkerRegression(object): #startPosX += (self.ChrLengthDistList[j]+self.GraphInterval)*plotXScale - #for j, _chr in enumerate(self.genotype): + #for j, _chr in enumerate(self.genotype): #ZS: This is beause the chromosome value stored in qtlresult['chr'] can be (for example) either X or 20 depending upon the mapping method/scale used if self.plotScale == "physic": this_chr = str(self.ChrList[self.selectedChr][0]) @@ -2126,7 +2126,7 @@ class MarkerRegression(object): if self.manhattan_plot != True: canvas.drawPolygon(LRSCoordXY,edgeColor=thisLRSColor,closed=0, edgeWidth=lrsEdgeWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth)) - + if not self.multipleInterval and self.additiveChecked: plusColor = self.ADDITIVE_COLOR_POSITIVE minusColor = self.ADDITIVE_COLOR_NEGATIVE @@ -2156,7 +2156,7 @@ class MarkerRegression(object): canvas.drawLine(Xc0, Yc0, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth)) else: canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xc, yZero - (Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth)) - + if not self.multipleInterval and INTERCROSS and self.dominanceChecked: plusColor = self.DOMINANCE_COLOR_POSITIVE minusColor = self.DOMINANCE_COLOR_NEGATIVE @@ -2186,7 +2186,7 @@ class MarkerRegression(object): canvas.drawLine(Xc0, Yc0, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth)) else: canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xc, yZero - (Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth)) - + ###draw additive scale if not self.multipleInterval and self.additiveChecked: @@ -2222,7 +2222,7 @@ class MarkerRegression(object): if zoom == 2: fontZoom = 1.5 yTopOffset += 30 - + #calculate plot scale if self.plotScale != 'physic': self.ChrLengthDistList = self.ChrLengthCMList @@ -2589,13 +2589,13 @@ class MarkerRegression(object): perm_output = [value/4.16 for value in self.perm_output] else: perm_output = self.perm_output - + Plot.plotBar(myCanvas, perm_output, XLabel=self.LRS_LOD, YLabel='Frequency', title=' Histogram of Permutation Test') filename= webqtlUtil.genRandStr("Reg_") myCanvas.save(webqtlConfig.IMGDIR+filename, format='gif') - + return filename - + # img=HT.Image('/image/'+filename+'.gif',border=0,alt='Histogram of Permutation Test') # self.suggestive = self.perm_output[int(self.nperm*0.37-1)] @@ -2609,9 +2609,9 @@ class MarkerRegression(object): # permutation.append(HT.TR(HT.TD(img)), # HT.TR(HT.TD('')), # HT.TR(HT.TD('Total of %d permutations'%self.nperm))) - + # return permutation - + def permutationTextFile(self): filename= webqtlUtil.genRandStr("Reg_") fpText = open('%s.txt' % (webqtlConfig.TMPDIR+filename), 'wb') @@ -2624,12 +2624,12 @@ class MarkerRegression(object): '    Significant LRS =%3.2f\n'%self.significant, HT.BR(), '    Highly Significant LRS =%3.2f\n' % self.highlysignificant) - + for lrs_value in self.perm_output: fpText.write(str(lrs_value) + "\n") - + textUrl = HT.Href(text = 'Download Permutation Results', url= '/tmp/'+filename+'.txt', target = "_blank", Class='fs12 fwn') - + return textUrl def geneTable(self, geneCol, refGene=None): @@ -2654,7 +2654,7 @@ class MarkerRegression(object): else: gene_table = "" - return gene_table + return gene_table def getLiteratureCorrelation(cursor,geneId1=None,geneId2=None): if not geneId1 or not geneId2: @@ -2954,4 +2954,4 @@ And by voluntary, according to HFG when I talked to him, they have a choice betw sortby = ("", "") - return sortby \ No newline at end of file + return sortby diff --git a/wqflask/wqflask/search_results.py b/wqflask/wqflask/search_results.py index 52fe2e34..9941a4d3 100755 --- a/wqflask/wqflask/search_results.py +++ b/wqflask/wqflask/search_results.py @@ -26,7 +26,6 @@ from MySQLdb import escape_string as escape # Instead of importing HT we're going to build a class below until we can eliminate it # from htmlgen import HTMLgen2 as HT -from base import webqtlConfig from utility.benchmark import Bench from base.data_set import create_dataset from base.trait import GeneralTrait diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index 35f7fe5f..e80cf191 100755 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -166,7 +166,7 @@ class ShowTrait(object): return False def check_pylmm_rqtl(): - if os.path.isfile(webqtlConfig.GENODIR+self.dataset.group.name+".geno") and (os.path.getsize(webqtlConfig.NEWGENODIR+self.dataset.group.name+".json") > 0): + if os.path.isfile(webqtlConfig.GENODIR+self.dataset.group.name+".geno") and (os.path.getsize(webqtlConfig.JSON_GENODIR+self.dataset.group.name+".json") > 0): return True else: return False -- cgit v1.2.3 From 31a1c126185adb747028d035717ad72728a52b0e Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 24 Feb 2016 11:25:10 +0000 Subject: -a [PATCH 038/100] Fix compile errors --- wqflask/base/data_set.py | 6 +++--- wqflask/utility/tools.py | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) (limited to 'wqflask') diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py index 6527657a..8b2a9f01 100755 --- a/wqflask/base/data_set.py +++ b/wqflask/base/data_set.py @@ -44,7 +44,7 @@ from dbFunction import webqtlDatabaseFunction from utility import webqtlUtil from utility.benchmark import Bench from utility import chunks -from utility.tools import locate, locate_without_error +from utility.tools import locate, locate_ignore_error from maintenance import get_group_samplelists @@ -405,8 +405,8 @@ class DatasetGroup(object): else: print("Cache not hit") - genotype_fn = locate_without_error(self.name+".geno",'genotype') - mapping_fn = locate_without_error(self.name+".fam",'mapping') + genotype_fn = locate_ignore_error(self.name+".geno",'genotype') + mapping_fn = locate_ignore_error(self.name+".fam",'mapping') if mapping_fn: self.samplelist = get_group_samplelists.get_samplelist("plink", mapping_fn) elif genotype_fn: diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index c0f6a49a..67c5128a 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -1,3 +1,4 @@ + # Tools/paths finder resolves external paths from settings and/or environment # variables @@ -83,9 +84,10 @@ def assert_dir(dir): if not valid_path(dir): raise Exception("ERROR: can not find directory "+dir) return dir - + def mk_dir(dir): - os.makedirs(dir) + if not valid_path(dir): + os.makedirs(dir) return assert_dir(dir) def locate(name, subdir=None): -- cgit v1.2.3 From c5dbe982272ef95c6598c36172444b1e8263c01a Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 24 Feb 2016 11:39:05 +0000 Subject: -a [PATCH 039/100] Removing commented code --- wqflask/base/data_set.py | 228 ----------------------------------------------- 1 file changed, 228 deletions(-) (limited to 'wqflask') diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py index 8b2a9f01..52ac95f0 100755 --- a/wqflask/base/data_set.py +++ b/wqflask/base/data_set.py @@ -58,25 +58,13 @@ DS_NAME_MAP = {} def create_dataset(dataset_name, dataset_type = None, get_samplelist = True): if not dataset_type: dataset_type = Dataset_Getter(dataset_name) - #dataset_type = get_dataset_type_from_json(dataset_name) print("dataset_type is:", dataset_type) - #query = """ - # SELECT DBType.Name - # FROM DBList, DBType - # WHERE DBList.Name = '{}' and - # DBType.Id = DBList.DBTypeId - # """.format(escape(dataset_name)) - #dataset_type = g.db.execute(query).fetchone().Name - dataset_ob = DS_NAME_MAP[dataset_type] dataset_class = globals()[dataset_ob] return dataset_class(dataset_name, get_samplelist) - -#def get_dataset_type_from_json(dataset_name): - class Dataset_Types(object): def __init__(self): @@ -90,8 +78,6 @@ class Dataset_Types(object): for group in data['datasets'][species]: for dataset_type in data['datasets'][species][group]: for dataset in data['datasets'][species][group][dataset_type]: - #print("dataset is:", dataset) - short_dataset_name = dataset[1] if dataset_type == "Phenotypes": new_type = "Publish" @@ -107,10 +93,6 @@ class Dataset_Types(object): # Do the intensive work at startup one time only Dataset_Getter = Dataset_Types() -# -#print("Running at startup:", get_dataset_type_from_json("HBTRC-MLPFC_0611")) - - def create_datasets_list(): key = "all_datasets" result = Redis.get(key) @@ -215,13 +197,6 @@ class Markers(object): #del self.markers[i] self.markers = filtered_markers - - #for i, marker in enumerate(self.markers): - # if not 'p_value' in marker: - # #print("self.markers[i]", self.markers[i]) - # del self.markers[i] - # #self.markers.remove(self.markers[i]) - class HumanMarkers(Markers): def __init__(self, name, specified_markers = []): @@ -249,26 +224,8 @@ class HumanMarkers(Markers): def add_pvalues(self, p_values): - #for marker, p_value in itertools.izip(self.markers, p_values): - # if marker['Mb'] <= 0 and marker['chr'] == 0: - # continue - # marker['p_value'] = p_value - # print("p_value is:", marker['p_value']) - # marker['lod_score'] = -math.log10(marker['p_value']) - # #Using -log(p) for the LRS; need to ask Rob how he wants to get LRS from p-values - # marker['lrs_value'] = -math.log10(marker['p_value']) * 4.61 - - #print("p_values2:", pf(p_values)) super(HumanMarkers, self).add_pvalues(p_values) - #with Bench("deleting markers"): - # markers = [] - # for marker in self.markers: - # if not marker['Mb'] <= 0 and not marker['chr'] == 0: - # markers.append(marker) - # self.markers = markers - - class DatasetGroup(object): """ @@ -311,12 +268,6 @@ class DatasetGroup(object): def datasets(self): key = "group_dataset_menu:v2:" + self.name print("key is2:", key) - #with Bench("Loading cache"): - # result = Redis.get(key) - #if result: - # self._datasets = pickle.loads(result) - # return self._datasets - dataset_menu = [] print("[tape4] webqtlConfig.PUBLICTHRESH:", webqtlConfig.PUBLICTHRESH) print("[tape4] type webqtlConfig.PUBLICTHRESH:", type(webqtlConfig.PUBLICTHRESH)) @@ -425,11 +376,6 @@ class DatasetGroup(object): def read_genotype_file(self): '''Read genotype from .geno file instead of database''' - #if self.group == 'BXD300': - # self.group = 'BXD' - # - #assert self.group, "self.group needs to be set" - #genotype_1 is Dataset Object without parents and f1 #genotype_2 is Dataset Object with parents and f1 (not for intercross) @@ -446,40 +392,16 @@ class DatasetGroup(object): #determine default genotype object if self.incparentsf1 and genotype_1.type != "intercross": - #self.genotype = genotype_2 genotype = genotype_2 else: self.incparentsf1 = 0 - #self.genotype = genotype_1 genotype = genotype_1 - #self.samplelist = list(self.genotype.prgy) self.samplelist = list(genotype.prgy) return genotype -#class DataSets(object): -# """Builds a list of DataSets""" -# -# def __init__(self): -# self.datasets = list() -# - - - #query = """SELECT Name FROM ProbeSetFreeze - # UNION - # SELECT Name From PublishFreeze - # UNION - # SELECT Name From GenoFreeze""" - # - #for result in g.db.execute(query).fetchall(): - # dataset = DataSet(result.Name) - # self.datasets.append(dataset) - -#ds = DataSets() -#print("[orange] ds:", ds.datasets) - class DataSet(object): """ DataSet class defines a dataset in webqtl, can be either Microarray, @@ -512,32 +434,11 @@ class DataSet(object): """Gets overridden later, at least for Temp...used by trait's get_given_name""" return None - #@staticmethod - #def get_by_trait_id(trait_id): - # """Gets the dataset object given the trait id""" - # - # - # - # name = g.db.execute(""" SELECT - # - # """) - # - # return DataSet(name) - # Delete this eventually @property def riset(): Weve_Renamed_This_As_Group - - #@property - #def group(self): - # if not self._group: - # self.get_group() - # - # return self._group - - def retrieve_other_names(self): """ If the data set name parameter is not found in the 'Name' field of the data set table, @@ -609,21 +510,6 @@ class DataSet(object): number_chunks = int(math.ceil(len(sample_ids) / chunk_size)) trait_sample_data = [] for sample_ids_step in chunks.divide_into_chunks(sample_ids, number_chunks): - - #XZ, 09/24/2008: build one temporary table that only contains the records associated with the input GeneId - #tempTable = None - #if GeneId and db.type == "ProbeSet": - # if method == "3": - # tempTable = self.getTempLiteratureTable(species=species, - # input_species_geneid=GeneId, - # returnNumber=returnNumber) - # - # if method == "4" or method == "5": - # tempTable = self.getTempTissueCorrTable(primaryTraitSymbol=GeneSymbol, - # TissueProbeSetFreezeId=tissueProbeSetFreezeId, - # method=method, - # returnNumber=returnNumber) - if self.type == "Publish": dataset_type = "Phenotype" else: @@ -1013,83 +899,11 @@ class MrnaAssayDataSet(DataSet): and ProbeSetFreezeId = {} """.format(escape(str(self.id))) results = g.db.execute(query).fetchall() - #print("After get_trait_list query") trait_data = {} for trait in results: - #print("Retrieving sample_data for ", trait[0]) trait_data[trait[0]] = self.retrieve_sample_data(trait[0]) - #print("After retrieve_sample_data") return trait_data - #def get_trait_data(self): - # self.samplelist = self.group.samplelist + self.group.parlist + self.group.f1list - # query = """ - # SELECT Strain.Name, Strain.Id FROM Strain, Species - # WHERE Strain.Name IN {} - # and Strain.SpeciesId=Species.Id - # and Species.name = '{}' - # """.format(create_in_clause(self.samplelist), *mescape(self.group.species)) - # results = dict(g.db.execute(query).fetchall()) - # sample_ids = [results[item] for item in self.samplelist] - # - # # MySQL limits the number of tables that can be used in a join to 61, - # # so we break the sample ids into smaller chunks - # # Postgres doesn't have that limit, so we can get rid of this after we transition - # chunk_size = 50 - # number_chunks = int(math.ceil(len(sample_ids) / chunk_size)) - # trait_sample_data = [] - # for sample_ids_step in chunks.divide_into_chunks(sample_ids, number_chunks): - # - # #XZ, 09/24/2008: build one temporary table that only contains the records associated with the input GeneId - # #tempTable = None - # #if GeneId and db.type == "ProbeSet": - # # if method == "3": - # # tempTable = self.getTempLiteratureTable(species=species, - # # input_species_geneid=GeneId, - # # returnNumber=returnNumber) - # # - # # if method == "4" or method == "5": - # # tempTable = self.getTempTissueCorrTable(primaryTraitSymbol=GeneSymbol, - # # TissueProbeSetFreezeId=tissueProbeSetFreezeId, - # # method=method, - # # returnNumber=returnNumber) - # - # temp = ['T%s.value' % item for item in sample_ids_step] - # query = "SELECT {}.Name,".format(escape(self.type)) - # data_start_pos = 1 - # query += string.join(temp, ', ') - # query += ' FROM ({}, {}XRef, {}Freeze) '.format(*mescape(self.type, - # self.type, - # self.type)) - # - # for item in sample_ids_step: - # query += """ - # left join {}Data as T{} on T{}.Id = {}XRef.DataId - # and T{}.StrainId={}\n - # """.format(*mescape(self.type, item, item, self.type, item, item)) - # - # query += """ - # WHERE {}XRef.{}FreezeId = {}Freeze.Id - # and {}Freeze.Name = '{}' - # and {}.Id = {}XRef.{}Id - # order by {}.Id - # """.format(*mescape(self.type, self.type, self.type, self.type, - # self.name, self.type, self.type, self.type, self.type)) - # results = g.db.execute(query).fetchall() - # trait_sample_data.append(results) - # - # trait_count = len(trait_sample_data[0]) - # self.trait_data = collections.defaultdict(list) - # - # # put all of the separate data together into a dictionary where the keys are - # # trait names and values are lists of sample values - # for trait_counter in range(trait_count): - # trait_name = trait_sample_data[0][trait_counter][0] - # for chunk_counter in range(int(number_chunks)): - # self.trait_data[trait_name] += ( - # trait_sample_data[chunk_counter][trait_counter][data_start_pos:]) - - def get_trait_info(self, trait_list=None, species=''): # Note: setting trait_list to [] is probably not a great idea. @@ -1178,22 +992,9 @@ class MrnaAssayDataSet(DataSet): result = g.db.execute(query).fetchone() if result: - #if result[0] and result[1]: - # lrs_chr = result[0] - # lrs_mb = result[1] lrs_chr, lrs_mb = result #XZ: LRS_location_value is used for sorting lrs_location_value = self.convert_location_to_value(lrs_chr, lrs_mb) - - #try: - # lrs_location_value = int(lrs_chr)*1000 + float(lrs_mb) - #except: - # if lrs_chr.upper() == 'X': - # lrs_location_value = 20*1000 + float(lrs_mb) - # else: - # lrs_location_value = (ord(str(LRS_chr).upper()[0])*1000 + - # float(lrs_mb)) - this_trait.LRS_score_repr = '%3.1f' % this_trait.lrs this_trait.LRS_score_value = this_trait.lrs this_trait.LRS_location_repr = 'Chr%s: %.6f' % (lrs_chr, float(lrs_mb)) @@ -1259,35 +1060,6 @@ class MrnaAssayDataSet(DataSet): return dict(results) - #def retrieve_gene_symbols(self): - # query = """ - # select ProbeSet.Name, ProbeSet.Symbol, ProbeSet.GeneId - # from ProbeSet,ProbeSetXRef - # where ProbeSetXRef.ProbeSetFreezeId = %s and - # ProbeSetXRef.ProbeSetId=ProbeSet.Id; - # """ % (self.id) - # results = g.db.execute(query).fetchall() - # symbol_dict = {} - # for item in results: - # symbol_dict[item[0]] = item[1] - # return symbol_dict - # - #def retrieve_gene_ids(self): - # query = """ - # select ProbeSet.Name, ProbeSet.GeneId - # from ProbeSet,ProbeSetXRef - # where ProbeSetXRef.ProbeSetFreezeId = %s and - # ProbeSetXRef.ProbeSetId=ProbeSet.Id; - # """ % (self.id) - # return process_and_run_query(query) - # results = g.db.execute(query).fetchall() - # symbol_dict = {} - # for item in results: - # symbol_dict[item[0]] = item[1] - # return symbol_dict - - - class TempDataSet(DataSet): '''Temporary user-generated data set''' -- cgit v1.2.3 From 1e9d7476697bf8b60ab1004f25b295f81d94de49 Mon Sep 17 00:00:00 2001 From: pjotrp Date: Wed, 24 Feb 2016 11:49:14 +0000 Subject: When a sample does not exist we should not set sample_data to None. Better to leave it out so it never gets processed again. --- wqflask/wqflask/correlation/show_corr_results.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/correlation/show_corr_results.py b/wqflask/wqflask/correlation/show_corr_results.py index 06b4860e..dd661092 100755 --- a/wqflask/wqflask/correlation/show_corr_results.py +++ b/wqflask/wqflask/correlation/show_corr_results.py @@ -708,14 +708,11 @@ class CorrelationResults(object): for sample in sample_names: if sample not in excluded_samples: - print("Looking for",sample,"in",start_vars) + # print("Looking for",sample,"in",start_vars) value = start_vars.get('value:' + sample) if value: if not value.strip().lower() == 'x': self.sample_data[str(sample)] = float(value) - else: - self.sample_data[str(sample)] = None - ##XZ, 12/16/2008: the input geneid is of mouse type #def checkForLitInfo(self,geneId): -- cgit v1.2.3 From 575e00b1061c58952cba38af5ab078ca0081b4d7 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 24 Feb 2016 16:34:52 +0000 Subject: [PATCH 041/100] Fixes for running tools --- etc/default_settings.py | 6 +++--- wqflask/utility/tools.py | 4 ++-- wqflask/wqflask/marker_regression/marker_regression.py | 3 +-- wqflask/wqflask/marker_regression/marker_regression_gn1.py | 7 ++++--- 4 files changed, 10 insertions(+), 10 deletions(-) (limited to 'wqflask') diff --git a/etc/default_settings.py b/etc/default_settings.py index 6a218f26..60a3a7b4 100644 --- a/etc/default_settings.py +++ b/etc/default_settings.py @@ -24,6 +24,6 @@ SECRET_HMAC_CODE = '\x08\xdf\xfa\x93N\x80\xd9\\H@\\\x9f`\x98d^\xb4a;\xc6OM\x946a # Path overrides for Genenetwork GENENETWORK_FILES = "../../gn2_data" -PYLMM_COMMAND = os.popen("which pylmm_redis").read() -PLINK_COMMAND = os.popen("which plink2").read() -GEMMA_COMMAND = os.popen("which gemma").read() +PYLMM_COMMAND = str.strip(os.popen("which pylmm_redis").read()) +PLINK_COMMAND = str.strip(os.popen("which plink2").read()) +GEMMA_COMMAND = str.strip(os.popen("which gemma").read()) diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index 67c5128a..51189fa3 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -133,7 +133,7 @@ def tempdir(): # Cached values PYLMM_COMMAND = pylmm_command() -GEMMA_COMMAND = pylmm_command() -PLINK_COMMAND = pylmm_command() +GEMMA_COMMAND = gemma_command() +PLINK_COMMAND = plink_command() FLAT_FILES = flat_files() TEMPDIR = tempdir() diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index 265f9473..910d0c3c 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -937,8 +937,7 @@ class MarkerRegression(object): Redis.expire(key, 60*60) print("before printing command") - command = PYLMM_COMMAND + ' --key {} --species {}'.format(key, - "other") + command = PYLMM_COMMAND + ' --key {} --species {}'.format(key, "other") print("command is:", command) print("after printing command") diff --git a/wqflask/wqflask/marker_regression/marker_regression_gn1.py b/wqflask/wqflask/marker_regression/marker_regression_gn1.py index decde579..4edc1891 100644 --- a/wqflask/wqflask/marker_regression/marker_regression_gn1.py +++ b/wqflask/wqflask/marker_regression/marker_regression_gn1.py @@ -28,6 +28,7 @@ import time import string from math import * import piddle as pid +import piddlePIL as pil import sys,os import cPickle import httplib, urllib @@ -551,7 +552,7 @@ class MarkerRegression(object): # showLocusForm = webqtlUtil.genRandStr("fm_") #else: showLocusForm = "" - intCanvas = pid.PILCanvas(size=(self.graphWidth, self.graphHeight)) + intCanvas = pil.PILCanvas(size=(self.graphWidth, self.graphHeight)) gifmap = self.plotIntMapping(intCanvas, startMb = self.startMb, endMb = self.endMb, showLocusForm= showLocusForm) self.gifmap = gifmap.__str__() @@ -563,7 +564,7 @@ class MarkerRegression(object): #Scales plot differently for high resolution if self.draw2X: - intCanvasX2 = pid.PILCanvas(size=(self.graphWidth*2,self.graphHeight*2)) + intCanvasX2 = pil.PILCanvas(size=(self.graphWidth*2,self.graphHeight*2)) gifmapX2 = self.plotIntMapping(intCanvasX2, startMb = self.startMb, endMb = self.endMb, showLocusForm= showLocusForm, zoom=2) intCanvasX2.save(os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, self.filename+"X2"), format='png') #DLintImgX2=HT.Href(text='Download',url = '/image/'+self.filename+'X2.png', Class='smallsize', target='_blank') @@ -2582,7 +2583,7 @@ class MarkerRegression(object): ######################################### # Permutation Graph ######################################### - myCanvas = pid.PILCanvas(size=(400,300)) + myCanvas = pil.PILCanvas(size=(400,300)) if 'lod_score' in self.qtlresults[0] and self.LRS_LOD == "LRS": perm_output = [value*4.16 for value in self.perm_output] elif 'lod_score' not in self.qtlresults[0] and self.LRS_LOD == "LOD": -- cgit v1.2.3 From 9395e9f3cc2d06e069c5de797b2d6e8e59cfba7c Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 24 Feb 2016 17:00:04 +0000 Subject: [PATCH 042/100] Sanitizing locations --- wqflask/utility/tools.py | 5 ++--- wqflask/wqflask/marker_regression/marker_regression.py | 13 ++++++------- 2 files changed, 8 insertions(+), 10 deletions(-) (limited to 'wqflask') diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index 51189fa3..b8eff12a 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -1,4 +1,3 @@ - # Tools/paths finder resolves external paths from settings and/or environment # variables @@ -105,9 +104,9 @@ def locate(name, subdir=None): print("Found: file "+lookfor+"\n") return lookfor else: - raise IOError("Can not locate "+lookfor) + raise Exception("Can not locate "+lookfor) if subdir: sys.stderr.write(subdir) - raise IOError("Can not locate "+name+" in "+base) + raise Exception("Can not locate "+name+" in "+base) def locate_ignore_error(name, subdir=None): """ diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index 910d0c3c..e9cfb06d 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -41,7 +41,8 @@ from wqflask.marker_regression import gemma_mapping #from wqflask.marker_regression import plink_mapping #from wqflask.marker_regression import rqtl_mapping -from utility.tools import locate, PYLMM_COMMAND, GEMMA_COMMAND, PLINK_COMMAND +from utility.tools import locate, locate_ignore_error, PYLMM_COMMAND, GEMMA_COMMAND, PLINK_COMMAND +from utility.external import shell class MarkerRegression(object): @@ -413,8 +414,8 @@ class MarkerRegression(object): write_cross = ro.r["write.cross"] # Map the write.cross function GENOtoCSVR = ro.r["GENOtoCSVR"] # Map the GENOtoCSVR function - genofilelocation = webqtlConfig.HTMLPATH + "genotypes/" + self.dataset.group.name + ".geno" - crossfilelocation = webqtlConfig.HTMLPATH + "genotypes/" + self.dataset.group.name + ".cross" + genofilelocation = locate(self.dataset.group.name + ".geno", "genotype") + crossfilelocation = locate(self.dataset.group.name + ".cross", "genotype") #print("Conversion of geno to cross at location:", genofilelocation, " to ", crossfilelocation) @@ -860,9 +861,7 @@ class MarkerRegression(object): Redis.expire(key, 60*60) command = PYLMM_COMMAND+' --key {} --species {}'.format(key,"other") - - os.system(command) - + shell(command) json_results = Redis.blpop("pylmm:results:" + temp_uuid, 45*60) results = json.loads(json_results[1]) @@ -941,7 +940,7 @@ class MarkerRegression(object): print("command is:", command) print("after printing command") - os.system(command) + shell(command) #t_stats, p_values = lmm.run(key) #lmm.run(key) -- cgit v1.2.3 From e42b21c66b09128ac6a9c18ca018287516d8c309 Mon Sep 17 00:00:00 2001 From: pjotrp Date: Wed, 24 Feb 2016 17:41:55 +0000 Subject: Minor fixes --- wqflask/utility/external.py | 9 +++++++++ wqflask/wqflask/marker_regression/marker_regression_gn1.py | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 wqflask/utility/external.py (limited to 'wqflask') diff --git a/wqflask/utility/external.py b/wqflask/utility/external.py new file mode 100644 index 00000000..bd8cf584 --- /dev/null +++ b/wqflask/utility/external.py @@ -0,0 +1,9 @@ +# Call external program + +import os +import sys +import subprocess + +def shell(command): + if not subprocess.call(command, shell=True): + raise Exception("ERROR: failed on "+command) diff --git a/wqflask/wqflask/marker_regression/marker_regression_gn1.py b/wqflask/wqflask/marker_regression/marker_regression_gn1.py index 4edc1891..a68c9586 100644 --- a/wqflask/wqflask/marker_regression/marker_regression_gn1.py +++ b/wqflask/wqflask/marker_regression/marker_regression_gn1.py @@ -29,6 +29,7 @@ import string from math import * import piddle as pid import piddlePIL as pil +from piddle import Font import sys,os import cPickle import httplib, urllib @@ -941,7 +942,7 @@ class MarkerRegression(object): bootScale = bootScale[:-1] + [highestPercent] bootOffset = 50*fontZoom - bootScaleFont=pid.Font(ttf="verdana",size=13*fontZoom,bold=0) + bootScaleFont=Font(ttf="verdana",size=13*fontZoom,bold=0) canvas.drawRect(canvas.size[0]-bootOffset,yZero-bootHeightThresh,canvas.size[0]-bootOffset-15*zoom,yZero,fillColor = pid.yellow) canvas.drawLine(canvas.size[0]-bootOffset+4, yZero, canvas.size[0]-bootOffset, yZero, color=pid.black) canvas.drawString('0%' ,canvas.size[0]-bootOffset+10,yZero+5,font=bootScaleFont,color=pid.black) @@ -2259,7 +2260,7 @@ class MarkerRegression(object): chrFontZoom = 2 else: chrFontZoom = 1 - chrLabelFont=pid.Font(ttf="verdana",size=24*chrFontZoom,bold=0) + chrLabelFont=Font(ttf="verdana",size=24*chrFontZoom,bold=0) for i, _chr in enumerate(self.genotype): if (i % 2 == 0): -- cgit v1.2.3 From a4686a6e2fc96e3fc59d99823a25662fec793d2b Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Thu, 25 Feb 2016 08:59:57 +0000 Subject: [PATCH 045/100] Reverted on previous changes. With a corrected python2-piddle module the thing works. Turns out that the version we are using is not the same as the public one. Despite the same version number. --- wqflask/wqflask/marker_regression/marker_regression_gn1.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/marker_regression/marker_regression_gn1.py b/wqflask/wqflask/marker_regression/marker_regression_gn1.py index a68c9586..8a593ec4 100644 --- a/wqflask/wqflask/marker_regression/marker_regression_gn1.py +++ b/wqflask/wqflask/marker_regression/marker_regression_gn1.py @@ -28,8 +28,8 @@ import time import string from math import * import piddle as pid -import piddlePIL as pil -from piddle import Font +# import piddlePIL as pil +# from piddle import Font import sys,os import cPickle import httplib, urllib @@ -553,7 +553,7 @@ class MarkerRegression(object): # showLocusForm = webqtlUtil.genRandStr("fm_") #else: showLocusForm = "" - intCanvas = pil.PILCanvas(size=(self.graphWidth, self.graphHeight)) + intCanvas = pid.PILCanvas(size=(self.graphWidth, self.graphHeight)) gifmap = self.plotIntMapping(intCanvas, startMb = self.startMb, endMb = self.endMb, showLocusForm= showLocusForm) self.gifmap = gifmap.__str__() @@ -565,7 +565,7 @@ class MarkerRegression(object): #Scales plot differently for high resolution if self.draw2X: - intCanvasX2 = pil.PILCanvas(size=(self.graphWidth*2,self.graphHeight*2)) + intCanvasX2 = pid.PILCanvas(size=(self.graphWidth*2,self.graphHeight*2)) gifmapX2 = self.plotIntMapping(intCanvasX2, startMb = self.startMb, endMb = self.endMb, showLocusForm= showLocusForm, zoom=2) intCanvasX2.save(os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, self.filename+"X2"), format='png') #DLintImgX2=HT.Href(text='Download',url = '/image/'+self.filename+'X2.png', Class='smallsize', target='_blank') @@ -2260,7 +2260,7 @@ class MarkerRegression(object): chrFontZoom = 2 else: chrFontZoom = 1 - chrLabelFont=Font(ttf="verdana",size=24*chrFontZoom,bold=0) + chrLabelFont=pid.Font(ttf="verdana",size=24*chrFontZoom,bold=0) for i, _chr in enumerate(self.genotype): if (i % 2 == 0): @@ -2584,7 +2584,7 @@ class MarkerRegression(object): ######################################### # Permutation Graph ######################################### - myCanvas = pil.PILCanvas(size=(400,300)) + myCanvas = pid.PILCanvas(size=(400,300)) if 'lod_score' in self.qtlresults[0] and self.LRS_LOD == "LRS": perm_output = [value*4.16 for value in self.perm_output] elif 'lod_score' not in self.qtlresults[0] and self.LRS_LOD == "LOD": -- cgit v1.2.3 From 2e039da988b585fde5a09e94d7fd7b56262752f2 Mon Sep 17 00:00:00 2001 From: pjotrp Date: Thu, 25 Feb 2016 11:22:02 +0000 Subject: external program should fail on return value not zero --- wqflask/utility/external.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/utility/external.py b/wqflask/utility/external.py index bd8cf584..50afea08 100644 --- a/wqflask/utility/external.py +++ b/wqflask/utility/external.py @@ -5,5 +5,5 @@ import sys import subprocess def shell(command): - if not subprocess.call(command, shell=True): + if subprocess.call(command, shell=True) != 0: raise Exception("ERROR: failed on "+command) -- cgit v1.2.3 From ec6c3158a48a7d81596c848cb8b7f3a487bcc28a Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Thu, 25 Feb 2016 12:43:49 +0000 Subject: [PATCH 047/100] This commit moves the image generation dir *outside* the git repository. --- wqflask/wqflask/marker_regression/marker_regression_gn1.py | 12 ------------ wqflask/wqflask/templates/marker_regression_gn1.html | 2 +- wqflask/wqflask/views.py | 7 ++++++- 3 files changed, 7 insertions(+), 14 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/marker_regression/marker_regression_gn1.py b/wqflask/wqflask/marker_regression/marker_regression_gn1.py index 8a593ec4..245e3f04 100644 --- a/wqflask/wqflask/marker_regression/marker_regression_gn1.py +++ b/wqflask/wqflask/marker_regression/marker_regression_gn1.py @@ -28,8 +28,6 @@ import time import string from math import * import piddle as pid -# import piddlePIL as pil -# from piddle import Font import sys,os import cPickle import httplib, urllib @@ -40,21 +38,11 @@ from htmlgen import HTMLgen2 as HT from base import webqtlConfig from base.GeneralObject import GeneralObject -#from base.webqtlTrait import webqtlTrait -#from base.templatePage import templatePage from utility import webqtlUtil from utility import helper_functions from utility import Plot -#from utility.THCell import THCell -#from utility.TDCell import TDCell from wqflask.interval_analyst import GeneUtil -#from dbFunction import webqtlDatabaseFunction - -#import logging -#logging.basicConfig(filename="/tmp/gn_leiyan.log", level=logging.INFO) -#_log = logging.getLogger("gn\web\webqtl\intervalMapping\IntervalMappingPage.py") - ######################################### # Inteval Mapping Plot Page ######################################### diff --git a/wqflask/wqflask/templates/marker_regression_gn1.html b/wqflask/wqflask/templates/marker_regression_gn1.html index f3f33fad..311429f8 100644 --- a/wqflask/wqflask/templates/marker_regression_gn1.html +++ b/wqflask/wqflask/templates/marker_regression_gn1.html @@ -143,7 +143,7 @@
{{ gifmap|safe }} - + {% if additiveChecked|upper == "ON" %}
A positive additive coefficient (green line) indicates that {{ dataset.group.parlist[1] }} alleles increase trait values. In contrast, a negative additive coefficient (orange line) indicates that {{ dataset.group.parlist[0] }} alleles increase trait values. diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 929da649..b35bbbf9 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -30,7 +30,7 @@ import sqlalchemy from wqflask import app from flask import (render_template, request, make_response, Response, - Flask, g, config, jsonify, redirect, url_for) + Flask, g, config, jsonify, redirect, url_for, send_from_directory) from wqflask import search_results from wqflask import gsearch @@ -53,6 +53,7 @@ from utility import temp_data from utility.tools import TEMPDIR from base import webqtlFormData +from base.webqtlConfig import GENERATED_IMAGE_DIR from utility.benchmark import Bench from pprint import pformat as pf @@ -173,6 +174,10 @@ def docedit(): doc = docs.Docs(request.args['entry']) return render_template("docedit.html", **doc.__dict__) +@app.route('/generated/') +def generated_file(filename): + return send_from_directory(GENERATED_IMAGE_DIR,filename) + @app.route("/help") def help(): doc = docs.Docs("help") -- cgit v1.2.3 From 84fef98c7929d3d42e1a7efa33bff74cbbb468c7 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Thu, 25 Feb 2016 12:57:53 +0000 Subject: [PATCH 049/100] SNP_PATH: removal --- wqflask/wqflask/marker_regression/marker_regression.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index e9cfb06d..1b32b05b 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -1069,7 +1069,11 @@ class MarkerRegression(object): return trimmed_genotype_data def create_snp_iterator_file(group): - plink_file_base = os.path.join(webqtlConfig.PYLMM_PATH, group) + """ + This function is only called by main below + """ + raise Exception("Paths are undefined here") + plink_file_base = os.path.join(webqtlConfig.TMPDIR, group) plink_input = input.plink(plink_file_base, type='b') data = dict(plink_input = list(plink_input), @@ -1128,7 +1132,5 @@ def get_markers_from_csv(included_markers, p_values, group_name): return markers -if __name__ == '__main__': - import cPickle as pickle - import gzip - create_snp_iterator_file("HLC") + if __name__ == '__main__': + import cPickle as pickle -- cgit v1.2.3 From 0ce72520d5b8f6ef38cfb43637b39ce209d5c7f7 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Thu, 25 Feb 2016 13:19:40 +0000 Subject: [PATCH 050/100] Using out-of-tree storage. Added comments for plink, gemma. --- wqflask/wqflask/marker_regression/gemma_mapping.py | 7 ++-- .../wqflask/marker_regression/marker_regression.py | 39 +++------------------- wqflask/wqflask/views.py | 2 +- 3 files changed, 10 insertions(+), 38 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/marker_regression/gemma_mapping.py b/wqflask/wqflask/marker_regression/gemma_mapping.py index cfcd4783..ae426621 100644 --- a/wqflask/wqflask/marker_regression/gemma_mapping.py +++ b/wqflask/wqflask/marker_regression/gemma_mapping.py @@ -12,8 +12,11 @@ def run_gemma(this_dataset, samples, vals): gen_pheno_txt_file(this_dataset, samples, vals) - os.chdir(GEMMA_PATH) + # Don't do this! + # os.chdir("{}gemma".format(webqtlConfig.HTMLPATH)) + # use GEMMA_RUN in the next one, create a unique temp file + gemma_command = GEMMA_COMMAND + ' -bfile %s/%s -k %s/output/%s.cXX.txt -lmm 1 -o %s_output' % (GEMMA_PATH, this_dataset.group.name, GEMMA_PATH, @@ -46,4 +49,4 @@ def parse_gemma_output(this_dataset): p_values.append(float(line.split("\t")[10])) #print("p_values: ", p_values) - return included_markers, p_values \ No newline at end of file + return included_markers, p_values diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index 1b32b05b..d1c0d9bc 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -30,16 +30,12 @@ from flask import Flask, g from base.trait import GeneralTrait from base import data_set from base import species -# from base import webqtlConfig from utility import webqtlUtil from utility import helper_functions from utility import Plot, Bunch from utility import temp_data from utility.benchmark import Bench from wqflask.marker_regression import gemma_mapping -#from wqflask.marker_regression import qtl_reaper_mapping -#from wqflask.marker_regression import plink_mapping -#from wqflask.marker_regression import rqtl_mapping from utility.tools import locate, locate_ignore_error, PYLMM_COMMAND, GEMMA_COMMAND, PLINK_COMMAND from utility.external import shell @@ -297,22 +293,14 @@ class MarkerRegression(object): 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: - # print("marker:", marker) - # self.dataset.group.markers.markers.remove(marker) - # #del self.dataset.group.markers.markers[marker] - self.dataset.group.markers.add_pvalues(p_values) - return self.dataset.group.markers.markers - def parse_gemma_output(self): included_markers = [] p_values = [] - with open("/home/zas1024/gene/web/gemma/output/{}_output.assoc.txt".format(self.dataset.group.name)) as output_file: + # Use a temporary file name here! + with open(webqtlConfig.GENERATED_TEXT_DIR+"/{}_output.assoc.txt".format(self.dataset.group.name)) as output_file: for line in output_file: if line.startswith("chr"): continue @@ -325,31 +313,12 @@ class MarkerRegression(object): def gen_pheno_txt_file(self): """Generates phenotype file for GEMMA""" - - #with open("/home/zas1024/gene/web/gemma/tmp_pheno/{}.txt".format(filename), "w") as outfile: - # for sample, i in enumerate(self.samples): - # print("sample:" + str(i)) - # print("self.vals[i]:" + str(self.vals[sample])) - # outfile.write(str(i) + "\t" + str(self.vals[sample]) + "\n") - - with open("/home/zas1024/gene/web/gemma/{}.fam".format(self.dataset.group.name), "w") as outfile: + with open(webqtlConfig.GENERATED_TEXT_DIR+"{}.fam".format(self.dataset.group.name), "w") as outfile: for i, sample in enumerate(self.samples): outfile.write(str(sample) + " " + str(sample) + " 0 0 0 " + str(self.vals[i]) + "\n") - - #def gen_plink_for_gemma(self, filename): - # - # make_bed = "/home/zas1024/plink/plink --file /home/zas1024/plink/%s --noweb --no-fid --no-parents --no-sex --no-pheno --pheno %s%s.txt --out %s%s --make-bed" % (webqtlConfig.HTMLPATH, - # webqtlConfig.HTMLPATH, - # self.dataset.group.name, - # webqtlConfig.TMPDIR, - # filename, - # webqtlConfig.TMPDIR, - # filename) - # - # def run_rqtl_plink(self): - os.chdir("/home/zas1024/plink") + # os.chdir("/home/zas1024/plink") never do this!! output_filename = webqtlUtil.genRandStr("%s_%s_"%(self.dataset.group.name, self.this_trait.name)) diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index b35bbbf9..4979d45d 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -458,7 +458,7 @@ def export_pdf(): svg_xml = request.form.get("data", "Invalid data") print("svg_xml:", svg_xml) filename = request.form.get("filename", "interval_map_pdf") - filepath = "/home/zas1024/gene/wqflask/output/"+filename + filepath = GENERATED_IMAGE_DIR+filename pdf_file = cairosvg.svg2pdf(bytestring=svg_xml) response = Response(pdf_file, mimetype="application/pdf") response.headers["Content-Disposition"] = "attachment; filename=%s"%filename -- cgit v1.2.3 From 33bc6a57394f9fd3242a33e7cb29f01baa0692b1 Mon Sep 17 00:00:00 2001 From: pjotrp Date: Thu, 25 Feb 2016 13:32:58 +0000 Subject: More hard-coded --- wqflask/maintenance/gen_select_dataset.py | 3 +-- wqflask/wqflask/heatmap/heatmap.py | 5 +++-- wqflask/wqflask/marker_regression/marker_regression.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'wqflask') diff --git a/wqflask/maintenance/gen_select_dataset.py b/wqflask/maintenance/gen_select_dataset.py index e080050e..489d291f 100755 --- a/wqflask/maintenance/gen_select_dataset.py +++ b/wqflask/maintenance/gen_select_dataset.py @@ -36,8 +36,7 @@ from __future__ import print_function, division #print("cdict is:", cdict) import sys -sys.path.append("/home/zas1024/") -import zach_settings +import zach_settings # no hard code paths! import MySQLdb diff --git a/wqflask/wqflask/heatmap/heatmap.py b/wqflask/wqflask/heatmap/heatmap.py index 61847bc3..2445b37f 100644 --- a/wqflask/wqflask/heatmap/heatmap.py +++ b/wqflask/wqflask/heatmap/heatmap.py @@ -31,6 +31,7 @@ from base import species from utility import helper_functions from utility import Plot, Bunch from utility import temp_data +from utility.tools import PYLMM_COMMAND from MySQLdb import escape_string as escape @@ -212,7 +213,7 @@ class Heatmap(object): #Redis.expire(key, 60*60) #print("before printing command") # - #command = 'python /home/zas1024/gene/wqflask/wqflask/my_pylmm/pyLMM/lmm.py --key {} --species {}'.format(key, + #command = 'python lmm.py --key {} --species {}'.format(key, # "other") #print("command is:", command) #print("after printing command") @@ -271,7 +272,7 @@ class Heatmap(object): Redis.expire(key, 60*60) print("before printing command") - command = 'python /home/zas1024/gene/wqflask/wqflask/my_pylmm/pyLMM/lmm.py --key {} --species {}'.format(key, + command = PYLMM_COMMAND+' --key {} --species {}'.format(key, "other") print("command is:", command) print("after printing command") diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index d1c0d9bc..abd1ce85 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -318,7 +318,7 @@ class MarkerRegression(object): outfile.write(str(sample) + " " + str(sample) + " 0 0 0 " + str(self.vals[i]) + "\n") def run_rqtl_plink(self): - # os.chdir("/home/zas1024/plink") never do this!! + # os.chdir("") never do this inside a webserver!! output_filename = webqtlUtil.genRandStr("%s_%s_"%(self.dataset.group.name, self.this_trait.name)) -- cgit v1.2.3 From d00ed869d6df48180c56bbf9bc9f39afa7f5d3fa Mon Sep 17 00:00:00 2001 From: pjotrp Date: Mon, 29 Feb 2016 10:53:02 +0000 Subject: r-wgcna: Fix paths --- wqflask/wqflask/views.py | 2 +- wqflask/wqflask/wgcna/wgcna_analysis.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 4979d45d..7f331492 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -98,7 +98,7 @@ def tmp_page(img_path): print("img_path:", img_path) initial_start_vars = request.form print("initial_start_vars:", initial_start_vars) - imgfile = open(webqtlConfig.TMPDIR + img_path, 'rb') + imgfile = open(GENERATED_IMAGE_DIR + img_path, 'rb') imgdata = imgfile.read() imgB64 = imgdata.encode("base64") bytesarray = array.array('B', imgB64) diff --git a/wqflask/wqflask/wgcna/wgcna_analysis.py b/wqflask/wqflask/wgcna/wgcna_analysis.py index 9e9f41bc..6901712b 100644 --- a/wqflask/wqflask/wgcna/wgcna_analysis.py +++ b/wqflask/wqflask/wgcna/wgcna_analysis.py @@ -6,7 +6,7 @@ import scipy as sp # SciPy import rpy2.robjects as ro # R Objects import rpy2.rinterface as ri -from base import webqtlConfig # For paths and stuff +from base.webqtlConfig import GENERATED_IMAGE_DIR from utility import webqtlUtil # Random number for the image import base64 @@ -127,7 +127,7 @@ class WGCNA(object): # The iconic WCGNA plot of the modules in the hanging tree self.results['imgurl'] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" - self.results['imgloc'] = webqtlConfig.TMPDIR + self.results['imgurl'] + self.results['imgloc'] = GENERATED_IMAGE_DIR + self.results['imgurl'] r_png(self.results['imgloc'], width=1000, height=600) mergedColors = self.r_labels2colors(network[1]) self.r_plotDendroAndColors(network[5][0], mergedColors, "Module colors", dendroLabels = False, hang = 0.03, addGuide = True, guideHang = 0.05) -- cgit v1.2.3 From 9f3ac3290ab7c00705c88fb648ee981ebe50c45a Mon Sep 17 00:00:00 2001 From: pjotrp Date: Mon, 29 Feb 2016 11:00:44 +0000 Subject: Removed symlinks --- wqflask/wqflask/static/css | 1 - wqflask/wqflask/static/images | 1 - wqflask/wqflask/static/javascript | 1 - 3 files changed, 3 deletions(-) delete mode 120000 wqflask/wqflask/static/css delete mode 120000 wqflask/wqflask/static/images delete mode 120000 wqflask/wqflask/static/javascript (limited to 'wqflask') diff --git a/wqflask/wqflask/static/css b/wqflask/wqflask/static/css deleted file mode 120000 index 9d8c2f68..00000000 --- a/wqflask/wqflask/static/css +++ /dev/null @@ -1 +0,0 @@ -../../../web/css \ No newline at end of file diff --git a/wqflask/wqflask/static/images b/wqflask/wqflask/static/images deleted file mode 120000 index 12f0f8b5..00000000 --- a/wqflask/wqflask/static/images +++ /dev/null @@ -1 +0,0 @@ -../../../web/images \ No newline at end of file diff --git a/wqflask/wqflask/static/javascript b/wqflask/wqflask/static/javascript deleted file mode 120000 index 5f58faf4..00000000 --- a/wqflask/wqflask/static/javascript +++ /dev/null @@ -1 +0,0 @@ -../../../web/javascript \ No newline at end of file -- cgit v1.2.3 From 6cf118eb55453d0ca041cf139bae4839ceb0286a Mon Sep 17 00:00:00 2001 From: pjotrp Date: Mon, 29 Feb 2016 11:01:11 +0000 Subject: Remove dbdoc --- wqflask/wqflask/static/dbdoc/TODO.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 wqflask/wqflask/static/dbdoc/TODO.md (limited to 'wqflask') diff --git a/wqflask/wqflask/static/dbdoc/TODO.md b/wqflask/wqflask/static/dbdoc/TODO.md deleted file mode 100644 index c0a8bab7..00000000 --- a/wqflask/wqflask/static/dbdoc/TODO.md +++ /dev/null @@ -1 +0,0 @@ -TODO: Add all database documentation into this folder -- cgit v1.2.3 From a66858e99c2195d90a187899db6f4dd8966a0a2c Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Thu, 3 Mar 2016 11:21:01 +0000 Subject: Show error when GENODIR is missing --- bin/genenetwork2 | 13 +++++++------ etc/default_settings.py | 2 +- wqflask/utility/tools.py | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) (limited to 'wqflask') diff --git a/bin/genenetwork2 b/bin/genenetwork2 index a0a013fc..bbb2a19f 100755 --- a/bin/genenetwork2 +++ b/bin/genenetwork2 @@ -9,18 +9,19 @@ SCRIPT=$(readlink -f "$0") # Absolute path this script is in, thus /home/user/bin GN2_BASE_PATH=$(dirname $(dirname "$SCRIPT")) + +GN2_GUIX_PATH=$GN2_BASE_PATH/lib/python2.7/site-packages/genenetwork2-2.0-py2.7.egg +if [ -d $GN2_GUIX_PATH ]; then + GN2_BASE_PATH=$GN2_GUIX_PATH +fi echo $GN2_BASE_PATH # Handle settings parameter settings=$1 if [ -z $settings ]; then settings=$GN2_BASE_PATH/etc/default_settings.py ; fi if [ ! -e $settings ]; then - GN2_BASE_PATH=$GN2_BASE_PATH/lib/python2.7/site-packages/genenetwork2-2.0-py2.7.egg - settings=$GN2_BASE_PATH/etc/default_settings.py - if [ ! -e $settings ]; then - echo "ERROR: can not locate settings file - pass it in the command line" - exit 1 - fi + echo "ERROR: can not locate settings file - pass it in the command line" + exit 1 fi export WQFLASK_SETTINGS=$settings diff --git a/etc/default_settings.py b/etc/default_settings.py index 60a3a7b4..0cf40265 100644 --- a/etc/default_settings.py +++ b/etc/default_settings.py @@ -23,7 +23,7 @@ SERVER_PORT = 5003 SECRET_HMAC_CODE = '\x08\xdf\xfa\x93N\x80\xd9\\H@\\\x9f`\x98d^\xb4a;\xc6OM\x946a\xbc\xfc\x80:*\xebc' # Path overrides for Genenetwork -GENENETWORK_FILES = "../../gn2_data" +GENENETWORK_FILES = os.environ['HOME']+"/gn2_data" PYLMM_COMMAND = str.strip(os.popen("which pylmm_redis").read()) PLINK_COMMAND = str.strip(os.popen("which plink2").read()) GEMMA_COMMAND = str.strip(os.popen("which gemma").read()) diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index b8eff12a..9405a9c6 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -76,8 +76,8 @@ def plink_command(guess=None): def flat_files(subdir=None): base = get_setting("GENENETWORK_FILES") if subdir: - return valid_path(base+"/"+subdir) - return valid_path(base) + return assert_dir(base+"/"+subdir) + return assert_dir(base) def assert_dir(dir): if not valid_path(dir): -- cgit v1.2.3 From b5765fb91adf6845913dd60e993d47c3f691f90a Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 4 Mar 2016 10:06:24 +0000 Subject: [PATCH 061/100] Put R/qtl .cross file in TMPDIR --- .../wqflask/marker_regression/marker_regression.py | 24 ++++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index abd1ce85..39d7c78a 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -39,6 +39,7 @@ from wqflask.marker_regression import gemma_mapping from utility.tools import locate, locate_ignore_error, PYLMM_COMMAND, GEMMA_COMMAND, PLINK_COMMAND from utility.external import shell +from base.webqtlConfig import TMPDIR, GENERATED_TEXT_DIR class MarkerRegression(object): @@ -324,7 +325,7 @@ class MarkerRegression(object): self.gen_pheno_txt_file_plink(pheno_filename = output_filename) - rqtl_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) + rqtl_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, TMPDIR, plink_output_filename, self.this_trait.name, self.maf, TMPDIR, plink_output_filename) os.system(rqtl_command) @@ -381,10 +382,11 @@ class MarkerRegression(object): calc_genoprob = ro.r["calc.genoprob"] # Map the calc.genoprob function read_cross = ro.r["read.cross"] # Map the read.cross function write_cross = ro.r["write.cross"] # Map the write.cross function - GENOtoCSVR = ro.r["GENOtoCSVR"] # Map the GENOtoCSVR function + GENOtoCSVR = ro.r["GENOtoCSVR"] # Map the local GENOtoCSVR function - genofilelocation = locate(self.dataset.group.name + ".geno", "genotype") - crossfilelocation = locate(self.dataset.group.name + ".cross", "genotype") + crossname = self.dataset.group.name + genofilelocation = locate(crossname + ".geno", "genotype") + crossfilelocation = TMPDIR + crossname + ".cross" #print("Conversion of geno to cross at location:", genofilelocation, " to ", crossfilelocation) @@ -411,7 +413,7 @@ class MarkerRegression(object): #print("Pair scan results:", result_data_frame) self.pair_scan_filename = webqtlUtil.genRandStr("scantwo_") + ".png" - png(file=webqtlConfig.TMPDIR+self.pair_scan_filename) + png(file=TMPDIR+self.pair_scan_filename) plot(result_data_frame) dev_off() @@ -521,8 +523,8 @@ class MarkerRegression(object): self.gen_pheno_txt_file_plink(pheno_filename = plink_output_filename) - plink_command = PLINK_COMMAND + ' --noweb --bed %s/%s.bed --bim %s/%s.bim --fam %s/%s.fam --no-fid --no-parents --no-sex --no-pheno --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, 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) + 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, TMPDIR, plink_output_filename, self.this_trait.name, self.maf, TMPDIR, plink_output_filename) + print("plink_command:", plink_command) os.system(plink_command) @@ -543,7 +545,7 @@ class MarkerRegression(object): def gen_pheno_txt_file_plink(self, pheno_filename = ''): ped_sample_list = self.get_samples_from_ped_file() - output_file = open("%s%s.txt" % (webqtlConfig.TMPDIR, pheno_filename), "wb") + output_file = open("%s%s.txt" % (TMPDIR, pheno_filename), "wb") header = 'FID\tIID\t%s\n' % self.this_trait.name output_file.write(header) @@ -578,7 +580,7 @@ class MarkerRegression(object): def gen_pheno_txt_file_rqtl(self, pheno_filename = ''): ped_sample_list = self.get_samples_from_ped_file() - output_file = open("%s%s.txt" % (webqtlConfig.TMPDIR, pheno_filename), "wb") + output_file = open("%s%s.txt" % (TMPDIR, pheno_filename), "wb") header = 'FID\tIID\t%s\n' % self.this_trait.name output_file.write(header) @@ -720,7 +722,7 @@ class MarkerRegression(object): threshold_p_value = 0.01 - result_fp = open("%s%s.qassoc"% (webqtlConfig.TMPDIR, output_filename), "rb") + result_fp = open("%s%s.qassoc"% (TMPDIR, output_filename), "rb") header_line = result_fp.readline()# read header line line = result_fp.readline() @@ -1042,7 +1044,7 @@ def create_snp_iterator_file(group): This function is only called by main below """ raise Exception("Paths are undefined here") - plink_file_base = os.path.join(webqtlConfig.TMPDIR, group) + plink_file_base = os.path.join(TMPDIR, group) plink_input = input.plink(plink_file_base, type='b') data = dict(plink_input = list(plink_input), -- cgit v1.2.3 From 58b1955cd4236acfed35d0adc5d3a620fdb0fa4b Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 22 Mar 2016 16:04:58 +0100 Subject: Cleaning up the WGCNA parameter input template --- wqflask/wqflask/templates/wgcna_setup.html | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/templates/wgcna_setup.html b/wqflask/wqflask/templates/wgcna_setup.html index 8ab8c4a0..0e46f59d 100644 --- a/wqflask/wqflask/templates/wgcna_setup.html +++ b/wqflask/wqflask/templates/wgcna_setup.html @@ -10,43 +10,43 @@ Error:

- Too few phenotypes as input + Too few phenotypes selected to run a WGCNA analysis, please select more.

Please make sure you select enough phenotypes / genes to perform WGCNA, your collection needs to contain at least 4 different phenotypes. You provided {{request.form['trait_list'].split(',')|length}} phenotypes as input
{% else %}
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
- +
+ {% endif %}
{% endblock %} -- cgit v1.2.3 From 980bc6c5f49814147b03c9385f89a677c19d3aef Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 22 Mar 2016 16:32:18 +0100 Subject: [PATCH 078/100] Adding empty templates for CTL in GN2 --- wqflask/wqflask/templates/wgcna_setup.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/templates/wgcna_setup.html b/wqflask/wqflask/templates/wgcna_setup.html index 0e46f59d..b4a5730d 100644 --- a/wqflask/wqflask/templates/wgcna_setup.html +++ b/wqflask/wqflask/templates/wgcna_setup.html @@ -10,7 +10,7 @@ Error:

- Too few phenotypes selected to run a WGCNA analysis, please select more. + Too few phenotypes as input

Please make sure you select enough phenotypes / genes to perform WGCNA, your collection needs to contain at least 4 different phenotypes. You provided {{request.form['trait_list'].split(',')|length}} phenotypes as input
-- cgit v1.2.3 From 5847ac9fba55f6c75ca3f8ee12047e10efbf8341 Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 22 Mar 2016 16:34:32 +0100 Subject: Adding initial file to perform CTL analysis --- wqflask/wqflask/ctl/__init__.py | 0 wqflask/wqflask/ctl/ctl_analysis.py | 87 +++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100755 wqflask/wqflask/ctl/__init__.py create mode 100644 wqflask/wqflask/ctl/ctl_analysis.py (limited to 'wqflask') diff --git a/wqflask/wqflask/ctl/__init__.py b/wqflask/wqflask/ctl/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py new file mode 100644 index 00000000..13f08a0f --- /dev/null +++ b/wqflask/wqflask/ctl/ctl_analysis.py @@ -0,0 +1,87 @@ +# CTL analysis for GN2 +# Author / Maintainer: Danny Arends +import sys +from numpy import * +import scipy as sp # SciPy +import rpy2.robjects as ro # R Objects +import rpy2.rinterface as ri + +from base.webqtlConfig import GENERATED_IMAGE_DIR +from utility import webqtlUtil # Random number for the image + +import base64 +import array + +from utility import helper_functions + +from rpy2.robjects.packages import importr +utils = importr("utils") + +## Get pointers to some common R functions +r_library = ro.r["library"] # Map the library function +r_options = ro.r["options"] # Map the options function +r_read_csv = ro.r["read.csv"] # Map the read.csv function +r_dim = ro.r["dim"] # Map the dim function +r_c = ro.r["c"] # Map the c function +r_cat = ro.r["cat"] # Map the cat function +r_paste = ro.r["paste"] # Map the paste function +r_unlist = ro.r["unlist"] # Map the unlist function +r_unique = ro.r["unique"] # Map the unique function +r_length = ro.r["length"] # Map the length function +r_unlist = ro.r["unlist"] # Map the unlist function +r_list = ro.r.list # Map the list function +r_matrix = ro.r.matrix # Map the matrix function +r_seq = ro.r["seq"] # Map the seq function +r_table = ro.r["table"] # Map the table function +r_names = ro.r["names"] # Map the names function +r_sink = ro.r["sink"] # Map the sink function +r_is_NA = ro.r["is.na"] # Map the is.na function +r_file = ro.r["file"] # Map the file function +r_png = ro.r["png"] # Map the png function for plotting +r_dev_off = ro.r["dev.off"] # Map the dev.off function + +class CTL(object): + def __init__(self): + print("Initialization of CTL") + #log = r_file("/tmp/genenetwork_wcgna.log", open = "wt") + #r_sink(log) # Uncomment the r_sink() commands to log output from stdout/stderr to a file + #r_sink(log, type = "message") + r_library("ctl") # Load WGCNA - Should only be done once, since it is quite expensive + r_options(stringsAsFactors = False) + print("Initialization of CTL done, package loaded in R session") + self.r_CTLscan = ro.r["CTLscan"] # Map the CTLscan function + print("Obtained pointers to CTL functions") + + def run_analysis(self, requestform): + print("Starting CTL analysis on dataset") + + self.trait_db_list = [trait.strip() for trait in requestform['trait_list'].split(',')] + print("Retrieved phenotype data from database", requestform['trait_list']) + helper_functions.get_trait_db_obs(self, self.trait_db_list) + + self.input = {} # self.input contains the phenotype values we need to send to R + strains = [] # All the strains we have data for (contains duplicates) + traits = [] # All the traits we have data for (should not contain duplicates) + for trait in self.trait_list: + traits.append(trait[0].name) + self.input[trait[0].name] = {} + for strain in trait[0].data: + strains.append(strain) + self.input[trait[0].name][strain] = trait[0].data[strain].value + sys.stdout.flush() + + def render_image(self, results): + print("pre-loading imgage results:", self.results['imgloc']) + imgfile = open(self.results['imgloc'], 'rb') + imgdata = imgfile.read() + imgB64 = imgdata.encode("base64") + bytesarray = array.array('B', imgB64) + self.results['imgdata'] = bytesarray + + def process_results(self, results): + print("Processing WGCNA output") + template_vars = {} + template_vars["input"] = self.input + sys.stdout.flush() + return(dict(template_vars)) + -- cgit v1.2.3 From eb2bee6dce67f7e1ca04bd96a477e2eae8fcb543 Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 22 Mar 2016 16:36:32 +0100 Subject: Connecting the CTL analysis to the collection overview, by adding a button --- wqflask/wqflask/templates/collections/view.html | 12 ++++++++++++ wqflask/wqflask/views.py | 9 +++++++++ 2 files changed, 21 insertions(+) (limited to 'wqflask') diff --git a/wqflask/wqflask/templates/collections/view.html b/wqflask/wqflask/templates/collections/view.html index f92d9984..c1563b9c 100755 --- a/wqflask/wqflask/templates/collections/view.html +++ b/wqflask/wqflask/templates/collections/view.html @@ -55,6 +55,18 @@
+
+ {% if uc %} + + {% endif %} + +
+ +
+
{% if uc %} diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 7f331492..5e8fb1fe 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -196,6 +196,15 @@ def wcgna_results(): result = wgcna.process_results(wgcnaA) # After the analysis is finished store the result return render_template("wgcna_results.html", **result) # Display them using the template +@app.route("/ctl_setup", methods=('POST',)) +def ctl_setup(): + print("In ctl, request.form is:", request.form) # We are going to get additional user input for the analysis + return render_template("ctl_setup.html", **request.form) # Display them using the template + +@app.route("/ctl_results", methods=('POST',)) +def ctl_results(): + print("In ctl, request.form is:", request.form) + return render_template("ctl_results.html", **result) # Display them using the template @app.route("/news") def news_route(): -- cgit v1.2.3 From 47f0a34f040189898ad03bb2ddd34e25295c3eb8 Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 22 Mar 2016 17:57:54 +0100 Subject: Loading the library and mapping the scan function --- wqflask/wqflask/ctl/ctl_analysis.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py index 13f08a0f..3159ad7f 100644 --- a/wqflask/wqflask/ctl/ctl_analysis.py +++ b/wqflask/wqflask/ctl/ctl_analysis.py @@ -46,10 +46,10 @@ class CTL(object): #log = r_file("/tmp/genenetwork_wcgna.log", open = "wt") #r_sink(log) # Uncomment the r_sink() commands to log output from stdout/stderr to a file #r_sink(log, type = "message") - r_library("ctl") # Load WGCNA - Should only be done once, since it is quite expensive + r_library("ctl") # Load CTL - Should only be done once, since it is quite expensive r_options(stringsAsFactors = False) print("Initialization of CTL done, package loaded in R session") - self.r_CTLscan = ro.r["CTLscan"] # Map the CTLscan function + self.r_CTLscan = ro.r["CTLscan"] # Map the CTLscan function print("Obtained pointers to CTL functions") def run_analysis(self, requestform): @@ -68,6 +68,8 @@ class CTL(object): for strain in trait[0].data: strains.append(strain) self.input[trait[0].name][strain] = trait[0].data[strain].value + + self.results = {} sys.stdout.flush() def render_image(self, results): @@ -79,7 +81,7 @@ class CTL(object): self.results['imgdata'] = bytesarray def process_results(self, results): - print("Processing WGCNA output") + print("Processing CTL output") template_vars = {} template_vars["input"] = self.input sys.stdout.flush() -- cgit v1.2.3 From 3e1e63f3280a652e57cef5b4a526b321142296ce Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 22 Mar 2016 17:58:23 +0100 Subject: [PATCH 082/100] Testing passing information between the templates --- wqflask/wqflask/templates/ctl_results.html | 9 +++++++++ wqflask/wqflask/templates/ctl_setup.html | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 wqflask/wqflask/templates/ctl_results.html create mode 100644 wqflask/wqflask/templates/ctl_setup.html (limited to 'wqflask') diff --git a/wqflask/wqflask/templates/ctl_results.html b/wqflask/wqflask/templates/ctl_results.html new file mode 100644 index 00000000..d978b38d --- /dev/null +++ b/wqflask/wqflask/templates/ctl_results.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} +{% block title %}CTL results{% endblock %} + +{% block content %} +
+

CTL Results

+ {{request.form['trait_list'].split(',')|length}} phenotypes as input +
+{% endblock %} diff --git a/wqflask/wqflask/templates/ctl_setup.html b/wqflask/wqflask/templates/ctl_setup.html new file mode 100644 index 00000000..a5f1daf6 --- /dev/null +++ b/wqflask/wqflask/templates/ctl_setup.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% block title %}WCGNA analysis{% endblock %} + +{% block content %} +
+

CTL analysis parameters

+ {{request.form['trait_list'].split(',')|length}} phenotypes as input + + + +
+
+ +
+
+ + +
+{% endblock %} -- cgit v1.2.3 From 2cbdf59b98ae6061ef083ab29c30111d2ea1f853 Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 22 Mar 2016 17:59:47 +0100 Subject: Creating the analysis object and passing results to the results template --- wqflask/wqflask/views.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 5e8fb1fe..87ba8b32 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -48,6 +48,7 @@ from wqflask.correlation_matrix import show_corr_matrix from wqflask.correlation import corr_scatter_plot from wqflask.wgcna import wgcna_analysis +from wqflask.ctl import ctl_analysis from utility import temp_data from utility.tools import TEMPDIR @@ -204,7 +205,10 @@ def ctl_setup(): @app.route("/ctl_results", methods=('POST',)) def ctl_results(): print("In ctl, request.form is:", request.form) - return render_template("ctl_results.html", **result) # Display them using the template + ctl = ctl_analysis.CTL() # Start R, load the package and pointers and create the analysis + ctlA = ctl.run_analysis(request.form) # Start the analysis, a ctlA object should be a separate long running thread + result = ctl.process_results(ctlA) # After the analysis is finished store the result + return render_template("ctl_results.html", **result) # Display them using the template @app.route("/news") def news_route(): -- cgit v1.2.3 From a13baa5fb98d8167e70df7008d0d07b40a05a6b9 Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 22 Mar 2016 23:37:13 +0100 Subject: Adding the geno file parser from Zach --- wqflask/utility/genofile_parser.py | 96 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 wqflask/utility/genofile_parser.py (limited to 'wqflask') diff --git a/wqflask/utility/genofile_parser.py b/wqflask/utility/genofile_parser.py new file mode 100644 index 00000000..9dd7b08b --- /dev/null +++ b/wqflask/utility/genofile_parser.py @@ -0,0 +1,96 @@ +# CTL analysis for GN2 +# Author / Maintainer: Danny Arends + +from __future__ import print_function, division, absolute_import +import sys +import os +import glob +import traceback +import gzip + +import simplejson as json + +from pprint import pformat as pf + +class Marker(object): + def __init__(self): + self.name = None + self.chr = None + self.cM = None + self.Mb = None + self.genotypes = [] + + +class ConvertGenoFile(object): + + def __init__(self, input_file): + self.mb_exists = False + self.cm_exists = False + self.markers = [] + + self.latest_row_pos = None + self.latest_col_pos = None + + self.latest_row_value = None + self.latest_col_value = None + self.input_fh = open(input_file) + print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + self.haplotype_notation = { + '@mat': "3", + '@pat': "1", + '@het': "2", + '@unk': "NA" + } + self.configurations = {} + + def process_rows(self): + for self.latest_row_pos, row in enumerate(self.input_fh): + self.latest_row_value = row + # Take care of headers + if not row.strip(): + continue + if row.startswith('#'): + continue + if row.startswith('Chr'): + if 'Mb' in row.split(): + self.mb_exists = True + if 'cM' in row.split(): + self.cm_exists = True + continue + if row.startswith('@'): + key, _separater, value = row.partition(':') + key = key.strip() + value = value.strip() + if key in self.haplotype_notation: + self.configurations[value] = self.haplotype_notation[key] + continue + if not len(self.configurations): + raise EmptyConfigurations + yield row + + def process_csv(self): + for row_count, row in enumerate(self.process_rows()): + row_items = row.split("\t") + + this_marker = Marker() + this_marker.name = row_items[1] + this_marker.chr = row_items[0] + if self.cm_exists and self.mb_exists: + this_marker.cM = row_items[2] + this_marker.Mb = row_items[3] + genotypes = row_items[4:] + elif self.cm_exists: + this_marker.cM = row_items[2] + genotypes = row_items[3:] + elif self.mb_exists: + this_marker.Mb = row_items[2] + genotypes = row_items[3:] + else: + genotypes = row_items[2:] + for item_count, genotype in enumerate(genotypes): + if genotype.upper() in self.configurations: + this_marker.genotypes.append(self.configurations[genotype.upper()]) + else: + this_marker.genotypes.append("NA") + self.markers.append(this_marker.__dict__) + -- cgit v1.2.3 From 179b8eab7528db15f5c97733c94a5e24dbfed661 Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 22 Mar 2016 23:38:18 +0100 Subject: Using the geno parser to get/parse the genotypes for the dataset --- wqflask/wqflask/ctl/ctl_analysis.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py index 3159ad7f..8a2f1954 100644 --- a/wqflask/wqflask/ctl/ctl_analysis.py +++ b/wqflask/wqflask/ctl/ctl_analysis.py @@ -8,11 +8,14 @@ import rpy2.rinterface as ri from base.webqtlConfig import GENERATED_IMAGE_DIR from utility import webqtlUtil # Random number for the image +from utility import genofile_parser # genofile_parser import base64 import array +import csv from utility import helper_functions +from utility.tools import locate from rpy2.robjects.packages import importr utils = importr("utils") @@ -43,13 +46,17 @@ r_dev_off = ro.r["dev.off"] # Map the dev.off function class CTL(object): def __init__(self): print("Initialization of CTL") - #log = r_file("/tmp/genenetwork_wcgna.log", open = "wt") + #log = r_file("/tmp/genenetwork_ctl.log", open = "wt") #r_sink(log) # Uncomment the r_sink() commands to log output from stdout/stderr to a file #r_sink(log, type = "message") r_library("ctl") # Load CTL - Should only be done once, since it is quite expensive r_options(stringsAsFactors = False) print("Initialization of CTL done, package loaded in R session") - self.r_CTLscan = ro.r["CTLscan"] # Map the CTLscan function + self.r_CTLscan = ro.r["CTLscan"] # Map the CTLscan function + self.r_CTLsignificant = ro.r["CTLsignificant"] # Map the CTLsignificant function + self.r_lineplot = ro.r["ctl.lineplot"] # Map the ctl.lineplot function + self.r_CTLnetwork = ro.r["CTLnetwork"] # Map the CTLnetwork function + self.r_CTLprofiles = ro.r["CTLprofiles"] # Map the CTLprofiles function print("Obtained pointers to CTL functions") def run_analysis(self, requestform): @@ -57,18 +64,26 @@ class CTL(object): self.trait_db_list = [trait.strip() for trait in requestform['trait_list'].split(',')] print("Retrieved phenotype data from database", requestform['trait_list']) + helper_functions.get_trait_db_obs(self, self.trait_db_list) self.input = {} # self.input contains the phenotype values we need to send to R strains = [] # All the strains we have data for (contains duplicates) traits = [] # All the traits we have data for (should not contain duplicates) + genotypebasename = "" for trait in self.trait_list: traits.append(trait[0].name) + if genotypebasename == "": + genotypebasename = trait[1].group.name self.input[trait[0].name] = {} for strain in trait[0].data: strains.append(strain) self.input[trait[0].name][strain] = trait[0].data[strain].value + genofilelocation = locate(genotypebasename + ".geno", "genotype") + parser = genofile_parser.ConvertGenoFile(genofilelocation) + parser.process_csv() + print(parser.markers) self.results = {} sys.stdout.flush() -- cgit v1.2.3 From f5ce8d6abb8b6a48b5ef6af6444f0289327fd95b Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 22 Mar 2016 23:39:23 +0100 Subject: Minor changes to the CTL setup template --- wqflask/wqflask/templates/ctl_setup.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/templates/ctl_setup.html b/wqflask/wqflask/templates/ctl_setup.html index a5f1daf6..070a97b4 100644 --- a/wqflask/wqflask/templates/ctl_setup.html +++ b/wqflask/wqflask/templates/ctl_setup.html @@ -10,7 +10,7 @@
- +
-- cgit v1.2.3 From 3d505d997511cd8f7b9f14510059cb2983edc6d4 Mon Sep 17 00:00:00 2001 From: DannyArends Date: Wed, 23 Mar 2016 23:07:16 +0100 Subject: Parsing the names of the individuals, and coding H as -999 --- wqflask/utility/genofile_parser.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'wqflask') diff --git a/wqflask/utility/genofile_parser.py b/wqflask/utility/genofile_parser.py index 9dd7b08b..67b84dc9 100644 --- a/wqflask/utility/genofile_parser.py +++ b/wqflask/utility/genofile_parser.py @@ -8,6 +8,7 @@ import glob import traceback import gzip + import simplejson as json from pprint import pformat as pf @@ -34,12 +35,12 @@ class ConvertGenoFile(object): self.latest_row_value = None self.latest_col_value = None self.input_fh = open(input_file) - print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + print("!!!!!!!!!!!!!!!!PARSER!!!!!!!!!!!!!!!!!!") self.haplotype_notation = { - '@mat': "3", - '@pat': "1", - '@het': "2", - '@unk': "NA" + '@mat': "1", + '@pat': "2", + '@het': "-999", + '@unk': "-999" } self.configurations = {} @@ -56,6 +57,8 @@ class ConvertGenoFile(object): self.mb_exists = True if 'cM' in row.split(): self.cm_exists = True + skip = 2 + self.cm_exists + self.mb_exists + self.individuals = row.split()[skip:] continue if row.startswith('@'): key, _separater, value = row.partition(':') @@ -88,9 +91,10 @@ class ConvertGenoFile(object): else: genotypes = row_items[2:] for item_count, genotype in enumerate(genotypes): - if genotype.upper() in self.configurations: - this_marker.genotypes.append(self.configurations[genotype.upper()]) + if genotype.upper().strip() in self.configurations: + this_marker.genotypes.append(self.configurations[genotype.upper().strip()]) else: + print("WARNING:", genotype.upper()) this_marker.genotypes.append("NA") self.markers.append(this_marker.__dict__) -- cgit v1.2.3 From 210d8109a4171ddf6ea6a3f70a1bfbea7b327722 Mon Sep 17 00:00:00 2001 From: DannyArends Date: Wed, 23 Mar 2016 23:08:12 +0100 Subject: Adding code to do initial CTL mapping (working on the BXD) --- wqflask/wqflask/ctl/ctl_analysis.py | 99 ++++++++++++++++++++++++++++--------- 1 file changed, 77 insertions(+), 22 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py index 8a2f1954..f998dc59 100644 --- a/wqflask/wqflask/ctl/ctl_analysis.py +++ b/wqflask/wqflask/ctl/ctl_analysis.py @@ -13,6 +13,10 @@ from utility import genofile_parser # genofile_parser import base64 import array import csv +import itertools + +from base import data_set +from base import trait as TRAIT from utility import helper_functions from utility.tools import locate @@ -26,9 +30,11 @@ r_options = ro.r["options"] # Map the options function r_read_csv = ro.r["read.csv"] # Map the read.csv function r_dim = ro.r["dim"] # Map the dim function r_c = ro.r["c"] # Map the c function +r_t = ro.r["t"] # Map the t function r_cat = ro.r["cat"] # Map the cat function r_paste = ro.r["paste"] # Map the paste function r_unlist = ro.r["unlist"] # Map the unlist function +r_head = ro.r["head"] # Map the unlist function r_unique = ro.r["unique"] # Map the unique function r_length = ro.r["length"] # Map the length function r_unlist = ro.r["unlist"] # Map the unlist function @@ -42,6 +48,12 @@ r_is_NA = ro.r["is.na"] # Map the is.na function r_file = ro.r["file"] # Map the file function r_png = ro.r["png"] # Map the png function for plotting r_dev_off = ro.r["dev.off"] # Map the dev.off function +r_save_image = ro.r["save.image"] # Map the save.image function +r_class = ro.r["class"] # Map the class function +r_save = ro.r["save"] # Map the save function +r_write_table = ro.r["write.table"] # Map the write.table function +r_as_data_frame = ro.r["as.data.frame"] # Map the write.table function +r_data_frame = ro.r["data.frame"] # Map the write.table function class CTL(object): def __init__(self): @@ -61,31 +73,73 @@ class CTL(object): def run_analysis(self, requestform): print("Starting CTL analysis on dataset") - self.trait_db_list = [trait.strip() for trait in requestform['trait_list'].split(',')] - print("Retrieved phenotype data from database", requestform['trait_list']) - - helper_functions.get_trait_db_obs(self, self.trait_db_list) - - self.input = {} # self.input contains the phenotype values we need to send to R - strains = [] # All the strains we have data for (contains duplicates) - traits = [] # All the traits we have data for (should not contain duplicates) - genotypebasename = "" - for trait in self.trait_list: - traits.append(trait[0].name) - if genotypebasename == "": - genotypebasename = trait[1].group.name - self.input[trait[0].name] = {} - for strain in trait[0].data: - strains.append(strain) - self.input[trait[0].name][strain] = trait[0].data[strain].value - - genofilelocation = locate(genotypebasename + ".geno", "genotype") + self.trait_db_list = [x for x in self.trait_db_list if x] + + datasetname = self.trait_db_list[0].split(":")[1] + dataset = data_set.create_dataset(datasetname) + + genofilelocation = locate(dataset.group.name + ".geno", "genotype") parser = genofile_parser.ConvertGenoFile(genofilelocation) parser.process_csv() - print(parser.markers) + + individuals = parser.individuals + markers = [] + markernames = [] + x = 1 + for marker in parser.markers: + markernames.append(marker["name"]) + markers.append(marker["genotypes"]) + if x == 1: + print marker["genotypes"] + + x = x +1 + + genotypes = list(itertools.chain(*markers)) + print(len(genotypes) / len(individuals), "==", len(parser.markers)) + + rGeno = r_t(ro.r.matrix(r_unlist(genotypes), nrow=len(markernames), ncol=len(individuals), dimnames = r_list(markernames, individuals), byrow=True)) + + print(r_dim(rGeno)) + #self.trait_names = [trait.split(':')[0].strip() for trait in self.trait_db_list] + #print(self.trait_names) + + + traits = [] + for trait in self.trait_db_list: + print("retrieving data for", trait) + if trait != "": + ts = trait.split(':') + gt = TRAIT.GeneralTrait(name = ts[0], dataset_name = ts[1]) + gt.retrieve_sample_data(individuals) + for ind in individuals: + if ind in gt.data.keys(): + traits.append(gt.data[ind].value) + else: + traits.append("-999") + + print len(traits) / len(individuals), "==", len(self.trait_db_list) + rPheno = r_t(ro.r.matrix(r_unlist(traits), nrow=len(self.trait_db_list), ncol=len(individuals), dimnames = r_list(self.trait_db_list, individuals), byrow=True)) + + rPheno = r_data_frame(rPheno) + rGeno = r_data_frame(rGeno) + + print(r_class(rPheno)) + print(r_class(rGeno)) + + + + r_write_table(rPheno, "~/pheno.csv") + r_write_table(rGeno, "~/geno.csv") + res = self.r_CTLscan(rGeno, rPheno) + self.results = {} - sys.stdout.flush() + self.results['imgurl'] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" + self.results['imgloc'] = GENERATED_IMAGE_DIR + self.results['imgurl'] + r_png(self.results['imgloc'], width=1000, height=600) + self.r_lineplot(res, significance = 1) + r_dev_off() + # sys.stdout.flush() def render_image(self, results): print("pre-loading imgage results:", self.results['imgloc']) @@ -98,7 +152,8 @@ class CTL(object): def process_results(self, results): print("Processing CTL output") template_vars = {} - template_vars["input"] = self.input + template_vars["results"] = self.results + self.render_image(self.results) sys.stdout.flush() return(dict(template_vars)) -- cgit v1.2.3 From b1e258e046e40f3ab8b6dba045c866959875000e Mon Sep 17 00:00:00 2001 From: DannyArends Date: Wed, 23 Mar 2016 23:08:32 +0100 Subject: Adding the lineplot image to the output --- wqflask/wqflask/templates/ctl_results.html | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'wqflask') diff --git a/wqflask/wqflask/templates/ctl_results.html b/wqflask/wqflask/templates/ctl_results.html index d978b38d..e2adbdfe 100644 --- a/wqflask/wqflask/templates/ctl_results.html +++ b/wqflask/wqflask/templates/ctl_results.html @@ -5,5 +5,13 @@

CTL Results

{{request.form['trait_list'].split(',')|length}} phenotypes as input + + + Embedded Image +
{% endblock %} -- cgit v1.2.3 From fa45eb93c9cf83ea3080c862aeabe512b4cffa2f Mon Sep 17 00:00:00 2001 From: DannyArends Date: Wed, 23 Mar 2016 23:16:35 +0100 Subject: Cleaning code, adding comments --- wqflask/wqflask/ctl/ctl_analysis.py | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py index f998dc59..71c41135 100644 --- a/wqflask/wqflask/ctl/ctl_analysis.py +++ b/wqflask/wqflask/ctl/ctl_analysis.py @@ -76,6 +76,7 @@ class CTL(object): self.trait_db_list = [trait.strip() for trait in requestform['trait_list'].split(',')] self.trait_db_list = [x for x in self.trait_db_list if x] + # Get the name of the .geno file belonging to the first phenotype datasetname = self.trait_db_list[0].split(":")[1] dataset = data_set.create_dataset(datasetname) @@ -83,28 +84,20 @@ class CTL(object): parser = genofile_parser.ConvertGenoFile(genofilelocation) parser.process_csv() + # Create a genotype matrix individuals = parser.individuals markers = [] markernames = [] - x = 1 for marker in parser.markers: markernames.append(marker["name"]) markers.append(marker["genotypes"]) - if x == 1: - print marker["genotypes"] - x = x +1 - genotypes = list(itertools.chain(*markers)) print(len(genotypes) / len(individuals), "==", len(parser.markers)) rGeno = r_t(ro.r.matrix(r_unlist(genotypes), nrow=len(markernames), ncol=len(individuals), dimnames = r_list(markernames, individuals), byrow=True)) - print(r_dim(rGeno)) - #self.trait_names = [trait.split(':')[0].strip() for trait in self.trait_db_list] - #print(self.trait_names) - - + # Create a phenotype matrix traits = [] for trait in self.trait_db_list: print("retrieving data for", trait) @@ -118,28 +111,25 @@ class CTL(object): else: traits.append("-999") - print len(traits) / len(individuals), "==", len(self.trait_db_list) rPheno = r_t(ro.r.matrix(r_unlist(traits), nrow=len(self.trait_db_list), ncol=len(individuals), dimnames = r_list(self.trait_db_list, individuals), byrow=True)) + # Use a data frame to store the objects rPheno = r_data_frame(rPheno) rGeno = r_data_frame(rGeno) - print(r_class(rPheno)) - print(r_class(rGeno)) - - - - r_write_table(rPheno, "~/pheno.csv") - r_write_table(rGeno, "~/geno.csv") + # Perform the CTL scan res = self.r_CTLscan(rGeno, rPheno) + # Create an image for output self.results = {} self.results['imgurl'] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" self.results['imgloc'] = GENERATED_IMAGE_DIR + self.results['imgurl'] r_png(self.results['imgloc'], width=1000, height=600) self.r_lineplot(res, significance = 1) r_dev_off() - # sys.stdout.flush() + + # Flush any output from R + sys.stdout.flush() def render_image(self, results): print("pre-loading imgage results:", self.results['imgloc']) -- cgit v1.2.3 From f7053ce4e687d5626acd42295b2ca90ebb4c7ade Mon Sep 17 00:00:00 2001 From: DannyArends Date: Thu, 24 Mar 2016 20:33:25 +0100 Subject: Updates to the CTL code adding the significant results to the result object --- wqflask/wqflask/ctl/ctl_analysis.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py index 71c41135..44bade5c 100644 --- a/wqflask/wqflask/ctl/ctl_analysis.py +++ b/wqflask/wqflask/ctl/ctl_analysis.py @@ -52,8 +52,10 @@ r_save_image = ro.r["save.image"] # Map the save.image function r_class = ro.r["class"] # Map the class function r_save = ro.r["save"] # Map the save function r_write_table = ro.r["write.table"] # Map the write.table function -r_as_data_frame = ro.r["as.data.frame"] # Map the write.table function -r_data_frame = ro.r["data.frame"] # Map the write.table function +r_read_table = ro.r["read.table"] # Map the read.table function +r_as_data_frame = ro.r["as.data.frame"] # Map the write.table function +r_data_frame = ro.r["data.frame"] # Map the write.table function +r_as_numeric = ro.r["as.numeric"] # Map the write.table function class CTL(object): def __init__(self): @@ -69,6 +71,7 @@ class CTL(object): self.r_lineplot = ro.r["ctl.lineplot"] # Map the ctl.lineplot function self.r_CTLnetwork = ro.r["CTLnetwork"] # Map the CTLnetwork function self.r_CTLprofiles = ro.r["CTLprofiles"] # Map the CTLprofiles function + self.r_CTLsignificant = ro.r["CTLsignificant"] # Map the CTLsignificant function print("Obtained pointers to CTL functions") def run_analysis(self, requestform): @@ -111,21 +114,32 @@ class CTL(object): else: traits.append("-999") - rPheno = r_t(ro.r.matrix(r_unlist(traits), nrow=len(self.trait_db_list), ncol=len(individuals), dimnames = r_list(self.trait_db_list, individuals), byrow=True)) + rPheno = r_t(ro.r.matrix(r_as_numeric(r_unlist(traits)), nrow=len(self.trait_db_list), ncol=len(individuals), dimnames = r_list(self.trait_db_list, individuals), byrow=True)) # Use a data frame to store the objects rPheno = r_data_frame(rPheno) rGeno = r_data_frame(rGeno) + r_write_table(rGeno, "~/outputGN/geno.csv") + r_write_table(rPheno, "~/outputGN/pheno.csv") + # Perform the CTL scan - res = self.r_CTLscan(rGeno, rPheno) + res = self.r_CTLscan(rGeno, rPheno, ncores = 6) + + # Get significant interactions + significant = self.r_CTLsignificant(res) + + print(significant[0]) # Create an image for output self.results = {} self.results['imgurl'] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" self.results['imgloc'] = GENERATED_IMAGE_DIR + self.results['imgurl'] + self.results['ctlresult'] = significant + + # Create the lineplot r_png(self.results['imgloc'], width=1000, height=600) - self.r_lineplot(res, significance = 1) + self.r_lineplot(res) r_dev_off() # Flush any output from R -- cgit v1.2.3 From 1f32d6a71beec407ffdf0ef5b17240ee07d68939 Mon Sep 17 00:00:00 2001 From: DannyArends Date: Thu, 24 Mar 2016 20:33:46 +0100 Subject: Working on the output template of CTL --- wqflask/wqflask/templates/ctl_results.html | 25 +++++++++++++++++++++++-- wqflask/wqflask/templates/ctl_setup.html | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/templates/ctl_results.html b/wqflask/wqflask/templates/ctl_results.html index e2adbdfe..914c1d43 100644 --- a/wqflask/wqflask/templates/ctl_results.html +++ b/wqflask/wqflask/templates/ctl_results.html @@ -4,14 +4,35 @@ {% block content %}

CTL Results

- {{request.form['trait_list'].split(',')|length}} phenotypes as input - + {{(request.form['trait_list'].split(',')|length -1)}} phenotypes as input
+

Figure

Embedded Image +

Tabular results

+ + + significant CTL:
+ {% for r in range(results['ctlresult'][0]|length) %} + + {% for c in range(results['ctlresult']|length) %} + + {% endfor %} + + {% endfor %} +
traitmarkertraitLODdCor
+ {% if c > 2 %} + {{results['ctlresult'][c][r]|float|round(2)}} + {% else %} + {{results['ctlresult'][c][r]}} + {% endif %} +
+ + +
{% endblock %} diff --git a/wqflask/wqflask/templates/ctl_setup.html b/wqflask/wqflask/templates/ctl_setup.html index 070a97b4..0ba281c6 100644 --- a/wqflask/wqflask/templates/ctl_setup.html +++ b/wqflask/wqflask/templates/ctl_setup.html @@ -4,7 +4,7 @@ {% block content %}

CTL analysis parameters

- {{request.form['trait_list'].split(',')|length}} phenotypes as input + {{(request.form['trait_list'].split(',')|length -1)}} phenotypes as input
-- cgit v1.2.3 From 1053764068a50e2b95e0f0b07cb4111369ce8ff8 Mon Sep 17 00:00:00 2001 From: DannyArends Date: Thu, 24 Mar 2016 22:08:44 +0100 Subject: Adding parameters, and passing them to the CTL algorithm --- wqflask/wqflask/ctl/ctl_analysis.py | 26 +++++++++++++----- wqflask/wqflask/templates/ctl_setup.html | 46 ++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 7 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py index 44bade5c..77e34143 100644 --- a/wqflask/wqflask/ctl/ctl_analysis.py +++ b/wqflask/wqflask/ctl/ctl_analysis.py @@ -79,6 +79,18 @@ class CTL(object): self.trait_db_list = [trait.strip() for trait in requestform['trait_list'].split(',')] self.trait_db_list = [x for x in self.trait_db_list if x] + print("strategy:", requestform.get("strategy")) + strategy = requestform.get("strategy") + + print("nperm:", requestform.get("nperm")) + nperm = int(requestform.get("nperm")) + + print("parametric:", requestform.get("parametric")) + parametric = bool(requestform.get("parametric")) + + print("significance:", requestform.get("significance")) + significance = float(requestform.get("significance")) + # Get the name of the .geno file belonging to the first phenotype datasetname = self.trait_db_list[0].split(":")[1] dataset = data_set.create_dataset(datasetname) @@ -120,26 +132,26 @@ class CTL(object): rPheno = r_data_frame(rPheno) rGeno = r_data_frame(rGeno) - r_write_table(rGeno, "~/outputGN/geno.csv") - r_write_table(rPheno, "~/outputGN/pheno.csv") + # Debug: Print the genotype and phenotype files to disk + #r_write_table(rGeno, "~/outputGN/geno.csv") + #r_write_table(rPheno, "~/outputGN/pheno.csv") # Perform the CTL scan - res = self.r_CTLscan(rGeno, rPheno, ncores = 6) + res = self.r_CTLscan(rGeno, rPheno, strategy = strategy, nperm = nperm, parametric = parametric, ncores = 6) # Get significant interactions - significant = self.r_CTLsignificant(res) - - print(significant[0]) + significant = self.r_CTLsignificant(res, significance = significance) # Create an image for output self.results = {} self.results['imgurl'] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" self.results['imgloc'] = GENERATED_IMAGE_DIR + self.results['imgurl'] self.results['ctlresult'] = significant + self.results['requestform'] = requestform # Store the user specified parameters for the output page # Create the lineplot r_png(self.results['imgloc'], width=1000, height=600) - self.r_lineplot(res) + self.r_lineplot(res, significance = significance) r_dev_off() # Flush any output from R diff --git a/wqflask/wqflask/templates/ctl_setup.html b/wqflask/wqflask/templates/ctl_setup.html index 0ba281c6..9c0d7bea 100644 --- a/wqflask/wqflask/templates/ctl_setup.html +++ b/wqflask/wqflask/templates/ctl_setup.html @@ -8,11 +8,57 @@ + + + + + + + + + +
+
-- cgit v1.2.3 From 87a9aab9c830d267cb9c9adbb10856054e6e12cc Mon Sep 17 00:00:00 2001 From: DannyArends Date: Mon, 28 Mar 2016 18:32:27 +0200 Subject: Adding small figures per trait, so that users can see CTL and QTL for each individual phenotype --- wqflask/wqflask/ctl/ctl_analysis.py | 35 +++++++++++++++++++++++------- wqflask/wqflask/templates/ctl_results.html | 15 ++++++++++--- 2 files changed, 39 insertions(+), 11 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py index 77e34143..45bc4c6e 100644 --- a/wqflask/wqflask/ctl/ctl_analysis.py +++ b/wqflask/wqflask/ctl/ctl_analysis.py @@ -69,9 +69,10 @@ class CTL(object): self.r_CTLscan = ro.r["CTLscan"] # Map the CTLscan function self.r_CTLsignificant = ro.r["CTLsignificant"] # Map the CTLsignificant function self.r_lineplot = ro.r["ctl.lineplot"] # Map the ctl.lineplot function + self.r_CTLsignificant = ro.r["CTLsignificant"] # Map the CTLsignificant function self.r_CTLnetwork = ro.r["CTLnetwork"] # Map the CTLnetwork function self.r_CTLprofiles = ro.r["CTLprofiles"] # Map the CTLprofiles function - self.r_CTLsignificant = ro.r["CTLsignificant"] # Map the CTLsignificant function + self.r_plotCTLobject = ro.r["plot.CTLobject"] # Map the CTLsignificant function print("Obtained pointers to CTL functions") def run_analysis(self, requestform): @@ -144,26 +145,44 @@ class CTL(object): # Create an image for output self.results = {} - self.results['imgurl'] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" - self.results['imgloc'] = GENERATED_IMAGE_DIR + self.results['imgurl'] + self.results['imgurl1'] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" + self.results['imgloc1'] = GENERATED_IMAGE_DIR + self.results['imgurl1'] + self.results['ctlresult'] = significant self.results['requestform'] = requestform # Store the user specified parameters for the output page # Create the lineplot - r_png(self.results['imgloc'], width=1000, height=600) + r_png(self.results['imgloc1'], width=1000, height=600) self.r_lineplot(res, significance = significance) r_dev_off() + n = 2 + for trait in self.trait_db_list: + # Create the QTL like CTL plots + self.results['imgurl' + str(n)] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" + self.results['imgloc' + str(n)] = GENERATED_IMAGE_DIR + self.results['imgurl' + str(n)] + r_png(self.results['imgloc' + str(n)], width=1000, height=600) + self.r_plotCTLobject(res, (n-1), significance = significance, main='Phenotype ' + trait) + r_dev_off() + n = n + 1 + # Flush any output from R sys.stdout.flush() - def render_image(self, results): - print("pre-loading imgage results:", self.results['imgloc']) - imgfile = open(self.results['imgloc'], 'rb') + def loadImage(self, path, name): + print("pre-loading imgage results:", self.results[path]) + imgfile = open(self.results[path], 'rb') imgdata = imgfile.read() imgB64 = imgdata.encode("base64") bytesarray = array.array('B', imgB64) - self.results['imgdata'] = bytesarray + self.results[name] = bytesarray + + def render_image(self, results): + self.loadImage("imgloc1", "imgdata1") + n = 2 + for trait in self.trait_db_list: + self.loadImage("imgloc" + str(n), "imgdata" + str(n)) + n = n + 1 def process_results(self, results): print("Processing CTL output") diff --git a/wqflask/wqflask/templates/ctl_results.html b/wqflask/wqflask/templates/ctl_results.html index 914c1d43..a5cb1c08 100644 --- a/wqflask/wqflask/templates/ctl_results.html +++ b/wqflask/wqflask/templates/ctl_results.html @@ -5,13 +5,22 @@

CTL Results

{{(request.form['trait_list'].split(',')|length -1)}} phenotypes as input
-

Figure

- +

Network Figure

+
Embedded Image +

CTL/QTL Plots for individual traits

+ {% for r in range(2, (request.form['trait_list'].split(',')|length +1)) %} + + Embedded Image + {% endfor %}

Tabular results

-- cgit v1.2.3 From 1c1654bb162ff005e925cea228ae8c6a57e0210b Mon Sep 17 00:00:00 2001 From: DannyArends Date: Mon, 28 Mar 2016 21:28:33 +0200 Subject: Changed the file stem of generated pictures to CTL --- wqflask/wqflask/ctl/ctl_analysis.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py index 45bc4c6e..d79d9bfe 100644 --- a/wqflask/wqflask/ctl/ctl_analysis.py +++ b/wqflask/wqflask/ctl/ctl_analysis.py @@ -145,7 +145,7 @@ class CTL(object): # Create an image for output self.results = {} - self.results['imgurl1'] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" + self.results['imgurl1'] = webqtlUtil.genRandStr("CTLline_") + ".png" self.results['imgloc1'] = GENERATED_IMAGE_DIR + self.results['imgurl1'] self.results['ctlresult'] = significant @@ -159,7 +159,7 @@ class CTL(object): n = 2 for trait in self.trait_db_list: # Create the QTL like CTL plots - self.results['imgurl' + str(n)] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" + self.results['imgurl' + str(n)] = webqtlUtil.genRandStr("CTL_") + ".png" self.results['imgloc' + str(n)] = GENERATED_IMAGE_DIR + self.results['imgurl' + str(n)] r_png(self.results['imgloc' + str(n)], width=1000, height=600) self.r_plotCTLobject(res, (n-1), significance = significance, main='Phenotype ' + trait) -- cgit v1.2.3 From 87cb8afc55a22f795ed2f0df42d9e952cdbaaa2f Mon Sep 17 00:00:00 2001 From: DannyArends Date: Tue, 29 Mar 2016 22:22:45 +0200 Subject: trasnform to transform --- wqflask/wqflask/static/new/css/corr_matrix.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/static/new/css/corr_matrix.css b/wqflask/wqflask/static/new/css/corr_matrix.css index 495ca28c..cd2b0a80 100755 --- a/wqflask/wqflask/static/new/css/corr_matrix.css +++ b/wqflask/wqflask/static/new/css/corr_matrix.css @@ -3,7 +3,7 @@ -moz-transform: rotate(-90deg); -ms-transform: rotate(-90deg); -o-transform: rotate(-90deg); - trasnform: rotate(-90deg); + transform: rotate(-90deg); color: #000 font-size: 22px; height: 50px; -- cgit v1.2.3 From 9164ffc23879a8f9338939c06c36d3d49c3c899a Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 20 Apr 2016 10:26:54 +0000 Subject: Add file --- wqflask/base/webqtlConfig.py | 84 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 wqflask/base/webqtlConfig.py (limited to 'wqflask') diff --git a/wqflask/base/webqtlConfig.py b/wqflask/base/webqtlConfig.py new file mode 100755 index 00000000..cdce119a --- /dev/null +++ b/wqflask/base/webqtlConfig.py @@ -0,0 +1,84 @@ +#########################################' +# Environment Variables - public +# +# Note: much of this needs to handled by the settings/environment +# scripts. But rather than migrating everything in one go, we'll +# take it a step at a time. First the hard coded paths get replaced +# with those in utility/tools.py +# +######################################### + +from utility.tools import mk_dir, assert_dir, flat_files, TEMPDIR + +#Debug Level +#1 for debug, mod python will reload import each time +DEBUG = 1 + +#USER privilege +USERDICT = {'guest':1,'user':2, 'admin':3, 'root':4} + +#minimum number of informative strains +KMININFORMATIVE = 5 + +#maximum number of traits for interval mapping +MULTIPLEMAPPINGLIMIT = 11 + +#maximum number of traits for correlation +MAXCORR = 100 + +#Daily download limit from one IP +DAILYMAXIMUM = 1000 + +#maximum LRS value +MAXLRS = 460.0 + +#temporary data life span +MAXLIFE = 86400 + +#MINIMUM Database public value +PUBLICTHRESH = 0 + +#NBCI address +NCBI_LOCUSID = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=Graphics&list_uids=%s" +UCSC_REFSEQ = "http://genome.cse.ucsc.edu/cgi-bin/hgGene?db=%s&hgg_gene=%s&hgg_chrom=chr%s&hgg_start=%s&hgg_end=%s" +GENBANK_ID = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=Nucleotide&cmd=search&doptcmdl=DocSum&term=%s" +OMIM_ID = "http://www.ncbi.nlm.nih.gov/omim/%s" +UNIGEN_ID = "http://www.ncbi.nlm.nih.gov/UniGene/clust.cgi?ORG=%s&CID=%s"; +HOMOLOGENE_ID = "http://www.ncbi.nlm.nih.gov/sites/entrez?Db=homologene&Cmd=DetailsSearch&Term=%s" +PUBMEDLINK_URL = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=%s&dopt=Abstract" +UCSC_POS = "http://genome.ucsc.edu/cgi-bin/hgTracks?clade=mammal&org=%s&db=%s&position=chr%s:%s-%s&pix=800&Submit=submit" +UCSC_BLAT = 'http://genome.ucsc.edu/cgi-bin/hgBlat?org=%s&db=%s&type=0&sort=0&output=0&userSeq=%s' +UTHSC_BLAT = 'http://ucscbrowser.genenetwork.org/cgi-bin/hgBlat?org=%s&db=%s&type=0&sort=0&output=0&userSeq=%s' +UCSC_GENOME = "http://genome.ucsc.edu/cgi-bin/hgTracks?db=%s&position=chr%s:%d-%d&hgt.customText=http://web2qtl.utmem.edu:88/snp/chr%s" +ENSEMBLE_BLAT = 'http://www.ensembl.org/Mus_musculus/featureview?type=AffyProbe&id=%s' +DBSNP = 'http://www.ncbi.nlm.nih.gov/SNP/snp_ref.cgi?type=rs&rs=%s' +UCSC_RUDI_TRACK_URL = " http://genome.cse.ucsc.edu/cgi-bin/hgTracks?org=%s&db=%s&hgt.customText=http://gbic.biol.rug.nl/~ralberts/tracks/%s/%s" +GENOMEBROWSER_URL="http://ucscbrowser.genenetwork.org/cgi-bin/hgTracks?clade=mammal&org=Mouse&db=mm9&position=%s&hgt.suggest=&pix=800&Submit=submit" +ENSEMBLETRANSCRIPT_URL="http://useast.ensembl.org/Mus_musculus/Lucene/Details?species=Mus_musculus;idx=Transcript;end=1;q=%s" + +# HTMLPATH = GNROOT + 'genotype_files/' +# PYLMM_PATH +# IMGDIR = GNROOT + '/wqflask/wqflask/static/output/' + +# Temporary storage: +TMPDIR = mk_dir(TEMPDIR+'/gn2/') +CACHEDIR = mk_dir(TEMPDIR+'/cache/') +# We can no longer write into the git tree: +GENERATED_IMAGE_DIR = mk_dir(TMPDIR+'/generate/') +GENERATED_TEXT_DIR = mk_dir(TMPDIR+'/generate_text/') + +# Flat file directories +GENODIR = flat_files('genotype')+'/' +JSON_GENODIR = assert_dir(GENODIR+'json/') + +# SITENAME = 'GN' +# PORTADDR = "http://50.16.251.170" +# BASEHREF = '' + +INFOPAGEHREF = '/dbdoc/%s.html' +CGIDIR = '/webqtl/' #XZ: The variable name 'CGIDIR' should be changed to 'PYTHONDIR' +SCRIPTFILE = 'main.py' + +# GLOSSARYFILE = "/glossary.html" +# REFRESHSTR = '' +# REFRESHDIR = '%s' + SCRIPTFILE +'?sid=%s' -- cgit v1.2.3 From 28ccde8e417b965710bbeef48d468a6b717c10a4 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 20 Apr 2016 10:44:10 +0000 Subject: A few fixes to get the webserver running again --- doc/README.org | 11 ++++++++--- wqflask/utility/tools.py | 1 - wqflask/wqflask/marker_regression/gemma_mapping.py | 4 +--- wqflask/wqflask/marker_regression/marker_regression.py | 4 ++-- 4 files changed, 11 insertions(+), 9 deletions(-) (limited to 'wqflask') diff --git a/doc/README.org b/doc/README.org index ee54f781..3b96717f 100644 --- a/doc/README.org +++ b/doc/README.org @@ -134,12 +134,17 @@ configuration. ** Run your own copy of GN2 -At some point you may want to fix the source code. Clone the GN2 -repository from https://github.com/genenetwork/genenetwork2_diet +At some point you may want to fix the source code. Assuming you have +Guix and Genenetwork2 installed (as described above) clone the GN2 +repository from https://github.com/genenetwork/genenetwork2_diet + +Copy the paths into your terminal from (mainly so PYTHON_PATH and +R_LIBS_SITE are set) + +: guix package --search-paths Inside the repository: -: git clone : cd genenetwork2_diet : ./bin/genenetwork2 diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index 9405a9c6..dd8c4a1e 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -5,7 +5,6 @@ import os import sys from wqflask import app - def get_setting(command_id,guess=None): """Resolve a setting from the environment or the global settings in app.config, with get_valid_path is a function checking whether the diff --git a/wqflask/wqflask/marker_regression/gemma_mapping.py b/wqflask/wqflask/marker_regression/gemma_mapping.py index ae426621..8fb086c1 100644 --- a/wqflask/wqflask/marker_regression/gemma_mapping.py +++ b/wqflask/wqflask/marker_regression/gemma_mapping.py @@ -1,9 +1,7 @@ import os from base import webqtlConfig -from utility.tools import gemma_command - -GEMMA_PATH,GEMMA_COMMAND = gemma_command() +from utility.tools import GEMMA_COMMAND def run_gemma(this_dataset, samples, vals): """Generates p-values for each marker using GEMMA""" diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index 39d7c78a..97949f93 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -1103,5 +1103,5 @@ def get_markers_from_csv(included_markers, p_values, group_name): return markers - if __name__ == '__main__': - import cPickle as pickle +if __name__ == '__main__': + import cPickle as pickle -- cgit v1.2.3 From d531829d6184f444cb9257fe2e220ef3b9f462ab Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Wed, 20 Apr 2016 10:46:57 +0000 Subject: Fix typo --- wqflask/wqflask/show_trait/show_trait.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index e80cf191..79f1c867 100755 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -159,7 +159,7 @@ class ShowTrait(object): def get_mapping_methods(self): '''Only display mapping methods when the dataset group's genotype file exists''' def check_plink_gemma(): - if (os.path.isfile(MAPPYING_PATH+"/"+self.dataset.group.name+".bed") and + if (os.path.isfile(MAPPING_PATH+"/"+self.dataset.group.name+".bed") and os.path.isfile(MAPPING_PATH+"/"+self.dataset.group.name+".map")): return True else: -- cgit v1.2.3 From 18a444eef6253d425bf2e6dc613ca64ec881544e Mon Sep 17 00:00:00 2001 From: zsloan Date: Wed, 20 Apr 2016 16:16:54 +0000 Subject: Added borders to stats table in trait page --- wqflask/wqflask/static/new/javascript/show_trait.js | 4 ++-- wqflask/wqflask/templates/show_trait_statistics.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js index 9e249c28..9d418e9b 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.js +++ b/wqflask/wqflask/static/new/javascript/show_trait.js @@ -190,9 +190,9 @@ } row_line = ""; if (row.url != null) { - row_line += ""; + row_line += ""; } else { - row_line += ""; + row_line += ""; } _ref1 = js_data.sample_group_types; for (key in _ref1) { diff --git a/wqflask/wqflask/templates/show_trait_statistics.html b/wqflask/wqflask/templates/show_trait_statistics.html index 9c5c94b2..9a57b285 100755 --- a/wqflask/wqflask/templates/show_trait_statistics.html +++ b/wqflask/wqflask/templates/show_trait_statistics.html @@ -26,7 +26,7 @@
-
traitmarkertraitLODdCor
" + row.pretty + "" + row.pretty + "" + row.pretty + "" + row.pretty + "
+
-- cgit v1.2.3 From f50b54cc58462860546aa529ff24eb7cea2396df Mon Sep 17 00:00:00 2001 From: zsloan Date: Wed, 20 Apr 2016 18:42:06 +0000 Subject: Interval Mapping now correctly does interval mapping if Marker Regression isn't checked (it used to just "connect the dots" of the marker regression output) Changed "Manhattan Plot" label to "Marker Regr." to accurately reflect what the option does --- wqflask/wqflask/marker_regression/marker_regression.py | 3 +++ wqflask/wqflask/templates/show_trait_mapping_tools.html | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index af320f65..32cdb9af 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -664,6 +664,9 @@ class MarkerRegression(object): def gen_reaper_results(self): genotype = self.dataset.group.read_genotype_file() + if self.manhattan_plot != True: + genotype = genotype.addinterval() + samples, values, variances = self.this_trait.export_informative() trimmed_samples = [] diff --git a/wqflask/wqflask/templates/show_trait_mapping_tools.html b/wqflask/wqflask/templates/show_trait_mapping_tools.html index 620a4631..5d9b0278 100755 --- a/wqflask/wqflask/templates/show_trait_mapping_tools.html +++ b/wqflask/wqflask/templates/show_trait_mapping_tools.html @@ -239,7 +239,7 @@
- +
* only apply to single chromosome physical mapping @@ -165,65 +165,75 @@
- {% if selectedChr == -1 %}
-

- Results -

- - - - - - - - {% if plotScale == "centimorgan" %} - - {% else %} - - {% endif %} - - - - - {% for marker in trimmed_markers %} - - - - {% if LRS_LOD == "LOD" %} - {% if 'lod_score' in marker %} - - {% else %} - - {% endif %} - {% else %} - {% if 'lod_score' in marker %} - - {% else %} - - {% endif %} - {% endif %} - - - - - {% endfor %} - -
Index{{ LRS_LOD }}ChrcMMbLocus
- - {{ loop.index }}{{ '%0.2f' | format(marker.lod_score|float) }}{{ '%0.2f' | format(marker.lrs_value|float / 4.16) }}{{ '%0.2f' | format(marker.lod_score|float * 4.16) }}{{ '%0.2f' | format(marker.lrs_value|float) }}{{marker.chr}}{{ '%0.6f' | format(marker.Mb|float) }} - {{ marker.name }} - -
+ {% if selectedChr == -1 %} +

Results

+ + + + + + + + {% if plotScale == "centimorgan" %} + + {% else %} + + {% endif %} + + + + + {% for marker in trimmed_markers %} + + + + {% if LRS_LOD == "LOD" %} + {% if 'lod_score' in marker %} + + {% else %} + + {% endif %} + {% else %} + {% if 'lod_score' in marker %} + + {% else %} + + {% endif %} + {% endif %} + + + + + {% endfor %} + +
Index{{ LRS_LOD }}ChrcMMbLocus
+ + {{ loop.index }}{{ '%0.2f' | format(marker.lod_score|float) }}{{ '%0.2f' | format(marker.lrs_value|float / 4.16) }}{{ '%0.2f' | format(marker.lod_score|float * 4.16) }}{{ '%0.2f' | format(marker.lrs_value|float) }}{{marker.chr}}{{ '%0.6f' | format(marker.Mb|float) }}{{ marker.name }}
+ {% elif selectedChr > -1 %} +

Interval Analyst

+ + + + {% for header in gene_table_header %} + + {% endfor %} + + + + {% for row in gene_table_body %} + + {% for n in range(row|length) %} + + {% endfor %} + + {% endfor %} + +
{{ header|safe }}
{{ row[n]|safe }}
+ {% endif %}
- {% endif %}
-- cgit v1.2.3 From 95a797509caae727ae204861e5aa9402fdd9ecc4 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Tue, 26 Apr 2016 11:29:42 +0000 Subject: Interval mapping: fix font and image path --- wqflask/wqflask/marker_regression/marker_regression_gn1.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/marker_regression/marker_regression_gn1.py b/wqflask/wqflask/marker_regression/marker_regression_gn1.py index 11e312b2..97e4b934 100644 --- a/wqflask/wqflask/marker_regression/marker_regression_gn1.py +++ b/wqflask/wqflask/marker_regression/marker_regression_gn1.py @@ -42,6 +42,7 @@ from utility import webqtlUtil from utility import helper_functions from utility import Plot from wqflask.interval_analyst import GeneUtil +from base.webqtlConfig import TMPDIR, GENERATED_TEXT_DIR, GENERATED_IMAGE_DIR ######################################### # Inteval Mapping Plot Page @@ -930,7 +931,7 @@ class MarkerRegression(object): bootScale = bootScale[:-1] + [highestPercent] bootOffset = 50*fontZoom - bootScaleFont=Font(ttf="verdana",size=13*fontZoom,bold=0) + bootScaleFont=pid.Font(ttf="verdana",size=13*fontZoom,bold=0) canvas.drawRect(canvas.size[0]-bootOffset,yZero-bootHeightThresh,canvas.size[0]-bootOffset-15*zoom,yZero,fillColor = pid.yellow) canvas.drawLine(canvas.size[0]-bootOffset+4, yZero, canvas.size[0]-bootOffset, yZero, color=pid.black) canvas.drawString('0%' ,canvas.size[0]-bootOffset+10,yZero+5,font=bootScaleFont,color=pid.black) @@ -2581,7 +2582,7 @@ class MarkerRegression(object): Plot.plotBar(myCanvas, perm_output, XLabel=self.LRS_LOD, YLabel='Frequency', title=' Histogram of Permutation Test') filename= webqtlUtil.genRandStr("Reg_") - myCanvas.save(webqtlConfig.IMGDIR+filename, format='gif') + myCanvas.save(GENERATED_IMAGE_DIR+filename, format='gif') return filename -- cgit v1.2.3 From 4d8da2a56ab315a28f0e296690f5ae5b09324615 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Thu, 28 Apr 2016 08:47:56 +0000 Subject: Changed the defunct GeneRIF URL to a working Wikipedia URL (which also points to the non-working NCBI link) --- wqflask/wqflask/templates/index_page.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/templates/index_page.html b/wqflask/wqflask/templates/index_page.html index 5d658bc7..5cc15682 100755 --- a/wqflask/wqflask/templates/index_page.html +++ b/wqflask/wqflask/templates/index_page.html @@ -143,7 +143,7 @@ highly expressed genes (15 to 16 log2 units) AND with peak LRS linkage between 23 and 46. -
  • RIF=mitochondrial searches RNA databases for +
  • RIF=mitochondrial searches RNA databases for GeneRIF links.
  • WIKI=nicotine searches -- cgit v1.2.3 From 6e6482db14c3840328d786c551feea6e34a3ef06 Mon Sep 17 00:00:00 2001 From: zsloan Date: Thu, 28 Apr 2016 18:42:20 +0000 Subject: Added option to export permutation results for mapping page Added data_scale to dataset objects and basic stats table will now check data scale when calculating range Made interval analyst results table work with datatables Changed the appearance of the basic stats table some by giving it a border --- wqflask/base/data_set.py | 74 +--------------------- .../wqflask/marker_regression/marker_regression.py | 12 +++- wqflask/wqflask/show_trait/show_trait.py | 1 + .../wqflask/static/new/javascript/show_trait.js | 4 +- .../wqflask/templates/marker_regression_gn1.html | 31 ++++++++- wqflask/wqflask/templates/show_trait.html | 1 - .../wqflask/templates/show_trait_statistics.html | 2 +- wqflask/wqflask/views.py | 23 +++++++ 8 files changed, 68 insertions(+), 80 deletions(-) mode change 100755 => 100644 wqflask/base/data_set.py (limited to 'wqflask') diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py old mode 100755 new mode 100644 index e37a838f..379e5906 --- a/wqflask/base/data_set.py +++ b/wqflask/base/data_set.py @@ -509,6 +509,7 @@ class DataSet(object): self.shortname = None self.fullname = None self.type = None + self.data_scale = None #ZS: For example log2 self.setup() @@ -569,8 +570,8 @@ class DataSet(object): self.name, self.name)) - self.id, self.name, self.fullname, self.shortname, self.tissue = g.db.execute(""" - SELECT ProbeSetFreeze.Id, ProbeSetFreeze.Name, ProbeSetFreeze.FullName, ProbeSetFreeze.ShortName, Tissue.Name + self.id, self.name, self.fullname, self.shortname, self.data_scale, self.tissue = g.db.execute(""" + SELECT ProbeSetFreeze.Id, ProbeSetFreeze.Name, ProbeSetFreeze.FullName, ProbeSetFreeze.ShortName, ProbeSetFreeze.DataScale, Tissue.Name FROM ProbeSetFreeze, ProbeFreeze, Tissue WHERE ProbeSetFreeze.public > %s AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id AND @@ -1035,75 +1036,6 @@ class MrnaAssayDataSet(DataSet): #print("After retrieve_sample_data") return trait_data - #def get_trait_data(self): - # self.samplelist = self.group.samplelist + self.group.parlist + self.group.f1list - # query = """ - # SELECT Strain.Name, Strain.Id FROM Strain, Species - # WHERE Strain.Name IN {} - # and Strain.SpeciesId=Species.Id - # and Species.name = '{}' - # """.format(create_in_clause(self.samplelist), *mescape(self.group.species)) - # results = dict(g.db.execute(query).fetchall()) - # sample_ids = [results[item] for item in self.samplelist] - # - # # MySQL limits the number of tables that can be used in a join to 61, - # # so we break the sample ids into smaller chunks - # # Postgres doesn't have that limit, so we can get rid of this after we transition - # chunk_size = 50 - # number_chunks = int(math.ceil(len(sample_ids) / chunk_size)) - # trait_sample_data = [] - # for sample_ids_step in chunks.divide_into_chunks(sample_ids, number_chunks): - # - # #XZ, 09/24/2008: build one temporary table that only contains the records associated with the input GeneId - # #tempTable = None - # #if GeneId and db.type == "ProbeSet": - # # if method == "3": - # # tempTable = self.getTempLiteratureTable(species=species, - # # input_species_geneid=GeneId, - # # returnNumber=returnNumber) - # # - # # if method == "4" or method == "5": - # # tempTable = self.getTempTissueCorrTable(primaryTraitSymbol=GeneSymbol, - # # TissueProbeSetFreezeId=tissueProbeSetFreezeId, - # # method=method, - # # returnNumber=returnNumber) - # - # temp = ['T%s.value' % item for item in sample_ids_step] - # query = "SELECT {}.Name,".format(escape(self.type)) - # data_start_pos = 1 - # query += string.join(temp, ', ') - # query += ' FROM ({}, {}XRef, {}Freeze) '.format(*mescape(self.type, - # self.type, - # self.type)) - # - # for item in sample_ids_step: - # query += """ - # left join {}Data as T{} on T{}.Id = {}XRef.DataId - # and T{}.StrainId={}\n - # """.format(*mescape(self.type, item, item, self.type, item, item)) - # - # query += """ - # WHERE {}XRef.{}FreezeId = {}Freeze.Id - # and {}Freeze.Name = '{}' - # and {}.Id = {}XRef.{}Id - # order by {}.Id - # """.format(*mescape(self.type, self.type, self.type, self.type, - # self.name, self.type, self.type, self.type, self.type)) - # results = g.db.execute(query).fetchall() - # trait_sample_data.append(results) - # - # trait_count = len(trait_sample_data[0]) - # self.trait_data = collections.defaultdict(list) - # - # # put all of the separate data together into a dictionary where the keys are - # # trait names and values are lists of sample values - # for trait_counter in range(trait_count): - # trait_name = trait_sample_data[0][trait_counter][0] - # for chunk_counter in range(int(number_chunks)): - # self.trait_data[trait_name] += ( - # trait_sample_data[chunk_counter][trait_counter][data_start_pos:]) - - def get_trait_info(self, trait_list=None, species=''): # Note: setting trait_list to [] is probably not a great idea. diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py index fa439b55..c0bfd70b 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/marker_regression.py @@ -79,6 +79,8 @@ class MarkerRegression(object): self.pair_scan = False # Initializing this since it is checked in views to determine which template to use self.score_type = "LRS" #ZS: LRS or LOD self.mapping_scale = "physic" + self.num_perm = 0 + self.perm_output = [] self.bootstrap_results = [] #ZS: This is passed to GN1 code for single chr mapping @@ -125,13 +127,14 @@ class MarkerRegression(object): try: if int(start_vars['num_perm']) > 0: self.num_perm = int(start_vars['num_perm']) - else: - self.num_perm = 0 except: self.num_perm = 0 self.LRSCheck = self.score_type - self.permCheck = "ON" + if self.num_perm > 0: + self.permCheck = "ON" + else: + self.permCheck = False self.showSNP = "ON" self.showGenes = "ON" self.viewLegend = "ON" @@ -278,6 +281,8 @@ class MarkerRegression(object): mapping_scale = self.mapping_scale, chromosomes = chromosome_mb_lengths, qtl_results = self.qtl_results, + num_perm = self.num_perm, + perm_results = self.perm_output, ) @@ -683,6 +688,7 @@ class MarkerRegression(object): self.perm_output = genotype.permutation(strains = trimmed_samples, trait = trimmed_values, nperm=self.num_perm) self.suggestive = self.perm_output[int(self.num_perm*0.37-1)] self.significant = self.perm_output[int(self.num_perm*0.95-1)] + self.highly_significant = self.perm_output[int(self.num_perm*0.99-1)] self.json_data['suggestive'] = self.suggestive self.json_data['significant'] = self.significant diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index 2d4c952a..156510bb 100755 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -153,6 +153,7 @@ class ShowTrait(object): self.trait_table_width = get_trait_table_width(self.sample_groups) js_data = dict(dataset_type = self.dataset.type, + data_scale = self.dataset.data_scale, sample_group_types = self.sample_group_types, sample_lists = sample_lists, attribute_names = self.sample_groups[0].attributes, diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js index 9d418e9b..9e249c28 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.js +++ b/wqflask/wqflask/static/new/javascript/show_trait.js @@ -190,9 +190,9 @@ } row_line = ""; if (row.url != null) { - row_line += "" + row.pretty + ""; + row_line += "" + row.pretty + ""; } else { - row_line += "" + row.pretty + ""; + row_line += "" + row.pretty + ""; } _ref1 = js_data.sample_group_types; for (key in _ref1) { diff --git a/wqflask/wqflask/templates/marker_regression_gn1.html b/wqflask/wqflask/templates/marker_regression_gn1.html index 7f269048..d86d981e 100644 --- a/wqflask/wqflask/templates/marker_regression_gn1.html +++ b/wqflask/wqflask/templates/marker_regression_gn1.html @@ -22,6 +22,7 @@ + @@ -148,9 +149,12 @@
    A positive additive coefficient (green line) indicates that {{ dataset.group.parlist[1] }} alleles increase trait values. In contrast, a negative additive coefficient (orange line) indicates that {{ dataset.group.parlist[0] }} alleles increase trait values. {% endif %} - {% if nperm > 0 %} + {% if nperm > 0 and permChecked == "ON" %}

    +

    + Total of {{ nperm }} permutations  Download Permutation Results +
    {% endif %}
  • @@ -292,7 +296,20 @@ "scrollCollapse": true, "paging": false } ); - console.timeEnd("Creating table"); + + $('#interval_analyst').dataTable( { + "columnDefs": [ { + "targets": 0, + "sortable": false + }], + "order": [[3, "asc"]], + "sDom": "RZtir", + "iDisplayLength": -1, + "autoWidth": true, + "bDeferRender": true, + "bSortClasses": false, + "paging": false + } ); $('#vector_map_tab').click(function(){ $('div#gn1_map_options').hide(); @@ -325,6 +342,16 @@ return $('#marker_regression_form').submit(); }; + export_perm_data = function() { + var num_perm, perm_data; + num_perm = js_data.num_perm + perm_data = js_data.perm_results + json_perm_data = JSON.stringify(perm_data); + $('input[name=perm_results]').val(json_perm_data); + $('#marker_regression_form').attr('action', '/export_perm_data'); + return $('#marker_regression_form').submit(); + }; + {% endblock %} diff --git a/wqflask/wqflask/templates/show_trait.html b/wqflask/wqflask/templates/show_trait.html index 7429cd5f..64638fc7 100755 --- a/wqflask/wqflask/templates/show_trait.html +++ b/wqflask/wqflask/templates/show_trait.html @@ -254,7 +254,6 @@ } ); {% endif %} - console.log("SAMPLE GROUP TYPES:", js_data.sample_group_types) if (Object.keys(js_data.sample_group_types).length > 1) { $('#stats_table').DataTable( { "columnDefs": [ diff --git a/wqflask/wqflask/templates/show_trait_statistics.html b/wqflask/wqflask/templates/show_trait_statistics.html index 9a57b285..242f1c26 100755 --- a/wqflask/wqflask/templates/show_trait_statistics.html +++ b/wqflask/wqflask/templates/show_trait_statistics.html @@ -26,7 +26,7 @@
    -
    +
    diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 3bf64a18..3cdb9339 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -265,6 +265,29 @@ def export_trait_csv(): return Response(csv_data, mimetype='text/csv', headers={"Content-Disposition":"attachment;filename=sample_data.csv"}) + +@app.route('/export_perm_data', methods=('POST',)) +def export_perm_data(): + """CSV file consisting of the permutation data for the mapping results""" + num_perm = float(request.form['num_perm']) + perm_data = json.loads(request.form['perm_results']) + + buff = StringIO.StringIO() + writer = csv.writer(buff) + writer.writerow(["Suggestive LRS (p=0.63) = " + str(perm_data[int(num_perm*0.37-1)])]) + writer.writerow(["Significant LRS (p=0.05) = " + str(perm_data[int(num_perm*0.95-1)])]) + writer.writerow(["Highly Significant LRS (p=0.01) = " + str(perm_data[int(num_perm*0.99-1)])]) + writer.writerow("") + writer.writerow([str(num_perm) + " Permutations"]) + writer.writerow("") + for item in perm_data: + writer.writerow([item]) + csv_data = buff.getvalue() + buff.close() + + return Response(csv_data, + mimetype='text/csv', + headers={"Content-Disposition":"attachment;filename=perm_data.csv"}) @app.route("/show_trait") def show_trait_page(): -- cgit v1.2.3 From f8960a0a668cf90b88a06c3c2f977062160a211e Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 29 Apr 2016 03:29:44 -0500 Subject: Plotting: using cairo-png for headless environments --- wqflask/wqflask/ctl/ctl_analysis.py | 4 ++-- wqflask/wqflask/wgcna/wgcna_analysis.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py index d79d9bfe..7a42b2f8 100644 --- a/wqflask/wqflask/ctl/ctl_analysis.py +++ b/wqflask/wqflask/ctl/ctl_analysis.py @@ -152,7 +152,7 @@ class CTL(object): self.results['requestform'] = requestform # Store the user specified parameters for the output page # Create the lineplot - r_png(self.results['imgloc1'], width=1000, height=600) + r_png(self.results['imgloc1'], width=1000, height=600, type='cairo-png') self.r_lineplot(res, significance = significance) r_dev_off() @@ -161,7 +161,7 @@ class CTL(object): # Create the QTL like CTL plots self.results['imgurl' + str(n)] = webqtlUtil.genRandStr("CTL_") + ".png" self.results['imgloc' + str(n)] = GENERATED_IMAGE_DIR + self.results['imgurl' + str(n)] - r_png(self.results['imgloc' + str(n)], width=1000, height=600) + r_png(self.results['imgloc' + str(n)], width=1000, height=600, type='cairo-png') self.r_plotCTLobject(res, (n-1), significance = significance, main='Phenotype ' + trait) r_dev_off() n = n + 1 diff --git a/wqflask/wqflask/wgcna/wgcna_analysis.py b/wqflask/wqflask/wgcna/wgcna_analysis.py index 6901712b..880a1cb2 100644 --- a/wqflask/wqflask/wgcna/wgcna_analysis.py +++ b/wqflask/wqflask/wgcna/wgcna_analysis.py @@ -128,7 +128,7 @@ class WGCNA(object): # The iconic WCGNA plot of the modules in the hanging tree self.results['imgurl'] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png" self.results['imgloc'] = GENERATED_IMAGE_DIR + self.results['imgurl'] - r_png(self.results['imgloc'], width=1000, height=600) + r_png(self.results['imgloc'], width=1000, height=600, type='cairo-png') mergedColors = self.r_labels2colors(network[1]) self.r_plotDendroAndColors(network[5][0], mergedColors, "Module colors", dendroLabels = False, hang = 0.03, addGuide = True, guideHang = 0.05) r_dev_off() -- cgit v1.2.3 From 51599a8d7b4abc11f9f6a658a2451f0ee0eacbe5 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 29 Apr 2016 09:48:45 +0000 Subject: Updated mailing list URL --- wqflask/wqflask/templates/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html index f25bf9f7..701af140 100755 --- a/wqflask/wqflask/templates/base.html +++ b/wqflask/wqflask/templates/base.html @@ -151,7 +151,7 @@ -- cgit v1.2.3 From 9ceffdac4d39b0e2086975bd4aad65c2a7626824 Mon Sep 17 00:00:00 2001 From: Pjotr Prins Date: Fri, 29 Apr 2016 10:01:50 +0000 Subject: URL: removed _blank from first URL --- wqflask/wqflask/templates/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html index 701af140..b4fdbd8e 100755 --- a/wqflask/wqflask/templates/base.html +++ b/wqflask/wqflask/templates/base.html @@ -151,7 +151,7 @@ -- cgit v1.2.3 From 78c472aeb77fb76c54ac93f5811425e05888983f Mon Sep 17 00:00:00 2001 From: zsloan Date: Fri, 29 Apr 2016 16:52:36 +0000 Subject: Fixed links in correlation descriptions on trait page and removed target=_blank (so will not open in new window unless user specifies) Fixed javascript so description changes when user changes the method and "Type" option is removed for literature correlation --- wqflask/wqflask/static/new/javascript/show_trait.js | 9 ++++----- .../templates/show_trait_calculate_correlations.html | 16 ++++++++-------- 2 files changed, 12 insertions(+), 13 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js index 9e249c28..2fa77ae0 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.js +++ b/wqflask/wqflask/static/new/javascript/show_trait.js @@ -296,18 +296,17 @@ }; on_corr_method_change = function() { var corr_method; - console.log("in beginning of on_corr_method_change"); - corr_method = $('select[name=corr_method]').val(); + corr_method = $('select[name=corr_type]').val(); console.log("corr_method is:", corr_method); $('.correlation_desc').hide(); $('#' + corr_method + "_r_desc").show().effect("highlight"); if (corr_method === "lit") { - return $("#corr_sample_method_options").hide(); + return $("#corr_sample_method").hide(); } else { - return $("#corr_sample_method_options").show(); + return $("#corr_sample_method").show(); } }; - $('select[name=corr_method]').change(on_corr_method_change); + $('select[name=corr_type]').change(on_corr_method_change); submit_special = function(url) { $("#trait_data_form").attr("action", url); diff --git a/wqflask/wqflask/templates/show_trait_calculate_correlations.html b/wqflask/wqflask/templates/show_trait_calculate_correlations.html index ed58b32c..80fafa5e 100755 --- a/wqflask/wqflask/templates/show_trait_calculate_correlations.html +++ b/wqflask/wqflask/templates/show_trait_calculate_correlations.html @@ -63,7 +63,7 @@
    -
    +