diff options
author | zsloan | 2018-10-11 15:43:41 +0000 |
---|---|---|
committer | zsloan | 2018-10-11 15:43:41 +0000 |
commit | 261ba5e41408d212cc3c33df658b6be2431f68ad (patch) | |
tree | 0ebcdab6a10a1d112dd5a36512352314219fcc56 /wqflask | |
parent | 65eff561d9527d10a32bea36b660135422e8cce9 (diff) | |
download | genenetwork2-261ba5e41408d212cc3c33df658b6be2431f68ad.tar.gz |
- Added fix for GEMMA LOCO
- Added all current SNP browser code (not complete yet)
- Added change to convert_geno_to_bimbam that makes it ignore .geno files marked as "filler" (so ones where the .geno file is fake and we sometimes directly receive the genotypes as BIMBAM)
- Changes TheSpecies object in species.py to accept species name as well as dataset name
Diffstat (limited to 'wqflask')
-rw-r--r-- | wqflask/base/species.py | 27 | ||||
-rw-r--r-- | wqflask/maintenance/convert_geno_to_bimbam.py | 2 | ||||
-rw-r--r-- | wqflask/wqflask/marker_regression/gemma_mapping.py | 4 | ||||
-rw-r--r-- | wqflask/wqflask/show_trait/show_trait.py | 2 | ||||
-rw-r--r-- | wqflask/wqflask/snp_browser/__init__.py | 0 | ||||
-rw-r--r-- | wqflask/wqflask/snp_browser/snp_browser.py | 500 | ||||
-rw-r--r-- | wqflask/wqflask/templates/correlation_page.html | 1 | ||||
-rw-r--r-- | wqflask/wqflask/templates/snp_browser.html | 242 | ||||
-rw-r--r-- | wqflask/wqflask/views.py | 8 |
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 %}> 5' UTR</option> + <option value="Coding" {% if domain == "Coding" %}selected{% endif %}> Coding Region</option> + <option value="3' UTR" {% if domain == "3' UTR" %}selected{% endif %}> 3' UTR</option> + <option value="Intron" {% if domain == "Intron" %}selected{% endif %}>Intron</option> + <option value="Splice Site" {% if domain == "Splice Site" %}selected{% endif %}> Splice Site</option> + <option value="Nonsplice Site" {% if domain == "Nonsplice Site" %}selected{% endif %}> 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 %}>>=</option> + <option value="==" {% if criteria == "==" %}selected{% endif %}>=</option> + <option value="<=" {% if criteria == "<=" %}selected{% endif %}><=</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) |