aboutsummaryrefslogtreecommitdiff
path: root/wqflask
diff options
context:
space:
mode:
Diffstat (limited to 'wqflask')
-rw-r--r--wqflask/base/species.py27
-rw-r--r--wqflask/maintenance/convert_geno_to_bimbam.py2
-rw-r--r--wqflask/wqflask/marker_regression/gemma_mapping.py4
-rw-r--r--wqflask/wqflask/show_trait/show_trait.py2
-rw-r--r--wqflask/wqflask/snp_browser/__init__.py0
-rw-r--r--wqflask/wqflask/snp_browser/snp_browser.py500
-rw-r--r--wqflask/wqflask/templates/correlation_page.html1
-rw-r--r--wqflask/wqflask/templates/snp_browser.html242
-rw-r--r--wqflask/wqflask/views.py8
9 files changed, 773 insertions, 13 deletions
diff --git a/wqflask/base/species.py b/wqflask/base/species.py
index 4ac2213c..6d99af65 100644
--- a/wqflask/base/species.py
+++ b/wqflask/base/species.py
@@ -14,10 +14,13 @@ from utility.logger import getLogger
logger = getLogger(__name__ )
class TheSpecies(object):
- def __init__(self, dataset):
- self.dataset = dataset
- #print("self.dataset is:", pf(self.dataset.__dict__))
- self.chromosomes = Chromosomes(self.dataset)
+ def __init__(self, dataset=None, species_name=None):
+ if species_name != None:
+ self.name = species_name
+ self.chromosomes = Chromosomes(species=self.name)
+ else:
+ self.dataset = dataset
+ self.chromosomes = Chromosomes(dataset=self.dataset)
class IndChromosome(object):
def __init__(self, name, length):
@@ -30,11 +33,21 @@ class IndChromosome(object):
return self.length / 1000000
class Chromosomes(object):
- def __init__(self, dataset):
- self.dataset = dataset
+ def __init__(self, dataset=None, species=None):
self.chromosomes = collections.OrderedDict()
+ if species != None:
+ query = """
+ Select
+ Chr_Length.Name, Chr_Length.OrderId, Length from Chr_Length, Species
+ where
+ Chr_Length.SpeciesId = Species.SpeciesId AND
+ Species.Name = '%s'
+ Order by OrderId
+ """ % species.capitalize()
+ else:
+ self.dataset = dataset
- query = """
+ query = """
Select
Chr_Length.Name, Chr_Length.OrderId, Length from Chr_Length, InbredSet
where
diff --git a/wqflask/maintenance/convert_geno_to_bimbam.py b/wqflask/maintenance/convert_geno_to_bimbam.py
index a5d2d12a..8f331a06 100644
--- a/wqflask/maintenance/convert_geno_to_bimbam.py
+++ b/wqflask/maintenance/convert_geno_to_bimbam.py
@@ -140,6 +140,8 @@ class ConvertGenoFile(object):
key, _separater, value = row.partition(':')
key = key.strip()
value = value.strip()
+ if key == "@filler":
+ raise EmptyConfigurations
if key in self.haplotype_notation:
self.configurations[value] = self.haplotype_notation[key]
continue
diff --git a/wqflask/wqflask/marker_regression/gemma_mapping.py b/wqflask/wqflask/marker_regression/gemma_mapping.py
index 11feaa98..c17f21aa 100644
--- a/wqflask/wqflask/marker_regression/gemma_mapping.py
+++ b/wqflask/wqflask/marker_regression/gemma_mapping.py
@@ -49,9 +49,7 @@ def run_gemma(this_dataset, samples, vals, covariates, use_loco, maf=0.01):
logger.debug("k_command:" + generate_k_command)
os.system(generate_k_command)
- gemma_command = GEMMA_WRAPPER_COMMAND + ' --json --loco --input %s/gn2/%s.json -- '+GEMMAOPTS+' -g %s/%s_geno.txt -p %s/%s_pheno.txt' % (TEMPDIR,
- k_output_filename,
- flat_files('genotype/bimbam'),
+ gemma_command = GEMMA_WRAPPER_COMMAND + ' --json --loco --input %s/gn2/%s.json -- ' % (TEMPDIR, k_output_filename) + GEMMAOPTS + ' -g %s/%s_geno.txt -p %s/%s_pheno.txt' % (flat_files('genotype/bimbam'),
genofile_name,
flat_files('genotype/bimbam'),
genofile_name)
diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py
index 7b9dc969..3f5030b2 100644
--- a/wqflask/wqflask/show_trait/show_trait.py
+++ b/wqflask/wqflask/show_trait/show_trait.py
@@ -16,8 +16,6 @@ import scipy.stats as ss
from flask import Flask, g
-from htmlgen import HTMLgen2 as HT
-
from base import webqtlConfig
from base import webqtlCaseData
from wqflask.show_trait.SampleList import SampleList
diff --git a/wqflask/wqflask/snp_browser/__init__.py b/wqflask/wqflask/snp_browser/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/wqflask/wqflask/snp_browser/__init__.py
diff --git a/wqflask/wqflask/snp_browser/snp_browser.py b/wqflask/wqflask/snp_browser/snp_browser.py
new file mode 100644
index 00000000..df68d4a0
--- /dev/null
+++ b/wqflask/wqflask/snp_browser/snp_browser.py
@@ -0,0 +1,500 @@
+from __future__ import absolute_import, print_function, division
+
+from flask import Flask, g
+
+import string
+
+from utility.logger import getLogger
+logger = getLogger(__name__ )
+
+from base import species
+
+class SnpBrowser(object):
+
+ MAXSNPRETURN = 5000
+
+ def __init__(self, start_vars):
+ self.strain_list = get_browser_sample_list()
+ self.initialize_parameters(start_vars)
+
+ if self.first_run == "false":
+ if self.limit_strains == "true":
+ self.header_fields = get_header_list(self.variant_type, self.chosen_strains)
+ else:
+ self.header_fields = get_header_list(self.variant_type, self.strain_list)
+ self.filtered_results = self.get_table_results()
+
+ def initialize_parameters(self, start_vars):
+ self.first_run = "true"
+ self.allele_list = []
+ if 'variant' in start_vars: #ZS: Check if not first time loaded (if it has form input)
+ self.first_run = "false"
+ self.variant_type = start_vars['variant']
+ self.species_name = start_vars['species']
+ if self.species_name.capitalize() == "Mouse":
+ self.species_id = 1
+ elif self.species_name.capitalize() == "Rat":
+ self.species_id = 2
+ else:
+ self.species_id = 0 #Using this to indicate "All Species"
+
+ #ZS: Currently this is just assuming mouse for determining the chromosomes.
+ # This logic may have to change depending upon what other species are added or how we want to deal with an "All Species" option
+ self.chr_list = []
+ species_ob = species.TheSpecies(species_name="Mouse")
+ for key in species_ob.chromosomes.chromosomes:
+ self.chr_list.append(species_ob.chromosomes.chromosomes[key].name)
+
+ if start_vars['gene_name'] != "":
+ self.gene_name = start_vars['gene_name']
+ else:
+ self.gene_name = ""
+ self.chr = start_vars['chr']
+ try:
+ self.start_mb = float(start_vars['start_mb'])
+ self.end_mb = float(start_vars['end_mb'])
+ except:
+ self.start_mb = 0.0
+ self.end_mb = 0.0
+
+ if 'limit_strains' in start_vars:
+ self.limit_strains = "true"
+ else:
+ self.limit_strains = "false"
+ self.chosen_strains = start_vars['chosen_strains'].split(",")
+ self.domain = start_vars['domain']
+ self.function = start_vars['function']
+ self.source = start_vars['source']
+ self.criteria = start_vars['criteria']
+ self.score = start_vars['score']
+
+ self.redundant = "false"
+ self.diff_alleles = "false"
+ if 'redundant' in start_vars:
+ self.redundant = "true"
+ if 'diff_alleles' in start_vars:
+ self.diff_alleles = "true"
+
+ else: #ZS: Default values
+ self.variant_type = "SNP"
+ self.species_name = "Mouse"
+ species_ob = species.TheSpecies(species_name=self.species_name)
+ self.chr_list = []
+ for key in species_ob.chromosomes.chromosomes:
+ self.chr_list.append(species_ob.chromosomes.chromosomes[key].name)
+
+ self.chr = "19"
+ self.start_mb = 30.1
+ self.end_mb = 30.12
+
+ self.limit_strains = "true"
+
+ self.chosen_strains = ["C57BL/6J",
+ "DBA/2J",
+ "A/J",
+ "129S1/SvImJ",
+ "NOD/ShiLtJ",
+ "NZO/HlLtJ",
+ "WSB/EiJ",
+ "PWK/PhJ",
+ "CAST/EiJ"]
+
+ self.domain = "All"
+ self.function = "All"
+ self.source = "All"
+ self.criteria = ">="
+ self.score = 0.0
+
+ self.redundant = "false"
+ self.diff_alleles = "true"
+
+ def get_table_results(self):
+ self.snp_list = None
+
+ if self.gene_name != "":
+ query = "SELECT geneSymbol, chromosome, txStart, txEnd FROM GeneList WHERE SpeciesId = %s AND geneSymbol = %s" % (self.species_id, self.gene_name)
+ result = g.db.execute(query).fetchone()
+ if result:
+ self.gene_name, self.chr, self.start_mb, self.end_mb = result
+ else:
+ result_snp = None
+ if self.variant_type == "SNP":
+ if self.gene_name[:2] == "rs":
+ query = "SELECT Id, Chromosome, Position, Position+0.000001 FROM SnpAll WHERE Rs = %s" % self.gene_name
+ else:
+ query = "SELECT Id, Chromosome, Position, Position+0.000001 ForM SnpAll where SpeciesId = %s AND SnpName = %s" % (self.species_id, self.gene_name)
+ result_snp = g.db.execute(query).fetchall()
+ if result_snp:
+ self.snp_list = [item[0] for item in result_snp]
+ self.chr = result_snp[0][1]
+ self.start_mb = result_snp[0][2]
+ self.end_mb = result_snp[0][3]
+ else:
+ return
+ elif self.variant_type == "InDel":
+ if self.gene_name[0] == "I":
+ query = "SELECT Id, Chromosome, Mb_start, Mb_end FROM IndelAll WHERE SpeciesId = %s AND Name = %s" % (self.species_id, self.gene_name)
+ result_snp = g.db.execute(query).fetchall()
+ if result_snp:
+ self.snp_list = [item[0] for item in result_snp]
+ self.chr = result_snp[0][1]
+ self.start_mb = result_snp[0][2]
+ self.end_mb = result_snp[0][3]
+ else:
+ return
+
+ if self.variant_type == "SNP":
+ query = """
+ SELECT
+ a.*, b.*
+ FROM
+ SnpAll a, SnpPattern b
+ WHERE
+ a.SpeciesId = %s AND a.Chromosome = '%s' AND
+ a.Position >= %.6f AND a.Position < %.6f AND
+ a.Id = b.SnpId
+ ORDER BY a.Position
+ """ % (self.species_id, self.chr, self.start_mb, self.end_mb)
+ elif self.variant_type == "InDel":
+ query = """
+ SELECT
+ DISTINCT a.Name, a.Chromosome, a.SourceId, a.Mb_start, a.Mb_end, a.Strand, a.Type, a.Size, a.InDelSequence, b.Name
+ FROM
+ IndelAll a, SnpSource b
+ WHERE
+ a.SpeciesId = '%s' AND a.Chromosome = '%s' AND
+ a.Mb_start >= %2.6f AND a.Mb_start < (%2.6f+.0010) AND
+ b.Id = a.SourceId
+ ORDER BY a.Mb_start
+ """ % (self.species_id, self.chr, self.start_mb, self.end_mb)
+
+ results_all = g.db.execute(query).fetchall()
+
+ return self.filter_results(results_all)
+
+ def filter_results(self, results):
+ filtered_results = []
+ strain_index_list = [] #ZS: List of positions of selected strains in strain list
+ last_mb = -1
+
+ if self.limit_strains == "true" and len(self.chosen_strains) > 0:
+ for item in self.chosen_strains:
+ index = self.strain_list.index(item)
+ strain_index_list.append(index)
+
+ for seq, result in enumerate(results):
+ result = list(result)
+
+ if self.variant_type == "SNP":
+ display_strains = []
+ snp_id, species_id, snp_name, rs, chr, mb, mb_2016, alleles, snp_source, conservation_score = result[:10]
+ effect_list = result[10:26]
+ self.allele_list = result[27:]
+
+ if self.limit_strains == "true" and len(self.chosen_strains) > 0:
+ for index in strain_index_list:
+ display_strains.append(result[27+index])
+ self.allele_list = display_strains
+
+ effect_info_dict = get_effect_info(effect_list)
+ coding_domain_list = ['Start Gained', 'Start Lost', 'Stop Gained', 'Stop Lost', 'Nonsynonymous', 'Synonymous']
+ intron_domain_list = ['Splice Site', 'Nonsplice Site']
+
+ for key in effect_info_dict:
+ if key in coding_domain_list:
+ domain = ['Exon', 'Coding']
+ elif key in ['3\' UTR', '5\' UTR']:
+ domain = ['Exon', key]
+ elif key == "Unknown Effect In Exon":
+ domain = ['Exon', '']
+ elif key in intron_domain_list:
+ domain = ['Intron', key]
+ else:
+ domain = [key, '']
+
+ if 'Intergenic' in domain:
+ gene = transcript = exon = function = function_details = ''
+ if self.redundant == "false" or last_mb != mb: # filter redundant
+ if self.include_record(domain, function, snp_source, conservation_score):
+ info_list = [snp_name, rs, chr, mb, alleles, gene, transcript, exon, domain, function, function_details, snp_source, conservation_score, snp_id]
+ info_list.extend(self.allele_list)
+ filtered_results.append(info_list)
+ last_mb = mb
+ else:
+ gene_list, transcript_list, exon_list, function_list, function_details_list = effect_info_dict[key]
+ for index, item in enumerate(gene_list):
+ gene = item
+ transcript = transcript_list[index]
+ if exon_list:
+ exon = exon_list[index]
+ else:
+ exon = ""
+
+ if function_list:
+ function = function_list[index]
+ if function == "Unknown Effect In Exon":
+ function = "Unknown"
+ else:
+ function = ""
+
+ if function_details_list:
+ function_details = "Biotype: " + function_details_list[index]
+ else:
+ function_details = ""
+
+ if self.redundant == "false" or last_mb != mb:
+ if self.include_record(domain, function, snp_source, conservation_score):
+ info_list = [snp_name, rs, chr, mb, alleles, gene, transcript, exon, domain, function, function_details, snp_source, conservation_score, snp_id]
+ info_list.extend(self.allele_list)
+ filtered_results.append(info_list)
+ last_mb = mb
+
+ elif self.variant == "InDel":
+ # The order of variables is important; this applies to anything from the variant table as indel
+ indel_name, indel_chr, source_id, indel_mb_start, indel_mb_end, indel_strand, indel_type, indel_size, indel_sequence, source_name = result
+
+ indel_type = indel_type.title()
+ if self.redundant == "false" or last_mb != indel_mb_start:
+ gene = "No Gene"
+ domain = conservation_score = snp_id = snp_name = rs = flank_3 = flank_5 = ncbi = function = ""
+ if self.include_record(domain, function, source_name, conservation_score):
+ filtered_results.append([indel_name, indel_chr, indel_mb_start, indel_mb_end, indel_strand, indel_type, indel_size, indel_sequence, source_name])
+ last_mb = indel_mb_start
+
+ else:
+ filtered_results.append(result)
+
+ return filtered_results
+
+ def include_record(self, domain, function, snp_source, conservation_score):
+ """ Decide whether to add this record """
+
+ domain_satisfied = True
+ function_satisfied = True
+ different_alleles_satisfied = True
+ source_satisfied = True
+
+ if domain:
+ if len(domain) == 0:
+ if self.domain != "All":
+ domain_satisfied = False
+ else:
+ domain_satisfied = False
+ if domain[0].startswith(self.domain) or domain[1].startswith(self.domain) or self.domain == "All":
+ domain_satisfied = True
+ else:
+ if self.domain != "All":
+ domain_satisfied = False
+
+ if snp_source:
+ if len(snp_source) == 0:
+ if self.source != "All":
+ source_satisfied = False
+ else:
+ source_satisfied = False
+ if snp_source.startswith(self.source) or self.source == "All":
+ source_satisfied = True
+ else:
+ if self.source != "All":
+ source_satisfied = False
+
+ if function:
+ if len(function) == 0:
+ if self.function != "All":
+ function_satisfied = False
+ else:
+ function_satisfied = False
+ if function.startswith(self.function):
+ function_satisfied = True
+ else:
+ if self.function != "All":
+ function_satisfied = False
+
+ if conservation_score:
+ score_as_float = float(conservation_score)
+ try:
+ input_score_float = float(self.score) # the user-input score
+ except:
+ input_score_float = 0.0
+
+ if self.criteria == ">=":
+ if score_as_float >= input_score_float:
+ score_satisfied = True
+ else:
+ score_satisfied = False
+ elif self.criteria == "==":
+ if score_as_float == input_score_float:
+ score_satisfied = True
+ else:
+ score_satisfied = False
+ elif self.criteria == "<=":
+ if score_as_float <= input_score_float:
+ score_satisfied = True
+ else:
+ score_satisfied = False
+ else:
+ try:
+ if float(self.score) > 0:
+ score_satisfied = False
+ else:
+ score_satisfied = True
+ except:
+ score_satisfied = True
+
+ if self.variant_type == "SNP" and self.diff_alleles == "true":
+ this_allele_list = []
+
+ for item in self.allele_list:
+ if item and (item.lower() not in this_allele_list) and (item != "-"):
+ this_allele_list.append(item.lower())
+
+ total_allele_count = len(this_allele_list)
+ if total_allele_count <= 1:
+ different_alleles_satisfied = False
+ else:
+ different_alleles_satisfied = True
+ else:
+ different_alleles_satisfied = True
+
+ return domain_satisfied and function_satisfied and source_satisfied and score_satisfied and different_alleles_satisfied
+
+def get_browser_sample_list(species_id=1):
+ sample_list = []
+ query = "SHOW COLUMNS FROM SnpPattern;"
+ results = g.db.execute(query).fetchall();
+ for result in results[1:]:
+ sample_list.append(result[0])
+
+ return sample_list
+
+def get_header_list(variant_type, strain_list):
+ if variant_type == "SNP":
+ header_fields = ['Index', 'SNP ID', 'Chr', 'Mb', 'Alleles', 'Source', 'ConScore', 'Gene', 'Transcript', 'Exon', 'Domain 1', 'Domain 2', 'Function', 'Details']
+ header_fields.extend(strain_list)
+ elif variant_type == "InDel":
+ header_fields = ['Index', 'ID', 'Type', 'InDel Chr', 'Mb Start', 'Mb End', 'Strand', 'Size', 'Sequence', 'Source']
+ else:
+ header_fields = []
+
+ return header_fields
+
+def get_effect_details_by_category(effect_name = None, effect_value = None):
+ gene_list = []
+ transcript_list = []
+ exon_list = []
+ function_list = []
+ function_detail_list = []
+ tmp_list = []
+
+ gene_group_list = ['Upstream', 'Downstream', 'Splice Site', 'Nonsplice Site', '3\' UTR']
+ biotype_group_list = ['Unknown Effect In Exon', 'Start Gained', 'Start Lost', 'Stop Gained', 'Stop Lost', 'Nonsynonymous', 'Synonymous']
+ new_codon_group_list = ['Start Gained']
+ codon_effect_group_list = ['Start Lost', 'Stop Gained', 'Stop Lost', 'Nonsynonymous', 'Synonymous']
+
+ effect_detail_list = string.split(string.strip(effect_value), '|')
+ effect_detail_list = map(string.strip, effect_detail_list)
+
+ for index, item in enumerate(effect_detail_list):
+ item_list = string.split(string.strip(item), ',')
+ item_list = map(string.strip, item_list)
+
+ gene_id = item_list[0]
+ gene_name = item_list[1]
+ gene_list.append([gene_id, gene_name])
+ transcript_list.append(item_list[2])
+
+ if effect_name not in gene_group_list:
+ exon_id = item_list[3]
+ exon_rank = item_list[4]
+ exon_list.append([exon_id, exon_rank])
+
+ if effect_name in biotype_group_list:
+ biotype = item_list[5]
+ function_list.append(effect_name)
+
+ if effect_name in new_codon_group_list:
+ new_codon = item_list[6]
+ tmp_list = [biotype, new_codon]
+ function_detail_list.append(string.join(tmp_list, ", "))
+ elif effect_name in codon_effect_group_list:
+ old_new_AA = item_list[6]
+ old_new_codon = item_list[7]
+ codon_num = item_list[8]
+ tmp_list = [biotype, old_new_AA, old_new_codon, codon_num]
+ function_detail_list.append(string.join(tmp_list, ", "))
+ else:
+ function_detail_list.append(biotype)
+
+ return [gene_list, transcript_list, exon_list, function_list, function_detail_list]
+
+def get_effect_info(effect_list):
+ domain = ""
+ effect_detail_list = []
+ effect_info_dict = {}
+
+ prime3_utr, prime5_utr, upstream, downstream, intron, nonsplice_site, splice_site, intergenic = effect_list[:8]
+ exon, non_synonymous_coding, synonymous_coding, start_gained, start_lost, stop_gained, stop_lost, unknown_effect_in_exon = effect_list[8:]
+
+ if intergenic:
+ domain = "Intergenic"
+ effect_info_dict[domain] = ""
+ else:
+ # if not exon, get gene list/transcript list info
+ if upstream:
+ domain = "Upstream"
+ effect_detail_list = get_effect_details_by_category(effect_name='Upstream', effect_value=upstream)
+ effect_info_dict[domain] = effect_detail_list
+ if downstream:
+ domain = "Downstream"
+ effect_detail_list = get_effect_details_by_category(effect_name='Downstream', effect_value=downstream)
+ effect_info_dict[domain] = effect_detail_list
+ if intron:
+ if splice_site:
+ domain = "Splice Site"
+ effect_detail_list = get_effect_details_by_category(effect_name='Splice Site', effect_value=splice_site)
+ effect_info_dict[domain] = effect_detail_list
+ if nonsplice_site:
+ domain = "Downstream"
+ effect_detail_list = get_effect_details_by_category(effect_name='Nonsplice Site', effect_value=nonsplice_site)
+ effect_info_dict[domain] = effect_detail_list
+ # get gene, transcript_list, and exon info
+ if prime3_utr:
+ domain = "3\' UTR"
+ effect_detail_list = get_effect_details_by_category(effect_name='3\' UTR', effect_value=prime3_utr)
+ effect_info_dict[domain] = effect_detail_list
+ if prime5_utr:
+ domain = "5\' UTR"
+ effect_detail_list = get_effect_details_by_category(effect_name='5\' UTR', effect_value=prime5_utr)
+ effect_info_dict[domain] = effect_detail_list
+
+ if start_gained:
+ domain = "Start Gained"
+ effect_detail_list = get_effect_details_by_category(effect_name='Start Gained', effect_value=start_gained)
+ effect_info_dict[domain] = effect_detail_list
+ if unknown_effect_in_exon:
+ domain = "Unknown Effect In Exon"
+ effect_detail_list = get_effect_details_by_category(effect_name='Unknown Effect In Exon', effect_value=unknown_effect_in_exon)
+ effect_info_dict[domain] = effect_detail_list
+ if start_lost:
+ domain = "Start Lost"
+ effect_detail_list = get_effect_details_by_category(effect_name='Start Lost', effect_value=start_lost)
+ effect_info_dict[domain] = effect_detail_list
+ if stop_gained:
+ domain = "Stop Gained"
+ effect_detail_list = get_effect_details_by_category(effect_name='Stop Gained', effect_value=stop_gained)
+ effect_info_dict[domain] = effect_detail_list
+ if stop_lost:
+ domain = "Stop Lost"
+ effect_detail_list = get_effect_details_by_category(effect_name='Stop Lost', effect_value=stop_lost)
+ effect_info_dict[domain] = effect_detail_list
+
+ if non_synonymous_coding:
+ domain = "Nonsynonymous"
+ effect_detail_list = get_effect_details_by_category(effect_name='Nonsynonymous', effect_value=non_synonymous_coding)
+ effect_info_dict[domain] = effect_detail_list
+ if synonymous_coding:
+ domain = "Synonymous"
+ effect_detail_list = get_effect_details_by_category(effect_name='Synonymous', effect_value=synonymous_coding)
+ effect_info_dict[domain] = effect_detail_list
+
+ return effect_info_dict
diff --git a/wqflask/wqflask/templates/correlation_page.html b/wqflask/wqflask/templates/correlation_page.html
index 05136ad8..2d4ed2a4 100644
--- a/wqflask/wqflask/templates/correlation_page.html
+++ b/wqflask/wqflask/templates/correlation_page.html
@@ -1,6 +1,5 @@
{% extends "base.html" %}
{% block css %}
- <link rel="stylesheet" type="text/css" href="/static/new/packages/tabulator/css/tabulator.css" />
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" />
{% endblock %}
diff --git a/wqflask/wqflask/templates/snp_browser.html b/wqflask/wqflask/templates/snp_browser.html
new file mode 100644
index 00000000..cbce1449
--- /dev/null
+++ b/wqflask/wqflask/templates/snp_browser.html
@@ -0,0 +1,242 @@
+{% extends "base.html" %}
+{% block css %}
+ <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
+ <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" />
+ <link rel="stylesheet" type="text/css" href="/static/new/css/snp_browser.css" />
+{% endblock %}
+{% block content %}
+
+ <div class="container-fluid">
+ <h2>Variant Browser <a class="btn btn-primary" href="http://genenetwork.org/snpbrowser.html" role="button">Info</a></h2>
+
+ <div class="container" style="border-style: double; position: relative; width: 60%; padding-top: 10px; padding-right: 40px;">
+ <form id="snp_browser_form" method="get" action="/snp_browser">
+ <input type="hidden" name="chosen_strains">
+ <div class="col-xs-4" style="padding-left: 0px;">
+ <div class="form-group row" style="margin-bottom: 5px;">
+ <label for="snp_or_indel" style="text-align: right;" class="col-xs-4 col-form-label"><b>Type:</b></label>
+ <div class="col-xs-8">
+ <select name="variant">
+ <option value="SNP" selected>SNP</option>
+ <option value="InDel">InDel</option>
+ </select>
+ </div>
+ </div>
+ <div class="form-group row" style="margin-bottom: 5px;">
+ <label for="species" style="text-align: right;" class="col-xs-4 col-form-label"><b>Species:</b></label>
+ <div class="col-xs-8">
+ <select name="species">
+ <option value="Mouse" selected>Mouse</option>
+ <option value="Rat">Rat</option>
+ <option value="All" selected>All</option>
+ </select>
+ </div>
+ </div>
+ <div class="form-group row" style="margin-bottom: 5px;">
+ <label for="gene_or_id" style="text-align: right;" class="col-xs-4 col-form-label"><b>Gene or ID:</b></label>
+ <div class="col-xs-8">
+ <input type="text" name="gene_name" size="12">
+ </div>
+ </div>
+ <div class="form-group row">
+ <div style="text-align: center;"><b><font color="red">Or select</font></b></div>
+ </div>
+ <div class="form-group row" style="margin-bottom: 5px;">
+ <label for="chr" style="text-align: right;" class="col-xs-4 col-form-label"><b>Chr:</b></label>
+ <div class="col-xs-8">
+ <select name="chr">
+ {% for item in chr_list %}
+ <option value="{{ item }}" {% if item == chr %}selected{% endif %}>{{ item }}</option>
+ {% endfor %}
+ </select>
+ </div>
+ </div>
+ <div class="form-group row" style="margin-bottom: 5px;">
+ <label for="start_mb" style="text-align: right;" class="col-xs-4 col-form-label"><b>Mb:</b></label>
+ <div class="col-xs-8">
+ <input type="text" name="start_mb" size="10" value="{{ start_mb }}">
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="end_mb" style="text-align: right;" class="col-xs-4 col-form-label">to</label>
+ <div class="col-xs-8">
+ <input type="text" name="end_mb" size="10" value="{{ end_mb }}">
+ </div>
+ </div>
+ <hr>
+ <div class="form-group row">
+ <label class="col-xs-4 col-form-label"></label>
+ <div class="col-xs-8">
+ <button class="btn btn-primary" type="submit">Search</button>
+ </div>
+ </div>
+ </div>
+ <div class="col-xs-4" style="padding-left: 0px;">
+ <div class="form-group row" style="margin-bottom: 10px;">
+ <label for="strains" style="text-align: right;" class="col-xs-4 col-form-label"><b>Strains:</b></label>
+ <div class="col-xs-8">
+ <select name="strains" style="width: 70%;">
+ <optgroup label="Mouse">
+ {% for strain in strain_list[:-1] %}
+ <option value="{{ strain }}" {% if loop.index == 1 %}selected{% endif %}>{{ strain }}</option>
+ {% endfor %}
+ </optgroup>
+ <optgroup label="Rat">
+ <option value="BN">BN</option>
+ </optgroup>
+ </select>
+ <div style="float: right; line-height: 20px;">
+ <input class="btn btn-primary" type="button" name="add_strain" value="Add" style="vertical-align: middle;">
+ </div>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="chosen_strains_select" style="text-align: right;" class="col-xs-4 col-form-label"><b><font color="red">Limit to:</font></b> <input type="checkbox" name="limit_strains" {% if limit_strains == "true" %}checked{% endif %} size="100"></label>
+ <div class="col-xs-8">
+ <select id="chosen_strains_select" size="11" style="width: 70%;">
+ {% for strain in chosen_strains %}
+ <option value="{{ strain }}">{{ strain }}</option>
+ {% endfor %}
+ </select>
+ <div style="float: right; line-height: 189px;">
+ <input class="btn btn-primary" type="button" name="remove_strain" value="Cut" style="vertical-align: middle;">
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-xs-4" style="padding-left: 20px;">
+ <div class="form-group row" style="margin-bottom: 5px;">
+ <label for="domain" style="text-align: right;" class="col-xs-4 col-form-label"><b>Domain:</b></label>
+ <div class="col-xs-8">
+ <select name="domain" size="4">
+ <option value="All" {% if domain == "All" %}selected{% endif %}>All</option>
+ <option value="Exon" {% if domain == "Exon" %}selected{% endif %}>Exon</option>
+ <option value="5' UTR" {% if domain == "5' UTR" %}selected{% endif %}>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5' UTR</option>
+ <option value="Coding" {% if domain == "Coding" %}selected{% endif %}>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Coding Region</option>
+ <option value="3' UTR" {% if domain == "3' UTR" %}selected{% endif %}>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3' UTR</option>
+ <option value="Intron" {% if domain == "Intron" %}selected{% endif %}>Intron</option>
+ <option value="Splice Site" {% if domain == "Splice Site" %}selected{% endif %}>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Splice Site</option>
+ <option value="Nonsplice Site" {% if domain == "Nonsplice Site" %}selected{% endif %}>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nonsplice Site</option>
+ <option value="Upstream" {% if domain == "Upstream" %}selected{% endif %}>Upstream</option>
+ <option value="Downstream" {% if domain == "Downstream" %}selected{% endif %}>Downstream</option>
+ <option value="Intergenic" {% if domain == "Intergenic" %}selected{% endif %}>Intergenic</option>
+ </select>
+ </div>
+ </div>
+ <div class="form-group row" style="margin-bottom: 5px;">
+ <label for="function" style="text-align: right;" class="col-xs-4 col-form-label"><b>Function:</b></label>
+ <div class="col-xs-8">
+ <select name="function" size="3">
+ <option value="All" {% if function == "All" %}selected{% endif %}>All</option>
+ <option value="Nonsynonymous" {% if function == "Nonsynonymous" %}selected{% endif %}>Nonsynonymous</option>
+ <option value="Synonymous" {% if function == "Synonymous" %}selected{% endif %}>Synonymous</option>
+ <option value="Start Gained" {% if function == "Start Gained" %}selected{% endif %}>Start Gained</option>
+ <option value="Start Lost" {% if function == "Start Lost" %}selected{% endif %}>Start Lost</option>
+ <option value="Stop Gained" {% if function == "Stop Gained" %}selected{% endif %}>Stop Gained</option>
+ <option value="Stop Lost" {% if function == "Stop Lost" %}selected{% endif %}>Stop Lost</option>
+ </select>
+ </div>
+ </div>
+ <div class="form-group row" style="margin-bottom: 5px;">
+ <label for="source" style="text-align: right;" class="col-xs-4 col-form-label"><b>Source:</b></label>
+ <div class="col-xs-8">
+ <select name="source">
+ <option value="All" {% if source == "All" %}selected{% endif %}>All</option>
+ <option value="None" {% if source == "None" %}selected{% endif %}>None</option>
+ <option value="dbSNP" {% if source == "dbSNP" %}selected{% endif %}>dbSNP</option>
+ <option value="dbSNP (release 149)" {% if source == "dbSNP (release 149)" %}selected{% endif %}>dbSNP (release 149)</option>
+ <option value="Sanger/UCLA" {% if source == "Sanger/UCLA" %}selected{% endif %}>Sanger/UCLA</option>
+ <option value="UTHSC_CITG" {% if source == "UTHSC_CITG" %}selected{% endif %}>UTHSC_CITG</option>
+ </select>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="criteria" style="text-align: right;" class="col-xs-4 col-form-label"><b>ConScore:</b></label>
+ <div class="col-xs-8">
+ <select name="criteria" size="1">
+ <option value=">=" {% if criteria == ">=" %}selected{% endif %}>&gt;=</option>
+ <option value="==" {% if criteria == "==" %}selected{% endif %}>=</option>
+ <option value="<=" {% if criteria == "<=" %}selected{% endif %}>&lt;=</option>
+ </select>
+ <input type="text" name="score" value="{{ score }}" size="5">
+ </div>
+ </div>
+ <div class="form-group row" style="margin-bottom: 5px;">
+ <label style="text-align: right;" class="col-xs-4 col-form-label"><input type="checkbox" name="redundant" {% if redundant == "true" %}checked{% endif %}></label>
+ <div class="col-xs-8">
+ Non-redundant SNP Only
+ </div>
+ </div>
+ <div class="form-group row">
+ <label style="text-align: right;" class="col-xs-4 col-form-label"><input type="checkbox" name="diff_alleles" {% if diff_alleles == "true" %}checked{% endif %}></label>
+ <div class="col-xs-8">
+ Different Alleles Only
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+
+ {% if filtered_results is defined %}
+ <table class="cell-border nowrap" id="results_table" style="float: left;">
+ <thead>
+ <tr>
+ <th></th>
+ {% for header in header_fields %}
+ <th data-export="{{ header }}">{{ header }}</th>
+ {% endfor %}
+ </tr>
+ </thead>
+ <tbody>
+ {% for result in filtered_results %}
+ <tr>
+ <td><input type="checkbox" name="trait_check"></td>
+ <td align="right">{{ loop.index }}</td>
+ {% for item in result %}
+ {% if loop.index > 1 %}
+ <td>{{ item }}</td>
+ {% endif %}
+ {% endfor %}
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ {% endif %}
+
+ </div>
+
+{% endblock %}
+{% block js %}
+ <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.naturalSort.js"></script>
+ <script language="javascript">
+
+ {% if filtered_results is defined %}
+ $("#results_table").DataTable( {
+ "sDom": "tir",
+ "iDisplayLength": -1,
+ "autoWidth": true,
+ "paging": false
+ });
+ {% endif %}
+
+ $("input[name=add_strain]").click(function() {
+ var selected_strain = $("select[name=strains] option:selected").val();
+ $("#chosen_strains_select").append("<option value='" + selected_strain + "'>" + selected_strain + "</option>");
+ });
+
+ $("input[name=remove_strain]").click(function() {
+ var selected_strain = $("#chosen_strains_select option:selected").val();
+ $("#chosen_strains_select option[value='" + selected_strain + "']").remove();
+ });
+
+ $("#snp_browser_form").submit(function() {
+ var strain_list = [];
+ $("#chosen_strains_select option").each(function() {
+ strain_list.push($(this).val());
+ });
+ $("input[name=chosen_strains]").val(strain_list.join(","));
+ });
+ </script>
+{% endblock %}
+
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index d4ececd0..fdb80040 100644
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -52,6 +52,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 wqflask.snp_browser import snp_browser
#from wqflask.trait_submission import submit_trait
from utility import temp_data
@@ -766,6 +767,13 @@ def corr_scatter_plot_page():
indent=" ")
return render_template("corr_scatterplot.html", **template_vars.__dict__)
+@app.route("/snp_browser", methods=('GET',))
+def snp_browser_page():
+ logger.info(request.url)
+ template_vars = snp_browser.SnpBrowser(request.args)
+
+ return render_template("snp_browser.html", **template_vars.__dict__)
+
@app.route("/submit_bnw", methods=('POST',))
def submit_bnw():
logger.info(request.url)