diff options
author | Pjotr Prins | 2019-02-13 12:19:49 +0000 |
---|---|---|
committer | Pjotr Prins | 2019-02-13 12:19:49 +0000 |
commit | b6350b0d4cf6eb8002d40e86378d71e2823dacfb (patch) | |
tree | 6fa6716af822e613cb81171471819a469394cc6f | |
parent | 5162d1484f01a51d65e7e70143146f018d96edb4 (diff) | |
parent | 27a08a81107705f213d13fb7334a2b8eb4fd68d2 (diff) | |
download | genenetwork2-b6350b0d4cf6eb8002d40e86378d71e2823dacfb.tar.gz |
Merge branch 'testing' of github.com:genenetwork/genenetwork2 into gn-testing
64 files changed, 5765 insertions, 1394 deletions
diff --git a/bin/genenetwork2 b/bin/genenetwork2 index 10e99d8b..21f0db13 100755 --- a/bin/genenetwork2 +++ b/bin/genenetwork2 @@ -25,7 +25,7 @@ # webserver) run from the base-dir with settings file and add that # script with a -c switch, e.g. # -# env GN2_PROFILE=/usr/local/guix-profiles/gn2-latest SQL_URI=mysql://webqtlout:webqtlout@lily.uthsc.edu/db_webqtl ./bin/genenetwork2 ./etc/default_settings.py -c ./maintenance/gen_select_dataset.py +# env GN2_PROFILE=/usr/local/guix-profiles/gn-latest-20181119 TMPDIR=/export/local/home/zas1024/gn2-zach/tmp WEBSERVER_MODE=DEBUG LOG_LEVEL=DEBUG SERVER_PORT=5002 GENENETWORK_FILES=/export/local/home/zas1024/gn2-zach/genotype_files SQL_URI=mysql://webqtlout:webqtlout@lily.uthsc.edu/db_webqtl ./bin/genenetwork2 ./etc/default_settings.py -c ./maintenance/gen_select_dataset.py # # To run any script in the environment # diff --git a/doc/README.org b/doc/README.org index cc141098..5dc9e994 100644 --- a/doc/README.org +++ b/doc/README.org @@ -259,9 +259,10 @@ if that works run genenetwork after setting SQL_URI to something like * Running ElasticSearch -In order to start up elasticsearch, change user to "elasticsearch" and use the following command: +In order to start up elasticsearch: +Penguin - change user to "elasticsearch" and use the following command: "env JAVA_HOME=/opt/jdk-9.0.4 /opt/elasticsearch-6.2.1/bin/elasticsearch" -: env JAVA_HOME=/opt/jdk-9.0.4 /opt/elasticsearch-6.2.1/bin/elasticsearch +New server - as root run "systemctl restart elasticsearch" * Read more diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py index 4a422ee4..79f72390 100644 --- a/wqflask/base/data_set.py +++ b/wqflask/base/data_set.py @@ -109,6 +109,7 @@ Publish or ProbeSet. E.g. else: new_type = "ProbeSet" self.datasets[short_dataset_name] = new_type + # Set LOG_LEVEL_DEBUG=5 to see the following: logger.debugf(5, "datasets",self.datasets) @@ -170,28 +171,22 @@ class Markers(object): def __init__(self, name): json_data_fh = open(locate(name + ".json",'genotype/json')) - try: - markers = [] - with open(locate(name + "_snps.txt", 'r')) as bimbam_fh: + markers = [] + with open("%s/%s_snps.txt" % (flat_files('genotype/bimbam'), name), 'r') as bimbam_fh: + if len(bimbam_fh.readline().split(", ")) > 2: + delimiter = ", " + elif len(bimbam_fh.readline().split(",")) > 2: + delimiter = "," + elif len(bimbam_fh.readline().split("\t")) > 2: + delimiter = "\t" + else: + delimiter = " " + for line in bimbam_fh: marker = {} - if len(bimbam_fh[0].split(", ")) > 2: - delimiter = ", " - elif len(bimbam_fh[0].split(",")) > 2: - delimiter = "," - elif len(bimbam_fh[0].split("\t")) > 2: - delimiter = "\t" - else: - delimiter = " " - for line in bimbam_fh: - marker['name'] = line.split(delimiter)[0] - marker['Mb'] - marker['chr'] = line.split(delimiter)[2] - marker['cM'] - markers.append(marker) - #try: - # markers = json.load(json_data_fh) - except: - markers = [] + marker['name'] = line.split(delimiter)[0].rstrip() + marker['Mb'] = float(line.split(delimiter)[1].rstrip())/1000000 + marker['chr'] = line.split(delimiter)[2].rstrip() + markers.append(marker) for marker in markers: if (marker['chr'] != "X") and (marker['chr'] != "Y"): @@ -333,8 +328,6 @@ class DatasetGroup(object): return mapping_id, mapping_names def get_markers(self): - logger.debug("self.species is:", self.species) - def check_plink_gemma(): if flat_file_exists("mapping"): MAPPING_PATH = flat_files("mapping")+"/" @@ -371,23 +364,16 @@ class DatasetGroup(object): result = Redis.get(key) if result is not None: - #logger.debug("Sample List Cache hit!!!") - #logger.debug("Before unjsonifying {}: {}".format(type(result), result)) self.samplelist = json.loads(result) - #logger.debug(" type: ", type(self.samplelist)) - #logger.debug(" self.samplelist: ", self.samplelist) else: logger.debug("Cache not hit") 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: + if genotype_fn: self.samplelist = get_group_samplelists.get_samplelist("geno", genotype_fn) else: self.samplelist = None - logger.debug("Sample list: ",self.samplelist) + if USE_REDIS: Redis.set(key, json.dumps(self.samplelist)) Redis.expire(key, 60*5) @@ -457,12 +443,14 @@ def datasets(group_name, this_group = None): and InbredSet.Name like %s and ProbeSetFreeze.public > %s and ProbeSetFreeze.confidentiality < 1 - ORDER BY Tissue.Name, ProbeSetFreeze.CreateTime desc, ProbeSetFreeze.AvgId) + ORDER BY Tissue.Name) ''' % (group_name, webqtlConfig.PUBLICTHRESH, group_name, webqtlConfig.PUBLICTHRESH, "'" + group_name + "'", webqtlConfig.PUBLICTHRESH)) - for dataset_item in the_results: + sorted_results = sorted(the_results, key=lambda kv: kv[0]) + + for dataset_item in sorted_results: tissue_name = dataset_item[0] dataset = dataset_item[1] dataset_short = dataset_item[2] diff --git a/wqflask/base/webqtlCaseData.py b/wqflask/base/webqtlCaseData.py index 76f06cc6..aa34024c 100644 --- a/wqflask/base/webqtlCaseData.py +++ b/wqflask/base/webqtlCaseData.py @@ -49,7 +49,7 @@ class webqtlCaseData(object): if self.variance != None: str += " variance=%2.3f" % self.variance if self.num_cases: - str += " ndata=%d" % self.num_cases + str += " ndata=%s" % self.num_cases if self.name: str += " name=%s" % self.name if self.name2: diff --git a/wqflask/base/webqtlConfig.py b/wqflask/base/webqtlConfig.py index 4708bf0a..c9052c83 100644 --- a/wqflask/base/webqtlConfig.py +++ b/wqflask/base/webqtlConfig.py @@ -34,6 +34,10 @@ PUBMEDLINK_URL = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db= 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' UTHSC_BLAT2 = 'http://ucscbrowserbeta.genenetwork.org/cgi-bin/hgBlat?org=%s&db=%s&type=0&sort=0&output=0&userSeq=%s' +GENOMEBROWSER_URL="https://genome.ucsc.edu/cgi-bin/hgTracks?db=%s&position=%s" +NCBI_LOCUSID = "http://www.ncbi.nlm.nih.gov/gene?cmd=Retrieve&dopt=Graphics&list_uids=%s" +ENSEMBLETRANSCRIPT_URL="http://useast.ensembl.org/Mus_musculus/Transcript/Idhistory?t=%s" +DBSNP = 'http://www.ncbi.nlm.nih.gov/SNP/snp_ref.cgi?type=rs&rs=%s' # Temporary storage (note that this TMPDIR can be set as an # environment variable - use utility.tools.TEMPDIR when you diff --git a/wqflask/maintenance/convert_geno_to_bimbam.py b/wqflask/maintenance/convert_geno_to_bimbam.py index 8f331a06..528b98cf 100644 --- a/wqflask/maintenance/convert_geno_to_bimbam.py +++ b/wqflask/maintenance/convert_geno_to_bimbam.py @@ -180,8 +180,8 @@ class ConvertGenoFile(object): break if __name__=="__main__": - Old_Geno_Directory = """/home/zas1024/genotype_files/genotype/""" - New_Geno_Directory = """/home/zas1024/genotype_files/genotype/bimbam/""" + Old_Geno_Directory = """/export/local/home/zas1024/gn2-zach/genotype_files/genotype""" + New_Geno_Directory = """/export/local/home/zas1024/gn2-zach/genotype_files/genotype/bimbam""" #Input_File = """/home/zas1024/gene/genotype_files/genotypes/BXD.geno""" #Output_File = """/home/zas1024/gene/wqflask/wqflask/pylmm/data/bxd.snps""" #convertob = ConvertGenoFile("/home/zas1024/gene/genotype_files/genotypes/SRxSHRSPF2.geno", "/home/zas1024/gene/genotype_files/new_genotypes/SRxSHRSPF2.json") diff --git a/wqflask/maintenance/gen_select_dataset.py b/wqflask/maintenance/gen_select_dataset.py index 55c642a4..4ad921a2 100644 --- a/wqflask/maintenance/gen_select_dataset.py +++ b/wqflask/maintenance/gen_select_dataset.py @@ -248,7 +248,7 @@ def build_datasets(species, group, type_name): ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and Tissue.Name = '%s' and ProbeFreeze.TissueId = Tissue.Id and ProbeFreeze.InbredSetId = InbredSet.Id and ProbeSetFreeze.confidentiality < 1 and ProbeSetFreeze.public > 0 order by - ProbeSetFreeze.OrderList asc""" % (species, group, type_name)) + ProbeSetFreeze.CreateTime desc""" % (species, group, type_name)) dataset_results = Cursor.fetchall() datasets = [] diff --git a/wqflask/maintenance/generate_kinship_from_bimbam.py b/wqflask/maintenance/generate_kinship_from_bimbam.py index ad0eb036..b53f5dda 100644 --- a/wqflask/maintenance/generate_kinship_from_bimbam.py +++ b/wqflask/maintenance/generate_kinship_from_bimbam.py @@ -54,8 +54,8 @@ class GenerateKinshipMatrices(object): if __name__=="__main__": - Geno_Directory = """/home/zas1024/genotype_files/genotype/""" - Bimbam_Directory = """/home/zas1024/genotype_files/genotype/bimbam/""" + Geno_Directory = """/export/local/home/zas1024/genotype_files/genotype/""" + Bimbam_Directory = """/export/local/home/zas1024/genotype_files/genotype/bimbam/""" GenerateKinshipMatrices.process_all(Geno_Directory, Bimbam_Directory) #./gemma -g /home/zas1024/genotype_files/genotype/bimbam/BXD_geno.txt -p /home/zas1024/genotype_files/genotype/bimbam/BXD_pheno.txt -gk 1 -o BXD
\ No newline at end of file diff --git a/wqflask/maintenance/geno_to_json.py b/wqflask/maintenance/geno_to_json.py index 789a1691..9579812a 100644 --- a/wqflask/maintenance/geno_to_json.py +++ b/wqflask/maintenance/geno_to_json.py @@ -24,6 +24,8 @@ import simplejson as json from pprint import pformat as pf +#from utility.tools import flat_files + class EmptyConfigurations(Exception): pass @@ -183,8 +185,8 @@ class ConvertGenoFile(object): if __name__=="__main__": - Old_Geno_Directory = """/home/zas1024/genotype_files/genotype/""" - New_Geno_Directory = """/home/zas1024/genotype_files/genotype/json/""" + Old_Geno_Directory = """/export/local/home/zas1024/gn2-zach/genotype_files/genotype""" + New_Geno_Directory = """/export/local/home/zas1024/gn2-zach/genotype_files/genotype/json""" #Input_File = """/home/zas1024/gene/genotype_files/genotypes/BXD.geno""" #Output_File = """/home/zas1024/gene/wqflask/wqflask/pylmm/data/bxd.snps""" #convertob = ConvertGenoFile("/home/zas1024/gene/genotype_files/genotypes/SRxSHRSPF2.geno", "/home/zas1024/gene/genotype_files/new_genotypes/SRxSHRSPF2.json") diff --git a/wqflask/wqflask/collect.py b/wqflask/wqflask/collect.py index e51fa157..a04e4b13 100644 --- a/wqflask/wqflask/collect.py +++ b/wqflask/wqflask/collect.py @@ -85,9 +85,9 @@ class AnonCollection(object): num_members = collection['num_members'] return num_members - def add_traits(self, params): + def add_traits(self, unprocessed_traits): #assert collection_name == "Default", "Unexpected collection name for anonymous user" - self.traits = list(process_traits(params['traits'])) + self.traits = list(process_traits(unprocessed_traits)) existing_collections = Redis.get(self.key) logger.debug("existing_collections:", existing_collections) if existing_collections != None and existing_collections != "None": @@ -144,7 +144,6 @@ class AnonCollection(object): return str(len_now) def process_traits(unprocessed_traits): - #print("unprocessed_traits are:", unprocessed_traits) if isinstance(unprocessed_traits, basestring): unprocessed_traits = unprocessed_traits.split(",") traits = set() @@ -167,26 +166,38 @@ def report_change(len_before, len_now): else: logger.debug("No new traits were added.") +@app.route("/collections/store_trait_list", methods=('POST',)) +def store_traits_list(): + params = request.form + + traits = params['traits'] + hash = params['hash'] + + Redis.set(hash, traits) + + return hash @app.route("/collections/add") def collections_add(): - traits=request.args['traits'] - if g.user_session.logged_in: - user_collections = g.user_session.user_collections - #logger.debug("user_collections are:", user_collections) - return render_template("collections/add.html", - traits = traits, - collections = user_collections, - ) + collections = g.user_session.user_collections else: anon_collections = user_manager.AnonUser().get_collections() - collection_names = [] + collections = [] for collection in anon_collections: - collection_names.append({'id':collection['id'], 'name':collection['name']}) + collections.append({'id':collection['id'], 'name':collection['name']}) + + if 'traits' in request.args: + traits=request.args['traits'] return render_template("collections/add.html", traits = traits, - collections = collection_names, + collections = collections, + ) + else: + hash = request.args['hash'] + return render_template("collections/add.html", + hash = hash, + collections = collections, ) @app.route("/collections/new") @@ -231,7 +242,12 @@ def collections_new(): def create_new(collection_name): params = request.args - unprocessed_traits = params['traits'] + if "hash" in params: + unprocessed_traits = Redis.get(params['hash']) + Redis.delete(hash) + else: + unprocessed_traits = params['traits'] + traits = process_traits(unprocessed_traits) if g.user_session.logged_in: @@ -241,7 +257,7 @@ def create_new(collection_name): else: ac = AnonCollection(collection_name) ac.changed_timestamp = datetime.datetime.utcnow().strftime('%b %d %Y %I:%M%p') - ac.add_traits(params) + ac.add_traits(unprocessed_traits) return redirect(url_for('view_collection', collection_id=ac.id)) @app.route("/collections/list") diff --git a/wqflask/wqflask/correlation/show_corr_results.py b/wqflask/wqflask/correlation/show_corr_results.py index 9f3f7982..0b2875cc 100644 --- a/wqflask/wqflask/correlation/show_corr_results.py +++ b/wqflask/wqflask/correlation/show_corr_results.py @@ -99,7 +99,7 @@ class CorrelationResults(object): else: helper_functions.get_species_dataset_trait(self, start_vars) - self.dataset.group.read_genotype_file() + #self.dataset.group.read_genotype_file() corr_samples_group = start_vars['corr_samples_group'] diff --git a/wqflask/wqflask/external_tools/__init__.py b/wqflask/wqflask/external_tools/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/wqflask/wqflask/external_tools/__init__.py diff --git a/wqflask/wqflask/external_tools/send_to_bnw.py b/wqflask/wqflask/external_tools/send_to_bnw.py new file mode 100644 index 00000000..e8f168f4 --- /dev/null +++ b/wqflask/wqflask/external_tools/send_to_bnw.py @@ -0,0 +1,72 @@ +## Copyright (C) University of Tennessee Health Science Center, Memphis, TN. +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU Affero General Public License +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Affero General Public License for more details. +# +# This program is available from Source Forge: at GeneNetwork Project +# (sourceforge.net/projects/genenetwork/). +# +# Contact Dr. Robert W. Williams at rwilliams@uthsc.edu +# +# +# This module is used by GeneNetwork project (www.genenetwork.org) + +from __future__ import absolute_import, print_function, division + +from base.trait import GeneralTrait +from utility import helper_functions, corr_result_helpers + +import utility.logger +logger = utility.logger.getLogger(__name__ ) + +class SendToBNW(object): + def __init__(self, start_vars): + trait_db_list = [trait.strip() for trait in start_vars['trait_list'].split(',')] + helper_functions.get_trait_db_obs(self, trait_db_list) + + trait_samples_list = [] + + for trait_db in self.trait_list: + trait_1 = trait_db[0] + this_sample_data = trait_1.data + + trait1_samples = list(this_sample_data.keys()) + trait_samples_list.append(trait1_samples) + + shared_samples = list(set(trait_samples_list[0]).intersection(*trait_samples_list)) + + self.form_value = "" #ZS: string that is passed to BNW through form + values_list = [] + for trait_db in self.trait_list: + this_trait = trait_db[0] + this_sample_data = this_trait.data + + trait_vals = [] + for sample in this_sample_data: + if sample in shared_samples: + trait_vals.append(this_sample_data[sample].value) + + values_list.append(trait_vals) + self.form_value += "_" + this_trait.name + "," + + values_list = zip(*values_list) + self.form_value = self.form_value[:-1] + self.form_value += ";" + + for row in values_list: + has_none = False + for cell in row: + if not cell: + has_none = True + break + if has_none: + continue + self.form_value += ",".join(str(cell) for cell in row) + self.form_value += ";"
\ No newline at end of file diff --git a/wqflask/wqflask/external_tools/send_to_geneweaver.py b/wqflask/wqflask/external_tools/send_to_geneweaver.py new file mode 100644 index 00000000..7a5dba73 --- /dev/null +++ b/wqflask/wqflask/external_tools/send_to_geneweaver.py @@ -0,0 +1,112 @@ +## Copyright (C) University of Tennessee Health Science Center, Memphis, TN. +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU Affero General Public License +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Affero General Public License for more details. +# +# This program is available from Source Forge: at GeneNetwork Project +# (sourceforge.net/projects/genenetwork/). +# +# Contact Dr. Robert W. Williams at rwilliams@uthsc.edu +# +# +# This module is used by GeneNetwork project (www.genenetwork.org) + +from __future__ import absolute_import, print_function, division + +import string + +from flask import Flask, g + +from base.trait import GeneralTrait, retrieve_trait_info +from base.species import TheSpecies +from utility import helper_functions, corr_result_helpers + +import utility.logger +logger = utility.logger.getLogger(__name__ ) + +class SendToGeneWeaver(object): + def __init__(self, start_vars): + trait_db_list = [trait.strip() for trait in start_vars['trait_list'].split(',')] + helper_functions.get_trait_db_obs(self, trait_db_list) + + self.chip_name = test_chip(self.trait_list) + self.wrong_input = "False" + if self.chip_name == "mixed" or self.chip_name == "not_microarray" or '_NA' in self.chip_name: + self.wrong_input = "True" + else: + species = self.trait_list[0][1].group.species + if species == "rat": + species_name = "Rattus norvegicus" + elif species == "human": + species_name = "Homo sapiens" + elif species == "mouse": + species_name = "Mus musculus" + else: + species_name = "" + + trait_name_list = get_trait_name_list(self.trait_list) + + self.hidden_vars = { + 'client' : "genenetwork", + 'species' : species_name, + 'idtype' : self.chip_name, + 'list' : string.join(trait_name_list, ","), + } + +def get_trait_name_list(trait_list): + name_list = [] + for trait_db in trait_list: + name_list.append(trait_db[0].name) + + return name_list + +def test_chip(trait_list): + final_chip_name = "" + + for trait_db in trait_list: + dataset = trait_db[1] + result = g.db.execute("""SELECT GeneChip.GO_tree_value + FROM GeneChip, ProbeFreeze, ProbeSetFreeze + WHERE GeneChip.Id = ProbeFreeze.ChipId and + ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and + ProbeSetFreeze.Name = '%s'""" % dataset.name).fetchone() + + if result: + chip_name = result[0] + if chip_name: + if chip_name != final_chip_name: + if final_chip_name: + return "mixed" + else: + final_chip_name = chip_name + else: + pass + else: + result = g.db.execute("""SELECT GeneChip.Name + FROM GeneChip, ProbeFreeze, ProbeSetFreeze + WHERE GeneChip.Id = ProbeFreeze.ChipId and + ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and + ProbeSetFreeze.Name = '%s'""" % dataset.name).fetchone() + chip_name = '%s_NA' % result[0] + return chip_name + else: + query = """SELECT GeneChip.Name + FROM GeneChip, ProbeFreeze, ProbeSetFreeze + WHERE GeneChip.Id = ProbeFreeze.ChipId and + ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and + ProbeSetFreeze.Name = '%s'""" % dataset.name + result = g.db.execute(query).fetchone() + if result == None: + return "not_microarray" + else: + chip_name = '%s_NA' % result[0] + return chip_name + + return chip_name
\ No newline at end of file diff --git a/wqflask/wqflask/external_tools/send_to_webgestalt.py b/wqflask/wqflask/external_tools/send_to_webgestalt.py new file mode 100644 index 00000000..30ca024f --- /dev/null +++ b/wqflask/wqflask/external_tools/send_to_webgestalt.py @@ -0,0 +1,126 @@ +## Copyright (C) University of Tennessee Health Science Center, Memphis, TN. +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU Affero General Public License +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Affero General Public License for more details. +# +# This program is available from Source Forge: at GeneNetwork Project +# (sourceforge.net/projects/genenetwork/). +# +# Contact Dr. Robert W. Williams at rwilliams@uthsc.edu +# +# +# This module is used by GeneNetwork project (www.genenetwork.org) + +from __future__ import absolute_import, print_function, division + +import string + +from flask import Flask, g + +from base.trait import GeneralTrait, retrieve_trait_info +from base.species import TheSpecies +from utility import helper_functions, corr_result_helpers + +import utility.logger +logger = utility.logger.getLogger(__name__ ) + +class SendToWebGestalt(object): + def __init__(self, start_vars): + trait_db_list = [trait.strip() for trait in start_vars['trait_list'].split(',')] + helper_functions.get_trait_db_obs(self, trait_db_list) + + self.chip_name = test_chip(self.trait_list) + + self.wrong_input = "False" + if self.chip_name == "mixed" or self.chip_name == "not_microarray" or '_NA' in self.chip_name: + self.wrong_input = "True" + else: + trait_name_list, gene_id_list = gen_gene_id_list(self.trait_list) + + self.target_url = "http://www.webgestalt.org/option.php" + + id_type = "entrezgene" + + self.hidden_vars = { + 'gene_list' : string.join(gene_id_list, "\n"), + 'id_type' : "entrezgene", + 'ref_set' : "genome", + 'enriched_database_category' : "geneontology", + 'enriched_database_name' : "Biological_Process", + 'sig_method' : "fdr", + 'sig_value' : "0.05", + 'enrich_method' : "ORA", + 'fdr_method' : "BH", + 'min_num' : "2" + } + + species = self.trait_list[0][1].group.species + if species == "rat": + self.hidden_vars['organism'] = "rnorvegicus" + elif species == "human": + self.hidden_vars['organism'] = "hsapiens" + elif species == "mouse": + self.hidden_vars['organism'] = "mmusculus" + else: + self.hidden_vars['organism'] = "others" + +def test_chip(trait_list): + final_chip_name = "" + + for trait_db in trait_list: + dataset = trait_db[1] + result = g.db.execute("""SELECT GeneChip.GO_tree_value + FROM GeneChip, ProbeFreeze, ProbeSetFreeze + WHERE GeneChip.Id = ProbeFreeze.ChipId and + ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and + ProbeSetFreeze.Name = '%s'""" % dataset.name).fetchone() + + if result: + chip_name = result[0] + if chip_name: + if chip_name != final_chip_name: + if final_chip_name: + return "mixed" + else: + final_chip_name = chip_name + else: + pass + else: + result = g.db.execute("""SELECT GeneChip.Name + FROM GeneChip, ProbeFreeze, ProbeSetFreeze + WHERE GeneChip.Id = ProbeFreeze.ChipId and + ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and + ProbeSetFreeze.Name = '%s'""" % dataset.name).fetchone() + chip_name = '%s_NA' % result[0] + return chip_name + else: + query = """SELECT GeneChip.Name + FROM GeneChip, ProbeFreeze, ProbeSetFreeze + WHERE GeneChip.Id = ProbeFreeze.ChipId and + ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and + ProbeSetFreeze.Name = '%s'""" % dataset.name + result = g.db.execute(query).fetchone() + if result == None: + return "not_microarray" + else: + chip_name = '%s_NA' % result[0] + return chip_name + + return chip_name + +def gen_gene_id_list(trait_list): + trait_name_list = [] + gene_id_list = [] + for trait_db in trait_list: + trait = trait_db[0] + trait_name_list.append(trait.name) + retrieve_trait_info(trait, trait.dataset) + gene_id_list.append(str(trait.geneid)) + return trait_name_list, gene_id_list
\ No newline at end of file diff --git a/wqflask/wqflask/gsearch.py b/wqflask/wqflask/gsearch.py index 37eb46cb..357f989d 100644 --- a/wqflask/wqflask/gsearch.py +++ b/wqflask/wqflask/gsearch.py @@ -7,6 +7,8 @@ from db import webqtlDatabaseFunction from base import webqtlConfig +from wqflask import user_manager + from utility.type_checking import is_float, is_int, is_str, get_float, get_int, get_string from utility.benchmark import Bench @@ -30,6 +32,7 @@ class GSearch(object): InbredSet.`Name` AS inbredset_name, Tissue.`Name` AS tissue_name, ProbeSetFreeze.Name AS probesetfreeze_name, + ProbeSetFreeze.FullName AS probesetfreeze_fullname, ProbeSet.Name AS probeset_name, ProbeSet.Symbol AS probeset_symbol, ProbeSet.`description` AS probeset_description, @@ -58,30 +61,38 @@ class GSearch(object): re = g.db.execute(sql).fetchall() self.trait_list = [] with Bench("Creating trait objects"): - for line in re: + for i, line in enumerate(re): this_trait = {} - this_trait['name'] = line[4] + this_trait['index'] = i + 1 + this_trait['name'] = line[5] this_trait['dataset'] = line[3] + this_trait['dataset_fullname'] = line[4] + this_trait['hmac'] = user_manager.data_hmac('{}:{}'.format(line[5], line[3])) this_trait['species'] = line[0] this_trait['group'] = line[1] this_trait['tissue'] = line[2] - this_trait['symbol'] = line[5] - this_trait['description'] = line[6] + this_trait['symbol'] = line[6] + this_trait['description'] = line[7] this_trait['location_repr'] = 'N/A' - if (line[7] != "NULL" and line[7] != "") and (line[8] != 0): - this_trait['location_repr'] = 'Chr%s: %.6f' % (line[7], float(line[8])) - this_trait['mean'] = line[9] + if (line[8] != "NULL" and line[8] != "") and (line[9] != 0): + this_trait['location_repr'] = 'Chr%s: %.6f' % (line[8], float(line[9])) + this_trait['mean'] = '%.3f' % line[10] this_trait['LRS_score_repr'] = "N/A" - if line[10] != "" and line[10] != None: + if line[11] != "" and line[11] != None: this_trait['LRS_score_repr'] = '%3.1f' % line[10] this_trait['additive'] = "N/A" - if line[13] != "": - this_trait['additive'] = line[13] + if line[14] != "" and line[14] != None: + this_trait['additive'] = '%.3f' % line[14] #dataset = create_dataset(line[3], "ProbeSet", get_samplelist=False) #trait_id = line[4] #with Bench("Building trait object"): - #this_trait = GeneralTrait(dataset=dataset, name=trait_id, get_qtl_info=False, get_sample_info=False) + trait_ob = GeneralTrait(dataset_name=this_trait['dataset'], name=this_trait['name'], get_qtl_info=True, get_sample_info=False) + max_lrs_text = "N/A" + if trait_ob.locus_chr != "" and trait_ob.locus_mb != "": + max_lrs_text = "Chr" + str(trait_ob.locus_chr) + ": " + str(trait_ob.locus_mb) + this_trait['max_lrs_text'] = max_lrs_text + self.trait_list.append(this_trait) elif self.type == "phenotype": @@ -90,7 +101,9 @@ class GSearch(object): Species.`Name`, InbredSet.`Name`, PublishFreeze.`Name`, + PublishFreeze.`FullName`, PublishXRef.`Id`, + Phenotype.`Pre_publication_description`, Phenotype.`Post_publication_description`, Publication.`Authors`, Publication.`Year`, @@ -120,31 +133,43 @@ class GSearch(object): re = g.db.execute(sql).fetchall() self.trait_list = [] with Bench("Creating trait objects"): - for line in re: + for i, line in enumerate(re): this_trait = {} - this_trait['name'] = line[3] + this_trait['index'] = i + 1 + this_trait['name'] = str(line[4]) this_trait['dataset'] = line[2] + this_trait['dataset_fullname'] = line[3] + this_trait['hmac'] = user_manager.data_hmac('{}:{}'.format(line[5], line[3])) this_trait['species'] = line[0] this_trait['group'] = line[1] - this_trait['description'] = line[4] - this_trait['authors'] = line[5] - this_trait['year'] = line[6] + if line[8] != None: + this_trait['description'] = line[6] + else: + this_trait['description'] = line[5] + this_trait['authors'] = line[7] + this_trait['year'] = line[8] if this_trait['year'].isdigit(): this_trait['pubmed_text'] = this_trait['year'] else: this_trait['pubmed_text'] = "N/A" - if line[7] != "" and line[7] != None: - this_trait['pubmed_link'] = webqtlConfig.PUBMEDLINK_URL % line[7] + if line[9] != "" and line[9] != None: + this_trait['pubmed_link'] = webqtlConfig.PUBMEDLINK_URL % line[8] else: this_trait['pubmed_link'] = "N/A" this_trait['LRS_score_repr'] = "N/A" - if line[8] != "" and line[8] != None: - this_trait['LRS_score_repr'] = '%3.1f' % line[8] + if line[10] != "" and line[10] != None: + this_trait['LRS_score_repr'] = '%3.1f' % line[10] this_trait['additive'] = "N/A" - if line[9] != "": - this_trait['additive'] = line[9] + if line[11] != "" and line[11] != None: + this_trait['additive'] = '%.3f' % line[11] #dataset = create_dataset(line[2], "Publish") #trait_id = line[3] #this_trait = GeneralTrait(dataset=dataset, name=trait_id, get_qtl_info=True, get_sample_info=False) + this_trait['max_lrs_text'] = "N/A" + if this_trait['dataset'] == this_trait['group'] + "Publish": + trait_ob = GeneralTrait(dataset_name=this_trait['dataset'], name=this_trait['name'], get_qtl_info=True, get_sample_info=False) + if trait_ob.locus_chr != "" and trait_ob.locus_mb != "": + this_trait['max_lrs_text'] = "Chr" + str(trait_ob.locus_chr) + ": " + str(trait_ob.locus_mb) + self.trait_list.append(this_trait) diff --git a/wqflask/wqflask/heatmap/heatmap.py b/wqflask/wqflask/heatmap/heatmap.py index af75d441..ff589693 100644 --- a/wqflask/wqflask/heatmap/heatmap.py +++ b/wqflask/wqflask/heatmap/heatmap.py @@ -43,12 +43,13 @@ Redis = Redis() from flask import Flask, g +from utility.logger import getLogger +logger = getLogger(__name__ ) + class Heatmap(object): def __init__(self, start_vars, temp_uuid): - trait_db_list = [trait.strip() for trait in start_vars['trait_list'].split(',')] - helper_functions.get_trait_db_obs(self, trait_db_list) self.temp_uuid = temp_uuid @@ -98,6 +99,7 @@ class Heatmap(object): for trait in self.trait_results.keys(): lodnames.append(trait) + self.dataset.group.get_markers() for marker in self.dataset.group.markers.markers: chr_pos.append(marker['chr']) pos.append(marker['Mb']) diff --git a/wqflask/wqflask/marker_regression/marker_regression_gn1.py b/wqflask/wqflask/marker_regression/display_mapping_results.py index f7f3e08d..fa20e8ad 100644 --- a/wqflask/wqflask/marker_regression/marker_regression_gn1.py +++ b/wqflask/wqflask/marker_regression/display_mapping_results.py @@ -51,7 +51,7 @@ logger = utility.logger.getLogger(__name__ ) ######################################### # Inteval Mapping Plot Page ######################################### -class MarkerRegression(object): +class DisplayMappingResults(object): cMGraphInterval = 5 GRAPH_MIN_WIDTH = 900 GRAPH_MAX_WIDTH = 10000 # Don't set this too high @@ -772,7 +772,8 @@ class MarkerRegression(object): fontZoom = 1.5 drawSNPLocationY = yTopOffset + plotHeight - chrName = self.genotype[0].name + #chrName = self.genotype[0].name + chrName = self.ChrList[self.selectedChr][0] stepMb = (endMb-startMb)/plotWidth strainId1, strainId2 = self.diffCol @@ -1157,22 +1158,24 @@ class MarkerRegression(object): plotRight = xRightOffset #### find out PlotRight - for i, _locus in enumerate(self.genotype[0]): - txStart = self.genotype[0][i].Mb - txEnd = self.genotype[0][i].Mb + for i, _chr in enumerate(self.genotype): + if _chr.name == self.ChrList[self.selectedChr][0]: + for j, _locus in enumerate(_chr): + txStart = _chr[j].Mb + txEnd = _chr[j].Mb - geneStartPix = xLeftOffset + plotXScale*(float(txStart) - startMb) - 0 - geneEndPix = xLeftOffset + plotXScale*(float(txEnd) - startMb) - 0 + geneStartPix = xLeftOffset + plotXScale*(float(txStart) - startMb) - 0 + geneEndPix = xLeftOffset + plotXScale*(float(txEnd) - startMb) - 0 - drawit = 1 - if (geneStartPix < xLeftOffset): - drawit = 0; - if (geneStartPix > xLeftOffset + plotWidth): - drawit = 0; + drawit = 1 + if (geneStartPix < xLeftOffset): + drawit = 0; + if (geneStartPix > xLeftOffset + plotWidth): + drawit = 0; - if drawit == 1: - if self.genotype[0][i].name != " - " : - plotRight = geneEndPix + 4 + if drawit == 1: + if _chr[j].name != " - " : + plotRight = geneEndPix + 4 #### end find out PlotRight @@ -1184,139 +1187,142 @@ class MarkerRegression(object): #Now there should always be some value set for "oldgeno" - Zach 12/14/2010 oldgeno = [None]*len(self.strainlist) - for i, _locus in enumerate(self.genotype[0]): - txStart = self.genotype[0][i].Mb - txEnd = self.genotype[0][i].Mb - - geneStartPix = xLeftOffset + plotXScale*(float(txStart) - startMb) - 0 - geneEndPix = xLeftOffset + plotXScale*(float(txEnd) - startMb) + 0 + for i, _chr in enumerate(self.genotype): + if _chr.name == self.ChrList[self.selectedChr][0]: + for j, _locus in enumerate(_chr): + txStart = _chr[j].Mb + txEnd = _chr[j].Mb - if oldgeneEndPix >= xLeftOffset: - drawStart = oldgeneEndPix + 4 - else: - drawStart = xLeftOffset + 3 + geneStartPix = xLeftOffset + plotXScale*(float(txStart) - startMb) - 0 + geneEndPix = xLeftOffset + plotXScale*(float(txEnd) - startMb) + 0 - drawEnd = plotRight - 9 + if oldgeneEndPix >= xLeftOffset: + drawStart = oldgeneEndPix + 4 + else: + drawStart = xLeftOffset + 3 - drawit = 1 + drawEnd = plotRight - 9 - if (geneStartPix < xLeftOffset): - if firstGene == 1: drawit = 1 - else: - drawit = 0 - elif (geneStartPix > (xLeftOffset + plotWidth - 3)): - if lastGene == 0: - drawit = 1 - drawEnd = xLeftOffset + plotWidth - 6 - lastGene = 1 - else: - break - - else: - firstGene = 0 - drawit = 1 - - if drawit == 1: - myColor = pid.darkblue - outlineColor = myColor - fillColor = myColor - - maxind=0 + if (geneStartPix < xLeftOffset): + if firstGene == 1: + drawit = 1 + else: + drawit = 0 - #Draw Genes + elif (geneStartPix > (xLeftOffset + plotWidth - 3)): + if lastGene == 0: + drawit = 1 + drawEnd = xLeftOffset + plotWidth - 6 + lastGene = 1 + else: + break - geneYLocation = yPaddingTop + self.NUM_GENE_ROWS * (self.EACH_GENE_HEIGHT)*zoom - if self.dataset.group.species == "mouse" or self.dataset.group.species == "rat": - geneYLocation += 4*self.BAND_HEIGHT + 4*self.BAND_SPACING - else: - geneYLocation += 3*self.BAND_HEIGHT + 3*self.BAND_SPACING + else: + firstGene = 0 + drawit = 1 - if self.genotype[0][i].name != " - " : + if drawit == 1: + myColor = pid.darkblue + outlineColor = myColor + fillColor = myColor - if (firstGene == 1) and (lastGene != 1): - oldgeneEndPix = drawStart = xLeftOffset - oldgeno = self.genotype[0][i].genotype - continue + maxind=0 - for j,_geno in enumerate (self.genotype[0][i].genotype): + #Draw Genes - plotbxd=0 - for item in smd: - if item.name == samplelist[j]: - plotbxd=1 - - if (plotbxd == 1): - ind = 0 - counter = 0 - for item in smd: - counter = counter + 1 - if item.name == samplelist[j]: - ind = counter - maxind=max(ind,maxind) - - # lines - if (oldgeno[j] == -1 and _geno == -1): - mylineColor = self.HAPLOTYPE_NEGATIVE - elif (oldgeno[j] == 1 and _geno == 1): - mylineColor = self.HAPLOTYPE_POSITIVE - elif (oldgeno[j] == 0 and _geno == 0): - mylineColor = self.HAPLOTYPE_HETEROZYGOUS - else: - mylineColor = self.HAPLOTYPE_RECOMBINATION # XZ: Unknown + geneYLocation = yPaddingTop + self.NUM_GENE_ROWS * (self.EACH_GENE_HEIGHT)*zoom + if self.dataset.group.species == "mouse" or self.dataset.group.species == "rat": + geneYLocation += 4*self.BAND_HEIGHT + 4*self.BAND_SPACING + else: + geneYLocation += 3*self.BAND_HEIGHT + 3*self.BAND_SPACING + + if _chr[j].name != " - " : + + if (firstGene == 1) and (lastGene != 1): + oldgeneEndPix = drawStart = xLeftOffset + oldgeno = _chr[j].genotype + continue + + for k, _geno in enumerate (_chr[j].genotype): + plotbxd=0 + for item in smd: + if item.name == samplelist[k]: + plotbxd=1 + + if (plotbxd == 1): + ind = 0 + counter = 0 + for item in smd: + counter = counter + 1 + if item.name == samplelist[k]: + ind = counter + maxind=max(ind,maxind) + + # lines + if (oldgeno[k] == -1 and _geno == -1): + mylineColor = self.HAPLOTYPE_NEGATIVE + elif (oldgeno[k] == 1 and _geno == 1): + mylineColor = self.HAPLOTYPE_POSITIVE + elif (oldgeno[k] == 0 and _geno == 0): + mylineColor = self.HAPLOTYPE_HETEROZYGOUS + else: + mylineColor = self.HAPLOTYPE_RECOMBINATION # XZ: Unknown + + canvas.drawLine(drawStart, geneYLocation+7+2*ind*self.EACH_GENE_HEIGHT*zoom, drawEnd, geneYLocation+7+2*ind*self.EACH_GENE_HEIGHT*zoom, color = mylineColor, width=zoom*(self.EACH_GENE_HEIGHT+2)) + + fillColor=pid.black + outlineColor=pid.black + if lastGene == 0: + canvas.drawRect(geneStartPix, geneYLocation+2*ind*self.EACH_GENE_HEIGHT*zoom, geneEndPix, geneYLocation+2*ind*self.EACH_GENE_HEIGHT+ 2*self.EACH_GENE_HEIGHT*zoom, edgeColor = outlineColor, fillColor = fillColor) + + + COORDS = "%d, %d, %d, %d" %(geneStartPix, geneYLocation+ind*self.EACH_GENE_HEIGHT, geneEndPix+1, (geneYLocation + ind*self.EACH_GENE_HEIGHT)) + TITLE = "Strain: %s, marker (%s) \n Position %2.3f Mb." % (samplelist[k], _chr[j].name, float(txStart)) + HREF = '' + gifmap.areas.append(HT.Area(shape='rect',coords=COORDS,href=HREF, title=TITLE)) + + # if there are no more markers in a chromosome, the plotRight value calculated above will be before the plotWidth + # resulting in some empty space on the right side of the plot area. This draws an "unknown" bar from plotRight to the edge. + if (plotRight < (xLeftOffset + plotWidth - 3)) and (lastGene == 0): + drawEnd = xLeftOffset + plotWidth - 6 + mylineColor = self.HAPLOTYPE_RECOMBINATION + canvas.drawLine(plotRight, geneYLocation+7+2*ind*self.EACH_GENE_HEIGHT*zoom, drawEnd, geneYLocation+7+2*ind*self.EACH_GENE_HEIGHT*zoom, color = mylineColor, width=zoom*(self.EACH_GENE_HEIGHT+2)) - canvas.drawLine(drawStart, geneYLocation+7+2*ind*self.EACH_GENE_HEIGHT*zoom, drawEnd, geneYLocation+7+2*ind*self.EACH_GENE_HEIGHT*zoom, color = mylineColor, width=zoom*(self.EACH_GENE_HEIGHT+2)) - fillColor=pid.black - outlineColor=pid.black if lastGene == 0: - canvas.drawRect(geneStartPix, geneYLocation+2*ind*self.EACH_GENE_HEIGHT*zoom, geneEndPix, geneYLocation+2*ind*self.EACH_GENE_HEIGHT+ 2*self.EACH_GENE_HEIGHT*zoom, edgeColor = outlineColor, fillColor = fillColor) - - - COORDS = "%d, %d, %d, %d" %(geneStartPix, geneYLocation+ind*self.EACH_GENE_HEIGHT, geneEndPix+1, (geneYLocation + ind*self.EACH_GENE_HEIGHT)) - TITLE = "Strain: %s, marker (%s) \n Position %2.3f Mb." % (samplelist[j], self.genotype[0][i].name, float(txStart)) - HREF = '' - gifmap.areas.append(HT.Area(shape='rect',coords=COORDS,href=HREF, title=TITLE)) + canvas.drawString("%s" % (_chr[j].name), geneStartPix , geneYLocation+17+2*maxind*self.EACH_GENE_HEIGHT*zoom, font=pid.Font(ttf="verdana", size=12, bold=0), color=pid.black, angle=-90) - # if there are no more markers in a chromosome, the plotRight value calculated above will be before the plotWidth - # resulting in some empty space on the right side of the plot area. This draws an "unknown" bar from plotRight to the edge. - if (plotRight < (xLeftOffset + plotWidth - 3)) and (lastGene == 0): - drawEnd = xLeftOffset + plotWidth - 6 - mylineColor = self.HAPLOTYPE_RECOMBINATION - canvas.drawLine(plotRight, geneYLocation+7+2*ind*self.EACH_GENE_HEIGHT*zoom, drawEnd, geneYLocation+7+2*ind*self.EACH_GENE_HEIGHT*zoom, color = mylineColor, width=zoom*(self.EACH_GENE_HEIGHT+2)) - - - if lastGene == 0: - canvas.drawString("%s" % (self.genotype[0][i].name), geneStartPix , geneYLocation+17+2*maxind*self.EACH_GENE_HEIGHT*zoom, font=pid.Font(ttf="verdana", size=12, bold=0), color=pid.black, angle=-90) - - oldgeneEndPix = geneEndPix; - oldgeno = self.genotype[0][i].genotype - firstGene = 0 - else: - lastGene = 0 + oldgeneEndPix = geneEndPix; + oldgeno = _chr[j].genotype + firstGene = 0 + else: + lastGene = 0 - for j, _geno in enumerate (self.genotype[0][1].genotype): + for i, _chr in enumerate(self.genotype): + if _chr.name == self.ChrList[self.selectedChr][0]: + for j, _geno in enumerate(_chr[1]): - plotbxd=0 - for item in smd: - if item.name == samplelist[j]: - plotbxd=1 + plotbxd=0 + for item in smd: + if item.name == samplelist[j]: + plotbxd=1 - if (plotbxd == 1): + if (plotbxd == 1): - ind = 0 - counter = 0 - expr = 0 - for item in smd: - counter = counter + 1 - if item.name == samplelist[j]: - ind = counter - expr = item.value + ind = 0 + counter = 0 + expr = 0 + for item in smd: + counter = counter + 1 + if item.name == samplelist[j]: + ind = counter + expr = item.value - # Place where font is hardcoded - canvas.drawString("%s" % (samplelist[j]), (xLeftOffset + plotWidth + 10) , geneYLocation+8+2*ind*self.EACH_GENE_HEIGHT*zoom, font=pid.Font(ttf="verdana", size=12, bold=0), color=pid.black) - canvas.drawString("%2.2f" % (expr), (xLeftOffset + plotWidth + 60) , geneYLocation+8+2*ind*self.EACH_GENE_HEIGHT*zoom, font=pid.Font(ttf="verdana", size=12, bold=0), color=pid.black) + # Place where font is hardcoded + canvas.drawString("%s" % (samplelist[j]), (xLeftOffset + plotWidth + 10) , geneYLocation+8+2*ind*self.EACH_GENE_HEIGHT*zoom, font=pid.Font(ttf="verdana", size=12, bold=0), color=pid.black) + canvas.drawString("%2.2f" % (expr), (xLeftOffset + plotWidth + 60) , geneYLocation+8+2*ind*self.EACH_GENE_HEIGHT*zoom, font=pid.Font(ttf="verdana", size=12, bold=0), color=pid.black) ## END HaplotypeAnalyst @@ -2082,7 +2088,7 @@ class MarkerRegression(object): tableIterationsCnt = tableIterationsCnt + 1 this_row = [] #container for the cells of each row - selectCheck = HT.Input(type="checkbox", name="searchResult", value=theGO["GeneSymbol"], Class="checkbox", onClick="highlight(this)") #checkbox for each row + selectCheck = HT.Input(type="checkbox", name="searchResult", value=theGO["GeneSymbol"], Class="checkbox trait_checkbox") #checkbox for each row geneLength = (theGO["TxEnd"] - theGO["TxStart"])*1000.0 tenPercentLength = geneLength*0.0001 @@ -2153,7 +2159,7 @@ class MarkerRegression(object): else: this_row = [selectCheck.__str__(), str(tableIterationsCnt), - HT.Href(geneIdString, theGO["GeneSymbol"], target="_blank").__str__() + " " + probeSetSearch.__str__(), + HT.Href(geneIdString, theGO["GeneSymbol"], target="_blank").__str__(), HT.Href(mouseStartString, "%0.6f" % txStart, target="_blank").__str__(), HT.Href("javascript:rangeView('%s', %f, %f)" % (str(chr_as_int), txStart-tenPercentLength, txEnd+tenPercentLength), "%0.3f" % geneLength).__str__(), snpString, diff --git a/wqflask/wqflask/marker_regression/gemma_mapping.py b/wqflask/wqflask/marker_regression/gemma_mapping.py index c17f21aa..9e92838e 100644 --- a/wqflask/wqflask/marker_regression/gemma_mapping.py +++ b/wqflask/wqflask/marker_regression/gemma_mapping.py @@ -12,7 +12,7 @@ GEMMAOPTS = "-debug" if WEBSERVER_MODE == 'PROD': GEMMAOPTS = "-no-check" -def run_gemma(this_dataset, samples, vals, covariates, use_loco, maf=0.01): +def run_gemma(this_trait, this_dataset, samples, vals, covariates, use_loco, maf=0.01): """Generates p-values for each marker using GEMMA""" if this_dataset.group.genofile != None: @@ -20,7 +20,8 @@ def run_gemma(this_dataset, samples, vals, covariates, use_loco, maf=0.01): else: genofile_name = this_dataset.group.name - gen_pheno_txt_file(this_dataset, genofile_name, vals) + trait_filename = str(this_trait.name) + "_" + str(this_dataset.name) + "_pheno" + gen_pheno_txt_file(this_dataset, genofile_name, vals, trait_filename) if not os.path.isfile("{}{}_output.assoc.txt".format(webqtlConfig.GENERATED_IMAGE_DIR, genofile_name)): open("{}{}_output.assoc.txt".format(webqtlConfig.GENERATED_IMAGE_DIR, genofile_name), "w+") @@ -36,12 +37,13 @@ def run_gemma(this_dataset, samples, vals, covariates, use_loco, maf=0.01): if covariates != "": gen_covariates_file(this_dataset, covariates) + k_output_filename = this_dataset.group.name + "_K_" + ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(6)) + gwa_output_filename = this_dataset.group.name + "_GWA_" + ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(6)) if use_loco == "True": - k_output_filename = this_dataset.group.name + "_K_" + ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(6)) - generate_k_command = GEMMA_WRAPPER_COMMAND + ' --json --loco ' + chr_list_string + ' -- ' + GEMMAOPTS + ' -g %s/%s_geno.txt -p %s/%s_pheno.txt -a %s/%s_snps.txt -gk > %s/gn2/%s.json' % (flat_files('genotype/bimbam'), - genofile_name, - flat_files('genotype/bimbam'), + generate_k_command = GEMMA_WRAPPER_COMMAND + ' --json --loco ' + chr_list_string + ' -- ' + GEMMAOPTS + ' -g %s/%s_geno.txt -p %s/gn2/%s.txt -a %s/%s_snps.txt -gk > %s/gn2/%s.json' % (flat_files('genotype/bimbam'), genofile_name, + TEMPDIR, + trait_filename, flat_files('genotype/bimbam'), genofile_name, TEMPDIR, @@ -49,36 +51,62 @@ 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 -- ' % (TEMPDIR, k_output_filename) + GEMMAOPTS + ' -g %s/%s_geno.txt -p %s/%s_pheno.txt' % (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/gn2/%s.txt' % (flat_files('genotype/bimbam'), genofile_name, - flat_files('genotype/bimbam'), - genofile_name) - - gwa_output_filename = this_dataset.group.name + "_GWA_" + ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(6)) + TEMPDIR, + trait_filename) if covariates != "": - gemma_command += ' -c %s/%s_covariates.txt -a %s/%s_snps.txt -lmm 2 -maf 0.1 > %s/gn2/%s.json' % (flat_files('mapping'), - this_dataset.group.name, - flat_files('genotype/bimbam'), - genofile_name, - TEMPDIR, - gwa_output_filename) + gemma_command += ' -c %s/%s_covariates.txt -a %s/%s_snps.txt -lmm 2 -maf %s > %s/gn2/%s.json' % (flat_files('mapping'), + this_dataset.group.name, + flat_files('genotype/bimbam'), + genofile_name, + maf, + TEMPDIR, + gwa_output_filename) else: - gemma_command += ' -a %s/%s_snps.txt -lmm 2 -maf 0.1 > %s/gn2/%s.json' % (flat_files('genotype/bimbam'), + gemma_command += ' -a %s/%s_snps.txt -lmm 2 -maf %s > %s/gn2/%s.json' % (flat_files('genotype/bimbam'), genofile_name, + maf, TEMPDIR, gwa_output_filename) else: - gemma_command = GEMMA_COMMAND + ' ' + GEMMAOPTS + ' -g %s/%s_geno.txt -p %s/%s_pheno.txt -a %s/%s_snps.txt -k %s/%s.cXX.txt -lmm 2 -maf %s' % (flat_files('genotype/bimbam'), + generate_k_command = GEMMA_COMMAND + ' ' + GEMMAOPTS + ' -g %s/%s_geno.txt -p %s/gn2/%s.txt -a %s/%s_snps.txt -gk -outdir %s/gn2/ -o %s' % (flat_files('genotype/bimbam'), genofile_name, + TEMPDIR, + trait_filename, flat_files('genotype/bimbam'), genofile_name, - flat_files('genotype/bimbam'), + TEMPDIR, + k_output_filename) + #generate_k_command = GEMMA_WRAPPER_COMMAND + ' --json -- ' + GEMMAOPTS + ' -g %s/%s_geno.txt -p %s/%s.txt -a %s/%s_snps.txt -gk > %s/gn2/%s.json' % (flat_files('genotype/bimbam'), + # genofile_name, + # flat_files('genotype/bimbam'), + # trait_filename, + # flat_files('genotype/bimbam'), + # genofile_name, + # TEMPDIR, + # k_output_filename) + + logger.debug("k_command:" + generate_k_command) + os.system(generate_k_command) + + gemma_command = GEMMA_COMMAND + ' ' + GEMMAOPTS + ' -g %s/%s_geno.txt -p %s/gn2/%s.txt -a %s/%s_snps.txt -k %s/gn2/%s.cXX.txt -lmm 2 -maf %s' % (flat_files('genotype/bimbam'), genofile_name, + TEMPDIR, + trait_filename, flat_files('genotype/bimbam'), genofile_name, + TEMPDIR, + k_output_filename, maf) + #gemma_command = GEMMA_WRAPPER_COMMAND + ' --json --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) + + if covariates != "": gemma_command += ' -c %s/%s_covariates.txt -outdir %s -o %s_output' % (flat_files('mapping'), this_dataset.group.name, @@ -88,21 +116,37 @@ def run_gemma(this_dataset, samples, vals, covariates, use_loco, maf=0.01): gemma_command += ' -outdir %s -o %s_output' % (webqtlConfig.GENERATED_IMAGE_DIR, genofile_name) + #if covariates != "": + # gemma_command += ' -c %s/%s_covariates.txt -a %s/%s_snps.txt -lmm 2 -maf %s > %s/gn2/%s.json' % (flat_files('mapping'), + # this_dataset.group.name, + # flat_files('genotype/bimbam'), + # genofile_name, + # maf, + # TEMPDIR, + # gwa_output_filename) + #else: + # gemma_command += ' -a %s/%s_snps.txt -lmm 2 -maf %s > %s/gn2/%s.json' % (flat_files('genotype/bimbam'), + # genofile_name, + # maf, + # TEMPDIR, + # gwa_output_filename) + logger.debug("gemma_command:" + gemma_command) os.system(gemma_command) if use_loco == "True": marker_obs = parse_loco_output(this_dataset, gwa_output_filename) else: + #marker_obs = parse_loco_output(this_dataset, gwa_output_filename) marker_obs = parse_gemma_output(genofile_name) return marker_obs -def gen_pheno_txt_file(this_dataset, genofile_name, vals): +def gen_pheno_txt_file(this_dataset, genofile_name, vals, trait_filename): """Generates phenotype file for GEMMA""" current_file_data = [] - with open("{}/{}_pheno.txt".format(flat_files('genotype/bimbam'), genofile_name), "w") as outfile: + with open("{}/gn2/{}.txt".format(TEMPDIR, trait_filename), "w") as outfile: for value in vals: if value == "x": outfile.write("NA\n") diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/run_mapping.py index 17089c13..3057e340 100644 --- a/wqflask/wqflask/marker_regression/marker_regression.py +++ b/wqflask/wqflask/marker_regression/run_mapping.py @@ -45,7 +45,7 @@ from base.webqtlConfig import TMPDIR, GENERATED_TEXT_DIR import utility.logger logger = utility.logger.getLogger(__name__ ) -class MarkerRegression(object): +class RunMapping(object): def __init__(self, start_vars, temp_uuid): @@ -178,7 +178,7 @@ class MarkerRegression(object): self.score_type = "-log(p)" self.manhattan_plot = True with Bench("Running GEMMA"): - marker_obs = gemma_mapping.run_gemma(self.dataset, self.samples, self.vals, self.covariates, self.use_loco, self.maf) + marker_obs = gemma_mapping.run_gemma(self.this_trait, self.dataset, self.samples, self.vals, self.covariates, self.use_loco, self.maf) results = marker_obs elif self.mapping_method == "rqtl_plink": results = self.run_rqtl_plink() @@ -652,9 +652,9 @@ def trim_markers_for_table(markers): else: sorted_markers = sorted(markers, key=lambda k: k['lrs_value'], reverse=True) - #ZS: So we end up with a list of just 200 markers - if len(sorted_markers) >= 200: - trimmed_sorted_markers = sorted_markers[:200] + #ZS: So we end up with a list of just 2000 markers + if len(sorted_markers) >= 2000: + trimmed_sorted_markers = sorted_markers[:2000] return trimmed_sorted_markers else: return sorted_markers
\ No newline at end of file diff --git a/wqflask/wqflask/search_results.py b/wqflask/wqflask/search_results.py index 53c96591..c67063b0 100644 --- a/wqflask/wqflask/search_results.py +++ b/wqflask/wqflask/search_results.py @@ -23,6 +23,8 @@ from wqflask import do_search from utility import webqtlUtil,tools from db import webqtlDatabaseFunction +from wqflask import user_manager + from flask import render_template from utility import formatting @@ -44,18 +46,6 @@ views.py). # Names and IDs of group / F2 set ########################################### - # All Phenotypes is a special case we'll deal with later - #if kw['dataset'] == "All Phenotypes": - # self.cursor.execute(""" - # select PublishFreeze.Name, InbredSet.Name, InbredSet.Id from PublishFreeze, - # InbredSet where PublishFreeze.Name not like 'BXD300%' and InbredSet.Id = - # PublishFreeze.InbredSetId""") - # results = self.cursor.fetchall() - # self.dataset = map(lambda x: DataSet(x[0], self.cursor), results) - # self.dataset_groups = map(lambda x: x[1], results) - # self.dataset_group_ids = map(lambda x: x[2], results) - #else: - self.uc_id = uuid.uuid4() logger.debug("uc_id:", self.uc_id) # contains a unique id @@ -99,37 +89,63 @@ views.py). the "search" function """ - self.trait_list = [] + trait_list = [] json_trait_list = [] species = webqtlDatabaseFunction.retrieve_species(self.dataset.group.name) # result_set represents the results for each search term; a search of # "shh grin2b" would have two sets of results, one for each term logger.debug("self.results is:", pf(self.results)) + for index, result in enumerate(self.results): if not result: continue #### Excel file needs to be generated #### - #logger.debug("foo locals are:", locals()) + trait_dict = {} trait_id = result[0] + trait_dict['index'] = index + 1 this_trait = trait.GeneralTrait(dataset=self.dataset, name=trait_id, get_qtl_info=True, get_sample_info=False) - self.trait_list.append(this_trait) - json_trait_list.append(trait.jsonable_table_row(this_trait, self.dataset.name, index + 1)) - - self.json_trait_list = json.dumps(json_trait_list) - - #def get_group_species_tree(self): - # self.species_groups = collections.default_dict(list) - # for key in self.results: - # for item in self.results[key]: - # self.species_groups[item['result_fields']['species']].append( - # item['result_fields']['group_name']) + trait_dict['name'] = this_trait.name + trait_dict['dataset'] = this_trait.dataset.name + trait_dict['hmac'] = user_manager.data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) + if this_trait.dataset.type == "ProbeSet": + trait_dict['symbol'] = this_trait.symbol + trait_dict['description'] = this_trait.description_display + trait_dict['location'] = this_trait.location_repr + trait_dict['mean'] = "N/A" + trait_dict['additive'] = "N/A" + if this_trait.mean != "": + trait_dict['mean'] = '%.3f' % this_trait.mean + trait_dict['lrs_score'] = this_trait.LRS_score_repr + trait_dict['lrs_location'] = this_trait.LRS_location_repr + if this_trait.additive != "": + trait_dict['additive'] = '%.3f' % this_trait.additive + elif this_trait.dataset.type == "Geno": + trait_dict['location'] = this_trait.location_repr + elif this_trait.dataset.type == "Publish": + trait_dict['description'] = this_trait.description_display + trait_dict['authors'] = this_trait.authors + trait_dict['pubmed_id'] = "N/A" + if this_trait.pubmed_id: + trait_dict['pubmed_id'] = this_trait.pubmed_id + trait_dict['pubmed_link'] = this_trait.pubmed_link + trait_dict['pubmed_text'] = this_trait.pubmed_text + trait_dict['lrs_score'] = this_trait.LRS_score_repr + trait_dict['lrs_location'] = this_trait.LRS_location_repr + trait_dict['additive'] = "N/A" + if this_trait.additive != "": + trait_dict['additive'] = '%.3f' % this_trait.additive + trait_list.append(trait_dict) + #json_trait_list.append(trait.jsonable_table_row(this_trait, self.dataset.name, index + 1)) + + self.trait_list = json.dumps(trait_list) + #self.json_trait_list = json.dumps(json_trait_list) def search(self): - """This function sets up the actual search query in the form of a SQL -statement and executes + """ + This function sets up the actual search query in the form of a SQL statement and executes """ self.search_terms = parser.parse(self.search_terms) diff --git a/wqflask/wqflask/show_trait/SampleList.py b/wqflask/wqflask/show_trait/SampleList.py index 31d47ff2..50d7b6c0 100644 --- a/wqflask/wqflask/show_trait/SampleList.py +++ b/wqflask/wqflask/show_trait/SampleList.py @@ -46,7 +46,7 @@ class SampleList(object): sample_name = sample_name.replace("_2nd_", "") if type(self.this_trait) is list: #ZS: self.this_trait will be a list if it is a Temp trait - if counter <= len(self.this_trait) and self.this_trait[counter-1] != 'X': + if counter <= len(self.this_trait) and str(self.this_trait[counter-1]).upper() != 'X': sample = webqtlCaseData.webqtlCaseData(name=sample_name, value=float(self.this_trait[counter-1])) else: sample = webqtlCaseData.webqtlCaseData(name=sample_name) @@ -63,10 +63,7 @@ class SampleList(object): sample.extra_info['url'] = "/mouseCross.html#AXB/BXA" sample.extra_info['css_class'] = "fs12" - if sample_group_type == 'primary': - sample.this_id = "Primary_" + str(counter) - else: - sample.this_id = "Other_" + str(counter) + sample.this_id = str(counter) #### For extra attribute columns; currently only used by several datasets - Zach if self.sample_attribute_values: @@ -78,7 +75,6 @@ class SampleList(object): logger.debug("self.attributes is", pf(self.attributes)) self.do_outliers() - #do_outliers(the_samples) logger.debug("*the_samples are [%i]: %s" % (len(self.sample_list), pf(self.sample_list))) def __repr__(self): diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index 3f5030b2..2955f69a 100644 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -110,10 +110,10 @@ class ShowTrait(object): self.UCSC_BLAT_URL = webqtlConfig.UCSC_BLAT % ('rat', 'rn3', blatsequence) self.UTHSC_BLAT_URL = "" elif self.dataset.group.species == "mouse": - self.UCSC_BLAT_URL = webqtlConfig.UTHSC_BLAT2 % ('mouse', 'mm10', blatsequence) + self.UCSC_BLAT_URL = webqtlConfig.UCSC_BLAT % ('mouse', 'mm10', blatsequence) self.UTHSC_BLAT_URL = webqtlConfig.UTHSC_BLAT % ('mouse', 'mm10', blatsequence) elif self.dataset.group.species == "human": - self.UCSC_BLAT_URL = webqtlConfig.UTHSC_BLAT2 % ('human', 'hg19', blatsequence) + self.UCSC_BLAT_URL = webqtlConfig.UCSC_BLAT % ('human', 'hg19', blatsequence) self.UTHSC_BLAT_URL = "" else: self.UCSC_BLAT_URL = "" @@ -153,7 +153,8 @@ class ShowTrait(object): hddn['group'] = self.temp_group hddn['species'] = self.temp_species hddn['use_outliers'] = False - hddn['method'] = "pylmm" + hddn['method'] = "gemma" + hddn['selected_chr'] = -1 hddn['mapping_display_all'] = True hddn['suggestive'] = 0 hddn['num_perm'] = 0 @@ -182,19 +183,34 @@ class ShowTrait(object): self.sample_group_types['samples_primary'] = self.dataset.group.name sample_lists = [group.sample_list for group in self.sample_groups] + #ZS: Get list of chromosomes to select for mapping + self.chr_list = [["All", -1]] + for i, this_chr in enumerate(self.dataset.species.chromosomes.chromosomes): + self.chr_list.append([self.dataset.species.chromosomes.chromosomes[this_chr].name, i]) + self.genofiles = get_genofiles(self.dataset) self.has_num_cases = has_num_cases(self.this_trait) self.stats_table_width, self.trait_table_width = get_table_widths(self.sample_groups, self.has_num_cases) - #ZS: Needed to know whether to display bar chart + #ZS: Needed to know whether to display bar chart + get max sample name length in order to set table column width self.num_values = 0 + max_samplename_width = 1 for group in self.sample_groups: for sample in group.sample_list: + if len(sample.name) > max_samplename_width: + max_samplename_width = len(sample.name) if sample.display_value != "x": self.num_values += 1 + sample_column_width = max_samplename_width * 8 + + if self.num_values >= 500: + self.maf = 0.01 + else: + self.maf = 0.05 + trait_symbol = None if not self.temp_trait: if self.this_trait.symbol: @@ -207,6 +223,8 @@ class ShowTrait(object): sample_group_types = self.sample_group_types, sample_lists = sample_lists, attribute_names = self.sample_groups[0].attributes, + num_values = self.num_values, + sample_column_width = sample_column_width, temp_uuid = self.temp_uuid) self.js_data = js_data @@ -300,6 +318,7 @@ def quantile_normalize_vals(sample_groups): p_list.append(((i+1) - 0.5)/len(trait_vals)) z = ss.norm.ppf(p_list) + normed_vals = [] for rank in ranked_vals: normed_vals.append("%0.3f" % z[int(rank)-1]) @@ -316,7 +335,6 @@ def quantile_normalize_vals(sample_groups): continue qnorm_vals = normf(trait_vals) - qnorm_vals_with_x = [] counter = 0 for sample in sample_type.sample_list: @@ -367,15 +385,14 @@ def get_table_widths(sample_groups, has_num_cases=False): if len(sample_groups) > 1: stats_table_width = 450 - trait_table_width = 25 + trait_table_width = 380 if sample_groups[0].se_exists(): - trait_table_width += 15 + trait_table_width += 70 if has_num_cases: - trait_table_width += 5 - if (trait_table_width + len(sample_groups[0].attributes)*10) > 100: - trait_table_width = 100 - else: - trait_table_width += len(sample_groups[0].attributes)*10 + trait_table_width += 30 + trait_table_width += len(sample_groups[0].attributes)*40 + + trait_table_width = str(trait_table_width) + "px" return stats_table_width, trait_table_width diff --git a/wqflask/wqflask/snp_browser/snp_browser.py b/wqflask/wqflask/snp_browser/snp_browser.py index df68d4a0..820551eb 100644 --- a/wqflask/wqflask/snp_browser/snp_browser.py +++ b/wqflask/wqflask/snp_browser/snp_browser.py @@ -1,118 +1,161 @@ from __future__ import absolute_import, print_function, division -from flask import Flask, g +from flask import Flask, g, url_for + +from htmlgen import HTMLgen2 as HT import string +import piddle as pid from utility.logger import getLogger logger = getLogger(__name__ ) from base import species +from base import webqtlConfig class SnpBrowser(object): - MAXSNPRETURN = 5000 - def __init__(self, start_vars): - self.strain_list = get_browser_sample_list() + self.strain_lists = get_browser_sample_lists() self.initialize_parameters(start_vars) + self.limit_number = 10000 if self.first_run == "false": + self.filtered_results = self.get_browser_results() + + if len(self.filtered_results) <= self.limit_number: + self.table_rows = self.get_table_rows() + else: + self.empty_columns = None + self.table_rows = [] + if self.limit_strains == "true": - self.header_fields = get_header_list(self.variant_type, self.chosen_strains) + self.header_fields, self.empty_field_count = get_header_list(variant_type = self.variant_type, strains = self.chosen_strains, empty_columns = self.empty_columns) else: - self.header_fields = get_header_list(self.variant_type, self.strain_list) - self.filtered_results = self.get_table_results() + self.header_fields, self.empty_field_count = get_header_list(variant_type = self.variant_type, strains = self.strain_lists, species = self.species_name, empty_columns = self.empty_columns) 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) + if 'first_run' in start_vars: self.first_run = "false" + else: + self.first_run = "true" + self.allele_list = [] + + self.variant_type = "SNP" + if 'variant' in start_vars: self.variant_type = start_vars['variant'] + + self.species_name = "Mouse" + self.species_id = 1 + if 'species' in start_vars: self.species_name = start_vars['species'] - if self.species_name.capitalize() == "Mouse": - self.species_id = 1 - elif self.species_name.capitalize() == "Rat": + if self.species_name.capitalize() == "Rat": self.species_id = 2 + + self.mouse_chr_list = [] + self.rat_chr_list = [] + mouse_species_ob = species.TheSpecies(species_name="Mouse") + for key in mouse_species_ob.chromosomes.chromosomes: + self.mouse_chr_list.append(mouse_species_ob.chromosomes.chromosomes[key].name) + rat_species_ob = species.TheSpecies(species_name="Rat") + for key in rat_species_ob.chromosomes.chromosomes: + self.rat_chr_list.append(rat_species_ob.chromosomes.chromosomes[key].name) + + if self.species_id == 1: + self.this_chr_list = self.mouse_chr_list + else: + self.this_chr_list = self.rat_chr_list + + if self.first_run == "true": + self.chr = "19" + self.start_mb = 30.1 + self.end_mb = 30.12 + else: + if 'gene_name' in start_vars: + 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 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.chr = start_vars['chr'] self.start_mb = float(start_vars['start_mb']) self.end_mb = float(start_vars['end_mb']) except: + self.chr = "1" self.start_mb = 0.0 self.end_mb = 0.0 - if 'limit_strains' in start_vars: - self.limit_strains = "true" - else: + self.limit_strains = "true" + if self.first_run == "false": + if 'limit_strains' not in start_vars: self.limit_strains = "false" - self.chosen_strains = start_vars['chosen_strains'].split(",") + else: + if start_vars['limit_strains'] == "false": + self.limit_strains = "false" + + self.chosen_strains_mouse = ["C57BL/6J", + "DBA/2J", + "A/J", + "129S1/SvImJ", + "NOD/ShiLtJ", + "NZO/HlLtJ", + "WSB/EiJ", + "PWK/PhJ", + "CAST/EiJ"] + self.chosen_strains_rat = ["BN", "F344", "WLI", "WMI"] + if 'chosen_strains_mouse' in start_vars: + self.chosen_strains_mouse = start_vars['chosen_strains_mouse'].split(",") + if 'chosen_strains_rat' in start_vars: + self.chosen_strains_rat = start_vars['chosen_strains_rat'].split(",") + + if self.species_id == 1: + self.chosen_strains = self.chosen_strains_mouse + else: + self.chosen_strains = self.chosen_strains_rat + + self.domain = "All" + if 'domain' in start_vars: self.domain = start_vars['domain'] + self.function = "All" + if 'function' in start_vars: self.function = start_vars['function'] + self.source = "All" + if 'source' in start_vars: self.source = start_vars['source'] + self.criteria = ">=" + if 'criteria' in start_vars: self.criteria = start_vars['criteria'] + self.score = 0.0 + if 'score' in start_vars: 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.redundant = "false" + if self.first_run == "false" and 'redundant' in start_vars: + self.redundant = "true" + self.diff_alleles = "true" + if self.first_run == "false": + if 'diff_alleles' not in start_vars: + self.diff_alleles = "false" + else: + if start_vars['diff_alleles'] == "false": + self.diff_alleles = "false" - 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): + def get_browser_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) + if self.species_id != 0: + query = "SELECT geneSymbol, chromosome, txStart, txEnd FROM GeneList WHERE SpeciesId = %s AND geneSymbol = '%s'" % (self.species_id, self.gene_name) + else: + query = "SELECT geneSymbol, chromosome, txStart, txEnd FROM GeneList WHERE geneSymbol = '%s'" % (self.gene_name) result = g.db.execute(query).fetchone() if result: self.gene_name, self.chr, self.start_mb, self.end_mb = result @@ -120,9 +163,12 @@ class SnpBrowser(object): 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 + 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) + if self.species_id != 0: + query = "SELECT Id, Chromosome, Position, Position+0.000001 FROM SnpAll where SpeciesId = %s AND SnpName = '%s'" % (self.species_id, self.gene_name) + else: + query = "SELECT Id, Chromosome, Position, Position+0.000001 FROM SnpAll where SnpName = '%s'" % (self.gene_name) result_snp = g.db.execute(query).fetchall() if result_snp: self.snp_list = [item[0] for item in result_snp] @@ -133,7 +179,10 @@ class SnpBrowser(object): 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) + if self.species_id != 0: + query = "SELECT Id, Chromosome, Mb_start, Mb_end FROM IndelAll WHERE SpeciesId = %s AND Name = '%s'" % (self.species_id, self.gene_name) + else: + query = "SELECT Id, Chromosome, Mb_start, Mb_end FROM IndelAll WHERE Name = '%s'" % (self.gene_name) result_snp = g.db.execute(query).fetchall() if result_snp: self.snp_list = [item[0] for item in result_snp] @@ -144,29 +193,59 @@ class SnpBrowser(object): return if self.variant_type == "SNP": - query = """ + mouse_query = """ SELECT - a.*, b.* + a.*, b.* FROM - SnpAll a, SnpPattern b + 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 + 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 = """ + + rat_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 + a.*, b.* FROM - IndelAll a, SnpSource b + SnpAll a, RatSnpPattern 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) + if self.species_id == 1: + query = mouse_query + elif self.species_id == 2: + query = rat_query + + elif self.variant_type == "InDel": + if self.species_id != 0: + 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) + ORDER BY a.Mb_start + """ % (self.species_id, self.chr, self.start_mb, self.end_mb) + else: + 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.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.chr, self.start_mb, self.end_mb) results_all = g.db.execute(query).fetchall() @@ -179,7 +258,7 @@ class SnpBrowser(object): if self.limit_strains == "true" and len(self.chosen_strains) > 0: for item in self.chosen_strains: - index = self.strain_list.index(item) + index = self.strain_lists[self.species_name.lower()].index(item) strain_index_list.append(index) for seq, result in enumerate(results): @@ -188,12 +267,18 @@ class SnpBrowser(object): 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:] + effect_list = result[10:28] + if self.species_id == 1: + self.allele_list = result[30:] + elif self.species_id == 2: + self.allele_list = result[31:] if self.limit_strains == "true" and len(self.chosen_strains) > 0: for index in strain_index_list: - display_strains.append(result[27+index]) + if self.species_id == 1: + display_strains.append(result[29+index]) + elif self.species_id == 2: + display_strains.append(result[31+index]) self.allele_list = display_strains effect_info_dict = get_effect_info(effect_list) @@ -213,7 +298,12 @@ class SnpBrowser(object): domain = [key, ''] if 'Intergenic' in domain: - gene = transcript = exon = function = function_details = '' + if self.gene_name != "": + gene_id = get_gene_id(self.species_id, self.gene_name) + gene = [gene_id, self.gene_name] + else: + 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] @@ -249,7 +339,7 @@ class SnpBrowser(object): filtered_results.append(info_list) last_mb = mb - elif self.variant == "InDel": + elif self.variant_type == "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 @@ -266,6 +356,182 @@ class SnpBrowser(object): return filtered_results + def get_table_rows(self): + """ Take results and put them into the order and format necessary for the tables rows """ + + if self.variant_type == "SNP": + gene_name_list = [] + for item in self.filtered_results: + if item[5] and item[5] != "": + gene_name = item[5][1] + # eliminate duplicate gene_name + if gene_name and (gene_name not in gene_name_list): + gene_name_list.append(gene_name) + if len(gene_name_list) > 0: + gene_id_name_dict = get_gene_id_name_dict(self.species_id, gene_name_list) + + #ZS: list of booleans representing which columns are entirely empty, so they aren't displayed on the page; only including ones that are sometimes empty (since there's always a location, etc) + self.empty_columns = { + "snp_source": "false", + "conservation_score": "false", + "gene_name": "false", + "transcript": "false", + "exon": "false", + "domain_2": "false", + "function": "false", + "function_details": "false" + } + + the_rows = [] + for i, result in enumerate(self.filtered_results): + this_row = [] + if self.variant_type == "SNP": + snp_name, rs, chr, mb, alleles, gene, transcript, exon, domain, function, function_details, snp_source, conservation_score, snp_id = result[:14] + allele_value_list = result[14:] + if rs: + snp_url = webqtlConfig.DBSNP % (rs) + snp_name = rs + else: + rs = "" + start_bp = int(mb*1000000 - 100) + end_bp = int(mb*1000000 + 100) + position_info = "chr%s:%d-%d" % (chr, start_bp, end_bp) + if self.species_id == 2: + snp_url = webqtlConfig.GENOMEBROWSER_URL % ("rn6", position_info) + else: + snp_url = webqtlConfig.GENOMEBROWSER_URL % ("mm10", position_info) + + mb = float(mb) + mb_formatted = "%2.6f" % mb + + if snp_source == "Sanger/UCLA": + source_url_1 = "http://www.sanger.ac.uk/resources/mouse/genomes/" + source_url_2 = "http://mouse.cs.ucla.edu/mousehapmap/beta/wellcome.html" + source_urls = [source_url_1, source_url_2] + self.empty_columns['snp_source'] = "true" + else: + source_urls = [] + + if not conservation_score: + conservation_score = "" + else: + self.empty_columns['conservation_score'] = "true" + + if gene: + gene_name = gene[1] + # if gene_name has related gene_id, use gene_id for NCBI search + if (gene_name in gene_id_name_dict) and (gene_id_name_dict[gene_name] != None and gene_id_name_dict[gene_name] != ""): + gene_id = gene_id_name_dict[gene[1]] + gene_link = webqtlConfig.NCBI_LOCUSID % gene_id + else: + gene_link = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?CMD=search&DB=gene&term=%s" % gene_name + + self.empty_columns['gene_name'] = "true" + else: + gene_name = "" + gene_link = "" + + if transcript: + transcript_link = webqtlConfig.ENSEMBLETRANSCRIPT_URL % (transcript) + self.empty_columns['transcript'] = "true" + else: + transcript_link = "" + + if exon: + exon = exon[1] # exon[0] is exon_id, exon[1] is exon_rank + self.empty_columns['exon'] = "true" + else: + exon = "" + + if domain: + domain_1 = domain[0] + domain_2 = domain[1] + if domain_1 == "Intergenic" and self.gene_name != "": + domain_1 = self.gene_name + else: + if domain_1 == "Exon": + domain_1 = domain_1 + " " + exon + + if domain_2 != "": + self.empty_columns['domain_2'] = "true" + + if function: + self.empty_columns['function'] = "true" + + function_list = [] + if function_details: + function_list = string.split(string.strip(function_details), ",") + function_list = map(string.strip, function_list) + function_list[0] = function_list[0].title() + function_details = ", ".join(item for item in function_list) + function_details = function_details.replace("_", " ") + function_details = function_details.replace("/", " -> ") + if function_details == "Biotype: Protein Coding": + function_details = function_details + ", Coding Region Unknown" + + self.empty_columns['function_details'] = "true" + + #[snp_href, chr, mb_formatted, alleles, snp_source_cell, conservation_score, gene_name_cell, transcript_href, exon, domain_1, domain_2, function, function_details] + + base_color_dict = {"A": "#C33232", "C": "#1569C7", "T": "#CFCF32", "G": "#32C332", + "t": "#FF6", "c": "#5CB3FF", "a": "#F66", "g": "#CF9", ":": "#FFFFFF", "-": "#FFFFFF", "?": "#FFFFFF"} + + + the_bases = [] + for j, item in enumerate(allele_value_list): + if item: + this_base = [item, base_color_dict[item]] + else: + this_base = "" + + the_bases.append(this_base) + + this_row = { + "index": i + 1, + "rs": rs, + "snp_url": snp_url, + "snp_name": snp_name, + "chr": chr, + "mb_formatted": mb_formatted, + "alleles": alleles, + "snp_source": snp_source, + "source_urls": source_urls, + "conservation_score": conservation_score, + "gene_name": gene_name, + "gene_link": gene_link, + "transcript": transcript, + "transcript_link": transcript_link, + "exon": exon, + "domain_1": domain_1, + "domain_2": domain_2, + "function": function, + "function_details": function_details, + "allele_value_list": the_bases + } + + elif self.variant_type == "InDel": + indel_name, indel_chr, indel_mb_s, indel_mb_e, indel_strand, indel_type, indel_size, indel_sequence, source_name = result + this_row = { + "index": i, + "indel_name": indel_name, + "indel_chr": indel_chr, + "indel_mb_s": indel_mb_s, + "indel_mb_e": indel_mb_e, + "indel_strand": indel_strand, + "indel_type": indel_type, + "indel_size": indel_size, + "indel_sequence": indel_sequence, + "source_name": source_name + } + #this_row = [indel_name, indel_chr, indel_mb_s, indel_mb_e, indel_strand, indel_type, indel_size, indel_sequence, source_name] + else: + this_row = {} + + the_rows.append(this_row) + + return the_rows + + def include_record(self, domain, function, snp_source, conservation_score): """ Decide whether to add this record """ @@ -304,7 +570,10 @@ class SnpBrowser(object): function_satisfied = False else: function_satisfied = False - if function.startswith(self.function): + if self.function != "All": + if function.startswith(self.function): + function_satisfied = True + else: function_satisfied = True else: if self.function != "All": @@ -358,25 +627,91 @@ class SnpBrowser(object): 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 = [] + def snp_density_map(self, query, results): + + canvas_width = 900 + canvas_height = 200 + snp_canvas = pid.PILCanvas(size=(canvas_width, canvas_height)) + left_offset, right_offset, top_offset, bottom_offset = (30, 30, 40, 50) + plot_width = canvas_width - left_offset - right_offset + plot_height = canvas_height - top_offset - bottom_offset + y_zero = top_offset + plot_height/2 + + x_scale = plot_width/(self.end_mb - self.start_mb) + + #draw clickable image map + #gifmap = HT.Map + n_click = 80.0 + click_step = plot_width/n_click + click_mb_step = (self.end_mb - self.start_mb)/n_click + + #for i in range(n_click): + # href = url_for('snp_browser', first_run="false", chosen_strains_mouse=self.chosen_strains_mouse, chosen_strains_rat=self.chosen_strains_rat, variant=self.variant_type, species=self.species_name, gene_name=self.gene_name, chr=self.chr, start_mb=self.start_mb, end_mb=self.end_mb, limit_strains=self.limit_strains, domain=self.domain, function=self.function, criteria=self.criteria, score=self.score, diff_alleles=self.diff_alleles) + +def get_browser_sample_lists(species_id=1): + strain_lists = {} + mouse_strain_list = [] query = "SHOW COLUMNS FROM SnpPattern;" results = g.db.execute(query).fetchall(); for result in results[1:]: - sample_list.append(result[0]) + mouse_strain_list.append(result[0]) + + rat_strain_list = [] + query = "SHOW COLUMNS FROM RatSnpPattern;" + results = g.db.execute(query).fetchall(); + for result in results[2:]: + rat_strain_list.append(result[0]) + + strain_lists['mouse'] = mouse_strain_list + strain_lists['rat'] = rat_strain_list - return sample_list + return strain_lists -def get_header_list(variant_type, strain_list): +def get_header_list(variant_type, strains, species = None, empty_columns = None): + if species == "Mouse": + strain_list = strains['mouse'] + elif species == "Rat": + strain_list = strains['rat'] + else: + strain_list = strains + + empty_field_count = 0 #ZS: This is an awkward way of letting the javascript know the index where the allele value columns start; there's probably a better way of doing this + + header_fields = [] 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) + header_fields.append(['Index', 'SNP ID', 'Chr', 'Mb', 'Alleles', 'Source', 'ConScore', 'Gene', 'Transcript', 'Exon', 'Domain 1', 'Domain 2', 'Function', 'Details']) + header_fields.append(strain_list) + + if empty_columns != None: + if empty_columns['snp_source'] == "false": + empty_field_count += 1 + header_fields[0].remove('Source') + if empty_columns['conservation_score'] == "false": + empty_field_count += 1 + header_fields[0].remove('ConScore') + if empty_columns['gene_name'] == "false": + empty_field_count += 1 + header_fields[0].remove('Gene') + if empty_columns['transcript'] == "false": + empty_field_count += 1 + header_fields[0].remove('Transcript') + if empty_columns['exon'] == "false": + empty_field_count += 1 + header_fields[0].remove('Exon') + if empty_columns['domain_2'] == "false": + empty_field_count += 1 + header_fields[0].remove('Domain 2') + if empty_columns['function'] == "false": + empty_field_count += 1 + header_fields[0].remove('Function') + if empty_columns['function_details'] == "false": + empty_field_count += 1 + header_fields[0].remove('Details') + 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 + return header_fields, empty_field_count def get_effect_details_by_category(effect_name = None, effect_value = None): gene_list = [] @@ -433,7 +768,7 @@ def get_effect_info(effect_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:] + exon, non_synonymous_coding, synonymous_coding, start_gained, start_lost, stop_gained, stop_lost, unknown_effect_in_exon = effect_list[8:16] if intergenic: domain = "Intergenic" @@ -454,7 +789,7 @@ def get_effect_info(effect_list): 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" + domain = "Nonsplice Site" 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 @@ -498,3 +833,46 @@ def get_effect_info(effect_list): effect_info_dict[domain] = effect_detail_list return effect_info_dict + +def get_gene_id(species_id, gene_name): + query = """ + SELECT + geneId + FROM + GeneList + WHERE + SpeciesId = %s AND geneSymbol = '%s' + """ % (species_id, gene_name) + + result = g.db.execute(query).fetchone() + + if len(result) > 0: + return result + else: + return "" + +def get_gene_id_name_dict(species_id, gene_name_list): + gene_id_name_dict = {} + if len(gene_name_list) == 0: + return "" + gene_name_str_list = ["'" + gene_name + "'" for gene_name in gene_name_list] + gene_name_str = string.join(gene_name_str_list, ",") + + query = """ + SELECT + geneId, geneSymbol + FROM + GeneList + WHERE + SpeciesId = %s AND geneSymbol in (%s) + """ % (species_id, gene_name_str) + + results = g.db.execute(query).fetchall() + + if len(results) > 0: + for item in results: + gene_id_name_dict[item[1]] = item[0] + else: + pass + + return gene_id_name_dict diff --git a/wqflask/wqflask/static/new/css/main.css b/wqflask/wqflask/static/new/css/main.css index 880395a7..097cd997 100644 --- a/wqflask/wqflask/static/new/css/main.css +++ b/wqflask/wqflask/static/new/css/main.css @@ -1,11 +1,36 @@ -.security_box { - padding-left: 30px; - padding-right: 30px; -} - -ol { - font-family: Arial; - font-weight: bold; - font-size: 16px; - color: #000082 +@media (max-width: 10px) { + .navbar-header { + float: none; + } + .navbar-toggle { + display: block; + } + .navbar-collapse { + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255,255,255,0.1); + } + .navbar-collapse.collapse { + display: none!important; + } + .navbar-nav { + float: none!important; + margin: 7.5px -15px; + } + .navbar-nav>li { + float: none; + } + .navbar-nav>li>a { + padding-top: 10px; + padding-bottom: 10px; + } + .navbar-text { + float: none; + margin: 15px 0; + } + .navbar-collapse.collapse.in { + display: block!important; + } + .collapsing { + overflow: hidden!important; + } }
\ No newline at end of file diff --git a/wqflask/wqflask/static/new/css/marker_regression.css b/wqflask/wqflask/static/new/css/marker_regression.css index d81b5021..f1a26a83 100644 --- a/wqflask/wqflask/static/new/css/marker_regression.css +++ b/wqflask/wqflask/static/new/css/marker_regression.css @@ -35,4 +35,38 @@ rect.pane { /*rect { stroke: WhiteSmoke; fill: Azure; -}*/
\ No newline at end of file +}*/ + +tr .outlier { + background-color: #ffff99; +} + +table.dataTable thead th{ + border-right: 1px solid white; + color: white; + background-color: #369; +} + +table.dataTable thead .sorting_asc { + background-image: url("../packages/DataTables/images/sort_asc_disabled.png"); +} +table.dataTable thead .sorting_desc { + background-image: url("../packages/DataTables/images/sort_desc_disabled.png"); +} + +table.dataTable thead th { + padding: 4px 18px 4px 10px; +} + +table.dataTable tbody td { + padding: 4px 20px 2px 10px; +} + +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #ccc; + border-right: 1px solid #ccc; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #ccc; +}
\ No newline at end of file diff --git a/wqflask/wqflask/static/new/css/show_trait.css b/wqflask/wqflask/static/new/css/show_trait.css index 1e9fd4df..09d5e1e3 100644 --- a/wqflask/wqflask/static/new/css/show_trait.css +++ b/wqflask/wqflask/static/new/css/show_trait.css @@ -8,4 +8,38 @@ tr .outlier { div.sample_group { overflow: auto; # needed because it contains float dataTable wrapper +} + +.js-plotly-plot .plotly .modebar { + left: 100px; +} + +table.dataTable thead th, table.dataTable tfoot th{ + border-right: 1px solid white; + color: white; + background-color: #369; +} + +table.dataTable thead .sorting_asc { + background-image: url("../packages/DataTables/images/sort_asc_disabled.png"); +} +table.dataTable thead .sorting_desc { + background-image: url("../packages/DataTables/images/sort_desc_disabled.png"); +} + +table.dataTable thead th, table.dataTable tfoot { + padding: 4px 18px 4px 10px; +} + +table.dataTable tbody td { + padding: 4px 20px 2px 10px; +} + +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #ccc; + border-right: 1px solid #ccc; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #ccc; }
\ No newline at end of file diff --git a/wqflask/wqflask/static/new/css/snp_browser.css b/wqflask/wqflask/static/new/css/snp_browser.css new file mode 100644 index 00000000..30fe9a59 --- /dev/null +++ b/wqflask/wqflask/static/new/css/snp_browser.css @@ -0,0 +1,54 @@ +.form_group { + margin-bottom 5px; +} + +table.dataTable thead th { + vertical-align: bottom; +} + +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + background-repeat: no-repeat; + background-position: bottom right; +} + +table.dataTable thead th{ + border-right: 1px solid white; + color: white; + background-color: royalblue; +} + +table.dataTable tbody td { + padding: 4px 20px 2px 10px; +} + +td.A_allele_color { + background-color: #C33232 +} +td.C_allele_color { + background-color: #1569C7 +} +td.T_allele_color { + background-color: #CFCF32 +} +td.G_allele_color { + background-color: #32C332 +} +td.t_allele_color { + background-color: #FF6 +} +td.c_allele_color { + background-color: #5CB3FF +} +td.a_allele_color { + background-color: #F66 +} +td.g_allele_color { + background-color: #CF9 +} +td.default_allele_color { + background-color: #FFFFFF +}
\ No newline at end of file diff --git a/wqflask/wqflask/static/new/css/typeahead-bootstrap.css b/wqflask/wqflask/static/new/css/typeahead-bootstrap.css new file mode 100644 index 00000000..87dd4b5d --- /dev/null +++ b/wqflask/wqflask/static/new/css/typeahead-bootstrap.css @@ -0,0 +1,94 @@ +span.twitter-typeahead .tt-menu, +span.twitter-typeahead .tt-dropdown-menu { + cursor: pointer; + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +span.twitter-typeahead .tt-suggestion { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; +} +span.twitter-typeahead .tt-suggestion.tt-cursor, +span.twitter-typeahead .tt-suggestion:hover, +span.twitter-typeahead .tt-suggestion:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #337ab7; +} +.input-group.input-group-lg span.twitter-typeahead .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.input-group.input-group-sm span.twitter-typeahead .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +span.twitter-typeahead { + width: 100%; +} +.input-group span.twitter-typeahead { + display: block !important; + height: 34px; +} +.input-group span.twitter-typeahead .tt-menu, +.input-group span.twitter-typeahead .tt-dropdown-menu { + top: 32px !important; +} +.input-group span.twitter-typeahead:not(:first-child):not(:last-child) .form-control { + border-radius: 0; +} +.input-group span.twitter-typeahead:first-child .form-control { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group span.twitter-typeahead:last-child .form-control { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.input-group.input-group-sm span.twitter-typeahead { + height: 30px; +} +.input-group.input-group-sm span.twitter-typeahead .tt-menu, +.input-group.input-group-sm span.twitter-typeahead .tt-dropdown-menu { + top: 30px !important; +} +.input-group.input-group-lg span.twitter-typeahead { + height: 46px; +} +.input-group.input-group-lg span.twitter-typeahead .tt-menu, +.input-group.input-group-lg span.twitter-typeahead .tt-dropdown-menu { + top: 46px !important; +}
\ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/dataset_menu_structure.json b/wqflask/wqflask/static/new/javascript/dataset_menu_structure.json index 1c6791c4..3f2673c1 100644 --- a/wqflask/wqflask/static/new/javascript/dataset_menu_structure.json +++ b/wqflask/wqflask/static/new/javascript/dataset_menu_structure.json @@ -117,14 +117,14 @@ "Barley1 Leaf MAS 5.0 SCRI (Dec06)" ], [ - "125", - "B30_K_1206_R", - "Barley1 Leaf gcRMA SCRI (Dec06)" - ], - [ "126", "B30_K_1206_Rn", "Barley1 Leaf gcRMAn SCRI (Dec06)" + ], + [ + "125", + "B30_K_1206_R", + "Barley1 Leaf gcRMA SCRI (Dec06)" ] ], "Phenotypes": [ @@ -1557,6 +1557,42 @@ ] ] }, + "AIL-LGSM-F34-A": { + "Phenotypes": [ + [ + "None", + "AIL-LGSM-F34-APublish", + "AIL-LGSM-F34-A Phenotypes" + ] + ] + }, + "AIL-LGSM-F34-F39-43-GBS": { + "Phenotypes": [ + [ + "None", + "AIL-LGSM-F34-F39-43-GBSPublish", + "AIL-LGSM-F34-F39-43-GBS Phenotypes" + ] + ] + }, + "AIL-LGSM-F34-GBS": { + "Phenotypes": [ + [ + "None", + "AIL-LGSM-F34-GBSPublish", + "AIL-LGSM-F34-GBS Phenotypes" + ] + ] + }, + "AIL-LGSM-F39-43-GBS": { + "Phenotypes": [ + [ + "None", + "AIL-LGSM-F39-43-GBSPublish", + "AIL-LGSM-F39-43-GBS Phenotypes" + ] + ] + }, "AKXD": { "Genotypes": [ [ @@ -1572,14 +1608,14 @@ "NCI Mammary LMT miRNA v2 (Apr09) RMA" ], [ - "36", - "MA_M_0704_M", - "NCI Mammary mRNA M430 (July04) MAS5" - ], - [ "37", "MA_M_0704_R", "NCI Mammary mRNA M430 (July04) RMA" + ], + [ + "36", + "MA_M_0704_M", + "NCI Mammary mRNA M430 (July04) MAS5" ] ] }, @@ -1647,14 +1683,14 @@ ], "Liver mRNA": [ [ - "38", - "LVF2_M_0704_M", - "(B6 x BTBR)F2-ob/ob Liver mRNA M430 (Jul04) MAS5" - ], - [ "39", "LVF2_M_0704_R", "(B6 x BTBR)F2-ob/ob Liver mRNA M430 (Jul04) RMA" + ], + [ + "38", + "LVF2_M_0704_M", + "(B6 x BTBR)F2-ob/ob Liver mRNA M430 (Jul04) MAS5" ] ], "Phenotypes": [ @@ -1677,16 +1713,16 @@ "B6D2F2": { "Brain mRNA": [ [ - "76", - "BRF2_M_0805_M", - "OHSU/VA B6D2F2 Brain mRNA M430 (Aug05) MAS5" - ], - [ "77", "BRF2_M_0805_R", "OHSU/VA B6D2F2 Brain mRNA M430 (Aug05) RMA" ], [ + "76", + "BRF2_M_0805_M", + "OHSU/VA B6D2F2 Brain mRNA M430 (Aug05) MAS5" + ], + [ "78", "BRF2_M_0805_P", "OHSU/VA B6D2F2 Brain mRNA M430 (Aug05) PDNN" @@ -1697,14 +1733,14 @@ "OHSU/VA B6D2F2 Brain mRNA M430A (Mar04) PDNN" ], [ - "31", - "BRF2_M_0304_M", - "OHSU/VA B6D2F2 Brain mRNA M430A (Mar04) MAS5" - ], - [ "32", "BRF2_M_0304_R", "OHSU/VA B6D2F2 Brain mRNA M430A (Mar04) RMA" + ], + [ + "31", + "BRF2_M_0304_M", + "OHSU/VA B6D2F2 Brain mRNA M430A (Mar04) MAS5" ] ], "Genotypes": [ @@ -1783,16 +1819,16 @@ ], "Striatum mRNA": [ [ - "83", - "SA_M2_0905_M", - "OHSU/VA B6D2F2 Striatum M430v2 (Sep05) MAS5" - ], - [ "84", "SA_M2_0905_R", "OHSU/VA B6D2F2 Striatum M430v2 (Sep05) RMA" ], [ + "83", + "SA_M2_0905_M", + "OHSU/VA B6D2F2 Striatum M430v2 (Sep05) MAS5" + ], + [ "85", "SA_M2_0905_P", "OHSU/VA B6D2F2 Striatum M430v2 (Sep05) PDNN" @@ -1980,7 +2016,7 @@ [ "779", "EL_BXDCDScWAT_0216", - "EPFL/LISP BXD CD Subcutaneous WAT Affy MTA 1.0 Gene Level (Feb16) RMA **" + "EPFL/LISP BXD CD Subcutaneous WAT Affy MTA 1.0 Gene Level (Feb16) RMA" ] ], "Adrenal Gland mRNA": [ @@ -2071,16 +2107,16 @@ "INIA Brain mRNA M430 (Jun06) RMA" ], [ - "101", - "IBR_M_0106_P", - "INIA Brain mRNA M430 (Jan06) PDNN" - ], - [ "102", "IBR_M_0106_R", "INIA Brain mRNA M430 (Jan06) RMA" ], [ + "101", + "IBR_M_0106_P", + "INIA Brain mRNA M430 (Jan06) PDNN" + ], + [ "95", "BR_U_1105_P", "UTHSC Brain mRNA U74Av2 (Nov05) PDNN" @@ -2091,16 +2127,16 @@ "UTHSC Brain mRNA U74Av2 (Aug05) MAS5" ], [ - "81", - "BR_U_0805_P", - "UTHSC Brain mRNA U74Av2 (Aug05) PDNN" - ], - [ "82", "BR_U_0805_R", "UTHSC Brain mRNA U74Av2 (Aug05) RMA" ], [ + "81", + "BR_U_0805_P", + "UTHSC Brain mRNA U74Av2 (Aug05) PDNN" + ], + [ "42", "CB_M_0204_P", "INIA Brain mRNA M430 (Feb04) PDNN" @@ -2197,16 +2233,16 @@ "Eye M430v2 WT Gpnmb (Sep08) RMA" ], [ - "278", - "Eye_M2_0908_R_MT", - "Eye M430v2 Mutant Tyrp1 (Sep08) RMA" - ], - [ "279", "Eye_M2_0908_R_WT", "Eye M430v2 WT Tyrp1 (Sep08) RMA" ], [ + "278", + "Eye_M2_0908_R_MT", + "Eye M430v2 Mutant Tyrp1 (Sep08) RMA" + ], + [ "382", "Eye_M2_0908_WTWT", "Eye M430v2 WT WT (Sep08) RMA" @@ -2515,18 +2551,38 @@ "Mouse Kidney M430v2 Sex Balanced (Aug06) PDNN" ], [ - "115", - "MA_M2_0706_R", - "Mouse Kidney M430v2 (Jul06) RMA" - ], - [ "116", "MA_M2_0706_P", "Mouse Kidney M430v2 (Jul06) PDNN" + ], + [ + "115", + "MA_M2_0706_R", + "Mouse Kidney M430v2 (Jul06) RMA" ] ], "Liver Metabolome": [ [ + "836", + "UTHSC-ETHZ-EPFL_LivPMetExtAHFD0817", + "UTHSC/ETHZ/EPFL BXD Liver Polar Metabolites Extraction A, HFD Cohorts (Mar 2017) log2" + ], + [ + "838", + "UTHSC-ETHZ-EPFL_LivPMetExtBHFD0817", + "UTHSC/ETHZ/EPFL BXD Liver Polar Metabolites Extraction B, HFD Cohorts (Mar 2017) log2" + ], + [ + "835", + "UTHSC-ETHZ-EPFL_LivPMetExtACD0817", + "UTHSC/ETHZ/EPFL BXD Liver Polar Metabolites Extraction A, Chow Diet Cohorts (Mar 2017) log2" + ], + [ + "837", + "UTHSC-ETHZ-EPFL_LivPMetExtBCD0817", + "UTHSC/ETHZ/EPFL BXD Liver Polar Metabolites Extraction B, Chow Diet Cohorts (Mar 2017) log2" + ], + [ "473", "EPFL-LISP_LivPMetCDHFD1213", "EPFL/LISP BXD Liver Polar Metabolites CD+HFD (Jun14)" @@ -2591,34 +2647,34 @@ ], "Liver mRNA": [ [ - "858", - "EPFLMouseLiverHFDRMA0818", - "EPFL/LISP BXD HFD Liver Affy Mouse Gene 1.0 ST (Aug18) RMA" - ], - [ - "852", - "NIA-AgBXD-Liv_HFD-0818", - "NIA Aging BXD HFD Liver Affy Clariom S Gene Level (Aug18) RMA **" - ], - [ "857", "EPFLMouseLiverCDHFDRMA0818", "EPFL/LISP BXD CD+HFD Liver Affy Mouse Gene 1.0 ST (Aug18) RMA" ], [ + "858", + "EPFLMouseLiverHFDRMA0818", + "EPFL/LISP BXD HFD Liver Affy Mouse Gene 1.0 ST (Aug18) RMA" + ], + [ "859", "EPFLMouseLiverCDRMA0818", "EPFL/LISP BXD CD Liver Affy Mouse Gene 1.0 ST (Aug18) RMA" ], [ - "851", - "NIA-AgBXD-Liv_CDHFD-0818", - "NIA Aging BXD CD+HFD Liver Affy Clariom S Gene Level (Aug18) RMA **" + "854", + "NIA-AgBXD-Liv_CDHFD-rna-seq-0818", + "NIA Aging BXD CD+HFD Liver RNA-Seq (Aug18) Log2" ], [ - "853", - "NIA-AgBXD-Liv_CD-0818", - "NIA Aging BXD CD Liver Affy Clariom S Gene Level (Aug18) RMA **" + "855", + "NIA-AgBXD-Liv_HFD-rna-seq-0818", + "NIA Aging BXD HFD Liver RNA-Seq (Aug18) Log2" + ], + [ + "856", + "NIA-AgBXD-Liv_CD-rna-seq-0818", + "NIA Aging BXD CD Liver RNA-Seq (Aug18) Log2" ], [ "818", @@ -2636,6 +2692,11 @@ "EPFL/LISP BXD HFD Liver Affy Mouse Gene 1.0 ST (Apr13) RMA" ], [ + "848", + "EPFLMouseLiverHFCEx0413", + "EPFL/LISP BXD HFC Liver Affy Mouse Gene 1.0 ST (Apr13) RMA Exon Level" + ], + [ "432", "EPFLMouseLiverCDRMA0413", "EPFL/LISP BXD CD Liver Affy Mouse Gene 1.0 ST (Apr13) RMA" @@ -2646,11 +2707,6 @@ "EPFL/LISP BXD CD Liver Affy Mouse Gene 1.0 ST (Apr13) RMA Exon Level" ], [ - "848", - "EPFLMouseLiverHFCEx0413", - "EPFL/LISP BXD HFC Liver Affy Mouse Gene 1.0 ST (Apr13) RMA Exon Level" - ], - [ "433", "EPFLMouseLiverBothExRMA0413", "EPFL/LISP BXD CD+HFD Liver Affy Mouse Gene 1.0 ST (Apr13) RMA Exon Level" @@ -2779,16 +2835,16 @@ ], "Neocortex mRNA": [ [ - "374", - "DevNeocortex_ILM6.2P3RInv_1111", - "BIDMC/UTHSC Dev Neocortex P3 ILMv6.2 (Nov11) RankInv" - ], - [ "375", "DevNeocortex_ILM6.2P14RInv_1111", "BIDMC/UTHSC Dev Neocortex P14 ILMv6.2 (Nov11) RankInv" ], [ + "374", + "DevNeocortex_ILM6.2P3RInv_1111", + "BIDMC/UTHSC Dev Neocortex P3 ILMv6.2 (Nov11) RankInv" + ], + [ "284", "HQFNeoc_1210v2_RankInv", "HQF BXD Neocortex ILM6v1.1 (Dec10v2) RankInv" @@ -3039,16 +3095,16 @@ ], "Ventral Tegmental Area mRNA": [ [ - "228", - "VCUSal_0609_R", - "VCU BXD VTA Sal M430 2.0 (Jun09) RMA" - ], - [ "229", "VCUEtOH_0609_R", "VCU BXD VTA EtOH M430 2.0 (Jun09) RMA" ], [ + "228", + "VCUSal_0609_R", + "VCU BXD VTA Sal M430 2.0 (Jun09) RMA" + ], + [ "230", "VCUEtvsSal_0609_R", "VCU BXD VTA Et vs Sal M430 2.0 (Jun09) RMA" @@ -3069,17 +3125,7 @@ [ "843", "UTHSC-BXD-Harv_Liv-0118", - "UTHSC BXD Harvested Liver RNA-Seq (Aug18) Log2 **" - ], - [ - "842", - "UTHSC-BXD-Liv-0917", - "UTHSC BXD Liver Affy Clariom S GeneLevel Main (Sep17) RMA **" - ], - [ - "850", - "UTHSC-BXD-Liv-0818", - "UTHSC BXD Liver Affy Clariom S GeneLevel Main (Aug18) RMA **" + "UTHSC BXD Harvested Liver RNA-Seq (Aug18) Log2" ] ], "Phenotypes": [ @@ -3395,14 +3441,14 @@ ], "Hippocampus mRNA": [ [ - "99", - "HC_M2CB_1205_P", - "Hippocampus Consortium M430v2 CXB (Dec05) PDNN" - ], - [ "100", "HC_M2CB_1205_R", "Hippocampus Consortium M430v2 CXB (Dec05) RMA" + ], + [ + "99", + "HC_M2CB_1205_P", + "Hippocampus Consortium M430v2 CXB (Dec05) PDNN" ] ], "Liver mRNA": [ @@ -3428,6 +3474,13 @@ ] }, "D2GM": { + "Phenotypes": [ + [ + "None", + "D2GMPublish", + "D2GM Phenotypes" + ] + ], "Retina mRNA": [ [ "847", @@ -3486,9 +3539,14 @@ ], "Hippocampus mRNA": [ [ - "211", - "Illum_LXS_Hipp_RSS_1008", - "Hippocampus Illumina RSS (Oct08) RankInv beta" + "213", + "Illum_LXS_Hipp_NOS_1008", + "Hippocampus Illumina NOS (Oct08) RankInv beta" + ], + [ + "219", + "Illum_LXS_Hipp_NON_1008", + "Hippocampus Illumina NON (Oct08) RankInv beta" ], [ "212", @@ -3496,19 +3554,14 @@ "Hippocampus Illumina RSE (Oct08) RankInv beta" ], [ - "213", - "Illum_LXS_Hipp_NOS_1008", - "Hippocampus Illumina NOS (Oct08) RankInv beta" - ], - [ "214", "Illum_LXS_Hipp_NOE_1008", "Hippocampus Illumina NOE (Oct08) RankInv beta" ], [ - "219", - "Illum_LXS_Hipp_NON_1008", - "Hippocampus Illumina NON (Oct08) RankInv beta" + "211", + "Illum_LXS_Hipp_RSS_1008", + "Hippocampus Illumina RSS (Oct08) RankInv beta" ], [ "143", @@ -3601,14 +3654,14 @@ ], "Hippocampus mRNA": [ [ - "272", - "HC_M2_0606_MDP", - "Hippocampus Consortium M430v2 (Jun06) RMA MDP" - ], - [ "273", "UMUTAffyExon_0209_RMA_MDP", "UMUTAffy Hippocampus Exon (Feb09) RMA MDP" + ], + [ + "272", + "HC_M2_0606_MDP", + "Hippocampus Consortium M430v2 (Jun06) RMA MDP" ] ], "Liver mRNA": [ @@ -3670,6 +3723,13 @@ ] }, "Retina-RGC-Rheaume": { + "Phenotypes": [ + [ + "None", + "Retina-RGC-RheaumePublish", + "Retina-RGC-Rheaume Phenotypes" + ] + ], "Retina Single-cell RNA-Seq": [ [ "865", @@ -3677,14 +3737,14 @@ "UConn-Rheaume Retina RGC (Sep18) scRNA-Seq Raw" ], [ - "867", - "UConn-RGC-RSeq_s-0918", - "UConn-Rheaume Retina RGC (Sep18) scRNA-Seq Siamak" - ], - [ "866", "UConn-RGC-RSeq_log2-0918", "UConn-Rheaume Retina RGC (Sep18) scRNA-Seq Log2" + ], + [ + "867", + "UConn-RGC-RSeq_s-0918", + "UConn-Rheaume Retina RGC (Sep18) scRNA-Seq Siamak" ] ] }, @@ -3712,16 +3772,18 @@ }, "rat": { "HSNIH-Palmer": { + "Infralimbic Cortex mRNA": [ + [ + "861", + "HSNIH-Rat-IL-RSeq-0818", + "HSNIH-Palmer Infralimbic Cortex RNA-Seq (Aug18) rlog" + ] + ], "Lateral Habenula mRNA": [ [ "862", "HSNIH-Rat-LHB-RSeq-0818", "HSNIH-Palmer Lateral Habenula RNA-Seq (Aug18) rlog" - ], - [ - "870", - "HSNIH-Rat-LHB-RSeqlog2-0818", - "HSNIH-Palmer Lateral Habenula RNA-Seq (Aug18) log2" ] ], "Nucleus Accumbens mRNA": [ @@ -3729,11 +3791,13 @@ "860", "HSNIH-Rat-Acbc-RSeq-0818", "HSNIH-Palmer Nucleus Accumbens Core RNA-Seq (Aug18) rlog" - ], + ] + ], + "Orbitofrontal Cortex mRNA": [ [ - "868", - "HSNIH-Rat-Acbc-RSeqlog2-0818", - "HSNIH-Palmer Nucleus Accumbens Core RNA-Seq (Aug18) log2" + "864", + "HSNIH-Rat-VoLo-RSeq-0818", + "HSNIH-Palmer Orbitofrontal Cortex RNA-Seq (Aug18) rlog" ] ], "Phenotypes": [ @@ -3743,32 +3807,7 @@ "HSNIH-Palmer Phenotypes" ] ], - "Prefrontal Cortex mRNA": [ - [ - "869", - "HSNIH-Rat-IL-RSeqlog2-0818", - "HSNIH-Palmer Infralimbic Cortex RNA-Seq (Aug18) log2" - ], - [ - "872", - "HSNIH-Rat-VoLo-RSeqlog2-0818", - "HSNIH-Palmer Orbitofrontal Cortex RNA-Seq (Aug18) log2" - ], - [ - "861", - "HSNIH-Rat-IL-RSeq-0818", - "HSNIH-Palmer Infralimbic Cortex RNA-Seq (Aug18) rlog" - ], - [ - "864", - "HSNIH-Rat-VoLo-RSeq-0818", - "HSNIH-Palmer Orbitofrontal Cortex RNA-Seq (Aug18) rlog" - ], - [ - "871", - "HSNIH-Rat-PL-RSeqlog2-0818", - "HSNIH-Palmer Prelimbic Cortex RNA-Seq (Aug18) log2" - ], + "Prelimbic Cortex mRNA": [ [ "863", "HSNIH-Rat-PL-RSeq-0818", @@ -4023,6 +4062,22 @@ "AIL Advanced Intercross Line" ], [ + "AIL-LGSM-F34-A", + "AIL LGSM F34 (Array)" + ], + [ + "AIL-LGSM-F34-GBS", + "AIL LGSM F34 (GBS)" + ], + [ + "AIL-LGSM-F34-F39-43-GBS", + "AIL LGSM F34 and F39-43 (GBS)" + ], + [ + "AIL-LGSM-F39-43-GBS", + "AIL LGSM F39-43 (GBS)" + ], + [ "AKXD", "AKXD RI Family" ], @@ -4950,6 +5005,30 @@ "Striatum mRNA" ] ], + "AIL-LGSM-F34-A": [ + [ + "Phenotypes", + "Phenotypes" + ] + ], + "AIL-LGSM-F34-F39-43-GBS": [ + [ + "Phenotypes", + "Phenotypes" + ] + ], + "AIL-LGSM-F34-GBS": [ + [ + "Phenotypes", + "Phenotypes" + ] + ], + "AIL-LGSM-F39-43-GBS": [ + [ + "Phenotypes", + "Phenotypes" + ] + ], "AKXD": [ [ "Genotypes", @@ -5406,6 +5485,10 @@ ], "D2GM": [ [ + "Phenotypes", + "Phenotypes" + ], + [ "Retina mRNA", "Retina mRNA" ] @@ -5505,6 +5588,10 @@ ], "Retina-RGC-Rheaume": [ [ + "Phenotypes", + "Phenotypes" + ], + [ "Retina Single-cell RNA-Seq", "Retina Single-cell RNA-Seq" ] @@ -5532,6 +5619,10 @@ "Phenotypes" ], [ + "Infralimbic Cortex mRNA", + "Infralimbic Cortex mRNA" + ], + [ "Lateral Habenula mRNA", "Lateral Habenula mRNA" ], @@ -5540,8 +5631,12 @@ "Nucleus Accumbens mRNA" ], [ - "Prefrontal Cortex mRNA", - "Prefrontal Cortex mRNA" + "Orbitofrontal Cortex mRNA", + "Orbitofrontal Cortex mRNA" + ], + [ + "Prelimbic Cortex mRNA", + "Prelimbic Cortex mRNA" ] ], "HSNIH-RGSMC": [ diff --git a/wqflask/wqflask/static/new/javascript/dataset_select_menu_orig.js b/wqflask/wqflask/static/new/javascript/dataset_select_menu_orig.js index d5ce6f84..fc1f1beb 100644 --- a/wqflask/wqflask/static/new/javascript/dataset_select_menu_orig.js +++ b/wqflask/wqflask/static/new/javascript/dataset_select_menu_orig.js @@ -94,7 +94,7 @@ $(function() { })(this)); open_window = function(url, name) { var options; - options = "menubar=1,toolbar=1,location=1,resizable=1,status=1,scrollbars=1,directories=1,width=900"; + options = "menubar=yes,toolbar=yes,titlebar=yes,location=yes,resizable=yes,status=yes,scrollbars=yes,directories=yes,width=900"; return open(url, name, options).focus(); }; group_info = function() { @@ -108,7 +108,12 @@ $(function() { dataset_info = function() { var dataset, url; accession_id = $('#dataset option:selected').data("id"); - url = "http://genenetwork.org/webqtl/main.py?FormID=sharinginfo&GN_AccessionId=" + accession_id; + if (accession_id != "None") { + url = "http://genenetwork.org/webqtl/main.py?FormID=sharinginfo&GN_AccessionId=" + accession_id; + } else { + name = $('#dataset option:selected').val(); + url = "http://genenetwork.org/webqtl/main.py?FormID=sharinginfo&InfoPageName=" + name; + } return open_window(url, "Dataset Info"); }; $('#dataset_info').click(dataset_info); diff --git a/wqflask/wqflask/static/new/javascript/draw_corr_scatterplot.js b/wqflask/wqflask/static/new/javascript/draw_corr_scatterplot.js index be0b96a1..a74c99d3 100644 --- a/wqflask/wqflask/static/new/javascript/draw_corr_scatterplot.js +++ b/wqflask/wqflask/static/new/javascript/draw_corr_scatterplot.js @@ -23,7 +23,8 @@ var layout = { visible: true, linecolor: 'black', linewidth: 1, - } + }, + hovermode: "closest" } cofactor1_dict = {} diff --git a/wqflask/wqflask/static/new/javascript/network_graph.js b/wqflask/wqflask/static/new/javascript/network_graph.js index 0ecf4743..bc02181f 100644 --- a/wqflask/wqflask/static/new/javascript/network_graph.js +++ b/wqflask/wqflask/static/new/javascript/network_graph.js @@ -1,18 +1,9 @@ -window.onload=function() { - // id of Cytoscape Web container div - //var div_id = "cytoscapeweb"; - - var cy = cytoscape({ - container: $('#cytoscapeweb'), // container to render in - - elements: elements_list, - - style: [ // the stylesheet for the graph +var default_style = [ // the stylesheet for the graph { selector: 'node', style: { 'background-color': '#666', - 'label': 'data(label )', + 'label': 'data(label)', 'font-size': 10 } }, @@ -27,16 +18,28 @@ window.onload=function() { 'font-size': 8 } } - ], - - zoom: 12, - layout: { name: 'circle', + ] + +var default_layout = { name: 'circle', fit: true, // whether to fit the viewport to the graph padding: 30 // the padding on fit //idealEdgeLength: function( edge ){ return edge.data['correlation']*10; }, - }, + } + +window.onload=function() { + // id of Cytoscape Web container div + //var div_id = "cytoscapeweb"; + var cy = cytoscape({ + container: $('#cytoscapeweb'), // container to render in + + elements: elements_list, + style: default_style, + + zoom: 12, + layout: default_layout, + zoomingEnabled: true, userZoomingEnabled: true, panningEnabled: true, @@ -131,22 +134,25 @@ window.onload=function() { create_qtips(cy) - $('#slide').change(function() { + $('#neg_slide').change(function() { eles.restore() + + pos_slide_val = $('#pos_slide').val(); + cy.$("node[max_corr > " + $(this).val() + "][max_corr < " + pos_slide_val + "]").remove(); + cy.$("edge[correlation > " + $(this).val() + "][correlation < " + pos_slide_val + "]").remove(); + + cy.layout({ name: $('select[name=layout_select]').val(), + fit: true, // whether to fit the viewport to the graph + padding: 25 // the padding on fit + }); - console.log(eles) - - // nodes_to_restore = eles.filter("node[max_corr >= " + $(this).val() + "], edge[correlation >= " + $(this).val() + "][correlation <= -" + $(this).val() + "]") - // nodes_to_restore.restore() - - // edges_to_restore = eles.filter("edge[correlation >= " + $(this).val() + "][correlation <= -" + $(this).val() + "]") - // edges_to_restore.restore() - - //cy.$("node[max_corr >= " + $(this).val() + "]").restore(); - //cy.$("edge[correlation >= " + $(this).val() + "][correlation <= -" + $(this).val() + "]").restore(); - - cy.$("node[max_corr < " + $(this).val() + "]").remove(); - cy.$("edge[correlation < " + $(this).val() + "][correlation > -" + $(this).val() + "]").remove(); + }); + $('#pos_slide').change(function() { + eles.restore() + + neg_slide_val = $('#neg_slide').val(); + cy.$("node[max_corr > " + neg_slide_val +"][max_corr < " + $(this).val() + "]").remove(); + cy.$("edge[correlation > " + neg_slide_val +"][correlation < " + $(this).val() + "]").remove(); cy.layout({ name: $('select[name=layout_select]').val(), fit: true, // whether to fit the viewport to the graph @@ -157,7 +163,8 @@ window.onload=function() { $('#reset_graph').click(function() { eles.restore() - $('#slide').val(0) + $('#pos_slide').val(0) + $('#neg_slide').val(0) cy.layout({ name: $('select[name=layout_select]').val(), fit: true, // whether to fit the viewport to the graph padding: 25 // the padding on fit @@ -178,13 +185,67 @@ window.onload=function() { $('select[name=layout_select]').change(function() { layout_type = $(this).val() - console.log("LAYOUT:", layout_type) cy.layout({ name: layout_type, fit: true, // whether to fit the viewport to the graph padding: 25 // the padding on fit }); }); + $('select[name=font_size]').change(function() { + font_size = $(this).val() + + new_style = default_style + new_style[0]['style']['font-size'] = parseInt(font_size) + cy.style().fromJson(new_style).update() + }); + $('select[name=edge_width]').change(function() { + //eles.restore() + + //ZS: This is needed, or else it alters the original object + orig_elements = JSON.parse(JSON.stringify(elements_list)); + + width_multiplier = $(this).val() + updated_elements = [] + for (i=0; i < orig_elements.length; i++){ + this_element = orig_elements[i] + if ('source' in this_element['data']) { + orig_width = this_element['data']['width'] + this_element['data']['width'] = orig_width * width_multiplier + } + updated_elements.push(this_element) + } + cy.remove(eles) + cy.add(updated_elements) + cy.layout({ name: $('select[name=layout_select]').val(), + fit: true, // whether to fit the viewport to the graph + padding: 25 // the padding on fit + }); + }); + + $('select[name=edge_width]').change(function() { + //eles.restore() + + //ZS: This is needed, or else it alters the original object + orig_elements = JSON.parse(JSON.stringify(elements_list)); + + width_multiplier = $(this).val() + updated_elements = [] + for (i=0; i < orig_elements.length; i++){ + this_element = orig_elements[i] + if ('source' in this_element['data']) { + orig_width = this_element['data']['width'] + this_element['data']['width'] = orig_width * width_multiplier + } + updated_elements.push(this_element) + } + cy.remove(eles) + cy.add(updated_elements) + cy.layout({ name: $('select[name=layout_select]').val(), + fit: true, // whether to fit the viewport to the graph + padding: 25 // the padding on fit + }); + }); + $("a#image_link").click(function(e) { var pngData = cy.png(); diff --git a/wqflask/wqflask/static/new/javascript/plotly_probability_plot.js b/wqflask/wqflask/static/new/javascript/plotly_probability_plot.js index ad06ff6a..1585b0ad 100644 --- a/wqflask/wqflask/static/new/javascript/plotly_probability_plot.js +++ b/wqflask/wqflask/static/new/javascript/plotly_probability_plot.js @@ -183,7 +183,8 @@ visible: true, linecolor: 'black', linewidth: 1, - } + }, + hovermode: "closest" } var primary_trace = { diff --git a/wqflask/wqflask/static/new/javascript/search_results.js b/wqflask/wqflask/static/new/javascript/search_results.js index 2b878087..ebb1651d 100644 --- a/wqflask/wqflask/static/new/javascript/search_results.js +++ b/wqflask/wqflask/static/new/javascript/search_results.js @@ -93,12 +93,24 @@ $(function() { traits = $("#trait_table input:checked").map(function() { return $(this).val(); }).get(); - console.log("checked length is:", traits.length); - console.log("checked is:", traits); + + var traits_hash = md5(traits.toString()); + + $.ajax({ + type: "POST", + url: "/collections/store_trait_list", + data: { + hash: traits_hash, + traits: traits.toString() + } + }); + return $.colorbox({ - href: "/collections/add?traits=" + traits + href: "/collections/add?hash=" + traits_hash }); + }; + removed_traits = function() { console.log('in removed_traits with checked_traits:', checked_traits); return checked_traits.closest("tr").fadeOut(); @@ -211,6 +223,65 @@ $(function() { $('#export_form').submit(); }; + $("#corr_matrix").on("click", function() { + traits = $("#trait_table input:checked").map(function() { + return $(this).val(); + }).get(); + $("#trait_list").val(traits) + url = $(this).data("url") + return submit_special(url) + }); + $("#network_graph").on("click", function() { + traits = $("#trait_table input:checked").map(function() { + return $(this).val(); + }).get(); + $("#trait_list").val(traits) + url = $(this).data("url") + return submit_special(url) + }); + $("#wgcna_setup").on("click", function() { + traits = $("#trait_table input:checked").map(function() { + return $(this).val(); + }).get(); + $("#trait_list").val(traits) + url = $(this).data("url") + return submit_special(url) + }); + $("#ctl_setup").on("click", function() { + traits = $("#trait_table input:checked").map(function() { + return $(this).val(); + }).get(); + $("#trait_list").val(traits) + url = $(this).data("url") + return submit_special(url) + }); + $("#heatmap").on("click", function() { + traits = $("#trait_table input:checked").map(function() { + return $(this).val(); + }).get(); + $("#trait_list").val(traits) + url = $(this).data("url") + return submit_special(url) + }); + $("#comp_bar_chart").on("click", function() { + traits = $("#trait_table input:checked").map(function() { + return $(this).val(); + }).get(); + $("#trait_list").val(traits) + url = $(this).data("url") + return submit_special(url) + }); + + $("#send_to_webgestalt, #send_to_bnw, #send_to_geneweaver").on("click", function() { + traits = $("#trait_table input:checked").map(function() { + return $(this).val(); + }).get(); + $("#trait_list").val(traits) + url = $(this).data("url") + return submit_special(url) + }); + + $("#select_all").click(select_all); $("#deselect_all").click(deselect_all); $("#invert").click(invert); diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js index a0a98437..2f846642 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.js +++ b/wqflask/wqflask/static/new/javascript/show_trait.js @@ -342,7 +342,7 @@ if (!__hasProp.call(_ref1, key)) continue; value = _ref1[key]; the_id = process_id(key, row.vn); - row_line += "<td id=\"" + the_id + "\" align=\"right\">foo</td>"; + row_line += "<td id=\"" + the_id + "\" align=\"right\">N/A</td>"; } row_line += "</tr>"; the_rows += row_line; @@ -417,16 +417,27 @@ } console.log("towards end:", sample_sets); update_stat_values(sample_sets); - console.log("redrawing histogram"); - redraw_histogram(); - console.log("redrawing bar chart"); - redraw_bar_chart(); - console.log("redrawing box plot"); - redraw_box_plot(); - console.log("redrawing violin plot"); - redraw_violin_plot(); - console.log("redrawing probability plot"); - return redraw_prob_plot(); + + if ($('#histogram').hasClass('js-plotly-plot')){ + console.log("redrawing histogram"); + redraw_histogram(); + } + if ($('#bar_chart').hasClass('js-plotly-plot')){ + console.log("redrawing bar chart"); + redraw_bar_chart(); + } + if ($('#box_plot').hasClass('js-plotly-plot')){ + console.log("redrawing box plot"); + redraw_box_plot(); + } + if ($('#violin_plot').hasClass('js-plotly-plot')){ + console.log("redrawing violin plot"); + redraw_violin_plot(); + } + if ($('#prob_plot_div').hasClass('js-plotly-plot')){ + console.log("redrawing probability plot"); + return redraw_prob_plot(); + } }; show_hide_outliers = function() { var label; @@ -608,7 +619,7 @@ }; sqrt_normalize_data = function() { - return $('.trait_value_input').each((function(_this) { + return $('.edit_sample_value').each((function(_this) { return function(_index, element) { current_value = parseFloat($(element).data("value")) + 1; if(isNaN(current_value)) { @@ -622,7 +633,7 @@ }; qnorm_data = function() { - return $('.trait_value_input').each((function(_this) { + return $('.edit_sample_value').each((function(_this) { return function(_index, element) { current_value = parseFloat($(element).data("value")) + 1; if(isNaN(current_value)) { @@ -776,6 +787,12 @@ sample_group_list = [js_data.sample_group_types['samples_primary']] } + // Define Plotly Options (for the options bar at the top of each figure) + + root.modebar_options = { + modeBarButtonsToRemove:['hoverClosest', 'hoverCompare', 'hoverClosestCartesian', 'hoverCompareCartesian', 'lasso2d', 'toggleSpikelines'] + } + // Bar Chart root.errors_exist = get_sample_errors(sample_lists[0])[1] @@ -822,12 +839,20 @@ range_bottom = 0 } } - if (get_sample_vals(sample_lists[0]).length < 256) { + + root.chart_range = [range_bottom, range_top] + + total_sample_count = 0 + for (i = 0, i < sample_lists.length; i++;) { + total_sample_count += get_sample_vals(sample_lists[i]).length + } + + if (js_data.num_values < 256) { bar_chart_width = 25 * get_sample_vals(sample_lists[0]).length var layout = { yaxis: { - range: [range_bottom, range_top], + range: root.chart_range, }, width: bar_chart_width, height: 600, @@ -839,7 +864,13 @@ } }; root.bar_layout = layout - Plotly.newPlot('bar_chart', root.bar_data, root.bar_layout) + $('.bar_chart_tab').click(function() { + if ($('#bar_chart').hasClass('js-plotly-plot')){ + redraw_bar_chart(); + } else { + Plotly.newPlot('bar_chart', root.bar_data, root.bar_layout, root.modebar_options) + } + }); } if (full_sample_lists.length > 1) { @@ -943,18 +974,25 @@ ] } - obj = { + box_obj = { data: box_data, layout: root.box_layout } - Plotly.newPlot('box_plot', obj); + + $('.box_plot_tab').click(function() { + if ($('#box_plot').hasClass('js-plotly-plot')){ + redraw_box_plot(); + } else { + Plotly.newPlot('box_plot', box_obj, root.modebar_options); + } + }); // Violin Plot if (full_sample_lists.length > 1) { root.violin_layout = { title: "Violin Plot", - xaxis: { + yaxis: { range: [range_bottom, range_top], zeroline: false }, @@ -963,12 +1001,12 @@ margin: { l: 50, r: 30, - t: 30, + t: 80, b: 80 } }; var trace1 = { - x: get_sample_vals(full_sample_lists[2]), + y: get_sample_vals(full_sample_lists[2]), type: 'violin', points: 'none', box: { @@ -981,10 +1019,10 @@ visible: true }, name: sample_group_list[2], - y0: sample_group_list[2] + x0: sample_group_list[2] } var trace2 = { - x: get_sample_vals(full_sample_lists[1]), + y: get_sample_vals(full_sample_lists[1]), type: 'violin', points: 'none', box: { @@ -997,10 +1035,10 @@ visible: true }, name: sample_group_list[1], - y0: sample_group_list[1] + x0: sample_group_list[1] } var trace3 = { - x: get_sample_vals(full_sample_lists[0]), + y: get_sample_vals(full_sample_lists[0]), type: 'violin', points: 'none', box: { @@ -1013,13 +1051,13 @@ visible: true }, name: sample_group_list[0], - y0: sample_group_list[0] + x0: sample_group_list[0] } violin_data = [trace1, trace2, trace3] } else { root.violin_layout = { title: "Violin Plot", - xaxis: { + yaxis: { range: [range_bottom, range_top], zeroline: false }, @@ -1028,13 +1066,13 @@ margin: { l: 50, r: 30, - t: 30, + t: 80, b: 80 } }; violin_data = [ { - x: get_sample_vals(full_sample_lists[0]), + y: get_sample_vals(full_sample_lists[0]), type: 'violin', points: 'none', box: { @@ -1047,17 +1085,23 @@ visible: true }, name: sample_group_list[0], - y0: sample_group_list[0] + x0: sample_group_list[0] } ] } - obj = { + violin_obj = { data: violin_data, layout: root.violin_layout } - Plotly.plot('violin_plot', obj) + $('.violin_plot_tab').click(function() { + if ($('#violin_plot').hasClass('js-plotly-plot')){ + redraw_violin_plot(); + } else { + Plotly.plot('violin_plot', violin_obj, root.modebar_options); + } + }); // Histogram var hist_trace = { @@ -1077,9 +1121,16 @@ b: 60 } }; - Plotly.newPlot('histogram', data, layout) - update_histogram_width() + $('.histogram_tab').click(function() { + if ($('#histogram').hasClass('js-plotly-plot')){ + redraw_histogram(); + update_histogram_width(); + } else { + Plotly.newPlot('histogram', data, layout, root.modebar_options) + update_histogram_width() + } + }); $('.histogram_samples_group').val(root.stats_group); $('.histogram_samples_group').change(function() { @@ -1105,13 +1156,26 @@ root.prob_plot_group = 'samples_primary'; $('.prob_plot_samples_group').val(root.prob_plot_group); + $('.prob_plot_tab').click(function() { + return redraw_prob_plot(); + }); $('.prob_plot_samples_group').change(function() { root.prob_plot_group = $(this).val(); return redraw_prob_plot(); }); - make_table(); - edit_data_change(); + function isEmpty( el ){ + return !$.trim(el.html()) + } + + $('.stats_panel').click(function() { + if (isEmpty($('#stats_table'))){ + make_table(); + edit_data_change(); + } else { + edit_data_change(); + } + }); $('#edit_sample_lists').change(edit_data_change); $('.edit_sample_value').change(edit_data_change); $('#block_by_index').click(edit_data_change); diff --git a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js index daa5b3f2..4e82fff2 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js +++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js @@ -154,36 +154,12 @@ }; })(this)); - $("#pylmm_mapping_compute").on("mouseover", (function(_this) { - return function() { - if ($(".outlier").length && $(".outlier-alert").length < 1) { - return showalert(outlier_text, "alert-success outlier-alert"); - } - }; - })(this)); - - $("#pylmm_compute").on("click", (function(_this) { - return function() { - var form_data, url; - //$("#progress_bar_container").modal(); - url = "/loading"; - $('input[name=method]').val("pylmm"); - $('input[name=genofile]').val($('#genofile_pylmm').val()); - $('input[name=num_perm]').val($('input[name=num_perm_pylmm]').val()); - $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_pylmm]:checked').val()); - form_data = $('#trait_data_form').serialize(); - console.log("form_data is:", form_data); - return submit_special(url); - //return do_ajax_post(url, form_data); - }; - })(this)); - $("#rqtl_geno_compute").on("click", (function(_this) { return function() { var form_data, url; - //$("#progress_bar_container").modal(); url = "/loading"; $('input[name=method]').val("rqtl_geno"); + $('input[name=selected_chr]').val($('#chr_rqtl_geno').val()); $('input[name=genofile]').val($('#genofile_rqtl_geno').val()); $('input[name=num_perm]').val($('input[name=num_perm_rqtl_geno]').val()); $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_rqtl]:checked').val()); @@ -203,7 +179,6 @@ } else { return submit_special(url); - //return do_ajax_post(url, form_data); } }; })(this)); @@ -214,6 +189,7 @@ console.log("RUNNING GEMMA"); url = "/loading"; $('input[name=method]').val("gemma"); + $('input[name=selected_chr]').val($('#chr_gemma').val()); $('input[name=num_perm]').val(0); $('input[name=genofile]').val($('#genofile_gemma').val()); $('input[name=maf]').val($('input[name=maf_gemma]').val()); @@ -230,6 +206,7 @@ //$("#progress_bar_container").modal(); url = "/loading"; $('input[name=method]').val("reaper"); + $('input[name=selected_chr]').val($('#chr_reaper').val()); $('input[name=genofile]').val($('#genofile_reaper').val()); $('input[name=num_perm]').val($('input[name=num_perm_reaper]').val()); $('input[name=control_marker]').val($('input[name=control_reaper]').val()); diff --git a/wqflask/wqflask/static/new/javascript/stats.js b/wqflask/wqflask/static/new/javascript/stats.js index 4f99982e..356d1cb0 100644 --- a/wqflask/wqflask/static/new/javascript/stats.js +++ b/wqflask/wqflask/static/new/javascript/stats.js @@ -154,16 +154,4 @@ Stats = (function() { })(); -bxd_only = new Stats([3, 5, 7, 8]); - -console.log("[xred] bxd_only mean:", bxd_only.mean()); - -console.log("[xgreen] bxd_only median:", bxd_only.median()); - -console.log("[xpurple] bxd_only std_dev:", bxd_only.std_dev()); - -console.log("[xmagenta] bxd_only std_error:", bxd_only.std_error()); - -console.log("[xyellow] bxd_only min:", bxd_only.min()); - window.Stats = Stats; diff --git a/wqflask/wqflask/static/new/javascript/typeahead_rn6.json b/wqflask/wqflask/static/new/javascript/typeahead_rn6.json new file mode 100644 index 00000000..1889d8a2 --- /dev/null +++ b/wqflask/wqflask/static/new/javascript/typeahead_rn6.json @@ -0,0 +1 @@ +var rat_genes = ["A2ml1","A3galt2","A1cf","AA926063","A2m","A4gnt","A4galt","A1bg","Aadacl4","Aadac","Aacs","Aadat","Aaas","Aadacl2","Aadacl3","Aagab","Aak1","Aaed1","Aanat","Aamdc","Aard","Aasdh","Aar2","Aasdhppt","Aass","Aars","Aarsd1","Aars2","Abca1","Aatk","Abca14","Abca13","Abca15","Aatf","Aamp","Abca12","Abca16","Abca3","Abat","Abca17","Abca5","Abca8","Abca2","Abca9","Abca4","Abca8a","Abcb1a","Abcb11","Abcb10","Abca6","Abca7","Abcb1b","Abcb5","Abcb4","Abcb7","Abcb8","Abcb6","Abcc1","Abcb9","Abcc3","Abcc10","Abcc12","Abcc4","Abcc6","Abcc2","Abcc5","Abcd3","Abcd4","Abcc9","Abcd1","Abcf1","Abce1","Abcf3","Abcg2","Abcg1","Abcg3l1","Abcf2","Abcg4","Abcg5","Abcg3l3","Abcg3","Abcg3l4","Abcg3l2","Abcd2","Abhd11os","Abhd10","Abcg8","Abcc8","Abhd12","Abhd12b","Abhd1","Abhd13","Abhd14a","Abhd15","Abhd11","Abhd16b","Abhd17a","Abhd17b","Abhd16a","Abhd14b","Abhd2","Abhd3","Abhd4","Abhd17c","Abhd5","Abhd8","Abhd6","Abi2","Abi3","Abhd18","Ablim1","Abl2","Abl1","Abi1","Ablim3","Ablim2","Abo2","Abo3","Abra","Abr","Abi3bp","Abracl","Abraxas1","Abt1","Abtb1","Ac1576","Acaa1b","Abraxas2","Abo","Acacb","Abtb2","Acad11","Acad8","Acad9","Acaa2","Acadl","Acadm","Acadsb","Acads","Acadvl","Acaca","Acap1","Acap3","Acat1","Acat2","Acad10","Acaa1a","Acap2","Acat2l1","Acbd4","Acbd5","Acbd7","Acbd6","Accs","Acbd3","Acd","Acan","Acer1","Acer2","Accsl","Ace2","Ackr1","Ache","Ackr2","Ackr3","Acin1","Ackr4","Acnat1","Acmsd","Acly","Acnat2","Acer3","Ace3","Ace","Acot1","Aco1","Acot13","Aco2","Acot12","Acot4","Acot2","Acot6","Acot5","Acot11","Acot8","Acot9","Acod1","Acot3","Acox2","Acot7","Acox1","Acox3","Acp2","Acp1","Acp4","Acp6","Acp5","Acp7","Acrv1","Acrbp","Acsbg1","Acr","Acpp","Acsbg2","Acoxl","Acsf2","Acsf3","Acsl3","Acsl5","Acsl1","Acsl4","Acsl6","Acsm1","Acsm4","Acss1","Acsm2","Acp1-ps1","Acsm5","Acss2","Acsm3","Acss3","Actg1","Acta1","Actc1","Actg2","Actbl2","Actb","Acta2","Actl7a","Actl6a","Actl6b","Actl7b","Actl9","Actl9b","Actl11","Actn3","Actn2","Actl10","Actn1","Actr10","Actn4","Actr1a","Actr1b","Actr3b","Actr2","Actr5","Actr6","Actr3","Actr8","Actrt1","Actrt2","Actrt3","Acvr1b","Acvr1c","Acvr2a","Acvr2b","Acvrl1","Acy3","Acy1","Acyp1","Acyp2-ps1","Acyp2","Adal","Ada","Adad1","Adad2","Adam11","Adam10","Acvr1","Adam12","Adam18","Adam15","Adam19","Adam17","Adam1a","Adam20","Adam2","Adam25","Adam26a","Adam23","Adam24","Adam22","Adam32","Adam34l","Adam33","Adam34","Adam3a","Adam21","Adam4l1","Adam4","Adam6","Adam5","Adam28","Adam30","Adam7","Adamdec1","Adam9","Adam8","Adamts12","Adamts1","Adamts10","Adamts15","Adamts13","Adamts14","Adamts16","Adamts17","Adamts18","Adamts19","Adamts2","Adamts20","Adamts3","Adamts4","Adamts8","Adamts6","Adamts5","Adamts7","Adamts9","Adamtsl1","Adamtsl2","Adamtsl3","Adamtsl5","Adamtsl4","Adap2","Adap1","Adar","Adat1","Adarb2","Adat2","Adarb1","Adck1","Adck2","Adck5","Adcy1","Adcy2","Adcy10","Adcy3","Adcy4","Adcy5","Adcy6","Adcy7","Adcy9","Adcy8","Adat3","Adcyap1r1","Adcyap1","Add1","Add2","Adgra1","Adgb","Add3","Adgra2","Adgra3","Adgrb1","Adgrb2","Adgrd1","Adgrb3","Adgre4","Adgre1","Adgrf1","Adgre5","Adgrf2","Adgrf3","Adgrf4","Adgrg1","Adgrg3","Adgrf5","Adgrg2","Adgrg4","Adgrg7","Adgrg5","Adgrg6","Adgrl1","Adgrl4","Adgrl2","Adgrv1","Adgrl3","Adh4","Adh1","Adh6","Adh6a","Adh7","Adhfe1","Adi1","Adh5","Adipor1","Adipor2","Adm2","Adig","Adk","Adnp","Adm","Ado","Adipoq","Adnp2","Adora2b","Adora3","Adpgk","Adprh","Adprhl2","Adora1","Adprhl1","Adora2a","Adprm","Adra1b","Adra1d","Adra2a","Adra2c","Adra2b","Adra1a","Adrb1","Adrm1","Adtrp","Adsl","Adss","Adssl1","Adrb3","Adrb2","Aebp1","Aebp2","Aen","Afap1l1","Afap1","Afap1l2","Afdn","Aff1","Aff2","Afg1l","Aff3","Aff4","Afg3l1","Aff1-as1","Afg3l2","Afmid","Aftph","Afm","Afp","Aga","Agap1","Agap2","Agap3","Agbl1","Agbl3","Agbl2","Agbl4","Agbl5","Agfg1-ps1","Agfg1","Agfg2","Aggf1","Agk","Agl","Agmat","Aes","Agmo","Ago1","Ago3","Ago2","Ager","Ago4","Agpat2","Agpat1","Agpat3","Agpat4","Agpat5","Agr2","Agps","Agr3","Agrp","Agtpbp1","Agrn","Agtrap","Agtr1b","Agt","Agtr2","Agxt","Agxt2","Ahctf1","Ahcyl1","Ahcy","Ahdc1","Ahcyl2","Ahnak2","Ahnak","Agtr1a","Ahi1","Ahrr","Ahsa2","Ahsa1","Ahsp","Ahr","Aicda","Aif1l","Aida","Aifm2","Ahsg","Aifm1","Aifm3","Aig1","Aim2","Aimp1","Aipl1","Aip","Aimp2","Aire","Ajap1","Ajm1","Ajuba","Ak3","Ak1","Ak2","Aif1","Ak5","Ak4","Ak6","Ak9","Ak8","Ak7","Akap10","Akap1","Akap11","Akap14","Akap17a","Akap12","Akap13","Akap17b","Akap2","Akap3","Akain1","Akap4","Akap5","Akap7","Akap8","Akap6","Akap8l","Akirin1","Akip1","Akap9","Akirin2","Akna","Aknad1","Akr1a1","Akp3","Akr1b1-ps1","Akr1b1-ps2","Akr1b1-ps3","Akr1b7","Akr1b10","Akr1b1","Akr1b8","Akr1c1","Akr1c12","Akr1c12l1","Akr1c13","Akr1c19","Akr1c14","Akr1c2","Akr1cl","Akr1d1","Akr1c3","Akr1e2","Akr7a2","Akr7a3","Akt1s1","Aktip","Akt3","Akt2","Alas1","Alad","Alas2","Alcam","Aldh16a1","Aldh1a1","Aldh1a2","Aldh1a3","Akt1","Aldh1a7","Alb","Aldh1b1","Aldh1l1","Aldh1l2","Aldh18a1","Aldh3b2","Aldh3b1","Aldh3a1","Aldh5a1","Aldh8a1","Aldh7a1","Aldh6a1","Aldh3a2","Aldh9a1","Aldh2","Aldoart2","Alg1","Aldoc","Aldob","Aldoa","Alg10","Alg11","Alg12","Alg14","Alg2","Alg13","Alg3","Alg5","Alg8","Alg6","Alg9","Alk","Alkal1","Alkbh1","Alkbh2","Alkal2","Aldh4a1","Alkbh3","Alkbh4","Alkbh5","Alkbh6","Alkbh7","Alkbh8","Allc","Alms1","Alox12b","Alox12e","Alox12","Alox15b","Alox15","Aloxe3","Alox5ap","Alox5","Alpi","Alpk1","Alpk2","Alpk3","Alppl2","Alpp","Alpl","Als2","Als2cr12","Als2cl","Alx3","Alx4","Alyref","Amacr","Ambn","Ambp","Ambra1","Amd1-ps1","Amd1-ps2","Amd1","Amd1-ps3","Amdhd1","Amer1","Amdhd2","Amer2","Amer3","Amelx","Alx1","Amfr","Amh","Amhr2","Amigo3","Amigo1","Amigo2","Ammecr1","Ammecr1l","Amn1","Amotl1","Amot","Amotl2","Amn","Ampd1","Ampd3","Ampd2","Amtn","Amph","Amt","Amy2-ps1","Amy2-ps2","Amy1a","Amy2a3","Amz1","Amz2","Anapc10","Anapc11","Anapc13","Anapc1","Anapc15","Anapc2","Anapc16","Anapc4","Anapc7","Anapc5","Andpro","Ang2","Ang","Angel1","Angel2","Angpt4","Angptl1","Angptl2","Angptl3","Angptl4","Angpt2","Angptl6","Angptl7","Ank1","Ank2","Ankar","Ankdd1a","Ankdd1b","Angptl8","Angpt1","Ank3","Ankfn1","Ankef1","Ankfy1","Ankh","Ankib1","Ankhd1","Ankk1","Ankle1","Ankmy1","Ankle2","Ankmy2","Ankra2","Ankrd10","Ankrd11","Ankrd1","Ankrd13a","Ankrd12","Ankrd13b","Ankrd13d","Ankrd13c","Ankrd16","Ankrd22","Ankrd2","Ankrd23","Ankrd24","Ankrd17","Ankrd26","Ankrd27","Ankrd28","Ankrd30a","Ankrd31","Ankrd33b","Ankrd34a","Ankrd29","Ankrd34c","Ankrd35","Ankrd36","Ankrd37","Ankrd39","Ankrd40","Ankrd42","Ankrd44","Ankrd45","Ankrd33","Ankrd46","Ankrd34b","Ankrd49","Ankrd50","Ankrd53","Ankrd52","Ankrd54","Ankrd6","Ankrd60","Ankrd55","Ankrd63","Ankrd7","Ankrd66","Ankrd9","Ankrd65","Anks1a","Anks3","Anks4b","Anks1b","Ankrd61","Ankub1","Ankzf1","Anlnl1","Anln","Ano10","Ano1","Ano3","Ano2","Ano4","Anks6","Ano6","Ano8","Ano7","Ano5","Ano9","Anp32a","Anp32e","Anp32b","Anos1","Antxr1","Antxrl","Antxr2","Anxa10","Anxa11","Anxa2-ps1","Anxa13","Anxa1","Anpep","Anxa3","Anxa2","Anxa4","Anxa6","Anxa8","Anxa5","Anxa7","Aoc2-ps1","Anxa9","Aoah","Aoc1","Aox2","Aoc3","Aox1","Ap1ar","Aox3","Ap1b1","Ap1g1","Aox4","Ap1g2","Ap1m2","Ap1m1","Ap1s1","Ap1s2","Ap1s3","Ap2a1","Ap2a2","Ap2s1","Ap2b1","Ap3b1","Ap3b2","Ap3d1","Ap3m1","Ap3m2","Ap3s1","Ap3s2","Ap4b1","Ap4e1","Ap4m1","Ap5b1","Ap4s1","Ap2m1","Ap5m1","Ap5s1","Ap5z1","Apba3","Apba1","Apba2","Apaf1","Apbb1ip","Apbb3","Apbb2","Apbb1","Apcdd1","Apbh","Apc2","Apcdd1l","Apeg3","Apcs","Apeh","Apc","Apex2l1","Apex2","Aph1a","Apex1","Aph1b","Api5","Apip","Aplf","Aplnr","Apln","Aplp1","Apmap","Aplp2","Apoa2","Apoa4","Apoa5","Apobec1","Apoa1","Apobec2","Apobec3b","Apobec4","Apobr","Apob","Apoc1","Apoc4","Apoc2","Apoc3","Apod","Apof","Apol11a","Apol2","Apoh","Apol3","Apol9a","Apold1","Apom","Apon","Apoo","Apool","Apopt1","Apoe","Appl1","Appbp2","Appl2","Aptr","Aprt","Aptx","App","Aqp11","Aqp12a","Aqp1","Aqp3","Aqp5","Aqp2","Aqp6","Aqp7","Aqp8","Aqr","Aqp9","Aqp4","Araf","Arap2","Arap1","Arcn1","Arap3","Areg","Ar","Arc","Arf2","Arel1","Arf5","Arf1","Arf4","Arf3","Arf6","Arfgap1","Arfgap2","Arfgap3","Arfgef1","Arfgef2","Arfgef3","Arfip1","Arfip2","Arfrp1","Arg2","Arglu1","Arhgap11a","Arg1","Arhgap1","Arhgap10","Arhgap12","Arhgap20","Arhgap18","Arhgap19","Arhgap17","Arhgap22","Arhgap21","Arhgap23","Arhgap25","Arhgap24","Arhgap27","Arhgap15","Arhgap28","Arhgap26","Arhgap30","Arhgap29","Arhgap31","Arhgap32","Arhgap36","Arhgap39","Arhgap40","Arhgap35","Arhgap4","Arhgap33","Arhgap42","Arhgap44","Arhgap6","Arhgap45","Arhgap5","Arhgap8","Arhgap9","Arhgdib","Arhgdia","Arhgdig","Arhgef10l","Arhgef10","Arhgef1","Arhgef12","Arhgef11","Arhgef15","Arhgef16","Arhgef17","Arhgef18","Arhgef19","Arhgef2","Arhgef25","Arhgef26","Arhgef28","Arhgef3","Arhgef33","Arhgef38","Arhgef37","Arhgef4","Arhgef39","Arhgef5","Arhgef40","Arhgef6","Arhgef9","Arhgef7","Arid1a","Arid2","Arid3b","Arid3a","Arid4a","Arid1b","Arid4b","Arid5b","Arid5a","Arih1","Arih2","Arid3c","Arl10","Arl1","Arl11","Arl13a","Arl14","Arl13b","Arl14ep","Arl14epl","Arl16","Arl15","Arih2os","Arl2","Arl2bp","Arl4a","Arl4c","Arl3","Arl4d","Arl5a","Arl5c","Arl5b","Arl6","Arl2-ps1","Arl6ip1","Arl6ip5","Arl6ip4","Arl6ip6","Arl8a","Arl8b","Arl9","Armc12","Armc10","Armc1","Armc2","Armc3","Armc4","Armc5","Armc6","Armc7","Armc9","Armc8","Armcx1","Armcx2","Armcx4","Armcx3","Armcx6","Armt1","Arnt2","Arnt","Arpc1a","Arntl2","Arntl","Arpc1b","Armcx5","Arpc2","Arpc3","Arpc5","Arpc4","Arpc5l-ps1","Arpc5l","Arpin","Arpp19","Arrb2-ps","Arrdc2","Arr3","Arrdc1","Arpp21","Arrb1","Arrdc3","Arrb2","Arrdc5","Arrdc4","Arsa","Arse","Arsb","Arsi","Arsg","Arsj","Arsk","Art1","Art4","Art3","Art5","Artn","Arv1","Arvcf","Arxes2","Arx","As3mt","Asah1","Asah2","Asap2","Asap1","Asap3","Art2b","Asb10","Asb1","Asb11","Asb12","Asb14","Asb13","Asb15","Asb16","Asb17","Asb18","Asb4","Asb2","Asb3","Asb6","Asb5","Asb7","Asb8","Asb9","Ascc2","Ascc3","Ascc1","Ascl3","Ascl2","Ascl4","Ascl5","Ascl1","Asf1b","Asf1a","Asgr1","Ash2l","Asgr2","Ash1l","Asic4","Asic1","Asic3","Asic2","Asic5","Asip","Asmt","Asna1","Asmtl","Asl","Aspdh","Asnsd1","Asns","Aspa","Aspg","Asphd1","Asphd2","Asprv1","Aspnl1","Aspm","Aspn","Aspscr1","Asph","Asrgl1","Aste1","Astl","Astn1","Ass1","Asxl1","Astn2","Asxl2","Asxl3","Asz1","Atad2","Atad1","Atad2b","Atad5","Atad3a","Atat1","Atcay","Ate1","Atf1","Atf2","Atf5","Atf3","Atf4","Atf6","Atf6b","Atf7","Atf7ip","Atf7ip2","Atg10","Atg101","Atg12","Atg13","Atg14","Atg16l2","Atg16l1","Atg2a","Atg2b","Atg4a","Atg3","Atg4b","Atg4c","Atg4d","Atg5","Atg9a","Atg7","Atg9b","Atl3","Atl1","Atic","Atl2","Atmin","Atoh1","Atn1","Atoh7","Atoh8","Atm","Atp10a","Atox1","Atp10d","Atp10b","Atp11a","Atp11b","Atp11c","Atp12a","Atp13a1","Atp13a2","Atp13a3","Atp13a5","Atp13a4","Atp1a4","Atp1a3","Atp1a2","Atp1a1","Atp1b2","Atp1b4","Atp1b1","Atp1b3","Atp23","Atp2a1","Atp2a3","Atp2b1","Atp2b3","Atp2a2","Atp2b2","Atp2b4","Atp2c1","Atp2c2","Atp4a","Atp4b","Atp5a1","Atp5c1","Atp5d","Atp5b","Atp5e","Atp5f1","Atp5h-ps1","Atp5g1","Atp5hl1","Atp5g2","Atp5g3","Atp5h","Atp5i","Atp5j","Atp5l","Atp5j2","Atp5s","Atp5o","Atp6ap1","Atp6ap1l","Atp6ap2","Atp6v0b","Atp6v0a1","Atp6v0a4","Atp6v0c","Atp6v0a2","Atp6v0d2","Atp6v0d1","Atp6v0e1","Atp6v0e2","Atp6v1b1","Atp6v1a","Atp6v1c1","Atp6v1b2","Atp6v1d","Atp6v1c2","Atp6v1e2","Atp6v1e1","Atp6v1f","Atp6v1g1","Atp6v1g2","Atp6v1g3","Atp6v1h","Atp7b","Atp8a1","Atp8a2","Atp8b1","Atp7a","Atp8b2","Atp8b3","Atp8b4","Atp9a","Atp8b5p","Atp9b","Atpaf1","Atpaf2","Atraid","Atpif1","Atr","Atrn","Atrnl1","Atxn1l","Atxn10","Atrx","Atxn1","Atxn3","Atxn2","Atxn2l","Atxn7","Atxn7l3","Atxn7l2","Atxn7l1","Atrip","Aup1","Aunip","Auh","Aurkaip1","Aurka","Aurkc","Auts2l1","Aurkb","Auts2l","Atxn7l3b","Auts2","Avgr1","Aven","Avil","Avl9","Avpi1","Awat1","Avpr1b","Axdnd1","Avpr1a","Avpr2","Awat2","Avp","Axin1","Axin2","Azi2","Axl","Azgp1","Azin1","Azin2","B3galnt1","B3galnt2","B3galt2","B3galt1","B3galt4","B3galt5","B3galt6","B2m","B3gat1","B3gat2","B3gat3","B3glct","B3gnt4","B3gnt5","B3gnt2","B3gnt3","B3gnt6","B3gnt8","B3gnt9","B3gnt7","B4galnt2","B3gntl1","B4galnt3","B4galnt1","B4galnt4","B4galt2","B4galt3","B4galt4","B4galt5","B4galt1","B4galt7","B4galt6","B4gat1","B9d2","Baalc","B9d1","Babam1","Baat","Babam2","Bace2","Bace1","Bach1","Bach2","Bag2","Bag3","Bag1","Bag4","Bag5","Bag5l1","Bahcc1","Bag6","Bahd1","Baiap2l1","Bad","Baiap3","Baiap2l2","Bambi","Banf1","Bak1","Banf2","Banp","Bank1","Bap1","Bard1","Barhl1","Barx1","Barhl2","Barx2","Baiap2","Batf","Basp1","Batf2","Batf3","Baz2a","Baz1a","Baz1b","Bbc3","Bbof1","Baz2b","Bbox1","Bbs10","Bbs12","Bbs1","Bbs2","Bax","Bbs4","Bbs5","Bbip1","Bbs7","Bbs9","Bc1","Bbx","Bcam","Bcap29","Bcar3","Bcap31","Bcas2","Bcar1","Bcan","Bcas1","Bcas3","Bccip","Bcdin3d","Bcat2","Bcat1","Bckdhb","Bckdha","Bche","Bckdk","Bcl10","Bcl11b","Bcl2a1","Bcl11a","Bcl2l1-ps1","Bcl2l10","Bcl2l13","Bcl2l15","Bcl2l12","Bcl2l14","Bcl2l1","Bcl2l11","Bcl3","Bcl2l2","Bcl6","Bcl6b","Bcl7a","Bcl7b","Bcl7c","Bcl9","Bcl9l","Bclaf3","Bco1","Bclaf1","Bco2","Bcor","Bcorl1","Bcr","Bcs1l","Bdh2","Bdh1","Bdkrb2","Bean1","Bdkrb1","Bdp1","Becn2","Bend2","Bend3","Begain","Bend4","Becn1","Bend5","Bcl2","Bend6","Bend7","Best2","Best1","Best4","Best3","Bet1","Bex1","Bex2","Bet1l","Bex4-ps1","Bex4","Bfar","Bfsp2","Bfsp1","Bgn","Bhlha9","Bglap","Bhlhb9","Bhlha15","Bhlhe22","Bdnf","Bex3","Bhlhe23","Bhlhe40","Bhlhe41","Bhmt","Bhmt2","Bicd1","Bicc1","Bicd2","Bicdl1","Bicdl2","Bicra","Bhmg1","Bicral","Bid","Bik","Bin2","Bin2a","Bin3","Bin1","Birc3","Birc2","Birc6","Birc7","Birc5","Bivm","Blcap","Bles03","Blk","Blmh","Blm","Blnk","Bloc1s1","Bloc1s2","Bloc1s3","Bloc1s4","Bloc1s5","Blvrb","Bloc1s6","Blzf1","Blvra","Bmf","Bmi1","Bmp10","Bmp1","Bmp2k","Bmp15","Bmp3","Bmp5","Bmp2","Bmp8a","Bmp6","Bmp8b","Bmp7","Bmper","Bmp4","Bmpr1a","Bmt2","Bmpr1b","Bms1","Bmx","Bnc1","Bmpr2","Bmyc","Bnc2","Bnip1","Bnip2","Bnip3-ps1","Bnip3l-ps1","Bnip3","Bnipl","Bod1","Bod1l1","Boc","Bola1","Bok","Bola2","Bola2-ps1","Bola2-ps2","Bola3","Boll","Bop1","Borcs6","Borcs5","Bora","Bnip3l","Borcs7","Borcs8","Bphl","Bpgm","Bpi","Bpifa1","Bpifa3","Bpifa5","Bpifa6","Bpifb2","Bpifb1","Bpifb3","Bpifb4","Bpifa2f","Bpifb5","Bpifb6","Bpnt1-ps1","Bpifc","Bpifa2","Bpnt1","Bptf","Brap","Braf","Brcc3-ps1","Brat1","Brcc3","Brca2","Brd1","Brca1","Brd3","Brd2","Brd4","Brd7","Brd9","Brdt","Brd8","Brf1","Brf2","Bri3","Bri3bp","Bricd5","Brinp1","Brinp2","Brinp3","Brk1","Brms1","Brix1","Brms1l","Brox","Brpf1","Brs3","Brpf3","Brsk2","Brsk1","Brwd3","Brwd1","Bscl2","Bsdc1","Brip1","Bsph1","Bsnd","Bsph2","Bsn","Bsg","Bst1","Bst2","Bspry","Bsx","Btbd1","Btaf1","Btbd10","Btbd11","Btbd18","Btbd16","Btbd17","Btbd19","Btbd2","Btbd3","Btbd6","Btbd7","Btbd8","Btc","Btbd9","Btd","Btf3","Btf3l4","Btg1","Btg3","Btg4","Btk","Btla","Btn1a1","Btn2a2","Btn3a2","Btnl10","Btnl2","Btnl5","Btnl3","Btg2","Btnl6-ps1","Btnl8","Btnl7","Btnl9","Bud13","Bub1","Bub3","Bub1b","Btrc","Bves","Bud23","Bud31","Bysl","Bzw2","Bzw1","C10H17orf102","C17H10orf113","C18H10orf95","C17h6orf52","C19H16orf47","C1d","C10H5orf58","C12H7orf61","C1d-ps1","C1galt1c1","C1H10orf76","C10H10orf95","C1galt1","C1H19orf84","C1H9orf66","C1qa","C1qb","C1ql1","C1ql2","C1qc","C1qbp","C1ql3","C1ql4","C1qtnf1","C1qtnf2","C1qtnf12","C1qtnf4","C1qtnf3","C1qtnf5","C1qtnf6","C1qtnf7","C1qtnf9","C1rl","C1r","C1s","C2cd2","C2","C2cd2l","C2cd3","C2cd4a","C2cd4b","C2cd4c","C2cd4d","C2H5orf64","C2cd6","C2cd5","C3ar1","C4bpb","C4bpa","C4a","C4b","C3","C5ar2","C5","C7H12orf80","C5ar1","C6","C7","C8a","C8b","C8g","Ca5b","C9","Ca5a","Caap1","Cab39l","Cab39","Cabcoco1","Cables2","Cabin1","Cables1","Cabp2","Cabp1","Cabp4","Cabp5","Cabp7","Cabs1","Cabyr","Cacfd1","Cachd1","Cacna1b","Cacna1e","Cacna1a","Cacna1f","Cacna1g","Cacna1c","Cacna1d","Cacna1h","Cacna1i","Cacna2d2","Cacna2d4","Cacna1s","Cacna2d3","Cacnb1","Cacna2d1","Cacnb2","Cacnb3","Cacng1","Cacnb4","Cacng5","Cacng2","Cacng3","Cacng4","Cacng6","Cacng7","Cactin","Cacng8","Cacul1","Cacybp","Cadm1","Cad","Cadm2","Cadm3","Cadm4","Cahm","Cadps","Cage1","Cadps2","Calb2","Calb1","Calcb","Calcoco2","Calcoco1","Calcr","Calhm1","Calca","Calcrl","Cald1","Calhm2","Calhm3","Calhm4","Calm-ps1","Calm-ps2","Calhm5","Calhm6","Calml3","Calml5","Calml4","Calm3","Calm2","Caln1","Calm1","Calr3","Calr4","Calr","Caly","Calu","Camk1","Camk1d","Camk1g","Camk2n1","Camk2n2","Camk2g","Camk2b","Camk2a","Camkk1","Camk2d","Camk4","Camkmt","Camkk2","Camp","Camkv","Camlg","Camsap1","Camsap2","Camsap3","Camta2","Camta1","Cand1","Cand2","Cant1","Cap2","Cap1","Canx","Capg","Capn10","Capn12","Capn11","Capn1","Capn13","Capn15","Capn2","Capn5","Capn7","Capn3","Capn8","Capn9","Capns1","Capns1-ps1","Capns2","Caprin2","Caprin1","Capsl","Caps2","Capza2","Capza1","Capza3","Capzb","Car1","Car10","Car11","Capn6","Car13","Car13-ps1","Car12","Car15","Car14","Car7","Car6","Car3","Car2","Car8","Car4","Card10","Car9","Card14","Card19","Card11","Card6","Card9","Carf","Carhsp1","Carmn","Carm1","Carnmt1","Carns1","Carmil2","Carmil1","Carmil3","Cars","Cars2","Casd1","Casc3","Casc1","Casc4","Cartpt","Cask","Casp14","Casp16","Caskin2","Caskin1","Casp12","Casp1","Casp2","Casp4","Casp7","Casp8ap2","Casp6","Casp8","Casq1","Casq2","Casp9","Cass4","Casp3","Castor2","Castor1","Casr","Cast","Catsper1","Catip","Casz1","Catsper3","Catsper2","Catsper4","Catspere","Catsperd","Catsperg","Catsperz","Cat","Cav2","Cavin1","Cavin2","Cavin3","Catsperb","Cavin4","CB741658","Cbarp","Cbfa2t2","Cbfa2t3","Cbfb","Cblb","Cav1","Cblc","Cbll1","Cbln1","Cb707485","Cav3","Cbl","Cbln2","Cbln4","Cbln3","Cbr3","Cbr4","Cbr1","Cbwd1","Cbs","Cbx1","Cbx2","Cbx3","Cbx4","Cbx5","Cbx6","Cby3","Cbx8","Cbx7","Cby1","Cc2d1a","Cc2d1b","Cc2d2b","Ccbe1","Ccar1","Cc2d2a","Ccdc102a","Ccar2","Ccdc103","Ccdc105","Ccdc106","Ccdc110","Ccdc107","Ccdc112","Ccdc113","Ccdc114","Ccdc115","Ccdc116","Ccdc117","Ccdc121","Ccdc12","Ccdc120","Ccdc122","Ccdc124","Ccdc125","Ccdc126","Ccdc127","Ccdc13","Ccdc129","Ccdc130","Ccdc134","Ccdc136","Ccdc137","Ccdc138","Ccdc144b","Ccdc14","Ccdc142","Ccdc141","Ccdc146","Ccdc148","Ccdc149","Ccdc15","Ccdc150","Ccdc151","Ccdc152","Ccdc153","Ccdc154","Ccdc157","Ccdc155","Ccdc162","Ccdc160","Ccdc158","Ccdc159","Ccdc166","Ccdc163","Ccdc167","Ccdc169","Ccdc17","Ccdc170","Ccdc171","Ccdc174","Ccdc172","Ccdc173","Ccdc168","Ccdc175","Ccdc179","Ccdc177","Ccdc18","Ccdc178","Ccdc181","Ccdc182","Ccdc180","Ccdc183","Ccdc185","Ccdc184","Ccdc187","Ccdc186","Ccdc188","Ccdc189","Ccdc190","Ccdc196","Ccdc22","Ccdc24","Ccdc191","Ccdc25","Ccdc27","Ccdc28a","Ccdc28b","Ccdc3","Ccdc30","Ccdc33","Ccdc32","Ccdc34","Ccdc36","Ccdc38","Ccdc198","Ccdc39","Ccdc40","Ccdc42","Ccdc43","Ccdc47","Ccdc50","Ccdc54","Ccdc51","Ccdc57","Ccdc58","Ccdc59","Ccdc6","Ccdc61","Ccdc60","Ccdc62","Ccdc65","Ccdc63","Ccdc68","Ccdc69","Ccdc70","Ccdc7","Ccdc66","Ccdc71","Ccdc71l","Ccdc74a","Ccdc73","Ccdc77","Ccdc78","Ccdc8","Ccdc80","Ccdc81","Ccdc82","Ccdc83","Ccdc84","Ccdc85b","Ccdc85a","Ccdc85c","Ccdc87","Ccdc86","Ccdc88a","Ccdc88c","Ccdc88b","Ccdc89","Ccdc9","Ccdc90b","Ccdc91","Ccdc92","Ccdc92b","Ccdc96","Ccdc94","Ccdc93","Ccdc9b","Ccdc97","Ccer2","Ccer1","Cchcr1","Ccin","Cck","Ccl1","Ccl12","Cckbr","Cckar","Ccl17","Ccl11","Ccl19","Ccl21","Ccl22","Ccl25","Ccl24","Ccl26","Ccl27","Ccl28","Ccl4","Ccl6","Ccl7","Ccl9","Ccl20","Ccl3","Ccl5","Ccm2","Ccm2l","Ccna1","Ccnb1ip1","Ccnb2","Ccna2","Ccnb3","Ccnb1","Ccnc","Ccnd2","Ccnd3","Ccndbp1","Ccne2","Ccne1","Ccnf","Ccnf-ps1","Ccl2","Ccng2","Ccng1","Ccnh","Ccni","Ccnj","Ccnk","Ccnjl","Ccnl1","Ccnl2","Ccno","Ccnyl1","Ccny","Ccnt2","Ccnd1","Ccp110","Ccp6l1","Ccnt1","Ccpg1","Ccpg1os","Ccr10","Ccr1l1","Ccr1","Ccr4","Ccr3","Ccr2","Ccr7","Ccr6","Ccr8","Ccr9","Ccrl2","Ccs","Ccr5","Ccsap","Cct2-ps1","Ccser2","Ccser1","Cct2","Cct3-ps2","Cct3-ps1","Cct3-ps3","Cct3","Cct3-ps4","Cct5-ps2","Cct4","Cct6a-ps1","Cct5","Cct6a-ps11","Cct6a-ps12","Cct6a-ps10","Cct6a","Cct6a-ps14","Cct6a-ps15","Cct6a-ps2","Cct6a-ps3","Cct6a-ps5","Cct6a-ps4","Cct6a-ps6","Cct6a-ps7","Cct6a-ps8","Cct6a-ps9","Cct7-ps1","Cct7-ps2","Cct7-ps3","Cct6b","Cct7","Cct8-ps1","Cct8-ps2","Cct8","Cct8l1","Ccz1b","Cd109","Cd101","Cd160","Cd151","Cd163","Cd164l2","Cd164","Cd14","Cd180","Cd177","Cd19","Cd1d1","Cd2","Cd200r1","Cd207","Cd200r1l","Cd209a","Cd200","Cd209c","Cd209d","Cd209e","Cd209f","Cd22","Cd226","Cd24","Cd247","Cd244","Cd248","Cd27","Cd274","Cd276","Cd2bp2","Cd28","Cd300a","Cd2ap","Cd300c","Cd300e","Cd300c2","Cd300lb","Cd300ld","Cd300le","Cd300lg","Cd300lf","Cd302","Cd320","Cd33","Cd34","Cd37","Cd3e-ps1","Cd38","Cd3d","Cd3eap","Cd3e","Cd3g","Cd36","Cd4","Cd48","Cd47","Cd44","Cd5","Cd46","Cd52","Cd53","Cd5l","Cd40lg","Cd55","Cd59","Cd6","Cd40","Cd63","Cd68","Cd7","Cd70","Cd72","Cd79al","Cd69","Cd74","Cd79b","Cd80","Cd83","Cd84","Cd81","Cd82","Cd79a","Cd8a","Cd8b","Cd86","Cd99","Cd93","Cd96","Cd9","Cd99l2","Cda","Cdadc1","Cdan1","Cdc123","Cdc14a","Cdc14b","Cdc16","Cdc20b","Cdc20","Cdc23","Cdc26","Cdc27","Cdc34","Cdc37l1","Cdc37","Cdc40","Cdc42bpa","Cdc25b","Cdc42","Cdc42bpb","Cdc42bpg","Cdc42ep1","Cdc42ep2","Cdc42ep4","Cdc42ep3","Cdc42ep5","Cdc42se1","Cdc42se2","Cdc45","Cdc6","Cdc7","Cdc5l","Cdc73","Cdca2","Cdca3","Cdca4","Cdca7","Cdca5","Cdca7l","Cdca8","Cdcp1","Cdc25c","Cdcp2","Cdh10","Cdh11","Cdh14","Cdh15","Cdh12","Cdh1","Cdh16","Cdh13","Cdh17","Cdh19","Cdh18","Cdh20","Cdh22","Cdh23","Cdh2","Cdh24","Cdh26","Cdh3","Cdh6","Cdh4","Cdh7","Cdh5","Cdc25a","Cdh8","Cdh9","Cdhr3","Cdhr1","Cdhr4","Cdhr2","Cdip1","Cdhr5","Cdipt","Cdk10","Cdk13","Cdk11b","Cdk15","Cdk12","Cdk14","Cdk16","Cdk17","Cdk18","Cdk19","Cdk2ap1","Cdk20","Cdk2ap1-ps1","Cdk2","Cdk2ap1-ps2","Cdk2ap1-ps3","Cdk2ap1-ps5","Cdk2ap1-ps4","Cdk2ap1-ps6","Cdk2ap1-ps7","Cdk2ap1-ps8","Cdk2ap2","Cdk5r2","Cdk5r1","Cdk5rap1","Cdk4","Cdk5","Cdk5rap3","Cdk6","Cdk8","Cdk7","Cdk9","Cdkal1","Cdkl1","Cdkl4","Cdkl2","Cdkl3","Cdk5rap2","Cdkn1c","Cdkn2aip","Cdkn1a","Cdkn1b","Cdkn2aipnl","Cdk1","Cdkn2a","Cdkn2d","Cdkn2c","Cdkn3","Cdnf","Cdkn2b","Cdkl5","Cdo1","Cdon","Cdpf1","Cdrt4","Cdr2l","Cdr2","Cds2","Cds1","Cdsn","Cdt1","Cdx1","Cdr1","Cdx2","Cdx4","Cdv3","Cdyl","Cdyl2","Ceacam11","Ceacam12","Ceacam16","Ceacam18","Ceacam19","Ceacam1","Ceacam20","Ceacam3","Ceacam6","Ceacam4","Ceacam9","Cebpd","Cebpe","Cebpg","Cebpa","Cebpb","Cebpz","Cecr2","Cel","Cela1","Cela2a","Cela3b","Celf3","Celf1","Celf4","Celf2","Celf5","Celf6","Celsr1","Celsr2","Cend1","Cenpb","Cemip","Cenpa","Celsr3","Cenpc","Cenpe","Cenph","Cenpf","Cenpk","Cenpj","Cenpi","Cenpm","Cenpl","Cenpo","Cenpp","Cenps","Cenpq","Cenpn","Cenpv","Cenpu","Cenpt","Cenpx","Cenpw","Cep112","Cep104","Cep120","Cep128","Cep126","Cep131","Cep135","Cep152","Cep170b","Cep170","Cep162","Cep164","Cep19","Cep192","Cep250","Cep295nl","Cep44","Cep350","Cep290","Cep295","Cep41","Cep55","Cep57","Cep68","Cep57l1","Cep72","Cep63","Cep70","Cep76","Cep78","Cep83","Cep83os","Cep85l","Cep89","Cep95","Cep85","Cep97","Cept1","Cer1","Cercam","Cerk","Cers1","Cerkl","Cers2","Cers4","Cers3","Cers5","Cers6","Ces1a","Ces1d","Ces2","Ces2a","Ces1c","Ces1e","Ces2c","Ces2e","Ces1f","Ces2i","Ces3a","Ces2g","Ces2j","Ces4a","Ces2h","Ces5a","Cesl1","Cetn1","Cetn4","Cetn2","Cfap100","Cetn3","Cfap157","Cfap126","Cfap161","Cfap20","Cfap206","Cfap221","Cfap43","Cfap36","Cfap45","Cfap44","Cfap46","Cfap47","Cfap53","Cfap54","Cfap52","Cfap57","Cfap58","Cfap61","Cfap65","Cfap73","Cfap58l1","Cfap70","Cfap74","Cfap77","Cfap97","Cfap99","Cfc1","Cfap69","Cfdp1","Cfd","Cfhr2","Cfhr1","Cfb","Cfh","Cfi","Cfl2","Cfp","Cflar","Cga","Cfl1","Cgas","Cggbp1","Cgm4","Cgn","Cgnl1","Cftr","Cgref1","Cgrrf1","Ch25h","Chac1","Chac2","Chad","Chaf1a","Chadl","Champ1","Chaf1b","Chchd1","Chchd10","Chat","Chchd2","Chchd3","Chchd4","Chchd5","Chchd6","Chchd7","Chd1","Chd1l","Chd2","Chd3","Chd4","Chd5","Chd6","Chd8","Chd9","Chdh","Cherp","Chek1","Chfr","Chek2","Chga","Chgb","Chi3l1","Chi3l4","Chi3l3","Chd7","Chic1","Chic2","Chid1","Chit1","Chkb","Chl1","Chka","Chml","Chm","Chmp1a","Chmp1b","Chmp3","Chmp2b","Chmp2a","Chmp4bl1","Chmp4b","Chmp4c","Chmp5","Chmp6","Chmp7","Chn3","Chn1","Chn2","Chia","Chodl","Chordc1","Chp2","Chpf","Chp1","Chpf2","Chpt1","Chrac1","Chrdl2","Chrdl1","Chrd","Chrm2","Chrm4","Chrm1","Chrm3","Chrm5","Chrna1","Chrna10","Chrna2","Chrna3","Chrna5","Chrna6","Chrna4","Chrna9","Chrnb1","Chrnb3","Chrna7","Chrnd","Chrnb2","Chrnb4","Chrng","Chst1","Chrne","Chst10","Chst11","Chst12","Chst13","Chst14","Chst2","Chst15","Chst3","Chst5","Chst4","Chst8","Chst7","Chst9","Chsy1","Chsy3","Chsy3l","Chtf18","Chtop","Chtopl1","Churc1","Chtf8","Chuk","Ciapin1","Ciao1","Ciart","Cib3","Cib2","Cib1","Cib4","Cidea","Cideb","Cic","Cidec","Cilp","Cilp2","Cinp","Cip2a","Cipc","Ciita","Cir1","Cisd2","Cisd1","Cirbp","Cistr","Cisd3","Cish","Cited1","Cited4","Cit","Ckap2l","Ckap2","Ciz1","Cited2","Ckap4","Cklf","Ckap5","Ckmt2","Cks1l","Cks1b","Ckm","Ckb","Ckmt1","Cks2","Clba1","Clasrp","Clasp2","Clca2","Clasp1","Clca1","Clca4","Clca4l","Clca5","Clcf1","Clcc1","Clcn1","Clcn2","Clcn3","Clcn4","Clcn6","Clcn5","Clcn7","Clcnka","Clcnkb","Cldn1","Cldn10","Cldn11","Cldn14","Cldn12","Cldn15","Cldn16","Cldn17","Cldn19","Cldn18","Cldn2","Cldn20","Cldn22","Cldn25","Cldn24","Cldn23","Cldn34a","Cldn3","Cldn34c4","Cldn34d","Cldn34b","Cldn34e","Cldn4","Cldn8","Cldn6","Cldn7","Cldn5","Cldn9","Cldnd1","Cldnd2","Clec10a","Clec11a","Clec12a","Clec12b","Clec14a","Clec16a","Clec18a","Clec19a","Clec1b","Clec1a","Clec2d","Clec2d2","Clec2dl1","Clec2h","Clec2e","Clec2l","Clec2g","Clec3a","Clec3b","Clec4a1","Clec20a","Clec4a2","Clec4a","Clec4a3","Clec4b2","Clec4d","Clec4e","Clec4g","Clec4f","Clec5a","Clec4m","Clec6a-ps1","Clec9a","Clhc1","Clec7a","Clgn","Clic2","Clic3","Clic4","Clic1","Clic6","Clic5","Clint1","Clip2","Clip1","Clip3","Clk1","Clip4","Clk3","Clk2","Clk4","Clmn","Clmp","Cln5","Cln3","Cln8","Clnk","Clns1a","Clp1","Clock","Clpb","Clpp","Clps","Clpsl2","Clptm1","Clrn2","Clptm1l","Clrn1","Clpx","Clrn3","Clspn","Cln6","Clstn1","Clstn3","Clstn2","Cltb","Clta","Cluap1","Cltc","Cluh","Clul1","Clvs2","Clvs1","Clybl","Clu","Cma1","Cmahp","Cmas","Cmbl","Cmc1","Cmc2","Cmklr1","Cmip","Cmpk2","Cmpk1","Cmtm1","Cmtm2a","Cmss1","Cmtm3","Cmtm4","Cmtm5","Cmtm7","Cmtm6","Cmtr2","Cmtm8","Cmtr1","Cmya5","Cnbd2","Cnbd1","Cnep1r1","Cnbp","Cndp2","Cndp1","Cnfn","Cnga1","Cnga2","Cnga3","Cnih1","Cnga4","Cnih2","Cngb3","Cngb1","Cnih3","Cnih4","Cnksr1","Cnmd","Cnksr3","Cnksr2","Cnn2","Cnn1","Cnn3","Cnnm1","Cnnm2","Cnnm3","Cnnm4","Cnot10","Cnot11","Cnot1","Cnot3","Cnot2","Cnot4","Cnot6","Cnot6l","Cnot7","Cnot8","Cnot9","Cnpy1","Cnpy3","Cnppd1","Cnpy2","Cnp","Cnpy4","Cnst","Cnrip1","Cntd1","Cntfr","Cnr2","Cntln","Cntf","Cnr1","Cntn2","Cntn1","Cntn3","Cntn5","Cntn6","Cntn4","Cntnap1","Cntnap3","Cntnap4","Cntnap5a","Cntnap2","Cntnap5c","Cntrl","Cntnap5b","Coa3","Cntrob","Coa4","Coa5","Coa6","Coa7","Coasy","Cobl","Cobll1","Coch","Cog1","Cog3","Cog2","Cog4","Cog6","Cog5","Cog7","Cog8","Coil","Col10a1","Col11a1","Col13a1","Col11a2","Col15a1","Col14a1","Col12a1","Col16a1","Col17a1","Col18a1","Col19a1","Col20a1","Col22a1","Col24a1","Col23a1","Col1a2","Col25a1","Col26a1","Col28a1","Col27a1","Col1a1","Col3a1","Col4a1","Col2a1","Col4a2","Col4a3bp","Col4a3","Col4a4","Col4a5","Col4a6","Col5a2","Col5a1","Col5a3","Col6a1","Col6a2","Col6a4","Col6a5","Col6a6","Col8a1","Col8a2","Col7a1","Col9a1","Col9a2","Colca2","Colec10","Col9a3","Colec11","Colgalt1","Colec12","Col6a3","Colgalt2","Commd1","Colq","Commd2","Commd10","Commd4","Commd3","Commd5","Commd7","Commd8","Commd6","Commd9","Comtd1","Comp","Copb2","Comt","Copa","Copb1","Cope","Coprs","Copg2","Copg1","Cops3","Cops4","Cops2","Cops5","Cops6","Cops7a","Cops7b","Cops8","Copz2","Coq10a","Cops9","Copz1","Coq10b","Coq4","Coq2","Coq3","Coq5","Coq6","Coq8b","Coq7","Coq8a","Coq9","Corin","Coro1a","Coro1c","Coro1b","Coro2a","Coro2b","Cort","Coro7","Coro6","Cotl1","Cox11","Cox10","Cox14","Cox15","Cox17","Cox19","Cox18","Cox20","Cox4i2","Cox5a","Cox4i1","Cox6a1","Cox6a2","Cox5b","Cox6b1-ps1","Cox6b1","Cox6b2","Cox6c-ps1","Cox6c","Cox7a1","Cox7a2","Cox7a2l","Cox7a2l2","Cox7b2","Cox7b","Cox16","Cox8a","Cox8b","Cox8c","Cpa1","Cpa2","Cpa3","Cpa4","Cpa5","Cpa6","Cpb1","Cpamd8","Cpb2","Cpd","Cox7c","Cp","Cpe","Cpeb1","Cpeb2","Cpg1","Cped1","Cpeb3","Cpeb4","Cphx","Cplx1","Cplx3","Cplx2","Cplx4","Cpn2","Cpm","Cpne1","Cpn1","Cpne3","Cpne2","Cpne4","Cpne6","Cpne5","Cpne7","Cpne8","Cpne9","Cpo","Cpped1","Cpox","Cpq","Cpsf1","Cpsf2","Cpsf3","Cpsf4","Cps1","Cpsf4l","Cpsf6","Cpsf7","Cpt1c","Cpt2","Cptp","Cpt1a","Cpvl","Cpt1b","Cpxcr1","Cpxm1","Cpxm2","Cpz","Crabp1","Cr1l","Cracr2a","Cr2","Crabp2","Cracr2b","Cradd","Cramp1","Crb2","Crb3","Crb1","Crat","Crbn","Crct1","Crcp","Creb3","Creb3l2","Creb3l1","Creb3l4","Creb3l3","Creb5","Crebl2","Crebzf","Creg2","Creg1","Crebrf","Crebbp","Creld1","Creb1","Creld2","Crhbp","Crim1","Crem","Crip1","Crh","Crip2","Crhr2","Crip3","Cripak","Cript","Crisp1","Crisp2","Crhr1","Crisp3","Crispld1","Crispld2","Crk","Crkl","Crlf2","Crlf1","Crlf3","Crmp1","Crls1","Crnde","Crnkl1-ps1","Crnkl1","Crnn","Crocc","Crot","Crocc2","Crtac1","Crtam","Crtap","Crtapl1","Crtc1","Crxos1","Crtc2","Crtc3","Crx","Cry1","Cry2","Cryaa","Cryba2","Cryba4","Cryba1","Crybb1","Cryab","Crybb2","Crp","Crybb3","Crybg1","Crybg3","Crybg2","Cryga","Crygb","Crygc","Crygd","Crygf","Cryge","Crygn","Crygs","Cryl1","Crym","Cryz","Cryzl1","Csap1","Cs","Csad","Csdc2","Cse1l","Csde1","Csf2ra","Csf1r","Csf2rb","Csf2","Csf1","Csf3r","Csgalnact1","Csf3","Csgalnact2","Csk","Csmd1","Csn1s2a","Csn1s2b","Csmd2","Csn1s1","Csmd3","Csn2","Csn3","Csnk1g3","Csnk1e","Csnk1g1","Csnk1a1","Csnk1g2","Csnk1d","Csnk2a1","Csnka2ip","Csnk2a2","Csprs","Cspg5","Cspp1","Cspg4","Csnk2b","Csrnp1","Csrnp2","Csrnp3","Cst11","Csrp1","Cst12","Csrp2","Csrp3","Cst13","Cst5","Cst6","Cst8","Cst9l","Cst7","Csta","Cst3","Cstb","Cstl1","Cstf3","Cstf2t","Cstf2","Cstf1","Ct45a9","Ct55","Ctag2","Ctbs","Ctbp2","Ctc1","Ctbp1","Ctcf","Ctcfl","Ctdnep1","Ct47b1","Ctdsp2","Ctdp1","Ctdsp1","Ctdspl","Ctdspl2","Ctf2","Ctf1","Cthrc1","Ctif","Ctla2a","Cth","Ctnna1","Ctla4","Ctgf","Ctnnal1","Ctnna2","Ctnnbip1","Ctnna3","Ctnnbl1","Ctnnd2","Ctps1","Ctnnd1","Ctps2","Ctr9","Ctnnb1","Ctrb1","Ctrc","Cts8","Cts8l1","Ctrl","Cts7","Ctns","Ctsa","Ctsf","Ctse","Ctsg","Ctsc","Ctsd","Ctsh","Ctsb","Ctsj","Ctso","Ctsll3","Ctsm","Ctsk","Ctsq","Ctsr","Ctsql2","Ctsl","Ctsw","Ctss","Ctsz","Cttnbp2","Cttnbp2nl","Ctu1","Cttn","Ctu2","Ctxn3","Ctxn1","Cuedc1","Cuedc2","Ctxn2","Cubn","Cul2","Cul1","Cul4a","Cul3","Cul4b","Cul5","Cul7","Cutc","Cuta","Cul9","Cux2","Cwc15","Cuzd1","Cux1","Cwf19l1","Cwc25","Cwc22","Cwc27","Cwf19l2","Cwh43","Cx3cl1","Cxadrl1","Cxadr","Cx3cr1","Cxcl11","Cxcl1","Cxcl10","Cxcl13","Cxcl14","Cxcl16","Cxcl17","Cxcl12","Cxcl3","Cxcl2","Cxcl9","Cxcl6","Cxcr3","Cxcr6","Cxcr5","CXHXorf65","Cxcr4","Cxx1a","Cxcr1","Cxxc1","Cyb561","Cxxc5","Cyb561d1","Cxxc4","Cyb561a3","Cxcr2","Cyb5d1","Cyb561d2","Cyb5d2","Cyb5b","Cyb5r1","Cyb5a","Cyb5r2","Cyb5r3","Cyb5rl","Cybrd1","Cyc1-ps1","Cyb5r4","Cyc1","Cyba","Cybb","Cyct","Cycs","Cyfip2","Cygb","Cylc2","Cylc1","Cyhr1","Cyld-ps1","Cym","Cyld","Cyp11b1","Cyfip1","Cyp11b3","Cyp11b2","Cyp20a1","Cyp1a2","Cyp1b1","Cyp21a1","Cyp19a1","Cyp1a1","Cyp21a1-ps","Cyp26a1","Cyp24a1","Cyp26b1","Cyp26c1","Cyp27a1","Cyp27b1","Cyp2ab1","Cyp2a2","Cyp2ac1","Cyp2a1","Cyp2a3","Cyp2b13","Cyp2b12","Cyp2b1","Cyp2b15","Cyp2b21","Cyp2b2","Cyp2b31","Cyp17a1","Cyp2b3","Cyp2c11","Cyp2c12","Cyp2c22","Cyp2c13","Cyp2c23","Cyp2c24","Cyp2c77-ps","Cyp2c79","Cyp2c80","Cyp11a1","Cyp2c7","Cyp2c6v1","Cyp2d2","Cyp2d1","Cyp2d3","Cyp2d5","Cyp2g1","Cyp2f4","Cyp2d4","Cyp2j13","Cyp2e1","Cyp2j10","Cyp2j16","Cyp2j5-ps","Cyp2j3","Cyp2r1","Cyp2j4","Cyp2s1","Cyp2t1","Cyp2u1","Cyp2w1","Cyp39a1","Cyp3a62","Cyp3a18","Cyp3a2","Cyp3a71-ps","Cyp3a23/3a1","Cyp3a73","Cyp3a85-ps","Cyp46a1","Cyp4a34-ps","Cyp3a9","Cyp4a3","Cyp4a2","Cyp4b1","Cyp4a8","Cyp4a1","Cyp4f18","Cyp4f17","Cyp4f1","Cyp4f37","Cyp4f40","Cyp4f39","Cyp4f4","Cyp4f5","Cyp4x1","Cyp4f6","Cyp4v3","Cyp51a1-ps1","Cyp51","Cyp7a1","Cyp7b1","Cyp8b1","Cys1","Cysltr2","Cysrt1","Cyr61","Cystm1","Cyss","Cyth2","Cyth1","Cyth3","Cyth4","Cytip","Cytl1","Cyyr1","Da2-19","D2hgdh","Daam2","Daam1","Dab1","Cysltr1","Dab2","Dab2ip","Dach2","Dach1","Dact1","Dact2","Dact3","Dagla","Dalrd3","Dad1","Daglb","Dand5","Dag1","Dap","Dao","Dap3","Dapk2","Dapk1","Dapl1","Dapk3","Dapp1","Dars2","Daw1","Dars","Dazap2","Dazap1","Daxx","Dazl","Dbf4b","Dbf4","Dbil5","Dbh","Dbndd1","Dbndd2","Dbi","Dbn1","Dbnl","Dbp","Dancr","Dbr1","Dbt","Dbx1","Dbx2","Dcaf10","Dcaf1","Dcaf12","Dcaf11","Dcaf12l2","Dcaf12l1","Dcaf15","Dcaf13","Dcaf17","Dcaf4","Dcaf5","Dcaf8l1","Dcaf7","Dcaf8","Dcaf6","Dcakd","Dcbld1","Dcbld2","Dcdc1","Dcdc2b","Dcdc2","Dcdc5","Dchs2","Dcc","Dcdc2c","Dchs1","Dck","Dclre1b","Dclk3","Dclre1a","Dclre1c","Dclk2","Dcm5","Dclk1","Dcn","Dcp1b","Dcp2","Dcst1","Dcp1a","Dcstamp","Dcps","Dcst2","Dct","Dctn3l1","Dctn3","Dctd","Dctn5","Dctn2","Dctn4","Dctn1","Dctn6","Dctpp1","Dcun1d2","Dcun1d1","Dcun1d3","Dcun1d4","Dcun1d5","Dda1","Dcxr","Dcx","Ddah1","Ddah2","Ddb2","Ddb1","Ddhd1","Ddi1","Ddc","Ddhd2","Ddi2","Ddias","Ddit4","Ddit4l2","Ddit4l","Ddit3","Ddn","Ddo","Ddost","Ddrgk1","Ddt","Ddr2","Ddx1","Ddr1","Ddx10","Ddx11","Ddx17","Ddx18","Ddx20","Ddx19b","Ddx19a","Ddx23","Ddx24","Ddx21","Ddx25","Ddx3","Ddx27","Ddx28","Ddx31","Ddx39a","Ddx3y","Ddx39b","Ddx3x","Ddx4","Ddx41","Ddx42","Ddx43","Ddx46","Ddx47","Ddx49","Ddx51","Ddx50","Ddx5","Ddx54","Ddx52","Ddx55","Ddx56","Ddx58","Ddx59","Ddx60","Dear","Ddx6","Deaf1","Decr1","Dedd","Dedd2","Decr2","Def6","Defa10","Def8","Defa11","Defa24","Defa6","Defa7","Defa5","Defa9","Defa8","Defal1","Defb1","Defb10","Defb13","Defb12","Defb11","Defb16-ps","Defb14","Defb15","Defb17","Defb18","Defb19","Defb2","Defb20","Defb21","Defb23","Defb22","Defb24","Defb25","Defb26","Defb28","Defb27","Defb3","Defb29","Defb30","Defb36","Defb33","Defb37","Defb38","Defb39","Defb41","Defb40","Defb4","Defb43","Defb42","Defb44","Defb49","Defb5","Defb50","Defb51","Defb52","Defb9","Degs1","Degs2","Dek","Dennd1c","Dennd1b","Dennd1a","Dennd2a","Dennd2c","Dennd2d","Dennd3","Dennd4b","Dennd4c","Dennd4a","Dennd5a","Dennd5b","Dennd6a","Dennd6b","Denr","Depdc1","Depdc1b","Depdc7","Deptor","Depdc5","Dera","Derl1","Derl3","Det1","Desi1","Desi2","Des","Derl2","Deup1","Dexi","Dffa","Dffb","Dgat2l6","Dgat2","Dgat1","Dgcr2","Dgcr6","Dgcr8","Dgka","Dgke","Dgkb","Dgkd","Dgkg","Dgkh","Dgkk","Dgki","Dgkq","Dglucy","Dguok","Dgkz","Dhcr24","Dhdds","Dhdh","Dhcr7","Dhfr","Dhrs1","Dhh","Dhps","Dhodh","Dhrs11","Dhrs13","Dhrs2","Dhrs3","Dhrs7","Dhrs7c","Dhrs4","Dhrs7b","Dhrs7l1","Dhrs9","Dhrsx","Dhtkd1","Dhx15","Dhx29","Dhx16","Dhx32","Dhx33","Dhx34","Dhx30","Dhx35","Dhx37","Dhx57","Dhx36","Dhx38","Dhx58","Dhx40","Dhx8","Diablo","Dhx9","Diaph2","Diaph3","Diaph1","Dido1","Dicer1","Diexf","Dio3os","Dimt1","Dio1","Dio3","Dio2","Dip2a","Dip2b","Dip2c","Diras1","Diras2","Diras3","Dirc2","Dis3","Dis3l","Dis3l2","Disp1","Disc1","Disp2","Disp3","Dixdc1","Dkc1","Dkk2","Dkk1","Dkk4","Dkkl1","Dkk3","Dlat","Dleu7","Dlec1","Dld","Dlc1","Dlg3","Dlg1","Dlg2","Dlg5","Dlgap3","Dlgap2","Dlgap1","Dlgap4","Dlg4","Dlgap5","Dlk1","Dlk2","Dll3","Dll1","Dll4","Dlx1","Dlx3","Dlx2","Dlx4","Dlst","Dlx6","Dlx5","Dmac1","Dmac2","Dmbx1","Dmc1","Dmap1","Dmbt1","Dmkn","Dmgdh","Dmp1","Dmrt2","Dmrt1","Dmpk","Dmrt3","Dmrta1","Dmd","Dmrta2","Dmrtc1b","Dmrtb1","Dmrtc1a","Dmrtc1c1","Dmrtc2","Dna2","Dmtf1","Dmwd","Dmtn","Dmxl1","Dnaaf2","Dmxl2","Dnaaf1","Dnaaf3","Dnaaf5","Dnah10","Dnaaf4","Dnah14","Dnah1","Dnah11","Dnah12","Dnah3","Dnah17","Dnah5","Dnah6","Dnah2","Dnah8","Dnah7","Dnai1","Dnah9","Dnai2","Dnaja1","Dnaja2","Dnaja3","Dnaja4","Dnajb1","Dnajb11","Dnajb12","Dnajb13","Dnajb14","Dnajb3","Dnajb4","Dnajb2","Dnajb5","Dnajb7","Dnajb8","Dnajb6","Dnajb9","Dnajc1","Dnajc11","Dnajc10","Dnajc12","Dnajc15","Dnajc14","Dnajc13","Dnajc16","Dnajc17","Dnajc18","Dnajc19","Dnajc2","Dnajc22","Dnajc21","Dnajc24","Dnajc25","Dnajc28","Dnajc27","Dnajc30","Dnajc3","Dnajc4","Dnajc5b","Dnajc5","Dnajc5g","Dnajc7","Dnajc6","Dnajc9","Dnajc8","Dnal4","Dnal1","Dnali1","Dnase1","Dnase1l2","Dnase1l1","Dnase2","Dnase1l3","Dnd1","Dnase2b","Dner","Dnhd1","Dnlz","Dnmbp","Dnm1","Dnm3","Dnm2","Dnm1l","Dnmt3b-ps1","Dnmt3b","Dnmt3b-ps2","Dnpep","Dnmt3l","Dnmt1","Dnmt3a","Dnph1","Dnttip1","Dntt","Doc2a","Doc2g","Doc2b","Dock1","Dock10","Dock2-ps1","Dock2","Dnttip2","Dock11","Dock4","Dock3","Dock5","Dock6","Dohh","Dock7","Dock8","Dok1","Dok2","Dock9","Dok3","Dok4","Dok5","Dok6","Dok7","Dolk","Dolpp1","Donson","Dopey1","Dopey2","Doxl1","Dot1l","Dpagt1","Doxl2","Dpcd","Dpcr1","Dpep1","Dpep2","Dpep3","Dpf1","Dph1","Dph2","Dpf2","Dpf3","Dph3","Dph5","Dph6","Dph7","Dpm2","Dpm1","Dpm3-ps1","Dpm3","Dpp3l","Dpp3","Dpp7","Dpp9","Dpp10","Dpp8","Dppa1","Dpp4","Dpp6","Dppa1-ps1","Dppa3-ps2","Dppa3-ps1","Dppa3l1","Dppa3","Dppa4","Dppa5","Dpy19l1","Dpt","Dpy19l2","Dpy19l4","Dpy19l3","Dpy30","Dpys","Dpysl3","Dpysl2","Dpysl5","Dpysl4","Dqx1","Dr1","Dram1","Dram2","Draxin","Drap1","Drc3","Drc1","Drc7","Dpyd","Drg2","Drg1","Drgx","Drd3","Drd5","Drd4","Drd1","Drd2","Dsc1","Dsc3","Drosha","Dsc2","Drp2","Dscam","Dscaml1","Dscc1","Dscr3","Dsel","Dse","Dsg1","Dsg2","Dsg3","Dsg4","Dsn1","Dstnl1","Dsp","Dstn","Dspp","Dstyk","Dtd1","Dtd2","Dst","Dthd1","Dtl","Dtna","Dtnb","Dtnbp1","Dtwd1","Dtwd2","Dtx2-ps1","Dtx1","Dtx2","Dtx3","Dtx3l","Dtx4","Dtymk","Duoxa1","Duox1","Duox2","Duoxa2","Dupd1","Dus1l","Dus2","Dus4l","Dus3l","Dusp10","Dusp11","Dusp12","Dusp1","Dusp13","Dusp14l1","Dusp15","Dusp14","Dusp16","Dusp18","Dusp19","Dusp2","Dusp21","Dusp23","Dusp22","Dusp27","Dusp28","Dusp26","Dusp3","Dusp4","Dusp7","Dusp5","Dusp8","Dusp9","Dusp6","Dut-ps","Dut","Duxbl1","Dvl2","Dvl3","Dydc1","Dxo","Dydc2","Dvl1","Dym","Dynap","Dync1li1","Dync1li2","Dync1i1","Dync1i2","Dync1h1","Dync2li1","Dynll1","Dync2h1","Dynlrb1","Dynlrb2","Dynll2","Dynlt3","Dynlt1","Dyrk1b","Dyrk1a","Dyrk2","Dyrk3","Dyrk4","Dytn","Dzank1","Dysf","Dzip1-ps1","Dzip1","Dzip1l","E230034O05Rik","Dzip3","E2f2","E2f3","E2f1","E2f4","E2f5","E2f7","E2f8","E4f1","Eaf1","Eaf2","Eapp","Ear1","Ears2","Ears2l1","Ebag9","Ebf2","Ebf4","E2f6","Ebf1","Ebf3","Ebi3","Ebna1bp2","Ebpl","Ebp","Ece2","Ecd","Ecel1","Ech1","Echdc1","Ece1","Echdc2","Echdc3","Echs1","Eci1","Ecm1","Eci3","Eci2","Ecm2","Ecscr","Ecsit","Ect2l","Ect2","Edar","Eda","Eda2r","Edaradd","Edc3","Edc4","Eddm3b","Edem1","Edem3","Edem2","Edf1","Edil3","Edn3","Edn2","Edrf1","Eea1","Eed","Ednra","Eef1a2","Ednrb","Eef1akmt3","Eef1akmt2","Eef1a1","Eef1akmt1","Eef1b2","Edn1","Eef1e1","Eef1d","Eef1g","Eef2kmt","Eef2k","Eefsec","Eepd1","Eef2","Ef1","Efcab1","Efcab10","Efcab11","Efcab12","Efcab14","Efcab13","Efcab3","Efcab2","Efcab5","Efcab7","Efcab8","Efcab6","Efcab9","Efcc1","Efemp2","Efemp1","Efhb","Efhc1","Efhc2","Efhd1","Efhd2","Efl1","Efna2","Efna1","Efna3","Efna4","Efna5","Efnb2","Efnb1","Efnb3","Efr3a","Efr3b","Efs","Egfem1","Eftud2","Egfl6","Egfl7","Egf","Egfl8","Egflam","Egln2","Egln1","Egln3","Egr3","Egr2","Egr4","Ehbp1","Ehbp1l1","Ehd1","Egfr","Ehd2","Ehd3","Egr1","Ehf","Ehd4","Ehhadh","Ehmt1","Eid2","Ei24","Eid1","Eid2b","Eid3","Ehmt2","Eif1","Eif1ad","Eif1a","Eif1b","Eif1ax","Eif2a","Eif2ak1","Eif2b1","Eif2ak3","Eif2b2","Eif2ak4","Eif2b3","Eif2b4","Eif2ak2","Eif2b5","Eif2d-ps1","Eif2d","Eif2s2","Eif2s3y","Eif2s3","Eif2s1","Eif3a","Eif3b","Eif3c","Eif3d","Eif3e","Eif3f","Eif3el1","Eif3g","Eif3h","Eif3i-ps1","Eif3i","Eif3j","Eif3l","Eif3m","Eif3k","Eif4a1","Eif4b","Eif4a3","Eif4e1b","Eif4a2","Eif4e3","Eif4e","Eif4e2","Eif4ebp2","Eif4enif1","Eif4ebp1","Eif4g2-ps1","Eif4ebp3","Eif4g2-ps2","Eif4g1","Eif4g2","Eif4h","Eif4g3","Eif5a2","Eif5","Eif5b-ps1","Eif5a","Eif5b","Eif6","Eif6-ps1","Elac1","Eipr1","Elac2","Elane","Elavl1","Elavl3","Elavl4","Elavl2","Elf1","Elf3","Elf2","Elf4","Elfn2","Elf5","Elfn1","Elk1","Elk3","Elk4","Ell","Ell2","Ell3","Elmo1","Elmo2","Elmo3","Elmod2","Elmod1","Elmod3","Elmsan1","Eloa","Elob","Elof1","Eln","Elovl1","Elovl2","Eloc","Elovl3","Elovl4","Elovl5","Elovl7","Elovl6","Elp3","Elp2","Elp1","Elp4","Elp5","Elp6","Emb","Emc2","Emc1","Emc10","Emc3","Emc4","Emc6","Emc8","Emc7","Emc9","Emcn","Eme1","Emd","Eme2","Emg1","Emid1","Emilin3","Emilin1","Emilin2","Eml1","Eml2","Eml3","Eml4","Eml5","Emp1","Emp2","Emp3","Eml6","Emx1","Emsy","Emx2","En1","En2","Enam","Enah","Enc1","Endod1","Endog","Endou","Endov","Engase","Enkur","Enkd1","Eno1-ps1","Eng","Eno1","Eno4","Eno3","Eno2","Enoph1","Enox1","Enox2","Enpep","Enpp4","Enpp5","Enpp2","Enpp3","Enpp1","Enpp6","Enthd1","Enpp7","Ensa","Enho","Entpd2","Entpd1","Entpd3","Entpd4","Entpd6","Entpd5","Entpd7","Entpd8","Eny2","Eomes","Eogt","Epb41l1","Ep300","Ep400","Epas1","Epb41l4a","Epb41l2","Epb41","Epb41l3","Epc2l1","Epb41l5","Epc2","Epc1","Epb42","Epb41l4b","Epcam","Epdr1","Epgn","Epg5","Epha10","Epha1","Epha2","Epha3","Epha4","Epha5","Epha6","Epha8","Epha7","Ephb1","Ephb3","Ephb2","Ephb4","Ephb6","Ephx3","Ephx4","Ephx2","Epm2aip1","Epm2a","Epn1","Epn3","Epn2","Epop","Eppin","Eppk1","Epor","Epo","Eps15","Eprs","Ephx1","Eps15l1","Eps8","Eps8l1","Eps8l3","Eps8l2","Epx","Epsti1","Epyc","Eqtn","Eral1","Eras","Erap1","Erbin","Erc1","Erbb3","Erbb4","Erbb2","Erc2","Ercc4l1","Ercc4","Ercc3","Ercc5","Ercc6l","Ercc6l2","Ercc8","Ereg","Ercc2","Erf","Erfe","Ercc1","Erg28","Ergic1","Ercc6","Ergic2","Erg","Ergic3","Erh","Eri1","Eri2","Erich1","Erich3","Erich2","Eri3","Erich4","Erich5","Erich6b","Erich6","Erlec1","Erlin1","Erlin2","Ermap","Ermard","Ermn","Ermp1","Ern2","Ern1","Ero1b","Ero1a","Erp27","Erp44","Erp29","Ervfrd-1","Errfi1","Esco2-ps1","Esam","Esco2-ps2","Esco2","Esco1","Esd","Esm1","Espnl","Esf1","Espl1","Espn","Esrp1","Esrp2","Esrrb","Esrra","Ess2","Esx1","Esrrg","Esyt1","Esyt2","Esyt3","Etaa1","Esr2","Esr1","Etaa1l1","Etf1","Etfb","Etfa","Etfbkmt","Etfrf1","Ethe1","Etfdh","Etnk1","Etl4","Etnk2","Etnppl","Etv2","Ets2","Ets1","Etv1","Etv3","Etv3l","Etv5","Etv4","Eva1a","Eva1b","Etv6","Eva1c","Evc","Evc2","Evi2a","Evi5l","Evi5","Evl","Evpl","Evx1","Evx2","Evi2b","Ewsr1","Exd1","Exd2","Exoc1l","Exo1","Exo5","Exoc1","Exoc3l2","Exoc2","Exoc3","Exoc3l1","Exoc3l4","Exoc5","Exoc4","Exoc6","Exog","Exoc8","Exoc7","Exoc6b","Exosc1","Exosc2","Exosc10","Exosc3","Exosc6","Exosc5","Exosc7","Exosc4","Exosc8","Exph5","Exosc9","Ext2","Extl1","Ext1","Extl3","Extl2","Eya1","Eya2","Eya3","Eya4","Ezh1","F10","Ezr","Ezh2","F11","F11r","F12","F13b","F13a1","F2rl2","F2rl3","F2r","F2rl1","F2","F5","F8a1","F3","F7","Fa2h","F8","F9","Faah","Faap20","Faap100","Faap24","Fabp12","Fabp3","Fabp1","Fabp2","Fabp5","Fabp4","Fabp7","Fabp9","Fabp6","Fads1","Fads2","Fadd","Fads2l1","Fads6","Fads3","Faf1","Faf2","Fahd1","Fah","Fahd2a","Fam102a","Faim","Faim2","Fam102b","Fam103a1","Fam105a","Fam104a","Fam107a","Fam104b","Fam107b","Fam109a","Fam109b","Fam110a","Fam110d","Fam110b","Fam110c","Fam111a","Fam114a1l1","Fam114a1","Fam114a2","Fam115c","Fam115e","Fam117a","Fam117b","Fam118a","Fam118b","Fam120b","Fam120a","FAM120C","Fam122a","Fam122b","Fam122c","Fam124b","Fam124a","Fam126a","Fam126b","Fam129a","Fam129b","Fam131a","Fam129c","Fam133a","Fam131b","Fam131c","Fam133b","Fam135b","Fam135a","Fam136a","Fam13a","Fam13c","Fam149a","Fam13b","Fam149b1","Fam151b","Fam151a","Fam156b","Fam155b","Fam155a","Fam160a1","Fam160a2","Fam160b1","Fam160b2","Fam161b","Fam161a","Fam162a","Fam163a","Fam163b","Fam166b","Fam166a","Fam167a","Fam167b","Fam169a","Fam168a","Fam168b","Fam169b","Fam170a","Fam170b","Fam171a1","Fam173a","Fam171a2","Fam171b","Fam173b","Fam174a","Fam172a","Fam174b","Fam177a1","Fam177b","Fam180b","Fam180a","Fam178b","Fam181a","Fam181b","Fam183b","Fam184a","Fam184b","Fam185a","Fam186b","Fam187b","FAM187A","Fam188a","Fam188b","Fam188b2","Fam189a1","Fam189a2","Fam18b-ps1","Fam189b","Fam192a","Fam193b","Fam193a","Fam196b","Fam198a","Fam199x","Fam198b","Fam19a1","Fam19a3","Fam19a2","Fam19a4","Fam19a5","Fam204a","Fam205a","Fam205c","Fam206a","Fam196a","Fam207a","Fam208a","Fam209a","Fam208b","Fam20a","Fam20b","Fam210a","Fam212a","Fam20c","Fam210b","Fam212b","Fam213a","Fam213b","Fam216b","Fam214a","Fam217a","Fam214b","Fam216a","Fam217b","Fam219a","Fam219b","Fam220a","Fam222a","Fam221a","Fam221b","Fam222b","Fam227a","Fam227b","Fam228a","Fam229a","Fam234a","Fam229b","Fam228b","Fam234b","Fam237a","Fam241a","Fam241b","Fam24a","Fam25a","Fam32a","Fam3a","Fam35a","Fam3b","Fam3c","Fam3d","Fam43a","Fam43b","Fam45a","Fam46b","Fam46a","Fam46c","Fam47a","Fam47e","Fam46d","Fam48b1","Fam49a","Fam50a","Fam49b","Fam50b","Fam53a","Fam53b","Fam53c","Fam57a","FAM58A-ps1","Fam57b","Fam58b","Fam69a","Fam69c","Fam71a","Fam69b","Fam71b","Fam71d","Fam71e1","Fam71e2","Fam71f1","Fam71f2","Fam76a","Fam72a","Fam76b","Fam78a","Fam78b","Fam81a","Fam83a","Fam81b","Fam83c","Fam83b","Fam83d","Fam83e","Fam83f","Fam83g","Fam83h","Fam84b","Fam89a","Fam84a","Fam89b","Fam8a1","Fam90a1-ps1","Fam90a1","Fam92a","Fam92b","Fam91a1","Fam96b","Fam98a","Fam96a","Fam98b","Fam9b","Fam98c","Fam9c","Fan1","Fancb","Fanca","Fancd2os","Fancc","Fance","Fancd2","Fancf","Fancg","Fanci","Fancm","Fancl","Fank1","Fap","Far2","Far1","Farp1","Farsa","Fars2","Farp2","Farsb","Fastk","Fasn","Fastkd1","Fastkd2","Fastkd5","Fastkd3","Fas","Fat1","Fat2","Fat4","Fat3","Faxc","Fau","Faxdc2","Fblim1","Fbl","Fbll1","Faslg","Fbf1","Fbln2","Fbln1","Fbln7","Fbln5","Fbp2","Fbn2","Fbrs","Fbp1","Fbrsl1","Fbxl12","Fbn1","Fbxl14","Fbxl13","Fbxl15","Fbxl16","Fbxl17","Fbxl18","Fbxl19","Fbxl2","Fbxl20","Fbxl21","Fbxl22","Fbxl3","Fbxl5","Fbxl4","Fbxl6","Fbxl7","Fbxl8","Fbxo10","Fbxo11","Fbxo15","Fbxo16","Fbxo17","Fbxo18","Fbxo2","Fbxo22","Fbxo21","Fbxo25","Fbxo24","Fbxo27","Fbxo28","Fbxo3","Fbxo30","Fbxo31","Fbxo33","Fbxo32","Fbxo34","Fbxo36","Fbxo38","Fbxo4","Fbxo39","Fbxo40","Fbxo43","Fbxo41","Fbxo42","Fbxo44","Fbxo45","Fbxo47","Fbxo46","Fbxo48","Fbxo5","Fbxo6","Fbxo7","Fbxo8","Fbxw10","Fbxo9","Fbxw12","Fbxw17","Fbxw11","Fbxw2","Fbxw4","Fbxw5","Fbxw8","Fcamr","Fbxw9","Fbxw7","Fcar","Fcer1a","Fcgbp","Fcer1g","Fcf1","Fcgbpl1","Fcer2","Fcgr1a","Fcgr2a","Fcho1","Fcho2","Fcgr2b","Fcgrt","Fcgr3a","Fchsd1","Fchsd2","Fcmr","Fcnb","Fcna","Fcrl5","Fcrl2","Fcrl1","Fcrl6","Fcrla","Fcrlb","Fdcsp","Fdxacb1","Fdx1l","Fdx1","Fdft1","Fdps","Fdxr","Fem1a","Fendrr","Fem1b","Fem1c","Fech","Fen1","Fer1l4","Ferd3l","Fer","Fermt1","Fer1l6","Fer1l5","Fermt3","Fermt2","Fes","Fev","Fetub","Fezf1","Fezf2","Fez1","Fez2","Ffar1","Ffar2","Ffar3","Ffar4","Fgd2","Fgd3","Fgd1","Fgb","Fga","Fgd4","Fgd5","Fgd6","Fgf11","Fgf12","Fgf10","Fgf1","Fgf13","Fgf14","Fgf16","Fgf17","Fgf18","Fgf19","Fgf20","Fgf22","Fgf21","Fgf3","Fgf23","Fgf4","Fgf5","Fgf6","Fgf7","Fgf2","Fgfr1-ps1","Fgfbp1","Fgfbp3","Fgf8","Fgf9","Fgfr1op2","Fgfr1op","Fgfr1","Fgfrl1","Fgfr3","Fgfr4","Fgg","Fgl1","Fgfr2","Fggy","Fgl2","Fh","Fgr","Fhdc1","Fhad1","Fhit","Fhl1","Fhl3","Fhl4","Fhl2","Fhl5","Fibcd1","Fhod1","Fhod3","Fibcd1l1","Fibin","Fibp","Ficd","Figla","Fign","Fig4","Fignl2","Fignl1","Filip1","Filip1l","Fip1l1","Fitm1","Fitm2","Fjx1","Fiz1","Fis1","Fkbp10","Fkbp11","Fkbp14","Fkbp15","Fkbp3","Fkbp1b","Fkbp2","Fkbp1a","Fkbp4","Fkbp6","Fkbp5","Fkbp7","Fkbp9","Fkbp8","Fkbpl","Fkrp","Flad1","Flg","Flg2","Fktn","Flcn","Flii","Fli1","Flnc","Flna","Flrt1","Flnb","Flot1","Flrt3","Flrt2","Flot2","Flvcr1","Flt3lg","Flywch2","Flywch1","Flvcr2","Flt3","Flt4","Fmc1","Flt1","Fmn2","Fmn1","Fmnl2","Fmnl1","Fmnl3","Fmo1","Fmo13","Fmo2","Fmo3","Fmo4","Fmo6","Fmo5","Fmo9","Fmod","Fmr1nb","Fn3k","Fn3krp","Fmr1","Fnbp1","Fnbp4","Fnbp1l","Fnd3c2","Fndc1","Fndc10","Fndc11","Fn1","Fndc3b","Fndc3c1","Fndc3a","Fndc5","Fndc7","Fndc8","Fndc9","Fnip1","Fnip2","Fnta","Fntb","Folr2","Fopnl","Focad","Folh1","Folr1","Fosl1","Foxb1","Fosl2","Fosb","Foxb2","Fos","Foxd1","Foxc2","Foxc1","Foxd2","Foxa3","Foxd3","Foxa2","Foxa1","Foxd4","Foxe1","Foxe3","Foxf2","Foxf1","Foxi1","Foxh1","Foxg1","Foxi2","Foxi3","Foxj1","Foxj2","Foxk1","Foxj3","Foxl1","Foxk2","Foxl2","Foxm1","Foxn1","Foxn2","Foxn4","Foxn3","Foxo6","Foxo4","Foxo1","Foxo3","Foxp4","Foxp3","Foxq1","Foxr1","Foxred1","Foxr2","Foxred2","Foxs1","Fpgs","Fpgt","Fpr-rs3","Fpr-rs4","Fpr-rs6","Fpr1","Fpr2l","Fpr3","Fpr2","Fra10ac1","Foxp2","Foxp1","Frat1","Frat2","Fras1","Frg1l1","Frem2","Frem3","Frem1","Frg1","Frg2","Frmd1","Frk","Frmd4a","Frmd3","Frmd6","Frmd4b","Frmd5","Frmd7","Frmd8","Frmpd3","Frmpd2","Frmpd1","Frrs1l","Frrs1","Frmpd4","Frs3","Frs2","Fsbp","Fry","Frzb","Fscb","Fryl","Fscn1","Fscn2","Fscn3","Fsd1","Fsd1l","Fsd2","Fsip2","Fshb","Fsip1","Fsip2-ps1","Fshr","Fst","Fstl1","Fstl3","Fstl4","Fthl17c","Fstl5","Ftcd","Fthl17e","Ftl1l1","Ftmt","Fto","Ftsj1","Ftl1","Ftsj3","Fth1","Ftx","Fubp1","Fubp3","Fuca2","Fuk","Fundc1","Fundc2","Fuom","Fuca1","Fut1","Fus","Fut10","Fut11","Fut7","Fut4","Fut2","Fut9","Fut8","Fxc1-ps1","Fuz","Fv1","Fxr1","Fxn","Furin","Fxr2","Fxyd3","Fxyd4","Fxyd1","Fxyd5","Fxyd2","Fxyd7","Fxyd6","Fyb2","Fyco1","Fyb1","Fzd10","Fyttd1","Fzd1","Fzd2","Fyn","Fzd3","Fzd5","Fzd6","Fzd7","Fzd4","Fzd8","Fzd9","Fzr1","G0s2","G2e3","G4","G3bp1","G3bp2","G6pc2","G6pc","G7e-ps1","G6pc3","G8","Gab1","Gaa","Gab2","G6pd","Gabarap","Gabarapl1","Gabarapl2","Gabpa","Gabpb1","Gabpb1l","Gabbr2","Gabpb2","Gabbr1","Gabra2","Gabra1","Gabra4","Gabra3","Gabra6","Gabra5","Gabrb1","Gabrb2","Gabrb3","Gabrd","Gabre","Gabrg1","Gabrg3","Gabrg2","Gabrp","Gabrq","Gabrr1","Gabrr3","Gabrr2","Gad2","Gadd45b","Gadd45a","Gad1","Gadd45g","Gadl1","Gadd45gip1","Gak","Gal3st2","Gal3st3","Gal3st1","Gal3st4","Gal","Galc","Gale","Galk1","Galm","Galk2","Galns","Galnt1","Galnt10","Galnt11","Galnt12","Galnt15","Galnt14","Galnt16","Galnt13","Galnt17","Galnt18","Galnt3","Galnt2","Galnt4","Galnt5","Galnt6","Galnt7","Galnt9","Galntl5","Galp","Galntl6","Galr1","Galr3","Galr2","Gan","Gamt","Galt","Ganab","Ganc","Gapdh-ps1","Gapdh-ps2","Gapt","Gap43","Gapvd1","Gapdhs","Gar1","Garem1","Garem2","Gas1","Garnl3","Gapdh","Gars","Gart","Gas2","Gas2l1","Gas2l2","Gas5","Gas2l3","Gas8","Gast","Gas7","Gas6","Gata1","Gata2","Gata3","Gata5","Gatad1","Gatad2a","Gata6","Gata4","Gatad2b","Gatb","Gatc","Gatd1","Gba2","Gatm","Gba3","Gbe1","Gba","Gbgt1","Gbp1","Gbf1","Gbp3","Gbp2","Gbp4","Gbx1","Gbp6","Gbp5","Gbx2","Gca","Gcat","Gcc1","Gc","Gcc2","Gcdh","Gcfc2","Gcg","Gchfr","Gch1","Gcgr","Gckr","Gclm","Gclc","Gck","Gcm1","Gcm2","Gcn1l1","Gcnt1","Gcnt3","Gcnt2","Gcnt4","Gcnt6","Gcnt7","Gcsam","Gcsh","Gdap1l1","Gda","Gdap1","Gdap2","Gde1","Gdf1","Gdf10","Gdf11","Gdf15","Gdf2","Gdf3","Gdf5","Gdf6","Gdf7","Gdf9","Gdpd1","Gdi1","Gdpd3","Gdpd2","Gdi2","Gdpd4","Gdpd5","Gdpgp1","Gem","Gdnf","Gemin6","Gemin4","Gemin2","Gemin5","Gemin7","Gemin7l1","Gemin8","Gen1","Get4","Gfer","Gfi1","Gfi1b","Gfap","Gfm2","Gfm1","Gfod1","Gfod2","Gfpt1","Gfpt2","Gfra1","Gfy","Gfral","Gfra3","Gfra2","Gfra4","Gga1","Gga2","Ggact","Gga3","Ggn","Ggct","Ggh","Ggcx","Ggnbp1","Ggnbp2","Ggps1","Ggt6","Ggt5","Ggt7","Ggt1","Ggta1","Ggta1l1","Ghdc","Ghitm","Gh1","Ghrhr","Ghr","Ghrh","Ghsr","Gid4","Gid8","Ghrl","Gif","Gimap4","Gigyf1","Gigyf2","Gimap1","Gimap6","Gimap5","Gimap7","Gimd1","Gimap9","Gimap8","Gin1","Ginm1","Gins1","Gins2","Gins3","Gins4","Giot1","Gip","Gipc2","Gipc3","Gipc1","Gipr","Git1","Git2","Gja10","Gja3","Gja4","Gja6","Gja5","Gja8","Gjb1","Gjb4","Gjb5","Gjb2","Gjb6","Gjc1","Gjc2","Gjc3","Gja1","Gjd3","Gjd2","Gje1","Gjb3","Gjd4","Gk2","Gk5","Gk","Gkn1","Gkap1","Gkn3","Gkn2","Gla","Glb1l","Glb1l2","Glb1l3","Glcci1","Glce","Gldn","Gldc","Gle1-ps1","Gle1","Glg1","Gli1","Glb1","Gli2","Gli4","Glipr1","Glipr1l1","Gli3","Glipr1l2","Glis1","Glipr2","Glis3","Glis2","Glmp","Glmn","Glo1","Glod4","Glod5","Glp2r","Glp1r","Glra1","Glra2","Glra4","Glra3","Glrb","Glrx2","Glrx","Glrx5","Glt1d1","Glt6d1","Glrx3","Gls2","Gls","Glt8d1","Glt8d2","Gltp","Gltpd2","Glyatl1","Glyat","Glul","Glud1","Glyatl2","Glyctk","Glycam1","Glyatl3","Gm2a","Glyr1","Gm5471","Gmcl1l","Gmcl1","Gmds","Gmeb1","Gmeb2","Gmfg","Gmfb","Gmip","Gml","Gmnc","Gmppb","Gmnn","Gmppa","Gmpr","Gmpr2","Gna12","Gmps","Gna11","Gna14","Gna13","Gna15","Gnai1","Gnai3","Gnal","Gnai2","Gnao1","Gnat1","Gnaq","Gnat3","Gnat2","Gnaz","Gnas","Gnb1l","Gnb1","Gnb3","Gnb2","Gnb4","Gnb5","Gne","Gng11","Gng10","Gng13","Gng14","Gng12","Gng2","Gng3","Gng4","Gng7","Gng5","Gngt1","Gngt2","Gng8","Gnl1","Gnl3","Gnl2","Gnl3l","Gnpda1","Gnmt","Gnpda2","Gnpat","Gnpnat1","Gnptab","Gnptg","Golga1","Gns","Gnrhr","Gnrh1","Golga2","Golga3","Golga5","Golga4","Golga7b","Golga7","Golgb1","Golm1","Golim4","Golph3","Golph3l","Golt1a","Golt1b","Gon7","Gon4l","Gopc","Gorab","Gorasp2","Gorasp1","Gosr1","Gosr2","Got1l1","Got1","Gp1ba","Gp1bb","Got2","Gp2","Gp6","Gp5","Gp9","Gpalpp1","Gpa33","Gpaa1","Gpank1","Gpat2","Gpat3","Gpam","Gpat4","Gpatch11","Gpatch1","Gpatch2","Gpatch3","Gpatch2l","Gpatch4","Gpbar1","Gpatch8","Gpbp1l2","Gpbp1l1","Gpbp1","Gpc2","Gpc1","Gpc4","Gpc3","Gpc5","Gpcpd1","Gpd1l","Gpc6","Gpd1","Gpd2","Gpha2","Gphb5","Gper1","Gpihbp1","Gpkow","Gpi","Gphn","Gpld1","Gpn1","Gpm6b","Gpm6a","Gpn2","Gpn3","Gpr1","Gpr112l","Gpr101","Gpnmb","Gpr107","Gpr108","Gpr119","Gpr12","Gpr137","Gpr135","Gpr132","Gpr137b","Gpr141","Gpr137c","Gpr139","Gpr142","Gpr146","Gpr143","Gpr149","Gpr15","Gpr151","Gpr152","Gpr150","Gpr153","Gpr157","Gpr156","Gpr155","Gpr158","Gpr160","Gpr161","Gpr162","Gpr165","Gpr17","Gpr171","Gpr173","Gpr174","Gpr176","Gpr18","Gpr179","Gpr180","Gpr20","Gpr183","Gpr19","Gpr182","Gpr21","Gpr25","Gpr22","Gpr26","Gpr32","Gpr31","Gpr27","Gpr3","Gpr33","Gpr34","Gpr35","Gpr37l1","Gpr37","Gpr4","Gpr39","Gpr45","Gpr52","Gpr50","Gpr55","Gpr6","Gpr61","Gpr62","Gpr63","Gpr65","Gpr68","Gpr75","Gpr82","Gpr83","Gpr84","Gpr87","Gpr85","Gpr88","Gprasp1","Gpr89b","Gprasp2","Gprc5a","Gprc5b","Gprc5d","Gprc5c","Gprin1","Gprc6a","Gprin2","Gprin3","Gps2","Gps1","Gpsm2","Gpsm3","Gpsm1","Gpt","Gpt2","Gpx2-ps1","Gpx2-ps2","Gpx2","Gpx4-ps1","Gpx4-ps2","Gpx3","Gpx4-ps3","Gpx4","Gpx1","Gpx5","Gpx7","Gpx6","Gpx8","Gramd1a","Gramd1c","Gramd2","Gramd1b","Gramd3","Grap","Gramd4","Grap2","Grasp","Grb10","Grb14","Grb7","Greb1l","Greb1","Grcc10","Grb2","Grhl1","Grem1","Grem2","Grhl2","Grhl3","Grhpr","Grid1","Gria3","Gria4","Grid2ip","Grifin","Gria1","Grid2","Gria2","Grik3","Grik4","Grik1","Grik5","Grik2","Grin3a","Grin2c","Grin2d","Grin3b","Grina","Grin2a","Grin2b","Grin1","Grip2","Gripap1","Grk1","Grip1","Grk4","Grk3","Grk2","Grlf1-ps1","Grk5","Grk6","Grm2","Grm4","Grm3","Grm1","Grm6","Grm5","Grm7","Grm8","Grn","Grpel1","Grp","Grpel2","Grpr","Grsf1","Grwd1","Grxcr1","Grxcr2","Grtp1","Gsc","Gsap","Gsc2","Gsdmc","Gsdma","Gsdmd","Gsdme","Gsg1","Gsg1l2","Gse1","Gsg1l","Gskip","Gsk3a","Gspt2","Gspt1","Gsn","Gss","Gsr","Gsta2","Gsta5","Gsta1","Gsta3","Gsta4","Gstcd","Gsk3b","Gstk1","Gstm3","Gstm3l","Gstm4","Gstm5","Gstm6","Gstm2","Gstm6l","Gstm7","Gstp-ps1","Gsto1","Gsto2","Gstm1","Gstt3","Gstt2","Gstt4","Gsx1","Gstt1","Gstz1","Gstp1","Gsx2","Gtdc1","Gtf2a1","Gtf2a1l","Gtf2a2","Gtf2e1","Gtf2b","Gtf2e2","Gtf2f1","Gtf2f2","Gtf2h1","Gtf2h2","Gtf2h3","Gtf2h4","Gtf2h5","Gtf2i","Gtf2ird2","Gtf3a","Gtf3c1","Gtf2ird1","Gtf3c2","Gtf3c4","Gtf3c3","Gtf3c5","Gtf3c6","Gtpbp1","Gtpbp10","Gtpbp2","Gtpbp3","Gtpbp6","Gtpbp8","Gtpbp4","Gtse1","Gtsf1","Gtsf1l","Guca1a","Guca1b","Guca2a","Gucd1","Guca2b","Gucy1a2","Gucy1a3","Gucy2d","Gucy1b2","Gucy2c","Gucy1b3","Gucy2e","Gucy2f","Gucy2g","Guk1","Guf1","Gulo","Gulp1","Gvin1","Gusb","Gvinp1","Gxylt1","Gxylt2","Gykl1","Gyg1","Gypa","Gypc","Gys1","Gys2","Gzf1","Gzma","Gzmbl1","Gzmbl3","Gzmbl2","Gzmb","Gzmf","Gzmc","Gzmk","Gzmm","Gzmn","H1fnt","H1foo","H1f0","H19","H2afb3","H1fx","H2afj","H2afv","H2afy","H2afy2","H2afx","H2afz","H3f3c","H3f3a","H3f3b","H6pd","Habp4","Habp2","Haao","Hacd1","Hacd2","Hacd3","Hacd4","Hace1","Hacl1","Hadh","Hadhb","Hadha","Hagh","Haghl","Hal","Hand1","Hand2","Hao1","Hamp","Hao2","Hap1","Hapln1","Hapln2","Hapln3","Harbi1","Hapln4","Hars","Hars2","Has1","Has2","Has3","Haspin","Hat1","Haus2","Haus1","Haus3","Haus4","Haus5","Haus8-ps1","Haus7","Haus8","Hax1","Havcr2","Havcr1","Hba-a2","Hba-a3","Hba-a1","Hbb-b1","Hbe2","Hbe1","Hbegf","Hbq1","Hbg1","Hbq1b","Hbp1","Hbz","Hbs1l","Hbb","Hcar1","Hcar2","Hccs","Hcfc1r1","Hcfc1","Hcfc2","Hcls1","Hck","Hcn3","Hcn2","Hcn1","Hcn4","Hcst","Hcrtr2","Hcrtr1","Hcrt","Hdac11","Hdac10","Hdac1l","Hdac1","Hdac2","Hdac3","Hdac4","Hdac5","Hdac7","Hdac6","Hdac8","Hddc2","Hddc3","Hdc","Hdac9","Hdgfl1","Hdgf","Hdgfl3","Hdgfl2","Hdhd3","Hdhd2","Hdhd5","Hdx","Heatr1l1","Hdlbp","Heatr3","Heatr4","Heatr5a","Heatr5b","Heatr6","Heatr9","Hebp2","Hebp1","Heatr1","Heca","Hectd3","Hectd2","Hecw2","Hectd1","Hecw1","Hectd4","Helb","Heg1","Hells","Helq","Helz2","Helt","Helz","Hemgn","Hemk1","Henmt1","Hepacam","Hepacam2","Hephl1","Heph","Herc3","Herc1","Herc6","Herc2","Herc4","Herpud2","Herpud1","Hes2","Hes3","Hes5","Hes1","Hes6","Hes7","Hesx1","Hexa","Hexim1","Hexdc","Hexb","Hey1","Hexim2","Hey2","Heyl","Hfe2","Hgd","Hfm1","Hfe","Hgh1","Hgfac","Hgs","Hgsnat","Hhat","Hhex","Hhatl","Hgf","Hhipl1","Hhip","Hhipl2","Hhla2","Hiatl3","Hic1","Hibadh","Hibch","Hid1","Hic2","Higd1c","Hif1an","Higd1a","Higd1b","Hif3a","Higd2a","Hiat1-ps1","Higd2al1","Hilpda","Hils1","Hikeshi","Hint1","Hinfp","Hint1-ps1","Hint2","Hint3","Hipk2","Hip1r","Hipk1","Hip1","Hipk4","Hipk3","Hira","Hirip3","Hist1h1a","Hist1h1b","Hist1h1d","Hist1h1c","Hist1h1e","Hist1h1t","Hist1h2ac","Hist1h2af","Hist1h2aa","Hist1h2ah","Hist1h2ai","Hist1h2ail1","Hif1a","Hist1h2ak","hist1h2ail2","Hist1h2an","Hist1h2ba","Hist1h2bcl1","Hist1h2bd","Hist1h2ao","Hist1h2bg","Hist1h2bh","Hist1h2bk","Hist1h2bl","Hist1h2bo","Hist1h2bq","Hist1h3b","Hist1h3a","Hist1h4a","Hist2h2aa2","Hist1h4m","Hist1h4b","Hist2h2aa3","Hist2h2bb","Hist2h2ab","Hist2h2ac","Hist2h2be","Hist2h3c2","Hist2h4a","Hist2h4","Hist3h2ba","Hist3h2a","Hist3h2bb","Hist3h3","Hist4h4","Hivep1","Hivep3","Hjurp","Hivep2","Hk1","Hk2","Hk3","Hkdc1","Hlcs","Hlf","Hltf","Hlx","Hm13","Hmbox1","Hmbs","Hmces","Hmcn1","Hmcn2","Hmg1l1","Hmg20a","Hmg20b","Hmga1","Hmga2","Hmgb1","Hmgb1-ps1","Hmgb1-ps2","Hmgb1-ps3","Hmgb1-ps4","Hmgb2","Hmgb2l1","Hmgb3","Hmgb4","Hmgcl","Hmgcll1","Hmgcr","Hmgcs1","Hmgcs2","Hmgn1","Hmgn2","Hmgn3","Hmgn4","Hmgn5","Hmgn5b","Hmgxb3","Hmgxb4","Hmmr","Hmox1","Hmox2","Hmox2-ps1","Hmx1","Hmx2","Hmx3","Hnf1a","Hnf1b","Hnf4a","Hnf4g","Hnmt","Hnrnpa0","Hnrnpa1","Hnrnpa1-ps1","Hnrnpa2b1","Hnrnpa3","Hnrnpa3-ps1","Hnrnpab","Hnrnpc","Hnrnpd","Hnrnpdl","Hnrnpf","Hnrnph1","Hnrnph2","Hnrnph3","Hnrnpk","Hnrnpl","Hnrnpll","Hnrnpm","Hnrnpr","Hnrnpu","Hnrnpul1","Hnrnpul2","Hoga1","Homer1","Homer2","Homer3","Homez","Hook1","Hook2","Hook3","Hopx","Hormad1","Hormad2","Hotairm1","Hoxa1","Hoxa10","Hoxa11","Hoxa11-as","Hoxa13","Hoxa2","Hoxa3","Hoxa4","Hoxa5","Hoxa6","Hoxa7","Hoxa9","Hoxaas3","Hoxb1","Hoxb13","Hoxb2","Hoxb3","Hoxb4","Hoxb5","Hoxb5os","Hoxb6","Hoxb7","Hoxb8","Hoxb9","Hoxc10","Hoxc11","Hoxc12","Hoxc13","Hoxc4","Hoxc5","Hoxc6","Hoxc8","Hoxc9","Hoxd1","Hoxd10","Hoxd11","Hoxd12","Hoxd13","Hoxd3","Hoxd4","Hoxd8","Hoxd9","Hp","Hp1bp3","Hpca","Hpcal1","Hpcal4","Hpd","Hpdl","Hpf1","Hpgd","Hpgds","Hpn","Hprt1","Hps1","Hps3","Hps4","Hps5","Hps6","Hpse","Hpse2","Hpx","Hr","Hras","Hrasls","Hrasls5","Hrc","Hrct1","Hrg","Hrh1","Hrh2","Hrh3","Hrh4","Hrk","Hrnr","Hs1bp3","Hs2st1","Hs3st1","Hs3st2","Hs3st3a1","Hs3st3b1","Hs3st4","Hs3st5","Hs3st6","Hs6st1","Hs6st2","Hs6st3","Hsbp1","Hsbp1l1","Hsc70-ps1","Hsc70-ps2","Hscb","Hsd11b1","Hsd11b2","Hsd17b1","Hsd17b10","Hsd17b11","Hsd17b12","Hsd17b13","Hsd17b14","Hsd17b2","Hsd17b3","Hsd17b4","Hsd17b6","Hsd17b7","Hsd17b8","Hsd3b1","Hsd3b2","Hsd3b3","Hsd3b5","Hsd3b7","Hsdl1","Hsdl2","Hsf1","Hsf2","Hsf2bp","Hsf4","Hsf5","Hsfy2","Hsh2d","Hsp90aa1","Hsp90ab1","Hsp90b1","Hspa12a","Hspa12b","Hspa13","Hspa14","Hspa1a","Hspa1b","Hspa1l","Hspa2","Hspa4","Hspa4l","Hspa5","Hspa8","Hspa8-ps1","Hspa9","Hspb1","Hspb11","Hspb2","Hspb3","Hspb6","Hspb7","Hspb8","Hspb9","Hspbap1","Hspbp1","Hspd1","Hspd1-ps1","Hspd1-ps10","Hspd1-ps11","Hspd1-ps12","Hspd1-ps13","Hspd1-ps14","Hspd1-ps15","Hspd1-ps16","Hspd1-ps17","Hspd1-ps18","Hspd1-ps19","Hspd1-ps2","Hspd1-ps20","Hspd1-ps21","Hspd1-ps22","Hspd1-ps23","Hspd1-ps25","Hspd1-ps26","Hspd1-ps27","Hspd1-ps28","Hspd1-ps29","Hspd1-ps3","Hspd1-ps31","Hspd1-ps32","Hspd1-ps4","Hspd1-ps5","Hspd1-ps6","Hspd1-ps7","Hspd1-ps8","Hspd1-ps9","Hspe1","Hspg2","Hsph1","Htatip2","Htatsf1","Htr1a","Htr1b","Htr1d","Htr1f","Htr2a","Htr2b","Htr2c","Htr3a","Htr3b","Htr4","Htr5a","Htr5b","Htr6","Htr7","Htra1","Htra2","Htra3","Htra4","Htt","Hunk","Hus1","Hus1b","Huwe1","Hvcn1","Hyal1","Hyal2","Hyal3","Hyal4","Hyal5","Hyal6","Hydin","Hyi","Hykk","Hyls1","Hyou1","Hypk","Hypm","Iah1","Iapp","Iars","Iars2","Iba57","Ibsp","Ibtk","Ica1","Ica1l","Icam1","Icam2","Icam4","Icam5","Ice1","Ice2","Ick","Icmt","Icos","Icoslg","Id1","Id2","Id3","Id4","Ide","Idh1","Idh2","Idh3a","Idh3B","Idh3g","Idi1","Idi2","Idnk","Ido1","Ido2","Ids","Idua","Ier2","Ier3","Ier3ip1","Ier5","Ier5l","Iffo1","Iffo2","Ifi203-ps1","Ifi27","Ifi27l2b","Ifi30","Ifi35","Ifi44","Ifi44l","Ifi47","Ifih1","Ifit1","Ifit1bl","Ifit2","Ifit3","Ifitm1","Ifitm10","Ifitm2","Ifitm3","Ifitm5","Ifitm6","Ifitm7","Ifna1","Ifna11","Ifna16l1","Ifna2","Ifna4","Ifna5","Ifnar1","Ifnar2","Ifnb1","Ifne","Ifng","Ifngr1","Ifngr2","Ifnk","Ifnl1","Ifnl3","Ifnlr1","Ifrd1","Ifrd2","Ift122","Ift140","Ift172","Ift20","Ift22","Ift27","Ift43","Ift46","Ift52","Ift57","Ift74","Ift80","Ift81","Ift88","Igbp1","Igbp1b","Igdcc3","Igdcc4","Igf1","Igf1r","Igf2","Igf2bp1","Igf2bp2","Igf2bp3","Igf2r","Igfals","Igfbp1","Igfbp2","Igfbp3","Igfbp4","Igfbp5","Igfbp6","Igfbp7","Igfbpl1","Igfl3","Igflr1","Igfn1","IgG-2a","Igh-6","Ighe","Ighg1","Ighmbp2","Ighv","Igip","Igkc","Igkv28","Igl","Igll1","Iglon5","Igsf1","Igsf10","Igsf11","Igsf21","Igsf22","Igsf23","Igsf3","Igsf5","Igsf6","Igsf7","Igsf8","Igsf9","Igsf9b","Igtp","Ihh","Ik","Ikbip","Ikbkb","Ikbke","Ikbkg","Ikzf1","Ikzf2","Ikzf3","Ikzf4","Ikzf5","Il10","Il10ra","Il10rb","Il11","Il11ra1","Il12a","Il12b","Il12rb1","Il12rb2","Il13","Il13ra1","Il13ra2","Il15","Il15ra","Il16","Il17a","Il17b","Il17c","Il17d","Il17f","Il17ra","Il17rb","Il17rc","Il17rd","Il17re","Il18","Il18bp","Il18r1","Il18rap","Il19","Il1a","Il1b","Il1f10","Il1r1","Il1r2","Il1rap","Il1rapl1","Il1rapl2","Il1rl1","Il1rl2","Il1rn","Il2","Il20","Il20ra","Il20rb","Il21","Il21r","Il22","Il22ra1","Il22ra2","Il23a","Il23r","Il24","Il25","Il27","Il27ra","Il2ra","Il2rb","Il2rg","Il3","Il31","Il31ra","Il33","Il34","Il36a","Il36b","Il36g","Il36rn","Il3ra","Il4","Il4i1","Il4r","Il5","Il5ra","Il6","Il6r","Il6st","Il7","Il7r","Il9","Il9r","Ildr1","Ildr2","Ilf2","Ilf3","Ilk","Ilkap","Ilvbl","Immp1l","Immp2l","Immt","Imp3","Imp4","Impa1","Impa2","Impact","Impad1","Impdh1","Impdh2","Impg1","Impg2","Ina","Inafm1","Inafm2","Inca1","Incenp","Inf2","Ing1","Ing2","Ing3","Ing4","Ing5","Inha","Inhba","Inhbb","Inhbc","Inhbe","Inip","Inmt","Ino80","Ino80b","Ino80c","Ino80d","Ino80e","Inpp1","Inpp4a","Inpp4b","Inpp5a","Inpp5b","Inpp5d","Inpp5e","Inpp5f","Inpp5j","Inpp5k","Inppl1","Ins1","Ins2","Insc","Insig1","Insig2","Insl3","Insl5","Insl6","Insm1","Insm2","Insr","Insrr","Ints1","Ints10","Ints11","Ints12","Ints13","Ints14","Ints2","Ints3","Ints4","Ints5","Ints6","Ints6l","Ints7","Ints8","Ints9","Intu","Invs","Ip6k1","Ip6k2","Ip6k3","Ipcef1","Ipmk","Ipo11","Ipo13","Ipo4","Ipo5","Ipo7","Ipo9","Ipp","Ippk","Iqank1","Iqca1","Iqca1l","Iqcb1","Iqcc","Iqcd","Iqce","Iqcf1","Iqcf3","Iqcf5","Iqcf6","Iqcg","Iqch","Iqck","Iqgap1","Iqgap2","Iqgap3","Iqsec1","Iqsec2","Iqsec3","Iqub","Irak1","Irak1bp1","Irak2","Irak3","Irak4","Ireb2","Irf1","Irf2","Irf2bp1","Irf2bp2","Irf2bpl","Irf3","Irf4","Irf5","Irf6","Irf7","Irf8","Irf9","Irgc","Irgm","Irgm2","Irgq","Irs1","Irs2","Irs3","Irs4","Irx1","Irx2","Irx3","Irx4","Irx5","Irx6","Isca1","Isca1-ps1","Isca2","Isca2-ps1","Iscu","Isg15","Isg20","Isg20l2","Isl1","Isl2","Islr","Islr2","Ism1","Ism2","Isoc1","Isoc2b","Ispd","Ist1","Isx","Isy1","Isyna1","Itch","Itfg1","Itfg2","Itga1","Itga10","Itga11","Itga2","Itga2b","Itga3","Itga4","Itga5","Itga6","Itga7","Itga8","Itga9","Itgad","Itgae","Itgal","Itgam","Itgav","Itgax","Itgb1","Itgb1bp1","Itgb1bp2","Itgb2","Itgb3","Itgb3bp","Itgb4","Itgb5","Itgb6","Itgb7","Itgb8","Itgbl1","Itih1","Itih2","Itih3","Itih4","Itih6","Itm2a","Itk","Itln1","Itm2c","Itm2b","Itpka","Itpkc","Itpk1","Itpa","Itpkb","Itpr2","Itpripl2","Itpripl1","Itpr1","Ivd","Itsn2","Itsn1","Itpr3","Ivl","Ivns1abp","Iws1","Iyd","Izumo2","Izumo1r","Izumo3","Izumo1","Izumo4","Jade2","Jade1","Jade3","Jagn1","Jag2","Jag1","Jak1","Jakmip2","Jakmip1","Jak3","Jam2","Jakmip3","Jam3","Jaml","Jak2","Jazf1","Jarid2","Jcad","Jchain","Jdp2","Jhy","Jkamp","Jmjd4","Jmjd1c","Jmjd6","Jmjd8","Jmy","Josd1","Josd2","Jph1","Jmjd7","Jph3","Jph2","Jph4","Jpt1","Jpx","Jpt2","Jrk","Jrkl","Jsrp1","Jtb","Junb","Ka11","Jund","Jup","Kank2","Kank1","Jun","Kank4","Kank3","Kalrn","Kansl1","Kansl1l","Kantr","Kansl2","Kansl3","Kap","Kat14","Kars","Kat2b","Kat2a","Kat6b","Kat7","Kat5","Kat6a","Kat8","Katna1","Katnal1","Katnal2","Katnbl1","Katnb1","Kazald1","Kazn","Kb15","Kb23","Kbtbd12","Kbtbd11","Kbtbd13","Kbtbd2","Kbtbd3","Kbtbd4","Kbtbd6","Kbtbd7","Kbtbd8","Kcmf1","Kcna10","Kcna1","Kcna3","Kcna2","Kcna4","Kcna5","Kcna6","Kcna7","Kcnab1","Kcnab2","Kcnab3","Kcnb2","Kcnc1","Kcnb1","Kcnc3","Kcnc2","Kcnd1","Kcnc4","Kcnd2","Kcne2","Kcne3","Kcne4","Kcne1","Kcnd3","Kcnf1","Kcne5","Kcng1","Kcng3","Kcng4","Kcng2","Kcnh4","Kcnh3","Kcnh2","Kcnh1","Kcnh5","Kcnh6","Kcnh7","Kcnh8","Kcnip1","Kcnip3","Kcnip2","Kcnip4","Kcnj10","Kcnj1","Kcnj13","Kcnj12","Kcnj14","Kcnj16","Kcnj15","Kcnj11","Kcnj2","Kcnj4","Kcnj3","Kcnj5","Kcnj9","Kcnk1","Kcnj8","Kcnj6","Kcnk12","Kcnk10","Kcnk13","Kcnk15","Kcnk16","Kcnk18","Kcnk3","Kcnk4","Kcnk2","Kcnk7","Kcnk5","Kcnk6","Kcnk9","Kcnmb3","Kcnmb1","Kcnmb2","Kcnmb4","Kcnn1","Kcnn2","Kcnma1","Kcnn3","Kcnq4","Kcnrg","Kcnn4","Kcnq3","Kcnq2","Kcnq5","Kcnq1","Kcns1","Kcns2","Kcns3","Kcnv1","Kcnv2","Kcnt1","Kcnt2","Kcnu1","Kcp","Kctd10","Kctd11","Kctd1","Kctd12","Kctd14","Kctd13","Kctd15","Kctd16","Kctd2","Kctd19","Kctd17","Kctd20","Kctd18","Kctd21","Kctd4","Kctd3","Kctd5","Kctd7","Kctd6","Kctd8","Kctd9","Kdelc1","Kdelr1","Kdelc2","Kdf1","Kdelr3","Kdelr2","Kdm1b","Kdm1a","Kdm2a","Kdm2b","Kdm3a","Kdm3b","Kdm4a","Kdm4b","Kdm4dl2","Kdm4e","Kdm4d","Kdm4c","Kdm5a","Kdm7a","Kdm5c","Kdm5d","Kdm5b","Kdm6a","Kdm8","Kdm6b","Kdsr","Kel","Khdc1","Kera","Khdc1b","Khdc3","Keap1","Khdc4","Khps1a","Khdrbs2","Khnyn","Khdrbs3","Khk","Kdr","Khdrbs1","Kiaa1671","Khsrp","Kiaa0408L","Kif11","Kif12","Kif13a","Kidins220","Kif13b","Kif14","Kif15","Kif16b","Kif17","Kif18a","Kif18b","Kif19","Kif1a","Kif1bp","Kif1c","Kif20a","Kif1b","Kif20b","Kif21b","Kif21a","Kif22","Kif23","Kif24","Kif26a","Kif26b","Kif27","Kif28p","Kif2a","Kif2b","Kif3b","Kif2c","Kif3c","Kif4b","Kif4a","Kif3a","Kif5b","Kif5a","Kif6","Kif7","Kif5c","Kif9","Kifap3","Kifc1","Kin","Kir3dl1","Kifc2","Kirrel2","Kifc3","Kirrel1","Kirrel3","Kiss1","Kiz","Kiss1r","Klb","Kitlg","Kl","Klc1","Klc2","Kit","Klc3","Klf1","Klc4","Klf10","Klf11","Klf13","Klf12","Klf14","Klf17","Klf15","Klf16","Klf2","Klf5-ps1","Klf3","Klf4","Klf5","Klf5-ps2","Klf7","Klf6","Klf8","Klf9","Klhdc1","Klhdc2","Klhdc10","Klhdc3","Klhdc4","Klhdc7a","Klhdc7b","Klhdc8b","Klhdc8a","Klhdc9","Klhl1","Klhl11","Klhl10","Klhl12","Klhl14","Klhl13","Klhl15","Klhl17","Klhl18","Klhl2","Klhl20","Klhl21","Klhl22","Klhl23","Klhl24","Klhl25","Klhl28","Klhl26","Klhl29","Klhl3","Klhl31","Klhl33","Klhl32","Klhl30","Klhl34","Klhl35","Klhl36","Klhl4","Klhl40","Klhl38","Klhl42","Klhl41","Klhl5","Klhl6","Klhl7","Klhl9","Klhl8","Klk11","Klk12","Klk10","Klk13","Klk1","Klk14","Klk15","Klk1c10","Klk1c4","Klk1b3","Klk1c3","Klk1c12","Klk1c2","Klk1c6","Klk1c8","Klk5","Klk5l","Klk4","Klk1c9","Klk6","Klk7","Klk9","Klk8","Klra2","Klra1","Klkb1","Klra22","Klra5","Klrb1","Klrb1a","Klrb1b","Klrc2","Klrc1","Klrb1c","Klrc3","Klrd1","Klln","Klre1","Klrg1","Klrh1","Klri1","Klrg2","Klri2","Kmo","Kmt2a","Kmt2c","Kmt2e","Kmt2b","Kmt5b","Kmt5a","Kmt2d","Kndc1","Kncn","Kmt5c","Klrk1","Kng2l1","Kng1","Knl1","Knop1","Kng2","Knstrn","Kntc1","Kpna1","Kpna3","Kpna4","Kpna2","Kpna5","Kpna6","Kpna7","Kprp","Kpnb1","Kptn","Kremen1","Krba1","Kremen2","Kras","Krcc1","Krr1","Kri1","Krit1","Krt1","Krt10","Krt12","Krt15","Krt16","Krt18","Krt13","Krt17","Krt2","Krt19","Krt14","Krt20","Krt222","Krt23","Krt24","Krt27","Krt28","Krt26","Krt25","Krt31","Krt32","Krt33a","Krt33b","Krt35","Krt34","Krt39","Krt36","Krt42","Krt40","Krt4","Krt71","Krt72","Krt5","Krt7","Krt73","Krt76","Krt75","Krt77","Krt79","Krt80","Krt78","Krt81","Krt8","Krt82","Krt83","Krt84","Krt85","Krtap1-1","Krt9","Krt86","Krtap1-3","Krtap1-5","Krtap11-1","Krtap12-2","Krtap13-1","Krtap13-2","Krtap15-1","Krtap14","Krtap14l","Krtap16-1","Krtap16-5","Krtap17-1","Krtap19-5","Krtap20l3","Krtap2-1","Krtap2-4l","Krtap2-4","Krtap24-1","Krtap26-1","Krtap22-2","Krtap27-1","Krtap3-1","Krtap3-3","Krtap4-7","Krtap31-1","Krtap5-1","Krtap3-2","Krtap4-3","Krtap7-1","Krtap8-1","Krtap29-1","Krtcap2","Krtdap","Krtap9-1","Krtcap3","Ksr1","Kti12","Kxd1","Ksr2","Kyat3","Ky","Kyat1","Ktn1","Kynu","L1td1","L2hgdh","L3hypdh","L3mbtl2","L3mbtl4","L1cam","L3mbtl1","L3mbtl3","Lacc1","Lactb","Lactb2","Lad1-ps1","Lad1","Lair1","Lage3","Lag3","Lalba","Lama2","Lama3","Lama1","Lama4","Lamb3","Lamb1","Lamb2","Lama5","Lamc1","Lamc3","Lamc2","Lamp1","Lamp3","Lamp2","Lamp5","Lamtor1","Lamtor2","Lamtor4","Lamtor3","Lamtor5","Lancl3","Lao1","Lancl1","Lancl2","Lap3","Laptm4a","Laptm4b","Laptm5","Large2","Larp1","Large1","Larp1b","Larp4","Larp6","Larp4b","Larp7","Las1l","Lars","Lasp1","Lars2","Lat","Lats1","Lat2","Lats2","Lax1","Lbh","Layn","Lbp","Lbr","Lbx2","Lbx1","Lce1c","Lca5l","Lca5","Lce1d","Lcat","Lce1f","Lce1m","Lce1l","Lce3d","Lce3e","Lce6a","Lclat1","Lcmt1","Lcmt2","Lcn1","Lcn10","Lck","Lcn11","Lcn12","Lcn15l1","Lcn3","Lcn4","Lcn6","Lcn5","Lcn8","Lcn2","Lcn9","Lcor","Lcorl","Lctl","Lcp2","Lcp1","Lct","Ldah","Ldb1","Ldb2","Ldhal6b","Ldhd","Ldhb","Ldhc","Ldha","Ldlrad1","Ldlr","Ldlrad2","Leap2","Ldb3","Ldlrad3","Ldoc1","Ldlrad4","Ldlrap1","Lect2","Lelp1","Lemd1","Lefty1","Lekr1","Lefty2","Lemd2","Lef1","Lemd3","Lenep","Leng1","Leng8","Leo1","Leprotl1","Leprot","Letm2","Letm1","Leng9","Letmd1","Lepr","Lexm","Lfng","Lgals2","Lgals12","Lgals1","Lep","Lgals3bp","Lgals4","Lgals5","Lgals7","Lgals3","Lgals8","Lgalsl","Lgals9","Lgi1","Lgi2","Lgi3","Lgi4","Lgmn","Lgr4","Lgr6","Lgr5","Lgsn","Lhb","Lhfpl1","Lhfpl3","Lhfpl2","Lhfpl5","Lhfpl4","Lhcgr","Lhfpl6","Lhx1","Lhpp","Lhx2","Lhx4","Lhx5","Lhx3","Lhx6","Lhx8","Lhx9","Lias","Lif","Lifr","Lig1","Lig3","Lig4","Lilra5","Lilrb1","Lilrb2","Lilrb3","Lilrb4","Lilrb3a","Lilra3","Lilrc2","Lilrb3l","Lim2","Lima1","Lime1","Limd1","Limd2","Limch1","Limk1","Limk2","Lims1","Lin28c","Lin28b","Lims2","Lin28a","Lin37","Lin52","Lin54","Lin7b","Linc00176","Lin7a","Lin7c","Lin9","Linc00514","Linc01158","Linc-rbe","Lingo3","Lingo2","Lingo1","Lingo4","Lins1","Lipa","Lipe","Lipf","Liph","Lipi","Lipg","Lipk","Lipc","Lipm","Lipogenin","Lipn","Lipt1","Lipo1","Lipt2","Lix1","Litaf","Lix1l","Lkaaear1","Llgl1","Llph","Llgl2","Lman1","Lman1l","Lman2","Lman2l","Lmbr1","Lmbrd2","Lmbr1l","Lmbrd1","Lmcd1","Lmln","Lmf1","Lmf2","Lmnb2","Lmntd2","Lmnb1","Lmo1","Lmna","Lmo2","Lmntd1","Lmo3","Lmod1","Lmod2","Lmod3","Lmo4","Lmtk3","Lmtk2","Lmx1a","Lmo7","Lnc-hc","Lnc001","Lnc004","Lnc012","Lnc056","Lnc016","Lmx1b","Lnc081","Lnc134","Lnc215","Lnp1","Lnpk","Lnx2","Lonrf1","Lonp1","Lonrf2","Lonp2","Lor","Lonrf3","Loxhd1","Lox","Loxl1","Loxl2","Loxl3","Loxl4","Lpal2","Lpar2","Lpar1","Lpar4","Lpar3","Lpar5","Lpar6","Lpcat1","Lpcat2","Lpcat2b","Lpcat3","Lpin1","Lpcat4","Lpgat1","Lpin2","Lpin3","Lpo","Lppos","Lpl","Lpxn","Lpp","Lrap","Lrat","Lrba","Lrch1","Lrch2","Lrch3","Lrcol1","Lre3","Lrch4","Lrfn1","Lrfn2","Lrfn3","Lrfn4","Lrg1","Lrfn5","Lrif1","Lrguk","Lrig1","Lrig2","Lrig3","Lrit1","Lrit2","Lrit3","Lrmp","Lrmda","Lrp10","Lrp12","Lrp11","Lrp1","Lrp1b","Lrp2bp","Lrp3","Lrp4","Lrp2","Lrp6","Lrpap1","Lrp8","Lrp5","Lrpprc","Lrr1","Lrrc1","Lrrc10b","Lrrc10","Lrrc14","Lrrc14b","Lrrc15","Lrrc17","Lrrc19","Lrrc18","Lrrc2","Lrrc20","Lrrc23","Lrrc24","Lrrc25","Lrrc26","Lrrc27","Lrrc28","Lrrc29","Lrrc3","Lrrc30","Lrrc31","Lrrc32","Lrrc34","Lrrc37a","Lrrc36","Lrrc38","Lrrc39","Lrrc3c","Lrrc3b","Lrrc4","Lrrc41","Lrrc42","Lrrc40","Lrrc43","Lrrc45","Lrrc46","Lrrc47","Lrrc49","Lrrc4b","Lrrc51","Lrrc52","Lrrc4c","Lrrc55","Lrrc56","Lrrc57","Lrrc58","Lrrc59","Lrrc6","Lrrc61","Lrrc66","Lrrc63","Lrrc69","Lrrc72","Lrrc71","Lrrc7","Lrrc73","Lrrc74b","Lrrc74a","Lrrc75a","Lrrc75b","Lrrc8b","Lrrc8a","Lrrc8d","Lrrc8c","Lrrc9","Lrrc8e","Lrrd1","Lrrcc1","Lrrfip1","Lrriq1","Lrrfip2","Lrriq3","Lrriq4","Lrrk1","Lrrn1","Lrrn2","Lrrk2","Lrrn4","Lrrn3","Lrrn4cl","LRRTM1","Lrrtm2","Lrrtm3","Lrrtm4","Lrtm1","Lrsam1","Lrtm2","Lrtomt","Lrwd1","Lsamp","Lsg1","Lsm1","Lsm10","Lsm11","Lsm12","Lsm14a","Lsm2","Lsm3","Lsm14b","Lsm4","Lsm5","Lsm7","Lsm6","Lsm8","Lsmem2","Lsmem1","Lsp1","Lsr","Lst1","Lss","Lta4h","Ltb","Ltb4r","Lta","Ltb4r2","Ltbp3","Ltbp2","Ltbp1","Ltbp4","Ltbr","Ltc4s","Ltf","Ltk","Ltv1","Ltn1","Luc7l","Luc7l2","Luc7l3","Lurap1","Lurap1l","Lum","Luzp4","Luzp2","Luzp1","Lvrn","Lxn","Ly49i2","Ly49i3","Ly49i4","Ly49i5","Ly49i9","Ly49i7","Ly49s3","Ly49s4","Ly49s5","Ly49s6","Ly49s7","Ly49si1","Ly6al","Ly49si2","Ly49si3","Ly6c","Ly6d","Ly6g5c","Ly6g5b","Ly6e","Ly6g6c","Ly6g6d","Ly6g6f","Ly6g6e","Ly6h","Ly6l","Ly6k","Ly6i","Ly75","Ly86","Ly96","Ly9","Lyar","Lyg1","Lyg2","Lyc2","Lyl1","Lynx1","Lypd1","Lyn","Lypd2","Lypd3","Lypd4","Lypd5","Lypd6","Lypd6b","Lypd8","Lypla1","Lypla2","Lyplal1","Lyrm1","Lyrm2","Lyrm4","Lyrm7","Lyrm9","Lysmd1","Lysmd2","Lysmd3","Lysmd4","Lyst","Lyve1","Lyzl1","Lyz2","Lyzl4","Lyzl6","Lzic","Lztfl1","Lztr1","Lzts1","Lzts2","Lzts3","M1ap","Maats1","M6pr","Mab21l1","Mab21l2","Macc1","Mab21l3","Macrod1","Macrod2","Mad1l1","Macf1","Mad2l1","Mad2l1bp","Mad2l2","Madcam1","Madd","Maea","Mael","Maf","Maf1","Mafa","Maff","Mafb","Mafg","Mafk","Magea10","Magea11","Magea4","Mag","Magea8","Magea9","Magea9-ps1","Mageb1","Mageb18","mageb1l1","Mageb16","Mageb2","Mageb3","Mageb6","Mageb4","Mageb5","Mageb7","Magebl1","Magec2","Maged1","Maged2","Magee1","Magee2","Magel2","Mageh1","Magix","Magi1","Magi2","Magi3","Magmas-ps1","Magoh","Magohb","Magt1","Maip1","Majin","Mak16","Mak","Mal","Mall","Mal2","Malrd1","Malsu1","Malt1","Mamdc2","Maml1","Mamdc4","Maml2","Maml3","Mamstr","Man1a2","Man1b1","Man1a1","Man1c1","Man2a1","Man2a2","Man2b1","Man2b2","Man2c1","Manbal","Manba","Manea","Maneal","Mansc1","Manf","Mansc4","Maoa","Map10","Maob","Map1a","Map1lc3b2","Map1b","Map1lc3a","Map1lc3b","Map1s","Map2k2","Map2k1","Map2","Map2k3","Map2k4","Map2k6","Map2k7","Map2k5","Map3k10","Map3k1","Map3k11","Map3k12","Map3k13","Map3k15","Map3k14","Map3k19","Map3k21","Map3k2","Map3k20","Map3k3","Map3k4","Map3k6","Map3k5","Map3k7","Map3k7cl","Map3k8","Map3k9","Map4","Map4k1","Map4k2","Map4k3","Map6d1","Map4k5","Map6","Map4k4","Map7","Map7d1","Map7d2","Map7d3","Map9","Mapk11","Mapk10","Mapk12","Mapk13","Mapk15","Mapk1ip1","Mapk1","Mapk1ip1l","Mapk4","Mapk6","Mapk14","Mapk7","Mapk8ip1","Mapk8ip2","Mapk8","Mapk3","Mapk8ip3","Mapkap1","Mapk9","Mapkapk2","Mapkapk3","Mapkapk5","Mapkbp1","Mapre1","Mapre2","Mapre3","1-Mar","1-Mar","2-Mar","10-Mar","11-Mar","2-Mar","Mapt","4-Mar","3-Mar","5-Mar","6-Mar","7-Mar","8-Mar","9-Mar","Marcksl1","Marcks","Marco","Marf1","Mark1","Mark2","Mark3","Mark4","Mars","Mars2","Marveld1","Marveld2","Marveld3","Mas1l","Mas1","Masp1","Masp2","MAST1","Mast2","Mast4","Mast3","Mastl","Mat1a","Mat2b","Mat2a","Matk","Matn1","Matn3","Matn2","Matn4","Matr3-ps1","Matr3-ps2","Matr3","Mau2","Mavs","Max","Max-ps1","Maz","Mb21d2","Mb","Mbd1","Mbd2","Mbd3l1","Mbd3l2","Mbd3","mbd3l2l","Mbd4","Mbd5","Mbd6","Mbip","Mblac2","Mblac1","Mbl1","Mbl2","Mbnl2","Mbnl1","Mbnl3","Mboat1","Mboat2","Mboat4","Mboat7","Mboat7l1","Mbtd1","Mbtps1","Mbtps2","Mbp","Mc1r","Mc2r","Mc3r","Mc5r","Mc4r","Mcart1","Mcam","Mcat","Mcc","Mccc2","Mccc1","Mcee","Mcemp1","Mcf2","Mcfd2","Mcf2l","Mchr1","Mcidas","Mcm10","Mcl1","Mcm2","Mcm3","Mcm4","Mcm3ap","Mcm5","Mcm6","Mcm8","Mcm7","Mcm9","Mcmdc1","Mcmbp","Mcmdc2","Mcoln1","Mcoln2","Mcoln3","Mcph1","Mcpt1","Mcpt10","Mcpt1l1","Mcpt1l2","Mcpt1l3","Mcpt1l4","Mcpt2","Mcpt3","Mcpt4l1","Mcpt4","Mcpt8l2","Mcpt8","Mcpt9","Mcrip1","Mcpt8l3","Mcrip2","Mcrs1","Mctp1","Mcts1","Mctp2","Mcts2","Mcub","Mcur1","Mcu","Mdc1","Mdfic","Mdfi","Mdga1","Mdga2","Mdh1","Mdh2","Mdh1b","Mdk","Mdm1","Mdm4","Mdn1","Mdp1","Mdm2","Me2","Me1","Mea1","Meaf6","Me3","Mecom","Mecr","Med10","Med1","Mecp2","Med11","Med12","Med13","Med12l","Med13l","Med14-ps1","Med14","Med15","Med16","Med18","Med17","Med19","Med20","Med21","Med22","Med24","Med23","Med25","Med26","Med27","Med28","Med29","Med30","Med31","Med6","Med4","Med7","Med8","Med9","Medag","Mef2b","Mef2a","Mef2d","Mef2c","Mefv","Megf10","Megf6","Megf9","Megf11","Megf8","Mei1","Meikin","Mei4","Meig1","Meiob","Meioc","Meis1","Meis2","Meis3","Melk","Meltf","Memo1","Meox1","Men1","Meox2","Mep1a","Mep1b","Mepce","Mepe","Mesd","Mesp1","Mertk","Mesp2","Mest","Metap1","Metap1d","Metap2","Met","Metrn","Metrnl","Mettl1","Mettl13","Mettl11b","Mettl15","Mettl16","Mettl14","Mettl17","Mettl18","Mettl21c","Mettl21a","Mettl21cl1","Mettl21ep","Mettl22","Mettl23","Mettl24","Mettl25","Mettl27","Mettl26","Mettl2b","Mettl4","Mettl3","Mettl5","Mettl6","Mettl7a","Mettl9-ps1","Mettl7b","Mettl8","Mettl9","Mex3a","Mex3b","Mex3c","Mex3d","Mfap2","Mfap1a","Mfap3l","Mfap3","Mfap4","Mfap5","Mfhas1","Mff","Mfge8","Mfng","Mfsd1","Mfrp","Mfn1","Mfn2","Mfsd10","Mfsd11","Mfsd12","Mfsd14a","Mfsd13a","Mfsd14b","Mfsd2a","Mfsd2b","Mfsd4a","Mfsd3","Mfsd4b","Mfsd6l","Mfsd5","Mfsd6","Mfsd7","Mfsd8","Mfsd9","Mgam","Mga","Mgarp","Mgat1","Mgat2","Mgat3","Mgat4b","Mgat4a","Mgat4d","Mgat4e","Mgat4c","Mgat5b","MGC105567","Mgat5","MGC105649","MGC108823","MGC109340","MGC112692","MGC114246","MGC114483","MGC114492","MGC114499","MGC116121","MGC93861","MGC116197","MGC116202","MGC94207","MGC94199","MGC95208","MGC94891","MGC95210","Mgea5","Mgme1","Mgll","Mgp","Mgrn1","Mgst1","Mgmt","Mgst2","Mgst3","Mia","Miat","Mia3","Mia2","Mib1","Mib2","Mical1","Mical2","Micalcl","Mical3","Micall1","Micall2","Micb","Micu2","Micu1","Micu3","Mid1ip1","Mid2","Mid1","Midn","Mief1","Mief2","Mien1","Mier2","Mier1","Mier3","Mif4gd","Miga1","Miga2","Miip","Milr1","Mill1","Mif","Mindy1","Mindy2","Minos1","Minpp1","Mink1","Mios","Miox","Mipol1","Mipep","Mip","Mir1","Mir100","Mir101-2","Mir103a1","Mir101a","Mir103a2","Mir105","Mir107","Mir106a","Mir106b","Mir10a","Mir10b","Mir1188","Mir1193","Mir1199","Mir1224","Mir122","Mir124-1","Mir124-2","Mir124-3","Mir1249","Mir1247","Mir125a","Mir125b1","Mir125b2","Mir126a","Mir126b","Mir127","Mir128-2","Mir128-1","Mir129-1","Mir129-2","Mir1297","Mir1306","Mir1298","Mir130b","Mir130a","Mir132","Mir133a1","Mir133b","Mir134","Mir135a","Mir135b","Mir136","Mir137","Mir138-2","Mir138-1","Mir139","Mir140","Mir141","Mir142","Mir144","Mir143","Mir145","Mir146a","Mir146b","Mir148a","Mir147","Mir148b","Mir149","Mir151","Mir150","Mir151b","Mir152","Mir154","Mir153","Mir155","Mir155hg","Mir15b","Mir16","Mir17","Mir181a-1","Mir181a2","Mir181b1","Mir181b2","Mir181c","Mir181d","Mir182","Mir183","Mir184","Mir1843b","Mir185","Mir186","Mir187","Mir188","Mir1896","Mir18a","Mir190b","Mir190","Mir191","Mir1912","Mir192","Mir193","Mir193a","Mir193b","Mir1949","Mir194-2","Mir194-1","Mir195","Mir1956","Mir196a","Mir196b","Mir196c","Mir1b","Mir19a","Mir199a2","Mir19b1","Mir19b2","Mir200a","Mir200b","Mir200c","Mir201","Mir202","Mir203","Mir204","Mir207","Mir206","Mir205","Mir208a","Mir208b","Mir20a","Mir20b","Mir211","Mir212","Mir210","Mir21","Mir215","Mir216a","Mir214","Mir218-2","Mir216b","Mir217","Mir218-1","Mir219-2","Mir219a1","Mir22","Mir221","Mir222","Mir224","Mir223","Mir23a","Mir23b","Mir24-2","Mir25","Mir24-1","Mir26b","Mir27a","Mir26a","Mir27b","Mir28","Mir290","Mir291a","Mir291b","Mir292","Mir294","Mir293","Mir295-1","Mir295-2","Mir2964","Mir296","Mir299","Mir297","Mir298","Mir2985","Mir299b","Mir29a","Mir29b1","Mir301a","Mir29b2","Mir29c","Mir301b","Mir300","Mir3064","Mir3065","Mir3074","Mir3072","Mir3075","Mir3084a","Mir3084c","Mir3099","Mir3085","Mir30a","Mir30b","Mir30c1","Mir30c2","Mir31","Mir30d","Mir30e","Mir3102","Mir32","Mir323","Mir3120","Mir320a","Mir324","Mir325","Mir326","Mir322","Mir327","Mir328b","Mir328","Mir329","Mir330","Mir33","Mir331","Mir336","Mir337","Mir338","Mir339","Mir341","Mir342","Mir343","Mir344-1","Mir344a-2","Mir344b-1","Mir344g","Mir344i","Mir345","Mir346","Mir349","Mir3473","Mir34a","Mir34b","Mir351","Mir350","Mir34c","Mir3541","Mir3542","Mir3543","Mir3544","Mir3545","Mir3546","Mir3547","Mir3548","Mir3550","Mir3551","Mir3552","Mir3553","Mir3554","Mir3556b","Mir3555","Mir3557","Mir3556a","Mir3558","Mir3559","Mir3560","Mir3561","Mir3565","Mir3562","Mir3564","Mir3566","Mir3568","Mir3569","Mir3570","Mir3571","Mir3572","Mir3576","Mir3573","Mir3575","Mir3574","Mir3577","Mir3578","Mir3579","Mir3580","Mir3581","Mir3582","Mir3583","Mir3584","Mir3585","Mir3587","Mir3588","Mir3589","Mir3590","Mir3591","Mir3592","Mir3593","Mir3594","Mir3595","Mir3596a","Mir3596b","Mir3596c","Mir3597-1","Mir3597-2","Mir3597-3","Mir361","Mir362","Mir363","Mir365b","Mir369","Mir370","Mir374b","Mir376a","Mir375","Mir376b","Mir376c","Mir377","Mir378","Mir379","Mir378b","Mir380","Mir381","Mir382","Mir383","Mir384","Mir410","Mir411","Mir409","Mir412","Mir421","Mir423","Mir425","Mir429","Mir433","Mir431","Mir434","Mir448","Mir449a","Mir449c","Mir450a1","Mir455","Mir463","Mir466c","Mir465","Mir451a","Mir466d","Mir471","Mir483","Mir484","Mir485","Mir488","Mir489","Mir487b","Mir490","Mir493","Mir494","Mir495","Mir496","Mir497","Mir499a","Mir501","Mir500","Mir503","Mir504","Mir505","Mir511","Mir539","Mir5132","Mir509","Mir532","Mir540","Mir541","Mir542","Mir544","Mir543","Mir551b","Mir547","Mir568","Mir582","Mir592","Mir598","Mir615","Mir6215","Mir6216","Mir628","Mir6314","Mir6315","Mir6316","Mir6318","Mir6320","Mir6322","Mir632","Mir6321","Mir6323","Mir6324","Mir6325","Mir6326","Mir6327","Mir6328","Mir6329","Mir6330","Mir6332","Mir6331","Mir6333","Mir6334","Mir652","Mir664-1","Mir653","Mir665","Mir666","Mir664-2","Mir667","Mir668","Mir672","Mir671","Mir673","Mir676","Mir674","Mir675","Mir678","Mir702","Mir741","Mir708","Mir711","Mir742","Mir743a","Mir743b","Mir7578","Mir758","Mir759","Mir761","Mir760","Mir762","Mir770","Mir764","Mir7a1","Mir7a2","Mir802","Mir7b","Mir871","Mir872","Mir874","Mir873","Mir875","Mir876","Mir878","Mir879","Mir877","Mir883","Mir880","Mir881","Mir9-1","Mir9-2","Mir9-3","Mir92a1","Mir92b","Mir92a2","Mir935","Mir93","Mir96","Mir98","Mir99a","Mir99b","Mirlet7a-2","Mirlet7a1","Mirlet7bhg","Mirlet7b","Mirlet7c1","Mirlet7c2","Mirlet7e","Mirlet7f-1","Mirlet7f1","Mirlet7d","Mirlet7f2","Mirlet7g","Mirlet7i","Mis12","Misp","Misp3","Mis18a","Mis18bp1","Mitd1","Mitf","Mixl1","Mk1","Mkl2","Mkks","Mki67","Mkl1","Mkln1","Mknk2","Mknk1","Mkrn1","Mkrn2os","Mkrn2","Mkrn3","Mkx","Mks1","Mlana","Mlc1","Mlec","Mlf1","Mlf2","Mlkl","Mlh1","Mlh3","Mllt1","Mlip","Mllt10","Mllt11","Mllt3","Mln","Mllt6","Mlnr","Mlph","Mlst8","Mlxip","Mlx","Mlxipl","Mlycd","Mmaa","Mmab","Mmachc","Mmd","Mmadhc","Mmd2","Mmgt1","Mmgt2","Mmel1","Mme","Mmp10","Mmp11","Mmp12","Mmp15","Mmp1","Mmp16","Mmp14","Mmp13","Mmp1b","Mmp17","Mmp19","Mmp20","Mmp21","Mmp25","Mmp23","Mmp27","Mmp28","Mmp24","Mmp8","Mmrn1","Mmp7","Mms19","Mmrn2","Mmp3","Mn1","Mnda","Mms22l","Mnd1","Mmp2","Mnat1","Mns1","Moap1-ps1","Mnt","Mnx1","Moap1","Mob1b","Mob2","Mob1a","Mob3a","Mob3c","Mob3b","Mob4","Mocos","Mocs1","Mobp","Mocs3","Mogat1","Mocs2","Mog","Mmp9","Mogat2","Mogat3","Mogs","Mok","Mon1a","Mon1b","Morc2b","Morc2","Morc1","Mon2","Morc3","Morc4","Morf4l1","Morn2","Morn1","Morf4l2","Morn3","Morn5","Morn4","Mos","Mospd1","Mospd4","Mospd3","Mospd2","Mov10","Moxd1","Mov10l1","Moxd2","Mpc1l","Mpdu1","Mpc1","Mpc2","Mpeg1","Mpdz","Mphosph6-ps1","Mpg","Mphosph10","Mphosph6","Mphosph9","Mphosph8","Mpi","Mpig6b","Mplkip","Mpnd","Mpp1","Mpl","Mpo","Mpp2","Mpp3","Mpp4","Mpp5","Mpp6","Mppe1","Mpp7","Mpped1","Mpped2","Mptx1","Mpst","Mpv17","Mpv17l","Mprip","Mpv17l2","Mpz","Mpzl1","Mpzl2","Mpzl3","Mrap","Mr1","Mrap2","Mras","Mrc1","Mrc2","Mreg","Mrfap1","Mrgprb13","Mrgbp","Mre11a","Mrgprb3","Mrgprb4","Mrgprc","Mrgprb5","Mrgprd","Mrgpre","Mrgprf","Mrgprx1","Mrgprg","Mrgprx2l","Mrgprx2","Mrgprx3","Mrgprx4","Mrln","Mri1","Mrm2","Mrm1","Mrm3","Mrnip","Mro","Mroh2a","Mroh2b","Mroh5","Mroh1","Mroh4","Mroh6","Mroh7","Mroh9","Mroh8","Mrpl1","Mrpl10","Mrpl12","mrpl11","Mrpl13","Mrpl14","Mrpl15","Mrpl16","Mrpl17","Mrpl18","Mrpl19","Mrpl2","Mrpl20","Mrpl21","Mrpl22","Mrpl23","Mrpl27","mrpl24","Mrpl28","Mrpl3","Mrpl32","Mrpl30","Mrpl33","Mrpl34","Mrpl35","Mrpl36","Mrpl38","Mrpl37","Mrpl39","Mrpl4","Mrpl42","Mrpl41","Mrpl40","Mrpl43","Mrpl44","Mrpl45","Mrpl46","Mrpl47","Mrpl48","Mrpl50","Mrpl49","Mrpl51","Mrpl52","Mrpl53","Mrpl54","Mrpl55","Mrpl57","Mrpl58","Mrps10","mrpl9","Mrps11","Mrps12","Mrps14","Mrps15","Mrps16","Mrps17-ps1","Mrps17","Mrps18a","Mrps18b","Mrps18c","Mrps2","Mrps21l","Mrps21","Mrps22","Mrps23","Mrps25","Mrps26","Mrps24","Mrps27","Mrps30","Mrps28","Mrps31","Mrps33","Mrps34","Mrps36","Mrps35","Mrps6","Mrps7","Mrps5","Mrrf","Mrps9","Mrs2","Mrto4","Mrvi1","Ms4a10","Ms4a1","Ms4a12","Ms4a13-ps1","Ms4a14","Ms4a18","Ms4a15","Ms4a2","Ms4a3","Ms4a4a","Ms4a4c","Ms4a5","Ms4a6b","Ms4a6a","Ms4a6bl","Ms4a6c","Ms4a7","Ms4a6e","Ms4a8","Msantd2","Msantd1","Msantd3","Msantd4","Msc","Msgn1","Msh3","Msh4","Msi1","Msh5","Msh2","Msh6","Msl1","Msi2","Msl2","Msl3l2","Msl3","Mslnl","Msmb","Msmp","Msln","Msmo1","Msr1","Msrb1","Msn","Msrb2","Msrb3","Mss51","Msra","Mst1","Msto1","Msx3","Mst1r","Msx1","Mstn","Msx2","Mt-atp6","Mt-atp8","Mt-co1","Mt-co2","Mt-co3","Mt-nd2","Mt-nd4","Mt-cyb","Mt-nd3","Mt-nd1","mt-Ta","mt-Tc","mt-Td","mt-Te","Mt-nd6","Mt-nd4l","mt-Tf","Mt-nd5","mt-Th","mt-Tg","mt-Ti","mt-Tk","mt-Tl1","mt-Tl2","mt-Tm","mt-Tn","mt-Tp","mt-Tq","mt-Tr","mt-Ts1","mt-Ts2","mt-Tv","mt-Tt","mt-Tw","mt-Ty","Mt1f","Mt1m","Mt1-ps2","Mt1-ps1","Mt1","Mt2A","Mt3","Mt4","Mta1","Mta2","Mta3","Mtap","Mtbp","Mtch1","Mtch2","Mtcl1","Mtcp1","Mterf1","Mterf2","Mtdh","Mterf4","Mterf3","Mtf1","Mtf2","Mtfmt","Mtfp1","Mtfr1-ps1","Mtfr1","Mtfr1l","Mtg1","Mtfr2","Mtg2","Mthfd1","Mthfd1l","Mthfd2","Mthfd2l","Mthfsd","Mtif3","Mtif2","Mthfs","Mtm1","Mtmr1","Mtmr10","Mtmr11","Mtmr12","Mthfr","Mtmr14","Mtmr2","Mtmr3","Mtmr6","Mtmr4","Mtmr9","Mtmr7","Mto1","Mtnr1b","Mtnr1a","Mtpap","Mtrf1","Mtpn","Mtrf1l","Mtr","Mtss1l","Mtrr","Mtss1","Mttp","Mtor","Mturn","Mtx1","Mtus2","Mtus1","Mtx2","Mtx3","Muc15","Muc13","Muc16","Muc19","Muc19l1","Muc1","Muc20","Muc3","Muc2","Muc5b","Muc5ac","Muc4","Mucl1","Muc6","Mul1","Mum1l1","Mum1","Mug2","Mug1","Mus81","Mup4","Mup5","Mustn1","Musk","Mutyh","Mvb12a","Mut","Mvb12b","Mvd","Mvp","Mvk","Mxd1","Mx1","Mx2","Mxd3","Mxd4","Mxra7","Myadml2","Mxi1","Mxra8","Myb","Mybbp1a","Myadm","Mybl1","Mybl2","Mybpc2","Mybpc3","Mybpc1","Mybphl","Mycbp","Mybph","Mycbp2","Mycbpap","Mycl","Myct1","Mycn","Mycs","Myd88","Mydgf","Myef2","Myf5","Myf6","Myg1","Myh1","Myh13","Myc","Myh10","Myh11","Myh2","Myh15","Myh14","Myh3","Myh7b","Myh6","Myh4","Myh8","Myh9l1","Myh7","Myh9","Myl10","Myl1","Myl12a","Myl2","Myl3","Myl12b","Myl4","Myl6b","Myl6","Myl6l","Myl7","Myl9","Mylip","Mylk3","Mylk2","Mylk4","Mylk","Mymk","Mylpf","Mynn","Myo15b","Myo10","Myo15a","Myo18a","Myo16","Myo19","Myo18b","Myo1a","Myo1b","Myo1c","Myo1e","Myo1f","Myo1h","Myo1d","Myo1g","Myo3b","Myo3a","Myo5c","Myo5a","Myo5b","Myo7b","Myo6","Myo7a","Myo9a","Myo9b","Myoc","Myocd","Myod1","Myof","Myom2","Myom1","Myog","Myom3","Myorg","Myoz3","Myoz2","Myot","Myoz1","Mypn","Mypop","Myrf","Myrfl","Myrip","Myt1","Mysm1","Myt1l","Mzb1","Mzt1","Myzap","Mzf1","N4bp1","N4bp2l1","Mzt2b","N4bp2","N5","N4bp2l2","N4bp3","N6amt1","Naa10","Naa11","Naa15","Naa16","Naa20","Naa30","Naa25","Naa35","Naa38","Naa40","Naa50","Naa60","Naaa","Naaladl1","Naalad2","Naaladl2","Nab1","Nab2","Nabp1","Nabp2","Nacad","Naca","Nacc1","Nacc2","Nadk","Nadk2","Nadsyn1","Nae1","Naga","Nagk","Naf1","Naglt1","Nagpa","Naglu","Naif1","Naip5","Nags","Nalcn","Naip6","Nanos1","Nanos2","Nampt","Nanog","Nanos3","Nanp","Nans","Nap1l2","Nap1l1","Nap1l3","Nap1l4","Nap1l5","Napb","Napa","Napepld","Napg","Naprt","Napsa","Narf","Nars","Narfl","Nars2","Nasp","Nat14","Nat10","Nat6","Nat8","Nat3","Nat1","Nat8b","Nat2","Nat8f1","Nat8f2","Nat8f3","Nat8f4","Nat8f5","Nat8l","Nat9","Natd1","Nav1","Naxd","Nav3","Nav2","Naxe","Nbas","Nbea","Nbeal1","Nbl1","Ncald","Nbeal2","Nbn","Nbr1","Ncam2","Ncapd2","Ncan","Ncaph","Ncapg","Ncapd3","Ncam1","Ncapg2","Ncaph2","Ncbp2","Ncbp3","Ncbp1","Nccrp1","Ncdn","Nceh1","Ncf2","Ncf1","Ncf4","Nck1","Nck2","Nckap1","Nckap1l","Nckap5","Nckap5l","Nckipsd","Ncl-ps1","Ncmap","Ncln","Ncl","Ncoa4","Ncoa5","Ncoa2","Ncoa3","Ncoa1","Ncoa7","Ncoa6","Ncr2","Ncr3lg1","Ncr1","Ncr3","Ncor1","Ncor2","Ncstn","Ndc1","Ncs1","Ndc80","Ndfip1","Nde1","Ndel1","Ndfip2","Ndnf","Ndn","Ndor1","Ndp","Ndrg1","Ndrg3","Ndrg2","Ndst3","Ndst2","Ndst1","Ndrg4","Ndst4","Ndufa1","Ndufa10l1","Ndufa13-ps1","Ndufa11","Ndufa10","Ndufa12","Ndufa13","Ndufa2","Ndufa3","Ndufa4l2","Ndufa7l","Ndufa4","Ndufa6","Ndufa5","Ndufa7","Ndufa8","Ndufaf1","Ndufa9","Ndufaf2","Ndufab1","Ndufaf4","Ndufaf5","Ndufaf3","Ndufaf6","Ndufb1","Ndufaf8","Ndufaf7","Ndufb10","Ndufb1l1","Ndufb11","Ndufb2","Ndufb3","Ndufb4l1","Ndufb4-ps1","Ndufb4","Ndufb6","Ndufb5","Ndufb7","Ndufb8","Ndufb9","Ndufc1","Ndufc2","Ndufs2","Ndufs1","Ndufs3","Ndufs4","Ndufs5-ps1","Ndufs5","Ndufs6","Ndufs7","Ndufs8","Ndufv2","Ndufv1","Ndufv3-ps1","Ndufv3","Nebl","Necab1","Neb","Necab2","Necab3","Necap2","Necap1","Nectin1","Nectin3","Nectin2","Nedd1","Nectin4","Nedd8","Nedd4l","Nedd4","Nedd9","Negr1","Nefh","Neil1","Nefm","Neil2","Nefl","Neil3","Nek1","Nek11","Nek2","Nek10","Nek2l1","Nek3","Nek4","Nek5","Nek6","Nek7","Nelfa","Nek8","Nek9","Nelfcd","Nelfb","Nelfe","Nemp1","Nemf","Nemp2","Nenf","Nell1","Nepn","Neo1","Nell2","Nerg-ps11","Nerg-ps1","Nepro","Nerg-ps12","Nerg-ps10","Nerg-ps13","Nerg-ps14","Nerg-ps15","Nerg-ps2","Nerg-ps4","Nerg-ps6","Nerg-ps5","Nerg-ps3","Nerg-ps7","Nerg-ps8","Nerg-ps9","Net1","Neto2","Neto1","Neu1","Neu4","Neu3","Nes","Neu2","Neurl1b","Neurl2","Neurl1","Neurl3","Neurod2","Neurl4","Neurod4","Neurod1","Neurod6","Nexmif","Nexn","Nf1x","Nfam1","Nf2","Nfat5","Nf1","Nfasc","Nfatc2ip","Nfatc1","Nfatc2","Nfatc3","Nfe2","Nfe2l1","Nfe2l3","Nfatc4","Nfia","Nfic","Nfib","Nfil3","Nfkb2","Nfe2l2","Nfkbib","Nfkbia","Nfkbie","Nfkbil1","Nfkbid","Nfkbiz","Nfrkb","Nfkb1","Nfs1","Nfu1","Nfx1","Nfxl1","Nfya","Nfyb","Nfyc","Ngdn","Ngef","Ngb","Ngly1","Ngp","Ngrn","Nhlh2","Nhlh1","Nhej1","Nhlrc1","Nhlrc2","Ngf","Ngfr","Nhlrc3","Nhlrc4","Nhp2","Nhsl2","Nhs","Nhsl1","Nicn1","Nif3l1","Nid1","Nid2","Nifk","Nim1k","Ninj1","Nin","Ninj2","Nipa1","Nip7","Ninl","Nipa2","Nipal1","Nipal4","Nipal2","Nipal3","Nipsnap1","Nipsnap2","Nipsnap3a","Nipsnap3b","Nipbl","Nit1","Nisch","Nit2","Nkain1","Nkain2","Nkain3","Nkain4","Nkap","Nkapl","Nkapd1","Nkd1","Nkg7","Nkd2","Nkiras1","Nkpd1","Nkiras2","Nkr-p1c","Nkrf","Nktr","Nkx1-1","Nkx1-2","Nkx2-3","Nkx2-4","Nkx2-2","Nkx2-6","Nkx2-8","Nkx2-5","Nkx2-1","Nkx3-1","Nkx3-2","Nkx6-2","Nkx6-1","Nkx6-3","Nle1","Nlgn2","Nlk","Nlgn3","Nlgn1","Nln","Nlrc3","Nlrc5","Nlrc4","Nlrp10","Nlrp14","Nlrp12","Nlrp1b","Nlrp2","Nlrp1a","Nlrp4","Nlrp4b","Nlrp3","Nlrp4a","Nlrp4f","Nlrp5","Nlrp6","Nlrx1","Nlrp9","Nmbr","Nmb","Nmd3","Nme2-ps1","Nme1","Nme5","Nme3","Nme2","Nme4","Nme6","Nme7","Nme9","Nme8","Nmi","Nmnat1","Nmnat2","Nmral1","Nmnat3","Nmrk1","Nmrk2","NMS","Nmt1","Nmt2","Nmur1","Nmur2","Nmu","Nnmt","Nnat","Noa1","Nnt","Nob1","Nobox","Noc2l","Noc3l","Noc4l","Noct","Nod1","Nodal","Nol11","Nol10","Nol12","Nod2","Nol3","Nol4","Nol4l","Nol7","Nol6","Nol8","Nol9","Nom1","Nolc1","Nomo1","Nono","Nono-ps1","Nop14","Nop16","Nop10","Nop2","Nop53","Nop56","Nop58","Nop9","Nos1ap","Nosip","Nostrin","Notch2","Nog","Notch1","Nos1","Notch3","Notch4","Noto","Notum","Nos3","Nova2","Nov","Nova1","Nox3","Nox1","Nos2","Nox4","Noxa1","Noxred1","Noxo1","Np4","Npas1","Npas3","Npas2","Npb","Npas4","Npbwr1","Npat","Npc1","Npc1l1","Npdc1","Npc2","Npepl1","Npepo","Npff","Npepps","Npffr1","Npffr2","Nphp3","Nphp1","Npl","Nphp4","Nphs2","Nphs1","Nploc4","Npm2","Npm3","Npnt","Npm1","Nppc","Npr2","Nppb","Npr1","Npr3","Nprl2","Nppa","Nprl3","Nps","Nptx1","Npsr1","Nptxr","Nptx2","Nptn","Npvf","Npw","Npy4r","Npy2r","Npy1r","Nqo2","Nr0b1","Npy5r","Nqo1","Nr0b2","Nr1d1","Nr1d2","Nr1h2","Nr1h3","Nr1h4","Nr1h5","Nr1i2","Nr2c1","Npy","Nr2c2ap","Nr1i3","Nr2e1","Nr2e3","Nr2f1","Nr2c2","Nr2f6","Nr2f2","Nr3c2","Nr4a1","Nr4a2","Nr4a3","Nr5a1","Nr6a1","Nr5a2","Nr3c1","Nradd","Nras-ps1","Nrarp","Nrap","Nrbf2","Nras","Nrbp2","Nrbp1","Nrde2","Nrep","Nrdc","Nrg2","Nrf1","Nrcam","Nrg3","Nrg4","Nrgn","Nrip1","Nrip2","Nrip3","Nrk","Nrm","Nrl","Nrg1","Nrn1","Nrros","Nrp2","Nrsn1","Nrp1","Nrsn2","Nrtn","Nrxn1","Ns5atp4","Nsa2","Nsd1","Nrxn2","Nrxn3","Nsd2","Nrn1l","Nsdhl","Nsd3","Nsg2","Nsg1","Nsl1","Nsfl1c","Nsf","Nsmaf","Nsmce1","Nsmce3","Nsmce4a","Nsmce2","Nsrp1","Nsun2","Nsmf","Nsun3","Nsun7","Nsun5","Nsun4","Nsun6","Nt5c","Nt5c1a","Nt5c1b","Nt5c2","Nt5dc1","Nt5c3b","Nt5dc3","Nt5dc2","Nt5c3a","Nt5m","Nt5e","Ntan1","Nthl1","Ntmt1","Ntm","Ntf4","Ntn3","Ntf3","Ntn1","Ntn4","Ntn5","Ntpcr","Ntng2","Ntng1","Ntsr2","Nts","Nuak1","Ntsr1","Nuak2","Ntrk3","Ntrk1","Nubpl","Nubp2","Nub1","Nubp1","Nucb1","Ntrk2","Nucb2","Nucks1","Nudcd3","Nudcd2","Nudcd1","Nudc","Nudt1","Nudt10","Nudt11","Nudt12","Nudt13","Nudt15","Nudt14","Nudt16","Nudt17","Nudt16l1","Nudt19","Nudt18","Nudt2","Nudt3","Nudt22","Nudt21","Nudt4","Nudt5","Nudt6","Nudt8","Nudt7","Nuf2","Nufip1","Nudt9","Nufip2","Nuggc","Numa1","Numb","Numbl","Nup107","Nup133","Nup160","Nup153","Nup155","Nup188","Nup205","Nup210l","Nup214","Nup37","Nup210","Nup35","Nup43","Nup50","Nup54","Nup85","Nup62cl","Nup62","Nup88","Nup93","Nup58","Nupl2","Nupr1l1","Nupr1","Nup98","Nupr2","Nus1","Nusap1","Nutf2","Nutf2-ps1","Nutm1","Nwd1","Nutm2f","Nvl","Nwd2","Nxf2","Nxf1","Nxf5","Nxf3","Nxnl1","Nxf7","Nxn","Nxnl2","Nxpe2","Nxpe1","Nxpe3","Nxpe4","Nxph2","Nxpe5l1","Nxpe5","Nxph1","Nxph3","Nxph4","Nxt1","Nxt2","Nynrin","Nyap1","Nyap2","Nyx","Oacyl","Oaf","Oas1d","Oas1a","Oard1","Oas1b","Oas1e","Oas1g","Oas1h","Oas1f","Oas1i","Oas2","Oas1k","Oas3","Oasl","Oasl2","Oaz1-ps","Oat","Oaz1","Obox1","Oaz2","Oaz3","Obox2","Obox5","Obp2a","Obp2b","Obp1f","Oc90","Obsl1","Obscn","Obp3","Oca2","Ociad2","Ocel1","Ociad1","Ocstamp","Ocm2","Ocrl","Ocln","Odam","Odf1","Odc1","Odf2","Odf3","Odf2l","Odf3b","Odf3l1","Odf3l2","Odf4","Ofcc1","Odr4","Ogfod1","Ofd1","Ogdhl","Ogfod2","Ogfod3","Ogdh","Ogfrl1","Ogfr","Ogn","Oip5","Oit3","Ogg1","Ola1","Ogt","Olah","Olfm1","Olfm2","Olfm3","Olfm4","Olfml1","Olfml2a","Olfml3","Olfml2b","Olfr1330-ps1","Olfr1055","Olfr873","Olfr94-ps1","Olig1","Olig3","Olig2","Olr1","Olr1000","Olr1005-ps","Olr100-ps","Olr1004-ps","Olr10","Olr1002","Olr1008-ps","Olr1007","Olr1010-ps","Olr1006","Olr1001-ps","Olr1003-ps","Olr1011-ps","Olr1014","Olr1015-ps","Olr1012","Olr1018-ps","Olr1019-ps","Olr102-ps","Olr1020","Olr1009-ps","Olr1017-ps","Olr1013-ps","Olr101","Olr1021-ps","Olr1022","Olr1016","Olr1023-ps","Olr1025-ps","Olr1027-ps","Olr1026-ps","Olr1024","Olr1028-ps","Olr1029","Olr103","Olr1030-ps","Olr1031-ps","Olr1033-ps","Olr1032-ps","Olr1034-ps","Olr1035-ps","Olr1037-ps","Olr1036-ps","Olr1038-ps","Olr1039-ps","Olr1041-ps","Olr1040-ps","Olr104","Olr1042-ps","Olr1043-ps","Olr1044-ps","Olr1048-ps","Olr1045-ps","Olr1047-ps","Olr1046-ps","Olr1049","Olr105","Olr1050-ps","Olr1051","Olr1052","Olr1053-ps","Olr1054-ps","Olr1056-ps","Olr1055","Olr1057","Olr1058","Olr1059","Olr106","Olr1062-ps","Olr1060","Olr1061","Olr1063","Olr1064","Olr1065","Olr1066-ps","Olr1067","Olr1069","Olr1068","Olr107","Olr1071","Olr1070","Olr1072","Olr1074-ps","Olr1073","Olr1075","Olr1076","Olr1077","Olr1078","Olr1079","Olr1080-ps","Olr108","Olr1081","Olr1083","Olr1082","Olr1084","Olr1085","Olr1086","Olr1088","Olr1087","Olr1089-ps","Olr109","Olr1090","Olr1091","Olr1093","Olr1092","Olr1094-ps","Olr1095","Olr1096","Olr1097-ps","Olr1099-ps","Olr1098-ps","Olr110","Olr11","Olr1100-ps","Olr1102","Olr1105","Olr1104","Olr1106","Olr1107","Olr1109-ps","Olr111","Olr1108","Olr1110-ps","Olr1111","Olr1112-ps","Olr1113-ps","Olr1114-ps","Olr1116-ps","Olr1115","Olr1117","Olr1118","Olr112","Olr1120-ps","Olr1119","Olr1121","Olr1122","Olr1124","Olr1125","Olr1126","Olr1127-ps","Olr1128","Olr1129","Olr113","Olr1130","Olr1131-ps","Olr1132","Olr1133-ps","Olr1134-ps","Olr1136-ps","Olr1135","Olr1137","Olr1139","Olr1138","Olr1140-ps","Olr114","Olr1141-ps","Olr1143","Olr1142","Olr1144","Olr1145","Olr1146","Olr1147","Olr1148","Olr1149","Olr115","Olr1150-ps","Olr1152-ps","Olr1151","Olr1153-ps","Olr1154-ps","Olr1156","Olr1155","Olr1157-ps","Olr1158","Olr116-ps","Olr1161-ps","Olr1159","Olr1160","Olr1163","Olr1162","Olr1164","Olr1165","Olr1166","Olr1167-ps","Olr1168-ps","Olr1169","Olr117-ps","Olr1170-ps","Olr1171","Olr1172","Olr1175-ps","Olr1176-ps","Olr1174","Olr1178-ps","Olr1177","Olr1179","Olr118-ps","Olr1181-ps","Olr1182-ps","Olr1184-ps","Olr1183-ps","Olr1185","Olr1187-ps","Olr1186","Olr119","Olr1191","Olr1192","Olr1193","Olr1194","Olr1195","Olr1197","Olr1196","Olr1198","Olr1199","Olr12","Olr120","Olr1200","Olr1201","Olr1203","Olr1202","Olr1205-ps","Olr1204","Olr1206","Olr1207-ps","Olr1208-ps","Olr1209-ps","Olr1210-ps","Olr121","Olr1212-ps","Olr1211-ps","Olr1215-ps","Olr1213","Olr1214","Olr1217","Olr1218","Olr1219","Olr122","Olr1220","Olr1222","Olr1223","Olr1224-ps","Olr1225","Olr1226","Olr1227","Olr1228","Olr1229","Olr1232","Olr1230","Olr1231","Olr1233","Olr1234","Olr1235","Olr1236","Olr1237","Olr1238","Olr124","Olr1239","Olr1240","Olr1241","Olr1242","Olr1243","Olr1244","Olr1245","Olr1246","Olr1247","Olr1248","Olr1249","Olr125","Olr1250","Olr1251","Olr1252","Olr1253","Olr1254","Olr1255-ps","Olr1256","Olr1257","Olr1258","Olr1258-ps","Olr126","Olr1259","Olr1260","Olr1261","Olr1262","Olr1263-ps","Olr1264","Olr1267-ps","Olr1268-ps","Olr1265","Olr1269-ps","Olr1266","Olr1270-ps","Olr127","Olr1272-ps","Olr1273","Olr1275","Olr1276-ps","Olr1271","Olr1274","Olr1277-ps","Olr1278","Olr1279","Olr1281-ps","Olr1282-ps","Olr128","Olr1280","Olr1284-ps","Olr1283","Olr1285","Olr1287-ps","Olr1286","Olr1289-ps","Olr129","Olr1288","Olr1290-ps","Olr1291","Olr1292","Olr1293","Olr1296-ps","Olr1294","Olr1299-ps","Olr1298-ps","Olr1295","Olr1297","Olr13","Olr1300-ps","Olr130","Olr1301","Olr1302","Olr1303","Olr1304","Olr1305","Olr1306","Olr1307","Olr1308","Olr1310-ps","Olr131","Olr1309","Olr1311","Olr1312-ps","Olr1313","Olr1314","Olr1317-ps","Olr1318","Olr1315","Olr1316","Olr132","Olr1319","Olr1324-ps","Olr1320","Olr1325","Olr1328","Olr1326","Olr1323","Olr1321","Olr1327","Olr133-ps","Olr1329","Olr1333-ps","Olr1332","Olr1330","Olr1331","Olr1334","Olr1335","Olr1337","Olr1338","Olr134-ps","Olr1339","Olr1341","Olr1340","Olr1342-ps","Olr1343","Olr1345","Olr1344","Olr1348-ps","Olr1346","Olr1349","Olr1347","Olr135","Olr1350","Olr1351","Olr1352","Olr1357-ps","Olr1354-ps","Olr1353","Olr1355","Olr1356","Olr1358","Olr1359-ps","Olr1360-ps","Olr136","Olr1363-ps","Olr1362","Olr1361","Olr1364","Olr1365","Olr1367-ps","Olr1366","Olr1368","Olr1369","Olr1371-ps","Olr137","Olr1370","Olr1372","Olr1373","Olr1374","Olr1377-ps","Olr1376","Olr1375","Olr1379-ps","Olr1378","Olr138-ps","Olr1380","Olr1381","Olr1383","Olr1384","Olr1382","Olr1385","Olr1386","Olr1387","Olr1388","Olr1389","Olr1390-ps","Olr139","Olr1391","Olr1392","Olr1393","Olr1394","Olr1395","Olr1396","Olr1397","Olr1398","Olr1399","Olr14","Olr1400","Olr140","Olr1402-ps","Olr1401","Olr1403-ps","Olr1404","Olr1405","Olr1406","Olr1407","Olr1408","Olr1409","Olr1411","Olr1410","Olr141","Olr1412-ps","Olr1414","Olr1413","Olr1415","Olr1416","Olr1419-ps","Olr1417","Olr1418","Olr142","Olr1420-ps","Olr1421","Olr1422","Olr1424","Olr1427-ps","Olr1423","Olr1425","Olr1428","Olr1429-ps","Olr1430-ps","Olr143","Olr1433","Olr1431","Olr1434","Olr1432","Olr1435","Olr1436","Olr1438-ps","Olr1437","Olr144","Olr1439","Olr1440","Olr1444-ps","Olr1442","Olr1443","Olr1446-ps","Olr1445","Olr1447-ps","Olr1448","Olr1451","Olr1449","Olr1450","Olr145","Olr1452","Olr1453","Olr1454","Olr1455","Olr1456","Olr1457","Olr146-ps","Olr1458","Olr1459","Olr1460","Olr1461","Olr1462","Olr1464-ps","Olr1467","Olr1466","Olr1463","Olr1468","Olr147-ps","Olr1469","Olr1470","Olr1472","Olr1471","Olr1473-ps","Olr1475","Olr1474","Olr1476-ps","Olr1477-ps","Olr1479","Olr1480-ps","Olr148","Olr1481","Olr1483-ps","Olr1482","Olr1485","Olr1484-ps","Olr1487-ps","Olr1489-ps","Olr1486","Olr1488","Olr1490","Olr149","Olr1491","Olr1492","Olr1495-ps","Olr1493","Olr1497-ps","Olr1496","Olr1498","Olr1499","Olr15-ps","Olr150","Olr1500","Olr1503-ps","Olr1501","Olr1505","Olr1504","Olr1507","Olr1508-ps","Olr1509","Olr151-ps","Olr1510-ps","Olr1511","Olr1512","Olr1513","Olr1514","Olr1515","Olr1516","Olr1518-ps","Olr1517","Olr1519","Olr152","Olr1520","Olr1521","Olr1522","Olr1524-ps","Olr1525","Olr1523","Olr1526-ps","Olr1527-ps","Olr1528","Olr1529","Olr153","Olr1531","Olr1530","Olr1532","Olr1533","Olr1534-ps","Olr1535","Olr1536","Olr1537","Olr1538","Olr1540","Olr1539","Olr1541","Olr154","Olr1542","Olr1543","Olr1544-ps","Olr1545","Olr1546","Olr1548","Olr1547","Olr1549","Olr155","Olr1550-ps","Olr1551","Olr1552-ps","Olr1554-ps","Olr1553","Olr1555","Olr1556-ps","Olr1557","Olr1558","Olr156","Olr1559","Olr1560","Olr1563","Olr1562","Olr1561","Olr1564","Olr1566","Olr1565","Olr1567","Olr157","Olr1570","Olr1568","Olr1569","Olr1571","Olr1572","Olr1573-ps","Olr1575-ps","Olr1574-ps","Olr1577-ps","Olr1578-ps","Olr1576","Olr1580-ps","Olr158","Olr1579","Olr1581","Olr1583","Olr1582","Olr1584","Olr1585","Olr1586-ps","Olr1588","Olr1587","Olr1589","Olr1590","Olr159","Olr1591","Olr1592","Olr1593","Olr1594-ps","Olr1595","Olr1598","Olr1599-ps","Olr1597","Olr1596","Olr16","Olr1600","Olr160","Olr1601","Olr1604-ps","Olr1603-ps","Olr1602","Olr1605","Olr1606","Olr1607","Olr1608","Olr1609","Olr161","Olr1610","Olr1612","Olr1611","Olr1614","Olr1615","Olr1616","Olr1618-ps","Olr1617","Olr1619","Olr1620","Olr162","Olr1621","Olr1623-ps","Olr1622","Olr1624","Olr1629","Olr1626","Olr1625","Olr1627","Olr1630","Olr163","Olr1631","Olr1632","Olr1633","Olr1634-ps","Olr1637","Olr1635","Olr1638","Olr1639","Olr164","Olr1640","Olr1641","Olr1642","Olr1643","Olr1644","Olr1645","Olr1646","Olr1647-ps","Olr1648-ps","Olr1649-ps","Olr1650-ps","Olr165","Olr1651-ps","Olr1652","Olr1656-ps","Olr1653","Olr1655-ps","Olr1654","Olr1659-ps","Olr1657","Olr1658","Olr166-ps","Olr1665-ps","Olr1664","Olr1660","Olr1662","Olr1666","Olr1667","Olr1669-ps","Olr1668","Olr1672-ps","Olr1671","Olr1670","Olr167","Olr1674-ps","Olr1676-ps","Olr1675","Olr1673","Olr1680","Olr1679","Olr168","Olr1678","Olr1681","Olr1682","Olr1684","Olr1683","Olr1685-ps","Olr1686","Olr1687","Olr1688","Olr1689","Olr1690","Olr1692","Olr1691","Olr1693","Olr1694","Olr1695","Olr1697","Olr1696","Olr1698-ps","Olr1699","Olr17","Olr170","Olr1703-ps","Olr1701","Olr1700","Olr1702","Olr1704","Olr1706-ps","Olr1705","Olr1707","Olr1709","Olr1708","Olr171","Olr1710","Olr1711-ps","Olr1712-ps","Olr1713-ps","Olr1714","Olr1717-ps","Olr1715-ps","Olr1716-ps","Olr1719-ps","Olr1718","Olr172","Olr1720","Olr1721-ps","Olr1723-ps","Olr1722","Olr1724","Olr1725-ps","Olr1726","Olr1728-ps","Olr1729","Olr173-ps","Olr1731","Olr1732-ps","Olr1733","Olr1730","Olr1734","Olr1735","Olr1736","Olr1737","Olr1741-ps","Olr1738","Olr174","Olr1739","Olr1740-ps","Olr1742","Olr1743","Olr1744","Olr1747-ps","Olr1746","Olr1749","Olr1748","Olr175","Olr1750","Olr1751","Olr1752-ps","Olr1753-ps","Olr1754-ps","Olr1756-ps","Olr1755-ps","Olr1757-ps","Olr1758-ps","Olr1759-ps","Olr1760-ps","Olr176","Olr1761-ps","Olr1762-ps","Olr1763-ps","Olr1764-ps","Olr1765","Olr1766","Olr1767","Olr1768","Olr1769-ps","Olr1770-ps","Olr177-ps","Olr1771-ps","Olr1772-ps","Olr1773-ps","Olr1774-ps","Olr1775-ps","Olr1776-ps","Olr1777-ps","Olr1778-ps","Olr1779-ps","Olr1780-ps","Olr178","Olr1781-ps","Olr1783-ps","Olr1782-ps","Olr1785-ps","Olr1784-ps","Olr1786-ps","Olr1787-ps","Olr1788-ps","Olr1790-ps","Olr1789-ps","Olr1791-ps","Olr1792-ps","Olr1793-ps","Olr179","Olr1795-ps","Olr1794-ps","Olr1796-ps","Olr1797-ps","Olr1798-ps","Olr1799-ps","Olr18-ps","Olr180","Olr1800-ps","Olr1802-ps","Olr1801-ps","Olr1803-ps","Olr1804-ps","Olr1805-ps","Olr1806-ps","Olr1807-ps","Olr1809-ps","Olr1808-ps","Olr1810-ps","Olr181","Olr1811-ps","Olr1812-ps","Olr1814-ps","Olr1813-ps","Olr1815-ps","Olr1816-ps","Olr1817-ps","Olr1818-ps","Olr1819-ps","Olr182-ps","Olr1820-ps","Olr1821-ps","Olr1822-ps","Olr1823-ps","Olr1824-ps","Olr1825-ps","Olr1826-ps","Olr1827-ps","Olr1828-ps","Olr1829-ps","Olr1830-ps","Olr183","Olr1831-ps","Olr1832-ps","Olr1833-ps","Olr1835-ps","Olr1834-ps","Olr1836-ps","Olr1837-ps","Olr1838-ps","Olr1839-ps","Olr1840-ps","Olr184","Olr1841-ps","Olr1842-ps","Olr1843-ps","Olr1844-ps","Olr1845","Olr1846-ps","Olr1849-ps","Olr1847-ps","Olr1848-ps","Olr1850-ps","Olr185","Olr1851-ps","Olr1852-ps","Olr1853-ps","Olr1855-ps","Olr1854-ps","Olr1856-ps","Olr1857-ps","Olr1858-ps","Olr1859-ps","Olr1860-ps","Olr186","Olr1861-ps","Olr1862-ps","Olr1863-ps","Olr1864-ps","Olr1865-ps","Olr1866-ps","Olr1868","Olr1869","Olr1870","Olr1867","Olr187-ps","Olr1872","Olr1873","Olr1874","Olr1876","Olr1875","Olr1878","Olr1877","Olr188","Olr19","Olr189","Olr190","Olr191-ps","Olr192","Olr193","Olr195-ps","Olr194","Olr196","Olr197","Olr198","Olr2-ps","Olr199","Olr1l","Olr20","Olr200","Olr201","Olr202","Olr203","Olr205","Olr204","Olr206","Olr207-ps","Olr208","Olr21-ps","Olr209","Olr210","Olr212-ps","Olr211","Olr214","Olr213","Olr215","Olr216-ps","Olr217","Olr218","Olr22-ps","Olr220","Olr219","Olr221","Olr222","Olr223","Olr225-ps","Olr224","Olr228-ps","Olr226","Olr227","Olr229","Olr230","Olr23","Olr231","Olr232","Olr236-ps","Olr233","Olr235","Olr234","Olr238-ps","Olr237","Olr239","Olr24","Olr243-ps","Olr241","Olr240","Olr242","Olr245","Olr244","Olr246","Olr247","Olr248-ps","Olr25","Olr250","Olr251","Olr254-ps","Olr252","Olr255","Olr256-ps","Olr257","Olr258-ps","Olr26-ps","Olr259","Olr260","Olr261-ps","Olr262","Olr265-ps","Olr263","Olr264","Olr266-ps","Olr267","Olr268","Olr269-ps","Olr27","Olr270","Olr271","Olr273-ps","Olr272","Olr274-ps","Olr276","Olr278","Olr279","Olr28-ps","Olr280-ps","Olr281","Olr282","Olr283","Olr284-ps","Olr285","Olr286","Olr287","Olr288","Olr29","Olr289","Olr290-ps","Olr293-ps","Olr292","Olr294-ps","Olr294","Olr295","Olr296-ps","Olr297","Olr298","Olr299","Olr3","Olr30","Olr301-ps","Olr300","Olr302","Olr303","Olr304","Olr305","Olr306","Olr307","Olr308","Olr309","Olr31-ps","Olr310","Olr312","Olr311","Olr313","Olr314-ps","Olr315","Olr317-ps","Olr318","Olr319","Olr32","Olr320-ps","Olr321","Olr322","Olr323","Olr324","Olr325","Olr326","Olr327","Olr328-ps","Olr329","Olr33-ps","Olr330","Olr331","Olr332","Olr333-ps","Olr334","Olr335-ps","Olr336","Olr337","Olr338","Olr339","Olr34","Olr340","Olr342-ps","Olr341","Olr343","Olr344","Olr346","Olr347","Olr348","Olr349","Olr35","Olr350-ps","Olr351-ps","Olr352","Olr353-ps","Olr354","Olr355-ps","Olr356-ps","Olr357","Olr359-ps","Olr358","Olr36","Olr360","Olr361","Olr362-ps","Olr366-ps","Olr363","Olr365","Olr367","Olr368-ps","Olr369-ps","Olr370-ps","Olr37","Olr371","Olr372","Olr373","Olr374","Olr375","Olr376","Olr377","Olr378","Olr38-ps","Olr379","Olr380","Olr381-ps","Olr382","Olr383","Olr384","Olr385","Olr386","Olr389-ps","Olr387","Olr391-ps","Olr39","Olr390","Olr393-ps","Olr394-ps","Olr392","Olr395","Olr396","Olr397","Olr398","Olr399","Olr4","Olr40","Olr400","Olr401","Olr402","Olr403","Olr404","Olr405-ps","Olr406","Olr407","Olr408","Olr409","Olr41","Olr410","Olr411","Olr412-ps","Olr413","Olr414","Olr415","Olr416","Olr417","Olr418","Olr42-ps","Olr419","Olr420","Olr421","Olr422","Olr423","Olr424","Olr425","Olr427","Olr429","Olr428","Olr43","Olr433-ps","Olr431-ps","Olr434","Olr435-ps","Olr436","Olr437","Olr437-ps","Olr438-ps","Olr439","Olr44","Olr440","Olr441","Olr442","Olr443","Olr444","Olr445","Olr446","Olr447","Olr449-ps","Olr448","Olr45","Olr452-ps","Olr450","Olr453","Olr454","Olr455","Olr456","Olr457-ps","Olr458","Olr459","Olr46","Olr460-ps","Olr461","Olr462","Olr463","Olr464","Olr465","Olr466","Olr467-ps","Olr468","Olr469","Olr47","Olr470","Olr471","Olr472","Olr473","Olr475","Olr476","Olr477","Olr478-ps","Olr479","Olr48","Olr480","Olr481","Olr482","Olr483","Olr484","Olr485","Olr487-ps","Olr486","Olr488","Olr489-ps","Olr49","Olr490","Olr491","Olr492-ps","Olr493","Olr494-ps","Olr495","Olr496","Olr497-ps","Olr498-ps","Olr5","Olr499","Olr50","Olr501-ps","Olr500","Olr503-ps","Olr502","Olr505","Olr506-ps","Olr507","Olr508","Olr509-ps","Olr510","Olr51","Olr511-ps","Olr512-ps","Olr513","Olr514","Olr515","Olr516","Olr517","Olr518","Olr519","Olr520","Olr521-ps","Olr523-ps","Olr524-ps","Olr522","Olr525-ps","Olr526","Olr527","Olr528","Olr529","Olr53","Olr530","Olr531","Olr532","Olr533","Olr534-ps","Olr536","Olr535","Olr537","Olr538-ps","Olr54-ps","Olr539","Olr540","Olr541","Olr542","Olr543-ps","Olr544","Olr545","Olr547-ps","Olr546","Olr548-ps","Olr549-ps","Olr55-ps","Olr551","Olr550","Olr552","Olr553-ps","Olr554","Olr555","Olr556","Olr558","Olr557","Olr559","Olr56","Olr560","Olr561","Olr562","Olr563","Olr564-ps","Olr565-ps","Olr567","Olr566","Olr568-ps","Olr569","Olr57","Olr570-ps","Olr571-ps","Olr573-ps","Olr572-ps","Olr574-ps","Olr576","Olr575","Olr577","Olr579-ps","Olr578","Olr58-ps","Olr580-ps","Olr581","Olr582","Olr583","Olr584","Olr585-ps","Olr586","Olr587","Olr588","Olr589-ps","Olr590","Olr591-ps","Olr59","Olr593-ps","Olr592","Olr594","Olr596","Olr595","Olr597","Olr598","Olr6","Olr600-ps","Olr60","Olr601","Olr603-ps","Olr602","Olr604","Olr605-ps","Olr606","Olr607","Olr608","Olr609","Olr61","Olr610","Olr611","Olr612-ps","Olr613","Olr614","Olr616-ps","Olr617-ps","Olr619","Olr62","Olr620-ps","Olr621","Olr622-ps","Olr624","Olr623","Olr625","Olr626-ps","Olr627-ps","Olr628-ps","Olr629","Olr63","Olr630","Olr632-ps","Olr631","Olr633","Olr634","Olr635","Olr636","Olr638-ps","Olr637","Olr639","Olr640","Olr641","Olr642-ps","Olr643-ps","Olr644-ps","Olr645-ps","Olr646","Olr647-ps","Olr648","Olr649","Olr650","Olr651","Olr653","Olr652","Olr654","Olr655","Olr657","Olr658","Olr66-ps","Olr659","Olr660","Olr661","Olr662","Olr663","Olr664","Olr665","Olr667-ps","Olr666","Olr668","Olr67","Olr669","Olr670","Olr671","Olr672","Olr673","Olr674","Olr676-ps","Olr675","Olr678","Olr677","Olr679","Olr680-ps","Olr68","Olr681","Olr682-ps","Olr683-ps","Olr684","Olr685-ps","Olr686","Olr687","Olr688-ps","Olr689","Olr69","Olr690","Olr691","Olr692-ps","Olr693","Olr694","Olr695","Olr696","Olr697","Olr698","Olr699-ps","Olr700-ps","Olr7","Olr70","Olr701","Olr703","Olr702","Olr704","Olr705","Olr706-ps","Olr707","Olr708-ps","Olr709","Olr71-ps","Olr710","Olr711","Olr712","Olr713","Olr714","Olr715","Olr716","Olr717","Olr718","Olr719-ps","Olr72","Olr720","Olr721","Olr722","Olr723-ps","Olr724","Olr726","Olr725","Olr727","Olr728","Olr729","Olr73-ps","Olr730-ps","Olr732-ps","Olr731","Olr734","Olr733","Olr735","Olr738-ps","Olr736","Olr737","Olr739-ps","Olr740-ps","Olr74","Olr741","Olr743-ps","Olr742","Olr744","Olr746-ps","Olr745","Olr747","Olr748","Olr749","Olr75","Olr750","Olr752","Olr753","Olr755-ps","Olr754","Olr756","Olr758","Olr757","Olr76-ps","Olr762-ps","Olr760","Olr764-ps","Olr763","Olr765","Olr766","Olr767","Olr768","Olr769","Olr77","Olr770","Olr771","Olr772","Olr773","Olr775","Olr774","Olr776","Olr777","Olr778","Olr779","Olr78","Olr780","Olr781","Olr782","Olr783","Olr784","Olr785","Olr786","Olr787-ps","Olr788","Olr789","Olr79","Olr790","Olr791","Olr792","Olr794-ps","Olr795","Olr798-ps","Olr796","Olr799","Olr80","Olr8","Olr801","Olr802","Olr803","Olr804","Olr805-ps","Olr806","Olr807","Olr808","Olr809","Olr81","Olr810","Olr811","Olr812","Olr813","Olr814-ps","Olr815-ps","Olr816","Olr818","Olr819","Olr82","Olr820","Olr821","Olr822-ps","Olr823","Olr824","Olr825","Olr826","Olr827","Olr829","Olr83","Olr828","Olr830","Olr831","Olr832","Olr834","Olr833","Olr835-ps","Olr836","Olr837","Olr838","Olr839","Olr84","Olr840","Olr843-ps","Olr841","Olr846-ps","Olr845","Olr844","Olr848","Olr847","Olr85","Olr850","Olr851","Olr852","Olr853","Olr854","Olr855","Olr856","Olr857","Olr858","Olr859","Olr86","Olr860","Olr862","Olr865","Olr867","Olr868","Olr866","Olr870-ps","Olr87","Olr869","Olr872-ps","Olr871-ps","Olr873-ps","Olr874-ps","Olr876","Olr875","Olr877","Olr878","Olr879","Olr88","Olr880","Olr881","Olr882-ps","Olr883","Olr884-ps","Olr885-ps","Olr886","Olr888-ps","Olr887-ps","Olr89","Olr889","Olr890-ps","Olr891-ps","Olr893-ps","Olr892","Olr894","Olr895-ps","Olr896","Olr897-ps","Olr899-ps","Olr898","Olr9-ps","Olr90-ps","Olr900-ps","Olr901","Olr902-ps","Olr904-ps","Olr903","Olr905","Olr906","Olr907","Olr908","Olr909-ps","Olr91","Olr912-ps","Olr910","Olr913-ps","Olr914-ps","Olr916","Olr918-ps","Olr919-ps","Olr917","Olr920","Olr92","Olr921","Olr923-ps","Olr922","Olr924-ps","Olr925-ps","Olr926-ps","Olr927","Olr928-ps","Olr929-ps","Olr930-ps","Olr93","Olr931","Olr932","Olr934-ps","Olr933-ps","Olr935-ps","Olr936","Olr937","Olr938-ps","Olr939-ps","Olr94","Olr940-ps","Olr941-ps","Olr942-ps","Olr943","Olr944-ps","Olr945-ps","Olr946-ps","Olr947","Olr948-ps","Olr949-ps","Olr95","Olr951","Olr950","Olr952","Olr953-ps","Olr954","Olr955-ps","Olr958-ps","Olr956","Olr957-ps","Olr959","Olr96","Olr960","Olr961-ps","Olr963-ps","Olr962","Olr964","Olr966-ps","Olr965-ps","Olr967-ps","Olr968-ps","Olr969-ps","Olr97","Olr970-ps","Olr971-ps","Olr972-ps","Olr973-ps","Olr975-ps","Olr974-ps","Olr976-ps","Olr977-ps","Olr978-ps","Olr979-ps","Olr98","Olr980-ps","Olr981-ps","Olr982","Olr983-ps","Olr985-ps","Olr984","Olr986-ps","Olr987","Olr988-ps","Olr989-ps","Olr99-ps","Olr990","Olr991","Olr992-ps","Olr993-ps","Olr994-ps","Olr995","Olr997-ps","Olr996","Olr998-ps","Olr999-ps","Oma1","Omd","Omg","Omp","Onecut1","Onecut2","Onecut3","Ooep","Oog3","Oog1","Oosp1","Oosp2","Opa3","Opalin","Opa1","Opcml","Oplah","Ophn1","Opn1mw","Opn1sw","Opn3","Opn4","Opn5","Oprd1","Oprk1","Oprl1","Oprpn","Optc","Or10ad1","Oprm1","Or51t1","Optn","Or7e24","Orai2","Orai1","Orai3","Oraov1","Orc1","Orc2","Orc3","Orc4","Orc5","Orc6","Orm1","Ormdl1","Ormdl2","Ormdl3","Os9","Osbp","Osbp2","Osbpl11","Osbpl10","Osbpl1a","Osbpl2","Osbpl3","Osbpl5","Osbpl6","Osbpl7","Osbpl8","Osbpl9","Oscar","Oscp1","Oser1","Osgep","Osgepl1","Osgin1","Osm","Osgin2","Osmr","Osr1","Osr2","Ost4","Ostc","Ostf1","Ostn","Ostm1","Otc","Otoa","Otof","Otogl","Otog","Otol1","Otop1","Otop2","Otop3","Otor","Otos","Otp","Otub1","Otub2","Otud1","Otud3","Otud4","Otud5","Otud6a","Otud6b","Otud7a","Otud7b","Otulin","Otx1","Otx2","Ovca2","Ovch2","Ovol2","Ovol1","Ovol3","Oxa1l","Oxct2a","Oxct1","Oxct2b","Oxgr1","Oxld1","Oxnad1","Oxsm","Oxr1","Oxsr1","P22k15","Oxt","Oxtr","P2rx1","P2rx3","P2rx2","P2rx4","P2rx5","P2rx6","P2ry10","P2ry1","P2rx7","P2ry13","P2ry12","P2ry14","P2ry2","P2ry4","P2ry6","P3h3","P3h2","P3h1","P3h4","P4ha1","P4ha2","P4ha3","P4hb","P4htm","p53-ps","Pabpc1-ps1","Pa2g4","Pabpc1","Pabpc1l2a","Pabpc1l","Pabpc2","Pabpc4l","Pabpc4","Pabpc5","Pabpc6","Pabpn1l","Pabpn1","Pacrg","Pacrgl","Pacs1","Pacs2","Pacsin1","Pacsin2","Pacsin3","Padi1","Padi3","Padi2","Padi6","Padi4","Paf1","Pafah1b3","Pafah1b2","Pafah1b1","Pag1","Pafah2","Pagr1","Paip1","Pah","Paics","Paip2","Paip2b","Paip2l1","Pak1ip1","Pak2","Pak1","Pak3","Pak4","Pak6","Pak7","Palb2","Pald1","Palld","Palldl1","Palm","Palm2","Palm3","Palmd","Pam16","Pamr1","Pam","Pan3","Pan2","Pank1","Pank3","Pank2","Pank4","Panx2","Panx1","Panx3","Paox","Papd4","Papd5","Papd7","Papln","Papolb","Papola","Papolg","Pappa1","Papss1","Papss2","Paqr3","Paqr4","Paqr5","Paqr6","Paqr7","Paqr8","Paqr9","Pard3b","Pard3","Pard6a","Pard6b","Pard6g","Parg","Parl","Park7","Parm1","Parn","Pappa2","Parp10","Parp11","Parp12","Parp16","Parp14","Parp1","Parp2","Parp3","Parp4","Parp6","Parp9","Parp8","Pars2","Parpbp","Parva","Parvg","Parvb","Pasd1","Pate-f","Pask","Pate3","Pate1","Pate2","Pate4","Patl2","Patl1","Patj","Patz1","Pax1","Pawr","Pax2","Pax3","Pax5","Pax4","Pax7","Pax9","Paxbp1","Pax8","Pax6","Paxip1","Pbdc1","Paxx","Pbld2","Pbk","Pbp-ps","Pbld1","Pbp2","Pbsn","Pbx1","Pbx3","Pbx2","Pbrm1","Pbxip1","Pbx4","Pcbd2","Pcbd1","Pcbp1","Pc","Pcbp2","Pcbp4","Pcbp3","Pccb","Pcdh1","Pcca","Pcdh10","Pcdh11x","Pcdh12","Pcdh15","Pcdh17","Pcdh18","Pcdh19","Pcdh20","Pcdh8","Pcdh9","Pcdha1","Pcdh7","Pcdha10","Pcdha2","Pcdha13","Pcdha11","Pcdha12","Pcdha3","Pcdha5","Pcdha7","Pcdha6","Pcdha8","Pcdha4","Pcdha9","Pcdhac1","Pcdhb1","Pcdhac2","Pcdhb10","Pcdhb11","Pcdhb14","Pcdhb12","Pcdhb15","Pcdhb16","Pcdhb17","Pcdhb18","Pcdhb2","Pcdhb19","Pcdhb20","Pcdhb21","Pcdhb2l","Pcdhb22","Pcdhb3","Pcdhb4","Pcdhb5","Pcdhb6","Pcdhb7","Pcdhb8","Pcdhb9","Pcdhga1","Pcdhga10","Pcdhga11","Pcdhga12","Pcdhga2","Pcdhga3","Pcdhga4","Pcdhga5","Pcdhga6","Pcdhga8","Pcdhgb2","Pcdhga7","Pcdhgb4","Pcdhga9","Pcdhgb6","Pcdhgb5","Pcdhgb8","Pcdhgb7","Pcdhgc3","Pcdhgc5","Pced1a","Pcgf1","Pcf11","Pced1b","Pcgf2","Pcgf3","Pcid2","Pcgf6","Pcgf5","Pcif1","Pclaf","Pck2","Pck1","Pclo","Pcm1","Pcmt1","Pcmtd1","Pcmtd2","Pcnp","Pcnt","Pcnx1","Pcna","Pcnx2","Pcnx3","Pcnx4","Pcolce","PCOLCE2","Pcp2","Pcp4l1","Pcp4","Pcsk1n","Pcsk1","Pcsk2","Pcsk4","Pcsk5","Pcsk6","Pcsk7","Pctp","Pcsk9","Pcyox1","Pcyox1l","Pcyt1b","Pcyt1a","Pdap1","Pcyt2","Pdc","Pdcd10","Pdcd1lg2","Pdcd1","Pdcd2","Pdcd11","Pdcd2l","Pdcd5","Pdcd6","Pdcd4","Pdcd6ip","Pdcd7","Pdcl2","Pdcl","Pdcl3","Pde10a","Pde12","Pde11a","Pde1a","Pde1b","Pde1c","Pde2a","Pde3b","Pde3a","Pde4a","Pde4b","Pde4c","Pde4dip","Pde5a","Pde6a","Pde4d","Pde6c","Pde6b","Pde6d","Pde6g","Pde6h","Pde7a","Pde7b","Pde8a","Pde8b","Pdf","Pde9a","Pdgfa","Pdgfc","Pdgfd","Pdgfb","Pdgfrl","Pdgfra","Pdha1l1","Pdha1","Pdha2","Pdgfrb","Pdhb","Pdia2","Pdhx","Pdia5","Pdia3","Pdia4","Pdik1l","Pdia6","Pdilt","Pdk1","Pdk3","Pdk2","Pdk4","Pdlim1","Pdlim2","Pdlim3","Pdlim4","Pdlim5","Pdlim7","Pdp1","Pdp2","Pdpk1","Pdpr","Pdrg1","Pdpn","Pds5a","Pdss1","Pds5b","Pdss2","Pdxdc1","Pdxp","Pdxk","Pdx1","Pdyn","Pdzd11","Pdzd3","Pdzd2","Pdzd4","Pdzd7","Pdzd8","Pdzd9","Pdzk1","Pdzk1ip1","Pdzrn4","Pdzrn3","Pea15","Pebp1-ps1","Peak1","Pear1","Pebp4","Pebp1","Pef1","Pecr","Peg10","Peg12","Pecam1","Peg3","Peli1-ps1","Peli1","Peli2","Peli3","Pelo","Pelp1","Pemt","Pepd","Penk","Per1","Perm1","Per3","Perp","Per2","Pes1","Pet100","Pex10","Pex11a","Pex1","Pex11g","Pex11b","Pex12","Pex13","Pex14","Pex16","Pex26","Pex19","Pex2","Pex3","Pex5","Pex6","Pex5l","Pex7","Pf4","Pfdn1","Pfdn4","Pfdn2","Pfas","Pfdn5","Pfdn6","Pfkfb1","Pfkfb3","Pfkfb4","Pfkfb2","Pfkl","Pfkm","Pfn2","Pfkp","Pfn3","Pfn1","Pfpl","Pfn4","Pga5","Pgam1","Pgam2","Pgap1","Pgam5","Pgbd1","Pgap3","Pgap2","Pgbd2","Pgbd5","Pgc","Pgghg","Pgd","Pggt1b","Pgf","Pgk2","Pgls","Pgk1","Pglyrp1","Pglyrp2","Pglyrp3","Pglyrp3b","Pglyrp4","Pgm1","Pgm2","Pgm2l1","Pgm5","Pgm3","Pgpep1","Pgp","Pgpep1l","Pgr15l","Pgy2","Pgs1","Pgrmc2","Pgr","Pgrmc1","Pgy4","Phactr4","Phactr3","Phactr1","Phactr2","Phb-ps1","Phax","Phc1","Phb","Phb2","Phc2","Phc3","Phf10","Phf1","Phex","Phf11","Phf11b","Phf13","Phf12","Phf19","Phf14","Phf2","Phf20","Phf20l1","Phf21b","Phf23","Phf21a","Phf24","Phf3","Phf5a","Phf6","Phf7","Phf8","Phgr1","Phgdh","Phip","Phka1","Phka2","Phkb","Phkg1","Phkg2","Phlda1","Phlda2","Phlda3","Phldb2","Phldb1","Phldb3","Phlpp2","Phospho1","Phlpp1","Phospho2","Phox2a","Phox2b","Phpt1","Phtf1","Phrf1","Phtf2","Phyh","Phyhd1","Phyhip","Phyhipl","Pi15","Phykpl","Pi16","Pi4k2a","Pi4k2b","Pi4kb","Pianp","Pi4ka","Pias1","Pias2","Pias3","Pibf1","Pias4","Picalm","Pid1","Pidd1","Pick1","Piezo1","Pifo","Pif1","Piga","Piezo2","Pigb","Pigbos1","Pigf","Pigc","Pigh","Pigg","Pigk","Pigm","Pigl","Pigo","Pign","Pigp","Pigq","Pigs","Pigr","Pigt","Pigu","Pigv","Pigw","Pigx","Pigy","Pigz","Pih1d2","Pih1d1","Pih1d3","Pik3ap1","Pik3c2a","Pik3c2b","Pik3c2g","Pik3c3","Pik3ca","Pik3cb","Pik3cd","Pik3ip1","Pik3cg","Pik3r2","Pik3r3","Pik3r4","Pik3r5","Pik3r1","Pik3r6","Pilra","Pilrb","Pikfyve","Pim2","Pim1","Pim3","Pimreg","Pin4","Pin1","Pinlyp","Pinx1","Pink1","Pip","Pip4k2b","Pip4k2a","Pip4k2c","Pip4p1","Pip4p2","Pip5k1a","Pip5kl1","Pip5k1b","Pip5k1c","Pipox","Pira2","Pir","Pirt","Pirb","Pithd1","Pisd","Pitpna","Pitpnb","Pitpnc1","Pitpnm1","Pitpnm2","Pitpnm3","Pitrm1","Pitx1","Pitx3","Pitx2","Piwil1","Piwil2","Piwil4","Pja1","Pja2","Pjvk","Pkd1l2","Pkd1l1","Pkd1","Pkd1l3","Pkd2l1","Pkd2","Pkd2l2","Pkdrej","Pkdcc","Pkhd1","Pkia","Pkhd1l1","Pkig","Pkib","Pkmyt1","Pklr","Pkm","Pkn1","Pkn2","Pknox1","Pkn3","Pknox2","Pkp1","Pkp2","Pkp3","Pla1a","Pkp4","Pla2g10","Pla2g12a","Pla2g12b","Pla2g15","Pla2g16","Pla2g1b","Pla2g2c","Pla2g2a","Pla2g2e","Pla2g2d","Pla2g2f","Pla2g3","Pla2g4b","Pla2g4cl1","Pla2g4c","Pla2g4a","Pla2g4d","Pla2g4f","Pla2g4e","Pla2g5","Pla2g7","Pla2r1","Plaa","Plac1","Pla2g6","Plac8","Plac8l1","Plac9","Plag1","Plagl1","Plagl2","Plb1","Plaur","Plbd1","Plat","Plau","Plbd2","Plcb3","Plcb2","Plcb1","Plcb4","Plcd1","Plcd3","Plcd4","Plce1","Plch1","Plcg2","Plch2","Plcg1","Plcxd1","Plcl1","Plcl2","Plcxd3","Plcxd2","Pld3","Plcz1","Pld4","Pld2","Pld6","Pld1","Pld5","Plek","Plek2","Plekha2","Plekha1","Plec","Plekha3","Plekha4","Plekha6","Plekha7","Plekha5","Plekha8","Plekhb1","Plekhb2","Plekhd1","Plekhf1","Plekhf2","Plekhg1","Plekhg2","Plekhg3","Plekhg4","Plekhg7","Plekhg5","Plekhg6","Plekhh1","Plekhh3","Plekhh2","Plekhm1","Plekhj1","Plekhm2","Plekhm3","Plekhn1","Plekho2","Plekho1","Plet1","Plekhs1","Plgrkt","Plin1","Plin3","Plin2","Plin4","Plg","Plin5","Plk3","Plk2","Plk4","Plk1","Plk5","Pllp","Plod2","Plod1","Pln","Plod3","Plp2","Plp1","Plpbp","Plpp1","Plpp2","Plpp3","Plpp4","Plpp5","Plpp6","Plpp7","Plppr1","Plppr2","Plppr5","Plppr3","Plppr4","Plrg1","Pls1","Plscr2","Pls3","Plscr1","Plscr4","Plscr3","Plscr5","Pltp","Plvap","Plxdc1","Plxdc2","Plxna1","Plxna2","Plxna4","Plxna3","Plxnb1","Plxnb2","Plxnc1","Plxnb3","Plxnd1","Pm20d1","Pm20d2","Pmaip1","Pmel","Pmch","Pmepa1","Pmf1","Pmfbp1","Pmm2","Pmm1","Pml","Pmp2","Pmp22","Pmpca","Pmpcb","Pms1","Pms2","Pmvk","Pnck","Pnisr","Pnldc1","Pnkp","Pnkd","Pnlip","Pnliprp1","Pnma1","Pnma2","Pnliprp2","Pnma3","Pnma5","Pnma8a","Pnma8b","Pno1-ps1","Pnmt","Pnn","Pno1","Pnoc","Pnp","Pnpla1","Pnpla2","Pnpla3","Pnpla4","Pnpla5","Pnpla6","Pnpla8","Pnpla7","Pnpo","Pnrc1","Pnpt1","Pnrc2","Poc1a","Poc1b","Podn","Poc5","Podnl1","Podxl2","Podxl","Pof1b","Pofut2","Pofut1","Pogk","Poglut1","Pogz","Pola2","Pola1","Polb","Pold1","Pold2","Pold3","Pold4","Poldip2","Poldip3","Pole2","Pole4","Pole","Pole3","Polh","Polg2","Poli","Polg","Polk","Poll","Polm","Poln","Polq","Polr1a","Polr1b","Polr1d","Polr1c","Polr1e","Polr2a","Polr2b","Polr2c","Polr2d","Polr2e","Polr2h-ps1","Polr2f","Polr2g","Polr2h","Polr2i","Polr2j","Polr2l","Polr2l-ps1","Polr2k","Polr3b","Polr2m","Polr3d","Polr3a","Polr3c","Polr3d-ps1","Polr3f","Polr3e","Polr3g","Polr3gl","Polr3h","Pom121l12","Polrmt","Polr3k","Pom121","Pom121l2","Pomgnt2","Pomgnt1","Pomk","Pomp","Pomc","Pomt2","Pomt1","Pon2","Pon3","Pon1","Pop1","Pop4","Pop5","Pop7","Popdc3","Popdc2","Porcn","Por","Postn","Pot1b","Pot1","Potec","Potef","Poteh","Poteg","Potem","Pou2af1","Pou1f1","Pou2f1","Pou2f3","Pou2f2","Pou3f1","Pou3f2","Pou3f3","Pou3f4","Pou4f1","Pou4f3","Pou4f2","Pou5f2","Pou6f2","Pou5f1","Pou6f1","Pp2d1","Ppa2","Ppa1","Ppan","Ppard","Ppargc1b","Ppara","Ppbp","Ppat","Ppcdc","Ppargc1a","Ppcs","Pparg","Ppdpf","Ppef1","Ppef2","Ppfia1","Ppfia2","Ppfia3","Ppfia4","Pphln1","Ppfibp1","Ppfibp2","Ppial4d","Ppia","Ppial4g","Ppic","Ppid-ps1","Ppib","Ppid","Ppidl1","Ppie","Ppig","Ppif","Ppih","Ppil1","Ppil2","Ppil4","Ppil3","Ppil6","Ppip5k1","Ppip5k2","Ppl","Ppm1a","Ppm1b","Ppm1d","Ppm1e","Ppm1g","Ppm1f","Ppm1j","Ppm1h","Ppm1m","Ppm1k","Ppm1l","Ppm1n","Ppme1","Ppp1cb-ps","Ppox","Ppp1ca","Ppp1cb","Ppp1r11","Ppp1r10","Ppp1cc","Ppp1r12b","Ppp1r12a","Ppp1r13b","Ppp1r12c","Ppp1r13l","Ppp1r14a","Ppp1r14b","Ppp1r14c","Ppp1r14d","Ppp1r15a","Ppp1r15b","Ppp1r16a","Ppp1r17","Ppp1r16b","Ppp1r18","Ppp1r1a","Ppp1r1c","Ppp1r1b","Ppp1r2","Ppp1r2-ps1","Ppp1r26","Ppp1r21","Ppp1r27","Ppp1r32","Ppp1r35","Ppp1r36","Ppp1r37","Ppp1r3a","Ppp1r3b","Ppp1r3c","Ppp1r3d","Ppp1r3f","Ppp1r3e","Ppp1r3g","Ppp1r42","Ppp1r8","Ppp1r7","Ppp1r9a","Ppp1r9b","Ppp2cb","Ppp2r1a","Ppp2ca","Ppp2r1b","Ppp2r2c","Ppp2r2a","Ppp2r2b","Ppp2r2d","Ppp2r3a","Ppp2r3b","Ppp2r3c","Ppp2r5a","Ppp2r5b","Ppp2r5c","Ppp2r5d","Ppp2r5e","Ppp3cb","Ppp3ca","Ppp3cc","Ppp3r1","Ppp3r2","Ppp4c","Ppp4r1","Ppp4r3c","Ppp4r3a","Ppp4r2","Ppp4r3b","Ppp4r4","Ppp6r1","Ppp6c","Ppp6r2","Ppp5c","Ppp6r3","Pprc1","Ppt1","Ppt2","Pptc7","Ppy","Ppwd1","Pqbp1","Pqlc1","Pqlc2","Pradc1","Pqlc3","Praf2","Prag1","Pram1","Pramef12","Prame","Pramef17","Pramef20","pramef20l","Pramef25","Pramef5","Pramef6","Pramef27","Pramef8","Pramel","Pramel7","Pramel3","Pramel6","Prap1","Prb1","Prb3","Prc1","Prcd","Prcc","Prcp","Prdm1","Prdm11","Prdm12","Prdm10","Prdm13","Prdm14","Prdm15","Prdm16","Prdm2","Prdm4","Prdm5","Prdm8","Prdm6","Prdm9","Prdx1l1","Prdx1","Prdx2","Prdx3","Prdx4","Prdx5","Prdx6","Prelid3a","Prelid1","Preb","Prelid2","Prelid3b","Prep","Prepl","Prelp","Prex1","Prex2","Prg3","Prg2","Prf1","Prg4","Prh1","Prickle2","Prickle1","Prickle4","Prickle3","Prim1","Prima1","Primpol","Prim2","Prkaa1","Prkab1","Prkab2","Prkaa2","Prkaca","Prkacb","Prkag2","Prkag3","Prkag1","Prkar1a-ps1","Prkar1a","Prkar1b","Prkar2a","Prkar2b","Prkcb","Prkca","Prkcg","Prkce","Prkcd","Prkcsh","Prkch","Prkci","Prkcq","Prkd2","Prkd1","Prkd3","Prkcz","Prkdc","Prkg2","Prkg1","Prkra","Prkrip1","Prkx","Prkn","Prl2a1","Prl2b1","Prl2c1","Prl3a1","Prl3b1","Prl3d1","Prl3c1","Prl","Prl3d2","Prl4a1","Prl5a1","Prl3d4","Prl5a2","Prl6a1","Prl7a3","Prl7a4","Prl7d1","Prl7b1","Prl8a3","Prl8a2","Prl8a4","Prl8a7","Prl8a5","Prl8a9","Prlh","Prlhr","Prm2","Prm1","Prm3","Prlr","Prmt2","Prmt1","Prmt3","Prmt5","Prmt6","Prmt7","Prmt8","Prmt9","Prnd","Prob1","Proca1","Prnp","Procr","Prodh1","Proc","Prodh2","Prok1","Prokr1","Prok2","Prokr2","Prom2","Prop1","Prorsd1","Prom1","Proser2","Pros1","Proser1","Proser3","Prox1","Prox2","Prp2","Prp15","Proz","Prp2l1","Prpf18","Prpf31","Prpf3","Prpf19","Prpf38a","Prpf38b","Prpf39","Prpf4","Prpf40a","Prpf40b","Prpf4b","Prpf6","Prpf8","Prpmp5","Prps1l1","Prph","Prps1","Prph2","Prps2","Prpsap1","Prpsap2","Prr11","Prr13","Prr14","Prr12","Prr15","Prr14l","Prr15l","Prr16","Prr18","Prr20e","Prr21","Prr19","Prr23d2","Prr23a","Prr22","Prr29","Prr27","Prr30","Prr32","Prr34","Prr33","Prr3","Prr35","Prr36","Prr7","Prr4","Prr5","Prr5l","Prr9","Prrc1","Prrc2a","Prrc2c","Prrc2b","Prrg1","Prrg2","Prrg3","Prrg4","Prrt1b","Prrt1","Prrt3","Prrt2","Prrt4","Prrx2","Prrx1","Prss1","Prss16","Prss12","Prss21","Prss2","Prss23","Prss27","Prss22","Prss29","Prss3","Prss30","Prss32","Prss33","Prss34","Prss35","Prss36","Prss37","Prss38","Prss39","Prss3b","Prss42","Prss40","Prss41","Prss44","Prss45","Prss46","Prss47","Prss48","Prss50","Prss53","Prss54","Prss55","Prss56","Prss57","Prss58","Prtfdc1","Prss8","Prtn3","Prune1","Prtg","Prune2","Prx","Psapl1","Psca","Psat1","Psap","Psd2","Psd","Psd4","Psd3","Psenen","Psg16","Psg29","Psg19","Psen2","Psen1","Psgb1","Pskh1","Psma1","Psip1","Psma2","Psma3l","Psma3","Psma4","Psma5","Psma6","Psma8","Psma7","Psmb1","Psmb11","Psmb10","Psmb2","Psmb3","Psmb4","Psmb5","Psmb6","Psmb7","Psmb8","Psmc1","Psmc2","Psmb9","Psmc3ip","Psmc3","Psmc4","Psmc6","Psmd10","Psmc5","Psmd1","Psmd11","Psmd12","Psmd13","Psmd14","Psmd2","Psmd3","Psmd4","Psmd5","Psmd6","Psmd7","Psmd8","Psme1-ps1","Psmd9","Psme1","Psme2","Psmf1","Psme3","Psmg1","Psme4","Psmg3","Psmg2","Psmg4","Psors1c2","Pspc1","Pspn","Psph","Psrc1","Pstpip1","Psx1","Pstk","Pstpip2","Ptar1","Ptbp2","Ptafr","Ptcd1","Ptbp1","Ptcd2","Ptbp3","Ptcd3","Ptchd1","Ptchd3","Ptch2","Ptchd4","Ptcra","Ptch1","Ptdss1","Ptdss2","Pter","Ptf1a","Ptgdr","Ptgdr2","Ptgdrl","Ptger1","Ptgds","Ptger2","Ptges2","Pten","Ptges","Ptger4","Ptger3","Ptges3l","Ptges3","Ptges3l1","Ptgir","Ptgfrn","Ptgfr","Ptgr1","Ptgr2","Ptgis","Pth2","Ptgs1","Pth2r","Pth1r","Pthlh","Pth","Ptk6","Ptk7","Ptma","Ptk2","Ptms","Ptn","Ptk2b","Ptov1","Ptp4a2","Ptgs2","Ptp4a1","Ptp4a3","Ptpa","Ptpdc1","Ptpmt1","Ptpn12","Ptpn1","Ptpn13","Ptpn14","Ptpn18","Ptpn11","Ptpn2","Ptpn20","Ptpn21","Ptpn23","Ptpn22","Ptpn3","Ptpn4","Ptpn5","Ptpn6","Ptpn7","Ptpn9","Ptpra","Ptprcap","Ptprb","Ptpre","Ptprc","Ptprd","Ptprf","Ptprg","Ptprh","Ptprj","Ptprk","Ptprm","Ptprn","Ptprn2","Ptpro","Ptprq","Ptprr","Ptprs","Ptprt","Ptpru","Ptprv","Ptprz1","Ptrh1","Ptrh2","Ptrhd1","Pts","Pttg1","Pttg1ip","Ptx3","Ptx4","Pudp","Puf60","Pum1","Pum2","Pum3","Pura","Purb","Purg","Pus1","Pus10","Pus3","Pus7","Pus7l","Pusl1","Pvalb","PVR","Pvrig","Pvt1","Pwp1","Pwp2","Pwwp2a","Pwwp2b","Pxdc1","Pxdn","Pxk","Pxmp2","Pxmp4","Pxn","Pxt1","Pxylp1","Pycard","Pycr1","Pycr2","Pycr3","Pygb","Pygl","Pygm","Pygo1","Pygo2","Pym1","Pyroxd1","Pyroxd2","Pyurf","Pyy","Pzp","Qars","Qdpr","Qk","Qki","Qpct","Qpctl","Qprt","Qrfp","Qrfpr","Qrich1","Qrich2","Qrsl1","Qser1","Qsox1","Qsox2","Qtrt1","Qtrt2","R3hcc1","R3hcc1l","R3hdm1","R3hdm2","R3hdm4","R3hdml","Rab1-ps1","Rab10","Rab11a","Rab11b","Rab11fip1","Rab11fip2","Rab11fip3","Rab11fip4","Rab11fip5","Rab12","Rab13","Rab14","Rab15","Rab17","Rab18","Rab19","Rab1a","Rab1b","Rab1b-ps1","Rab20","Rab21","Rab22a","Rab23","Rab24","Rab25","Rab26","Rab27a","Rab27b","Rab28","Rab29","Rab2a","Rab2b","Rab30","Rab31","Rab32","Rab33a","Rab33b","Rab34","Rab35","Rab36","Rab37","Rab38","Rab39a","Rab3a","Rab3b","Rab3c","Rab3d","Rab3gap1","Rab3gap2","Rab3il1","Rab3ip","Rab40b","Rab40c","Rab42","Rab43","Rab44","Rab4a","Rab4b","Rab5a","Rab5al1","Rab5b","Rab5c","Rab6a","Rab6b","Rab7a","Rab7b","Rab8a","Rab8b","Rab9a","Rab9b","Rabac1","Rabep1","Rabep2","Rabepk","Rabgap1","Rabgap1l","Rabgef1","Rabggta","Rabggta-ps1","Rabggtb","Rabif","Rabl2","Rabl3","Rabl6","Rac1","Rac2","Rac3","Racgap1","Rack1","Rad1","Rad17","Rad18","Rad21","Rad21l1","Rad23a","Rad23b","Rad50","Rad51","Rad51ap1","Rad51ap2","Rad51b","Rad51c","Rad51d","Rad52","Rad54b","Rad54l","Rad54l2","Rad9a","Rad9b","Radil","Rae1","Raet1c","Raet1d","Raet1e","Raet1l","Raf1","Rag1","Rag2","Rai1","Rai14","Rai2","Rala","Ralb","Ralbp1","Ralgapa1","Ralgapa2","Ralgapb","Ralgds","Ralgps1","Ralgps2","Raly","Ralyl","Ramp1","Ramp2","Ramp3","Ran","Ranbp1","Ranbp10","Ranbp17","Ranbp2","Ranbp3","Ranbp3l","Ranbp6","Ranbp9","Rangap1","Rangrf","Rap1a","Rap1b","Rap1gap","Rap1gap2","Rap1gds1","Rap2a","Rap2b","Rap2c","Rapgef1","Rapgef2","Rapgef3","Rapgef4","Rapgef5","Rapgef6","Rapgefl1","Raph1","Rapsn","Rara","Rarb","Rarg","Rarres1","Rarres2","Rars","Rars2","Rasa1","Rasa2","Rasa3","Rasa4","Rasal1","Rasal2","Rasal3","Rasd1","Rasd2","Rasef","Rasgef1a","Rasgef1b","Rasgef1c","Rasgrf1","Rasgrf2","Rasgrp1","Rasgrp2","Rasgrp3","Rasgrp4","Rasip1","Rasl10a","Rasl10b","Rasl11a","Rasl11b","Rasl12","Rasl2-9","Rassf1","Rassf10","Rassf2","Rassf3","Rassf4","Rassf5","Rassf6","Rassf7","Rassf8","Rassf9","RatNP-3b","Raver1","Raver2","Rax","Rb1","Rb1cc1","Rbak","Rbbp4","Rbbp5","Rbbp6","Rbbp7","Rbbp8","Rbbp8nl","Rbbp9","Rbck1","Rbfa","Rbfox1","Rbfox2","Rbfox3","Rbks","Rbl1","Rbl2","Rbm10","Rbm11","Rbm12","Rbm12b","Rbm14","Rbm15","Rbm15b","Rbm17","Rbm18","Rbm19","Rbm20","Rbm22","Rbm24","Rbm25","Rbm25l1","Rbm26","Rbm27","Rbm28","Rbm3","Rbm31y","Rbm33","Rbm34","Rbm38","Rbm39","Rbm4","Rbm41","Rbm42","Rbm43","Rbm44","Rbm45","Rbm46","Rbm47","Rbm48","Rbm4b","Rbm5","Rbm6","Rbm7","Rbm8a","Rbms1","Rbms2","Rbms3","Rbmx","Rbmx2","Rbmxl1","Rbmxl1b","Rbmxl2","Rbmy1j","Rbp1","Rbp2","Rbp3","Rbp4","Rbp7","Rbpj","Rbpjl","Rbpjl2","Rbpms","Rbpms2","Rbsn","Rbx1","Rc3h1","Rc3h2","Rcan1","Rcan2","Rcan3","Rcbtb1","Rcbtb2","Rcc1","Rcc1l","Rcc2","Rccd1","Rce1","Rchy1","Rcl1","Rcn1","Rcn2","Rcn3","Rcor1","Rcor2","Rcor2l1","Rcor3","Rcrg1-ps1","Rcrg1-ps10","Rcrg1-ps11","Rcrg1-ps12","Rcrg1-ps13","Rcrg1-ps14","Rcrg1-ps15","Rcrg1-ps16","Rcrg1-ps17","Rcrg1-ps18","Rcrg1-ps19","Rcrg1-ps2","Rcrg1-ps20","Rcrg1-ps21","Rcrg1-ps22","Rcrg1-ps23","Rcrg1-ps24","Rcrg1-ps25","Rcrg1-ps26","Rcrg1-ps27","Rcrg1-ps28","Rcrg1-ps29","Rcrg1-ps3","Rcrg1-ps30","Rcrg1-ps31","Rcrg1-ps32","Rcrg1-ps33","Rcrg1-ps34","Rcrg1-ps35","Rcrg1-ps36","Rcrg1-ps37","Rcrg1-ps38","Rcrg1-ps39","Rcrg1-ps4","Rcrg1-ps40","Rcrg1-ps5","Rcrg1-ps6","Rcrg1-ps7","Rcrg1-ps8","Rcrg1-ps9","Rcrg2-ps1","Rcrg2-ps2","Rcrg2-ps3","Rcrg2-ps4","Rcrg2-ps5","Rcrg2-ps6","Rcsd1","Rcvrn","Rd3","Rd3l","Rdh10","Rdh11","Rdh12","Rdh13","Rdh14","Rdh16","Rdh5","Rdh7","Rdh8","Rdm1","Rdx","Rec114","Rec8","Reck","Recql","Recql4","Recql5","Reep1","Reep2","Reep3","Reep4","Reep5","Reep6","Reg1a","Reg3a","Reg3b","Reg3g","Reg4","Rel","Rela","Relb","Rell1","Rell2","Reln","Relt","Rem1","Rem2","Ren","Renbp","Rep15","Repin1","Reps1","Reps2","Rer1","Rere","Rerg","Rergl","Resp18","Rest","Ret","Retn","Retnla","Retnlb","Retnlg","Retreg1","Retreg2","Retreg3","Retsat","Rev1","Rev3l","Rex1bd","Rex2","Rexo1","Rexo1l1-ps1","Rexo2","Rexo4","Rexo5","Rfc1","Rfc2","Rfc3","Rfc4","Rfc5","Rfesd","Rffl","Rfk","Rflna","Rflnb","Rfng","Rfpl4a","Rfpl4b","Rft1","Rftn1","Rftn2","Rfwd2","Rfwd3","Rfx1","Rfx2","Rfx3","Rfx4","Rfx5","Rfx6","Rfx7","Rfx8","Rfxank","Rfxap","Rfxapl1","Rgcc","RGD1302996","RGD1303003","RGD1304554","RGD1304567","RGD1304587","RGD1304622","RGD1304624","RGD1304694","RGD1304728","RGD1304745","RGD1304770","RGD1304810","RGD1304870","RGD1304884","RGD1304963","RGD1305014","RGD1305089","RGD1305110","RGD1305178","RGD1305184","RGD1305207","RGD1305298","RGD1305347","RGD1305350","RGD1305455","RGD1305464","RGD1305645","RGD1305704","RGD1305713","RGD1305733","RGD1305807","RGD1305938","RGD1306063","RGD1306072","RGD1306148","RGD1306186","RGD1306195","RGD1306227","RGD1306233","RGD1306271","RGD1306282","RGD1306441","RGD1306474","RGD1306484","RGD1306502","RGD1306519","RGD1306556","RGD1306704","RGD1306746","RGD1306750","RGD1306782","RGD1306941","RGD1306954","RGD1306995","RGD1307100","RGD1307182","RGD1307235","RGD1307443","RGD1307461","RGD1307537","RGD1307554","RGD1307595","RGD1307603","RGD1307621","RGD1307752","RGD1307782","RGD1307916","RGD1307929","RGD1307947","RGD1308005","RGD1308065","RGD1308106","RGD1308117","RGD1308134","RGD1308143","RGD1308147","RGD1308195","RGD1308428","RGD1308430","RGD1308544","RGD1308564","RGD1308601","RGD1308706","RGD1308742","RGD1308750","RGD1308751","RGD1308775","RGD1308878","RGD1309028","RGD1309036","RGD1309049","RGD1309079","RGD1309104","RGD1309106","RGD1309110","RGD1309139","RGD1309170","RGD1309291","RGD1309310","RGD1309350","RGD1309362","RGD1309489","RGD1309534","RGD1309540","RGD1309594","RGD1309621","RGD1309651","RGD1309730","RGD1309748","RGD1309779","RGD1309808","RGD1309870","RGD1309998","RGD1310081","RGD1310110","RGD1310127","RGD1310166","RGD1310209","RGD1310212","RGD1310352","RGD1310429","RGD1310495","RGD1310507","RGD1310553","RGD1310587","RGD1310602","RGD1310717","RGD1310819","RGD1310852","RGD1310935","RGD1310951","RGD1311084","RGD1311164","RGD1311251","RGD1311300","RGD1311318","RGD1311343","RGD1311345","RGD1311447","RGD1311517","RGD1311575","RGD1311595","RGD1311703","RGD1311739","RGD1311744","RGD1311745","RGD1311847","RGD1311892","RGD1311899","RGD1311933","RGD1311946","RGD1312005","RGD1359108","RGD1359127","RGD1359158","RGD1359290","RGD1359334","RGD1359449","RGD1359508","RGD1359634","RGD1559424","RGD1559441","RGD1559458","RGD1559459","RGD1559460","RGD1559461","RGD1559464","RGD1559482","RGD1559499","RGD1559508","RGD1559512","RGD1559513","RGD1559516","RGD1559519","RGD1559532","RGD1559534","RGD1559536","RGD1559545","RGD1559573","RGD1559574","RGD1559575","RGD1559578","RGD1559579","RGD1559588","RGD1559600","RGD1559602","RGD1559607","RGD1559622","RGD1559629","RGD1559639","RGD1559644","RGD1559647","RGD1559654","RGD1559662","RGD1559667","RGD1559669","RGD1559677","RGD1559679","RGD1559683","RGD1559707","RGD1559708","RGD1559710","RGD1559714","RGD1559724","RGD1559726","RGD1559731","RGD1559743","RGD1559747","RGD1559752","RGD1559769","RGD1559772","RGD1559781","RGD1559786","RGD1559795","RGD1559804","RGD1559806","RGD1559808","RGD1559810","RGD1559821","RGD1559833","RGD1559839","RGD1559854","RGD1559859","RGD1559877","RGD1559887","RGD1559890","RGD1559891","RGD1559892","RGD1559896","RGD1559902","RGD1559903","RGD1559908","RGD1559909","RGD1559912","RGD1559916","RGD1559921","RGD1559924","RGD1559935","RGD1559938","RGD1559940","RGD1559948","RGD1559950","RGD1559951","RGD1559955","RGD1559960","RGD1559962","RGD1559965","RGD1559967","RGD1559970","RGD1559972","RGD1559982","RGD1559995","RGD1559999","RGD1560010","RGD1560015","RGD1560017","RGD1560028","RGD1560034","RGD1560065","RGD1560069","RGD1560073","RGD1560076","RGD1560088","RGD1560096","RGD1560099","RGD1560105","RGD1560108","RGD1560109","RGD1560110","RGD1560112","RGD1560119","RGD1560124","RGD1560146","RGD1560162","RGD1560163","RGD1560171","RGD1560180","RGD1560186","RGD1560203","RGD1560207","RGD1560208","RGD1560212","RGD1560225","RGD1560227","RGD1560231","RGD1560234","RGD1560242","RGD1560262","RGD1560263","RGD1560281","RGD1560288","RGD1560289","RGD1560291","RGD1560302","RGD1560303","RGD1560314","RGD1560324","RGD1560325","RGD1560330","RGD1560333","RGD1560337","RGD1560341","RGD1560348","RGD1560349","RGD1560350","RGD1560353","RGD1560357","RGD1560382","RGD1560394","RGD1560398","RGD1560402","RGD1560408","RGD1560412","RGD1560429","RGD1560431","RGD1560436","RGD1560444","RGD1560455","RGD1560462","RGD1560464","RGD1560474","RGD1560482","RGD1560484","RGD1560492","RGD1560510","RGD1560512","RGD1560513","RGD1560523","RGD1560527","RGD1560533","RGD1560539","RGD1560544","RGD1560554","RGD1560559","RGD1560568","RGD1560585","RGD1560590","RGD1560608","RGD1560617","RGD1560623","RGD1560633","RGD1560640","RGD1560648","RGD1560661","RGD1560683","RGD1560687","RGD1560689","RGD1560697","RGD1560700","RGD1560703","RGD1560718","RGD1560723","RGD1560729","RGD1560730","RGD1560738","RGD1560771","RGD1560775","RGD1560784","RGD1560789","RGD1560795","RGD1560797","RGD1560801","RGD1560806","RGD1560813","RGD1560815","RGD1560821","RGD1560824","RGD1560826","RGD1560831","RGD1560842","RGD1560844","RGD1560854","RGD1560857","RGD1560860","RGD1560872","RGD1560883","RGD1560892","RGD1560901","RGD1560917","RGD1560925","RGD1560927","RGD1560931","RGD1560936","RGD1560954","RGD1560958","RGD1560961","RGD1560975","RGD1560979","RGD1560983","RGD1560986","RGD1560987","RGD1561017","RGD1561024","RGD1561034","RGD1561050","RGD1561060","RGD1561079","RGD1561102","RGD1561106","RGD1561111","RGD1561113","RGD1561114","RGD1561118","RGD1561134","RGD1561137","RGD1561143","RGD1561145","RGD1561148","RGD1561149","RGD1561150","RGD1561151","RGD1561154","RGD1561157","RGD1561161","RGD1561185","RGD1561192","RGD1561195","RGD1561206","RGD1561212","RGD1561215","RGD1561219","RGD1561224","RGD1561226","RGD1561230","RGD1561231","RGD1561232","RGD1561236","RGD1561246","RGD1561251","RGD1561252","RGD1561276","RGD1561277","RGD1561286","RGD1561288","RGD1561305","RGD1561306","RGD1561310","RGD1561317","RGD1561318","RGD1561323","RGD1561327","RGD1561333","RGD1561341","RGD1561381","RGD1561382","RGD1561395","RGD1561410","RGD1561413","RGD1561415","RGD1561426","RGD1561430","RGD1561440","RGD1561442","RGD1561445","RGD1561463","RGD1561444","RGD1561453","RGD1561465","RGD1561497","RGD1561481","RGD1561508","RGD1561520","RGD1561517","RGD1561525","RGD1561551","RGD1561552","RGD1561558","RGD1561572","RGD1561557","RGD1561582","RGD1561560","RGD1561575","RGD1561585","RGD1561589","RGD1561590","RGD1561594","RGD1561627","RGD1561620","RGD1561618","RGD1561635","RGD1561636","RGD1561658","RGD1561661","RGD1561689","RGD1561648","RGD1561671","RGD1561662","RGD1561684","RGD1561694","RGD1561667","RGD1561709","RGD1561704","RGD1561722","RGD1561715","RGD1561699","RGD1561729","RGD1561736","RGD1561754","RGD1561738","RGD1561766","RGD1561755","RGD1561767","RGD1561730","RGD1561771","RGD1561777","RGD1561780","RGD1561787","RGD1561788","RGD1561803","RGD1561795","RGD1561808","RGD1561796","RGD1561812","RGD1561821","RGD1561827","RGD1561843","RGD1561847","RGD1561853","RGD1561860","RGD1561849","RGD1561871","RGD1561877","RGD1561870","RGD1561886","RGD1561890","RGD1561897","RGD1561908","RGD1561906","RGD1561911","RGD1561919","RGD1561916","RGD1561935","RGD1561944","RGD1561958","RGD1561986","RGD1561977","RGD1561987","RGD1562020","RGD1562011","RGD1562024","RGD1562033","RGD1562029","RGD1562035","RGD1561998","RGD1562036","RGD1562055","RGD1562039","RGD1562066","RGD1562067","RGD1562068","RGD1562073","RGD1562080","RGD1562088","RGD1562090","RGD1562104","RGD1562118","RGD1562134","RGD1562107","RGD1562114","RGD1562139","RGD1562136","RGD1562140","RGD1562143","RGD1562146","RGD1562152","RGD1562156","RGD1562171","RGD1562178","RGD1562187","RGD1562196","RGD1562218","RGD1562259","RGD1562229","RGD1562266","RGD1562265","RGD1562281","RGD1562272","RGD1562289","RGD1562299","RGD1562290","RGD1562306","RGD1562355","RGD1562310","RGD1562339","RGD1562319","RGD1562387","RGD1562381","RGD1562394","RGD1562378","RGD1562399","RGD1562400","RGD1562402","RGD1562392","RGD1562404","RGD1562415","RGD1562420","RGD1562431","RGD1562423","RGD1562451","RGD1562433","RGD1562461","RGD1562458","RGD1562460","RGD1562462","RGD1562465","RGD1562485","RGD1562494","RGD1562492","RGD1562507","RGD1562508","RGD1562517","RGD1562521","RGD1562515","RGD1562524","RGD1562525","RGD1562545","RGD1562542","RGD1562532","RGD1562558","RGD1562569","RGD1562577","RGD1562598","RGD1562603","RGD1562613","RGD1562614","RGD1562636","RGD1562608","RGD1562618","RGD1562625","RGD1562641","RGD1562638","RGD1562650","RGD1562652","RGD1562690","RGD1562667","RGD1562683","RGD1562700","RGD1562699","RGD1562660","RGD1562704","RGD1562725","RGD1562739","RGD1562753","RGD1562726","RGD1562747","RGD1562755","RGD1562771","RGD1562758","RGD1562774","RGD1562775","RGD1562781","RGD1562776","RGD1562794","RGD1562801","RGD1562811","RGD1562818","RGD1562819","RGD1562820","RGD1562833","RGD1562844","RGD1562835","RGD1562851","RGD1562847","RGD1562863","RGD1562871","RGD1562890","RGD1562885","RGD1562914","RGD1562917","RGD1562936","RGD1562937","RGD1562932","RGD1562960","RGD1562980","RGD1562992","RGD1563029","RGD1562987","RGD1563034","RGD1563036","RGD1563055","RGD1563049","RGD1563057","RGD1563056","RGD1563060","RGD1563066","RGD1563097","RGD1563072","RGD1563100","RGD1563099","RGD1563124","RGD1563104","RGD1563134","RGD1563135","RGD1563145","RGD1563136","RGD1563157","RGD1563150","RGD1563159","RGD1563200","RGD1563217","RGD1563222","RGD1563232","RGD1563242","RGD1563234","RGD1563231","RGD1563270","RGD1563285","RGD1563263","RGD1563294","RGD1563295","RGD1563300","RGD1563301","RGD1563302","RGD1563314","RGD1563322","RGD1563330","RGD1563307","RGD1563323","RGD1563340","RGD1563334","RGD1563346","RGD1563351","RGD1563352","RGD1563349","RGD1563356","RGD1563375","RGD1563365","RGD1563354","RGD1563378","RGD1563392","RGD1563410","RGD1563402","RGD1563412","RGD1563405","RGD1563400","RGD1563445","RGD1563441","RGD1563451","RGD1563459","RGD1563486","RGD1563483","RGD1563482","RGD1563489","RGD1563492","RGD1563496","RGD1563502","RGD1563503","RGD1563527","RGD1563535","RGD1563537","RGD1563545","RGD1563546","RGD1563551","RGD1563554","RGD1563563","RGD1563570","RGD1563581","RGD1563584","RGD1563562","RGD1563578","RGD1563591","RGD1563590","RGD1563601","RGD1563604","RGD1563606","RGD1563613","RGD1563636","RGD1563620","RGD1563656","RGD1563667","RGD1563668","RGD1563679","RGD1563709","RGD1563690","RGD1563705","RGD1563680","RGD1563692","RGD1563725","RGD1563716","RGD1563743","RGD1563738","RGD1563739","RGD1563714","RGD1563747","RGD1563749","RGD1563780","RGD1563757","RGD1563812","RGD1563835","RGD1563834","RGD1563818","RGD1563815","RGD1563847","RGD1563850","RGD1563861","RGD1563903","RGD1563894","RGD1563905","RGD1563931","RGD1563888","RGD1563917","RGD1563937","RGD1563947","RGD1563956","RGD1563943","RGD1563941","RGD1563958","RGD1563963","RGD1563962","RGD1563991","RGD1563978","RGD1564021","RGD1564026","RGD1563986","RGD1564031","RGD1564040","RGD1564053","RGD1564062","RGD1564095","RGD1564100","RGD1564086","RGD1564097","RGD1564125","RGD1564126","RGD1564131","RGD1564133","RGD1564129","RGD1564138","RGD1564159","RGD1564148","RGD1564149","RGD1564162","RGD1564166","RGD1564172","RGD1564167","RGD1564177","RGD1564179","RGD1564193","RGD1564171","RGD1564225","RGD1564236","RGD1564240","RGD1564243","RGD1564277","RGD1564268","RGD1564275","RGD1564247","RGD1564278","RGD1564284","RGD1564292","RGD1564301","RGD1564318","RGD1564306","RGD1564308","RGD1564313","RGD1564320","RGD1564319","RGD1564343","RGD1564325","RGD1564324","RGD1564366","RGD1564347","RGD1564378","RGD1564382","RGD1564386","RGD1564390","RGD1564380","RGD1564392","RGD1564405","RGD1564416","RGD1564400","RGD1564409","RGD1564433","RGD1564425","RGD1564447","RGD1564477","RGD1564463","RGD1564492","RGD1564482","RGD1564480","RGD1564512","RGD1564513","RGD1564515","RGD1564536","RGD1564534","RGD1564571","RGD1564574","RGD1564548","RGD1564541","RGD1564578","RGD1564580","RGD1564581","RGD1564583","RGD1564585","RGD1564587","RGD1564597","RGD1564606","RGD1564599","RGD1564613","RGD1564627","RGD1564617","RGD1564614","RGD1564637","RGD1564645","RGD1564649","RGD1564651","RGD1564650","RGD1564657","RGD1564664","RGD1564665","RGD1564698","RGD1564696","RGD1564699","RGD1564702","RGD1564712","RGD1564730","RGD1564748","RGD1564744","RGD1564781","RGD1564764","RGD1564783","RGD1564770","RGD1564786","RGD1564795","RGD1564798","RGD1564800","RGD1564814","RGD1564801","RGD1564807","RGD1564804","RGD1564836","RGD1564827","RGD1564839","RGD1564845","RGD1564849","RGD1564855","RGD1564854","RGD1564865","RGD1564866","RGD1564883","RGD1564885","RGD1564915","RGD1564897","RGD1564899","RGD1564887","RGD1564933","RGD1564920","RGD1564937","RGD1564941","RGD1564956","RGD1564963","RGD1564958","RGD1564972","RGD1564955","RGD1564974","RGD1564981","RGD1564999","RGD1565032","RGD1565010","RGD1565017","RGD1565046","RGD1565047","RGD1565033","RGD1565048","RGD1565054","RGD1565056","RGD1565058","RGD1565063","RGD1565057","RGD1565066","RGD1565059","RGD1565083","RGD1565086","RGD1565071","RGD1565088","RGD1565102","RGD1565107","RGD1565117","RGD1565119","RGD1565131","RGD1565129","RGD1565143","RGD1565158","RGD1565170","RGD1565166","RGD1565183","RGD1565212","RGD1565245","RGD1565258","RGD1565260","RGD1565272","RGD1565222","RGD1565286","RGD1565288","RGD1565291","RGD1565297","RGD1565299","RGD1565301","RGD1565317","RGD1565329","RGD1565331","RGD1565323","RGD1565332","RGD1565338","RGD1565346","RGD1565356","RGD1565361","RGD1565365","RGD1565355","RGD1565367","RGD1565369","RGD1565395","RGD1565372","RGD1565400","RGD1565403","RGD1565410","RGD1565413","RGD1565422","RGD1565415","RGD1565435","RGD1565429","RGD1565438","RGD1565430","RGD1565478","RGD1565459","RGD1565472","RGD1565462","RGD1565495","RGD1565498","RGD1565533","RGD1565534","RGD1565541","RGD1565548","RGD1565560","RGD1565565","RGD1565566","RGD1565569","RGD1565573","RGD1565598","RGD1565590","RGD1565588","RGD1565600","RGD1565607","RGD1565611","RGD1565627","RGD1565634","RGD1565617","RGD1565622","RGD1565648","RGD1565616","RGD1565641","RGD1565651","RGD1565653","RGD1565657","RGD1565655","RGD1565661","RGD1565660","RGD1565664","RGD1565665","RGD1565679","RGD1565689","RGD1565685","RGD1565732","RGD1565693","RGD1565695","RGD1565725","RGD1565735","RGD1565752","RGD1565762","RGD1565753","RGD1565767","RGD1565779","RGD1565766","RGD1565784","RGD1565785","RGD1565798","RGD1565806","RGD1565822","RGD1565829","RGD1565844","RGD1565862","RGD1565894","RGD1565866","RGD1565900","RGD1565902","RGD1565912","RGD1565904","RGD1565939","RGD1565945","RGD1565956","RGD1565965","RGD1565959","RGD1565977","RGD1565987","RGD1565988","RGD1565989","RGD1565996","RGD1566007","RGD1566033","RGD1566006","RGD1566008","RGD1566035","RGD1566037","RGD1566048","RGD1566059","RGD1566060","RGD1566061","RGD1566067","RGD1566078","RGD1566093","RGD1566085","RGD1566100","RGD1566099","RGD1566129","RGD1566135","RGD1566136","RGD1566134","RGD1566138","RGD1566137","RGD1566184","RGD1566189","RGD1566159","RGD1566197","RGD1566198","RGD1566212","RGD1566217","RGD1566225","RGD1566227","RGD1566237","RGD1566226","RGD1566241","RGD1566244","RGD1566247","RGD1566248","RGD1566257","RGD1566258","RGD1566251","RGD1566262","RGD1566271","RGD1566273","RGD1566265","RGD1566284","RGD1566289","RGD1566292","RGD1566300","RGD1566324","RGD1566303","RGD1566331","RGD1566325","RGD1566337","RGD1566344","RGD1566347","RGD1566353","RGD1566354","RGD1566355","RGD1566368","RGD1566359","RGD1566369","RGD1566373","RGD1566383","RGD1566387","RGD1566386","RGD1566409","RGD1566401","RGD1584023","RGD1597339","RGD2301395","RGD2320734","RGD1624210","RGD9310068","RGD621098","RGD735029","RGD735065","Rgl1","Rgl2","Rgmb","Rgl3","Rgma","Rgp1","Rgr","Rgs1","Rgn","Rgs11","Rgs13","Rgs10","Rgs16","Rgs12","Rgs14","Rgs17","Rgs18","Rgs19","Rgs20","Rgs2","Rgs21","Rgs22","Rgs3","Rgs5","Rgs4","Rgs6","Rgs7bp","Rgs8","Rgs7","Rgs9bp","Rgs9","Rgsl2h","Rgsl1","Rhag","Rhbdd1","Rhbdd2","Rhbdf1","Rhbdd3","Rhbdf2","Rhbdl1","Rhbdl2","Rhbdl3","Rhbg","Rhcg","Rhd","Rhebl1","Rheb","Rhno1","Rho","Rhob","Rhobtb1","Rhobtb2","Rhobtb3","Rhod","Rhoc","Rhof","Rhoh","Rhog","Rhoa","Rhoq","Rhoj","Rhot2","Rhou","Rhot1","Rhox11","Rhox12","Rhov","Rhox13","Rhox2","Rhox3","Rhox4g","Rhox5","Rhox7","Rhox8","Rhox9","Rhoxf10","Rhpn1","Rhpn2","Ribc1","Ribc2","Ric1","Ric3","Ric8b","Ric8a","Rictor","Rida","Riiad1","Rif1","Rilp","Rilpl1","Rilpl2","Rimbp2","Rimbp3","Rimkla","Rimklb","Rims3","Rims4","Rin1","Rims1","Rin3","Rims2","Ring1","Rin2","Rinl","Rint1","Riok1","Riok2","Riox1","Riok3","Riox2","Ripk2","Ripk3","Ripk1","Ripk4","Ripor3","Ripor2","Ripply1","Ripor1","Ripply2","Ripply3","Rit1","Rita1","Rit2","Rlbp1","Rlf","Rlim","Rln1","Rln3","Rmdn1","Rmdn2","Rmi2","Rmdn3","Rmi1","Rmrp","Rmnd1","Rmnd5a","Rmnd5b","Rn18s","Rn28s","Rmt1","Rn5-8s","Rn7sl1","Rn5s","Rnase-ps","Rnase1","Rnase11","Rnase13","Rnase10","Rnase12","Rnase17","Rnase1l1","Rnase1l2","Rnase2","Rnase9","Rnase3","Rnase6","Rnaseh1","Rnase4","Rnaseh2b","Rnaseh2a","Rnaseh2c","Rnasek","Rnaset2","Rnd1","Rnasel","Rnd2","Rnf10","Rnd3","Rnf11","Rnf103","Rnf113a","Rnf112","Rnf111","Rnf113a1","Rnf113a2","Rnf114","Rnf11l2","Rnf115","Rnf11l1","Rnf122","Rnf121","Rnf125","Rnf123","Rnf126","Rnf130","Rnf13","Rnf128","Rnf133","Rnf135","Rnf138","Rnf139","rnf141","Rnf144a","Rnf14","Rnf144b","Rnf145","Rnf146","Rnf148","Rnf149","Rnf150","Rnf151","Rnf157","Rnf152","Rnf165","Rnf166","Rnf167","Rnf169","Rnf168","Rnf17","Rnf170","Rnf180","Rnf181","Rnf182","Rnf186","Rnf185","Rnf183","Rnf187","Rnf19b","Rnf19a","Rnf20","Rnf2","Rnf207","Rnf208","Rnf212","Rnf213","Rnf215","Rnf214","Rnf216","Rnf217","Rnf219","Rnf220","Rnf223","Rnf222","Rnf225","Rnf224","Rnf24","Rnf26","Rnf25","Rnf32","Rnf31","Rnf34","Rnf39","Rnf38","Rnf4","Rnf40","Rnf41","Rnf43","Rnf5","Rnf44","Rnf6","Rnf7","Rnf8","Rnft2","Rnft1","Rngtt","Rnmt","Rnh1","Rnls","Rnpc3","Rnpepl1","Rnps1","Rnr3_mapped","Rnpep","Robld3-ps1","Robo3","Robo4","Robo2","Robo1","Rogdi","Rom1","Rock2","Romo1","Rock1","Ropn1","Ropn1l","Ror1","Ror2","Rora","Rorc","Rorb","Rp1l1","Rp1","Rp2","Ros1","Rp9","Rpa1","Rpa3","Rpain","Rpap1","Rpa2","Rpap2","Rpap3","Rpe","Rpf2","Rpgrip1","Rpf1","Rpe65","Rpgr","Rpgrip1l","Rph3a","Rph3al","Rpia","Rpl10l","Rpl10a","Rpl10","Rpl11","Rpl12-ps1","Rpl12","Rpl13-ps1","Rpl13","Rpl17l1","Rpl13a","Rpl17-ps1","Rpl14","Rpl15","Rpl17","Rpl18","Rpl18a","Rpl21-ps2","Rpl21-ps1","Rpl21-ps3","Rpl19","Rpl22-ps","Rpl21","Rpl22","Rpl22l1","Rpl22l2","Rpl24","Rpl23","Rpl23a","Rpl26-ps1","Rpl26-ps2","Rpl26-ps3","Rpl26","Rpl27-l1","Rpl27-ps1","Rpl27","Rpl27a","Rpl29-ps1","Rpl29-ps2","Rpl28","Rpl29","Rpl29-ps3","Rpl30l1","Rpl31l1","Rpl31l2","Rpl3","Rpl31l3","Rpl31","Rpl30","Rpl31l4","Rpl32-ps1","Rpl32-ps2","Rpl32-ps3","Rpl32-ps4","Rpl34-ps1","Rpl34l1","Rpl32","Rpl34","Rpl35","Rpl36a-ps1","Rpl35al1","Rpl36","Rpl36a-ps2","Rpl36a-ps3","Rpl36a","Rpl35a","Rpl36a-ps4","Rpl37-ps1","Rpl37a-ps2","Rpl37a-ps3","Rpl36al","Rpl37a","Rpl37a-ps1","Rpl37","Rpl38","Rpl38-ps1","Rpl38-ps2","Rpl38-ps3","Rpl39-ps","Rpl39l","Rpl3l","Rpl39","Rpl41-ps1","Rpl41","Rpl5l1","Rpl4","Rpl6-ps1","Rpl5","Rpl6","Rpl7l1","Rpl7","Rpl7a","Rpl8","Rplp0l1","Rpl9","Rplp2","Rpn1","Rplp1","Rpn2","Rpp14","Rplp0","Rpp21","Rpp25","Rpp30","Rpp25l","Rpp38","Rpp40","Rprd1a","Rprd2","Rprd1b","Rprm","Rps10l1","Rprml","Rps12l2","Rps12l3","Rps10","Rps11","Rps12","Rps13","Rps15-ps1","Rps15-ps2","Rps15a-ps1","Rps15","Rps15al1","Rps14","Rps15al2","Rps15a","Rps15al4","Rps17l","Rps17","Rps16","Rps18l1","Rps18","Rps19bp1","Rps19","Rps19l1","Rps2-ps1","Rps2-ps2","Rps2-ps3","Rps2-ps4","Rps2-ps5","Rps2-ps6","Rps2","Rps2-ps7","Rps21-ps1","Rps20","Rps25-ps2","Rps25-ps1","Rps21","Rps23","Rps25","Rps24","Rps26","Rps27a-ps10","Rps27a-ps11","Rps27a-ps1","Rps27a-ps13","Rps27a-ps14","Rps27","Rps27a","Rps27a-ps15","Rps27a-ps16","Rps27a-ps17","Rps27a-ps18","Rps27a-ps19","Rps27a-ps20","Rps27a-ps2","Rps27a-ps21","Rps27a-ps22","Rps27a-ps23","Rps27a-ps25","Rps27a-ps26","Rps27a-ps24","Rps27a-ps27","Rps27a-ps28","Rps27a-ps29","Rps27a-ps3","Rps27a-ps30","Rps27a-ps4","Rps27a-ps5","Rps27a-ps6","Rps27a-ps7","Rps27a-ps8","Rps27a-ps9","Rps27l","Rps28-ps1","Rps28","Rps4x-ps1","Rps3","Rps29","Rps4x-ps3","Rps4x-ps2","Rps3a","Rps4x","Rps4x-ps4","Rps4x-ps5","Rps4x-ps6","Rps4x-ps7","Rps4x-ps8","Rps4x-ps9","Rps4y2","Rps5","Rps6","Rps6ka2","Rps6ka1","Rps6ka4","Rps6ka3","Rps6ka6","Rps6ka5","Rps6kl1","Rps7","Rps6kb2","Rps6kc1","Rps8-ps1","Rps6kb1","Rps8","Rps9","Rptn","Rps9l1","Rpusd1","Rpusd2","Rptor","Rpusd3","Rpsa","Rpusd4","Rraga","Rrad","RragB","Rragc","Rragd","Rras2","Rras","Rrbp1","Rrh","Rrlt","Rreb1","Rrm1-ps1","Rrm1","Rrm2b","Rrn3","Rrm2","Rrnad1","Rrp12","Rrp1","Rrp15","Rrp36","Rrp1b","Rrp7a","Rrp8","Rrs1","RSA-14-44","Rrp9","Rs1","Rsad1","Rsad2","Rsbn1l","Rsbn1","Rsf1","Rsg1","Rsl1","Rsl1d1","Rsl1d1l1","Rsl24d1","Rsph1","Rsph10b","Rsph14","Rsph3","Rsph4a","Rsph6a","Rsph9","Rspo1","Rspo2","Rspo4","Rspo3","Rsrc1","Rspry1","Rsrc2","Rsrp1","Rsu1","RT1-A","RT1-B","RT1-A2","RT1-A3","RT1-A1","RT1-CE1","RT1-CE10","RT1-CE11","RT1-CE12","RT1-CE14","RT1-CE13","RT1-Ba","RT1-CE14-ps1","RT1-Bb","RT1-CE15","RT1-CE16","RT1-CE2","RT1-CE3","RT1-CE6","RT1-CE4","RT1-CE8-ps1","RT1-CE5","RT1-CE9-ps1","RT1-CE7","RT1-Cl","RT1-Db2","RT1-DOa","RT1-DMa","RT1-Da","RT1-DMb","RT1-DOb","RT1-Hb-ps1","RT1-M1-1-ps","RT1-L3","RT1-EC2","RT1-Ha","RT1-Db1","RT1-M1-3-ps","RT1-M1-2","RT1-M10-2-ps","RT1-M10-3-ps","RT1-M1-5","RT1-M1-4","RT1-M10-1","RT1-M10-4-ps","RT1-M2","RT1-M3-3-ps","RT1-M3-2-ps","RT1-M3-1","RT1-M7-ps","RT1-M6-2","RT1-M4","RT1-M6-1","RT1-M5","RT1-M8-ps","RT1-N1","RT1-O2-ps","RT1-O3-ps","RT1-P1-ps1","RT1-O1","RT1-N2","RT1-N3","RT1-P2-ps1","RT1-T24-2","RT1-S2","RT1-T18","RT1-T24-1","RT1-V1-ps1","RT1-T24-3","RT1-S3","RT1-T24-4","Rt1.a-4","RT1-V2-ps1","Rtbdn","Rtcb","Rtca","Rtf1","Rtel1","Rtfdc1","Rtkn2","Rtkn","Rtl1","Rtl3","Rtl5","Rtl8a","Rtl4","Rtl6","Rtl8b","Rtl9","Rtn2","Rtn1","Rtn3","Rtn4ip1","Rtn4rl1","Rtn4rl2","Rtn4r","Rtp1","Rtn4","Rtp2","Rtp3","Rtp4","Rtraf","Rttn","Rubcnl","Rubcn","Rufy1","Rufy2","Rufy4","Rundc1","Rufy3","Rundc3a","Rundc3b","Runx1t1","Runx1","Runx3","Runx2","Rup2","Rusc1","Rusc2","Ruvbl1","Ruvbl2","Rwdd1","Rwdd2a","Rwdd2b","Rwdd3","Rwdd4","Rxfp1","Rxfp2","Rxfp3","Rxfp4-ps1","Rxra","Rxrb","Rybp","Rxrg","Ryk","S100a10","S100a1","Ryr1","Ryr3","S100a11","S100a14","S100a13","S100a16","S100a3","Ryr2","S100a4","S100a5","S100a6","S100a7a","S100a7l2","S100a8","S100a9","S100pbp","S100vp","S100g","S100z","S100b","S1pr4","S1pr2","S1pr1","S1pr3","S1pr5","Sacm2l-ps1","Saal1","Sac3d1","Saa4","Sacm1l","Sacm2l-ps2","Sacm2l-ps5","Sacm2l-ps4","Sacm2l-ps3","Sacm2l-ps6","Sacm2l-ps7","Safb2","Sacs","Sae1","Safb","Sall1","Sag","Samd1","Sall3","Sall2","Samd10","Samd11","Samd12","Samd13","Samd14","Samd15","Samd3","Sall4","Samd5","Samd7","Samd4b","Samd4a","Samd8","Samd9","Samd9l","Samm50","Samhd1","Samt2","Samsn1","Samt4","Samt3","Sap130","Sap18","Sap25","Sap30","Sap30bp","Sap30l","Sapcd2","Sapcd1","Sar1b","Saraf","Sar1a","Sarm1","Sarnp","Sardh","Sars","Sars2","Sart1","Sash1","Sart3","Sash3","Sass6","Sat1","Sat2","Satb1","Satl1","Satb2","Sav1","Saxo2","Saysd1","Saxo1","Saxol1","Sbds","Sbk1","Sbk2","Sbk3","Sbf1","Sbf2","Sbno2","Sbno1","Sbsn","Sbp","Sbspon","Sc5d","Scaf1","Scaf11","Scaf4","Scaf8","Scai","Scamp1","Scamp2","Scamp4","Scamp3","Scand1","Scand3-ps1","Scamp5","Scand3-ps2","Scand3-ps3","Scand3-ps4","Scara3","Scaper","Scap","Scara5","Scarf1","Scarb2","Scarf2","Scarna15","Scarb1","Scarna3","Scart1","Sccpdh","Scd","Scd2","Scd4","Scel","Scfd2","Scfd1","Scg3","Scg2","Scg5","Scgb1b30","Scgb1b24","Scgb1c1","Scgb1d2","Scgb1a1","Scgb1d4","Scgb2a1","Scgb2b2","Scgb2a2","Scgb2b24","Scgb3a1","Scgb3a2","Scgn","Scimp","Schip1","Scin","Scml1","Scmh1","Scly","Sclt1","Scml2","Scml4","Scn11a","Scn2b","Scn10a","Scn1b","Scn1a","Scn2a","Scn3b","Scn3a","Scn4b","Scn7a","Scn4a","Scn8a","Scnm1","Scn5a","Scn9a","Sco1","Scoc","Scnn1a","Scp2d1","Scnn1b","Scnn1g","Scpep1","Scp2","Scrg1","Scrn1","Scrn2","Scrt1","Scrn3","Scrt2","Scrib","Sct","Sctr","Scx","Scube2","Scube1","Scube3","Scyl1","Scyl2","Scyl3","Sdad1","Sdc2","Sdc3","Sdc1","Sdccag1-ps1","Sdcbp2","Sdc4","Sdcbp","Sdccag3","Sde2","Sdf2","Sdccag8","Sdf2l1","Sdhaf1","Sdf4","Sdha","Sdhaf3","Sdhaf2","Sdhaf4","Sdhc","Sdhb","Sdhd","Sdk1","Sdr16c6","Sdr16c5","Sdk2","Sdr39u1","Sdr42e1","Sdr42e2","Sdr9c7","Sdsl","Sec1","Sebox","Sds","Sec11a","Sec11c","Sec13","Sec14l1","Sec14l5","Sec14l4","Sec14l3","Sec14l2","Sec16a","Sec16b","Sec22a","Sec22c","Sec22b","Sec23a","Sec23b","Sec23ip","Sec24a","Sec24b","Sec24c","Sec61-ps","Sec24d","Sec31b","Sec31a","Sec61a1","Sec61a2","Sec61b","Sec61g","Sec61g-ps1","Sec61gl","Sec62","Secisbp2","Sec63","Sectm1a","Secisbp2l","Seh1l","Sectm1b","Sel1l","Sel1l2","Sel1l3","Selenoh","Selenbp1","Selenof","Sele","Selenoi","Selenok-ps1","Selenok","Selenok-ps2","Selenok-ps3","Selenok-ps4","Selenok-ps6","Selenok-ps5","Selenon","Selenom","Selenoo","Selenop","Selenos","Selenot-ps1","Selenot","Selenov","Selenow-ps1","Selenow","Selplg","Sem1","Sell","Sema3b","Sema3c","Sema3a","Sema3d","Sema3e","Sema3g","Sema3f","Sema4a","Sema4b","Sema4c","Sema4d","Selp","Sema4f","Sema6a","Sema4g","Sema5b","Sema5a","Sema6b","Sema6c","Sema6d","Sema7a","Senp17","Senp1","Senp18","Semg1","Senp2","Senp3","Senp5","Sephs2","Senp6","Senp7","Senp8","Sephs1","Sepsecs","1-Sep","10-Sep","12-Sep","14-Sep","11-Sep","3-Sep","2-Sep","4-Sep","5-Sep","6-Sep","7-Sep","Serac1","8-Sep","9-Sep","Serf1","Serbp1","Serf2","Sergef","Serhl2","Serinc2","Serinc1","Serinc3","Serinc4","Serinc5","Serp2","Serp1","Serpina11","Serpina12","Serpina10","Serpina16","Serpina1f","Serpina1","Serpina3c","Serpina3m","Serpina4","Serpina5","Serpina9","Serpina3n","Serpina6","Serpina7","Serpinb10","Serpinb11","Serpinb12","Serpinb13","Serpinb1b","Serpinb2","Serpinb1a","Serpinb3","Serpinb3a","Serpinb5","Serpinb6a","Serpinb6b","Serpinb6e","Serpinb8","Serpinb7","Serpinb9d","Serpinb9","Serpind1","Serpinc1","Serpine3","Serpine2","Serpinf2","Serping1","Serpinf1","Serpinh1","Sert1","Serpini1","Serpini2","Sertad1","Sertad2","Serpine1","Sertad3","Sertm1","Sertad4","Sesn1","Sesn3","Sesn2","Sestd1","Setbp1","Set","Setd1b","Setd1a","Setd3","Setd4","Setd2","Setd6","Setd5","Setd7","Setdb1","Setdb2","Setsip","Setmar","Setx","Sez6","Sez6l2","Sez6l","Sf1","Sf3a2","Sf3a1","Sf3a3","Sf3b4","Sf3b1","Sf3b2","Sf3b3","Sf3b5","Sf3b6","Sfi1","Sfmbt1","Sfmbt2","Sfr1","Sfn","Sfpq","Sfrp2","Sfrp1","Sfrp4","Sfrp5","Sft2d3","Sft2d2","Sfswap","Sft2d1","Sfta2","Sfxn2","Sfxn1","Sfxn3","Sfxn4","Sftpc","Sftpa1","Sftpb","Sftpd","Sfxn5","Sgca","Sgcb","Sgce","Sgcd","Sgcg","Sgcz","Sgf29","Sgk494","Sgk2","Sgk3","Sgip1","Sgo1","Sgms2","Sgk1","Sgms1","Sgo2","Sgpp1","Sgsh","Sgpl1","Sgpp2","Sgsm1","Sgsm2","Sgsm3","Sgta","Sgtb","Sh2b3","Sh2b1","Sh2b2","Sh2d1b2","Sh2d1a","Sh2d1b","Sh2d3a","Sh2d2a","Sh2d4b","Sh2d6","Sh2d3c","Sh2d4a","Sh2d5","Sh2d7","Sh3bgr","Sh3bgrl","Sh3bgrl2","Sh3bgrl3","Sh3bp2","Sh3bp1","Sh3bp4","Sh3bp5","Sh3bp5l","Sh3d19","Sh3gl1","Sh3d21","Sh3gl2","Sh3gl3","Sh3glb1","Sh3glb2","Sh3pxd2a","Sh3kbp1","Sh3pxd2b","Sh3rf1","Sh3rf2","Sh3rf3","Sh3tc1","Sh3tc2","Sh3yl1","Shb","Sharpin","Shank1","Shank3","Shbg","Shc2","Shank2","Shc1","Shc3","Shc4","Shcbp1","Shcbp1l","She","Shf","Shd","Shisa2","Shisa6","Shisa3","Shisa7","Shisa4","Shisa8","Shisa5","Shisa9","Shisal2b","Shisal2a","Shisal1","Shkbp1","Shh","Shmt1","Shmt2","Shoc2","Shpk","Shox2","Shq1","Shroom1","Shprh","Shroom2","Shroom3","Shroom4","Shtn1","Siah2","Siae","Si","Siah1","Siah3","Sidt1","Sidt2","Sigirr","Siglec15","Siglec10","Siglec8","Siglec1","Siglech","Siglec5","Siglecl1","Sik2","Sike1","Sik3","Sigmar1","Sik1","Sil1","Sim2","Sim1","Simc1","Sinhcaf","Sipa1l1","Sipa1","Sin3b","Sipa1l2","Sin3a","Sipa1l3","Sirpb2","Sirpb2l1","Sirpd","Sirpa","Sirt2","Sirt4","Sirt3","Sirt5","Sirt7","Sit1","Sirt6","Siva1","Six2","Six1","Six4","Six3","Six5","Six6","Six6os1","Ska1","Ska2","Sirt1","Ska3","Skap2","Skida1","Skap1","Ski","Skil","Skint10","Skint1","Skint4","Skint8","Skiv2l","Skor1","Skiv2l2","Skor2","Sla","Skp1","Skp2","Sla2","Slain1","Slain2","Slamf1","Slamf6","Slamf7","Slamf8","Slamf9","Slbp","Slc10a3","Slc10a1","Slc10a2","Slc10a4","Slc10a5","Slc10a6","Slc10a7","Slc11a1","Slc12a2","Slc12a1","Slc12a4","Slc12a3","Slc12a6","Slc11a2","Slc12a5","Slc12a9","Slc12a7","Slc13a1","Slc12a8","Slc13a4","Slc13a2","Slc13a3","Slc13a5","Slc14a1","Slc15a3","Slc15a4","Slc15a2","Slc15a5","Slc15a1","Slc14a2","Slc16a1","Slc16a14","Slc16a11","Slc16a12","Slc16a10","Slc16a13","Slc16a2","Slc16a3","Slc16a4","Slc16a9","Slc16a5","Slc16a6","Slc16a8","Slc17a1","Slc16a7","Slc17a2","Slc17a4","Slc17a3","Slc17a5","Slc17a9","Slc17a6","Slc17a8","Slc17a7","Slc18a1","Slc18a3","Slc18b1","Slc18a2","Slc19a3","Slc19a2","Slc19a1","Slc1a4","Slc1a1","Slc1a5","Slc1a6","Slc1a3","Slc1a2","Slc1a7","Slc20a1","Slc20a2","Slc22a14","Slc22a12","Slc21a4","Slc22a16","Slc22a15","Slc22a13","Slc22a1","Slc22a17","Slc22a20","Slc22a18","Slc22a22","Slc22a23","Slc22a24","Slc22a25","Slc22a2","Slc22a7-ps1","Slc22a3","Slc22a4","Slc22a7","Slc22a6","Slc22a5","Slc23a1","Slc22a8","Slc23a3","Slc24a1","Slc23a2","Slc24a3","Slc24a2","Slc24a5","Slc24a4","Slc25a1","Slc25a10","Slc25a11","Slc25a12","Slc25a13","Slc25a14","Slc25a15","Slc25a17","Slc25a16","Slc25a18","Slc25a2","Slc25a19","Slc25a20","Slc25a21","Slc25a22","Slc25a23","Slc25a24","Slc25a26","Slc25a25","Slc25a27","Slc25a28","Slc25a30","Slc25a29","Slc25a32","Slc25a3","Slc25a31","Slc25a33","Slc25a34","Slc25a35","Slc25a36l1","Slc25a36","Slc25a38","Slc25a37","Slc25a39","Slc25a4","Slc25a40","Slc25a41","Slc25a43","Slc25a42","Slc25a44","Slc25a45","Slc25a46","Slc25a48","Slc25a47","Slc25a5","Slc25a53","Slc25a52","Slc25a51","Slc25a54","Slc25a6","Slc26a10","Slc26a1","Slc26a11","Slc26a3","Slc26a2","Slc26a6","Slc26a4","Slc26a5","Slc26a7","Slc26a8","Slc26a9","Slc27a2","Slc27a3","Slc27a1","Slc27a4","Slc27a5","Slc27a6","Slc28a3","Slc28a1","Slc28a2","Slc29a1","Slc29a3","Slc29a4","Slc29a2","Slc2a10","Slc2a12","Slc2a1","Slc2a13","Slc2a5","Slc2a6","Slc2a3","Slc2a2","Slc2a7","Slc2a8","Slc2a9","Slc2a4","Slc30a1","Slc30a10","Slc30a2","Slc30a4","Slc30a3","Slc30a5","Slc30a7","Slc30a8","Slc30a6","Slc30a9","Slc31a2","Slc31a1","Slc33a1","Slc32a1","Slc35a1","Slc34a2","Slc34a3","Slc35a3","Slc35a2","Slc35a5","Slc35a4","Slc34a1","Slc35b1","Slc35b2","Slc35b3","Slc35b4","Slc35c1","Slc35d1","Slc35d2","Slc35c2","Slc35d3","Slc35e1","Slc35e3","Slc35e2b","Slc35e4","Slc35f1","Slc35f3","Slc35f2","Slc35f4","Slc35f5","Slc35f6","Slc35g1","Slc35g2","Slc35g3","Slc36a1","Slc36a2","Slc36a4","Slc36a3","Slc37a1","Slc37a2","Slc37a3","Slc37a4","Slc38a11","Slc38a10","Slc38a1","Slc38a2","Slc38a3","Slc38a5","Slc38a4","Slc38a7","Slc38a6","Slc38a8","Slc38a9","Slc39a1","Slc39a10","Slc39a12","Slc39a11","Slc39a2","Slc39a13","Slc39a14","Slc39a3","Slc39a4l","Slc39a4","Slc39a5","Slc39a6","Slc39a7","Slc39a8","Slc39a9","Slc3a1","Slc3a2","Slc41a1","Slc41a2","Slc41a3","Slc40a1","Slc43a1","Slc43a2","Slc43a3","Slc44a1","Slc44a3","Slc44a2","Slc45a1","Slc44a4","Slc44a5","Slc45a2","Slc45a3","Slc45a4","Slc46a2","Slc46a1","Slc47a2","Slc46a3","Slc48a1","Slc47a1","Slc4a1","Slc4a11","Slc4a1ap","Slc4a10","Slc4a5","Slc4a3","Slc4a2","Slc4a4","Slc50a1","Slc4a7","Slc4a9","Slc4a8","Slc51a","Slc51b","Slc52a2","Slc52a3","Slc5a12","Slc5a10","Slc5a11","Slc5a3","Slc5a1","Slc5a2","Slc5a4","Slc5a4b","Slc5a8","Slc5a6","Slc5a5","Slc5a9","Slc5a7","Slc6a11","Slc6a1","Slc6a12","Slc6a16","Slc6a14","Slc6a13","Slc6a15","Slc6a17","Slc6a18","Slc6a19","Slc6a2","Slc6a20","Slc6a5","Slc6a6","Slc6a7","Slc6a3","Slc6a8","Slc6a4","Slc6a9","Slc7a12","Slc7a10","Slc7a11","Slc7a13","Slc7a1","Slc7a14","Slc7a15","Slc7a4","Slc7a3","Slc7a6os","Slc7a6","Slc7a5","Slc7a2","Slc7a7","Slc7a8","Slc7a9","Slc8a2","Slc8b1","Slc8a3","Slc9a2","Slc9a1","Slc9a3r2","Slc8a1","Slc9a3r1","Slc9a4","Slc9a6","Slc9a3","Slc9a5","Slc9a7","Slc9a8","Slc9b1","Slc9b2","Slc9a9","Slc9c1","Slc9c2","Slco1a1","Slco1a2","Slco1a4","Slco1a6","Slco1b2","Slco1c1","Slco2a1","Slco2b1","Slco3a1","Slco4a1","Slco4c1","Slco6c1","Slco6b1","Slco5a1","Slco6d1","Slf1","Slfn1","Slf2","Slfn13","Slfn14","Slfn3","Slfn2","Slfn4","Slfn5","Slfnl1","Slirp","Slitrk1","Slit1","Slitrk3","Slitrk2","Slitrk4","Slit3","Slitrk5","Slit2","Slitrk6","Slk","Sln","Slpil2","Slpil3","Slpi","Slmap","Sltm","Slurp1","Slu7","Slx1b","Slx4","Slx4ip","Smad1","Smad2","Smad5","Smad3","Smad6","Smad9","Smad7","Smad4","Smagp","Smap1","Smap2","Smarca1","Smarca2","Smarcad1","Smarca5","Smarcal1","Smarcb1","Smarca4","Smarcc1","Smarcd1","Smarcc2","Smarce1l","Smarcd3","Smarcd2","Smc1b","Smarce1","Smc1a","Smc2","Smc3","Smc4","Smc6","Smc5","Smco1","Smco2","Smchd1","Smco3","Smcp","Smcr8","Smdt1","Smco4","Smg5","Smg1","Smim1","Smg6","Smgc","Smg8","Smg7","Smg9","Smim10","Smim10l1","Smim11","Smim12","Smim13","Smim14","Smim15","Smim17","Smim18","Smim19","Smim2","Smim20","Smim22","Smim23","Smim24","Smim26","Smim29","Smim3","Smim31","Smim34a","Smim4","Smim35","Smim5","Smim6","Smim7","Smkr1","Smlr1","Smim8","Smndc1","Smoc1","Smn1","Smok2a","Smoc2","Smo","Smox","Smpd1","Smpd4","Smpd2","Smpd3","Smpd5","Smpdl3a","Smpdl3b","Smptb","Smpx","Smr3a","Sms-ps1","Sms","Smr3b","Smtn","Smtnl1","Smtnl2","Smu1","Smug1","Smurf1","Smurf2","Smyd1","Smyd4","Smyd2","Smyd3","Smyd5","Snai1","Snai2","Snai3","Snap47","Snap23","Snap29","Snapc1","Snapc3","Snap91","Snapc2","Snapc4","Snapc5","Snap25","Snapin","Sncaip","Sncg","Sncb","Snd1","Snf8","Snhg11","Sned1","Snhg4","Snca","Snora19","Snip1","Snn","Snora58","Snph","Snrk","Snrnp200","Snrnp25","Snrnp40","Snrnp35","Snrnp27","Snrnp48","Snrpa","Snrnp70","Snrpc-ps1","Snrpa1","Snrpb2","Snrpc","Snrpb","Snrpd1","Snrpd2","Snrpd2l","Snrpel","Snrpel1","Snrpd3","Snrpep2","Snrpf","Snrpg-ps1","Snrpg","Snrpgl2","Snrpe","Snta1","Sntb1","Snrpn","Sntb2","Sntg1","Sntg2","Sntn","Snu13","Snupn","Snurf","Snw1","Snx1","Snx10","Snx11","Snx12","Snx13","Snx16","Snx15","Snx14","Snx17","Snx18","Snx19","Snx20","Snx2","Snx21","Snx22","Snx24","Snx25","Snx27","Snx3","Snx30","Snx29","Snx31","Snx33","Snx32","Snx4","Snx5","Snx7","Snx8","Snx9","Snx6","Soat1","Sobp","Soat2","Socs4","Socs2","Socs5","Socs1","Socs3","Socs6","Socs7","Soga1","Soga3","Sod3","Sohlh1","Sohlh2","Son","Sod2","Sod1","Sorbs1","Sorbs3","Sorbs2","Sorcs1","Sorcs2","Sorcs3","Sorl1","Sord","Sort1","Sostdc1","Sost","Sowaha","Sos2","Sos1","Sowahb","Sox1","Sowahc","Sowahd","Sox12","Sox11","Sox13","Sox14","Sox10","Sox15","Sox21","Sox17","Sox18","Sox3","Sox30","Sox4","Sox2","Sox7","Sox5","Sox8","Sox6","Sp100","Sp110","Sox9","Sp140","Sp1","Sp2","Sp4","Sp3","Sp5","Sp6","Sp8","Spaca1","Sp7","Sp9","Spa17","Spaca3","Spaca4","Spaca5","Spaca6","Spaca7","Spaca9","Spag1","Spag11a","Spag11b","Spag11bl","Spag17","Spag16","Spag4","Spag6","Spag7","Spag5","Spag6l","Spag8","Spam1","Sparcl1","Spag9","Spart","Sparc","Spast","Spata1","Spata13","Spata16","Spata17","Spata18","Spata19","Spata2","Spata20","Spata21","Spata22","Spata24","Spata25","Spata2L","Spata3","Spata31d1b","Spata31a5","Spata31d1d","Spata31d3","Spata31e1","Spata32","Spata33","Spata4","Spata45","Spata46","Spata5l1","Spata5","Spata6l","Spata6","Spata9","Spata7","Spatc1","Spatc1l","Spats1","Spats2","Spc24","Spats2l","Spc25","Spcs1","Spcs2","Spcs3","Spdef","Spdl1","Spdya","Spdye4","Specc1","Specc1l","Spef1","Spef2","Spem1","Speg","Spen","Spert","Spesp1","Spetex-2A","Spetex-2B","Spetex-2C","Spetex-2D","Spetex-2E","Spetex-2F","Spetex-2G","Spetex-2H","Spg11","Spg21","Spg7","Sphk2","Sphk1","Sphkap","Spi1","Spib","Spic","Spice1","Spidr","Spin1","Spin3","Spin2a","Spin4","Spink10","Spink1","Spink13","Spink14","Spink2","Spink1l","Spink4","Spink5","Spink6","Spink7","Spink8","Spink9","Spint1","Spint2","Spint4","Spint3","Spint5p","Spire1","Spire2","Spn","Spns1","Spns2","Spns3","Spocd1","Spo11","Spock1","Spock2","Spock3","Spon1","Spon2","Spop","Spopl","Spout1","Spp1","Spp2","Sppl2a","Sppl2b","Sppl2c","Sppl3","Spr","Spred1","Spred2","Spred3","Sprn","Sprr1a","Sprr1b","Sprr2d","Sprr3","Sprr4","Sprtn","Spry1","Spry2","Spry3","Spry4","Spryd4","Spryd3","Spryd7","Spsb1","Spsb2","Spsb3","Spsb4","Spt1","Spta1","Sptan1","Sptb","Sptbn1","Sptbn2","Sptbn5","Sptbn4","Sptlc1","Sptlc2","Sptssa","Sptlc3","Sptssb","Spty2d1","Spz1","Spx","Sqor","Sqle","Sra1","Sqstm1","Srarp","Srbd1","Srcap","Src","Srcin1","Srd5a2","Srd5a1","Srd5a3","Srebf1","Srebf2","Srek1","Srek1ip1","Srfbp1","Srf","Srgap1","Srgap2","Srgap3","Srgn","Sri","Srl","Srm","Srms","Srp14","Srp19","Srp54a","Srp68","Srp72-ps1","Srp72","Srp9","Srpk1","Srpk2","Srpk3","Srpra","Srprb","Srpx","Srpx2","Srrd","Srr","Srrm1","Srrm2","Srrm4","Srrm3","Srrm5","Srrt","Srsf10","Srsf1","Srsf12","Srsf11","Srsf3","Srsf2","Srsf3-ps1","Srsf4","Srsf5","Srsf6","Srsf7","Srsf8","Srsf9","Srxn1","Ss18","Sry","Ss18l1","Ss18l2","Ssbp1","Ssb","Ssbp2","Ssbp3","Ssbp4","Ssc4d","Ssc5d","Ssfa2","Ssh1","Ssh2","Ssmem1","Ssh3","Ssna1","Sspn","Ssr1","Sspo","Ssr2","Ssr3","Ssr4","Ssrp1","Sssca1","Sst","Sstr1","Sstr3","Sstr2","Sstr4","Sstr5","Ssty1","Ssu72","Ssuh2","Ssx1","Ssx2","Ssx2ip","St13","St14","St18","St3gal1","St3gal2","St3gal3","St3gal4","St3gal5","St3gal6","St5","St6gal1","St6gal2","St6galnac1","St6galnac2","St6galnac3","St6galnac4","St6galnac5","St6galnac6","St7l","ST7","St8sia2","St8sia1","St8sia3","St8sia4","St8sia6","St8sia5","Stab1","Stab2","Stac","Stac2","Stac3","Stag1","Stag2","Stag3","Stam","Stam2","Stambp","Stambpl1","Stap1","Stap2","Stard10","Stard13","Stard3","Stard3nl","Star","Stard4","Stard5","Stard6","Stard7","Stard8","Stard9","Stat2","Stat1","Stat4","Stat3","Stat5a","Stat5b","Stat6","Stath","Stau1","Stau2","Stbd1","Stc1","Stc2","Steap1","Steap2","Steap3","Steap4","Stfa2","Stfa2l1","Stfa2l2","Stfa3","Stfa3l1","Stil","Stim1","Stim2","Stip1","Stk10","Stk11ip","Stk11","Stk16","Stk17b","Stk19-ps","Stk19","Stk25","Stk24","Stk26","Stk3","Stk31","Stk32a","Stk32c","Stk32b","Stk35","Stk33","Stk36","Stk38","Stk38l","Stk39","Stk4","Stk40","Stkld1","Stmn1","Stmn2","Stmn3","Stmnd1","Stmn4","Stn1","Stom","Stoml1","Stoml2","Stoml3","Ston1","Ston2","Stox1","Stox2","Stpg1","Stpg3","Stpg2","Stpg4","Stra6","Stra8","Strada","Stradb","Strap","Strbp","Strc","Strip1","Strip2","Strn","Strn3","Strn4","Sts","Stt3a","Stt3b","Stum","Stub1","Stx11","Stx12","Stx16","Stx17","Stx19","Stx18","Stx1b","Stx1a","Stx2","Stx3","Stx4","Stx5","Stx6","Stx7","Stx8","Stxbp2","Stxbp1","Stxbp3","Stxbp4","Stxbp5","Stxbp5l","Stxbp6","Styk1","Styx","Styxl1","Styxl2","Sub1","Sucla2","Suclg1","Suclg2","Sucnr1","Suco","Suds3","Sufu","Sugct","Sugp1","Sugp2","Sugt1","Sulf1","Sulf2","Sult1a1","Sult1b1","Sult1c2a","Sult1c2","Sult1d1","Sult1c3","Sult1e1","Sult2a1","Sult2a2","Sult2a6","Sult2b1","Sult4a1","Sult5a1","Sult6b1","Sumf1","Sumf2","Sumo1","Sumo2","Sumo3","Sumo4","Sun1","Sun2","Sun3","Sun5","Suox","Supt16h","Supt3h","Supt20h","Supt4h1","Supt5h","Supt7l","Supt6h","Supv3l1","Surf1","Surf2","Surf4","Surf6","Susd1","Susd2","Susd3","Susd4","Susd5","Suv39h1","Susd6","Suv39h1l1","Suv39h2","Suz12","Sv2a","Sv2b","Sv2c","Sval1","Sval2","Svbp","Svep1","Svil","Svip","Svop","Svopl","Svs1","Svs3a","Svs3b","Svs4","Svs5","Svs6","Swap70","Swi5","Swsap1","Swt1","Syap1","Sybu","Syce1","Syce1l","Syce2","Syce3","Sycn","Sycp1","Sycp2","Sycp2l","Sycp3","Syde1","Syde2","Syf2","Sympk","Syk","Syn2","Syn1","Synb","Syn3","Sync","Syncrip","Syndig1","Syndig1l","Syne1","Syne2","Syne3","Syne4","Syngr1","Syngap1","Syngr2","Syngr3","Syngr4","Synj1","Synj2","Synj2bp","Synm","Synpo","Synpo2","Synpo2l","Synpr","Synrg","Sypl1","Syp","Sypl2","Sys1","Syt10","Syt11","Syt1","Syt12","Syt13","Syt14","Syt15","Syt16","Syt17","Syt2","Syt3","Syt5","Syt4","Syt6","Syt7","Syt8","Syt9","Sytl1","Sytl2","Sytl3","Sytl4","Sytl5","Syvn1","Szrd1","T","Szt2","T2","Taar1","Taar2","Taar3","Taar4","Taar5","Taar6","Taar7a","Taar7b","Taar7c","Taar7d","Taar7e","Taar7f-ps","Taar7g","Taar7h","Taar7i-ps","Taar8a","Taar8b","Taar8c","Taar9","Tab1","Tab2","Tab3","Tac3","Tac1","Tac4","Tacc1","Tacc2","Tacc3","Taco1","Tacr2","Tacr1","Tacr3","Tacstd2","Tada1","Tada2a","Tada2b","Tada3lb","Tada3","Taf1","Taf10","Taf11","Taf12","Taf13","Taf15","Taf1a","Taf1b","Taf1c","Taf1d","Taf2","Taf4","Taf3","Taf4b","Taf5","Taf5l","Taf6","Taf6l","Taf7","Taf7l","Taf7l-ps1","Taf8","Taf9","Taf9-ps","Tagap","Taf9b","Tagln","Tagln2","Tagln3","Tal2","Tal1","Taldo1","Tamm41","Tanc1","Tanc2","Tango2","Tango6","Tank","Taok1","Taok2","Taok3","Tap1","Tap2","Tapbpl","Tapbp","Tarbp1","Tapt1","Tarbp2","Tarm1","Tardbp","Tars","Tars2","Tarsl2","Tas1r1","Tas1r2","Tas1r3","Tas2r102","Tas2r103","Tas2r104","Tas2r105","Tas2r106","Tas2r107","Tas2r108","Tas2r109","Tas2r110","Tas2r113","Tas2r114","Tas2r116","Tas2r117","Tas2r118","Tas2r119","Tas2r120","Tas2r121","Tas2r123","Tas2r124","Tas2r125","Tas2r126","Tas2r129","Tas2r13","Tas2r130","Tas2r134","Tas2r136","Tas2r135","Tas2r137","Tas2r138","Tas2r139","Tas2r140","Tas2r143","Tas2r144","Tas2r145","Tas2r7l","Tasp1","Tatdn1","Tat","Tatdn2","Tatdn3","Tax1bp3","Tax1bp1","Tbata","Taz","Tbc1d1","Tbc1d10a","Tbc1d10b","Tbc1d10c","Tbc1d12","Tbc1d13","Tbc1d14","Tbc1d15","Tbc1d16","Tbc1d17","Tbc1d19","Tbc1d2","Tbc1d20","Tbc1d21","Tbc1d22a","Tbc1d22b","Tbc1d23","Tbc1d24","Tbc1d25","Tbc1d2b","Tbc1d30","Tbc1d31","Tbc1d32","Tbc1d4","Tbc1d5","Tbc1d7","Tbc1d8","Tbc1d8b","Tbc1d9","Tbca","Tbc1d9b","Tbcb","Tbcc","Tbccd1","Tbcd","Tbce","Tbcel","Tbck","Tbk1","Tbkbp1","Tbl1x","Tbl1xr1","Tbl2","Tbl3","Tbp","Tbpl1","Tbpl2","Tbr1","Tbrg1","Tbrg4","Tbx10","Tbx1","Tbx15","Tbx18","Tbx19","Tbx2","Tbx20","Tbx21","Tbx22","Tbx3","Tbx4","Tbx6","Tbx5","Tbxa2r","Tbxas1","Tc2n","Tcaf1","Tcaf2","Tcam1","Tcaim","Tcap","Tcea1","Tcea2","Tcea3","Tceal1","Tceal3","Tceal5","Tceal6","Tceal7","Tceal8","Tceal9","Tceanc","Tceanc2","Tcerg1","Tcerg1l","Tcf15","Tcf12","Tcf19","Tcf20","Tcf21","Tcf23","Tcf24","Tcf25","Tcf3","Tcf4","Tcf7","Tcf7l1","Tcf7l2","Tcfl5","Tchh","Tchhl1","Tchp","Tcirg1","Tcl1a","Tcn2","Tcof1","Tcp1-ps1","Tcp1","Tcp10b","Tcp11","Tcp11l1","Tcp11l2","Tcp11x2","Tcra-v22.1","Tcrb","Tcta","Tcte3","Tcte1","Tctex1d1","Tctex1d2","Tctex1d4","Tctn1","Tctn2","Tctn3","Tdg","Tdg-ps1","Tdgf1","Tdh","Tdo2","Tdp1","Tdp2","Tdpoz1","Tdrd12","Tdrd1","Tdrd15","Tdrd3","Tdrd6","Tdrd5","Tdrd7","Tdrd9","Tdrkh","Tdrp","Tead1","Tead2","Tead3","Tead4","Tec","Tecpr1","Tecpr2","Tecr","Tecrl","Tecta","Tectb","Tedc1","Teddm1","Tef","Tefm","Tekt1","Tek","Tekt2","Tekt3","Tekt4","Tekt5","Telo2","Ten1","Tenm1","Tenm2","Tenm3","Tenm4","Tep1","Tepp","Tepsin","Terb1","Terb2","Terc","Terf1","Terf2","Terf2ip","Tes","Tert","Tesb","Tesc","Tescl","Tesk1","Tesk2","Tesl","Tesmin","Testin","Tet1","Tet2","Tet3","Tex10","Tex101","Tex11","Tex12","Tex13a","Tex13b","Tex13c","Tex14","Tex15","Tex16-ps1","Tex19.1","Tex19.2","Tex2","Tex21","Tex22","Tex26","Tex261","Tex264","Tex28","Tex29","Tex30","Tex33","Tex35","Tex36","Tex37","Tex38","Tex43","Tex44","Tex45","Tex47","Tex49","Tex51","Tex52","Tex9","Tfam","Tf","Tfap2a","Tfap2b","Tfap2c","Tfap2d","Tfap2e","Tfap4","Tfb1m","Tfb2m","Tfcp2","Tfcp2l1","Tfdp1","Tfdp2","Tfe3","Tfeb","Tfec","Tff1","Tff2","Tff3","Tfg","Tfip11","Tfpi","Tfpi2","Tfpt","Tfr2","Tfrc","Tg","tGap1","Tgds","Tgfa","Tgfb1i1","Tgfb2","Tgfb1","Tgfb3","Tgfbi","Tgfbr1","Tgfbr2","Tgfbr3","Tgfbr3l","Tgfbrap1","Tgif1","Tgif2-ps1","Tgif2","Tgif2lx2","Tgm1","Tgm2","Tgm3","Tgm4","Tgm5","Tgm7","Tgm6","Tgs1","Tgoln2","Thada","Thap1","Th","Thap11","Thap12","Thap2","Thap3","Thap4","Thap6","Thap7","Thap8","Thbs1","Thbd","Thbs3","Thbs2","Theg","Thbs4","Thegl","Them4","Them5","Them6","Themis","Themis2","Thg1l","Thnsl1","Thoc1","Thnsl2","Thoc3","Thoc2","Thoc5","Thoc6","Thoc7","Thop1","Thpol1","Thpo","Thrap3","Thra","Thrb","Thrsp","Thsd1","Thsd4","Thsd7a","Thsd7b","Thtpa","Thumpd1","Thumpd2","Thumpd3","Thumpd3-as1","Thyn1","Thy1","Tia1","Tial1","Tiam1","Tiam2","Ticam1","Ticam2","Ticrr","Tie1","Tifa","Tifab","Tigar","Tigd2","Tigd3","Tigd4","Tigd5","Tigit","Timd2","Timd4","Timeless","Timm10","Timm13","Timm10b","Timm17al1","Timm17a","Timm17b","Timm21","Timm22","Timm23","Timm23b","Timm29","Timm44","Timm50","Timm8a1","Timm8a2","Timm8b","Timm9","Timmdc1","Timp1","Timp2","Timp4","Timp3","Tinag","Tinagl1","Tincr","Tinf2","Tiparp","Tipin-ps1","Tipin","Tipinl1","Tiprl","Tirap","Tjap1","Tjp2","Tjp1","Tjp3","Tk1","Tk2","Tkfc","Tkt","Tktl1","Tktl2","Tlcd1","Tlcd2","Tldc1","Tldc2","Tle1","Tle2","Tle3","Tle4","Tle6","Tlk1","Tlk2","Tll1","Tll2","Tln1","Tln2","Tlnrd1","Tlr1","Tlr10","Tlr11","Tlr12","Tlr13","Tlr3","Tlr2","Tlr4","Tlr5","Tlr6","Tlr7","Tlr8","Tlx1","Tlr9","Tlx2","Tlx3","Tm2d1","Tm2d3","Tm2d2","Tm4sf19","Tm4sf1","Tm4sf20","Tm4sf4","Tm4sf5","Tm6sf1","Tm6sf2","Tm7sf2","Tm7sf3","Tm9sf1","Tm9sf2","Tm9sf3","Tm9sf4","Tma16","Tma7","Tmbim1","Tmbim4","Tmbim6","Tmbim7","Tmc1","Tmc2","Tmc3","Tmc4","Tmc4b","Tmc5","Tmc6","Tmc7","Tmc8","Tmcc1","Tmcc2","Tmco1","Tmcc3","Tmco2","Tmco3","Tmco4","Tmco5a","Tmco5b","Tmco6","Tmed1","Tmed10","Tmed11","Tmed2","Tmed3","Tmed4","Tmed5","Tmed6","Tmed7","Tmed8","Tmed9","Tmeff1","Tmeff2","Tmem100","Tmem101","Tmem102","Tmem105","Tmem104","Tmem106a","Tmem106b","Tmem106c","Tmem107","Tmem108","Tmem109","Tmem11","Tmem110","Tmem114","Tmem115","Tmem116","Tmem117","Tmem119","Tmem120a","Tmem120b","Tmem121","Tmem121b","Tmem123","Tmem125","Tmem126a","Tmem126b","Tmem127","Tmem128","Tmem129","Tmem130","Tmem131","Tmem132a","Tmem132b","Tmem132c","Tmem132e","Tmem132d","Tmem134","Tmem135","Tmem136","Tmem138","Tmem139","Tmem140","Tmem141","Tmem144","Tmem143","Tmem145","Tmem147","Tmem14a","Tmem14c","Tmem150a","Tmem150b","Tmem150c","Tmem151a","Tmem151b","Tmem154","Tmem156","Tmem158","Tmem159","Tmem160","Tmem161a","Tmem161b","Tmem163","Tmem164","Tmem165","Tmem167a","Tmem167b","Tmem168","Tmem169","Tmem17","Tmem170a","Tmem170b","Tmem171","Tmem173","Tmem174","Tmem175","Tmem176a","Tmem176b","Tmem177","Tmem178a","Tmem178b","Tmem179","Tmem179b","Tmem18","Tmem181","Tmem182","Tmem183a","Tmem184a","Tmem184b","Tmem184c","Tmem185a","Tmem185b","Tmem186","Tmem189","Tmem19","Tmem190","Tmem191c","Tmem192","Tmem196","Tmem198","Tmem198b","Tmem199","Tmem2","Tmem200a","Tmem200b","Tmem200c","Tmem201","Tmem202","Tmem203","Tmem204","Tmem205","Tmem206","Tmem207","Tmem208","Tmem209","Tmem210","Tmem211","Tmem212","Tmem213","Tmem214","Tmem215","Tmem216","Tmem217","Tmem218","Tmem219","Tmem220","Tmem221","Tmem222","Tmem223","Tmem225","Tmem229a","Tmem229b","Tmem230","Tmem231","Tmem232","Tmem233","Tmem234","Tmem235","Tmem236","Tmem238","Tmem237","Tmem239","Tmem240","Tmem241","Tmem242","Tmem243","Tmem245","Tmem246","Tmem247","Tmem249","Tmem248","Tmem25","Tmem250","Tmem251","Tmem252","Tmem253","Tmem254","Tmem255a","Tmem255b","Tmem256","Tmem258","Tmem258b","Tmem259","Tmem26","Tmem262","Tmem260","Tmem265","Tmem263","Tmem266","Tmem267","Tmem268","Tmem269","Tmem270","Tmem27","Tmem30b","Tmem30a","Tmem30c","Tmem33","Tmem35a","Tmem35b","Tmem37","Tmem38a","Tmem38b","Tmem39a","Tmem39b","Tmem40","Tmem41a","Tmem41b","Tmem42","Tmem43","Tmem44","Tmem45a","Tmem45al","Tmem45b","Tmem47","Tmem5","Tmem50a","Tmem50b","Tmem51","Tmem52","Tmem52b","Tmem53","Tmem54","Tmem56","Tmem57","Tmem59","Tmem59l","Tmem60","Tmem61","Tmem62","Tmem63a","Tmem63b","Tmem63c","Tmem64","Tmem65","Tmem67","Tmem68","Tmem69","Tmem70","Tmem71","Tmem72","Tmem74","Tmem74b","Tmem74bos","Tmem79","Tmem80","Tmem81","Tmem82","Tmem86a","Tmem86b","Tmem87a","Tmem87b","Tmem88","Tmem88b","Tmem89","Tmem8a","Tmem8b","Tmem9","Tmem91","Tmem92","Tmem95","Tmem97","Tmem98","Tmem9b","Tmf1","Tmie","Tmigd1","Tmigd3","Tmlhe","Tmod1","Tmod2","Tmod3","Tmod4","Tmpo","Tmppe","Tmprss11a","Tmprss11b","Tmprss11c","Tmprss11d","Tmprss11e","Tmprss11f","Tmprss11g","Tmprss12","Tmprss13","Tmprss15","Tmprss2","Tmprss3","Tmprss4","Tmprss5","Tmprss6","Tmprss7","Tmprss9","Tmsb10","Tmsb15b2","Tmtc1","Tmsb4x","Tmtc3","Tmtc2","Tmub1","Tmtc4","Tmx1","Tmub2","Tmx2","Tmx3","Tmx4","Tnc","Tnfaip1","Tnfaip2","Tnfaip3","Tnfaip6","Tnfaip8","Tnfaip8l1","Tnfaip8l2","Tnf","Tnfaip8l3","Tnfrsf10b","Tnfrsf11a","Tnfrsf11b","Tnfrsf12a","Tnfrsf13b","Tnfrsf13c","Tnfrsf14","Tnfrsf17","Tnfrsf18","Tnfrsf19","Tnfrsf1b","Tnfrsf1a","Tnfrsf21","Tnfrsf22","Tnfrsf25","Tnfrsf26","Tnfrsf4","Tnfrsf8","Tnfrsf9","Tnfsf10","Tnfsf11","Tnfsf12","Tnfsf13","Tnfsf13b","Tnfsf14","Tnfsf15","Tnfsf18","Tnfsf4","Tnfsf8","Tnfsf9","Tnik","Tnip1","Tnip2","Tnip3","Tnk1","Tnk2","Tnks","Tnks1bp1","Tnks2","Tnmd","Tnn","Tnnc1","Tnnc2","Tnni1","Tnni2","Tnni3","Tnni3k","Tnnt1","Tnnt2","Tnnt3","Tnp1","Tnp2","Tnpo1","Tnpo2","Tnpo3","Tnrc18","Tnr","Tnrc6a","Tnrc6b","Tnrc6c","Tns1","Tns2","Tns3","Tns4","Tnxa-ps1","Tnxb","Tob1","Tob2","Toe1","Togaram1","Togaram2","Tollip","Tom1","Tom1l1","Tom1l2","Tomm20l","Tomm20","Tomm22","Tomm34","Tomm40l","Tomm40","Tomm5","Tomm6","Tomm7","Tomm70","Tonsl","Top1","Top1mt","Top2b","Top2a","Top3a","Top3b","Topaz1","Topbp1","Topors","Tor1a","Tor1aip1","Tor1aip2","Tor1b","Tor2a","Tor3a","Tor4a","Tore","Tox","Tox2","Tox3","Tox4","Tp53bp2","Tp53bp1","Tp53i11","Tp53i3","Tp53i13","Tp53inp2","Tp53rk","Tp53tg5","Tp53inp1","Tpbgl","Tpbpa","Tpbg","Tp63","Tp73","Tpc1808","Tpcr12","Tpcn1","Tpcn2","Tpd52","Tpd52l1","Tp53","Tpgs1","Tpd52l3","Tpd52l2","Tpgs2","Tph2","Tph1","Tpi1","Tpk1","Tpm3_v1","Tpm2","Tpm4","Tpmt","Tpm1","Tpm3","Tpo","Tpp2","Tppp","Tpp1","Tppp2","Tppp3","Tprg1","Tpra1","Tprg1l","Tpr","Tprn","Tprkb","Tpsb2","Tpsg1","Tpsab1","Tpst1","Tpst2","Tpte2","Tpx2","Tra2a","Tpt1","Tra2b","Trabd","Trabd2b","Tradd","Traf1","Traf3ip1","Traf2","Traf3","Traf3ip2","Traf3ip3","Traf5","Traf4","Traf6","Traf7","Trafd1","Traip","Trak1","Tram1l1","Trak2","Tram1","Tram2","Trank1","Trap1","Trap1a","Trappc1","Trappc10","Trappc12","Trappc11","Trappc2","Trappc13","Trappc2b","Trappc2l","Trappc3","Trappc3l","Trappc5","Trappc4","Trappc6a","Trappc6b","Trappc8","Trat1","Trappc9","Trav14s2","Trav12-3","Trav22","Treh","Trem1","Trdmt1","Trem2","Trdn","Trem3","Treml1","Treml4","Treml2","Trex1","Trerf1","Trex2","Trg","Triap1","Trhde","Trhr","Trib1","Trh","Trib2","Tril","Trim10","Trib3","Trim13","Trim11","Trim14","Trim15-ps1","Trim15","Trim16","Trim17","Trim2","Trim21","Trim24","Trim23","Trim25","Trim29","Trim26","Trim27","Trim3","Trim28","Trim30","Trim31","Trim30c","Trim34","Trim32","Trim33","Trim35","Trim36","Trim38","Trim39-ps","Trim39","Trim40","Trim43a","Trim37","Trim42","Trim41","Trim44","Trim45","Trim47","Trim46","Trim50","Trim5","Trim52","Trim54","Trim58","Trim55","Trim60","Trim59","Trim6","Trim62","Trim65","Trim66","Trim63","Trim67","Trim68","Trim7","Trim69","Trim8","Trim72","Trim71","Trim80","Triml1","Triml2","Trim9","Triobp","Trip10","Trip11","Trio","Trip13","Trip6","Trip12","Trip4","Triqk","Trir","Trit1","Trmo","Trmt1","Trmt10a","Trmt10b","Trmt10c","Trmt11","Trmt112","Trmt12","Trmt13","Trmt1l","Trmt2b","Trmt2a","Trmt5","Trmt44","Trmt6","Trmt61a","Trnaa-agc1","Trmu","Trnaa-agc10","Trnaa-agc11","Trnaa-agc13","Trnaa-agc12","Trnaa-agc15","Trnaa-agc14","Trnaa-agc16","Trnaa-agc17","Trnaa-agc19","Trnaa-agc18","Trnaa-agc2","Trnaa-agc20","Trnaa-agc3","Trnaa-agc4","Trnaa-agc5","Trnaa-agc6","Trnaa-agc7","Trnaa-agc8","Trnaa-agc9","Trnaa-cgc1","Trnaa-cgc2","Trnaa-cgc3","Trnaa-cgc4","Trnaa-ggc1","Trnaa-ugc1","Trnaa-ugc2","Trnaa-ugc3","Trnaa-ugc","Trnaa-ugc4","Trnaa-ugc5","Trnaa-ugc6","Trnaa-ugc7","Trnaa-ugc8","Trnaa-ugc9","Trnac-gca1","Trnac-gca10","Trnac-gca11","Trnac-gca12","Trnac-gca13","Trnac-gca","Trnac-gca14","Trnac-gca15","Trnac-gca16","Trnac-gca17","Trnac-gca18","Trnac-gca19","Trnac-gca2","Trnac-gca20","Trnac-gca21","Trnac-gca22","Trnac-gca23","Trnac-gca24","Trnac-gca25","Trnac-gca26","Trnac-gca27","Trnac-gca28","Trnac-gca29","Trnac-gca3","Trnac-gca30","Trnac-gca31","Trnac-gca32","Trnac-gca33","Trnac-gca34","Trnac-gca35","Trnac-gca36","Trnac-gca37","Trnac-gca38","Trnac-gca39","Trnac-gca4","Trnac-gca5","Trnac-gca6","Trnac-gca7","Trnac-gca8","Trnac-gca9","Trnad-guc1","Trnad-guc10","Trnad-guc11","Trnad-guc13","Trnad-guc12","Trnad-guc14","Trnad-guc2","Trnad-guc3","Trnad-guc4","Trnad-guc5","Trnad-guc6","Trnad-guc7","Trnad-guc8","Trnad-guc9","Trnae-cuc1","Trnae-cuc2","Trnae-cuc3","Trnae-cuc4","Trnae-cuc5","Trnae-cuc6","Trnae-cuc7","Trnae-cuc8","Trnae-cuc9","Trnae-uuc1","Trnae-uuc10","Trnae-uuc2","Trnae-uuc3","Trnae-uuc4","Trnae-uuc5","Trnae-uuc6","Trnae-uuc7","Trnae-uuc8","Trnae-uuc9","Trnaf-gaa1","Trnaf-gaa2","Trnaf-gaa3","Trnaf-gaa4","Trnaf-gaa5","Trnaf-gaa6","Trnaf-gaa7","Trnaf-gaa8","Trnag-ccc1","Trnag-ccc3","Trnag-ccc2","Trnag-ccc4","Trnag-ccc5","Trnag-gcc1","Trnag-gcc10","Trnag-gcc11","Trnag-gcc2","Trnag-gcc3","Trnag-gcc4","Trnag-gcc5","Trnag-gcc6","Trnag-gcc7","Trnag-gcc8","Trnag-gcc9","Trnag-ucc","Trnag-ucc1","Trnag-ucc2","Trnag-ucc3","Trnag-ucc4","Trnag-ucc5","Trnag-ucc6","Trnag-ucc7","Trnag-ucc8","Trnag-ucc9","Trnah-gug10","Trnah-gug1","Trnah-gug11","Trnah-gug2","Trnah-gug3","Trnah-gug4","Trnah-gug5","Trnah-gug6","Trnah-gug7","Trnah-gug8","Trnah-gug9","Trnai-aau1","Trnai-aau10","Trnai-aau11","Trnai-aau2","Trnai-aau3","Trnai-aau4","Trnai-aau5","Trnai-aau6","Trnai-aau7","Trnai-aau8","Trnai-aau9","Trnai-uau1","Trnai-uau2","Trnai-uau3","Trnak-cuu1","Trnak-cuu","Trnak-cuu10","Trnak-cuu11","Trnak-cuu12","Trnak-cuu13","Trnak-cuu14","Trnak-cuu15","Trnak-cuu16","Trnak-cuu17","Trnak-cuu18","Trnak-cuu2","Trnak-cuu3","Trnak-cuu4","Trnak-cuu5","Trnak-cuu6","Trnak-cuu7","Trnak-cuu8","Trnak-cuu9","Trnak-uuu","Trnak-uuu1","Trnak-uuu2","Trnak-uuu3","Trnak-uuu4","Trnak-uuu5","Trnak-uuu6","Trnak-uuu7","Trnak-uuu8","Trnak-uuu9","Trnal-aag1","Trnal-aag2","Trnal-aag3","Trnal-aag4","Trnal-aag5","Trnal-aag6","Trnal-caa2","Trnal-caa1","Trnal-caa3","Trnal-cag1","Trnal-cag10","Trnal-cag2","Trnal-cag3","Trnal-cag4","Trnal-cag5","Trnal-cag6","Trnal-cag7","Trnal-cag9","Trnal-cag8","Trnal-uaa1","Trnal-uaa2","Trnal-uag1","Trnal-uag2","Trnal-uag3","Trnam-cau1","Trnam-cau10","Trnam-cau11","Trnam-cau12","Trnam-cau13","Trnam-cau2","Trnam-cau3","Trnam-cau4","Trnam-cau5","Trnam-cau6","Trnam-cau7","Trnam-cau8","Trnam-cau9","Trnan-guu","Trnan-guu1","Trnan-guu10","Trnan-guu11","Trnan-guu12","Trnan-guu13","Trnan-guu2","Trnan-guu3","Trnan-guu4","Trnan-guu5","Trnan-guu6","Trnan-guu7","Trnan-guu8","Trnan-guu9","Trnan1","Trnap-agg","Trnap-agg1","Trnap-agg10","Trnap-agg11","Trnap-agg13","Trnap-agg12","Trnap-agg14","Trnap-agg15","Trnap-agg16","Trnap-agg17","Trnap-agg18","Trnap-agg2","Trnap-agg3","Trnap-agg4","Trnap-agg5","Trnap-agg6","Trnap-agg7","Trnap-agg8","Trnap-agg9","Trnap-cgg1","Trnap-cgg2","Trnap-cgg3","Trnap-ugg","Trnap-ugg1","Trnap-ugg2","Trnap-ugg4","Trnap-ugg3","Trnap-ugg5","Trnap-ugg6","Trnaq-cug1","Trnaq-cug","Trnaq-cug10","Trnaq-cug2","Trnaq-cug3","Trnaq-cug4","Trnaq-cug5","Trnaq-cug6","Trnaq-cug7","Trnaq-cug8","Trnaq-cug9","Trnaq-uug1","Trnaq-uug2","Trnaq-uug3","Trnaq-uug4","Trnaq-uug5","Trnar-acg1","Trnar-acg2","Trnar-acg3","Trnar-acg4","Trnar-acg5","Trnar-acg6","Trnar-ccg1","Trnar-ccg2","Trnar-ccg3","Trnar-ccu","Trnar-ccu1","Trnar-ccu2","Trnar-ccu3","Trnar-ccu4","Trnar-ccu5","Trnar-ccu6","Trnar-ccu7","Trnar-ccu8","Trnar-ccu9","Trnar-ucg1","Trnar-ucg2","Trnar-ucg3","Trnar-ucg4","Trnar-ucg5","Trnar-ucu1","Trnar-ucu2","Trnar-ucu3","Trnar-ucu4","Trnar-ucu5","Trnar-ucu6","Trnar-ucu7","Trnas-aga1","Trnas-aga10","Trnas-aga11","Trnas-aga2","Trnas-aga3","Trnas-aga4","Trnas-aga5","Trnas-aga6","Trnas-aga7","Trnas-aga8","Trnas-aga9","Trnas-cga1","Trnas-cga2","Trnas-cga3","Trnas-gcu","Trnas-gcu1","Trnas-gcu10","Trnas-gcu11","Trnas-gcu2","Trnas-gcu3","Trnas-gcu4","Trnas-gcu5","Trnas-gcu6","Trnas-gcu7","Trnas-gcu8","Trnas-gcu9","Trnas-uga1","Trnas-uga2","Trnas-uga3","Trnas-uga4","Trnat-agu","Trnat-agu1","Trnat-agu2","Trnat-agu3","Trnat-agu4","Trnat-agu5","Trnat-agu6","Trnat-agu7","Trnat-agu8","Trnat-cgu1","Trnat-cgu2","Trnat-cgu3","Trnat-cgu4","Trnat-cgu5","Trnat-ugu1","Trnat-ugu2","Trnat-ugu3","Trnat-ugu4","Trnat-ugu5","Trnav-aac1","Trnau1ap","Trnav-aac2","Trnav-aac3","Trnav-aac4","Trnav-aac5","Trnav-aac6","Trnav-aac7","Trnav-cac1","Trnav-cac2","Trnav-cac3","Trnav-cac4","Trnav-cac5","Trnav-cac6","Trnav-cac7","Trnav-cac8","Trnav-uac1","Trnav-uac2","Trnav-uac3","Trnav-uac4","Trnaw-cca1","Trnaw-cca2","Trnaw-cca3","Trnaw-cca4","Trnaw-cca5","Trnaw-cca6","Trnaw-cca7","Trnaw-cca8","Trnay-gua1","Trnay-gua2","Trnay-gua3","Trnay-gua4","Trnay-gua5","Trnay-gua6","Trnay-gua7","Trnay-gua8","Trnp1","Trnt1","Trnt1-ps1","Tro","Troap","Trove2","Trpa1","Trpc1","Trpc2","Trpc3","Trpc4ap","Trpc4","Trpc5os","Trpc5","Trpc7","Trpc6","Trpm1","Trpm2","Trpm3","Trpm4","Trpm5","Trpm6","Trpm7","Trpm8","Trps1","Trpt1","Trpv2","Trpv3","Trpv1","Trpv4","Trpv5","Trrap","Trpv6","Trub2","Trub1","Trub2-ps1","Trub2-ps2","Try10","Try5","Tryx5","Tsacc","Tsc1","Tsc2","Tsc22d1","Tsc22d2","Tsc22d3","Tsc22d4","Tsen15","Tsen2","Tsen34l1","Tsen34","Tsen54","Tsfm","Tsga10","Tsg101","Tsga10ip","Tsga13","Tshb","Tshr","Tshz1","Tshz2","Tshz3","Tsks","Tsku","Tslp","Tsn","Tsnax","Tsnaxip1","Tspan10","Tspan1","Tspan11","Tspan12","Tspan13","Tspan14","Tspan15","Tspan17","Tspan18","Tspan2","Tspan3","Tspan31","Tspan32","Tspan33","Tspan4","Tspan5","Tspan6","Tspan7","Tspan8","Tspan9","Tspear","Tspo","Tspo2","Tspy1","Tspoap1","Tspy26","Tspyl1","Tspyl2","Tspyl4","Tspyl5","Tsr1","Tsr2","Tsr3","Tssc4","Tssk1b","Tssk2","Tssk3","Tssk4","Tssk5","Tssk6","Tst","Tsta3","Tstd1","Tstd2","Tstd3","Tsx","Ttbk1","Ttbk2","Ttc1","Ttc12","Ttc13","Ttc14","Ttc16","Ttc17","Ttc19","Ttc21a","Ttc21b","Ttc22","Ttc23","Ttc23l","Ttc24","Ttc25","Ttc26","Ttc27","Ttc28","Ttc29","Ttc30a","Ttc3","Ttc30a1","Ttc30b","Ttc32","Ttc33","Ttc34","Ttc36","Ttc38","Ttc37","Ttc39b","Ttc39a","Ttc39d","Ttc39c","Ttc5","Ttc4","Ttc6","Ttc7a","Ttc7b","Ttc9","Ttc8","Ttc9b","Ttc9c","Ttf1","Ttf2","Tti1","Tti2","Ttl","Ttk","Ttll1","Ttll10","Ttll11","Ttll12","Ttll2","Ttll13","Ttll4","Ttll3","Ttll6","Ttll5","Ttll7","Ttll8","Ttll9","Ttn","Ttpa","Ttpal","Ttyh1","Ttr","Ttyh2","Ttyh3","Tub","Tuba1b","Tuba1a","Tuba1c","Tuba3a","Tuba3b","Tuba4a","Tuba8","Tubal3","Tubb1","Tubb2a","Tubb2b","Tubb3","Tubb4a","Tubb4b","Tubb5","Tubd1","Tubb6","Tube1","Tubg1","Tubg2","Tubgcp2","Tubgcp3","Tubgcp4","Tubgcp5","Tubgcp6","Tufm","Tuft1","Tug1","Tulp1","Tulp2","Tulp3","Tulp4","Tusc2","Tusc3","Tusc5","Tut1","Tvp23a","Tvp23b","Twf1","Twf2","Twf2-ps1","Twist1","Twist2","Twistnb","Twnk","Twsg1","Txlna","Txk","Txlnb","Txlng","Txn2","Txn1","Txndc11","Txndc12","Txndc15","Txndc16","Txndc17","Txndc2","Txndc5","Txndc8","Txndc9","Txnip","Txnl1","Txnl4a","Txnl4b","Txnrd1","Txnrd2","Txnrd3","Tyk2","Tymp","Tyms","Tyr","Tyro3","Tyrobp","Tyrp1","Tysnd1","Tyw1","Tyw3","Tyw5","U2af1","U2af1l4","U2af2","U2surp","Uaca","Uap1","Uap1l1","Uap1l2","Uba1","Uba1y","Uba2-ps1","Uba2","Uba3","Uba52","Uba5","Uba6","Uba7","Ubac1","Ubac2","Ubald1","Ubald2","Ubap1","Ubap1l","Ubap2","Ubap2l","Ubash3a","Ubash3b","Ubbp4","Ubb","Ubd","Ubc","Ube2a","Ube2b","Ube2c","Ube2d1","Ube2d2","Ube2d3","Ube2d4","Ube2d4l1","Ube2e1","Ube2e2","Ube2e3","Ube2f","Ube2g1","Ube2g2","Ube2h","Ube2i","Ube2j1","Ube2j2","Ube2k","Ube2l3","Ube2l6","Ube2m","Ube2n","Ube2o","Ube2q1","Ube2q2","Ube2q2l","Ube2ql1","Ube2s","Ube2r2","Ube2t","Ube2u","Ube2v1","Ube2v2","Ube2w","Ube2z","Ube3a","Ube3b","Ube3c","Ube3d","Ube4a","Ube4b","Ubfd1","Ubiad1","Ubl3","Ubl4b","Ubl4a","Ubl5","Ubl7","Ublcp1","Ubn1","Ubn2","Ubox5","Ubp1","Ubqln1","Ubqln2","Ubqln3","Ubqln4","Ubqlnl","Ubr1","Ubr2","Ubr3","Ubr5","Ubr4","Ubr7","Ubtd1","Ubtd2","Ubtfl1","Ubtf","Ubxn10","Ubxn1","Ubxn2a","Ubxn11","Ubxn2b","Ubxn4","Ubxn7","Ubxn6","Ubxn8","Uchl1","Uchl3","Uchl3-ps1","Uck1","Uchl5","Uck2","Uckl1","Ucma","Ucn","Ucn2","Ucn3","Ucp1","Ucp2","Ucp3","Uevld","Ufc1","Ufd1","Ufl1","Ufm1","Ufsp1","Ufsp2","Ugcg","Uggt1","Ugdh","Uggt2","Ugp2","Ugt1a2","Ugt1a1","Ugt1a4-ps","Ugt1a3","Ugt1a5","Ugt1a6","Ugt1a7c","Ugt1a8","Ugt1a9","Ugt1a9-ps","Ugt2a1","Ugt2a3","Ugt2b10","Ugt2b","Ugt2b17","Ugt2b15","Ugt2b35","Ugt2b37","Ugt2b7","Ugt3a2","Ugt8","Uhmk1","Uhrf1","Uhrf1bp1","Uhrf1bp1l","Uhrf2","Uimc1","Ulk1","Ulk2","Ulk3","Ulk4","Umodl","Umod","Umodl1","Umps","Unc119","Unc119b","Unc13a","Unc13b","Unc13c","Unc13d","Unc45a","Unc45b","Unc50","Unc5a","Unc5b","Unc5cl","Unc5c","Unc5d","Unc79","Unc80","Unc93a","Unc93b1","Uncx","Ung","Unk","Unkl","Uox","Upb1","Upf1","Upf2","Upf3a","Upf3b","Upk1a","Upk1b","Upk2","Upk3a","Upk3b","Upk3bl1","Upp2","Upp1","Uprt","Uqcc1","Uqcc2","Uqcc3","Uqcr10","Uqcr11","Uqcrb-ps1","Uqcrb","Uqcrc1","Uqcrc2","Uqcrfs1","Uqcrh","Urad","Uqcrq","Urb1","Urb2","Urgcp","Uri1","Urm1","Uroc1","Urod","Uros","Usb1","Use1","Usf1","Usf2","Usf3","Ush1c","Ush1g","Ushbp1","Usmg5","Ush2a","Uso1","Usp1","Usp10","Usp11","Usp12","Usp13","Usp14","Usp15","Usp16","Usp17l5","Usp18","Usp19","Usp2","Usp20","Usp21","Usp22","Usp24","Usp25","Usp26","Usp27x","Usp28","Usp29","Usp3","Usp30","Usp31","Usp32","Usp33","Usp34","Usp35","Usp36","Usp37","Usp38","Usp39","Usp4","Usp40","Usp42","Usp43","Usp44","Usp45","Usp46","Usp47","Usp48","Usp49","Usp5","Usp50","Usp51","Usp53","Usp54","Usp6nl","Usp7","Usp8","Usp9y","Usp9x","Uspl1","Ust","UST4r","Utf1","Ust5r","Utp11","Utp14a","Utp15","Utp18","Utp20","Utp23","Utp3","Utp4","Utp6","Uts2","Utrn","Uts2b","Uts2r","Uty","Uvrag","Uvssa","Uxt","Uxs1","V1ra14","Vac14","Vamp1","Vamp3","Vamp2","Vamp4","Vamp5","Vamp7","Vamp8","Vangl1","Vangl2","Vapa","Vapb","Vars","Vars2","Vash1","Vash2","Vasn","Vasp","Vat1","Vat1l","Vav1","Vav2","Vav3","Vax1","Vax2","Vbp1","Vcan","Vcam1","Vcl","Vcp","Vcpip1","Vcpkmt","Vcsa2","Vdac1","Vdac2","Vdac3","Vdr","Vegfb","Vegfa","Vegfc","Vegfd","Vegp2","Veph1","Vezf1","Vezt","Vgf","Vgll1","Vgll2","Vgll3","Vgll4","Vhl","Vhll","Vil1","Vill","Vim","Vip","Vipas39","Vipr1","Vipr2","Virma","Vit","Vkorc1","Vkorc1l1","Vma21","Vldlr","Vmac","Vmo1","Vmp1","Vnn1","Vnn3","Vof16","Vom1r-ps1","Vom1r-ps10","Vom1r-ps100","Vom1r-ps101","Vom1r-ps102","Vom1r-ps103","Vom1r-ps104","Vom1r-ps105","Vom1r-ps106","Vom1r-ps107","Vom1r-ps108","Vom1r-ps11","Vom1r-ps110","Vom1r-ps111","Vom1r-ps112","Vom1r-ps12","Vom1r-ps13","Vom1r-ps14","Vom1r-ps15","Vom1r-ps16","Vom1r-ps17","Vom1r-ps18","Vom1r-ps19","Vom1r-ps2","Vom1r-ps20","Vom1r-ps21","Vom1r-ps22","Vom1r-ps23","Vom1r-ps24","Vom1r-ps25","Vom1r-ps26","Vom1r-ps27","Vom1r-ps28","Vom1r-ps29","Vom1r-ps3","Vom1r-ps30","Vom1r-ps31","Vom1r-ps32","Vom1r-ps33","Vom1r-ps34","Vom1r-ps35","Vom1r-ps36","Vom1r-ps37","Vom1r-ps38","Vom1r-ps4","Vom1r-ps40","Vom1r-ps41","Vom1r-ps43","Vom1r-ps42","Vom1r-ps44","Vom1r-ps45","Vom1r-ps46","Vom1r-ps47","Vom1r-ps48","Vom1r-ps49","Vom1r-ps5","Vom1r-ps50","Vom1r-ps51","Vom1r-ps52","Vom1r-ps53","Vom1r-ps54","Vom1r-ps55","Vom1r-ps56","Vom1r-ps57","Vom1r-ps58","Vom1r-ps59","Vom1r-ps6","Vom1r-ps60","Vom1r-ps61","Vom1r-ps62","Vom1r-ps63","Vom1r-ps64","Vom1r-ps65","Vom1r-ps66","Vom1r-ps68","Vom1r-ps67","Vom1r-ps69","Vom1r-ps7","Vom1r-ps70","Vom1r-ps71","Vom1r-ps72","Vom1r-ps73","Vom1r-ps74","Vom1r-ps75","Vom1r-ps76","Vom1r-ps77","Vom1r-ps78","Vom1r-ps79","Vom1r-ps8","Vom1r-ps80","Vom1r-ps81","Vom1r-ps82","Vom1r-ps83","Vom1r-ps84","Vom1r-ps85","Vom1r-ps86","Vom1r-ps87","Vom1r-ps88","Vom1r-ps89","Vom1r-ps9","Vom1r-ps90","Vom1r-ps92","Vom1r-ps91","Vom1r-ps93","Vom1r-ps94","Vom1r-ps95","Vom1r-ps96","Vom1r-ps97","Vom1r-ps98","Vom1r-ps99","Vom1r1","Vom1r10","Vom1r100","Vom1r101","Vom1r102","Vom1r103","Vom1r104","Vom1r105","Vom1r106","Vom1r107","Vom1r108","Vom1r109","Vom1r11","Vom1r110","Vom1r111","Vom1r12","Vom1r13","Vom1r14","Vom1r15","Vom1r16","Vom1r17","Vom1r19","Vom1r2","Vom1r20","Vom1r21","Vom1r22","Vom1r23","Vom1r24","Vom1r25","Vom1r26","Vom1r27","Vom1r28","Vom1r3","Vom1r29","Vom1r30","Vom1r31","Vom1r32","Vom1r33","Vom1r34","Vom1r35","Vom1r36","Vom1r37","Vom1r38","Vom1r39","Vom1r4","Vom1r40","Vom1r41","Vom1r42","Vom1r43","Vom1r44","Vom1r45","Vom1r46","Vom1r47","Vom1r48","Vom1r49","Vom1r5","Vom1r50","Vom1r51","Vom1r52","Vom1r53","Vom1r54","Vom1r55","Vom1r56","Vom1r58","Vom1r57","Vom1r59","Vom1r6","Vom1r60","Vom1r61","Vom1r62","Vom1r63","Vom1r64","Vom1r65","Vom1r66","Vom1r67","Vom1r68","Vom1r69","Vom1r7","Vom1r70","Vom1r71","Vom1r72","Vom1r73","Vom1r74","Vom1r75","Vom1r76","Vom1r77","Vom1r78","Vom1r79","Vom1r8","Vom1r80","Vom1r81","Vom1r82","Vom1r83","Vom1r84","Vom1r85","Vom1r86","Vom1r87","Vom1r88","Vom1r89","Vom1r9","Vom1r92","Vom1r90","Vom1r93","Vom1r94","Vom1r95","Vom1r96","Vom1r97","Vom1r98","Vom2r-ps1","Vom1r99","Vom2r-ps10","Vom2r-ps100","Vom2r-ps101","Vom2r-ps103","Vom2r-ps104","Vom2r-ps105","Vom2r-ps106","Vom2r-ps107","Vom2r-ps108","Vom2r-ps109","Vom2r-ps110","Vom2r-ps11","Vom2r-ps111","Vom2r-ps112","Vom2r-ps113","Vom2r-ps114","Vom2r-ps115","Vom2r-ps116","Vom2r-ps117","Vom2r-ps118","Vom2r-ps119","Vom2r-ps12","Vom2r-ps120","Vom2r-ps121","Vom2r-ps122","Vom2r-ps123","Vom2r-ps124","Vom2r-ps125","Vom2r-ps126","Vom2r-ps127","Vom2r-ps128","Vom2r-ps129","Vom2r-ps13","Vom2r-ps130","Vom2r-ps131","Vom2r-ps132","Vom2r-ps133","Vom2r-ps136","Vom2r-ps135","Vom2r-ps137","Vom2r-ps138","Vom2r-ps14","Vom2r-ps140","Vom2r-ps141","Vom2r-ps142","Vom2r-ps15","Vom2r-ps16","Vom2r-ps17","Vom2r-ps18","Vom2r-ps19","Vom2r-ps20","Vom2r-ps22","Vom2r-ps23","Vom2r-ps24","Vom2r-ps25","Vom2r-ps26","Vom2r-ps28","Vom2r-ps27","Vom2r-ps3","Vom2r-ps30","Vom2r-ps31","Vom2r-ps32","Vom2r-ps33","Vom2r-ps34","Vom2r-ps35","Vom2r-ps36","Vom2r-ps37","Vom2r-ps38","Vom2r-ps39","Vom2r-ps4","Vom2r-ps40","Vom2r-ps41","Vom2r-ps42","Vom2r-ps43","Vom2r-ps44","Vom2r-ps46","Vom2r-ps45","Vom2r-ps47","Vom2r-ps48","Vom2r-ps49","Vom2r-ps5","Vom2r-ps50","Vom2r-ps51","Vom2r-ps52","Vom2r-ps53","Vom2r-ps54","Vom2r-ps55","Vom2r-ps56","Vom2r-ps57","Vom2r-ps59","Vom2r-ps61","Vom2r-ps60","Vom2r-ps62","Vom2r-ps63","Vom2r-ps64","Vom2r-ps65","Vom2r-ps66","Vom2r-ps67","Vom2r-ps69","Vom2r-ps7","Vom2r-ps70","Vom2r-ps71","Vom2r-ps72","Vom2r-ps74","Vom2r-ps75","Vom2r-ps76","Vom2r-ps77","Vom2r-ps78","Vom2r-ps79","Vom2r-ps8","Vom2r-ps82","Vom2r-ps84","Vom2r-ps83","Vom2r-ps85","Vom2r-ps86","Vom2r-ps87","Vom2r-ps88","Vom2r-ps89","Vom2r-ps9","Vom2r-ps90","Vom2r-ps91","Vom2r-ps92","Vom2r-ps93","Vom2r-ps94","Vom2r-ps95","Vom2r-ps96","Vom2r-ps97","Vom2r-ps98","Vom2r-ps99","Vom2r1","Vom2r10","Vom2r11","Vom2r12","Vom2r13","Vom2r15","Vom2r16","Vom2r17","Vom2r18","Vom2r19","Vom2r2","Vom2r21","Vom2r22","Vom2r23","Vom2r24","Vom2r25","Vom2r26","Vom2r27","Vom2r28","Vom2r29","Vom2r3","Vom2r30","Vom2r31","Vom2r32","Vom2r34","Vom2r33","Vom2r35","Vom2r36","Vom2r38","Vom2r37","Vom2r39","Vom2r4","Vom2r40","Vom2r41","Vom2r42","Vom2r43","Vom2r44","Vom2r45","Vom2r46","Vom2r47","Vom2r48","Vom2r49","Vom2r5","Vom2r50","Vom2r51","Vom2r52","Vom2r53","Vom2r54","Vom2r55","Vom2r56","Vom2r57","Vom2r58","Vom2r59","Vom2r6","Vom2r60","Vom2r62","Vom2r61","Vom2r63","Vom2r64","Vom2r65","Vom2r66","Vom2r67","Vom2r68","Vom2r69","Vom2r7","Vom2r70","Vom2r71","Vom2r72","Vom2r73","Vom2r75","Vom2r76","Vom2r77","Vom2r78","Vom2r79","Vom2r8","Vom2r80","Vom2r81","Vom2r9","Vopp1","Vpreb2","Vpreb1","Vpreb3","Vps11","Vps13b","Vps13a","Vps13c","Vps13d","Vps16","Vps18","Vps25","Vps26a","Vps26b","Vps28","Vps29","Vps33a","Vps33b","Vps35","Vps36","Vps37a","Vps37b","Vps37c","Vps37d","Vps39","Vps41","Vps45","Vps4a","Vps4b","Vps50","Vps51","Vps52","Vps53","Vps54","Vps54-ps1","Vps72","Vps8","Vps9d1","Vrk1","Vrk2","Vrk3","Vrtn","Vsig1","Vsig10","Vsig10l2","Vsig10l","Vsig2","Vsig4","Vsig8","Vsir","Vstm1","Vsnl1","Vstm2a","Vstm2b","Vstm2l","Vstm4","Vstm5","Vsx1","Vsx2","Vta1","Vtcn1","Vti1a","Vti1b","Vtn","Vwa1","Vwa2","Vwa3a","Vwa3b","Vwa5b1","Vwa5a","Vwa7","Vwa5b2","Vwc2","Vwa8","Vwc2l","Vwce","Vwde","Wac","Vwf","Wap","Wapl","Wars","Wars2","Was","Wasf1","Wasf2","Wasf3","Washc1","Washc2c","Washc3","Washc4","Washc5","Wbp1","Wasl","Wbp11","Wbp11l1","Wbp1l","Wbp2","Wbp2nl","Wbp4","Wdcp","Wdfy2","Wdfy1","Wdfy3","Wdfy4","Wdhd1","Wdpcp","Wdr1","Wdr11","Wdr12","Wdr13","Wdr17","Wdr18","Wdr19","Wdr20","Wdr24","Wdr25","Wdr26","Wdr27","Wdr3","Wdr33","Wdr31","Wdr34","Wdr35","Wdr36","Wdr37","Wdr38","Wdr4","Wdr41","Wdr43","Wdr44","Wdr45","Wdr45b","Wdr46","Wdr47","Wdr48","Wdr49","Wdr53","Wdr5","Wdr54","Wdr55","Wdr5b","Wdr59","Wdr6","Wdr60","Wdr61","Wdr62","Wdr63","Wdr64","Wdr65-ps1","Wdr66","Wdr7","Wdr70","Wdr72","Wdr73","Wdr74","Wdr75","Wdr76","Wdr78","Wdr81","Wdr77","Wdr82","Wdr83","Wdr83os","Wdr87","Wdr86","Wdr88","Wdr89","Wdr90","Wdr91","Wdr92","Wdr93","Wdr95","Wdr97","Wdr98","Wdsub1","Wdyhv1","Wdtc1","Wee1","Wee2","Wfdc10a","Wfdc11","Wfdc1","Wfdc13","Wfdc12","Wfdc15a","Wfdc15b","Wfdc16","Wfdc2","Wfdc18","Wfdc21","Wfdc3","Wfdc5","Wfdc6b","Wfdc6a","Wfdc9","Wfdc8","Wfikkn1","Wfikkn2","Wfs1","Whamm","Whrn","Wif1","Wipf1","Wipf2","Wipf3","Wipi1","Wipi2","Wisp1","Wisp2","Wisp3","Wiz","Wls","Wnk1","Wnk2","Wnk3","Wnk4","Wnt10b","Wnt10a","Wnt1","Wnt11","Wnt16","Wnt2b","Wnt2","Wnt3","Wnt3a","Wnt4","Wnt5a","Wnt5b","Wnt6","Wnt7a","Wnt7b","Wnt8b","Wnt8a","Wnt9a","Wnt9b","Wrap73","Wrap53","Wrb","Wrnip1","Wsb1","Wrn","Wsb2","Wscd2","Wscd1","Wt1","Wtip","Wtap","Wwc1","Wwc2","Wwc3","Wwox","Wwp1","Wwp2","Wwtr1","Xab2","Xaf1","Xcl1","Xbp1","Xcr1","Xirp1","Xiap","Xirp2","Xdh","Xkr4","Xk","Xkr5","Xkr7","Xkr8","Xkr9","Xkr6","Xkrx","Xlr3a","Xlr4a","Xpa","Xpnpep1","Xpc","Xpnpep2","Xpnpep3","Xpo4","Xpo1","Xpo5","Xpo6","Xpot","Xpo7","Xpr1","Xrcc2","Xrcc1","Xrcc3","Xrcc4","Xrcc5","Xrn1","Xrcc6","Xrn2","Xxylt1","Xrra1","Xylb","Xylt1","Xylt2","Yae1d1","Yaf2","Yars2","Yars","Yap1","Ybey","Ybx1-ps1","Ybx1-ps2","Ybx1-ps4","Ybx1-ps3","Ybx1","Ybx1-ps5","Ybx1-ps6","Ybx2","Ydjc","Ybx3","Yeats2","Yeats4","Yif1a","Yes1","Yif1b","Yipf1","Yipf2","Yipf4","Yipf3","Yipf5","Yipf6","Yipf7","Yjefn3","Ykt6","Ylpm1","Yme1l1","Yod1","Ypel1","Ypel3","Ypel2","Ypel4","Ypel5","Yrdc","Ythdc2","Ythdc1","Ythdf1","Ythdf2","Ythdf3","Ywhab","Ywhae","Ywhag","Ywhah","Ywhaq","Yy2","Yy1","Ywhaz","Zan","Zadh2","Zar1","Zap70","Zar1l","Zbed2","Zbbx","Zbed3","Zbed4","Zbed6","Zbed5","Zbp1","Zbtb1","Zbtb11","Zbtb10","Zbtb11os1","Zbtb12","Zbtb18","Zbtb17","Zbtb2","Zbtb16","Zbtb21","Zbtb20","Zbtb22","Zbtb24","Zbtb25","Zbtb26","Zbtb3","Zbtb32","Zbtb33","Zbtb34","Zbtb37","Zbtb38","Zbtb39","Zbtb4","Zbtb41","Zbtb40","Zbtb42","Zbtb43","Zbtb45","Zbtb44","Zbtb46","Zbtb47","Zbtb48","Zbtb49","Zbtb5","Zbtb6","Zbtb7b","Zbtb7a","Zbtb7c","Zbtb8a","Zbtb8b","Zbtb8os","Zbtb9","Zc2hc1a","Zc2hc1b","Zc2hc1c","Zc3h10","Zc3h11a","Zc3h12a","Zc3h12b","Zc3h12c","Zc3h12d","Zc3h13","Zc3h14","Zc3h18","Zc3h15","Zc3h3","Zc3h6","Zc3h4","Zc3h7a","Zc3h7b","Zc3h8","Zc3hav1l","Zc3hav1","Zc3hc1","Zc4h2","Zcchc10","Zcchc12","Zcchc11","Zcchc13","Zcchc14","Zcchc18","Zcchc17","Zcchc2","Zcchc24","Zcchc4","Zcchc3","Zcchc6","Zcchc8","Zcchc7","Zcchc9","Zcrb1","Zcwpw1","Zcwpw2","Zdbf2","Zdhhc11","Zdhhc1","Zdhhc12","Zdhhc13","Zdhhc14","Zdhhc15","Zdhhc16","Zdhhc17","Zdhhc18","Zdhhc19","Zdhhc2","Zdhhc21","Zdhhc20","Zdhhc22","Zdhhc23","Zdhhc24","Zdhhc25","Zdhhc3","Zdhhc4","Zdhhc5","Zdhhc6","Zdhhc7","Zdhhc9","Zdhhc8","Zeb1","Zeb2","Zeb2os","Zer1","Zfand1","Zfand2a","Zfand2b","Zfand3","Zfand5","Zfand6","Zfand4","Zfat","Zfc3h1","Zfhx2","Zfhx3","Zfhx4","Zfp1","Zfp105","Zfp108","Zfp106","Zfp11","Zfp110","Zfp113","Zfp111","Zfp112","Zfp12","Zfp13","Zfp133","Zfp131","Zfp136","Zfp141","Zfp14","Zfp143","Zfp142","Zfp146","Zfp148","Zfp157","Zfp161","Zfp169","Zfp17","Zfp174","Zfp18","Zfp180","Zfp182","Zfp184","Zfp185","Zfp189","Zfp2","Zfp202","Zfp207","Zfp212","Zfp213","Zfp217","Zfp219","Zfp24","Zfp236","Zfp248","Zfp251","Zfp26","Zfp263","Zfp260","Zfp266","Zfp27","Zfp267","Zfp275","Zfp277","Zfp276","Zfp28","Zfp28-ps1","Zfp280b","Zfp281","Zfp280d","Zfp280c","Zfp282","Zfp287","Zfp286a","Zfp292","Zfp296","Zfp3","Zfp30","Zfp300","Zfp316","Zfp318","Zfp317","Zfp319","Zfp322a","Zfp324","Zfp326","Zfp330","Zfp329","Zfp334","Zfp335","Zfp341","Zfp347","Zfp346","Zfp352","Zfp35","Zfp353","Zfp354b","Zfp354a","Zfp354c","Zfp358","Zfp362","Zfp36","Zfp366","Zfp365","Zfp367","Zfp36l3","Zfp36l2","Zfp36l1","Zfp383","Zfp37","Zfp382","Zfp384","Zfp385c","Zfp385a","Zfp385b","Zfp385d","Zfp386","Zfp39","Zfp394","Zfp397","Zfp398","Zfp395","Zfp40","Zfp407","Zfp41","Zfp410","Zfp414","Zfp42","Zfp420","Zfp418","Zfp422","Zfp423","Zfp428","Zfp426","Zfp42l","Zfp438","Zfp445","Zfp444","Zfp446","Zfp446-ps1","Zfp449","Zfp451","Zfp455","Zfp458","Zfp46","Zfp462","Zfp467","Zfp469","Zfp472","Zfp473","Zfp474","Zfp483","Zfp488","Zfp494","Zfp496","Zfp503","Zfp507","Zfp51","Zfp512b","Zfp512","Zfp511","Zfp513","Zfp518b","Zfp516","Zfp518a","Zfp52","Zfp524","Zfp523","Zfp521","Zfp526","Zfp53","Zfp532","Zfp536","Zfp54","Zfp541","Zfp558","Zfp551","Zfp560","Zfp563","Zfp569","Zfp566","Zfp57","Zfp574","Zfp575","Zfp579","Zfp580","Zfp59","Zfp583","Zfp593","Zfp592","Zfp598","Zfp597","Zfp600","Zfp605","Zfp606","Zfp608","Zfp609","Zfp61","Zfp612","Zfp617","Zfp618","Zfp623","Zfp62","Zfp622","Zfp628","Zfp629","Zfp637","Zfp638","Zfp639","Zfp646","Zfp64","Zfp641","Zfp647","Zfp648","Zfp644","Zfp652","Zfp653","Zfp654","Zfp664","Zfp663","Zfp655","Zfp668","Zfp667","Zfp672","Zfp683","Zfp68","Zfp688","Zfp687","Zfp69","Zfp691","Zfp689","Zfp697","Zfp692","Zfp704","Zfp703","Zfp7","Zfp706","Zfp707","Zfp707l1","Zfp709","Zfp709l1","Zfp719","Zfp711","Zfp710","Zfp717","Zfp74","Zfp748","Zfp758","Zfp768","Zfp764","Zfp764l1","Zfp746","Zfp763","Zfp770","Zfp773-ps1","Zfp771","Zfp772","Zfp78","Zfp775","Zfp777","Zfp780b","Zfp780b-ps1","Zfp786","Zfp788","Zfp787","Zfp791","Zfp800","Zfp804a","Zfp799","Zfp804b","Zfp821","Zfp819","Zfp82","Zfp827","Zfp830","Zfp839","Zfp831","Zfp853","Zfp865","Zfp862","Zfp846","Zfp84","Zfp866","Zfp867","Zfp868","Zfp87","Zfp869","Zfp874b","Zfp870","Zfp879","Zfp9","Zfp90","Zfp939","Zfp92","Zfp93","Zfp940-ps1","Zfp91","Zfp945","Zfp94","Zfp948-ps1","Zfp952","Zfp951","Zfp949","Zfp954","Zfp956","Zfp955a","Zfp961","Zfp958","Zfp964","Zfpl1","Zfpm2","Zfpm1","Zfr2","Zfr","Zfyve1","Zfx","Zfyve16","Zfyve19","Zfyve21","Zfyve26","Zfyve28","Zfyve27","Zg16","Zfyve9","Zglp1","Zg16b","Zgpat","Zgrf1","Zhx1","Zhx2","Zic1","Zhx3","Zic3","Zic5","Zic2","Zic4","Zik1","Zim1","Zkscan1","Zkscan2","Zkscan5","Zkscan4","Zkscan3","Zkscan7","Zmat1","Zkscan8","Zmat2","Zmat5","Zmat3","Zmat4","Zmiz1","Zmiz2","Zmpste24","Zmym1","Zmym2","Zmym3","Zmym5","Zmym4","Zmym6","Zmynd10","Znf146","Zmynd12","Zmynd15","Zmynd11","Zmynd19","Znf235","Znf354b","Znf408","Znf442","Znf454","Zmynd8","Znf48","Znf658","Znf474","Znf660","Znf7","Znf750","Znf740","Znf768","Znhit1","Znhit2","Znfx1","Znhit3","Znhit6","Znrd1-ps1","Znrd1as","Znrd1","Znrd1as1","Znrf2","Znrf3","Znrf1","Znrf4","Zp1","Zp2","Zp3","Zp3r","Zp4","Zpbp","Zpld1","Zpbp2","Zpr1","Zranb1","Zrsr1","Zscan10","Zrsr2","Zranb2","Zranb3","Zscan12","Zscan18","Zscan2","Zscan22","Zscan29","Zscan20","Zscan26","Zscan21","Zscan25","Zscan30","Zscan5b","Zscan4f","Zswim1","Zswim3","Zswim2","Zswim4","Zswim5","Zswim6","Zswim7","Zswim9","Zwilch","Zufsp","Zswim8","Zw10","Zxdb","Zwint","Zxdc","Zyg11a","Zyx","Zyg11b","Zzz3","Zzef1"]
\ No newline at end of file diff --git a/wqflask/wqflask/static/new/js_external/md5.min.js b/wqflask/wqflask/static/new/js_external/md5.min.js new file mode 100644 index 00000000..7d8a3f53 --- /dev/null +++ b/wqflask/wqflask/static/new/js_external/md5.min.js @@ -0,0 +1,2 @@ +!function(n){"use strict";function t(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function r(n,t){return n<<t|n>>>32-t}function e(n,e,o,u,c,f){return t(r(t(t(e,n),t(u,f)),c),o)}function o(n,t,r,o,u,c,f){return e(t&r|~t&o,n,t,u,c,f)}function u(n,t,r,o,u,c,f){return e(t&o|r&~o,n,t,u,c,f)}function c(n,t,r,o,u,c,f){return e(t^r^o,n,t,u,c,f)}function f(n,t,r,o,u,c,f){return e(r^(t|~o),n,t,u,c,f)}function i(n,r){n[r>>5]|=128<<r%32,n[14+(r+64>>>9<<4)]=r;var e,i,a,d,h,l=1732584193,g=-271733879,v=-1732584194,m=271733878;for(e=0;e<n.length;e+=16)i=l,a=g,d=v,h=m,g=f(g=f(g=f(g=f(g=c(g=c(g=c(g=c(g=u(g=u(g=u(g=u(g=o(g=o(g=o(g=o(g,v=o(v,m=o(m,l=o(l,g,v,m,n[e],7,-680876936),g,v,n[e+1],12,-389564586),l,g,n[e+2],17,606105819),m,l,n[e+3],22,-1044525330),v=o(v,m=o(m,l=o(l,g,v,m,n[e+4],7,-176418897),g,v,n[e+5],12,1200080426),l,g,n[e+6],17,-1473231341),m,l,n[e+7],22,-45705983),v=o(v,m=o(m,l=o(l,g,v,m,n[e+8],7,1770035416),g,v,n[e+9],12,-1958414417),l,g,n[e+10],17,-42063),m,l,n[e+11],22,-1990404162),v=o(v,m=o(m,l=o(l,g,v,m,n[e+12],7,1804603682),g,v,n[e+13],12,-40341101),l,g,n[e+14],17,-1502002290),m,l,n[e+15],22,1236535329),v=u(v,m=u(m,l=u(l,g,v,m,n[e+1],5,-165796510),g,v,n[e+6],9,-1069501632),l,g,n[e+11],14,643717713),m,l,n[e],20,-373897302),v=u(v,m=u(m,l=u(l,g,v,m,n[e+5],5,-701558691),g,v,n[e+10],9,38016083),l,g,n[e+15],14,-660478335),m,l,n[e+4],20,-405537848),v=u(v,m=u(m,l=u(l,g,v,m,n[e+9],5,568446438),g,v,n[e+14],9,-1019803690),l,g,n[e+3],14,-187363961),m,l,n[e+8],20,1163531501),v=u(v,m=u(m,l=u(l,g,v,m,n[e+13],5,-1444681467),g,v,n[e+2],9,-51403784),l,g,n[e+7],14,1735328473),m,l,n[e+12],20,-1926607734),v=c(v,m=c(m,l=c(l,g,v,m,n[e+5],4,-378558),g,v,n[e+8],11,-2022574463),l,g,n[e+11],16,1839030562),m,l,n[e+14],23,-35309556),v=c(v,m=c(m,l=c(l,g,v,m,n[e+1],4,-1530992060),g,v,n[e+4],11,1272893353),l,g,n[e+7],16,-155497632),m,l,n[e+10],23,-1094730640),v=c(v,m=c(m,l=c(l,g,v,m,n[e+13],4,681279174),g,v,n[e],11,-358537222),l,g,n[e+3],16,-722521979),m,l,n[e+6],23,76029189),v=c(v,m=c(m,l=c(l,g,v,m,n[e+9],4,-640364487),g,v,n[e+12],11,-421815835),l,g,n[e+15],16,530742520),m,l,n[e+2],23,-995338651),v=f(v,m=f(m,l=f(l,g,v,m,n[e],6,-198630844),g,v,n[e+7],10,1126891415),l,g,n[e+14],15,-1416354905),m,l,n[e+5],21,-57434055),v=f(v,m=f(m,l=f(l,g,v,m,n[e+12],6,1700485571),g,v,n[e+3],10,-1894986606),l,g,n[e+10],15,-1051523),m,l,n[e+1],21,-2054922799),v=f(v,m=f(m,l=f(l,g,v,m,n[e+8],6,1873313359),g,v,n[e+15],10,-30611744),l,g,n[e+6],15,-1560198380),m,l,n[e+13],21,1309151649),v=f(v,m=f(m,l=f(l,g,v,m,n[e+4],6,-145523070),g,v,n[e+11],10,-1120210379),l,g,n[e+2],15,718787259),m,l,n[e+9],21,-343485551),l=t(l,i),g=t(g,a),v=t(v,d),m=t(m,h);return[l,g,v,m]}function a(n){var t,r="",e=32*n.length;for(t=0;t<e;t+=8)r+=String.fromCharCode(n[t>>5]>>>t%32&255);return r}function d(n){var t,r=[];for(r[(n.length>>2)-1]=void 0,t=0;t<r.length;t+=1)r[t]=0;var e=8*n.length;for(t=0;t<e;t+=8)r[t>>5]|=(255&n.charCodeAt(t/8))<<t%32;return r}function h(n){return a(i(d(n),8*n.length))}function l(n,t){var r,e,o=d(n),u=[],c=[];for(u[15]=c[15]=void 0,o.length>16&&(o=i(o,8*n.length)),r=0;r<16;r+=1)u[r]=909522486^o[r],c[r]=1549556828^o[r];return e=i(u.concat(d(t)),512+8*t.length),a(i(c.concat(e),640))}function g(n){var t,r,e="";for(r=0;r<n.length;r+=1)t=n.charCodeAt(r),e+="0123456789abcdef".charAt(t>>>4&15)+"0123456789abcdef".charAt(15&t);return e}function v(n){return unescape(encodeURIComponent(n))}function m(n){return h(v(n))}function p(n){return g(m(n))}function s(n,t){return l(v(n),v(t))}function C(n,t){return g(s(n,t))}function A(n,t,r){return t?r?s(t,n):C(t,n):r?m(n):p(n)}"function"==typeof define&&define.amd?define(function(){return A}):"object"==typeof module&&module.exports?module.exports=A:n.md5=A}(this); +//# sourceMappingURL=md5.min.js.map
\ No newline at end of file diff --git a/wqflask/wqflask/static/new/js_external/typeahead.bundle.js b/wqflask/wqflask/static/new/js_external/typeahead.bundle.js new file mode 100644 index 00000000..bb0c8aed --- /dev/null +++ b/wqflask/wqflask/static/new/js_external/typeahead.bundle.js @@ -0,0 +1,2451 @@ +/*! + * typeahead.js 0.11.1 + * https://github.com/twitter/typeahead.js + * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT + */ + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define("bloodhound", [ "jquery" ], function(a0) { + return root["Bloodhound"] = factory(a0); + }); + } else if (typeof exports === "object") { + module.exports = factory(require("jquery")); + } else { + root["Bloodhound"] = factory(jQuery); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + noop: function() {} + }; + }(); + var VERSION = "0.11.1"; + var tokenizers = function() { + "use strict"; + return { + nonword: nonword, + whitespace: whitespace, + obj: { + nonword: getObjTokenizer(nonword), + whitespace: getObjTokenizer(whitespace) + } + }; + function whitespace(str) { + str = _.toStr(str); + return str ? str.split(/\s+/) : []; + } + function nonword(str) { + str = _.toStr(str); + return str ? str.split(/\W+/) : []; + } + function getObjTokenizer(tokenizer) { + return function setKey(keys) { + keys = _.isArray(keys) ? keys : [].slice.call(arguments, 0); + return function tokenize(o) { + var tokens = []; + _.each(keys, function(k) { + tokens = tokens.concat(tokenizer(_.toStr(o[k]))); + }); + return tokens; + }; + }; + } + }(); + var LruCache = function() { + "use strict"; + function LruCache(maxSize) { + this.maxSize = _.isNumber(maxSize) ? maxSize : 100; + this.reset(); + if (this.maxSize <= 0) { + this.set = this.get = $.noop; + } + } + _.mixin(LruCache.prototype, { + set: function set(key, val) { + var tailItem = this.list.tail, node; + if (this.size >= this.maxSize) { + this.list.remove(tailItem); + delete this.hash[tailItem.key]; + this.size--; + } + if (node = this.hash[key]) { + node.val = val; + this.list.moveToFront(node); + } else { + node = new Node(key, val); + this.list.add(node); + this.hash[key] = node; + this.size++; + } + }, + get: function get(key) { + var node = this.hash[key]; + if (node) { + this.list.moveToFront(node); + return node.val; + } + }, + reset: function reset() { + this.size = 0; + this.hash = {}; + this.list = new List(); + } + }); + function List() { + this.head = this.tail = null; + } + _.mixin(List.prototype, { + add: function add(node) { + if (this.head) { + node.next = this.head; + this.head.prev = node; + } + this.head = node; + this.tail = this.tail || node; + }, + remove: function remove(node) { + node.prev ? node.prev.next = node.next : this.head = node.next; + node.next ? node.next.prev = node.prev : this.tail = node.prev; + }, + moveToFront: function(node) { + this.remove(node); + this.add(node); + } + }); + function Node(key, val) { + this.key = key; + this.val = val; + this.prev = this.next = null; + } + return LruCache; + }(); + var PersistentStorage = function() { + "use strict"; + var LOCAL_STORAGE; + try { + LOCAL_STORAGE = window.localStorage; + LOCAL_STORAGE.setItem("~~~", "!"); + LOCAL_STORAGE.removeItem("~~~"); + } catch (err) { + LOCAL_STORAGE = null; + } + function PersistentStorage(namespace, override) { + this.prefix = [ "__", namespace, "__" ].join(""); + this.ttlKey = "__ttl__"; + this.keyMatcher = new RegExp("^" + _.escapeRegExChars(this.prefix)); + this.ls = override || LOCAL_STORAGE; + !this.ls && this._noop(); + } + _.mixin(PersistentStorage.prototype, { + _prefix: function(key) { + return this.prefix + key; + }, + _ttlKey: function(key) { + return this._prefix(key) + this.ttlKey; + }, + _noop: function() { + this.get = this.set = this.remove = this.clear = this.isExpired = _.noop; + }, + _safeSet: function(key, val) { + try { + this.ls.setItem(key, val); + } catch (err) { + if (err.name === "QuotaExceededError") { + this.clear(); + this._noop(); + } + } + }, + get: function(key) { + if (this.isExpired(key)) { + this.remove(key); + } + return decode(this.ls.getItem(this._prefix(key))); + }, + set: function(key, val, ttl) { + if (_.isNumber(ttl)) { + this._safeSet(this._ttlKey(key), encode(now() + ttl)); + } else { + this.ls.removeItem(this._ttlKey(key)); + } + return this._safeSet(this._prefix(key), encode(val)); + }, + remove: function(key) { + this.ls.removeItem(this._ttlKey(key)); + this.ls.removeItem(this._prefix(key)); + return this; + }, + clear: function() { + var i, keys = gatherMatchingKeys(this.keyMatcher); + for (i = keys.length; i--; ) { + this.remove(keys[i]); + } + return this; + }, + isExpired: function(key) { + var ttl = decode(this.ls.getItem(this._ttlKey(key))); + return _.isNumber(ttl) && now() > ttl ? true : false; + } + }); + return PersistentStorage; + function now() { + return new Date().getTime(); + } + function encode(val) { + return JSON.stringify(_.isUndefined(val) ? null : val); + } + function decode(val) { + return $.parseJSON(val); + } + function gatherMatchingKeys(keyMatcher) { + var i, key, keys = [], len = LOCAL_STORAGE.length; + for (i = 0; i < len; i++) { + if ((key = LOCAL_STORAGE.key(i)).match(keyMatcher)) { + keys.push(key.replace(keyMatcher, "")); + } + } + return keys; + } + }(); + var Transport = function() { + "use strict"; + var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6, sharedCache = new LruCache(10); + function Transport(o) { + o = o || {}; + this.cancelled = false; + this.lastReq = null; + this._send = o.transport; + this._get = o.limiter ? o.limiter(this._get) : this._get; + this._cache = o.cache === false ? new LruCache(0) : sharedCache; + } + Transport.setMaxPendingRequests = function setMaxPendingRequests(num) { + maxPendingRequests = num; + }; + Transport.resetCache = function resetCache() { + sharedCache.reset(); + }; + _.mixin(Transport.prototype, { + _fingerprint: function fingerprint(o) { + o = o || {}; + return o.url + o.type + $.param(o.data || {}); + }, + _get: function(o, cb) { + var that = this, fingerprint, jqXhr; + fingerprint = this._fingerprint(o); + if (this.cancelled || fingerprint !== this.lastReq) { + return; + } + if (jqXhr = pendingRequests[fingerprint]) { + jqXhr.done(done).fail(fail); + } else if (pendingRequestsCount < maxPendingRequests) { + pendingRequestsCount++; + pendingRequests[fingerprint] = this._send(o).done(done).fail(fail).always(always); + } else { + this.onDeckRequestArgs = [].slice.call(arguments, 0); + } + function done(resp) { + cb(null, resp); + that._cache.set(fingerprint, resp); + } + function fail() { + cb(true); + } + function always() { + pendingRequestsCount--; + delete pendingRequests[fingerprint]; + if (that.onDeckRequestArgs) { + that._get.apply(that, that.onDeckRequestArgs); + that.onDeckRequestArgs = null; + } + } + }, + get: function(o, cb) { + var resp, fingerprint; + cb = cb || $.noop; + o = _.isString(o) ? { + url: o + } : o || {}; + fingerprint = this._fingerprint(o); + this.cancelled = false; + this.lastReq = fingerprint; + if (resp = this._cache.get(fingerprint)) { + cb(null, resp); + } else { + this._get(o, cb); + } + }, + cancel: function() { + this.cancelled = true; + } + }); + return Transport; + }(); + var SearchIndex = window.SearchIndex = function() { + "use strict"; + var CHILDREN = "c", IDS = "i"; + function SearchIndex(o) { + o = o || {}; + if (!o.datumTokenizer || !o.queryTokenizer) { + $.error("datumTokenizer and queryTokenizer are both required"); + } + this.identify = o.identify || _.stringify; + this.datumTokenizer = o.datumTokenizer; + this.queryTokenizer = o.queryTokenizer; + this.reset(); + } + _.mixin(SearchIndex.prototype, { + bootstrap: function bootstrap(o) { + this.datums = o.datums; + this.trie = o.trie; + }, + add: function(data) { + var that = this; + data = _.isArray(data) ? data : [ data ]; + _.each(data, function(datum) { + var id, tokens; + that.datums[id = that.identify(datum)] = datum; + tokens = normalizeTokens(that.datumTokenizer(datum)); + _.each(tokens, function(token) { + var node, chars, ch; + node = that.trie; + chars = token.split(""); + while (ch = chars.shift()) { + node = node[CHILDREN][ch] || (node[CHILDREN][ch] = newNode()); + node[IDS].push(id); + } + }); + }); + }, + get: function get(ids) { + var that = this; + return _.map(ids, function(id) { + return that.datums[id]; + }); + }, + search: function search(query) { + var that = this, tokens, matches; + tokens = normalizeTokens(this.queryTokenizer(query)); + _.each(tokens, function(token) { + var node, chars, ch, ids; + if (matches && matches.length === 0) { + return false; + } + node = that.trie; + chars = token.split(""); + while (node && (ch = chars.shift())) { + node = node[CHILDREN][ch]; + } + if (node && chars.length === 0) { + ids = node[IDS].slice(0); + matches = matches ? getIntersection(matches, ids) : ids; + } else { + matches = []; + return false; + } + }); + return matches ? _.map(unique(matches), function(id) { + return that.datums[id]; + }) : []; + }, + all: function all() { + var values = []; + for (var key in this.datums) { + values.push(this.datums[key]); + } + return values; + }, + reset: function reset() { + this.datums = {}; + this.trie = newNode(); + }, + serialize: function serialize() { + return { + datums: this.datums, + trie: this.trie + }; + } + }); + return SearchIndex; + function normalizeTokens(tokens) { + tokens = _.filter(tokens, function(token) { + return !!token; + }); + tokens = _.map(tokens, function(token) { + return token.toLowerCase(); + }); + return tokens; + } + function newNode() { + var node = {}; + node[IDS] = []; + node[CHILDREN] = {}; + return node; + } + function unique(array) { + var seen = {}, uniques = []; + for (var i = 0, len = array.length; i < len; i++) { + if (!seen[array[i]]) { + seen[array[i]] = true; + uniques.push(array[i]); + } + } + return uniques; + } + function getIntersection(arrayA, arrayB) { + var ai = 0, bi = 0, intersection = []; + arrayA = arrayA.sort(); + arrayB = arrayB.sort(); + var lenArrayA = arrayA.length, lenArrayB = arrayB.length; + while (ai < lenArrayA && bi < lenArrayB) { + if (arrayA[ai] < arrayB[bi]) { + ai++; + } else if (arrayA[ai] > arrayB[bi]) { + bi++; + } else { + intersection.push(arrayA[ai]); + ai++; + bi++; + } + } + return intersection; + } + }(); + var Prefetch = function() { + "use strict"; + var keys; + keys = { + data: "data", + protocol: "protocol", + thumbprint: "thumbprint" + }; + function Prefetch(o) { + this.url = o.url; + this.ttl = o.ttl; + this.cache = o.cache; + this.prepare = o.prepare; + this.transform = o.transform; + this.transport = o.transport; + this.thumbprint = o.thumbprint; + this.storage = new PersistentStorage(o.cacheKey); + } + _.mixin(Prefetch.prototype, { + _settings: function settings() { + return { + url: this.url, + type: "GET", + dataType: "json" + }; + }, + store: function store(data) { + if (!this.cache) { + return; + } + this.storage.set(keys.data, data, this.ttl); + this.storage.set(keys.protocol, location.protocol, this.ttl); + this.storage.set(keys.thumbprint, this.thumbprint, this.ttl); + }, + fromCache: function fromCache() { + var stored = {}, isExpired; + if (!this.cache) { + return null; + } + stored.data = this.storage.get(keys.data); + stored.protocol = this.storage.get(keys.protocol); + stored.thumbprint = this.storage.get(keys.thumbprint); + isExpired = stored.thumbprint !== this.thumbprint || stored.protocol !== location.protocol; + return stored.data && !isExpired ? stored.data : null; + }, + fromNetwork: function(cb) { + var that = this, settings; + if (!cb) { + return; + } + settings = this.prepare(this._settings()); + this.transport(settings).fail(onError).done(onResponse); + function onError() { + cb(true); + } + function onResponse(resp) { + cb(null, that.transform(resp)); + } + }, + clear: function clear() { + this.storage.clear(); + return this; + } + }); + return Prefetch; + }(); + var Remote = function() { + "use strict"; + function Remote(o) { + this.url = o.url; + this.prepare = o.prepare; + this.transform = o.transform; + this.transport = new Transport({ + cache: o.cache, + limiter: o.limiter, + transport: o.transport + }); + } + _.mixin(Remote.prototype, { + _settings: function settings() { + return { + url: this.url, + type: "GET", + dataType: "json" + }; + }, + get: function get(query, cb) { + var that = this, settings; + if (!cb) { + return; + } + query = query || ""; + settings = this.prepare(query, this._settings()); + return this.transport.get(settings, onResponse); + function onResponse(err, resp) { + err ? cb([]) : cb(that.transform(resp)); + } + }, + cancelLastRequest: function cancelLastRequest() { + this.transport.cancel(); + } + }); + return Remote; + }(); + var oParser = function() { + "use strict"; + return function parse(o) { + var defaults, sorter; + defaults = { + initialize: true, + identify: _.stringify, + datumTokenizer: null, + queryTokenizer: null, + sufficient: 5, + sorter: null, + local: [], + prefetch: null, + remote: null + }; + o = _.mixin(defaults, o || {}); + !o.datumTokenizer && $.error("datumTokenizer is required"); + !o.queryTokenizer && $.error("queryTokenizer is required"); + sorter = o.sorter; + o.sorter = sorter ? function(x) { + return x.sort(sorter); + } : _.identity; + o.local = _.isFunction(o.local) ? o.local() : o.local; + o.prefetch = parsePrefetch(o.prefetch); + o.remote = parseRemote(o.remote); + return o; + }; + function parsePrefetch(o) { + var defaults; + if (!o) { + return null; + } + defaults = { + url: null, + ttl: 24 * 60 * 60 * 1e3, + cache: true, + cacheKey: null, + thumbprint: "", + prepare: _.identity, + transform: _.identity, + transport: null + }; + o = _.isString(o) ? { + url: o + } : o; + o = _.mixin(defaults, o); + !o.url && $.error("prefetch requires url to be set"); + o.transform = o.filter || o.transform; + o.cacheKey = o.cacheKey || o.url; + o.thumbprint = VERSION + o.thumbprint; + o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax; + return o; + } + function parseRemote(o) { + var defaults; + if (!o) { + return; + } + defaults = { + url: null, + cache: true, + prepare: null, + replace: null, + wildcard: null, + limiter: null, + rateLimitBy: "debounce", + rateLimitWait: 300, + transform: _.identity, + transport: null + }; + o = _.isString(o) ? { + url: o + } : o; + o = _.mixin(defaults, o); + !o.url && $.error("remote requires url to be set"); + o.transform = o.filter || o.transform; + o.prepare = toRemotePrepare(o); + o.limiter = toLimiter(o); + o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax; + delete o.replace; + delete o.wildcard; + delete o.rateLimitBy; + delete o.rateLimitWait; + return o; + } + function toRemotePrepare(o) { + var prepare, replace, wildcard; + prepare = o.prepare; + replace = o.replace; + wildcard = o.wildcard; + if (prepare) { + return prepare; + } + if (replace) { + prepare = prepareByReplace; + } else if (o.wildcard) { + prepare = prepareByWildcard; + } else { + prepare = idenityPrepare; + } + return prepare; + function prepareByReplace(query, settings) { + settings.url = replace(settings.url, query); + return settings; + } + function prepareByWildcard(query, settings) { + settings.url = settings.url.replace(wildcard, encodeURIComponent(query)); + return settings; + } + function idenityPrepare(query, settings) { + return settings; + } + } + function toLimiter(o) { + var limiter, method, wait; + limiter = o.limiter; + method = o.rateLimitBy; + wait = o.rateLimitWait; + if (!limiter) { + limiter = /^throttle$/i.test(method) ? throttle(wait) : debounce(wait); + } + return limiter; + function debounce(wait) { + return function debounce(fn) { + return _.debounce(fn, wait); + }; + } + function throttle(wait) { + return function throttle(fn) { + return _.throttle(fn, wait); + }; + } + } + function callbackToDeferred(fn) { + return function wrapper(o) { + var deferred = $.Deferred(); + fn(o, onSuccess, onError); + return deferred; + function onSuccess(resp) { + _.defer(function() { + deferred.resolve(resp); + }); + } + function onError(err) { + _.defer(function() { + deferred.reject(err); + }); + } + }; + } + }(); + var Bloodhound = function() { + "use strict"; + var old; + old = window && window.Bloodhound; + function Bloodhound(o) { + o = oParser(o); + this.sorter = o.sorter; + this.identify = o.identify; + this.sufficient = o.sufficient; + this.local = o.local; + this.remote = o.remote ? new Remote(o.remote) : null; + this.prefetch = o.prefetch ? new Prefetch(o.prefetch) : null; + this.index = new SearchIndex({ + identify: this.identify, + datumTokenizer: o.datumTokenizer, + queryTokenizer: o.queryTokenizer + }); + o.initialize !== false && this.initialize(); + } + Bloodhound.noConflict = function noConflict() { + window && (window.Bloodhound = old); + return Bloodhound; + }; + Bloodhound.tokenizers = tokenizers; + _.mixin(Bloodhound.prototype, { + __ttAdapter: function ttAdapter() { + var that = this; + return this.remote ? withAsync : withoutAsync; + function withAsync(query, sync, async) { + return that.search(query, sync, async); + } + function withoutAsync(query, sync) { + return that.search(query, sync); + } + }, + _loadPrefetch: function loadPrefetch() { + var that = this, deferred, serialized; + deferred = $.Deferred(); + if (!this.prefetch) { + deferred.resolve(); + } else if (serialized = this.prefetch.fromCache()) { + this.index.bootstrap(serialized); + deferred.resolve(); + } else { + this.prefetch.fromNetwork(done); + } + return deferred.promise(); + function done(err, data) { + if (err) { + return deferred.reject(); + } + that.add(data); + that.prefetch.store(that.index.serialize()); + deferred.resolve(); + } + }, + _initialize: function initialize() { + var that = this, deferred; + this.clear(); + (this.initPromise = this._loadPrefetch()).done(addLocalToIndex); + return this.initPromise; + function addLocalToIndex() { + that.add(that.local); + } + }, + initialize: function initialize(force) { + return !this.initPromise || force ? this._initialize() : this.initPromise; + }, + add: function add(data) { + this.index.add(data); + return this; + }, + get: function get(ids) { + ids = _.isArray(ids) ? ids : [].slice.call(arguments); + return this.index.get(ids); + }, + search: function search(query, sync, async) { + var that = this, local; + local = this.sorter(this.index.search(query)); + sync(this.remote ? local.slice() : local); + if (this.remote && local.length < this.sufficient) { + this.remote.get(query, processRemote); + } else if (this.remote) { + this.remote.cancelLastRequest(); + } + return this; + function processRemote(remote) { + var nonDuplicates = []; + _.each(remote, function(r) { + !_.some(local, function(l) { + return that.identify(r) === that.identify(l); + }) && nonDuplicates.push(r); + }); + async && async(nonDuplicates); + } + }, + all: function all() { + return this.index.all(); + }, + clear: function clear() { + this.index.reset(); + return this; + }, + clearPrefetchCache: function clearPrefetchCache() { + this.prefetch && this.prefetch.clear(); + return this; + }, + clearRemoteCache: function clearRemoteCache() { + Transport.resetCache(); + return this; + }, + ttAdapter: function ttAdapter() { + return this.__ttAdapter(); + } + }); + return Bloodhound; + }(); + return Bloodhound; +}); + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define("typeahead.js", [ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof exports === "object") { + module.exports = factory(require("jquery")); + } else { + factory(jQuery); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '<span class="' + c.wrapper + '"></span>', + menu: '<div class="' + c.menu + '"></div>' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e; + $e = $.Event(namespace + type); + (args = args || []).unshift($e); + this.$el.trigger.apply(this.$el, args); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function getRegex(patterns, caseSensitive, wordsOnly) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + escapedPatterns.push(_.escapeRegExChars(patterns[i])); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("<div>"); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('<pre aria-hidden="true"></pre>').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = o.name || nameGenerator(); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", this.name, suggestions, false); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", this.name, suggestions, true); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + rendered += suggestions.length; + that._append(query, suggestions.slice(0, that.limit - rendered)); + that.async && that.trigger("asyncReceived", query); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("<div>"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion || suggestionTemplate + }; + function suggestionTemplate(context) { + return $("<div>").text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("<div>").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, isDatasetEmpty); + function isDatasetEmpty(dataset) { + return dataset.isEmpty(); + } + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("<div>"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("<div>"); + $menu = this.menu.$node || $("<div>"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, dataset, suggestions, async) { + this._updateHint(); + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, payload, cancelMove; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + payload = data ? data.obj : null; + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", payload)) { + this.menu.setCursor($candidate); + if (data) { + this.input.setInputValue(data.val); + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", payload); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(newVal); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop("readonly", true).removeAttr("id name placeholder required").attr({ + autocomplete: "off", + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + autocomplete: "off", + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +});
\ No newline at end of file diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html index 3df4c81a..3d03f3b9 100644 --- a/wqflask/wqflask/templates/base.html +++ b/wqflask/wqflask/templates/base.html @@ -22,17 +22,22 @@ <body style="width: 100% !important;"> <!-- Navbar ================================================== --> - <div class="navbar navbar-inverse navbar-static-top pull-left" role="navigation" style="width: 100%;"> - + <div class="navbar navbar-inverse navbar-static-top pull-left" role="navigation" style="width: 100%; white-space: nowrap;"> + <!--<div class="navbar navbar-default" style="width: 100%; white-space: nowrap;">--> <div class="container-fluid" style="width: 100%;"> <!-- Brand and toggle get grouped for better mobile display --> + <!--- <div class="navbar-header"> - <a class="navbar-brand" href="/">GeneNetwork</a> + <a class="navbar-brand" href="/">GeneNetwork</a> </div> + --> <!-- Collect the nav links, forms, and other content for toggling --> <div> <ul class="nav navbar-nav"> + <li class="" style="margin-right: 20px;"> + <a href="/" style="font-weight: bold;">GeneNetwork</a> + </li> <li class=""> <a href="/intro">Intro</a> </li> @@ -52,22 +57,17 @@ </a> </li> <li class=""> - <a href="/help">Help</a> + <a href="/snp_browser">SNP Browser</a> </li> <li class=""> - <a href="/news">News</a> - </li> - <li class=""> - <a href="/references">References</a> - </li> - <li class=""> - <a href="/policies">Policies</a> - </li> - <li class=""> - <a href="/links">Links</a> - </li> - <li class=""> - <a href="/environments">Environments</a> + <a href="/help" class="dropdow-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Help <span class="caret"></a> + <ul class="dropdown-menu"> + <li><a href="/news">News</a></li> + <li><a href="/references">References</a></li> + <li><a href="/policies">Policies</a></li> + <li><a href="/links">Links</a></li> + <li><a href="/environments">Environments</a></li> + </ul> </li> <li class=""> {% if g.user_session.logged_in %} diff --git a/wqflask/wqflask/templates/bnw_page.html b/wqflask/wqflask/templates/bnw_page.html new file mode 100644 index 00000000..e506d8a8 --- /dev/null +++ b/wqflask/wqflask/templates/bnw_page.html @@ -0,0 +1,7 @@ +<title>Opening BNW</title> +<form method="post" action="http://bnw.genenetwork.org/BNW/sourcecodes/bn_genenet.php" name="bnwform" id="bnwform"> + <input type="hidden" name="My_Genenet" value="{{ form_value }}"> +</form> +<script type="text/javascript"> + document.bnwform.submit(); +</script>
\ No newline at end of file diff --git a/wqflask/wqflask/templates/collections/add.html b/wqflask/wqflask/templates/collections/add.html index 889687ea..37cabdbd 100644 --- a/wqflask/wqflask/templates/collections/add.html +++ b/wqflask/wqflask/templates/collections/add.html @@ -6,7 +6,11 @@ </div> <div class="modal-body" style="margin-left: 20px;"> <form action="/collections/new" data-validate="parsley" id="add_form"> + {% if traits is defined %} <input type="hidden" name="traits" value="{{ traits }}" /> + {% else %} + <input type="hidden" name="hash" value="{{ hash }}" /> + {% endif %} <fieldset> <legend>1. Create a new collection</legend> <div style="margin-left: 20px;"> diff --git a/wqflask/wqflask/templates/collections/list.html b/wqflask/wqflask/templates/collections/list.html index 64d5a676..5372fa46 100644 --- a/wqflask/wqflask/templates/collections/list.html +++ b/wqflask/wqflask/templates/collections/list.html @@ -4,19 +4,21 @@ <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" /> <link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.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/show_trait.css" /> {% endblock %} {% block content %} <!-- Start of body --> - {% if g.user_session.logged_in %} - {{ header("Your Collections", - 'You have {}.'.format(numify(collections|count, "collection", "collections"))) }} - {% else %} - {{ header("Your Collections", - 'You have {}.'.format(numify(collections|count, "collection", "collections"))) }} - {% endif %} + <div class="container"> + {% if g.user_session.logged_in %} + <h1>Collections owned by {{ g.user_session.user_name }}</h1> + {% else %} + <h1>Your Collections</h1> + {% endif %} + <h2>You have {{ '{}'.format(numify(collections|count, "collection", "collections")) }}.</h1> + <hr style="height: 1px; background-color: #A9A9A9;"> - <div class="container"> + <!-- <div class="page-header"> {% if g.user_session.logged_in %} <h1>Collections owned by {{ g.user_session.user_name }}</h1> @@ -24,6 +26,7 @@ <h1>Your Collections</h1> {% endif %} </div> + --> <div> <form id="collections_form" action="/delete" method="post"> <input type="hidden" name="uc_id" id="uc_id" value="" /> @@ -35,7 +38,7 @@ </div> <br> <div id="collections_list" style="width:50%;"> - <table class="display dataTable nowrap" id='trait_table'> + <table class="table-hover table-striped cell-border" id='trait_table'> <thead> <tr> <th></th> @@ -51,9 +54,9 @@ {% for uc in collections %} <tr class="collection_line"> {% if g.user_session.logged_in %} - <td style="padding-left: 8px; padding-right: 0px; padding-top: 4px; align: center;"><INPUT TYPE="checkbox" NAME="collection" class="checkbox trait_checkbox" VALUE="{{ uc.id }}"></td> + <td align="center" style="padding: 0px;"><INPUT TYPE="checkbox" NAME="collection" class="checkbox trait_checkbox" VALUE="{{ uc.id }}"></td> {% else %} - <td style="padding-left: 8px; padding-right: 0px; padding-top: 4px; align: center;"><INPUT TYPE="checkbox" NAME="collection" class="checkbox trait_checkbox" VALUE="{{ uc.name }}"></td> + <td align="center" style="padding: 0px;"><INPUT TYPE="checkbox" NAME="collection" class="checkbox trait_checkbox" VALUE="{{ uc.name }}"></td> {% endif %} <td align="right">{{ loop.index }} {% if g.user_session.logged_in %} diff --git a/wqflask/wqflask/templates/collections/view.html b/wqflask/wqflask/templates/collections/view.html index 864299a2..75b65b5a 100644 --- a/wqflask/wqflask/templates/collections/view.html +++ b/wqflask/wqflask/templates/collections/view.html @@ -3,21 +3,21 @@ {% 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.dataTables.css"> + <link rel="stylesheet" type="text/css" href="/static/new/css/show_trait.css" /> {% endblock %} {% block content %} <!-- Start of body --> <div class="container"> - {% if uc %} - <h2>{{ uc.name }}</h2> - <h3>{{ 'This collection has {}.'.format(numify(trait_obs|count, "record", "records")) }}</h3> - {% else %} - <h2> {{ collection_name }}</h2> - <h3>{{ 'This collection has {}.'.format(numify(trait_obs|count, "record", "records")) }}</h3> - {% endif %} - </div> + {% if uc %} + <h1>{{ uc.name }}</h1> + {% else %} + <h1>{{ collection_name }}</h1> + {% endif %} + <h2>This collection has {{ '{}'.format(numify(trait_obs|count, "record", "records")) }}</h2> + + <hr style="height: 1px; background-color: #A9A9A9;"> - <div class="container"> <div> <form id="collection_form" action="/delete" method="post"> {% if uc %} @@ -58,6 +58,17 @@ Comparison Bar Chart </button> + <button id="send_to_webgestalt" class="btn btn-primary submit_special" data-url="/webgestalt_page" title="WebGestalt" > + WebGestalt + </button> + + <button id="send_to_geneweaver" class="btn btn-primary submit_special" data-url="/geneweaver_page" title="GeneWeaver" > + GeneWeaver + </button> + + <button id="send_to_bnw" class="btn btn-primary submit_special" data-url="/bnw_page" title="Bayesian Network" > + BNW + </button> <button id="delete" class="btn btn-danger submit_special" style="margin-left: 15px;" data-url="/collections/delete" title="Delete this collection" > Delete Collection @@ -82,7 +93,7 @@ </form> <br /> <div> - <table class="display dataTable nowrap" id='trait_table' style="float: left;"> + <table class="table-hover table-striped cell-border" id='trait_table' style="float: left;"> <thead> <tr> <th></th> @@ -92,21 +103,21 @@ <th data-export="Description">Description</th> <th data-export="Location">Location</th> <th data-export="Mean">Mean</th> - <th data-export="Max LRS">Max LRS <a href="http://genenetwork.org//glossary.html#L" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> + <th data-export="Max LRS">Max LRS <a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup>?</sup></a></th> <th data-export="Max LRS Location">Max LRS Location</th> - <th data-export="Additive Effect">Additive Effect <a href="http://genenetwork.org//glossary.html#A" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> + <th data-export="Add. Eff.">Additive Effect <a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup>?</sup></a></th> </tr> </thead> <tbody> {% for this_trait in trait_obs %} <TR id="trait:{{ this_trait.name }}:{{ this_trait.dataset.name }}"> - <TD> + <TD align="center" style="padding: 0px;"> <INPUT TYPE="checkbox" NAME="searchResult" class="checkbox trait_checkbox" VALUE="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) }}"> </TD> <TD data-export="{{ loop.index }}" align="right">{{ loop.index }}</TD> - <TD data-export="{{ this_trait.dataset.name }}">{{ this_trait.dataset.name }}</TD> + <TD title="{{ this_trait.dataset.fullname }}" data-export="{{ this_trait.dataset.fullname }}">{{ this_trait.dataset.fullname }}</TD> <TD data-export="{{ this_trait.name }}"> <a href="{{ url_for('show_trait_page', trait_id = this_trait.name, @@ -137,6 +148,7 @@ {% endblock %} {% block js %} + <script type="text/javascript" src="/static/new/js_external/md5.min.js"></script> <script type="text/javascript" src="/static/new/javascript/search_results.js"></script> <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.min.js"></script> <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.min.js"></script> @@ -159,23 +171,26 @@ console.time("Creating table"); $('#trait_table').dataTable( { "createdRow": function ( row, data, index ) { - $('td', row).eq(0).attr('style', 'padding-left: 8px; padding-right: 0px; padding-top: 4px; align: center;'); + if ($('td', row).eq(2).text().length > 40) { + $('td', row).eq(2).text($('td', row).eq(2).text().substring(0, 40)); + $('td', row).eq(2).text($('td', row).eq(2).text() + '...') + } if ($('td', row).eq(4).text().length > 50) { $('td', row).eq(4).text($('td', row).eq(4).text().substring(0, 50)); $('td', row).eq(4).text($('td', row).eq(4).text() + '...') } }, "columns": [ - { "type": "natural", "width": "2%" }, - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "12%" }, - { "type": "natural", "width": "12%" }, + { "type": "natural", "width": 10 }, + { "type": "natural", "width": 50 }, + { "type": "natural" }, + { "type": "natural", "width": 120 }, { "type": "natural" }, - { "type": "natural", "width": "12%" }, - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "12%" }, - { "type": "natural", "width": "8%" } + { "type": "natural", "width": 130 }, + { "type": "natural", "width": 35 }, + { "type": "natural", "width": 35 }, + { "type": "natural", "width": 130 }, + { "type": "natural" } ], "columnDefs": [ { "targets": 0, @@ -194,8 +209,6 @@ "autoWidth": false, "bDeferRender": true, "bSortClasses": false, - "scrollY": "600px", - "scrollCollapse": true, "paging": false, "orderClasses": true } ); @@ -210,55 +223,6 @@ url = $(this).data("url") return submit_special(url) }); - - $("#corr_matrix").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - url = $(this).data("url") - return submit_special(url) - }); - $("#network_graph").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - url = $(this).data("url") - return submit_special(url) - }); - $("#wgcna_setup").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - url = $(this).data("url") - return submit_special(url) - }); - $("#ctl_setup").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - url = $(this).data("url") - return submit_special(url) - }); - $("#heatmap").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - url = $(this).data("url") - return submit_special(url) - }); - $("#comp_bar_chart").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - url = $(this).data("url") - return submit_special(url) - }); }); </script> diff --git a/wqflask/wqflask/templates/corr_scatterplot.html b/wqflask/wqflask/templates/corr_scatterplot.html index e520b4b9..e3d90e30 100644 --- a/wqflask/wqflask/templates/corr_scatterplot.html +++ b/wqflask/wqflask/templates/corr_scatterplot.html @@ -131,8 +131,8 @@ <br> <div id="scatterplot2"></div> <br> - <div class="row" style="width: 70%;"> - <div class="col-xs-3"> + <div class="row" style="width: 70%; overflow: hidden;"> + <div style="float: left;"> <table class="table table-hover table-striped table-bordered" style="width: 80%; margin-left: 60px; text-align: right;"> <thead> <tr><th style="text-align: right;">Statistic</th><th style="text-align: right;">Value</th></tr> @@ -168,7 +168,7 @@ </tbody> </table> </div> - <div class="col-xs-9"> + <div style="padding-left: 40px; overflow: hidden;"> {% if trait_1.dataset.type == "ProbeSet" %} <div> X axis: @@ -227,7 +227,7 @@ <div id="srscatterplot2"></div> <br> <div class="row" style="width: 70%;"> - <div class="col-xs-3"> + <div style="float: left;"> <table class="table table-hover table-striped table-bordered" style="width: 80%; margin-left: 60px; text-align: right;"> <thead> <tr><th style="text-align: right;">Statistic</th><th style="text-align: right;">Value</th></tr> @@ -256,7 +256,7 @@ </tbody> </table> </div> - <div class="col-xs-9"> + <div style="padding-left: 40px; overflow: hidden;"> {% if trait_1.dataset.type == "ProbeSet" %} <div> X axis: diff --git a/wqflask/wqflask/templates/correlation_page.html b/wqflask/wqflask/templates/correlation_page.html index 2d4ed2a4..76aa8d2d 100644 --- a/wqflask/wqflask/templates/correlation_page.html +++ b/wqflask/wqflask/templates/correlation_page.html @@ -4,12 +4,12 @@ <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" /> {% endblock %} {% block content %} - - {{ header("Correlation", 'Trait: {} Dataset: {}'.format(this_trait.name, dataset.name)) }} - <div class="container"> <div class="page-header"> <h1>Correlation Table</h1> + <h2>Trait: {{ this_trait.name }} + + <hr style="height: 1px; background-color: #A9A9A9;"> </div> <p>Values of record {{ this_trait.name }} in the <a href="http://genenetwork.org/webqtl/main.py?FormID=sharinginfo&GN_AccessionId={{ dataset.group.accession_id }}">{{ dataset.fullname }}</a> @@ -20,31 +20,57 @@ </p> <div> - <form id="correlation_form" action="/corr_matrix" method="post"> - {% if uc %} - <input type="hidden" name="uc_id" id="uc_id" value="{{ uc.id }}" /> - {% endif %} - <input type="hidden" name="trait_list" id="trait_list" value= "" > + <form id="correlation_form" target="_blank" action="/corr_matrix" method="post"> + <input type="hidden" name="trait_list" id="trait_list" value= " + {% for this_trait in trait_list %} + {{ this_trait.name }}:{{ this_trait.dataset }}, + {% endfor %}" > + <button id="corr_matrix" class="btn btn-primary submit_special" data-url="/corr_matrix" title="Correlation Matrix" > Correlation Matrix </button> + <button id="network_graph" class="btn btn-primary submit_special" data-url="/network_graph" title="Network Graph" > Network Graph </button> + <button id="wgcna_setup" class="btn btn-primary submit_special" data-url="/wgcna_setup" title="WGCNA Analysis" > WGCNA Analysis </button> + <button id="ctl_setup" class="btn btn-primary submit_special" data-url="/ctl_setup" title="CTL Analysis" > CTL Analysis </button> + <button id="heatmap" class="btn btn-primary submit_special" data-url="/heatmap" title="Heatmap" > Heatmap </button> + + <button id="comp_bar_chart" class="btn btn-primary submit_special" data-url="/comparison_bar_chart" title="Comparison Bar Chart" > + Comparison Bar Chart + </button> + + <button id="send_to_webgestalt" class="btn btn-primary submit_special" data-url="/webgestalt_page" title="WebGestalt" > + WebGestalt + </button> + + <button id="send_to_geneweaver" class="btn btn-primary submit_special" data-url="/geneweaver_page" title="GeneWeaver" > + GeneWeaver + </button> + + <button id="send_to_bnw" class="btn btn-primary submit_special" data-url="/bnw_page" title="Bayesian Network" > + BNW + </button> + + <button id="delete" class="btn btn-danger submit_special" style="margin-left: 15px;" data-url="/collections/delete" title="Delete this collection" > + Delete Collection + </button> + </form> </div> <div> @@ -465,49 +491,6 @@ url = $(this).data("url") return submit_special(url) }); - - $("#corr_matrix").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - console.log($("#trait_list").val(traits)) - url = $(this).data("url") - //return submit_special(url) - }); - $("#network_graph").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - url = $(this).data("url") - return submit_special(url) - }); - $("#wgcna_setup").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - url = $(this).data("url") - return submit_special(url) - }); - $("#ctl_setup").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - url = $(this).data("url") - return submit_special(url) - }); - $("#heatmap").on("click", function() { - traits = $("#trait_table input:checked").map(function() { - return $(this).val(); - }).get(); - $("#trait_list").val(traits) - url = $(this).data("url") - return submit_special(url) - }); - }); </script> {% endblock %} diff --git a/wqflask/wqflask/templates/geneweaver_page.html b/wqflask/wqflask/templates/geneweaver_page.html new file mode 100644 index 00000000..91fca85b --- /dev/null +++ b/wqflask/wqflask/templates/geneweaver_page.html @@ -0,0 +1,35 @@ +{% extends "base.html" %} +{% block title %}{% if wrong_input == "True" %}WebGestalt Error{% else %}Opening WebGestalt{% endif %}{% endblock %} +{% block content %} + {% if wrong_input == "True" %} + {{ header("Error") }} + + <div class="container"> + {% if chip_name == "mixed" %} + <h3>Sorry, the analysis was interrupted because your selections from GeneNetwork apparently include data from more than one array platform (i.e., Affymetrix U74A and M430 2.0). Most WebGestalt analyses assume that you are using a single array type and compute statistical values on the basis of that particular array. Please reselect traits from a signle platform and submit again.</h3> + {% elif chip_name == "not_microarray" %} + <h3>You need to select at least one microarray trait to submit.</hr> + {% elif '_NA' in chip_name %} + <h3>Sorry, the analysis was interrupted because your selections from GeneNetwork apparently include data from platform {{ chip_name }} which is unknown by GeneWeaver. Please reselect traits and submit again.</h3> + {% else %} + <h3>Sorry, an error occurred while submitting your traits to GeneWeaver.</h3> + {% endif %} + </div> + {% else %} + <div class="container"> + <h3>Opening GeneWeaver...</h3> + </div> + <form method="post" action="http://ontologicaldiscovery.org/index.php?action=manage&cmd=importGeneSet" name="formODE"> + {% for key in hidden_vars %} + <input type="hidden" name="{{ key }}" value="{{ hidden_vars[key] }}"> + {% endfor %} + </form> + {% endif %} +{% endblock %} +{% block js %} +{% if wrong_input == "False" %} +<script type="text/javascript"> + setTimeout('document.formODE.submit()', 1000); +</script> +{% endif %} +{% endblock %}
\ No newline at end of file diff --git a/wqflask/wqflask/templates/gsearch_gene.html b/wqflask/wqflask/templates/gsearch_gene.html index 0612bfcc..ebebd044 100644 --- a/wqflask/wqflask/templates/gsearch_gene.html +++ b/wqflask/wqflask/templates/gsearch_gene.html @@ -2,11 +2,12 @@ {% block title %}Search Results{% endblock %} {% 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/css/show_trait.css" /> {% endblock %} {% block content %} <!-- Start of body --> - <div class="container"> + <div class="container" style="width: 2000px;"> <p>You searched for {{ terms }}.</p> <p>To study a record, click on its Record ID below.<br />Check records below and click Add button to add to selection.</p> @@ -28,60 +29,10 @@ </form> <br /> <div style="width: 100%;"> - <table width="100%" id="trait_table" class="display dataTable nowrap" style="float: left;"> - <thead> - <tr> - <th></th> - <th data-export="Index">Index</th> - <th data-export="Record">Record ID</th> - <th data-export="Species">Species</th> - <th data-export="Group">Group</th> - <th data-export="Tissue">Tissue</th> - <th data-export="Dataset">Dataset</th> - <th data-export="Symbol">Symbol</th> - <th data-export="Description">Description</th> - <th data-export="Location">Location</th> - <th data-export="Mean">Mean</th> - <th data-export="Max LRS">Max LRS <a href="http://genenetwork.org//glossary.html#LRS" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - <th data-export="Additive Effect">Additive Effect <a href="http://genenetwork.org//glossary.html#A" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - </tr> - </thead> + <table id="trait_table" class="table-hover table-striped cell-border" style="float: left;"> <tbody> - {% for this_trait in trait_list %} - <tr id="trait:{{ this_trait.name }}:{{ this_trait.dataset }}"> - <td align="center" style="padding-right: 0px; padding-left: 5px;"><input type="checkbox" name="searchResult" class="checkbox trait_checkbox" value="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset)) }}"></td> - <td align="right" data-export="{{ loop.index }}">{{ loop.index }}</td> - <td data-export="{{ this_trait.name }}"><a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset)}}">{{ this_trait.name }}</a></td> - <td data-export="{{ this_trait.species }}">{{ this_trait.species }}</td> - <td data-export="{{ this_trait.group }}">{{ this_trait.group }}</td> - <td data-export="{{ this_trait.tissue }}">{{ this_trait.tissue }}</td> - <td data-export="{{ this_trait.dataset }}">{{ this_trait.dataset }}</td> - <td data-export="{{ this_trait.symbol }}">{{ this_trait.symbol }}</td> - <td data-export="{{ this_trait.description }}">{{ this_trait.description }}</td> - <td data-export="{{ this_trait.location_repr }}" align="right">{{ this_trait.location_repr }}</td> - <td data-export="{{ '%0.3f' % this_trait.mean|float }}" align="right">{{ '%0.3f' % this_trait.mean|float }}</td> - <td data-export="{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}" align="right">{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}</td> - <td data-export="{% if this_trait.additive != "" %}{{ '%0.3f' % this_trait.additive|float }}{% else %}N/A{% endif %}" align="right">{% if this_trait.additive != "" %}{{ '%0.3f' % this_trait.additive|float }}{% else %}N/A{% endif %}</td> - </tr> - {% endfor %} + <td colspan="100%" align="center"><br><b><font size="15">Loading...</font></b><br></td> </tbody> - <tfoot> - <tr> - <th></th> - <th>Index</th> - <th>Record ID</th> - <th>Species</th> - <th>Group</th> - <th>Tissue</th> - <th>Dataset</th> - <th>Symbol</th> - <th>Description</th> - <th>Location</th> - <th>Mean</th> - <th data-export="Max LRS">Max LRS <a href="http://genenetwork.org//glossary.html#LRS" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - <th data-export="Additive Effect">Additive Effect <a href="http://genenetwork.org//glossary.html#A" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - </tr> - </tfoot> </table> </div> </div> @@ -92,14 +43,17 @@ {% endblock %} {% block js %} - <script language="javascript" type="text/javascript" src="/static/new/javascript/search_results.js"></script> - + <script language="javascript" type="text/javascript" src="/static/new/js_external/md5.min.js"></script> <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script> <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.min.js"></script> <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.naturalSort.js"></script> <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colReorder.js"></script> <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colResize.js"></script> - + + <script type='text/javascript'> + var the_rows = {{ trait_list|safe }}; + </script> + <script type="text/javascript" charset="utf-8"> $.fn.dataTable.ext.order['dom-checkbox'] = function ( settings, col ) { @@ -108,6 +62,13 @@ } ); }; + $.fn.dataTable.ext.order['dom-inner-text'] = function ( settings, col ) + { + return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { + return $(td).text(); + } ); + } + $(document).ready( function () { $('#trait_table tr').click(function(event) { @@ -118,52 +79,151 @@ console.time("Creating table"); $('#trait_table').DataTable( { - "createdRow": function ( row, data, index ) { + 'createdRow': function ( row, data, index ) { + $('td', row).eq(0).attr("style", "text-align: center; padding: 4px 10px 2px 10px;"); + $('td', row).eq(1).attr("align", "right"); + $('td', row).eq(4).attr('title', $('td', row).eq(4).text()); + if ($('td', row).eq(4).text().length > 20) { + $('td', row).eq(4).text($('td', row).eq(4).text().substring(0, 20)); + $('td', row).eq(4).text($('td', row).eq(4).text() + '...') + } + $('td', row).eq(5).attr('title', $('td', row).eq(5).text()); + if ($('td', row).eq(5).text().length > 20) { + $('td', row).eq(5).text($('td', row).eq(5).text().substring(0, 20)); + $('td', row).eq(5).text($('td', row).eq(5).text() + '...') + } + $('td', row).eq(6).attr('title', $('td', row).eq(6).text()); + if ($('td', row).eq(6).text().length > 35) { + $('td', row).eq(6).text($('td', row).eq(6).text().substring(0, 35)); + $('td', row).eq(6).text($('td', row).eq(6).text() + '...') + } $('td', row).eq(8).attr('title', $('td', row).eq(8).text()); - if ($('td', row).eq(8).text().length > 50) { - $('td', row).eq(8).text($('td', row).eq(8).text().substring(0, 50)); + if ($('td', row).eq(8).text().length > 45) { + $('td', row).eq(8).text($('td', row).eq(8).text().substring(0, 45)); $('td', row).eq(8).text($('td', row).eq(8).text() + '...') } + $('td', row).slice(10,14).attr("align", "right"); }, - "paging": false, - "columns": [ - { "orderDataType": "dom-checkbox" }, - { "type": "natural", "width": "3%" }, - { "type": "natural", "width": "6%" }, - { "type": "natural", "width": "8%" }, - { "type": "natural" }, - { "type": "natural" }, - { "type": "natural" }, - { "type": "natural" }, - { "type": "natural" }, - { "type": "natural", "width": "7%" }, - { "type": "natural", "width": "4%" }, - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "5%" } - ], - "columnDefs": [ + 'data': the_rows, + 'columns': [ + { + 'data': null, + 'orderDataType': "dom-checkbox", + 'render': function(data, type, row, meta) { + return '<input type="checkbox" name="searchResult" class="trait_checkbox checkbox" value="' + data.hmac + '">' + } + }, { - "targets": 0, - "orderable": false, - "orderDataType": "dom-checkbox" + 'title': "Index", + 'type': "natural", + 'data': "index" + }, + { + 'title': "Record", + 'type': "natural", + 'data': null, + 'orderDataType': "dom-inner-text", + 'render': function(data, type, row, meta) { + return '<a href="/show_trait?trait_id=' + data.name + '&dataset=' + data.dataset + '">' + data.name + '</a>' + } + }, + { + 'title': "Species", + 'type': "natural", + 'data': "species" + }, + { + 'title': "Group", + 'type': "natural", + 'data': "group" + }, + { + 'title': "Tissue", + 'type': "natural", + 'data': "tissue" + }, + { + 'title': "Dataset", + 'type': "natural", + 'data': "dataset_fullname" + }, + { + 'title': "Symbol", + 'type': "natural", + 'data': "symbol" + }, + { + 'title': "Description", + 'type': "natural", + 'data': "description" + }, + { + 'title': "Location", + 'type': "natural", + 'data': "location_repr" + }, + { + 'title': "Mean", + 'type': "natural", + 'data': "mean", + 'orderSequence': [ "desc", "asc"] + }, + { + 'title': "Max LRS<a href=\"http://genenetwork.org//glossary.html#LRS\" target=\"_blank\" style=\"color: white;\"><sup>?</sup></a>", + 'type': "natural", + 'data': "LRS_score_repr", + 'orderSequence': [ "desc", "asc"] + }, + { + 'title': "Max LRS Location", + 'type': "natural", + 'data': "max_lrs_text" + }, + { + 'title': "Additive Effect<a href=\"http://genenetwork.org//glossary.html#A\" target=\"_blank\" style=\"color: white;\"><sup>?</sup></a>", + 'type': "natural", + 'data': "additive", + 'orderSequence': [ "desc", "asc"] } ], - "order": [[1, "asc" ]], - "sDom": "tir", - "autoWidth": false, - "deferRender": true, - "bSortClasses": false, - "scrollY": "600px", - "scrollCollapse": true, - "scroller": true, - "scrollX": true, - "paging": false, - "orderClasses": true + 'order': [[1, "asc" ]], + 'sDom': "tir", + 'autoWidth': true, + 'deferRender': true, + 'paging': false, + 'orderClasses': true, + 'processing': true, + 'language': { + 'loadingRecords': ' ', + 'processing': 'Loading...' + } } ); + $('#trait_table').append( + '<tfoot>' + + '<tr>' + + '<th></th>' + + '<th>Index</th>' + + '<th>Record ID</th>' + + '<th>Species</th> ' + + '<th>Group</th>' + + '<th>Tissue</th>' + + '<th>Dataset</th>' + + '<th>Symbol</th>' + + '<th>Description</th>' + + '<th>Location</th>' + + '<th>Mean</th>' + + '<th>Max LRS <a href="http://genenetwork.org//glossary.html#LRS" target="_blank" style="color: white;"><sup>?</sup></a></th>' + + '<th>Max LRS Location</th>' + + '<th>Additive Effect <a href="http://genenetwork.org//glossary.html#A" target="_blank" style="color: white;"><sup>?</sup></a></th>' + + '</tr>' + + '</tfoot>' + ); + console.timeEnd("Creating table"); }); </script> + <script language="javascript" type="text/javascript" src="/static/new/javascript/search_results.js"></script> {% endblock %} diff --git a/wqflask/wqflask/templates/gsearch_pheno.html b/wqflask/wqflask/templates/gsearch_pheno.html index c2cbdadd..96a5d71a 100644 --- a/wqflask/wqflask/templates/gsearch_pheno.html +++ b/wqflask/wqflask/templates/gsearch_pheno.html @@ -2,6 +2,7 @@ {% block title %}Search Results{% endblock %} {% 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/css/show_trait.css" /> {% endblock %} {% block content %} <!-- Start of body --> @@ -28,51 +29,10 @@ </form> <br /> <div> - <table id="trait_table" class="display dataTable nowrap" style="float: left;"> - <thead> - <tr> - <th></th> - <th data-export="Index">Index</th> - <th data-export="Species">Species</th> - <th data-export="Group">Group</th> - <th data-export="Record">Record</th> - <th data-export="Description">Description</th> - <th data-export="Authors">Authors</th> - <th data-export="Year">Year</th> - <th data-export="Max LRS">Max LRS <a href="http://genenetwork.org//glossary.html#LRS" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - <th data-export="Additive Effect">Additive Effect <a href="http://genenetwork.org//glossary.html#A" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - </tr> - </thead> + <table id="trait_table" width="100%" class="table-hover table-striped cell-border" style="float: left;"> <tbody> - {% for this_trait in trait_list %} - <tr id="trait:{{ this_trait.name }}:{{ this_trait.dataset }}"> - <td align="center" style="padding-right: 0px; padding-left: 5px;"><input type="checkbox" name="searchResult" class="checkbox trait_checkbox" value="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset)) }}"></td> - <td align="right" data-export="{{ loop.index }}">{{ loop.index }}</td> - <td data-export="{{ this_trait.species }}">{{ this_trait.species }}</td> - <td data-export="{{ this_trait.group }}">{{ this_trait.group }}</td> - <td data-export="{{ this_trait.name }}"><a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset)}}">{{ this_trait.name }}</a></td> - <td data-export="{{ this_trait.description }}">{{ this_trait.description }}</td> - <td data-export="{{ this_trait.authors }}">{{ this_trait.authors }}</td> - <td data-export="{{ this_trait.pubmed_text }}" data-order="{{ this_trait.pubmed_text }}"><a href="{{ this_trait.pubmed_link }}">{{ this_trait.pubmed_text }}</a></td> - <td data-export="{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}" align="right">{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}</td> - <td data-export="{% if this_trait.additive != "" %}{{ this_trait.additive }}{% else %}N/A{% endif %}" align="right">{% if this_trait.additive != "" %}{{ this_trait.additive }}{% else %}N/A{% endif %}</td> - </tr> - {% endfor %} + <td colspan="100%" align="center"><br><b><font size="15">Loading...</font></b><br></td> </tbody> - <tfoot> - <tr> - <th></th> - <th>Index</th> - <th>Species</th> - <th>Group</th> - <th>Record</th> - <th>Description</th> - <th>Authors</th> - <th>Year</th> - <th data-export="Max LRS">Max LRS <a href="http://genenetwork.org//glossary.html#LRS" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - <th data-export="Additive Effect">Additive Effect <a href="http://genenetwork.org//glossary.html#A" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - </tr> - </tfoot> </table> </div> </div> @@ -83,14 +43,17 @@ {% endblock %} {% block js %} - <script language="javascript" type="text/javascript" src="/static/new/javascript/search_results.js"></script> - + <script language="javascript" type="text/javascript" src="/static/new/js_external/md5.min.js"></script> <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script> <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.min.js"></script> <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.naturalSort.js"></script> <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colReorder.js"></script> <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colResize.js"></script> - + + <script type='text/javascript'> + var the_rows = {{ trait_list|safe }}; + </script> + <script type="text/javascript" charset="utf-8"> $.fn.dataTable.ext.order['dom-checkbox'] = function ( settings, col ) { @@ -99,8 +62,15 @@ } ); }; + $.fn.dataTable.ext.order['dom-inner-text'] = function ( settings, col ) + { + return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { + return $(td).text(); + } ); + } + $(document).ready( function () { - + $('#trait_table tr').click(function(event) { if (event.target.type !== 'checkbox') { $(':checkbox', this).trigger('click'); @@ -109,52 +79,141 @@ console.time("Creating table"); $('#trait_table').DataTable( { + 'drawCallback': function( settings ) { + $('#trait_table tr').click(function(event) { + if (event.target.type !== 'checkbox') { + $(':checkbox', this).trigger('click'); + } + }); + $('.trait_checkbox:checkbox').on("change", change_buttons); + }, "createdRow": function ( row, data, index ) { + $('td', row).eq(0).attr("style", "text-align: center; padding: 4px 10px 2px 10px;"); + $('td', row).eq(1).attr("align", "right"); $('td', row).eq(5).attr('title', $('td', row).eq(5).text()); - if ($('td', row).eq(5).text().length > 50) { - $('td', row).eq(5).text($('td', row).eq(5).text().substring(0, 50)); + if ($('td', row).eq(5).text().length > 150) { + $('td', row).eq(5).text($('td', row).eq(5).text().substring(0, 150)); $('td', row).eq(5).text($('td', row).eq(5).text() + '...') } $('td', row).eq(6).attr('title', $('td', row).eq(6).text()); - if ($('td', row).eq(6).text().length > 50) { - $('td', row).eq(6).text($('td', row).eq(6).text().substring(0, 50)); + if ($('td', row).eq(6).text().length > 150) { + $('td', row).eq(6).text($('td', row).eq(6).text().substring(0, 150)); $('td', row).eq(6).text($('td', row).eq(6).text() + '...') } + $('td', row).slice(8,11).attr("align", "right"); }, - "paging": false, - "columns": [ - { "orderDataType": "dom-checkbox" }, - { "type": "natural" }, - { "type": "natural" }, - { "type": "natural" }, - { "type": "natural" }, - { "type": "natural", "width": "30%"}, - { "type": "natural", "width": "25%"}, - { "type": "natural" }, - { "type": "natural", "width": "8%"}, - { "type": "natural" } - ], - "columnDefs": [ + 'data': the_rows, + 'columns': [ + { + 'data': null, + 'orderDataType': "dom-checkbox", + 'render': function(data, type, row, meta) { + return '<input type="checkbox" name="searchResult" class="trait_checkbox checkbox" value="' + data.hmac + '">' + } + }, + { + 'title': "Index", + 'type': "natural", + 'data': "index" + }, { - "targets": 0, - "orderable": false, - "orderDataType": "dom-checkbox" + 'title': "Species", + 'type': "natural", + 'data': "species" + }, + { + 'title': "Group", + 'type': "natural", + 'width': "10%", + 'data': "group" + }, + { + 'title': "Record", + 'type': "natural", + 'data': null, + 'render': function(data, type, row, meta) { + return '<a href="/show_trait?trait_id=' + data.name + '&dataset=' + data.dataset + '">' + data.name + '</a>' + } + }, + { + 'title': "Description", + 'type': "natural", + 'width': "25%", + 'data': "description" + }, + { + 'title': "Authors", + 'type': "natural", + 'width': "25%", + 'data': "authors" + }, + { + 'title': "Year", + 'type': "natural", + 'data': null, + 'orderDataType': "dom-inner-text", + 'render': function(data, type, row, meta) { + if (data.pubmed_id != "N/A"){ + return '<a href="' + data.pubmed_link + '">' + data.pubmed_text + '</a>' + } else { + return data.pubmed_text + } + }, + 'orderSequence': [ "desc", "asc"] + }, + { + 'title': "Max LRS<a href=\"http://genenetwork.org//glossary.html#LRS\" target=\"_blank\" style=\"color: white;\"><sup>?</sup></a>", + 'type': "natural", + 'data': "LRS_score_repr", + 'orderSequence': [ "desc", "asc"] + }, + { + 'title': "Max LRS Location", + 'type': "natural", + 'width': "10%", + 'data': "max_lrs_text" + }, + { + 'title': "Additive Effect<a href=\"http://genenetwork.org//glossary.html#A\" target=\"_blank\" style=\"color: white;\"><sup>?</sup></a>", + 'type': "natural", + 'data': "additive", + 'orderSequence': [ "desc", "asc"] } ], - "order": [[1, "asc" ]], - "sDom": "tir", - "autoWidth": false, - "deferRender": true, - "bSortClasses": false, - "scrollY": "600px", - "scrollCollapse": true, - "scroller": true, - "scrollX": true, - "paging": false, - "orderClasses": true + 'order': [[1, "asc" ]], + 'sDom': "tir", + 'autoWidth': false, + 'deferRender': true, + 'paging': false, + 'orderClasses': true, + 'processing': true, + 'language': { + 'loadingRecords': ' ', + 'processing': 'Loading...' + } } ); + + $('#trait_table').append( + '<tfoot>' + + '<tr>' + + '<th></th>' + + '<th>Index</th>' + + '<th>Species</th> ' + + '<th>Group</th>' + + '<th>Record</th>' + + '<th>Description</th>' + + '<th>Authors</th>' + + '<th>Year</th>' + + '<th>Max LRS</th>' + + '<th>Max LRS Location</th>' + + '<th>Additive Effect</th>' + + '</tr>' + + '</tfoot>' + ); + console.timeEnd("Creating table"); }); </script> + <script language="javascript" type="text/javascript" src="/static/new/javascript/search_results.js"></script> {% endblock %} diff --git a/wqflask/wqflask/templates/loading.html b/wqflask/wqflask/templates/loading.html index 43488c75..99fa4a89 100644 --- a/wqflask/wqflask/templates/loading.html +++ b/wqflask/wqflask/templates/loading.html @@ -1,6 +1,6 @@ <title>Loading Mapping Results</title> <link REL="stylesheet" TYPE="text/css" href="/static/packages/bootstrap/css/bootstrap.css" /> -<form method="post" action="/marker_regression" name="loading_form" id="loading_form" class="form-horizontal"> +<form method="post" action="/run_mapping" name="loading_form" id="loading_form" class="form-horizontal"> {% for key, value in start_vars.iteritems() %} <input type="hidden" name="{{ key }}" value="{{ value }}"> {% endfor %} diff --git a/wqflask/wqflask/templates/marker_regression_gn1.html b/wqflask/wqflask/templates/mapping_results.html index fd083983..72d9d0dd 100644 --- a/wqflask/wqflask/templates/marker_regression_gn1.html +++ b/wqflask/wqflask/templates/mapping_results.html @@ -10,7 +10,7 @@ {% from "base_macro.html" import header %} {% block content %} <div class="container"> - <form method="post" target="_blank" action="/marker_regression" name="marker_regression" id="marker_regression_form"> + <form method="post" target="_blank" action="/run_mapping" name="marker_regression" id="marker_regression_form"> <input type="hidden" name="temp_uuid" value="{{ temp_uuid }}"> <input type="hidden" name="trait_id" value="{{ this_trait.name }}"> <input type="hidden" name="dataset" value="{{ dataset.name }}"> @@ -181,7 +181,7 @@ </form> {% if selectedChr == -1 %} - <div class="container" style="padding-left: 30px; width:{% if 'additive' in trimmed_markers[0] %}45%{% else %}35%{% endif %};"> + <div class="container" style="padding-left: 30px;"> <h2>Mapping Statistics</h2> <br /> <button class="btn btn-default" id="select_all"><span class="glyphicon glyphicon-ok"></span> Select All</button> @@ -190,8 +190,8 @@ <button class="btn btn-default" id="add" disabled><span class="glyphicon glyphicon-plus-sign"></span> Add</button> <br /> <br /> - <div id="table_container" style="border-style: solid; border-width: 1px; border-color: black;"> - <table id="trait_table" class="table table-hover table-striped nowrap"> + <div id="table_container" style="width:{% if 'additive' in trimmed_markers[0] %}480{% else %}450{% endif %}px;"> + <table id="trait_table" class="table-hover table-striped cell-border dataTable no-footer"> <thead> <tr> <th></th> @@ -215,7 +215,7 @@ <tbody> {% for marker in trimmed_markers %} <tr> - <td align="center" style="padding-right: 0px;"> + <td align="center" style="padding: 1px 0px 1px 0px;"> <input type="checkbox" name="selectCheck" class="checkbox trait_checkbox" value="{{ data_hmac('{}:{}Geno'.format(marker.name, dataset.group.name)) }}"> @@ -257,7 +257,7 @@ <div style="width: 100%;"> <h2>Interval Analyst</h2> <div id="table_container"> - <table id="interval_analyst" class="table table-hover table-striped nowrap"> + <table id="interval_analyst" class="table-hover table-striped cell-border dataTable" style="float: left; width:100%;"> <thead> <tr> {% for header in gene_table_header %} @@ -269,7 +269,11 @@ {% for row in gene_table_body %} <tr> {% for n in range(row|length) %} + {% if n == 0 %} + <td align="center" style="padding: 1px 0px 1px 0px;">{{ row[n]|safe }}</td> + {% else %} <td>{{ row[n]|safe }}</td> + {% endif %} {% endfor %} </tr> {% endfor %} @@ -314,37 +318,16 @@ $(document).ready( function () { console.time("Creating table"); $('#trait_table').DataTable( { - {% if mapping_method != "reaper" %} - "columns": [ - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "8%" }, - { "type": "natural", "width": "20%" }, - { "type": "natural", "width": "8%" }, - { "type": "natural", "width": "8%" }, - { "type": "natural", "width": "15%" } - ], - {% elif dataset.group.genetic_type == "riset" %} - "columns": [ - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "8%" }, - { "type": "natural", "width": "20%" }, - { "type": "natural", "width": "8%" }, - { "type": "natural", "width": "8%" }, - { "type": "natural", "width": "15%" }, - { "type": "natural", "width": "8%" } - ], - {% else %} "columns": [ { "type": "natural", "width": "5%" }, { "type": "natural", "width": "8%" }, - { "type": "natural", "width": "20%" }, + { "type": "natural", "width": "25%" }, + { "type": "natural" }, { "type": "natural", "width": "8%" }, - { "type": "natural", "width": "8%" }, - { "type": "natural", "width": "15%" }, - { "type": "natural", "width": "8%" }, - { "type": "natural", "width": "8%" } + { "type": "natural" }{% if 'additive' in marker %}, + { "type": "natural" }{% endif %}{% if 'dominance' in marker and dataset.group.genetic_type != "riset" %}, + { "type": "natural" }{% endif %} ], - {% endif %} "columnDefs": [ { "targets": 0, "orderable": false @@ -355,13 +338,24 @@ "autoWidth": false, "deferRender": true, "bSortClasses": false, - "scrollY": "600px", "scrollCollapse": false, - "scroller": true, "paging": false } ); $('#interval_analyst').dataTable( { + "columns": [ + { "bSortable": false}, + { "type": "natural" }, + { "type": "natural" }, + { "type": "natural" }, + { "type": "natural" }, + { "type": "natural" }, + { "type": "natural" }, + { "type": "natural" }, + { "type": "natural" }, + { "type": "natural" }, + { "type": "natural" } + ], "columnDefs": [ { "targets": 0, "sortable": false @@ -372,7 +366,6 @@ "autoWidth": false, "deferRender": true, "bSortClasses": false, - "scrollY": "600px", "scrollCollapse": false, "paging": false } ); diff --git a/wqflask/wqflask/templates/network_graph.html b/wqflask/wqflask/templates/network_graph.html index ad5dee9d..57bd5492 100644 --- a/wqflask/wqflask/templates/network_graph.html +++ b/wqflask/wqflask/templates/network_graph.html @@ -47,19 +47,16 @@ </tr> <tr> <td colspan="1"> - <font size="2"><b>0 - - +/- 1</b></font><br> - <input type="range" id="slide" min="0" max="1" value="0" step="0.001" list="corr_range"> - </td> - </tr> - <tr> - <td> - Layouts + <font size="2"><b>-1 + 0 + 1</b></font><br> + <input type="range" id="neg_slide" min="-1" max="0" value="0" step="0.001" list="corr_range" style="display: inline; width: 45%"> + <input type="range" id="pos_slide" min="0" max="1" value="0" step="0.001" list="corr_range" style="display: inline; width: 45%"> </td> </tr> <tr> <td> + Layouts: <select name="layout_select"> <option value="circle">Circle</option> <option value="concentric">Concentric</option> @@ -70,6 +67,39 @@ </select> </td> </tr> + <tr> + <td> + Node Font Size: + <select name="font_size"> + <option value="6">6</option> + <option value="7">7</option> + <option value="8">8</option> + <option value="9">9</option> + <option value="10" selected>10</option> + <option value="11">11</option> + <option value="12">12</option> + <option value="13">13</option> + <option value="14">14</option> + <option value="15">15</option> + <option value="16">16</option> + <option value="17">17</option> + <option value="18">18</option> + </select> + </td> + <td> + </tr> + <tr> + <td> + Edge Width: + <select name="edge_width"> + <option value="1" selected>1x</option> + <option value="2">2x</option> + <option value="3">3x</option> + <option value="4">4x</option> + </select> + </td> + <td> + </tr> </tbody> </table> <h3 style="margin-bottom: 5px;"> Download</h3> diff --git a/wqflask/wqflask/templates/search_result_page.html b/wqflask/wqflask/templates/search_result_page.html index 9ad8a53e..36a25665 100644 --- a/wqflask/wqflask/templates/search_result_page.html +++ b/wqflask/wqflask/templates/search_result_page.html @@ -4,15 +4,14 @@ <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/scroller.dataTables.min.css"> <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.dataTables.css"> + <link rel="stylesheet" type="text/css" href="/static/new/css/show_trait.css" /> {% endblock %} {% block content %} <!-- Start of body --> - {{ header("Search Results", - 'GeneNetwork found {}.'.format(numify(results|count, "record", "records"))) }} - <div style="padding-left: 10px;"> <input type="hidden" name="uc_id" id="uc_id" value="{{ uc_id }}"> + <div style="padding-top: 10px; padding-bottom: 10px; font-size: 16px;"> <!-- Need to customize text more for other types of searches --> <p>We searched <a href="http://genenetwork.org/webqtl/main.py?FormID=sharinginfo&GN_AccessionId={{dataset.id}}">{{ dataset.fullname }}</a> to find all records @@ -38,20 +37,75 @@ {% elif word.key|lower == "position" %} with <u>target genes</u> on chromosome <strong>{% if word.search_term[0].split('chr')|length > 1 %}{{ word.search_term[0].split('chr')[1] }}{% elif word.search_term[0].split('CHR')|length > 1 %}{{ word.search_term[0].split('CHR')[1] }}{% else %}{{ word.search_term[0] }}{% endif %}</strong> between <strong>{{ word.search_term[1] }}</strong> and <strong>{{ word.search_term[2] }}</strong> Mb{% if loop.last %}.{% else %} and {% endif %} {% else %} - that match the <u>TERM</u> <b>{{ word.search_term[0] }}</b>{% if loop.last %}.{% else %} and {% endif %} + that match the <u>TERM</u> <b>{{ word.search_term[0] }}</b>{% if loop.last %},{% else %} and {% endif %} {% endif %} {% endfor %} + and found {{ results|count }} records. </p> <p>To study a record click on its ID below, and to view the whole description {% if dataset.type == "Publish" %}or list of authors {% endif %} hover over the table cell. Check records below and click Add button to add to selection.</p> + <hr style="height: 1px; background-color: #A9A9A9;"> + + </div> + + <div> + <form id="trait_submission_form" target="_blank" action="/corr_matrix" method="post"> + <input type="hidden" name="trait_list" id="trait_list" value= " + {% for this_trait in trait_list %} + {{ this_trait.name }}:{{ this_trait.dataset }}, + {% endfor %}" > + + + <button id="corr_matrix" class="btn btn-primary submit_special" data-url="/corr_matrix" title="Correlation Matrix" > + Correlation Matrix + </button> + + + <button id="network_graph" class="btn btn-primary submit_special" data-url="/network_graph" title="Network Graph" > + Network Graph + </button> + + + <button id="wgcna_setup" class="btn btn-primary submit_special" data-url="/wgcna_setup" title="WGCNA Analysis" > + WGCNA Analysis + </button> + + + <button id="ctl_setup" class="btn btn-primary submit_special" data-url="/ctl_setup" title="CTL Analysis" > + CTL Analysis + </button> + + + <button id="heatmap" class="btn btn-primary submit_special" data-url="/heatmap" title="Heatmap" > + Heatmap + </button> + + <button id="comp_bar_chart" class="btn btn-primary submit_special" data-url="/comparison_bar_chart" title="Comparison Bar Chart" > + Comparison Bar Chart + </button> + + <button id="send_to_webgestalt" class="btn btn-primary submit_special" data-url="/webgestalt_page" title="WebGestalt" > + WebGestalt + </button> + + <button id="send_to_geneweaver" class="btn btn-primary submit_special" data-url="/geneweaver_page" title="GeneWeaver" > + GeneWeaver + </button> + + <button id="send_to_bnw" class="btn btn-primary submit_special" data-url="/bnw_page" title="Bayesian Network" > + BNW + </button> + + </form> + </div> + <div> <br /> <button class="btn btn-default" id="select_all"><span class="glyphicon glyphicon-ok"></span> Select All</button> <button class="btn btn-default" id="deselect_all"><span class="glyphicon glyphicon-remove"></span> Deselect All</button> <button class="btn btn-default" id="invert"><span class="glyphicon glyphicon-resize-vertical"></span> Invert</button> <button class="btn btn-default" id="add" disabled><span class="glyphicon glyphicon-plus-sign"></span> Add</button> - <button id="redraw" class="btn btn-default">Reset Columns</button> <input type="text" id="searchbox" class="form-control" style="width: 200px; display: inline;" placeholder="Search This Table For ..."> <input type="text" id="select_top" class="form-control" style="width: 200px; display: inline;" placeholder="Select Top ..."> <br /> @@ -62,53 +116,12 @@ <button class="btn btn-default" id="export_traits">Download CSV</button> </form> <br /> -<!-- - Removing this until more options are added and work correctly - {% if dataset.type == 'ProbeSet' %} - <button class="btn btn-default" id="open_options">Open Extra Options</button> - <br /> - <br /> - <div id="extra_options" style="display:none;"> - Min LRS <input type="text" id="min" class="form-control" style="width: 60px; display: inline;"> - Max LRS <input type="text" id="max" class="form-control" style="width: 60px; display: inline;"> - </div> - <br /> - <br /> - {% endif %} ---> - - <div id="table_container" style="width: {% if dataset.type == 'ProbeSet' %}1300{% elif dataset.type == 'Publish' %}1300{% elif dataset.type == 'Geno' %}400{% endif %}px;"> - <table class="display dataTable nowrap" id='trait_table' style="float: left;"> - <thead> - <tr> - <th></th> - {% for header in header_fields %} - {% if header == 'Max LRS' %} - <th data-export="Max LRS">Max LRS <a href="http://genenetwork.org//glossary.html#LRS" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - {% elif header == 'Additive Effect' %} - <th data-export="Additive Effect">Additive Effect <a href="http://genenetwork.org//glossary.html#A" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - {% else %} - <th data-export="{{header}}">{{header}}</th> - {% endif %} - {% endfor %} - </tr> - </thead> - {% if trait_list|length > 20 %} - <tfoot> - <tr> - <th></th> - {% for header in header_fields %} - {% if header == 'Max LRS' %} - <th data-export="Max LRS">Max LRS <a href="http://genenetwork.org//glossary.html#LRS" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - {% elif header == 'Additive Effect' %} - <th data-export="Additive Effect">Additive Effect <a href="http://genenetwork.org//glossary.html#A" target="_blank"><img style="width: 15px; height: 15px;" src="/static/new/images/question_mark.jpg"></a></th> - {% else %} - <th data-export="{{header}}">{{header}}</th> - {% endif %} - {% endfor %} - </tr> - </tfoot> - {% endif %} + + <div id="table_container"> + <table class="table-hover table-striped cell-border" id='trait_table' style="float: left;"> + <tbody> + <td colspan="100%" align="center"><br><b><font size="15">Loading...</font></b><br></td> + </tbody> </table> </div> </div> @@ -121,6 +134,7 @@ {% endblock %} {% block js %} + <script language="javascript" type="text/javascript" src="/static/new/js_external/md5.min.js"></script> <script language="javascript" type="text/javascript" src="/static/new/javascript/search_results.js"></script> <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"></script> @@ -130,10 +144,25 @@ <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/buttons.colVis.min.js"></script> <script type='text/javascript'> - var json_trait_list = {{ json_trait_list|safe }}; + var trait_list = {{ trait_list|safe }}; </script> <script type="text/javascript" charset="utf-8"> + + $.fn.dataTable.ext.order['dom-checkbox'] = function ( settings, col ) + { + return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { + return $('input', td).prop('checked') ? '1' : '0'; + } ); + }; + + $.fn.dataTable.ext.order['dom-inner-text'] = function ( settings, col ) + { + return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { + return $(td).text(); + } ); + } + $(document).ready( function () { $('#trait_table tr').click(function(event) { @@ -170,11 +199,10 @@ } console.time("Creating table"); - {% if dataset.type == 'ProbeSet' %} //ZS: Need to make sort by symbol, also need to make sure blank symbol fields at the bottom and symbols starting with numbers below letters $('#trait_table').DataTable( { - "drawCallback": function( settings ) { + 'drawCallback': function( settings ) { $('#trait_table tr').click(function(event) { if (event.target.type !== 'checkbox') { $(':checkbox', this).trigger('click'); @@ -182,194 +210,218 @@ }); $('.trait_checkbox:checkbox').on("change", change_buttons); }, - "createdRow": function ( row, data, index ) { - $('td', row).eq(0).attr('style', 'padding-left: 8px; padding-right: 0px; padding-top: 4px; align: center;'); - $('td', row).eq(1).attr('align', 'right'); + 'createdRow': function ( row, data, index ) { + $('td', row).eq(0).attr("style", "text-align: center; padding: 0px 10px 2px 10px;"); + $('td', row).eq(1).attr("align", "right"); $('td', row).eq(1).attr('data-export', index+1); $('td', row).eq(2).attr('data-export', $('td', row).eq(2).text()); + {% if dataset.type == 'ProbeSet' %} $('td', row).eq(3).attr('title', $('td', row).eq(3).text()); $('td', row).eq(3).attr('data-export', $('td', row).eq(3).text()); + if ($('td', row).eq(3).text().length > 20) { + $('td', row).eq(3).text($('td', row).eq(3).text().substring(0, 20)); + $('td', row).eq(3).text($('td', row).eq(3).text() + '...') + } $('td', row).eq(4).attr('title', $('td', row).eq(4).text()); $('td', row).eq(4).attr('data-export', $('td', row).eq(4).text()); - if ($('td', row).eq(4).text().length > 60) { - $('td', row).eq(4).text($('td', row).eq(4).text().substring(0, 60)); + if ($('td', row).eq(4).text().length > 55) { + $('td', row).eq(4).text($('td', row).eq(4).text().substring(0, 55)); $('td', row).eq(4).text($('td', row).eq(4).text() + '...') } + $('td', row).slice(6,10).attr("align", "right"); $('td', row).eq(5).attr('data-export', $('td', row).eq(5).text()); - $('td', row).eq(6).attr('align', 'right'); $('td', row).eq(6).attr('data-export', $('td', row).eq(6).text()); - $('td', row).eq(7).attr('align', 'right'); $('td', row).eq(7).attr('data-export', $('td', row).eq(7).text()); $('td', row).eq(8).attr('data-export', $('td', row).eq(8).text()); - $('td', row).eq(9).attr('align', 'right'); $('td', row).eq(9).attr('data-export', $('td', row).eq(9).text()); - }, - "data": json_trait_list, - "columns": [ - { "type": "natural", "width": "2%" }, - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "12%" }, - { "type": "natural", "width": "12%" }, - { "type": "natural" }, - { "type": "natural", "width": "11%" }, - { "type": "natural", "width": "4%" }, - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "11%" }, - { "type": "natural", "width": "5%" } - ], - "columnDefs": [ { - "targets": 0, - "orderable": false - } ], - "order": [[1, "asc" ]], - buttons: [ - { - extend: 'columnsToggle', - columns: ':not(:first-child)', - postfixButtons: [ 'colvisRestore' ] - } - ], - "sDom": "BRZtir", - "iDisplayLength": -1, - "autoWidth": false, - "deferRender": true, - "bSortClasses": false, - "scrollX": true, - "scrollY": "600px", - "scrollCollapse": false, - "scroller": true, - "paging": false, - "orderClasses": true - } ); - - {% elif dataset.type == 'Publish' %} - $('#trait_table').DataTable( { - "drawCallback": function( settings ) { - $('#trait_table tr').click(function(event) { - if (event.target.type !== 'checkbox') { - $(':checkbox', this).trigger('click'); - } - }); - $('.trait_checkbox:checkbox').on("change", change_buttons); - }, - "createdRow": function ( row, data, index ) { - $('td', row).eq(0).attr('style', 'padding-left: 8px; padding-right: 0px; padding-top: 4px; align: center;'); - $('td', row).eq(1).attr('align', 'right'); - $('td', row).eq(1).attr('data-export', index+1); - $('td', row).eq(2).attr('data-export', $('td', row).eq(2).text()); + {% elif dataset.type == 'Publish' %} $('td', row).eq(3).attr('title', $('td', row).eq(3).text()); $('td', row).eq(3).attr('data-export', $('td', row).eq(3).text()); - if ($('td', row).eq(3).text().length > 50) { - $('td', row).eq(3).text($('td', row).eq(3).text().substring(0, 50)); + if ($('td', row).eq(3).text().length > 20) { + $('td', row).eq(3).text($('td', row).eq(3).text().substring(0, 20)); $('td', row).eq(3).text($('td', row).eq(3).text() + '...') } $('td', row).eq(4).attr('title', $('td', row).eq(4).text()); $('td', row).eq(4).attr('data-export', $('td', row).eq(4).text()); - if ($('td', row).eq(4).text().length > 50) { - $('td', row).eq(4).text($('td', row).eq(4).text().substring(0, 50)); + if ($('td', row).eq(4).text().length > 55) { + $('td', row).eq(4).text($('td', row).eq(4).text().substring(0, 55)); $('td', row).eq(4).text($('td', row).eq(4).text() + '...') } - $('td', row).eq(4).text($('td', row).eq(4).text().substring(0, 30)); - //$('td', row).eq(5).attr('align', 'right'); + $('td', row).slice(6,9).attr("align", "right"); $('td', row).eq(5).attr('data-export', $('td', row).eq(5).text()); - $('td', row).eq(6).attr('align', 'right'); $('td', row).eq(6).attr('data-export', $('td', row).eq(6).text()); $('td', row).eq(7).attr('data-export', $('td', row).eq(7).text()); - $('td', row).eq(8).attr('align', 'right'); $('td', row).eq(8).attr('data-export', $('td', row).eq(8).text()); - }, - "data": json_trait_list, - "columns": [ - { "type": "natural", "width": "2%" }, - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "6%" }, - { "type": "natural" }, - { "type": "natural", "width": "30%" }, - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "6%" }, - { "type": "natural", "width": "10%" }, - { "type": "natural", "width": "8%" } - ], - "columnDefs": [ { - "targets": 0, - "orderable": false - } ], - "order": [[1, "asc" ]], - buttons: [ - { - extend: 'columnsToggle', - columns: ':not(:first-child)', - postfixButtons: [ 'colvisRestore' ] - } - ], - "sDom": "BRZtir", - "iDisplayLength": -1, - "autoWidth": false, - "deferRender": true, - "bSortClasses": false, - "scrollY": "600px", - "scrollCollapse": false, - "scroller": false, - "paging": false, - "orderClasses": true - } ); - {% elif dataset.type == 'Geno' %} - $('#trait_table').DataTable( { - "drawCallback": function( settings ) { - $('#trait_table tr').click(function(event) { - if (event.target.type !== 'checkbox') { - $(':checkbox', this).trigger('click'); - } - }); - $('.trait_checkbox:checkbox').on("change", change_buttons); - }, - "createdRow": function ( row, data, index ) { - $('td', row).eq(0).attr('style', 'padding-left: 8px; padding-right: 0px; padding-top: 4px; align: center;'); - $('td', row).eq(1).attr('align', 'right'); - $('td', row).eq(1).attr('data-export', index+1); - $('td', row).eq(2).attr('data-export', $('td', row).eq(2).text()); + {% elif dataset.type == 'Geno' %} $('td', row).eq(3).attr('data-export', $('td', row).eq(3).text()); + {% endif %} }, - "data": json_trait_list, - "columns": [ - { "type": "natural", "width": "5%" }, - { "type": "natural", "width": "12%" }, - { "type": "natural" }, - { "type": "natural", "width": "30%"} + 'data': trait_list, + 'columns': [ + { + 'data': null, + 'orderDataType': "dom-checkbox", + 'orderSequence': [ "desc", "asc"], + 'render': function(data, type, row, meta) { + return '<input type="checkbox" name="searchResult" class="checkbox trait_checkbox" value="' + data.hmac + '">' + } + }, + { + 'title': "Index", + 'type': "natural", + 'data': "index" + }, + { + 'title': "Record", + 'type': "natural", + 'data': null, + 'orderDataType': "dom-inner-text", + 'render': function(data, type, row, meta) { + return '<a href="/show_trait?trait_id=' + data.name + '&dataset=' + data.dataset + '">' + data.name + '</a>' + } + }{% if dataset.type == 'ProbeSet' %}, + { + 'title': "Symbol", + 'type': "natural", + 'data': "symbol" + }, + { + 'title': "Description", + 'type': "natural", + 'data': "description" + }, + { + 'title': "Location", + 'type': "natural", + 'data': "location" + }, + { + 'title': "Mean", + 'type': "natural", + 'data': "mean", + 'orderSequence': [ "desc", "asc"] + }, + { + 'title': "Max LRS<a href=\"http://genenetwork.org//glossary.html#LRS\" target=\"_blank\" style=\"color: white;\"><sup>?</sup></a>", + 'type': "natural", + 'data': "lrs_score", + 'orderSequence': [ "desc", "asc"] + }, + { + 'title': "Max LRS Location", + 'type': "natural", + 'data': "lrs_location" + }, + { + 'title': "Additive Effect<a href=\"http://genenetwork.org//glossary.html#A\" target=\"_blank\" style=\"color: white;\"><sup>?</sup></a>", + 'type': "natural", + 'data': "additive", + 'orderSequence': [ "desc", "asc"] + }{% elif dataset.type == 'Publish' %}, + { + 'title': "Description", + 'type': "natural", + 'data': "description" + }, + { + 'title': "Authors", + 'type': "natural", + 'data': "authors" + }, + { + 'title': "Year", + 'type': "natural", + 'orderDataType': "dom-inner-text", + 'data': null, + 'render': function(data, type, row, meta) { + if (data.pubmed_id != "N/A"){ + return '<a href="' + data.pubmed_link + '">' + data.pubmed_text + '</a>' + } else { + return data.pubmed_text + } + }, + 'orderSequence': [ "desc", "asc"] + }, + { + 'title': "Max LRS<a href=\"http://genenetwork.org//glossary.html#LRS\" target=\"_blank\" style=\"color: white;\"><sup>?</sup></a>", + 'type': "natural", + 'data': "lrs_score", + 'orderSequence': [ "desc", "asc"] + }, + { + 'title': "Max LRS Location", + 'type': "natural", + 'data': "lrs_location" + }, + { + 'title': "Additive Effect<a href=\"http://genenetwork.org//glossary.html#A\" target=\"_blank\" style=\"color: white;\"><sup>?</sup></a>", + 'type': "natural", + 'data': "additive", + 'orderSequence': [ "desc", "asc"] + }{% elif dataset.type == 'Geno' %}, + { + 'title': "Location", + 'type': "natural", + 'data': "location" + }{% endif %} ], - "columnDefs": [ { - "targets": 0, - "orderable": false - } ], "order": [[1, "asc" ]], buttons: [ { extend: 'columnsToggle', - columns: ':not(:first-child)', + columns: function( idx, data, node ) { + if (idx != 0) { + return true; + } else { + return false; + } + }, postfixButtons: [ 'colvisRestore' ] } ], - "sDom": "BRZtir", - "iDisplayLength": -1, - "autoWidth": false, - "deferRender": true, - "bSortClasses": false, - "scrollY": "600px", - "scrollCollapse": true, - "scroller": true, - "paging": false, - "orderClasses": true + 'sDom': "Btir", + 'autoWidth': false, + 'deferRender': true, + 'paging': false, + 'orderClasses': true, + 'processing': true, + 'language': { + 'loadingRecords': ' ', + 'processing': 'Loading...' + } } ); - {% endif %} + + if (trait_list.length > 20) { + $('#trait_table').append( + '<tfoot>' + + '<tr>' + + '<th></th>' + + '<th>Index</th>' + + '<th>Record</th>' + + '<th>Symbol</th> ' + + '<th>Description</th>' + + '<th>Location</th>' + + '<th>Mean</th>' + + '<th>Max LRS <a href="http://genenetwork.org//glossary.html#LRS" target="_blank" style="color: white;"><sup>?</sup></a></th>' + + '<th>Max LRS Location</th>' + + '<th>Additive Effect <a href="http://genenetwork.org//glossary.html#A" target="_blank" style="color: white;"><sup>?</sup></a></th>' + + '</tr>' + + '</tfoot>' + ); + } console.timeEnd("Creating table"); - var table = $('#trait_table').DataTable(); $('#redraw').click(function() { var table = $('#trait_table').DataTable(); table.colReorder.reset() }); + submit_special = function(url) { + $("#trait_submission_form").attr("action", url); + return $("#trait_submission_form").submit(); + }; + }); </script> {% endblock %} diff --git a/wqflask/wqflask/templates/show_trait.html b/wqflask/wqflask/templates/show_trait.html index ef05e321..f5e81060 100644 --- a/wqflask/wqflask/templates/show_trait.html +++ b/wqflask/wqflask/templates/show_trait.html @@ -1,7 +1,6 @@ {% extends "base.html" %} {% block title %}Trait Data and Analysis{% endblock %} {% block css %} - <link rel="stylesheet" type="text/css" href="/static/new/css/show_trait.css" /> <link rel="stylesheet" type="text/css" href="/static/new/css/bar_chart.css" /> <link rel="stylesheet" type="text/css" href="/static/new/css/box_plot.css" /> <link rel="stylesheet" type="text/css" href="/static/new/css/prob_plot.css" /> @@ -12,6 +11,7 @@ <link rel="stylesheet" type="text/css" href="/static/new/packages/noUiSlider/nouislider.css" /> <link rel="stylesheet" type="text/css" href="/static/new/packages/noUiSlider/nouislider.pips.css" /> <link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" /> + <link rel="stylesheet" type="text/css" href="/static/new/css/show_trait.css" /> {% endblock %} {% block content %} <!-- Start of body --> @@ -52,7 +52,7 @@ </div> </div> <div class="panel panel-default"> - <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseTwo"> + <div class="panel-heading stats_panel" data-toggle="collapse" data-parent="#accordion" data-target="#collapseTwo"> <h3 class="panel-title"> <span class="glyphicon glyphicon-chevron-down"></span> Statistics </h3> @@ -62,26 +62,38 @@ {% include 'show_trait_statistics.html' %} </div> </div> - </div> + </div> <div class="panel panel-default"> <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseThree"> <h3 class="panel-title"> - <span class="glyphicon glyphicon-chevron-down"></span> Calculate Correlations + <span class="glyphicon glyphicon-chevron-down"></span> Transform and Filter Data </h3> </div> <div id="collapseThree" class="panel-collapse collapse in"> <div class="panel-body"> + {% include 'show_trait_transform_and_filter.html' %} + </div> + </div> + </div> + <div class="panel panel-default"> + <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseFour"> + <h3 class="panel-title"> + <span class="glyphicon glyphicon-chevron-down"></span> Calculate Correlations + </h3> + </div> + <div id="collapseFour" class="panel-collapse collapse in"> + <div class="panel-body"> {% include 'show_trait_calculate_correlations.html' %} </div> </div> </div> <div class="panel panel-default"> - <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseFour"> + <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseFive"> <h3 class="panel-title"> <span class="glyphicon glyphicon-chevron-down"></span> Mapping Tools </h3> </div> - <div id="collapseFour" class="panel-collapse collapse in"> + <div id="collapseFive" class="panel-collapse collapse in"> <div class="panel-body"> {% include 'show_trait_mapping_tools.html' %} </div> @@ -89,12 +101,12 @@ </div> </div> <div class="panel panel-default"> - <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseFive" aria-expanded="true"> + <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseSix" aria-expanded="true"> <h3 class="panel-title"> <span class="glyphicon glyphicon-chevron-up"></span> Review and Edit Data </h3> </div> - <div id="collapseFive" class="panel-collapse collapse" aria-expanded="true"> + <div id="collapseSix" class="panel-collapse collapse" aria-expanded="true"> <div class="panel-body"> {% include 'show_trait_edit_data.html' %} </div> @@ -192,7 +204,7 @@ "columns": [ { "bSortable": false }, { "type": "natural" }, - { "type": "natural", "width": "25%" }, + { "type": "natural", "width": js_data.sample_column_width}, { "type": "cust-txt" }, { "bSortable": false }, { "type": "cust-txt" }{% if has_num_cases %}, @@ -210,7 +222,7 @@ "iDisplayLength": -1, "autoWidth": true, "bLengthChange": true, - "bDeferRender": true, + "deferRender": false, "bSortClasses": false, "scrollY": "600px", "scrollCollapse": false, @@ -221,7 +233,7 @@ } ); {% else %} - + $('#samples_primary, #samples_other').DataTable( { "columns": [ { "bSortable": false, "width": "8%" }, @@ -242,7 +254,7 @@ "iDisplayLength": -1, "autoWidth": true, "bLengthChange": true, - "bDeferRender": true, + "deferRender": false, "bSortClasses": false, "scrollY": "600px", "scrollCollapse": false, @@ -251,6 +263,7 @@ }, "paging": false } ); + {% endif %} var slider = document.getElementById('p_range_slider'); diff --git a/wqflask/wqflask/templates/show_trait_details.html b/wqflask/wqflask/templates/show_trait_details.html index 1e6d41c2..566ea7ca 100644 --- a/wqflask/wqflask/templates/show_trait_details.html +++ b/wqflask/wqflask/templates/show_trait_details.html @@ -5,10 +5,6 @@ </tr> {% if this_trait.dataset.type == 'Publish' %} <tr> - <td>Tissue</td> - <td>{{ this_trait.dataset.tissue }}</td> - </tr> - <tr> <td>Phenotype</td> <td><div style="width:40%;">{{ this_trait.description_fmt }}</div></td> </tr> @@ -24,6 +20,11 @@ <td>Journal</td> <td>{{ this_trait.journal }} (<a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids={{ this_trait.pubmed_id }}&dop=Abstract" title="PubMed">{{ this_trait.year }}</a>)</td> </tr> + {% else %} + <tr> + <td>Tissue</td> + <td>{{ this_trait.dataset.tissue }}</td> + </tr> {% endif %} {% if this_trait.dataset.type == 'ProbeSet' %} {% if this_trait.symbol != None %} @@ -46,7 +47,7 @@ <tr> <td>Database</td> <td> - <a href="http://genenetwork.org/dbdoc/{{ dataset.name }}.html"> + <a href="http://genenetwork.org/webqtl/main.py?FormID=sharinginfo&InfoPageName={{ dataset.name }}"> {{ dataset.fullname }} </a> </td> @@ -111,30 +112,27 @@ </a> {% if this_trait.dataset.type == 'ProbeSet' %} {% if this_trait.symbol != None %} - <a href="http://www.genenetwork.org/webqtl/main.py?cmd=sch&gene={{ this_trait.symbol }}&alias=1&species={{ dataset.group.species }}"> + <a target="_blank" href="http://www.genenetwork.org/webqtl/main.py?cmd=sch&gene={{ this_trait.symbol }}&alias=1&species={{ dataset.group.species }}"> <button type="button" class="btn btn-default" title="Find similar expression data">Find</button> </a> {% endif %} {% if UCSC_BLAT_URL != "" %} - <a href="{{ UCSC_BLAT_URL }}"> + <a target="_blank" href="{{ UCSC_BLAT_URL }}"> <button type="button" class="btn btn-default" title="Check probe locations at UCSC">Verify</button> </a> {% endif %} {% if this_trait.symbol != None %} - <a href="http://genenetwork.org/webqtl/main.py?FormID=geneWiki&symbol={{ this_trait.symbol }}"> + <a target="_blank" href="http://genenetwork.org/webqtl/main.py?FormID=geneWiki&symbol={{ this_trait.symbol }}"> <button type="button" class="btn btn-default" title="Write or review comments about this gene">GeneWiki</button> </a> - <a href="http://genenetwork.org/webqtl/main.py?FormID=SnpBrowserResultPage&submitStatus=1&diffAlleles=True&customStrain=True&geneName={{ this_trait.symbol }}"> + {% if dataset.group.species == "mouse" or dataset.group.species == "rat" %} + <a href="./snp_browser?first_run=true&species={{ dataset.group.species }}&gene_name={{ this_trait.symbol }}&limit_strains=on"> <button type="button" class="btn btn-default" title="View SNPs and Indels">SNPs</button> </a> {% endif %} - {% if UTHSC_BLAT_URL != "" %} - <a href="{{ UTHSC_BLAT_URL }}"> - <button type="button" class="btn btn-default" title="View probes, SNPs, and RNA-seq at UTHSC">RNA-seq</button> - </a> {% endif %} {% if show_probes == "True" %} - <a href="http://genenetwork.org/webqtl/main.py?FormID=showProbeInfo&database={{ this_trait.dataset.name }}&ProbeSetID={{ this_trait.name }}&CellID={{ this_trait.cellid }}&RISet={{ dataset.group.name }}&incparentsf1=ON"> + <a target="_blank" href="http://genenetwork.org/webqtl/main.py?FormID=showProbeInfo&database={{ this_trait.dataset.name }}&ProbeSetID={{ this_trait.name }}&CellID={{ this_trait.cellid }}&RISet={{ dataset.group.name }}&incparentsf1=ON"> <button type="button" class="btn btn-default" title="Check sequence of probes">Probes</button> </a> {% endif %} diff --git a/wqflask/wqflask/templates/show_trait_edit_data.html b/wqflask/wqflask/templates/show_trait_edit_data.html index 16878a8f..090602f4 100644 --- a/wqflask/wqflask/templates/show_trait_edit_data.html +++ b/wqflask/wqflask/templates/show_trait_edit_data.html @@ -1,6 +1,7 @@ <div> <!--<h2>Review and Edit Data</h2>--> +<!-- <div class="well form-horizontal"> <fieldset id="showHideOptions"> <legend>Block samples</legend> @@ -59,11 +60,6 @@ <option value="sqrt">Square Root</option> </select> </div> - <!-- - {% if sample_groups[0].sample_qnorm is not none %} - <input type="button" id="qnorm" class="btn btn-default" value="Quantile Normalize"> - {% endif %} - --> </div> </fieldset> <br> @@ -81,24 +77,24 @@ </div> </div> <br> - +--> <!--<div id="edit_sample_lists">--> {% for sample_type in sample_groups %} {% set outer_loop = loop %} - <div class="sample_group" style="width:{{ trait_table_width }}%;"> + <div class="sample_group" style="width:{{ trait_table_width }};"> <h3>{{ sample_type.header }}</h3> <hr> <div id="table_container"> - <table class="table-hover table-striped" id="samples_{{ sample_type.sample_group_type }}" style="float: left; width:100%;"> + <table class="table-hover table-striped cell-border" id="samples_{{ sample_type.sample_group_type }}" style="float: left; width:100%;"> <thead> <tr> <th></th> - <th>Index</th> + <th>ID</th> <th>Sample</th> <th style="text-align: right;">Value</th> {% if sample_type.se_exists() %} - <th> </th> + <th style="padding-left: 3px; padding-right: 3px;"> </th> <th style="text-align: right;">SE</th> {% endif %} {% if has_num_cases %} @@ -113,8 +109,8 @@ </thead> <tbody> {% for sample in sample_type.sample_list %} - <tr class="{{ sample.class_outlier }} value_se" id="{{ sample.this_id }}"> - <td align="center" style="padding-right: 0px;" class="column_name-"><input type="checkbox" name="selectCheck" class="checkbox edit_sample_checkbox" value="{{ sample.name }}" checked="checked"> + <tr class="{{ sample.class_outlier }} value_se" id="{% if outer_loop.index == 1 %}Primary_{{ sample.this_id }}{% else %}Other_{{ sample.this_id }}{% endif %}"> + <td align="center" style="padding-left: 0px; padding-right: 0px; padding-top: 2px; padding-bottom: 0px;" class="column_name-"><input type="checkbox" name="selectCheck" class="checkbox edit_sample_checkbox" style="min-height: 20px;" value="{{ sample.name }}" checked="checked"> </td> <td class="column_name-Index" align="right">{{ loop.index }}</td> <td class="column_name-Sample"> @@ -124,8 +120,8 @@ </td> {# Todo: Add IDs #} - <td class="column_name-Value" align="right"> - <input type="text" data-value="{{ sample.display_value }}" data-qnorm="{{ qnorm_vals[outer_loop.index - 1][0][loop.index - 1] }}" name="{{ 'value:' + sample.name }}" + <td class="column_name-Value" align="right" style="padding-top: 2px; padding-bottom: 0px;"> + <input type="text" data-value="{{ sample.display_value }}" data-qnorm="{{ qnorm_vals[outer_loop.index - 1][loop.index - 1] }}" name="{{ 'value:' + sample.name }}" style="text-align:right;" class="trait_value_input edit_sample_value" value="{{ sample.display_value }}" @@ -134,13 +130,13 @@ </td> {% if sample_type.se_exists() %} - <td> + <td align="center" style="padding-left: 2px; padding-right: 2px;"> ± </td> {# Todo: Add IDs #} - <td class="column_name-SE" align="right"> - <input type="text" data-value="{{ sample.display_variance }}" data-qnorm="{{ qnorm_vals[outer_loop.index - 1][1][loop.index - 1] }}" name="{{ 'variance:' + sample.name}}" + <td class="column_name-SE" align="right" style="padding-top: 2px; padding-bottom: 0px;"> + <input type="text" data-value="{{ sample.display_variance }}" data-qnorm="x" name="{{ 'variance:' + sample.name}}" style="text-align:right;" class="trait_value_input edit_sample_se" value="{{ sample.display_variance }}" diff --git a/wqflask/wqflask/templates/show_trait_mapping_tools.html b/wqflask/wqflask/templates/show_trait_mapping_tools.html index c2c201e1..e0bc8eb8 100644 --- a/wqflask/wqflask/templates/show_trait_mapping_tools.html +++ b/wqflask/wqflask/templates/show_trait_mapping_tools.html @@ -14,11 +14,6 @@ <li> <a href="#rqtl_geno" data-toggle="tab">R/qtl</a> </li> -<!-- - <li> - <a href="#pylmm" data-toggle="tab">pyLMM</a> - </li> ---> {% endif %} {% for mapping_method in dataset.group.mapping_names %} {% if mapping_method == "GEMMA" %} @@ -39,6 +34,16 @@ <div class="tab-content"> <div class="tab-pane active" id="gemma"> <div style="padding-top: 20px;" class="form-horizontal"> + <div class="mapping_method_fields form-group"> + <label for="chr_select" style="text-align: right;" class="col-xs-3 control-label">Chromosome</label> + <div style="margin-left:20px;" class="col-xs-2 controls"> + <select id="chr_gemma" class="form-control"> + {% for item in chr_list %} + <option value="{{ item[1] }}">{{ item[0] }}</option> + {% endfor %} + </select> + </div> + </div> {% if genofiles and genofiles|length>0 %} <div class="mapping_method_fields form-group"> <label for="genofiles" style="text-align: right;" class="col-xs-3 control-label">Genotypes</label> @@ -54,7 +59,7 @@ <div class="mapping_method_fields form-group"> <label for="maf_gemma" style="text-align: right;" class="col-xs-3 control-label">MAF</label> <div style="margin-left:20px;" class="col-xs-4 controls"> - <input name="maf_gemma" value="0.05" type="text" class="form-control"> + <input name="maf_gemma" value="{{ maf }}" type="text" class="form-control"> </div> </div> <div class="mapping_method_fields form-group"> @@ -110,6 +115,16 @@ {% if dataset.group.mapping_id == "1" %} <div class="tab-pane" id="interval_mapping"> <div style="margin-top: 20px" class="form-horizontal"> + <div class="mapping_method_fields form-group"> + <label for="chr_select" style="text-align: right;" class="col-xs-3 control-label">Chromosome</label> + <div style="margin-left:20px;" class="col-xs-2 controls"> + <select id="chr_reaper" class="form-control"> + {% for item in chr_list %} + <option value="{{ item[1] }}">{{ item[0] }}</option> + {% endfor %} + </select> + </div> + </div> {% if genofiles and genofiles|length>0 %} <div class="mapping_method_fields form-group"> <label style="text-align: right;" for="genofiles" class="col-xs-3 control-label">Genotypes</label> @@ -202,6 +217,16 @@ </div> <div class="tab-pane" id="rqtl_geno"> <div style="margin-top: 20px" class="form-horizontal"> + <div class="mapping_method_fields form-group"> + <label for="chr_select" style="text-align: right;" class="col-xs-3 control-label">Chromosome</label> + <div style="margin-left:20px;" class="col-xs-2 controls"> + <select id="chr_rqtl_geno" class="form-control"> + {% for item in chr_list %} + <option value="{{ item[1] }}">{{ item[0] }}</option> + {% endfor %} + </select> + </div> + </div> {% if genofiles and genofiles|length>0 %} <div class="mapping_method_fields form-group"> <label style="text-align:right;" for="genofiles" class="col-xs-3 control-label">Genotypes</label> @@ -304,30 +329,6 @@ </div> </div> </div> - <div class="tab-pane" id="pylmm"> - <div style="margin-top: 20px" class="form-horizontal"> - {% if genofiles and genofiles|length>0 %} - <div class="mapping_method_fields form-group"> - <label style="text-align:right;" class="col-xs-3 control-label">Genotypes</label> - <div style="margin-left: 20px;" class="col-xs-4 controls"> - <select id="genofile_pylmm" class="form-control"> - {% for item in genofiles %} - <option value="{{item['location']}}:{{item['title']}}">{{item['title']}}</option> - {% endfor %} - </select> - </div> - </div> - {% endif %} - <div class="mapping_method_fields form-group"> - <label class="col-xs-3 control-label"></label> - <div style="margin-left:20px;" class="col-xs-6"> - <button id="pylmm_compute" class="btn submit_special btn-success" data-url="/marker_regression" title="Compute Interval Mapping"> - Compute - </button> - </div> - </div> - </div> - </div> {% endif %} </div> </div> @@ -341,10 +342,6 @@ <dd>Interval mapping is a process in which the statistical significance of a hypothetical QTL is evaluated at regular points across a chromosome, even in the absence of explicit genotype data at those points.</dd> <dt>R/qtl</dt> <dd>R/qtl is an extensible, interactive environment for mapping quantitative trait loci (QTL) in experimental crosses.</dd> -<!-- - <dt>pyLMM</dt> - <dd>pyLMM is a fast and lightweight linear mixed-model (LMM) solver for use in genome-wide association studies (GWAS).</dd> ---> {% endif %} </dl> </div> diff --git a/wqflask/wqflask/templates/show_trait_statistics.html b/wqflask/wqflask/templates/show_trait_statistics.html index ac0c753a..a0bdc987 100644 --- a/wqflask/wqflask/templates/show_trait_statistics.html +++ b/wqflask/wqflask/templates/show_trait_statistics.html @@ -5,15 +5,15 @@ <a href="#stats_tab" data-toggle="tab">Basic Statistics</a> </li> <li> - <a href="#histogram_tab" data-toggle="tab">Histogram</a> + <a href="#histogram_tab" class="histogram_tab" data-toggle="tab">Histogram</a> </li> {% if num_values < 256 %} <li> - <a href="#bar_chart_tab" data-toggle="tab">Bar Chart</a> + <a href="#bar_chart_tab" class="bar_chart_tab" data-toggle="tab">Bar Chart</a> </li> {% endif %} <li> - <a href="#probability_plot" data-toggle="tab">Probability Plot</a> + <a href="#probability_plot" class="prob_plot_tab" data-toggle="tab">Probability Plot</a> </li> {% if g.user_session.logged_in %} <li> @@ -21,10 +21,10 @@ </li> {% endif %} <li> - <a href="#box_plot_tab" data-toggle="tab">Box Plot</a> + <a href="#box_plot_tab" class="box_plot_tab" data-toggle="tab">Box Plot</a> </li> <li> - <a href="#violin_plot_tab" data-toggle="tab">Violin Plot</a> + <a href="#violin_plot_tab" class="violin_plot_tab" data-toggle="tab">Violin Plot</a> </li> </ul> diff --git a/wqflask/wqflask/templates/show_trait_transform_and_filter.html b/wqflask/wqflask/templates/show_trait_transform_and_filter.html new file mode 100644 index 00000000..fdf34c27 --- /dev/null +++ b/wqflask/wqflask/templates/show_trait_transform_and_filter.html @@ -0,0 +1,79 @@ +<div> + <div class="form-horizontal"> + <legend>Block samples</legend> + <p>Edit or delete values in the Trait Data boxes, and use the + <strong>Reset</strong> option as + needed. + </p> + + <div id="blockMenuSpan" class="input-append" style="margin-bottom: 10px;"> + <label for="remove_samples_field">Block samples by index:</label> + <input type="text" id="remove_samples_field" placeholder="Example: 3, 5-10, 12"> + <select id="block_group" size="1"> + <option value="primary"> + {{ sample_group_types['samples_primary'] }} + </option> + <option value="other"> + {{ sample_group_types['samples_other'] }} + </option> + </select> + <input type="button" id="block_by_index" class="btn" value="Block"> + </div> + <div id="remove_samples_invalid" class="alert alert-error" style="display:none;"> + Please check that your input is formatted correctly, e.g. <strong>3, 5-10, 12</strong> + </div> + {% if sample_groups[0].attributes %} + <div class="input-append" style="margin-top:10px; margin-bottom:10px;"> + <label for="exclude_menu">Block samples by group:</label> + <select id="exclude_menu" size=1> + {% for attribute in sample_groups[0].attributes %} + <option value="{{ sample_groups[0].attributes[attribute].name.replace(' ', '_') }}"> + {{ sample_groups[0].attributes[attribute].name }}</option> + {% endfor %} + </select> + <select id="attribute_values" size=1> + </select> + <input type="button" id="exclude_group" class="btn" value="Block"> + </div> + {% endif %} + <div> + <input type="button" id="hide_no_value" class="btn btn-default" value="Hide No Value"> + <input type="button" id="block_outliers" class="btn btn-default" value="Block Outliers"> + <input type="button" id="reset" class="btn btn-primary" value="Reset"> + <span class="input-append"> + <input type="button" id="export" class="btn btn-default" value="Export"> + <select id="export_format" class="select optional span2"> + <option value="excel">Excel</option> + <option value="csv">CSV</option> + </select> + </span> + <br> + <div style="margin-top:10px;"> + <input type="button" id="normalize" class="btn btn-default" value="Normalize"> + <select id="norm_method" class="select optional span2"> + <option value="log2">Log2</option> + <option value="qnorm">Quantile</option> + <option value="sqrt">Square Root</option> + </select> + </div> + <!-- + {% if sample_groups[0].sample_qnorm is not none %} + <input type="button" id="qnorm" class="btn btn-default" value="Quantile Normalize"> + {% endif %} + --> + </div> + <br> + + <div> + <p>Outliers highlighted in + <strong style="background-color:yellow;">yellow</strong> + can be hidden using + the <strong>Hide Outliers</strong> button. + </p> + + <p>Samples with no value (x) can be hidden by clicking + <strong>Hide No Value</strong> button. + </p> + </div> + </div> +</div>
\ No newline at end of file diff --git a/wqflask/wqflask/templates/snp_browser.html b/wqflask/wqflask/templates/snp_browser.html index cbce1449..45a14626 100644 --- a/wqflask/wqflask/templates/snp_browser.html +++ b/wqflask/wqflask/templates/snp_browser.html @@ -2,6 +2,7 @@ {% 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/typeahead-bootstrap.css" /> <link rel="stylesheet" type="text/css" href="/static/new/css/snp_browser.css" /> {% endblock %} {% block content %} @@ -9,33 +10,35 @@ <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;"> + <div class="container" style="border-style: double; position: relative; width: 950px; padding-top: 10px; padding-right: 40px;"> <form id="snp_browser_form" method="get" action="/snp_browser"> - <input type="hidden" name="chosen_strains"> + <input type="hidden" name="first_run" value="{{ first_run }}"> + <input type="hidden" name="chosen_strains_mouse" value="{{ chosen_strains_mouse|join(",") }}"> + <input type="hidden" name="chosen_strains_rat" value="{{ chosen_strains_rat|join(",") }}"> <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> + <option value="SNP" {% if variant_type == "SNP" %}selected{% endif %}>SNP</option> + <option value="InDel" {% if variant_type == "InDel" %}selected{% endif %}>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 id="species_select" name="species"> + <option value="Mouse" {% if species_name == "Mouse" %}selected{% endif %}>Mouse</option> + <option value="Rat" {% if species_name == "Rat" %}selected{% endif %}>Rat</option> + <option value="Human" disabled>Human</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"> + <input type="text" name="gene_name" size="12" value="{{ gene_name }}"> </div> </div> <div class="form-group row"> @@ -44,8 +47,8 @@ <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 %} + <select id="chr_select" name="chr"> + {% for item in this_chr_list %} <option value="{{ item }}" {% if item == chr %}selected{% endif %}>{{ item }}</option> {% endfor %} </select> @@ -75,15 +78,16 @@ <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] %} + <select id="strain_select" name="strains" style="width: 70%;"> + {% if species_name == "Mouse" %} + {% for strain in strain_lists['mouse'] %} <option value="{{ strain }}" {% if loop.index == 1 %}selected{% endif %}>{{ strain }}</option> {% endfor %} - </optgroup> - <optgroup label="Rat"> - <option value="BN">BN</option> - </optgroup> + {% elif species_name == "Rat" %} + {% for strain in strain_lists['rat'] %} + <option value="{{ strain }}" {% if loop.index == 1 %}selected{% endif %}>{{ strain }}</option> + {% endfor %} + {% endif %} </select> <div style="float: right; line-height: 20px;"> <input class="btn btn-primary" type="button" name="add_strain" value="Add" style="vertical-align: middle;"> @@ -177,57 +181,318 @@ </form> </div> + <div style="margin-top: 20px;"> {% if filtered_results is defined %} - <table class="cell-border nowrap" id="results_table" style="float: left;"> + {% if filtered_results|length > limit_number %} + There are more than 10000 results. Consider limiting your search to a smaller range. + {% else %} + <table class="dataTable cell-border nowrap" id="results_table" style="float: left;"> <thead> <tr> <th></th> + {% if header_fields|length == 2 %} + {% for header in header_fields[0] %} + <th data-export="{{ header }}">{{ header }}</th> + {% endfor %} + {% for strain in header_fields[1] %} + <th data-export="{{ strain }}" style="align: center; text-align: center; line-height: 15px;">{% for letter in strain %}<div style="transform: rotate(90deg);">{{ letter }}</div>{% endfor %}</th> + {% endfor %} + {% else %} {% for header in header_fields %} <th data-export="{{ header }}">{{ header }}</th> {% endfor %} + {% endif %} </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 %} + <td colspan="100%" align="center"><br><b><font size="15">Loading...</font></b><br></td> </tbody> </table> + {% endif %} {% endif %} - + </div> </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" type="text/javascript" src="/static/new/js_external/typeahead.bundle.js"></script> + + <script language="javascript" type="text/javascript" src="/static/new/javascript/typeahead_rn6.json"></script> + + <script type='text/javascript'> + var json_rows = {{ table_rows|safe }}; + var empty_columns = {{ empty_columns|safe }}; + </script> + <script language="javascript"> + var substringMatcher = function(strs) { + return function findMatches(q, cb) { + var matches, substringRegex; + + // an array that will be populated with substring matches + matches = []; + + // regex used to determine if a string contains the substring `q` + substrRegex = new RegExp(q, 'i'); + + // iterate through the pool of strings and for any string that + // contains the substring `q`, add it to the `matches` array + $.each(strs, function(i, str) { + if (substrRegex.test(str)) { + matches.push(str); + } + }); + + cb(matches); + }; + }; + + $('input[name=gene_name]').typeahead({ + minLength: 2, + hint: true, + highlight: true + }, + { + name: 'rn6-genes', + source: substringMatcher(rat_genes) + }); + {% if filtered_results is defined %} $("#results_table").DataTable( { - "sDom": "tir", - "iDisplayLength": -1, - "autoWidth": true, - "paging": false + 'data': json_rows, + {% if variant_type == "SNP" %} + 'columns': [ + { + 'data': null, + 'orderable': false, + 'render': function(data, type, row, meta) { + return '<input type="checkbox" name="trait_check">' + } + }, { + 'data': 'index' + }, { + 'data': null, + 'render': function(data, type, row, meta) { + if (data.rs != "") { + return '<b><a href="' + data.snp_url + '">' + data.snp_name + '</a></b>' + } else { + return '<a href="' + data.snp_url + '">' + data.snp_name + '</a>' + } + } + }, { + 'data': 'chr' + }, { + 'data': 'mb_formatted' + }, { + 'data': 'alleles' + }, {% if empty_columns['snp_source'] == "true" %}{ + 'data': null, + 'render': function(data, type, row, meta) { + if (data.snp_source == "Sanger/UCLA") { + return '<a href="' + data.source_urls[0] + '">Sanger</a><a href="' + data.source_urls[1] + '">UCLA</a>' + } else { + return data.snp_source + } + } + }, {% endif %} {% if empty_columns['conservation_score'] == "true" %}{ + 'data': 'conservation_score' + }, {% endif %} {% if empty_columns['gene_name'] == "true" %}{ + 'data': null, + 'render': function(data, type, row, meta) { + if (data.gene_name != "") { + return '<i>' + data.gene_name + '</i><br><a href="' + data.gene_link + '">NCBI</a>' + } else { + return data.gene_name + } + } + }, {% endif %} {% if empty_columns['transcript'] == "true" %}{ + 'data': null, + 'render': function(data, type, row, meta) { + if (data.transcript != "") { + return '<a href="' + data.transcript_link + '">' + data.transcript + '</a>' + } else { + return data.transcript + } + } + }, {% endif %} {% if empty_columns['exon'] == "true" %}{ + 'data': 'exon' + }, {% endif %}{ + 'data': 'domain_1' + }, {% if empty_columns['domain_2'] == "true" %}{ + 'data': 'domain_2' + }, {% endif %} {% if empty_columns['function'] == "true" %}{ + 'data': 'function' + }, {% endif %} {% if empty_columns['function_details'] == "true" %}{ + 'data': 'function_details' + }, {% endif %} {% for item in allele_list %} { + 'data': null, + 'orderable': false, + 'render': function(data, type, row, meta) { + if (typeof data.allele_value_list[{{ loop.index - 1 }}][0] !== "undefined") { + return data.allele_value_list[{{ loop.index - 1 }}][0] + } else { + return '' + } + } + }{% if loop.index < allele_list|length %},{% endif %}{% endfor %} + ], + 'createdRow': function( row, data, dataIndex) { + $('td', row).eq(0).attr("style", "text-align: center; padding: 4px 10px 2px 10px;"); + $('td', row).eq(1).attr("align", "right"); + for (i = {{ 15 - empty_field_count }}; i < ({{ 15 - empty_field_count }} + {{ allele_list|length }}); i++) { + var this_allele = $('td', row).eq(i).text(); + $('td', row).eq(i).attr("style", "text-align: center; padding: 4px 10px 2px 10px;"); + switch (this_allele) { + case "A": + $('td', row).eq(i).addClass('A_allele_color'); + break; + case "C": + $('td', row).eq(i).addClass('C_allele_color'); + break; + case "T": + $('td', row).eq(i).addClass('T_allele_color'); + break; + case "G": + $('td', row).eq(i).addClass('G_allele_color'); + break; + case "t": + $('td', row).eq(i).addClass('t_allele_color'); + break; + case "c": + $('td', row).eq(i).addClass('c_allele_color'); + break; + case "a": + $('td', row).eq(i).addClass('a_allele_color'); + break; + case "g": + $('td', row).eq(i).addClass('g_allele_color'); + break; + default: + $('td', row).eq(i).addClass('default_allele_color'); + } + } + }, + {% else %} + 'columns': [ + { + 'data': null, + 'render': function(data, type, row, meta) { + return '<input type="checkbox" name="trait_check">' + } + }, { + 'data': 'indel_name' + }, { + 'data': 'indel_type' + }, { + 'data': 'indel_chr' + }, { + 'data': 'indel_mb_s' + }, { + 'data': 'indel_mb_e' + }, { + 'data': 'strand' + }, { + 'data': 'size' + }, { + 'data': 'sequence' + }, { + 'data': 'source_name' + } + ], + {% endif %} + 'order': [[1, "asc" ]], + 'sDom': "rti", + 'iDisplayLength': -1, + 'processing': true, + 'language': { + 'loadingRecords': ' ', + 'processing': 'Loading...' + } }); {% endif %} + $("#species_select").change(function() { + this_species = $(this).val(); + $("#strain_select").empty() + $("#chosen_strains_select").empty() + $("#chr_select").empty() + + if (this_species == "Mouse") { + {% for strain in strain_lists["mouse"] %} + var option = $('<option></option>').attr("value", "{{ strain }}").text("{{ strain }}"); + $("select[name=strains]").append(option); + {% endfor %} + + {% for chr in mouse_chr_list %} + var option = $('<option></option>').attr("value", "{{ chr }}").text("{{ chr }}"); + $("select[name=chr]").append(option); + {% endfor %} + + chosen_strains = $("input[name=chosen_strains_mouse]").val().split(",") + } else if (this_species == "Rat") { + {% for strain in strain_lists["rat"] %} + var option = $('<option></option>').attr("value", "{{ strain }}").text("{{ strain }}"); + $("select[name=strains]").append(option); + {% endfor %} + + {% for chr in rat_chr_list %} + var option = $('<option></option>').attr("value", "{{ chr }}").text("{{ chr }}"); + $("select[name=chr]").append(option); + {% endfor %} + + chosen_strains = $("input[name=chosen_strains_rat]").val().split(",") + } + + for (i=0; i < chosen_strains.length; i++) { + var option = $('<option></option>').attr("value", chosen_strains[i]).text(chosen_strains[i]); + $("#chosen_strains_select").append(option) + } + }); + $("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>"); + + var current_species = $("#species_select").val(); + if (current_species == "Mouse") { + stored_strains = $("input[name=chosen_strains_mouse]").val().split(",") + stored_strains.push(selected_strain) + $("input[name=chosen_strains_mouse]").val(stored_strains.join(",")) + } else if (current_species == "Rat") { + stored_strains = $("input[name=chosen_strains_rat]").val().split(",") + stored_strains.push(selected_strain) + $("input[name=chosen_strains_rat]").val(stored_strains.join(",")) + } }); $("input[name=remove_strain]").click(function() { var selected_strain = $("#chosen_strains_select option:selected").val(); $("#chosen_strains_select option[value='" + selected_strain + "']").remove(); + + var current_species = $("#species_select").val(); + + if (current_species == "Mouse") { + stored_strains = $("input[name=chosen_strains_mouse]").val().split(",") + for (i=0; i < stored_strains.length; i++) { + if (stored_strains[i] == selected_strain) { + stored_strains.splice(i, 1); + break; + } + } + $("input[name=chosen_strains_mouse]").val(stored_strains.join(",")) + } else if (current_species == "Rat") { + stored_strains = $("input[name=chosen_strains_rat]").val().split(",") + for (i=0; i < stored_strains.length; i++) { + if (stored_strains[i] == selected_strain) { + stored_strains.splice(i, 1); + break; + } + } + $("input[name=chosen_strains_rat]").val(stored_strains.join(",")) + } }); $("#snp_browser_form").submit(function() { diff --git a/wqflask/wqflask/templates/webgestalt_page.html b/wqflask/wqflask/templates/webgestalt_page.html new file mode 100644 index 00000000..36b3cebf --- /dev/null +++ b/wqflask/wqflask/templates/webgestalt_page.html @@ -0,0 +1,35 @@ +{% extends "base.html" %} +{% block title %}{% if wrong_input == "True" %}WebGestalt Error{% else %}Opening WebGestalt{% endif %}{% endblock %} +{% block content %} + {% if wrong_input == "True" %} + {{ header("Error") }} + + <div class="container"> + {% if chip_name == "mixed" %} + <h3>Sorry, the analysis was interrupted because your selections from GeneNetwork apparently include data from more than one array platform (i.e., Affymetrix U74A and M430 2.0). Most WebGestalt analyses assume that you are using a single array type and compute statistical values on the basis of that particular array. Please reselect traits from a signle platform and submit again.</h3> + {% elif chip_name == "not_microarray" %} + <h3>You need to select at least one microarray trait to submit.</hr> + {% elif '_NA' in chip_name %} + <h3>Sorry, the analysis was interrupted because your selections from GeneNetwork apparently include data from platform {{ chip_name }} which is unknown by WebGestalt. Please reselect traits and submit again.</h3> + {% else %} + <h3>Sorry, an error occurred while submitting your traits to WebGestalt.</h3> + {% endif %} + </div> + {% else %} + <div class="container"> + <h3>Opening WebGestalt...</h3> + </div> + <form method="post" action="http://www.webgestalt.org/option.php" name="WebGestalt"> + {% for key in hidden_vars %} + <input type="hidden" name="{{ key }}" value="{{ hidden_vars[key] }}"> + {% endfor %} + </form> + {% endif %} +{% endblock %} +{% block js %} +{% if wrong_input == "False" %} +<script type="text/javascript"> + setTimeout('document.WebGestalt.submit()', 1000); +</script> +{% endif %} +{% endblock %}
\ No newline at end of file diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index fdb80040..cd2e047b 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -43,9 +43,10 @@ from base.data_set import DataSet # Used by YAML in marker_regression from wqflask.show_trait import show_trait from wqflask.show_trait import export_trait_data from wqflask.heatmap import heatmap +from wqflask.external_tools import send_to_bnw, send_to_webgestalt, send_to_geneweaver from wqflask.comparison_bar_chart import comparison_bar_chart -from wqflask.marker_regression import marker_regression -from wqflask.marker_regression import marker_regression_gn1 +from wqflask.marker_regression import run_mapping +from wqflask.marker_regression import display_mapping_results from wqflask.network_graph import network_graph from wqflask.correlation import show_corr_results from wqflask.correlation_matrix import show_corr_matrix @@ -466,6 +467,60 @@ def heatmap_page(): return rendered_template +@app.route("/bnw_page", methods=('POST',)) +def bnw_page(): + logger.info("In run BNW, request.form is:", pf(request.form)) + logger.info(request.url) + + start_vars = request.form + + traits = [trait.strip() for trait in start_vars['trait_list'].split(',')] + if traits[0] != "": + template_vars = send_to_bnw.SendToBNW(request.form) + + result = template_vars.__dict__ + rendered_template = render_template("bnw_page.html", **result) + else: + rendered_template = render_template("empty_collection.html", **{'tool':'BNW'}) + + return rendered_template + +@app.route("/webgestalt_page", methods=('POST',)) +def webgestalt_page(): + logger.info("In run WebGestalt, request.form is:", pf(request.form)) + logger.info(request.url) + + start_vars = request.form + + traits = [trait.strip() for trait in start_vars['trait_list'].split(',')] + if traits[0] != "": + template_vars = send_to_webgestalt.SendToWebGestalt(request.form) + + result = template_vars.__dict__ + rendered_template = render_template("webgestalt_page.html", **result) + else: + rendered_template = render_template("empty_collection.html", **{'tool':'WebGestalt'}) + + return rendered_template + +@app.route("/geneweaver_page", methods=('POST',)) +def geneweaver_page(): + logger.info("In run WebGestalt, request.form is:", pf(request.form)) + logger.info(request.url) + + start_vars = request.form + + traits = [trait.strip() for trait in start_vars['trait_list'].split(',')] + if traits[0] != "": + template_vars = send_to_geneweaver.SendToGeneWeaver(request.form) + + result = template_vars.__dict__ + rendered_template = render_template("geneweaver_page.html", **result) + else: + rendered_template = render_template("empty_collection.html", **{'tool':'GeneWeaver'}) + + return rendered_template + @app.route("/comparison_bar_chart", methods=('POST',)) def comp_bar_chart_page(): logger.info("In comp bar chart, request.form is:", pf(request.form)) @@ -551,10 +606,10 @@ def loading_page(): return rendered_template -@app.route("/marker_regression", methods=('POST',)) -def marker_regression_page(): +@app.route("/run_mapping", methods=('POST',)) +def mapping_results_page(): initial_start_vars = request.form - logger.debug("Marker regression called with initial_start_vars:", initial_start_vars.items()) + logger.debug("Mapping called with initial_start_vars:", initial_start_vars.items()) logger.info(request.url) temp_uuid = initial_start_vars['temp_uuid'] wanted = ( @@ -585,6 +640,7 @@ def marker_regression_page(): 'control_marker', 'control_marker_db', 'do_control', + 'genofile', 'genofile_string', 'pair_scan', 'startMb', @@ -606,10 +662,10 @@ def marker_regression_page(): for key, value in initial_start_vars.iteritems(): if key in wanted or key.startswith(('value:')): start_vars[key] = value - logger.debug("Marker regression called with start_vars:", start_vars) + logger.debug("Mapping called with start_vars:", start_vars) version = "v3" - key = "marker_regression:{}:".format(version) + json.dumps(start_vars, sort_keys=True) + key = "mapping_results:{}:".format(version) + json.dumps(start_vars, sort_keys=True) logger.info("key is:", pf(key)) with Bench("Loading cache"): result = None # Just for testing @@ -625,8 +681,8 @@ def marker_regression_page(): result = pickle.loads(result) else: logger.info("Cache miss!!!") - with Bench("Total time in MarkerRegression"): - template_vars = marker_regression.MarkerRegression(start_vars, temp_uuid) + with Bench("Total time in RunMapping"): + template_vars = run_mapping.RunMapping(start_vars, temp_uuid) if template_vars.mapping_method != "gemma" and template_vars.mapping_method != "plink": template_vars.js_data = json.dumps(template_vars.js_data, @@ -648,10 +704,7 @@ def marker_regression_page(): result['pair_scan_array'] = bytesarray rendered_template = render_template("pair_scan_results.html", **result) else: - #for item in template_vars.__dict__.keys(): - # logger.info(" ---**--- {}: {}".format(type(template_vars.__dict__[item]), item)) - - gn1_template_vars = marker_regression_gn1.MarkerRegression(result).__dict__ + gn1_template_vars = display_mapping_results.DisplayMappingResults(result).__dict__ #pickled_result = pickle.dumps(result, pickle.HIGHEST_PROTOCOL) #logger.info("pickled result length:", len(pickled_result)) #Redis.set(key, pickled_result) @@ -660,24 +713,7 @@ def marker_regression_page(): with Bench("Rendering template"): if (gn1_template_vars['mapping_method'] == "gemma") or (gn1_template_vars['mapping_method'] == "plink"): gn1_template_vars.pop('qtlresults', None) - print("TEMPLATE KEYS:", list(gn1_template_vars.keys())) - rendered_template = render_template("marker_regression_gn1.html", **gn1_template_vars) - - # with Bench("Rendering template"): - # if result['pair_scan'] == True: - # img_path = result['pair_scan_filename'] - # logger.info("img_path:", img_path) - # initial_start_vars = request.form - # logger.info("initial_start_vars:", initial_start_vars) - # imgfile = open(TEMPDIR + '/' + img_path, 'rb') - # imgdata = imgfile.read() - # imgB64 = imgdata.encode("base64") - # bytesarray = array.array('B', imgB64) - # result['pair_scan_array'] = bytesarray - # rendered_template = render_template("pair_scan_results.html", **result) - # else: - # rendered_template = render_template("marker_regression.html", **result) - # rendered_template = render_template("marker_regression_gn1.html", **gn1_template_vars) + rendered_template = render_template("mapping_results.html", **gn1_template_vars) return rendered_template @@ -693,7 +729,6 @@ def export_mapping_results(): return response - @app.route("/export", methods = ('POST',)) def export(): logger.info("request.form:", request.form) |