From 0ac31e861af0edfe67c1b82d086298b2d9fc9081 Mon Sep 17 00:00:00 2001 From: ericblanc20 Date: Tue, 4 Jul 2023 15:57:28 +0200 Subject: [PATCH 01/19] feat: 385 cbioportal export wrapper missing information (#411) --- .../workflows/cbioportal_export/Snakefile | 228 ++--- .../workflows/cbioportal_export/__init__.py | 888 ++++++++++++------ .../workflows/ngs_mapping/Snakefile | 47 + .../workflows/ngs_mapping/__init__.py | 107 +++ .../__init__.py | 45 +- .../cnvkit.rules | 17 + .../somatic_wgs_cnv_calling/__init__.py | 53 +- .../somatic_wgs_cnv_calling/cnvkit.rules | 16 + .../wrappers/cbioportal/case_lists/wrapper.py | 36 +- .../cbioportal/clinical_data/wrapper.py | 88 +- .../compute_signatures/environment.yaml | 9 - .../cbioportal/compute_signatures/wrapper.py | 82 -- .../cbioportal/generate_cna/environment.yaml | 14 + .../wrappers/cbioportal/generate_cna/script.R | 32 + .../cbioportal/generate_cna/wrapper.py | 62 ++ .../wrappers/cbioportal/helper_functions.R | 408 ++++++++ .../cbioportal/merge_tables/environment.yaml | 15 +- .../wrappers/cbioportal/merge_tables/script.R | 162 ++++ .../cbioportal/merge_tables/wrapper.py | 81 +- .../meta_files/meta_clinical_patient.txt | 4 +- .../meta_files/meta_clinical_sample.txt | 4 +- ...eta_CNA_gistic.txt => meta_cna_gistic.txt} | 4 +- .../{meta_CNA_log2.txt => meta_cna_log2.txt} | 4 +- .../cbioportal/meta_files/meta_expression.txt | 8 + .../meta_files/meta_expression_zscores.txt | 8 - .../meta_files/meta_mutation_extended.txt | 2 +- .../cbioportal/meta_files/meta_segment.txt | 4 +- .../cbioportal/meta_files/meta_study.txt | 7 + .../wrappers/cbioportal/meta_files/wrapper.py | 13 +- .../environment.yaml | 9 - .../plot_expression_distribution/wrapper.py | 77 -- .../rank_expression/environment.yaml | 12 - .../cbioportal/rank_expression/wrapper.py | 76 -- .../rpkm_expression/environment.yaml | 12 - .../cbioportal/rpkm_expression/scripts.R | 1 - .../cbioportal/rpkm_expression/wrapper.py | 50 - snappy_wrappers/wrappers/cbioportal/scripts.R | 496 ---------- .../cbioportal/study_meta/environment.yaml | 1 - .../wrappers/cbioportal/study_meta/wrapper.py | 28 - .../cbioportal/zscores/environment.yaml | 11 - .../wrappers/cbioportal/zscores/scripts.R | 1 - .../cbioportal/zscores/snappy-run-zscores.R | 376 -------- .../wrappers/cbioportal/zscores/wrapper.py | 57 -- .../cnvkit/postprocess/environment.yaml | 7 + .../wrappers/cnvkit/postprocess/wrapper.py | 82 ++ snappy_wrappers/wrappers/rseqc/wrapper.py | 146 ++- .../wrappers/vcf2maf/vcf_to_table/action.py | 10 + .../vcf2maf/vcf_to_table/annotation.py | 166 ++++ .../vcf2maf/vcf_to_table/common_functions.py | 119 +++ .../wrappers/vcf2maf/vcf_to_table/config.yaml | 781 +++++++++++++++ .../vcf2maf/vcf_to_table/environment.yaml | 7 + .../vcf2maf/vcf_to_table/exceptions.py | 22 + .../vcf2maf/vcf_to_table/functions.py | 161 ++++ .../wrappers/vcf2maf/vcf_to_table/parser.py | 427 +++++++++ .../vcf_to_table/protein_mutation_parser.py | 433 +++++++++ .../vcf_to_table/variant_classification.py | 125 +++ .../vcf2maf/vcf_to_table/vcf_to_table.py | 421 +++++++++ .../wrappers/vcf2maf/vcf_to_table/wrapper.py | 57 ++ .../test_workflows_cbioportal_export.py | 644 +++++++------ .../workflows/test_workflows_ngs_mapping.py | 1 + ...t_workflows_ngs_mapping_processed_fastq.py | 113 ++- ...kflows_somatic_targeted_seq_cnv_calling.py | 59 +- .../test_workflows_somatic_wgs_cnv_calling.py | 53 +- 63 files changed, 5369 insertions(+), 2120 deletions(-) delete mode 100644 snappy_wrappers/wrappers/cbioportal/compute_signatures/environment.yaml delete mode 100644 snappy_wrappers/wrappers/cbioportal/compute_signatures/wrapper.py create mode 100644 snappy_wrappers/wrappers/cbioportal/generate_cna/environment.yaml create mode 100644 snappy_wrappers/wrappers/cbioportal/generate_cna/script.R create mode 100644 snappy_wrappers/wrappers/cbioportal/generate_cna/wrapper.py create mode 100644 snappy_wrappers/wrappers/cbioportal/helper_functions.R create mode 100644 snappy_wrappers/wrappers/cbioportal/merge_tables/script.R rename snappy_wrappers/wrappers/cbioportal/meta_files/{meta_CNA_gistic.txt => meta_cna_gistic.txt} (79%) rename snappy_wrappers/wrappers/cbioportal/meta_files/{meta_CNA_log2.txt => meta_cna_log2.txt} (71%) create mode 100644 snappy_wrappers/wrappers/cbioportal/meta_files/meta_expression.txt delete mode 100644 snappy_wrappers/wrappers/cbioportal/meta_files/meta_expression_zscores.txt create mode 100644 snappy_wrappers/wrappers/cbioportal/meta_files/meta_study.txt delete mode 100644 snappy_wrappers/wrappers/cbioportal/plot_expression_distribution/environment.yaml delete mode 100644 snappy_wrappers/wrappers/cbioportal/plot_expression_distribution/wrapper.py delete mode 100644 snappy_wrappers/wrappers/cbioportal/rank_expression/environment.yaml delete mode 100644 snappy_wrappers/wrappers/cbioportal/rank_expression/wrapper.py delete mode 100644 snappy_wrappers/wrappers/cbioportal/rpkm_expression/environment.yaml delete mode 120000 snappy_wrappers/wrappers/cbioportal/rpkm_expression/scripts.R delete mode 100644 snappy_wrappers/wrappers/cbioportal/rpkm_expression/wrapper.py delete mode 100644 snappy_wrappers/wrappers/cbioportal/scripts.R delete mode 100644 snappy_wrappers/wrappers/cbioportal/study_meta/environment.yaml delete mode 100644 snappy_wrappers/wrappers/cbioportal/study_meta/wrapper.py delete mode 100644 snappy_wrappers/wrappers/cbioportal/zscores/environment.yaml delete mode 120000 snappy_wrappers/wrappers/cbioportal/zscores/scripts.R delete mode 100644 snappy_wrappers/wrappers/cbioportal/zscores/snappy-run-zscores.R delete mode 100644 snappy_wrappers/wrappers/cbioportal/zscores/wrapper.py create mode 100644 snappy_wrappers/wrappers/cnvkit/postprocess/environment.yaml create mode 100644 snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/action.py create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/annotation.py create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/common_functions.py create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/config.yaml create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/environment.yaml create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/exceptions.py create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/functions.py create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/parser.py create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/variant_classification.py create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/vcf_to_table.py create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py diff --git a/snappy_pipeline/workflows/cbioportal_export/Snakefile b/snappy_pipeline/workflows/cbioportal_export/Snakefile index 64124553d..66878c620 100644 --- a/snappy_pipeline/workflows/cbioportal_export/Snakefile +++ b/snappy_pipeline/workflows/cbioportal_export/Snakefile @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- """CUBI Pipeline cbioportal_export step Snakefile""" +import csv import os from snappy_pipeline import expand_ref @@ -28,8 +29,13 @@ exclude_flag = wf.w_config["step_config"]["cbioportal_export"]["exclude_variant_ localrules: - # Linking files from work/ to output/ should be done locally - cbioportal_export_link_out_run, + # Assembling meta files & concatenating results should be done locally + # The sub steps requiring R for merging (CNA) *CANNOT* be done locally + # Neither the expression sub-step (computation of RPKM) + cbioportal_export_meta_files, + cbioportal_export_patient_data, + cbioportal_export_case_lists, + cbioportal_export_concatenate_maf, rule all: @@ -37,63 +43,24 @@ rule all: wf.get_result_files(), -# House-Keeping ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -# Generic linking out --------------------------------------------------------- - - -rule cbioportal_export_link_out_run: - input: - wf.get_input_files("link_out", "run"), - output: - wf.get_output_files("link_out", "run"), - run: - shell(wf.get_shell_cmd("link_out", "run", wildcards)) - - # cbioportal study metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -rule cbioportal_export_study_metadata: - output: - meta_file="work/upload/meta_study.txt", - threads: wf.get_resource("cbioportal_study_meta_files", "run", "threads") - resources: - time=wf.get_resource("cbioportal_study_meta_files", "run", "time"), - memory=wf.get_resource("cbioportal_study_meta_files", "run", "memory"), - partition=wf.get_resource("cbioportal_study_meta_files", "run", "partition"), - tmpdir=wf.get_resource("cbioportal_study_meta_files", "run", "tmpdir"), - wrapper: - wf.wrapper_path("cbioportal/study_meta") - - rule cbioportal_export_meta_files: output: wf.get_output_files("cbioportal_meta_files", "run"), - threads: wf.get_resource("cbioportal_meta_files", "run", "threads") - resources: - time=wf.get_resource("cbioportal_meta_files", "run", "time"), - memory=wf.get_resource("cbioportal_meta_files", "run", "memory"), - partition=wf.get_resource("cbioportal_meta_files", "run", "partition"), - tmpdir=wf.get_resource("cbioportal_meta_files", "run", "tmpdir"), wrapper: wf.wrapper_path("cbioportal/meta_files") -# cbioportal patient and sample metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# cbioportal patient and sample data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -rule cbioportal_export_patient_metadata: +rule cbioportal_export_patient_data: output: **wf.get_output_files("cbioportal_clinical_data", "run"), - threads: wf.get_resource("cbioportal_clinical_data", "run", "threads") - resources: - time=wf.get_resource("cbioportal_clinical_data", "run", "time"), - memory=wf.get_resource("cbioportal_clinical_data", "run", "memory"), - partition=wf.get_resource("cbioportal_clinical_data", "run", "partition"), - tmpdir=wf.get_resource("cbioportal_clinical_data", "run", "tmpdir"), params: - sheet=wf.substep_dispatch("cbioportal_clinical_data", "get_sample_sheets", "run"), + **wf.get_args("cbioportal_clinical_data", "run"), wrapper: wf.wrapper_path("cbioportal/clinical_data") @@ -101,19 +68,13 @@ rule cbioportal_export_patient_metadata: rule cbioportal_export_case_lists: output: **wf.get_output_files("cbioportal_case_lists", "run"), - threads: wf.get_resource("cbioportal_case_lists", "run", "threads") - resources: - time=wf.get_resource("cbioportal_case_lists", "run", "time"), - memory=wf.get_resource("cbioportal_case_lists", "run", "memory"), - partition=wf.get_resource("cbioportal_case_lists", "run", "partition"), - tmpdir=wf.get_resource("cbioportal_case_lists", "run", "tmpdir"), params: - sheet=wf.substep_dispatch("cbioportal_clinical_data", "get_sample_sheets", "run"), + **wf.get_args("cbioportal_case_lists", "run"), wrapper: wf.wrapper_path("cbioportal/case_lists") -# cbioportal data preparation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Mutation file (data_mutation_extended.txt) ================================== # Create MAF ------------------------------------------------------------------ @@ -130,126 +91,135 @@ rule cbioportal_export_generate_mafs: partition=wf.get_resource("cbioportal_vcf2maf", "run", "partition"), tmpdir=wf.get_resource("cbioportal_vcf2maf", "run", "tmpdir"), params: - args=wf.substep_dispatch("cbioportal_vcf2maf", "get_args", "run"), + args=wf.get_args("cbioportal_vcf2maf", "run"), + log: + **wf.get_log_file("cbioportal_vcf2maf", "run"), wrapper: - wf.wrapper_path("vcf2maf/vcf2maf") + wf.wrapper_path("vcf2maf/vcf_to_table") -# Create one MAF from all MAFs +# Merge all sample MAF files -------------------------------------------------- rule cbioportal_export_concatenate_maf: - # TODO: could this be include in the `localrules`? Or simply incorporated into another step? - # It looks like some postprocessing... input: - *wf.get_input_files("cbioportal_maf", "run"), + **wf.get_input_files("cbioportal_mutations", "run"), output: - "work/upload/data_mutation_extended.txt", - threads: wf.get_resource("cbioportal_maf", "run", "threads") - resources: - time=wf.get_resource("cbioportal_maf", "run", "time"), - memory=wf.get_resource("cbioportal_maf", "run", "memory"), - partition=wf.get_resource("cbioportal_maf", "run", "partition"), - tmpdir=wf.get_resource("cbioportal_maf", "run", "tmpdir"), + wf.get_output_files("cbioportal_mutations", "run"), shell: r""" cat \ - <( head -n2 {input[0]} ) \ - <( tail -q -n +3 {input}) \ - | grep -v {exclude_flag} \ + <( head -n 1 {input[0]} ) \ + <( tail -q -n +2 {input}) \ + | (if [[ -n "{exclude_flag}" ]] ; then grep -v {exclude_flag} ; else cat ; fi) \ > {output} """ -# Create CNA gistic file ------------------------------------------------------ -rule cbioportal_export_CNA_calls: +# Copy number files (data_cna_log2.txt, data_cna_gistic.txt, data_segment.txt) + +# Create CNA files (discrete, continuous from cns files) ---------------------- + + +rule cbioportal_export_generate_cna: input: - wf.get_input_files("cbioportal_cna_data", "gistic"), + **wf.get_input_files("cbioportal_cns2cna", "run"), output: - "work/upload/data_CNA_gistic.txt", - threads: wf.get_resource("cbioportal_cna_data", "gistic", "threads") + **wf.get_output_files("cbioportal_cns2cna", "run"), + threads: wf.get_resource("cbioportal_cns2cna", "run", "threads") resources: - time=wf.get_resource("cbioportal_cna_data", "gistic", "time"), - memory=wf.get_resource("cbioportal_cna_data", "gistic", "memory"), - partition=wf.get_resource("cbioportal_cna_data", "gistic", "partition"), - tmpdir=wf.get_resource("cbioportal_cna_data", "gistic", "tmpdir"), + time=wf.get_resource("cbioportal_cns2cna", "run", "time"), + memory=wf.get_resource("cbioportal_cns2cna", "run", "memory"), + partition=wf.get_resource("cbioportal_cns2cna", "run", "partition"), + tmpdir=wf.get_resource("cbioportal_cns2cna", "run", "tmpdir"), params: - datatype="int", + **wf.get_args("cbioportal_cns2cna", "run"), + log: + **wf.get_log_file("cbioportal_cns2cna", "run"), wrapper: - wf.wrapper_path("cbioportal/merge_tables") + wf.wrapper_path("cbioportal/generate_cna") -# Create CNA log2 file -------------------------------------------------------- +# Merge sample-based CNA files to cBioPortal ---------------------------------- -rule cbioportal_export_CNA_log2: +rule cbioportal_export_concatenate_cna_log2: input: - wf.get_input_files("cbioportal_cna_data", "log2"), + **wf.get_input_files("cbioportal_cna", "log2"), output: - "work/upload/data_CNA_log2.txt", - threads: wf.get_resource("cbioportal_cna_data", "log2", "threads") - resources: - time=wf.get_resource("cbioportal_cna_data", "log2", "time"), - memory=wf.get_resource("cbioportal_cna_data", "log2", "memory"), - partition=wf.get_resource("cbioportal_cna_data", "log2", "partition"), - tmpdir=wf.get_resource("cbioportal_cna_data", "log2", "tmpdir"), + wf.get_output_files("cbioportal_cna", "log2"), params: - datatype="float", + **wf.get_args("cbioportal_cna", "log2"), + threads: wf.get_resource("cbioportal_cna", "log2", "threads") + resources: + time=wf.get_resource("cbioportal_cna", "log2", "time"), + memory=wf.get_resource("cbioportal_cna", "log2", "memory"), + partition=wf.get_resource("cbioportal_cna", "log2", "partition"), + tmpdir=wf.get_resource("cbioportal_cna", "log2", "tmpdir"), + log: + **wf.get_log_file("cbioportal_cna", "log2"), wrapper: wf.wrapper_path("cbioportal/merge_tables") -# Create CNA segmentation file ------------------------------------------------ - - -rule cbioportal_export_segments: +rule cbioportal_export_concatenate_cna_gistic: input: - wf.get_input_files("cbioportal_cna_data", "segments"), + **wf.get_input_files("cbioportal_cna", "gistic"), output: - "work/upload/data_segment.txt", - threads: wf.get_resource("cbioportal_cna_data", "segments", "threads") + wf.get_output_files("cbioportal_cna", "gistic"), + params: + **wf.get_args("cbioportal_cna", "gistic"), + threads: wf.get_resource("cbioportal_cna", "gistic", "threads") resources: - time=wf.get_resource("cbioportal_cna_data", "segments", "time"), - memory=wf.get_resource("cbioportal_cna_data", "segments", "memory"), - partition=wf.get_resource("cbioportal_cna_data", "segments", "partition"), - tmpdir=wf.get_resource("cbioportal_cna_data", "segments", "tmpdir"), - shell: - r""" - cat \ - <( head -n1 {input[0]} ) \ - <( tail -q -n +2 {input}) \ - | sed 's/-DNA.-W[EG]S.//' \ - > {output} - """ + time=wf.get_resource("cbioportal_cna", "gistic", "time"), + memory=wf.get_resource("cbioportal_cna", "gistic", "memory"), + partition=wf.get_resource("cbioportal_cna", "gistic", "partition"), + tmpdir=wf.get_resource("cbioportal_cna", "gistic", "tmpdir"), + log: + **wf.get_log_file("cbioportal_cna", "gistic"), + wrapper: + wf.wrapper_path("cbioportal/merge_tables") -# Create expression z-scores -------------------------------------------------- +# Merge sample-based segment files to cBioPortal ------------------------------ -rule cbioportal_create_dataframe_matching_results: - # TODO: could this be include in the `localrules`? +rule cbioportal_export_concatenate_segments: + input: + **wf.get_input_files("cbioportal_segment", "run"), output: - "work/zscores_mapping_df.tsv", - threads: wf.get_resource("cbioportal_zscores", "run", "threads") + wf.get_output_files("cbioportal_segment", "run"), + params: + action_type="segment", + threads: wf.get_resource("cbioportal_segment", "run", "threads") resources: - time=wf.get_resource("cbioportal_zscores", "run", "time"), - memory=wf.get_resource("cbioportal_zscores", "run", "memory"), - partition=wf.get_resource("cbioportal_zscores", "run", "partition"), - tmpdir=wf.get_resource("cbioportal_zscores", "run", "tmpdir"), - run: - wf.substep_dispatch("cbioportal_zscores", "get_df", output) + time=wf.get_resource("cbioportal_segment", "run", "time"), + memory=wf.get_resource("cbioportal_segment", "run", "memory"), + partition=wf.get_resource("cbioportal_segment", "run", "partition"), + tmpdir=wf.get_resource("cbioportal_segment", "run", "tmpdir"), + log: + **wf.get_log_file("cbioportal_segment", "run"), + wrapper: + wf.wrapper_path("cbioportal/merge_tables") + + +# Create expression RPKMs ----------------------------------------------------- -rule cbioportal_compute_zscores: +rule cbioportal_export_expression: input: - tsv="work/zscores_mapping_df.tsv", + **wf.get_input_files("cbioportal_expression", "run"), output: - tsv="work/upload/data_expression_zscores.txt", - threads: wf.get_resource("cbioportal_compute_zscores", "run", "threads") + wf.get_output_files("cbioportal_expression", "run"), + params: + **wf.get_args("cbioportal_expression", "run"), + threads: wf.get_resource("cbioportal_expression", "run", "threads") resources: - time=wf.get_resource("cbioportal_compute_zscores", "run", "time"), - memory=wf.get_resource("cbioportal_compute_zscores", "run", "memory"), - partition=wf.get_resource("cbioportal_compute_zscores", "run", "partition"), - tmpdir=wf.get_resource("cbioportal_compute_zscores", "run", "tmpdir"), + time=wf.get_resource("cbioportal_expression", "run", "time"), + memory=wf.get_resource("cbioportal_expression", "run", "memory"), + partition=wf.get_resource("cbioportal_expression", "run", "partition"), + tmpdir=wf.get_resource("cbioportal_expression", "run", "tmpdir"), + log: + **wf.get_log_file("cbioportal_expression", "run"), wrapper: - wf.wrapper_path("cbioportal/zscores") + wf.wrapper_path("cbioportal/merge_tables") diff --git a/snappy_pipeline/workflows/cbioportal_export/__init__.py b/snappy_pipeline/workflows/cbioportal_export/__init__.py index 75af96988..e42d917a1 100644 --- a/snappy_pipeline/workflows/cbioportal_export/__init__.py +++ b/snappy_pipeline/workflows/cbioportal_export/__init__.py @@ -11,196 +11,257 @@ """ from collections import OrderedDict -import csv import os import sys from biomedsheets.shortcuts import CancerCaseSheet, CancerCaseSheetOptions, is_not_background -from snakemake.io import expand from snappy_pipeline.base import MissingConfiguration from snappy_pipeline.utils import dictify, listify -from snappy_pipeline.workflows.abstract import ( - BaseStep, - BaseStepPart, - LinkOutStepPart, - ResourceUsage, -) -from snappy_pipeline.workflows.ngs_mapping import NgsMappingWorkflow +from snappy_pipeline.workflows.abstract import BaseStep, BaseStepPart, ResourceUsage # cbioportal meta data files -META_FILES = ( - "meta_clinical_patient.txt", - "meta_clinical_sample.txt", - "meta_CNA_gistic.txt", - "meta_CNA_log2.txt", - "meta_expression_zscores.txt", - "meta_mutation_extended.txt", - "meta_segment.txt", -) +META_FILES = { + "always_present": ["meta_study.txt", "meta_clinical_patient.txt", "meta_clinical_sample.txt"], + "sequenced": ["meta_mutation_extended.txt"], + "cna": ["meta_cna_gistic.txt", "meta_cna_log2.txt"], + "rna_seq_mrna": ["meta_expression.txt"], + "segment": ["meta_segment.txt"], +} # files holding clinical data -CLINICAL_DATA_FILES = ("data_clinical_patients.txt", "data_clinical_samples.txt") +CLINICAL_DATA_FILES = ["data_clinical_patients.txt", "data_clinical_samples.txt"] # files with CNA results -CNA_DATA_FILES = ("data_CNA_gistic.txt", "data_CNA_log2.txt", "data_segment.txt") +CNA_DATA_FILES = ["data_cna_gistic.txt", "data_cna_log2.txt", "data_segment.txt"] + +# case lists files +CASE_LIST_FILES = { + "sequenced": { + "filename": "all_cases_with_mutation_data.txt", + "name": "Sequenced tumors", + "description": "Tumors with somatic variant calls", + "stable_id": "sequenced", + "category": "all_cases_with_mutation_data", + }, + "cna": { + "filename": "all_cases_with_cna_data.txt", + "name": "Tumors with CNA data", + "description": "Tumors with somatic Copy Number Alteration calls", + "stable_id": "cna", + "category": "all_cases_with_cna_data", + }, + "rna_seq_mrna": { + "filename": "all_cases_with_mrna_rnaseq_data.txt", + "name": "Tumors with expression data", + "description": "Tumors with mRNA seq expression data", + "stable_id": "rna_seq_mrna", + "category": "all_cases_with_mrna_rnaseq_data", + }, + "cnaseq": { + "filename": "all_cases_with_mutation_and_cna_data.txt", + "name": "Sequenced tumors with CNA", + "description": "Tumors with somatic variant & CNA calls", + "stable_id": "cnaseq", + "category": "all_cases_with_mutation_and_cna_data", + }, + "3way_complete": { + "filename": "all_cases_with_mutation_and_cna_and_mrna_data.txt", + "name": "Sequenced tumors with CNA & expression", + "description": "Tumors with somatic variant calls, CNA calls & expression data", + "stable_id": "3way_complete", + "category": "all_cases_with_mutation_and_cna_and_mrna_data", + }, +} DEFAULT_CONFIG = r""" step_config: cbioportal_export: - # Paths to snappy steps containing results to be uploaded - path_ngs_mapping: ../ngs_mapping # REQUIRED - path_gene_expression_quantification: ../gene_expression_quantification # Set to '' in absence of mRNA_seq - path_somatic_variant_filtration: ../somatic_variant_filtration # REQUIRED - path_copy_number_step: ../somatic_targeted_seq_cnv_calling # Set to '' for panels, and change for WGS - # Select tools & filter set - cnv_tool: copywriter # Other option: cnvkit, Control_FREEC (unsupported) - tools_somatic_variant_calling: [ "mutect" ] # Possibly scalpel, mutect2, strelka2 - filter_set: dkfz_only # Possibly dkfz_and_ebfilter, dkfz_and_ebfilter_and_oxog, ... - exclude_variant_with_flag: LowFisherScore # REQUIRED - # Additional parameters - vep_data_path: REQUIRED # Variant Effect Predictor DB for vcf -> maf conversion, must match genome release - filter_vcf: REQUIRED # Common germline variants for vcf -> maf conversion, must match genome release - ncbi_build: GRCh37 + # Required for RNA expression + path_ngs_mapping: "" # When missing, no expression data is uploaded to cBioPortal + expression_tool: "star" + # Required for somatic variants + path_somatic_variant: ../somatic_variant_filtration # REQUIRED (before or after filtration) + somatic_variant_calling_tool: "mutect2" # mutect/scalpel combo unsupported + somatic_variant_annotation_tool: "vep" + filter_set: "" # Will take variants before filtration step.dkfz_only. + # For filters, use dkfz_only, dkfz_and_ebfilter, dkfz_and_ebfilter_and_oxog, ... + exon_list: "genome_wide" # Works together with filter set, see somatic_variant_filtration step + exclude_variant_with_flag: "" + # Required for Copy Number Alterations + path_copy_number: "" # When missing, no CNV data uploaded to portal. Access WES & WGS steps + copy_number_tool: cnvkit # Control_FREEC is currently unsupported, CopywriteR is not maintained + # Required for MAF &/or cBioPortal + path_gene_id_mappings: REQUIRED # Mapping from pipeline gene ids to cBioPortal ids (HGNC symbols from GeneNexus) + vcf2maf: + Center: BIH + ncbi_build: GRCh37 # Description of dataset in cBioPortal - type_of_cancer: REQUIRED # REQUIRED - cancer_study_id: REQUIRED # REQUIRED - study_description: REQUIRED # REQUIRED - study_name: REQUIRED # REQUIRED - study_name_short: REQUIRED # REQUIRED - cache_version: 100 - + study: + type_of_cancer: REQUIRED # see http://oncotree.mskcc.org/#/home + cancer_study_id: REQUIRED # Usually: __ + study_description: REQUIRED # REQUIRED + study_name: REQUIRED # REQUIRED + study_name_short: REQUIRED # REQUIRED + patient_info: [] # Unimplemented + sample_info: [] # Each entry must have a path & a step associated, see example below + # - step: tumor_mutational_burden + # path: ../tumor_mutational_burden """ +# ================================================================================================ +# +# Abstract classes: one generic, and the other for substeps dealing with a single sample at a time +# +# ================================================================================================ + + class cbioportalExportStepPart(BaseStepPart): - """Base class for gene expression quantifiers""" + """Base class for all cBioPortal export step parts + + - Builds a mapping between the tumor library id and the normal/tumor sample pair + - Provides a list of input files based on a template, and on the iteration over the sheets. + The template can be changed by derived classes. + """ #: Class available actions - actions = ("run",) + actions = None - def __init__(self, parent): - super().__init__(parent) - # Build shortcut from cancer bio sample name to matched cancer sample - self.tumor_ngs_library_to_sample_pair = OrderedDict() - for sheet in self.parent.shortcut_sheets: - self.tumor_ngs_library_to_sample_pair.update( - sheet.all_sample_pairs_by_tumor_dna_ngs_library - ) + #: Extraction type, must be instantiated in sub-class + extraction_type = None - def iterate_over_biomedsheets(self, action): - """Iterate over biomedsheet, yield input files for cbioportal CNV aggregation - or for z-score computation (only return samples with matched RNA-seq""" - copy_number_step = self.parent.sub_workflows["copy_number_step"] - cnv_tool = self.config["cnv_tool"] - if action == "get_zscores_input": - gene_expression = self.parent.sub_workflows.get("gene_expression_quantification") + #: input files template + input_tpl = None - cnv_tpl = "output/{mapper}.{tool}.{library_name}/out/{mapper}.{tool}.{library_name}_" - exp_tpl = "output/{mapper}.{tool}.{library_name}/out/{mapper}.{tool}.{library_name}.tsv" + #: Output_file name + output_file = None + def _yield_libraries(self): + test_msg = 'WARNING: multiple test samples for sample "{}", test sample "{}" is ignored' + lib_msg = 'WARNING: multiple libraries for sample "{}", library "{}" is ignored' + samples = [] for sheet in filter(is_not_background, self.parent.sheets): for donor in sheet.bio_entities.values(): for biosample in donor.bio_samples.values(): if biosample.extra_infos["isTumor"]: sample_name = biosample.name - rna_library = None - dna_library = None for test_sample in biosample.test_samples.values(): + if ( + self.extraction_type + and test_sample.extra_infos["extractionType"] + != self.extraction_type + ): + continue + if sample_name in samples: + print( + test_msg.format(sample_name, test_sample.name), file=sys.stderr + ) + continue + samples.append(sample_name) + first = True for lib in test_sample.ngs_libraries.values(): - # pick one rna and one dna library - - # even if there is more than one lib, cbioportal cannot use it - if lib.extra_infos["libraryType"] == "mRNA_seq": - rna_library = lib.name - elif lib.extra_infos["libraryType"] == "WES": - dna_library = lib.name - elif lib.extra_infos["libraryType"] == "WGS": - dna_library = lib.name - - # for each tumor sample, format file for DNA and optionally RNA - cnv_file = cnv_tpl.format( - tool=cnv_tool, mapper="bwa", library_name=dna_library - ) - exp_file = None - if rna_library: - exp_file = exp_tpl.format( - tool="featurecounts", mapper="star", library_name=rna_library - ) - - # CNVs - if action == "gistic": - yield copy_number_step(cnv_file + "gene_call.txt") - - elif action == "log2": - yield copy_number_step(cnv_file + "gene_log2.txt") - - elif action == "segments": - yield copy_number_step(cnv_file + "segments.txt") - - # Z scores - elif action == "get_zscores_input" and dna_library and rna_library: - cnv_file_ = copy_number_step(cnv_file + "gene_call.txt") - exp_file_ = gene_expression(exp_file) - yield sample_name, cnv_file_, exp_file_ - - -class CbioportalStudyMetaFilesStepPart(cbioportalExportStepPart): - """Generate cbioportal study meta data files""" - - #: Step name - name = "cbioportal_study_meta_files" + # pick only one library + if not first: + print(lib_msg.format(sample_name, lib.name), file=sys.stderr) + break + yield lib + first = False + @dictify + def get_input_files(self, action): + """Return path of input files for merging""" + # Validate action + self._validate_action(action) + assert self.input_tpl is not None + for lib in self._yield_libraries(): + yield lib.test_sample.bio_sample.name, self.input_tpl.format(library_name=lib.name) -class cbioportalMetaFilesStepPart(cbioportalExportStepPart): - """Generate cbioportal meta data files""" - - #: Step name - name = "cbioportal_meta_files" - - @listify def get_output_files(self, action): # Validate action self._validate_action(action) - yield from [os.path.join("work/upload", f) for f in META_FILES] - - -class cbioportalClinicalDataStepPart(cbioportalExportStepPart): - """Generate cbioportal patient data file""" - - #: Step name - name = "cbioportal_clinical_data" + assert self.output_file is not None + return self.output_file - @dictify - def get_output_files(self, action): + def get_log_file(self, action): + """Return path to log files for all data files""" # Validate action self._validate_action(action) - yield "patients_tsv", os.path.join("work/upload", "data_clinical_patients.txt") - yield "samples_tsv", os.path.join("work/upload", "data_clinical_samples.txt") - def get_sample_sheets(self, action): - sheets = self.parent.sheets - return [sheet for sheet in sheets] + tpl = "work/log/{name}{ext}" + key_ext = ( + ("log", ".log"), + ("conda_info", ".conda_info.txt"), + ("conda_list", ".conda_list.txt"), + ) + log_files = {} + for key, ext in key_ext: + log_files[key] = tpl.format(name=self.name, ext=ext) + log_files[key + "_md5"] = log_files[key] + ".md5" + return log_files -class cbioportalCaseListsStepPart(cbioportalExportStepPart): - """Generate cbioportal patient data file""" +class cbioportalVcf2MafStepPart(BaseStepPart): + """Helper class for VCF2MAF step""" #: Step name - name = "cbioportal_case_lists" + name = "cbioportal_vcf2maf" + + #: Actions + actions = ("run",) + + def __init__(self, parent): + super().__init__(parent) + self.name_pattern = None + if self.config["filter_set"]: + self.name_pattern = ( + "{mapper}.{caller}.{annotator}." + "dkfz_bias_filter.eb_filter.{tumor_library}." + "{filter_set}.{exon_list}" + ) + else: + self.name_pattern = "{mapper}.{caller}.{annotator}.{tumor_library}" + # Build shortcut from cancer bio sample name to matched cancer sample + self.tumor_ngs_library_to_sample_pair = OrderedDict() + for sheet in self.parent.shortcut_sheets: + self.tumor_ngs_library_to_sample_pair.update( + sheet.all_sample_pairs_by_tumor_dna_ngs_library + ) @dictify def get_output_files(self, action): + """Return maf output file""" # Validate action self._validate_action(action) - yield "sequenced", "work/upload/case_lists/all_cases_with_mutation_data.txt" + yield "maf", os.path.join("work/maf", self.name_pattern, "out", self.name_pattern + ".maf") + @dictify + def get_input_files(self, action): + """Return input vcf for each output maf""" + # Validate action + self._validate_action(action) + somatic_variant = self.parent.sub_workflows["somatic_variant"] + tpl = somatic_variant( + os.path.join("output", self.name_pattern, "out", self.name_pattern + ".vcf.gz") + ) + yield "vcf", tpl -class cbioportalVcf2MafStepPart(cbioportalExportStepPart): - """Helper class for VCF2MAF step""" + @dictify + def get_log_file(self, action): + """Return path to log files for all data files""" + # Validate action + self._validate_action(action) - #: Step name - name = "cbioportal_vcf2maf" + tpl = os.path.join("work/maf/", self.name_pattern, "log", self.name_pattern) + key_ext = ( + ("log", ".log"), + ("conda_info", ".conda_info.txt"), + ("conda_list", ".conda_list.txt"), + ) + for key, ext in key_ext: + yield key, tpl + ext + yield key + "_md5", tpl + ext + ".md5" def get_args(self, action): # Validate action @@ -209,53 +270,134 @@ def get_args(self, action): def args_function(wildcards): result = { "tumor_sample": wildcards.tumor_library, - "normal_sample": self.get_normal_lib_name(wildcards), - "tumor_id": self.get_tumor_bio_sample(wildcards), - "normal_id": self.get_normal_bio_sample(wildcards), + "normal_sample": self._get_normal_lib_name(wildcards), + "tumor_id": self._get_tumor_bio_sample(wildcards), + "normal_id": self._get_normal_bio_sample(wildcards), } return result return args_function - def get_normal_lib_name(self, wildcards): + def _get_normal_lib_name(self, wildcards): """Return name of normal (non-cancer) library""" pair = self.tumor_ngs_library_to_sample_pair[wildcards.tumor_library] return pair.normal_sample.dna_ngs_library.name - def get_tumor_bio_sample(self, wildcards): + def _get_tumor_bio_sample(self, wildcards): """Return bio sample to tumor dna ngs library""" - return "-".join(wildcards.tumor_library.split("-")[0:2]) + pair = self.tumor_ngs_library_to_sample_pair[wildcards.tumor_library] + return pair.tumor_sample.dna_ngs_library.test_sample.bio_sample.name - def get_normal_bio_sample(self, wildcards): + def _get_normal_bio_sample(self, wildcards): """Return normal bio sample to tumor dna ngs library""" - normal_lib = self.get_normal_lib_name(wildcards) - return "-".join(normal_lib.split("-")[0:2]) + pair = self.tumor_ngs_library_to_sample_pair[wildcards.tumor_library] + return pair.normal_sample.dna_ngs_library.test_sample.bio_sample.name + + def get_resource_usage(self, action): + """Get Resource Usage + + :param action: Action (i.e., step) in the workflow, example: 'run'. + :type action: str + + :return: Returns ResourceUsage for step. + """ + # Validate action + self._validate_action(action) + return ResourceUsage( + threads=2, + time="02:00:00", # 2 hours + memory="5120M", + ) + + +class cbioportalMutationsStepPart(cbioportalExportStepPart): + """Merges sample MAF files into data_mutation_extended.txt""" + + #: Step name + name = "cbioportal_mutations" + + #: Extraction type, must be instantiated in sub-class + extraction_type = "DNA" + + #: Actions + actions = ("run",) + + #: Output file name + output_file = "work/upload/data_mutation_extended.txt" + + def __init__(self, parent): + super().__init__(parent) + if self.config["filter_set"]: + name_pattern = ( + "{mapper}.{caller}.{annotator}." + "dkfz_bias_filter.eb_filter.{{library_name}}." + "{filter_set}.{exon_list}" + ) + else: + name_pattern = "{mapper}.{caller}.{annotator}.{{library_name}}" + tpl = os.path.join("work/maf", name_pattern, "out", name_pattern + "{ext}") + self.input_tpl = tpl.format( + mapper="bwa", + caller=self.config["somatic_variant_calling_tool"], + annotator=self.config["somatic_variant_annotation_tool"], + filter_set=self.config["filter_set"], + exon_list=self.config["exon_list"], + ext=".maf", + ) + + +class cbioportalCns2CnaStepPart(BaseStepPart): + """Helper class to extract gene-based log2 & copy number call from a cns file""" + + #: Step name + name = "cbioportal_cns2cna" + + #: Actions + actions = ("run",) + + @dictify + def get_input_files(self, action): + """Return the library""" + # Validate action + self._validate_action(action) + name_pattern = "{mapper}.{caller}.{tumor_library}" + yield "cns", os.path.join( + self.config["path_copy_number"], "output", name_pattern, "out", name_pattern + ".cns" + ) @dictify def get_output_files(self, action): """Return maf output file""" # Validate action self._validate_action(action) - name_pattern = ( - "{mapper}.{caller}.jannovar_annotate_somatic_vcf." - "dkfz_bias_filter.eb_filter.{tumor_library}." - "{filter_set}.{exon_list}" - ) - yield "maf", os.path.join("work/maf", name_pattern, "out", name_pattern + ".maf") + name_pattern = "{mapper}.{caller}.{tumor_library}" + yield "cna", os.path.join("work/cna", name_pattern, "out", name_pattern + ".cna") @dictify - def get_input_files(self, action): - """Return input vcf for each output maf""" + def get_log_file(self, action): + """Return path to log files for all data files""" # Validate action self._validate_action(action) - name_pattern = ( - "{mapper}.{caller}.jannovar_annotate_somatic_vcf." - "dkfz_bias_filter.eb_filter.{tumor_library}." - "{filter_set}.{exon_list}" + name_pattern = "{mapper}.{caller}.{tumor_library}" + tpl = os.path.join("work/cna/", name_pattern, "log", name_pattern) + key_ext = ( + ("log", ".log"), + ("conda_info", ".conda_info.txt"), + ("conda_list", ".conda_list.txt"), ) - tpl = (os.path.join("output", name_pattern, "out", name_pattern + ".vcf.gz"),) - somatic_variant_filtration = self.parent.sub_workflows["somatic_variant_filtration"] - yield "vcf", somatic_variant_filtration(tpl) + for key, ext in key_ext: + yield key, tpl + ext + yield key + "_md5", tpl + ext + ".md5" + + def get_args(self, action): + # Validate action + self._validate_action(action) + return { + "features": self.parent.w_config["step_config"]["ngs_mapping"][ + self.config["expression_tool"] + ]["path_features"], + "pipeline_id": "ENSEMBL", + } def get_resource_usage(self, action): """Get Resource Usage @@ -268,77 +410,141 @@ def get_resource_usage(self, action): # Validate action self._validate_action(action) return ResourceUsage( - threads=4, - time="12:00:00", # 12 hours - memory="5120M", + threads=2, + time="02:00:00", # 2 hours + memory="8192M", ) -class cbioportalMafStepPart(cbioportalExportStepPart): - """Helper class to get all required maf files for cbioportal.""" +class cbioportalCnaFilesStepPart(cbioportalExportStepPart): + """Generate cbioportal continuous (log2), discrete (pseudo-gistic) & segment tables""" #: Step name - name = "cbioportal_maf" + name = "cbioportal_cna" - @listify - def get_input_files(self, action): - """Return list of all input files""" + #: Extraction type, must be instantiated in sub-class + extraction_type = "DNA" + + #: Actions + actions = ("log2", "gistic") + + def __init__(self, parent): + super().__init__(parent) + name_pattern = "bwa." + self.config["copy_number_tool"] + ".{library_name}" + self.input_tpl = os.path.join("work/cna", name_pattern, "out", name_pattern + ".cna") + + def get_args(self, action): + # Validate action + self._validate_action(action) + if action == "gistic": + return {"action_type": "gistic", "extra_args": {"pipeline_id": "ENSEMBL"}} + if action == "log2": + return { + "action_type": "log2", + "extra_args": { + "pipeline_id": "ENSEMBL", + "amplification": "9", + }, # Amplification: cn >= 9 (https://doi.org/10.1038/s41586-022-04738-6) + } + + def get_output_files(self, action): + # Validate action + self._validate_action(action) + return "work/upload/data_cna_{action}.txt".format(action=action) + + def get_resource_usage(self, action): + """Get Resource Usage + + :param action: Action (i.e., step) in the workflow, example: 'run'. + :type action: str + + :return: Returns ResourceUsage for step. + """ # Validate action self._validate_action(action) - name_pattern = ( - "{mapper}.{caller}.jannovar_annotate_somatic_vcf." - "dkfz_bias_filter.eb_filter.{tumor_library}." - "{filter_set}.{exon_list}" + return ResourceUsage( + threads=2, + time="02:00:00", # 2 hours + memory="8192M", ) - filter_sets = self.config["filter_set"] - exon_lists = ["genome_wide"] - callers = set(self.config["tools_somatic_variant_calling"]) - yield from self._yield_result_files_matched( - os.path.join("work/maf", name_pattern, "out", name_pattern + "{ext}"), - mapper="bwa", - caller=callers, - filter_set=filter_sets, - exon_list=exon_lists, - ext=".maf", + + +class cbioportalSegmentStepPart(cbioportalExportStepPart): + + #: Step name + name = "cbioportal_segment" + + #: Extraction type, must be instantiated in sub-class + extraction_type = "DNA" + + #: Actions + actions = ("run",) + + #: Output file name + output_file = "work/upload/data_segment.txt" + + def __init__(self, parent): + super().__init__(parent) + name_pattern = "bwa." + self.config["copy_number_tool"] + ".{library_name}" + self.input_tpl = os.path.join( + self.config["path_copy_number"], "output", name_pattern, "out", name_pattern + ".cns" ) - def _yield_result_files_matched(self, tpl, **kwargs): - """Build output paths from path template and extension list. + def get_resource_usage(self, action): + """Get Resource Usage + + :param action: Action (i.e., step) in the workflow, example: 'run'. + :type action: str - This function returns the results from the matched somatic variant callers such as - Mutect. + :return: Returns ResourceUsage for step. """ - for sheet in filter(is_not_background, self.parent.shortcut_sheets): - for sample_pair in sheet.all_sample_pairs: - if ( - not sample_pair.tumor_sample.dna_ngs_library - or not sample_pair.normal_sample.dna_ngs_library - ): - msg = ( - "INFO: sample pair for cancer bio sample {} has is missing primary" - "normal or primary cancer NGS library" - ) - print(msg.format(sample_pair.tumor_sample.name), file=sys.stderr) - continue - yield from expand( - tpl, tumor_library=[sample_pair.tumor_sample.dna_ngs_library.name], **kwargs - ) + # Validate action + self._validate_action(action) + return ResourceUsage( + threads=2, + time="02:00:00", # 2 hours + memory="8192M", + ) -class cbioportalCnaFilesStepPart(cbioportalExportStepPart): - """Generate cbioportal cna data files""" +class cbioportalExpressionStepPart(cbioportalExportStepPart): + """Generates the expression table (z-scores or FPKM)""" #: Step name - name = "cbioportal_cna_data" + name = "cbioportal_expression" - #: Class available actions - actions = ("log2", "gistic", "segments") + #: Extraction type, must be instantiated in sub-class + extraction_type = "RNA" - @listify - def get_input_files(self, action): + #: Action + actions = ("run",) + + #: Output file name + output_file = "work/upload/data_expression.txt" + + def __init__(self, parent): + super().__init__(parent) + name_pattern = self.config["expression_tool"] + ".{library_name}" + self.input_tpl = os.path.join( + self.config["path_ngs_mapping"], + "output", + name_pattern, + "out", + name_pattern + ".GeneCounts.tab", + ) + + def get_args(self, action): # Validate action self._validate_action(action) - yield from self.iterate_over_biomedsheets(action) + return { + "action_type": "expression", + "extra_args": { + "pipeline_id": "ENSEMBL", + "tx_obj": self.parent.w_config["step_config"]["ngs_mapping"][ + self.config["expression_tool"] + ]["path_features"], + }, + } def get_resource_usage(self, action): """Get Resource Usage @@ -352,37 +558,147 @@ def get_resource_usage(self, action): self._validate_action(action) return ResourceUsage( threads=2, - time="01:00:00", # 1 hour - memory="8G", + time="02:00:00", # 2 hours + memory="8192M", ) -class cbioportalZscoresStepPart(cbioportalExportStepPart): - """Generate a dataframe holding each biosample and the location of the CNV - calling results and the expression quantification files""" +class cbioportalMetaFilesStepPart(BaseStepPart): + """Generate cbioportal meta data files""" #: Step name - name = "cbioportal_zscores" + name = "cbioportal_meta_files" - def get_input_files(self, action): - assert action == "get_zscores_input" - yield from self.iterate_over_biomedsheets(action) - - def get_df(self, output): - with open(output[0], "w") as f: - writer = csv.writer(f, delimiter="\t") - writer.writerow(["ID", "gene_call_filename", "count_filename"]) - for sample_name, cnv_file, exp_file in self.iterate_over_biomedsheets( - "get_zscores_input" + #: Actions + actions = ("run",) + + def get_output_files(self, action): + # Validate action + self._validate_action(action) + yield from [os.path.join("work/upload", f) for f in META_FILES["always_present"]] + if self.config["path_somatic_variant"]: + yield from [os.path.join("work/upload", f) for f in META_FILES["sequenced"]] + if self.config["path_copy_number"]: + yield from [os.path.join("work/upload", f) for f in META_FILES["cna"]] + if self.config["study"]["reference_genome"] == "hg19": + yield from [os.path.join("work/upload", f) for f in META_FILES["segment"]] + if self.config["path_ngs_mapping"]: + yield from [os.path.join("work/upload", f) for f in META_FILES["rna_seq_mrna"]] + + +class cbioportalClinicalDataStepPart(cbioportalExportStepPart): + """Generate cbioportal patient data file""" + + #: Step name + name = "cbioportal_clinical_data" + + #: Actions + actions = ("run",) + + def get_args(self, action): + # Validate action + self._validate_action(action) + donors = {} + for extraction_type in ("DNA", "RNA"): + if ( + extraction_type == "DNA" + and self.config["path_somatic_variant"] == "" + and self.config["path_copy_number"] == "" ): - writer.writerow([sample_name, cnv_file, exp_file]) + continue + if extraction_type == "RNA" and self.config["path_ngs_mapping"] == "": + continue + self.extraction_type = extraction_type + for lib in self._yield_libraries(): + assert lib.test_sample.extra_infos["extractionType"] == extraction_type + donor_name = lib.test_sample.bio_sample.bio_entity.name + sample_name = lib.test_sample.bio_sample.name + if donor_name not in donors: + donors[donor_name] = {} + if sample_name not in donors[donor_name]: + donors[donor_name][sample_name] = {} + # Multiple libraries should not be returned by _yield_libraries + assert extraction_type not in donors[donor_name][sample_name] + donors[donor_name][sample_name][extraction_type] = lib.name + return donors + @dictify + def get_output_files(self, action): + # Validate action + self._validate_action(action) + for data_type in ("patient", "sample"): + yield data_type, "work/upload/data_clinical_{data_type}.txt".format(data_type=data_type) -class CbioportalComputeZscoresStepPart(cbioportalExportStepPart): - """Compute Z-Scores""" + +class cbioportalCaseListsStepPart(cbioportalExportStepPart): + """Generate cbioportal patient data file""" #: Step name - name = "cbioportal_compute_zscores" + name = "cbioportal_case_lists" + + #: Actions + actions = ("run",) + + def get_args(self, action): + # Validate action + self._validate_action(action) + samples = dict(zip(CASE_LIST_FILES.keys(), [[] for _ in range(len(CASE_LIST_FILES))])) + self.extraction_type = "DNA" + for lib in self._yield_libraries(): + sample_name = lib.test_sample.bio_sample.name + if self.config["path_somatic_variant"]: + samples["sequenced"] += [sample_name] + if self.config["path_copy_number"]: + samples["cna"] += [sample_name] + if self.config["path_somatic_variant"] and self.config["path_copy_number"]: + samples["cnaseq"] += [sample_name] + if self.config["path_ngs_mapping"]: + self.extraction_type = "RNA" + for lib in self._yield_libraries(): + sample_name = lib.test_sample.bio_sample.name + samples["rna_seq_mrna"] += [sample_name] + args = {} + for k, v in samples.items(): + if len(v) > 0: + args[k] = CASE_LIST_FILES[k] + args[k]["samples"] = v + if ( + self.config["path_somatic_variant"] + and self.config["path_copy_number"] + and self.config["path_ngs_mapping"] + ): + args["3way_complete"] = CASE_LIST_FILES["3way_complete"] + args["3way_complete"]["samples"] = [] + for sample_name in args["cnaseq"]["samples"]: + if sample_name in args["rna_seq_mrna"]["samples"]: + args["3way_complete"]["samples"] += [sample_name] + return args + + @dictify + def get_output_files(self, action): + # Validate action + self._validate_action(action) + case_lists = {} + if self.config["path_somatic_variant"]: + case_lists["sequenced"] = CASE_LIST_FILES["sequenced"]["filename"] + if self.config["path_copy_number"]: + case_lists["cna"] = CASE_LIST_FILES["cna"]["filename"] + if self.config["path_ngs_mapping"]: + case_lists["rna_seq_mrna"] = CASE_LIST_FILES["rna_seq_mrna"]["filename"] + if self.config["path_somatic_variant"]: + if self.config["path_copy_number"]: + case_lists["cnaseq"] = CASE_LIST_FILES["cnaseq"]["filename"] + if self.config["path_ngs_mapping"]: + case_lists["3way_complete"] = CASE_LIST_FILES["3way_complete"]["filename"] + for case, filename in case_lists.items(): + yield case, os.path.join("work/upload/case_lists", filename) + + +# ================================================================================================ +# +# cBioPortal step class +# +# ================================================================================================ class cbioportalExportWorkflow(BaseStep): @@ -410,69 +726,109 @@ def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir) config_lookup_paths, config_paths, workdir, - (NgsMappingWorkflow,), ) + + # cBioPortal requires the genome release as GRC[hm]3[78] in the MAF file + # and hg19 or hg38 in the meta study & meta segment files. + # Note that segmentation visualisation is not yet implemented for hg38 (2023-06-21) + # For the user's convenience, the configuration is augmented automatically, + # before the sub steps are registered, so they all have the updated config. + translated = "unknown" + if self.config["vcf2maf"]["ncbi_build"] == "GRCh37": + translated = "hg19" + if self.config["vcf2maf"]["ncbi_build"] == "GRCh38": + translated = "hg38" + if self.config["vcf2maf"]["ncbi_build"] in ("mm9", "mm10", "GRCm37", "GRCm38", "GRCm39"): + translated = "mouse" + self.config["study"]["reference_genome"] = translated + # Register sub step classes so the sub steps are available self.register_sub_step_classes( ( - CbioportalStudyMetaFilesStepPart, cbioportalMetaFilesStepPart, cbioportalCaseListsStepPart, cbioportalClinicalDataStepPart, + cbioportalCns2CnaStepPart, cbioportalCnaFilesStepPart, - cbioportalMafStepPart, + cbioportalSegmentStepPart, + cbioportalMutationsStepPart, cbioportalVcf2MafStepPart, - cbioportalZscoresStepPart, - CbioportalComputeZscoresStepPart, - LinkOutStepPart, + cbioportalExpressionStepPart, ) ) # Initialize sub-workflows - if self.config["path_somatic_variant_filtration"]: - self.register_sub_workflow( - "somatic_variant_filtration", self.config["path_somatic_variant_filtration"] - ) - if self.config["path_gene_expression_quantification"]: - self.register_sub_workflow( - "gene_expression_quantification", self.config["path_gene_expression_quantification"] - ) - if self.config["path_copy_number_step"]: - if self.config["cnv_tool"] in ["cnvetti_on_target_postprocess", "copywriter"]: + if self.config["path_somatic_variant"]: + if self.config["filter_set"]: + self.register_sub_workflow( + "somatic_variant_filtration", + self.config["path_somatic_variant"], + sub_workflow_name="somatic_variant", + ) + else: + self.register_sub_workflow( + "somatic_variant_annotation", + self.config["path_somatic_variant"], + sub_workflow_name="somatic_variant", + ) + if self.config["path_copy_number"]: + if self.config["copy_number_tool"] in [ + "cnvetti_on_target_postprocess", + "copywriter", + "cnvkit", + ]: self.register_sub_workflow( "somatic_targeted_seq_cnv_calling", - workdir=self.config["path_copy_number_step"], + workdir=self.config["path_copy_number"], sub_workflow_name="copy_number_step", ) else: self.register_sub_workflow( "somatic_wgs_cnv_calling", - workdir=self.config["path_copy_number_step"], + workdir=self.config["path_copy_number"], sub_workflow_name="copy_number_step", ) - - if not self.config.get("tools_somatic_variant_calling", ""): - self.config["tools_somatic_variant_calling"] = self.w_config["step_config"][ - "somatic_variant_calling" - ]["tools"] + if self.config["path_ngs_mapping"]: + self.register_sub_workflow( + "ngs_mapping", + workdir=self.config["path_ngs_mapping"], + sub_workflow_name="ngs_mapping", + ) @listify def get_result_files(self): - result_files = ("meta_study.txt",) + META_FILES + CLINICAL_DATA_FILES - if self.config["path_somatic_variant_filtration"]: - result_files += ("data_mutation_extended.txt",) - result_files += ("case_lists/all_cases_with_mutation_data.txt",) - if self.config["path_copy_number_step"]: - result_files += CNA_DATA_FILES - if self.config["path_gene_expression_quantification"]: - result_files += ("data_expression_zscores.txt",) - - yield from [os.path.join("work/upload", f) for f in result_files] + yield from self.sub_steps["cbioportal_meta_files"].get_output_files("run") + yield from self.sub_steps["cbioportal_clinical_data"].get_output_files("run").values() + yield from self.sub_steps["cbioportal_case_lists"].get_output_files("run").values() + + result_files = [] + if self.config["path_somatic_variant"]: + result_files += [self.sub_steps["cbioportal_mutations"].get_output_files("run")] + if self.config["path_copy_number"]: + result_files += [self.sub_steps["cbioportal_cna"].get_output_files("log2")] + result_files += [self.sub_steps["cbioportal_cna"].get_output_files("gistic")] + if self.config["study"]["reference_genome"] == "hg19": + result_files += [self.sub_steps["cbioportal_segment"].get_output_files("run")] + if self.config["path_ngs_mapping"]: + result_files += [self.sub_steps["cbioportal_expression"].get_output_files("run")] + + yield from result_files def check_config(self): """Check config attributes for presence""" - if self.config["cnv_tool"] not in [ - "cnvetti_on_target_postprocess", - "copywriter", - "control_freec", - ]: - raise MissingConfiguration(msg="Please select a supported tool for the CNV calls") + msg = [] + if self.config["path_somatic_variant"] and ( + not self.config["somatic_variant_calling_tool"] + or not self.config["somatic_variant_annotation_tool"] + ): + msg += [ + "Somatic variant calling tool and somatic variant annotation tool must be defined" + ] + if self.config["path_copy_number"] and not self.config["copy_number_tool"]: + msg += [ + "Somatic copy number calling tool must be defined when CNV results are available" + ] + if self.config["path_ngs_mapping"] and not self.config["expression_tool"]: + msg += ["Gene count tools must be defined when RNA expression is available"] + if len(msg) > 0: + raise MissingConfiguration() # (msg="Please select a supported tool for the CNV calls") + return 0 diff --git a/snappy_pipeline/workflows/ngs_mapping/Snakefile b/snappy_pipeline/workflows/ngs_mapping/Snakefile index edf6252b2..8e9bedb9e 100644 --- a/snappy_pipeline/workflows/ngs_mapping/Snakefile +++ b/snappy_pipeline/workflows/ngs_mapping/Snakefile @@ -242,3 +242,50 @@ rule ngs_mapping_ngs_chew_fingerprint: **wf.get_log_file("ngs_chew", "fingerprint"), wrapper: wf.wrapper_path("ngs_chew/fingerprint") + + +# Compute protocol strandedness for STAR -------------------------------------- + + +rule ngs_mapping_infer_strandedness: + input: + **wf.get_input_files("strandedness", "infer"), + output: + **wf.get_output_files("strandedness", "infer"), + threads: wf.get_resource("strandedness", "infer", "threads") + resources: + time=wf.get_resource("strandedness", "infer", "time"), + memory=wf.get_resource("strandedness", "infer", "memory"), + partition=wf.get_resource("strandedness", "infer", "partition"), + tmpdir=wf.get_resource("strandedness", "infer", "tmpdir"), + log: + **wf.get_log_file("strandedness", "infer"), + wrapper: + wf.wrapper_path("rseqc") + + +# Gene counts from mapper & strandedness -------------------------------------- + + +rule ngs_mapping_counts_with_strand: + input: + **wf.get_input_files("strandedness", "counts"), + output: + **wf.get_output_files("strandedness", "counts"), + shell: + r""" + set -x + if [[ "{wildcards[mapper]}" == "star" ]] + then + strand=$(grep -E '^ *"decision": "[012]"$' {input.decision} | sed -re 's/.*"([012])"$/\1/') + column=$(($strand + 2)) + cut -f 1,$column {input.counts} > {output.counts} + else + ln -sr {input.counts} {output.counts} + fi + pushd $(dirname {output.counts}) + md5sum $(basename {output.counts}) > $(basename {output.counts_md5}) + popd + ln -sr {output.counts} {output.output} + ln -sr {output.counts_md5} {output.output_md5} + """ diff --git a/snappy_pipeline/workflows/ngs_mapping/__init__.py b/snappy_pipeline/workflows/ngs_mapping/__init__.py index 41076f46e..6e40acacb 100644 --- a/snappy_pipeline/workflows/ngs_mapping/__init__.py +++ b/snappy_pipeline/workflows/ngs_mapping/__init__.py @@ -410,6 +410,10 @@ trim_adapters: false mask_duplicates: false include_unmapped: true + strandedness: + path_exon_bed: REQUIRED # Location of usually highly expressed genes. Known protein coding genes is a good choice + strand: -1 # -1: unknown value, use infer_, 0: unstranded, 1: forward, 2: reverse (from featurecounts) + threshold: 0.85 # Minimum proportion of reads mapped to forward/reverse direction to call the protocol # Configuration for Minimap2 minimap2: mapping_threads: 16 @@ -809,6 +813,23 @@ def _get_output_files_run_work(self): output_files["transcriptome_md5"] = output_files["transcriptome"] + ".md5" return output_files + @dictify + def get_output_files(self, action): + """Skip link to the gene counts file to delegate it to strandedness""" + assert action in self.actions + for key, paths in super().get_output_files(action).items(): + if key != "output_links": + yield key, paths + continue + yield key, list( + filter( + lambda x: not ( + x.endswith(".GeneCounts.tab") or x.endswith(".GeneCounts.tab.md5") + ), + paths, + ) + ) + def get_resource_usage(self, action): """Get Resource Usage @@ -831,6 +852,91 @@ def get_resource_usage(self, action): ) +class StrandednessStepPart(BaseStepPart): + """Guess the protocol strandedness when missing and write it""" + + #: Step name + name = "strandedness" + + #: Class available actions + actions = ("infer", "counts") + + def get_input_files(self, action): + self._validate_action(action) + if action == "infer": + return { + "bam": "work/{mapper}.{library_name}/out/{mapper}.{library_name}.bam", + } + elif action == "counts": + return { + "counts": "work/{mapper}.{library_name}/out/{mapper}.{library_name}.GeneCounts.tab", + "decision": "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.decision.json", + } + + @dictify + def get_output_files(self, action): + self._validate_action(action) + if action == "infer": + for key, ext in (("tsv", ".infer.txt"), ("decision", ".decision.json")): + yield key, "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}" + ext + yield key + "_md5", "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}" + ext + ".md5" + key, ext = ("output", ".decision.json") + yield key, "output/{mapper}.{library_name}/strandedness/{mapper}.{library_name}" + ext + yield key + "_md5", "output/{mapper}.{library_name}/strandedness/{mapper}.{library_name}" + ext + ".md5" + for key, ext in ( + ("log", ".log"), + ("conda_list", ".conda_list.txt"), + ("conda_info", ".conda_info.txt"), + ): + yield key, "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness" + ext + yield key + "_md5", "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness" + ext + ".md5" + elif action == "counts": + key, ext = ("counts", ".GeneCounts.tab") + yield key, "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}" + ext + yield key + "_md5", "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}" + ext + ".md5" + key, ext = ("output", ".GeneCounts.tab") + yield key, "output/{mapper}.{library_name}/out/{mapper}.{library_name}" + ext + yield key + "_md5", "output/{mapper}.{library_name}/out/{mapper}.{library_name}" + ext + ".md5" + + def get_result_files(self): + for mapper in self.config["tools"]["rna"]: + if self.config[mapper]["path_features"]: + tpl_out = ( + "output/{mapper}.{library_name}/out/{mapper}.{library_name}.GeneCounts.tab" + ) + tpl_strandedness = "output/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.decision.json" + tpl_log = ( + "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.{ext}" + ) + for library_name, extra_info in self.parent.ngs_library_to_extra_infos.items(): + if extra_info["extractionType"] == "RNA": + yield tpl_out.format(mapper=mapper, library_name=library_name) + yield tpl_out.format(mapper=mapper, library_name=library_name) + ".md5" + yield tpl_strandedness.format(mapper=mapper, library_name=library_name) + yield tpl_strandedness.format( + mapper=mapper, library_name=library_name + ) + ".md5" + for ext in ("log", "conda_info.txt", "conda_list.txt"): + yield tpl_log.format(mapper=mapper, library_name=library_name, ext=ext) + yield tpl_log.format( + mapper=mapper, library_name=library_name, ext=ext + ) + ".md5" + + @dictify + def get_log_file(self, action): + """Return dict of log files in the "log" directory.""" + _ = action + prefix = "work/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness" + key_ext = ( + ("log", ".log"), + ("conda_info", ".conda_info.txt"), + ("conda_list", ".conda_list.txt"), + ) + for key, ext in key_ext: + yield key, prefix + ext + yield key + "_md5", prefix + ext + ".md5" + + class Minimap2StepPart(ReadMappingStepPart): """Support for performing long-read alignment using minimap2""" @@ -1260,6 +1366,7 @@ def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir) LinkInStep, Minimap2StepPart, StarStepPart, + StrandednessStepPart, TargetCoverageReportStepPart, BamCollectDocStepPart, NgsChewStepPart, diff --git a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py index 4e017c21f..ddea1c5f7 100644 --- a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py +++ b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py @@ -101,7 +101,7 @@ import os.path import sys -from biomedsheets.shortcuts import CancerCaseSheet, is_not_background +from biomedsheets.shortcuts import CancerCaseSheet, CancerCaseSheetOptions, is_not_background from snakemake.io import expand from snappy_pipeline.utils import dictify, listify @@ -126,6 +126,7 @@ path_target: REQUIRED # Usually ../panel_of_normals/output/cnvkit.target/out/cnvkit.target.bed path_antitarget: REQUIRED # Usually ../panel_of_normals/output/cnvkit.antitarget/out/cnvkit.antitarget.bed path_panel_of_normals: REQUIRED # Usually ../panel_of_normals/output/{mapper}.cnvkit.create_panel/out/{mapper}.cnvkit.panel_of_normals.cnn + plot: True # Generate plots (very slow) min_mapq: 0 # [coverage] Mininum mapping quality score to count a read for coverage depth count: False # [coverage] Alternative couting algorithm gc_correction: True # [fix] Use GC correction @@ -431,6 +432,7 @@ class CnvKitStepPart(SomaticTargetedSeqCnvCallingStepPart): "fix", "segment", "call", + "postprocess", "export", "plot", "report", @@ -484,6 +486,7 @@ def get_input_files(self, action): "call": self._get_input_files_call, "fix": self._get_input_files_fix, "segment": self._get_input_files_segment, + "postprocess": self._get_input_files_postprocess, "export": self._get_input_files_export, "plot": self._get_input_files_plot, "report": self._get_input_files_report, @@ -524,9 +527,25 @@ def _get_input_files_call(wildcards): input_files = {"segment": segment_pattern.format(**wildcards)} return input_files + @staticmethod + def _get_input_files_postprocess(wildcards): + segment_pattern = ( + "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.segment.cns" + ) + call_pattern = ( + "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.call.cns" + ) + input_files = { + "segment": segment_pattern.format(**wildcards), + "call": call_pattern.format(**wildcards), + } + return input_files + @staticmethod def _get_input_files_export(wildcards): - cns_pattern = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.cns" + cns_pattern = ( + "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.call.cns" + ) input_files = {"cns": cns_pattern.format(**wildcards)} return input_files @@ -535,7 +554,7 @@ def _get_input_files_plot(wildcards): tpl = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.{ext}" input_files = { "cnr": tpl.format(ext="cnr", **wildcards), - "cns": tpl.format(ext="cns", **wildcards), + "cns": tpl.format(ext="call.cns", **wildcards), } return input_files @@ -545,7 +564,7 @@ def _get_input_files_report(self, wildcards): "target": tpl.format(ext="targetcoverage.cnn", **wildcards), "antitarget": tpl.format(ext="antitargetcoverage.cnn", **wildcards), "cnr": tpl.format(ext="cnr", **wildcards), - "cns": tpl.format(ext="cns", **wildcards), + "cns": tpl.format(ext="call.cns", **wildcards), } return input_files @@ -559,6 +578,8 @@ def get_output_files(self, action): return self._get_output_files_segment() elif action == "call": return self._get_output_files_call() + elif action == "postprocess": + return self._get_output_files_postprocess() elif action == "export": return self._get_output_files_export() elif action == "plot": @@ -594,9 +615,15 @@ def _get_output_files_segment(): @staticmethod def _get_output_files_call(): name_pattern = "{mapper}.cnvkit.{library_name}" - tpl = os.path.join("work", name_pattern, "out", name_pattern + ".cns") + tpl = os.path.join("work", name_pattern, "out", name_pattern + ".call.cns") return {"calls": tpl, "calls_md5": tpl + ".md5"} + @staticmethod + def _get_output_files_postprocess(): + name_pattern = "{mapper}.cnvkit.{library_name}" + tpl = os.path.join("work", name_pattern, "out", name_pattern + ".cns") + return {"final": tpl, "final_md5": tpl + ".md5"} + @dictify def _get_output_files_plot(self): plots = (("diagram", "pdf"), ("heatmap", "pdf"), ("scatter", "png")) @@ -858,6 +885,10 @@ class SomaticTargetedSeqCnvCallingWorkflow(BaseStep): #: Default biomed sheet class sheet_shortcut_class = CancerCaseSheet + sheet_shortcut_kwargs = { + "options": CancerCaseSheetOptions(allow_missing_normal=True, allow_missing_tumor=True) + } + @classmethod def default_config_yaml(cls): """Return default config YAML, to be overwritten by project-specific one""" @@ -889,11 +920,13 @@ def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir) def get_result_files(self): """Return list of result files for the somatic targeted sequencing CNV calling step""" tool_actions = { - "cnvkit": ("fix", "call", "report", "export", "plot"), + "cnvkit": ["fix", "postprocess", "report", "export"], "copywriter": ("call",), "cnvetti_on_target": ("coverage", "segment", "postprocess"), "cnvetti_off_target": ("coverage", "segment", "postprocess"), } + if "cnvkit" in self.config["tools"] and self.config["cnvkit"]["plot"]: + tool_actions["cnvkit"] += ["plot"] for sheet in filter(is_not_background, self.shortcut_sheets): for sample_pair in sheet.all_sample_pairs: if ( diff --git a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/cnvkit.rules b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/cnvkit.rules index 4014660c1..1281eff3d 100644 --- a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/cnvkit.rules +++ b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/cnvkit.rules @@ -66,6 +66,23 @@ rule somatic_targeted_seq_cnv_calling_cnvkit_call: wf.wrapper_path("cnvkit/call") +rule somatic_targeted_seq_cnv_calling_cnvkit_postprocess: + input: + unpack(wf.get_input_files("cnvkit", "postprocess")), + output: + **wf.get_output_files("cnvkit", "postprocess"), + threads: wf.get_resource("cnvkit", "postprocess", "threads") + resources: + time=wf.get_resource("cnvkit", "postprocess", "time"), + memory=wf.get_resource("cnvkit", "postprocess", "memory"), + partition=wf.get_resource("cnvkit", "postprocess", "partition"), + tmpdir=wf.get_resource("cnvkit", "postprocess", "tmpdir"), + log: + **wf.get_log_file("cnvkit", "postprocess"), + wrapper: + wf.wrapper_path("cnvkit/postprocess") + + rule somatic_targeted_seq_cnv_calling_cnvkit_plot: input: unpack(wf.get_input_files("cnvkit", "plot")), diff --git a/snappy_pipeline/workflows/somatic_wgs_cnv_calling/__init__.py b/snappy_pipeline/workflows/somatic_wgs_cnv_calling/__init__.py index 6cbfdf4e2..2785acb1d 100644 --- a/snappy_pipeline/workflows/somatic_wgs_cnv_calling/__init__.py +++ b/snappy_pipeline/workflows/somatic_wgs_cnv_calling/__init__.py @@ -140,6 +140,7 @@ path_target: REQUIRED # Usually ../panel_of_normals/output/cnvkit.target/out/cnvkit.target.bed path_antitarget: REQUIRED # Usually ../panel_of_normals/output/cnvkit.antitarget/out/cnvkit.antitarget.bed path_panel_of_normals: REQUIRED # Usually ../panel_of_normals/output/{mapper}.cnvkit.create_panel/out/{mapper}.cnvkit.panel_of_normals.cnn + plot: True # Output plots (very slow) min_mapq: 0 # [coverage] Mininum mapping quality score to count a read for coverage depth count: False # [coverage] Alternative couting algorithm gc_correction: True # [fix] Use GC correction @@ -448,6 +449,7 @@ class CnvkitSomaticWgsStepPart(SomaticWgsCnvCallingStepPart): "fix", "segment", "call", + "postprocess", "export", "plot", "report", @@ -501,6 +503,7 @@ def get_input_files(self, action): "call": self._get_input_files_call, "fix": self._get_input_files_fix, "segment": self._get_input_files_segment, + "postprocess": self._get_input_files_postprocess, "export": self._get_input_files_export, "plot": self._get_input_files_plot, "report": self._get_input_files_report, @@ -541,9 +544,19 @@ def _get_input_files_call(wildcards): input_files = {"segment": segment_pattern.format(**wildcards)} return input_files + @staticmethod + def _get_input_files_postprocess(wildcards): + segment_pattern = ( + "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.call.cns" + ) + input_files = {"call": segment_pattern.format(**wildcards)} + return input_files + @staticmethod def _get_input_files_export(wildcards): - cns_pattern = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.cns" + cns_pattern = ( + "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.call.cns" + ) input_files = {"cns": cns_pattern.format(**wildcards)} return input_files @@ -552,7 +565,7 @@ def _get_input_files_plot(wildcards): tpl = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.{ext}" input_files = { "cnr": tpl.format(ext="cnr", **wildcards), - "cns": tpl.format(ext="cns", **wildcards), + "cns": tpl.format(ext="call.cns", **wildcards), } return input_files @@ -562,7 +575,7 @@ def _get_input_files_report(self, wildcards): "target": tpl.format(ext="targetcoverage.cnn", **wildcards), "antitarget": tpl.format(ext="antitargetcoverage.cnn", **wildcards), "cnr": tpl.format(ext="cnr", **wildcards), - "cns": tpl.format(ext="cns", **wildcards), + "cns": tpl.format(ext="call.cns", **wildcards), } return input_files @@ -574,6 +587,7 @@ def get_output_files(self, action): "coverage": self._get_output_files_coverage, "fix": self._get_output_files_fix, "call": self._get_output_files_call, + "postprocess": self._get_output_files_postprocess, "segment": self._get_output_files_segment, "export": self._get_output_files_export, "plot": self._get_output_files_plot, @@ -607,9 +621,15 @@ def _get_output_files_segment(): @staticmethod def _get_output_files_call(): name_pattern = "{mapper}.cnvkit.{library_name}" - tpl = os.path.join("work", name_pattern, "out", name_pattern + ".cns") + tpl = os.path.join("work", name_pattern, "out", name_pattern + ".call.cns") return {"calls": tpl, "calls_md5": tpl + ".md5"} + @staticmethod + def _get_output_files_postprocess(): + name_pattern = "{mapper}.cnvkit.{library_name}" + tpl = os.path.join("work", name_pattern, "out", name_pattern + ".cns") + return {"final": tpl, "final_md5": tpl + ".md5"} + @dictify def _get_output_files_plot(self): plots = (("diagram", "pdf"), ("heatmap", "pdf"), ("scatter", "png")) @@ -909,16 +929,21 @@ def get_result_files(self): mapper=self.w_config["step_config"]["ngs_mapping"]["tools"]["dna"], caller="cnvkit", ) - plots = (("diagram", "pdf", False), ("heatmap", "pdf", True), ("scatter", "png", True)) - yield from self._yield_report_files( - ( - "output/{mapper}.{caller}.{cancer_library.name}/report/" - "{mapper}.{caller}.{cancer_library.name}.{ext}" - ), - plots, - mapper=self.w_config["step_config"]["ngs_mapping"]["tools"]["dna"], - caller="cnvkit", - ) + if self.config["cnvkit"]["plot"]: + plots = ( + ("diagram", "pdf", False), + ("heatmap", "pdf", True), + ("scatter", "png", True), + ) + yield from self._yield_report_files( + ( + "output/{mapper}.{caller}.{cancer_library.name}/report/" + "{mapper}.{caller}.{cancer_library.name}.{ext}" + ), + plots, + mapper=self.w_config["step_config"]["ngs_mapping"]["tools"]["dna"], + caller="cnvkit", + ) if "cnvetti" in bcf_tools: for sheet in filter(is_not_background, self.shortcut_sheets): for donor in sheet.donors: diff --git a/snappy_pipeline/workflows/somatic_wgs_cnv_calling/cnvkit.rules b/snappy_pipeline/workflows/somatic_wgs_cnv_calling/cnvkit.rules index 5e91bd261..b6cd0c49f 100644 --- a/snappy_pipeline/workflows/somatic_wgs_cnv_calling/cnvkit.rules +++ b/snappy_pipeline/workflows/somatic_wgs_cnv_calling/cnvkit.rules @@ -62,6 +62,22 @@ rule somatic_wgs_cnv_calling_cnvkit_call: wf.wrapper_path("cnvkit/call") +rule somatic_wgs_cnv_calling_cnvkit_postprocess: + input: + unpack(wf.get_input_files("cnvkit", "postprocess")), + output: + **wf.get_output_files("cnvkit", "postprocess"), + threads: wf.get_resource("cnvkit", "postprocess", "threads") + resources: + time=wf.get_resource("cnvkit", "postprocess", "time"), + memory=wf.get_resource("cnvkit", "postprocess", "memory"), + partition=wf.get_resource("cnvkit", "postprocess", "partition"), + log: + **wf.get_log_file("cnvkit", "postprocess"), + wrapper: + wf.wrapper_path("cnvkit/postprocess") + + rule somatic_wgs_cnv_calling_cnvkit_plot: input: unpack(wf.get_input_files("cnvkit", "plot")), diff --git a/snappy_wrappers/wrappers/cbioportal/case_lists/wrapper.py b/snappy_wrappers/wrappers/cbioportal/case_lists/wrapper.py index 39ab48682..0b29e3302 100644 --- a/snappy_wrappers/wrappers/cbioportal/case_lists/wrapper.py +++ b/snappy_wrappers/wrappers/cbioportal/case_lists/wrapper.py @@ -3,32 +3,36 @@ input. Takes a dict from biomedsheets/snappy_pipeline, writes out all_cases_with_mutation_data.txt """ +import os -def write_case_list_sequenced(sheets, config, outfile): - """Takes a biomedsheet and writes a case list for all samples with DNA sequencing data""" - samples = [] - for sheet in sheets: - for p in sheet.bio_entities.values(): - for s in p.bio_samples.values(): - if s.extra_infos["isTumor"]: - samples.append(s.name) - samples = list(set(samples)) +def write_case_list(args, outfile): + """Takes a biomedsheet and writes a case list for all samples with DNA sequencing data""" + category = os.path.basename(outfile).replace(".txt", "") with open(outfile, "w") as f: s = "\n".join( [ "cancer_study_identifier: {cancer_study_id}", - "stable_id: {cancer_study_id}_sequenced", - "case_list_name: Sequenced tumors", - "case_list_description: Sequenced tumor samples", - "case_list_category: all_cases_with_mutation_data", + "stable_id: {cancer_study_id}_{stable_id}", + "case_list_name: {name}", + "case_list_description: {description}", + "case_list_category: {category}", "case_list_ids: {all_samples}", + "", ] ).format( - cancer_study_id=config["step_config"]["cbioportal_export"]["cancer_study_id"], - all_samples="\t".join(samples), + cancer_study_id=snakemake.config["step_config"]["cbioportal_export"]["study"][ + "cancer_study_id" + ], + stable_id=args["stable_id"], + name=args["name"], + description=args["description"], + category=args["category"], + all_samples="\t".join(args["samples"]), ) f.write(s) -write_case_list_sequenced(snakemake.params.sheet, snakemake.config, snakemake.output.sequenced) +for case_list, filename in snakemake.output.items(): + assert case_list in snakemake.params.keys() + write_case_list(snakemake.params[case_list], filename) diff --git a/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py b/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py index 511648816..65aae5b9a 100644 --- a/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py +++ b/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py @@ -5,9 +5,11 @@ import csv +import json +import os -def write_clinical_patient_tsv(sheets): +def write_clinical_patient_tsv(donors): """Takes a biomedsheet and writes a clinical patient tsv for cbioportal, see https://github.com/cBioPortal/cbioportal/blob/master/docs/File-Formats.md#the-patient-file for specification @@ -25,11 +27,7 @@ def write_clinical_patient_tsv(sheets): # attribute columns COLUMNS = ["PATIENT_ID", "DUMMY"] - patients = [] - for sheet in sheets: - patients += [bio_entity.name for bio_entity in sheet.bio_entities.values()] - - with open(snakemake.output.patients_tsv, "w") as tsvfile: + with open(snakemake.output.patient, "w") as tsvfile: writer = csv.writer(tsvfile, delimiter="\t") # write header writer.writerow(NAMES) @@ -38,16 +36,64 @@ def write_clinical_patient_tsv(sheets): writer.writerow(PRIORITY) writer.writerow(COLUMNS) - for p in patients: - writer.writerow([p, "UNKNOWN"]) + for donor in donors.keys(): + writer.writerow([donor, "UNKNOWN"]) + + +class SampleInfoTMB: + step = "tumor_mutational_burden" + name = "TMB" + description = "Tumor mutational burden computed on CDS regions" + datatype = "NUMBER" + priority = "2" + column = "TMB" + + def __init__(self, config, **kwargs): + name_pattern = "bwa." + kwargs["somatic_variant_tool"] + ".tmb.{library}" + self.tpl = os.path.join( + config["path"], "output", name_pattern, "out", name_pattern + ".json" + ) + def get_data(self, lib_by_extraction): + if "DNA" in lib_by_extraction: + library = lib_by_extraction["DNA"] + path = self.tpl.format(library=library) + try: + with open(path, "r") as f: + result = json.load(f) + return result["TMB"] + except Exception as e: + print( + "WARNING- error {} occured when extraction TMB for library {}".format( + e, library + ) + ) + else: + print("WARNING- no DNA data") + return "" -def write_clinical_samples_tsv(sheets): + +def write_clinical_samples_tsv(donors): """Takes a biomedsheet and writes a clinical sample tsv for cbioportal, see https://github.com/cBioPortal/cbioportal/blob/master/docs/File-Formats.md#the-samples-file for specification """ + sample_info_getters = [] + for extra_info in snakemake.config["step_config"]["cbioportal_export"]["sample_info"]: + step = extra_info["step"] + if step == "tumor_mutational_burden": + sample_info_getters.append( + SampleInfoTMB( + extra_info, + somatic_variant_tool=snakemake.config["step_config"]["cbioportal_export"][ + "somatic_variant_calling_tool" + ], + ) + ) + else: + raise Exception("Unknown sample info request") + # Header lines, first item must start with # # attribute Display Names NAMES = ["#Patient Identifier", "Sample Identifier"] @@ -60,7 +106,14 @@ def write_clinical_samples_tsv(sheets): # attribute columns COLUMNS = ["PATIENT_ID", "SAMPLE_ID"] - with open(snakemake.output.samples_tsv, "w") as tsvfile: + for extra_info in sample_info_getters: + NAMES += [extra_info.name] + DESC += [extra_info.description] + DATATYPE += [extra_info.datatype] + PRIORITY += [extra_info.priority] + COLUMNS += [extra_info.column] + + with open(snakemake.output.sample, "w") as tsvfile: writer = csv.writer(tsvfile, delimiter="\t") # write header writer.writerow(NAMES) @@ -69,12 +122,13 @@ def write_clinical_samples_tsv(sheets): writer.writerow(PRIORITY) writer.writerow(COLUMNS) - for sheet in sheets: - for p in sheet.bio_entities.values(): - for s in p.bio_samples.values(): - if s.extra_infos["isTumor"]: - writer.writerow([p.name, s.name]) + for donor, v in donors.items(): + for sample, vv in v.items(): + row = [donor, sample] + for extra_info in sample_info_getters: + row.append(extra_info.get_data(vv)) + writer.writerow(row) -write_clinical_patient_tsv(snakemake.params.sheet) -write_clinical_samples_tsv(snakemake.params.sheet) +write_clinical_patient_tsv(snakemake.params) +write_clinical_samples_tsv(snakemake.params) diff --git a/snappy_wrappers/wrappers/cbioportal/compute_signatures/environment.yaml b/snappy_wrappers/wrappers/cbioportal/compute_signatures/environment.yaml deleted file mode 100644 index 5c44fa731..000000000 --- a/snappy_wrappers/wrappers/cbioportal/compute_signatures/environment.yaml +++ /dev/null @@ -1,9 +0,0 @@ -channels: -- bioconda -- conda-forge -- anaconda -dependencies: -- r -- r-dplyr -- bioconductor-gsva -- bioconductor-cqn diff --git a/snappy_wrappers/wrappers/cbioportal/compute_signatures/wrapper.py b/snappy_wrappers/wrappers/cbioportal/compute_signatures/wrapper.py deleted file mode 100644 index 4cb1c948f..000000000 --- a/snappy_wrappers/wrappers/cbioportal/compute_signatures/wrapper.py +++ /dev/null @@ -1,82 +0,0 @@ -# -*- coding: utf-8 -*- -"""Wrapper for computing expression signatures from counts""" - -import os.path - -from snakemake import shell - -# import pprint -# pprint.pprint(snakemake.output.pdf) - -if len(snakemake.output.pdf) == 1: - snakemake.output.pdf = snakemake.output.pdf[0] -else: - raise - -sample_tpl = os.path.basename(os.path.dirname(os.path.dirname(snakemake.output.pdf))) -sample_dir = os.path.dirname(os.path.dirname(snakemake.output.pdf)) - -__author__ = "Clemens Messerschmidt " - -shell.executable("/bin/bash") - -shell( - r""" -set -x - -export TMPDIR=$(mktemp -d) -trap "rm -rf $TMPDIR" EXIT - -# Also pipe stderr to log file -if [[ -n "{snakemake.log}" ]]; then - if [[ "$(set +e; tty; set -e)" != "" ]]; then - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - exec 2> >(tee -a "{snakemake.log}" >&2) - else - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - echo "No tty, logging disabled" >"{snakemake.log}" - fi -fi - -# ------------------------------------------------------------------------------------------------- -# Write helper script and call R -# -cat <<"EOF" > $TMPDIR/compute_signatures.R -library( magrittr ) -library( methods ) # https://github.com/tidyverse/broom/issues/67 - -gene_exp = read.delim("{snakemake.input.tsv}", stringsAsFactors=FALSE) - -sample = make.names("{sample_tpl}") -idx = which(sample == names(gene_exp)) - -m = as.matrix(gene_exp) -sig_list = expression.signatures::get_signature_list(id = "Gene_symbol") - -ssGSEA = GSVA::gsva(expr = m, - gset.idx.list = sig_list, - method = "gsva", no.bootstraps = 0, - #method = "ssgsea", ssgsea.norm=T, - rnaseq = T, - parallel.sz = 0, - min.sz = 5) - -sigs = ssGSEA$es.obs - -dir.create("{sample_dir}") -pdf("{snakemake.output.pdf}") - -for (i in 1:nrow(sigs)) {{ - signature = rownames(sigs)[i] - plot(density(sigs[i, ]), main=rownames(sigs)[i]) - abline( v= sigs[i, sample], col=2, lwd=3) -}} -dev.off() - -warnings() -sessionInfo() -EOF - -Rscript --vanilla $TMPDIR/compute_signatures.R -""" -) diff --git a/snappy_wrappers/wrappers/cbioportal/generate_cna/environment.yaml b/snappy_wrappers/wrappers/cbioportal/generate_cna/environment.yaml new file mode 100644 index 000000000..1f257fe3a --- /dev/null +++ b/snappy_wrappers/wrappers/cbioportal/generate_cna/environment.yaml @@ -0,0 +1,14 @@ +name: merge_tables + +channels: +- conda-forge +- bioconda +- r + +dependencies: +- r-base +- r-tidyverse +- r-igraph +- bioconductor-genomicranges +- bioconductor-genomicfeatures +- bioconductor-deseq2 diff --git a/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R b/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R new file mode 100644 index 000000000..6438e6b83 --- /dev/null +++ b/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R @@ -0,0 +1,32 @@ +require(magrittr) + +#' Compute discrete copy number & log2 on genes +#' +#' @param fn names of the cns file +#' @param tx_obj Bioconductor feature description object or its name (human by default, either TxDb or EnsDb), or GTF/GFF features file +#' +#' @example +cns_to_cna <- function(fn, tx_obj=TxDb.Hsapiens.UCSC.hg19.knownGene::TxDb.Hsapiens.UCSC.hg19.knownGene, pipeline_id="ENSEMBL") { + if (missing(fn) || is.null(fn) || !is.character(fn) || length(fn)!=1 || is.na(fn) || fn=="") + stop("Missing or illegal cns filename") + + tx_obj <- get_tx_object(tx_obj) + genes <- GenomicFeatures::genes(tx_obj) + stopifnot("gene_id" %in% colnames(GenomicRanges::mcols(genes))) + + segments <- read.table(fn, sep="\t", header=1, stringsAsFactors=FALSE, check.names=FALSE) + if ("chromosome" %in% colnames(segments)) colnames(segments)[colnames(segments)=="chromosome"] <- "chrom" + stopifnot(all(c("cn", "log2", "chrom", "start", "end") %in% colnames(segments))) + + seg <- GenomicRanges::makeGRangesFromDataFrame(segments, seqnames.field="chrom", start.field="start", end.field="end", strand="*", keep.extra.columns=FALSE) + + i <- GenomicRanges::findOverlaps(genes, seg) + i <- split(S4Vectors::subjectHits(i), S4Vectors::queryHits(i)) + i <- unlist(i[lengths(i) == 1]) + + tbl <- data.frame(FeatureID=as.character(genes$gene_id), cn=NA, log2=NA) + colnames(tbl)[1] <- pipeline_id + tbl[as.numeric(names(i)),c("cn", "log2")] <- segments[i,c("cn", "log2")] + + tbl +} diff --git a/snappy_wrappers/wrappers/cbioportal/generate_cna/wrapper.py b/snappy_wrappers/wrappers/cbioportal/generate_cna/wrapper.py new file mode 100644 index 000000000..a26b42146 --- /dev/null +++ b/snappy_wrappers/wrappers/cbioportal/generate_cna/wrapper.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +"""Wrapper for merging multiple tables in R on shared columns""" + +import os + +from snakemake import shell + +__author__ = "Eric Blanc " + +r_script = os.path.abspath(os.path.join(os.path.dirname(__file__), "script.R")) +helper_functions = os.path.join(os.path.dirname(r_script), "..", "helper_functions.R") + +shell( + r""" +set -x + +# Write files for reproducibility ----------------------------------------------------------------- + +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +pushd $(dirname {snakemake.log.conda_list}) ; md5sum $(basename {snakemake.log.conda_list}) > $(basename {snakemake.log.conda_list_md5}) ; popd +pushd $(dirname {snakemake.log.conda_info}) ; md5sum $(basename {snakemake.log.conda_info}) > $(basename {snakemake.log.conda_info_md5}) ; popd + +# Also pipe stderr to log file -------------------------------------------------------------------- + +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +# Create auto-cleaned temporary directory --------------------------------------------------------- + +export TMPDIR=$(mktemp -d) +trap "rm -rf $TMPDIR" EXIT + +# Run the R script -------------------------------------------------------------------------------- + +R --vanilla --slave << __EOF +source("{helper_functions}") +source("{r_script}") +write.table( + cns_to_cna("{snakemake.input}", "{snakemake.params[features]}", "{snakemake.params[pipeline_id]}"), + file="{snakemake.output}", sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE +) +__EOF + +pushd $(dirname {snakemake.output}) ; md5sum $(basename {snakemake.output}) > $(basename {snakemake.output}).md5 ; popd +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +sleep 1s # try to wait for log file flush +pushd $(dirname {snakemake.log.log}) ; md5sum $(basename {snakemake.log.log}) > $(basename {snakemake.log.log_md5}) ; popd +""" +) diff --git a/snappy_wrappers/wrappers/cbioportal/helper_functions.R b/snappy_wrappers/wrappers/cbioportal/helper_functions.R new file mode 100644 index 000000000..2858fdfb9 --- /dev/null +++ b/snappy_wrappers/wrappers/cbioportal/helper_functions.R @@ -0,0 +1,408 @@ +require(magrittr) + +#' Extracts the feature names & one column of values from tab-delimited sample files +#' and return a data.frame with the values for each sample in the columns, and +#' the feature names as row name. +#' +#' @param fns named list or named vector of sample filenames. The names are the sample IDs +#' @param featureCol the name of the column containing the feature names in the sample files +#' @param valueCol the name of the column containing the values to be extracted from each sample file. +#' +#' @example +read_sample_files <- function(fns, featureCol, valueCol, header=TRUE) { + if (missing(fns) || is.null(fns)) + stop("Missing list of files") + if (is.list(fns)) { + stopifnot(all(lengths(fns) == 1)) + fns <- unlist(fns) + } + if (!is.character(fns) || any(is.na(fns)) || any(fns=="")) + stop("Missing file name") + if (is.null(names(fns))) + stop("Missing sample names") + if (missing(featureCol) || is.null(featureCol) || !is.character(featureCol) || length(featureCol)!=1 || is.na(featureCol) || featureCol=="") + stop("Missing or illegal feature column name") + if (missing(valueCol) || is.null(valueCol) || !is.character(valueCol) || length(valueCol)!=1 || is.na(valueCol) || valueCol=="") + stop("Missing or illegal column name for data extraction") + + tbl <- NULL + for (i in names(fns)) { + tmp <- read.table(fns[i], sep="\t", header=header, stringsAsFactors=FALSE, check.names=FALSE) + stopifnot(all(c(featureCol, valueCol) %in% colnames(tmp))) + tmp <- tmp[,c(featureCol, valueCol),drop=FALSE] + colnames(tmp)[2] <- i + if (is.null(tbl)) { + tbl <- tmp + } else { + tbl <- tbl %>% dplyr::full_join(tmp, by=featureCol) + } + } + tbl <- tbl[!grepl("_PAR_Y$", tbl[[featureCol]]),,drop=FALSE] + if (any(duplicated(tbl[[featureCol]]))) + stop("Duplicated feature ids") + rownames(tbl) <- tbl[[featureCol]] + tbl[,colnames(tbl)!=featureCol,drop=FALSE] +} + + +#' Remap data to different feature ID (typically from ENSEMBL to SYMBOL or ENTREZ_ID). +#' +#' When the mappings between ids is not 1-1, the following rules are applied: +#' many-many relationships are removed +#' when pipeline id maps to multiple symbols, the data is copied to all symbols +#' when multiple pipeline ids map to a single symbol, the the method is taken into account: +#' when method is sum, the data for the target id is the sum of all "source" id for every sample, +#' when method is max, the data of the "source" id which is highest over all samples is selected as representative for the "target" id. +#' +#' @param mat the matrix or data.frame containing the data (expression, CNA, ...) +#' @param mappings the data frame of feature id mappings +#' @param from the "source" type of feature ids, must be in the mapping table column names +#' @param to the "target" type of feature ids, must be in the mapping table column names +#' @param method aggregation method when many "source" ids are mapped to the same "target" id +#' +#' @example +map_feature_id <- function(mat, mappings, from, to, method=c("sum", "max", "maxabs")) { + if (missing(mat) || is.null(mat) || !(is.data.frame(mat) || is.matrix(mat)) || nrow(mat)<1 || ncol(mat)<1) + stop("Missing or illegal data") + method <- match.arg(method) + if (missing(from) || is.null(from) || !is.character(from) || length(from)!=1 || is.na(from) || from=="") + stop("Missing or illegal feature id type (origin)") + if (missing(to) || is.null(to) || !is.character(to) || length(to)!=1 || is.na(to) || to=="") + stop("Missing or illegal feature id type (target)") + if (from==to) return(mat) + if (missing(mappings) || is.null(mappings) || !is.data.frame(mappings) || nrow(mappings)<1 || ncol(mappings)<2) + stop("Missing or illegal feature id mapping table") + if (!all(c(from, to) %in% colnames(mappings))) + stop("Feature id type ", from, " or ", to, " not in mappings table") + + mappings <- mappings[,c(from, to)] %>% dplyr::distinct() + mappings <- mappings[mappings[[from]] %in% rownames(mat),,drop=FALSE] + + n <- sum(rownames(mat) %in% mappings[[from]]) + if (n == 0) + stop("No common feature id between the mapping table and the data") + if (n/nrow(mat) < 0.9) + warning("The proportion of feature id that can be mapped is low at ", n/nrow(mat)) + if (n < nrow(mat)) + warning(nrow(mat) - n, " features cannot be mapped, removed from data") + mat <- mat[rownames(mat) %in% mappings[[from]],,drop=FALSE] + mappings <- mappings[mappings[[from]] %in% rownames(mat),,drop=FALSE] + + # Resolve 1-1, 1-many & many-1 mappings between ENSEMBL & HGNC symbols + mappings <- map_between_two_ids(mappings[[from]], mappings[[to]], haveIndex=FALSE, verbose=TRUE, keepBlanks=FALSE) + rslt <- NULL + if (any(mappings[["type"]] == "1-1")) { + i <- which(mappings[["type"]] == "1-1") + tmp <- mat[mappings[["x"]][i],,drop=FALSE] + rownames(tmp) <- mappings[["y"]][i] + rslt <- rbind(rslt, tmp) + } + if (any(mappings[["type"]] == "1-many")) { + i <- which(mappings[["type"]] == "1-many") + tmp <- mat[mappings[["x"]][i],,drop=FALSE] + rownames(tmp) <- mappings[["y"]][i] + rslt <- rbind(rslt, tmp) + } + if (any(mappings[["type"]] == "many-1")) { + i <- which(mappings[["type"]] == "many-1") + i <- split(mappings[["x"]][i], mappings[["y"]][i]) + tmp <- switch(method, + sum=sapply(i, function(j) colSums(mat[j,,drop=FALSE], na.rm=TRUE)), + max=sapply(i, function(j) { x <- mat[j,,drop=FALSE] ; x <- x[order(-rowSums(x, na.rm=TRUE)),,drop=FALSE] ; x[1,] }), + maxabs=sapply(i, function(j) { x <- mat[j,,drop=FALSE] ; x <- x[order(-rowSums(abs(x), na.rm=TRUE)),,drop=FALSE] ; x[1,] }) + ) + if (!is.matrix(x)) tmp <- matrix(tmp, ncol=1, dimnames=list(names(i), colnames(mat))) + rslt <- rbind(rslt, tmp) + } + + rslt +} + +#' Gets a TxDb/EnsDb object +#' +#' The TxDb/EnsDb object can be obtained from different inputs +#' - An existing TxDb or EnsDb object, in this case the function is only a pass-through, +#' - The name of TxDb/EnsDb package, possibly qualified with the object name in the environment, or +#' - The name of a GTF/GFF file, or +#' - An existing GRanges object +#' +#' @param tx_obj TxDb/EnsDb, GRanges, filename or package/object name +#' +#' @return TxDb/EnsDb object +#' @export +#' +#' @examples +get_tx_object <- function(tx_obj, verbose=FALSE) { + if (missing(tx_obj) || is.null(tx_obj)) + stop("Missing features description object") + if (is.character(tx_obj) && length(tx_obj)==1 && !is.na(tx_obj) && tx_obj!="") { + if (file.exists(tx_obj)) { + if (verbose) cat("Taking features from GTF/GTF file ", tx_obj) + tx_obj <- GenomicFeatures::makeTxDbFromGFF(tx_obj) + } else { + if (grepl("::", tx_obj)) { + tx_obj <- getFromNamespace(sub("^.+::", "", tx_obj), ns=sub("::.+$", "", tx_obj)) + } else { + tx_obj <- getFromNamespace(tx_obj, ns=tx_obj) + } + } + } else { + if (is(tx_obj, "GRanges")) tx_obj <- GenomicFeatures::makeTxDbFromGRanges(tx_obj) + } + if (!(is(tx_obj, "TxDb") || is(tx_obj, "EnsDb"))) + stop("Illegal features description object") + tx_obj +} + +#' Gets a gene id mapping table +#' +#' The mapping table contains gene identifiers from HGNC (SYMBOL), ENSEMBL & NCBI (ENTREZ_ID). +#' The mapping table has no missing identifier, and no duplicate rows. +#' All ENTREZ_ID are numbers coded as characters. +#' +#' Several type of inputs are possible: +#' - An existing orgDb object, +#' - The name of an orgDb package, possibly qualified with the object name in the environment, or +#' - A tab-delimited file, containined the columns "SYMBOL", "ENSEMBL" and "ENTREZ_ID". +#' To enable the possibility to use genome-nexus files, a file with column names +#' "hgnc_symbol", "ensembl_canonical_gene", "entrez_gene_id" is also allowed. +#' +#' @param org_obj orgDb, mapping id filename or package/object name +#' +#' @return gene id mapping table with columns SYMBOL, ENSEMBL & ENTREZ_ID +#' @export +#' +#' @examples +get_id_mappings <- function(org_obj, verbose=FALSE) { + if (missing(org_obj) || is.null(org_obj)) + stop("Missing organism description object") + if (is(org_obj, "OrgDb")) { + if (verbose) cat("Gene id mappings taken from Bioconductor object") + id_mappings <- AnnotationDbi::select( + org_obj, keytype=pipeline_id, columns=c("ENSEMBL", "SYMBOL", "ENTREZ_ID"), + keys=AnnotationDbi::keys(org_obj, keytype=pipeline_id) + ) + } else { + if (!is.character(org_obj) || length(org_obj)!=1 || is.na(org_obj) || org_obj=="") + stop("Illegal organism description") + if (file.exists(org_obj)) { + if (verbose) cat("Gene id mappings taken from file ", org_obj) + id_mappings <- read.table(org_obj, sep="\t", header=1, stringsAsFactors=FALSE, check.names=FALSE, quote="", comment="") + if (all(c("hgnc_symbol", "ensembl_canonical_gene", "entrez_gene_id") %in% colnames(id_mappings))) + id_mappings <- id_mappings %>% + dplyr::select(ENSEMBL=ensembl_canonical_gene, SYMBOL=hgnc_symbol, ENTREZ_ID=entrez_gene_id) + stopifnot(all(c("ENSEMBL", "SYMBOL", "ENTREZ_ID") %in% colnames(id_mappings))) + id_mappings <- id_mappings[,c("ENSEMBL", "SYMBOL", "ENTREZ_ID")] + } else { + if (grepl("::", org_obj)) { + org_obj <- getFromNamespace(sub("^.+::", "", org_obj), ns=sub("::.+$", "", org_obj)) + } else { + org_obj <- getFromNamespace(org_obj, ns=org_obj) + } + id_mappings <- AnnotationDbi::select( + org_obj, keytype=pipeline_id, columns=c("ENSEMBL", "SYMBOL", "ENTREZ_ID"), + keys=AnnotationDbi::keys(org_obj, keytype=pipeline_id) + ) + } + } + id_mappings <- id_mappings %>% + dplyr::select(ENSEMBL, SYMBOL, ENTREZ_ID) %>% + dplyr::mutate(ENTREZ_ID=as.character(ENTREZ_ID)) %>% + dplyr::filter(!is.na(ENSEMBL) & ENSEMBL!="") %>% + dplyr::filter(!is.na(SYMBOL) & SYMBOL!="") %>% + dplyr::filter(!is.na(ENTREZ_ID) & ENTREZ_ID!="" & grepl("^[0-9]+$", ENTREZ_ID)) %>% + dplyr::distinct() + + id_mappings +} + +#' Create table of mappings between two sets of ids +#' +#' Creates a complete mapping between two sets of ids (x & y) of the same length. +#' The mappings are given a type (1-1, 1-many, many-1 & many-many), and +#' a group identifier, so that the mappings of all y ids corresponding to +#' a single x id in a 1-many relationship are given the same group number. +#' Missing values and duplicate entries in the input are ignored. +#' +#' The function creates a data frame containing all mappings between ids in +#' set x and ids in set y. These mappings are given a type (1-1, 1-many, +#' many-1 and many-many), and the original mappings are completed to include +#' all mappings between an x and a y which are connected by some path. +#' For example, if the x and y inputs are \code{x = c("x1", "x2", "x2")} and +#' \code{y = c("y1", "y1", "y2")}, which describe that id x1 is mapped to y1, +#' x2 is mapped to y1 and y2, then in the output, x1 will be mapped to y2. +#' A single group id will be assigned to the 4 connections (x1 to y1, x1 to y2, +#' x2 to y1 and x2 to y2). +#' If \code{haveIndex = TRUE}, the function will also create a column which +#' contains the indices of the original mappings in the input vectors. In the +#' example above, the index column will be 1 for x1 to y1, 2 for x2 to y1, +#' 3 for x2 to y2 and NA for x1 to y2, as the latter is not present in the +#' input. +#' Note that the index column is a column of lists, as it will report all +#' occurences of the original mapping, which might appear several times. +#' The missing mappings (which have NAs in either x or y input vectors) are +#' discarded. +#' +#' @param x vector of ids +#' @param y vector of ids +#' @param haveIndex return index of mapping in original vectors +#' @param verbose output progress messages +#' @param keepBlanks allow the empty string as valid ID +#' +#' @return data.frame with columns x (the first id), y (the second id), +#' type (the mapping type, 1-1, 1-many, many-1 or many-many), +#' group (an integer grouping id pairs), and optionally index, a +#' pointer to the mapping's position in the initial input. If the +#' mapping is not in the original input (i.e. it has been created +#' because of other connections between x and y ids), then the value +#' of the index is NA. +#' @export +#' +#' @examples{ +#' map_between_two_ids(c("x1", "x2", "x2", "x3", "x4", "x5", "x6", "x6"), +#' c("y1", "y1", "y2", "y3", "y4", "y4", "y5", "y6")) +#' } +map_between_two_ids <- function( x, y, haveIndex=TRUE, verbose=TRUE, keepBlanks=FALSE ) { + # Cleanup input + if( missing(x) || missing(y) || + is.null( x ) || is.null( y ) || length( x ) < 1 || + length( x ) != length( y ) ) + stop( "Missing arguments" ) + if( verbose ) cat( "Starting grouping", length( x ), "elements\n" ) + df <- unique( cbind( x=as.character( x ), y=as.character( y ) ) ) + rownames( df ) <- NULL + df <- df[rowSums( is.na( df ) )==0,] + if( ! keepBlanks ) df <- df[rowSums( df == "" )==0,] + if( verbose ) cat( "Number of complete pairs:", nrow( df ), "\n" ) + if( nrow( df ) == 0 ) return( NULL ) + + # Split by x and y columns + ys_from_x <- split( df[,"y"], df[,"x"] ) + xs_from_y <- split( df[,"x"], df[,"y"] ) + one_y_from_x <- unlist( ys_from_x[lengths(ys_from_x) == 1] ) + many_ys_from_x <- ys_from_x[lengths(ys_from_x) > 1] + one_x_from_y <- unlist( xs_from_y[sapply( xs_from_y, length )==1] ) + many_xs_from_y <- xs_from_y[sapply( xs_from_y, length )>1] + + igroup <- 0 + # 1-1 mappings: those in one_y_from_x that also are in one_x_from_y + rslt <- data.frame( group=as.numeric( c() ), + x=as.character( c() ), y=as.character( c() ), + type=as.character(), + stringsAsFactors=FALSE ) + if( length( one_y_from_x ) > 0 && length( one_x_from_y ) > 0 ) { + tmp <- one_y_from_x[names( one_y_from_x ) %in% one_x_from_y] + if (length(tmp)>0) { + tmp <- data.frame( group=igroup+(1:length( tmp )), + x=names( tmp ), y=tmp, + type="1-1", + stringsAsFactors=FALSE ) + rownames( tmp ) <- NULL + igroup <- nrow(tmp) + rslt <- rbind(rslt, tmp) + + # Remove 1-1 mappings from single splits + one_y_from_x <- one_y_from_x[!(one_y_from_x %in% tmp$y)] + one_x_from_y <- one_x_from_y[!(one_x_from_y %in% tmp$x)] + } + if( verbose ) cat( "Number of 1-1 pairs:", nrow( tmp ), "\n" ) + } + + # many-1 mappings: each y has many xs (only xs which map to a single y must be considered) + if( length( one_y_from_x ) > 0 && length( many_xs_from_y ) > 0 ) { + many_to_1_x <- names( one_y_from_x ) + many_to_one <- many_xs_from_y[sapply( many_xs_from_y, function( y ) all( y %in% many_to_1_x ) )] + n <- 0 + if (length(many_to_one) > 0) { + tmp <- data.frame( group=igroup + rep( (1:length( many_to_one )), lengths( many_to_one ) ), + x=unlist(many_to_one), y=rep(names(many_to_one), lengths(many_to_one)), + type="many-1", + stringsAsFactors=FALSE ) + rownames( tmp ) <- NULL + rslt <- rbind( rslt, tmp ) + n <- nrow(tmp) + igroup <- igroup + length(many_to_one) + + # Remove many-1 mappings from single splits + many_xs_from_y <- many_xs_from_y[!(names( many_xs_from_y ) %in% names( many_to_one ))] + one_y_from_x <- one_y_from_x[!(names(one_y_from_x) %in% many_to_1_x)] + } + if( verbose ) cat( "Number of many-1 pairs:", n, "\n" ) + } + + # 1-many mappings: each x has many ys (only ys that map to a single xmust be considered) + if( length( one_x_from_y ) > 0 && length( many_ys_from_x ) > 0 ) { + one_to_many_y <- names( one_x_from_y ) + one_to_many <- many_ys_from_x[sapply( many_ys_from_x, function( x ) all( x %in% one_to_many_y ) )] + n <- 0 + if (length(one_to_many) > 0) { + tmp <- data.frame( group=igroup + rep( (1:length( one_to_many )), lengths( one_to_many ) ), + x=rep(names(one_to_many), lengths(one_to_many)), y=unlist(one_to_many), + type="1-many", + stringsAsFactors=FALSE ) + rownames( tmp ) <- NULL + rslt <- rbind( rslt, tmp ) + n <- nrow(tmp) + igroup <- igroup + length(one_to_many) + + many_ys_from_x <- many_ys_from_x[!(names( many_ys_from_x ) %in% names( one_to_many ))] + one_x_from_y <- one_x_from_y[!(names(one_x_from_y) %in% one_to_many_y)] + } + if( verbose ) cat( "Number of 1-many pairs:", n, "\n" ) + } + + # many-many mappings + if( length( many_ys_from_x )>0 && length(many_xs_from_y)>0) { + # Create a matrix with all remaining connections + m <- rbind( data.frame(x=rep(names(many_ys_from_x), lengths(many_ys_from_x)), y=unlist(many_ys_from_x), + stringsAsFactors=FALSE), + data.frame(x=unlist(many_xs_from_y), y=rep(names(many_xs_from_y), lengths(many_xs_from_y)), + stringsAsFactors=FALSE), + data.frame(x=one_x_from_y, y=names(one_x_from_y), stringsAsFactors=FALSE), + data.frame(x=names(one_y_from_x), y=one_y_from_x, stringsAsFactors=FALSE) + ) + m <- as.matrix( unique( m ) ) + if( verbose ) cat( "Number of many-many pairs:", nrow( m ), "\n" ) + if( verbose ) cat( "Finding groups...\n" ) + + # Get the connected components for this graph + m[,1] <- paste( "x", m[,1], sep="\t" ) + m[,2] <- paste( "y", m[,2], sep="\t" ) + g <- igraph::graph_from_edgelist( m, directed=FALSE ) + cl <- igraph::components( g, mode="strong" ) + i <- split( names( cl$membership ), cl$membership ) + assertthat::assert_that(min(lengths(i))>3) + if( verbose ) cat( "Number of many-many groups:", length( i ), "\n" ) + + # Transform so that each group in i has 2 lists which contain the x & y items + i <- lapply( i, function( ii ) matrix( unlist( stringr::str_split( ii, "\t" ) ), nrow=2 ) ) + i <- lapply( i, function( ii ) split( ii[2,], ii[1,] ) ) + + # Build the dataframe for all, filling it with all combinations of x & y + n <- sum( sapply( i, function( ii ) length( ii$x )*length( ii$y ) ) ) + tmp <- data.frame( group=rep( NA, n ), x=rep( NA, n ), y=rep( NA, n ), type="many-many", + stringsAsFactors=FALSE) + k <- 0 + for( j in names( i ) ) { + igroup <- igroup+1 + nx <- length( i[[j]]$x ) + ny <- length( i[[j]]$y ) + tmp[k+(1:(nx*ny)),"group"] <- igroup + tmp[k+(1:(nx*ny)),"x"] <- rep( i[[j]]$x, each=ny ) + tmp[k+(1:(nx*ny)),"y"] <- rep( i[[j]]$y, nx ) + k <- k + nx*ny + } + rslt <- rbind( rslt, tmp ) + } + + # Show the mappings that were actually in the input + if( haveIndex ) { + i <- split( 1:length( x ), paste( as.character( x ), as.character( y ), sep="\t" ) ) + j <- match( paste( as.character( rslt$x ), as.character( rslt$y ), sep="\t" ), names( i ) ) + rslt$index <- c() + rslt$index[!is.na( j )] <- i[j[!is.na( j )]] + assertthat::assert_that(all(!is.na(rslt$index)[rslt$type!="many-many"])) + } + + rslt +} diff --git a/snappy_wrappers/wrappers/cbioportal/merge_tables/environment.yaml b/snappy_wrappers/wrappers/cbioportal/merge_tables/environment.yaml index 6e3bfe61c..1f257fe3a 100644 --- a/snappy_wrappers/wrappers/cbioportal/merge_tables/environment.yaml +++ b/snappy_wrappers/wrappers/cbioportal/merge_tables/environment.yaml @@ -1,7 +1,14 @@ +name: merge_tables + channels: -- bioconda - conda-forge -- anaconda -dependencies: -- pandas +- bioconda +- r +dependencies: +- r-base +- r-tidyverse +- r-igraph +- bioconductor-genomicranges +- bioconductor-genomicfeatures +- bioconductor-deseq2 diff --git a/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R b/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R new file mode 100644 index 000000000..8d1a26ddf --- /dev/null +++ b/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R @@ -0,0 +1,162 @@ +require(magrittr) + +#' Read & merge sample files into cBioPortal gene-based data table. +#' +#' Used for expression tables, log2 CNA, pseudo-Gistic table. +#' +#' @param fns named list or vector of sample files, with sample ids as names +#' @param mappings mapping table between feature ids (must contain ENSEMBL, SYMBOL & ENTREZ_ID columns) +#' @param type type of data to merge +#' @param args named list of additional arguments required to process the data before exporting +#' @param remove_feature_version remove the trailing "." in the feature id (useful for GENCODE) +#' +#' @example +merge_tables <- function(fns, mappings, type=c("log2", "gistic", "segment", "expression"), args=list(), remove_feature_version=TRUE) { + type <- match.arg(type) + + if (missing(fns) || is.null(fns)) + stop("Missing list of sample files") + if (is.list(fns)) { + stopifnot(all(lengths(fns) == 1)) + fns <- unlist(fns) + } + if (!is.character(fns) || any(is.na(fns)) || any(fns=="")) + stop("Missing at least one sample filename") + if (is.null(names(fns)) || any(is.na(names(fns))) || any(names(fns)=="")) + stop("Missing at least one sample id") + + if (type == "segment") return(merge_segments(fns)) + + if (missing(mappings) || is.null(mappings) || !is.character(mappings) || length(mappings)!=1 || is.na(mappings) || mappings=="") + stop("Missing or illegal gene id mappings filename") + mappings <- get_id_mappings(mappings, verbose=TRUE) + + if (type == "expression") { + stopifnot(all(c("pipeline_id", "tx_obj") %in% names(args))) + counts <- read_sample_files(fns, featureCol="V1", valueCol="V2", header=FALSE) + tmp <- compute_rpkm(counts, tx_obj=args$tx_obj, verbose=TRUE) + method <- "sum" + } + + if (type == "gistic") { + stopifnot(all(c("pipeline_id", "amplification") %in% names(args))) + # Copy numbers (in "cn" column) are transformed into (pseudo-) gistic codes: + # 0: Deep deletion, 1: heterozygous deletion, 2: copy number neutral, 3: gain, 4: amplification + # In https://doi.org/10.1038/s41586-022-04738-6, the amplification is defined as + # copy number greater or equal to 9 copies (args$amplification = 9). + args$amplification <- as.numeric(args$amplification) + cn <- read_sample_files(fns, args$pipeline_id, "cn") + cn[args$amplification<=cn] <- args$amplification + cn[20,,drop=FALSE] + if (nrow(counts) == 0) + stop("No feature with counts") + counts <- counts[,colSums(is.na(counts))==0,drop=FALSE] + if (ncol(counts) == 0) + stop("No sample without missing value") + + # Append the gene locii to the counts in dds object + if (verbose) cat("Create DESeq2 object ... ") + genes <- GenomicFeatures::exonsBy(tx_obj, "gene") + genes <- genes[names(genes) %in% rownames(counts)] + counts <- counts[names(genes),] + donors <- data.frame(Donor=colnames(counts), stringsAsFactors=FALSE) + dds <- DESeq2::DESeqDataSetFromMatrix(counts, colData=donors, design=as.formula("~ 1"), rowRanges=genes) + if (verbose) cat("Done\n") + + # Compute FPKMs + if (verbose) cat("Compute FPKM ... ") + dds <- DESeq2::estimateSizeFactors(dds) + FPKM <- DESeq2::fpkm(dds, robust=TRUE) + if (verbose) cat("Done\n") + + FPKM +} diff --git a/snappy_wrappers/wrappers/cbioportal/merge_tables/wrapper.py b/snappy_wrappers/wrappers/cbioportal/merge_tables/wrapper.py index 96de11288..b4e4d94b1 100644 --- a/snappy_wrappers/wrappers/cbioportal/merge_tables/wrapper.py +++ b/snappy_wrappers/wrappers/cbioportal/merge_tables/wrapper.py @@ -1,39 +1,68 @@ # -*- coding: utf-8 -*- """Wrapper for merging multiple tables in R on shared columns""" +import os -__author__ = "Clemens Messerschmidt " +from snakemake import shell -import re +__author__ = "Eric Blanc " -import pandas as pd +r_script = os.path.abspath(os.path.join(os.path.dirname(__file__), "script.R")) +helper_functions = os.path.join(os.path.dirname(r_script), "..", "helper_functions.R") -pattern = re.compile("(.+)-[DR]NA[0-9]+-(WES|WGS|mRNA_seq)[0-9]+$") +filenames = ", ".join(['"{}"="{}"'.format(str(k), str(v)) for k, v in snakemake.input.items()]) +extra_args = ", ".join( + ['"{}"="{}"'.format(str(k), str(v)) for k, v in snakemake.params["extra_args"].items()] +) +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step] -def readTable(fn, dataint=False): - df = pd.read_csv(fn, sep="\t", header=0) - df = df.dropna() - df = df.astype({"Entrez_Gene_Id": "str"}) - df = df.groupby(["Hugo_Symbol", "Entrez_Gene_Id"]).median() - df = df.reset_index() - # WARNING- pandas rounds towards 0, not to nearest int - if dataint: - df = df.astype({df.columns[2]: "int32"}) - return df +shell( + r""" +set -x +# Write files for reproducibility ----------------------------------------------------------------- -joined = None -for fn in snakemake.input: - df = readTable(fn, dataint=(snakemake.params.datatype == "int")) - if joined is None: - joined = df - else: - joined = pd.merge(joined, df, on=["Hugo_Symbol", "Entrez_Gene_Id"], how="outer") +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +pushd $(dirname {snakemake.log.conda_list}) ; md5sum $(basename {snakemake.log.conda_list}) > $(basename {snakemake.log.conda_list_md5}) ; popd +pushd $(dirname {snakemake.log.conda_info}) ; md5sum $(basename {snakemake.log.conda_info}) > $(basename {snakemake.log.conda_info_md5}) ; popd -joined.columns = [pattern.sub("\\1", x) for x in joined.columns] +# Also pipe stderr to log file -------------------------------------------------------------------- -if snakemake.params.datatype == "int": - joined.to_csv(str(snakemake.output), sep="\t", na_rep="NA", index=False, float_format="%.0f") -else: - joined.to_csv(str(snakemake.output), sep="\t", na_rep="NA", index=False) +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +# Create auto-cleaned temporary directory --------------------------------------------------------- + +export TMPDIR=$(mktemp -d) +trap "rm -rf $TMPDIR" EXIT + +# Run the R script -------------------------------------------------------------------------------- + +R --vanilla --slave << __EOF +source("{helper_functions}") +source("{r_script}") +write.table( + merge_tables(list({filenames}), mappings="{config[path_gene_id_mappings]}", type="{snakemake.params[action_type]}", args=list({extra_args})), + file="{snakemake.output}", sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE +) +__EOF +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +sleep 1s # try to wait for log file flush +pushd $(dirname {snakemake.log.conda_info}) ; md5sum $(basename {snakemake.log.log}) > $(basename {snakemake.log.log_md5}) ; popd +""" +) diff --git a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_clinical_patient.txt b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_clinical_patient.txt index 058e28d89..c9721aaac 100644 --- a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_clinical_patient.txt +++ b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_clinical_patient.txt @@ -1,4 +1,4 @@ -cancer_study_identifier: __CANCER_STUDY_IDENTIFIER__ +cancer_study_identifier: {cancer_study_id} genetic_alteration_type: CLINICAL datatype: PATIENT_ATTRIBUTES -data_filename: data_clinical_patients.txt +data_filename: data_clinical_patient.txt diff --git a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_clinical_sample.txt b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_clinical_sample.txt index 56600957f..1960d4df9 100644 --- a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_clinical_sample.txt +++ b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_clinical_sample.txt @@ -1,4 +1,4 @@ -cancer_study_identifier: __CANCER_STUDY_IDENTIFIER__ +cancer_study_identifier: {cancer_study_id} genetic_alteration_type: CLINICAL datatype: SAMPLE_ATTRIBUTES -data_filename: data_clinical_samples.txt +data_filename: data_clinical_sample.txt diff --git a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_CNA_gistic.txt b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_cna_gistic.txt similarity index 79% rename from snappy_wrappers/wrappers/cbioportal/meta_files/meta_CNA_gistic.txt rename to snappy_wrappers/wrappers/cbioportal/meta_files/meta_cna_gistic.txt index 4e6aae540..5e4a2d1ec 100644 --- a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_CNA_gistic.txt +++ b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_cna_gistic.txt @@ -1,8 +1,8 @@ -cancer_study_identifier: __CANCER_STUDY_IDENTIFIER__ +cancer_study_identifier: {cancer_study_id} genetic_alteration_type: COPY_NUMBER_ALTERATION datatype: DISCRETE stable_id: cna show_profile_in_analysis_tab: true profile_name: Pseudo-GISTIC computation profile_description: Putative copy-number from CNVkit. Values: -2 = homozygous deletion; -1 = hemizygous deletion; 0 = neutral / no change; 1 = gain; 2 = high level amplification. -data_filename: data_CNA_gistic.txt +data_filename: data_cna_gistic.txt diff --git a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_CNA_log2.txt b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_cna_log2.txt similarity index 71% rename from snappy_wrappers/wrappers/cbioportal/meta_files/meta_CNA_log2.txt rename to snappy_wrappers/wrappers/cbioportal/meta_files/meta_cna_log2.txt index 6e08ef1e6..033962f37 100644 --- a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_CNA_log2.txt +++ b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_cna_log2.txt @@ -1,8 +1,8 @@ -cancer_study_identifier: __CANCER_STUDY_IDENTIFIER__ +cancer_study_identifier: {cancer_study_id} genetic_alteration_type: COPY_NUMBER_ALTERATION datatype: LOG2-VALUE stable_id: log2CNA show_profile_in_analysis_tab: false profile_name: Log2 copy-number values profile_description: Log2 copy-number from CopywriteR -data_filename: data_CNA_log2.txt +data_filename: data_cna_log2.txt diff --git a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_expression.txt b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_expression.txt new file mode 100644 index 000000000..e6d5d0b5a --- /dev/null +++ b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_expression.txt @@ -0,0 +1,8 @@ +cancer_study_identifier: {cancer_study_id} +genetic_alteration_type: MRNA_EXPRESSION +datatype: CONTINUOUS +stable_id: rna_seq_mrna +show_profile_in_analysis_tab: true +profile_name: mRNA expression FPKMs +profile_description: Expression levels FPKMs +data_filename: data_expression.txt diff --git a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_expression_zscores.txt b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_expression_zscores.txt deleted file mode 100644 index 888f1a0d7..000000000 --- a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_expression_zscores.txt +++ /dev/null @@ -1,8 +0,0 @@ -cancer_study_identifier: __CANCER_STUDY_IDENTIFIER__ -genetic_alteration_type: MRNA_EXPRESSION -datatype: Z-SCORE -stable_id: rna_seq_mrna_median_Zscores -show_profile_in_analysis_tab: true -profile_name: mRNA expression z-scores -profile_description: Expression levels z-scores -data_filename: data_expression_zscores.txt diff --git a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_mutation_extended.txt b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_mutation_extended.txt index 2b6268856..2acb5919e 100644 --- a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_mutation_extended.txt +++ b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_mutation_extended.txt @@ -1,4 +1,4 @@ -cancer_study_identifier: __CANCER_STUDY_IDENTIFIER__ +cancer_study_identifier: {cancer_study_id} genetic_alteration_type: MUTATION_EXTENDED datatype: MAF stable_id: mutations diff --git a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_segment.txt b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_segment.txt index c680158f3..aee0c20aa 100644 --- a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_segment.txt +++ b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_segment.txt @@ -1,6 +1,6 @@ -cancer_study_identifier: __CANCER_STUDY_IDENTIFIER__ +cancer_study_identifier: {cancer_study_id} genetic_alteration_type: COPY_NUMBER_ALTERATION datatype: SEG -reference_genome_id: hg19 +reference_genome_id: {reference_genome} description: Somatic CNA data data_filename: data_segment.txt diff --git a/snappy_wrappers/wrappers/cbioportal/meta_files/meta_study.txt b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_study.txt new file mode 100644 index 000000000..3b8636cff --- /dev/null +++ b/snappy_wrappers/wrappers/cbioportal/meta_files/meta_study.txt @@ -0,0 +1,7 @@ +type_of_cancer: {type_of_cancer} +cancer_study_identifier: {cancer_study_id} +name: {study_name} +short_name: {study_name_short} +description: {study_description} +add_global_case_list: true +reference_genome: {reference_genome} diff --git a/snappy_wrappers/wrappers/cbioportal/meta_files/wrapper.py b/snappy_wrappers/wrappers/cbioportal/meta_files/wrapper.py index f54f976a5..7438944d6 100644 --- a/snappy_wrappers/wrappers/cbioportal/meta_files/wrapper.py +++ b/snappy_wrappers/wrappers/cbioportal/meta_files/wrapper.py @@ -3,15 +3,16 @@ See https://github.com/cBioPortal/cbioportal/blob/master/docs/File-Formats.md#clinical-data """ -from glob import glob import os -target_dir = "work/upload" source_dir = os.path.abspath(os.path.dirname(__file__)) -study_id = snakemake.config["step_config"]["cbioportal_export"]["cancer_study_id"] # For each template, replace study_id and write to output in work dir -for tpl in glob(os.path.join(source_dir, "meta*.txt")): - with open(tpl) as infile, open(os.path.join(target_dir, os.path.basename(tpl)), "w") as outfile: +for fn in snakemake.output: + gn = os.path.join(source_dir, os.path.basename(fn)) + assert os.path.exists(gn) + with open(gn, "rt") as infile, open(fn, "wt") as outfile: for line in infile: - outfile.write(line.replace("__CANCER_STUDY_IDENTIFIER__", study_id)) + outfile.write( + line.format(**snakemake.config["step_config"]["cbioportal_export"]["study"]) + ) diff --git a/snappy_wrappers/wrappers/cbioportal/plot_expression_distribution/environment.yaml b/snappy_wrappers/wrappers/cbioportal/plot_expression_distribution/environment.yaml deleted file mode 100644 index 5c44fa731..000000000 --- a/snappy_wrappers/wrappers/cbioportal/plot_expression_distribution/environment.yaml +++ /dev/null @@ -1,9 +0,0 @@ -channels: -- bioconda -- conda-forge -- anaconda -dependencies: -- r -- r-dplyr -- bioconductor-gsva -- bioconductor-cqn diff --git a/snappy_wrappers/wrappers/cbioportal/plot_expression_distribution/wrapper.py b/snappy_wrappers/wrappers/cbioportal/plot_expression_distribution/wrapper.py deleted file mode 100644 index 7b9aa2662..000000000 --- a/snappy_wrappers/wrappers/cbioportal/plot_expression_distribution/wrapper.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- -"""Wrapper for computing expression signatures from counts""" - -import os.path - -from snakemake import shell - -if len(snakemake.output.pdf) == 1: - snakemake.output.pdf = snakemake.output.pdf[0] -else: - raise - -sample_tpl = os.path.basename(os.path.dirname(os.path.dirname(snakemake.output.pdf))) -sample_dir = os.path.dirname(os.path.dirname(snakemake.output.pdf)) - -__author__ = "Clemens Messerschmidt " - -shell.executable("/bin/bash") - -shell( - r""" -set -x - -export TMPDIR=$(mktemp -d) -trap "rm -rf $TMPDIR" EXIT - -# Also pipe stderr to log file -if [[ -n "{snakemake.log}" ]]; then - if [[ "$(set +e; tty; set -e)" != "" ]]; then - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - exec 2> >(tee -a "{snakemake.log}" >&2) - else - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - echo "No tty, logging disabled" >"{snakemake.log}" - fi -fi - -# ------------------------------------------------------------------------------------------------- -# Write helper script and call R -# -cat <<"EOF" > $TMPDIR/compute_signatures.R -library( magrittr ) -library( methods ) # https://github.com/tidyverse/broom/issues/67 - -gene_exp = read.delim("{snakemake.input.tsv}", stringsAsFactors=FALSE) - -# genes of interest -# TODO make configurable -goi = read.table( - "/fast/groups/cubi/projects/2016-09-27_DKTK/pipeline/CLEMENS_misc/Vogelstein/Vogelstein_gene_names.txt", - quote="\"", comment.char="") - -sample = make.names("{sample_tpl}") -idx = which(sample == names(gene_exp)) - -m = as.matrix(gene_exp) -m = m[rownames(m) %in% goi$V1, ] - -print(dim(m)) - -dir.create("{sample_dir}") -pdf("{snakemake.output.pdf}") - -for (i in 1:nrow(m)) {{ - if (is.na(sum(m[i, ]))) continue - plot(density(m[i, ]), main=rownames(m)[i]) - abline(v=m[i, sample], col=2, lwd=3) -}} -dev.off() - -warnings() -sessionInfo() -EOF - -Rscript --vanilla $TMPDIR/compute_signatures.R -""" -) diff --git a/snappy_wrappers/wrappers/cbioportal/rank_expression/environment.yaml b/snappy_wrappers/wrappers/cbioportal/rank_expression/environment.yaml deleted file mode 100644 index f01afca99..000000000 --- a/snappy_wrappers/wrappers/cbioportal/rank_expression/environment.yaml +++ /dev/null @@ -1,12 +0,0 @@ -channels: -- bioconda -- conda-forge -- anaconda -dependencies: -- r -- r-dplyr -- bioconductor-edgeR -- bioconductor-DESeq2 -- bioconductor-org.hs.eg.db -- bioconductor-txdb.hsapiens.ucsc.hg19.knowngene -- openblas diff --git a/snappy_wrappers/wrappers/cbioportal/rank_expression/wrapper.py b/snappy_wrappers/wrappers/cbioportal/rank_expression/wrapper.py deleted file mode 100644 index a728f50c8..000000000 --- a/snappy_wrappers/wrappers/cbioportal/rank_expression/wrapper.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -"""Wrapper for computing expression values (RPKM) from counts""" - -import os.path - -from snakemake import shell - -sample_tpl = os.path.basename(os.path.dirname(os.path.dirname(snakemake.output.tsv))) - -__author__ = "Clemens Messerschmidt " - -shell.executable("/bin/bash") - -shell( - r""" -set -x - -export TMPDIR=$(mktemp -d) -trap "rm -rf $TMPDIR" EXIT - -# Also pipe stderr to log file -if [[ -n "{snakemake.log}" ]]; then - if [[ "$(set +e; tty; set -e)" != "" ]]; then - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - exec 2> >(tee -a "{snakemake.log}" >&2) - else - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - echo "No tty, logging disabled" >"{snakemake.log}" - fi -fi - -# ------------------------------------------------------------------------------------------------- -# Write helper script and call R -# -cat <<"EOF" > $TMPDIR/compute_zscores.R -library( magrittr ) -library( methods ) # https://github.com/tidyverse/broom/issues/67 - -gene_exp = read.delim("{snakemake.input.tsv}", stringsAsFactors=FALSE) - -# https://stackoverflow.com/a/36159165 -ranks = t(apply(-gene_exp, 1, rank)) - -zscores = t(apply(gene_exp, 1, scale)) - -sample = make.names("{sample_tpl}") -idx = which(sample == names(gene_exp)) - -res_df = cbind( - rownames(gene_exp), - zscores[ , idx], - log2(gene_exp[ , idx] + 0.001) - log2(apply(gene_exp, 1, median) + 0.001), - ranks[ , idx], - gene_exp[ , idx], - apply(gene_exp, 1, median), - apply(gene_exp, 1, max), - apply(gene_exp, 1, min)) - -colnames(res_df) = c("gene_symbol", - "z_score", - "logFC_to_cohort_median", - "cohort_rank", - "normalized_expression_in_sample", - "cohort_median", - "cohort_max", - "cohort_min") - -write.table(res_df, file = "{snakemake.output.tsv}", quote=F, row.names=F, sep="\t") - -warnings() -sessionInfo() -EOF - -Rscript --vanilla $TMPDIR/compute_zscores.R -""" -) diff --git a/snappy_wrappers/wrappers/cbioportal/rpkm_expression/environment.yaml b/snappy_wrappers/wrappers/cbioportal/rpkm_expression/environment.yaml deleted file mode 100644 index f01afca99..000000000 --- a/snappy_wrappers/wrappers/cbioportal/rpkm_expression/environment.yaml +++ /dev/null @@ -1,12 +0,0 @@ -channels: -- bioconda -- conda-forge -- anaconda -dependencies: -- r -- r-dplyr -- bioconductor-edgeR -- bioconductor-DESeq2 -- bioconductor-org.hs.eg.db -- bioconductor-txdb.hsapiens.ucsc.hg19.knowngene -- openblas diff --git a/snappy_wrappers/wrappers/cbioportal/rpkm_expression/scripts.R b/snappy_wrappers/wrappers/cbioportal/rpkm_expression/scripts.R deleted file mode 120000 index 87d0b3815..000000000 --- a/snappy_wrappers/wrappers/cbioportal/rpkm_expression/scripts.R +++ /dev/null @@ -1 +0,0 @@ -../scripts.R \ No newline at end of file diff --git a/snappy_wrappers/wrappers/cbioportal/rpkm_expression/wrapper.py b/snappy_wrappers/wrappers/cbioportal/rpkm_expression/wrapper.py deleted file mode 100644 index b63c4e889..000000000 --- a/snappy_wrappers/wrappers/cbioportal/rpkm_expression/wrapper.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -"""Wrapper for computing expression values (RPKM) from counts""" - -import os.path - -from snakemake import shell - -rcode = os.path.join(os.path.dirname(__file__), "scripts.R") - -__author__ = "Clemens Messerschmidt " - -shell.executable("/bin/bash") - -shell( - r""" -set -x - -export TMPDIR=$(mktemp -d) -trap "rm -rf $TMPDIR" EXIT - -# Also pipe stderr to log file -if [[ -n "{snakemake.log}" ]]; then - if [[ "$(set +e; tty; set -e)" != "" ]]; then - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - exec 2> >(tee -a "{snakemake.log}" >&2) - else - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - echo "No tty, logging disabled" >"{snakemake.log}" - fi -fi - -# ------------------------------------------------------------------------------------------------- -# Write helper script and call R -# -cat <<"EOF" > $TMPDIR/compute_rpkm.R -library( magrittr ) -library( methods ) # https://github.com/tidyverse/broom/issues/67 -source("{rcode}") - -mapping_df <- read.table("{snakemake.input.tsv}", sep="\t", header=1, stringsAsFactors=FALSE) -rpkm <- compute_rpkm(mapping_df) -write.table(rpkm, file="{snakemake.output.tsv}", sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE) - -warnings() -sessionInfo() -EOF - -Rscript --vanilla $TMPDIR/compute_rpkm.R -""" -) diff --git a/snappy_wrappers/wrappers/cbioportal/scripts.R b/snappy_wrappers/wrappers/cbioportal/scripts.R deleted file mode 100644 index a7a65b7c1..000000000 --- a/snappy_wrappers/wrappers/cbioportal/scripts.R +++ /dev/null @@ -1,496 +0,0 @@ -require(magrittr) - -#' Aggregates counts and computes RPKM -#' -#' The computation of RPKM is done using DESeq2::fpkm in robust mode (after library size estimation). -#' The gene lengths are estimated using the total span of all its exons, which will lead -#' to gene length over-estimation in most cases. -#' -#' @param df data frame describing expression counts & CNV gene calls files -#' @param count_input_format gene expression counts file format (only "feature_counts" supported) -#' @param tx_obj Bioconductor feature description object (human by default, either TxDb or EnsDb) -#' @param org_obj Bioconductor organism object (human by default) -#' @param pipeline_id type of ids used by the pipeline ("ENSEMBL" by default) -#' @param symbol_id Hugo_Symbol id name in org_obj ("SYMBOL" by default) -#' @param verbose show progress of the computation -#' -#' @return the RPKM data frame -#' @export -#' -#' @examples -compute_rpkm <- function(df, - count_input_format="feature_counts", - tx_obj=TxDb.Hsapiens.UCSC.hg19.knownGene::TxDb.Hsapiens.UCSC.hg19.knownGene, - org_obj=org.Hs.eg.db::org.Hs.eg.db, pipeline_id="ENSEMBL", symbol_id="SYMBOL", - verbose=FALSE) { - if (missing(df) || is.null(df) || - !is.data.frame(df) || nrow(df)<1 || - !all(c("ID", "count_filename", "gene_call_filename") %in% colnames(df))) - stop("Missing or illegal directory path") - if (any(is.na(df$ID) | df$ID=="") || any(duplicated(df$ID))) - stop("Illegal ID column") - if (is.null(count_input_format) || - !is.character(count_input_format) || length(count_input_format)!=1 || is.na(count_input_format)) - stop("Missing or illegal file format for gene expression counts") - count_input_format <- match.arg(count_input_format) - if (is.null(tx_obj) || !(is(tx_obj, "TxDb") || is(tx_obj, "EnsDb"))) - stop("Missing or illegal features description object") - if (is.null(org_obj) || !is(org_obj, "OrgDb")) - stop("Missing or illegal organism description object") - if (is.null(pipeline_id) || !is.character(pipeline_id) || length(pipeline_id)!=1 || is.na(pipeline_id) || - pipeline_id=="" || !(pipeline_id %in% AnnotationDbi::columns(org_obj))) - stop("Missing, illegal or unknown pipeline id type") - if (is.null(symbol_id) || !is.character(symbol_id) || length(symbol_id)!=1 || is.na(symbol_id) || - symbol_id=="" || !(symbol_id %in% AnnotationDbi::columns(org_obj))) - stop("Missing, illegal or unknown Hugo_Symbol id type") - - # Identify samples with expression files - has_expr <- !is.na(df$count_filename) & df$count_filename!="" & file.access(df$count_filename, mode=4)==0 - names(has_expr) <- as.character(df$ID) - if (!any(has_expr)) - stop("No valid gene expression count file") - - # Read counts counts - if (verbose) cat("Read expression counts ... ") - counts <- switch( - count_input_format, - feature_counts=read_featurecounts_files(df$count_filename[has_expr]) - ) - colnames(counts) <- df$ID[has_expr] - if (verbose) cat("Done\n") - - # Remove samples with no expression counts (all NA) - has_expr[colnames(counts)] <- has_expr[colnames(counts)] & (colSums(!is.na(counts))>0) - if (!any(has_expr)) - stop("No gene expression sample with valid expression counts") - counts <- counts[,colSums(!is.na(counts))>0,drop=FALSE] - - # Remap counts to ENTREZ gene ids - if (verbose) cat("Convert gene ids from ENSEMBL to ENTREZ ... ") - rownames(counts) <- sub("\\.[0-9]+$", "", rownames(counts)) - counts <- pipeline_to_entrez(counts, org_obj=org_obj, pipeline_id=pipeline_id) - if (verbose) cat("Done\n") - - # Append the gene locii to the counts in dds object - if (verbose) cat("Create DESeq2 object ... ") - genes <- GenomicFeatures::exonsBy(tx_obj, "gene") - genes <- genes[names(genes) %in% rownames(counts)] - counts <- counts[names(genes),] - donors <- data.frame(Donor=colnames(counts), stringsAsFactors=FALSE) - dds <- DESeq2::DESeqDataSetFromMatrix(counts, colData=donors, design=as.formula("~ 1"), rowRanges=genes) - if (verbose) cat("Done\n") - - # Compute FPKMs - if (verbose) cat("Compute FPKM ... ") - dds <- DESeq2::estimateSizeFactors(dds) - FPKM <- DESeq2::fpkm(dds, robust=TRUE) - if (verbose) cat("Done\n") - - # Make data frame with Hugo_Symbol, Entrez_Gene_Id and z-scores columns - if (verbose) cat("Add gene symbols ... ") - gene_names <- AnnotationDbi::select(org_obj, - keys=rownames(FPKM), - keytype="ENTREZID", - columns=c(symbol_id, "ENTREZID")) - if (is.null(gene_names) || !is.data.frame(gene_names) || nrow(gene_names)<1) - stop("Entrez_Gene_Id ids not found") - gene_names <- gene_names[!is.na(gene_names[[symbol_id]]) & !is.na(gene_names[["ENTREZID"]]),] - if (nrow(gene_names)==0) - stop("No valid mappings") - gene_names <- gene_names[,c(symbol_id, "ENTREZID")] - colnames(gene_names) <- c("Hugo_Symbol", "Entrez_Gene_Id") - - FPKM <- FPKM[rownames(FPKM) %in% as.character(gene_names$Entrez_Gene_Id),,drop=FALSE] - i <- match(rownames(FPKM), as.character(gene_names$Entrez_Gene_Id)) - FPKM <- data.frame(gene_names[i,], FPKM, stringsAsFactors=FALSE, check.names=FALSE) - rownames(FPKM) <- NULL - if (verbose) cat("Done\n") - - FPKM -} - -#' Aggregates counts and creates z-scores file -#' -#' Pipeline-implementation agnostic, location of files defined in the input data.frame -#' -#' @param df data frame describing expression counts & CNV gene calls files -#' @param count_input_format gene expression counts file format (only "feature_counts" supported) -#' @param gene_call_input_format CNV gene calls file format (only "cubi_pipeline" supported) -#' @param org_obj Bioconductor organism object (human by default) -#' @param pipeline_id type of ids used by the pipeline ("ENSEMBL" by default) -#' @param symbol_id Hugo_Symbol id name in org_obj ("SYMBOL" by default) -#' @param min_nb_diploid minimum number of diploid samples in order to compute z-scores (default 10) -#' @param verbose show progress of the computation -#' @param fast use vst instead of rlog to compute normalised expression -#' -#' @return the z_score data frame -#' @export -#' -#' @examples -compute_z_scores <- function(df, - count_input_format="feature_counts", - gene_call_input_format="cubi_pipeline", - org_obj=org.Hs.eg.db::org.Hs.eg.db, pipeline_id="ENSEMBL", symbol_id="SYMBOL", - min_nb_diploid=10, - verbose=FALSE, fast=FALSE) { - if (missing(df) || is.null(df) || - !is.data.frame(df) || nrow(df)<1 || - !all(c("ID", "count_filename", "gene_call_filename") %in% colnames(df))) - stop("Missing or illegal directory path") - if (any(is.na(df$ID) | df$ID=="") || any(duplicated(df$ID))) - stop("Illegal ID column") - if (is.null(count_input_format) || - !is.character(count_input_format) || length(count_input_format)!=1 || is.na(count_input_format)) - stop("Missing or illegal file format for gene expression counts") - count_input_format <- match.arg(count_input_format) - if (is.null(gene_call_input_format) || - !is.character(gene_call_input_format) || length(gene_call_input_format)!=1 || is.na(gene_call_input_format)) - stop("Missing or illegal file format for CNV gene calls") - gene_call_input_format <- match.arg(gene_call_input_format) - if (is.null(org_obj) || !is(org_obj, "OrgDb")) - stop("Missing or illegal organism description object") - if (is.null(pipeline_id) || !is.character(pipeline_id) || length(pipeline_id)!=1 || is.na(pipeline_id) || - pipeline_id=="" || !(pipeline_id %in% AnnotationDbi::columns(org_obj))) - stop("Missing, illegal or unknown pipeline id type") - if (is.null(symbol_id) || !is.character(symbol_id) || length(symbol_id)!=1 || is.na(symbol_id) || - symbol_id=="" || !(symbol_id %in% AnnotationDbi::columns(org_obj))) - stop("Missing, illegal or unknown Hugo_Symbol id type") - - # Identify samples with expression files - has_expr <- !is.na(df$count_filename) & df$count_filename!="" & file.access(df$count_filename, mode=4)==0 - names(has_expr) <- as.character(df$ID) - if (!any(has_expr)) - stop("No valid gene expression count file") - - # Read counts counts - if (verbose) cat("Read expression counts ... ") - counts <- switch( - count_input_format, - feature_counts=read_featurecounts_files(df$count_filename[has_expr]) - ) - colnames(counts) <- df$ID[has_expr] - if (verbose) cat("Done\n") - - # Remove samples with no expression counts (all NA) - has_expr[colnames(counts)] <- has_expr[colnames(counts)] & (colSums(!is.na(counts))>0) - if (!any(has_expr)) - stop("No gene expression sample with valid expression counts") - counts <- counts[,colSums(!is.na(counts))>0,drop=FALSE] - - # Remap counts to ENTREZ gene ids - if (verbose) cat("Convert gene ids from ENSEMBL to ENTREZ ... ") - rownames(counts) <- sub("\\.[0-9]+$", "", rownames(counts)) - counts <- pipeline_to_entrez(counts, org_obj=org_obj, pipeline_id=pipeline_id) - if (verbose) cat("Done\n") - - # Normalise counts - if (verbose) cat("Normalise expression ... ") - has_expr[colnames(counts)] <- has_expr[colnames(counts)] & (colSums(is.na(counts))==0) - counts <- counts[,colSums(is.na(counts))==0,drop=FALSE] # Required for DESeq2::DESeq - if (!any(has_expr)) - stop("No valid gene expression sample for normalisation") - expr <- normalise_counts(counts, verbose=verbose, fast=fast) - if (verbose) cat("Done\n") - - # Identify files with CNV gene calls and - has_cnv <- !is.na(df$gene_call_filename) & df$gene_call_filename!="" & file.access(df$gene_call_filename, mode=0)==0 - has_both <- has_expr & has_cnv - - cnv_calls <- NULL - if (any(has_both)) { - if (verbose) cat("Read CNV gene calls ... ") - cnv_calls <- switch( - gene_call_input_format, - cubi_pipeline=process_cnv_genes(df[has_both,] %>% dplyr::rename(filename=gene_call_filename)) - ) - rownames(cnv_calls) <- as.character(cnv_calls$Entrez_Gene_Id) - cnv_calls <- cnv_calls %>% dplyr::select(-Hugo_Symbol, -Entrez_Gene_Id) %>% as.matrix() - colnames(cnv_calls) <- df$ID[has_both] - if (verbose) cat("Done\n") - } - - # Compute z-scores (when no CNV calls are present, use all samples) - if (verbose) cat("Compute expression z-scores ... ") - z <- z_scores(expr, cnv_calls, min_nb_diploid=min_nb_diploid) - if (verbose) cat("Done\n") - - # Gene symbols from ENTREZ ids - if (verbose) cat("Add gene symbols ... ") - if (any(has_both)) { - gene_names <- process_cnv_genes(df[has_both,] %>% dplyr::rename(filename=gene_call_filename)) %>% - dplyr::select(Hugo_Symbol, Entrez_Gene_Id) - } else { - if (!all(c(symbol_id, "ENTREZID") %in% AnnotationDbi::columns(org_obj))) - stop("Missing/illegal organism database (OrgDb object)") - - gene_names <- AnnotationDbi::select(org_obj, - keys=rownames(z), - keytype="ENTREZID", - columns=c(symbol_id, "ENTREZID")) - if (is.null(gene_names) || !is.data.frame(gene_names) || nrow(gene_names)<1) - stop("Entrez_Gene_Id ids not found") - gene_names <- gene_names[!is.na(gene_names[[symbol_id]]) & !is.na(gene_names[["ENTREZID"]]),] - if (nrow(gene_names)==0) - stop("No valid mappings") - gene_names <- gene_names[,c(symbol_id, "ENTREZID")] - colnames(gene_names) <- c("Hugo_Symbol", "Entrez_Gene_Id") - } - if (verbose) cat("Done\n") - - # Make data frame with Hugo_Symbol, Entrez_Gene_Id and z-scores columns - z <- z[rownames(z) %in% as.character(gene_names$Entrez_Gene_Id),,drop=FALSE] - i <- match(rownames(z), as.character(gene_names$Entrez_Gene_Id)) - z <- data.frame(gene_names[i,], z, stringsAsFactors=FALSE, check.names=FALSE) - rownames(z) <- NULL - - z -} - -#' Compute gene expression z-scores from diploid samples -#' -#' @param norm_expr normalised expression matrix -#' @param cnv_calls matrix of calls (0 for diploid) -#' @param min_nb_diploid minimum number of diploid samples in order to compute z-scores (default 10) -#' -#' @return a matrix of z scores -#' @export -#' -#' @examples -z_scores <- function(norm_expr, cnv_call=NULL, min_nb_diploid=10) { - if (missing(norm_expr) || is.null(norm_expr) || - !is.matrix(norm_expr) || nrow(norm_expr)<1 || ncol(norm_expr)<1 || - !is.numeric(norm_expr) || any(is.na(norm_expr)) || - is.null(rownames(norm_expr)) || any(is.na(rownames(norm_expr))) || any(rownames(norm_expr)=="") || - is.null(colnames(norm_expr)) || any(is.na(colnames(norm_expr))) || any(colnames(norm_expr)=="")) - stop("Missing/illegal normalised expression matrix") - if (is.null(min_nb_diploid) || !is.numeric(min_nb_diploid) || length(min_nb_diploid)!=1 || - is.na(min_nb_diploid) || min_nb_diploid<0) - stop("Missing/illegal minimum number of diploid samples") - if (min_nb_diploid<3) min_nb_diploid <- 3 - - filter <- matrix(TRUE, nrow=nrow(norm_expr), ncol=ncol(norm_expr), dimnames=dimnames(norm_expr)) - - if (!is.null(cnv_call)) { - if (!is.matrix(cnv_call) || nrow(cnv_call)<1 || ncol(cnv_call)<1 || - is.null(rownames(cnv_call)) || any(is.na(rownames(cnv_call))) || any(rownames(cnv_call)=="") || - is.null(colnames(cnv_call)) || any(is.na(colnames(cnv_call))) || any(colnames(cnv_call)=="")) - stop("Illegal gene-based copy-number matrix") - cnv_call <- !is.na(cnv_call) & cnv_call==0 - cnv_call <- cnv_call[rownames(cnv_call) %in% rownames(norm_expr),colnames(cnv_call) %in% colnames(norm_expr),drop=FALSE] - if (nrow(cnv_call)>0 & ncol(cnv_call)>0) - filter[rownames(cnv_call),colnames(cnv_call)] <- cnv_call - } - - tmp <- norm_expr - tmp[!filter] <- as.numeric(NA) - N <- rowSums(!is.na(tmp)) - m <- rowMeans(tmp, na.rm=TRUE) - s <- apply(tmp, 1, sd, na.rm=TRUE) - - s[s==0 | N 0) { - tmp[[i]] <- tmp[[i]][tmp[[i]]$Geneid %in% ids,,drop=FALSE] - if (nrow(tmp[[i]])<1 || any(is.na(tmp[[i]]$Geneid)) || any(duplicated(tmp[[i]]$Geneid))) - next - counts[tmp[[i]]$Geneid,i] <- tmp[[i]][,ncol(tmp[[i]])] - } - } - - counts -} - -#' Remap ids for gene expression count matrix -#' -#' Given a gene expression count matrix with ids stored as row names, the function maps these ids to ENTREZ ids, -#' and outputs a gene expression count matrix with ENTREZ ids as rownames. -#' -#' When several original ids map to the same ENTREZ id, the output value will be the median of each input entry. -#' -#' @param pip_counts Gene expression count matrix, with gene ids as row names -#' @param org_obj Bioconductor organism description object containing mappings between original & ENTREZ gene ids (default: human) -#' @param pipeline_id type of ids stored in the pip_counts row names ("ENSEMBL" by default) -#' @param FUNC which value to use in presence of multiple pipeline genes for one ENTREZ gene (default: max) -#' -#' @return gene expression count matrix for ENTREZ genes -#' @export -#' -#' @examples -pipeline_to_entrez <- function(pip_counts, org_obj=org.Hs.eg.db::org.Hs.eg.db, pipeline_id="ENSEMBL", FUNC=max) { - if (missing(pip_counts) || is.null(pip_counts) || - !is.matrix(pip_counts) || nrow(pip_counts)<1 || ncol(pip_counts)<1 || - !is.numeric(pip_counts) || - is.null(rownames(pip_counts)) || any(is.na(rownames(pip_counts))) || any(rownames(pip_counts)=="")) - stop("Missing/illegal counts matrix") - if (is.null(pipeline_id) || !is.character(pipeline_id) || length(pipeline_id)!=1 || is.na(pipeline_id) || - pipeline_id=="") - stop("Missing, illegal or unknown pipeline id type") - if (pipeline_id == "ENTREZID") return(pip_counts) - if (is.null(org_obj) || !is(org_obj, "OrgDb") || - !all(c(pipeline_id, "ENTREZID") %in% AnnotationDbi::columns(org_obj))) - stop("Missing/illegal organism database (OrgDb object)") - - ids <- AnnotationDbi::select(org_obj, - keys=rownames(pip_counts), - keytype=pipeline_id, - columns=c(pipeline_id, "ENTREZID")) - if (is.null(ids) || !is.data.frame(ids) || nrow(ids)<1) - stop("Pipeline ids not found") - ids <- ids[!is.na(ids[,pipeline_id]) & !is.na(ids[,"ENTREZID"]),] - if (nrow(ids)==0) - stop("No valid mappings") - ids[,pipeline_id] <- as.character(ids[,pipeline_id]) - ids[,"ENTREZID"] <- as.character(ids[,"ENTREZID"]) - - i <- split(ids[,pipeline_id], ids[,"ENTREZID"]) - i1 <- i[lengths(i)==1] - i2 <- i[lengths(i)>1] - - ent_counts <- c() - if (length(i1)>0) { - i1 <- unlist(i1) - tmp <- pip_counts[i1,] - rownames(tmp) <- names(i1) - ent_counts <- rbind(ent_counts, tmp) - } - if (length(i2)>0) { - tmp <- t(sapply(i2, function(j) apply(pip_counts[j,,drop=FALSE], 2, FUNC))) - ent_counts <- rbind(ent_counts, tmp) - } - - round(ent_counts) -} - -#' Normalise gene expression counts on regularised log scale -#' -#' @param counts gene expression count matrix (must be integer) -#' @param verbose DESeq2 normalisation progress messages -#' @param fast use vst instead of rlog to compute normalised expression -#' -#' @return matrix of normalised expression on regularised log scale -#' @export -#' -#' @examples -normalise_counts <- function(counts, verbose=FALSE, fast=FALSE) { - if (missing(counts) || is.null(counts) || - !is.matrix(counts) || nrow(counts)<1 || ncol(counts)<1 || - !is.numeric(counts) || any(is.na(counts)) || any(counts<0) || - is.null(rownames(counts)) || any(is.na(rownames(counts))) || any(rownames(counts)=="") || - is.null(colnames(counts)) || any(is.na(colnames(counts))) || any(colnames(counts)=="")) - stop("Missing/illegal counts matrix") - - donors <- data.frame(Donor=colnames(counts), stringsAsFactors=FALSE) - - normalised <- DESeq2::DESeqDataSetFromMatrix( - countData=counts, colData=donors, design=as.formula("~ 1"), tidy=FALSE - ) - normalised <- DESeq2::DESeq(normalised, betaPrior=TRUE, quiet=!verbose) - if (fast) { - normalised <- DESeq2::vst(normalised, blind=TRUE) - } else { - normalised <- DESeq2::rlog(normalised, blind=TRUE) - } - SummarizedExperiment::assay(normalised) -} - -#' Merge gene-based CNV results -#' -#' @param df gene calls file names -#' -#' @return data.frame with one row per gene and one column per donor. -#' The first two columns are Hugo_Symbol (HGNC gene name) & Entrez_Gene_Id. -#' Only genes with positive ENTREZ ids are returned. -#' @export -#' -#' @examples -process_cnv_genes <- function(df) { - if (missing(df) || is.null(df) || !is.data.frame(df) || nrow(df)==0) - stop("Missing or illegal CNV files data frame") - - df <- df %>% - dplyr::filter(!is.na(filename) & file.access(filename, mode=4)==0) - - unprocessed <- c() - rslt <- NULL - for (i in 1:nrow(df)) { - x <- read.table(df$filename[i], sep="\t", header=1, stringsAsFactors=FALSE, check.names=FALSE) - x <- x[rowSums(is.na(x))==0,] - - # Workaround a bug in the first versions of the copywriter target_seq_cnv_calling step - if (colnames(x)[1] == "Hugo_Gene_Symbol") colnames(x)[1] <- "Hugo_Symbol" - - if (ncol(x) != 3 || !all(colnames(x)[1:2] == c("Hugo_Symbol", "Entrez_Gene_Id"))) { - unprocessed <- c(unprocessed, df$ID[i]) - next - } - - if (is.null(rslt)) { - rslt <- x[,1:2] - ref_hash <- paste(rslt$Hugo_Symbol, rslt$Entrez_Gene_Id, sep="\t") - } - - x_hash <- paste(x$Hugo_Symbol, x$Entrez_Gene_Id, sep="\t") - - rslt <- rslt[ref_hash %in% x_hash,] - ref_hash <- ref_hash[ref_hash %in% x_hash] - x <- x[match(ref_hash, x_hash),] - - rslt <- cbind(rslt, x[,3]) - colnames(rslt)[ncol(rslt)] <- df$ID[i] - } - - if (length(unprocessed) > 0) - warning("Gene CNA data could not be processed for donors ", paste(unprocessed, collapse=", ")) - - if (all(grepl("^ *[+-]?[0-9]+ *$", rslt$Entrez_Gene_Id))) { - rslt$Entrez_Gene_Id <- as.integer(rslt$Entrez_Gene_Id) - if ("Entrez_Gene_Id" %in% colnames(rslt)) - rslt <- rslt %>% dplyr::filter(Entrez_Gene_Id>0) - } else { - warning("Non-numerical Entrez_Gene_Id records") - } - - if (any(duplicated(rslt$Entrez_Gene_Id))) { - warning("Duplicated ENTREZ genes ", - paste(unique(rslt$Entrez_Gene_Id[duplicated(rslt$Entrez_Gene_Id)]), collapse=", ")) - rslt <- rslt[!duplicated(rslt$Entrez_Gene_Id),] - } - - rslt -} - diff --git a/snappy_wrappers/wrappers/cbioportal/study_meta/environment.yaml b/snappy_wrappers/wrappers/cbioportal/study_meta/environment.yaml deleted file mode 100644 index 40e802f1b..000000000 --- a/snappy_wrappers/wrappers/cbioportal/study_meta/environment.yaml +++ /dev/null @@ -1 +0,0 @@ -name: cbio_meta_study diff --git a/snappy_wrappers/wrappers/cbioportal/study_meta/wrapper.py b/snappy_wrappers/wrappers/cbioportal/study_meta/wrapper.py deleted file mode 100644 index 18cdae52a..000000000 --- a/snappy_wrappers/wrappers/cbioportal/study_meta/wrapper.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -"""cbioportal metadata helper functions""" - - -def create_study_meta_file(config, outfile): - """Write study meta file, given study metadata""" - s = "\n".join( - [ - "type_of_cancer: {type_of_cancer}", - "cancer_study_identifier: {cancer_study_id}", - "name: {study_name}", - "short_name: {study_name_short}", - "description: {study_description}", - "add_global_case_list: true", - ] - ).format( - type_of_cancer=config["step_config"]["cbioportal_export"]["type_of_cancer"], - cancer_study_id=config["step_config"]["cbioportal_export"]["cancer_study_id"], - study_description=config["step_config"]["cbioportal_export"]["study_description"], - study_name=config["step_config"]["cbioportal_export"]["study_name"], - study_name_short=config["step_config"]["cbioportal_export"]["study_name_short"], - ) - with open(outfile, "w") as out: - out.write(s) - out.write("\n") - - -create_study_meta_file(snakemake.config, snakemake.output.meta_file) diff --git a/snappy_wrappers/wrappers/cbioportal/zscores/environment.yaml b/snappy_wrappers/wrappers/cbioportal/zscores/environment.yaml deleted file mode 100644 index 8a1dc15af..000000000 --- a/snappy_wrappers/wrappers/cbioportal/zscores/environment.yaml +++ /dev/null @@ -1,11 +0,0 @@ -channels: -- bioconda -- conda-forge -- anaconda -dependencies: -- r >=3.6 -- r-dplyr -- bioconductor-DESeq2 >=1.26 -- bioconductor-org.hs.eg.db -- bioconductor-txdb.hsapiens.ucsc.hg19.knowngene -- openblas diff --git a/snappy_wrappers/wrappers/cbioportal/zscores/scripts.R b/snappy_wrappers/wrappers/cbioportal/zscores/scripts.R deleted file mode 120000 index 87d0b3815..000000000 --- a/snappy_wrappers/wrappers/cbioportal/zscores/scripts.R +++ /dev/null @@ -1 +0,0 @@ -../scripts.R \ No newline at end of file diff --git a/snappy_wrappers/wrappers/cbioportal/zscores/snappy-run-zscores.R b/snappy_wrappers/wrappers/cbioportal/zscores/snappy-run-zscores.R deleted file mode 100644 index 001e88508..000000000 --- a/snappy_wrappers/wrappers/cbioportal/zscores/snappy-run-zscores.R +++ /dev/null @@ -1,376 +0,0 @@ -#' Aggregates counts and creates z-scores file -#' -#' Pipeline-implementation agnostic, location of files defined in the input data.frame -#' -#' @param df data frame describing expression counts & CNV gene calls files -#' @param count_input_format gene expression counts file format (only "feature_counts" supported) -#' @param gene_call_input_format CNV gene calls file format (only "cubi_pipeline" supported) -#' @param org_obj Bioconductor organism object (human by default) -#' @param pipeline_id type of ids used by the pipeline ("ENSEMBL" by default) -#' @param symbol_id Hugo_Symbol id name in org_obj ("SYMBOL" by default) -#' @param min_nb_diploid minimum number of diploid samples in order to compute z-scores (default 10) -#' @param verbose show progress of the computation -#' @param fast use vst instead of rlog to compute normalised expression -#' -#' @return the z_score data frame -#' @export -#' -#' @examples -compute_z_scores <- function( - df, - count_input_format="feature_counts", - gene_call_input_format="cubi_pipeline", - org_obj=org.Hs.eg.db::org.Hs.eg.db, pipeline_id="ENSEMBL", symbol_id="SYMBOL", - min_nb_diploid=10, - verbose=FALSE, fast=FALSE -) { - if (missing(df) || is.null(df) || !is.data.frame(df) || nrow(df)<1 || - !all(c("ID", "count_filename", "gene_call_filename") %in% colnames(df))) - stop("Missing or illegal directory path") - if (any(is.na(df$ID) | df$ID=="") || any(duplicated(df$ID))) - stop("Illegal ID column") - if (is.null(count_input_format) || - !is.character(count_input_format) || length(count_input_format)!=1 || is.na(count_input_format)) - stop("Missing or illegal file format for gene expression counts") - count_input_format <- match.arg(count_input_format) - if (is.null(gene_call_input_format) || !is.character(gene_call_input_format) || length(gene_call_input_format)!=1 || is.na(gene_call_input_format)) - stop("Missing or illegal file format for CNV gene calls") - gene_call_input_format <- match.arg(gene_call_input_format) - if (is.null(org_obj) || !is(org_obj, "OrgDb")) - stop("Missing or illegal organism description object") - if (is.null(pipeline_id) || !is.character(pipeline_id) || length(pipeline_id)!=1 || is.na(pipeline_id) || - pipeline_id=="" || !(pipeline_id %in% AnnotationDbi::columns(org_obj))) - stop("Missing, illegal or unknown pipeline id type") - if (is.null(symbol_id) || !is.character(symbol_id) || length(symbol_id)!=1 || is.na(symbol_id) || - symbol_id=="" || !(symbol_id %in% AnnotationDbi::columns(org_obj))) - stop("Missing, illegal or unknown Hugo_Symbol id type") - - # Identify samples with expression files - has_expr <- !is.na(df$count_filename) & df$count_filename!="" & file.access(df$count_filename, mode=4)==0 - names(has_expr) <- as.character(df$ID) - if (!any(has_expr)) - stop("No valid gene expression count file") - - # Read counts counts - if (verbose) cat("Read expression counts ... ") - counts <- switch( - count_input_format, - feature_counts=read_featurecounts_files(df$count_filename[has_expr]) - ) - colnames(counts) <- df$ID[has_expr] - rownames(counts) <- sub("\\.[0-9]+$", "", rownames(counts)) - if (verbose) cat("Done\n") - - # Remove samples with no expression counts (all NA) - has_expr[colnames(counts)] <- has_expr[colnames(counts)] & (colSums(!is.na(counts))>0) - if (!any(has_expr)) - stop("No gene expression sample with valid expression counts") - counts <- counts[,colSums(!is.na(counts))>0,drop=FALSE] - - # Remap counts to ENTREZ gene ids - if (verbose) cat("Convert gene ids from ENSEMBL to ENTREZ ... ") - counts <- pipeline_to_entrez(counts, org_obj=org_obj, pipeline_id=pipeline_id) - if (verbose) cat("Done\n") - - # Normalise counts - if (verbose) cat("Normalise expression ... ") - has_expr[colnames(counts)] <- has_expr[colnames(counts)] & (colSums(is.na(counts))==0) - counts <- counts[,colSums(is.na(counts))==0,drop=FALSE] # Required for DESeq2::DESeq - if (!any(has_expr)) - stop("No valid gene expression sample for normalisation") - expr <- normalise_counts(counts, verbose=verbose, fast=fast) - if (verbose) cat("Done\n") - - # Identify files with CNV gene calls and - has_cnv <- !is.na(df$gene_call_filename) & df$gene_call_filename!="" & file.access(df$gene_call_filename, mode=0)==0 - has_both <- has_expr & has_cnv - - cnv_calls <- NULL - if (any(has_both)) { - if (verbose) cat("Read CNV gene calls ... ") - cnv_calls <- switch( - gene_call_input_format, - cubi_pipeline=process_cnv_genes(df[has_both,] %>% dplyr::rename(filename=gene_call_filename)) - ) - - rownames(cnv_calls) <- as.character(cnv_calls$Entrez_Gene_Id) - cnv_calls <- cnv_calls %>% dplyr::select(-Hugo_Symbol, -Entrez_Gene_Id) %>% as.matrix() - colnames(cnv_calls) <- df$ID[has_both] - if (verbose) cat("Done\n") - } - - # Compute z-scores (when no CNV calls are present, use all samples) - if (verbose) cat("Compute expression z-scores ... ") - z <- z_scores(expr, cnv_calls, min_nb_diploid=min_nb_diploid) - if (verbose) cat("Done\n") - - # Gene symbols from ENTREZ ids - if (verbose) cat("Add gene symbols ... ") - if (any(has_both)) { - gene_names <- process_cnv_genes(df[has_both,] %>% dplyr::rename(filename=gene_call_filename)) %>% - dplyr::select(Hugo_Symbol, Entrez_Gene_Id) - } else { - if (!all(c(symbol_id, "ENTREZID") %in% AnnotationDbi::columns(org_obj))) - stop("Missing/illegal organism database (OrgDb object)") - - gene_names <- AnnotationDbi::select( - org_obj, - keys=rownames(z), - keytype="ENTREZID", - columns=c(symbol_id, "ENTREZID") - ) - if (is.null(gene_names) || !is.data.frame(gene_names) || nrow(gene_names)<1) - stop("Entrez_Gene_Id ids not found") - gene_names <- gene_names[!is.na(gene_names$SYMBOL) & !is.na(gene_names$ENTREZID),] - if (nrow(gene_names)==0) - stop("No valid mappings") - colnames(gene_names) <- c("Hugo_Symbol", "Entrez_Gene_Id") - } - if (verbose) cat("Done\n") - - # Make data frame with Hugo_Symbol, Entrez_Gene_Id and z-scores columns - z <- z[rownames(z) %in% as.character(gene_names$Entrez_Gene_Id),,drop=FALSE] - i <- match(rownames(z), as.character(gene_names$Entrez_Gene_Id)) - z <- data.frame(gene_names[i,], z, stringsAsFactors=FALSE, check.names=FALSE) - rownames(z) <- NULL - - z -} - - -#' Read feature_count output files -#' -#' @param fns feature counts output file names -#' -#' @return a numeric matrix of counts, with gene ids as row names -#' @export -#' -#' @examples -read_featurecounts_files <- function(fns) { - if (missing(fns) || !is.character(fns) || length(fns)==0 || sum(!is.na(fns) & fns!="")==0) - stop("Missing/illegal featurecounts file names") - - tmp <- lapply(fns, function(x) { - if (is.na(x) || x=="" || !file.exists(x) || file.access(x, mode=4)!=0) - return(data.frame(Geneid=as.character(), Counts=as.integer(), stringsAsFactors=FALSE)) - read.table(x, sep="\t", header=1, stringsAsFactors=FALSE) - }) - - ids <- unique(unlist(lapply(tmp, function(x) x$Geneid))) - ids <- ids[!is.na(ids)] - if( length(ids) == 0) - stop("No readable non-empty featurecounts file") - - counts <- matrix(as.numeric(NA), nrow=length(ids), ncol=length(tmp), dimnames=list(ids, fns)) - for (i in 1:length(tmp)) { - if (nrow(tmp[[i]]) > 0) - counts[tmp[[i]]$Geneid,i] <- tmp[[i]][,ncol(tmp[[i]])] - } - - counts -} - - -#' Remap ids for gene expression count matrix -#' -#' Given a gene expression count matrix with ids stored as row names, the function maps these ids to ENTREZ ids, -#' and outputs a gene expression count matrix with ENTREZ ids as rownames. -#' -#' When several original ids map to the same ENTREZ id, the output value will be the median of each input entry. -#' -#' @param pip_counts Gene expression count matrix, with gene ids as row names -#' @param org_obj Bioconductor organism description object containing mappings between original & ENTREZ gene ids (default: human) -#' @param pipeline_id type of ids stored in the pip_counts row names ("ENSEMBL" by default) -#' -#' @return gene expression count matrix for ENTREZ genes -#' @export -#' -#' @examples -pipeline_to_entrez <- function(pip_counts, org_obj=org.Hs.eg.db::org.Hs.eg.db, pipeline_id="ENSEMBL") { - if (missing(pip_counts) || is.null(pip_counts) || !is.matrix(pip_counts) || nrow(pip_counts)<1 || ncol(pip_counts)<1 || - !is.numeric(pip_counts) || is.null(rownames(pip_counts)) || any(is.na(rownames(pip_counts))) || any(rownames(pip_counts)=="")) - stop("Missing/illegal counts matrix") - if (is.null(pipeline_id) || !is.character(pipeline_id) || length(pipeline_id)!=1 || is.na(pipeline_id) || pipeline_id=="") - stop("Missing, illegal or unknown pipeline id type") - if (pipeline_id == "ENTREZID") return(pip_counts) - if (is.null(org_obj) || !is(org_obj, "OrgDb") || !all(c(pipeline_id, "ENTREZID") %in% AnnotationDbi::columns(org_obj))) - stop("Missing/illegal organism database (OrgDb object)") - - ids <- AnnotationDbi::select( - org_obj, - keys=rownames(pip_counts), - keytype=pipeline_id, - columns=c(pipeline_id, "ENTREZID") - ) - if (is.null(ids) || !is.data.frame(ids) || nrow(ids)<1) - stop("Pipeline ids not found") - ids <- ids[!is.na(ids[,pipeline_id]) & !is.na(ids[,"ENTREZID"]),] - if (nrow(ids)==0) - stop("No valid mappings") - ids[,pipeline_id] <- as.character(ids[,pipeline_id]) - ids[,"ENTREZID"] <- as.character(ids[,"ENTREZID"]) - - i <- split(ids[,pipeline_id], ids[,"ENTREZID"]) - i1 <- i[lengths(i)==1] - i2 <- i[lengths(i)>1] - - ent_counts <- c() - if (length(i1)>0) { - i1 <- unlist(i1) - tmp <- pip_counts[i1,,drop=FALSE] - rownames(tmp) <- names(i1) - ent_counts <- rbind(ent_counts, tmp) - } - if (length(i2)>0) { - tmp <- sapply(i2, function(j) apply(pip_counts[j,,drop=FALSE], 2, median)) - tmp <- t(matrix(as.vector(tmp), nrow=ncol(pip_counts), ncol=length(i2), dimnames=list(colnames(pip_counts), names(i2)))) - ent_counts <- rbind(ent_counts, tmp) - } - - round(ent_counts) -} - - -#' Normalise gene expression counts on regularised log scale -#' -#' @param counts gene expression count matrix (must be integer) -#' @param verbose DESeq2 normalisation progress messages -#' @param fast use vst instead of rlog to compute normalised expression -#' -#' @return matrix of normalised expression on regularised log scale -#' @export -#' -#' @examples -normalise_counts <- function(counts, verbose=FALSE, fast=FALSE) { - if (missing(counts) || is.null(counts) || !is.matrix(counts) || nrow(counts)<1 || ncol(counts)<1 || - !is.numeric(counts) || any(is.na(counts)) || any(counts<0) || - is.null(rownames(counts)) || any(is.na(rownames(counts))) || any(rownames(counts)=="") || - is.null(colnames(counts)) || any(is.na(colnames(counts))) || any(colnames(counts)=="")) - stop("Missing/illegal counts matrix") - - donors <- data.frame(Donor=colnames(counts), stringsAsFactors=FALSE) - - normalised <- DESeq2::DESeqDataSetFromMatrix( - countData=counts, colData=donors, design=as.formula("~ 1"), tidy=FALSE - ) - normalised <- DESeq2::DESeq(normalised, betaPrior=TRUE, quiet=!verbose) - if (fast) { - normalised <- DESeq2::vst(normalised, blind=TRUE) - } else { - normalised <- DESeq2::rlog(normalised, blind=TRUE) - } - SummarizedExperiment::assay(normalised) -} - - - -#' Merge gene-based CNV results -#' -#' @param df gene calls file names -#' -#' @return data.frame with one row per gene and one column per donor. -#' The first two columns are Hugo_Symbol (HGNC gene name) & Entrez_Gene_Id. -#' Only genes with positive ENTREZ ids are returned. -#' @export -#' -#' @examples -process_cnv_genes <- function(df) { - if (missing(df) || is.null(df) || !is.data.frame(df) || nrow(df)==0) - stop("Missing or illegal CNV files data frame") - - df <- df %>% - dplyr::filter(!is.na(filename) & file.access(filename, mode=4)==0) - - unprocessed <- c() - rslt <- NULL - for (i in 1:nrow(df)) { - x <- read.table(df$filename[i], sep="\t", header=1, stringsAsFactors=FALSE, check.names=FALSE) - x <- x[rowSums(is.na(x))==0,] - - # Workaround a bug in the first versions of the copywriter target_seq_cnv_calling step - if (colnames(x)[1] == "Hugo_Gene_Symbol") colnames(x)[1] <- "Hugo_Symbol" - - if (ncol(x) != 3 || !all(colnames(x)[1:2] == c("Hugo_Symbol", "Entrez_Gene_Id"))) { - unprocessed <- c(unprocessed, df$ID[i]) - next - } - - if (is.null(rslt)) { - rslt <- x[,1:2] - ref_hash <- paste(rslt$Hugo_Symbol, rslt$Entrez_Gene_Id, sep="\t") - } - - x_hash <- paste(x$Hugo_Symbol, x$Entrez_Gene_Id, sep="\t") - - rslt <- rslt[ref_hash %in% x_hash,] - ref_hash <- ref_hash[ref_hash %in% x_hash] - x <- x[match(ref_hash, x_hash),] - - rslt <- cbind(rslt, x[,3]) - colnames(rslt)[ncol(rslt)] <- df$ID[i] - } - - if (length(unprocessed) > 0) - warning("Gene CNA data could not be processed for donors ", paste(unprocessed, collapse=", ")) - - if (all(grepl("^ *[+-]?[0-9]+ *$", rslt$Entrez_Gene_Id))) { - rslt$Entrez_Gene_Id <- as.integer(rslt$Entrez_Gene_Id) - if ("Entrez_Gene_Id" %in% colnames(rslt)) - rslt <- rslt %>% dplyr::filter(Entrez_Gene_Id>0) - } else { - warning("Non-numerical Entrez_Gene_Id records") - } - - if (any(duplicated(rslt$Entrez_Gene_Id))) { - warning("Duplicated ENTREZ genes ", paste(unique(rslt$Entrez_Gene_Id[duplicated(rslt$Entrez_Gene_Id)]), collapse=", ")) - rslt <- rslt[!duplicated(rslt$Entrez_Gene_Id),] - } - - rslt -} - - - -#' Compute gene expression z-scores from diploid samples -#' -#' @param norm_expr normalised expression matrix -#' @param cnv_calls matrix of calls (0 for diploid) -#' @param min_nb_diploid minimum number of diploid samples in order to compute z-scores (default 10) -#' -#' @return a matrix of z scores -#' @export -#' -#' @examples -z_scores <- function(norm_expr, cnv_call=NULL, min_nb_diploid=10) { - if (missing(norm_expr) || is.null(norm_expr) || !is.matrix(norm_expr) || nrow(norm_expr)<1 || ncol(norm_expr)<1 || - !is.numeric(norm_expr) || any(is.na(norm_expr)) || - is.null(rownames(norm_expr)) || any(is.na(rownames(norm_expr))) || any(rownames(norm_expr)=="") || - is.null(colnames(norm_expr)) || any(is.na(colnames(norm_expr))) || any(colnames(norm_expr)=="")) - stop("Missing/illegal normalised expression matrix") - if (is.null(min_nb_diploid) || !is.numeric(min_nb_diploid) || length(min_nb_diploid)!=1 || is.na(min_nb_diploid) || min_nb_diploid<0) - stop("Missing/illegal minimum number of diploid samples") - if (min_nb_diploid<3) min_nb_diploid <- 3 - - filter <- matrix(TRUE, nrow=nrow(norm_expr), ncol=ncol(norm_expr), dimnames=dimnames(norm_expr)) - - if (!is.null(cnv_call)) { - if (!is.matrix(cnv_call) || nrow(cnv_call)<1 || ncol(cnv_call)<1 || - is.null(rownames(cnv_call)) || any(is.na(rownames(cnv_call))) || any(rownames(cnv_call)=="") || - is.null(colnames(cnv_call)) || any(is.na(colnames(cnv_call))) || any(colnames(cnv_call)=="")) - stop("Illegal gene-based copy-number matrix") - cnv_call <- !is.na(cnv_call) & cnv_call==0 - cnv_call <- cnv_call[rownames(cnv_call) %in% rownames(norm_expr),colnames(cnv_call) %in% colnames(norm_expr),drop=FALSE] - if (nrow(cnv_call)>0 & ncol(cnv_call)>0) - filter[rownames(cnv_call),colnames(cnv_call)] <- cnv_call - } - - tmp <- norm_expr - tmp[!filter] <- as.numeric(NA) - N <- rowSums(!is.na(tmp)) - m <- rowMeans(tmp, na.rm=TRUE) - s <- apply(tmp, 1, sd, na.rm=TRUE) - - s[s==0 | N >(tee -a "{snakemake.log}" >&2) - else - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - echo "No tty, logging disabled" >"{snakemake.log}" - fi -fi - -# ------------------------------------------------------------------------------------------------- -# Write helper script and call R -# -cat <<"EOF" > $TMPDIR/compute_zscores.R -library( magrittr ) -library( methods ) # https://github.com/tidyverse/broom/issues/67 -source( "{rscript}" ) - -zscores_mapping_df <- read.table("{snakemake.input.tsv}", sep="\t", head=1, stringsAsFactors=FALSE) - -zscores = compute_z_scores(df = zscores_mapping_df, min_nb_diploid=5) - -mapping_df <- read.table("{snakemake.input.tsv}", sep="\t", header=1, stringsAsFactors=FALSE) -zscores = compute_z_scores(df = mapping_df, min_nb_diploid=5) -write.table(zscores, file="{snakemake.output.tsv}", sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE) - -warnings() -sessionInfo() -EOF - -Rscript --vanilla $TMPDIR/compute_zscores.R -""" -) diff --git a/snappy_wrappers/wrappers/cnvkit/postprocess/environment.yaml b/snappy_wrappers/wrappers/cnvkit/postprocess/environment.yaml new file mode 100644 index 000000000..e936461b1 --- /dev/null +++ b/snappy_wrappers/wrappers/cnvkit/postprocess/environment.yaml @@ -0,0 +1,7 @@ +channels: +- conda-forge +- bioconda +- r +dependencies: +- r-base +- bioconductor-genomicranges diff --git a/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py b/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py new file mode 100644 index 000000000..f79a46585 --- /dev/null +++ b/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +"""Wrapper vor cnvkit.py call +""" + +from snakemake.shell import shell + +__author__ = "Manuel Holtgrewe" +__email__ = "manuel.holtgrewe@bih-charite.de" + +shell( + r""" +# Also pipe everything to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec &> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +set -x + +# ----------------------------------------------------------------------------- + +cat << _EOF | R --vanilla --slave +segments <- read.table("{snakemake.input.segment}", sep="\t", header=1, stringsAsFactors=FALSE) +stopifnot(all(c("chromosome", "start", "end") %in% colnames(segments))) +calls <- read.table("{snakemake.input.call}", sep="\t", header=1, stringsAsFactors=FALSE) +stopifnot(all(c("chromosome", "start", "end", "cn") %in% colnames(calls))) + +# Trim segments to avoid edge effects with calls +segments[,"start"] <- segments[["start"]]+1 +segments[,"end"] <- segments[["end"]]-1 +segments <- segments[segments[["end"]]-segments[["start"]]>0,] + +r1 <- GenomicRanges::GRanges( + seqnames=segments[["chromosome"]], + ranges=IRanges::IRanges(start=segments[["start"]], end=segments[["end"]]), + strand="*" +) +r2 <- GenomicRanges::GRanges( + seqnames=calls[["chromosome"]], + ranges=IRanges::IRanges(start=calls[["start"]], end=calls[["end"]]), + strand="*" +) + +i <- GenomicRanges::findOverlaps(r1, r2, ignore.strand=TRUE) +stopifnot(!any(duplicated(S4Vectors::queryHits(i)))) + +# Default value: diploid segment (number of copies = 2) +segments[,"cn"] <- 2 +segments[S4Vectors::queryHits(i),"cn"] <- calls[S4Vectors::subjectHits(i),"cn"] + +# Reset segment boundaries to original values +segments[,"start"] <- segments[["start"]]-1 +segments[,"end"] <- segments[["end"]]+1 + +write.table(segments, file="{snakemake.output.final}", sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE) +_EOF + +d=$(dirname "{snakemake.output.final}") +pushd $d +fn=$(basename "{snakemake.output.final}") +md5sum $fn > $fn.md5 +popd +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/rseqc/wrapper.py b/snappy_wrappers/wrappers/rseqc/wrapper.py index f8f1b2067..93730e6b8 100644 --- a/snappy_wrappers/wrappers/rseqc/wrapper.py +++ b/snappy_wrappers/wrappers/rseqc/wrapper.py @@ -1,13 +1,22 @@ # -*- coding: utf-8 -*- -"""CUBI+Snakemake wrapper code for FeatureCounts: Snakemake wrapper.py +"""CUBI+Snakemake wrapper code for infer_experiment: Snakemake wrapper.py """ +import os + from snakemake import shell __author__ = "Clemens Messerschmidt " shell.executable("/bin/bash") +current_step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][current_step]["strandedness"] +out_link_dir = ( + os.path.dirname(snakemake.output.output) if "output" in snakemake.output.keys() else "" +) +log_link_dir = os.path.dirname(snakemake.output.log) if "log" in snakemake.output.keys() else "" + shell( r""" set -euo pipefail @@ -17,63 +26,114 @@ export TMPDIR=$(mktemp -d) trap "rm -rf $TMPDIR" EXIT +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + + # Also pipe stderr to log file -if [[ -n "{snakemake.log}" ]]; then +if [[ -n "{snakemake.log.log}" ]]; then if [[ "$(set +e; tty; set -e)" != "" ]]; then - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - exec 2> >(tee -a "{snakemake.log}" >&2) + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) else - rm -f "{snakemake.log}" && mkdir -p $(dirname {snakemake.log}) - echo "No tty, logging disabled" >"{snakemake.log}" + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" fi fi -# Run rseqc to infer strandedness +# ----- Run rseqc to infer strandedness infer_experiment.py \ - -r "{snakemake.config[step_config][gene_expression_quantification][strandedness][path_exon_bed]}" \ + -r "{config[path_exon_bed]}" \ -i "{snakemake.input.bam}" \ > "{snakemake.output.tsv}" -md5sum {snakemake.output.tsv} > {snakemake.output.tsv_md5} +# ----- Parse rseqc infer_experiment output +pattern="^This is (Pair|Single)End Data$" +endedness=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") + +pattern="^Fraction of reads failed to determine: *([+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([EeDd][+-]?[0-9]+)?)$" +failed=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") -# Set strandedness based on input parameter or inferred value -strand={snakemake.config[step_config][gene_expression_quantification][strand]} -if [ ${{strand}} -eq -1 ] +if [[ "$endedness" = "Single" ]] then - pattern="^This is (Pair|Single)End Data$" - endedness=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") - - pattern="^Fraction of reads failed to determine: *([+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([EeDd][+-]?[0-9]+)?)$" - failed=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") - - if [ "$endedness" == "Single" ] - then - pattern="^Fraction of reads explained by \"\\+\\+,\\-\\-\": *([+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([EeDd][+-]?[0-9]+)?)$" - forward=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") - pattern="^Fraction of reads explained by \"\\+\\-,\\-\\+\": *([+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([EeDd][+-]?[0-9]+)?)$" - reverse=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") - else - pattern="^Fraction of reads explained by \"1\\+\\+,1\\-\\-,2\\+\\-,2\\-\\+\": *([+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([EeDd][+-]?[0-9]+)?)$" - forward=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") - pattern="^Fraction of reads explained by \"1\\+\\-,1\\-\\+,2\\+\\+,2\\-\\-\": *([+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([EeDd][+-]?[0-9]+)?)$" - reverse=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") - fi + pattern="^Fraction of reads explained by \"\\+\\+,\\-\\-\": *([+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([EeDd][+-]?[0-9]+)?)$" + forward=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") + pattern="^Fraction of reads explained by \"\\+\\-,\\-\\+\": *([+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([EeDd][+-]?[0-9]+)?)$" + reverse=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") +else + pattern="^Fraction of reads explained by \"1\\+\\+,1\\-\\-,2\\+\\-,2\\-\\+\": *([+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([EeDd][+-]?[0-9]+)?)$" + forward=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") + pattern="^Fraction of reads explained by \"1\\+\\-,1\\-\\+,2\\+\\+,2\\-\\-\": *([+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([EeDd][+-]?[0-9]+)?)$" + reverse=$(grep -E "$pattern" {snakemake.output.tsv} | sed -E "s/$pattern/\1/") +fi - reverse=$(echo $reverse | tr '[Dde]' 'E') +forward=$(echo $forward | tr '[Dde]' 'E') +reverse=$(echo $reverse | tr '[Dde]' 'E') - strand=0 - if [ $(echo "$forward > {snakemake.config[step_config][gene_expression_quantification][strandedness][threshold]}" | bc -l) -gt 0 ] - then - strand=1 - fi - if [ $(echo "$reverse > {snakemake.config[step_config][gene_expression_quantification][strandedness][threshold]}" | bc -l) -gt 0 ] - then - strand=2 - fi +# ----- Infer protocol strandedness +infer=0 +if [ $(echo "$forward > {config[threshold]}" | bc -l) -gt 0 ] +then + infer=1 +fi +if [ $(echo "$reverse > {config[threshold]}" | bc -l) -gt 0 ] +then + infer=2 fi -# Write strandedness -echo ${{strand}} > {snakemake.output.decision} -md5sum {snakemake.output.decision} > {snakemake.output.decision_md5} +decision="{config[strand]}" +if [[ $decision -eq -1 ]] +then + decision=$infer +fi + +# ----- Write outputs +md5=$(cat {config[path_exon_bed]} | md5sum | sed -e "s/ .*//") +cat << __EOF > {snakemake.output.decision} +{{ + "library_name": "{snakemake.wildcards[library_name]}", + "bed_path": "{config[path_exon_bed]}", + "bed_file_md5": "$md5", + "bam_path": "{snakemake.input.bam}", + "strand_from_user": "{config[strand]}, + "strand_from_infer": "$decision", + "decision_threshold": {config[threshold]}, + "endedness": "$endedness", + "fraction_forward": $forward, + "fraction_reverse": $reverse, + "fraction_failed": $failed, + "decision": "$decision" +}} +__EOF + +pushd $(dirname {snakemake.output.decision}) +md5sum $(basename {snakemake.output.decision}) > $(basename {snakemake.output.decision}).md5 +md5sum $(basename {snakemake.output.tsv}) > $(basename {snakemake.output.tsv}).md5 +popd + +if [[ -n "{out_link_dir}" ]]; +then + ln -sr {snakemake.output.decision} {out_link_dir}/. + ln -sr {snakemake.output.decision}.md5 {out_link_dir}/. +fi +if [[ -n "{log_link_dir}" ]]; +then + ln -sr {snakemake.log.log} {log_link_dir}/. + ln -sr {snakemake.log.log}.md5 {log_link_dir}/. + ln -sr {snakemake.log.conda_list} {log_link_dir}/. + ln -sr {snakemake.log.conda_list}.md5 {log_link_dir}/. + ln -sr {snakemake.log.conda_info} {log_link_dir}/. + ln -sr {snakemake.log.conda_info}.md5 {log_link_dir}/. +fi +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} """ ) diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/action.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/action.py new file mode 100644 index 000000000..8980f01a8 --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/action.py @@ -0,0 +1,10 @@ +from enum import Enum + + +class Action(Enum): + ERROR = 0 + STOP = 1 + SKIP = 2 + IGNORE = 3 + DEFAULT = 4 + OK = 5 diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/annotation.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/annotation.py new file mode 100644 index 000000000..d89af88bc --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/annotation.py @@ -0,0 +1,166 @@ +import re +import typing + +import exceptions +import vcfpy + + +class Annotation: + """Process jannovar ANN or vep CSQ INFO entries + + The configuration file must contain the INFO identifier (typically ANN or CSQ), and + regular expression to extract of column headers, and to split the annotation items. + For example, the configuration for annotations created by jannovar would be: + annotations: + id: "ANN" + extract: "^Functional annotations:'(.+)'$" + split: "\\|" + + The vcf header must be first parsed, to extract the column headers of the various + annotated fields. Then, the values of the records can be obtained. + + When there are multiple alternative alleles, annotations might be specific to a + particular one. In that case, there must be one column specifying the alternative + allele in the annotation. This information can be provided in the configuration by: + annotations: + id: "CSQ" + allele: "Allele" + """ + + def __init__( + self, + annotation_id: str, + extract: str, + split: str, + allele_column: str = None, + minimize: bool = False, + ): + """Create annotation object + + :param annotation_id: annotation ID in the vcf INFO fields + :param extract: regular expression string to extract column headers from the Description field + :param split: regular expression string to split the extracted contents of the Description field into column headers + :param allele_column: annotation column header to extract the alt allele (or None, when this information isn't present) + :param minimize: minimization of variants to patch a VEP bug + """ + if annotation_id is None or annotation_id == "": + raise exceptions.MissingValue("Missing annotation ID") + if not extract or not split: + raise exceptions.MissingValue( + 'Missing patterns for extraction "{}" or for split "{}"'.format(extract, split) + ) + self.annotation_id = annotation_id + self.allele_column = allele_column + self.columns = [] + self.extract = re.compile(extract) + self.split = re.compile(split) + self.minimize = minimize + self.minimizer = None + + def parseHeader(self, header: vcfpy.Header): + """Parse vcf header to extract annotation column headers + + :param header: vcf header as vcfpy.Header object + """ + ann_header = header.get_info_field_info(self.annotation_id) + if not ann_header: + raise exceptions.MissingValue( + 'Annotation "{}" cannot be found in vcf INFO fields'.format(self.annotation_id) + ) + m = self.extract.match(ann_header.description) + if m: + self.columns = self.split.split(m.group(1)) + else: + raise exceptions.IllegalValue( + 'Column headers can\'t be extracted from description "{}" by pattern "{}"'.format( + ann_header.description, self.extract + ) + ) + if self.allele_column: + if self.allele_column not in self.columns: + raise exceptions.MissingValue( + 'Allele column "{}" not in annotation "{}" columns {}'.format( + self.allele_column, self.annotation_id, self.columns + ) + ) + + def set_minimizer(self, record: vcfpy.Record): + """Create a minimizer object for alternate alleles + + ENSEMBL VEP annotates vcf records with minimized alternative allele sequence, + even without [`--minimal` option](https://www.ensembl.org/info/docs/tools/vep/script/vep_options.html). + This undocumented feature is discussed in a [closed issue on github](https://github.com/Ensembl/ensembl-vep/issues/1264) + + To ensure that all variants are correctly processed, a minimizer must be created, + to match the sequences of the input and minimised variants. + This minimizer must be created for each record. + + :param record: vcf record + """ + minimisation = record.REF + for alt in record.ALT: + a = alt.value + i = 0 + while i < len(minimisation) and i < len(a) and minimisation[i] == a[i]: + i += 1 + if i < len(minimisation): + if i == 0: + minimisation = None + break + else: + minimisation = minimisation[:i] + if minimisation: + self.minimizer = {} + n = len(minimisation) + for alt in record.ALT: + if len(alt.value) == n: + self.minimizer["-"] = alt.value + else: + self.minimizer[alt.value[n:]] = alt.value + else: + self.minimizer = None + + def getAnnotations(self, record: vcfpy.Record) -> typing.Dict[str, typing.List[typing.Any]]: + """Extract annotations from a vcf record + + Depending on the choice of annotation software, there can be multiple annotations for a single variant. + The annotations may also depend on the alternative allele (when more than one are present). + The annotations are returned as a dict with the alternative alleles are keys. + If the annotations are allele-dependent, they are attributed to the allele, otherwise + all annotations are made available to all alleles. + For each allele, the annotations are given as a dict, with the column name as key, + and the list of annotations for that column as value. + + :param record: vcf record as vcfpy.Record object + :return: dict of of dict of annotation lists + """ + if record is None: + raise exceptions.MissingValue("Missing vcf record") + ann = record.INFO[self.annotation_id] + if not isinstance(ann, list): + ann = [ann] + alts = [alt.value for alt in record.ALT] + values = {} + for theColumn in self.columns: + values[theColumn] = {alt: None for alt in alts} + for a in ann: + one_ann = self._get_one_annotation(a) + storeAlts = self.columns + if self.allele_column and one_ann[self.allele_column] in alts: + storeAlts = [one_ann[self.allele_column]] + for k, v in one_ann.items(): + for alt in storeAlts: + if values[k][alt] is None: + values[k][alt] = [] + values[k][alt].append(v) + + return values + + def _get_one_annotation(self, annotation: str) -> typing.Dict[str, str]: + values = self.split.split(annotation) + assert len(values) == len(self.columns) + values = [x if x else None for x in values] + result = dict(zip(self.columns, values)) + if self.allele_column and self.minimizer and result[self.allele_column] in self.minimizer: + result[self.allele_column] = self.minimizer[result[self.allele_column]] + return result diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/common_functions.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/common_functions.py new file mode 100644 index 000000000..6429233be --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/common_functions.py @@ -0,0 +1,119 @@ +import re + + +def minimize_mutation(x, args): + assert isinstance(x, list) and len(x) == 3 + assert isinstance(x[0], list) and len(x[0]) == 1 + assert isinstance(x[1], list) and len(x[1]) == 1 + assert isinstance(x[2], list) and len(x[2]) == 1 + pos = int(x[0][0]) + ref = x[1][0] + alt = x[2][0] + + assert args is not None and isinstance(args, dict) and "return_value" in args.keys() + + # print("DEBUG- on input: pos = {}, ref = {}, alt = {}".format(pos, ref, alt)) + + i = 0 + # Trim common left part + while i < len(ref) and i < len(alt): + if ref[i] != alt[i]: + break + pos += 1 + i += 1 + if i == len(ref) and i == len(alt): + raise Exception("Reference and alternate sequences are identical") + ref = ref[i:] + alt = alt[i:] + + # print("DEBUG- on after left trim: pos = {}, ref = {}, alt = {}".format(pos, ref, alt)) + + # Trim common right part + i = 0 + while i < len(ref) and i < len(alt): + if ref[-i - 1] != alt[-i - 1]: + if i > 0: + ref = ref[:-i] + alt = alt[:-i] + break + i += 1 + + end = pos + len(ref) - 1 + + # print("DEBUG- on output: pos = {}, ref = {}, alt = {}".format(pos, ref, alt)) + + if ref == "": + ref = "-" + end = pos + pos -= 1 + if alt == "": + alt = "-" + + return_value = args["return_value"] + if return_value == "pos": + return [pos] + elif return_value == "ref": + return [ref] + elif return_value == "alt": + return [alt] + elif return_value == "end": + return [end] + else: + raise Exception('Unexpected return value request "{}"'.format(return_value)) + + +def calc_end_pos(x, args): + assert isinstance(x, list) and len(x) == 3 + assert isinstance(x[0], list) and len(x[0]) == 1 + assert isinstance(x[1], list) and len(x[1]) == 1 + assert isinstance(x[2], list) and len(x[2]) == 1 + pos = int(x[0][0]) + ref = x[1][0] + alt = x[2][0] + d = len(alt) - len(ref) + if d <= 0: + end = pos + len(ref) - 1 + else: + end = pos + 1 + return [end] + + +def variant_type(x, args=None): + assert isinstance(x, list) and len(x) == 2 + assert isinstance(x[0], list) and len(x[0]) == 1 + assert isinstance(x[1], list) and len(x[1]) == 1 + ref = x[0][0].replace("-", "") + alt = x[1][0].replace("-", "") + if len(ref) < len(alt): + variant_type = "INS" + elif len(ref) > len(alt): + variant_type = "DEL" + elif len(ref) == 0: + raise Exception("Empty reference & alternative allele sequences") + elif len(ref) == 1: + variant_type = "SNP" + elif len(ref) == 2: + variant_type = "DNP" + elif len(ref) == 3: + variant_type = "TNP" + else: + variant_type = "ONP" + return [variant_type] + + +strip_sequence_version_pattern = re.compile("\.[0-9]+$") # noqa: W605 + + +def strip_sequence_version(x, args): + if x is None: + return None + assert isinstance(x, list) and len(x) == 1 + if x[0] is None: + return None + no_version = list() + for el in x[0]: + if el is None: + no_version.append(None) + else: + no_version.append(strip_sequence_version_pattern.sub("", el)) + return no_version diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/config.yaml b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/config.yaml new file mode 100644 index 000000000..f442a1e04 --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/config.yaml @@ -0,0 +1,781 @@ +annotation: # Definition of annotations from VEP + id: "CSQ" # INFO field ID (unless change with --vcf_info_field option) + allele: "Allele" # Variant used to calculate consequence (https://www.ensembl.org/info/docs/tools/vep/vep_formats.html#defaultout) + extract: "^Consequence annotations from Ensembl VEP. Format: (.+)$" # Regular expression to extract annotation names from the description of INFO field. The annotation names are in group 1 + split: "\\|" # Regular expression to split annotations (& annotation names) from the INFO field + minimize: True # Variant minimization applied by VEP (see https://www.ensembl.org/info/docs/tools/vep/script/vep_other.html#colocated) + + +output: # Output columns definition + + Hugo_Symbol: # Column name to output HGNC Symbol + input: # Required input + - set: "annotation" # The "SYMBOL" annotation column contains the requested information + column: "SYMBOL" + on_missing: skip # Genomic regions variants are not attached to genes, skip them on output + + Entrez_Gene_Id: # Column name to output NCBI ID + input: + - set: "annotation" # VEP doesn't provide NCBI gene ids (formerly ENTREZ gene ids) + column: "SYMBOL" # The column value is obtained by mapping the HGNC symbol + function: "map" # The "map" function is invoked with one input (the annotation SYMBOL), + args: # and one named argument, the mapping file (fixed for all variants) + filename: "hgnc_symbol_to_entrez_id.tsv" + on_missing: default # When no Entrez id is not for a symbol, the value is set to 0 + default: 0 + + Center: # Sequencing or processing center name + input: + - set: "constant" # The value is defined on the (optional) command-line arguments + column: "Center" # The argument is --Center + on_missing: default + default: "BIH" # When missing, the value "BIH" is used. + + NCBI_Build: + input: + - set: "constant" + column: "NCBI_Build" + on_missing: default + default: "GRCh37" + + Chromosome: # Sequence name + input: + - set: "fixed" # The input is taken from the vcf fixed field "CHROM" + column: "CHROM" + on_missing: stop # This field must be present. When absent, the program stops with an error + + Start_Position: # Position of the start of the variant. + input: # Note that vcf2maf.pl transforms the variant (position & allele sequences) + - set: "fixed" # to minimize them (see https://www.ensembl.org/info/docs/tools/vep/script/vep_other.html). + column: "POS" # This is *NOT* compatible with variant normalization as defined in + on_missing: stop # https://genome.sph.umich.edu/wiki/Variant_Normalization + - set: "variant" # The function "minimize_mutation" performs variant minimization, + column: "REF" # so the output is (should be) identical to anything produced by vcf2maf.pl + on_missing: stop # If the user wants to keep the variant definition as in the vcf file, + - set: "variant" # the configuration should be updated, and the "Start_Position" column should be + column: "ALT" # defined similarly to the "Chromosome" column, simply copying the contents of + on_missing: stop # the vcf's "POS" column. + function: "minimize_mutation" # The same applies to the columns describing the reference & alternate allele sequences, + args: # "Reference_Allele", "Tumor_Seq_Allele1" & "Tumor_Seq_Allele2", which should be + return_value: "pos" # copied from vcf columns "REF", "REF" & "ALT" respectively. + on_missing: stop + + End_Position: # Position of the end of the variant + input: # This information is missing from the vcf + - set: "fixed" # It is reconstituted from the start position, and the lengths of the reference & alternative alleles + column: "POS" # The program stop if either values are missing. + on_missing: stop + - set: "variant" # If the user want to keep the variant definition as in the vcf file, + column: "REF" # another function is provided, which doesn't alter the variant's starting position, + on_missing: stop # and simply computes the end of the variant locus as: + - set: "variant" # POS + length(reference allele sequence) - 1 for substitutions & deletions, and + column: "ALT" # POS + 1 for insertions + on_missing: stop + function: "minimize_mutation" # This alternative function is "calc_end_pos". + args: # It takes the same input as "minimize_mutation", but with additional arguments. + return_value: "end" # "calc_end_pos" assumes that the variant is normalized. + on_missing: stop + + Strand: + input: + - set: "constant" + column: "Strand" + on_missing: default + default: "+" + + Variant_Classification: # Variant classification + input: # Maps the VEP variant classification defined in + - set: "annotation" # https://www.ensembl.org/info/genome/variation/prediction/predicted_data.html#consequences + column: "Consequence" # to the cBioPortal/TCGA/GDC set of consequences defined in + - set: "annotation" # https://docs.gdc.cancer.gov/Encyclopedia/pages/Mutation_Annotation_Format_TCGAv2/ + column: "VARIANT_CLASS" # Additional mapping values & methods were taken directly from the vcf2maf.pl code in + - set: "variant" # routine GetVariantClassification (https://github.com/mskcc/vcf2maf hash d13e404 2022-11-02) + column: "REF" + - set: "variant" # Note that a simple mapping was not possible, because the algorithm requires + column: "ALT" # the knowledge of substitution, insertion or deletion to assign some values. + function: "variant_classification" + on_missing: default + default: "" + + Variant_Type: # Variant type (SNP/DNP/TNP/ONP/INS/DEL). + input: # The type "Consolidated" is not implemented. + - set: "variant" + column: "REF" # The function "variant_type" outputs the type based only on the length of + - set: "variant" # reference & alternative allele sequences. + column: "ALT" + function: "variant_type" + on_missing: default + default: "" + + Reference_Allele: # Reference allele (should be identical to the reference genome at the locus) + input: # Rather, it is taken from the normal homozygous allele. + - set: "fixed" + column: "POS" # The configuration is set so that the vcf2maf.pl behaviour is reproduced. + on_missing: stop # If the user want to keep the variant definition as in the vcf file instead, + - set: "variant" # the configuration should be set so that the vcf "REF" column is simply copied + column: "REF" # to the output column ("Reference_Allele"). + on_missing: stop + - set: "variant" + column: "ALT" + on_missing: stop + function: "minimize_mutation" + args: + return_value: "ref" + on_missing: stop + + Tumor_Seq_Allele1: # Unmutated allele in the tumor sample + input: + - set: "fixed" + column: "POS" # The configuration is set so that the vcf2maf.pl behaviour is reproduced. + on_missing: stop # If the user want to keep the variant definition as in the vcf file instead, + - set: "variant" # the configuration should be set so that the vcf "REF" column is simply copied + column: "REF" # to the output column ("Tumor_Seq_Allele1"). + on_missing: stop + - set: "variant" + column: "ALT" + on_missing: stop + function: "minimize_mutation" + args: + return_value: "ref" + on_missing: stop + + Tumor_Seq_Allele2: # Mutated allele in the tumor sample + input: + - set: "fixed" + column: "POS" # The configuration is set so that the vcf2maf.pl behaviour is reproduced. + on_missing: stop # If the user want to keep the variant definition as in the vcf file instead, + - set: "variant" # the configuration should be set so that the vcf "ALT" column is simply copied + column: "REF" # to the output column ("Tumor_Seq_Allele2"). + on_missing: stop + - set: "variant" + column: "ALT" + on_missing: stop + function: "minimize_mutation" + args: + return_value: "alt" + on_missing: stop + + dbSNP_RS: # dbSNP references + input: # Note that VEP also includes COSMIC references in that field. + - set: "annotation" # TODO: create a function that parses the vcf field, extracts only the dbSNP + column: "Existing_variation" # ids and collapses them into a single strings separated by semicolumns. + on_missing: default + default: "novel" + + dbSNP_Val_Status: + input: + - set: "constant" + column: "dbSNP_Val_Status" + on_missing: default + default: "" + + Tumor_Sample_Barcode: + input: + - set: "constant" + column: "tumor_id" + on_missing: default + default: "tumor" + + Matched_Normal_Sample_Barcode: + input: + - set: "constant" + column: "normal_id" + on_missing: default + default: "normal" + + Match_Norm_Seq_Allele1: # Match normal allele1. + input: # Should be identical to "Tumor_Allele1", but instead is set to the reference genome sequence + - set: "fixed" + column: "POS" # The configuration is set so that the vcf2maf.pl behaviour is reproduced. + on_missing: stop # If the user want to keep the variant definition as in the vcf file instead, + - set: "variant" # the configuration should be set so that the vcf "REF" column is simply copied + column: "REF" # to the output column ("Tumor_Seq_Allele1"). + on_missing: stop + - set: "variant" + column: "ALT" + on_missing: stop + function: "minimize_mutation" + args: + return_value: "ref" + on_missing: stop + + Match_Norm_Seq_Allele2: # Match normal allele2 (the allele mutated in the tumor) + input: + - set: "fixed" + column: "POS" # The configuration is set so that the vcf2maf.pl behaviour is reproduced. + on_missing: stop # If the user want to keep the variant definition as in the vcf file instead, + - set: "variant" # the configuration should be set so that the vcf "REF" column is simply copied + column: "REF" # to the output column ("Tumor_Seq_Allele1"). + on_missing: stop + - set: "variant" + column: "ALT" + on_missing: stop + function: "minimize_mutation" + args: + return_value: "ref" + on_missing: stop + + Tumor_Validation_Allele1: # Validation not implemented. All fields are empty + input: + - set: "constant" + column: "Tumor_Validation_Allele1" + on_missing: default + default: "" + + Tumor_Validation_Allele2: # Validation not implemented. All fields are empty + input: + - set: "constant" + column: "Tumor_Validation_Allele2" + on_missing: default + default: "" + + Match_Norm_Validation_Allele1: # Validation not implemented. All fields are empty + input: + - set: "constant" + column: "Match_Norm_Validation_Allele1" + on_missing: default + default: "" + + Match_Norm_Validation_Allele2: # Validation not implemented. All fields are empty + input: + - set: "constant" + column: "Match_Norm_Validation_Allele1" + on_missing: default + default: "" + + Verification_Status: + input: + - set: "constant" + column: "Verification_Status" + on_missing: default + default: "Unknown" + + Validation_Status: + input: + - set: "constant" + column: "Validation_Status" + on_missing: default + default: "Unknown" + + Mutation_Status: + input: + - set: "constant" + column: "Mutation_Status" + on_missing: default + default: "Somatic" + + Sequencing_Phase: + input: + - set: "constant" + column: "Sequencing_Phase" + on_missing: default + default: "Unknown" + + Sequence_Source: + input: + - set: "constant" + column: "Sequence_Source" + on_missing: default + default: "Unknown" + + Validation_Method: + input: + - set: "constant" + column: "Validation_Method" + on_missing: default + default: "Unknown" + + Score: + input: + - set: "constant" + column: "Score" + on_missing: default + default: "" + + BAM_File: + input: + - set: "constant" + column: "BAM_File" + on_missing: default + default: "" + + Sequencer: + input: + - set: "constant" + column: "Sequencer" + on_missing: default + default: "" + + Tumor_Sample_UUID: + input: + - set: "constant" + column: "Tumor_Sample_UUID" + on_missing: default + default: "" + + Matched_Norm_Sample_UUID: + input: + - set: "constant" + column: "Matched_Norm_Sample_UUID" + on_missing: default + default: "" + + # Start of supplementary columns not defined in ----------------------------------------------- + # https://docs.gdc.cancer.gov/Encyclopedia/pages/Mutation_Annotation_Format_TCGAv2/ ----------- + + # The columns belows are all defined in ------------------------------------------------------- + # https://docs.gdc.cancer.gov/Data/File_Formats/MAF_Format/#notes-about-gdc-maf-implementation + # Note that some columns are commented out, and will not be part of the output. --------------- + + HGVSc: + input: + - set: "annotation" + column: "HGVSc" + on_missing: default + default: "" + + HGVSp: + input: + - set: "annotation" + column: "HGVSp" + on_missing: default + default: "" + + HGVSp_Short: # Short version of the protein mutation defined in + input: # VEP annotation column "HGVSp" + - set: "annotation" + column: "HGVSp" # The function "parse_protein_mutation" removed the + function: "parse_protein_mutation" # sequence identifier, and replaces 3-letter amino-acid codes + args: # with single letter amino-acid codes. + add_sequence: False # The arguments "add_sequence", "want_short" & "want_long" + want_short: True # allow the user to change this behaviour. + want_long: False + on_missing: skip + # default: "" + + Transcript_ID: + input: + - set: "annotation" + column: "Feature" + on_missing: default + default: "" + + Exon_Number: # VEP annotates the exon number & the total number of exons in the transcript. + input: # It is unclear what the MAF documentation requires. + - set: "annotation" + column: "EXON" + on_missing: default + default: "" + + t_depth: # Read depth in the tumor sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "tumor" + column: "DP" + on_missing: default + default: "" + + t_ref_count: # Reference allele read counts in the tumor sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "tumor" + column: "AD[REF]" + on_missing: default + default: "" + + t_alt_count: # Alternative allele read counts in the tumor sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "tumor" + column: "AD[0]" + on_missing: default + default: "" + + n_depth: # Read depth in the normal sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "normal" + column: "DP" + on_missing: default + default: "" + + n_ref_count: # Reference allele read counts in the normal sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "normal" + column: "AD[REF]" + on_missing: default + default: "" + + n_alt_count: # Alternative allele read counts in the normal sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "normal" + column: "AD[0]" + on_missing: default + default: "" + + Protein_Position: + input: + - set: "annotation" + column: "Protein_position" + on_missing: default + default: "" + + SWISSPROT: + input: + - set: "annotation" + column: "SWISSPROT" + on_missing: default + default: "" + function: "strip_sequence_version" + + # The columns below are not mentioned at all in the cBioPortal documentation ------------------ + # (https://docs.cbioportal.org/file-formats/#mutation-data) ----------------------------------- + # They are displayed in the order they are found in the GDC documentation, -------------------- + # except for "Protein_Position" & "SWISSPROT" which are mentioned as -------------------------- + # optional columns in cBioPortal. ------------------------------------------------------------- + + # all_effects + + Allele: + input: + - set: "annotation" + column: "Allele" + on_missing: default + default: "" + Gene: + input: + - set: "annotation" + column: "Gene" + on_missing: default + default: "" + Feature: + input: + - set: "annotation" + column: "Feature" + on_missing: default + default: "" + Feature_type: + input: + - set: "annotation" + column: "Feature_type" + on_missing: default + default: "" + # Consequence + cDNA_position: + input: + - set: "annotation" + column: "cDNA_position" + on_missing: default + default: "" + CDS_position: + input: + - set: "annotation" + column: "CDS_position" + on_missing: default + default: "" + Amino_acids: + input: + - set: "annotation" + column: "Amino_acids" + on_missing: default + default: "" + Codons: + input: + - set: "annotation" + column: "Codons" + on_missing: default + default: "" + Existing_variation: + input: + - set: "annotation" + column: "Existing_variation" + on_missing: default + default: "" + # ALLELE_NUM + DISTANCE: + input: + - set: "annotation" + column: "DISTANCE" + on_missing: default + default: "" + STRAND_VEP: + input: + - set: "annotation" + column: "STRAND" + on_missing: default + default: "" + SYMBOL: + input: + - set: "annotation" + column: "SYMBOL" + on_missing: default + default: "" + SYMBOL_SOURCE: + input: + - set: "annotation" + column: "SYMBOL_SOURCE" + on_missing: default + default: "" + HGNC_ID: + input: + - set: "annotation" + column: "HGNC_ID" + on_missing: default + default: "" + BIOTYPE: + input: + - set: "annotation" + column: "BIOTYPE" + on_missing: default + default: "" + CANONICAL: + input: + - set: "annotation" + column: "CANONICAL" + on_missing: default + default: "" + CCDS: + input: + - set: "annotation" + column: "CCDS" + on_missing: default + default: "" + ENSP: + input: + - set: "annotation" + column: "ENSP" + on_missing: default + default: "" + TREMBL: + input: + - set: "annotation" + column: "TREMBL" + on_missing: default + default: "" + UNIPARC: + input: + - set: "annotation" + column: "UNIPARC" + on_missing: default + default: "" + # RefSeq + SIFT: + input: + - set: "annotation" + column: "SIFT" + on_missing: default + default: "" + Polyphen: + input: + - set: "annotation" + column: "Polyphen" + on_missing: default + default: "" + EXON: + input: + - set: "annotation" + column: "EXON" + on_missing: default + default: "" + INTRON: + input: + - set: "annotation" + column: "INTRON" + on_missing: default + default: "" + DOMAINS: + input: + - set: "annotation" + column: "DOMAINS" + on_missing: default + default: "" + AF: + input: + - set: "annotation" + column: "AF" + on_missing: default + default: "" + AFR_AF: + input: + - set: "annotation" + column: "AFR_AF" + on_missing: default + default: "" + AMR_AF: + input: + - set: "annotation" + column: "AMR_AF" + on_missing: default + default: "" + # ASN_AF + EAS_AF: + input: + - set: "annotation" + column: "EAS_AF" + on_missing: default + default: "" + EUR_AF: + input: + - set: "annotation" + column: "EUR_AF" + on_missing: default + default: "" + SAS_AF: + input: + - set: "annotation" + column: "SAS_AF" + on_missing: default + default: "" + AA_AF: + input: + - set: "annotation" + column: "AA_AF" + on_missing: default + default: "" + EA_AF: + input: + - set: "annotation" + column: "EA_AF" + on_missing: default + default: "" + CLIN_SIG: + input: + - set: "annotation" + column: "CLIN_SIG" + on_missing: default + default: "" + SOMATIC: + input: + - set: "annotation" + column: "SOMATIC" + on_missing: default + default: "" + PUBMED: + input: + - set: "annotation" + column: "PUBMED" + on_missing: default + default: "" + MOTIF_NAME: + input: + - set: "annotation" + column: "MOTIF_NAME" + on_missing: default + default: "" + MOTIF_POS: + input: + - set: "annotation" + column: "MOTIF_POS" + on_missing: default + default: "" + HIGH_INF_POS: + input: + - set: "annotation" + column: "HIGH_INF_POS" + on_missing: default + default: "" + MOTIF_SCORE_CHANGE: + input: + - set: "annotation" + column: "MOTIF_SCORE_CHANGE" + on_missing: default + default: "" + IMPACT: + input: + - set: "annotation" + column: "IMPACT" + on_missing: default + default: "" + # PICK + VARIANT_CLASS: + input: + - set: "annotation" + column: "VARIANT_CLASS" + on_missing: default + default: "" + TSL: + input: + - set: "annotation" + column: "TSL" + on_missing: default + default: "" + HGVS_OFFSET: + input: + - set: "annotation" + column: "HGVS_OFFSET" + on_missing: default + default: "" + PHENO: + input: + - set: "annotation" + column: "PHENO" + on_missing: default + default: "" + # MINIMISED + GENE_PHENO: + input: + - set: "annotation" + column: "GENE_PHENO" + on_missing: default + default: "" + # FILTER + # flanking_bps + # vcf_id + # vcf_qual + gnomAD_AF: + input: + - set: "annotation" + column: "gnomAD_AF" + on_missing: default + default: "" + gnomAD_AFR_AF: + input: + - set: "annotation" + column: "gnomAD_AFR_AF" + on_missing: default + default: "" + gnomAD_AMR_AF: + input: + - set: "annotation" + column: "gnomAD_AMR_AF" + on_missing: default + default: "" + gnomAD_ASJ_AF: + input: + - set: "annotation" + column: "gnomAD_ASJ_AF" + on_missing: default + default: "" + gnomAD_EAS_AF: + input: + - set: "annotation" + column: "gnomAD_EAS_AF" + on_missing: default + default: "" + gnomAD_FIN_AF: + input: + - set: "annotation" + column: "gnomAD_FIN_AF" + on_missing: default + default: "" + gnomAD_NFE_AF: + input: + - set: "annotation" + column: "gnomAD_NFE_AF" + on_missing: default + default: "" + gnomAD_OTH_AF: + input: + - set: "annotation" + column: "gnomAD_OTH_AF" + on_missing: default + default: "" + gnomAD_SAS_AF: + input: + - set: "annotation" + column: "gnomAD_SAS_AF" + on_missing: default + default: "" + diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/environment.yaml b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/environment.yaml new file mode 100644 index 000000000..8a155a981 --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/environment.yaml @@ -0,0 +1,7 @@ +channels: +- bioconda +- conda-forge +dependencies: +- python >=3.8 +- vcfpy +- ruamel.yaml diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/exceptions.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/exceptions.py new file mode 100644 index 000000000..0e92f1692 --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/exceptions.py @@ -0,0 +1,22 @@ +class IllegalValue(Exception): + """Illegal value found during parsing""" + + pass + + +class MissingValue(Exception): + """Missing value found during parsing""" + + pass + + +class ActionStop(Exception): + """Interrupting parsing upon missing value or parsing error""" + + pass + + +class FunctionError(Exception): + """Error encountered during function""" + + pass diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/functions.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/functions.py new file mode 100644 index 000000000..216e27cfb --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/functions.py @@ -0,0 +1,161 @@ +import importlib.util +import inspect +import logging +import os +import re +import typing + +from common_functions import calc_end_pos, minimize_mutation, strip_sequence_version, variant_type +import exceptions +from protein_mutation_parser import parse_protein_mutation +from variant_classification import variant_classification + +# from action import Action + + +class Functions: + mapping_files = {} + TAB = re.compile("\t") + + def __init__(self, config: typing.Dict[str, typing.Any]): + self.compiled = Functions.importCode(config["functions"]) if "functions" in config else {} + self.compiled["identity"] = Functions.identity + self.compiled["map"] = Functions.mapper + + self.compiled["minimize_mutation"] = minimize_mutation + self.compiled["calc_end_pos"] = calc_end_pos + self.compiled["strip_sequence_version"] = strip_sequence_version + self.compiled["variant_type"] = variant_type + self.compiled["parse_protein_mutation"] = parse_protein_mutation + self.compiled["variant_classification"] = variant_classification + + for col_name, col_def in config["output"].items(): + if "function" in col_def and not col_def["function"] in self.compiled: + raise exceptions.MissingValue( + 'Function "{}" requested to process column "{}" not found'.format( + col_def["function"], col_name + ) + ) + + @staticmethod + def importCode(functions, module_name="extra_functions"): + """Read & compile processing functions from python files + + :param functions: list of python files to compile + :return: a dict of compiled functions as values, with the function names as keys + """ + to_compile = [] + for filename in functions: + with open(filename, "rt") as f: + code = f.read() + to_compile.append(code) + logging.info('Loaded additional function(s) from file "{}"'.format(filename)) + + spec = importlib.util.spec_from_loader(module_name, loader=None) + module = importlib.util.module_from_spec(spec) + exec("\n\n".join(to_compile), module.__dict__) + globals()[module_name] = module + + hooks = dict(inspect.getmembers(module, inspect.isfunction)) + logging.debug("Functions: {}".format(hooks.keys())) + return hooks + + @staticmethod + def identity(value, args: typing.Dict[str, typing.Any] = None): + if value is None: + return None + assert isinstance(value, list) + assert len(value) == 1 + result = value[0] + + return result + + @staticmethod + def mapper(value, args: typing.Dict[str, typing.Any] = None): + if args is None or not isinstance(args, dict) or "filename" not in args: + raise exceptions.MissingValue("Missing mapping filename argument") + filename = os.path.realpath(os.path.join(os.path.dirname(__file__), args["filename"])) + + if value is None: + return None + assert isinstance(value, list) + assert len(value) == 1 + value = value[0] + if value is None: + return None + + if filename not in Functions.mapping_files: + m = {} + with open(filename, "rt") as f: + for line in f: + try: + k, v = Functions.TAB.split(line.strip(), 1) + m[k] = v + except Exception: + pass + Functions.mapping_files[filename] = m + m = Functions.mapping_files[filename] + + return [m.get(v, None) for v in value] + + @staticmethod + def max_length(previous: int = 0, current: int = 0) -> int: + if current == 0: + return previous + if previous < 2: + return current + if current == 1: + return previous + if current != previous: + raise exceptions.IllegalValue( + "Record expansion impossible: previous length = {}, current length = {}".format( + previous, current + ) + ) + return current + + def run( + self, + values, + fct: str = "identity", + args: typing.Dict[str, typing.Any] = None, + default: str = None, + ): + if values is None: + return None + assert isinstance(values, list) + alts = {} + for value in values: + if value is None: + continue + assert isinstance(value, dict) + for k, v in value.items(): + if k not in alts: + alts[k] = 0 + if v is None: + continue + assert isinstance(v, list) and len(v) > 0 + alts[k] = Functions.max_length(alts[k], len(v)) + + f = self.compiled[fct] + + results = {} + for alt in alts: + x = [] + for value in values: + assert value is None or value[alt] is None or isinstance(value[alt], list) + x.append(value[alt]) + try: + results[alt] = f(x, args) + except Exception as e: + logging.error('Function "{}" has returned error {}'.format(fct, e)) + # raise exceptions.FunctionError( + # 'Error in function "{}" for value {} and arguments {}'.format(fct, x, args) + # ) + results[alt] = None + if results[alt] is None: + results[alt] = default + if results[alt] is not None and not isinstance(results[alt], list): + results[alt] = [results[alt]] + + return results diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/parser.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/parser.py new file mode 100644 index 000000000..6c2410732 --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/parser.py @@ -0,0 +1,427 @@ +import logging +import re +import typing + +from annotation import Annotation +import exceptions +import vcfpy + + +class VcfParser: + pattern = re.compile("^([^\[\]\s]+)(\[([0-9]+|REF)\])?$") # noqa: W605 + + def __init__( + self, + config: typing.Dict[str, typing.Any], + header: vcfpy.Header, + samples: typing.Dict[str, str], + ): + """Create the parser for column requests + + The parser is configured using the configuration yaml file, in particular the "annotation" dict, + and the info & format list of requested IDs. + The latter is used to give the user control of the set of INFO & FORMAT IDs that can be used in parsing. + When these lists are missing from the configuration, all the INFO & FORMAT IDs present in the VCF can be used. + + The annotation defines the extraction pattern for parsing the annotation field description in the VCF header. + The description field generally consists of a prefix, followed by the column names of the annotations. + The `extract` regular expression must define the column names as a single string in the first group, + and the `split` regular expression is used to separate the annotation field (in the header or in the records) + into individual values. + + The sample names must be provided as a dict with `tumor` and `normal` keys (the latter being optional). + This provides a mapping between logical labels (`tumor` & `normal`) and the sample column names. + + :param config: configuration dict + :param header: VCF header as vcfpy.Header object + :param samples: samples mapping dict + """ + if samples["normal"]: + if not samples["normal"] in header.samples.names: + raise exceptions.IllegalValue( + 'Normal sample "{}" not found in vcf header'.format(samples["normal"]) + ) + if samples["tumor"]: + if not samples["tumor"] in header.samples.names: + raise exceptions.IllegalValue( + 'Tumor sample "{}" not found in vcf header'.format(samples["tumor"]) + ) + self.samples = samples + + self.annotation = None + self.infos = VcfParser._get_id_list(config.get("info", None), header, "INFO") + self.formats = VcfParser._get_id_list(config.get("format", None), header, "FORMAT") + + if ( + "annotation" in config + and isinstance(config["annotation"], dict) + and set(["id", "extract", "split"]) <= set(config["annotation"].keys()) + ): + self.annotation = Annotation( + annotation_id=config["annotation"]["id"], + allele_column=config["annotation"]["allele"] + if "allele" in config["annotation"] + else None, + extract=config["annotation"]["extract"], + split=config["annotation"]["split"], + ) + self.annotation.parseHeader(header) + + self.constants = {} + + def addConstant(self, key, value): + """Add an key, value pair to the parser set of constant values + + :param key: name of the constant column + :param value: value of all elements in the constant column + """ + if key in self.constants: + logging.warning( + 'Value of constant "{}" is replaced from {} to {}'.format( + key, self.constants[key], value + ) + ) + self.constants[key] = value + + @staticmethod + def _get_id_list( + request, header, line_type="" + ) -> typing.Dict[str, vcfpy.header.CompoundHeaderLine]: + """Creates a dict of FORMAT or INFO lines + + The user can subset the ID found in the vcf using the configuration file. + If a list of requested IDs is provided, these IDs will be checked for presence in the VCF. + If any requested ID are missing from the VCF, an exception is raised. + If there is no user request, all IDs present in the VCF header are returned. + + :param request: list of ids, possibly empty or None + :param header: VCF header as vcfpy object + :param line_type: either INFO or FORMAT. Other values trigger an exception + :return: dict with ID as keys, and header lines as values (vcfpy.CompoundHeaderLine) + """ + if line_type == "INFO": + ids = header.info_ids() + value_fct = header.get_info_field_info + elif line_type == "FORMAT": + ids = header.format_ids() + value_fct = header.get_format_field_info + else: + raise exceptions.IllegalValue('Illegal VCF header line "{}"'.format(line_type)) + id_list = {x: value_fct(x) for x in ids} + if request: + request = set(request) + in_header = set(id_list.keys()) + missing = request - in_header + if len(missing) > 0: + raise exceptions.MissingValue( + 'Requested {} id(s) not found in vcf header: "{}"'.format( + '", "'.join(missing), '", "'.join(in_header) + ) + ) + unused = in_header - request + for field in unused: + del id_list[field] + return id_list + + def subset(self, record: vcfpy.Record, index=None) -> vcfpy.Record: + """Subset a VCF record to retain on one alt allele + + A new VCF record is created, to represent the ith alternative allele of the variant. + The allele selection is provided by the index (0 is the first alt allele). + When the index is None, the original VCF record is returned, with all the alternative alleles. + When the index is greater than the number of alt alleles found for the variant, + an empty record is returned (None). + + :param record: the VCF record with multiple variants + :param index: the index of the selected alt allele (starting from 0) + :return: the variant with only the selected alt allele, or an empty record when the ith allele is missing, or the original record if the index is missing + """ + if index is None: + return record + if index >= len(record.ALT): + return None + infos = {} + for ID in record.INFO.keys(): + assert ID in self.infos + header = self.infos[ID] + if header.number == vcfpy.header.HEADER_NUMBER_REF: + infos[ID] = [record.INFO[ID][0], record.INFO[ID][1 + index]] + elif header.number == vcfpy.header.HEADER_NUMBER_ALLELES: + infos[ID] = [record.INFO[ID][index]] + else: + infos[ID] = record.INFO[ID] + + formats = [] + for call in record.calls: + data = {} + for ID in record.FORMAT: + assert ID in self.formats + fmt = self.formats[ID] + if fmt.number == vcfpy.header.HEADER_NUMBER_REF: + data[ID] = [call.data[ID][0], call.data[ID][1 + index]] + elif fmt.number == vcfpy.header.HEADER_NUMBER_ALLELES: + data[ID] = [call.data[ID][index]] + else: + data[ID] = call.data[ID] + formats.append(vcfpy.record.Call(call.sample, data)) + + return vcfpy.record.Record( + record.CHROM, + record.POS, + record.ID, + record.REF, + [record.ALT[index]], + record.QUAL, + record.FILTER, + infos, + record.FORMAT, + formats, + ) + + def getInputValue( + self, + record: vcfpy.Record, + theSet: str, + theColumn: str, + theSample: str = None, + default: str = None, + ): + """Extract the requested value(s) from a VCF record + + The request format depends on the set of values the data must be extracted from. + The available sets are: + + - `constant`: constant values stored in the parser (typically the genome release, or the organisation name). + The request must be the constant name. + - `fixed`: the fixed columns of the VCF. The request must be one of `CHROM`, `POS`, ÃŒD`, `QUAL` or `FILTER`. + - `variant`: the reference or alternative variant. The request must be `REF` or `ALT`, or `ALT[]`. + If the request is `ALT`, then all alt variants will be returned. + If the request is `ALT[]`, then only the ith variant is returned, and if there is no ith variant, None is returned. + - `info`: an INFO field, by ID. The request must be ``, `[]` or `[REF]`. + The meaning of the index (either a positive integer, starting from 0, or `REF`) depends on the + INFO field numbering scheme, as defined in the VCF header. + When the number of values depends on the number of alt alleles (either `R` or `A` in VCF Number parlance), + only one value can be returned. If the value list contains the reference (`R` number of values), + the value for the reference can be obtained using the `REF` index. + Alternatively, when the number of values does not depend on the number of alt alleles, + then the indexing can be used. When it isn't used, all values are returned. + - `format`: a `FORMAT` field, by ID. The request format is identical to the format used for `INFO` fields, + but the logical sample id (either `tumor` or `normal`) must be provided. + - `annotation`: an annotation field, by column name. The request format is identical to the format used for `INFO` fields. + When annotations have been configured to extract the allele from the annotation columns, then + the annotations are assumed to have a `A` number, so they are attached to alt alleles. No indexing is possible. + If it is not the case, the annotations can have any number of values. Indexing by number is possible. + + The returned values are either a list (of length 1 for `constant` and `fixed` sets), or a dict of lists + when the requested values depend on the alt allele. In that case, the lists lengths are always 1 for + `INFO` and `FORMAT` fields, but can be longer for annotations (as there can be multiple annotations per alt allele). + + :param record: the VCF record the data is extracted from, as a vcfpy.Record object + :param theSet: one of `constant`, `fixed`, `variant`, `info`, `format` or `annotation`, to describe the type of data for extraction + :param theColumn: the column ID, possibly with indexing + :param theSample: sample logical label (`tumor` or `normal`), for `format` data extraction + :param action: action to be taken for missing values. One of `ignore`, `skip`, `stop`, `default`. + :return: the parsed values, as a dict for alt-allele dependent values, or a list otherwise, or None when absent + """ + if record is None: + raise exceptions.MissingValue("No record provided") + if not theSet or not theColumn: + raise exceptions.MissingValue( + 'Missing set or column information for record "{}"'.format(record) + ) + if theSet == "format": + if not theSample: + raise exceptions.MissingValue( + 'Missing sample information for column "{}" and record "{}"'.format( + theColumn, record + ) + ) + if theSample not in self.samples: + raise exceptions.IllegalValue('Unknown sample "{}"'.format(theSample)) + theSample = self.samples[theSample] + + value = None + if theSet == "constant": + if theColumn in self.constants: + value = self.constants.get(theColumn, None) + if value is not None: + value = VcfParser._expandUnique(value, record.ALT) + elif theSet == "fixed": + value = VcfParser._expandUnique(VcfParser._getFixed(record, theColumn), record.ALT) + elif theSet == "variant": + value = VcfParser._getVariant(record, theColumn) + elif theSet == "info": + numbers = {x.id: x.number for x in self.infos.values()} + infos = VcfParser._expandDict(record.INFO, record.ALT, numbers) + value = self._getRequest(theColumn, infos, numbers) + elif theSet == "format": + if theSample: + numbers = {x.id: x.number for x in self.formats.values()} + formats = VcfParser._expandDict( + record.call_for_sample[theSample].data, record.ALT, numbers + ) + value = self._getRequest(theColumn, formats, numbers) + elif theSet == "annotation": + numbers = {x: vcfpy.header.HEADER_NUMBER_UNBOUNDED for x in self.annotation.columns} + annotations = self.annotation.getAnnotations(record) + value = self._getRequest(theColumn, annotations, numbers) + else: + raise exceptions.IllegalValue('Unknown set "{}"'.format(theSet)) + + if default is not None: + value = VcfParser._insert_default(value, default, [alt.value for alt in record.ALT]) + else: + assert value is None or isinstance(value, dict) + if isinstance(value, dict): + for k, v in value.items(): + assert v is None or isinstance(v, list) + + return value + + @staticmethod + def _insert_default(value: typing.Dict[str, typing.Any], default: str, alts: typing.List[str]): + if value is None: + value = {alt: [default] for alt in alts} + else: + assert isinstance(value, dict) + for alt in alts: + if alt in value: + if value[alt] is None: + value[alt] = [default] + else: + assert isinstance(value[alt], list) + for i in range(len(value[alt])): + if value[alt][i] is None: + value[alt][i] = default + return value + + @staticmethod + def _expandUnique( + value, alts: typing.List[vcfpy.record.AltRecord] + ) -> typing.Dict[str, typing.Any]: + if value is None: + return {alt.value: value for alt in alts} + else: + return {alt.value: [value] for alt in alts} + + @staticmethod + def _expandDictElement( + value, alts: typing.List[vcfpy.record.AltRecord], number + ) -> typing.Dict[str, typing.Any]: + if value is None: + return None + if not isinstance(value, list): + return {alt.value: [value] for alt in alts} + if number == vcfpy.header.HEADER_NUMBER_UNBOUNDED: + return {alt.value: value for alt in alts} + if number == vcfpy.header.HEADER_NUMBER_ALLELES: + return {alts[i].value: [value[i]] for i in range(len(alts))} + if number == vcfpy.header.HEADER_NUMBER_REF: + result = {alts[i].value: [value[i + 1]] for i in range(len(alts))} + result["__REF__"] = [value[0]] + return result + return {alt.value: value for alt in alts} + + @staticmethod + def _expandDict( + value, alts: typing.List[vcfpy.record.AltRecord], numbers + ) -> typing.Dict[str, typing.Dict[str, typing.Any]]: + if value is None: + return None + return {k: VcfParser._expandDictElement(v, alts, numbers[k]) for k, v in value.items()} + + @staticmethod + def _getFixed(record: vcfpy.Record, theColumn: str) -> typing.List[typing.Any]: + """Extract the fixed part of a vcf record + + The variant position (CHROM & POS), its identifier (ID), filter (FILTER) & quality (QUAL) values can be returned. + The allowed column values are: CHROM, POS, ID, FILTER & QUAL. + Note that multiple IDs & multiple filters are collapsed into a single string with the semicolumn (;) as separator + + :param record: vcf record as vcfpy.Record object + :param theColumn: which fixed value must be returned + :return: an array of length 1 with the requested fixed value + """ + if theColumn == "CHROM": + return record.CHROM + elif theColumn == "POS": + return record.POS + elif theColumn == "ID": + return ";".join(record.ID) + elif theColumn == "QUAL": + return record.QUAL + elif theColumn == "FILTER": + return ";".join(record.FILTER) + else: + raise exceptions.IllegalValue('Unknown fixed column "{}"'.format(theColumn)) + + @staticmethod + def _getVariant(record: vcfpy.Record, theColumn: str) -> typing.Dict[str, typing.List[str]]: + """Extract the reference and alternative allele(s) from a vcf record + + A single reference & possibly multiple alternative alleles are returned as a list. + The allowed column names are 'REF' for the reference, and + 'ALT' for the first alt allele,'ALT[]' for the nth, or 'ALT[*]' for all the alt alleles. + Note that 'ALT[]' will return an empty list in the requested number is larger than the number of alternative alleles for the variant. + + :param record: vcf record as vcfpy.Record object + :param theColumn: the type of allele list to be returned + :return: a dict of lists of length 1 for the reference allele, or a possibly longer list for alternative alleles + """ + if theColumn == "REF": + return {alt.value: [record.REF] for alt in record.ALT} + m = VcfParser.pattern.match(theColumn) + if not m: + raise exceptions.IllegalValue('Unknown variant column "{}"'.format(theColumn)) + groups = m.groups() + if groups[0] != "ALT": + raise exceptions.IllegalValue('Unknown variant column "{}"'.format(theColumn)) + if groups[2]: + value = {alt.value: None for alt in record.ALT} + n = int(groups[2]) + if n < len(record.ALT): + value[record.ALT[n].value] = [record.ALT[n].value] + return value + else: + return {alt.value: [alt.value] for alt in record.ALT} + + def _getRequest( + self, + request: str, + values: typing.Any, # A dict with alt alleles as keys and with data relevant to the allele as value + numbers: typing.Dict[str, str], + ) -> typing.Dict[str, typing.Any]: + if values is None: + return None + + m = VcfParser.pattern.match(request) + if not m: + raise exceptions.IllegalValue('Syntax error in column request "{}"'.format(request)) + + groups = m.groups() + theColumn = groups[0] + if theColumn not in values.keys(): + return None + result = values[theColumn] + + if groups[2]: + if groups[2] == "REF": + if numbers[theColumn] != vcfpy.header.HEADER_NUMBER_REF: + raise exceptions.IllegalValue( + 'Requested data for reference allele in column "{}" which doesn\'t contain it'.format( + theColumn + ) + ) + assert "__REF__" in result + ref_data = result.pop("__REF__") + for alt in result.keys(): + result[alt] = ref_data + else: + n = int(groups[2]) + for alt, v in result.items(): + if n < len(v) and v[n] is not None: + result[alt] = [v[n]] + else: + result[alt] = None + + return result diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py new file mode 100644 index 000000000..9b60c721e --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py @@ -0,0 +1,433 @@ +import functools +import re + + +class ProteinMutationFormatException(Exception): + pass + + +aa_codes_short = ( + "A", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "K", + "L", + "M", + "N", + "P", + "Q", + "R", + "S", + "T", + "V", + "W", + "Y", + "B", + "Z", + "X", +) + +aa_codes_long = ( + "Ala", + "Cys", + "Asp", + "Glu", + "Phe", + "Gly", + "His", + "Ile", + "Lys", + "Leu", + "Met", + "Asn", + "Pro", + "Gln", + "Arg", + "Ser", + "Thr", + "Val", + "Trp", + "Tyr", + "Asx", + "Glx", + "Xaa", +) + +long_to_short = { + "Ala": "A", + "Cys": "C", + "Asp": "D", + "Glu": "E", + "Phe": "F", + "Gly": "G", + "His": "H", + "Ile": "I", + "Lys": "K", + "Leu": "L", + "Met": "M", + "Asn": "N", + "Pro": "P", + "Gln": "Q", + "Arg": "R", + "Ser": "S", + "Thr": "T", + "Val": "V", + "Trp": "W", + "Tyr": "Y", + "Asx": "B", + "Glx": "Z", + "Xaa": "X", + "Ter": "*", + "A": "A", + "C": "C", + "D": "D", + "E": "E", + "F": "F", + "G": "G", + "H": "H", + "I": "I", + "K": "K", + "L": "L", + "M": "M", + "N": "N", + "P": "P", + "Q": "Q", + "R": "R", + "S": "S", + "T": "T", + "V": "V", + "W": "W", + "Y": "Y", + "B": "B", + "Z": "Z", + "X": "X", + "*": "*", + "=": "=", + "?": "?", +} + +short_to_long = { + "A": "Ala", + "C": "Cys", + "D": "Asp", + "E": "Glu", + "F": "Phe", + "G": "Gly", + "H": "His", + "I": "Ile", + "K": "Lys", + "L": "Leu", + "M": "Met", + "N": "Asn", + "P": "Pro", + "Q": "Gln", + "R": "Arg", + "S": "Ser", + "T": "Thr", + "V": "Val", + "W": "Trp", + "Y": "Tyr", + "B": "Asx", + "Z": "Glx", + "X": "Xaa", + "*": "Ter", + "Ala": "Ala", + "Cys": "Cys", + "Asp": "Asp", + "Glu": "Glu", + "Phe": "Phe", + "Gly": "Gly", + "His": "His", + "Ile": "Ile", + "Lys": "Lys", + "Leu": "Leu", + "Met": "Met", + "Asn": "Asn", + "Pro": "Pro", + "Gln": "Gln", + "Arg": "Arg", + "Ser": "Ser", + "Thr": "Thr", + "Val": "Val", + "Trp": "Trp", + "Tyr": "Tyr", + "Asx": "Asx", + "Glx": "Glx", + "Xaa": "Xaa", + "Ter": "Ter", + "=": "=", + "?": "?", +} + + +@functools.lru_cache +def _build_protein_pattern(): + prefix = "^(([A-z0-9_\.\(\)-]+):)?p\.\(?" # noqa: W605 + postfix = "\)?$" # noqa: W605 + + aa = "(" + "|".join(aa_codes_short) + "|" + "|".join(aa_codes_long) + ")" + aaTer = ( + "(" + + "|".join(aa_codes_short) + + "|" + + "|".join(aa_codes_long) + + "|\*|Ter" # noqa: W605 + + ")" + ) + aaAll = ( + "(" + + "|".join(aa_codes_short) + + "|" + + "|".join(aa_codes_long) + + "|\*|Ter|=|\?" # noqa: W605 + + ")" + ) + nb = "([0-9]+)" + nb_unknown = "([0-9]+|\?)" # noqa: W605 + + interval = aa + nb + "_" + aa + nb + one_or_interval = aa + nb + "(_" + aa + nb + ")?" + + substitution = aaTer + nb + aaAll + + deletion = one_or_interval + "del" + duplication = one_or_interval + "dup" + + insertion = interval + "ins" + "(" + aa + "*)" + aaTer + + delins = one_or_interval + "delins" + "(" + aa + "*)" + aaTer + + frameshift = aaTer + nb + aa + "fs" + "(Ter|\*)" + nb_unknown # noqa: W605 + + extensionN = "(Met|M)1" + "ext(-[0-9]+|\?)" # noqa: W605 + extensionC = "(Ter|\*)" + nb + aa + "ext" + "(Ter|\*)" + nb_unknown # noqa: W605 + + pattern = ( + prefix + + "(" + + "|".join( + [ + "0", # No group, but seq in 2 + substitution, # 3: ref, 4: position, 5: alt + duplication, # 6: start, 7: start pos, 9: end, 10: end pos + deletion, # 11: start, 12: start pos, 14: end, 15: end pos + insertion, # 16: start, 17: start pos, 18: end, 19: end pos (=start pos + 1), 20+22: insertion + delins, # 23: start, 24: start pos, 26: end, 27: end pos, 28+30: insertion + frameshift, # 31: start, 33: start pos, 33: end, 35: ter pos + extensionN, # 37: pos (negative number) + extensionC, # 39: pos, 40: alt, 42: ter pos + ] + ) + + ")" + + postfix + ) + + return re.compile(pattern) + + +def _aa(aa, want_short=True, want_long=False): + if want_short and aa in long_to_short.keys(): + return long_to_short[aa] + if want_long and aa in short_to_long.keys(): + return short_to_long[aa] + return aa + + +def _is_long(aa): + if aa not in long_to_short.keys(): + raise ProteinMutationFormatException("Unexpected AA code {}".format(aa)) + return len(aa) == 3 + + +def _many_aas(many_aas, want_short=True, want_long=False, is_long=False): + if not many_aas: + return "" + if not want_short and not want_long: + return many_aas + n = 3 if is_long else 1 + if want_short: + mapping = long_to_short + elif want_long: + mapping = short_to_long + else: + mapping = None + # print("DEBUG- _many_aas source = {} by {}".format(many_aas, n)) + i = 0 + converted = "" + while i < len(many_aas): + converted += mapping[many_aas[i : i + n]] + i += n + return converted + + +def _interval(groups, i0, want_short=True, want_long=False): + first_aa = _aa(groups[i0 + 0], want_short=want_short, want_long=want_long) + first_n = groups[i0 + 1] + last_aa = _aa(groups[i0 + 2], want_short=want_short, want_long=want_long) + last_n = groups[i0 + 3] + return first_aa + first_n + "_" + last_aa + last_n + + +def _one_or_interval(groups, i0, want_short=True, want_long=False): + one_aa = _aa(groups[i0 + 0], want_short=want_short, want_long=want_long) + one_n = groups[i0 + 1] + rslt = one_aa + one_n + if groups[i0 + 2] is not None: + interval_aa = _aa(groups[i0 + 3], want_short=want_short, want_long=want_long) + interval_n = groups[i0 + 4] + rslt += "_" + interval_aa + interval_n + return rslt + + +def _parse_mutation_groups(groups, want_short=True, want_long=False): + if groups[2] == "0": + rslt = "0" + + elif groups[3] is not None: + # Substitutions + rslt = ( + _aa(groups[3], want_short=want_short, want_long=want_long) + + groups[4] + + _aa(groups[5], want_short=want_short, want_long=want_long) + ) + # print("DEBUG- substitution: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(3, 6)]), rslt)) + + elif groups[6] is not None: + # Duplications + rslt = _one_or_interval(groups, 6, want_short=want_short, want_long=want_long) + "dup" + # print("DEBUG- duplication: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(6, 11)]), rslt)) + + elif groups[11] is not None: + # Deletions + rslt = _one_or_interval(groups, 11, want_short=want_short, want_long=want_long) + "del" + # print("DEBUG- deletion: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(11, 16)]), rslt)) + + elif groups[16] is not None: + # Insertions + is_long = _is_long(groups[16]) + rslt = ( + _interval(groups, 16, want_short=want_short, want_long=want_long) + + "ins" + + _many_aas(groups[20], want_short=want_short, want_long=want_long, is_long=is_long) + + _aa(groups[22], want_short=want_short, want_long=want_long) + ) + # print("DEBUG- insertion: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(16, 23)]), rslt)) + + elif groups[23] is not None: + # Deletion-insertions + is_long = _is_long(groups[23]) + rslt = ( + _one_or_interval(groups, 23, want_short=want_short, want_long=want_long) + + "delins" + + _many_aas(groups[28], want_short=want_short, want_long=want_long, is_long=is_long) + + _aa(groups[30], want_short=want_short, want_long=want_long) + ) + # print("DEBUG- delins: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(23, 31)]), rslt)) + + elif groups[31] is not None: + # Frameshift + rslt = ( + _aa(groups[31], want_short=want_short, want_long=want_long) + + groups[32] + + _aa(groups[33], want_short=want_short, want_long=want_long) + + "fs" + + _aa(groups[34], want_short=want_short, want_long=want_long) + + groups[35] + ) + # print("DEBUG- frameshift: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(31, 36)]), rslt)) + + elif groups[36] is not None: + # Extension N terminus + rslt = _aa(groups[36], want_short=want_short, want_long=want_long) + "1ext" + groups[37] + # print("DEBUG- extension N: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(36, 38)]), rslt)) + + elif groups[38] is not None: + # Extension C terminus + rslt = ( + _aa(groups[38], want_short=want_short, want_long=want_long) + + groups[39] + + _aa(groups[40], want_short=want_short, want_long=want_long) + + "ext" + + _aa(groups[41], want_short=want_short, want_long=want_long) + + groups[42] + ) + # print("DEBUG- extension C: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(38, 43)]), rslt)) + + return rslt + + +def _parse_one_mutation(mut, want_short=True, want_long=False, add_sequence=False): + if mut is None: + return "" + + # print("DEBUG- received mutation {}".format(mut)) + m = _build_protein_pattern().match(mut) + if not m: + raise ProteinMutationFormatException( + 'Protein mutation "{}" doesn\'t follow the HGVS nomenclature'.format(mut) + ) + groups = m.groups() + # print("DEBUG- mutation {} is valid, found groups are:".format(mut)) + # for i in range(len(groups)): + # if groups[i] is not None: + # print(" {}: {}".format(i, groups[i])) + + rslt = "p." + _parse_mutation_groups(groups, want_short=want_short, want_long=want_long) + + if add_sequence: + rslt = groups[1] + ":" + rslt + + return rslt + + +def parse_protein_mutation(x, args): + if x is None: + return None + assert isinstance(x, list) and len(x) == 1 + if x[0] is None: + return None + x = x[0] + + add_sequence = False + want_short = True + want_long = False + if args is not None and isinstance(args, dict): + add_sequence = args.get("add_sequence", add_sequence) + want_short = args.get("want_short", want_short) + want_long = args.get("want_long", want_long) + if want_short and want_long: + raise Exception("Cannot force both short & long amino-acide representations") + + rslts = [] + for mut in x: + try: + rslt = _parse_one_mutation( + mut, want_short=want_short, want_long=want_long, add_sequence=add_sequence + ) + rslts.append(rslt) + except ProteinMutationFormatException as e: + raise Exception(e) + + return rslts + + +def _test_re(x): + m = _build_protein_pattern().match(x) + if not m: + print('"{}" doesn\'t match'.format(x)) + else: + print('Groups of "{}":'.format(x)) + gs = m.groups() + for i in range(len(gs)): + if gs[i] is not None: + print(" {}: {}".format(i, gs[i])) + + +# with open("t", "rt") as f: +# for line in f: +# test_re(line.strip()) diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/variant_classification.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/variant_classification.py new file mode 100644 index 000000000..7d279c98e --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/variant_classification.py @@ -0,0 +1,125 @@ +# import exceptions +# from action import Action + + +# Mapping taken from vcftomaf.pl routine GetVariantClassification +# Github repo: https://github.com/mskcc/vcf2maf hash d13e404 2022-11-02 +# No change since tag 1.6.21 hash 754d68a 2021-04-24 +variant_classes_vcftomaf = ( + ("splice_acceptor_variant", "Splice_Site"), + ("splice_donor_variant", "Splice_Site"), + ("transcript_ablation", "Splice_Site"), + ("exon_loss_variant", "Splice_Site"), + ("stop_gained", "Nonsense_Mutation"), + # + ("stop_lost", "Nonstop_Mutation"), + ("initiator_codon_variant", "Translation_Start_Site"), + ("start_lost", "Translation_Start_Site"), + # + ("missense_variant", "Missense_Mutation"), + ("coding_sequence_variant", "Missense_Mutation"), + ("conservative_missense_variant", "Missense_Mutation"), + ("rare_amino_acid_variant", "Missense_Mutation"), + ("transcript_amplification", "Intron"), + ("intron_variant", "Intron"), + ("INTRAGENIC", "Intron"), + ("intragenic_variant", "Intron"), + ("splice_region_variant", "Splice_Region"), + ("incomplete_terminal_codon_variant", "Silent"), + ("synonymous_variant", "Silent"), + ("stop_retained_variant", "Silent"), + ("NMD_transcript_variant", "Silent"), + ("mature_miRNA_variant", "RNA"), + ("exon_variant", "RNA"), + ("non_coding_exon_variant", "RNA"), + ("non_coding_transcript_exon_variant", "RNA"), + ("non_coding_transcript_variant", "RNA"), + ("nc_transcript_variant", "RNA"), + ("5_prime_UTR_variant", "5'UTR"), + ("5_prime_UTR_premature_start_codon_gain_variant", "5'UTR"), + ("3_prime_UTR_variant", "3'UTR"), + ("TF_binding_site_variant", "IGR"), + ("regulatory_region_variant", "IGR"), + ("regulatory_region", "IGR"), + ("intergenic_variant", "IGR"), + ("intergenic_region", "IGR"), + ("upstream_gene_variant", "5'Flank"), + ("downstream_gene_variant", "3'Flank"), +) +# Missing from VEP 109 description +# https://www.ensembl.org/info/genome/variation/prediction/predicted_data.html +variant_classes_vep109 = ( + ("splice_donor_5th_base_variant", "Splice_Region"), + ("splice_donor_region_variant", "Splice_Region"), + ("splice_polypyrimidine_tract_region", "Splice_Region"), + ("start_retained_variant", "Silent"), + ("TFBS_ablation", "IGR"), + ("TFBS_amplification", "IGR"), + ("regulatory_region_ablation", "IGR"), + ("regulatory_region_amplification", "IGR"), + ("feature_elongation", "Targeted_Region"), + ("feature_truncation", "Targeted_Region"), +) +variant_classes_all = variant_classes_vcftomaf + variant_classes_vep109 + + +def variant_classification(x, args=None): + if x is None: + return None + assert isinstance(x, list) and len(x) == 4 + if x[0] is None: + return None + assert isinstance(x[0], list) and len(x[0]) > 0 + if x[1] is None: + x[1] = [None] * len(x[0]) + assert isinstance(x[1], list) and len(x[1]) == len(x[0]) + assert isinstance(x[2], list) and len(x[2]) == len(x[0]) + assert isinstance(x[3], list) and len(x[3]) == len(x[0]) + tcga = list() + for i in range(len(x[0])): + ensembl = x[0][i] + if ensembl is None: + tcga.append(None) + continue + ensembl = ensembl.split("&")[0] + # Convert to Sequence Ontology controlled vocabulary + indel = x[1][i] + if indel == "DEL": + indel = "deletion" + if indel == "INS": + indel = "insertion" + ref = x[2][i].replace("-", "") + alt = x[3][i].replace("-", "") + inFrame = (abs(len(ref) - len(alt)) % 3) == 0 + + found = False + for (k, v) in variant_classes_all: + if ensembl == k: + tcga.append(v) + found = True + break + if found: + continue + + if indel == "deletion" and ( + ensembl == "frameshift_variant" + or (ensembl == "protein_altering_variant" and not inFrame) + ): + tcga.append("Frame_Shift_Del") + elif indel == "insertion" and ( + ensembl == "frameshift_variant" + or (ensembl == "protein_altering_variant" and not inFrame) + ): + tcga.append("Frame_Shift_Ins") + elif ensembl == "inframe_deletion" or ( + ensembl == "protein_altering_variant" and inFrame and indel == "deletion" + ): + tcga.append("In_Frame_Del") + elif ensembl == "inframe_insertion" or ( + ensembl == "protein_altering_variant" and inFrame and indel == "insertion" + ): + tcga.append("In_Frame_Ins") + else: + tcga.append("Targeted_Region") + + return tcga diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/vcf_to_table.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/vcf_to_table.py new file mode 100644 index 000000000..42034b3e0 --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/vcf_to_table.py @@ -0,0 +1,421 @@ +import argparse +import logging +from parser import VcfParser +import sys +import typing + +from action import Action +import exceptions +from functions import Functions +from ruamel.yaml import YAML +import vcfpy + + +def _get_command_line_parser(): + parser = argparse.ArgumentParser(description="VCF to MAF conversion") + + parser.add_argument("--config", help="configuration to parse the vcf file") + + parser.add_argument( + "--select-alt", + help="select one allele for output (generally set to 0), otherwise all alleles are output", + default=None, + type=int, + ) + parser.add_argument( + "--unique", + help="uniquify output (useful for repeated missing annotations)", + action="store_true", + ) + + parser.add_argument("--vcf-tumor-id", help="Tumor sample id as in the vcf column name") + parser.add_argument("--vcf-normal-id", help="Normal sample id as in the vcf column name") + parser.add_argument("--tumor-id", help="Tumor sample id output in the maf file") + parser.add_argument("--normal-id", help="Normal sample id output in the maf file") + + parser.add_argument( + "--NCBI_Build", help="Genome version (GRCh37 & GRCh38 are accepted by cBioPortal)" + ) + parser.add_argument("--Center", help="Name of the center for the MAF") + + parser.add_argument("--title", action="store_true", help="Write column names on output") + + parser.add_argument("--debug", action="store_true", help="Turn on debugging logs") + + parser.add_argument("vcf", help="Input vcf filename", nargs="?", default=None, type=str) + parser.add_argument( + "maf", help="Output maf file", nargs="?", type=argparse.FileType("w"), default=sys.stdout + ) + + return parser + + +def _check_config(config: typing.Dict[str, typing.Any]) -> typing.Dict[str, typing.Any]: + assert isinstance(config, dict), "Illegal (or empty) configuration file" + assert "output" in config, '"output" missing from configuration file' + assert isinstance(config["output"], dict), "Illegal (or empty) output definition" + for k, v in config["output"].items(): + assert isinstance(v, dict), 'Illegal (or empty) definition of output column "{}"'.format(k) + assert "input" in v or not isinstance( + v["input"], list + ), 'Missing inputs for output column "{}"'.format(k) + for i in range(len(v["input"])): + x = v["input"][i] + assert isinstance( + x, dict + ), "Illegal (or empty) element {} of inputs definition for output column {}".format( + i + 1, k + ) + assert ( + "set" in x and "column" in x + ), '"set" and/or "column" definition missing from element {} of inputs definition for output column {}'.format( + i + 1, k + ) + assert x["set"] in ( + "annotation", + "constant", + "fixed", + "format", + "info", + "variant", + ), 'Illegal set "{}" for input column "{}" of inputs definition for output column {}, must be one of "annotation", "constant", "fixed", "format", "info" or "variant"'.format( + x["set"], x["column"], k + ) + if x["set"] == "format": + assert ( + "sample" in x + ), 'Sample definition is missing from set "{}" for input column "{}" of inputs definition for output column {}, must be present for "format" sets'.format( + x["set"], x["column"], k + ) + if "on_missing" in x: + assert x["on_missing"] in ( + "stop", + "skip", + "default", + "ignore", + ), 'Illegal value of requested action for missing input "{}" for output column "{}", must be either "stop", "skip", "default" or "ignore"'.format( + x["column"], k + ) + else: + config["output"][k]["input"][i]["on_missing"] = "ignore" + if x["on_missing"] == "default": + assert ( + "default" in x and x["default"] is not None + ), 'Missing default value for input "{}" for output column "{}"'.format( + x["column"], k + ) + else: + config["output"][k]["input"][i]["default"] = None + if "on_missing" in v: + assert v["on_missing"] in ( + "stop", + "skip", + "default", + "ignore", + ), 'Illegal value of requested action for output column "{}", must be either "stop", "skip", "default" or "ignore"'.format( + k + ) + else: + config["output"][k]["on_missing"] = "ignore" + if v["on_missing"] == "default": + assert ( + "default" in v and v["default"] is not None + ), 'Missing default value for output column "{}"'.format(k) + else: + config["output"][k]["default"] = None + return config + + +def _add_constants(parser: VcfParser, args): + constants = ("NCBI_Build", "Center") + for constant in constants: + parser.addConstant(constant, vars(args).get(constant, None)) + parser.addConstant("tumor_id", args.tumor_id if args.tumor_id else args.vcf_tumor_id) + parser.addConstant("normal_id", args.normal_id if args.normal_id else args.vcf_normal_id) + + +def _get_column_values(record, parser, description, functions): + arguments = [] + for i in range(len(description["input"])): + inputs = description["input"][i] + value = parser.getInputValue( + record=record, + theSet=inputs["set"], + theColumn=inputs["column"], + theSample=inputs.get("sample", None), + default=inputs.get("default", None), + ) + + if description.get("action", "ignore") == "stop": + if value is None: + raise exceptions.ActionStop( + 'Missing mandatory input "{}" of set "{}"'.format( + inputs["column"], inputs["set"] + ) + ) + for alt in record.ALT: + if alt.value not in value or value[alt.value] is None: + raise exceptions.ActionStop( + 'Missing mandatory input "{}" of set "{}" for alt variant "{}"'.format( + inputs["column"], inputs["set"], alt.value + ) + ) + for i in range(len(value[alt.value])): + if value[alt.value][i] is None: + raise exceptions.ActionStop( + 'Missing mandatory element {} from input "{}" of set "{}" for alt variant "{}"'.format( + i + 1, inputs["column"], inputs["set"], alt.value + ) + ) + + arguments.append(value) + return functions.run( + arguments, + description.get("function", "identity"), + description.get("args", None), + description.get("default", None), + ) + + +def _check_result( + result: typing.Dict[str, typing.List[typing.Any]], + action: str, + default: str, + alts: typing.List[str], +) -> typing.Dict[str, typing.List[typing.Any]]: + assert action != "default" or default is not None + + if result is None: + if action == "stop": + raise exceptions.ActionStop("Missing result") + elif action == "default": + result = {alt: [default] for alt in alts} + else: + pass + else: + assert isinstance(result, dict) + for alt in alts: + if alt not in result or result[alt] is None: + if action == "stop": + raise exceptions.ActionStop('Missing result for allele "{}"'.format(alt)) + elif action == "default": + result[alt] = [default] + else: + pass + else: + assert isinstance(result[alt], list) + for i in range(len(result[alt])): + if result[alt][i] is None: + if action == "stop": + raise exceptions.ActionStop( + 'Missing element {} from result for allele "{}"'.format(i + 1, alt) + ) + elif action == "default": + result[alt][i] = default + else: + pass + return result + + +def _update_one_status(status, result, action): + if status == Action.SKIP: + return status + assert isinstance(status, list) + + if result is None: + if action == "stop": + raise exceptions.ActionStopException("Missing value") + if action == "skip": + return Action.SKIP + return status + assert isinstance(result, list) + + if len(status) == 1 and len(result) > 1: + status = [status[0] for i in range(len(result))] + if len(status) > 1 and len(result) == 1: + result = [result[0] for i in range(len(status))] + if len(result) != len(status): + raise exceptions.IllegalValue( + "Expansion impossible, previous length = {}, current length = {}".format( + len(status), len(result) + ) + ) + + for i in range(len(result)): + if result[i] is not None: + continue + if action == "stop": + raise exceptions.ActionStopException("Missing value") + if action == "skip": + status[i] = Action.SKIP + return status + + +def _update_status(status, result, description): + if status == Action.SKIP: + return status + + if result is None: + if description.get("on_missing", "ignore") == "skip": + return Action.SKIP + else: + return status + assert isinstance(result, dict) + + for alt, s in status.items(): + status[alt] = _update_one_status( + s, result.get(alt, None), description.get("on_missing", "ignore") + ) + return status + + +def _add_to_output(results, status, alts, record): + if status != Action.SKIP: + assert isinstance(status, dict) + for alt in alts: + if status[alt] == Action.SKIP: + logging.info("Skipped record {}".format(vcf_record_to_string(record))) + continue + for i in range(len(status[alt])): + if status[alt][i] == Action.SKIP: + logging.info("Skipped record {}".format(vcf_record_to_string(record))) + continue + row = [] + for col, result in results.items(): + r = None + if alt in result and result[alt]: + assert isinstance(result[alt], list) + if len(result[alt]) == 1: + r = result[alt][0] + else: + r = result[alt][i] + row.append(r) + yield [str(x) if x is not None else "" for x in row] + else: + logging.info("Skipped record {}".format(vcf_record_to_string(record))) + + +def vcf_record_to_string(record): + fields = [ + record.CHROM, + str(record.POS), + record.REF, + ",".join([alt.value for alt in record.ALT]), + ] + info = list() + for k, v in record.INFO.items(): + if isinstance(v, list) and not isinstance(v, str): + v = ",".join([str(el) for el in v]) + info.append("{}={}".format(k, str(v))) + fields.append(";".join(info)) + for call in record.calls: + fmt = list() + for v in call.data.values(): + if isinstance(v, list) and not isinstance(v, str): + v = ",".join([str(el) for el in v]) + fmt.append(str(v)) + fields.append(";".join(fmt)) + return "\t".join(fields) + + +def main(): + parser = _get_command_line_parser() + args = parser.parse_args() + + logging.basicConfig( + format="%(asctime)s %(levelname)s: %(message)s", + level=logging.DEBUG if args.debug else logging.WARNING, + ) + + if not args.vcf_tumor_id and not args.vcf_normal_id: + logging.error("Missing tumor and normal vcf ids") + return -1 + samples = {"tumor": args.vcf_tumor_id, "normal": args.vcf_normal_id} + + with open(args.config, "r") as f: + logging.info("Loading configuration from {}".format(args.config)) + config = YAML().load(f) + try: + config = _check_config(config) + except AssertionError as e: + logging.error(e) + return -1 + + functions = Functions(config) + + if args.vcf is None: + logging.info("Reading VCF file from stdin") + reader = vcfpy.Reader.from_stream(sys.stdin) + else: + logging.info("Reading VCF file {}".format(args.vcf)) + reader = vcfpy.Reader.from_path(args.vcf) + vcf = VcfParser(config, reader.header, samples) + + _add_constants(vcf, args) + + if args.title: + print("\t".join(config["output"].keys()), file=args.maf) + + unique = set() + try: + iRecord = 0 + for record in reader: + iRecord += 1 + + if args.select_alt is not None: + if args.select_alt >= len(record.ALT): + logging.info( + "Record {} ignored, number of alt alleles ({}) smaller than requested ({})".format( + iRecord, len(record.ALT), args.select_alt + 1 + ) + ) + continue + record = vcf.subset(record, args.select_alt) + vcf.annotation.set_minimizer(record) + alts = [alt.value for alt in record.ALT] + + status = {alt: [Action.OK] for alt in alts} + results = {} + for column, description in config["output"].items(): + result = _get_column_values(record, vcf, description, functions) + + results[column] = _check_result( + result, + description.get("on_missing", "ignore"), + description.get("default", None), + alts, + ) + + status = _update_status(status, results[column], description) + if status == Action.SKIP: + logging.info("Skipped record {}".format(vcf_record_to_string(record))) + break + for row in _add_to_output(results, status, alts, record): + s = "\t".join(row) + if args.unique and s in unique: + continue + print(s, file=args.maf) + unique.add(s) + except exceptions.FunctionError as e: + logging.error( + 'Error during compution of values for column request "{}" of record {}:{}'.format( + column, record.CHROM, record.POS + ) + ) + logging.error("Message: {}".format(e)) + return -1 + except exceptions.ActionStop as e: + logging.error( + 'Missing mandatory value for column request "{}" of record {}:{}'.format( + column, record.CHROM, record.POS + ) + ) + logging.error("Message: {}".format(e)) + return -1 + + logging.info("Conversion complete, processed {} VCF records".format(iRecord)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py new file mode 100644 index 000000000..d48c77bae --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +"""Wrapper for running VCF2MAF incl VEP variant annotation +""" + +import os + +from snakemake.shell import shell + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step] + +vcf_to_table = os.path.join(os.path.dirname(os.path.realpath(__file__)), "vcf_to_table.py") +vcf_to_table_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "config.yaml") + +params = snakemake.params.args + +shell( + r""" +set -x + +# Also pipe everything to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec &> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +python {vcf_to_table} \ + --config {vcf_to_table_config} \ + --debug --unique --title \ + --NCBI_Build {config[vcf2maf][ncbi_build]} --Center {config[vcf2maf][Center]} \ + --vcf-tumor-id {params[tumor_sample]} --tumor-id {params[tumor_id]} \ + --vcf-normal-id {params[normal_sample]} --normal-id {params[normal_id]} \ + {snakemake.input.vcf} {snakemake.output.maf} + +pushd $(dirname {snakemake.output.maf}) +md5sum $(basename {snakemake.output.maf}) > $(basename {snakemake.output.maf}).md5 +popd +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py b/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py index 780a8d6de..965c5e758 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py +++ b/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- """Tests for the cbioportal_export workflow module code""" -from pathlib import Path import textwrap import pytest @@ -10,35 +9,10 @@ from snappy_pipeline.workflows.cbioportal_export import cbioportalExportWorkflow +from .common import get_expected_log_files_dict from .conftest import patch_module_fs -@pytest.fixture -def cbioportal_zscores_get_df_content(): - """Return contents of Z-Score data frame.""" - p1 = "P001-T1" - p2 = "P002-T2" - som_base = ( - "SOM_CNV_CALLING/output/bwa.copywriter.{p}-DNA1-WGS1/out/" - "bwa.copywriter.{p}-DNA1-WGS1_gene_call.txt" - ) - gexp_base = ( - "GENE_EXP_QUANTIFICATION/output/star.featurecounts.{p}-RNA1-mRNA_seq1/out/" - "star.featurecounts.{p}-RNA1-mRNA_seq1.tsv" - ) - p1_som = som_base.format(p=p1) - p1_gexp = gexp_base.format(p=p1) - p2_som = som_base.format(p=p2) - p2_gexp = gexp_base.format(p=p2) - return textwrap.dedent( - f""" - ID\tgene_call_filename\tcount_filename - {p1}\t{p1_som}\t{p1_gexp} - {p2}\t{p2_som}\t{p2_gexp} - """ - ).lstrip() - - @pytest.fixture(scope="module") # otherwise: performance issues def minimal_config(): """Return YAML parsing result for configuration""" @@ -50,30 +24,28 @@ def minimal_config(): reference: path: /path/to/ref.fa - cbioportal_export: - # Paths to snappy steps containing results to be uploaded - path_ngs_mapping: /NGS_MAPPING - path_gene_expression_quantification: /GENE_EXP_QUANTIFICATION - path_somatic_variant_filtration: /SOM_VAR_FILTRATION - path_copy_number_step: /SOM_CNV_CALLING - # Select tools & filter set - cnv_tool: control_freec - tools_somatic_variant_calling: [ "mutect2" ] - filter_set: dkfz_and_ebfilter - exclude_variant_with_flag: LowFisherScore - # Additional parameters - vep_data_path: /path/to/VEP/static_data/GRCh37 - species: homo_sapiens - # ncbi_build: GRCh37 - filter_vcf: /path/to/ExAC_nonTCGA.r0.3.1.sites.vep.vcf.gz - cache_version: 100 - vep_custom: "" - # Description of dataset in cBioPortal - type_of_cancer: mixed - cancer_study_id: mixed_pedion_a02p - study_description: "PeDiOn project A02P" - study_name: PeDiOn_A02P - study_name_short: A02P + step_config: + ngs_mapping: + star: + path_features: /path/to/gtf + cbioportal_export: + # Paths to snappy steps containing results to be uploaded + path_ngs_mapping: /NGS_MAPPING + expression_tool: star + path_somatic_variant: /SOM_VAR_FILTRATION + somatic_variant_calling_tool: mutect2 + somatic_variant_annotation_tool: "vep" + filter_set: dkfz_only + path_copy_number: /COPY_NUMBER + copy_number_tool: cnvkit + exclude_variant_with_flag: LowFisherScore + # Description of dataset in cBioPortal + study: + type_of_cancer: mixed + cancer_study_id: mixed_pedion_a02p + study_description: "PeDiOn project A02P" + study_name: PeDiOn_A02P + study_name_short: A02P data_sets: first_batch: @@ -102,10 +74,9 @@ def cbioportal_export_workflow( # Patch out file-system related things in abstract (the crawling link in step is defined there) patch_module_fs("snappy_pipeline.workflows.abstract", cancer_sheet_fake_fs, mocker) dummy_workflow.globals = { - "ngs_mapping": lambda x: "NGS_MAPPING/" + x, - "copy_number_step": lambda x: "SOM_CNV_CALLING/" + x, - "somatic_variant_filtration": lambda x: "SOM_VAR_FILTRATION/" + x[0], - "gene_expression_quantification": lambda x: "GENE_EXP_QUANTIFICATION/" + x, + "ngs_mapping": lambda x: "/NGS_MAPPING/" + x, + "somatic_variant": lambda x: "/SOM_VAR_FILTRATION/" + x, + "copy_number_step": lambda x: "/COPY_NUMBER/" + x, } # Construct the workflow object return cbioportalExportWorkflow( @@ -117,65 +88,33 @@ def cbioportal_export_workflow( ) -# Tests for CbioportalStudyMetaFilesStepPart ----------------------------------------------------- - - -def test_cbioportal_study_meta_files_step_part_get_input_files(cbioportal_export_workflow): - """Tests CbioportalStudyMetaFilesStepPart.get_input_files()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_output_files("cbioportal_study_meta_files", "run") - - -def test_cbioportal_study_meta_files_step_part_get_output_files(cbioportal_export_workflow): - """Tests CbioportalStudyMetaFilesStepPart.get_output_files()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_output_files("cbioportal_study_meta_files", "run") - - -def test_cbioportal_study_meta_files_step_part_get_log_file(cbioportal_export_workflow): - """Tests CbioportalStudyMetaFilesStepPart.get_log_file()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_log_file("cbioportal_study_meta_files", "run") - - -def test_cbioportal_study_meta_files_step_part_get_resource_usage(cbioportal_export_workflow): - """Tests CbioportalStudyMetaFilesStepPart.get_resource_usage()""" - # Define expected: default defined workflow.abstract - expected_dict = {"threads": 1, "time": "01:00:00", "memory": "2G", "partition": "medium"} - # Evaluate - for resource, expected in expected_dict.items(): - msg_error = f"Assertion error for resource '{resource}'." - actual = cbioportal_export_workflow.get_resource( - "cbioportal_study_meta_files", "run", resource - ) - assert actual == expected, msg_error - - -# Tests for cbioportalMetaFilesStepPart ------------------------------------------------------------ +# Tests for cbioportalMetaFilesStepPart ----------------------------------------------------- def test_cbioportal_meta_files_step_part_get_input_files(cbioportal_export_workflow): """Tests cbioportalMetaFilesStepPart.get_input_files()""" # Method not implemented with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_input_files("cbioportal_meta_files", "run")(None) + cbioportal_export_workflow.get_input_files("cbioportal_meta_files", "run") def test_cbioportal_meta_files_step_part_get_output_files(cbioportal_export_workflow): - """Tests cbioportalMetaFilesStepPart.get_output_files()""" + """Tests CbioportalStudyMetaFilesStepPart.get_log_file()""" + # Define expected: all meta files as somatic variants, CNA, segmentation & expression are present expected = [ - "work/upload/meta_clinical_patient.txt", - "work/upload/meta_clinical_sample.txt", - "work/upload/meta_CNA_gistic.txt", - "work/upload/meta_CNA_log2.txt", - "work/upload/meta_expression_zscores.txt", - "work/upload/meta_mutation_extended.txt", - "work/upload/meta_segment.txt", + "work/upload/meta_{}.txt".format(x) + for x in ( + "study", + "clinical_patient", + "clinical_sample", + "mutation_extended", + "cna_gistic", + "cna_log2", + "segment", + "expression", + ) ] - actual = cbioportal_export_workflow.get_output_files("cbioportal_meta_files", "run") + actual = list(cbioportal_export_workflow.get_output_files("cbioportal_meta_files", "run")) assert actual == expected @@ -187,7 +126,7 @@ def test_cbioportal_meta_files_step_part_get_log_file(cbioportal_export_workflow def test_cbioportal_meta_files_step_part_get_resource_usage(cbioportal_export_workflow): - """Tests ExpansionHunterStepPart.get_resource_usage()""" + """Tests cbioportalMetaFilesStepPart.get_resource_usage()""" # Define expected: default defined workflow.abstract expected_dict = {"threads": 1, "time": "01:00:00", "memory": "2G", "partition": "medium"} # Evaluate @@ -203,16 +142,16 @@ def test_cbioportal_meta_files_step_part_get_resource_usage(cbioportal_export_wo def test_cbioportal_clinical_data_step_part_get_input_files(cbioportal_export_workflow): """Tests cbioportalClinicalDataStepPart.get_input_files()""" # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_input_files("cbioportal_clinical_data", "run")(None) + with pytest.raises(AssertionError): + cbioportal_export_workflow.get_input_files("cbioportal_clinical_data", "run") def test_cbioportal_clinical_data_step_part_get_output_files(cbioportal_export_workflow): """Tests cbioportalClinicalDataStepPart.get_output_files()""" # Define expected expected = { - "patients_tsv": "work/upload/data_clinical_patients.txt", - "samples_tsv": "work/upload/data_clinical_samples.txt", + "patient": "work/upload/data_clinical_patient.txt", + "sample": "work/upload/data_clinical_sample.txt", } # Get actual actual = cbioportal_export_workflow.get_output_files("cbioportal_clinical_data", "run") @@ -221,9 +160,12 @@ def test_cbioportal_clinical_data_step_part_get_output_files(cbioportal_export_w def test_cbioportal_clinical_data_step_part_get_log_file(cbioportal_export_workflow): """Tests cbioportalClinicalDataStepPart.get_log_file()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_log_file("cbioportal_clinical_data", "run") + # Define expected + base_name_out = "work/log/cbioportal_clinical_data" + expected = get_expected_log_files_dict(base_out=base_name_out, extended=False) + # Get actual + actual = cbioportal_export_workflow.get_log_file("cbioportal_clinical_data", "run") + assert actual == expected def test_cbioportal_clinical_data_step_part_get_resource_usage(cbioportal_export_workflow): @@ -239,30 +181,53 @@ def test_cbioportal_clinical_data_step_part_get_resource_usage(cbioportal_export assert actual == expected, msg_error +def test_cbioportal_clinical_data_step_part_get_args(cbioportal_export_workflow): + """Tests cbioportalClinicalDataStepPart.get_args()""" + # Define expected: all patients & samples + expected = { + "P001": {"P001-T1": {"DNA": "P001-T1-DNA1-WGS1", "RNA": "P001-T1-RNA1-mRNA_seq1"}}, + "P002": { + "P002-T1": {"DNA": "P002-T1-DNA1-WGS1"}, + "P002-T2": {"DNA": "P002-T2-DNA1-WGS1", "RNA": "P002-T2-RNA1-mRNA_seq1"}, + }, + } + actual = cbioportal_export_workflow.get_args("cbioportal_clinical_data", "run") + assert actual == expected + + # Tests for cbioportalCaseListsStepPart ---------------------------------------------------------- def test_cbioportal_case_lists_step_part_get_input_files(cbioportal_export_workflow): """Tests cbioportalCaseListsStepPart.get_input_files()""" # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_input_files("cbioportal_case_lists", "run")(None) + with pytest.raises(AssertionError): + cbioportal_export_workflow.get_input_files("cbioportal_case_lists", "run") def test_cbioportal_case_lists_step_part_get_output_files(cbioportal_export_workflow): """Tests cbioportalCaseListsStepPart.get_output_files()""" # Define expected - expected = {"sequenced": "work/upload/case_lists/all_cases_with_mutation_data.txt"} + expected = { + "sequenced": "work/upload/case_lists/all_cases_with_mutation_data.txt", + "cna": "work/upload/case_lists/all_cases_with_cna_data.txt", + "rna_seq_mrna": "work/upload/case_lists/all_cases_with_mrna_rnaseq_data.txt", + "cnaseq": "work/upload/case_lists/all_cases_with_mutation_and_cna_data.txt", + "3way_complete": "work/upload/case_lists/all_cases_with_mutation_and_cna_and_mrna_data.txt", + } # Get actual actual = cbioportal_export_workflow.get_output_files("cbioportal_case_lists", "run") assert actual == expected -def test_cbioportal_case_lists_step_part_get_log_file(cbioportal_export_workflow): +def test_cbioportal_case_lists_data_step_part_get_log_file(cbioportal_export_workflow): """Tests cbioportalCaseListsStepPart.get_log_file()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_log_file("cbioportal_case_lists", "run") + # Define expected + base_name_out = "work/log/cbioportal_case_lists" + expected = get_expected_log_files_dict(base_out=base_name_out, extended=False) + # Get actual + actual = cbioportal_export_workflow.get_log_file("cbioportal_case_lists", "run") + assert actual == expected def test_cbioportal_case_lists_step_part_get_resource_usage(cbioportal_export_workflow): @@ -276,6 +241,55 @@ def test_cbioportal_case_lists_step_part_get_resource_usage(cbioportal_export_wo assert actual == expected, msg_error +def test_cbioportal_case_lists_step_part_get_args(cbioportal_export_workflow): + """Tests cbioportalCaseListsStepPart.get_args()""" + # Define expected: all patients & samples + expected = { + "sequenced": { + "filename": "all_cases_with_mutation_data.txt", + "name": "Sequenced tumors", + "description": "Tumors with somatic variant calls", + "stable_id": "sequenced", + "category": "all_cases_with_mutation_data", + "samples": ["P001-T1", "P002-T1", "P002-T2"], + }, + "cna": { + "filename": "all_cases_with_cna_data.txt", + "name": "Tumors with CNA data", + "description": "Tumors with somatic Copy Number Alteration calls", + "stable_id": "cna", + "category": "all_cases_with_cna_data", + "samples": ["P001-T1", "P002-T1", "P002-T2"], + }, + "rna_seq_mrna": { + "filename": "all_cases_with_mrna_rnaseq_data.txt", + "name": "Tumors with expression data", + "description": "Tumors with mRNA seq expression data", + "stable_id": "rna_seq_mrna", + "category": "all_cases_with_mrna_rnaseq_data", + "samples": ["P001-T1", "P002-T2"], + }, + "cnaseq": { + "filename": "all_cases_with_mutation_and_cna_data.txt", + "name": "Sequenced tumors with CNA", + "description": "Tumors with somatic variant & CNA calls", + "stable_id": "cnaseq", + "category": "all_cases_with_mutation_and_cna_data", + "samples": ["P001-T1", "P002-T1", "P002-T2"], + }, + "3way_complete": { + "filename": "all_cases_with_mutation_and_cna_and_mrna_data.txt", + "name": "Sequenced tumors with CNA & expression", + "description": "Tumors with somatic variant calls, CNA calls & expression data", + "stable_id": "3way_complete", + "category": "all_cases_with_mutation_and_cna_and_mrna_data", + "samples": ["P001-T1", "P002-T2"], + }, + } + actual = cbioportal_export_workflow.get_args("cbioportal_case_lists", "run") + assert actual == expected + + # Tests for cbioportalVcf2MafStepPart ---------------------------------------------------------- @@ -283,9 +297,9 @@ def test_cbioportal_vcf2maf_step_part_get_input_files(cbioportal_export_workflow """Tests cbioportalVcf2MafStepPart.get_input_files()""" expected = { "vcf": ( - "SOM_VAR_FILTRATION/output/{mapper}.{caller}.jannovar_annotate_somatic_vcf." + "/SOM_VAR_FILTRATION/output/{mapper}.{caller}.{annotator}." "dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}.{exon_list}/out/" - "{mapper}.{caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." + "{mapper}.{caller}.{annotator}.dkfz_bias_filter.eb_filter." "{tumor_library}.{filter_set}.{exon_list}.vcf.gz" ) } @@ -298,9 +312,9 @@ def test_cbioportal_vcf2maf_step_part_get_output_files(cbioportal_export_workflo # Define expected expected = { "maf": ( - "work/maf/{mapper}.{caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." + "work/maf/{mapper}.{caller}.{annotator}.dkfz_bias_filter.eb_filter." "{tumor_library}.{filter_set}.{exon_list}/out/{mapper}.{caller}." - "jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." + "{annotator}.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." "{exon_list}.maf" ) } @@ -311,9 +325,17 @@ def test_cbioportal_vcf2maf_step_part_get_output_files(cbioportal_export_workflo def test_cbioportal_vcf2maf_step_part_get_log_file(cbioportal_export_workflow): """Tests cbioportalVcf2MafStepPart.get_log_file()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_log_file("cbioportal_vcf2maf", "run") + # Define expected + base_name_out = ( + "work/maf/{mapper}.{caller}.{annotator}.dkfz_bias_filter.eb_filter." + "{tumor_library}.{filter_set}.{exon_list}/log/{mapper}.{caller}." + "{annotator}.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." + "{exon_list}" + ) + expected = get_expected_log_files_dict(base_out=base_name_out, extended=False) + # Get actual + actual = cbioportal_export_workflow.get_log_file("cbioportal_vcf2maf", "run") + assert actual == expected def test_cbioportal_vcf2maf_step_part_get_args(cbioportal_export_workflow): @@ -332,7 +354,7 @@ def test_cbioportal_vcf2maf_step_part_get_args(cbioportal_export_workflow): def test_cbioportal_vcf2maf_step_part_get_resource_usage(cbioportal_export_workflow): """Tests cbioportalVcf2MafStepPart.get_resource_usage()""" # Define expected: default defined workflow.abstract - expected_dict = {"threads": 4, "time": "12:00:00", "memory": "5120M", "partition": "medium"} + expected_dict = {"threads": 2, "time": "02:00:00", "memory": "5120M", "partition": "medium"} # Evaluate for resource, expected in expected_dict.items(): msg_error = f"Assertion error for resource '{resource}'." @@ -340,219 +362,304 @@ def test_cbioportal_vcf2maf_step_part_get_resource_usage(cbioportal_export_workf assert actual == expected, msg_error -# Tests for cbioportalMafStepPart ---------------------------------------------------------------- +# Tests for cbioportalMutationsStepPart ---------------------------------------------------------------- -def test_cbioportal_maf_step_part_get_input_files(cbioportal_export_workflow): - """Tests cbioportalMafStepPart.get_input_files()""" +def test_cbioportal_mutations_step_part_get_input_files(cbioportal_export_workflow): + """Tests cbioportalMutationsStepPart.get_input_files()""" + sample = "P00{i}-T{t}" base_name = ( - "work/maf/bwa.mutect.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." + "work/maf/bwa.mutect2.vep.dkfz_bias_filter.eb_filter." "P00{i}-T{t}-DNA1-WGS1.dkfz_only.genome_wide/out/" - "bwa.mutect.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." + "bwa.mutect2.vep.dkfz_bias_filter.eb_filter." "P00{i}-T{t}-DNA1-WGS1.dkfz_only.genome_wide.maf" ) - expected = [base_name.format(i=i, t=t) for i, t in ((1, 1), (2, 1), (2, 2))] - actual = cbioportal_export_workflow.get_input_files("cbioportal_maf", "run") + expected = { + sample.format(i=i, t=t): base_name.format(i=i, t=t) for i, t in ((1, 1), (2, 1), (2, 2)) + } + actual = cbioportal_export_workflow.get_input_files("cbioportal_mutations", "run") assert actual == expected -def test_cbioportal_maf_step_part_get_output_files(cbioportal_export_workflow): - """Tests cbioportalMafStepPart.get_output_files()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_output_files("cbioportal_maf", "run") +def test_cbioportal_mutations_step_part_get_output_files(cbioportal_export_workflow): + """Tests cbioportalMutationsStepPart.get_output_files()""" + # Define expected: default defined workflow.abstract + expected = "work/upload/data_mutation_extended.txt" + # Actual + actual = cbioportal_export_workflow.get_output_files("cbioportal_mutations", "run") + assert actual == expected -def test_cbioportal_maf_step_part_get_log_file(cbioportal_export_workflow): - """Tests cbioportalMafStepPart.get_log_file()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_log_file("cbioportal_maf", "run") +def test_cbioportal_mutations_step_part_get_log_file(cbioportal_export_workflow): + """Tests cbioportalMutationsStepPart.get_log_file()""" + # Define expected + base_name_out = "work/log/cbioportal_mutations" + expected = get_expected_log_files_dict(base_out=base_name_out, extended=False) + # Get actual + actual = cbioportal_export_workflow.get_log_file("cbioportal_mutations", "run") + assert actual == expected -def test_cbioportal_maf_step_part_get_resource_usage(cbioportal_export_workflow): - """Tests cbioportalMafStepPart.get_resource_usage()""" +def test_cbioportal_mutations_step_part_get_resource_usage(cbioportal_export_workflow): + """Tests cbioportalMutationsStepPart.get_resource_usage()""" # Define expected: default defined workflow.abstract expected_dict = {"threads": 1, "time": "01:00:00", "memory": "2G", "partition": "medium"} # Evaluate for resource, expected in expected_dict.items(): msg_error = f"Assertion error for resource '{resource}'." - actual = cbioportal_export_workflow.get_resource("cbioportal_maf", "run", resource) + actual = cbioportal_export_workflow.get_resource("cbioportal_mutations", "run", resource) + assert actual == expected, msg_error + + +# Tests for cbioportalCns2CnaStepPart ----------------------------------------------------------- + + +def test_cbioportal_cns2cna_step_part_get_input_files(cbioportal_export_workflow): + """Tests cbioportalCns2CnaStepPart.get_input_files()""" + expected = { + "cns": "/COPY_NUMBER/output/{mapper}.{caller}.{tumor_library}/out/{mapper}.{caller}.{tumor_library}.cns" + } + actual = cbioportal_export_workflow.get_input_files("cbioportal_cns2cna", "run") + assert actual == expected + + +def test_cbioportal_cns2cna_step_part_get_output_files(cbioportal_export_workflow): + """Tests cbioportalCns2CnaStepPart.get_output_files()""" + # Define expected + expected = { + "cna": "work/cna/{mapper}.{caller}.{tumor_library}/out/{mapper}.{caller}.{tumor_library}.cna" + } + # Get actual + actual = cbioportal_export_workflow.get_output_files("cbioportal_cns2cna", "run") + assert actual == expected + + +def test_cbioportal_cns2cna_step_part_get_log_file(cbioportal_export_workflow): + """Tests cbioportalCns2CnaStepPart.get_log_file()""" + # Define expected + base_name_out = ( + "work/cna/{mapper}.{caller}.{tumor_library}/log/{mapper}.{caller}.{tumor_library}" + ) + expected = get_expected_log_files_dict(base_out=base_name_out, extended=False) + # Get actual + actual = cbioportal_export_workflow.get_log_file("cbioportal_cns2cna", "run") + assert actual == expected + + +def test_cbioportal_cns2cna_step_part_get_args(cbioportal_export_workflow): + """Tests cbioportalCns2CnaStepPart.get_args()""" + expected = { + "features": "/path/to/gtf", + "pipeline_id": "ENSEMBL", + } + actual = cbioportal_export_workflow.get_args("cbioportal_cns2cna", "run") + assert actual == expected + + +def test_cbioportal_cns2cna_step_part_get_resource_usage(cbioportal_export_workflow): + """Tests cbioportalCns2CnaStepPart.get_resource_usage()""" + # Define expected: default defined workflow.abstract + expected_dict = {"threads": 2, "time": "02:00:00", "memory": "8192M", "partition": "medium"} + # Evaluate + for resource, expected in expected_dict.items(): + msg_error = f"Assertion error for resource '{resource}'." + actual = cbioportal_export_workflow.get_resource("cbioportal_cns2cna", "run", resource) assert actual == expected, msg_error # Tests for cbioportalCnaFilesStepPart ----------------------------------------------------------- -def test_cbioportal_cna_data_step_part_get_input_files_log2(cbioportal_export_workflow): +def test_cbioportal_cna_step_part_get_input_files_log2(cbioportal_export_workflow): """Tests cbioportalCnaFilesStepPart.get_input_files() - action 'log2'""" # Define expected - base_name = ( - "SOM_CNV_CALLING/output/bwa.copywriter.P00{i}-T{t}-DNA1-WGS1/out/" - "bwa.copywriter.P00{i}-T{t}-DNA1-WGS1_gene_log2.txt" - ) - expected = [base_name.format(i=i, t=t) for i, t in ((1, 1), (2, 1), (2, 2))] + sample = "P00{i}-T{t}" + base_name = "work/cna/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/out/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1.cna" + expected = { + sample.format(i=i, t=t): base_name.format(i=i, t=t) for i, t in ((1, 1), (2, 1), (2, 2)) + } # Get actual - actual = cbioportal_export_workflow.get_input_files("cbioportal_cna_data", "log2") + actual = cbioportal_export_workflow.get_input_files("cbioportal_cna", "log2") assert actual == expected -def test_cbioportal_cna_data_step_part_get_input_files_gistic(cbioportal_export_workflow): +def test_cbioportal_cna_step_part_get_input_files_gistic(cbioportal_export_workflow): """Tests cbioportalCnaFilesStepPart.get_input_files() - action 'gistic'""" # Define expected - base_name = ( - "SOM_CNV_CALLING/output/bwa.copywriter.P00{i}-T{t}-DNA1-WGS1/out/" - "bwa.copywriter.P00{i}-T{t}-DNA1-WGS1_gene_call.txt" - ) - expected = [base_name.format(i=i, t=t) for i, t in ((1, 1), (2, 1), (2, 2))] + sample = "P00{i}-T{t}" + base_name = "work/cna/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/out/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1.cna" + expected = { + sample.format(i=i, t=t): base_name.format(i=i, t=t) for i, t in ((1, 1), (2, 1), (2, 2)) + } # Get actual - actual = cbioportal_export_workflow.get_input_files("cbioportal_cna_data", "gistic") + actual = cbioportal_export_workflow.get_input_files("cbioportal_cna", "gistic") assert actual == expected -def test_cbioportal_cna_data_step_part_get_input_files_segments(cbioportal_export_workflow): - """Tests cbioportalCnaFilesStepPart.get_input_files() - action 'segments'""" +def test_cbioportal_cna_step_part_get_output_files_log2(cbioportal_export_workflow): + """Tests cbioportalCnaFilesStepPart.get_output_files() - action 'log2'""" # Define expected - base_name = ( - "SOM_CNV_CALLING/output/bwa.copywriter.P00{i}-T{t}-DNA1-WGS1/out/" - "bwa.copywriter.P00{i}-T{t}-DNA1-WGS1_segments.txt" - ) - expected = [base_name.format(i=i, t=t) for i, t in ((1, 1), (2, 1), (2, 2))] + expected = "work/upload/data_cna_log2.txt" # Get actual - actual = cbioportal_export_workflow.get_input_files("cbioportal_cna_data", "segments") + actual = cbioportal_export_workflow.get_output_files("cbioportal_cna", "log2") assert actual == expected -def test_cbioportal_cna_data_step_part_get_output_files(cbioportal_export_workflow): - """Tests cbioportalCnaFilesStepPart.get_output_files()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_output_files("cbioportal_cna_data", "action") +def test_cbioportal_cna_step_part_get_output_files_gistic(cbioportal_export_workflow): + """Tests cbioportalCnaFilesStepPart.get_output_files() - action 'gistic'""" + # Define expected + expected = "work/upload/data_cna_gistic.txt" + # Get actual + actual = cbioportal_export_workflow.get_output_files("cbioportal_cna", "gistic") + assert actual == expected -def test_cbioportal_cna_data_step_part_get_log_file(cbioportal_export_workflow): +def test_cbioportal_cna_step_part_get_log_file(cbioportal_export_workflow): """Tests cbioportalCnaFilesStepPart.get_log_file()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_log_file("cbioportal_cna_data", "action") + # Define expected + base_name_out = "work/log/cbioportal_cna" + expected = get_expected_log_files_dict(base_out=base_name_out, extended=False) + # Get actual + actual = cbioportal_export_workflow.get_log_file("cbioportal_cna", "log2") + assert actual == expected + + +def test_cbioportal_cna_step_part_get_args_log2(cbioportal_export_workflow): + """Tests cbioportalCnaFilesStepPart.get_args() -action 'log2'""" + # Define expected + base_name_out = "work/log/cbioportal_cna" + expected = { + "action_type": "log2", + "extra_args": {"amplification": "9", "pipeline_id": "ENSEMBL"}, + } + # Get actual + actual = cbioportal_export_workflow.get_args("cbioportal_cna", "log2") + assert actual == expected + +def test_cbioportal_cna_step_part_get_args_gistic(cbioportal_export_workflow): + """Tests cbioportalCnaFilesStepPart.get_args() -action 'gistic'""" + # Define expected + base_name_out = "work/log/cbioportal_cna" + expected = {"action_type": "gistic", "extra_args": {"pipeline_id": "ENSEMBL"}} + # Get actual + actual = cbioportal_export_workflow.get_args("cbioportal_cna", "gistic") + assert actual == expected -def test_cbioportal_cna_data_step_part_get_resource_usage(cbioportal_export_workflow): + +def test_cbioportal_cna_step_part_get_resource_usage(cbioportal_export_workflow): """Tests cbioportalCnaFilesStepPart.get_resource_usage()""" # Define expected - expected_dict = {"threads": 2, "time": "01:00:00", "memory": "8G", "partition": "medium"} + expected_dict = {"threads": 2, "time": "02:00:00", "memory": "8192M", "partition": "medium"} # Evaluate - all_actions = cbioportal_export_workflow.substep_getattr("cbioportal_cna_data", "actions") + all_actions = cbioportal_export_workflow.substep_getattr("cbioportal_cna", "actions") for action in all_actions: for resource, expected in expected_dict.items(): msg_error = f"Assertion error for resource '{resource}' in action '{action}'." - actual = cbioportal_export_workflow.get_resource( - "cbioportal_cna_data", action, resource - ) + actual = cbioportal_export_workflow.get_resource("cbioportal_cna", action, resource) assert actual == expected, msg_error -# Tests for cbioportalZscoresStepPart ------------------------------------------------------------ +# Tests for cbioportalSegmentStepPart -------------------------------------------------------- -def test_cbioportal_zscores_step_part_get_input_files(cbioportal_export_workflow): - """Tests cbioportalZscoresStepPart.get_input_files()""" +def test_cbioportal_segment_step_part_get_input_files(cbioportal_export_workflow): + """Tests cbioportalSegmentStepPart.get_input_files()""" # Define expected - p1 = "P001-T1" - p2 = "P002-T2" - som_base = ( - "SOM_CNV_CALLING/output/bwa.copywriter.{p}-DNA1-WGS1/out/" - "bwa.copywriter.{p}-DNA1-WGS1_gene_call.txt" - ) - gexp_base = ( - "GENE_EXP_QUANTIFICATION/output/star.featurecounts.{p}-RNA1-mRNA_seq1/out/" - "star.featurecounts.{p}-RNA1-mRNA_seq1.tsv" - ) - expected = [ - (p1, som_base.format(p=p1), gexp_base.format(p=p1)), - (p2, som_base.format(p=p2), gexp_base.format(p=p2)), - ] + sample = "P00{i}-T{t}" + base_name = "/COPY_NUMBER/output/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/out/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1.cns" + expected = { + sample.format(i=i, t=t): base_name.format(i=i, t=t) for i, t in ((1, 1), (2, 1), (2, 2)) + } # Get actual - actual = cbioportal_export_workflow.get_input_files("cbioportal_zscores", "get_zscores_input") - actual = sorted(actual) + actual = cbioportal_export_workflow.get_input_files("cbioportal_segment", "run") assert actual == expected -def test_cbioportal_zscores_step_part_get_output_files(cbioportal_export_workflow): - """Tests cbioportalZscoresStepPart.get_output_files()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_output_files("cbioportal_zscores", "run") - - -def test_cbioportal_zscores_step_part_get_log_file(cbioportal_export_workflow): - """Tests cbioportalZscoresStepPart.get_log_file()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_log_file("cbioportal_zscores", "run") +def test_cbioportal_segment_step_part_get_output_files(cbioportal_export_workflow): + """Tests cbioportalSegmentStepPart.get_output_files()""" + # Define expected + expected = "work/upload/data_segment.txt" + # Actual + actual = cbioportal_export_workflow.get_output_files("cbioportal_segment", "run") + assert actual == expected -def test_cbioportal_zscores_step_part_get_df( - cbioportal_export_workflow, cbioportal_zscores_get_df_content, tmpdir -): - """Tests cbioportalZscoresStepPart.get_df()""" +def test_cbioportal_segment_step_part_get_log_file(cbioportal_export_workflow): + """Tests cbioportalSegmentStepPart.get_log_file()""" # Define expected - expected = cbioportal_zscores_get_df_content - # Prepare method input in temporary directory - _tmp_work_dir = tmpdir.mkdir("work") - output_path = str(_tmp_work_dir.join("zscores_mapping_df.tsv")) - output = (output_path,) - # Get actual and assert - cbioportal_export_workflow.substep_getattr("cbioportal_zscores", "get_df")(output) - actual = Path(output_path).read_text(encoding="utf8") + base_name_out = "work/log/cbioportal_segment" + expected = get_expected_log_files_dict(base_out=base_name_out, extended=False) + # Get actual + actual = cbioportal_export_workflow.get_log_file("cbioportal_segment", "run") assert actual == expected -def test_cbioportal_zscores_step_part_get_resource_usage(cbioportal_export_workflow): - """Tests cbioportalZscoresStepPart.get_resource_usage()""" +def test_cbioportal_segment_step_part_get_resource_usage(cbioportal_export_workflow): + """Tests cbioportalSegmentStepPart.get_resource_usage()""" # Define expected: default defined workflow.abstract - expected_dict = {"threads": 1, "time": "01:00:00", "memory": "2G", "partition": "medium"} + expected_dict = {"threads": 2, "time": "02:00:00", "memory": "8192M", "partition": "medium"} # Evaluate for resource, expected in expected_dict.items(): msg_error = f"Assertion error for resource '{resource}'." - actual = cbioportal_export_workflow.get_resource("cbioportal_zscores", "run", resource) + actual = cbioportal_export_workflow.get_resource("cbioportal_segment", "run", resource) assert actual == expected, msg_error -# Tests for CbioportalComputeZscoresStepPart ----------------------------------------------------- +# Tests for cbioportalExpressionStepPart ----------------------------------------------------- -def test_cbioportal_compute_zscores_step_part_get_input_files(cbioportal_export_workflow): - """Tests CbioportalComputeZscoresStepPart.get_input_files()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_output_files("cbioportal_compute_zscores", "run") +def test_cbioportal_expression_step_part_get_input_files(cbioportal_export_workflow): + """Tests cbioportalExpressionStepPart.get_input_files()""" + # Define expected + sample = "P00{i}-T{t}" + base_name = ( + "/NGS_MAPPING/output/star.P00{i}-T{t}-RNA1-mRNA_seq1/out/" + "star.P00{i}-T{t}-RNA1-mRNA_seq1.GeneCounts.tab" + ) + expected = {sample.format(i=i, t=t): base_name.format(i=i, t=t) for i, t in ((1, 1), (2, 2))} + # Get actual + actual = cbioportal_export_workflow.get_input_files("cbioportal_expression", "run") + assert actual == expected -def test_cbioportal_compute_zscores_step_part_get_output_files(cbioportal_export_workflow): - """Tests CbioportalComputeZscoresStepPart.get_output_files()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_output_files("cbioportal_compute_zscores", "run") +def test_cbioportal_expression_step_part_get_output_files(cbioportal_export_workflow): + """Tests cbioportalExpressionStepPart.get_output_files()""" + # Define expected + expected = "work/upload/data_expression.txt" + # Actual + actual = cbioportal_export_workflow.get_output_files("cbioportal_expression", "run") + assert actual == expected -def test_cbioportal_compute_zscores_step_part_get_log_file(cbioportal_export_workflow): - """Tests CbioportalComputeZscoresStepPart.get_log_file()""" - # Method not implemented - with pytest.raises(NotImplementedError): - cbioportal_export_workflow.get_log_file("cbioportal_compute_zscores", "run") +def test_cbioportal_expression_step_part_get_log_file(cbioportal_export_workflow): + """Tests cbioportalExpressionStepPart.get_log_file()""" + # Define expected + base_name_out = "work/log/cbioportal_expression" + expected = get_expected_log_files_dict(base_out=base_name_out, extended=False) + # Get actual + actual = cbioportal_export_workflow.get_log_file("cbioportal_expression", "run") + assert actual == expected + +def test_cbioportal_expression_step_part_get_args(cbioportal_export_workflow): + """Tests cbioportalExpressionStepPart.get_args()""" + expected = { + "action_type": "expression", + "extra_args": {"tx_obj": "/path/to/gtf", "pipeline_id": "ENSEMBL"}, + } + actual = cbioportal_export_workflow.get_args("cbioportal_expression", "run") + assert actual == expected -def test_cbioportal_compute_zscores_step_part_get_resource_usage(cbioportal_export_workflow): - """Tests CbioportalComputeZscoresStepPart.get_resource_usage()""" + +def test_cbioportal_expression_step_part_get_resource_usage(cbioportal_export_workflow): + """Tests cbioportalExpressionStepPart.get_resource_usage()""" # Define expected: default defined workflow.abstract - expected_dict = {"threads": 1, "time": "01:00:00", "memory": "2G", "partition": "medium"} + expected_dict = {"threads": 2, "time": "02:00:00", "memory": "8192M", "partition": "medium"} # Evaluate for resource, expected in expected_dict.items(): msg_error = f"Assertion error for resource '{resource}'." - actual = cbioportal_export_workflow.get_resource( - "cbioportal_compute_zscores", "run", resource - ) + actual = cbioportal_export_workflow.get_resource("cbioportal_expression", "run", resource) assert actual == expected, msg_error @@ -565,36 +672,41 @@ def test_cbioportal_export_workflow(cbioportal_export_workflow): expected = [ "cbioportal_case_lists", "cbioportal_clinical_data", - "cbioportal_cna_data", - "cbioportal_compute_zscores", - "cbioportal_maf", + "cbioportal_cna", + "cbioportal_cns2cna", + "cbioportal_expression", "cbioportal_meta_files", - "cbioportal_study_meta_files", + "cbioportal_mutations", + "cbioportal_segment", "cbioportal_vcf2maf", - "cbioportal_zscores", - "link_out", ] actual = list(sorted(cbioportal_export_workflow.sub_steps.keys())) assert actual == expected # Check result file construction expected = [ + "work/upload/case_lists/all_cases_with_cna_data.txt", + "work/upload/case_lists/all_cases_with_mrna_rnaseq_data.txt", + "work/upload/case_lists/all_cases_with_mutation_and_cna_and_mrna_data.txt", + "work/upload/case_lists/all_cases_with_mutation_and_cna_data.txt", "work/upload/case_lists/all_cases_with_mutation_data.txt", - "work/upload/data_CNA_gistic.txt", - "work/upload/data_CNA_log2.txt", - "work/upload/data_clinical_patients.txt", - "work/upload/data_clinical_samples.txt", - "work/upload/data_expression_zscores.txt", + "work/upload/data_clinical_patient.txt", + "work/upload/data_clinical_sample.txt", + "work/upload/data_cna_gistic.txt", + "work/upload/data_cna_log2.txt", + "work/upload/data_expression.txt", "work/upload/data_mutation_extended.txt", "work/upload/data_segment.txt", - "work/upload/meta_CNA_gistic.txt", - "work/upload/meta_CNA_log2.txt", "work/upload/meta_clinical_patient.txt", "work/upload/meta_clinical_sample.txt", - "work/upload/meta_expression_zscores.txt", + "work/upload/meta_cna_gistic.txt", + "work/upload/meta_cna_log2.txt", + "work/upload/meta_expression.txt", "work/upload/meta_mutation_extended.txt", "work/upload/meta_segment.txt", "work/upload/meta_study.txt", ] actual = list(sorted(cbioportal_export_workflow.get_result_files())) assert actual == expected + + assert cbioportal_export_workflow.check_config() == 0 diff --git a/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py b/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py index 197cb802a..056b56705 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py +++ b/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py @@ -701,6 +701,7 @@ def test_ngs_mapping_workflow_steps(ngs_mapping_workflow): "minimap2", "ngs_chew", "star", + "strandedness", "target_coverage_report", ] actual = ngs_mapping_workflow.sub_steps.keys() diff --git a/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping_processed_fastq.py b/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping_processed_fastq.py index 92ab21943..c62ecebc6 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping_processed_fastq.py +++ b/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping_processed_fastq.py @@ -307,8 +307,6 @@ def test_star_step_part_get_output_files(ngs_mapping_workflow): ] = "work/star.{library_name}/out/star.{library_name}.toTranscriptome.bam.md5" expected["output_links"].extend( [ - "output/star.{library_name}/out/star.{library_name}.GeneCounts.tab", - "output/star.{library_name}/out/star.{library_name}.GeneCounts.tab.md5", "output/star.{library_name}/out/star.{library_name}.toTranscriptome.bam", "output/star.{library_name}/out/star.{library_name}.toTranscriptome.bam.md5", ] @@ -344,6 +342,95 @@ def test_star_step_part_get_resource(ngs_mapping_workflow): assert actual == expected, msg_error +# Tests for StrandednessStepPart ------------------------------------------------------------------- + + +def test_strandedness_step_part_infer_get_input_files(ngs_mapping_workflow): + """Tests StrandednessStepPart.get_input_files()""" + # Define expected + expected = { + "bam": "work/{mapper}.{library_name}/out/{mapper}.{library_name}.bam", + } + # Get actual + actual = ngs_mapping_workflow.get_input_files("strandedness", "infer") + assert actual == expected + + +def test_strandedness_step_part_counts_get_input_files(ngs_mapping_workflow): + """Tests StrandednessStepPart.get_input_files()""" + # Define expected + expected = { + "decision": "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.decision.json", + "counts": "work/{mapper}.{library_name}/out/{mapper}.{library_name}.GeneCounts.tab", + } + # Get actual + actual = ngs_mapping_workflow.get_input_files("strandedness", "counts") + assert actual == expected + + +def test_strandedness_step_part_infer_get_output_files(ngs_mapping_workflow): + """Tests StrandednessStepPart.get_output_files()""" + # Define expected + expected = { + "tsv": "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.infer.txt", + "tsv_md5": "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.infer.txt.md5", + "decision": "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.decision.json", + "decision_md5": "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.decision.json.md5", + "output": "output/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.decision.json", + "output_md5": "output/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.decision.json.md5", + "log": "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.log", + "log_md5": "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.log.md5", + "conda_list": "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.conda_list.txt", + "conda_list_md5": "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.conda_list.txt.md5", + "conda_info": "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.conda_info.txt", + "conda_info_md5": "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.conda_info.txt.md5", + } + # Get actual + actual = ngs_mapping_workflow.get_output_files("strandedness", "infer") + assert actual == expected + + +def test_strandedness_step_part_counts_get_output_files(ngs_mapping_workflow): + """Tests StrandednessStepPart.get_output_files()""" + # Define expected + expected = { + "counts": "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.GeneCounts.tab", + "counts_md5": "work/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.GeneCounts.tab.md5", + "output": "output/{mapper}.{library_name}/out/{mapper}.{library_name}.GeneCounts.tab", + "output_md5": "output/{mapper}.{library_name}/out/{mapper}.{library_name}.GeneCounts.tab.md5", + } + # Get actual + actual = ngs_mapping_workflow.get_output_files("strandedness", "counts") + assert actual == expected + + +def test_strandedness_step_part_infer_get_log_file(ngs_mapping_workflow): + """Tests StrandednessStepPart.get_log_file()""" + # Define expected + expected = { + "log": "work/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.log", + "log_md5": "work/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.log.md5", + "conda_info": "work/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.conda_info.txt", + "conda_info_md5": "work/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.conda_info.txt.md5", + "conda_list": "work/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.conda_list.txt", + "conda_list_md5": "work/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.conda_list.txt.md5", + } + # Get actual + actual = ngs_mapping_workflow.get_log_file("strandedness", "infer") + assert actual == expected + + +def test_strandedness_step_part_infer_get_resource(ngs_mapping_workflow): + """Tests StrandednessStepPart.get_resource()""" + # Define expected + expected_dict = {"threads": 1, "time": "01:00:00", "memory": "2G", "partition": "medium"} + # Evaluate + for resource, expected in expected_dict.items(): + msg_error = f"Assertion error for resource '{resource}'." + actual = ngs_mapping_workflow.get_resource("strandedness", "infer", resource) + assert actual == expected, msg_error + + # Tests for Minimap2StepPart ----------------------------------------------------------------------- @@ -567,6 +654,7 @@ def test_ngs_mapping_workflow_steps(ngs_mapping_workflow): "minimap2", "ngs_chew", "star", + "strandedness", "target_coverage_report", ] actual = ngs_mapping_workflow.sub_steps.keys() @@ -703,5 +791,26 @@ def test_ngs_mapping_workflow_files(ngs_mapping_workflow): for ext in ("npz", "npz.md5") for library_name in rna ] + expected += [ + "output/star.{library_name}/strandedness/star.{library_name}.{ext}".format( + library_name=library_name, ext=ext + ) + for ext in ("decision.json", "decision.json.md5") + for library_name in rna + ] + expected += [ + "output/star.{library_name}/log/star.{library_name}.strandedness.{ext}".format( + library_name=library_name, ext=ext + ) + for ext in ( + "log", + "log.md5", + "conda_list.txt", + "conda_list.txt.md5", + "conda_info.txt", + "conda_info.txt.md5", + ) + for library_name in rna + ] assert sorted(ngs_mapping_workflow.get_result_files()) == sorted(expected) diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py index dd66c9deb..fd756d9a4 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py @@ -427,7 +427,9 @@ def test_cnvkit_call_step_part_get_input_files(somatic_targeted_seq_cnv_calling_ def test_cnvkit_call_step_part_get_output_files(somatic_targeted_seq_cnv_calling_workflow): - base_name_out = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.cns" + base_name_out = ( + "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.call.cns" + ) expected = {"calls": base_name_out, "calls_md5": base_name_out + ".md5"} actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("cnvkit", "call") assert actual == expected @@ -453,13 +455,60 @@ def test_cnvkit_call_step_part_get_resource(somatic_targeted_seq_cnv_calling_wor assert actual == expected, msg_error +# Tests for CnvKitStepPart (postprocess) ---------------------------------------------------------- + + +def test_cnvkit_postprocess_step_part_get_input_files(somatic_targeted_seq_cnv_calling_workflow): + # Define expected + segment_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.segment.cns" + call_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.call.cns" + expected = {"segment": segment_file, "call": call_file} + # Get actual + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) + actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("cnvkit", "postprocess")( + wildcards + ) + assert actual == expected + + +def test_cnvkit_postprocess_step_part_get_output_files(somatic_targeted_seq_cnv_calling_workflow): + base_name_out = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.cns" + expected = {"final": base_name_out, "final_md5": base_name_out + ".md5"} + actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("cnvkit", "postprocess") + assert actual == expected + + +def test_cnvkit_postprocess_step_part_get_log_file(somatic_targeted_seq_cnv_calling_workflow): + # Define expected + base_name_out = ( + "work/{mapper}.cnvkit.{library_name}/log/{mapper}.cnvkit.postprocess.{library_name}" + ) + expected = get_expected_log_files_dict(base_out=base_name_out) + # Get actual + actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("cnvkit", "postprocess") + assert actual == expected + + +def test_cnvkit_postprocess_step_part_get_resource(somatic_targeted_seq_cnv_calling_workflow): + """Tests CnvKitStepPart.get_resource_usage() - action 'postprocess'""" + # Define expected + expected_dict = {"threads": 1, "time": "03:59:59", "memory": "7680M", "partition": "medium"} + # Evaluate + for resource, expected in expected_dict.items(): + msg_error = f"Assertion error for resource '{resource}'." + actual = somatic_targeted_seq_cnv_calling_workflow.get_resource( + "cnvkit", "postprocess", resource + ) + assert actual == expected, msg_error + + # Tests for CnvKitStepPart (plot) ----------------------------------------------------------------- def test_cnvkit_plot_step_part_get_input_files(somatic_targeted_seq_cnv_calling_workflow): # Define expected cnr_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.cnr" - cns_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.cns" + cns_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.call.cns" expected = { "cnr": cnr_file, "cns": cns_file, @@ -520,7 +569,9 @@ def test_cnvkit_plot_step_part_get_resource(somatic_targeted_seq_cnv_calling_wor def test_cnvkit_export_step_part_get_input_files(somatic_targeted_seq_cnv_calling_workflow): wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) - expected = {"cns": "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.cns"} + expected = { + "cns": "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.call.cns" + } actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("cnvkit", "export")( wildcards ) @@ -567,7 +618,7 @@ def test_cnvkit_export_step_part_get_resource(somatic_targeted_seq_cnv_calling_w def test_cnvkit_report_step_part_get_input_files(somatic_targeted_seq_cnv_calling_workflow): # Define expected cnr_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.cnr" - cns_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.cns" + cns_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.call.cns" target_file = ( "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.targetcoverage.cnn" ) diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_wgs_cnv_calling.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_wgs_cnv_calling.py index 7bec82eaa..35a62fa08 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_wgs_cnv_calling.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_wgs_cnv_calling.py @@ -380,7 +380,9 @@ def test_cnvkit_call_step_part_get_input_files(somatic_wgs_cnv_calling_workflow) def test_cnvkit_call_step_part_get_output_files(somatic_wgs_cnv_calling_workflow): - base_name_out = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.cns" + base_name_out = ( + "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.call.cns" + ) expected = {"calls": base_name_out, "calls_md5": base_name_out + ".md5"} assert somatic_wgs_cnv_calling_workflow.get_output_files("cnvkit", "call") == expected @@ -405,13 +407,54 @@ def test_cnvkit_call_step_part_get_resource(somatic_wgs_cnv_calling_workflow): assert actual == expected, msg_error +# Tests for CnvKitStepPart (postprocess) ---------------------------------------------------------- + + +def test_cnvkit_postprocess_step_part_get_input_files(somatic_wgs_cnv_calling_workflow): + # Define expected + call_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.call.cns" + expected = {"call": call_file} + # Get actual + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) + actual = somatic_wgs_cnv_calling_workflow.get_input_files("cnvkit", "postprocess")(wildcards) + assert actual == expected + + +def test_cnvkit_postprocess_step_part_get_output_files(somatic_wgs_cnv_calling_workflow): + base_name_out = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.cns" + expected = {"final": base_name_out, "final_md5": base_name_out + ".md5"} + assert somatic_wgs_cnv_calling_workflow.get_output_files("cnvkit", "postprocess") == expected + + +def test_cnvkit_postprocess_step_part_get_log_file(somatic_wgs_cnv_calling_workflow): + # Define expected + base_name_out = ( + "work/{mapper}.cnvkit.{library_name}/log/{mapper}.cnvkit.postprocess.{library_name}" + ) + expected = get_expected_log_files_dict(base_out=base_name_out) + # Get actual + actual = somatic_wgs_cnv_calling_workflow.get_log_file("cnvkit", "postprocess") + assert actual == expected + + +def test_cnvkit_postprocess_step_part_get_resource(somatic_wgs_cnv_calling_workflow): + """Tests CnvKitStepPart.get_resource_usage() - action 'call'""" + # Define expected + expected_dict = {"threads": 1, "time": "1-00:00:00", "memory": "7680M", "partition": "medium"} + # Evaluate + for resource, expected in expected_dict.items(): + msg_error = f"Assertion error for resource '{resource}'." + actual = somatic_wgs_cnv_calling_workflow.get_resource("cnvkit", "postprocess", resource) + assert actual == expected, msg_error + + # Tests for CnvKitStepPart (plot) ----------------------------------------------------------------- def test_cnvkit_plot_step_part_get_input_files(somatic_wgs_cnv_calling_workflow): # Define expected cnr_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.cnr" - cns_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.cns" + cns_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.call.cns" expected = { "cnr": cnr_file, "cns": cns_file, @@ -472,7 +515,9 @@ def test_cnvkit_plot_step_part_get_resource(somatic_wgs_cnv_calling_workflow): def test_cnvkit_export_step_part_get_input_files(somatic_wgs_cnv_calling_workflow): wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) - expected = {"cns": "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.cns"} + expected = { + "cns": "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.call.cns" + } actual = somatic_wgs_cnv_calling_workflow.get_input_files("cnvkit", "export")(wildcards) assert actual == expected @@ -515,7 +560,7 @@ def test_cnvkit_export_step_part_get_resource(somatic_wgs_cnv_calling_workflow): def test_cnvkit_report_step_part_get_input_files(somatic_wgs_cnv_calling_workflow): # Define expected cnr_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.cnr" - cns_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.cns" + cns_file = "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.call.cns" target_file = ( "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.targetcoverage.cnn" ) From 02fa2daa08ee9eaf68d5091765c9fcb03b989820 Mon Sep 17 00:00:00 2001 From: Manuel Holtgrewe Date: Wed, 12 Jul 2023 07:28:24 +0200 Subject: [PATCH 02/19] fix: pin dependency joblib of gcnv (#412) --- snappy_wrappers/wrappers/gcnv/environment.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/snappy_wrappers/wrappers/gcnv/environment.yaml b/snappy_wrappers/wrappers/gcnv/environment.yaml index ec3b1f0d7..34c1d5e64 100644 --- a/snappy_wrappers/wrappers/gcnv/environment.yaml +++ b/snappy_wrappers/wrappers/gcnv/environment.yaml @@ -18,6 +18,7 @@ dependencies: - defaults::tensorflow =1.15.0 - conda-forge::scipy =1.0.0 - conda-forge::pymc3 =3.1 + - conda-forge::joblib =1.2.0 - conda-forge::h5py =2.10.0 - conda-forge::keras =2.2.4 - defaults::intel-openmp =2019.4 From 46782861e89b59b471e9bb4d5945af4307f501e9 Mon Sep 17 00:00:00 2001 From: Manuel Holtgrewe Date: Wed, 12 Jul 2023 09:01:31 +0200 Subject: [PATCH 03/19] chore: bump mehari to 0.6.1 (#418) --- snappy_wrappers/wrappers/mehari/environment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snappy_wrappers/wrappers/mehari/environment.yaml b/snappy_wrappers/wrappers/mehari/environment.yaml index 065eca483..ce59f73a9 100644 --- a/snappy_wrappers/wrappers/mehari/environment.yaml +++ b/snappy_wrappers/wrappers/mehari/environment.yaml @@ -5,7 +5,7 @@ dependencies: - bcftools >=1.9 - htslib >=1.9 - samtools >=1.9 - - mehari ==0.2.1 + - mehari ==0.6.1 - jq - vcfpy - pysam From 6691295e436c30361ca48a26052b8b390464b537 Mon Sep 17 00:00:00 2001 From: Manuel Holtgrewe Date: Mon, 17 Jul 2023 09:54:49 +0200 Subject: [PATCH 04/19] chore: bump mehari to 0.6.2 (#419) --- snappy_wrappers/wrappers/mehari/environment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snappy_wrappers/wrappers/mehari/environment.yaml b/snappy_wrappers/wrappers/mehari/environment.yaml index ce59f73a9..8461e28b2 100644 --- a/snappy_wrappers/wrappers/mehari/environment.yaml +++ b/snappy_wrappers/wrappers/mehari/environment.yaml @@ -5,7 +5,7 @@ dependencies: - bcftools >=1.9 - htslib >=1.9 - samtools >=1.9 - - mehari ==0.6.1 + - mehari ==0.6.2 - jq - vcfpy - pysam From 04551d5ed26b31e6c822df1a1fe6d83587edec74 Mon Sep 17 00:00:00 2001 From: Manuel Holtgrewe Date: Mon, 17 Jul 2023 11:24:45 +0200 Subject: [PATCH 05/19] fix: bump time of ngs_mapping/bam_collect_doc (#394) --- snappy_pipeline/workflows/ngs_mapping/__init__.py | 2 +- tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/snappy_pipeline/workflows/ngs_mapping/__init__.py b/snappy_pipeline/workflows/ngs_mapping/__init__.py index 6e40acacb..0854f0f4b 100644 --- a/snappy_pipeline/workflows/ngs_mapping/__init__.py +++ b/snappy_pipeline/workflows/ngs_mapping/__init__.py @@ -1253,7 +1253,7 @@ def get_resource_usage(self, action): self._check_action(action) return ResourceUsage( threads=1, - time="04:00:00", + time="24:00:00", memory="2G", ) diff --git a/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py b/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py index 056b56705..365b5bce4 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py +++ b/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py @@ -679,7 +679,7 @@ def test_generate_doc_files_step_part_run_get_log_file(ngs_mapping_workflow): def test_generate_doc_files_step_part_get_resource(ngs_mapping_workflow): """Tests BamCollectDocStepPart.get_resource()""" - expected_dict = {"threads": 1, "time": "04:00:00", "memory": "2G", "partition": "medium"} + expected_dict = {"threads": 1, "time": "24:00:00", "memory": "2G", "partition": "medium"} for resource, expected in expected_dict.items(): actual = ngs_mapping_workflow.get_resource("bam_collect_doc", "run", resource) assert actual == expected From a40a42da3762f8f06a89d67b46e3f817a2f135bb Mon Sep 17 00:00:00 2001 From: Manuel Holtgrewe Date: Mon, 17 Jul 2023 15:51:28 +0200 Subject: [PATCH 06/19] fix: making compatible with varfish export and mehari (#420) --- .../workflows/varfish_export/__init__.py | 5 ++--- .../mehari/annotate_strucvars/wrapper.py | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/snappy_pipeline/workflows/varfish_export/__init__.py b/snappy_pipeline/workflows/varfish_export/__init__.py index f4c07d0d5..1211f62dd 100644 --- a/snappy_pipeline/workflows/varfish_export/__init__.py +++ b/snappy_pipeline/workflows/varfish_export/__init__.py @@ -87,9 +87,6 @@ #: Extension of files EXTS = (".tsv.gz", ".tsv.gz.md5") -#: Infixes to use for file name generation -INFIXES = ("gts", "db-infos", "bam-qc") - # TODO: the number of restart times is high because tabix in HTSJDK/Jannovar is flaky... #: Default configuration for the somatic_variant_calling step @@ -391,6 +388,8 @@ def _get_output_files_annotate_strucvars(self): work_paths = { "gts": f"{prefix}.gts.tsv.gz", "gts_md5": f"{prefix}.gts.tsv.gz.md5", + "feature_effects": f"{prefix}.feature-effects.tsv.gz", + "feature_effects_md5": f"{prefix}.feature-effects.tsv.gz.md5", "db_infos": f"{prefix}.db-infos.tsv.gz", "db_infos_md5": f"{prefix}.db-infos.tsv.gz.md5", } diff --git a/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py b/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py index 7ea72deac..55f8d6dbd 100644 --- a/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py +++ b/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py @@ -92,6 +92,25 @@ tabix -s1 -b2 -e2 -f $TMPDIR/final_for_import.$num.vcf.gz done +cat <<"EOF" > $TMPDIR/feature-effects.tsv +case_id +set_id +sv_uuid +refseq_gene_id +refseq_transcript_id +refseq_transcript_coding +refseq_effect +ensembl_gene_id +ensembl_transcript_id +ensembl_transcript_coding +ensembl_effect +EOF + +cat $TMPDIR/feature-effects.tsv \ +| tr '\n' '\t' \ +| sed -e 's/\t$/\n/g' \ +>{snakemake.output.feature_effects} + # Perform Mehari structural variant annotation. mehari \ annotate \ @@ -113,6 +132,7 @@ # Compute MD5 sums on output files compute-md5 {snakemake.output.db_infos} {snakemake.output.db_infos_md5} compute-md5 {snakemake.output.gts} {snakemake.output.gts_md5} +compute-md5 {snakemake.output.feature_effects} {snakemake.output.feature_effects_md5} # Create output links ----------------------------------------------------------------------------- From 740dda551cf71e49faa31c8fd76ed46aad0dc91c Mon Sep 17 00:00:00 2001 From: ericblanc20 Date: Thu, 27 Jul 2023 07:54:23 +0200 Subject: [PATCH 07/19] fix: fixes multiple issues with the recent cbioportal export changes (#425) Co-authored-by: Manuela Benary --- .../workflows/cbioportal_export/__init__.py | 6 +- .../somatic_variant_calling/__init__.py | 20 +- .../cbioportal/clinical_data/wrapper.py | 8 +- .../cbioportal/generate_cna/environment.yaml | 2 +- .../wrappers/cbioportal/generate_cna/script.R | 2 - .../wrappers/cbioportal/helper_functions.R | 20 +- .../wrappers/cbioportal/merge_tables/script.R | 12 +- .../wrappers/mutect2/filter/wrapper.py | 8 +- .../vcf2maf/vcf_to_table/environment.yaml | 11 +- .../vcf2maf/vcf_to_table/functions.py | 5 +- .../vcf_to_table/hgnc_symbol_to_entrez_id.tsv | 43709 ++++++++++++++++ .../vcf2maf/vcf_to_table/jannovar.yaml | 421 + .../vcf_to_table/protein_mutation_parser.py | 132 +- .../vcf_to_table/variant_classification.py | 78 +- .../vcf_to_table/{config.yaml => vep.yaml} | 2 +- .../wrappers/vcf2maf/vcf_to_table/wrapper.py | 11 +- .../test_workflows_somatic_variant_calling.py | 12 +- 17 files changed, 44343 insertions(+), 116 deletions(-) create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/hgnc_symbol_to_entrez_id.tsv create mode 100644 snappy_wrappers/wrappers/vcf2maf/vcf_to_table/jannovar.yaml rename snappy_wrappers/wrappers/vcf2maf/vcf_to_table/{config.yaml => vep.yaml} (99%) diff --git a/snappy_pipeline/workflows/cbioportal_export/__init__.py b/snappy_pipeline/workflows/cbioportal_export/__init__.py index e42d917a1..a864151fa 100644 --- a/snappy_pipeline/workflows/cbioportal_export/__init__.py +++ b/snappy_pipeline/workflows/cbioportal_export/__init__.py @@ -104,9 +104,9 @@ study_description: REQUIRED # REQUIRED study_name: REQUIRED # REQUIRED study_name_short: REQUIRED # REQUIRED - patient_info: [] # Unimplemented - sample_info: [] # Each entry must have a path & a step associated, see example below - # - step: tumor_mutational_burden + patient_info: {} # Unimplemented + sample_info: {} # Each additional sample column must have a name and a (possibly empty) config attached. + # tumor_mutational_burden: # path: ../tumor_mutational_burden """ diff --git a/snappy_pipeline/workflows/somatic_variant_calling/__init__.py b/snappy_pipeline/workflows/somatic_variant_calling/__init__.py index 92b5bed42..2999aa100 100644 --- a/snappy_pipeline/workflows/somatic_variant_calling/__init__.py +++ b/snappy_pipeline/workflows/somatic_variant_calling/__init__.py @@ -108,8 +108,8 @@ "vcf_md5": ".vcf.gz.md5", "vcf_tbi": ".vcf.gz.tbi", "vcf_tbi_md5": ".vcf.gz.tbi.md5", - "full": ".full.vcf.gz", - "full_md5": ".full.vcf.gz.md5", + "full_vcf": ".full.vcf.gz", + "full_vcf_md5": ".full.vcf.gz.md5", "full_vcf_tbi": ".full.vcf.gz.tbi", "full_vcf_tbi_md5": ".full.vcf.gz.tbi.md5", "txt": ".txt", @@ -122,8 +122,8 @@ "vcf_md5": ".vcf.gz.md5", "vcf_tbi": ".vcf.gz.tbi", "vcf_tbi_md5": ".vcf.gz.tbi.md5", - "full": ".full.vcf.gz", - "full_md5": ".full.vcf.gz.md5", + "full_vcf": ".full.vcf.gz", + "full_vcf_md5": ".full.vcf.gz.md5", "full_vcf_tbi": ".full.vcf.gz.tbi", "full_vcf_tbi_md5": ".full.vcf.gz.tbi.md5", "tar": ".tar.gz", @@ -134,8 +134,8 @@ "vcf_md5": ".vcf.gz.md5", "vcf_tbi": ".vcf.gz.tbi", "vcf_tbi_md5": ".vcf.gz.tbi.md5", - "full": ".full.vcf.gz", - "full_md5": ".full.vcf.gz.md5", + "full_vcf": ".full.vcf.gz", + "full_vcf_md5": ".full.vcf.gz.md5", "full_vcf_tbi": ".full.vcf.gz.tbi", "full_vcf_tbi_md5": ".full.vcf.gz.tbi.md5", }, @@ -675,8 +675,8 @@ def get_output_files(self, action): } if action == "filter": exts = { - "full": ".full.vcf.gz", - "full_md5": ".full.vcf.gz.md5", + "full_vcf": ".full.vcf.gz", + "full_vcf_md5": ".full.vcf.gz.md5", "full_vcf_tbi": ".full.vcf.gz.tbi", "full_vcf_tbi_md5": ".full.vcf.gz.tbi.md5", "vcf": ".vcf.gz", @@ -818,8 +818,8 @@ class Strelka2StepPart(SomaticVariantCallingStepPart): "vcf_md5": ".vcf.gz.md5", "vcf_tbi": ".vcf.gz.tbi", "vcf_tbi_md5": ".vcf.gz.tbi.md5", - "full": ".full.vcf.gz", - "full_md5": ".full.vcf.gz.md5", + "full_vcf": ".full.vcf.gz", + "full_vcf_md5": ".full.vcf.gz.md5", "full_vcf_tbi": ".full.vcf.gz.tbi", "full_vcf_tbi_md5": ".full.vcf.gz.tbi.md5", "stats": ".tsv", diff --git a/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py b/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py index 65aae5b9a..38788eacf 100644 --- a/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py +++ b/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py @@ -80,15 +80,13 @@ def write_clinical_samples_tsv(donors): """ sample_info_getters = [] - for extra_info in snakemake.config["step_config"]["cbioportal_export"]["sample_info"]: - step = extra_info["step"] + config = snakemake.config["step_config"]["cbioportal_export"] + for step, extra_info in config["sample_info"].items(): if step == "tumor_mutational_burden": sample_info_getters.append( SampleInfoTMB( extra_info, - somatic_variant_tool=snakemake.config["step_config"]["cbioportal_export"][ - "somatic_variant_calling_tool" - ], + somatic_variant_tool=config["somatic_variant_calling_tool"], ) ) else: diff --git a/snappy_wrappers/wrappers/cbioportal/generate_cna/environment.yaml b/snappy_wrappers/wrappers/cbioportal/generate_cna/environment.yaml index 1f257fe3a..869a5e0d8 100644 --- a/snappy_wrappers/wrappers/cbioportal/generate_cna/environment.yaml +++ b/snappy_wrappers/wrappers/cbioportal/generate_cna/environment.yaml @@ -1,4 +1,4 @@ -name: merge_tables +name: generate_cna channels: - conda-forge diff --git a/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R b/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R index 6438e6b83..87fe716ae 100644 --- a/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R +++ b/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R @@ -1,5 +1,3 @@ -require(magrittr) - #' Compute discrete copy number & log2 on genes #' #' @param fn names of the cns file diff --git a/snappy_wrappers/wrappers/cbioportal/helper_functions.R b/snappy_wrappers/wrappers/cbioportal/helper_functions.R index 2858fdfb9..4162dcfb8 100644 --- a/snappy_wrappers/wrappers/cbioportal/helper_functions.R +++ b/snappy_wrappers/wrappers/cbioportal/helper_functions.R @@ -1,5 +1,3 @@ -require(magrittr) - #' Extracts the feature names & one column of values from tab-delimited sample files #' and return a data.frame with the values for each sample in the columns, and #' the feature names as row name. @@ -34,7 +32,7 @@ read_sample_files <- function(fns, featureCol, valueCol, header=TRUE) { if (is.null(tbl)) { tbl <- tmp } else { - tbl <- tbl %>% dplyr::full_join(tmp, by=featureCol) + tbl <- tbl |> dplyr::full_join(tmp, by=featureCol) } } tbl <- tbl[!grepl("_PAR_Y$", tbl[[featureCol]]),,drop=FALSE] @@ -75,7 +73,7 @@ map_feature_id <- function(mat, mappings, from, to, method=c("sum", "max", "maxa if (!all(c(from, to) %in% colnames(mappings))) stop("Feature id type ", from, " or ", to, " not in mappings table") - mappings <- mappings[,c(from, to)] %>% dplyr::distinct() + mappings <- mappings[,c(from, to)] |> dplyr::distinct() mappings <- mappings[mappings[[from]] %in% rownames(mat),,drop=FALSE] n <- sum(rownames(mat) %in% mappings[[from]]) @@ -189,7 +187,7 @@ get_id_mappings <- function(org_obj, verbose=FALSE) { if (verbose) cat("Gene id mappings taken from file ", org_obj) id_mappings <- read.table(org_obj, sep="\t", header=1, stringsAsFactors=FALSE, check.names=FALSE, quote="", comment="") if (all(c("hgnc_symbol", "ensembl_canonical_gene", "entrez_gene_id") %in% colnames(id_mappings))) - id_mappings <- id_mappings %>% + id_mappings <- id_mappings |> dplyr::select(ENSEMBL=ensembl_canonical_gene, SYMBOL=hgnc_symbol, ENTREZ_ID=entrez_gene_id) stopifnot(all(c("ENSEMBL", "SYMBOL", "ENTREZ_ID") %in% colnames(id_mappings))) id_mappings <- id_mappings[,c("ENSEMBL", "SYMBOL", "ENTREZ_ID")] @@ -205,12 +203,12 @@ get_id_mappings <- function(org_obj, verbose=FALSE) { ) } } - id_mappings <- id_mappings %>% - dplyr::select(ENSEMBL, SYMBOL, ENTREZ_ID) %>% - dplyr::mutate(ENTREZ_ID=as.character(ENTREZ_ID)) %>% - dplyr::filter(!is.na(ENSEMBL) & ENSEMBL!="") %>% - dplyr::filter(!is.na(SYMBOL) & SYMBOL!="") %>% - dplyr::filter(!is.na(ENTREZ_ID) & ENTREZ_ID!="" & grepl("^[0-9]+$", ENTREZ_ID)) %>% + id_mappings <- id_mappings |> + dplyr::select(ENSEMBL, SYMBOL, ENTREZ_ID) |> + dplyr::mutate(ENTREZ_ID=as.character(ENTREZ_ID)) |> + dplyr::filter(!is.na(ENSEMBL) & ENSEMBL!="") |> + dplyr::filter(!is.na(SYMBOL) & SYMBOL!="") |> + dplyr::filter(!is.na(ENTREZ_ID) & ENTREZ_ID!="" & grepl("^[0-9]+$", ENTREZ_ID)) |> dplyr::distinct() id_mappings diff --git a/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R b/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R index 8d1a26ddf..0b0aada8a 100644 --- a/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R +++ b/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R @@ -1,5 +1,3 @@ -require(magrittr) - #' Read & merge sample files into cBioPortal gene-based data table. #' #' Used for expression tables, log2 CNA, pseudo-Gistic table. @@ -39,7 +37,7 @@ merge_tables <- function(fns, mappings, type=c("log2", "gistic", "segment", "exp } if (type == "gistic") { - stopifnot(all(c("pipeline_id", "amplification") %in% names(args))) + stopifnot(all(c("pipeline_id") %in% names(args))) # Copy numbers (in "cn" column) are transformed into (pseudo-) gistic codes: # 0: Deep deletion, 1: heterozygous deletion, 2: copy number neutral, 3: gain, 4: amplification # In https://doi.org/10.1038/s41586-022-04738-6, the amplification is defined as @@ -59,7 +57,7 @@ merge_tables <- function(fns, mappings, type=c("log2", "gistic", "segment", "exp } if (type == "log2") { - stopifnot(all(c("pipeline_id") %in% names(args))) + stopifnot(all(c("pipeline_id", "amplification") %in% names(args))) tmp <- read_sample_files(fns, args$pipeline_id, "log2") method <- "max" } @@ -107,6 +105,10 @@ merge_segments <- function(fns) { for (sample_id in names(fns)) { cat("Loading", fns[sample_id], "for sample", sample_id, "\n") tmp <- read.table(fns[sample_id], sep="\t", header=1, stringsAsFactors=FALSE, check.names=FALSE) + if (!all(col_names %in% colnames(tmp))) { + i <- match(names(col_names), colnames(tmp)) + if (any(!is.na(i))) colnames(tmp)[i[!is.na(i)]] <- col_names[!is.na(i)] + } stopifnot(all(names(col_names) %in% colnames(tmp))) tmp <- tmp[,names(col_names)] colnames(tmp) <- col_names @@ -147,7 +149,7 @@ compute_rpkm <- function(counts, tx_obj=TxDb.Hsapiens.UCSC.hg19.knownGene::TxDb. if (verbose) cat("Create DESeq2 object ... ") genes <- GenomicFeatures::exonsBy(tx_obj, "gene") genes <- genes[names(genes) %in% rownames(counts)] - counts <- counts[names(genes),] + counts <- counts[names(genes),,drop=FALSE] donors <- data.frame(Donor=colnames(counts), stringsAsFactors=FALSE) dds <- DESeq2::DESeqDataSetFromMatrix(counts, colData=donors, design=as.formula("~ 1"), rowRanges=genes) if (verbose) cat("Done\n") diff --git a/snappy_wrappers/wrappers/mutect2/filter/wrapper.py b/snappy_wrappers/wrappers/mutect2/filter/wrapper.py index 2b7b8e186..cd1beb527 100644 --- a/snappy_wrappers/wrappers/mutect2/filter/wrapper.py +++ b/snappy_wrappers/wrappers/mutect2/filter/wrapper.py @@ -84,13 +84,13 @@ --ob-priors $tmpdir/read-orientation-model.tar.gz \ --stats {snakemake.input.stats} \ --variant $tmpdir/in.vcf \ - --output {snakemake.output.full} + --output {snakemake.output.full_vcf} # Index & move to final dest -tabix -f {snakemake.output.full} +tabix -f {snakemake.output.full_vcf} # Keep only PASS variants in main output -bcftools view -i 'FILTER="PASS"' -O z -o {snakemake.output.vcf} {snakemake.output.full} +bcftools view -i 'FILTER="PASS"' -O z -o {snakemake.output.vcf} {snakemake.output.full_vcf} tabix -f {snakemake.output.vcf} pushd $(dirname {snakemake.output.vcf}) @@ -98,7 +98,7 @@ md5sum $fn > $fn.md5 fn=$(basename {snakemake.output.vcf_tbi}) md5sum $fn > $fn.md5 -fn=$(basename {snakemake.output.full}) +fn=$(basename {snakemake.output.full_vcf}) md5sum $fn > $fn.md5 fn=$(basename {snakemake.output.full_vcf_tbi}) md5sum $fn > $fn.md5 diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/environment.yaml b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/environment.yaml index 8a155a981..794d134f1 100644 --- a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/environment.yaml +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/environment.yaml @@ -1,7 +1,8 @@ channels: -- bioconda -- conda-forge + - conda-forge + - bioconda + dependencies: -- python >=3.8 -- vcfpy -- ruamel.yaml + - python >=3.8 + - vcfpy + - ruamel.yaml diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/functions.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/functions.py index 216e27cfb..c3e17567a 100644 --- a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/functions.py +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/functions.py @@ -8,7 +8,7 @@ from common_functions import calc_end_pos, minimize_mutation, strip_sequence_version, variant_type import exceptions from protein_mutation_parser import parse_protein_mutation -from variant_classification import variant_classification +from variant_classification import variant_classification_jannovar, variant_classification_vep # from action import Action @@ -27,7 +27,8 @@ def __init__(self, config: typing.Dict[str, typing.Any]): self.compiled["strip_sequence_version"] = strip_sequence_version self.compiled["variant_type"] = variant_type self.compiled["parse_protein_mutation"] = parse_protein_mutation - self.compiled["variant_classification"] = variant_classification + self.compiled["variant_classification_vep"] = variant_classification_vep + self.compiled["variant_classification_jannovar"] = variant_classification_jannovar for col_name, col_def in config["output"].items(): if "function" in col_def and not col_def["function"] in self.compiled: diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/hgnc_symbol_to_entrez_id.tsv b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/hgnc_symbol_to_entrez_id.tsv new file mode 100644 index 000000000..d49e7b460 --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/hgnc_symbol_to_entrez_id.tsv @@ -0,0 +1,43709 @@ +A1BG 1 +A1BG-AS1 503538 +A1CF 29974 +A2M 2 +A2M-AS1 144571 +A2ML1 144568 +A2ML1-AS1 100874108 +A2ML1-AS2 106478979 +A2MP1 3 +A3GALT2 127550 +A4GALT 53947 +A4GNT 51146 +AAAS 8086 +AACS 65985 +AACSP1 729522 +AADAC 13 +AADACL2 344752 +AADACL2-AS1 101928142 +AADACL3 126767 +AADACL4 343066 +AADACP1 201651 +AADAT 51166 +AAGAB 79719 +AAK1 22848 +AAMDC 28971 +AAMP 14 +AANAT 15 +AAR2 25980 +AARD 441376 +AARS1 16 +AARS1P1 106480683 +AARS2 57505 +AARSD1 80755 +AARSD1P1 117981788 +AASDH 132949 +AASDHPPT 60496 +AASS 10157 +AATBC 284837 +AATF 26574 +AATK 9625 +AAVS1 17 +ABALON 103021294 +ABAT 18 +ABCA1 19 +ABCA2 20 +ABCA3 21 +ABCA3P1 342293 +ABCA4 24 +ABCA5 23461 +ABCA6 23460 +ABCA7 10347 +ABCA8 10351 +ABCA9 10350 +ABCA9-AS1 104355297 +ABCA10 10349 +ABCA11P 79963 +ABCA12 26154 +ABCA13 154664 +ABCA15P 400508 +ABCA17P 650655 +ABCB1 5243 +ABCB4 5244 +ABCB5 340273 +ABCB6 10058 +ABCB7 22 +ABCB8 11194 +ABCB9 23457 +ABCB10 23456 +ABCB10P1 56476 +ABCB10P3 728248 +ABCB10P4 100132289 +ABCB11 8647 +ABCC1 4363 +ABCC2 1244 +ABCC3 8714 +ABCC4 10257 +ABCC5 10057 +ABCC5-AS1 100873982 +ABCC6 368 +ABCC6P1 653190 +ABCC6P2 730013 +ABCC8 6833 +ABCC9 10060 +ABCC10 89845 +ABCC11 85320 +ABCC12 94160 +ABCC13 150000 +ABCD1 215 +ABCD1P1 23785 +ABCD1P2 26983 +ABCD1P3 26982 +ABCD1P4 26957 +ABCD1P5 642762 +ABCD2 225 +ABCD3 5825 +ABCD4 5826 +ABCE1 6059 +ABCF1 23 +ABCF1-DT 107986587 +ABCF2 10061 +ABCF2-H2BK1 114483834 +ABCF2P1 344653 +ABCF2P2 100422059 +ABCF3 55324 +ABCG1 9619 +ABCG2 9429 +ABCG4 64137 +ABCG5 64240 +ABCG8 64241 +ABHD1 84696 +ABHD2 11057 +ABHD3 171586 +ABHD4 63874 +ABHD5 51099 +ABHD6 57406 +ABHD8 79575 +ABHD10 55347 +ABHD11 83451 +ABHD12 26090 +ABHD12B 145447 +ABHD13 84945 +ABHD14A 25864 +ABHD14A-ACY1 100526760 +ABHD14B 84836 +ABHD15 116236 +ABHD15-AS1 104355133 +ABHD16A 7920 +ABHD16B 140701 +ABHD17A 81926 +ABHD17AP1 728917 +ABHD17AP3 648359 +ABHD17AP4 729495 +ABHD17AP5 91219 +ABHD17AP6 644988 +ABHD17AP7 100133212 +ABHD17AP8 647144 +ABHD17AP9 100132251 +ABHD17B 51104 +ABHD17C 58489 +ABHD18 80167 +ABI1 10006 +ABI1P1 326268 +ABI2 10152 +ABI3 51225 +ABI3BP 25890 +ABITRAM 54942 +ABITRAMP1 390403 +ABL1 25 +ABL2 27 +ABLIM1 3983 +ABLIM2 84448 +ABLIM3 22885 +ABO 28 +ABR 29 +ABR-AS1 105371479 +ABRA 137735 +ABRACL 58527 +ABRAXAS1 84142 +ABRAXAS1P1 100421580 +ABRAXAS1P2 100133073 +ABRAXAS2 23172 +ABT1 29777 +ABT1P1 100420695 +ABTB1 80325 +ABTB2 25841 +ABTB3 121551 +ACAA1 30 +ACAA2 10449 +ACAA2P1 100420869 +ACACA 31 +ACACB 32 +ACAD8 27034 +ACAD9 28976 +ACAD9-DT 123706524 +ACAD10 80724 +ACAD11 84129 +ACADL 33 +ACADM 34 +ACADS 35 +ACADSB 36 +ACADVL 37 +ACAN 176 +ACAP1 9744 +ACAP2 23527 +ACAP2-IT1 100874306 +ACAP3 116983 +ACAT1 38 +ACAT2 39 +ACBD3 64746 +ACBD3-AS1 107985353 +ACBD4 79777 +ACBD5 91452 +ACBD6 84320 +ACBD7 414149 +ACCS 84680 +ACCSL 390110 +ACD 65057 +ACE 1636 +ACE2 59272 +ACE2-DT 104798195 +ACE3P 100129123 +ACER1 125981 +ACER2 340485 +ACER2P1 645978 +ACER3 55331 +ACHE 43 +ACIN1 22985 +ACKR1 2532 +ACKR2 1238 +ACKR3 57007 +ACKR4 51554 +ACKR4P1 285737 +ACLY 47 +ACMSD 130013 +ACNATP 347275 +ACO1 48 +ACO2 50 +ACOD1 730249 +ACOT1 641371 +ACOT2 10965 +ACOT4 122970 +ACOT6 641372 +ACOT7 11332 +ACOT8 10005 +ACOT9 23597 +ACOT11 26027 +ACOT12 134526 +ACOT13 55856 +ACOX1 51 +ACOX2 8309 +ACOX3 8310 +ACOXL 55289 +ACOXL-AS1 400997 +ACP1 52 +ACP2 53 +ACP3 55 +ACP4 93650 +ACP5 54 +ACP6 51205 +ACP7 390928 +ACR 49 +ACRBP 84519 +ACRP1 645529 +ACRV1 56 +ACSBG1 23205 +ACSBG2 81616 +ACSF2 80221 +ACSF3 197322 +ACSL1 2180 +ACSL3 2181 +ACSL3-AS1 105373904 +ACSL3P1 100421637 +ACSL4 2182 +ACSL5 51703 +ACSL6 23305 +ACSL6-AS1 101927693 +ACSM1 116285 +ACSM2A 123876 +ACSM2B 348158 +ACSM3 6296 +ACSM4 341392 +ACSM5 54988 +ACSM5P1 100421779 +ACSM6 142827 +ACSS1 84532 +ACSS2 55902 +ACSS3 79611 +ACTA1 58 +ACTA2 59 +ACTA2-AS1 100132116 +ACTB 60 +ACTBL2 345651 +ACTBP1 643309 +ACTBP2 62 +ACTBP3 63 +ACTBP4 64 +ACTBP6 66 +ACTBP7 67 +ACTBP8 68 +ACTBP9 69 +ACTBP10 446207 +ACTBP11 644220 +ACTBP12 100462767 +ACTBP14 389976 +ACTBP15 391334 +ACTBP16 100132223 +ACTC1 70 +ACTE1P 399923 +ACTG1 71 +ACTG1P1 73 +ACTG1P2 74 +ACTG1P3 75 +ACTG1P4 648740 +ACTG1P6 78 +ACTG1P7 79 +ACTG1P8 80 +ACTG1P9 82 +ACTG1P10 83 +ACTG1P11 414754 +ACTG1P12 100418921 +ACTG1P13 100418920 +ACTG1P14 100418910 +ACTG1P15 100418951 +ACTG1P16 100418960 +ACTG1P17 283693 +ACTG1P18 100418924 +ACTG1P19 644160 +ACTG1P20 644961 +ACTG1P21 100131291 +ACTG1P22 100131953 +ACTG1P23 442097 +ACTG1P24 441783 +ACTG1P25 148709 +ACTG2 72 +ACTL6A 86 +ACTL6B 51412 +ACTL7A 10881 +ACTL7B 10880 +ACTL8 81569 +ACTL9 284382 +ACTL10 170487 +ACTL11P 389120 +ACTMAP 284325 +ACTN1 87 +ACTN1-DT 161159 +ACTN2 88 +ACTN3 89 +ACTN4 81 +ACTN4P1 344978 +ACTN4P2 391026 +ACTP1 106480335 +ACTR1A 10121 +ACTR1AP1 100287074 +ACTR1B 10120 +ACTR2 10097 +ACTR3 10096 +ACTR3-AS1 101060091 +ACTR3B 57180 +ACTR3BP1 643050 +ACTR3BP2 440888 +ACTR3BP3 647156 +ACTR3BP4 777774 +ACTR3BP5 399746 +ACTR3BP6 644773 +ACTR3BP7 100289004 +ACTR3C 653857 +ACTR3P1 100288580 +ACTR3P2 100129013 +ACTR3P3 100128020 +ACTR5 79913 +ACTR6 64431 +ACTR6P1 100421495 +ACTR8 93973 +ACTR10 55860 +ACTRT1 139741 +ACTRT1P1 100128268 +ACTRT2 140625 +ACTRT3 84517 +ACVR1 90 +ACVR1B 91 +ACVR1C 130399 +ACVR2A 92 +ACVR2B 93 +ACVR2B-AS1 100128640 +ACVRL1 94 +ACY1 95 +ACY3 91703 +ACYP1 97 +ACYP2 98 +ADA 100 +ADA2 51816 +ADAD1 132612 +ADAD1P1 100422386 +ADAD1P2 100422407 +ADAD2 161931 +ADAL 161823 +ADAM1A 8759 +ADAM1B 100420505 +ADAM2 2515 +ADAM3A 1587 +ADAM3B 1596 +ADAM5 255926 +ADAM6 8755 +ADAM7 8756 +ADAM7-AS1 101929294 +ADAM7-AS2 101929315 +ADAM8 101 +ADAM9 8754 +ADAM10 102 +ADAM11 4185 +ADAM12 8038 +ADAM15 8751 +ADAM17 6868 +ADAM18 8749 +ADAM19 8728 +ADAM20 8748 +ADAM20P1 317760 +ADAM20P2 100533671 +ADAM20P3 644325 +ADAM21 8747 +ADAM21P1 145241 +ADAM22 53616 +ADAM23 8745 +ADAM24P 646479 +ADAM28 10863 +ADAM29 11086 +ADAM30 11085 +ADAM32 203102 +ADAM33 80332 +ADAMDEC1 27299 +ADAMTS1 9510 +ADAMTS2 9509 +ADAMTS3 9508 +ADAMTS4 9507 +ADAMTS5 11096 +ADAMTS6 11174 +ADAMTS7 11173 +ADAMTS7P1 390660 +ADAMTS7P3 400406 +ADAMTS7P4 642935 +ADAMTS8 11095 +ADAMTS9 56999 +ADAMTS9-AS1 101929335 +ADAMTS9-AS2 100507098 +ADAMTS10 81794 +ADAMTS12 81792 +ADAMTS13 11093 +ADAMTS14 140766 +ADAMTS15 170689 +ADAMTS16 170690 +ADAMTS16-DT 101929176 +ADAMTS17 170691 +ADAMTS18 170692 +ADAMTS19 171019 +ADAMTS19-AS1 103689846 +ADAMTS20 80070 +ADAMTSL1 92949 +ADAMTSL2 9719 +ADAMTSL3 57188 +ADAMTSL4 54507 +ADAMTSL4-AS1 574406 +ADAMTSL4-AS2 100289061 +ADAMTSL5 339366 +ADAP1 11033 +ADAP2 55803 +ADAR 103 +ADARB1 104 +ADARB2 105 +ADARB2-AS1 642394 +ADAT1 23536 +ADAT2 134637 +ADAT3 113179 +ADCK1 57143 +ADCK2 90956 +ADCK5 203054 +ADCP1 106 +ADCY1 107 +ADCY2 108 +ADCY3 109 +ADCY4 196883 +ADCY5 111 +ADCY6 112 +ADCY6-DT 100506125 +ADCY7 113 +ADCY8 114 +ADCY9 115 +ADCY10 55811 +ADCY10P1 221442 +ADCYAP1 116 +ADCYAP1R1 117 +ADD1 118 +ADD2 119 +ADD3 120 +ADD3-AS1 100505933 +ADGB 79747 +ADGB-DT 101928661 +ADGRA1 84435 +ADGRA1-AS1 100128127 +ADGRA2 25960 +ADGRA3 166647 +ADGRA3P1 100996333 +ADGRB1 575 +ADGRB2 576 +ADGRB3 577 +ADGRB3-DT 101928307 +ADGRD1 283383 +ADGRD1-AS1 105755954 +ADGRD2 347088 +ADGRE1 2015 +ADGRE2 30817 +ADGRE3 84658 +ADGRE4P 326342 +ADGRE5 976 +ADGRF1 266977 +ADGRF2P 222611 +ADGRF3 165082 +ADGRF4 221393 +ADGRF5 221395 +ADGRF5-AS1 101926962 +ADGRF5P1 389740 +ADGRF5P2 441416 +ADGRG1 9289 +ADGRG2 10149 +ADGRG3 222487 +ADGRG4 139378 +ADGRG5 221188 +ADGRG6 57211 +ADGRG7 84873 +ADGRL1 22859 +ADGRL1-AS1 100507373 +ADGRL2 23266 +ADGRL3 23284 +ADGRL3-AS1 101927186 +ADGRL4 64123 +ADGRV1 84059 +ADH1A 124 +ADH1B 125 +ADH1C 126 +ADH4 127 +ADH5 128 +ADH5P2 343296 +ADH5P3 100131810 +ADH5P4 642443 +ADH5P5 115945146 +ADH6 130 +ADH7 131 +ADHFE1 137872 +ADI1 55256 +ADI1P1 100130936 +ADI1P2 100288971 +ADI1P3 100288129 +ADIG 149685 +ADIPINT 125906382 +ADIPOQ 9370 +ADIPOQ-AS1 100874095 +ADIPOR1 51094 +ADIPOR1P1 645220 +ADIPOR1P2 390503 +ADIPOR2 79602 +ADIRF 10974 +ADIRF-AS1 100133190 +ADISSP 54976 +ADK 132 +ADM 133 +ADM-DT 105376544 +ADM2 79924 +ADM5 199800 +ADNP 23394 +ADNP-AS1 101927631 +ADNP2 22850 +ADO 84890 +ADORA1 134 +ADORA2A 135 +ADORA2A-AS1 646023 +ADORA2B 136 +ADORA2BP1 137 +ADORA3 140 +ADPGK 83440 +ADPGK-AS1 100287559 +ADPRH 141 +ADPRHL1 113622 +ADPRM 56985 +ADPRS 54936 +ADRA1A 148 +ADRA1B 147 +ADRA1D 146 +ADRA2A 150 +ADRA2B 151 +ADRA2C 152 +ADRB1 153 +ADRB2 154 +ADRB3 155 +ADRM1 11047 +ADSL 158 +ADSS1 122622 +ADSS2 159 +ADTRP 84830 +AEBP1 165 +AEBP2 121536 +AEN 64782 +AFAP1 60312 +AFAP1-AS1 84740 +AFAP1L1 134265 +AFAP1L2 84632 +AFDN 4301 +AFDN-DT 653483 +AFF1 4299 +AFF1-AS1 100506746 +AFF2 2334 +AFF2-IT1 100874269 +AFF3 3899 +AFF4 27125 +AFF4-DT 124901065 +AFF4P1 127460875 +AFG1L 246269 +AFG2A 166378 +AFG2B 79029 +AFG3L1P 172 +AFG3L2 10939 +AFG3L2P1 347028 +AFM 173 +AFMID 125061 +AFP 174 +AFTPH 54812 +AFTPH-DT 101927402 +AGA 175 +AGA-DT 285500 +AGAP1 116987 +AGAP1-IT1 100506749 +AGAP2 116986 +AGAP2-AS1 100130776 +AGAP3 116988 +AGAP4 119016 +AGAP5 729092 +AGAP6 414189 +AGAP7P 653268 +AGAP9 642517 +AGAP10P 653234 +AGAP11 119385 +AGAP12P 414224 +AGAP13P 728005 +AGAP14P 653259 +AGBL1 123624 +AGBL1-AS1 727915 +AGBL2 79841 +AGBL3 340351 +AGBL4 84871 +AGBL4-AS1 101929721 +AGBL4-IT1 100874313 +AGBL5 60509 +AGBL5-AS1 100874031 +AGBL5-IT1 106481744 +AGER 177 +AGFG1 3267 +AGFG2 3268 +AGGF1 55109 +AGGF1P1 100132380 +AGGF1P2 644435 +AGGF1P3 391552 +AGGF1P4 100129351 +AGGF1P5 100128103 +AGGF1P6 106481737 +AGGF1P7 100132606 +AGGF1P8 100128804 +AGGF1P9 100127958 +AGGF1P10 100288774 +AGK 55750 +AGK-DT 105375538 +AGKP1 359793 +AGKP2 392543 +AGL 178 +AGMAT 79814 +AGMO 392636 +AGO1 26523 +AGO2 27161 +AGO3 192669 +AGO4 192670 +AGPAT1 10554 +AGPAT2 10555 +AGPAT3 56894 +AGPAT4 56895 +AGPAT4-IT1 79992 +AGPAT5 55326 +AGPAT5P1 646231 +AGPS 8540 +AGR2 10551 +AGR3 155465 +AGRN 375790 +AGRP 181 +AGT 183 +AGTPBP1 23287 +AGTR1 185 +AGTR2 186 +AGTRAP 57085 +AGXT 189 +AGXT2 64902 +AHCTF1 25909 +AHCTF1P1 285116 +AHCY 191 +AHCYL1 10768 +AHCYL2 23382 +AHCYP1 340844 +AHCYP2 392387 +AHCYP3 402093 +AHCYP4 129560 +AHCYP5 391470 +AHCYP6 100419714 +AHCYP7 645486 +AHCYP8 107063538 +AHDC1 27245 +AHI1 54806 +AHI1-DT 100131814 +AHNAK 79026 +AHNAK2 113146 +AHR 196 +AHRR 57491 +AHSA1 10598 +AHSA2P 130872 +AHSG 197 +AHSP 51327 +AICDA 57379 +AIDA 64853 +AIDAP1 646050 +AIDAP2 646890 +AIDAP3 100128360 +AIF1 199 +AIF1L 83543 +AIFM1 9131 +AIFM1P1 645120 +AIFM2 84883 +AIFM3 150209 +AIG1 51390 +AIG1P1 106479028 +AIM2 9447 +AIMP1 9255 +AIMP1P1 170547 +AIMP1P2 100873064 +AIMP2 7965 +AIP 9049 +AIPL1 23746 +AIRE 326 +AIRIM 54955 +AIRN 100271873 +AJAP1 55966 +AJM1 389813 +AJUBA 84962 +AJUBA-DT 107984660 +AK1 203 +AK2 204 +AK2P1 266920 +AK2P2 339736 +AK3 50808 +AK3P2 100419074 +AK3P3 100419075 +AK3P4 100129959 +AK3P5 100288319 +AK3P6 100873789 +AK3P7 127379742 +AK4 205 +AK4P1 206 +AK4P2 100132104 +AK4P3 645619 +AK4P4 100128705 +AK4P5 100526416 +AK4P6 649288 +AK5 26289 +AK6 102157402 +AK6P1 100132086 +AK6P2 100128817 +AK7 122481 +AK8 158067 +AK9 221264 +AKAIN1 642597 +AKAP1 8165 +AKAP1-DT 119139901 +AKAP2 +AKAP3 10566 +AKAP4 8852 +AKAP5 9495 +AKAP6 9472 +AKAP7 9465 +AKAP8 10270 +AKAP8L 26993 +AKAP8P1 646114 +AKAP9 10142 +AKAP10 11216 +AKAP11 11215 +AKAP12 9590 +AKAP13 11214 +AKAP13-AS1 123466214 +AKAP14 158798 +AKAP17A 8227 +AKAP17BP 139516 +AKIP1 56672 +AKIRIN1 79647 +AKIRIN1P1 100418731 +AKIRIN1P2 106480306 +AKIRIN2 55122 +AKIRIN2P1 100216487 +AKNA 80709 +AKNAD1 254268 +AKR1A1 10327 +AKR1B1 231 +AKR1B1P1 401982 +AKR1B1P2 236 +AKR1B1P3 729347 +AKR1B1P4 390402 +AKR1B1P5 390482 +AKR1B1P6 100129769 +AKR1B1P7 126242 +AKR1B1P8 392525 +AKR1B10 57016 +AKR1B10P1 340888 +AKR1B10P2 643582 +AKR1B15 441282 +AKR1C1 1645 +AKR1C2 1646 +AKR1C3 8644 +AKR1C4 1109 +AKR1C5P 100996684 +AKR1C6P 389932 +AKR1C7P 648947 +AKR1C8 340811 +AKR1D1 6718 +AKR1D1P1 80701 +AKR1E2 83592 +AKR7A2 8574 +AKR7A2P1 246182 +AKR7A2P2 159007 +AKR7A3 22977 +AKR7L 246181 +AKT1 207 +AKT1S1 84335 +AKT2 208 +AKT3 10000 +AKT3-IT1 100874263 +AKTIP 64400 +AKTIPP1 101059924 +AKTIPP2 100130746 +AKTIPP3 100131233 +ALAD 210 +ALAS1 211 +ALAS2 212 +ALB 213 +ALCAM 214 +ALDH1A1 216 +ALDH1A2 8854 +ALDH1A2-AS1 283665 +ALDH1A3 220 +ALDH1A3-AS1 101927751 +ALDH1B1 219 +ALDH1L1 10840 +ALDH1L1-AS1 100874204 +ALDH1L1-AS2 100862662 +ALDH1L2 160428 +ALDH2 217 +ALDH3A1 218 +ALDH3A2 224 +ALDH3B1 221 +ALDH3B2 222 +ALDH4A1 8659 +ALDH5A1 7915 +ALDH6A1 4329 +ALDH7A1 501 +ALDH7A1P1 541 +ALDH7A1P2 542 +ALDH7A1P3 543 +ALDH7A1P4 544 +ALDH8A1 64577 +ALDH9A1 223 +ALDH16A1 126133 +ALDH18A1 5832 +ALDOA 226 +ALDOAP1 391538 +ALDOAP2 228 +ALDOB 229 +ALDOC 230 +ALG1 56052 +ALG1L1P 200810 +ALG1L2 644974 +ALG1L3P 100132066 +ALG1L5P 647415 +ALG1L6P 339879 +ALG1L7P 728263 +ALG1L8P 645015 +ALG1L9P 285407 +ALG1L10P 106479037 +ALG1L11P 106480789 +ALG1L12P 100421097 +ALG1L13P 106479038 +ALG1L14P 100996649 +ALG1L15P 730086 +ALG2 85365 +ALG3 10195 +ALG3P1 442131 +ALG5 29880 +ALG6 29929 +ALG8 79053 +ALG9 79796 +ALG9-IT1 100874303 +ALG10 84920 +ALG10B 144245 +ALG11 440138 +ALG12 79087 +ALG13 79868 +ALG13-AS1 106478971 +ALG14 199857 +ALG14-AS1 101928098 +ALK 238 +ALKAL1 389658 +ALKAL2 285016 +ALKBH1 8846 +ALKBH2 121642 +ALKBH3 221120 +ALKBH3-AS1 100507300 +ALKBH4 54784 +ALKBH5 54890 +ALKBH6 84964 +ALKBH7 84266 +ALKBH8 91801 +ALLC 55821 +ALMS1 7840 +ALMS1-IT1 100874291 +ALMS1P1 200420 +ALOX5 240 +ALOX5AP 241 +ALOX12 239 +ALOX12-AS1 100506713 +ALOX12B 242 +ALOX12P1 243 +ALOX12P2 245 +ALOX15 246 +ALOX15B 247 +ALOX15P1 100652883 +ALOX15P2 642959 +ALOXE3 59344 +ALOXE3P1 100420216 +ALPG 251 +ALPI 248 +ALPK1 80216 +ALPK2 115701 +ALPK3 57538 +ALPL 249 +ALPP 250 +ALPPP 260330 +ALS2 57679 +ALS2CL 259173 +ALX1 8092 +ALX3 257 +ALX4 60529 +ALYREF 10189 +AMACR 23600 +AMBN 258 +AMBP 259 +AMBRA1 55626 +AMD1 262 +AMD1P1 100133024 +AMD1P2 263 +AMD1P3 728931 +AMD1P4 100129761 +AMDHD1 144193 +AMDHD2 51005 +AMELX 265 +AMELY 266 +AMER1 139285 +AMER2 219287 +AMER3 205147 +AMFR 267 +AMH 268 +AMHR2 269 +AMIGO1 57463 +AMIGO2 347902 +AMIGO3 386724 +AMLCR2 9163 +AMMECR1 9949 +AMMECR1-IT1 100874352 +AMMECR1L 83607 +AMMECR1LP1 100420921 +AMN 81693 +AMN1 196394 +AMOT 154796 +AMOTL1 154810 +AMOTL2 51421 +AMPD1 270 +AMPD2 271 +AMPD3 272 +AMPH 273 +AMT 275 +AMTN 401138 +AMY1A 276 +AMY1B 277 +AMY1C 278 +AMY2A 279 +AMY2B 280 +AMYP1 281 +AMZ1 155185 +AMZ2 51321 +AMZ2P1 201283 +AMZ2P2 100421018 +AMZ2P3 100128929 +ANAPC1 64682 +ANAPC1P1 100286979 +ANAPC1P2 285074 +ANAPC1P3 100420889 +ANAPC1P4 730268 +ANAPC1P5 100420890 +ANAPC1P6 402096 +ANAPC2 29882 +ANAPC4 29945 +ANAPC5 51433 +ANAPC7 51434 +ANAPC10 10393 +ANAPC10P1 729198 +ANAPC11 51529 +ANAPC13 25847 +ANAPC15 25906 +ANAPC15P1 100128808 +ANAPC15P2 117751731 +ANAPC16 119504 +ANCR 282 +ANG 283 +ANGEL1 23357 +ANGEL2 90806 +ANGPT1 284 +ANGPT2 285 +ANGPT4 51378 +ANGPTL1 9068 +ANGPTL2 23452 +ANGPTL3 27329 +ANGPTL4 51129 +ANGPTL5 253935 +ANGPTL6 83854 +ANGPTL7 10218 +ANGPTL8 55908 +ANHX 647589 +ANK1 286 +ANK2 287 +ANK2-AS1 105377373 +ANK3 288 +ANK3-DT 105378320 +ANKAR 150709 +ANKDD1A 348094 +ANKDD1B 728780 +ANKEF1 63926 +ANKFN1 162282 +ANKFY1 51479 +ANKH 56172 +ANKH-DT 118597842 +ANKHD1 54882 +ANKHD1-DT 121232368 +ANKHD1-EIF4EBP3 404734 +ANKIB1 54467 +ANKK1 255239 +ANKLE1 126549 +ANKLE2 23141 +ANKMY1 51281 +ANKMY2 57037 +ANKRA2 57763 +ANKRD1 27063 +ANKRD2 26287 +ANKRD6 22881 +ANKRD7 56311 +ANKRD9 122416 +ANKRD10 55608 +ANKRD10-IT1 100505494 +ANKRD11 29123 +ANKRD11P1 100287912 +ANKRD11P2 100419906 +ANKRD12 23253 +ANKRD13A 88455 +ANKRD13B 124930 +ANKRD13C 81573 +ANKRD13C-DT 11147 +ANKRD13D 338692 +ANKRD16 54522 +ANKRD17 26057 +ANKRD17-DT 102724832 +ANKRD18A 253650 +ANKRD18B 441459 +ANKRD18CP 101926917 +ANKRD18DP 348840 +ANKRD18EP 100131031 +ANKRD18FP 127379688 +ANKRD19P 138649 +ANKRD20A1 84210 +ANKRD20A2P 441430 +ANKRD20A3P 441425 +ANKRD20A4P 728747 +ANKRD20A5P 440482 +ANKRD20A6P 728157 +ANKRD20A7P 653436 +ANKRD20A8P 729171 +ANKRD20A9P 284232 +ANKRD20A10P 100421422 +ANKRD20A11P 391267 +ANKRD20A12P 100874392 +ANKRD20A13P 100132733 +ANKRD20A14P 100533719 +ANKRD20A15P 100533720 +ANKRD20A16P 100421427 +ANKRD20A17P 100421363 +ANKRD20A18P 391269 +ANKRD20A19P 400110 +ANKRD20A20P 728788 +ANKRD20A21P 102723552 +ANKRD22 118932 +ANKRD23 200539 +ANKRD24 170961 +ANKRD26 22852 +ANKRD26P1 124149 +ANKRD26P2 646929 +ANKRD26P3 100101938 +ANKRD26P4 100873882 +ANKRD27 84079 +ANKRD28 23243 +ANKRD29 147463 +ANKRD30A 91074 +ANKRD30B 374860 +ANKRD30BL 554226 +ANKRD30BP1 642460 +ANKRD30BP2 149992 +ANKRD30BP3 338579 +ANKRD31 256006 +ANKRD33 341405 +ANKRD33B 651746 +ANKRD33B-AS1 100874247 +ANKRD33BP1 100419920 +ANKRD33BP2 100129384 +ANKRD33BP3 100507606 +ANKRD33BP4 100652976 +ANKRD33BP5 100287028 +ANKRD33BP6 100507561 +ANKRD33BP7 100420024 +ANKRD33BP8 100420021 +ANKRD33BP9 100420025 +ANKRD33BP10 100420022 +ANKRD34A 284615 +ANKRD34B 340120 +ANKRD34C 390616 +ANKRD34C-AS1 729911 +ANKRD35 148741 +ANKRD36 375248 +ANKRD36B 57730 +ANKRD36BP1 84832 +ANKRD36BP2 645784 +ANKRD36C 400986 +ANKRD36P1 100132420 +ANKRD37 353322 +ANKRD39 51239 +ANKRD39P1 100124373 +ANKRD40 91369 +ANKRD40CL 55018 +ANKRD42 338699 +ANKRD42-DT 100506282 +ANKRD44 91526 +ANKRD44-AS1 101927596 +ANKRD44-DT 105373824 +ANKRD44-IT1 101927547 +ANKRD45 339416 +ANKRD46 157567 +ANKRD49 54851 +ANKRD49P1 100419814 +ANKRD49P2 116435289 +ANKRD49P3 391834 +ANKRD49P4 100130680 +ANKRD50 57182 +ANKRD52 283373 +ANKRD53 79998 +ANKRD54 129138 +ANKRD54P1 100419962 +ANKRD55 79722 +ANKRD60 140731 +ANKRD61 100310846 +ANKRD62 342850 +ANKRD62P1 107080639 +ANKRD62P1-PARP4P3 23783 +ANKRD63 100131244 +ANKRD65 441869 +ANKRD65-AS1 105378585 +ANKRD66 100287718 +ANKS1A 23294 +ANKS1B 56899 +ANKS3 124401 +ANKS4B 257629 +ANKS6 203286 +ANKUB1 389161 +ANKZF1 55139 +ANLN 54443 +ANO1 55107 +ANO1-AS1 100873981 +ANO2 57101 +ANO3 63982 +ANO3-AS1 105376599 +ANO4 121601 +ANO5 203859 +ANO6 196527 +ANO7 50636 +ANO7L1 101927546 +ANO8 57719 +ANO9 338440 +ANO10 55129 +ANOS1 3730 +ANOS2P 3734 +ANP32A 8125 +ANP32A-IT1 80035 +ANP32AP1 723972 +ANP32B 10541 +ANP32BP1 646791 +ANP32BP2 100130708 +ANP32BP3 100652899 +ANP32CP 23520 +ANP32D 23519 +ANP32E 81611 +ANPEP 290 +ANTKMT 65990 +ANTXR1 84168 +ANTXR2 118429 +ANTXRL 195977 +ANTXRLP1 100996567 +ANXA1 301 +ANXA2 302 +ANXA2P1 303 +ANXA2P2 304 +ANXA2P3 305 +ANXA2R 389289 +ANXA2R-AS1 153684 +ANXA2R-OT1 648987 +ANXA3 306 +ANXA4 307 +ANXA5 308 +ANXA6 309 +ANXA7 310 +ANXA8 653145 +ANXA8L1 728113 +ANXA9 8416 +ANXA10 11199 +ANXA11 311 +ANXA13 312 +AOAH 313 +AOAH-IT1 100874264 +AOC1 26 +AOC2 314 +AOC3 8639 +AOC4P 90586 +AOPEP 84909 +AOX1 316 +AOX2P 344454 +AOX3P 107126360 +AOX3P-AOX2P 107161151 +AP1AR 55435 +AP1AR-DT 119863862 +AP1B1 162 +AP1B1P1 23782 +AP1B1P2 23781 +AP1G1 164 +AP1G2 8906 +AP1G2-AS1 102724814 +AP1M1 8907 +AP1M2 10053 +AP1M2P1 645388 +AP1S1 1174 +AP1S2 8905 +AP1S2P1 106480305 +AP1S3 130340 +AP2A1 160 +AP2A2 161 +AP2B1 163 +AP2B1P1 401602 +AP2M1 1173 +AP2S1 1175 +AP3B1 8546 +AP3B2 8120 +AP3D1 8943 +AP3M1 26985 +AP3M2 10947 +AP3S1 1176 +AP3S2 10239 +AP4B1 10717 +AP4B1-AS1 100287722 +AP4E1 23431 +AP4M1 9179 +AP4S1 11154 +AP5B1 91056 +AP5M1 55745 +AP5S1 55317 +AP5Z1 9907 +APAF1 317 +APBA1 320 +APBA2 321 +APBA3 9546 +APBB1 322 +APBB1IP 54518 +APBB2 323 +APBB3 10307 +APC 324 +APC2 10297 +APCDD1 147495 +APCDD1L 164284 +APCDD1L-DT 149773 +APCS 325 +APEH 327 +APELA 100506013 +APEX1 328 +APEX2 27301 +APH1A 51107 +APH1B 83464 +API5 8539 +API5P1 642812 +API5P2 728664 +APIP 51074 +APLF 200558 +APLN 8862 +APLNR 187 +APLP1 333 +APLP2 334 +APMAP 57136 +APOA1 335 +APOA1-AS 104326055 +APOA2 336 +APOA4 337 +APOA5 116519 +APOB 338 +APOBEC1 339 +APOBEC2 10930 +APOBEC3A 200315 +APOBEC3A_B 100913187 +APOBEC3AP1 105377532 +APOBEC3B 9582 +APOBEC3B-AS1 100874530 +APOBEC3C 27350 +APOBEC3D 140564 +APOBEC3F 200316 +APOBEC3G 60489 +APOBEC3H 164668 +APOBEC4 403314 +APOBR 55911 +APOC1 341 +APOC1P1 342 +APOC2 344 +APOC3 345 +APOC4 346 +APOC4-APOC2 100533990 +APOD 347 +APOE 348 +APOF 319 +APOH 350 +APOL1 8542 +APOL2 23780 +APOL3 80833 +APOL4 80832 +APOL5 80831 +APOL6 80830 +APOLD1 81575 +APOM 55937 +APONP 100419033 +APOO 79135 +APOOL 139322 +APOOP1 100286948 +APOOP2 100129005 +APOOP3 100131528 +APOOP4 100128725 +APOOP5 644649 +APP 351 +APP-DT 118568803 +APPAT 100506123 +APPBP2 10513 +APPBP2-DT 120017341 +APPL1 26060 +APPL2 55198 +APRG1 339883 +APRT 353 +APTR 100505854 +APTX 54840 +AQP1 358 +AQP2 359 +AQP3 360 +AQP4 361 +AQP4-AS1 147429 +AQP5 362 +AQP5-AS1 101927318 +AQP6 363 +AQP7 364 +AQP7B 100509620 +AQP7P1 375719 +AQP7P2 389756 +AQP7P3 441432 +AQP7P4 100132938 +AQP7P5 102724655 +AQP8 343 +AQP9 366 +AQP10 89872 +AQP11 282679 +AQP12A 375318 +AQP12B 653437 +AQR 9716 +AR 367 +ARAF 369 +ARAFP1 100421741 +ARAFP2 644000 +ARAFP3 285893 +ARAP1 116985 +ARAP1-AS1 100874075 +ARAP1-AS2 100506020 +ARAP2 116984 +ARAP3 64411 +ARC 23237 +ARCN1 372 +AREG 374 +AREL1 9870 +ARF1 375 +ARF1P1 442334 +ARF1P2 100420012 +ARF1P3 442396 +ARF2P 108489980 +ARF3 377 +ARF4 378 +ARF4-AS1 106144532 +ARF4P1 380 +ARF4P2 170485 +ARF4P3 390423 +ARF4P4 100129023 +ARF4P5 100316867 +ARF5 381 +ARF6 382 +ARFGAP1 55738 +ARFGAP2 84364 +ARFGAP3 26286 +ARFGEF1 10565 +ARFGEF1-DT 102724708 +ARFGEF2 10564 +ARFGEF3 57221 +ARFIP1 27236 +ARFIP2 23647 +ARFRP1 10139 +ARG1 383 +ARG2 384 +ARGFX 503582 +ARGFXP1 503583 +ARGFXP2 503640 +ARGLU1 55082 +ARHGAP1 392 +ARHGAP4 393 +ARHGAP5 394 +ARHGAP5-AS1 84837 +ARHGAP6 395 +ARHGAP8 23779 +ARHGAP9 64333 +ARHGAP10 79658 +ARHGAP11A 9824 +ARHGAP11A-DT 101928042 +ARHGAP11A-SCG5 114118903 +ARHGAP11B 89839 +ARHGAP11B-DT 102725021 +ARHGAP12 94134 +ARHGAP15 55843 +ARHGAP15-AS1 105373654 +ARHGAP16P 319102 +ARHGAP17 55114 +ARHGAP18 93663 +ARHGAP19 84986 +ARHGAP19-SLIT1 100533184 +ARHGAP20 57569 +ARHGAP21 57584 +ARHGAP22 58504 +ARHGAP22-IT1 100689073 +ARHGAP23 57636 +ARHGAP23P1 102577425 +ARHGAP24 83478 +ARHGAP25 9938 +ARHGAP26 23092 +ARHGAP26-AS1 100874239 +ARHGAP26-IT1 100874372 +ARHGAP27 201176 +ARHGAP27P1 146880 +ARHGAP27P1-BPTFP1-KPNA2P3 109286553 +ARHGAP27P2 440461 +ARHGAP28 79822 +ARHGAP28-AS1 101927168 +ARHGAP29 9411 +ARHGAP29-AS1 107985092 +ARHGAP30 257106 +ARHGAP31 57514 +ARHGAP31-AS1 100874246 +ARHGAP32 9743 +ARHGAP33 115703 +ARHGAP35 2909 +ARHGAP36 158763 +ARHGAP39 80728 +ARHGAP40 343578 +ARHGAP42 143872 +ARHGAP42-AS1 100128386 +ARHGAP42P1 100887075 +ARHGAP42P2 100130693 +ARHGAP42P3 266698 +ARHGAP42P4 254398 +ARHGAP42P5 100128514 +ARHGAP44 9912 +ARHGAP44-AS1 100128006 +ARHGAP45 23526 +ARHGDIA 396 +ARHGDIB 397 +ARHGDIG 398 +ARHGEF1 9138 +ARHGEF2 9181 +ARHGEF2-AS1 107985210 +ARHGEF2-AS2 107985209 +ARHGEF3 50650 +ARHGEF3-AS1 100874200 +ARHGEF4 50649 +ARHGEF4-AS1 121853076 +ARHGEF5 7984 +ARHGEF6 9459 +ARHGEF7 8874 +ARHGEF7-AS1 100874226 +ARHGEF7-AS2 100874238 +ARHGEF7-IT1 100874371 +ARHGEF9 23229 +ARHGEF9-IT1 100874355 +ARHGEF10 9639 +ARHGEF10L 55160 +ARHGEF11 9826 +ARHGEF12 23365 +ARHGEF15 22899 +ARHGEF16 27237 +ARHGEF17 9828 +ARHGEF17-AS1 100287837 +ARHGEF18 23370 +ARHGEF18-AS1 118827816 +ARHGEF19 128272 +ARHGEF19-AS1 100874233 +ARHGEF25 115557 +ARHGEF26 26084 +ARHGEF26-AS1 100507524 +ARHGEF28 64283 +ARHGEF28P1 127379713 +ARHGEF33 100271715 +ARHGEF34P 728377 +ARHGEF35 445328 +ARHGEF35-AS1 101928605 +ARHGEF37 389337 +ARHGEF38 54848 +ARHGEF38-IT1 100874374 +ARHGEF39 84904 +ARHGEF40 55701 +ARID1A 8289 +ARID1B 57492 +ARID2 196528 +ARID3A 1820 +ARID3B 10620 +ARID3BP1 646555 +ARID3C 138715 +ARID4A 5926 +ARID4B 51742 +ARID5A 10865 +ARID5B 84159 +ARIH1 25820 +ARIH2 10425 +ARIH2OS 646450 +ARIH2P1 390844 +ARK2C 494470 +ARK2N 147339 +ARL1 400 +ARL2 402 +ARL2-SNX15 100528018 +ARL2BP 23568 +ARL2BPP1 399666 +ARL2BPP2 643898 +ARL2BPP3 646879 +ARL2BPP4 100130265 +ARL2BPP5 100874420 +ARL2BPP6 100874421 +ARL2BPP7 100131629 +ARL2BPP8 100131784 +ARL2BPP9 100421675 +ARL2BPP10 100874449 +ARL3 403 +ARL4A 10124 +ARL4AP1 387684 +ARL4AP2 152709 +ARL4AP3 107984161 +ARL4AP4 100420471 +ARL4AP5 101928788 +ARL4C 10123 +ARL4D 379 +ARL5A 26225 +ARL5AP1 641382 +ARL5AP2 641380 +ARL5AP3 106480778 +ARL5AP4 641379 +ARL5AP5 641378 +ARL5B 221079 +ARL5C 390790 +ARL6 84100 +ARL6IP1 23204 +ARL6IP1P1 100288702 +ARL6IP1P2 646348 +ARL6IP1P3 729790 +ARL6IP4 51329 +ARL6IP5 10550 +ARL6IP6 151188 +ARL8A 127829 +ARL8B 55207 +ARL8BP1 127566425 +ARL8BP2 100131223 +ARL9 132946 +ARL10 285598 +ARL11 115761 +ARL13A 392509 +ARL13B 200894 +ARL14 80117 +ARL14EP 120534 +ARL14EP-DT 105376607 +ARL14EPL 644100 +ARL14EPP1 107985793 +ARL15 54622 +ARL16 339231 +ARL17A 51326 +ARL17B 100506084 +ARLNC1 100996425 +ARMC1 55156 +ARMC2 84071 +ARMC2-AS1 101929716 +ARMC3 219681 +ARMC5 79798 +ARMC6 93436 +ARMC7 79637 +ARMC8 25852 +ARMC8P1 100130871 +ARMC9 80210 +ARMC10 83787 +ARMC10P1 389137 +ARMC12 221481 +ARMCX1 51309 +ARMCX2 9823 +ARMCX3 51566 +ARMCX3-AS1 100128574 +ARMCX4 100131755 +ARMCX5 64860 +ARMCX5-GPRASP2 100528062 +ARMCX6 54470 +ARMCX7P 653354 +ARMH1 339541 +ARMH2 101928603 +ARMH3 79591 +ARMH4 145407 +ARMS2 387715 +ARMT1 79624 +ARNILA 116435288 +ARNT 405 +ARNT2 9915 +ARNT2-DT 101929560 +ARPC1A 10552 +ARPC1AP1 100422044 +ARPC1AP2 204800 +ARPC1AP3 260421 +ARPC1AP4 260422 +ARPC1B 10095 +ARPC1BP1 100288663 +ARPC2 10109 +ARPC3 10094 +ARPC3P1 87171 +ARPC3P2 391160 +ARPC3P3 729494 +ARPC3P4 100421973 +ARPC3P5 441131 +ARPC4 10093 +ARPC4-TTLL3 100526693 +ARPC5 10092 +ARPC5L 81873 +ARPIN 348110 +ARPIN-AP3S2 100526783 +ARPP19 10776 +ARPP19P1 646227 +ARPP19P2 643896 +ARPP21 10777 +ARPP21-AS1 100874098 +ARR3 407 +ARRB1 408 +ARRB2 409 +ARRDC1 92714 +ARRDC1-AS1 85026 +ARRDC2 27106 +ARRDC3 57561 +ARRDC3-AS1 100129716 +ARRDC4 91947 +ARRDC5 645432 +ARSA 410 +ARSB 411 +ARSC2 413 +ARSD 414 +ARSD-AS1 100506356 +ARSDP1 10034 +ARSF 416 +ARSFP1 23757 +ARSG 22901 +ARSH 347527 +ARSI 340075 +ARSJ 79642 +ARSK 153642 +ARSL 415 +ARSLP1 10033 +ART1 417 +ART2BP 106481723 +ART2P 418 +ART3 419 +ART4 420 +ART5 116969 +ARTN 9048 +ARV1 64801 +ARVCF 421 +ARX 170302 +AS3MT 57412 +ASAH1 427 +ASAH1-AS1 101929066 +ASAH2 56624 +ASAH2B 653308 +ASAP1 50807 +ASAP1-IT1 29065 +ASAP1-IT2 100507117 +ASAP2 8853 +ASAP3 55616 +ASB1 51665 +ASB2 51676 +ASB3 51130 +ASB4 51666 +ASB5 140458 +ASB6 140459 +ASB7 140460 +ASB8 140461 +ASB9 140462 +ASB9P1 728619 +ASB10 136371 +ASB11 140456 +ASB12 142689 +ASB13 79754 +ASB14 142686 +ASB15 142685 +ASB15-AS1 102724555 +ASB16 92591 +ASB16-AS1 339201 +ASB17 127247 +ASB18 401036 +ASCC1 51008 +ASCC2 84164 +ASCC3 10973 +ASCL1 429 +ASCL2 430 +ASCL3 56676 +ASCL4 121549 +ASCL5 647219 +ASDURF 110599588 +ASF1A 25842 +ASF1B 55723 +ASGR1 432 +ASGR2 433 +ASH1L 55870 +ASH1L-AS1 645676 +ASH1L-IT1 106478976 +ASH2L 9070 +ASH2LP1 266703 +ASH2LP2 100422088 +ASH2LP3 100736411 +ASIC1 41 +ASIC2 40 +ASIC3 9311 +ASIC4 55515 +ASIC4-AS1 105373885 +ASIC5 51802 +ASIP 434 +ASL 435 +ASLP1 436 +ASMER1 107987295 +ASMER2 105373202 +ASMT 438 +ASMTL 8623 +ASMTL-AS1 80161 +ASNS 440 +ASNSD1 54529 +ASNSP1 389652 +ASNSP2 442 +ASNSP3 100423061 +ASNSP4 100419423 +ASNSP5 100873794 +ASNSP6 100423060 +ASPA 443 +ASPDH 554235 +ASPG 374569 +ASPH 444 +ASPHD1 253982 +ASPHD2 57168 +ASPM 259266 +ASPN 54829 +ASPRV1 151516 +ASPSCR1 79058 +ASRGL1 80150 +ASS1 445 +ASS1P1 442167 +ASS1P2 447 +ASS1P3 158452 +ASS1P4 449 +ASS1P5 450 +ASS1P6 451 +ASS1P7 339845 +ASS1P8 453 +ASS1P9 454 +ASS1P10 455 +ASS1P11 340274 +ASS1P12 392302 +ASS1P13 341230 +ASS1P14 459 +ASTE1 28990 +ASTILCS 105375790 +ASTL 431705 +ASTN1 460 +ASTN2 23245 +ASTN2-AS1 100128505 +ASXL1 171023 +ASXL2 55252 +ASXL3 80816 +ASXL3-DT 118827808 +ASZ1 136991 +ATAD1 84896 +ATAD2 29028 +ATAD2B 54454 +ATAD3A 55210 +ATAD3B 83858 +ATAD3C 219293 +ATAD5 79915 +ATAT1 79969 +ATCAY 85300 +ATE1 11101 +ATE1OSP 100130887 +ATF1 466 +ATF1P1 100128159 +ATF2 1386 +ATF3 467 +ATF4 468 +ATF4P1 469 +ATF4P2 340600 +ATF4P3 643159 +ATF4P4 100127952 +ATF5 22809 +ATF6 22926 +ATF6-DT 102724329 +ATF6B 1388 +ATF7 11016 +ATF7-NPFF 114108587 +ATF7IP 55729 +ATF7IP2 80063 +ATG2A 23130 +ATG2B 55102 +ATG3 64422 +ATG3P1 100135756 +ATG4A 115201 +ATG4AP1 106480786 +ATG4B 23192 +ATG4C 84938 +ATG4D 84971 +ATG5 9474 +ATG7 10533 +ATG9A 79065 +ATG9B 285973 +ATG10 83734 +ATG10-AS1 100874022 +ATG10-IT1 100874311 +ATG12 9140 +ATG12P1 100151642 +ATG12P2 100293948 +ATG13 9776 +ATG14 22863 +ATG16L1 55054 +ATG16L2 89849 +ATG101 60673 +ATIC 471 +ATL1 51062 +ATL2 64225 +ATL3 25923 +ATM 472 +ATMIN 23300 +ATN1 1822 +ATOH1 474 +ATOH7 220202 +ATOH8 84913 +ATOSA 56204 +ATOSB 80256 +ATOSBP1 645180 +ATOX1 475 +ATOX1-AS1 105378235 +ATP1A1 476 +ATP1A1-AS1 84852 +ATP1A2 477 +ATP1A3 478 +ATP1A4 480 +ATP1B1 481 +ATP1B1P1 485 +ATP1B2 482 +ATP1B3 483 +ATP1B3-AS1 100874077 +ATP1B3P1 484 +ATP1B4 23439 +ATP2A1 487 +ATP2A1-AS1 100289092 +ATP2A2 488 +ATP2A3 489 +ATP2B1 490 +ATP2B1-AS1 338758 +ATP2B2 491 +ATP2B2-IT1 100874324 +ATP2B2-IT2 100874325 +ATP2B3 492 +ATP2B4 493 +ATP2C1 27032 +ATP2C2 9914 +ATP2C2-AS1 105371374 +ATP4A 495 +ATP4B 496 +ATP5F1A 498 +ATP5F1AP1 442416 +ATP5F1AP2 504 +ATP5F1AP3 645443 +ATP5F1AP4 100129782 +ATP5F1AP7 442415 +ATP5F1AP8 392322 +ATP5F1AP10 100132619 +ATP5F1B 506 +ATP5F1BP1 507 +ATP5F1C 509 +ATP5F1CP1 645560 +ATP5F1D 513 +ATP5F1E 514 +ATP5F1EP1 23744 +ATP5F1EP2 432369 +ATP5IF1 93974 +ATP5MC1 516 +ATP5MC1P1 319136 +ATP5MC1P2 319137 +ATP5MC1P3 646619 +ATP5MC1P4 100287755 +ATP5MC1P5 390424 +ATP5MC1P6 100505704 +ATP5MC1P7 100130962 +ATP5MC1P8 100288222 +ATP5MC2 517 +ATP5MC2P1 520 +ATP5MC2P2 319119 +ATP5MC2P3 100507097 +ATP5MC2P4 654480 +ATP5MC2P5 100507083 +ATP5MC3 518 +ATP5ME 521 +ATP5MF 9551 +ATP5MF-PTCD1 100526740 +ATP5MFP1 101241877 +ATP5MFP2 387107 +ATP5MFP3 445573 +ATP5MFP4 654485 +ATP5MFP5 654484 +ATP5MFP6 654486 +ATP5MG 10632 +ATP5MGL 267020 +ATP5MGP1 53411 +ATP5MGP2 53410 +ATP5MGP3 53409 +ATP5MGP4 100130396 +ATP5MGP5 100287091 +ATP5MGP6 100462865 +ATP5MGP7 100287964 +ATP5MGP8 100462862 +ATP5MJ 9556 +ATP5MK 84833 +ATP5MKP1 100288307 +ATP5PB 515 +ATP5PBP1 100422523 +ATP5PBP2 645973 +ATP5PBP3 644333 +ATP5PBP4 100422514 +ATP5PBP5 100128516 +ATP5PBP6 645440 +ATP5PBP7 124496 +ATP5PBP8 100127892 +ATP5PD 10476 +ATP5PDP1 390581 +ATP5PDP2 138234 +ATP5PDP3 138864 +ATP5PDP4 246723 +ATP5PF 522 +ATP5PFP1 359997 +ATP5PO 539 +ATP5POP1 100132849 +ATP6AP1 537 +ATP6AP1-DT 158960 +ATP6AP1L 92270 +ATP6AP2 10159 +ATP6V1A 523 +ATP6V1B1 525 +ATP6V1B1-AS1 101927750 +ATP6V1B2 526 +ATP6V1C1 528 +ATP6V1C2 245973 +ATP6V1D 51382 +ATP6V1E1 529 +ATP6V1E1P1 343515 +ATP6V1E1P2 100462844 +ATP6V1E1P3 729435 +ATP6V1E2 90423 +ATP6V1F 9296 +ATP6V1G1 9550 +ATP6V1G1P1 319116 +ATP6V1G1P2 100128541 +ATP6V1G1P3 100462838 +ATP6V1G1P4 100462843 +ATP6V1G1P5 100462840 +ATP6V1G1P6 100462732 +ATP6V1G1P7 100874514 +ATP6V1G2 534 +ATP6V1G2-DDX39B 100532737 +ATP6V1G3 127124 +ATP6V1H 51606 +ATP6V0A1 535 +ATP6V0A2 23545 +ATP6V0A4 50617 +ATP6V0B 533 +ATP6V0C 527 +ATP6V0CP1 100132978 +ATP6V0CP2 106478961 +ATP6V0CP3 442211 +ATP6V0CP4 112436690 +ATP6V0D1 9114 +ATP6V0D1-DT 101927837 +ATP6V0D2 245972 +ATP6V0E1 8992 +ATP6V0E1P1 100874502 +ATP6V0E1P2 100874503 +ATP6V0E1P3 100133262 +ATP6V0E1P4 100874504 +ATP6V0E2 155066 +ATP6V0E2-AS1 401431 +ATP7A 538 +ATP7B 540 +ATP7BP1 100462825 +ATP8A1 10396 +ATP8A1-DT 119863863 +ATP8A2 51761 +ATP8A2P1 100422505 +ATP8A2P2 100533851 +ATP8A2P3 100874518 +ATP8B1 5205 +ATP8B1-AS1 100505549 +ATP8B2 57198 +ATP8B3 148229 +ATP8B4 79895 +ATP8B5P 158381 +ATP9A 10079 +ATP9B 374868 +ATP10A 57194 +ATP10A-DT 105370738 +ATP10B 23120 +ATP10D 57205 +ATP11A 23250 +ATP11A-AS1 100874205 +ATP11AUN 400165 +ATP11B 23200 +ATP11B-DT 105374245 +ATP11C 286410 +ATP12A 479 +ATP13A1 57130 +ATP13A2 23400 +ATP13A3 79572 +ATP13A3-DT 401106 +ATP13A4 84239 +ATP13A4-AS1 101929198 +ATP13A5 344905 +ATP13A5-AS1 100874218 +ATP23 91419 +ATPAF1 64756 +ATPAF2 91647 +ATPSCKMT 134145 +ATR 545 +ATRAID 51374 +ATRIP 84126 +ATRN 8455 +ATRNL1 26033 +ATRX 546 +ATXN1 6310 +ATXN1-AS1 101928433 +ATXN1L 342371 +ATXN2 6311 +ATXN2-AS 102723619 +ATXN2L 11273 +ATXN3 4287 +ATXN3L 92552 +ATXN7 6314 +ATXN7L1 222255 +ATXN7L2 127002 +ATXN7L3 56970 +ATXN7L3-AS1 101926967 +ATXN7L3B 552889 +ATXN7L3P1 392485 +ATXN8 724066 +ATXN8OS 6315 +ATXN10 25814 +AUH 549 +AUNIP 79000 +AUP1 550 +AURKA 6790 +AURKAIP1 54998 +AURKAP1 6791 +AURKAP2 386665 +AURKB 9212 +AURKBP1 644233 +AURKC 6795 +AUTS2 26053 +AVEN 57099 +AVIL 10677 +AVL9 23080 +AVP 551 +AVPI1 60370 +AVPR1A 552 +AVPR1B 553 +AVPR1B-DT 105372869 +AVPR2 554 +AWAT1 158833 +AWAT2 158835 +AXDND1 126859 +AXIN1 8312 +AXIN2 8313 +AXL 558 +AZGP1 563 +AZGP1P1 646282 +AZGP1P2 401393 +AZI2 64343 +AZIN1 51582 +AZIN2 113451 +AZU1 566 +AZU1P1 106480244 +B2M 567 +B2MR 568 +B3GALNT1 8706 +B3GALNT1P1 100128857 +B3GALNT2 148789 +B3GALNT2P1 100130402 +B3GALT1 8708 +B3GALT1-AS1 105616981 +B3GALT2 8707 +B3GALT4 8705 +B3GALT5 10317 +B3GALT5-AS1 114041 +B3GALT6 126792 +B3GALT9 100288842 +B3GAT1 27087 +B3GAT1-DT 283177 +B3GAT2 135152 +B3GAT3 26229 +B3GAT3P1 402146 +B3GLCT 145173 +B3GNT2 10678 +B3GNT2P1 100422469 +B3GNT3 10331 +B3GNT4 79369 +B3GNT5 84002 +B3GNT6 192134 +B3GNT7 93010 +B3GNT8 374907 +B3GNT9 84752 +B3GNTL1 146712 +B3GNTL1P1 106481968 +B3GNTL1P2 106480419 +B4GALNT1 2583 +B4GALNT2 124872 +B4GALNT2P1 106481717 +B4GALNT3 283358 +B4GALNT4 338707 +B4GALT1 2683 +B4GALT1-AS1 101929639 +B4GALT2 8704 +B4GALT3 8703 +B4GALT4 8702 +B4GALT4-AS1 100874201 +B4GALT5 9334 +B4GALT6 9331 +B4GALT7 11285 +B4GAT1 11041 +B4GAT1-DT 102724064 +B9D1 27077 +B9D2 80776 +BAALC 79870 +BAALC-AS1 100499183 +BAALC-AS2 157556 +BAAT 570 +BABAM1 29086 +BABAM2 9577 +BABAM2-AS1 100302650 +BACE1 23621 +BACE1-AS 100379571 +BACE2 25825 +BACE2-IT1 282569 +BACH1 571 +BACH1-AS1 106478962 +BACH1-IT1 +BACH1-IT2 100874322 +BACH1-IT3 54147 +BACH2 60468 +BAD 572 +BAG1 573 +BAG1P1 392442 +BAG2 9532 +BAG3 9531 +BAG4 9530 +BAG5 9529 +BAG6 7917 +BAGE 574 +BAGE2 85319 +BAGE3 85318 +BAGE4 85317 +BAGE5 85316 +BAHCC1 57597 +BAHD1 22893 +BAIAP2 10458 +BAIAP2-DT 440465 +BAIAP2L1 55971 +BAIAP2L2 80115 +BAIAP3 8938 +BAK1 578 +BAK1P1 600 +BAK1P2 601 +BALR6 339862 +BAMBI 25805 +BANCR 100885775 +BANF1 8815 +BANF1P1 317687 +BANF1P2 414169 +BANF1P3 100505506 +BANF1P4 100653423 +BANF1P5 101290503 +BANF2 140836 +BANK1 55024 +BANP 54971 +BAP1 8314 +BARD1 580 +BARHL1 56751 +BARHL2 343472 +BARX1 56033 +BARX1-DT 101928040 +BARX2 8538 +BASP1 10409 +BASP1-AS1 285696 +BASP1P1 646201 +BATF 10538 +BATF2 116071 +BATF3 55509 +BAX 581 +BAZ1A 11177 +BAZ1A-AS1 112268124 +BAZ1B 9031 +BAZ2A 11176 +BAZ2B 29994 +BAZ2B-AS1 643072 +BBC3 27113 +BBIP1 92482 +BBIP1P1 105373509 +BBLN 79095 +BBOF1 80127 +BBOX1 8424 +BBOX1-AS1 103695435 +BBS1 582 +BBS2 583 +BBS4 585 +BBS5 129880 +BBS7 55212 +BBS7-DT 119545622 +BBS9 27241 +BBS10 79738 +BBS12 166379 +BBX 56987 +BCAM 4059 +BCAN 63827 +BCAN-AS1 105371453 +BCAN-AS2 126568844 +BCAP29 55973 +BCAP31 10134 +BCAP31P1 100194425 +BCAP31P2 100194426 +BCAR1 9564 +BCAR1P1 100533717 +BCAR1P2 100533718 +BCAR3 8412 +BCAR3-AS1 100129046 +BCAR4 400500 +BCAS1 8537 +BCAS2 10286 +BCAS2P1 100127960 +BCAS2P2 100421045 +BCAS2P3 100128339 +BCAS3 54828 +BCAS3-AS1 107984992 +BCAS4 55653 +BCAT1 586 +BCAT2 587 +BCCIP 56647 +BCDIN3D 144233 +BCDIN3D-AS1 100286844 +BCHE 590 +BCKDHA 593 +BCKDHB 594 +BCKDK 10295 +BCL2 596 +BCL2A1 597 +BCL2L1 598 +BCL2L1-AS1 105372589 +BCL2L2 599 +BCL2L2-PABPN1 100529063 +BCL2L10 10017 +BCL2L11 10018 +BCL2L12 83596 +BCL2L12P1 100289095 +BCL2L13 23786 +BCL2L14 79370 +BCL2L15 440603 +BCL3 602 +BCL6 604 +BCL6-AS1 106146153 +BCL6B 255877 +BCL7A 605 +BCL7B 9275 +BCL7C 9274 +BCL9 607 +BCL9L 283149 +BCL9P1 100419324 +BCL10 8915 +BCL10-AS1 646626 +BCL11A 53335 +BCL11B 64919 +BCLAF1 9774 +BCLAF1P1 728366 +BCLAF1P2 731605 +BCLAF3 256643 +BCO1 53630 +BCO2 83875 +BCOR 54880 +BCORL1 63035 +BCORP1 286554 +BCR 613 +BCRP1 644079 +BCRP2 400892 +BCRP3 644165 +BCRP4 616 +BCRP5 648980 +BCRP6 728468 +BCRP7 100133163 +BCRP8 100133044 +BCRP9 107126287 +BCS1L 617 +BCYRN1 618 +BCYRN1P1 619 +BCYRN1P2 620 +BCYRN1P3 654337 +BDH1 622 +BDH2 56898 +BDH2P1 389416 +BDKRB1 623 +BDKRB2 624 +BDNF 627 +BDNF-AS 497258 +BDP1 55814 +BDP1P 724038 +BEAN1 146227 +BEAN1-AS1 101927726 +BECN1 8678 +BECN1P2 100420149 +BECN2 441925 +BEGAIN 57596 +BEND2 139105 +BEND3 57673 +BEND3P1 644459 +BEND3P2 392368 +BEND3P3 650623 +BEND4 389206 +BEND5 79656 +BEND6 221336 +BEND7 222389 +BEND7-DT 105376421 +BEND7P1 100419793 +BEST1 7439 +BEST2 54831 +BEST3 144453 +BEST4 266675 +BET1 10282 +BET1-AS1 105375403 +BET1L 51272 +BET1P1 100128542 +BETALINC1 124904961 +BEX1 55859 +BEX2 84707 +BEX3 27018 +BEX4 56271 +BEX5 340542 +BFAR 51283 +BFSP1 631 +BFSP2 8419 +BFSP2-AS1 85003 +BGLAP 632 +BGLT3 103344929 +BGN 633 +BHLHA9 727857 +BHLHA15 168620 +BHLHE22 27319 +BHLHE22-AS1 401463 +BHLHE23 128408 +BHLHE40 8553 +BHLHE40-AS1 100507582 +BHLHE41 79365 +BHMT 635 +BHMT2 23743 +BICC1 80114 +BICD1 636 +BICD1-AS1 120766143 +BICD1P1 391472 +BICD2 23299 +BICDL1 92558 +BICDL2 146439 +BICDL3P 171022 +BICRA 29998 +BICRA-AS1 106144534 +BICRA-AS2 128667229 +BICRAL 23506 +BID 637 +BIK 638 +BIN1 274 +BIN2 51411 +BIN2P1 345258 +BIN2P2 644601 +BIN3 55909 +BIN3-IT1 80094 +BIRC2 329 +BIRC3 330 +BIRC5 332 +BIRC6 57448 +BIRC6-AS1 100874009 +BIRC6-AS2 103752586 +BIRC7 79444 +BIRC8 112401 +BISPR 105221694 +BIVM 54841 +BIVM-ERCC5 100533467 +BLACAT1 101669762 +BLACE 338436 +BLCAP 10904 +BLID 414899 +BLK 640 +BLM 641 +BLMH 642 +BLNK 29760 +BLOC1S1 2647 +BLOC1S2 282991 +BLOC1S2P1 100131924 +BLOC1S3 388552 +BLOC1S4 55330 +BLOC1S5 63915 +BLOC1S5-TXNDC5 100526836 +BLOC1S6 26258 +BLOC1S6P1 100130035 +BLTP1 84162 +BLTP2 9703 +BLTP3A 54887 +BLTP3B 23074 +BLTP3B-DT 120766146 +BLVRA 644 +BLVRB 645 +BLVRBP1 127379696 +BLZF1 8548 +BLZF2P 317729 +BMAL1 406 +BMAL2 56938 +BMAL2-AS1 101928646 +BMERB1 89927 +BMF 90427 +BMF-AS1 110806288 +BMI1 648 +BMI1P1 100127902 +BMNCR 107985249 +BMP1 649 +BMP2 650 +BMP2K 55589 +BMP2K-DT 119863864 +BMP2KL 347359 +BMP3 651 +BMP4 652 +BMP5 653 +BMP6 654 +BMP6P1 266700 +BMP7 655 +BMP7-AS1 102723590 +BMP8A 353500 +BMP8B 656 +BMP8B-AS1 105378666 +BMP10 27302 +BMP15 9210 +BMPER 168667 +BMPR1A 657 +BMPR1AP1 100421515 +BMPR1AP2 100533800 +BMPR1B 658 +BMPR1B-DT 100507012 +BMPR2 659 +BMS1 9790 +BMS1P1 399761 +BMS1P2 642826 +BMS1P3 414217 +BMS1P4 729096 +BMS1P4-AGAP5 113939925 +BMS1P7 100133265 +BMS1P8 653557 +BMS1P9 653458 +BMS1P10 728611 +BMS1P11 644632 +BMS1P12 644684 +BMS1P13 644716 +BMS1P14 101929959 +BMS1P15 642311 +BMS1P16 727914 +BMS1P17 101101776 +BMS1P18 414763 +BMS1P19 100131577 +BMS1P20 96610 +BMS1P21 100288974 +BMS1P22 106480334 +BMS1P23 728034 +BMT2 154743 +BMX 660 +BNAT1 101928745 +BNC1 646 +BNC2 54796 +BNC2-AS1 111216284 +BNIP1 662 +BNIP2 663 +BNIP3 664 +BNIP3L 665 +BNIP3P1 319138 +BNIP3P2 100421754 +BNIP3P3 100421736 +BNIP3P4 100289028 +BNIP3P5 100421724 +BNIP3P6 100129777 +BNIP3P7 101927265 +BNIP3P8 100421710 +BNIP3P9 106480280 +BNIP3P10 100421695 +BNIP3P11 106480286 +BNIP3P12 100421703 +BNIP3P13 101060192 +BNIP3P14 100421696 +BNIP3P15 106481692 +BNIP3P16 106480418 +BNIP3P17 100421704 +BNIP3P18 106481693 +BNIP3P19 106480281 +BNIP3P20 100421705 +BNIP3P21 100131306 +BNIP3P22 100421706 +BNIP3P23 100421697 +BNIP3P24 100421698 +BNIP3P25 100421707 +BNIP3P26 100421699 +BNIP3P27 100421708 +BNIP3P28 106481966 +BNIP3P29 100421700 +BNIP3P30 106481694 +BNIP3P31 106480282 +BNIP3P32 106480283 +BNIP3P33 106481695 +BNIP3P34 100128849 +BNIP3P35 106480284 +BNIP3P36 106481696 +BNIP3P37 106480285 +BNIP3P38 100421709 +BNIP3P39 100421701 +BNIP3P40 100421702 +BNIP3P41 101059988 +BNIP3P42 106481697 +BNIP3P43 127379721 +BNIP3P44 127379755 +BNIP3P45 127379725 +BNIP3P46 127379734 +BNIP3P47 127379681 +BNIP5 389384 +BNIPL 149428 +BOC 91653 +BOD1 91272 +BOD1L1 259282 +BOD1L2 284257 +BOD1P1 100129468 +BOD1P2 100129355 +BOK 666 +BOK-AS1 100379249 +BOLA1 51027 +BOLA2 552900 +BOLA2-SMG1P6 107282092 +BOLA2B 654483 +BOLA2P1 100652796 +BOLA2P2 106480322 +BOLA2P3 106480323 +BOLA3 388962 +BOLA3-DT 100507171 +BOLA3P1 100288111 +BOLA3P2 100287463 +BOLA3P3 644754 +BOLA3P4 106480324 +BOLL 66037 +BOP1 23246 +BORA 79866 +BORCS5 118426 +BORCS6 54785 +BORCS7 119032 +BORCS7-ASMT 100528007 +BORCS8 729991 +BORCS8-MEF2B 4207 +BORCS8P1 100128109 +BPESC1 60467 +BPGM 669 +BPHL 670 +BPI 671 +BPIFA1 51297 +BPIFA2 140683 +BPIFA3 128861 +BPIFA4P 317716 +BPIFB1 92747 +BPIFB2 80341 +BPIFB3 359710 +BPIFB4 149954 +BPIFB5P 100505383 +BPIFB6 128859 +BPIFB9P 402016 +BPIFC 254240 +BPNT1 10380 +BPNT2 54928 +BPNT2P1 100421537 +BPTF 2186 +BPTFP1 109286551 +BPY2 9083 +BPY2B 442867 +BPY2C 442868 +BPY2DP 100885797 +BRAF 673 +BRAFP1 286494 +BRAP 8315 +BRAT1 221927 +BRCA1 672 +BRCA1P1 394269 +BRCA2 675 +BRCC3 79184 +BRCC3P1 100421311 +BRD1 23774 +BRD2 6046 +BRD3 8019 +BRD3OS 266655 +BRD4 23476 +BRD7 29117 +BRD7P1 100288948 +BRD7P2 647076 +BRD7P3 23629 +BRD7P4 100287229 +BRD7P5 100129259 +BRD7P6 100128042 +BRD7P7 100419877 +BRD8 10902 +BRD9 65980 +BRD9P1 106481721 +BRD9P2 109729114 +BRDT 676 +BRDTP1 643486 +BRF1 2972 +BRF2 55290 +BRI3 25798 +BRI3BP 140707 +BRI3BPP1 100129976 +BRI3P1 730010 +BRI3P2 441630 +BRI3P3 100101554 +BRICD5 283870 +BRINP1 1620 +BRINP2 57795 +BRINP3 339479 +BRINP3-DT 101929120 +BRIP1 83990 +BRIX1 55299 +BRIX1P1 100422268 +BRK1 55845 +BRK1P1 100288031 +BRK1P2 100874492 +BRME1 79173 +BRMS1 25855 +BRMS1L 84312 +BROX 148362 +BRPF1 7862 +BRPF3 27154 +BRPF3-AS1 102723648 +BRS3 680 +BRSK1 84446 +BRSK2 9024 +BRWD1 54014 +BRWD1-AS1 100874093 +BRWD1-AS2 103091865 +BRWD1-IT1 106480743 +BRWD1P1 106481724 +BRWD1P2 100287505 +BRWD1P3 106480688 +BRWD3 254065 +BSCL2 26580 +BSDC1 55108 +BSG 682 +BSG-AS1 105372233 +BSN 8927 +BSN-AS1 106478963 +BSN-DT 100132677 +BSND 7809 +BSNDP1 106480329 +BSNDP2 100422517 +BSNDP3 106481725 +BSNDP4 106481726 +BSPH1 100131137 +BSPRY 54836 +BST1 683 +BST2 684 +BSX 390259 +BTAF1 9044 +BTBD1 53339 +BTBD2 55643 +BTBD3 22903 +BTBD3-AS1 121832811 +BTBD6 90135 +BTBD6P1 646330 +BTBD7 55727 +BTBD7P1 441548 +BTBD7P2 100420392 +BTBD8 284697 +BTBD9 114781 +BTBD9-AS1 101929425 +BTBD10 84280 +BTBD10P1 100128678 +BTBD10P2 100420401 +BTBD16 118663 +BTBD17 388419 +BTBD18 643376 +BTBD19 149478 +BTC 685 +BTD 686 +BTF3 689 +BTF3-DT 118568828 +BTF3L4 91408 +BTF3L4P1 100505945 +BTF3L4P2 653189 +BTF3L4P3 391040 +BTF3L4P4 100506061 +BTF3P1 693 +BTF3P2 283631 +BTF3P3 652964 +BTF3P4 392350 +BTF3P5 652959 +BTF3P6 100499261 +BTF3P7 652960 +BTF3P8 652961 +BTF3P9 503543 +BTF3P10 345829 +BTF3P11 690 +BTF3P12 652963 +BTF3P13 132556 +BTF3P14 100132641 +BTF3P15 100130409 +BTF3P16 643412 +BTG1 694 +BTG1-DT 101928617 +BTG1P1 100129641 +BTG2 7832 +BTG2-DT 730227 +BTG3 10950 +BTG3-AS1 110806272 +BTG3P1 100419246 +BTG4 54766 +BTG4P1 106480330 +BTK 695 +BTLA 151888 +BTN1A1 696 +BTN1A1P1 100420941 +BTN2A1 11120 +BTN2A2 10385 +BTN2A3P 54718 +BTN3A1 11119 +BTN3A2 11118 +BTN3A3 10384 +BTNL2 56244 +BTNL3 10917 +BTNL8 79908 +BTNL9 153579 +BTNL10P 100129094 +BTNL12P 100130701 +BTRC 8945 +BTRCP1 100420631 +BUB1 699 +BUB1B 701 +BUB1B-PAK6 106821730 +BUB1P1 100422363 +BUB3 9184 +BUB3P1 646614 +BUD13 84811 +BUD13-DT 122455333 +BUD13P1 100420358 +BUD23 114049 +BUD31 8896 +BUD31P1 106480331 +BUD31P2 106480332 +BVES 11149 +BVES-AS1 154442 +BVR1 700 +BYSL 705 +BZW1 9689 +BZW1-AS1 101927795 +BZW1P1 391592 +BZW1P2 151579 +BZW2 28969 +C1D 10438 +C1DP1 554049 +C1DP2 642538 +C1DP3 642521 +C1DP4 727879 +C1DP5 106481729 +C1GALT1 56913 +C1GALT1C1 29071 +C1GALT1C1L 728819 +C1GALT1P1 729409 +C1GALT1P2 100128603 +C1GALT1P3 106481730 +C1orf21 81563 +C1orf21-DT 118827814 +C1orf35 79169 +C1orf43 25912 +C1orf50 79078 +C1orf50-AS1 123706505 +C1orf52 148423 +C1orf53 388722 +C1orf54 79630 +C1orf56 54964 +C1orf74 148304 +C1orf87 127795 +C1orf94 84970 +C1orf105 92346 +C1orf115 79762 +C1orf116 79098 +C1orf122 127687 +C1orf127 148345 +C1orf131 128061 +C1orf141 400757 +C1orf146 388649 +C1orf159 54991 +C1orf162 128346 +C1orf167 284498 +C1orf167-AS1 102724659 +C1orf174 339448 +C1orf185 284546 +C1orf198 84886 +C1orf202 122455338 +C1orf210 149466 +C1orf216 127703 +C1orf220 400798 +C1orf226 400793 +C1orf232 110806296 +C1QA 712 +C1QB 713 +C1QBP 708 +C1QBPP1 54098 +C1QBPP2 100422299 +C1QBPP3 100422310 +C1QC 714 +C1QL1 10882 +C1QL1P1 106480353 +C1QL2 165257 +C1QL3 389941 +C1QL4 338761 +C1QTNF1 114897 +C1QTNF1-AS1 100507410 +C1QTNF2 114898 +C1QTNF3 114899 +C1QTNF3-AMACR 100534612 +C1QTNF4 114900 +C1QTNF5 114902 +C1QTNF6 114904 +C1QTNF7 114905 +C1QTNF7-AS1 101929095 +C1QTNF8 390664 +C1QTNF9 338872 +C1QTNF9-AS1 100874232 +C1QTNF9B 387911 +C1QTNF12 388581 +C1R 715 +C1RL 51279 +C1RL-AS1 283314 +C1S 716 +C2 717 +C2-AS1 102060414 +C2CD2 25966 +C2CD2L 9854 +C2CD3 26005 +C2CD4A 145741 +C2CD4B 388125 +C2CD4C 126567 +C2CD4D 100191040 +C2CD4D-AS1 100132111 +C2CD5 9847 +C2CD5-AS1 105369692 +C2CD6 151254 +C2orf15 150590 +C2orf16 84226 +C2orf27A 29798 +C2orf42 54980 +C2orf49 79074 +C2orf49-DT 100506473 +C2orf50 130813 +C2orf66 401027 +C2orf68 388969 +C2orf69 205327 +C2orf69P1 727964 +C2orf69P2 642614 +C2orf69P3 100131279 +C2orf69P4 100420859 +C2orf69P5 107403078 +C2orf72 257407 +C2orf73 129852 +C2orf74 339804 +C2orf74-AS1 105374758 +C2orf74-DT 339803 +C2orf76 130355 +C2orf78 388960 +C2orf80 389073 +C2orf81 388963 +C2orf83 56918 +C2orf88 84281 +C2orf92 728537 +C3 718 +C3AR1 719 +C3CER1 23739 +C3orf18 51161 +C3orf20 84077 +C3orf22 152065 +C3orf33 285315 +C3orf36 80111 +C3orf38 285237 +C3orf49 132200 +C3orf49P1 117981798 +C3orf52 79669 +C3orf62 375341 +C3orf70 285382 +C3orf80 401097 +C3orf84 646498 +C3orf85 401081 +C3orf86P 102724231 +C3P1 388503 +C4A 720 +C4A-AS1 106478955 +C4B 721 +C4B_2 100293534 +C4B-AS1 106480730 +C4BPA 722 +C4BPAP1 727859 +C4BPAP2 724 +C4BPAP3 100421610 +C4BPB 725 +C4orf3 401152 +C4orf17 84103 +C4orf19 55286 +C4orf33 132321 +C4orf36 132989 +C4orf46 201725 +C4orf46P1 100129478 +C4orf46P2 101241901 +C4orf46P3 101241902 +C4orf46P4 100288558 +C4orf50 389197 +C4orf51 646603 +C4orf54 285556 +C5 727 +C5-OT1 110599590 +C5AR1 728 +C5AR2 27202 +C5orf15 56951 +C5orf22 55322 +C5orf24 134553 +C5orf34 375444 +C5orf34-AS1 105374749 +C5orf46 389336 +C5orf47 133491 +C5orf52 100190949 +C5orf58 133874 +C5orf60 285679 +C5orf63 401207 +C5orf64 285668 +C5orf64-AS1 100506526 +C5orf67 101928448 +C6 729 +C6orf15 29113 +C6orf47 57827 +C6orf47-AS1 106480731 +C6orf52 347744 +C6orf58 352999 +C6orf62 81688 +C6orf89 221477 +C6orf118 168090 +C6orf120 387263 +C6orf132 647024 +C6orf136 221545 +C6orf141 135398 +C6orf163 206412 +C6orf226 441150 +C7 730 +C7orf25 79020 +C7orf33 202865 +C7orf50 84310 +C7orf57 136288 +C8A 731 +C8B 732 +C8G 733 +C8orf17 100507249 +C8orf33 65265 +C8orf34 116328 +C8orf34-AS1 286189 +C8orf44 56260 +C8orf44-SGK3 100533105 +C8orf48 157773 +C8orf58 541565 +C8orf74 203076 +C8orf76 84933 +C8orf82 414919 +C8orf88 100127983 +C8orf89 100130301 +C8orf90 122455339 +C9 735 +C9orf40 55071 +C9orf43 257169 +C9orf50 375759 +C9orf57 138240 +C9orf72 203228 +C9orf78 51759 +C9orf78P1 100420738 +C9orf78P2 391636 +C9orf85 138241 +C9orf85P1 124905935 +C9orf85P2 100505642 +C9orf131 138724 +C9orf152 401546 +C9orf153 389766 +C9orf163 158055 +C10orf53 282966 +C10orf55 414236 +C10orf62 414157 +C10orf67 256815 +C10orf67-AS1 105376453 +C10orf71 118461 +C10orf71-AS1 100506769 +C10orf88 80007 +C10orf88B 399815 +C10orf90 118611 +C10orf95 79946 +C10orf95-AS1 100505761 +C10orf105 414152 +C10orf120 399814 +C10orf126 283080 +C10orf143 387723 +C11orf16 56673 +C11orf21 29125 +C11orf24 53838 +C11orf40 143501 +C11orf42 160298 +C11orf52 91894 +C11orf54 28970 +C11orf58 10944 +C11orf65 160140 +C11orf68 83638 +C11orf71 54494 +C11orf86 254439 +C11orf87 399947 +C11orf91 100131378 +C11orf96 387763 +C11orf97 643037 +C11orf98 102288414 +C11orf98P1 106480289 +C11orf98P2 107986535 +C11orf98P3 127138860 +C12orf4 57102 +C12orf40 283461 +C12orf42 374470 +C12orf42-AS1 101929058 +C12orf43 64897 +C12orf50 160419 +C12orf54 121273 +C12orf56 115749 +C12orf57 113246 +C12orf60 144608 +C12orf71 728858 +C12orf71BP 100506578 +C12orf75 387882 +C12orf75-AS1 105369954 +C12orf76 400073 +C13orf42 647166 +C13orf46 100507747 +C14orf28 122525 +C14orf39 317761 +C14orf93 60686 +C14orf119 55017 +C14orf132 56967 +C14orf178 283579 +C14orf180 400258 +C15orf32 145858 +C15orf39 56905 +C15orf40 123207 +C15orf48 84419 +C15orf61 145853 +C15orf62 643338 +C16orf46 123775 +C16orf46-DT 128266836 +C16orf54 283897 +C16orf74 404550 +C16orf78 123970 +C16orf82 162083 +C16orf86 388284 +C16orf87 388272 +C16orf89 146556 +C16orf90 646174 +C16orf92 146378 +C16orf95 100506581 +C16orf95-DT 101928659 +C16orf96 342346 +C17orf49 124944 +C17orf50 146853 +C17orf58 284018 +C17orf67 339210 +C17orf75 64149 +C17orf78 284099 +C17orf80 55028 +C17orf99 100141515 +C17orf100 388327 +C17orf107 100130311 +C17orf113 110806298 +C17orf114 119139905 +C18orf15 147276 +C18orf21 83608 +C18orf32 497661 +C18orf54 162681 +C18orf63 644041 +C19orf12 83636 +C19orf18 147685 +C19orf25 148223 +C19orf33 64073 +C19orf38 255809 +C19orf44 84167 +C19orf47 126526 +C19orf48P 84798 +C19orf53 28974 +C19orf67 646457 +C19orf73 55150 +C19orf81 342918 +C19orf84 147646 +C19orf85 111064650 +C20orf96 140680 +C20orf141 128653 +C20orf144 128864 +C20orf173 140873 +C20orf181 100128998 +C20orf202 400831 +C20orf203 284805 +C20orf204 284739 +C21orf58 54058 +C21orf62 56245 +C21orf62-AS1 54067 +C21orf91 54149 +C21orf91-OT1 246312 +C21orf140 101928147 +C22orf15 150248 +C22orf23 84645 +C22orf31 25770 +C22orf39 128977 +C22orf42 150297 +C22orf46P 79640 +CA1 759 +CA2 760 +CA3 761 +CA3-AS1 100996348 +CA4 762 +CA5A 763 +CA5AP1 764 +CA5B 11238 +CA5BP1 340591 +CA6 765 +CA7 766 +CA8 767 +CA9 768 +CA10 56934 +CA11 770 +CA12 771 +CA13 377677 +CA14 23632 +CA15P1 100996435 +CA15P2 440795 +CA15P3 100996556 +CAAP1 79886 +CAB39 51719 +CAB39L 81617 +CAB39P1 106481732 +CABCOCO1 219621 +CABIN1 23523 +CABLES1 91768 +CABLES2 81928 +CABP1 9478 +CABP1-DT 101928300 +CABP2 51475 +CABP4 57010 +CABP5 56344 +CABP7 164633 +CABP7-DT 122149303 +CABS1 85438 +CABYR 26256 +CABYRP1 266954 +CACFD1 11094 +CACHD1 57685 +CACNA1A 773 +CACNA1B 774 +CACNA1B-AS1 105376331 +CACNA1C 775 +CACNA1C-AS1 100652846 +CACNA1C-AS2 100874235 +CACNA1C-AS3 106478964 +CACNA1C-AS4 100874234 +CACNA1C-IT1 107984540 +CACNA1C-IT3 100874370 +CACNA1D 776 +CACNA1E 777 +CACNA1F 778 +CACNA1G 8913 +CACNA1G-AS1 253962 +CACNA1H 8912 +CACNA1I 8911 +CACNA1S 779 +CACNA2D1 781 +CACNA2D1-AS1 101927356 +CACNA2D2 9254 +CACNA2D3 55799 +CACNA2D3-AS1 100874237 +CACNA2D4 93589 +CACNB1 782 +CACNB2 783 +CACNB3 784 +CACNB4 785 +CACNG1 786 +CACNG2 10369 +CACNG2-DT 105373021 +CACNG3 10368 +CACNG4 27092 +CACNG5 27091 +CACNG6 59285 +CACNG7 59284 +CACNG8 59283 +CACTIN 58509 +CACTIN-AS1 404665 +CACUL1 143384 +CACYBP 27101 +CACYBPP1 100420043 +CACYBPP2 644877 +CACYBPP3 106480809 +CAD 790 +CADM1 23705 +CADM1-AS1 105369507 +CADM2 253559 +CADM2-AS1 100874038 +CADM2-AS2 100874037 +CADM3 57863 +CADM3-AS1 100131825 +CADM4 199731 +CADPS 8618 +CADPS2 93664 +CAGE1 285782 +CAHM 100526820 +CALB1 793 +CALB2 794 +CALCA 796 +CALCB 797 +CALCOCO1 57658 +CALCOCO2 10241 +CALCP 798 +CALCR 799 +CALCRL 10203 +CALCRL-AS1 105373786 +CALD1 800 +CALHM1 255022 +CALHM2 51063 +CALHM3 119395 +CALHM4 221301 +CALHM5 254228 +CALHM6 441168 +CALHM6-AS1 116435295 +CALM1 801 +CALM1P1 802 +CALM1P2 804 +CALM2 805 +CALM2P1 100128390 +CALM2P2 806 +CALM2P3 807 +CALM2P4 643193 +CALM3 808 +CALML3 810 +CALML3-AS1 100132159 +CALML4 91860 +CALML5 51806 +CALML6 163688 +CALN1 83698 +CALR 811 +CALR3 125972 +CALR4P 441884 +CALU 813 +CALY 50632 +CAMK1 8536 +CAMK1D 57118 +CAMK1G 57172 +CAMK2A 815 +CAMK2B 816 +CAMK2D 817 +CAMK2G 818 +CAMK2G-AS1 123706515 +CAMK2N1 55450 +CAMK2N2 94032 +CAMK4 814 +CAMKK1 84254 +CAMKK2 10645 +CAMKMT 79823 +CAMKV 79012 +CAMLG 819 +CAMP 820 +CAMSAP1 157922 +CAMSAP1-DT 107987141 +CAMSAP2 23271 +CAMSAP3 57662 +CAMTA1 23261 +CAMTA1-AS1 101928836 +CAMTA1-AS2 102725193 +CAMTA1-AS3 127138864 +CAMTA1-DT 110841581 +CAMTA1-IT1 100874340 +CAMTA2 23125 +CAMTA2-AS1 101927979 +CAND1 55832 +CAND2 23066 +CANT1 124583 +CANX 821 +CAP1 10487 +CAP1P1 401076 +CAP1P2 399748 +CAP2 10486 +CAP2P1 353163 +CAPG 822 +CAPN1 823 +CAPN1-AS1 728975 +CAPN2 824 +CAPN3 825 +CAPN5 726 +CAPN6 827 +CAPN7 23473 +CAPN8 388743 +CAPN9 10753 +CAPN10 11132 +CAPN10-DT 101752400 +CAPN11 11131 +CAPN12 147968 +CAPN13 92291 +CAPN14 440854 +CAPN15 6650 +CAPNS1 826 +CAPNS1P1 391053 +CAPNS2 84290 +CAPRIN1 4076 +CAPRIN2 65981 +CAPS 828 +CAPS2 84698 +CAPS2-AS1 107983975 +CAPSL 133690 +CAPSL-DT 100506406 +CAPZA1 829 +CAPZA1P1 53338 +CAPZA1P2 100422294 +CAPZA1P3 645938 +CAPZA1P4 100130704 +CAPZA1P5 100422324 +CAPZA2 830 +CAPZA3 93661 +CAPZB 832 +CAPZBP1 644265 +CARD6 84674 +CARD8 22900 +CARD8-AS1 100505812 +CARD9 64170 +CARD10 29775 +CARD11 84433 +CARD11-AS1 101927256 +CARD14 79092 +CARD16 114769 +CARD17P 440068 +CARD18 59082 +CARD19 84270 +CARF 79800 +CARHSP1 23589 +CARHSP1-DT 119545623 +CARM1 10498 +CARM1P1 100130873 +CARMAL 102724566 +CARMIL1 55604 +CARMIL2 146206 +CARMIL2P1 127460874 +CARMIL3 90668 +CARMN 728264 +CARNMT1 138199 +CARNMT1-AS1 101927380 +CARNS1 57571 +CARS1 833 +CARS1-AS1 100852407 +CARS1P1 100420042 +CARS1P2 106481707 +CARS2 79587 +CARTPT 9607 +CASC2 255082 +CASC3 22794 +CASC6 101929083 +CASC8 727677 +CASC9 101805492 +CASC11 100270680 +CASC15 401237 +CASC16 643714 +CASC17 101928165 +CASC18 101929110 +CASC19 103021165 +CASC20 101929244 +CASC21 103021164 +CASC22 283854 +CASC23 103581031 +CASD1 64921 +CASK 8573 +CASK-AS1 100873928 +CASKIN1 57524 +CASKIN2 57513 +CASKP1 10029 +CASP1 834 +CASP1P1 100874457 +CASP1P2 440067 +CASP1P3 100422634 +CASP2 835 +CASP3 836 +CASP3P1 100131616 +CASP4 837 +CASP4LP 643733 +CASP5 838 +CASP6 839 +CASP7 840 +CASP8 841 +CASP8AP2 9994 +CASP9 842 +CASP10 843 +CASP12 100506742 +CASP14 23581 +CASP16P 197350 +CASQ1 844 +CASQ2 845 +CASR 846 +CASS4 57091 +CAST 831 +CASTOR1 652968 +CASTOR2 729438 +CASTOR3P 352954 +CASZ1 54897 +CAT 847 +CATIP 375307 +CATIP-AS1 101928513 +CATIP-AS2 103689911 +CATR1 856 +CATSPER1 117144 +CATSPER2 117155 +CATSPER2P1 440278 +CATSPER2P2 100127986 +CATSPER3 347732 +CATSPER4 378807 +CATSPERB 79820 +CATSPERD 257062 +CATSPERE 257044 +CATSPERG 57828 +CATSPERZ 25858 +CAV1 857 +CAV2 858 +CAV3 859 +CAVIN1 284119 +CAVIN2 8436 +CAVIN2-AS1 105373813 +CAVIN3 112464 +CAVIN4 347273 +CBARP 255057 +CBARP-DT 118827813 +CBFA2T2 9139 +CBFA2T3 863 +CBFB 865 +CBL 867 +CBLB 868 +CBLC 23624 +CBLIF 2694 +CBLL1 79872 +CBLL1-AS1 101927974 +CBLL1P1 100128122 +CBLL2 158506 +CBLN1 869 +CBLN2 147381 +CBLN3 643866 +CBLN4 140689 +CBR1 873 +CBR1-AS1 100133286 +CBR3 874 +CBR3-AS1 100506428 +CBR4 84869 +CBR4-DT 121009646 +CBS 875 +CBSLR 124904470 +CBX1 10951 +CBX1P1 645251 +CBX1P2 100147811 +CBX1P3 100128723 +CBX1P4 100130461 +CBX1P5 100133259 +CBX2 84733 +CBX3 11335 +CBX3P1 159770 +CBX3P2 645158 +CBX3P3 100421861 +CBX3P4 100873792 +CBX3P5 100421943 +CBX3P6 642721 +CBX3P7 100421975 +CBX3P8 100286965 +CBX3P9 644101 +CBX3P10 107986032 +CBX4 8535 +CBX5 23468 +CBX5P1 100151661 +CBX6 23466 +CBX7 23492 +CBX8 57332 +CBY1 25776 +CBY1P1 100131562 +CBY2 220082 +CBY3 646019 +CC2D1A 54862 +CC2D1B 200014 +CC2D2A 57545 +CC2D2B 387707 +CCAR1 55749 +CCAR2 57805 +CCAT1 100507056 +CCAT2 101805488 +CCBE1 147372 +CCDC3 83643 +CCDC6 8030 +CCDC7 79741 +CCDC8 83987 +CCDC9 26093 +CCDC9B 388115 +CCDC12 151903 +CCDC12P1 100131852 +CCDC13 152206 +CCDC13-AS1 100874114 +CCDC13-AS2 729083 +CCDC14 64770 +CCDC15 80071 +CCDC15-DT 105369547 +CCDC17 149483 +CCDC18 343099 +CCDC18-AS1 100131564 +CCDC22 28952 +CCDC24 149473 +CCDC25 55246 +CCDC26 137196 +CCDC27 148870 +CCDC28A 25901 +CCDC28A-AS1 100507462 +CCDC28B 79140 +CCDC30 728621 +CCDC32 90416 +CCDC33 80125 +CCDC34 91057 +CCDC34P1 100288584 +CCDC38 120935 +CCDC39 339829 +CCDC39-AS1 100874112 +CCDC40 55036 +CCDC42 146849 +CCDC43 124808 +CCDC47 57003 +CCDC50 152137 +CCDC51 79714 +CCDC54 84692 +CCDC54-AS1 101929579 +CCDC57 284001 +CCDC59 29080 +CCDC60 160777 +CCDC61 729440 +CCDC62 84660 +CCDC63 160762 +CCDC65 85478 +CCDC66 285331 +CCDC68 80323 +CCDC69 26112 +CCDC70 83446 +CCDC71 64925 +CCDC71L 168455 +CCDC73 493860 +CCDC74A 90557 +CCDC74B 91409 +CCDC74BP1 100996538 +CCDC77 84318 +CCDC78 124093 +CCDC80 151887 +CCDC81 60494 +CCDC82 79780 +CCDC83 220047 +CCDC85A 114800 +CCDC85B 11007 +CCDC85C 317762 +CCDC86 79080 +CCDC86-AS1 127138859 +CCDC87 55231 +CCDC88A 55704 +CCDC88B 283234 +CCDC88C 440193 +CCDC88C-DT 105370625 +CCDC89 220388 +CCDC90B 60492 +CCDC90B-AS1 120883614 +CCDC91 55297 +CCDC92 80212 +CCDC92B 101928991 +CCDC93 54520 +CCDC96 257236 +CCDC97 90324 +CCDC102A 92922 +CCDC102B 79839 +CCDC103 388389 +CCDC106 29903 +CCDC107 203260 +CCDC110 256309 +CCDC112 153733 +CCDC113 29070 +CCDC115 84317 +CCDC116 164592 +CCDC117 150275 +CCDC120 90060 +CCDC121 79635 +CCDC121P1 643888 +CCDC122 160857 +CCDC124 115098 +CCDC125 202243 +CCDC126 90693 +CCDC127 133957 +CCDC134 79879 +CCDC136 64753 +CCDC137 339230 +CCDC137P1 642802 +CCDC137P2 127379757 +CCDC138 165055 +CCDC140 151278 +CCDC141 285025 +CCDC142 84865 +CCDC144A 9720 +CCDC144BP 284047 +CCDC144CP 348254 +CCDC144NL 339184 +CCDC144NL-AS1 440416 +CCDC146 57639 +CCDC148 130940 +CCDC148-AS1 554201 +CCDC149 91050 +CCDC150 284992 +CCDC150P1 100420678 +CCDC152 100129792 +CCDC153 283152 +CCDC154 645811 +CCDC157 550631 +CCDC158 339965 +CCDC159 126075 +CCDC160 347475 +CCDC162P 221262 +CCDC163 126661 +CCDC166 100130274 +CCDC167 154467 +CCDC168 643677 +CCDC169 728591 +CCDC169-SOHLH2 100526761 +CCDC170 80129 +CCDC171 203238 +CCDC172 374355 +CCDC174 51244 +CCDC175 729665 +CCDC177 56936 +CCDC178 374864 +CCDC179 100500938 +CCDC180 100499483 +CCDC181 57821 +CCDC182 101927581 +CCDC183 84960 +CCDC183-AS1 100131193 +CCDC184 387856 +CCDC185 164127 +CCDC186 55088 +CCDC187 399693 +CCDC188 388849 +CCDC188BP 107985555 +CCDC190 339512 +CCDC191 57577 +CCDC192 728586 +CCDC194 110806280 +CCDC195 110806281 +CCDC196 440184 +CCDC197 256369 +CCDC198 55195 +CCDC200 100874261 +CCDC201 114515518 +CCDST 112268240 +CCEPR 105682749 +CCER1 196477 +CCER2 643669 +CCHCR1 54535 +CCIN 881 +CCK 885 +CCKAR 886 +CCKBR 887 +CCL1 6346 +CCL2 6347 +CCL3 6348 +CCL3-AS1 102724850 +CCL3L1 6349 +CCL3L3 414062 +CCL3P1 390788 +CCL4 6351 +CCL4L1 388372 +CCL4L2 9560 +CCL5 6352 +CCL7 6354 +CCL8 6355 +CCL11 6356 +CCL13 6357 +CCL14 6358 +CCL15 6359 +CCL15-CCL14 348249 +CCL16 6360 +CCL17 6361 +CCL18 6362 +CCL19 6363 +CCL20 6364 +CCL21 6366 +CCL22 6367 +CCL23 6368 +CCL24 6369 +CCL25 6370 +CCL26 10344 +CCL27 10850 +CCL28 56477 +CCM2 83605 +CCM2L 140706 +CCN1 3491 +CCN2 1490 +CCN2-AS1 122152366 +CCN3 4856 +CCN4 8840 +CCN5 8839 +CCN6 8838 +CCNA1 8900 +CCNA2 890 +CCNB1 891 +CCNB1IP1 57820 +CCNB1IP1P1 728887 +CCNB1IP1P2 100505892 +CCNB1IP1P3 100128456 +CCNB2 9133 +CCNB2P1 100132073 +CCNB3 85417 +CCNB3P1 100131678 +CCNC 892 +CCND1 595 +CCND2 894 +CCND2-AS1 103752584 +CCND2P1 895 +CCND3 896 +CCND3P1 897 +CCND3P2 106480307 +CCNDBP1 23582 +CCNE1 898 +CCNE2 9134 +CCNF 899 +CCNG1 900 +CCNG1P1 100130820 +CCNG2 901 +CCNG2P1 100128681 +CCNH 902 +CCNHP1 100128118 +CCNI 10983 +CCNI2 645121 +CCNJ 54619 +CCNJL 79616 +CCNJP1 100128459 +CCNJP2 100418724 +CCNK 8812 +CCNL1 57018 +CCNL2 81669 +CCNL2P1 100418743 +CCNO 10309 +CCNO-DT 121009647 +CCNP 79935 +CCNQ 92002 +CCNQP1 339521 +CCNQP2 100421487 +CCNQP3 100421566 +CCNT1 904 +CCNT2 905 +CCNT2-AS1 100129961 +CCNT2P1 100418763 +CCNY 219771 +CCNY-AS1 118732302 +CCNYL1 151195 +CCNYL1B 102724485 +CCNYL2 414194 +CCNYL3 102724928 +CCNYL4 100129055 +CCNYL5 100130724 +CCNYL6 641367 +CCNYL7 100419017 +CCP110 9738 +CCPG1 9236 +CCR1 1230 +CCR2 729230 +CCR3 1232 +CCR4 1233 +CCR5 1234 +CCR5AS 102724297 +CCR6 1235 +CCR7 1236 +CCR8 1237 +CCR9 10803 +CCR10 2826 +CCR12P 100133168 +CCRL2 9034 +CCS 9973 +CCSAP 126731 +CCSER1 401145 +CCSER2 54462 +CCSER2P1 100127962 +CCT2 10576 +CCT3 7203 +CCT3P1 646440 +CCT4 10575 +CCT4P1 650172 +CCT4P2 100131638 +CCT5 22948 +CCT5P1 402226 +CCT5P2 390415 +CCT6A 908 +CCT6B 10693 +CCT6P1 643253 +CCT6P2 391739 +CCT6P3 643180 +CCT6P4 100130481 +CCT6P5 100463286 +CCT7 10574 +CCT7P1 442267 +CCT7P2 100288772 +CCT8 10694 +CCT8L1P 155100 +CCT8L2 150160 +CCT8P1 644131 +CCZ1 51622 +CCZ1B 221960 +CCZ1P1 110440226 +CD1A 909 +CD1B 910 +CD1C 911 +CD1D 912 +CD1E 913 +CD2 914 +CD2AP 23607 +CD2AP-DT 118732299 +CD2BP2 10421 +CD2BP2-DT 101928707 +CD3D 915 +CD3E 916 +CD3G 917 +CD4 920 +CD5 921 +CD5L 922 +CD6 923 +CD7 924 +CD8A 925 +CD8B 926 +CD8B2 927 +CD9 928 +CD14 929 +CD19 930 +CD22 933 +CD24 100133941 +CD24P1 935 +CD24P2 936 +CD24P3 937 +CD24P4 938 +CD24P5 127379728 +CD27 939 +CD27-AS1 678655 +CD28 940 +CD33 945 +CD34 947 +CD36 948 +CD37 951 +CD38 952 +CD40 958 +CD40LG 959 +CD44 960 +CD44-AS1 109729172 +CD44-DT 100507144 +CD46 4179 +CD46P1 4182 +CD47 961 +CD48 962 +CD52 1043 +CD53 963 +CD55 1604 +CD58 965 +CD59 966 +CD63 967 +CD63-AS1 105369779 +CD68 968 +CD69 969 +CD70 970 +CD72 971 +CD74 972 +CD79A 973 +CD79B 974 +CD80 941 +CD81 975 +CD81-AS1 101927682 +CD82 3732 +CD82-AS1 126568847 +CD83 9308 +CD83P1 100128240 +CD84 8832 +CD84P1 118568807 +CD86 942 +CD93 22918 +CD96 10225 +CD99 4267 +CD99L2 83692 +CD99P1 401577 +CD101 9398 +CD101-AS1 101929099 +CD109 135228 +CD109-AS1 101928489 +CD151 977 +CD160 11126 +CD163 9332 +CD163L1 283316 +CD164 8763 +CD164L2 388611 +CD177 57126 +CD177P1 653579 +CD180 4064 +CD200 4345 +CD200LP 125775242 +CD200R1 131450 +CD200R1L 344807 +CD200R1L-AS1 100129297 +CD200R1P1 127379738 +CD207 50489 +CD209 30835 +CD226 10666 +CD244 51744 +CD247 919 +CD248 57124 +CD274 29126 +CD276 80381 +CD300A 11314 +CD300C 10871 +CD300E 342510 +CD300H 100130520 +CD300LB 124599 +CD300LD 100131439 +CD300LD-AS1 146723 +CD300LF 146722 +CD300LG 146894 +CD302 9936 +CD320 51293 +CDA 978 +CDADC1 81602 +CDAN1 146059 +CDC5L 988 +CDC6 990 +CDC7 8317 +CDC14A 8556 +CDC14B 8555 +CDC14C 168448 +CDC16 8881 +CDC20 991 +CDC20-DT 105378687 +CDC20B 166979 +CDC20P1 157956 +CDC23 8697 +CDC25A 993 +CDC25B 994 +CDC25C 995 +CDC26 246184 +CDC26P1 729948 +CDC27 996 +CDC27P1 647696 +CDC27P2 100130277 +CDC27P3 102723416 +CDC27P4 102723498 +CDC27P5 647654 +CDC27P6 649620 +CDC27P7 102723711 +CDC27P8 100288806 +CDC27P9 102723570 +CDC27P10 102723584 +CDC27P11 102723603 +CDC34 997 +CDC37 11140 +CDC37L1 55664 +CDC37L1-DT 101929351 +CDC37P1 390688 +CDC37P2 647015 +CDC40 51362 +CDC42 998 +CDC42-AS1 112268223 +CDC42-IT1 100874292 +CDC42BPA 8476 +CDC42BPB 9578 +CDC42BPG 55561 +CDC42EP1 11135 +CDC42EP2 10435 +CDC42EP3 10602 +CDC42EP3-AS1 127379718 +CDC42EP3P1 100128845 +CDC42EP4 23580 +CDC42EP5 148170 +CDC42P1 170503 +CDC42P2 643336 +CDC42P3 100128627 +CDC42P4 100131440 +CDC42P5 100507354 +CDC42P6 643751 +CDC42P7 101409262 +CDC42SE1 56882 +CDC42SE2 56990 +CDC45 8318 +CDC73 79577 +CDC123 8872 +CDCA2 157313 +CDCA3 83461 +CDCA3P1 125775241 +CDCA4 55038 +CDCA4P1 100420502 +CDCA4P2 100129348 +CDCA4P3 100420558 +CDCA4P4 100188945 +CDCA5 113130 +CDCA7 83879 +CDCA7L 55536 +CDCA8 55143 +CDCP1 64866 +CDCP2 200008 +CDH1 999 +CDH2 1000 +CDH3 1001 +CDH3-AS1 123706523 +CDH4 1002 +CDH5 1003 +CDH6 1004 +CDH7 1005 +CDH8 1006 +CDH8-AS1 119863871 +CDH9 1007 +CDH10 1008 +CDH11 1009 +CDH12 1010 +CDH12P1 100093625 +CDH12P2 1011 +CDH12P3 100093624 +CDH12P4 100093626 +CDH13 1012 +CDH13-AS1 105371368 +CDH13-AS2 102724163 +CDH15 1013 +CDH16 1014 +CDH17 1015 +CDH18 1016 +CDH18-AS1 102725105 +CDH19 28513 +CDH20 28316 +CDH22 64405 +CDH23 64072 +CDH23-AS1 102723377 +CDH24 64403 +CDH26 60437 +CDHR1 92211 +CDHR2 54825 +CDHR3 222256 +CDHR4 389118 +CDHR5 53841 +CDHR17P 127566420 +CDHR18P 100130345 +CDIN1 84529 +CDIP1 29965 +CDIPT 10423 +CDIPTOSP 440356 +CDK1 983 +CDK2 1017 +CDK2AP1 8099 +CDK2AP1P1 107986120 +CDK2AP2 10263 +CDK2AP2P1 100289027 +CDK2AP2P2 107133486 +CDK2AP2P3 401525 +CDK3 1018 +CDK4 1019 +CDK4P1 359941 +CDK5 1020 +CDK5P1 392265 +CDK5R1 8851 +CDK5R2 8941 +CDK5R2-AS1 121847983 +CDK5RAP1 51654 +CDK5RAP2 55755 +CDK5RAP3 80279 +CDK6 1021 +CDK6-AS1 101927497 +CDK7 1022 +CDK7P1 220786 +CDK8 1024 +CDK8P1 100419916 +CDK8P2 100287419 +CDK9 1025 +CDK10 8558 +CDK11A 728642 +CDK11B 984 +CDK12 51755 +CDK13 8621 +CDK13-DT 112267983 +CDK14 5218 +CDK15 65061 +CDK16 5127 +CDK17 5128 +CDK18 5129 +CDK19 23097 +CDK20 23552 +CDKAL1 54901 +CDKL1 8814 +CDKL2 8999 +CDKL3 51265 +CDKL4 344387 +CDKL5 6792 +CDKN1A 1026 +CDKN1A-AS1 100861512 +CDKN1B 1027 +CDKN1C 1028 +CDKN2A 1029 +CDKN2A-DT 51198 +CDKN2AIP 55602 +CDKN2AIPNL 91368 +CDKN2AIPNLP1 391169 +CDKN2AIPNLP2 100128579 +CDKN2AIPNLP3 100874397 +CDKN2B 1030 +CDKN2B-AS1 100048912 +CDKN2C 1031 +CDKN2D 1032 +CDKN3 1033 +CDNF 441549 +CDO1 1036 +CDON 50937 +CDPF1 150383 +CDPF1P1 100128027 +CDR1 1038 +CDR2 1039 +CDR2-DT 440346 +CDR2L 30850 +CDRT2 94144 +CDRT3 94145 +CDRT4 284040 +CDRT5 94148 +CDRT7 94150 +CDRT8 94151 +CDRT10 94153 +CDRT11 94154 +CDRT12 94155 +CDRT13 94156 +CDRT15 146822 +CDRT15L2 256223 +CDRT15P1 94158 +CDRT15P2 644694 +CDRT15P3 408029 +CDRT15P4 117314529 +CDRT15P5 100131855 +CDRT15P6 100420778 +CDRT15P7 100420788 +CDRT15P8 100420925 +CDRT15P9 105372731 +CDRT15P10 100420811 +CDRT15P11 100127912 +CDRT15P12 100420789 +CDRT15P13 642669 +CDRT15P14 100420784 +CDS1 1040 +CDS2 8760 +CDSN 1041 +CDT1 81620 +CDV3 55573 +CDV3P1 100129736 +CDX1 1044 +CDX2 1045 +CDX4 1046 +CDY1 9085 +CDY1B 253175 +CDY2A 9426 +CDY2B 203611 +CDY3P 286556 +CDY4P 386729 +CDY5P 378008 +CDY6P 386730 +CDY7P 386731 +CDY8P 386732 +CDY9P 378011 +CDY10P 140043 +CDY11P 378014 +CDY12P 386734 +CDY13P 386735 +CDY14P 386736 +CDY15P 386737 +CDY16P 386738 +CDY17P 386739 +CDY18P 386740 +CDY19P 386741 +CDY20P 386742 +CDY21P 386743 +CDY22P 386744 +CDY23P 386745 +CDYL 9425 +CDYL-AS1 101927913 +CDYL2 124359 +CDYLP1 100132260 +CEACAM1 634 +CEACAM3 1084 +CEACAM4 1089 +CEACAM5 1048 +CEACAM6 4680 +CEACAM7 1087 +CEACAM8 1088 +CEACAM16 388551 +CEACAM16-AS1 107985305 +CEACAM18 729767 +CEACAM19 56971 +CEACAM20 125931 +CEACAM21 90273 +CEACAM22P 388550 +CEACAMP1 1090 +CEACAMP2 1091 +CEACAMP3 1092 +CEACAMP4 1093 +CEACAMP5 1085 +CEACAMP6 1094 +CEACAMP7 1095 +CEACAMP8 1096 +CEACAMP9 1097 +CEACAMP10 1098 +CEACAMP11 1086 +CEBPA 1050 +CEBPA-DT 80054 +CEBPB 1051 +CEBPB-AS1 101927559 +CEBPD 1052 +CEBPE 1053 +CEBPG 1054 +CEBPZ 10153 +CEBPZOS 100505876 +CECR 1055 +CECR2 27443 +CECR3 27442 +CECR7 100130418 +CECR9 30847 +CEDORA 124903732 +CEL 1056 +CELA1 1990 +CELA2A 63036 +CELA2B 51032 +CELA3A 10136 +CELA3B 23436 +CELF1 10658 +CELF2 10659 +CELF2-AS1 414196 +CELF2-AS2 439950 +CELF2-DT 101928322 +CELF3 11189 +CELF4 56853 +CELF5 60680 +CELF6 60677 +CELP 1057 +CELSR1 9620 +CELSR1P1 123466216 +CELSR2 1952 +CELSR3 1951 +CEMIP 57214 +CEMIP2 23670 +CEMP1 752014 +CENATAC 338657 +CENATAC-DT 107984396 +CEND1 51286 +CEND1P1 122631 +CEND1P2 724034 +CENPA 1058 +CENPB 1059 +CENPBD1P 92806 +CENPBD2P 65996 +CENPC 1060 +CENPCP1 1061 +CENPE 1062 +CENPF 1063 +CENPH 64946 +CENPI 2491 +CENPIP1 100419337 +CENPJ 55835 +CENPK 64105 +CENPL 91687 +CENPM 79019 +CENPN 55839 +CENPN-AS1 107984858 +CENPNP1 100132498 +CENPNP2 100133059 +CENPO 79172 +CENPP 401541 +CENPPP1 127379695 +CENPQ 55166 +CENPS 378708 +CENPS-CORT 100526739 +CENPT 80152 +CENPU 79682 +CENPUP1 100130384 +CENPUP2 100419930 +CENPV 201161 +CENPVL1 389857 +CENPVL2 441495 +CENPVL3 347549 +CENPW 387103 +CENPX 201254 +CEP15 57415 +CEP19 84984 +CEP19P1 642692 +CEP20 123811 +CEP41 95681 +CEP43 11116 +CEP44 80817 +CEP55 55165 +CEP57 9702 +CEP57L1 285753 +CEP57L1P1 221017 +CEP63 80254 +CEP68 23177 +CEP70 80321 +CEP72 55722 +CEP72-DT 100996325 +CEP76 79959 +CEP78 84131 +CEP83 51134 +CEP83-DT 144486 +CEP85 64793 +CEP85L 387119 +CEP89 84902 +CEP95 90799 +CEP97 79598 +CEP104 9731 +CEP112 201134 +CEP120 153241 +CEP126 57562 +CEP128 145508 +CEP131 22994 +CEP135 9662 +CEP152 22995 +CEP162 22832 +CEP164 22897 +CEP164P1 100289237 +CEP170 9859 +CEP170B 283638 +CEP170P1 645455 +CEP192 55125 +CEP192-DT 119139898 +CEP192P1 643201 +CEP250 11190 +CEP250-AS1 102725201 +CEP290 80184 +CEP295 85459 +CEP295NL 100653515 +CEP350 9857 +CEPT1 10390 +CER1 9350 +CERCAM 51148 +CERK 64781 +CERKL 375298 +CERNA1 100129973 +CERNA2 642934 +CERNA3 105375847 +CEROX1 115804232 +CERS1 10715 +CERS2 29956 +CERS3 204219 +CERS3-AS1 102723320 +CERS4 79603 +CERS5 91012 +CERS6 253782 +CERS6-AS1 100861402 +CERT1 10087 +CES1 1066 +CES1P1 51716 +CES1P2 390732 +CES2 8824 +CES3 23491 +CES4A 283848 +CES5A 221223 +CES5AP1 649264 +CETN1 1068 +CETN2 1069 +CETN3 1070 +CETN4P 729338 +CETP 1071 +CFAP20 29105 +CFAP20DC 200844 +CFAP20DC-AS1 101929238 +CFAP20DC-DT 105377110 +CFAP36 112942 +CFAP43 80217 +CFAP44 55779 +CFAP44-AS1 100874029 +CFAP45 25790 +CFAP46 54777 +CFAP47 286464 +CFAP52 146845 +CFAP53 220136 +CFAP53P1 100129040 +CFAP54 144535 +CFAP57 149465 +CFAP58 159686 +CFAP58-DT 100505869 +CFAP61 26074 +CFAP61-AS1 101929575 +CFAP65 255101 +CFAP68 64776 +CFAP69 79846 +CFAP69P1 100130044 +CFAP70 118491 +CFAP73 387885 +CFAP74 85452 +CFAP77 389799 +CFAP90 134121 +CFAP91 89876 +CFAP92 57501 +CFAP95 138255 +CFAP95-DT 494558 +CFAP96 441054 +CFAP97 57587 +CFAP97D1 284067 +CFAP97D2 101929355 +CFAP97P1 100418722 +CFAP99 402160 +CFAP100 348807 +CFAP100-DT 100506907 +CFAP107 93190 +CFAP119 90835 +CFAP126 257177 +CFAP141 388701 +CFAP144 440585 +CFAP157 286207 +CFAP161 161502 +CFAP206 154313 +CFAP210 129881 +CFAP221 200373 +CFAP251 144406 +CFAP276 127003 +CFAP298 56683 +CFAP298-TCP10L 110091775 +CFAP299 255119 +CFAP300 85016 +CFAP410 755 +CFAP418 157657 +CFAP418-AS1 100616530 +CFB 629 +CFC1 55997 +CFC1B 653275 +CFD 1675 +CFDP1 10428 +CFH 3075 +CFHR1 3078 +CFHR2 3080 +CFHR3 10878 +CFHR4 10877 +CFHR5 81494 +CFI 3426 +CFL1 1072 +CFL1P1 142913 +CFL1P2 391039 +CFL1P3 100131874 +CFL1P4 645980 +CFL1P5 1074 +CFL1P6 390996 +CFL1P7 100505919 +CFL1P8 100873812 +CFL2 1073 +CFLAR 8837 +CFLAR-AS1 65072 +CFP 5199 +CFTR 1080 +CFTR-AS1 111082987 +CFTRP1 140871 +CFTRP2 107080633 +CFTRP3 106481718 +CGA 1081 +CGAS 115004 +CGB1 114335 +CGB2 114336 +CGB3 1082 +CGB5 93659 +CGB7 94027 +CGB8 94115 +CGGBP1 8545 +CGN 57530 +CGNL1 84952 +CGREF1 10669 +CGRRF1 10668 +CH25H 9023 +CHAC1 79094 +CHAC2 494143 +CHAD 1101 +CHADL 150356 +CHAER1 105377667 +CHAF1A 10036 +CHAF1B 8208 +CHAMP1 283489 +CHASERR 100507217 +CHAT 1103 +CHCHD1 118487 +CHCHD2 51142 +CHCHD2P1 100874506 +CHCHD2P2 728324 +CHCHD2P3 100128110 +CHCHD2P4 100874507 +CHCHD2P5 100874508 +CHCHD2P6 645317 +CHCHD2P7 100874509 +CHCHD2P8 646630 +CHCHD2P9 645345 +CHCHD2P10 392221 +CHCHD2P11 101060040 +CHCHD3 54927 +CHCHD3P1 338591 +CHCHD3P2 100422354 +CHCHD3P3 646572 +CHCHD4 131474 +CHCHD4P1 645862 +CHCHD4P2 100128657 +CHCHD4P3 106480792 +CHCHD4P4 728143 +CHCHD4P5 106479039 +CHCHD5 84269 +CHCHD6 84303 +CHCHD7 79145 +CHCHD10 400916 +CHCT1 124773 +CHD1 1105 +CHD1-DT 102724810 +CHD1L 9557 +CHD2 1106 +CHD3 1107 +CHD4 1108 +CHD5 26038 +CHD6 84181 +CHD7 55636 +CHD8 57680 +CHD9 80205 +CHD9NB 105371267 +CHDH 55349 +CHEK1 1111 +CHEK2 11200 +CHEK2P1 100133012 +CHEK2P2 646096 +CHEK2P3 100873791 +CHEK2P4 106479021 +CHEK2P5 106479022 +CHEK2P6 101929031 +CHEK2P7 121847986 +CHERP 10523 +CHFR 55743 +CHFR-DT 101928530 +CHGA 1113 +CHGB 1114 +CHI3L1 1116 +CHI3L2 1117 +CHIA 27159 +CHIAP1 100420342 +CHIAP2 149620 +CHIAP3 100996315 +CHIC1 53344 +CHIC2 26511 +CHID1 66005 +CHILL1 +CHIT1 1118 +CHKA 1119 +CHKA-DT 105369362 +CHKB 1120 +CHKB-CPT1B 386593 +CHKB-DT 100144603 +CHL1 10752 +CHL1-AS1 101927193 +CHL1-AS2 101927174 +CHM 1121 +CHML 1122 +CHMP1A 5119 +CHMP1AP1 646597 +CHMP1B 57132 +CHMP1B-AS1 109729129 +CHMP1B2P 101060146 +CHMP2A 27243 +CHMP2B 25978 +CHMP3 51652 +CHMP3-AS1 105374845 +CHMP4A 29082 +CHMP4AP1 100130209 +CHMP4B 128866 +CHMP4BP1 100307126 +CHMP4C 92421 +CHMP5 51510 +CHMP5P1 100420317 +CHMP6 79643 +CHMP7 91782 +CHN1 1123 +CHN2 1124 +CHN2-AS1 102724484 +CHODL 140578 +CHODL-AS1 54075 +CHORDC1 26973 +CHORDC1P1 100128048 +CHORDC1P3 100133261 +CHORDC1P4 727896 +CHORDC1P5 391048 +CHORDC2P 317775 +CHP1 11261 +CHP1P1 728549 +CHP1P2 729603 +CHP1P3 117369447 +CHP2 63928 +CHPF 79586 +CHPF2 54480 +CHPT1 56994 +CHRAC1 54108 +CHRD 8646 +CHRDL1 91851 +CHRDL2 25884 +CHRFAM7A 89832 +CHRFAM7AP1 359999 +CHRFAM7AP2 359998 +CHRM1 1128 +CHRM2 1129 +CHRM3 1131 +CHRM3-AS1 100873984 +CHRM3-AS2 100506915 +CHRM4 1132 +CHRM5 1133 +CHRNA1 1134 +CHRNA2 1135 +CHRNA3 1136 +CHRNA4 1137 +CHRNA5 1138 +CHRNA6 8973 +CHRNA7 1139 +CHRNA9 55584 +CHRNA10 57053 +CHRNB1 1140 +CHRNB2 1141 +CHRNB3 1142 +CHRNB4 1143 +CHRND 1144 +CHRNE 1145 +CHRNG 1146 +CHROMR 101927027 +CHST1 8534 +CHST2 9435 +CHST3 9469 +CHST4 10164 +CHST5 23563 +CHST6 4166 +CHST7 56548 +CHST8 64377 +CHST9 83539 +CHST10 9486 +CHST11 50515 +CHST12 55501 +CHST13 166012 +CHST14 113189 +CHST15 51363 +CHSY1 22856 +CHSY3 337876 +CHTF8 54921 +CHTF8P1 677883 +CHTF18 63922 +CHTOP 26097 +CHUK 1147 +CHUK-DT 122152368 +CHURC1 91612 +CHURC1-FNTB 100529261 +CIAO1 9391 +CIAO2A 84191 +CIAO2AP1 106480777 +CIAO2AP2 391174 +CIAO2B 51647 +CIAO3 64428 +CIAPIN1 57019 +CIAPIN1P 728599 +CIART 148523 +CIB1 10519 +CIB2 10518 +CIB3 117286 +CIB4 130106 +CIBAR1 137392 +CIBAR1-DT 642924 +CIBAR1P1 729073 +CIBAR1P2 403315 +CIBAR2 339145 +CIC 23152 +CICP1 360017 +CICP2 360016 +CICP3 100132630 +CICP4 100132920 +CICP5 730978 +CICP6 100507251 +CICP7 100288667 +CICP8 442676 +CICP9 100420293 +CICP10 100462787 +CICP11 100288904 +CICP12 100420224 +CICP13 728615 +CICP14 100130600 +CICP15 100507648 +CICP16 100420203 +CICP17 642663 +CICP18 646070 +CICP19 100506706 +CICP20 100129050 +CICP21 100420263 +CICP22 100288083 +CICP23 100505953 +CICP24 107986730 +CICP25 100289383 +CICP26 648262 +CICP27 100420257 +CICP28 100287136 +CIDEA 1149 +CIDEB 27141 +CIDEC 63924 +CIDECP1 152302 +CIDECP2 124906283 +CIITA 4261 +CILK1 22858 +CILP 8483 +CILP2 148113 +CIMAP1A 113746 +CIMAP1B 440836 +CIMAP1C 161753 +CIMAP1D 284451 +CIMAP2 163747 +CIMAP3 128344 +CIMIP1 128602 +CIMIP2A 401565 +CIMIP2B 730112 +CIMIP2C 339778 +CIMIP3 114841037 +CIMIP4 339669 +CINP 51550 +CIP2A 57650 +CIPC 85457 +CIR1 9541 +CIR1P1 100131740 +CIR1P2 100131828 +CIR1P3 106480783 +CIRBP 1153 +CIRBP-AS1 148046 +CIROP 100128908 +CISD1 55847 +CISD1P1 130500 +CISD2 493856 +CISD3 284106 +CISH 1154 +CIST1 729966 +CISTR 102216268 +CIT 11113 +CITED1 4435 +CITED2 10370 +CITED4 163732 +CIZ1 25792 +CKAP2 26586 +CKAP2-DT 123706541 +CKAP2L 150468 +CKAP2LP1 100533711 +CKAP2P1 100420763 +CKAP4 10970 +CKAP5 9793 +CKB 1152 +CKBP1 1157 +CKLF 51192 +CKLF-CMTM1 100529251 +CKM 1158 +CKMT1A 548596 +CKMT1B 1159 +CKMT2 1160 +CKMT2-AS1 100131067 +CKS1B 1163 +CKS1BP1 317780 +CKS1BP2 246714 +CKS1BP3 246715 +CKS1BP4 100499259 +CKS1BP5 100526793 +CKS1BP6 652904 +CKS1BP7 137529 +CKS2 1164 +CLASP1 23332 +CLASP1-AS1 107985942 +CLASP2 23122 +CLASRP 11129 +CLBA1 122616 +CLC 1178 +CLCA1 1179 +CLCA2 9635 +CLCA3P 9629 +CLCA4 22802 +CLCA4-AS1 105378828 +CLCC1 23155 +CLCF1 23529 +CLCN1 1180 +CLCN2 1181 +CLCN3 1182 +CLCN3P1 100419056 +CLCN4 1183 +CLCN5 1184 +CLCN6 1185 +CLCN7 1186 +CLCNKA 1187 +CLCNKB 1188 +CLCP1 266626 +CLCP2 100128145 +CLDN1 9076 +CLDN2 9075 +CLDN3 1365 +CLDN4 1364 +CLDN5 7122 +CLDN6 9074 +CLDN7 1366 +CLDN7P1 100129851 +CLDN8 9073 +CLDN9 9080 +CLDN10 9071 +CLDN10-AS1 100874194 +CLDN11 5010 +CLDN12 9069 +CLDN14 23562 +CLDN14-AS1 105369301 +CLDN15 24146 +CLDN16 10686 +CLDN17 26285 +CLDN18 51208 +CLDN19 149461 +CLDN20 49861 +CLDN22 53842 +CLDN23 137075 +CLDN24 100132463 +CLDN25 644672 +CLDN34 100288814 +CLDND1 56650 +CLDND2 125875 +CLEC1A 51267 +CLEC1B 51266 +CLEC2A 387836 +CLEC2B 9976 +CLEC2D 29121 +CLEC2L 154790 +CLEC3A 10143 +CLEC3B 7123 +CLEC4A 50856 +CLEC4C 170482 +CLEC4D 338339 +CLEC4E 26253 +CLEC4F 165530 +CLEC4G 339390 +CLEC4GP1 440508 +CLEC4M 10332 +CLEC4OP 102724279 +CLEC5A 23601 +CLEC6A 93978 +CLEC7A 64581 +CLEC9A 283420 +CLEC10A 10462 +CLEC11A 6320 +CLEC12A 160364 +CLEC12A-AS1 400002 +CLEC12B 387837 +CLEC14A 161198 +CLEC16A 23274 +CLEC17A 388512 +CLEC18A 348174 +CLEC18B 497190 +CLEC18C 283971 +CLEC19A 728276 +CLEC20A 400797 +CLECL1P 160365 +CLGN 1047 +CLHC1 130162 +CLIC1 1192 +CLIC1P1 390363 +CLIC2 1193 +CLIC3 9022 +CLIC4 25932 +CLIC4P1 646609 +CLIC4P2 100130584 +CLIC4P3 442447 +CLIC5 53405 +CLIC6 54102 +CLINT1 9685 +CLIP1 6249 +CLIP1-AS1 100507066 +CLIP2 7461 +CLIP3 25999 +CLIP4 79745 +CLK1 1195 +CLK2 1196 +CLK2P1 1197 +CLK3 1198 +CLK3P1 646505 +CLK3P2 100128834 +CLK4 57396 +CLLU1 574028 +CLLU1-AS1 574016 +CLMAT3 101927096 +CLMN 79789 +CLMP 79827 +CLN3 1201 +CLN5 1203 +CLN6 54982 +CLN8 2055 +CLN8-AS1 101927752 +CLNK 116449 +CLNS1A 1207 +CLNS1AP1 1204 +CLOCK 9575 +CLP1 10978 +CLPB 81570 +CLPP 8192 +CLPS 1208 +CLPSL1 340204 +CLPSL2 389383 +CLPTM1 1209 +CLPTM1L 81037 +CLPTM1LP1 106480241 +CLPX 10845 +CLRN1 7401 +CLRN1-AS1 116933 +CLRN2 645104 +CLRN3 119467 +CLSPN 63967 +CLSTN1 22883 +CLSTN2 64084 +CLSTN2-AS1 101927808 +CLSTN3 9746 +CLTA 1211 +CLTB 1212 +CLTC 1213 +CLTCL1 8218 +CLTRN 57393 +CLU 1191 +CLUAP1 23059 +CLUH 23277 +CLUHP1 100418708 +CLUHP2 100418709 +CLUHP3 100132341 +CLUHP4 100418711 +CLUHP5 100418745 +CLUHP6 100418754 +CLUHP7 100418719 +CLUHP8 100418733 +CLUHP9 100418742 +CLUHP10 107161230 +CLUHP11 100418756 +CLUL1 27098 +CLVS1 157807 +CLVS2 134829 +CLXN 79645 +CLYBL 171425 +CLYBL-AS1 101927465 +CLYBL-AS2 100874063 +CLYBL-AS3 101927437 +CMA1 1215 +CMAHP 8418 +CMAS 55907 +CMBL 134147 +CMC1 152100 +CMC2 56942 +CMC4 100272147 +CMIP 80790 +CMKLR1 1240 +CMKLR2 2825 +CMKLR2-AS 101669764 +CMPK1 51727 +CMPK2 129607 +CMSS1 84319 +CMTM1 113540 +CMTM2 146225 +CMTM3 123920 +CMTM4 146223 +CMTM5 116173 +CMTM6 54918 +CMTM7 112616 +CMTM8 152189 +CMTR1 23070 +CMTR2 55783 +CMYA5 202333 +CNBD1 168975 +CNBD2 140894 +CNBP 7555 +CNDP1 84735 +CNDP2 55748 +CNEP1R1 255919 +CNEP1R1P1 100130176 +CNFN 84518 +CNGA1 1259 +CNGA2 1260 +CNGA3 1261 +CNGA4 1262 +CNGB1 1258 +CNGB3 54714 +CNIH1 10175 +CNIH2 254263 +CNIH3 149111 +CNIH3-AS1 105373106 +CNIH3-AS2 102723817 +CNIH4 29097 +CNKSR1 10256 +CNKSR2 22866 +CNKSR3 154043 +CNMD 11061 +CNN1 1264 +CNN2 1265 +CNN2P1 646467 +CNN2P2 642888 +CNN2P3 392343 +CNN2P4 647507 +CNN2P6 339897 +CNN2P7 391266 +CNN2P8 205272 +CNN2P9 441166 +CNN2P10 646693 +CNN2P11 100689296 +CNN2P12 100131550 +CNN3 1266 +CNN3-DT 729970 +CNN3P1 643875 +CNNM1 26507 +CNNM2 54805 +CNNM3 26505 +CNNM3-DT 100506036 +CNNM4 26504 +CNOT1 23019 +CNOT2 4848 +CNOT3 4849 +CNOT4 4850 +CNOT4P1 100874389 +CNOT6 57472 +CNOT6L 246175 +CNOT6LP1 729530 +CNOT7 29883 +CNOT7P1 100421338 +CNOT7P2 100132332 +CNOT8 9337 +CNOT9 9125 +CNOT10 25904 +CNOT10-AS1 100874109 +CNOT11 55571 +CNP 1267 +CNPPD1 27013 +CNPY1 285888 +CNPY2 10330 +CNPY2-AS1 112268098 +CNPY3 10695 +CNPY4 245812 +CNR1 1268 +CNR2 1269 +CNRIP1 25927 +CNST 163882 +CNTD1 124817 +CNTF 1270 +CNTFR 1271 +CNTFR-AS1 415056 +CNTLN 54875 +CNTN1 1272 +CNTN2 6900 +CNTN3 5067 +CNTN4 152330 +CNTN4-AS1 100873975 +CNTN4-AS2 100873976 +CNTN5 53942 +CNTN6 27255 +CNTNAP1 8506 +CNTNAP2 26047 +CNTNAP2-AS1 101928700 +CNTNAP3 79937 +CNTNAP3B 728577 +CNTNAP3C 100289279 +CNTNAP3P1 100420787 +CNTNAP3P2 643827 +CNTNAP3P3 106660623 +CNTNAP3P4 107403150 +CNTNAP3P5 100420786 +CNTNAP3P6 100420776 +CNTNAP3P7 100420777 +CNTNAP3P8 100420785 +CNTNAP3P9 107403148 +CNTNAP4 85445 +CNTNAP5 129684 +CNTNAP5-DT 107985820 +CNTRL 11064 +CNTROB 116840 +COA1 55744 +COA3 28958 +COA4 51287 +COA5 493753 +COA6 388753 +COA6-AS1 101927765 +COA7 65260 +COA8 84334 +COASY 80347 +COBL 23242 +COBLL1 22837 +COBLP1 392529 +COCH 1690 +COG1 9382 +COG2 22796 +COG3 83548 +COG4 25839 +COG5 10466 +COG6 57511 +COG7 91949 +COG8 84342 +COIL 8161 +COILP1 317784 +COILP2 494447 +COL1A1 1277 +COL1A2 1278 +COL1A2-AS1 101927525 +COL1AR 1279 +COL2A1 1280 +COL3A1 1281 +COL4A1 1282 +COL4A2 1284 +COL4A2-AS1 100874203 +COL4A2-AS2 100129836 +COL4A3 1285 +COL4A4 1286 +COL4A5 1287 +COL4A6 1288 +COL5A1 1289 +COL5A1-AS1 414316 +COL5A2 1290 +COL5A3 50509 +COL6A1 1291 +COL6A2 1292 +COL6A2-DT 122152369 +COL6A3 1293 +COL6A4P1 344875 +COL6A4P2 646300 +COL6A5 256076 +COL6A6 131873 +COL7A1 1294 +COL8A1 1295 +COL8A2 1296 +COL9A1 1297 +COL9A2 1298 +COL9A3 1299 +COL10A1 1300 +COL11A1 1301 +COL11A2 1302 +COL11A2P1 394214 +COL12A1 1303 +COL13A1 1305 +COL14A1 7373 +COL15A1 1306 +COL16A1 1307 +COL17A1 1308 +COL18A1 80781 +COL18A1-AS1 378832 +COL18A1-AS2 100874236 +COL19A1 1310 +COL20A1 57642 +COL21A1 81578 +COL22A1 169044 +COL23A1 91522 +COL24A1 255631 +COL25A1 84570 +COL25A1-DT 645078 +COL26A1 136227 +COL27A1 85301 +COL28A1 340267 +COLCA1 399948 +COLEC10 10584 +COLEC11 78989 +COLEC12 81035 +COLGALT1 79709 +COLGALT2 23127 +COLQ 8292 +COMETT 100996266 +COMMD1 150684 +COMMD2 51122 +COMMD3 23412 +COMMD3-BMI1 100532731 +COMMD4 54939 +COMMD4P1 440292 +COMMD4P2 732265 +COMMD5 28991 +COMMD5P1 101928879 +COMMD6 170622 +COMMD7 149951 +COMMD8 54951 +COMMD9 29099 +COMMD10 51397 +COMP 1311 +COMT 1312 +COMTD1 118881 +COP1 64326 +COP1-DT 121832809 +COP1P1 729391 +COPA 1314 +COPB1 1315 +COPB2 9276 +COPB2-DT 100507291 +COPDA1 115253418 +COPE 11316 +COPG1 22820 +COPG2 26958 +COPG2IT1 53844 +COPRS 55352 +COPRSP1 100420772 +COPS2 9318 +COPS3 8533 +COPS3P1 100652955 +COPS4 51138 +COPS5 10987 +COPS5P1 135270 +COPS5P2 112268476 +COPS6 10980 +COPS7A 50813 +COPS7B 64708 +COPS8 10920 +COPS8-DT 122152364 +COPS8P1 260342 +COPS8P2 375350 +COPS8P3 106479058 +COPS9 150678 +COPZ1 22818 +COPZ2 51226 +COQ2 27235 +COQ3 51805 +COQ4 51117 +COQ5 84274 +COQ6 51004 +COQ7 10229 +COQ7-DT 102723385 +COQ8A 56997 +COQ8B 79934 +COQ9 57017 +COQ10A 93058 +COQ10B 80219 +COQ10BP1 100421150 +COQ10BP2 100421072 +CORIN 10699 +CORO1A 11151 +CORO1A-AS1 107984834 +CORO1B 57175 +CORO1C 23603 +CORO1CP1 100420760 +CORO2A 7464 +CORO2B 10391 +CORO6 84940 +CORO7 79585 +CORO7-PAM16 100529144 +CORT 1325 +COSMOC 101927809 +COTL1 23406 +COTL1P1 27170 +COTL1P2 347720 +COX4I1 1327 +COX4I1P1 122867 +COX4I1P2 652170 +COX4I2 84701 +COX5A 9377 +COX5AP1 9385 +COX5AP2 319087 +COX5B 1329 +COX5BP1 1330 +COX5BP2 1331 +COX5BP3 1332 +COX5BP4 1333 +COX5BP5 100288440 +COX5BP6 101234262 +COX5BP7 1336 +COX5BP8 100859925 +COX6A1 1337 +COX6A1P1 1338 +COX6A1P2 285849 +COX6A1P3 100287768 +COX6A1P4 127566421 +COX6A1P5 127566422 +COX6A1P6 127566429 +COX6A1P7 127566423 +COX6A2 1339 +COX6B1 1340 +COX6B1P1 140603 +COX6B1P2 1342 +COX6B1P3 1343 +COX6B1P4 100462850 +COX6B1P5 100289662 +COX6B1P6 100462851 +COX6B1P7 100133210 +COX6B2 125965 +COX6C 1345 +COX6CP1 9384 +COX6CP2 170504 +COX6CP3 100130247 +COX6CP4 100288892 +COX6CP5 100862855 +COX6CP6 100289131 +COX6CP7 106480265 +COX6CP8 106481680 +COX6CP9 112340384 +COX6CP10 106481681 +COX6CP11 106480266 +COX6CP12 106481682 +COX6CP13 106480267 +COX6CP14 106481683 +COX6CP15 106480268 +COX6CP16 106481965 +COX6CP17 106480269 +COX6CP18 106481684 +COX7A1 1346 +COX7A2 1347 +COX7A2L 9167 +COX7A2P1 319098 +COX7A2P2 1348 +COX7B 1349 +COX7B2 170712 +COX7BP1 114657 +COX7BP2 140692 +COX7BP3 100507586 +COX7BP4 127460871 +COX7BP6 127482544 +COX7C 1350 +COX7CP1 9386 +COX7CP2 100506672 +COX7CP3 127460872 +COX7CP4 127460873 +COX8A 1351 +COX8BP 404544 +COX8C 341947 +COX10 1352 +COX10-DT 100874058 +COX11 1353 +COX11P1 140468 +COX14 84987 +COX15 1355 +COX16 51241 +COX17 10063 +COX17P1 81993 +COX18 285521 +COX19 90639 +COX20 116228 +COX20P1 100507102 +COX20P2 100289170 +CP 1356 +CPA1 1357 +CPA2 1358 +CPA3 1359 +CPA4 51200 +CPA5 93979 +CPA6 57094 +CPAMD8 27151 +CPB1 1360 +CPB2 1361 +CPB2-AS1 100509894 +CPD 1362 +CPDP1 109729163 +CPE 1363 +CPEB1 64506 +CPEB1-AS1 283692 +CPEB2 132864 +CPEB2-DT 441009 +CPEB3 22849 +CPEB4 80315 +CPED1 79974 +CPHL1P 389160 +CPHXL 105371346 +CPHXL2 112268164 +CPLANE1 65250 +CPLANE1-AS1 105374727 +CPLANE2 79363 +CPLX1 10815 +CPLX2 10814 +CPLX3 594855 +CPLX4 339302 +CPM 1368 +CPMER 125177369 +CPN1 1369 +CPN2 1370 +CPNE1 8904 +CPNE2 221184 +CPNE2-DT 119863867 +CPNE3 8895 +CPNE4 131034 +CPNE5 57699 +CPNE6 9362 +CPNE7 27132 +CPNE8 144402 +CPNE8-AS1 107984504 +CPNE9 151835 +CPO 130749 +CPOX 1371 +CPP 340451 +CPPED1 55313 +CPQ 10404 +CPS1 1373 +CPS1-IT1 29034 +CPSF1 29894 +CPSF1P1 129099 +CPSF1P2 100422285 +CPSF2 53981 +CPSF3 51692 +CPSF4 10898 +CPSF4L 642843 +CPSF6 11052 +CPSF7 79869 +CPT1A 1374 +CPT1B 1375 +CPT1C 126129 +CPT2 1376 +CPT2P1 100420556 +CPTP 80772 +CPVL 54504 +CPVL-AS1 107986703 +CPVL-AS2 100506497 +CPXCR1 53336 +CPXM1 56265 +CPXM2 119587 +CPZ 8532 +CR1 1378 +CR1L 1379 +CR2 1380 +CRABP1 1381 +CRABP2 1382 +CRACD 57482 +CRACDL 343990 +CRACR2A 84766 +CRACR2B 283229 +CRADD 8738 +CRADD-AS1 101928731 +CRADDP1 100422426 +CRAMP1 57585 +CRAT 1384 +CRB1 23418 +CRB2 286204 +CRB3 92359 +CRB3P1 106480279 +CRBN 51185 +CRCP 27297 +CRCT1 54544 +CREB1 1385 +CREB3 10488 +CREB3L1 90993 +CREB3L2 64764 +CREB3L2-AS1 100130880 +CREB3L3 84699 +CREB3L4 148327 +CREB5 9586 +CREBBP 1387 +CREBL2 1389 +CREBRF 153222 +CREBZF 58487 +CREG1 8804 +CREG2 200407 +CRELD1 78987 +CRELD2 79174 +CREM 1390 +CRH 1392 +CRHBP 1393 +CRHR1 1394 +CRHR2 1395 +CRIM1 51232 +CRIM1-DT 100288911 +CRIP1 1396 +CRIP1P1 106480793 +CRIP1P2 641456 +CRIP1P3 106479040 +CRIP1P4 641457 +CRIP2 1397 +CRIP3 401262 +CRIPT 9419 +CRIPTO 6997 +CRIPTO3 6998 +CRIPTOP1 100421177 +CRIPTOP2 22816 +CRIPTOP4 22815 +CRIPTOP5 22814 +CRIPTOP6 22813 +CRIPTOP7 100129080 +CRISP1 167 +CRISP2 7180 +CRISP3 10321 +CRISPLD1 83690 +CRISPLD2 83716 +CRK 1398 +CRKL 1399 +CRLF1 9244 +CRLF2 64109 +CRLF3 51379 +CRLF3P1 728815 +CRLF3P2 285706 +CRLF3P3 100124401 +CRLS1 54675 +CRMA 253868 +CRMP1 1400 +CRNDE 643911 +CRNKL1 51340 +CRNN 49860 +CROCC 9696 +CROCC2 728763 +CROCCP1 392547 +CROCCP2 84809 +CROCCP3 114819 +CROCCP4 100421113 +CROCCP5 100421114 +CROT 54677 +CRP 1401 +CRPP1 171422 +CRPPA 729920 +CRPPA-AS1 100506025 +CRSP5 10688 +CRTAC1 55118 +CRTAM 56253 +CRTAP 10491 +CRTC1 23373 +CRTC1P1 129656 +CRTC2 200186 +CRTC3 64784 +CRTC3-AS1 101926895 +CRX 1406 +CRY1 1407 +CRY2 1408 +CRYAA 1409 +CRYAB 1410 +CRYBA1 1411 +CRYBA2 1412 +CRYBA4 1413 +CRYBB1 1414 +CRYBB2 1415 +CRYBB2P1 1416 +CRYBB3 1417 +CRYBG1 202 +CRYBG2 55057 +CRYBG3 131544 +CRYGA 1418 +CRYGB 1419 +CRYGC 1420 +CRYGD 1421 +CRYGEP 200575 +CRYGFP 1423 +CRYGGP 1424 +CRYGN 155051 +CRYGS 1427 +CRYL1 51084 +CRYM 1428 +CRYZ 1429 +CRYZL1 9946 +CRYZL2P 730102 +CRYZL2P-SEC16B 111240474 +CRYZP1 1430 +CRYZP2 100526735 +CS 1431 +CSAD 51380 +CSAG1 158511 +CSAG2 102723547 +CSAG3 389903 +CSAG4 100130935 +CSDC2 27254 +CSDE1 7812 +CSE1L 1434 +CSE1L-DT 102723483 +CSF1 1435 +CSF1R 1436 +CSF2 1437 +CSF2RA 1438 +CSF2RB 1439 +CSF2RBP1 23772 +CSF3 1440 +CSF3R 1441 +CSGALNACT1 55790 +CSGALNACT2 55454 +CSGALNACT2-DT 118568825 +CSGALNACT2P1 286453 +CSGALNACT2P2 107178920 +CSH1 1442 +CSH2 1443 +CSHL1 1444 +CSK 1445 +CSKMT 751071 +CSMD1 64478 +CSMD2 114784 +CSMD2-AS1 402779 +CSMD3 114788 +CSN1S1 1446 +CSN1S2AP 286828 +CSN1S2BP 100337616 +CSN2 1447 +CSN3 1448 +CSNK1A1 1452 +CSNK1A1L 122011 +CSNK1A1P1 161635 +CSNK1A1P2 120321 +CSNK1A1P3 100526776 +CSNK1D 1453 +CSNK1E 1454 +CSNK1G1 53944 +CSNK1G2 1455 +CSNK1G2-AS1 255193 +CSNK1G2P1 100419821 +CSNK1G3 1456 +CSNK2A1 1457 +CSNK2A2 1459 +CSNK2A3 283106 +CSNK2B 1460 +CSNKA2IP 111064647 +CSP1 100418973 +CSP2 649024 +CSP3 440514 +CSPG4 1464 +CSPG4BP 727930 +CSPG4P1Y 114758 +CSPG4P2Y 84664 +CSPG4P3Y 100287261 +CSPG4P4Y 100287502 +CSPG4P5 114817 +CSPG4P9 642288 +CSPG4P10 390627 +CSPG4P11 100631254 +CSPG4P12 728121 +CSPG4P13 100302666 +CSPG5 10675 +CSPP1 79848 +CSRNP1 64651 +CSRNP2 81566 +CSRNP3 80034 +CSRP1 1465 +CSRP1-AS1 107985246 +CSRP2 1466 +CSRP2P1 1467 +CSRP2P2 100420832 +CSRP3 8048 +CSRP3-AS1 105376580 +CST1 1469 +CST2 1470 +CST2P1 101410546 +CST3 1471 +CST4 1472 +CST5 1473 +CST6 1474 +CST7 8530 +CST8 10047 +CST9 128822 +CST9L 128821 +CST9LP1 128820 +CST9LP2 106480788 +CST11 140880 +CST12P 106478911 +CST13P 164380 +CSTA 1475 +CSTB 1476 +CSTBP1 127379754 +CSTF1 1477 +CSTF2 1478 +CSTF2T 23283 +CSTF3 1479 +CSTF3-DT 338739 +CSTL1 128817 +CSTP1 1480 +CSTP2 1481 +CSTPP1 79096 +CT45A1 541466 +CT45A2 728911 +CT45A3 441519 +CT45A5 441521 +CT45A6 541465 +CT45A7 101060211 +CT45A8 102723737 +CT45A9 102723680 +CT45A10 102723631 +CT45A11P 100129813 +CT45B1P 100337646 +CT47A1 728096 +CT47A2 728090 +CT47A3 728082 +CT47A4 728075 +CT47A5 728072 +CT47A6 728062 +CT47A7 653282 +CT47A8 728049 +CT47A9 728042 +CT47A10 728036 +CT47A11 255313 +CT47A12 100507170 +CT47B1 643311 +CT47C1 727838 +CT55 54967 +CT62 196993 +CT66 100507468 +CT69 101928231 +CT70 107987106 +CT75 440934 +CT83 203413 +CTAG1A 246100 +CTAG1B 1485 +CTAG2 30848 +CTAGE1 64693 +CTAGE3P 220112 +CTAGE4 100128553 +CTAGE6 340307 +CTAGE7P 119437 +CTAGE8 100142659 +CTAGE9 643854 +CTAGE10P 220429 +CTAGE11P 647288 +CTAGE12P 392298 +CTAGE13P 100421638 +CTAGE14P 401018 +CTAGE15 441294 +CTAGE16P 341689 +CTBP1 1487 +CTBP1-AS 285463 +CTBP1-DT 92070 +CTBP2 1488 +CTBP2P1 352905 +CTBP2P2 100130970 +CTBP2P3 220147 +CTBP2P4 642909 +CTBP2P5 646936 +CTBP2P6 120449 +CTBP2P7 401914 +CTBP2P8 100420253 +CTBP2P9 107987306 +CTBP2P10 107987305 +CTBP2P11 107987307 +CTBS 1486 +CTC1 80169 +CTCF 10664 +CTCF-DT 107984813 +CTCFL 140690 +CTDNEP1 23399 +CTDNEP1P1 100420528 +CTDNEP1P2 100420515 +CTDP1 9150 +CTDP1-DT 284241 +CTDSP1 58190 +CTDSP2 10106 +CTDSPL 10217 +CTDSPL2 51496 +CTDSPL2-DT 120017340 +CTDSPL2P1 643605 +CTDSPL2P2 100131448 +CTF1 1489 +CTF2P 100289419 +CTH 1491 +CTHRC1 115908 +CTHRC1P1 106480299 +CTIF 9811 +CTLA4 1493 +CTNNA1 1495 +CTNNA1-AS1 105379194 +CTNNA1P1 1498 +CTNNA2 1496 +CTNNA2-AS1 101927987 +CTNNA3 29119 +CTNNAL1 8727 +CTNNB1 1499 +CTNNBIP1 56998 +CTNNBL1 56259 +CTNNBL1P1 392456 +CTNND1 1500 +CTNND2 1501 +CTNS 1497 +CTNS-AS1 105371492 +CTPS1 1503 +CTPS2 56474 +CTR9 9646 +CTRB1 1504 +CTRB2 440387 +CTRC 11330 +CTRL 1506 +CTSA 5476 +CTSB 1508 +CTSC 1075 +CTSD 1509 +CTSE 1510 +CTSF 8722 +CTSG 1511 +CTSH 1512 +CTSK 1513 +CTSL 1514 +CTSL3P 392360 +CTSLP1 118945 +CTSLP2 1517 +CTSLP3 644021 +CTSLP4 644496 +CTSLP6 642413 +CTSLP8 1518 +CTSO 1519 +CTSS 1520 +CTSV 1515 +CTSW 1521 +CTSZ 1522 +CTTN 2017 +CTTN-DT 121233926 +CTTNBP2 83992 +CTTNBP2NL 55917 +CTU1 90353 +CTU2 348180 +CTXN1 404217 +CTXN2 399697 +CTXN2-AS1 105370807 +CTXN3 613212 +CTXND1 100996492 +CTXND2 100996521 +CUBN 8029 +CUBNP1 728064 +CUBNP2 100289280 +CUBNP3 100421634 +CUEDC1 404093 +CUEDC2 79004 +CUL1 8454 +CUL1P1 100288463 +CUL2 8453 +CUL3 8452 +CUL4A 8451 +CUL4AP1 100129008 +CUL4B 8450 +CUL5 8065 +CUL7 9820 +CUL9 23113 +CUPIN1P 116435282 +CUTA 51596 +CUTALP 253039 +CUTC 51076 +CUX1 1523 +CUX2 23316 +CUX2P1 100126596 +CUX2P2 100126597 +CUZD1 50624 +CWC15 51503 +CWC22 57703 +CWC25 54883 +CWC27 10283 +CWF19L1 55280 +CWF19L2 143884 +CWH43 80157 +CX3CL1 6376 +CX3CR1 1524 +CXADR 1525 +CXADRP1 653108 +CXADRP2 646243 +CXADRP3 440224 +CXCL1 2919 +CXCL1P1 50612 +CXCL2 2920 +CXCL3 2921 +CXCL5 6374 +CXCL6 6372 +CXCL8 3576 +CXCL9 4283 +CXCL10 3627 +CXCL11 6373 +CXCL12 6387 +CXCL13 10563 +CXCL14 9547 +CXCL16 58191 +CXCL17 284340 +CXCR1 3577 +CXCR2 3579 +CXCR2P1 3580 +CXCR3 2833 +CXCR4 7852 +CXCR5 643 +CXCR6 10663 +CXorf38 159013 +CXorf49 100130361 +CXorf49B 100132994 +CXorf51A 100129239 +CXorf51B 100133053 +CXorf58 254158 +CXorf65 158830 +CXorf66 347487 +CXXC1 30827 +CXXC1P1 392459 +CXXC4 80319 +CXXC4-AS1 101929468 +CXXC5 51523 +CXXC5-AS1 111082989 +CYB5A 1528 +CYB5AP2 100128621 +CYB5AP3 1531 +CYB5AP4 1532 +CYB5AP5 100289051 +CYB5B 80777 +CYB5D1 124637 +CYB5D2 124936 +CYB5R1 51706 +CYB5R2 51700 +CYB5R3 1727 +CYB5R4 51167 +CYB5RL 606495 +CYB561 1534 +CYB561A3 220002 +CYB561D1 284613 +CYB561D2 11068 +CYBA 1535 +CYBB 1536 +CYBC1 79415 +CYBRD1 79901 +CYC1 1537 +CYCS 54205 +CYCSP1 122950 +CYCSP2 360183 +CYCSP3 349198 +CYCSP4 360157 +CYCSP5 360158 +CYCSP6 360159 +CYCSP7 164837 +CYCSP8 360160 +CYCSP10 360166 +CYCSP11 360167 +CYCSP12 360168 +CYCSP14 360170 +CYCSP16 360171 +CYCSP17 360172 +CYCSP18 360173 +CYCSP19 360174 +CYCSP20 349158 +CYCSP22 360175 +CYCSP23 360176 +CYCSP24 360177 +CYCSP25 120528 +CYCSP26 360178 +CYCSP27 341148 +CYCSP28 360179 +CYCSP29 360180 +CYCSP30 121026 +CYCSP32 360181 +CYCSP33 221180 +CYCSP34 360182 +CYCSP35 121916 +CYCSP38 360184 +CYCSP39 342358 +CYCSP40 360185 +CYCSP41 360186 +CYCSP42 343727 +CYCSP43 360187 +CYCSP44 349391 +CYCSP45 352852 +CYCSP46 286550 +CYCSP48 360188 +CYCSP49 360009 +CYCSP51 343045 +CYCSP52 360155 +CYCSP53 360156 +CYCSP55 157317 +CYCSP56 107986039 +CYCTP 360163 +CYFIP1 23191 +CYFIP2 26999 +CYGB 114757 +CYLC1 1538 +CYLC2 1539 +CYLD 1540 +CYLD-AS1 102724907 +CYLD-AS2 105371251 +CYMP 643160 +CYMP-AS1 440602 +CYP1A1 1543 +CYP1A2 1544 +CYP1B1 1545 +CYP1B1-AS1 285154 +CYP1D1P 100133307 +CYP2A6 1548 +CYP2A7 1549 +CYP2A7P1 1550 +CYP2A7P2 +CYP2A13 1553 +CYP2AB1P 647265 +CYP2AC1P 106478960 +CYP2B6 1555 +CYP2B7P 1556 +CYP2C8 1558 +CYP2C9 1559 +CYP2C18 1562 +CYP2C19 1557 +CYP2C23P 107436076 +CYP2C56P 106478959 +CYP2C58P 106480430 +CYP2C59P 100874505 +CYP2C60P 106480748 +CYP2C61P 106480734 +CYP2C63P 107063541 +CYP2C64P 112499600 +CYP2C115P 100874513 +CYP2D6 1565 +CYP2D7 1564 +CYP2D8P 1568 +CYP2E1 1571 +CYP2F1 1572 +CYP2F2P 171427 +CYP2G1P 22952 +CYP2G2P 83757 +CYP2J2 1573 +CYP2R1 120227 +CYP2S1 29785 +CYP2T1P 171523 +CYP2T3P 163007 +CYP2U1 113612 +CYP2U1-AS1 101929595 +CYP2W1 54905 +CYP3A4 1576 +CYP3A5 1577 +CYP3A7 1551 +CYP3A7-CYP3A51P 100861540 +CYP3A43 64816 +CYP3A51P 1578 +CYP3A52P 106478983 +CYP3A54P 106480749 +CYP3A137P 107063543 +CYP4A11 1579 +CYP4A22 284541 +CYP4A22-AS1 104355148 +CYP4A26P 107080641 +CYP4A27P 100422288 +CYP4A43P 100874495 +CYP4A44P 106481791 +CYP4B1 1580 +CYP4F2 8529 +CYP4F3 4051 +CYP4F8 11283 +CYP4F9P 105369296 +CYP4F10P 646575 +CYP4F11 57834 +CYP4F12 66002 +CYP4F22 126410 +CYP4F23P 100422238 +CYP4F24P 388514 +CYP4F25P 100288827 +CYP4F26P 106478958 +CYP4F27P 107133494 +CYP4F29P 54055 +CYP4F30P 100132708 +CYP4F31P 107403068 +CYP4F32P 107133497 +CYP4F33P 107133499 +CYP4F34P 100422247 +CYP4F35P 284233 +CYP4F36P 100422235 +CYP4F44P 106480733 +CYP4F45P 112552146 +CYP4F59P 100132340 +CYP4F60P 107126294 +CYP4F61P 107457588 +CYP4F62P 646802 +CYP4V2 285440 +CYP4X1 260293 +CYP4Z1 199974 +CYP4Z2P 163720 +CYP7A1 1581 +CYP7B1 9420 +CYP8B1 1582 +CYP11A1 1583 +CYP11B1 1584 +CYP11B2 1585 +CYP17A1 1586 +CYP17A1-AS1 102724307 +CYP19A1 1588 +CYP20A1 57404 +CYP21A1P 1590 +CYP21A2 1589 +CYP24A1 1591 +CYP26A1 1592 +CYP26B1 56603 +CYP26C1 340665 +CYP26C1-DT 122455335 +CYP27A1 1593 +CYP27B1 1594 +CYP27C1 339761 +CYP39A1 51302 +CYP46A1 10858 +CYP46A4P 100874494 +CYP51A1 1595 +CYP51A1-AS1 613126 +CYP51A1P1 83528 +CYP51A1P2 83530 +CYP51A1P3 100422264 +CYREN 78996 +CYRIA 81553 +CYRIB 51571 +CYS1 192668 +CYSLTR1 10800 +CYSLTR2 57105 +CYSRT1 375791 +CYSTM1 84418 +CYTH1 9267 +CYTH1P1 100418871 +CYTH2 9266 +CYTH3 9265 +CYTH4 27128 +CYTIP 9595 +CYTL1 54360 +CYTOR 112597 +CYYR1 116159 +CYYR1-AS1 100996571 +CZIB 54987 +CZIB-DT 120017342 +D2HGDH 728294 +DAAM1 23002 +DAAM2 23500 +DAAM2-AS1 100505635 +DAB1 1600 +DAB1-AS1 101926890 +DAB2 1601 +DAB2IP 153090 +DACH1 1602 +DACH2 117154 +DACOR1 100131796 +DACT1 51339 +DACT2 168002 +DACT3 147906 +DACT3-AS1 100506068 +DAD1 1603 +DAD1P1 56286 +DAG1 1605 +DAGLA 747 +DAGLB 221955 +DALIR 104940698 +DALRD3 55152 +DANCR 57291 +DAND5 199699 +DANT1 106029310 +DANT2 642776 +DAO 1610 +DAOA 267012 +DAOA-AS1 282706 +DAP 1611 +DAP-DT 105374652 +DAP3 7818 +DAP3P1 359804 +DAP3P2 359774 +DAPK1 1612 +DAPK1-IT1 100506897 +DAPK2 23604 +DAPK3 1613 +DAPL1 92196 +DAPP1 27071 +DARS1 1615 +DARS1-AS1 101928243 +DARS2 55157 +DAW1 164781 +DAXX 1616 +DAZ1 1617 +DAZ2 57055 +DAZ3 57054 +DAZ4 57135 +DAZAP1 26528 +DAZAP2 9802 +DAZAP2P1 645805 +DAZL 1618 +DBET 100419743 +DBF4 10926 +DBF4B 80174 +DBF4P1 645084 +DBF4P2 100420180 +DBF4P3 112272612 +DBH 1621 +DBH-AS1 138948 +DBI 1622 +DBIL5P 100131454 +DBIL5P2 100169989 +DBIP1 1624 +DBIP2 1623 +DBIP3 791082 +DBN1 1627 +DBNDD1 79007 +DBNDD2 55861 +DBNL 28988 +DBP 1628 +DBR1 51163 +DBT 1629 +DBTP1 127379690 +DBX1 120237 +DBX2 440097 +DBX2-AS1 120766145 +DCAF1 9730 +DCAF4 26094 +DCAF4L1 285429 +DCAF4L2 138009 +DCAF5 8816 +DCAF6 55827 +DCAF7 10238 +DCAF8 50717 +DCAF8-DT 100287049 +DCAF8L1 139425 +DCAF8L2 347442 +DCAF10 79269 +DCAF11 80344 +DCAF12 25853 +DCAF12L1 139170 +DCAF12L2 340578 +DCAF13 25879 +DCAF13P1 100129009 +DCAF13P2 100288979 +DCAF13P3 100132724 +DCAF15 90379 +DCAF16 54876 +DCAF17 80067 +DCAKD 79877 +DCANP1 140947 +DCBLD1 285761 +DCBLD2 131566 +DCC 1630 +DCD 117159 +DCDC1 341019 +DCDC2 51473 +DCDC2B 149069 +DCDC2C 728597 +DCHS1 8642 +DCHS1-AS1 118597837 +DCHS2 54798 +DCK 1633 +DCLK1 9201 +DCLK2 166614 +DCLK3 85443 +DCLRE1A 9937 +DCLRE1B 64858 +DCLRE1C 64421 +DCLRE1CP1 105376432 +DCN 1634 +DCP1A 55802 +DCP1B 196513 +DCP2 167227 +DCPS 28960 +DCR 1637 +DCST1 149095 +DCST1-AS1 100505666 +DCST2 127579 +DCSTAMP 81501 +DCT 1638 +DCTD 1635 +DCTN1 1639 +DCTN1-AS1 100189589 +DCTN2 10540 +DCTN3 11258 +DCTN4 51164 +DCTN5 84516 +DCTN6 10671 +DCTN6-DT 118597835 +DCTPP1 79077 +DCUN1D1 54165 +DCUN1D2 55208 +DCUN1D2-AS 100874229 +DCUN1D3 123879 +DCUN1D4 23142 +DCUN1D5 84259 +DCX 1641 +DCXR 51181 +DCXR-DT 113523640 +DDA1 79016 +DDAH1 23576 +DDAH2 23564 +DDB1 1642 +DDB2 1643 +DDC 1644 +DDC-AS1 100129427 +DDHD1 80821 +DDHD1-DT 101927620 +DDHD2 23259 +DDI1 414301 +DDI2 84301 +DDIAS 220042 +DDIT3 1649 +DDIT4 54541 +DDIT4-AS1 110806271 +DDIT4L 115265 +DDIT4L-AS1 101929353 +DDN 23109 +DDN-AS1 105369758 +DDO 8528 +DDOST 1650 +DDR1 780 +DDR1-DT 414771 +DDR2 4921 +DDRGK1 65992 +DDT 1652 +DDTL 100037417 +DDTP1 101060160 +DDX1 1653 +DDX3ILA1 105375368 +DDX3P1 100133180 +DDX3P2 100874489 +DDX3P3 650560 +DDX3X 1654 +DDX3Y 8653 +DDX4 54514 +DDX5 1655 +DDX5P1 100421238 +DDX6 1656 +DDX6P1 442192 +DDX6P2 100130117 +DDX10 1662 +DDX10P1 100421371 +DDX10P2 401533 +DDX11 1663 +DDX11-AS1 100506660 +DDX11L1 100287102 +DDX11L2 84771 +DDX11L3 100302657 +DDX11L4 100337622 +DDX11L5 100287596 +DDX11L6 +DDX11L7 +DDX11L8 100302090 +DDX11L9 100288486 +DDX11L10 100287029 +DDX11L11 100887824 +DDX11L13 +DDX11L15 +DDX11L16 727856 +DDX11L17 102725121 +DDX12B 642846 +DDX12P 440081 +DDX17 10521 +DDX18 8886 +DDX18P1 319099 +DDX18P2 651053 +DDX18P3 442164 +DDX18P4 402222 +DDX18P5 646378 +DDX18P6 100131370 +DDX19A 55308 +DDX19A-DT 100506083 +DDX19B 11269 +DDX20 11218 +DDX20P1 100421369 +DDX21 9188 +DDX23 9416 +DDX24 57062 +DDX25 29118 +DDX27 55661 +DDX28 55794 +DDX31 64794 +DDX39A 10212 +DDX39AP1 646164 +DDX39B 7919 +DDX39B-AS1 106478957 +DDX39BP1 100048904 +DDX39BP2 100048923 +DDX41 51428 +DDX42 11325 +DDX43 55510 +DDX43P1 100421307 +DDX43P2 100533714 +DDX43P3 106481709 +DDX46 9879 +DDX47 51202 +DDX49 54555 +DDX50 79009 +DDX50P1 192146 +DDX50P2 100421328 +DDX51 317781 +DDX52 11056 +DDX53 168400 +DDX54 79039 +DDX55 57696 +DDX55P1 100129640 +DDX56 54606 +DDX59 83479 +DDX59-AS1 101929224 +DDX60 55601 +DDX60L 91351 +DEAF1 10522 +DECR1 1666 +DECR2 26063 +DEDD 9191 +DEDD2 162989 +DEF6 50619 +DEF8 54849 +DEFA1 1667 +DEFA1A3 613253 +DEFA1B 728358 +DEFA3 1668 +DEFA4 1669 +DEFA5 1670 +DEFA6 1671 +DEFA7P 724067 +DEFA8P 449491 +DEFA9P 449492 +DEFA10P 449493 +DEFA11P 724068 +DEFB1 1672 +DEFB4A 1673 +DEFB4B 100289462 +DEFB103A 414325 +DEFB103B 55894 +DEFB104A 140596 +DEFB104B 503618 +DEFB105A 245908 +DEFB105B 504180 +DEFB106A 245909 +DEFB106B 503841 +DEFB107A 245910 +DEFB107B 503614 +DEFB108A 503694 +DEFB108B 245911 +DEFB108C 503837 +DEFB108D 504185 +DEFB108E 503840 +DEFB108F 100133128 +DEFB109A 245912 +DEFB109B 641517 +DEFB109C 100286963 +DEFB109D 503838 +DEFB109E 503839 +DEFB109F 110806268 +DEFB110 245913 +DEFB112 245915 +DEFB113 245927 +DEFB114 245928 +DEFB115 245929 +DEFB116 245930 +DEFB117 245931 +DEFB118 117285 +DEFB119 245932 +DEFB121 245934 +DEFB122 245935 +DEFB123 245936 +DEFB124 245937 +DEFB125 245938 +DEFB126 81623 +DEFB127 140850 +DEFB128 245939 +DEFB129 140881 +DEFB130A 245940 +DEFB130B 100133267 +DEFB130C 110806270 +DEFB130D 110806292 +DEFB131A 644414 +DEFB131B 100129216 +DEFB131C 100128174 +DEFB131D 100287066 +DEFB131E 110806269 +DEFB132 400830 +DEFB133 403339 +DEFB134 613211 +DEFB135 613209 +DEFB136 613210 +DEFT1P 170949 +DEFT1P2 100287083 +DEGS1 8560 +DEGS2 123099 +DEK 7913 +DELE1 9812 +DELEC1 50514 +DENND1A 57706 +DENND1B 163486 +DENND1C 79958 +DENND2A 27147 +DENND2B 6764 +DENND2B-AS1 102724784 +DENND2C 163259 +DENND2D 79961 +DENND3 22898 +DENND3-AS1 101927963 +DENND4A 10260 +DENND4B 9909 +DENND4C 55667 +DENND5A 23258 +DENND5B 160518 +DENND5B-AS1 100874249 +DENND6A 201627 +DENND6A-AS1 106144528 +DENND6A-DT 101929159 +DENND6B 414918 +DENND10 404636 +DENND10P1 55855 +DENND11 57189 +DENR 8562 +DEPDC1 55635 +DEPDC1-AS1 101927220 +DEPDC1B 55789 +DEPDC1P1 730888 +DEPDC1P2 100126446 +DEPDC4 120863 +DEPDC5 9681 +DEPDC7 91614 +DEPP1 11067 +DEPTOR 64798 +DEPTOR-AS1 121676927 +DERA 51071 +DERL1 79139 +DERL2 51009 +DERL3 91319 +DERPC 113455421 +DES 1674 +DESI1 27351 +DESI2 51029 +DET1 55070 +DEUP1 159989 +DEXI 28955 +DFFA 1676 +DFFB 1677 +DFFBP1 100422581 +DGAT1 8694 +DGAT2 84649 +DGAT2-DT 283214 +DGAT2L6 347516 +DGAT2L7P 646409 +DGCR 1714 +DGCR2 9993 +DGCR5 26220 +DGCR6 8214 +DGCR6L 85359 +DGCR8 54487 +DGCR11 25786 +DGKA 1606 +DGKB 1607 +DGKD 8527 +DGKE 8526 +DGKG 1608 +DGKH 160851 +DGKI 9162 +DGKK 139189 +DGKQ 1609 +DGKZ 8525 +DGKZP1 400126 +DGLUCY 80017 +DGUOK 1716 +DGUOK-AS1 100874048 +DHCR7 1717 +DHCR7-DT 129810502 +DHCR24 1718 +DHCR24-DT 107984958 +DHDDS 79947 +DHDDS-AS1 101928324 +DHDH 27294 +DHFR 1719 +DHFR2 200895 +DHFRP1 573971 +DHFRP2 729816 +DHFRP3 1720 +DHFRP5 100132056 +DHFRP6 109729123 +DHH 50846 +DHODH 1723 +DHPS 1725 +DHRS1 115817 +DHRS2 10202 +DHRS3 9249 +DHRS4 10901 +DHRS4-AS1 55449 +DHRS4L1 728635 +DHRS4L2 317749 +DHRS7 51635 +DHRS7B 25979 +DHRS7C 201140 +DHRS9 10170 +DHRS11 79154 +DHRS12 79758 +DHRS13 147015 +DHRSX 207063 +DHRSX-IT1 106478924 +DHTKD1 55526 +DHX8 1659 +DHX9 1660 +DHX9-AS1 647070 +DHX9P1 1661 +DHX15 1665 +DHX16 8449 +DHX29 54505 +DHX30 22907 +DHX32 55760 +DHX33 56919 +DHX33-DT 105371506 +DHX34 9704 +DHX35 60625 +DHX35-DT 119545624 +DHX36 170506 +DHX37 57647 +DHX38 9785 +DHX40 79665 +DHX40P1 107133522 +DHX57 90957 +DHX58 79132 +DIABLO 56616 +DIAPH1 1729 +DIAPH1-AS1 100505658 +DIAPH2 1730 +DIAPH2-AS1 10824 +DIAPH3 81624 +DIAPH3-AS1 100874195 +DIAPH3-AS2 100874196 +DICER1 23405 +DICER1-AS1 400242 +DIDO1 11083 +DIMT1 27292 +DIMT1P1 100422385 +DINOL 108783646 +DIO1 1733 +DIO2 1734 +DIO2-AS1 100628307 +DIO3 1735 +DIO3OS 64150 +DIP2A 23181 +DIP2A-IT1 100862692 +DIP2B 57609 +DIP2C 22982 +DIP2C-AS1 414235 +DIPK1A 388650 +DIPK1B 138311 +DIPK1C 125704 +DIPK2A 205428 +DIPK2B 79742 +DIRAS1 148252 +DIRAS2 54769 +DIRAS3 9077 +DIRC1 116093 +DIRC3 729582 +DIRC3-AS1 105373877 +DIS3 22894 +DIS3L 115752 +DIS3L-AS1 105370868 +DIS3L2 129563 +DIS3L2P1 282697 +DISC1 27185 +DISC1-IT1 104472714 +DISC1FP1 101929222 +DISC2 27184 +DISP1 84976 +DISP2 85455 +DISP3 57540 +DIXDC1 85458 +DKC1 1736 +DKK1 22943 +DKK2 27123 +DKK3 27122 +DKK4 27121 +DKKL1 27120 +DKKL1P1 128848 +DLAT 1737 +DLC1 10395 +DLD 1738 +DLEC1 9940 +DLEC1P1 100421153 +DLEU1 10301 +DLEU1-AS1 103689915 +DLEU2 8847 +DLEU2L 79469 +DLEU7 220107 +DLEU7-AS1 100874074 +DLG1 1739 +DLG1-AS1 100507086 +DLG2 1740 +DLG2-AS1 100302690 +DLG2-AS2 101929043 +DLG3 1741 +DLG3-AS1 100873930 +DLG4 1742 +DLG5 9231 +DLG5-AS1 100128292 +DLGAP1 9229 +DLGAP1-AS1 649446 +DLGAP1-AS2 84777 +DLGAP1-AS3 201477 +DLGAP1-AS4 101410534 +DLGAP1-AS5 284215 +DLGAP2 9228 +DLGAP2-AS1 100507435 +DLGAP3 58512 +DLGAP4 22839 +DLGAP4-AS1 101926987 +DLGAP5 9787 +DLGAP5P1 360014 +DLGAP5P2 117981791 +DLK1 8788 +DLK2 65989 +DLL1 28514 +DLL3 10683 +DLL4 54567 +DLST 1743 +DLSTP1 1744 +DLX1 1745 +DLX2 1746 +DLX2-DT 104326193 +DLX3 1747 +DLX4 1748 +DLX5 1749 +DLX6 1750 +DLX6-AS1 285987 +DLX6-AS2 100873931 +DM1-AS 109729182 +DMAC1 90871 +DMAC1P1 100289059 +DMAC2 55101 +DMAC2L 27109 +DMAP1 55929 +DMBT1 1755 +DMBT1L1 375940 +DMBX1 127343 +DMC1 11144 +DMD 1756 +DMD-AS3 100873916 +DMGDH 29958 +DMKN 93099 +DMP1 1758 +DMPK 1760 +DMRT1 1761 +DMRT2 10655 +DMRT3 58524 +DMRTA1 63951 +DMRTA2 63950 +DMRTB1 63948 +DMRTC1 63947 +DMRTC1B 728656 +DMRTC2 63946 +DMTF1 9988 +DMTF1-AS1 101927420 +DMTN 2039 +DMWD 1762 +DMXL1 1657 +DMXL1-DT 105379143 +DMXL2 23312 +DNA2 1763 +DNAAF1 123872 +DNAAF2 55172 +DNAAF3 352909 +DNAAF3-AS1 101930593 +DNAAF4 161582 +DNAAF4-CCPG1 100533483 +DNAAF5 54919 +DNAAF6 139212 +DNAAF8 146562 +DNAAF9 25943 +DNAAF10 116143 +DNAAF11 23639 +DNAAF11P1 100420589 +DNAH1 25981 +DNAH2 146754 +DNAH3 55567 +DNAH5 1767 +DNAH6 1768 +DNAH7 56171 +DNAH8 1769 +DNAH8-AS1 100131047 +DNAH8-DT 121832808 +DNAH9 1770 +DNAH10 196385 +DNAH10OS 642797 +DNAH11 8701 +DNAH12 201625 +DNAH14 127602 +DNAH17 8632 +DNAH17-AS1 100996295 +DNAI1 27019 +DNAI2 64446 +DNAI3 126820 +DNAI4 79819 +DNAI7 55259 +DNAJA1 3301 +DNAJA1P1 100129308 +DNAJA1P2 100131207 +DNAJA1P3 644588 +DNAJA1P4 728614 +DNAJA1P5 94236 +DNAJA1P6 100421542 +DNAJA2 10294 +DNAJA2-DT 119545626 +DNAJA3 9093 +DNAJA4 55466 +DNAJA4-DT 105370911 +DNAJB1 3337 +DNAJB1P1 171221 +DNAJB1P2 127379689 +DNAJB2 3300 +DNAJB3 414061 +DNAJB4 11080 +DNAJB5 25822 +DNAJB5-DT 101926900 +DNAJB5P1 +DNAJB6 10049 +DNAJB6P1 387820 +DNAJB6P2 100289047 +DNAJB6P3 101059990 +DNAJB6P4 100130497 +DNAJB6P5 100129779 +DNAJB6P6 107985099 +DNAJB6P7 100421437 +DNAJB6P8 100421525 +DNAJB7 150353 +DNAJB8 165721 +DNAJB8-AS1 285224 +DNAJB9 4189 +DNAJB11 51726 +DNAJB12 54788 +DNAJB12P1 100129140 +DNAJB13 374407 +DNAJB14 79982 +DNAJC1 64215 +DNAJC2 27000 +DNAJC3 5611 +DNAJC3-DT 100289274 +DNAJC4 3338 +DNAJC5 80331 +DNAJC5B 85479 +DNAJC5G 285126 +DNAJC6 9829 +DNAJC7 7266 +DNAJC8 22826 +DNAJC8P1 319111 +DNAJC8P2 100421438 +DNAJC8P3 100131146 +DNAJC8P4 127460879 +DNAJC9 23234 +DNAJC9-AS1 414245 +DNAJC10 54431 +DNAJC11 55735 +DNAJC12 56521 +DNAJC13 23317 +DNAJC14 85406 +DNAJC15 29103 +DNAJC16 23341 +DNAJC17 55192 +DNAJC17P1 645314 +DNAJC18 202052 +DNAJC19 131118 +DNAJC19P1 100129853 +DNAJC19P2 100861445 +DNAJC19P3 100861443 +DNAJC19P4 106480691 +DNAJC19P5 100861453 +DNAJC19P6 100861449 +DNAJC19P7 100861458 +DNAJC19P8 100861455 +DNAJC19P9 644589 +DNAJC21 134218 +DNAJC22 79962 +DNAJC24 120526 +DNAJC25 548645 +DNAJC25-GNG10 552891 +DNAJC27 51277 +DNAJC27-AS1 729723 +DNAJC28 54943 +DNAJC30 84277 +DNAL1 83544 +DNAL4 10126 +DNALI1 7802 +DNASE1 1773 +DNASE1L1 1774 +DNASE1L2 1775 +DNASE1L3 1776 +DNASE2 1777 +DNASE2B 58511 +DND1 373863 +DND1P1 644157 +DND1P2 644256 +DNER 92737 +DNHD1 144132 +DNLZ 728489 +DNM1 1759 +DNM1L 10059 +DNM1P5 728770 +DNM1P9 400403 +DNM1P17 100131084 +DNM1P18 387553 +DNM1P19 387554 +DNM1P24 100216505 +DNM1P25 100216506 +DNM1P26 100216507 +DNM1P27 100216514 +DNM1P28 100132031 +DNM1P29 100132204 +DNM1P30 728388 +DNM1P31 644153 +DNM1P32 100132100 +DNM1P33 554175 +DNM1P34 729809 +DNM1P35 100128285 +DNM1P36 100216515 +DNM1P37 100216516 +DNM1P38 100216517 +DNM1P39 100216518 +DNM1P40 400433 +DNM1P41 440299 +DNM1P43 100216466 +DNM1P44 440303 +DNM1P45 100216542 +DNM1P46 196968 +DNM1P47 100216544 +DNM1P48 100418739 +DNM1P49 730058 +DNM1P50 101927579 +DNM1P51 125505920 +DNM2 1785 +DNM3 26052 +DNM3-IT1 100874284 +DNM3OS 100628315 +DNMBP 23268 +DNMBP-AS1 100188954 +DNMT1 1786 +DNMT3A 1788 +DNMT3AP1 130802 +DNMT3B 1789 +DNMT3L 29947 +DNMT3L-AS1 105372833 +DNPEP 23549 +DNPEP-AS1 105373884 +DNPH1 10591 +DNTT 1791 +DNTTIP1 116092 +DNTTIP2 30836 +DOC2A 8448 +DOC2B 8447 +DOC2GP 390213 +DOCK1 1793 +DOCK2 1794 +DOCK3 1795 +DOCK4 9732 +DOCK4-AS1 100506413 +DOCK5 80005 +DOCK6 57572 +DOCK6-AS1 105372273 +DOCK7 85440 +DOCK7-DT 121832810 +DOCK8 81704 +DOCK8-AS1 157983 +DOCK8-AS2 112268042 +DOCK9 23348 +DOCK9-AS1 100874096 +DOCK9-DT 100861541 +DOCK10 55619 +DOCK11 139818 +DOCK11P1 100132537 +DOHH 83475 +DOK1 1796 +DOK2 9046 +DOK3 79930 +DOK4 55715 +DOK5 55816 +DOK6 220164 +DOK7 285489 +DOLK 22845 +DOLPP1 57171 +DONSON 29980 +DONSONP1 100420050 +DOP1A 23033 +DOP1B 9980 +DOT1L 84444 +DPAGT1 1798 +DPCD 25911 +DPEP1 1800 +DPEP2 64174 +DPEP2NB 100131303 +DPEP3 64180 +DPF1 8193 +DPF2 5977 +DPF3 8110 +DPH1 1801 +DPH1-AS1 123706529 +DPH2 1802 +DPH3 285381 +DPH3P1 100132911 +DPH3P2 106478926 +DPH5 51611 +DPH5-DT 102606465 +DPH6 89978 +DPH6-DT 100507466 +DPH7 92715 +DPM1 8813 +DPM2 8818 +DPM3 54344 +DPP3 10072 +DPP3-DT 101928069 +DPP3P1 391657 +DPP3P2 138971 +DPP4 1803 +DPP4-DT 100131604 +DPP6 1804 +DPP7 29952 +DPP8 54878 +DPP9 91039 +DPP9-AS1 100131094 +DPP10 57628 +DPP10-AS1 389023 +DPP10-AS2 106478969 +DPP10-AS3 101927591 +DPPA2 151871 +DPPA2P1 100421137 +DPPA2P2 100128503 +DPPA2P3 100128023 +DPPA2P4 100131777 +DPPA3 359787 +DPPA3P1 728493 +DPPA3P2 400206 +DPPA3P3 106481963 +DPPA3P4 101060236 +DPPA3P5 100127919 +DPPA3P6 127460882 +DPPA3P7 127460876 +DPPA3P8 127460877 +DPPA3P9 127460878 +DPPA3P10 127460883 +DPPA3P11 127460881 +DPPA3P12 127460880 +DPPA4 55211 +DPPA4P1 100421156 +DPPA4P2 100421154 +DPPA4P3 100037267 +DPPA5 340168 +DPPA5P1 646382 +DPPA5P2 100874380 +DPPA5P3 100528006 +DPPA5P4 646701 +DPRX 503834 +DPRXP1 503641 +DPRXP2 503643 +DPRXP3 503644 +DPRXP4 503645 +DPRXP5 503646 +DPRXP6 503647 +DPRXP7 503648 +DPT 1805 +DPY19L1 23333 +DPY19L1P1 100129460 +DPY19L1P2 102724668 +DPY19L2 283417 +DPY19L2P1 554236 +DPY19L2P2 349152 +DPY19L2P3 442524 +DPY19L2P4 442523 +DPY19L2P5 106480421 +DPY19L3 147991 +DPY19L3-DT 400684 +DPY19L4 286148 +DPY19L4P1 100131533 +DPY19L4P2 100420073 +DPY30 84661 +DPYD 1806 +DPYD-AS1 100873932 +DPYD-AS2 100873933 +DPYD-IT1 100874267 +DPYS 1807 +DPYSL2 1808 +DPYSL3 1809 +DPYSL4 10570 +DPYSL5 56896 +DQX1 165545 +DR1 1810 +DRAIC 145837 +DRAM1 55332 +DRAM2 128338 +DRAP1 10589 +DRAXIN 374946 +DRAXINP1 100128801 +DRC1 92749 +DRC3 83450 +DRC7 84229 +DRD1 1812 +DRD2 1813 +DRD3 1814 +DRD4 1815 +DRD5 1816 +DRD5P1 1817 +DRD5P2 1818 +DRG1 4733 +DRG1P1 151457 +DRG1P2 100421670 +DRG2 1819 +DRGX 644168 +DRICH1 51233 +DROSHA 29102 +DRP2 1821 +DSC1 1823 +DSC2 1824 +DSC3 1825 +DSCAM 1826 +DSCAM-AS1 100506492 +DSCAM-IT1 100874326 +DSCAML1 57453 +DSCAS 101927698 +DSCC1 79075 +DSCR4 10281 +DSCR4-IT1 100874327 +DSCR8 84677 +DSCR9 257203 +DSCR10 259234 +DSE 29940 +DSEL 92126 +DSEL-AS1 643542 +DSG1 1828 +DSG1-AS1 101927718 +DSG2 1829 +DSG2-AS1 100652770 +DSG3 1830 +DSG4 147409 +DSN1 79980 +DSP 1832 +DSP-AS1 101928076 +DSPP 1834 +DST 667 +DST-AS1 101930010 +DSTN 11034 +DSTNP1 387492 +DSTNP2 171220 +DSTNP3 100287016 +DSTNP4 729454 +DSTNP5 100132132 +DSTYK 25778 +DTD1 92675 +DTD1-AS1 101929526 +DTD2 112487 +DTHD1 401124 +DTL 51514 +DTNA 1837 +DTNB 1838 +DTNB-AS1 101929272 +DTNBP1 84062 +DTWD1 56986 +DTWD1P1 124296660 +DTWD1P2 100419750 +DTWD2 285605 +DTX1 1840 +DTX2 113878 +DTX2P1 107161144 +DTX2P1-UPK3BP1-PMS2P11 441263 +DTX3 196403 +DTX3L 151636 +DTX4 23220 +DTYMK 1841 +DUBR 344595 +DUOX1 53905 +DUOX2 50506 +DUOXA1 90527 +DUOXA2 405753 +DUS1L 64118 +DUS2 54920 +DUS3L 56931 +DUS4L 11062 +DUS4L-BCAP29 115253422 +DUSP1 1843 +DUSP2 1844 +DUSP3 1845 +DUSP4 1846 +DUSP5 1847 +DUSP5-DT 105378481 +DUSP5P1 574029 +DUSP5P2 643459 +DUSP6 1848 +DUSP7 1849 +DUSP8 1850 +DUSP8P1 441554 +DUSP8P2 728657 +DUSP8P5 106903081 +DUSP9 1852 +DUSP10 11221 +DUSP11 8446 +DUSP12 11266 +DUSP12P1 100420473 +DUSP13A 128854680 +DUSP13B 51207 +DUSP14 11072 +DUSP15 128853 +DUSP16 80824 +DUSP18 150290 +DUSP19 142679 +DUSP21 63904 +DUSP22 56940 +DUSP23 54935 +DUSP26 78986 +DUSP28 285193 +DUSP29 338599 +DUT 1854 +DUT-AS1 107984757 +DUTP1 548637 +DUTP2 100873909 +DUTP3 100861485 +DUTP4 100873910 +DUTP5 100873911 +DUTP6 100873912 +DUTP7 100873913 +DUTP8 100873914 +DUX1 26584 +DUX3 26582 +DUX4 100288687 +DUX4L1 22947 +DUX4L2 728410 +DUX4L3 653548 +DUX4L4 441056 +DUX4L5 653545 +DUX4L6 653544 +DUX4L7 653543 +DUX4L8 26583 +DUX4L9 100288711 +DUX4L10 440013 +DUX4L11 399839 +DUX4L12 440014 +DUX4L13 100289581 +DUX4L14 728022 +DUX4L15 440017 +DUX4L16 728169 +DUX4L17 643001 +DUX4L18 100132421 +DUX4L19 643034 +DUX4L20 102723538 +DUX4L21 102723518 +DUX4L22 102723495 +DUX4L23 102723472 +DUX4L24 102723449 +DUX4L25 102723423 +DUX4L26 100996350 +DUX4L27 100131369 +DUX4L28 106481728 +DUX4L29 106481970 +DUX4L31 100887073 +DUX4L32 107075316 +DUX4L33 107080551 +DUX4L34 105379479 +DUX4L35 106632270 +DUX4L36 107080642 +DUX4L37 107080108 +DUX4L38 107080648 +DUX4L39 107080645 +DUX4L40 107080649 +DUX4L41 107080650 +DUX4L42 106660607 +DUX4L43 106660617 +DUX4L44 107080651 +DUX4L45 100887074 +DUX4L46 106480349 +DUX4L47 106481738 +DUX4L48 107105251 +DUX4L49 107105252 +DUX4L50 106480350 +DUX4L51 106481740 +DUX4L52 106480354 +DUX5 26581 +DUXA 503835 +DUXAP1 503630 +DUXAP2 503631 +DUXAP3 503632 +DUXAP4 503633 +DUXAP5 503634 +DUXAP6 503635 +DUXAP7 503636 +DUXAP8 503637 +DUXAP9 503638 +DUXAP10 503639 +DUXAP11 106481741 +DUXAP12 100419081 +DUXB 100033411 +DVL1 1855 +DVL1P1 8215 +DVL2 1856 +DVL3 1857 +DXO 1797 +DYDC1 143241 +DYDC2 84332 +DYM 54808 +DYM-AS1 100129878 +DYNAP 284254 +DYNAPP1 124544573 +DYNAPP2 125078041 +DYNAPP3 125078044 +DYNC1H1 1778 +DYNC1I1 1780 +DYNC1I2 1781 +DYNC1I2P1 728532 +DYNC1LI1 51143 +DYNC1LI2 1783 +DYNC1LI2-DT 106699570 +DYNC2H1 79659 +DYNC2I1 55112 +DYNC2I2 89891 +DYNC2LI1 51626 +DYNLL1 8655 +DYNLL1P1 246720 +DYNLL1P2 731308 +DYNLL1P3 391012 +DYNLL1P4 100129739 +DYNLL1P5 106480681 +DYNLL1P6 100288885 +DYNLL1P7 729630 +DYNLL2 140735 +DYNLL2-DT 101927666 +DYNLRB1 83658 +DYNLRB2 83657 +DYNLRB2-AS1 102724084 +DYNLT1 6993 +DYNLT2 6991 +DYNLT2B 255758 +DYNLT3 6990 +DYNLT3P1 170554 +DYNLT3P2 100381215 +DYNLT4 343521 +DYNLT5 200132 +DYRK1A 1859 +DYRK1B 9149 +DYRK2 8445 +DYRK3 8444 +DYRK3-AS1 105372876 +DYRK4 8798 +DYSF 8291 +DYTN 391475 +DZANK1 55184 +DZIP1 22873 +DZIP1L 199221 +DZIP3 9666 +E2F1 1869 +E2F2 1870 +E2F3 1871 +E2F3-IT1 100874268 +E2F3P1 1872 +E2F3P2 100420003 +E2F4 1874 +E2F4P1 100131899 +E2F5 1875 +E2F5-DT 102723322 +E2F6 1876 +E2F6P1 386610 +E2F6P2 376818 +E2F6P3 100420178 +E2F6P4 139542 +E2F7 144455 +E2F8 79733 +E4F1 1877 +EAF1 85403 +EAF1-AS1 100873956 +EAF2 55840 +EAPP 55837 +EARS2 124454 +EBAG9 9166 +EBAG9P1 100422254 +EBF1 1879 +EBF2 64641 +EBF3 253738 +EBF3-AS1 105378558 +EBF4 57593 +EBI3 10148 +EBLN1 340900 +EBLN2 55096 +EBLN3P 100506710 +EBNA1BP2 10969 +EBP 10682 +EBPL 84650 +EBVM1 +EBVS1 1888 +ECD 11319 +ECE1 1889 +ECE1-AS1 100506801 +ECE2 9718 +ECEL1 9427 +ECEL1P1 100131546 +ECEL1P2 347694 +ECEL1P3 260332 +ECH1 1891 +ECHDC1 55862 +ECHDC2 55268 +ECHDC3 79746 +ECHS1 1892 +ECI1 1632 +ECI1-AS1 123706507 +ECI2 10455 +ECI2-DT 100507506 +ECM1 1893 +ECM1P1 100420354 +ECM1P2 106481698 +ECM2 1842 +ECMXP 105373381 +ECPAS 23392 +ECRG4 84417 +ECSCR 641700 +ECSIT 51295 +ECT2 1894 +ECT2L 345930 +EDA 1896 +EDA2R 60401 +EDAR 10913 +EDARADD 128178 +EDC3 80153 +EDC4 23644 +EDDM3A 10876 +EDDM3B 64184 +EDDM3CP 266643 +EDDM3DP 100128220 +EDDM13 100506374 +EDEM1 9695 +EDEM2 55741 +EDEM3 80267 +EDF1 8721 +EDIL3 10085 +EDIL3-DT 105379057 +EDN1 1906 +EDN2 1907 +EDN3 1908 +EDNRA 1909 +EDNRB 1910 +EDNRB-AS1 100505518 +EDRF1 26098 +EDRF1-AS1 101927983 +EDRF1-DT 399821 +EEA1 8411 +EED 8726 +EEDP1 266694 +EEF1A1 1915 +EEF1A1-AS1 124901342 +EEF1A1P1 54054 +EEF1A1P2 319112 +EEF1A1P3 100421865 +EEF1A1P4 100421854 +EEF1A1P5 158078 +EEF1A1P6 221838 +EEF1A1P7 390924 +EEF1A1P8 389179 +EEF1A1P9 441032 +EEF1A1P10 100421829 +EEF1A1P11 440595 +EEF1A1P12 644604 +EEF1A1P13 133283 +EEF1A1P14 647167 +EEF1A1P15 643563 +EEF1A1P16 387845 +EEF1A1P17 401717 +EEF1A1P18 100887747 +EEF1A1P19 100421796 +EEF1A1P20 100421797 +EEF1A1P21 100421807 +EEF1A1P22 645693 +EEF1A1P23 100421815 +EEF1A1P24 645715 +EEF1A1P25 646612 +EEF1A1P26 100128637 +EEF1A1P27 100130234 +EEF1A1P28 442709 +EEF1A1P29 100130211 +EEF1A1P30 402420 +EEF1A1P31 553820 +EEF1A1P32 730232 +EEF1A1P33 390352 +EEF1A1P34 100132358 +EEF1A1P35 389223 +EEF1A1P36 100421820 +EEF1A1P37 100421825 +EEF1A1P38 124199 +EEF1A1P39 100862850 +EEF1A1P40 100874490 +EEF1A1P41 100874491 +EEF1A1P42 442215 +EEF1A1P43 1918 +EEF1A1P44 100421840 +EEF1A1P45 100421817 +EEF1A1P46 441880 +EEF1A1P47 401677 +EEF1A1P48 729856 +EEF1A1P49 642791 +EEF1A1P50 100421798 +EEF1A2 1917 +EEF1AKMT1 221143 +EEF1AKMT2 399818 +EEF1AKMT3 25895 +EEF1AKMT4 110599564 +EEF1AKMT4-ECE2 110599583 +EEF1B2 1933 +EEF1B2P1 1932 +EEF1B2P2 1934 +EEF1B2P3 644820 +EEF1B2P4 100130631 +EEF1B2P5 442227 +EEF1B2P6 647030 +EEF1B2P7 100421756 +EEF1B2P8 100421774 +EEF1D 1936 +EEF1DP1 126037 +EEF1DP2 442429 +EEF1DP3 196549 +EEF1DP4 442325 +EEF1DP5 442258 +EEF1DP6 644357 +EEF1DP7 100422656 +EEF1DP8 283236 +EEF1E1 9521 +EEF1E1-BLOC1S5 100526837 +EEF1E1P1 100130388 +EEF1G 1937 +EEF1GP1 646837 +EEF1GP2 100130260 +EEF1GP3 651628 +EEF1GP4 100129403 +EEF1GP5 642357 +EEF1GP6 100421733 +EEF1GP7 645311 +EEF1GP8 391698 +EEF2 1938 +EEF2K 29904 +EEF2KMT 196483 +EEFSEC 60678 +EEIG1 399665 +EEIG2 284611 +EEPD1 80820 +EFCAB2 84288 +EFCAB3 146779 +EFCAB3P1 125775236 +EFCAB5 374786 +EFCAB6 64800 +EFCAB6-AS1 100874197 +EFCAB6-DT 107985564 +EFCAB7 84455 +EFCAB8 388795 +EFCAB9 285588 +EFCAB10 100130771 +EFCAB10-AS1 127138863 +EFCAB11 90141 +EFCAB12 90288 +EFCAB13 124989 +EFCAB13-DT 102724508 +EFCAB14 9813 +EFCAB14-AS1 100130197 +EFCAB14P1 106479047 +EFCAB15P 118568824 +EFCC1 79825 +EFEMP1 2202 +EFEMP2 30008 +EFHB 151651 +EFHC1 114327 +EFHC2 80258 +EFHD1 80303 +EFHD2 79180 +EFHD2-AS1 101927441 +EFL1 79631 +EFL1P1 648809 +EFL1P2 100422019 +EFNA1 1942 +EFNA2 1943 +EFNA3 1944 +EFNA4 1945 +EFNA5 1946 +EFNB1 1947 +EFNB2 1948 +EFNB3 1949 +EFR3A 23167 +EFR3B 22979 +EFS 10278 +EFTUD2 9343 +EGF 1950 +EGFEM1P 93556 +EGFL6 25975 +EGFL7 51162 +EGFL8 80864 +EGFLAM 133584 +EGFLAM-AS1 100874117 +EGFLAM-AS2 100506475 +EGFLAM-AS3 100874116 +EGFLAM-AS4 100852408 +EGFR 1956 +EGFR-AS1 100507500 +EGILA 116435281 +EGLN1 54583 +EGLN1P1 106660614 +EGLN2 112398 +EGLN3 112399 +EGLN3-AS1 105370445 +EGLN3P1 100420503 +EGOT 100126791 +EGR1 1958 +EGR2 1959 +EGR3 1960 +EGR4 1961 +EHBP1 23301 +EHBP1-AS1 100132215 +EHBP1L1 254102 +EHD1 10938 +EHD2 30846 +EHD3 30845 +EHD4 30844 +EHD4-AS1 101928363 +EHF 26298 +EHHADH 1962 +EHHADH-AS1 339926 +EHMT1 79813 +EHMT2 10919 +EHMT2-AS1 107986588 +EI24 9538 +EI24P1 100129423 +EI24P2 100129866 +EI24P3 100131881 +EI24P4 100420072 +EI24P5 100533660 +EI24P6 127482540 +EID1 23741 +EID2 163126 +EID2B 126272 +EID3 493861 +EIF1 10209 +EIF1AD 84285 +EIF1AX 1964 +EIF1AX-AS1 100874078 +EIF1AXP1 280661 +EIF1AXP2 106479036 +EIF1AY 9086 +EIF1B 10289 +EIF1B-AS1 440952 +EIF1P1 100505855 +EIF1P2 100288425 +EIF1P3 730144 +EIF1P4 100130566 +EIF1P5 106481690 +EIF1P6 106480277 +EIF1P7 106481691 +EIF2A 83939 +EIF2AK1 27102 +EIF2AK1P1 731755 +EIF2AK2 5610 +EIF2AK3 9451 +EIF2AK3-DT 101928403 +EIF2AK4 440275 +EIF2AP1 100874393 +EIF2AP2 100874394 +EIF2AP3 100874395 +EIF2AP4 100874401 +EIF2B1 1967 +EIF2B2 8892 +EIF2B3 8891 +EIF2B4 8890 +EIF2B5 8893 +EIF2B5-DT 105374249 +EIF2D 1939 +EIF2S1 1965 +EIF2S2 8894 +EIF2S2P1 319115 +EIF2S2P2 347673 +EIF2S2P3 283014 +EIF2S2P4 728350 +EIF2S2P5 347675 +EIF2S2P6 100129629 +EIF2S2P7 647016 +EIF2S3 1968 +EIF2S3B 255308 +EIF3A 8661 +EIF3B 8662 +EIF3C 8663 +EIF3CL 728689 +EIF3D 8664 +EIF3E 3646 +EIF3EP1 3647 +EIF3EP2 100132597 +EIF3EP3 100462836 +EIF3EP4 100422200 +EIF3F 8665 +EIF3FP1 54053 +EIF3FP2 83880 +EIF3FP3 339799 +EIF3G 8666 +EIF3H 8667 +EIF3I 8668 +EIF3IP1 442720 +EIF3J 8669 +EIF3J-DT 645212 +EIF3JP1 117981790 +EIF3JP2 730021 +EIF3JP3 649166 +EIF3K 27335 +EIF3KP1 134505 +EIF3KP2 100129045 +EIF3KP3 645368 +EIF3L 51386 +EIF3LP1 319117 +EIF3LP2 143341 +EIF3LP3 340947 +EIF3M 10480 +EIF3MP1 266683 +EIF4A1 1973 +EIF4A1P1 54052 +EIF4A1P2 359792 +EIF4A1P3 100462824 +EIF4A1P4 728698 +EIF4A1P5 390394 +EIF4A1P6 390407 +EIF4A1P7 341784 +EIF4A1P8 100289102 +EIF4A1P9 642746 +EIF4A1P10 100421533 +EIF4A1P11 100130006 +EIF4A1P12 100462830 +EIF4A1P13 100462826 +EIF4A2 1974 +EIF4A2P1 646171 +EIF4A2P2 100421579 +EIF4A2P3 100133309 +EIF4A2P4 286512 +EIF4A2P5 106480446 +EIF4A3 9775 +EIF4A3P1 390843 +EIF4B 1975 +EIF4BP1 319118 +EIF4BP2 100129337 +EIF4BP3 100128771 +EIF4BP4 100130064 +EIF4BP5 100421528 +EIF4BP6 645579 +EIF4BP7 643873 +EIF4BP8 339881 +EIF4BP9 100129692 +EIF4E 1977 +EIF4E1B 253314 +EIF4E2 9470 +EIF4E2P1 128770 +EIF4E2P2 645207 +EIF4E3 317649 +EIF4EBP1 1978 +EIF4EBP1P1 326295 +EIF4EBP1P2 768328 +EIF4EBP2 1979 +EIF4EBP2P1 170510 +EIF4EBP2P2 100190923 +EIF4EBP2P3 100190924 +EIF4EBP3 8637 +EIF4ENIF1 56478 +EIF4EP1 1980 +EIF4EP2 100131693 +EIF4EP3 100132918 +EIF4EP4 100421455 +EIF4EP5 100131565 +EIF4G1 1981 +EIF4G2 1982 +EIF4G3 8672 +EIF4H 7458 +EIF4HP1 401316 +EIF4HP2 100421545 +EIF5 1983 +EIF5-DT 105370687 +EIF5A 1984 +EIF5A2 56648 +EIF5A2P1 100506058 +EIF5AL1 143244 +EIF5AP2 1986 +EIF5AP3 1987 +EIF5AP4 642592 +EIF5B 9669 +EIF5P1 100421390 +EIF5P2 100421391 +EIF6 3692 +EIPR1 7260 +EIPR1-IT1 100874301 +ELAC1 55520 +ELAC2 60528 +ELANE 1991 +ELAPOR1 57535 +ELAPOR2 222223 +ELAVL1 1994 +ELAVL2 1993 +ELAVL3 1995 +ELAVL4 1996 +ELAVL4-AS1 107984955 +ELDR 102725541 +ELF1 1997 +ELF2 1998 +ELF2P1 100101917 +ELF2P2 260335 +ELF2P3 260336 +ELF2P4 644935 +ELF3 1999 +ELF3-AS1 102723465 +ELF4 2000 +ELF5 2001 +ELFN1 392617 +ELFN1-AS1 101927125 +ELFN2 114794 +ELK1 2002 +ELK1P1 647102 +ELK2AP 2003 +ELK2BP 9995 +ELK3 2004 +ELK4 2005 +ELL 8178 +ELL2 22936 +ELL2P1 646270 +ELL2P2 100421143 +ELL2P3 100533713 +ELL2P4 100128690 +ELL3 80237 +ELMO1 9844 +ELMO1-AS1 100861514 +ELMO2 63916 +ELMO2P1 729894 +ELMO3 79767 +ELMOD1 55531 +ELMOD2 255520 +ELMOD3 84173 +ELN 2006 +ELN-AS1 107986809 +ELOA 6924 +ELOA-AS1 100506963 +ELOA2 51224 +ELOA3BP 728929 +ELOA3CP 107983955 +ELOA3DP 100506888 +ELOA3P 162699 +ELOAP1 100422580 +ELOB 6923 +ELOBP1 246717 +ELOBP2 253665 +ELOBP3 100856810 +ELOBP4 100874519 +ELOC 6921 +ELOCP2 283747 +ELOCP3 644540 +ELOCP4 100462873 +ELOCP5 100288493 +ELOCP6 100462867 +ELOCP7 100462868 +ELOCP8 100462869 +ELOCP9 100462870 +ELOCP10 100462871 +ELOCP11 100462872 +ELOCP12 100462874 +ELOCP13 100462875 +ELOCP14 100462876 +ELOCP15 100462877 +ELOCP16 100462878 +ELOCP17 100462879 +ELOCP18 100130626 +ELOCP19 100462880 +ELOCP20 100287778 +ELOCP21 100462866 +ELOCP22 100287579 +ELOCP23 100462881 +ELOCP24 100287692 +ELOCP26 118097967 +ELOCP27 107133523 +ELOCP28 100287483 +ELOCP29 100132973 +ELOCP30 106481670 +ELOCP31 100422582 +ELOCP32 106481964 +ELOCP33 101928827 +ELOCP34 106481671 +ELOCP35 106480250 +ELOCP36 101059905 +ELOF1 84337 +ELOVL1 64834 +ELOVL2 54898 +ELOVL2-AS1 100506409 +ELOVL3 83401 +ELOVL4 6785 +ELOVL5 60481 +ELOVL6 79071 +ELOVL7 79993 +ELP1 8518 +ELP2 55250 +ELP3 55140 +ELP4 26610 +ELP5 23587 +ELP6 54859 +ELSPBP1 64100 +EMB 133418 +EMBP1 647121 +EMC1 23065 +EMC1-AS1 101927895 +EMC2 9694 +EMC3 55831 +EMC3-AS1 442075 +EMC4 51234 +EMC6 83460 +EMC7 56851 +EMC8 10328 +EMC9 51016 +EMC10 284361 +EMCN 51705 +EMD 2010 +EME1 146956 +EME2 197342 +EMG1 10436 +EMICERI 128385368 +EMID1 129080 +EMILIN1 11117 +EMILIN2 84034 +EMILIN3 90187 +EML1 2009 +EML2 24139 +EML2-AS1 100287177 +EML3 256364 +EML4 27436 +EML4-AS1 102723824 +EML5 161436 +EML6 400954 +EML6-AS1 105374667 +EMP1 2012 +EMP2 2013 +EMP2P1 391359 +EMP3 2014 +EMSLR 101927746 +EMSY 56946 +EMSY-DT 124902718 +EMX1 2016 +EMX2 2018 +EMX2OS 196047 +EN1 2019 +EN2 2020 +EN2-DT 121832807 +ENAH 55740 +ENAHP1 100131685 +ENAM 10117 +ENC1 8507 +ENDOD1 23052 +ENDOG 2021 +ENDOU 8909 +ENDOV 284131 +ENEMAL 129810501 +ENG 2022 +ENGASE 64772 +ENHO 375704 +ENKD1 84080 +ENKUR 219670 +ENO1 2023 +ENO1-AS1 100505975 +ENO1P1 2025 +ENO1P2 100419098 +ENO1P3 100419069 +ENO1P4 100885799 +ENO2 2026 +ENO3 2027 +ENO4 387712 +ENOPH1 58478 +ENOPH1P1 647299 +ENOSF1 55556 +ENOX1 55068 +ENOX1-AS1 100874129 +ENOX1-AS2 100874130 +ENOX2 10495 +ENOX2-AS1 105373338 +ENPEP 2028 +ENPP1 5167 +ENPP2 5168 +ENPP3 5169 +ENPP4 22875 +ENPP5 59084 +ENPP6 133121 +ENPP7 339221 +ENPP7P1 100421823 +ENPP7P2 100421813 +ENPP7P3 106481658 +ENPP7P4 100421816 +ENPP7P5 106480674 +ENPP7P6 107133511 +ENPP7P7 100421859 +ENPP7P8 100421860 +ENPP7P9 100421803 +ENPP7P10 100421805 +ENPP7P11 100421806 +ENPP7P12 106480230 +ENPP7P13 104644205 +ENPP7P14 106481720 +ENPP7P15 121832813 +ENSA 2029 +ENSAP1 170511 +ENSAP2 319114 +ENSAP3 100128203 +ENTHD1 150350 +ENTPD1 953 +ENTPD1-AS1 728558 +ENTPD2 954 +ENTPD3 956 +ENTPD3-AS1 285266 +ENTPD4 9583 +ENTPD4-DT 121009645 +ENTPD5 957 +ENTPD6 955 +ENTPD7 57089 +ENTPD8 377841 +ENTR1 10807 +ENTR1P1 388478 +ENTR1P2 646891 +ENTREP1 9413 +ENTREP2 23359 +ENTREP3 10712 +ENY2 56943 +EOGT 285203 +EOGT-DT 121676928 +EOLA1 91966 +EOLA1-DT 100131434 +EOLA2 541578 +EOLA2-DT 100272228 +EOMES 8320 +EP300 2033 +EP300-AS1 101927279 +EP400 57634 +EP400P1 347918 +EPAS1 2034 +EPB41 2035 +EPB41L1 2036 +EPB41L1-AS1 100130373 +EPB41L2 2037 +EPB41L3 23136 +EPB41L4A 64097 +EPB41L4A-AS1 114915 +EPB41L4A-DT 54508 +EPB41L4B 54566 +EPB41L5 57669 +EPB42 2038 +EPC1 80314 +EPC1-AS1 102031319 +EPC1-AS2 128071537 +EPC2 26122 +EPCAM 4072 +EPCAM-DT 101927043 +EPCART 105373767 +EPDR1 54749 +EPG5 57724 +EPGN 255324 +EPHA1 2041 +EPHA1-AS1 285965 +EPHA2 1969 +EPHA2-AS1 101927479 +EPHA3 2042 +EPHA4 2043 +EPHA5 2044 +EPHA5-AS1 100144602 +EPHA6 285220 +EPHA7 2045 +EPHA8 2046 +EPHA10 284656 +EPHB1 2047 +EPHB2 2048 +EPHB3 2049 +EPHB4 2050 +EPHB6 2051 +EPHX1 2052 +EPHX2 2053 +EPHX3 79852 +EPHX4 253152 +EPIC1 284930 +EPIST 101927953 +EPM2A 7957 +EPM2A-DT 100507557 +EPM2AIP1 9852 +EPN1 29924 +EPN2 22905 +EPN2-AS1 100874018 +EPN2-IT1 100874309 +EPN3 55040 +EPO 2056 +EPOP 100170841 +EPOR 2057 +EPPIN 57119 +EPPIN-WFDC6 100526773 +EPPK1 83481 +EPRS1 2058 +EPS8 2059 +EPS8L1 54869 +EPS8L2 64787 +EPS8L3 79574 +EPS15 2060 +EPS15-AS1 105378720 +EPS15L1 58513 +EPS15P1 55380 +EPSTI1 94240 +EPX 8288 +EPYC 1833 +EQTN 54586 +ERAL1 26284 +ERAP1 51752 +ERAP2 64167 +ERAS 3266 +ERBB2 2064 +ERBB3 2065 +ERBB4 2066 +ERBIN 55914 +ERBIN-DT 118732300 +ERC1 23085 +ERC2 26059 +ERC2-IT1 711 +ERCC1 2067 +ERCC2 2068 +ERCC3 2071 +ERCC4 2072 +ERCC5 2073 +ERCC6 2074 +ERCC6L 54821 +ERCC6L2 375748 +ERCC6L2-AS1 100128782 +ERCC8 1161 +ERCC8-AS1 105378991 +ERDA1 9030 +EREG 2069 +ERF 2077 +ERFE 151176 +ERFL 390937 +ERG 2078 +ERG28 11161 +ERGIC1 57222 +ERGIC2 51290 +ERGIC3 51614 +ERH 2079 +ERHP1 100507125 +ERHP2 100874403 +ERI1 90459 +ERI2 112479 +ERI3 79033 +ERI3-IT1 100874278 +ERICD 104355217 +ERICH1 157697 +ERICH2 285141 +ERICH2-DT 101926913 +ERICH3 127254 +ERICH3-AS1 101927320 +ERICH4 100170765 +ERICH5 203111 +ERICH6 131831 +ERICH6-AS1 101928085 +ERICH6B 220081 +ERLEC1 27248 +ERLEC1P1 100288870 +ERLIN1 10613 +ERLIN2 11160 +ERLNC1 101929441 +ERMAP 114625 +ERMARD 55780 +ERMN 57471 +ERMP1 79956 +ERN1 2081 +ERN2 10595 +ERO1A 30001 +ERO1B 56605 +ERP27 121506 +ERP29 10961 +ERP29P1 100420612 +ERP44 23071 +ERRFI1 54206 +ERRFI1-DT 121832806 +ERV3-1 2086 +ERV3-2 57612 +ERV9-1 100616497 +ERV18-1 100133791 +ERVE-1 85314 +ERVE-2 100862691 +ERVE-3 100862700 +ERVE-4 100616105 +ERVFC1-1 346547 +ERVFH21-1 100616104 +ERVFRD-1 405754 +ERVFRD-2 107985332 +ERVFRD-3 100533725 +ERVH-1 100616446 +ERVH-2 100616461 +ERVH-3 100289683 +ERVH-4 51359 +ERVH-5 100862699 +ERVH-6 51581 +ERVH-7 100862698 +ERVH-8 +ERVH-9 +ERVH-10 +ERVH48-1 90625 +ERVI-1 100131068 +ERVK-1 100862690 +ERVK-2 100616100 +ERVK-3 100862689 +ERVK-4 60359 +ERVK-5 60358 +ERVK-6 64006 +ERVK-7 449619 +ERVK-8 619465 +ERVK-9 100616102 +ERVK-10 100616101 +ERVK-11 100862688 +ERVK-12 100616442 +ERVK-13 100861467 +ERVK-14 100862687 +ERVK-15 100616443 +ERVK-16 100616411 +ERVK-17 100862686 +ERVK-18 100775105 +ERVK-19 105376906 +ERVK-20 100616444 +ERVK-21 100616103 +ERVK-22 100616445 +ERVK-23 100616197 +ERVK-24 100862684 +ERVK-25 100862683 +ERVK-26 103539957 +ERVK-27 106144566 +ERVK-28 106707175 +ERVK-29 106144555 +ERVK-30 106144591 +ERVK-31 106144590 +ERVK-32 110006328 +ERVK3-1 105372481 +ERVK3-2 100862697 +ERVK3-3 100616462 +ERVK3-4 100616106 +ERVK3-5 100616412 +ERVK3-6 100616107 +ERVK3-7 100616199 +ERVK3-8 100616108 +ERVK9-1 111188150 +ERVK9-2 111188149 +ERVK9-3 111188148 +ERVK9-4 111188143 +ERVK9-5 111188147 +ERVK9-6 111188146 +ERVK9-7 111188142 +ERVK9-8 111188145 +ERVK9-9 111188137 +ERVK9-10 111188144 +ERVK9-11 111188141 +ERVK9-12 105375011 +ERVK11-1 100859922 +ERVK13-1 100507321 +ERVMER34-1 100288413 +ERVMER61-1 339476 +ERVPABLB-1 100862693 +ERVS71-1 105372315 +ERVS71-2 100616200 +ERVV-1 147664 +ERVV-2 100271846 +ERVW-1 30816 +ERVW-2 100379323 +ERVW-3 100862696 +ERVW-4 100616496 +ERVW-5 100862695 +ERVW-6 100616198 +ERVW-7 106144589 +ERVW-8 106144559 +ERVW-9 106699568 +ERVW-10 106144579 +ERVW-11 106144560 +ERVW-12 106144580 +ERVW-13 106144576 +ERVW-14 106144561 +ERVW-15 106144597 +ERVW-16 106144581 +ERVW-17 106144567 +ERVW-18 106144562 +ERVW-19 106144571 +ERVW-20 106144604 +ERVW-21 106144587 +ERVW-22 106144563 +ERVW-23 106144603 +ERVW-24 106144564 +ERVW-25 106144605 +ERVW-26 106144572 +ERVW-27 106144565 +ERVW-28 105694156 +ERVW-29 106144583 +ESA4 2090 +ESAM 90952 +ESAM-AS1 101929340 +ESAT 2096 +ESB3 2097 +ESCO1 114799 +ESCO2 157570 +ESD 2098 +ESF1 51575 +ESM1 11082 +ESPL1 9700 +ESPN 83715 +ESPNL 339768 +ESPNP 284729 +ESR1 2099 +ESR2 2100 +ESRG 790952 +ESRP1 54845 +ESRP2 80004 +ESRRA 2101 +ESRRAP1 144847 +ESRRAP2 144832 +ESRRB 2103 +ESRRG 2104 +ESS2 8220 +ESX1 80712 +ESYT1 23344 +ESYT2 57488 +ESYT3 83850 +ETAA1 54465 +ETDA 101928677 +ETDB 100129515 +ETDC 110806299 +ETF1 2107 +ETF1P1 6824 +ETF1P2 6825 +ETF1P3 100132121 +ETFA 2108 +ETFB 2109 +ETFBKMT 254013 +ETFDH 2110 +ETFRF1 144363 +ETHE1 23474 +ETNK1 55500 +ETNK1-DT 105369691 +ETNK2 55224 +ETNPPL 64850 +ETS1 2113 +ETS1-AS1 101929517 +ETS2 2114 +ETS2-AS1 400867 +ETS2P1 100131617 +ETV1 2115 +ETV2 2116 +ETV3 2117 +ETV3L 440695 +ETV4 2118 +ETV5 2119 +ETV5-AS1 100873934 +ETV6 2120 +ETV7 51513 +ETV7-AS1 105375037 +EVA1A 84141 +EVA1A-AS 101927884 +EVA1B 55194 +EVA1C 59271 +EVA1CP1 100420821 +EVA1CP2 100420818 +EVA1CP3 100420863 +EVA1CP4 100420907 +EVA1CP5 122149298 +EVA1CP6 122149299 +EVC 2121 +EVC2 132884 +EVI2A 2123 +EVI2B 2124 +EVI5 7813 +EVI5L 115704 +EVL 51466 +EVPL 2125 +EVPLL 645027 +EVX1 2128 +EVX1-AS 101410536 +EVX2 344191 +EWSAT1 283673 +EWSR1 2130 +EXD1 161829 +EXD2 55218 +EXD3 54932 +EXO1 9156 +EXO5 64789 +EXO5-DT 105378672 +EXOC1 55763 +EXOC1L 644145 +EXOC2 55770 +EXOC3 11336 +EXOC3-AS1 116349 +EXOC3L1 283849 +EXOC3L2 90332 +EXOC3L4 91828 +EXOC4 60412 +EXOC5 10640 +EXOC5P1 644548 +EXOC6 54536 +EXOC6B 23233 +EXOC7 23265 +EXOC7P1 391681 +EXOC8 149371 +EXOG 9941 +EXOGP1 100128324 +EXOSC1 51013 +EXOSC2 23404 +EXOSC3 51010 +EXOSC3P1 100151640 +EXOSC3P2 100190954 +EXOSC4 54512 +EXOSC5 56915 +EXOSC6 118460 +EXOSC7 23016 +EXOSC8 11340 +EXOSC9 5393 +EXOSC10 5394 +EXOSC10-AS1 105376736 +EXPH5 23086 +EXT1 2131 +EXT2 2132 +EXTL1 2134 +EXTL2 2135 +EXTL2P1 100287682 +EXTL3 2137 +EXTL3-AS1 101929402 +EYA1 2138 +EYA2 2139 +EYA2-AS1 101927355 +EYA3 2140 +EYA4 2070 +EYS 346007 +EZH1 2145 +EZH2 2146 +EZH2P1 266693 +EZHIP 340602 +EZR 7430 +EZR-AS1 101409257 +EZRP1 391562 +F2 2147 +F2R 2149 +F2RL1 2150 +F2RL2 2151 +F2RL3 9002 +F3 2152 +F5 2153 +F7 2155 +F7R 2156 +F8 2157 +F8A1 8263 +F8A2 474383 +F8A3 474384 +F9 2158 +F10 2159 +F10-AS1 104413892 +F11 2160 +F11-AS1 285441 +F11R 50848 +F12 2161 +F13A1 2162 +F13B 2165 +FA2H 79152 +FAAH 2166 +FAAH2 158584 +FAAHP1 729041 +FAAP20 199990 +FAAP24 91442 +FAAP100 80233 +FABP1 2168 +FABP2 2169 +FABP3 2170 +FABP3P2 56677 +FABP4 2167 +FABP5 2171 +FABP5P1 387934 +FABP5P2 729163 +FABP5P3 220832 +FABP5P4 404766 +FABP5P5 100288964 +FABP5P6 100130687 +FABP5P7 728641 +FABP5P8 728729 +FABP5P9 642956 +FABP5P10 344332 +FABP5P11 266699 +FABP5P12 100270673 +FABP5P13 106480712 +FABP5P14 100873957 +FABP5P15 100873958 +FABP6 2172 +FABP6-AS1 105377690 +FABP7 2173 +FABP7P1 100506953 +FABP7P2 100874317 +FABP9 646480 +FABP12 646486 +FABP12P1 106479057 +FADD 8772 +FADS1 3992 +FADS2 9415 +FADS2B 643181 +FADS3 3995 +FADS6 283985 +FAF1 11124 +FAF1-AS1 105378715 +FAF2 23197 +FAF2P1 100128043 +FAH 2184 +FAHD1 81889 +FAHD2A 51011 +FAHD2B 151313 +FAHD2CP 729234 +FAHD2P1 729610 +FAIM 55179 +FAIM2 23017 +FALEC 100874054 +FAM3A 60343 +FAM3B 54097 +FAM3C 10447 +FAM3C2P 286460 +FAM3D 131177 +FAM3D-AS1 105377108 +FAM8A1 51439 +FAM8A2P 728097 +FAM8A3P 100129594 +FAM8A4P 386726 +FAM8A5P 114181 +FAM8A6P 114182 +FAM8A7P 386725 +FAM8A9P 386727 +FAM8A10P 386728 +FAM9A 171482 +FAM9B 171483 +FAM9C 171484 +FAM9CP1 123464508 +FAM13A 10144 +FAM13A-AS1 285512 +FAM13B 51306 +FAM13B-AS1 100130172 +FAM13C 220965 +FAM20A 54757 +FAM20B 9917 +FAM20BP1 100421510 +FAM20C 56975 +FAM21EP 100421577 +FAM21FP 100288690 +FAM24A 118670 +FAM24B 196792 +FAM25A 643161 +FAM25BP 100132929 +FAM25C 644054 +FAM25EP 643479 +FAM25G 100133093 +FAM27B 100133121 +FAM27C 100132948 +FAM27D1 724094 +FAM27E2 100289124 +FAM27E3 100131997 +FAM27E4 107987001 +FAM27E5 284123 +FAM30A 9834 +FAM30B 105379202 +FAM30C 654499 +FAM32A 26017 +FAM32BP 399656 +FAM32CP 645646 +FAM32DP 100190955 +FAM32EP 100190956 +FAM41AY1 340618 +FAM41AY2 100302526 +FAM41C 284593 +FAM43A 131583 +FAM43B 163933 +FAM47A 158724 +FAM47B 170062 +FAM47C 442444 +FAM47DP 139249 +FAM47E 100129583 +FAM47E-STBD1 100631383 +FAM50A 9130 +FAM50B 26240 +FAM53A 152877 +FAM53B 9679 +FAM53B-AS1 101927944 +FAM53C 51307 +FAM66A 100133172 +FAM66B 100128890 +FAM66C 440078 +FAM66D 100132923 +FAM66E 100132103 +FAM72A 729533 +FAM72B 653820 +FAM72C 554282 +FAM72D 728833 +FAM74A1 401507 +FAM74A3 728495 +FAM74A4 401508 +FAM74A6 653123 +FAM74A7 100996582 +FAM76A 199870 +FAM76AP1 127460885 +FAM76B 143684 +FAM78A 286336 +FAM78B 149297 +FAM78B-AS1 105371586 +FAM81A 145773 +FAM81B 153643 +FAM83A 84985 +FAM83A-AS1 100131726 +FAM83A-AS2 125177378 +FAM83B 222584 +FAM83C 128876 +FAM83C-AS1 140846 +FAM83D 81610 +FAM83E 54854 +FAM83F 113828 +FAM83G 644815 +FAM83H 286077 +FAM85A 619423 +FAM85B 105379219 +FAM86B1 85002 +FAM86B2 653333 +FAM86B2-DT 100506990 +FAM86B3P 286042 +FAM86C1P 55199 +FAM86C2P 645332 +FAM86DP 692099 +FAM86EP 348926 +FAM86FP 653113 +FAM86GP 387745 +FAM86HP 729375 +FAM86JP 100125556 +FAM86KP 100287013 +FAM86LP 641924 +FAM86MP 644517 +FAM87A 157693 +FAM87B 400728 +FAM88B 728673 +FAM88C 102724238 +FAM88D 554249 +FAM88E 103908605 +FAM88F 103908604 +FAM89A 375061 +FAM89B 23625 +FAM90A1 55138 +FAM90A2P 729689 +FAM90A3P 389611 +FAM90A4P 441313 +FAM90A5P 441315 +FAM90A6P 389618 +FAM90A7 441317 +FAM90A8 441324 +FAM90A9 441327 +FAM90A10 441328 +FAM90A11P 441331 +FAM90A12P 645879 +FAM90A13P 441314 +FAM90A14 645651 +FAM90A15P 389630 +FAM90A16 441323 +FAM90A17 728746 +FAM90A18 441326 +FAM90A19 728753 +FAM90A20P 728430 +FAM90A21P 619418 +FAM90A22 645558 +FAM90A23 645572 +FAM90A24P 441332 +FAM90A25P 389633 +FAM90A26 100287045 +FAM90A27P 646508 +FAM90A28P 100128254 +FAM91A1 157769 +FAM91A2P 101929801 +FAM91A3P 729182 +FAM91A4P 100132306 +FAM95A 90499 +FAM95B1 100133036 +FAM95C 100289137 +FAM98A 25940 +FAM98B 283742 +FAM98C 147965 +FAM99A 387742 +FAM99B 100132464 +FAM104A 84923 +FAM104B 90736 +FAM106A 80039 +FAM106B 100996259 +FAM106C 100129396 +FAM106DP 100874406 +FAM107A 11170 +FAM107B 83641 +FAM110A 83541 +FAM110B 90362 +FAM110C 642273 +FAM110D 79927 +FAM111A 63901 +FAM111A-DT 101927204 +FAM111B 374393 +FAM114A1 92689 +FAM114A2 10827 +FAM117A 81558 +FAM117B 150864 +FAM118A 55007 +FAM118B 79607 +FAM120A 23196 +FAM120A2P 445577 +FAM120AOS 158293 +FAM120B 84498 +FAM120C 54954 +FAM124A 220108 +FAM124B 79843 +FAM131A 131408 +FAM131B 9715 +FAM131B-AS1 101928397 +FAM131B-AS2 100507507 +FAM131C 348487 +FAM131C2P 440568 +FAM133A 286499 +FAM133B 257415 +FAM133CP 728640 +FAM133DP 728066 +FAM133EP 100505694 +FAM133FP 100421606 +FAM133GP 100421617 +FAM135A 57579 +FAM135A-AS1 105377849 +FAM135B 51059 +FAM136A 84908 +FAM136BP 387071 +FAM136CP 100287852 +FAM136DP 390806 +FAM136EP 107985557 +FAM136FP 100128592 +FAM136GP 107985630 +FAM138A 645520 +FAM138B 654412 +FAM138C 654835 +FAM138D 677784 +FAM138E 100124412 +FAM138F 641702 +FAM149A 25854 +FAM149B1 317662 +FAM149B1P1 388181 +FAM151A 338094 +FAM151AP1 285303 +FAM151B 167555 +FAM151B-DT 121232370 +FAM153A 285596 +FAM153B 202134 +FAM153CP 653316 +FAM153DP 102724062 +FAM156A 29057 +FAM156B 727866 +FAM157A 728262 +FAM157B 100132403 +FAM157C 100996541 +FAM157D 125775238 +FAM161A 84140 +FAM161B 145483 +FAM162A 26355 +FAM162B 221303 +FAM163A 148753 +FAM163B 642968 +FAM167A 83648 +FAM167A-AS1 83656 +FAM167B 84734 +FAM168A 23201 +FAM168B 130074 +FAM169A 26049 +FAM169A-AS1 441086 +FAM169BP 283777 +FAM170A 340069 +FAM170B 170370 +FAM170B-AS1 100506733 +FAM171A1 221061 +FAM171A2 284069 +FAM171B 165215 +FAM172A 83989 +FAM172BP 131909 +FAM174A 345757 +FAM174A-DT 121232371 +FAM174B 400451 +FAM174C 55009 +FAM177A1 283635 +FAM177A1P1 728710 +FAM177B 400823 +FAM178B 51252 +FAM180A 389558 +FAM180B 399888 +FAM181A 90050 +FAM181A-AS1 283592 +FAM181B 220382 +FAM182A 284800 +FAM182B 728882 +FAM183BP 340286 +FAM183DP 101060105 +FAM183EP 107403081 +FAM184A 79632 +FAM184B 27146 +FAM185A 222234 +FAM185BP 641808 +FAM186A 121006 +FAM186B 84070 +FAM187A 100528020 +FAM187B 148109 +FAM187B2P 100421621 +FAM192BP 152667 +FAM193A 8603 +FAM193B 54540 +FAM193B-DT 105377750 +FAM197Y1 100289265 +FAM197Y2 252946 +FAM197Y3 107987341 +FAM197Y4 100289188 +FAM197Y5 100289150 +FAM197Y6 105379270 +FAM197Y7 105379269 +FAM197Y8 105379268 +FAM197Y9 100132932 +FAM197Y10 100288465 +FAM199X 139231 +FAM199YP 360029 +FAM200A 221786 +FAM200B 285550 +FAM200C 63920 +FAM201A 158228 +FAM201B 339742 +FAM204A 63877 +FAM204BP 100420875 +FAM204CP 100420916 +FAM204DP 100420963 +FAM207BP 729535 +FAM207CP 727987 +FAM209A 200232 +FAM209B 388799 +FAM210A 125228 +FAM210B 116151 +FAM210CP 100131328 +FAM215A 23591 +FAM215B 644297 +FAM216A 29902 +FAM216B 144809 +FAM217A 222826 +FAM217AP1 100133062 +FAM217B 63939 +FAM218A 152756 +FAM218BP 101059914 +FAM219A 203259 +FAM219B 57184 +FAM220A 84792 +FAM220BP 647044 +FAM220CP 100507415 +FAM221A 340277 +FAM221B 392307 +FAM222A 84915 +FAM222A-AS1 84983 +FAM222B 55731 +FAM223A 100132967 +FAM223B 286967 +FAM224A 401630 +FAM224B 401629 +FAM225A 286333 +FAM225B 100128385 +FAM226A 203429 +FAM226B 653687 +FAM227A 646851 +FAM227B 196951 +FAM228A 653140 +FAM228B 375190 +FAM229A 100128071 +FAM229B 619208 +FAM230A 653203 +FAM230B 642633 +FAM230C 26080 +FAM230D 100996415 +FAM230E 642643 +FAM230F 100996432 +FAM230G 101927859 +FAM230H 100996335 +FAM230I 388882 +FAM230J 729461 +FAM234A 83986 +FAM234B 57613 +FAM236A 100129407 +FAM236B 100132304 +FAM236C 109729126 +FAM236D 105373251 +FAM237A 200726 +FAM237B 107986818 +FAM238A 645528 +FAM238B 731789 +FAM238C 387644 +FAM239A 101930105 +FAM239B 729162 +FAM239C 107987330 +FAM240A 100132146 +FAM240B 110806297 +FAM240C 285095 +FAM241A 132720 +FAM241B 219738 +FAM242A 105372587 +FAM242B 105379478 +FAM242C 112488744 +FAM242D 112488742 +FAM242E 105379438 +FAM242F 105376064 +FAM245A 728218 +FAM245B 102724643 +FAM246A 117134598 +FAM246B 117134597 +FAM246C 117134596 +FAM247A 105372935 +FAM247B 117751732 +FAM247C 105377182 +FAM247D 105372942 +FAN1 22909 +FANCA 2175 +FANCB 2187 +FANCC 2176 +FANCD2 2177 +FANCD2OS 115795 +FANCD2P1 100421239 +FANCD2P2 101929530 +FANCE 2178 +FANCF 2188 +FANCG 2189 +FANCI 55215 +FANCL 55120 +FANCM 57697 +FANK1 92565 +FANK1-AS1 101410540 +FAP 2191 +FAR1 84188 +FAR1-IT1 106478978 +FAR1P1 100128011 +FAR2 55711 +FAR2P1 440905 +FAR2P2 100216479 +FAR2P3 100288897 +FAR2P4 100420005 +FARP1 10160 +FARP1-AS1 100874080 +FARP2 9855 +FARS2 10667 +FARS2-AS1 101927972 +FARSA 2193 +FARSA-AS1 106144598 +FARSB 10056 +FARSBP1 647532 +FAS 355 +FAS-AS1 100302740 +FASLG 356 +FASN 2194 +FASTK 10922 +FASTKD1 79675 +FASTKD2 22868 +FASTKD3 79072 +FASTKD5 60493 +FAT1 2195 +FAT1P1 170513 +FAT2 2196 +FAT3 120114 +FAT4 79633 +FATE1 89885 +FAU 2197 +FAUP1 140623 +FAUP2 100271125 +FAUP3 100271126 +FAUP4 101927789 +FAXC 84553 +FAXDC2 10826 +FBF1 85302 +FBH1 84893 +FBL 2091 +FBLIM1 54751 +FBLIM1P1 392536 +FBLIM1P2 401679 +FBLL1 345630 +FBLN1 2192 +FBLN2 2199 +FBLN5 10516 +FBLN7 129804 +FBLP1 100127981 +FBN1 2200 +FBN1-DT 105370809 +FBN2 2201 +FBN3 84467 +FBP1 2203 +FBP2 8789 +FBP2P1 100420269 +FBRS 64319 +FBRSL1 57666 +FBRSL1P1 100533621 +FBXL2 25827 +FBXL3 26224 +FBXL4 26235 +FBXL5 26234 +FBXL6 26233 +FBXL7 23194 +FBXL8 55336 +FBXL9P 26231 +FBXL12 54850 +FBXL12P1 402076 +FBXL13 222235 +FBXL14 144699 +FBXL15 79176 +FBXL16 146330 +FBXL17 64839 +FBXL18 80028 +FBXL19 54620 +FBXL19-AS1 283932 +FBXL20 84961 +FBXL21P 26223 +FBXL22 283807 +FBXO2 26232 +FBXO3 26273 +FBXO3-DT 101928440 +FBXO4 26272 +FBXO5 26271 +FBXO6 26270 +FBXO7 25793 +FBXO8 26269 +FBXO9 26268 +FBXO10 26267 +FBXO11 80204 +FBXO15 201456 +FBXO16 157574 +FBXO17 115290 +FBXO21 23014 +FBXO22 26263 +FBXO24 26261 +FBXO25 26260 +FBXO27 126433 +FBXO28 23219 +FBXO30 84085 +FBXO31 79791 +FBXO32 114907 +FBXO33 254170 +FBXO34 55030 +FBXO34-AS1 105370509 +FBXO36 130888 +FBXO36-IT1 100874344 +FBXO36P1 732538 +FBXO38 81545 +FBXO38-DT 102546294 +FBXO39 162517 +FBXO40 51725 +FBXO41 150726 +FBXO42 54455 +FBXO43 286151 +FBXO44 93611 +FBXO45 200933 +FBXO46 23403 +FBXO47 494188 +FBXO48 554251 +FBXW2 26190 +FBXW4 6468 +FBXW4P1 26226 +FBXW5 54461 +FBXW7 55294 +FBXW7-AS1 102191832 +FBXW8 26259 +FBXW9 84261 +FBXW10 10517 +FBXW10B 374286 +FBXW11 23291 +FBXW11P1 54099 +FBXW12 285231 +FCAMR 83953 +FCAR 2204 +FCER1A 2205 +FCER1G 2207 +FCER2 2208 +FCF1 51077 +FCF1P1 100422533 +FCF1P2 101060195 +FCF1P3 100128733 +FCF1P4 106480799 +FCF1P5 106479045 +FCF1P6 100422535 +FCF1P7 100422536 +FCF1P8 100422531 +FCF1P9 106480444 +FCF1P10 106479046 +FCF1P11 100132310 +FCGBP 8857 +FCGR1A 2209 +FCGR1BP 2210 +FCGR1CP 100132417 +FCGR2A 2212 +FCGR2B 2213 +FCGR2C 9103 +FCGR3A 2214 +FCGR3B 2215 +FCGRT 2217 +FCHO1 23149 +FCHO2 115548 +FCHO2-DT 118597832 +FCHSD1 89848 +FCHSD2 9873 +FCMR 9214 +FCN1 2219 +FCN2 2220 +FCN3 8547 +FCRL1 115350 +FCRL2 79368 +FCRL3 115352 +FCRL4 83417 +FCRL4P1 127379687 +FCRL5 83416 +FCRL6 343413 +FCRL6P1 100419077 +FCRLA 84824 +FCRLB 127943 +FCSK 197258 +FDCSP 260436 +FDFT1 2222 +FDPS 2224 +FDPSP1 343332 +FDPSP2 619190 +FDPSP3 2227 +FDPSP4 2228 +FDPSP5 2229 +FDPSP6 54051 +FDPSP7 441261 +FDPSP8 401981 +FDPSP9 401822 +FDPSP10 100190987 +FDX1 2230 +FDX1P1 2231 +FDX1P2 2216 +FDX2 112812 +FDXACB1 91893 +FDXR 2232 +FECH 2235 +FECHP1 2236 +FEM1A 55527 +FEM1AP1 441957 +FEM1AP2 390834 +FEM1AP3 643859 +FEM1AP4 729524 +FEM1B 10116 +FEM1C 56929 +FEN1 2237 +FEN1P1 645931 +FENDRR 400550 +FER 2241 +FER1L4 80307 +FER1L5 90342 +FER1L6 654463 +FER1L6-AS1 439941 +FER1L6-AS2 157376 +FERD3L 222894 +FERMT1 55612 +FERMT2 10979 +FERMT3 83706 +FERP1 553112 +FES 2242 +FETUB 26998 +FEV 54738 +FEZ1 9638 +FEZ2 9637 +FEZF1 389549 +FEZF1-AS1 154860 +FEZF2 55079 +FFAR1 2864 +FFAR2 2867 +FFAR3 2865 +FFAR4 338557 +FGA 2243 +FGB 2244 +FGD1 2245 +FGD2 221472 +FGD3 89846 +FGD4 121512 +FGD5 152273 +FGD5-AS1 100505641 +FGD5P1 100132526 +FGD6 55785 +FGF1 2246 +FGF2 2247 +FGF3 2248 +FGF4 2249 +FGF5 2250 +FGF6 2251 +FGF7 2252 +FGF7P1 387559 +FGF7P2 394217 +FGF7P3 654466 +FGF7P4 728195 +FGF7P5 653453 +FGF7P6 387628 +FGF7P7 728433 +FGF7P8 100113421 +FGF8 2253 +FGF9 2254 +FGF10 2255 +FGF10-AS1 101927075 +FGF11 2256 +FGF12 2257 +FGF12-AS1 100873986 +FGF12-AS2 100873987 +FGF12-AS3 100873988 +FGF13 2258 +FGF13-AS1 100129662 +FGF14 2259 +FGF14-AS1 100874081 +FGF14-AS2 283481 +FGF14-IT1 283480 +FGF16 8823 +FGF17 8822 +FGF18 8817 +FGF19 9965 +FGF20 26281 +FGF21 26291 +FGF22 27006 +FGF23 8074 +FGFBP1 9982 +FGFBP2 83888 +FGFBP3 143282 +FGFR1 2260 +FGFR1OP2 26127 +FGFR1OP2P1 100873883 +FGFR2 2263 +FGFR3 2261 +FGFR3P1 100462812 +FGFR3P2 100462815 +FGFR3P3 100462816 +FGFR3P4 100420833 +FGFR3P5 100420952 +FGFR3P6 100420881 +FGFR4 2264 +FGFRL1 53834 +FGG 2266 +FGGY 55277 +FGGY-DT 105378756 +FGL1 2267 +FGL2 10875 +FGR 2268 +FH 2271 +FHAD1 114827 +FHAD1-AS1 101927417 +FHDC1 85462 +FHIP1A 729830 +FHIP1A-DT 105377486 +FHIP1B 84067 +FHIP2A 57700 +FHIP2B 64760 +FHIT 2272 +FHL1 2273 +FHL1P1 100128164 +FHL2 2274 +FHL3 2275 +FHL5 9457 +FHOD1 29109 +FHOD3 80206 +FHP1 100873790 +FHP2 128385370 +FIBCD1 84929 +FIBCD1-AS1 105376297 +FIBIN 387758 +FIBP 9158 +FICD 11153 +FIG4 9896 +FIGLA 344018 +FIGN 55137 +FIGNL1 63979 +FIGNL2 401720 +FIGNL2-DT 105369971 +FILIP1 27145 +FILIP1L 11259 +FILNC1 100132735 +FIP1L1 81608 +FIRRE 286467 +FIRRM 55732 +FIS1 51024 +FITM1 161247 +FITM2 128486 +FIZ1 84922 +FJX1 24147 +FKBP1A 2280 +FKBP1A-SDCBP2 100528031 +FKBP1AP1 2282 +FKBP1AP2 2283 +FKBP1AP3 2284 +FKBP1AP4 2285 +FKBP1B 2281 +FKBP1BP1 107984636 +FKBP1C 642489 +FKBP2 2286 +FKBP3 2287 +FKBP4 2288 +FKBP4P1 100132656 +FKBP4P2 389727 +FKBP4P6 100132268 +FKBP4P7 441410 +FKBP4P8 643880 +FKBP5 2289 +FKBP6 8468 +FKBP6P1 100101148 +FKBP6P2 541473 +FKBP7 51661 +FKBP8 23770 +FKBP9 11328 +FKBP9P1 360132 +FKBP10 60681 +FKBP11 51303 +FKBP14 55033 +FKBP14-AS1 105375215 +FKBP15 23307 +FKBPL 63943 +FKRP 79147 +FKTN 2218 +FKTN-AS1 105376199 +FLACC1 130540 +FLAD1 80308 +FLCN 201163 +FLG 2312 +FLG-AS1 339400 +FLG2 388698 +FLI1 2313 +FLICR 110437700 +FLII 2314 +FLNA 2316 +FLNB 2317 +FLNB-AS1 105377105 +FLNC 2318 +FLNC-AS1 110806300 +FLOT1 10211 +FLOT2 2319 +FLRT1 23769 +FLRT2 23768 +FLRT2-AS1 100506731 +FLRT3 23767 +FLT1 2321 +FLT1P1 391533 +FLT3 2322 +FLT3LG 2323 +FLT4 2324 +FLVCR1 28982 +FLVCR1-DT 642946 +FLVCR2 55640 +FLVCR2-AS1 102724153 +FLYWCH1 84256 +FLYWCH1P1 100130898 +FLYWCH2 114984 +FMC1 154791 +FMC1-LUC7L2 100996928 +FMN1 342184 +FMN2 56776 +FMN2P1 100418721 +FMNL1 752 +FMNL1-AS1 107985040 +FMNL1-DT 339192 +FMNL2 114793 +FMNL3 91010 +FMO1 2326 +FMO2 2327 +FMO3 2328 +FMO4 2329 +FMO5 2330 +FMO6P 388714 +FMO7P 100337589 +FMO8P 100129007 +FMO9P 116123 +FMO10P 100128181 +FMO11P 100337590 +FMOD 2331 +FMR1 2332 +FMR1-AS1 100126270 +FMR1-IT1 106478973 +FMR1NB 158521 +FN1 2335 +FN1-DT 105373868 +FN3K 64122 +FN3KRP 79672 +FNBP1 23048 +FNBP1L 54874 +FNBP1P1 100533642 +FNBP1P2 100419875 +FNBP4 23360 +FNDC1 84624 +FNDC1-AS1 101929122 +FNDC1-IT1 100874312 +FNDC3A 22862 +FNDC3B 64778 +FNDC3CP 100421340 +FNDC4 64838 +FNDC5 252995 +FNDC7 163479 +FNDC8 54752 +FNDC9 408263 +FNDC10 643988 +FNDC11 79025 +FNIP1 96459 +FNIP2 57600 +FNTA 2339 +FNTAP1 283226 +FNTAP2 2341 +FNTB 2342 +FOCAD 54914 +FOCAD-AS1 101929548 +FOLH1 2346 +FOLH1B 219595 +FOLR1 2348 +FOLR1P1 390221 +FOLR2 2350 +FOLR3 2352 +FOLR3P1 100288543 +FOS 2353 +FOSB 2354 +FOSL1 8061 +FOSL1P1 100419062 +FOSL2 2355 +FOSL2-AS1 403150 +FOXA1 3169 +FOXA2 3170 +FOXA3 3171 +FOXB1 27023 +FOXB2 442425 +FOXC1 2296 +FOXC2 2303 +FOXC2-AS1 103752587 +FOXCUT 101927703 +FOXD1 2297 +FOXD1-AS1 106144539 +FOXD2 2306 +FOXD2-AS1 84793 +FOXD3 27022 +FOXD3-AS1 100996301 +FOXD4 2298 +FOXD4L1 200350 +FOXD4L3 286380 +FOXD4L4 349334 +FOXD4L5 653427 +FOXD4L6 653404 +FOXE1 2304 +FOXE3 2301 +FOXF1 2294 +FOXF2 2295 +FOXF2-DT 105374880 +FOXG1 2290 +FOXG1-AS1 103695363 +FOXH1 8928 +FOXI1 2299 +FOXI2 399823 +FOXI3 344167 +FOXJ1 2302 +FOXJ2 55810 +FOXJ3 22887 +FOXK1 221937 +FOXK2 3607 +FOXL1 2300 +FOXL2 668 +FOXL2NB 401089 +FOXL3 116033993 +FOXL3-OT1 100288524 +FOXM1 2305 +FOXN1 8456 +FOXN2 3344 +FOXN3 1112 +FOXN3-AS1 400236 +FOXN3-AS2 29018 +FOXN3P1 643976 +FOXN3P2 117981796 +FOXN4 121643 +FOXO1 2308 +FOXO1B 2311 +FOXO3 2309 +FOXO3B 2310 +FOXO4 4303 +FOXO6 100132074 +FOXO6-AS1 101929901 +FOXP1 27086 +FOXP1-AS1 104502416 +FOXP1-DT 126568846 +FOXP1-IT1 100506815 +FOXP2 93986 +FOXP3 50943 +FOXP4 116113 +FOXP4-AS1 101060264 +FOXQ1 94234 +FOXR1 283150 +FOXR2 139628 +FOXRED1 55572 +FOXRED2 80020 +FOXS1 2307 +FPASL 128266845 +FPGS 2356 +FPGT 8790 +FPGT-TNNI3K 100526835 +FPR1 2357 +FPR2 2358 +FPR3 2359 +FRA1A 2360 +FRA1B 2361 +FRA1C 2362 +FRA1D 2363 +FRA1E 2364 +FRA1F 2365 +FRA1G 2366 +FRA1H 2367 +FRA1I 2368 +FRA1J 2369 +FRA1K 2370 +FRA1L 2371 +FRA1M 2372 +FRA2A 109113861 +FRA2B 2374 +FRA2C 2375 +FRA2D 2376 +FRA2E 2377 +FRA2F 2378 +FRA2G 2379 +FRA2H 2380 +FRA2I 2381 +FRA2J 2382 +FRA2K 2383 +FRA3A 2384 +FRA3B +FRA3C 2386 +FRA3D 2387 +FRA4A 2388 +FRA4B 2389 +FRA4C 2390 +FRA4D 2391 +FRA5A 2393 +FRA5B 2394 +FRA5C 2396 +FRA5D 2397 +FRA5E 2398 +FRA5F 2399 +FRA5G 2400 +FRA6A 2401 +FRA6B 2402 +FRA6C 2403 +FRA6D 2404 +FRA6E 2405 +FRA6F 2406 +FRA6G 2407 +FRA7A 109363672 +FRA7B 2409 +FRA7C 2410 +FRA7D 2411 +FRA7E 2412 +FRA7F 2413 +FRA7G 2414 +FRA7H 2415 +FRA7I 2416 +FRA7J 2417 +FRA8A 2418 +FRA8B 2419 +FRA8C 2421 +FRA8D 2422 +FRA8E 2423 +FRA9A 2425 +FRA9B 2426 +FRA9C 2427 +FRA9D 2428 +FRA9E 2429 +FRA9F 2430 +FRA10A 109280162 +FRA10AC1 118924 +FRA10B 109614541 +FRA10C 2433 +FRA10D 2434 +FRA10E 2435 +FRA10F 2436 +FRA10G 2437 +FRA11A 109286555 +FRA11B 109280160 +FRA11C 2440 +FRA11D 2441 +FRA11E 2442 +FRA11F 2443 +FRA11G 2445 +FRA11H 2446 +FRA11I 2447 +FRA12A 109286554 +FRA12B 2449 +FRA12C 2450 +FRA12D 2451 +FRA12E 2452 +FRA13A 2453 +FRA13B 2454 +FRA13C 2455 +FRA13D 2456 +FRA14B 2457 +FRA14C 2458 +FRA15A 2459 +FRA16A 109617027 +FRA16B 109611591 +FRA16C 2462 +FRA16D 2463 +FRA16E 2464 +FRA17A 2465 +FRA17B 2466 +FRA18A 2467 +FRA18B 2468 +FRA18C 116710 +FRA19A 2469 +FRA19B 2470 +FRA20A 2471 +FRA20B 2472 +FRA22A 2473 +FRA22B 2474 +FRAS1 80144 +FRAT1 10023 +FRAT2 23401 +FRAXA 108684022 +FRAXB 2478 +FRAXC 2479 +FRAXD 2480 +FRAXE 109461475 +FREM1 158326 +FREM2 341640 +FREM2-AS1 100874073 +FREM3 166752 +FREY1 143678 +FRG1 2483 +FRG1-DT 728339 +FRG1BP 284802 +FRG1CP 100289097 +FRG1DP 102723316 +FRG1EP 102723390 +FRG1FP 102723780 +FRG1GP 101930531 +FRG1HP 100132352 +FRG1JP 642236 +FRG1KP 102724923 +FRG2 448831 +FRG2B 441581 +FRG2C 100288801 +FRG2DP 146481 +FRG2EP 647476 +FRG2FP 100128827 +FRG2GP 106480321 +FRG2HP 101059920 +FRG2IP 106480351 +FRG2JP 101059926 +FRG2KP 102724018 +FRG2LP 106480352 +FRG2MP 106481739 +FRGCA 106481742 +FRK 2444 +FRMD1 79981 +FRMD3 257019 +FRMD3-AS1 102723989 +FRMD4A 55691 +FRMD4A-AS1 128193287 +FRMD4B 23150 +FRMD5 84978 +FRMD6 122786 +FRMD6-AS1 145438 +FRMD6-AS2 100874185 +FRMD7 90167 +FRMD8 83786 +FRMD8P1 83957 +FRMPD1 22844 +FRMPD2 143162 +FRMPD2B 728798 +FRMPD3 84443 +FRMPD3-AS1 100874122 +FRMPD4 9758 +FRMPD4-AS1 100874121 +FRRS1 391059 +FRRS1L 23732 +FRS2 10818 +FRS3 10817 +FRY 10129 +FRY-AS1 100507099 +FRYL 285527 +FRZB 2487 +FSBP 100861412 +FSCB 84075 +FSCN1 6624 +FSCN1P1 145989 +FSCN2 25794 +FSCN3 29999 +FSD1 79187 +FSD1L 83856 +FSD2 123722 +FSHB 2488 +FSHR 2492 +FSIP1 161835 +FSIP2 401024 +FSIP2-AS1 107985781 +FSIP2-AS2 101927196 +FSIP2LP 100130684 +FST 10468 +FSTL1 11167 +FSTL3 10272 +FSTL4 23105 +FSTL5 56884 +FTCD 10841 +FTCD-AS1 100861507 +FTCDNL1 348751 +FTH1 2495 +FTH1P1 2496 +FTH1P2 2497 +FTH1P3 2498 +FTH1P4 2499 +FTH1P5 2509 +FTH1P6 106481787 +FTH1P7 2500 +FTH1P8 2501 +FTH1P9 106478936 +FTH1P10 2502 +FTH1P11 2503 +FTH1P12 2504 +FTH1P13 646362 +FTH1P14 139431 +FTH1P15 2507 +FTH1P16 2508 +FTH1P19 389844 +FTH1P20 729009 +FTH1P21 2510 +FTH1P22 100462772 +FTH1P23 100420300 +FTH1P24 100462797 +FTH1P25 100462799 +FTH1P26 100420303 +FTH1P27 100270709 +FTHL17 53940 +FTHL18P 441490 +FTL 2512 +FTLP1 170514 +FTLP2 392437 +FTLP3 284764 +FTLP4 100129251 +FTLP5 100131661 +FTLP6 100462788 +FTLP7 441623 +FTLP8 100462790 +FTLP9 100462780 +FTLP10 100130017 +FTLP11 100289501 +FTLP12 100462792 +FTLP13 100462793 +FTLP14 100462794 +FTLP15 442304 +FTLP16 100420158 +FTLP17 642337 +FTLP18 100462786 +FTLP19 100873960 +FTMT 94033 +FTO 79068 +FTO-IT1 100505692 +FTOP1 100874223 +FTSJ1 24140 +FTSJ3 117246 +FTX 100302692 +FUBP1 8880 +FUBP3 8939 +FUCA1 2517 +FUCA1P1 2518 +FUCA2 2519 +FUNDC1 139341 +FUNDC2 65991 +FUNDC2P1 220793 +FUNDC2P2 388965 +FUNDC2P3 644625 +FUNDC2P4 100127979 +FUOM 282969 +FURIN 5045 +FUS 2521 +FUT1 2523 +FUT2 2524 +FUT3 2525 +FUT4 2526 +FUT5 2527 +FUT6 2528 +FUT7 2529 +FUT8 2530 +FUT8-AS1 645431 +FUT9 10690 +FUT10 84750 +FUT11 170384 +FUZ 80199 +FXN 2395 +FXNP1 122942 +FXNP2 100418706 +FXR1 8087 +FXR2 9513 +FXYD1 5348 +FXYD2 486 +FXYD3 5349 +FXYD4 53828 +FXYD5 53827 +FXYD6 53826 +FXYD6-AS1 123706543 +FXYD6-FXYD2 100533181 +FXYD6P1 100128934 +FXYD6P2 100128512 +FXYD6P3 406875 +FXYD7 53822 +FYB1 2533 +FYB2 199920 +FYCO1 79443 +FYN 2534 +FYTTD1 84248 +FYTTD1P1 100128665 +FZD1 8321 +FZD2 2535 +FZD3 7976 +FZD4 8322 +FZD4-DT 100506368 +FZD5 7855 +FZD6 8323 +FZD7 8324 +FZD8 8325 +FZD9 8326 +FZD10 11211 +FZD10-AS1 440119 +FZR1 51343 +G2E3 55632 +G2E3-AS1 105370431 +G2E3P1 100130550 +G3BP1 10146 +G3BP1P1 100422338 +G3BP2 9908 +G6PC1 2538 +G6PC2 57818 +G6PC3 92579 +G6PD 2539 +G6PR 2541 +GAA 2548 +GAB1 2549 +GAB2 9846 +GAB3 139716 +GAB4 128954 +GABARAP 11337 +GABARAPL1 23710 +GABARAPL1-AS1 116435304 +GABARAPL2 11345 +GABARAPL3 23766 +GABBR1 2550 +GABBR2 9568 +GABPA 2551 +GABPAP 8327 +GABPB1 2553 +GABPB1-AS1 100129387 +GABPB1-IT1 55056 +GABPB2 126626 +GABRA1 2554 +GABRA2 2555 +GABRA3 2556 +GABRA4 2557 +GABRA5 2558 +GABRA6 2559 +GABRB1 2560 +GABRB2 2561 +GABRB3 2562 +GABRD 2563 +GABRE 2564 +GABRG1 2565 +GABRG2 2566 +GABRG3 2567 +GABRG3-AS1 101928869 +GABRP 2568 +GABRQ 55879 +GABRR1 2569 +GABRR2 2570 +GABRR3 200959 +GACAT1 104326057 +GACAT2 100287082 +GACAT3 104797537 +GAD1 2571 +GAD2 2572 +GAD3P 105372156 +GADD45A 1647 +GADD45AP1 1648 +GADD45B 4616 +GADD45G 10912 +GADD45GIP1 90480 +GADL1 339896 +GAGE1 2543 +GAGE2A 729447 +GAGE2B 645037 +GAGE2C 2574 +GAGE2D 729408 +GAGE2E 26749 +GAGE4 2576 +GAGE5 2577 +GAGE6 2578 +GAGE7 2579 +GAGE8 100101629 +GAGE10 102724473 +GAGE12B 729428 +GAGE12C 729422 +GAGE12D 100132399 +GAGE12E 729431 +GAGE12F 100008586 +GAGE12G 645073 +GAGE12H 729442 +GAGE12I 26748 +GAGE12J 729396 +GAGE13 645051 +GAK 2580 +GAL 51083 +GAL3ST1 9514 +GAL3ST2 64090 +GAL3ST3 89792 +GAL3ST4 79690 +GALC 2581 +GALE 2582 +GALK1 2584 +GALK2 2585 +GALM 130589 +GALNS 2588 +GALNT1 2589 +GALNT2 2590 +GALNT3 2591 +GALNT4 8693 +GALNT5 11227 +GALNT6 11226 +GALNT7 51809 +GALNT7-DT 101930370 +GALNT8 26290 +GALNT9 50614 +GALNT9-AS1 100130238 +GALNT10 55568 +GALNT11 63917 +GALNT12 79695 +GALNT13 114805 +GALNT13-AS1 100144595 +GALNT14 79623 +GALNT15 117248 +GALNT16 57452 +GALNT16-AS1 105370550 +GALNT17 64409 +GALNT18 374378 +GALNTL5 168391 +GALNTL6 442117 +GALNTL6-AS1 101928314 +GALP 85569 +GALR1 2587 +GALR2 8811 +GALR3 8484 +GALT 2592 +GAMT 2593 +GAMTP1 391491 +GAMTP2 100129452 +GAN 8139 +GANAB 23193 +GANC 2595 +GAP43 2596 +GAPDH 2597 +GAPDH-DT 112268089 +GAPDHP1 2616 +GAPDHP2 170516 +GAPDHP14 54050 +GAPDHP15 642317 +GAPDHP16 387491 +GAPDHP17 360008 +GAPDHP19 140028 +GAPDHP20 343338 +GAPDHP21 389970 +GAPDHP22 390421 +GAPDHP23 391075 +GAPDHP24 391162 +GAPDHP25 391367 +GAPDHP26 392374 +GAPDHP27 401960 +GAPDHP28 441572 +GAPDHP29 441893 +GAPDHP30 643228 +GAPDHP31 643739 +GAPDHP32 644213 +GAPDHP33 644237 +GAPDHP34 646877 +GAPDHP35 647001 +GAPDHP36 647249 +GAPDHP37 651258 +GAPDHP38 729493 +GAPDHP39 100128589 +GAPDHP40 100131743 +GAPDHP41 100131935 +GAPDHP42 100240707 +GAPDHP43 100240708 +GAPDHP44 100240709 +GAPDHP45 100240710 +GAPDHP46 100240711 +GAPDHP47 100240712 +GAPDHP48 100240713 +GAPDHP49 100421189 +GAPDHP50 100421236 +GAPDHP51 100421271 +GAPDHP52 100421313 +GAPDHP53 100421318 +GAPDHP54 100421319 +GAPDHP55 100421324 +GAPDHP56 100421232 +GAPDHP57 100421188 +GAPDHP58 391077 +GAPDHP59 645024 +GAPDHP60 2601 +GAPDHP61 729403 +GAPDHP62 100128961 +GAPDHP63 442231 +GAPDHP64 391069 +GAPDHP65 389849 +GAPDHP66 645256 +GAPDHP67 2609 +GAPDHP68 100132601 +GAPDHP69 2611 +GAPDHP70 642259 +GAPDHP71 2613 +GAPDHP72 346085 +GAPDHP73 442262 +GAPDHP74 391073 +GAPDHP75 100652918 +GAPDHP76 100287725 +GAPDHP77 118568801 +GAPDHS 26330 +GAPLINC 100505592 +GAPT 202309 +GAPVD1 26130 +GAR1 54433 +GAR1-DT 124900758 +GAREM1 64762 +GAREM2 150946 +GARIN1A 346653 +GARIN1B 84691 +GARIN2 161142 +GARIN3 153745 +GARIN3P1 100421478 +GARIN4 149647 +GARIN5A 112703 +GARIN5B 284418 +GARIN6 196472 +GARNL3 84253 +GARRE1 9710 +GARS1 2617 +GARS1-DT 401320 +GARS1P1 100419764 +GART 2618 +GAS1 2619 +GAS1RR 100506834 +GAS2 2620 +GAS2L1 10634 +GAS2L1P1 101927222 +GAS2L1P2 340508 +GAS2L2 246176 +GAS2L3 283431 +GAS5 60674 +GAS5-AS1 100506046 +GAS6 2621 +GAS6-AS1 650669 +GAS6-DT 100506394 +GAS7 8522 +GAS8 2622 +GAS8-AS1 750 +GASAL1 401472 +GASK1A 729085 +GASK1B 51313 +GASK1B-AS1 285505 +GAST 2520 +GATA1 2623 +GATA2 2624 +GATA2-AS1 101927167 +GATA3 2625 +GATA3-AS1 399717 +GATA4 2626 +GATA5 140628 +GATA6 2627 +GATA6-AS1 100128893 +GATAD1 57798 +GATAD2A 54815 +GATAD2B 57459 +GATB 5188 +GATC 283459 +GATD1 347862 +GATD1-DT 171391 +GATD3 8209 +GATM 2628 +GAU1 101929549 +GBA1 2629 +GBA1LP 2630 +GBA2 57704 +GBA3 57733 +GBE1 2632 +GBF1 8729 +GBGT1 26301 +GBP1 2633 +GBP1P1 400759 +GBP2 2634 +GBP3 2635 +GBP4 115361 +GBP5 115362 +GBP6 163351 +GBP7 388646 +GBX1 2636 +GBX2 2637 +GBX2-AS1 121853074 +GC 2638 +GCA 25801 +GCASPC 112441427 +GCAT 23464 +GCATP1 319140 +GCAWKR 105369201 +GCC1 79571 +GCC2 9648 +GCC2-AS1 644903 +GCDH 2639 +GCFC2 6936 +GCG 2641 +GCGR 2642 +GCH1 2643 +GCHFR 2644 +GCK 2645 +GCKR 2646 +GCLC 2729 +GCLC-AS1 105375095 +GCLM 2730 +GCM1 8521 +GCM2 9247 +GCN1 10985 +GCNA 93953 +GCNAP1 100419929 +GCNT1 2650 +GCNT1P1 170517 +GCNT1P2 100421560 +GCNT1P3 100421581 +GCNT1P4 100462829 +GCNT1P5 100421598 +GCNT2 2651 +GCNT2P1 644378 +GCNT3 9245 +GCNT4 51301 +GCNT7 140687 +GCOM1 145781 +GCSAM 257144 +GCSAML 148823 +GCSAML-AS1 148824 +GCSH 2653 +GCSHP1 106480441 +GCSHP2 100288298 +GCSHP3 100329109 +GCSHP4 100287495 +GCSHP5 100329108 +GCSHP6 127379698 +GCSIR 151484 +GDA 9615 +GDAP1 54332 +GDAP1L1 78997 +GDAP2 54834 +GDE1 51573 +GDF1 2657 +GDF2 2658 +GDF3 9573 +GDF5 8200 +GDF5-AS1 554250 +GDF6 392255 +GDF7 151449 +GDF9 2661 +GDF10 2662 +GDF11 10220 +GDF15 9518 +GDI1 2664 +GDI2 2665 +GDI2P1 2667 +GDI2P2 100420259 +GDNF 2668 +GDNF-AS1 100861519 +GDPD1 284161 +GDPD2 54857 +GDPD3 79153 +GDPD4 220032 +GDPD5 81544 +GDPGP1 390637 +GEM 2669 +GEMIN2 8487 +GEMIN2P1 101929669 +GEMIN2P2 100287063 +GEMIN4 50628 +GEMIN5 25929 +GEMIN6 79833 +GEMIN7 79760 +GEMIN7-AS1 105372419 +GEMIN7P1 100506654 +GEMIN8 54960 +GEMIN8P1 100128431 +GEMIN8P2 644600 +GEMIN8P3 100421535 +GEMIN8P4 492303 +GEN1 348654 +GET1 7485 +GET1-SH3BGR 106865373 +GET1P1 256085 +GET3 439 +GET4 51608 +GFAP 2670 +GFER 2671 +GFI1 2672 +GFI1B 8328 +GFM1 85476 +GFM2 84340 +GFOD1 54438 +GFOD1-AS1 100874025 +GFOD2 81577 +GFOD3P 57212 +GFPT1 2673 +GFPT2 9945 +GFRA1 2674 +GFRA2 2675 +GFRA3 2676 +GFRA4 64096 +GFRAL 389400 +GFUS 7264 +GFY 100507003 +GGA1 26088 +GGA2 23062 +GGA3 23163 +GGACT 87769 +GGCT 79017 +GGCTP1 100528061 +GGCTP2 100529052 +GGCTP3 100528063 +GGCX 2677 +GGH 8836 +GGN 199720 +GGNBP1 449520 +GGNBP2 79893 +GGPS1 9453 +GGT1 2678 +GGT2P 728441 +GGT3P 2679 +GGT4P 643171 +GGT5 2687 +GGT6 124975 +GGT7 2686 +GGT8P 645367 +GGTA1 2681 +GGTA2P 121328 +GGTLC1 92086 +GGTLC2 91227 +GGTLC3 728226 +GGTLC4P 729838 +GGTLC5P 653590 +GH1 2688 +GH2 2689 +GHDC 84514 +GHET1 102723099 +GHITM 27069 +GHR 2690 +GHRH 2691 +GHRHR 2692 +GHRL 51738 +GHRLOS 100126793 +GHSR 2693 +GID4 79018 +GID8 54994 +GIGYF1 64599 +GIGYF2 26058 +GIHCG 100506844 +GIMAP1 170575 +GIMAP1-GIMAP5 100527949 +GIMAP2 26157 +GIMAP3P 474345 +GIMAP4 55303 +GIMAP5 55340 +GIMAP6 474344 +GIMAP7 168537 +GIMAP8 155038 +GIMD1 100507096 +GIN1 54826 +GINM1 116254 +GINS1 9837 +GINS2 51659 +GINS3 64785 +GINS4 84296 +GIP 2695 +GIPC1 10755 +GIPC2 54810 +GIPC3 126326 +GIPR 2696 +GIRGL 100506098 +GIT1 28964 +GIT2 9815 +GJA1 2697 +GJA1P1 2698 +GJA3 2700 +GJA4 2701 +GJA5 2702 +GJA6P 100126825 +GJA8 2703 +GJA9 81025 +GJA10 84694 +GJB1 2705 +GJB2 2706 +GJB3 2707 +GJB4 127534 +GJB5 2709 +GJB6 10804 +GJB7 375519 +GJC1 10052 +GJC2 57165 +GJC3 349149 +GJD2 57369 +GJD2-DT 101928174 +GJD3 125111 +GJD3-AS1 112529913 +GJD4 219770 +GJE1 100126572 +GK 2710 +GK-AS1 100873902 +GK-IT1 106480740 +GK2 2712 +GK3 2713 +GK4P 2716 +GK5 256356 +GK6P 201989 +GKAP1 80318 +GKN1 56287 +GKN2 200504 +GKN3P 100132413 +GLA 2717 +GLB1 2720 +GLB1L 79411 +GLB1L2 89944 +GLB1L3 112937 +GLCCI1 113263 +GLCCI1-DT 100505921 +GLCE 26035 +GLDC 2731 +GLDCP1 2732 +GLDN 342035 +GLE1 2733 +GLG1 2734 +GLI1 2735 +GLI2 2736 +GLI3 2737 +GLI4 2738 +GLIDR 389741 +GLIPR1 11010 +GLIPR1-AS1 123706544 +GLIPR1L1 256710 +GLIPR1L2 144321 +GLIPR2 152007 +GLIS1 148979 +GLIS2 84662 +GLIS2-AS1 101926896 +GLIS3 169792 +GLIS3-AS1 84850 +GLIS3-AS2 107986989 +GLMN 11146 +GLMP 112770 +GLO1 2739 +GLOD4 51031 +GLOD5 392465 +GLP1R 2740 +GLP2R 9340 +GLRA1 2741 +GLRA2 2742 +GLRA3 8001 +GLRA4 441509 +GLRB 2743 +GLRX 2745 +GLRX2 51022 +GLRX3 10539 +GLRX3P1 100418908 +GLRX3P2 728344 +GLRX5 51218 +GLRX5P1 100128546 +GLRX5P2 118568821 +GLRX5P3 118568802 +GLRXP1 170522 +GLRXP2 171418 +GLRXP3 100132510 +GLS 2744 +GLS2 27165 +GLT1D1 144423 +GLT6D1 360203 +GLT8D1 55830 +GLT8D2 83468 +GLTP 51228 +GLTPD2 388323 +GLTPP1 645312 +GLUD1 2746 +GLUD1P2 414212 +GLUD1P3 2749 +GLUD1P4 2750 +GLUD1P5 2751 +GLUD1P6 414213 +GLUD1P9 100131281 +GLUD2 2747 +GLUL 2752 +GLULP1 2753 +GLULP2 2754 +GLULP3 401708 +GLULP4 392305 +GLULP5 100421694 +GLULP6 343981 +GLYAT 10249 +GLYATL1 92292 +GLYATL1B 100287520 +GLYATL1P1 100129032 +GLYATL1P2 100129933 +GLYATL1P4 643637 +GLYATL2 219970 +GLYATL3 389396 +GLYCAM1 644076 +GLYCTK 132158 +GLYCTK-AS1 100874110 +GLYR1 84656 +GM2A 2760 +GM2AP1 2761 +GM2AP2 100287900 +GMCL1 64395 +GMCL1P2 100420975 +GMCL2 64396 +GMDS 2762 +GMDS-DT 100508120 +GMEB1 10691 +GMEB2 26205 +GMFB 2764 +GMFBP1 100499251 +GMFG 9535 +GMIP 51291 +GML 2765 +GMNC 647309 +GMNN 51053 +GMPPA 29926 +GMPPB 29925 +GMPR 2766 +GMPR2 51292 +GMPS 8833 +GMPSP1 728564 +GNA11 2767 +GNA12 2768 +GNA13 10672 +GNA13P1 100422337 +GNA14 9630 +GNA14-AS1 101927422 +GNA15 2769 +GNA15-DT 100996351 +GNAI1 2770 +GNAI2 2771 +GNAI2P1 2772 +GNAI2P2 401646 +GNAI3 2773 +GNAL 2774 +GNAO1 2775 +GNAO1-AS1 26077 +GNAO1-DT 283856 +GNAQ 2776 +GNAQP1 2777 +GNAS 2778 +GNAS-AS1 149775 +GNAT1 2779 +GNAT2 2780 +GNAT3 346562 +GNAZ 2781 +GNB1 2782 +GNB1-DT 105378949 +GNB1L 54584 +GNB2 2783 +GNB3 2784 +GNB4 59345 +GNB5 10681 +GNE 10020 +GNG2 54331 +GNG3 2785 +GNG4 2786 +GNG5 2787 +GNG5B 347687 +GNG5P1 2789 +GNG5P3 100101932 +GNG5P4 100101933 +GNG5P5 100101935 +GNG7 2788 +GNG8 94235 +GNG10 2790 +GNG10P1 100526656 +GNG11 2791 +GNG12 55970 +GNG12-AS1 100289178 +GNG13 51764 +GNG14 105372280 +GNGT1 2792 +GNGT2 2793 +GNL1 2794 +GNL2 29889 +GNL2P1 100270790 +GNL3 26354 +GNL3L 54552 +GNL3LP1 80060 +GNLY 10578 +GNMT 27232 +GNPAT 8443 +GNPATP 100130060 +GNPDA1 10007 +GNPDA2 132789 +GNPNAT1 64841 +GNPTAB 79158 +GNPTG 84572 +GNRH1 2796 +GNRH2 2797 +GNRHR 2798 +GNRHR2 114814 +GNRHR2P1 404718 +GNS 2799 +GOLGA1 2800 +GOLGA2 2801 +GOLGA2P1 100418751 +GOLGA2P2Y 84559 +GOLGA2P3Y 401634 +GOLGA2P4 100873742 +GOLGA2P5 55592 +GOLGA2P6 729668 +GOLGA2P7 388152 +GOLGA2P8 728477 +GOLGA2P9 440518 +GOLGA2P10 80154 +GOLGA2P11 255180 +GOLGA3 2802 +GOLGA4 2803 +GOLGA4-AS1 152048 +GOLGA4P1 192131 +GOLGA4P2 192132 +GOLGA4P3 192130 +GOLGA5 9950 +GOLGA5P1 100418736 +GOLGA6A 342096 +GOLGA6B 55889 +GOLGA6C 653641 +GOLGA6D 653643 +GOLGA6EP 441728 +GOLGA6FP 645752 +GOLGA6GP 112268142 +GOLGA6L1 283767 +GOLGA6L2 283685 +GOLGA6L3P 100133220 +GOLGA6L4 643707 +GOLGA6L5P 374650 +GOLGA6L6 727832 +GOLGA6L7 728310 +GOLGA6L9 440295 +GOLGA6L10 647042 +GOLGA6L11P 360024 +GOLGA6L12P 360025 +GOLGA6L13P 360026 +GOLGA6L14P 360027 +GOLGA6L16P 100287845 +GOLGA6L17P 642402 +GOLGA6L19 101927601 +GOLGA6L22 440243 +GOLGA6L23P 100653133 +GOLGA6L24 645202 +GOLGA6L25 100132202 +GOLGA6L26 102723623 +GOLGA7 51125 +GOLGA7B 401647 +GOLGA7B-DT 100505561 +GOLGA8A 23015 +GOLGA8B 440270 +GOLGA8CP 729786 +GOLGA8DP 100132979 +GOLGA8EP 390535 +GOLGA8F 100132565 +GOLGA8G 283768 +GOLGA8H 728498 +GOLGA8IP 283796 +GOLGA8J 653073 +GOLGA8K 653125 +GOLGA8M 653720 +GOLGA8N 643699 +GOLGA8O 728047 +GOLGA8Q 727909 +GOLGA8R 101059918 +GOLGA8S 653061 +GOLGA8T 653075 +GOLGA8UP 100507067 +GOLGA8VP 441736 +GOLGB1 2804 +GOLIM4 27333 +GOLM1 51280 +GOLM2 113201 +GOLM2P1 100420689 +GOLPH3 64083 +GOLPH3-DT 118597838 +GOLPH3L 55204 +GOLT1A 127845 +GOLT1B 51026 +GON4L 54856 +GON7 84520 +GOPC 57120 +GORAB 92344 +GORAB-AS1 101928650 +GORASP1 64689 +GORASP2 26003 +GOSR1 9527 +GOSR2 9570 +GOSR2-DT 119139904 +GOT1 2805 +GOT1-DT 101927300 +GOT1L1 137362 +GOT2 2806 +GOT2P1 645538 +GOT2P2 391139 +GOT2P3 644138 +GOT2P4 121520 +GOT2P5 100422625 +GOT2P6 644924 +GOT2P7 100422628 +GP1BA 2811 +GP1BB 2812 +GP2 2813 +GP5 2814 +GP6 51206 +GP6-AS1 107985325 +GP9 2815 +GPA33 10223 +GPAA1 8733 +GPAA1P1 22945 +GPAA1P2 106481722 +GPALPP1 55425 +GPAM 57678 +GPANK1 7918 +GPAT2 150763 +GPAT2P1 643219 +GPAT2P2 653924 +GPAT3 84803 +GPAT4 137964 +GPAT4-AS1 102723729 +GPATCH1 55094 +GPATCH2 55105 +GPATCH2L 55668 +GPATCH3 63906 +GPATCH4 54865 +GPATCH8 23131 +GPATCH11 253635 +GPATCH11P1 344709 +GPBAR1 151306 +GPBP1 65056 +GPBP1L1 60313 +GPC1 2817 +GPC1-AS1 100130449 +GPC2 221914 +GPC3 2719 +GPC3-AS1 110806308 +GPC4 2239 +GPC5 2262 +GPC5-AS1 100873969 +GPC5-AS2 100873970 +GPC5-IT1 100874293 +GPC6 10082 +GPC6-AS1 100873972 +GPC6-AS2 100873973 +GPCPD1 56261 +GPCPD1P1 100101483 +GPD1 2819 +GPD1L 23171 +GPD2 2820 +GPER1 2852 +GPHA2 170589 +GPHB5 122876 +GPHN 10243 +GPI 2821 +GPIHBP1 338328 +GPKOW 27238 +GPLD1 2822 +GPM6A 2823 +GPM6A-DT 101928590 +GPM6B 2824 +GPM6BP1 106480720 +GPM6BP2 106480426 +GPM6BP3 100873787 +GPN1 11321 +GPN2 54707 +GPN3 51184 +GPN3P1 100302689 +GPNMB 10457 +GPR3 2827 +GPR4 2828 +GPR6 2830 +GPR12 2835 +GPR15 2838 +GPR15LG 387695 +GPR17 2840 +GPR18 2841 +GPR19 2842 +GPR20 2843 +GPR21 2844 +GPR22 2845 +GPR25 2848 +GPR26 2849 +GPR27 2850 +GPR31 2853 +GPR32 2854 +GPR32P1 2855 +GPR33 2856 +GPR34 2857 +GPR35 2859 +GPR36 2860 +GPR37 2861 +GPR37L1 9283 +GPR39 2863 +GPR42 2866 +GPR45 11250 +GPR50 9248 +GPR50-AS1 100128688 +GPR52 9293 +GPR53P 9292 +GPR55 9290 +GPR61 83873 +GPR62 118442 +GPR63 81491 +GPR65 8477 +GPR68 8111 +GPR75 10936 +GPR75-ASB3 100302652 +GPR78 27201 +GPR79 27200 +GPR82 27197 +GPR83 10888 +GPR84 53831 +GPR84-AS1 102724050 +GPR85 54329 +GPR87 53836 +GPR88 54112 +GPR89A 653519 +GPR89B 51463 +GPR89P 394254 +GPR101 83550 +GPR107 57720 +GPR108 56927 +GPR119 139760 +GPR132 29933 +GPR135 64582 +GPR137 56834 +GPR137B 7107 +GPR137C 283554 +GPR139 124274 +GPR141 353345 +GPR141BP 100420413 +GPR142 350383 +GPR143 4935 +GPR143YP 352896 +GPR146 115330 +GPR148 344561 +GPR149 344758 +GPR150 285601 +GPR151 134391 +GPR152 390212 +GPR153 387509 +GPR155 151556 +GPR155-DT 105373748 +GPR156 165829 +GPR157 80045 +GPR158 57512 +GPR158-AS1 100128811 +GPR160 26996 +GPR160P1 100130649 +GPR160P2 100420482 +GPR161 23432 +GPR162 27239 +GPR165P 392486 +GPR166P 442206 +GPR171 29909 +GPR173 54328 +GPR174 84636 +GPR176 11245 +GPR176-DT 100505534 +GPR179 440435 +GPR180 160897 +GPR182 11318 +GPR183 1880 +GPR199P 653160 +GPRACR 401554 +GPRASP1 9737 +GPRASP2 114928 +GPRASP3 80823 +GPRASP3P1 100431177 +GPRC5A 9052 +GPRC5B 51704 +GPRC5C 55890 +GPRC5D 55507 +GPRC5D-AS1 100506314 +GPRC6A 222545 +GPRIN1 114787 +GPRIN2 9721 +GPRIN3 285513 +GPS1 2873 +GPS2 2874 +GPS2P1 392281 +GPS2P2 100132058 +GPSM1 26086 +GPSM2 29899 +GPSM3 63940 +GPT 2875 +GPT2 84706 +GPX1 2876 +GPX1P1 441481 +GPX1P2 2884 +GPX2 2877 +GPX3 2878 +GPX4 2879 +GPX5 2880 +GPX6 257202 +GPX7 2882 +GPX8 493869 +GRAMD1A 57655 +GRAMD1A-AS1 118827804 +GRAMD1B 57476 +GRAMD1C 54762 +GRAMD2A 196996 +GRAMD2B 65983 +GRAMD4 23151 +GRAMD4P1 100631252 +GRAMD4P2 100873881 +GRAMD4P3 100631248 +GRAMD4P4 106480248 +GRAMD4P5 100631249 +GRAMD4P6 100631250 +GRAMD4P7 100631251 +GRAMD4P8 100631247 +GRAP 10750 +GRAP2 9402 +GRAPL 400581 +GRAPL-AS1 79999 +GRAPLDR 118597830 +GRASLND 386597 +GRB2 2885 +GRB7 2886 +GRB10 2887 +GRB14 2888 +GREB1 9687 +GREB1L 80000 +GREB1L-DT 101927496 +GREM1 26585 +GREM1-AS1 100131315 +GREM2 64388 +GREP1 283875 +GRHL1 29841 +GRHL2 79977 +GRHL2-DT 107986962 +GRHL3 57822 +GRHL3-AS1 105376871 +GRHPR 9380 +GRIA1 2890 +GRIA2 2891 +GRIA3 2892 +GRIA4 2893 +GRID1 2894 +GRID1-AS1 100507470 +GRID2 2895 +GRID2IP 392862 +GRIFIN 402635 +GRIK1 2897 +GRIK1-AS1 642976 +GRIK1-AS2 100379661 +GRIK2 2898 +GRIK3 2899 +GRIK4 2900 +GRIK5 2901 +GRIN1 2902 +GRIN2A 2903 +GRIN2B 2904 +GRIN2C 2905 +GRIN2D 2906 +GRIN3A 116443 +GRIN3B 116444 +GRINA 2907 +GRIP1 23426 +GRIP2 80852 +GRIPAP1 56850 +GRK1 6011 +GRK2 156 +GRK3 157 +GRK3-AS1 100996404 +GRK4 2868 +GRK5 2869 +GRK5-IT1 101927868 +GRK6 2870 +GRK6P1 2871 +GRK7 131890 +GRM1 2911 +GRM2 2912 +GRM3 2913 +GRM3-AS1 112268007 +GRM4 2914 +GRM5 2915 +GRM5-AS1 100873989 +GRM5P1 440040 +GRM6 2916 +GRM7 2917 +GRM7-AS1 100873937 +GRM7-AS2 105376946 +GRM7-AS3 101927347 +GRM8 2918 +GRM8-AS1 101928333 +GRN 2896 +GRP 2922 +GRPEL1 80273 +GRPEL2 134266 +GRPEL2-AS1 106144529 +GRPEL2P1 100874360 +GRPEL2P2 100129994 +GRPEL2P3 100129871 +GRPR 2925 +GRSF1 2926 +GRTP1 79774 +GRTP1-AS1 100874068 +GRWD1 83743 +GRXCR1 389207 +GRXCR2 643226 +G0S2 50486 +GSAP 54103 +GSC 145258 +GSC-DT 108868751 +GSC2 2928 +GSDMA 284110 +GSDMB 55876 +GSDMC 56169 +GSDMD 79792 +GSDME 1687 +GSE1 23199 +GSEC 399972 +GSG1 83445 +GSG1L 146395 +GSG1L2 644070 +GSK3A 2931 +GSK3B 2932 +GSK3B-DT 107986119 +GSKIP 51527 +GSN 2934 +GSN-AS1 57000 +GSPT1 2935 +GSPT2 23708 +GSR 2936 +GSS 2937 +GSTA1 2938 +GSTA2 2939 +GSTA3 2940 +GSTA4 2941 +GSTA5 221357 +GSTA6P 2942 +GSTA7P 730152 +GSTA8P 100420627 +GSTA9P 100174857 +GSTA10P 647177 +GSTA11P 647175 +GSTA12P 647169 +GSTCD 79807 +GSTCD-AS1 101929529 +GSTK1 373156 +GSTM1 2944 +GSTM2 2946 +GSTM2P1 442245 +GSTM3 2947 +GSTM3P1 170523 +GSTM3P2 100421057 +GSTM4 2948 +GSTM5 2949 +GSTM5P1 100505557 +GSTO1 9446 +GSTO2 119391 +GSTO3P 344813 +GSTP1 2950 +GSTP1P1 2951 +GSTT1 2952 +GSTT1-AS1 106099130 +GSTT2 2953 +GSTT2B 653689 +GSTT3P 121853073 +GSTT4 25774 +GSTTP2 653399 +GSTZ1 2954 +GSX1 219409 +GSX2 170825 +GTDC1 79712 +GTF2A1 2957 +GTF2A1-AS1 101928504 +GTF2A1L 11036 +GTF2A2 2958 +GTF2B 2959 +GTF2E1 2960 +GTF2E2 2961 +GTF2F1 2962 +GTF2F2 2963 +GTF2F2P1 2964 +GTF2F2P2 728633 +GTF2H1 2965 +GTF2H2 2966 +GTF2H2B 653238 +GTF2H2C 728340 +GTF2H2C_2 730394 +GTF2H3 2967 +GTF2H4 2968 +GTF2H5 404672 +GTF2I 2969 +GTF2I-AS1 101926943 +GTF2IP1 2970 +GTF2IP2 338448 +GTF2IP3 645686 +GTF2IP4 100093631 +GTF2IP5 100420546 +GTF2IP6 101927390 +GTF2IP7 101927126 +GTF2IP8 101927717 +GTF2IP9 106481734 +GTF2IP10 107403151 +GTF2IP11 106480346 +GTF2IP12 101926918 +GTF2IP13 101929008 +GTF2IP14 106481735 +GTF2IP15 107403154 +GTF2IP16 +GTF2IP17 107403156 +GTF2IP19 107403157 +GTF2IP20 441124 +GTF2IP21 +GTF2IP22 106480347 +GTF2IP23 101929580 +GTF2IRD1 9569 +GTF2IRD1P1 729156 +GTF2IRD2 84163 +GTF2IRD2B 389524 +GTF2IRD2P1 401375 +GTF3A 2971 +GTF3AP1 100135064 +GTF3AP2 106480682 +GTF3AP3 112323209 +GTF3AP4 100420593 +GTF3AP5 100128217 +GTF3AP6 100135063 +GTF3C1 2975 +GTF3C2 2976 +GTF3C2-AS1 100505624 +GTF3C2-AS2 105374363 +GTF3C3 9330 +GTF3C4 9329 +GTF3C5 9328 +GTF3C6 112495 +GTF3C6P1 100129001 +GTF3C6P2 644563 +GTF3C6P3 646745 +GTPBP1 9567 +GTPBP2 54676 +GTPBP3 84705 +GTPBP4 23560 +GTPBP6 8225 +GTPBP8 29083 +GTPBP10 85865 +GTSCR1 220158 +GTSE1 51512 +GTSE1-DT 150384 +GTSF1 121355 +GTSF1L 149699 +GUCA1A 2978 +GUCA1ANB-GUCA1A 118142757 +GUCA1B 2979 +GUCA1C 9626 +GUCA2A 2980 +GUCA2B 2981 +GUCD1 83606 +GUCY1A1 2982 +GUCY1A2 2977 +GUCY1B1 2983 +GUCY1B2 2974 +GUCY2C 2984 +GUCY2C-AS1 123706531 +GUCY2D 3000 +GUCY2EP 390226 +GUCY2F 2986 +GUCY2GP 390003 +GUF1 60558 +GUK1 2987 +GUK2 2988 +GULOP 2989 +GULP1 51454 +GUSB 2990 +GUSBP1 728411 +GUSBP2 387036 +GUSBP3 653188 +GUSBP4 375513 +GUSBP5 441046 +GUSBP6 653435 +GUSBP7 100132456 +GUSBP8 441066 +GUSBP9 118126072 +GUSBP10 642006 +GUSBP11 91316 +GUSBP12 642007 +GUSBP13 100287046 +GUSBP14 11039 +GUSBP15 11042 +GUSBP16 653080 +GUSBP17 100049076 +GUSBP18 643373 +GUSBP19 100133050 +GVINP1 387751 +GVINP2 100128135 +GVQW3 100506127 +GXYLT1 283464 +GXYLT1P1 100101111 +GXYLT1P2 441958 +GXYLT1P3 100132541 +GXYLT1P4 100132441 +GXYLT1P5 100131760 +GXYLT1P6 100132672 +GXYLT1P7 100130488 +GXYLT2 727936 +GYG1 2992 +GYG1P1 100132965 +GYG1P2 647317 +GYG1P3 645506 +GYG2 8908 +GYG2-AS1 100873938 +GYG2P1 352887 +GYG2P2 100418892 +GYPA 2993 +GYPB 2994 +GYPC 2995 +GYPE 2996 +GYS1 2997 +GYS2 2998 +GZF1 64412 +GZMA 3001 +GZMAP1 106479035 +GZMB 3002 +GZMH 2999 +GZMK 3003 +GZMM 3004 +H1-0 3005 +H1-1 3024 +H1-2 3006 +H1-3 3007 +H1-4 3008 +H1-5 3009 +H1-6 3010 +H1-7 341567 +H1-8 132243 +H1-8P1 642487 +H1-8P2 100130048 +H1-9P 373861 +H1-10 8971 +H1-10-AS1 339942 +H1-12P 387325 +H2AB1 474382 +H2AB2 474381 +H2AB3 83740 +H2AC1 221613 +H2AC2P 387319 +H2AC3P 85303 +H2AC4 8335 +H2AC5P 10341 +H2AC6 8334 +H2AC7 3013 +H2AC8 3012 +H2AC9P 387323 +H2AC10P 8333 +H2AC11 8969 +H2AC12 85235 +H2AC13 8329 +H2AC14 8331 +H2AC15 8330 +H2AC16 8332 +H2AC17 8336 +H2AC18 8337 +H2AC19 723790 +H2AC20 8338 +H2AC21 317772 +H2AC25 92815 +H2ACP1 100509927 +H2ACP2 115482716 +H2AJ 55766 +H2AL1MP 115482687 +H2AL1Q 115482714 +H2AL3 115482686 +H2AP 25763 +H2AQ1P 115482715 +H2AX 3014 +H2AZ1 3015 +H2AZ1-DT 256880 +H2AZ2 94239 +H2AZ2-DT 105375261 +H2AZ2P1 654500 +H2AZP1 54049 +H2AZP2 346990 +H2AZP3 728023 +H2AZP4 100462795 +H2AZP5 100288330 +H2AZP6 100462800 +H2AZP7 115482726 +H2BC1 255626 +H2BC2P 100288742 +H2BC3 3018 +H2BC4 8347 +H2BC5 3017 +H2BC6 8344 +H2BC6-AS1 128266838 +H2BC7 8343 +H2BC8 8339 +H2BC9 8345 +H2BC10 8346 +H2BC11 8970 +H2BC12 85236 +H2BC12L 54145 +H2BC13 8340 +H2BC14 8342 +H2BC15 8341 +H2BC16P 10340 +H2BC17 8348 +H2BC18 440689 +H2BC19P 337874 +H2BC20P 337873 +H2BC21 8349 +H2BC26 128312 +H2BC27P 337872 +H2BK1 114483833 +H2BL1P 115482689 +H2BN1 124188214 +H2BP1 337875 +H2BP2 338391 +H2BP3 391566 +H2BP5 115482690 +H2BP6 100820735 +H2BP7 115482717 +H2BP8 115482725 +H2BP9 115482691 +H2BW1 158983 +H2BW2 286436 +H2BW3P 100101478 +H2BW4P 767811 +H3-3A 3020 +H3-3A-DT 118568813 +H3-3B 3021 +H3-4 8290 +H3-5 440093 +H3-7 440686 +H3C1 8350 +H3C2 8358 +H3C3 8352 +H3C4 8351 +H3C5P 115482688 +H3C6 8353 +H3C7 8968 +H3C8 8355 +H3C9P 100289545 +H3C10 8357 +H3C11 8354 +H3C12 8356 +H3C13 653604 +H3C14 126961 +H3C15 333932 +H3P1 115482711 +H3P2 115482681 +H3P3 115482682 +H3P4 106479023 +H3P5 115482712 +H3P6 440926 +H3P7 115482683 +H3P8 115482693 +H3P9 115482684 +H3P10 115482713 +H3P11 115482708 +H3P12 100689229 +H3P13 115482685 +H3P14 107986209 +H3P15 100419353 +H3P16 644914 +H3P17 115482694 +H3P18 391744 +H3P19 115482709 +H3P20 100289141 +H3P21 391765 +H3P22 115482719 +H3P23 115482696 +H3P24 115482697 +H3P25 115482720 +H3P26 10338 +H3P27 115482698 +H3P28 115482699 +H3P29 115482721 +H3P30 115482700 +H3P31 115482710 +H3P32 115482701 +H3P33 115482722 +H3P34 115482702 +H3P35 115482703 +H3P36 100287087 +H3P37 664611 +H3P38 654505 +H3P39 115482707 +H3P40 115482723 +H3P41 100420410 +H3P42 115482704 +H3P43 100506811 +H3P44 347376 +H3P45 115482705 +H3P46 115482724 +H3P47 115482706 +H3Y1 391769 +H3Y2 340096 +H4C1 8359 +H4C2 8366 +H4C3 8364 +H4C4 8360 +H4C5 8367 +H4C6 8361 +H4C7 8369 +H4C8 8365 +H4C9 8294 +H4C10P 10337 +H4C11 8363 +H4C12 8362 +H4C13 8368 +H4C14 8370 +H4C15 554313 +H4C16 121504 +H4P1 115482692 +H6PD 9563 +H19 283120 +HAAO 23498 +HABP2 3026 +HABP4 22927 +HACD1 9200 +HACD2 201562 +HACD3 51495 +HACD4 401494 +HACE1 57531 +HACL1 26061 +HADH 3033 +HADHA 3030 +HADHAP1 3031 +HADHAP2 399994 +HADHB 3032 +HADHBP1 100287928 +HAFML 105377555 +HAGH 3029 +HAGHL 84264 +HAGLR 401022 +HAGLROS 102800310 +HAL 3034 +HAMP 57817 +HAND1 9421 +HAND2 9464 +HAND2-AS1 79804 +HAO1 54363 +HAO2 51179 +HAO2-IT1 100874270 +HAP1 9001 +HAPLN1 1404 +HAPLN2 60484 +HAPLN3 145864 +HAPLN4 404037 +HAPSTR1 29035 +HAPSTR2 389895 +HAR1A 768096 +HAR1B 768097 +HARBI1 283254 +HARS1 3035 +HARS2 23438 +HAS1 3036 +HAS2 3037 +HAS2-AS1 594842 +HAS3 3038 +HASPIN 83903 +HAT1 8520 +HAUS1 115106 +HAUS1P1 728921 +HAUS1P2 441484 +HAUS1P3 100271703 +HAUS2 55142 +HAUS3 79441 +HAUS4 54930 +HAUS4P1 100129402 +HAUS5 23354 +HAUS5-DT 118827809 +HAUS6 54801 +HAUS6P1 653175 +HAUS6P2 100133268 +HAUS6P3 102723574 +HAUS7 55559 +HAUS8 93323 +HAUS8P1 100420901 +HAVCR1 26762 +HAVCR1P1 100101266 +HAVCR1P2 100421002 +HAVCR2 84868 +HAX1 10456 +HAX1P1 100129661 +HBA1 3039 +HBA2 3040 +HBAP1 3041 +HBB 3043 +HBBP1 3044 +HBD 3045 +HBE1 3046 +HBEGF 1839 +HBG1 3047 +HBG2 3048 +HBM 3042 +HBP1 26959 +HBQ1 3049 +HBS1L 10767 +HBZ 3050 +HBZP1 3051 +HCAR1 27198 +HCAR2 338442 +HCAR3 8843 +HCCAT5 283902 +HCCS 3052 +HCCS-DT 121847985 +HCFC1 3054 +HCFC1-AS1 100873990 +HCFC1R1 54985 +HCFC2 29915 +HCFC2P1 100419149 +HCG4 54435 +HCG4B 80868 +HCG4P1 387503 +HCG4P2 387504 +HCG4P3 353001 +HCG4P4 353002 +HCG4P5 353003 +HCG4P7 353004 +HCG4P8 353005 +HCG4P9 353014 +HCG4P11 353020 +HCG9 10255 +HCG9P1 387505 +HCG9P2 387506 +HCG9P3 387507 +HCG9P5 353019 +HCG11 493812 +HCG13P 493813 +HCG14 414760 +HCG15 414761 +HCG17 414778 +HCG18 414777 +HCG19P 414776 +HCG20 105375013 +HCG21 102723346 +HCG22 285834 +HCG23 414764 +HCG24 414768 +HCG25 414765 +HCG26 352961 +HCG27 253018 +HCK 3055 +HCLS1 3059 +HCN1 348980 +HCN2 610 +HCN3 57657 +HCN4 10021 +HCP5 10866 +HCP5B 352990 +HCRT 3060 +HCRTR1 3061 +HCRTR2 3062 +HCST 10870 +HDAC1 3065 +HDAC1P1 100419595 +HDAC1P2 100419489 +HDAC2 3066 +HDAC2-AS2 101927768 +HDAC3 8841 +HDAC4 9759 +HDAC4-AS1 101928111 +HDAC5 10014 +HDAC6 10013 +HDAC7 51564 +HDAC8 55869 +HDAC9 9734 +HDAC9-AS1 105375176 +HDAC10 83933 +HDAC11 79885 +HDAC11-AS1 100874101 +HDC 3067 +HDDC2 51020 +HDDC3 374659 +HDGF 3068 +HDGFL1 154150 +HDGFL2 84717 +HDGFL3 50810 +HDGFL3P1 117751742 +HDGFP1 474167 +HDHD2 84064 +HDHD3 81932 +HDHD5 27440 +HDHD5-AS1 100130717 +HDLBP 3069 +HDLBP-AS1 101927509 +HDX 139324 +HEATR1 55127 +HEATR3 55027 +HEATR3-AS1 120017339 +HEATR4 399671 +HEATR5A 25938 +HEATR5A-DT 101927124 +HEATR5B 54497 +HEATR6 63897 +HEATR6-DT 105371849 +HEATR9 256957 +HEBP1 50865 +HEBP2 23593 +HEBP2P1 100128759 +HECA 51696 +HECTD1 25831 +HECTD2 143279 +HECTD2-AS1 100188947 +HECTD3 79654 +HECTD4 283450 +HECW1 23072 +HECW1-IT1 100127950 +HECW2 57520 +HECW2-AS1 101927482 +HEG1 57493 +HEIH 100859930 +HELB 92797 +HELLPAR 101101692 +HELLS 3070 +HELQ 113510 +HELT 391723 +HELZ 9931 +HELZ-AS1 101928021 +HELZ2 85441 +HEMGN 55363 +HEMK1 51409 +HENMT1 113802 +HEPACAM 220296 +HEPACAM2 253012 +HEPFAL 124905036 +HEPH 9843 +HEPHL1 341208 +HEPN1 641654 +HERC1 8925 +HERC2 8924 +HERC2P1 8917 +HERC2P2 400322 +HERC2P3 283755 +HERC2P4 100289574 +HERC2P5 388254 +HERC2P6 8918 +HERC2P7 100132101 +HERC2P8 440366 +HERC2P9 440248 +HERC2P10 390561 +HERC2P11 100996738 +HERC3 8916 +HERC4 26091 +HERC5 51191 +HERC6 55008 +HERPUD1 9709 +HERPUD2 64224 +HERPUD2-AS1 101930085 +HES1 3280 +HES2 54626 +HES3 390992 +HES4 57801 +HES5 388585 +HES6 55502 +HES7 84667 +HESX1 8820 +HEXA 3073 +HEXA-AS1 80072 +HEXB 3074 +HEXD 284004 +HEXD-IT1 100505970 +HEXIM1 10614 +HEXIM2 124790 +HEXIM2-AS1 112268203 +HEY1 23462 +HEY2 23493 +HEY2-AS1 105377986 +HEYL 26508 +HFE 3077 +HFE-AS1 108783645 +HFM1 164045 +HGD 3081 +HGF 3082 +HGFAC 3083 +HGH1 51236 +HGS 9146 +HGSNAT 138050 +HHAT 55733 +HHATL 57467 +HHATL-AS1 100874044 +HHEX 3087 +HHIP 64399 +HHIP-AS1 646576 +HHIPL1 84439 +HHIPL2 79802 +HHLA1 10086 +HHLA2 11148 +HIBADH 11112 +HIBCH 26275 +HIC1 3090 +HIC2 23119 +HID1 283987 +HID1-AS1 102723641 +HIF1A 3091 +HIF1A-AS1 100750246 +HIF1A-AS2 100750247 +HIF1A-AS3 105370526 +HIF1AN 55662 +HIF1AP1 100874523 +HIF3A 64344 +HIGD1A 25994 +HIGD1AP1 100129086 +HIGD1AP2 100874450 +HIGD1AP3 100859920 +HIGD1AP4 100874435 +HIGD1AP5 100289300 +HIGD1AP6 100874436 +HIGD1AP7 100874437 +HIGD1AP8 100874451 +HIGD1AP9 100874452 +HIGD1AP10 100287960 +HIGD1AP11 100874453 +HIGD1AP12 100130383 +HIGD1AP13 100874454 +HIGD1AP14 100874455 +HIGD1AP15 100289605 +HIGD1AP16 100874476 +HIGD1AP17 100874477 +HIGD1AP18 100874456 +HIGD1B 51751 +HIGD1C 613227 +HIGD2A 192286 +HIGD2AP1 100289360 +HIGD2AP2 112268442 +HIGD2B 123346 +HIKESHI 51501 +HIKESHIP1 100217367 +HIKESHIP2 117751740 +HIKESHIP3 117751737 +HILPDA 29923 +HILPDA-AS1 102724660 +HINFP 25988 +HINT1 3094 +HINT1P1 730647 +HINT1P2 100233146 +HINT2 84681 +HINT2P1 101929471 +HINT3 135114 +HIP1 3092 +HIP1R 9026 +HIPK1 204851 +HIPK1-AS1 101928846 +HIPK2 28996 +HIPK3 10114 +HIPK4 147746 +HIRA 7290 +HIRAP1 100422545 +HIRIP3 8479 +HISLA 283587 +HIVEP1 3096 +HIVEP2 3097 +HIVEP2-DT 107986655 +HIVEP3 59269 +HJURP 55355 +HJV 148738 +HK1 3098 +HK2 3099 +HK2-DT 118568819 +HK2P1 642546 +HK3 3101 +HKDC1 80201 +HLA-A 3105 +HLA-B 3106 +HLA-C 3107 +HLA-DMA 3108 +HLA-DMB 3109 +HLA-DOA 3111 +HLA-DOB 3112 +HLA-DPA1 3113 +HLA-DPA2 646702 +HLA-DPA3 267013 +HLA-DPB1 3115 +HLA-DPB2 3116 +HLA-DQA1 3117 +HLA-DQA1-AS1 124901301 +HLA-DQA2 3118 +HLA-DQB1 3119 +HLA-DQB1-AS1 106480429 +HLA-DQB2 3120 +HLA-DQB3 3121 +HLA-DRA 3122 +HLA-DRB1 3123 +HLA-DRB2 3124 +HLA-DRB3 3125 +HLA-DRB4 3126 +HLA-DRB5 3127 +HLA-DRB6 3128 +HLA-DRB7 3129 +HLA-DRB8 3130 +HLA-DRB9 3132 +HLA-E 3133 +HLA-F 3134 +HLA-F-AS1 285830 +HLA-G 3135 +HLA-H 3136 +HLA-J 3137 +HLA-K 3138 +HLA-L 3139 +HLA-N 267014 +HLA-P 352963 +HLA-S 267015 +HLA-T 352964 +HLA-U 352965 +HLA-V 352962 +HLA-W 352966 +HLA-X 267016 +HLA-Y 100127173 +HLA-Z 267017 +HLCS 3141 +HLCS-AS1 122455337 +HLCS-IT1 100874294 +HLF 3131 +HLFP1 100873813 +HLTF 6596 +HLTF-AS1 100873945 +HLX 3142 +HLX-AS1 100873924 +HM13 81502 +HM13-AS1 100874042 +HM13-IT1 106480432 +HMBOX1 79618 +HMBOX1-IT1 106481795 +HMBS 3145 +HMCES 56941 +HMCN1 83872 +HMCN2 256158 +HMG20A 10363 +HMG20B 10362 +HMGA1 3159 +HMGA1P1 203477 +HMGA1P2 171559 +HMGA1P3 144712 +HMGA1P4 100506080 +HMGA1P5 387063 +HMGA1P6 100130029 +HMGA1P7 387065 +HMGA1P8 100130009 +HMGA2 8091 +HMGA2-AS1 100129940 +HMGB1 3146 +HMGB1P1 10357 +HMGB1P3 10356 +HMGB1P4 10355 +HMGB1P5 10354 +HMGB1P6 645292 +HMGB1P7 100420044 +HMGB1P8 692147 +HMGB1P9 654503 +HMGB1P10 100130561 +HMGB1P11 100419996 +HMGB1P12 100129723 +HMGB1P13 100129706 +HMGB1P14 319130 +HMGB1P15 644129 +HMGB1P16 646577 +HMGB1P17 100419974 +HMGB1P18 646526 +HMGB1P19 100419979 +HMGB1P20 100128227 +HMGB1P21 100419947 +HMGB1P22 644659 +HMGB1P23 100873891 +HMGB1P24 100420063 +HMGB1P25 644651 +HMGB1P26 645201 +HMGB1P27 100527948 +HMGB1P28 100133310 +HMGB1P29 100873892 +HMGB1P30 100873893 +HMGB1P31 100873894 +HMGB1P32 100419995 +HMGB1P33 100873905 +HMGB1P34 100420100 +HMGB1P35 100419950 +HMGB1P36 100419968 +HMGB1P37 100132863 +HMGB1P38 100873895 +HMGB1P39 100419972 +HMGB1P40 100506595 +HMGB1P41 100873896 +HMGB1P42 100873906 +HMGB1P43 100420041 +HMGB1P44 100130279 +HMGB1P45 100129919 +HMGB1P46 100419978 +HMGB1P47 100873897 +HMGB1P48 100128639 +HMGB1P49 100420013 +HMGB1P50 109729125 +HMGB1P51 109729159 +HMGB2 3148 +HMGB2P1 729119 +HMGB3 3149 +HMGB3P1 128872 +HMGB3P2 128879 +HMGB3P3 100419949 +HMGB3P4 100873890 +HMGB3P5 645360 +HMGB3P6 729952 +HMGB3P7 100420033 +HMGB3P8 100506039 +HMGB3P9 100873879 +HMGB3P10 100129320 +HMGB3P11 644442 +HMGB3P12 100873898 +HMGB3P13 100289158 +HMGB3P14 100873899 +HMGB3P15 644429 +HMGB3P16 100873900 +HMGB3P17 100419948 +HMGB3P18 644502 +HMGB3P19 729635 +HMGB3P20 442661 +HMGB3P21 100873901 +HMGB3P22 729595 +HMGB3P23 100288563 +HMGB3P24 646993 +HMGB3P25 100873908 +HMGB3P26 100130405 +HMGB3P27 441795 +HMGB3P28 100131036 +HMGB3P29 100420015 +HMGB3P30 203510 +HMGB3P31 392545 +HMGB3P32 100507549 +HMGB4 127540 +HMGCL 3155 +HMGCLL1 54511 +HMGCR 3156 +HMGCS1 3157 +HMGCS2 3158 +HMGN1 3150 +HMGN1P1 319131 +HMGN1P2 54048 +HMGN1P3 100036574 +HMGN1P4 100036575 +HMGN1P5 100874429 +HMGN1P6 100874430 +HMGN1P7 100129555 +HMGN1P8 100874431 +HMGN1P9 100874410 +HMGN1P10 100874438 +HMGN1P11 644534 +HMGN1P12 106480725 +HMGN1P13 100874439 +HMGN1P14 100874440 +HMGN1P15 100874441 +HMGN1P16 100874442 +HMGN1P17 100874443 +HMGN1P18 100874444 +HMGN1P19 100874445 +HMGN1P20 100874459 +HMGN1P21 728325 +HMGN1P22 100874460 +HMGN1P23 100874461 +HMGN1P24 100874462 +HMGN1P25 100507124 +HMGN1P26 100128015 +HMGN1P27 100874463 +HMGN1P28 100874464 +HMGN1P29 100885865 +HMGN1P30 100132992 +HMGN1P31 728111 +HMGN1P32 100874465 +HMGN1P33 100874446 +HMGN1P34 100874447 +HMGN1P35 100874448 +HMGN1P36 728851 +HMGN1P37 728776 +HMGN1P38 643790 +HMGN2 3151 +HMGN2P1 319132 +HMGN2P2 317726 +HMGN2P3 728632 +HMGN2P4 643744 +HMGN2P5 727795 +HMGN2P6 643872 +HMGN2P7 644498 +HMGN2P8 100288691 +HMGN2P9 23605 +HMGN2P10 23606 +HMGN2P11 3152 +HMGN2P12 3153 +HMGN2P13 100289682 +HMGN2P14 100874458 +HMGN2P15 100288165 +HMGN2P16 728234 +HMGN2P17 100113373 +HMGN2P18 648822 +HMGN2P19 100874466 +HMGN2P20 646049 +HMGN2P21 100874467 +HMGN2P22 100874468 +HMGN2P23 100874469 +HMGN2P24 729505 +HMGN2P25 729687 +HMGN2P26 100874470 +HMGN2P27 100874471 +HMGN2P28 100128372 +HMGN2P29 100874472 +HMGN2P30 100131183 +HMGN2P31 645930 +HMGN2P32 100874473 +HMGN2P33 100874474 +HMGN2P34 100874478 +HMGN2P35 100874479 +HMGN2P36 100874480 +HMGN2P37 100874481 +HMGN2P38 100874482 +HMGN2P39 100874483 +HMGN2P40 100874484 +HMGN2P41 729564 +HMGN2P42 100874485 +HMGN2P43 100874486 +HMGN2P44 100874487 +HMGN2P45 100874475 +HMGN2P46 283651 +HMGN2P47 106480791 +HMGN2P48 100129956 +HMGN3 9324 +HMGN3-AS1 100288198 +HMGN3P1 100289191 +HMGN4 10473 +HMGN5 79366 +HMGXB3 22993 +HMGXB4 10042 +HMHB1 57824 +HMMR 3161 +HMMR-AS1 101927813 +HMOX1 3162 +HMOX2 3163 +HMSD 284293 +HMX1 3166 +HMX2 3167 +HMX3 340784 +HNF1A 6927 +HNF1A-AS1 283460 +HNF1B 6928 +HNF4A 3172 +HNF4A-AS1 101927219 +HNF4G 3174 +HNF4GP1 100130462 +HNMT 3176 +HNRNPA0 10949 +HNRNPA1 3178 +HNRNPA1L2 144983 +HNRNPA1L3 642659 +HNRNPA1P1 645950 +HNRNPA1P2 100131609 +HNRNPA1P3 170524 +HNRNPA1P4 389674 +HNRNPA1P5 100506712 +HNRNPA1P6 729423 +HNRNPA1P7 388275 +HNRNPA1P8 402562 +HNRNPA1P9 100421389 +HNRNPA1P10 664709 +HNRNPA1P11 100128044 +HNRNPA1P12 644037 +HNRNPA1P13 100131130 +HNRNPA1P14 100421351 +HNRNPA1P15 100421353 +HNRNPA1P16 440396 +HNRNPA1P17 100421376 +HNRNPA1P18 100874400 +HNRNPA1P19 100874402 +HNRNPA1P20 344741 +HNRNPA1P21 344697 +HNRNPA1P22 729102 +HNRNPA1P23 100130002 +HNRNPA1P24 100874396 +HNRNPA1P25 100131983 +HNRNPA1P26 664722 +HNRNPA1P27 664721 +HNRNPA1P28 100288038 +HNRNPA1P29 100421424 +HNRNPA1P30 440125 +HNRNPA1P31 100506925 +HNRNPA1P32 645940 +HNRNPA1P33 728643 +HNRNPA1P34 100996501 +HNRNPA1P35 645691 +HNRNPA1P36 100128836 +HNRNPA1P37 100421379 +HNRNPA1P38 100421384 +HNRNPA1P39 402112 +HNRNPA1P40 100129920 +HNRNPA1P41 100128701 +HNRNPA1P42 100287266 +HNRNPA1P43 400769 +HNRNPA1P44 100421432 +HNRNPA1P45 100130660 +HNRNPA1P46 100421399 +HNRNPA1P47 100287191 +HNRNPA1P49 106481663 +HNRNPA1P50 728170 +HNRNPA1P51 729366 +HNRNPA1P52 645001 +HNRNPA1P53 728732 +HNRNPA1P54 100421398 +HNRNPA1P55 642958 +HNRNPA1P56 391670 +HNRNPA1P57 101060039 +HNRNPA1P58 100289286 +HNRNPA1P59 730246 +HNRNPA1P60 120364 +HNRNPA1P61 100288283 +HNRNPA1P62 106480235 +HNRNPA1P63 645436 +HNRNPA1P64 100129325 +HNRNPA1P65 106481664 +HNRNPA1P66 391378 +HNRNPA1P67 728019 +HNRNPA1P68 100421397 +HNRNPA1P69 105369973 +HNRNPA1P70 341333 +HNRNPA1P71 100421433 +HNRNPA1P72 106480236 +HNRNPA1P73 100129606 +HNRNPA1P74 100421430 +HNRNPA1P75 112436691 +HNRNPA1P76 106480675 +HNRNPA1P77 100421378 +HNRNPA2B1 3181 +HNRNPA3 220988 +HNRNPA3P1 10151 +HNRNPA3P2 170526 +HNRNPA3P3 643689 +HNRNPA3P4 389395 +HNRNPA3P5 387933 +HNRNPA3P6 653115 +HNRNPA3P7 100421357 +HNRNPA3P8 100129557 +HNRNPA3P9 100421415 +HNRNPA3P10 100421413 +HNRNPA3P11 100421431 +HNRNPA3P12 100421395 +HNRNPA3P13 441026 +HNRNPA3P14 729817 +HNRNPA3P15 106480234 +HNRNPA3P16 100421451 +HNRNPAB 3182 +HNRNPABP1 390294 +HNRNPC 3183 +HNRNPCL1 343069 +HNRNPCL2 440563 +HNRNPCL3 649330 +HNRNPCL4 101060301 +HNRNPCP1 319133 +HNRNPCP2 653447 +HNRNPCP3 646956 +HNRNPCP4 100421828 +HNRNPCP6 100421794 +HNRNPCP7 100127907 +HNRNPCP8 100131842 +HNRNPCP9 100130196 +HNRNPCP10 100129229 +HNRNPD 3184 +HNRNPD-DT 101928963 +HNRNPDL 9987 +HNRNPDLP1 100128595 +HNRNPDLP2 100128061 +HNRNPDLP3 106481662 +HNRNPDLP4 100421657 +HNRNPDLP5 112351742 +HNRNPDP1 8251 +HNRNPDP2 106481661 +HNRNPF 3185 +HNRNPFP1 644449 +HNRNPH1 3187 +HNRNPH1P1 100132803 +HNRNPH1P2 100129368 +HNRNPH1P3 402216 +HNRNPH2 3188 +HNRNPH3 3189 +HNRNPH3P1 106480233 +HNRNPK 3190 +HNRNPK-AS1 123706516 +HNRNPKP1 389322 +HNRNPKP2 389053 +HNRNPKP3 399881 +HNRNPKP4 644063 +HNRNPKP5 100874385 +HNRNPL 3191 +HNRNPLL 92906 +HNRNPLP1 442157 +HNRNPLP2 644390 +HNRNPM 4670 +HNRNPMP1 645204 +HNRNPMP2 390948 +HNRNPR 10236 +HNRNPRP1 100125387 +HNRNPRP2 100421354 +HNRNPRP3 100421323 +HNRNPU 3192 +HNRNPUL1 11100 +HNRNPUL2 221092 +HNRNPUL2-BSCL2 100534595 +HNRNPUP1 319134 +HOATZ 399949 +HOGA1 112817 +HOMER1 9456 +HOMER2 9455 +HOMER2P1 317768 +HOMER2P2 317769 +HOMER3 9454 +HOMER3-AS1 102724360 +HOMEZ 57594 +HOOK1 51361 +HOOK2 29911 +HOOK3 84376 +HOPX 84525 +HORMAD1 84072 +HORMAD2 150280 +HORMAD2-AS1 101929664 +HOTAIR 100124700 +HOTAIRM1 100506311 +HOTTIP 100316868 +HOXA-AS2 285943 +HOXA-AS3 100133311 +HOXA@ 3197 +HOXA1 3198 +HOXA2 3199 +HOXA3 3200 +HOXA4 3201 +HOXA5 3202 +HOXA6 3203 +HOXA7 3204 +HOXA9 3205 +HOXA10 3206 +HOXA10-AS 100874323 +HOXA11 3207 +HOXA11-AS 221883 +HOXA13 3209 +HOXB-AS1 100874362 +HOXB-AS2 100874350 +HOXB-AS3 404266 +HOXB-AS4 100874351 +HOXB@ 3210 +HOXB1 3211 +HOXB2 3212 +HOXB3 3213 +HOXB4 3214 +HOXB5 3215 +HOXB6 3216 +HOXB7 3217 +HOXB8 3218 +HOXB9 3219 +HOXB13 10481 +HOXC-AS1 100874363 +HOXC-AS2 100874364 +HOXC-AS3 100874365 +HOXC@ 3220 +HOXC4 3221 +HOXC5 3222 +HOXC6 3223 +HOXC8 3224 +HOXC9 3225 +HOXC10 3226 +HOXC11 3227 +HOXC12 3228 +HOXC13 3229 +HOXC13-AS 100874366 +HOXD-AS2 100506783 +HOXD@ 3230 +HOXD1 3231 +HOXD3 3232 +HOXD4 3233 +HOXD8 3234 +HOXD9 3235 +HOXD10 3236 +HOXD11 3237 +HOXD12 3238 +HOXD13 3239 +HP 3240 +HP1BP3 50809 +HPCA 3208 +HPCAL1 3241 +HPCAL4 51440 +HPD 3242 +HPDL 84842 +HPF1 54969 +HPGD 3248 +HPGDS 27306 +HPN 3249 +HPN-AS1 100128675 +HPR 3250 +HPRT1 3251 +HPRT1P1 100130067 +HPRT1P2 3254 +HPRT1P3 3255 +HPS1 3257 +HPS1-AS1 101927278 +HPS3 84343 +HPS4 89781 +HPS5 11234 +HPS6 79803 +HPSE 10855 +HPSE2 60495 +HPV6AI1 3259 +HPV18I1 3260 +HPV18I2 3261 +HPX 3263 +HPYR1 93668 +HR 55806 +HRAS 3265 +HRC 3270 +HRCT1 646962 +HRES1 3272 +HRG 3273 +HRG-AS1 105374258 +HRGP1 100533663 +HRGP2 127525789 +HRH1 3269 +HRH2 3274 +HRH3 11255 +HRH4 59340 +HRK 8739 +HRNR 388697 +HROB 78995 +HRURF 120766137 +HS1BP3 64342 +HS1BP3-IT1 100874343 +HS2ST1 9653 +HS3ST1 9957 +HS3ST2 9956 +HS3ST3A1 9955 +HS3ST3B1 9953 +HS3ST4 9951 +HS3ST5 222537 +HS3ST6 64711 +HS6ST1 9394 +HS6ST1P1 388605 +HS6ST2 90161 +HS6ST2-AS1 100874102 +HS6ST3 266722 +HSBP1 3281 +HSBP1L1 440498 +HSBP1P1 326296 +HSBP1P2 100288483 +HSCB 150274 +HSD3B1 3283 +HSD3B2 3284 +HSD3B7 80270 +HSD3BP1 391076 +HSD3BP2 440606 +HSD3BP3 441900 +HSD3BP4 128102 +HSD3BP5 391081 +HSD11B1 3290 +HSD11B1-AS1 101930114 +HSD11B1L 374875 +HSD11B2 3291 +HSD17B1 3292 +HSD17B1-AS1 108783654 +HSD17B1P1 643646 +HSD17B2 3294 +HSD17B2-AS1 105371363 +HSD17B3 3293 +HSD17B3-AS1 105376162 +HSD17B4 3295 +HSD17B6 8630 +HSD17B7 51478 +HSD17B7P1 148818 +HSD17B7P2 158160 +HSD17B8 7923 +HSD17B10 3028 +HSD17B11 51170 +HSD17B12 51144 +HSD17B13 345275 +HSD17B14 51171 +HSDL1 83693 +HSDL2 84263 +HSDL2-AS1 100133204 +HSF1 3297 +HSF2 3298 +HSF2BP 11077 +HSF4 3299 +HSF5 124535 +HSFX1 100506164 +HSFX2 100130086 +HSFX3 101928917 +HSFX4 101927685 +HSFY1 86614 +HSFY1P1 27437 +HSFY2 159119 +HSFY3P 442479 +HSFY4P 643987 +HSFY5P 106478934 +HSFY6P 106480722 +HSFY7P 106478935 +HSFY8P 106480723 +HSH2D 84941 +HSP90AA1 3320 +HSP90AA2P 3324 +HSP90AA3P 3322 +HSP90AA4P 3323 +HSP90AA5P 730211 +HSP90AA6P 441051 +HSP90AB1 3326 +HSP90AB2P 391634 +HSP90AB3P 3327 +HSP90AB4P 664618 +HSP90AB5P 442083 +HSP90AB6P 541611 +HSP90AB7P 644495 +HSP90B1 7184 +HSP90B2P 7190 +HSP90B3P 343477 +HSPA1A 3303 +HSPA1B 3304 +HSPA1L 3305 +HSPA2 3306 +HSPA2-AS1 102723809 +HSPA4 3308 +HSPA4L 22824 +HSPA5 3309 +HSPA5-DT 107987127 +HSPA5P1 400750 +HSPA6 3310 +HSPA7 3311 +HSPA8 3312 +HSPA8P1 3314 +HSPA8P2 100420133 +HSPA8P3 100420143 +HSPA8P4 100420028 +HSPA8P5 399988 +HSPA8P6 130195 +HSPA8P7 100420080 +HSPA8P8 100287551 +HSPA8P9 402143 +HSPA8P10 100420004 +HSPA8P11 392209 +HSPA8P12 100420038 +HSPA8P13 106480803 +HSPA8P14 642580 +HSPA8P15 100420051 +HSPA8P16 100289643 +HSPA8P17 100533658 +HSPA8P18 402125 +HSPA8P19 100420049 +HSPA8P20 100129231 +HSPA9 3313 +HSPA9P1 266724 +HSPA9P2 100873903 +HSPA12A 259217 +HSPA12A-AS1 105378499 +HSPA12B 116835 +HSPA13 6782 +HSPA14 51182 +HSPB1 3315 +HSPB1P1 653553 +HSPB1P2 653364 +HSPB2 3316 +HSPB2-C11orf52 100528019 +HSPB3 8988 +HSPB6 126393 +HSPB7 27129 +HSPB8 26353 +HSPB9 94086 +HSPBAP1 79663 +HSPBP1 23640 +HSPD1 3329 +HSPD1P1 643300 +HSPD1P2 645808 +HSPD1P3 3332 +HSPD1P4 644745 +HSPD1P5 345041 +HSPD1P6 645548 +HSPD1P7 54047 +HSPD1P8 647298 +HSPD1P9 646910 +HSPD1P10 644016 +HSPD1P11 100359396 +HSPD1P12 283320 +HSPD1P13 100462987 +HSPD1P14 100287140 +HSPD1P15 646273 +HSPD1P16 100462985 +HSPD1P17 100462986 +HSPD1P18 100359397 +HSPD1P19 100463288 +HSPD1P20 100462989 +HSPD1P21 100462990 +HSPD1P22 100462984 +HSPE1 3336 +HSPE1-MOB4 100529241 +HSPE1P1 140895 +HSPE1P2 326300 +HSPE1P3 100507046 +HSPE1P4 100287369 +HSPE1P5 100506000 +HSPE1P6 106480254 +HSPE1P7 100132346 +HSPE1P8 100292290 +HSPE1P9 106480255 +HSPE1P10 100288235 +HSPE1P11 106481673 +HSPE1P12 100286954 +HSPE1P13 106480256 +HSPE1P14 106481674 +HSPE1P15 112323207 +HSPE1P16 171421 +HSPE1P17 112352682 +HSPE1P18 106480257 +HSPE1P19 106481675 +HSPE1P20 100288726 +HSPE1P21 106480258 +HSPE1P22 100289607 +HSPE1P23 106481676 +HSPE1P24 106480259 +HSPE1P25 106480260 +HSPE1P26 106481677 +HSPE1P27 106480261 +HSPE1P28 171420 +HSPG2 3339 +HSPH1 10808 +HTATIP2 10553 +HTATSF1 27336 +HTATSF1P1 387039 +HTATSF1P2 401233 +HTD2 109703458 +HTN1 3346 +HTN3 3347 +HTOR 3349 +HTR1A 3350 +HTR1B 3351 +HTR1D 3352 +HTR1DP1 100421479 +HTR1E 3354 +HTR1F 3355 +HTR2A 3356 +HTR2A-AS1 100874082 +HTR2B 3357 +HTR2C 3358 +HTR3A 3359 +HTR3B 9177 +HTR3C 170572 +HTR3C2P 389180 +HTR3D 200909 +HTR3E 285242 +HTR3E-AS1 106478970 +HTR4 3360 +HTR5A 3361 +HTR5A-AS1 100128264 +HTR5BP 645694 +HTR6 3362 +HTR7 3363 +HTR7P1 93164 +HTRA1 5654 +HTRA2 27429 +HTRA3 94031 +HTRA4 203100 +HTT 3064 +HTT-AS 100750326 +HULC 728655 +HUNK 30811 +HUNK-AS1 106144524 +HUS1 3364 +HUS1B 135458 +HUWE1 10075 +HVBS7 3369 +HVBS8 3370 +HVCN1 84329 +HYAL1 3373 +HYAL2 8692 +HYAL3 8372 +HYAL4 23553 +HYAL6P 26062 +HYCC1 84668 +HYCC2 285172 +HYDIN 54768 +HYDIN2 100288805 +HYDINP1 127379712 +HYI 81888 +HYI-AS1 100873923 +HYKK 123688 +HYLS1 219844 +HYMAI 57061 +HYOU1 10525 +HYOU1-AS1 128385375 +HYPK 25764 +IAH1 285148 +IAPP 3375 +IARS1 3376 +IARS2 55699 +IARS2P1 642461 +IATPR 101929447 +IBA57 200205 +IBA57-DT 574432 +IBSP 3381 +IBTK 25998 +IBTKP1 100127883 +ICA1 3382 +ICA1-AS1 100505938 +ICA1L 130026 +ICAM1 3383 +ICAM2 3384 +ICAM3 3385 +ICAM4 3386 +ICAM4-AS1 123706506 +ICAM5 7087 +ICE1 23379 +ICE2 79664 +ICE2P1 644491 +ICE2P2 728432 +ICMT 23463 +ICMT-DT 148645 +ICOS 29851 +ICOSLG 23308 +ID1 3397 +ID2 3398 +ID2-AS1 100506299 +ID2B 84099 +ID3 3399 +ID4 3400 +IDE 3416 +IDH1 3417 +IDH1-AS1 100507475 +IDH2 3418 +IDH2-DT 105370966 +IDH3A 3419 +IDH3B 3420 +IDH3B-DT 122152330 +IDH3G 3421 +IDI1 3422 +IDI1P1 647002 +IDI1P2 100130299 +IDI1P3 100421361 +IDI2 91734 +IDI2-AS1 55853 +IDNK 414328 +IDO1 3620 +IDO2 169355 +IDS 3423 +IDSP1 3424 +IDUA 3425 +IER2 9592 +IER3 8870 +IER3-AS1 105379695 +IER3IP1 51124 +IER5 51278 +IER5L 389792 +IER5L-AS1 105376290 +IFFO1 25900 +IFFO2 126917 +IFI6 2537 +IFI16 3428 +IFI27 3429 +IFI27L1 122509 +IFI27L2 83982 +IFI30 10437 +IFI35 3430 +IFI44 10561 +IFI44L 10964 +IFIH1 64135 +IFIT1 3434 +IFIT1B 439996 +IFIT1P1 8373 +IFIT2 3433 +IFIT3 3437 +IFIT5 24138 +IFIT6P 100128465 +IFITM1 8519 +IFITM2 10581 +IFITM3 10410 +IFITM3P1 728048 +IFITM3P2 144383 +IFITM3P3 100101247 +IFITM3P4 442309 +IFITM3P5 100101246 +IFITM3P6 643058 +IFITM3P7 391020 +IFITM3P8 442389 +IFITM3P9 442017 +IFITM4P 340198 +IFITM5 387733 +IFITM8P 613204 +IFITM9P 390218 +IFITM10 402778 +IFNA1 3439 +IFNA2 3440 +IFNA4 3441 +IFNA5 3442 +IFNA6 3443 +IFNA7 3444 +IFNA8 3445 +IFNA10 3446 +IFNA11P 3461 +IFNA12P 158011 +IFNA13 3447 +IFNA14 3448 +IFNA16 3449 +IFNA17 3451 +IFNA20P 3463 +IFNA21 3452 +IFNA22P 3453 +IFNAR1 3454 +IFNAR2 3455 +IFNB1 3456 +IFNE 338376 +IFNG 3458 +IFNG-AS1 100885789 +IFNGR1 3459 +IFNGR2 3460 +IFNK 56832 +IFNL1 282618 +IFNL2 282616 +IFNL3 282617 +IFNL3P1 100421129 +IFNL4 101180976 +IFNL4P1 101927833 +IFNLR1 163702 +IFNNP1 654783 +IFNR 3466 +IFNW1 3467 +IFNWP2 646581 +IFNWP4 3469 +IFNWP5 392292 +IFNWP9 100130671 +IFNWP15 100130866 +IFNWP18 360001 +IFNWP19 3474 +IFRD1 3475 +IFRD2 7866 +IFT20 90410 +IFT22 64792 +IFT25 51668 +IFT27 11020 +IFT43 112752 +IFT46 56912 +IFT52 51098 +IFT56 79989 +IFT57 55081 +IFT57P1 100129646 +IFT70A 92104 +IFT70B 150737 +IFT74 80173 +IFT74-AS1 101929602 +IFT80 57560 +IFT81 28981 +IFT88 8100 +IFT122 55764 +IFT122P1 127379724 +IFT122P2 127379735 +IFT122P3 653712 +IFT140 9742 +IFT172 26160 +IFTAP 119710 +IGBP1 3476 +IGBP1-AS1 100873991 +IGBP1-AS2 106478965 +IGBP1C 645545 +IGBP1P1 280655 +IGBP1P3 391526 +IGBP1P4 391672 +IGBP1P5 391642 +IGDCC3 9543 +IGDCC4 57722 +IGF1 3479 +IGF1R 3480 +IGF2 3481 +IGF2-AS 51214 +IGF2BP1 10642 +IGF2BP2 10644 +IGF2BP2-AS1 646600 +IGF2BP3 10643 +IGF2R 3482 +IGFALS 3483 +IGFBP-AS1 101928278 +IGFBP1 3484 +IGFBP2 3485 +IGFBP3 3486 +IGFBP4 3487 +IGFBP5 3488 +IGFBP6 3489 +IGFBP7 3490 +IGFBP7-AS1 255130 +IGFBPL1 347252 +IGFL1 374918 +IGFL1P1 727703 +IGFL1P2 727704 +IGFL2 147920 +IGFL2-AS1 645553 +IGFL3 388555 +IGFL4 444882 +IGFLR1 79713 +IGFN1 91156 +IGH 3492 +IGHA1 3493 +IGHA2 3494 +IGHD 3495 +IGHD1-1 28510 +IGHD1-7 28509 +IGHD1-14 28508 +IGHD1-20 28507 +IGHD1-26 28506 +IGHD1OR15-1A 28335 +IGHD1OR15-1B 28334 +IGHD2-2 28505 +IGHD2-8 28504 +IGHD2-15 28503 +IGHD2-21 28502 +IGHD2OR15-2A 28333 +IGHD2OR15-2B 28332 +IGHD3-3 28501 +IGHD3-9 28500 +IGHD3-10 28499 +IGHD3-16 28498 +IGHD3-22 28497 +IGHD3OR15-3A 28331 +IGHD3OR15-3B 28330 +IGHD4-4 28496 +IGHD4-11 28495 +IGHD4-17 28494 +IGHD4-23 28493 +IGHD4OR15-4A 28329 +IGHD4OR15-4B 28328 +IGHD5-5 28492 +IGHD5-12 28491 +IGHD5-18 28490 +IGHD5-24 28489 +IGHD5OR15-5A 28327 +IGHD5OR15-5B 28326 +IGHD6-6 28488 +IGHD6-13 28487 +IGHD6-19 28486 +IGHD6-25 28485 +IGHD7-27 28484 +IGHE 3497 +IGHEP1 3498 +IGHEP2 3499 +IGHG1 3500 +IGHG2 3501 +IGHG3 3502 +IGHG4 3503 +IGHGP 3505 +IGHJ1 28483 +IGHJ1P 28482 +IGHJ2 28481 +IGHJ2P 28480 +IGHJ3 28479 +IGHJ3P 28478 +IGHJ4 28477 +IGHJ5 28476 +IGHJ6 28475 +IGHM 3507 +IGHMBP2 3508 +IGHV1-2 28474 +IGHV1-3 28473 +IGHV1-8 28472 +IGHV1-12 28471 +IGHV1-14 28470 +IGHV1-17 28469 +IGHV1-18 28468 +IGHV1-24 28467 +IGHV1-38-4 28460 +IGHV1-45 28466 +IGHV1-46 28465 +IGHV1-58 28464 +IGHV1-67 28463 +IGHV1-68 28462 +IGHV1-69 28461 +IGHV1-69-2 28458 +IGHV1-69D 102723169 +IGHV1OR15-1 388077 +IGHV1OR15-2 100287128 +IGHV1OR15-3 646370 +IGHV1OR15-4 646379 +IGHV1OR15-5 100384884 +IGHV1OR15-6 28320 +IGHV1OR15-9 390531 +IGHV1OR16-1 28315 +IGHV1OR16-2 28314 +IGHV1OR16-3 28313 +IGHV1OR16-4 28312 +IGHV1OR21-1 390530 +IGHV2-5 28457 +IGHV2-10 28456 +IGHV2-26 28455 +IGHV2-70 28454 +IGHV2-70D 102723168 +IGHV2OR16-5 100129631 +IGHV3-6 28453 +IGHV3-7 28452 +IGHV3-9 28451 +IGHV3-11 28450 +IGHV3-13 28449 +IGHV3-15 28448 +IGHV3-16 28447 +IGHV3-19 28446 +IGHV3-20 28445 +IGHV3-21 28444 +IGHV3-22 28443 +IGHV3-23 28442 +IGHV3-25 28441 +IGHV3-29 28440 +IGHV3-30 28439 +IGHV3-30-2 28438 +IGHV3-30-3 57290 +IGHV3-30-5 89770 +IGHV3-32 28435 +IGHV3-33 28434 +IGHV3-33-2 28433 +IGHV3-35 28432 +IGHV3-36 28431 +IGHV3-37 28430 +IGHV3-38 28429 +IGHV3-38-3 28404 +IGHV3-41 28428 +IGHV3-42 28427 +IGHV3-43 28426 +IGHV3-43D 103106901 +IGHV3-47 28425 +IGHV3-48 28424 +IGHV3-49 28423 +IGHV3-50 28422 +IGHV3-52 28421 +IGHV3-53 28420 +IGHV3-54 28419 +IGHV3-57 28418 +IGHV3-60 28417 +IGHV3-62 28416 +IGHV3-63 28415 +IGHV3-64 28414 +IGHV3-64D 102723170 +IGHV3-65 28413 +IGHV3-66 28412 +IGHV3-69-1 28402 +IGHV3-71 28411 +IGHV3-72 28410 +IGHV3-73 28409 +IGHV3-74 28408 +IGHV3-75 28407 +IGHV3-76 28406 +IGHV3-79 28405 +IGHV3OR15-7 28318 +IGHV3OR16-6 647187 +IGHV3OR16-7 28309 +IGHV3OR16-8 388255 +IGHV3OR16-9 28307 +IGHV3OR16-10 28306 +IGHV3OR16-11 28305 +IGHV3OR16-12 28304 +IGHV3OR16-13 100287372 +IGHV3OR16-14 100568447 +IGHV3OR16-15 28300 +IGHV3OR16-16 28301 +IGHV3OR16-17 390714 +IGHV4-4 28401 +IGHV4-28 28400 +IGHV4-30-1 28399 +IGHV4-30-2 28398 +IGHV4-30-4 28397 +IGHV4-31 28396 +IGHV4-34 28395 +IGHV4-38-2 28389 +IGHV4-39 28394 +IGHV4-55 28393 +IGHV4-59 28392 +IGHV4-61 28391 +IGHV4-80 28390 +IGHV4OR15-8 28317 +IGHV5-10-1 28386 +IGHV5-51 28388 +IGHV5-78 28387 +IGHV6-1 28385 +IGHV7-4-1 57289 +IGHV7-27 28383 +IGHV7-34-1 28382 +IGHV7-40 28381 +IGHV7-56 28380 +IGHV7-81 28378 +IGHV8-51-1 28343 +IGHVII-1-1 28377 +IGHVII-15-1 28376 +IGHVII-20-1 28375 +IGHVII-22-1 28374 +IGHVII-26-2 28373 +IGHVII-28-1 28372 +IGHVII-30-1 28371 +IGHVII-30-21 107548099 +IGHVII-31-1 28370 +IGHVII-33-1 28369 +IGHVII-40-1 28368 +IGHVII-43-1 28367 +IGHVII-44-2 28366 +IGHVII-46-1 28365 +IGHVII-49-1 28364 +IGHVII-51-2 28363 +IGHVII-53-1 28362 +IGHVII-60-1 28361 +IGHVII-62-1 28360 +IGHVII-65-1 28359 +IGHVII-67-1 28358 +IGHVII-74-1 28357 +IGHVII-78-1 28356 +IGHVIII-2-1 28355 +IGHVIII-5-1 28354 +IGHVIII-5-2 28353 +IGHVIII-11-1 28352 +IGHVIII-13-1 28351 +IGHVIII-16-1 28350 +IGHVIII-22-2 28349 +IGHVIII-25-1 28348 +IGHVIII-26-1 28347 +IGHVIII-38-1 28346 +IGHVIII-44 28345 +IGHVIII-47-1 28344 +IGHVIII-67-2 28342 +IGHVIII-67-3 28341 +IGHVIII-67-4 28340 +IGHVIII-76-1 28339 +IGHVIII-82 28338 +IGHVIV-44-1 28337 +IGIP 492311 +IGK 50802 +IGKC 3514 +IGKDEL 3515 +IGKJ1 28950 +IGKJ2 28949 +IGKJ3 28948 +IGKJ4 28947 +IGKJ5 28946 +IGKV1-5 28299 +IGKV1-6 28943 +IGKV1-8 28942 +IGKV1-9 28941 +IGKV1-12 28940 +IGKV1-13 28939 +IGKV1-16 28938 +IGKV1-17 28937 +IGKV1-22 28936 +IGKV1-27 28935 +IGKV1-32 28934 +IGKV1-33 28933 +IGKV1-35 28932 +IGKV1-37 28931 +IGKV1-39 28930 +IGKV1D-8 28904 +IGKV1D-12 28903 +IGKV1D-13 28902 +IGKV1D-16 28901 +IGKV1D-17 28900 +IGKV1D-22 28899 +IGKV1D-27 28898 +IGKV1D-32 28897 +IGKV1D-33 28896 +IGKV1D-35 28895 +IGKV1D-37 28894 +IGKV1D-39 28893 +IGKV1D-42 28892 +IGKV1D-43 28891 +IGKV1OR-2 3532 +IGKV1OR-3 644731 +IGKV1OR-4 3534 +IGKV1OR1-1 3525 +IGKV1OR2-0 28867 +IGKV1OR2-1 3531 +IGKV1OR2-2 106481689 +IGKV1OR2-3 28866 +IGKV1OR2-6 28865 +IGKV1OR2-9 28864 +IGKV1OR2-11 28863 +IGKV1OR2-108 28862 +IGKV1OR2-118 339562 +IGKV1OR9-1 103352540 +IGKV1OR9-2 106480274 +IGKV1OR10-1 642424 +IGKV1OR15-118 100312985 +IGKV1OR22-1 3530 +IGKV1OR22-5 28850 +IGKV1ORY-1 439957 +IGKV2-4 28929 +IGKV2-10 28928 +IGKV2-14 28927 +IGKV2-18 28926 +IGKV2-19 28925 +IGKV2-23 28924 +IGKV2-24 28923 +IGKV2-26 28922 +IGKV2-28 28921 +IGKV2-29 28920 +IGKV2-30 28919 +IGKV2-36 28918 +IGKV2-38 28917 +IGKV2-40 28916 +IGKV2D-10 28890 +IGKV2D-14 28889 +IGKV2D-18 28888 +IGKV2D-19 28887 +IGKV2D-23 28886 +IGKV2D-24 28885 +IGKV2D-26 28884 +IGKV2D-28 28883 +IGKV2D-29 28882 +IGKV2D-30 28881 +IGKV2D-36 28880 +IGKV2D-38 28879 +IGKV2D-40 28878 +IGKV2OR2-1 28861 +IGKV2OR2-2 28859 +IGKV2OR2-4 28858 +IGKV2OR2-7 652873 +IGKV2OR2-7D 100310869 +IGKV2OR2-8 100996600 +IGKV2OR2-10 28855 +IGKV2OR22-3 3529 +IGKV2OR22-4 28847 +IGKV3-7 28915 +IGKV3-11 28914 +IGKV3-15 28913 +IGKV3-20 28912 +IGKV3-25 28911 +IGKV3-31 28910 +IGKV3-34 28909 +IGKV3D-7 28877 +IGKV3D-11 28876 +IGKV3D-15 28875 +IGKV3D-20 28874 +IGKV3D-25 28873 +IGKV3D-31 28872 +IGKV3D-34 28871 +IGKV3OR2-5 28854 +IGKV3OR2-268 3523 +IGKV3OR22-2 3527 +IGKV4-1 28908 +IGKV5-2 28907 +IGKV6-21 28906 +IGKV6D-21 28870 +IGKV6D-41 28869 +IGKV7-3 28905 +IGL 3535 +IGLC1 3537 +IGLC2 3538 +IGLC3 3539 +IGLC4 3540 +IGLC5 3541 +IGLC6 3542 +IGLC7 28834 +IGLCOR22-1 84096 +IGLCOR22-2 84086 +IGLJ1 28833 +IGLJ2 28832 +IGLJ3 28831 +IGLJ4 28830 +IGLJ5 28829 +IGLJ6 28828 +IGLJ7 28827 +IGLJCOR18 204777 +IGLL1 3543 +IGLL2P 3544 +IGLL3P 91353 +IGLL4P 100287528 +IGLL5 100423062 +IGLON5 402665 +IGLV1-36 28826 +IGLV1-40 28825 +IGLV1-41 28824 +IGLV1-44 28823 +IGLV1-47 28822 +IGLV1-50 28821 +IGLV1-51 28820 +IGLV1-62 28819 +IGLV2-5 28818 +IGLV2-8 28817 +IGLV2-11 28816 +IGLV2-14 28815 +IGLV2-18 28814 +IGLV2-23 28813 +IGLV2-28 28812 +IGLV2-33 28811 +IGLV2-34 28810 +IGLV3-1 28809 +IGLV3-2 28808 +IGLV3-4 28807 +IGLV3-6 28806 +IGLV3-7 28805 +IGLV3-9 28804 +IGLV3-10 28803 +IGLV3-12 28802 +IGLV3-13 28801 +IGLV3-15 28800 +IGLV3-16 28799 +IGLV3-17 28798 +IGLV3-19 28797 +IGLV3-21 28796 +IGLV3-22 28795 +IGLV3-24 28794 +IGLV3-25 28793 +IGLV3-26 28792 +IGLV3-27 28791 +IGLV3-29 28790 +IGLV3-30 28789 +IGLV3-31 28788 +IGLV3-32 28787 +IGLV4-3 28786 +IGLV4-60 28785 +IGLV4-69 28784 +IGLV5-37 28783 +IGLV5-39 28782 +IGLV5-45 28781 +IGLV5-48 28780 +IGLV5-52 28779 +IGLV6-57 28778 +IGLV7-35 28777 +IGLV7-43 28776 +IGLV7-46 28775 +IGLV8-61 28774 +IGLV8OR8-1 100996586 +IGLV9-49 28773 +IGLV10-54 28772 +IGLV10-67 28771 +IGLV11-55 28770 +IGLVI-20 28769 +IGLVI-38 28768 +IGLVI-42 28767 +IGLVI-56 28766 +IGLVI-63 28765 +IGLVI-68 28764 +IGLVI-70 28763 +IGLVIV-53 28762 +IGLVIV-59 28761 +IGLVIV-64 28760 +IGLVIV-65 28759 +IGLVIV-66-1 84097 +IGLVIVOR22-1 84088 +IGLVIVOR22-2 84087 +IGLVV-58 28758 +IGLVV-66 28757 +IGLVVI-22-1 84091 +IGLVVI-25-1 84090 +IGLVVII-41-1 84089 +IGSF1 3547 +IGSF3 3321 +IGSF3P1 122965330 +IGSF3P2 100289350 +IGSF5 150084 +IGSF6 10261 +IGSF8 93185 +IGSF9 57549 +IGSF9B 22997 +IGSF10 285313 +IGSF11 152404 +IGSF11-AS1 100506765 +IGSF21 84966 +IGSF21-AS1 105376814 +IGSF22 283284 +IGSF22-AS1 120883618 +IGSF23 147710 +IHH 3549 +IHO1 339834 +IK 3550 +IKBIP 121457 +IKBKB 3551 +IKBKB-DT 101929897 +IKBKE 9641 +IKBKE-AS1 574431 +IKBKG 8517 +IKBKGP1 246210 +IKZF1 10320 +IKZF2 22807 +IKZF3 22806 +IKZF4 64375 +IKZF5 64376 +IL1A 3552 +IL1B 3553 +IL1F10 84639 +IL1R1 3554 +IL1R1-AS1 112577460 +IL1R2 7850 +IL1RAP 3556 +IL1RAPL1 11141 +IL1RAPL2 26280 +IL1RL1 9173 +IL1RL2 8808 +IL1RN 3557 +IL2 3558 +IL2RA 3559 +IL2RB 3560 +IL2RG 3561 +IL3 3562 +IL3RA 3563 +IL4 3565 +IL4I1 259307 +IL4R 3566 +IL5 3567 +IL5RA 3568 +IL6 3569 +IL6-AS1 541472 +IL6R 3570 +IL6R-AS1 101928101 +IL6RP1 157916 +IL6ST 3572 +IL6ST-DT 441072 +IL6STP1 3573 +IL7 3574 +IL7R 3575 +IL9 3578 +IL9R 3581 +IL9RP1 100128449 +IL9RP2 439945 +IL9RP3 729486 +IL9RP4 100132166 +IL10 3586 +IL10RA 3587 +IL10RB 3588 +IL10RB-DT 100288432 +IL11 3589 +IL11RA 3590 +IL12A 3592 +IL12A-AS1 101928376 +IL12B 3593 +IL12RB1 3594 +IL12RB2 3595 +IL13 3596 +IL13RA1 3597 +IL13RA2 3598 +IL15 3600 +IL15RA 3601 +IL16 3603 +IL17A 3605 +IL17B 27190 +IL17C 27189 +IL17D 53342 +IL17F 112744 +IL17RA 23765 +IL17RB 55540 +IL17RC 84818 +IL17RD 54756 +IL17RE 132014 +IL17REL 400935 +IL18 3606 +IL18BP 10068 +IL18R1 8809 +IL18RAP 8807 +IL19 29949 +IL20 50604 +IL20RA 53832 +IL20RB 53833 +IL20RB-AS1 107986136 +IL21 59067 +IL21-AS1 100996941 +IL21R 50615 +IL21R-AS1 283888 +IL22 50616 +IL22RA1 58985 +IL22RA2 116379 +IL23A 51561 +IL23R 149233 +IL24 11009 +IL25 64806 +IL26 55801 +IL27 246778 +IL27RA 9466 +IL31 386653 +IL31RA 133396 +IL32 9235 +IL33 90865 +IL34 146433 +IL36A 27179 +IL36B 27177 +IL36G 56300 +IL36RN 26525 +IL37 27178 +ILDR1 286676 +ILDR2 387597 +ILF2 3608 +ILF2P1 100421506 +ILF2P2 644616 +ILF3 3609 +ILF3-DT 147727 +ILK 3611 +ILKAP 80895 +ILRUN 64771 +ILRUN-AS1 101929243 +ILRUNP1 105369222 +ILVBL 10994 +ILVBL-AS1 118827806 +IMMP1L 196294 +IMMP1LP1 729101 +IMMP1LP2 105369987 +IMMP1LP3 106481715 +IMMP2L 83943 +IMMT 10989 +IMMTP1 54045 +IMP3 55272 +IMP3P1 646087 +IMP3P2 106480272 +IMP4 92856 +IMPA1 3612 +IMPA1P1 650747 +IMPA2 3613 +IMPACT 55364 +IMPDH1 3614 +IMPDH1P1 340499 +IMPDH1P2 402394 +IMPDH1P3 136307 +IMPDH1P4 139334 +IMPDH1P5 340780 +IMPDH1P6 392267 +IMPDH1P7 391467 +IMPDH1P8 131961 +IMPDH1P9 441132 +IMPDH1P10 100874399 +IMPDH1P11 727833 +IMPDH2 3615 +IMPG1 3617 +IMPG2 50939 +INA 9118 +INAFM1 255783 +INAFM2 100505573 +INAVA 55765 +INAVAP1 100420831 +INCA1 388324 +INCENP 3619 +INE1 8552 +INE2 8551 +INF2 64423 +ING1 3621 +ING2 3622 +ING2-DT 389247 +ING3 54556 +ING4 51147 +ING5 84289 +INGX 27160 +INHA 3623 +INHBA 3624 +INHBA-AS1 285954 +INHBB 3625 +INHBC 3626 +INHBE 83729 +INHCAP 100129696 +INIP 58493 +INKA1 389119 +INKA2 55924 +INKA2-AS1 100506343 +INMT 11185 +INMT-MINDY4 100526825 +INO80 54617 +INO80-AS1 109729177 +INO80B 83444 +INO80B-WBP1 100532735 +INO80C 125476 +INO80D 54891 +INO80D-AS1 122152328 +INO80E 283899 +INPP1 3628 +INPP4A 3631 +INPP4B 8821 +INPP5A 3632 +INPP5B 3633 +INPP5B-AS1 128266844 +INPP5D 3635 +INPP5E 56623 +INPP5F 22876 +INPP5J 27124 +INPP5K 51763 +INPPL1 3636 +INS 3630 +INS-IGF2 723961 +INSC 387755 +INSIG1 3638 +INSIG1-DT 105375591 +INSIG2 51141 +INSL3 3640 +INSL4 3641 +INSL5 10022 +INSL6 11172 +INSM1 3642 +INSM2 84684 +INSR 3643 +INSRR 3645 +INSYN1 388135 +INSYN1-AS1 101929221 +INSYN2A 642938 +INSYN2B 100131897 +INTS1 26173 +INTS2 57508 +INTS3 65123 +INTS4 92105 +INTS4P1 285905 +INTS4P2 644619 +INTS5 80789 +INTS6 26512 +INTS6-AS1 100507398 +INTS6L 203522 +INTS6L-AS1 100874118 +INTS6P1 285634 +INTS7 25896 +INTS8 55656 +INTS9 55756 +INTS9-AS1 109729178 +INTS10 55174 +INTS11 54973 +INTS12 57117 +INTS13 55726 +INTS14 81556 +INTS15 79034 +INTU 27152 +INVS 27130 +IP6K1 9807 +IP6K2 51447 +IP6K3 117283 +IPCEF1 26034 +IPMK 253430 +IPMKP1 401730 +IPO4 79711 +IPO5 3843 +IPO5P1 100132815 +IPO7 10527 +IPO7P1 100129708 +IPO7P2 100128337 +IPO8 10526 +IPO8P1 100418819 +IPO9 55705 +IPO9-AS1 100873949 +IPO11 51194 +IPO13 9670 +IPP 3652 +IPPK 64768 +IPPKP1 100874419 +IPW 3653 +IQANK1 642574 +IQCA1 79781 +IQCA1-AS1 107080627 +IQCA1L 392843 +IQCB1 9657 +IQCB2P 340192 +IQCC 55721 +IQCD 115811 +IQCE 23288 +IQCF1 132141 +IQCF2 389123 +IQCF3 401067 +IQCF4P 100506840 +IQCF5 389124 +IQCF5-AS1 101928999 +IQCF6 440956 +IQCG 84223 +IQCH 64799 +IQCH-AS1 100506686 +IQCJ 654502 +IQCJ-SCHIP1 100505385 +IQCJ-SCHIP1-AS1 100874433 +IQCK 124152 +IQCM 285423 +IQCN 80726 +IQGAP1 8826 +IQGAP2 10788 +IQGAP3 128239 +IQSEC1 9922 +IQSEC2 23096 +IQSEC3 440073 +IQSEC3-AS1 105369592 +IQSEC3-AS2 105369593 +IQSEC3P1 100132450 +IQSEC3P2 100130073 +IQSEC3P3 728056 +IQUB 154865 +IRAG1 10335 +IRAG1-AS1 100129827 +IRAG2 4033 +IRAIN 104472848 +IRAK1 3654 +IRAK1BP1 134728 +IRAK2 3656 +IRAK3 11213 +IRAK4 51135 +IREB2 3658 +IRF1 3659 +IRF1-AS1 441108 +IRF2 3660 +IRF2-DT 117134601 +IRF2BP1 26145 +IRF2BP2 359948 +IRF2BPL 64207 +IRF3 3661 +IRF4 3662 +IRF5 3663 +IRF5P1 100420406 +IRF6 3664 +IRF7 3665 +IRF8 3394 +IRF9 10379 +IRGC 56269 +IRGM 345611 +IRGQ 126298 +IRS1 3667 +IRS2 8660 +IRS3P 442338 +IRS4 8471 +IRS4-AS1 101928358 +IRX1 79192 +IRX1P1 646390 +IRX2 153572 +IRX2-DT 153571 +IRX3 79191 +IRX4 50805 +IRX4-AS1 101929056 +IRX4P1 100009671 +IRX5 10265 +IRX6 79190 +ISCA1 81689 +ISCA1P1 389293 +ISCA1P2 100288517 +ISCA1P3 100131092 +ISCA1P4 100128012 +ISCA1P5 100288250 +ISCA1P6 100130549 +ISCA2 122961 +ISCA2P1 100287193 +ISCU 23479 +ISCUP1 100462833 +ISG15 9636 +ISG20 3669 +ISG20L2 81875 +ISL1 3670 +ISL1-DT 642366 +ISL2 64843 +ISLR 3671 +ISLR2 57611 +ISM1 140862 +ISM1-AS1 100505536 +ISM2 145501 +ISOC1 51015 +ISOC2 79763 +IST1 9798 +ISX 91464 +ISY1 57461 +ISY1-RAB43 100534599 +ISYNA1 51477 +ITCH 83737 +ITCH-AS1 106480737 +ITCH-IT1 100874302 +ITFG1 81533 +ITFG1-AS1 101927102 +ITFG2 55846 +ITFG2-AS1 283440 +ITGA1 3672 +ITGA2 3673 +ITGA2-AS1 121232372 +ITGA2B 3674 +ITGA3 3675 +ITGA4 3676 +ITGA5 3678 +ITGA6 3655 +ITGA6-AS1 101929947 +ITGA7 3679 +ITGA8 8516 +ITGA9 3680 +ITGA9-AS1 101928153 +ITGA10 8515 +ITGA11 22801 +ITGAD 3681 +ITGAE 3682 +ITGAL 3683 +ITGAL-AS1 128667228 +ITGAM 3684 +ITGAV 3685 +ITGAX 3687 +ITGB1 3688 +ITGB1-DT 101929475 +ITGB1BP1 9270 +ITGB1BP2 26548 +ITGB1P1 100422691 +ITGB2 3689 +ITGB2-AS1 100505746 +ITGB3 3690 +ITGB3BP 23421 +ITGB4 3691 +ITGB5 3693 +ITGB5-AS1 100873992 +ITGB6 3694 +ITGB7 3695 +ITGB8 3696 +ITGB8-AS1 101927811 +ITGBL1 9358 +ITIH1 3697 +ITIH2 3698 +ITIH3 3699 +ITIH4 3700 +ITIH4-AS1 100873993 +ITIH5 80760 +ITIH6 347365 +ITK 3702 +ITLN1 55600 +ITLN2 142683 +ITM2A 9452 +ITM2B 9445 +ITM2BP1 100420308 +ITM2C 81618 +ITPA 3704 +ITPK1 3705 +ITPK1-AS1 319085 +ITPK1P1 100421108 +ITPKA 3706 +ITPKB 3707 +ITPKB-AS1 100873994 +ITPKB-IT1 100506443 +ITPKC 80271 +ITPR1 3708 +ITPR1-DT 100996539 +ITPR2 3709 +ITPR2-AS1 101928554 +ITPR3 3710 +ITPR3-AS1 101929188 +ITPRID1 223075 +ITPRID2 6744 +ITPRID2-DT 119863860 +ITPRIP 85450 +ITPRIP-AS1 101927472 +ITPRIPL1 150771 +ITPRIPL2 162073 +ITSN1 6453 +ITSN2 50618 +IUR1 105369381 +IVD 3712 +IVL 3713 +IVNS1ABP 10625 +IWS1 55677 +IYD 389434 +IZUMO1 284359 +IZUMO1R 390243 +IZUMO2 126123 +IZUMO3 100129669 +IZUMO4 113177 +JADE1 79960 +JADE2 23338 +JADE3 9767 +JADRR 101669763 +JAG1 182 +JAG2 3714 +JAGN1 84522 +JAK1 3716 +JAK2 3717 +JAK3 3718 +JAKMIP1 152789 +JAKMIP1-DT 285484 +JAKMIP2 9832 +JAKMIP2-AS1 153469 +JAKMIP3 282973 +JAKMIP3-AS1 105378567 +JAM2 58494 +JAM3 83700 +JAML 120425 +JARID2 3720 +JARID2-AS1 100506681 +JARID2-DT 118597839 +JAZF1 221895 +JAZF1-AS1 100128081 +JCAD 57608 +JCADP1 729056 +JCHAIN 3512 +JCHAINP1 3513 +JDP2 122953 +JDP2-AS1 101928377 +JHY 79864 +JKAMP 51528 +JKAMPP1 100049717 +JMJD1C 221037 +JMJD1C-AS1 84989 +JMJD1C-AS2 105378330 +JMJD4 65094 +JMJD4P1 100130760 +JMJD6 23210 +JMJD7 100137047 +JMJD7-PLA2G4B 8681 +JMJD8 339123 +JMY 133746 +JOSD1 9929 +JOSD2 126119 +JPH1 56704 +JPH2 57158 +JPH3 57338 +JPH4 84502 +JPT1 51155 +JPT1P1 100130171 +JPT2 90861 +JPX 554203 +JRK 8629 +JRKL 8690 +JRKL-AS1 100874053 +JSRP1 126306 +JTB 10899 +JTB-DT 123706540 +JTBP1 100874254 +JUN 3725 +JUNB 3726 +JUND 3727 +JUP 3728 +KAAG1 353219 +KALRN 8997 +KANK1 23189 +KANK1P1 100862705 +KANK2 25959 +KANK3 256949 +KANK4 163782 +KANSL1 284058 +KANSL1-AS1 644246 +KANSL1L 151050 +KANSL1L-AS1 101928020 +KANSL2 54934 +KANSL3 55683 +KANTR 102723508 +KARS1 3735 +KARS1P1 100419558 +KARS1P2 100419560 +KARS1P3 100132079 +KASH5 147872 +KAT2A 2648 +KAT2B 8850 +KAT5 10524 +KAT6A 7994 +KAT6A-AS1 105379393 +KAT6B 23522 +KAT7 11143 +KAT7P1 648927 +KAT8 84148 +KAT14 57325 +KATNA1 11104 +KATNAL1 84056 +KATNAL2 83473 +KATNB1 10300 +KATNBL1 79768 +KATNBL1P1 100420919 +KATNBL1P2 100130235 +KATNBL1P3 100420946 +KATNBL1P4 100128982 +KATNBL1P5 100420841 +KATNBL1P6 729176 +KATNIP 23247 +KAZALD1 81621 +KAZN 23254 +KAZN-AS1 105376762 +KBTBD2 25948 +KBTBD3 143879 +KBTBD4 55709 +KBTBD6 89890 +KBTBD6-DT 101929140 +KBTBD7 84078 +KBTBD8 84541 +KBTBD11 9920 +KBTBD11-AS1 101928058 +KBTBD11-OT1 104266957 +KBTBD12 166348 +KBTBD13 390594 +KCMF1 56888 +KCNA1 3736 +KCNA2 3737 +KCNA3 3738 +KCNA4 3739 +KCNA5 3741 +KCNA6 3742 +KCNA7 3743 +KCNA10 3744 +KCNAB1 7881 +KCNAB1-AS1 100874084 +KCNAB1-AS2 100874083 +KCNAB2 8514 +KCNAB3 9196 +KCNB1 3745 +KCNB2 9312 +KCNC1 3746 +KCNC2 3747 +KCNC3 3748 +KCNC4 3749 +KCNC4-DT 100873974 +KCND1 3750 +KCND2 3751 +KCND3 3752 +KCND3-AS1 100873995 +KCND3-IT1 100874295 +KCNE1 3753 +KCNE2 9992 +KCNE3 10008 +KCNE4 23704 +KCNE5 23630 +KCNF1 3754 +KCNG1 3755 +KCNG2 26251 +KCNG3 170850 +KCNG4 93107 +KCNH1 3756 +KCNH1-IT1 100874296 +KCNH2 3757 +KCNH3 23416 +KCNH4 23415 +KCNH5 27133 +KCNH6 81033 +KCNH7 90134 +KCNH7-AS1 101929570 +KCNH8 131096 +KCNIP1 30820 +KCNIP1-AS1 105377716 +KCNIP1-OT1 101928033 +KCNIP2 30819 +KCNIP2-AS1 100289509 +KCNIP3 30818 +KCNIP4 80333 +KCNIP4-IT1 359822 +KCNJ1 3758 +KCNJ2 3759 +KCNJ2-AS1 400617 +KCNJ3 3760 +KCNJ4 3761 +KCNJ5 3762 +KCNJ5-AS1 219833 +KCNJ6 3763 +KCNJ6-AS1 105372799 +KCNJ8 3764 +KCNJ9 3765 +KCNJ10 3766 +KCNJ11 3767 +KCNJ12 3768 +KCNJ13 3769 +KCNJ14 3770 +KCNJ15 3772 +KCNJ16 3773 +KCNJ18 100134444 +KCNK1 3775 +KCNK2 3776 +KCNK3 3777 +KCNK4 50801 +KCNK4-CATSPERZ 106780802 +KCNK5 8645 +KCNK6 9424 +KCNK7 10089 +KCNK9 51305 +KCNK10 54207 +KCNK12 56660 +KCNK13 56659 +KCNK15 60598 +KCNK15-AS1 106144538 +KCNK16 83795 +KCNK17 89822 +KCNK18 338567 +KCNMA1 3778 +KCNMA1-AS1 101929328 +KCNMA1-AS2 101929310 +KCNMA1-AS3 101929286 +KCNMB1 3779 +KCNMB2 10242 +KCNMB2-AS1 104797538 +KCNMB3 27094 +KCNMB3P1 27093 +KCNMB4 27345 +KCNN1 3780 +KCNN2 3781 +KCNN3 3782 +KCNN4 3783 +KCNQ1 3784 +KCNQ1-AS1 338653 +KCNQ1DN 55539 +KCNQ1OT1 10984 +KCNQ2 3785 +KCNQ2-AS1 105372720 +KCNQ3 3786 +KCNQ4 9132 +KCNQ5 56479 +KCNQ5-AS1 100873997 +KCNQ5-DT 112267960 +KCNQ5-IT1 100507381 +KCNRG 283518 +KCNS1 3787 +KCNS2 3788 +KCNS3 3790 +KCNT1 57582 +KCNT2 343450 +KCNU1 157855 +KCNV1 27012 +KCNV2 169522 +KCP 375616 +KCTD1 284252 +KCTD2 23510 +KCTD3 51133 +KCTD4 386618 +KCTD5 54442 +KCTD5P1 100422094 +KCTD6 200845 +KCTD7 154881 +KCTD8 386617 +KCTD9 54793 +KCTD9P1 100422273 +KCTD9P2 643535 +KCTD9P3 647013 +KCTD9P4 100422242 +KCTD9P5 100422179 +KCTD9P6 642513 +KCTD10 83892 +KCTD10P1 100422230 +KCTD11 147040 +KCTD12 115207 +KCTD13 253980 +KCTD13-DT 107984836 +KCTD14 65987 +KCTD15 79047 +KCTD16 57528 +KCTD17 79734 +KCTD18 130535 +KCTD19 146212 +KCTD20 222658 +KCTD21 283219 +KCTD21-AS1 100289388 +KDELR1 10945 +KDELR2 11014 +KDELR3 11015 +KDF1 126695 +KDM1A 23028 +KDM1B 221656 +KDM2A 22992 +KDM2B 84678 +KDM2B-DT 101928346 +KDM3A 55818 +KDM3AP1 100420666 +KDM3B 51780 +KDM4A 9682 +KDM4A-AS1 100132774 +KDM4B 23030 +KDM4C 23081 +KDM4D 55693 +KDM4E 390245 +KDM4F 100129053 +KDM5A 5927 +KDM5B 10765 +KDM5C 8242 +KDM5C-IT1 100874299 +KDM5D 8284 +KDM5DP1 359796 +KDM6A 7403 +KDM6B 23135 +KDM7A 80853 +KDM7A-DT 100134229 +KDM8 79831 +KDR 3791 +KDSR 2531 +KDSR-DT 118827811 +KEAP1 9817 +KEL 3792 +KERA 11081 +KHDC1 80759 +KHDC1-AS1 120766141 +KHDC1L 100129128 +KHDC1P1 653194 +KHDC3L 154288 +KHDC4 22889 +KHDRBS1 10657 +KHDRBS2 202559 +KHDRBS2-OT1 112577463 +KHDRBS3 10656 +KHK 3795 +KHNYN 23351 +KHSRP 8570 +KHSRPP1 402359 +KIAA0040 9674 +KIAA0087 9808 +KIAA0232 9778 +KIAA0319 9856 +KIAA0319L 79932 +KIAA0408 9729 +KIAA0513 9764 +KIAA0586 9786 +KIAA0753 9851 +KIAA0825 285600 +KIAA0895LP1 100128238 +KIAA0930 23313 +KIAA1143 57456 +KIAA1143P1 644295 +KIAA1143P2 107986034 +KIAA1191 57179 +KIAA1191P1 100418710 +KIAA1191P2 100127938 +KIAA1191P3 100131918 +KIAA1210 57481 +KIAA1217 56243 +KIAA1328 57536 +KIAA1328P1 100418712 +KIAA1522 57648 +KIAA1549 57670 +KIAA1549L 25758 +KIAA1586 57691 +KIAA1614 57710 +KIAA1614-AS1 103344928 +KIAA1671 85379 +KIAA1671-AS1 100128531 +KIAA1755 85449 +KIAA1958 158405 +KIAA2012 100652824 +KIAA2012-AS1 729224 +KIAA2013 90231 +KIAA2026 158358 +KICS2 144577 +KIDINS220 57498 +KIF1A 547 +KIF1B 23095 +KIF1C 10749 +KIF1C-AS1 102724009 +KIF2A 3796 +KIF2B 84643 +KIF2C 11004 +KIF3A 11127 +KIF3AP1 100419880 +KIF3B 9371 +KIF3C 3797 +KIF4A 24137 +KIF4B 285643 +KIF4CP 347363 +KIF5A 3798 +KIF5B 3799 +KIF5C 3800 +KIF5C-AS1 112267889 +KIF6 221458 +KIF7 374654 +KIF9 64147 +KIF9-AS1 285352 +KIF11 3832 +KIF12 113220 +KIF13A 63971 +KIF13B 23303 +KIF14 9928 +KIF15 56992 +KIF16B 55614 +KIF17 57576 +KIF18A 81930 +KIF18B 146909 +KIF18B-DT 118827817 +KIF18BP1 642683 +KIF19 124602 +KIF19BP 645357 +KIF20A 10112 +KIF20B 9585 +KIF21A 55605 +KIF21B 23046 +KIF22 3835 +KIF23 9493 +KIF23-AS1 145694 +KIF24 347240 +KIF25 3834 +KIF25-AS1 100505879 +KIF26A 26153 +KIF26A-DT 105370708 +KIF26B 55083 +KIF26B-AS1 111216275 +KIF27 55582 +KIF28P 100130097 +KIFAP3 22920 +KIFAP3-AS1 128667227 +KIFBP 26128 +KIFC1 3833 +KIFC2 90990 +KIFC3 3801 +KILH 101927136 +KIN 22944 +KIR2DL1 3802 +KIR2DL2 3803 +KIR2DL3 3804 +KIR2DL4 3805 +KIR2DL5A 57292 +KIR2DL5B 553128 +KIR2DP1 554300 +KIR2DS1 3806 +KIR2DS2 100132285 +KIR2DS3 3808 +KIR2DS4 3809 +KIR2DS5 3810 +KIR3DL1 3811 +KIR3DL2 3812 +KIR3DL3 115653 +KIR3DP1 548594 +KIR3DS1 3813 +KIR3DX1 90011 +KIRREL1 55243 +KIRREL1-IT1 100505785 +KIRREL2 84063 +KIRREL3 84623 +KIRREL3-AS1 100874250 +KIRREL3-AS2 100874251 +KIRREL3-AS3 283165 +KISS1 3814 +KISS1R 84634 +KIT 3815 +KITLG 4254 +KIZ 55857 +KIZ-AS1 101929591 +KL 9365 +KLB 152831 +KLC1 3831 +KLC1-AS1 123706534 +KLC2 64837 +KLC2-AS1 105369352 +KLC2-AS2 105369351 +KLC3 147700 +KLC4 89953 +KLC4-AS1 112267958 +KLF1 10661 +KLF2 10365 +KLF2-DT 118827812 +KLF2P1 106480253 +KLF2P2 106480678 +KLF2P3 106481672 +KLF2P4 100533668 +KLF3 51274 +KLF3-AS1 79667 +KLF3P1 651815 +KLF3P2 100124394 +KLF4 9314 +KLF4P1 100420113 +KLF5 688 +KLF6 1316 +KLF7 8609 +KLF7-IT1 100874272 +KLF7P1 100128036 +KLF8 11279 +KLF8P1 100128777 +KLF9 687 +KLF9-DT 101927086 +KLF10 7071 +KLF11 8462 +KLF11-DT 101929882 +KLF12 11278 +KLF13 51621 +KLF14 136259 +KLF15 28999 +KLF16 83855 +KLF17 128209 +KLF17P1 100133321 +KLF17P2 106481669 +KLF18 105378952 +KLHDC1 122773 +KLHDC2 23588 +KLHDC3 116138 +KLHDC4 54758 +KLHDC7A 127707 +KLHDC7B 113730 +KLHDC7B-DT 105373098 +KLHDC8A 55220 +KLHDC8B 200942 +KLHDC9 126823 +KLHDC10 23008 +KLHL1 57626 +KLHL2 11275 +KLHL2P1 729249 +KLHL3 26249 +KLHL4 56062 +KLHL5 51088 +KLHL6 89857 +KLHL6-AS1 100874019 +KLHL7 55975 +KLHL7-DT 100775104 +KLHL8 57563 +KLHL9 55958 +KLHL10 317719 +KLHL11 55175 +KLHL12 59349 +KLHL13 90293 +KLHL14 57565 +KLHL15 80311 +KLHL17 339451 +KLHL18 23276 +KLHL20 27252 +KLHL21 9903 +KLHL22 84861 +KLHL23 151230 +KLHL24 54800 +KLHL25 64410 +KLHL25P1 127379729 +KLHL26 55295 +KLHL28 54813 +KLHL29 114818 +KLHL30 377007 +KLHL30-AS1 394261 +KLHL31 401265 +KLHL32 114792 +KLHL33 123103 +KLHL34 257240 +KLHL35 283212 +KLHL36 79786 +KLHL38 340359 +KLHL40 131377 +KLHL41 10324 +KLHL42 57542 +KLK1 3816 +KLK2 3817 +KLK3 354 +KLK4 9622 +KLK5 25818 +KLK6 5653 +KLK7 5650 +KLK8 11202 +KLK9 284366 +KLK10 5655 +KLK11 11012 +KLK12 43849 +KLK13 26085 +KLK14 43847 +KLK15 55554 +KLKB1 3818 +KLKP1 606293 +KLLN 100144748 +KLRA1P 10748 +KLRB1 3820 +KLRC1 3821 +KLRC2 3822 +KLRC3 3823 +KLRC4 8302 +KLRC4-KLRK1 100528032 +KLRD1 3824 +KLRF1 51348 +KLRF2 100431172 +KLRG1 10219 +KLRG2 346689 +KLRK1 22914 +KLRK1-AS1 101928100 +KMO 8564 +KMT2A 4297 +KMT2B 9757 +KMT2C 58508 +KMT2CP1 101927429 +KMT2CP2 125177371 +KMT2CP3 125177372 +KMT2CP4 101927050 +KMT2CP5 107985798 +KMT2D 8085 +KMT2E 55904 +KMT2E-AS1 100216545 +KMT5A 387893 +KMT5AP1 57108 +KMT5AP2 100421788 +KMT5AP3 100421819 +KMT5B 51111 +KMT5C 84787 +KNCN 148930 +KNDC1 85442 +KNG1 3827 +KNL1 57082 +KNOP1 400506 +KNOP1P1 100129937 +KNOP1P2 100420898 +KNOP1P3 100128029 +KNOP1P4 100420843 +KNOP1P5 100130158 +KNSTRN 90417 +KNTC1 9735 +KPLCE 100129271 +KPNA1 3836 +KPNA2 3838 +KPNA2P1 643513 +KPNA2P2 645680 +KPNA2P3 109286552 +KPNA3 3839 +KPNA4 3840 +KPNA4P1 100421109 +KPNA5 3841 +KPNA6 23633 +KPNA7 402569 +KPNB1 3837 +KPNB1-DT 112268184 +KPNB1P1 100131072 +KPRP 448834 +KPTN 11133 +KRAS 3845 +KRASP1 3844 +KRBA1 84626 +KRBA2 124751 +KRBOX1 100506243 +KRBOX1-AS1 100506275 +KRBOX4 55634 +KRBOX5 124411 +KRBOX5P1 342426 +KRCC1 51315 +KREMEN1 83999 +KREMEN2 79412 +KRI1 65095 +KRIT1 889 +KRR1 11103 +KRR1P1 100422486 +KRT1 3848 +KRT2 3849 +KRT3 3850 +KRT4 3851 +KRT5 3852 +KRT6A 3853 +KRT6B 3854 +KRT6C 286887 +KRT7 3855 +KRT7-AS 109729127 +KRT8 3856 +KRT8P1 338017 +KRT8P2 390472 +KRT8P3 728638 +KRT8P4 100509857 +KRT8P5 342732 +KRT8P6 392552 +KRT8P7 729131 +KRT8P8 402429 +KRT8P9 390601 +KRT8P10 344320 +KRT8P11 347265 +KRT8P12 90133 +KRT8P13 730023 +KRT8P14 347333 +KRT8P15 645834 +KRT8P16 220959 +KRT8P17 392479 +KRT8P18 442078 +KRT8P19 644998 +KRT8P20 441218 +KRT8P21 126811 +KRT8P22 342419 +KRT8P23 390610 +KRT8P24 729344 +KRT8P25 402134 +KRT8P26 390211 +KRT8P27 442455 +KRT8P28 391099 +KRT8P29 391155 +KRT8P30 391485 +KRT8P31 728167 +KRT8P32 100289133 +KRT8P33 100418737 +KRT8P34 100418811 +KRT8P35 100418747 +KRT8P36 100418748 +KRT8P37 100287325 +KRT8P38 100418799 +KRT8P39 100418781 +KRT8P40 100418728 +KRT8P41 283102 +KRT8P42 100418750 +KRT8P43 100289319 +KRT8P44 100129958 +KRT8P45 149501 +KRT8P46 100418744 +KRT8P47 644743 +KRT8P48 100887067 +KRT8P49 643447 +KRT8P50 102724430 +KRT8P51 106480676 +KRT8P52 100887068 +KRT9 3857 +KRT10 3858 +KRT10-AS1 147184 +KRT12 3859 +KRT13 3860 +KRT14 3861 +KRT15 3866 +KRT16 3868 +KRT16P1 729252 +KRT16P2 400578 +KRT16P3 644945 +KRT16P4 339244 +KRT16P5 353196 +KRT16P6 353194 +KRT17 3872 +KRT17P1 147228 +KRT17P2 339241 +KRT17P3 729682 +KRT17P4 339186 +KRT17P5 339240 +KRT17P6 284196 +KRT17P7 339258 +KRT17P8 100130074 +KRT18 3875 +KRT18P1 3879 +KRT18P2 54044 +KRT18P3 170527 +KRT18P4 391256 +KRT18P5 728300 +KRT18P6 122592 +KRT18P7 100418877 +KRT18P8 125242 +KRT18P9 442205 +KRT18P10 360019 +KRT18P11 3876 +KRT18P12 643471 +KRT18P13 392371 +KRT18P14 119722 +KRT18P15 729211 +KRT18P16 391827 +KRT18P17 344866 +KRT18P18 342374 +KRT18P19 339781 +KRT18P20 121054 +KRT18P21 132391 +KRT18P22 442252 +KRT18P23 642448 +KRT18P24 340460 +KRT18P25 391647 +KRT18P26 100418770 +KRT18P27 390418 +KRT18P28 343326 +KRT18P29 729050 +KRT18P30 643858 +KRT18P31 646723 +KRT18P32 391179 +KRT18P33 647162 +KRT18P34 391589 +KRT18P35 391584 +KRT18P36 442406 +KRT18P37 392214 +KRT18P38 441133 +KRT18P39 344462 +KRT18P40 390904 +KRT18P41 345430 +KRT18P42 391819 +KRT18P43 151825 +KRT18P44 139748 +KRT18P45 391803 +KRT18P46 391458 +KRT18P47 390634 +KRT18P48 340598 +KRT18P49 392516 +KRT18P50 442236 +KRT18P51 391703 +KRT18P52 100418769 +KRT18P53 106478925 +KRT18P54 100418792 +KRT18P55 284085 +KRT18P56 106479027 +KRT18P57 643329 +KRT18P58 644030 +KRT18P59 399965 +KRT18P60 100418829 +KRT18P61 100418865 +KRT18P62 100287635 +KRT18P63 100288868 +KRT18P64 107133513 +KRT18P65 442249 +KRT18P66 442405 +KRT18P67 100631239 +KRT18P68 139060 +KRT19 3880 +KRT19P1 441160 +KRT19P2 160313 +KRT19P3 442114 +KRT19P4 100128041 +KRT19P6 106480807 +KRT20 54474 +KRT23 25984 +KRT24 192666 +KRT25 147183 +KRT26 353288 +KRT27 342574 +KRT28 162605 +KRT31 3881 +KRT32 3882 +KRT33A 3883 +KRT33B 3884 +KRT34 3885 +KRT35 3886 +KRT36 8689 +KRT37 8688 +KRT38 8687 +KRT39 390792 +KRT40 125115 +KRT41P 8686 +KRT42P 284116 +KRT43P 100418861 +KRT71 112802 +KRT72 140807 +KRT73 319101 +KRT73-AS1 100127967 +KRT74 121391 +KRT75 9119 +KRT76 51350 +KRT77 374454 +KRT78 196374 +KRT79 338785 +KRT80 144501 +KRT81 3887 +KRT82 3888 +KRT83 3889 +KRT84 3890 +KRT85 3891 +KRT86 3892 +KRT87P 85349 +KRT88P 85348 +KRT89P 85344 +KRT90P 85340 +KRT125P 100418828 +KRT126P 643865 +KRT127P 100418779 +KRT128P 106480238 +KRT222 125113 +KRT223P 643115 +KRT224P 118732296 +KRTAP1-1 81851 +KRTAP1-3 81850 +KRTAP1-4 728255 +KRTAP1-5 83895 +KRTAP2-1 81872 +KRTAP2-2 728279 +KRTAP2-3 730755 +KRTAP2-4 85294 +KRTAP2-5P 85343 +KRTAP3-1 83896 +KRTAP3-2 83897 +KRTAP3-3 85293 +KRTAP3-4P 85345 +KRTAP4-1 85285 +KRTAP4-2 85291 +KRTAP4-3 85290 +KRTAP4-4 84616 +KRTAP4-5 85289 +KRTAP4-6 81871 +KRTAP4-7 100132476 +KRTAP4-8 728224 +KRTAP4-9 100132386 +KRTAP4-11 653240 +KRTAP4-12 83755 +KRTAP4-16 85354 +KRTAP4-17P 112296190 +KRTAP5-1 387264 +KRTAP5-2 440021 +KRTAP5-3 387266 +KRTAP5-4 387267 +KRTAP5-5 439915 +KRTAP5-6 440023 +KRTAP5-7 440050 +KRTAP5-8 57830 +KRTAP5-9 3846 +KRTAP5-10 387273 +KRTAP5-11 440051 +KRTAP5-13P 387275 +KRTAP5-14P 387276 +KRTAP5-AS1 338651 +KRTAP6-1 337966 +KRTAP6-2 337967 +KRTAP6-3 337968 +KRTAP7-1 337878 +KRTAP8-1 337879 +KRTAP8-2P 337980 +KRTAP8-3P 337981 +KRTAP9-1 728318 +KRTAP9-2 83899 +KRTAP9-3 83900 +KRTAP9-4 85280 +KRTAP9-6 100507608 +KRTAP9-7 100505724 +KRTAP9-8 83901 +KRTAP9-9 81870 +KRTAP9-10P 106480422 +KRTAP9-11P 85347 +KRTAP9-12P 100287715 +KRTAP10-1 386677 +KRTAP10-2 386679 +KRTAP10-3 386682 +KRTAP10-4 386672 +KRTAP10-5 386680 +KRTAP10-6 386674 +KRTAP10-7 386675 +KRTAP10-8 386681 +KRTAP10-9 386676 +KRTAP10-10 353333 +KRTAP10-11 386678 +KRTAP10-12 386685 +KRTAP10-13P 100874224 +KRTAP11-1 337880 +KRTAP12-1 353332 +KRTAP12-2 353323 +KRTAP12-3 386683 +KRTAP12-4 386684 +KRTAP12-5P 112268487 +KRTAP13-1 140258 +KRTAP13-2 337959 +KRTAP13-3 337960 +KRTAP13-4 284827 +KRTAP13-5P 337964 +KRTAP13-6P 337965 +KRTAP15-1 254950 +KRTAP16-1 100505753 +KRTAP17-1 83902 +KRTAP19-1 337882 +KRTAP19-2 337969 +KRTAP19-3 337970 +KRTAP19-4 337971 +KRTAP19-5 337972 +KRTAP19-6 337973 +KRTAP19-7 337974 +KRTAP19-8 728299 +KRTAP19-9P 337982 +KRTAP19-10P 337983 +KRTAP19-11P 337984 +KRTAP20-1 337975 +KRTAP20-2 337976 +KRTAP20-3 337985 +KRTAP20-4 100151643 +KRTAP21-1 337977 +KRTAP21-2 337978 +KRTAP21-3 100288323 +KRTAP21-4P 337986 +KRTAP22-1 337979 +KRTAP22-2 100288287 +KRTAP23-1 337963 +KRTAP24-1 643803 +KRTAP25-1 100131902 +KRTAP26-1 388818 +KRTAP27-1 643812 +KRTAP29-1 100533177 +KRTCAP2 200185 +KRTCAP2P1 730043 +KRTCAP3 200634 +KRTDAP 388533 +KSR1 8844 +KSR1P1 106479050 +KSR2 283455 +KTI12 112970 +KTN1 3895 +KTN1-AS1 100129075 +KXD1 79036 +KXD1-AS1 128193285 +KY 339855 +KYAT1 883 +KYAT3 56267 +KYNU 8942 +KYNUP1 729321 +KYNUP2 729310 +KYNUP3 729323 +L1CAM 3897 +L1CAM-AS1 100996465 +L1TD1 54596 +L1TD1P1 100126007 +L2HGDH 79944 +L3HYPDH 112849 +L3MBTL1 26013 +L3MBTL2 83746 +L3MBTL2-AS1 100506544 +L3MBTL3 84456 +L3MBTL4 91133 +L3MBTL4-AS1 101927150 +LACC1 144811 +LACRT 90070 +LACTB 114294 +LACTB2 51110 +LACTB2-AS1 286190 +LACTBL1 646262 +LAD1 3898 +LAG3 3902 +LAGE3 8270 +LAGE3P1 646808 +LAIR1 3903 +LAIR2 3904 +LALBA 3906 +LAMA1 284217 +LAMA2 3908 +LAMA3 3909 +LAMA4 3910 +LAMA4-AS1 101927640 +LAMA5 3911 +LAMA5-AS1 101928158 +LAMB1 3912 +LAMB2 3913 +LAMB2P1 22973 +LAMB3 3914 +LAMB4 22798 +LAMC1 3915 +LAMC1-AS1 110841583 +LAMC2 3918 +LAMC3 10319 +LAMP1 3916 +LAMP1P1 100421198 +LAMP2 3920 +LAMP3 27074 +LAMP5 24141 +LAMP5-AS1 101929329 +LAMTOR1 55004 +LAMTOR2 28956 +LAMTOR3 8649 +LAMTOR3P1 100130119 +LAMTOR3P2 100874516 +LAMTOR4 389541 +LAMTOR5 10542 +LAMTOR5-AS1 101410535 +LAMTOR5P1 106478910 +LANCL1 10314 +LANCL1-AS1 102724820 +LANCL2 55915 +LANCL3 347404 +LAP3 51056 +LAP3P1 100873864 +LAP3P2 389386 +LAPTM4A 9741 +LAPTM4A-DT 105373463 +LAPTM4B 55353 +LAPTM4BP1 645900 +LAPTM4BP2 107075219 +LAPTM5 7805 +LARGE-AS1 100506195 +LARGE-IT1 100874331 +LARGE1 9215 +LARGE1-AS1 107985565 +LARGE2 120071 +LARP1 23367 +LARP1B 55132 +LARP1BP1 644578 +LARP1BP2 106479034 +LARP1BP3 644403 +LARP1P1 100379623 +LARP4 113251 +LARP4B 23185 +LARP4B-DT 101927762 +LARP4P 554354 +LARP6 55323 +LARP7 51574 +LARP7P1 106480287 +LARP7P2 106481699 +LARP7P3 106481700 +LARP7P4 100421509 +LARRPM 100270746 +LARS1 51520 +LARS2 23395 +LARS2-AS1 100885795 +LAS1L 81887 +LASP1 3927 +LASP1NB 100505576 +LASTR 105376382 +LAT 27040 +LAT2 7462 +LATS1 9113 +LATS2 26524 +LATS2-AS1 100874066 +LAX1 54900 +LAYN 143903 +LBH 81606 +LBHD1 79081 +LBHD2 107984640 +LBP 3929 +LBR 3930 +LBX1 10660 +LBX1-AS1 399806 +LBX2 85474 +LBX2-AS1 151534 +LCA5 167691 +LCA5L 150082 +LCAL1 80078 +LCAT 3931 +LCDR 100270804 +LCE1A 353131 +LCE1B 353132 +LCE1C 353133 +LCE1D 353134 +LCE1E 353135 +LCE1F 353137 +LCE2A 353139 +LCE2B 26239 +LCE2C 353140 +LCE2D 353141 +LCE3A 353142 +LCE3B 353143 +LCE3C 353144 +LCE3D 84648 +LCE3E 353145 +LCE4A 199834 +LCE5A 254910 +LCE6A 448835 +LCE7A 122526777 +LCEP1 450208 +LCEP2 450209 +LCEP3 450211 +LCEP4 450210 +LCIIAR 100130111 +LCK 3932 +LCLAT1 253558 +LCMT1 51451 +LCMT1-AS1 102723510 +LCMT1-AS2 100506655 +LCMT2 9836 +LCN1 3933 +LCN1P1 286310 +LCN1P2 653163 +LCN2 3934 +LCN6 158062 +LCN8 138307 +LCN9 392399 +LCN10 414332 +LCN12 286256 +LCN15 389812 +LCNL1 401562 +LCOR 84458 +LCORL 254251 +LCORLP1 127379700 +LCP1 3936 +LCP2 3937 +LCT 3938 +LCT-AS1 100507600 +LCTL 197021 +LDAF1 57146 +LDAH 60526 +LDB1 8861 +LDB2 9079 +LDB3 11155 +LDC1P 149086 +LDHA 3939 +LDHAL6A 160287 +LDHAL6B 92483 +LDHAL6CP 121498 +LDHAL6DP 100420508 +LDHAL6EP 100420462 +LDHAL6FP 100420477 +LDHAP1 3940 +LDHAP2 100190799 +LDHAP3 442013 +LDHAP4 158222 +LDHAP5 729666 +LDHAP7 100190800 +LDHB 3945 +LDHBP1 100289475 +LDHBP2 3947 +LDHBP3 100129283 +LDHC 3948 +LDHD 197257 +LDLR 3949 +LDLR-AS1 115271120 +LDLRAD1 388633 +LDLRAD2 401944 +LDLRAD3 143458 +LDLRAD4 753 +LDLRAD4-AS1 100288122 +LDLRAP1 26119 +LDOC1 23641 +LEAP2 116842 +LECT2 3950 +LEF1 51176 +LEF1-AS1 641518 +LEFTY1 10637 +LEFTY2 7044 +LEFTY3P 286754 +LEISA1 100126784 +LEKR1 389170 +LELP1 149018 +LEMD1 93273 +LEMD1-AS1 284576 +LEMD1-DT 284577 +LEMD2 221496 +LEMD3 23592 +LENEP 55891 +LENG1 79165 +LENG8 114823 +LENG8-AS1 104355426 +LENG9 94059 +LEO1 123169 +LEP 3952 +LEPR 3953 +LEPROT 54741 +LEPROTL1 23484 +LERFS 403323 +LETM1 3954 +LETM1P1 390597 +LETM1P2 100131934 +LETM1P3 100151646 +LETM2 137994 +LETMD1 25875 +LETR1 400456 +LEUTX 342900 +LFNG 3955 +LGALS1 3956 +LGALS2 3957 +LGALS3 3958 +LGALS3BP 3959 +LGALS4 3960 +LGALS7 3963 +LGALS7B 653499 +LGALS8 3964 +LGALS8-AS1 100287902 +LGALS9 3965 +LGALS9B 284194 +LGALS9C 654346 +LGALS9DP 645754 +LGALS12 85329 +LGALS13 29124 +LGALS14 56891 +LGALS16 148003 +LGALSL 29094 +LGALSL-DT 105374771 +LGI1 9211 +LGI2 55203 +LGI3 203190 +LGI4 163175 +LGMN 5641 +LGMNP1 122199 +LGR4 55366 +LGR4-AS1 105376671 +LGR5 8549 +LGR6 59352 +LGSN 51557 +LGTN 100529141 +LHB 3972 +LHCGR 3973 +LHFPL1 340596 +LHFPL2 10184 +LHFPL3 375612 +LHFPL3-AS1 645591 +LHFPL3-AS2 723809 +LHFPL4 375323 +LHFPL5 222662 +LHFPL6 10186 +LHFPL7 255349 +LHPP 64077 +LHX1 3975 +LHX1-DT 102723471 +LHX2 9355 +LHX2-AS1 100505588 +LHX3 8022 +LHX4 89884 +LHX4-AS1 100527964 +LHX5 64211 +LHX5-AS1 104355219 +LHX6 26468 +LHX8 431707 +LHX9 56956 +LIAS 11019 +LIAT1 400566 +LIF 3976 +LIF-AS1 110806283 +LIF-AS2 91370 +LIFR 3977 +LIFR-AS1 100506495 +LIG1 3978 +LIG3 3980 +LIG4 3981 +LILRA1 11024 +LILRA2 11027 +LILRA2P1 100422604 +LILRA3 11026 +LILRA4 23547 +LILRA5 353514 +LILRA6 79168 +LILRB1 10859 +LILRB1-AS1 109729136 +LILRB2 10288 +LILRB3 11025 +LILRB4 11006 +LILRB5 10990 +LILRP1 79167 +LILRP2 79166 +LIM2 3982 +LIM2-AS1 105372446 +LIMA1 51474 +LIMASI 105372272 +LIMCH1 22998 +LIMD1 8994 +LIMD1-AS1 644714 +LIMD2 80774 +LIME1 54923 +LIMK1 3984 +LIMK2 3985 +LIMK2P1 139952 +LIMS1 3987 +LIMS1-AS1 106182118 +LIMS2 55679 +LIMS3 96626 +LIMS4 100288695 +LIN7A 8825 +LIN7B 64130 +LIN7C 55327 +LIN9 286826 +LIN28A 79727 +LIN28AP1 129402 +LIN28AP2 100287388 +LIN28AP3 441940 +LIN28B 389421 +LIN28B-AS1 100113403 +LIN37 55957 +LIN52 91750 +LIN54 132660 +LINC-PINT 378805 +LINC-ROR 100885779 +LINC00028 140875 +LINC00029 100144596 +LINC00051 619434 +LINC00052 145978 +LINC00092 100188953 +LINC00102 100359394 +LINC00106 751580 +LINC00111 54090 +LINC00112 54089 +LINC00113 54088 +LINC00114 400866 +LINC00115 79854 +LINC00158 54072 +LINC00159 100551499 +LINC00160 54064 +LINC00161 118421 +LINC00163 727699 +LINC00165 727701 +LINC00173 100287569 +LINC00174 285908 +LINC00184 100302691 +LINC00189 193629 +LINC00200 399706 +LINC00205 642852 +LINC00207 388910 +LINC00208 83655 +LINC00210 100885798 +LINC00216 55451 +LINC00221 338005 +LINC00222 387111 +LINC00226 338004 +LINC00229 414351 +LINC00235 64493 +LINC00237 105372556 +LINC00239 145200 +LINC00240 100133205 +LINC00242 401288 +LINC00243 401247 +LINC00244 64433 +LINC00251 552859 +LINC00254 64735 +LINC00260 84719 +LINC00261 140828 +LINC00265 349114 +LINC00265-2P 100287296 +LINC00265-3P 100287470 +LINC00268-2P 100288610 +LINC00269 100996279 +LINC00272 388719 +LINC00273 649159 +LINC00276 100499171 +LINC00278 100873962 +LINC00279 100873963 +LINC00280 100873964 +LINC00290 728081 +LINC00293 497634 +LINC00294 283267 +LINC00297 100874059 +LINC00298 339788 +LINC00299 339789 +LINC00301 283197 +LINC00302 388699 +LINC00303 284573 +LINC00304 283860 +LINC00305 221241 +LINC00307 266919 +LINC00308 54143 +LINC00309 150992 +LINC00310 114036 +LINC00311 197196 +LINC00312 29931 +LINC00313 114038 +LINC00314 246705 +LINC00315 246704 +LINC00316 388830 +LINC00317 378828 +LINC00319 284836 +LINC00320 387486 +LINC00322 100126693 +LINC00323 284835 +LINC00324 284029 +LINC00326 285735 +LINC00327 100506697 +LINC00328 51152 +LINC00328-2P 100874404 +LINC00330 144817 +LINC00331 100874126 +LINC00332 100874127 +LINC00333 100874128 +LINC00334 114042 +LINC00336 401253 +LINC00339 29092 +LINC00342 150759 +LINC00343 144920 +LINC00345 105370208 +LINC00347 338864 +LINC00348 100885781 +LINC00349 100874135 +LINC00351 100874137 +LINC00352 100874138 +LINC00353 100874139 +LINC00354 101928616 +LINC00355 144766 +LINC00358 100874143 +LINC00359 100887754 +LINC00362 100874144 +LINC00363 104326053 +LINC00364 100874145 +LINC00365 100874146 +LINC00366 100874147 +LINC00367 101930748 +LINC00368 101927802 +LINC00370 105370357 +LINC00373 105370306 +LINC00374 106144531 +LINC00375 104355140 +LINC00376 104355293 +LINC00377 103724386 +LINC00378 101926930 +LINC00379 100874150 +LINC00380 101930747 +LINC00381 100874151 +LINC00382 101927195 +LINC00383 103689913 +LINC00384 102157400 +LINC00385 105370141 +LINC00387 100874152 +LINC00388 100874153 +LINC00390 105370183 +LINC00391 101927248 +LINC00392 100874155 +LINC00393 100874156 +LINC00395 100874157 +LINC00396 104355146 +LINC00397 101930749 +LINC00398 100874158 +LINC00399 104326054 +LINC00400 100874159 +LINC00402 100507612 +LINC00404 100874160 +LINC00407 106144541 +LINC00408 100652856 +LINC00410 144776 +LINC00411 100874161 +LINC00412 102723332 +LINC00415 107984009 +LINC00421 100287114 +LINC00423 100874167 +LINC00424 100874182 +LINC00426 100188949 +LINC00427 100507040 +LINC00428 104355147 +LINC00430 106144533 +LINC00431 104355135 +LINC00433 100874168 +LINC00434 100874169 +LINC00437 101929121 +LINC00440 100874172 +LINC00442 348021 +LINC00443 100874173 +LINC00445 100507114 +LINC00446 100874175 +LINC00448 100874176 +LINC00449 106478991 +LINC00452 643365 +LINC00454 100874178 +LINC00456 103625683 +LINC00457 100874179 +LINC00458 100507428 +LINC00459 100874180 +LINC00460 728192 +LINC00461 645323 +LINC00462 100129597 +LINC00463 101928922 +LINC00466 199899 +LINC00467 84791 +LINC00469 283982 +LINC00470 56651 +LINC00471 151477 +LINC00472 79940 +LINC00473 90632 +LINC00474 58483 +LINC00475 158314 +LINC00477 144360 +LINC00479 150135 +LINC00482 284185 +LINC00484 100129347 +LINC00485 283432 +LINC00486 285045 +LINC00487 400941 +LINC00488 677779 +LINC00489 100861522 +LINC00491 285708 +LINC00492 100861468 +LINC00494 284749 +LINC00498 105377446 +LINC00499 100874047 +LINC00500 106480440 +LINC00501 100820709 +LINC00502 100874184 +LINC00504 201853 +LINC00506 100846978 +LINC00507 100862680 +LINC00508 104472718 +LINC00511 400619 +LINC00513 100506860 +LINC00515 282566 +LINC00517 400208 +LINC00518 221718 +LINC00519 161342 +LINC00520 645687 +LINC00523 283601 +LINC00524 338002 +LINC00525 84847 +LINC00526 147525 +LINC00528 200298 +LINC00529 83647 +LINC00533 387055 +LINC00534 100874052 +LINC00536 100859921 +LINC00537 203274 +LINC00538 100861504 +LINC00539 100652865 +LINC00540 100506622 +LINC00543 100132234 +LINC00544 440131 +LINC00545 440132 +LINC00547 400121 +LINC00548 400123 +LINC00550 338862 +LINC00551 283483 +LINC00552 100130386 +LINC00554 100861542 +LINC00555 100861543 +LINC00556 100861551 +LINC00557 100861544 +LINC00558 100861552 +LINC00559 100874187 +LINC00560 100861553 +LINC00561 100861545 +LINC00562 100861549 +LINC00563 100861554 +LINC00564 100861546 +LINC00566 100861547 +LINC00567 283486 +LINC00570 100874055 +LINC00571 100874188 +LINC00572 100861573 +LINC00574 80069 +LINC00575 439934 +LINC00578 100505566 +LINC00581 100874531 +LINC00582 100287814 +LINC00583 100113404 +LINC00587 414319 +LINC00588 26138 +LINC00589 619351 +LINC00592 283404 +LINC00593 414926 +LINC00595 414243 +LINC00596 102724845 +LINC00597 81698 +LINC00598 646982 +LINC00601 101101772 +LINC00602 441177 +LINC00603 102467077 +LINC00604 106144578 +LINC00605 100131366 +LINC00606 285370 +LINC00607 646324 +LINC00608 151300 +LINC00609 101101773 +LINC00612 253128 +LINC00613 100507528 +LINC00615 439916 +LINC00616 641365 +LINC00618 145249 +LINC00619 414260 +LINC00620 285375 +LINC00621 100996930 +LINC00622 644242 +LINC00623 728855 +LINC00624 100289211 +LINC00626 79100 +LINC00628 127841 +LINC00629 100506757 +LINC00630 100287765 +LINC00632 286411 +LINC00635 151658 +LINC00636 285205 +LINC00638 196872 +LINC00639 283547 +LINC00640 283553 +LINC00641 283624 +LINC00642 400238 +LINC00644 101954204 +LINC00645 100505967 +LINC00648 100506433 +LINC00649 100506334 +LINC00652 29075 +LINC00654 149837 +LINC00656 200261 +LINC00658 100507629 +LINC00659 100652730 +LINC00661 126536 +LINC00662 148189 +LINC00663 284440 +LINC00664 400680 +LINC00665 100506930 +LINC00667 339290 +LINC00668 400643 +LINC00670 284034 +LINC00671 388387 +LINC00673 100499467 +LINC00674 100499466 +LINC00676 101409253 +LINC00677 105370683 +LINC00678 101410541 +LINC00680 106660612 +LINC00680-GUSBP4 106660613 +LINC00681 101409254 +LINC00682 101927074 +LINC00683 400660 +LINC00685 283981 +LINC00686 140865 +LINC00687 728450 +LINC00689 154822 +LINC00690 100996597 +LINC00691 152024 +LINC00692 285326 +LINC00693 645206 +LINC00696 100128378 +LINC00698 285401 +LINC00700 282980 +LINC00701 399708 +LINC00702 100652988 +LINC00703 100507059 +LINC00705 338588 +LINC00706 100652997 +LINC00707 100507127 +LINC00708 100507143 +LINC00709 100507163 +LINC00710 254312 +LINC00824 101927774 +LINC00836 101929052 +LINC00837 100507605 +LINC00838 100505583 +LINC00839 84856 +LINC00840 100506835 +LINC00841 283033 +LINC00842 643650 +LINC00844 100507008 +LINC00845 100507058 +LINC00847 729678 +LINC00850 101241891 +LINC00851 440757 +LINC00852 84657 +LINC00853 100874253 +LINC00856 100132987 +LINC00857 439990 +LINC00858 170425 +LINC00861 100130231 +LINC00862 554279 +LINC00863 439994 +LINC00865 643529 +LINC00867 100506126 +LINC00868 283994 +LINC00869 57234 +LINC00870 201617 +LINC00871 100506412 +LINC00877 285286 +LINC00879 255025 +LINC00880 339894 +LINC00881 100498859 +LINC00882 100302640 +LINC00885 401109 +LINC00886 730091 +LINC00887 100131551 +LINC00891 441501 +LINC00892 100128420 +LINC00895 150185 +LINC00896 150197 +LINC00898 400932 +LINC00899 100271722 +LINC00900 283143 +LINC00901 100506724 +LINC00903 100861506 +LINC00904 100652909 +LINC00905 148231 +LINC00906 148145 +LINC00907 284260 +LINC00908 284276 +LINC00910 100130581 +LINC00911 100996280 +LINC00917 732275 +LINC00919 100505619 +LINC00920 100505865 +LINC00921 283876 +LINC00922 283867 +LINC00923 91948 +LINC00924 145820 +LINC00926 283663 +LINC00927 283688 +LINC00928 283761 +LINC00929 503519 +LINC00930 100144604 +LINC00933 100506874 +LINC00934 144742 +LINC00937 389634 +LINC00938 400027 +LINC00939 400084 +LINC00940 100271702 +LINC00941 100287314 +LINC00942 100292680 +LINC00943 100507206 +LINC00944 387895 +LINC00945 101930746 +LINC00951 401260 +LINC00954 400946 +LINC00955 285492 +LINC00957 255031 +LINC00958 100506305 +LINC00960 401074 +LINC00963 100506190 +LINC00964 157381 +LINC00965 349196 +LINC00967 100505659 +LINC00968 100507632 +LINC00970 101978719 +LINC00971 440970 +LINC00972 105375380 +LINC00973 105374003 +LINC00974 147093 +LINC00976 106144608 +LINC00977 728724 +LINC00987 100499405 +LINC00989 100506035 +LINC00992 728342 +LINC00993 101929520 +LINC00994 100287879 +LINC00996 285972 +LINC00997 401321 +LINC00999 399744 +LINC01000 402483 +LINC01001 100133161 +LINC01002 399844 +LINC01003 100128822 +LINC01004 100216546 +LINC01005 100506050 +LINC01007 100506527 +LINC01010 154092 +LINC01011 401232 +LINC01012 100507173 +LINC01013 100507254 +LINC01014 100874330 +LINC01015 100507362 +LINC01016 100507584 +LINC01017 102467075 +LINC01018 255167 +LINC01019 285577 +LINC01020 340094 +LINC01022 105375616 +LINC01023 100652853 +LINC01028 101928141 +LINC01029 101927715 +LINC01030 101937451 +LINC01031 101929184 +LINC01033 104355136 +LINC01034 106144601 +LINC01035 106144592 +LINC01036 104169671 +LINC01037 106144535 +LINC01038 102724076 +LINC01039 104355149 +LINC01040 105370308 +LINC01043 101928752 +LINC01044 104266956 +LINC01046 103689843 +LINC01047 105616982 +LINC01048 103695431 +LINC01049 101927224 +LINC01050 103689845 +LINC01052 105370242 +LINC01053 102723318 +LINC01054 104355150 +LINC01055 103752581 +LINC01056 100144597 +LINC01058 103724387 +LINC01060 401164 +LINC01061 401149 +LINC01063 101929769 +LINC01065 102723875 +LINC01066 106144544 +LINC01067 107080624 +LINC01068 103724388 +LINC01069 101927176 +LINC01070 101928698 +LINC01072 104355137 +LINC01074 106144607 +LINC01075 103752583 +LINC01076 106144602 +LINC01077 107080621 +LINC01078 106144536 +LINC01079 106146146 +LINC01080 101515984 +LINC01081 101154687 +LINC01082 100506542 +LINC01085 152742 +LINC01087 101927994 +LINC01088 100505875 +LINC01089 338799 +LINC01090 104355152 +LINC01091 285419 +LINC01093 100506229 +LINC01094 100505702 +LINC01095 100505545 +LINC01096 285548 +LINC01097 285547 +LINC01098 285501 +LINC01099 101928656 +LINC01100 730109 +LINC01101 84931 +LINC01102 150568 +LINC01103 101927360 +LINC01104 150577 +LINC01106 151009 +LINC01107 151171 +LINC01108 102216342 +LINC01109 102216341 +LINC01111 101926978 +LINC01114 284998 +LINC01115 339822 +LINC01116 375295 +LINC01117 102724224 +LINC01118 388948 +LINC01119 100134259 +LINC01120 389043 +LINC01121 400952 +LINC01122 400955 +LINC01123 440894 +LINC01124 440925 +LINC01126 100129726 +LINC01127 100506328 +LINC01128 643837 +LINC01132 100506810 +LINC01133 100505633 +LINC01134 100133612 +LINC01135 100131060 +LINC01138 388685 +LINC01139 339535 +LINC01140 339524 +LINC01141 339505 +LINC01142 284688 +LINC01143 104355141 +LINC01144 400752 +LINC01145 103091866 +LINC01147 101928791 +LINC01148 283585 +LINC01149 101929111 +LINC01150 101927624 +LINC01151 104266958 +LINC01152 102606463 +LINC01153 101927889 +LINC01154 106144575 +LINC01157 105379037 +LINC01159 102682016 +LINC01160 100129269 +LINC01162 104355138 +LINC01163 101927381 +LINC01164 399827 +LINC01165 100128830 +LINC01166 101927590 +LINC01167 103695432 +LINC01168 399829 +LINC01169 102723165 +LINC01170 103724389 +LINC01173 106144537 +LINC01176 100506516 +LINC01177 104355218 +LINC01179 101928151 +LINC01180 101927017 +LINC01181 379034 +LINC01182 101929071 +LINC01186 101927574 +LINC01187 100507267 +LINC01189 643648 +LINC01191 440900 +LINC01192 647107 +LINC01193 348120 +LINC01194 404663 +LINC01195 104266959 +LINC01198 101929344 +LINC01201 104266960 +LINC01202 104326188 +LINC01203 100133123 +LINC01204 101927528 +LINC01205 401082 +LINC01206 100996490 +LINC01208 100505547 +LINC01209 101928684 +LINC01210 100507274 +LINC01213 101927992 +LINC01214 101928022 +LINC01215 101929623 +LINC01216 100874275 +LINC01217 100874276 +LINC01218 107986233 +LINC01219 104355220 +LINC01220 731223 +LINC01221 104266961 +LINC01222 102800316 +LINC01224 104472717 +LINC01226 284551 +LINC01227 101928276 +LINC01228 104266962 +LINC01229 101928248 +LINC01230 102800446 +LINC01231 101929247 +LINC01232 102725509 +LINC01233 100128139 +LINC01234 100506465 +LINC01235 401492 +LINC01237 101927289 +LINC01238 102723927 +LINC01239 441389 +LINC01241 101929582 +LINC01242 401497 +LINC01243 101929620 +LINC01246 102800315 +LINC01247 101929390 +LINC01248 102723818 +LINC01249 727982 +LINC01250 101927554 +LINC01252 338817 +LINC01254 101927350 +LINC01255 101927433 +LINC01256 104355285 +LINC01257 116437 +LINC01258 101928776 +LINC01259 106144599 +LINC01260 79015 +LINC01262 101928971 +LINC01264 104266963 +LINC01265 101926904 +LINC01266 101927215 +LINC01267 101927565 +LINC01269 103695436 +LINC01270 284751 +LINC01271 101927586 +LINC01273 101927541 +LINC01275 101927512 +LINC01276 103106903 +LINC01277 100507489 +LINC01278 92249 +LINC01280 101928232 +LINC01281 286442 +LINC01282 101927449 +LINC01283 107985711 +LINC01284 101926971 +LINC01285 101928287 +LINC01287 103724390 +LINC01288 103689844 +LINC01289 286184 +LINC01290 106144584 +LINC01291 102724515 +LINC01293 101927861 +LINC01297 115694671 +LINC01298 619344 +LINC01299 286186 +LINC01300 731779 +LINC01301 100505532 +LINC01303 101927780 +LINC01304 100505964 +LINC01305 285084 +LINC01307 104355286 +LINC01309 104326190 +LINC01310 100128946 +LINC01311 100652736 +LINC01312 154089 +LINC01315 102723775 +LINC01317 104355287 +LINC01318 106144585 +LINC01320 104355288 +LINC01322 103695433 +LINC01323 106635527 +LINC01324 104355289 +LINC01326 106144540 +LINC01327 104310350 +LINC01331 104310351 +LINC01332 106144530 +LINC01333 101929082 +LINC01335 102503429 +LINC01337 103689917 +LINC01338 102546175 +LINC01339 101929495 +LINC01340 102546227 +LINC01341 149134 +LINC01342 254099 +LINC01343 339442 +LINC01344 400799 +LINC01345 105376672 +LINC01346 728716 +LINC01347 731275 +LINC01348 731656 +LINC01349 100128787 +LINC01350 101929093 +LINC01352 101929730 +LINC01353 100506775 +LINC01354 100506795 +LINC01355 100996511 +LINC01356 100996702 +LINC01357 105378912 +LINC01358 101926925 +LINC01359 101927084 +LINC01360 101927295 +LINC01361 101927498 +LINC01362 103283057 +LINC01363 101928484 +LINC01364 100505768 +LINC01365 101927007 +LINC01366 257358 +LINC01370 100505663 +LINC01372 101929736 +LINC01374 105378425 +LINC01375 101926924 +LINC01376 400945 +LINC01377 102467074 +LINC01378 103689918 +LINC01381 106144568 +LINC01385 106144542 +LINC01386 104355294 +LINC01387 100130480 +LINC01388 101929179 +LINC01389 102724077 +LINC01391 103344930 +LINC01392 104355291 +LINC01393 102724386 +LINC01394 106144586 +LINC01395 101929557 +LINC01396 103695434 +LINC01397 104355139 +LINC01398 101929651 +LINC01399 104310353 +LINC01400 107080554 +LINC01402 104797536 +LINC01404 105369980 +LINC01405 100131138 +LINC01409 105378580 +LINC01410 103352539 +LINC01411 101928176 +LINC01412 101928455 +LINC01413 101928611 +LINC01414 102724623 +LINC01415 100132501 +LINC01416 101927273 +LINC01418 102724001 +LINC01419 103352670 +LINC01422 101929539 +LINC01423 102724678 +LINC01424 101928689 +LINC01425 101927821 +LINC01426 100506385 +LINC01427 101929663 +LINC01428 101929265 +LINC01429 101927678 +LINC01430 101927242 +LINC01431 100505683 +LINC01432 100270679 +LINC01433 728228 +LINC01435 103695365 +LINC01436 100996609 +LINC01438 106144527 +LINC01440 102723578 +LINC01441 101927796 +LINC01442 103456507 +LINC01443 400644 +LINC01444 101927642 +LINC01445 102723605 +LINC01446 401337 +LINC01447 101929086 +LINC01448 101928795 +LINC01449 101928773 +LINC01450 101928744 +LINC01451 401561 +LINC01455 105616916 +LINC01456 105373144 +LINC01460 100129995 +LINC01461 103695366 +LINC01465 283416 +LINC01467 101928559 +LINC01470 101927134 +LINC01471 101927149 +LINC01472 128071535 +LINC01473 101927217 +LINC01474 101927258 +LINC01475 101927324 +LINC01476 101927728 +LINC01477 101927900 +LINC01478 101927921 +LINC01479 101927922 +LINC01480 101927931 +LINC01482 101928104 +LINC01483 101928122 +LINC01484 101928136 +LINC01485 101928154 +LINC01486 101928138 +LINC01487 101928190 +LINC01488 101928292 +LINC01489 101928340 +LINC01490 101928420 +LINC01491 101928442 +LINC01492 101928496 +LINC01493 101928536 +LINC01494 101928537 +LINC01495 102723378 +LINC01496 102723426 +LINC01497 102723487 +LINC01498 102723562 +LINC01499 102723644 +LINC01500 102723742 +LINC01501 340515 +LINC01502 100130954 +LINC01503 100506119 +LINC01504 100507540 +LINC01505 100996590 +LINC01506 101927015 +LINC01507 101927477 +LINC01508 101927873 +LINC01509 101928720 +LINC01511 100506791 +LINC01512 100132354 +LINC01513 112163642 +LINC01514 101927396 +LINC01515 101928913 +LINC01516 101929025 +LINC01517 101929218 +LINC01518 101929397 +LINC01519 101929624 +LINC01520 101929684 +LINC01521 54944 +LINC01522 101927457 +LINC01523 101060004 +LINC01524 101927700 +LINC01525 104355292 +LINC01526 101928770 +LINC01527 101927988 +LINC01530 729975 +LINC01531 100128682 +LINC01532 100505835 +LINC01533 100996665 +LINC01535 101927667 +LINC01537 101928555 +LINC01538 400654 +LINC01539 100505474 +LINC01541 100505776 +LINC01543 100506787 +LINC01544 100996669 +LINC01545 724087 +LINC01546 100129464 +LINC01547 84536 +LINC01548 728409 +LINC01549 100505929 +LINC01550 388011 +LINC01551 387978 +LINC01553 283025 +LINC01554 202299 +LINC01555 439927 +LINC01556 729583 +LINC01558 26238 +LINC01559 283422 +LINC01560 203414 +LINC01561 404216 +LINC01562 105378716 +LINC01563 101060544 +LINC01564 101927171 +LINC01565 23434 +LINC01566 283914 +LINC01567 400511 +LINC01569 100507501 +LINC01570 101926950 +LINC01571 101927364 +LINC01572 101927957 +LINC01574 102577424 +LINC01579 283682 +LINC01580 101927129 +LINC01581 101927112 +LINC01582 101927332 +LINC01583 101929690 +LINC01584 101929701 +LINC01585 101929765 +LINC01586 101929743 +LINC01587 10141 +LINC01588 283551 +LINC01589 100506737 +LINC01590 63914 +LINC01591 286094 +LINC01592 100505718 +LINC01593 107178918 +LINC01594 102724774 +LINC01595 102725176 +LINC01596 105377617 +LINC01597 400841 +LINC01599 196913 +LINC01600 154386 +LINC01601 105667213 +LINC01602 100505477 +LINC01603 100505739 +LINC01605 100507420 +LINC01606 100507651 +LINC01607 101927067 +LINC01608 101927459 +LINC01609 101927487 +LINC01610 101928353 +LINC01611 105377880 +LINC01612 101928223 +LINC01613 106146149 +LINC01614 105373869 +LINC01615 101929484 +LINC01616 106456574 +LINC01617 101926947 +LINC01618 152578 +LINC01619 256021 +LINC01620 140834 +LINC01621 89758 +LINC01622 285768 +LINC01623 401242 +LINC01624 401289 +LINC01625 645434 +LINC01626 102724000 +LINC01627 105376036 +LINC01628 102724321 +LINC01629 105370578 +LINC01630 100287225 +LINC01632 101929826 +LINC01633 101929069 +LINC01634 100192420 +LINC01635 101928043 +LINC01637 101928891 +LINC01638 105372978 +LINC01639 105373054 +LINC01640 105373006 +LINC01641 107985463 +LINC01643 105373010 +LINC01644 101927722 +LINC01645 102724661 +LINC01646 105376679 +LINC01647 101929181 +LINC01648 101929406 +LINC01649 101928995 +LINC01650 101928169 +LINC01651 105372944 +LINC01653 101929631 +LINC01654 101927876 +LINC01655 101929771 +LINC01656 101927526 +LINC01657 101928751 +LINC01659 101929374 +LINC01661 105378889 +LINC01664 100996342 +LINC01665 101929350 +LINC01666 105372730 +LINC01667 441058 +LINC01668 101928311 +LINC01670 105379487 +LINC01671 101928233 +LINC01672 100505887 +LINC01673 105372763 +LINC01674 102724188 +LINC01675 105371590 +LINC01676 101928476 +LINC01677 105378884 +LINC01678 105377138 +LINC01679 101928399 +LINC01680 105371660 +LINC01681 105371609 +LINC01682 101927504 +LINC01683 105372746 +LINC01684 105372751 +LINC01685 105378656 +LINC01686 284648 +LINC01687 101927843 +LINC01688 105371644 +LINC01689 101927869 +LINC01690 102724502 +LINC01691 107985195 +LINC01692 339622 +LINC01694 105372840 +LINC01695 101927973 +LINC01696 105372897 +LINC01697 284825 +LINC01698 101929476 +LINC01699 100287948 +LINC01700 101928435 +LINC01701 107985456 +LINC01702 102724481 +LINC01703 105373113 +LINC01704 646268 +LINC01705 107985307 +LINC01706 101929312 +LINC01707 105378785 +LINC01708 101928270 +LINC01709 105378872 +LINC01710 105372925 +LINC01711 79160 +LINC01712 101927542 +LINC01713 105372516 +LINC01714 102724539 +LINC01716 105372682 +LINC01717 105372893 +LINC01718 100506470 +LINC01719 101928979 +LINC01720 440704 +LINC01721 400839 +LINC01722 101929486 +LINC01723 100505515 +LINC01724 105371673 +LINC01725 101927587 +LINC01726 101929608 +LINC01727 101929625 +LINC01728 105372626 +LINC01729 101929207 +LINC01730 101929125 +LINC01731 105371226 +LINC01732 101928973 +LINC01733 101926955 +LINC01734 339568 +LINC01735 107985254 +LINC01736 101927532 +LINC01737 101927553 +LINC01738 107984953 +LINC01739 105378769 +LINC01740 101929565 +LINC01741 101928778 +LINC01742 105376992 +LINC01743 255654 +LINC01744 101927683 +LINC01745 105373199 +LINC01746 105372608 +LINC01747 105372566 +LINC01748 105378763 +LINC01749 63930 +LINC01750 643355 +LINC01751 101929288 +LINC01752 101929395 +LINC01753 105378739 +LINC01754 102723442 +LINC01755 105378738 +LINC01756 101928460 +LINC01757 105376827 +LINC01758 105378788 +LINC01760 100996630 +LINC01761 440594 +LINC01762 101929023 +LINC01763 105378854 +LINC01764 105372290 +LINC01765 105378916 +LINC01766 102723617 +LINC01767 105378744 +LINC01768 107985167 +LINC01770 102724312 +LINC01772 107984921 +LINC01773 107985519 +LINC01774 105372894 +LINC01775 101928602 +LINC01776 729987 +LINC01777 284661 +LINC01778 105378622 +LINC01779 107985190 +LINC01780 105378934 +LINC01781 101927412 +LINC01782 101927411 +LINC01783 100132147 +LINC01784 105376745 +LINC01785 374890 +LINC01786 101928895 +LINC01787 101928241 +LINC01788 101927244 +LINC01789 105373536 +LINC01790 101927431 +LINC01791 107985312 +LINC01792 100507140 +LINC01793 101927285 +LINC01794 101929700 +LINC01795 105374744 +LINC01796 105373518 +LINC01797 101927577 +LINC01798 100507073 +LINC01799 101060019 +LINC01800 101927438 +LINC01801 400685 +LINC01802 105373852 +LINC01803 105373889 +LINC01804 101926966 +LINC01805 105374774 +LINC01806 100996579 +LINC01807 101928765 +LINC01808 105373460 +LINC01809 101928031 +LINC01810 105373400 +LINC01811 101928114 +LINC01812 101927701 +LINC01813 101927165 +LINC01814 101929567 +LINC01815 100507201 +LINC01816 100133985 +LINC01817 105373683 +LINC01818 105373684 +LINC01819 102723854 +LINC01820 105374582 +LINC01821 101927406 +LINC01822 645949 +LINC01823 101927801 +LINC01824 107985844 +LINC01825 124908063 +LINC01826 107985818 +LINC01827 105373818 +LINC01828 102800447 +LINC01829 644838 +LINC01830 105374322 +LINC01831 101927331 +LINC01832 105373635 +LINC01833 107985879 +LINC01834 107985280 +LINC01836 107985343 +LINC01837 105372363 +LINC01838 100652911 +LINC01839 105374251 +LINC01840 100874079 +LINC01841 105372288 +LINC01842 101928845 +LINC01843 101927934 +LINC01844 101926975 +LINC01845 285627 +LINC01846 105379098 +LINC01847 101927766 +LINC01848 100289673 +LINC01849 105373507 +LINC01850 107985951 +LINC01851 101927926 +LINC01852 107984773 +LINC01853 105373647 +LINC01854 151121 +LINC01855 105372292 +LINC01856 101927924 +LINC01857 102724714 +LINC01858 101929144 +LINC01859 101929164 +LINC01861 105378238 +LINC01863 107986480 +LINC01864 101928886 +LINC01865 105373350 +LINC01866 107985806 +LINC01867 105374596 +LINC01868 107985924 +LINC01870 107985925 +LINC01871 101929531 +LINC01872 105372444 +LINC01873 729348 +LINC01874 727944 +LINC01875 101927362 +LINC01876 101929378 +LINC01877 101927641 +LINC01878 102725079 +LINC01879 400661 +LINC01880 105373979 +LINC01881 728323 +LINC01882 100996324 +LINC01883 100996902 +LINC01884 102723362 +LINC01885 105373538 +LINC01886 105373537 +LINC01887 102724470 +LINC01888 107985893 +LINC01889 105373597 +LINC01890 105374791 +LINC01891 105373934 +LINC01892 105371969 +LINC01893 105372207 +LINC01894 105372030 +LINC01895 105371964 +LINC01896 645321 +LINC01897 107985146 +LINC01898 100505853 +LINC01899 102724913 +LINC01900 102724208 +LINC01901 105372080 +LINC01902 105372079 +LINC01903 101927430 +LINC01904 388456 +LINC01905 102724698 +LINC01906 105372009 +LINC01907 151475 +LINC01908 105372037 +LINC01909 101927481 +LINC01910 101060542 +LINC01911 105373669 +LINC01912 105372175 +LINC01913 388942 +LINC01914 101929723 +LINC01915 729950 +LINC01916 107985128 +LINC01917 101928167 +LINC01918 105373984 +LINC01919 102724651 +LINC01920 101929260 +LINC01922 101927606 +LINC01923 101927619 +LINC01924 284294 +LINC01925 105376854 +LINC01926 105372147 +LINC01927 101927651 +LINC01928 105371994 +LINC01929 101927229 +LINC01930 109729128 +LINC01931 150596 +LINC01932 105377682 +LINC01933 101927115 +LINC01934 101927156 +LINC01935 105373519 +LINC01936 285043 +LINC01937 105373962 +LINC01938 105377701 +LINC01939 101060385 +LINC01940 401039 +LINC01941 105373600 +LINC01942 105377736 +LINC01943 101928173 +LINC01944 105377728 +LINC01945 101928067 +LINC01946 105374449 +LINC01947 102557615 +LINC01948 102467147 +LINC01949 55338 +LINC01950 102467213 +LINC01951 441116 +LINC01953 105373863 +LINC01954 101929733 +LINC01955 105374847 +LINC01956 124905956 +LINC01957 101927059 +LINC01958 105373708 +LINC01960 100128905 +LINC01961 101927424 +LINC01962 102577426 +LINC01963 150967 +LINC01964 100996478 +LINC01965 107985928 +LINC01966 105373662 +LINC01967 107986041 +LINC01968 100507391 +LINC01969 101927230 +LINC01970 101929511 +LINC01971 105371927 +LINC01972 105374293 +LINC01973 400624 +LINC01974 105371798 +LINC01975 105371496 +LINC01976 107546764 +LINC01977 105371919 +LINC01978 101928738 +LINC01979 101928766 +LINC01980 105377007 +LINC01981 100996624 +LINC01982 105371830 +LINC01983 101929697 +LINC01985 101928015 +LINC01986 102723448 +LINC01987 100132174 +LINC01988 100506319 +LINC01989 101927239 +LINC01990 101929607 +LINC01991 105374266 +LINC01992 105371708 +LINC01993 100996291 +LINC01994 401103 +LINC01995 105374244 +LINC01996 400568 +LINC01997 105374201 +LINC01998 107986046 +LINC01999 388406 +LINC02000 100507210 +LINC02002 105371595 +LINC02003 146795 +LINC02004 105374119 +LINC02005 105377165 +LINC02006 105374165 +LINC02008 105377180 +LINC02009 105377068 +LINC02010 101927866 +LINC02011 152274 +LINC02012 100129516 +LINC02013 105374272 +LINC02014 105374105 +LINC02015 102724550 +LINC02016 101927123 +LINC02017 105377096 +LINC02018 107986100 +LINC02019 107986085 +LINC02020 107986164 +LINC02021 105374104 +LINC02022 105376955 +LINC02023 101928405 +LINC02024 105374057 +LINC02025 105377192 +LINC02026 647323 +LINC02027 728290 +LINC02028 285389 +LINC02029 105374177 +LINC02030 105377098 +LINC02031 102724617 +LINC02032 100507461 +LINC02033 105377031 +LINC02034 107986125 +LINC02035 100129550 +LINC02036 100505920 +LINC02037 101929337 +LINC02038 105374285 +LINC02039 102546228 +LINC02040 102724763 +LINC02041 105374261 +LINC02042 101929694 +LINC02043 102724699 +LINC02044 101929717 +LINC02045 105374146 +LINC02046 105374149 +LINC02047 101927346 +LINC02048 105374289 +LINC02049 101926983 +LINC02050 105377175 +LINC02051 107986165 +LINC02052 253573 +LINC02053 100505609 +LINC02054 105374250 +LINC02055 107986980 +LINC02057 105378992 +LINC02058 107984117 +LINC02059 100505878 +LINC02060 102546226 +LINC02061 105374714 +LINC02063 105374627 +LINC02064 101929681 +LINC02065 101928741 +LINC02066 105374158 +LINC02067 101243545 +LINC02068 105374219 +LINC02069 101928992 +LINC02070 101927494 +LINC02071 101927274 +LINC02072 440446 +LINC02073 105371828 +LINC02074 102723567 +LINC02075 101927207 +LINC02076 400579 +LINC02077 105377172 +LINC02078 100652929 +LINC02079 105371766 +LINC02080 101928514 +LINC02082 100507661 +LINC02083 107986147 +LINC02084 105377006 +LINC02086 105371809 +LINC02087 101928567 +LINC02088 105371582 +LINC02089 105371831 +LINC02090 105371562 +LINC02091 100506371 +LINC02092 400620 +LINC02093 105371541 +LINC02094 107984995 +LINC02096 107984977 +LINC02097 101928205 +LINC02098 105369564 +LINC02099 101929450 +LINC02100 107986408 +LINC02101 101928569 +LINC02102 100505625 +LINC02103 105374698 +LINC02104 101926940 +LINC02105 105378966 +LINC02106 100287592 +LINC02107 105374731 +LINC02108 101928600 +LINC02109 101929660 +LINC02110 105374729 +LINC02111 401177 +LINC02112 285692 +LINC02113 102724855 +LINC02114 101929153 +LINC02115 102467212 +LINC02116 101929034 +LINC02117 105374728 +LINC02118 105378960 +LINC02119 101929745 +LINC02120 340113 +LINC02121 105374631 +LINC02122 105379036 +LINC02123 101929261 +LINC02124 105371048 +LINC02125 101928203 +LINC02126 101927650 +LINC02127 101927334 +LINC02128 102724940 +LINC02129 105371156 +LINC02130 105447648 +LINC02131 105371350 +LINC02132 107984811 +LINC02133 101927132 +LINC02134 105371238 +LINC02135 146513 +LINC02136 105371333 +LINC02137 105371295 +LINC02138 400558 +LINC02139 400548 +LINC02140 100996345 +LINC02141 101927580 +LINC02142 105374644 +LINC02143 101927835 +LINC02144 105379069 +LINC02145 401172 +LINC02146 105374677 +LINC02147 102467224 +LINC02148 100505811 +LINC02149 101929454 +LINC02150 101929505 +LINC02151 109729162 +LINC02152 105371071 +LINC02153 286114 +LINC02154 109729169 +LINC02155 111082988 +LINC02156 111082992 +LINC02157 111082990 +LINC02159 285629 +LINC02160 105374716 +LINC02161 105379076 +LINC02162 105374624 +LINC02164 105371066 +LINC02165 101927629 +LINC02166 105371416 +LINC02167 400533 +LINC02168 105371252 +LINC02169 100996338 +LINC02171 100133461 +LINC02172 105377443 +LINC02173 105377355 +LINC02174 105377536 +LINC02175 283887 +LINC02176 105371379 +LINC02177 101927009 +LINC02178 105371248 +LINC02179 101927228 +LINC02180 102467079 +LINC02181 440390 +LINC02182 101928880 +LINC02183 105371273 +LINC02184 100505948 +LINC02185 101927311 +LINC02186 101927348 +LINC02188 102724344 +LINC02189 101928614 +LINC02190 105371173 +LINC02191 105371146 +LINC02192 100507534 +LINC02193 105371423 +LINC02194 105371142 +LINC02195 105371152 +LINC02196 107986402 +LINC02197 102724392 +LINC02198 101928885 +LINC02199 101929284 +LINC02200 102467214 +LINC02201 101927379 +LINC02202 101927740 +LINC02203 727924 +LINC02204 101929151 +LINC02205 105370880 +LINC02207 101927153 +LINC02208 101927280 +LINC02209 286135 +LINC02210 147081 +LINC02210-CRHR1 104909134 +LINC02211 105374693 +LINC02212 101929412 +LINC02213 389273 +LINC02214 102467223 +LINC02215 102467225 +LINC02216 105379141 +LINC02217 101929544 +LINC02218 102723526 +LINC02219 102467655 +LINC02220 105374658 +LINC02221 105374648 +LINC02222 105377765 +LINC02223 646241 +LINC02224 102723839 +LINC02225 101928539 +LINC02226 729506 +LINC02227 101927697 +LINC02228 105374694 +LINC02229 101928769 +LINC02230 105379033 +LINC02231 109729131 +LINC02232 401134 +LINC02233 109729132 +LINC02234 109729164 +LINC02235 109729147 +LINC02236 109729133 +LINC02237 105375706 +LINC02238 109729166 +LINC02239 340107 +LINC02240 101927460 +LINC02241 105374676 +LINC02242 105379006 +LINC02243 340581 +LINC02244 105371018 +LINC02245 400958 +LINC02247 105376310 +LINC02248 107984780 +LINC02249 26082 +LINC02250 105370737 +LINC02251 105371008 +LINC02252 105370762 +LINC02253 107984764 +LINC02254 101927286 +LINC02255 105370894 +LINC02256 100996255 +LINC02257 105372950 +LINC02258 110806294 +LINC02259 102723640 +LINC02260 339978 +LINC02261 101929199 +LINC02262 105377389 +LINC02263 105377390 +LINC02264 105377391 +LINC02265 101060498 +LINC02266 105377466 +LINC02267 105377338 +LINC02268 101928509 +LINC02269 101928478 +LINC02270 101929019 +LINC02271 105377249 +LINC02272 107986322 +LINC02273 100996286 +LINC02274 100506498 +LINC02275 100506085 +LINC02276 105377456 +LINC02277 107984027 +LINC02278 105374411 +LINC02279 107984637 +LINC02280 101929634 +LINC02281 105370423 +LINC02282 105370424 +LINC02283 105377656 +LINC02284 102723699 +LINC02285 101929422 +LINC02286 105370414 +LINC02287 101929002 +LINC02288 283575 +LINC02289 102724190 +LINC02290 105370540 +LINC02291 100129345 +LINC02292 101929080 +LINC02293 102724890 +LINC02294 101927062 +LINC02295 105370652 +LINC02296 105370610 +LINC02297 642426 +LINC02298 102723354 +LINC02299 105370646 +LINC02300 105370422 +LINC02301 101928599 +LINC02302 101927351 +LINC02303 105370479 +LINC02304 105370648 +LINC02305 102724338 +LINC02306 107984700 +LINC02307 105370471 +LINC02308 100506700 +LINC02309 105370607 +LINC02310 105370496 +LINC02311 102724294 +LINC02312 100132612 +LINC02313 105370439 +LINC02314 100507277 +LINC02315 644919 +LINC02316 102724380 +LINC02317 101930294 +LINC02318 100506999 +LINC02319 105370498 +LINC02320 105370676 +LINC02321 105370623 +LINC02322 101927729 +LINC02323 105370681 +LINC02324 100128233 +LINC02325 101929241 +LINC02326 105370425 +LINC02327 102724917 +LINC02328 101928767 +LINC02329 105370605 +LINC02330 105370611 +LINC02331 105370503 +LINC02332 105370400 +LINC02333 103191607 +LINC02334 101929077 +LINC02335 124903234 +LINC02336 105370309 +LINC02337 105370369 +LINC02338 101926897 +LINC02339 101926951 +LINC02340 105370125 +LINC02341 105370177 +LINC02342 105370253 +LINC02343 105370158 +LINC02344 105370154 +LINC02345 101928227 +LINC02346 100128714 +LINC02347 100128554 +LINC02348 101927505 +LINC02349 100506530 +LINC02350 105370059 +LINC02351 105371011 +LINC02352 102725022 +LINC02353 101927363 +LINC02354 107984503 +LINC02355 101927849 +LINC02356 105369984 +LINC02357 105374540 +LINC02358 107986226 +LINC02359 101927464 +LINC02360 105374484 +LINC02361 100996246 +LINC02362 102723766 +LINC02363 728175 +LINC02364 102723764 +LINC02365 105377586 +LINC02366 101928162 +LINC02367 101930452 +LINC02368 101927694 +LINC02369 100996679 +LINC02370 338797 +LINC02371 107984539 +LINC02372 440117 +LINC02373 105369822 +LINC02374 105377600 +LINC02375 101927616 +LINC02376 105370065 +LINC02377 105377424 +LINC02378 105369678 +LINC02379 101927109 +LINC02380 101928851 +LINC02381 400043 +LINC02382 100506107 +LINC02383 105374436 +LINC02384 100507195 +LINC02385 105369948 +LINC02386 105369717 +LINC02387 101929027 +LINC02388 101927653 +LINC02389 400046 +LINC02390 105369652 +LINC02391 101930023 +LINC02392 105369893 +LINC02393 400087 +LINC02394 105369841 +LINC02395 101927292 +LINC02396 283332 +LINC02397 100507616 +LINC02398 100506393 +LINC02399 105369891 +LINC02400 101927038 +LINC02401 101929084 +LINC02402 101927058 +LINC02403 105369785 +LINC02404 105369900 +LINC02405 101927592 +LINC02406 105369730 +LINC02408 100507175 +LINC02409 105369929 +LINC02410 105369920 +LINC02411 101927637 +LINC02412 102724933 +LINC02413 105369906 +LINC02414 105370085 +LINC02415 107161159 +LINC02416 107984528 +LINC02417 101930162 +LINC02418 100190940 +LINC02419 105370078 +LINC02420 102724433 +LINC02421 101927901 +LINC02422 105369723 +LINC02423 105370014 +LINC02424 105369860 +LINC02425 105369810 +LINC02426 101928449 +LINC02427 105377585 +LINC02428 101929448 +LINC02429 105377247 +LINC02430 107986319 +LINC02431 100506122 +LINC02432 100507639 +LINC02433 340017 +LINC02434 105377606 +LINC02435 107986311 +LINC02436 101928877 +LINC02437 107986333 +LINC02438 107986264 +LINC02439 105370016 +LINC02440 105370015 +LINC02441 105370070 +LINC02442 105369815 +LINC02443 101929584 +LINC02444 101928137 +LINC02445 105369840 +LINC02446 101060038 +LINC02447 730971 +LINC02448 105369792 +LINC02449 101927905 +LINC02450 105369739 +LINC02451 105369738 +LINC02452 105369924 +LINC02453 643770 +LINC02454 105369807 +LINC02455 105369597 +LINC02456 105369942 +LINC02457 107984439 +LINC02458 728084 +LINC02459 105369996 +LINC02460 105370013 +LINC02461 105369740 +LINC02462 105377434 +LINC02463 105370004 +LINC02464 105369854 +LINC02465 107986313 +LINC02466 101927282 +LINC02468 105369684 +LINC02469 105377301 +LINC02470 100506159 +LINC02471 105369734 +LINC02472 105374561 +LINC02473 107986266 +LINC02474 110806276 +LINC02475 100506827 +LINC02476 105375475 +LINC02477 105377512 +LINC02478 100505984 +LINC02479 105377420 +LINC02480 105377652 +LINC02481 339988 +LINC02482 105374366 +LINC02483 441025 +LINC02484 105374394 +LINC02485 105377439 +LINC02487 441178 +LINC02488 111082994 +LINC02489 101928919 +LINC02490 105370822 +LINC02491 105377467 +LINC02492 100506272 +LINC02493 101929123 +LINC02494 105377671 +LINC02496 105377248 +LINC02497 102723778 +LINC02498 102723525 +LINC02499 728040 +LINC02500 101928679 +LINC02501 105374565 +LINC02502 100996694 +LINC02503 105377349 +LINC02504 101928288 +LINC02505 105374400 +LINC02506 102723828 +LINC02507 105377477 +LINC02508 105377610 +LINC02509 105377556 +LINC02510 729307 +LINC02511 105377441 +LINC02512 107986241 +LINC02513 105374410 +LINC02514 105377602 +LINC02515 102723920 +LINC02516 101927087 +LINC02517 105374374 +LINC02518 105377957 +LINC02519 105378147 +LINC02520 100505530 +LINC02521 105374885 +LINC02522 101928106 +LINC02523 643623 +LINC02524 105378013 +LINC02525 100507194 +LINC02526 105377926 +LINC02527 105377946 +LINC02529 102724053 +LINC02530 101928309 +LINC02531 107986533 +LINC02532 100422737 +LINC02533 105374895 +LINC02534 105377962 +LINC02535 101928820 +LINC02536 105377997 +LINC02537 285857 +LINC02538 401286 +LINC02539 100507406 +LINC02540 105377860 +LINC02541 101927686 +LINC02542 102724168 +LINC02543 101928406 +LINC02544 101929504 +LINC02545 105376561 +LINC02546 105376606 +LINC02547 105376554 +LINC02548 105376562 +LINC02549 101928280 +LINC02550 105369490 +LINC02551 100507431 +LINC02552 102723895 +LINC02553 105369449 +LINC02554 100507657 +LINC02555 101930164 +LINC02556 102724679 +LINC02557 105372955 +LINC02558 105372999 +LINC02559 105372972 +LINC02560 110806301 +LINC02561 110806285 +LINC02562 105377283 +LINC02563 105827617 +LINC02564 102724130 +LINC02565 105372138 +LINC02566 123706510 +LINC02567 110806286 +LINC02568 102723344 +LINC02569 111082993 +LINC02570 105375014 +LINC02571 105375015 +LINC02572 105373615 +LINC02573 111216285 +LINC02574 111216282 +LINC02575 111216286 +LINC02576 102724233 +LINC02577 111216280 +LINC02578 111216287 +LINC02579 339807 +LINC02580 100506047 +LINC02582 100505817 +LINC02583 101805491 +LINC02584 100009613 +LINC02585 102724368 +LINC02587 101927524 +LINC02589 105373300 +LINC02591 388692 +LINC02593 100130417 +LINC02594 105371786 +LINC02595 401585 +LINC02596 105376834 +LINC02597 101929866 +LINC02598 112588022 +LINC02599 113523635 +LINC02600 107986251 +LINC02601 105373185 +LINC02602 107985257 +LINC02603 158257 +LINC02604 644794 +LINC02605 112935892 +LINC02606 100506022 +LINC02607 100996635 +LINC02608 101929541 +LINC02609 105378853 +LINC02610 151174 +LINC02611 101927070 +LINC02612 101929282 +LINC02613 101929596 +LINC02614 101927056 +LINC02615 100507487 +LINC02616 100508631 +LINC02617 113523642 +LINC02619 105377245 +LINC02620 101927523 +LINC02621 105378325 +LINC02622 105378349 +LINC02623 101929445 +LINC02624 105378470 +LINC02625 107984237 +LINC02626 102724589 +LINC02627 101927549 +LINC02628 105376490 +LINC02629 114515519 +LINC02630 105376495 +LINC02631 114515520 +LINC02632 107984178 +LINC02633 105378270 +LINC02634 105376493 +LINC02635 105376491 +LINC02636 102723350 +LINC02637 102724350 +LINC02639 105376365 +LINC02640 107984241 +LINC02641 105378531 +LINC02642 105376388 +LINC02643 105376444 +LINC02644 105376480 +LINC02645 105376351 +LINC02646 107984002 +LINC02647 101929646 +LINC02648 101928150 +LINC02649 399715 +LINC02650 105378397 +LINC02651 105378346 +LINC02652 105376468 +LINC02653 101926942 +LINC02654 102724039 +LINC02655 105378386 +LINC02656 399716 +LINC02658 102724264 +LINC02659 105378277 +LINC02660 101927904 +LINC02661 105378478 +LINC02662 105376348 +LINC02663 105376402 +LINC02664 101929352 +LINC02665 105376386 +LINC02666 107984280 +LINC02667 728327 +LINC02668 105376354 +LINC02669 101927880 +LINC02670 101928298 +LINC02671 101928887 +LINC02672 105378309 +LINC02673 101929180 +LINC02674 102724627 +LINC02675 112267862 +LINC02676 105755953 +LINC02677 102723629 +LINC02678 105376383 +LINC02679 105378385 +LINC02680 105376463 +LINC02681 101927419 +LINC02682 105376570 +LINC02683 101928132 +LINC02684 105369589 +LINC02685 221122 +LINC02686 105376594 +LINC02687 399886 +LINC02688 101927503 +LINC02689 105376513 +LINC02690 105376658 +LINC02691 145195 +LINC02692 101928638 +LINC02693 339263 +LINC02694 400359 +LINC02695 107984426 +LINC02696 101928812 +LINC02697 105369586 +LINC02698 105369512 +LINC02699 105376596 +LINC02700 105369436 +LINC02701 105369364 +LINC02702 101929011 +LINC02703 102724165 +LINC02704 105376647 +LINC02705 105369319 +LINC02706 105369584 +LINC02707 105376623 +LINC02708 100505570 +LINC02709 440028 +LINC02710 105376662 +LINC02711 105369423 +LINC02712 101929497 +LINC02713 105369454 +LINC02714 729305 +LINC02715 105369482 +LINC02716 374387 +LINC02717 105369588 +LINC02718 105376592 +LINC02719 105369473 +LINC02720 101928944 +LINC02721 105376620 +LINC02722 105376619 +LINC02723 107984366 +LINC02724 100996455 +LINC02725 105369563 +LINC02726 105376593 +LINC02727 105369541 +LINC02728 101928865 +LINC02729 102723330 +LINC02730 107984414 +LINC02731 100128239 +LINC02732 105369486 +LINC02733 100507521 +LINC02734 105369413 +LINC02735 101927120 +LINC02736 105369346 +LINC02737 105369443 +LINC02739 105369317 +LINC02740 100507205 +LINC02741 105376640 +LINC02742 105376603 +LINC02743 646522 +LINC02744 105369528 +LINC02745 101928591 +LINC02746 105369431 +LINC02747 105379407 +LINC02748 105369427 +LINC02749 100506082 +LINC02750 105369150 +LINC02751 105376569 +LINC02752 105376550 +LINC02753 101928443 +LINC02754 105369360 +LINC02755 105376605 +LINC02756 105369428 +LINC02757 101928813 +LINC02758 105376602 +LINC02759 103312105 +LINC02760 105376633 +LINC02761 107984359 +LINC02762 283140 +LINC02763 101928823 +LINC02764 387810 +LINC02765 105373110 +LINC02766 105376744 +LINC02767 105372883 +LINC02768 105373212 +LINC02769 105372891 +LINC02770 107985457 +LINC02771 105372907 +LINC02772 105371455 +LINC02773 102723761 +LINC02774 339529 +LINC02775 105372911 +LINC02777 105378753 +LINC02778 105378760 +LINC02779 105372929 +LINC02780 105376673 +LINC02781 105376680 +LINC02782 105376681 +LINC02783 400743 +LINC02784 105378734 +LINC02785 107985124 +LINC02786 105378655 +LINC02787 105378852 +LINC02788 105378855 +LINC02789 400800 +LINC02790 102723661 +LINC02791 105378786 +LINC02792 107983999 +LINC02793 105376879 +LINC02794 105379778 +LINC02795 105378824 +LINC02796 339468 +LINC02797 105378799 +LINC02798 107985194 +LINC02799 112268275 +LINC02800 284632 +LINC02801 101927844 +LINC02802 100996732 +LINC02803 107985228 +LINC02804 105371228 +LINC02805 100505824 +LINC02806 284561 +LINC02808 105378712 +LINC02809 100506571 +LINC02810 107984028 +LINC02811 107985740 +LINC02812 107984957 +LINC02813 107985338 +LINC02814 112267873 +LINC02815 105373158 +LINC02816 105371638 +LINC02817 400804 +LINC02818 107985229 +LINC02819 105371462 +LINC02820 105369876 +LINC02821 105369826 +LINC02822 102724834 +LINC02823 105369897 +LINC02824 105370060 +LINC02825 283435 +LINC02826 105370057 +LINC02827 105369606 +LINC02828 105374978 +LINC02829 105375009 +LINC02830 105375486 +LINC02831 102724373 +LINC02832 105373886 +LINC02833 105370629 +LINC02834 105376124 +LINC02835 105377256 +LINC02836 105377922 +LINC02837 101928144 +LINC02838 105375273 +LINC02839 105375929 +LINC02840 105378065 +LINC02841 105372360 +LINC02842 101929628 +LINC02843 286238 +LINC02844 105375679 +LINC02845 105375680 +LINC02846 105376323 +LINC02847 105375823 +LINC02848 107986806 +LINC02849 105375622 +LINC02850 101928271 +LINC02851 105375968 +LINC02852 105370985 +LINC02853 100507480 +LINC02854 107986739 +LINC02855 105375732 +LINC02856 112268216 +LINC02857 107986618 +LINC02858 105371113 +LINC02859 101928316 +LINC02860 285941 +LINC02861 102724927 +LINC02862 115409987 +LINC02863 102723741 +LINC02864 400655 +LINC02865 116435283 +LINC02866 105379386 +LINC02868 388667 +LINC02869 440714 +LINC02870 170393 +LINC02871 728434 +LINC02872 401535 +LINC02873 283171 +LINC02874 283403 +LINC02875 388407 +LINC02876 100506650 +LINC02877 152118 +LINC02878 286076 +LINC02880 285759 +LINC02881 100130539 +LINC02882 100507377 +LINC02883 101929679 +LINC02884 105378909 +LINC02885 101926957 +LINC02886 117134599 +LINC02887 105377826 +LINC02888 102659288 +LINC02889 101927630 +LINC02890 118568814 +LINC02891 284865 +LINC02893 440173 +LINC02894 100288748 +LINC02895 120017343 +LINC02896 105370876 +LINC02897 388759 +LINC02898 400950 +LINC02899 439936 +LINC02900 340073 +LINC02901 100130967 +LINC02902 401335 +LINC02903 154907 +LINC02905 606553 +LINC02906 389676 +LINC02907 157927 +LINC02908 401563 +LINC02909 196415 +LINC02910 284756 +LINC02911 388276 +LINC02912 641384 +LINC02913 414318 +LINC02914 283598 +LINC02915 400360 +LINC02916 124902415 +LINC02917 121832814 +LINC02918 105378688 +LINC02919 105378032 +LINC02920 121832815 +LINC02922 121832816 +LINC02923 105374323 +LINC02924 121853077 +LINC02925 122149302 +LINC02926 105372278 +LINC02927 122149304 +LINC02928 105377659 +LINC02929 122152367 +LINC02930 105378516 +LINC02931 122965335 +LINC02932 105375392 +LINC02933 122965334 +LINC02934 105369168 +LINC02935 107984158 +LINC02936 123464517 +LINC02937 100507103 +LINC02938 123464514 +LINC02939 642648 +LINC02940 102724740 +LINC02941 100507477 +LINC02942 124904497 +LINC02943 107985484 +LINC02944 101927760 +LINC02945 123464519 +LINC02946 285000 +LINC02947 105375822 +LINC02948 105379351 +LINC02949 124901880 +LINC02950 123466212 +LINC02951 123466204 +LINC02952 123466213 +LINC02953 102724265 +LINC02954 123466205 +LINC02955 107984516 +LINC02956 123466207 +LINC02957 105376144 +LINC02958 107985181 +LINC02959 123466209 +LINC02960 123466210 +LINC02961 100130249 +LINC02963 123706542 +LINC02964 105375746 +LINC02965 123497957 +LINC02966 101927400 +LINC02967 105372578 +LINC02968 105373105 +LINC02970 105372712 +LINC02971 123706537 +LINC02972 123706525 +LINC02973 123706551 +LINC02974 123706546 +LINC02975 101929331 +LINC02976 123706548 +LINC02977 105376220 +LINC02978 123706530 +LINC02979 123706539 +LINC02980 123706533 +LINC02981 441204 +LINC02982 100506688 +LINC02983 100129484 +LINC02984 100507516 +LINC02985 100506691 +LINC02986 123689089 +LINC02987 101927151 +LINC02988 105371433 +LINC02989 125177370 +LINC02990 107986984 +LINC02991 401040 +LINC02992 100499194 +LINC02993 105373656 +LINC02994 101928978 +LINC02995 285593 +LINC02996 101926960 +LINC02997 101928858 +LINC02998 102467080 +LINC02999 102546229 +LINC03000 105377703 +LINC03001 100506188 +LINC03002 101928304 +LINC03003 101929006 +LINC03004 102723649 +LINC03005 105374972 +LINC03006 441242 +LINC03007 646588 +LINC03008 100128325 +LINC03009 100133091 +LINC03010 100286906 +LINC03011 100289098 +LINC03012 100506682 +LINC03013 100506725 +LINC03014 100507642 +LINC03015 102723672 +LINC03016 101927354 +LINC03017 101927378 +LINC03018 286178 +LINC03019 340357 +LINC03020 101926892 +LINC03021 101927815 +LINC03022 101929191 +LINC03023 102467222 +LINC03024 105375773 +LINC03025 440896 +LINC03026 102724156 +LINC03027 100499489 +LINC03028 101929117 +LINC03029 105378292 +LINC03030 646029 +LINC03031 100506675 +LINC03032 105370361 +LINC03033 400221 +LINC03034 283710 +LINC03035 105372125 +LINC03036 121366085 +LINC03037 125177375 +LINC03039 105377137 +LINC03040 221416 +LINC03041 100129385 +LINC03042 389649 +LINC03043 154872 +LINC03044 105375674 +LINC03046 125775240 +LINC03047 107986898 +LINC03048 100130370 +LINC03049 126568845 +LINC03050 126568848 +LINC03051 127138867 +LINC03052 127138865 +LINC03053 124905179 +LINC03054 101929217 +LINC03055 105374902 +LINC03056 124902951 +LINC03057 127379715 +LINC03058 127379758 +LINC03059 127379717 +LINC03060 105375519 +LINC03061 127379752 +LINC03062 100129066 +LINC03063 105374464 +LINC03064 105371264 +LINC03065 105370833 +LINC03066 285766 +LINC03067 128071536 +LINC03068 105378568 +LINC03069 642484 +LINC03070 101928228 +LINC03071 105375904 +LINC03072 128071538 +LINC03073 128071541 +LINC03074 100505685 +LINC03075 101929088 +LINC03076 100996249 +LINC03077 128071542 +LINC03078 128193286 +LINC03079 128193294 +LINC03080 124903562 +LINC03081 128193288 +LINC03082 101927646 +LINC03083 128193295 +LINC03084 101927392 +LINC03085 128266841 +LINC03086 388780 +LINC03088 124903027 +LINC03089 128385371 +LINC03090 105375675 +LINC03091 101928237 +LINC03092 107985164 +LINC03093 101929172 +LINC03094 101928523 +LINC03095 100506289 +LINC03096 128667225 +LINC03097 128667230 +LINC03098 101928336 +LINC03099 101927476 +LINC03100 129810495 +LINC03101 129810497 +LINC03102 102724548 +LINC03103 100507527 +LINC03104 102724219 +LINC03105 102724951 +LINC03106 100506422 +LINC03107 124903648 +LINC03108 130512932 +LINC03109 105374166 +LINC03110 102724745 +LINC03111 130572099 +LINC03112 101928092 +LINC03113 107985715 +LINC03114 105373125 +LINCADL 107986443 +LINCMD1 101154644 +LINGO1 84894 +LINGO1-AS1 253044 +LINGO1-AS2 101929478 +LINGO2 158038 +LINGO3 645191 +LINGO4 339398 +LINP1 108570035 +LINS1 55180 +LIPA 3988 +LIPB 3989 +LIPC 3990 +LIPC-AS1 101928694 +LIPE 3991 +LIPE-AS1 100996307 +LIPF 8513 +LIPG 9388 +LIPH 200879 +LIPI 149998 +LIPJ 142910 +LIPK 643414 +LIPM 340654 +LIPN 643418 +LIPT1 51601 +LIPT1P1 100131188 +LIPT2 387787 +LIPT2-AS1 100287896 +LITAF 9516 +LITAFD 101929989 +LITATS1 728431 +LIVAR 102724895 +LIX1 167410 +LIX1-AS1 101926893 +LIX1L 128077 +LIX1L-AS1 105371260 +LKAAEAR1 198437 +LLCFC1 135927 +LLGL1 3996 +LLGL2 3993 +LLPH 84298 +LLPH-DT 103625681 +LLPHP1 106480685 +LLPHP2 106480300 +LLPHP3 646644 +LMAN1 3998 +LMAN1L 79748 +LMAN2 10960 +LMAN2L 81562 +LMBR1 64327 +LMBR1L 55716 +LMBRD1 55788 +LMBRD2 92255 +LMCD1 29995 +LMCD1-AS1 100288428 +LMF1 64788 +LMF1-AS1 101929387 +LMF2 91289 +LMLN 89782 +LMLN-AS1 100873947 +LMNA 4000 +LMNB1 4001 +LMNB1-DT 102723557 +LMNB2 84823 +LMNTD1 160492 +LMNTD2 256329 +LMNTD2-AS1 692247 +LMO1 4004 +LMO2 4005 +LMO3 55885 +LMO4 8543 +LMO7 4008 +LMO7-AS1 101927155 +LMO7DN 729420 +LMO7DN-IT1 104326189 +LMOD1 25802 +LMOD2 442721 +LMOD3 56203 +LMTK2 22853 +LMTK3 114783 +LMX1A 4009 +LMX1A-AS1 102725140 +LMX1A-AS2 105371561 +LMX1B 4010 +LMX1B-DT 105376277 +LNC-LBCS 100506885 +LNC-RHL1 124902762 +LNCAROD 101928687 +LNCARSR 102723932 +LNCATV 101927851 +LNCBRM 100996645 +LNCDAT 116804915 +LNCHR1 125775239 +LNCNEF 101929685 +LNCOC1 100288181 +LNCOG 105369848 +LNCPOIR 105377959 +LNCPRESS1 101927721 +LNCPRESS2 101929194 +LNCRI 401296 +LNCRNA-ATB 114004396 +LNCRNA-IUR 101929295 +LNCSRLR 109729161 +LNCTAM34A 102724571 +LNCTSI 128193292 +LNMICC 123706532 +LNP1 348801 +LNPEP 4012 +LNPK 80856 +LNPPS 128385374 +LNROP 100505622 +LNX1 84708 +LNX1-AS1 100873939 +LNX1-AS2 100873955 +LNX2 222484 +LNX2BP +LOH1CR1 8377 +LOH12CR2 503693 +LOHAN2 100506172 +LOLI1 +LONP1 9361 +LONP2 83752 +LONRF1 91694 +LONRF2 164832 +LONRF2P1 100421827 +LONRF2P2 100421799 +LONRF2P3 100421809 +LONRF2P4 100421810 +LONRF2P5 115830330 +LONRF3 79836 +LORICRIN 4014 +LOX 4015 +LOXHD1 125336 +LOXL1 4016 +LOXL1-AS1 100287616 +LOXL2 4017 +LOXL2-AS1 100507156 +LOXL3 84695 +LOXL4 84171 +LPA 4018 +LPAL1 4019 +LPAL2 80350 +LPAR1 1902 +LPAR2 9170 +LPAR3 23566 +LPAR4 2846 +LPAR5 57121 +LPAR6 10161 +LPCAT1 79888 +LPCAT2 54947 +LPCAT2BP 100128094 +LPCAT3 10162 +LPCAT4 254531 +LPGAT1 9926 +LPGAT1-AS1 102723727 +LPGAT1P1 100129398 +LPIN1 23175 +LPIN2 9663 +LPIN3 64900 +LPL 4023 +LPO 4025 +LPP 4026 +LPP-AS1 100873917 +LPP-AS2 339929 +LPXN 9404 +LRAT 9227 +LRATD1 151354 +LRATD2 157638 +LRBA 987 +LRCH1 23143 +LRCH2 57631 +LRCH3 84859 +LRCH4 4034 +LRCOL1 100507055 +LRFN1 57622 +LRFN2 57497 +LRFN3 79414 +LRFN4 78999 +LRFN5 145581 +LRFN5-DT 105370469 +LRG1 116844 +LRGUK 136332 +LRIF1 55791 +LRIG1 26018 +LRIG2 9860 +LRIG2-DT 100996251 +LRIG3 121227 +LRIG3-DT 105369791 +LRIT1 26103 +LRIT2 340745 +LRIT3 345193 +LRMDA 83938 +LRP1 4035 +LRP1-AS 105751187 +LRP1B 53353 +LRP2 4036 +LRP2BP 55805 +LRP2BP-AS1 107986206 +LRP3 4037 +LRP4 4038 +LRP4-AS1 100507401 +LRP5 4041 +LRP5L 91355 +LRP6 4040 +LRP8 7804 +LRP8-DT 105378732 +LRP10 26020 +LRP11 84918 +LRP12 29967 +LRPAP1 4043 +LRPPRC 10128 +LRR1 122769 +LRRC1 55227 +LRRC2 79442 +LRRC2-AS1 83598 +LRRC2P1 644158 +LRRC3 81543 +LRRC3-DT 100861510 +LRRC3B 116135 +LRRC3B-AS1 105377003 +LRRC3C 100505591 +LRRC4 64101 +LRRC4B 94030 +LRRC4C 57689 +LRRC7 57554 +LRRC7-AS1 105378792 +LRRC8A 56262 +LRRC8B 23507 +LRRC8C 84230 +LRRC8C-DT 400761 +LRRC8D 55144 +LRRC8D-DT 118568809 +LRRC8E 80131 +LRRC9 341883 +LRRC10 376132 +LRRC10B 390205 +LRRC14 9684 +LRRC14B 389257 +LRRC15 131578 +LRRC17 10234 +LRRC18 474354 +LRRC19 64922 +LRRC20 55222 +LRRC23 10233 +LRRC24 441381 +LRRC25 126364 +LRRC26 389816 +LRRC27 80313 +LRRC28 123355 +LRRC30 339291 +LRRC31 79782 +LRRC32 2615 +LRRC34 151827 +LRRC34P1 100288378 +LRRC34P2 100420613 +LRRC36 55282 +LRRC37A 9884 +LRRC37A2 474170 +LRRC37A3 374819 +LRRC37A4P 55073 +LRRC37A5P 652972 +LRRC37A6P 387646 +LRRC37A7P 100421589 +LRRC37A8P 100533789 +LRRC37A9P 100533790 +LRRC37A10P 100533791 +LRRC37A11P 342666 +LRRC37A12P 101929254 +LRRC37A13P 106479024 +LRRC37A14P 106479025 +LRRC37A15P 106481796 +LRRC37A16P 651250 +LRRC37A17P 644397 +LRRC37B 114659 +LRRC37BP1 147172 +LRRC38 126755 +LRRC39 127495 +LRRC40 55631 +LRRC41 10489 +LRRC42 115353 +LRRC43 254050 +LRRC45 201255 +LRRC46 90506 +LRRC47 57470 +LRRC49 54839 +LRRC51 120356739 +LRRC52 440699 +LRRC52-AS1 400794 +LRRC53 105378803 +LRRC55 219527 +LRRC56 115399 +LRRC57 255252 +LRRC57P1 100420575 +LRRC58 116064 +LRRC59 55379 +LRRC61 65999 +LRRC63 220416 +LRRC66 339977 +LRRC69 100130742 +LRRC70 100130733 +LRRC71 149499 +LRRC72 100506049 +LRRC73 221424 +LRRC74A 145497 +LRRC74B 400891 +LRRC75A 388341 +LRRC75B 388886 +LRRC77P 646168 +LRRC78P 646730 +LRRCC1 85444 +LRRD1 401387 +LRRFIP1 9208 +LRRFIP1P1 101290506 +LRRFIP2 9209 +LRRFIP2P1 100128738 +LRRIQ1 84125 +LRRIQ3 127255 +LRRIQ4 344657 +LRRK1 79705 +LRRK2 120892 +LRRK2-DT 107984474 +LRRN1 57633 +LRRN2 10446 +LRRN3 54674 +LRRN4 164312 +LRRN4CL 221091 +LRRTM1 347730 +LRRTM2 26045 +LRRTM3 347731 +LRRTM4 80059 +LRRTM4-AS1 101927907 +LRSAM1 90678 +LRTM1 57408 +LRTM2 654429 +LRTOMT 220074 +LRWD1 222229 +LSAMP 4045 +LSAMP-AS1 101926903 +LSG1 55341 +LSINCT5 101234261 +LSM1 27257 +LSM1P1 100820732 +LSM1P2 106480288 +LSM2 57819 +LSM3 27258 +LSM3P1 100303748 +LSM3P2 100303745 +LSM3P3 647302 +LSM3P4 100130178 +LSM3P5 100303743 +LSM4 25804 +LSM5 23658 +LSM6 11157 +LSM6P1 100129011 +LSM6P2 100462857 +LSM7 51690 +LSM8 51691 +LSM10 84967 +LSM11 134353 +LSM12 124801 +LSM12P1 653122 +LSM14A 26065 +LSM14B 149986 +LSMEM1 286006 +LSMEM2 132228 +LSP1 4046 +LSP1P1 100463528 +LSP1P2 100873967 +LSP1P3 729862 +LSP1P4 654342 +LSP1P5 645166 +LSR 51599 +LSS 4047 +LST1 7940 +LTA 4049 +LTA4H 4048 +LTB 4050 +LTB4R 1241 +LTB4R2 56413 +LTBP1 4052 +LTBP2 4053 +LTBP3 4054 +LTBP4 8425 +LTBR 4055 +LTC4S 4056 +LTF 4057 +LTK 4058 +LTN1 26046 +LTO1 220064 +LTO1P1 100873907 +LTV1 84946 +LTV1P1 100289220 +LUADT1 106182249 +LUARIS 100506895 +LUC7L 55692 +LUC7L2 51631 +LUC7L3 51747 +LUC7L3P1 100420198 +LUCAT1 100505994 +LUM 4060 +LUNAR1 104564224 +LURAP1 541468 +LURAP1L 286343 +LURAP1L-AS1 101929467 +LUZP1 7798 +LUZP2 338645 +LUZP4 51213 +LUZP4P1 101060111 +LUZP6 767558 +LVRN 206338 +LXN 56925 +LY6D 8581 +LY6E 4061 +LY6E-DT 100133669 +LY6G5B 58496 +LY6G5C 80741 +LY6G6C 80740 +LY6G6D 58530 +LY6G6E 79136 +LY6G6F 259215 +LY6G6F-LY6G6D 110599563 +LY6H 4062 +LY6K 54742 +LY6L 101928108 +LY6S 105375795 +LY6S-AS1 286122 +LY9 4063 +LY75 4065 +LY75-CD302 100526664 +LY86 9450 +LY86-AS1 285780 +LY96 23643 +LYAR 55646 +LYARP1 100420968 +LYG1 129530 +LYG2 254773 +LYL1 4066 +LYN 4067 +LYNX1 66004 +LYNX1-SLURP2 111188157 +LYPD1 116372 +LYPD2 137797 +LYPD3 27076 +LYPD4 147719 +LYPD5 284348 +LYPD6 130574 +LYPD6B 130576 +LYPD8 646627 +LYPD9P 101928226 +LYPLA1 10434 +LYPLA1P1 100129401 +LYPLA1P2 391686 +LYPLA1P3 157713 +LYPLA2 11313 +LYPLA2P1 653639 +LYPLA2P2 388499 +LYPLA2P3 100128790 +LYPLAL1 127018 +LYPLAL1-AS1 102723886 +LYPLAL1-DT 643723 +LYRM1 57149 +LYRM2 57226 +LYRM4 57128 +LYRM4-AS1 100129461 +LYRM7 90624 +LYRM9 201229 +LYSET 26175 +LYSETP1 100420909 +LYSMD1 388695 +LYSMD2 256586 +LYSMD3 116068 +LYSMD4 145748 +LYST 1130 +LYST-AS1 100874266 +LYVE1 10894 +LYZ 4069 +LYZL1 84569 +LYZL2 119180 +LYZL4 131375 +LYZL6 57151 +LZIC 84328 +LZTFL1 54585 +LZTR1 8216 +LZTS1 11178 +LZTS1-AS1 100874051 +LZTS2 84445 +LZTS3 9762 +M1AP 130951 +M6PR 4074 +M6PRP1 100131200 +MAB21L1 4081 +MAB21L2 10586 +MAB21L3 126868 +MAB21L4 79919 +MACC1 346389 +MACC1-AS1 100874041 +MACF1 23499 +MACIR 90355 +MACO1 55219 +MACORIS 101929951 +MACROD1 28992 +MACROD2 140733 +MACROD2-AS1 100379174 +MACROD2-IT1 140848 +MACROH2A1 9555 +MACROH2A2 55506 +MAD1L1 8379 +MAD2L1 4085 +MAD2L1-DT 121009649 +MAD2L1BP 9587 +MAD2L1P1 326596 +MAD2L2 10459 +MADCAM1 8174 +MADCAM1-AS1 105372232 +MADD 8567 +MADD-AS1 101928943 +MAEA 10296 +MAEL 84944 +MAF 4094 +MAF1 84232 +MAF1P1 391578 +MAFA 389692 +MAFA-AS1 104326051 +MAFB 9935 +MAFF 23764 +MAFG 4097 +MAFG-AS1 128385369 +MAFIP 727764 +MAFK 7975 +MAFTRR 102467146 +MAG 4099 +MAGEA1 4100 +MAGEA2 4101 +MAGEA2B 266740 +MAGEA3 4102 +MAGEA3-DT 105373370 +MAGEA4 4103 +MAGEA4-AS1 105373368 +MAGEA5P 4104 +MAGEA6 4105 +MAGEA6-DT 107985638 +MAGEA7P 4106 +MAGEA8 4107 +MAGEA8-AS1 101410537 +MAGEA9 4108 +MAGEA9B 728269 +MAGEA10 4109 +MAGEA11 4110 +MAGEA12 4111 +MAGEA13P 139363 +MAGEB1 4112 +MAGEB2 4113 +MAGEB3 4114 +MAGEB4 4115 +MAGEB5 347541 +MAGEB6 158809 +MAGEB6B 392433 +MAGEB10 139422 +MAGEB16 139604 +MAGEB17 645864 +MAGEB17-AS1 128966703 +MAGEB18 286514 +MAGEC1 9947 +MAGEC2 51438 +MAGEC3 139081 +MAGED1 9500 +MAGED2 10916 +MAGED4 728239 +MAGED4B 81557 +MAGEE1 57692 +MAGEE2 139599 +MAGEF1 64110 +MAGEH1 28986 +MAGEL2 54551 +MAGI1 9223 +MAGI1-AS1 100873983 +MAGI1-IT1 151877 +MAGI2 9863 +MAGI2-AS1 100874020 +MAGI2-AS2 100874021 +MAGI2-AS3 100505881 +MAGI3 260425 +MAGIX 79917 +MAGOH 4116 +MAGOH-DT 100507564 +MAGOH2P 100506898 +MAGOH3P 90352 +MAGOHB 55110 +MAGT1 84061 +MAILR 100506753 +MAIP1 79568 +MAJIN 283129 +MAK 4117 +MAK16 84549 +MAL 4118 +MAL2 114569 +MAL2-AS1 105375726 +MALAT1 378938 +MALINC1 100505636 +MALL 7851 +MALLP1 117981794 +MALLP2 105374855 +MALRD1 340895 +MALSU1 115416 +MALT1 10892 +MALT1-AS1 101927322 +MAMDC2 256691 +MAMDC2-AS1 100507244 +MAMDC4 158056 +MAML1 9794 +MAML2 84441 +MAML3 55534 +MAMLD1 10046 +MAMSTR 284358 +MAN1A1 4121 +MAN1A2 10905 +MAN1A2P1 100129507 +MAN1B1 11253 +MAN1B1-DT 100289341 +MAN1C1 57134 +MAN2A1 4124 +MAN2A1-DT 124901041 +MAN2A2 4122 +MAN2B1 4125 +MAN2B2 23324 +MAN2C1 4123 +MANBA 4126 +MANBAL 63905 +MANCR 100216001 +MANEA 79694 +MANEA-DT 101927288 +MANEAL 149175 +MANEALP1 391448 +MANF 7873 +MANSC1 54682 +MANSC4 100287284 +MAOA 4128 +MAOB 4129 +MAP1A 4130 +MAP1B 4131 +MAP1LC3A 84557 +MAP1LC3B 81631 +MAP1LC3B2 643246 +MAP1LC3BP1 392288 +MAP1LC3C 440738 +MAP1LC3P 387615 +MAP1S 55201 +MAP2 4133 +MAP2K1 5604 +MAP2K1P1 29778 +MAP2K2 5605 +MAP2K3 5606 +MAP2K4 6416 +MAP2K4P1 139201 +MAP2K5 5607 +MAP2K5-DT 118732298 +MAP2K6 5608 +MAP2K7 5609 +MAP3K1 4214 +MAP3K2 10746 +MAP3K2-DT 100506922 +MAP3K3 4215 +MAP3K4 4216 +MAP3K4-AS1 117981787 +MAP3K5 4217 +MAP3K5-AS1 101928461 +MAP3K5-AS2 101928429 +MAP3K6 9064 +MAP3K7 6885 +MAP3K7CL 56911 +MAP3K8 1326 +MAP3K9 4293 +MAP3K9-DT 100506411 +MAP3K10 4294 +MAP3K11 4296 +MAP3K12 7786 +MAP3K13 9175 +MAP3K14 9020 +MAP3K14-AS1 100133991 +MAP3K15 389840 +MAP3K19 80122 +MAP3K20 51776 +MAP3K20-AS1 339751 +MAP3K21 84451 +MAP4 4134 +MAP4K1 11184 +MAP4K1-AS1 105372397 +MAP4K2 5871 +MAP4K3 8491 +MAP4K3-DT 728730 +MAP4K4 9448 +MAP4K5 11183 +MAP6 4135 +MAP6D1 79929 +MAP7 9053 +MAP7-AS1 123706512 +MAP7D1 55700 +MAP7D2 256714 +MAP7D3 79649 +MAP9 79884 +MAP9-AS1 102724776 +MAP10 54627 +MAPK1 5594 +MAPK1IP1L 93487 +MAPK3 5595 +MAPK4 5596 +MAPK6 5597 +MAPK6-DT 112543478 +MAPK6P1 317686 +MAPK6P2 254664 +MAPK6P3 317684 +MAPK6P4 286065 +MAPK6P5 286156 +MAPK6P6 282967 +MAPK7 5598 +MAPK8 5599 +MAPK8IP1 9479 +MAPK8IP1P1 644253 +MAPK8IP1P2 644172 +MAPK8IP2 23542 +MAPK8IP3 23162 +MAPK8IP3-AS1 101929480 +MAPK9 5601 +MAPK10 5602 +MAPK10-AS1 101929064 +MAPK11 5600 +MAPK12 6300 +MAPK13 5603 +MAPK14 1432 +MAPK15 225689 +MAPKAP1 79109 +MAPKAPK2 9261 +MAPKAPK3 7867 +MAPKAPK5 8550 +MAPKAPK5-AS1 51275 +MAPKAPK5P1 100533849 +MAPKBP1 23005 +MAPRE1 22919 +MAPRE1P1 80327 +MAPRE1P2 642305 +MAPRE1P3 100422229 +MAPRE2 10982 +MAPRE3 22924 +MAPRE3-AS1 100129724 +MAPT 4137 +MAPT-AS1 100128977 +MAPT-IT1 100130148 +MARCHF1 55016 +MARCHF2 51257 +MARCHF3 115123 +MARCHF4 57574 +MARCHF5 54708 +MARCHF6 10299 +MARCHF6-DT 101929977 +MARCHF7 64844 +MARCHF8 220972 +MARCHF9 92979 +MARCHF10 162333 +MARCHF10-DT 101927877 +MARCHF11 441061 +MARCHF11-AS1 107986407 +MARCHF11-DT 401176 +MARCKS 4082 +MARCKSL1 65108 +MARCKSL1P1 100913183 +MARCKSL1P2 100913182 +MARCKSP1 4083 +MARCO 8685 +MARCOL 105378220 +MARF1 9665 +MARK1 4139 +MARK2 2011 +MARK2P1 100421501 +MARK2P2 100421502 +MARK2P3 100421507 +MARK2P4 100421496 +MARK2P5 100421485 +MARK2P6 100421500 +MARK2P7 100421531 +MARK2P8 100421498 +MARK2P9 100507674 +MARK2P10 402679 +MARK2P11 100421484 +MARK2P12 100421565 +MARK2P13 100631260 +MARK2P14 100631261 +MARK2P15 100533794 +MARK2P16 100533795 +MARK2P17 100421499 +MARK2P18 100421511 +MARK2P19 100421508 +MARK2P20 100533755 +MARK3 4140 +MARK3P1 100421550 +MARK3P2 100421503 +MARK3P3 100533754 +MARK4 57787 +MARS1 4141 +MARS2 92935 +MARVELD1 83742 +MARVELD2 153562 +MARVELD3 91862 +MAS1 4142 +MAS1L 116511 +MAS1LP1 646366 +MASP1 5648 +MASP2 10747 +MAST1 22983 +MAST2 23139 +MAST3 23031 +MAST3-AS1 118827815 +MAST4 375449 +MAST4-AS1 101928794 +MAST4-IT1 100874310 +MASTL 84930 +MAT1A 4143 +MAT2A 4144 +MAT2AP1 100653395 +MAT2B 27430 +MATCAP1 653319 +MATCAP2 23366 +MATK 4145 +MATN1 4146 +MATN1-AS1 100129196 +MATN2 4147 +MATN3 4148 +MATN4 8785 +MATR3 9782 +MATR3P1 100499496 +MATR3P2 127482542 +MATR3P3 100499497 +MAU2 23383 +MAVS 57506 +MAX 4149 +MAZ 4150 +MB 4151 +MB21D2 151963 +MBD1 4152 +MBD2 8932 +MBD3 53615 +MBD3L1 85509 +MBD3L2 125997 +MBD3L2B 729458 +MBD3L3 653657 +MBD3L4 653656 +MBD3L5 284428 +MBD4 8930 +MBD5 55777 +MBD6 114785 +MBIP 51562 +MBL1P 8512 +MBL2 4153 +MBL3P 50639 +MBLAC1 255374 +MBLAC2 153364 +MBNL1 4154 +MBNL1-AS1 401093 +MBNL2 10150 +MBNL3 55796 +MBOAT1 154141 +MBOAT2 129642 +MBOAT4 619373 +MBOAT7 79143 +MBP 4155 +MBTD1 54799 +MBTPS1 8720 +MBTPS1-DT 119863866 +MBTPS2 51360 +MC1R 4157 +MC2R 4158 +MC3R 4159 +MC4R 4160 +MC5R 4161 +MCAM 4162 +MCAT 27349 +MCC 4163 +MCCC1 56922 +MCCC1-AS1 106480736 +MCCC2 64087 +MCCD1 401250 +MCCD1P1 100048903 +MCCD1P2 100048924 +MCEE 84693 +MCEMP1 199675 +MCF2 4168 +MCF2L 23263 +MCF2L-AS1 100289410 +MCF2L2 23101 +MCF2L2P1 127525790 +MCFD2 90411 +MCFD2P1 645927 +MCHR1 2847 +MCHR2 84539 +MCHR2-AS1 728012 +MCIDAS 345643 +MCL1 4170 +MCM2 4171 +MCM3 4172 +MCM3AP 8888 +MCM3AP-AS1 114044 +MCM4 4173 +MCM5 4174 +MCM6 4175 +MCM7 4176 +MCM8 84515 +MCM8-AS1 101929225 +MCM9 254394 +MCM10 55388 +MCMBP 79892 +MCMDC2 157777 +MCOLN1 57192 +MCOLN2 255231 +MCOLN3 55283 +MCPH1 79648 +MCPH1-AS1 100507530 +MCPH1-DT 100287015 +MCRIP1 348262 +MCRIP2 84331 +MCRIP2P1 102388891 +MCRIP2P2 106480278 +MCRS1 10445 +MCTP1 79772 +MCTP1-AS1 113523641 +MCTP2 55784 +MCTS1 28985 +MCTS2 100101490 +MCU 90550 +MCUB 55013 +MCUR1 63933 +MCUR1P1 53383 +MCUR1P2 100420620 +MDC1 9656 +MDC1-AS1 106478956 +MDFI 4188 +MDFIC 29969 +MDFIC2 107986096 +MDGA1 266727 +MDGA2 161357 +MDH1 4190 +MDH1B 130752 +MDH1P1 392477 +MDH1P2 644906 +MDH2 4191 +MDK 4192 +MDM1 56890 +MDM2 4193 +MDM4 4194 +MDM4P1 100533712 +MDN1 23195 +MDN1-AS1 101929057 +MDP1 145553 +MDS2 259283 +ME1 4199 +ME2 4200 +ME2P1 286239 +ME3 10873 +ME3-DT 107984427 +MEA1 4201 +MEAF6 64769 +MEAF6P1 100874045 +MEAK7 57707 +MECOM 2122 +MECOM-AS1 105374205 +MECP2 4204 +MECR 51102 +MED1 5469 +MED4 29079 +MED4-AS1 100873965 +MED6 10001 +MED6P1 100128990 +MED7 9443 +MED8 112950 +MED8-AS1 107984947 +MED9 55090 +MED10 84246 +MED11 400569 +MED12 9968 +MED12L 116931 +MED13 9969 +MED13L 23389 +MED13P1 100499481 +MED14 9282 +MED14OS 100873985 +MED14P1 359791 +MED15 51586 +MED15P1 326615 +MED15P3 106481657 +MED15P4 100127989 +MED15P5 391436 +MED15P6 100996438 +MED15P7 100996466 +MED15P8 106480229 +MED15P9 285103 +MED16 10025 +MED17 9440 +MED18 54797 +MED19 219541 +MED20 9477 +MED21 9412 +MED22 6837 +MED23 9439 +MED24 9862 +MED25 81857 +MED26 9441 +MED27 9442 +MED28 80306 +MED28-DT 121232375 +MED28P1 100420207 +MED28P2 106480445 +MED28P3 100131051 +MED28P4 100130359 +MED28P5 106479053 +MED28P6 106480808 +MED28P7 729327 +MED28P8 101060144 +MED29 55588 +MED30 90390 +MED31 51003 +MEDAG 84935 +MEF2A 4205 +MEF2AP1 4206 +MEF2B 100271849 +MEF2C 4208 +MEF2C-AS1 101929423 +MEF2C-AS2 109729137 +MEF2D 4209 +MEFV 4210 +MEG3 55384 +MEG8 79104 +MEG9 100507257 +MEGF6 1953 +MEGF8 1954 +MEGF9 1955 +MEGF10 84466 +MEGF11 84465 +MEI1 150365 +MEI4 101928601 +MEIG1 644890 +MEIKIN 728637 +MEIOB 254528 +MEIOC 284071 +MEIOSIN 388553 +MEIS1 4211 +MEIS1-AS2 100873998 +MEIS1-AS3 730198 +MEIS2 4212 +MEIS3 56917 +MEIS3P1 4213 +MEIS3P2 257468 +MELK 9833 +MELTF 4241 +MELTF-AS1 100507057 +MEMO1 51072 +MEMO1P1 728556 +MEMO1P2 645175 +MEMO1P3 100462782 +MEMO1P4 100462785 +MEMO1P5 106481668 +MEMO1P6 100420144 +MEN1 4221 +MEOX1 4222 +MEOX2 4223 +MEP1A 4224 +MEP1AP1 642840 +MEP1AP2 644777 +MEP1AP3 389747 +MEP1AP4 643157 +MEP1B 4225 +MEPCE 56257 +MEPE 56955 +MERTK 10461 +MESD 23184 +MESDP1 100128248 +MESP1 55897 +MESP2 145873 +MEST 4232 +MESTIT1 317751 +MESTP1 338470 +MESTP2 100421572 +MESTP3 645641 +MESTP4 131572 +MET 4233 +METAP1 23173 +METAP1D 254042 +METAP2 10988 +METAP2P1 727713 +METRN 79006 +METRNL 284207 +METTL1 4234 +METTL1P1 441487 +METTL2A 339175 +METTL2B 55798 +METTL3 56339 +METTL4 64863 +METTL5 29081 +METTL5P1 100131950 +METTL5P2 100419878 +METTL5P3 100128865 +METTL5P4 127379692 +METTL6 131965 +METTL8 79828 +METTL8P1 728996 +METTL9 51108 +METTL13 51603 +METTL14 57721 +METTL14-DT 101929741 +METTL15 196074 +METTL15P1 100130758 +METTL15P2 644915 +METTL15P3 729650 +METTL16 79066 +METTL17 64745 +METTL18 92342 +METTL21A 151194 +METTL21AP1 100421629 +METTL21C 196541 +METTL21EP 121952 +METTL22 79091 +METTL23 124512 +METTL24 728464 +METTL25 84190 +METTL25B 51093 +METTL26 84326 +METTL27 155368 +MEX3A 92312 +MEX3B 84206 +MEX3C 51320 +MEX3D 399664 +MFAP1 4236 +MFAP1P1 646755 +MFAP2 4237 +MFAP3 4238 +MFAP3L 9848 +MFAP4 4239 +MFAP5 8076 +MFF 56947 +MFF-DT 654841 +MFFP1 100420251 +MFFP2 644762 +MFFP3 392452 +MFGE8 4240 +MFHAS1 9258 +MFN1 55669 +MFN1P1 441511 +MFN2 9927 +MFNG 4242 +MFRP 83552 +MFSD1 64747 +MFSD1P1 100313532 +MFSD2A 84879 +MFSD2B 388931 +MFSD3 113655 +MFSD4A 148808 +MFSD4A-AS1 284578 +MFSD4B 91749 +MFSD4B-DT 107986521 +MFSD4BP1 100128154 +MFSD5 84975 +MFSD6 54842 +MFSD6L 162387 +MFSD8 256471 +MFSD9 84804 +MFSD10 10227 +MFSD11 79157 +MFSD12 126321 +MFSD12-AS1 128385373 +MFSD13A 79847 +MFSD13B 105371130 +MFSD14A 64645 +MFSD14B 84641 +MFSD14CP 84278 +MGA 23269 +MGAM 8972 +MGAM2 93432 +MGARP 84709 +MGAT1 4245 +MGAT2 4247 +MGAT2P1 100422588 +MGAT2P2 100422589 +MGAT3 4248 +MGAT3-AS1 104502417 +MGAT4A 11320 +MGAT4B 11282 +MGAT4C 25834 +MGAT4D 152586 +MGAT4EP 641515 +MGAT4FP 100506747 +MGAT5 4249 +MGAT5B 146664 +MGLL 11343 +MGME1 92667 +MGMT 4255 +MGP 4256 +MGRN1 23295 +MGST1 4257 +MGST2 4258 +MGST3 4259 +MHENCR 100505771 +MHRT 104564225 +MIA 8190 +MIA-RAB4B 100529262 +MIA2 4253 +MIA2-AS1 100288846 +MIA3 375056 +MIAT 440823 +MIATNB 102724827 +MIB1 57534 +MIB2 142678 +MICA 100507436 +MICA-AS1 101929072 +MICAL1 64780 +MICAL2 9645 +MICAL3 57553 +MICALL1 85377 +MICALL2 79778 +MICALL2-DT 107986756 +MICB 4277 +MICB-DT 102725068 +MICC 100129192 +MICD 4279 +MICE 4280 +MICF 352957 +MICG 352967 +MICOS10 440574 +MICOS10-DT 105378614 +MICOS10-NBL1 100532736 +MICOS10P1 100462953 +MICOS10P2 100289489 +MICOS10P3 100462954 +MICOS10P4 100462957 +MICOS13 125988 +MICU1 10367 +MICU2 221154 +MICU3 286097 +MID1 4281 +MID1IP1 58526 +MID1IP1-AS1 100874211 +MID2 11043 +MIDEAS 91748 +MIDEAS-AS1 100506476 +MIDN 90007 +MIEF1 54471 +MIEF2 125170 +MIEN1 84299 +MIER1 57708 +MIER2 54531 +MIER3 166968 +MIF 4282 +MIF-AS1 284889 +MIF4GD 57409 +MIF4GD-DT 100287042 +MIGA1 374986 +MIGA2 84895 +MIIP 60672 +MILIP 92659 +MILR1 284021 +MIMT1 100073347 +MINAR1 23251 +MINAR2 100127206 +MINCR 100507316 +MINDY1 55793 +MINDY2 54629 +MINDY2-DT 101928725 +MINDY3 80013 +MINDY4 84182 +MINDY4B 646951 +MINK1 50488 +MINPP1 9562 +MIOS 54468 +MIOS-DT 101927391 +MIOX 55586 +MIOXP1 100419614 +MIP 4284 +MIPEP 4285 +MIPEPP1 100533682 +MIPEPP2 100130099 +MIPEPP3 650794 +MIPOL1 145282 +MIR1-1 406904 +MIR1-1HG 128826 +MIR1-2 406905 +MIR7-1 407043 +MIR7-2 407044 +MIR7-3 407045 +MIR7-3HG 284424 +MIR9-1 407046 +MIR9-1HG 10485 +MIR9-2 407047 +MIR9-3 407051 +MIR9-3HG 254559 +MIR10A 406902 +MIR10B 406903 +MIR15A 406948 +MIR15B 406949 +MIR16-1 406950 +MIR16-2 406951 +MIR17 406952 +MIR17HG 407975 +MIR18A 406953 +MIR18B 574033 +MIR19A 406979 +MIR19B1 406980 +MIR19B2 406981 +MIR20A 406982 +MIR20B 574032 +MIR21 406991 +MIR22 407004 +MIR22HG 84981 +MIR23A 407010 +MIR23AHG 284454 +MIR23B 407011 +MIR23C 100500809 +MIR24-1 407012 +MIR24-2 407013 +MIR25 407014 +MIR26A1 407015 +MIR26A2 407016 +MIR26B 407017 +MIR27A 407018 +MIR27B 407019 +MIR28 407020 +MIR29A 407021 +MIR29B1 407024 +MIR29B2 407025 +MIR29B2CHG 100128537 +MIR29C 407026 +MIR30A 407029 +MIR30B 407030 +MIR30C1 407031 +MIR30C2 407032 +MIR30D 407033 +MIR30DHG 102723694 +MIR30E 407034 +MIR31 407035 +MIR31HG 554202 +MIR32 407036 +MIR33A 407039 +MIR33B 693120 +MIR34A 407040 +MIR34AHG 106614088 +MIR34B 407041 +MIR34BHG 728196 +MIR34C 407042 +MIR92A1 407048 +MIR92A2 407049 +MIR92B 693235 +MIR93 407050 +MIR95 407052 +MIR96 407053 +MIR98 407054 +MIR99A 407055 +MIR99AHG 388815 +MIR99B 407056 +MIR100 406892 +MIR100HG 399959 +MIR101-1 406893 +MIR101-2 406894 +MIR103A1 406895 +MIR103A2 406896 +MIR103B1 100302238 +MIR103B2 100302282 +MIR105-1 406897 +MIR105-2 406898 +MIR106A 406899 +MIR106B 406900 +MIR107 406901 +MIR122 406906 +MIR122HG 112441433 +MIR124-1 406907 +MIR124-1HG 157627 +MIR124-2 406908 +MIR124-2HG 100130155 +MIR124-3 406909 +MIR125A 406910 +MIR125B1 406911 +MIR125B2 406912 +MIR126 406913 +MIR127 406914 +MIR128-1 406915 +MIR128-2 406916 +MIR129-1 406917 +MIR129-2 406918 +MIR130A 406919 +MIR130AHG 123466203 +MIR130B 406920 +MIR132 406921 +MIR133A1 406922 +MIR133A1HG 102723167 +MIR133A2 406923 +MIR133B 442890 +MIR134 406924 +MIR135A1 406925 +MIR135A2 406926 +MIR135B 442891 +MIR136 406927 +MIR137 406928 +MIR137HG 400765 +MIR138-1 406929 +MIR138-2 406930 +MIR139 406931 +MIR140 406932 +MIR141 406933 +MIR142 406934 +MIR142HG 123466215 +MIR143 406935 +MIR144 406936 +MIR145 406937 +MIR146A 406938 +MIR146B 574447 +MIR147A 406939 +MIR147B 100126311 +MIR148A 406940 +MIR148B 442892 +MIR149 406941 +MIR150 406942 +MIR151A 442893 +MIR151B 100616247 +MIR152 406943 +MIR153-1 406944 +MIR153-2 406945 +MIR154 406946 +MIR155 406947 +MIR155HG 114614 +MIR181A1 406995 +MIR181A1HG 100131234 +MIR181A2 406954 +MIR181A2HG 100379345 +MIR181B1 406955 +MIR181B2 406956 +MIR181C 406957 +MIR181D 574457 +MIR182 406958 +MIR183 406959 +MIR184 406960 +MIR185 406961 +MIR186 406962 +MIR187 406963 +MIR188 406964 +MIR190A 406965 +MIR190B 100126346 +MIR191 406966 +MIR192 406967 +MIR193A 406968 +MIR193B 574455 +MIR193BHG 100129781 +MIR194-1 406969 +MIR194-2 406970 +MIR194-2HG 105369343 +MIR195 406971 +MIR196A1 406972 +MIR196A2 406973 +MIR196B 442920 +MIR197 406974 +MIR198 406975 +MIR199A1 406976 +MIR199A2 406977 +MIR199B 406978 +MIR200A 406983 +MIR200B 406984 +MIR200C 406985 +MIR200CHG 105369635 +MIR202 574448 +MIR202HG 101927671 +MIR203A 406986 +MIR203B 100616173 +MIR204 406987 +MIR205 406988 +MIR205HG 642587 +MIR206 406989 +MIR208A 406990 +MIR208B 100126336 +MIR210 406992 +MIR210HG 100506211 +MIR211 406993 +MIR212 406994 +MIR214 406996 +MIR215 406997 +MIR216A 406998 +MIR216B 100126319 +MIR217 406999 +MIR217HG 104355290 +MIR218-1 407000 +MIR218-2 407001 +MIR219A1 407002 +MIR219A2 407003 +MIR219A2HG 123464509 +MIR219B 100616335 +MIR221 407006 +MIR222 407007 +MIR222HG 104457406 +MIR223 407008 +MIR223HG 115891964 +MIR224 407009 +MIR296 407022 +MIR297 100126354 +MIR298 100126296 +MIR299 407023 +MIR300 100126297 +MIR301A 407027 +MIR301B 100126318 +MIR302A 407028 +MIR302B 442894 +MIR302C 442895 +MIR302CHG 109864269 +MIR302D 442896 +MIR302E 100313774 +MIR302F 100302131 +MIR320A 407037 +MIR320B1 100302117 +MIR320B2 100313769 +MIR320C1 100302135 +MIR320C2 100302195 +MIR320D1 100313896 +MIR320D2 100302169 +MIR320E 100422913 +MIR323A 442897 +MIR323B 574410 +MIR324 442898 +MIR325 442899 +MIR325HG 101928469 +MIR326 442900 +MIR328 442901 +MIR329-1 574408 +MIR329-2 574409 +MIR330 442902 +MIR331 442903 +MIR335 442904 +MIR337 442905 +MIR338 442906 +MIR339 442907 +MIR340 442908 +MIR342 442909 +MIR345 442910 +MIR346 442911 +MIR361 494323 +MIR362 574030 +MIR363 574031 +MIR365A 100126355 +MIR365B 100126356 +MIR365BHG 123464515 +MIR367 442912 +MIR369 442914 +MIR370 442915 +MIR371A 442916 +MIR371B 100616185 +MIR372 442917 +MIR373 442918 +MIR374A 442919 +MIR374B 100126317 +MIR374C 100500807 +MIR375 494324 +MIR376A1 494325 +MIR376A2 664615 +MIR376B 574435 +MIR376C 442913 +MIR377 494326 +MIR378A 494327 +MIR378B 100422933 +MIR378C 100422867 +MIR378D1 100616201 +MIR378D2 100616169 +MIR378D2HG 114515521 +MIR378E 100616498 +MIR378F 100616492 +MIR378G 100616321 +MIR378H 100616306 +MIR378I 100616259 +MIR378J 102465136 +MIR379 494328 +MIR380 494329 +MIR381 494330 +MIR381HG 378881 +MIR382 494331 +MIR383 494332 +MIR384 494333 +MIR409 574413 +MIR410 574434 +MIR411 693121 +MIR412 574433 +MIR421 693122 +MIR422A 494334 +MIR423 494335 +MIR424 494336 +MIR425 494337 +MIR429 554210 +MIR431 574038 +MIR432 574451 +MIR433 574034 +MIR448 554212 +MIR449A 554213 +MIR449B 693123 +MIR449C 100313923 +MIR450A1 554214 +MIR450A2 574505 +MIR450B 100126302 +MIR451A 574411 +MIR451B 100616273 +MIR452 574412 +MIR454 768216 +MIR455 619556 +MIR466 100423038 +MIR483 619552 +MIR484 619553 +MIR485 574436 +MIR486-1 619554 +MIR486-2 102465696 +MIR487A 619555 +MIR487B 664616 +MIR488 574441 +MIR489 574442 +MIR490 574443 +MIR491 574444 +MIR492 574449 +MIR493 574450 +MIR493HG 123466208 +MIR494 574452 +MIR495 574453 +MIR496 574454 +MIR497 574456 +MIR497HG 100506755 +MIR498 574460 +MIR499A 574501 +MIR499B 100616134 +MIR500A 574502 +MIR500B 100422911 +MIR501 574503 +MIR502 574504 +MIR503 574506 +MIR503HG 84848 +MIR504 574507 +MIR505 574508 +MIR506 574511 +MIR507 574512 +MIR508 574513 +MIR509-1 574514 +MIR509-2 100126301 +MIR509-3 100126337 +MIR510 574515 +MIR511 574445 +MIR512-1 574458 +MIR512-2 574459 +MIR513A1 574509 +MIR513A2 574510 +MIR513B 100313822 +MIR513C 100302114 +MIR514A1 574516 +MIR514A2 574517 +MIR514A3 574518 +MIR514B 100422847 +MIR515-1 574462 +MIR515-2 574465 +MIR516A1 574498 +MIR516A2 574499 +MIR516B1 574490 +MIR516B2 574485 +MIR517A 574479 +MIR517B 574483 +MIR517C 574492 +MIR518A1 574488 +MIR518A2 574491 +MIR518B 574474 +MIR518C 574477 +MIR518D 574489 +MIR518E 574487 +MIR518F 574472 +MIR519A1 574496 +MIR519A2 574500 +MIR519B 574469 +MIR519C 574466 +MIR519D 574480 +MIR519E 574463 +MIR520A 574467 +MIR520B 574473 +MIR520C 574476 +MIR520D 574482 +MIR520E 574461 +MIR520F 574464 +MIR520G 574484 +MIR520H 574493 +MIR521-1 574494 +MIR521-2 574481 +MIR522 574495 +MIR523 574471 +MIR524 574478 +MIR525 574470 +MIR526A1 574475 +MIR526A2 574486 +MIR526B 574468 +MIR527 574497 +MIR532 693124 +MIR539 664612 +MIR541 100126308 +MIR542 664617 +MIR543 100126335 +MIR544A 664613 +MIR544B 100422864 +MIR545 664614 +MIR548A1 693125 +MIR548A1HG 105374956 +MIR548A2 693126 +MIR548A3 693127 +MIR548AA1 100500863 +MIR548AA2 100500895 +MIR548AB 100616336 +MIR548AC 100616384 +MIR548AD 100616475 +MIR548AE1 100616305 +MIR548AE2 100616339 +MIR548AG1 100616450 +MIR548AG2 100616440 +MIR548AH 100616254 +MIR548AI 100616347 +MIR548AJ1 100616191 +MIR548AJ2 100616252 +MIR548AK 100616488 +MIR548AL 100616215 +MIR548AM 100616428 +MIR548AN 100616144 +MIR548AO 100847068 +MIR548AP 100847084 +MIR548AQ 100847078 +MIR548AR 100847035 +MIR548AS 100847092 +MIR548AT 100847030 +MIR548AU 100847045 +MIR548AV 100847083 +MIR548AW 100846992 +MIR548AX 100847063 +MIR548AY 102465247 +MIR548AZ 102466162 +MIR548B 693128 +MIR548BA 102465854 +MIR548BB 103504735 +MIR548BC 113839521 +MIR548C 693129 +MIR548D1 693130 +MIR548D2 693131 +MIR548E 100313921 +MIR548F1 100302192 +MIR548F2 100313771 +MIR548F3 100302159 +MIR548F4 100313895 +MIR548F5 100302239 +MIR548G 100313938 +MIR548H1 100313830 +MIR548H2 100313773 +MIR548H3 100302287 +MIR548H4 100313884 +MIR548H5 100616455 +MIR548I1 100302204 +MIR548I2 100302277 +MIR548I3 100302186 +MIR548I4 100302191 +MIR548J 100313914 +MIR548K 100313770 +MIR548L 100302275 +MIR548M 100313772 +MIR548N 100302152 +MIR548O 100313829 +MIR548O2 100616190 +MIR548P 100302288 +MIR548Q 100313841 +MIR548S 100422862 +MIR548T 100422849 +MIR548U 100422884 +MIR548V 100422850 +MIR548W 100422923 +MIR548X 100422920 +MIR548X2 100616302 +MIR548XHG 101927797 +MIR548Y 100500919 +MIR548Z 100500856 +MIR549A 693132 +MIR550A1 693133 +MIR550A2 693134 +MIR550A3 100616354 +MIR550B1 100500883 +MIR550B2 100500830 +MIR551A 693135 +MIR551B 693136 +MIR552 693137 +MIR553 693138 +MIR554 693139 +MIR555 693140 +MIR556 693141 +MIR557 693142 +MIR558 693143 +MIR559 693144 +MIR561 693146 +MIR562 693147 +MIR563 693148 +MIR564 693149 +MIR567 693152 +MIR568 693153 +MIR569 693154 +MIR570 693155 +MIR570HG 440993 +MIR571 693156 +MIR572 693157 +MIR573 693158 +MIR574 693159 +MIR575 693160 +MIR576 693161 +MIR577 693162 +MIR578 693163 +MIR579 693164 +MIR580 693165 +MIR581 693166 +MIR582 693167 +MIR583 693168 +MIR583HG 107984114 +MIR584 693169 +MIR585 693170 +MIR586 693171 +MIR587 693172 +MIR588 693173 +MIR589 693174 +MIR590 693175 +MIR591 693176 +MIR592 693177 +MIR593 693178 +MIR595 693180 +MIR596 693181 +MIR597 693182 +MIR598 693183 +MIR599 693184 +MIR600 693185 +MIR600HG 81571 +MIR601 693186 +MIR602 693187 +MIR603 693188 +MIR604 693189 +MIR605 693190 +MIR606 693191 +MIR607 693192 +MIR608 693193 +MIR609 693194 +MIR610 693195 +MIR611 693196 +MIR612 693197 +MIR613 693198 +MIR614 693199 +MIR615 693200 +MIR616 693201 +MIR617 693202 +MIR618 693203 +MIR619 693204 +MIR620 693205 +MIR621 693206 +MIR622 693207 +MIR623 693208 +MIR624 693209 +MIR625 693210 +MIR626 693211 +MIR627 693212 +MIR628 693213 +MIR629 693214 +MIR630 693215 +MIR631 693216 +MIR632 693217 +MIR633 693218 +MIR634 693219 +MIR635 693220 +MIR636 693221 +MIR637 693222 +MIR638 693223 +MIR639 693224 +MIR640 693225 +MIR641 693226 +MIR642A 693227 +MIR642B 100500845 +MIR643 693228 +MIR644A 693229 +MIR645 693230 +MIR646 693231 +MIR646HG 284757 +MIR647 693232 +MIR648 693233 +MIR649 693234 +MIR650 723778 +MIR651 723779 +MIR652 724022 +MIR653 724023 +MIR654 724024 +MIR655 724025 +MIR656 724026 +MIR657 724027 +MIR658 724028 +MIR659 724029 +MIR660 724030 +MIR661 724031 +MIR662 724032 +MIR663A 724033 +MIR663AHG 284801 +MIR663B 100313824 +MIR664A 100302234 +MIR664B 100847052 +MIR665 100126315 +MIR668 768214 +MIR670 100313777 +MIR670HG 100507261 +MIR671 768213 +MIR675 100033819 +MIR676 100500887 +MIR708 100126333 +MIR711 100313843 +MIR718 100313781 +MIR744 100126313 +MIR758 768212 +MIR759 100313778 +MIR760 100126348 +MIR761 100313892 +MIR762 100313837 +MIR762HG 101928736 +MIR764 100313838 +MIR765 768220 +MIR766 768218 +MIR767 768215 +MIR769 768217 +MIR770 768222 +MIR802 768219 +MIR873 100126316 +MIR874 100126343 +MIR875 100126309 +MIR876 100126310 +MIR877 100126314 +MIR885 100126334 +MIR887 100126347 +MIR888 100126306 +MIR889 100126345 +MIR890 100126303 +MIR891A 100126341 +MIR891B 100126304 +MIR892A 100126342 +MIR892B 100126307 +MIR892C 102466721 +MIR920 100126320 +MIR921 100126349 +MIR922 100126321 +MIR924 100126323 +MIR924HG 647946 +MIR933 100126350 +MIR934 100126324 +MIR935 100126325 +MIR936 100126326 +MIR937 100126338 +MIR938 100126327 +MIR939 100126351 +MIR940 100126328 +MIR941-1 100126329 +MIR941-2 100126339 +MIR941-3 100126352 +MIR941-4 100126330 +MIR941-5 103504732 +MIR942 100126331 +MIR943 100126332 +MIR944 100126340 +MIR1178 100302274 +MIR1179 100302235 +MIR1180 100302256 +MIR1181 100302213 +MIR1182 100302132 +MIR1183 100302122 +MIR1184-1 100302111 +MIR1184-2 100422985 +MIR1184-3 100422977 +MIR1185-1 100302157 +MIR1185-2 100302209 +MIR1193 100422837 +MIR1197 100302250 +MIR1199 102466515 +MIR1200 100302113 +MIR1202 100302259 +MIR1203 100302211 +MIR1204 100302185 +MIR1205 100302161 +MIR1206 100302170 +MIR1207 100302175 +MIR1208 100302281 +MIR1224 100187716 +MIR1225 100188847 +MIR1226 100302232 +MIR1227 100302283 +MIR1228 100302201 +MIR1229 100302156 +MIR1231 100302158 +MIR1233-1 100302160 +MIR1233-2 100422845 +MIR1234 100302196 +MIR1236 100302242 +MIR1237 100302280 +MIR1238 100302226 +MIR1243 100302188 +MIR1244-1 100302285 +MIR1244-2 100422885 +MIR1244-3 100422872 +MIR1244-4 103504734 +MIR1245A 100302219 +MIR1245B 100616324 +MIR1246 100302142 +MIR1247 100302145 +MIR1248 100302143 +MIR1249 100302149 +MIR1250 100302229 +MIR1251 100302289 +MIR1252 100302136 +MIR1253 100302208 +MIR1255A 100302193 +MIR1255B1 100313806 +MIR1255B2 100313835 +MIR1256 100302155 +MIR1257 100302168 +MIR1258 100302172 +MIR1260A 100302236 +MIR1260B 100422991 +MIR1261 100302228 +MIR1262 100302279 +MIR1263 100302148 +MIR1264 100302251 +MIR1265 100302116 +MIR1266 100302202 +MIR1267 100302286 +MIR1268A 100302233 +MIR1268B 100616121 +MIR1269A 100302177 +MIR1269B 100616494 +MIR1270 100302179 +MIR1271 100302203 +MIR1272 100302184 +MIR1273C 100422821 +MIR1273H 102466247 +MIR1275 100302123 +MIR1276 100302121 +MIR1277 100302214 +MIR1278 100302163 +MIR1279 100302182 +MIR1281 100302237 +MIR1282 100302254 +MIR1283-1 100302265 +MIR1283-2 100302205 +MIR1284 100302112 +MIR1285-1 100302218 +MIR1285-2 100302268 +MIR1286 100302118 +MIR1287 100302133 +MIR1288 100302124 +MIR1289-1 100302125 +MIR1289-2 100302134 +MIR1290 100302276 +MIR1291 100302221 +MIR1292 100302138 +MIR1293 100302220 +MIR1294 100302181 +MIR1295A 100302178 +MIR1295B 100847009 +MIR1296 100302150 +MIR1297 100302187 +MIR1298 100302153 +MIR1299 100302167 +MIR1301 100302246 +MIR1302-1 100302227 +MIR1302-2 100302278 +MIR1302-2HG 107985730 +MIR1302-3 100302128 +MIR1302-4 100302130 +MIR1302-5 100302146 +MIR1302-6 100302140 +MIR1302-7 100302147 +MIR1302-8 100302223 +MIR1302-9 100422831 +MIR1302-9HG 107987041 +MIR1302-10 100422834 +MIR1302-11 100422919 +MIR1303 100302284 +MIR1304 100302240 +MIR1305 100302270 +MIR1306 100302197 +MIR1307 100302174 +MIR1321 100302171 +MIR1322 100302166 +MIR1323 100302255 +MIR1324 100302212 +MIR1343 100616437 +MIR1468 100302115 +MIR1469 100302258 +MIR1470 100302127 +MIR1471 100302126 +MIR1537 100302139 +MIR1538 100302119 +MIR1539 100302257 +MIR1587 100616251 +MIR1825 100302183 +MIR1827 100302217 +MIR1843 113839518 +MIR1908 100302263 +MIR1909 100302210 +MIR1910 100302261 +MIR1911 100302222 +MIR1912 100302144 +MIR1913 100302141 +MIR1914 100302137 +MIR1915 100302129 +MIR1915HG 399726 +MIR1972-1 100302243 +MIR1972-2 100422922 +MIR1973 100302290 +MIR1976 100302190 +MIR2052 100302260 +MIR2052HG 441355 +MIR2053 100302225 +MIR2054 100302267 +MIR2110 100302224 +MIR2113 100302164 +MIR2114 100313839 +MIR2115 100313840 +MIR2116 100313886 +MIR2117 100313779 +MIR2117HG 106660605 +MIR2276 100313842 +MIR2277 100313887 +MIR2278 100313780 +MIR2355 100423036 +MIR2392 100616495 +MIR2467 100616360 +MIR2681 100616110 +MIR2682 100616452 +MIR2861 100422910 +MIR2909 100422969 +MIR3059 113839519 +MIR3064 100616387 +MIR3065 100422915 +MIR3074 100422842 +MIR3085 113839520 +MIR3115 100422866 +MIR3116-1 100422902 +MIR3116-2 100422946 +MIR3117 100422871 +MIR3118-1 100423008 +MIR3118-2 100422949 +MIR3118-3 100422844 +MIR3118-4 100422935 +MIR3119-1 100422839 +MIR3119-2 100423010 +MIR3120 100422882 +MIR3121 100423032 +MIR3122 100422947 +MIR3123 100422856 +MIR3124 100422879 +MIR3125 100422986 +MIR3126 100423030 +MIR3127 100422928 +MIR3128 100422824 +MIR3129 100422908 +MIR3130-1 100422993 +MIR3130-2 100423002 +MIR3131 100422957 +MIR3132 100423039 +MIR3133 100422942 +MIR3134 100422990 +MIR3135A 100422901 +MIR3135B 100616218 +MIR3136 100422859 +MIR3137 100422926 +MIR3138 100423011 +MIR3139 100423017 +MIR3140 100422896 +MIR3141 100422950 +MIR3142 100422938 +MIR3142HG 107075116 +MIR3143 100422934 +MIR3144 100422951 +MIR3145 100423001 +MIR3146 100422967 +MIR3147 100422939 +MIR3147HG 100653233 +MIR3148 100422876 +MIR3149 100422921 +MIR3150A 100422964 +MIR3150B 100500907 +MIR3150BHG 105375650 +MIR3151 100422992 +MIR3152 100422869 +MIR3153 100422936 +MIR3154 100422893 +MIR3155A 100422989 +MIR3155B 100628560 +MIR3156-1 100422988 +MIR3156-2 100422907 +MIR3156-3 100423018 +MIR3157 100422892 +MIR3158-1 100422900 +MIR3158-2 100423033 +MIR3159 100423016 +MIR3160-1 100422827 +MIR3160-2 100422825 +MIR3161 100423000 +MIR3162 100422880 +MIR3163 100423029 +MIR3164 100422846 +MIR3165 100422953 +MIR3166 100423040 +MIR3167 100422918 +MIR3168 100422878 +MIR3169 100422973 +MIR3170 100422881 +MIR3171 100422830 +MIR3171HG 728755 +MIR3173 100422981 +MIR3174 100422841 +MIR3175 100422995 +MIR3176 100423037 +MIR3177 100423012 +MIR3178 100422974 +MIR3179-1 100422960 +MIR3179-2 100422886 +MIR3179-3 100423006 +MIR3179-4 103504729 +MIR3180-1 100422870 +MIR3180-2 100422956 +MIR3180-3 100422836 +MIR3180-4 100500852 +MIR3180-5 100500916 +MIR3181 100422972 +MIR3182 100422853 +MIR3183 100422835 +MIR3184 100423003 +MIR3185 100422978 +MIR3186 100422944 +MIR3187 100422854 +MIR3188 100422833 +MIR3189 100422943 +MIR3190 100422899 +MIR3191 100422832 +MIR3192 100422875 +MIR3193 100422904 +MIR3194 100422889 +MIR3195 100422838 +MIR3196 100423014 +MIR3197 100423023 +MIR3198-1 100423025 +MIR3198-2 100616400 +MIR3199-1 100423034 +MIR3199-2 100422998 +MIR3200 100422912 +MIR3201 100422916 +MIR3202-1 100422987 +MIR3202-2 100422877 +MIR3529 100616238 +MIR3591 100616357 +MIR3605 100500853 +MIR3606 100500837 +MIR3609 100500819 +MIR3610 100500914 +MIR3611 100500890 +MIR3612 100500817 +MIR3613 100500908 +MIR3614 100500827 +MIR3615 100500847 +MIR3616 100500814 +MIR3617 100500897 +MIR3618 100500860 +MIR3619 100500828 +MIR3620 100500810 +MIR3621 100500811 +MIR3622A 100500858 +MIR3622B 100500871 +MIR3646 100500813 +MIR3648-1 100500862 +MIR3648-2 103504731 +MIR3649 100500816 +MIR3650 100500824 +MIR3651 100500918 +MIR3652 100500842 +MIR3654 100500804 +MIR3655 100500820 +MIR3657 100500889 +MIR3658 100500832 +MIR3659 100500801 +MIR3659HG 105378653 +MIR3660 100500825 +MIR3661 100500905 +MIR3662 100500880 +MIR3663 100500893 +MIR3663HG 101927704 +MIR3664 100500844 +MIR3665 100500861 +MIR3666 100500896 +MIR3667 100500882 +MIR3667HG 348645 +MIR3668 100500879 +MIR3670-1 100500910 +MIR3670-2 100846994 +MIR3670-3 103504726 +MIR3670-4 103504740 +MIR3671 100500854 +MIR3672 100500869 +MIR3674 100500912 +MIR3675 100500876 +MIR3677 100500812 +MIR3677HG 106660606 +MIR3678 100500841 +MIR3679 100500878 +MIR3680-1 100500917 +MIR3680-2 100847041 +MIR3681 100500884 +MIR3681HG 100506457 +MIR3682 100500850 +MIR3683 100500886 +MIR3684 100500867 +MIR3685 100500802 +MIR3686 100500839 +MIR3688-1 100500881 +MIR3688-2 100616303 +MIR3689A 100500846 +MIR3689B 100500906 +MIR3689C 100616333 +MIR3689D1 100616131 +MIR3689D2 100616344 +MIR3689E 100616460 +MIR3689F 100616212 +MIR3690 100500894 +MIR3691 100500900 +MIR3692 100500899 +MIR3713 100500855 +MIR3714 100500913 +MIR3907 100500835 +MIR3908 100500909 +MIR3909 100500826 +MIR3910-1 100500821 +MIR3910-2 100500902 +MIR3911 100500872 +MIR3912 100500831 +MIR3913-1 100500903 +MIR3913-2 100500868 +MIR3914-1 100500836 +MIR3914-2 100500920 +MIR3915 100500915 +MIR3916 100500849 +MIR3917 100500808 +MIR3918 100500851 +MIR3919 100500803 +MIR3920 100500823 +MIR3921 100500859 +MIR3922 100500843 +MIR3923 100500877 +MIR3924 100500834 +MIR3925 100500885 +MIR3926-1 100500870 +MIR3926-2 100500838 +MIR3927 100500898 +MIR3928 100500901 +MIR3929 100500864 +MIR3934 100500873 +MIR3935 100500891 +MIR3936 100500865 +MIR3936HG 553103 +MIR3937 100500822 +MIR3938 100500875 +MIR3939 100500857 +MIR3940 100500888 +MIR3941 100500866 +MIR3942 100500904 +MIR3943 100500829 +MIR3944 100500911 +MIR3945 100500818 +MIR3945HG 731424 +MIR3960 100616250 +MIR3972 100616188 +MIR3973 100616311 +MIR3974 100616279 +MIR3975 100616257 +MIR3976 100616244 +MIR3976HG 645355 +MIR3977 100616297 +MIR3978 100616491 +MIR4251 100422968 +MIR4252 100422975 +MIR4253 100422914 +MIR4254 100423028 +MIR4255 100422898 +MIR4256 100422976 +MIR4257 100422997 +MIR4258 100423020 +MIR4259 100422852 +MIR4260 100422894 +MIR4261 100422929 +MIR4262 100422996 +MIR4263 100422965 +MIR4264 100422888 +MIR4265 100422863 +MIR4266 100423027 +MIR4267 100422994 +MIR4268 100422959 +MIR4269 100423043 +MIR4270 100422868 +MIR4271 100422952 +MIR4272 100422941 +MIR4273 100422955 +MIR4274 100422826 +MIR4275 100422937 +MIR4276 100423042 +MIR4277 100422966 +MIR4278 100422999 +MIR4279 100422874 +MIR4280 100422887 +MIR4280HG 117751736 +MIR4281 100422962 +MIR4282 100423005 +MIR4283-1 100422917 +MIR4283-2 100422848 +MIR4284 100422948 +MIR4285 100422858 +MIR4286 100422982 +MIR4287 100422828 +MIR4288 100422903 +MIR4289 100423015 +MIR4290 100422963 +MIR4290HG 286370 +MIR4291 100422927 +MIR4292 100422860 +MIR4293 100422843 +MIR4294 100422895 +MIR4295 100422909 +MIR4296 100423041 +MIR4297 100422873 +MIR4298 100423021 +MIR4299 100423026 +MIR4300 100422823 +MIR4300HG 101928989 +MIR4301 100422855 +MIR4302 100422897 +MIR4303 100422924 +MIR4304 100422931 +MIR4305 100422940 +MIR4306 100422861 +MIR4307 100423019 +MIR4307HG 101927081 +MIR4308 100422984 +MIR4309 100422954 +MIR4310 100423013 +MIR4311 100422905 +MIR4312 100422971 +MIR4313 100423035 +MIR4314 100422983 +MIR4315-1 100423004 +MIR4315-2 100422961 +MIR4316 100422851 +MIR4317 100422840 +MIR4318 100422857 +MIR4319 100422829 +MIR4320 100422865 +MIR4321 100423031 +MIR4322 100422925 +MIR4323 100422980 +MIR4324 100422979 +MIR4325 100422883 +MIR4326 100422945 +MIR4327 100422891 +MIR4328 100422932 +MIR4329 100423009 +MIR4330 100422930 +MIR4418 100616433 +MIR4420 100616164 +MIR4421 100616189 +MIR4422 100616272 +MIR4422HG 109729135 +MIR4423 100616481 +MIR4424 100616328 +MIR4425 100616365 +MIR4426 100616345 +MIR4427 100616390 +MIR4428 100616141 +MIR4429 100616469 +MIR4430 100616136 +MIR4431 100616431 +MIR4432 100616473 +MIR4432HG 106660609 +MIR4433A 100616265 +MIR4433B 102465833 +MIR4434 100616419 +MIR4435-1 100616499 +MIR4435-2 100616341 +MIR4435-2HG 541471 +MIR4436A 100616399 +MIR4436B1 100616123 +MIR4436B2 100847033 +MIR4437 100616213 +MIR4438 100616375 +MIR4439 100616207 +MIR4440 100616397 +MIR4441 100616493 +MIR4442 100616477 +MIR4443 100616407 +MIR4444-1 100616394 +MIR4444-2 100846999 +MIR4445 100616129 +MIR4446 100616476 +MIR4447 100616485 +MIR4448 100616127 +MIR4449 100616436 +MIR4450 100616299 +MIR4451 100616349 +MIR4452 100616463 +MIR4453 100616193 +MIR4453HG 54553 +MIR4454 100616234 +MIR4455 100616111 +MIR4456 100616381 +MIR4457 100616235 +MIR4458 100616142 +MIR4458HG 100505738 +MIR4460 100616325 +MIR4462 100616413 +MIR4463 100616389 +MIR4464 100616109 +MIR4465 100616180 +MIR4466 100616154 +MIR4467 100616367 +MIR4468 100616226 +MIR4469 100616115 +MIR4470 100616484 +MIR4471 100616451 +MIR4472-1 100616268 +MIR4472-2 100616309 +MIR4473 100616229 +MIR4474 100616441 +MIR4475 100616289 +MIR4476 100616456 +MIR4477A 100616184 +MIR4477B 100616194 +MIR4478 100616312 +MIR4479 100616480 +MIR4480 100616151 +MIR4481 100616320 +MIR4482 100616323 +MIR4483 100616162 +MIR4484 100616327 +MIR4485 100616263 +MIR4486 100616118 +MIR4487 100616222 +MIR4488 100616470 +MIR4489 100616284 +MIR4490 100616186 +MIR4491 100616330 +MIR4492 100616376 +MIR4493 100616319 +MIR4494 100616478 +MIR4495 100616287 +MIR4496 100616240 +MIR4497 100616454 +MIR4498 100616179 +MIR4499 100616304 +MIR4500 100616182 +MIR4500HG 642345 +MIR4501 100616137 +MIR4502 100616227 +MIR4503 100616280 +MIR4504 100616261 +MIR4505 100616158 +MIR4506 100616140 +MIR4507 100616135 +MIR4508 100616275 +MIR4509-1 100616223 +MIR4509-2 100616228 +MIR4509-3 100616382 +MIR4510 100616293 +MIR4511 100616379 +MIR4512 100616149 +MIR4513 100616183 +MIR4514 100616181 +MIR4515 100616404 +MIR4516 100616258 +MIR4517 100616487 +MIR4518 100616405 +MIR4519 100616231 +MIR4520-1 100616401 +MIR4520-2 100616466 +MIR4521 100616406 +MIR4522 100616277 +MIR4523 100616122 +MIR4524A 100616316 +MIR4524B 100847008 +MIR4525 100616196 +MIR4526 100616130 +MIR4527 100616264 +MIR4527HG 110175910 +MIR4528 100616232 +MIR4529 100616290 +MIR4530 100616163 +MIR4531 100616355 +MIR4533 100616362 +MIR4534 100616146 +MIR4535 100616415 +MIR4536-1 100616155 +MIR4536-2 100847061 +MIR4537 100616422 +MIR4538 100616276 +MIR4539 100616374 +MIR4540 100616278 +MIR4632 100616438 +MIR4633 100616175 +MIR4634 100616202 +MIR4635 100616479 +MIR4636 100616326 +MIR4637 100616271 +MIR4638 100616342 +MIR4639 100616269 +MIR4640 100616237 +MIR4641 100616178 +MIR4642 100616352 +MIR4643 100616174 +MIR4644 100616430 +MIR4645 100616285 +MIR4646 100616230 +MIR4647 100616124 +MIR4648 100616116 +MIR4649 100616346 +MIR4650-1 100616310 +MIR4650-2 100616331 +MIR4651 100616270 +MIR4652 100616206 +MIR4653 100616117 +MIR4654 100616386 +MIR4655 100616160 +MIR4656 100616465 +MIR4657 100616393 +MIR4658 100616439 +MIR4659A 100616348 +MIR4659B 100616372 +MIR4660 100616350 +MIR4661 100616245 +MIR4662A 100616221 +MIR4662B 100616255 +MIR4663 100616260 +MIR4664 100616318 +MIR4665 100616288 +MIR4666A 100616308 +MIR4666B 100847047 +MIR4667 100616214 +MIR4668 100616114 +MIR4669 100616236 +MIR4670 100616351 +MIR4671 100616380 +MIR4672 100616429 +MIR4673 100616242 +MIR4674 100616301 +MIR4675 100616383 +MIR4676 100616286 +MIR4677 100616343 +MIR4678 100616296 +MIR4679-1 100616128 +MIR4679-2 100616192 +MIR4680 100616113 +MIR4681 100616398 +MIR4682 100616322 +MIR4683 100616500 +MIR4684 100616391 +MIR4685 100616482 +MIR4686 100616126 +MIR4687 100616453 +MIR4688 100616368 +MIR4689 100616421 +MIR4690 100616292 +MIR4691 100616403 +MIR4692 100616410 +MIR4693 100616457 +MIR4694 100616426 +MIR4695 100616120 +MIR4696 100616402 +MIR4697 100616119 +MIR4698 100616486 +MIR4699 100616133 +MIR4700 100616329 +MIR4701 100616262 +MIR4703 100616423 +MIR4704 100616205 +MIR4705 100616239 +MIR4706 100616490 +MIR4707 100616424 +MIR4708 100616176 +MIR4709 100616211 +MIR4710 100616300 +MIR4711 100616409 +MIR4712 100616396 +MIR4713 100616369 +MIR4713HG 109729174 +MIR4714 100616432 +MIR4715 100616474 +MIR4716 100616332 +MIR4717 100616241 +MIR4718 100616195 +MIR4719 100616172 +MIR4720 100616150 +MIR4721 100616256 +MIR4722 100616167 +MIR4723 100616388 +MIR4724 100616248 +MIR4725 100616449 +MIR4726 100616153 +MIR4727 100616416 +MIR4728 100616132 +MIR4729 100616204 +MIR4730 100616359 +MIR4731 100616125 +MIR4732 100616385 +MIR4733 100616266 +MIR4733HG 105371722 +MIR4734 100616203 +MIR4735 100616363 +MIR4736 100616220 +MIR4737 100616210 +MIR4738 100616282 +MIR4739 100616170 +MIR4740 100616294 +MIR4741 100616139 +MIR4742 100616468 +MIR4743 100616366 +MIR4744 100616420 +MIR4745 100616459 +MIR4746 100616371 +MIR4747 100616337 +MIR4748 100616425 +MIR4749 100616313 +MIR4750 100616314 +MIR4751 100616483 +MIR4752 100616171 +MIR4753 100616224 +MIR4754 100616168 +MIR4755 100616434 +MIR4756 100616225 +MIR4757 100616307 +MIR4758 100616340 +MIR4759 100616243 +MIR4760 100616148 +MIR4761 100616414 +MIR4762 100616253 +MIR4763 100616143 +MIR4764 100616295 +MIR4765 100616219 +MIR4766 100616283 +MIR4767 100616467 +MIR4768 100616249 +MIR4769 100616147 +MIR4770 100616373 +MIR4771-1 100616370 +MIR4771-2 100616165 +MIR4772 100616157 +MIR4773-1 100616392 +MIR4773-2 100616418 +MIR4774 100616356 +MIR4775 100616361 +MIR4776-1 100616267 +MIR4776-2 100616472 +MIR4777 100616317 +MIR4778 100616464 +MIR4779 100616159 +MIR4780 100616447 +MIR4781 100616315 +MIR4782 100616208 +MIR4783 100616187 +MIR4784 100616378 +MIR4785 100616364 +MIR4786 100616417 +MIR4787 100616138 +MIR4788 100616281 +MIR4789 100616395 +MIR4790 100616334 +MIR4791 100616291 +MIR4793 100616112 +MIR4794 100616338 +MIR4795 100616161 +MIR4796 100616166 +MIR4797 100616216 +MIR4798 100616471 +MIR4799 100616246 +MIR4800 100616358 +MIR4801 100616435 +MIR4802 100616274 +MIR4803 100616377 +MIR4804 100616152 +MIR4999 100847049 +MIR5000 100846995 +MIR5001 100847037 +MIR5002 100847021 +MIR5003 100847029 +MIR5004 100847012 +MIR5006 100847026 +MIR5007 100846996 +MIR5008 100847072 +MIR5009 100846993 +MIR5010 100847046 +MIR5011 100847002 +MIR5047 100616408 +MIR5087 100847044 +MIR5088 100847074 +MIR5089 100847067 +MIR5090 100847073 +MIR5091 100847023 +MIR5092 100847039 +MIR5093 100847022 +MIR5094 100847059 +MIR5100 100847014 +MIR5186 100847036 +MIR5187 100847090 +MIR5188 100847004 +MIR5189 100847057 +MIR5190 100847080 +MIR5191 100847050 +MIR5192 100847087 +MIR5193 100847079 +MIR5194 100847051 +MIR5195 100847062 +MIR5196 100847070 +MIR5197 100846991 +MIR5571 100847006 +MIR5572 100847042 +MIR5579 100847000 +MIR5580 100847076 +MIR5581 100847010 +MIR5582 100847020 +MIR5583-1 100847025 +MIR5583-2 100846997 +MIR5584 100847089 +MIR5585 100847018 +MIR5586 100847088 +MIR5587 100847028 +MIR5588 100847054 +MIR5589 100847093 +MIR5590 100847069 +MIR5591 100847065 +MIR5680 100847001 +MIR5681A 100847058 +MIR5681B 100847091 +MIR5682 100847043 +MIR5683 100847034 +MIR5684 100847071 +MIR5685 100847075 +MIR5687 100847019 +MIR5688 100847077 +MIR5689 100846998 +MIR5689HG 106660610 +MIR5690 100847048 +MIR5691 100847015 +MIR5692A1 100847066 +MIR5692A2 100847038 +MIR5692B 100847013 +MIR5692C1 100847082 +MIR5692C2 100847017 +MIR5693 100847003 +MIR5694 100847064 +MIR5695 100847016 +MIR5696 100847007 +MIR5697 100847055 +MIR5698 100847024 +MIR5699 100847086 +MIR5700 100847031 +MIR5701-1 100847060 +MIR5701-2 100847005 +MIR5701-3 103504741 +MIR5702 100847053 +MIR5703 100847081 +MIR5704 100847040 +MIR5705 100847027 +MIR5706 100847085 +MIR5707 100847032 +MIR5708 100847056 +MIR5739 102466081 +MIR5787 102464817 +MIR6068 102464823 +MIR6069 102464824 +MIR6070 102464825 +MIR6071 102466516 +MIR6072 102465944 +MIR6073 102464826 +MIR6074 102464827 +MIR6075 102466103 +MIR6076 102464828 +MIR6077 102466225 +MIR6078 102464829 +MIR6079 102464830 +MIR6080 102464831 +MIR6081 102466518 +MIR6082 102466953 +MIR6083 102464832 +MIR6084 102464833 +MIR6085 102464834 +MIR6086 102466519 +MIR6088 102464836 +MIR6089 102464837 +MIR6090 102466104 +MIR6124 102466906 +MIR6125 102465133 +MIR6126 102465134 +MIR6127 102466615 +MIR6128 102465135 +MIR6129 102465137 +MIR6130 102466967 +MIR6131 102465138 +MIR6132 102466616 +MIR6133 102465139 +MIR6134 102465140 +MIR6165 102465141 +MIR6499 102465246 +MIR6500 102466656 +MIR6501 102465248 +MIR6502 102465249 +MIR6503 102465250 +MIR6504 102465251 +MIR6505 102466657 +MIR6506 102465252 +MIR6507 102465253 +MIR6508 102466972 +MIR6509 102465254 +MIR6510 102466658 +MIR6511A1 102466268 +MIR6511A2 102466812 +MIR6511A3 102465683 +MIR6511A4 102465684 +MIR6511B1 102465429 +MIR6511B2 102465985 +MIR6512 102465255 +MIR6513 102465256 +MIR6514 102465257 +MIR6515 102466659 +MIR6516 102466864 +MIR6529 113839522 +MIR6715A 102466189 +MIR6715B 102465427 +MIR6716 102466719 +MIR6717 102465428 +MIR6718 102465430 +MIR6719 102465974 +MIR6720 102466720 +MIR6721 102466190 +MIR6722 102465431 +MIR6724-1 102465433 +MIR6724-2 103504727 +MIR6724-3 103504739 +MIR6724-4 103504733 +MIR6726 102465434 +MIR6727 102465435 +MIR6728 102465436 +MIR6729 102466982 +MIR6730 102466722 +MIR6731 102465437 +MIR6732 102465438 +MIR6733 102465439 +MIR6734 102466723 +MIR6735 102465440 +MIR6736 102466191 +MIR6737 102465441 +MIR6738 102465442 +MIR6739 102466724 +MIR6740 102465443 +MIR6741 102466270 +MIR6742 102465444 +MIR6743 102465445 +MIR6744 102466725 +MIR6745 102466726 +MIR6746 102465446 +MIR6747 102465447 +MIR6748 102465448 +MIR6749 102466727 +MIR6750 102466192 +MIR6751 102465449 +MIR6752 102465450 +MIR6753 102465451 +MIR6754 102466728 +MIR6755 102465452 +MIR6756 102465453 +MIR6757 102466193 +MIR6758 102465454 +MIR6759 102466729 +MIR6760 102465455 +MIR6761 102465456 +MIR6762 102465457 +MIR6763 102465975 +MIR6764 102466730 +MIR6765 102465458 +MIR6766 102466983 +MIR6767 102465459 +MIR6768 102465460 +MIR6769A 102466731 +MIR6769B 102466202 +MIR6770-1 102465461 +MIR6770-2 102465908 +MIR6770-3 102466259 +MIR6771 102465462 +MIR6772 102465463 +MIR6773 102466194 +MIR6774 102466732 +MIR6775 102465464 +MIR6776 102465465 +MIR6777 102465466 +MIR6778 102466733 +MIR6779 102465467 +MIR6780A 102466195 +MIR6780B 102466746 +MIR6781 102465468 +MIR6782 102465469 +MIR6783 102466734 +MIR6784 102465470 +MIR6785 102466911 +MIR6786 102465471 +MIR6787 102465472 +MIR6788 102466735 +MIR6789 102466736 +MIR6790 102465473 +MIR6791 102465474 +MIR6792 102465475 +MIR6793 102466737 +MIR6794 102466196 +MIR6795 102465476 +MIR6796 102465477 +MIR6797 102465478 +MIR6798 102466738 +MIR6799 102465479 +MIR6800 102465480 +MIR6801 102466984 +MIR6802 102465481 +MIR6803 102466739 +MIR6804 102465482 +MIR6805 102465483 +MIR6806 102465484 +MIR6807 102465976 +MIR6808 102466740 +MIR6809 102465485 +MIR6810 102466197 +MIR6811 102465486 +MIR6812 102465487 +MIR6813 102466741 +MIR6814 102465488 +MIR6815 102465489 +MIR6816 102465490 +MIR6817 102466198 +MIR6818 102466742 +MIR6819 102465491 +MIR6820 102465492 +MIR6821 102465493 +MIR6822 102466743 +MIR6823 102465494 +MIR6824 102465495 +MIR6825 102466199 +MIR6826 102465496 +MIR6827 102466744 +MIR6828 102465497 +MIR6829 102465977 +MIR6830 102465498 +MIR6831 102465499 +MIR6832 102466745 +MIR6833 102465500 +MIR6834 102465501 +MIR6835 102465502 +MIR6836 102465503 +MIR6837 102466985 +MIR6838 102465504 +MIR6839 102465505 +MIR6840 102466747 +MIR6841 102465506 +MIR6842 102465507 +MIR6843 102465508 +MIR6844 102466200 +MIR6845 102466748 +MIR6846 102465509 +MIR6847 102465510 +MIR6848 102465511 +MIR6849 102466749 +MIR6850 102465978 +MIR6851 102465512 +MIR6852 102465513 +MIR6853 102466201 +MIR6854 102465514 +MIR6855 102466750 +MIR6856 102465515 +MIR6857 102465516 +MIR6858 102465517 +MIR6859-1 102466751 +MIR6859-2 102465909 +MIR6859-3 102465910 +MIR6859-4 103504738 +MIR6860 102465518 +MIR6861 102465519 +MIR6862-1 102465520 +MIR6862-2 102465907 +MIR6863 102466752 +MIR6864 102465521 +MIR6865 102465522 +MIR6866 102466986 +MIR6867 102465523 +MIR6868 102466753 +MIR6869 102465524 +MIR6870 102465525 +MIR6871 102466912 +MIR6872 102465526 +MIR6873 102466754 +MIR6874 102466203 +MIR6875 102466755 +MIR6876 102465527 +MIR6877 102465528 +MIR6878 102465529 +MIR6879 102466756 +MIR6880 102466204 +MIR6881 102465530 +MIR6882 102465531 +MIR6883 102465532 +MIR6884 102466757 +MIR6885 102465533 +MIR6886 102465534 +MIR6887 102466205 +MIR6888 102465535 +MIR6889 102466758 +MIR6890 102465536 +MIR6891 102465537 +MIR6892 102465538 +MIR6893 102466271 +MIR6894 102466759 +MIR6895 102465539 +MIR7106 102466222 +MIR7107 102465665 +MIR7108 102466806 +MIR7109 102465666 +MIR7110 102465667 +MIR7111 102465668 +MIR7112 102465906 +MIR7113 102465669 +MIR7114 102466223 +MIR7150 102465688 +MIR7151 102466814 +MIR7152 102465689 +MIR7153 102465690 +MIR7154 102465691 +MIR7155 102466815 +MIR7156 102466995 +MIR7157 102465692 +MIR7158 102465693 +MIR7159 102466816 +MIR7160 102465695 +MIR7161 102465694 +MIR7162 102466227 +MIR7515 102466235 +MIR7515HG 102800314 +MIR7702 102465800 +MIR7703 102465801 +MIR7704 102465802 +MIR7705 102466854 +MIR7706 102465803 +MIR7843 102465832 +MIR7844 102465834 +MIR7845 102465835 +MIR7846 102465836 +MIR7847 102465993 +MIR7848 102466865 +MIR7849 102465837 +MIR7850 102465838 +MIR7851 102467003 +MIR7852 102465839 +MIR7853 102466866 +MIR7854 102465840 +MIR7855 102465841 +MIR7856 102465842 +MIR7973-1 102466250 +MIR7973-2 102465855 +MIR7974 102465856 +MIR7975 102466872 +MIR7976 102465857 +MIR7977 102465858 +MIR7978 102465859 +MIR8052 102466873 +MIR8053 102467004 +MIR8054 102465860 +MIR8055 102465861 +MIR8056 102465862 +MIR8057 102466874 +MIR8058 102465863 +MIR8059 102466918 +MIR8060 102465864 +MIR8061 102466251 +MIR8062 102465865 +MIR8063 102466875 +MIR8064 102465866 +MIR8065 102465867 +MIR8066 102465868 +MIR8067 102465869 +MIR8068 102466876 +MIR8069 103504736 +MIR8070 102465870 +MIR8071-1 102465871 +MIR8071-2 102466889 +MIR8072 102466877 +MIR8073 102465872 +MIR8074 102465873 +MIR8075 102465874 +MIR8076 102466253 +MIR8077 102465875 +MIR8078 102466878 +MIR8079 102465876 +MIR8080 102465877 +MIR8081 102465995 +MIR8082 102465878 +MIR8083 102466879 +MIR8084 102467005 +MIR8085 102465879 +MIR8086 102465880 +MIR8087 102465881 +MIR8088 102466880 +MIR8089 102465882 +MIR8485 103504737 +MIR9500 103504730 +MIR9718 113218481 +MIR9851 113218494 +MIR9898 113218482 +MIR9899 113218495 +MIR9900 113218483 +MIR9901 113218496 +MIR9902-1 113218484 +MIR9902-2 113218511 +MIR9903 113218497 +MIR9983 113218508 +MIR9985 113218498 +MIR9986 113218485 +MIR10226 113218499 +MIR10392 113218486 +MIR10393 113218500 +MIR10394 113218487 +MIR10396A 113218501 +MIR10396B 113218488 +MIR10397 113218502 +MIR10398 113218489 +MIR10399 113218503 +MIR10400 113218512 +MIR10522 113218490 +MIR10523 113218510 +MIR10524 113218491 +MIR10525 113218504 +MIR10526 113218492 +MIR10527 113218505 +MIR11181 113218493 +MIR11399 113218506 +MIR11400 113839523 +MIR11401 113218509 +MIR12113 113218507 +MIR12114 113218480 +MIR12115 113219450 +MIR12116 113219451 +MIR12117 113219452 +MIR12118 113219469 +MIR12119 113219453 +MIR12120 113219468 +MIR12121 113219454 +MIR12122 113219455 +MIR12123 113219456 +MIR12124 113219457 +MIR12125 113219458 +MIR12126 113219459 +MIR12127 113219470 +MIR12128 113219463 +MIR12129 113219460 +MIR12130 113219464 +MIR12131 113219461 +MIR12132 113219465 +MIR12133 113219466 +MIR12135 113219462 +MIR12136 113219467 +MIRLET7A1 406881 +MIRLET7A1HG 112903833 +MIRLET7A2 406882 +MIRLET7A3 406883 +MIRLET7B 406884 +MIRLET7BHG 400931 +MIRLET7C 406885 +MIRLET7D 406886 +MIRLET7E 406887 +MIRLET7F1 406888 +MIRLET7F2 406889 +MIRLET7G 406890 +MIRLET7I 406891 +MIRLET7IHG 120766144 +MIS12 79003 +MIS18A 54069 +MIS18A-AS1 100874202 +MIS18BP1 55320 +MISFA 100506540 +MISP 126353 +MISP3 113230 +MITA1 105375914 +MITD1 129531 +MITF 4286 +MIX23 131076 +MIX23P1 645859 +MIX23P2 100287708 +MIX23P3 732448 +MIX23P4 106632269 +MIX23P5 100420588 +MIXL1 83881 +MKI67 4288 +MKI67P1 100271918 +MKKS 8195 +MKLN1 4289 +MKLN1-AS 100506881 +MKNK1 8569 +MKNK1-AS1 100507423 +MKNK2 2872 +MKNK2P1 389948 +MKRN1 23608 +MKRN2 23609 +MKRN2OS 100129480 +MKRN3 7681 +MKRN4P 7682 +MKRN5P 7683 +MKRN6P 23610 +MKRN7P 7686 +MKRN8P 391033 +MKRN9P 400058 +MKS1 54903 +MKX 283078 +MKX-AS1 101929202 +MLANA 2315 +MLC1 23209 +MLEC 9761 +MLECP1 106480317 +MLF1 4291 +MLF1-DT 100996447 +MLF2 8079 +MLH1 4292 +MLH3 27030 +MLIP 90523 +MLIP-AS1 100873951 +MLIP-IT1 100874282 +MLKL 197259 +MLLT1 4298 +MLLT3 4300 +MLLT6 4302 +MLLT10 8028 +MLLT10P1 140678 +MLLT10P2 106480724 +MLLT11 10962 +MLN 4295 +MLNR 2862 +MLPH 79083 +MLST8 64223 +MLX 6945 +MLXIP 22877 +MLXIPL 51085 +MLXP1 646696 +MLYCD 23417 +MMAA 166785 +MMAB 326625 +MMACHC 25974 +MMACHCP1 127482538 +MMADHC 27249 +MMADHC-DT 101929231 +MMADHCP1 100216356 +MMADHCP2 100216355 +MMD 23531 +MMD2 221938 +MME 4311 +MME-AS1 100873918 +MMEL1 79258 +MMEL1-AS1 105378597 +MMGT1 93380 +MMP1 4312 +MMP2 4313 +MMP2-AS1 107984884 +MMP3 4314 +MMP7 4316 +MMP8 4317 +MMP9 4318 +MMP10 4319 +MMP11 4320 +MMP12 4321 +MMP13 4322 +MMP14 4323 +MMP15 4324 +MMP16 4325 +MMP17 4326 +MMP19 4327 +MMP20 9313 +MMP20-AS1 101928477 +MMP21 118856 +MMP23A 8511 +MMP23B 8510 +MMP24 10893 +MMP24OS 101410538 +MMP25 64386 +MMP25-AS1 100507419 +MMP26 56547 +MMP27 64066 +MMP28 79148 +MMRN1 22915 +MMRN2 79812 +MMS19 64210 +MMS22L 253714 +MMUT 4594 +MN1 4330 +MNAT1 4331 +MND1 84057 +MND1P1 100127934 +MNDA 4332 +MNS1 55329 +MNT 4335 +MNX1 3110 +MNX1-AS1 645249 +MNX1-AS2 105375606 +MOAP1 64112 +MOB1A 55233 +MOB1AP1 100873874 +MOB1AP2 100873854 +MOB1B 92597 +MOB2 81532 +MOB3A 126308 +MOB3B 79817 +MOB3C 148932 +MOB4 25843 +MOB4P1 100421925 +MOB4P2 100131078 +MOBP 4336 +MOCOS 55034 +MOCS1 4337 +MOCS1P1 27187 +MOCS2 4338 +MOCS2-DT 257396 +MOCS3 27304 +MOCS3P1 326305 +MOCS3P2 100420520 +MOG 4340 +MOGAT1 116255 +MOGAT2 80168 +MOGAT3 346606 +MOGS 7841 +MOK 5891 +MON1A 84315 +MON1B 22879 +MON2 23041 +MON2-AS1 128385372 +MORC1 27136 +MORC1-AS1 100506506 +MORC2 22880 +MORC2-AS1 150291 +MORC3 23515 +MORC4 79710 +MORF4 10934 +MORF4L1 10933 +MORF4L1P1 326591 +MORF4L1P2 326594 +MORF4L1P3 326593 +MORF4L1P4 100420030 +MORF4L1P5 100129288 +MORF4L1P6 100873878 +MORF4L1P7 100130637 +MORF4L2 9643 +MORF4L2-AS1 340544 +MORF4L2P1 643915 +MORN1 79906 +MORN2 729967 +MORN3 283385 +MORN4 118812 +MORN5 254956 +MOS 4342 +MOSMO 730094 +MOSPD1 56180 +MOSPD2 158747 +MOSPD3 64598 +MOV10 4343 +MOV10L1 54456 +MOXD1 26002 +MOXD2P 100289017 +MPC1 51660 +MPC1-DT 119545625 +MPC1L 347411 +MPC2 25874 +MPDU1 9526 +MPDU1-AS1 100996842 +MPDZ 8777 +MPEG1 219972 +MPG 4350 +MPHOSPH6 10200 +MPHOSPH6-DT 119545631 +MPHOSPH6P1 107985102 +MPHOSPH8 54737 +MPHOSPH9 10198 +MPHOSPH10 10199 +MPHOSPH10P1 643802 +MPHOSPH10P2 107987215 +MPHOSPH10P3 100652840 +MPHOSPH10P4 100631265 +MPHOSPH10P5 100631267 +MPHOSPH10P6 105376698 +MPHOSPH10P7 100533850 +MPHOSPH10P8 100631268 +MPHOSPH10P9 100631266 +MPI 4351 +MPIG6B 80739 +MPL 4352 +MPLKIP 136647 +MPND 84954 +MPO 4353 +MPP1 4354 +MPP2 4355 +MPP3 4356 +MPP4 58538 +MPP7 143098 +MPP7-DT 105376466 +MPPE1 65258 +MPPE1P1 390501 +MPPED1 758 +MPPED2 744 +MPPED2-AS1 105376609 +MPRIP 23164 +MPRIP-AS1 100874529 +MPRIPP1 100421374 +MPST 4357 +MPTX1 649458 +MPV17 4358 +MPV17L 255027 +MPV17L2 84769 +MPV17L2P1 101060056 +MPZ 4359 +MPZL1 9019 +MPZL2 10205 +MPZL3 196264 +MR1 3140 +MRAP 56246 +MRAP-AS1 105372779 +MRAP2 112609 +MRAS 22808 +MRC1 4360 +MRC2 9902 +MRE11 4361 +MRE11P1 4362 +MREG 55686 +MREGP1 106480304 +MRFAP1 93621 +MRFAP1L1 114932 +MRFAP1L2 93622 +MRFAP1P1 105373384 +MRGBP 55257 +MRGPRD 116512 +MRGPRE 116534 +MRGPRF 116535 +MRGPRF-AS1 101928200 +MRGPRG 386746 +MRGPRG-AS1 283303 +MRGPRX1 259249 +MRGPRX2 117194 +MRGPRX3 117195 +MRGPRX4 117196 +MRGPRX5P 390099 +MRGPRX6P 390098 +MRGPRX7P 441592 +MRGPRX8P 100420123 +MRGPRX9P 100420121 +MRGPRX10P 390101 +MRGPRX11P 645415 +MRGPRX12P 645297 +MRGPRX13P 645319 +MRI1 84245 +MRLN 100507027 +MRM1 79922 +MRM2 29960 +MRM3 55178 +MRM3P1 100420295 +MRM3P2 100420223 +MRNIP 51149 +MRNIP-DT 100996419 +MRO 83876 +MROCKI 285758 +MROH1 727957 +MROH2A 339766 +MROH2B 133558 +MROH3P 647215 +MROH4P 101154686 +MROH5 389690 +MROH6 642475 +MROH7 374977 +MROH7-TTC4 100527960 +MROH8 140699 +MROH9 80133 +MRPL1 65008 +MRPL2 51069 +MRPL2P1 347894 +MRPL3 11222 +MRPL3P1 359739 +MRPL4 51073 +MRPL9 65005 +MRPL9P1 137290 +MRPL10 124995 +MRPL11 65003 +MRPL11P2 134008 +MRPL11P3 359734 +MRPL12 6182 +MRPL13 28998 +MRPL14 64928 +MRPL14P1 359735 +MRPL15 29088 +MRPL15P1 359736 +MRPL16 54948 +MRPL17 63875 +MRPL18 29074 +MRPL19 9801 +MRPL20 55052 +MRPL20-AS1 148413 +MRPL20-DT 116435301 +MRPL20P1 359737 +MRPL21 219927 +MRPL22 29093 +MRPL22P1 359738 +MRPL23 6150 +MRPL23-AS1 100133545 +MRPL24 79590 +MRPL27 51264 +MRPL28 10573 +MRPL30 51263 +MRPL30P1 359740 +MRPL30P2 359817 +MRPL32 64983 +MRPL32P1 359741 +MRPL32P2 117751735 +MRPL33 9553 +MRPL34 64981 +MRPL35 51318 +MRPL35P1 359742 +MRPL35P2 359743 +MRPL35P3 359744 +MRPL35P4 359745 +MRPL36 64979 +MRPL36P1 285003 +MRPL37 51253 +MRPL37P1 100420950 +MRPL38 64978 +MRPL39 54148 +MRPL40 64976 +MRPL40P1 645328 +MRPL41 64975 +MRPL42 28977 +MRPL42P1 285415 +MRPL42P2 346116 +MRPL42P3 359746 +MRPL42P4 346470 +MRPL42P5 359821 +MRPL42P6 106480794 +MRPL43 84545 +MRPL44 65080 +MRPL45 84311 +MRPL45P1 359747 +MRPL45P2 653479 +MRPL46 26589 +MRPL47 57129 +MRPL48 51642 +MRPL48P1 221717 +MRPL49 740 +MRPL49P1 359748 +MRPL49P2 346711 +MRPL50 54534 +MRPL50P1 351143 +MRPL50P2 359749 +MRPL50P3 359750 +MRPL50P4 359751 +MRPL51 51258 +MRPL51P1 351773 +MRPL51P2 343819 +MRPL52 122704 +MRPL53 116540 +MRPL53P1 359752 +MRPL54 116541 +MRPL55 128308 +MRPL57 78988 +MRPL57P1 126581 +MRPL57P2 359729 +MRPL57P3 359730 +MRPL57P6 134490 +MRPL57P7 359731 +MRPL57P8 359732 +MRPL57P9 359733 +MRPL57P10 347587 +MRPL58 3396 +MRPS2 51116 +MRPS5 64969 +MRPS5P3 133615 +MRPS5P4 359797 +MRPS6 64968 +MRPS6P1 359780 +MRPS6P2 359781 +MRPS6P4 359782 +MRPS7 51081 +MRPS7P1 359783 +MRPS7P2 341469 +MRPS9 64965 +MRPS9-AS1 101927492 +MRPS9-AS2 102724691 +MRPS10 55173 +MRPS10P1 359753 +MRPS10P2 359802 +MRPS10P5 359754 +MRPS11 64963 +MRPS11P1 128774 +MRPS12 6183 +MRPS14 63931 +MRPS15 64960 +MRPS15P1 359755 +MRPS15P2 359756 +MRPS16 51021 +MRPS16P1 137406 +MRPS16P2 128609 +MRPS16P3 338388 +MRPS17 51373 +MRPS17P1 359803 +MRPS17P3 359757 +MRPS17P5 359758 +MRPS17P6 359759 +MRPS17P7 342776 +MRPS17P9 359760 +MRPS18A 55168 +MRPS18AP1 359761 +MRPS18B 28973 +MRPS18BP1 359762 +MRPS18BP2 359763 +MRPS18C 51023 +MRPS18CP2 286043 +MRPS18CP3 359764 +MRPS18CP4 349842 +MRPS18CP5 359765 +MRPS18CP6 343901 +MRPS18CP7 100288560 +MRPS21 54460 +MRPS21P1 199900 +MRPS21P2 359766 +MRPS21P3 359767 +MRPS21P4 359768 +MRPS21P5 359769 +MRPS21P6 359770 +MRPS21P7 359771 +MRPS21P8 350297 +MRPS21P9 359772 +MRPS22 56945 +MRPS22P1 359773 +MRPS23 51649 +MRPS23P1 352290 +MRPS24 64951 +MRPS24P1 338389 +MRPS25 64432 +MRPS25P1 338390 +MRPS26 64949 +MRPS27 23107 +MRPS28 28957 +MRPS30 10884 +MRPS30-DT 100506674 +MRPS31 10240 +MRPS31P1 351449 +MRPS31P2 341757 +MRPS31P4 100885866 +MRPS31P5 100887750 +MRPS33 51650 +MRPS33P1 148330 +MRPS33P2 359775 +MRPS33P3 359776 +MRPS33P4 359777 +MRPS34 65993 +MRPS35 60488 +MRPS35-DT 107984461 +MRPS35P1 339910 +MRPS35P2 359778 +MRPS35P3 359779 +MRPS36 92259 +MRPS36P1 347705 +MRPS36P2 347706 +MRPS36P3 347704 +MRPS36P4 347702 +MRPS36P5 347703 +MRPS36P6 347707 +MRRF 92399 +MRRFP1 286423 +MRS2 57380 +MRS2P1 100130448 +MRS2P2 729633 +MRTFA 57591 +MRTFA-AS1 101927257 +MRTFB 57496 +MRTO4 51154 +MS4A1 931 +MS4A2 2206 +MS4A3 932 +MS4A4A 51338 +MS4A4E 643680 +MS4A5 64232 +MS4A6A 64231 +MS4A6E 245802 +MS4A7 58475 +MS4A8 83661 +MS4A10 341116 +MS4A12 54860 +MS4A13 503497 +MS4A14 84689 +MS4A15 219995 +MS4A18 728588 +MS4A19P 116435280 +MSANTD1 345222 +MSANTD2 79684 +MSANTD2-AS1 100507283 +MSANTD2P1 100130310 +MSANTD3 91283 +MSANTD3-TMEFF1 100526694 +MSANTD3P1 100420848 +MSANTD4 84437 +MSANTD5 102724657 +MSANTD7 100421372 +MSBP1 4431 +MSBP2 4432 +MSC 9242 +MSC-AS1 100132891 +MSGN1 343930 +MSH2 4436 +MSH2-OT1 644093 +MSH3 4437 +MSH4 4438 +MSH5 4439 +MSH5-SAPCD1 100532732 +MSH6 2956 +MSI1 4440 +MSI2 124540 +MSL1 339287 +MSL2 55167 +MSL3 10943 +MSL3-DT 124905247 +MSL3P1 151507 +MSL3P2 100499191 +MSL3P3 100499192 +MSLN 10232 +MSLNL 401827 +MSMB 4477 +MSMO1 6307 +MSMP 692094 +MSN 4478 +MSNP1 4479 +MSR1 4481 +MSRA 4482 +MSRA-DT 105379234 +MSRB1 51734 +MSRB1P1 441849 +MSRB2 22921 +MSRB3 253827 +MSRB3-AS1 100507065 +MSS51 118490 +MST1 4485 +MST1L 11223 +MST1P2 11209 +MST1R 4486 +MSTN 2660 +MSTO1 55154 +MSTO2P 100129405 +MSX1 4487 +MSX2 4488 +MSX2P1 55545 +MT-7SDNA +MT-ATP6 4508 +MT-ATP8 4509 +MT-ATT +MT-CO1 4512 +MT-CO2 4513 +MT-CO3 4514 +MT-CSB1 +MT-CSB2 +MT-CSB3 +MT-CYB 4519 +MT-HPR +MT-HSP1 +MT-HSP2 +MT-LIPCAR +MT-LSP +MT-ND1 4535 +MT-ND2 4536 +MT-ND3 4537 +MT-ND4 4538 +MT-ND4L 4539 +MT-ND5 4540 +MT-ND6 4541 +MT-OHR +MT-OLR +MT-RNR1 4549 +MT-RNR2 4550 +MT-RNR3 +MT-TA 4553 +MT-TAS +MT-TC 4511 +MT-TD 4555 +MT-TE 4556 +MT-TER +MT-TF 4558 +MT-TFH +MT-TFL +MT-TFX +MT-TFY +MT-TG 4563 +MT-TH 4564 +MT-TI 4565 +MT-TK 4566 +MT-TL1 4567 +MT-TL2 4568 +MT-TM 4569 +MT-TN 4570 +MT-TP 4571 +MT-TQ 4572 +MT-TR 4573 +MT-TS1 4574 +MT-TS2 4575 +MT-TT 4576 +MT-TV 4577 +MT-TW 4578 +MT-TY 4579 +MT1A 4489 +MT1B 4490 +MT1CP 441771 +MT1DP 326343 +MT1E 4493 +MT1F 4494 +MT1G 4495 +MT1H 4496 +MT1HL1 645745 +MT1IP 644314 +MT1JP 4498 +MT1L 4500 +MT1M 4499 +MT1P1 493987 +MT1P3 140851 +MT1X 4501 +MT1XP1 645652 +MT2A 4502 +MT2P1 4503 +MT3 4504 +MT4 84560 +MTA1 9112 +MTA1-DT 100507437 +MTA2 9219 +MTA3 57504 +MTA3P1 100130766 +MTAP 4507 +MTAPP1 100874257 +MTAPP2 100420621 +MTARC1 64757 +MTARC2 54996 +MTARC2P1 127379720 +MTATP6P1 106480796 +MTATP6P2 100287745 +MTATP6P3 106479043 +MTATP6P4 106480797 +MTATP6P5 107403073 +MTATP6P6 106660633 +MTATP6P7 106480798 +MTATP6P8 107131119 +MTATP6P9 106479044 +MTATP6P10 107403069 +MTATP6P11 107075311 +MTATP6P12 107403071 +MTATP6P13 107075272 +MTATP6P14 107075157 +MTATP6P15 107075273 +MTATP6P16 107075158 +MTATP6P17 107075274 +MTATP6P18 107075159 +MTATP6P19 107075275 +MTATP6P20 107075201 +MTATP6P21 107075299 +MTATP6P22 107075202 +MTATP6P23 107075300 +MTATP6P24 107075232 +MTATP6P25 107075203 +MTATP6P26 107075301 +MTATP6P27 107075204 +MTATP6P28 107403070 +MTATP6P29 107075315 +MTATP6P30 107075302 +MTATP6P31 107075205 +MTATP8P1 106480795 +MTATP8P2 106479042 +MTATP8P3 107161229 +MTATP8P4 107080107 +MTBP 27085 +MTCH1 23787 +MTCH1P1 100129577 +MTCH1P2 100129966 +MTCH2 23788 +MTCH2P1 100289118 +MTCH2P2 100132126 +MTCH2P3 100421594 +MTCH2P4 100128523 +MTCL1 23255 +MTCL1P1 100288130 +MTCO1P1 56167 +MTCO1P2 326603 +MTCO1P3 100873205 +MTCO1P4 106480684 +MTCO1P5 106480318 +MTCO1P6 107075137 +MTCO1P7 107075263 +MTCO1P8 107075138 +MTCO1P9 107075139 +MTCO1P10 107075140 +MTCO1P11 107075264 +MTCO1P12 107075141 +MTCO1P13 107105281 +MTCO1P14 107075142 +MTCO1P15 107075265 +MTCO1P16 107105283 +MTCO1P17 107075222 +MTCO1P18 107075143 +MTCO1P19 107075144 +MTCO1P20 107075163 +MTCO1P21 107075164 +MTCO1P22 107075165 +MTCO1P23 107075281 +MTCO1P24 107075166 +MTCO1P25 107075167 +MTCO1P26 107105267 +MTCO1P27 107075168 +MTCO1P28 107075169 +MTCO1P29 107075225 +MTCO1P30 107075170 +MTCO1P31 107075171 +MTCO1P32 107105268 +MTCO1P33 107105269 +MTCO1P34 107105270 +MTCO1P35 107075234 +MTCO1P36 107105272 +MTCO1P37 107105273 +MTCO1P38 107105274 +MTCO1P39 107075282 +MTCO1P40 107075172 +MTCO1P41 107105277 +MTCO1P42 107075283 +MTCO1P43 107075173 +MTCO1P44 107075226 +MTCO1P45 107075174 +MTCO1P46 107075175 +MTCO1P47 107075284 +MTCO1P48 107075176 +MTCO1P49 107075177 +MTCO1P50 107105279 +MTCO1P51 100287067 +MTCO1P52 107075227 +MTCO1P53 107075285 +MTCO1P54 107075178 +MTCO1P55 107075179 +MTCO1P56 107075286 +MTCO1P57 109729155 +MTCO1P58 127482537 +MTCO2P1 140909 +MTCO2P2 100873202 +MTCO2P3 100873203 +MTCO2P4 106480296 +MTCO2P5 107075181 +MTCO2P6 107075266 +MTCO2P7 107075145 +MTCO2P8 107075146 +MTCO2P9 107075267 +MTCO2P10 107161153 +MTCO2P11 107075214 +MTCO2P12 107075310 +MTCO2P13 107403168 +MTCO2P14 107403169 +MTCO2P15 107075147 +MTCO2P16 107075148 +MTCO2P17 107075268 +MTCO2P18 107075149 +MTCO2P19 107075223 +MTCO2P20 107075230 +MTCO2P21 107075191 +MTCO2P22 100289404 +MTCO2P23 107075192 +MTCO2P24 107075193 +MTCO2P25 107075290 +MTCO2P26 107403163 +MTCO2P27 107075291 +MTCO2P28 107126362 +MTCO2P29 107075194 +MTCO2P30 107075195 +MTCO2P31 107075292 +MTCO2P32 107075196 +MTCO2P33 107075197 +MTCO2P34 109729142 +MTCO3P1 404026 +MTCO3P2 100873207 +MTCO3P3 107403237 +MTCO3P4 107075216 +MTCO3P5 107075228 +MTCO3P6 107403235 +MTCO3P7 107075150 +MTCO3P8 107075151 +MTCO3P9 107075269 +MTCO3P10 107075152 +MTCO3P11 107075153 +MTCO3P12 107075270 +MTCO3P13 107075224 +MTCO3P14 107403236 +MTCO3P15 107075154 +MTCO3P16 107075155 +MTCO3P17 107075271 +MTCO3P18 107075215 +MTCO3P19 107075156 +MTCO3P20 107075180 +MTCO3P21 107075162 +MTCO3P22 100289371 +MTCO3P23 107075182 +MTCO3P24 107075217 +MTCO3P25 107403240 +MTCO3P26 107403241 +MTCO3P27 107075183 +MTCO3P28 107075184 +MTCO3P29 107075185 +MTCO3P30 107075229 +MTCO3P31 107075186 +MTCO3P32 107436001 +MTCO3P33 107436003 +MTCO3P34 107436004 +MTCO3P35 107075287 +MTCO3P36 107436006 +MTCO3P37 107436007 +MTCO3P38 107075187 +MTCO3P39 107075313 +MTCO3P40 107075188 +MTCO3P41 107075288 +MTCO3P42 107075189 +MTCO3P43 107075190 +MTCO3P44 107075289 +MTCO3P45 107075218 +MTCO3P46 107075293 +MTCO3P47 127379743 +MTCP1 4515 +MTCYBP1 100499418 +MTCYBP2 100873168 +MTCYBP3 100873204 +MTCYBP4 100873169 +MTCYBP5 107075125 +MTCYBP6 107075259 +MTCYBP7 107075257 +MTCYBP8 107075220 +MTCYBP9 107075124 +MTCYBP10 107075121 +MTCYBP11 107075122 +MTCYBP12 107075123 +MTCYBP13 107075129 +MTCYBP14 107075120 +MTCYBP15 107075258 +MTCYBP16 107075126 +MTCYBP17 107075213 +MTCYBP18 107075130 +MTCYBP19 107075127 +MTCYBP20 107075128 +MTCYBP21 107075260 +MTCYBP22 107075221 +MTCYBP23 107075131 +MTCYBP24 107075132 +MTCYBP25 107403064 +MTCYBP26 107403065 +MTCYBP27 107075133 +MTCYBP28 107075134 +MTCYBP29 107075135 +MTCYBP30 107403066 +MTCYBP31 107075136 +MTCYBP32 107075231 +MTCYBP33 109729143 +MTCYBP34 109729115 +MTCYBP35 109729150 +MTCYBP36 109729116 +MTCYBP37 109729151 +MTCYBP38 109729117 +MTCYBP39 109729152 +MTCYBP40 109729144 +MTCYBP41 109729118 +MTCYBP42 109729153 +MTCYBP43 109729119 +MTCYBP44 109729154 +MTCYBP45 109729120 +MTDH 92140 +MTDHP1 100418814 +MTDHP2 100418835 +MTDHP3 100418832 +MTDHP4 100418834 +MTDHP5 100418836 +MTERF1 7978 +MTERF1P1 101060206 +MTERF2 80298 +MTERF3 51001 +MTERF4 130916 +MTF1 4520 +MTF2 22823 +MTFMT 123263 +MTFP1 51537 +MTFR1 9650 +MTFR1L 56181 +MTFR1P1 100128171 +MTFR2 113115 +MTFR2P1 100421472 +MTFR2P2 100132621 +MTG1 92170 +MTG2 26164 +MTHFD1 4522 +MTHFD1L 25902 +MTHFD1P1 4523 +MTHFD2 10797 +MTHFD2L 441024 +MTHFD2P1 100287639 +MTHFD2P2 106480237 +MTHFD2P3 106481665 +MTHFD2P4 100131135 +MTHFD2P5 442707 +MTHFD2P6 100130042 +MTHFD2P7 442098 +MTHFR 4524 +MTHFS 10588 +MTHFSD 64779 +MTIF2 4528 +MTIF2P1 80713 +MTIF3 219402 +MTL3P 4531 +MTLN 205251 +MTM1 4534 +MTMR1 8776 +MTMR2 8898 +MTMR3 8897 +MTMR4 9110 +MTMR6 9107 +MTMR7 9108 +MTMR8 55613 +MTMR9 66036 +MTMR9LP 339483 +MTMR10 54893 +MTMR11 10903 +MTMR12 54545 +MTMR12P1 100420510 +MTMR14 64419 +MTND1P1 100499468 +MTND1P2 100873170 +MTND1P3 100288984 +MTND1P4 100873171 +MTND1P5 100873174 +MTND1P6 100873173 +MTND1P7 100873172 +MTND1P8 100287461 +MTND1P9 100873221 +MTND1P10 100873343 +MTND1P11 100873212 +MTND1P12 106480744 +MTND1P13 100887745 +MTND1P14 100873337 +MTND1P15 100288998 +MTND1P16 100873213 +MTND1P17 100873342 +MTND1P18 100873338 +MTND1P19 100873220 +MTND1P20 100873339 +MTND1P21 100873340 +MTND1P22 100287591 +MTND1P23 100887749 +MTND1P24 100873341 +MTND1P25 100288950 +MTND1P26 100873214 +MTND1P27 100288227 +MTND1P28 100873215 +MTND1P29 100873216 +MTND1P30 100507157 +MTND1P31 100873217 +MTND1P32 100856881 +MTND1P33 100873218 +MTND1P34 100873219 +MTND1P35 106480433 +MTND1P36 100506721 +MTND1P37 109729170 +MTND2P1 387315 +MTND2P2 56168 +MTND2P3 100499457 +MTND2P4 100873175 +MTND2P5 100873176 +MTND2P6 100873177 +MTND2P7 100873179 +MTND2P8 100873178 +MTND2P9 100884155 +MTND2P10 100873238 +MTND2P11 100873222 +MTND2P12 100873344 +MTND2P13 100873345 +MTND2P14 100873223 +MTND2P15 100873346 +MTND2P16 100873347 +MTND2P17 100873348 +MTND2P18 100873224 +MTND2P19 100873225 +MTND2P20 100873226 +MTND2P21 100873227 +MTND2P22 100873228 +MTND2P23 100873229 +MTND2P24 100873230 +MTND2P25 100873231 +MTND2P26 100873349 +MTND2P27 100873232 +MTND2P28 100652939 +MTND2P29 100873233 +MTND2P30 100873234 +MTND2P31 100873235 +MTND2P32 100873237 +MTND2P33 100873236 +MTND2P34 107161146 +MTND2P35 107161147 +MTND2P36 107161148 +MTND2P37 107161150 +MTND2P38 107075276 +MTND2P39 107075312 +MTND2P40 107075280 +MTND2P41 109729121 +MTND3P1 100873208 +MTND3P2 100873180 +MTND3P3 100873187 +MTND3P4 100873181 +MTND3P5 100873186 +MTND3P6 100873182 +MTND3P7 100873183 +MTND3P8 100873185 +MTND3P9 100873184 +MTND3P10 100873239 +MTND3P11 107161160 +MTND3P12 107075160 +MTND3P13 107075277 +MTND3P14 107161161 +MTND3P15 107161162 +MTND3P16 107075278 +MTND3P17 107075279 +MTND3P18 107161164 +MTND3P19 107075161 +MTND3P20 107075294 +MTND3P21 107075198 +MTND3P22 107075314 +MTND3P23 107075295 +MTND3P24 107075199 +MTND3P25 107075297 +MTND4LP1 106478909 +MTND4LP2 107075098 +MTND4LP3 107075245 +MTND4LP4 107131120 +MTND4LP5 107075235 +MTND4LP6 107131121 +MTND4LP7 107075236 +MTND4LP8 107131124 +MTND4LP9 107075237 +MTND4LP10 107075099 +MTND4LP11 107075238 +MTND4LP12 107075239 +MTND4LP13 107075100 +MTND4LP14 107075305 +MTND4LP15 107131123 +MTND4LP16 107075210 +MTND4LP17 107075240 +MTND4LP18 107075101 +MTND4LP19 107075241 +MTND4LP20 107075242 +MTND4LP21 107075306 +MTND4LP22 107075102 +MTND4LP23 107133487 +MTND4LP24 107075103 +MTND4LP25 107075243 +MTND4LP26 107075104 +MTND4LP27 107133488 +MTND4LP28 107133489 +MTND4LP29 107133490 +MTND4LP30 107075244 +MTND4LP31 107075296 +MTND4LP32 109729156 +MTND4P1 100873211 +MTND4P2 100873188 +MTND4P3 100873189 +MTND4P4 100873190 +MTND4P5 100873191 +MTND4P6 100873192 +MTND4P7 100873195 +MTND4P8 100873194 +MTND4P9 100873193 +MTND4P10 100873256 +MTND4P11 100873255 +MTND4P12 100293090 +MTND4P13 100862853 +MTND4P14 100653489 +MTND4P15 100873240 +MTND4P16 100873241 +MTND4P17 100873242 +MTND4P18 100873350 +MTND4P19 100873351 +MTND4P20 100873352 +MTND4P21 100873243 +MTND4P22 100873244 +MTND4P23 100873245 +MTND4P24 100873254 +MTND4P25 100873246 +MTND4P26 100873247 +MTND4P27 100873248 +MTND4P28 100873249 +MTND4P29 100873250 +MTND4P30 100873251 +MTND4P31 100873252 +MTND4P32 100873253 +MTND4P33 107075253 +MTND4P34 107075308 +MTND4P35 107075117 +MTND4P36 107403074 +MTND4P37 112163599 +MTND4P38 +MTND4P39 112163524 +MTND4P40 112272547 +MTND4P41 111188160 +MTND5P1 100873206 +MTND5P2 100873209 +MTND5P3 100873210 +MTND5P4 100873200 +MTND5P5 100873201 +MTND5P6 100873196 +MTND5P7 100873197 +MTND5P8 100873198 +MTND5P9 100873199 +MTND5P10 643031 +MTND5P11 100506169 +MTND5P12 100873257 +MTND5P13 100873272 +MTND5P14 100873258 +MTND5P15 100873259 +MTND5P16 100862854 +MTND5P17 100873353 +MTND5P18 100873271 +MTND5P19 100873270 +MTND5P20 100873269 +MTND5P21 100873354 +MTND5P22 100873260 +MTND5P23 100873261 +MTND5P24 100873262 +MTND5P25 100873263 +MTND5P26 100873268 +MTND5P27 100873264 +MTND5P28 100505755 +MTND5P29 100873265 +MTND5P30 100873266 +MTND5P31 100873267 +MTND5P32 107075254 +MTND5P33 107075118 +MTND5P34 107075255 +MTND5P35 107075119 +MTND5P36 107133491 +MTND5P37 107133493 +MTND5P38 107133495 +MTND5P39 107133496 +MTND5P40 107075256 +MTND5P41 107075309 +MTND5P42 109729157 +MTND5P43 111188140 +MTND5P44 112163614 +MTND5P45 111188162 +MTND5P46 112390311 +MTND6P1 100499469 +MTND6P2 106478941 +MTND6P3 106478942 +MTND6P4 106478943 +MTND6P5 106480427 +MTND6P6 106478944 +MTND6P7 106478945 +MTND6P8 106480726 +MTND6P9 106478946 +MTND6P10 106478947 +MTND6P11 106480727 +MTND6P12 106481743 +MTND6P13 106480428 +MTND6P14 106478948 +MTND6P15 106478949 +MTND6P16 106478950 +MTND6P17 106480728 +MTND6P18 106478951 +MTND6P19 106481788 +MTND6P20 106478952 +MTND6P21 100873332 +MTND6P22 107075261 +MTND6P23 107133498 +MTND6P24 107063611 +MTND6P25 107075262 +MTND6P26 107133500 +MTND6P27 107133501 +MTND6P28 107133503 +MTND6P29 107133504 +MTND6P30 107133505 +MTND6P31 107133507 +MTND6P32 107075200 +MTND6P33 107075298 +MTND6P34 112268489 +MTND6P35 112163686 +MTND6P36 +MTND6P37 112340375 +MTNR1A 4543 +MTNR1B 4544 +MTO1 25821 +MTOR 2475 +MTOR-AS1 100873935 +MTPAP 55149 +MTPN 136319 +MTR 4548 +MTRES1 51250 +MTRES1P1 100129996 +MTRES1P2 100129168 +MTREX 23517 +MTRF1 9617 +MTRF1L 54516 +MTRF1LP1 100132520 +MTRF1LP2 100130376 +MTRFR 91574 +MTRNR2L1 100462977 +MTRNR2L2 100462981 +MTRNR2L3 100462983 +MTRNR2L4 100463285 +MTRNR2L5 100463289 +MTRNR2L6 100463482 +MTRNR2L7 100288485 +MTRNR2L8 100463486 +MTRNR2L9 100463487 +MTRNR2L10 100463488 +MTRNR2L11 100463489 +MTRNR2L12 100463498 +MTRNR2L13 100463500 +MTRR 4552 +MTSS1 9788 +MTSS2 92154 +MTTP 4547 +MTURN 222166 +MTUS1 57509 +MTUS1-DT 101930275 +MTUS2 23281 +MTUS2-AS1 100874107 +MTUS2-AS2 100874106 +MTX1 4580 +MTX1LP 4581 +MTX2 10651 +MTX2P1 100134507 +MTX3 345778 +MUC1 4582 +MUC2 4583 +MUC3A 4584 +MUC3B 57876 +MUC4 4585 +MUC5AC 4586 +MUC5B 727897 +MUC5B-AS1 112577518 +MUC6 4588 +MUC7 4589 +MUC8 100129528 +MUC12 10071 +MUC12-AS1 102724094 +MUC13 56667 +MUC15 143662 +MUC16 94025 +MUC17 140453 +MUC19 283463 +MUC20 200958 +MUC20-OT1 111753249 +MUC20P1 651714 +MUC21 394263 +MUC22 100507679 +MUCL1 118430 +MUCL3 135656 +MUL1 79594 +MUPP 100129193 +MUS81 80198 +MUSK 4593 +MUSTN1 389125 +MUTYH 4595 +MVB12A 93343 +MVB12B 89853 +MVD 4597 +MVK 4598 +MVP 9961 +MVP-DT 112268170 +MX1 4599 +MX1-AS1 130890644 +MX2 4600 +MXD1 4084 +MXD3 83463 +MXD4 10608 +MXI1 4601 +MXRA5 25878 +MXRA5Y 286544 +MXRA7 439921 +MXRA7P1 100506055 +MXRA8 54587 +MYADM 91663 +MYADM-AS1 105372457 +MYADM-AS2 129810493 +MYADML 151325 +MYADML2 255275 +MYB 4602 +MYB-AS1 100873904 +MYBBP1A 10514 +MYBL1 4603 +MYBL2 4605 +MYBPC1 4604 +MYBPC2 4606 +MYBPC3 4607 +MYBPH 4608 +MYBPHL 343263 +MYC 4609 +MYCBP 26292 +MYCBP2 23077 +MYCBP2-AS1 100874212 +MYCBP2-AS2 100874213 +MYCBPAP 84073 +MYCL 4610 +MYCL-AS1 105378668 +MYCLP1 4611 +MYCLP2 645136 +MYCLP3 9964 +MYCN 4613 +MYCNOS 10408 +MYCNUT 103752554 +MYCT1 80177 +MYD88 4615 +MYDGF 56005 +MYEF2 50804 +MYEOV 26579 +MYF5 4617 +MYF6 4618 +MYG1 60314 +MYG1-AS1 112268097 +MYG1P1 100420770 +MYH1 4619 +MYH2 4620 +MYH3 4621 +MYH4 4622 +MYH6 4624 +MYH7 4625 +MYH7B 57644 +MYH8 4626 +MYH9 4627 +MYH9-DT 105377199 +MYH10 4628 +MYH11 4629 +MYH13 8735 +MYH14 79784 +MYH15 22989 +MYH16 84176 +MYHAS 100128560 +MYL1 4632 +MYL2 4633 +MYL3 4634 +MYL4 4635 +MYL5 4636 +MYL6 4637 +MYL6B 140465 +MYL6B-AS1 120766150 +MYL6BP1 100422437 +MYL6P1 54043 +MYL6P2 100431168 +MYL6P3 100129561 +MYL6P4 642627 +MYL6P5 124685 +MYL7 58498 +MYL9 10398 +MYL10 93408 +MYL11 29895 +MYL12-AS1 104968399 +MYL12A 10627 +MYL12AP1 157667 +MYL12B 103910 +MYL12BP1 645094 +MYL12BP2 391722 +MYL12BP3 442204 +MYLIP 29116 +MYLK 4638 +MYLK-AS1 100506826 +MYLK-AS2 100873940 +MYLK2 85366 +MYLK3 91807 +MYLK4 340156 +MYLKP1 9430 +MYLKP2 100419969 +MYMK 389827 +MYMX 101929726 +MYNN 55892 +MYO1A 4640 +MYO1B 4430 +MYO1B-AS1 122152331 +MYO1C 4641 +MYO1D 4642 +MYO1D-DT 102724715 +MYO1E 4643 +MYO1F 4542 +MYO1G 64005 +MYO1H 283446 +MYO3A 53904 +MYO3B 140469 +MYO3B-AS1 101929753 +MYO5A 4644 +MYO5B 4645 +MYO5BP1 441420 +MYO5BP2 392335 +MYO5BP3 441442 +MYO5C 55930 +MYO6 4646 +MYO7A 4647 +MYO7B 4648 +MYO9A 4649 +MYO9B 4650 +MYO10 4651 +MYO15A 51168 +MYO15B 80022 +MYO16 23026 +MYO16-AS1 100885782 +MYO16-AS2 100874067 +MYO18A 399687 +MYO18B 84700 +MYO18B-AS1 105372963 +MYO19 80179 +MYOC 4653 +MYOCD 93649 +MYOCD-AS1 101928418 +MYOCOS 110806290 +MYOD1 4654 +MYOF 26509 +MYOG 4656 +MYOM1 8736 +MYOM2 9172 +MYOM3 127294 +MYOM3-AS1 107985737 +MYOPARR 114004358 +MYORG 57462 +MYOSLID 105373853 +MYOSLID-AS1 101927865 +MYOT 9499 +MYOZ1 58529 +MYOZ2 51778 +MYOZ3 91977 +MYOZ3-AS1 124901109 +MYPN 84665 +MYPOP 339344 +MYREM 128266840 +MYRF 745 +MYRF-AS1 26070 +MYRFL 196446 +MYRIP 25924 +MYSM1 114803 +MYT1 4661 +MYT1L 23040 +MYT1L-AS1 730811 +MYZAP 100820829 +MZB1 51237 +MZF1 7593 +MZF1-AS1 100131691 +MZT1 440145 +MZT1P1 106480302 +MZT1P2 101929581 +MZT2A 653784 +MZT2B 80097 +N4BP1 9683 +N4BP2 55728 +N4BP2L1 90634 +N4BP2L2 10443 +N4BP2L2-IT2 116828 +N4BP3 23138 +N6AMT1 29104 +NAA10 8260 +NAA11 84779 +NAA15 80155 +NAA16 79612 +NAA20 51126 +NAA20P1 107985691 +NAA25 80018 +NAA30 122830 +NAA35 60560 +NAA38 84316 +NAA40 79829 +NAA50 80218 +NAA50P1 642890 +NAA50P2 127566427 +NAA60 79903 +NAA80 24142 +NAAA 27163 +NAALAD2 10003 +NAALADL1 10004 +NAALADL2 254827 +NAALADL2-AS1 100874245 +NAALADL2-AS2 100874244 +NAALADL2-AS3 100862679 +NAB1 4664 +NAB1P1 286456 +NAB2 4665 +NABP1 64859 +NABP2 79035 +NACA 4666 +NACA2 342538 +NACA3P 389240 +NACA4P 83955 +NACAD 23148 +NACAP2 651144 +NACAP5 645108 +NACAP6 100132778 +NACAP7 101059973 +NACAP8 101928685 +NACAP9 100421926 +NACAP10 100132812 +NACC1 112939 +NACC2 138151 +NADK 65220 +NADK2 133686 +NADK2-AS1 101056700 +NADSYN1 55191 +NAE1 8883 +NAF1 92345 +NAGA 4668 +NAGK 55577 +NAGLU 4669 +NAGPA 51172 +NAGPA-AS1 100507589 +NAGS 162417 +NAIF1 203245 +NAIP 4671 +NAIPP1 728535 +NAIPP2 728519 +NAIPP3 643784 +NAIPP4 653406 +NALCN 259232 +NALCN-AS1 100885778 +NALF1 728215 +NALF1-IT1 100874375 +NALF2 27112 +NALT1 101928483 +NAMA 100996569 +NAMPT 10135 +NAMPT-AS1 128266843 +NAMPTP1 646309 +NAMPTP2 100132712 +NAMPTP3 106480319 +NANOG 79923 +NANOGNB 360030 +NANOGNBP1 100859926 +NANOGNBP2 101060006 +NANOGNBP3 100652831 +NANOGP1 404635 +NANOGP2 414131 +NANOGP3 340217 +NANOGP4 414132 +NANOGP5 414133 +NANOGP6 414134 +NANOGP7 414130 +NANOGP8 388112 +NANOGP9 349386 +NANOGP10 349372 +NANOGP11 414135 +NANOS1 340719 +NANOS2 339345 +NANOS3 342977 +NANP 140838 +NANS 54187 +NAP1L1 4673 +NAP1L1P1 729561 +NAP1L1P2 100128894 +NAP1L1P3 100130335 +NAP1L2 4674 +NAP1L3 4675 +NAP1L4 4676 +NAP1L4P1 728589 +NAP1L4P2 100874319 +NAP1L4P3 730174 +NAP1L5 266812 +NAP1L5P1 100420939 +NAP1L6P 645996 +NAPA 8775 +NAPA-AS1 100505681 +NAPB 63908 +NAPEPLD 222236 +NAPG 8774 +NAPGP1 100288843 +NAPGP2 100422429 +NAPRT 93100 +NAPSA 9476 +NAPSB 256236 +NARF 26502 +NARF-AS1 111082991 +NARF-AS2 105371941 +NARF-IT1 100506001 +NARS1 4677 +NARS1P1 319127 +NARS1P2 100287895 +NARS2 79731 +NASP 4678 +NASPP1 282694 +NAT1 9 +NAT2 10 +NAT8 9027 +NAT8B 51471 +NAT8L 339983 +NAT9 26151 +NAT10 55226 +NAT14 57106 +NAT16 375607 +NATD1 256302 +NATP 11 +NAV1 89796 +NAV2 89797 +NAV2-AS1 100874015 +NAV2-AS2 100874014 +NAV2-AS3 100874013 +NAV2-AS4 399876 +NAV2-AS5 100874012 +NAV2-IT1 100874305 +NAV3 89795 +NAXD 55739 +NAXD-AS1 127138861 +NAXE 128240 +NBAS 51594 +NBAT1 729177 +NBDY 550643 +NBEA 26960 +NBEAL1 65065 +NBEAL2 23218 +NBEAP1 606 +NBEAP2 100418881 +NBEAP3 100418905 +NBEAP4 100418897 +NBEAP5 100418903 +NBEAP6 100418904 +NBL1 4681 +NBN 4683 +NBPF1 55672 +NBPF2P 343381 +NBPF3 84224 +NBPF4 148545 +NBPF5P 100507044 +NBPF6 653149 +NBPF7P 343505 +NBPF8 728841 +NBPF9 400818 +NBPF10 100132406 +NBPF11 200030 +NBPF12 149013 +NBPF13P 644861 +NBPF14 25832 +NBPF15 284565 +NBPF17P 401967 +NBPF18P 441908 +NBPF19 101060226 +NBPF20 100288142 +NBPF21P 205655 +NBPF22P 285622 +NBPF25P 101929780 +NBPF26 101060684 +NBR1 4077 +NBR2 10230 +NCAL1 128193293 +NCALD 83988 +NCAM1 4684 +NCAM1-AS1 100288346 +NCAM2 4685 +NCAN 1463 +NCAPD2 9918 +NCAPD2P1 100421175 +NCAPD3 23310 +NCAPG 64151 +NCAPG2 54892 +NCAPGP1 100421096 +NCAPGP2 100421148 +NCAPH 23397 +NCAPH2 29781 +NCBP1 4686 +NCBP2 22916 +NCBP2-AS1 100874001 +NCBP2AS2 152217 +NCBP2L 392517 +NCBP3 55421 +NCCRP1 342897 +NCDN 23154 +NCEH1 57552 +NCF1 653361 +NCF1B 654816 +NCF1C 654817 +NCF2 4688 +NCF4 4689 +NCF4-AS1 107985578 +NCK1 4690 +NCK1-DT 101927597 +NCK2 8440 +NCKAP1 10787 +NCKAP1L 3071 +NCKAP1P1 101060152 +NCKAP5 344148 +NCKAP5-AS1 101928185 +NCKAP5-AS2 101928161 +NCKAP5-IT1 100874346 +NCKAP5L 57701 +NCKIPSD 51517 +NCL 4691 +NCLN 56926 +NCLP1 100302751 +NCLP2 100379142 +NCMAP 400746 +NCMAP-DT 100506985 +NCOA1 8648 +NCOA2 10499 +NCOA3 8202 +NCOA4 8031 +NCOA4P1 326605 +NCOA4P2 728333 +NCOA4P3 729497 +NCOA4P4 642262 +NCOA5 57727 +NCOA5LP 118568822 +NCOA6 23054 +NCOA7 135112 +NCOA7-AS1 104355145 +NCOR1 9611 +NCOR1P1 149934 +NCOR1P2 729490 +NCOR1P3 100874183 +NCOR1P4 105379511 +NCOR2 9612 +NCR1 9437 +NCR2 9436 +NCR3 259197 +NCR3LG1 374383 +NCRUPAR 100302746 +NCS1 23413 +NCSTN 23385 +NCSTNP1 100873743 +NDC1 55706 +NDC80 10403 +NDE1 54820 +NDE1P1 100422372 +NDE1P2 106480247 +NDEL1 81565 +NDFIP1 80762 +NDFIP1P1 100420792 +NDFIP2 54602 +NDFIP2-AS1 100874208 +NDN 4692 +NDNF 79625 +NDNF-AS1 105377400 +NDOR1 27158 +NDP 4693 +NDP-AS1 100873919 +NDRG1 10397 +NDRG2 57447 +NDRG3 57446 +NDRG4 65009 +NDST1 3340 +NDST1-AS1 102546298 +NDST2 8509 +NDST3 9348 +NDST4 64579 +NDUFA1 4694 +NDUFA2 4695 +NDUFA3 4696 +NDUFA3P1 100131388 +NDUFA3P2 106479051 +NDUFA3P3 644482 +NDUFA3P4 106480806 +NDUFA3P5 112272577 +NDUFA3P6 106479052 +NDUFA4 4697 +NDUFA4L2 56901 +NDUFA4P1 360165 +NDUFA4P2 100287880 +NDUFA5 4698 +NDUFA5P1 4699 +NDUFA5P2 102724035 +NDUFA5P3 100288035 +NDUFA5P4 100128136 +NDUFA5P5 100130327 +NDUFA5P6 100288339 +NDUFA5P7 106481784 +NDUFA5P8 103091863 +NDUFA5P9 100289579 +NDUFA5P10 102724853 +NDUFA5P11 102724866 +NDUFA5P12 100288013 +NDUFA6 4700 +NDUFA6-DT 100132273 +NDUFA7 4701 +NDUFA8 4702 +NDUFA8P1 107075207 +NDUFA9 4704 +NDUFA9P1 266625 +NDUFA10 4705 +NDUFA11 126328 +NDUFA12 55967 +NDUFA12P1 100527945 +NDUFA13 51079 +NDUFAB1 4706 +NDUFAB1P1 107075303 +NDUFAF1 51103 +NDUFAF2 91942 +NDUFAF2P1 727919 +NDUFAF2P2 100130783 +NDUFAF3 25915 +NDUFAF4 29078 +NDUFAF4P1 100306975 +NDUFAF4P2 402676 +NDUFAF4P3 100422532 +NDUFAF4P4 100128889 +NDUFAF5 79133 +NDUFAF6 137682 +NDUFAF7 55471 +NDUFAF8 284184 +NDUFB1 4707 +NDUFB1P1 100190952 +NDUFB1P2 100380272 +NDUFB2 4708 +NDUFB2-AS1 100134713 +NDUFB2P1 107075208 +NDUFB3 4709 +NDUFB3P1 93993 +NDUFB3P2 93994 +NDUFB3P3 93996 +NDUFB3P4 93995 +NDUFB3P5 93997 +NDUFB4 4710 +NDUFB4P1 100288654 +NDUFB4P2 100132036 +NDUFB4P3 100288420 +NDUFB4P4 107075092 +NDUFB4P5 107075096 +NDUFB4P6 107075097 +NDUFB4P7 107075094 +NDUFB4P8 107075246 +NDUFB4P9 107075211 +NDUFB4P10 107075105 +NDUFB4P11 107075247 +NDUFB4P12 402175 +NDUFB5 4711 +NDUFB5P1 100288337 +NDUFB5P2 100422431 +NDUFB6 4712 +NDUFB7 4713 +NDUFB8 4714 +NDUFB8P1 326606 +NDUFB8P2 729565 +NDUFB8P3 100132286 +NDUFB9 4715 +NDUFB9P1 106050037 +NDUFB9P2 100128596 +NDUFB9P3 100129370 +NDUFB10 4716 +NDUFB10P1 100128711 +NDUFB10P2 107075304 +NDUFB11 54539 +NDUFB11P1 390239 +NDUFC1 4717 +NDUFC2 4718 +NDUFC2-KCTD14 100532726 +NDUFS1 4719 +NDUFS2 4720 +NDUFS3 4722 +NDUFS4 4724 +NDUFS5 4725 +NDUFS5P1 100996944 +NDUFS5P2 100286918 +NDUFS5P3 100288149 +NDUFS5P4 100287817 +NDUFS5P5 100128177 +NDUFS5P6 106480785 +NDUFS5P7 100130794 +NDUFS6 4726 +NDUFS6P1 107075209 +NDUFS7 374291 +NDUFS8 4728 +NDUFV1 4723 +NDUFV1-DT 100505621 +NDUFV2 4729 +NDUFV2-AS1 101927275 +NDUFV2P1 4730 +NDUFV3 4731 +NEAT1 283131 +NEB 4703 +NEBL 10529 +NEBL-AS1 100128511 +NECAB1 64168 +NECAB2 54550 +NECAB3 63941 +NECAP1 25977 +NECAP1P1 442668 +NECAP1P2 106479026 +NECAP2 55707 +NECTIN1 5818 +NECTIN1-AS1 105369525 +NECTIN1-DT 102724301 +NECTIN2 5819 +NECTIN2P1 127379749 +NECTIN3 25945 +NECTIN3-AS1 100506555 +NECTIN4 81607 +NECTIN4-AS1 105371471 +NEDD1 121441 +NEDD4 4734 +NEDD4L 23327 +NEDD8 4738 +NEDD8-MDP1 100528064 +NEDD8P1 100128775 +NEDD9 4739 +NEFH 4744 +NEFHP1 339396 +NEFL 4747 +NEFLP1 359795 +NEFM 4741 +NEFMP1 100420737 +NEGR1 257194 +NEGR1-IT1 100852409 +NEIL1 79661 +NEIL2 252969 +NEIL3 55247 +NEK1 4750 +NEK2 4751 +NEK2-DT 91548 +NEK2P1 326302 +NEK2P2 100379667 +NEK2P3 100158258 +NEK2P4 100381202 +NEK3 4752 +NEK4 6787 +NEK4P1 100421718 +NEK4P2 100421734 +NEK4P3 100421728 +NEK5 341676 +NEK6 10783 +NEK7 140609 +NEK8 284086 +NEK9 91754 +NEK10 152110 +NEK11 79858 +NELFA 7469 +NELFB 25920 +NELFCD 51497 +NELFE 7936 +NELL1 4745 +NELL2 4753 +NEMF 9147 +NEMP1 23306 +NEMP2 100131211 +NEMP2-DT 105376748 +NENF 29937 +NENFP1 106480294 +NENFP2 100129880 +NENFP3 106481703 +NEO1 4756 +NEPNP 442253 +NEPRO 25871 +NEPRO-AS1 102723430 +NES 10763 +NET1 10276 +NETO1 81832 +NETO1-DT 100505797 +NETO2 81831 +NEU1 4758 +NEU2 4759 +NEU3 10825 +NEU4 129807 +NEURL1 9148 +NEURL1-AS1 102724341 +NEURL1B 54492 +NEURL2 140825 +NEURL3 93082 +NEURL4 84461 +NEUROD1 4760 +NEUROD2 4761 +NEUROD4 58158 +NEUROD6 63974 +NEUROG1 4762 +NEUROG2 63973 +NEUROG2-AS1 105377372 +NEUROG3 50674 +NEXMIF 340533 +NEXN 91624 +NEXN-AS1 374987 +NF1 4763 +NF1P1 100419006 +NF1P2 440225 +NF1P3 4764 +NF1P4 100419029 +NF1P5 4768 +NF1P6 644637 +NF1P7 100158257 +NF1P8 401007 +NF1P9 101930150 +NF1P10 106480348 +NF1P11 106481736 +NF1P12 100418983 +NF2 4771 +NFAM1 150372 +NFASC 23114 +NFAT5 10725 +NFATC1 4772 +NFATC2 4773 +NFATC2IP 84901 +NFATC2IP-AS1 123706545 +NFATC3 4775 +NFATC4 4776 +NFE2 4778 +NFE2L1 4779 +NFE2L1-DT 116435298 +NFE2L2 4780 +NFE2L3 9603 +NFE2L3P1 642996 +NFE2L3P2 100272146 +NFE4 58160 +NFIA 4774 +NFIA-AS1 645030 +NFIA-AS2 100996570 +NFIB 4781 +NFIB-AS1 123706550 +NFIC 4782 +NFIL3 4783 +NFILZ 105372267 +NFIX 4784 +NFKB1 4790 +NFKB2 4791 +NFKBIA 4792 +NFKBIB 4793 +NFKBID 84807 +NFKBIE 4794 +NFKBIL1 4795 +NFKBIZ 64332 +NFRKB 4798 +NFS1 9054 +NFU1 27247 +NFU1P1 100132681 +NFU1P2 100132699 +NFX1 4799 +NFXL1 152518 +NFYA 4800 +NFYAP1 100130677 +NFYB 4801 +NFYBP1 440973 +NFYC 4802 +NFYC-AS1 100130557 +NFYCP1 100128345 +NFYCP2 494127 +NGB 58157 +NGDN 25983 +NGEF 25791 +NGF 4803 +NGF-AS1 112840934 +NGFR 4804 +NGFR-AS1 100288866 +NGLY1 55768 +NGRN 51335 +NGRNP1 730129 +NGRNP2 100131890 +NGRNP3 402634 +NHEG1 100294720 +NHEJ1 79840 +NHERF1 9368 +NHERF2 9351 +NHERF4 79849 +NHIP 105373085 +NHLH1 4807 +NHLH2 4808 +NHLRC1 378884 +NHLRC2 374354 +NHLRC3 387921 +NHLRC4 283948 +NHP2 55651 +NHP2P1 414200 +NHP2P2 442290 +NHS 4810 +NHS-AS1 100873920 +NHSL1 57224 +NHSL1-AS1 441172 +NHSL2 340527 +NIBAN1 116496 +NIBAN2 64855 +NIBAN3 199786 +NICN1 84276 +NICN2P 171176 +NICOL1 401115 +NID1 4811 +NID2 22795 +NIF3L1 60491 +NIFK 84365 +NIFK-AS1 254128 +NIFKP1 401825 +NIFKP2 645398 +NIFKP3 100270648 +NIFKP4 100128707 +NIFKP5 100128397 +NIFKP6 100132796 +NIFKP7 106479049 +NIFKP8 642907 +NIFKP9 106480805 +NIHCOLE 107986389 +NIM1K 167359 +NIN 51199 +NINJ1 4814 +NINJ2 4815 +NINJ2-AS1 100049716 +NINL 22981 +NIP7 51388 +NIP7P1 389997 +NIP7P2 646392 +NIP7P3 100421245 +NIPA1 123606 +NIPA2 81614 +NIPA2P1 100132321 +NIPA2P2 100130204 +NIPA2P3 100128057 +NIPA2P4 100421776 +NIPA2P5 100874488 +NIPAL1 152519 +NIPAL2 79815 +NIPAL2-AS1 105375660 +NIPAL3 57185 +NIPAL4 348938 +NIPAL4-DT 102724404 +NIPBL 25836 +NIPBL-DT 646719 +NIPSNAP1 8508 +NIPSNAP2 2631 +NIPSNAP3A 25934 +NIPSNAP3B 55335 +NISCH 11188 +NIT1 4817 +NIT2 56954 +NKAIN1 79570 +NKAIN1P1 100462647 +NKAIN1P2 100462648 +NKAIN2 154215 +NKAIN3 286183 +NKAIN4 128414 +NKAP 79576 +NKAPD1 55216 +NKAPL 222698 +NKAPP1 158801 +NKD1 85407 +NKD2 85409 +NKG7 4818 +NKILA 105416157 +NKIRAS1 28512 +NKIRAS2 28511 +NKPD1 284353 +NKRF 55922 +NKTR 4820 +NKX1-1 54729 +NKX1-2 390010 +NKX2-1 7080 +NKX2-1-AS1 100506237 +NKX2-2 4821 +NKX2-2-AS1 100874189 +NKX2-3 159296 +NKX2-4 644524 +NKX2-5 1482 +NKX2-6 137814 +NKX2-8 26257 +NKX3-1 4824 +NKX3-2 579 +NKX6-1 4825 +NKX6-2 84504 +NKX6-3 157848 +NLE1 54475 +NLGN1 22871 +NLGN1-AS1 100874010 +NLGN2 57555 +NLGN3 54413 +NLGN4X 57502 +NLGN4Y 22829 +NLGN4Y-AS1 100874056 +NLK 51701 +NLN 57486 +NLRC3 197358 +NLRC4 58484 +NLRC5 84166 +NLRP1 22861 +NLRP2 55655 +NLRP2B 286430 +NLRP3 114548 +NLRP3P1 347402 +NLRP4 147945 +NLRP5 126206 +NLRP6 171389 +NLRP7 199713 +NLRP7P1 100421039 +NLRP8 126205 +NLRP9 338321 +NLRP9P1 347933 +NLRP10 338322 +NLRP11 204801 +NLRP12 91662 +NLRP13 126204 +NLRP14 338323 +NLRX1 79671 +NMB 4828 +NMBR 4829 +NMBR-AS1 111216274 +NMD3 51068 +NMD3P1 441238 +NMD3P2 100286929 +NME1 4830 +NME1-NME2 654364 +NME1P1 100874501 +NME2 4831 +NME2P1 283458 +NME2P2 100289315 +NME2P3 100288125 +NME3 4832 +NME4 4833 +NME5 8382 +NME6 10201 +NME7 29922 +NME8 51314 +NME9 347736 +NMI 9111 +NMNAT1 64802 +NMNAT1P1 326607 +NMNAT1P2 100129160 +NMNAT1P3 391603 +NMNAT1P4 100132841 +NMNAT1P5 100129256 +NMNAT2 23057 +NMNAT3 349565 +NMRAL1 57407 +NMRAL2P 344887 +NMRK1 54981 +NMRK2 27231 +NMS 129521 +NMT1 4836 +NMT2 9397 +NMTRL-TAA1-1 100189325 +NMTRL-TAA2-1 100189522 +NMTRL-TAA3-1 100189520 +NMTRL-TAA4-1 100189377 +NMTRL-TAA5-1 100189466 +NMTRL-TAA6-1 100189456 +NMTRP-TGG1-1 100189463 +NMTRQ-CTG1-1 100189461 +NMTRQ-TTG1-1 100189475 +NMTRQ-TTG2-1 100189516 +NMTRQ-TTG3-1 100189215 +NMTRQ-TTG4-1 100189489 +NMTRQ-TTG5-1 100189397 +NMTRQ-TTG6-1 100189510 +NMTRQ-TTG7-1 100189445 +NMTRQ-TTG8-1 100189448 +NMTRQ-TTG9-1 100189451 +NMTRQ-TTG10-1 100189524 +NMTRQ-TTG11-1 100189501 +NMTRQ-TTG12-1 100189478 +NMTRQ-TTG13-1 100189535 +NMTRQ-TTG14-1 100189058 +NMTRQ-TTG15-1 100189540 +NMTRS-TGA1-1 100189055 +NMTRS-TGA2-1 100189525 +NMTRS-TGA3-1 100189512 +NMTRV-TAC1-1 100189513 +NMU 10874 +NMUR1 10316 +NMUR2 56923 +NNAT 4826 +NNMT 4837 +NNT 23530 +NNT-AS1 100652772 +NOA1 84273 +NOB1 28987 +NOBOX 135935 +NOC2L 26155 +NOC2LP1 643276 +NOC2LP2 401010 +NOC3L 64318 +NOC4L 79050 +NOCT 25819 +NOD1 10392 +NOD2 64127 +NODAL 4838 +NOG 9241 +NOL3 8996 +NOL4 8715 +NOL4L 140688 +NOL4L-DT 149950 +NOL6 65083 +NOL7 51406 +NOL8 55035 +NOL8P1 402191 +NOL9 79707 +NOL10 79954 +NOL11 25926 +NOL12 79159 +NOLC1 9221 +NOLC1P1 392426 +NOM1 64434 +NOMO1 23420 +NOMO2 283820 +NOMO3 408050 +NONO 4841 +NONOP1 644035 +NONOP2 100271700 +NOP2 4839 +NOP9 161424 +NOP10 55505 +NOP14 8602 +NOP14-AS1 317648 +NOP16 51491 +NOP53 29997 +NOP53-AS1 106144593 +NOP56 10528 +NOP56P1 646192 +NOP56P2 402360 +NOP56P3 106481967 +NOP58 51602 +NOPCHAP1 121053 +NORAD 647979 +NOS1 4842 +NOS1AP 9722 +NOS2 4843 +NOS2P1 645740 +NOS2P2 201288 +NOS2P3 339256 +NOS2P4 266619 +NOS3 4846 +NOSIP 51070 +NOSTRIN 115677 +NOTCH1 4851 +NOTCH2 4853 +NOTCH2NLA 388677 +NOTCH2NLB 100996763 +NOTCH2NLC 100996717 +NOTCH2NLR 101929796 +NOTCH2P1 100420260 +NOTCH3 4854 +NOTCH4 4855 +NOTO 344022 +NOTUM 147111 +NOVA1 4857 +NOVA1-DT 102725045 +NOVA2 4858 +NOX1 27035 +NOX3 50508 +NOX4 50507 +NOX4P1 729960 +NOX5 79400 +NOXA1 10811 +NOXO1 124056 +NOXRED1 122945 +NPAP1 23742 +NPAP1L 729159 +NPAP1P1 100420827 +NPAP1P2 100420829 +NPAP1P3 100420830 +NPAP1P4 100533674 +NPAP1P5 100420671 +NPAP1P6 100533675 +NPAP1P7 107161163 +NPAP1P8 100420670 +NPAP1P9 392364 +NPAS1 4861 +NPAS2 4862 +NPAS2-AS1 101927142 +NPAS3 64067 +NPAS4 266743 +NPAT 4863 +NPB 256933 +NPBWR1 2831 +NPBWR2 2832 +NPC1 4864 +NPC1L1 29881 +NPC2 10577 +NPDC1 56654 +NPEPL1 79716 +NPEPPS 9520 +NPEPPSP1 440434 +NPEPPSP2 127379737 +NPFF 8620 +NPFFR1 64106 +NPFFR2 10886 +NPHP1 4867 +NPHP3 27031 +NPHP3-ACAD11 100532724 +NPHP3-AS1 348808 +NPHP4 261734 +NPHS1 4868 +NPHS2 7827 +NPIPA1 9284 +NPIPA2 642799 +NPIPA3 642778 +NPIPA5 100288332 +NPIPA7 101059938 +NPIPA8 101059953 +NPIPA9 105376752 +NPIPB1P 729602 +NPIPB2 729978 +NPIPB3 23117 +NPIPB4 440345 +NPIPB5 100132247 +NPIPB6 728741 +NPIPB7 440350 +NPIPB8 728734 +NPIPB9 100507607 +NPIPB10P 730153 +NPIPB11 728888 +NPIPB12 440353 +NPIPB13 613037 +NPIPB14P 109729168 +NPIPB15 440348 +NPIPP1 100874381 +NPL 80896 +NPLOC4 55666 +NPLP1 100529111 +NPM1 4869 +NPM1P1 4870 +NPM1P2 4871 +NPM1P3 4872 +NPM1P4 100128903 +NPM1P5 4874 +NPM1P6 4875 +NPM1P7 10831 +NPM1P8 100130233 +NPM1P9 392428 +NPM1P10 10837 +NPM1P11 10836 +NPM1P12 10835 +NPM1P13 10834 +NPM1P14 10833 +NPM1P17 10830 +NPM1P18 10829 +NPM1P19 10828 +NPM1P20 326608 +NPM1P21 100129237 +NPM1P22 390411 +NPM1P23 100422256 +NPM1P24 100422312 +NPM1P25 399804 +NPM1P26 100422313 +NPM1P27 100422243 +NPM1P28 646849 +NPM1P29 100422259 +NPM1P30 101928904 +NPM1P31 100287472 +NPM1P32 440902 +NPM1P33 100131478 +NPM1P34 100128410 +NPM1P35 100129067 +NPM1P36 652423 +NPM1P37 100422261 +NPM1P38 100128985 +NPM1P39 440577 +NPM1P40 100289584 +NPM1P41 100422249 +NPM1P42 729686 +NPM1P43 100422309 +NPM1P44 100422270 +NPM1P45 100422316 +NPM1P46 729342 +NPM1P47 100129972 +NPM1P48 442006 +NPM1P49 100422284 +NPM1P50 100129795 +NPM1P51 100130606 +NPM1P52 100422272 +NPM2 10361 +NPM3 10360 +NPNT 255743 +NPPA 4878 +NPPA-AS1 100379251 +NPPB 4879 +NPPC 4880 +NPR1 4881 +NPR2 4882 +NPR3 4883 +NPRL2 10641 +NPRL3 8131 +NPS 594857 +NPSR1 387129 +NPSR1-AS1 404744 +NPTN 27020 +NPTN-IT1 101241892 +NPTX1 4884 +NPTX2 4885 +NPTXR 23467 +NPVF 64111 +NPW 283869 +NPY 4852 +NPY1R 4886 +NPY2R 4887 +NPY2R-AS1 107986321 +NPY4R 5540 +NPY4R2 100996758 +NPY5R 4889 +NPY6R 4888 +NQO1 1728 +NQO1-DT 119139903 +NQO2 4835 +NQO2-AS1 105374888 +NR1D1 9572 +NR1D2 9975 +NR1H2 7376 +NR1H3 10062 +NR1H4 9971 +NR1H5P 643609 +NR1I2 8856 +NR1I3 9970 +NR1I4 22817 +NR2C1 7181 +NR2C2 7182 +NR2C2AP 126382 +NR2E1 7101 +NR2E3 10002 +NR2F1 7025 +NR2F1-AS1 441094 +NR2F2 7026 +NR2F2-AS1 644192 +NR2F6 2063 +NR3C1 2908 +NR3C1P1 2910 +NR3C2 4306 +NR4A1 3164 +NR4A1AS 115409980 +NR4A2 4929 +NR4A3 8013 +NR5A1 2516 +NR5A2 2494 +NR6A1 2649 +NRAD1 121838 +NRADDP 100129354 +NRAL 128071539 +NRAP 4892 +NRARP 441478 +NRAS 4893 +NRAV 100506668 +NR0B1 190 +NR0B2 8431 +NRBF2 29982 +NRBF2P1 648532 +NRBF2P2 100114903 +NRBF2P3 643232 +NRBF2P4 728381 +NRBF2P5 100118954 +NRBF2P6 730069 +NRBP1 29959 +NRBP2 340371 +NRCAM 4897 +NRDC 4898 +NRDE2 55051 +NREP 9315 +NREP-AS1 100873948 +NRF1 4899 +NRG1 3084 +NRG1-IT1 100856811 +NRG1-IT3 100874286 +NRG2 9542 +NRG3 10718 +NRG3-AS1 101929590 +NRG4 145957 +NRGN 4900 +NRIP1 8204 +NRIP2 83714 +NRIP3 56675 +NRIP3-DT 105376541 +NRIR 104326052 +NRK 203447 +NRL 4901 +NRM 11270 +NRN1 51299 +NRN1L 123904 +NRON 641373 +NRP1 8829 +NRP2 8828 +NRP2-AS1 130890645 +NRROS 375387 +NRSN1 140767 +NRSN2 80023 +NRSN2-AS1 100507459 +NRTN 4902 +NRXN1 9378 +NRXN1-DT 730100 +NRXN2 9379 +NRXN2-AS1 107984337 +NRXN3 9369 +NSA2 10412 +NSA2P1 100421749 +NSA2P2 400061 +NSA2P3 100132658 +NSA2P4 100421765 +NSA2P5 100421689 +NSA2P6 100421721 +NSA2P7 100421693 +NSD1 64324 +NSD2 7468 +NSD3 54904 +NSDHL 50814 +NSF 4905 +NSFL1C 55968 +NSFP1 728806 +NSG1 27065 +NSG2 51617 +NSL1 25936 +NSMAF 8439 +NSMCE1 197370 +NSMCE1-DT 400512 +NSMCE2 286053 +NSMCE3 56160 +NSMCE4A 54780 +NSMF 26012 +NSRP1 84081 +NSRP1P1 100420557 +NSUN2 54888 +NSUN3 63899 +NSUN4 387338 +NSUN5 55695 +NSUN5P1 155400 +NSUN5P2 260294 +NSUN6 221078 +NSUN7 79730 +NT5C 30833 +NT5C1A 84618 +NT5C1B 93034 +NT5C1B-RDH14 100526794 +NT5C2 22978 +NT5C3A 51251 +NT5C3AP1 90859 +NT5C3AP2 100420394 +NT5C3B 115024 +NT5CP1 326609 +NT5CP2 326611 +NT5CP3 100420457 +NT5DC1 221294 +NT5DC1P1 100131340 +NT5DC1P2 402425 +NT5DC2 64943 +NT5DC3 51559 +NT5DC4 284958 +NT5E 4907 +NT5ELP 118568826 +NT5M 56953 +NTAN1 123803 +NTAN1P1 100420389 +NTAN1P2 100420307 +NTAN1P3 100420356 +NTAQ1 55093 +NTF3 4908 +NTF4 4909 +NTF6A 4910 +NTF6B 4911 +NTF6G 4912 +NTHL1 4913 +NTM 50863 +NTM-AS1 101929637 +NTM-IT 100874281 +NTMT1 28989 +NTMT2 149281 +NTN1 9423 +NTN3 4917 +NTN4 59277 +NTN5 126147 +NTNG1 22854 +NTNG2 84628 +NTPCR 84284 +NTRAS 105748977 +NTRK1 4914 +NTRK2 4915 +NTRK3 4916 +NTRK3-AS1 283738 +NTS 4922 +NTSR1 4923 +NTSR2 23620 +NUAK1 9891 +NUAK2 81788 +NUB1 51667 +NUBP1 4682 +NUBP2 10101 +NUBPL 80224 +NUBPL-DT 105370437 +NUCB1 4924 +NUCB1-AS1 100874085 +NUCB2 4925 +NUCKS1 64710 +NUCKS1P1 100130466 +NUDC 10726 +NUDCD1 84955 +NUDCD2 134492 +NUDCD3 23386 +NUDCP1 10790 +NUDCP2 10789 +NUDT1 4521 +NUDT2 318 +NUDT3 11165 +NUDT4 11163 +NUDT4B 440672 +NUDT4P2 170688 +NUDT5 11164 +NUDT6 11162 +NUDT7 283927 +NUDT8 254552 +NUDT9 53343 +NUDT9P1 119369 +NUDT10 170685 +NUDT11 55190 +NUDT12 83594 +NUDT13 25961 +NUDT14 256281 +NUDT15 55270 +NUDT15P1 574532 +NUDT15P2 574533 +NUDT16 131870 +NUDT16-DT 339874 +NUDT16L1 84309 +NUDT16L2P 152195 +NUDT17 200035 +NUDT18 79873 +NUDT19 390916 +NUDT19-DT 118827810 +NUDT19P1 100126008 +NUDT19P2 100422458 +NUDT19P3 100422450 +NUDT19P4 100422452 +NUDT19P5 100422445 +NUDT19P6 107985644 +NUDT21 11051 +NUDT21P1 100422467 +NUDT22 84304 +NUF2 83540 +NUFIP1 26747 +NUFIP1P1 89761 +NUFIP2 57532 +NUGGC 389643 +NUMA1 4926 +NUMB 8650 +NUMBL 9253 +NUP35 129401 +NUP35P1 100419066 +NUP35P2 101059916 +NUP37 79023 +NUP42 11097 +NUP43 348995 +NUP50 10762 +NUP50-DT 100506714 +NUP50P1 145375 +NUP50P2 266785 +NUP50P3 266786 +NUP50P4 100127900 +NUP54 53371 +NUP58 9818 +NUP58P1 100289295 +NUP62 23636 +NUP62CL 54830 +NUP85 79902 +NUP88 4927 +NUP93 9688 +NUP93-DT 105371286 +NUP98 4928 +NUP107 57122 +NUP107-DT 100507250 +NUP133 55746 +NUP133-DT 101927478 +NUP153 9972 +NUP153-AS1 105374952 +NUP155 9631 +NUP160 23279 +NUP188 23511 +NUP205 23165 +NUP210 23225 +NUP210L 91181 +NUP210P1 255330 +NUP210P2 100129929 +NUP210P3 100419070 +NUP214 8021 +NUPR1 26471 +NUPR2 389493 +NUPR2P1 129810496 +NUS1 116150 +NUS1P1 729148 +NUS1P2 646208 +NUS1P3 11049 +NUS1P4 100130167 +NUSAP1 51203 +NUTF2 10204 +NUTF2P2 326613 +NUTF2P3 106480298 +NUTF2P4 128322 +NUTF2P5 106481706 +NUTF2P6 100131623 +NUTF2P7 100287868 +NUTF2P8 100287183 +NUTM1 256646 +NUTM2A 728118 +NUTM2A-AS1 728190 +NUTM2B 729262 +NUTM2B-AS1 101060691 +NUTM2D 728130 +NUTM2E 283008 +NUTM2F 54754 +NUTM2G 441457 +NUTM2HP 729023 +NVL 4931 +NWD1 284434 +NWD2 57495 +NXF1 10482 +NXF2 56001 +NXF2B 728343 +NXF3 56000 +NXF4 55999 +NXF5 55998 +NXN 64359 +NXNL1 115861 +NXNL2 158046 +NXNP1 100130251 +NXPE1 120400 +NXPE2 120406 +NXPE2P1 101926945 +NXPE3 91775 +NXPE4 54827 +NXPH1 30010 +NXPH2 11249 +NXPH3 11248 +NXPH4 11247 +NXT1 29107 +NXT1-AS1 105372572 +NXT1P1 100652801 +NXT2 55916 +NXTAR 105373241 +NYAP1 222950 +NYAP2 57624 +NYNRIN 57523 +NYX 60506 +OACYLP 390858 +OAF 220323 +OARD1 221443 +OAS1 4938 +OAS2 4939 +OAS3 4940 +OASL 8638 +OASL2P 111216278 +OAT 4942 +OATP1 4945 +OAZ1 4946 +OAZ1P1 728602 +OAZ2 4947 +OAZ3 51686 +OBI1 79596 +OBI1-AS1 100874222 +OBP2A 29991 +OBP2B 29989 +OBSCN 84033 +OBSCN-AS1 574407 +OBSL1 23363 +OC90 729330 +OCA2 4948 +OCEL1 79629 +OCIAD1 54940 +OCIAD1-AS1 100861517 +OCIAD2 132299 +OCIAD2P1 100287085 +OCLN 100506658 +OCLNP1 647859 +OCM 654231 +OCM2 4951 +OCRL 4952 +OCSTAMP 128506 +ODAD1 93233 +ODAD2 55130 +ODAD2P1 101060171 +ODAD3 115948 +ODAD4 83538 +ODAM 54959 +ODAPH 152816 +ODC1 4953 +ODC1-DT 101929715 +ODCP 4954 +ODF1 4956 +ODF2 4957 +ODF2-AS1 107080620 +ODF2L 57489 +ODF4 146852 +ODR4 54953 +OFCC1 266553 +OFD1 8481 +OFD1P1Y 378009 +OFD1P2Y 378010 +OFD1P3Y 386687 +OFD1P4Y 386688 +OFD1P5Y 386689 +OFD1P6Y 386690 +OFD1P7Y 386691 +OFD1P8Y 386692 +OFD1P9Y 386693 +OFD1P10Y 386694 +OFD1P11Y 386695 +OFD1P12Y 386696 +OFD1P13Y 386697 +OFD1P14Y 386698 +OFD1P15Y 386699 +OFD1P16Y 442485 +OFD1P17 23738 +OFD1P18Y 10751 +OGA 10724 +OGDH 4967 +OGDHL 55753 +OGFOD1 55239 +OGFOD1P1 387924 +OGFOD2 79676 +OGFOD3 79701 +OGFR 11054 +OGFR-AS1 101409261 +OGFRL1 79627 +OGFRP1 388906 +OGG1 4968 +OGN 4969 +OGT 8473 +OIP5 11339 +OIP5-AS1 729082 +OIT3 170392 +OLA1 29789 +OLA1P1 246785 +OLA1P2 106479059 +OLA1P3 101060020 +OLAH 55301 +OLFM1 10439 +OLFM2 93145 +OLFM3 118427 +OLFM4 10562 +OLFM5P 101927763 +OLFML1 283298 +OLFML2A 169611 +OLFML2B 25903 +OLFML3 56944 +OLIG1 116448 +OLIG2 10215 +OLIG3 167826 +OLMALINC 90271 +OLR1 4973 +OMA1 115209 +OMD 4958 +OMG 4974 +OMP 4975 +ONECUT1 3175 +ONECUT2 9480 +ONECUT3 390874 +OOEP 441161 +OOEP-AS1 106478938 +OOEPP1 117751733 +OOEPP2 117751741 +OOSP1 255649 +OOSP1P1 106480251 +OOSP1P2 106480252 +OOSP2 219990 +OOSP3 112577461 +OOSP4A 112577462 +OOSP4B 107987155 +OPA1 4976 +OPA1-AS1 100873941 +OPA3 80207 +OPALIN 93377 +OPCML 4978 +OPCML-IT1 100874333 +OPCML-IT2 100874332 +OPHN1 4983 +OPLAH 26873 +OPN1LW 5956 +OPN1MW 2652 +OPN1MW2 728458 +OPN1MW3 101060233 +OPN1SW 611 +OPN3 23596 +OPN4 94233 +OPN5 221391 +OPRD1 4985 +OPRK1 4986 +OPRL1 4987 +OPRM1 4988 +OPRPN 58503 +OPTC 26254 +OPTN 10133 +OR1A1 8383 +OR1A2 26189 +OR1AA1P 79312 +OR1AB1P 81090 +OR1AC1P 403231 +OR1B1 347169 +OR1C1 26188 +OR1D2 4991 +OR1D3P 8384 +OR1D4 653166 +OR1D5 8386 +OR1E1 8387 +OR1E2 8388 +OR1E3 8389 +OR1F1 4992 +OR1F2P 26184 +OR1F12P 442179 +OR1G1 8390 +OR1H1P 26742 +OR1I1 126370 +OR1J1 347168 +OR1J2 26740 +OR1J4 26219 +OR1K1 392392 +OR1L1 26737 +OR1L3 26735 +OR1L4 254973 +OR1L6 392390 +OR1L8 138881 +OR1M1 125963 +OR1M4P 403232 +OR1N1 138883 +OR1N2 138882 +OR1P1 8391 +OR1Q1 158131 +OR1Q1BP 118568817 +OR1R1P 9596 +OR1S1 219959 +OR1S2 219958 +OR1X1P 402236 +OR1X5P 402240 +OR2A1 346528 +OR2A1-AS1 101928492 +OR2A2 442361 +OR2A3P 202861 +OR2A4 79541 +OR2A5 393046 +OR2A7 401427 +OR2A9P 441295 +OR2A12 346525 +OR2A13P 392140 +OR2A14 135941 +OR2A15P 135942 +OR2A20P 401428 +OR2A25 392138 +OR2A41P 403234 +OR2A42 402317 +OR2AD1P 79313 +OR2AE1 81392 +OR2AF1P 79331 +OR2AG1 144125 +OR2AG2 338755 +OR2AH1P 81336 +OR2AI1P 134082 +OR2AJ1 127608 +OR2AK2 391191 +OR2AL1P 79547 +OR2AM1P 81366 +OR2AO1P 403235 +OR2AP1 121129 +OR2AQ1P 81474 +OR2AS1P 81473 +OR2AS2P 403236 +OR2AT1P 390225 +OR2AT2P 390224 +OR2AT4 341152 +OR2B2 81697 +OR2B3 442184 +OR2B4P 442190 +OR2B6 26212 +OR2B7P 81695 +OR2B8P 65944 +OR2B11 127623 +OR2BH1P 403238 +OR2C1 4993 +OR2C3 81472 +OR2D2 120776 +OR2D3 120775 +OR2E1P 26719 +OR2F1 26211 +OR2F2 135948 +OR2G1P 26717 +OR2G2 81470 +OR2G3 81469 +OR2G6 391211 +OR2H1 26716 +OR2H2 7932 +OR2H4P 442189 +OR2H5P 26713 +OR2I1P 442197 +OR2J1 442185 +OR2J2 26707 +OR2J3 442186 +OR2J4P 442188 +OR2K2 26248 +OR2L1P 26247 +OR2L2 26246 +OR2L3 391192 +OR2L5 81466 +OR2L6P 81465 +OR2L8 391190 +OR2L9P 81462 +OR2L13 284521 +OR2M1P 388762 +OR2M2 391194 +OR2M3 127062 +OR2M4 26245 +OR2M5 127059 +OR2M7 391196 +OR2N1P 26701 +OR2P1P 442183 +OR2Q1P 346524 +OR2R1P 392132 +OR2S1P 392313 +OR2S2 56656 +OR2T1 26696 +OR2T2 401992 +OR2T3 343173 +OR2T4 127074 +OR2T5 401993 +OR2T6 254879 +OR2T7 81458 +OR2T8 343172 +OR2T10 127069 +OR2T11 127077 +OR2T12 127064 +OR2T27 403239 +OR2T29 343563 +OR2T32P 403241 +OR2T33 391195 +OR2T34 127068 +OR2T35 403244 +OR2U1P 26695 +OR2U2P 26694 +OR2V1 26693 +OR2V2 285659 +OR2W1 26692 +OR2W1-AS1 100129636 +OR2W2P 81694 +OR2W3 343171 +OR2W4P 81407 +OR2W5P 441932 +OR2W6P 81406 +OR2X1P 403245 +OR2Y1 134083 +OR2Z1 284383 +OR3A1 4994 +OR3A2 4995 +OR3A3 8392 +OR3A4P 390756 +OR3A5P 100856809 +OR3B1P 392561 +OR3D1P 504175 +OR4A1P 8596 +OR4A2P 390133 +OR4A3P 81320 +OR4A4P 390134 +OR4A5 81318 +OR4A6P 390131 +OR4A7P 81316 +OR4A8 81315 +OR4A9P 390137 +OR4A10P 390138 +OR4A11P 390136 +OR4A12P 81331 +OR4A13P 81330 +OR4A14P 81329 +OR4A15 81328 +OR4A16 81327 +OR4A17P 390139 +OR4A18P 81325 +OR4A19P 81324 +OR4A21P 81322 +OR4A40P 390116 +OR4A41P 403247 +OR4A42P 403248 +OR4A43P 390117 +OR4A44P 403250 +OR4A45P 403251 +OR4A46P 403252 +OR4A47 403253 +OR4A48P 403254 +OR4A49P 403255 +OR4A50P 403256 +OR4B1 119765 +OR4B2P 26690 +OR4C1P 26242 +OR4C2P 119750 +OR4C3 256144 +OR4C4P 79550 +OR4C5 79346 +OR4C6 219432 +OR4C7P 79294 +OR4C9P 79530 +OR4C10P 79526 +OR4C11 219429 +OR4C12 283093 +OR4C13 283092 +OR4C14P 81310 +OR4C15 81309 +OR4C16 219428 +OR4C45 403257 +OR4C46 119749 +OR4C48P 403259 +OR4C49P 403260 +OR4C50P 256190 +OR4D1 26689 +OR4D2 124538 +OR4D5 219875 +OR4D6 219983 +OR4D7P 81304 +OR4D8P 401696 +OR4D9 390199 +OR4D10 390197 +OR4D11 219986 +OR4E1 26687 +OR4E2 26686 +OR4F1P 26685 +OR4F2P 390028 +OR4F3 26683 +OR4F4 26682 +OR4F5 79501 +OR4F6 390648 +OR4F7P 81390 +OR4F8BP 102724468 +OR4F8P 390872 +OR4F13P 390651 +OR4F14P 390650 +OR4F15 390649 +OR4F16 81399 +OR4F17 81099 +OR4F21 441308 +OR4F28P 390652 +OR4F29 729759 +OR4G1P 26681 +OR4G2P 26680 +OR4G3P 26679 +OR4G4P 79504 +OR4G6P 81438 +OR4G11P 403263 +OR4H6BP 105370722 +OR4H6P 26322 +OR4H12P 161271 +OR4K1 79544 +OR4K2 390431 +OR4K3 283617 +OR4K4P 79318 +OR4K5 79317 +OR4K6P 79314 +OR4K7P 79306 +OR4K8P 390836 +OR4K11P 81079 +OR4K12P 81078 +OR4K13 390433 +OR4K14 122740 +OR4K15 81127 +OR4K16P 81126 +OR4K17 390436 +OR4L1 122742 +OR4M1 441670 +OR4M2 390538 +OR4M2-OT1 101927079 +OR4M2B 118568804 +OR4N1P 79322 +OR4N2 390429 +OR4N3BP 118568823 +OR4N3P 390539 +OR4N4 283694 +OR4N4C 105369274 +OR4N5 390437 +OR4P1P 79308 +OR4P4 81300 +OR4Q1P 81104 +OR4Q2 390432 +OR4Q3 441669 +OR4R1P 79528 +OR4R2P 81299 +OR4R3P 81298 +OR4S1 256148 +OR4S2 219431 +OR4T1P 390435 +OR4U1P 390434 +OR4V1P 79534 +OR4W1P 81077 +OR4X1 390113 +OR4X2 119764 +OR4X7P 403264 +OR5A1 219982 +OR5A2 219981 +OR5AC1 81431 +OR5AC2 81050 +OR5AC4P 403271 +OR5AH1P 79336 +OR5AK1P 81230 +OR5AK2 390181 +OR5AK3P 81228 +OR5AK4P 219525 +OR5AL1 79482 +OR5AL2P 79476 +OR5AM1P 81226 +OR5AN1 390195 +OR5AN2P 81224 +OR5AO1P 403272 +OR5AP1P 81223 +OR5AP2 338675 +OR5AQ1P 81221 +OR5AR1 219493 +OR5AS1 219447 +OR5AU1 390445 +OR5AW1P 81076 +OR5AZ1P 283193 +OR5B1P 401692 +OR5B2 390190 +OR5B3 441608 +OR5B10P 390186 +OR5B12 390191 +OR5B15P 81215 +OR5B17 219965 +OR5B19P 81211 +OR5B21 219968 +OR5BA1P 81210 +OR5BB1P 81209 +OR5BC1P 81208 +OR5BD1P 79483 +OR5BE1P 81207 +OR5BH1P 81075 +OR5BJ1P 81047 +OR5BK1P 401718 +OR5BL1P 81205 +OR5BM1P 79491 +OR5BN1P 81204 +OR5BN2P 504181 +OR5BP1P 81203 +OR5BQ1P 81202 +OR5BR1P 81201 +OR5BS1P 390313 +OR5BT1P 282790 +OR5C1 392391 +OR5D2P 8595 +OR5D3P 8594 +OR5D13 390142 +OR5D14 219436 +OR5D15P 81198 +OR5D16 390144 +OR5D17P 81196 +OR5D18 219438 +OR5E1P 26343 +OR5F1 338674 +OR5F2P 81194 +OR5G1P 8591 +OR5G3 81193 +OR5G4P 81192 +OR5G5P 81191 +OR5H1 26341 +OR5H2 79310 +OR5H3P 79309 +OR5H4P 79299 +OR5H5P 79297 +OR5H6 79295 +OR5H7P 79291 +OR5H8 79289 +OR5H14 403273 +OR5H15 403274 +OR5I1 10798 +OR5J1P 401687 +OR5J2 282775 +OR5J7P 403276 +OR5K1 26339 +OR5K2 402135 +OR5K3 403277 +OR5K4 403278 +OR5L1 219437 +OR5L2 26338 +OR5M1 390168 +OR5M2P 79523 +OR5M3 219482 +OR5M4P 79518 +OR5M5P 390166 +OR5M6P 79512 +OR5M7P 79508 +OR5M8 219484 +OR5M9 390162 +OR5M10 390167 +OR5M11 219487 +OR5M12P 81188 +OR5M13P 81187 +OR5M14P 81421 +OR5P1P 79283 +OR5P2 120065 +OR5P3 120066 +OR5P4P 81185 +OR5S1P 391496 +OR5T1 390155 +OR5T2 219464 +OR5T3 390154 +OR5V1 81696 +OR5W1P 81182 +OR5W2 390148 +OR6A2 8590 +OR6B1 135946 +OR6B2 389090 +OR6B3 150681 +OR6C1 390321 +OR6C2 341416 +OR6C3 254786 +OR6C4 341418 +OR6C5P 390320 +OR6C6 283365 +OR6C7P 390322 +OR6C64P 403281 +OR6C65 403282 +OR6C66P 403283 +OR6C68 403284 +OR6C69P 403285 +OR6C70 390327 +OR6C71P 390324 +OR6C72P 403288 +OR6C73P 403289 +OR6C74 254783 +OR6C75 390323 +OR6C76 390326 +OR6D1P 220974 +OR6E1P 79323 +OR6F1 343169 +OR6J1 79549 +OR6K1P 81449 +OR6K2 81448 +OR6K3 391114 +OR6K4P 128370 +OR6K5P 391115 +OR6K6 128371 +OR6L1P 390012 +OR6L2P 81356 +OR6M1 390261 +OR6M2P 79546 +OR6M3P 79321 +OR6N1 128372 +OR6N2 81442 +OR6P1 128366 +OR6Q1 219952 +OR6R1P 81440 +OR6R2P 403294 +OR6S1 341799 +OR6T1 219874 +OR6U2P 390329 +OR6V1 346517 +OR6W1P 89883 +OR6X1 390260 +OR6Y1 391112 +OR7A1P 390895 +OR7A2P 390894 +OR7A3P 26668 +OR7A5 26659 +OR7A8P 26661 +OR7A10 390892 +OR7A11P 26669 +OR7A15P 26335 +OR7A17 26333 +OR7A18P 81081 +OR7A19P 387853 +OR7C1 26664 +OR7C2 26658 +OR7D1P 26656 +OR7D2 162998 +OR7D4 125958 +OR7D11P 403295 +OR7E1P 341128 +OR7E2P 8587 +OR7E4P 8585 +OR7E5P 219445 +OR7E7P 392752 +OR7E8P 346708 +OR7E10P 10823 +OR7E11P 10822 +OR7E12P 10821 +OR7E13P 10820 +OR7E14P 10819 +OR7E15P 8588 +OR7E16P 26473 +OR7E18P 390885 +OR7E19P 26651 +OR7E21P 9432 +OR7E22P 9431 +OR7E23P 391279 +OR7E24 26648 +OR7E25P 26647 +OR7E26P 401637 +OR7E28P 26645 +OR7E29P 26644 +OR7E31P 375601 +OR7E33P 26640 +OR7E35P 391632 +OR7E36P 26637 +OR7E37P 100506759 +OR7E38P 389537 +OR7E39P 253933 +OR7E41P 8583 +OR7E43P 26475 +OR7E46P 402077 +OR7E47P 26628 +OR7E53P 26478 +OR7E55P 391548 +OR7E59P 402249 +OR7E62P 26479 +OR7E66P 26614 +OR7E83P 391630 +OR7E84P 390288 +OR7E85BP 650293 +OR7E85P 442105 +OR7E86P 442104 +OR7E87P 8586 +OR7E89P 79540 +OR7E90P 79537 +OR7E91P 79315 +OR7E93P 79282 +OR7E94P 79273 +OR7E96P 401450 +OR7E97P 79492 +OR7E99P 81419 +OR7E100P 81430 +OR7E101P 81138 +OR7E102P 400984 +OR7E103P 282754 +OR7E104P 81137 +OR7E105P 81116 +OR7E106P 81115 +OR7E108P 81363 +OR7E109P 401540 +OR7E110P 81354 +OR7E111FP 100288392 +OR7E111P 81136 +OR7E115P 81353 +OR7E116P 81358 +OR7E117P 399857 +OR7E121P 402133 +OR7E122P 81428 +OR7E125P 389616 +OR7E126P 81176 +OR7E128P 81175 +OR7E129P 391576 +OR7E130P 389144 +OR7E136P 155340 +OR7E140P 344729 +OR7E145P 390215 +OR7E148P 282801 +OR7E149P 282756 +OR7E154P 403296 +OR7E155P 403297 +OR7E156P 283491 +OR7E157P 403219 +OR7E158P 392194 +OR7E159P 403299 +OR7E160P 402333 +OR7E161P 389626 +OR7E162P 442101 +OR7E163P 100131415 +OR7G1 125962 +OR7G2 390882 +OR7G3 390883 +OR7G15P 403300 +OR7H1P 390886 +OR7H2P 403301 +OR7K1P 81114 +OR7L1P 79499 +OR7M1P 81352 +OR8A1 390275 +OR8A2P 390273 +OR8A3P 403302 +OR8B1P 8582 +OR8B2 26595 +OR8B3 390271 +OR8B4 283162 +OR8B5P 26592 +OR8B6P 26591 +OR8B7P 26590 +OR8B8 26493 +OR8B9P 79316 +OR8B10P 390274 +OR8B12 219858 +OR8C1P 8580 +OR8D1 283159 +OR8D2 283160 +OR8D4 338662 +OR8F1P 390269 +OR8G1 26494 +OR8G2P 26492 +OR8G3P 387815 +OR8G5 219865 +OR8G7P 282786 +OR8H1 219469 +OR8H2 390151 +OR8H3 390152 +OR8I1P 79498 +OR8I2 120586 +OR8I4P 403303 +OR8J1 219477 +OR8J2 81169 +OR8J3 81168 +OR8K1 390157 +OR8K2P 79494 +OR8K3 219473 +OR8K4P 81166 +OR8K5 219453 +OR8L1P 81164 +OR8Q1P 81163 +OR8R1P 81162 +OR8S1 341568 +OR8S21P 403304 +OR8T1P 282791 +OR8U1 219417 +OR8U3 219479 +OR8U8 504189 +OR8U9 504190 +OR8V1P 282776 +OR8X1P 403305 +OR9A1P 26495 +OR9A2 135924 +OR9A3P 392106 +OR9A4 130075 +OR9G1 390174 +OR9G2P 81160 +OR9G3P 81159 +OR9G4 283189 +OR9G9 504191 +OR9H1P 81439 +OR9I1 219954 +OR9I2P 81156 +OR9I3P 81155 +OR9K1P 121360 +OR9K2 441639 +OR9L1P 79301 +OR9M1P 81153 +OR9N1P 81383 +OR9P1P 81382 +OR9Q1 219956 +OR9Q2 219957 +OR9R1P 81140 +OR9S24P 403275 +OR10A2 341276 +OR10A3 26496 +OR10A4 283297 +OR10A5 144124 +OR10A6 390093 +OR10A7 121364 +OR10AA1P 81487 +OR10AB1P 390091 +OR10AC1 392133 +OR10AD1 121275 +OR10AE1P 81486 +OR10AE3P 403223 +OR10AF1P 282769 +OR10AG1 282770 +OR10AH1P 402246 +OR10AK1P 403224 +OR10B1P 401903 +OR10C1 442194 +OR10D1P 26541 +OR10D3 26497 +OR10D4P 390266 +OR10D5P 79488 +OR10G1P 26540 +OR10G2 26534 +OR10G3 26533 +OR10G4 390264 +OR10G5P 79515 +OR10G6 79490 +OR10G7 390265 +OR10G8 219869 +OR10G9 219870 +OR10H1 26539 +OR10H2 26538 +OR10H3 26532 +OR10H4 126541 +OR10H5 284433 +OR10J1 26476 +OR10J2P 391117 +OR10J3 441911 +OR10J4 391121 +OR10J5 127385 +OR10J6P 401973 +OR10J7P 391119 +OR10J8P 343409 +OR10J9P 391120 +OR10K1 391109 +OR10K2 391107 +OR10N1P 390267 +OR10P1 121130 +OR10Q1 219960 +OR10Q2P 81345 +OR10R1P 79513 +OR10R2 343406 +OR10R3P 391110 +OR10S1 219873 +OR10T1P 79514 +OR10T2 128360 +OR10U1P 390318 +OR10V1 390201 +OR10V2P 81343 +OR10V3P 81342 +OR10V7P 403225 +OR10W1 81341 +OR10X1 128367 +OR10Y1P 81340 +OR10Z1 128368 +OR11A1 26531 +OR11G1P 390438 +OR11G2 390439 +OR11H1 81061 +OR11H2 79334 +OR11H3P 81113 +OR11H4 390442 +OR11H5P 390440 +OR11H6 122748 +OR11H7 390441 +OR11H12 440153 +OR11H13P 440159 +OR11I1P 81479 +OR11J1P 81111 +OR11J2P 81110 +OR11J5P 403226 +OR11J6P 100288148 +OR11J7P 100288112 +OR11K1BP 118568805 +OR11K1P 81109 +OR11K2P 401742 +OR11L1 391189 +OR11M1P 121270 +OR11N1P 392540 +OR11P1P 282795 +OR11Q1P 403227 +OR12D1 26530 +OR12D2 26529 +OR12D3 81797 +OR13A1 79290 +OR13C1P 392377 +OR13C2 392376 +OR13C3 138803 +OR13C4 138804 +OR13C5 138799 +OR13C6P 392311 +OR13C7 81377 +OR13C8 138802 +OR13C9 286362 +OR13D1 286365 +OR13D2P 392375 +OR13D3P 402374 +OR13E1P 392308 +OR13F1 138805 +OR13G1 441933 +OR13H1 347468 +OR13I1P 79538 +OR13J1 392309 +OR13K1P 402424 +OR13Z1P 403228 +OR13Z2P 403229 +OR13Z3P 403230 +OR14A2 388761 +OR14A16 284532 +OR14C36 127066 +OR14I1 401994 +OR14J1 442191 +OR14K1 343170 +OR14L1 127617 +OR51A1P 26537 +OR51A2 401667 +OR51A3P 79532 +OR51A4 401666 +OR51A5P 79525 +OR51A6P 390046 +OR51A7 119687 +OR51A8P 401662 +OR51A9P 390039 +OR51A10P 81295 +OR51AB1P 403265 +OR51B2 79345 +OR51B3P 79342 +OR51B4 79339 +OR51B5 282763 +OR51B6 390058 +OR51B8P 403266 +OR51C1P 401661 +OR51C4P 390041 +OR51D1 390038 +OR51E1 143503 +OR51E2 81285 +OR51F1 256892 +OR51F2 119694 +OR51F3P 390043 +OR51F4P 390044 +OR51F5P 390040 +OR51G1 79324 +OR51G2 81282 +OR51H1 401663 +OR51H2P 401664 +OR51I1 390063 +OR51I2 390064 +OR51J1 79470 +OR51K1P 81278 +OR51L1 119682 +OR51M1 390059 +OR51N1P 119696 +OR51P1P 79300 +OR51Q1 390061 +OR51R1P 390034 +OR51S1 119692 +OR51T1 401665 +OR51V1 283111 +OR52A1 23538 +OR52A4P 390053 +OR52A5 390054 +OR52B1P 81274 +OR52B2 255725 +OR52B3P 387747 +OR52B4 143496 +OR52B5P 81270 +OR52B6 340980 +OR52D1 390066 +OR52E1 79296 +OR52E2 119678 +OR52E3P 79533 +OR52E4 390081 +OR52E5 390082 +OR52E6 390078 +OR52E7P 81264 +OR52E8 390079 +OR52H1 390067 +OR52H2P 81261 +OR52I1 390037 +OR52I2 143502 +OR52J1P 79302 +OR52J2P 79529 +OR52J3 119679 +OR52K1 390036 +OR52K2 119774 +OR52K3P 390035 +OR52L1 338751 +OR52L2P 79274 +OR52M1 119772 +OR52M2P 338637 +OR52N1 79473 +OR52N2 390077 +OR52N3P 81251 +OR52N4 390072 +OR52N5 390075 +OR52P1 81248 +OR52P2P 119775 +OR52Q1P 81246 +OR52R1 119695 +OR52S1P 79521 +OR52T1P 81244 +OR52U1P 81243 +OR52V1P 81242 +OR52W1 120787 +OR52X1P 79272 +OR52Y1P 81240 +OR52Z1P 283110 +OR55B1P 390030 +OR56A1 120796 +OR56A3 390083 +OR56A4 120793 +OR56A5 390084 +OR56A7P 81236 +OR56B1 387748 +OR56B2P 390073 +OR56B3P 401675 +OR56B4 196335 +ORAI1 84876 +ORAI2 80228 +ORAI3 93129 +ORC1 4998 +ORC1P1 340569 +ORC2 4999 +ORC3 23595 +ORC4 5000 +ORC5 5001 +ORC6 23594 +ORM1 5004 +ORM2 5005 +ORMDL1 94101 +ORMDL1P1 124902374 +ORMDL2 29095 +ORMDL3 94103 +OS9 10956 +OSBP 5007 +OSBP2 23762 +OSBPL1A 114876 +OSBPL2 9885 +OSBPL3 26031 +OSBPL5 114879 +OSBPL6 114880 +OSBPL7 114881 +OSBPL8 114882 +OSBPL9 114883 +OSBPL9P1 100130821 +OSBPL9P2 100130038 +OSBPL9P3 100420591 +OSBPL9P4 100498661 +OSBPL9P5 106480232 +OSBPL9P6 100533673 +OSBPL10 114884 +OSBPL10-AS1 100874206 +OSBPL11 114885 +OSCAR 126014 +OSCP1 127700 +OSER1 51526 +OSER1-DT 100505783 +OSGEP 55644 +OSGEPL1 64172 +OSGEPL1-AS1 101409258 +OSGIN1 29948 +OSGIN2 734 +OSM 5008 +OSMR 9180 +OSMR-DT 101929768 +OSR1 130497 +OSR2 116039 +OST4 100128731 +OSTC 58505 +OSTCP1 202459 +OSTCP2 646567 +OSTCP3 646557 +OSTCP4 645264 +OSTCP5 100874386 +OSTCP6 100874387 +OSTCP7 100874391 +OSTCP8 100874388 +OSTF1 26578 +OSTF1P1 386654 +OSTM1 28962 +OSTM1-AS1 100287366 +OSTN 344901 +OSTN-AS1 106480738 +OTC 5009 +OTOA 146183 +OTOAP1 653786 +OTOF 9381 +OTOG 340990 +OTOGL 283310 +OTOL1 131149 +OTOP1 133060 +OTOP2 92736 +OTOP3 347741 +OTOR 56914 +OTOS 150677 +OTP 23440 +OTUB1 55611 +OTUB2 78990 +OTUD1 220213 +OTUD3 23252 +OTUD4 54726 +OTUD4P1 360227 +OTUD5 55593 +OTUD6A 139562 +OTUD6B 51633 +OTUD6B-AS1 100506365 +OTUD7A 161725 +OTUD7B 56957 +OTULIN 90268 +OTULIN-DT 728178 +OTULINL 54491 +OTX1 5013 +OTX2 5015 +OTX2-AS1 100309464 +OTX2P1 100033409 +OTX2P2 100419816 +OVAAL 148756 +OVCA2 124641 +OVCH1 341350 +OVCH1-AS1 101055625 +OVCH2 341277 +OVGP1 5016 +OVOL1 5017 +OVOL1-AS1 101927828 +OVOL2 58495 +OVOL3 728361 +OXA1L 5018 +OXA1L-DT 105370404 +OXCT1 5019 +OXCT1-AS1 100874002 +OXCT2 64064 +OXCT2P1 192217 +OXER1 165140 +OXGR1 27199 +OXLD1 339229 +OXNAD1 92106 +OXR1 55074 +OXR1-AS1 105375700 +OXSM 54995 +OXSR1 9943 +OXT 5020 +OXTR 5021 +P2RX1 5023 +P2RX2 22953 +P2RX3 5024 +P2RX4 5025 +P2RX5 5026 +P2RX5-TAX1BP3 100533970 +P2RX6 9127 +P2RX6P 440799 +P2RX7 5027 +P2RY1 5028 +P2RY2 5029 +P2RY4 5030 +P2RY6 5031 +P2RY8 286530 +P2RY10 27334 +P2RY10BP 449518 +P2RY11 5032 +P2RY12 64805 +P2RY13 53829 +P2RY14 9934 +P3H1 64175 +P3H2 55214 +P3H2-AS1 101929152 +P3H3 10536 +P3H4 10609 +P3R3URF 110117498 +P3R3URF-PIK3R3 110117499 +P4HA1 5033 +P4HA2 8974 +P4HA2-AS1 100861518 +P4HA3 283208 +P4HA3-AS1 101928580 +P4HB 5034 +P4HTM 54681 +PA2G4 5036 +PA2G4P1 389884 +PA2G4P2 170533 +PA2G4P3 619212 +PA2G4P4 647033 +PA2G4P5 389424 +PA2G4P6 646083 +PAAF1 80227 +PABIR1 116224 +PABIR2 159090 +PABIR3 159091 +PABPC1 26986 +PABPC1L 80336 +PABPC1L2A 340529 +PABPC1L2B 645974 +PABPC1L2B-AS1 101928345 +PABPC1P1 26980 +PABPC1P2 728773 +PABPC1P3 26978 +PABPC1P4 341315 +PABPC1P5 100131374 +PABPC1P6 100128696 +PABPC1P7 100128183 +PABPC1P8 100132766 +PABPC1P9 100130338 +PABPC1P10 285314 +PABPC1P11 100421058 +PABPC1P12 100129604 +PABPC1P13 644758 +PABPC3 5042 +PABPC4 8761 +PABPC4-AS1 101929516 +PABPC4L 132430 +PABPC5 140886 +PABPC5-AS1 102724167 +PABPN1 8106 +PABPN1L 390748 +PABPN1P1 100420758 +PABPN1P2 100420798 +PABX 5043 +PABY 5044 +PACC1 55248 +PACERR 103752588 +PACRG 135138 +PACRG-AS1 285796 +PACRG-AS2 101929239 +PACRG-AS3 729658 +PACRGL 133015 +PACS1 55690 +PACS2 23241 +PACSIN1 29993 +PACSIN2 11252 +PACSIN3 29763 +PADI1 29943 +PADI2 11240 +PADI3 51702 +PADI4 23569 +PADI6 353238 +PAEP 5047 +PAEPP1 138159 +PAF1 54623 +PAFAH1B1 5048 +PAFAH1B1P1 7845 +PAFAH1B1P2 27002 +PAFAH1B2 5049 +PAFAH1B2P1 139957 +PAFAH1B2P2 643711 +PAFAH1B3 5050 +PAFAH2 5051 +PAG1 55824 +PAGE1 8712 +PAGE2 203569 +PAGE2B 389860 +PAGE3 139793 +PAGE4 9506 +PAGE5 90737 +PAGR1 79447 +PAH 5053 +PAICS 10606 +PAICSP1 780814 +PAICSP2 780815 +PAICSP3 780810 +PAICSP4 780813 +PAICSP5 780811 +PAICSP6 780812 +PAICSP7 780816 +PAIP1 10605 +PAIP1P1 100421582 +PAIP1P2 645139 +PAIP2 51247 +PAIP2B 400961 +PAK1 5058 +PAK1IP1 55003 +PAK2 5062 +PAK3 5063 +PAK4 10298 +PAK5 57144 +PAK6 56924 +PAK6-AS1 644809 +PALB2 79728 +PALD1 27143 +PALLD 23022 +PALLD-AS1 107986199 +PALM 5064 +PALM2 +PALM2AKAP2 445815 +PALM3 342979 +PALMD 54873 +PALS1 64398 +PALS2 51678 +PAM 5066 +PAM16 51025 +PAMR1 25891 +PAN2 9924 +PAN3 255967 +PAN3-AS1 100288730 +PANCR 110231149 +PANDAR 101154753 +PANK1 53354 +PANK1-AS1 105378421 +PANK2 80025 +PANK2-AS1 107985395 +PANK3 79646 +PANK4 55229 +PANO1 101927423 +PANTR1 100506421 +PANX1 24145 +PANX2 56666 +PANX3 116337 +PAOX 196743 +PAPLN 89932 +PAPLN-AS1 101928123 +PAPOLA 10914 +PAPOLA-DT 730202 +PAPOLB 56903 +PAPOLG 64895 +PAPPA 5069 +PAPPA-AS1 493913 +PAPPA-AS2 103611155 +PAPPA2 60676 +PAPSS1 9061 +PAPSS2 9060 +PAQR3 152559 +PAQR4 124222 +PAQR5 54852 +PAQR5-DT 102723548 +PAQR6 79957 +PAQR7 164091 +PAQR8 85315 +PAQR9 344838 +PAQR9-AS1 101927832 +PARAL1 101929371 +PARD3 56288 +PARD3-DT 100505601 +PARD3B 117583 +PARD6A 50855 +PARD6B 84612 +PARD6BP1 100422369 +PARD6G 84552 +PARD6G-AS1 100130522 +PARG 8505 +PARGP1 728407 +PARK7 11315 +PARK7P1 100422296 +PARK7P2 100422232 +PARL 55486 +PARLP1 100129707 +PARLP2 100131471 +PARM1 25849 +PARM1-AS1 100507388 +PARN 5073 +PARP1 142 +PARP1P1 144 +PARP1P2 145 +PARP2 10038 +PARP3 10039 +PARP4 143 +PARP4P1 347613 +PARP4P2 645771 +PARP4P3 107133524 +PARP6 56965 +PARP8 79668 +PARP9 83666 +PARP10 84875 +PARP11 57097 +PARP11-AS1 105369609 +PARP12 64761 +PARP14 54625 +PARP15 165631 +PARP16 54956 +PARPBP 55010 +PARS2 25973 +PART1 25859 +PARTICL 100630918 +PARVA 55742 +PARVB 29780 +PARVG 64098 +PASD1 139135 +PASK 23178 +PATE1 160065 +PATE2 399967 +PATE3 100169851 +PATE4 399968 +PATJ 10207 +PATJ-DT 118732297 +PATL1 219988 +PATL1-DT 105369318 +PATL2 197135 +PATZ1 23598 +PAUPAR 103157000 +PAWR 5074 +PAWRP1 100420526 +PAWRP2 100420535 +PAX1 5075 +PAX2 5076 +PAX3 5077 +PAX4 5078 +PAX5 5079 +PAX6 5080 +PAX6-AS1 440034 +PAX7 5081 +PAX8 7849 +PAX8-AS1 654433 +PAX9 5083 +PAXBP1 94104 +PAXBP1-AS1 100506215 +PAXBP1P1 106481704 +PAXIP1 22976 +PAXIP1-AS2 100132707 +PAXIP1-DT 202781 +PAXX 286257 +PBDC1 51260 +PBK 55872 +PBLD 64081 +PBOV1 59351 +PBRM1 55193 +PBX1 5087 +PBX1-AS1 100505795 +PBX2 5089 +PBX2P1 5088 +PBX3 5090 +PBX3-DT 51145 +PBX4 80714 +PBXIP1 57326 +PC 5091 +PCA3 50652 +PCARE 388939 +PCAT1 100750225 +PCAT2 103164619 +PCAT4 118425 +PCAT5 102578074 +PCAT6 100506696 +PCAT7 101928099 +PCAT14 101978785 +PCAT18 728606 +PCAT19 100505495 +PCAT29 104472713 +PCBD1 5092 +PCBD2 84105 +PCBP1 5093 +PCBP1-AS1 400960 +PCBP2 5094 +PCBP2-OT1 102157401 +PCBP2P1 101060045 +PCBP2P2 286157 +PCBP2P3 100131236 +PCBP2P4 100420048 +PCBP3 54039 +PCBP3-AS1 100129027 +PCBP4 57060 +PCCA 5095 +PCCA-AS1 100885777 +PCCA-DT 105370333 +PCCB 5096 +PCDH1 5097 +PCDH7 5099 +PCDH8 5100 +PCDH8P1 100133285 +PCDH9 5101 +PCDH9-AS1 100874065 +PCDH9-AS2 100874064 +PCDH9-AS3 100874086 +PCDH9-AS4 100874087 +PCDH10 57575 +PCDH10-DT 101927359 +PCDH11X 27328 +PCDH11Y 83259 +PCDH12 51294 +PCDH15 65217 +PCDH17 27253 +PCDH18 54510 +PCDH19 57526 +PCDH20 64881 +PCDHA@ 56117 +PCDHA1 56147 +PCDHA2 56146 +PCDHA3 56145 +PCDHA4 56144 +PCDHA5 56143 +PCDHA6 56142 +PCDHA7 56141 +PCDHA8 56140 +PCDHA9 9752 +PCDHA10 56139 +PCDHA11 56138 +PCDHA12 56137 +PCDHA13 56136 +PCDHA14 26307 +PCDHAC1 56135 +PCDHAC2 56134 +PCDHACT 56119 +PCDHB@ 56116 +PCDHB1 29930 +PCDHB1-AS1 101926905 +PCDHB2 56133 +PCDHB3 56132 +PCDHB4 56131 +PCDHB5 26167 +PCDHB6 56130 +PCDHB7 56129 +PCDHB8 56128 +PCDHB9 56127 +PCDHB10 56126 +PCDHB11 56125 +PCDHB12 56124 +PCDHB13 56123 +PCDHB14 56122 +PCDHB15 56121 +PCDHB16 57717 +PCDHB17P 54661 +PCDHB18P 54660 +PCDHB19P 84054 +PCDHG@ 56115 +PCDHGA1 56114 +PCDHGA2 56113 +PCDHGA3 56112 +PCDHGA4 56111 +PCDHGA5 56110 +PCDHGA6 56109 +PCDHGA7 56108 +PCDHGA8 9708 +PCDHGA9 56107 +PCDHGA10 56106 +PCDHGA11 56105 +PCDHGA12 26025 +PCDHGB1 56104 +PCDHGB2 56103 +PCDHGB3 56102 +PCDHGB4 8641 +PCDHGB5 56101 +PCDHGB6 56100 +PCDHGB7 56099 +PCDHGB8P 56120 +PCDHGB9P 84055 +PCDHGC3 5098 +PCDHGC4 56098 +PCDHGC5 56097 +PCDHGCT 56118 +PCED1A 64773 +PCED1B 91523 +PCED1B-AS1 100233209 +PCED1CP 646249 +PCF11 51585 +PCF11-AS1 106736475 +PCGEM1 64002 +PCGF1 84759 +PCGF2 7703 +PCGF3 10336 +PCGF3-AS1 100129917 +PCGF5 84333 +PCGF6 84108 +PCGF7P 253272 +PCHILR 129810500 +PCID2 55795 +PCIF1 63935 +PCK1 5105 +PCK2 5106 +PCLAF 9768 +PCLO 27445 +PCM1 5108 +PCMT1 5110 +PCMTD1 115294 +PCMTD1-DT 102724330 +PCMTD1P1 100874520 +PCMTD1P2 100287647 +PCMTD1P3 100422595 +PCMTD1P4 107105258 +PCMTD1P5 107105260 +PCMTD1P6 107105255 +PCMTD1P7 107080553 +PCMTD1P8 107105257 +PCMTD2 55251 +PCNA 5111 +PCNA-AS1 100302739 +PCNAP1 359806 +PCNAP2 359805 +PCNAP3 392454 +PCNAP4 390102 +PCNP 57092 +PCNPP1 654427 +PCNPP2 100128911 +PCNPP3 729298 +PCNPP4 100874220 +PCNPP5 100507361 +PCNT 5116 +PCNX1 22990 +PCNX2 80003 +PCNX3 399909 +PCNX4 64430 +PCNX4-DT 105370524 +PCOLCE 5118 +PCOLCE-AS1 100129845 +PCOLCE2 26577 +PCOTH 542767 +PCOTHP1 100287275 +PCP2 126006 +PCP4 5121 +PCP4L1 654790 +PCSEAT 105372808 +PCSK1 5122 +PCSK1N 27344 +PCSK2 5126 +PCSK4 54760 +PCSK5 5125 +PCSK6 5046 +PCSK6-AS1 105371027 +PCSK7 9159 +PCSK9 255738 +PCTP 58488 +PCYOX1 51449 +PCYOX1L 78991 +PCYT1A 5130 +PCYT1B 9468 +PCYT1B-AS1 100874088 +PCYT2 5833 +PDAP1 11333 +PDC 5132 +PDC-AS1 102724919 +PDCD1 5133 +PDCD1LG2 80380 +PDCD2 5134 +PDCD2L 84306 +PDCD4 27250 +PDCD4-AS1 282997 +PDCD5 9141 +PDCD5P1 100527946 +PDCD5P2 100527947 +PDCD6 10016 +PDCD6-AHRR 116412618 +PDCD6-DT 102467073 +PDCD6IP 10015 +PDCD6IP-DT 105377023 +PDCD6IPP1 100861430 +PDCD6IPP2 646278 +PDCD6P1 728613 +PDCD7 10081 +PDCD10 11235 +PDCD11 22984 +PDCL 5082 +PDCL2 132954 +PDCL2P1 653707 +PDCL2P2 106480295 +PDCL3 79031 +PDCL3P1 392225 +PDCL3P2 643831 +PDCL3P3 100132683 +PDCL3P4 285359 +PDCL3P5 644850 +PDCL3P6 100419023 +PDCL3P7 390340 +PDE1A 5136 +PDE1B 5153 +PDE1C 5137 +PDE2A 5138 +PDE2A-AS1 105369379 +PDE2A-AS2 105369378 +PDE3A 5139 +PDE3A-AS1 120766147 +PDE3B 5140 +PDE4A 5141 +PDE4B 5142 +PDE4B-AS1 101927139 +PDE4C 5143 +PDE4D 5144 +PDE4DIP 9659 +PDE4DIPP1 728920 +PDE4DIPP2 100996724 +PDE4DIPP3 199882 +PDE4DIPP4 101929798 +PDE4DIPP5 101060254 +PDE4DIPP6 100132057 +PDE4DIPP7 102723955 +PDE4DIPP8 100421267 +PDE4DIPP9 100421279 +PDE4DIPP10 100421269 +PDE5A 8654 +PDE6A 5145 +PDE6B 5158 +PDE6B-AS1 101928521 +PDE6C 5146 +PDE6D 5147 +PDE6G 5148 +PDE6H 5149 +PDE7A 5150 +PDE7A-DT 118568829 +PDE7B 27115 +PDE7B-AS1 644135 +PDE8A 5151 +PDE8B 8622 +PDE9A 5152 +PDE9A-AS1 101928284 +PDE10A 10846 +PDE11A 50940 +PDE11A-AS1 105373764 +PDE12 201626 +PDF 64146 +PDGFA 5154 +PDGFA-DT 441307 +PDGFB 5155 +PDGFC 56034 +PDGFD 80310 +PDGFRA 5156 +PDGFRB 5159 +PDGFRL 5157 +PDGFRL2P 116435296 +PDHA1 5160 +PDHA1P1 100132534 +PDHA2 5161 +PDHB 5162 +PDHX 8050 +PDIA2 64714 +PDIA3 2923 +PDIA3P1 171423 +PDIA3P2 106481687 +PDIA4 9601 +PDIA5 10954 +PDIA6 10130 +PDIK1L 149420 +PDILT 204474 +PDK1 5163 +PDK1-AS1 124900513 +PDK1P1 100421194 +PDK1P2 100129843 +PDK2 5164 +PDK3 5165 +PDK4 5166 +PDK4-AS1 107986824 +PDLIM1 9124 +PDLIM1P1 326616 +PDLIM1P2 100419426 +PDLIM1P3 100419427 +PDLIM1P4 100419185 +PDLIM2 64236 +PDLIM3 27295 +PDLIM4 8572 +PDLIM5 10611 +PDLIM7 9260 +PDLIM7-AS1 121232374 +PDP1 54704 +PDP2 57546 +PDPK1 5170 +PDPK2P 653650 +PDPN 10630 +PDPR 55066 +PDPR2P 283922 +PDRG1 81572 +PDS5A 23244 +PDS5B 23047 +PDS5B-DT 107984584 +PDSS1 23590 +PDSS1P1 100129248 +PDSS1P2 100996500 +PDSS2 57107 +PDX1 3651 +PDXDC1 23042 +PDXDC2P 109731405 +PDXDC2P-NPIPB14P 283970 +PDXK 8566 +PDXP 57026 +PDXP-DT 101927051 +PDYN 5173 +PDYN-AS1 727993 +PDZD2 23037 +PDZD4 57595 +PDZD7 79955 +PDZD8 118987 +PDZD9 255762 +PDZD11 51248 +PDZK1 5174 +PDZK1IP1 10158 +PDZK1P1 100034743 +PDZPH1P 105379197 +PDZRN3 23024 +PDZRN3-AS1 101927249 +PDZRN4 29951 +PEA15 8682 +PEAK1 79834 +PEAK3 374872 +PEAR1 375033 +PEBP1 5037 +PEBP1P1 326614 +PEBP1P2 647307 +PEBP1P3 100129570 +PEBP4 157310 +PECAM1 5175 +PECR 55825 +PEDS1 387521 +PEDS1-UBE2V1 387522 +PEF1 553115 +PEF1-AS1 107985471 +PEG3 5178 +PEG3-AS1 100169890 +PEG10 23089 +PEG13 359809 +PELATON 100506115 +PELI1 57162 +PELI2 57161 +PELI3 246330 +PELO 53918 +PELO-AS1 125775243 +PELP1 27043 +PELP1-DT 101559451 +PEMT 10400 +PENK 5179 +PENK-AS1 101929415 +PEPB 5182 +PEPC 5183 +PEPD 5184 +PEPE 5185 +PER1 5187 +PER2 8864 +PER3 8863 +PER3P1 168741 +PERCC1 105371045 +PERM1 84808 +PERP 64065 +PERPP1 127566428 +PERPP2 124903553 +PES1 23481 +PES1P1 345016 +PES1P2 347193 +PET100 100131801 +PET100P1 100287402 +PET117 100303755 +PET117P1 100128464 +PEX1 5189 +PEX2 5828 +PEX3 8504 +PEX5 5830 +PEX5L 51555 +PEX5L-AS1 100874040 +PEX5L-AS2 101928790 +PEX6 5190 +PEX7 5191 +PEX10 5192 +PEX11A 8800 +PEX11B 8799 +PEX11G 92960 +PEX12 5193 +PEX12P1 121727 +PEX13 5194 +PEX14 5195 +PEX16 9409 +PEX19 5824 +PEX26 55670 +PF4 5196 +PF4V1 5197 +PFAS 5198 +PFDN1 5201 +PFDN1P1 127379723 +PFDN1P2 100288771 +PFDN2 5202 +PFDN4 5203 +PFDN5 5204 +PFDN6 10471 +PFKFB1 5207 +PFKFB2 5208 +PFKFB3 5209 +PFKFB4 5210 +PFKL 5211 +PFKM 5213 +PFKP 5214 +PFKP-DT 101927824 +PFN1 5216 +PFN1P1 730138 +PFN1P2 767846 +PFN1P3 200025 +PFN1P4 767851 +PFN1P6 645126 +PFN1P8 100873744 +PFN1P9 767850 +PFN1P10 767853 +PFN1P11 100873784 +PFN1P12 647569 +PFN2 5217 +PFN2-AS1 121832804 +PFN3 345456 +PFN4 375189 +PFN5P 112422909 +PGA3 643834 +PGA4 643847 +PGA5 5222 +PGAM1 5223 +PGAM1P1 100130514 +PGAM1P2 392310 +PGAM1P3 100873887 +PGAM1P4 391508 +PGAM1P5 100132594 +PGAM1P6 100420567 +PGAM1P7 100420650 +PGAM1P8 440043 +PGAM1P9 100420681 +PGAM1P10 100420633 +PGAM1P11 100420660 +PGAM1P12 390643 +PGAM1P13 100129815 +PGAM2 5224 +PGAM3P 170535 +PGAM4 441531 +PGAM4P1 100421178 +PGAM4P2 100131611 +PGAM5 192111 +PGAM5P1 100421133 +PGAP1 80055 +PGAP2 27315 +PGAP3 93210 +PGAP4 84302 +PGAP6 58986 +PGBD1 84547 +PGBD2 267002 +PGBD3 267004 +PGBD3P1 267005 +PGBD3P2 267006 +PGBD3P3 267007 +PGBD3P4 267008 +PGBD4 161779 +PGBD4P1 107161154 +PGBD4P2 100421228 +PGBD4P3 100421136 +PGBD4P4 100421146 +PGBD4P5 100421123 +PGBD4P6 100421180 +PGBD4P7 100421182 +PGBD4P8 100421185 +PGBD5 79605 +PGBP 441897 +PGC 5225 +PGD 5226 +PGDP1 342705 +PGDP2 100129649 +PGF 5228 +PGGHG 80162 +PGGT1B 5229 +PGGT1BP1 653895 +PGGT1BP2 100132402 +PGK1 5230 +PGK1P1 5231 +PGK1P2 5233 +PGK2 5232 +PGLS 25796 +PGLS-DT 100507551 +PGLYRP1 8993 +PGLYRP2 114770 +PGLYRP3 114771 +PGLYRP4 57115 +PGM1 5236 +PGM2 55276 +PGM2L1 283209 +PGM3 5238 +PGM5 5239 +PGM5-AS1 572558 +PGM5P1 653394 +PGM5P2 595135 +PGM5P3 101929157 +PGM5P3-AS1 101929127 +PGM5P4 729468 +PGM5P4-AS1 103344932 +PGP 283871 +PGPEP1 54858 +PGPEP1L 145814 +PGR 5241 +PGR-AS1 101054525 +PGRMC1 10857 +PGRMC2 10424 +PGS1 9489 +PHACTR1 221692 +PHACTR2 9749 +PHACTR2-AS1 285740 +PHACTR2P1 100533676 +PHACTR3 116154 +PHACTR3-AS1 100506384 +PHACTR4 65979 +PHAF1 80262 +PHAX 51808 +PHB1 5245 +PHB1P1 5246 +PHB1P2 100418837 +PHB1P3 391044 +PHB1P4 100418774 +PHB1P5 106478939 +PHB1P6 106478940 +PHB1P7 548599 +PHB1P8 100418804 +PHB1P9 100289414 +PHB1P10 100418815 +PHB1P11 644214 +PHB1P12 100418820 +PHB1P13 100418843 +PHB1P14 100873751 +PHB1P15 100873752 +PHB1P16 100128102 +PHB1P17 106480420 +PHB1P18 390311 +PHB1P19 494150 +PHB1P20 100130579 +PHB1P21 390730 +PHB2 11331 +PHB2P1 645318 +PHC1 1911 +PHC1P1 653441 +PHC2 1912 +PHC2-AS1 101929464 +PHC3 80012 +PHETA1 144717 +PHETA2 150368 +PHEX 5251 +PHEX-AS1 100873942 +PHF1 5252 +PHF2 5253 +PHF2P1 266695 +PHF2P2 100873793 +PHF3 23469 +PHF5A 84844 +PHF5AP1 450232 +PHF5AP2 450238 +PHF5AP3 450239 +PHF5AP4 450246 +PHF5AP5 450234 +PHF5AP6 450250 +PHF5AP7 100289442 +PHF6 84295 +PHF7 51533 +PHF8 23133 +PHF10 55274 +PHF10P1 158905 +PHF11 51131 +PHF12 57649 +PHF13 148479 +PHF14 9678 +PHF19 26147 +PHF20 51230 +PHF20L1 51105 +PHF21A 51317 +PHF21B 112885 +PHF23 79142 +PHF24 23349 +PHGDH 26227 +PHGR1 644844 +PHIP 55023 +PHKA1 5255 +PHKA1-AS1 101928259 +PHKA1P1 646780 +PHKA2 5256 +PHKA2-AS1 100132163 +PHKB 5257 +PHKBP1 5258 +PHKBP2 5259 +PHKG1 5260 +PHKG1P1 643941 +PHKG1P2 644032 +PHKG1P3 5262 +PHKG1P4 100151641 +PHKG2 5261 +PHLDA1 22822 +PHLDA1-AS1 120766149 +PHLDA1-DT 120766142 +PHLDA2 7262 +PHLDA3 23612 +PHLDB1 23187 +PHLDB2 90102 +PHLDB3 653583 +PHLPP1 23239 +PHLPP2 23035 +PHOSPHO1 162466 +PHOSPHO2 493911 +PHOX2A 401 +PHOX2B 8929 +PHOX2B-AS1 105374425 +PHPT1 29085 +PHRF1 57661 +PHTF1 10745 +PHTF2 57157 +PHYH 5264 +PHYHD1 254295 +PHYHIP 9796 +PHYHIPL 84457 +PHYKPL 85007 +PI3 5266 +PI4K2A 55361 +PI4K2B 55300 +PI4KA 5297 +PI4KAP1 728233 +PI4KAP2 375133 +PI4KB 5298 +PI15 51050 +PI16 221476 +PIANP 196500 +PIAS1 8554 +PIAS2 9063 +PIAS3 10401 +PIAS4 51588 +PIBF1 10464 +PICALM 8301 +PICART1 284080 +PICK1 9463 +PICSAR 378825 +PID1 55022 +PIDD1 55367 +PIERCE1 138162 +PIERCE2 145788 +PIEZO1 9780 +PIEZO1P1 128615 +PIEZO1P2 100874493 +PIEZO2 63895 +PIF1 80119 +PIGA 5277 +PIGAP1 5278 +PIGB 9488 +PIGBOS1 101928527 +PIGC 5279 +PIGCP1 5280 +PIGCP2 100128307 +PIGF 5281 +PIGFP1 5282 +PIGFP2 100422349 +PIGFP3 100129049 +PIGG 54872 +PIGH 5283 +PIGHP1 644761 +PIGK 10026 +PIGL 9487 +PIGM 93183 +PIGN 23556 +PIGO 84720 +PIGO-AS1 121847984 +PIGP 51227 +PIGPP1 112214169 +PIGPP2 106479056 +PIGPP3 100128033 +PIGPP4 106480811 +PIGQ 9091 +PIGQP1 106480812 +PIGR 5284 +PIGS 94005 +PIGT 51604 +PIGU 128869 +PIGUP1 100422342 +PIGV 55650 +PIGW 284098 +PIGX 54965 +PIGY 84992 +PIGY-DT 101929134 +PIGZ 80235 +PIH1D1 55011 +PIH1D2 120379 +PIK3AP1 118788 +PIK3C2A 5286 +PIK3C2B 5287 +PIK3C2G 5288 +PIK3C3 5289 +PIK3CA 5290 +PIK3CA-DT 101928739 +PIK3CB 5291 +PIK3CD 5293 +PIK3CD-AS1 644997 +PIK3CD-AS2 101929074 +PIK3CDP1 391349 +PIK3CG 5294 +PIK3IP1 113791 +PIK3IP1-DT 101929760 +PIK3R1 5295 +PIK3R2 5296 +PIK3R3 8503 +PIK3R4 30849 +PIK3R5 23533 +PIK3R5-DT 101928235 +PIK3R6 146850 +PIKFYVE 200576 +PILRA 29992 +PILRB 29990 +PIM1 5292 +PIM2 11040 +PIM3 415116 +PIMREG 54478 +PIMREGP1 442063 +PIMREGP2 402182 +PIMREGP3 100132736 +PIMREGP4 100421493 +PIN1 5300 +PIN1-DT 100996288 +PIN1P1 5301 +PIN4 5303 +PIN4P1 728758 +PINCR 101927501 +PINK1 65018 +PINK1-AS 100861548 +PINLYP 390940 +PINX1 54984 +PINX1-DT 101929229 +PIP 5304 +PIP4K2A 5305 +PIP4K2B 8396 +PIP4K2C 79837 +PIP4P1 90809 +PIP4P2 55529 +PIP5K1A 8394 +PIP5K1B 8395 +PIP5K1C 23396 +PIP5K1P1 206426 +PIP5K1P2 100129824 +PIP5KL1 138429 +PIPOX 51268 +PIPSL 266971 +PIR 8544 +PIRAT1 101929559 +PIRC1 100313844 +PIRC2 100313924 +PIRC3 100313905 +PIRC4 100313807 +PIRC5 100313845 +PIRC6 100313846 +PIRC7 100313782 +PIRC8 100313915 +PIRC9 100313847 +PIRC10 100313783 +PIRC11 100313897 +PIRC12 100313808 +PIRC13 100313925 +PIRC14 100313784 +PIRC15 100313848 +PIRC16 100313849 +PIRC17 100313809 +PIRC18 100313906 +PIRC19 100313926 +PIRC20 100313785 +PIRC21 100313916 +PIRC22 100313850 +PIRC23 100313786 +PIRC24 100313810 +PIRC25 100313851 +PIRC26 100313852 +PIRC27 100313907 +PIRC28 100313893 +PIRC29 100313927 +PIRC30 100313853 +PIRC31 100313787 +PIRC32 100313811 +PIRC33 100313854 +PIRC34 100313890 +PIRC35 100313855 +PIRC36 100313928 +PIRC37 100313812 +PIRC38 100313788 +PIRC39 100313856 +PIRC40 100313898 +PIRC41 100313917 +PIRC42 100313789 +PIRC43 100313857 +PIRC44 100313908 +PIRC45 100313813 +PIRC46 100313858 +PIRC47 100313859 +PIRC48 100313790 +PIRC49 100313929 +PIRC50 100313814 +PIRC51 100313860 +PIRC52 100313791 +PIRC53 100313861 +PIRC54 100313815 +PIRC55 100313792 +PIRC56 100313862 +PIRC57 100313930 +PIRC58 100313918 +PIRC59 100313909 +PIRC60 100313863 +PIRC61 100313899 +PIRC62 100313816 +PIRC63 100313793 +PIRC64 100313864 +PIRC65 100313794 +PIRC66 100313865 +PIRC67 100313817 +PIRC68 100313931 +PIRC69 100313910 +PIRC70 100313866 +PIRC71 100313818 +PIRC72 100313867 +PIRC73 100313795 +PIRC74 100313932 +PIRC75 100313919 +PIRC76 100313796 +PIRC77 100313868 +PIRC78 100313869 +PIRC79 100313797 +PIRC80 100313819 +PIRC81 100313870 +PIRC82 100313933 +PIRC83 100313891 +PIRC84 100313820 +PIRC85 100313871 +PIRC86 100313911 +PIRC87 100313872 +PIRC88 100313894 +PIRC89 100313873 +PIRC90 100313798 +PIRC91 100313900 +PIRC92 100313920 +PIRC93 100313934 +PIRC94 100313799 +PIRC95 100313935 +PIRC96 100313800 +PIRC97 100313821 +PIRC98 100313874 +PIRC99 100313875 +PIRC100 100313912 +PIRC101 100313888 +PIRC102 100313876 +PIRC103 100313901 +PIRC104 100313801 +PIRC105 100313936 +PIRC106 100313877 +PIRC107 100313802 +PIRC108 100313878 +PIRC109 100313913 +PIRC110 100313879 +PIRC111 100313937 +PIRC112 100313803 +PIRC113 100313880 +PIRC114 100313881 +PIRT 644139 +PISD 23761 +PISRT1 140464 +PITHD1 57095 +PITPNA 5306 +PITPNA-AS1 100306951 +PITPNB 23760 +PITPNC1 26207 +PITPNM1 9600 +PITPNM2 57605 +PITPNM2-AS1 100507091 +PITPNM3 83394 +PITRM1 10531 +PITRM1-AS1 100507034 +PITX1 5307 +PITX1-AS1 100996485 +PITX2 5308 +PITX3 5309 +PIWIL1 9271 +PIWIL2 55124 +PIWIL2-DT 100507071 +PIWIL3 440822 +PIWIL4 143689 +PIWIL4-AS1 105369438 +PJA1 64219 +PJA2 9867 +PJVK 494513 +PKD1 5310 +PKD1-AS1 105371049 +PKD1L1 168507 +PKD1L1-AS1 80099 +PKD1L2 114780 +PKD1L3 342372 +PKD1P1 339044 +PKD1P2 283955 +PKD1P3 339039 +PKD1P4 353512 +PKD1P5 348156 +PKD1P6 353511 +PKD2 5311 +PKD2L1 9033 +PKD2L2 27039 +PKD2L2-DT 101928005 +PKDCC 91461 +PKDREJ 10343 +PKHD1 5314 +PKHD1L1 93035 +PKIA 5569 +PKIA-AS1 101927003 +PKIB 5570 +PKIG 11142 +PKLR 5313 +PKM 5315 +PKMP1 643586 +PKMP2 402408 +PKMP3 100419758 +PKMP4 106480443 +PKMP5 442156 +PKMYT1 9088 +PKMYT1AR 130572098 +PKN1 5585 +PKN2 5586 +PKN2-AS1 101927891 +PKN3 29941 +PKNOX1 5316 +PKNOX2 63876 +PKNOX2-AS1 105369549 +PKNOX2-DT 103695364 +PKP1 5317 +PKP2 5318 +PKP2P1 82500 +PKP3 11187 +PKP4 8502 +PKP4-AS1 100129029 +PKP4P1 402116 +PLA1A 51365 +PLA2G1B 5319 +PLA2G2A 5320 +PLA2G2C 391013 +PLA2G2D 26279 +PLA2G2E 30814 +PLA2G2F 64600 +PLA2G3 50487 +PLA2G4A 5321 +PLA2G4B 100137049 +PLA2G4C 8605 +PLA2G4C-AS1 106144526 +PLA2G4D 283748 +PLA2G4E 123745 +PLA2G4E-AS1 101928388 +PLA2G4F 255189 +PLA2G5 5322 +PLA2G6 8398 +PLA2G7 7941 +PLA2G10 8399 +PLA2G10BP 100652777 +PLA2G10CP 127525785 +PLA2G10DP 127525786 +PLA2G10EP 127525791 +PLA2G10FP 127525794 +PLA2G10GP 127525787 +PLA2G10HP 127525795 +PLA2G10IP 127525793 +PLA2G10JP 127525788 +PLA2G10KP 127525796 +PLA2G10P1 112268454 +PLA2G12A 81579 +PLA2G12AP1 100420258 +PLA2G12AP2 100420281 +PLA2G12B 84647 +PLA2G15 23659 +PLA2R1 22925 +PLAA 9373 +PLAAT1 57110 +PLAAT2 54979 +PLAAT3 11145 +PLAAT4 5920 +PLAAT5 117245 +PLAC1 10761 +PLAC4 191585 +PLAC8 51316 +PLAC8L1 153770 +PLAC9 219348 +PLAC9P1 389033 +PLAG1 5324 +PLAGL1 5325 +PLAGL2 5326 +PLAT 5327 +PLAU 5328 +PLAUR 5329 +PLB1 151056 +PLBD1 79887 +PLBD1-AS1 101928290 +PLBD2 196463 +PLCB1 23236 +PLCB1-IT1 100874337 +PLCB2 5330 +PLCB2-AS1 100874186 +PLCB3 5331 +PLCB4 5332 +PLCD1 5333 +PLCD3 113026 +PLCD4 84812 +PLCE1 51196 +PLCE1-AS1 100128054 +PLCE1-AS2 101927049 +PLCE1P1 100420075 +PLCG1 5335 +PLCG1-AS1 101927117 +PLCG2 5336 +PLCH1 23007 +PLCH1-AS1 100874035 +PLCH1-AS2 100874036 +PLCH2 9651 +PLCL1 5334 +PLCL2 23228 +PLCL2-AS1 100874003 +PLCXD1 55344 +PLCXD2 257068 +PLCXD2-AS1 100874115 +PLCXD3 345557 +PLCZ1 89869 +PLD1 5337 +PLD2 5338 +PLD3 23646 +PLD4 122618 +PLD5 200150 +PLD5P1 100420618 +PLD6 201164 +PLEC 5339 +PLEK 5341 +PLEK2 26499 +PLEKHA1 59338 +PLEKHA2 59339 +PLEKHA3 65977 +PLEKHA3P1 91405 +PLEKHA4 57664 +PLEKHA5 54477 +PLEKHA6 22874 +PLEKHA7 144100 +PLEKHA8 84725 +PLEKHA8P1 51054 +PLEKHB1 58473 +PLEKHB2 55041 +PLEKHB2P1 100128022 +PLEKHD1 400224 +PLEKHF1 79156 +PLEKHF2 79666 +PLEKHG1 57480 +PLEKHG2 64857 +PLEKHG3 26030 +PLEKHG4 25894 +PLEKHG4B 153478 +PLEKHG5 57449 +PLEKHG6 55200 +PLEKHG7 440107 +PLEKHH1 57475 +PLEKHH2 130271 +PLEKHH3 79990 +PLEKHJ1 55111 +PLEKHM1 9842 +PLEKHM1P1 440456 +PLEKHM2 23207 +PLEKHM3 389072 +PLEKHN1 84069 +PLEKHO1 51177 +PLEKHO2 80301 +PLEKHS1 79949 +PLET1 349633 +PLG 5340 +PLGLA 285189 +PLGLB1 5343 +PLGLB2 5342 +PLGRKT 55848 +PLIN1 5346 +PLIN2 123 +PLIN3 10226 +PLIN4 729359 +PLIN5 440503 +PLK1 5347 +PLK2 10769 +PLK3 1263 +PLK4 10733 +PLK5 126520 +PLLP 51090 +PLLPP1 139061 +PLN 5350 +PLOD1 5351 +PLOD2 5352 +PLOD3 8985 +PLP1 5354 +PLP2 5355 +PLPBP 11212 +PLPP1 8611 +PLPP2 8612 +PLPP3 8613 +PLPP4 196051 +PLPP5 84513 +PLPP6 403313 +PLPP7 84814 +PLPPR1 54886 +PLPPR2 64748 +PLPPR3 79948 +PLPPR4 9890 +PLPPR5 163404 +PLPPR5-AS1 100129620 +PLRG1 5356 +PLS1 5357 +PLS1-AS1 100873943 +PLS1P1 100129471 +PLS3 5358 +PLS3-AS1 101927352 +PLSCR1 5359 +PLSCR2 57047 +PLSCR3 57048 +PLSCR4 57088 +PLSCR4P1 100419967 +PLSCR5 389158 +PLSCR5-AS1 100874104 +PLTP 5360 +PLUT 100861550 +PLVAP 83483 +PLXDC1 57125 +PLXDC2 84898 +PLXNA1 5361 +PLXNA2 5362 +PLXNA3 55558 +PLXNA4 91584 +PLXNB1 5364 +PLXNB2 23654 +PLXNB3 5365 +PLXNB3-AS1 102723591 +PLXNC1 10154 +PLXND1 23129 +PM20D1 148811 +PM20D1-AS1 284581 +PM20D2 135293 +PMAIP1 5366 +PMCH 5367 +PMCHL1 5369 +PMCHL2 5370 +PMEL 6490 +PMEPA1 56937 +PMF1 11243 +PMF1-BGLAP 100527963 +PMFBP1 83449 +PMIS2 111216276 +PML 5371 +PMM1 5372 +PMM2 5373 +PMM2P1 390831 +PMM2P2 646065 +PMP2 5375 +PMP22 5376 +PMPCA 23203 +PMPCAP1 133083 +PMPCB 9512 +PMS1 5378 +PMS2 5395 +PMS2CL 441194 +PMS2P1 5379 +PMS2P2 5380 +PMS2P3 5387 +PMS2P4 5382 +PMS2P5 5383 +PMS2P6 729453 +PMS2P7 100101440 +PMS2P8 729299 +PMS2P9 100132832 +PMS2P10 100288713 +PMS2P11 107161145 +PMS2P12 392713 +PMS2P13 441259 +PMS2P14 122149300 +PMVK 10654 +PNCK 139728 +PNISR 25957 +PNISR-AS1 101927365 +PNKD 25953 +PNKDP1 100506715 +PNKP 11284 +PNLDC1 154197 +PNLIP 5406 +PNLIPP1 100419068 +PNLIPRP1 5407 +PNLIPRP2 5408 +PNLIPRP3 119548 +PNMA1 9240 +PNMA2 10687 +PNMA3 29944 +PNMA5 114824 +PNMA6A 84968 +PNMA6B 728513 +PNMA6E 649238 +PNMA6F 105373377 +PNMA8A 55228 +PNMA8B 57469 +PNMA8C 110806277 +PNMT 5409 +PNN 5411 +PNN-AS1 123466206 +PNO1 56902 +PNOC 5368 +PNP 4860 +PNPLA1 285848 +PNPLA2 57104 +PNPLA3 80339 +PNPLA4 8228 +PNPLA4P1 100462832 +PNPLA5 150379 +PNPLA6 10908 +PNPLA7 375775 +PNPLA8 50640 +PNPLA10P 643773 +PNPO 55163 +PNPP1 647275 +PNPT1 87178 +PNPT1P1 100288506 +PNPT1P2 100533721 +PNRC1 10957 +PNRC1-DT 118597843 +PNRC2 55629 +PNRC2P1 100131261 +POC1A 25886 +POC1B 282809 +POC1B-AS1 109729146 +POC1B-GALNT4 100528030 +POC5 134359 +PODN 127435 +PODNL1 79883 +PODXL 5420 +PODXL2 50512 +POF1B 79983 +POFUT1 23509 +POFUT2 23275 +POGK 57645 +POGLUT1 56983 +POGLUT2 79070 +POGLUT2P1 100144494 +POGLUT3 143888 +POGZ 23126 +POLA1 5422 +POLA2 23649 +POLB 5423 +POLD1 5424 +POLD2 5425 +POLD2P1 391811 +POLD3 10714 +POLD4 57804 +POLDIP2 26073 +POLDIP3 84271 +POLE 5426 +POLE2 5427 +POLE3 54107 +POLE4 56655 +POLE4P1 127379694 +POLG 5428 +POLG-DT 119545629 +POLG2 11232 +POLGARF 125316803 +POLH 5429 +POLH-AS1 111216283 +POLHP1 106480782 +POLI 11201 +POLK 51426 +POLL 27343 +POLM 27434 +POLN 353497 +POLQ 10721 +POLR1A 25885 +POLR1B 84172 +POLR1C 9533 +POLR1D 51082 +POLR1E 64425 +POLR1F 221830 +POLR1G 10849 +POLR1H 30834 +POLR1HASP 80862 +POLR2A 5430 +POLR2B 5431 +POLR2C 5432 +POLR2CP1 54038 +POLR2D 5433 +POLR2DP1 442042 +POLR2DP2 116435285 +POLR2E 5434 +POLR2F 5435 +POLR2G 5436 +POLR2H 5437 +POLR2I 5438 +POLR2J 5439 +POLR2J2 246721 +POLR2J3 548644 +POLR2J4 84820 +POLR2K 5440 +POLR2KP1 100874515 +POLR2KP2 100129174 +POLR2L 5441 +POLR2LP1 493825 +POLR2M 81488 +POLR2MP1 339970 +POLR3A 11128 +POLR3B 55703 +POLR3C 10623 +POLR3D 661 +POLR3DP1 100422384 +POLR3E 55718 +POLR3F 10621 +POLR3G 10622 +POLR3GL 84265 +POLR3GP1 100422395 +POLR3GP2 100422391 +POLR3H 171568 +POLR3K 51728 +POLR3KP1 100289667 +POLR3KP2 390811 +POLRMT 5442 +POLRMTP1 284167 +POM121 9883 +POM121B 100288540 +POM121C 100101267 +POM121L1P 25812 +POM121L2 94026 +POM121L3P 651452 +POM121L4P 266697 +POM121L6P 729392 +POM121L7P 728418 +POM121L8P 29797 +POM121L9P 29774 +POM121L10P 646074 +POM121L11P 100129643 +POM121L12 285877 +POM121L13P 100874379 +POM121L14P 727805 +POM121L15P 102725072 +POMC 5443 +POMGNT1 55624 +POMGNT2 84892 +POMK 84197 +POMP 51371 +POMPP1 101060113 +POMT1 10585 +POMT2 29954 +POMZP3 22932 +PON1 5444 +PON2 5445 +PON3 5446 +POP1 10940 +POP4 10775 +POP5 51367 +POP7 10248 +POPDC2 64091 +POPDC3 64208 +POR 5447 +PORCN 64840 +PORCN-DT 101927635 +POSTN 10631 +POT1 25913 +POT1-AS1 401398 +POTEA 340441 +POTEB 100996331 +POTEB2 100287399 +POTEB3 102724631 +POTEC 388468 +POTED 317754 +POTEE 445582 +POTEF 728378 +POTEF-AS1 105373617 +POTEG 404785 +POTEH 23784 +POTEH-AS1 100852406 +POTEI 653269 +POTEJ 653781 +POTEKP 440915 +POTEM 641455 +POU1F1 5449 +POU2AF1 5450 +POU2AF2 341032 +POU2AF3 120376 +POU2F1 5451 +POU2F1-DT 118568815 +POU2F2 5452 +POU2F2-AS2 128071540 +POU2F3 25833 +POU3F1 5453 +POU3F2 5454 +POU3F3 5455 +POU3F4 5456 +POU4F1 5457 +POU4F2 5458 +POU4F3 5459 +POU5F1 5460 +POU5F1B 5462 +POU5F1P2 100129512 +POU5F1P3 642559 +POU5F1P4 645682 +POU5F1P5 100009667 +POU5F1P6 100009668 +POU5F1P7 100009669 +POU5F2 134187 +POU6F1 5463 +POU6F2 11281 +POU6F2-AS1 100861520 +POU6F2-AS2 100689074 +PP1P 151842 +PP2D1 151649 +PPA1 5464 +PPA2 27068 +PPAN 56342 +PPAN-P2RY11 692312 +PPARA 5465 +PPARD 5467 +PPARG 5468 +PPARGC1A 10891 +PPARGC1B 133522 +PPAT 5471 +PPATP1 100289640 +PPATP2 100421601 +PPBP 5473 +PPBPP1 728045 +PPBPP2 10895 +PPCDC 60490 +PPCS 79717 +PPDPF 79144 +PPDPFL 492307 +PPDPFP1 127379739 +PPDPFP2 127379756 +PPEF1 5475 +PPEF1-AS1 100874004 +PPEF2 5470 +PPFIA1 8500 +PPFIA1P1 100422710 +PPFIA2 8499 +PPFIA2-AS1 102724663 +PPFIA3 8541 +PPFIA4 8497 +PPFIBP1 8496 +PPFIBP2 8495 +PPHLN1 51535 +PPIA 5478 +PPIAL4A 653505 +PPIAL4C 653598 +PPIAL4D 645142 +PPIAL4E 730262 +PPIAL4F 728945 +PPIAL4G 644591 +PPIAL4H 105371242 +PPIAP1 100288185 +PPIAP2 170537 +PPIAP3 170539 +PPIAP4 122552 +PPIAP5 122842 +PPIAP6 319128 +PPIAP7 5489 +PPIAP8 341457 +PPIAP9 5491 +PPIAP10 140913 +PPIAP11 5483 +PPIAP13 5485 +PPIAP14 5486 +PPIAP15 5487 +PPIAP16 5488 +PPIAP17 170540 +PPIAP18 729673 +PPIAP19 390006 +PPIAP20 100500737 +PPIAP21 170536 +PPIAP22 653214 +PPIAP23 390419 +PPIAP24 122335 +PPIAP25 647085 +PPIAP26 121981 +PPIAP27 100874405 +PPIAP28 390378 +PPIAP29 134997 +PPIAP30 100192204 +PPIAP31 439953 +PPIAP32 101927399 +PPIAP33 392285 +PPIAP34 101060363 +PPIAP35 128192 +PPIAP36 111082961 +PPIAP37 111082976 +PPIAP38 111082962 +PPIAP39 111082963 +PPIAP40 107984349 +PPIAP41 111082977 +PPIAP42 100507231 +PPIAP43 440063 +PPIAP44 111082964 +PPIAP45 100506099 +PPIAP46 729739 +PPIAP47 391532 +PPIAP48 111082978 +PPIAP49 111082973 +PPIAP50 111082974 +PPIAP51 729313 +PPIAP52 111082965 +PPIAP53 649873 +PPIAP54 390791 +PPIAP55 342541 +PPIAP56 101927689 +PPIAP57 111082979 +PPIAP58 126170 +PPIAP59 390956 +PPIAP60 107985791 +PPIAP61 112268435 +PPIAP62 101928610 +PPIAP63 111082966 +PPIAP64 100287361 +PPIAP65 111082980 +PPIAP66 643997 +PPIAP67 111082981 +PPIAP68 111082967 +PPIAP69 111082982 +PPIAP70 100506946 +PPIAP71 107986014 +PPIAP72 256374 +PPIAP73 391587 +PPIAP74 131055 +PPIAP75 111082968 +PPIAP76 111082983 +PPIAP77 402213 +PPIAP78 202227 +PPIAP79 100289244 +PPIAP80 402644 +PPIAP81 107986732 +PPIAP82 442713 +PPIAP83 111082969 +PPIAP84 111082984 +PPIAP85 110596867 +PPIAP86 111082970 +PPIAP87 392352 +PPIAP88 111082971 +PPIAP89 442460 +PPIAP90 111082985 +PPIAP91 111082972 +PPIAP93 116435287 +PPIB 5479 +PPIC 5480 +PPIC-AS1 107986447 +PPID 5481 +PPIE 10450 +PPIEL 728448 +PPIF 10105 +PPIG 9360 +PPIGP1 100131033 +PPIH 10465 +PPIHP1 246731 +PPIHP2 404199 +PPIL1 51645 +PPIL1P1 150947 +PPIL2 23759 +PPIL3 53938 +PPIL4 85313 +PPIL6 285755 +PPIP5K1 9677 +PPIP5K1P1 554224 +PPIP5K2 23262 +PPL 5493 +PPM1A 5494 +PPM1AP1 137012 +PPM1B 5495 +PPM1B-DT 102723904 +PPM1D 8493 +PPM1E 22843 +PPM1F 9647 +PPM1F-AS1 100286925 +PPM1G 5496 +PPM1H 57460 +PPM1J 333926 +PPM1J-DT 105378910 +PPM1K 152926 +PPM1K-DT 105369192 +PPM1L 151742 +PPM1L-DT 119863869 +PPM1M 132160 +PPM1N 147699 +PPME1 51400 +PPOX 5498 +PPP1CA 5499 +PPP1CB 5500 +PPP1CB-DT 112267877 +PPP1CC 5501 +PPP1R1A 5502 +PPP1R1AP1 94304 +PPP1R1AP2 100129627 +PPP1R1B 84152 +PPP1R1C 151242 +PPP1R2 5504 +PPP1R2B 153743 +PPP1R2C 80316 +PPP1R2P1 100507444 +PPP1R2P2 54036 +PPP1R2P4 728970 +PPP1R2P5 649489 +PPP1R2P6 100130972 +PPP1R2P8 94310 +PPP1R2P10 100128626 +PPP1R3A 5506 +PPP1R3B 79660 +PPP1R3B-DT 102724880 +PPP1R3C 5507 +PPP1R3D 5509 +PPP1R3E 90673 +PPP1R3F 89801 +PPP1R3G 648791 +PPP1R7 5510 +PPP1R8 5511 +PPP1R8P1 5512 +PPP1R9A 55607 +PPP1R9A-AS1 105375405 +PPP1R9B 84687 +PPP1R10 5514 +PPP1R10P1 100422381 +PPP1R11 6992 +PPP1R11P1 94297 +PPP1R11P2 94298 +PPP1R12A 4659 +PPP1R12A-AS1 105369865 +PPP1R12A-AS2 105369864 +PPP1R12B 4660 +PPP1R12BP1 360021 +PPP1R12BP2 360020 +PPP1R12C 54776 +PPP1R13B 23368 +PPP1R13B-DT 145216 +PPP1R13L 10848 +PPP1R14A 94274 +PPP1R14B 26472 +PPP1R14B-AS1 105369340 +PPP1R14BP1 50516 +PPP1R14BP2 729406 +PPP1R14BP3 100507617 +PPP1R14BP4 94302 +PPP1R14BP5 442256 +PPP1R14C 81706 +PPP1R14D 54866 +PPP1R15A 23645 +PPP1R15B 84919 +PPP1R15B-AS1 122455336 +PPP1R16A 84988 +PPP1R16B 26051 +PPP1R17 10842 +PPP1R18 170954 +PPP1R21 129285 +PPP1R21-DT 118568827 +PPP1R26 9858 +PPP1R26-AS1 100506599 +PPP1R26P1 100418740 +PPP1R26P2 100133064 +PPP1R26P3 100132173 +PPP1R26P4 100132295 +PPP1R26P5 100133040 +PPP1R27 116729 +PPP1R35 221908 +PPP1R35-AS1 101927632 +PPP1R36 145376 +PPP1R37 284352 +PPP1R42 286187 +PPP2CA 5515 +PPP2CA-DT 118732304 +PPP2CB 5516 +PPP2CBP1 5517 +PPP2R1A 5518 +PPP2R1B 5519 +PPP2R2A 5520 +PPP2R2B 5521 +PPP2R2B-IT1 100874361 +PPP2R2C 5522 +PPP2R2D 55844 +PPP2R2DP1 100327036 +PPP2R3A 5523 +PPP2R3B 28227 +PPP2R3C 55012 +PPP2R5A 5525 +PPP2R5B 5526 +PPP2R5C 5527 +PPP2R5CP 140921 +PPP2R5D 5528 +PPP2R5E 5529 +PPP3CA 5530 +PPP3CB 5532 +PPP3CB-AS1 101929145 +PPP3CC 5533 +PPP3R1 5534 +PPP3R2 5535 +PPP4C 5531 +PPP4R1 9989 +PPP4R1-AS1 101927323 +PPP4R1L 55370 +PPP4R2 151987 +PPP4R2P1 100421419 +PPP4R2P2 124900550 +PPP4R2P3 124900549 +PPP4R2P4 100131868 +PPP4R2P5 124901187 +PPP4R2P6 127460884 +PPP4R3A 55671 +PPP4R3B 57223 +PPP4R3B-DT 107985885 +PPP4R3C 139420 +PPP4R4 57718 +PPP5C 5536 +PPP5D1P 100506012 +PPP6C 5537 +PPP6CP 100144631 +PPP6R1 22870 +PPP6R2 9701 +PPP6R2P1 100631381 +PPP6R3 55291 +PPRC1 23082 +PPT1 5538 +PPT2 9374 +PPT2-EGFL8 100532746 +PPTC7 160760 +PPWD1 23398 +PPY 5539 +PPY2P 23614 +PQBP1 10084 +PRAC1 84366 +PRAC2 360205 +PRADC1 84279 +PRADC1P1 645571 +PRADX 126568849 +PRAF2 11230 +PRAG1 157285 +PRAL 109245082 +PRAM1 84106 +PRAME 23532 +PRAMEF1 65121 +PRAMEF2 65122 +PRAMEF4 400735 +PRAMEF5 343068 +PRAMEF6 440561 +PRAMEF7 441871 +PRAMEF8 391002 +PRAMEF9 343070 +PRAMEF10 343071 +PRAMEF11 440560 +PRAMEF12 390999 +PRAMEF13 400736 +PRAMEF14 729528 +PRAMEF15 653619 +PRAMEF17 391004 +PRAMEF18 391003 +PRAMEF19 645414 +PRAMEF20 645425 +PRAMEF22 653606 +PRAMEF25 441873 +PRAMEF26 645359 +PRAMEF27 101929983 +PRAMEF28P 102724742 +PRAMEF29P 729356 +PRAMEF30P 441870 +PRAMEF31P 100129611 +PRAMEF32P 650236 +PRAMEF33 645382 +PRAMEF34P 649324 +PRAMEF35P 100419649 +PRAMEF36P 645354 +PRAMENP 649179 +PRANCR 101928062 +PRAP1 118471 +PRB1 5542 +PRB2 653247 +PRB3 5544 +PRB4 5545 +PRC1 9055 +PRC1-AS1 100507118 +PRCC 5546 +PRCD 768206 +PRCP 5547 +PRCPP1 100421289 +PRDM1 639 +PRDM2 7799 +PRDM4 11108 +PRDM4-AS1 101929162 +PRDM5 11107 +PRDM6 93166 +PRDM6-AS1 105379152 +PRDM7 11105 +PRDM8 56978 +PRDM8-AS1 105377303 +PRDM9 56979 +PRDM10 56980 +PRDM10-DT 440072 +PRDM11 56981 +PRDM12 59335 +PRDM13 59336 +PRDM14 63978 +PRDM15 63977 +PRDM16 63976 +PRDM16-DT 440556 +PRDX1 5052 +PRDX1P1 7002 +PRDX2 7001 +PRDX2P1 359844 +PRDX2P2 646218 +PRDX2P3 100418943 +PRDX2P4 442239 +PRDX3 10935 +PRDX3P1 100419031 +PRDX3P2 100128092 +PRDX3P3 100128902 +PRDX3P4 100418955 +PRDX4 10549 +PRDX4P1 100418949 +PRDX4P2 100418942 +PRDX5 25824 +PRDX5P1 111501764 +PRDX6 9588 +PRDX6-AS1 101928673 +PREB 10113 +PRECSIT 283487 +PRELID1 27166 +PRELID1P1 728666 +PRELID1P2 100419971 +PRELID1P3 100420046 +PRELID1P4 390572 +PRELID1P5 388734 +PRELID1P6 388955 +PRELID1P7 116435286 +PRELID2 153768 +PRELID2P1 102606462 +PRELID3A 10650 +PRELID3B 51012 +PRELID3BP1 100129664 +PRELID3BP2 106481667 +PRELID3BP3 100128712 +PRELID3BP4 100420275 +PRELID3BP5 106480242 +PRELID3BP6 100132940 +PRELID3BP7 730974 +PRELID3BP8 106480243 +PRELID3BP9 100420277 +PRELID3BP10 646873 +PRELID3BP11 102723314 +PRELP 5549 +PREP 5550 +PREPL 9581 +PREX1 57580 +PREX2 80243 +PRF1 5551 +PRG2 5553 +PRG3 10394 +PRG4 10216 +PRH1 5554 +PRH2 5555 +PRICKLE1 144165 +PRICKLE1P1 100131977 +PRICKLE2 166336 +PRICKLE2-AS1 100652759 +PRICKLE2-AS2 100874242 +PRICKLE2-AS3 100874243 +PRICKLE2-DT 101929316 +PRICKLE3 4007 +PRICKLE4 29964 +PRIM1 5557 +PRIM2 5558 +PRIM2BP 100996481 +PRIMA1 145270 +PRIMPOL 201973 +PRINS 100169750 +PRKAA1 5562 +PRKAA2 5563 +PRKAB1 5564 +PRKAB2 5565 +PRKACA 5566 +PRKACB 5567 +PRKACB-DT 118597836 +PRKACG 5568 +PRKAG1 5571 +PRKAG2 51422 +PRKAG2-AS1 100505483 +PRKAG2-AS2 644090 +PRKAG3 53632 +PRKAR1A 5573 +PRKAR1AP1 5574 +PRKAR1B 5575 +PRKAR1B-AS1 101926963 +PRKAR1B-AS2 101927000 +PRKAR2A 5576 +PRKAR2A-AS1 100506637 +PRKAR2B 5577 +PRKAR2B-AS1 105375441 +PRKCA 5578 +PRKCA-AS1 101928001 +PRKCB 5579 +PRKCD 5580 +PRKCE 5581 +PRKCE-AS1 105374580 +PRKCG 5582 +PRKCH 5583 +PRKCH-AS1 121233923 +PRKCI 5584 +PRKCIP1 158948 +PRKCQ 5588 +PRKCQ-AS1 439949 +PRKCSH 5589 +PRKCZ 5590 +PRKCZ-AS1 100506504 +PRKCZ-DT 105378591 +PRKD1 5587 +PRKD2 25865 +PRKD3 23683 +PRKD3-DT 101929542 +PRKDC 5591 +PRKG1 5592 +PRKG1-AS1 100506939 +PRKG2 5593 +PRKG2-AS1 101928942 +PRKN 5071 +PRKRA 8575 +PRKRAP1 731716 +PRKRIP1 79706 +PRKX 5613 +PRKX-AS1 100873944 +PRKXP1 441733 +PRKXP2 5615 +PRKY 5616 +PRL 5617 +PRLH 51052 +PRLHR 2834 +PRLR 5618 +PRM1 5619 +PRM2 5620 +PRM3 58531 +PRMT1 3276 +PRMT1P1 100420910 +PRMT2 3275 +PRMT3 10196 +PRMT5 10419 +PRMT5-AS1 100505758 +PRMT5-DT 101926933 +PRMT5P1 100420927 +PRMT6 55170 +PRMT7 54496 +PRMT8 56341 +PRMT9 90826 +PRNCR1 101867536 +PRND 23627 +PRNP 5621 +PRNT 149830 +PROB1 389333 +PROC 5624 +PROCA1 147011 +PROCR 10544 +PRODH 5625 +PRODH2 58510 +PRODHLP 440792 +PROK1 84432 +PROK2 60675 +PROKR1 10887 +PROKR2 128674 +PROM1 8842 +PROM2 150696 +PROP1 5626 +PRORP 9692 +PRORSD1P 344405 +PRORY 100533178 +PROS1 5627 +PROS2P 5628 +PROSER1 80209 +PROSER2 254427 +PROSER2-AS1 219731 +PROSER3 148137 +PROX1 5629 +PROX1-AS1 100505832 +PROX2 283571 +PROZ 8858 +PRPF3 9129 +PRPF4 9128 +PRPF4B 8899 +PRPF4BP1 653155 +PRPF6 24148 +PRPF8 10594 +PRPF18 8559 +PRPF19 27339 +PRPF19-DT 107984333 +PRPF19P1 100422496 +PRPF31 26121 +PRPF31-AS1 121832802 +PRPF38A 84950 +PRPF38AP1 389935 +PRPF38AP2 100131947 +PRPF38B 55119 +PRPF39 55015 +PRPF39-DT 105370474 +PRPF40A 55660 +PRPF40B 25766 +PRPH 5630 +PRPH2 5961 +PRPS1 5631 +PRPS1L1 221823 +PRPS1P1 100861436 +PRPS1P2 100421295 +PRPS2 5634 +PRPSAP1 5635 +PRPSAP2 5636 +PRR3 80742 +PRR3P1 100128772 +PRR4 11272 +PRR5 55615 +PRR5-ARHGAP8 553158 +PRR5L 79899 +PRR7 80758 +PRR7-AS1 340037 +PRR9 574414 +PRR11 55771 +PRR11-AS1 125775237 +PRR12 57479 +PRR13 54458 +PRR13P1 647195 +PRR13P2 106480303 +PRR13P3 100129201 +PRR13P4 100288008 +PRR13P5 440525 +PRR13P6 112272601 +PRR13P7 100289644 +PRR14 78994 +PRR14L 253143 +PRR15 222171 +PRR15-DT 107986700 +PRR15L 79170 +PRR16 51334 +PRR18 285800 +PRR19 284338 +PRR20A 122183 +PRR20B 729233 +PRR20C 729240 +PRR20D 729246 +PRR20E 729250 +PRR20FP 106480416 +PRR20G 100419008 +PRR21 643905 +PRR22 163154 +PRR23A 729627 +PRR23B 389151 +PRR23C 389152 +PRR23D1 100131608 +PRR23D2 100133251 +PRR23D3P 101929013 +PRR23E 285311 +PRR23E2P 101060159 +PRR25 388199 +PRR27 401137 +PRR29 92340 +PRR29-AS1 400612 +PRR30 339779 +PRR32 100130613 +PRR33 102724536 +PRR34 55267 +PRR34-AS1 150381 +PRR35 146325 +PRR36 80164 +PRRC1 133619 +PRRC2A 7916 +PRRC2B 84726 +PRRC2C 23215 +PRRC2CP1 360018 +PRRG1 5638 +PRRG2 5639 +PRRG3 79057 +PRRG4 79056 +PRRT1 80863 +PRRT1B 642515 +PRRT2 112476 +PRRT3 285368 +PRRT3-AS1 100874032 +PRRT4 401399 +PRRX1 5396 +PRRX2 51450 +PRRX2-AS1 101929437 +PRSS1 5644 +PRSS2 5645 +PRSS3 5646 +PRSS3P1 168330 +PRSS3P2 154754 +PRSS3P3 136540 +PRSS3P4 106480774 +PRSS8 5652 +PRSS12 8492 +PRSS16 10279 +PRSS21 10942 +PRSS22 64063 +PRSS23 11098 +PRSS23-AS1 107984429 +PRSS27 83886 +PRSS29P 123787 +PRSS30P 124221 +PRSS33 260429 +PRSS35 167681 +PRSS36 146547 +PRSS37 136242 +PRSS38 339501 +PRSS40A 150527 +PRSS40B 646743 +PRSS41 360226 +PRSS42P 339906 +PRSS43P 100288960 +PRSS44P 729756 +PRSS45P 377047 +PRSS46P 100287362 +PRSS47P 138652 +PRSS48 345062 +PRSS50 29122 +PRSS51 346702 +PRSS52P 100419209 +PRSS53 339105 +PRSS54 221191 +PRSS55 203074 +PRSS56 646960 +PRSS57 400668 +PRSS58 136541 +PRSS59P 207147 +PRTFDC1 56952 +PRTG 283659 +PRTN3 5657 +PRUNE1 58497 +PRUNE1P1 100129595 +PRUNE2 158471 +PRX 57716 +PRXL2A 84293 +PRXL2AP1 100420900 +PRXL2AP2 100131252 +PRXL2B 127281 +PRXL2C 195827 +PRXL2CP1 650181 +PRY 9081 +PRY2 442862 +PRYP1 442863 +PRYP2 442864 +PRYP3 442865 +PRYP4 442866 +PRYP5 106478933 +PRYP6 106480721 +PSAP 5660 +PSAPL1 768239 +PSAT1 29968 +PSAT1P1 137133 +PSAT1P2 107133519 +PSAT1P3 729779 +PSAT1P4 100287630 +PSCA 8000 +PSD 5662 +PSD2 84249 +PSD2-AS1 101929696 +PSD3 23362 +PSD4 23550 +PSEN1 5663 +PSEN2 5664 +PSENEN 55851 +PSG1 5669 +PSG2 5670 +PSG3 5671 +PSG4 5672 +PSG5 5673 +PSG6 5675 +PSG7 5676 +PSG8 440533 +PSG8-AS1 100289650 +PSG9 5678 +PSG10P 653492 +PSG11 5680 +PSG11-AS1 127379750 +PSIP1 11168 +PSIP1P1 353329 +PSIP1P2 360022 +PSKH1 5681 +PSKH2 85481 +PSLNR 106146148 +PSMA1 5682 +PSMA1P1 100422286 +PSMA2 5683 +PSMA2P1 100130923 +PSMA2P2 100131775 +PSMA2P3 79055 +PSMA3 5684 +PSMA3-AS1 379025 +PSMA3P1 326617 +PSMA4 5685 +PSMA5 5686 +PSMA5P1 117751738 +PSMA6 5687 +PSMA6P1 64596 +PSMA6P2 729412 +PSMA6P3 100874510 +PSMA6P4 121906 +PSMA7 5688 +PSMA7P1 117134610 +PSMA8 143471 +PSMB1 5689 +PSMB2 5690 +PSMB3 5691 +PSMB3P1 121131 +PSMB3P2 130700 +PSMB4 5692 +PSMB5 5693 +PSMB6 5694 +PSMB7 5695 +PSMB7P1 100422289 +PSMB8 5696 +PSMB8-AS1 100507463 +PSMB9 5698 +PSMB10 5699 +PSMB11 122706 +PSMC1 5700 +PSMC1P1 151645 +PSMC1P2 442291 +PSMC1P3 392100 +PSMC1P4 345645 +PSMC1P5 106480732 +PSMC1P6 643766 +PSMC1P7 646085 +PSMC1P8 390297 +PSMC1P9 643668 +PSMC1P10 388925 +PSMC1P11 442153 +PSMC1P12 644094 +PSMC1P13 100422305 +PSMC2 5701 +PSMC2P1 729674 +PSMC2P2 100422271 +PSMC3 5702 +PSMC3IP 29893 +PSMC3P1 5703 +PSMC4 5704 +PSMC5 5705 +PSMC6 5706 +PSMC6P1 266723 +PSMC6P2 160410 +PSMC6P3 100128218 +PSMD1 5707 +PSMD2 5708 +PSMD2P1 266783 +PSMD3 5709 +PSMD4 5710 +PSMD4P1 54035 +PSMD5 5711 +PSMD6 9861 +PSMD6-AS1 109729140 +PSMD6-AS2 100507062 +PSMD7 5713 +PSMD7-DT 101928035 +PSMD7P1 280637 +PSMD8 5714 +PSMD8P1 100422411 +PSMD9 5715 +PSMD10 5716 +PSMD10P1 170541 +PSMD10P2 280644 +PSMD10P3 338091 +PSMD11 5717 +PSMD12 5718 +PSMD12P1 317753 +PSMD13 5719 +PSMD14 10213 +PSMD14-DT 101929512 +PSMD14P1 100131284 +PSME1 5720 +PSME2 5721 +PSME2P1 257093 +PSME2P2 338099 +PSME2P3 338095 +PSME2P4 338096 +PSME2P5 338097 +PSME2P6 338098 +PSME3 10197 +PSME3IP1 80011 +PSME4 23198 +PSMF1 9491 +PSMG1 8624 +PSMG2 56984 +PSMG3 84262 +PSMG3-AS1 114796 +PSMG3P1 127482541 +PSMG3P2 127482543 +PSMG4 389362 +PSORS1C1 170679 +PSORS1C2 170680 +PSORS1C3 100130889 +PSPC1 55269 +PSPC1-AS2 109729130 +PSPC1P1 642395 +PSPC1P2 100873875 +PSPH 5723 +PSPHP1 8781 +PSPN 5623 +PSRC1 84722 +PSTK 118672 +PSTPIP1 9051 +PSTPIP2 9050 +PTAFR 5724 +PTAR1 375743 +PTBP1 5725 +PTBP1P 122888 +PTBP2 58155 +PTBP3 9991 +PTCD1 26024 +PTCD2 79810 +PTCD2P1 100131302 +PTCD2P2 100132487 +PTCD3 55037 +PTCH1 5727 +PTCH2 8643 +PTCHD1 139411 +PTCHD1-AS 100873065 +PTCHD3 374308 +PTCHD3P1 387647 +PTCHD3P2 100533664 +PTCHD3P3 100533665 +PTCHD4 442213 +PTCRA 171558 +PTCSC1 100302522 +PTCSC2 101928337 +PTCSC3 100886964 +PTDSS1 9791 +PTDSS2 81490 +PTEN 5728 +PTENP1 11191 +PTENP1-AS 101243555 +PTER 9317 +PTF1A 256297 +PTGDR 5729 +PTGDR2 11251 +PTGDS 5730 +PTGER1 5731 +PTGER2 5732 +PTGER3 5733 +PTGER4 5734 +PTGER4P1 5735 +PTGER4P2 5736 +PTGER4P2-CDK2AP2P2 442421 +PTGER4P3 100874378 +PTGES 9536 +PTGES2 80142 +PTGES2-AS1 389791 +PTGES3 10728 +PTGES3L 100885848 +PTGES3L-AARSD1 100885850 +PTGES3P1 284672 +PTGES3P2 101929293 +PTGES3P3 441050 +PTGES3P4 106480775 +PTGES3P5 106480359 +PTGFR 5737 +PTGFRN 5738 +PTGIR 5739 +PTGIS 5740 +PTGR1 22949 +PTGR2 145482 +PTGR3 284273 +PTGS1 5742 +PTGS2 5743 +PTH 5741 +PTH1R 5745 +PTH2 113091 +PTH2R 5746 +PTHLH 5744 +PTK2 5747 +PTK2B 2185 +PTK6 5753 +PTK7 5754 +PTMA 5757 +PTMAP1 5758 +PTMAP2 5759 +PTMAP3 5760 +PTMAP4 5761 +PTMAP5 150928 +PTMAP6 170542 +PTMAP7 326626 +PTMAP8 728873 +PTMAP9 100506248 +PTMAP10 442727 +PTMAP11 441454 +PTMAP12 728026 +PTMAP13 105371898 +PTMAP14 105373140 +PTMAP15 112935968 +PTMS 5763 +PTN 5764 +PTOV1 53635 +PTOV1-AS1 100506033 +PTOV1-AS2 101928378 +PTOV1P1 442087 +PTP4A1 7803 +PTP4A1P1 100421652 +PTP4A1P2 100499563 +PTP4A1P3 100861469 +PTP4A1P4 100129564 +PTP4A1P5 100289380 +PTP4A1P6 100129472 +PTP4A1P7 100421681 +PTP4A2 8073 +PTP4A2P1 5767 +PTP4A2P2 5769 +PTP4A3 11156 +PTPA 5524 +PTPDC1 138639 +PTPMT1 114971 +PTPN1 5770 +PTPN2 5771 +PTPN2P1 646981 +PTPN2P2 646758 +PTPN3 5774 +PTPN4 5775 +PTPN5 84867 +PTPN6 5777 +PTPN7 5778 +PTPN9 5780 +PTPN11 5781 +PTPN11P1 344593 +PTPN11P2 100421822 +PTPN11P3 442263 +PTPN11P4 391771 +PTPN11P5 442113 +PTPN12 5782 +PTPN13 5783 +PTPN14 5784 +PTPN18 26469 +PTPN20 26095 +PTPN20CP 653045 +PTPN21 11099 +PTPN22 26191 +PTPN23 25930 +PTPN23-DT 119863865 +PTPRA 5786 +PTPRB 5787 +PTPRC 5788 +PTPRCAP 5790 +PTPRD 5789 +PTPRD-AS1 101929407 +PTPRD-DT 101929428 +PTPRE 5791 +PTPRF 5792 +PTPRG 5793 +PTPRG-AS1 100506994 +PTPRH 5794 +PTPRJ 5795 +PTPRJ-AS1 104326192 +PTPRK 5796 +PTPRK-AS1 101928140 +PTPRM 5797 +PTPRN 5798 +PTPRN2 5799 +PTPRN2-AS1 100506585 +PTPRO 5800 +PTPRQ 374462 +PTPRR 5801 +PTPRS 5802 +PTPRS-AS1 125177377 +PTPRT 11122 +PTPRT-AS1 101927138 +PTPRT-DT 121853075 +PTPRU 10076 +PTPRVP 148713 +PTPRZ1 5803 +PTPRZ2 5804 +PTRH1 138428 +PTRH2 51651 +PTRHD1 391356 +PTS 5805 +PTTG1 9232 +PTTG1IP 754 +PTTG1IP2 102723899 +PTTG1P1 326315 +PTTG1P2 100127954 +PTTG2 10744 +PTTG3P 26255 +PTX3 5806 +PTX4 390667 +PUDP 8226 +PUDPP1 327658 +PUDPP2 327659 +PUDPP3 391242 +PUF60 22827 +PUM1 9698 +PUM2 23369 +PUM3 9933 +PURA 5813 +PURB 5814 +PURG 29942 +PURPL 643401 +PUS1 80324 +PUS1-AS1 107984455 +PUS3 83480 +PUS7 54517 +PUS7L 83448 +PUS7P1 100421790 +PUS10 150962 +PUSL1 126789 +PVALB 5816 +PVALEF 388428 +PVR 5817 +PVRIG 79037 +PVRIG2P 101752334 +PVT1 5820 +PWAR1 145624 +PWAR4 347745 +PWAR5 8123 +PWAR6 100506965 +PWARSN 347746 +PWP1 11137 +PWP2 5822 +PWRN1 791114 +PWRN2 791115 +PWRN3 101928840 +PWRN4 105370731 +PWWP2A 114825 +PWWP2AP1 100129459 +PWWP2B 170394 +PWWP3A 84939 +PWWP3B 139221 +PWWP4 728317 +PXDC1 221749 +PXDN 7837 +PXDNL 137902 +PXK 54899 +PXMP2 5827 +PXMP4 11264 +PXN 5829 +PXN-AS1 100506649 +PXT1 222659 +PXYLP1 92370 +PYCARD 29108 +PYCARD-AS1 100652740 +PYCR1 5831 +PYCR2 29920 +PYCR3 65263 +PYDC1 260434 +PYDC2 152138 +PYDC2-AS1 103344926 +PYDC5 107181291 +PYGB 5834 +PYGL 5836 +PYGM 5837 +PYGO1 26108 +PYGO2 90780 +PYHIN1 149628 +PYHIN5P 646377 +PYM1 84305 +PYROXD1 79912 +PYROXD2 84795 +PYURF 100996939 +PYY 5697 +PYY2 23615 +PYY3 644059 +PZP 5858 +QARS1 5859 +QDPR 5860 +QKI 9444 +QKILA 101927490 +QNG1 84267 +QPCT 25797 +QPCTL 54814 +QPRT 23475 +QRFP 347148 +QRFPR 84109 +QRICH1 54870 +QRICH2 84074 +QRSL1 55278 +QRSL1P1 730016 +QRSL1P2 100422330 +QRSL1P3 100422374 +QSER1 79832 +QSOX1 5768 +QSOX2 169714 +QTRT1 81890 +QTRT1P1 100420656 +QTRT2 79691 +R3HCC1 203069 +R3HCC1L 27291 +R3HDM1 23518 +R3HDM2 22864 +R3HDM2-DT 120766140 +R3HDM2P1 100419742 +R3HDM2P2 100129694 +R3HDM4 91300 +R3HDML 140902 +R3HDML-AS1 105372629 +RAB1A 5861 +RAB1AP1 100420571 +RAB1AP2 643916 +RAB1B 81876 +RAB1C 441400 +RAB2A 5862 +RAB2B 84932 +RAB3A 5864 +RAB3B 5865 +RAB3C 115827 +RAB3D 9545 +RAB3GAP1 22930 +RAB3GAP2 25782 +RAB3IL1 5866 +RAB3IP 117177 +RAB4A 5867 +RAB4A-AS1 105373159 +RAB4B 53916 +RAB4B-EGLN2 100529264 +RAB5A 5868 +RAB5B 5869 +RAB5C 5878 +RAB5C-AS1 105371781 +RAB5CP1 100420734 +RAB5CP2 133789 +RAB5IF 55969 +RAB6A 5870 +RAB6B 51560 +RAB6C 84084 +RAB6C-AS1 100131320 +RAB6D 150786 +RAB7A 7879 +RAB7B 338382 +RAB8A 4218 +RAB8B 51762 +RAB9A 9367 +RAB9AP1 100287200 +RAB9AP2 100287542 +RAB9AP3 100287577 +RAB9AP4 100288397 +RAB9AP5 100287234 +RAB9B 51209 +RAB9BP1 9366 +RAB10 10890 +RAB11A 8766 +RAB11AP1 100129731 +RAB11AP2 106480447 +RAB11B 9230 +RAB11B-AS1 100507567 +RAB11FIP1 80223 +RAB11FIP1P1 646080 +RAB11FIP2 22841 +RAB11FIP3 9727 +RAB11FIP4 84440 +RAB11FIP5 26056 +RAB12 201475 +RAB13 5872 +RAB14 51552 +RAB15 376267 +RAB17 64284 +RAB17-DT 105373958 +RAB18 22931 +RAB19 401409 +RAB20 55647 +RAB21 23011 +RAB22A 57403 +RAB23 51715 +RAB24 53917 +RAB25 57111 +RAB26 25837 +RAB27A 5873 +RAB27B 5874 +RAB28 9364 +RAB28P1 100133203 +RAB28P2 100129331 +RAB28P3 100132772 +RAB28P4 100132871 +RAB28P5 100128416 +RAB29 8934 +RAB30 27314 +RAB30-DT 100506233 +RAB31 11031 +RAB32 10981 +RAB33A 9363 +RAB33B 83452 +RAB33B-AS1 107984036 +RAB34 83871 +RAB35 11021 +RAB35-AS1 127138862 +RAB36 9609 +RAB37 326624 +RAB38 23682 +RAB39A 54734 +RAB39B 116442 +RAB40A 142684 +RAB40AL 282808 +RAB40B 10966 +RAB40C 57799 +RAB41 347517 +RAB42 115273 +RAB42P1 646996 +RAB43 339122 +RAB43P1 440375 +RAB44 401258 +RABAC1 10567 +RABEP1 9135 +RABEP2 79874 +RABEPK 10244 +RABEPKP1 100421226 +RABGAP1 23637 +RABGAP1L 9910 +RABGAP1L-AS1 101928696 +RABGAP1L-DT 102724601 +RABGAP1L-IT1 106480742 +RABGEF1 27342 +RABGEF1P1 493754 +RABGEF1P2 122149301 +RABGEF1P3 122149305 +RABGGTA 5875 +RABGGTB 5876 +RABGGTBP1 101180897 +RABIF 5877 +RABL2A 11159 +RABL2B 11158 +RABL3 285282 +RABL6 55684 +RAC1 5879 +RAC1P1 387612 +RAC1P2 442775 +RAC1P3 492295 +RAC1P4 286472 +RAC1P5 402183 +RAC1P6 100422657 +RAC1P7 100874390 +RAC1P8 100874398 +RAC1P9 100422658 +RAC2 5880 +RAC3 5881 +RACGAP1 29127 +RACGAP1P1 83956 +RACK1 10399 +RACK1P1 100422561 +RACK1P2 100422559 +RACK1P3 100422562 +RAD1 5810 +RAD1P1 100128880 +RAD1P2 100129690 +RAD9A 5883 +RAD9B 144715 +RAD17 5884 +RAD17P1 9207 +RAD17P2 9206 +RAD18 56852 +RAD21 5885 +RAD21-AS1 644660 +RAD21L1 642636 +RAD21P1 392508 +RAD23A 5886 +RAD23B 5887 +RAD23BP1 131185 +RAD23BP2 100130572 +RAD23BP3 54034 +RAD50 10111 +RAD51 5888 +RAD51-AS1 100505648 +RAD51AP1 10635 +RAD51AP1P1 100420047 +RAD51AP2 729475 +RAD51B 5890 +RAD51C 5889 +RAD51D 5892 +RAD52 5893 +RAD52P1 644776 +RAD54B 25788 +RAD54L 8438 +RAD54L2 23132 +RAD54L2P1 100420273 +RADIL 55698 +RADX 55086 +RAE1 8480 +RAET1E 135250 +RAET1E-AS1 100652739 +RAET1F 353089 +RAET1G 353091 +RAET1K 646024 +RAET1L 154064 +RAET1M 353094 +RAF1 5894 +RAF1P1 348910 +RAG1 5896 +RAG2 5897 +RAI1 10743 +RAI1-AS1 100861516 +RAI2 10742 +RAI14 26064 +RAI14-DT 105374723 +RALA 5898 +RALB 5899 +RALBP1 10928 +RALBP1P1 131054 +RALBP1P2 129522 +RALGAPA1 253959 +RALGAPA1P1 26134 +RALGAPA2 57186 +RALGAPB 57148 +RALGDS 5900 +RALGPS1 9649 +RALGPS2 55103 +RALGPS2-AS1 646976 +RALY 22913 +RALY-AS1 101926888 +RALYL 138046 +RAMAC 83640 +RAMACL 353267 +RAMP1 10267 +RAMP2 10266 +RAMP2-AS1 100190938 +RAMP3 10268 +RAN 5901 +RANBP1 5902 +RANBP1P1 389842 +RANBP2 5903 +RANBP3 8498 +RANBP3-DT 100128568 +RANBP3L 202151 +RANBP6 26953 +RANBP9 10048 +RANBP10 57610 +RANBP17 64901 +RANBP20P 326627 +RANGAP1 5905 +RANGRF 29098 +RANP1 221547 +RANP2 100874191 +RANP3 100874227 +RANP4 100130621 +RANP5 100129428 +RANP6 100128266 +RANP7 100874192 +RANP8 100420519 +RANP9 100874193 +RAP1A 5906 +RAP1AP 5907 +RAP1B 5908 +RAP1BL 643752 +RAP1BP1 100506390 +RAP1BP2 100128179 +RAP1BP3 100132917 +RAP1GAP 5909 +RAP1GAP2 23108 +RAP1GDS1 5910 +RAP2A 5911 +RAP2B 5912 +RAP2C 57826 +RAP2C-AS1 101928578 +RAP2CP1 106480249 +RAPGEF1 2889 +RAPGEF2 9693 +RAPGEF3 10411 +RAPGEF4 11069 +RAPGEF4-AS1 91149 +RAPGEF5 9771 +RAPGEF6 51735 +RAPGEFL1 51195 +RAPH1 65059 +RAPSN 5913 +RARA 5914 +RARA-AS1 101929693 +RARB 5915 +RARB-AS1 105376997 +RARG 5916 +RARRES1 5918 +RARRES2 5919 +RARRES2P1 643255 +RARRES2P2 644425 +RARRES2P3 106481659 +RARRES2P4 644881 +RARRES2P5 106480231 +RARRES2P6 105377820 +RARRES2P7 106481660 +RARRES2P8 642652 +RARRES2P9 106660620 +RARRES2P10 106481972 +RARRES2P11 107075248 +RARS1 5917 +RARS1P1 100419829 +RARS2 57038 +RASA1 5921 +RASA2 5922 +RASA2-IT1 100874298 +RASA3 22821 +RASA3-IT1 100874321 +RASA4 10156 +RASA4B 100271927 +RASA4CP 401331 +RASA4DP 100133005 +RASAL1 8437 +RASAL2 9462 +RASAL2-AS1 100302401 +RASAL3 64926 +RASD1 51655 +RASD2 23551 +RASEF 158158 +RASGEF1A 221002 +RASGEF1B 153020 +RASGEF1C 255426 +RASGRF1 5923 +RASGRF2 5924 +RASGRF2-AS1 102524628 +RASGRP1 10125 +RASGRP2 10235 +RASGRP3 25780 +RASGRP3-AS1 105374454 +RASGRP4 115727 +RASIP1 54922 +RASL10A 10633 +RASL10B 91608 +RASL11A 387496 +RASL11B 65997 +RASL12 51285 +RASSF1 11186 +RASSF1-AS1 102060282 +RASSF2 9770 +RASSF3 283349 +RASSF3-DT 105369804 +RASSF4 83937 +RASSF5 83593 +RASSF6 166824 +RASSF7 8045 +RASSF8 11228 +RASSF8-AS1 100506451 +RASSF9 9182 +RASSF10 644943 +RASSF10-DT 105376557 +RAVER1 125950 +RAVER2 55225 +RAX 30062 +RAX2 84839 +RB1 5925 +RB1-DT 100862704 +RB1CC1 9821 +RBAK 57786 +RBAK-RBAKDN 100533952 +RBAKDN 389458 +RBBP4 5928 +RBBP4P1 642954 +RBBP4P2 100420527 +RBBP4P3 730180 +RBBP4P4 727842 +RBBP4P5 100288451 +RBBP4P6 100820741 +RBBP4P7 391556 +RBBP5 5929 +RBBP6 5930 +RBBP6P1 100129156 +RBBP7 5931 +RBBP8 5932 +RBBP8NL 140893 +RBBP8P1 100420552 +RBBP8P2 100420607 +RBBP9 10741 +RBCK1 10616 +RBFA 79863 +RBFADN 100506070 +RBFOX1 54715 +RBFOX2 23543 +RBFOX3 146713 +RBIS 401466 +RBISP1 106481719 +RBISP2 106480687 +RBISP3 127379684 +RBISP4 127379685 +RBISP5 127379683 +RBISP6 127379686 +RBKS 64080 +RBL1 5933 +RBL2 5934 +RBM3 5935 +RBM4 5936 +RBM4B 83759 +RBM5 10181 +RBM5-AS1 100775107 +RBM6 10180 +RBM7 10179 +RBM7P1 100420108 +RBM8A 9939 +RBM8B 112846 +RBM10 8241 +RBM11 54033 +RBM11P1 100420213 +RBM12 10137 +RBM12B 389677 +RBM12B-AS1 55472 +RBM12B-DT 105375645 +RBM14 10432 +RBM14-RBM4 100526737 +RBM15 64783 +RBM15-AS1 440600 +RBM15B 29890 +RBM17 84991 +RBM17P1 100133330 +RBM17P2 642389 +RBM17P3 100132949 +RBM17P4 100128974 +RBM18 92400 +RBM19 9904 +RBM20 282996 +RBM22 55696 +RBM22P1 400645 +RBM22P2 100271871 +RBM22P3 100128867 +RBM22P4 100271870 +RBM22P5 100133206 +RBM22P6 644509 +RBM22P7 106478953 +RBM22P11 100132115 +RBM22P12 100131641 +RBM22P13 100130603 +RBM23 55147 +RBM24 221662 +RBM25 58517 +RBM25-AS1 105370560 +RBM26 64062 +RBM26-AS1 100505538 +RBM27 54439 +RBM28 55131 +RBM33 155435 +RBM33-DT 100506302 +RBM34 23029 +RBM38 55544 +RBM38-AS1 100291105 +RBM39 9584 +RBM39P1 643167 +RBM41 55285 +RBM42 79171 +RBM43 375287 +RBM43P1 100131568 +RBM44 375316 +RBM45 129831 +RBM46 166863 +RBM47 54502 +RBM48 84060 +RBM48P1 132817 +RBMS1 5937 +RBMS1P1 5938 +RBMS2 5939 +RBMS2P1 643427 +RBMS3 27303 +RBMS3-AS1 100873977 +RBMS3-AS2 100873978 +RBMS3-AS3 100873979 +RBMX 27316 +RBMX2 51634 +RBMX2P1 100128341 +RBMX2P2 100132808 +RBMX2P3 100421047 +RBMX2P4 100862677 +RBMX2P5 391804 +RBMXL1 494115 +RBMXL2 27288 +RBMXL3 139804 +RBMXP1 3186 +RBMXP2 441391 +RBMXP3 143543 +RBMXP4 100132580 +RBMXP5 100288788 +RBMY1A1 5940 +RBMY1A3P 286557 +RBMY1B 378948 +RBMY1C 5942 +RBMY1D 378949 +RBMY1E 378950 +RBMY1F 159163 +RBMY1GP 100287769 +RBMY1HP 5944 +RBMY1J 378951 +RBMY1KP 100874497 +RBMY2AP 5945 +RBMY2BP 375850 +RBMY2CP 140123 +RBMY2DP 347598 +RBMY2EP 159125 +RBMY2FP 159162 +RBMY2GP 378952 +RBMY2HP 378953 +RBMY2JP 378955 +RBMY2KP 140100 +RBMY2MP 140101 +RBMY2NP 378956 +RBMY2OP 379005 +RBMY2QP 379006 +RBMY2SP 379007 +RBMY2TP 379008 +RBMY2UP 379009 +RBMY2VP 379010 +RBMY2WP 379011 +RBMY2XP 379012 +RBMY2YP 379024 +RBMY3AP 64593 +RBP1 5947 +RBP2 5948 +RBP3 5949 +RBP4 5950 +RBP5 83758 +RBP7 116362 +RBPJ 3516 +RBPJL 11317 +RBPJP1 100310842 +RBPJP2 3517 +RBPJP3 58164 +RBPJP4 58163 +RBPJP5 100288841 +RBPJP6 643198 +RBPJP7 100133122 +RBPMS 11030 +RBPMS-AS1 100128750 +RBPMS2 348093 +RBPMS2P1 100421512 +RBPMSLP 54032 +RBSN 64145 +RBX1 9978 +RBX1P1 100287985 +RBX1P2 100500934 +RC3H1 149041 +RC3H1-DT 105371620 +RC3H1-IT1 106481790 +RC3H2 54542 +RCAN1 1827 +RCAN2 10231 +RCAN2-DT 101926898 +RCAN3 11123 +RCAN3AS 100750325 +RCBTB1 55213 +RCBTB2 1102 +RCBTB2P1 100130253 +RCC1 1104 +RCC1L 81554 +RCC2 55920 +RCC2-AS1 114515514 +RCC2P1 650983 +RCC2P2 100421075 +RCC2P3 100131932 +RCC2P4 100421090 +RCC2P5 100131442 +RCC2P6 100421131 +RCC2P7 442221 +RCC2P8 100129714 +RCCD1 91433 +RCCD1-AS1 116435297 +RCE1 9986 +RCHY1 25898 +RCL1 10171 +RCN1 5954 +RCN1P1 442234 +RCN1P2 728913 +RCN2 5955 +RCN3 57333 +RCOR1 23186 +RCOR2 283248 +RCOR3 55758 +RCSD1 92241 +RCVRN 5957 +RD3 343035 +RD3L 647286 +RDH5 5959 +RDH8 50700 +RDH10 157506 +RDH10-AS1 101926926 +RDH11 51109 +RDH12 145226 +RDH13 112724 +RDH14 57665 +RDH16 8608 +RDM1 201299 +RDM1P1 112577465 +RDM1P2 112577466 +RDM1P3 100418928 +RDM1P4 112577467 +RDM1P5 100131347 +RDUR 152225 +RDX 5962 +RDXP1 643244 +RDXP2 5964 +RDXP3 100132076 +REC8 9985 +REC114 283677 +RECK 8434 +RECQL 5965 +RECQL4 9401 +RECQL5 9400 +REELD1 345051 +REEP1 65055 +REEP2 51308 +REEP3 221035 +REEP4 80346 +REEP5 7905 +REEP6 92840 +REG1A 5967 +REG1B 5968 +REG1CP 5969 +REG3A 5068 +REG3G 130120 +REG4 83998 +REL 5966 +REL-DT 400957 +RELA 5970 +RELA-DT 105369347 +RELB 5971 +RELCH 57614 +RELL1 768211 +RELL2 285613 +RELN 5649 +RELT 84957 +REM1 28954 +REM2 161253 +REN 5972 +RENBP 5973 +RENO1 119545628 +REP15 387849 +REPIN1 29803 +REPIN1-AS1 105375563 +REPS1 85021 +REPS2 9185 +RER1 11079 +RERE 473 +RERE-AS1 102724552 +REREP1Y 105377240 +REREP2Y 105377243 +REREP3 646396 +RERG 85004 +RERG-AS1 100873980 +RERG-IT1 100874290 +RERGL 79785 +RESF1 55196 +RESP18 389075 +REST 5978 +RET 5979 +RETN 56729 +RETNLB 84666 +RETREG1 54463 +RETREG1-AS1 101929524 +RETREG2 79137 +RETREG3 162427 +RETSAT 54884 +REV1 51455 +REV3L 5980 +REV3L-IT1 106478974 +REX1BD 55049 +REXO1 57455 +REXO1L1P 254958 +REXO1L2P 100288527 +REXO1L3P 441359 +REXO1L4P 653042 +REXO1L5P 107986879 +REXO1L6P 441362 +REXO1L8P 392242 +REXO1L9P 100506246 +REXO1L10P 100288500 +REXO1L11P 100288470 +REXO1L12P 100289448 +REXO2 25996 +REXO4 57109 +REXO5 81691 +REXO6P 158035 +RFC1 5981 +RFC2 5982 +RFC3 5983 +RFC3P1 100131711 +RFC4 5984 +RFC5 5985 +RFC5P1 100421549 +RFESD 317671 +RFESDP1 100129167 +RFFL 117584 +RFK 55312 +RFKP1 100313962 +RFKP2 100132753 +RFKP3 127379691 +RFKP4 100313968 +RFKP5 100129948 +RFKP6 127482545 +RFLNA 144347 +RFLNB 359845 +RFNG 5986 +RFPL1 5988 +RFPL1S 10740 +RFPL2 10739 +RFPL3 10738 +RFPL3S 10737 +RFPL4A 342931 +RFPL4AL1 729974 +RFPL4AP1 646663 +RFPL4AP2 100420059 +RFPL4AP3 106480810 +RFPL4AP4 100420036 +RFPL4AP5 100420058 +RFPL4AP6 100130079 +RFPL4AP7 100420055 +RFPL4B 442247 +RFT1 91869 +RFTN1 23180 +RFTN1P1 360015 +RFTN2 130132 +RFWD3 55159 +RFX1 5989 +RFX2 5990 +RFX3 5991 +RFX3-DT 101929302 +RFX4 5992 +RFX5 5993 +RFX5-AS1 101927886 +RFX6 222546 +RFX7 64864 +RFX8 731220 +RFXANK 8625 +RFXAP 5994 +RGCC 28984 +RGL1 23179 +RGL2 5863 +RGL3 57139 +RGL4 266747 +RGL4P1 100422292 +RGMA 56963 +RGMB 285704 +RGMB-AS1 503569 +RGN 9104 +RGP1 9827 +RGPD1 400966 +RGPD2 729857 +RGPD3 653489 +RGPD4 285190 +RGPD4-AS1 729121 +RGPD5 84220 +RGPD6 729540 +RGPD8 727851 +RGR 5995 +RGS1 5996 +RGS2 5997 +RGS2-AS1 102724954 +RGS3 5998 +RGS4 5999 +RGS5 8490 +RGS5-AS1 101928404 +RGS6 9628 +RGS7 6000 +RGS7BP 401190 +RGS8 85397 +RGS9 8787 +RGS9BP 388531 +RGS10 6001 +RGS11 8786 +RGS12 6002 +RGS13 6003 +RGS14 10636 +RGS16 6004 +RGS17 26575 +RGS17P1 100128628 +RGS18 64407 +RGS19 10287 +RGS20 8601 +RGS21 431704 +RGS22 26166 +RGSL1 353299 +RHAG 6005 +RHBDD1 84236 +RHBDD2 57414 +RHBDD3 25807 +RHBDF1 64285 +RHBDF1P1 131973 +RHBDF2 79651 +RHBDL1 9028 +RHBDL2 54933 +RHBDL3 162494 +RHBG 57127 +RHCE 6006 +RHCG 51458 +RHD 6007 +RHEB 6009 +RHEBL1 121268 +RHEBP1 6008 +RHEBP2 101060032 +RHEBP3 692231 +RHEX 440712 +RHNO1 83695 +RHO 6010 +RHOA 387 +RHOA-IT1 106480739 +RHOB 388 +RHOBTB1 9886 +RHOBTB2 23221 +RHOBTB3 22836 +RHOC 389 +RHOD 29984 +RHOF 54509 +RHOG 391 +RHOG2P 392489 +RHOH 399 +RHOJ 57381 +RHOQ 23433 +RHOQ-AS1 100506142 +RHOQP1 319093 +RHOQP2 730041 +RHOQP3 284988 +RHOT1 55288 +RHOT1P1 100462813 +RHOT1P2 100462811 +RHOT1P3 100462810 +RHOT2 89941 +RHOU 58480 +RHOV 171177 +RHOXF1 158800 +RHOXF1-AS1 101928969 +RHOXF1P1 101928941 +RHOXF1P2 107075106 +RHOXF1P3 107075307 +RHOXF2 84528 +RHOXF2B 727940 +RHPN1 114822 +RHPN1-AS1 78998 +RHPN2 85415 +RHPN2P1 646090 +RIBC1 158787 +RIBC2 26150 +RIC1 57589 +RIC3 79608 +RIC3-DT 101927936 +RIC8A 60626 +RIC8B 55188 +RICTOR 253260 +RIDA 10247 +RIF1 55183 +RIGI 23586 +RIIAD1 284485 +RILP 83547 +RILPL1 353116 +RILPL2 196383 +RIMBP2 23504 +RIMBP3 85376 +RIMBP3B 440804 +RIMBP3C 150221 +RIMKLA 284716 +RIMKLB 57494 +RIMKLBP1 54031 +RIMKLBP2 100422371 +RIMOC1 285636 +RIMS1 22999 +RIMS2 9699 +RIMS3 9783 +RIMS4 140730 +RIN1 9610 +RIN2 54453 +RIN3 79890 +RING1 6015 +RINL 126432 +RINT1 60561 +RIOK1 83732 +RIOK2 55781 +RIOK3 8780 +RIOK3P1 122145 +RIOX1 79697 +RIOX2 84864 +RIPK1 8737 +RIPK2 8767 +RIPK2-DT 101929709 +RIPK3 11035 +RIPK4 54101 +RIPOR1 79567 +RIPOR2 9750 +RIPOR3 140876 +RIPOR3-AS1 100506175 +RIPPLY1 92129 +RIPPLY2 134701 +RIPPLY3 53820 +RIPPLY3P1 100421053 +RIT1 6016 +RIT2 6014 +RITA1 84934 +RLBP1 6017 +RLF 6018 +RLFP1 57008 +RLIG1 91298 +RLIG1P1 100129574 +RLIG1P2 100129989 +RLIG1P3 100129100 +RLIM 51132 +RLIMP1 100533695 +RLIMP2 100533731 +RLIMP3 645453 +RLN1 6013 +RLN2 6019 +RLN3 117579 +RMC1 29919 +RMDN1 51115 +RMDN2 151393 +RMDN2-AS1 101410544 +RMDN3 55177 +RMEL3 102724122 +RMI1 80010 +RMI2 116028 +RMND1 55005 +RMND5A 64795 +RMND5B 64777 +RMRP 6023 +RMRPP5 106481874 +RMST 196475 +RN7SK 125050 +RN7SKP1 100873845 +RN7SKP2 100873846 +RN7SKP3 100873847 +RN7SKP4 100873848 +RN7SKP5 100873849 +RN7SKP6 100873850 +RN7SKP7 100873851 +RN7SKP8 100873852 +RN7SKP9 100873853 +RN7SKP10 100873873 +RN7SKP11 106479099 +RN7SKP12 106480836 +RN7SKP13 106479100 +RN7SKP14 106479101 +RN7SKP15 106480456 +RN7SKP16 106480837 +RN7SKP17 106479102 +RN7SKP18 106480838 +RN7SKP19 106479103 +RN7SKP20 106479104 +RN7SKP21 106480839 +RN7SKP22 106481805 +RN7SKP23 106479105 +RN7SKP24 106480840 +RN7SKP25 106480364 +RN7SKP26 106479106 +RN7SKP27 106480841 +RN7SKP28 106479107 +RN7SKP29 106480457 +RN7SKP30 106479108 +RN7SKP31 106480842 +RN7SKP32 106479109 +RN7SKP33 106480843 +RN7SKP34 106479110 +RN7SKP35 106479111 +RN7SKP36 106480458 +RN7SKP37 106480844 +RN7SKP38 106479112 +RN7SKP39 106480845 +RN7SKP40 106479113 +RN7SKP42 106480846 +RN7SKP43 106481806 +RN7SKP44 106479114 +RN7SKP45 106479115 +RN7SKP46 106480847 +RN7SKP47 106481974 +RN7SKP48 106479116 +RN7SKP49 106480848 +RN7SKP50 106480459 +RN7SKP51 106479117 +RN7SKP52 106479118 +RN7SKP53 106480849 +RN7SKP54 107080626 +RN7SKP55 106479119 +RN7SKP56 106481807 +RN7SKP57 106479120 +RN7SKP58 106480850 +RN7SKP59 106479121 +RN7SKP60 106480851 +RN7SKP61 106479122 +RN7SKP62 106480460 +RN7SKP63 106479123 +RN7SKP64 106480852 +RN7SKP65 106479124 +RN7SKP66 106480853 +RN7SKP67 106479125 +RN7SKP68 106480854 +RN7SKP69 106480461 +RN7SKP70 107057644 +RN7SKP71 106479126 +RN7SKP72 106481748 +RN7SKP73 106480855 +RN7SKP74 106479127 +RN7SKP75 106480856 +RN7SKP76 106481808 +RN7SKP77 106479128 +RN7SKP78 106479129 +RN7SKP79 106480857 +RN7SKP80 106479130 +RN7SKP81 106480858 +RN7SKP82 106480462 +RN7SKP83 106479131 +RN7SKP85 106479132 +RN7SKP86 106480859 +RN7SKP87 106479133 +RN7SKP88 106480860 +RN7SKP89 106479134 +RN7SKP90 106481809 +RN7SKP91 106480861 +RN7SKP92 106479135 +RN7SKP93 106479136 +RN7SKP94 106480365 +RN7SKP95 106480862 +RN7SKP96 106479137 +RN7SKP97 106480463 +RN7SKP98 106480863 +RN7SKP99 106479138 +RN7SKP100 106479139 +RN7SKP101 106480864 +RN7SKP102 106481810 +RN7SKP103 106479140 +RN7SKP104 106480865 +RN7SKP105 106479141 +RN7SKP106 106479142 +RN7SKP107 106480464 +RN7SKP108 106480866 +RN7SKP109 106479143 +RN7SKP110 106480867 +RN7SKP111 106479144 +RN7SKP112 106479145 +RN7SKP113 106480465 +RN7SKP114 106480868 +RN7SKP115 106479146 +RN7SKP116 106480869 +RN7SKP117 106479147 +RN7SKP118 106633802 +RN7SKP119 106481749 +RN7SKP120 106480870 +RN7SKP121 106481811 +RN7SKP122 106479148 +RN7SKP123 106479149 +RN7SKP124 106480871 +RN7SKP125 106479150 +RN7SKP126 106480872 +RN7SKP127 106480466 +RN7SKP128 106479151 +RN7SKP129 106479152 +RN7SKP130 106480873 +RN7SKP131 106479153 +RN7SKP132 106480874 +RN7SKP133 106481812 +RN7SKP134 106479154 +RN7SKP135 106480875 +RN7SKP136 106479155 +RN7SKP137 106479156 +RN7SKP139 106480876 +RN7SKP140 106480366 +RN7SKP141 106479157 +RN7SKP142 106480877 +RN7SKP143 106479158 +RN7SKP144 106479159 +RN7SKP145 106480878 +RN7SKP146 106479160 +RN7SKP147 106480879 +RN7SKP148 106480467 +RN7SKP149 106479161 +RN7SKP150 106480880 +RN7SKP151 106479162 +RN7SKP152 106479163 +RN7SKP153 106481813 +RN7SKP154 106480881 +RN7SKP155 106479164 +RN7SKP156 106480882 +RN7SKP157 106479165 +RN7SKP158 106480883 +RN7SKP159 106480468 +RN7SKP160 106479166 +RN7SKP161 106479167 +RN7SKP162 106480884 +RN7SKP163 106479168 +RN7SKP164 106480885 +RN7SKP165 106480367 +RN7SKP166 106481814 +RN7SKP167 106479169 +RN7SKP168 106479170 +RN7SKP169 106480886 +RN7SKP170 106479171 +RN7SKP171 106480887 +RN7SKP172 106480469 +RN7SKP173 106635535 +RN7SKP174 106479172 +RN7SKP175 106479173 +RN7SKP176 106635536 +RN7SKP177 106479174 +RN7SKP178 106479175 +RN7SKP179 106481815 +RN7SKP180 106480888 +RN7SKP181 106479176 +RN7SKP182 106479177 +RN7SKP183 106480889 +RN7SKP184 106480470 +RN7SKP185 106479178 +RN7SKP186 106480692 +RN7SKP187 106480890 +RN7SKP188 106479179 +RN7SKP189 106479180 +RN7SKP190 106480891 +RN7SKP191 106480471 +RN7SKP192 106480892 +RN7SKP193 106479181 +RN7SKP194 106480893 +RN7SKP195 106481816 +RN7SKP196 106479182 +RN7SKP197 106480894 +RN7SKP198 106479183 +RN7SKP199 106479184 +RN7SKP200 106480895 +RN7SKP202 106480472 +RN7SKP203 106479185 +RN7SKP204 106480896 +RN7SKP205 106479186 +RN7SKP206 106479187 +RN7SKP207 106480897 +RN7SKP208 106481817 +RN7SKP209 106479188 +RN7SKP210 106480898 +RN7SKP211 106479189 +RN7SKP212 106481750 +RN7SKP213 106480899 +RN7SKP214 106480473 +RN7SKP216 106479190 +RN7SKP217 106479191 +RN7SKP218 106480900 +RN7SKP219 106479192 +RN7SKP220 106480901 +RN7SKP221 106480474 +RN7SKP222 106479193 +RN7SKP223 106479194 +RN7SKP224 106480902 +RN7SKP225 106479195 +RN7SKP226 106480903 +RN7SKP227 106481818 +RN7SKP228 106479196 +RN7SKP229 106480904 +RN7SKP230 106479197 +RN7SKP231 106479198 +RN7SKP232 106480905 +RN7SKP233 106480475 +RN7SKP234 106480368 +RN7SKP235 106479199 +RN7SKP236 106480906 +RN7SKP237 106479200 +RN7SKP238 106479201 +RN7SKP239 106480907 +RN7SKP240 106479202 +RN7SKP241 107063536 +RN7SKP242 106480908 +RN7SKP243 106481819 +RN7SKP244 106479203 +RN7SKP245 106480909 +RN7SKP246 106479204 +RN7SKP247 106479205 +RN7SKP248 106480476 +RN7SKP249 106480910 +RN7SKP250 106479206 +RN7SKP251 106633807 +RN7SKP252 106479207 +RN7SKP253 106479208 +RN7SKP254 106481820 +RN7SKP255 106479209 +RN7SKP256 106480911 +RN7SKP257 106479210 +RN7SKP258 106480912 +RN7SKP259 106481751 +RN7SKP260 106479211 +RN7SKP261 106480477 +RN7SKP262 106479212 +RN7SKP263 106480913 +RN7SKP264 106479213 +RN7SKP265 106480914 +RN7SKP266 106479214 +RN7SKP267 106480478 +RN7SKP268 106479215 +RN7SKP269 106480915 +RN7SKP270 106479216 +RN7SKP271 106480916 +RN7SKP272 106479217 +RN7SKP273 106481821 +RN7SKP275 106480917 +RN7SKP276 106479218 +RN7SKP277 106479219 +RN7SKP278 106480918 +RN7SKP279 106480479 +RN7SKP280 106479220 +RN7SKP281 106480369 +RN7SKP282 106480919 +RN7SKP283 106479221 +RN7SKP284 106479222 +RN7SKP285 106480920 +RN7SKP286 106481822 +RN7SKP287 106480921 +RN7SKP288 106479223 +RN7SKP289 106479224 +RN7SKP290 106480480 +RN7SKP291 106480922 +RN7SKP292 106479225 +RN7SKP293 106480923 +RN7SKP294 106479226 +RN7SKP295 106480924 +RN7SKP296 106481823 +RN7SKP297 106479227 +RN7SKP298 106479228 +RN7SKP299 106480925 +RN7SL1 6029 +RN7SL2 378706 +RN7SL3 378707 +RN7SL4P 6030 +RN7SL5P 6031 +RN7SL6P 6032 +RN7SL7P 6033 +RN7SL8P 6034 +RN7SL11P 106479229 +RN7SL12P 106480926 +RN7SL14P 106480481 +RN7SL15P 106479230 +RN7SL16P 106479231 +RN7SL18P 106480927 +RN7SL19P 106480370 +RN7SL20P 106479232 +RN7SL22P 106480928 +RN7SL23P 106480482 +RN7SL25P 106479233 +RN7SL26P 106479234 +RN7SL28P 106480929 +RN7SL30P 106479235 +RN7SL32P 106480930 +RN7SL33P 106479236 +RN7SL34P 106481824 +RN7SL35P 106480931 +RN7SL36P 106479237 +RN7SL37P 106479238 +RN7SL38P 106480932 +RN7SL39P 106479239 +RN7SL40P 106480483 +RN7SL41P 106480933 +RN7SL42P 106479240 +RN7SL43P 106479241 +RN7SL44P 106480934 +RN7SL45P 106481975 +RN7SL47P 106479242 +RN7SL48P 106481825 +RN7SL49P 106480935 +RN7SL50P 106479243 +RN7SL51P 106480936 +RN7SL52P 106480937 +RN7SL55P 106479244 +RN7SL57P 106480484 +RN7SL58P 106479245 +RN7SL60P 106480938 +RN7SL62P 106479246 +RN7SL63P 106480939 +RN7SL65P 106479247 +RN7SL66P 106480485 +RN7SL67P 106479248 +RN7SL68P 107080632 +RN7SL69P 106480940 +RN7SL70P 106479249 +RN7SL72P 106480941 +RN7SL73P 106479250 +RN7SL74P 106480942 +RN7SL75P 107063539 +RN7SL76P 106479251 +RN7SL77P 106479252 +RN7SL78P 106481752 +RN7SL79P 106480943 +RN7SL81P 106479253 +RN7SL82P 106480944 +RN7SL83P 106479254 +RN7SL87P 106479255 +RN7SL88P 106480945 +RN7SL89P 106479256 +RN7SL91P 106480946 +RN7SL92P 106479257 +RN7SL93P 106480947 +RN7SL96P 106480486 +RN7SL97P 106479258 +RN7SL98P 106479259 +RN7SL100P 106480948 +RN7SL101P 106479260 +RN7SL104P 106480949 +RN7SL105P 106480487 +RN7SL106P 106479261 +RN7SL107P 106479262 +RN7SL108P 106480950 +RN7SL110P 106480371 +RN7SL111P 106479263 +RN7SL113P 106480951 +RN7SL116P 106480488 +RN7SL117P 106479264 +RN7SL118P 106480952 +RN7SL120P 106480953 +RN7SL121P 106479265 +RN7SL122P 106480954 +RN7SL123P 106479266 +RN7SL124P 106480955 +RN7SL125P 106479267 +RN7SL126P 106479268 +RN7SL127P 106480956 +RN7SL128P 106481826 +RN7SL130P 106479269 +RN7SL131P 106480957 +RN7SL132P 106479270 +RN7SL134P 106479271 +RN7SL135P 106480958 +RN7SL138P 106480489 +RN7SL140P 106479272 +RN7SL141P 106480959 +RN7SL143P 106479273 +RN7SL144P 106480960 +RN7SL145P 106481753 +RN7SL146P 106481827 +RN7SL147P 106479274 +RN7SL148P 106479275 +RN7SL149P 106480961 +RN7SL150P 106479276 +RN7SL151P 107075319 +RN7SL152P 106480962 +RN7SL153P 106480490 +RN7SL154P 106479277 +RN7SL155P 106479278 +RN7SL156P 106480963 +RN7SL159P 106479279 +RN7SL160P 106480964 +RN7SL162P 106481828 +RN7SL163P 106479280 +RN7SL164P 106480965 +RN7SL165P 106479281 +RN7SL166P 106479282 +RN7SL167P 106480966 +RN7SL168P 106480491 +RN7SL169P 106480372 +RN7SL170P 106479283 +RN7SL172P 106480967 +RN7SL173P 106479284 +RN7SL174P 106479285 +RN7SL176P 106480968 +RN7SL177P 106480969 +RN7SL178P 106479286 +RN7SL180P 106480970 +RN7SL181P 106480492 +RN7SL182P 106479287 +RN7SL183P 106480971 +RN7SL184P 106479288 +RN7SL185P 106479289 +RN7SL186P 106480972 +RN7SL187P 106481829 +RN7SL188P 106479290 +RN7SL189P 106480973 +RN7SL190P 106479291 +RN7SL191P 106479292 +RN7SL192P 106480974 +RN7SL193P 106480493 +RN7SL196P 106479293 +RN7SL197P 106480975 +RN7SL198P 106479294 +RN7SL199P 106480693 +RN7SL200P 106480976 +RN7SL201P 106481830 +RN7SL202P 106479295 +RN7SL203P 106479296 +RN7SL204P 106480977 +RN7SL205P 106479297 +RN7SL208P 106480978 +RN7SL209P 106480494 +RN7SL210P 106479298 +RN7SL211P 106479299 +RN7SL213P 106480979 +RN7SL214P 106479300 +RN7SL215P 106480980 +RN7SL216P 106480495 +RN7SL217P 106479301 +RN7SL218P 106480981 +RN7SL219P 106479302 +RN7SL220P 106479303 +RN7SL221P 106480982 +RN7SL222P 106481831 +RN7SL223P 106481754 +RN7SL225P 106479304 +RN7SL228P 106480983 +RN7SL229P 106479305 +RN7SL230P 106479306 +RN7SL231P 106480984 +RN7SL233P 106480985 +RN7SL234P 106479307 +RN7SL236P 106480986 +RN7SL237P 106479308 +RN7SL238P 106480987 +RN7SL239P 106479309 +RN7SL240P 106479310 +RN7SL241P 106480988 +RN7SL242P 106480496 +RN7SL244P 106479311 +RN7SL246P 106480989 +RN7SL248P 106479312 +RN7SL250P 106479313 +RN7SL251P 106480990 +RN7SL252P 106481832 +RN7SL253P 106479314 +RN7SL254P 106480991 +RN7SL255P 106479315 +RN7SL258P 106480373 +RN7SL259P 106480992 +RN7SL260P 106480497 +RN7SL261P 106479316 +RN7SL262P 106479317 +RN7SL263P 106480993 +RN7SL265P 106479318 +RN7SL266P 106480994 +RN7SL267P 106481833 +RN7SL268P 106479319 +RN7SL269P 106479320 +RN7SL270P 106480995 +RN7SL271P 106479321 +RN7SL272P 106480996 +RN7SL273P 106481834 +RN7SL274P 106479322 +RN7SL275P 106480997 +RN7SL277P 106479323 +RN7SL278P 106479324 +RN7SL279P 106480998 +RN7SL280P 106480498 +RN7SL282P 106480374 +RN7SL283P 106479325 +RN7SL284P 106480999 +RN7SL285P 106479326 +RN7SL286P 106479327 +RN7SL288P 106481000 +RN7SL290P 106481001 +RN7SL291P 106479328 +RN7SL292P 106481002 +RN7SL293P 106481835 +RN7SL294P 106479329 +RN7SL296P 106481003 +RN7SL297P 106479330 +RN7SL299P 106479331 +RN7SL300P 106481004 +RN7SL301P 106480499 +RN7SL302P 106479332 +RN7SL303P 106481005 +RN7SL304P 106479333 +RN7SL305P 106479334 +RN7SL306P 106481006 +RN7SL307P 106480500 +RN7SL308P 106479335 +RN7SL309P 106481007 +RN7SL310P 106479336 +RN7SL311P 106481755 +RN7SL313P 106481008 +RN7SL314P 106481836 +RN7SL316P 106479337 +RN7SL317P 106479338 +RN7SL318P 106481009 +RN7SL319P 106479339 +RN7SL320P 106481010 +RN7SL321P 106480501 +RN7SL322P 106479340 +RN7SL323P 106479341 +RN7SL325P 106481011 +RN7SL326P 106479342 +RN7SL327P 106481012 +RN7SL328P 106481837 +RN7SL329P 106479343 +RN7SL330P 106481013 +RN7SL331P 106479344 +RN7SL332P 106479345 +RN7SL333P 106481014 +RN7SL334P 106480502 +RN7SL335P 106480375 +RN7SL336P 106479346 +RN7SL337P 106481015 +RN7SL338P 106479347 +RN7SL339P 106479348 +RN7SL340P 106481016 +RN7SL341P 106481017 +RN7SL342P 106479349 +RN7SL343P 106481018 +RN7SL344P 106480503 +RN7SL346P 106479350 +RN7SL350P 106481019 +RN7SL351P 106479351 +RN7SL352P 106479352 +RN7SL353P 106481020 +RN7SL354P 106481838 +RN7SL356P 106479353 +RN7SL357P 106481021 +RN7SL359P 106479354 +RN7SL361P 106479355 +RN7SL362P 106481022 +RN7SL363P 106480504 +RN7SL364P 106479356 +RN7SL366P 106481023 +RN7SL368P 106479357 +RN7SL369P 106480694 +RN7SL370P 106481024 +RN7SL371P 106481839 +RN7SL372P 106479358 +RN7SL375P 106479359 +RN7SL376P 106481025 +RN7SL377P 106479360 +RN7SL378P 106481026 +RN7SL379P 106480505 +RN7SL380P 106479361 +RN7SL381P 106479362 +RN7SL382P 106481027 +RN7SL383P 106479363 +RN7SL384P 106481028 +RN7SL385P 106481840 +RN7SL386P 106479364 +RN7SL387P 106481029 +RN7SL388P 106479365 +RN7SL390P 106479366 +RN7SL391P 106481030 +RN7SL392P 106480506 +RN7SL393P 106481756 +RN7SL394P 106479367 +RN7SL395P 106481031 +RN7SL396P 106479368 +RN7SL397P 106479369 +RN7SL398P 106481032 +RN7SL399P 106479370 +RN7SL400P 106481033 +RN7SL401P 106480507 +RN7SL402P 106479371 +RN7SL403P 106481034 +RN7SL404P 106479372 +RN7SL405P 106479373 +RN7SL408P 106481841 +RN7SL411P 106481035 +RN7SL413P 106479374 +RN7SL414P 106481036 +RN7SL415P 106479375 +RN7SL416P 106481037 +RN7SL417P 107080636 +RN7SL418P 106480508 +RN7SL419P 106479376 +RN7SL420P 106479377 +RN7SL422P 106481038 +RN7SL423P 106479378 +RN7SL424P 106480376 +RN7SL425P 106481039 +RN7SL426P 106481842 +RN7SL428P 106479379 +RN7SL429P 106479380 +RN7SL430P 106481040 +RN7SL431P 106866913 +RN7SL432P 106481041 +RN7SL434P 106480509 +RN7SL435P 106479381 +RN7SL438P 106479382 +RN7SL440P 106481042 +RN7SL441P 106479383 +RN7SL442P 106481043 +RN7SL443P 106480510 +RN7SL444P 106479384 +RN7SL445P 106481044 +RN7SL446P 106479385 +RN7SL447P 106479386 +RN7SL448P 106481843 +RN7SL449P 106481045 +RN7SL451P 106480377 +RN7SL452P 106479387 +RN7SL453P 106481046 +RN7SL454P 106479388 +RN7SL455P 106479389 +RN7SL456P 106480511 +RN7SL457P 106481047 +RN7SL459P 106479390 +RN7SL460P 106481048 +RN7SL461P 106481844 +RN7SL462P 106479391 +RN7SL464P 106481049 +RN7SL465P 106479392 +RN7SL466P 106479393 +RN7SL468P 106481050 +RN7SL469P 106480512 +RN7SL470P 106479394 +RN7SL471P 106481051 +RN7SL472P 106479395 +RN7SL473P 106479396 +RN7SL474P 106481052 +RN7SL475P 106481845 +RN7SL477P 106479397 +RN7SL478P 106481053 +RN7SL479P 106479398 +RN7SL480P 106481757 +RN7SL481P 106481054 +RN7SL482P 106480513 +RN7SL483P 106479399 +RN7SL484P 106479400 +RN7SL487P 106481055 +RN7SL488P 106479401 +RN7SL489P 106481056 +RN7SL491P 106480514 +RN7SL492P 106479402 +RN7SL493P 106479403 +RN7SL494P 106481057 +RN7SL495P 106479404 +RN7SL496P 106481058 +RN7SL497P 106481846 +RN7SL498P 106479405 +RN7SL499P 106481059 +RN7SL500P 106479406 +RN7SL502P 106479407 +RN7SL503P 106481060 +RN7SL504P 106480515 +RN7SL505P 106481758 +RN7SL507P 106479408 +RN7SL508P 106481061 +RN7SL509P 106479409 +RN7SL510P 106479410 +RN7SL513P 106481062 +RN7SL515P 106481063 +RN7SL516P 106479411 +RN7SL517P 106481064 +RN7SL518P 106481847 +RN7SL519P 106479412 +RN7SL520P 106481065 +RN7SL521P 106479413 +RN7SL523P 106479414 +RN7SL524P 106481066 +RN7SL525P 106480516 +RN7SL526P 106479415 +RN7SL530P 106481067 +RN7SL531P 106479416 +RN7SL535P 106479417 +RN7SL536P 106481068 +RN7SL538P 106480517 +RN7SL539P 106479418 +RN7SL541P 106481069 +RN7SL542P 106479419 +RN7SL543P 106480378 +RN7SL544P 106481070 +RN7SL545P 106481848 +RN7SL546P 106479420 +RN7SL547P 106479421 +RN7SL549P 106481071 +RN7SL551P 106479422 +RN7SL552P 106481072 +RN7SL553P 106480518 +RN7SL554P 106479423 +RN7SL555P 106479424 +RN7SL556P 106481073 +RN7SL557P 106479425 +RN7SL558P 106481074 +RN7SL559P 106481849 +RN7SL560P 106479426 +RN7SL561P 106481075 +RN7SL563P 106479427 +RN7SL564P 106479428 +RN7SL565P 106481076 +RN7SL566P 106481850 +RN7SL567P 106481976 +RN7SL568P 106479429 +RN7SL569P 106481077 +RN7SL570P 106479430 +RN7SL571P 106479431 +RN7SL573P 106481078 +RN7SL574P 106481079 +RN7SL575P 106479432 +RN7SL577P 106481080 +RN7SL578P 106479433 +RN7SL580P 106481081 +RN7SL581P 106479434 +RN7SL582P 106479435 +RN7SL583P 106481082 +RN7SL584P 106480519 +RN7SL585P 106479436 +RN7SL586P 106481083 +RN7SL587P 106479437 +RN7SL589P 106479438 +RN7SL591P 106481084 +RN7SL592P 106481851 +RN7SL594P 106479439 +RN7SL596P 106481085 +RN7SL597P 106479440 +RN7SL598P 106481759 +RN7SL600P 106481086 +RN7SL601P 106480520 +RN7SL602P 106479441 +RN7SL604P 106479442 +RN7SL605P 106481087 +RN7SL606P 106479443 +RN7SL607P 106481088 +RN7SL608P 106480521 +RN7SL610P 106479444 +RN7SL612P 106479445 +RN7SL614P 106481089 +RN7SL615P 106479446 +RN7SL616P 106481090 +RN7SL617P 106481852 +RN7SL618P 106479447 +RN7SL619P 106481091 +RN7SL620P 106479448 +RN7SL621P 106479449 +RN7SL622P 106481092 +RN7SL623P 106480522 +RN7SL624P 106480379 +RN7SL625P 106479450 +RN7SL627P 106481093 +RN7SL628P 106479451 +RN7SL629P 106479452 +RN7SL630P 106481094 +RN7SL632P 106481095 +RN7SL633P 106479453 +RN7SL634P 106481096 +RN7SL635P 106479454 +RN7SL636P 106481097 +RN7SL638P 106479455 +RN7SL640P 106479456 +RN7SL643P 106481098 +RN7SL644P 106481853 +RN7SL645P 106479457 +RN7SL646P 106481099 +RN7SL647P 106479458 +RN7SL648P 106479459 +RN7SL649P 106481100 +RN7SL650P 106480523 +RN7SL652P 106479460 +RN7SL653P 106481101 +RN7SL654P 106479461 +RN7SL655P 106481102 +RN7SL656P 106481760 +RN7SL657P 107074708 +RN7SL658P 106480524 +RN7SL659P 106479462 +RN7SL660P 106479463 +RN7SL663P 106481103 +RN7SL664P 106479464 +RN7SL665P 106481104 +RN7SL666P 106481854 +RN7SL667P 106479465 +RN7SL668P 106479466 +RN7SL670P 106481105 +RN7SL671P 106479467 +RN7SL672P 106481106 +RN7SL673P 106480525 +RN7SL674P 106479468 +RN7SL675P 106481107 +RN7SL676P 106479469 +RN7SL677P 106479470 +RN7SL678P 106481108 +RN7SL679P 106481855 +RN7SL680P 106480380 +RN7SL681P 106479471 +RN7SL683P 106481109 +RN7SL684P 106479472 +RN7SL685P 106479473 +RN7SL687P 106481110 +RN7SL688P 106479474 +RN7SL689P 106481111 +RN7SL690P 106479475 +RN7SL691P 106481112 +RN7SL692P 106479476 +RN7SL693P 106479477 +RN7SL697P 106480526 +RN7SL698P 106481113 +RN7SL700P 106479478 +RN7SL702P 106481114 +RN7SL703P 106479479 +RN7SL704P 106481115 +RN7SL705P 106481856 +RN7SL706P 106479480 +RN7SL708P 106479481 +RN7SL709P 106481116 +RN7SL711P 106479482 +RN7SL712P 106481117 +RN7SL713P 106480381 +RN7SL714P 106480527 +RN7SL715P 106479483 +RN7SL716P 106479484 +RN7SL717P 106481118 +RN7SL718P 106479485 +RN7SL719P 106481119 +RN7SL720P 106480528 +RN7SL722P 106479486 +RN7SL724P 106479487 +RN7SL725P 106481120 +RN7SL726P 106479488 +RN7SL727P 106481121 +RN7SL728P 106481857 +RN7SL731P 107048981 +RN7SL732P 106481122 +RN7SL733P 106479489 +RN7SL734P 106479490 +RN7SL735P 106480529 +RN7SL736P 107080652 +RN7SL737P 106481123 +RN7SL738P 106480695 +RN7SL740P 106479491 +RN7SL741P 106481124 +RN7SL743P 106479492 +RN7SL744P 106479493 +RN7SL745P 106481858 +RN7SL748P 106481125 +RN7SL749P 106479494 +RN7SL750P 106481126 +RN7SL751P 106479495 +RN7SL752P 106481127 +RN7SL753P 106479496 +RN7SL754P 106479497 +RN7SL756P 106481128 +RN7SL757P 106480530 +RN7SL759P 106479498 +RN7SL760P 106481129 +RN7SL761P 106479499 +RN7SL762P 106479500 +RN7SL763P 106481130 +RN7SL764P 106480531 +RN7SL766P 106479501 +RN7SL767P 106481131 +RN7SL769P 106479502 +RN7SL771P 106481132 +RN7SL774P 106481761 +RN7SL775P 106481859 +RN7SL776P 106479503 +RN7SL778P 106479504 +RN7SL782P 106481133 +RN7SL783P 106479505 +RN7SL784P 106481134 +RN7SL785P 106480532 +RN7SL786P 106479506 +RN7SL787P 106479507 +RN7SL788P 106481135 +RN7SL789P 106479508 +RN7SL790P 106481136 +RN7SL791P 106481860 +RN7SL792P 106479509 +RN7SL793P 106481137 +RN7SL794P 106479510 +RN7SL795P 106479511 +RN7SL796P 107080653 +RN7SL797P 106481138 +RN7SL798P 106480533 +RN7SL799P 106480382 +RN7SL800P 106479512 +RN7SL801P 106481139 +RN7SL802P 106479513 +RN7SL803P 106479514 +RN7SL804P 106481140 +RN7SL806P 106479515 +RN7SL807P 106481141 +RN7SL808P 106481861 +RN7SL809P 106479516 +RN7SL810P 106481142 +RN7SL811P 106479517 +RN7SL812P 106479518 +RN7SL813P 106480534 +RN7SL814P 106481143 +RN7SL815P 106479519 +RN7SL817P 106481144 +RN7SL818P 106479520 +RN7SL819P 106481145 +RN7SL820P 106480535 +RN7SL822P 106479521 +RN7SL823P 106479522 +RN7SL824P 106481146 +RN7SL825P 107080654 +RN7SL826P 106479523 +RN7SL827P 106481762 +RN7SL828P 106481147 +RN7SL831P 106481862 +RN7SL832P 106479524 +RN7SL833P 106479525 +RN7SL834P 106481148 +RN7SL835P 106479526 +RN7SL836P 106481149 +RN7SL837P 106480536 +RN7SL838P 106479527 +RN7SL840P 106479528 +RN7SL841P 106481150 +RN7SL842P 106479529 +RN7SL843P 106481151 +RN7SL845P 106481863 +RN7SL846P 106479530 +RN7SL847P 106481152 +RN7SL849P 106479531 +RN7SL850P 106479532 +RN7SL851P 106480537 +RN7SL853P 106481153 +RN7SL854P 106480383 +RN7SL856P 106479533 +RN7SL860P 106635537 +RN7SL861P 106479534 +RN7SL862P 106479535 +RN7SL863P 106480538 +RN7SL864P 106479536 +RN7SL865P 106481154 +RN7SL868P 106479537 +RN7SL869P 106481864 +RN7SL870P 106481155 +RNA5-8S1 106632263 +RNA5-8S2 106632262 +RNA5-8S3 106632261 +RNA5-8S4 110255166 +RNA5-8S5 110255170 +RNA5-8SN1 106632260 +RNA5-8SN2 109864281 +RNA5-8SN3 109910381 +RNA5-8SN4 109864274 +RNA5-8SN5 100008587 +RNA5-8SP2 100873571 +RNA5-8SP3 100873334 +RNA5-8SP4 100873572 +RNA5-8SP5 100873335 +RNA5-8SP6 100873336 +RNA5-8SP7 100873573 +RNA5-8SP8 109864278 +RNA5-8SP9 109864276 +RNA5-8SP10 109910384 +RNA5S1 100169751 +RNA5S2 100169753 +RNA5S3 100169754 +RNA5S4 100169755 +RNA5S5 100169756 +RNA5S6 100169757 +RNA5S7 100169758 +RNA5S8 100169759 +RNA5S9 100169760 +RNA5S10 100169761 +RNA5S11 100169762 +RNA5S12 100169763 +RNA5S13 100169764 +RNA5S14 100169765 +RNA5S15 100169766 +RNA5S16 100169767 +RNA5S17 100169768 +RNA5SP18 100873273 +RNA5SP19 100873274 +RNA5SP20 100873275 +RNA5SP21 100873276 +RNA5SP22 100873277 +RNA5SP23 100873278 +RNA5SP24 100873356 +RNA5SP25 100873357 +RNA5SP26 100873358 +RNA5SP27 100873359 +RNA5SP28 100873360 +RNA5SP29 100873361 +RNA5SP30 100873362 +RNA5SP31 100873363 +RNA5SP33 100873365 +RNA5SP34 100873366 +RNA5SP35 100873367 +RNA5SP36 100873368 +RNA5SP37 100873369 +RNA5SP38 100873370 +RNA5SP39 100873371 +RNA5SP40 100873279 +RNA5SP41 100873280 +RNA5SP42 100873281 +RNA5SP43 100873282 +RNA5SP44 100873283 +RNA5SP45 100873284 +RNA5SP46 100873285 +RNA5SP47 100873286 +RNA5SP48 100873287 +RNA5SP49 100873288 +RNA5SP50 106478992 +RNA5SP51 100873289 +RNA5SP52 100873290 +RNA5SP53 100873291 +RNA5SP54 100873292 +RNA5SP55 100873293 +RNA5SP56 100873294 +RNA5SP57 106480754 +RNA5SP59 106480357 +RNA5SP60 100873295 +RNA5SP61 100873296 +RNA5SP62 100873297 +RNA5SP63 100873298 +RNA5SP64 100873299 +RNA5SP65 100873300 +RNA5SP66 100873301 +RNA5SP67 100873302 +RNA5SP68 100873303 +RNA5SP69 100873304 +RNA5SP70 106480436 +RNA5SP71 100873305 +RNA5SP72 100873306 +RNA5SP73 100873307 +RNA5SP74 100873308 +RNA5SP75 100873309 +RNA5SP76 100873310 +RNA5SP77 100873311 +RNA5SP78 100873312 +RNA5SP79 100873313 +RNA5SP80 100873314 +RNA5SP82 100873316 +RNA5SP84 100873317 +RNA5SP85 100873318 +RNA5SP86 100873319 +RNA5SP87 100873320 +RNA5SP88 100873321 +RNA5SP89 100873322 +RNA5SP90 100873323 +RNA5SP91 100873324 +RNA5SP92 100873325 +RNA5SP93 100873326 +RNA5SP94 100873327 +RNA5SP95 100873328 +RNA5SP96 100873329 +RNA5SP97 100873330 +RNA5SP98 100873331 +RNA5SP99 106478993 +RNA5SP100 106480755 +RNA5SP101 100873372 +RNA5SP102 100873373 +RNA5SP103 100873374 +RNA5SP104 100873375 +RNA5SP105 100873376 +RNA5SP106 106478994 +RNA5SP107 100873377 +RNA5SP108 100873378 +RNA5SP109 100873379 +RNA5SP110 100873380 +RNA5SP111 100873381 +RNA5SP112 100873382 +RNA5SP113 100873383 +RNA5SP114 100873384 +RNA5SP115 100873385 +RNA5SP116 100873386 +RNA5SP117 100873387 +RNA5SP118 100873388 +RNA5SP119 100873389 +RNA5SP120 100873390 +RNA5SP121 100873391 +RNA5SP122 100873392 +RNA5SP123 100873393 +RNA5SP124 100873394 +RNA5SP125 100873395 +RNA5SP126 100873396 +RNA5SP127 100873397 +RNA5SP128 100873398 +RNA5SP129 100873399 +RNA5SP130 106478995 +RNA5SP131 100873400 +RNA5SP132 100873401 +RNA5SP133 100873402 +RNA5SP134 106480756 +RNA5SP135 100873403 +RNA5SP136 100873404 +RNA5SP137 100873405 +RNA5SP138 100873406 +RNA5SP139 100873407 +RNA5SP140 106478996 +RNA5SP141 100873408 +RNA5SP142 100873409 +RNA5SP143 100873410 +RNA5SP144 100873411 +RNA5SP145 100873412 +RNA5SP146 100873413 +RNA5SP147 100873414 +RNA5SP148 100873415 +RNA5SP149 106480437 +RNA5SP150 100873416 +RNA5SP151 100873417 +RNA5SP152 100873418 +RNA5SP153 100873419 +RNA5SP154 100873420 +RNA5SP155 100873421 +RNA5SP156 100873422 +RNA5SP157 100873423 +RNA5SP158 100873424 +RNA5SP159 100873425 +RNA5SP160 100873426 +RNA5SP161 106480757 +RNA5SP162 100873427 +RNA5SP163 100873428 +RNA5SP164 100873429 +RNA5SP165 100873430 +RNA5SP166 100873431 +RNA5SP167 100873432 +RNA5SP168 100873433 +RNA5SP169 100873434 +RNA5SP170 100873435 +RNA5SP171 100873436 +RNA5SP172 106478997 +RNA5SP173 100873437 +RNA5SP174 106478998 +RNA5SP175 106480758 +RNA5SP176 100873438 +RNA5SP177 100873439 +RNA5SP178 100873440 +RNA5SP179 100873441 +RNA5SP180 100873442 +RNA5SP181 100873443 +RNA5SP182 100873444 +RNA5SP183 100873445 +RNA5SP184 100873446 +RNA5SP185 100873447 +RNA5SP186 100873448 +RNA5SP187 100873449 +RNA5SP188 100873450 +RNA5SP189 100873451 +RNA5SP190 100873452 +RNA5SP191 100873453 +RNA5SP192 100873454 +RNA5SP193 100873455 +RNA5SP194 100873456 +RNA5SP195 100873457 +RNA5SP196 100873458 +RNA5SP197 100873459 +RNA5SP198 100873460 +RNA5SP199 106480438 +RNA5SP200 100873461 +RNA5SP201 100873462 +RNA5SP202 100873463 +RNA5SP203 100873464 +RNA5SP204 100873465 +RNA5SP205 100873466 +RNA5SP206 106478999 +RNA5SP207 100873467 +RNA5SP208 100873468 +RNA5SP209 100873469 +RNA5SP210 100873470 +RNA5SP211 100873471 +RNA5SP212 100873472 +RNA5SP213 100873473 +RNA5SP214 100873474 +RNA5SP215 100873475 +RNA5SP216 100873476 +RNA5SP217 100873477 +RNA5SP218 100873478 +RNA5SP219 100873479 +RNA5SP220 100873480 +RNA5SP221 106480759 +RNA5SP222 100873481 +RNA5SP223 100873482 +RNA5SP224 100873483 +RNA5SP225 100873484 +RNA5SP226 106479000 +RNA5SP227 100873485 +RNA5SP228 100873486 +RNA5SP229 100873487 +RNA5SP230 100873488 +RNA5SP231 100873489 +RNA5SP232 100873490 +RNA5SP233 100873491 +RNA5SP234 100873492 +RNA5SP235 100873493 +RNA5SP236 100873494 +RNA5SP237 100873495 +RNA5SP238 100873496 +RNA5SP239 100873497 +RNA5SP240 100873498 +RNA5SP241 100873499 +RNA5SP242 100873500 +RNA5SP243 106479001 +RNA5SP244 100885864 +RNA5SP245 100873501 +RNA5SP246 100873502 +RNA5SP247 100873503 +RNA5SP248 100873504 +RNA5SP249 100873505 +RNA5SP250 100873506 +RNA5SP251 100873507 +RNA5SP252 100873508 +RNA5SP253 106480760 +RNA5SP254 106481793 +RNA5SP255 100873509 +RNA5SP256 100873510 +RNA5SP257 100873511 +RNA5SP258 100873512 +RNA5SP259 100873513 +RNA5SP260 100873514 +RNA5SP261 100873515 +RNA5SP262 100873516 +RNA5SP263 106479002 +RNA5SP264 100873517 +RNA5SP265 100873518 +RNA5SP266 100873519 +RNA5SP267 100873520 +RNA5SP268 100873521 +RNA5SP269 100873522 +RNA5SP270 100873523 +RNA5SP271 100873524 +RNA5SP272 100873525 +RNA5SP273 100873526 +RNA5SP274 100873527 +RNA5SP275 100873528 +RNA5SP276 100873529 +RNA5SP277 100873530 +RNA5SP278 100873531 +RNA5SP279 100873532 +RNA5SP280 100873533 +RNA5SP281 100873534 +RNA5SP282 100873535 +RNA5SP283 100873536 +RNA5SP284 100873537 +RNA5SP285 100873538 +RNA5SP286 100873539 +RNA5SP287 100873540 +RNA5SP288 100873541 +RNA5SP289 100873542 +RNA5SP290 100873543 +RNA5SP291 100873544 +RNA5SP292 100873545 +RNA5SP293 100873546 +RNA5SP294 100873547 +RNA5SP295 100873548 +RNA5SP296 100873549 +RNA5SP297 106479003 +RNA5SP298 106480761 +RNA5SP299 100873574 +RNA5SP300 100873575 +RNA5SP301 100873576 +RNA5SP302 106479004 +RNA5SP303 100873577 +RNA5SP304 100873578 +RNA5SP305 100873579 +RNA5SP306 100873580 +RNA5SP307 100873581 +RNA5SP308 100873582 +RNA5SP309 100873583 +RNA5SP310 106480762 +RNA5SP311 106480358 +RNA5SP312 106480439 +RNA5SP315 106479005 +RNA5SP317 106479006 +RNA5SP318 100873584 +RNA5SP319 100873585 +RNA5SP320 100873586 +RNA5SP321 100873587 +RNA5SP322 100873588 +RNA5SP323 100873589 +RNA5SP324 100873590 +RNA5SP325 100873591 +RNA5SP326 100873592 +RNA5SP327 100873593 +RNA5SP328 100873594 +RNA5SP329 100873595 +RNA5SP330 100873596 +RNA5SP331 100873597 +RNA5SP332 100873598 +RNA5SP333 106480763 +RNA5SP334 106865375 +RNA5SP335 106479007 +RNA5SP336 100873599 +RNA5SP337 100873600 +RNA5SP338 100873601 +RNA5SP339 100873602 +RNA5SP340 100873603 +RNA5SP341 100873604 +RNA5SP342 106479008 +RNA5SP343 100873605 +RNA5SP344 100873606 +RNA5SP345 100873607 +RNA5SP346 100873608 +RNA5SP347 100873609 +RNA5SP348 100873610 +RNA5SP349 100873611 +RNA5SP350 106481794 +RNA5SP351 106480764 +RNA5SP352 100873612 +RNA5SP353 100873613 +RNA5SP354 100873614 +RNA5SP355 106479009 +RNA5SP356 100873615 +RNA5SP357 100873616 +RNA5SP358 100873617 +RNA5SP359 100873618 +RNA5SP360 100873619 +RNA5SP361 100873620 +RNA5SP362 100873621 +RNA5SP363 100873622 +RNA5SP364 100873623 +RNA5SP365 100873624 +RNA5SP366 100873625 +RNA5SP367 100873626 +RNA5SP368 100873627 +RNA5SP369 100873628 +RNA5SP370 106480765 +RNA5SP371 100873629 +RNA5SP372 100873630 +RNA5SP373 100873631 +RNA5SP374 100873632 +RNA5SP375 100873633 +RNA5SP376 106479010 +RNA5SP377 106479011 +RNA5SP378 100873634 +RNA5SP379 100873635 +RNA5SP380 100873636 +RNA5SP382 100873637 +RNA5SP383 100873638 +RNA5SP384 100873639 +RNA5SP385 100873640 +RNA5SP386 100873641 +RNA5SP387 107133508 +RNA5SP388 100873642 +RNA5SP389 106480766 +RNA5SP390 100873643 +RNA5SP391 100873644 +RNA5SP392 100873645 +RNA5SP393 100873646 +RNA5SP394 100873647 +RNA5SP395 100873648 +RNA5SP396 100873649 +RNA5SP397 100873650 +RNA5SP399 100873652 +RNA5SP400 100873653 +RNA5SP401 100873654 +RNA5SP402 100873655 +RNA5SP403 106479012 +RNA5SP404 100873656 +RNA5SP405 100873657 +RNA5SP406 100873658 +RNA5SP407 100873659 +RNA5SP408 100873660 +RNA5SP409 100873661 +RNA5SP410 100873662 +RNA5SP411 100887740 +RNA5SP412 100873663 +RNA5SP413 100873664 +RNA5SP414 100873665 +RNA5SP415 100873666 +RNA5SP416 100873667 +RNA5SP417 100873668 +RNA5SP418 100873669 +RNA5SP419 100873670 +RNA5SP420 100873671 +RNA5SP421 100873672 +RNA5SP422 100873673 +RNA5SP423 100873674 +RNA5SP424 100873675 +RNA5SP425 100873676 +RNA5SP426 100873677 +RNA5SP427 100873678 +RNA5SP428 100873679 +RNA5SP429 106480767 +RNA5SP430 100873680 +RNA5SP431 100873681 +RNA5SP432 100873682 +RNA5SP433 100873683 +RNA5SP434 100873684 +RNA5SP435 106479013 +RNA5SP436 100873685 +RNA5SP437 100873686 +RNA5SP438 100873687 +RNA5SP439 106479014 +RNA5SP440 100873688 +RNA5SP441 100873689 +RNA5SP442 106480768 +RNA5SP443 106481745 +RNA5SP444 100873690 +RNA5SP445 100873691 +RNA5SP446 100873692 +RNA5SP447 100873693 +RNA5SP448 106479015 +RNA5SP449 100873694 +RNA5SP450 100873695 +RNA5SP451 100873696 +RNA5SP452 100873697 +RNA5SP453 100873698 +RNA5SP454 100873699 +RNA5SP455 100873700 +RNA5SP456 100873701 +RNA5SP457 100873702 +RNA5SP458 106479016 +RNA5SP459 100873703 +RNA5SP460 100873704 +RNA5SP461 100873705 +RNA5SP462 100873706 +RNA5SP463 100873707 +RNA5SP464 100873708 +RNA5SP465 100873709 +RNA5SP466 100873710 +RNA5SP467 100873711 +RNA5SP468 106480769 +RNA5SP469 100873712 +RNA5SP470 100873713 +RNA5SP471 100873714 +RNA5SP472 100873715 +RNA5SP473 106479017 +RNA5SP474 100873716 +RNA5SP475 100873717 +RNA5SP476 100873718 +RNA5SP477 100873719 +RNA5SP478 100873720 +RNA5SP479 100873721 +RNA5SP480 100873722 +RNA5SP481 100873723 +RNA5SP482 100873724 +RNA5SP483 100873725 +RNA5SP484 100873726 +RNA5SP485 100873727 +RNA5SP486 100873728 +RNA5SP487 100873729 +RNA5SP488 100873730 +RNA5SP489 100873731 +RNA5SP490 100873732 +RNA5SP491 100873733 +RNA5SP492 100873734 +RNA5SP493 100873735 +RNA5SP494 100873736 +RNA5SP495 100873737 +RNA5SP496 100873738 +RNA5SP497 100873739 +RNA5SP498 106480770 +RNA5SP499 100873550 +RNA5SP500 100873551 +RNA5SP501 100873552 +RNA5SP502 100873553 +RNA5SP503 100873554 +RNA5SP504 100873555 +RNA5SP505 100873556 +RNA5SP506 100873557 +RNA5SP507 100873558 +RNA5SP508 100873559 +RNA5SP509 100873560 +RNA5SP510 100873561 +RNA5SP511 100873562 +RNA5SP512 100873563 +RNA5SP513 100873564 +RNA5SP514 100873565 +RNA5SP515 100873566 +RNA5SP516 100873567 +RNA5SP517 100873568 +RNA5SP518 100873569 +RNA5SP519 100873570 +RNA5SP520 106480771 +RNA5SP521 106479018 +RNA5SP522 106479019 +RNA5SP523 106480772 +RNA5SP524 111644143 +RNA5SP525 111644134 +RNA5SP526 111644135 +RNA5SP527 111644144 +RNA5SP528 111644145 +RNA5SP529 111644136 +RNA5SP530 112436692 +RNA5SP531 111644137 +RNA5SP532 112441442 +RNA5SP533 111644138 +RNA5SP534 111644140 +RNA5SP535 111644139 +RNA5SP536 111644146 +RNA18S1 106632259 +RNA18S2 106632258 +RNA18S3 106631782 +RNA18S4 110255165 +RNA18S5 110255169 +RNA18SN1 106631781 +RNA18SN2 109864280 +RNA18SN3 109910380 +RNA18SN4 109864273 +RNA18SN5 100008588 +RNA18SP2 359724 +RNA18SP3 109864277 +RNA18SP4 109864275 +RNA18SP5 109910383 +RNA28S1 106632267 +RNA28S2 106632266 +RNA28S3 106632265 +RNA28S4 110255164 +RNA28S5 110255168 +RNA28SN1 106632264 +RNA28SN2 109864282 +RNA28SN3 109910382 +RNA28SN4 109864272 +RNA28SN5 100008589 +RNA45S1 106631780 +RNA45S2 106631779 +RNA45S3 106631778 +RNA45S4 110255163 +RNA45S5 110255167 +RNA45SN1 106631777 +RNA45SN2 109864279 +RNA45SN3 109910379 +RNA45SN4 109864271 +RNA45SN5 100861532 +RNASE1 6035 +RNASE2 6036 +RNASE2CP 643332 +RNASE3 6037 +RNASE4 6038 +RNASE6 6039 +RNASE7 84659 +RNASE8 122665 +RNASE9 390443 +RNASE10 338879 +RNASE11 122651 +RNASE11-AS1 254028 +RNASE12 493901 +RNASE13 440163 +RNASEH1 246243 +RNASEH1-DT 100506054 +RNASEH1P1 284203 +RNASEH1P2 390766 +RNASEH1P3 199827 +RNASEH2A 10535 +RNASEH2B 79621 +RNASEH2B-AS1 100874255 +RNASEH2C 84153 +RNASEH2CP1 386608 +RNASEK 440400 +RNASEK-C17orf49 100529209 +RNASEL 6041 +RNASET2 8635 +RND1 27289 +RND2 8153 +RND3 390 +RNF2 6045 +RNF2P1 100132467 +RNF4 6047 +RNF5 6048 +RNF5P1 286140 +RNF6 6049 +RNF6P1 100420924 +RNF7 9616 +RNF7P1 100506872 +RNF8 9025 +RNF10 9921 +RNF10P1 100419599 +RNF11 26994 +RNF11P1 100131695 +RNF11P2 170543 +RNF13 11342 +RNF13P1 647253 +RNF14 9604 +RNF14P1 100129375 +RNF14P2 116435284 +RNF14P3 100419643 +RNF14P4 100419645 +RNF17 56163 +RNF19A 25897 +RNF19B 127544 +RNF19BPX 100419788 +RNF19BPY 100419722 +RNF20 56254 +RNF24 11237 +RNF25 64320 +RNF26 79102 +RNF31 55072 +RNF32 140545 +RNF32-AS1 101927858 +RNF32-DT 100506380 +RNF34 80196 +RNF38 152006 +RNF39 80352 +RNF40 9810 +RNF41 10193 +RNF43 54894 +RNF44 22838 +RNF103 7844 +RNF103-CHMP3 100526767 +RNF111 54778 +RNF112 7732 +RNF113A 7737 +RNF113B 140432 +RNF114 55905 +RNF115 27246 +RNF121 55298 +RNF122 79845 +RNF123 63891 +RNF125 54941 +RNF126 55658 +RNF126P1 376412 +RNF128 79589 +RNF130 55819 +RNF133 168433 +RNF135 84282 +RNF138 51444 +RNF138P1 379013 +RNF138P2 100419777 +RNF139 11236 +RNF139-DT 101927612 +RNF141 50862 +RNF144A 9781 +RNF144B 255488 +RNF145 153830 +RNF146 81847 +RNF148 378925 +RNF149 284996 +RNF150 57484 +RNF151 146310 +RNF152 220441 +RNF152P1 100419687 +RNF157 114804 +RNF157-AS1 100507218 +RNF166 115992 +RNF167 26001 +RNF168 165918 +RNF169 254225 +RNF170 81790 +RNF175 285533 +RNF180 285671 +RNF181 51255 +RNF182 221687 +RNF183 138065 +RNF185 91445 +RNF185-AS1 100852405 +RNF186 54546 +RNF186-AS1 121847981 +RNF187 149603 +RNF207 388591 +RNF207-AS1 102724450 +RNF208 727800 +RNF212 285498 +RNF212B 100507650 +RNF213 57674 +RNF213-AS1 100294362 +RNF214 257160 +RNF215 200312 +RNF216 54476 +RNF216-IT1 100874342 +RNF216P1 441191 +RNF217 154214 +RNF217-AS1 7955 +RNF220 55182 +RNF222 643904 +RNF223 401934 +RNF224 643596 +RNF225 646862 +RNF227 284023 +RNFT1 51136 +RNFT1-DT 101927755 +RNFT1P1 100420886 +RNFT1P2 100132264 +RNFT1P3 101929203 +RNFT2 84900 +RNGTT 8732 +RNGTTP1 100421428 +RNH1 6050 +RNLS 55328 +RNMT 8731 +RNPC3 55599 +RNPC3-DT 101928436 +RNPC3P1 654340 +RNPEP 6051 +RNPEPL1 57140 +RNPS1 10921 +RNPS1P1 643446 +RNR1 6052 +RNR2 6053 +RNR3 6054 +RNR4 6055 +RNR5 6056 +RNU1-1 26871 +RNU1-2 26870 +RNU1-3 26869 +RNU1-4 6060 +RNU1-5P 107105261 +RNU1-6P 106480152 +RNU1-7P 106481952 +RNU1-8P 106481604 +RNU1-11P 26861 +RNU1-14P 26859 +RNU1-15P 26858 +RNU1-16P 100873860 +RNU1-17P 100873814 +RNU1-18P 100873815 +RNU1-19P 100873861 +RNU1-20P 100873816 +RNU1-21P 100873862 +RNU1-22P 100873863 +RNU1-23P 106478980 +RNU1-24P 100873865 +RNU1-27P 26865 +RNU1-28P 26866 +RNU1-29P 106480154 +RNU1-30P 106480662 +RNU1-31P 106481606 +RNU1-32P 106480155 +RNU1-33P 106480156 +RNU1-34P 106481607 +RNU1-35P 106480157 +RNU1-36P 106481783 +RNU1-38P 106481608 +RNU1-39P 106481953 +RNU1-40P 106480158 +RNU1-41P 107105262 +RNU1-42P 106481609 +RNU1-43P 106480159 +RNU1-44P 106480160 +RNU1-45P 106481610 +RNU1-46P 106480663 +RNU1-47P 106480161 +RNU1-48P 107080628 +RNU1-49P 106480162 +RNU1-51P 106480163 +RNU1-52P 106480164 +RNU1-54P 106481611 +RNU1-55P 106481954 +RNU1-56P 106480165 +RNU1-57P 106480166 +RNU1-58P 106481612 +RNU1-61P 106481980 +RNU1-62P 106481613 +RNU1-63P 106480664 +RNU1-64P 106480168 +RNU1-65P 106481614 +RNU1-67P 106480169 +RNU1-68P 106481615 +RNU1-70P 107105264 +RNU1-72P 106481955 +RNU1-73P 106481616 +RNU1-74P 106480171 +RNU1-75P 106480172 +RNU1-76P 106481617 +RNU1-77P 106480173 +RNU1-78P 106480665 +RNU1-79P 107521942 +RNU1-80P 106480174 +RNU1-82P 106480175 +RNU1-83P 106480176 +RNU1-84P 106481618 +RNU1-86P 106480666 +RNU1-88P 106481619 +RNU1-89P 106480412 +RNU1-91P 106480179 +RNU1-93P 106480180 +RNU1-94P 106481956 +RNU1-95P 106481621 +RNU1-96P 106480181 +RNU1-97P 106480182 +RNU1-98P 106481622 +RNU1-100P 106480183 +RNU1-101P 106480667 +RNU1-103P 106481623 +RNU1-104P 106480184 +RNU1-105P 106480185 +RNU1-107P 106480186 +RNU1-108P 106481957 +RNU1-109P 106481625 +RNU1-112P 106480187 +RNU1-114P 106481626 +RNU1-115P 106480188 +RNU1-116P 107521946 +RNU1-117P 106480189 +RNU1-119P 106480668 +RNU1-123P 106481628 +RNU1-124P 106481629 +RNU1-125P 106866915 +RNU1-128P 106480191 +RNU1-129P 106481630 +RNU1-130P 106480192 +RNU1-131P 106480193 +RNU1-132P 106481958 +RNU1-133P 106481631 +RNU1-134P 106480194 +RNU1-136P 106481632 +RNU1-138P 106480195 +RNU1-139P 106480196 +RNU1-140P 106480669 +RNU1-141P 106481633 +RNU1-142P 106480197 +RNU1-143P 106481634 +RNU1-146P 106480198 +RNU1-148P 106481635 +RNU1-149P 107048983 +RNU1-150P 106480413 +RNU1-151P 110806291 +RNU1-152P 107521952 +RNU1-153P 115409985 +RNU1-154P 115409990 +RNU1-155P 115409986 +RNU2-1 6066 +RNU2-2P 26855 +RNU2-3P 26854 +RNU2-4P 26853 +RNU2-5P 26852 +RNU2-6P 100873825 +RNU2-7P 100873824 +RNU2-8P 106480200 +RNU2-9P 106481636 +RNU2-10P 106480201 +RNU2-11P 106481637 +RNU2-12P 106480202 +RNU2-13P 106480203 +RNU2-14P 106481638 +RNU2-15P 106866980 +RNU2-16P 106481639 +RNU2-17P 106480204 +RNU2-18P 106480205 +RNU2-19P 106481959 +RNU2-20P 106481640 +RNU2-21P 106480206 +RNU2-22P 106660611 +RNU2-23P 106481641 +RNU2-24P 106480207 +RNU2-25P 106480208 +RNU2-26P 106480414 +RNU2-27P 106481642 +RNU2-28P 106480670 +RNU2-29P 106480209 +RNU2-30P 106481643 +RNU2-31P 106480210 +RNU2-32P 106481644 +RNU2-33P 106480211 +RNU2-34P 106481960 +RNU2-35P 106480212 +RNU2-36P 106481645 +RNU2-37P 106480213 +RNU2-38P 106481646 +RNU2-39P 106480214 +RNU2-40P 106480671 +RNU2-41P 106480215 +RNU2-42P 106481647 +RNU2-43P 106480216 +RNU2-44P 106481648 +RNU2-45P 106480217 +RNU2-46P 106480218 +RNU2-47P 106480672 +RNU2-48P 106481649 +RNU2-49P 106480219 +RNU2-50P 106481650 +RNU2-51P 106480415 +RNU2-52P 107080629 +RNU2-53P 106480220 +RNU2-54P 106481651 +RNU2-55P 106481961 +RNU2-56P 106480221 +RNU2-57P 106480222 +RNU2-58P 106481652 +RNU2-59P 106480223 +RNU2-60P 106481653 +RNU2-61P 106480673 +RNU2-62P 106480224 +RNU2-63P 106480225 +RNU2-64P 106481654 +RNU2-65P 106480226 +RNU2-66P 106481655 +RNU2-68P 106481962 +RNU2-69P 106481656 +RNU2-70P 106480227 +RNU2-71P 106480228 +RNU2-72P 106480702 +RNU4-1 26835 +RNU4-2 26834 +RNU4-3P 26841 +RNU4-4P 26840 +RNU4-5P 26839 +RNU4-6P 26838 +RNU4-7P 6069 +RNU4-8P 6070 +RNU4-9P 100862675 +RNU4-10P 100862676 +RNU4-11P 106481175 +RNU4-12P 106479564 +RNU4-13P 106481763 +RNU4-14P 106481176 +RNU4-15P 106479565 +RNU4-16P 106479566 +RNU4-17P 106481177 +RNU4-18P 106480545 +RNU4-20P 106479567 +RNU4-21P 106481178 +RNU4-22P 107057646 +RNU4-23P 106479568 +RNU4-24P 106481179 +RNU4-25P 106481870 +RNU4-26P 106479569 +RNU4-27P 106481180 +RNU4-28P 106479570 +RNU4-29P 106481181 +RNU4-30P 106479571 +RNU4-31P 106480546 +RNU4-32P 106479572 +RNU4-33P 107080655 +RNU4-34P 106480385 +RNU4-35P 106481182 +RNU4-36P 106479573 +RNU4-37P 106481183 +RNU4-38P 106479574 +RNU4-39P 106479575 +RNU4-40P 106479576 +RNU4-41P 106481184 +RNU4-42P 106479577 +RNU4-43P 106481185 +RNU4-44P 106479578 +RNU4-45P 106481186 +RNU4-46P 107048985 +RNU4-47P 106479579 +RNU4-48P 106479580 +RNU4-49P 106481187 +RNU4-50P 106481871 +RNU4-51P 106479581 +RNU4-52P 106481188 +RNU4-53P 106479582 +RNU4-54P 106479583 +RNU4-55P 106481189 +RNU4-56P 106480547 +RNU4-57P 106479584 +RNU4-58P 106481190 +RNU4-59P 106481764 +RNU4-60P 106479585 +RNU4-61P 106481191 +RNU4-62P 106479586 +RNU4-63P 106479587 +RNU4-64P 106481872 +RNU4-65P 106481192 +RNU4-66P 106479588 +RNU4-67P 106481193 +RNU4-68P 106479589 +RNU4-69P 106479590 +RNU4-70P 106480548 +RNU4-71P 106481194 +RNU4-72P 106479591 +RNU4-73P 106481195 +RNU4-74P 106479592 +RNU4-75P 106479593 +RNU4-76P 106480549 +RNU4-77P 106481196 +RNU4-78P 106479594 +RNU4-79P 106481197 +RNU4-80P 106480386 +RNU4-81P 106479595 +RNU4-82P 106481198 +RNU4-83P 106479596 +RNU4-84P 106481873 +RNU4-85P 106479597 +RNU4-86P 106481199 +RNU4-87P 106479598 +RNU4-88P 106479599 +RNU4-89P 106481200 +RNU4-90P 106479600 +RNU4-91P 106481201 +RNU4-92P 106479601 +RNU4ATAC 100151683 +RNU4ATAC2P 100873889 +RNU4ATAC3P 106480753 +RNU4ATAC4P 106479539 +RNU4ATAC5P 106481156 +RNU4ATAC6P 106479540 +RNU4ATAC7P 106480539 +RNU4ATAC8P 106481157 +RNU4ATAC9P 106479541 +RNU4ATAC10P 106479542 +RNU4ATAC11P 106481158 +RNU4ATAC12P 106481865 +RNU4ATAC13P 106479543 +RNU4ATAC14P 106481159 +RNU4ATAC15P 106479544 +RNU4ATAC16P 106481160 +RNU4ATAC17P 106480696 +RNU4ATAC18P 106481866 +RNU5A-1 26831 +RNU5A-2P 100873830 +RNU5A-3P 100873831 +RNU5A-4P 100873870 +RNU5A-5P 100873835 +RNU5A-6P 100873871 +RNU5A-7P 100873872 +RNU5A-8P 100873838 +RNU5B-1 26832 +RNU5B-2P 100147750 +RNU5B-3P 100147751 +RNU5B-4P 100147752 +RNU5B-5P 100147753 +RNU5B-6P 100147754 +RNU5D-1 26830 +RNU5D-2P 100873841 +RNU5E-1 26829 +RNU5E-2P 100873827 +RNU5E-3P 100873828 +RNU5E-4P 100873829 +RNU5E-5P 100873869 +RNU5E-6P 100873832 +RNU5E-7P 100873836 +RNU5E-8P 100873837 +RNU5E-9P 100873840 +RNU5E-10P 100873888 +RNU5F-1 26828 +RNU5F-2P 100873826 +RNU5F-3P 100873866 +RNU5F-4P 100873867 +RNU5F-5P 100873868 +RNU5F-6P 100873833 +RNU5F-7P 100873834 +RNU5F-8P 100873839 +RNU6-1 26827 +RNU6-2 103625684 +RNU6-3P 106478919 +RNU6-4P 106478914 +RNU6-5P 106478913 +RNU6-6P 26826 +RNU6-7 101954275 +RNU6-8 101954278 +RNU6-9 101954271 +RNU6-10P 100873745 +RNU6-11P 106478915 +RNU6-12P 106481973 +RNU6-13P 106480423 +RNU6-14P 100873746 +RNU6-15P 100302741 +RNU6-16P 100873753 +RNU6-17P 106480705 +RNU6-18P 106478916 +RNU6-19P 100873754 +RNU6-20P 106480706 +RNU6-21P 100302738 +RNU6-22P 106478917 +RNU6-23P 100873755 +RNU6-24P 106480707 +RNU6-25P 106480704 +RNU6-26P 100873741 +RNU6-27P 106478918 +RNU6-28P 100873756 +RNU6-29P 107131122 +RNU6-30P 100873747 +RNU6-31P 100873740 +RNU6-32P 106480708 +RNU6-33P 100873748 +RNU6-34P 100873749 +RNU6-35P 100873750 +RNU6-36P 100873757 +RNU6-37P 106478920 +RNU6-38P 106480709 +RNU6-39P 100873758 +RNU6-40P 106480703 +RNU6-41P 106478912 +RNU6-42P 100302742 +RNU6-43P 106478921 +RNU6-44P 106478922 +RNU6-45P 100873759 +RNU6-46P 100873760 +RNU6-47P 106480710 +RNU6-48P 100887744 +RNU6-49P 106478923 +RNU6-50P 26825 +RNU6-52P 100873761 +RNU6-53P 100873762 +RNU6-54P 106478986 +RNU6-55P 100873763 +RNU6-56P 100873764 +RNU6-57P 100873765 +RNU6-58P 100873766 +RNU6-59P 100873767 +RNU6-60P 106480750 +RNU6-61P 106480435 +RNU6-62P 106478987 +RNU6-63P 100873768 +RNU6-64P 100873769 +RNU6-65P 106480751 +RNU6-66P 100873770 +RNU6-67P 100873771 +RNU6-68P 100873772 +RNU6-69P 100873773 +RNU6-70P 106478988 +RNU6-71P 100873774 +RNU6-72P 100873775 +RNU6-73P 106478989 +RNU6-74P 106480752 +RNU6-75P 100873776 +RNU6-76P 100873777 +RNU6-77P 106481792 +RNU6-78P 100873778 +RNU6-79P 100873779 +RNU6-80P 106478990 +RNU6-81P 100873780 +RNU6-82P 100873781 +RNU6-83P 100873782 +RNU6-84P 106479603 +RNU6-85P 106481203 +RNU6-86P 106479604 +RNU6-87P 106481204 +RNU6-88P 106479605 +RNU6-89P 106480550 +RNU6-90P 106481205 +RNU6-91P 106479606 +RNU6-92P 106479607 +RNU6-94P 106481206 +RNU6-95P 106479608 +RNU6-97P 106480551 +RNU6-98P 106479609 +RNU6-99P 106479610 +RNU6-100P 106481208 +RNU6-101P 106479611 +RNU6-102P 106481209 +RNU6-103P 106480552 +RNU6-104P 106479612 +RNU6-105P 106481210 +RNU6-106P 106479613 +RNU6-107P 106479614 +RNU6-108P 106481875 +RNU6-109P 106481211 +RNU6-110P 106479615 +RNU6-111P 106481212 +RNU6-112P 107057647 +RNU6-113P 106479616 +RNU6-114P 106481765 +RNU6-115P 106479617 +RNU6-116P 106480553 +RNU6-117P 106481213 +RNU6-118P 106479618 +RNU6-119P 106481214 +RNU6-120P 106479619 +RNU6-121P 106481215 +RNU6-122P 106481876 +RNU6-123P 106479620 +RNU6-125P 106479621 +RNU6-126P 106479622 +RNU6-127P 106480554 +RNU6-128P 106481217 +RNU6-129P 106479623 +RNU6-130P 106481218 +RNU6-131P 106479624 +RNU6-132P 106481219 +RNU6-133P 106481877 +RNU6-135P 106479625 +RNU6-136P 106479626 +RNU6-137P 106481220 +RNU6-138P 106479627 +RNU6-139P 106481977 +RNU6-140P 106481221 +RNU6-141P 106480555 +RNU6-142P 106479628 +RNU6-143P 106479629 +RNU6-144P 106481222 +RNU6-145P 106479630 +RNU6-146P 106865372 +RNU6-147P 106480556 +RNU6-148P 106479631 +RNU6-150P 106479632 +RNU6-151P 106479633 +RNU6-152P 106481223 +RNU6-153P 106479634 +RNU6-154P 106481878 +RNU6-155P 106481224 +RNU6-156P 106479635 +RNU6-157P 106479636 +RNU6-158P 106481225 +RNU6-159P 106480557 +RNU6-160P 106479637 +RNU6-161P 106480387 +RNU6-162P 106481226 +RNU6-163P 106479638 +RNU6-164P 106479639 +RNU6-165P 106481227 +RNU6-166P 106481879 +RNU6-167P 106481228 +RNU6-168P 106479640 +RNU6-169P 106481229 +RNU6-170P 106479641 +RNU6-171P 106481230 +RNU6-172P 106479642 +RNU6-173P 106479643 +RNU6-174P 106481231 +RNU6-175P 106480558 +RNU6-176P 106479644 +RNU6-177P 106481232 +RNU6-178P 106479645 +RNU6-179P 106479646 +RNU6-180P 106481233 +RNU6-181P 106480559 +RNU6-182P 106479647 +RNU6-183P 106481234 +RNU6-184P 106479648 +RNU6-185P 106481235 +RNU6-187P 106481880 +RNU6-188P 106479649 +RNU6-189P 106479650 +RNU6-190P 106481236 +RNU6-191P 106479651 +RNU6-192P 106481237 +RNU6-193P 106480560 +RNU6-194P 106479652 +RNU6-195P 106479653 +RNU6-196P 106481238 +RNU6-197P 106479654 +RNU6-198P 106481239 +RNU6-199P 106481881 +RNU6-200P 106479655 +RNU6-201P 106481240 +RNU6-202P 106479656 +RNU6-203P 106479657 +RNU6-204P 106481241 +RNU6-205P 106633815 +RNU6-206P 106481882 +RNU6-207P 106481766 +RNU6-208P 106479658 +RNU6-209P 106481242 +RNU6-210P 106479659 +RNU6-211P 106479660 +RNU6-212P 106481243 +RNU6-213P 106481244 +RNU6-214P 106479661 +RNU6-215P 106481245 +RNU6-216P 106479662 +RNU6-217P 106481246 +RNU6-218P 106479663 +RNU6-219P 106479664 +RNU6-220P 106481247 +RNU6-221P 106480561 +RNU6-222P 106479665 +RNU6-223P 106481248 +RNU6-224P 106479666 +RNU6-225P 106479667 +RNU6-226P 106481249 +RNU6-227P 106481883 +RNU6-228P 106479668 +RNU6-229P 106481250 +RNU6-230P 106479669 +RNU6-231P 106481251 +RNU6-232P 106480388 +RNU6-233P 106480562 +RNU6-234P 106479670 +RNU6-235P 106479671 +RNU6-236P 106481252 +RNU6-237P 106479672 +RNU6-238P 106481253 +RNU6-239P 106480563 +RNU6-240P 106479673 +RNU6-241P 106479674 +RNU6-242P 106481254 +RNU6-243P 106479675 +RNU6-244P 106866981 +RNU6-245P 106481255 +RNU6-246P 106481884 +RNU6-247P 106479676 +RNU6-248P 106481256 +RNU6-249P 106479677 +RNU6-250P 106479678 +RNU6-251P 106481257 +RNU6-252P 106480564 +RNU6-253P 106480697 +RNU6-254P 106479679 +RNU6-255P 106481258 +RNU6-256P 106479680 +RNU6-257P 106479681 +RNU6-258P 106481259 +RNU6-259P 106481260 +RNU6-260P 106479682 +RNU6-261P 106481885 +RNU6-262P 106481261 +RNU6-263P 106479683 +RNU6-264P 106481262 +RNU6-266P 106479684 +RNU6-267P 106480565 +RNU6-268P 106479685 +RNU6-269P 106481263 +RNU6-270P 106479686 +RNU6-271P 106481264 +RNU6-272P 106479687 +RNU6-273P 106480566 +RNU6-274P 106479688 +RNU6-275P 106481265 +RNU6-276P 106479689 +RNU6-277P 106481266 +RNU6-278P 106481767 +RNU6-279P 106479690 +RNU6-280P 106481886 +RNU6-281P 106481267 +RNU6-282P 106479691 +RNU6-283P 106479692 +RNU6-284P 106481268 +RNU6-285P 106479693 +RNU6-286P 106480567 +RNU6-287P 106481269 +RNU6-288P 106479694 +RNU6-289P 106479695 +RNU6-290P 106481270 +RNU6-291P 106479696 +RNU6-293P 106481271 +RNU6-294P 106479697 +RNU6-295P 106481272 +RNU6-296P 106479698 +RNU6-297P 106479699 +RNU6-298P 106481273 +RNU6-299P 106480389 +RNU6-300P 106479700 +RNU6-301P 106481274 +RNU6-302P 106479701 +RNU6-303P 106479702 +RNU6-304P 106481275 +RNU6-306P 106479703 +RNU6-307P 106481276 +RNU6-308P 106480568 +RNU6-309P 106479704 +RNU6-310P 106481277 +RNU6-311P 106479705 +RNU6-312P 106479706 +RNU6-313P 106480569 +RNU6-314P 106481278 +RNU6-315P 106479707 +RNU6-316P 106481279 +RNU6-317P 106479708 +RNU6-318P 106481589 +RNU6-319P 106481280 +RNU6-320P 106480570 +RNU6-321P 106479709 +RNU6-322P 107105253 +RNU6-323P 106481281 +RNU6-324P 106479710 +RNU6-325P 106480390 +RNU6-326P 106481282 +RNU6-327P 106481887 +RNU6-328P 106479711 +RNU6-329P 106479712 +RNU6-330P 106481283 +RNU6-331P 106479713 +RNU6-332P 106481284 +RNU6-333P 106480571 +RNU6-334P 106479714 +RNU6-335P 106479715 +RNU6-336P 106481285 +RNU6-337P 106479716 +RNU6-338P 106481286 +RNU6-339P 106481888 +RNU6-340P 106479717 +RNU6-341P 106481287 +RNU6-342P 106479718 +RNU6-343P 106479719 +RNU6-344P 106480572 +RNU6-345P 106481288 +RNU6-346P 106481768 +RNU6-347P 106479720 +RNU6-348P 106481289 +RNU6-349P 106479721 +RNU6-351P 106479722 +RNU6-352P 106480573 +RNU6-353P 106479723 +RNU6-354P 106481290 +RNU6-355P 106481889 +RNU6-356P 106479724 +RNU6-358P 106481291 +RNU6-359P 106479725 +RNU6-360P 106479726 +RNU6-361P 106480574 +RNU6-362P 106481292 +RNU6-363P 106479727 +RNU6-364P 106481293 +RNU6-365P 106479728 +RNU6-366P 106481294 +RNU6-367P 106481890 +RNU6-368P 106479729 +RNU6-369P 106479730 +RNU6-370P 106481295 +RNU6-371P 106479731 +RNU6-373P 106480391 +RNU6-374P 106481296 +RNU6-375P 106480575 +RNU6-376P 106479732 +RNU6-377P 106479733 +RNU6-378P 106481297 +RNU6-379P 106479734 +RNU6-380P 106481298 +RNU6-381P 106480576 +RNU6-382P 106479735 +RNU6-383P 106479736 +RNU6-384P 106481299 +RNU6-386P 106481300 +RNU6-387P 106481891 +RNU6-388P 106479737 +RNU6-389P 106481301 +RNU6-390P 106479738 +RNU6-391P 106479739 +RNU6-392P 106480577 +RNU6-393P 106481302 +RNU6-394P 106480698 +RNU6-395P 106479740 +RNU6-396P 106481303 +RNU6-397P 106479741 +RNU6-398P 106479742 +RNU6-399P 106481892 +RNU6-400P 106481304 +RNU6-401P 106479743 +RNU6-402P 106481305 +RNU6-403P 106480578 +RNU6-405P 106479744 +RNU6-406P 106481306 +RNU6-407P 106479745 +RNU6-408P 106479746 +RNU6-409P 106481307 +RNU6-410P 106481893 +RNU6-411P 106479747 +RNU6-412P 106481308 +RNU6-413P 106479748 +RNU6-414P 106479749 +RNU6-415P 106481309 +RNU6-416P 106480579 +RNU6-417P 106479750 +RNU6-418P 106481310 +RNU6-419P 106479751 +RNU6-420P 106481769 +RNU6-421P 106481311 +RNU6-422P 106480580 +RNU6-424P 106479753 +RNU6-425P 106481312 +RNU6-426P 106479754 +RNU6-428P 106481894 +RNU6-429P 106479755 +RNU6-430P 106479756 +RNU6-431P 106481314 +RNU6-432P 106479757 +RNU6-433P 106481315 +RNU6-434P 106480581 +RNU6-435P 106479758 +RNU6-436P 106481316 +RNU6-437P 106479759 +RNU6-438P 106479760 +RNU6-439P 106481317 +RNU6-440P 106481895 +RNU6-441P 106480392 +RNU6-442P 106479761 +RNU6-443P 106481318 +RNU6-444P 106479762 +RNU6-445P 106479763 +RNU6-446P 106481319 +RNU6-447P 106481320 +RNU6-448P 106479764 +RNU6-449P 106481896 +RNU6-450P 106481321 +RNU6-451P 106479765 +RNU6-452P 106481322 +RNU6-453P 106479766 +RNU6-454P 106480582 +RNU6-455P 106479767 +RNU6-456P 106481323 +RNU6-457P 106479768 +RNU6-458P 106481324 +RNU6-460P 106479769 +RNU6-461P 106481897 +RNU6-462P 106479770 +RNU6-463P 106481325 +RNU6-464P 106479771 +RNU6-465P 106481326 +RNU6-466P 106481770 +RNU6-467P 106479772 +RNU6-468P 106865374 +RNU6-469P 106481327 +RNU6-470P 106479773 +RNU6-471P 106479774 +RNU6-472P 106481328 +RNU6-473P 106479775 +RNU6-474P 106481329 +RNU6-475P 106479776 +RNU6-476P 106479777 +RNU6-477P 106481330 +RNU6-478P 106479778 +RNU6-479P 106481331 +RNU6-480P 106480583 +RNU6-481P 106479779 +RNU6-482P 106481332 +RNU6-483P 106479780 +RNU6-484P 106479781 +RNU6-485P 106481333 +RNU6-486P 106481898 +RNU6-487P 106480393 +RNU6-488P 106479782 +RNU6-489P 106481334 +RNU6-490P 106479783 +RNU6-491P 106479784 +RNU6-492P 106481335 +RNU6-493P 106481336 +RNU6-494P 106479785 +RNU6-495P 106481337 +RNU6-496P 106480584 +RNU6-497P 106479786 +RNU6-498P 106481338 +RNU6-499P 106479787 +RNU6-500P 106479788 +RNU6-501P 106481339 +RNU6-502P 106481899 +RNU6-503P 106479789 +RNU6-504P 106481340 +RNU6-505P 106479790 +RNU6-506P 106479791 +RNU6-507P 106481341 +RNU6-508P 106480585 +RNU6-509P 106479792 +RNU6-510P 106481342 +RNU6-511P 106479793 +RNU6-512P 106480394 +RNU6-513P 106481343 +RNU6-514P 106480586 +RNU6-516P 106479794 +RNU6-517P 106479795 +RNU6-518P 106481344 +RNU6-519P 106479796 +RNU6-520P 106481345 +RNU6-521P 106481900 +RNU6-522P 106479797 +RNU6-523P 106479798 +RNU6-524P 106481346 +RNU6-525P 106479799 +RNU6-526P 106481347 +RNU6-527P 106480587 +RNU6-528P 106479800 +RNU6-529P 106481348 +RNU6-530P 106479801 +RNU6-531P 106479802 +RNU6-532P 106481349 +RNU6-533P 106481901 +RNU6-534P 106481978 +RNU6-535P 106479803 +RNU6-536P 106481350 +RNU6-537P 106479804 +RNU6-538P 106479805 +RNU6-539P 106481351 +RNU6-540P 106479806 +RNU6-541P 106481352 +RNU6-542P 106480588 +RNU6-543P 106479807 +RNU6-544P 106481353 +RNU6-545P 106479808 +RNU6-546P 106479809 +RNU6-547P 106481902 +RNU6-548P 106481354 +RNU6-549P 106479810 +RNU6-550P 106481355 +RNU6-551P 106479811 +RNU6-552P 106481356 +RNU6-553P 106480589 +RNU6-554P 106479812 +RNU6-555P 106479813 +RNU6-556P 106481357 +RNU6-557P 106479814 +RNU6-558P 106481358 +RNU6-559P 106481771 +RNU6-560P 106480590 +RNU6-561P 106479815 +RNU6-562P 106479816 +RNU6-563P 106481359 +RNU6-564P 106479817 +RNU6-565P 106481360 +RNU6-566P 106481903 +RNU6-567P 106479818 +RNU6-570P 106481361 +RNU6-571P 106479819 +RNU6-572P 106481362 +RNU6-573P 106480591 +RNU6-574P 106479820 +RNU6-575P 106481363 +RNU6-576P 106479821 +RNU6-577P 106479822 +RNU6-578P 106481904 +RNU6-579P 106481364 +RNU6-580P 106480395 +RNU6-581P 106479823 +RNU6-582P 106481365 +RNU6-583P 106479824 +RNU6-584P 106479825 +RNU6-586P 106480592 +RNU6-587P 106481366 +RNU6-588P 106479826 +RNU6-589P 106481367 +RNU6-590P 106480593 +RNU6-591P 106479827 +RNU6-592P 106481368 +RNU6-593P 106479828 +RNU6-595P 106479829 +RNU6-596P 106481369 +RNU6-597P 106481905 +RNU6-598P 106479830 +RNU6-599P 106481370 +RNU6-600P 106479831 +RNU6-601P 106479832 +RNU6-602P 106481371 +RNU6-603P 106480594 +RNU6-604P 106479833 +RNU6-605P 106481372 +RNU6-606P 106479834 +RNU6-607P 106481772 +RNU6-608P 106481373 +RNU6-609P 106481906 +RNU6-610P 106479835 +RNU6-611P 106479836 +RNU6-612P 106481374 +RNU6-613P 106479837 +RNU6-614P 106481375 +RNU6-615P 106480595 +RNU6-616P 106479838 +RNU6-617P 106479839 +RNU6-618P 106481376 +RNU6-619P 106479840 +RNU6-620P 106481377 +RNU6-621P 106481907 +RNU6-622P 106479841 +RNU6-623P 106481378 +RNU6-624P 106479842 +RNU6-625P 106479843 +RNU6-626P 106481379 +RNU6-627P 106480596 +RNU6-628P 106480396 +RNU6-629P 106479844 +RNU6-630P 106481380 +RNU6-631P 106479845 +RNU6-632P 106479846 +RNU6-633P 106481381 +RNU6-634P 106479847 +RNU6-635P 106481382 +RNU6-636P 106480597 +RNU6-637P 106479848 +RNU6-638P 106481383 +RNU6-639P 106479849 +RNU6-640P 106479850 +RNU6-641P 106481908 +RNU6-642P 106481384 +RNU6-643P 106479851 +RNU6-644P 106481385 +RNU6-645P 106479852 +RNU6-646P 106481386 +RNU6-647P 106480598 +RNU6-648P 106479853 +RNU6-649P 106479854 +RNU6-650P 106481387 +RNU6-651P 106479855 +RNU6-652P 106481388 +RNU6-653P 106480397 +RNU6-654P 106481909 +RNU6-655P 106479856 +RNU6-656P 106479857 +RNU6-657P 106481389 +RNU6-658P 106479858 +RNU6-659P 106481390 +RNU6-660P 106480599 +RNU6-661P 106479859 +RNU6-662P 106479860 +RNU6-663P 106481391 +RNU6-664P 106479861 +RNU6-665P 106481392 +RNU6-666P 106480600 +RNU6-667P 106479862 +RNU6-668P 106481393 +RNU6-669P 107063537 +RNU6-670P 106479863 +RNU6-672P 106481910 +RNU6-673P 106481394 +RNU6-674P 106481773 +RNU6-675P 106479864 +RNU6-677P 106481395 +RNU6-678P 106479865 +RNU6-679P 106479866 +RNU6-680P 106480601 +RNU6-681P 106481911 +RNU6-682P 106479867 +RNU6-684P 106481396 +RNU6-685P 106479868 +RNU6-686P 106481397 +RNU6-687P 106479869 +RNU6-689P 106479870 +RNU6-690P 106481398 +RNU6-692P 106479871 +RNU6-693P 106481399 +RNU6-694P 106479872 +RNU6-695P 106481400 +RNU6-696P 106479873 +RNU6-697P 106479874 +RNU6-698P 106481401 +RNU6-699P 106479875 +RNU6-700P 106480398 +RNU6-701P 106481402 +RNU6-702P 106481912 +RNU6-703P 106479876 +RNU6-704P 106479877 +RNU6-705P 106481403 +RNU6-706P 106479878 +RNU6-707P 107075318 +RNU6-708P 106480602 +RNU6-709P 106479879 +RNU6-710P 106479880 +RNU6-711P 106479881 +RNU6-712P 106481404 +RNU6-713P 106479882 +RNU6-714P 106480603 +RNU6-715P 106481405 +RNU6-716P 106479883 +RNU6-717P 106479884 +RNU6-718P 106481406 +RNU6-719P 106481913 +RNU6-720P 106479885 +RNU6-721P 106481774 +RNU6-722P 106481407 +RNU6-723P 106479886 +RNU6-724P 106479887 +RNU6-725P 106481408 +RNU6-726P 106480604 +RNU6-727P 106481409 +RNU6-728P 106479888 +RNU6-729P 106481410 +RNU6-730P 106479889 +RNU6-731P 106481411 +RNU6-732P 106479890 +RNU6-733P 106479891 +RNU6-735P 106481412 +RNU6-737P 106481914 +RNU6-738P 106479892 +RNU6-739P 106481413 +RNU6-740P 106479893 +RNU6-741P 106479894 +RNU6-742P 106481414 +RNU6-743P 106480605 +RNU6-744P 106479895 +RNU6-745P 106481415 +RNU6-746P 106479896 +RNU6-747P 106480399 +RNU6-748P 106481416 +RNU6-749P 106480606 +RNU6-750P 106479897 +RNU6-751P 106479898 +RNU6-752P 106481417 +RNU6-753P 106479899 +RNU6-754P 106481418 +RNU6-755P 106481915 +RNU6-756P 106479900 +RNU6-757P 106479901 +RNU6-758P 106481419 +RNU6-759P 106479902 +RNU6-760P 106481420 +RNU6-761P 106480607 +RNU6-762P 106479903 +RNU6-763P 106481421 +RNU6-764P 106479904 +RNU6-765P 106479905 +RNU6-766P 106481422 +RNU6-767P 106481916 +RNU6-768P 106481775 +RNU6-769P 106479906 +RNU6-770P 106481423 +RNU6-771P 106479907 +RNU6-772P 106479908 +RNU6-774P 106481425 +RNU6-775P 106479909 +RNU6-776P 106480608 +RNU6-777P 106481426 +RNU6-778P 106479910 +RNU6-780P 106481427 +RNU6-781P 106479911 +RNU6-782P 106481917 +RNU6-783P 106479912 +RNU6-784P 106481428 +RNU6-785P 106479913 +RNU6-786P 106481429 +RNU6-787P 106479914 +RNU6-788P 106480609 +RNU6-789P 106479915 +RNU6-790P 106481430 +RNU6-791P 106479916 +RNU6-792P 106481431 +RNU6-793P 106479917 +RNU6-794P 106480400 +RNU6-795P 106480610 +RNU6-796P 106481432 +RNU6-797P 106479918 +RNU6-798P 106479919 +RNU6-799P 107105254 +RNU6-800P 106481433 +RNU6-801P 106479920 +RNU6-803P 106481434 +RNU6-804P 106479921 +RNU6-805P 106479922 +RNU6-806P 106481435 +RNU6-807P 106479923 +RNU6-808P 106481436 +RNU6-809P 106479924 +RNU6-810P 106481437 +RNU6-811P 106479925 +RNU6-812P 106479926 +RNU6-813P 106481438 +RNU6-815P 106480611 +RNU6-816P 106480401 +RNU6-817P 106479927 +RNU6-818P 106481439 +RNU6-819P 106479928 +RNU6-820P 106479929 +RNU6-821P 106481440 +RNU6-822P 106479930 +RNU6-823P 106481441 +RNU6-824P 106480612 +RNU6-826P 106479931 +RNU6-827P 106481442 +RNU6-828P 106479932 +RNU6-829P 106479933 +RNU6-830P 106480613 +RNU6-831P 106481443 +RNU6-832P 106479934 +RNU6-833P 106481444 +RNU6-834P 106479935 +RNU6-835P 106481445 +RNU6-836P 106481918 +RNU6-837P 106479936 +RNU6-838P 106479937 +RNU6-839P 106481446 +RNU6-840P 106479938 +RNU6-841P 106480699 +RNU6-842P 106481447 +RNU6-843P 106480614 +RNU6-844P 106479939 +RNU6-845P 106479940 +RNU6-847P 106481448 +RNU6-848P 106479941 +RNU6-849P 106481449 +RNU6-850P 106481919 +RNU6-851P 106479942 +RNU6-853P 106479943 +RNU6-854P 106481450 +RNU6-855P 106479944 +RNU6-856P 106481451 +RNU6-857P 106480615 +RNU6-858P 106479945 +RNU6-859P 106481452 +RNU6-860P 106479946 +RNU6-861P 106479947 +RNU6-862P 106481920 +RNU6-863P 106481453 +RNU6-864P 106481776 +RNU6-865P 106479948 +RNU6-866P 106481454 +RNU6-867P 106479949 +RNU6-869P 106480616 +RNU6-871P 106479950 +RNU6-873P 106479951 +RNU6-874P 106479952 +RNU6-875P 106479953 +RNU6-876P 106481455 +RNU6-877P 106480617 +RNU6-878P 106479954 +RNU6-879P 106481456 +RNU6-880P 106479955 +RNU6-881P 106479956 +RNU6-882P 106481457 +RNU6-883P 106481921 +RNU6-884P 106479957 +RNU6-885P 106481458 +RNU6-886P 106479958 +RNU6-887P 106481459 +RNU6-888P 106479959 +RNU6-889P 106480402 +RNU6-890P 106480618 +RNU6-891P 106479960 +RNU6-892P 106481460 +RNU6-893P 106479961 +RNU6-894P 106481461 +RNU6-895P 106479962 +RNU6-896P 106481922 +RNU6-897P 106479963 +RNU6-898P 106481462 +RNU6-899P 106479964 +RNU6-900P 106481463 +RNU6-901P 106479965 +RNU6-902P 106480619 +RNU6-903P 106481464 +RNU6-904P 106479966 +RNU6-905P 106479967 +RNU6-906P 106481465 +RNU6-907P 106480620 +RNU6-908P 106479968 +RNU6-909P 106481466 +RNU6-910P 106481777 +RNU6-911P 106479969 +RNU6-912P 106479970 +RNU6-913P 106481467 +RNU6-914P 107063540 +RNU6-915P 106481923 +RNU6-916P 106481468 +RNU6-917P 106479971 +RNU6-918P 106481469 +RNU6-919P 106479972 +RNU6-920P 106481470 +RNU6-921P 106479973 +RNU6-922P 106479974 +RNU6-923P 106481471 +RNU6-924P 106480621 +RNU6-925P 106479975 +RNU6-926P 106481472 +RNU6-927P 106479976 +RNU6-928P 106479977 +RNU6-929P 106481473 +RNU6-930P 106480622 +RNU6-931P 106479978 +RNU6-932P 106481474 +RNU6-933P 106479979 +RNU6-934P 106481475 +RNU6-935P 106480403 +RNU6-936P 106481924 +RNU6-937P 106479980 +RNU6-938P 106479981 +RNU6-939P 106481476 +RNU6-940P 106479982 +RNU6-941P 107063612 +RNU6-942P 106481477 +RNU6-943P 106480623 +RNU6-944P 106479983 +RNU6-945P 106479984 +RNU6-946P 106481478 +RNU6-947P 106479985 +RNU6-948P 106481479 +RNU6-949P 106481925 +RNU6-950P 106479986 +RNU6-951P 106481480 +RNU6-952P 106479987 +RNU6-953P 106479988 +RNU6-954P 106481481 +RNU6-955P 106480624 +RNU6-956P 106480404 +RNU6-957P 106479989 +RNU6-958P 106481482 +RNU6-959P 106479990 +RNU6-960P 106479991 +RNU6-961P 106481483 +RNU6-964P 106479992 +RNU6-965P 106481484 +RNU6-966P 106480625 +RNU6-967P 106479993 +RNU6-968P 106481485 +RNU6-969P 106479994 +RNU6-970P 106481486 +RNU6-971P 106481926 +RNU6-972P 106479995 +RNU6-973P 106479996 +RNU6-974P 106481487 +RNU6-975P 106479997 +RNU6-976P 106481488 +RNU6-977P 106480626 +RNU6-978P 106479998 +RNU6-979P 106479999 +RNU6-980P 106481489 +RNU6-982P 106481979 +RNU6-983P 106481490 +RNU6-984P 106481927 +RNU6-985P 106480001 +RNU6-986P 106481491 +RNU6-987P 106480002 +RNU6-988P 106480003 +RNU6-989P 106481492 +RNU6-990P 106480627 +RNU6-991P 106480004 +RNU6-992P 106481493 +RNU6-993P 106480005 +RNU6-994P 106480006 +RNU6-995P 106481494 +RNU6-996P 106481928 +RNU6-997P 106480007 +RNU6-998P 106481495 +RNU6-999P 106480008 +RNU6-1000P 106481496 +RNU6-1001P 106480628 +RNU6-1003P 106481778 +RNU6-1004P 106480009 +RNU6-1005P 106481497 +RNU6-1006P 106480010 +RNU6-1007P 106480629 +RNU6-1008P 106481498 +RNU6-1009P 106481499 +RNU6-1010P 106481929 +RNU6-1011P 106480011 +RNU6-1012P 106481500 +RNU6-1013P 106480012 +RNU6-1014P 106480013 +RNU6-1015P 106481501 +RNU6-1016P 106480630 +RNU6-1017P 106480014 +RNU6-1018P 106481502 +RNU6-1019P 106480015 +RNU6-1020P 106481503 +RNU6-1021P 106481930 +RNU6-1022P 106480016 +RNU6-1023P 106480017 +RNU6-1024P 106481504 +RNU6-1025P 106480018 +RNU6-1026P 106480631 +RNU6-1027P 106481505 +RNU6-1028P 106480405 +RNU6-1029P 106480019 +RNU6-1031P 106480020 +RNU6-1032P 106481506 +RNU6-1034P 106480632 +RNU6-1035P 106481507 +RNU6-1036P 106480021 +RNU6-1037P 106481508 +RNU6-1038P 106480022 +RNU6-1039P 106481931 +RNU6-1040P 106480023 +RNU6-1041P 106481509 +RNU6-1042P 106480024 +RNU6-1043P 106481510 +RNU6-1044P 106480633 +RNU6-1045P 106480025 +RNU6-1046P 106480026 +RNU6-1047P 106481511 +RNU6-1048P 106480027 +RNU6-1049P 106481779 +RNU6-1050P 106481512 +RNU6-1051P 106481932 +RNU6-1052P 106480028 +RNU6-1053P 106481513 +RNU6-1054P 106480029 +RNU6-1055P 107105256 +RNU6-1056P 106481514 +RNU6-1057P 106480030 +RNU6-1059P 106480031 +RNU6-1060P 106480032 +RNU6-1061P 106480033 +RNU6-1062P 106480634 +RNU6-1064P 106481515 +RNU6-1065P 106480034 +RNU6-1066P 106480035 +RNU6-1067P 106481516 +RNU6-1068P 106481933 +RNU6-1069P 106480036 +RNU6-1071P 106481517 +RNU6-1072P 106480037 +RNU6-1073P 106481518 +RNU6-1074P 106480635 +RNU6-1075P 106480406 +RNU6-1076P 106480038 +RNU6-1077P 106480039 +RNU6-1078P 106481519 +RNU6-1079P 106480040 +RNU6-1080P 106481520 +RNU6-1081P 106480636 +RNU6-1082P 106480041 +RNU6-1083P 106481521 +RNU6-1084P 106480042 +RNU6-1085P 106480043 +RNU6-1086P 106481934 +RNU6-1087P 106481522 +RNU6-1088P 106480044 +RNU6-1089P 106481523 +RNU6-1090P 106480045 +RNU6-1091P 106480637 +RNU6-1092P 106480046 +RNU6-1093P 106481524 +RNU6-1094P 106480047 +RNU6-1095P 106481525 +RNU6-1096P 106480700 +RNU6-1097P 106480048 +RNU6-1098P 106481935 +RNU6-1099P 106481526 +RNU6-1100P 106480049 +RNU6-1101P 106480050 +RNU6-1102P 106481527 +RNU6-1103P 106480051 +RNU6-1104P 106481528 +RNU6-1105P 106480052 +RNU6-1106P 106480053 +RNU6-1107P 106481529 +RNU6-1108P 107105259 +RNU6-1109P 106480054 +RNU6-1110P 106480638 +RNU6-1111P 106481530 +RNU6-1112P 106480055 +RNU6-1113P 106480056 +RNU6-1114P 106481531 +RNU6-1115P 106480639 +RNU6-1116P 106480057 +RNU6-1117P 106481532 +RNU6-1118P 106480058 +RNU6-1119P 106481533 +RNU6-1120P 106480059 +RNU6-1121P 106481780 +RNU6-1122P 106481936 +RNU6-1123P 106480060 +RNU6-1124P 106481534 +RNU6-1125P 106480061 +RNU6-1126P 106481535 +RNU6-1127P 106480640 +RNU6-1128P 106480062 +RNU6-1129P 106481536 +RNU6-1130P 106480063 +RNU6-1131P 106480064 +RNU6-1132P 106481937 +RNU6-1133P 106481537 +RNU6-1134P 106480065 +RNU6-1135P 106481538 +RNU6-1136P 106480066 +RNU6-1137P 106480067 +RNU6-1138P 106480641 +RNU6-1139P 106481539 +RNU6-1140P 106480068 +RNU6-1141P 106481540 +RNU6-1143P 106480069 +RNU6-1144P 106481938 +RNU6-1145P 106481541 +RNU6-1146P 106480070 +RNU6-1147P 106480071 +RNU6-1148P 106480642 +RNU6-1149P 106481542 +RNU6-1150P 106480072 +RNU6-1151P 106481543 +RNU6-1152P 106480073 +RNU6-1153P 106480643 +RNU6-1154P 106480074 +RNU6-1155P 106481544 +RNU6-1156P 106480075 +RNU6-1157P 106481545 +RNU6-1158P 106480076 +RNU6-1159P 106481939 +RNU6-1160P 106481546 +RNU6-1161P 106480077 +RNU6-1162P 106480078 +RNU6-1163P 106481547 +RNU6-1164P 106480644 +RNU6-1165P 106480079 +RNU6-1167P 106480407 +RNU6-1168P 106481548 +RNU6-1169P 106480080 +RNU6-1170P 106480081 +RNU6-1171P 106481940 +RNU6-1172P 106481549 +RNU6-1174P 106481550 +RNU6-1175P 106480082 +RNU6-1176P 106481551 +RNU6-1177P 106480645 +RNU6-1178P 106480083 +RNU6-1179P 106480084 +RNU6-1180P 106481552 +RNU6-1181P 106480085 +RNU6-1183P 106481941 +RNU6-1184P 106481553 +RNU6-1186P 106480086 +RNU6-1187P 106481554 +RNU6-1188P 106480408 +RNU6-1189P 106480646 +RNU6-1190P 106480087 +RNU6-1191P 106481555 +RNU6-1192P 106480088 +RNU6-1193P 106481556 +RNU6-1194P 106481557 +RNU6-1195P 106480647 +RNU6-1196P 106480089 +RNU6-1197P 106481558 +RNU6-1198P 106480090 +RNU6-1199P 106480091 +RNU6-1200P 106481559 +RNU6-1201P 106481942 +RNU6-1203P 106480092 +RNU6-1204P 106481560 +RNU6-1205P 106480093 +RNU6-1206P 106481561 +RNU6-1207P 106480648 +RNU6-1208P 106480094 +RNU6-1209P 106480095 +RNU6-1210P 106481562 +RNU6-1211P 106480096 +RNU6-1212P 106481943 +RNU6-1213P 106481563 +RNU6-1214P 106481781 +RNU6-1215P 106480097 +RNU6-1216P 106480098 +RNU6-1217P 106481564 +RNU6-1218P 106480099 +RNU6-1219P 106480649 +RNU6-1220P 106481565 +RNU6-1222P 106480100 +RNU6-1223P 106481566 +RNU6-1224P 106480101 +RNU6-1225P 106480650 +RNU6-1226P 106480102 +RNU6-1227P 106481567 +RNU6-1228P 106480103 +RNU6-1229P 106481568 +RNU6-1230P 106481944 +RNU6-1231P 106480104 +RNU6-1232P 106480105 +RNU6-1233P 106481569 +RNU6-1234P 106480106 +RNU6-1235P 106480701 +RNU6-1236P 106481570 +RNU6-1237P 106480651 +RNU6-1238P 106480107 +RNU6-1239P 106481571 +RNU6-1240P 106866914 +RNU6-1241P 106481572 +RNU6-1242P 106480108 +RNU6-1243P 106481573 +RNU6-1244P 106481945 +RNU6-1245P 106480109 +RNU6-1246P 106480110 +RNU6-1247P 106481574 +RNU6-1248P 106480111 +RNU6-1249P 106480652 +RNU6-1250P 106481575 +RNU6-1251P 106480112 +RNU6-1252P 106480113 +RNU6-1254P 106481576 +RNU6-1255P 106481946 +RNU6-1256P 106480114 +RNU6-1257P 106481577 +RNU6-1258P 106480115 +RNU6-1260P 106481578 +RNU6-1261P 106480116 +RNU6-1262P 106480409 +RNU6-1263P 106480653 +RNU6-1264P 106480117 +RNU6-1265P 106481579 +RNU6-1266P 106480118 +RNU6-1267P 106481580 +RNU6-1268P 106480654 +RNU6-1269P 106480119 +RNU6-1270P 106481581 +RNU6-1271P 106480120 +RNU6-1272P 106480121 +RNU6-1273P 106481947 +RNU6-1274P 106481582 +RNU6-1275P 106480122 +RNU6-1276P 106481583 +RNU6-1277P 106480123 +RNU6-1278P 106480124 +RNU6-1279P 106480655 +RNU6-1280P 106481584 +RNU6-1281P 106480125 +RNU6-1282P 106481585 +RNU6-1283P 106481782 +RNU6-1284P 106480126 +RNU6-1285P 106481948 +RNU6-1286P 106481586 +RNU6-1287P 106480127 +RNU6-1288P 106480128 +RNU6-1289P 106481587 +RNU6-1290P 106480129 +RNU6-1291P 106481588 +RNU6-1292P 106480656 +RNU6-1293P 106480130 +RNU6-1294P 106480131 +RNU6-1296P 106480132 +RNU6-1297P 106480657 +RNU6-1298P 106481590 +RNU6-1299P 106480133 +RNU6-1300P 106480134 +RNU6-1301P 106481591 +RNU6-1303P 106481949 +RNU6-1304P 106480135 +RNU6-1305P 106481592 +RNU6-1306P 106480136 +RNU6-1307P 106481593 +RNU6-1308P 106480137 +RNU6-1309P 106480410 +RNU6-1310P 106480658 +RNU6-1311P 106480138 +RNU6-1312P 106481594 +RNU6-1313P 106480139 +RNU6-1314P 106481595 +RNU6-1315P 106481950 +RNU6-1316P 106480140 +RNU6-1317P 106481596 +RNU6-1318P 106480141 +RNU6-1319P 106480142 +RNU6-1320P 106480659 +RNU6-1321P 106481597 +RNU6-1322P 106480143 +RNU6-1323P 106481598 +RNU6-1324P 106480144 +RNU6-1325P 106480145 +RNU6-1326P 106481951 +RNU6-1327P 106481599 +RNU6-1328P 106480146 +RNU6-1329P 106481600 +RNU6-1330P 106480411 +RNU6-1331P 106480147 +RNU6-1332P 106480660 +RNU6-1333P 106481601 +RNU6-1334P 106480148 +RNU6-1335P 106480149 +RNU6-1336P 106480661 +RNU6-1337P 106481602 +RNU6-1338P 106480150 +RNU6-1339P 106481603 +RNU6-1340P 106480151 +RNU6ATAC 100151684 +RNU6ATAC2P 100151685 +RNU6ATAC3P 100151686 +RNU6ATAC4P 100151687 +RNU6ATAC5P 100151688 +RNU6ATAC6P 106479545 +RNU6ATAC7P 106479546 +RNU6ATAC8P 106481161 +RNU6ATAC9P 106479547 +RNU6ATAC10P 106480540 +RNU6ATAC11P 106481162 +RNU6ATAC12P 106479548 +RNU6ATAC13P 106479549 +RNU6ATAC14P 106481163 +RNU6ATAC15P 106481867 +RNU6ATAC16P 106479550 +RNU6ATAC17P 106481164 +RNU6ATAC18P 106479551 +RNU6ATAC19P 106481165 +RNU6ATAC20P 106480541 +RNU6ATAC21P 106479552 +RNU6ATAC22P 106479553 +RNU6ATAC23P 106481166 +RNU6ATAC24P 106479554 +RNU6ATAC25P 106480384 +RNU6ATAC26P 106480542 +RNU6ATAC27P 106481167 +RNU6ATAC28P 106479555 +RNU6ATAC29P 106481168 +RNU6ATAC30P 106481868 +RNU6ATAC31P 106481169 +RNU6ATAC32P 106479556 +RNU6ATAC33P 106481170 +RNU6ATAC34P 106479557 +RNU6ATAC35P 106481171 +RNU6ATAC36P 106480543 +RNU6ATAC37P 106479558 +RNU6ATAC38P 106479559 +RNU6ATAC39P 106481172 +RNU6ATAC40P 106479560 +RNU6ATAC41P 106481869 +RNU6ATAC42P 106481173 +RNU6V 6071 +RNU7-1 100147744 +RNU7-2P 100147745 +RNU7-3P 100147746 +RNU7-4P 100147747 +RNU7-5P 100147748 +RNU7-6P 100147749 +RNU7-7P 100147755 +RNU7-8P 100147756 +RNU7-9P 100147757 +RNU7-10P 100147758 +RNU7-11P 100147759 +RNU7-12P 100147760 +RNU7-13P 100147761 +RNU7-14P 100147762 +RNU7-15P 100147763 +RNU7-16P 100147764 +RNU7-17P 100147765 +RNU7-18P 100147766 +RNU7-19P 100147767 +RNU7-20P 100147768 +RNU7-21P 100147769 +RNU7-22P 100147770 +RNU7-23P 100147771 +RNU7-24P 6074 +RNU7-25P 100147812 +RNU7-26P 100147813 +RNU7-27P 100147814 +RNU7-28P 100147815 +RNU7-29P 100147816 +RNU7-30P 100147817 +RNU7-31P 100147818 +RNU7-32P 100147819 +RNU7-33P 100147820 +RNU7-34P 100147821 +RNU7-35P 100147822 +RNU7-36P 100147823 +RNU7-37P 100147824 +RNU7-38P 100147825 +RNU7-39P 100147826 +RNU7-40P 100147827 +RNU7-41P 100147828 +RNU7-42P 100147829 +RNU7-43P 100147830 +RNU7-44P 100147831 +RNU7-45P 100147832 +RNU7-46P 100147833 +RNU7-47P 100147834 +RNU7-48P 100147835 +RNU7-49P 100147836 +RNU7-50P 100147837 +RNU7-51P 100151647 +RNU7-52P 100151648 +RNU7-53P 100151649 +RNU7-54P 100151650 +RNU7-55P 6075 +RNU7-56P 100151651 +RNU7-57P 100151652 +RNU7-58P 100151653 +RNU7-59P 100151654 +RNU7-60P 100151655 +RNU7-61P 100151656 +RNU7-62P 100151657 +RNU7-63P 100151658 +RNU7-64P 100151662 +RNU7-65P 100151663 +RNU7-66P 100151664 +RNU7-67P 100151665 +RNU7-68P 6072 +RNU7-69P 100151666 +RNU7-70P 100151667 +RNU7-71P 100151668 +RNU7-72P 100151669 +RNU7-73P 100151670 +RNU7-74P 100151671 +RNU7-75P 100151672 +RNU7-76P 100151673 +RNU7-77P 100151674 +RNU7-78P 100151675 +RNU7-79P 100151676 +RNU7-80P 100151677 +RNU7-81P 100151678 +RNU7-82P 100151679 +RNU7-83P 100151680 +RNU7-84P 100151681 +RNU7-85P 100151682 +RNU7-86P 6073 +RNU7-87P 100873842 +RNU7-88P 100873843 +RNU7-89P 100873844 +RNU7-90P 106479060 +RNU7-92P 106479061 +RNU7-93P 106480813 +RNU7-94P 106481799 +RNU7-95P 106479062 +RNU7-96P 106480361 +RNU7-97P 106479063 +RNU7-99P 106480814 +RNU7-102P 106479064 +RNU7-103P 107063544 +RNU7-104P 106480448 +RNU7-105P 106479065 +RNU7-106P 106479066 +RNU7-107P 106479067 +RNU7-110P 106480815 +RNU7-111P 106481800 +RNU7-113P 106479068 +RNU7-115P 106479069 +RNU7-116P 106480816 +RNU7-119P 106479070 +RNU7-120P 106480817 +RNU7-121P 106480449 +RNU7-123P 106479071 +RNU7-124P 106479072 +RNU7-125P 106480818 +RNU7-126P 106479073 +RNU7-127P 106480362 +RNU7-128P 106480819 +RNU7-129P 106480450 +RNU7-130P 106479074 +RNU7-133P 106479075 +RNU7-134P 106480820 +RNU7-136P 106479076 +RNU7-137P 106480821 +RNU7-138P 106481801 +RNU7-140P 106479077 +RNU7-141P 106480822 +RNU7-143P 106479078 +RNU7-144P 106479079 +RNU7-147P 106480451 +RNU7-148P 106480823 +RNU7-149P 106479080 +RNU7-151P 106480824 +RNU7-152P 106479081 +RNU7-153P 106479082 +RNU7-154P 106481802 +RNU7-155P 106480825 +RNU7-156P 106479083 +RNU7-157P 106480826 +RNU7-159P 106481747 +RNU7-160P 106479085 +RNU7-161P 106480452 +RNU7-164P 106479086 +RNU7-165P 106479087 +RNU7-167P 106479088 +RNU7-169P 106480827 +RNU7-170P 106480453 +RNU7-171P 106479089 +RNU7-172P 106480828 +RNU7-173P 106479090 +RNU7-174P 106480829 +RNU7-175P 106479091 +RNU7-176P 106481803 +RNU7-179P 106479092 +RNU7-180P 106480830 +RNU7-181P 106479093 +RNU7-182P 106480831 +RNU7-183P 106480454 +RNU7-185P 106479094 +RNU7-186P 106480363 +RNU7-187P 106479095 +RNU7-188P 106480832 +RNU7-190P 106479096 +RNU7-192P 106480833 +RNU7-193P 106481804 +RNU7-194P 106480834 +RNU7-195P 106479097 +RNU7-196P 106479098 +RNU7-197P 106480455 +RNU7-200P 106480835 +RNU11 26824 +RNU11-2P 106479561 +RNU11-3P 106479562 +RNU11-4P 106481174 +RNU11-5P 106479563 +RNU11-6P 106480544 +RNU12 267010 +RNU12-2P 26823 +RNU105B 26767 +RNU105C 26766 +RNVU1-1 101954273 +RNVU1-2 26860 +RNVU1-2A 6063 +RNVU1-3 101954272 +RNVU1-4 101954264 +RNVU1-6 101954276 +RNVU1-7 26864 +RNVU1-8 101447996 +RNVU1-14 101954266 +RNVU1-15 101954267 +RNVU1-17 101954269 +RNVU1-18 26863 +RNVU1-19 101954277 +RNVU1-20 101954268 +RNVU1-21 106480190 +RNVU1-22 106481627 +RNVU1-23 106481620 +RNVU1-24 106480167 +RNVU1-25 115409981 +RNVU1-26 115409982 +RNVU1-27 115409988 +RNVU1-28 115409983 +RNVU1-29 115409989 +RNVU1-30 115409984 +RNVU1-31 115482718 +RNVU1-32 106481624 +RNVU1-33 106480178 +RNVU1-34 106480177 +RNY1 6084 +RNY1P1 100873802 +RNY1P2 100862666 +RNY1P3 100873803 +RNY1P4 100873804 +RNY1P5 100862667 +RNY1P6 100873805 +RNY1P7 100873806 +RNY1P8 100873807 +RNY1P9 100874358 +RNY1P10 106480308 +RNY1P11 106481710 +RNY1P12 106480309 +RNY1P13 106480310 +RNY1P14 106480311 +RNY1P15 106481711 +RNY1P16 106480312 +RNY3 6085 +RNY3P1 106478984 +RNY3P2 100862668 +RNY3P3 100862669 +RNY3P4 100873808 +RNY3P5 100873809 +RNY3P6 100873810 +RNY3P7 100862670 +RNY3P8 106478985 +RNY3P9 100862672 +RNY3P10 100873820 +RNY3P11 106481713 +RNY3P12 106480315 +RNY3P13 106481714 +RNY3P14 106480316 +RNY3P15 107178919 +RNY3P16 106480686 +RNY4 6086 +RNY4P1 6087 +RNY4P2 6088 +RNY4P3 6089 +RNY4P4 100379297 +RNY4P5 100379299 +RNY4P6 100379287 +RNY4P7 100169850 +RNY4P8 100379295 +RNY4P9 100379300 +RNY4P10 100379592 +RNY4P11 100379288 +RNY4P13 100379296 +RNY4P14 100379584 +RNY4P15 100379291 +RNY4P16 100431173 +RNY4P17 100379564 +RNY4P18 100379298 +RNY4P19 100169834 +RNY4P20 100379378 +RNY4P21 100862663 +RNY4P22 100873800 +RNY4P23 100873801 +RNY4P24 100862664 +RNY4P25 100862665 +RNY4P26 100873819 +RNY4P27 100873821 +RNY4P28 100873822 +RNY4P29 100873823 +RNY4P30 100862673 +RNY4P31 100862674 +RNY4P34 106481712 +RNY4P36 106480313 +RNY4P37 106480314 +RNY5 6090 +RNY5P1 100379666 +RNY5P2 100381208 +RNY5P3 100379664 +RNY5P4 100380271 +RNY5P5 100379658 +RNY5P6 100379663 +RNY5P7 100169835 +RNY5P8 100380878 +RNY5P9 100169836 +RNY5P10 100169837 +RO60 6738 +ROBO1 6091 +ROBO2 6092 +ROBO2P1 106480790 +ROBO3 64221 +ROBO4 54538 +ROCK1 6093 +ROCK1P1 727758 +ROCK2 9475 +ROCR 102723505 +ROGDI 79641 +ROM1 6094 +ROMO1 140823 +ROPN1 54763 +ROPN1B 152015 +ROPN1L 83853 +ROPN1L-AS1 100505845 +ROR1 4919 +ROR1-AS1 101927034 +ROR2 4920 +RORA 6095 +RORA-AS1 101928784 +RORA-AS2 100996876 +RORB 6096 +RORB-AS1 103752585 +RORC 6097 +ROS1 6098 +RP1 6101 +RP1L1 94137 +RP2 6102 +RP9 6100 +RP9P 441212 +RPA1 6117 +RPA2 6118 +RPA2P1 326628 +RPA2P2 389990 +RPA2P3 100420359 +RPA3 6119 +RPA3P1 442058 +RPA3P2 100130403 +RPA4 29935 +RPAIN 84268 +RPAP1 26015 +RPAP2 79871 +RPAP2P1 100272220 +RPAP3 79657 +RPAP3-DT 105369748 +RPE 6120 +RPE65 6121 +RPEL1 729020 +RPEP1 100420512 +RPEP2 645065 +RPEP3 100420555 +RPEP4 100420665 +RPEP5 106481798 +RPEP6 100420590 +RPF1 80135 +RPF2 84154 +RPF2P1 729608 +RPF2P2 100128462 +RPGR 6103 +RPGRIP1 57096 +RPGRIP1L 23322 +RPH3A 22895 +RPH3AL 9501 +RPH3AL-AS1 100506388 +RPH3AL-AS2 123706508 +RPIA 22934 +RPIAP1 619449 +RPL3 6122 +RPL3L 6123 +RPL3P1 8488 +RPL3P2 116935 +RPL3P3 645798 +RPL3P4 326307 +RPL3P5 100130450 +RPL3P6 643220 +RPL3P7 642741 +RPL3P8 646620 +RPL3P9 100128963 +RPL3P10 100129004 +RPL3P11 100131893 +RPL3P12 100131358 +RPL3P13 106480199 +RPL4 6124 +RPL4P1 650808 +RPL4P2 646688 +RPL4P3 391135 +RPL4P4 647276 +RPL4P5 158345 +RPL4P6 100271033 +RPL4P7 100419110 +RPL5 6125 +RPL5P1 647436 +RPL5P2 140749 +RPL5P3 400385 +RPL5P4 643343 +RPL5P5 730213 +RPL5P6 646784 +RPL5P7 344178 +RPL5P8 100130523 +RPL5P9 100270832 +RPL5P10 645807 +RPL5P11 402193 +RPL5P12 100270833 +RPL5P13 100270834 +RPL5P14 100270835 +RPL5P15 100270836 +RPL5P16 100270837 +RPL5P17 100270839 +RPL5P18 389428 +RPL5P19 100270906 +RPL5P20 100131913 +RPL5P21 100270838 +RPL5P22 389644 +RPL5P23 100270840 +RPL5P24 100270841 +RPL5P25 100271204 +RPL5P26 100271206 +RPL5P27 100129998 +RPL5P28 100131535 +RPL5P29 390158 +RPL5P30 645160 +RPL5P31 341674 +RPL5P32 100271207 +RPL5P33 100130929 +RPL5P34 388907 +RPL5P35 100129647 +RPL6 6128 +RPL6P1 440587 +RPL6P2 343495 +RPL6P3 391181 +RPL6P4 645054 +RPL6P5 100270844 +RPL6P6 100270845 +RPL6P7 100270848 +RPL6P8 100133100 +RPL6P9 100270847 +RPL6P10 642828 +RPL6P11 100132922 +RPL6P12 100270907 +RPL6P13 643974 +RPL6P14 391679 +RPL6P15 100270843 +RPL6P16 728365 +RPL6P17 100131229 +RPL6P18 100131805 +RPL6P19 646483 +RPL6P20 285900 +RPL6P21 100270846 +RPL6P22 388460 +RPL6P23 100130524 +RPL6P24 100271034 +RPL6P25 401725 +RPL6P26 100271035 +RPL6P27 645387 +RPL6P28 100271208 +RPL6P29 392505 +RPL6P30 139452 +RPL6P31 441907 +RPL6P32 100131520 +RPL7 6129 +RPL7A 6130 +RPL7AP2 652978 +RPL7AP3 654370 +RPL7AP4 652985 +RPL7AP5 326309 +RPL7AP6 326310 +RPL7AP7 353013 +RPL7AP8 340749 +RPL7AP9 441642 +RPL7AP10 161406 +RPL7AP11 728992 +RPL7AP12 128668 +RPL7AP13 128748 +RPL7AP14 140756 +RPL7AP15 100270895 +RPL7AP16 100270896 +RPL7AP17 100270897 +RPL7AP18 390993 +RPL7AP19 100271036 +RPL7AP20 100271037 +RPL7AP21 100271038 +RPL7AP22 100271039 +RPL7AP23 100271040 +RPL7AP24 100271041 +RPL7AP25 100271042 +RPL7AP26 728128 +RPL7AP27 152663 +RPL7AP28 100271209 +RPL7AP29 100271043 +RPL7AP30 441034 +RPL7AP31 728315 +RPL7AP32 133748 +RPL7AP33 391850 +RPL7AP34 441154 +RPL7AP35 100271210 +RPL7AP36 728179 +RPL7AP37 645257 +RPL7AP38 442660 +RPL7AP39 646476 +RPL7AP40 442712 +RPL7AP41 100271213 +RPL7AP42 100271215 +RPL7AP43 644236 +RPL7AP44 100271398 +RPL7AP45 100132678 +RPL7AP46 441440 +RPL7AP47 100271211 +RPL7AP48 100271212 +RPL7AP49 100271214 +RPL7AP50 87688 +RPL7AP51 100271533 +RPL7AP52 100271534 +RPL7AP53 401640 +RPL7AP54 390228 +RPL7AP55 100271535 +RPL7AP56 100271536 +RPL7AP57 100271537 +RPL7AP58 645846 +RPL7AP60 100271538 +RPL7AP61 100271539 +RPL7AP62 644029 +RPL7AP63 401865 +RPL7AP64 728486 +RPL7AP65 100271543 +RPL7AP66 388474 +RPL7AP67 100271542 +RPL7AP69 100271545 +RPL7AP70 728139 +RPL7AP71 100271399 +RPL7AP72 100270754 +RPL7AP73 100873817 +RPL7AP74 390306 +RPL7AP75 100132644 +RPL7AP76 643630 +RPL7AP77 122965336 +RPL7AP78 122965331 +RPL7AP79 122965337 +RPL7AP80 122965332 +RPL7AP81 122965333 +RPL7AP82 122965338 +RPL7AP83 127379730 +RPL7L1 285855 +RPL7L1P1 100129260 +RPL7L1P2 100420155 +RPL7L1P3 100131964 +RPL7L1P4 100130968 +RPL7L1P5 390800 +RPL7L1P6 100420201 +RPL7L1P7 646641 +RPL7L1P8 402152 +RPL7L1P9 100128899 +RPL7L1P10 106480729 +RPL7L1P11 347509 +RPL7L1P12 100420200 +RPL7L1P13 100133103 +RPL7L1P14 644721 +RPL7L1P15 390618 +RPL7L1P16 100127965 +RPL7L1P17 100288666 +RPL7L1P18 100131013 +RPL7L1P19 646140 +RPL7L1P20 442161 +RPL7L1P21 100420170 +RPL7L1P22 100420166 +RPL7P1 6174 +RPL7P2 140695 +RPL7P3 140857 +RPL7P4 100133037 +RPL7P5 654381 +RPL7P6 90193 +RPL7P7 644896 +RPL7P8 441896 +RPL7P9 653702 +RPL7P10 646538 +RPL7P11 100270823 +RPL7P12 100131085 +RPL7P13 130728 +RPL7P14 100129743 +RPL7P15 100270850 +RPL7P16 729677 +RPL7P17 100270851 +RPL7P18 100270852 +RPL7P19 100270853 +RPL7P20 728843 +RPL7P21 729123 +RPL7P22 728620 +RPL7P23 648000 +RPL7P24 100127893 +RPL7P25 100129061 +RPL7P26 728380 +RPL7P27 643906 +RPL7P28 442242 +RPL7P29 643971 +RPL7P30 100270908 +RPL7P31 100270909 +RPL7P32 100130892 +RPL7P33 286348 +RPL7P34 389992 +RPL7P35 100271216 +RPL7P36 100271218 +RPL7P37 439954 +RPL7P38 120872 +RPL7P39 100271217 +RPL7P40 100271220 +RPL7P41 100271222 +RPL7P42 100271223 +RPL7P43 100271224 +RPL7P44 390413 +RPL7P45 100271225 +RPL7P46 642451 +RPL7P47 146110 +RPL7P48 388401 +RPL7P49 100271221 +RPL7P50 729449 +RPL7P51 100271226 +RPL7P52 646912 +RPL7P53 100271145 +RPL7P54 100271146 +RPL7P55 100271147 +RPL7P56 728962 +RPL7P57 643507 +RPL7P58 646346 +RPL7P59 643308 +RPL7P60 100289264 +RPL7P61 101929589 +RPL8 6132 +RPL8P1 387046 +RPL8P2 100128766 +RPL8P3 100270854 +RPL8P4 402150 +RPL8P5 100271044 +RPL9 6133 +RPL9P2 729004 +RPL9P3 641616 +RPL9P4 644223 +RPL9P5 100129179 +RPL9P6 326311 +RPL9P7 6126 +RPL9P8 254948 +RPL9P10 100270855 +RPL9P11 642740 +RPL9P12 100270825 +RPL9P13 100270856 +RPL9P14 100132061 +RPL9P15 100270857 +RPL9P16 727835 +RPL9P17 728523 +RPL9P18 389404 +RPL9P19 100129634 +RPL9P20 100130392 +RPL9P21 728374 +RPL9P22 100130066 +RPL9P23 100131020 +RPL9P24 100271045 +RPL9P25 654350 +RPL9P26 100271227 +RPL9P27 100131246 +RPL9P28 729146 +RPL9P29 100129357 +RPL9P30 100128710 +RPL9P31 100271228 +RPL9P32 727865 +RPL9P33 100271229 +RPL10 6134 +RPL10A 4736 +RPL10AP1 319135 +RPL10AP2 253986 +RPL10AP3 137107 +RPL10AP4 343301 +RPL10AP5 645998 +RPL10AP6 100128936 +RPL10AP7 100128646 +RPL10AP8 644154 +RPL10AP9 728979 +RPL10AP10 391836 +RPL10AP11 392206 +RPL10AP12 401863 +RPL10AP13 100271602 +RPL10L 140801 +RPL10P1 100288252 +RPL10P2 442171 +RPL10P3 619445 +RPL10P4 391151 +RPL10P5 644911 +RPL10P6 285176 +RPL10P7 442086 +RPL10P8 644937 +RPL10P9 389342 +RPL10P10 100129930 +RPL10P11 100128030 +RPL10P12 645422 +RPL10P13 390345 +RPL10P14 390729 +RPL10P15 100129975 +RPL10P16 284393 +RPL10P17 390998 +RPL10P18 100630920 +RPL10P19 645960 +RPL11 6135 +RPL11P1 100133170 +RPL11P2 133629 +RPL11P3 100271271 +RPL11P4 100271272 +RPL11P5 643499 +RPL12 6136 +RPL12P1 729727 +RPL12P2 646875 +RPL12P3 128862 +RPL12P4 116149 +RPL12P5 319142 +RPL12P6 440176 +RPL12P7 326275 +RPL12P8 645161 +RPL12P9 654376 +RPL12P10 392872 +RPL12P11 128467 +RPL12P12 85824 +RPL12P13 100129926 +RPL12P14 729500 +RPL12P15 100270920 +RPL12P16 100130447 +RPL12P17 344471 +RPL12P18 729760 +RPL12P19 100129982 +RPL12P20 100270923 +RPL12P21 100270921 +RPL12P22 100270922 +RPL12P23 100270925 +RPL12P24 100270924 +RPL12P25 100270926 +RPL12P26 100271404 +RPL12P27 644202 +RPL12P28 100271273 +RPL12P29 100271274 +RPL12P30 100271405 +RPL12P31 100271406 +RPL12P32 100132795 +RPL12P33 643550 +RPL12P34 100271407 +RPL12P35 400389 +RPL12P36 100271408 +RPL12P37 100129801 +RPL12P38 645688 +RPL12P39 100271410 +RPL12P40 646898 +RPL12P41 100133139 +RPL12P42 100129394 +RPL12P43 100271387 +RPL12P44 100419392 +RPL12P45 100419477 +RPL12P46 107075251 +RPL12P47 107075115 +RPL12P48 101926938 +RPL12P49 107075252 +RPL12P50 107075212 +RPL13 6137 +RPL13A 23521 +RPL13AP 387043 +RPL13AP2 326278 +RPL13AP3 645683 +RPL13AP5 728658 +RPL13AP6 644511 +RPL13AP7 284821 +RPL13AP8 727831 +RPL13AP9 100271137 +RPL13AP10 100132906 +RPL13AP11 100271276 +RPL13AP12 100271277 +RPL13AP13 402214 +RPL13AP14 100271278 +RPL13AP15 100271279 +RPL13AP16 100129553 +RPL13AP17 399670 +RPL13AP18 402342 +RPL13AP19 100132924 +RPL13AP20 387841 +RPL13AP21 100129799 +RPL13AP22 441632 +RPL13AP23 441641 +RPL13AP24 100271603 +RPL13AP25 100287887 +RPL13AP26 729212 +RPL13AP27 127379736 +RPL13P 387044 +RPL13P2 128500 +RPL13P4 654383 +RPL13P5 283345 +RPL13P6 100129176 +RPL13P7 391140 +RPL13P8 100270928 +RPL13P9 100270927 +RPL13P10 100133108 +RPL13P11 100130225 +RPL13P12 388344 +RPL13P13 100129796 +RPL13P14 100130374 +RPL14 9045 +RPL14P1 144581 +RPL14P2 100270930 +RPL14P3 730747 +RPL14P4 100271282 +RPL14P5 442442 +RPL14P6 100288533 +RPL15 6138 +RPL15P1 128756 +RPL15P2 326279 +RPL15P3 653232 +RPL15P4 100129921 +RPL15P5 100127993 +RPL15P6 100270933 +RPL15P7 728576 +RPL15P8 100270934 +RPL15P9 100270935 +RPL15P11 402694 +RPL15P12 100131958 +RPL15P13 100131338 +RPL15P14 100271283 +RPL15P15 100128347 +RPL15P16 100127949 +RPL15P17 728002 +RPL15P18 728088 +RPL15P19 100131797 +RPL15P20 646672 +RPL15P21 100132722 +RPL15P22 100130624 +RPL17 6139 +RPL17-C18orf32 100526842 +RPL17P1 140748 +RPL17P2 652974 +RPL17P3 326286 +RPL17P4 326288 +RPL17P5 388132 +RPL17P6 645441 +RPL17P7 100132742 +RPL17P8 730255 +RPL17P9 729301 +RPL17P10 100270936 +RPL17P11 100270937 +RPL17P12 100270938 +RPL17P13 100270939 +RPL17P14 100270941 +RPL17P15 100128117 +RPL17P16 729349 +RPL17P17 100270943 +RPL17P18 100129657 +RPL17P19 100271150 +RPL17P20 391655 +RPL17P21 100271151 +RPL17P22 727984 +RPL17P23 100271152 +RPL17P24 100271153 +RPL17P25 442232 +RPL17P26 100129784 +RPL17P27 202789 +RPL17P28 100270940 +RPL17P29 100271154 +RPL17P30 100271155 +RPL17P31 100271156 +RPL17P32 100270942 +RPL17P33 646909 +RPL17P34 643863 +RPL17P35 100271284 +RPL17P36 729340 +RPL17P37 100271411 +RPL17P38 100271417 +RPL17P39 645296 +RPL17P40 100271413 +RPL17P41 100132645 +RPL17P42 100271418 +RPL17P43 729259 +RPL17P44 100129584 +RPL17P45 100271414 +RPL17P46 100271419 +RPL17P47 100271415 +RPL17P48 100271416 +RPL17P49 100271388 +RPL17P50 729046 +RPL17P51 106480245 +RPL18 6141 +RPL18A 6142 +RPL18AP1 326289 +RPL18AP2 387494 +RPL18AP3 390354 +RPL18AP4 127545 +RPL18AP5 729955 +RPL18AP6 285053 +RPL18AP7 100133038 +RPL18AP8 644082 +RPL18AP9 731642 +RPL18AP10 100271285 +RPL18AP11 100127999 +RPL18AP12 100271604 +RPL18AP13 646189 +RPL18AP14 100271420 +RPL18AP15 392522 +RPL18AP16 347544 +RPL18AP17 100873859 +RPL18P1 326291 +RPL18P2 100129421 +RPL18P3 100129374 +RPL18P4 392979 +RPL18P5 100270944 +RPL18P6 100131333 +RPL18P7 100270945 +RPL18P8 100129670 +RPL18P9 100129645 +RPL18P10 100271286 +RPL18P11 390612 +RPL18P12 390671 +RPL18P13 441775 +RPL19 6143 +RPL19P1 140759 +RPL19P2 654382 +RPL19P3 100131759 +RPL19P4 646710 +RPL19P5 646532 +RPL19P6 100270946 +RPL19P7 100131527 +RPL19P8 391719 +RPL19P9 653314 +RPL19P10 100270948 +RPL19P11 100270950 +RPL19P12 100129424 +RPL19P13 392193 +RPL19P14 100270951 +RPL19P15 642306 +RPL19P16 646255 +RPL19P17 100271287 +RPL19P18 100271288 +RPL19P19 646820 +RPL19P20 392451 +RPL19P21 392557 +RPL21 6144 +RPL21P1 6145 +RPL21P2 140715 +RPL21P3 128760 +RPL21P4 140660 +RPL21P5 641613 +RPL21P6 652975 +RPL21P7 145370 +RPL21P8 319145 +RPL21P9 283562 +RPL21P10 319143 +RPL21P11 157206 +RPL21P12 122409 +RPL21P13 319144 +RPL21P14 729208 +RPL21P15 654385 +RPL21P16 729402 +RPL21P17 727810 +RPL21P18 729484 +RPL21P19 641293 +RPL21P20 388621 +RPL21P21 100270877 +RPL21P22 100270878 +RPL21P23 100270879 +RPL21P24 100270880 +RPL21P25 100270881 +RPL21P26 100270882 +RPL21P27 100270952 +RPL21P28 100131205 +RPL21P29 440575 +RPL21P30 100271157 +RPL21P31 100271160 +RPL21P32 100271161 +RPL21P33 100270953 +RPL21P34 100270954 +RPL21P35 100270955 +RPL21P36 100270956 +RPL21P37 100129141 +RPL21P38 100131481 +RPL21P39 389156 +RPL21P40 100271158 +RPL21P41 100271159 +RPL21P42 100271162 +RPL21P43 100271163 +RPL21P44 402176 +RPL21P45 727821 +RPL21P46 645174 +RPL21P47 100271164 +RPL21P48 100271165 +RPL21P49 100271166 +RPL21P50 100271167 +RPL21P51 100271169 +RPL21P52 100128351 +RPL21P53 653156 +RPL21P54 100271168 +RPL21P55 100271170 +RPL21P56 100271171 +RPL21P57 100271172 +RPL21P58 100271173 +RPL21P59 100271174 +RPL21P60 100271175 +RPL21P61 645157 +RPL21P62 442160 +RPL21P63 100271176 +RPL21P64 100271177 +RPL21P65 100271178 +RPL21P66 100271179 +RPL21P67 100271180 +RPL21P68 645452 +RPL21P69 642738 +RPL21P70 646489 +RPL21P71 729962 +RPL21P72 100271181 +RPL21P73 100271182 +RPL21P74 100271184 +RPL21P75 728501 +RPL21P76 645373 +RPL21P77 100271183 +RPL21P78 100271185 +RPL21P79 100271188 +RPL21P80 100133273 +RPL21P81 100271389 +RPL21P82 650059 +RPL21P83 100271186 +RPL21P84 100271187 +RPL21P85 100271189 +RPL21P86 100271190 +RPL21P87 100131672 +RPL21P88 100271421 +RPL21P89 100271422 +RPL21P90 100271423 +RPL21P91 100271424 +RPL21P92 100130400 +RPL21P93 653665 +RPL21P94 100271425 +RPL21P95 100271427 +RPL21P96 100271428 +RPL21P97 387753 +RPL21P98 653079 +RPL21P99 100271429 +RPL21P100 100271430 +RPL21P101 100271431 +RPL21P102 100271432 +RPL21P103 100271433 +RPL21P104 100271435 +RPL21P105 728693 +RPL21P106 643264 +RPL21P107 644627 +RPL21P108 100271434 +RPL21P109 100271437 +RPL21P110 100271438 +RPL21P111 100271439 +RPL21P112 100270753 +RPL21P113 100271440 +RPL21P114 100271441 +RPL21P115 100271443 +RPL21P116 100271444 +RPL21P117 729241 +RPL21P118 100271446 +RPL21P119 653737 +RPL21P120 731688 +RPL21P121 100271445 +RPL21P122 100271447 +RPL21P123 100271448 +RPL21P124 100271450 +RPL21P125 100129685 +RPL21P126 100271449 +RPL21P127 100271452 +RPL21P128 440487 +RPL21P129 100271451 +RPL21P130 100271453 +RPL21P131 388532 +RPL21P132 100271390 +RPL21P133 100271391 +RPL21P134 728782 +RPL21P135 100419391 +RPL21P136 100419521 +RPL21P137 127379693 +RPL22 6146 +RPL22L1 200916 +RPL22P1 125371 +RPL22P2 326292 +RPL22P3 729662 +RPL22P4 100129102 +RPL22P5 100132479 +RPL22P6 100132047 +RPL22P7 100129819 +RPL22P8 100270957 +RPL22P10 100128408 +RPL22P11 402100 +RPL22P12 727747 +RPL22P13 442108 +RPL22P14 100270960 +RPL22P16 100270959 +RPL22P17 100271289 +RPL22P18 100271290 +RPL22P19 644022 +RPL22P20 100128664 +RPL22P21 100271455 +RPL22P22 100130922 +RPL22P23 100289184 +RPL22P24 100129295 +RPL23 9349 +RPL23A 6147 +RPL23AP1 6148 +RPL23AP2 401904 +RPL23AP3 8489 +RPL23AP4 54029 +RPL23AP5 729480 +RPL23AP6 128709 +RPL23AP7 118433 +RPL23AP8 641614 +RPL23AP10 326293 +RPL23AP11 326294 +RPL23AP12 391282 +RPL23AP14 341511 +RPL23AP15 391175 +RPL23AP16 647201 +RPL23AP17 100271138 +RPL23AP18 728134 +RPL23AP19 100131143 +RPL23AP20 645962 +RPL23AP21 728481 +RPL23AP22 100271291 +RPL23AP23 100271292 +RPL23AP24 728517 +RPL23AP25 653789 +RPL23AP26 391490 +RPL23AP27 100271456 +RPL23AP28 100271457 +RPL23AP29 100271458 +RPL23AP30 100271459 +RPL23AP31 100271460 +RPL23AP32 56969 +RPL23AP33 100271293 +RPL23AP34 100271294 +RPL23AP35 100271295 +RPL23AP36 100271296 +RPL23AP37 130773 +RPL23AP38 391504 +RPL23AP39 100271461 +RPL23AP40 100271462 +RPL23AP41 646685 +RPL23AP42 647099 +RPL23AP43 389101 +RPL23AP44 391825 +RPL23AP45 729764 +RPL23AP46 442260 +RPL23AP47 729277 +RPL23AP48 728567 +RPL23AP49 653236 +RPL23AP50 728106 +RPL23AP51 100271464 +RPL23AP52 100271465 +RPL23AP53 644128 +RPL23AP54 100271466 +RPL23AP55 100271467 +RPL23AP56 645809 +RPL23AP57 648294 +RPL23AP58 100271616 +RPL23AP59 100271618 +RPL23AP60 728933 +RPL23AP61 728484 +RPL23AP62 100271617 +RPL23AP63 729798 +RPL23AP64 649946 +RPL23AP65 440027 +RPL23AP66 100271620 +RPL23AP67 100271622 +RPL23AP68 100130555 +RPL23AP69 100271623 +RPL23AP70 100271619 +RPL23AP71 644384 +RPL23AP72 100271621 +RPL23AP73 100271625 +RPL23AP74 729617 +RPL23AP75 728207 +RPL23AP76 441781 +RPL23AP77 728538 +RPL23AP78 100271624 +RPL23AP79 100271626 +RPL23AP80 390949 +RPL23AP81 100271627 +RPL23AP82 284942 +RPL23AP83 100131846 +RPL23AP84 102723981 +RPL23AP85 100419650 +RPL23AP86 100507357 +RPL23AP87 388574 +RPL23AP88 100289034 +RPL23AP89 106480336 +RPL23AP90 106480690 +RPL23AP91 106480337 +RPL23AP92 106481731 +RPL23AP93 100288802 +RPL23AP94 106481971 +RPL23AP95 106480338 +RPL23AP96 392181 +RPL23AP97 102723647 +RPL23P2 54028 +RPL23P3 100130630 +RPL23P4 100270961 +RPL23P5 402120 +RPL23P6 646949 +RPL23P7 442659 +RPL23P8 222901 +RPL23P9 100129377 +RPL23P10 100270962 +RPL23P11 100271297 +RPL24 6152 +RPL24P2 140760 +RPL24P3 145235 +RPL24P4 377381 +RPL24P5 100129017 +RPL24P6 100129808 +RPL24P7 100270963 +RPL24P8 100270964 +RPL24P9 100129487 +RPL26 6154 +RPL26L1 51121 +RPL26L1-AS1 100268168 +RPL26P2 326297 +RPL26P3 326298 +RPL26P4 283603 +RPL26P5 654386 +RPL26P6 100131526 +RPL26P7 100270883 +RPL26P8 100270884 +RPL26P9 100270885 +RPL26P10 100270886 +RPL26P11 730070 +RPL26P12 391126 +RPL26P13 130865 +RPL26P14 100133235 +RPL26P15 100270965 +RPL26P16 646966 +RPL26P17 100128318 +RPL26P18 100270968 +RPL26P19 441073 +RPL26P20 100271191 +RPL26P21 646161 +RPL26P22 643101 +RPL26P23 100129517 +RPL26P24 728311 +RPL26P25 100270966 +RPL26P26 100270967 +RPL26P27 100271471 +RPL26P28 100130983 +RPL26P29 100131788 +RPL26P30 653147 +RPL26P31 100271469 +RPL26P32 400055 +RPL26P33 100132547 +RPL26P34 100271470 +RPL26P35 100128115 +RPL26P36 392501 +RPL26P37 441533 +RPL27 6155 +RPL27A 6157 +RPL27AP 128481 +RPL27AP2 391124 +RPL27AP3 100271298 +RPL27AP4 100271299 +RPL27AP5 100271300 +RPL27AP6 389435 +RPL27AP7 100271301 +RPL27AP8 100271605 +RPL27P1 326299 +RPL27P2 646446 +RPL27P4 646624 +RPL27P5 100270969 +RPL27P6 647112 +RPL27P7 100129234 +RPL27P8 729332 +RPL27P9 100270970 +RPL27P10 202122 +RPL27P11 442723 +RPL27P12 100271302 +RPL28 6158 +RPL28P1 402149 +RPL28P2 100270971 +RPL28P3 391828 +RPL28P4 441726 +RPL28P5 729279 +RPL29 6159 +RPL29P1 134756 +RPL29P2 118432 +RPL29P3 729042 +RPL29P4 387101 +RPL29P5 646417 +RPL29P6 391019 +RPL29P7 100270972 +RPL29P8 100131991 +RPL29P9 647285 +RPL29P11 100131713 +RPL29P12 283412 +RPL29P13 391738 +RPL29P14 100270974 +RPL29P15 728820 +RPL29P16 100131206 +RPL29P17 645224 +RPL29P18 644103 +RPL29P19 389655 +RPL29P20 100129332 +RPL29P21 732199 +RPL29P22 100271472 +RPL29P23 646077 +RPL29P24 100129591 +RPL29P25 642493 +RPL29P26 643531 +RPL29P27 100130792 +RPL29P28 646884 +RPL29P29 100271474 +RPL29P30 729611 +RPL29P31 284064 +RPL29P32 390856 +RPL29P33 401911 +RPL29P34 127566424 +RPL30 6156 +RPL30-AS1 123706519 +RPL30P1 100270975 +RPL30P2 100270976 +RPL30P3 100270977 +RPL30P4 100131230 +RPL30P5 100270978 +RPL30P6 100270980 +RPL30P7 100270979 +RPL30P8 100132053 +RPL30P9 100270981 +RPL30P10 100270982 +RPL30P11 100271303 +RPL30P12 100271304 +RPL30P13 100271305 +RPL30P14 100129867 +RPL30P15 100271192 +RPL30P16 100289099 +RPL31 6160 +RPL31P1 54027 +RPL31P2 140753 +RPL31P3 140718 +RPL31P4 729646 +RPL31P5 100129928 +RPL31P6 654387 +RPL31P7 654391 +RPL31P8 253013 +RPL31P9 619464 +RPL31P10 390283 +RPL31P11 641311 +RPL31P12 100270887 +RPL31P13 100270983 +RPL31P14 100129310 +RPL31P15 100270984 +RPL31P16 100129418 +RPL31P17 653773 +RPL31P18 285260 +RPL31P19 100270985 +RPL31P20 100270986 +RPL31P21 100270988 +RPL31P22 100270989 +RPL31P23 391581 +RPL31P24 100271194 +RPL31P25 100270987 +RPL31P26 100130537 +RPL31P27 100271198 +RPL31P28 442217 +RPL31P29 100270990 +RPL31P30 729203 +RPL31P31 727792 +RPL31P32 643851 +RPL31P33 442218 +RPL31P34 100271193 +RPL31P35 100271199 +RPL31P36 100271200 +RPL31P37 646787 +RPL31P38 442326 +RPL31P39 641790 +RPL31P40 100271196 +RPL31P41 100271201 +RPL31P42 100271197 +RPL31P43 392382 +RPL31P44 644522 +RPL31P45 729308 +RPL31P46 100271479 +RPL31P47 100271481 +RPL31P48 645654 +RPL31P49 100129882 +RPL31P50 341356 +RPL31P51 100271475 +RPL31P52 100271476 +RPL31P53 100271477 +RPL31P54 100271483 +RPL31P55 100128250 +RPL31P56 100271478 +RPL31P57 645993 +RPL31P58 100271485 +RPL31P59 100271480 +RPL31P60 100271486 +RPL31P61 100271487 +RPL31P62 100271482 +RPL31P63 100271392 +RPL31P64 127566430 +RPL32 6161 +RPL32P1 6163 +RPL32P2 654388 +RPL32P3 132241 +RPL32P4 100131339 +RPL32P5 23754 +RPL32P6 100270888 +RPL32P7 391560 +RPL32P8 100270991 +RPL32P9 100270992 +RPL32P10 391595 +RPL32P11 728572 +RPL32P12 731741 +RPL32P13 100270993 +RPL32P14 100270994 +RPL32P15 100132265 +RPL32P16 646104 +RPL32P17 402716 +RPL32P18 644907 +RPL32P19 646433 +RPL32P20 392271 +RPL32P21 100128004 +RPL32P22 644996 +RPL32P23 644020 +RPL32P24 100271489 +RPL32P25 100271490 +RPL32P26 100271491 +RPL32P27 100271306 +RPL32P28 100133193 +RPL32P29 729215 +RPL32P30 100271492 +RPL32P31 201259 +RPL32P32 100271488 +RPL32P33 100271493 +RPL32P34 100133162 +RPL32P35 100271393 +RPL32P36 392447 +RPL34 6164 +RPL34-DT 285456 +RPL34P1 26514 +RPL34P2 26513 +RPL34P3 54026 +RPL34P4 100270889 +RPL34P5 100270995 +RPL34P6 100270998 +RPL34P7 100127995 +RPL34P8 100270999 +RPL34P9 100271002 +RPL34P10 100271004 +RPL34P11 100130286 +RPL34P12 100270996 +RPL34P13 100270997 +RPL34P14 100129934 +RPL34P15 100271000 +RPL34P16 100133294 +RPL34P17 100271001 +RPL34P18 100271003 +RPL34P19 100271494 +RPL34P20 100271308 +RPL34P21 100271495 +RPL34P22 100271498 +RPL34P23 100271499 +RPL34P24 100271309 +RPL34P25 100271501 +RPL34P26 100130718 +RPL34P27 651249 +RPL34P28 100271500 +RPL34P29 100271503 +RPL34P30 100271505 +RPL34P31 729536 +RPL34P32 100271502 +RPL34P33 730061 +RPL34P34 342994 +RPL34P35 100271504 +RPL34P36 117981797 +RPL35 11224 +RPL35A 6165 +RPL35AP 140716 +RPL35AP2 652983 +RPL35AP3 387074 +RPL35AP4 100048922 +RPL35AP5 100132122 +RPL35AP6 100271312 +RPL35AP7 100128984 +RPL35AP8 100271310 +RPL35AP9 100271311 +RPL35AP10 100271313 +RPL35AP11 100271314 +RPL35AP12 100271316 +RPL35AP13 100131945 +RPL35AP14 100271315 +RPL35AP15 100271317 +RPL35AP16 100271318 +RPL35AP17 100271319 +RPL35AP18 100271321 +RPL35AP19 100271322 +RPL35AP20 100128277 +RPL35AP21 100271506 +RPL35AP22 100271507 +RPL35AP23 100271633 +RPL35AP24 100271631 +RPL35AP26 100271630 +RPL35AP27 100271635 +RPL35AP28 100271637 +RPL35AP29 100271638 +RPL35AP30 100271639 +RPL35AP31 100271640 +RPL35AP32 100271632 +RPL35AP33 100271634 +RPL35AP34 100271641 +RPL35AP35 100271636 +RPL35AP36 100128393 +RPL35AP37 100128807 +RPL35P1 440737 +RPL35P2 646766 +RPL35P3 728010 +RPL35P4 100271006 +RPL35P5 441246 +RPL35P6 100271007 +RPL35P7 341604 +RPL35P8 643653 +RPL35P9 100873796 +RPL36 25873 +RPL36A 6173 +RPL36A-HNRNPH2 100529097 +RPL36AL 6166 +RPL36AP1 100131379 +RPL36AP2 326301 +RPL36AP4 326304 +RPL36AP5 387090 +RPL36AP6 641556 +RPL36AP7 728202 +RPL36AP8 643007 +RPL36AP9 100271139 +RPL36AP10 100271140 +RPL36AP11 100129180 +RPL36AP12 100130034 +RPL36AP13 100271323 +RPL36AP14 100271324 +RPL36AP15 100271325 +RPL36AP16 100271327 +RPL36AP17 100271326 +RPL36AP18 100271328 +RPL36AP19 100271330 +RPL36AP20 100271329 +RPL36AP21 100271332 +RPL36AP23 729075 +RPL36AP24 100271508 +RPL36AP25 100271331 +RPL36AP26 729909 +RPL36AP27 100128072 +RPL36AP28 100271509 +RPL36AP29 100271510 +RPL36AP30 100271511 +RPL36AP31 642320 +RPL36AP32 100271512 +RPL36AP33 100191039 +RPL36AP34 100271513 +RPL36AP35 100271610 +RPL36AP36 644834 +RPL36AP37 729362 +RPL36AP38 100271642 +RPL36AP39 100271643 +RPL36AP40 554234 +RPL36AP41 100271644 +RPL36AP43 100271646 +RPL36AP44 100132199 +RPL36AP45 441727 +RPL36AP46 729621 +RPL36AP47 100271647 +RPL36AP48 646175 +RPL36AP49 284230 +RPL36AP50 100271648 +RPL36AP51 649299 +RPL36AP52 207032 +RPL36AP53 100271611 +RPL36AP54 100271612 +RPL36AP55 100420206 +RPL36P1 140697 +RPL36P2 140751 +RPL36P3 326303 +RPL36P4 140750 +RPL36P5 127295 +RPL36P6 100271008 +RPL36P7 100271010 +RPL36P8 643205 +RPL36P9 100271009 +RPL36P10 100271011 +RPL36P11 642531 +RPL36P12 100271012 +RPL36P13 100271013 +RPL36P14 347292 +RPL36P15 100271334 +RPL36P16 651600 +RPL36P17 100271336 +RPL36P18 100271394 +RPL36P19 100873855 +RPL36P20 729032 +RPL37 6167 +RPL37A 6168 +RPL37A-DT 100507554 +RPL37AP1 140717 +RPL37AP2 100271337 +RPL37AP3 100132988 +RPL37AP4 100271338 +RPL37AP5 100129856 +RPL37AP6 100271339 +RPL37AP7 100131730 +RPL37AP8 644338 +RPL37AP9 100271606 +RPL37P1 140696 +RPL37P2 116730 +RPL37P3 378818 +RPL37P4 378819 +RPL37P5 654369 +RPL37P6 346950 +RPL37P7 100270890 +RPL37P8 100271014 +RPL37P9 100270828 +RPL37P10 100271015 +RPL37P11 100271016 +RPL37P12 100271017 +RPL37P13 100271018 +RPL37P14 100271019 +RPL37P15 100271020 +RPL37P16 100271021 +RPL37P17 100271202 +RPL37P18 100271342 +RPL37P19 100271515 +RPL37P20 100271340 +RPL37P21 100271516 +RPL37P22 100271341 +RPL37P23 648217 +RPL37P24 100271395 +RPL37P25 106481666 +RPL38 6169 +RPL38P1 116809 +RPL38P2 100129991 +RPL38P3 100132311 +RPL38P4 100130963 +RPL38P5 100130026 +RPL38P6 107985813 +RPL39 6170 +RPL39L 116832 +RPL39P 140719 +RPL39P2 326306 +RPL39P3 285785 +RPL39P4 654392 +RPL39P5 553117 +RPL39P6 100270891 +RPL39P7 100270892 +RPL39P8 100270893 +RPL39P9 100270894 +RPL39P10 100129952 +RPL39P11 100271022 +RPL39P12 100270829 +RPL39P13 100130802 +RPL39P14 100132127 +RPL39P15 647236 +RPL39P16 100271023 +RPL39P17 100271024 +RPL39P18 100271025 +RPL39P19 100271027 +RPL39P20 100131160 +RPL39P21 644499 +RPL39P22 100271028 +RPL39P23 100271203 +RPL39P24 100271396 +RPL39P25 100271517 +RPL39P26 100271518 +RPL39P27 100133222 +RPL39P28 100271520 +RPL39P29 100271522 +RPL39P30 100271519 +RPL39P31 100271525 +RPL39P32 100131387 +RPL39P33 100271521 +RPL39P34 100271523 +RPL39P35 100271524 +RPL39P36 100271526 +RPL39P37 100271528 +RPL39P38 100271529 +RPL39P39 100271530 +RPL39P40 100271531 +RPL39P41 100271532 +RPL41 6171 +RPL41P1 22971 +RPL41P2 22970 +RPL41P3 22969 +RPL41P4 326308 +RPL41P5 6172 +RPL41P6 286568 +RPL41P7 286570 +RPLP0 6175 +RPLP1 6176 +RPLP1P1 145499 +RPLP1P2 729138 +RPLP1P3 127099 +RPLP1P4 100129028 +RPLP1P5 130678 +RPLP1P6 729416 +RPLP1P7 133609 +RPLP1P8 100128745 +RPLP1P9 100271049 +RPLP1P10 100271346 +RPLP1P11 100131087 +RPLP1P12 646566 +RPLP1P13 100874124 +RPLP2 6181 +RPLP2P1 442175 +RPLP2P2 644198 +RPLP2P3 643949 +RPLP2P4 100271347 +RPLP2P5 100271348 +RPLP0P1 128745 +RPLP0P2 113157 +RPLP0P3 122589 +RPLP0P4 391102 +RPLP0P5 643779 +RPLP0P6 220717 +RPLP0P7 100271047 +RPLP0P8 100131151 +RPLP0P9 441114 +RPLP0P10 390578 +RPLP0P11 647094 +RPLP0P12 390860 +RPN1 6184 +RPN2 6185 +RPP14 11102 +RPP21 79897 +RPP25 54913 +RPP25L 138716 +RPP30 10556 +RPP38 10557 +RPP38-DT 221060 +RPP40 10799 +RPP40P1 100874225 +RPP40P2 100420608 +RPPH1 85495 +RPPH1-2P 106481202 +RPPH1-3P 106479602 +RPRD1A 55197 +RPRD1B 58490 +RPRD2 23248 +RPRM 56475 +RPRML 388394 +RPS2 6187 +RPS2P1 140755 +RPS2P2 326325 +RPS2P3 326326 +RPS2P4 92427 +RPS2P5 100130562 +RPS2P6 342808 +RPS2P7 86781 +RPS2P8 440589 +RPS2P9 100131866 +RPS2P10 401974 +RPS2P11 343184 +RPS2P12 650901 +RPS2P13 100270826 +RPS2P14 100270827 +RPS2P15 100270858 +RPS2P16 100270860 +RPS2P17 400963 +RPS2P18 643960 +RPS2P19 100270859 +RPS2P20 645018 +RPS2P21 441013 +RPS2P22 100270861 +RPS2P23 100270910 +RPS2P24 100270912 +RPS2P25 100270913 +RPS2P26 643992 +RPS2P27 440447 +RPS2P28 100132673 +RPS2P29 646294 +RPS2P30 100270911 +RPS2P31 392781 +RPS2P32 256355 +RPS2P33 286150 +RPS2P34 442426 +RPS2P35 100130980 +RPS2P36 100271243 +RPS2P37 390206 +RPS2P38 196188 +RPS2P39 100271244 +RPS2P40 91561 +RPS2P41 100271245 +RPS2P42 100271247 +RPS2P43 100271246 +RPS2P44 100271248 +RPS2P45 80052 +RPS2P46 125208 +RPS2P47 644388 +RPS2P48 645173 +RPS2P49 100271251 +RPS2P50 729842 +RPS2P51 729679 +RPS2P52 100271250 +RPS2P53 729274 +RPS2P54 100271252 +RPS2P55 286444 +RPS3 6188 +RPS3A 6189 +RPS3AP1 101241875 +RPS3AP2 64725 +RPS3AP3 140713 +RPS3AP4 100132142 +RPS3AP5 439992 +RPS3AP6 145767 +RPS3AP7 391168 +RPS3AP8 100271127 +RPS3AP9 100271129 +RPS3AP10 401975 +RPS3AP11 100270904 +RPS3AP12 100270905 +RPS3AP13 100129742 +RPS3AP14 729150 +RPS3AP15 652670 +RPS3AP16 727951 +RPS3AP17 100271130 +RPS3AP18 391706 +RPS3AP19 728700 +RPS3AP20 643932 +RPS3AP21 402287 +RPS3AP22 100130786 +RPS3AP23 100271131 +RPS3AP24 100271253 +RPS3AP25 645968 +RPS3AP26 644972 +RPS3AP27 100271255 +RPS3AP28 100271257 +RPS3AP29 730861 +RPS3AP30 100271254 +RPS3AP31 100271256 +RPS3AP32 100271258 +RPS3AP33 100271259 +RPS3AP34 100271260 +RPS3AP35 100271261 +RPS3AP36 643981 +RPS3AP37 100271593 +RPS3AP38 100271594 +RPS3AP39 730993 +RPS3AP40 100129199 +RPS3AP41 100271595 +RPS3AP42 100271597 +RPS3AP43 727970 +RPS3AP44 646527 +RPS3AP46 100271596 +RPS3AP47 146053 +RPS3AP48 100127963 +RPS3AP49 400652 +RPS3AP50 100271601 +RPS3AP51 100271600 +RPS3AP52 100873818 +RPS3AP53 100287512 +RPS3AP54 101927101 +RPS3P1 140754 +RPS3P2 140761 +RPS3P3 440991 +RPS3P4 100270862 +RPS3P5 100131956 +RPS3P6 645000 +RPS3P7 645957 +RPS4X 6191 +RPS4XP1 400064 +RPS4XP2 92507 +RPS4XP3 128580 +RPS4XP4 441878 +RPS4XP5 100271132 +RPS4XP6 391777 +RPS4XP7 442162 +RPS4XP8 646269 +RPS4XP9 442257 +RPS4XP10 100271133 +RPS4XP11 441550 +RPS4XP12 100271385 +RPS4XP13 390183 +RPS4XP14 729097 +RPS4XP15 100131055 +RPS4XP16 220433 +RPS4XP17 100128140 +RPS4XP18 646583 +RPS4XP19 645573 +RPS4XP20 100271386 +RPS4XP21 126235 +RPS4XP22 100131614 +RPS4XP23 106480153 +RPS4Y1 6192 +RPS4Y1P1 441774 +RPS4Y2 140032 +RPS5 6193 +RPS5P1 26516 +RPS5P2 100130240 +RPS5P3 54022 +RPS5P4 100129090 +RPS5P5 340443 +RPS5P6 392282 +RPS5P7 392520 +RPS5P8 392424 +RPS6 6194 +RPS6KA1 6195 +RPS6KA2 6196 +RPS6KA2-AS1 100861523 +RPS6KA2-IT1 100874353 +RPS6KA3 6197 +RPS6KA4 8986 +RPS6KA5 9252 +RPS6KA6 27330 +RPS6KB1 6198 +RPS6KB2 6199 +RPS6KB2-AS1 111216279 +RPS6KC1 26750 +RPS6KL1 83694 +RPS6P1 440086 +RPS6P2 100270864 +RPS6P3 644013 +RPS6P4 100131548 +RPS6P5 100130347 +RPS6P7 100128162 +RPS6P8 100128450 +RPS6P9 100131467 +RPS6P10 100270865 +RPS6P11 100270866 +RPS6P12 100270867 +RPS6P13 392358 +RPS6P14 100131396 +RPS6P15 100129732 +RPS6P16 100128923 +RPS6P17 120318 +RPS6P18 100271135 +RPS6P19 100271136 +RPS6P20 100271262 +RPS6P21 100271263 +RPS6P22 100129227 +RPS6P23 100130313 +RPS6P24 100128358 +RPS6P25 729389 +RPS6P26 392497 +RPS7 6201 +RPS7P1 388363 +RPS7P2 100270868 +RPS7P3 440732 +RPS7P4 149224 +RPS7P5 645884 +RPS7P6 100270869 +RPS7P7 100270870 +RPS7P8 442237 +RPS7P9 100128756 +RPS7P10 100128060 +RPS7P11 644315 +RPS7P12 100270914 +RPS7P13 100130435 +RPS7P14 646108 +RPS7P15 728015 +RPS8 6202 +RPS8P1 192133 +RPS8P3 100132995 +RPS8P4 646119 +RPS8P5 100131083 +RPS8P6 100270871 +RPS8P7 646093 +RPS8P8 728553 +RPS8P9 100130750 +RPS8P10 388076 +RPS9 6203 +RPS9P1 8410 +RPS9P2 267009 +RPS9P3 100133054 +RPS9P4 388556 +RPS10 6204 +RPS10-NUDT3 100529239 +RPS10P1 394255 +RPS10P2 140758 +RPS10P3 158104 +RPS10P4 728791 +RPS10P5 93144 +RPS10P6 729374 +RPS10P7 376693 +RPS10P8 729780 +RPS10P9 730187 +RPS10P10 389127 +RPS10P11 391833 +RPS10P12 133569 +RPS10P13 646785 +RPS10P14 646942 +RPS10P15 654029 +RPS10P16 100271050 +RPS10P17 645857 +RPS10P18 100271349 +RPS10P19 100271350 +RPS10P20 100271547 +RPS10P21 100271351 +RPS10P22 401817 +RPS10P23 645713 +RPS10P24 645299 +RPS10P25 100271546 +RPS10P26 100271548 +RPS10P27 100129556 +RPS10P28 100132372 +RPS10P29 388885 +RPS10P30 343851 +RPS10P31 100129939 +RPS11 6205 +RPS11P1 128718 +RPS11P2 645916 +RPS11P3 100270898 +RPS11P4 100271052 +RPS11P5 727826 +RPS11P6 729258 +RPS11P7 642687 +RPS12 6206 +RPS12P1 326312 +RPS12P2 619448 +RPS12P3 344423 +RPS12P4 391370 +RPS12P5 100271053 +RPS12P6 100271054 +RPS12P7 100271055 +RPS12P8 402184 +RPS12P9 727997 +RPS12P10 100271056 +RPS12P11 442270 +RPS12P12 100131761 +RPS12P13 100271057 +RPS12P14 100271058 +RPS12P15 100271059 +RPS12P16 100271352 +RPS12P17 100271353 +RPS12P18 100271354 +RPS12P20 100271549 +RPS12P21 100271550 +RPS12P22 440055 +RPS12P23 338870 +RPS12P24 100271551 +RPS12P25 646985 +RPS12P26 100130495 +RPS12P27 100271552 +RPS12P28 100271553 +RPS12P29 728244 +RPS12P30 100271555 +RPS12P31 100130192 +RPS12P32 100271556 +RPS13 6207 +RPS13P1 100128305 +RPS13P2 729236 +RPS13P3 100129718 +RPS13P4 100271060 +RPS13P5 100271061 +RPS13P6 100271062 +RPS13P7 645918 +RPS13P8 645630 +RPS14 6208 +RPS14P1 100271063 +RPS14P2 100271064 +RPS14P3 644068 +RPS14P4 100132382 +RPS14P5 100133255 +RPS14P6 646737 +RPS14P7 100271065 +RPS14P8 644146 +RPS14P9 644119 +RPS14P10 647034 +RPS15 6209 +RPS15A 6210 +RPS15AP1 92682 +RPS15AP2 326316 +RPS15AP3 326317 +RPS15AP4 654371 +RPS15AP5 414230 +RPS15AP6 100271141 +RPS15AP7 100271142 +RPS15AP8 100271143 +RPS15AP9 441898 +RPS15AP10 728963 +RPS15AP11 644790 +RPS15AP12 100129243 +RPS15AP13 100128605 +RPS15AP14 100127924 +RPS15AP15 100130782 +RPS15AP16 100271358 +RPS15AP17 391656 +RPS15AP18 100271360 +RPS15AP19 646819 +RPS15AP20 647155 +RPS15AP21 100271357 +RPS15AP22 100271557 +RPS15AP23 100271558 +RPS15AP24 648729 +RPS15AP25 728774 +RPS15AP26 100271359 +RPS15AP27 100271613 +RPS15AP28 100132400 +RPS15AP29 100128863 +RPS15AP30 100271607 +RPS15AP31 100271652 +RPS15AP32 100271649 +RPS15AP33 100271654 +RPS15AP34 390735 +RPS15AP35 390848 +RPS15AP36 100271650 +RPS15AP37 100271651 +RPS15AP38 100271655 +RPS15AP39 100129284 +RPS15AP40 100128083 +RPS15P1 728428 +RPS15P2 100271066 +RPS15P3 391137 +RPS15P4 401019 +RPS15P5 729789 +RPS15P6 391845 +RPS15P7 100271361 +RPS15P8 390576 +RPS15P9 401895 +RPS16 6217 +RPS16P1 441876 +RPS16P2 402069 +RPS16P3 100271067 +RPS16P4 100271068 +RPS16P5 647190 +RPS16P6 100271362 +RPS16P7 441744 +RPS16P8 654170 +RPS16P9 645412 +RPS16P10 729903 +RPS17 6218 +RPS17P1 442195 +RPS17P2 6219 +RPS17P3 646013 +RPS17P5 442216 +RPS17P6 391130 +RPS17P7 100271069 +RPS17P8 100271070 +RPS17P9 100130823 +RPS17P10 100271071 +RPS17P11 100271072 +RPS17P12 442726 +RPS17P13 100271073 +RPS17P14 100271074 +RPS17P15 100271363 +RPS17P16 402057 +RPS17P17 100271230 +RPS18 6222 +RPS18P1 128676 +RPS18P2 326320 +RPS18P3 100128258 +RPS18P4 100271075 +RPS18P5 100131863 +RPS18P6 100271076 +RPS18P7 133790 +RPS18P8 643627 +RPS18P9 645958 +RPS18P10 729293 +RPS18P11 100271077 +RPS18P12 388339 +RPS18P13 100271364 +RPS18P14 100128535 +RPS19 6223 +RPS19BP1 91582 +RPS19P1 85486 +RPS19P2 85487 +RPS19P3 728953 +RPS19P4 100132049 +RPS19P5 100131286 +RPS19P6 100271078 +RPS19P7 728509 +RPS20 6224 +RPS20P1 54025 +RPS20P2 64726 +RPS20P3 6225 +RPS20P4 6226 +RPS20P5 100270899 +RPS20P6 100270900 +RPS20P7 100270901 +RPS20P8 100271079 +RPS20P9 100271080 +RPS20P10 100271081 +RPS20P11 100271082 +RPS20P12 100271083 +RPS20P13 100271084 +RPS20P14 440992 +RPS20P15 100271085 +RPS20P16 100271086 +RPS20P17 100271088 +RPS20P18 100271231 +RPS20P19 644309 +RPS20P20 100271233 +RPS20P21 100271234 +RPS20P22 100271087 +RPS20P23 100271089 +RPS20P24 100271232 +RPS20P25 100271235 +RPS20P26 646660 +RPS20P27 729927 +RPS20P28 100271560 +RPS20P29 100271561 +RPS20P30 100271562 +RPS20P31 100271563 +RPS20P32 100129306 +RPS20P33 100271564 +RPS20P34 100271565 +RPS20P35 100271566 +RPS21 6227 +RPS21-DT 128667224 +RPS21P1 100271090 +RPS21P2 100132961 +RPS21P3 100132993 +RPS21P4 100128912 +RPS21P5 100271236 +RPS21P6 100271365 +RPS21P7 100271366 +RPS21P8 100873798 +RPS23 6228 +RPS23P1 93948 +RPS23P2 391701 +RPS23P3 100271091 +RPS23P4 100271092 +RPS23P5 100271093 +RPS23P6 100271367 +RPS23P7 100130106 +RPS23P8 653658 +RPS23P9 100419472 +RPS23P10 100419471 +RPS24 6229 +RPS24P1 23756 +RPS24P2 326321 +RPS24P3 326322 +RPS24P4 729257 +RPS24P5 100271094 +RPS24P6 100216339 +RPS24P7 100216342 +RPS24P8 100216336 +RPS24P9 100132496 +RPS24P10 100271097 +RPS24P11 100128519 +RPS24P12 100271098 +RPS24P13 100216338 +RPS24P14 100128423 +RPS24P15 390107 +RPS24P16 100216340 +RPS24P17 100216341 +RPS24P18 100271371 +RPS24P19 100130183 +RPS24P21 117751730 +RPS25 6230 +RPS25P1 283114 +RPS25P2 100271100 +RPS25P3 100271101 +RPS25P4 391539 +RPS25P5 100271102 +RPS25P6 401206 +RPS25P7 100271103 +RPS25P8 100131196 +RPS25P9 100271373 +RPS25P10 100271372 +RPS26 6231 +RPS26P1 54024 +RPS26P2 646753 +RPS26P3 441386 +RPS26P4 692146 +RPS26P5 387495 +RPS26P6 392256 +RPS26P7 619443 +RPS26P8 644191 +RPS26P9 446209 +RPS26P10 401470 +RPS26P11 441502 +RPS26P12 100271104 +RPS26P13 100271106 +RPS26P14 100270902 +RPS26P15 644928 +RPS26P16 730177 +RPS26P17 391165 +RPS26P18 100271108 +RPS26P19 100271110 +RPS26P20 644166 +RPS26P21 100271105 +RPS26P22 100271112 +RPS26P23 100271107 +RPS26P24 100271113 +RPS26P25 728937 +RPS26P26 100271109 +RPS26P27 100271237 +RPS26P28 643003 +RPS26P29 442158 +RPS26P30 100271111 +RPS26P31 645979 +RPS26P32 389472 +RPS26P33 100271239 +RPS26P34 100271114 +RPS26P35 441377 +RPS26P36 100271240 +RPS26P37 100271238 +RPS26P38 100129552 +RPS26P39 100128168 +RPS26P40 338611 +RPS26P41 100271567 +RPS26P42 100271568 +RPS26P43 100271571 +RPS26P44 100271569 +RPS26P45 100271570 +RPS26P46 100271572 +RPS26P47 400156 +RPS26P48 100271574 +RPS26P49 100271575 +RPS26P50 644934 +RPS26P51 100271576 +RPS26P52 100271577 +RPS26P53 728823 +RPS26P54 100131971 +RPS26P55 100129650 +RPS26P56 100271400 +RPS26P57 100271401 +RPS26P58 729188 +RPS27 6232 +RPS27A 6233 +RPS27AP1 103911 +RPS27AP2 140752 +RPS27AP3 140714 +RPS27AP4 326323 +RPS27AP5 100271374 +RPS27AP6 100271144 +RPS27AP7 728971 +RPS27AP8 100271375 +RPS27AP9 100271376 +RPS27AP10 100271377 +RPS27AP11 728590 +RPS27AP12 100130446 +RPS27AP13 100130300 +RPS27AP14 100271378 +RPS27AP15 100271379 +RPS27AP16 643358 +RPS27AP17 392425 +RPS27AP18 100419548 +RPS27AP19 107985274 +RPS27AP20 100128355 +RPS27L 51065 +RPS27P1 414228 +RPS27P2 654390 +RPS27P3 654365 +RPS27P4 389112 +RPS27P5 100271116 +RPS27P6 100132488 +RPS27P7 100131787 +RPS27P8 653805 +RPS27P9 100131572 +RPS27P10 646233 +RPS27P11 100271115 +RPS27P12 100271117 +RPS27P13 100130070 +RPS27P14 100129279 +RPS27P15 100271118 +RPS27P16 100271119 +RPS27P17 392748 +RPS27P18 100271380 +RPS27P19 100129905 +RPS27P20 100271581 +RPS27P21 100131905 +RPS27P22 100131418 +RPS27P23 100130775 +RPS27P24 100133668 +RPS27P25 100271584 +RPS27P26 100271583 +RPS27P27 100271585 +RPS27P28 100271586 +RPS27P29 100132291 +RPS27P30 127379697 +RPS28 6234 +RPS28P1 652980 +RPS28P2 100271120 +RPS28P3 644862 +RPS28P4 645899 +RPS28P5 100271121 +RPS28P6 728453 +RPS28P7 646195 +RPS28P8 100271381 +RPS28P9 650788 +RPS29 6235 +RPS29P1 122449 +RPS29P2 619452 +RPS29P3 642892 +RPS29P4 100271123 +RPS29P5 100271124 +RPS29P6 100270903 +RPS29P7 100128377 +RPS29P8 100132376 +RPS29P9 648343 +RPS29P10 100132037 +RPS29P11 100129902 +RPS29P12 100131173 +RPS29P13 100271122 +RPS29P14 100129599 +RPS29P15 100271241 +RPS29P16 100132499 +RPS29P17 100129379 +RPS29P18 643284 +RPS29P19 100271383 +RPS29P20 100271587 +RPS29P21 100129542 +RPS29P22 100271384 +RPS29P23 100271588 +RPS29P24 100271589 +RPS29P25 100271590 +RPS29P26 100271591 +RPS29P27 100271592 +RPS29P28 100271402 +RPS29P29 109729145 +RPS29P30 107987273 +RPS29P31 109729124 +RPS29P32 109729158 +RPS29P33 107987018 +RPSA 3921 +RPSA2 388524 +RPSAP1 170529 +RPSAP2 442181 +RPSAP3 158674 +RPSAP4 145259 +RPSAP5 319129 +RPSAP6 414254 +RPSAP7 654506 +RPSAP8 643617 +RPSAP9 653162 +RPSAP10 401638 +RPSAP11 645326 +RPSAP12 387867 +RPSAP13 3923 +RPSAP14 3924 +RPSAP15 220885 +RPSAP16 100270872 +RPSAP17 100270873 +RPSAP18 388707 +RPSAP19 730029 +RPSAP20 127406 +RPSAP21 729079 +RPSAP22 100270874 +RPSAP23 100270875 +RPSAP24 391462 +RPSAP25 129841 +RPSAP26 729209 +RPSAP27 130429 +RPSAP28 391387 +RPSAP29 389141 +RPSAP30 728126 +RPSAP31 391598 +RPSAP32 402123 +RPSAP33 647158 +RPSAP34 100270876 +RPSAP35 100270916 +RPSAP36 100128888 +RPSAP37 100270915 +RPSAP38 100130676 +RPSAP39 100131161 +RPSAP40 100270917 +RPSAP41 100270918 +RPSAP42 100270919 +RPSAP43 643954 +RPSAP44 652411 +RPSAP45 728562 +RPSAP46 652624 +RPSAP47 389672 +RPSAP48 392262 +RPSAP49 401537 +RPSAP50 644109 +RPSAP51 100271267 +RPSAP52 204010 +RPSAP53 400141 +RPSAP54 642641 +RPSAP55 388122 +RPSAP56 645656 +RPSAP57 390857 +RPSAP59 100271148 +RPSAP60 100271149 +RPSAP61 644464 +RPSAP62 100131469 +RPSAP63 100270755 +RPSAP64 100873797 +RPSAP65 107075109 +RPSAP66 107075110 +RPSAP67 107075111 +RPSAP68 100996520 +RPSAP69 101927158 +RPSAP70 105377595 +RPSAP71 107075249 +RPSAP72 107075112 +RPSAP73 107075250 +RPSAP74 107075113 +RPSAP75 107075114 +RPSAP76 101927006 +RPTN 126638 +RPTOR 57521 +RPUSD1 113000 +RPUSD2 27079 +RPUSD3 285367 +RPUSD4 84881 +RRAD 6236 +RRAGA 10670 +RRAGAP1 100462776 +RRAGAP1-AS1 120766148 +RRAGB 10325 +RRAGC 64121 +RRAGC-DT 105378663 +RRAGD 58528 +RRAS 6237 +RRAS2 22800 +RRAS2P1 100133211 +RRAS2P2 100384885 +RRBP1 6238 +RRBP1P1 392027 +RRBP1P2 100421669 +RREB1 6239 +RRH 10692 +RRM1 6240 +RRM1-AS1 106478966 +RRM2 6241 +RRM2B 50484 +RRM2P2 6244 +RRM2P3 100420159 +RRM2P4 6246 +RRN3 54700 +RRN3P1 730092 +RRN3P2 653390 +RRN3P3 100131998 +RRN3P4 100129955 +RRP1 8568 +RRP1B 23076 +RRP7A 27341 +RRP7BP 91695 +RRP8 23378 +RRP9 9136 +RRP12 23223 +RRP15 51018 +RRP36 88745 +RRS1 23212 +RRS1-DT 100505676 +RS1 6247 +RSAD1 55316 +RSAD2 91543 +RSBN1 54665 +RSBN1L 222194 +RSC1A1 6248 +RSF1 51773 +RSF1-IT1 100874308 +RSF1-IT2 100874307 +RSKR 124923 +RSL1D1 26156 +RSL1D1-DT 105371084 +RSL24D1 51187 +RSL24D1P1 100129755 +RSL24D1P2 100129162 +RSL24D1P3 100130721 +RSL24D1P4 391183 +RSL24D1P5 100129941 +RSL24D1P6 140757 +RSL24D1P7 100129861 +RSL24D1P8 100462809 +RSL24D1P9 100128991 +RSL24D1P10 100130699 +RSL24D1P11 284288 +RSPH1 89765 +RSPH1-DT 101930094 +RSPH3 83861 +RSPH4A 345895 +RSPH6A 81492 +RSPH9 221421 +RSPH10B 222967 +RSPH10B2 728194 +RSPH14 27156 +RSPO1 284654 +RSPO2 340419 +RSPO3 84870 +RSPO4 343637 +RSPRY1 89970 +RSRC1 51319 +RSRC2 65117 +RSRP1 57035 +RSU1 6251 +RSU1P1 100129622 +RSU1P2 100133308 +RSU1P3 100419964 +RTBDN 83546 +RTCA 8634 +RTCA-AS1 100506007 +RTCB 51493 +RTEL1 51750 +RTEL1-TNFRSF6B 100533107 +RTEL1P1 100421429 +RTF1 23168 +RTF2 51507 +RTKN 6242 +RTKN2 219790 +RTL1 388015 +RTL3 203430 +RTL4 340595 +RTL5 340526 +RTL6 84247 +RTL8A 26071 +RTL8B 441518 +RTL8C 8933 +RTL9 57529 +RTL10 79680 +RTN1 6252 +RTN2 6253 +RTN3 10313 +RTN3P1 152905 +RTN4 57142 +RTN4IP1 84816 +RTN4R 65078 +RTN4RL1 146760 +RTN4RL2 349667 +RTP1 132112 +RTP2 344892 +RTP3 83597 +RTP4 64108 +RTP5 285093 +RTRAF 51637 +RTRAFP1 100420892 +RTRAFP2 100420911 +RTTN 25914 +RUBCN 9711 +RUBCNL 80183 +RUFY1 80230 +RUFY1-AS1 101928445 +RUFY2 55680 +RUFY3 22902 +RUFY4 285180 +RUNDC1 146923 +RUNDC3A 10900 +RUNDC3A-AS1 101926996 +RUNDC3B 154661 +RUNX1 861 +RUNX1-AS1 112267915 +RUNX1-IT1 80215 +RUNX1T1 862 +RUNX2 860 +RUNX2-AS1 105375077 +RUNX3 864 +RUNX3-AS1 105376878 +RUSC1 23623 +RUSC1-AS1 284618 +RUSC2 9853 +RUSF1 64755 +RUSF1-DT 123706528 +RUVBL1 8607 +RUVBL1-AS1 100874089 +RUVBL2 10856 +RUVBL2P1 392538 +RWDD1 51389 +RWDD1P1 404551 +RWDD1P3 727789 +RWDD2A 112611 +RWDD2B 10069 +RWDD3 25950 +RWDD3-DT 101928118 +RWDD4 201965 +RWDD4P1 100419903 +RWDD4P2 647009 +RXFP1 59350 +RXFP2 122042 +RXFP3 51289 +RXFP4 339403 +RXRA 6256 +RXRB 6257 +RXRG 6258 +RXYLT1 10329 +RXYLT1-AS1 104169670 +RYBP 23429 +RYK 6259 +RYKP1 6260 +RYR1 6261 +RYR2 6262 +RYR3 6263 +RYR3-DT 101928134 +S1PR1 1901 +S1PR1-DT 101928370 +S1PR2 9294 +S1PR3 1903 +S1PR4 8698 +S1PR5 53637 +S100A1 6271 +S100A2 6273 +S100A3 6274 +S100A4 6275 +S100A5 6276 +S100A6 6277 +S100A7 6278 +S100A7A 338324 +S100A7L2 645922 +S100A7P1 127481 +S100A7P2 375027 +S100A8 6279 +S100A9 6280 +S100A10 6281 +S100A11 6282 +S100A11P1 729659 +S100A11P2 347701 +S100A11P3 645474 +S100A11P4 100506938 +S100A11P5 107985628 +S100A11P6 107985718 +S100A11P7 107985639 +S100A11P8 107985660 +S100A11P9 107985655 +S100A11P10 107987333 +S100A12 6283 +S100A13 6284 +S100A14 57402 +S100A15A 112488748 +S100A16 140576 +S100B 6285 +S100G 795 +S100P 6286 +S100PBP 64766 +S100Z 170591 +SAA1 6288 +SAA2 6289 +SAA2-SAA4 100528017 +SAA3P 6290 +SAA4 6291 +SAAL1 113174 +SAC3D1 29901 +SACM1L 22908 +SACS 26278 +SACS-AS1 100506680 +SAE1 10055 +SAE1P1 341056 +SAFB 6294 +SAFB2 9667 +SAG 6295 +SAGE1 55511 +SAGE2P 644717 +SAGE3P 100419054 +SAGE4P 442465 +SALL1 6299 +SALL1P1 139163 +SALL2 6297 +SALL3 27164 +SALL4 57167 +SALL4P1 100419717 +SALL4P2 100130259 +SALL4P3 100131046 +SALL4P4 100419855 +SALL4P5 100130785 +SALL4P6 391530 +SALL4P7 390483 +SALRNA1 104548971 +SALRNA2 104548973 +SALRNA3 104548972 +SAMD1 90378 +SAMD3 154075 +SAMD4A 23034 +SAMD4A-AS1 729451 +SAMD4B 55095 +SAMD5 389432 +SAMD7 344658 +SAMD8 142891 +SAMD9 54809 +SAMD9L 219285 +SAMD10 140700 +SAMD11 148398 +SAMD11P1 100421331 +SAMD12 401474 +SAMD12-AS1 552860 +SAMD13 148418 +SAMD14 201191 +SAMD15 161394 +SAMHD1 25939 +SAMM50 25813 +SAMM50P1 100271893 +SAMMSON 101927152 +SAMSN1 64092 +SAMSN1-AS1 100874190 +SANBR 84542 +SAP18 10284 +SAP18P1 106480689 +SAP18P2 442060 +SAP18P3 106660616 +SAP25 100316904 +SAP30 8819 +SAP30-DT 105377540 +SAP30BP 29115 +SAP30BP-AS1 128667226 +SAP30L 79685 +SAP30L-AS1 386627 +SAP30P1 677762 +SAP130 79595 +SAPCD1 401251 +SAPCD1-AS1 104413891 +SAPCD2 89958 +SAPCD2P1 442320 +SAPCD2P2 442317 +SAPCD2P3 643353 +SAPCD2P4 442318 +SAR1A 56681 +SAR1AP1 646260 +SAR1AP2 641312 +SAR1AP3 344988 +SAR1AP4 100132322 +SAR1B 51128 +SARAF 51669 +SARDH 1757 +SARM1 23098 +SARNP 84324 +SARS1 6301 +SARS2 54938 +SART1 9092 +SART3 9733 +SASH1 23328 +SASH3 54440 +SASS6 163786 +SAT1 6303 +SAT1-DT 105373148 +SAT2 112483 +SATB1 6304 +SATB1-AS1 101927777 +SATB2 23314 +SATB2-AS1 150538 +SATL1 340562 +SAV1 60485 +SAXO1 158297 +SAXO2 283726 +SAXO3 101059948 +SAXO4 220004 +SAXO5 374877 +SAYSD1 55776 +SBDS 51119 +SBDSP1 155370 +SBF1 6305 +SBF1P1 100133234 +SBF1P2 390997 +SBF2 81846 +SBF2-AS1 283104 +SBK1 388228 +SBK2 646643 +SBK3 100130827 +SBNO1 55206 +SBNO1-AS1 112268105 +SBNO2 22904 +SBSN 374897 +SBSPON 157869 +SC4MOP 6308 +SC5D 6309 +SCAANT1 100861563 +SCAF1 58506 +SCAF4 57466 +SCAF8 22828 +SCAF11 9169 +SCAI 286205 +SCAMP1 9522 +SCAMP1-AS1 728769 +SCAMP2 10066 +SCAMP3 10067 +SCAMP4 113178 +SCAMP5 192683 +SCAND1 51282 +SCAND2P 54581 +SCAND3 114821 +SCAND3P1 100873886 +SCAP 22937 +SCAPER 49855 +SCARA3 51435 +SCARA5 286133 +SCARB1 949 +SCARB2 950 +SCARF1 8578 +SCARF2 91179 +SCARNA1 677774 +SCARNA2 677766 +SCARNA3 677679 +SCARNA4 677771 +SCARNA5 677775 +SCARNA6 677772 +SCARNA7 677767 +SCARNA8 677776 +SCARNA9 619383 +SCARNA9L 100158262 +SCARNA10 692148 +SCARNA11 677780 +SCARNA12 677777 +SCARNA13 677768 +SCARNA14 692149 +SCARNA15 677778 +SCARNA16 677781 +SCARNA17 677769 +SCARNA18 677765 +SCARNA18B 107397392 +SCARNA20 677681 +SCARNA21 677763 +SCARNA21B 107397391 +SCARNA22 677770 +SCARNA23 677773 +SCARNA26A 106633810 +SCARNA26B 106633816 +SCARNA27 100124533 +SCARNA28 106633801 +SCART1 619207 +SCAT1 101928710 +SCAT2 112935960 +SCAT8 112935969 +SCCPDH 51097 +SCD 6319 +SCD5 79966 +SCDP1 645313 +SCEL 8796 +SCEL-AS1 104355296 +SCFD1 23256 +SCFD2 152579 +SCG2 7857 +SCG3 29106 +SCG5 6447 +SCG5-AS1 105370757 +SCGB1A1 7356 +SCGB1B1P 112441443 +SCGB1B2P 643719 +SCGB1B3P 112163673 +SCGB1C1 147199 +SCGB1C2 653486 +SCGB1D1 10648 +SCGB1D2 10647 +SCGB1D4 404552 +SCGB1D5P 100874258 +SCGB2A1 4246 +SCGB2A2 4250 +SCGB2B1P 112416061 +SCGB2B2 284402 +SCGB2B3P 100130342 +SCGB3A1 92304 +SCGB3A2 117156 +SCGN 10590 +SCHIP1 29970 +SCHLAP1 101669767 +SCIMP 388325 +SCIN 85477 +SCIRT 101929705 +SCLT1 132320 +SCLY 51540 +SCMH1 22955 +SCMH1-DT 102723924 +SCML1 6322 +SCML2 10389 +SCML2P1 100421167 +SCML2P2 100421172 +SCML4 256380 +SCN1A 6323 +SCN1A-AS1 101929680 +SCN1B 6324 +SCN2A 6326 +SCN2B 6327 +SCN3A 6328 +SCN3B 55800 +SCN4A 6329 +SCN4B 6330 +SCN5A 6331 +SCN7A 6332 +SCN8A 6334 +SCN9A 6335 +SCN10A 6336 +SCN11A 11280 +SCNM1 79005 +SCNN1A 6337 +SCNN1B 6338 +SCNN1D 6339 +SCNN1G 6340 +SCO1 6341 +SCO2 9997 +SCOC 60592 +SCOC-AS1 100129858 +SCOCP1 317767 +SCP2 6342 +SCP2D1 140856 +SCP2D1-AS1 100128496 +SCPEP1 59342 +SCPPPQ1 105377321 +SCRG1 11341 +SCRIB 23513 +SCRN1 9805 +SCRN2 90507 +SCRN3 79634 +SCRT1 83482 +SCRT2 85508 +SCT 6343 +SCTR 6344 +SCTR-AS1 107105282 +SCUBE1 80274 +SCUBE1-AS1 101927447 +SCUBE1-AS2 105373051 +SCUBE2 57758 +SCUBE3 222663 +SCUBE3-AS1 101929285 +SCX 642658 +SCYGR1 112441428 +SCYGR2 112441435 +SCYGR3 112441429 +SCYGR4 112441430 +SCYGR5 112441437 +SCYGR6 112441431 +SCYGR7 112441438 +SCYGR8 112441432 +SCYGR9 117134595 +SCYGR10 112441436 +SCYL1 57410 +SCYL2 55681 +SCYL2P1 100420110 +SCYL3 57147 +SDAD1 55153 +SDAD1-AS1 101928809 +SDAD1P1 157489 +SDAD1P2 400836 +SDAD1P3 100873858 +SDAD1P4 100419955 +SDC1 6382 +SDC2 6383 +SDC3 9672 +SDC4 6385 +SDC4P 376844 +SDCBP 6386 +SDCBP2 27111 +SDCBP2-AS1 100507495 +SDCBP2P1 106480801 +SDCBPP1 100128930 +SDCBPP2 100129960 +SDCBPP3 100131656 +SDCCAG8 10806 +SDE2 163859 +SDF2 6388 +SDF2L1 23753 +SDF4 51150 +SDHA 6389 +SDHAF1 644096 +SDHAF2 54949 +SDHAF3 57001 +SDHAF4 135154 +SDHAP1 255812 +SDHAP2 727956 +SDHAP3 728609 +SDHAP4 220729 +SDHB 6390 +SDHBP1 127460886 +SDHC 6391 +SDHCP1 100422600 +SDHCP2 100128302 +SDHCP3 100422591 +SDHCP4 100422598 +SDHD 6392 +SDHDP1 100289186 +SDHDP2 647081 +SDHDP3 29771 +SDHDP4 29770 +SDHDP5 29769 +SDHDP6 29768 +SDHDP7 388606 +SDIM1 100505705 +SDK1 221935 +SDK1-AS1 105375132 +SDK2 54549 +SDR9C7 121214 +SDR16C5 195814 +SDR16C6P 442388 +SDR39U1 56948 +SDR42E1 93517 +SDR42E1P1 100422340 +SDR42E1P2 100422346 +SDR42E1P3 100422347 +SDR42E1P4 100422348 +SDR42E1P5 100422339 +SDR42E2 100288072 +SDS 10993 +SDSL 113675 +SEBOX 645832 +SEC1P 653677 +SEC11A 23478 +SEC11B 157708 +SEC11C 90701 +SEC13 6396 +SEC13P1 100131671 +SEC14L1 6397 +SEC14L1P1 729799 +SEC14L2 23541 +SEC14L3 266629 +SEC14L4 284904 +SEC14L5 9717 +SEC14L6 730005 +SEC16A 9919 +SEC16B 89866 +SEC22A 26984 +SEC22B 9554 +SEC22B2P 100996716 +SEC22B3P 100996517 +SEC22B4P 102724364 +SEC22C 9117 +SEC23A 10484 +SEC23A-AS1 105370458 +SEC23B 10483 +SEC23IP 11196 +SEC24A 10802 +SEC24AP1 100421166 +SEC24B 10427 +SEC24B-AS1 100533182 +SEC24C 9632 +SEC24D 9871 +SEC31A 22872 +SEC31B 25956 +SEC61A1 29927 +SEC61A2 55176 +SEC61B 10952 +SEC61G 23480 +SEC61G-DT 100996654 +SEC61GP1 107985834 +SEC62 7095 +SEC62-AS1 106478967 +SEC63 11231 +SEC63P1 100420341 +SEC63P2 100420287 +SECISBP2 79048 +SECISBP2L 9728 +SECTM1 6398 +SEH1L 81929 +SEL1L 6400 +SEL1L2 80343 +SEL1L3 23231 +SELE 6401 +SELENBP1 8991 +SELENOF 9403 +SELENOH 280636 +SELENOI 85465 +SELENOK 58515 +SELENOKP1 100129085 +SELENOKP2 100127908 +SELENOKP3 100287632 +SELENOM 140606 +SELENON 57190 +SELENOO 83642 +SELENOO-AS1 105373095 +SELENOOLP 105376462 +SELENOP 6414 +SELENOS 55829 +SELENOT 51714 +SELENOTP1 645969 +SELENOTP2 100130316 +SELENOV 348303 +SELENOW 6415 +SELENOWP1 23679 +SELL 6402 +SELP 6403 +SELPLG 6404 +SEM1 7979 +SEM1P1 153842 +SEMA3A 10371 +SEMA3B 7869 +SEMA3B-AS1 101928931 +SEMA3C 10512 +SEMA3D 223117 +SEMA3E 9723 +SEMA3F 6405 +SEMA3F-AS1 100129060 +SEMA3G 56920 +SEMA4A 64218 +SEMA4B 10509 +SEMA4C 54910 +SEMA4D 10507 +SEMA4F 10505 +SEMA4G 57715 +SEMA5A 9037 +SEMA5A-AS1 101929338 +SEMA5B 54437 +SEMA6A 57556 +SEMA6A-AS1 101927233 +SEMA6A-AS2 105379132 +SEMA6B 10501 +SEMA6C 10500 +SEMA6D 80031 +SEMA7A 8482 +SEMG1 6406 +SEMG2 6407 +SENCR 100507392 +SENP1 29843 +SENP2 59343 +SENP3 26168 +SENP3-EIF4A1 100533955 +SENP5 205564 +SENP6 26054 +SENP7 57337 +SENP8 123228 +SEPHS1 22929 +SEPHS1P1 168474 +SEPHS1P2 100420292 +SEPHS1P3 100420189 +SEPHS1P4 389873 +SEPHS1P6 729399 +SEPHS1P7 391428 +SEPHS2 22928 +SEPHS2P1 100420190 +SEPSECS 51091 +SEPSECS-AS1 285540 +SEPTIN1 1731 +SEPTIN2 4735 +SEPTIN2P1 100873333 +SEPTIN3 55964 +SEPTIN4 5414 +SEPTIN4-AS1 101927688 +SEPTIN5 5413 +SEPTIN6 23157 +SEPTIN7 989 +SEPTIN7-DT 101928545 +SEPTIN7P1 317774 +SEPTIN7P2 641977 +SEPTIN7P3 646913 +SEPTIN7P4 100418715 +SEPTIN7P5 100418718 +SEPTIN7P6 100418720 +SEPTIN7P7 100130564 +SEPTIN7P8 100418735 +SEPTIN7P9 285961 +SEPTIN7P10 100418707 +SEPTIN7P11 441601 +SEPTIN7P12 100418753 +SEPTIN7P13 100287497 +SEPTIN7P14 645513 +SEPTIN7P15 100418714 +SEPTIN8 23176 +SEPTIN9 10801 +SEPTIN9-DT 105371907 +SEPTIN10 151011 +SEPTIN10P1 389662 +SEPTIN11 55752 +SEPTIN12 124404 +SEPTIN14 346288 +SEPTIN14P1 106480340 +SEPTIN14P2 107105263 +SEPTIN14P3 107105265 +SEPTIN14P4 107105266 +SEPTIN14P5 107105276 +SEPTIN14P6 107105278 +SEPTIN14P7 107105280 +SEPTIN14P8 106480341 +SEPTIN14P10 107105352 +SEPTIN14P11 107105353 +SEPTIN14P12 106480343 +SEPTIN14P13 106481733 +SEPTIN14P14 107105354 +SEPTIN14P15 107126282 +SEPTIN14P16 107126283 +SEPTIN14P17 106480344 +SEPTIN14P18 107126284 +SEPTIN14P19 107105271 +SEPTIN14P20 107126285 +SEPTIN14P21 107075107 +SEPTIN14P22 107126286 +SEPTIN14P23 107126290 +SEPTIN14P24 106480345 +SERAC1 84947 +SERBP1 26135 +SERBP1P1 389866 +SERBP1P2 359996 +SERBP1P3 553148 +SERBP1P4 100132591 +SERBP1P5 442112 +SERBP1P6 100420450 +SERF1A 8293 +SERF1AP1 100131921 +SERF1B 728492 +SERF2 10169 +SERGEF 26297 +SERHL 94009 +SERHL2 253190 +SERINC1 57515 +SERINC2 347735 +SERINC3 10955 +SERINC4 619189 +SERINC5 256987 +SERP1 27230 +SERP2 387923 +SERPINA1 5265 +SERPINA2 390502 +SERPINA3 12 +SERPINA4 5267 +SERPINA5 5104 +SERPINA6 866 +SERPINA7 6906 +SERPINA7P1 100422644 +SERPINA9 327657 +SERPINA10 51156 +SERPINA11 256394 +SERPINA12 145264 +SERPINA13P 388007 +SERPINA15P 101930744 +SERPINB1 1992 +SERPINB2 5055 +SERPINB3 6317 +SERPINB4 6318 +SERPINB5 5268 +SERPINB6 5269 +SERPINB7 8710 +SERPINB8 5271 +SERPINB8P1 11029 +SERPINB9 5272 +SERPINB9-AS1 101927730 +SERPINB9P1 221756 +SERPINB10 5273 +SERPINB11 89778 +SERPINB12 89777 +SERPINB13 5275 +SERPINC1 462 +SERPIND1 3053 +SERPINE1 5054 +SERPINE2 5270 +SERPINE3 647174 +SERPINE4P 101930745 +SERPINF1 5176 +SERPINF2 5345 +SERPING1 710 +SERPINH1 871 +SERPINH1P1 158172 +SERPINI1 5274 +SERPINI2 5276 +SERTAD1 29950 +SERTAD2 9792 +SERTAD3 29946 +SERTAD3-AS1 105372489 +SERTAD4 56256 +SERTAD4-AS1 574036 +SERTAD4BP 646113 +SERTM1 400120 +SERTM2 401613 +SESN1 27244 +SESN2 83667 +SESN3 143686 +SESTD1 91404 +SET 6418 +SETBP1 26040 +SETBP1-DT 101927943 +SETD1A 9739 +SETD1B 23067 +SETD2 29072 +SETD3 84193 +SETD4 54093 +SETD4-AS1 105369295 +SETD5 55209 +SETD6 79918 +SETD6P1 106481727 +SETD7 80854 +SETD9 133383 +SETDB1 9869 +SETDB2 83852 +SETMAR 6419 +SETP1 100133314 +SETP2 326277 +SETP3 619349 +SETP4 642869 +SETP5 100130014 +SETP6 100419178 +SETP7 100873166 +SETP8 100128536 +SETP9 100129738 +SETP10 100287822 +SETP11 100419187 +SETP12 100419158 +SETP14 389168 +SETP15 100856877 +SETP16 649925 +SETP17 100130043 +SETP20 389217 +SETP21 100856878 +SETP22 642737 +SETSIP 646817 +SETX 23064 +SEZ6 124925 +SEZ6L 23544 +SEZ6L-AS1 105372974 +SEZ6L2 26470 +SF1 7536 +SF1-DT 118827805 +SF3A1 10291 +SF3A2 8175 +SF3A2P1 645852 +SF3A3 10946 +SF3A3P1 170548 +SF3A3P2 449645 +SF3B1 23451 +SF3B2 10992 +SF3B3 23450 +SF3B4 10262 +SF3B4P1 326276 +SF3B5 83443 +SF3B6 51639 +SFI1 9814 +SFMBT1 51460 +SFMBT2 57713 +SFN 2810 +SFPQ 6421 +SFPQP1 23758 +SFR1 119392 +SFR1P1 100130090 +SFR1P2 730792 +SFRP1 6422 +SFRP2 6423 +SFRP4 6424 +SFRP5 6425 +SFSWAP 6433 +SFT2D1 113402 +SFT2D2 375035 +SFT2D3 84826 +SFTA1P 207107 +SFTA2 389376 +SFTA3 253970 +SFTPA1 653509 +SFTPA2 729238 +SFTPA3P 100288405 +SFTPB 6439 +SFTPC 6440 +SFTPD 6441 +SFTPD-AS1 105419997 +SFXN1 94081 +SFXN2 118980 +SFXN3 81855 +SFXN4 119559 +SFXN4P1 100418906 +SFXN5 94097 +SGCA 6442 +SGCB 6443 +SGCD 6444 +SGCE 8910 +SGCEP1 474174 +SGCG 6445 +SGCZ 137868 +SGF29 112869 +SGIP1 84251 +SGK1 6446 +SGK2 10110 +SGK3 23678 +SGMS1 259230 +SGMS1-AS1 104355295 +SGMS2 166929 +SGO1 151648 +SGO1-AS1 100874028 +SGO1P1 100533666 +SGO1P2 100533661 +SGO2 151246 +SGPL1 8879 +SGPP1 81537 +SGPP2 130367 +SGSH 6448 +SGSM1 129049 +SGSM2 9905 +SGSM2-AS1 123706538 +SGSM3 27352 +SGSM3-AS1 107985538 +SGTA 6449 +SGTB 54557 +SH2B1 25970 +SH2B2 10603 +SH2B3 10019 +SH2D1A 4068 +SH2D1B 117157 +SH2D2A 9047 +SH2D3A 10045 +SH2D3C 10044 +SH2D4A 63898 +SH2D4B 387694 +SH2D5 400745 +SH2D6 284948 +SH2D7 646892 +SH3BGR 6450 +SH3BGRL 6451 +SH3BGRL2 83699 +SH3BGRL3 83442 +SH3BP1 23616 +SH3BP2 6452 +SH3BP4 23677 +SH3BP5 9467 +SH3BP5-AS1 100505696 +SH3BP5L 80851 +SH3D19 152503 +SH3D21 79729 +SH3GL1 6455 +SH3GL1P1 6458 +SH3GL1P2 6459 +SH3GL1P3 727736 +SH3GL2 6456 +SH3GL3 6457 +SH3GLB1 51100 +SH3GLB2 56904 +SH3KBP1 30011 +SH3PXD2A 9644 +SH3PXD2A-AS1 100505839 +SH3PXD2B 285590 +SH3RF1 57630 +SH3RF2 153769 +SH3RF3 344558 +SH3RF3-AS1 100287216 +SH3TC1 54436 +SH3TC2 79628 +SH3TC2-DT 255187 +SH3YL1 26751 +SHANK1 50944 +SHANK2 22941 +SHANK2-AS1 100874198 +SHANK2-AS2 100874199 +SHANK2-AS3 220070 +SHANK3 85358 +SHARPIN 81858 +SHB 6461 +SHBG 6462 +SHC1 6464 +SHC1P1 6465 +SHC1P2 6466 +SHC2 25759 +SHC3 53358 +SHC4 399694 +SHCBP1 79801 +SHCBP1L 81626 +SHD 56961 +SHE 126669 +SHF 90525 +SHFL 55337 +SHH 6469 +SHISA2 387914 +SHISA3 152573 +SHISA4 149345 +SHISA5 51246 +SHISA5P1 643043 +SHISA5P2 101928425 +SHISA6 388336 +SHISA7 729956 +SHISA8 440829 +SHISA9 729993 +SHISAL1 85352 +SHISAL2A 348378 +SHISAL2B 100132916 +SHKBP1 92799 +SHLD1 149840 +SHLD2 54537 +SHLD2P1 414241 +SHLD2P2 100128781 +SHLD2P3 439965 +SHLD3 112441434 +SHMT1 6470 +SHMT1P1 6471 +SHMT2 6472 +SHOC1 158401 +SHOC2 8036 +SHOX 6473 +SHOX2 6474 +SHPK 23729 +SHPRH 257218 +SHQ1 55164 +SHQ1P1 644451 +SHROOM1 134549 +SHROOM2 357 +SHROOM2P1 10031 +SHROOM3 57619 +SHROOM3-AS1 105377289 +SHROOM4 57477 +SHTN1 57698 +SI 6476 +SIAE 54414 +SIAH1 6477 +SIAH1P1 340571 +SIAH2 6478 +SIAH2-AS1 105374155 +SIAH3 283514 +SIDT1 54847 +SIDT1-AS1 100874030 +SIDT2 51092 +SIGIRR 59307 +SIGLEC1 6614 +SIGLEC5 8778 +SIGLEC6 946 +SIGLEC7 27036 +SIGLEC8 27181 +SIGLEC9 27180 +SIGLEC10 89790 +SIGLEC10-AS1 100129083 +SIGLEC10-AS2 127379722 +SIGLEC11 114132 +SIGLEC12 89858 +SIGLEC14 100049587 +SIGLEC15 284266 +SIGLEC16 400709 +SIGLEC17P 284367 +SIGLEC18P 114184 +SIGLEC20P 114192 +SIGLEC21P 114194 +SIGLEC22P 114195 +SIGLEC24P 114196 +SIGLEC25P 114198 +SIGLEC26P 114185 +SIGLEC27P 114186 +SIGLEC28P 114187 +SIGLEC29P 114188 +SIGLEC30P 114190 +SIGLEC31P 114189 +SIGLECL1 284369 +SIGMAR1 10280 +SIK1 150094 +SIK2 23235 +SIK3 23387 +SIKE1 80143 +SIL1 64374 +SILC1 150622 +SIM1 6492 +SIM1-AS1 102724406 +SIM2 6493 +SIMALR 105378020 +SIMC1 375484 +SIMC1P1 202181 +SIN3A 25942 +SIN3B 23309 +SINHCAF 58516 +SINHCAFP1 100421588 +SINHCAFP2 728115 +SINHCAFP3 646721 +SIPA1 6494 +SIPA1L1 26037 +SIPA1L1-AS1 102724015 +SIPA1L2 57568 +SIPA1L3 23094 +SIRLNT 112543493 +SIRPA 140885 +SIRPAP1 23755 +SIRPB1 10326 +SIRPB2 284759 +SIRPB3P 105369219 +SIRPD 128646 +SIRPG 55423 +SIRPG-AS1 101929010 +SIRT1 23411 +SIRT1-AS 106633813 +SIRT2 22933 +SIRT3 23410 +SIRT4 23409 +SIRT5 23408 +SIRT6 51548 +SIRT7 51547 +SIT1 27240 +SIVA1 10572 +SIX1 6495 +SIX2 10736 +SIX3 6496 +SIX3-AS1 100506108 +SIX4 51804 +SIX5 147912 +SIX6 4990 +SKA1 220134 +SKA2 348235 +SKA2P1 729012 +SKA3 221150 +SKAP1 8631 +SKAP1-AS1 110806289 +SKAP1-AS2 105371807 +SKAP2 8935 +SKI 6497 +SKIC2 6499 +SKIC3 9652 +SKIC8 80349 +SKIDA1 387640 +SKIL 6498 +SKINT1L 391037 +SKOR1 390598 +SKOR1-AS1 101929076 +SKOR2 652991 +SKP1 6500 +SKP1P1 6922 +SKP1P2 728622 +SKP1P3 100101119 +SKP2 6502 +SKP2P1 100130500 +SLA 6503 +SLA2 84174 +SLAIN1 122060 +SLAIN2 57606 +SLAMF1 6504 +SLAMF6 114836 +SLAMF6P1 100862852 +SLAMF7 57823 +SLAMF8 56833 +SLAMF9 89886 +SLBP 7884 +SLC1A1 6505 +SLC1A2 6506 +SLC1A2-AS1 107984324 +SLC1A2-AS2 128385377 +SLC1A3 6507 +SLC1A3-AS1 107986412 +SLC1A4 6509 +SLC1A5 6510 +SLC1A6 6511 +SLC1A7 6512 +SLC2A1 6513 +SLC2A1-DT 440584 +SLC2A2 6514 +SLC2A3 6515 +SLC2A3P1 100128062 +SLC2A3P2 391045 +SLC2A3P4 399495 +SLC2A4 6517 +SLC2A4RG 56731 +SLC2A5 6518 +SLC2A6 11182 +SLC2A7 155184 +SLC2A8 29988 +SLC2A9 56606 +SLC2A9-AS1 105374476 +SLC2A10 81031 +SLC2A11 66035 +SLC2A12 154091 +SLC2A13 114134 +SLC2A13P1 106480239 +SLC2A14 144195 +SLC2AXP1 399496 +SLC3A1 6519 +SLC3A2 6520 +SLC4A1 6521 +SLC4A1AP 22950 +SLC4A1APP1 100288436 +SLC4A1APP2 100422527 +SLC4A2 6522 +SLC4A3 6508 +SLC4A4 8671 +SLC4A5 57835 +SLC4A7 9497 +SLC4A8 9498 +SLC4A8-AS1 107984508 +SLC4A9 83697 +SLC4A10 57282 +SLC4A11 83959 +SLC5A1 6523 +SLC5A2 6524 +SLC5A3 6526 +SLC5A4 6527 +SLC5A4-AS1 110806273 +SLC5A4P1 100422550 +SLC5A5 6528 +SLC5A6 8884 +SLC5A7 60482 +SLC5A8 160728 +SLC5A9 200010 +SLC5A10 125206 +SLC5A11 115584 +SLC5A12 159963 +SLC6A1 6529 +SLC6A1-AS1 100874090 +SLC6A2 6530 +SLC6A3 6531 +SLC6A4 6532 +SLC6A5 9152 +SLC6A6 6533 +SLC6A6P1 54019 +SLC6A7 6534 +SLC6A8 6535 +SLC6A9 6536 +SLC6A10P 386757 +SLC6A11 6538 +SLC6A12 6539 +SLC6A12-AS1 101929384 +SLC6A13 6540 +SLC6A14 11254 +SLC6A14P1 100422432 +SLC6A14P2 100462652 +SLC6A14P3 100422417 +SLC6A15 55117 +SLC6A16 28968 +SLC6A17 388662 +SLC6A17-AS1 105378897 +SLC6A18 348932 +SLC6A19 340024 +SLC6A20 54716 +SLC6A21P 652969 +SLC7A1 6541 +SLC7A2 6542 +SLC7A2-IT1 +SLC7A3 84889 +SLC7A4 6545 +SLC7A5 8140 +SLC7A5P1 81893 +SLC7A5P2 387254 +SLC7A6 9057 +SLC7A6OS 84138 +SLC7A7 9056 +SLC7A8 23428 +SLC7A9 11136 +SLC7A10 56301 +SLC7A11 23657 +SLC7A11-AS1 641364 +SLC7A13 157724 +SLC7A14 57709 +SLC7A14-AS1 101928583 +SLC7A15P 100289450 +SLC8A1 6546 +SLC8A1-AS1 100128590 +SLC8A2 6543 +SLC8A3 6547 +SLC8B1 80024 +SLC9A1 6548 +SLC9A2 6549 +SLC9A3 6550 +SLC9A3-AS1 100288152 +SLC9A3-OT1 25845 +SLC9A3P1 6551 +SLC9A3P2 128997 +SLC9A3P3 728990 +SLC9A3R1-AS1 105371893 +SLC9A4 389015 +SLC9A5 6553 +SLC9A6 10479 +SLC9A7 84679 +SLC9A7P1 121456 +SLC9A8 23315 +SLC9A9 285195 +SLC9A9-AS1 100885796 +SLC9A9-AS2 106480356 +SLC9B1 150159 +SLC9B1P1 100128190 +SLC9B1P2 389000 +SLC9B1P3 100421008 +SLC9B1P4 644768 +SLC9B1P5 100533705 +SLC9B2 133308 +SLC9C1 285335 +SLC9C2 284525 +SLC10A1 6554 +SLC10A2 6555 +SLC10A3 8273 +SLC10A4 201780 +SLC10A5 347051 +SLC10A5P1 100631269 +SLC10A6 345274 +SLC10A7 84068 +SLC11A1 6556 +SLC11A2 4891 +SLC12A1 6557 +SLC12A2 6558 +SLC12A2-DT 644873 +SLC12A3 6559 +SLC12A4 6560 +SLC12A5 57468 +SLC12A5-AS1 109729184 +SLC12A6 9990 +SLC12A7 10723 +SLC12A8 84561 +SLC12A9 56996 +SLC12A9-AS1 105375430 +SLC13A1 6561 +SLC13A2 9058 +SLC13A3 64849 +SLC13A4 26266 +SLC13A5 284111 +SLC14A1 6563 +SLC14A2 8170 +SLC14A2-AS1 101927980 +SLC15A1 6564 +SLC15A2 6565 +SLC15A3 51296 +SLC15A4 121260 +SLC15A5 729025 +SLC16A1 6566 +SLC16A1-AS1 100506392 +SLC16A1P1 100422547 +SLC16A2 6567 +SLC16A3 9123 +SLC16A4 9122 +SLC16A4-AS1 123706514 +SLC16A5 9121 +SLC16A6 9120 +SLC16A6P1 440459 +SLC16A7 9194 +SLC16A8 23539 +SLC16A9 220963 +SLC16A10 117247 +SLC16A11 162515 +SLC16A12 387700 +SLC16A12-AS1 101926906 +SLC16A13 201232 +SLC16A14 151473 +SLC16A14P1 100128685 +SLC17A1 6568 +SLC17A2 10246 +SLC17A3 10786 +SLC17A4 10050 +SLC17A5 26503 +SLC17A6 57084 +SLC17A6-DT 120883619 +SLC17A7 57030 +SLC17A8 246213 +SLC17A9 63910 +SLC18A1 6570 +SLC18A2 6571 +SLC18A2-AS1 105378500 +SLC18A3 6572 +SLC18B1 116843 +SLC19A1 6573 +SLC19A2 10560 +SLC19A3 80704 +SLC20A1 6574 +SLC20A1-DT 400999 +SLC20A1P1 192127 +SLC20A1P2 192128 +SLC20A1P3 646052 +SLC20A2 6575 +SLC22A1 6580 +SLC22A2 6582 +SLC22A3 6581 +SLC22A4 6583 +SLC22A5 6584 +SLC22A6 9356 +SLC22A7 10864 +SLC22A8 9376 +SLC22A9 114571 +SLC22A10 387775 +SLC22A11 55867 +SLC22A12 116085 +SLC22A13 9390 +SLC22A14 9389 +SLC22A15 55356 +SLC22A16 85413 +SLC22A17 51310 +SLC22A18 5002 +SLC22A18AS 5003 +SLC22A20P 440044 +SLC22A23 63027 +SLC22A24 283238 +SLC22A25 387601 +SLC22A31 146429 +SLC23A1 9963 +SLC23A2 9962 +SLC23A3 151295 +SLC23A4P 641842 +SLC24A1 9187 +SLC24A2 25769 +SLC24A3 57419 +SLC24A3-AS1 100130264 +SLC24A4 123041 +SLC24A5 283652 +SLC25A1 6576 +SLC25A1P1 100131457 +SLC25A1P2 100133079 +SLC25A1P3 644159 +SLC25A1P4 100132355 +SLC25A1P5 642290 +SLC25A2 83884 +SLC25A3 5250 +SLC25A3P1 163742 +SLC25A3P2 100128618 +SLC25A3P3 100422606 +SLC25A4 291 +SLC25A5 292 +SLC25A5-AS1 100303728 +SLC25A5P1 266623 +SLC25A5P2 344371 +SLC25A5P3 222005 +SLC25A5P4 100131027 +SLC25A5P5 442525 +SLC25A5P6 644042 +SLC25A5P7 442255 +SLC25A5P8 392301 +SLC25A5P9 100133074 +SLC25A6 293 +SLC25A6P1 128790 +SLC25A6P2 138412 +SLC25A6P3 100422686 +SLC25A6P4 100422690 +SLC25A6P5 100129319 +SLC25A6P6 100128312 +SLC25A10 1468 +SLC25A11 8402 +SLC25A12 8604 +SLC25A13 10165 +SLC25A14 9016 +SLC25A14P1 100288343 +SLC25A15 10166 +SLC25A15P1 100422624 +SLC25A15P2 100874522 +SLC25A15P3 100422635 +SLC25A15P4 100422636 +SLC25A15P5 100422642 +SLC25A16 8034 +SLC25A17 10478 +SLC25A18 83733 +SLC25A18P1 106480776 +SLC25A19 60386 +SLC25A20 788 +SLC25A20P1 789 +SLC25A21 89874 +SLC25A21-AS1 100129794 +SLC25A22 79751 +SLC25A23 79085 +SLC25A24 29957 +SLC25A24P1 727941 +SLC25A24P2 100422608 +SLC25A25 114789 +SLC25A25-AS1 100289019 +SLC25A26 115286 +SLC25A27 9481 +SLC25A28 81894 +SLC25A28-DT 123466211 +SLC25A29 123096 +SLC25A30 253512 +SLC25A30-AS1 100874259 +SLC25A31 83447 +SLC25A32 81034 +SLC25A33 84275 +SLC25A34 284723 +SLC25A34-AS1 110806303 +SLC25A35 399512 +SLC25A36 55186 +SLC25A36P1 106480240 +SLC25A37 51312 +SLC25A38 54977 +SLC25A38P1 441915 +SLC25A39 51629 +SLC25A39P1 100420877 +SLC25A39P2 107126289 +SLC25A40 55972 +SLC25A41 284427 +SLC25A42 284439 +SLC25A43 203427 +SLC25A44 9673 +SLC25A45 283130 +SLC25A46 91137 +SLC25A47 283600 +SLC25A47P1 105369316 +SLC25A48 153328 +SLC25A48-AS1 340074 +SLC25A51 92014 +SLC25A51P1 442229 +SLC25A51P2 645423 +SLC25A51P3 100128119 +SLC25A51P4 494141 +SLC25A52 147407 +SLC25A53 401612 +SLC25A53P1 644261 +SLC26A1 10861 +SLC26A2 1836 +SLC26A3 1811 +SLC26A4 5172 +SLC26A4-AS1 286002 +SLC26A5 375611 +SLC26A5-AS1 101927870 +SLC26A6 65010 +SLC26A7 115111 +SLC26A8 116369 +SLC26A9 115019 +SLC26A9-AS1 103021296 +SLC26A10P 65012 +SLC26A11 284129 +SLC27A1 376497 +SLC27A2 11001 +SLC27A3 11000 +SLC27A4 10999 +SLC27A5 10998 +SLC27A6 28965 +SLC28A1 9154 +SLC28A2 9153 +SLC28A2-AS1 101928414 +SLC28A3 64078 +SLC28A3-AS1 105376116 +SLC29A1 2030 +SLC29A2 3177 +SLC29A3 55315 +SLC29A4 222962 +SLC29A4P1 402509 +SLC29A4P2 100132308 +SLC30A1 7779 +SLC30A2 7780 +SLC30A3 7781 +SLC30A4 7782 +SLC30A4-AS1 105376714 +SLC30A5 64924 +SLC30A6 55676 +SLC30A6-DT 118568811 +SLC30A6P1 100422091 +SLC30A7 148867 +SLC30A8 169026 +SLC30A9 10463 +SLC30A10 55532 +SLC31A1 1317 +SLC31A1P1 117151 +SLC31A2 1318 +SLC32A1 140679 +SLC33A1 9197 +SLC34A1 6569 +SLC34A2 10568 +SLC34A3 142680 +SLC35A1 10559 +SLC35A2 7355 +SLC35A3 23443 +SLC35A4 113829 +SLC35A5 55032 +SLC35B1 10237 +SLC35B2 347734 +SLC35B3 51000 +SLC35B4 84912 +SLC35C1 55343 +SLC35C2 51006 +SLC35C2P1 100129483 +SLC35D1 23169 +SLC35D2 11046 +SLC35D3 340146 +SLC35E1 79939 +SLC35E1P1 727991 +SLC35E2A 9906 +SLC35E2B 728661 +SLC35E3 55508 +SLC35E4 339665 +SLC35F1 222553 +SLC35F2 54733 +SLC35F3 148641 +SLC35F3-AS1 102724100 +SLC35F4 341880 +SLC35F5 80255 +SLC35F6 54978 +SLC35G1 159371 +SLC35G2 80723 +SLC35G3 146861 +SLC35G4 646000 +SLC35G5 83650 +SLC35G6 643664 +SLC36A1 206358 +SLC36A2 153201 +SLC36A3 285641 +SLC36A4 120103 +SLC37A1 54020 +SLC37A2 219855 +SLC37A3 84255 +SLC37A4 2542 +SLC38A1 81539 +SLC38A2 54407 +SLC38A2-AS1 102723757 +SLC38A3 10991 +SLC38A4 55089 +SLC38A4-AS1 100288798 +SLC38A5 92745 +SLC38A6 145389 +SLC38A7 55238 +SLC38A8 146167 +SLC38A9 153129 +SLC38A10 124565 +SLC38A11 151258 +SLC39A1 27173 +SLC39A2 29986 +SLC39A3 29985 +SLC39A4 55630 +SLC39A5 283375 +SLC39A6 25800 +SLC39A7 7922 +SLC39A8 64116 +SLC39A9 55334 +SLC39A10 57181 +SLC39A11 201266 +SLC39A12 221074 +SLC39A12-AS1 100129213 +SLC39A13 91252 +SLC39A13-AS1 127138868 +SLC39A14 23516 +SLC40A1 30061 +SLC41A1 254428 +SLC41A2 84102 +SLC41A3 54946 +SLC41A3-AS1 112267887 +SLC43A1 8501 +SLC43A2 124935 +SLC43A3 29015 +SLC44A1 23446 +SLC44A2 57153 +SLC44A3 126969 +SLC44A3-AS1 101928079 +SLC44A3P1 100420669 +SLC44A4 80736 +SLC44A5 204962 +SLC45A1 50651 +SLC45A2 51151 +SLC45A3 85414 +SLC45A4 57210 +SLC45A4-AS1 105375787 +SLC46A1 113235 +SLC46A2 57864 +SLC46A2-AS1 127379751 +SLC46A3 283537 +SLC47A1 55244 +SLC47A1P1 107075108 +SLC47A1P2 112451549 +SLC47A2 146802 +SLC48A1 55652 +SLC49A3 84179 +SLC49A4 84925 +SLC50A1 55974 +SLC51A 200931 +SLC51B 123264 +SLC52A1 55065 +SLC52A2 79581 +SLC52A3 113278 +SLC66A1 54896 +SLC66A1L 152078 +SLC66A2 80148 +SLC66A2P1 106479032 +SLC66A2P2 100127906 +SLC66A3 130814 +SLCO1A2 6579 +SLCO1B1 10599 +SLCO1B3 28234 +SLCO1B3-SLCO1B7 115072896 +SLCO1B7 338821 +SLCO1C1 53919 +SLCO2A1 6578 +SLCO2B1 11309 +SLCO3A1 28232 +SLCO4A1 28231 +SLCO4A1-AS1 100127888 +SLCO4A1-AS2 101928465 +SLCO4C1 353189 +SLCO5A1 81796 +SLCO5A1-AS1 121233925 +SLCO6A1 133482 +SLF1 84250 +SLF2 55719 +SLFN5 162394 +SLFN11 91607 +SLFN12 55106 +SLFN12L 100506736 +SLFN13 146857 +SLFN14 342618 +SLFNL1 200172 +SLFNL1-AS1 100507178 +SLIRP 81892 +SLIRPP1 100287757 +SLIRPP2 100913179 +SLIT1 6585 +SLIT1-AS1 100505540 +SLIT2 9353 +SLIT2-IT1 100505893 +SLIT3 6586 +SLIT3-AS1 728095 +SLIT3-AS2 101927969 +SLITRK1 114798 +SLITRK2 84631 +SLITRK3 22865 +SLITRK4 139065 +SLITRK5 26050 +SLITRK6 84189 +SLK 9748 +SLMAP 7871 +SLN 6588 +SLPI 6590 +SLTM 79811 +SLU7 10569 +SLURP1 57152 +SLURP2 432355 +SLX1A 548593 +SLX1A-SULT1A3 100526830 +SLX1B 79008 +SLX1B-SULT1A4 100526831 +SLX4 84464 +SLX4IP 128710 +SLX9 85395 +SMAD1 4086 +SMAD1-AS1 104326058 +SMAD1-AS2 101927659 +SMAD2 4087 +SMAD3 4088 +SMAD3-AS1 128266842 +SMAD3-DT 102723493 +SMAD4 4089 +SMAD5 4090 +SMAD5-AS1 9597 +SMAD6 4091 +SMAD7 4092 +SMAD9 4093 +SMAD9-IT1 100874072 +SMAGP 57228 +SMANTIS 107985770 +SMAP1 60682 +SMAP2 64744 +SMARCA1 6594 +SMARCA2 6595 +SMARCA2-AS1 123706518 +SMARCA4 6597 +SMARCA5 8467 +SMARCA5-AS1 100128055 +SMARCAD1 56916 +SMARCAD1-DT 101929210 +SMARCAL1 50485 +SMARCAL1-AS1 107985985 +SMARCB1 6598 +SMARCC1 6599 +SMARCC2 6601 +SMARCD1 6602 +SMARCD2 6603 +SMARCD3 6604 +SMARCE1 6605 +SMARCE1P1 100271884 +SMARCE1P2 442233 +SMARCE1P3 401744 +SMARCE1P4 642879 +SMARCE1P5 400129 +SMARCE1P6 646196 +SMARCE1P7 106481716 +SMASR 102723481 +SMBD1P 111674481 +SMC1A 8243 +SMC1B 27127 +SMC2 10592 +SMC2-DT 101928550 +SMC3 9126 +SMC3P1 550644 +SMC4 10051 +SMC4P1 100421125 +SMC5 23137 +SMC5-DT 100507299 +SMC6 79677 +SMCHD1 23347 +SMCO1 255798 +SMCO2 341346 +SMCO3 440087 +SMCO4 56935 +SMCO4P1 728675 +SMCP 4184 +SMCR2 105371564 +SMCR5 140771 +SMCR8 140775 +SMDT1 91689 +SMG1 23049 +SMG1-DT 107984844 +SMG1P1 641298 +SMG1P2 440354 +SMG1P3 100271836 +SMG1P4 100507526 +SMG1P5 595101 +SMG1P6 100422558 +SMG1P7 100506060 +SMG5 23381 +SMG6 23293 +SMG6-IT1 53400 +SMG7 9887 +SMG7-AS1 284649 +SMG8 55181 +SMG9 56006 +SMILR 105375734 +SMIM1 388588 +SMIM2 79024 +SMIM2-AS1 101929212 +SMIM2-IT1 100874377 +SMIM3 85027 +SMIM5 643008 +SMIM6 100130933 +SMIM7 79086 +SMIM7P1 100130842 +SMIM8 57150 +SMIM9 100132963 +SMIM10 644538 +SMIM10L1 100129361 +SMIM10L2A 399668 +SMIM10L2B 644596 +SMIM10L2B-AS1 100287728 +SMIM11 54065 +SMIM11P1 100127905 +SMIM11P2 127379740 +SMIM12 113444 +SMIM12P1 100288503 +SMIM13 221710 +SMIM14 201895 +SMIM14-DT 105374419 +SMIM15 643155 +SMIM15-AS1 101928630 +SMIM15P1 107985631 +SMIM15P2 117751734 +SMIM17 147670 +SMIM18 100507341 +SMIM19 114926 +SMIM20 389203 +SMIM21 284274 +SMIM22 440335 +SMIM23 644994 +SMIM24 284422 +SMIM26 388789 +SMIM27 100129250 +SMIM28 110806279 +SMIM29 221491 +SMIM30 401397 +SMIM31 100505989 +SMIM32 389332 +SMIM33 111064649 +SMIM34 388820 +SMIM35 100526771 +SMIM36 101927367 +SMIM38 107984345 +SMIM39 113523639 +SMIM40 113523636 +SMIM41 113523638 +SMIM42 117981789 +SMIM43 132332 +SMIM44 122405565 +SMIM45 339674 +SMIM46 127138866 +SMIM47 105372440 +SMKR1 100287482 +SMLR1 100507203 +SMN1 6606 +SMN2 6607 +SMNDC1 10285 +SMO 6608 +SMOC1 64093 +SMOC2 64094 +SMOX 54498 +SMPD1 6609 +SMPD2 6610 +SMPD3 55512 +SMPD4 55627 +SMPD4BP 150776 +SMPD4P1 645280 +SMPD4P2 441654 +SMPD5 392275 +SMPDL3A 10924 +SMPDL3B 27293 +SMPX 23676 +SMR3A 26952 +SMR3B 10879 +SMS 6611 +SMSP1 100419053 +SMTN 6525 +SMTNL1 219537 +SMTNL2 342527 +SMU1 55234 +SMU1P1 246784 +SMUG1 23583 +SMUG1-AS1 105369776 +SMUG1P1 100129143 +SMURF1 57154 +SMURF2 64750 +SMURF2P1 107133516 +SMYD1 150572 +SMYD2 56950 +SMYD3 64754 +SMYD3-AS1 101928089 +SMYD3-IT1 106478975 +SMYD4 114826 +SMYD5 10322 +SNAI1 6615 +SNAI1P1 10415 +SNAI2 6591 +SNAI3 333929 +SNAI3-AS1 197187 +SNAP23 8773 +SNAP23P1 101290500 +SNAP25 6616 +SNAP25-AS1 100131208 +SNAP29 9342 +SNAP47 116841 +SNAP47-AS1 100885800 +SNAP91 9892 +SNAPC1 6617 +SNAPC2 6618 +SNAPC3 6619 +SNAPC4 6621 +SNAPC5 10302 +SNAPC5P1 100750245 +SNAPIN 23557 +SNAR-A1 100126798 +SNAR-A2 100126799 +SNAR-A3 100169951 +SNAR-A4 100169956 +SNAR-A5 100169952 +SNAR-A6 100169957 +SNAR-A7 100169953 +SNAR-A8 100169958 +SNAR-A9 100169955 +SNAR-A10 100170216 +SNAR-A11 100169954 +SNAR-A12 100126800 +SNAR-A13 100169959 +SNAR-A14 100191063 +SNAR-B1 100170224 +SNAR-B2 100170217 +SNAR-C1 100170225 +SNAR-C2 100170218 +SNAR-C3 100170226 +SNAR-C4 100170219 +SNAR-C5 100170223 +SNAR-D 100170227 +SNAR-E 100170220 +SNAR-F 100126781 +SNAR-G1 100126780 +SNAR-G2 100170228 +SNAR-H 100170221 +SNAR-I 100170222 +SNCA 6622 +SNCA-AS1 644248 +SNCAIP 9627 +SNCB 6620 +SNCG 6623 +SND1 27044 +SND1-DT 121832805 +SND1-IT1 27099 +SNED1 25992 +SNED1-AS1 105373970 +SNF8 11267 +SNF8P1 646794 +SNHG1 23642 +SNHG3 8420 +SNHG4 724102 +SNHG5 387066 +SNHG6 641638 +SNHG7 84973 +SNHG8 100093630 +SNHG9 735301 +SNHG10 283596 +SNHG11 128439 +SNHG12 85028 +SNHG14 104472715 +SNHG15 285958 +SNHG16 100507246 +SNHG17 388796 +SNHG18 100505806 +SNHG19 100507303 +SNHG20 654434 +SNHG21 100505616 +SNHG22 103091864 +SNHG25 105376843 +SNHG26 109729180 +SNHG27 101927305 +SNHG28 284677 +SNHG29 125144 +SNHG30 105371743 +SNHG31 101928103 +SNHG32 50854 +SNHG33 100505687 +SNIP1 79753 +SNN 8303 +SNORA1 677792 +SNORA1B 109617001 +SNORA2A 677793 +SNORA2B 677794 +SNORA2C 677815 +SNORA3A 619562 +SNORA3B 677826 +SNORA3C 109616997 +SNORA4 619568 +SNORA5A 654319 +SNORA5B 677795 +SNORA5C 677796 +SNORA6 574040 +SNORA7A 619563 +SNORA7B 677797 +SNORA8 654320 +SNORA9 677798 +SNORA9B 109616977 +SNORA10 574042 +SNORA10B 109616960 +SNORA11 677799 +SNORA11B 100124539 +SNORA11C 100124540 +SNORA11D 100124541 +SNORA11E 101340250 +SNORA11F 109617000 +SNORA11G 109616961 +SNORA12 677800 +SNORA13 654322 +SNORA14A 677801 +SNORA14B 677802 +SNORA15 677803 +SNORA15B-1 109616962 +SNORA15B-2 109617022 +SNORA16A 692073 +SNORA16B 692157 +SNORA17A 677804 +SNORA17B 677824 +SNORA18 677805 +SNORA19 641451 +SNORA20 677806 +SNORA20B 109616963 +SNORA21 619505 +SNORA21B 109617002 +SNORA22 677807 +SNORA22B 109616964 +SNORA22C 109616965 +SNORA23 677808 +SNORA24 677809 +SNORA24B 109617003 +SNORA25 684959 +SNORA25B 109623459 +SNORA26 677810 +SNORA27 619499 +SNORA28 677811 +SNORA29 677812 +SNORA30 677813 +SNORA30B 109616992 +SNORA31 677814 +SNORA31B 109616966 +SNORA32 692063 +SNORA33 594839 +SNORA35 677816 +SNORA35B 109617004 +SNORA36A 677817 +SNORA36B 677818 +SNORA36C 100124535 +SNORA37 677819 +SNORA38 677820 +SNORA38B 100124536 +SNORA40 677822 +SNORA40B 109616967 +SNORA40C 109616968 +SNORA41 619569 +SNORA41B 109617005 +SNORA44 677825 +SNORA46 677827 +SNORA47 677828 +SNORA48 652965 +SNORA48B 109616969 +SNORA49 677829 +SNORA50A 677830 +SNORA50B 109616998 +SNORA50C 677842 +SNORA50D 109616958 +SNORA51 677831 +SNORA52 619565 +SNORA53 677832 +SNORA54 677833 +SNORA55 677834 +SNORA56 677835 +SNORA57 692158 +SNORA58 677836 +SNORA58B 109617023 +SNORA59A 677885 +SNORA59B 677882 +SNORA60 677837 +SNORA61 677838 +SNORA62 6044 +SNORA63 6043 +SNORA63B 109617006 +SNORA63C 109616970 +SNORA63D 109616971 +SNORA63E 109617007 +SNORA64 26784 +SNORA65 26783 +SNORA66 26782 +SNORA67 26781 +SNORA68 26780 +SNORA68B 109616972 +SNORA69 26779 +SNORA70 26778 +SNORA70B 100124537 +SNORA70C 100124538 +SNORA70D 100379141 +SNORA70E 100379250 +SNORA70F 100337591 +SNORA70G 100379132 +SNORA70H 109616993 +SNORA70I 109617008 +SNORA70J 109616973 +SNORA71A 26777 +SNORA71B 26776 +SNORA71C 677839 +SNORA71D 677840 +SNORA71E 677821 +SNORA72 26775 +SNORA73A 6080 +SNORA73B 26768 +SNORA74A 26821 +SNORA74B 677841 +SNORA74C-1 109616974 +SNORA74C-2 109617009 +SNORA74D 109616975 +SNORA75 654321 +SNORA75B 109616994 +SNORA77 677843 +SNORA77B 109617010 +SNORA78 677844 +SNORA79 677845 +SNORA79B 109616976 +SNORA80A 677846 +SNORA80B 100302743 +SNORA80C 109616959 +SNORA80D 109616999 +SNORA80E 677823 +SNORA81 677847 +SNORA84 100124534 +SNORA86 106633814 +SNORA87 106635520 +SNORA88 106635521 +SNORA89 106635522 +SNORA90 106635523 +SNORA91 106635524 +SNORA92 106635525 +SNORA93 106635526 +SNORA94 106635528 +SNORA95 106635529 +SNORA98 106635530 +SNORA99 106635531 +SNORA100 106635532 +SNORA101A 107399301 +SNORA101B 107399303 +SNORA103 106635533 +SNORA104 106635534 +SNORA105A 106635539 +SNORA105B 106635540 +SNORA105C 106635541 +SNORA107 106635542 +SNORA108 106635543 +SNORA109 106635544 +SNORA110 106635545 +SNORA111 106635546 +SNORA112 109623481 +SNORA113 109623461 +SNORA114 109623488 +SNORA115 109623482 +SNORA116 109623462 +SNORA117 109623463 +SNORA118 109623483 +SNORA119 109623464 +SNORA120 109729112 +SNORC 389084 +SNORD1A 677848 +SNORD1B 677849 +SNORD1C 677850 +SNORD2 619567 +SNORD3A 780851 +SNORD3B-1 26851 +SNORD3B-2 780852 +SNORD3C 780853 +SNORD3D 780854 +SNORD3E 109617015 +SNORD3F 109616983 +SNORD3G 109616984 +SNORD3H 109617016 +SNORD3I 109616996 +SNORD3J 109616985 +SNORD3K 109617017 +SNORD3P1 6068 +SNORD3P3 26843 +SNORD3P4 26842 +SNORD4A 26773 +SNORD4B 26772 +SNORD5 692072 +SNORD6 692075 +SNORD7 692076 +SNORD8 319103 +SNORD9 692053 +SNORD10 652966 +SNORD11 692058 +SNORD11B 100113392 +SNORD12 692057 +SNORD12B 100113393 +SNORD12C 26765 +SNORD13 692084 +SNORD13B-1 109617019 +SNORD13B-2 109617021 +SNORD13C 109616989 +SNORD13D 109616990 +SNORD13E 109617020 +SNORD13F 109616986 +SNORD13G 109616987 +SNORD13H 109617018 +SNORD13I 109616988 +SNORD13J 109617025 +SNORD13P1 6076 +SNORD13P2 6077 +SNORD13P3 6078 +SNORD14A 26822 +SNORD14B 85388 +SNORD14C 85389 +SNORD14D 85390 +SNORD14E 85391 +SNORD15A 6079 +SNORD15B 114599 +SNORD16 595097 +SNORD17 692086 +SNORD18A 595098 +SNORD18B 595099 +SNORD18C 595100 +SNORD19 692089 +SNORD19B 100113381 +SNORD19C 109616991 +SNORD20 6082 +SNORD21 6083 +SNORD22 9304 +SNORD23 692091 +SNORD24 26820 +SNORD25 9303 +SNORD26 9302 +SNORD27 9301 +SNORD28 9300 +SNORD28B 109617011 +SNORD29 9297 +SNORD30 9299 +SNORD31 9298 +SNORD31B 109616978 +SNORD32A 26819 +SNORD32B 692092 +SNORD33 26818 +SNORD34 26817 +SNORD35A 26816 +SNORD35B 84546 +SNORD36A 26815 +SNORD36B 26814 +SNORD36C 26813 +SNORD37 26812 +SNORD38A 94162 +SNORD38B 94163 +SNORD38C 109617024 +SNORD38D 109616979 +SNORD41 26810 +SNORD42A 26809 +SNORD42B 26808 +SNORD43 26807 +SNORD44 26806 +SNORD45A 26805 +SNORD45B 26804 +SNORD45C 692085 +SNORD46 94161 +SNORD47 26802 +SNORD48 26801 +SNORD49A 26800 +SNORD49B 692087 +SNORD50A 26799 +SNORD50B 692088 +SNORD51 26798 +SNORD52 26797 +SNORD53 26796 +SNORD53B 109617012 +SNORD54 26795 +SNORD55 26811 +SNORD56 26793 +SNORD56B 319139 +SNORD57 26792 +SNORD58A 26791 +SNORD58B 26790 +SNORD58C 100124516 +SNORD59A 26789 +SNORD59B 692090 +SNORD60 26788 +SNORD61 26787 +SNORD62A 26786 +SNORD62B 692093 +SNORD63 26785 +SNORD63B 109617013 +SNORD64 347686 +SNORD65 692106 +SNORD65B 109616980 +SNORD65C 109616981 +SNORD66 692107 +SNORD67 692108 +SNORD68 606500 +SNORD69 692109 +SNORD70 692110 +SNORD70B 109616995 +SNORD71 692111 +SNORD72 619564 +SNORD73A 8944 +SNORD73B 114655 +SNORD74 619498 +SNORD74B 109617014 +SNORD75 692195 +SNORD76 692196 +SNORD77 692197 +SNORD77B 109616982 +SNORD78 692198 +SNORD79 26770 +SNORD80 26774 +SNORD81 26769 +SNORD82 25826 +SNORD83A 116937 +SNORD83B 116938 +SNORD84 692199 +SNORD86 692201 +SNORD87 641648 +SNORD88A 692202 +SNORD88B 692203 +SNORD88C 692204 +SNORD89 692205 +SNORD90 692206 +SNORD91A 692207 +SNORD91B 692208 +SNORD92 692209 +SNORD93 692210 +SNORD94 692225 +SNORD95 619570 +SNORD96A 619571 +SNORD96B 692226 +SNORD97 692223 +SNORD98 692211 +SNORD99 692212 +SNORD100 594838 +SNORD101 594837 +SNORD102 26771 +SNORD103A 692234 +SNORD103B 692235 +SNORD103C 692200 +SNORD104 692227 +SNORD105 692229 +SNORD105B 100113382 +SNORD107 91380 +SNORD108 338427 +SNORD109A 338428 +SNORD109B 338429 +SNORD110 692213 +SNORD111 692214 +SNORD111B 100113402 +SNORD112 692215 +SNORD113-1 767561 +SNORD113-2 767562 +SNORD113-3 767563 +SNORD113-4 767564 +SNORD113-5 767565 +SNORD113-6 767566 +SNORD113-7 767567 +SNORD113-8 767568 +SNORD113-9 767569 +SNORD114-1 767577 +SNORD114-2 767578 +SNORD114-3 767579 +SNORD114-4 767580 +SNORD114-5 767581 +SNORD114-6 767582 +SNORD114-7 767583 +SNORD114-8 767584 +SNORD114-9 767585 +SNORD114-10 767588 +SNORD114-11 767589 +SNORD114-12 767590 +SNORD114-13 767591 +SNORD114-14 767592 +SNORD114-15 767593 +SNORD114-16 767594 +SNORD114-17 767595 +SNORD114-18 767596 +SNORD114-19 767597 +SNORD114-20 767598 +SNORD114-21 767599 +SNORD114-22 767600 +SNORD114-23 767603 +SNORD114-24 767604 +SNORD114-25 767605 +SNORD114-26 767606 +SNORD114-27 767608 +SNORD114-28 767609 +SNORD114-29 767610 +SNORD114-30 767611 +SNORD114-31 767612 +SNORD115-1 338433 +SNORD115-2 100033437 +SNORD115-3 100033440 +SNORD115-4 100033441 +SNORD115-5 100033442 +SNORD115-6 100033443 +SNORD115-7 100033444 +SNORD115-8 100033445 +SNORD115-9 100033446 +SNORD115-10 100033447 +SNORD115-11 100033448 +SNORD115-12 100033449 +SNORD115-13 100033450 +SNORD115-14 100033451 +SNORD115-15 100033453 +SNORD115-16 100033454 +SNORD115-17 100033455 +SNORD115-18 100033456 +SNORD115-19 100033458 +SNORD115-20 100033460 +SNORD115-21 100033603 +SNORD115-22 100033799 +SNORD115-23 100033800 +SNORD115-24 100036563 +SNORD115-25 100033801 +SNORD115-26 100033802 +SNORD115-27 100036564 +SNORD115-28 100036565 +SNORD115-29 100033803 +SNORD115-30 100033804 +SNORD115-31 100033805 +SNORD115-32 100033806 +SNORD115-33 100033807 +SNORD115-34 100033808 +SNORD115-35 100033809 +SNORD115-36 100033810 +SNORD115-37 100033811 +SNORD115-38 100033812 +SNORD115-39 100033813 +SNORD115-40 100033814 +SNORD115-41 100033815 +SNORD115-42 100033816 +SNORD115-43 100033817 +SNORD115-44 100033818 +SNORD115-45 100036566 +SNORD115-46 100873857 +SNORD115-47 100036567 +SNORD115-48 100033822 +SNORD116-1 100033413 +SNORD116-2 100033414 +SNORD116-3 100033415 +SNORD116-4 100033416 +SNORD116-5 100033417 +SNORD116-6 100033418 +SNORD116-7 100033419 +SNORD116-8 100033420 +SNORD116-9 100033421 +SNORD116-10 100033422 +SNORD116-11 100033423 +SNORD116-12 100033424 +SNORD116-13 100033425 +SNORD116-14 100033426 +SNORD116-15 100033427 +SNORD116-16 100033428 +SNORD116-17 100033429 +SNORD116-18 100033430 +SNORD116-19 727708 +SNORD116-20 100033431 +SNORD116-21 100033432 +SNORD116-22 100033433 +SNORD116-23 100033434 +SNORD116-24 100033435 +SNORD116-25 100033436 +SNORD116-26 100033438 +SNORD116-27 100033439 +SNORD116-28 100033820 +SNORD116-29 100033821 +SNORD116-30 100873856 +SNORD117 692233 +SNORD118 727676 +SNORD119 100113378 +SNORD121A 100113379 +SNORD121B 101340252 +SNORD123 100113384 +SNORD124 101340251 +SNORD125 100113380 +SNORD126 100113391 +SNORD127 100113389 +SNORD128 106632271 +SNORD129 106635547 +SNORD130 106635548 +SNORD131 106635549 +SNORD132 106635550 +SNORD133 106633800 +SNORD134 106633803 +SNORD135 106633804 +SNORD136 106633805 +SNORD137 106635615 +SNORD138 109623460 +SNORD139 116936 +SNORD140 106635682 +SNORD141A 106635683 +SNORD141B 106635684 +SNORD142 106633806 +SNORD143 106633808 +SNORD144 106633809 +SNORD145 109623472 +SNORD146 109623484 +SNORD147 109623465 +SNORD148 109623466 +SNORD149 109623485 +SNORD150 109623467 +SNORD151 109623468 +SNORD152 109623473 +SNORD153 109623486 +SNORD154 109623474 +SNORD155 109623450 +SNORD156 109623475 +SNORD157 109623451 +SNORD158 109623470 +SNORD159 109623452 +SNORD160 109623476 +SNORD161 109623453 +SNORD162 109623454 +SNORD163 109623477 +SNORD164 109623487 +SNORD165 109623455 +SNORD166 109623478 +SNORD167 109623456 +SNORD168 109623457 +SNORD169 109623479 +SNORD170 109623458 +SNORD172 109623471 +SNORD173 109623480 +SNORD175 109623469 +SNPH 9751 +SNRK 54861 +SNRK-AS1 100873954 +SNRNP25 79622 +SNRNP27 11017 +SNRNP35 11066 +SNRNP40 9410 +SNRNP40P1 751837 +SNRNP48 154007 +SNRNP70 6625 +SNRNP200 23020 +SNRPA 6626 +SNRPA1 6627 +SNRPA1-DT 120766138 +SNRPA1P1 150478 +SNRPB 6628 +SNRPB2 6629 +SNRPB2P1 100421672 +SNRPBP1 100499258 +SNRPC 6631 +SNRPCP1 100288596 +SNRPCP2 100129566 +SNRPCP3 100128469 +SNRPCP4 100310848 +SNRPCP5 106480290 +SNRPCP6 100310856 +SNRPCP7 100310852 +SNRPCP8 100310851 +SNRPCP9 100310853 +SNRPCP10 106481701 +SNRPCP11 100310850 +SNRPCP12 100310854 +SNRPCP13 106481786 +SNRPCP14 100310855 +SNRPCP15 100310857 +SNRPCP16 106480291 +SNRPCP17 106481702 +SNRPCP18 100289564 +SNRPCP19 100310849 +SNRPCP20 106480292 +SNRPD1 6632 +SNRPD2 6633 +SNRPD2P1 119358 +SNRPD2P2 645339 +SNRPD3 6634 +SNRPE 6635 +SNRPEP1 100129454 +SNRPEP2 414153 +SNRPEP3 100129329 +SNRPEP4 100130109 +SNRPEP5 100874413 +SNRPEP6 100874414 +SNRPEP7 100874415 +SNRPEP8 100874423 +SNRPEP9 100874416 +SNRPEP10 100874424 +SNRPEP11 107985907 +SNRPF 6636 +SNRPF-DT 105369921 +SNRPFP1 170550 +SNRPFP2 100874411 +SNRPFP3 100874422 +SNRPFP4 100874412 +SNRPG 6637 +SNRPGP1 326272 +SNRPGP2 100130003 +SNRPGP3 100874407 +SNRPGP4 100130368 +SNRPGP5 100874418 +SNRPGP6 100861574 +SNRPGP7 100874408 +SNRPGP8 100874409 +SNRPGP9 100506574 +SNRPGP10 100130289 +SNRPGP11 100874426 +SNRPGP12 100874427 +SNRPGP13 100874428 +SNRPGP14 100874434 +SNRPGP15 100130932 +SNRPGP16 106480270 +SNRPGP17 106481685 +SNRPGP18 106480680 +SNRPGP19 106481686 +SNRPGP20 106480271 +SNRPN 6638 +SNTA1 6640 +SNTB1 6641 +SNTB2 6645 +SNTG1 54212 +SNTG2 54221 +SNTG2-AS1 101060391 +SNTN 132203 +SNU13 4809 +SNUPN 10073 +SNURF 8926 +SNURFL 727686 +SNW1 22938 +SNX1 6642 +SNX2 6643 +SNX2P1 100418968 +SNX2P2 100873785 +SNX3 8724 +SNX3P1X 100873884 +SNX3P1Y 100873885 +SNX4 8723 +SNX5 27131 +SNX5P1 100131940 +SNX5P2 728467 +SNX6 58533 +SNX6P1 126506 +SNX7 51375 +SNX8 29886 +SNX9 51429 +SNX9-AS1 105378078 +SNX10 29887 +SNX10-AS1 105375304 +SNX11 29916 +SNX12 29934 +SNX13 23161 +SNX14 57231 +SNX15 29907 +SNX16 64089 +SNX17 9784 +SNX18 112574 +SNX18P1Y 100418999 +SNX18P2 642952 +SNX18P3 100418975 +SNX18P4 100418976 +SNX18P5 100418977 +SNX18P7 100418980 +SNX18P8 100418981 +SNX18P9 644576 +SNX18P10 100419040 +SNX18P11 100419043 +SNX18P12 100419041 +SNX18P13 100419042 +SNX18P14 100418972 +SNX18P15 100419019 +SNX18P16 100419020 +SNX18P17 100419024 +SNX18P18 100419021 +SNX18P19 100419022 +SNX18P20 100419026 +SNX18P21 100419025 +SNX18P22 100419027 +SNX18P23 100132617 +SNX18P24 100419004 +SNX18P25 100419005 +SNX18P26 100419038 +SNX18P27 100873788 +SNX19 399979 +SNX19P1 378810 +SNX19P2 400094 +SNX19P3 646442 +SNX19P4 100419047 +SNX20 124460 +SNX21 90203 +SNX22 79856 +SNX24 28966 +SNX25 83891 +SNX25P1 100419028 +SNX27 81609 +SNX29 92017 +SNX29P1 100652781 +SNX29P2 440352 +SNX30 401548 +SNX30-DT 122455334 +SNX31 169166 +SNX32 254122 +SNX33 257364 +SNX33P1 100533624 +SOAT1 6646 +SOAT2 8435 +SOBP 55084 +SOCAR 105373557 +SOCS1 8651 +SOCS2 8835 +SOCS2-AS1 144481 +SOCS2P1 276719 +SOCS2P2 266701 +SOCS3 9021 +SOCS3-DT 101928674 +SOCS4 122809 +SOCS5 9655 +SOCS5P1 100420754 +SOCS5P2 100128299 +SOCS5P3 100127945 +SOCS5P4 100132415 +SOCS5P5 643884 +SOCS6 9306 +SOCS6P1 100420759 +SOCS7 30837 +SOD1 6647 +SOD1-DT 102724449 +SOD1P1 106479055 +SOD1P2 100652974 +SOD1P3 101060005 +SOD2 6648 +SOD2-OT1 100129518 +SOD2P1 100421046 +SOD3 6649 +SOGA1 140710 +SOGA3 387104 +SOHLH1 402381 +SOHLH2 54937 +SON 6651 +SONP1 148300 +SORBS1 10580 +SORBS2 8470 +SORBS2-AS1 125177376 +SORBS3 10174 +SORCS1 114815 +SORCS2 57537 +SORCS3 22986 +SORCS3-AS1 100505890 +SORD 6652 +SORD2P 653381 +SORL1 6653 +SORL1-AS1 105369536 +SORT1 6272 +SOS1 6654 +SOS1-IT1 100505911 +SOS2 6655 +SOST 50964 +SOSTDC1 25928 +SOWAHA 134548 +SOWAHB 345079 +SOWAHC 65124 +SOWAHCP1 100131984 +SOWAHCP2 100419957 +SOWAHCP3 102723660 +SOWAHCP4 100129224 +SOWAHCP5 100419815 +SOWAHD 347454 +SOX1 6656 +SOX1-OT 100505996 +SOX2 6657 +SOX2-OT 347689 +SOX3 6658 +SOX4 6659 +SOX5 6660 +SOX5-AS1 101928471 +SOX5P1 6661 +SOX6 55553 +SOX7 83595 +SOX8 30812 +SOX9 6662 +SOX9-AS1 400618 +SOX10 6663 +SOX11 6664 +SOX12 6666 +SOX13 9580 +SOX14 8403 +SOX15 6665 +SOX17 64321 +SOX18 54345 +SOX21 11166 +SOX21-AS1 100507533 +SOX30 11063 +SOX30P1 442142 +SP1 6667 +SP2 6668 +SP2-AS1 100506325 +SP2-DT 102724532 +SP3 6670 +SP3P 160824 +SP4 6671 +SP5 389058 +SP6 80320 +SP7 121340 +SP8 221833 +SP9 100131390 +SP100 6672 +SP110 3431 +SP140 11262 +SP140L 93349 +SPA17 53340 +SPA17P1 171424 +SPAAR 158376 +SPACA1 81833 +SPACA3 124912 +SPACA4 171169 +SPACA5 389852 +SPACA5B 729201 +SPACA6 147650 +SPACA6-AS1 102238594 +SPACA7 122258 +SPACA7BP 105370364 +SPACA9 11092 +SPACDR 402573 +SPADH 112577516 +SPAG1 6674 +SPAG4 6676 +SPAG5 10615 +SPAG5-AS1 100506436 +SPAG6 9576 +SPAG7 9552 +SPAG8 26206 +SPAG9 9043 +SPAG11A 653423 +SPAG11B 10407 +SPAG16 79582 +SPAG16-DT 100130451 +SPAG17 200162 +SPAM1 6677 +SPANXA1 30014 +SPANXA2 728712 +SPANXA2-OT1 619455 +SPANXB1 728695 +SPANXC 64663 +SPANXD 64648 +SPANXN1 494118 +SPANXN2 494119 +SPANXN3 139067 +SPANXN4 441525 +SPANXN5 494197 +SPARC 6678 +SPARCL1 8404 +SPART 23111 +SPART-AS1 100507135 +SPAST 6683 +SPATA1 100505741 +SPATA2 9825 +SPATA2L 124044 +SPATA2P1 100873966 +SPATA3 130560 +SPATA3-AS1 348761 +SPATA4 132851 +SPATA6 54558 +SPATA6L 55064 +SPATA7 55812 +SPATA8 145946 +SPATA8-AS1 100652749 +SPATA9 83890 +SPATA12 353324 +SPATA13 221178 +SPATA13-AS1 100874231 +SPATA16 83893 +SPATA17 128153 +SPATA17-AS1 103752555 +SPATA18 132671 +SPATA19 219938 +SPATA20 64847 +SPATA20P1 100874060 +SPATA21 374955 +SPATA22 84690 +SPATA24 202051 +SPATA25 128497 +SPATA31A1 647060 +SPATA31A3 727830 +SPATA31A5 727905 +SPATA31A6 389730 +SPATA31A7 26165 +SPATA31B1P 404770 +SPATA31C1 441452 +SPATA31C2 645961 +SPATA31D1 389763 +SPATA31D2P 100130636 +SPATA31D3 389762 +SPATA31D4 389761 +SPATA31D5P 347127 +SPATA31E1 286234 +SPATA31E2P 646177 +SPATA31E3P 646507 +SPATA31F1 259308 +SPATA31F2P 389715 +SPATA31F3 100129969 +SPATA32 124783 +SPATA33 124045 +SPATA41 388182 +SPATA42 642864 +SPATA45 149643 +SPATA46 284680 +SPATC1 375686 +SPATC1L 84221 +SPATS1 221409 +SPATS2 65244 +SPATS2L 26010 +SPC24 147841 +SPC25 57405 +SPCS1 28972 +SPCS2 9789 +SPCS2P1 100131250 +SPCS2P2 644573 +SPCS2P3 100288739 +SPCS2P4 653566 +SPCS3 60559 +SPCS3-AS1 116435303 +SPDEF 25803 +SPDL1 54908 +SPDYA 245711 +SPDYC 387778 +SPDYE1 285955 +SPDYE2 441273 +SPDYE2B 100310812 +SPDYE3 441272 +SPDYE4 388333 +SPDYE5 442590 +SPDYE6 729597 +SPDYE7P 441251 +SPDYE8 728524 +SPDYE9 643909 +SPDYE10 643862 +SPDYE11 100996746 +SPDYE12 100101268 +SPDYE13 105180390 +SPDYE14 641776 +SPDYE15 105180391 +SPDYE16 102723555 +SPDYE17 102723849 +SPDYE18 100505767 +SPDYE19P 100130307 +SPDYE20P 101060280 +SPDYE21 442572 +SPDYE22P 100420854 +SPECC1 92521 +SPECC1-DT 119545627 +SPECC1L 23384 +SPECC1L-ADORA2A 101730217 +SPECC1P1 100418862 +SPECC1P2 112488741 +SPEF1 25876 +SPEF2 79925 +SPEG 10290 +SPEGNB 100996693 +SPEM1 374768 +SPEM2 201243 +SPEM3 107983988 +SPEN 23013 +SPEN-AS1 729614 +SPESP1 246777 +SPG7 6687 +SPG11 80208 +SPG21 51324 +SPHK1 8877 +SPHK2 56848 +SPHKAP 80309 +SPI1 6688 +SPIB 6689 +SPIC 121599 +SPICE1 152185 +SPICP1 646120 +SPICP2 100130114 +SPICP3 100128007 +SPICP4 100128803 +SPICP5 100421664 +SPIDR 23514 +SPIN1 10927 +SPIN2A 54466 +SPIN2B 474343 +SPIN2P1 100129997 +SPIN3 169981 +SPIN4 139886 +SPIN4-AS1 100874033 +SPINDOC 144097 +SPINK1 6690 +SPINK2 6691 +SPINK4 27290 +SPINK5 11005 +SPINK6 404203 +SPINK7 84651 +SPINK8 646424 +SPINK9 643394 +SPINK13 153218 +SPINK14 408187 +SPINT1 6692 +SPINT1-AS1 102724362 +SPINT2 10653 +SPINT3 10816 +SPINT4 391253 +SPINT5P 140863 +SPIRE1 56907 +SPIRE2 84501 +SPMAP1 388381 +SPMAP2 51298 +SPMAP2L 100506564 +SPMIP1 100130705 +SPMIP2 152940 +SPMIP3 200159 +SPMIP3P1 127379741 +SPMIP4 136895 +SPMIP5 143379 +SPMIP6 84688 +SPMIP7 100130988 +SPMIP8 374739 +SPMIP9 200523 +SPMIP10 389320 +SPMIP11 255411 +SPN 6693 +SPNS1 83985 +SPNS2 124976 +SPNS2-AS1 107985053 +SPNS3 201305 +SPO11 23626 +SPOCD1 90853 +SPOCK1 6695 +SPOCK2 9806 +SPOCK3 50859 +SPON1 10418 +SPON1-AS1 109729138 +SPON2 10417 +SPOP 8405 +SPOPL 339745 +SPOPL-DT 105373637 +SPOPLP1 100127903 +SPOPLP2 642381 +SPOPLP3 100174950 +SPOUT1 51490 +SPP1 6696 +SPP2 6694 +SPPL2A 84888 +SPPL2B 56928 +SPPL2C 162540 +SPPL3 121665 +SPR 6697 +SPRED1 161742 +SPRED2 200734 +SPRED3 399473 +SPRING1 79794 +SPRING1P1 100132615 +SPRING1P2 100130170 +SPRING1P3 441750 +SPRN 503542 +SPRNP1 399833 +SPRR1A 6698 +SPRR1B 6699 +SPRR2A 6700 +SPRR2B 6701 +SPRR2C 6702 +SPRR2D 6703 +SPRR2E 6704 +SPRR2F 6705 +SPRR2G 6706 +SPRR3 6707 +SPRR4 163778 +SPRR5 110806278 +SPRTN 83932 +SPRY1 10252 +SPRY2 10253 +SPRY3 10251 +SPRY4 81848 +SPRY4-AS1 101926941 +SPRY4-IT1 100642175 +SPRYD3 84926 +SPRYD4 283377 +SPRYD7 57213 +SPRYD7P1 100130843 +SPSB1 80176 +SPSB2 84727 +SPSB3 90864 +SPSB4 92369 +SPTA1 6708 +SPTAN1 6709 +SPTB 6710 +SPTBN1 6711 +SPTBN1-AS1 105374640 +SPTBN1-AS2 123706536 +SPTBN2 6712 +SPTBN4 57731 +SPTBN5 51332 +SPTLC1 10558 +SPTLC1P1 100874511 +SPTLC1P2 100874498 +SPTLC1P3 100874499 +SPTLC1P4 100874500 +SPTLC1P5 100874512 +SPTLC2 9517 +SPTLC3 55304 +SPTSSA 171546 +SPTSSB 165679 +SPTY2D1 144108 +SPX 80763 +SPZ1 84654 +SQLE 6713 +SQLE-DT 105375744 +SQOR 58472 +SQSTM1 8878 +SQSTM1P1 106480677 +SRA1 10011 +SRARP 149563 +SRBD1 55133 +SRC 6714 +SRCAP 10847 +SRCIN1 80725 +SRD5A1 6715 +SRD5A1P1 6719 +SRD5A2 6716 +SRD5A2P1 118568808 +SRD5A3 79644 +SRD5A3-AS1 100506462 +SRD5A3P1 390203 +SREBF1 6720 +SREBF2 6721 +SREBF2-AS1 112637020 +SREK1 140890 +SREK1IP1 285672 +SREK1IP1P1 100288151 +SREK1IP1P2 115838655 +SRF 6722 +SRFBP1 153443 +SRGAP1 57522 +SRGAP2 23380 +SRGAP2-AS1 100873165 +SRGAP2B 647135 +SRGAP2C 653464 +SRGAP2D 100996712 +SRGAP3 9901 +SRGAP3-AS1 100874103 +SRGAP3-AS2 101927416 +SRGAP3-AS3 100288831 +SRGAP3-AS4 101927440 +SRGN 5552 +SRGNP1 106480246 +SRI 6717 +SRI-AS1 102723885 +SRIP1 6644 +SRIP2 100499485 +SRIP3 100861435 +SRL 6345 +SRM 6723 +SRMP1 170552 +SRMP2 326269 +SRMP3 100419085 +SRMS 6725 +SRP9 6726 +SRP9P1 653226 +SRP14 6727 +SRP14-DT 100131089 +SRP14P1 390284 +SRP14P2 111644132 +SRP14P3 111644142 +SRP14P4 111644147 +SRP14P5 127482536 +SRP19 6728 +SRP54 6729 +SRP54-AS1 100506157 +SRP68 6730 +SRP68P1 252841 +SRP68P2 252840 +SRP68P3 347717 +SRP72 6731 +SRP72P1 100420752 +SRP72P2 153932 +SRPK1 6732 +SRPK2 6733 +SRPK2P 100419416 +SRPK3 26576 +SRPRA 6734 +SRPRB 58477 +SRPX 8406 +SRPX2 27286 +SRR 63826 +SRRD 402055 +SRRM1 10250 +SRRM1P1 401475 +SRRM1P2 100420834 +SRRM1P3 100130190 +SRRM2 23524 +SRRM2-AS1 100128788 +SRRM3 222183 +SRRM4 84530 +SRRM5 100170229 +SRRT 51593 +SRSF1 6426 +SRSF1P1 100128625 +SRSF2 6427 +SRSF2P1 392439 +SRSF3 6428 +SRSF3P1 100506569 +SRSF3P2 100500773 +SRSF3P4 100131114 +SRSF3P5 100128964 +SRSF3P6 107985790 +SRSF4 6429 +SRSF5 6430 +SRSF6 6431 +SRSF6P1 100128442 +SRSF6P2 644422 +SRSF7 6432 +SRSF8 10929 +SRSF8BP 643118 +SRSF8CP 647145 +SRSF9 8683 +SRSF9P1 54021 +SRSF10 10772 +SRSF10P1 100130799 +SRSF10P2 171472 +SRSF11 9295 +SRSF11P1 100421296 +SRSF12 135295 +SRXN1 140809 +SRY 6736 +SS18 6760 +SS18L1 26039 +SS18L2 51188 +SS18L2P1 646213 +SS18L2P2 724101 +SSB 6741 +SSBL2P 653588 +SSBL3P 100533757 +SSBL4P 441904 +SSBL5P 389465 +SSBL6P 127482546 +SSBP1 6742 +SSBP2 23635 +SSBP3 23648 +SSBP3-AS1 619518 +SSBP3P1 100129321 +SSBP3P2 401002 +SSBP4 170463 +SSC4D 136853 +SSC5D 284297 +SSH1 54434 +SSH2 85464 +SSH3 54961 +SSMEM1 136263 +SSNA1 8636 +SSPN 8082 +SSPOP 23145 +SSR1 6745 +SSR1P1 100420476 +SSR1P2 100131189 +SSR2 6746 +SSR3 6747 +SSR4 6748 +SSR4P1 728039 +SSRP1 6749 +SST 6750 +SSTR1 6751 +SSTR2 6752 +SSTR3 6753 +SSTR4 6754 +SSTR5 6755 +SSTR5-AS1 146336 +SSU72 29101 +SSU72L1 390033 +SSU72L2 390031 +SSU72L3 143506 +SSU72L4 441584 +SSU72L5 196120 +SSU72L6 136157 +SSU72P1 286528 +SSU72P6 643263 +SSUH2 51066 +SSX1 6756 +SSX2 6757 +SSX2B 727837 +SSX2IP 117178 +SSX2IPP1 644681 +SSX3 10214 +SSX4 6759 +SSX4B 548313 +SSX5 6758 +SSX6P 280657 +SSX7 280658 +SSX8P 280659 +SSX9P 280660 +SSX11P 100996564 +SSX13P 326341 +SSX14P 326337 +SSX15P 326339 +SSX16P 326587 +SSX17P 326590 +SSX18P 100420551 +SSX19P 326586 +SSX20P 129810503 +SSX21P 129810498 +SSXP10 100287603 +ST3GAL1 6482 +ST3GAL1-DT 119545630 +ST3GAL1P1 100421804 +ST3GAL2 6483 +ST3GAL3 6487 +ST3GAL3-AS1 101929592 +ST3GAL4 6484 +ST3GAL5 8869 +ST3GAL5-AS1 101928113 +ST3GAL5P1 100421795 +ST3GAL6 10402 +ST3GAL6-AS1 100874207 +ST6GAL1 6480 +ST6GAL2 84620 +ST6GAL2-IT1 100874354 +ST6GALNAC1 55808 +ST6GALNAC2 10610 +ST6GALNAC2P1 100422716 +ST6GALNAC3 256435 +ST6GALNAC4 27090 +ST6GALNAC4P1 100874524 +ST6GALNAC5 81849 +ST6GALNAC6 30815 +ST7 7982 +ST7-AS1 93653 +ST7-AS2 93654 +ST7-OT3 93655 +ST7-OT4 338069 +ST7L 54879 +ST8SIA1 6489 +ST8SIA2 8128 +ST8SIA3 51046 +ST8SIA4 7903 +ST8SIA5 29906 +ST8SIA5-DT 105372097 +ST8SIA6 338596 +ST8SIA6-AS1 100128098 +ST13 6767 +ST13P1 729992 +ST13P2 344328 +ST13P3 144638 +ST13P4 145165 +ST13P5 144106 +ST13P6 157530 +ST13P7 155019 +ST13P8 338805 +ST13P9 390301 +ST13P10 399950 +ST13P11 728162 +ST13P12 100127911 +ST13P13 401648 +ST13P14 100422602 +ST13P15 100422603 +ST13P16 100422605 +ST13P17 442730 +ST13P18 643310 +ST13P19 100131961 +ST13P20 729828 +ST13P21 642818 +ST13P22 100874521 +ST14 6768 +ST18 9705 +ST20 400410 +ST20-AS1 283687 +ST20-MTHFS 100528021 +STAB1 23166 +STAB2 55576 +STAC 6769 +STAC2 342667 +STAC3 246329 +STAG1 10274 +STAG1-DT 119139906 +STAG2 10735 +STAG2-AS1 101928402 +STAG3 10734 +STAG3L1 54441 +STAG3L2 442582 +STAG3L3 442578 +STAG3L4 64940 +STAG3L5P 101735302 +STAG3L5P-PVRIG2P-PILRB 101752399 +STAM 8027 +STAM-DT 102723166 +STAM2 10254 +STAMBP 10617 +STAMBPL1 57559 +STAP1 26228 +STAP2 55620 +STAR 6770 +STARD3 10948 +STARD3NL 83930 +STARD4 134429 +STARD4-AS1 100505678 +STARD5 80765 +STARD6 147323 +STARD7 56910 +STARD7-AS1 285033 +STARD8 9754 +STARD9 57519 +STARD10 10809 +STARD13 90627 +STARD13-AS 100874241 +STARD13-IT1 100874373 +STARP1 6771 +STAT1 6772 +STAT2 6773 +STAT3 6774 +STAT4 6775 +STAT4-AS1 105373805 +STAT5A 6776 +STAT5B 6777 +STAT6 6778 +STATH 6779 +STAU1 6780 +STAU2 27067 +STAU2-AS1 100128126 +STAU2P1 100130134 +STBD1 8987 +STBD1P1 100127978 +STC1 6781 +STC2 8614 +STEAP1 26872 +STEAP1B 256227 +STEAP1B-AS1 100506178 +STEAP2 261729 +STEAP2-AS1 100874100 +STEAP3 55240 +STEAP3-AS1 100874111 +STEAP4 79689 +STEEP1 63932 +STH 246744 +STIL 6491 +STIM1 6786 +STIM1-AS1 105376527 +STIM2 57620 +STIM2-AS1 105374546 +STIMATE 375346 +STIMATE-MUSTN1 100526772 +STING1 340061 +STIP1 10963 +STIP1P1 100420434 +STIP1P2 100420436 +STIP1P3 441505 +STK3 6788 +STK4 6789 +STK4-DT 100505826 +STK10 6793 +STK11 6794 +STK11IP 114790 +STK16 8576 +STK16P1 326107 +STK17A 9263 +STK17B 9262 +STK19 8859 +STK19B 373159 +STK24 8428 +STK24-AS1 100874069 +STK24P1 100421784 +STK25 10494 +STK25P1 100533662 +STK26 51765 +STK31 56164 +STK32A 202374 +STK32A-AS1 105378217 +STK32B 55351 +STK32C 282974 +STK33 65975 +STK33P1 553118 +STK35 140901 +STK36 27148 +STK38 11329 +STK38L 23012 +STK39 27347 +STK40 83931 +STKLD1 169436 +STMN1 3925 +STMN1P1 100506685 +STMN1P2 100289663 +STMN2 11075 +STMN3 50861 +STMN4 81551 +STMND1 401236 +STMP1 647087 +STN1 79991 +STOM 2040 +STOML1 9399 +STOML2 30968 +STOML3 161003 +STON1 11037 +STON1-GTF2A1L 286749 +STON2 85439 +STOX1 219736 +STOX2 56977 +STPG1 90529 +STPG2 285555 +STPG2-AS1 101410545 +STPG3 441476 +STPG3-AS1 100129722 +STPG4 285051 +STRA6 64220 +STRA6LP 112272565 +STRA8 346673 +STRADA 92335 +STRADB 55437 +STRADBP1 389599 +STRAP 11171 +STRBP 55342 +STRC 161497 +STRCP1 554225 +STRIP1 85369 +STRIP2 57464 +STRIT1 100507537 +STRN 6801 +STRN3 29966 +STRN4 29888 +STS 412 +STSP1 6803 +STT3A 3703 +STT3A-AS1 105369550 +STT3B 201595 +STUB1 10273 +STUB1-DT 105371184 +STUB1P1 391465 +STUM 375057 +STX1A 6804 +STX1B 112755 +STX2 2054 +STX3 6809 +STX4 6810 +STX5 6811 +STX5-DT 105369332 +STX6 10228 +STX7 8417 +STX8 9482 +STX8P1 100423046 +STX10 8677 +STX11 8676 +STX12 23673 +STX16 8675 +STX16-NPEPL1 100534593 +STX17 55014 +STX17-DT 441461 +STX18 53407 +STX18-AS1 100507266 +STX18-IT1 104472519 +STX18P1 100418889 +STX19 415117 +STXBP1 6812 +STXBP2 6813 +STXBP3 6814 +STXBP4 252983 +STXBP5 134957 +STXBP5-AS1 729178 +STXBP5L 9515 +STXBP6 29091 +STYK1 55359 +STYX 6815 +STYXL1 51657 +STYXL2 92235 +SUB1 10923 +SUB1P1 728938 +SUB1P2 100287680 +SUB1P3 106480442 +SUB1P4 100288661 +SUCLA2 8803 +SUCLA2-AS1 101929410 +SUCLA2P1 646520 +SUCLA2P2 100129863 +SUCLA2P3 100421648 +SUCLG1 8802 +SUCLG2 8801 +SUCLG2-DT 101927111 +SUCLG2P1 100421671 +SUCLG2P2 283398 +SUCLG2P3 100421712 +SUCLG2P4 100130528 +SUCNR1 56670 +SUCO 51430 +SUDS3 64426 +SUDS3P1 285647 +SUFU 51684 +SUGCT 79783 +SUGCT-AS1 101928716 +SUGP1 57794 +SUGP2 10147 +SUGT1 10910 +SUGT1-DT 116435302 +SUGT1P1 441394 +SUGT1P2 728706 +SUGT1P3 283507 +SUGT1P4 112272564 +SUGT1P4-STRA6LP 100499484 +SUGT1P4-STRA6LP-CCDC180 57653 +SULF1 23213 +SULF2 55959 +SULT1A1 6817 +SULT1A2 6799 +SULT1A3 6818 +SULT1A4 445329 +SULT1B1 27284 +SULT1C2 6819 +SULT1C2P2 106480333 +SULT1C3 442038 +SULT1C4 27233 +SULT1C5P 151234 +SULT1D1P 133150 +SULT1D1P2 127482547 +SULT1E1 6783 +SULT2A1 6822 +SULT2B1 6820 +SULT4A1 25830 +SULT6B1 391365 +SULT6B2P 107984497 +SUMF1 285362 +SUMF2 25870 +SUMO1 7341 +SUMO1P1 391257 +SUMO1P2 474337 +SUMO1P3 474338 +SUMO1P4 101290502 +SUMO1P5 474341 +SUMO2 6613 +SUMO2P1 285829 +SUMO2P2 100859924 +SUMO2P3 652489 +SUMO2P4 100288757 +SUMO2P5 100526738 +SUMO2P6 100127922 +SUMO2P7 100131823 +SUMO2P8 100506244 +SUMO2P10 106481678 +SUMO2P11 100422250 +SUMO2P12 106480262 +SUMO2P13 106480263 +SUMO2P14 106480264 +SUMO2P15 106480417 +SUMO2P16 106480679 +SUMO2P17 100128010 +SUMO2P18 106481679 +SUMO2P19 100422265 +SUMO2P20 101927327 +SUMO2P21 728825 +SUMO3 6612 +SUMO4 387082 +SUN1 23353 +SUN2 25777 +SUN3 256979 +SUN5 140732 +SUNO1 119863868 +SUOX 6821 +SUPT3H 8464 +SUPT4H1 6827 +SUPT4H1P1 100190947 +SUPT4H1P2 100287625 +SUPT5H 6829 +SUPT6H 6830 +SUPT7L 9913 +SUPT16H 11198 +SUPT16HP1 400011 +SUPT20H 55578 +SUPT20HL1 100130302 +SUPT20HL2 170067 +SUPV3L1 6832 +SURF1 6834 +SURF2 6835 +SURF4 6836 +SURF6 6838 +SURF6P1 643470 +SUSD1 64420 +SUSD2 56241 +SUSD2P1 729568 +SUSD2P2 729450 +SUSD3 203328 +SUSD4 55061 +SUSD5 26032 +SUSD6 9766 +SUV39H1 6839 +SUV39H2 79723 +SUV39H2-DT 124902382 +SUZ12 23512 +SUZ12P1 440423 +SUZ12P2 100421539 +SV2A 9900 +SV2B 9899 +SV2C 22987 +SV2C-AS1 105379041 +SVBP 374969 +SVEP1 79987 +SVIL 6840 +SVIL-AS1 102724316 +SVIL2P 645954 +SVIP 258010 +SVOP 55530 +SVOPL 136306 +SWAP70 23075 +SWI5 375757 +SWINGN 100861555 +SWSAP1 126074 +SWT1 54823 +SYAP1 94056 +SYBU 55638 +SYBU-AS1 100132813 +SYCE1 93426 +SYCE1L 100130958 +SYCE2 256126 +SYCE3 644186 +SYCN 342898 +SYCP1 6847 +SYCP2 10388 +SYCP2L 221711 +SYCP3 50511 +SYDE1 85360 +SYDE2 84144 +SYF2 25949 +SYF2P1 317778 +SYF2P2 100128275 +SYK 6850 +SYMPK 8189 +SYN1 6853 +SYN2 6854 +SYN3 8224 +SYN3-AS1 105373004 +SYNC 81493 +SYNCRIP 10492 +SYNDIG1 79953 +SYNDIG1L 646658 +SYNE1 23345 +SYNE1-AS1 100505475 +SYNE2 23224 +SYNE3 161176 +SYNE4 163183 +SYNGAP1 8831 +SYNGAP1-AS1 112390310 +SYNGR1 9145 +SYNGR2 9144 +SYNGR2P1 283698 +SYNGR2P2 138916 +SYNGR3 9143 +SYNGR4 23546 +SYNJ1 8867 +SYNJ2 8871 +SYNJ2-IT1 100874300 +SYNJ2BP 55333 +SYNJ2BP-COX16 100529257 +SYNM 23336 +SYNM-AS1 105371016 +SYNM-AS2 125177379 +SYNPO 11346 +SYNPO2 171024 +SYNPO2L 79933 +SYNPO2L-AS1 105378360 +SYNPR 132204 +SYNPR-AS1 100874016 +SYNRG 11276 +SYP 6855 +SYP-AS1 100873921 +SYPL1 6856 +SYPL1P1 100130011 +SYPL1P2 100132972 +SYPL2 284612 +SYS1 90196 +SYS1-DBNDD2 767557 +SYT1 6857 +SYT2 127833 +SYT2-AS1 129810494 +SYT3 84258 +SYT4 6860 +SYT5 6861 +SYT6 148281 +SYT7 9066 +SYT8 90019 +SYT9 143425 +SYT9-AS1 100506258 +SYT10 341359 +SYT11 23208 +SYT12 91683 +SYT13 57586 +SYT14 255928 +SYT14P1 401135 +SYT15 83849 +SYT15-AS1 101927699 +SYT15B 102724488 +SYT16 83851 +SYT17 51760 +SYTL1 84958 +SYTL2 54843 +SYTL3 94120 +SYTL4 94121 +SYTL5 94122 +SYVN1 84447 +SZRD1 26099 +SZRD1P1 100130075 +SZT2 23334 +SZT2-AS1 100873952 +TAAR1 134864 +TAAR2 9287 +TAAR3P 9288 +TAAR4P 503612 +TAAR5 9038 +TAAR6 319100 +TAAR7P 503611 +TAAR8 83551 +TAAR9 134860 +TAB1 10454 +TAB2 23118 +TAB2-AS1 105378049 +TAB3 257397 +TAB3-AS1 727682 +TAB3-AS2 100873926 +TAB3P1 643199 +TAC1 6863 +TAC3 6866 +TAC4 255061 +TACC1 6867 +TACC1P1 219752 +TACC2 10579 +TACC3 10460 +TACO1 51204 +TACR1 6869 +TACR2 6865 +TACR3 6870 +TACR3-AS1 121233924 +TACSTD2 4070 +TADA1 117143 +TADA2A 6871 +TADA2B 93624 +TADA3 10474 +TAF1 6872 +TAF1A 9015 +TAF1A-AS1 100506161 +TAF1B 9014 +TAF1C 9013 +TAF1D 79101 +TAF1L 138474 +TAF2 6873 +TAF3 83860 +TAF4 6874 +TAF4B 6875 +TAF5 6877 +TAF5L 27097 +TAF5LP1 645744 +TAF6 6878 +TAF6L 10629 +TAF7 6879 +TAF7L 54457 +TAF8 129685 +TAF9 6880 +TAF9B 51616 +TAF9BP1 246135 +TAF9BP2 100130319 +TAF9P1 360002 +TAF9P2 360003 +TAF9P3 163088 +TAF10 6881 +TAF11 6882 +TAF11L1 285697 +TAF11L2 391742 +TAF11L3 646103 +TAF11L4 391746 +TAF11L5 646066 +TAF11L6 391747 +TAF11L7 112488736 +TAF11L8 112488737 +TAF11L9 112488745 +TAF11L10 112488738 +TAF11L11 112488746 +TAF11L12 112488739 +TAF11L13 112488747 +TAF11L14 112488740 +TAF12 6883 +TAF12-DT 105378616 +TAF13 6884 +TAF13P1 246112 +TAF13P2 100462886 +TAF15 8148 +TAFA1 407738 +TAFA2 338811 +TAFA3 284467 +TAFA4 151647 +TAFA5 25817 +TAFAZZIN 6901 +TAGAP 117289 +TAGAP-AS1 105378083 +TAGLN 6876 +TAGLN2 8407 +TAGLN2P1 100418887 +TAGLN2P2 642319 +TAGLN3 29114 +TAL1 6886 +TAL2 6887 +TALAM1 109136579 +TALDO1 6888 +TALDO1P1 6889 +TAMALIN 160622 +TAMALIN-AS1 692159 +TAMM41 132001 +TANAR 128266846 +TANC1 85461 +TANC2 26115 +TANGO2 128989 +TANGO6 79613 +TANK 10010 +TANK-AS1 105373719 +TAOK1 57551 +TAOK2 9344 +TAOK3 51347 +TAP1 6890 +TAP2 6891 +TAPBP 6892 +TAPBPL 55080 +TAPT1 202018 +TAPT1-AS1 202020 +TARBP1 6894 +TARBP2 6895 +TARBP2P1 6896 +TARDBP 23435 +TARDBPP1 643503 +TARDBPP2 440142 +TARDBPP3 643387 +TARDBPP4 100128540 +TARDBPP5 100996860 +TARID 100507308 +TARM1 441864 +TARS1 6897 +TARS1-DT 107986411 +TARS2 80222 +TARS2P1 100533844 +TARS3 123283 +TAS1R1 80835 +TAS1R2 80834 +TAS1R3 83756 +TAS2R1 50834 +TAS2R2P 338396 +TAS2R3 50831 +TAS2R4 50832 +TAS2R5 54429 +TAS2R6P 448990 +TAS2R7 50837 +TAS2R8 50836 +TAS2R9 50835 +TAS2R10 50839 +TAS2R12P 266656 +TAS2R13 50838 +TAS2R14 50840 +TAS2R15P 266657 +TAS2R16 50833 +TAS2R18P 338414 +TAS2R19 259294 +TAS2R20 259295 +TAS2R22P 266661 +TAS2R30 259293 +TAS2R31 259290 +TAS2R33 266665 +TAS2R36 266666 +TAS2R37 266667 +TAS2R38 5726 +TAS2R39 259285 +TAS2R40 259286 +TAS2R41 259287 +TAS2R42 353164 +TAS2R43 259289 +TAS2R45 259291 +TAS2R46 259292 +TAS2R50 259296 +TAS2R60 338398 +TAS2R62P 338399 +TAS2R63P 338413 +TAS2R64P 338412 +TAS2R67P 448991 +TAS2R68P 100653053 +TASL 80231 +TASOR 23272 +TASOR2 54906 +TASP1 55617 +TAT 6898 +TAT-AS1 100132529 +TATDN1 83940 +TATDN1P1 728737 +TATDN2 9797 +TATDN2P1 100131103 +TATDN2P2 100272205 +TATDN2P3 100420458 +TATDN3 128387 +TAX1BP1 8887 +TAX1BP1-AS1 105375210 +TAX1BP3 30851 +TBATA 219793 +TBC1D1 23216 +TBC1D2 55357 +TBC1D2B 23102 +TBC1D3 729873 +TBC1D3B 414059 +TBC1D3C 414060 +TBC1D3D 101060389 +TBC1D3E 102723859 +TBC1D3F 84218 +TBC1D3G 101060321 +TBC1D3H 729877 +TBC1D3I 102724862 +TBC1D3JP 100510707 +TBC1D3K 101060351 +TBC1D3L 101060376 +TBC1D3P1 400609 +TBC1D3P1-DHX40P1 653645 +TBC1D3P2 440452 +TBC1D3P3 653017 +TBC1D3P4 100631253 +TBC1D3P5 440419 +TBC1D3P6 101928566 +TBC1D3P7 106480773 +TBC1D4 9882 +TBC1D5 9779 +TBC1D7 51256 +TBC1D8 11138 +TBC1D8-AS1 100506286 +TBC1D8B 54885 +TBC1D9 23158 +TBC1D9B 23061 +TBC1D10A 83874 +TBC1D10B 26000 +TBC1D10C 374403 +TBC1D12 23232 +TBC1D13 54662 +TBC1D14 57533 +TBC1D15 64786 +TBC1D16 125058 +TBC1D17 79735 +TBC1D19 55296 +TBC1D20 128637 +TBC1D21 161514 +TBC1D22A 25771 +TBC1D22A-AS1 642757 +TBC1D22A-DT 119863861 +TBC1D22B 55633 +TBC1D23 55773 +TBC1D24 57465 +TBC1D25 4943 +TBC1D26 353149 +TBC1D26-AS1 105371560 +TBC1D27P 96597 +TBC1D28 254272 +TBC1D29P 26083 +TBC1D30 23329 +TBC1D31 93594 +TBC1D32 221322 +TBCA 6902 +TBCAP1 494540 +TBCAP2 494541 +TBCAP3 101290501 +TBCB 1155 +TBCC 6903 +TBCCD1 55171 +TBCD 6904 +TBCE 6905 +TBCEL 219899 +TBCEL-TECTA 116804918 +TBCK 93627 +TBILA 112806053 +TBK1 29110 +TBKBP1 9755 +TBL1X 6907 +TBL1XR1 79718 +TBL1XR1-AS1 100874217 +TBL1Y 90665 +TBL1YP1 286555 +TBL2 26608 +TBL3 10607 +TBP 6908 +TBPL1 9519 +TBPL1P1 100856791 +TBPL2 387332 +TBR1 10716 +TBRG1 84897 +TBRG4 9238 +TBX1 6899 +TBX2 6909 +TBX2-AS1 103689912 +TBX3 6926 +TBX3-AS1 105370000 +TBX4 9496 +TBX5 6910 +TBX5-AS1 255480 +TBX6 6911 +TBX10 347853 +TBX15 6913 +TBX18 9096 +TBX18-AS1 102724201 +TBX19 9095 +TBX20 57057 +TBX21 30009 +TBX22 50945 +TBX23P 57160 +TBXA1R 6914 +TBXA2R 6915 +TBXAS1 6916 +TBXT 6862 +TC2N 123036 +TCAF1 9747 +TCAF1P1 653199 +TCAF2 285966 +TCAF2C 100533814 +TCAF2P1 653691 +TCAIM 285343 +TCAM1P 146771 +TCAP 8557 +TCEA1 6917 +TCEA1P1 6918 +TCEA1P2 399511 +TCEA1P3 340501 +TCEA1P4 100421350 +TCEA2 6919 +TCEA3 6920 +TCEAL1 9338 +TCEAL2 140597 +TCEAL3 85012 +TCEAL3-AS1 100874119 +TCEAL4 79921 +TCEAL4P1 100874432 +TCEAL5 340543 +TCEAL6 158931 +TCEAL7 56849 +TCEAL8 90843 +TCEAL8P1 107986036 +TCEAL9 51186 +TCEANC 170082 +TCEANC2 127428 +TCERG1 10915 +TCERG1L 256536 +TCERG1L-AS1 101927489 +TCERG1P1 100420957 +TCERG1P2 100421029 +TCF3 6929 +TCF3P1 100129107 +TCF4 6925 +TCF4-AS1 105372127 +TCF4-AS2 106480339 +TCF7 6932 +TCF7L1 83439 +TCF7L1-IT1 100874334 +TCF7L2 6934 +TCF12 6938 +TCF12-DT 145783 +TCF15 6939 +TCF19 6941 +TCF20 6942 +TCF21 6943 +TCF23 150921 +TCF24 100129654 +TCF25 22980 +TCFL5 10732 +TCHH 7062 +TCHHL1 126637 +TCHP 84260 +TCIM 56892 +TCIRG1 10312 +TCL1A 8115 +TCL1B 9623 +TCL6 27004 +TCN1 6947 +TCN2 6948 +TCOF1 6949 +TCP1 6950 +TCP1P1 647047 +TCP1P2 6952 +TCP1P3 400013 +TCP10L 140290 +TCP10L2 401285 +TCP10L3 6953 +TCP11 6954 +TCP11L1 55346 +TCP11L2 255394 +TCP11X1 100996631 +TCP11X2 100996648 +TCP11X3P 106481605 +TCTA 6988 +TCTE1 202500 +TCTN1 79600 +TCTN2 79867 +TCTN3 26123 +TDG 6996 +TDGP1 645233 +TDH 157739 +TDH-AS1 100129129 +TDO2 6999 +TDP1 55775 +TDP2 51567 +TDRD1 56165 +TDRD3 81550 +TDRD5 163589 +TDRD6 221400 +TDRD6-AS1 101926934 +TDRD7 23424 +TDRD9 122402 +TDRD10 126668 +TDRD12 91646 +TDRD15 100129278 +TDRG1 732253 +TDRKH 11022 +TDRKH-AS1 109729141 +TDRP 157695 +TEAD1 7003 +TEAD2 8463 +TEAD3 7005 +TEAD4 7004 +TEC 7006 +TECPR1 25851 +TECPR2 9895 +TECR 9524 +TECRL 253017 +TECRP1 442777 +TECRP2 391696 +TECTA 7007 +TECTB 6975 +TEDC1 283643 +TEDC2 80178 +TEDC2-AS1 729652 +TEDDM1 127670 +TEDDM2P 127671 +TEDDM3P 391600 +TEF 7008 +TEFM 79736 +TEK 7010 +TEKT1 83659 +TEKT2 27285 +TEKT3 64518 +TEKT4 150483 +TEKT4P1 727768 +TEKT4P2 100132288 +TEKT4P3 100873355 +TEKT5 146279 +TEKTIP1 100128569 +TEKTL1 126402 +TELO2 9894 +TEMN3-AS1 105377573 +TEN1 100134934 +TEN1-CDK3 100529145 +TENM1 10178 +TENM2 57451 +TENM2-AS1 101927862 +TENM3 55714 +TENM3-AS1 90768 +TENM4 26011 +TENT2 167153 +TENT4A 11044 +TENT4B 64282 +TENT5A 55603 +TENT5B 115572 +TENT5C 54855 +TENT5C-DT 100996263 +TENT5D 169966 +TEP1 7011 +TEPSIN 146705 +TERB1 283847 +TERB2 145645 +TERC 7012 +TERF1 7013 +TERF1P1 348567 +TERF1P2 646359 +TERF1P3 646316 +TERF1P4 648283 +TERF1P5 283523 +TERF1P6 100287965 +TERF1P7 646127 +TERF2 7014 +TERF2IP 54386 +TERF2IPP1 644899 +TERLR1 101928857 +TERT 7015 +TES 26136 +TESC 54997 +TESC-AS1 101928244 +TESHL 101928327 +TESK1 7016 +TESK2 10420 +TESMIN 9633 +TESPA1 9840 +TET1 80312 +TET1P1 441662 +TET2 54790 +TET2-AS1 104384744 +TET3 200424 +TEX2 55852 +TEX9 374618 +TEX10 54881 +TEX11 56159 +TEX12 56158 +TEX13A 56157 +TEX13B 56156 +TEX13C 100129520 +TEX13D 100132015 +TEX14 56155 +TEX14BP 644050 +TEX15 56154 +TEX16P 100499435 +TEX19 400629 +TEX21P 441687 +TEX22 647310 +TEX26 122046 +TEX26-AS1 100507064 +TEX28 1527 +TEX28P1 728447 +TEX28P2 653363 +TEX28P3 102030688 +TEX29 121793 +TEX30 93081 +TEX35 84066 +TEX36 387718 +TEX36-AS1 100169752 +TEX38 374973 +TEX41 401014 +TEX44 165100 +TEX46 729059 +TEX47 219557 +TEX48 100505478 +TEX50 730159 +TEX51 101929926 +TEX52 101929469 +TEX53 105376230 +TEX54 111216277 +TEX55 152405 +TEX56P 404220 +TEX101 83639 +TEX101P1 117981793 +TEX261 113419 +TEX264 51368 +TF 7018 +TFAM 7019 +TFAMP1 260341 +TFAMP2 260340 +TFAP2A 7020 +TFAP2A-AS1 100130275 +TFAP2A-AS2 109729173 +TFAP2B 7021 +TFAP2C 7022 +TFAP2D 83741 +TFAP2E 339488 +TFAP2E-AS1 105378645 +TFAP4 7023 +TFB1M 51106 +TFB2M 64216 +TFCP2 7024 +TFCP2L1 29842 +TFDP1 7027 +TFDP1P1 391158 +TFDP1P2 441488 +TFDP1P3 390617 +TFDP2 7029 +TFDP3 51270 +TFE3 7030 +TFEB 7942 +TFEC 22797 +TFF1 7031 +TFF2 7032 +TFF3 7033 +TFG 10342 +TFGP1 100128379 +TFIP11 24144 +TFIP11-DT 100507599 +TFPI 7035 +TFPI2 7980 +TFPI2-DT 105375401 +TFPT 29844 +TFR2 7036 +TFRC 7037 +TG 7038 +TGDS 23483 +TGFA 7039 +TGFA-IT1 100874273 +TGFB1 7040 +TGFB1I1 7041 +TGFB2 7042 +TGFB2-AS1 728463 +TGFB2-OT1 103611157 +TGFB3 7043 +TGFB3-AS1 109729179 +TGFBI 7045 +TGFBR1 7046 +TGFBR2 7048 +TGFBR3 7049 +TGFBR3L 100507588 +TGFBRAP1 9392 +TGIF1 7050 +TGIF1P1 126052 +TGIF2 60436 +TGIF2-RAB5IF 100527943 +TGIF2LX 90316 +TGIF2LY 90655 +TGIF2P1 126826 +TGM1 7051 +TGM2 7052 +TGM3 7053 +TGM4 7047 +TGM5 9333 +TGM6 343641 +TGM7 116179 +TGOLN2 10618 +TGS1 96764 +TH 7054 +TH2LCRR 101927761 +THA1P 390816 +THADA 63892 +THAP1 55145 +THAP2 83591 +THAP3 90326 +THAP4 51078 +THAP5 168451 +THAP5P1 285872 +THAP5P2 100129618 +THAP6 152815 +THAP7 80764 +THAP7-AS1 439931 +THAP8 199745 +THAP9 79725 +THAP9-AS1 100499177 +THAP10 56906 +THAP11 57215 +THAP12 5612 +THAP12P1 728748 +THAP12P2 100422711 +THAP12P3 399774 +THAP12P4 100129382 +THAP12P5 100129074 +THAP12P6 100128764 +THAP12P7 100422712 +THAP12P8 645939 +THAP12P9 100131309 +THAP12P10 100422715 +THBD 7056 +THBS1 7057 +THBS1-AS1 118597840 +THBS1-IT1 118597829 +THBS2 7058 +THBS2-AS1 101929523 +THBS3 7059 +THBS3-AS1 105371450 +THBS4 7060 +THBS4-AS1 101929215 +THEM4 117145 +THEM4P1 677880 +THEM5 284486 +THEM6 51337 +THEM7P 106480297 +THEMIS 387357 +THEMIS2 9473 +THEMIS3P 100420484 +THG1L 54974 +THNSL1 79896 +THNSL2 55258 +THOC1 9984 +THOC1-DT 119139900 +THOC2 57187 +THOC3 84321 +THOC3-AS1 105377745 +THOC5 8563 +THOC6 79228 +THOC7 80145 +THOC7-AS1 100874039 +THOP1 7064 +THORLNC 100506797 +THPO 7066 +THRA 7067 +THRAP3 9967 +THRAP3P1 391524 +THRAP3P2 100421632 +THRAP3P3 100421595 +THRB 7068 +THRB-AS1 644990 +THRB-AS2 101927854 +THRB-IT1 100874274 +THRIL 102659353 +THRSP 7069 +THSD1 55901 +THSD1P1 374500 +THSD4 79875 +THSD4-AS1 101929196 +THSD4-AS2 101929173 +THSD7A 221981 +THSD7B 80731 +THSD8 111644133 +THTPA 79178 +THUMPD1 55623 +THUMPD1P1 391276 +THUMPD2 80745 +THUMPD3 25917 +THUMPD3-AS1 440944 +THUMPD3P1 100419989 +THY1 7070 +THY1-AS1 117134602 +THYN1 29087 +TIA1 7072 +TIAL1 7073 +TIAM1 7074 +TIAM1-AS1 150051 +TIAM2 26230 +TICAM1 148022 +TICAM2 353376 +TICAM2-AS1 101927100 +TICRR 90381 +TIE1 7075 +TIFA 92610 +TIFAB 497189 +TIGAR 57103 +TIGD1 200765 +TIGD2 166815 +TIGD3 220359 +TIGD4 201798 +TIGD5 84948 +TIGD6 81789 +TIGD7 91151 +TIGIT 201633 +TILRLS 123706549 +TIMD4 91937 +TIMELESS 8914 +TIMM8A 1678 +TIMM8AP1 399520 +TIMM8B 26521 +TIMM8BP1 100874425 +TIMM8BP2 100874417 +TIMM9 26520 +TIMM9P1 100862726 +TIMM9P2 100862727 +TIMM9P3 100862725 +TIMM10 26519 +TIMM10B 26515 +TIMM13 26517 +TIMM17A 10440 +TIMM17B 10245 +TIMM17BP1 390298 +TIMM21 29090 +TIMM22 29928 +TIMM23 100287932 +TIMM23B 100652748 +TIMM23B-AGAP6 113218477 +TIMM29 90580 +TIMM44 10469 +TIMM50 92609 +TIMMDC1 51300 +TIMMDC1-DT 118568812 +TIMP1 7076 +TIMP2 7077 +TIMP3 7078 +TIMP4 7079 +TINAG 27283 +TINAG-AS1 107986605 +TINAGL1 64129 +TINCR 257000 +TINF2 26277 +TIPARP 25976 +TIPARP-AS1 100287227 +TIPIN 54962 +TIPINP1 100125392 +TIPINP2 100125393 +TIPRL 261726 +TIRAP 114609 +TIRAP-AS1 105369557 +TJAP1 93643 +TJAP1P1 392539 +TJP1 7082 +TJP1P1 64730 +TJP2 9414 +TJP3 27134 +TK1 7083 +TK2 7084 +TKFC 26007 +TKT 7086 +TKTL1 8277 +TKTL2 84076 +TLCD1 116238 +TLCD2 727910 +TLCD3A 79850 +TLCD3B 83723 +TLCD4 148534 +TLCD4-RWDD3 100527978 +TLCD5 219902 +TLDC2 140711 +TLE1 7088 +TLE1-DT 101927502 +TLE1P1 645381 +TLE2 7089 +TLE3 7090 +TLE4 7091 +TLE5 166 +TLE6 79816 +TLE7 102723796 +TLK1 9874 +TLK1P1 100129793 +TLK2 11011 +TLK2P1 646202 +TLK2P2 553121 +TLL1 7092 +TLL2 7093 +TLN1 7094 +TLN2 83660 +TLNRD1 59274 +TLR1 7096 +TLR2 7097 +TLR3 7098 +TLR4 7099 +TLR5 7100 +TLR6 10333 +TLR7 51284 +TLR8 51311 +TLR8-AS1 349408 +TLR9 54106 +TLR10 81793 +TLR12P 100131451 +TLX1 3195 +TLX1NB 100038246 +TLX2 3196 +TLX3 30012 +TM2D1 83941 +TM2D2 83877 +TM2D3 80213 +TM4SF1 4071 +TM4SF1-AS1 100874091 +TM4SF4 7104 +TM4SF5 9032 +TM4SF18 116441 +TM4SF18-AS1 128193290 +TM4SF19 116211 +TM4SF19-AS1 100874214 +TM4SF19-DYNLT2B 100534611 +TM4SF20 79853 +TM6SF1 53346 +TM6SF2 53345 +TM7SF2 7108 +TM7SF3 51768 +TM9SF1 10548 +TM9SF2 9375 +TM9SF3 56889 +TM9SF4 9777 +TM9SF5P 100420958 +TMA7 51372 +TMA7B 112268293 +TMA16 55319 +TMA16P1 100101405 +TMA16P2 100101407 +TMBIM1 64114 +TMBIM4 51643 +TMBIM6 7009 +TMBIM7P 105375396 +TMC1 117531 +TMC2 117532 +TMC3 342125 +TMC3-AS1 101929655 +TMC4 147798 +TMC5 79838 +TMC6 11322 +TMC7 79905 +TMC8 147138 +TMCC1 23023 +TMCC1-DT 100507032 +TMCC1P1 100128132 +TMCC2 9911 +TMCC2-AS1 101929459 +TMCC3 57458 +TMCO1 54499 +TMCO1-AS1 100147773 +TMCO2 127391 +TMCO3 55002 +TMCO4 255104 +TMCO5A 145942 +TMCO5B 100652857 +TMCO6 55374 +TMDD1 112163659 +TMED1 11018 +TMED2 10959 +TMED2-DT 101927415 +TMED2P1 100421730 +TMED3 23423 +TMED4 222068 +TMED5 50999 +TMED6 146456 +TMED7 51014 +TMED7-TICAM2 100302736 +TMED8 283578 +TMED9 54732 +TMED10 10972 +TMED10P1 286102 +TMED10P2 100129727 +TMED11P 100379220 +TMEFF1 8577 +TMEFF2 23671 +TMEM8B 51754 +TMEM9 252839 +TMEM9B 56674 +TMEM9B-AS1 493900 +TMEM11 8834 +TMEM11-DT 107984969 +TMEM14A 28978 +TMEM14B 81853 +TMEM14B-DT 118597831 +TMEM14C 51522 +TMEM14DP 645203 +TMEM14EP 645843 +TMEM17 200728 +TMEM18 129787 +TMEM18-DT 105373354 +TMEM19 55266 +TMEM25 84866 +TMEM26 219623 +TMEM26-AS1 101928781 +TMEM30A 55754 +TMEM30A-DT 100506804 +TMEM30B 161291 +TMEM30BP1 101928242 +TMEM30CP 644444 +TMEM31 203562 +TMEM33 55161 +TMEM35A 59353 +TMEM35B 100506144 +TMEM37 140738 +TMEM38A 79041 +TMEM38B 55151 +TMEM38BP1 100131216 +TMEM39A 55254 +TMEM39B 55116 +TMEM40 55287 +TMEM41A 90407 +TMEM41B 440026 +TMEM42 131616 +TMEM43 79188 +TMEM44 93109 +TMEM44-AS1 100507297 +TMEM44-AS2 122152323 +TMEM45A 55076 +TMEM45B 120224 +TMEM47 83604 +TMEM50A 23585 +TMEM50B 757 +TMEM51 55092 +TMEM51-AS1 200197 +TMEM51-AS2 727684 +TMEM52 339456 +TMEM52B 120939 +TMEM53 79639 +TMEM54 113452 +TMEM59 9528 +TMEM59L 25789 +TMEM60 85025 +TMEM61 199964 +TMEM62 80021 +TMEM63A 9725 +TMEM63B 55362 +TMEM63C 57156 +TMEM64 169200 +TMEM65 157378 +TMEM67 91147 +TMEM68 137695 +TMEM69 51249 +TMEM69P1 100127982 +TMEM69P2 100419853 +TMEM70 54968 +TMEM71 137835 +TMEM72 643236 +TMEM72-AS1 220980 +TMEM74 157753 +TMEM74B 55321 +TMEM78 677790 +TMEM79 84283 +TMEM80 283232 +TMEM81 388730 +TMEM82 388595 +TMEM86A 144110 +TMEM86B 255043 +TMEM87A 25963 +TMEM87B 84910 +TMEM88 92162 +TMEM88B 643965 +TMEM89 440955 +TMEM91 641649 +TMEM92 162461 +TMEM92-AS1 103752589 +TMEM94 9772 +TMEM95 339168 +TMEM97 27346 +TMEM97P1 100873880 +TMEM97P2 724059 +TMEM98 26022 +TMEM100 55273 +TMEM101 84336 +TMEM102 284114 +TMEM104 54868 +TMEM105 284186 +TMEM106A 113277 +TMEM106B 54664 +TMEM106C 79022 +TMEM107 84314 +TMEM108 66000 +TMEM108-AS1 101927455 +TMEM109 79073 +TMEM109-DT 105369323 +TMEM114 283953 +TMEM115 11070 +TMEM116 89894 +TMEM117 84216 +TMEM119 338773 +TMEM120A 83862 +TMEM120B 144404 +TMEM121 80757 +TMEM121B 27439 +TMEM123 114908 +TMEM123-DT 101928424 +TMEM125 128218 +TMEM126A 84233 +TMEM126B 55863 +TMEM127 55654 +TMEM128 85013 +TMEM129 92305 +TMEM130 222865 +TMEM131 23505 +TMEM131L 23240 +TMEM132A 54972 +TMEM132B 114795 +TMEM132C 92293 +TMEM132D 121256 +TMEM132D-AS1 283352 +TMEM132D-AS2 101927735 +TMEM132E 124842 +TMEM132E-DT 400591 +TMEM134 80194 +TMEM135 65084 +TMEM138 51524 +TMEM139 135932 +TMEM139-AS1 105375545 +TMEM140 55281 +TMEM141 85014 +TMEM143 55260 +TMEM144 55314 +TMEM145 284339 +TMEM147 10430 +TMEM147-AS1 100506469 +TMEM150A 129303 +TMEM150B 284417 +TMEM150C 441027 +TMEM151A 256472 +TMEM151B 441151 +TMEM154 201799 +TMEM156 80008 +TMEM158 25907 +TMEM160 54958 +TMEM161A 54929 +TMEM161B 153396 +TMEM161B-DT 100505894 +TMEM161BP1 646360 +TMEM163 81615 +TMEM164 84187 +TMEM165 55858 +TMEM167A 153339 +TMEM167AP1 360028 +TMEM167AP2 100129118 +TMEM167B 56900 +TMEM167B-DT 105378892 +TMEM168 64418 +TMEM169 92691 +TMEM170A 124491 +TMEM170B 100113407 +TMEM171 134285 +TMEM174 134288 +TMEM175 84286 +TMEM176A 55365 +TMEM176B 28959 +TMEM177 80775 +TMEM178A 130733 +TMEM178B 100507421 +TMEM179 388021 +TMEM179B 374395 +TMEM181 57583 +TMEM182 130827 +TMEM183A 92703 +TMEM183AP1 100048909 +TMEM183AP2 646616 +TMEM183AP3 388104 +TMEM183AP4 100287335 +TMEM183AP5 100130326 +TMEM183AP6 100286958 +TMEM183BP 653659 +TMEM184A 202915 +TMEM184B 25829 +TMEM184B-AS1 128385376 +TMEM184C 55751 +TMEM184C-DT 121009648 +TMEM184CP1 100129133 +TMEM185A 84548 +TMEM185AP1 100506205 +TMEM185B 79134 +TMEM186 25880 +TMEM187 8269 +TMEM190 147744 +TMEM191A 84222 +TMEM191B 728229 +TMEM191C 645426 +TMEM192 201931 +TMEM196 256130 +TMEM198 130612 +TMEM198B 440104 +TMEM199 147007 +TMEM200A 114801 +TMEM200B 399474 +TMEM200C 645369 +TMEM201 199953 +TMEM202 338949 +TMEM202-AS1 105370888 +TMEM203 94107 +TMEM204 79652 +TMEM205 374882 +TMEM207 131920 +TMEM208 29100 +TMEM209 84928 +TMEM210 100505993 +TMEM212 389177 +TMEM212-AS1 100874219 +TMEM212-IT1 100874359 +TMEM213 155006 +TMEM214 54867 +TMEM215 401498 +TMEM216 51259 +TMEM217 221468 +TMEM217B 121725057 +TMEM218 219854 +TMEM219 124446 +TMEM220 388335 +TMEM220-AS1 101101775 +TMEM221 100130519 +TMEM222 84065 +TMEM223 79064 +TMEM225 338661 +TMEM225B 100289187 +TMEM229A 730130 +TMEM229B 161145 +TMEM229BP1 127482539 +TMEM230 29058 +TMEM230P1 117981795 +TMEM230P2 642975 +TMEM231 79583 +TMEM231P1 100420067 +TMEM232 642987 +TMEM233 387890 +TMEM234 56063 +TMEM235 283999 +TMEM236 653567 +TMEM237 65062 +TMEM238 388564 +TMEM238L 100289255 +TMEM239 100288797 +TMEM240 339453 +TMEM241 85019 +TMEM242 729515 +TMEM242-DT 118732303 +TMEM243 79161 +TMEM244 253582 +TMEM245 23731 +TMEM246-AS1 101928470 +TMEM247 388946 +TMEM248 55069 +TMEM248P1 645841 +TMEM249 340393 +TMEM250 90120 +TMEM252 169693 +TMEM252-DT 105376072 +TMEM253 643382 +TMEM254 80195 +TMEM254-AS1 219347 +TMEM255A 55026 +TMEM255B 348013 +TMEM256 254863 +TMEM256-PLSCR3 100529211 +TMEM256P1 645269 +TMEM256P2 106479054 +TMEM258 746 +TMEM258P1 100288935 +TMEM258P2 100506400 +TMEM259 91304 +TMEM260 54916 +TMEM262 100130348 +TMEM263 90488 +TMEM263-DT 119863870 +TMEM265 100862671 +TMEM266 123591 +TMEM267 64417 +TMEM268 203197 +TMEM269 100129924 +TMEM269-DT 105378683 +TMEM270 135886 +TMEM271 112441426 +TMEM272 283521 +TMEM273 170371 +TMEM274P 113391335 +TMEM275 105378696 +TMEM276 84773 +TMEM276-ZFTRAF1 157542 +TMEM277P 284365 +TMF1 7110 +TMF1P1 106480320 +TMIE 259236 +TMIGD1 388364 +TMIGD2 126259 +TMIGD3 57413 +TMLHE 55217 +TMLHE-AS1 100507404 +TMLHEP1 553939 +TMOD1 7111 +TMOD2 29767 +TMOD3 29766 +TMOD4 29765 +TMPO 7112 +TMPO-AS1 100128191 +TMPOP1 100129772 +TMPOP2 100533619 +TMPPE 643853 +TMPRSS2 7113 +TMPRSS3 64699 +TMPRSS4 56649 +TMPRSS5 80975 +TMPRSS6 164656 +TMPRSS7 344805 +TMPRSS9 360200 +TMPRSS11A 339967 +TMPRSS11B 132724 +TMPRSS11BNL 401136 +TMPRSS11CP 100381178 +TMPRSS11D 9407 +TMPRSS11E 28983 +TMPRSS11F 389208 +TMPRSS11GP 644759 +TMPRSS12 283471 +TMPRSS13 84000 +TMPRSS15 5651 +TMSB4X 7114 +TMSB4XP1 7115 +TMSB4XP2 7116 +TMSB4XP3 100873877 +TMSB4XP4 7118 +TMSB4XP5 7119 +TMSB4XP6 7120 +TMSB4XP7 7121 +TMSB4XP8 7117 +TMSB4Y 9087 +TMSB10 9168 +TMSB10P1 100506723 +TMSB10P2 100873786 +TMSB15A 11013 +TMSB15B 286527 +TMSB15B-AS1 100128594 +TMSB15C 122394733 +TMT1A 25840 +TMT1AP1 100996686 +TMT1B 196410 +TMTC1 83857 +TMTC2 160335 +TMTC3 160418 +TMTC4 84899 +TMUB1 83590 +TMUB2 79089 +TMX1 81542 +TMX1P1 100101126 +TMX1P2 100101127 +TMX2 51075 +TMX2-CTNND1 100528016 +TMX2P1 100233198 +TMX3 54495 +TMX4 56255 +TMX4-AS1 105372520 +TNC 3371 +TNF 7124 +TNFAIP1 7126 +TNFAIP2 7127 +TNFAIP3 7128 +TNFAIP6 7130 +TNFAIP8 25816 +TNFAIP8L1 126282 +TNFAIP8L2 79626 +TNFAIP8L3 388121 +TNFRSF1A 7132 +TNFRSF1B 7133 +TNFRSF4 7293 +TNFRSF6B 8771 +TNFRSF8 943 +TNFRSF9 3604 +TNFRSF10A 8797 +TNFRSF10A-AS1 110806274 +TNFRSF10A-DT 389641 +TNFRSF10B 8795 +TNFRSF10C 8794 +TNFRSF10D 8793 +TNFRSF11A 8792 +TNFRSF11B 4982 +TNFRSF12A 51330 +TNFRSF13B 23495 +TNFRSF13C 115650 +TNFRSF14 8764 +TNFRSF14-AS1 115110 +TNFRSF17 608 +TNFRSF18 8784 +TNFRSF19 55504 +TNFRSF21 27242 +TNFRSF25 8718 +TNFSF4 7292 +TNFSF8 944 +TNFSF9 8744 +TNFSF10 8743 +TNFSF11 8600 +TNFSF12 8742 +TNFSF12-TNFSF13 407977 +TNFSF13 8741 +TNFSF13B 10673 +TNFSF14 8740 +TNFSF15 9966 +TNFSF18 8995 +TNIK 23043 +TNIP1 10318 +TNIP2 79155 +TNIP2P1 100132831 +TNIP3 79931 +TNK1 8711 +TNK2 10188 +TNK2-AS1 100128262 +TNKS 8658 +TNKS1BP1 85456 +TNKS2 80351 +TNKS2-DT 100507633 +TNMD 64102 +TNN 63923 +TNNC1 7134 +TNNC2 7125 +TNNI1 7135 +TNNI2 7136 +TNNI3 7137 +TNNI3K 51086 +TNNT1 7138 +TNNT2 7139 +TNNT3 7140 +TNP1 7141 +TNP2 7142 +TNPO1 3842 +TNPO1-DT 121232377 +TNPO1P1 100418919 +TNPO1P2 252968 +TNPO1P3 339257 +TNPO2 30000 +TNPO3 23534 +TNPO3P1 100131029 +TNR 7143 +TNR-IT1 100874256 +TNRC6A 27327 +TNRC6B 23112 +TNRC6B-DT 114841040 +TNRC6C 57690 +TNRC17 27321 +TNRC18 84629 +TNRC18P1 644962 +TNRC18P2 27320 +TNRC18P3 340221 +TNS1 7145 +TNS1-AS1 105373878 +TNS2 23371 +TNS2-AS1 283335 +TNS3 64759 +TNS4 84951 +TNXA 7146 +TNXB 7148 +TOB1 10140 +TOB1-AS1 400604 +TOB2 10766 +TOB2P1 222699 +TODL 107984471 +TOE1 114034 +TOGARAM1 23116 +TOGARAM2 165186 +TOLLIP 54472 +TOLLIP-DT 255512 +TOM1 10043 +TOM1L1 10040 +TOM1L2 146691 +TOMM5 401505 +TOMM6 100188893 +TOMM7 54543 +TOMM20 9804 +TOMM20L 387990 +TOMM20L-DT 105370522 +TOMM20P1 105369446 +TOMM20P2 101927540 +TOMM20P3 106480301 +TOMM20P4 100129272 +TOMM22 56993 +TOMM22-DT 124905117 +TOMM22P1 100499416 +TOMM22P2 100499417 +TOMM22P3 122038 +TOMM22P4 100874517 +TOMM22P5 390007 +TOMM22P6 100287573 +TOMM34 10953 +TOMM40 10452 +TOMM40L 84134 +TOMM40P1 642661 +TOMM40P2 729057 +TOMM40P3 646639 +TOMM40P4 100422473 +TOMM70 9868 +TOMT 120356740 +TONSL 4796 +TONSL-AS1 100287098 +TOP1 7150 +TOP1MT 116447 +TOP1P1 7151 +TOP1P2 7152 +TOP2A 7153 +TOP2B 7155 +TOP3A 7156 +TOP3B 8940 +TOP3BP1 23751 +TOP6BL 79703 +TOPAZ1 375337 +TOPBP1 11073 +TOPORS 10210 +TOPORSLP 347281 +TOR1A 1861 +TOR1AIP1 26092 +TOR1AIP2 163590 +TOR1B 27348 +TOR1BP1 100420888 +TOR2A 27433 +TOR3A 64222 +TOR4A 54863 +TOX 9760 +TOX-DT 100505501 +TOX2 84969 +TOX3 27324 +TOX4 9878 +TOX4P1 285412 +TP53 7157 +TP53AIP1 63970 +TP53BP1 7158 +TP53BP2 7159 +TP53BP2P1 94299 +TP53COR1 102800311 +TP53I3 9540 +TP53I11 9537 +TP53I13 90313 +TP53INP1 94241 +TP53INP2 58476 +TP53RK 112858 +TP53RK-DT 118597844 +TP53TG1 11257 +TP53TG3 24150 +TP53TG3B 729355 +TP53TG3C 653550 +TP53TG3D 729264 +TP53TG3E 102724101 +TP53TG3F 102724127 +TP53TG3GP 106660619 +TP53TG3HP 100130700 +TP53TG5 27296 +TP63 8626 +TP73 7161 +TP73-AS2 117134600 +TP73-AS3 105378610 +TPBG 7162 +TPBGL 100507050 +TPBGL-AS1 105369388 +TPCN1 53373 +TPCN2 219931 +TPD52 7163 +TPD52L1 7164 +TPD52L2 7165 +TPD52L3 89882 +TPGS1 91978 +TPGS2 25941 +TPH1 7166 +TPH2 121278 +TPI1 7167 +TPI1P1 729708 +TPI1P2 286016 +TPI1P3 728402 +TPI1P4 728629 +TPK1 27010 +TPM1 7168 +TPM1-AS 111064646 +TPM2 7169 +TPM2P1 100130620 +TPM3 7170 +TPM3P1 252956 +TPM3P2 170555 +TPM3P3 106478937 +TPM3P4 402643 +TPM3P5 644330 +TPM3P6 653758 +TPM3P7 751599 +TPM3P8 646839 +TPM3P9 147804 +TPM4 7171 +TPM4P1 644566 +TPM4P2 643634 +TPM4P3 100129096 +TPMT 7172 +TPMTP1 400650 +TPMTP2 100420393 +TPMTP3 100129277 +TPMTP4 100129298 +TPO 7173 +TPP1 1200 +TPP2 7174 +TPPP 11076 +TPPP2 122664 +TPPP3 51673 +TPR 7175 +TPRA1 131601 +TPRG1 285386 +TPRG1-AS1 100874043 +TPRG1-AS2 100874027 +TPRG1L 127262 +TPRG1LP1 100130490 +TPRKB 51002 +TPRKBP1 101060176 +TPRKBP2 106480804 +TPRN 286262 +TPRX1 284355 +TPRX1P1 503628 +TPRX2 503627 +TPRXL 348825 +TPSAB1 7177 +TPSB2 64499 +TPSD1 23430 +TPSG1 25823 +TPSP1 100129339 +TPSP2 650474 +TPST1 8460 +TPST2 8459 +TPST2P1 100420710 +TPT1 7178 +TPT1-AS1 100190939 +TPT1P1 100131268 +TPT1P2 100128483 +TPT1P3 100421439 +TPT1P4 285741 +TPT1P5 100421420 +TPT1P6 643870 +TPT1P7 102723852 +TPT1P8 59347 +TPT1P9 389787 +TPT1P10 101928715 +TPT1P11 102724868 +TPT1P12 100421480 +TPT1P13 643421 +TPT1P14 100128521 +TPT1P15 122965329 +TPTE 7179 +TPTE2 93492 +TPTE2-AS1 100874136 +TPTE2P1 646405 +TPTE2P2 644623 +TPTE2P3 220115 +TPTE2P4 286573 +TPTE2P5 100616668 +TPTE2P6 374491 +TPTE2P7 127379748 +TPTEP1 387590 +TPTEP2 400927 +TPTEP2-CSNK1E 102800317 +TPX2 22974 +TRA 6955 +TRA-AGC1-1 100189346 +TRA-AGC2-1 100189093 +TRA-AGC2-2 100189295 +TRA-AGC3-1 100189299 +TRA-AGC4-1 100189046 +TRA-AGC5-1 100189047 +TRA-AGC6-1 100189042 +TRA-AGC7-1 100189092 +TRA-AGC8-1 100009604 +TRA-AGC8-2 100189398 +TRA-AGC9-1 100189156 +TRA-AGC9-2 100189423 +TRA-AGC10-1 100189128 +TRA-AGC11-1 100009603 +TRA-AGC12-1 100189369 +TRA-AGC12-2 100189327 +TRA-AGC12-3 100189106 +TRA-AGC13-1 100189411 +TRA-AGC13-2 100189060 +TRA-AGC13-3 +TRA-AGC14-1 100189358 +TRA-AGC14-2 116485202 +TRA-AGC15-1 100189117 +TRA-AGC16-1 100189312 +TRA-AGC17-1 100189353 +TRA-AGC18-1 100189341 +TRA-AGC18-2 100189212 +TRA-AGC19-1 100189246 +TRA-AGC20-1 100189116 +TRA-AGC21-1 100189192 +TRA-AGC22-1 100189434 +TRA-AGC23-1 100189468 +TRA-AGC24-1 116485204 +TRA-CGC1-1 100189308 +TRA-CGC2-1 100189400 +TRA-CGC3-1 100189021 +TRA-CGC4-1 100189033 +TRA-CGC5-1 100189395 +TRA-TGC1-1 100189149 +TRA-TGC2-1 100189114 +TRA-TGC3-1 100189280 +TRA-TGC3-2 100189232 +TRA-TGC4-1 100189339 +TRA-TGC5-1 100189066 +TRA-TGC6-1 100189082 +TRA-TGC7-1 7154 +TRA-TGC8-1 100189256 +TRA-TGC9-1 100189529 +TRA-TGC10-1 100189469 +TRA2A 29896 +TRA2B 6434 +TRABD 80305 +TRABD-AS1 123706513 +TRABD2A 129293 +TRABD2B 388630 +TRAC 28755 +TRADD 8717 +TRAF1 7185 +TRAF2 7186 +TRAF3 7187 +TRAF3IP1 26146 +TRAF3IP2 10758 +TRAF3IP2-AS1 643749 +TRAF3IP3 80342 +TRAF4 9618 +TRAF5 7188 +TRAF6 7189 +TRAF6P1 644871 +TRAF7 84231 +TRAFD1 10906 +TRAIP 10293 +TRAJ1 28754 +TRAJ2 28753 +TRAJ3 28752 +TRAJ4 28751 +TRAJ5 28750 +TRAJ6 28749 +TRAJ7 28748 +TRAJ8 28747 +TRAJ9 28746 +TRAJ10 28745 +TRAJ11 28744 +TRAJ12 28743 +TRAJ13 28742 +TRAJ14 28741 +TRAJ15 28740 +TRAJ16 28739 +TRAJ17 28738 +TRAJ18 28737 +TRAJ19 28736 +TRAJ20 28735 +TRAJ21 28734 +TRAJ22 28733 +TRAJ23 28732 +TRAJ24 28731 +TRAJ25 28730 +TRAJ26 28729 +TRAJ27 28728 +TRAJ28 28727 +TRAJ29 28726 +TRAJ30 28725 +TRAJ31 28724 +TRAJ32 28723 +TRAJ33 28722 +TRAJ34 28721 +TRAJ35 28720 +TRAJ36 28719 +TRAJ37 28718 +TRAJ38 28717 +TRAJ39 28716 +TRAJ40 28715 +TRAJ41 28714 +TRAJ42 28713 +TRAJ43 28712 +TRAJ44 28711 +TRAJ45 28710 +TRAJ46 28709 +TRAJ47 28708 +TRAJ48 28707 +TRAJ49 28706 +TRAJ50 28705 +TRAJ51 28704 +TRAJ52 28703 +TRAJ53 28702 +TRAJ54 28701 +TRAJ55 28700 +TRAJ56 28699 +TRAJ57 28698 +TRAJ58 28697 +TRAJ59 28696 +TRAJ60 28695 +TRAJ61 28694 +TRAK1 22906 +TRAK2 66008 +TRAM1 23471 +TRAM1L1 133022 +TRAM2 9697 +TRAM2-AS1 401264 +TRANK1 9881 +TRAP1 10131 +TRAPPC1 58485 +TRAPPC2 6399 +TRAPPC2B 10597 +TRAPPC2L 51693 +TRAPPC2LP1 100421462 +TRAPPC2P2 27196 +TRAPPC2P3 27195 +TRAPPC2P4 27194 +TRAPPC2P5 27193 +TRAPPC2P6 27192 +TRAPPC2P7 392597 +TRAPPC2P8 414751 +TRAPPC2P9 414753 +TRAPPC2P10 414752 +TRAPPC3 27095 +TRAPPC3L 100128327 +TRAPPC4 51399 +TRAPPC5 126003 +TRAPPC6A 79090 +TRAPPC6B 122553 +TRAPPC8 22878 +TRAPPC9 83696 +TRAPPC10 7109 +TRAPPC11 60684 +TRAPPC12 51112 +TRAPPC12-AS1 100861515 +TRAPPC13 80006 +TRAPPC13P1 646193 +TRAPPC14 55262 +TRARG1 286753 +TRAT1 50852 +TRAV1-1 28693 +TRAV1-2 28692 +TRAV2 28691 +TRAV3 28690 +TRAV4 28689 +TRAV5 28688 +TRAV6 6956 +TRAV7 28686 +TRAV8-1 28685 +TRAV8-2 28684 +TRAV8-3 28683 +TRAV8-4 28682 +TRAV8-5 28681 +TRAV8-6 28680 +TRAV8-7 28679 +TRAV9-1 28678 +TRAV9-2 28677 +TRAV10 28676 +TRAV11 28675 +TRAV12-1 28674 +TRAV12-2 28673 +TRAV12-3 28672 +TRAV13-1 28671 +TRAV13-2 28670 +TRAV14DV4 28669 +TRAV15 28668 +TRAV16 28667 +TRAV17 28666 +TRAV18 28665 +TRAV19 28664 +TRAV20 28663 +TRAV21 28662 +TRAV22 28661 +TRAV23DV6 28660 +TRAV24 28659 +TRAV25 28658 +TRAV26-1 28657 +TRAV26-2 28656 +TRAV27 28655 +TRAV28 28654 +TRAV29DV5 28653 +TRAV30 28652 +TRAV31 28651 +TRAV32 28650 +TRAV33 28649 +TRAV34 28648 +TRAV35 28647 +TRAV36DV7 28646 +TRAV37 28645 +TRAV38-1 28644 +TRAV38-2DV8 28643 +TRAV39 28642 +TRAV40 28641 +TRAV41 28640 +TRB 6957 +TRBC1 28639 +TRBC2 28638 +TRBD1 28637 +TRBD2 28636 +TRBJ1-1 28635 +TRBJ1-2 28634 +TRBJ1-3 28633 +TRBJ1-4 28632 +TRBJ1-5 28631 +TRBJ1-6 28630 +TRBJ2-1 28629 +TRBJ2-2 28628 +TRBJ2-2P 28627 +TRBJ2-3 28626 +TRBJ2-4 28625 +TRBJ2-5 28624 +TRBJ2-6 28623 +TRBJ2-7 28622 +TRBV1 28621 +TRBV2 28620 +TRBV3-1 28619 +TRBV3-2 28618 +TRBV4-1 28617 +TRBV4-2 28616 +TRBV4-3 28615 +TRBV5-1 28614 +TRBV5-2 28613 +TRBV5-3 28612 +TRBV5-4 28611 +TRBV5-5 28610 +TRBV5-6 28609 +TRBV5-7 28608 +TRBV5-8 28607 +TRBV6-1 28606 +TRBV6-2 28605 +TRBV6-3 28604 +TRBV6-4 28603 +TRBV6-5 28602 +TRBV6-6 28601 +TRBV6-7 28600 +TRBV6-8 28599 +TRBV6-9 28598 +TRBV7-1 28597 +TRBV7-2 28596 +TRBV7-3 28595 +TRBV7-4 28594 +TRBV7-5 28593 +TRBV7-6 28592 +TRBV7-7 28591 +TRBV7-8 28590 +TRBV7-9 28589 +TRBV8-1 28588 +TRBV8-2 28587 +TRBV9 28586 +TRBV10-1 28585 +TRBV10-2 28584 +TRBV10-3 28583 +TRBV11-1 28582 +TRBV11-2 28581 +TRBV11-3 28580 +TRBV12-1 28579 +TRBV12-2 28578 +TRBV12-3 28577 +TRBV12-4 28576 +TRBV12-5 28575 +TRBV13 28574 +TRBV14 28573 +TRBV15 28572 +TRBV16 28571 +TRBV17 28570 +TRBV18 28569 +TRBV19 28568 +TRBV20-1 28567 +TRBV20OR9-2 6962 +TRBV21-1 28566 +TRBV21OR9-2 6959 +TRBV22-1 28565 +TRBV22OR9-2 246283 +TRBV23-1 28564 +TRBV23OR9-2 28552 +TRBV24-1 28563 +TRBV24OR9-2 6961 +TRBV25-1 28562 +TRBV25OR9-2 6960 +TRBV26 28561 +TRBV26OR9-2 246285 +TRBV27 28560 +TRBV28 28559 +TRBV29-1 28558 +TRBV29OR9-2 6958 +TRBV30 28557 +TRBVA 28556 +TRBVAOR9-2 246286 +TRBVB 28555 +TRBVC 103106900 +TRC-ACA1-1 100189508 +TRC-GCA1-1 100189144 +TRC-GCA2-1 100189197 +TRC-GCA2-2 100189052 +TRC-GCA2-3 100189105 +TRC-GCA2-4 100189414 +TRC-GCA3-1 100189097 +TRC-GCA4-1 100189090 +TRC-GCA5-1 100189155 +TRC-GCA6-1 100189179 +TRC-GCA7-1 107985761 +TRC-GCA8-1 100189359 +TRC-GCA9-1 100189250 +TRC-GCA9-2 100189413 +TRC-GCA9-3 100189376 +TRC-GCA9-4 100189379 +TRC-GCA10-1 100189305 +TRC-GCA11-1 100189008 +TRC-GCA12-1 100189075 +TRC-GCA13-1 100189357 +TRC-GCA14-1 100189435 +TRC-GCA15-1 100189267 +TRC-GCA16-1 100189146 +TRC-GCA17-1 100189289 +TRC-GCA18-1 100189049 +TRC-GCA19-1 100189177 +TRC-GCA20-1 100189355 +TRC-GCA21-1 100189375 +TRC-GCA22-1 100189029 +TRC-GCA23-1 100189194 +TRC-GCA24-1 7183 +TRC-GCA25-1 100189447 +TRD 6964 +TRD-AS1 105370401 +TRD-GTC1-1 100189207 +TRD-GTC2-1 100189412 +TRD-GTC2-2 100189235 +TRD-GTC2-3 100189290 +TRD-GTC2-4 100189134 +TRD-GTC2-5 100189120 +TRD-GTC2-6 100189158 +TRD-GTC2-7 100189292 +TRD-GTC2-8 100189239 +TRD-GTC2-9 100189343 +TRD-GTC2-10 100189347 +TRD-GTC2-11 100189383 +TRD-GTC3-1 100189200 +TRD-GTC4-1 100188994 +TRD-GTC5-1 100189061 +TRD-GTC6-1 100189150 +TRD-GTC7-1 100189087 +TRD-GTC8-1 100189431 +TRD-GTC9-1 7192 +TRD-GTC10-1 100189495 +TRDC 28526 +TRDD1 28525 +TRDD2 28524 +TRDD3 28523 +TRDJ1 28522 +TRDJ2 28521 +TRDJ3 28520 +TRDJ4 28519 +TRDMT1 1787 +TRDN 10345 +TRDN-AS1 101927990 +TRDV1 28518 +TRDV2 28517 +TRDV3 28516 +TRE-CTC1-1 100189384 +TRE-CTC1-2 100189091 +TRE-CTC1-3 100189385 +TRE-CTC1-4 100189259 +TRE-CTC1-5 100189017 +TRE-CTC1-6 100189024 +TRE-CTC1-7 100189269 +TRE-CTC2-1 100189409 +TRE-CTC3-1 100189007 +TRE-CTC4-1 100189506 +TRE-CTC5-1 100189236 +TRE-CTC6-1 100189417 +TRE-CTC7-1 100189491 +TRE-CTC8-1 100189044 +TRE-CTC9-1 100189494 +TRE-CTC10-1 100189532 +TRE-CTC11-1 100189488 +TRE-CTC12-1 100189440 +TRE-CTC13-1 100189459 +TRE-CTC14-1 100189450 +TRE-CTC15-1 100189527 +TRE-CTC16-1 100189528 +TRE-CTC17-1 100189113 +TRE-CTC18-1 100189492 +TRE-TTC1-1 100189418 +TRE-TTC1-2 100189333 +TRE-TTC2-1 100189030 +TRE-TTC2-2 100189063 +TRE-TTC3-1 7193 +TRE-TTC4-1 107985758 +TRE-TTC4-2 100189407 +TRE-TTC5-1 100189031 +TRE-TTC6-1 100189465 +TRE-TTC7-1 100189457 +TRE-TTC8-1 100189068 +TRE-TTC8-2 +TRE-TTC9-1 100189518 +TRE-TTC10-1 100189454 +TRE-TTC11-1 100189129 +TRE-TTC12-1 100189000 +TRE-TTC13-1 100189054 +TRE-TTC14-1 100189485 +TRE-TTC15-1 100189484 +TRE-TTC16-1 100189210 +TREH 11181 +TREHP1 768086 +TREM1 54210 +TREM2 54209 +TREML1 340205 +TREML2 79865 +TREML3P 340206 +TREML4 285852 +TREML5P 221438 +TRERF1 55809 +TRERNA1 100887755 +TREX1 11277 +TREX2 11219 +TRF-GAA1-1 100189137 +TRF-GAA1-2 100189254 +TRF-GAA1-3 100189415 +TRF-GAA1-4 100009606 +TRF-GAA1-5 100189251 +TRF-GAA1-6 100189306 +TRF-GAA2-1 100009605 +TRF-GAA3-1 100189170 +TRF-GAA4-1 100189293 +TRF-GAA5-1 100189145 +TRF-GAA6-1 100189262 +TRF-GAA7-1 100189421 +TRF-GAA8-1 100189446 +TRF-GAA9-1 100189533 +TRF-GAA10-1 100189497 +TRF-GAA11-1 100189472 +TRF-GAA12-1 100189471 +TRG 6965 +TRG-AS1 100506776 +TRG-CCC1-1 7195 +TRG-CCC1-2 100189298 +TRG-CCC2-1 100189231 +TRG-CCC2-2 64717 +TRG-CCC3-1 100189277 +TRG-CCC4-1 107985759 +TRG-CCC5-1 100189045 +TRG-CCC6-1 107985748 +TRG-CCC7-1 100189458 +TRG-CCC8-1 103539958 +TRG-GCC1-1 100189366 +TRG-GCC1-2 100189252 +TRG-GCC1-3 100189230 +TRG-GCC1-4 100189160 +TRG-GCC1-5 100189284 +TRG-GCC2-1 100189380 +TRG-GCC2-2 100189208 +TRG-GCC2-3 100189314 +TRG-GCC2-4 100188985 +TRG-GCC2-5 100189163 +TRG-GCC2-6 7196 +TRG-GCC3-1 7198 +TRG-GCC4-1 100189274 +TRG-GCC5-1 100189220 +TRG-GCC6-1 100189081 +TRG-TCC1-1 7197 +TRG-TCC2-1 100189064 +TRG-TCC2-2 100189260 +TRG-TCC2-3 100189141 +TRG-TCC2-4 100189188 +TRG-TCC2-5 100189039 +TRG-TCC2-6 100189011 +TRG-TCC3-1 100189206 +TRG-TCC4-1 100188997 +TRG-TCC5-1 100189460 +TRG-TCC6-1 100189511 +TRGC1 6966 +TRGC2 6967 +TRGJ1 6968 +TRGJ2 6969 +TRGJP 6970 +TRGJP1 6971 +TRGJP2 6972 +TRGV1 6973 +TRGV2 6974 +TRGV3 6976 +TRGV4 6977 +TRGV5 6978 +TRGV5P 6979 +TRGV6 6980 +TRGV7 6981 +TRGV8 6982 +TRGV9 6983 +TRGV10 6984 +TRGV11 6985 +TRGVA 6986 +TRGVB 6987 +TRH 7200 +TRH-GTG1-1 100188991 +TRH-GTG1-2 100189334 +TRH-GTG1-3 100189307 +TRH-GTG1-4 100189174 +TRH-GTG1-5 100188987 +TRH-GTG1-6 100009607 +TRH-GTG1-7 100188986 +TRH-GTG1-8 100188988 +TRH-GTG1-9 100189065 +TRH-GTG2-1 100189350 +TRH-GTG3-1 100189242 +TRHDE 29953 +TRHDE-AS1 283392 +TRHR 7201 +TRI-AAT1-1 100189249 +TRI-AAT2-1 100189071 +TRI-AAT3-1 100189213 +TRI-AAT4-1 100189393 +TRI-AAT5-1 100189153 +TRI-AAT5-2 100189336 +TRI-AAT5-3 100189310 +TRI-AAT5-4 100189275 +TRI-AAT5-5 100189387 +TRI-AAT6-1 100189372 +TRI-AAT7-1 100189401 +TRI-AAT7-2 107986683 +TRI-AAT8-1 100189095 +TRI-AAT9-1 7202 +TRI-AAT10-1 100189462 +TRI-AAT11-1 100189474 +TRI-AAT12-1 100189481 +TRI-GAT1-1 100189132 +TRI-GAT1-2 100189050 +TRI-GAT1-3 100189427 +TRI-TAT1-1 100189324 +TRI-TAT2-1 100189265 +TRI-TAT2-2 100189028 +TRI-TAT2-3 100189131 +TRI-TAT3-1 100189348 +TRIAP1 51499 +TRIAP1P1 100289619 +TRIB1 10221 +TRIB1AL 130406855 +TRIB2 28951 +TRIB3 57761 +TRIL 9865 +TRIM2 23321 +TRIM3 10612 +TRIM4 89122 +TRIM5 85363 +TRIM6 117854 +TRIM6-TRIM34 445372 +TRIM7 81786 +TRIM7-AS1 107986496 +TRIM7-AS2 105377769 +TRIM8 81603 +TRIM8-DT 121232369 +TRIM9 114088 +TRIM10 10107 +TRIM11 81559 +TRIM13 10206 +TRIM14 9830 +TRIM15 89870 +TRIM16 10626 +TRIM16L 147166 +TRIM17 51127 +TRIM21 6737 +TRIM22 10346 +TRIM23 373 +TRIM24 8805 +TRIM25 7706 +TRIM26 7726 +TRIM26BP 404024 +TRIM27 5987 +TRIM28 10155 +TRIM29 23650 +TRIM31 11074 +TRIM31-AS1 104533120 +TRIM32 22954 +TRIM33 51592 +TRIM34 53840 +TRIM35 23087 +TRIM36 55521 +TRIM36-IT1 100874338 +TRIM37 4591 +TRIM38 10475 +TRIM39 56658 +TRIM39-RPP21 202658 +TRIM40 135644 +TRIM41 90933 +TRIM42 287015 +TRIM43 129868 +TRIM43B 653192 +TRIM43CP 643445 +TRIM44 54765 +TRIM45 80263 +TRIM46 80128 +TRIM47 91107 +TRIM48 79097 +TRIM49 57093 +TRIM49B 283116 +TRIM49C 642612 +TRIM49D1 399939 +TRIM49D2 729384 +TRIM50 135892 +TRIM51 84767 +TRIM51BP 399937 +TRIM51CP 100130105 +TRIM51DP 100419945 +TRIM51EP 399940 +TRIM51FP 283257 +TRIM51G 120824 +TRIM51HP 440041 +TRIM51JP 643126 +TRIM52 84851 +TRIM52-AS1 100507602 +TRIM53AP 642569 +TRIM53BP 642425 +TRIM53CP 340970 +TRIM54 57159 +TRIM55 84675 +TRIM56 81844 +TRIM58 25893 +TRIM59 286827 +TRIM59-IFT80 100174949 +TRIM60 166655 +TRIM60P1Y 100420362 +TRIM60P2Y 100420363 +TRIM60P3Y 100420364 +TRIM60P4Y 100420367 +TRIM60P5Y 100420368 +TRIM60P6Y 100420369 +TRIM60P7Y 100420370 +TRIM60P8Y 100420373 +TRIM60P9Y 100420374 +TRIM60P10Y 100420376 +TRIM60P11Y 100420377 +TRIM60P12Y 100420378 +TRIM60P13 100132195 +TRIM60P14 653794 +TRIM60P15 100420405 +TRIM60P16 100420412 +TRIM60P17 100420414 +TRIM60P18 100420415 +TRIM60P19 100533672 +TRIM61 391712 +TRIM62 55223 +TRIM63 84676 +TRIM64 120146 +TRIM64B 642446 +TRIM64C 646754 +TRIM64DP 727828 +TRIM64EP 440061 +TRIM64FP 390233 +TRIM65 201292 +TRIM66 9866 +TRIM67 440730 +TRIM67-AS1 149373 +TRIM68 55128 +TRIM69 140691 +TRIM71 131405 +TRIM72 493829 +TRIM73 375593 +TRIM74 378108 +TRIM75 391714 +TRIM77 390231 +TRIM77BP 646770 +TRIM80P 106480328 +TRIML1 339976 +TRIML2 205860 +TRIO 7204 +TRIOBP 11078 +TRIP4 9325 +TRIP6 7205 +TRIP10 9322 +TRIP11 9321 +TRIP12 9320 +TRIP13 9319 +TRIQK 286144 +TRIR 79002 +TRIT1 54802 +TRK-CTT1-1 100189107 +TRK-CTT1-2 100189013 +TRK-CTT2-1 100189198 +TRK-CTT2-2 100189399 +TRK-CTT2-3 790966 +TRK-CTT2-4 100189110 +TRK-CTT2-5 100189282 +TRK-CTT3-1 100189119 +TRK-CTT4-1 100189062 +TRK-CTT5-1 100189209 +TRK-CTT6-1 100188995 +TRK-CTT7-1 107985760 +TRK-CTT8-1 100189244 +TRK-CTT9-1 100189180 +TRK-CTT10-1 100189367 +TRK-CTT11-1 100189311 +TRK-CTT12-1 100189464 +TRK-CTT13-1 100189439 +TRK-CTT14-1 100189467 +TRK-CTT15-1 100188999 +TRK-CTT16-1 100189536 +TRK-TTT1-1 100189125 +TRK-TTT2-1 100189294 +TRK-TTT3-1 100189122 +TRK-TTT3-2 100189425 +TRK-TTT3-3 100189234 +TRK-TTT3-4 100049613 +TRK-TTT3-5 7206 +TRK-TTT4-1 100189053 +TRK-TTT5-1 100189238 +TRK-TTT6-1 100189182 +TRK-TTT7-1 100189332 +TRK-TTT8-1 100189098 +TRK-TTT9-1 100189390 +TRK-TTT10-1 100189480 +TRK-TTT11-1 100189104 +TRK-TTT12-1 100189051 +TRK-TTT13-1 100189539 +TRK-TTT14-1 100189514 +TRK-TTT15-1 100189504 +TRK-TTT16-1 100189392 +TRK-TTT17-1 100189519 +TRL-AAG1-1 100189362 +TRL-AAG1-2 100189273 +TRL-AAG1-3 100189004 +TRL-AAG2-1 100189328 +TRL-AAG2-2 100189202 +TRL-AAG2-3 7207 +TRL-AAG2-4 100189291 +TRL-AAG3-1 100189169 +TRL-AAG4-1 100189118 +TRL-AAG5-1 100189043 +TRL-AAG6-1 100189429 +TRL-AAG7-1 100189493 +TRL-AAG8-1 100189349 +TRL-CAA1-1 107987402 +TRL-CAA1-2 100189237 +TRL-CAA2-1 100189301 +TRL-CAA3-1 100189038 +TRL-CAA4-1 100189199 +TRL-CAA5-1 100189370 +TRL-CAA6-1 100189003 +TRL-CAA7-1 100189499 +TRL-CAG1-1 100189394 +TRL-CAG1-2 100189009 +TRL-CAG1-3 100189316 +TRL-CAG1-4 100189364 +TRL-CAG1-5 100189139 +TRL-CAG1-6 100189018 +TRL-CAG1-7 100189288 +TRL-CAG2-1 100189130 +TRL-CAG2-2 100189089 +TRL-CAG3-1 100189204 +TRL-TAA1-1 100189313 +TRL-TAA2-1 100189164 +TRL-TAA3-1 100189240 +TRL-TAA4-1 100189067 +TRL-TAA5-1 100189175 +TRL-TAG1-1 7208 +TRL-TAG2-1 100189151 +TRL-TAG3-1 100189032 +TRL-TAG4-1 100189441 +TRM-CAT1-1 100189201 +TRM-CAT2-1 100189135 +TRM-CAT3-1 100189216 +TRM-CAT3-2 100189111 +TRM-CAT4-1 100189391 +TRM-CAT4-2 100189354 +TRM-CAT4-3 107986682 +TRM-CAT5-1 100189303 +TRM-CAT5-2 107986680 +TRM-CAT6-1 100189226 +TRM-CAT7-1 100189085 +TRMO 51531 +TRMT1 55621 +TRMT1L 81627 +TRMT1P1 347422 +TRMT2A 27037 +TRMT2B 79979 +TRMT2B-AS1 106481789 +TRMT5 57570 +TRMT6 51605 +TRMT9B 57604 +TRMT10A 93587 +TRMT10B 158234 +TRMT10BP1 +TRMT10C 54931 +TRMT11 60487 +TRMT12 55039 +TRMT13 54482 +TRMT44 152992 +TRMT61A 115708 +TRMT61A-DT 123706535 +TRMT61B 55006 +TRMT112 51504 +TRMT112P1 100288861 +TRMT112P2 106479033 +TRMT112P3 729667 +TRMT112P4 100288173 +TRMT112P5 106480784 +TRMT112P6 391358 +TRMT112P7 100287567 +TRMU 55687 +TRN-ATT1-1 100189320 +TRN-ATT1-2 103581030 +TRN-GTT1-1 100189126 +TRN-GTT2-1 100189005 +TRN-GTT2-2 100189402 +TRN-GTT2-3 100189083 +TRN-GTT2-4 100189036 +TRN-GTT2-5 100189176 +TRN-GTT2-6 100189195 +TRN-GTT2-7 7214 +TRN-GTT2-8 100189127 +TRN-GTT3-1 100189323 +TRN-GTT3-2 116652394 +TRN-GTT4-1 791226 +TRN-GTT5-1 107985757 +TRN-GTT6-1 791227 +TRN-GTT7-1 107985762 +TRN-GTT8-1 100189059 +TRN-GTT9-1 107985751 +TRN-GTT9-2 100189193 +TRN-GTT10-1 107985754 +TRN-GTT11-1 107985763 +TRN-GTT11-2 100189257 +TRN-GTT12-1 100189356 +TRN-GTT13-1 100189183 +TRN-GTT14-1 100188996 +TRN-GTT15-1 100189233 +TRN-GTT15-2 +TRN-GTT16-1 100189069 +TRN-GTT16-2 100189271 +TRN-GTT16-3 100189079 +TRN-GTT16-4 100189165 +TRN-GTT16-5 100189338 +TRN-GTT17-1 100189096 +TRN-GTT18-1 103456509 +TRN-GTT19-1 100189381 +TRN-GTT19-2 +TRN-GTT20-1 100189266 +TRN-GTT21-1 100873961 +TRN-GTT22-1 100189534 +TRN-GTT23-1 100189490 +TRN-GTT24-1 107985756 +TRN-GTT25-1 107985752 +TRN-GTT26-1 107987367 +TRN-GTT27-1 107985750 +TRNAU1AP 54952 +TRNP1 388610 +TRNT1 51095 +TRNT1P1 100113374 +TRNT1P2 100113375 +TRO 7216 +TROAP 10024 +TROAP-AS1 101927267 +TRP-AGG1-1 100189020 +TRP-AGG2-1 100189019 +TRP-AGG2-2 100189223 +TRP-AGG2-3 100189276 +TRP-AGG2-4 100189072 +TRP-AGG2-5 7217 +TRP-AGG2-6 7218 +TRP-AGG2-7 100189136 +TRP-AGG2-8 100189296 +TRP-AGG3-1 100189361 +TRP-AGG4-1 100189530 +TRP-AGG5-1 100189482 +TRP-AGG6-1 100189476 +TRP-CGG1-1 100189211 +TRP-CGG1-2 100189221 +TRP-CGG1-3 100189124 +TRP-CGG2-1 100189172 +TRP-GGG1-1 100189455 +TRP-TGG1-1 100189286 +TRP-TGG2-1 100189224 +TRP-TGG3-1 7219 +TRP-TGG3-2 100189088 +TRP-TGG3-3 100189335 +TRP-TGG3-4 100189388 +TRP-TGG3-5 100189281 +TRP-TGG4-1 100189483 +TRP-TGG5-1 100189515 +TRPA1 8989 +TRPC1 7220 +TRPC2 7221 +TRPC3 7222 +TRPC4 7223 +TRPC4AP 26133 +TRPC5 7224 +TRPC5OS 100329135 +TRPC6 7225 +TRPC6P1 644218 +TRPC6P2 650866 +TRPC6P3 100288724 +TRPC6P4 100422500 +TRPC6P5 123464510 +TRPC6P6 100422502 +TRPC6P7 123464511 +TRPC6P8 123464512 +TRPC6P9 123464513 +TRPC6P10 123464518 +TRPC7 57113 +TRPC7-AS1 100874024 +TRPC7-AS2 106478968 +TRPM1 4308 +TRPM2 7226 +TRPM2-AS 101928607 +TRPM3 80036 +TRPM4 54795 +TRPM5 29850 +TRPM6 140803 +TRPM7 54822 +TRPM8 79054 +TRPS1 7227 +TRPS1-AS1 125177374 +TRPT1 83707 +TRPV1 7442 +TRPV2 51393 +TRPV3 162514 +TRPV4 59341 +TRPV5 56302 +TRPV6 55503 +TRQ-CTG1-1 100189287 +TRQ-CTG1-2 100189189 +TRQ-CTG1-3 100189121 +TRQ-CTG1-4 100189317 +TRQ-CTG1-5 7228 +TRQ-CTG2-1 100189268 +TRQ-CTG3-1 107985755 +TRQ-CTG3-2 100189140 +TRQ-CTG4-1 100189056 +TRQ-CTG4-2 100189261 +TRQ-CTG5-1 100189329 +TRQ-CTG6-1 100189214 +TRQ-CTG7-1 100188998 +TRQ-CTG8-1 100189217 +TRQ-CTG8-2 100189154 +TRQ-CTG8-3 +TRQ-CTG9-1 100189531 +TRQ-CTG10-1 100189322 +TRQ-CTG11-1 100189452 +TRQ-CTG12-1 100189389 +TRQ-CTG13-1 100189538 +TRQ-CTG14-1 100189523 +TRQ-CTG15-1 100189016 +TRQ-CTG16-1 100189503 +TRQ-CTG17-1 100189302 +TRQ-CTG18-1 100189351 +TRQ-TTG1-1 7229 +TRQ-TTG2-1 100189138 +TRQ-TTG3-1 100189321 +TRQ-TTG3-2 100189185 +TRQ-TTG3-3 100189074 +TRQ-TTG4-1 100189422 +TRQ-TTG5-1 100189473 +TRQ-TTG6-1 100189026 +TRQ-TTG7-1 100189444 +TRQ-TTG8-1 100189505 +TRQ-TTG9-1 100189509 +TRQ-TTG10-1 100189010 +TRR-ACG1-1 100189396 +TRR-ACG1-2 7231 +TRR-ACG1-3 100189243 +TRR-ACG2-1 100189103 +TRR-ACG2-2 100189167 +TRR-ACG2-3 100189099 +TRR-ACG2-4 100189428 +TRR-CCG1-1 100189365 +TRR-CCG1-2 100189084 +TRR-CCG1-3 100189173 +TRR-CCG2-1 7233 +TRR-CCT1-1 100189078 +TRR-CCT2-1 100189181 +TRR-CCT3-1 100189168 +TRR-CCT4-1 100189406 +TRR-CCT5-1 100189270 +TRR-CCT6-1 +TRR-CCT6-2 100189449 +TRR-CCT7-1 100189443 +TRR-CCT8-1 100189502 +TRR-CCT9-1 100189537 +TRR-TCG1-1 100189264 +TRR-TCG2-1 100189410 +TRR-TCG3-1 100189371 +TRR-TCG4-1 7232 +TRR-TCG5-1 100189034 +TRR-TCG6-1 100189025 +TRR-TCT1-1 100189133 +TRR-TCT2-1 7230 +TRR-TCT3-1 100189109 +TRR-TCT3-2 100189115 +TRR-TCT4-1 100189166 +TRR-TCT5-1 100189012 +TRRAP 8295 +TRS-ACT1-1 100189526 +TRS-AGA1-1 100189352 +TRS-AGA2-1 100189382 +TRS-AGA2-2 100189077 +TRS-AGA2-3 23437 +TRS-AGA2-4 100189247 +TRS-AGA2-5 100189248 +TRS-AGA2-6 100189184 +TRS-AGA3-1 790951 +TRS-AGA4-1 100189070 +TRS-AGA5-1 100189432 +TRS-AGA6-1 100189420 +TRS-AGA7-1 100189487 +TRS-CGA1-1 100189037 +TRS-CGA2-1 100189041 +TRS-CGA3-1 100189205 +TRS-CGA4-1 100189152 +TRS-GCT1-1 100189157 +TRS-GCT2-1 100189002 +TRS-GCT3-1 100189285 +TRS-GCT4-1 100189225 +TRS-GCT4-2 100189229 +TRS-GCT4-3 100189331 +TRS-GCT5-1 100189159 +TRS-GCT6-1 100189218 +TRS-TGA1-1 100189279 +TRS-TGA2-1 94017 +TRS-TGA3-1 100189430 +TRS-TGA4-1 23540 +TRSUP-CTA1-1 100189426 +TRSUP-CTA2-1 100189442 +TRSUP-CTA3-1 100189470 +TRSUP-TTA1-1 100189080 +TRSUP-TTA2-1 100189330 +TRSUP-TTA3-1 100189453 +TRT-AGT1-1 100189187 +TRT-AGT1-2 100189222 +TRT-AGT1-3 100189006 +TRT-AGT2-1 100189319 +TRT-AGT2-2 100189340 +TRT-AGT3-1 100189433 +TRT-AGT4-1 100189374 +TRT-AGT5-1 100189438 +TRT-AGT6-1 100189143 +TRT-AGT7-1 7238 +TRT-CGT1-1 100189035 +TRT-CGT2-1 100189086 +TRT-CGT3-1 100189360 +TRT-CGT4-1 100189245 +TRT-CGT5-1 100189300 +TRT-CGT6-1 100189258 +TRT-TGT1-1 100189344 +TRT-TGT2-1 100189378 +TRT-TGT3-1 7237 +TRT-TGT4-1 100189419 +TRT-TGT5-1 100189263 +TRT-TGT6-1 7236 +TRU-TCA1-1 7234 +TRU-TCA2-1 7235 +TRU-TCA3-1 100188989 +TRUB1 142940 +TRUB2 26995 +TRUND-NNN1-1 103482529 +TRUND-NNN2-1 103482523 +TRUND-NNN3-1 103482527 +TRUND-NNN4-1 103482530 +TRUND-NNN5-1 103482524 +TRUND-NNN6-1 103482525 +TRUND-NNN7-1 103482531 +TRUND-NNN8-1 103482528 +TRUND-NNN9-1 103482526 +TRUND-NNN10-1 103482532 +TRV-AAC1-1 100189318 +TRV-AAC1-2 100188990 +TRV-AAC1-3 7241 +TRV-AAC1-4 7239 +TRV-AAC1-5 791230 +TRV-AAC2-1 100188992 +TRV-AAC3-1 791231 +TRV-AAC4-1 100189161 +TRV-AAC5-1 100189014 +TRV-AAC6-1 100189178 +TRV-AAC7-1 100189404 +TRV-CAC1-1 100189373 +TRV-CAC1-2 7240 +TRV-CAC1-3 791232 +TRV-CAC1-4 100189541 +TRV-CAC1-5 100049614 +TRV-CAC1-6 100189227 +TRV-CAC1-7 100189228 +TRV-CAC2-1 100189363 +TRV-CAC3-1 100189416 +TRV-CAC4-1 100189326 +TRV-CAC5-1 107985749 +TRV-CAC6-1 100189368 +TRV-CAC7-1 100189101 +TRV-CAC8-1 100189142 +TRV-CAC9-1 100189196 +TRV-CAC10-1 100873876 +TRV-CAC11-1 100189486 +TRV-CAC11-2 100189479 +TRV-CAC12-1 100189073 +TRV-CAC13-1 100189500 +TRV-CAC14-1 100189477 +TRV-TAC1-1 100188993 +TRV-TAC1-2 100189191 +TRV-TAC2-1 100189283 +TRV-TAC3-1 100189342 +TRV-TAC4-1 100189408 +TRW-CCA1-1 100189123 +TRW-CCA2-1 100189203 +TRW-CCA3-1 100189436 +TRW-CCA3-2 100189048 +TRW-CCA3-3 100189112 +TRW-CCA4-1 100189171 +TRW-CCA5-1 100189190 +TRW-CCA6-1 100189309 +TRX-CAT1-1 100189015 +TRX-CAT1-2 7210 +TRX-CAT1-3 100189094 +TRX-CAT1-4 100189040 +TRX-CAT1-5 100189345 +TRX-CAT1-6 100189297 +TRX-CAT1-7 100189315 +TRX-CAT1-8 100189255 +TRX-CAT2-1 7212 +TRX-CAT3-1 100189186 +TRY-ATA1-1 100189253 +TRY-GTA1-1 100189272 +TRY-GTA2-1 100189022 +TRY-GTA3-1 100189162 +TRY-GTA4-1 100189405 +TRY-GTA5-1 100189437 +TRY-GTA5-2 100189102 +TRY-GTA5-3 100189424 +TRY-GTA5-4 100009602 +TRY-GTA5-5 100189001 +TRY-GTA6-1 100189219 +TRY-GTA7-1 100009601 +TRY-GTA8-1 100189337 +TRY-GTA9-1 100189057 +TRY-GTA10-1 100189278 +TRY-GTA11-1 100189507 +TRY-GTA12-1 100189496 +TSACC 128229 +TSBP1 10665 +TSBP1-AS1 101929163 +TSC1 7248 +TSC2 7249 +TSC22D1 8848 +TSC22D1-AS1 641467 +TSC22D2 9819 +TSC22D3 1831 +TSC22D4 81628 +TSEN2 80746 +TSEN2P1 391718 +TSEN15 116461 +TSEN15P1 100288179 +TSEN15P2 106480781 +TSEN15P3 105375192 +TSEN34 79042 +TSEN54 283989 +TSFM 10102 +TSG101 7251 +TSGA10 80705 +TSGA10IP 254187 +TSGA13 114960 +TSHB 7252 +TSHR 7253 +TSHZ1 10194 +TSHZ2 128553 +TSHZ3 57616 +TSHZ3-AS1 107985311 +TSIX 9383 +TSKS 60385 +TSKU 25987 +TSKU-AS1 101928837 +TSLP 85480 +TSN 7247 +TSNARE1 203062 +TSNAX 7257 +TSNAX-DISC1 100303453 +TSNAXIP1 55815 +TSPAN1 10103 +TSPAN2 10100 +TSPAN3 10099 +TSPAN4 7106 +TSPAN5 10098 +TSPAN5-DT 105377342 +TSPAN6 7105 +TSPAN7 7102 +TSPAN8 7103 +TSPAN9 10867 +TSPAN9-IT1 100874356 +TSPAN10 83882 +TSPAN11 441631 +TSPAN11-AS1 124902910 +TSPAN12 23554 +TSPAN13 27075 +TSPAN14 81619 +TSPAN14-AS1 101929574 +TSPAN15 23555 +TSPAN16 26526 +TSPAN17 26262 +TSPAN18 90139 +TSPAN18-AS1 115253419 +TSPAN19 144448 +TSPAN31 6302 +TSPAN32 10077 +TSPAN33 340348 +TSPEAR 54084 +TSPEAR-AS1 54082 +TSPEAR-AS2 114043 +TSPO 706 +TSPO2 222642 +TSPOAP1 9256 +TSPOAP1-AS1 100506779 +TSPY1 7258 +TSPY2 64591 +TSPY3 728137 +TSPY4 728395 +TSPY5P 379027 +TSPY6P 653174 +TSPY7P 653288 +TSPY8 728403 +TSPY9 728132 +TSPY10 100289087 +TSPY11P 347584 +TSPY12P 377997 +TSPY13P 378001 +TSPY14P 378013 +TSPY15P 642631 +TSPY16P 727969 +TSPY17P 100132124 +TSPY18P 642796 +TSPY19P 100132504 +TSPY20P 100130848 +TSPY21P 100287055 +TSPY22P 100286996 +TSPY23P 100286964 +TSPY24P 100874287 +TSPY25P 100874288 +TSPY26P 128854 +TSPYL1 7259 +TSPYL2 64061 +TSPYL4 23270 +TSPYL5 85453 +TSPYL6 388951 +TSR1 55720 +TSR2 90121 +TSR3 115939 +TSSC2 650368 +TSSC4 10078 +TSSK1A 23752 +TSSK1B 83942 +TSSK2 23617 +TSSK3 81629 +TSSK4 283629 +TSSK5P 648630 +TSSK6 83983 +TST 7263 +TSTD1 100131187 +TSTD2 158427 +TSTD3 100130890 +TTBK1 84630 +TTBK2 146057 +TTBK2-AS1 121676926 +TTC1 7265 +TTC3 7267 +TTC3-AS1 100874006 +TTC3P1 286495 +TTC4 7268 +TTC4P1 222052 +TTC5 91875 +TTC6 319089 +TTC7A 57217 +TTC7B 145567 +TTC7B-AS1 101928909 +TTC8 123016 +TTC9 23508 +TTC9-DT 101928075 +TTC9B 148014 +TTC9C 283237 +TTC12 54970 +TTC12-DT 124902814 +TTC13 79573 +TTC14 151613 +TTC14-DT 101928856 +TTC16 158248 +TTC17 55761 +TTC19 54902 +TTC21A 199223 +TTC21B 79809 +TTC21B-AS1 100506134 +TTC22 55001 +TTC23 64927 +TTC23-AS1 128193289 +TTC23L 153657 +TTC23L-AS1 101929704 +TTC24 164118 +TTC27 55622 +TTC28 23331 +TTC28-AS1 284900 +TTC29 83894 +TTC31 64427 +TTC32 130502 +TTC32-DT 118597834 +TTC33 23548 +TTC34 100287898 +TTC36 143941 +TTC36-AS1 101929089 +TTC38 55020 +TTC39A 22996 +TTC39A-AS1 102724097 +TTC39B 158219 +TTC39C 125488 +TTC39C-AS1 102724246 +TTC39CP1 100288825 +TTC39DP 646640 +TTC41P 253724 +TTF1 7270 +TTF2 8458 +TTI1 9675 +TTI2 80185 +TTK 7272 +TTL 150465 +TTLL1 25809 +TTLL1-AS1 100506679 +TTLL2 83887 +TTLL3 26140 +TTLL4 9654 +TTLL5 23093 +TTLL6 284076 +TTLL7 79739 +TTLL7-IT1 100874314 +TTLL8 164714 +TTLL9 164395 +TTLL10 254173 +TTLL10-AS1 100506376 +TTLL11 158135 +TTLL12 23170 +TTLL13 440307 +TTN 7273 +TTN-AS1 100506866 +TTPA 7274 +TTPAL 79183 +TTR 7276 +TTTY1 50858 +TTTY1B 100101116 +TTTY2 60439 +TTTY2B 100101117 +TTTY3 114760 +TTTY3B 474148 +TTTY4 114761 +TTTY4B 474149 +TTTY4C 474150 +TTTY5 83863 +TTTY6 84672 +TTTY6B 441543 +TTTY7 246122 +TTTY7B 100101120 +TTTY8 84673 +TTTY8B 100101118 +TTTY9A 83864 +TTTY9B 425057 +TTTY10 246119 +TTTY11 83866 +TTTY12 83867 +TTTY13 83868 +TTTY13B 100287735 +TTTY13C 100287979 +TTTY14 83869 +TTTY15 64595 +TTTY16 252948 +TTTY17A 252949 +TTTY17B 474151 +TTTY17C 474152 +TTTY18 252950 +TTTY19 252952 +TTTY20 252951 +TTTY21 252953 +TTTY21B 100101115 +TTTY22 252954 +TTTY23 252955 +TTTY23B 100101121 +TTTY24P 100287941 +TTTY25P 100287026 +TTTY26P 100287818 +TTTY27P 100287874 +TTTY28P 100287606 +TTTY29P 100287167 +TTTY30P 100287844 +TTTY31P 100287905 +TTYH1 57348 +TTYH2 94015 +TTYH3 80727 +TUB 7275 +TUB-AS1 101927917 +TUBA1A 7846 +TUBA1B 10376 +TUBA1B-AS1 105369760 +TUBA1C 84790 +TUBA3C 7278 +TUBA3D 113457 +TUBA3E 112714 +TUBA3FP 113691 +TUBA3GP 645348 +TUBA4A 7277 +TUBA4B 80086 +TUBA5P 730222 +TUBA8 51807 +TUBAL3 79861 +TUBAP1 54016 +TUBAP2 399942 +TUBAP3 100419007 +TUBAP4 106479041 +TUBAP6 100129818 +TUBAP7 644436 +TUBAP8 100533627 +TUBAP9 100533626 +TUBAP10 645773 +TUBAP11 100132824 +TUBAP12 100289303 +TUBAP13 642635 +TUBAP14 100419036 +TUBAP15 117751739 +TUBB 203068 +TUBB1 81027 +TUBB1P1 349448 +TUBB1P2 140004 +TUBB2A 7280 +TUBB2B 347733 +TUBB2BP1 100132153 +TUBB3 10381 +TUBB3P1 100288513 +TUBB3P2 100130187 +TUBB4A 10382 +TUBB4AP1 402422 +TUBB4B 10383 +TUBB4BP1 106478981 +TUBB4BP2 100418974 +TUBB4BP3 106480746 +TUBB4BP4 106480434 +TUBB4BP5 106480747 +TUBB4BP6 100996306 +TUBB4BP7 442271 +TUBB4BP8 643371 +TUBB6 84617 +TUBB6P1 100418964 +TUBB7P 56604 +TUBB8 347688 +TUBB8B 260334 +TUBB8P1 100418937 +TUBB8P2 106478982 +TUBB8P3 132719 +TUBB8P4 260338 +TUBB8P5 121014 +TUBB8P6 200149 +TUBB8P7 197331 +TUBB8P8 102723626 +TUBB8P9 255208 +TUBB8P10 391171 +TUBB8P11 388579 +TUBBP1 92755 +TUBBP2 647000 +TUBBP3 326106 +TUBBP4 493816 +TUBBP5 643224 +TUBBP6 442308 +TUBBP7 100533620 +TUBBP8 101927519 +TUBBP9 442210 +TUBBP10 100418902 +TUBBP11 106480745 +TUBD1 51174 +TUBE1 51175 +TUBG1 7283 +TUBG1P 442673 +TUBG2 27175 +TUBGCP2 10844 +TUBGCP3 10426 +TUBGCP4 27229 +TUBGCP5 114791 +TUBGCP6 85378 +TUFM 7284 +TUFMP1 645668 +TUFT1 7286 +TUG1 55000 +TULP1 7287 +TULP2 7288 +TULP3 7289 +TULP3P1 100128017 +TULP4 56995 +TUNAR 100507043 +TUSC1 286319 +TUSC2 11334 +TUSC2P1 359794 +TUSC2P2 112552163 +TUSC3 7991 +TUSC7 285194 +TUSC8 400128 +TUT1 64852 +TUT4 23318 +TUT7 79670 +TVP23A 780776 +TVP23B 51030 +TVP23BP1 100129124 +TVP23BP2 100421473 +TVP23C 201158 +TVP23C-CDRT4 100533496 +TVP23CP1 100421599 +TVP23CP2 261735 +TVP23CP3 127525792 +TWF1 5756 +TWF1P1 619519 +TWF1P2 494555 +TWF2 11344 +TWF2-DT 101929054 +TWIST1 7291 +TWIST2 117581 +TWNK 56652 +TWSG1 57045 +TWSG1-DT 102724397 +TXK 7294 +TXLNA 200081 +TXLNB 167838 +TXLNG 55787 +TXLNGY 246126 +TXN 7295 +TXN2 25828 +TXN2P1 100505690 +TXNDC2 84203 +TXNDC5 81567 +TXNDC8 255220 +TXNDC9 10190 +TXNDC11 51061 +TXNDC11-AS1 127379753 +TXNDC12 51060 +TXNDC12-AS1 104355143 +TXNDC15 79770 +TXNDC16 57544 +TXNDC17 84817 +TXNIP 10628 +TXNL1 9352 +TXNL1P1 100419095 +TXNL4A 10907 +TXNL4AP1 100131482 +TXNL4B 54957 +TXNP1 93202 +TXNP2 171416 +TXNP3 171419 +TXNP4 124974 +TXNP5 151276 +TXNP6 171560 +TXNP7 106480275 +TXNRD1 7296 +TXNRD2 10587 +TXNRD3 114112 +TYK2 7297 +TYMP 1890 +TYMS 7298 +TYMSOS 494514 +TYMSP1 100419610 +TYMSP2 109729122 +TYR 7299 +TYRL 7300 +TYRO3 7301 +TYRO3P 7302 +TYROBP 7305 +TYRP1 7306 +TYSND1 219743 +TYW1 55253 +TYW1B 441250 +TYW1P1 100533847 +TYW3 127253 +TYW5 129450 +U2AF1 7307 +U2AF1L4 199746 +U2AF2 11338 +U2SURP 23350 +U2SURPP1 124906201 +UACA 55075 +UAP1 6675 +UAP1-DT 102724358 +UAP1L1 91373 +UBA1 7317 +UBA2 10054 +UBA3 9039 +UBA5 79876 +UBA5P1 100126822 +UBA6 55236 +UBA6-DT 550112 +UBA7 7318 +UBA52 7311 +UBA52P1 7312 +UBA52P2 7313 +UBA52P3 122837 +UBA52P4 100271030 +UBA52P5 100271031 +UBA52P6 100130239 +UBA52P7 100128617 +UBA52P8 100271343 +UBA52P9 100271344 +UBAC1 10422 +UBAC2 337867 +UBAC2-AS1 100289373 +UBALD1 124402 +UBALD2 283991 +UBAP1 51271 +UBAP1L 390595 +UBAP2 55833 +UBAP2L 9898 +UBASH3A 53347 +UBASH3B 84959 +UBB 7314 +UBBP1 7315 +UBBP2 23668 +UBBP3 23667 +UBBP4 23666 +UBBP5 100873783 +UBC 7316 +UBD 10537 +UBDP1 100286971 +UBE2A 7319 +UBE2B 7320 +UBE2C 11065 +UBE2CP1 326105 +UBE2CP2 646595 +UBE2CP3 100129983 +UBE2CP4 283711 +UBE2CP5 100874260 +UBE2D1 7321 +UBE2D2 7322 +UBE2D3 7323 +UBE2D3-AS1 105377348 +UBE2D3P1 100037280 +UBE2D3P2 100130139 +UBE2D3P3 100874262 +UBE2D3P4 100131800 +UBE2D4 51619 +UBE2DNL 100131816 +UBE2E1 7324 +UBE2E1-AS1 100874092 +UBE2E2 7325 +UBE2E2-DT 100505877 +UBE2E3 10477 +UBE2E3-DT 105373772 +UBE2E4P 286480 +UBE2F 140739 +UBE2F-SCLY 100533179 +UBE2FP1 100421436 +UBE2FP2 101060189 +UBE2FP3 106480360 +UBE2G1 7326 +UBE2G2 7327 +UBE2H 7328 +UBE2H-DT 121832803 +UBE2HP1 646463 +UBE2I 7329 +UBE2J1 51465 +UBE2J2 118424 +UBE2K 3093 +UBE2L1 283556 +UBE2L2 100506424 +UBE2L3 7332 +UBE2L4 7333 +UBE2L5 171222 +UBE2L6 9246 +UBE2M 9040 +UBE2MP1 606551 +UBE2N 7334 +UBE2NL 389898 +UBE2NP1 100288613 +UBE2O 63893 +UBE2Q1 55585 +UBE2Q1-AS1 100874097 +UBE2Q2 92912 +UBE2Q2P1 388165 +UBE2Q2P2 100134869 +UBE2Q2P4Y 100421716 +UBE2Q2P5Y 100421717 +UBE2Q2P6 100421769 +UBE2Q2P7 100421766 +UBE2Q2P8 100421771 +UBE2Q2P9 106480276 +UBE2Q2P10 101928256 +UBE2Q2P11 100421767 +UBE2Q2P12 100421768 +UBE2Q2P13 100128108 +UBE2Q2P16 100505679 +UBE2QL1 134111 +UBE2R2 54926 +UBE2R2-AS1 101929688 +UBE2S 27338 +UBE2SP1 246719 +UBE2SP2 440406 +UBE2T 29089 +UBE2U 148581 +UBE2V1 7335 +UBE2V1P1 170556 +UBE2V1P2 730052 +UBE2V1P3 359798 +UBE2V1P4 102724816 +UBE2V1P5 100287173 +UBE2V1P6 100287279 +UBE2V1P7 106481746 +UBE2V1P8 102724706 +UBE2V1P9 100131981 +UBE2V1P10 102724605 +UBE2V1P11 102723977 +UBE2V1P12 106479048 +UBE2V1P13 100505982 +UBE2V1P14 100289623 +UBE2V1P15 100288170 +UBE2V1P16 102723952 +UBE2V2 7336 +UBE2V2-AS1 105375819 +UBE2V2P1 100128493 +UBE2V2P2 104548970 +UBE2V2P3 100421341 +UBE2V2P4 106480802 +UBE2W 55284 +UBE2WP1 619457 +UBE2Z 65264 +UBE3A 7337 +UBE3AP1 7338 +UBE3AP2 7339 +UBE3B 89910 +UBE3C 9690 +UBE3D 90025 +UBE4A 9354 +UBE4B 10277 +UBFD1 56061 +UBFD1P1 100130484 +UBIAD1 29914 +UBL3 5412 +UBL4A 8266 +UBL4B 164153 +UBL5 59286 +UBL5P1 100130803 +UBL5P2 100287215 +UBL5P3 100129031 +UBL5P4 106480800 +UBL7 84993 +UBL7-DT 440288 +UBLCP1 134510 +UBN1 29855 +UBN2 254048 +UBOX5 22888 +UBOX5-AS1 100134015 +UBP1 7342 +UBQLN1 29979 +UBQLN1-AS1 105376114 +UBQLN1P1 387117 +UBQLN2 29978 +UBQLN3 50613 +UBQLN4 56893 +UBQLN4P1 285329 +UBQLN4P2 100131393 +UBQLNL 143630 +UBR1 197131 +UBR2 23304 +UBR3 130507 +UBR4 23352 +UBR5 51366 +UBR5-DT 101927221 +UBR7 55148 +UBTD1 80019 +UBTD2 92181 +UBTD2P1 100128739 +UBTF 7343 +UBTFL1 642623 +UBTFL2 120126 +UBTFL3 129870 +UBTFL5 728231 +UBTFL6 643615 +UBTFL7 646759 +UBTFL8 643182 +UBTFL9 100128427 +UBTFL10 106480293 +UBTFL11 442446 +UBXN1 51035 +UBXN2A 165324 +UBXN2B 137886 +UBXN4 23190 +UBXN6 80700 +UBXN7 26043 +UBXN7-AS1 100874034 +UBXN8 7993 +UBXN10 127733 +UBXN11 91544 +UCA1 652995 +UCHL1 7345 +UCHL1-DT 101410542 +UCHL3 7347 +UCHL5 51377 +UCK1 83549 +UCK2 7371 +UCKL1 54963 +UCKL1-AS1 100113386 +UCMA 221044 +UCN 7349 +UCN2 90226 +UCN3 114131 +UCP1 7350 +UCP2 7351 +UCP3 7352 +UEVLD 55293 +UFC1 51506 +UFC1P1 100124402 +UFD1 7353 +UFD1-AS1 105372860 +UFL1 23376 +UFL1-AS1 100861530 +UFM1 51569 +UFM1P1 102443352 +UFM1P2 729835 +UFM1P3 100506633 +UFSP1 402682 +UFSP2 55325 +UGCG 7357 +UGDH 7358 +UGDH-AS1 100885776 +UGGT1 56886 +UGGT2 55757 +UGP2 7360 +UGT1A 7361 +UGT1A1 54658 +UGT1A2P 54580 +UGT1A3 54659 +UGT1A4 54657 +UGT1A5 54579 +UGT1A6 54578 +UGT1A7 54577 +UGT1A8 54576 +UGT1A9 54600 +UGT1A10 54575 +UGT1A11P 54574 +UGT1A12P 54573 +UGT1A13P 404204 +UGT2A1 10941 +UGT2A2 574537 +UGT2A3 79799 +UGT2A3P7 100422023 +UGT2B4 7363 +UGT2B7 7364 +UGT2B10 7365 +UGT2B11 10720 +UGT2B15 7366 +UGT2B17 7367 +UGT2B24P 54572 +UGT2B25P 54571 +UGT2B26P 54570 +UGT2B27P 54569 +UGT2B28 54490 +UGT2B29P 54568 +UGT3A1 133688 +UGT3A2 167127 +UGT8 7368 +UHMK1 127933 +UHRF1 29128 +UHRF2 115426 +UHRF2P1 260337 +UICLM 200772 +UIMC1 51720 +ULBP1 80329 +ULBP2 80328 +ULBP3 79465 +ULK1 8408 +ULK2 9706 +ULK3 25989 +ULK4 54986 +ULK4P1 89838 +ULK4P2 100288380 +ULK4P3 89837 +UMAD1 729852 +UMLILO 114515515 +UMOD 7369 +UMODL1 89766 +UMODL1-AS1 150147 +UMPS 7372 +UNC5A 90249 +UNC5B 219699 +UNC5B-AS1 728978 +UNC5C 8633 +UNC5C-AS1 105377335 +UNC5CL 222643 +UNC5D 137970 +UNC13A 23025 +UNC13B 10497 +UNC13C 440279 +UNC13D 201294 +UNC45A 55898 +UNC45B 146862 +UNC50 25972 +UNC79 57578 +UNC80 285175 +UNC93A 54346 +UNC93B1 81622 +UNC93B2 641922 +UNC93B3 285296 +UNC93B4 643384 +UNC93B5 729196 +UNC93B6 255620 +UNC93B7 100887746 +UNC93B8 100887748 +UNC119 9094 +UNC119B 84747 +UNCX 340260 +UNG 7374 +UNGP1 57004 +UNGP2 57005 +UNGP3 319122 +UNK 85451 +UNKL 64718 +UOX 391051 +UPB1 51733 +UPF1 5976 +UPF2 26019 +UPF3A 65110 +UPF3AP1 147226 +UPF3AP2 147150 +UPF3AP3 100422343 +UPF3B 65109 +UPK1A 11045 +UPK1A-AS1 100862728 +UPK1B 7348 +UPK2 7379 +UPK3A 7380 +UPK3B 105375355 +UPK3BL1 100134938 +UPK3BL2 107983993 +UPK3BL3P 122149306 +UPK3BP1 107080637 +UPP1 7378 +UPP2 151531 +UPRT 139596 +UQCC1 55245 +UQCC2 84300 +UQCC3 790955 +UQCC4 283951 +UQCC5 440957 +UQCC6 728568 +UQCR10 29796 +UQCR10P1 644310 +UQCR11 10975 +UQCRB 7381 +UQCRB-AS1 101927039 +UQCRBP1 442454 +UQCRBP2 100130719 +UQCRBP3 100288785 +UQCRC1 7384 +UQCRC2 7385 +UQCRC2P1 100131327 +UQCRFS1 7386 +UQCRFS1-DT 105372352 +UQCRFS1P1 100128525 +UQCRFS1P2 647123 +UQCRFS1P3 100130994 +UQCRH 7388 +UQCRHL 440567 +UQCRHP1 100130756 +UQCRHP2 729769 +UQCRHP3 100131995 +UQCRHP4 100128448 +UQCRQ 27089 +URAD 646625 +URAHP 100130015 +URB1 9875 +URB1-AS1 84996 +URB2 9816 +URGCP 55665 +URGCP-MRPS24 100534592 +URI1 8725 +URM1 81605 +UROC1 131669 +UROD 7389 +UROS 7390 +USB1 79650 +USE1 55850 +USF1 7391 +USF1P1 100151645 +USF2 7392 +USF3 205717 +USH1C 10083 +USH1G 124590 +USH2A 7399 +USH2A-AS1 105372918 +USH2A-AS2 102723833 +USHBP1 83878 +USO1 8615 +USP1 7398 +USP2 9099 +USP2-AS1 100499227 +USP3 9960 +USP3-AS1 100130855 +USP4 7375 +USP5 8078 +USP6 9098 +USP6NL 9712 +USP6NL-AS1 107984208 +USP7 7874 +USP7-AS1 105371074 +USP8 9101 +USP8P1 100287272 +USP8P2 100420351 +USP9X 8239 +USP9Y 8287 +USP9YP1 387362 +USP9YP2 387363 +USP9YP3 387364 +USP9YP4 387359 +USP9YP5 100421217 +USP9YP6 100462820 +USP9YP7 100462821 +USP9YP8 100421219 +USP9YP9 100421220 +USP9YP10 100421222 +USP9YP11 100421224 +USP9YP12 100874382 +USP9YP13 100861434 +USP9YP14 107133502 +USP9YP15 106480713 +USP9YP16 106478927 +USP9YP17 106480714 +USP9YP18 106480424 +USP9YP19 100500797 +USP9YP20 106480717 +USP9YP21 106480355 +USP9YP22 100874383 +USP9YP23 100500798 +USP9YP24 106478928 +USP9YP25 106480715 +USP9YP26 106478929 +USP9YP27 106480716 +USP9YP28 107080622 +USP9YP29 106480425 +USP9YP30 100874384 +USP9YP31 106478930 +USP9YP32 106480718 +USP9YP33 106478931 +USP9YP34 387361 +USP9YP35 106480719 +USP9YP36 106478932 +USP10 9100 +USP10P1 780779 +USP10P2 780778 +USP11 8237 +USP12 219333 +USP12-AS1 100874070 +USP12-DT 100874071 +USP12P1 9959 +USP12P2 100130682 +USP12P3 100420439 +USP12PX 254700 +USP12PY 359799 +USP13 8975 +USP14 9097 +USP15 9958 +USP16 10600 +USP17L1 401447 +USP17L2 377630 +USP17L3 645836 +USP17L4 645402 +USP17L5 728386 +USP17L6P 391622 +USP17L7 392197 +USP17L8 392188 +USP17L9P 391627 +USP17L10 100287144 +USP17L11 100287178 +USP17L12 100287205 +USP17L13 100287238 +USP17L14P 100287270 +USP17L15 100288520 +USP17L16P 100287302 +USP17L17 100287327 +USP17L18 100287364 +USP17L19 100287404 +USP17L20 100287441 +USP17L21 100287478 +USP17L22 100287513 +USP17L23 101241878 +USP17L24 728369 +USP17L25 728373 +USP17L26 728379 +USP17L27 728393 +USP17L28 728400 +USP17L29 728405 +USP17L30 728419 +USP18 11274 +USP19 10869 +USP20 10868 +USP21 27005 +USP21P1 100420435 +USP21P2 100420428 +USP22 23326 +USP24 23358 +USP24P1 100874248 +USP25 29761 +USP26 83844 +USP27X 389856 +USP27X-DT 158572 +USP28 57646 +USP29 57663 +USP30 84749 +USP30-AS1 100131733 +USP31 57478 +USP32 84669 +USP32P1 162632 +USP32P2 220594 +USP32P3 347716 +USP32P4 100874252 +USP33 23032 +USP34 9736 +USP34-DT 105377633 +USP35 57558 +USP36 57602 +USP37 57695 +USP37P1 117981792 +USP38 84640 +USP38-DT 105377623 +USP39 10713 +USP40 55230 +USP41P 373856 +USP42 84132 +USP43 124739 +USP44 84101 +USP45 85015 +USP46 64854 +USP46-DT 643783 +USP47 55031 +USP48 84196 +USP49 25862 +USP50 373509 +USP51 158880 +USP53 54532 +USP54 159195 +USPL1 10208 +UST 10090 +UST-AS1 100128176 +UST-AS2 105378047 +UTF1 8433 +UTP3 57050 +UTP4 84916 +UTP6 55813 +UTP11 51118 +UTP14A 10813 +UTP14C 9724 +UTP15 84135 +UTP18 51096 +UTP20 27340 +UTP23 84294 +UTP25 27042 +UTRN 7402 +UTS2 10911 +UTS2B 257313 +UTS2R 2837 +UTY 7404 +UVRAG 7405 +UVRAG-DT 100506113 +UVSSA 57654 +UXS1 80146 +UXT 8409 +UXT-AS1 100133957 +VAC14 55697 +VAC14-AS1 100130894 +VAMP1 6843 +VAMP1-AS1 127379716 +VAMP2 6844 +VAMP3 9341 +VAMP4 8674 +VAMP5 10791 +VAMP7 6845 +VAMP8 8673 +VAMP9P 105377307 +VANGL1 81839 +VANGL2 57216 +VAPA 9218 +VAPB 9217 +VARS1 7407 +VARS2 57176 +VASH1 22846 +VASH1-AS1 100506603 +VASH1-DT 120766139 +VASH2 79805 +VASN 114990 +VASP 7408 +VAT1 10493 +VAT1L 57687 +VAV1 7409 +VAV2 7410 +VAV3 10451 +VAV3-AS1 100873946 +VAX1 11023 +VAX2 25806 +VBP1 7411 +VCAM1 7412 +VCAN 1462 +VCAN-AS1 105379054 +VCL 7414 +VCP 7415 +VCPIP1 80124 +VCPKMT 79609 +VCX 26609 +VCX2 51480 +VCX3A 51481 +VCX3B 425054 +VCY 9084 +VCY1B 353513 +VDAC1 7416 +VDAC1P1 642585 +VDAC1P2 10064 +VDAC1P3 100310838 +VDAC1P4 7418 +VDAC1P5 10187 +VDAC1P6 359800 +VDAC1P7 100310839 +VDAC1P8 100310840 +VDAC1P9 391106 +VDAC1P10 643536 +VDAC1P11 100310841 +VDAC1P12 100874289 +VDAC1P13 100420568 +VDAC2 7417 +VDAC2P1 54015 +VDAC2P2 643996 +VDAC2P3 401959 +VDAC2P4 100420574 +VDAC2P5 729317 +VDAC3 7419 +VDAC3P1 341965 +VDR 7421 +VEGFA 7422 +VEGFB 7423 +VEGFC 7424 +VEGFD 2277 +VENTX 27287 +VENTXP1 139538 +VENTXP2 100287345 +VENTXP3 349814 +VENTXP4 152101 +VENTXP5 442384 +VENTXP6 552879 +VENTXP7 391518 +VENTXP8 100421110 +VEPH1 79674 +VEZF1 7716 +VEZF1P1 647319 +VEZT 55591 +VEZTP1 100113397 +VGF 7425 +VGLL1 51442 +VGLL2 245806 +VGLL3 389136 +VGLL4 9686 +VHL 7428 +VHLL 391104 +VIL1 7429 +VILL 50853 +VIM 7431 +VIM-AS1 100507347 +VIM2P 100130535 +VINAC1P 114515517 +VIP 7432 +VIPAS39 63894 +VIPR1 7433 +VIPR1-AS1 100874007 +VIPR2 7434 +VIRMA 25962 +VIRMA-DT 101926977 +VIS1 7435 +VIT 5212 +VKORC1 79001 +VKORC1L1 154807 +VKORC1P1 414355 +VKORC1P2 414357 +VLDLR 7436 +VLDLR-AS1 401491 +VMA21 203547 +VMAC 400673 +VMO1 284013 +VMP1 81671 +VN1R1 57191 +VN1R2 317701 +VN1R3 317702 +VN1R4 317703 +VN1R5 317705 +VN1R6P 653753 +VN1R7P 100132759 +VN1R8P 54041 +VN1R9P 317691 +VN1R10P 387316 +VN1R11P 387317 +VN1R12P 387321 +VN1R13P 387322 +VN1R14P 387320 +VN1R15P 100312804 +VN1R16P 100312805 +VN1R17P 441931 +VN1R18P 100133087 +VN1R19P 100312843 +VN1R20P 100312775 +VN1R21P 100128368 +VN1R22P 100312844 +VN1R23P 100312845 +VN1R24P 100312781 +VN1R25P 100312782 +VN1R26P 100312783 +VN1R27P 100312784 +VN1R28P 100312785 +VN1R29P 100312786 +VN1R30P 100287919 +VN1R31P 100312787 +VN1R32P 100312788 +VN1R33P 100288022 +VN1R34P 100129587 +VN1R35P 100312789 +VN1R36P 100312790 +VN1R37P 402273 +VN1R38P 100131065 +VN1R39P 100312791 +VN1R40P 100312792 +VN1R41P 100312793 +VN1R42P 100312794 +VN1R43P 100312795 +VN1R44P 100312855 +VN1R45P 100312796 +VN1R46P 100131789 +VN1R47P 100312797 +VN1R48P 100312798 +VN1R49P 100312799 +VN1R51P 100312801 +VN1R52P 100312802 +VN1R53P 100312806 +VN1R54P 100312807 +VN1R55P 100312808 +VN1R56P 100312774 +VN1R57P 100312809 +VN1R58P 100312810 +VN1R59P 100312811 +VN1R60P 100312812 +VN1R61P 100312813 +VN1R62P 100312814 +VN1R63P 100312815 +VN1R64P 730196 +VN1R65P 100128384 +VN1R66P 100129315 +VN1R67P 100131118 +VN1R68P 100131688 +VN1R69P 100312816 +VN1R70P 100130059 +VN1R71P 100312817 +VN1R72P 100312853 +VN1R73P 100312818 +VN1R74P 100312819 +VN1R75P 100312820 +VN1R76P 100312821 +VN1R77P 100312822 +VN1R78P 100312823 +VN1R79P 100312824 +VN1R80P 100312825 +VN1R81P 100312826 +VN1R82P 100312827 +VN1R83P 100312828 +VN1R84P 100312829 +VN1R85P 100312830 +VN1R86P 100312831 +VN1R87P 100312832 +VN1R88P 100312833 +VN1R89P 100312834 +VN1R90P 100312835 +VN1R91P 100312836 +VN1R92P 100312837 +VN1R93P 100312838 +VN1R94P 100312839 +VN1R95P 100131141 +VN1R96P 100127969 +VN1R97P 100312840 +VN1R98P 100312841 +VN1R99P 100312842 +VN1R100P 100312846 +VN1R101P 729885 +VN1R102P 100312847 +VN1R103P 730066 +VN1R104P 100288195 +VN1R105P 100288264 +VN1R106P 100312848 +VN1R107P 100312849 +VN1R108P 100312850 +VN1R109P 100312851 +VN1R110P 100312803 +VN1R111P 100312852 +VN1R112P 100312854 +VN2R1P 344760 +VN2R2P 100033391 +VN2R3P 100033392 +VN2R6P 100033395 +VN2R7P 100033396 +VN2R9P 648315 +VN2R10P 100033398 +VN2R11P 100033399 +VN2R12P 100033400 +VN2R13P 100033401 +VN2R14P 100033402 +VN2R15P 100033403 +VN2R16P 100033404 +VN2R17P 649186 +VN2R18P 100033406 +VN2R19P 100033407 +VN2R20P 100033408 +VN2R21P 100127050 +VNN1 8876 +VNN2 8875 +VNN3P 55350 +VOPP1 81552 +VOPP1-DT 105375287 +VPREB1 7441 +VPREB3 29802 +VPS4A 27183 +VPS4B 9525 +VPS8 23355 +VPS9D1 9605 +VPS9D1-AS1 100128881 +VPS11 55823 +VPS11-DT 118597841 +VPS13A 23230 +VPS13A-AS1 100286938 +VPS13B 157680 +VPS13B-DT 105375666 +VPS13C 54832 +VPS13C-DT 101928907 +VPS13D 55187 +VPS16 64601 +VPS18 57617 +VPS25 84313 +VPS25P1 441899 +VPS26A 9559 +VPS26AP1 100421731 +VPS26B 112936 +VPS26BP1 100421729 +VPS26C 10311 +VPS26CP1 100420893 +VPS28 51160 +VPS29 51699 +VPS33A 65082 +VPS33B 26276 +VPS33B-DT 101926911 +VPS35 55737 +VPS35L 57020 +VPS35P1 100422055 +VPS36 51028 +VPS37A 137492 +VPS37B 79720 +VPS37C 55048 +VPS37D 155382 +VPS39 23339 +VPS39-DT 105370795 +VPS41 27072 +VPS45 11311 +VPS50 55610 +VPS51 738 +VPS51P1 127379701 +VPS51P2 127379702 +VPS51P3 127379703 +VPS51P4 127379744 +VPS51P5 127379704 +VPS51P6 127379727 +VPS51P7 127379731 +VPS51P8 441320 +VPS51P9 127379705 +VPS51P10 127379706 +VPS51P11 127379745 +VPS51P12 127379707 +VPS51P13 127379746 +VPS51P14 127379708 +VPS51P15 127379709 +VPS51P16 127379747 +VPS51P17 127379710 +VPS51P18 127379732 +VPS51P19 127379711 +VPS52 6293 +VPS53 55275 +VPS54 51542 +VPS72 6944 +VRK1 7443 +VRK2 7444 +VRK3 51231 +VRTN 55237 +VSIG1 340547 +VSIG2 23584 +VSIG4 11326 +VSIG8 391123 +VSIG10 54621 +VSIG10L 147645 +VSIG10L-AS1 118827807 +VSIG10L2 338667 +VSIR 64115 +VSNL1 7447 +VSTM1 284415 +VSTM2A 222008 +VSTM2A-OT1 285878 +VSTM2B 342865 +VSTM2B-DT 284395 +VSTM2L 128434 +VSTM4 196740 +VSTM5 387804 +VSX1 30813 +VSX2 338917 +VTA1 51534 +VTA1P1 106481708 +VTA1P2 100128412 +VTCN1 79679 +VTI1A 143187 +VTI1B 10490 +VTI1BP1 391559 +VTI1BP2 389246 +VTI1BP3 100127976 +VTI1BP4 100422540 +VTN 7448 +VTRNA1-1 56664 +VTRNA1-2 56663 +VTRNA1-3 56662 +VTRNA2-1 100126299 +VTRNA2-2P 106479538 +VTRNA3-1P 100144435 +VWA1 64856 +VWA2 340706 +VWA3A 146177 +VWA3B 200403 +VWA5A 4013 +VWA5B1 127731 +VWA5B2 90113 +VWA7 80737 +VWA8 23078 +VWA8-AS1 100507240 +VWA8P1 106480787 +VWC2 375567 +VWC2L 402117 +VWC2L-IT1 100885780 +VWCE 220001 +VWDE 221806 +VWF 7450 +VWFP1 7451 +VXN 254778 +WAC 51322 +WAC-AS1 220906 +WAKMAR1 105372576 +WAKMAR2 100130476 +WAPL 23063 +WAPL-DT 122152326 +WARS1 7453 +WARS1P1 341112 +WARS2 10352 +WARS2-AS1 101929147 +WARS2-IT1 104472716 +WARS2P1 100421633 +WAS 7454 +WASF1 8936 +WASF1P1 100131624 +WASF2 10163 +WASF3 10810 +WASF3-AS1 100874061 +WASF4P 644739 +WASF5P 387122 +WASH2P 375260 +WASH3P 374666 +WASH4P 374677 +WASH5P 375690 +WASH6P 653440 +WASH7P 653635 +WASH8P 100288778 +WASH9P 102723897 +WASHC1 100287171 +WASHC2A 387680 +WASHC2C 253725 +WASHC3 51019 +WASHC3P1 100131069 +WASHC4 23325 +WASHC5 9897 +WASHC5-AS1 106479020 +WASIR1 100128260 +WASIR2 100132169 +WASL 8976 +WASL-DT 116435299 +WBP1 23559 +WBP1L 54838 +WBP1LP1 106479029 +WBP1LP2 100506330 +WBP1LP3 106479031 +WBP1LP4 106480779 +WBP1LP5 106480780 +WBP1LP6 106481797 +WBP1LP7 106479030 +WBP1LP8 106480325 +WBP1LP9 107403079 +WBP1LP10 106480326 +WBP1LP11 106481969 +WBP1LP12 106480327 +WBP1P1 100420109 +WBP1P2 729859 +WBP2 23558 +WBP2NL 164684 +WBP2P1 147468 +WBP4 11193 +WBP11 51729 +WBP11P1 441818 +WBP11P2 100130102 +WBP11P3 727874 +WBSCR2 7459 +WDCP 80304 +WDFY1 57590 +WDFY2 115825 +WDFY3 23001 +WDFY3-AS1 100874023 +WDFY3-AS2 404201 +WDFY4 57705 +WDHD1 11169 +WDPCP 51057 +WDR1 9948 +WDR3 10885 +WDR4 10785 +WDR4P1 100130607 +WDR4P2 391383 +WDR5 11091 +WDR5-DT 118568806 +WDR5B 54554 +WDR5B-DT 102723582 +WDR6 11180 +WDR7 23335 +WDR7-OT1 107985140 +WDR11 55717 +WDR11-DT 283089 +WDR12 55759 +WDR13 64743 +WDR17 116966 +WDR18 57418 +WDR19 57728 +WDR20 91833 +WDR24 84219 +WDR25 79446 +WDR26 80232 +WDR27 253769 +WDR31 114987 +WDR33 55339 +WDR35 57539 +WDR35-DT 101928222 +WDR36 134430 +WDR37 22884 +WDR38 401551 +WDR41 55255 +WDR43 23160 +WDR44 54521 +WDR45 11152 +WDR45B 56270 +WDR45BP1 646086 +WDR45P1 594841 +WDR46 9277 +WDR47 22911 +WDR48 57599 +WDR49 151790 +WDR53 348793 +WDR53P1 127379699 +WDR54 84058 +WDR55 54853 +WDR59 79726 +WDR62 284403 +WDR64 128025 +WDR70 55100 +WDR70P1 124906251 +WDR72 256764 +WDR73 84942 +WDR74 54663 +WDR75 84128 +WDR76 79968 +WDR77 79084 +WDR77P1 100128050 +WDR81 124997 +WDR82 80335 +WDR82P1 728505 +WDR82P2 441891 +WDR83 84292 +WDR83OS 51398 +WDR86 349136 +WDR86-AS1 100131176 +WDR87 83889 +WDR87BP 100631378 +WDR88 126248 +WDR89 112840 +WDR90 197335 +WDR91 29062 +WDR93 56964 +WDR95P 100873795 +WDR97 340390 +WDSUB1 151525 +WDTC1 23038 +WDTC1-DT 105376890 +WEE1 7465 +WEE1P1 100129037 +WEE1P2 100129683 +WEE2 494551 +WEE2-AS1 285962 +WEE2P1 100420018 +WFDC1 58189 +WFDC2 10406 +WFDC3 140686 +WFDC5 149708 +WFDC6 140870 +WFDC8 90199 +WFDC9 259240 +WFDC10A 140832 +WFDC10B 280664 +WFDC11 259239 +WFDC12 128488 +WFDC13 164237 +WFDC21P 645638 +WFIKKN1 117166 +WFIKKN2 124857 +WFS1 7466 +WHAMM 123720 +WHAMMP1 100288615 +WHAMMP2 440253 +WHAMMP3 339005 +WHAMMP4 100288203 +WHRN 25861 +WHSC1L2P 100128016 +WIF1 11197 +WIPF1 7456 +WIPF2 147179 +WIPF3 644150 +WIPI1 55062 +WIPI2 26100 +WIZ 58525 +WIZP1 645598 +WLS 79971 +WNK1 65125 +WNK2 65268 +WNK3 65267 +WNK4 65266 +WNT1 7471 +WNT2 7472 +WNT2B 7482 +WNT3 7473 +WNT3A 89780 +WNT4 54361 +WNT5A 7474 +WNT5A-AS1 100874008 +WNT5B 81029 +WNT6 7475 +WNT7A 7476 +WNT7B 7477 +WNT8A 7478 +WNT8B 7479 +WNT9A 7483 +WNT9B 7484 +WNT10A 80326 +WNT10B 7480 +WNT11 7481 +WNT16 51384 +WRAP53 55135 +WRAP73 49856 +WRN 7486 +WRNIP1 56897 +WSB1 26118 +WSB2 55884 +WSCD1 23302 +WSCD2 9671 +WSPAR 105664404 +WT1 7490 +WT1-AS 51352 +WTAP 9589 +WTAPP1 100288077 +WTIP 126374 +WWC1 23286 +WWC2 80014 +WWC2-AS1 101928734 +WWC2-AS2 152641 +WWC3 55841 +WWC3-AS1 100873953 +WWOX 51741 +WWOX-AS1 102724047 +WWP1 11059 +WWP1-AS1 105375624 +WWP1P1 339843 +WWP2 11060 +WWTR1 25937 +WWTR1-AS1 100128025 +WWTR1-IT1 106478977 +XAB2 56949 +XACT 105463123 +XAF1 54739 +XAGE1A 653220 +XAGE1B 653067 +XAGE2 9502 +XAGE3 170626 +XAGE5 170627 +XBP1 7494 +XBP1P1 7495 +XCE 7497 +XCL1 6375 +XCL2 6846 +XCR1 2829 +XDH 7498 +XG 7499 +XGY1 7500 +XGY2 100132596 +XIAP 331 +XIAP-AS1 106480735 +XIAPP1 100996851 +XIAPP2 100420509 +XIAPP3 100128413 +XIC 7502 +XIRP1 165904 +XIRP2 129446 +XIRP2-AS1 100874011 +XIST 7503 +XK 7504 +XKR3 150165 +XKR4 114786 +XKR4-AS1 105375843 +XKR5 389610 +XKR6 286046 +XKR7 343702 +XKR8 55113 +XKR9 389668 +XKRX 402415 +XKRY 9082 +XKRYP1 379028 +XKRYP2 379029 +XKRYP3 379030 +XKRYP4 379031 +XKRYP5 379032 +XKRYP6 379033 +XKRYP7 353515 +XNDC1CP 115995503 +XNDC1N 100133315 +XNDC1N-ZNF705EP-ALG1L9P 122319435 +XPA 7507 +XPC 7508 +XPC-AS1 107986063 +XPNPEP1 7511 +XPNPEP2 7512 +XPNPEP3 63929 +XPO1 7514 +XPO4 64328 +XPO5 57510 +XPO6 23214 +XPO7 23039 +XPOT 11260 +XPOTP1 170559 +XPR1 9213 +XRCC1 7515 +XRCC2 7516 +XRCC3 7517 +XRCC4 7518 +XRCC5 7520 +XRCC6 2547 +XRCC6P1 387703 +XRCC6P2 389901 +XRCC6P3 127086 +XRCC6P4 100422546 +XRCC6P5 442459 +XRN1 54464 +XRN2 22803 +XRRA1 143570 +XXYLT1 152002 +XXYLT1-AS1 100874528 +XXYLT1-AS2 101410543 +XYLB 9942 +XYLT1 64131 +XYLT2 64132 +YAE1 57002 +YAE1-DT 105375240 +YAF2 10138 +YAM1 107161157 +YAP1 10413 +YAP1P1 442266 +YAP1P2 100419909 +YAP1P3 100419883 +YARS1 8565 +YARS2 51067 +YBEY 54059 +YBX1 4904 +YBX1P1 50631 +YBX1P2 646531 +YBX1P3 100861556 +YBX1P4 100131012 +YBX1P5 100861569 +YBX1P6 402375 +YBX1P7 100861431 +YBX1P8 100861476 +YBX1P9 100861470 +YBX1P10 158373 +YBX2 51087 +YBX2P1 100124332 +YBX2P2 100124334 +YBX3 8531 +YBX3P1 440359 +YDJC 150223 +YEATS2 55689 +YEATS2-AS1 100874113 +YEATS4 8089 +YES1 7525 +YES1P1 7526 +YIF1A 10897 +YIF1B 90522 +YIPF1 54432 +YIPF2 78992 +YIPF3 25844 +YIPF4 84272 +YIPF5 81555 +YIPF6 286451 +YIPF7 285525 +YJEFN3 374887 +YJU2 55702 +YJU2B 81576 +YKT6 10652 +YLPM1 56252 +YME1L1 10730 +YME1L1P1 23749 +YOD1 55432 +YPEL1 29799 +YPEL2 388403 +YPEL3 83719 +YPEL3-DT 101928595 +YPEL4 219539 +YPEL5 51646 +YPEL5P1 100130996 +YPEL5P2 100132562 +YPEL5P3 100653396 +YRDC 79693 +YRDCP1 100420501 +YRDCP2 100128237 +YRDCP3 100861429 +YTHDC1 91746 +YTHDC2 64848 +YTHDF1 54915 +YTHDF1P1 402220 +YTHDF2 51441 +YTHDF2P1 400209 +YTHDF3 253943 +YTHDF3-DT 101410533 +YTHDF3P1 127379726 +YWHAB 7529 +YWHABP1 647051 +YWHABP2 100422666 +YWHAE 7531 +YWHAEP1 649395 +YWHAEP2 106481688 +YWHAEP3 106480273 +YWHAEP4 106481785 +YWHAEP5 440917 +YWHAEP6 112296172 +YWHAEP7 284100 +YWHAG 7532 +YWHAH 7533 +YWHAH-AS1 25775 +YWHAQ 10971 +YWHAQP1 319121 +YWHAQP2 246716 +YWHAQP3 100128944 +YWHAQP4 646954 +YWHAQP5 100130391 +YWHAQP6 101290504 +YWHAQP7 100422674 +YWHAQP8 392510 +YWHAQP9 101290508 +YWHAQP10 127379682 +YWHAZ 7534 +YWHAZP1 319120 +YWHAZP2 150554 +YWHAZP3 143371 +YWHAZP4 246737 +YWHAZP5 86123 +YWHAZP6 158383 +YWHAZP7 100130640 +YWHAZP8 646016 +YWHAZP9 441609 +YWHAZP10 158781 +YY1 7528 +YY1AP1 55249 +YY1P1 100419963 +YY1P2 647012 +YY2 404281 +ZACN 353174 +ZACNP1 101929026 +ZAN 7455 +ZAP70 7535 +ZAR1 326340 +ZAR1L 646799 +ZBBX 79740 +ZBED1 9189 +ZBED1P1 645145 +ZBED2 79413 +ZBED3 84327 +ZBED3-AS1 728723 +ZBED4 9889 +ZBED5 58486 +ZBED5-AS1 729013 +ZBED6 100381270 +ZBED9-AS1 121676925 +ZBED10P 113763 +ZBP1 81030 +ZBTB1 22890 +ZBTB2 57621 +ZBTB2P1 100421184 +ZBTB3 79842 +ZBTB4 57659 +ZBTB5 9925 +ZBTB6 10773 +ZBTB7A 51341 +ZBTB7B 51043 +ZBTB7C 201501 +ZBTB7C-AS1 105372104 +ZBTB7C-AS2 84322 +ZBTB8A 653121 +ZBTB8B 728116 +ZBTB8OS 339487 +ZBTB8OSP1 729566 +ZBTB8OSP2 729898 +ZBTB9 221504 +ZBTB10 65986 +ZBTB11 27107 +ZBTB11-AS1 100009676 +ZBTB12 221527 +ZBTB12BP 100499252 +ZBTB14 7541 +ZBTB16 7704 +ZBTB17 7709 +ZBTB18 10472 +ZBTB20 26137 +ZBTB20-AS1 100131117 +ZBTB20-AS2 100506673 +ZBTB20-AS3 104413890 +ZBTB20-AS4 100874131 +ZBTB20-AS5 101929754 +ZBTB21 49854 +ZBTB22 9278 +ZBTB24 9841 +ZBTB24-DT 105377935 +ZBTB25 7597 +ZBTB26 57684 +ZBTB32 27033 +ZBTB33 10009 +ZBTB34 403341 +ZBTB37 84614 +ZBTB38 253461 +ZBTB39 9880 +ZBTB40 9923 +ZBTB40-IT1 100874345 +ZBTB41 360023 +ZBTB42 100128927 +ZBTB43 23099 +ZBTB44 29068 +ZBTB44-DT 646383 +ZBTB45 84878 +ZBTB45P1 645129 +ZBTB45P2 729248 +ZBTB46 140685 +ZBTB46-AS1 101928604 +ZBTB46-AS2 122152329 +ZBTB47 92999 +ZBTB47-AS1 101928323 +ZBTB48 3104 +ZBTB49 166793 +ZC2HC1A 51101 +ZC2HC1B 153918 +ZC2HC1C 79696 +ZC3H3 23144 +ZC3H4 23211 +ZC3H6 376940 +ZC3H7A 29066 +ZC3H7B 23264 +ZC3H8 84524 +ZC3H10 84872 +ZC3H11A 9877 +ZC3H11B 643136 +ZC3H11C 441155 +ZC3H12A 80149 +ZC3H12B 340554 +ZC3H12C 85463 +ZC3H12D 340152 +ZC3H13 23091 +ZC3H14 79882 +ZC3H15 55854 +ZC3H18 124245 +ZC3H18-AS1 400555 +ZC3HAV1 56829 +ZC3HAV1L 92092 +ZC3HC1 51530 +ZC4H2 55906 +ZCCHC2 54877 +ZCCHC3 85364 +ZCCHC4 29063 +ZCCHC7 84186 +ZCCHC8 55596 +ZCCHC9 84240 +ZCCHC10 54819 +ZCCHC10P1 101929598 +ZCCHC10P2 100421071 +ZCCHC12 170261 +ZCCHC13 389874 +ZCCHC14 23174 +ZCCHC14-DT 101928737 +ZCCHC17 51538 +ZCCHC18 644353 +ZCCHC24 219654 +ZCRB1 85437 +ZCRB1P1 100131556 +ZCWPW1 55063 +ZCWPW2 152098 +ZDBF2 57683 +ZDHHC1 29800 +ZDHHC1P1 127566426 +ZDHHC2 51201 +ZDHHC3 51304 +ZDHHC4 55146 +ZDHHC4P1 100420920 +ZDHHC5 25921 +ZDHHC6 64429 +ZDHHC7 55625 +ZDHHC8 29801 +ZDHHC8BP 150244 +ZDHHC9 51114 +ZDHHC11 79844 +ZDHHC11B 653082 +ZDHHC12 84885 +ZDHHC12-DT 100506100 +ZDHHC13 54503 +ZDHHC14 79683 +ZDHHC15 158866 +ZDHHC16 84287 +ZDHHC17 23390 +ZDHHC18 84243 +ZDHHC19 131540 +ZDHHC20 253832 +ZDHHC20-IT1 100874367 +ZDHHC20P1 100048907 +ZDHHC20P2 100048908 +ZDHHC20P3 100874348 +ZDHHC20P4 730239 +ZDHHC21 340481 +ZDHHC22 283576 +ZDHHC23 254887 +ZDHHC24 254359 +ZEB1 6935 +ZEB1-AS1 220930 +ZEB2 9839 +ZEB2-AS1 100303491 +ZEB2P1 100420926 +ZEBTR 113391337 +ZER1 10444 +ZFAND1 79752 +ZFAND2A 90637 +ZFAND2A-DT 101927021 +ZFAND2AP1 127379714 +ZFAND2AP2 127379733 +ZFAND2B 130617 +ZFAND3 60685 +ZFAND3-DT 107986593 +ZFAND4 93550 +ZFAND5 7763 +ZFAND6 54469 +ZFAND6P1 100631382 +ZFAS1 441951 +ZFAT 57623 +ZFAT-AS1 594840 +ZFC3H1 196441 +ZFHX2 85446 +ZFHX2-AS1 109729160 +ZFHX3 463 +ZFHX3-AS1 101927978 +ZFHX4 79776 +ZFHX4-AS1 100192378 +ZFP1 162239 +ZFP2 80108 +ZFP3 124961 +ZFP3-DT 119139902 +ZFP14 57677 +ZFP28 140612 +ZFP28-DT 101928982 +ZFP30 22835 +ZFP36 7538 +ZFP36L1 677 +ZFP36L2 678 +ZFP37 7539 +ZFP41 286128 +ZFP42 132625 +ZFP57 346171 +ZFP62 643836 +ZFP64 55734 +ZFP64P1 319123 +ZFP69 339559 +ZFP69B 65243 +ZFP82 284406 +ZFP90 146198 +ZFP91 80829 +ZFP91-CNTF 386607 +ZFP91P1 100131832 +ZFP92 139735 +ZFPL1 7542 +ZFPM1 161882 +ZFPM1-AS1 100128882 +ZFPM2 23414 +ZFPM2-AS1 102723356 +ZFR 51663 +ZFR2 23217 +ZFRP1 100129438 +ZFTA 65998 +ZFTRAF1 50626 +ZFX 7543 +ZFX-AS1 100873922 +ZFY 7544 +ZFY-AS1 107987337 +ZFYVE1 53349 +ZFYVE9 9372 +ZFYVE9P1 100289259 +ZFYVE9P2 100420972 +ZFYVE16 9765 +ZFYVE19 84936 +ZFYVE21 79038 +ZFYVE26 23503 +ZFYVE27 118813 +ZFYVE28 57732 +ZG16 653808 +ZG16B 124220 +ZGLP1 100125288 +ZGPAT 84619 +ZGRF1 55345 +ZHX1 11244 +ZHX1-C8orf76 100533106 +ZHX2 22882 +ZHX3 23051 +ZIC1 7545 +ZIC2 7546 +ZIC3 7547 +ZIC4 84107 +ZIC4-AS1 100873950 +ZIC5 85416 +ZIK1 284307 +ZIK1P1 100131493 +ZIM2 23619 +ZIM2-AS1 101929059 +ZIM3 114026 +ZKSCAN1 7586 +ZKSCAN2 342357 +ZKSCAN2-DT 112577464 +ZKSCAN3 80317 +ZKSCAN4 387032 +ZKSCAN5 23660 +ZKSCAN7 55888 +ZKSCAN7-AS1 112840933 +ZKSCAN7P1 100419827 +ZKSCAN8 7745 +ZKSCAN8P1 651302 +ZKSCAN8P2 222701 +ZMAT1 84460 +ZMAT2 153527 +ZMAT3 64393 +ZMAT4 79698 +ZMAT5 55954 +ZMIZ1 57178 +ZMIZ1-AS1 283050 +ZMIZ2 83637 +ZMPSTE24 10269 +ZMPSTE24-DT 120017338 +ZMYM1 79830 +ZMYM2 7750 +ZMYM3 9203 +ZMYM4 9202 +ZMYM4-AS1 100861513 +ZMYM5 9205 +ZMYM6 9204 +ZMYND8 23613 +ZMYND10 51364 +ZMYND10-AS1 100874210 +ZMYND11 10771 +ZMYND12 84217 +ZMYND15 84225 +ZMYND19 116225 +ZMYND19P1 100421055 +ZNF2 7549 +ZNF3 7551 +ZNF7 7553 +ZNF8 7554 +ZNF8-DT 105372482 +ZNF8-ERVK3-1 108903150 +ZNF10 7556 +ZNF12 7559 +ZNF14 7561 +ZNF16 7564 +ZNF17 7565 +ZNF18 7566 +ZNF19 7567 +ZNF20 7568 +ZNF22 7570 +ZNF22-AS1 220979 +ZNF23 7571 +ZNF24 7572 +ZNF24TR 122965328 +ZNF25 219749 +ZNF25-DT 105376499 +ZNF26 7574 +ZNF28 7576 +ZNF29P 7577 +ZNF30 90075 +ZNF30-AS1 102723513 +ZNF32 7580 +ZNF32-AS1 414197 +ZNF32-AS2 414208 +ZNF32-AS3 414201 +ZNF33A 7581 +ZNF33B 7582 +ZNF33BP1 100419868 +ZNF33CP 79231 +ZNF34 80778 +ZNF35 7584 +ZNF37A 7587 +ZNF37BP 100129482 +ZNF37CP 79232 +ZNF41 7592 +ZNF43 7594 +ZNF44 51710 +ZNF45 7596 +ZNF45-AS1 118827818 +ZNF48 197407 +ZNF56P 7608 +ZNF57 126295 +ZNF66 7617 +ZNF69 7620 +ZNF70 7621 +ZNF70P1 100419609 +ZNF71 58491 +ZNF72AP 100287084 +ZNF72BP 100533637 +ZNF73P 105379427 +ZNF74 7625 +ZNF75A 7627 +ZNF75BP 7628 +ZNF75CP 729944 +ZNF75D 7626 +ZNF76 7629 +ZNF77 58492 +ZNF79 7633 +ZNF80 7634 +ZNF81 347344 +ZNF83 55769 +ZNF84 7637 +ZNF84-DT 101928597 +ZNF85 7639 +ZNF90 7643 +ZNF90P1 7661 +ZNF90P2 100419606 +ZNF90P3 100873799 +ZNF91 7644 +ZNF92 168374 +ZNF92P1Y 100419554 +ZNF92P2 100419705 +ZNF93 81931 +ZNF98 148198 +ZNF99 7652 +ZNF100 163227 +ZNF101 94039 +ZNF101P1 100419867 +ZNF101P2 730190 +ZNF106 64397 +ZNF107 51427 +ZNF112 7771 +ZNF114 163071 +ZNF114-AS1 105372429 +ZNF114P1 100132509 +ZNF117 51351 +ZNF121 7675 +ZNF123P 100188891 +ZNF124 7678 +ZNF131 7690 +ZNF132 7691 +ZNF132-DT 118827803 +ZNF133 7692 +ZNF133-AS1 105372550 +ZNF134 7693 +ZNF135 7694 +ZNF136 7695 +ZNF137P 7696 +ZNF138 7697 +ZNF140 7699 +ZNF141 7700 +ZNF142 7701 +ZNF143 7702 +ZNF146 7705 +ZNF148 7707 +ZNF154 7710 +ZNF155 7711 +ZNF157 7712 +ZNF160 90338 +ZNF165 7718 +ZNF169 169841 +ZNF174 7727 +ZNF175 7728 +ZNF177 7730 +ZNF180 7733 +ZNF181 339318 +ZNF182 7569 +ZNF184 7738 +ZNF185 7739 +ZNF189 7743 +ZNF195 7748 +ZNF197 10168 +ZNF197-AS1 100874094 +ZNF200 7752 +ZNF202 7753 +ZNF204P 7754 +ZNF205 7755 +ZNF205-AS1 81854 +ZNF207 7756 +ZNF208 7757 +ZNF209P 441843 +ZNF211 10520 +ZNF212 7988 +ZNF213 7760 +ZNF213-AS1 100507458 +ZNF214 7761 +ZNF215 7762 +ZNF217 7764 +ZNF217-AS1 101927770 +ZNF219 51222 +ZNF221 7638 +ZNF222 7673 +ZNF222-DT 105372414 +ZNF223 7766 +ZNF224 7767 +ZNF225 7768 +ZNF225-AS1 100379224 +ZNF226 7769 +ZNF227 7770 +ZNF229 7772 +ZNF230 7773 +ZNF230-DT 101928063 +ZNF232 7775 +ZNF232-AS1 101928000 +ZNF233 353355 +ZNF234 10780 +ZNF235 9310 +ZNF236 7776 +ZNF236-DT 100131655 +ZNF239 8187 +ZNF248 57209 +ZNF248-AS1 128266837 +ZNF250 58500 +ZNF251 90987 +ZNF252P 286101 +ZNF252P-AS1 286103 +ZNF253 56242 +ZNF254 9534 +ZNF256 10172 +ZNF257 113835 +ZNF260 339324 +ZNF263 10127 +ZNF264 9422 +ZNF266 10781 +ZNF267 10308 +ZNF268 10795 +ZNF271P 10778 +ZNF273 10793 +ZNF274 10782 +ZNF275 10838 +ZNF276 92822 +ZNF277 11179 +ZNF277-AS1 124901728 +ZNF280A 129025 +ZNF280B 140883 +ZNF280C 55609 +ZNF280D 54816 +ZNF281 23528 +ZNF282 8427 +ZNF283 284349 +ZNF284 342909 +ZNF285 26974 +ZNF285BP 147711 +ZNF285CP 646915 +ZNF285DP 102723636 +ZNF286A 57335 +ZNF286A-TBC1D26 119086082 +ZNF286B 729288 +ZNF287 57336 +ZNF292 23036 +ZNF295-AS1 150142 +ZNF296 162979 +ZNF299P 54012 +ZNF300 91975 +ZNF300P1 134466 +ZNF302 55900 +ZNF304 57343 +ZNF311 282890 +ZNF316 100131017 +ZNF317 57693 +ZNF317P1 100288659 +ZNF318 24149 +ZNF319 57567 +ZNF320 162967 +ZNF321P 399669 +ZNF322 79692 +ZNF322P1 387328 +ZNF324 25799 +ZNF324B 388569 +ZNF326 284695 +ZNF329 79673 +ZNF330 27309 +ZNF331 55422 +ZNF333 84449 +ZNF334 55713 +ZNF335 63925 +ZNF337 26152 +ZNF337-AS1 102724826 +ZNF341 84905 +ZNF341-AS1 101929746 +ZNF343 79175 +ZNF345 25850 +ZNF346 23567 +ZNF346-IT1 106480741 +ZNF347 84671 +ZNF350 59348 +ZNF350-AS1 101669766 +ZNF354A 6940 +ZNF354B 117608 +ZNF354C 30832 +ZNF355P 100505852 +ZNF358 140467 +ZNF362 149076 +ZNF365 22891 +ZNF366 167465 +ZNF367 195828 +ZNF382 84911 +ZNF383 163087 +ZNF384 171017 +ZNF385A 25946 +ZNF385B 151126 +ZNF385C 201181 +ZNF385D 79750 +ZNF385D-AS1 100874216 +ZNF385D-AS2 100874221 +ZNF391 346157 +ZNF394 84124 +ZNF395 55893 +ZNF396 252884 +ZNF397 84307 +ZNF398 57541 +ZNF402P 266673 +ZNF404 342908 +ZNF407 55628 +ZNF407-AS1 400657 +ZNF408 79797 +ZNF410 57862 +ZNF414 84330 +ZNF415 55786 +ZNF415P1 100419893 +ZNF416 55659 +ZNF417 147687 +ZNF418 147686 +ZNF419 79744 +ZNF420 147923 +ZNF423 23090 +ZNF425 155054 +ZNF426 79088 +ZNF426-DT 101928238 +ZNF428 126299 +ZNF429 353088 +ZNF430 80264 +ZNF431 170959 +ZNF432 9668 +ZNF433 163059 +ZNF433-AS1 101928464 +ZNF436 80818 +ZNF436-AS1 148898 +ZNF438 220929 +ZNF439 90594 +ZNF440 126070 +ZNF441 126068 +ZNF442 79973 +ZNF443 10224 +ZNF444 55311 +ZNF444P1 100419866 +ZNF445 353274 +ZNF446 55663 +ZNF449 203523 +ZNF451 26036 +ZNF451-AS1 101927211 +ZNF454 285676 +ZNF454-DT 118568820 +ZNF460 10794 +ZNF460-AS1 105372476 +ZNF461 92283 +ZNF462 58499 +ZNF467 168544 +ZNF468 90333 +ZNF469 84627 +ZNF470 388566 +ZNF470-DT 112268241 +ZNF471 57573 +ZNF473 25888 +ZNF473CR 400710 +ZNF474 133923 +ZNF474-AS1 107986445 +ZNF475 100505841 +ZNF479 90827 +ZNF480 147657 +ZNF483 158399 +ZNF484 83744 +ZNF485 220992 +ZNF486 90649 +ZNF487 642819 +ZNF488 118738 +ZNF490 57474 +ZNF491 126069 +ZNF492 57615 +ZNF493 284443 +ZNF496 84838 +ZNF496-DT 107985115 +ZNF497 162968 +ZNF497-AS1 105372483 +ZNF500 26048 +ZNF501 115560 +ZNF502 91392 +ZNF503 84858 +ZNF503-AS1 253264 +ZNF503-AS2 100131213 +ZNF506 440515 +ZNF507 22847 +ZNF510 22869 +ZNF511 118472 +ZNF511-PRAP1 104326056 +ZNF512 84450 +ZNF512B 57473 +ZNF513 130557 +ZNF514 84874 +ZNF516 9658 +ZNF516-AS1 101927989 +ZNF516-DT 400658 +ZNF517 340385 +ZNF518A 9849 +ZNF518B 85460 +ZNF519 162655 +ZNF519P1 100419873 +ZNF519P2 100287908 +ZNF519P3 100288042 +ZNF519P4 106481981 +ZNF521 25925 +ZNF524 147807 +ZNF525 170958 +ZNF526 116115 +ZNF527 84503 +ZNF528 84436 +ZNF528-AS1 102724105 +ZNF529 57711 +ZNF529-AS1 101927599 +ZNF530 348327 +ZNF532 55205 +ZNF534 147658 +ZNF536 9745 +ZNF540 163255 +ZNF541 84215 +ZNF542P 147947 +ZNF543 125919 +ZNF544 27300 +ZNF546 339327 +ZNF547 284306 +ZNF548 147694 +ZNF549 256051 +ZNF550 162972 +ZNF551 90233 +ZNF552 79818 +ZNF554 115196 +ZNF555 148254 +ZNF556 80032 +ZNF557 79230 +ZNF558 148156 +ZNF559 84527 +ZNF559-ZNF177 100529215 +ZNF560 147741 +ZNF561 93134 +ZNF561-AS1 284385 +ZNF562 54811 +ZNF563 147837 +ZNF564 163050 +ZNF565 147929 +ZNF566 84924 +ZNF566-AS1 728752 +ZNF567 163081 +ZNF567-DT 101927621 +ZNF568 374900 +ZNF569 148266 +ZNF570 148268 +ZNF571 51276 +ZNF571-AS1 100507433 +ZNF572 137209 +ZNF573 126231 +ZNF574 64763 +ZNF575 284346 +ZNF576 79177 +ZNF577 84765 +ZNF578 147660 +ZNF579 163033 +ZNF580 51157 +ZNF581 51545 +ZNF582 147948 +ZNF582-DT 386758 +ZNF583 147949 +ZNF584 201514 +ZNF584-DT 123706526 +ZNF585A 199704 +ZNF585B 92285 +ZNF586 54807 +ZNF587 84914 +ZNF587B 100293516 +ZNF587P1 100419751 +ZNF589 51385 +ZNF592 9640 +ZNF593 51042 +ZNF593OS 118568799 +ZNF594 84622 +ZNF594-DT 100130950 +ZNF595 152687 +ZNF596 169270 +ZNF597 146434 +ZNF598 90850 +ZNF599 148103 +ZNF600 162966 +ZNF601P 493824 +ZNF602P 100419608 +ZNF603P 493821 +ZNF605 100289635 +ZNF606 80095 +ZNF606-AS1 100128398 +ZNF607 84775 +ZNF608 57507 +ZNF609 23060 +ZNF610 162963 +ZNF611 81856 +ZNF613 79898 +ZNF614 80110 +ZNF615 284370 +ZNF616 90317 +ZNF618 114991 +ZNF619 285267 +ZNF619P1 100419776 +ZNF620 253639 +ZNF621 285268 +ZNF622 90441 +ZNF622P1 100419792 +ZNF623 9831 +ZNF624 57547 +ZNF625 90589 +ZNF625-ZNF20 100529855 +ZNF626 199777 +ZNF627 199692 +ZNF628 89887 +ZNF628-DT 118732301 +ZNF629 23361 +ZNF630 57232 +ZNF630-AS1 100874120 +ZNF638 27332 +ZNF639 51193 +ZNF641 121274 +ZNF644 84146 +ZNF646 9726 +ZNF646P1 100419854 +ZNF648 127665 +ZNF649 65251 +ZNF649-AS1 101928571 +ZNF652 22834 +ZNF652-AS1 102724596 +ZNF652P1 646592 +ZNF653 115950 +ZNF654 55279 +ZNF655 79027 +ZNF658 26149 +ZNF658B 401509 +ZNF660 285349 +ZNF662 389114 +ZNF663P 100130934 +ZNF664 144348 +ZNF665 79788 +ZNF667 63934 +ZNF667-AS1 100128252 +ZNF668 79759 +ZNF669 79862 +ZNF670 93474 +ZNF670-ZNF695 100533111 +ZNF671 79891 +ZNF672 79894 +ZNF674 641339 +ZNF674-AS1 401588 +ZNF675 171392 +ZNF676 163223 +ZNF677 342926 +ZNF678 339500 +ZNF679 168417 +ZNF680 340252 +ZNF680P1 728947 +ZNF681 148213 +ZNF682 91120 +ZNF683 257101 +ZNF684 127396 +ZNF687 57592 +ZNF687-AS1 100507670 +ZNF688 146542 +ZNF689 115509 +ZNF691 51058 +ZNF691-DT 122152325 +ZNF692 55657 +ZNF692-DT 122152365 +ZNF695 57116 +ZNF696 79943 +ZNF697 90874 +ZNF699 374879 +ZNF700 90592 +ZNF701 55762 +ZNF702P 79986 +ZNF703 80139 +ZNF704 619279 +ZNF705A 440077 +ZNF705B 100132396 +ZNF705CP 389631 +ZNF705D 728957 +ZNF705EP 100131539 +ZNF705G 100131980 +ZNF706 51123 +ZNF707 286075 +ZNF708 7562 +ZNF709 163051 +ZNF710 374655 +ZNF710-AS1 109729181 +ZNF711 7552 +ZNF713 349075 +ZNF714 148206 +ZNF716 441234 +ZNF717 100131827 +ZNF718 255403 +ZNF721 170960 +ZNF722 100419780 +ZNF723 646864 +ZNF724 440519 +ZNF725P 100128853 +ZNF726 730087 +ZNF726P1 7618 +ZNF727 442319 +ZNF728 388523 +ZNF729 100287226 +ZNF730 100129543 +ZNF731P 729806 +ZNF732 654254 +ZNF733P 643955 +ZNF734P 644017 +ZNF735 730291 +ZNF736 728927 +ZNF736P1Y 442486 +ZNF736P2Y 392603 +ZNF736P3Y 246123 +ZNF736P4Y 100419735 +ZNF736P5Y 106480711 +ZNF736P6Y 100419732 +ZNF736P7Y 100419725 +ZNF736P8Y 100419724 +ZNF736P9Y 100419726 +ZNF736P10Y 100419727 +ZNF736P11Y 100419730 +ZNF736P12Y 100419731 +ZNF737 100129842 +ZNF738 148203 +ZNF740 283337 +ZNF746 155061 +ZNF747 65988 +ZNF747-DT 107984875 +ZNF749 388567 +ZNF750 79755 +ZNF761 388561 +ZNF763 284390 +ZNF764 92595 +ZNF765 91661 +ZNF766 90321 +ZNF767P 79970 +ZNF768 79724 +ZNF770 54989 +ZNF771 51333 +ZNF772 400720 +ZNF773 374928 +ZNF774 342132 +ZNF775 285971 +ZNF775-AS1 105375564 +ZNF776 284309 +ZNF777 27153 +ZNF778 197320 +ZNF778-DT 123706547 +ZNF780A 284323 +ZNF780B 163131 +ZNF781 163115 +ZNF782 158431 +ZNF783 100289678 +ZNF784 147808 +ZNF785 146540 +ZNF786 136051 +ZNF787 126208 +ZNF788P 388507 +ZNF789 285989 +ZNF790 388536 +ZNF790-AS1 284408 +ZNF791 163049 +ZNF792 126375 +ZNF793 390927 +ZNF793-AS1 101927720 +ZNF799 90576 +ZNF800 168850 +ZNF804A 91752 +ZNF804B 219578 +ZNF805 390980 +ZNF807P 100129800 +ZNF808 388558 +ZNF812P 729648 +ZNF813 126017 +ZNF814 730051 +ZNF815P 401303 +ZNF816 125893 +ZNF816-ZNF321P 100529240 +ZNF818P 390963 +ZNF821 55565 +ZNF823 55552 +ZNF826P 664701 +ZNF827 152485 +ZNF829 374899 +ZNF830 91603 +ZNF831 128611 +ZNF833P 401898 +ZNF835 90485 +ZNF836 162962 +ZNF837 116412 +ZNF839 55778 +ZNF839P1 100419733 +ZNF840P 100533646 +ZNF841 284371 +ZNF843 283933 +ZNF844 284391 +ZNF845 91664 +ZNF846 162993 +ZNF847P 401983 +ZNF848P 100380945 +ZNF849P 100130108 +ZNF850 342892 +ZNF852 285346 +ZNF853 54753 +ZNF859P 100507490 +ZNF860 344787 +ZNF861P 100302737 +ZNF862 643641 +ZNF863P 100419682 +ZNF865 100507290 +ZNF875 284459 +ZNF876P 642280 +ZNF877P 100873811 +ZNF878 729747 +ZNF879 345462 +ZNF880 400713 +ZNF883 169834 +ZNF884P 100419729 +ZNF885P 100419734 +ZNF886P 100419728 +ZNF887P 100419709 +ZNF888 388559 +ZNF888-AS1 123706511 +ZNF890P 645700 +ZNF891 101060200 +ZNF892 344065 +ZNF962P 729501 +ZNF965P 100132598 +ZNF968P 100419756 +ZNF969P 100130995 +ZNF970P 105369729 +ZNF971P 100419895 +ZNFX1 57169 +ZNG1A 55871 +ZNG1B 150472 +ZNG1C 445571 +ZNG1DP 653510 +ZNG1E 220869 +ZNG1F 644019 +ZNHIT1 10467 +ZNHIT1P1 100288248 +ZNHIT2 741 +ZNHIT3 9326 +ZNHIT6 54680 +ZNNT1 115830329 +ZNRD2 10534 +ZNRD2-DT 254100 +ZNRF1 84937 +ZNRF2 223082 +ZNRF2P1 441208 +ZNRF2P2 100271874 +ZNRF2P3 100130879 +ZNRF3 84133 +ZNRF3-AS1 100874123 +ZNRF3-IT1 100874339 +ZNRF4 148066 +ZP1 22917 +ZP2 7783 +ZP3 7784 +ZP3P1 100421623 +ZP3P2 100421642 +ZP4 57829 +ZPAXP 105373450 +ZPBP 11055 +ZPBP2 124626 +ZPLD1 131368 +ZPLD2P 101928303 +ZPR1 8882 +ZPR1P1 442240 +ZRANB1 54764 +ZRANB2 9406 +ZRANB2-AS1 100132618 +ZRANB2-DT 100852410 +ZRANB3 84083 +ZRSR2 8233 +ZRSR2P1 7310 +ZSCAN1 284312 +ZSCAN2 54993 +ZSCAN2-AS1 128193291 +ZSCAN4 201516 +ZSCAN5A 79149 +ZSCAN5A-AS1 112268243 +ZSCAN5B 342933 +ZSCAN5C 649137 +ZSCAN5DP 646698 +ZSCAN9 7746 +ZSCAN10 84891 +ZSCAN12 9753 +ZSCAN12P1 221584 +ZSCAN16 80345 +ZSCAN16-AS1 100129195 +ZSCAN18 65982 +ZSCAN20 7579 +ZSCAN21 7589 +ZSCAN22 342945 +ZSCAN23 222696 +ZSCAN25 221785 +ZSCAN26 7741 +ZSCAN29 146050 +ZSCAN30 100101467 +ZSCAN31 64288 +ZSCAN32 54925 +ZSWIM1 90204 +ZSWIM2 151112 +ZSWIM3 140831 +ZSWIM4 65249 +ZSWIM5 57643 +ZSWIM5P1 100130110 +ZSWIM5P2 100132201 +ZSWIM5P3 391697 +ZSWIM6 57688 +ZSWIM7 125150 +ZSWIM8 23053 +ZSWIM8-AS1 100507331 +ZSWIM9 374920 +ZUP1 221302 +ZW10 9183 +ZWILCH 55055 +ZWINT 11130 +ZXDA 7789 +ZXDB 158586 +ZXDC 79364 +ZYG11A 440590 +ZYG11AP1 100131879 +ZYG11B 79699 +ZYX 7791 +ZYXP1 106480342 +ZZEF1 23140 +ZZZ3 26009 diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/jannovar.yaml b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/jannovar.yaml new file mode 100644 index 000000000..636e5c3a7 --- /dev/null +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/jannovar.yaml @@ -0,0 +1,421 @@ +annotation: # Definition of annotations from jannovar + id: "ANN" # INFO field ID (unless change with --vcf_info_field option) + allele: "Allele" # Variant used to calculate consequence (https://www.ensembl.org/info/docs/tools/vep/vep_formats.html#defaultout) + extract: "^Functional annotations:'(.+)'$" # Regular expression to extract annotation names from the description of INFO field. The annotation names are in group 1 + split: "\\|" # Regular expression to split annotations (& annotation names) from the INFO field + minimize: True # Variant minimization applied by VEP (see https://www.ensembl.org/info/docs/tools/vep/script/vep_other.html#colocated) + + +output: # Output columns definition + + Hugo_Symbol: # Column name to output HGNC Symbol + input: # Required input + - set: "annotation" # The "SYMBOL" annotation column contains the requested information + column: "Gene_Name" + on_missing: skip # Genomic regions variants are not attached to genes, skip them on output + + Entrez_Gene_Id: # Column name to output NCBI ID + input: + - set: "annotation" # VEP doesn't provide NCBI gene ids (formerly ENTREZ gene ids) + column: "Gene_Name" # The column value is obtained by mapping the HGNC symbol + function: "map" # The "map" function is invoked with one input (the annotation SYMBOL), + args: # and one named argument, the mapping file (fixed for all variants) + filename: "hgnc_symbol_to_entrez_id.tsv" + on_missing: default # When no Entrez id is not for a symbol, the value is set to 0 + default: 0 + + Center: # Sequencing or processing center name + input: + - set: "constant" # The value is defined on the (optional) command-line arguments + column: "Center" # The argument is --Center + on_missing: default + default: "BIH" # When missing, the value "BIH" is used. + + NCBI_Build: + input: + - set: "constant" + column: "NCBI_Build" + on_missing: default + default: "GRCh37" + + Chromosome: # Sequence name + input: + - set: "fixed" # The input is taken from the vcf fixed field "CHROM" + column: "CHROM" + on_missing: stop # This field must be present. When absent, the program stops with an error + + Start_Position: # Position of the start of the variant. + input: # Note that vcf2maf.pl transforms the variant (position & allele sequences) + - set: "fixed" # to minimize them (see https://www.ensembl.org/info/docs/tools/vep/script/vep_other.html). + column: "POS" # This is *NOT* compatible with variant normalization as defined in + on_missing: stop # https://genome.sph.umich.edu/wiki/Variant_Normalization + - set: "variant" # The function "minimize_mutation" performs variant minimization, + column: "REF" # so the output is (should be) identical to anything produced by vcf2maf.pl + on_missing: stop # If the user wants to keep the variant definition as in the vcf file, + - set: "variant" # the configuration should be updated, and the "Start_Position" column should be + column: "ALT" # defined similarly to the "Chromosome" column, simply copying the contents of + on_missing: stop # the vcf's "POS" column. + function: "minimize_mutation" # The same applies to the columns describing the reference & alternate allele sequences, + args: # "Reference_Allele", "Tumor_Seq_Allele1" & "Tumor_Seq_Allele2", which should be + return_value: "pos" # copied from vcf columns "REF", "REF" & "ALT" respectively. + on_missing: stop + + End_Position: # Position of the end of the variant + input: # This information is missing from the vcf + - set: "fixed" # It is reconstituted from the start position, and the lengths of the reference & alternative alleles + column: "POS" # The program stop if either values are missing. + on_missing: stop + - set: "variant" # If the user want to keep the variant definition as in the vcf file, + column: "REF" # another function is provided, which doesn't alter the variant's starting position, + on_missing: stop # and simply computes the end of the variant locus as: + - set: "variant" # POS + length(reference allele sequence) - 1 for substitutions & deletions, and + column: "ALT" # POS + 1 for insertions + on_missing: stop + function: "minimize_mutation" # This alternative function is "calc_end_pos". + args: # It takes the same input as "minimize_mutation", but with additional arguments. + return_value: "end" # "calc_end_pos" assumes that the variant is normalized. + on_missing: stop + + Strand: + input: + - set: "constant" + column: "Strand" + on_missing: default + default: "+" + + Variant_Classification: # Variant classification + input: # Maps the jannovar variant classification + - set: "annotation" + column: "Annotation" + - set: "variant" + column: "REF" + - set: "variant" + column: "ALT" + function: "variant_classification_jannovar" + on_missing: default + default: "" + + Variant_Type: # Variant type (SNP/DNP/TNP/ONP/INS/DEL). + input: # The type "Consolidated" is not implemented. + - set: "variant" + column: "REF" # The function "variant_type" outputs the type based only on the length of + - set: "variant" # reference & alternative allele sequences. + column: "ALT" + function: "variant_type" + on_missing: default + default: "" + + Reference_Allele: # Reference allele (should be identical to the reference genome at the locus) + input: # Rather, it is taken from the normal homozygous allele. + - set: "fixed" + column: "POS" # The configuration is set so that the vcf2maf.pl behaviour is reproduced. + on_missing: stop # If the user want to keep the variant definition as in the vcf file instead, + - set: "variant" # the configuration should be set so that the vcf "REF" column is simply copied + column: "REF" # to the output column ("Reference_Allele"). + on_missing: stop + - set: "variant" + column: "ALT" + on_missing: stop + function: "minimize_mutation" + args: + return_value: "ref" + on_missing: stop + + Tumor_Seq_Allele1: # Unmutated allele in the tumor sample + input: + - set: "fixed" + column: "POS" # The configuration is set so that the vcf2maf.pl behaviour is reproduced. + on_missing: stop # If the user want to keep the variant definition as in the vcf file instead, + - set: "variant" # the configuration should be set so that the vcf "REF" column is simply copied + column: "REF" # to the output column ("Tumor_Seq_Allele1"). + on_missing: stop + - set: "variant" + column: "ALT" + on_missing: stop + function: "minimize_mutation" + args: + return_value: "ref" + on_missing: stop + + Tumor_Seq_Allele2: # Mutated allele in the tumor sample + input: + - set: "fixed" + column: "POS" # The configuration is set so that the vcf2maf.pl behaviour is reproduced. + on_missing: stop # If the user want to keep the variant definition as in the vcf file instead, + - set: "variant" # the configuration should be set so that the vcf "ALT" column is simply copied + column: "REF" # to the output column ("Tumor_Seq_Allele2"). + on_missing: stop + - set: "variant" + column: "ALT" + on_missing: stop + function: "minimize_mutation" + args: + return_value: "alt" + on_missing: stop + + dbSNP_RS: # dbSNP references + input: # Note that VEP also includes COSMIC references in that field. + - set: "constant" # TODO: create a function that parses the vcf field, extracts only the dbSNP + column: "Existing_variation" # ids and collapses them into a single strings separated by semicolumns. + on_missing: default + default: "" + + dbSNP_Val_Status: + input: + - set: "constant" + column: "dbSNP_Val_Status" + on_missing: default + default: "" + + Tumor_Sample_Barcode: + input: + - set: "constant" + column: "tumor_id" + on_missing: default + default: "tumor" + + Matched_Normal_Sample_Barcode: + input: + - set: "constant" + column: "normal_id" + on_missing: default + default: "normal" + + Match_Norm_Seq_Allele1: # Match normal allele1. + input: # Should be identical to "Tumor_Allele1", but instead is set to the reference genome sequence + - set: "fixed" + column: "POS" # The configuration is set so that the vcf2maf.pl behaviour is reproduced. + on_missing: stop # If the user want to keep the variant definition as in the vcf file instead, + - set: "variant" # the configuration should be set so that the vcf "REF" column is simply copied + column: "REF" # to the output column ("Tumor_Seq_Allele1"). + on_missing: stop + - set: "variant" + column: "ALT" + on_missing: stop + function: "minimize_mutation" + args: + return_value: "ref" + on_missing: stop + + Match_Norm_Seq_Allele2: # Match normal allele2 (the allele mutated in the tumor) + input: + - set: "fixed" + column: "POS" # The configuration is set so that the vcf2maf.pl behaviour is reproduced. + on_missing: stop # If the user want to keep the variant definition as in the vcf file instead, + - set: "variant" # the configuration should be set so that the vcf "REF" column is simply copied + column: "REF" # to the output column ("Tumor_Seq_Allele1"). + on_missing: stop + - set: "variant" + column: "ALT" + on_missing: stop + function: "minimize_mutation" + args: + return_value: "ref" + on_missing: stop + + Tumor_Validation_Allele1: # Validation not implemented. All fields are empty + input: + - set: "constant" + column: "Tumor_Validation_Allele1" + on_missing: default + default: "" + + Tumor_Validation_Allele2: # Validation not implemented. All fields are empty + input: + - set: "constant" + column: "Tumor_Validation_Allele2" + on_missing: default + default: "" + + Match_Norm_Validation_Allele1: # Validation not implemented. All fields are empty + input: + - set: "constant" + column: "Match_Norm_Validation_Allele1" + on_missing: default + default: "" + + Match_Norm_Validation_Allele2: # Validation not implemented. All fields are empty + input: + - set: "constant" + column: "Match_Norm_Validation_Allele1" + on_missing: default + default: "" + + Verification_Status: + input: + - set: "constant" + column: "Verification_Status" + on_missing: default + default: "Unknown" + + Validation_Status: + input: + - set: "constant" + column: "Validation_Status" + on_missing: default + default: "Unknown" + + Mutation_Status: + input: + - set: "constant" + column: "Mutation_Status" + on_missing: default + default: "Somatic" + + Sequencing_Phase: + input: + - set: "constant" + column: "Sequencing_Phase" + on_missing: default + default: "Unknown" + + Sequence_Source: + input: + - set: "constant" + column: "Sequence_Source" + on_missing: default + default: "Unknown" + + Validation_Method: + input: + - set: "constant" + column: "Validation_Method" + on_missing: default + default: "Unknown" + + Score: + input: + - set: "constant" + column: "Score" + on_missing: default + default: "" + + BAM_File: + input: + - set: "constant" + column: "BAM_File" + on_missing: default + default: "" + + Sequencer: + input: + - set: "constant" + column: "Sequencer" + on_missing: default + default: "" + + Tumor_Sample_UUID: + input: + - set: "constant" + column: "Tumor_Sample_UUID" + on_missing: default + default: "" + + Matched_Norm_Sample_UUID: + input: + - set: "constant" + column: "Matched_Norm_Sample_UUID" + on_missing: default + default: "" + + # Start of supplementary columns not defined in ----------------------------------------------- + # https://docs.gdc.cancer.gov/Encyclopedia/pages/Mutation_Annotation_Format_TCGAv2/ ----------- + + # The columns belows are all defined in ------------------------------------------------------- + # https://docs.gdc.cancer.gov/Data/File_Formats/MAF_Format/#notes-about-gdc-maf-implementation + # Note that some columns are commented out, and will not be part of the output. --------------- + + HGVSc: + input: + - set: "annotation" + column: "HGVS.c" + on_missing: default + default: "" + + HGVSp: + input: + - set: "annotation" + column: "HGVS.p" + on_missing: default + default: "" + + HGVSp_Short: # Short version of the protein mutation defined in + input: # VEP annotation column "HGVSp" + - set: "annotation" + column: "HGVS.p" # The function "parse_protein_mutation" removed the + function: "parse_protein_mutation" # sequence identifier, and replaces 3-letter amino-acid codes + args: # with single letter amino-acid codes. + add_sequence: False # The arguments "add_sequence", "want_short" & "want_long" + want_short: True # allow the user to change this behaviour. + want_long: False + on_missing: skip + # default: "" + + Transcript_ID: + input: + - set: "annotation" + column: "Feature_ID" + on_missing: default + default: "" + + Exon_Number: # VEP annotates the exon number & the total number of exons in the transcript. + input: # It is unclear what the MAF documentation requires. + - set: "annotation" + column: "EXON" + on_missing: default + default: "" + + t_depth: # Read depth in the tumor sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "tumor" + column: "DP" + on_missing: default + default: "" + + t_ref_count: # Reference allele read counts in the tumor sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "tumor" + column: "AD[REF]" + on_missing: default + default: "" + + t_alt_count: # Alternative allele read counts in the tumor sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "tumor" + column: "AD[0]" + on_missing: default + default: "" + + n_depth: # Read depth in the normal sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "normal" + column: "DP" + on_missing: default + default: "" + + n_ref_count: # Reference allele read counts in the normal sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "normal" + column: "AD[REF]" + on_missing: default + default: "" + + n_alt_count: # Alternative allele read counts in the normal sample. + input: # The VCF "FORMAT" fields are those used by "Mutect2" + - set: "format" + sample: "normal" + column: "AD[0]" + on_missing: default + default: "" + + Protein_Position: + input: + - set: "annotation" + column: "Protein_position" + on_missing: default + default: "" diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py index 9b60c721e..2d0baaa31 100644 --- a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py @@ -212,15 +212,15 @@ def _build_protein_pattern(): + "(" + "|".join( [ - "0", # No group, but seq in 2 - substitution, # 3: ref, 4: position, 5: alt - duplication, # 6: start, 7: start pos, 9: end, 10: end pos - deletion, # 11: start, 12: start pos, 14: end, 15: end pos - insertion, # 16: start, 17: start pos, 18: end, 19: end pos (=start pos + 1), 20+22: insertion - delins, # 23: start, 24: start pos, 26: end, 27: end pos, 28+30: insertion - frameshift, # 31: start, 33: start pos, 33: end, 35: ter pos - extensionN, # 37: pos (negative number) - extensionC, # 39: pos, 40: alt, 42: ter pos + "(0|=|\?)", # noqa: W605 + substitution, # 4: ref, 5: position, 6: alt + duplication, # 7: start, 8: start pos, 10: end, 11: end pos + deletion, # 12: start, 13: start pos, 15: end, 16: end pos + insertion, # 17: start, 18: start pos, 19: end, 20: end pos (=start pos + 1), 21+23: insertion + delins, # 24: start, 25: start pos, 27: end, 28: end pos, 29+31: insertion + frameshift, # 32: start, 34: start pos, 34: end, 36: ter pos + extensionN, # 38: pos (negative number) + extensionC, # 40: pos, 41: alt, 43: ter pos ] ) + ")" @@ -285,80 +285,98 @@ def _one_or_interval(groups, i0, want_short=True, want_long=False): def _parse_mutation_groups(groups, want_short=True, want_long=False): - if groups[2] == "0": - rslt = "0" + iGroup = 3 + if groups[iGroup] and groups[iGroup] in ("0", "=", "?"): + return groups[iGroup] + iGroup += 1 - elif groups[3] is not None: + if groups[iGroup] is not None: # Substitutions - rslt = ( - _aa(groups[3], want_short=want_short, want_long=want_long) - + groups[4] - + _aa(groups[5], want_short=want_short, want_long=want_long) + # print("DEBUG- substitution: groups = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(4, 7)]))) + return ( + _aa(groups[iGroup], want_short=want_short, want_long=want_long) + + groups[iGroup + 1] + + _aa(groups[iGroup + 2], want_short=want_short, want_long=want_long) ) - # print("DEBUG- substitution: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(3, 6)]), rslt)) + iGroup += 3 - elif groups[6] is not None: + if groups[iGroup] is not None: # Duplications - rslt = _one_or_interval(groups, 6, want_short=want_short, want_long=want_long) + "dup" - # print("DEBUG- duplication: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(6, 11)]), rslt)) + # print("DEBUG- duplication: groups = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(8, 12)]))) + return _one_or_interval(groups, iGroup, want_short=want_short, want_long=want_long) + "dup" + iGroup += 5 - elif groups[11] is not None: + if groups[iGroup] is not None: # Deletions - rslt = _one_or_interval(groups, 11, want_short=want_short, want_long=want_long) + "del" - # print("DEBUG- deletion: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(11, 16)]), rslt)) + # print("DEBUG- deletion: groups = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(12, 17)]))) + return _one_or_interval(groups, iGroup, want_short=want_short, want_long=want_long) + "del" + iGroup += 5 - elif groups[16] is not None: + if groups[iGroup] is not None: # Insertions - is_long = _is_long(groups[16]) - rslt = ( - _interval(groups, 16, want_short=want_short, want_long=want_long) + # print("DEBUG- insertion: groups = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(17, 24)]))) + is_long = _is_long(groups[iGroup]) + return ( + _interval(groups, iGroup, want_short=want_short, want_long=want_long) + "ins" - + _many_aas(groups[20], want_short=want_short, want_long=want_long, is_long=is_long) - + _aa(groups[22], want_short=want_short, want_long=want_long) + + _many_aas( + groups[iGroup + 4], want_short=want_short, want_long=want_long, is_long=is_long + ) + + _aa(groups[iGroup + 6], want_short=want_short, want_long=want_long) ) - # print("DEBUG- insertion: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(16, 23)]), rslt)) + iGroup += 7 - elif groups[23] is not None: + if groups[iGroup] is not None: # Deletion-insertions - is_long = _is_long(groups[23]) - rslt = ( - _one_or_interval(groups, 23, want_short=want_short, want_long=want_long) + # print("DEBUG- delins: groups = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(24, 32)]))) + is_long = _is_long(groups[iGroup]) + return ( + _one_or_interval(groups, iGroup, want_short=want_short, want_long=want_long) + "delins" - + _many_aas(groups[28], want_short=want_short, want_long=want_long, is_long=is_long) - + _aa(groups[30], want_short=want_short, want_long=want_long) + + _many_aas( + groups[iGroup + 5], want_short=want_short, want_long=want_long, is_long=is_long + ) + + _aa(groups[iGroup + 7], want_short=want_short, want_long=want_long) ) - # print("DEBUG- delins: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(23, 31)]), rslt)) + iGroup += 8 - elif groups[31] is not None: + if groups[iGroup] is not None: # Frameshift - rslt = ( - _aa(groups[31], want_short=want_short, want_long=want_long) - + groups[32] - + _aa(groups[33], want_short=want_short, want_long=want_long) + # print("DEBUG- frameshift: groups = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(32, 37)]))) + return ( + _aa(groups[iGroup], want_short=want_short, want_long=want_long) + + groups[iGroup + 1] + + _aa(groups[iGroup + 2], want_short=want_short, want_long=want_long) + "fs" - + _aa(groups[34], want_short=want_short, want_long=want_long) - + groups[35] + + _aa(groups[iGroup + 3], want_short=want_short, want_long=want_long) + + groups[iGroup + 4] ) - # print("DEBUG- frameshift: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(31, 36)]), rslt)) + iGroup += 5 - elif groups[36] is not None: + if groups[iGroup] is not None: # Extension N terminus - rslt = _aa(groups[36], want_short=want_short, want_long=want_long) + "1ext" + groups[37] - # print("DEBUG- extension N: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(36, 38)]), rslt)) + # print("DEBUG- extension N: groups = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(37, 39)]))) + return ( + _aa(groups[iGroup], want_short=want_short, want_long=want_long) + + "1ext" + + groups[iGroup + 1] + ) + iGroup += 3 - elif groups[38] is not None: + if groups[iGroup] is not None: # Extension C terminus - rslt = ( - _aa(groups[38], want_short=want_short, want_long=want_long) - + groups[39] - + _aa(groups[40], want_short=want_short, want_long=want_long) + # print("DEBUG- extension C: groups = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(39, 44)]))) + return ( + _aa(groups[iGroup], want_short=want_short, want_long=want_long) + + groups[iGroup + 1] + + _aa(groups[iGroup + 2], want_short=want_short, want_long=want_long) + "ext" - + _aa(groups[41], want_short=want_short, want_long=want_long) - + groups[42] + + _aa(groups[iGroup + 3], want_short=want_short, want_long=want_long) + + groups[iGroup + 4] ) - # print("DEBUG- extension C: groups = {}, rslt = {}".format(", ".join(["{}={}".format(i, groups[i]) for i in range(38, 43)]), rslt)) + iGroup += 5 - return rslt + return "" def _parse_one_mutation(mut, want_short=True, want_long=False, add_sequence=False): diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/variant_classification.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/variant_classification.py index 7d279c98e..62bf85891 100644 --- a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/variant_classification.py +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/variant_classification.py @@ -60,10 +60,42 @@ ("feature_elongation", "Targeted_Region"), ("feature_truncation", "Targeted_Region"), ) -variant_classes_all = variant_classes_vcftomaf + variant_classes_vep109 +variant_classes_vep = variant_classes_vcftomaf + variant_classes_vep109 + +variant_classes_jannovar = ( + ("3_prime_UTR_exon_variant", "3'UTR"), + ("3_prime_UTR_intron_variant", "3'UTR"), + ("5_prime_UTR_exon_variant", "5'UTR"), + ("5_prime_UTR_intron_variant", "5'UTR"), + ("coding_transcript_intron_variant", "Intron"), + ("complex_substitution", "Targeted_Region"), + ("direct_tandem_duplication", "In_Frame_Ins"), + ("disruptive_inframe_deletion", "Frame_Shift_Del"), + ("disruptive_inframe_insertion", "Frame_Shift_Ins"), + ("downstream_gene_variant", "3'Flank"), + ("frameshift_elongation", "Frame_Shift_Ins"), + ("frameshift_truncation", "Frame_Shift_Del"), + # + ("inframe_deletion", "In_Frame_Del"), + ("inframe_insertion", "In_Frame_Ins"), + ("intergenic_variant", "IGR"), + ("missense_variant", "Missense_Mutation"), + ("mnv", "Missense_Mutation"), + ("non_coding_transcript_exon_variant", "RNA"), + ("non_coding_transcript_intron_variant", "RNA"), + ("splice_acceptor_variant", "Splice_Region"), + ("splice_donor_variant", "Splice_Region"), + ("splice_region_variant", "Splice_Region"), + ("start_lost", "Translation_Start_Site"), + ("stop_gained", "Nonsense_Mutation"), + ("stop_lost", "Nonstop_Mutation"), + ("stop_retained_variant", "Silent"), + ("synonymous_variant", "Silent"), + ("upstream_gene_variant", "5'Flank"), +) -def variant_classification(x, args=None): +def variant_classification_vep(x, args=None): if x is None: return None assert isinstance(x, list) and len(x) == 4 @@ -93,7 +125,7 @@ def variant_classification(x, args=None): inFrame = (abs(len(ref) - len(alt)) % 3) == 0 found = False - for (k, v) in variant_classes_all: + for (k, v) in variant_classes_vep: if ensembl == k: tcga.append(v) found = True @@ -123,3 +155,43 @@ def variant_classification(x, args=None): tcga.append("Targeted_Region") return tcga + + +def variant_classification_jannovar(x, args=None): + if x is None: + return None + assert isinstance(x, list) and len(x) == 3 + if x[0] is None: + return None + assert isinstance(x[0], list) and len(x[0]) > 0 + assert isinstance(x[1], list) and len(x[1]) == len(x[0]) + assert isinstance(x[2], list) and len(x[2]) == len(x[0]) + tcga = list() + for i in range(len(x[0])): + jannovar = x[0][i] + if jannovar is None: + tcga.append(None) + continue + jannovar = jannovar.split("&")[0] + ref = x[1][i].replace("-", "") + alt = x[2][i].replace("-", "") + indel = "insertion" if len(ref) < len(alt) else "deletion" + # inFrame = (abs(len(ref) - len(alt)) % 3) == 0 + + found = False + for (k, v) in variant_classes_jannovar: + if jannovar == k: + tcga.append(v) + found = True + break + if found: + continue + + if indel == "deletion" and jannovar == "frameshift_variant": + tcga.append("Frame_Shift_Del") + elif indel == "insertion" and jannovar == "frameshift_variant": + tcga.append("Frame_Shift_Ins") + else: + tcga.append("Targeted_Region") + + return tcga diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/config.yaml b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/vep.yaml similarity index 99% rename from snappy_wrappers/wrappers/vcf2maf/vcf_to_table/config.yaml rename to snappy_wrappers/wrappers/vcf2maf/vcf_to_table/vep.yaml index f442a1e04..d22820b89 100644 --- a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/config.yaml +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/vep.yaml @@ -93,7 +93,7 @@ output: # Output columns definitio column: "REF" - set: "variant" # Note that a simple mapping was not possible, because the algorithm requires column: "ALT" # the knowledge of substitution, insertion or deletion to assign some values. - function: "variant_classification" + function: "variant_classification_vep" on_missing: default default: "" diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py index d48c77bae..620514f32 100644 --- a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py @@ -10,7 +10,16 @@ config = snakemake.config["step_config"][step] vcf_to_table = os.path.join(os.path.dirname(os.path.realpath(__file__)), "vcf_to_table.py") -vcf_to_table_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "config.yaml") +if config["somatic_variant_annotation_tool"] == "vep": + vcf_to_table_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "vep.yaml") +elif config["somatic_variant_annotation_tool"] == "jannovar_annotate_somatic_vcf": + vcf_to_table_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "jannovar.yaml") +else: + raise Exception( + "vcf to maf conversion error: unimplemented conversion from annotation tool {}".format( + config["somatic_variant_annotation_tool"] + ) + ) params = snakemake.params.args diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_calling.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_calling.py index 6795e9e7b..d13bd9284 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_calling.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_calling.py @@ -139,8 +139,8 @@ def test_mutect_step_part_get_output_files(somatic_variant_calling_workflow): "vcf_md5": base_name_out + ".vcf.gz.md5", "full_vcf_tbi": base_name_out + ".full.vcf.gz.tbi", "full_vcf_tbi_md5": base_name_out + ".full.vcf.gz.tbi.md5", - "full": base_name_out + ".full.vcf.gz", - "full_md5": base_name_out + ".full.vcf.gz.md5", + "full_vcf": base_name_out + ".full.vcf.gz", + "full_vcf_md5": base_name_out + ".full.vcf.gz.md5", "txt": base_name_out + ".txt", "txt_md5": base_name_out + ".txt.md5", "wig": base_name_out + ".wig", @@ -282,8 +282,8 @@ def test_mutect2_step_part_get_output_files_filter( """Tests Mutect2StepPart.get_output_files() - filter""" # Define expected expected = { - "full": mutect2_output_base_name + ".full.vcf.gz", - "full_md5": mutect2_output_base_name + ".full.vcf.gz.md5", + "full_vcf": mutect2_output_base_name + ".full.vcf.gz", + "full_vcf_md5": mutect2_output_base_name + ".full.vcf.gz.md5", "full_vcf_tbi": mutect2_output_base_name + ".full.vcf.gz.tbi", "full_vcf_tbi_md5": mutect2_output_base_name + ".full.vcf.gz.tbi.md5", "vcf": mutect2_output_base_name + ".vcf.gz", @@ -562,8 +562,8 @@ def test_strelka2_step_part_get_output_files(somatic_variant_calling_workflow): "vcf_md5": base_name_out + ".vcf.gz.md5", "vcf_tbi": base_name_out + ".vcf.gz.tbi", "vcf_tbi_md5": base_name_out + ".vcf.gz.tbi.md5", - "full": base_name_out + ".full.vcf.gz", - "full_md5": base_name_out + ".full.vcf.gz.md5", + "full_vcf": base_name_out + ".full.vcf.gz", + "full_vcf_md5": base_name_out + ".full.vcf.gz.md5", "full_vcf_tbi": base_name_out + ".full.vcf.gz.tbi", "full_vcf_tbi_md5": base_name_out + ".full.vcf.gz.tbi.md5", "stats": base_name_out + ".tsv", From 18217bc72a36b2a7dc35cecf2cc3a2d07456f836 Mon Sep 17 00:00:00 2001 From: ericblanc20 Date: Tue, 22 Aug 2023 08:57:52 +0200 Subject: [PATCH 08/19] feat: Somatic cnv checking (#426) Co-authored-by: Eric Blanc --- snappy_pipeline/apps/snappy_snake.py | 2 + .../workflows/somatic_cnv_checking/Snakefile | 129 ++++++ .../somatic_cnv_checking/__init__.py | 408 ++++++++++++++++++ .../__init__.py | 11 +- .../heterozygous_variants/environment.yaml | 1 + .../bcftools/heterozygous_variants/wrapper.py | 65 +++ .../bcftools/pileups/environment.yaml | 1 + .../wrappers/bcftools/pileups/wrapper.py | 57 +++ .../cnvkit/postprocess/environment.yaml | 1 + .../wrappers/cnvkit/postprocess/wrapper.py | 17 +- .../somatic_cnv_checking/cnv-check-plot.R | 118 +++++ .../somatic_cnv_checking/environment.yaml | 9 + .../wrappers/somatic_cnv_checking/wrapper.py | 96 +++++ .../wrappers/vcfpy/add_bed/environment.yaml | 8 + .../wrappers/vcfpy/add_bed/wrapper.py | 243 +++++++++++ .../test_workflows_somatic_cnv_checking.py | 297 +++++++++++++ ...kflows_somatic_targeted_seq_cnv_calling.py | 13 +- 17 files changed, 1467 insertions(+), 9 deletions(-) create mode 100644 snappy_pipeline/workflows/somatic_cnv_checking/Snakefile create mode 100644 snappy_pipeline/workflows/somatic_cnv_checking/__init__.py create mode 120000 snappy_wrappers/wrappers/bcftools/heterozygous_variants/environment.yaml create mode 100644 snappy_wrappers/wrappers/bcftools/heterozygous_variants/wrapper.py create mode 120000 snappy_wrappers/wrappers/bcftools/pileups/environment.yaml create mode 100644 snappy_wrappers/wrappers/bcftools/pileups/wrapper.py create mode 100644 snappy_wrappers/wrappers/somatic_cnv_checking/cnv-check-plot.R create mode 100644 snappy_wrappers/wrappers/somatic_cnv_checking/environment.yaml create mode 100644 snappy_wrappers/wrappers/somatic_cnv_checking/wrapper.py create mode 100644 snappy_wrappers/wrappers/vcfpy/add_bed/environment.yaml create mode 100644 snappy_wrappers/wrappers/vcfpy/add_bed/wrapper.py create mode 100644 tests/snappy_pipeline/workflows/test_workflows_somatic_cnv_checking.py diff --git a/snappy_pipeline/apps/snappy_snake.py b/snappy_pipeline/apps/snappy_snake.py index c47f50b94..6948b0682 100644 --- a/snappy_pipeline/apps/snappy_snake.py +++ b/snappy_pipeline/apps/snappy_snake.py @@ -31,6 +31,7 @@ ngs_sanity_checking, panel_of_normals, repeat_expansion, + somatic_cnv_checking, somatic_gene_fusion_calling, somatic_hla_loh_calling, somatic_msi_calling, @@ -86,6 +87,7 @@ "panel_of_normals": panel_of_normals, "repeat_analysis": repeat_expansion, "ngs_sanity_checking": ngs_sanity_checking, + "somatic_cnv_checking": somatic_cnv_checking, "somatic_gene_fusion_calling": somatic_gene_fusion_calling, "somatic_hla_loh_calling": somatic_hla_loh_calling, "somatic_msi_calling": somatic_msi_calling, diff --git a/snappy_pipeline/workflows/somatic_cnv_checking/Snakefile b/snappy_pipeline/workflows/somatic_cnv_checking/Snakefile new file mode 100644 index 000000000..f670a39a4 --- /dev/null +++ b/snappy_pipeline/workflows/somatic_cnv_checking/Snakefile @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- +"""CUBI Pipeline somatic_cnv_checking step Snakefile""" + +import os + +from snappy_pipeline import expand_ref +from snappy_pipeline.workflows.somatic_cnv_checking import SomaticCnvCheckingWorkflow + +__author__ = "Eric Blanc " + +# Configuration =============================================================== + + +configfile: "config.yaml" + + +# Expand "$ref" JSON pointers in configuration (also works for YAML) +config, lookup_paths, config_paths = expand_ref("config.yaml", config) + +# WorkflowImpl Object Setup =================================================== + +wf = SomaticCnvCheckingWorkflow(workflow, config, lookup_paths, config_paths, os.getcwd()) + +# Rules ======================================================================= + + +localrules: + # Linking files from work/ to output/ should be done locally + somatic_cnv_checking_link_out_run, + + +rule all: + input: + wf.get_result_files(), + + +# House-Keeping ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Generic linking out --------------------------------------------------------- + + +rule somatic_cnv_checking_link_out_run: + input: + wf.get_input_files("link_out", "run"), + output: + wf.get_output_files("link_out", "run"), + run: + shell(wf.get_shell_cmd("link_out", "run", wildcards)) + + +# Somatic CNV Checking ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Run pileup to identify heterozygous variants in normal sample --------------- + + +rule somatic_cnv_checking_pileup_normal: + input: + unpack(wf.get_input_files("pileup", "normal")), + output: + **wf.get_output_files("pileup", "normal"), + threads: wf.get_resource("pileup", "normal", "threads") + resources: + time=wf.get_resource("pileup", "normal", "time"), + memory=wf.get_resource("pileup", "normal", "memory"), + partition=wf.get_resource("pileup", "normal", "partition"), + tmpdir=wf.get_resource("pileup", "normal", "tmpdir"), + log: + **wf.get_log_file("pileup", "normal"), + wrapper: + wf.wrapper_path("bcftools/heterozygous_variants") + + +# Run pileup to add read counts in the tumor sample --------------------------- + + +rule somatic_cnv_checking_pileup_tumor: + input: + unpack(wf.get_input_files("pileup", "tumor")), + output: + **wf.get_output_files("pileup", "tumor"), + threads: wf.get_resource("pileup", "tumor", "threads") + resources: + time=wf.get_resource("pileup", "tumor", "time"), + memory=wf.get_resource("pileup", "tumor", "memory"), + partition=wf.get_resource("pileup", "tumor", "partition"), + tmpdir=wf.get_resource("pileup", "tumor", "tmpdir"), + log: + **wf.get_log_file("pileup", "tumor"), + wrapper: + wf.wrapper_path("bcftools/pileups") + + +# Add CNV status at the locii ------------------------------------------------- + +if config["step_config"]["somatic_cnv_checking"]["path_cnv_calling"]: + + rule somatic_cnv_checking_cnv_run: + input: + unpack(wf.get_input_files("cnv", "run")), + output: + **wf.get_output_files("cnv", "run"), + threads: wf.get_resource("cnv", "run", "threads") + resources: + time=wf.get_resource("cnv", "run", "time"), + memory=wf.get_resource("cnv", "run", "memory"), + partition=wf.get_resource("cnv", "run", "partition"), + tmpdir=wf.get_resource("cnv", "run", "tmpdir"), + log: + **wf.get_log_file("cnv", "run"), + wrapper: + wf.wrapper_path("vcfpy/add_bed") + + # Generate report & plots ----------------------------------------------------- + + rule somatic_cnv_checking_cnv_report: + input: + unpack(wf.get_input_files("report", "run")), + output: + **wf.get_output_files("report", "run"), + threads: wf.get_resource("report", "run", "threads") + resources: + time=wf.get_resource("report", "run", "time"), + memory=wf.get_resource("report", "run", "memory"), + partition=wf.get_resource("report", "run", "partition"), + tmpdir=wf.get_resource("report", "run", "tmpdir"), + log: + **wf.get_log_file("report", "run"), + wrapper: + wf.wrapper_path("somatic_cnv_checking") diff --git a/snappy_pipeline/workflows/somatic_cnv_checking/__init__.py b/snappy_pipeline/workflows/somatic_cnv_checking/__init__.py new file mode 100644 index 000000000..f5781c417 --- /dev/null +++ b/snappy_pipeline/workflows/somatic_cnv_checking/__init__.py @@ -0,0 +1,408 @@ +# -*- coding: utf-8 -*- +"""Implementation of the ``somatic_cnv_checking`` step + +The ``somatic_cnv_checking`` step takes as the input the results of the ``ngs_mapping`` step +(aligned reads in BAM format) and performs pileups at germline locii to identify heterozygous +variants, and their B-allele frequency in the paired tumor sample. If one somatic CNV calling step +(either ``somatic_wgs_cnv_calling`` or ``somatic_targetd_seq_cnv_calling``) is present, the +log2 convarage ratio and copy number call are added to the output vcf. + +========== +Step Input +========== + +The somatic CNV checking step uses Snakemake sub workflows for using the result of the +``ngs_mapping`` step. Optionally, it can also use one Snakemake sub workflows for somatic CNV +calling, either``somatic_wgs_cnv_calling`` or ``somatic_targetd_seq_cnv_calling``. + +=========== +Step Output +=========== + +For each tumor DNA NGS library with name ``lib_name``/key ``lib_pk`` and each read mapper +``mapper`` that the library has been aligned with, and the CNV caller ``caller``, the +pipeline step will create a directory ``output/{mapper}.{caller}.{lib_name}-{lib_pk}/out`` +with symlinks of the following names to the resulting VCF, TBI, and MD5 files. + +- ``{mapper}.{var_caller}.{lib_name}-{lib_pk}.vcf.gz`` +- ``{mapper}.{var_caller}.{lib_name}-{lib_pk}.vcf.gz.tbi`` +- ``{mapper}.{var_caller}.{lib_name}-{lib_pk}.vcf.gz.md5`` +- ``{mapper}.{var_caller}.{lib_name}-{lib_pk}.vcf.gz.tbi.md5`` + +For example, it might look as follows for the example from above: + +:: + + output/ + +-- bwa.cnvkit.P001-T1-DNA1-WES1-4 + | `-- out + | |-- bwa.cnvkit.P001-T1-DNA1-WES1-4.vcf.gz + | |-- bwa.cnvkit.P001-T1-DNA1-WES1-4.vcf.gz.tbi + | |-- bwa.cnvkit.P001-T1-DNA1-WES1-4.vcf.gz.md5 + | `-- bwa.cnvkit.P001-T1-DNA1-WES1-4.vcf.gz.tbi.md5 + [...] + +===================== +Default Configuration +===================== + +The default configuration is as follows. + +.. include:: DEFAULT_CONFIG_somatic_cnv_checking.rst + +======= +Reports +======= + +Currently, no reports are generated. +""" + +import os +import sys + +from biomedsheets.shortcuts import CancerCaseSheet, CancerCaseSheetOptions, is_not_background +from snakemake.io import expand + +from snappy_pipeline.base import InvalidConfiguration +from snappy_pipeline.utils import dictify, listify +from snappy_pipeline.workflows.abstract import ( + BaseStep, + BaseStepPart, + LinkOutStepPart, + ResourceUsage, +) +from snappy_pipeline.workflows.ngs_mapping import NgsMappingWorkflow +from snappy_pipeline.workflows.somatic_targeted_seq_cnv_calling import ( + SomaticTargetedSeqCnvCallingWorkflow, +) +from snappy_pipeline.workflows.somatic_wgs_cnv_calling import SomaticWgsCnvCallingWorkflow + +__author__ = "Eric Blanc " + +#: Extensions of files to create as main payload +EXT_VALUES = (".vcf.gz", ".vcf.gz.tbi", ".vcf.gz.md5", ".vcf.gz.tbi.md5") + +#: Names of the files to create for the extension +EXT_NAMES = ("vcf", "vcf_tbi", "vcf_md5", "vcf_tbi_md5") + +#: Default configuration for the somatic_cnv_checking schema +DEFAULT_CONFIG = r""" +# Default configuration somatic_cnv_checking +step_config: + somatic_cnv_checking: + path_ngs_mapping: ../ngs_mapping # REQUIRED + path_cnv_calling: "" # Can use for instance ../somatic_targeted_seq_cnv_calling + cnv_assay_type: "" # Empty: no CNV, WES for somatic_targeted_seq_snv_calling step, WGS for somatic_wgs_cnv_calling step + excluded_regions: "" # Bed file of regions to be excluded + max_depth: 10000 # Max depth for pileups + min_depth: 20 # Minimum depth for reference and alternative alleles to consider variant + min_baf: 0.4 # Maximum BAF to consider variant as heterozygous (between 0 & 1/2) +""" + + +class SomaticCnvCheckingStepPart(BaseStepPart): + """Base class for CNV checking sub-steps""" + + @dictify + def _get_log_file(self, prefix): + """Return dict of log files.""" + key_ext = ( + ("log", ".log"), + ("conda_info", ".conda_info.txt"), + ("conda_list", ".conda_list.txt"), + ) + for key, ext in key_ext: + yield key, prefix + ext + yield key + "_md5", prefix + ext + ".md5" + + +class SomaticCnvCheckingPileupStepPart(SomaticCnvCheckingStepPart): + """Perform pileups at a set of locations""" + + name = "pileup" + actions = ("normal", "tumor") + + def __init__(self, parent): + super().__init__(parent) + self.ngs_mapping = self.parent.sub_workflows["ngs_mapping"] + + def get_input_files(self, action): + # Validate action + self._validate_action(action) + + def input_function_normal(wildcards): + base_path = "output/{mapper}.{library_name}/out/{mapper}.{library_name}".format( + **wildcards + ) + return { + "bam": self.ngs_mapping(base_path + ".bam"), + "bai": self.ngs_mapping(base_path + ".bam.bai"), + } + + def input_function_tumor(wildcards): + base_path = "output/{mapper}.{library_name}/out/{mapper}.{library_name}".format( + **wildcards + ) + return { + "locii": "work/{mapper}.{normal_library}/out/{mapper}.{normal_library}.normal.vcf.gz".format( + normal_library=self.parent.tumor_to_normal[wildcards.library_name], **wildcards + ), + "locii_tbi": "work/{mapper}.{normal_library}/out/{mapper}.{normal_library}.normal.vcf.gz.tbi".format( + normal_library=self.parent.tumor_to_normal[wildcards.library_name], **wildcards + ), + "bam": self.ngs_mapping(base_path + ".bam"), + "bai": self.ngs_mapping(base_path + ".bam.bai"), + } + + if action == "normal": + return input_function_normal + else: + return input_function_tumor + + def get_output_files(self, action): + """Return output files that all somatic variant calling sub steps must + return (VCF + TBI file) + """ + # Validate action + self._validate_action(action) + base_path_out = ( + "work/{{mapper}}.{{library_name}}/out/{{mapper}}.{{library_name}}.{action}{ext}" + ) + return dict(zip(EXT_NAMES, expand(base_path_out, action=action, ext=EXT_VALUES))) + + def get_log_file(self, action): + # Validate action + self._validate_action(action) + return self._get_log_file( + "work/{mapper}.{library_name}/log/{mapper}.{library_name}." + action + ) + + def get_resource_usage(self, action): + # Validate action + self._validate_action(action) + return ResourceUsage( + threads=2, + time="01:00:00" if action == "tumor" else "12:00:00", # 1 hour + memory=f"{int(3.7 * 1024 * 2)}M", + ) + + +class SomaticCnvCheckingCnvStepPart(SomaticCnvCheckingStepPart): + """Merging heterozygous variants with CNV data""" + + name = "cnv" + actions = ("run",) + + def get_input_files(self, action): + # Validate action + self._validate_action(action) + + def input_function(wildcards): + normal_library = self.parent.tumor_to_normal[wildcards.library_name] + filenames = {} + name_pattern = "{mapper}.{normal_library}" + tpl = os.path.join("work", name_pattern, "out", name_pattern + ".normal.vcf.gz") + filenames["normal"] = tpl.format(normal_library=normal_library, **wildcards) + filenames["normal_tbi"] = filenames["normal"] + ".tbi" + name_pattern = "{mapper}.{library_name}" + tpl = os.path.join("work", name_pattern, "out", name_pattern + ".tumor.vcf.gz") + filenames["tumor"] = tpl.format(**wildcards) + filenames["tumor_tbi"] = filenames["tumor"] + ".tbi" + cnv_calling = self.parent.sub_workflows["cnv_calling"] + base_path = "output/{mapper}.{caller}.{library_name}/out/{mapper}.{caller}.{library_name}".format( + **wildcards + ) + filenames["cnv"] = cnv_calling(base_path + ".bed.gz") + filenames["cnv_tbi"] = filenames["cnv"] + ".tbi" + return filenames + + return input_function + + @dictify + def get_output_files(self, action): + # Validate action + self._validate_action(action) + key_ext = {"vcf": ".vcf.gz", "tbi": ".vcf.gz.tbi"} + name_pattern = "{mapper}.{caller}.{library_name}" + key_ext["tsv"] = ".tsv" + base_path_out = "work/" + name_pattern + "/out/" + name_pattern + for key, ext in key_ext.items(): + yield (key, base_path_out + ext) + yield (key + "_md5", base_path_out + ext + ".md5") + + def get_log_file(self, action): + # Validate action + self._validate_action(action) + name_pattern = "{mapper}.{caller}.{library_name}" + return self._get_log_file(os.path.join("work", name_pattern, "log", name_pattern)) + + +class SomaticCnvCheckingReportStepPart(SomaticCnvCheckingStepPart): + """Plots of BAF vs CNV""" + + name = "report" + actions = ("run",) + + def get_input_files(self, action): + # Validate action + self._validate_action(action) + + def input_function(wildcards): + name_pattern = "{mapper}.{caller}.{library_name}".format(**wildcards) + base_path_out = "work/" + name_pattern + "/out/" + name_pattern + return {"vcf": base_path_out + ".vcf.gz", "tsv": base_path_out + ".tsv"} + + return input_function + + def get_output_files(self, action): + # Validate action + self._validate_action(action) + name_pattern = "{mapper}.{caller}.{library_name}" + base_path_out = "work/" + name_pattern + "/report/" + name_pattern + return { + "cnv": base_path_out + ".cnv.pdf", + "cnv_md5": base_path_out + ".cnv.pdf.md5", + "locus": base_path_out + ".locus.pdf", + "locus_md5": base_path_out + ".locus.pdf.md5", + "segment": base_path_out + ".segment.pdf", + "segment_md5": base_path_out + ".segment.pdf.md5", + } + + def get_log_file(self, action): + # Validate action + self._validate_action(action) + name_pattern = "{mapper}.{caller}.{library_name}" + return self._get_log_file( + os.path.join("work", name_pattern, "log", name_pattern + ".report") + ) + + +class SomaticCnvCheckingWorkflow(BaseStep): + """Perform somatic cnv checking""" + + #: Workflow name + name = "somatic_cnv_checking" + + #: Default biomed sheet class + sheet_shortcut_class = CancerCaseSheet + + sheet_shortcut_kwargs = { + "options": CancerCaseSheetOptions(allow_missing_normal=True, allow_missing_tumor=True) + } + + @classmethod + def default_config_yaml(cls): + """Return default config YAML, to be overwritten by project-specific one""" + return DEFAULT_CONFIG + + def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir): + super().__init__( + workflow, + config, + config_lookup_paths, + config_paths, + workdir, + ( + SomaticTargetedSeqCnvCallingWorkflow, + SomaticWgsCnvCallingWorkflow, + NgsMappingWorkflow, + ), + ) + if self.config["path_cnv_calling"] and self.config["cnv_assay_type"]: + if self.config["cnv_assay_type"] == "WES": + cnv_calling = "somatic_targeted_seq_cnv_calling" + elif self.config["cnv_assay_type"] == "WES": + cnv_calling = "somatic_wgs_cnv_calling" + else: + raise InvalidConfiguration( + "Illegal cnv_assay_type {}, must be either WES or WGS".format( + self.config["cnv_assay_type"] + ) + ) + self.register_sub_workflow(cnv_calling, self.config["path_cnv_calling"], "cnv_calling") + self.register_sub_workflow("ngs_mapping", self.config["path_ngs_mapping"]) + # Register sub step classes so the sub steps are available + self.register_sub_step_classes( + ( + SomaticCnvCheckingPileupStepPart, + SomaticCnvCheckingCnvStepPart, + SomaticCnvCheckingReportStepPart, + LinkOutStepPart, + ) + ) + # Assemble normal/tumor pairs + self.tumor_to_normal = {} + for sheet in filter(is_not_background, self.shortcut_sheets): + for sample_pair in sheet.all_sample_pairs: + if ( + not sample_pair.tumor_sample.dna_ngs_library + or not sample_pair.normal_sample.dna_ngs_library + ): + msg = ( + "INFO: sample pair for cancer bio sample {} has is missing primary" + "normal or primary cancer NGS library" + ) + print(msg.format(sample_pair.tumor_sample.name), file=sys.stderr) + continue + tumor_library = sample_pair.tumor_sample.dna_ngs_library.name + normal_library = sample_pair.normal_sample.dna_ngs_library.name + self.tumor_to_normal[tumor_library] = normal_library + + @listify + def get_result_files(self): + """Return list of result files for the NGS mapping workflow + + We will process all NGS libraries of all bio samples in all sample sheets. + """ + # Log files from normal pileups + name_pattern = "{mapper}.{library_name}" + chksum = ("", ".md5") + ext = ("log", "conda_info.txt", "conda_list.txt") + yield from expand( + os.path.join("output", name_pattern, "log", name_pattern + ".normal.{ext}{chksum}"), + mapper=self.w_config["step_config"]["ngs_mapping"]["tools"]["dna"], + library_name=set(self.tumor_to_normal.values()), + ext=ext, + chksum=chksum, + ) + yield from expand( + os.path.join("output", name_pattern, "log", name_pattern + ".tumor.{ext}{chksum}"), + mapper=self.w_config["step_config"]["ngs_mapping"]["tools"]["dna"], + library_name=self.tumor_to_normal.keys(), + ext=ext, + chksum=chksum, + ) + # Main result: vcf & optionally segment table if CNV available + ext = {"out": [".vcf.gz", ".vcf.gz.tbi"]} + if self.config["path_cnv_calling"]: + # CNV avaliable + name_pattern = "{mapper}.{caller}.{library_name}" + callers = self.w_config["step_config"]["somatic_targeted_seq_cnv_calling"]["tools"] + ext["out"] += [".tsv"] + ext["report"] = (".cnv.pdf", ".locus.pdf", ".segment.pdf") + ext["log"] = [ + suffix + "." + e + for suffix in ("", ".report") + for e in ("log", "conda_info.txt", "conda_list.txt") + ] + else: + name_pattern = "{mapper}.{library_name}" + callers = [] + for subdir, exts in ext.items(): + yield from expand( + os.path.join("output", name_pattern, subdir, name_pattern + "{ext}{chksum}"), + mapper=self.w_config["step_config"]["ngs_mapping"]["tools"]["dna"], + caller=callers, + library_name=self.tumor_to_normal.keys(), + ext=exts, + chksum=chksum, + ) + + def check_config(self): + """Check that the path to the NGS mapping is present""" + self.ensure_w_config( + ("step_config", "somatic_cnv_checking", "path_ngs_mapping"), + "Path to NGS mapping not configured but required for somatic variant calling", + ) + if self.config["path_cnv_calling"]: + assert self.config["cnv_assay_type"] in ("WES", "WGS") diff --git a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py index ddea1c5f7..4f80a78c5 100644 --- a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py +++ b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py @@ -621,8 +621,13 @@ def _get_output_files_call(): @staticmethod def _get_output_files_postprocess(): name_pattern = "{mapper}.cnvkit.{library_name}" - tpl = os.path.join("work", name_pattern, "out", name_pattern + ".cns") - return {"final": tpl, "final_md5": tpl + ".md5"} + tpl = os.path.join("work", name_pattern, "out", name_pattern + ".bed.gz") + return { + "final": tpl, + "final_tbi": tpl + ".tbi", + "final_md5": tpl + ".md5", + "final_tbi_md5": tpl + ".tbi.md5", + } @dictify def _get_output_files_plot(self): @@ -652,7 +657,7 @@ def _get_output_files_plot(self): @staticmethod def _get_output_files_export(): - exports = (("bed", "bed"), ("seg", "seg"), ("vcf", "vcf.gz"), ("tbi", "vcf.gz.tbi")) + exports = (("seg", "seg"), ("vcf", "vcf.gz"), ("tbi", "vcf.gz.tbi")) output_files = {} tpl = ( "work/{{mapper}}.cnvkit.{{library_name}}/out/" diff --git a/snappy_wrappers/wrappers/bcftools/heterozygous_variants/environment.yaml b/snappy_wrappers/wrappers/bcftools/heterozygous_variants/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/bcftools/heterozygous_variants/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/bcftools/heterozygous_variants/wrapper.py b/snappy_wrappers/wrappers/bcftools/heterozygous_variants/wrapper.py new file mode 100644 index 000000000..2d1770494 --- /dev/null +++ b/snappy_wrappers/wrappers/bcftools/heterozygous_variants/wrapper.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +"""Wrapper for finding heterozygous variants with bcftools +""" + +from snakemake.shell import shell + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step] + +if "args" in snakemake.params and "intervals" in snakemake.params["args"]: + locii = "-r " + snakemake.params["args"]["intervals"] +elif "locii" in snakemake.input.keys(): + locii = "-R " + snakemake.input.locii +elif "locii" in config and config["locii"]: + locii = "-R " + config["locii"] +else: + locii = "" + +# Convert minimum B-allele fraction into ratio of alternative to reference alleles +min_ratio = config["min_baf"] / (1 - config["min_baf"]) +max_ratio = 1 / min_ratio + +shell( + r""" +# ----------------------------------------------------------------------------- +# Redirect stderr to log file by default and enable printing executed commands +exec &> >(tee -a "{snakemake.log.log}") +set -x +# ----------------------------------------------------------------------------- +export TMPDIR=$(mktemp -d) +trap "rm -rf $TMPDIR" EXIT + +# Write out information about conda installation +conda list > {snakemake.log.conda_list} +conda info > {snakemake.log.conda_info} + +only_one_variant="N_ALT=2 & FORMAT/AD[:2]=0" +min_depth="FORMAT/AD[:0]>{config[min_depth]} & FORMAT/AD[:1]>{config[min_depth]}" +hetero="{min_ratio}*FORMAT/AD[:0]<=FORMAT/AD[:1] & FORMAT/AD[:1]<={max_ratio}*FORMAT/AD[:0]" + +bcftools mpileup \ + {locii} \ + --max-depth {config[max_depth]} \ + -f {snakemake.config[static_data_config][reference][path]} \ + -a "FORMAT/AD" \ + {snakemake.input.bam} \ + | bcftools filter \ + --include "$only_one_variant & $min_depth & $hetero" \ + -O z -o {snakemake.output.vcf} +tabix {snakemake.output.vcf} + +pushd $(dirname {snakemake.output.vcf}) +md5sum $(basename {snakemake.output.vcf}) > $(basename {snakemake.output.vcf_md5}) +md5sum $(basename {snakemake.output.vcf_tbi}) > $(basename {snakemake.output.vcf_tbi_md5}) +""" +) + +# Compute MD5 sums of logs +shell( + r""" +md5sum {snakemake.log.log} > {snakemake.log.log_md5} +md5sum {snakemake.log.conda_list} > {snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} > {snakemake.log.conda_info_md5} +""" +) diff --git a/snappy_wrappers/wrappers/bcftools/pileups/environment.yaml b/snappy_wrappers/wrappers/bcftools/pileups/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/bcftools/pileups/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/bcftools/pileups/wrapper.py b/snappy_wrappers/wrappers/bcftools/pileups/wrapper.py new file mode 100644 index 000000000..6c70452f2 --- /dev/null +++ b/snappy_wrappers/wrappers/bcftools/pileups/wrapper.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +"""Wrapper for running bcftools mpileup +""" + +from snakemake.shell import shell + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step] + +if "args" in snakemake.params and "intervals" in snakemake.params["args"]: + locii = "-r " + snakemake.params["args"]["intervals"] +elif "locii" in snakemake.input.keys(): + locii = "-R " + snakemake.input.locii +elif "locii" in config and config["locii"]: + locii = "-R " + config["locii"] +else: + locii = "" + +# Actually run the script. +shell( + r""" +# ----------------------------------------------------------------------------- +# Redirect stderr to log file by default and enable printing executed commands +exec &> >(tee -a "{snakemake.log.log}") +set -x +# ----------------------------------------------------------------------------- +export TMPDIR=$(mktemp -d) +trap "rm -rf $TMPDIR" EXIT + +# Write out information about conda installation +conda list > {snakemake.log.conda_list} +conda info > {snakemake.log.conda_info} + +bcftools mpileup \ + {locii} \ + --max-depth {config[max_depth]} \ + -f {snakemake.config[static_data_config][reference][path]} \ + -a "FORMAT/AD" \ + -O z -o {snakemake.output.vcf} \ + {snakemake.input.bam} +tabix {snakemake.output.vcf} + +pushd $(dirname {snakemake.output.vcf}) +md5sum $(basename {snakemake.output.vcf}) > $(basename {snakemake.output.vcf_md5}) +md5sum $(basename {snakemake.output.vcf_tbi}) > $(basename {snakemake.output.vcf_tbi_md5}) +popd +""" +) + +# Compute MD5 sums of logs +shell( + r""" +md5sum {snakemake.log.log} > {snakemake.log.log_md5} +md5sum {snakemake.log.conda_list} > {snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} > {snakemake.log.conda_info_md5} +""" +) diff --git a/snappy_wrappers/wrappers/cnvkit/postprocess/environment.yaml b/snappy_wrappers/wrappers/cnvkit/postprocess/environment.yaml index e936461b1..28ebc9a4e 100644 --- a/snappy_wrappers/wrappers/cnvkit/postprocess/environment.yaml +++ b/snappy_wrappers/wrappers/cnvkit/postprocess/environment.yaml @@ -5,3 +5,4 @@ channels: dependencies: - r-base - bioconductor-genomicranges +- htslib diff --git a/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py b/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py index f79a46585..2b35d730d 100644 --- a/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py +++ b/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py @@ -30,6 +30,8 @@ # ----------------------------------------------------------------------------- +uncompressed=$(echo "{snakemake.output.final}" | sed -e "s/\.gz$//") + cat << _EOF | R --vanilla --slave segments <- read.table("{snakemake.input.segment}", sep="\t", header=1, stringsAsFactors=FALSE) stopifnot(all(c("chromosome", "start", "end") %in% colnames(segments))) @@ -57,19 +59,30 @@ # Default value: diploid segment (number of copies = 2) segments[,"cn"] <- 2 -segments[S4Vectors::queryHits(i),"cn"] <- calls[S4Vectors::subjectHits(i),"cn"] +segments[S4Vectors::queryHits(i),"cn"] <- round(calls[S4Vectors::subjectHits(i),"cn"]) # Reset segment boundaries to original values segments[,"start"] <- segments[["start"]]-1 segments[,"end"] <- segments[["end"]]+1 -write.table(segments, file="{snakemake.output.final}", sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE) +# Create bed file (abusing name, score & strand to make it bed-6 compatible) +segments[,"start"] <- segments[["start"]]-1 # Bed files are 0-based, semi-open intervals +segments[,"name"] <- sprintf("seg_%d_cn_%d", 1:nrow(segments), segments[["cn"]]) +segments[,"score"] <- pmin(1000, abs(segments[["log2"]])) +segments[,"strand"] <- "+" +segments[segments[["log2"]]<0,"strand"] <- "-" + +write.table(segments[,c("chromosome", "start", "end", "name", "score", "strand")], file="$uncompressed", sep="\t", col.names=FALSE, row.names=FALSE, quote=FALSE) _EOF +bgzip $uncompressed +tabix {snakemake.output.final} + d=$(dirname "{snakemake.output.final}") pushd $d fn=$(basename "{snakemake.output.final}") md5sum $fn > $fn.md5 +md5sum $fn.tbi > $fn.tbi.md5 popd """ ) diff --git a/snappy_wrappers/wrappers/somatic_cnv_checking/cnv-check-plot.R b/snappy_wrappers/wrappers/somatic_cnv_checking/cnv-check-plot.R new file mode 100644 index 000000000..f6d54977e --- /dev/null +++ b/snappy_wrappers/wrappers/somatic_cnv_checking/cnv-check-plot.R @@ -0,0 +1,118 @@ +cn_to_call <- function(cn, amplification=7) { + Call <- factor(rep("Neutral", length(cn)), levels=c("Deletion", "Loss", "Neutral", "Gain", "Amplification")) + Call[!is.na(cn) & cn==0] <- "Deletion" + Call[!is.na(cn) & cn==1] <- "Loss" + Call[!is.na(cn) & 2 + dplyr::filter(!is.na(LFC) & !is.na(CN)) |> + dplyr::mutate(BAF=t_alt/(t_ref+t_alt)) |> + dplyr::mutate(Call=cn_to_call(CN)) + x +} + +cnv_to_table <- function(cnv) { + y <- read.table(cnv, sep="\t", header=0) + colnames(y) <- c("CHROM", "start", "stop", "name", "LFC", "strand") + y <- y |> + dplyr::mutate(LFC=replace(LFC, strand == "-", -abs(LFC[strand=="-"]))) |> + dplyr::mutate(start=start + 1) + y +} + +chromosome_lengths <- function(genome, use_fai=TRUE, use_dict=TRUE) { + if (use_fai && file.exists(paste(genome, "fai", sep="."))) { + genome <- read.table(paste(genome, "fai", sep="."), sep="\t", header=0) + colnames(genome) <- c("CHROM", "Length", "index", "ncol", "nbyte") + } else { + if (use_dict && file.exists(paste(genome, "dict", sep="."))) { + pattern <- "^SQ\tSN:([^ \t]+)\tLN:([0-9]+)\t.+$" + genome <- grep(pattern, readLines(paste(genome, "dict", sep=".")), value=TRUE) + genome <- data.frame(CHROM=sub(pattern, "\\1", genome), Length=as.numeric(sub(pattern, "\\2", genome))) + } else { + genome <- Biostrings::readDNAStringSet(genome) + genome <- data.frame(CHROM=names(genome), Length=Biostrings::width(genome)) + } + } + genome <- genome |> + dplyr::mutate(CHROM=sub(" .*", "", CHROM)) |> + dplyr::mutate(Offset=cumsum(as.numeric(dplyr::lag(Length, default=0)))) |> + dplyr::select(CHROM, Length, Offset) + genome +} + +default_call_colors <- c( + "Deletion"="#E41A1C", + "Loss"="#984EA3", + "Neutral"="#4DAF4A", + "Gain"="#80B1D3", + "Amplification"="#377EB8" +) + +plot_cnv <- function(x, scale=c("log2", "sqrt"), call_colors=default_call_colors) { + scale <- match.arg(scale) + if (scale == "sqrt") x_label <- "Segment Fold Change" + else x_label <- "Segment Log2 Fold Change" + if (scale == "sqrt") x <- x |> dplyr::mutate(LFC=2^LFC) + p <- x |> + dplyr::mutate(BAF=pmin(BAF, 1-BAF)) |> + ggplot2::ggplot(ggplot2::aes(x=LFC, y=BAF, color=Call)) + + ggplot2::geom_point() + + ggplot2::labs(x=x_label, y="B-allele fraction") + + ggplot2::scale_color_manual(values=call_colors) + + ggplot2::theme_bw() + if (scale == "sqrt") p <- p + ggplot2::scale_x_sqrt() + p +} + +plot_locus <- function(x, genome_lengths, call_colors=default_call_colors) { + p <- genome_lengths |> + ggplot2::ggplot(ggplot2::aes(xmin=Offset+1, xmax=Offset+Length, ymin=0, ymax=1, fill=as.character(n%%2))) + + ggplot2::geom_rect() + + ggplot2::scale_fill_manual(values=c("white", "grey")) + + ggplot2::scale_x_continuous(breaks=genome_lengths$Offset+genome_lengths$Length/2, labels=genome_lengths$CHROM) + + ggplot2::geom_point(data=x, mapping=ggplot2::aes(x=x, y=BAF, color=Call), inherit.aes=FALSE) + + ggplot2::scale_color_manual(values=call_colors) + + ggplot2::theme_bw() + + ggplot2::theme(axis.text.x=ggplot2::element_text(angle=90, vjust=0.5, hjust=1)) + + ggplot2::guides(fill="none") + + ggplot2::labs(x="Genomic position", y="B-allele fraction") + p +} + +plot_segment <- function(y, genome_lengths, call_colors=default_call_colors) { + p <- genome_lengths |> + ggplot2::ggplot(ggplot2::aes(xmin=Offset+1, xmax=Offset+Length, ymin=0, ymax=0.5, fill=as.character(n%%2))) + + ggplot2::geom_rect() + + ggplot2::scale_fill_manual(values=c("white", "grey")) + + ggplot2::scale_x_continuous(breaks=genome_lengths$Offset+genome_lengths$Length/2, labels=genome_lengths$CHROM) + p <- p + + ggplot2::geom_point(data=y, mapping=ggplot2::aes(x=(from+to)/2, y=Median, color=Call, size=Nvariants), inherit.aes=FALSE) + + ggplot2::geom_segment(data=y, mapping=ggplot2::aes(x=(from+to)/2, y=`1st quartile`, xend=(from+to)/2, yend=`3rd quartile`, color=Call), inherit.aes=FALSE) + + ggplot2::geom_segment(data=y, mapping=ggplot2::aes(x=from, y=Median, xend=to, yend=Median, color=Call), inherit.aes=FALSE) + + ggplot2::scale_color_manual(values=call_colors) + p <- p + + ggplot2::theme_bw() + + ggplot2::theme(axis.text.x=ggplot2::element_text(angle=90, vjust=0.5, hjust=1)) + + ggplot2::guides(fill="none") + + ggplot2::labs(x="Genomic position", y="B-allele fraction") + p +} diff --git a/snappy_wrappers/wrappers/somatic_cnv_checking/environment.yaml b/snappy_wrappers/wrappers/somatic_cnv_checking/environment.yaml new file mode 100644 index 000000000..6421a7e1b --- /dev/null +++ b/snappy_wrappers/wrappers/somatic_cnv_checking/environment.yaml @@ -0,0 +1,9 @@ +channels: +- conda-forge +- bioconda +dependencies: +- r-base +- r-dplyr +- r-ggplot2 +- bioconductor-variantannotation +- bioconductor-biostrings diff --git a/snappy_wrappers/wrappers/somatic_cnv_checking/wrapper.py b/snappy_wrappers/wrappers/somatic_cnv_checking/wrapper.py new file mode 100644 index 000000000..924c194e0 --- /dev/null +++ b/snappy_wrappers/wrappers/somatic_cnv_checking/wrapper.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +"""Wrapper for running CopywriteR""" + +import os + +from snakemake import shell + +__author__ = "Eric Blanc " + +shell.executable("/bin/bash") + +rscript = os.path.join(os.path.dirname(os.path.realpath(__file__)), "cnv-check-plot.R") + +reference = snakemake.config["static_data_config"]["reference"]["path"] + +shell( + r""" +set -x + +export TMPDIR=$(mktemp -d) +# trap "rm -rf $TMPDIR" EXIT + +# Also pipe stderr to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +md5() {{ + filename=$1 + fn=$(basename $filename) + pushd $(dirname $filename) 1> /dev/null 2>&1 + rslt=$(md5sum $fn) + popd 1> /dev/null 2>&1 + echo "$rslt" +}} + +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5 {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5 {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# ------------------------------------------------------------------------------------------------- +# Write helper script and call R +# +R --vanilla --slave << __EOF +source("{rscript}") + +genome_lengths <- chromosome_lengths("{reference}") |> dplyr::mutate(n=dplyr::row_number()) + +x <- vcf_to_table("{snakemake.input.vcf}", sample="{snakemake.wildcards[library_name]}") +x <- x |> dplyr::left_join(genome_lengths, by="CHROM") |> dplyr::mutate(x=POS + Offset) + +y <- read.table("{snakemake.input.tsv}", sep="\t", header=1, check.names=FALSE) +y <- y |> dplyr::mutate(Call=cn_to_call(CN)) +y <- y |> dplyr::left_join(genome_lengths, by="CHROM") |> dplyr::mutate(from=start + Offset, to=stop + Offset) + +pdf("{snakemake.output.cnv}", height=6.22, width=9.33) +plot_cnv(x, scale="log2") + ggplot2::ggtitle("{snakemake.wildcards[library_name]}") +plot_cnv(x, scale="sqrt") + ggplot2::ggtitle("{snakemake.wildcards[library_name]}") +dev.off() + +pdf("{snakemake.output.locus}", height=6.22, width=12.44) +plot_locus(x, genome_lengths |> dplyr::filter(CHROM %in% x[["CHROM"]])) + + ggplot2::ggtitle("{snakemake.wildcards[library_name]}") +dev.off() + +pdf("{snakemake.output.segment}", height=6.22, width=12.44) +plot_segment(y, genome_lengths |> dplyr::filter(CHROM %in% y[["CHROM"]])) +dev.off() +__EOF + +md5 {snakemake.output.cnv} > {snakemake.output.cnv_md5} +md5 {snakemake.output.locus} > {snakemake.output.locus_md5} +md5 {snakemake.output.segment} > {snakemake.output.segment_md5} +""" +) + +shell( + r""" +md5() {{ + filename=$1 + fn=$(basename $filename) + pushd $(dirname $filename) 1> /dev/null 2>&1 + rslt=$(md5sum $fn) + popd 1> /dev/null 2>&1 + echo "$rslt" +}} +md5 {snakemake.log.log} > {snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/vcfpy/add_bed/environment.yaml b/snappy_wrappers/wrappers/vcfpy/add_bed/environment.yaml new file mode 100644 index 000000000..8d0c6415c --- /dev/null +++ b/snappy_wrappers/wrappers/vcfpy/add_bed/environment.yaml @@ -0,0 +1,8 @@ +channels: +- conda-forge +- bioconda +dependencies: +- bcftools +- vcfpy +- pytabix +- htslib diff --git a/snappy_wrappers/wrappers/vcfpy/add_bed/wrapper.py b/snappy_wrappers/wrappers/vcfpy/add_bed/wrapper.py new file mode 100644 index 000000000..d98068a87 --- /dev/null +++ b/snappy_wrappers/wrappers/vcfpy/add_bed/wrapper.py @@ -0,0 +1,243 @@ +import math +import numbers +import re +import subprocess + +from snakemake.shell import shell +import tabix +import vcfpy + +NAME_PATTERN = re.compile("^seg_([0-9]+)_cn_([0-9]+)$") + +LFC = {"ID": "LFC", "Number": 1, "Type": "Float", "Description": "Log2 fold change from coverage"} +CN = { + "ID": "CN", + "Number": 1, + "Type": "Integer", + "Description": "Number of allele called by the CNV caller", +} + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step] + +bed = tabix.open(snakemake.input.cnv) + +ps = [] +nProc = 0 +ps += [ + subprocess.Popen( + ["bcftools", "merge", snakemake.input.normal, snakemake.input.tumor], stdout=subprocess.PIPE + ) +] +nProc += 1 +ps += [ + subprocess.Popen( + ["bcftools", "filter", "--include", "N_ALT=2 & FORMAT/AD[:2]=0"], + stdin=ps[nProc - 1].stdout, + stdout=subprocess.PIPE, + text=True, + ) +] +ps[nProc - 1].stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. +nProc += 1 +if "excluded_regions" in config and config["excluded_regions"]: + ps += [ + subprocess.Popen( + ["bcftools", "view", "--targets-file", "^" + config["excluded_regions"]], + stdin=ps[nProc - 1].stdout, + stdout=subprocess.PIPE, + text=True, + ) + ] + ps[nProc - 1].stdout.close() + nProc += 1 +reader = vcfpy.Reader.from_stream(ps[nProc - 1].stdout) + +sample = snakemake.wildcards["library_name"] +iSample = reader.header.samples.name_to_idx[sample] + +reader.header.add_format_line(LFC) +reader.header.add_format_line(CN) + +writer = vcfpy.Writer.from_path(snakemake.output.vcf, reader.header) + +segments = {} +for variant in reader: + logFoldChange = None + cn = None + + # Add default (missing) values for all samples + variant.add_format("LFC", logFoldChange) + variant.add_format("CN", cn) + + try: + locii = list(bed.query(variant.CHROM, variant.affected_start, variant.affected_end + 1)) + except tabix.TabixError as e: + print( + "Variant {}:{}{}>{} not covered by segmentation of sample {}".format( + variant.CHROM, variant.POS, variant.REF, variant.ALT[0].value, sample + ) + ) + continue + + if len(locii) == 0: + print( + "Variant {}:{}{}>{} not covered by segmentation of sample {}".format( + variant.CHROM, variant.POS, variant.REF, variant.ALT[0].value, sample + ) + ) + elif len(locii) == 1: + for locus in locii: + logFoldChange = float(locus[4]) + if locus[5] == "-": + logFoldChange = -logFoldChange + m = NAME_PATTERN.match(locus[3]) + assert m + cn = int(m.groups()[1]) + else: + print( + "Variant {}:{}{}>{} crosses segments in sample {}".format( + variant.CHROM, variant.POS, variant.REF, variant.ALT[0].value, sample + ) + ) + for locus in locii: + m = NAME_PATTERN.match(locus[3]) + assert m + if cn is None: + cn = int(m.groups()[1]) + else: + if cn != int(m.groups()[1]): + cn = None + break + + variant.calls[iSample].data["LFC"] = logFoldChange + variant.calls[iSample].data["CN"] = cn + + writer.write_record(variant) + + if len(locii) == 1: + locus = locii[0] + if locus[3] not in segments: + segments[locus[3]] = { + "logFoldChange": logFoldChange, + "CHROM": locus[0], + "start": locus[1], + "stop": locus[2], + "BAFs": [], + "NoData": 0, + } + depth = variant.call_for_sample[sample].data["AD"] + if len(depth) == 0: + segments[locus[3]]["NoData"] += 1 + else: + if depth[0] is None: + depth[0] = 0 + if depth[1] is None: + depth[1] = 0 + if depth[0] + depth[1] == 0: + segments[locus[3]]["NoData"] += 1 + else: + baf = min(depth[0], depth[1]) / (depth[0] + depth[1]) + segments[locus[3]]["BAFs"] += [baf] + +writer.close() + +# Implmentation of R's quantile function for continuous quantiles. +def quantile(x, probs, na_rm=False, method=7): + if na_rm: + x = list( + filter( + lambda y: y is not None + and isinstance(y, Number) + and not math.isnan(y) + and not math.isinf(y), + x, + ) + ) + x.sort() + n = len(x) + if method == 4: + m = [0 for p in probs] + elif method == 5: + m = [0.5 for p in probs] + elif method == 6: + m = [p for p in probs] + elif method == 7: + m = [1 - p for p in probs] + elif method == 8: + m = [(p + 1) / 3 for p in probs] + elif method == 9: + m = [p / 4 + 3 / 8 for p in probs] + else: + raise NotImplementedError("Only continuous methods 4 to 9 (R) are implmented") + qs = [None] * len(probs) + for i in range(len(probs)): + j = math.floor(n * probs[i] + m[i]) + if j < 1: + qs[i] = x[j] + elif j >= n: + qs[i] = x[n - 1] + else: + g = n * probs[i] + m[i] - j + qs[i] = (1 - g) * x[j - 1] + g * x[j] + return qs + + +with open(snakemake.output.tsv, "wt") as f: + print( + "Number\tCHROM\tstart\tstop\tCN\tLFC\tNvariants\tMin\t1st quartile\tMedian\t3rd quartile\tMax\tNoData", + file=f, + ) + for segId, segment in segments.items(): + m = NAME_PATTERN.match(segId) + n = int(m.groups()[0]) + cn = int(m.groups()[1]) + + logFoldChange = segment["logFoldChange"] + nVar = len(segment["BAFs"]) + bafs = sorted(segment["BAFs"]) + + if nVar > 1: + qs = ( + [bafs[0]] + + quantile(segment["BAFs"], (0.25, 0.5, 0.75), method=8) + + [bafs[nVar - 1]] + ) + elif nVar == 1: + qs = [bafs[0]] * 5 + else: + qs = [""] * 5 + + values = ( + [ + n, + segment["CHROM"], + segment["start"], + segment["stop"], + cn, + segment["logFoldChange"], + nVar, + ] + + qs + + [segment["NoData"]] + ) + print("\t".join(map(str, values)), file=f) + +shell( + r""" +tabix {snakemake.output.vcf} + +md5() {{ + filename=$1 + fn=$(basename $filename) + pushd $(dirname $filename) 1> /dev/null 2>&1 + rslt=$(md5sum $fn) + popd 1> /dev/null 2>&1 + echo "$rslt" +}} + +md5 {snakemake.output.vcf} > {snakemake.output.vcf_md5} +md5 {snakemake.output.tbi} > {snakemake.output.tbi_md5} +md5 {snakemake.output.tsv} > {snakemake.output.tsv_md5} +""" +) diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_cnv_checking.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_cnv_checking.py new file mode 100644 index 000000000..2310f7676 --- /dev/null +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_cnv_checking.py @@ -0,0 +1,297 @@ +# -*- coding: utf-8 -*- +"""Tests for the somatic_cnv_checking workflow module code""" + + +import textwrap + +import pytest +import ruamel.yaml as ruamel_yaml +from snakemake.io import Wildcards + +from snappy_pipeline.workflows.somatic_cnv_checking import SomaticCnvCheckingWorkflow + +from .common import get_expected_log_files_dict, get_expected_output_vcf_files_dict +from .conftest import patch_module_fs + +__author__ = "Manuel Holtgrewe " + + +@pytest.fixture(scope="module") # otherwise: performance issues +def minimal_config(): + """Return YAML parsing result for (somatic) configuration""" + yaml = ruamel_yaml.YAML() + return yaml.load( + textwrap.dedent( + r""" + static_data_config: + reference: + path: /path/to/ref.fa + dbsnp: + path: /path/to/dbsnp.vcf.gz + + step_config: + ngs_mapping: + tools: + dna: ['bwa'] + + somatic_targeted_seq_cnv_calling: + tools: ["cnvkit"] + + somatic_cnv_checking: + path_ngs_mapping: ../ngs_mapping + path_cnv_calling: ../somatic_targeted_seq_cnv_calling + cnv_assay_type: WES + + data_sets: + first_batch: + file: sheet.tsv + search_patterns: + - {'left': '*/*/*_R1.fastq.gz', 'right': '*/*/*_R2.fastq.gz'} + search_paths: ['/path'] + type: matched_cancer + naming_scheme: only_secondary_id + """ + ).lstrip() + ) + + +@pytest.fixture +def somatic_cnv_checking_workflow( + dummy_workflow, + minimal_config, + config_lookup_paths, + work_dir, + config_paths, + cancer_sheet_fake_fs, + mocker, +): + """Return SomaticTargetedSeqCnvCallingWorkflow object pre-configured with germline sheet""" + # Patch out file-system related things in abstract (the crawling link in step is defined there) + patch_module_fs("snappy_pipeline.workflows.abstract", cancer_sheet_fake_fs, mocker) + # Update the "globals" attribute of the mock workflow (snakemake.workflow.Workflow) so we + # can obtain paths from the function as if we really had a NGSMappingPipelineStep here + dummy_workflow.globals = { + "ngs_mapping": lambda x: "NGS_MAPPING/" + x, + "cnv_calling": lambda x: "CNV_CALLING/" + x, + } + # Construct the workflow object + return SomaticCnvCheckingWorkflow( + dummy_workflow, + minimal_config, + config_lookup_paths, + config_paths, + work_dir, + ) + + +# Tests for CnvCheckingPileupStepPart -------------------------------------------------------------- + + +def test_pileup_normal_step_part_get_input_files(somatic_cnv_checking_workflow): + """Tests CnvCheckingPileupStepPart.get_input_files() - action normal""" + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-N1-DNA1-WGS1"}) + expected = { + "bam": "NGS_MAPPING/output/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.bam", + "bai": "NGS_MAPPING/output/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.bam.bai", + } + actual = somatic_cnv_checking_workflow.get_input_files("pileup", "normal")(wildcards) + assert actual == expected + + +def test_pileup_normal_step_part_get_output_files(somatic_cnv_checking_workflow): + """Tests CnvCheckingPileupStepPart.get_output_files() - action normal""" + base_name = "work/{mapper}.{library_name}/out/{mapper}.{library_name}.normal" + expected = get_expected_output_vcf_files_dict(base_out=base_name) + actual = somatic_cnv_checking_workflow.get_output_files("pileup", "normal") + assert actual == expected + + +def test_pileup_normal_step_part_get_log_file(somatic_cnv_checking_workflow): + """Tests CnvCheckingPileupStepPart.get_log_file() - action normal""" + base_name = "work/{mapper}.{library_name}/log/{mapper}.{library_name}.normal" + expected = get_expected_log_files_dict(base_out=base_name) + actual = somatic_cnv_checking_workflow.get_log_file("pileup", "normal") + assert actual == expected + + +def test_pileup_normal_step_part_get_resource(somatic_cnv_checking_workflow): + """Tests CnvCheckingPileupStepPart.get_resource() - action normal""" + expected_dict = {"threads": 2, "time": "12:00:00", "memory": "7577M", "partition": "medium"} + for resource, expected in expected_dict.items(): + msg_error = f"Assertion error for resource '{resource}'." + actual = somatic_cnv_checking_workflow.get_resource("pileup", "normal", resource) + assert actual == expected, msg_error + + +def test_pileup_tumor_step_part_get_input_files(somatic_cnv_checking_workflow): + """Tests CnvCheckingPileupStepPart.get_input_files() - action tumor""" + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) + expected = { + "locii": "work/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.normal.vcf.gz", + "locii_tbi": "work/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.normal.vcf.gz.tbi", + "bam": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam", + "bai": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam.bai", + } + actual = somatic_cnv_checking_workflow.get_input_files("pileup", "tumor")(wildcards) + assert actual == expected + + +def test_pileup_tumor_step_part_get_output_files(somatic_cnv_checking_workflow): + """Tests CnvCheckingPileupStepPart.get_output_files() - action tumor""" + base_name = "work/{mapper}.{library_name}/out/{mapper}.{library_name}.tumor" + expected = get_expected_output_vcf_files_dict(base_out=base_name) + actual = somatic_cnv_checking_workflow.get_output_files("pileup", "tumor") + assert actual == expected + + +def test_pileup_tumor_step_part_get_log_file(somatic_cnv_checking_workflow): + """Tests CnvCheckingPileupStepPart.get_log_file() - action tumor""" + base_name = "work/{mapper}.{library_name}/log/{mapper}.{library_name}.tumor" + expected = get_expected_log_files_dict(base_out=base_name) + actual = somatic_cnv_checking_workflow.get_log_file("pileup", "tumor") + assert actual == expected + + +def test_pileup_tumor_step_part_get_resource(somatic_cnv_checking_workflow): + """Tests CnvCheckingPileupStepPart.get_resource() - action tumor""" + expected_dict = {"threads": 2, "time": "01:00:00", "memory": "7577M", "partition": "medium"} + for resource, expected in expected_dict.items(): + msg_error = f"Assertion error for resource '{resource}'." + actual = somatic_cnv_checking_workflow.get_resource("pileup", "tumor", resource) + assert actual == expected, msg_error + + +def test_cnv_run_step_part_get_input_files(somatic_cnv_checking_workflow): + """Tests SomaticCnvCheckingCnvStepPart.get_input_files()""" + wildcards = Wildcards( + fromdict={"mapper": "bwa", "caller": "cnvkit", "library_name": "P001-T1-DNA1-WGS1"} + ) + expected = { + "cnv": "CNV_CALLING/output/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.bed.gz", + "cnv_tbi": "CNV_CALLING/output/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.bed.gz.tbi", + "normal": "work/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.normal.vcf.gz", + "normal_tbi": "work/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.normal.vcf.gz.tbi", + "tumor": "work/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.tumor.vcf.gz", + "tumor_tbi": "work/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.tumor.vcf.gz.tbi", + } + actual = somatic_cnv_checking_workflow.get_input_files("cnv", "run")(wildcards) + assert actual == expected + + +def test_cnv_run_step_part_get_output_files(somatic_cnv_checking_workflow): + """Tests SomaticCnvCheckingCnvStepPart.get_output_files()""" + base_name = "work/{mapper}.{caller}.{library_name}/out/{mapper}.{caller}.{library_name}" + expected = { + "vcf": base_name + ".vcf.gz", + "vcf_md5": base_name + ".vcf.gz.md5", + "tbi": base_name + ".vcf.gz.tbi", + "tbi_md5": base_name + ".vcf.gz.tbi.md5", + "tsv": base_name + ".tsv", + "tsv_md5": base_name + ".tsv.md5", + } + actual = somatic_cnv_checking_workflow.get_output_files("cnv", "run") + assert actual == expected + + +def test_cnv_run_step_part_get_log_file(somatic_cnv_checking_workflow): + """Tests SomaticCnvCheckingCnvStepPart.get_log_file()""" + base_name = "work/{mapper}.{caller}.{library_name}/log/{mapper}.{caller}.{library_name}" + expected = get_expected_log_files_dict(base_out=base_name) + actual = somatic_cnv_checking_workflow.get_log_file("cnv", "run") + assert actual == expected + + +def test_report_run_step_part_get_input_files(somatic_cnv_checking_workflow): + """Tests SomaticCnvCheckingReportStepPart.get_input_files()""" + wildcards = Wildcards( + fromdict={"mapper": "bwa", "caller": "cnvkit", "library_name": "P001-T1-DNA1-WGS1"} + ) + expected = { + "vcf": "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.vcf.gz", + "tsv": "work/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.tsv", + } + actual = somatic_cnv_checking_workflow.get_input_files("report", "run")(wildcards) + assert actual == expected + + +def test_report_run_step_part_get_output_files(somatic_cnv_checking_workflow): + """Tests SomaticCnvCheckingReportStepPart.get_output_files()""" + base_name = "work/{mapper}.{caller}.{library_name}/report/{mapper}.{caller}.{library_name}" + expected = { + "cnv": base_name + ".cnv.pdf", + "cnv_md5": base_name + ".cnv.pdf.md5", + "locus": base_name + ".locus.pdf", + "locus_md5": base_name + ".locus.pdf.md5", + "segment": base_name + ".segment.pdf", + "segment_md5": base_name + ".segment.pdf.md5", + } + actual = somatic_cnv_checking_workflow.get_output_files("report", "run") + assert actual == expected + + +def test_report_run_step_part_get_log_file(somatic_cnv_checking_workflow): + """Tests SomaticCnvCheckingReportStepPart.get_log_file()""" + base_name = "work/{mapper}.{caller}.{library_name}/log/{mapper}.{caller}.{library_name}.report" + expected = get_expected_log_files_dict(base_out=base_name) + actual = somatic_cnv_checking_workflow.get_log_file("report", "run") + assert actual == expected + + +# Tests for SomaticCnvCheckingWorkflow -------------------------------------------------- + + +def test_somatic_cnv_checking_workflow(somatic_cnv_checking_workflow): + """Test simple functionality of the workflow""" + # Check created sub steps + expected = ["cnv", "link_out", "pileup", "report"] + actual = list(sorted(somatic_cnv_checking_workflow.sub_steps.keys())) + assert actual == expected + + # main output + tpl = ( + "output/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/out/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1.{ext}{chksum}" + ) + expected = [ + tpl.format(i=i, t=t, ext=ext, chksum=chksum) + for i, t in ((1, 1), (2, 1), (2, 2)) + for ext in ("vcf.gz", "vcf.gz.tbi", "tsv") + for chksum in ("", ".md5") + ] + + # report + tpl = "output/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/report/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1.{ext}{chksum}" + expected += [ + tpl.format(i=i, t=t, ext=ext, chksum=chksum) + for i, t in ((1, 1), (2, 1), (2, 2)) + for ext in ("cnv.pdf", "locus.pdf", "segment.pdf") + for chksum in ("", ".md5") + ] + + # logs (no caller) + tpl = "output/bwa.P00{i}-N1-DNA1-WGS1/log/bwa.P00{i}-N1-DNA1-WGS1.normal.{ext}{chksum}" + expected += [ + tpl.format(i=i, ext=ext, chksum=chksum) + for i in (1, 2) + for ext in ("log", "conda_info.txt", "conda_list.txt") + for chksum in ("", ".md5") + ] + tpl = "output/bwa.P00{i}-T{t}-DNA1-WGS1/log/bwa.P00{i}-T{t}-DNA1-WGS1.tumor.{ext}{chksum}" + expected += [ + tpl.format(i=i, t=t, ext=ext, chksum=chksum) + for i, t in ((1, 1), (2, 1), (2, 2)) + for ext in ("log", "conda_info.txt", "conda_list.txt") + for chksum in ("", ".md5") + ] + # logs (with caller) + tpl = "output/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/log/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1{part}.{ext}{chksum}" + expected += [ + tpl.format(i=i, t=t, part=part, ext=ext, chksum=chksum) + for i, t in ((1, 1), (2, 1), (2, 2)) + for part in ("", ".report") + for ext in ("log", "conda_info.txt", "conda_list.txt") + for chksum in ("", ".md5") + ] + + expected = list(sorted(expected)) + actual = list(sorted(somatic_cnv_checking_workflow.get_result_files())) + assert expected == actual diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py index fd756d9a4..ff622624c 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py @@ -472,8 +472,13 @@ def test_cnvkit_postprocess_step_part_get_input_files(somatic_targeted_seq_cnv_c def test_cnvkit_postprocess_step_part_get_output_files(somatic_targeted_seq_cnv_calling_workflow): - base_name_out = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.cns" - expected = {"final": base_name_out, "final_md5": base_name_out + ".md5"} + base_name_out = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.bed.gz" + expected = { + "final": base_name_out, + "final_tbi": base_name_out + ".tbi", + "final_md5": base_name_out + ".md5", + "final_tbi_md5": base_name_out + ".tbi.md5", + } actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("cnvkit", "postprocess") assert actual == expected @@ -582,7 +587,7 @@ def test_cnvkit_export_step_part_get_output_files(somatic_targeted_seq_cnv_calli # Define expected expected = {} base_name_out = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}" - for key, ext in (("bed", "bed"), ("seg", "seg"), ("vcf", "vcf.gz"), ("tbi", "vcf.gz.tbi")): + for key, ext in (("seg", "seg"), ("vcf", "vcf.gz"), ("tbi", "vcf.gz.tbi")): expected[key] = base_name_out + "." + ext expected[key + "_md5"] = expected[key] + ".md5" # Get actual @@ -870,7 +875,7 @@ def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_call expected += [ tpl.format(i=i, t=t, ext=ext, md5=md5) for i, t in ((1, 1), (2, 1), (2, 2)) - for ext in ("cnr", "cns", "bed", "seg", "vcf.gz", "vcf.gz.tbi") + for ext in ("cnr", "bed.gz", "bed.gz.tbi", "seg", "vcf.gz", "vcf.gz.tbi") for md5 in ("", ".md5") ] tpl = ( From c5f9dde2d2ce8570779030c1917b3132918ad33b Mon Sep 17 00:00:00 2001 From: ericblanc20 Date: Tue, 22 Aug 2023 13:50:40 +0200 Subject: [PATCH 09/19] feat: Added support for scarHRD (#429) --- snappy_pipeline/apps/snappy_snake.py | 4 +- .../Snakefile | 105 ++++++ .../__init__.py | 300 ++++++++++++++++++ .../wrappers/scarHRD/environment.yaml | 10 + .../scarHRD/gcreference/environment.yaml | 1 + .../wrappers/scarHRD/gcreference/wrapper.py | 49 +++ .../wrappers/scarHRD/install/environment.yaml | 1 + .../wrappers/scarHRD/install/wrapper.py | 48 +++ .../wrappers/scarHRD/run/environment.yaml | 1 + .../wrappers/scarHRD/run/wrapper.py | 81 +++++ ...ows_homologous_recombination_deficiency.py | 200 ++++++++++++ 11 files changed, 798 insertions(+), 2 deletions(-) create mode 100644 snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile create mode 100644 snappy_pipeline/workflows/homologous_recombination_deficiency/__init__.py create mode 100644 snappy_wrappers/wrappers/scarHRD/environment.yaml create mode 120000 snappy_wrappers/wrappers/scarHRD/gcreference/environment.yaml create mode 100644 snappy_wrappers/wrappers/scarHRD/gcreference/wrapper.py create mode 120000 snappy_wrappers/wrappers/scarHRD/install/environment.yaml create mode 100644 snappy_wrappers/wrappers/scarHRD/install/wrapper.py create mode 120000 snappy_wrappers/wrappers/scarHRD/run/environment.yaml create mode 100644 snappy_wrappers/wrappers/scarHRD/run/wrapper.py create mode 100644 tests/snappy_pipeline/workflows/test_workflows_homologous_recombination_deficiency.py diff --git a/snappy_pipeline/apps/snappy_snake.py b/snappy_pipeline/apps/snappy_snake.py index 6948b0682..d6ea062f3 100644 --- a/snappy_pipeline/apps/snappy_snake.py +++ b/snappy_pipeline/apps/snappy_snake.py @@ -25,13 +25,13 @@ helper_gcnv_model_targeted, helper_gcnv_model_wgs, hla_typing, + homologous_recombination_deficiency, igv_session_generation, ngs_data_qc, ngs_mapping, ngs_sanity_checking, panel_of_normals, repeat_expansion, - somatic_cnv_checking, somatic_gene_fusion_calling, somatic_hla_loh_calling, somatic_msi_calling, @@ -81,13 +81,13 @@ "helper_gcnv_model_targeted": helper_gcnv_model_targeted, "helper_gcnv_model_wgs": helper_gcnv_model_wgs, "hla_typing": hla_typing, + "homologous_recombination_deficiency": homologous_recombination_deficiency, "igv_session_generation": igv_session_generation, "ngs_mapping": ngs_mapping, "ngs_data_qc": ngs_data_qc, "panel_of_normals": panel_of_normals, "repeat_analysis": repeat_expansion, "ngs_sanity_checking": ngs_sanity_checking, - "somatic_cnv_checking": somatic_cnv_checking, "somatic_gene_fusion_calling": somatic_gene_fusion_calling, "somatic_hla_loh_calling": somatic_hla_loh_calling, "somatic_msi_calling": somatic_msi_calling, diff --git a/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile b/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile new file mode 100644 index 000000000..92f92482d --- /dev/null +++ b/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +"""CUBI Pipeline homologous_recombination_deficiency step Snakefile""" + +import os + +from snappy_pipeline import expand_ref +from snappy_pipeline.workflows.homologous_recombination_deficiency import ( + HomologousRecombinationDeficiencyWorkflow, +) + +__author__ = "Eric Blanc" + + +# Configuration =============================================================== + + +configfile: "config.yaml" + + +# Expand "$ref" JSON pointers in configuration (also works for YAML) +config, lookup_paths, config_paths = expand_ref("config.yaml", config) + +# WorkflowImpl Object Setup =================================================== + +wf = HomologousRecombinationDeficiencyWorkflow( + workflow, config, lookup_paths, config_paths, os.getcwd() +) + +# Rules ======================================================================= + + +localrules: + # Linking files from work/ to output/ should be done locally + homologous_recombination_deficiency_link_out_run, + + +rule all: + input: + wf.get_result_files(), + + +# House-Keeping ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Generic linking out --------------------------------------------------------- + + +rule homologous_recombination_deficiency_link_out_run: + input: + wf.get_input_files("link_out", "run"), + output: + wf.get_output_files("link_out", "run"), + run: + shell(wf.get_shell_cmd("link_out", "run", wildcards)) + + +# Homologous Recombination Deficiency score ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Run scarHRD ----------------------------------------------------------------- + + +rule homologous_recombination_deficiency_scarHRD_install: + output: + **wf.get_output_files("scarHRD", "install"), + threads: wf.get_resource("scarHRD", "install", "threads") + resources: + time=wf.get_resource("scarHRD", "install", "time"), + memory=wf.get_resource("scarHRD", "install", "memory"), + partition=wf.get_resource("scarHRD", "install", "partition"), + tmpdir=wf.get_resource("scarHRD", "install", "tmpdir"), + log: + **wf.get_log_file("scarHRD", "install"), + wrapper: + wf.wrapper_path("scarHRD/install") + + +rule homologous_recombination_deficiency_scarHRD_gcreference: + output: + **wf.get_output_files("scarHRD", "gcreference"), + threads: wf.get_resource("scarHRD", "gcreference", "threads") + resources: + time=wf.get_resource("scarHRD", "gcreference", "time"), + memory=wf.get_resource("scarHRD", "gcreference", "memory"), + partition=wf.get_resource("scarHRD", "gcreference", "partition"), + tmpdir=wf.get_resource("scarHRD", "gcreference", "tmpdir"), + log: + **wf.get_log_file("scarHRD", "gcreference"), + wrapper: + wf.wrapper_path("scarHRD/gcreference") + + +rule homologous_recombination_deficiency_scarHRD_run: + input: + unpack(wf.get_input_files("scarHRD", "run")), + output: + **wf.get_output_files("scarHRD", "run"), + threads: wf.get_resource("scarHRD", "run", "threads") + resources: + time=wf.get_resource("scarHRD", "run", "time"), + memory=wf.get_resource("scarHRD", "run", "memory"), + partition=wf.get_resource("scarHRD", "run", "partition"), + tmpdir=wf.get_resource("scarHRD", "run", "tmpdir"), + log: + **wf.get_log_file("scarHRD", "run"), + wrapper: + wf.wrapper_path("scarHRD/run") diff --git a/snappy_pipeline/workflows/homologous_recombination_deficiency/__init__.py b/snappy_pipeline/workflows/homologous_recombination_deficiency/__init__.py new file mode 100644 index 000000000..bae0d34c6 --- /dev/null +++ b/snappy_pipeline/workflows/homologous_recombination_deficiency/__init__.py @@ -0,0 +1,300 @@ +# -*- coding: utf-8 -*- +"""Implementation of the ``homologous_recombination_deficiency`` step + +This step allows for the computation of the scarHRD score, which is a composite of +loss-of-heterozygocity, large-scale transitions and telomeric imbalances. +The score is a proxy for holomogous recombination deficiencies scores produced from SNP arrays. +The software is described in `Sztupinszki et al.`, +but it is not part of CRAN, Bioconductor or bioconda (currently). +The implementation also relies on versions of `sequenza` & +`copynumber` which are not part of CRAN or Bioconductor anymore. +The most recent version of sequanza is downloaded from anaconda (for the R scripts), +and from bioconda for the python utilities. Note that anaconda lists the r-sequenza package in the +bioconda directory, while this package is not found when searching `bioconda`. +copynumber is obtained from a fork of the official Bioconductor deprecated package. + +========== +Step Input +========== + +``homologous_recombination_deficiency`` starts off the aligned reads, i.e. ``ngs_mapping``. +Both the normal & tumor samples are required to generate the score. + +=========== +Step Output +=========== + +Generally, the following links are generated to ``output/``. + +.. note:: Tool-Specific Output + + As the only integrated tool is scarHRD at the moment, the output is very tailored to the result + of this tool. In the future, this section might contain "common" output and tool-specific + output sub sections. + +- ``{mapper}.scarHRD.{lib_name}-{lib_pk}/out/`` + - ``{mapper}.scarHRD.{lib_name}-{lib_pk}.seqz.gz`` + - ``{mapper}.scarHRD.{lib_name}-{lib_pk}.json`` + +===================== +Default Configuration +===================== + +The default configuration is as follows. + +.. include:: DEFAULT_CONFIG_homologous_recombination_deficiency.rst + +===================================== +Available HRD tools +===================================== + +- ``scarHRD`` + +""" + +from collections import OrderedDict +import sys + +from biomedsheets.shortcuts import CancerCaseSheet, is_not_background +from snakemake.io import expand + +from snappy_pipeline.base import UnsupportedActionException +from snappy_pipeline.utils import dictify, listify +from snappy_pipeline.workflows.abstract import ( + BaseStep, + BaseStepPart, + LinkOutStepPart, + ResourceUsage, +) +from snappy_pipeline.workflows.ngs_mapping import NgsMappingWorkflow + +__author__ = "Eric Blanc " + +#: Default configuration for the homologous recombination deficiency step +DEFAULT_CONFIG = r""" +# Default configuration homologous_recombination_deficiency +step_config: + homologous_recombination_deficiency: + tools: ['scarHRD'] # REQUIRED - available: 'mantis' + path_ngs_mapping: ../ngs_mapping # REQUIRED + scarHRD: + genome_name: "grch37" # Must be either "grch37", "grch38" or "mouse" + chr_prefix: False + length: 50 # Wiggle track for GC reference file +""" + + +class ScarHRDStepPart(BaseStepPart): + """Computes homologous recombination deficiency score with scarHRD""" + + #: Step name + name = "scarHRD" + + #: Class available actions + actions = ( + "install", + "gcreference", + "run", + ) + + def __init__(self, parent): + super().__init__(parent) + self.base_path_out = ( + "work/{{mapper}}.scarHRD.{{library_name}}/out/{{mapper}}.scarHRD.{{library_name}}{ext}" + ) + # Build shortcut from cancer bio sample name to matched cancer sample + self.tumor_ngs_library_to_sample_pair = OrderedDict() + for sheet in self.parent.shortcut_sheets: + self.tumor_ngs_library_to_sample_pair.update( + sheet.all_sample_pairs_by_tumor_dna_ngs_library + ) + + def get_normal_lib_name(self, wildcards): + """Return name of normal (non-cancer) library""" + pair = self.tumor_ngs_library_to_sample_pair[wildcards.library_name] + return pair.normal_sample.dna_ngs_library.name + + def get_input_files(self, action): + def input_function_run(wildcards): + """Helper wrapper function""" + # Get shorcut to Snakemake sub workflow + ngs_mapping = self.parent.sub_workflows["ngs_mapping"] + # Get names of primary libraries of the selected cancer bio sample and the + # corresponding primary normal sample + normal_base_path = ( + "output/{mapper}.{normal_library}/out/{mapper}.{normal_library}".format( + normal_library=self.get_normal_lib_name(wildcards), **wildcards + ) + ) + tumor_base_path = ( + "output/{mapper}.{library_name}/out/" "{mapper}.{library_name}" + ).format(**wildcards) + return { + "lib_path": "work/R_packages/out/.done", + "gc": "work/static_data/out/{genome_name}_{length}.wig.gz".format( + genome_name=self.config["scarHRD"]["genome_name"], + length=self.config["scarHRD"]["length"], + ), + "normal_bam": ngs_mapping(normal_base_path + ".bam"), + "normal_bai": ngs_mapping(normal_base_path + ".bam.bai"), + "tumor_bam": ngs_mapping(tumor_base_path + ".bam"), + "tumor_bai": ngs_mapping(tumor_base_path + ".bam.bai"), + } + + if action == "install": + return None + elif action == "gcreference": + return None + elif action == "run": + return input_function_run + else: + raise UnsupportedActionException( + "Action '{action}' is not supported. Valid options: {valid}".format( + action=action, valid=", ".join(self.actions) + ) + ) + + def get_output_files(self, action): + if action == "install": + return {"lib_path": "work/R_packages/out/.done"} + elif action == "gcreference": + return { + "gc": "work/static_data/out/{genome_name}_{length}.wig.gz".format( + genome_name=self.config["scarHRD"]["genome_name"], + length=self.config["scarHRD"]["length"], + ) + } + elif action == "run": + return { + "sequenza": "work/{mapper}.scarHRD.{library_name}/out/{mapper}.scarHRD.{library_name}.seqz.gz", + "scarHRD": "work/{mapper}.scarHRD.{library_name}/out/{mapper}.scarHRD.{library_name}.json", + } + else: + raise UnsupportedActionException( + "Action '{action}' is not supported. Valid options: {valid}".format( + action=action, valid=", ".join(self.actions) + ) + ) + + @dictify + def _get_log_file(self, action): + """Return dict of log files.""" + if action == "install": + prefix = "work/R_packages/log/R_packages" + elif action == "gcreference": + prefix = "work/static_data/log/{genome_name}_{length}".format( + genome_name=self.config["scarHRD"]["genome_name"], + length=self.config["scarHRD"]["length"], + ) + elif action == "run": + prefix = "work/{mapper}.scarHRD.{library_name}/log/{mapper}.scarHRD.{library_name}" + else: + raise UnsupportedActionException( + "Action '{action}' is not supported. Valid options: {valid}".format( + action=action, valid=", ".join(self.actions) + ) + ) + key_ext = ( + ("log", ".log"), + ("conda_info", ".conda_info.txt"), + ("conda_list", ".conda_list.txt"), + ) + for key, ext in key_ext: + yield key, prefix + ext + yield key + "_md5", prefix + ext + ".md5" + + def get_resource_usage(self, action): + """Get Resource Usage + + :param action: Action (i.e., step) in the workflow, example: 'run'. + :type action: str + + :return: Returns ResourceUsage for step. + """ + if action == "install" or action == "gcreference": + return ResourceUsage( + threads=1, + time="02:00:00", # 2 hours + memory="4096M", + partition="short", + ) + elif action == "run": + return ResourceUsage( + threads=2, + time="48:00:00", # 2 hours + memory="32G", + ) + else: + raise UnsupportedActionException( + "Action '{action}' is not supported. Valid options: {valid}".format( + action=action, valid=", ".join(self.actions) + ) + ) + + +class HomologousRecombinationDeficiencyWorkflow(BaseStep): + """Compute Homologous Recombination Deficiency score""" + + #: Step name + name = "homologous_recombination_deficiency" + + #: Default biomed sheet class + sheet_shortcut_class = CancerCaseSheet + + @classmethod + def default_config_yaml(cls): + """Return default config YAML, to be overwritten by project-specific one""" + return DEFAULT_CONFIG + + def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir): + super().__init__( + workflow, + config, + config_lookup_paths, + config_paths, + workdir, + (NgsMappingWorkflow,), + ) + # Register sub step classes so the sub steps are available + self.register_sub_step_classes((ScarHRDStepPart, LinkOutStepPart)) + # Initialize sub-workflows + self.register_sub_workflow("ngs_mapping", self.config["path_ngs_mapping"]) + + @listify + def get_result_files(self): + """Return list of result files for the somatic targeted sequencing CNV calling step""" + tool_actions = {"scarHRD": ("run",)} + for sheet in filter(is_not_background, self.shortcut_sheets): + for sample_pair in sheet.all_sample_pairs: + if ( + not sample_pair.tumor_sample.dna_ngs_library + or not sample_pair.normal_sample.dna_ngs_library + ): + msg = ( + "INFO: sample pair for cancer bio sample {} is missing primary" + "normal or primary cancer NGS library" + ) + print(msg.format(sample_pair.tumor_sample.name), file=sys.stderr) + continue + for tool in self.config["tools"]: + for action in tool_actions[tool]: + try: + tpls = self.sub_steps[tool].get_output_files(action).values() + except AttributeError: + tpls = self.sub_steps[tool].get_output_files(action) + for tpl in tpls: + filenames = expand( + tpl, + mapper=self.w_config["step_config"]["ngs_mapping"]["tools"]["dna"], + library_name=[sample_pair.tumor_sample.dna_ngs_library.name], + ) + for f in filenames: + if ".tmp." not in f: + yield f.replace("work/", "output/") + + def check_config(self): + """Check that the necessary globalc onfiguration is present""" + self.ensure_w_config( + ("static_data_config", "reference", "path"), + "Path to reference FASTA file not configured but required", + ) diff --git a/snappy_wrappers/wrappers/scarHRD/environment.yaml b/snappy_wrappers/wrappers/scarHRD/environment.yaml new file mode 100644 index 000000000..b6a8c8b49 --- /dev/null +++ b/snappy_wrappers/wrappers/scarHRD/environment.yaml @@ -0,0 +1,10 @@ +channels: + - conda-forge + - bioconda +dependencies: + - python =3.9 + - sequenza-utils + - r-sequenza + - r-devtools + - r-data.table + - samtools diff --git a/snappy_wrappers/wrappers/scarHRD/gcreference/environment.yaml b/snappy_wrappers/wrappers/scarHRD/gcreference/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/scarHRD/gcreference/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/scarHRD/gcreference/wrapper.py b/snappy_wrappers/wrappers/scarHRD/gcreference/wrapper.py new file mode 100644 index 000000000..1b9a2c4b0 --- /dev/null +++ b/snappy_wrappers/wrappers/scarHRD/gcreference/wrapper.py @@ -0,0 +1,49 @@ +"""CUBI+Snakemake wrapper code for scarHRD (sequenza GC reference file) +""" + +import os + +from snakemake import shell + +__author__ = "Eric Blanc " + +step = snakemake.config["pipeline_step"]["name"] +genome = snakemake.config["static_data_config"]["reference"]["path"] +length = snakemake.config["step_config"][step]["scarHRD"]["length"] + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Also pipe stderr to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +sequenza-utils gc_wiggle --fasta {genome} -w {length} -o {snakemake.output} + +pushd $(dirname {snakemake.output}) +md5sum $(basename {snakemake.output}) > $(basename {snakemake.output}).md5 +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/scarHRD/install/environment.yaml b/snappy_wrappers/wrappers/scarHRD/install/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/scarHRD/install/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/scarHRD/install/wrapper.py b/snappy_wrappers/wrappers/scarHRD/install/wrapper.py new file mode 100644 index 000000000..a9a9c15e0 --- /dev/null +++ b/snappy_wrappers/wrappers/scarHRD/install/wrapper.py @@ -0,0 +1,48 @@ +"""CUBI+Snakemake wrapper code for scarHRD (non-conda package installation) +""" + +import os + +from snakemake import shell + +__author__ = "Eric Blanc " + +lib_path = os.path.dirname(snakemake.output.lib_path) + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Also pipe stderr to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +R --vanilla --slave << __EOF +devtools::install_github("aroneklund/copynumber", lib="{lib_path}", upgrade="never") +devtools::install_github("sztup/scarHRD", lib="{lib_path}", upgrade="never") +__EOF +touch {snakemake.output} +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/scarHRD/run/environment.yaml b/snappy_wrappers/wrappers/scarHRD/run/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/scarHRD/run/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/scarHRD/run/wrapper.py b/snappy_wrappers/wrappers/scarHRD/run/wrapper.py new file mode 100644 index 000000000..6e414eade --- /dev/null +++ b/snappy_wrappers/wrappers/scarHRD/run/wrapper.py @@ -0,0 +1,81 @@ +"""CUBI+Snakemake wrapper code for scarHRD (non-conda package installation) +""" + +import os + +from snakemake import shell + +__author__ = "Eric Blanc " + +lib_path = os.path.dirname(snakemake.input.lib_path) + +step = snakemake.config["pipeline_step"]["name"] +genome = snakemake.config["static_data_config"]["reference"]["path"] +length = snakemake.config["step_config"][step]["scarHRD"]["length"] +genome_name = snakemake.config["step_config"][step]["scarHRD"]["genome_name"] + +chr_in_name = "TRUE" if snakemake.config["step_config"][step]["scarHRD"]["chr_prefix"] else "FALSE" +prefix = "chr" if snakemake.config["step_config"][step]["scarHRD"]["chr_prefix"] else "" +if genome_name == "grch37" or genome_name == "grch38": + chromosomes = " ".join([prefix + str(x) for x in list(range(1, 23)) + ["X", "Y"]]) +elif genome_name == "mouse": + chromosomes = " ".join([prefix + str(x) for x in list(range(1, 21)) + ["X", "Y"]]) +else: + raise Exception("Invalid configuration") + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Also pipe stderr to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +sequenza-utils bam2seqz \ + -gc {snakemake.input.gc} --fasta {genome} \ + -n {snakemake.input.normal_bam} --tumor {snakemake.input.tumor_bam} \ + -C {chromosomes} \ + | sequenza-utils seqz_binning -w {length} -s - \ + | gzip > {snakemake.output.sequenza} + +cat << __EOF | R --vanilla --slave +.libPaths(c("{lib_path}", .libPaths())) +Sys.setenv(VROOM_CONNECTION_SIZE=2000000000) +library("scarHRD") + +tbl <- scar_score("{snakemake.output.sequenza}", reference="{genome_name}", seqz=TRUE, chr.in.name={chr_in_name}) +cat('{{\n', file="{snakemake.output.scarHRD}") +cat(' "HRD": ', tbl[1,1], ',\n', sep="", file="{snakemake.output.scarHRD}", append=TRUE) +cat(' "Telomeric AI": ', tbl[1,2], ',\n', sep="", file="{snakemake.output.scarHRD}", append=TRUE) +cat(' "LST": ', tbl[1,3], ',\n', sep="", file="{snakemake.output.scarHRD}", append=TRUE) +cat(' "HRD-sum": ', tbl[1,4], '\n', sep="", file="{snakemake.output.scarHRD}", append=TRUE) +cat('}}\n', file="{snakemake.output.scarHRD}", append=TRUE) + +__EOF + +pushd $(dirname {snakemake.output.sequenza}) ; f=$(basename {snakemake.output.sequenza}) ; md5sum $f > $f.md5 ; popd +pushd $(dirname {snakemake.output.scarHRD}) ; f=$(basename {snakemake.output.scarHRD}) ; md5sum $f > $f.md5 ; popd +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/tests/snappy_pipeline/workflows/test_workflows_homologous_recombination_deficiency.py b/tests/snappy_pipeline/workflows/test_workflows_homologous_recombination_deficiency.py new file mode 100644 index 000000000..3183a63e7 --- /dev/null +++ b/tests/snappy_pipeline/workflows/test_workflows_homologous_recombination_deficiency.py @@ -0,0 +1,200 @@ +# -*- coding: utf-8 -*- +"""Tests for the homologous_recombination_deficiency module code""" + +import textwrap + +import pytest +import ruamel.yaml as ruamel_yaml +from snakemake.io import Wildcards + +from snappy_pipeline.workflows.homologous_recombination_deficiency import ( + HomologousRecombinationDeficiencyWorkflow, +) + +from .common import get_expected_log_files_dict +from .conftest import patch_module_fs + +__author__ = "Eric Blanc" + + +@pytest.fixture(scope="module") # otherwise: performance issues +def minimal_config(): + """Return YAML parsing result for configuration""" + yaml = ruamel_yaml.YAML() + return yaml.load( + textwrap.dedent( + r""" + static_data_config: + reference: + path: /path/to/ref.fa + + step_config: + ngs_mapping: + tools: + dna: ['bwa'] + bwa: + path_index: /path/to/bwa/index.fasta + homologous_recombination_deficiency: + tools: ['scarHRD'] + path_ngs_mapping: ../ngs_mapping # REQUIRED + + data_sets: + first_batch: + file: sheet.tsv + search_patterns: + - {'left': '*/*/*_R1.fastq.gz', 'right': '*/*/*_R2.fastq.gz'} + search_paths: ['/path'] + type: matched_cancer + naming_scheme: only_secondary_id + """ + ).lstrip() + ) + + +@pytest.fixture +def homologous_recombination_deficiency_workflow( + dummy_workflow, + minimal_config, + config_lookup_paths, + work_dir, + config_paths, + cancer_sheet_fake_fs, + mocker, +): + """Return HomologousRecombinationDeficiencyWorkflow object pre-configured with cancer sheet""" + # Patch out file-system related things in abstract (the crawling link in step is defined there) + patch_module_fs("snappy_pipeline.workflows.abstract", cancer_sheet_fake_fs, mocker) + dummy_workflow.globals = {"ngs_mapping": lambda x: "NGS_MAPPING/" + x} + # Construct the workflow object + return HomologousRecombinationDeficiencyWorkflow( + dummy_workflow, + minimal_config, + config_lookup_paths, + config_paths, + work_dir, + ) + + +# Tests for ScarHRDStepPart ------------------------------------------------------------------ + + +def test_scarHRD_step_part_get_input_files_run(homologous_recombination_deficiency_workflow): + """Tests ScarHRDStepPart.get_input_files() - run""" + wildcards = Wildcards(fromdict={"library_name": "P001-T1-DNA1-WGS1", "mapper": "bwa"}) + expected = { + "lib_path": "work/R_packages/out/.done", + "gc": "work/static_data/out/grch37_50.wig.gz", + "normal_bai": "NGS_MAPPING/output/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.bam.bai", + "normal_bam": "NGS_MAPPING/output/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.bam", + "tumor_bai": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam.bai", + "tumor_bam": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam", + } + actual = homologous_recombination_deficiency_workflow.get_input_files("scarHRD", "run")( + wildcards + ) + assert actual == expected + + +def test_scarHRD_step_part_get_output_files_run(homologous_recombination_deficiency_workflow): + """Tests ScarHRDStepPart.get_output_files() - run""" + # Define expected + base_name_out = "work/{mapper}.scarHRD.{library_name}/out/{mapper}.scarHRD.{library_name}" + expected = { + "sequenza": base_name_out + ".seqz.gz", + "scarHRD": base_name_out + ".json", + } + # Get actual + actual = homologous_recombination_deficiency_workflow.get_output_files("scarHRD", "run") + assert actual == expected + + +def test_scarHRD_step_part_get_log_file_run(homologous_recombination_deficiency_workflow): + """Tests ScarHRDStepPart.get_log_file() - run""" + base_name = "work/{mapper}.scarHRD.{library_name}/log/{mapper}.scarHRD.{library_name}" + expected = get_expected_log_files_dict(base_out=base_name) + actual = homologous_recombination_deficiency_workflow.get_log_file("scarHRD", "run") + assert actual == expected + + +def test_scarHRD_step_part_get_resource_usage_run(homologous_recombination_deficiency_workflow): + """Tests ScarHRDStepPart.get_resource() - run""" + # Define expected + expected_dict = {"threads": 2, "time": "48:00:00", "memory": "32G", "partition": "medium"} + # Evaluate + for resource, expected in expected_dict.items(): + msg_error = f"Assertion error for resource '{resource}'." + actual = homologous_recombination_deficiency_workflow.get_resource( + "scarHRD", "run", resource + ) + assert actual == expected, msg_error + + +def test_scarHRD_step_part_get_output_files_install(homologous_recombination_deficiency_workflow): + """Tests ScarHRDStepPart.get_output_files() - install""" + # Define expected + expected = {"lib_path": "work/R_packages/out/.done"} + # Get actual + actual = homologous_recombination_deficiency_workflow.get_output_files("scarHRD", "install") + assert actual == expected + + +def test_scarHRD_step_part_get_log_file_install(homologous_recombination_deficiency_workflow): + """Tests ScarHRDStepPart.get_log_file() - install""" + base_name = "work/R_packages/log/R_packages" + expected = get_expected_log_files_dict(base_out=base_name) + actual = homologous_recombination_deficiency_workflow.get_log_file("scarHRD", "install") + assert actual == expected + + +def test_scarHRD_step_part_get_resource_usage_install(homologous_recombination_deficiency_workflow): + """Tests ScarHRDStepPart.get_resource() - install""" + # Define expected + expected_dict = {"threads": 1, "time": "02:00:00", "memory": "4096M", "partition": "short"} + # Evaluate + for resource, expected in expected_dict.items(): + msg_error = f"Assertion error for resource '{resource}'." + actual = homologous_recombination_deficiency_workflow.get_resource( + "scarHRD", "install", resource + ) + assert actual == expected, msg_error + + +def test_scarHRD_step_part_get_output_files_gcreference( + homologous_recombination_deficiency_workflow, +): + """Tests ScarHRDStepPart.get_output_files() - gcreference""" + # Define expected + expected = {"gc": "work/static_data/out/grch37_50.wig.gz"} + # Get actual + actual = homologous_recombination_deficiency_workflow.get_output_files("scarHRD", "gcreference") + assert actual == expected + + +def test_scarHRD_step_part_get_log_file_gcreference(homologous_recombination_deficiency_workflow): + """Tests ScarHRDStepPart.get_log_file() - gcreference""" + base_name = "work/static_data/log/grch37_50" + expected = get_expected_log_files_dict(base_out=base_name) + actual = homologous_recombination_deficiency_workflow.get_log_file("scarHRD", "gcreference") + assert actual == expected + + +# Tests for SomaticMsiCallingWorkflow -------------------------------------------------------------- + + +def test_homologous_recombination_deficiency_workflow(homologous_recombination_deficiency_workflow): + """Test simple functionality of the workflow""" + # Check created sub steps + expected = ["link_out", "scarHRD"] + assert list(sorted(homologous_recombination_deficiency_workflow.sub_steps.keys())) == expected + # Check result file construction + expected = [ + "output/bwa.scarHRD.P001-T1-DNA1-WGS1/out/bwa.scarHRD.P001-T1-DNA1-WGS1.json", + "output/bwa.scarHRD.P001-T1-DNA1-WGS1/out/bwa.scarHRD.P001-T1-DNA1-WGS1.seqz.gz", + "output/bwa.scarHRD.P002-T1-DNA1-WGS1/out/bwa.scarHRD.P002-T1-DNA1-WGS1.json", + "output/bwa.scarHRD.P002-T1-DNA1-WGS1/out/bwa.scarHRD.P002-T1-DNA1-WGS1.seqz.gz", + "output/bwa.scarHRD.P002-T2-DNA1-WGS1/out/bwa.scarHRD.P002-T2-DNA1-WGS1.json", + "output/bwa.scarHRD.P002-T2-DNA1-WGS1/out/bwa.scarHRD.P002-T2-DNA1-WGS1.seqz.gz", + ] + actual = set(homologous_recombination_deficiency_workflow.get_result_files()) + expected = set(expected) + assert actual == expected From 35b24cd70e4352244b6d09d414c6fae761c7dece Mon Sep 17 00:00:00 2001 From: ericblanc20 Date: Thu, 24 Aug 2023 10:47:18 +0200 Subject: [PATCH 10/19] feat: (430) picard metrics for bam files (#431) --- .../workflows/ngs_data_qc/Snakefile | 39 +++ .../workflows/ngs_data_qc/__init__.py | 231 +++++++++++++++++- .../wrappers/picard/environment.yaml | 6 + .../wrappers/picard/metrics/environment.yaml | 1 + .../wrappers/picard/metrics/wrapper.py | 166 +++++++++++++ .../wrappers/picard/prepare/environment.yaml | 1 + .../wrappers/picard/prepare/wrapper.py | 100 ++++++++ .../workflows/test_workflows_ngs_data_qc.py | 123 +++++++--- ...t_workflows_ngs_data_qc_processed_fastq.py | 2 +- 9 files changed, 624 insertions(+), 45 deletions(-) create mode 100644 snappy_wrappers/wrappers/picard/environment.yaml create mode 120000 snappy_wrappers/wrappers/picard/metrics/environment.yaml create mode 100644 snappy_wrappers/wrappers/picard/metrics/wrapper.py create mode 120000 snappy_wrappers/wrappers/picard/prepare/environment.yaml create mode 100644 snappy_wrappers/wrappers/picard/prepare/wrapper.py diff --git a/snappy_pipeline/workflows/ngs_data_qc/Snakefile b/snappy_pipeline/workflows/ngs_data_qc/Snakefile index 0d379e48c..53ebb9335 100644 --- a/snappy_pipeline/workflows/ngs_data_qc/Snakefile +++ b/snappy_pipeline/workflows/ngs_data_qc/Snakefile @@ -85,3 +85,42 @@ rule data_qc_fastqc_run: wf.get_log_file("fastqc", "run"), wrapper: wf.wrapper_path("fastqc") + + +# Bam Data QC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Run picard ------------------------------------------------------------------ + + +rule data_qc_picard_prepare: + output: + **wf.get_output_files("picard", "prepare"), + threads: wf.get_resource("picard", "prepare", "threads") + resources: + time=wf.get_resource("picard", "prepare", "time"), + memory=wf.get_resource("picard", "prepare", "memory"), + partition=wf.get_resource("picard", "prepare", "partition"), + tmpdir=wf.get_resource("picard", "prepare", "tmpdir"), + log: + **wf.get_log_file("picard", "prepare"), + wrapper: + wf.wrapper_path("picard/prepare") + + +rule data_qc_picard_metrics: + input: + unpack(wf.get_input_files("picard", "metrics")), + output: + **wf.get_output_files("picard", "metrics"), + params: + wf.get_params("picard", "metrics"), + threads: wf.get_resource("picard", "metrics", "threads") + resources: + time=wf.get_resource("picard", "metrics", "time"), + memory=wf.get_resource("picard", "metrics", "memory"), + partition=wf.get_resource("picard", "metrics", "partition"), + tmpdir=wf.get_resource("picard", "metrics", "tmpdir"), + log: + **wf.get_log_file("picard", "metrics"), + wrapper: + wf.wrapper_path("picard/metrics") diff --git a/snappy_pipeline/workflows/ngs_data_qc/__init__.py b/snappy_pipeline/workflows/ngs_data_qc/__init__.py index 3268ca84d..3f4d4af76 100644 --- a/snappy_pipeline/workflows/ngs_data_qc/__init__.py +++ b/snappy_pipeline/workflows/ngs_data_qc/__init__.py @@ -17,6 +17,7 @@ from biomedsheets.shortcuts import GenericSampleSheet from snakemake.io import Namedlist, expand, touch +from snappy_pipeline.base import UnsupportedActionException from snappy_pipeline.utils import dictify, listify from snappy_pipeline.workflows.abstract import ( BaseStep, @@ -24,6 +25,7 @@ LinkInPathGenerator, LinkInStep, LinkOutStepPart, + ResourceUsage, get_ngs_library_folder_name, ) @@ -33,9 +35,66 @@ step_config: ngs_data_qc: path_link_in: "" # OPTIONAL Override data set configuration search paths for FASTQ files - tools: [fastqc] # REQUIRED - available: 'fastqc' + tools: [fastqc, picard] # REQUIRED - available: 'fastqc' & 'picard' (for QC on bam files) + picard: + path_ngs_mapping: ../ngs_mapping # REQUIRED + path_to_baits: "" # Required when CollectHsMetrics is among the programs + path_to_targets: "" # When missing, same as baits + bait_name: "" # Exon enrichment kit name (optional) + programs: [] # Available metrics: + # * Generic metrics [* grouped into CollectMultipleMetrics] + # - CollectAlignmentSummaryMetrics * + # - CollectBaseDistributionByCycle * + # - CollectGcBiasMetrics * + # - CollectInsertSizeMetrics * + # - CollectJumpingLibraryMetrics + # - CollectOxoGMetrics + # - CollectQualityYieldMetrics * + # - CollectSequencingArtifactMetrics * + # - EstimateLibraryComplexity + # - MeanQualityByCycle * + # - QualityScoreDistribution * + # * WGS-specific metrics + # - CollectRawWgsMetrics + # - CollectWgsMetrics + # - CollectWgsMetricsWithNonZeroCoverage + # * Other assay-specific metrics + # - CollectHsMetrics Whole Exome Sequencing + # - CollectTargetedPcrMetrics Panel sequencing + # - CollectRnaSeqMetrics mRNA sequencing, not implemented yet + # - CollectRbsMetrics bi-sulfite sequencing, not implemented yet """ +MULTIPLE_METRICS = { + "CollectAlignmentSummaryMetrics": ["alignment_summary_metrics"], + "CollectBaseDistributionByCycle": ["base_distribution_by_cycle_metrics"], + "CollectGcBiasMetrics": ["gc_bias.summary_metrics", "gc_bias.detail_metrics"], + "CollectInsertSizeMetrics": ["insert_size_metrics"], + "CollectQualityYieldMetrics": ["quality_yield_metrics"], + "CollectSequencingArtifactMetrics": [ + "pre_adapter_detail_metrics", + "pre_adapter_summary_metrics", + "bait_bias_summary_metrics", + "bait_bias_detail_metrics", + ], + "MeanQualityByCycle": ["quality_by_cycle_metrics"], + "QualityScoreDistribution": ["quality_distribution_metrics"], +} +ADDITIONAL_METRICS = ( + "CollectJumpingLibraryMetrics", + "CollectOxoGMetrics", + "EstimateLibraryComplexity", +) +WGS_METRICS = ( + "CollectRawWgsMetrics", + "CollectWgsMetrics", + "CollectWgsMetricsWithNonZeroCoverage", +) +WES_METRICS = ("CollectHsMetrics",) +PANEL_METRICS = ("CollectTargetedPcrMetrics",) +RNA_METRICS = ("CollectRnaSeqMetrics",) +BISULFITE_METRICS = ("CollectRbsMetrics",) + class FastQcReportStepPart(BaseStepPart): """(Raw) data QC using FastQC""" @@ -109,6 +168,107 @@ def _collect_reads(self, wildcards, library_name, prefix): yield os.path.join(self.base_path_in, path_infix, filename).format(**wildcards) +class PicardStepPart(BaseStepPart): + """Collect Picard metrics""" + + name = "picard" + actions = ("prepare", "metrics") + + def __init__(self, parent): + super().__init__(parent) + + def get_input_files(self, action): + self._validate_action(action) + if action == "prepare": + raise UnsupportedActionException( + 'Action "prepare" input files must be defined in config' + ) + + return self._get_input_files_metrics + + @dictify + def _get_input_files_metrics(self, wildcards): + if "CollectHsMetrics" in self.config["picard"]["programs"]: + yield "baits", "work/static_data/picard/out/baits.interval_list" + yield "targets", "work/static_data/picard/out/targets.interval_list" + ngs_mapping = self.parent.sub_workflows["ngs_mapping"] + infix = f"{wildcards.mapper}.{wildcards.library_name}" + yield "bam", ngs_mapping(f"output/{infix}/out/{infix}.bam") + + @dictify + def get_output_files(self, action): + if action == "prepare": + yield "baits", "work/static_data/picard/out/baits.interval_list" + yield "targets", "work/static_data/picard/out/targets.interval_list" + elif action == "metrics": + base_out = "work/{mapper}.{library_name}/report/picard/{mapper}.{library_name}." + for pgm in self.config["picard"]["programs"]: + if pgm in MULTIPLE_METRICS.keys(): + first = MULTIPLE_METRICS[pgm][0] + yield pgm, base_out + f"CollectMultipleMetrics.{first}.txt" + yield pgm + "_md5", base_out + f"CollectMultipleMetrics.{first}.txt.md5" + else: + yield pgm, base_out + pgm + ".txt" + yield pgm + "_md5", base_out + pgm + ".txt.md5" + else: + actions_str = ", ".join(self.actions) + raise UnsupportedActionException( + f"Action '{action}' is not supported. Valid options: {actions_str}" + ) + + @dictify + def get_log_file(self, action): + if action == "prepare": + prefix = "work/static_data/picard/log/prepare" + elif action == "metrics": + prefix = "work/{mapper}.{library_name}/log/picard/{mapper}.{library_name}" + else: + actions_str = ", ".join(self.actions) + raise UnsupportedActionException( + f"Action '{action}' is not supported. Valid options: {actions_str}" + ) + + key_ext = ( + ("wrapper", ".wrapper.py"), + ("log", ".log"), + ("conda_info", ".conda_info.txt"), + ("conda_list", ".conda_list.txt"), + ("env_yaml", ".environment.yaml"), + ) + for key, ext in key_ext: + yield key, prefix + ext + yield key + "_md5", prefix + ext + ".md5" + + def get_params(self, action): + self._validate_action(action) + + return self._get_params + + @dictify + def _get_params(self, wildcards): + return {"prefix": f"{wildcards.mapper}.{wildcards.library_name}"} + + def get_resource_usage(self, action): + """Get Resource Usage + + :param action: Action (i.e., step) in the workflow, example: 'run'. + :type action: str + + :return: Returns ResourceUsage for step. + + :raises UnsupportedActionException: if action not in class defined list of valid actions. + """ + if action == "prepare": + return super().get_resource_usage(action) + elif action == "metrics": + return ResourceUsage(threads=1, time="24:00:00", memory="24G") + else: + actions_str = ", ".join(self.actions) + raise UnsupportedActionException( + f"Action '{action}' is not supported. Valid options: {actions_str}" + ) + + class NgsDataQcWorkflow(BaseStep): """Perform NGS raw data QC""" @@ -124,7 +284,11 @@ def default_config_yaml(cls): def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir): super().__init__(workflow, config, config_lookup_paths, config_paths, workdir) - self.register_sub_step_classes((LinkInStep, LinkOutStepPart, FastQcReportStepPart)) + self.register_sub_step_classes( + (LinkInStep, LinkOutStepPart, FastQcReportStepPart, PicardStepPart) + ) + if "picard" in self.config["tools"]: + self.register_sub_workflow("ngs_mapping", self.config["picard"]["path_ngs_mapping"]) @listify def get_result_files(self): @@ -133,17 +297,58 @@ def get_result_files(self): We will process all NGS libraries of all test samples in all sample sheets. """ - from os.path import join - - name_pattern = "{ngs_library.name}" - # TODO: actually link out report files - yield from self._yield_result_files( - join("output", name_pattern, "report", "fastqc", ".done") - ) - - def _yield_result_files(self, tpl, **kwargs): + if "fastqc" in self.config["tools"]: + yield from self._yield_result_files( + tpl="output/{ngs_library.name}/report/fastqc/.done", + allowed_extraction_types=( + "DNA", + "RNA", + ), + ) + if "picard" in self.config["tools"]: + tpl = ( + "output/{mapper}.{ngs_library.name}/report/picard/{mapper}.{ngs_library.name}.{ext}" + ) + exts = [] + for pgm in self.config["picard"]["programs"]: + if pgm in MULTIPLE_METRICS.keys(): + first = MULTIPLE_METRICS[pgm][0] + exts.append(f"CollectMultipleMetrics.{first}.txt") + exts.append(f"CollectMultipleMetrics.{first}.txt.md5") + else: + exts.append(pgm + ".txt") + exts.append(pgm + ".txt.md5") + yield from self._yield_result_files( + tpl=tpl, + allowed_extraction_types=("DNA",), + mapper=self.w_config["step_config"]["ngs_mapping"]["tools"]["dna"], + ext=exts, + ) + + def _yield_result_files(self, tpl, allowed_extraction_types, **kwargs): """Build output paths from path template and extension list""" for sheet in self.shortcut_sheets: for ngs_library in sheet.all_ngs_libraries: - # extraction_type = ngs_library.test_sample.extra_infos['extractionType'] - yield from expand(tpl, ngs_library=[ngs_library], **kwargs) + extraction_type = ngs_library.test_sample.extra_infos["extractionType"] + if extraction_type in allowed_extraction_types: + yield from expand(tpl, ngs_library=[ngs_library], **kwargs) + + def check_config(self): + if "picard" in self.config["tools"]: + self.ensure_w_config( + ("step_config", "ngs_data_qc", "picard", "path_ngs_mapping"), + "Path to ngs_mapping not configured but required for picard", + ) + programs = self.config["picard"]["programs"] + assert len(programs) > 0, "No selected programs for collecting metrics" + assert all( + pgm in MULTIPLE_METRICS.keys() + or pgm in ADDITIONAL_METRICS + or pgm in WES_METRICS + or pgm in WGS_METRICS + for pgm in programs + ), "Some requested metrics programs are not implemented" + if "CollectHsMetrics" in programs: + assert self.config["picard"][ + "path_to_baits" + ], "Path to baits must be specified when using CollectHsMetrics" diff --git a/snappy_wrappers/wrappers/picard/environment.yaml b/snappy_wrappers/wrappers/picard/environment.yaml new file mode 100644 index 000000000..758c031e7 --- /dev/null +++ b/snappy_wrappers/wrappers/picard/environment.yaml @@ -0,0 +1,6 @@ +channels: + - conda-forge + - bioconda +dependencies: + - picard + - bedtools diff --git a/snappy_wrappers/wrappers/picard/metrics/environment.yaml b/snappy_wrappers/wrappers/picard/metrics/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/picard/metrics/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/picard/metrics/wrapper.py b/snappy_wrappers/wrappers/picard/metrics/wrapper.py new file mode 100644 index 000000000..7156197be --- /dev/null +++ b/snappy_wrappers/wrappers/picard/metrics/wrapper.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- +"""CUBI+Snakemake wrapper code for picard metrics collection: Snakemake wrapper.py +""" + +from snakemake import shell + +__author__ = "Eric Blanc " + +reference = snakemake.config["static_data_config"]["reference"]["path"] +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step]["picard"] + +collect_multiple_metrics_programs = { + "CollectAlignmentSummaryMetrics", + "CollectBaseDistributionByCycle", + "CollectGcBiasMetrics", + "CollectInsertSizeMetrics", + "CollectQualityYieldMetrics", + "CollectSequencingArtifactMetrics", + "MeanQualityByCycle", + "QualityScoreDistribution", +} +collect_multiple_metrics = " ".join( + [ + f"-PROGRAM {pgm}" + for pgm in collect_multiple_metrics_programs.intersection(set(config["programs"])) + ] +) + +# TODO: understand why snakemake.params is a list... +prefix = "" +if "prefix" in snakemake.params[0].keys() and snakemake.params[0]["prefix"]: + prefix = snakemake.params[0]["prefix"] + "." + +name = "null" +if "bait_name" in config.keys() and config["bait_name"]: + name = config["bait_name"] + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +d=$(ls $CONDA_PREFIX/share | grep picard) +picard_jar="$CONDA_PREFIX/share/$d/picard.jar" +if [[ ! -r $picard_jar ]] +then + echo "Can't find picard jar" + exit -1 +fi + +# Also pipe everything to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec &> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Setup auto-cleaned tmpdir +export tmpdir=$(mktemp -d) +trap "rm -rf $tmpdir" EXIT + +d=$(dirname {snakemake.output[0]}) + +if [[ -n "{collect_multiple_metrics}" ]] +then + # Setting METRIC_ACCUMULATION_LEVEL causes issues for some programs + java -jar $picard_jar CollectMultipleMetrics \ + -I {snakemake.input.bam} \ + -O $d/{prefix}CollectMultipleMetrics \ + -R {reference} \ + -FILE_EXTENSION .txt \ + -PROGRAM null \ + {collect_multiple_metrics} +fi + +if [[ "{config[programs]}" == *"EstimateLibraryComplexity"* ]] +then + java -jar $picard_jar EstimateLibraryComplexity \ + -I {snakemake.input.bam} \ + -O $d/{prefix}EstimateLibraryComplexity.txt +fi + +if [[ "{config[programs]}" == *"CollectJumpingLibraryMetrics"* ]] +then + java -jar $picard_jar CollectJumpingLibraryMetrics \ + -I {snakemake.input.bam} \ + -O $d/{prefix}CollectJumpingLibraryMetrics.txt +fi + +if [[ "{config[programs]}" == *"CollectOxoGMetrics"* ]] +then + if [[ -r "{snakemake.config[static_data_config][dbsnp][path]}" ]] + then + dbsnp="-DB_SNP {snakemake.config[static_data_config][dbsnp][path]}" + else + dbsnp="" + fi + java -jar $picard_jar CollectOxoGMetrics \ + -I {snakemake.input.bam} \ + -O $d/{prefix}CollectOxoGMetrics.txt \ + -R {reference} \ + $dbsnp +fi + +if [[ "{config[programs]}" == *"CollectHsMetrics"* ]] +then + java -jar $picard_jar CollectHsMetrics \ + -I {snakemake.input.bam} \ + -O $d/{prefix}CollectHsMetrics.txt \ + -R {reference} \ + -BAIT_SET_NAME {name} \ + -BAIT_INTERVALS {snakemake.input.baits} \ + -TARGET_INTERVALS {snakemake.input.targets} +fi + +if [[ "{config[programs]}" == *"CollectRawWgsMetrics"* ]] +then + java -jar $picard_jar CollectRawWgsMetrics \ + -I {snakemake.input.bam} \ + -O $d/{prefix}CollectRawWgsMetrics.txt \ + -R {reference} +fi + +if [[ "{config[programs]}" == *"CollectWgsMetrics"* ]] +then + java -jar $picard_jar CollectWgsMetrics \ + -I {snakemake.input.bam} \ + -O $d/{prefix}CollectWgsMetrics.txt \ + -R {reference} +fi + +if [[ "{config[programs]}" == *"CollectWgsMetricsWithNonZeroCoverage"* ]] +then + java -jar $picard_jar CollectWgsMetricsWithNonZeroCoverage \ + -I {snakemake.input.bam} \ + -O $d/{prefix}CollectWgsMetricsWithNonZeroCoverage.txt \ + -CHART $d/{prefix}CollectWgsMetricsWithNonZeroCoverage.pdf \ + -R {reference} +fi + +pushd $d +for f in $(ls *.txt) ; do + md5sum $f >$f.md5 +done +popd +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/picard/prepare/environment.yaml b/snappy_wrappers/wrappers/picard/prepare/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/picard/prepare/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/picard/prepare/wrapper.py b/snappy_wrappers/wrappers/picard/prepare/wrapper.py new file mode 100644 index 000000000..b6f146410 --- /dev/null +++ b/snappy_wrappers/wrappers/picard/prepare/wrapper.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +"""CUBI+Snakemake wrapper code for converting exome baits & targets from bed to interval lists +""" + +import os +import re + +from snakemake import shell + +__author__ = "Eric Blanc " + +reference = snakemake.config["static_data_config"]["reference"]["path"] +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step]["picard"] + +reference = re.sub("\.fa(sta)?(\.b?gz)?$", ".dict", reference) +assert os.path.exists(reference), "Missing dict of reference fasta" + +baits = config["path_to_baits"] +targets = config.get("path_to_targets", "") + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +d=$(ls $CONDA_PREFIX/share | grep picard) +picard_jar="$CONDA_PREFIX/share/$d/picard.jar" +if [[ ! -r $picard_jar ]] +then + echo "Can't find picar jar" + exit -1 +fi + +# Also pipe everything to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec &> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Setup auto-cleaned tmpdir +export tmpdir=$(mktemp -d) +trap "rm -rf $tmpdir" EXIT + +# Can't pipe to BedToIntervalList (https://github.com/broadinstitute/picard/issues/1890) +bed_to_interval_list() {{ + fn=$1 + f=$(basename $fn) + cut -f 1-3 $fn \ + | bedtools sort -i - \ + | bedtools merge -i - \ + > $tmpdir/$f + java -jar $picard_jar BedToIntervalList \ + -I $tmpdir/$f \ + -O /dev/stdout \ + -SD {reference} +}} + +md5() {{ + fn=$1 + d=$(dirname $fn) + f=$(basename $fn) + pushd $d 1> /dev/null 2>&1 + checksum=$(md5sum $f) + popd 1> /dev/null 2>&1 + echo $checksum +}} + +bed_to_interval_list {baits} > {snakemake.output.baits} +md5 {snakemake.output.baits} > {snakemake.output.baits}.md5 + +if [[ -n "{targets}" ]] +then + bed_to_interval_list {targets} > {snakemake.output.targets} + md5 {snakemake.output.targets} > {snakemake.output.targets}.md5 +else + ln -rs {snakemake.output.baits} {snakemake.output.targets} + ln -rs {snakemake.output.baits}.md5 {snakemake.output.targets}.md5 +fi +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/tests/snappy_pipeline/workflows/test_workflows_ngs_data_qc.py b/tests/snappy_pipeline/workflows/test_workflows_ngs_data_qc.py index 28a343e75..7056f602c 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_ngs_data_qc.py +++ b/tests/snappy_pipeline/workflows/test_workflows_ngs_data_qc.py @@ -9,6 +9,7 @@ from snappy_pipeline.workflows.ngs_data_qc import NgsDataQcWorkflow +from .common import get_expected_log_files_dict from .conftest import patch_module_fs @@ -24,8 +25,20 @@ def minimal_config(): path: /path/to/ref.fa step_config: + ngs_mapping: + tools: + dna: [bwa] ngs_data_qc: - tools: ['fastqc'] + tools: ['picard'] + picard: + path_ngs_mapping: /NGS_MAPPING + path_to_baits: /path/to/baits + path_to_targets: /path/to/targets + programs: + - CollectAlignmentSummaryMetrics + - CollectOxoGMetrics + - CollectHsMetrics + - CollectWgsMetrics data_sets: first_batch: @@ -53,6 +66,7 @@ def ngs_data_qc( mocker, ): """Return NgsDataQcWorkflow object pre-configured with germline sheet""" + dummy_workflow.globals = {"ngs_mapping": lambda x: "/NGS_MAPPING/" + x} # Patch out file-system related things in abstract (the crawling link in step is defined there) patch_module_fs("snappy_pipeline.workflows.abstract", germline_sheet_fake_fs, mocker) # Patch out files for aligner indices @@ -67,61 +81,98 @@ def ngs_data_qc( ) -# Tests for FastQcReportStepPart ------------------------------------------------------------------- +# Tests for PicardStepPart ------------------------------------------------------------------- -def test_fastqc_step_part_get_args(ngs_data_qc): - """Tests FastQcReportStepPart.get_args()""" +def test_picard_step_part_get_output_files(ngs_data_qc): + """Tests PicardStepPart.get_output_files() - prepare""" # Define expected - wildcards = Wildcards(fromdict={"library_name": "P001-N1-DNA1-WGS1"}) expected = { - "num_threads": 1, - "more_reads": [ - "work/input_links/P001-N1-DNA1-WGS1/FCXXXXXX/L001/P001_R1.fastq.gz", - "work/input_links/P001-N1-DNA1-WGS1/FCXXXXXX/L001/P001_R2.fastq.gz", - ], + "baits": "work/static_data/picard/out/baits.interval_list", + "targets": "work/static_data/picard/out/targets.interval_list", } - # Get actual and assert - actual = ngs_data_qc.get_args("fastqc", "run")(wildcards) + # Get actual + actual = ngs_data_qc.get_output_files("picard", "prepare") assert actual == expected -def test_fastqc_step_part_get_input_files(ngs_data_qc): - """Tests FastQcReportStepPart.get_input_files()""" +def test_picard_step_part_get_log_file(ngs_data_qc): + """Tests PicardStepPart.get_log_file() - prepare""" # Define expected - wildcards = Wildcards(fromdict={"library_name": "P001-N1-DNA1-WGS1"}) - expected = "work/input_links/P001-N1-DNA1-WGS1/.done" + expected = get_expected_log_files_dict( + base_out="work/static_data/picard/log/prepare", + extended=True, + ) + # Get actual + actual = ngs_data_qc.get_log_file("picard", "prepare") + assert actual == expected + + +def test_picard_step_part_get_input_files(ngs_data_qc): + """Tests PicardStepPart.get_input_files() - metrics""" + # Define expected + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-N1-DNA1-WGS1"}) + expected = { + "baits": "work/static_data/picard/out/baits.interval_list", + "targets": "work/static_data/picard/out/targets.interval_list", + "bam": "/NGS_MAPPING/output/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.bam", + } # Get actual and assert - actual = ngs_data_qc.get_input_files("fastqc", "run")(wildcards) + actual = ngs_data_qc.get_input_files("picard", "metrics")(wildcards) assert actual == expected -def test_fastqc_step_part_get_output_files(ngs_data_qc): - """Tests FastQcReportStepPart.get_output_files()""" +def test_picard_step_part_get_output_files(ngs_data_qc): + """Tests PicardStepPart.get_output_files() - metrics""" # Define expected - expected = {"fastqc_done": "work/{library_name}/report/fastqc/.done"} + base_out = "work/{mapper}.{library_name}/report/picard/{mapper}.{library_name}." + expected = { + "CollectAlignmentSummaryMetrics": base_out + + "CollectMultipleMetrics.alignment_summary_metrics.txt", + "CollectOxoGMetrics": base_out + "CollectOxoGMetrics.txt", + "CollectHsMetrics": base_out + "CollectHsMetrics.txt", + "CollectWgsMetrics": base_out + "CollectWgsMetrics.txt", + "CollectAlignmentSummaryMetrics_md5": base_out + + "CollectMultipleMetrics.alignment_summary_metrics.txt.md5", + "CollectOxoGMetrics_md5": base_out + "CollectOxoGMetrics.txt.md5", + "CollectHsMetrics_md5": base_out + "CollectHsMetrics.txt.md5", + "CollectWgsMetrics_md5": base_out + "CollectWgsMetrics.txt.md5", + } + # Get actual + actual = ngs_data_qc.get_output_files("picard", "metrics") + assert actual == expected + + +def test_picard_step_part_get_log_file(ngs_data_qc): + """Tests PicardStepPart.get_log_file() - metrics""" + # Define expected + expected = get_expected_log_files_dict( + base_out="work/{mapper}.{library_name}/log/picard/{mapper}.{library_name}", + extended=True, + ) # Get actual - actual = ngs_data_qc.get_output_files("fastqc", "run") + actual = dict(ngs_data_qc.get_log_file("picard", "metrics")) assert actual == expected -def test_fastqc_step_part_get_log_file(ngs_data_qc): - """Tests FastQcReportStepPart.get_log_file()""" +def test_picard_step_part_get_params(ngs_data_qc): + """Tests PicardStepPart.get_params() - metrics""" + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-N1-DNA1-WGS1"}) # Define expected - expected = "work/{library_name}/log/snakemake.fastqc.log" + expected = {"prefix": "bwa.P001-N1-DNA1-WGS1"} # Get actual - actual = ngs_data_qc.get_log_file("fastqc", "run") + actual = ngs_data_qc.get_params("picard", "metrics")(wildcards) assert actual == expected -def test_fastqc_step_part_get_resource_usage(ngs_data_qc): - """Tests FastQcReportStepPart.get_resource_usage()""" +def test_picard_step_part_get_resource_usage(ngs_data_qc): + """Tests PicardStepPart.get_resource_usage() - metrics""" # Define expected: default defined in workflow.abstract - expected_dict = {"threads": 1, "time": "01:00:00", "memory": "2G", "partition": "medium"} + expected_dict = {"threads": 1, "time": "24:00:00", "memory": "24G", "partition": "medium"} # Evaluate for resource, expected in expected_dict.items(): msg_error = f"Assertion error for resource '{resource}'." - actual = ngs_data_qc.get_resource("fastqc", "run", resource) + actual = ngs_data_qc.get_resource("picard", "metrics", resource) assert actual == expected, msg_error @@ -131,7 +182,7 @@ def test_fastqc_step_part_get_resource_usage(ngs_data_qc): def test_ngs_data_qc_workflow_steps(ngs_data_qc): """Tests simple functionality of the workflow: checks if sub steps are created.""" # Check created sub steps - expected = ["fastqc", "link_in", "link_out"] + expected = ["fastqc", "link_in", "link_out", "picard"] actual = list(sorted(ngs_data_qc.sub_steps.keys())) assert actual == expected @@ -140,6 +191,16 @@ def test_ngs_data_qc_workflow_files(ngs_data_qc): """Tests simple functionality of the workflow: checks if file structure is created according to the expected results from the tools.""" # Check result file construction - expected = [f"output/P00{i}-N1-DNA1-WGS1/report/fastqc/.done" for i in range(1, 7)] + expected = [ + f"output/bwa.P00{i}-N1-DNA1-WGS1/report/picard/bwa.P00{i}-N1-DNA1-WGS1.{metric}.txt{ext}" + for i in range(1, 7) + for metric in ( + "CollectHsMetrics", + "CollectMultipleMetrics.alignment_summary_metrics", + "CollectOxoGMetrics", + "CollectWgsMetrics", + ) + for ext in ("", ".md5") + ] actual = sorted(ngs_data_qc.get_result_files()) assert actual == expected diff --git a/tests/snappy_pipeline/workflows/test_workflows_ngs_data_qc_processed_fastq.py b/tests/snappy_pipeline/workflows/test_workflows_ngs_data_qc_processed_fastq.py index d3f797f4f..096d6b91e 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_ngs_data_qc_processed_fastq.py +++ b/tests/snappy_pipeline/workflows/test_workflows_ngs_data_qc_processed_fastq.py @@ -134,7 +134,7 @@ def test_fastqc_step_part_get_resource_usage(ngs_data_qc): def test_ngs_data_qc_workflow_steps(ngs_data_qc): """Tests simple functionality of the workflow: checks if sub steps are created.""" # Check created sub steps - expected = ["fastqc", "link_in", "link_out"] + expected = ["fastqc", "link_in", "link_out", "picard"] actual = list(sorted(ngs_data_qc.sub_steps.keys())) assert actual == expected From 4fd0c73c4bd75bf4aa5ef9a464713a2c5d4fada1 Mon Sep 17 00:00:00 2001 From: CuongPham <50145360+giacuong171@users.noreply.github.com> Date: Wed, 30 Aug 2023 22:49:21 +0700 Subject: [PATCH 11/19] feat: add missense TMB calculation (#432) Co-authored-by: giacuong171 --- .../somatic_variant_annotation/__init__.py | 4 +- .../tumor_mutational_burden/Snakefile | 2 + .../tumor_mutational_burden/__init__.py | 184 ++++++++++---- .../wrappers/bcftools/TMB/wrapper.py | 62 ++++- .../wrappers/vep/run/environment.yaml | 3 - .../workflows/test_tumor_mutational_burden.py | 239 ++++++++++++++++-- 6 files changed, 405 insertions(+), 89 deletions(-) diff --git a/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py b/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py index 73181a994..cce189e2f 100644 --- a/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py +++ b/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py @@ -75,7 +75,7 @@ EXT_NAMES = ("vcf", "vcf_tbi", "vcf_md5", "vcf_tbi_md5") #: Names of the annotator tools -TOOLS = ("jannovar", "vep") +ANNOTATION_TOOLS = ("jannovar", "vep") #: Default configuration for the somatic_variant_calling step DEFAULT_CONFIG = r""" @@ -336,7 +336,7 @@ def get_result_files(self): annotators = list( map( lambda x: x.replace("jannovar", "jannovar_annotate_somatic_vcf"), - set(self.config["tools"]) & set(TOOLS), + set(self.config["tools"]) & set(ANNOTATION_TOOLS), ) ) callers = set(self.config["tools_somatic_variant_calling"]) diff --git a/snappy_pipeline/workflows/tumor_mutational_burden/Snakefile b/snappy_pipeline/workflows/tumor_mutational_burden/Snakefile index 27da7d775..4ce18d68d 100644 --- a/snappy_pipeline/workflows/tumor_mutational_burden/Snakefile +++ b/snappy_pipeline/workflows/tumor_mutational_burden/Snakefile @@ -59,6 +59,8 @@ rule tumor_mutational_burden_calculation: memory=wf.get_resource("tmb_gathering", "run", "memory"), partition=wf.get_resource("tmb_gathering", "run", "partition"), tmpdir=wf.get_resource("tmb_gathering", "run", "tmpdir"), + params: + **{"args": wf.get_params("tmb_gathering", "run")}, log: **wf.get_log_file("tmb_gathering", "run"), wrapper: diff --git a/snappy_pipeline/workflows/tumor_mutational_burden/__init__.py b/snappy_pipeline/workflows/tumor_mutational_burden/__init__.py index c7176d8fa..0880ba37f 100644 --- a/snappy_pipeline/workflows/tumor_mutational_burden/__init__.py +++ b/snappy_pipeline/workflows/tumor_mutational_burden/__init__.py @@ -5,10 +5,13 @@ from biomedsheets.shortcuts import CancerCaseSheet, CancerCaseSheetOptions, is_not_background from snakemake.io import expand -from snappy_pipeline.base import UnsupportedActionException from snappy_pipeline.utils import dictify, listify from snappy_pipeline.workflows.abstract import BaseStep, BaseStepPart, LinkOutStepPart from snappy_pipeline.workflows.ngs_mapping import NgsMappingWorkflow, ResourceUsage +from snappy_pipeline.workflows.somatic_variant_annotation import ( + ANNOTATION_TOOLS, + SomaticVariantAnnotationWorkflow, +) from snappy_pipeline.workflows.somatic_variant_calling import ( SOMATIC_VARIANT_CALLERS_MATCHED, SomaticVariantCallingWorkflow, @@ -24,10 +27,13 @@ DEFAULT_CONFIG = r""" step_config: tumor_mutational_burden: - path_somatic_variant_calling: ../somatic_variant_calling # REQUIRED + has_annotation: 'TRUE' # REQUIRED + path_somatic_variant: ../somatic_variant_annotation # REQUIRED tools_ngs_mapping: [] # default to those configured for ngs_mapping tools_somatic_variant_calling: [] # default to those configured for somatic_variant_calling + tools_somatic_variant_annotation: [] # default to those configured for somatic_variant_annotation target_regions: # REQUIRED + missense_regex: '.*[\|&]missense_variant[\|&].*' #change if the annotation tool doesn't use 'missense_variant' to indicate missense variant """ @@ -56,23 +62,41 @@ def __init__(self, parent): @dictify def get_input_files(self, action): self._validate_action(action) - tpl = ( - "output/{mapper}.{var_caller}.{tumor_library}/out/" - "{mapper}.{var_caller}.{tumor_library}" - ) + # Adding part for runnng with annotation file instead of with variant calling file + if self.w_config["step_config"]["tumor_mutational_burden"]["has_annotation"] == "TRUE": + tpl = ( + "output/{mapper}.{var_caller}.{anno_tool}.{tumor_library}/out/" + "{mapper}.{var_caller}.{anno_tool}.{tumor_library}" + ) + else: + tpl = ( + "output/{mapper}.{var_caller}.{tumor_library}/out/" + "{mapper}.{var_caller}.{tumor_library}" + ) + key_ext = {"vcf": ".vcf.gz", "vcf_tbi": ".vcf.gz.tbi"} - variant_calling = self.parent.sub_workflows["somatic_variant_calling"] # read + # Adding part for runnng with annotation file instead of with variant calling file + if self.w_config["step_config"]["tumor_mutational_burden"]["has_annotation"] == "TRUE": + variant_path = self.parent.sub_workflows["somatic_variant_annotation"] + else: + variant_path = self.parent.sub_workflows["somatic_variant_calling"] for key, ext in key_ext.items(): - yield key, variant_calling(tpl + ext) + yield key, variant_path(tpl + ext) @dictify def get_output_files(self, action): # Validate action self._validate_action(action) - prefix = ( - "work/{mapper}.{var_caller}.tmb.{tumor_library}/out/" - "{mapper}.{var_caller}.tmb.{tumor_library}" - ) + if self.w_config["step_config"]["tumor_mutational_burden"]["has_annotation"] == "TRUE": + prefix = ( + "work/{mapper}.{var_caller}.{anno_tool}.tmb.{tumor_library}/out/" + "{mapper}.{var_caller}.{anno_tool}.tmb.{tumor_library}" + ) + else: + prefix = ( + "work/{mapper}.{var_caller}.tmb.{tumor_library}/out/" + "{mapper}.{var_caller}.tmb.{tumor_library}" + ) key_ext = {"json": ".json"} for key, ext in key_ext.items(): yield key, prefix + ext @@ -80,11 +104,17 @@ def get_output_files(self, action): @dictify def _get_log_file(self, action): - assert action == "run" - prefix = ( - "work/{mapper}.{var_caller}.tmb.{tumor_library}/log/" - "{mapper}.{var_caller}.tmb.{tumor_library}" - ) + self._validate_action(action) + if self.w_config["step_config"]["tumor_mutational_burden"]["has_annotation"] == "TRUE": + prefix = ( + "work/{mapper}.{var_caller}.{anno_tool}.tmb.{tumor_library}/log/" + "{mapper}.{var_caller}.{anno_tool}.tmb.{tumor_library}" + ) + else: + prefix = ( + "work/{mapper}.{var_caller}.tmb.{tumor_library}/log/" + "{mapper}.{var_caller}.tmb.{tumor_library}" + ) key_ext = ( ("log", ".log"), @@ -95,16 +125,7 @@ def _get_log_file(self, action): yield key, prefix + ext def get_resource_usage(self, action): - """Get Resource Usage - :param action: Action (i.e., step) in the workflow, example: 'run'. - :type action: str - :return: Returns ResourceUsage for step. - :raises UnsupportedActionException: if action not in class defined list of valid actions. - """ - if action not in self.actions: - actions_str = ", ".join(self.actions) - error_message = f"Action '{action}' is not supported. Valid options: {actions_str}" - raise UnsupportedActionException(error_message) + self._validate_action(action) mem_mb = 4 * 1024 # 4GB return ResourceUsage( threads=2, @@ -112,6 +133,15 @@ def get_resource_usage(self, action): memory=f"{mem_mb}M", ) + def get_params(self, action): + self._validate_action(action) + return getattr(self, "_get_params_run") + + def _get_params_run(self, wildcards): + return { + "missense_re": self.w_config["step_config"]["tumor_mutational_burden"]["missense_regex"] + } + class TumorMutationalBurdenCalculationWorkflow(BaseStep): """Perform TMB calculation""" @@ -134,15 +164,27 @@ def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir) config_lookup_paths, config_paths, workdir, - (SomaticVariantCallingWorkflow, NgsMappingWorkflow), + (SomaticVariantCallingWorkflow, SomaticVariantAnnotationWorkflow, NgsMappingWorkflow), ) # Register sub step classes so the sub steps are available self.register_sub_step_classes((TumorMutationalBurdenCalculationStepPart, LinkOutStepPart)) # Register sub workflows - self.register_sub_workflow( - "somatic_variant_calling", - self.w_config["step_config"]["tumor_mutational_burden"]["path_somatic_variant_calling"], - ) + if self.w_config["step_config"]["tumor_mutational_burden"]["has_annotation"] == "TRUE": + self.register_sub_workflow( + "somatic_variant_annotation", + self.w_config["step_config"]["tumor_mutational_burden"]["path_somatic_variant"], + ) + if not self.w_config["step_config"]["tumor_mutational_burden"][ + "tools_somatic_variant_annotation" + ]: + self.w_config["step_config"]["tumor_mutational_burden"][ + "tools_somatic_variant_annotation" + ] = self.w_config["step_config"]["somatic_variant_annotation"]["tools"] + else: + self.register_sub_workflow( + "somatic_variant_calling", + self.w_config["step_config"]["tumor_mutational_burden"]["path_somatic_variant"], + ) # Copy over "tools" setting from somatic_variant_calling/ngs_mapping if not set here if not self.w_config["step_config"]["tumor_mutational_burden"]["tools_ngs_mapping"]: self.w_config["step_config"]["tumor_mutational_burden"][ @@ -160,26 +202,55 @@ def get_result_files(self): callers = set( self.w_config["step_config"]["tumor_mutational_burden"]["tools_somatic_variant_calling"] ) - name_pattern = "{mapper}.{caller}.tmb.{tumor_library.name}" - yield from self._yield_result_files_matched( - os.path.join("output", name_pattern, "out", name_pattern + "{ext}"), - mapper=self.w_config["step_config"]["tumor_mutational_burden"]["tools_ngs_mapping"], - caller=callers & set(SOMATIC_VARIANT_CALLERS_MATCHED), - ext=EXT_VALUES, - ) - yield from self._yield_result_files_matched( - os.path.join("output", name_pattern, "log", name_pattern + "{ext}"), - mapper=self.w_config["step_config"]["tumor_mutational_burden"]["tools_ngs_mapping"], - caller=callers & set(SOMATIC_VARIANT_CALLERS_MATCHED), - ext=( - ".log", - ".log.md5", - ".conda_info.txt", - ".conda_info.txt.md5", - ".conda_list.txt", - ".conda_list.txt.md5", - ), - ) + if self.w_config["step_config"]["tumor_mutational_burden"]["has_annotation"] == "TRUE": + anno_callers = set( + self.w_config["step_config"]["tumor_mutational_burden"][ + "tools_somatic_variant_annotation" + ] + ) + name_pattern = "{mapper}.{caller}.{anno_caller}.tmb.{tumor_library.name}" + yield from self._yield_result_files_matched( + os.path.join("output", name_pattern, "out", name_pattern + "{ext}"), + mapper=self.w_config["step_config"]["tumor_mutational_burden"]["tools_ngs_mapping"], + caller=callers & set(SOMATIC_VARIANT_CALLERS_MATCHED), + anno_caller=anno_callers & set(ANNOTATION_TOOLS), + ext=EXT_VALUES, + ) + yield from self._yield_result_files_matched( + os.path.join("output", name_pattern, "log", name_pattern + "{ext}"), + mapper=self.w_config["step_config"]["tumor_mutational_burden"]["tools_ngs_mapping"], + caller=callers & set(SOMATIC_VARIANT_CALLERS_MATCHED), + anno_caller=anno_callers & set(ANNOTATION_TOOLS), + ext=( + ".log", + ".log.md5", + ".conda_info.txt", + ".conda_info.txt.md5", + ".conda_list.txt", + ".conda_list.txt.md5", + ), + ) + else: + name_pattern = "{mapper}.{caller}.tmb.{tumor_library.name}" + yield from self._yield_result_files_matched( + os.path.join("output", name_pattern, "out", name_pattern + "{ext}"), + mapper=self.w_config["step_config"]["tumor_mutational_burden"]["tools_ngs_mapping"], + caller=callers & set(SOMATIC_VARIANT_CALLERS_MATCHED), + ext=EXT_VALUES, + ) + yield from self._yield_result_files_matched( + os.path.join("output", name_pattern, "log", name_pattern + "{ext}"), + mapper=self.w_config["step_config"]["tumor_mutational_burden"]["tools_ngs_mapping"], + caller=callers & set(SOMATIC_VARIANT_CALLERS_MATCHED), + ext=( + ".log", + ".log.md5", + ".conda_info.txt", + ".conda_info.txt.md5", + ".conda_list.txt", + ".conda_list.txt.md5", + ), + ) def _yield_result_files_matched(self, tpl, **kwargs): """Build output paths from path template and extension list. @@ -208,8 +279,8 @@ def _yield_result_files_matched(self, tpl, **kwargs): def check_config(self): """Check that the path to the NGS mapping is present""" self.ensure_w_config( - ("step_config", "tumor_mutational_burden", "path_somatic_variant_calling"), - "Path to variant calling not configured but required for tmb calculation", + ("step_config", "tumor_mutational_burden", "path_somatic_variant"), + "Path to variant (directory of vcf files) not configured but required for tmb calculation", ) self.ensure_w_config( @@ -217,3 +288,8 @@ def check_config(self): "Path to target_regions file (bed format)" "not configured but required for tmb calculation", ) + + self.ensure_w_config( + ("step_config", "tumor_mutational_burden", "has_annotation"), + "TMB needs to know wether the vcf is annotated or not", + ) diff --git a/snappy_wrappers/wrappers/bcftools/TMB/wrapper.py b/snappy_wrappers/wrappers/bcftools/TMB/wrapper.py index 6bd7a88ba..f4ab3db0b 100644 --- a/snappy_wrappers/wrappers/bcftools/TMB/wrapper.py +++ b/snappy_wrappers/wrappers/bcftools/TMB/wrapper.py @@ -7,6 +7,12 @@ __author__ = "Pham Gia Cuong" __email__ = "pham.gia-cuong@bih-charite.de" +missense_re = ( + snakemake.params.args["missense_re"] + if "args" in snakemake.params.keys() and "missense_re" in snakemake.params.args.keys() + else "" +) + shell( r""" # ----------------------------------------------------------------------------- @@ -33,23 +39,53 @@ number_indels=$(bcftools view -R $bed_file -v indels --threads 2 -H {snakemake.input.vcf}| wc -l) number_variants=$(bcftools view -R $bed_file --threads 2 -H {snakemake.input.vcf}| wc -l) +if [[ -n "{missense_re}" ]] +then + number_missense_variants=$(bcftools view -R $bed_file --threads 2 -H {snakemake.input.vcf}| grep -E '{missense_re}' | wc -l) +fi + TMB=`echo "1000000*($number_variants/$total_exom_length)" | bc -l ` -cat << EOF > {snakemake.output.json} -{ -"Library_name": {snakemake.wildcards.tumor_library}, -"VCF_file": $name_vcf, -"VCF_md5": $vcf_md5, -"BED_file": $bed_file_name, -"BED_md5": $bed_md5, -"TMB": $TMB, -"Number_variants": $number_variants, -"Number_snvs": $number_snvs, -"Number_indels": $number_indels, -"Total_regions_length": $total_exom_length +missense_TMB=`echo "1000000*($number_missense_variants/$total_exom_length)" | bc -l ` +if [[ {snakemake.config[step_config][tumor_mutational_burden][has_annotation]} == "TRUE" ]] +then + out_file=$(cat << EOF + {{ + "Library_name": {snakemake.wildcards.tumor_library}, + "VCF_file": $name_vcf, + "VCF_md5": $vcf_md5, + "BED_file": $bed_file_name, + "BED_md5": $bed_md5, + "TMB": $TMB, + "missense_TMB": $missense_TMB, + "Number_variants": $number_variants, + "Number_snvs": $number_snvs, + "Number_indels": $number_indels, + "Total_regions_length": $total_exom_length + }} EOF + ) + echo $out_file > {snakemake.output.json} +else + out_file=$(cat << EOF + {{ + "Library_name": {snakemake.wildcards.tumor_library}, + "VCF_file": $name_vcf, + "VCF_md5": $vcf_md5, + "BED_file": $bed_file_name, + "BED_md5": $bed_md5, + "TMB": $TMB, + "Number_variants": $number_variants, + "Number_snvs": $number_snvs, + "Number_indels": $number_indels, + "Total_regions_length": $total_exom_length + }} +EOF + ) + echo $out_file > {snakemake.output.json} +fi + pushd $(dirname {snakemake.output.json}) md5sum $(basename {snakemake.output.json}) > $(basename {snakemake.output.json_md5}) -} """ ) diff --git a/snappy_wrappers/wrappers/vep/run/environment.yaml b/snappy_wrappers/wrappers/vep/run/environment.yaml index 48f171edf..711e58eec 100644 --- a/snappy_wrappers/wrappers/vep/run/environment.yaml +++ b/snappy_wrappers/wrappers/vep/run/environment.yaml @@ -1,8 +1,5 @@ channels: - - conda-forge - bioconda dependencies: - - python - ensembl-vep=102 - - htslib diff --git a/tests/snappy_pipeline/workflows/test_tumor_mutational_burden.py b/tests/snappy_pipeline/workflows/test_tumor_mutational_burden.py index e338ac0a6..e9aa46b22 100644 --- a/tests/snappy_pipeline/workflows/test_tumor_mutational_burden.py +++ b/tests/snappy_pipeline/workflows/test_tumor_mutational_burden.py @@ -14,8 +14,9 @@ from .conftest import patch_module_fs +# Test tumor mutational burden calculation with vcf file from somatic variant calling step @pytest.fixture(scope="module") # otherwise: performance issues -def minimal_config(): +def minimal_config_calling(): """Return YAML parsing result for configuration""" yaml = ruamel_yaml.YAML() return yaml.load( @@ -46,8 +47,9 @@ def minimal_config(): path_target_regions: /path/to/target/regions.bed tumor_mutational_burden: - path_somatic_variant_calling: ../somatic_variant_calling + path_somatic_variant: ../somatic_variant_calling tools_ngs_mapping: [] + has_annotation: 'FALSE' # REQUIRED tools_somatic_variant_calling: [] target_regions: /path/to/regions.bed @@ -65,9 +67,9 @@ def minimal_config(): @pytest.fixture -def tumor_mutational_burden_workflow( +def tumor_mutational_burden_workflow_calling( dummy_workflow, - minimal_config, + minimal_config_calling, config_lookup_paths, work_dir, config_paths, @@ -86,7 +88,7 @@ def tumor_mutational_burden_workflow( # Construct the workflow object return TumorMutationalBurdenCalculationWorkflow( dummy_workflow, - minimal_config, + minimal_config_calling, config_lookup_paths, config_paths, work_dir, @@ -96,7 +98,9 @@ def tumor_mutational_burden_workflow( # Tests for TumorMutationalBurdenCalculationStepPart ----------------------------------------------------- -def test_tumor_mutational_step_part_get_input_files(tumor_mutational_burden_workflow): +def test_tumor_mutational_step_part_get_input_files_calling( + tumor_mutational_burden_workflow_calling, +): """Test TumorMutationalBurdenCalculationStepPart.get_input_files()""" base_out = ( "SOMATIC_VARIANT_CALLING/output/{mapper}.{var_caller}.{tumor_library}/out/" @@ -106,34 +110,36 @@ def test_tumor_mutational_step_part_get_input_files(tumor_mutational_burden_work "vcf": base_out + ".vcf.gz", "vcf_tbi": base_out + ".vcf.gz.tbi", } - actual = tumor_mutational_burden_workflow.get_input_files("tmb_gathering", "run") + actual = tumor_mutational_burden_workflow_calling.get_input_files("tmb_gathering", "run") assert actual == expected -def test_tumor_mutational_step_part_get_output_files(tumor_mutational_burden_workflow): +def test_tumor_mutational_step_part_get_output_files_calling( + tumor_mutational_burden_workflow_calling, +): """Tests TumorMutationalBurdenCalculationStepPart.get_output_files()""" base_out = ( "work/{mapper}.{var_caller}.tmb.{tumor_library}/out/" "{mapper}.{var_caller}.tmb.{tumor_library}" ) expected = get_expected_output_json_files_dict(base_out=base_out) - actual = tumor_mutational_burden_workflow.get_output_files("tmb_gathering", "run") + actual = tumor_mutational_burden_workflow_calling.get_output_files("tmb_gathering", "run") assert actual == expected -def test_tumor_mutational_step_part_get_log_files(tumor_mutational_burden_workflow): +def test_tumor_mutational_step_part_get_log_files_calling(tumor_mutational_burden_workflow_calling): """Tests TumorMutationalBurdenCalculationStepPart.get_log_files()""" base_out = ( "work/{mapper}.{var_caller}.tmb.{tumor_library}/log/" "{mapper}.{var_caller}.tmb.{tumor_library}" ) expected = get_expected_log_files_dict(base_out=base_out) - actual = tumor_mutational_burden_workflow.get_log_file("tmb_gathering", "run") + actual = tumor_mutational_burden_workflow_calling.get_log_file("tmb_gathering", "run") assert actual == expected -def test_tumor_mutational_step_part_get_resource_usage( - tumor_mutational_burden_workflow, +def test_tumor_mutational_step_part_get_resource_usage_calling( + tumor_mutational_burden_workflow_calling, ): """Tests TumorMutationalBurdenCalculationStepPart.get_resource_usage()""" # Define expected @@ -141,18 +147,20 @@ def test_tumor_mutational_step_part_get_resource_usage( # Evaluate for resource, expected in expected_dict.items(): msg_error = f"Assertion error for resource '{resource}'." - actual = tumor_mutational_burden_workflow.get_resource("tmb_gathering", "run", resource) + actual = tumor_mutational_burden_workflow_calling.get_resource( + "tmb_gathering", "run", resource + ) assert actual == expected, msg_error # Tests for TumorMutationalBurdenCalculationWorkflow ------------------------------------------------------- -def test_tumor_mutational_burden_workflow(tumor_mutational_burden_workflow): +def test_tumor_mutational_burden_workflow_calling(tumor_mutational_burden_workflow_calling): """Test simple functionality of the workflow""" # Check created sub steps expected = ["link_out", "tmb_gathering"] - actual = list(sorted(tumor_mutational_burden_workflow.sub_steps.keys())) + actual = list(sorted(tumor_mutational_burden_workflow_calling.sub_steps.keys())) assert actual == expected # Check result file construction @@ -182,5 +190,202 @@ def test_tumor_mutational_burden_workflow(tumor_mutational_burden_workflow): for var_caller in ("mutect2", "scalpel") ] expected = list(sorted(expected)) - actual = list(sorted(tumor_mutational_burden_workflow.get_result_files())) + actual = list(sorted(tumor_mutational_burden_workflow_calling.get_result_files())) + assert expected == actual + + +# Test Tumor mutatinal burden calculation with vcf file from somatic variant annotation step +@pytest.fixture(scope="module") # otherwise: performance issues +def minimal_config_annotation(): + """Return YAML parsing result for configuration""" + yaml = ruamel_yaml.YAML() + return yaml.load( + textwrap.dedent( + r""" + static_data_config: + reference: + path: /path/to/ref.fa + cosmic: + path: /path/to/cosmic.vcf.gz + dbsnp: + path: /path/to/dbsnp.vcf.gz + + step_config: + ngs_mapping: + tools: + dna: ['bwa'] + compute_coverage_bed: true + path_target_regions: /path/to/regions.bed + bwa: + path_index: /path/to/bwa/index.fa + + somatic_variant_calling: + tools: + - mutect2 + - scalpel + scalpel: + path_target_regions: /path/to/target/regions.bed + + somatic_variant_annotation: + tools: ["jannovar", "vep"] + jannovar: + path_jannovar_ser: /path/to/jannover.ser + vep: + path_dir_cache: /path/to/dir/cache + + tumor_mutational_burden: + path_somatic_variant: ../somatic_variant_annotation # REQUIRED + has_annotation: 'TRUE' # REQUIRED + tools_ngs_mapping: [] # default to those configured for ngs_mapping + tools_somatic_variant_calling: [] # default to those configured for somatic_variant_calling + tools_somatic_variant_annotation: [] # default to those configured for somatic_variant_annotation + target_regions: /path/to/regions.bed # REQUIRED + + data_sets: + first_batch: + file: sheet.tsv + search_patterns: + - {'left': '*/*/*_R1.fastq.gz', 'right': '*/*/*_R2.fastq.gz'} + search_paths: ['/path'] + type: matched_cancer + naming_scheme: only_secondary_id + """ + ).lstrip() + ) + + +@pytest.fixture +def tumor_mutational_burden_workflow_annotation( + dummy_workflow, + minimal_config_annotation, + config_lookup_paths, + work_dir, + config_paths, + cancer_sheet_fake_fs, + mocker, +): + """Return TumorMutationalBurdenCalculationWorkflow object pre-configured with cancer sheet""" + # Patch out file-system related things in abstract (the crawling link in step is defined there) + patch_module_fs("snappy_pipeline.workflows.abstract", cancer_sheet_fake_fs, mocker) + # Update the "globals" attribute of the mock workflow (snakemake.workflow.Workflow) so we + # can obtain paths from the function as if we really had a NGSMappingPipelineStep there + dummy_workflow.globals = { + "ngs_mapping": lambda x: "NGS_MAPPING/" + x, + "somatic_variant_calling": lambda x: "SOMATIC_VARIANT_CALLING/" + x, + "somatic_variant_annotation": lambda x: "SOMATIC_VARIANT_ANNOTATION/" + x, + } + # Construct the workflow object + return TumorMutationalBurdenCalculationWorkflow( + dummy_workflow, + minimal_config_annotation, + config_lookup_paths, + config_paths, + work_dir, + ) + + +# Tests for TumorMutationalBurdenCalculationStepPart ----------------------------------------------------- + + +def test_tumor_mutational_step_part_get_input_files_annotation( + tumor_mutational_burden_workflow_annotation, +): + """Test TumorMutationalBurdenCalculationStepPart.get_input_files()""" + base_out = ( + "SOMATIC_VARIANT_ANNOTATION/output/{mapper}.{var_caller}.{anno_tool}.{tumor_library}/out/" + "{mapper}.{var_caller}.{anno_tool}.{tumor_library}" + ) + expected = { + "vcf": base_out + ".vcf.gz", + "vcf_tbi": base_out + ".vcf.gz.tbi", + } + actual = tumor_mutational_burden_workflow_annotation.get_input_files("tmb_gathering", "run") + assert actual == expected + + +def test_tumor_mutational_step_part_get_output_files_annotation( + tumor_mutational_burden_workflow_annotation, +): + """Tests TumorMutationalBurdenCalculationStepPart.get_output_files()""" + base_out = ( + "work/{mapper}.{var_caller}.{anno_tool}.tmb.{tumor_library}/out/" + "{mapper}.{var_caller}.{anno_tool}.tmb.{tumor_library}" + ) + expected = get_expected_output_json_files_dict(base_out=base_out) + actual = tumor_mutational_burden_workflow_annotation.get_output_files("tmb_gathering", "run") + assert actual == expected + + +def test_tumor_mutational_step_part_get_log_files_annotation( + tumor_mutational_burden_workflow_annotation, +): + """Tests TumorMutationalBurdenCalculationStepPart.get_log_files()""" + base_out = ( + "work/{mapper}.{var_caller}.{anno_tool}.tmb.{tumor_library}/log/" + "{mapper}.{var_caller}.{anno_tool}.tmb.{tumor_library}" + ) + expected = get_expected_log_files_dict(base_out=base_out) + actual = tumor_mutational_burden_workflow_annotation.get_log_file("tmb_gathering", "run") + assert actual == expected + + +def test_tumor_mutational_step_part_get_resource_usage_annotation( + tumor_mutational_burden_workflow_annotation, +): + """Tests TumorMutationalBurdenCalculationStepPart.get_resource_usage()""" + # Define expected + expected_dict = {"threads": 2, "time": "1:00:00", "memory": "4096M"} + # Evaluate + for resource, expected in expected_dict.items(): + msg_error = f"Assertion error for resource '{resource}'." + actual = tumor_mutational_burden_workflow_annotation.get_resource( + "tmb_gathering", "run", resource + ) + assert actual == expected, msg_error + + +# Tests for TumorMutationalBurdenCalculationWorkflow ------------------------------------------------------- + + +def test_tumor_mutational_burden_workflow_annotation(tumor_mutational_burden_workflow_annotation): + """Test simple functionality of the workflow""" + # Check created sub steps + expected = ["link_out", "tmb_gathering"] + actual = list(sorted(tumor_mutational_burden_workflow_annotation.sub_steps.keys())) + assert actual == expected + + # Check result file construction + tpl = ( + "output/{mapper}.{var_caller}.{anno_tool}.tmb.P00{i}-T{t}-DNA1-WGS1/{dir_}/" + "{mapper}.{var_caller}.{anno_tool}.tmb.P00{i}-T{t}-DNA1-WGS1.{ext}" + ) + expected = [ + tpl.format( + mapper=mapper, var_caller=var_caller, anno_tool=anno_tool, i=i, t=t, ext=ext, dir_="out" + ) + for i, t in ((1, 1), (2, 1), (2, 2)) + for ext in ("json", "json.md5") + for mapper in ("bwa",) + for var_caller in ("mutect2", "scalpel") + for anno_tool in ("jannovar", "vep") + ] + expected += [ + tpl.format( + mapper=mapper, var_caller=var_caller, anno_tool=anno_tool, i=i, t=t, ext=ext, dir_="log" + ) + for i, t in ((1, 1), (2, 1), (2, 2)) + for ext in ( + "conda_info.txt", + "conda_list.txt", + "log", + "conda_info.txt.md5", + "conda_list.txt.md5", + "log.md5", + ) + for mapper in ("bwa",) + for var_caller in ("mutect2", "scalpel") + for anno_tool in ("jannovar", "vep") + ] + expected = list(sorted(expected)) + actual = list(sorted(tumor_mutational_burden_workflow_annotation.get_result_files())) assert expected == actual From ac1a34f44addde7a654a8df991a964c2d41dda37 Mon Sep 17 00:00:00 2001 From: Max Xiaohang Zhao Date: Wed, 13 Sep 2023 15:52:03 +0200 Subject: [PATCH 12/19] docs: add warning for writing new workflow steps (#400) --- docs/dev_intro.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/dev_intro.rst b/docs/dev_intro.rst index 33c5c2fa8..4a7f6a32d 100644 --- a/docs/dev_intro.rst +++ b/docs/dev_intro.rst @@ -99,6 +99,9 @@ Usually, you define a :class:`BaseStep ` instance as the values for the ``input:``, ``output:``, etc. sections of your ``Snakefile``. +.. warning:: + By convention your new Workflow step should be instantiated as ``wf = StepClass(...)`` in the ``Snakefile`` during object setup. Otherwise tools including cubi-tk might not be able to detect and parse your step. See existing workflow ``Snakefile`` for reference. + The :class:`BaseStep ` sub class itself uses :class:`BaseStepPart ` sub classes for the implementation of the individual parts. One part might be linking in FASTQ files from the raw input directory or linking from the ``work/`` to the ``output/`` directory. Another part might be the somatic variant calling using mutect or WGS SV calling using Delly2. From c28d67e23246d319fa88a20331d2324eee379a9f Mon Sep 17 00:00:00 2001 From: ericblanc20 Date: Thu, 14 Sep 2023 12:05:22 +0200 Subject: [PATCH 13/19] feat: 438 vep annotation order (#441) --- .../workflows/cbioportal_export/__init__.py | 9 +- .../somatic_variant_annotation/Snakefile | 2 +- .../somatic_variant_annotation/__init__.py | 63 +++++- .../wrappers/cbioportal/merge_tables/script.R | 7 +- .../jannovar/annotate_somatic_vcf/wrapper.py | 14 +- .../vcf2maf/vcf_to_table/jannovar.yaml | 1 + .../vcf_to_table/protein_mutation_parser.py | 32 ++- .../wrappers/vcf2maf/vcf_to_table/vep.yaml | 1 + .../wrappers/vep/post_filter/wrapper.py | 195 ++++++++++++++++++ snappy_wrappers/wrappers/vep/run/wrapper.py | 30 ++- .../test_workflows_cbioportal_export.py | 10 +- ...st_workflows_somatic_variant_annotation.py | 12 ++ 12 files changed, 345 insertions(+), 31 deletions(-) create mode 100644 snappy_wrappers/wrappers/vep/post_filter/wrapper.py diff --git a/snappy_pipeline/workflows/cbioportal_export/__init__.py b/snappy_pipeline/workflows/cbioportal_export/__init__.py index a864151fa..d5889f5c6 100644 --- a/snappy_pipeline/workflows/cbioportal_export/__init__.py +++ b/snappy_pipeline/workflows/cbioportal_export/__init__.py @@ -5,9 +5,6 @@ snappy_pipeline. It does the necessary data transformations to comply with the formats expected by cBioPortal and writes out the necessary metadata and data files. - -The output is a archive (tarball) that can be uploaded to a cbioportal instance -for import. """ from collections import OrderedDict @@ -436,11 +433,11 @@ def __init__(self, parent): def get_args(self, action): # Validate action self._validate_action(action) - if action == "gistic": - return {"action_type": "gistic", "extra_args": {"pipeline_id": "ENSEMBL"}} if action == "log2": + return {"action_type": "log2", "extra_args": {"pipeline_id": "ENSEMBL"}} + if action == "gistic": return { - "action_type": "log2", + "action_type": "gistic", "extra_args": { "pipeline_id": "ENSEMBL", "amplification": "9", diff --git a/snappy_pipeline/workflows/somatic_variant_annotation/Snakefile b/snappy_pipeline/workflows/somatic_variant_annotation/Snakefile index ebf7d89ed..a0dd7e158 100644 --- a/snappy_pipeline/workflows/somatic_variant_annotation/Snakefile +++ b/snappy_pipeline/workflows/somatic_variant_annotation/Snakefile @@ -92,7 +92,7 @@ rule somatic_variant_annotation_jannovar_annotate_somatic_vcf: log: **wf.get_log_file("jannovar", "annotate_somatic_vcf"), wrapper: - wf.wrapper_path("jannovar_par/annotate_somatic_vcf") + wf.wrapper_path("jannovar/annotate_somatic_vcf") # Variant Statistics Computation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py b/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py index cce189e2f..df2a2d6f7 100644 --- a/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py +++ b/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py @@ -26,7 +26,31 @@ Step Output =========== -TODO +Users can annotate all genes & transcripts overlapping with the variant locus, or +they can select one representative gene and transcript for annotation. +In the latter case, the output vcf file will only contain one annotation per variant, while +in the former case, there might be over 100 annotations for each variant. + +The ordering of features driving the representative annotation choice is under user control. +The default order is: + +1. ``biotype``: protein coding genes come first, it is unclear what is the order for other types of genes +2. ``mane``: the `MANE transcript `_ is selected before other transcripts +3. ``appris``: the `APPRIS principal isoform `_ is selected before alternates +4. ``tsl``: `Transcript Support Level `_ values in increasing order +5. ``ccds``: Transcripts with `CCDS `_ ids are selected before those without +6. ``canonical``: ENSEMBL canonical transcripts are selected before the others +7. ``rank``: VEP internal ranking is used +8. ``length``: longer transcripts are preferred to shorter ones + +This order is (hopefully) suitable for cBioPortal export, as well defined transcripts from protein-coding genes are selected when possible. +However, it is recommended to check the full annotation for variants in or nearby disease-relevant genes. + +All annotators generate a vcf with one annotation per transcript, and some annotators +(only ENSEMBL's Variant Effect Predictor in the current implementation) can also produce another +output containing all annotations. +The single annotation vcf is named ``...vcf.gz`` and +the full annotation output is named ``...full.vcf.gz`` ==================== Global Configuration @@ -115,7 +139,7 @@ assembly: GRCh38 cache_version: 102 # WARNING- this must match the wrapper's vep version! tx_flag: "gencode_basic" # The flag selecting the transcripts. One of "gencode_basic", "refseq", and "merged". - pick: yes # Other option: no (report one or all consequences) + pick_order: ["biotype", "mane", "appris", "tsl", "ccds", "canonical", "rank", "length"] num_threads: 8 buffer_size: 1000 output_options: @@ -131,6 +155,9 @@ class AnnotateSomaticVcfStepPart(BaseStepPart): The ``tumor_library`` wildcard can actually be the name of a donor! """ + #: Only creates vcf with one annotation per variant + has_full = False + def __init__(self, parent): super().__init__(parent) # Build shortcut from cancer bio sample name to matched cancre sample @@ -169,6 +196,9 @@ def get_output_files(self, action): "{{mapper}}.{{var_caller}}.{annotator}.{{tumor_library}}" ).format(annotator=self.annotator) key_ext = {"vcf": ".vcf.gz", "vcf_tbi": ".vcf.gz.tbi"} + if self.has_full: + key_ext["full"] = ".full.vcf.gz" + key_ext["full_tbi"] = ".full.vcf.gz.tbi" for key, ext in key_ext.items(): yield key, prefix + ext yield key + "_md5", prefix + ext + ".md5" @@ -261,6 +291,12 @@ class VepAnnotateSomaticVcfStepPart(AnnotateSomaticVcfStepPart): #: Class available actions actions = ("run",) + #: Also creates vcf with all annotations + has_full = True + + #: Allowed keywords for pick order + PICK_ORDER = ("biotype", "mane", "appris", "tsl", "ccds", "canonical", "rank", "length") + def get_resource_usage(self, action): """Get Resource Usage @@ -282,8 +318,10 @@ def check_config(self): return if not self.config["vep"]["tx_flag"] in ("merged", "refseq", "gencode_basic"): raise InvalidConfiguration("tx_flag must be 'gencode_basic', or 'merged' or 'refseq'") - if not self.config["vep"]["pick"] in ("yes", "no"): - raise InvalidConfiguration("pick must be either 'yes' or 'no'") + if not all([x in self.PICK_ORDER for x in self.config["vep"]["pick_order"]]): + raise InvalidConfiguration( + "pick order keywords must be in {}".format(", ".join(self.PICK_ORDER)) + ) class SomaticVariantAnnotationWorkflow(BaseStep): @@ -362,6 +400,23 @@ def get_result_files(self): ".conda_list.txt.md5", ), ) + # Annotators with full output + full = list( + map( + lambda x: x.replace("jannovar", "jannovar_annotate_somatic_vcf"), + filter( + lambda x: self.sub_steps[x].has_full, + set(self.config["tools"]) & set(ANNOTATION_TOOLS), + ), + ) + ) + yield from self._yield_result_files_matched( + os.path.join("output", name_pattern, "out", name_pattern + ".full{ext}"), + mapper=self.config["tools_ngs_mapping"], + caller=callers & set(SOMATIC_VARIANT_CALLERS_MATCHED), + annotator=full, + ext=EXT_VALUES, + ) # joint calling name_pattern = "{mapper}.{caller}.{annotator}.{donor.name}" yield from self._yield_result_files_joint( diff --git a/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R b/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R index 0b0aada8a..a48a5a848 100644 --- a/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R +++ b/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R @@ -37,13 +37,13 @@ merge_tables <- function(fns, mappings, type=c("log2", "gistic", "segment", "exp } if (type == "gistic") { - stopifnot(all(c("pipeline_id") %in% names(args))) + stopifnot(all(c("pipeline_id", "amplification") %in% names(args))) # Copy numbers (in "cn" column) are transformed into (pseudo-) gistic codes: # 0: Deep deletion, 1: heterozygous deletion, 2: copy number neutral, 3: gain, 4: amplification # In https://doi.org/10.1038/s41586-022-04738-6, the amplification is defined as # copy number greater or equal to 9 copies (args$amplification = 9). args$amplification <- as.numeric(args$amplification) - cn <- read_sample_files(fns, args$pipeline_id, "cn") + cn <- round(read_sample_files(fns, args$pipeline_id, "cn")) cn[args$amplification<=cn] <- args$amplification cn[2 $f.md5 +md5sum $f.tbi > $f.tbi.md5 +popd +""" +) diff --git a/snappy_wrappers/wrappers/vep/run/wrapper.py b/snappy_wrappers/wrappers/vep/run/wrapper.py index 6c46f87de..f4308d9b1 100644 --- a/snappy_wrappers/wrappers/vep/run/wrapper.py +++ b/snappy_wrappers/wrappers/vep/run/wrapper.py @@ -10,8 +10,11 @@ # Get shortcuts to step configuration current_step = snakemake.config["pipeline_step"]["name"] vep_config = snakemake.config["step_config"][current_step]["vep"] +pick_order = ",".join(vep_config["pick_order"]) script_output_options = " ".join(["--" + x for x in vep_config["output_options"]]) +full = snakemake.output.full if "full" in snakemake.output.keys() else "" + shell( r""" set -x @@ -27,6 +30,28 @@ fi fi +if [[ -n "{full}" ]] +then + vep --verbose --force_overwrite --offline --cache \ + --fork {vep_config[num_threads]} --buffer_size {vep_config[buffer_size]} \ + --species {vep_config[species]} --cache_version {vep_config[cache_version]} --assembly {vep_config[assembly]} \ + $(if [[ ! -z "{vep_config[cache_dir]}" ]]; then \ + echo --dir_cache {vep_config[cache_dir]} + fi) \ + {script_output_options} \ + --{vep_config[tx_flag]} \ + --fasta {snakemake.config[static_data_config][reference][path]} \ + --input_file {snakemake.input.vcf} --format vcf \ + --output_file {full} --vcf --compress_output bgzip + tabix {full} + + pushd $(dirname {full}) + f=$(basename {full}) + md5sum $f > $f.md5 + md5sum $f.tbi > $f.tbi.md5 + popd +fi + vep --verbose --force_overwrite --offline --cache \ --fork {vep_config[num_threads]} --buffer_size {vep_config[buffer_size]} \ --species {vep_config[species]} --cache_version {vep_config[cache_version]} --assembly {vep_config[assembly]} \ @@ -34,14 +59,11 @@ echo --dir_cache {vep_config[cache_dir]} fi) \ {script_output_options} \ - $(if [[ "{vep_config[pick]}" = "yes" ]]; then \ - echo "--pick" - fi) \ + --pick --pick_order {pick_order} \ --{vep_config[tx_flag]} \ --fasta {snakemake.config[static_data_config][reference][path]} \ --input_file {snakemake.input.vcf} --format vcf \ --output_file {snakemake.output.vcf} --vcf --compress_output bgzip - tabix {snakemake.output.vcf} pushd $(dirname {snakemake.output.vcf}) diff --git a/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py b/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py index 965c5e758..d225952e9 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py +++ b/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py @@ -528,10 +528,7 @@ def test_cbioportal_cna_step_part_get_args_log2(cbioportal_export_workflow): """Tests cbioportalCnaFilesStepPart.get_args() -action 'log2'""" # Define expected base_name_out = "work/log/cbioportal_cna" - expected = { - "action_type": "log2", - "extra_args": {"amplification": "9", "pipeline_id": "ENSEMBL"}, - } + expected = {"action_type": "log2", "extra_args": {"pipeline_id": "ENSEMBL"}} # Get actual actual = cbioportal_export_workflow.get_args("cbioportal_cna", "log2") assert actual == expected @@ -541,7 +538,10 @@ def test_cbioportal_cna_step_part_get_args_gistic(cbioportal_export_workflow): """Tests cbioportalCnaFilesStepPart.get_args() -action 'gistic'""" # Define expected base_name_out = "work/log/cbioportal_cna" - expected = {"action_type": "gistic", "extra_args": {"pipeline_id": "ENSEMBL"}} + expected = { + "action_type": "gistic", + "extra_args": {"amplification": "9", "pipeline_id": "ENSEMBL"}, + } # Get actual actual = cbioportal_export_workflow.get_args("cbioportal_cna", "gistic") assert actual == expected diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_annotation.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_annotation.py index 2fa469687..d6f0731d8 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_annotation.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_annotation.py @@ -181,6 +181,8 @@ def test_vep_step_part_get_output_files(somatic_variant_annotation_workflow): "{mapper}.{var_caller}.vep.{tumor_library}" ) expected = get_expected_output_vcf_files_dict(base_out=base_out) + full = {k.replace("vcf", "full"): v.replace(".vcf", ".full.vcf") for k, v in expected.items()} + expected = {**expected, **full} actual = somatic_variant_annotation_workflow.get_output_files("vep", "run") assert actual == expected @@ -240,6 +242,16 @@ def test_somatic_variant_annotation_workflow(somatic_variant_annotation_workflow for var_caller in ("mutect", "scalpel") for annotator in ("jannovar_annotate_somatic_vcf", "vep") ] + expected += [ + tpl.format( + mapper=mapper, var_caller=var_caller, annotator=annotator, i=i, t=t, ext=ext, dir_="out" + ) + for i, t in ((1, 1), (2, 1), (2, 2)) + for ext in ("full.vcf.gz", "full.vcf.gz.md5", "full.vcf.gz.tbi", "full.vcf.gz.tbi.md5") + for mapper in ("bwa",) + for var_caller in ("mutect", "scalpel") + for annotator in ("vep",) + ] expected += [ tpl.format( mapper=mapper, var_caller=var_caller, annotator=annotator, i=i, t=t, ext=ext, dir_="log" From 98825db29d3583780b6543b9f5456e0be5e9978b Mon Sep 17 00:00:00 2001 From: Max Xiaohang Zhao Date: Mon, 18 Sep 2023 15:46:00 +0200 Subject: [PATCH 14/19] fix: Fixing feature-effects compression (#440) --- snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py | 1 + 1 file changed, 1 insertion(+) diff --git a/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py b/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py index 55f8d6dbd..671048469 100644 --- a/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py +++ b/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py @@ -109,6 +109,7 @@ cat $TMPDIR/feature-effects.tsv \ | tr '\n' '\t' \ | sed -e 's/\t$/\n/g' \ +| gzip \ >{snakemake.output.feature_effects} # Perform Mehari structural variant annotation. From 0ca23f645d38130ac08f85b1861ae795f62f96b2 Mon Sep 17 00:00:00 2001 From: Manuel Holtgrewe Date: Mon, 18 Sep 2023 15:46:47 +0200 Subject: [PATCH 15/19] feat: bump and fix Mehari for SVs in varfish_export (#444) --- .../wrappers/mehari/annotate_strucvars/wrapper.py | 5 +++++ snappy_wrappers/wrappers/mehari/environment.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py b/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py index 671048469..7b5f9386f 100644 --- a/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py +++ b/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py @@ -80,6 +80,11 @@ --output-vcf $TMPDIR/fixed_bnd_to_inv_unsorted.$num.vcf bcftools sort -o $TMPDIR/fixed_bnd_to_inv.$num.vcf $TMPDIR/fixed_bnd_to_inv_unsorted.$num.vcf + # Fixup SVLEN=1 to SVLEN=. + sed -i -e 's/ID=SVLEN,Number=1/ID=SVLEN,Number=./g' $TMPDIR/fixed_bnd_to_inv_unsorted.$num.vcf + # Fixup MELT header + sed -i -e "s/seperated by '..'/separated by '\\\\\\\\|'/" $TMPDIR/fixed_bnd_to_inv_unsorted.$num.vcf + # Add the missing "GT" tag echo '##FORMAT=' \ > $TMPDIR/header.gt.txt diff --git a/snappy_wrappers/wrappers/mehari/environment.yaml b/snappy_wrappers/wrappers/mehari/environment.yaml index 8461e28b2..58ca64f7a 100644 --- a/snappy_wrappers/wrappers/mehari/environment.yaml +++ b/snappy_wrappers/wrappers/mehari/environment.yaml @@ -5,7 +5,7 @@ dependencies: - bcftools >=1.9 - htslib >=1.9 - samtools >=1.9 - - mehari ==0.6.2 + - mehari ==0.7.0 - jq - vcfpy - pysam From 46b2303d4ec185409dc028fa1d1d15b3d2238507 Mon Sep 17 00:00:00 2001 From: ericblanc20 Date: Wed, 20 Sep 2023 08:57:37 +0200 Subject: [PATCH 16/19] fix: fix trimadap-mt & bbduk java version (#446) --- snappy_wrappers/wrappers/bbduk/environment.yaml | 1 + snappy_wrappers/wrappers/bwa/wrapper.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/snappy_wrappers/wrappers/bbduk/environment.yaml b/snappy_wrappers/wrappers/bbduk/environment.yaml index f3f77827a..c7edb6027 100644 --- a/snappy_wrappers/wrappers/bbduk/environment.yaml +++ b/snappy_wrappers/wrappers/bbduk/environment.yaml @@ -3,3 +3,4 @@ channels: - bioconda dependencies: - bbmap =39 + - openjdk >= 8 diff --git a/snappy_wrappers/wrappers/bwa/wrapper.py b/snappy_wrappers/wrappers/bwa/wrapper.py index 7da7a9097..980c6f281 100644 --- a/snappy_wrappers/wrappers/bwa/wrapper.py +++ b/snappy_wrappers/wrappers/bwa/wrapper.py @@ -74,7 +74,7 @@ set -x if [[ "{snakemake.config[step_config][ngs_mapping][bwa][trim_adapters]}" == "True" ]]; then - trimadapt-mt -p {snakemake.config[step_config][ngs_mapping][bwa][num_threads_trimming]} + trimadap-mt -p {snakemake.config[step_config][ngs_mapping][bwa][num_threads_trimming]} else cat # TODO: can we somehow remove this? fi From 55146c7f50fb22f38609b40b3e91cf891bbcaf87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolai=20von=20K=C3=BCgelgen?= Date: Wed, 11 Oct 2023 15:18:44 +0200 Subject: [PATCH 17/19] fix: mehari wrapper vcf preprocessing does not actually fix info svlen header (#450) (#451) --- snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py b/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py index 7b5f9386f..f2e9b415c 100644 --- a/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py +++ b/snappy_wrappers/wrappers/mehari/annotate_strucvars/wrapper.py @@ -81,9 +81,9 @@ bcftools sort -o $TMPDIR/fixed_bnd_to_inv.$num.vcf $TMPDIR/fixed_bnd_to_inv_unsorted.$num.vcf # Fixup SVLEN=1 to SVLEN=. - sed -i -e 's/ID=SVLEN,Number=1/ID=SVLEN,Number=./g' $TMPDIR/fixed_bnd_to_inv_unsorted.$num.vcf + sed -i -e 's/ID=SVLEN,Number=1/ID=SVLEN,Number=./g' $TMPDIR/fixed_bnd_to_inv.$num.vcf # Fixup MELT header - sed -i -e "s/seperated by '..'/separated by '\\\\\\\\|'/" $TMPDIR/fixed_bnd_to_inv_unsorted.$num.vcf + sed -i -e "s/seperated by '..'/separated by '\\\\\\\\|'/" $TMPDIR/fixed_bnd_to_inv.$num.vcf # Add the missing "GT" tag echo '##FORMAT=' \ From e394e8cd4bd76eef4725bbaa9ff7711ab5aa9dcc Mon Sep 17 00:00:00 2001 From: ericblanc20 Date: Wed, 11 Oct 2023 16:14:24 +0200 Subject: [PATCH 18/19] feat: PureCN implementation (#453) --- snappy_pipeline/apps/snappy_snake.py | 2 + .../Snakefile | 24 +- .../__init__.py | 148 +++---- .../workflows/panel_of_normals/Snakefile | 66 ++++ .../workflows/panel_of_normals/__init__.py | 313 ++++++++++----- .../Snakefile | 110 ++++++ .../__init__.py | 372 ++++++++++++++---- .../wrappers/mutect2/create_panel/wrapper.py | 32 +- .../coverage}/environment.yaml | 0 .../wrappers/purecn/coverage/wrapper.py | 100 +++++ .../create_panel}/environment.yaml | 0 .../wrappers/purecn/create_panel/wrapper.py | 100 +++++ .../wrappers/purecn/environment.yaml | 5 + .../wrappers/purecn/prepare/environment.yaml | 1 + .../wrappers/purecn/prepare/wrapper.py | 108 +++++ .../wrappers/purecn/run/environment.yaml | 1 + .../wrappers/purecn/run/wrapper.py | 128 ++++++ snappy_wrappers/wrappers/r/environment.yaml | 7 + snappy_wrappers/wrappers/r/wrapper.py | 69 ++++ .../wrappers/scarHRD/environment.yaml | 6 +- .../wrappers/scarHRD/run/wrapper.py | 18 +- .../wrappers/sequenza/environment.yaml | 10 + .../sequenza/gcreference/environment.yaml | 1 + .../gcreference/wrapper.py | 11 +- .../wrappers/sequenza/report/environment.yaml | 1 + .../wrappers/sequenza/report/wrapper.py | 98 +++++ .../wrappers/sequenza/run/environment.yaml | 1 + .../wrappers/sequenza/run/wrapper.py | 71 ++++ .../wrappers/singularity/environment.yaml | 2 + .../install => singularity}/wrapper.py | 37 +- ...ows_homologous_recombination_deficiency.py | 77 ++-- .../test_workflows_panel_of_normals.py | 173 +++++++- .../test_workflows_panel_of_normals_wgs.py | 2 +- ...kflows_somatic_targeted_seq_cnv_calling.py | 246 +++++++++++- 34 files changed, 1941 insertions(+), 399 deletions(-) rename snappy_wrappers/wrappers/{scarHRD/gcreference => purecn/coverage}/environment.yaml (100%) create mode 100644 snappy_wrappers/wrappers/purecn/coverage/wrapper.py rename snappy_wrappers/wrappers/{scarHRD/install => purecn/create_panel}/environment.yaml (100%) create mode 100644 snappy_wrappers/wrappers/purecn/create_panel/wrapper.py create mode 100644 snappy_wrappers/wrappers/purecn/environment.yaml create mode 120000 snappy_wrappers/wrappers/purecn/prepare/environment.yaml create mode 100644 snappy_wrappers/wrappers/purecn/prepare/wrapper.py create mode 120000 snappy_wrappers/wrappers/purecn/run/environment.yaml create mode 100644 snappy_wrappers/wrappers/purecn/run/wrapper.py create mode 100644 snappy_wrappers/wrappers/r/environment.yaml create mode 100644 snappy_wrappers/wrappers/r/wrapper.py create mode 100644 snappy_wrappers/wrappers/sequenza/environment.yaml create mode 120000 snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml rename snappy_wrappers/wrappers/{scarHRD => sequenza}/gcreference/wrapper.py (80%) create mode 120000 snappy_wrappers/wrappers/sequenza/report/environment.yaml create mode 100644 snappy_wrappers/wrappers/sequenza/report/wrapper.py create mode 120000 snappy_wrappers/wrappers/sequenza/run/environment.yaml create mode 100644 snappy_wrappers/wrappers/sequenza/run/wrapper.py create mode 100644 snappy_wrappers/wrappers/singularity/environment.yaml rename snappy_wrappers/wrappers/{scarHRD/install => singularity}/wrapper.py (56%) diff --git a/snappy_pipeline/apps/snappy_snake.py b/snappy_pipeline/apps/snappy_snake.py index d6ea062f3..edda71f6a 100644 --- a/snappy_pipeline/apps/snappy_snake.py +++ b/snappy_pipeline/apps/snappy_snake.py @@ -32,6 +32,7 @@ ngs_sanity_checking, panel_of_normals, repeat_expansion, + somatic_cnv_checking, somatic_gene_fusion_calling, somatic_hla_loh_calling, somatic_msi_calling, @@ -88,6 +89,7 @@ "panel_of_normals": panel_of_normals, "repeat_analysis": repeat_expansion, "ngs_sanity_checking": ngs_sanity_checking, + "somatic_cnv_checking": somatic_cnv_checking, "somatic_gene_fusion_calling": somatic_gene_fusion_calling, "somatic_hla_loh_calling": somatic_hla_loh_calling, "somatic_msi_calling": somatic_msi_calling, diff --git a/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile b/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile index 92f92482d..fc8dca2ab 100644 --- a/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile +++ b/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile @@ -61,7 +61,12 @@ rule homologous_recombination_deficiency_link_out_run: rule homologous_recombination_deficiency_scarHRD_install: output: **wf.get_output_files("scarHRD", "install"), - threads: wf.get_resource("scarHRD", "install", "threads") + params: + packages=[ + {"name": "aroneklund/copynumber", "repo": "github"}, + {"name": "sequenzatools/sequenza", "repo": "bitbucket"}, + {"name": "sztup/scarHRD", "repo": "github"}, + ], resources: time=wf.get_resource("scarHRD", "install", "time"), memory=wf.get_resource("scarHRD", "install", "memory"), @@ -70,22 +75,7 @@ rule homologous_recombination_deficiency_scarHRD_install: log: **wf.get_log_file("scarHRD", "install"), wrapper: - wf.wrapper_path("scarHRD/install") - - -rule homologous_recombination_deficiency_scarHRD_gcreference: - output: - **wf.get_output_files("scarHRD", "gcreference"), - threads: wf.get_resource("scarHRD", "gcreference", "threads") - resources: - time=wf.get_resource("scarHRD", "gcreference", "time"), - memory=wf.get_resource("scarHRD", "gcreference", "memory"), - partition=wf.get_resource("scarHRD", "gcreference", "partition"), - tmpdir=wf.get_resource("scarHRD", "gcreference", "tmpdir"), - log: - **wf.get_log_file("scarHRD", "gcreference"), - wrapper: - wf.wrapper_path("scarHRD/gcreference") + wf.wrapper_path("r") rule homologous_recombination_deficiency_scarHRD_run: diff --git a/snappy_pipeline/workflows/homologous_recombination_deficiency/__init__.py b/snappy_pipeline/workflows/homologous_recombination_deficiency/__init__.py index bae0d34c6..249fdae69 100644 --- a/snappy_pipeline/workflows/homologous_recombination_deficiency/__init__.py +++ b/snappy_pipeline/workflows/homologous_recombination_deficiency/__init__.py @@ -13,12 +13,17 @@ bioconda directory, while this package is not found when searching `bioconda`. copynumber is obtained from a fork of the official Bioconductor deprecated package. +TODO: The implementation needs to uncouple ``scarHRD`` from ``sequenza``. +It should be possible as ``scarHRD`` could use the output from other CNV callers. +However, it is poorly documented, and will require significant work. + ========== Step Input ========== -``homologous_recombination_deficiency`` starts off the aligned reads, i.e. ``ngs_mapping``. -Both the normal & tumor samples are required to generate the score. +``homologous_recombination_deficiency`` starts off the ``sequenza`` copy number output. +Some steps performed by ``sequenza`` are repeated by ``scanHRD``, as ``scanHRD`` uses a specific +set of arguments. This is the reason why ``sequenza`` is required by the step. =========== Step Output @@ -32,9 +37,9 @@ of this tool. In the future, this section might contain "common" output and tool-specific output sub sections. -- ``{mapper}.scarHRD.{lib_name}-{lib_pk}/out/`` - - ``{mapper}.scarHRD.{lib_name}-{lib_pk}.seqz.gz`` - - ``{mapper}.scarHRD.{lib_name}-{lib_pk}.json`` +- ``{mapper}.{caller}.scarHRD.{lib_name}-{lib_pk}/out/`` + - ``{mapper}.{caller}.scarHRD.{lib_name}-{lib_pk}.seqz.gz`` + - ``{mapper}.{caller}.scarHRD.{lib_name}-{lib_pk}.json`` ===================== Default Configuration @@ -52,7 +57,6 @@ """ -from collections import OrderedDict import sys from biomedsheets.shortcuts import CancerCaseSheet, is_not_background @@ -66,7 +70,9 @@ LinkOutStepPart, ResourceUsage, ) -from snappy_pipeline.workflows.ngs_mapping import NgsMappingWorkflow +from snappy_pipeline.workflows.somatic_targeted_seq_cnv_calling import ( + SomaticTargetedSeqCnvCallingWorkflow, +) __author__ = "Eric Blanc " @@ -75,8 +81,8 @@ # Default configuration homologous_recombination_deficiency step_config: homologous_recombination_deficiency: - tools: ['scarHRD'] # REQUIRED - available: 'mantis' - path_ngs_mapping: ../ngs_mapping # REQUIRED + tools: ['scarHRD'] # REQUIRED - available: 'scarHRD' + path_cnv_calling: ../somatic_targeted_seq_cnv_calling # REQUIRED scarHRD: genome_name: "grch37" # Must be either "grch37", "grch38" or "mouse" chr_prefix: False @@ -93,81 +99,31 @@ class ScarHRDStepPart(BaseStepPart): #: Class available actions actions = ( "install", - "gcreference", "run", ) def __init__(self, parent): super().__init__(parent) - self.base_path_out = ( - "work/{{mapper}}.scarHRD.{{library_name}}/out/{{mapper}}.scarHRD.{{library_name}}{ext}" - ) - # Build shortcut from cancer bio sample name to matched cancer sample - self.tumor_ngs_library_to_sample_pair = OrderedDict() - for sheet in self.parent.shortcut_sheets: - self.tumor_ngs_library_to_sample_pair.update( - sheet.all_sample_pairs_by_tumor_dna_ngs_library - ) - - def get_normal_lib_name(self, wildcards): - """Return name of normal (non-cancer) library""" - pair = self.tumor_ngs_library_to_sample_pair[wildcards.library_name] - return pair.normal_sample.dna_ngs_library.name def get_input_files(self, action): - def input_function_run(wildcards): - """Helper wrapper function""" - # Get shorcut to Snakemake sub workflow - ngs_mapping = self.parent.sub_workflows["ngs_mapping"] - # Get names of primary libraries of the selected cancer bio sample and the - # corresponding primary normal sample - normal_base_path = ( - "output/{mapper}.{normal_library}/out/{mapper}.{normal_library}".format( - normal_library=self.get_normal_lib_name(wildcards), **wildcards - ) - ) - tumor_base_path = ( - "output/{mapper}.{library_name}/out/" "{mapper}.{library_name}" - ).format(**wildcards) - return { - "lib_path": "work/R_packages/out/.done", - "gc": "work/static_data/out/{genome_name}_{length}.wig.gz".format( - genome_name=self.config["scarHRD"]["genome_name"], - length=self.config["scarHRD"]["length"], - ), - "normal_bam": ngs_mapping(normal_base_path + ".bam"), - "normal_bai": ngs_mapping(normal_base_path + ".bam.bai"), - "tumor_bam": ngs_mapping(tumor_base_path + ".bam"), - "tumor_bai": ngs_mapping(tumor_base_path + ".bam.bai"), - } + self._validate_action(action) - if action == "install": - return None - elif action == "gcreference": - return None - elif action == "run": - return input_function_run - else: - raise UnsupportedActionException( - "Action '{action}' is not supported. Valid options: {valid}".format( - action=action, valid=", ".join(self.actions) - ) - ) + return self._get_input_files_run + + @dictify + def _get_input_files_run(self, wildcards): + self.cnv_calling = self.parent.sub_workflows["cnv_calling"] + base_name = f"{wildcards.mapper}.{wildcards.caller}.{wildcards.library_name}" + yield "done", "work/R_packages/out/scarHRD.done" + yield "seqz", self.cnv_calling(f"output/{base_name}/out/{base_name}.seqz.gz") def get_output_files(self, action): if action == "install": - return {"lib_path": "work/R_packages/out/.done"} - elif action == "gcreference": - return { - "gc": "work/static_data/out/{genome_name}_{length}.wig.gz".format( - genome_name=self.config["scarHRD"]["genome_name"], - length=self.config["scarHRD"]["length"], - ) - } + return {"done": "work/R_packages/out/scarHRD.done"} elif action == "run": return { - "sequenza": "work/{mapper}.scarHRD.{library_name}/out/{mapper}.scarHRD.{library_name}.seqz.gz", - "scarHRD": "work/{mapper}.scarHRD.{library_name}/out/{mapper}.scarHRD.{library_name}.json", + "scarHRD": "work/{mapper}.{caller}.scarHRD.{library_name}/out/{mapper}.{caller}.scarHRD.{library_name}.json", + "scarHRD_md5": "work/{mapper}.{caller}.scarHRD.{library_name}/out/{mapper}.{caller}.scarHRD.{library_name}.json.md5", } else: raise UnsupportedActionException( @@ -180,14 +136,9 @@ def get_output_files(self, action): def _get_log_file(self, action): """Return dict of log files.""" if action == "install": - prefix = "work/R_packages/log/R_packages" - elif action == "gcreference": - prefix = "work/static_data/log/{genome_name}_{length}".format( - genome_name=self.config["scarHRD"]["genome_name"], - length=self.config["scarHRD"]["length"], - ) + prefix = "work/R_packages/log/scarHRD" elif action == "run": - prefix = "work/{mapper}.scarHRD.{library_name}/log/{mapper}.scarHRD.{library_name}" + prefix = "work/{mapper}.{caller}.scarHRD.{library_name}/log/{mapper}.{caller}.scarHRD.{library_name}" else: raise UnsupportedActionException( "Action '{action}' is not supported. Valid options: {valid}".format( @@ -204,32 +155,15 @@ def _get_log_file(self, action): yield key + "_md5", prefix + ext + ".md5" def get_resource_usage(self, action): - """Get Resource Usage - - :param action: Action (i.e., step) in the workflow, example: 'run'. - :type action: str - - :return: Returns ResourceUsage for step. - """ - if action == "install" or action == "gcreference": + self._validate_action(action) + if action == "run": return ResourceUsage( threads=1, - time="02:00:00", # 2 hours - memory="4096M", - partition="short", - ) - elif action == "run": - return ResourceUsage( - threads=2, - time="48:00:00", # 2 hours memory="32G", + time="24:00:00", ) else: - raise UnsupportedActionException( - "Action '{action}' is not supported. Valid options: {valid}".format( - action=action, valid=", ".join(self.actions) - ) - ) + return super().get_resource_usage(action) class HomologousRecombinationDeficiencyWorkflow(BaseStep): @@ -253,16 +187,18 @@ def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir) config_lookup_paths, config_paths, workdir, - (NgsMappingWorkflow,), + (SomaticTargetedSeqCnvCallingWorkflow,), ) # Register sub step classes so the sub steps are available self.register_sub_step_classes((ScarHRDStepPart, LinkOutStepPart)) # Initialize sub-workflows - self.register_sub_workflow("ngs_mapping", self.config["path_ngs_mapping"]) + self.register_sub_workflow( + "somatic_targeted_seq_cnv_calling", self.config["path_cnv_calling"], "cnv_calling" + ) @listify def get_result_files(self): - """Return list of result files for the somatic targeted sequencing CNV calling step""" + """Return list of result files for the homologous recombination deficiency step""" tool_actions = {"scarHRD": ("run",)} for sheet in filter(is_not_background, self.shortcut_sheets): for sample_pair in sheet.all_sample_pairs: @@ -282,14 +218,17 @@ def get_result_files(self): tpls = self.sub_steps[tool].get_output_files(action).values() except AttributeError: tpls = self.sub_steps[tool].get_output_files(action) + tpls = list(tpls) + tpls += list(self.sub_steps[tool].get_log_file(action).values()) for tpl in tpls: filenames = expand( tpl, mapper=self.w_config["step_config"]["ngs_mapping"]["tools"]["dna"], + caller=["sequenza"], library_name=[sample_pair.tumor_sample.dna_ngs_library.name], ) for f in filenames: - if ".tmp." not in f: + if ".tmp." not in f and not f.endswith(".done"): yield f.replace("work/", "output/") def check_config(self): @@ -298,3 +237,6 @@ def check_config(self): ("static_data_config", "reference", "path"), "Path to reference FASTA file not configured but required", ) + assert ( + "sequenza" in self.w_config["step_config"]["somatic_targeted_seq_cnv_calling"]["tools"] + ) diff --git a/snappy_pipeline/workflows/panel_of_normals/Snakefile b/snappy_pipeline/workflows/panel_of_normals/Snakefile index 427ed25d0..88e132382 100644 --- a/snappy_pipeline/workflows/panel_of_normals/Snakefile +++ b/snappy_pipeline/workflows/panel_of_normals/Snakefile @@ -211,3 +211,69 @@ rule panel_of_normals_cnvkit_report: args=wf.substep_dispatch("cnvkit", "get_args", "report"), wrapper: wf.wrapper_path("cnvkit/report") + + +# Panel of normals (PureCN) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +# Install the annotation R package -------------------------- + + +rule panel_of_normals_purecn_install: + output: + **wf.get_output_files("purecn", "install"), + params: + container="docker://markusriester/purecn", + resources: + time=wf.get_resource("purecn", "install", "time"), + memory=wf.get_resource("purecn", "install", "memory"), + partition=wf.get_resource("purecn", "install", "partition"), + log: + **wf.get_log_file("purecn", "install"), + wrapper: + wf.wrapper_path("singularity") + + +rule panel_of_normals_purecn_prepare: + input: + **wf.get_input_files("purecn", "prepare"), + output: + **wf.get_output_files("purecn", "prepare"), + resources: + time=wf.get_resource("purecn", "prepare", "time"), + memory=wf.get_resource("purecn", "prepare", "memory"), + partition=wf.get_resource("purecn", "prepare", "partition"), + log: + **wf.get_log_file("purecn", "prepare"), + wrapper: + wf.wrapper_path("purecn/prepare") + + +rule panel_of_normals_purecn_coverage: + input: + unpack(wf.get_input_files("purecn", "coverage")), + output: + **wf.get_output_files("purecn", "coverage"), + resources: + time=wf.get_resource("purecn", "coverage", "time"), + memory=wf.get_resource("purecn", "coverage", "memory"), + partition=wf.get_resource("purecn", "coverage", "partition"), + log: + **wf.get_log_file("purecn", "coverage"), + wrapper: + wf.wrapper_path("purecn/coverage") + + +rule panel_of_normals_purecn_create_panel: + input: + unpack(wf.get_input_files("purecn", "create_panel")), + output: + **wf.get_output_files("purecn", "create_panel"), + resources: + time=wf.get_resource("purecn", "create_panel", "time"), + memory=wf.get_resource("purecn", "create_panel", "memory"), + partition=wf.get_resource("purecn", "create_panel", "partition"), + log: + **wf.get_log_file("purecn", "create_panel"), + wrapper: + wf.wrapper_path("purecn/create_panel") diff --git a/snappy_pipeline/workflows/panel_of_normals/__init__.py b/snappy_pipeline/workflows/panel_of_normals/__init__.py index 3002afedd..63b2921e5 100644 --- a/snappy_pipeline/workflows/panel_of_normals/__init__.py +++ b/snappy_pipeline/workflows/panel_of_normals/__init__.py @@ -105,7 +105,7 @@ __author__ = "Manuel Holtgrewe " #: Names of the tools that might use panel of normals -TOOLS = ["mutect2", "cnvkit", "access"] +TOOLS = ("mutect2", "cnvkit", "access", "purecn") #: Default configuration for the somatic_variant_calling schema DEFAULT_CONFIG = r""" @@ -114,6 +114,9 @@ panel_of_normals: tools: ['mutect2'] # REQUIRED - available: 'mutect2' path_ngs_mapping: ../ngs_mapping # REQUIRED + ignore_chroms: [] # patterns of chromosome names to ignore + # hs37d5: [NC_007605, hs37d5, chrEBV, '*_decoy', 'HLA-*', 'GL000220.*'] + # GRCh38.d1.vd1: [chrEBV, 'HPV*', CMV, HBV, 'HCV-*', 'HIV-*', KSHV, 'HTLV-1', MCV, '*_decoy', 'chrUn_GL00220*', SV40] # Configuration for mutect2 mutect2: path_normals_list: null # Optional file listing libraries to include in panel @@ -134,13 +137,6 @@ job_mult_time: 1 # running time multiplier merge_mult_memory: 1 # memory multiplier for merging merge_mult_time: 1 # running time multiplier for merging - ignore_chroms: # patterns of chromosome names to ignore - - NC_007605 # herpes virus - - hs37d5 # GRCh37 decoy - - chrEBV # Eppstein-Barr Virus - - '*_decoy' # decoy contig - - 'HLA-*' # HLA genes - - 'GL000220.*' # Contig with problematic, repetitive DNA in GRCh37 cnvkit: path_normals_list: "" # Optional file listing libraries to include in panel path_target_regions: "" # Bed files of targetted regions (Missing when creating a panel of normals for WGS data) @@ -163,6 +159,14 @@ access: # Creates access file for cnvkit, based on genomic sequence & excluded regions (optionally) exclude: [] # [access] Bed file of regions to exclude (mappability, blacklisted, ...) min_gap_size: 0 # [access] Minimum gap size between accessible sequence regions (0: use default value) + purecn: + path_normals_list: "" # Optional file listing libraries to include in panel + path_bait_regions: REQUIRED # Bed files of enrichment kit sequences (MergedProbes for Agilent SureSelect), recommended by PureCN author + genome_name: "unknown" # Must be one from hg18, hg19, hg38, mm9, mm10, rn4, rn5, rn6, canFam3 + enrichment_kit_name: "unknown" # For filename only... + mappability: "" # GRCh38: /fast/work/groups/cubi/projects/biotools/static_data/app_support/PureCN/hg38/mappability.bw + reptiming: "" # Nothing for GRCh38 + seed: 1234567 """ @@ -173,13 +177,18 @@ class PanelOfNormalsStepPart(BaseStepPart): merges all the individual results in the the panel. """ - #: Class available actions - actions = ("prepare_panel", "create_panel") + #: Step name (default, must be overwritten) + name = None def __init__(self, parent): super().__init__(parent) # Build shortcut from cancer bio sample name to matched cancer sample self.normal_libraries = list(self._get_normal_libraries()) + if self.name and self.config[self.name].get("path_normals_list"): + self.normal_libraries = [] + with open(self.config[self.name]["path_normals_list"], "rt") as f: + for line in f: + self.normal_libraries.append(line.strip()) def _get_normal_libraries(self): for sheet in self.parent.shortcut_sheets: @@ -193,6 +202,132 @@ def _get_normal_libraries(self): for _, ngs_library in test_sample.ngs_libraries.items(): yield ngs_library.name + @staticmethod + @dictify + def _get_log_file(tpl): + """Return all log files files""" + ext_dict = { + "conda_list": "conda_list.txt", + "conda_list_md5": "conda_list.txt.md5", + "conda_info": "conda_info.txt", + "conda_info_md5": "conda_info.txt.md5", + "log": "log", + "log_md5": "log.md5", + } + for key, ext in ext_dict.items(): + yield key, tpl + "." + ext + + +class PureCnStepPart(PanelOfNormalsStepPart): + """Creating a panel of normals with GC-corrected coverage""" + + #: Step name + name = "purecn" + + #: Actions + actions = ("install", "prepare", "coverage", "create_panel") + + #: Resources + resource_usage = { + "prepare": ResourceUsage( + threads=1, + time="04:00:00", # 4 hours + memory="24G", + ), + "coverage": ResourceUsage( + threads=1, + time="04:00:00", # 4 hours + memory="24G", + ), + "create_panel": ResourceUsage( + threads=1, + time="04:00:00", # 4 hours + memory="24G", + ), + } + + def get_input_files(self, action): + self._validate_action(action) + self.ngs_mapping = self.parent.sub_workflows["ngs_mapping"] + if action == "prepare": + return {"container": "work/containers/out/purecn.simg"} + if action == "coverage": + return self._get_input_files_coverage + if action == "create_panel": + return self._get_input_files_create + + @dictify + def _get_input_files_coverage(self, wildcards): + yield "container", "work/containers/out/purecn.simg" + tpl = "output/{mapper}.{normal_library}/out/{mapper}.{normal_library}.bam" + yield "intervals", "work/purecn/out/{}_{}.list".format( + self.config["purecn"]["enrichment_kit_name"], + self.config["purecn"]["genome_name"], + ) + yield "bam", self.ngs_mapping(tpl.format(**wildcards)) + + @dictify + def _get_input_files_create(self, wildcards): + yield "container", "work/containers/out/purecn.simg" + tpl = "work/{mapper}.purecn/out/{mapper}.{normal_library}_coverage_loess.txt.gz" + yield "normals", [ + tpl.format(mapper=wildcards.mapper, normal_library=lib) for lib in self.normal_libraries + ] + + def get_output_files(self, action): + self._validate_action(action) + + if action == "install": + return {"container": "work/containers/out/purecn.simg"} + if action == "prepare": + base_out = "{}_{}".format( + self.config["purecn"]["enrichment_kit_name"], + self.config["purecn"]["genome_name"], + ) + return { + "intervals": "work/purecn/out/" + base_out + ".list", + "optimized": "work/purecn/out/" + base_out + ".bed.gz", + "tbi": "work/purecn/out/" + base_out + ".bed.gz.tbi", + "intervals_md5": "work/purecn/out/" + base_out + ".list.md5", + "optimized_md5": "work/purecn/out/" + base_out + ".bed.gz.md5", + "tbi_md5": "work/purecn/out/" + base_out + ".bed.gz.tbi.md5", + } + if action == "coverage": + return { + "coverage": "work/{mapper}.purecn/out/{mapper}.{normal_library,.+-DNA[0-9]+-WES[0-9]+}_coverage_loess.txt.gz" + } + if action == "create_panel": + return { + "db": "work/{mapper}.purecn/out/{mapper}.purecn.panel_of_normals.rds", + "db_md5": "work/{mapper}.purecn/out/{mapper}.purecn.panel_of_normals.rds.md5", + "mapbias": "work/{mapper}.purecn/out/{mapper}.purecn.mapping_bias.rds", + "mapbias_md5": "work/{mapper}.purecn/out/{mapper}.purecn.mapping_bias.rds.md5", + "lowcov": "work/{mapper}.purecn/out/{mapper}.purecn.low_coverage_targets.bed", + "hq": "work/{mapper}.purecn/out/{mapper}.purecn.hq_sites.bed", + "plot": "work/{mapper}.purecn/out/{mapper}.purecn.interval_weights.png", + } + + def get_log_file(self, action): + tpls = { + "install": "work/containers/log/purecn", + "prepare": "work/purecn/log/{}_{}".format( + self.config["purecn"]["enrichment_kit_name"], + self.config["purecn"]["genome_name"], + ), + "coverage": "work/{mapper}.purecn/log/{mapper}.{normal_library,.+-DNA[0-9]+-WES[0-9]+}", + "create_panel": "work/{mapper}.purecn/log/{mapper}.purecn.panel_of_normals", + } + assert action in self.actions + return self._get_log_file(tpls[action]) + + def check_config(self): + if self.name not in self.config["tools"]: + return # PureCN not enabled, skip + self.parent.ensure_w_config( + ("step_config", "panel_of_normals", self.name, "path_bait_regions"), + "Path to exome panel bait regions not defined for tool {}".format(self.name), + ) + class Mutect2StepPart(PanelOfNormalsStepPart): """Somatic variant calling with MuTect 2""" @@ -200,8 +335,11 @@ class Mutect2StepPart(PanelOfNormalsStepPart): #: Step name name = "mutect2" + #: Class available actions + actions = ("prepare_panel", "create_panel") + #: Class resource usage dictionary. Key: action type (string); Value: resource (ResourceUsage). - resource_usage_dict = { + resource_usage = { "prepare_panel": ResourceUsage( threads=2, time="3-00:00:00", # 3 days @@ -214,14 +352,6 @@ class Mutect2StepPart(PanelOfNormalsStepPart): ), } - def __init__(self, parent): - super().__init__(parent) - if self.config["mutect2"]["path_normals_list"]: - self.normal_libraries = [] - with open(self.config["mutect2"]["path_normals_list"], "rt") as f: - for line in f: - self.normal_libraries.append(line.strip()) - def check_config(self): if self.name not in self.config["tools"]: return # Mutect not enabled, skip @@ -230,18 +360,6 @@ def check_config(self): "Path to reference FASTA not configured but required for %s" % (self.name,), ) - def get_resource_usage(self, action): - """Get Resource Usage - - :param action: Action (i.e., step) in the workflow, example: 'run'. - :type action: str - - :return: Returns ResourceUsage for step. - """ - # Validate action - self._validate_action(action) - return self.resource_usage_dict.get(action) - def get_input_files(self, action): """Return input files for mutect2 variant calling""" # Validate action @@ -279,30 +397,24 @@ def get_output_files(self, action): "vcf_tbi_md5": "vcf.gz.tbi.md5", } tpls = { - "prepare_panel": "work/{{mapper}}.{tool}/out/{{mapper}}.{tool}.{{normal_library}}.prepare.{ext}", - "create_panel": "work/{{mapper}}.{tool}/out/{{mapper}}.{tool}.panel_of_normals.{ext}", + "prepare_panel": "work/{mapper}.mutect2/out/{mapper}.mutect2.{normal_library}.prepare", + "create_panel": "work/{mapper}.mutect2/out/{mapper}.mutect2.panel_of_normals", } for key, ext in ext_dict.items(): - yield key, tpls[action].format(tool=self.name, ext=ext) + yield key, tpls[action] + "." + ext + if action == "create_panel": + yield "db", "work/{mapper}.mutect2/out/{mapper}.mutect2.genomicsDB.tar.gz" + yield "db_md5", "work/{mapper}.mutect2/out/{mapper}.mutect2.genomicsDB.tar.gz.md5" - @dictify - def get_log_file(self, action): + @classmethod + def get_log_file(cls, action): """Return panel of normal files""" - self._validate_action(action) - ext_dict = { - "conda_list": "conda_list.txt", - "conda_list_md5": "conda_list.txt.md5", - "conda_info": "conda_info.txt", - "conda_info_md5": "conda_info.txt.md5", - "log": "log", - "log_md5": "log.md5", - } tpls = { - "prepare_panel": "work/{{mapper}}.{tool}/log/{{mapper}}.{tool}.{{normal_library}}.prepare.{ext}", - "create_panel": "work/{{mapper}}.{tool}/log/{{mapper}}.{tool}.panel_of_normals.{ext}", + "prepare_panel": "work/{mapper}.mutect2/log/{mapper}.mutect2.{normal_library}.prepare", + "create_panel": "work/{mapper}.mutect2/log/{mapper}.mutect2.panel_of_normals", } - for key, ext in ext_dict.items(): - yield key, tpls[action].format(tool=self.name, ext=ext) + assert action in cls.actions + return cls._get_log_file(tpls[action]) class CnvkitStepPart(PanelOfNormalsStepPart): @@ -321,7 +433,7 @@ class CnvkitStepPart(PanelOfNormalsStepPart): ) #: Class resource usage dictionary. Key: action type (string); Value: resource (ResourceUsage). - resource_usage_dict = { + resource_usage = { "target": ResourceUsage( threads=2, time="02:00:00", # 2 hours @@ -351,11 +463,6 @@ class CnvkitStepPart(PanelOfNormalsStepPart): def __init__(self, parent): super().__init__(parent) - if self.config["cnvkit"]["path_normals_list"]: - self.normal_libraries = [] - with open(self.config["cnvkit"]["path_normals_list"], "rt") as f: - for line in f: - self.normal_libraries.append(line.strip()) self.is_wgs = self.config["cnvkit"]["path_target_regions"] == "" def check_config(self): @@ -374,18 +481,6 @@ def get_args(self, action): method = "hybrid" return {"method": method, "flat": (len(self.normal_libraries) == 0)} - def get_resource_usage(self, action): - """Get Resource Usage - - :param action: Action (i.e., step) in the workflow, example: 'run'. - :type action: str - - :return: Returns ResourceUsage for step. - """ - # Validate action - self._validate_action(action) - return self.resource_usage_dict.get(action) - def get_input_files(self, action): """Return input files for cnvkit panel of normals creation""" # Validate action @@ -527,33 +622,19 @@ def _get_output_files_access(self): "access_md5": "work/cnvkit.access/out/cnvkit.access.bed.md5", } - @dictify - def get_log_file(self, action): + @classmethod + def get_log_file(cls, action): """Return panel of normal files""" - ext_dict = { - "conda_list": "conda_list.txt", - "conda_list_md5": "conda_list.txt.md5", - "conda_info": "conda_info.txt", - "conda_info_md5": "conda_info.txt.md5", - "log": "log", - "log_md5": "log.md5", + tpls = { + "target": "work/{mapper}.cnvkit/log/{mapper}.cnvkit.target", + "antitarget": "work/{mapper}.cnvkit/log/{mapper}.cnvkit.antitarget", + "coverage": "work/{mapper}.cnvkit/log/{mapper}.cnvkit.{normal_library}.coverage", + "create_panel": "work/{mapper}.cnvkit/log/{mapper}.cnvkit.panel_of_normals", + "report": "work/{mapper}.cnvkit/log/{mapper}.cnvkit.report", + "access": "work/cnvkit.access/log/cnvkit.access", } - if action == "target": - tpl = "work/{{mapper}}.cnvkit/log/{{mapper}}.cnvkit.target.{ext}" - elif action == "antitarget": - tpl = "work/{{mapper}}.cnvkit/log/{{mapper}}.cnvkit.antitarget.{ext}" - elif action == "coverage": - tpl = "work/{{mapper}}.cnvkit/log/{{mapper}}.cnvkit.{{normal_library}}.coverage.{ext}" - elif action == "create_panel": - tpl = "work/{{mapper}}.cnvkit/log/{{mapper}}.cnvkit.panel_of_normals.{ext}" - elif action == "report": - tpl = "work/{{mapper}}.cnvkit/log/{{mapper}}.cnvkit.report.{ext}" - elif action == "access": - tpl = "work/cnvkit.access/log/cnvkit.access.{ext}" - else: - self._validate_action(action) - for key, ext in ext_dict.items(): - yield key, tpl.format(ext=ext) + assert action in cls.actions + return cls._get_log_file(tpls[action]) class AccessStepPart(PanelOfNormalsStepPart): @@ -582,22 +663,11 @@ def get_output_files(self, action): tpl = "work/cnvkit.access/out/cnvkit.access.bed" return {"access": tpl, "access_md5": tpl + ".md5"} - @dictify - def get_log_file(self, action): + @classmethod + def get_log_file(cls, action): """Return log files""" - # Validate action - self._validate_action(action) - ext_dict = { - "conda_list": "conda_list.txt", - "conda_list_md5": "conda_list.txt.md5", - "conda_info": "conda_info.txt", - "conda_info_md5": "conda_info.txt.md5", - "log": "log", - "log_md5": "log.md5", - } - tpl = "work/cnvkit.access/log/cnvkit.access.{ext}" - for key, ext in ext_dict.items(): - yield key, tpl.format(ext=ext) + assert action in cls.actions + return cls._get_log_file("work/cnvkit.access/log/cnvkit.access") class PanelOfNormalsWorkflow(BaseStep): @@ -627,17 +697,18 @@ def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir) workdir, (NgsMappingWorkflow,), ) + # Initialize sub-workflows + self.register_sub_workflow("ngs_mapping", self.config["path_ngs_mapping"]) # Register sub step classes so the sub steps are available self.register_sub_step_classes( ( Mutect2StepPart, CnvkitStepPart, AccessStepPart, + PureCnStepPart, LinkOutStepPart, ) ) - # Initialize sub-workflows - self.register_sub_workflow("ngs_mapping", self.config["path_ngs_mapping"]) @listify def get_result_files(self): @@ -660,6 +731,9 @@ def get_result_files(self): tpl = "output/{mapper}.mutect2/out/{mapper}.mutect2.panel_of_normals.{ext}" ext_list = ("vcf.gz", "vcf.gz.md5", "vcf.gz.tbi", "vcf.gz.tbi.md5") result_files.extend(self._expand_result_files(tpl, ext_list)) + tpl = "output/{mapper}.mutect2/out/{mapper}.mutect2.genomicsDB.{ext}" + ext_list = ("tar.gz", "tar.gz.md5") + result_files.extend(self._expand_result_files(tpl, ext_list)) tpl = "output/{mapper}.mutect2/log/{mapper}.mutect2.panel_of_normals.{ext}" result_files.extend(self._expand_result_files(tpl, log_ext_list)) @@ -697,6 +771,27 @@ def get_result_files(self): tpl = "output/cnvkit.access/log/cnvkit.access.{ext}" result_files.extend(self._expand_result_files(tpl, log_ext_list)) + if "purecn" in set(self.config["tools"]) & set(TOOLS): + tpl = "output/{mapper}.purecn/out/{mapper}.purecn.panel_of_normals.{ext}" + ext_list = ("rds", "rds.md5") + result_files.extend(self._expand_result_files(tpl, ext_list)) + tpl = "output/{mapper}.purecn/out/{mapper}.purecn.mapping_bias.{ext}" + ext_list = ("rds", "rds.md5") + result_files.extend(self._expand_result_files(tpl, ext_list)) + tpl = "output/{mapper}.purecn/log/{mapper}.purecn.panel_of_normals.{ext}" + result_files.extend(self._expand_result_files(tpl, log_ext_list)) + tpl = "output/purecn/out/{}_{}.{{ext}}".format( + self.config["purecn"]["enrichment_kit_name"], + self.config["purecn"]["genome_name"], + ) + ext_list = ("list", "list.md5", "bed.gz", "bed.gz.md5", "bed.gz.tbi", "bed.gz.tbi.md5") + result_files.extend(self._expand_result_files(tpl, ext_list)) + tpl = "output/purecn/log/{}_{}.{{ext}}".format( + self.config["purecn"]["enrichment_kit_name"], + self.config["purecn"]["genome_name"], + ) + result_files.extend(self._expand_result_files(tpl, log_ext_list)) + return result_files def _expand_result_files(self, tpl, ext_list): diff --git a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/Snakefile b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/Snakefile index 91d449628..330476306 100644 --- a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/Snakefile +++ b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/Snakefile @@ -233,3 +233,113 @@ rule somatic_targeted_seq_cnv_calling_cnvetti_off_target_postprocess: **wf.get_log_file("cnvetti_off_target", "postprocess"), wrapper: wf.wrapper_path("cnvetti/on_target/postprocess") + + +# Run sequenza ---------------------------------------------------- + + +rule somatic_targeted_seq_cnv_calling_sequenza_install: + output: + **wf.get_output_files("sequenza", "install"), + params: + packages=[ + {"name": "aroneklund/copynumber", "repo": "github"}, + ], + threads: wf.get_resource("sequenza", "install", "threads") + resources: + time=wf.get_resource("sequenza", "install", "time"), + memory=wf.get_resource("sequenza", "install", "memory"), + partition=wf.get_resource("sequenza", "install", "partition"), + tmpdir=wf.get_resource("sequenza", "install", "tmpdir"), + log: + **wf.get_log_file("sequenza", "install"), + wrapper: + wf.wrapper_path("r") + + +rule somatic_targeted_seq_cnv_calling_sequenza_gcreference: + output: + **wf.get_output_files("sequenza", "gcreference"), + threads: wf.get_resource("sequenza", "gcreference", "threads") + resources: + time=wf.get_resource("sequenza", "gcreference", "time"), + memory=wf.get_resource("sequenza", "gcreference", "memory"), + partition=wf.get_resource("sequenza", "gcreference", "partition"), + tmpdir=wf.get_resource("sequenza", "gcreference", "tmpdir"), + log: + **wf.get_log_file("sequenza", "gcreference"), + wrapper: + wf.wrapper_path("sequenza/gcreference") + + +rule somatic_targeted_seq_cnv_calling_sequenza_run: + input: + unpack(wf.get_input_files("sequenza", "run")), + output: + **wf.get_output_files("sequenza", "run"), + threads: wf.get_resource("sequenza", "run", "threads") + resources: + time=wf.get_resource("sequenza", "run", "time"), + memory=wf.get_resource("sequenza", "run", "memory"), + partition=wf.get_resource("sequenza", "run", "partition"), + tmpdir=wf.get_resource("sequenza", "run", "tmpdir"), + log: + **wf.get_log_file("sequenza", "run"), + wrapper: + wf.wrapper_path("sequenza/run") + + +rule somatic_targeted_seq_cnv_calling_sequenza_report: + input: + **wf.get_input_files("sequenza", "report"), + output: + **wf.get_output_files("sequenza", "report"), + params: + sample_id=wf.get_params("sequenza", "report"), + threads: wf.get_resource("sequenza", "report", "threads") + resources: + time=wf.get_resource("sequenza", "report", "time"), + memory=wf.get_resource("sequenza", "report", "memory"), + partition=wf.get_resource("sequenza", "report", "partition"), + tmpdir=wf.get_resource("sequenza", "report", "tmpdir"), + log: + **wf.get_log_file("sequenza", "report"), + wrapper: + wf.wrapper_path("sequenza/report") + + +# Run PureCN ------------------------------------------------------ + + +rule somatic_targeted_seq_cnv_calling_purecn_coverage: + input: + unpack(wf.get_input_files("purecn", "coverage")), + output: + **wf.get_output_files("purecn", "coverage"), + threads: wf.get_resource("purecn", "coverage", "threads") + resources: + time=wf.get_resource("purecn", "coverage", "time"), + memory=wf.get_resource("purecn", "coverage", "memory"), + partition=wf.get_resource("purecn", "coverage", "partition"), + tmpdir=wf.get_resource("purecn", "coverage", "tmpdir"), + log: + **wf.get_log_file("purecn", "coverage"), + wrapper: + wf.wrapper_path("purecn/coverage") + + +rule somatic_targeted_seq_cnv_calling_purecn_run: + input: + unpack(wf.get_input_files("purecn", "run")), + output: + **wf.get_output_files("purecn", "run"), + threads: wf.get_resource("purecn", "run", "threads") + resources: + time=wf.get_resource("purecn", "run", "time"), + memory=wf.get_resource("purecn", "run", "memory"), + partition=wf.get_resource("purecn", "run", "partition"), + tmpdir=wf.get_resource("purecn", "run", "tmpdir"), + log: + **wf.get_log_file("purecn", "run"), + wrapper: + wf.wrapper_path("purecn/run") diff --git a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py index 4f80a78c5..91d708894 100644 --- a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py +++ b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py @@ -104,6 +104,7 @@ from biomedsheets.shortcuts import CancerCaseSheet, CancerCaseSheetOptions, is_not_background from snakemake.io import expand +from snappy_pipeline.base import UnsupportedActionException from snappy_pipeline.utils import dictify, listify from snappy_pipeline.workflows.abstract import ( BaseStep, @@ -120,7 +121,7 @@ # Default configuration somatic_targeted_seq_cnv_calling step_config: somatic_targeted_seq_cnv_calling: - tools: ['cnvkit'] # REQUIRED - available: 'cnvkit', 'copywriter', 'cnvetti_on_target' and 'cnvetti_off_target' + tools: ['cnvkit'] # REQUIRED - available: 'cnvkit', 'sequenza', 'cnvetti_on_target', 'cnvetti_off_target' and 'copywriter' (deprecated) path_ngs_mapping: ../ngs_mapping # REQUIRED cnvkit: path_target: REQUIRED # Usually ../panel_of_normals/output/cnvkit.target/out/cnvkit.target.bed @@ -162,6 +163,27 @@ segmetrics_alpha: 0.05 # [segmetrics] Significance cutoff segmetrics_bootstrap: 100 # [segmetrics] Number of bootstraps smooth_bootstrap: False # [segmetrics] Smooth bootstrap results + sequenza: + length: 50 + assembly: "hg19" # Must be hg38 for GRCh38. See copynumber for complete list (augmented with hg38) + extra_args: {} # Extra arguments for sequenza bam2seqz, valid values: + # hom: 0.9 # Threshold to select homozygous positions + # het: 0.25 # Threshold to select heterozygous positions + # qlimit: 20 # Minimum nucleotide quality score for inclusion in the counts + # qformat: "sanger" # Quality format, options are "sanger" or "illumina". This will add an offset of 33 or 64 respectively to the qlimit value + ignore_chroms: # patterns of chromosome names to ignore + [X, Y, MT, NC_007605. hs37d5, chrEBV, '*_decoy', 'HLA-*', 'GL000220.*'] # Genome hs37d5 + # [chrX, chrY, chrM, '*_random', 'chrUn_*', chrEBV, '*_decoy', 'HPV*', CMV, HBV, KSHV, MCV, SV40, 'HCV-*', 'HIV-*', 'HTLV-*'] # Genome GRch38.d1.vd1 + extra_args_extract: # Valid arguments: see ?sequenza::sequenza.extract in R + gamma: 60 # scarHRD value + kmin: 50 # scarHRD value + extra_args_fit: # Valid arguments: see ?sequenza::sequenza.fit in R + N.ratio.filter: 10 # scarHRD value + N.BAF.filter: 1 # scarHRD value + segment.filter: 3000000 # scarHRD value + mufreq.treshold: 0.1 # scarHRD value + ratio.priority: False # scarHRD value + ploidy: [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5] copywriter: path_target_regions: REQUIRED # REQUIRED bin_size: 20000 # TODO: make actually configurable @@ -170,6 +192,24 @@ features: EnsDb.Hsapiens.v75::EnsDb.Hsapiens.v75 prefix: '' nThread: 8 + purecn: + genome_name: "unknown" # Must be one from hg18, hg19, hg38, mm9, mm10, rn4, rn5, rn6, canFam3 + enrichment_kit_name: "unknown" # For filename only... + mappability: "" # GRCh38: /fast/work/groups/cubi/projects/biotools/static_data/app_support/PureCN/hg38/mappability.bw + reptiming: "" # Nothing for GRCh38 + seed: 1234567 + extra_commands: # Recommended extra arguments for PureCN, extra_arguments: [] to clear them all + model: betabin + "fun-segmentation": PSCBS + "post-optimize": "" # post-optimize is a flag + # A PureCN panel of normals is required, with the container, the intervals & the PON rds file + path_container: REQUIRED # ../panel_of_normals/work/containers/out/purecn.simg + path_intervals: REQUIRED # ../panel_of_normals/output/purecn/out/_.list + path_panel_of_normals: REQUIRED # ../panel_of_normals/output/bwa.purecn/out/bwa.purecn.panel_of_normals.rds + path_mapping_bias: REQUIRED # ../panel_of_normals/output/bwa.purecn/out/bwa.purecn.mapping_bias.rds + # IMPORTANT NOTE: Mutect2 must be called with "--genotype-germline-sites true --genotype-pon-sites true" + somatic_variant_caller: "mutect2" + path_somatic_variants: ../somatic_variant_calling_for_purecn cnvetti_on_target: path_target_regions: REQUIRED # REQUIRED cnvetti_off_target: @@ -215,6 +255,18 @@ def get_normal_lib_name(self, wildcards): pair = self.tumor_ngs_library_to_sample_pair[wildcards.library_name] return pair.normal_sample.dna_ngs_library.name + @staticmethod + @dictify + def _get_log_file_from_prefix(prefix): + key_ext = ( + ("log", ".log"), + ("conda_info", ".conda_info.txt"), + ("conda_list", ".conda_list.txt"), + ) + for key, ext in key_ext: + yield key, prefix + ext + yield key + "_md5", prefix + ext + ".md5" + class CnvettiStepPartBase(SomaticTargetedSeqCnvCallingStepPart): """Perform somatic targeted CNV calling using CNVetti; shared code. @@ -351,19 +403,13 @@ def check_config(self): "Path to target regions is missing for {}".format(self.name), ) - @dictify def _get_log_file(self, action): """Return path to log file for the given action""" # Validate action self._validate_action(action) name_pattern = self.name_pattern.format(action=action) - key_ext = ( - ("log", ".log"), - ("conda_info", ".conda_info.txt"), - ("conda_list", ".conda_list.txt"), - ) - for key, ext in key_ext: - yield key, os.path.join("work", name_pattern, "log", name_pattern + ext) + prefix = os.path.join("work", name_pattern, "log", name_pattern) + return self._get_log_file_from_prefix(prefix) def get_resource_usage(self, action): """Get Resource Usage @@ -420,6 +466,225 @@ def format_id(*args): return {key: "{{{}}}".format(key) for key in args} +class SequenzaStepPart(SomaticTargetedSeqCnvCallingStepPart): + """Perform somatic targeted CNV calling using sequenza""" + + #: Step name + name = "sequenza" + + #: Class available actions + actions = ( + "install", + "gcreference", + "run", + "report", + ) + + #: Class resource usage dictionary. Key: action type (string); Value: resource (ResourceUsage). + resource_usage = { + "run": ResourceUsage( + threads=4, + time="24:00:00", # 1 day + memory="16G", + ), + } + + def __init__(self, parent): + super().__init__(parent) + + def get_input_files(self, action): + """Return input paths input function, dependent on rule""" + # Validate action + self._validate_action(action) + + method_mapping = { + "run": self._get_input_files_run(), + "report": self._get_input_files_report(), + } + return method_mapping[action] + + def _get_input_files_run(self): + @dictify + def input_function(wildcards): + ngs_mapping = self.parent.sub_workflows["ngs_mapping"] + normal_base_path = ( + "output/{mapper}.{normal_library}/out/{mapper}.{normal_library}".format( + normal_library=self.get_normal_lib_name(wildcards), **wildcards + ) + ) + tumor_base_path = "output/{mapper}.{library_name}/out/{mapper}.{library_name}".format( + **wildcards + ) + yield "gc", "work/static_data/out/sequenza.{length}.wig.gz".format( + length=self.config["sequenza"]["length"], + ) + yield "normal_bam", ngs_mapping(normal_base_path + ".bam") + yield "normal_bai", ngs_mapping(normal_base_path + ".bam.bai") + yield "tumor_bam", ngs_mapping(tumor_base_path + ".bam") + yield "tumor_bai", ngs_mapping(tumor_base_path + ".bam.bai") + + return input_function + + def _get_input_files_report(self): + return { + "packages": "work/R_packages/out/sequenza.done", + "seqz": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz", + } + + def get_output_files(self, action): + if action == "install": + return {"done": "work/R_packages/out/sequenza.done"} + elif action == "gcreference": + return { + "gc": "work/static_data/out/sequenza.{length}.wig.gz".format( + length=self.config["sequenza"]["length"], + ) + } + elif action == "run": + return { + "seqz": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz", + "seqz_md5": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz.md5", + } + elif action == "report": + return {"done": "work/{mapper}.sequenza.{library_name}/report/.done"} + else: + raise UnsupportedActionException( + "Action '{action}' is not supported. Valid options: {valid}".format( + action=action, valid=", ".join(self.actions) + ) + ) + + def get_params(self, action): + self._validate_action(action) + return self._get_params_report + + def _get_params_report(self, wildcards): + return wildcards["library_name"] + + def get_log_file(self, action): + """Return dict of log files.""" + # Validate action + self._validate_action(action) + if action == "install": + prefix = "work/R_packages/log/sequenza" + elif action == "gcreference": + prefix = "work/static_data/log/sequenza.{length}".format( + length=self.config["sequenza"]["length"], + ) + else: + name_pattern = "{mapper}.sequenza.{library_name}" + prefix = os.path.join("work", name_pattern, "log", name_pattern + "." + action) + return self._get_log_file_from_prefix(prefix) + + +class PureCNStepPart(SomaticTargetedSeqCnvCallingStepPart): + """Perform somatic targeted CNV calling using PureCN""" + + #: Step name + name = "purecn" + + #: Class available actions + actions = ("coverage", "run") + + resource_usage = { + "coverage": ResourceUsage( + threads=1, + time="04:00:00", # 4 hours + memory="24G", + ), + "run": ResourceUsage( + threads=4, + time="24:00:00", # 4 hours + memory="96G", + ), + } + + def get_input_files(self, action): + """Return input paths input function, dependent on rule""" + # Validate action + self._validate_action(action) + action_mapping = { + "coverage": self._get_input_files_coverage, + "run": self._get_input_files_run, + } + return action_mapping[action] + + @dictify + def _get_input_files_run(self, wildcards): + name_pattern = "{mapper}.purecn.{library_name}".format(**wildcards) + yield "tumor", os.path.join( + "work", + name_pattern, + "out", + "{mapper}.{library_name}_coverage_loess.txt.gz".format(**wildcards), + ) + name_pattern = "{mapper}.{caller}.{library_name}".format( + caller=self.config["purecn"]["somatic_variant_caller"], + **wildcards, + ) + base_path = os.path.join("output", name_pattern, "out", name_pattern + ".full.vcf.gz") + variant_calling = self.parent.sub_workflows["somatic_variants"] + yield "vcf", variant_calling(base_path) + + @dictify + def _get_input_files_coverage(self, wildcards): + ngs_mapping = self.parent.sub_workflows["ngs_mapping"] + name_pattern = "{mapper}.{library_name}".format(**wildcards) + base_path = os.path.join("output", name_pattern, "out", name_pattern) + yield "bam", ngs_mapping(base_path + ".bam") + yield "bai", ngs_mapping(base_path + ".bam.bai") + + def get_output_files(self, action): + """Return output paths, dependent on rule""" + # Validate action + self._validate_action(action) + name_pattern = "{mapper}.purecn.{library_name}" + prefix = os.path.join("work", name_pattern, "out", "{library_name}") + action_mapping = { + "coverage": { + "coverage": os.path.join( + "work", name_pattern, "out", "{mapper}.{library_name}_coverage_loess.txt.gz" + ) + }, + "run": { + "segments": prefix + "_dnacopy.seg", + "ploidy": prefix + ".csv", + "pvalues": prefix + "_amplification_pvalues.csv", + "vcf": prefix + ".vcf.gz", + "vcf_tbi": prefix + ".vcf.gz.tbi", + "loh": prefix + "_loh.csv", + "segments_md5": prefix + "_dnacopy.seg.md5", + "ploidy_md5": prefix + ".csv.md5", + "pvalues_md5": prefix + "_amplification_pvalues.csv.md5", + "vcf_md5": prefix + ".vcf.gz.md5", + "vcf_tbi_md5": prefix + ".vcf.gz.tbi.md5", + "loh_md5": prefix + "_loh.csv.md5", + }, + } + return action_mapping[action] + + def get_log_file(self, action): + """Return dict of log files.""" + # Validate action + self._validate_action(action) + + name_pattern = "{mapper}.purecn.{library_name}" + prefix = os.path.join("work", name_pattern, "log", name_pattern + "." + action) + return self._get_log_file_from_prefix(prefix) + + def check_config(self): + if self.name not in self.config["tools"]: + return # skip check + self.parent.ensure_w_config( + ("step_config", "somatic_targeted_seq_cnv_calling", self.name, "path_panel_of_normals"), + "Path to the PureCN panel of normal is missing", + ) + self.parent.ensure_w_config( + ("step_config", "somatic_targeted_seq_cnv_calling", self.name, "path_mapping_bias"), + "Path to the PureCN mapping bias file is missing (created in the panel_of_normals step)", + ) + + class CnvKitStepPart(SomaticTargetedSeqCnvCallingStepPart): """Perform somatic targeted CNV calling using cnvkit""" @@ -438,8 +703,11 @@ class CnvKitStepPart(SomaticTargetedSeqCnvCallingStepPart): "report", ) + # Overwrite defaults + default_resource_usage = ResourceUsage(threads=1, time="03:59:59", memory="7680M") # 4h + #: Class resource usage dictionary. Key: action type (string); Value: resource (ResourceUsage). - resource_usage_dict = { + resource_usage = { "plot": ResourceUsage( threads=1, time="08:00:00", # 1 day @@ -450,11 +718,6 @@ class CnvKitStepPart(SomaticTargetedSeqCnvCallingStepPart): time="08:00:00", # 8 hours memory=f"{16 * 1024}M", ), - "default": ResourceUsage( - threads=1, - time="03:59:59", # 1 day - memory=f"{int(7.5 * 1024)}M", - ), } def __init__(self, parent): @@ -689,33 +952,7 @@ def get_log_file(self, action): "work/{{mapper}}.cnvkit.{{library_name}}/log/" "{{mapper}}.cnvkit.{action}.{{library_name}}" ).format(action=action) - key_ext = ( - ("log", ".log"), - ("conda_info", ".conda_info.txt"), - ("conda_list", ".conda_list.txt"), - ) - log_files = {} - for key, ext in key_ext: - log_files[key] = prefix + ext - log_files[key + "_md5"] = prefix + ext + ".md5" - return log_files - - def get_resource_usage(self, action): - """Get Resource Usage - - :param action: Action (i.e., step) in the workflow, example: 'run'. - :type action: str - - :return: Returns ResourceUsage for step. - """ - # Validate action - self._validate_action(action) - if action == "plot": - return self.resource_usage_dict.get("plot") - elif action == "coverage": - return self.resource_usage_dict.get("coverage") - else: - return self.resource_usage_dict.get("default") + return self._get_log_file_from_prefix(prefix) class CopywriterStepPart(SomaticTargetedSeqCnvCallingStepPart): @@ -731,7 +968,7 @@ class CopywriterStepPart(SomaticTargetedSeqCnvCallingStepPart): actions_w_in_out = ("run", "call") #: Class resource usage dictionary. Key: action type (string); Value: resource (ResourceUsage). - resource_usage_dict = { + resource_usage = { "prepare": ResourceUsage( threads=1, time="02:00:00", # 2 hours @@ -844,41 +1081,18 @@ def check_config(self): "Path to target regions is missing", ) - @dictify - def _get_log_file(self, action): + def get_log_file(self, action): """Return path to log file for the given action""" # Validate action self._validate_action(action) - key_ext = ( - ("log", ".log"), - ("conda_info", ".conda_info.txt"), - ("conda_list", ".conda_list.txt"), - ) - if action == "prepare": log_file = "work/copywriter.prepare/log/snakemake.log" - yield "log", log_file - yield "log_md5", log_file + ".md5" - elif action in ("call", "run"): - tpl = ( - "work/{mapper}.copywriter.{library_name}/log/{mapper}.copywriter.{library_name}." - + action - ) - for key, ext in key_ext: - yield key, tpl + ext - - def get_resource_usage(self, action): - """Get Resource Usage - - :param action: Action (i.e., step) in the workflow, example: 'run'. - :type action: str - - :return: Returns ResourceUsage for step. - """ - # Validate action - self._validate_action(action) - return self.resource_usage_dict.get(action) + return {"log": log_file, "log_md5": log_file + ".md5"} + else: + name_pattern = "{mapper}.copywriter.{library_name}" + prefix = os.path.join("work", name_pattern, "log", name_pattern + "." + action) + return self._get_log_file_from_prefix(prefix) class SomaticTargetedSeqCnvCallingWorkflow(BaseStep): @@ -915,17 +1129,27 @@ def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir) CnvettiOnTargetStepPart, CnvKitStepPart, CopywriterStepPart, + SequenzaStepPart, + PureCNStepPart, LinkOutStepPart, ) ) # Initialize sub-workflows self.register_sub_workflow("ngs_mapping", self.config["path_ngs_mapping"]) + if "purecn" in self.config["tools"]: + self.register_sub_workflow( + "somatic_variant_calling", + self.config["purecn"]["path_somatic_variants"], + "somatic_variants", + ) @listify def get_result_files(self): """Return list of result files for the somatic targeted sequencing CNV calling step""" tool_actions = { "cnvkit": ["fix", "postprocess", "report", "export"], + "sequenza": ("run",), + "purecn": ("run",), "copywriter": ("call",), "cnvetti_on_target": ("coverage", "segment", "postprocess"), "cnvetti_off_target": ("coverage", "segment", "postprocess"), @@ -951,7 +1175,7 @@ def get_result_files(self): except AttributeError: tpls = [self.sub_steps[tool].get_output_files(action)] try: - tpls += self.sub_steps[tool].get_log_file(action).values() + tpls += list(self.sub_steps[tool].get_log_file(action).values()) except AttributeError: tpls += [self.sub_steps[tool].get_log_file(action)] for tpl in tpls: @@ -961,7 +1185,7 @@ def get_result_files(self): library_name=[sample_pair.tumor_sample.dna_ngs_library.name], ) for f in filenames: - if ".tmp." not in f: + if ".tmp." not in f and not f.endswith("/.done"): yield f.replace("work/", "output/") def check_config(self): diff --git a/snappy_wrappers/wrappers/mutect2/create_panel/wrapper.py b/snappy_wrappers/wrappers/mutect2/create_panel/wrapper.py index 8c3742c00..a800cf953 100644 --- a/snappy_wrappers/wrappers/mutect2/create_panel/wrapper.py +++ b/snappy_wrappers/wrappers/mutect2/create_panel/wrapper.py @@ -50,6 +50,7 @@ mkdir -p ${{tmpdir}}/vcfs out_base=${{tmpdir}}/out/$(basename {snakemake.output.vcf} .vcf.gz) +mkdir -p $out_base vcfs=$(echo "{snakemake.input.normals}" | tr ' ' '\n') @@ -67,7 +68,7 @@ sort ${{tmpdir}}/contigs_all.list | uniq > ${{tmpdir}}/contigs.list # Create the genomicsdb -rm -rf pon_db +rm -rf ${{tmpdir}}/pon_db gatk --java-options '-Xms10000m -Xmx20000m' GenomicsDBImport \ --tmp-dir ${{tmpdir}} \ --reference {snakemake.config[static_data_config][reference][path]} \ @@ -86,13 +87,28 @@ bgzip ${{out_base}}.vcf tabix -f ${{out_base}}.vcf.gz -pushd $tmpdir && \ - for f in ${{out_base}}.*; do \ - md5sum $f >$f.md5; \ - done && \ - popd - -mv ${{out_base}}.* $(dirname {snakemake.output.vcf}) +# Make a copy of the genomics database for PureCN +# NOTE: the sleep & true commands are required to work around +# a tar error triggered by a cephfs bug/feature +# (https://ceph-users.ceph.narkive.com/th0JxsKR/cephfs-tar-archiving-immediately-after-writing) +# The bug is probably triggered because GATK genomicsdb is large is size & can contain 100000s files +sleep 10 +tar -zcvf {snakemake.output.db} -C ${{tmpdir}} pon_db || true + +# Copy the results to destination & compute checksums +cp ${{out_base}}.vcf.gz {snakemake.output.vcf} +cp ${{out_base}}.vcf.gz.tbi {snakemake.output.vcf}.tbi + +pushd $(dirname {snakemake.output.vcf}) +f=$(basename {snakemake.output.vcf}) +md5sum $f > $f.md5 +md5sum $f.tbi > $f.tbi.md5 +popd + +pushd $(dirname {snakemake.output.db}) +f=$(basename {snakemake.output.db}) +md5sum $f > $f.md5 +popd """ ) diff --git a/snappy_wrappers/wrappers/scarHRD/gcreference/environment.yaml b/snappy_wrappers/wrappers/purecn/coverage/environment.yaml similarity index 100% rename from snappy_wrappers/wrappers/scarHRD/gcreference/environment.yaml rename to snappy_wrappers/wrappers/purecn/coverage/environment.yaml diff --git a/snappy_wrappers/wrappers/purecn/coverage/wrapper.py b/snappy_wrappers/wrappers/purecn/coverage/wrapper.py new file mode 100644 index 000000000..20ae81288 --- /dev/null +++ b/snappy_wrappers/wrappers/purecn/coverage/wrapper.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +"""CUBI+Snakemake wrapper code for computing PureCN coverage +""" + +import os + +from snakemake import shell + +__author__ = "Eric Blanc " + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step]["purecn"] + +if "container" in snakemake.input.keys() and snakemake.input.container: + container = snakemake.input.container +elif "path_container" in config.keys() and config["path_container"]: + container = config["path_container"] +else: + raise Exception("No path to PureCN container") + +if "intervals" in snakemake.input.keys() and snakemake.input.intervals: + intervals = snakemake.input.intervals +elif "path_intervals" in config.keys() and config["path_intervals"]: + intervals = config["path_intervals"] +else: + raise Exception("No path to PureCN intervals") + +# Prepare files and directories that must be accessible by the container +files_to_bind = { + "bam": snakemake.input.bam, +} +if "intervals" not in snakemake.input.keys(): + files_to_bind["intervals"] = intervals + +# Replace with full absolute paths +files_to_bind = {k: os.path.realpath(v) for k, v in files_to_bind.items()} +# Directories that mut be bound +dirs_to_bind = {k: os.path.dirname(v) for k, v in files_to_bind.items()} +# List of unique directories to bind: on cluster: -> from container: /bindings/d) +bound_dirs = {e[1]: e[0] for e in enumerate(list(set(dirs_to_bind.values())))} +# Binding command +bindings = " ".join(["-B {}:/bindings/d{}:ro".format(k, v) for k, v in bound_dirs.items()]) +# Path to files from the container +bound_files = { + k: "/bindings/d{}/{}".format(bound_dirs[dirs_to_bind[k]], os.path.basename(v)) + for k, v in files_to_bind.items() +} + +if "intervals" in bound_files.keys(): + intervals = bound_files["intervals"] + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Also pipe everything to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec &> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Setup auto-cleaned tmpdir +export tmpdir=$(mktemp -d) +trap "rm -rf $tmpdir" EXIT + +# Create coverage +cmd="/usr/local/bin/Rscript /opt/PureCN/Coverage.R --force \ + --seed {config[seed]} \ + --out-dir $(dirname {snakemake.output.coverage}) \ + --bam {bound_files[bam]} \ + --intervals {intervals} +" +mkdir -p $(dirname {snakemake.output.coverage}) +apptainer exec --home $PWD {bindings} {container} $cmd + +pushd $(dirname {snakemake.output.coverage}) +md5sum $(basename {snakemake.output.coverage}) > $(basename {snakemake.output.coverage}).md5 +popd +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/scarHRD/install/environment.yaml b/snappy_wrappers/wrappers/purecn/create_panel/environment.yaml similarity index 100% rename from snappy_wrappers/wrappers/scarHRD/install/environment.yaml rename to snappy_wrappers/wrappers/purecn/create_panel/environment.yaml diff --git a/snappy_wrappers/wrappers/purecn/create_panel/wrapper.py b/snappy_wrappers/wrappers/purecn/create_panel/wrapper.py new file mode 100644 index 000000000..9ee6f63d4 --- /dev/null +++ b/snappy_wrappers/wrappers/purecn/create_panel/wrapper.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +"""CUBI+Snakemake wrapper code for preparing PureCN panel of normals +""" + +import os +import tempfile + +from snakemake import shell + +__author__ = "Eric Blanc " + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step]["purecn"] + +if "genomicsDB" in config.keys() and config["genomicsDB"]: + genomicsDB = config["genomicsDB"] +else: + genomicsDB = "" + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Also pipe everything to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec &> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Setup auto-cleaned tmpdir +export tmpdir=$(mktemp -d) +trap "rm -rf $tmpdir" EXIT + +# MD5 checksums without dirname +md5() {{ + fn=$1 + d=$(dirname $fn) + f=$(basename $fn) + pushd $d 1> /dev/null 2>&1 + checksum=$(md5sum $f) + popd 1> /dev/null 2>&1 + echo $checksum +}} + +outdir=$tmpdir/out +mkdir -p $outdir + +mkdir $tmpdir/extra +echo "{snakemake.input.normals}" | tr " " "\n" > $tmpdir/extra/filenames.txt + +# Extract Mutect2 genomicsDB when present +if [[ -n "{genomicsDB}" ]] +then + pushd $tmpdir ; tar -zxvf {genomicsDB} ; popd + normal_panel=" --normal-panel /pon_db " +else + mkdir $tmpdir/pon_db + normal_panel="" +fi + +# Create panel +cmd="/usr/local/bin/Rscript /opt/PureCN/NormalDB.R \ + --out-dir /output \ + --coverage-files /extra/filenames.txt $normal_panel \ + --genome {config[genome_name]} --assay {config[enrichment_kit_name]} +" +apptainer exec --home $PWD -B $outdir:/output -B $tmpdir/pon_db:/pon_db:ro -B $tmpdir/extra:/extra:ro {snakemake.input.container} $cmd + +# Move output to destination +mv $outdir/normalDB_{config[enrichment_kit_name]}_{config[genome_name]}.rds {snakemake.output.db} +mv $outdir/mapping_bias_{config[enrichment_kit_name]}_{config[genome_name]}.rds {snakemake.output.mapbias} +mv $outdir/mapping_bias_hq_sites_{config[enrichment_kit_name]}_{config[genome_name]}.bed {snakemake.output.hq} +mv $outdir/low_coverage_targets_{config[enrichment_kit_name]}_{config[genome_name]}.bed {snakemake.output.lowcov} +mv $outdir/interval_weights_{config[enrichment_kit_name]}_{config[genome_name]}.png {snakemake.output.plot} + +# MD5 checksum for main result only +md5 {snakemake.output.db} > {snakemake.output.db}.md5 +md5 {snakemake.output.mapbias} > {snakemake.output.mapbias}.md5 +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/purecn/environment.yaml b/snappy_wrappers/wrappers/purecn/environment.yaml new file mode 100644 index 000000000..514a8220e --- /dev/null +++ b/snappy_wrappers/wrappers/purecn/environment.yaml @@ -0,0 +1,5 @@ +channels: + - conda-forge + - bioconda +dependencies: + - htslib diff --git a/snappy_wrappers/wrappers/purecn/prepare/environment.yaml b/snappy_wrappers/wrappers/purecn/prepare/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/purecn/prepare/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/purecn/prepare/wrapper.py b/snappy_wrappers/wrappers/purecn/prepare/wrapper.py new file mode 100644 index 000000000..f72addccc --- /dev/null +++ b/snappy_wrappers/wrappers/purecn/prepare/wrapper.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +"""CUBI+Snakemake wrapper code for preparing exome kit intervals for PureCN +""" + +import os + +from snakemake import shell + +__author__ = "Eric Blanc " + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step]["purecn"] + +genome = snakemake.config["static_data_config"]["reference"]["path"] + +# Prepare files and directories that must be accessible by the container +bound_files = { + "genome": os.path.normpath(genome), + "path_bait_regions": os.path.normpath(config["path_bait_regions"]), + "mappability": os.path.normpath(config["mappability"]) + if "mappability" in config and config["mappability"] + else "", + "reptiming": os.path.normpath(config["reptiming"]) + if "reptiming" in config and config["reptiming"] + else "", +} + +keys = list(bound_files.keys()) +bindings = [] +for i in range(len(keys)): + k = keys[i] + if bound_files[k]: + # Binding directory to /bindings/d + bindings.append(" -B {}:/bindings/d{}:ro".format(os.path.dirname(bound_files[k]), i)) + bound_files[k] = "/bindings/d{}/{}".format(i, os.path.basename(bound_files[k])) +bindings = " ".join(bindings) + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Also pipe everything to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec &> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Setup auto-cleaned tmpdir +export tmpdir=$(mktemp -d) +trap "rm -rf $tmpdir" EXIT + +md5() {{ + d=$(dirname $1) + f=$(basename $1) + pushd $d 1> /dev/null 2>&1 + md5sum $f > $f.md5 + popd 1> /dev/null 2>&1 +}} + +# Create panel +uncompressed=$(echo "{snakemake.output.optimized}" | sed -e "s/\.gz$//") + +cmd="/usr/local/bin/Rscript /opt/PureCN/IntervalFile.R \ + --out-file {snakemake.output.intervals} \ + --export $uncompressed \ + --in-file {bound_files[path_bait_regions]} \ + --fasta {bound_files[genome]} --genome {config[genome_name]} \ + $(if [[ -n "{bound_files[mappability]}" ]]; then \ + echo "--mappability {bound_files[mappability]}" + fi) \ + $(if [[ -n "{bound_files[reptiming]}" ]]; then \ + echo "--reptiming {bound_files[reptiming]}" + fi) +" + +mkdir -p $(dirname {snakemake.output.intervals}) +mkdir -p $(dirname $uncompressed) + +apptainer exec --home $PWD {bindings} {snakemake.input.container} $cmd + +bgzip $uncompressed +tabix {snakemake.output.optimized} + +md5 {snakemake.output.intervals} +md5 {snakemake.output.optimized} +md5 {snakemake.output.optimized}.tbi +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/purecn/run/environment.yaml b/snappy_wrappers/wrappers/purecn/run/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/purecn/run/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/purecn/run/wrapper.py b/snappy_wrappers/wrappers/purecn/run/wrapper.py new file mode 100644 index 000000000..0db05d037 --- /dev/null +++ b/snappy_wrappers/wrappers/purecn/run/wrapper.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +"""CUBI+Snakemake wrapper code for computing CNV using PureCN +""" + +import os + +from snakemake import shell + +__author__ = "Eric Blanc " + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step]["purecn"] + +# WARNING- these extra commands cannot contain file paths +extra_commands = " ".join( + [ + " --{}={}".format(k, v) if v else " --{}".format(k) + for k, v in config["extra_commands"].items() + ] +) + +# List files that must be accessible from the container +files_to_bind = { + "vcf": snakemake.input.vcf, + "mapping_bias": config["path_mapping_bias"], + "normaldb": config["path_panel_of_normals"], + "intervals": config["path_intervals"], +} +if "snp_blacklist" in config.keys() and config["snp_blacklist"]: + files_to_bind["snp-blacklist"] = config["snp_blacklist"] +if "segments" in snakemake.input.keys() and snakemake.input.segments: + files_to_bind["seg-file"] = snakemake.input.segments +if "log2" in snakemake.input.keys() and snakemake.input.log2: + files_to_bind["log-ratio-file"] = snakemake.input.log2 + +# TODO: Put the following in a function (decide where...) +# Replace with full absolute paths +files_to_bind = {k: os.path.realpath(v) for k, v in files_to_bind.items()} +# Directories that mut be bound +dirs_to_bind = {k: os.path.dirname(v) for k, v in files_to_bind.items()} +# List of unique directories to bind: on cluster: -> from container: /bindings/d) +bound_dirs = {e[1]: e[0] for e in enumerate(list(set(dirs_to_bind.values())))} +# Binding command +bindings = " ".join(["-B {}:/bindings/d{}:ro".format(k, v) for k, v in bound_dirs.items()]) +# Path to files from the container +bound_files = { + k: "/bindings/d{}/{}".format(bound_dirs[dirs_to_bind[k]], os.path.basename(v)) + for k, v in files_to_bind.items() +} + +if "snp-blacklist" in bound_files.keys(): + extra_commands += " --snp-blacklist={}".format(bound_files["snp-blacklist"]) +if "seg-file" in bound_files.keys(): + extra_commands += " --seg-file={}".format(bound_files["seg-file"]) +if "log-ratio-file" in bound_files.keys(): + extra_commands += " --log-ratio-file={}".format(bound_files["log-ratio-file"]) + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Also pipe everything to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec &> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Setup auto-cleaned tmpdir +export tmpdir=$(mktemp -d) +trap "rm -rf $tmpdir" EXIT + +# Compute md5 checksum +md5() {{ + fn=$1 + d=$(dirname $fn) + f=$(basename $fn) + pushd $d 1> /dev/null 2>&1 + checksum=$(md5sum $f) + popd 1> /dev/null 2>&1 + echo "$checksum" +}} + +outdir=$(dirname {snakemake.output.segments}) +mkdir -p $outdir + +# Run PureCN with a panel of normals +cmd="/usr/local/bin/Rscript PureCN.R \ + --sampleid {snakemake.wildcards[library_name]} \ + --tumor {snakemake.input.tumor} \ + --vcf {bound_files[vcf]} \ + --mapping-bias-file {bound_files[mapping_bias]} \ + --normaldb {bound_files[normaldb]} \ + --intervals {bound_files[intervals]} \ + --genome {config[genome_name]} \ + --out $outdir --out-vcf --force \ + --seed {config[seed]} --parallel --cores={snakemake.threads} \ + {extra_commands} +" +apptainer exec --home $PWD {bindings} {config[path_container]} $cmd + +md5 {snakemake.output.segments} > {snakemake.output.segments_md5} +md5 {snakemake.output.ploidy} > {snakemake.output.ploidy_md5} +md5 {snakemake.output.pvalues} > {snakemake.output.pvalues_md5} +md5 {snakemake.output.vcf} > {snakemake.output.vcf_md5} +md5 {snakemake.output.vcf_tbi} > {snakemake.output.vcf_tbi_md5} +md5 {snakemake.output.loh} > {snakemake.output.loh_md5} +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/r/environment.yaml b/snappy_wrappers/wrappers/r/environment.yaml new file mode 100644 index 000000000..20218ccdf --- /dev/null +++ b/snappy_wrappers/wrappers/r/environment.yaml @@ -0,0 +1,7 @@ +channels: + - conda-forge + - bioconda +dependencies: + - r-base + - r-remotes + - r-biocmanager \ No newline at end of file diff --git a/snappy_wrappers/wrappers/r/wrapper.py b/snappy_wrappers/wrappers/r/wrapper.py new file mode 100644 index 000000000..059419c33 --- /dev/null +++ b/snappy_wrappers/wrappers/r/wrapper.py @@ -0,0 +1,69 @@ +"""CUBI+Snakemake wrapper code for non-conda package installation +""" + +from snakemake import shell + +__author__ = "Eric Blanc " + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step] + +if "packages" in snakemake.params.keys(): + packages = snakemake.params["packages"] +elif "packages" in config.keys(): + packages = config["packages"] +else: + packages = None + +assert packages is not None +assert isinstance(packages, list) +assert len(packages) > 0 + +to_install = [] +for package in packages: + package = dict(package) + to_install.append('list(name="{}", repo="{}")'.format(package["name"], package["repo"])) +to_install = "list({})".format(", ".join(to_install)) + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Also pipe stderr to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +R --vanilla --slave << __EOF +for (pkg in {to_install}) {{ + if (pkg[["repo"]] == "cran") install.packages(pkg[["name"]], lib=dirname("{snakemake.output.done}"), update=FALSE, ask=FALSE) + if (pkg[["repo"]] == "bioconductor") BiocManager::install(pkg[["name"]], lib=dirname("{snakemake.output.done}"), update=FALSE, ask=FALSE) + if (pkg[["repo"]] == "github") remotes::install_github(pkg[["name"]], lib=dirname("{snakemake.output.done}"), upgrade="never") + if (pkg[["repo"]] == "bitbucket") remotes::install_bitbucket(pkg[["name"]], lib=dirname("{snakemake.output.done}"), upgrade="never") + if (pkg[["repo"]] == "local") remotes::install_local(pkg[["name"]], lib=dirname("{snakemake.output.done}"), upgrade="never") +}} +__EOF +touch {snakemake.output.done} +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/scarHRD/environment.yaml b/snappy_wrappers/wrappers/scarHRD/environment.yaml index b6a8c8b49..a86405d52 100644 --- a/snappy_wrappers/wrappers/scarHRD/environment.yaml +++ b/snappy_wrappers/wrappers/scarHRD/environment.yaml @@ -3,8 +3,4 @@ channels: - bioconda dependencies: - python =3.9 - - sequenza-utils - - r-sequenza - - r-devtools - - r-data.table - - samtools + - r-base diff --git a/snappy_wrappers/wrappers/scarHRD/run/wrapper.py b/snappy_wrappers/wrappers/scarHRD/run/wrapper.py index 6e414eade..7e1261fa5 100644 --- a/snappy_wrappers/wrappers/scarHRD/run/wrapper.py +++ b/snappy_wrappers/wrappers/scarHRD/run/wrapper.py @@ -7,7 +7,7 @@ __author__ = "Eric Blanc " -lib_path = os.path.dirname(snakemake.input.lib_path) +lib_path = os.path.dirname(snakemake.input.done) step = snakemake.config["pipeline_step"]["name"] genome = snakemake.config["static_data_config"]["reference"]["path"] @@ -46,19 +46,16 @@ fi fi -sequenza-utils bam2seqz \ - -gc {snakemake.input.gc} --fasta {genome} \ - -n {snakemake.input.normal_bam} --tumor {snakemake.input.tumor_bam} \ - -C {chromosomes} \ - | sequenza-utils seqz_binning -w {length} -s - \ - | gzip > {snakemake.output.sequenza} +export R_LIBS_USER="{lib_path}" +export VROOM_CONNECTION_SIZE=2000000000 + +export R_LIBS_PATH="{lib_path}" +export VROOM_CONNECTION_SIZE=2000000000 cat << __EOF | R --vanilla --slave -.libPaths(c("{lib_path}", .libPaths())) -Sys.setenv(VROOM_CONNECTION_SIZE=2000000000) library("scarHRD") -tbl <- scar_score("{snakemake.output.sequenza}", reference="{genome_name}", seqz=TRUE, chr.in.name={chr_in_name}) +tbl <- scar_score("{snakemake.input.seqz}", reference="{genome_name}", seqz=TRUE, chr.in.name={chr_in_name}, outputdir=dirname("{snakemake.output.scarHRD}")) cat('{{\n', file="{snakemake.output.scarHRD}") cat(' "HRD": ', tbl[1,1], ',\n', sep="", file="{snakemake.output.scarHRD}", append=TRUE) cat(' "Telomeric AI": ', tbl[1,2], ',\n', sep="", file="{snakemake.output.scarHRD}", append=TRUE) @@ -68,7 +65,6 @@ __EOF -pushd $(dirname {snakemake.output.sequenza}) ; f=$(basename {snakemake.output.sequenza}) ; md5sum $f > $f.md5 ; popd pushd $(dirname {snakemake.output.scarHRD}) ; f=$(basename {snakemake.output.scarHRD}) ; md5sum $f > $f.md5 ; popd """ ) diff --git a/snappy_wrappers/wrappers/sequenza/environment.yaml b/snappy_wrappers/wrappers/sequenza/environment.yaml new file mode 100644 index 000000000..b6a8c8b49 --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/environment.yaml @@ -0,0 +1,10 @@ +channels: + - conda-forge + - bioconda +dependencies: + - python =3.9 + - sequenza-utils + - r-sequenza + - r-devtools + - r-data.table + - samtools diff --git a/snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml b/snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/scarHRD/gcreference/wrapper.py b/snappy_wrappers/wrappers/sequenza/gcreference/wrapper.py similarity index 80% rename from snappy_wrappers/wrappers/scarHRD/gcreference/wrapper.py rename to snappy_wrappers/wrappers/sequenza/gcreference/wrapper.py index 1b9a2c4b0..0b230a26d 100644 --- a/snappy_wrappers/wrappers/scarHRD/gcreference/wrapper.py +++ b/snappy_wrappers/wrappers/sequenza/gcreference/wrapper.py @@ -1,4 +1,4 @@ -"""CUBI+Snakemake wrapper code for scarHRD (sequenza GC reference file) +"""CUBI+Snakemake wrapper code for sequenza GC reference file """ import os @@ -9,7 +9,7 @@ step = snakemake.config["pipeline_step"]["name"] genome = snakemake.config["static_data_config"]["reference"]["path"] -length = snakemake.config["step_config"][step]["scarHRD"]["length"] +length = snakemake.config["step_config"][step]["sequenza"]["length"] shell.executable("/bin/bash") @@ -34,10 +34,11 @@ fi fi -sequenza-utils gc_wiggle --fasta {genome} -w {length} -o {snakemake.output} +sequenza-utils gc_wiggle --fasta {genome} -w {length} -o {snakemake.output.gc} -pushd $(dirname {snakemake.output}) -md5sum $(basename {snakemake.output}) > $(basename {snakemake.output}).md5 +pushd $(dirname {snakemake.output.gc}) +md5sum $(basename {snakemake.output.gc}) > $(basename {snakemake.output.gc}).md5 +popd """ ) diff --git a/snappy_wrappers/wrappers/sequenza/report/environment.yaml b/snappy_wrappers/wrappers/sequenza/report/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/report/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/sequenza/report/wrapper.py b/snappy_wrappers/wrappers/sequenza/report/wrapper.py new file mode 100644 index 000000000..28c1b18a6 --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/report/wrapper.py @@ -0,0 +1,98 @@ +"""CUBI+Snakemake wrapper code for sequenza (R part, post-processing) +""" + +import os +import sys + +# The following is required for being able to import snappy_wrappers modules +# inside wrappers. These run in an "inner" snakemake process which uses its +# own conda environment which cannot see the snappy_pipeline installation. +base_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")) +sys.path.insert(0, base_dir) + +from snakemake import shell + +from snappy_wrappers.tools.genome_windows import yield_contigs + +__author__ = "Eric Blanc " + + +def config_to_r(x): + if x is None: + return "NULL" + if isinstance(x, str): + return f'"{x}"' + if isinstance(x, bool): + return "TRUE" if x else "FALSE" + if isinstance(x, list): + return "c({})".format(", ".join([config_to_r(xx) for xx in x])) + if isinstance(x, dict): + return "list({})".format( + ", ".join(['"{}"={}'.format(k, config_to_r(v)) for k, v in x.items()]) + ) + return str(x) + + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step]["sequenza"] +genome = snakemake.config["static_data_config"]["reference"]["path"] + +f = open(genome + ".fai", "rt") +contigs = config_to_r(list(yield_contigs(f, config.get("ignore_chroms")))) +f.close() + +args_extract = config_to_r(dict(config["extra_args_extract"])) +args_fit = config_to_r(dict(config["extra_args_fit"])) + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Also pipe stderr to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +export R_LIBS_USER=$(dirname {snakemake.input.packages}) + +R --vanilla --slave << __EOF +library(sequenza) + +args <- list(file="{snakemake.input.seqz}", assembly="{config[assembly]}", chromosome.list={contigs}) +args <- c(args, {args_extract}) +seqz <- do.call(sequenza.extract, args=args) + +args <- list(sequenza.extract=seqz, chromosome.list={contigs}, mc.cores=1) +args <- c(args, {args_fit}) +CP <- do.call(sequenza.fit, args=args) + +sequenza.results(sequenza.extract=seqz, cp.table=CP, sample.id="{snakemake.params[sample_id]}", out.dir=dirname("{snakemake.output.done}")) + +__EOF + +pushd $(dirname {snakemake.output.done}) ; for f in $(ls) ; do md5sum $f > $f.md5 ; done ; popd + +touch {snakemake.output.done} +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/sequenza/run/environment.yaml b/snappy_wrappers/wrappers/sequenza/run/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/run/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/sequenza/run/wrapper.py b/snappy_wrappers/wrappers/sequenza/run/wrapper.py new file mode 100644 index 000000000..13fa1f64d --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/run/wrapper.py @@ -0,0 +1,71 @@ +"""CUBI+Snakemake wrapper code for sequenza (sequenza-utils, pileups) +""" + +import os +import sys + +# The following is required for being able to import snappy_wrappers modules +# inside wrappers. These run in an "inner" snakemake process which uses its +# own conda environment which cannot see the snappy_pipeline installation. +base_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")) +sys.path.insert(0, base_dir) + +from snakemake import shell + +from snappy_wrappers.tools.genome_windows import yield_contigs + +__author__ = "Eric Blanc " + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step]["sequenza"] +genome = snakemake.config["static_data_config"]["reference"]["path"] +length = config["length"] + +f = open(genome + ".fai", "rt") +contigs = " ".join(yield_contigs(f, config.get("ignore_chroms"))) +f.close() + +extra_arguments = " ".join( + ["--{} {}".format(k, v) for k, v in config.get("extra_arguments", {}).items()] +) + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Also pipe stderr to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +sequenza-utils bam2seqz \ + -gc {snakemake.input.gc} --fasta {genome} \ + -n {snakemake.input.normal_bam} --tumor {snakemake.input.tumor_bam} \ + -C {contigs} {extra_arguments} \ + | sequenza-utils seqz_binning -s - \ + -w {length} -o {snakemake.output.seqz} + +pushd $(dirname {snakemake.output.seqz}) ; f=$(basename {snakemake.output.seqz}) ; md5sum $f > $f.md5 ; popd +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/singularity/environment.yaml b/snappy_wrappers/wrappers/singularity/environment.yaml new file mode 100644 index 000000000..894ebc8c5 --- /dev/null +++ b/snappy_wrappers/wrappers/singularity/environment.yaml @@ -0,0 +1,2 @@ +dependencies: + - python diff --git a/snappy_wrappers/wrappers/scarHRD/install/wrapper.py b/snappy_wrappers/wrappers/singularity/wrapper.py similarity index 56% rename from snappy_wrappers/wrappers/scarHRD/install/wrapper.py rename to snappy_wrappers/wrappers/singularity/wrapper.py index a9a9c15e0..f04eebdcc 100644 --- a/snappy_wrappers/wrappers/scarHRD/install/wrapper.py +++ b/snappy_wrappers/wrappers/singularity/wrapper.py @@ -1,13 +1,20 @@ -"""CUBI+Snakemake wrapper code for scarHRD (non-conda package installation) +# -*- coding: utf-8 -*- +"""CUBI+Snakemake wrapper code for preparing exome kit intervals for PureCN """ -import os - from snakemake import shell __author__ = "Eric Blanc " -lib_path = os.path.dirname(snakemake.output.lib_path) +container = None +if "container" in snakemake.params.keys() and snakemake.params["container"]: + container = snakemake.params["container"] +else: + step = snakemake.config["pipeline_step"]["name"] + config = snakemake.config["step_config"][step] + if "container" in config.keys() and config["container"]: + container = config["container"] +assert container, "Missing or illegal container image address" shell.executable("/bin/bash") @@ -15,28 +22,24 @@ r""" set -x -# Write out information about conda installation. -conda list >{snakemake.log.conda_list} -conda info >{snakemake.log.conda_info} -md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} -md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} - -# Also pipe stderr to log file +# Also pipe everything to log file if [[ -n "{snakemake.log.log}" ]]; then if [[ "$(set +e; tty; set -e)" != "" ]]; then rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) - exec 2> >(tee -a "{snakemake.log.log}" >&2) + exec &> >(tee -a "{snakemake.log.log}" >&2) else rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) echo "No tty, logging disabled" >"{snakemake.log.log}" fi fi -R --vanilla --slave << __EOF -devtools::install_github("aroneklund/copynumber", lib="{lib_path}", upgrade="never") -devtools::install_github("sztup/scarHRD", lib="{lib_path}", upgrade="never") -__EOF -touch {snakemake.output} +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +apptainer pull --name {snakemake.output.container} {container} """ ) diff --git a/tests/snappy_pipeline/workflows/test_workflows_homologous_recombination_deficiency.py b/tests/snappy_pipeline/workflows/test_workflows_homologous_recombination_deficiency.py index 3183a63e7..4ec289fd5 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_homologous_recombination_deficiency.py +++ b/tests/snappy_pipeline/workflows/test_workflows_homologous_recombination_deficiency.py @@ -31,12 +31,12 @@ def minimal_config(): step_config: ngs_mapping: tools: - dna: ['bwa'] - bwa: - path_index: /path/to/bwa/index.fasta + dna: [bwa] + somatic_targeted_seq_cnv_calling: + tools: ['sequenza'] homologous_recombination_deficiency: tools: ['scarHRD'] - path_ngs_mapping: ../ngs_mapping # REQUIRED + path_cnv_calling: ../somatic_targeted_seq_cnv_calling # REQUIRED data_sets: first_batch: @@ -64,7 +64,7 @@ def homologous_recombination_deficiency_workflow( """Return HomologousRecombinationDeficiencyWorkflow object pre-configured with cancer sheet""" # Patch out file-system related things in abstract (the crawling link in step is defined there) patch_module_fs("snappy_pipeline.workflows.abstract", cancer_sheet_fake_fs, mocker) - dummy_workflow.globals = {"ngs_mapping": lambda x: "NGS_MAPPING/" + x} + dummy_workflow.globals = {"cnv_calling": lambda x: "SOMATIC_CNV_CALLING/" + x} # Construct the workflow object return HomologousRecombinationDeficiencyWorkflow( dummy_workflow, @@ -80,14 +80,12 @@ def homologous_recombination_deficiency_workflow( def test_scarHRD_step_part_get_input_files_run(homologous_recombination_deficiency_workflow): """Tests ScarHRDStepPart.get_input_files() - run""" - wildcards = Wildcards(fromdict={"library_name": "P001-T1-DNA1-WGS1", "mapper": "bwa"}) + wildcards = Wildcards( + fromdict={"mapper": "bwa", "caller": "sequenza", "library_name": "P001-T1-DNA1-WGS1"} + ) expected = { - "lib_path": "work/R_packages/out/.done", - "gc": "work/static_data/out/grch37_50.wig.gz", - "normal_bai": "NGS_MAPPING/output/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.bam.bai", - "normal_bam": "NGS_MAPPING/output/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.bam", - "tumor_bai": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam.bai", - "tumor_bam": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam", + "done": "work/R_packages/out/scarHRD.done", + "seqz": "SOMATIC_CNV_CALLING/output/bwa.sequenza.P001-T1-DNA1-WGS1/out/bwa.sequenza.P001-T1-DNA1-WGS1.seqz.gz", } actual = homologous_recombination_deficiency_workflow.get_input_files("scarHRD", "run")( wildcards @@ -98,10 +96,12 @@ def test_scarHRD_step_part_get_input_files_run(homologous_recombination_deficien def test_scarHRD_step_part_get_output_files_run(homologous_recombination_deficiency_workflow): """Tests ScarHRDStepPart.get_output_files() - run""" # Define expected - base_name_out = "work/{mapper}.scarHRD.{library_name}/out/{mapper}.scarHRD.{library_name}" + base_name_out = ( + "work/{mapper}.{caller}.scarHRD.{library_name}/out/{mapper}.{caller}.scarHRD.{library_name}" + ) expected = { - "sequenza": base_name_out + ".seqz.gz", "scarHRD": base_name_out + ".json", + "scarHRD_md5": base_name_out + ".json.md5", } # Get actual actual = homologous_recombination_deficiency_workflow.get_output_files("scarHRD", "run") @@ -110,7 +110,9 @@ def test_scarHRD_step_part_get_output_files_run(homologous_recombination_deficie def test_scarHRD_step_part_get_log_file_run(homologous_recombination_deficiency_workflow): """Tests ScarHRDStepPart.get_log_file() - run""" - base_name = "work/{mapper}.scarHRD.{library_name}/log/{mapper}.scarHRD.{library_name}" + base_name = ( + "work/{mapper}.{caller}.scarHRD.{library_name}/log/{mapper}.{caller}.scarHRD.{library_name}" + ) expected = get_expected_log_files_dict(base_out=base_name) actual = homologous_recombination_deficiency_workflow.get_log_file("scarHRD", "run") assert actual == expected @@ -119,7 +121,7 @@ def test_scarHRD_step_part_get_log_file_run(homologous_recombination_deficiency_ def test_scarHRD_step_part_get_resource_usage_run(homologous_recombination_deficiency_workflow): """Tests ScarHRDStepPart.get_resource() - run""" # Define expected - expected_dict = {"threads": 2, "time": "48:00:00", "memory": "32G", "partition": "medium"} + expected_dict = {"threads": 1, "time": "24:00:00", "memory": "32G", "partition": "medium"} # Evaluate for resource, expected in expected_dict.items(): msg_error = f"Assertion error for resource '{resource}'." @@ -132,7 +134,7 @@ def test_scarHRD_step_part_get_resource_usage_run(homologous_recombination_defic def test_scarHRD_step_part_get_output_files_install(homologous_recombination_deficiency_workflow): """Tests ScarHRDStepPart.get_output_files() - install""" # Define expected - expected = {"lib_path": "work/R_packages/out/.done"} + expected = {"done": "work/R_packages/out/scarHRD.done"} # Get actual actual = homologous_recombination_deficiency_workflow.get_output_files("scarHRD", "install") assert actual == expected @@ -140,7 +142,7 @@ def test_scarHRD_step_part_get_output_files_install(homologous_recombination_def def test_scarHRD_step_part_get_log_file_install(homologous_recombination_deficiency_workflow): """Tests ScarHRDStepPart.get_log_file() - install""" - base_name = "work/R_packages/log/R_packages" + base_name = "work/R_packages/log/scarHRD" expected = get_expected_log_files_dict(base_out=base_name) actual = homologous_recombination_deficiency_workflow.get_log_file("scarHRD", "install") assert actual == expected @@ -149,7 +151,7 @@ def test_scarHRD_step_part_get_log_file_install(homologous_recombination_deficie def test_scarHRD_step_part_get_resource_usage_install(homologous_recombination_deficiency_workflow): """Tests ScarHRDStepPart.get_resource() - install""" # Define expected - expected_dict = {"threads": 1, "time": "02:00:00", "memory": "4096M", "partition": "short"} + expected_dict = {"threads": 1, "time": "01:00:00", "memory": "2G", "partition": "medium"} # Evaluate for resource, expected in expected_dict.items(): msg_error = f"Assertion error for resource '{resource}'." @@ -159,25 +161,6 @@ def test_scarHRD_step_part_get_resource_usage_install(homologous_recombination_d assert actual == expected, msg_error -def test_scarHRD_step_part_get_output_files_gcreference( - homologous_recombination_deficiency_workflow, -): - """Tests ScarHRDStepPart.get_output_files() - gcreference""" - # Define expected - expected = {"gc": "work/static_data/out/grch37_50.wig.gz"} - # Get actual - actual = homologous_recombination_deficiency_workflow.get_output_files("scarHRD", "gcreference") - assert actual == expected - - -def test_scarHRD_step_part_get_log_file_gcreference(homologous_recombination_deficiency_workflow): - """Tests ScarHRDStepPart.get_log_file() - gcreference""" - base_name = "work/static_data/log/grch37_50" - expected = get_expected_log_files_dict(base_out=base_name) - actual = homologous_recombination_deficiency_workflow.get_log_file("scarHRD", "gcreference") - assert actual == expected - - # Tests for SomaticMsiCallingWorkflow -------------------------------------------------------------- @@ -188,12 +171,18 @@ def test_homologous_recombination_deficiency_workflow(homologous_recombination_d assert list(sorted(homologous_recombination_deficiency_workflow.sub_steps.keys())) == expected # Check result file construction expected = [ - "output/bwa.scarHRD.P001-T1-DNA1-WGS1/out/bwa.scarHRD.P001-T1-DNA1-WGS1.json", - "output/bwa.scarHRD.P001-T1-DNA1-WGS1/out/bwa.scarHRD.P001-T1-DNA1-WGS1.seqz.gz", - "output/bwa.scarHRD.P002-T1-DNA1-WGS1/out/bwa.scarHRD.P002-T1-DNA1-WGS1.json", - "output/bwa.scarHRD.P002-T1-DNA1-WGS1/out/bwa.scarHRD.P002-T1-DNA1-WGS1.seqz.gz", - "output/bwa.scarHRD.P002-T2-DNA1-WGS1/out/bwa.scarHRD.P002-T2-DNA1-WGS1.json", - "output/bwa.scarHRD.P002-T2-DNA1-WGS1/out/bwa.scarHRD.P002-T2-DNA1-WGS1.seqz.gz", + "output/bwa.sequenza.scarHRD.P001-T1-DNA1-WGS1/out/bwa.sequenza.scarHRD.P001-T1-DNA1-WGS1.json", + "output/bwa.sequenza.scarHRD.P002-T1-DNA1-WGS1/out/bwa.sequenza.scarHRD.P002-T1-DNA1-WGS1.json", + "output/bwa.sequenza.scarHRD.P002-T2-DNA1-WGS1/out/bwa.sequenza.scarHRD.P002-T2-DNA1-WGS1.json", + "output/bwa.sequenza.scarHRD.P001-T1-DNA1-WGS1/out/bwa.sequenza.scarHRD.P001-T1-DNA1-WGS1.json.md5", + "output/bwa.sequenza.scarHRD.P002-T1-DNA1-WGS1/out/bwa.sequenza.scarHRD.P002-T1-DNA1-WGS1.json.md5", + "output/bwa.sequenza.scarHRD.P002-T2-DNA1-WGS1/out/bwa.sequenza.scarHRD.P002-T2-DNA1-WGS1.json.md5", + ] + expected += [ + f"output/bwa.sequenza.scarHRD.P00{i[0]}-T{i[1]}-DNA1-WGS1/log/bwa.sequenza.scarHRD.P00{i[0]}-T{i[1]}-DNA1-WGS1.{ext}{chksum}" + for i in ((1, 1), (2, 1), (2, 2)) + for ext in ("log", "conda_list.txt", "conda_info.txt") + for chksum in ("", ".md5") ] actual = set(homologous_recombination_deficiency_workflow.get_result_files()) expected = set(expected) diff --git a/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals.py b/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals.py index 4e85cfdc1..7ac498f81 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals.py +++ b/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- """Tests for the panel_of_normals workflow module code""" +from collections import OrderedDict import textwrap import pytest @@ -38,14 +39,18 @@ def minimal_config(): path_index: /path/to/bwa/index.fa panel_of_normals: - tools: ['mutect2', 'cnvkit', 'access'] + tools: ['mutect2', 'cnvkit', 'access', 'purecn'] + path_ngs_mapping: ../ngs_mapping mutect2: germline_resource: /path/to/germline_resource.vcf path_normals_list: "" cnvkit: path_excluded_regions: "" - path_target_regions: /path/to/regions.bed # WGS mode + path_target_regions: /path/to/regions.bed # WES mode path_normals_list: "" + purecn: + path_normals_list: "" + path_bait_regions: /path/to/baits/regions.bed data_sets: first_batch: @@ -138,6 +143,9 @@ def test_mutect2_step_part_get_output_files_create_panel(panel_of_normals_workfl """Tests Mutect2StepPart._get_output_files_create_panel()""" base_name_out = "work/{mapper}.mutect2/out/{mapper}.mutect2.panel_of_normals" expected = get_expected_output_vcf_files_dict(base_out=base_name_out) + base_name_out = "work/{mapper}.mutect2/out/{mapper}.mutect2.genomicsDB" + expected["db"] = base_name_out + ".tar.gz" + expected["db_md5"] = expected["db"] + ".md5" actual = panel_of_normals_workflow.get_output_files("mutect2", "create_panel") assert actual == expected @@ -474,13 +482,144 @@ def test_access_step_part_get_resource_usage(panel_of_normals_workflow): assert actual == expected, msg_error +# Tests for PureCnStepPart ------------------------------------------------------------------------- + + +def test_purecn_step_part_get_output_files_install(panel_of_normals_workflow): + """Tests PureCnStepPart._get_output_files_install()""" + expected = {"container": "work/containers/out/purecn.simg"} + actual = panel_of_normals_workflow.get_output_files("purecn", "install") + assert actual == expected + + +def test_purecn_step_part_get_log_file_install(panel_of_normals_workflow): + """Tests PureCnStepPart._get_log_file_install()""" + expected = get_expected_log_files_dict(base_out="work/containers/log/purecn") + actual = panel_of_normals_workflow.get_log_file("purecn", "install") + assert actual == expected + + +def test_purecn_step_part_get_input_files_prepare(panel_of_normals_workflow): + """Tests PureCnStepPart._get_input_files_prepare()""" + expected = {"container": "work/containers/out/purecn.simg"} + actual = panel_of_normals_workflow.get_input_files("purecn", "prepare") + assert actual == expected + + +def test_purecn_step_part_get_output_files_prepare(panel_of_normals_workflow): + """Tests PureCnStepPart._get_output_files_prepare()""" + expected = { + "intervals": "work/purecn/out/unknown_unknown.list", + "optimized": "work/purecn/out/unknown_unknown.bed.gz", + "tbi": "work/purecn/out/unknown_unknown.bed.gz.tbi", + "intervals_md5": "work/purecn/out/unknown_unknown.list.md5", + "optimized_md5": "work/purecn/out/unknown_unknown.bed.gz.md5", + "tbi_md5": "work/purecn/out/unknown_unknown.bed.gz.tbi.md5", + } + actual = panel_of_normals_workflow.get_output_files("purecn", "prepare") + assert actual == expected + + +def test_purecn_step_part_get_log_file_prepare(panel_of_normals_workflow): + """Tests PureCnStepPart._get_log_file_prepare()""" + expected = get_expected_log_files_dict(base_out="work/purecn/log/unknown_unknown") + actual = panel_of_normals_workflow.get_log_file("purecn", "prepare") + assert actual == expected + + +def test_purecn_step_part_get_input_files_coverage(panel_of_normals_workflow): + """Tests PureCnStepPart._get_input_files_coverage()""" + wildcards = Wildcards( + fromdict={ + "mapper": "bwa", + "normal_library": "P001-N1-DNA1-WGS1", + } + ) + expected = { + "container": "work/containers/out/purecn.simg", + "intervals": "work/purecn/out/unknown_unknown.list", + "bam": "NGS_MAPPING/output/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.bam", + } + actual = panel_of_normals_workflow.get_input_files("purecn", "coverage")(wildcards) + assert actual == expected + + +def test_purecn_step_part_get_output_files_coverage(panel_of_normals_workflow): + """Tests PureCnStepPart._get_output_files_coverage()""" + expected = { + "coverage": "work/{mapper}.purecn/out/{mapper}.{normal_library,.+-DNA[0-9]+-WES[0-9]+}_coverage_loess.txt.gz" + } + actual = panel_of_normals_workflow.get_output_files("purecn", "coverage") + assert actual == expected + + +def test_purecn_step_part_get_log_file_coverage(panel_of_normals_workflow): + """Tests PureCnStepPart._get_log_file_coverage()""" + expected = get_expected_log_files_dict( + base_out="work/{mapper}.purecn/log/{mapper}.{normal_library,.+-DNA[0-9]+-WES[0-9]+}" + ) + actual = panel_of_normals_workflow.get_log_file("purecn", "coverage") + assert actual == expected + + +def test_purecn_step_part_get_input_files_create_panel(panel_of_normals_workflow): + """Tests PureCnStepPart._get_input_files_create_panel()""" + wildcards = Wildcards(fromdict={"mapper": "bwa"}) + expected = { + "normals": [ + "work/bwa.purecn/out/bwa.P001-N1-DNA1-WGS1_coverage_loess.txt.gz", + "work/bwa.purecn/out/bwa.P002-N1-DNA1-WGS1_coverage_loess.txt.gz", + ], + "container": "work/containers/out/purecn.simg", + } + actual = panel_of_normals_workflow.get_input_files("purecn", "create_panel")(wildcards) + assert actual == expected + + +def test_purecn_step_part_get_output_files_create_panel(panel_of_normals_workflow): + """Tests PureCnStepPart._get_output_files_create_panel()""" + expected = { + "db": "work/{mapper}.purecn/out/{mapper}.purecn.panel_of_normals.rds", + "db_md5": "work/{mapper}.purecn/out/{mapper}.purecn.panel_of_normals.rds.md5", + "mapbias": "work/{mapper}.purecn/out/{mapper}.purecn.mapping_bias.rds", + "mapbias_md5": "work/{mapper}.purecn/out/{mapper}.purecn.mapping_bias.rds.md5", + "lowcov": "work/{mapper}.purecn/out/{mapper}.purecn.low_coverage_targets.bed", + "hq": "work/{mapper}.purecn/out/{mapper}.purecn.hq_sites.bed", + "plot": "work/{mapper}.purecn/out/{mapper}.purecn.interval_weights.png", + } + actual = panel_of_normals_workflow.get_output_files("purecn", "create_panel") + assert actual == expected + + +def test_purecn_step_part_get_log_file_create_panel(panel_of_normals_workflow): + """Tests PureCnStepPart._get_log_file_create_panel()""" + expected = get_expected_log_files_dict( + base_out="work/{mapper}.purecn/log/{mapper}.purecn.panel_of_normals" + ) + actual = panel_of_normals_workflow.get_log_file("purecn", "create_panel") + assert actual == expected + + +def test_purecn_step_part_get_resource_usage(panel_of_normals_workflow): + """Tests PureCnStepPart.get_resource_usage() for all actions""" + expected = { + "coverage": {"threads": 1, "memory": "24G", "time": "04:00:00"}, + "prepare": {"threads": 1, "memory": "24G", "time": "04:00:00"}, + "create_panel": {"threads": 1, "memory": "24G", "time": "04:00:00"}, + } + for action, resources in expected.items(): + for resource, value in resources.items(): + actual = panel_of_normals_workflow.get_resource("purecn", action, resource) + assert actual == value + + # PanelOfNormalsWorkflow -------------------------------------------------------------------------- def test_panel_of_normals_workflow(panel_of_normals_workflow): """Test simple functionality of the workflow""" # Check created sub steps - expected = ["access", "cnvkit", "link_out", "mutect2"] + expected = ["access", "cnvkit", "link_out", "mutect2", "purecn"] actual = list(sorted(panel_of_normals_workflow.sub_steps.keys())) assert actual == expected @@ -492,6 +631,12 @@ def test_panel_of_normals_workflow(panel_of_normals_workflow): for ext in ("vcf.gz", "vcf.gz.md5", "vcf.gz.tbi", "vcf.gz.tbi.md5") for mapper in ("bwa",) ] + tpl = "output/{mapper}.mutect2/out/{mapper}.mutect2.genomicsDB.{ext}" + expected += [ + tpl.format(mapper=mapper, ext=ext) + for ext in ("tar.gz", "tar.gz.md5") + for mapper in ("bwa",) + ] # add log files tpl = "output/{mapper}.mutect2/log/{mapper}.mutect2.panel_of_normals" for mapper in ("bwa",): @@ -531,6 +676,28 @@ def test_panel_of_normals_workflow(panel_of_normals_workflow): base_out="output/cnvkit.access/log/cnvkit.access" ).values() + # PureCN + tpl = "output/{mapper}.purecn/out/{mapper}.purecn.panel_of_normals.rds{chksum}" + expected += [ + tpl.format(mapper=mapper, chksum=chksum) for mapper in ("bwa",) for chksum in ("", ".md5") + ] + tpl = "output/{mapper}.purecn/out/{mapper}.purecn.mapping_bias.rds{chksum}" + expected += [ + tpl.format(mapper=mapper, chksum=chksum) for mapper in ("bwa",) for chksum in ("", ".md5") + ] + expected += get_expected_log_files_dict( + base_out="output/{mapper}.purecn/log/{mapper}.purecn.panel_of_normals".format(mapper="bwa") + ).values() + tpl = "output/purecn/out/unknown_unknown.{ext}{chksum}" + expected += [ + tpl.format(ext=ext, chksum=chksum) + for ext in ("list", "bed.gz", "bed.gz.tbi") + for chksum in ("", ".md5") + ] + expected += get_expected_log_files_dict( + base_out="output/purecn/log/unknown_unknown".format(mapper="bwa") + ).values() + expected = list(sorted(expected)) actual = list(sorted(panel_of_normals_workflow.get_result_files())) assert actual == expected diff --git a/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals_wgs.py b/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals_wgs.py index 2d785cb67..659f14489 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals_wgs.py +++ b/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals_wgs.py @@ -343,7 +343,7 @@ def test_cnvkit_step_part_get_resource_usage(panel_of_normals_workflow): def test_panel_of_normals_workflow(panel_of_normals_workflow): """Test simple functionality of the workflow""" # Check created sub steps - expected = ["access", "cnvkit", "link_out", "mutect2"] + expected = ["access", "cnvkit", "link_out", "mutect2", "purecn"] actual = list(sorted(panel_of_normals_workflow.sub_steps.keys())) assert actual == expected expected = [] diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py index ff622624c..6704fbfcd 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py @@ -46,10 +46,17 @@ def minimal_config(): - cnvetti_on_target - cnvkit - copywriter + - sequenza + - purecn cnvkit: path_target: /path/to/panel_of_normals/output/cnvkit.target/out/cnvkit.target.bed path_antitarget: /path/to/panel_of_normals/output/cnvkit.antitarget/out/cnvkit.antitarget.bed path_panel_of_normals: /path/to/panel_of_normals/output/bwa.cnvkit.create_panel/out/bwa.cnvkit.panel_of_normals.cnn + purecn: + path_container: /path/to/purecn/container + path_intervals: /path/to/interval/list + path_panel_of_normals: /path/to/purecn/pon + path_mapping_bias: /path/to/mapping/bias data_sets: first_batch: @@ -79,7 +86,10 @@ def somatic_targeted_seq_cnv_calling_workflow( patch_module_fs("snappy_pipeline.workflows.abstract", cancer_sheet_fake_fs, mocker) # Update the "globals" attribute of the mock workflow (snakemake.workflow.Workflow) so we # can obtain paths from the function as if we really had a NGSMappingPipelineStep here - dummy_workflow.globals = {"ngs_mapping": lambda x: "NGS_MAPPING/" + x} + dummy_workflow.globals = { + "ngs_mapping": lambda x: "NGS_MAPPING/" + x, + "somatic_variants": lambda x: "SOMATIC_VARIANT_CALLING/" + x, + } # Construct the workflow object return SomaticTargetedSeqCnvCallingWorkflow( dummy_workflow, @@ -811,13 +821,220 @@ def test_copywriter_step_part_get_resource_usage_call(somatic_targeted_seq_cnv_c assert actual == expected, msg_error +# Tests for SequenzaStepPart ---------------------------------------------------------------------- + + +def test_sequenza_step_part_get_output_files_install(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_output_files() - action 'install'""" + expected = {"done": "work/R_packages/out/sequenza.done"} + actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("sequenza", "install") + assert actual == expected + + +def test_sequenza_step_part_get_log_file_install(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_log_file() - action 'install'""" + base_name = "work/R_packages/log/sequenza" + expected = get_expected_log_files_dict(base_out=base_name) + actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("sequenza", "install") + assert actual == expected + + +def test_sequenza_step_part_get_output_files_gcreference(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_output_files() - action 'gcreference'""" + expected = {"gc": "work/static_data/out/sequenza.50.wig.gz"} + actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("sequenza", "gcreference") + assert actual == expected + + +def test_sequenza_step_part_get_log_file_gcreference(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_log_file() - action 'gcreference'""" + base_name = "work/static_data/log/sequenza.50" + expected = get_expected_log_files_dict(base_out=base_name) + actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("sequenza", "gcreference") + assert actual == expected + + +def test_sequenza_step_part_get_input_files_run(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_input_files() - action 'run'""" + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) + expected = { + "gc": "work/static_data/out/sequenza.50.wig.gz", + "normal_bam": "NGS_MAPPING/output/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.bam", + "normal_bai": "NGS_MAPPING/output/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.bam.bai", + "tumor_bam": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam", + "tumor_bai": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam.bai", + } + actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("sequenza", "run")(wildcards) + assert actual == expected + + +def test_sequenza_step_part_get_output_files_run(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_output_files() - action 'run'""" + expected = { + "seqz": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz", + "seqz_md5": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz.md5", + } + actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("sequenza", "run") + assert actual == expected + + +def test_sequenza_step_part_get_log_file_run(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_log_file() - action 'run'""" + base_name = "work/{mapper}.sequenza.{library_name}/log/{mapper}.sequenza.{library_name}.run" + expected = get_expected_log_files_dict(base_out=base_name) + actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("sequenza", "run") + assert actual == expected + + +def test_sequenza_step_part_get_input_files_report(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_input_files() - action 'report'""" + expected = { + "packages": "work/R_packages/out/sequenza.done", + "seqz": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz", + } + actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("sequenza", "report") + assert actual == expected + + +def test_sequenza_step_part_get_output_files_report(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_output_files() - action 'report'""" + expected = {"done": "work/{mapper}.sequenza.{library_name}/report/.done"} + actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("sequenza", "report") + assert actual == expected + + +def test_sequenza_step_part_get_params_report(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_params() - action 'report'""" + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) + expected = "P001-T1-DNA1-WGS1" + actual = somatic_targeted_seq_cnv_calling_workflow.get_params("sequenza", "report")(wildcards) + assert actual == expected + + +def test_sequenza_step_part_get_log_file_report(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_log_file() - action 'report'""" + base_name = "work/{mapper}.sequenza.{library_name}/log/{mapper}.sequenza.{library_name}.report" + expected = get_expected_log_files_dict(base_out=base_name) + actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("sequenza", "report") + assert actual == expected + + +def test_sequenza_step_part_get_resource_usage_call(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_resource_usage()""" + # Define expected + expected_dicts = { + "run": {"threads": 4, "time": "24:00:00", "memory": "16G", "partition": "medium"}, + } + # Evaluate + for action, resources in expected_dicts.items(): + for resource, expected in resources.items(): + msg_error = f"Assertion error for resource '{resource}' in '{action}'." + actual = somatic_targeted_seq_cnv_calling_workflow.get_resource( + "sequenza", action, resource + ) + assert actual == expected, msg_error + + +# Tests for PureCNStepPart ---------------------------------------------------------------------- + + +def test_purecn_step_part_get_input_files_coverage(somatic_targeted_seq_cnv_calling_workflow): + """Tests PureCNStepPart.get_input_files() - action 'coverage'""" + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) + expected = { + "bam": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam", + "bai": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam.bai", + } + actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("purecn", "coverage")( + wildcards + ) + assert actual == expected + + +def test_purecn_step_part_get_output_files_coverage(somatic_targeted_seq_cnv_calling_workflow): + """Tests PureCNStepPart.get_output_files() - action 'coverage'""" + expected = { + "coverage": "work/{mapper}.purecn.{library_name}/out/{mapper}.{library_name}_coverage_loess.txt.gz" + } + actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("purecn", "coverage") + assert actual == expected + + +def test_purecn_step_part_get_log_file_coverage(somatic_targeted_seq_cnv_calling_workflow): + """Tests PureCNStepPart.get_log_file() - action 'coverage'""" + base_name = "work/{mapper}.purecn.{library_name}/log/{mapper}.purecn.{library_name}.coverage" + expected = get_expected_log_files_dict(base_out=base_name) + actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("purecn", "coverage") + assert actual == expected + + +def test_purecn_step_part_get_input_files_run(somatic_targeted_seq_cnv_calling_workflow): + """Tests PureCNStepPart.get_input_files() - action 'run'""" + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) + expected = { + "tumor": "work/bwa.purecn.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1_coverage_loess.txt.gz", + "vcf": "SOMATIC_VARIANT_CALLING/output/bwa.mutect2.P001-T1-DNA1-WGS1/out/bwa.mutect2.P001-T1-DNA1-WGS1.full.vcf.gz", + } + actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("purecn", "run")(wildcards) + assert actual == expected + + +def test_purecn_step_part_get_output_files_run(somatic_targeted_seq_cnv_calling_workflow): + """Tests PureCNStepPart.get_output_files() - action 'run'""" + base_name = "work/{mapper}.purecn.{library_name}/out/{library_name}" + expected = { + "segments": base_name + "_dnacopy.seg", + "ploidy": base_name + ".csv", + "pvalues": base_name + "_amplification_pvalues.csv", + "vcf": base_name + ".vcf.gz", + "vcf_tbi": base_name + ".vcf.gz.tbi", + "loh": base_name + "_loh.csv", + } + expected = {**expected, **{k + "_md5": v + ".md5" for k, v in expected.items()}} + actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("purecn", "run") + assert actual == expected + + +def test_purecn_step_part_get_log_file_run(somatic_targeted_seq_cnv_calling_workflow): + """Tests PureCNStepPart.get_log_file() - action 'run'""" + base_name = "work/{mapper}.purecn.{library_name}/log/{mapper}.purecn.{library_name}.run" + expected = get_expected_log_files_dict(base_out=base_name) + actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("purecn", "run") + assert actual == expected + + +def test_purecn_step_part_get_resource_usage(somatic_targeted_seq_cnv_calling_workflow): + """Tests PureCNStepPart.get_resource_usage()""" + # Define expected + expected_dicts = { + "coverage": {"threads": 1, "time": "04:00:00", "memory": "24G", "partition": "medium"}, + "run": {"threads": 4, "time": "24:00:00", "memory": "96G", "partition": "medium"}, + } + # Evaluate + for action, resources in expected_dicts.items(): + for resource, expected in resources.items(): + msg_error = f"Assertion error for resource '{resource}' in '{action}'." + actual = somatic_targeted_seq_cnv_calling_workflow.get_resource( + "purecn", action, resource + ) + assert actual == expected, msg_error + + # Tests for SomaticTargetedSeqCnvCallingWorkflow -------------------------------------------------- def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_calling_workflow): """Test simple functionality of the workflow""" # Check created sub steps - expected = ["cnvetti_off_target", "cnvetti_on_target", "cnvkit", "copywriter", "link_out"] + expected = [ + "cnvetti_off_target", + "cnvetti_on_target", + "cnvkit", + "copywriter", + "link_out", + "purecn", + "sequenza", + ] actual = list(sorted(somatic_targeted_seq_cnv_calling_workflow.sub_steps.keys())) assert actual == expected @@ -928,6 +1145,31 @@ def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_call "segments.txt.md5", ) ] + # purecn + tpl = "output/bwa.purecn.P00{i}-T{t}-DNA1-WGS1/out/P00{i}-T{t}-DNA1-WGS1{ext}{checksum}" + expected += [ + tpl.format(i=i, t=t, ext=ext, checksum=checksum) + for i, t in ((1, 1), (2, 1), (2, 2)) + for ext in ( + ".csv", + ".vcf.gz", + ".vcf.gz.tbi", + "_dnacopy.seg", + "_amplification_pvalues.csv", + "_loh.csv", + ) + for checksum in ("", ".md5") + ] + # sequenza + tpl = ( + "output/bwa.sequenza.P00{i}-T{t}-DNA1-WGS1/out/" + "bwa.sequenza.P00{i}-T{t}-DNA1-WGS1.seqz.gz{checksum}" + ) + expected += [ + tpl.format(i=i, t=t, checksum=checksum) + for i, t in ((1, 1), (2, 1), (2, 2)) + for checksum in ("", ".md5") + ] expected = list(sorted(expected)) actual = list(sorted(somatic_targeted_seq_cnv_calling_workflow.get_result_files())) # HACK TODO From 4874074d8200ac33d29377ce1a812dfbb48adc31 Mon Sep 17 00:00:00 2001 From: ericblanc20 Date: Tue, 31 Oct 2023 17:39:27 +0100 Subject: [PATCH 19/19] feat: feature-complete end-to-end run of the Becnel dataset on hs37d5 & GRCh38.d1.vd1 (#460) Co-authored-by: Manuela Benary --- requirements/test.txt | 1 + .../workflows/cbioportal_export/__init__.py | 50 ++-- .../Snakefile | 2 +- .../workflows/ngs_mapping/__init__.py | 60 ++-- .../workflows/panel_of_normals/__init__.py | 11 +- .../somatic_cnv_checking/__init__.py | 3 +- .../somatic_gene_fusion_calling/__init__.py | 5 - .../Snakefile | 41 +-- .../__init__.py | 68 +++-- .../somatic_variant_annotation/Snakefile | 2 +- .../somatic_variant_annotation/__init__.py | 20 +- .../somatic_variant_filtration/__init__.py | 48 +-- .../tumor_mutational_burden/__init__.py | 6 + snappy_wrappers/utils.py | 68 +++++ snappy_wrappers/wrapper_parallel.py | 2 + .../wrappers/arriba/run/wrapper.py | 2 +- .../wrappers/bcftools/TMB/wrapper.py | 61 ++-- snappy_wrappers/wrappers/bwa_mem2/wrapper.py | 2 +- .../cbioportal/clinical_data/wrapper.py | 10 +- .../wrappers/cbioportal/generate_cna/script.R | 7 +- .../cbioportal/generate_cna/wrapper.py | 2 +- .../wrappers/cbioportal/helper_functions.R | 6 +- .../wrappers/cbioportal/merge_tables/script.R | 13 +- .../cbioportal/merge_tables/wrapper.py | 9 +- .../wrappers/cnvkit/export/wrapper.py | 13 +- .../wrappers/cnvkit/postprocess/wrapper.py | 24 +- .../dkfz_bias_filter/environment.yaml | 4 +- .../wrappers/dkfz_bias_filter/wrapper.py | 2 + snappy_wrappers/wrappers/eb_filter/wrapper.py | 15 +- .../wrappers/eb_filter_par/environment.yaml | 2 + .../jannovar/annotate_somatic_vcf/wrapper.py | 8 + .../mutect2_par/run/parallel_mutect2.py | 2 +- .../wrappers/purecn/coverage/wrapper.py | 9 + .../wrappers/purecn/create_panel/wrapper.py | 4 +- .../wrappers/purecn/run/wrapper.py | 46 ++- .../wrappers/scarHRD/environment.yaml | 13 + .../wrappers/scarHRD/install/environment.yaml | 1 + .../wrappers/scarHRD/install/wrapper.py | 22 ++ .../wrappers/scarHRD/run/wrapper.py | 29 +- .../sequenza/coverage/environment.yaml | 1 + .../wrappers/sequenza/coverage/wrapper.py | 72 +++++ .../wrappers/sequenza/environment.yaml | 10 - .../sequenza/gcreference/environment.yaml | 8 +- .../sequenza/install/environment.yaml | 18 ++ .../wrappers/sequenza/install/wrapper.py | 22 ++ .../wrappers/sequenza/report/wrapper.py | 5 +- .../wrappers/sequenza/run/environment.yaml | 2 +- .../wrappers/sequenza/run/wrapper.py | 79 ++++- .../somatic_cnv_checking/cnv-check-plot.R | 5 +- .../wrappers/somatic_cnv_checking/wrapper.py | 2 +- snappy_wrappers/wrappers/star/wrapper.py | 14 +- .../vcf_to_table/protein_mutation_parser.py | 2 +- .../wrappers/vcf2maf/vcf_to_table/wrapper.py | 2 +- .../wrappers/vcfpy/add_bed/wrapper.py | 273 ++++++++++-------- .../test_workflows_cbioportal_export.py | 11 +- .../workflows/test_workflows_ngs_mapping.py | 2 + .../test_workflows_panel_of_normals.py | 10 +- .../test_workflows_somatic_cnv_checking.py | 3 +- ...tic_gene_fusion_calling_processed_fastq.py | 3 +- ...kflows_somatic_targeted_seq_cnv_calling.py | 161 ++++++----- ...st_workflows_somatic_variant_annotation.py | 12 +- ...st_workflows_somatic_variant_filtration.py | 60 ++-- .../wrappers/data/mutect2_par_run.snakemake | 2 +- .../wrappers/test_install_R_package.py | 52 ++++ .../wrappers/test_mutect2_par_run.py | 10 +- 65 files changed, 1009 insertions(+), 525 deletions(-) create mode 120000 snappy_wrappers/wrappers/scarHRD/install/environment.yaml create mode 100644 snappy_wrappers/wrappers/scarHRD/install/wrapper.py create mode 120000 snappy_wrappers/wrappers/sequenza/coverage/environment.yaml create mode 100644 snappy_wrappers/wrappers/sequenza/coverage/wrapper.py delete mode 100644 snappy_wrappers/wrappers/sequenza/environment.yaml mode change 120000 => 100644 snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml create mode 100644 snappy_wrappers/wrappers/sequenza/install/environment.yaml create mode 100644 snappy_wrappers/wrappers/sequenza/install/wrapper.py create mode 100644 tests/snappy_wrappers/wrappers/test_install_R_package.py diff --git a/requirements/test.txt b/requirements/test.txt index b6888285f..78e7bae71 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -5,6 +5,7 @@ pytest coverage pytest-cov pytest-mock +pytest-subprocess # Fake file system for testing pyfakefs diff --git a/snappy_pipeline/workflows/cbioportal_export/__init__.py b/snappy_pipeline/workflows/cbioportal_export/__init__.py index d5889f5c6..94eb89edb 100644 --- a/snappy_pipeline/workflows/cbioportal_export/__init__.py +++ b/snappy_pipeline/workflows/cbioportal_export/__init__.py @@ -77,6 +77,7 @@ cbioportal_export: # Required for RNA expression path_ngs_mapping: "" # When missing, no expression data is uploaded to cBioPortal + mapping_tool: "bwa" expression_tool: "star" # Required for somatic variants path_somatic_variant: ../somatic_variant_filtration # REQUIRED (before or after filtration) @@ -334,7 +335,7 @@ def __init__(self, parent): name_pattern = "{mapper}.{caller}.{annotator}.{{library_name}}" tpl = os.path.join("work/maf", name_pattern, "out", name_pattern + "{ext}") self.input_tpl = tpl.format( - mapper="bwa", + mapper=self.config["mapping_tool"], caller=self.config["somatic_variant_calling_tool"], annotator=self.config["somatic_variant_annotation_tool"], filter_set=self.config["filter_set"], @@ -358,8 +359,12 @@ def get_input_files(self, action): # Validate action self._validate_action(action) name_pattern = "{mapper}.{caller}.{tumor_library}" - yield "cns", os.path.join( - self.config["path_copy_number"], "output", name_pattern, "out", name_pattern + ".cns" + yield "DNAcopy", os.path.join( + self.config["path_copy_number"], + "output", + name_pattern, + "out", + name_pattern + "_dnacopy.seg", ) @dictify @@ -390,10 +395,8 @@ def get_args(self, action): # Validate action self._validate_action(action) return { - "features": self.parent.w_config["step_config"]["ngs_mapping"][ - self.config["expression_tool"] - ]["path_features"], "pipeline_id": "ENSEMBL", + "features": self.parent.w_config["static_data_config"]["features"]["path"], } def get_resource_usage(self, action): @@ -427,7 +430,9 @@ class cbioportalCnaFilesStepPart(cbioportalExportStepPart): def __init__(self, parent): super().__init__(parent) - name_pattern = "bwa." + self.config["copy_number_tool"] + ".{library_name}" + name_pattern = ( + self.config["mapping_tool"] + "." + self.config["copy_number_tool"] + ".{library_name}" + ) self.input_tpl = os.path.join("work/cna", name_pattern, "out", name_pattern + ".cna") def get_args(self, action): @@ -482,9 +487,15 @@ class cbioportalSegmentStepPart(cbioportalExportStepPart): def __init__(self, parent): super().__init__(parent) - name_pattern = "bwa." + self.config["copy_number_tool"] + ".{library_name}" + name_pattern = ( + self.config["mapping_tool"] + "." + self.config["copy_number_tool"] + ".{library_name}" + ) self.input_tpl = os.path.join( - self.config["path_copy_number"], "output", name_pattern, "out", name_pattern + ".cns" + self.config["path_copy_number"], + "output", + name_pattern, + "out", + name_pattern + "_dnacopy.seg", ) def get_resource_usage(self, action): @@ -537,9 +548,7 @@ def get_args(self, action): "action_type": "expression", "extra_args": { "pipeline_id": "ENSEMBL", - "tx_obj": self.parent.w_config["step_config"]["ngs_mapping"][ - self.config["expression_tool"] - ]["path_features"], + "tx_obj": self.parent.w_config["static_data_config"]["features"]["path"], }, } @@ -813,13 +822,16 @@ def get_result_files(self): def check_config(self): """Check config attributes for presence""" msg = [] - if self.config["path_somatic_variant"] and ( - not self.config["somatic_variant_calling_tool"] - or not self.config["somatic_variant_annotation_tool"] - ): - msg += [ - "Somatic variant calling tool and somatic variant annotation tool must be defined" - ] + if self.config["path_somatic_variant"]: + if not self.config["mapping_tool"]: + msg += ["DNA mapping tool must be defined"] + if ( + not self.config["somatic_variant_calling_tool"] + or not self.config["somatic_variant_annotation_tool"] + ): + msg += [ + "Somatic variant calling tool and somatic variant annotation tool must be defined" + ] if self.config["path_copy_number"] and not self.config["copy_number_tool"]: msg += [ "Somatic copy number calling tool must be defined when CNV results are available" diff --git a/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile b/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile index fc8dca2ab..8397821b0 100644 --- a/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile +++ b/snappy_pipeline/workflows/homologous_recombination_deficiency/Snakefile @@ -75,7 +75,7 @@ rule homologous_recombination_deficiency_scarHRD_install: log: **wf.get_log_file("scarHRD", "install"), wrapper: - wf.wrapper_path("r") + wf.wrapper_path("scarHRD/install") rule homologous_recombination_deficiency_scarHRD_run: diff --git a/snappy_pipeline/workflows/ngs_mapping/__init__.py b/snappy_pipeline/workflows/ngs_mapping/__init__.py index 0854f0f4b..3584a8619 100644 --- a/snappy_pipeline/workflows/ngs_mapping/__init__.py +++ b/snappy_pipeline/workflows/ngs_mapping/__init__.py @@ -171,13 +171,18 @@ This removes the need to include gene models into the generation of indices, so that the user can select the gene models (either from ENSEMBL or GENCODE, for example). -When the configuration option `path_features` is set, the step will output a table of expression counts -for all genes, in `output/star.{library_name}/out/star.{library_name}.GeneCounts.tab`. +The computation of gene counts relies on the features defined in the `static_data_config` section of the +configuration file. The other steps relying of feature annotations should use this too. + +`STAR` outputs the counts for unstranded, forward and reverse strand protocols. When the user doesn't supply the +protocol code (0 for unstranded, 1 for forward & 2 for reverse), the step runs `infer_experiment` +(from the `rseqc` library) to infer the protocol strandedness. In both cases, the step generate a copy of +the `STAR` output containing only the relevant column included. This final version of the gene counts is found in +`output/star.{library_name}/out/star.{library_name}.GeneCounts.tab`. If the configuration option `transcriptome` is set to `true`, the step will output a bam file of reads mapped to the transcriptome (`output/stat.{library_name}/out/star.{library_name}.toTranscriptome.bam`). -`STAR` will rely on the `path_features` configuration option, or on the gene models embedded in -the indices to generate the mappings. If both are absent, the step will fail. +As with gene counts, `STAR` will rely on the static data configuration to generate the mappings. Note that the mappings to the transcriptome will not be indexes using `samtools index`, because the absence of the positional mappings. @@ -387,7 +392,6 @@ # Configuration for STAR star: path_index: REQUIRED # Required if listed in ngs_mapping.tools.rna; otherwise, can be removed. - path_features: "" # Required for computing gene counts num_threads_align: 16 num_threads_trimming: 8 num_threads_bam_view: 4 @@ -801,11 +805,10 @@ def check_config(self): def _get_output_files_run_work(self): """Override base class' function to make Snakemake aware of extra files for STAR.""" output_files = super()._get_output_files_run_work() - if self.config[self.name]["path_features"]: - output_files["gene_counts"] = self.base_path_out.format( - mapper=self.name, ext=".GeneCounts.tab" - ) - output_files["gene_counts_md5"] = output_files["gene_counts"] + ".md5" + output_files["gene_counts"] = self.base_path_out.format( + mapper=self.name, ext=".GeneCounts.tab" + ) + output_files["gene_counts_md5"] = output_files["gene_counts"] + ".md5" if self.config[self.name]["transcriptome"]: output_files["transcriptome"] = self.base_path_out.format( mapper=self.name, ext=".toTranscriptome.bam" @@ -900,27 +903,24 @@ def get_output_files(self, action): def get_result_files(self): for mapper in self.config["tools"]["rna"]: - if self.config[mapper]["path_features"]: - tpl_out = ( - "output/{mapper}.{library_name}/out/{mapper}.{library_name}.GeneCounts.tab" - ) - tpl_strandedness = "output/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.decision.json" - tpl_log = ( - "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.{ext}" - ) - for library_name, extra_info in self.parent.ngs_library_to_extra_infos.items(): - if extra_info["extractionType"] == "RNA": - yield tpl_out.format(mapper=mapper, library_name=library_name) - yield tpl_out.format(mapper=mapper, library_name=library_name) + ".md5" - yield tpl_strandedness.format(mapper=mapper, library_name=library_name) - yield tpl_strandedness.format( - mapper=mapper, library_name=library_name + tpl_out = "output/{mapper}.{library_name}/out/{mapper}.{library_name}.GeneCounts.tab" + tpl_strandedness = ( + "output/{mapper}.{library_name}/strandedness/{mapper}.{library_name}.decision.json" + ) + tpl_log = ( + "output/{mapper}.{library_name}/log/{mapper}.{library_name}.strandedness.{ext}" + ) + for library_name, extra_info in self.parent.ngs_library_to_extra_infos.items(): + if extra_info["extractionType"] == "RNA": + yield tpl_out.format(mapper=mapper, library_name=library_name) + yield tpl_out.format(mapper=mapper, library_name=library_name) + ".md5" + yield tpl_strandedness.format(mapper=mapper, library_name=library_name) + yield tpl_strandedness.format(mapper=mapper, library_name=library_name) + ".md5" + for ext in ("log", "conda_info.txt", "conda_list.txt"): + yield tpl_log.format(mapper=mapper, library_name=library_name, ext=ext) + yield tpl_log.format( + mapper=mapper, library_name=library_name, ext=ext ) + ".md5" - for ext in ("log", "conda_info.txt", "conda_list.txt"): - yield tpl_log.format(mapper=mapper, library_name=library_name, ext=ext) - yield tpl_log.format( - mapper=mapper, library_name=library_name, ext=ext - ) + ".md5" @dictify def get_log_file(self, action): diff --git a/snappy_pipeline/workflows/panel_of_normals/__init__.py b/snappy_pipeline/workflows/panel_of_normals/__init__.py index 63b2921e5..b715ab969 100644 --- a/snappy_pipeline/workflows/panel_of_normals/__init__.py +++ b/snappy_pipeline/workflows/panel_of_normals/__init__.py @@ -162,6 +162,7 @@ purecn: path_normals_list: "" # Optional file listing libraries to include in panel path_bait_regions: REQUIRED # Bed files of enrichment kit sequences (MergedProbes for Agilent SureSelect), recommended by PureCN author + path_genomicsDB: REQUIRED # Mutect2 genomicsDB created during panel_of_normals genome_name: "unknown" # Must be one from hg18, hg19, hg38, mm9, mm10, rn4, rn5, rn6, canFam3 enrichment_kit_name: "unknown" # For filename only... mappability: "" # GRCh38: /fast/work/groups/cubi/projects/biotools/static_data/app_support/PureCN/hg38/mappability.bw @@ -259,19 +260,19 @@ def get_input_files(self, action): @dictify def _get_input_files_coverage(self, wildcards): yield "container", "work/containers/out/purecn.simg" - tpl = "output/{mapper}.{normal_library}/out/{mapper}.{normal_library}.bam" yield "intervals", "work/purecn/out/{}_{}.list".format( self.config["purecn"]["enrichment_kit_name"], self.config["purecn"]["genome_name"], ) + tpl = "output/{mapper}.{library_name}/out/{mapper}.{library_name}.bam" yield "bam", self.ngs_mapping(tpl.format(**wildcards)) @dictify def _get_input_files_create(self, wildcards): yield "container", "work/containers/out/purecn.simg" - tpl = "work/{mapper}.purecn/out/{mapper}.{normal_library}_coverage_loess.txt.gz" + tpl = "work/{mapper}.purecn/out/{mapper}.purecn.{library_name}_coverage_loess.txt.gz" yield "normals", [ - tpl.format(mapper=wildcards.mapper, normal_library=lib) for lib in self.normal_libraries + tpl.format(mapper=wildcards.mapper, library_name=lib) for lib in self.normal_libraries ] def get_output_files(self, action): @@ -294,7 +295,7 @@ def get_output_files(self, action): } if action == "coverage": return { - "coverage": "work/{mapper}.purecn/out/{mapper}.{normal_library,.+-DNA[0-9]+-WES[0-9]+}_coverage_loess.txt.gz" + "coverage": "work/{mapper}.purecn/out/{mapper}.purecn.{library_name,.+-DNA[0-9]+-WES[0-9]+}_coverage_loess.txt.gz" } if action == "create_panel": return { @@ -314,7 +315,7 @@ def get_log_file(self, action): self.config["purecn"]["enrichment_kit_name"], self.config["purecn"]["genome_name"], ), - "coverage": "work/{mapper}.purecn/log/{mapper}.{normal_library,.+-DNA[0-9]+-WES[0-9]+}", + "coverage": "work/{mapper}.purecn/log/{mapper}.purecn.{library_name,.+-DNA[0-9]+-WES[0-9]+}", "create_panel": "work/{mapper}.purecn/log/{mapper}.purecn.panel_of_normals", } assert action in self.actions diff --git a/snappy_pipeline/workflows/somatic_cnv_checking/__init__.py b/snappy_pipeline/workflows/somatic_cnv_checking/__init__.py index f5781c417..521807961 100644 --- a/snappy_pipeline/workflows/somatic_cnv_checking/__init__.py +++ b/snappy_pipeline/workflows/somatic_cnv_checking/__init__.py @@ -212,8 +212,7 @@ def input_function(wildcards): base_path = "output/{mapper}.{caller}.{library_name}/out/{mapper}.{caller}.{library_name}".format( **wildcards ) - filenames["cnv"] = cnv_calling(base_path + ".bed.gz") - filenames["cnv_tbi"] = filenames["cnv"] + ".tbi" + filenames["cnv"] = cnv_calling(base_path + "_dnacopy.seg") return filenames return input_function diff --git a/snappy_pipeline/workflows/somatic_gene_fusion_calling/__init__.py b/snappy_pipeline/workflows/somatic_gene_fusion_calling/__init__.py index b9974929f..0275f57b8 100644 --- a/snappy_pipeline/workflows/somatic_gene_fusion_calling/__init__.py +++ b/snappy_pipeline/workflows/somatic_gene_fusion_calling/__init__.py @@ -90,7 +90,6 @@ path_dataset_directory: REQUIRED arriba: path_index: REQUIRED # REQUIRED STAR path index (preferably 2.7.10 or later) - features: REQUIRED # REQUIRED Gene features (for ex. ENCODE or ENSEMBL) in gtf format blacklist: "" # optional (provided in the arriba distribution, see /fast/work/groups/cubi/projects/biotools/static_data/app_support/arriba/v2.3.0) known_fusions: "" # optional tags: "" # optional (can be set to the same path as known_fusions) @@ -423,10 +422,6 @@ def check_config(self): config_keys=("step_config", "somatic_gene_fusion_calling", "arriba", "path_index"), msg="Path to STAR indices is required", ) - self.parent.ensure_w_config( - config_keys=("step_config", "somatic_gene_fusion_calling", "arriba", "features"), - msg="Path to genomic features gtf file is required", - ) # Check that the path to the STAR index is valid. for fn in ("Genome", "SA", "SAindex"): diff --git a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/Snakefile b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/Snakefile index 330476306..569ecd7df 100644 --- a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/Snakefile +++ b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/Snakefile @@ -244,6 +244,7 @@ rule somatic_targeted_seq_cnv_calling_sequenza_install: params: packages=[ {"name": "aroneklund/copynumber", "repo": "github"}, + {"name": "sequenzatools/sequenza", "repo": "bitbucket"}, ], threads: wf.get_resource("sequenza", "install", "threads") resources: @@ -254,7 +255,7 @@ rule somatic_targeted_seq_cnv_calling_sequenza_install: log: **wf.get_log_file("sequenza", "install"), wrapper: - wf.wrapper_path("r") + wf.wrapper_path("sequenza/install") rule somatic_targeted_seq_cnv_calling_sequenza_gcreference: @@ -272,6 +273,25 @@ rule somatic_targeted_seq_cnv_calling_sequenza_gcreference: wf.wrapper_path("sequenza/gcreference") +rule somatic_targeted_seq_cnv_calling_sequenza_coverage: + input: + unpack(wf.get_input_files("sequenza", "coverage")), + output: + **wf.get_output_files("sequenza", "coverage"), + params: + sample_id=wf.get_params("sequenza", "coverage"), + threads: wf.get_resource("sequenza", "coverage", "threads") + resources: + time=wf.get_resource("sequenza", "coverage", "time"), + memory=wf.get_resource("sequenza", "coverage", "memory"), + partition=wf.get_resource("sequenza", "coverage", "partition"), + tmpdir=wf.get_resource("sequenza", "coverage", "tmpdir"), + log: + **wf.get_log_file("sequenza", "coverage"), + wrapper: + wf.wrapper_path("sequenza/coverage") + + rule somatic_targeted_seq_cnv_calling_sequenza_run: input: unpack(wf.get_input_files("sequenza", "run")), @@ -289,25 +309,6 @@ rule somatic_targeted_seq_cnv_calling_sequenza_run: wf.wrapper_path("sequenza/run") -rule somatic_targeted_seq_cnv_calling_sequenza_report: - input: - **wf.get_input_files("sequenza", "report"), - output: - **wf.get_output_files("sequenza", "report"), - params: - sample_id=wf.get_params("sequenza", "report"), - threads: wf.get_resource("sequenza", "report", "threads") - resources: - time=wf.get_resource("sequenza", "report", "time"), - memory=wf.get_resource("sequenza", "report", "memory"), - partition=wf.get_resource("sequenza", "report", "partition"), - tmpdir=wf.get_resource("sequenza", "report", "tmpdir"), - log: - **wf.get_log_file("sequenza", "report"), - wrapper: - wf.wrapper_path("sequenza/report") - - # Run PureCN ------------------------------------------------------ diff --git a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py index 91d708894..a7cf820bd 100644 --- a/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py +++ b/snappy_pipeline/workflows/somatic_targeted_seq_cnv_calling/__init__.py @@ -476,16 +476,21 @@ class SequenzaStepPart(SomaticTargetedSeqCnvCallingStepPart): actions = ( "install", "gcreference", + "coverage", "run", - "report", ) #: Class resource usage dictionary. Key: action type (string); Value: resource (ResourceUsage). resource_usage = { + "coverage": ResourceUsage( + threads=1, + time="24:00:00", # 1 day + memory="24G", + ), "run": ResourceUsage( threads=4, time="24:00:00", # 1 day - memory="16G", + memory="64G", ), } @@ -498,12 +503,12 @@ def get_input_files(self, action): self._validate_action(action) method_mapping = { + "coverage": self._get_input_files_coverage(), "run": self._get_input_files_run(), - "report": self._get_input_files_report(), } return method_mapping[action] - def _get_input_files_run(self): + def _get_input_files_coverage(self): @dictify def input_function(wildcards): ngs_mapping = self.parent.sub_workflows["ngs_mapping"] @@ -525,11 +530,14 @@ def input_function(wildcards): return input_function - def _get_input_files_report(self): - return { - "packages": "work/R_packages/out/sequenza.done", - "seqz": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz", - } + def _get_input_files_run(self): + @dictify + def input_function(wildcards): + yield "packages", "work/R_packages/out/sequenza.done" + name_pattern = "{mapper}.sequenza.{library_name}" + yield "seqz", f"work/{name_pattern}/out/{name_pattern}.seqz.gz" + + return input_function def get_output_files(self, action): if action == "install": @@ -540,13 +548,19 @@ def get_output_files(self, action): length=self.config["sequenza"]["length"], ) } + elif action == "coverage": + name_pattern = "{mapper}.sequenza.{library_name}" + return { + "seqz": f"work/{name_pattern}/out/{name_pattern}.seqz.gz", + "seqz_md5": f"work/{name_pattern}/out/{name_pattern}.seqz.gz.md5", + } elif action == "run": + name_pattern = "{mapper}.sequenza.{library_name}" return { - "seqz": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz", - "seqz_md5": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz.md5", + "seg": f"work/{name_pattern}/out/{name_pattern}_dnacopy.seg", + "seg_md5": f"work/{name_pattern}/out/{name_pattern}_dnacopy.seg.md5", + "done": f"work/{name_pattern}/report/.done", } - elif action == "report": - return {"done": "work/{mapper}.sequenza.{library_name}/report/.done"} else: raise UnsupportedActionException( "Action '{action}' is not supported. Valid options: {valid}".format( @@ -616,8 +630,8 @@ def _get_input_files_run(self, wildcards): "work", name_pattern, "out", - "{mapper}.{library_name}_coverage_loess.txt.gz".format(**wildcards), - ) + name_pattern + "_coverage_loess.txt.gz", + ).format(**wildcards) name_pattern = "{mapper}.{caller}.{library_name}".format( caller=self.config["purecn"]["somatic_variant_caller"], **wildcards, @@ -639,13 +653,9 @@ def get_output_files(self, action): # Validate action self._validate_action(action) name_pattern = "{mapper}.purecn.{library_name}" - prefix = os.path.join("work", name_pattern, "out", "{library_name}") + prefix = os.path.join("work", name_pattern, "out", name_pattern) action_mapping = { - "coverage": { - "coverage": os.path.join( - "work", name_pattern, "out", "{mapper}.{library_name}_coverage_loess.txt.gz" - ) - }, + "coverage": {"coverage": prefix + "_coverage_loess.txt.gz"}, "run": { "segments": prefix + "_dnacopy.seg", "ploidy": prefix + ".csv", @@ -884,12 +894,10 @@ def _get_output_files_call(): @staticmethod def _get_output_files_postprocess(): name_pattern = "{mapper}.cnvkit.{library_name}" - tpl = os.path.join("work", name_pattern, "out", name_pattern + ".bed.gz") + tpl = os.path.join("work", name_pattern, "out", name_pattern + "_dnacopy.seg") return { "final": tpl, - "final_tbi": tpl + ".tbi", "final_md5": tpl + ".md5", - "final_tbi_md5": tpl + ".tbi.md5", } @dictify @@ -920,7 +928,13 @@ def _get_output_files_plot(self): @staticmethod def _get_output_files_export(): - exports = (("seg", "seg"), ("vcf", "vcf.gz"), ("tbi", "vcf.gz.tbi")) + exports = ( + ("bed", "bed.gz"), + ("bed_tbi", "bed.gz.tbi"), + ("seg", "seg"), + ("vcf", "vcf.gz"), + ("vcf_tbi", "vcf.gz.tbi"), + ) output_files = {} tpl = ( "work/{{mapper}}.cnvkit.{{library_name}}/out/" @@ -1148,7 +1162,7 @@ def get_result_files(self): """Return list of result files for the somatic targeted sequencing CNV calling step""" tool_actions = { "cnvkit": ["fix", "postprocess", "report", "export"], - "sequenza": ("run",), + "sequenza": ("coverage", "run"), "purecn": ("run",), "copywriter": ("call",), "cnvetti_on_target": ("coverage", "segment", "postprocess"), @@ -1185,7 +1199,7 @@ def get_result_files(self): library_name=[sample_pair.tumor_sample.dna_ngs_library.name], ) for f in filenames: - if ".tmp." not in f and not f.endswith("/.done"): + if ".tmp." not in f: yield f.replace("work/", "output/") def check_config(self): diff --git a/snappy_pipeline/workflows/somatic_variant_annotation/Snakefile b/snappy_pipeline/workflows/somatic_variant_annotation/Snakefile index a0dd7e158..7fb41ff1d 100644 --- a/snappy_pipeline/workflows/somatic_variant_annotation/Snakefile +++ b/snappy_pipeline/workflows/somatic_variant_annotation/Snakefile @@ -76,7 +76,7 @@ rule somatic_variant_annotation_vep: # Run Jannovar ---------------------------------------------------------------- -rule somatic_variant_annotation_jannovar_annotate_somatic_vcf: +rule somatic_variant_annotation_jannovar: input: **wf.get_input_files("jannovar", "annotate_somatic_vcf"), output: diff --git a/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py b/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py index df2a2d6f7..010ed979a 100644 --- a/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py +++ b/snappy_pipeline/workflows/somatic_variant_annotation/__init__.py @@ -249,7 +249,7 @@ class JannovarAnnotateSomaticVcfStepPart(AnnotateSomaticVcfStepPart): name = "jannovar" #: Annotator name to construct output paths - annotator = "jannovar_annotate_somatic_vcf" + annotator = "jannovar" #: Class available actions actions = ("annotate_somatic_vcf",) @@ -371,12 +371,7 @@ def get_result_files(self): We will process all primary DNA libraries and perform joint calling within pedigrees """ - annotators = list( - map( - lambda x: x.replace("jannovar", "jannovar_annotate_somatic_vcf"), - set(self.config["tools"]) & set(ANNOTATION_TOOLS), - ) - ) + annotators = set(self.config["tools"]) & set(ANNOTATION_TOOLS) callers = set(self.config["tools_somatic_variant_calling"]) name_pattern = "{mapper}.{caller}.{annotator}.{tumor_library.name}" yield from self._yield_result_files_matched( @@ -402,13 +397,10 @@ def get_result_files(self): ) # Annotators with full output full = list( - map( - lambda x: x.replace("jannovar", "jannovar_annotate_somatic_vcf"), - filter( - lambda x: self.sub_steps[x].has_full, - set(self.config["tools"]) & set(ANNOTATION_TOOLS), - ), - ) + filter( + lambda x: self.sub_steps[x].has_full, + set(self.config["tools"]) & set(ANNOTATION_TOOLS), + ), ) yield from self._yield_result_files_matched( os.path.join("output", name_pattern, "out", name_pattern + ".full{ext}"), diff --git a/snappy_pipeline/workflows/somatic_variant_filtration/__init__.py b/snappy_pipeline/workflows/somatic_variant_filtration/__init__.py index 9afe4989a..f5cfcc00e 100644 --- a/snappy_pipeline/workflows/somatic_variant_filtration/__init__.py +++ b/snappy_pipeline/workflows/somatic_variant_filtration/__init__.py @@ -64,7 +64,10 @@ ResourceUsage, ) from snappy_pipeline.workflows.ngs_mapping import NgsMappingWorkflow -from snappy_pipeline.workflows.somatic_variant_annotation import SomaticVariantAnnotationWorkflow +from snappy_pipeline.workflows.somatic_variant_annotation import ( + ANNOTATION_TOOLS, + SomaticVariantAnnotationWorkflow, +) from snappy_pipeline.workflows.somatic_variant_calling import ( SOMATIC_VARIANT_CALLERS_MATCHED, SomaticVariantCallingWorkflow, @@ -87,6 +90,7 @@ path_ngs_mapping: ../ngs_mapping tools_ngs_mapping: null tools_somatic_variant_calling: null + tools_somatic_variant_annotation: null filter_sets: # no_filter: no_filters # implicit, always defined dkfz_only: '' # empty @@ -135,7 +139,7 @@ class SomaticVariantFiltrationStepPart(BaseStepPart): def __init__(self, parent): super().__init__(parent) self.log_path = ( - r"work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." + r"work/{mapper}.{var_caller}.{annotator}." r"dkfz_bias_filter.{tumor_library,[^\.]+}/log/snakemake.dkfz_bias_filter.log" ) # Build shortcut from cancer bio sample name to matched cancer sample @@ -201,10 +205,7 @@ class DkfzBiasFilterStepPart(SomaticVariantFiltrationStepPart): def __init__(self, parent): super().__init__(parent) - self.token = ( - "{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." - "dkfz_bias_filter.{tumor_library}" - ) + self.token = "{mapper}.{var_caller}.{annotator}.dkfz_bias_filter.{tumor_library}" @dictify def get_input_files(self, action): @@ -213,8 +214,8 @@ def get_input_files(self, action): self._validate_action(action) # VCF file and index tpl = ( - "output/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.{tumor_library}/out/" - "{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.{tumor_library}" + "output/{mapper}.{var_caller}.{annotator}.{tumor_library}/out/" + "{mapper}.{var_caller}.{annotator}.{tumor_library}" ) key_ext = {"vcf": ".vcf.gz", "vcf_tbi": ".vcf.gz.tbi"} variant_annotation = self.parent.sub_workflows["somatic_variant_annotation"] @@ -233,9 +234,9 @@ def get_output_files(self, action): # Validate action self._validate_action(action) prefix = ( - r"work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." + r"work/{mapper}.{var_caller}.{annotator}." r"dkfz_bias_filter.{tumor_library,[^\.]+}/out/{mapper}.{var_caller}." - r"jannovar_annotate_somatic_vcf.dkfz_bias_filter.{tumor_library}" + r"{annotator}.dkfz_bias_filter.{tumor_library}" ) key_ext = { "vcf": ".vcf.gz", @@ -274,10 +275,7 @@ class EbFilterStepPart(SomaticVariantFiltrationStepPart): def __init__(self, parent): super().__init__(parent) - self.token = ( - "{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." - "dkfz_bias_filter.eb_filter.{tumor_library}" - ) + self.token = "{mapper}.{var_caller}.{annotator}.dkfz_bias_filter.eb_filter.{tumor_library}" def get_input_files(self, action): # Validate action @@ -288,9 +286,9 @@ def get_input_files(self, action): def _get_input_files_run(self, wildcards): # VCF file and index tpl = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." + "work/{mapper}.{var_caller}.{annotator}." "dkfz_bias_filter.{tumor_library}/out/{mapper}.{var_caller}." - "jannovar_annotate_somatic_vcf.dkfz_bias_filter." + "{annotator}.dkfz_bias_filter." "{tumor_library}" ) key_ext = {"vcf": ".vcf.gz", "vcf_tbi": ".vcf.gz.tbi"} @@ -318,9 +316,9 @@ def get_output_files(self, action): @dictify def _get_output_files_run(self): prefix = ( - r"work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." + r"work/{mapper}.{var_caller}.{annotator}." r"dkfz_bias_filter.eb_filter.{tumor_library,[^\.]+}/out/" - r"{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." + r"{mapper}.{var_caller}.{annotator}." r"dkfz_bias_filter.eb_filter.{tumor_library}" ) key_ext = { @@ -393,7 +391,7 @@ class ApplyFiltersStepPartBase(SomaticVariantFiltrationStepPart): def __init__(self, parent): super().__init__(parent) name_pattern = ( - "{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." + "{mapper}.{var_caller}.{annotator}." "dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}.{exon_list}" ) self.base_path_out = os.path.join("work", name_pattern, "out", name_pattern + "{ext}") @@ -440,9 +438,9 @@ def get_input_files(self, action): # Validate action self._validate_action(action) tpl = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." + "work/{mapper}.{var_caller}.{annotator}." "dkfz_bias_filter.eb_filter.{tumor_library}/out/{mapper}.{var_caller}." - "jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." + "{annotator}.dkfz_bias_filter.eb_filter." "{tumor_library}" ) key_ext = {"vcf": ".vcf.gz", "vcf_tbi": ".vcf.gz.tbi"} @@ -554,6 +552,10 @@ def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir) self.config["tools_somatic_variant_calling"] = self.w_config["step_config"][ "somatic_variant_calling" ]["tools"] + if not self.config["tools_somatic_variant_annotation"]: + self.config["tools_somatic_variant_annotation"] = self.w_config["step_config"][ + "somatic_variant_annotation" + ]["tools"] @listify def get_result_files(self): @@ -561,8 +563,9 @@ def get_result_files(self): Process all primary DNA libraries and perform pairwise calling for tumor/normal pairs """ callers = set(self.config["tools_somatic_variant_calling"]) + annotators = set(self.config["tools_somatic_variant_annotation"]) name_pattern = ( - "{mapper}.{caller}.jannovar_annotate_somatic_vcf." + "{mapper}.{caller}.{annotator}." "dkfz_bias_filter.eb_filter.{tumor_library.name}." "{filter_set}.{exon_list}" ) @@ -574,6 +577,7 @@ def get_result_files(self): os.path.join("output", name_pattern, "out", name_pattern + "{ext}"), mapper=self.config["tools_ngs_mapping"], caller=callers & set(SOMATIC_VARIANT_CALLERS_MATCHED), + annotator=annotators & set(ANNOTATION_TOOLS), filter_set=filter_sets, exon_list=exon_lists, ext=EXT_VALUES, diff --git a/snappy_pipeline/workflows/tumor_mutational_burden/__init__.py b/snappy_pipeline/workflows/tumor_mutational_burden/__init__.py index 0880ba37f..e18d6cfd1 100644 --- a/snappy_pipeline/workflows/tumor_mutational_burden/__init__.py +++ b/snappy_pipeline/workflows/tumor_mutational_burden/__init__.py @@ -196,6 +196,12 @@ def __init__(self, workflow, config, config_lookup_paths, config_paths, workdir) self.w_config["step_config"]["tumor_mutational_burden"][ "tools_somatic_variant_calling" ] = self.w_config["step_config"]["somatic_variant_calling"]["tools"] + if not self.w_config["step_config"]["tumor_mutational_burden"][ + "tools_somatic_variant_annotation" + ]: + self.w_config["step_config"]["tumor_mutational_burden"][ + "tools_somatic_variant_annotation" + ] = self.w_config["step_config"]["somatic_variant_annotation"]["tools"] @listify def get_result_files(self): diff --git a/snappy_wrappers/utils.py b/snappy_wrappers/utils.py index 1c40143b7..43f8f04b5 100644 --- a/snappy_wrappers/utils.py +++ b/snappy_wrappers/utils.py @@ -2,6 +2,8 @@ """Utility code for snappy_wrappers""" import os +import re +import subprocess __author__ = "Manuel Holtgrewe " @@ -53,3 +55,69 @@ def patched(*args, **kwargs): return dict(gen(*args, **kwargs)) return patched + + +def install_R_package(dest: str, name: str, repo: str): + """Installs R package in directory + + can be on of "cran", "bioconductor", "github", "bitbucket" or "local". + + Github & bitbucket packages can be further defined in the , + choosing a commit, a tag or a pull request (see the remotes package reference). + For local packages, the must be the path to the package source. + + In these cases, the routine tries to be clever and guess the package name from + the . It implements the following recipes: + + - basename of the path without (tar/zip) extension for local packages + - remove username, subdirectory and reference/release/pull request for github & bitbucket + + When installation isn't successful, a subprocess.CalledProcessError is raised + """ + + assert repo in ( + "cran", + "bioconductor", + "github", + "bitbucket", + "local", + ), f"Unknown/unimplemented repository {repo}" + + os.makedirs(os.path.dirname(dest), mode=0o750, exist_ok=True) + + if repo == "cran": + install_cmd = f"install.packages('{name}', lib='{dest}', update=FALSE, ask=FALSE)" + elif repo == "bioconductor": + install_cmd = f"BiocManager::install('{name}', lib='{dest}', update=FALSE, ask=FALSE)" + elif repo == "github": + path = name + pattern = re.compile("^([^/]+)/([^/]+)(/[^@|]+)?([@|].+)?$") + m = pattern.match(path) + assert m, f"Cannot extract package name from github path {path}" + name = m.groups()[1] + install_cmd = f"remotes::install_github('{path}', lib='{dest}', upgrade='never')" + elif repo == "bitbucket": + path = name + pattern = re.compile("^([^/]+)/([^/]+)([/@].+)?$") + m = pattern.match(path) + assert m, f"Cannot extract package name from bitbucket path {path}" + name = m.groups()[1] + install_cmd = f"remotes::install_bitbucket('{path}', lib='{dest}', upgrade='never')" + elif repo == "local": + path = name + pattern = re.compile("^(.+?)(\\.(zip|tar(\\.(gz|bz2))?|tgz2?|tbz))?$") + m = pattern.match(os.path.basename(path)) + assert m, f"Cannot extract package name from local filesystem path {path}" + name = m.groups()[0] + install_cmd = f"remotes::install_local('{path}', lib='{dest}', upgrade='never')" + else: + install_cmd = None + + R_script = [ + install_cmd, + f"status <- try(find.package('{name}', lib.loc='{dest}', quiet=FALSE, verbose=TRUE))", + "status <- ifelse(is(status, 'try-error'), 1, 0)", + "quit(save='no', status=status, runLast=FALSE)", + ] + cmd = ["R", "--vanilla", "-e", "; ".join(R_script)] + return subprocess.run(cmd, text=True, check=True) diff --git a/snappy_wrappers/wrapper_parallel.py b/snappy_wrappers/wrapper_parallel.py index 00f56837e..4b1a8289f 100644 --- a/snappy_wrappers/wrapper_parallel.py +++ b/snappy_wrappers/wrapper_parallel.py @@ -314,6 +314,8 @@ def write_snakemake_debug_helper( :type max_status_checks_per_second: str """ with open(os.path.join(os.getcwd(), "snakemake_call.sh"), "wt") as f_call: + print("/bin/bash") + print("#SBATCH --output {}/slurm_log/%x-%J.log".format(os.getcwd())) print( " ".join( map( diff --git a/snappy_wrappers/wrappers/arriba/run/wrapper.py b/snappy_wrappers/wrappers/arriba/run/wrapper.py index 2c078eea3..e1c9a88e3 100644 --- a/snappy_wrappers/wrappers/arriba/run/wrapper.py +++ b/snappy_wrappers/wrappers/arriba/run/wrapper.py @@ -75,7 +75,7 @@ -x /dev/stdin \ -o $TMPDIR/fusions.tsv -O $TMPDIR/fusions.discarded.tsv \ -a {snakemake.config[static_data_config][reference][path]} \ - -g {snakemake.config[step_config][somatic_gene_fusion_calling][arriba][features]} \ + -g {snakemake.config[static_data_config][features][path]} \ $(if [[ -n "{snakemake.config[step_config][somatic_gene_fusion_calling][arriba][blacklist]}" ]]; then \ echo -b {snakemake.config[step_config][somatic_gene_fusion_calling][arriba][blacklist]} fi) \ diff --git a/snappy_wrappers/wrappers/bcftools/TMB/wrapper.py b/snappy_wrappers/wrappers/bcftools/TMB/wrapper.py index f4ab3db0b..9a381b346 100644 --- a/snappy_wrappers/wrappers/bcftools/TMB/wrapper.py +++ b/snappy_wrappers/wrappers/bcftools/TMB/wrapper.py @@ -7,9 +7,14 @@ __author__ = "Pham Gia Cuong" __email__ = "pham.gia-cuong@bih-charite.de" +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step] + missense_re = ( snakemake.params.args["missense_re"] - if "args" in snakemake.params.keys() and "missense_re" in snakemake.params.args.keys() + if "args" in snakemake.params.keys() + and "missense_re" in snakemake.params.args.keys() + and config["has_annotation"] == "TRUE" else "" ) @@ -25,14 +30,18 @@ conda list > {snakemake.log.conda_list} conda info > {snakemake.log.conda_info} -bed_file={snakemake.config[step_config][tumor_mutational_burden][target_regions]} +bed_file={config[target_regions]} bed_file_name=$(basename $bed_file) bed_md5=$(md5sum $bed_file | awk '{{print $1}}') name_vcf=$(basename {snakemake.input.vcf}) vcf_md5=$(md5sum {snakemake.input.vcf} | awk '{{print $1}}') -total_exom_length=$(zcat $bed_file | \ +# Avoids script failing with gzip error status +cmd=zcat +gzip -t $bed_file || cmd=cat + +total_exom_length=$($cmd $bed_file | \ awk '{{dis+=$3-$2}} END {{print dis}}') #TMB_rounded=`printf "%.3f" $TMB` number_snvs=$(bcftools view -R $bed_file -v snps --threads 2 -H {snakemake.input.vcf}| wc -l) @@ -41,47 +50,45 @@ if [[ -n "{missense_re}" ]] then - number_missense_variants=$(bcftools view -R $bed_file --threads 2 -H {snakemake.input.vcf}| grep -E '{missense_re}' | wc -l) + number_missense_variants=$(bcftools view -R $bed_file --threads 2 -H {snakemake.input.vcf} | grep -E '{missense_re}' | wc -l || true) +else + number_missense_variants=0 fi -TMB=`echo "1000000*($number_variants/$total_exom_length)" | bc -l ` -missense_TMB=`echo "1000000*($number_missense_variants/$total_exom_length)" | bc -l ` -if [[ {snakemake.config[step_config][tumor_mutational_burden][has_annotation]} == "TRUE" ]] +TMB=$(printf "%f" $(echo "1000000*($number_variants/$total_exom_length)" | bc -l)) +missense_TMB=$(printf "%f" $(echo "1000000*($number_missense_variants/$total_exom_length)" | bc -l)) +if [[ {config[has_annotation]} == "TRUE" ]] then - out_file=$(cat << EOF - {{ - "Library_name": {snakemake.wildcards.tumor_library}, - "VCF_file": $name_vcf, - "VCF_md5": $vcf_md5, - "BED_file": $bed_file_name, - "BED_md5": $bed_md5, + cat << EOF > {snakemake.output.json} +{{ + "Library_name": "{snakemake.wildcards.tumor_library}", + "VCF_file": "$name_vcf", + "VCF_md5": "$vcf_md5", + "BED_file": "$bed_file_name", + "BED_md5": "$bed_md5", "TMB": $TMB, "missense_TMB": $missense_TMB, "Number_variants": $number_variants, "Number_snvs": $number_snvs, "Number_indels": $number_indels, "Total_regions_length": $total_exom_length - }} +}} EOF - ) - echo $out_file > {snakemake.output.json} else - out_file=$(cat << EOF - {{ - "Library_name": {snakemake.wildcards.tumor_library}, - "VCF_file": $name_vcf, - "VCF_md5": $vcf_md5, - "BED_file": $bed_file_name, - "BED_md5": $bed_md5, + cat << EOF > {snakemake.output.json} +{{ + "Library_name": "{snakemake.wildcards.tumor_library}", + "VCF_file": "$name_vcf", + "VCF_md5": "$vcf_md5", + "BED_file": "$bed_file_name", + "BED_md5": "$bed_md5", "TMB": $TMB, "Number_variants": $number_variants, "Number_snvs": $number_snvs, "Number_indels": $number_indels, "Total_regions_length": $total_exom_length - }} +}} EOF - ) - echo $out_file > {snakemake.output.json} fi pushd $(dirname {snakemake.output.json}) diff --git a/snappy_wrappers/wrappers/bwa_mem2/wrapper.py b/snappy_wrappers/wrappers/bwa_mem2/wrapper.py index 2b11850ff..7196322ff 100644 --- a/snappy_wrappers/wrappers/bwa_mem2/wrapper.py +++ b/snappy_wrappers/wrappers/bwa_mem2/wrapper.py @@ -78,7 +78,7 @@ set -x if [[ "{snakemake.config[step_config][ngs_mapping][bwa_mem2][trim_adapters]}" == "True" ]]; then - trimadapt-mt -p {snakemake.config[step_config][ngs_mapping][bwa_mem2][num_threads_trimming]} + trimadap-mt -p {snakemake.config[step_config][ngs_mapping][bwa_mem2][num_threads_trimming]} else cat fi diff --git a/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py b/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py index 38788eacf..3380dbe6f 100644 --- a/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py +++ b/snappy_wrappers/wrappers/cbioportal/clinical_data/wrapper.py @@ -49,7 +49,10 @@ class SampleInfoTMB: column = "TMB" def __init__(self, config, **kwargs): - name_pattern = "bwa." + kwargs["somatic_variant_tool"] + ".tmb.{library}" + name_pattern = "bwa." + kwargs["somatic_variant_tool"] + if kwargs["somatic_variant_annotation_tool"]: + name_pattern += "." + kwargs["somatic_variant_annotation_tool"] + name_pattern += ".tmb.{library}" self.tpl = os.path.join( config["path"], "output", name_pattern, "out", name_pattern + ".json" ) @@ -61,7 +64,7 @@ def get_data(self, lib_by_extraction): try: with open(path, "r") as f: result = json.load(f) - return result["TMB"] + return result.get("missense_TMB", result["TMB"]) except Exception as e: print( "WARNING- error {} occured when extraction TMB for library {}".format( @@ -87,6 +90,9 @@ def write_clinical_samples_tsv(donors): SampleInfoTMB( extra_info, somatic_variant_tool=config["somatic_variant_calling_tool"], + somatic_variant_annotation_tool=config.get( + "somatic_variant_annotation_tool", None + ), ) ) else: diff --git a/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R b/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R index 87fe716ae..480942d83 100644 --- a/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R +++ b/snappy_wrappers/wrappers/cbioportal/generate_cna/script.R @@ -13,10 +13,9 @@ cns_to_cna <- function(fn, tx_obj=TxDb.Hsapiens.UCSC.hg19.knownGene::TxDb.Hsapie stopifnot("gene_id" %in% colnames(GenomicRanges::mcols(genes))) segments <- read.table(fn, sep="\t", header=1, stringsAsFactors=FALSE, check.names=FALSE) - if ("chromosome" %in% colnames(segments)) colnames(segments)[colnames(segments)=="chromosome"] <- "chrom" - stopifnot(all(c("cn", "log2", "chrom", "start", "end") %in% colnames(segments))) + stopifnot(all(c("chrom", "loc.start", "loc.end", "seg.mean", "C") %in% colnames(segments))) - seg <- GenomicRanges::makeGRangesFromDataFrame(segments, seqnames.field="chrom", start.field="start", end.field="end", strand="*", keep.extra.columns=FALSE) + seg <- GenomicRanges::makeGRangesFromDataFrame(segments, seqnames.field="chrom", start.field="loc.start", end.field="loc.end", strand="*", keep.extra.columns=FALSE) i <- GenomicRanges::findOverlaps(genes, seg) i <- split(S4Vectors::subjectHits(i), S4Vectors::queryHits(i)) @@ -24,7 +23,7 @@ cns_to_cna <- function(fn, tx_obj=TxDb.Hsapiens.UCSC.hg19.knownGene::TxDb.Hsapie tbl <- data.frame(FeatureID=as.character(genes$gene_id), cn=NA, log2=NA) colnames(tbl)[1] <- pipeline_id - tbl[as.numeric(names(i)),c("cn", "log2")] <- segments[i,c("cn", "log2")] + tbl[as.numeric(names(i)),c("cn", "log2")] <- segments[i,c("C", "seg.mean")] tbl } diff --git a/snappy_wrappers/wrappers/cbioportal/generate_cna/wrapper.py b/snappy_wrappers/wrappers/cbioportal/generate_cna/wrapper.py index a26b42146..12e073efd 100644 --- a/snappy_wrappers/wrappers/cbioportal/generate_cna/wrapper.py +++ b/snappy_wrappers/wrappers/cbioportal/generate_cna/wrapper.py @@ -44,7 +44,7 @@ source("{helper_functions}") source("{r_script}") write.table( - cns_to_cna("{snakemake.input}", "{snakemake.params[features]}", "{snakemake.params[pipeline_id]}"), + cns_to_cna("{snakemake.input}", "{snakemake.config[static_data_config][features][path]}", "{snakemake.params[pipeline_id]}"), file="{snakemake.output}", sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE ) __EOF diff --git a/snappy_wrappers/wrappers/cbioportal/helper_functions.R b/snappy_wrappers/wrappers/cbioportal/helper_functions.R index 4162dcfb8..f8efb6a26 100644 --- a/snappy_wrappers/wrappers/cbioportal/helper_functions.R +++ b/snappy_wrappers/wrappers/cbioportal/helper_functions.R @@ -186,10 +186,9 @@ get_id_mappings <- function(org_obj, verbose=FALSE) { if (file.exists(org_obj)) { if (verbose) cat("Gene id mappings taken from file ", org_obj) id_mappings <- read.table(org_obj, sep="\t", header=1, stringsAsFactors=FALSE, check.names=FALSE, quote="", comment="") - if (all(c("hgnc_symbol", "ensembl_canonical_gene", "entrez_gene_id") %in% colnames(id_mappings))) + if (all(c("symbol", "ensembl_gene_id", "entrez_id") %in% colnames(id_mappings))) id_mappings <- id_mappings |> - dplyr::select(ENSEMBL=ensembl_canonical_gene, SYMBOL=hgnc_symbol, ENTREZ_ID=entrez_gene_id) - stopifnot(all(c("ENSEMBL", "SYMBOL", "ENTREZ_ID") %in% colnames(id_mappings))) + dplyr::select(ENSEMBL=ensembl_gene_id, SYMBOL=symbol, ENTREZ_ID=entrez_id) id_mappings <- id_mappings[,c("ENSEMBL", "SYMBOL", "ENTREZ_ID")] } else { if (grepl("::", org_obj)) { @@ -203,6 +202,7 @@ get_id_mappings <- function(org_obj, verbose=FALSE) { ) } } + stopifnot(all(c("ENSEMBL", "SYMBOL", "ENTREZ_ID") %in% colnames(id_mappings))) id_mappings <- id_mappings |> dplyr::select(ENSEMBL, SYMBOL, ENTREZ_ID) |> dplyr::mutate(ENTREZ_ID=as.character(ENTREZ_ID)) |> diff --git a/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R b/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R index a48a5a848..546d9f1da 100644 --- a/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R +++ b/snappy_wrappers/wrappers/cbioportal/merge_tables/script.R @@ -99,19 +99,14 @@ merge_segments <- function(fns) { if (is.null(names(fns))) stop("Missing sample names") - col_names <- c("chromosome"="chrom", "start"="loc.start", "end"="loc.end", "probes"="num.mark", "log2"="seg.mean") + col_names <- c("chrom", "loc.start", "loc.end", "num.marks", "seg.mean") tbl <- NULL for (sample_id in names(fns)) { cat("Loading", fns[sample_id], "for sample", sample_id, "\n") tmp <- read.table(fns[sample_id], sep="\t", header=1, stringsAsFactors=FALSE, check.names=FALSE) - if (!all(col_names %in% colnames(tmp))) { - i <- match(names(col_names), colnames(tmp)) - if (any(!is.na(i))) colnames(tmp)[i[!is.na(i)]] <- col_names[!is.na(i)] - } - stopifnot(all(names(col_names) %in% colnames(tmp))) - tmp <- tmp[,names(col_names)] - colnames(tmp) <- col_names - tmp <- cbind(ID=rep(sample_id, nrow(tmp)), tmp) + stopifnot(all(col_names %in% colnames(tmp))) + tmp <- tmp[,col_names] + tmp$ID <- sample_id tbl <- rbind(tbl, tmp) } diff --git a/snappy_wrappers/wrappers/cbioportal/merge_tables/wrapper.py b/snappy_wrappers/wrappers/cbioportal/merge_tables/wrapper.py index b4e4d94b1..d71ffcfdb 100644 --- a/snappy_wrappers/wrappers/cbioportal/merge_tables/wrapper.py +++ b/snappy_wrappers/wrappers/cbioportal/merge_tables/wrapper.py @@ -11,9 +11,12 @@ helper_functions = os.path.join(os.path.dirname(r_script), "..", "helper_functions.R") filenames = ", ".join(['"{}"="{}"'.format(str(k), str(v)) for k, v in snakemake.input.items()]) -extra_args = ", ".join( - ['"{}"="{}"'.format(str(k), str(v)) for k, v in snakemake.params["extra_args"].items()] -) +if "extra_args" in snakemake.params.keys(): + extra_args = ", ".join( + ['"{}"="{}"'.format(str(k), str(v)) for k, v in snakemake.params["extra_args"].items()] + ) +else: + extra_args = "" step = snakemake.config["pipeline_step"]["name"] config = snakemake.config["step_config"][step] diff --git a/snappy_wrappers/wrappers/cnvkit/export/wrapper.py b/snappy_wrappers/wrappers/cnvkit/export/wrapper.py index 38b513d12..0c7af53bb 100644 --- a/snappy_wrappers/wrappers/cnvkit/export/wrapper.py +++ b/snappy_wrappers/wrappers/cnvkit/export/wrapper.py @@ -30,22 +30,25 @@ export TMPDIR=$(mktemp -d) -cnvkit.py export bed {snakemake.input} -o {snakemake.output.bed} +cnvkit.py export bed {snakemake.input} -o $TMPDIR/out.bed +bgzip -c $TMPDIR/out.bed > {snakemake.output.bed} +tabix -f {snakemake.output.bed} + cnvkit.py export seg {snakemake.input} -o {snakemake.output.seg} cnvkit.py export vcf {snakemake.input} -o $TMPDIR/out.vcf - bgzip -c $TMPDIR/out.vcf > {snakemake.output.vcf} tabix -f {snakemake.output.vcf} rm -rf $TMPDIR -d=$(dirname "{snakemake.output.bed}") +d=$(dirname "{snakemake.output.seg}") pushd $d -fn=$(basename "{snakemake.output.bed}") -md5sum $fn > $fn.md5 fn=$(basename "{snakemake.output.seg}") md5sum $fn > $fn.md5 +fn=$(basename "{snakemake.output.bed}") +md5sum $fn > $fn.md5 +md5sum $fn.tbi > $fn.tbi.md5 fn=$(basename "{snakemake.output.vcf}") md5sum $fn > $fn.md5 md5sum $fn.tbi > $fn.tbi.md5 diff --git a/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py b/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py index 2b35d730d..2bf606f6c 100644 --- a/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py +++ b/snappy_wrappers/wrappers/cnvkit/postprocess/wrapper.py @@ -30,11 +30,9 @@ # ----------------------------------------------------------------------------- -uncompressed=$(echo "{snakemake.output.final}" | sed -e "s/\.gz$//") - cat << _EOF | R --vanilla --slave segments <- read.table("{snakemake.input.segment}", sep="\t", header=1, stringsAsFactors=FALSE) -stopifnot(all(c("chromosome", "start", "end") %in% colnames(segments))) +stopifnot(all(c("chromosome", "start", "end", "log2", "probes") %in% colnames(segments))) calls <- read.table("{snakemake.input.call}", sep="\t", header=1, stringsAsFactors=FALSE) stopifnot(all(c("chromosome", "start", "end", "cn") %in% colnames(calls))) @@ -65,24 +63,22 @@ segments[,"start"] <- segments[["start"]]-1 segments[,"end"] <- segments[["end"]]+1 -# Create bed file (abusing name, score & strand to make it bed-6 compatible) -segments[,"start"] <- segments[["start"]]-1 # Bed files are 0-based, semi-open intervals -segments[,"name"] <- sprintf("seg_%d_cn_%d", 1:nrow(segments), segments[["cn"]]) -segments[,"score"] <- pmin(1000, abs(segments[["log2"]])) -segments[,"strand"] <- "+" -segments[segments[["log2"]]<0,"strand"] <- "-" +# Add library name +segments[,"ID"] <- "{snakemake.wildcards[library_name]}" -write.table(segments[,c("chromosome", "start", "end", "name", "score", "strand")], file="$uncompressed", sep="\t", col.names=FALSE, row.names=FALSE, quote=FALSE) -_EOF +# Rename columns to follow DNAcopy format (as implemented in PureCN) +dna_copy_columns <- c(ID="ID", chromosome="chrom", start="loc.start", end="loc.end", probes="num.marks", log2="seg.mean", cn="C") +segments <- segments[,colnames(segments) %in% names(dna_copy_columns)] +colnames(segments) <- dna_copy_columns[colnames(segments)] +segments <- segments[,dna_copy_columns] -bgzip $uncompressed -tabix {snakemake.output.final} +write.table(segments, file="{snakemake.output.final}", sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE) +_EOF d=$(dirname "{snakemake.output.final}") pushd $d fn=$(basename "{snakemake.output.final}") md5sum $fn > $fn.md5 -md5sum $fn.tbi > $fn.tbi.md5 popd """ ) diff --git a/snappy_wrappers/wrappers/dkfz_bias_filter/environment.yaml b/snappy_wrappers/wrappers/dkfz_bias_filter/environment.yaml index bfa788b65..ef3fe295f 100644 --- a/snappy_wrappers/wrappers/dkfz_bias_filter/environment.yaml +++ b/snappy_wrappers/wrappers/dkfz_bias_filter/environment.yaml @@ -2,5 +2,7 @@ channels: - conda-forge - bioconda dependencies: +- htslib ==1.3.1 - dkfz-bias-filter ==1.2.3a -- bcftools +# bcftools incompatible with dkfz-bias-filter in bioconda (2023-10-13) +# - bcftools diff --git a/snappy_wrappers/wrappers/dkfz_bias_filter/wrapper.py b/snappy_wrappers/wrappers/dkfz_bias_filter/wrapper.py index 930ecd2a6..08c0bd829 100644 --- a/snappy_wrappers/wrappers/dkfz_bias_filter/wrapper.py +++ b/snappy_wrappers/wrappers/dkfz_bias_filter/wrapper.py @@ -44,7 +44,9 @@ {snakemake.config[static_data_config][reference][path]} \ ${{out%.gz}} +# bcftools incompatible with dkfzbiasfilter.py in bioconda (2023-10-13) if [[ ! -s ${{out%.gz}} ]]; then + # zgrep '^#' {snakemake.input.vcf} \ bcftools view --header-only {snakemake.input.vcf} \ > ${{out%.gz}} fi diff --git a/snappy_wrappers/wrappers/eb_filter/wrapper.py b/snappy_wrappers/wrappers/eb_filter/wrapper.py index 910c5b70d..821477ec8 100644 --- a/snappy_wrappers/wrappers/eb_filter/wrapper.py +++ b/snappy_wrappers/wrappers/eb_filter/wrapper.py @@ -40,7 +40,20 @@ # Used to be: # filter='FILTER == "germline_risk" || FILTER == "t_lod_fstar" || FILTER == "OffExome" || ANN ~ "stream_gene_variant"' if [[ {snakemake.input.vcf} == *"mutect2"* ]]; then - filter='FILTER == "germline" || FILTER == "weak_evidence" || FILTER == "OffExome" || ANN ~ "stream_gene_variant"' + filter="" + for f in $(echo "germline weak_evidence OffExome" | tr ' ' '\n') + do + use="Yes" + zgrep -q "^##FILTER= $TMPDIR/tmp.vcf.gz +mv $TMPDIR/tmp.vcf.gz {snakemake.output.vcf} tabix -f {snakemake.output.vcf} pushd $(dirname {snakemake.output.vcf}) && \ diff --git a/snappy_wrappers/wrappers/mutect2_par/run/parallel_mutect2.py b/snappy_wrappers/wrappers/mutect2_par/run/parallel_mutect2.py index d2713eaa1..9de25ac92 100644 --- a/snappy_wrappers/wrappers/mutect2_par/run/parallel_mutect2.py +++ b/snappy_wrappers/wrappers/mutect2_par/run/parallel_mutect2.py @@ -33,7 +33,7 @@ def __init__(self, snakemake): self.job_resources = ResourceUsage( threads=1, memory=gib_to_string(14.0 * self.get_job_mult_memory()), - time=hours(1 * self.get_job_mult_time()), + time=hours(4 * self.get_job_mult_time()), partition=os.getenv("SNAPPY_PIPELINE_PARTITION"), ) self.merge_resources = ResourceUsage( diff --git a/snappy_wrappers/wrappers/purecn/coverage/wrapper.py b/snappy_wrappers/wrappers/purecn/coverage/wrapper.py index 20ae81288..0691d31ee 100644 --- a/snappy_wrappers/wrappers/purecn/coverage/wrapper.py +++ b/snappy_wrappers/wrappers/purecn/coverage/wrapper.py @@ -86,6 +86,15 @@ mkdir -p $(dirname {snakemake.output.coverage}) apptainer exec --home $PWD {bindings} {container} $cmd +# Rename coverage file name +d=$(dirname {snakemake.output.coverage}) +mapper="{snakemake.wildcards[mapper]}" +libname="{snakemake.wildcards[library_name]}" +fn="$d/$mapper.${{libname}}_coverage_loess.txt.gz" + +test -e $fn +mv $fn {snakemake.output.coverage} + pushd $(dirname {snakemake.output.coverage}) md5sum $(basename {snakemake.output.coverage}) > $(basename {snakemake.output.coverage}).md5 popd diff --git a/snappy_wrappers/wrappers/purecn/create_panel/wrapper.py b/snappy_wrappers/wrappers/purecn/create_panel/wrapper.py index 9ee6f63d4..5224d6084 100644 --- a/snappy_wrappers/wrappers/purecn/create_panel/wrapper.py +++ b/snappy_wrappers/wrappers/purecn/create_panel/wrapper.py @@ -12,8 +12,8 @@ step = snakemake.config["pipeline_step"]["name"] config = snakemake.config["step_config"][step]["purecn"] -if "genomicsDB" in config.keys() and config["genomicsDB"]: - genomicsDB = config["genomicsDB"] +if "path_genomicsDB" in config.keys() and config["path_genomicsDB"]: + genomicsDB = config["path_genomicsDB"] else: genomicsDB = "" diff --git a/snappy_wrappers/wrappers/purecn/run/wrapper.py b/snappy_wrappers/wrappers/purecn/run/wrapper.py index 0db05d037..a939f333f 100644 --- a/snappy_wrappers/wrappers/purecn/run/wrapper.py +++ b/snappy_wrappers/wrappers/purecn/run/wrapper.py @@ -93,11 +93,22 @@ echo "$checksum" }} +# Rename PureCN files to snappy conventions +rename() {{ + to=$1 + d=$(dirname $to) + f=$(basename $to) + echo $f | grep -q "^{snakemake.wildcards[mapper]}.purecn.{snakemake.wildcards[library_name]}" + from=$(echo $f | sed -e "s/^{snakemake.wildcards[mapper]}.purecn.//") + test -e $d/$from + mv $d/$from $to +}} + outdir=$(dirname {snakemake.output.segments}) mkdir -p $outdir # Run PureCN with a panel of normals -cmd="/usr/local/bin/Rscript PureCN.R \ +cmd="/usr/local/bin/Rscript /opt/PureCN/PureCN.R \ --sampleid {snakemake.wildcards[library_name]} \ --tumor {snakemake.input.tumor} \ --vcf {bound_files[vcf]} \ @@ -106,11 +117,42 @@ --intervals {bound_files[intervals]} \ --genome {config[genome_name]} \ --out $outdir --out-vcf --force \ - --seed {config[seed]} --parallel --cores={snakemake.threads} \ + --seed {config[seed]} --parallel --cores {snakemake.threads} \ {extra_commands} " apptainer exec --home $PWD {bindings} {config[path_container]} $cmd +rename {snakemake.output.segments} +rename {snakemake.output.ploidy} +rename {snakemake.output.pvalues} +rename {snakemake.output.vcf} +rename {snakemake.output.vcf_tbi} +rename {snakemake.output.loh} + +# Fix chromosome names (https://github.com/lima1/PureCN/issues/331) +seg_chrnames=$(tail -n +2 {snakemake.output.segments} | cut -f 2 | sort | uniq) +vcf_chrnames=$(zgrep '^##contig= {snakemake.output.segments_md5} md5 {snakemake.output.ploidy} > {snakemake.output.ploidy_md5} md5 {snakemake.output.pvalues} > {snakemake.output.pvalues_md5} diff --git a/snappy_wrappers/wrappers/scarHRD/environment.yaml b/snappy_wrappers/wrappers/scarHRD/environment.yaml index a86405d52..9093fa7cb 100644 --- a/snappy_wrappers/wrappers/scarHRD/environment.yaml +++ b/snappy_wrappers/wrappers/scarHRD/environment.yaml @@ -4,3 +4,16 @@ channels: dependencies: - python =3.9 - r-base + - r-remotes + # scarHRD requirements (+sequenza) + - r-data.table + # sequenza requirements (+copynumber) + - r-pbapply + - r-squash + - r-iotools + - r-readr + - r-seqminer + # copynumber requirements + - bioconductor-S4Vectors + - bioconductor-IRanges + - bioconductor-GenomicRanges diff --git a/snappy_wrappers/wrappers/scarHRD/install/environment.yaml b/snappy_wrappers/wrappers/scarHRD/install/environment.yaml new file mode 120000 index 000000000..2e107ac86 --- /dev/null +++ b/snappy_wrappers/wrappers/scarHRD/install/environment.yaml @@ -0,0 +1 @@ +../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/scarHRD/install/wrapper.py b/snappy_wrappers/wrappers/scarHRD/install/wrapper.py new file mode 100644 index 000000000..ca4d0d9bd --- /dev/null +++ b/snappy_wrappers/wrappers/scarHRD/install/wrapper.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +"""Installation of scarHRD non-standard packages""" + +import os +from pathlib import Path +import sys + +# The following is required for being able to import snappy_wrappers modules +# inside wrappers. These run in an "inner" snakemake process which uses its +# own conda environment which cannot see the snappy_pipeline installation. +base_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")) +sys.path.insert(0, base_dir) + +from snappy_wrappers.utils import install_R_package # noqa: E402 + +__author__ = "Eric Blanc " + +dest = os.path.dirname(str(snakemake.output.done)) +for package in snakemake.params.packages: + install_R_package(dest, package["name"], package["repo"]) + +Path(str(snakemake.output.done)).touch() diff --git a/snappy_wrappers/wrappers/scarHRD/run/wrapper.py b/snappy_wrappers/wrappers/scarHRD/run/wrapper.py index 7e1261fa5..c825f46f1 100644 --- a/snappy_wrappers/wrappers/scarHRD/run/wrapper.py +++ b/snappy_wrappers/wrappers/scarHRD/run/wrapper.py @@ -7,7 +7,7 @@ __author__ = "Eric Blanc " -lib_path = os.path.dirname(snakemake.input.done) +lib_path = os.path.realpath(os.path.dirname(snakemake.input.done)) step = snakemake.config["pipeline_step"]["name"] genome = snakemake.config["static_data_config"]["reference"]["path"] @@ -49,23 +49,30 @@ export R_LIBS_USER="{lib_path}" export VROOM_CONNECTION_SIZE=2000000000 -export R_LIBS_PATH="{lib_path}" -export VROOM_CONNECTION_SIZE=2000000000 +# Necessary because scarHRD litters the current directory +pushd $(dirname {snakemake.output.scarHRD}) + +fn=$(basename "{snakemake.output.scarHRD}") cat << __EOF | R --vanilla --slave library("scarHRD") -tbl <- scar_score("{snakemake.input.seqz}", reference="{genome_name}", seqz=TRUE, chr.in.name={chr_in_name}, outputdir=dirname("{snakemake.output.scarHRD}")) -cat('{{\n', file="{snakemake.output.scarHRD}") -cat(' "HRD": ', tbl[1,1], ',\n', sep="", file="{snakemake.output.scarHRD}", append=TRUE) -cat(' "Telomeric AI": ', tbl[1,2], ',\n', sep="", file="{snakemake.output.scarHRD}", append=TRUE) -cat(' "LST": ', tbl[1,3], ',\n', sep="", file="{snakemake.output.scarHRD}", append=TRUE) -cat(' "HRD-sum": ', tbl[1,4], '\n', sep="", file="{snakemake.output.scarHRD}", append=TRUE) -cat('}}\n', file="{snakemake.output.scarHRD}", append=TRUE) +tbl <- scar_score("{snakemake.input.seqz}", reference="{genome_name}", seqz=TRUE, chr.in.name={chr_in_name}) + +warnings() + +cat('{{\n', file="$fn") +cat(' "HRD": ', tbl[1,1], ',\n', sep="", file="$fn", append=TRUE) +cat(' "Telomeric AI": ', tbl[1,2], ',\n', sep="", file="$fn", append=TRUE) +cat(' "LST": ', tbl[1,3], ',\n', sep="", file="$fn", append=TRUE) +cat(' "HRD-sum": ', tbl[1,4], '\n', sep="", file="$fn", append=TRUE) +cat('}}\n', file="$fn", append=TRUE) __EOF -pushd $(dirname {snakemake.output.scarHRD}) ; f=$(basename {snakemake.output.scarHRD}) ; md5sum $f > $f.md5 ; popd +md5sum $fn > $fn.md5 + +popd """ ) diff --git a/snappy_wrappers/wrappers/sequenza/coverage/environment.yaml b/snappy_wrappers/wrappers/sequenza/coverage/environment.yaml new file mode 120000 index 000000000..050fd4ee3 --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/coverage/environment.yaml @@ -0,0 +1 @@ +../gcreference/environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/sequenza/coverage/wrapper.py b/snappy_wrappers/wrappers/sequenza/coverage/wrapper.py new file mode 100644 index 000000000..cc524a261 --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/coverage/wrapper.py @@ -0,0 +1,72 @@ +"""CUBI+Snakemake wrapper code for sequenza (sequenza-utils, pileups) +""" + +import os +import sys + +# The following is required for being able to import snappy_wrappers modules +# inside wrappers. These run in an "inner" snakemake process which uses its +# own conda environment which cannot see the snappy_pipeline installation. +base_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")) +sys.path.insert(0, base_dir) + +from snakemake import shell + +from snappy_wrappers.tools.genome_windows import yield_contigs + +__author__ = "Eric Blanc " + + +step = snakemake.config["pipeline_step"]["name"] +config = snakemake.config["step_config"][step]["sequenza"] +genome = snakemake.config["static_data_config"]["reference"]["path"] +length = config["length"] + +f = open(genome + ".fai", "rt") +contigs = " ".join(yield_contigs(f, config.get("ignore_chroms"))) +f.close() + +extra_arguments = " ".join( + ["--{} {}".format(k, v) for k, v in config.get("extra_arguments", {}).items()] +) + +shell.executable("/bin/bash") + +shell( + r""" +set -x + +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} + +# Also pipe stderr to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi + +sequenza-utils bam2seqz \ + -gc {snakemake.input.gc} --fasta {genome} \ + -n {snakemake.input.normal_bam} --tumor {snakemake.input.tumor_bam} \ + -C {contigs} {extra_arguments} \ + | sequenza-utils seqz_binning -s - \ + -w {length} -o {snakemake.output.seqz} + +pushd $(dirname {snakemake.output.seqz}) ; f=$(basename {snakemake.output.seqz}) ; md5sum $f > $f.md5 ; popd +""" +) + +# Compute MD5 sums of logs. +shell( + r""" +md5sum {snakemake.log.log} >{snakemake.log.log_md5} +""" +) diff --git a/snappy_wrappers/wrappers/sequenza/environment.yaml b/snappy_wrappers/wrappers/sequenza/environment.yaml deleted file mode 100644 index b6a8c8b49..000000000 --- a/snappy_wrappers/wrappers/sequenza/environment.yaml +++ /dev/null @@ -1,10 +0,0 @@ -channels: - - conda-forge - - bioconda -dependencies: - - python =3.9 - - sequenza-utils - - r-sequenza - - r-devtools - - r-data.table - - samtools diff --git a/snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml b/snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml deleted file mode 120000 index 2e107ac86..000000000 --- a/snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml +++ /dev/null @@ -1 +0,0 @@ -../environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml b/snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml new file mode 100644 index 000000000..72d44247a --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/gcreference/environment.yaml @@ -0,0 +1,7 @@ +channels: + - conda-forge + - bioconda +dependencies: + - python =3.9 + - sequenza-utils + - samtools diff --git a/snappy_wrappers/wrappers/sequenza/install/environment.yaml b/snappy_wrappers/wrappers/sequenza/install/environment.yaml new file mode 100644 index 000000000..dc180c107 --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/install/environment.yaml @@ -0,0 +1,18 @@ +channels: + - conda-forge + - bioconda +dependencies: + - python =3.9 + - r-base + - r-remotes + # sequenza requirements (+copynumber) + - r-pbapply + - r-squash + - r-iotools + - r-readr + - r-seqminer + - r-data.table + # copynumber requirements + - bioconductor-S4Vectors + - bioconductor-IRanges + - bioconductor-GenomicRanges diff --git a/snappy_wrappers/wrappers/sequenza/install/wrapper.py b/snappy_wrappers/wrappers/sequenza/install/wrapper.py new file mode 100644 index 000000000..780a8347f --- /dev/null +++ b/snappy_wrappers/wrappers/sequenza/install/wrapper.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +"""Installation of sequenza non-standard packages""" + +import os +from pathlib import Path +import sys + +# The following is required for being able to import snappy_wrappers modules +# inside wrappers. These run in an "inner" snakemake process which uses its +# own conda environment which cannot see the snappy_pipeline installation. +base_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")) +sys.path.insert(0, base_dir) + +from snappy_wrappers.utils import install_R_package # noqa: E402 + +__author__ = "Eric Blanc " + +dest = os.path.dirname(str(snakemake.output.done)) +for package in snakemake.params.packages: + install_R_package(dest, package["name"], package["repo"]) + +Path(str(snakemake.output.done)).touch() diff --git a/snappy_wrappers/wrappers/sequenza/report/wrapper.py b/snappy_wrappers/wrappers/sequenza/report/wrapper.py index 28c1b18a6..3db1e1ec6 100644 --- a/snappy_wrappers/wrappers/sequenza/report/wrapper.py +++ b/snappy_wrappers/wrappers/sequenza/report/wrapper.py @@ -68,6 +68,7 @@ def config_to_r(x): fi export R_LIBS_USER=$(dirname {snakemake.input.packages}) +export VROOM_CONNECTION_SIZE=2000000000 R --vanilla --slave << __EOF library(sequenza) @@ -80,11 +81,11 @@ def config_to_r(x): args <- c(args, {args_fit}) CP <- do.call(sequenza.fit, args=args) -sequenza.results(sequenza.extract=seqz, cp.table=CP, sample.id="{snakemake.params[sample_id]}", out.dir=dirname("{snakemake.output.done}")) +sequenza.results(sequenza.extract=seqz, cp.table=CP, sample.id="{snakemake.wildcards[library_name]}", out.dir=dirname("{snakemake.output.done}")) __EOF -pushd $(dirname {snakemake.output.done}) ; for f in $(ls) ; do md5sum $f > $f.md5 ; done ; popd +pushd $(dirname {snakemake.output.done}) ; fns=$(ls) ; for f in $fns ; do md5sum $f > $f.md5 ; done ; popd touch {snakemake.output.done} """ diff --git a/snappy_wrappers/wrappers/sequenza/run/environment.yaml b/snappy_wrappers/wrappers/sequenza/run/environment.yaml index 2e107ac86..04535f055 120000 --- a/snappy_wrappers/wrappers/sequenza/run/environment.yaml +++ b/snappy_wrappers/wrappers/sequenza/run/environment.yaml @@ -1 +1 @@ -../environment.yaml \ No newline at end of file +../install/environment.yaml \ No newline at end of file diff --git a/snappy_wrappers/wrappers/sequenza/run/wrapper.py b/snappy_wrappers/wrappers/sequenza/run/wrapper.py index 13fa1f64d..c768d3937 100644 --- a/snappy_wrappers/wrappers/sequenza/run/wrapper.py +++ b/snappy_wrappers/wrappers/sequenza/run/wrapper.py @@ -1,4 +1,4 @@ -"""CUBI+Snakemake wrapper code for sequenza (sequenza-utils, pileups) +"""CUBI+Snakemake wrapper code for sequenza (coverage analysis in R) """ import os @@ -16,18 +16,35 @@ __author__ = "Eric Blanc " + +def config_to_r(x): + if x is None: + return "NULL" + if isinstance(x, str): + return f'"{x}"' + if isinstance(x, bool): + return "TRUE" if x else "FALSE" + if isinstance(x, list): + # TODO: verify that all elements are either bool, str or numeric + return "c({})".format(", ".join([config_to_r(xx) for xx in x])) + if isinstance(x, dict): + return "list({})".format( + ", ".join(['"{}"={}'.format(k, config_to_r(v)) for k, v in x.items()]) + ) + return str(x) + + step = snakemake.config["pipeline_step"]["name"] config = snakemake.config["step_config"][step]["sequenza"] genome = snakemake.config["static_data_config"]["reference"]["path"] length = config["length"] f = open(genome + ".fai", "rt") -contigs = " ".join(yield_contigs(f, config.get("ignore_chroms"))) +contigs = config_to_r(list(yield_contigs(f, config.get("ignore_chroms")))) f.close() -extra_arguments = " ".join( - ["--{} {}".format(k, v) for k, v in config.get("extra_arguments", {}).items()] -) +args_extract = config_to_r(dict(config["extra_args_extract"])) +args_fit = config_to_r(dict(config["extra_args_fit"])) shell.executable("/bin/bash") @@ -52,14 +69,52 @@ fi fi -sequenza-utils bam2seqz \ - -gc {snakemake.input.gc} --fasta {genome} \ - -n {snakemake.input.normal_bam} --tumor {snakemake.input.tumor_bam} \ - -C {contigs} {extra_arguments} \ - | sequenza-utils seqz_binning -s - \ - -w {length} -o {snakemake.output.seqz} +export R_LIBS_USER=$(dirname {snakemake.input.packages}) +export VROOM_CONNECTION_SIZE=2000000000 + +R --vanilla --slave << __EOF +library(sequenza) + +# Follow sequenza documentation https://bitbucket.org/sequenzatools/sequenza/src/master/ +args <- list(file="{snakemake.input.seqz}", assembly="{config[assembly]}", chromosome.list={contigs}) +args <- c(args, {args_extract}) +seqz <- do.call(sequenza.extract, args=args) + +args <- list(sequenza.extract=seqz, chromosome.list={contigs}, mc.cores=1) +args <- c(args, {args_fit}) +CP <- do.call(sequenza.fit, args=args) + +sequenza.results(sequenza.extract=seqz, cp.table=CP, sample.id="{snakemake.wildcards[library_name]}", out.dir=dirname("{snakemake.output.done}")) + +warnings() + +# Convert *_segment.txt to *_dnacopy.seg to follow pipeline output format +segments <- file.path(dirname("{snakemake.output.done}"), sprintf("%s_segments.txt", "{snakemake.wildcards[library_name]}")) +stopifnot(file.exists(segments)) +dnacopy <- read.table(segments, sep="\t", header=1, stringsAsFactors=FALSE, check.names=FALSE) + +dnacopy[,"ID"] <- "{snakemake.wildcards[library_name]}" +dnacopy[,"depth.ratio"] <- log2(dnacopy[,"depth.ratio"]) + +col_names <- c( + "ID"="ID", + "chromosome"="chrom", + "start.pos"="loc.start", + "end.pos"="loc.end", + "N.BAF"="num.mark", + "depth.ratio"="seg.mean", + "CNt"="C" +) +stopifnot(all(names(col_names) %in% colnames(dnacopy))) +dnacopy <- dnacopy[,names(col_names)] +colnames(dnacopy) <- col_names + +write.table(dnacopy, file="{snakemake.output.seg}", sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE) +__EOF -pushd $(dirname {snakemake.output.seqz}) ; f=$(basename {snakemake.output.seqz}) ; md5sum $f > $f.md5 ; popd +pushd $(dirname {snakemake.output.seg}) ; f=$(basename {snakemake.output.seg}) ; md5sum $f > $f.md5 ; popd +pushd $(dirname {snakemake.output.done}) ; fns=$(ls) ; for f in $fns ; do md5sum $f > $f.md5 ; done ; popd +touch {snakemake.output.done} """ ) diff --git a/snappy_wrappers/wrappers/somatic_cnv_checking/cnv-check-plot.R b/snappy_wrappers/wrappers/somatic_cnv_checking/cnv-check-plot.R index f6d54977e..3845e2e0a 100644 --- a/snappy_wrappers/wrappers/somatic_cnv_checking/cnv-check-plot.R +++ b/snappy_wrappers/wrappers/somatic_cnv_checking/cnv-check-plot.R @@ -13,7 +13,7 @@ vcf_to_table <- function(vcf, sample, amplification=7) { stopifnot(all(lengths(VariantAnnotation::alt(vcf)) == 2)) x <- data.frame( - CHROM=GenomicRanges::seqnames(SummarizedExperiment::rowRanges(vcf)), + CHROM=as.character(GenomicRanges::seqnames(SummarizedExperiment::rowRanges(vcf))), POS=GenomicRanges::start(SummarizedExperiment::rowRanges(vcf)), REF=VariantAnnotation::ref(vcf), ALT=unlist(lapply(VariantAnnotation::alt(vcf), function(a) a[1])), @@ -34,7 +34,8 @@ cnv_to_table <- function(cnv) { colnames(y) <- c("CHROM", "start", "stop", "name", "LFC", "strand") y <- y |> dplyr::mutate(LFC=replace(LFC, strand == "-", -abs(LFC[strand=="-"]))) |> - dplyr::mutate(start=start + 1) + dplyr::mutate(start=start + 1) |> + dplyr::mutate(CHROM=as.character(CHROM)) y } diff --git a/snappy_wrappers/wrappers/somatic_cnv_checking/wrapper.py b/snappy_wrappers/wrappers/somatic_cnv_checking/wrapper.py index 924c194e0..bf1277484 100644 --- a/snappy_wrappers/wrappers/somatic_cnv_checking/wrapper.py +++ b/snappy_wrappers/wrappers/somatic_cnv_checking/wrapper.py @@ -58,7 +58,7 @@ y <- read.table("{snakemake.input.tsv}", sep="\t", header=1, check.names=FALSE) y <- y |> dplyr::mutate(Call=cn_to_call(CN)) -y <- y |> dplyr::left_join(genome_lengths, by="CHROM") |> dplyr::mutate(from=start + Offset, to=stop + Offset) +y <- y |> dplyr::mutate(CHROM=as.character(CHROM)) |> dplyr::left_join(genome_lengths, by="CHROM") |> dplyr::mutate(from=start + Offset, to=stop + Offset) pdf("{snakemake.output.cnv}", height=6.22, width=9.33) plot_cnv(x, scale="log2") + ggplot2::ggtitle("{snakemake.wildcards[library_name]}") diff --git a/snappy_wrappers/wrappers/star/wrapper.py b/snappy_wrappers/wrappers/star/wrapper.py index db1f277f6..ead553e6e 100644 --- a/snappy_wrappers/wrappers/star/wrapper.py +++ b/snappy_wrappers/wrappers/star/wrapper.py @@ -139,7 +139,7 @@ fi quant_mode="" - if [[ -n "{snakemake.config[step_config][ngs_mapping][star][path_features]}" ]] + if [[ -n "{snakemake.config[static_data_config][features][path]}" ]] then quant_mode="$quant_mode GeneCounts" fi @@ -175,8 +175,8 @@ $(if [[ -n "$quant_mode" ]]; then \ echo "--quantMode $quant_mode" fi) \ - $(if [[ -n "{snakemake.config[step_config][ngs_mapping][star][path_features]}" ]]; then \ - echo --sjdbGTFfile "{snakemake.config[step_config][ngs_mapping][star][path_features]}" + $(if [[ -n "{snakemake.config[static_data_config][features][path]}" ]]; then \ + echo --sjdbGTFfile "{snakemake.config[static_data_config][features][path]}" fi) \ $(if [[ "{snakemake.config[step_config][ngs_mapping][star][mask_duplicates]}" == "True" ]]; then \ echo " --outStd SAM " ; \ @@ -200,12 +200,10 @@ index_bam {snakemake.output.bam} -# Optional output: gene counts & mapping on transcriptome ----------------------------------------- +mv $TMPDIR/pre.d/out.ReadsPerGene.out.tab {out_gc} +compute-md5 {out_gc} {out_gc}.md5 -if [[ -n "{snakemake.config[step_config][ngs_mapping][star][path_features]}" ]]; then - mv $TMPDIR/pre.d/out.ReadsPerGene.out.tab {out_gc} - compute-md5 {out_gc} {out_gc}.md5 -fi +# Optional output: mapping on transcriptome ------------------------------------------------------- if [[ "{snakemake.config[step_config][ngs_mapping][star][transcriptome]}" = "True" ]]; then if [[ "{snakemake.config[step_config][ngs_mapping][star][mask_duplicates]}" == "True" ]]; then diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py index 579de04c3..94ab53b00 100644 --- a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/protein_mutation_parser.py @@ -212,7 +212,7 @@ def _build_protein_pattern(): + "(" + "|".join( [ - "(0|=|\?)", # noqa: W605 + "(0\??|=|\?)", # noqa: W605 substitution, # 4: ref, 5: position, 6: alt duplication, # 7: start, 8: start pos, 10: end, 11: end pos deletion, # 12: start, 13: start pos, 15: end, 16: end pos diff --git a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py index 620514f32..d97d17b53 100644 --- a/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py +++ b/snappy_wrappers/wrappers/vcf2maf/vcf_to_table/wrapper.py @@ -12,7 +12,7 @@ vcf_to_table = os.path.join(os.path.dirname(os.path.realpath(__file__)), "vcf_to_table.py") if config["somatic_variant_annotation_tool"] == "vep": vcf_to_table_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "vep.yaml") -elif config["somatic_variant_annotation_tool"] == "jannovar_annotate_somatic_vcf": +elif config["somatic_variant_annotation_tool"] == "jannovar": vcf_to_table_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "jannovar.yaml") else: raise Exception( diff --git a/snappy_wrappers/wrappers/vcfpy/add_bed/wrapper.py b/snappy_wrappers/wrappers/vcfpy/add_bed/wrapper.py index d98068a87..4ef49107e 100644 --- a/snappy_wrappers/wrappers/vcfpy/add_bed/wrapper.py +++ b/snappy_wrappers/wrappers/vcfpy/add_bed/wrapper.py @@ -1,146 +1,59 @@ import math -import numbers +import os import re -import subprocess +import shutil +import tempfile from snakemake.shell import shell import tabix import vcfpy -NAME_PATTERN = re.compile("^seg_([0-9]+)_cn_([0-9]+)$") - -LFC = {"ID": "LFC", "Number": 1, "Type": "Float", "Description": "Log2 fold change from coverage"} -CN = { - "ID": "CN", - "Number": 1, - "Type": "Integer", - "Description": "Number of allele called by the CNV caller", -} - step = snakemake.config["pipeline_step"]["name"] config = snakemake.config["step_config"][step] -bed = tabix.open(snakemake.input.cnv) +tempdir = tempfile.mkdtemp() -ps = [] -nProc = 0 -ps += [ - subprocess.Popen( - ["bcftools", "merge", snakemake.input.normal, snakemake.input.tumor], stdout=subprocess.PIPE - ) +variants = [ + f"bcftools merge {snakemake.input.normal} {snakemake.input.tumor}", + 'bcftools filter --include "N_ALT=2 & FORMAT/AD[:2]=0"', ] -nProc += 1 -ps += [ - subprocess.Popen( - ["bcftools", "filter", "--include", "N_ALT=2 & FORMAT/AD[:2]=0"], - stdin=ps[nProc - 1].stdout, - stdout=subprocess.PIPE, - text=True, - ) -] -ps[nProc - 1].stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. -nProc += 1 if "excluded_regions" in config and config["excluded_regions"]: - ps += [ - subprocess.Popen( - ["bcftools", "view", "--targets-file", "^" + config["excluded_regions"]], - stdin=ps[nProc - 1].stdout, - stdout=subprocess.PIPE, - text=True, - ) - ] - ps[nProc - 1].stdout.close() - nProc += 1 -reader = vcfpy.Reader.from_stream(ps[nProc - 1].stdout) + variants.append(f"bcftools view --targets-file ^{config['excluded_regions']}") +variants = " \\\n | ".join(variants) -sample = snakemake.wildcards["library_name"] -iSample = reader.header.samples.name_to_idx[sample] - -reader.header.add_format_line(LFC) -reader.header.add_format_line(CN) - -writer = vcfpy.Writer.from_path(snakemake.output.vcf, reader.header) - -segments = {} -for variant in reader: - logFoldChange = None - cn = None - - # Add default (missing) values for all samples - variant.add_format("LFC", logFoldChange) - variant.add_format("CN", cn) - - try: - locii = list(bed.query(variant.CHROM, variant.affected_start, variant.affected_end + 1)) - except tabix.TabixError as e: - print( - "Variant {}:{}{}>{} not covered by segmentation of sample {}".format( - variant.CHROM, variant.POS, variant.REF, variant.ALT[0].value, sample - ) - ) - continue - - if len(locii) == 0: - print( - "Variant {}:{}{}>{} not covered by segmentation of sample {}".format( - variant.CHROM, variant.POS, variant.REF, variant.ALT[0].value, sample - ) - ) - elif len(locii) == 1: - for locus in locii: - logFoldChange = float(locus[4]) - if locus[5] == "-": - logFoldChange = -logFoldChange - m = NAME_PATTERN.match(locus[3]) - assert m - cn = int(m.groups()[1]) - else: - print( - "Variant {}:{}{}>{} crosses segments in sample {}".format( - variant.CHROM, variant.POS, variant.REF, variant.ALT[0].value, sample - ) - ) - for locus in locii: - m = NAME_PATTERN.match(locus[3]) - assert m - if cn is None: - cn = int(m.groups()[1]) - else: - if cn != int(m.groups()[1]): - cn = None - break +shell( + r""" +set -x - variant.calls[iSample].data["LFC"] = logFoldChange - variant.calls[iSample].data["CN"] = cn +# Write out information about conda installation. +conda list >{snakemake.log.conda_list} +conda info >{snakemake.log.conda_info} +md5sum {snakemake.log.conda_list} >{snakemake.log.conda_list_md5} +md5sum {snakemake.log.conda_info} >{snakemake.log.conda_info_md5} - writer.write_record(variant) +# Also pipe stderr to log file +if [[ -n "{snakemake.log.log}" ]]; then + if [[ "$(set +e; tty; set -e)" != "" ]]; then + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + exec 2> >(tee -a "{snakemake.log.log}" >&2) + else + rm -f "{snakemake.log.log}" && mkdir -p $(dirname {snakemake.log.log}) + echo "No tty, logging disabled" >"{snakemake.log.log}" + fi +fi - if len(locii) == 1: - locus = locii[0] - if locus[3] not in segments: - segments[locus[3]] = { - "logFoldChange": logFoldChange, - "CHROM": locus[0], - "start": locus[1], - "stop": locus[2], - "BAFs": [], - "NoData": 0, - } - depth = variant.call_for_sample[sample].data["AD"] - if len(depth) == 0: - segments[locus[3]]["NoData"] += 1 - else: - if depth[0] is None: - depth[0] = 0 - if depth[1] is None: - depth[1] = 0 - if depth[0] + depth[1] == 0: - segments[locus[3]]["NoData"] += 1 - else: - baf = min(depth[0], depth[1]) / (depth[0] + depth[1]) - segments[locus[3]]["BAFs"] += [baf] +{variants} \ + | bgzip \ + > {tempdir}/variants.vcf.gz +tabix {tempdir}/variants.vcf.gz -writer.close() +tail -n +2 {snakemake.input.cnv} \ + | awk '{{if ($6 < 0) {{sgn="-"; lfc=-$6}} else {{sgn="+"; lfc=$6}}; printf "%s\t%d\t%d\tseg_%d_cn_%d\t%f\t%s\n", $2, $3-1, $4, NR, $7, lfc, sgn}}' \ + | bgzip \ + > {tempdir}/segments.bed.gz +tabix {tempdir}/segments.bed.gz +""" +) # Implmentation of R's quantile function for continuous quantiles. def quantile(x, probs, na_rm=False, method=7): @@ -183,6 +96,116 @@ def quantile(x, probs, na_rm=False, method=7): return qs +# Adds the seg.mean & C (from *_dnacopy.seg file) to the variant vcf +NAME_PATTERN = re.compile("^seg_([0-9]+)_cn_([0-9]+)$") + +LFC = {"ID": "LFC", "Number": 1, "Type": "Float", "Description": "Log2 fold change from coverage"} +CN = { + "ID": "CN", + "Number": 1, + "Type": "Integer", + "Description": "Number of allele called by the CNV caller", +} + +bed = tabix.open(os.path.join(tempdir, "segments.bed.gz")) + +reader = vcfpy.Reader.from_path(os.path.join(tempdir, "variants.vcf.gz")) + +sample = snakemake.wildcards["library_name"] +iSample = reader.header.samples.name_to_idx[sample] + +reader.header.add_format_line(LFC) +reader.header.add_format_line(CN) + +writer = vcfpy.Writer.from_path(snakemake.output.vcf, reader.header) + +segments = {} +with open(snakemake.log.log, "+at") as log: + for variant in reader: + logFoldChange = None + cn = None + + # Add default (missing) values for all samples + variant.add_format("LFC", logFoldChange) + variant.add_format("CN", cn) + + try: + locii = list(bed.query(variant.CHROM, variant.affected_start, variant.affected_end + 1)) + + if len(locii) == 0: + log.write( + "Variant {}:{}{}>{} not covered by segmentation of sample {}\n".format( + variant.CHROM, variant.POS, variant.REF, variant.ALT[0].value, sample + ) + ) + elif len(locii) == 1: + for locus in locii: + logFoldChange = float(locus[4]) + if locus[5] == "-": + logFoldChange = -logFoldChange + m = NAME_PATTERN.match(locus[3]) + assert m + cn = int(m.groups()[1]) + else: + log.write( + "Variant {}:{}{}>{} crosses segments in sample {}\n".format( + variant.CHROM, variant.POS, variant.REF, variant.ALT[0].value, sample + ) + ) + for locus in locii: + m = NAME_PATTERN.match(locus[3]) + assert m + if cn is None: + cn = int(m.groups()[1]) + else: + if cn != int(m.groups()[1]): + cn = None + break + + except tabix.TabixError as e: + log.write( + "Variant {}:{}{}>{} not covered by segmentation of sample {}\n".format( + variant.CHROM, variant.POS, variant.REF, variant.ALT[0].value, sample + ) + ) + locii = None + + variant.calls[iSample].data["LFC"] = logFoldChange + variant.calls[iSample].data["CN"] = cn + + writer.write_record(variant) + + if locii is None or len(locii) != 1: + continue + + locus = locii[0] + if locus[3] not in segments: + segments[locus[3]] = { + "logFoldChange": logFoldChange, + "CHROM": locus[0], + "start": locus[1], + "stop": locus[2], + "BAFs": [], + "NoData": 0, + } + depth = variant.call_for_sample[sample].data["AD"] + if len(depth) == 0: + segments[locus[3]]["NoData"] += 1 + else: + if depth[0] is None: + depth[0] = 0 + if depth[1] is None: + depth[1] = 0 + if depth[0] + depth[1] == 0: + segments[locus[3]]["NoData"] += 1 + else: + baf = min(depth[0], depth[1]) / (depth[0] + depth[1]) + segments[locus[3]]["BAFs"] += [baf] + + writer.close() + +shutil.rmtree(tempdir) + with open(snakemake.output.tsv, "wt") as f: print( "Number\tCHROM\tstart\tstop\tCN\tLFC\tNvariants\tMin\t1st quartile\tMedian\t3rd quartile\tMax\tNoData", diff --git a/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py b/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py index d225952e9..2a41b8c97 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py +++ b/tests/snappy_pipeline/workflows/test_workflows_cbioportal_export.py @@ -23,11 +23,12 @@ def minimal_config(): static_data_config: reference: path: /path/to/ref.fa + features: + path: /path/to/features.gtf step_config: ngs_mapping: star: - path_features: /path/to/gtf cbioportal_export: # Paths to snappy steps containing results to be uploaded path_ngs_mapping: /NGS_MAPPING @@ -417,7 +418,7 @@ def test_cbioportal_mutations_step_part_get_resource_usage(cbioportal_export_wor def test_cbioportal_cns2cna_step_part_get_input_files(cbioportal_export_workflow): """Tests cbioportalCns2CnaStepPart.get_input_files()""" expected = { - "cns": "/COPY_NUMBER/output/{mapper}.{caller}.{tumor_library}/out/{mapper}.{caller}.{tumor_library}.cns" + "DNAcopy": "/COPY_NUMBER/output/{mapper}.{caller}.{tumor_library}/out/{mapper}.{caller}.{tumor_library}_dnacopy.seg" } actual = cbioportal_export_workflow.get_input_files("cbioportal_cns2cna", "run") assert actual == expected @@ -449,7 +450,7 @@ def test_cbioportal_cns2cna_step_part_get_log_file(cbioportal_export_workflow): def test_cbioportal_cns2cna_step_part_get_args(cbioportal_export_workflow): """Tests cbioportalCns2CnaStepPart.get_args()""" expected = { - "features": "/path/to/gtf", + "features": "/path/to/features.gtf", "pipeline_id": "ENSEMBL", } actual = cbioportal_export_workflow.get_args("cbioportal_cns2cna", "run") @@ -567,7 +568,7 @@ def test_cbioportal_segment_step_part_get_input_files(cbioportal_export_workflow """Tests cbioportalSegmentStepPart.get_input_files()""" # Define expected sample = "P00{i}-T{t}" - base_name = "/COPY_NUMBER/output/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/out/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1.cns" + base_name = "/COPY_NUMBER/output/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/out/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1_dnacopy.seg" expected = { sample.format(i=i, t=t): base_name.format(i=i, t=t) for i, t in ((1, 1), (2, 1), (2, 2)) } @@ -646,7 +647,7 @@ def test_cbioportal_expression_step_part_get_args(cbioportal_export_workflow): """Tests cbioportalExpressionStepPart.get_args()""" expected = { "action_type": "expression", - "extra_args": {"tx_obj": "/path/to/gtf", "pipeline_id": "ENSEMBL"}, + "extra_args": {"tx_obj": "/path/to/features.gtf", "pipeline_id": "ENSEMBL"}, } actual = cbioportal_export_workflow.get_args("cbioportal_expression", "run") assert actual == expected diff --git a/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py b/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py index 365b5bce4..4dc433ba9 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py +++ b/tests/snappy_pipeline/workflows/test_workflows_ngs_mapping.py @@ -357,6 +357,8 @@ def test_star_step_part_get_output_files(ngs_mapping_workflow): report_base_out = "work/star.{library_name}/report/bam_qc/star.{library_name}" log_base_out = "work/star.{library_name}/log/star.{library_name}" expected = get_expected_output_files_dict(bam_base_out, report_base_out, log_base_out) + expected["gene_counts"] = "work/star.{library_name}/out/star.{library_name}.GeneCounts.tab" + expected["gene_counts_md5"] = expected["gene_counts"] + ".md5" # Get actual actual = ngs_mapping_workflow.get_output_files("star", "run") assert actual == expected diff --git a/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals.py b/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals.py index 7ac498f81..b582f5973 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals.py +++ b/tests/snappy_pipeline/workflows/test_workflows_panel_of_normals.py @@ -532,7 +532,7 @@ def test_purecn_step_part_get_input_files_coverage(panel_of_normals_workflow): wildcards = Wildcards( fromdict={ "mapper": "bwa", - "normal_library": "P001-N1-DNA1-WGS1", + "library_name": "P001-N1-DNA1-WGS1", } ) expected = { @@ -547,7 +547,7 @@ def test_purecn_step_part_get_input_files_coverage(panel_of_normals_workflow): def test_purecn_step_part_get_output_files_coverage(panel_of_normals_workflow): """Tests PureCnStepPart._get_output_files_coverage()""" expected = { - "coverage": "work/{mapper}.purecn/out/{mapper}.{normal_library,.+-DNA[0-9]+-WES[0-9]+}_coverage_loess.txt.gz" + "coverage": "work/{mapper}.purecn/out/{mapper}.purecn.{library_name,.+-DNA[0-9]+-WES[0-9]+}_coverage_loess.txt.gz" } actual = panel_of_normals_workflow.get_output_files("purecn", "coverage") assert actual == expected @@ -556,7 +556,7 @@ def test_purecn_step_part_get_output_files_coverage(panel_of_normals_workflow): def test_purecn_step_part_get_log_file_coverage(panel_of_normals_workflow): """Tests PureCnStepPart._get_log_file_coverage()""" expected = get_expected_log_files_dict( - base_out="work/{mapper}.purecn/log/{mapper}.{normal_library,.+-DNA[0-9]+-WES[0-9]+}" + base_out="work/{mapper}.purecn/log/{mapper}.purecn.{library_name,.+-DNA[0-9]+-WES[0-9]+}" ) actual = panel_of_normals_workflow.get_log_file("purecn", "coverage") assert actual == expected @@ -567,8 +567,8 @@ def test_purecn_step_part_get_input_files_create_panel(panel_of_normals_workflow wildcards = Wildcards(fromdict={"mapper": "bwa"}) expected = { "normals": [ - "work/bwa.purecn/out/bwa.P001-N1-DNA1-WGS1_coverage_loess.txt.gz", - "work/bwa.purecn/out/bwa.P002-N1-DNA1-WGS1_coverage_loess.txt.gz", + "work/bwa.purecn/out/bwa.purecn.P001-N1-DNA1-WGS1_coverage_loess.txt.gz", + "work/bwa.purecn/out/bwa.purecn.P002-N1-DNA1-WGS1_coverage_loess.txt.gz", ], "container": "work/containers/out/purecn.simg", } diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_cnv_checking.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_cnv_checking.py index 2310f7676..92c42cabf 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_cnv_checking.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_cnv_checking.py @@ -167,8 +167,7 @@ def test_cnv_run_step_part_get_input_files(somatic_cnv_checking_workflow): fromdict={"mapper": "bwa", "caller": "cnvkit", "library_name": "P001-T1-DNA1-WGS1"} ) expected = { - "cnv": "CNV_CALLING/output/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.bed.gz", - "cnv_tbi": "CNV_CALLING/output/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1.bed.gz.tbi", + "cnv": "CNV_CALLING/output/bwa.cnvkit.P001-T1-DNA1-WGS1/out/bwa.cnvkit.P001-T1-DNA1-WGS1_dnacopy.seg", "normal": "work/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.normal.vcf.gz", "normal_tbi": "work/bwa.P001-N1-DNA1-WGS1/out/bwa.P001-N1-DNA1-WGS1.normal.vcf.gz.tbi", "tumor": "work/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.tumor.vcf.gz", diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_gene_fusion_calling_processed_fastq.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_gene_fusion_calling_processed_fastq.py index 9b1548360..798000023 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_gene_fusion_calling_processed_fastq.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_gene_fusion_calling_processed_fastq.py @@ -24,6 +24,8 @@ def minimal_config(): static_data_config: reference: path: /path/to/ref.fa + features: + path: /path/to/features.gtf step_config: ngs_mapping: @@ -49,7 +51,6 @@ def minimal_config(): path_dataset_directory: REQUIRED arriba: path_index: /path/to/star/index - features: /path/to/features.gtf data_sets: first_batch: diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py index 6704fbfcd..a05198407 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_targeted_seq_cnv_calling.py @@ -482,12 +482,10 @@ def test_cnvkit_postprocess_step_part_get_input_files(somatic_targeted_seq_cnv_c def test_cnvkit_postprocess_step_part_get_output_files(somatic_targeted_seq_cnv_calling_workflow): - base_name_out = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}.bed.gz" + base_name_out = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}" expected = { - "final": base_name_out, - "final_tbi": base_name_out + ".tbi", - "final_md5": base_name_out + ".md5", - "final_tbi_md5": base_name_out + ".tbi.md5", + "final": base_name_out + "_dnacopy.seg", + "final_md5": base_name_out + "_dnacopy.seg.md5", } actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("cnvkit", "postprocess") assert actual == expected @@ -597,7 +595,13 @@ def test_cnvkit_export_step_part_get_output_files(somatic_targeted_seq_cnv_calli # Define expected expected = {} base_name_out = "work/{mapper}.cnvkit.{library_name}/out/{mapper}.cnvkit.{library_name}" - for key, ext in (("seg", "seg"), ("vcf", "vcf.gz"), ("tbi", "vcf.gz.tbi")): + for key, ext in ( + ("bed", "bed.gz"), + ("bed_tbi", "bed.gz.tbi"), + ("seg", "seg"), + ("vcf", "vcf.gz"), + ("vcf_tbi", "vcf.gz.tbi"), + ): expected[key] = base_name_out + "." + ext expected[key + "_md5"] = expected[key] + ".md5" # Get actual @@ -854,8 +858,8 @@ def test_sequenza_step_part_get_log_file_gcreference(somatic_targeted_seq_cnv_ca assert actual == expected -def test_sequenza_step_part_get_input_files_run(somatic_targeted_seq_cnv_calling_workflow): - """Tests SequenzaStepPart.get_input_files() - action 'run'""" +def test_sequenza_step_part_get_input_files_coverage(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_input_files() - action 'coverage'""" wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) expected = { "gc": "work/static_data/out/sequenza.50.wig.gz", @@ -864,58 +868,61 @@ def test_sequenza_step_part_get_input_files_run(somatic_targeted_seq_cnv_calling "tumor_bam": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam", "tumor_bai": "NGS_MAPPING/output/bwa.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1.bam.bai", } - actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("sequenza", "run")(wildcards) + actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("sequenza", "coverage")( + wildcards + ) assert actual == expected -def test_sequenza_step_part_get_output_files_run(somatic_targeted_seq_cnv_calling_workflow): - """Tests SequenzaStepPart.get_output_files() - action 'run'""" +def test_sequenza_step_part_get_output_files_coverage(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_output_files() - action 'coverage'""" + base_name = "{mapper}.sequenza.{library_name}" expected = { - "seqz": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz", - "seqz_md5": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz.md5", + "seqz": f"work/{base_name}/out/{base_name}.seqz.gz", + "seqz_md5": f"work/{base_name}/out/{base_name}.seqz.gz.md5", } - actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("sequenza", "run") + actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("sequenza", "coverage") assert actual == expected -def test_sequenza_step_part_get_log_file_run(somatic_targeted_seq_cnv_calling_workflow): - """Tests SequenzaStepPart.get_log_file() - action 'run'""" - base_name = "work/{mapper}.sequenza.{library_name}/log/{mapper}.sequenza.{library_name}.run" +def test_sequenza_step_part_get_log_file_coverage(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_log_file() - action 'coverage'""" + base_name = ( + "work/{mapper}.sequenza.{library_name}/log/{mapper}.sequenza.{library_name}.coverage" + ) expected = get_expected_log_files_dict(base_out=base_name) - actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("sequenza", "run") + actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("sequenza", "coverage") assert actual == expected -def test_sequenza_step_part_get_input_files_report(somatic_targeted_seq_cnv_calling_workflow): - """Tests SequenzaStepPart.get_input_files() - action 'report'""" +def test_sequenza_step_part_get_input_files_run(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_input_files() - action 'run'""" + wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) expected = { "packages": "work/R_packages/out/sequenza.done", "seqz": "work/{mapper}.sequenza.{library_name}/out/{mapper}.sequenza.{library_name}.seqz.gz", } - actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("sequenza", "report") - assert actual == expected - - -def test_sequenza_step_part_get_output_files_report(somatic_targeted_seq_cnv_calling_workflow): - """Tests SequenzaStepPart.get_output_files() - action 'report'""" - expected = {"done": "work/{mapper}.sequenza.{library_name}/report/.done"} - actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("sequenza", "report") + actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("sequenza", "run")(wildcards) assert actual == expected -def test_sequenza_step_part_get_params_report(somatic_targeted_seq_cnv_calling_workflow): - """Tests SequenzaStepPart.get_params() - action 'report'""" - wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) - expected = "P001-T1-DNA1-WGS1" - actual = somatic_targeted_seq_cnv_calling_workflow.get_params("sequenza", "report")(wildcards) +def test_sequenza_step_part_get_output_files_run(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_output_files() - action 'run'""" + base_name = "{mapper}.sequenza.{library_name}" + expected = { + "seg": f"work/{base_name}/out/{base_name}_dnacopy.seg", + "seg_md5": f"work/{base_name}/out/{base_name}_dnacopy.seg.md5", + "done": f"work/{base_name}/report/.done", + } + actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("sequenza", "run") assert actual == expected -def test_sequenza_step_part_get_log_file_report(somatic_targeted_seq_cnv_calling_workflow): - """Tests SequenzaStepPart.get_log_file() - action 'report'""" - base_name = "work/{mapper}.sequenza.{library_name}/log/{mapper}.sequenza.{library_name}.report" +def test_sequenza_step_part_get_log_file_run(somatic_targeted_seq_cnv_calling_workflow): + """Tests SequenzaStepPart.get_log_file() - action 'run'""" + base_name = "work/{mapper}.sequenza.{library_name}/log/{mapper}.sequenza.{library_name}.run" expected = get_expected_log_files_dict(base_out=base_name) - actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("sequenza", "report") + actual = somatic_targeted_seq_cnv_calling_workflow.get_log_file("sequenza", "run") assert actual == expected @@ -923,7 +930,8 @@ def test_sequenza_step_part_get_resource_usage_call(somatic_targeted_seq_cnv_cal """Tests SequenzaStepPart.get_resource_usage()""" # Define expected expected_dicts = { - "run": {"threads": 4, "time": "24:00:00", "memory": "16G", "partition": "medium"}, + "coverage": {"threads": 1, "time": "24:00:00", "memory": "24G", "partition": "medium"}, + "run": {"threads": 4, "time": "24:00:00", "memory": "64G", "partition": "medium"}, } # Evaluate for action, resources in expected_dicts.items(): @@ -953,9 +961,8 @@ def test_purecn_step_part_get_input_files_coverage(somatic_targeted_seq_cnv_call def test_purecn_step_part_get_output_files_coverage(somatic_targeted_seq_cnv_calling_workflow): """Tests PureCNStepPart.get_output_files() - action 'coverage'""" - expected = { - "coverage": "work/{mapper}.purecn.{library_name}/out/{mapper}.{library_name}_coverage_loess.txt.gz" - } + name_pattern = "{mapper}.purecn.{library_name}" + expected = {"coverage": f"work/{name_pattern}/out/{name_pattern}_coverage_loess.txt.gz"} actual = somatic_targeted_seq_cnv_calling_workflow.get_output_files("purecn", "coverage") assert actual == expected @@ -972,7 +979,7 @@ def test_purecn_step_part_get_input_files_run(somatic_targeted_seq_cnv_calling_w """Tests PureCNStepPart.get_input_files() - action 'run'""" wildcards = Wildcards(fromdict={"mapper": "bwa", "library_name": "P001-T1-DNA1-WGS1"}) expected = { - "tumor": "work/bwa.purecn.P001-T1-DNA1-WGS1/out/bwa.P001-T1-DNA1-WGS1_coverage_loess.txt.gz", + "tumor": "work/bwa.purecn.P001-T1-DNA1-WGS1/out/bwa.purecn.P001-T1-DNA1-WGS1_coverage_loess.txt.gz", "vcf": "SOMATIC_VARIANT_CALLING/output/bwa.mutect2.P001-T1-DNA1-WGS1/out/bwa.mutect2.P001-T1-DNA1-WGS1.full.vcf.gz", } actual = somatic_targeted_seq_cnv_calling_workflow.get_input_files("purecn", "run")(wildcards) @@ -981,7 +988,7 @@ def test_purecn_step_part_get_input_files_run(somatic_targeted_seq_cnv_calling_w def test_purecn_step_part_get_output_files_run(somatic_targeted_seq_cnv_calling_workflow): """Tests PureCNStepPart.get_output_files() - action 'run'""" - base_name = "work/{mapper}.purecn.{library_name}/out/{library_name}" + base_name = "work/{mapper}.purecn.{library_name}/out/{mapper}.purecn.{library_name}" expected = { "segments": base_name + "_dnacopy.seg", "ploidy": base_name + ".csv", @@ -1039,10 +1046,12 @@ def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_call assert actual == expected # Check result file construction + name_pattern = "bwa.{method}.P00{{i}}-T{{t}}-DNA1-WGS1" + # cnvetti tpl = ( - "output/bwa.cnvetti_on_target_coverage.P00{i}-T{t}-DNA1-WGS1/out/" - "bwa.cnvetti_on_target_coverage.P00{i}-T{t}-DNA1-WGS1.{ext}" + f"output/{name_pattern}/out/{name_pattern}".format(method="cnvetti_on_target_coverage") + + ".{ext}" ) expected = [ tpl.format(i=i, t=t, ext=ext) @@ -1050,8 +1059,8 @@ def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_call for ext in ("bcf", "bcf.md5", "bcf.csi", "bcf.csi.md5") ] tpl = ( - "output/bwa.cnvetti_on_target_segment.P00{i}-T{t}-DNA1-WGS1/out/" - "bwa.cnvetti_on_target_segment.P00{i}-T{t}-DNA1-WGS1.{ext}" + f"output/{name_pattern}/out/{name_pattern}".format(method="cnvetti_on_target_segment") + + ".{ext}" ) expected += [ tpl.format(i=i, t=t, ext=ext) @@ -1068,8 +1077,8 @@ def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_call ) ] tpl = ( - "output/bwa.cnvetti_on_target_postprocess.P00{i}-T{t}-DNA1-WGS1/out/" - "bwa.cnvetti_on_target_postprocess.P00{i}-T{t}-DNA1-WGS1_{ext}" + f"output/{name_pattern}/out/{name_pattern}".format(method="cnvetti_on_target_postprocess") + + "_{ext}" ) expected += [ tpl.format(i=i, t=t, ext=ext) @@ -1088,16 +1097,24 @@ def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_call ) ] # cnvkit - tpl = "output/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/out/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1.{ext}{md5}" + tpl = f"output/{name_pattern}/out/{name_pattern}".format(method="cnvkit") + "{ext}{md5}" expected += [ tpl.format(i=i, t=t, ext=ext, md5=md5) for i, t in ((1, 1), (2, 1), (2, 2)) - for ext in ("cnr", "bed.gz", "bed.gz.tbi", "seg", "vcf.gz", "vcf.gz.tbi") + for ext in ( + ".cnr", + "_dnacopy.seg", + ".bed.gz", + ".bed.gz.tbi", + ".seg", + ".vcf.gz", + ".vcf.gz.tbi", + ) for md5 in ("", ".md5") ] tpl = ( - "output/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/report/" - "bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1.{plot}.{ext}{md5}" + f"output/{name_pattern}/report/{name_pattern}".format(method="cnvkit") + + ".{plot}.{ext}{md5}" ) expected += [ tpl.format(i=i, t=t, plot=plot, ext=ext, md5=md5) @@ -1106,8 +1123,8 @@ def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_call for md5 in ("", ".md5") ] tpl = ( - "output/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/report/" - "bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1.{plot}.chr{chrom}.{ext}{md5}" + f"output/{name_pattern}/report/{name_pattern}".format(method="cnvkit") + + ".{plot}.chr{chrom}.{ext}{md5}" ) expected += [ tpl.format(i=i, t=t, plot=plot, ext=ext, chrom=str(chrom), md5=md5) @@ -1117,8 +1134,8 @@ def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_call for md5 in ("", ".md5") ] tpl = ( - "output/bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1/report/" - "bwa.cnvkit.P00{i}-T{t}-DNA1-WGS1.{report}.txt{md5}" + f"output/{name_pattern}/report/{name_pattern}".format(method="cnvkit") + + ".{report}.txt{md5}" ) expected += [ tpl.format(i=i, t=t, report=report, md5=md5) @@ -1127,28 +1144,22 @@ def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_call for md5 in ("", ".md5") ] # copywriter - tpl = ( - "output/bwa.copywriter.P00{i}-T{t}-DNA1-WGS1/out/" - "bwa.copywriter.P00{i}-T{t}-DNA1-WGS1_{ext}" - ) + tpl = f"output/{name_pattern}/out/{name_pattern}".format(method="copywriter") + "_{ext}{md5}" expected += [ - tpl.format(i=i, t=t, ext=ext) + tpl.format(i=i, t=t, ext=ext, md5=md5) for i, t in ((1, 1), (2, 1), (2, 2)) for ext in ( "bins.txt", "gene_call.txt", "gene_log2.txt", "segments.txt", - "bins.txt.md5", - "gene_call.txt.md5", - "gene_log2.txt.md5", - "segments.txt.md5", ) + for md5 in ("", ".md5") ] # purecn - tpl = "output/bwa.purecn.P00{i}-T{t}-DNA1-WGS1/out/P00{i}-T{t}-DNA1-WGS1{ext}{checksum}" + tpl = f"output/{name_pattern}/out/{name_pattern}".format(method="purecn") + "{ext}{md5}" expected += [ - tpl.format(i=i, t=t, ext=ext, checksum=checksum) + tpl.format(i=i, t=t, ext=ext, md5=md5) for i, t in ((1, 1), (2, 1), (2, 2)) for ext in ( ".csv", @@ -1158,18 +1169,18 @@ def test_somatic_targeted_seq_cnv_calling_workflow(somatic_targeted_seq_cnv_call "_amplification_pvalues.csv", "_loh.csv", ) - for checksum in ("", ".md5") + for md5 in ("", ".md5") ] # sequenza - tpl = ( - "output/bwa.sequenza.P00{i}-T{t}-DNA1-WGS1/out/" - "bwa.sequenza.P00{i}-T{t}-DNA1-WGS1.seqz.gz{checksum}" - ) + tpl = f"output/{name_pattern}/out/{name_pattern}".format(method="sequenza") + "{ext}{md5}" expected += [ - tpl.format(i=i, t=t, checksum=checksum) + tpl.format(i=i, t=t, ext=ext, md5=md5) for i, t in ((1, 1), (2, 1), (2, 2)) - for checksum in ("", ".md5") + for ext in ("_dnacopy.seg", ".seqz.gz") + for md5 in ("", ".md5") ] + tpl = f"output/{name_pattern}/report/.done".format(method="sequenza") + expected += [tpl.format(i=i, t=t) for i, t in ((1, 1), (2, 1), (2, 2))] expected = list(sorted(expected)) actual = list(sorted(somatic_targeted_seq_cnv_calling_workflow.get_result_files())) # HACK TODO diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_annotation.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_annotation.py index d6f0731d8..78eba204d 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_annotation.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_annotation.py @@ -113,8 +113,8 @@ def test_jannovar_step_part_get_input_files(somatic_variant_annotation_workflow) def test_jannovar_step_part_get_output_files(somatic_variant_annotation_workflow): """Tests JannovarAnnotateSomaticVcfStepPart.get_output_files()""" base_out = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.{tumor_library}/out/" - "{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.{tumor_library}" + "work/{mapper}.{var_caller}.jannovar.{tumor_library}/out/" + "{mapper}.{var_caller}.jannovar.{tumor_library}" ) expected = get_expected_output_vcf_files_dict(base_out=base_out) actual = somatic_variant_annotation_workflow.get_output_files( @@ -126,8 +126,8 @@ def test_jannovar_step_part_get_output_files(somatic_variant_annotation_workflow def test_jannovar_step_part_get_log_file(somatic_variant_annotation_workflow): """Tests JannovarAnnotateSomaticVcfStepPart.get_output_files()""" base_out = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.{tumor_library}/log/" - "{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.{tumor_library}" + "work/{mapper}.{var_caller}.jannovar.{tumor_library}/log/" + "{mapper}.{var_caller}.jannovar.{tumor_library}" ) expected = get_expected_log_files_dict(base_out=base_out) actual = somatic_variant_annotation_workflow.get_log_file("jannovar", "annotate_somatic_vcf") @@ -240,7 +240,7 @@ def test_somatic_variant_annotation_workflow(somatic_variant_annotation_workflow for ext in ("vcf.gz", "vcf.gz.md5", "vcf.gz.tbi", "vcf.gz.tbi.md5") for mapper in ("bwa",) for var_caller in ("mutect", "scalpel") - for annotator in ("jannovar_annotate_somatic_vcf", "vep") + for annotator in ("jannovar", "vep") ] expected += [ tpl.format( @@ -267,7 +267,7 @@ def test_somatic_variant_annotation_workflow(somatic_variant_annotation_workflow ) for mapper in ("bwa",) for var_caller in ("mutect", "scalpel") - for annotator in ("jannovar_annotate_somatic_vcf", "vep") + for annotator in ("jannovar", "vep") ] expected = list(sorted(expected)) actual = list(sorted(somatic_variant_annotation_workflow.get_result_files())) diff --git a/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_filtration.py b/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_filtration.py index d8dfabe72..200f25651 100644 --- a/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_filtration.py +++ b/tests/snappy_pipeline/workflows/test_workflows_somatic_variant_filtration.py @@ -34,6 +34,7 @@ def minimal_config(): somatic_variant_filtration: tools_ngs_mapping: ['bwa'] tools_somatic_variant_calling: ['mutect2'] + tools_somatic_variant_annotation: ['jannovar'] data_sets: first_batch: @@ -82,8 +83,8 @@ def test_dkfz_bias_filter_step_part_get_input_files(somatic_variant_filtration_w """Tests DkfzBiasFilterStepPart.get_input_files()""" somatic_base_out = ( "SOMATIC_VARIANT_ANNOTATION/output/" - "{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.{tumor_library}/out/" - "{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.{tumor_library}" + "{mapper}.{var_caller}.{annotator}.{tumor_library}/out/" + "{mapper}.{var_caller}.{annotator}.{tumor_library}" ) expected = { "vcf": somatic_base_out + ".vcf.gz", @@ -98,8 +99,8 @@ def test_dkfz_bias_filter_step_part_get_input_files(somatic_variant_filtration_w def test_dkfz_bias_filter_step_part_get_output_files(somatic_variant_filtration_workflow): """Tests DkfzBiasFilterStepPart.get_output_files()""" base_out = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter." - "{tumor_library,[^\\.]+}/out/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." + "work/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter." + "{tumor_library,[^\\.]+}/out/{mapper}.{var_caller}.{annotator}." "dkfz_bias_filter.{tumor_library}" ) expected = get_expected_output_vcf_files_dict(base_out=base_out) @@ -110,8 +111,8 @@ def test_dkfz_bias_filter_step_part_get_output_files(somatic_variant_filtration_ def test_dkfz_bias_filter_step_part_get_log_file(somatic_variant_filtration_workflow): """Tests DkfzBiasFilterStepPart.get_log_file()""" base_out = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter.{tumor_library}/" - "log/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter.{tumor_library}" + "work/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter.{tumor_library}/" + "log/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter.{tumor_library}" ) expected = get_expected_log_files_dict(base_out=base_out) actual = somatic_variant_filtration_workflow.get_log_file("dkfz_bias_filter", "run") @@ -137,11 +138,16 @@ def test_dkfz_bias_filter_step_part_get_resource_usage(somatic_variant_filtratio def test_eb_filter_step_part_get_input_files_run(somatic_variant_filtration_workflow): """Tests EbFilterStepPart._get_input_files_run()""" wildcards = Wildcards( - fromdict={"mapper": "bwa", "var_caller": "mutect2", "tumor_library": "P001-T1-DNA1-WGS1"} + fromdict={ + "mapper": "bwa", + "var_caller": "mutect2", + "annotator": "jannovar", + "tumor_library": "P001-T1-DNA1-WGS1", + } ) base_out = ( - "work/bwa.mutect2.jannovar_annotate_somatic_vcf.dkfz_bias_filter.P001-T1-DNA1-WGS1/out/" - "bwa.mutect2.jannovar_annotate_somatic_vcf.dkfz_bias_filter.P001-T1-DNA1-WGS1" + "work/bwa.mutect2.jannovar.dkfz_bias_filter.P001-T1-DNA1-WGS1/out/" + "bwa.mutect2.jannovar.dkfz_bias_filter.P001-T1-DNA1-WGS1" ) expected = { "vcf": base_out + ".vcf.gz", @@ -177,8 +183,8 @@ def test_eb_filter_step_part_get_input_files_write_panel(somatic_variant_filtrat def test_eb_filter_step_part_get_output_files_run(somatic_variant_filtration_workflow): """Tests EbFilterStepPart._get_output_files_run()""" base_out = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter." - "eb_filter.{tumor_library,[^\\.]+}/out/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." + "work/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter." + "eb_filter.{tumor_library,[^\\.]+}/out/{mapper}.{var_caller}.{annotator}." "dkfz_bias_filter.eb_filter.{tumor_library}" ) expected = get_expected_output_vcf_files_dict(base_out=base_out) @@ -200,8 +206,8 @@ def test_eb_filter_step_part_get_output_files_write_panel(somatic_variant_filtra def test_eb_eb_filter_step_part_get_log_file_run(somatic_variant_filtration_workflow): """Tests EbFilterStepPart._get_log_file_run()""" base_out = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." - "{tumor_library}/log/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter." + "work/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter.eb_filter." + "{tumor_library}/log/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter." "eb_filter.{tumor_library}" ) expected = get_expected_log_files_dict(base_out=base_out) @@ -236,8 +242,8 @@ def test_eb_filter_step_part_get_resource_usage(somatic_variant_filtration_workf def test_apply_filters_step_part_get_input_files(somatic_variant_filtration_workflow): """Tests ApplyFiltersStepPart.get_input_files()""" base_out = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." - "{tumor_library}/out/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." + "work/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter.eb_filter." + "{tumor_library}/out/{mapper}.{var_caller}.{annotator}." "dkfz_bias_filter.eb_filter.{tumor_library}" ) expected = { @@ -251,9 +257,9 @@ def test_apply_filters_step_part_get_input_files(somatic_variant_filtration_work def test_apply_filters_step_part_get_output_files(somatic_variant_filtration_workflow): """Tests ApplyFiltersStepPart.get_output_files()""" base_out = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." + "work/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter.eb_filter." "{tumor_library}.{filter_set}.genome_wide/out/{mapper}.{var_caller}." - "jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." + "{annotator}.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." "genome_wide" ) expected = get_expected_output_vcf_files_dict(base_out=base_out) @@ -264,9 +270,9 @@ def test_apply_filters_step_part_get_output_files(somatic_variant_filtration_wor def test_apply_filters_step_part_get_log_file(somatic_variant_filtration_workflow): """Tests ApplyFiltersStepPart.get_log_file()""" expected = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." + "work/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter.eb_filter." "{tumor_library}.{filter_set}.genome_wide/log/{mapper}.{var_caller}." - "jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." + "{annotator}.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." "genome_wide.log" ) actual = somatic_variant_filtration_workflow.get_log_file("apply_filters", "run") @@ -299,8 +305,8 @@ def test_apply_filters_step_part_get_resource_usage(somatic_variant_filtration_w # } # ) # base_out = ( -# "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." -# "{tumor_library}/out/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf." +# "work/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter.eb_filter." +# "{tumor_library}/out/{mapper}.{var_caller}.{annotator}." # "dkfz_bias_filter.eb_filter.{tumor_library}" # ) # expected = { @@ -315,9 +321,9 @@ def test_apply_filters_step_part_get_resource_usage(somatic_variant_filtration_w def test_filter_to_exons_step_part_get_output_files(somatic_variant_filtration_workflow): """Tests FilterToExonsStepPart.get_output_files()""" base_out = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." + "work/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter.eb_filter." "{tumor_library}.{filter_set}.{exon_list}/out/{mapper}.{var_caller}." - "jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." + "{annotator}.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." "{exon_list}" ) expected = get_expected_output_vcf_files_dict(base_out=base_out) @@ -328,9 +334,9 @@ def test_filter_to_exons_step_part_get_output_files(somatic_variant_filtration_w def test_filter_to_exons_step_part_get_log_file(somatic_variant_filtration_workflow): """Tests FilterToExonsStepPart.get_log_file()""" expected = ( - "work/{mapper}.{var_caller}.jannovar_annotate_somatic_vcf.dkfz_bias_filter." + "work/{mapper}.{var_caller}.{annotator}.dkfz_bias_filter." "eb_filter.{tumor_library}.{filter_set}.{exon_list}/log/{mapper}.{var_caller}." - "jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." + "{annotator}.dkfz_bias_filter.eb_filter.{tumor_library}.{filter_set}." "{exon_list}.log" ) actual = somatic_variant_filtration_workflow.get_log_file("filter_to_exons", "run") @@ -362,9 +368,9 @@ def test_somatic_variant_filtration_workflow(somatic_variant_filtration_workflow # Check result file construction tpl = ( - "output/bwa.mutect2.jannovar_annotate_somatic_vcf.dkfz_bias_filter." + "output/bwa.mutect2.jannovar.dkfz_bias_filter." "eb_filter.P00{i}-T{t}-DNA1-WGS1.{filter}/out/" - "bwa.mutect2.jannovar_annotate_somatic_vcf.dkfz_bias_filter.eb_filter." + "bwa.mutect2.jannovar.dkfz_bias_filter.eb_filter." "P00{i}-T{t}-DNA1-WGS1.{filter}.{ext}" ) expected = [ diff --git a/tests/snappy_wrappers/wrappers/data/mutect2_par_run.snakemake b/tests/snappy_wrappers/wrappers/data/mutect2_par_run.snakemake index 558131679..795c0b5c0 100644 --- a/tests/snappy_wrappers/wrappers/data/mutect2_par_run.snakemake +++ b/tests/snappy_wrappers/wrappers/data/mutect2_par_run.snakemake @@ -97,7 +97,7 @@ def resource_chunk_memory(wildcards, attempt): def resource_chunk_time(wildcards, attempt): '''Return the time to use for running one chunk.''' - return multiply_time('3:00:00', attempt) + return multiply_time('12:00:00', attempt) rule all: diff --git a/tests/snappy_wrappers/wrappers/test_install_R_package.py b/tests/snappy_wrappers/wrappers/test_install_R_package.py new file mode 100644 index 000000000..8b6155f5b --- /dev/null +++ b/tests/snappy_wrappers/wrappers/test_install_R_package.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +"""Code for testing the R package installation helper function""" + +from snappy_wrappers.utils import install_R_package + + +def test_install_R_package(mocker, fp): + """Tests install_R_package""" + mocker.patch("snappy_wrappers.utils.os.makedirs", return_value=True) + packages = [ + { + "name": "cran", + "repo": "cran", + "install": "install.packages('{}', lib='/path/to/lib', update=FALSE, ask=FALSE)", + "check": "find.package('cran', lib.loc='/path/to/lib', quiet=FALSE, verbose=TRUE)", + }, + { + "name": "bioc", + "repo": "bioconductor", + "install": "BiocManager::install('{}', lib='/path/to/lib', update=FALSE, ask=FALSE)", + "check": "find.package('bioc', lib.loc='/path/to/lib', quiet=FALSE, verbose=TRUE)", + }, + { + "name": "username/package/subdir@*rel.ea.se", + "repo": "github", + "install": "remotes::install_github('{}', lib='/path/to/lib', upgrade='never')", + "check": "find.package('package', lib.loc='/path/to/lib', quiet=FALSE, verbose=TRUE)", + }, + { + "name": "username/package/subdir@ref", + "repo": "bitbucket", + "install": "remotes::install_bitbucket('{}', lib='/path/to/lib', upgrade='never')", + "check": "find.package('package', lib.loc='/path/to/lib', quiet=FALSE, verbose=TRUE)", + }, + { + "name": "/path/to/package.tar.gz", + "repo": "local", + "install": "remotes::install_local('{}', lib='/path/to/lib', upgrade='never')", + "check": "find.package('package', lib.loc='/path/to/lib', quiet=FALSE, verbose=TRUE)", + }, + ] + for package in packages: + script = "; ".join( + [ + package["install"].format(package["name"]), + "status <- try({})".format(package["check"]), + "status <- ifelse(is(status, 'try-error'), 1, 0)", + "quit(save='no', status=status, runLast=FALSE)", + ] + ) + fp.register_subprocess(["R", "--vanilla", "-e", script], stdout="") + install_R_package(dest="/path/to/lib", name=package["name"], repo=package["repo"]) diff --git a/tests/snappy_wrappers/wrappers/test_mutect2_par_run.py b/tests/snappy_wrappers/wrappers/test_mutect2_par_run.py index 023e51bcd..8c4eec0c3 100644 --- a/tests/snappy_wrappers/wrappers/test_mutect2_par_run.py +++ b/tests/snappy_wrappers/wrappers/test_mutect2_par_run.py @@ -283,11 +283,11 @@ def test_mutect2_wrapper_run_preamble_resource_chunk_time(construct_preamble_mod """ # Define (input, expected) pair input_expected_pairs = ( - (1, "0-03:00:00"), - (2, "0-06:00:00"), - (3, "0-09:00:00"), - (4, "0-12:00:00"), - (5, "0-15:00:00"), + (1, "0-12:00:00"), + (2, "1-00:00:00"), + (3, "1-12:00:00"), + (4, "2-00:00:00"), + (5, "2-12:00:00"), ) # Test all pairs for pair in input_expected_pairs: