diff --git a/code/SoS/molecular_phenotypes/calling/splicing_calling_leafcutter2.ipynb b/code/SoS/molecular_phenotypes/calling/splicing_calling_leafcutter2.ipynb new file mode 100644 index 000000000..b6d1ae9d0 --- /dev/null +++ b/code/SoS/molecular_phenotypes/calling/splicing_calling_leafcutter2.ipynb @@ -0,0 +1,1172 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "# Quantifying alternative splicing with LeafCutter2\n", + "\n", + "Quantifies alternative splicing from aligned RNA-seq with LeafCutter2, producing intron-usage tables in which every junction carries a productive or unproductive label, and tests for differential splicing between two groups." + ], + "id": "cdea348a" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "## Overview\n", + "\n", + "This module turns aligned RNA-seq into splicing phenotypes, as `splicing_calling` does, but replaces LeafCutter with LeafCutter2 and adds a functional label to every junction. It expects BAM files already mapped with STAR using the WASP option, following the [GTEx/TOPMed RNA-seq pipeline](https://github.com/broadinstitute/gtex-pipeline/blob/master/TOPMed_RNAseq_pipeline.md).\n", + "\n", + "Splicing is quantified as alternatively excised intron usage: junctions sharing a splice site are grouped into clusters and each intron is reported as a fraction of the reads in its cluster, so skipped exons, alternative 5-prime and 3-prime splice site usage and more complex events are captured by one measure without naming the event type [Li et al. (2018)](https://doi.org/10.1038/s41588-017-0004-9).\n", + "\n", + "What LeafCutter2 adds is classification. A dynamic programming pass over the clusters reads each junction against the annotated coding sequence and asks whether the transcript it implies stays in frame to a stop codon: junctions are labelled `PR` (productive, protein-coding), `UP` (unproductive, premature stop and so a nonsense-mediated decay target), `NE` (neither: a junction in a gene with no protein-coding transcript) or `IN` (not evaluated: the default for any junction the classifier did not assess; the code calls it intergenic, but it also covers junctions inside genes the classifier skipped). The label is appended to the intron ID, so `chr10:134786:179993:clu_1_+:PR` carries chromosome, intron, cluster and function in one key ([Dai et al., 2025](https://doi.org/10.1101/2025.04.06.646893)). Unproductive splicing is the quantity of interest wherever a splicing factor is suspected of losing control of cryptic exons.\n", + "\n", + "- `leafcutter2` extracts junctions from each BAM with regtools, then clusters, classifies and quantifies them.\n", + "- `leafcutter2_preprocessing` is the first half of `leafcutter2`, stopping once the list of per-sample `.junc` files is written. Run it only when the clustering happens elsewhere.\n", + "- `leafcutter2_cluster` starts from an existing list of junction files and does the clustering, classification and quantification alone. It is the entry point when junctions were extracted by another pipeline.\n", + "- `star2junc` converts STAR `SJ.out.tab` files into the junction BED format LeafCutter2 reads, for cohorts where the BAMs are no longer available.\n", + "- `differential_splicing` tests every cluster for a change in intron usage between two groups with LeafCutter's `leafcutter_ds.R`, adjusting for covariates.\n", + "\n", + "`leafcutter2` and `leafcutter2_preprocessing` share their first step. `leafcutter2_cluster` is an alternative entry point to the second step, not a stage that follows it. `differential_splicing` follows either clustering entry point and reads its LeafCutter1-format count table.\n", + "\n", + "Differential splicing is tested with a Dirichlet-multinomial model fitted to each cluster on its own, so `differential_splicing` splits the count table by chromosome, tests the 24 parts (1-22, X, and everything else) as separate jobs, and joins the results. Only the false discovery rate needs every cluster at once; it is recomputed over the joined table with the Benjamini-Hochberg method, so the result is the same as one unsplit run ([Li et al., 2018](https://doi.org/10.1038/s41588-017-0004-9)).\n", + "\n", + "**When to run it.** After STAR alignment, and before `splicing_normalization`, in place of `splicing_calling`. Run `differential_splicing` after clustering when the question is a comparison of two groups rather than QTL mapping." + ], + "id": "ad335dc6" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "## Input\n", + "\n", + "- `--samples` **`tests/fixtures/splicing_calling/leafcutter/protocol_example.sample_list.txt`**\n", + "(the sample manifest, tab delimited with a header, shared with `splicing_calling`. `coord_bam_list` is the column read for BAM paths; `SJ_list` is read only by `star2junc`. Strandness is `rf`, `fr`, or `strand_missing`. Output files take their prefix from this filename with all extensions stripped, so this manifest produces `protocol_example.*`; override it with `--output-prefix`.)\n", + "\n", + "```\n", + "sample_id\tstrand\tcoord_bam_list\tSJ_list\n", + "SAMPLE_001\trf\tSAMPLE_001.Aligned.sortedByCoord.out.bam\tSAMPLE_001.SJ.out.tab\n", + "SAMPLE_002\trf\tSAMPLE_002.Aligned.sortedByCoord.out.bam\tSAMPLE_002.SJ.out.tab\n", + "```\n", + "\n", + "The `SJ.out.tab` files this manifest names are shipped, so `star2junc` runs as written; the junction files it pairs with are shipped too, so `leafcutter2_cluster` does as well. The BAMs are not in the repository — supply them through `--data-dir` to run `leafcutter2` or `leafcutter2_preprocessing` from this manifest, or use the BAM manifest below.\n", + "\n", + "- `--samples` **`tests/fixtures/splicing_calling/leafcutter/protocol_example.bam_list.txt`**\n", + "(a second manifest for the workflows that start from BAMs, naming the one alignment the repository ships. Its strandness is `XS`, the mode `regtools` infers from the BAM's own tags, because this fixture carries no library strand information.)\n", + "\n", + "```\n", + "sample_id\tstrand\tcoord_bam_list\tSJ_list\n", + "SAMPLE_001\tXS\tprotocol_example.chr22_16M_17M.bam\tNA\n", + "```\n", + "\n", + "That BAM is `tests/fixtures/phenotype_formatting/protocol_example.chr22_16M_17M.bam`, the chr22:16M-17M alignment the repository's own `splicing_calling` tests use, and the one the shipped `.junc` fixtures were extracted from. Junction files are named after the BAM rather than the `sample_id`, so it produces `protocol_example.chr22_16M_17M.junc`.\n", + "\n", + "* `--data-dir` -- directory holding the files named in the manifest; defaults to the directory containing `--samples`.\n", + "* `--cwd` -- output directory, default `output`.\n", + "* `--container` -- default empty. LeafCutter2 is installed into the pixi environment rather than distributed as an image, so this module runs without a container unless one is supplied.\n", + "\n", + "**LeafCutter2 2.0 or newer is required.** The 2.x package restructured the code into `leafcutter2/` with `classifier.py` and a `cli.py` entry point, and added the `leafcutter2-star2junc` command that `star2junc` calls. Pre-2.0 builds ship the original repository scripts (`Transcript_tools.py`, `ForwardSpliceJunctionClassifier.py`) with no package metadata, and their classification step fails.\n", + "\n", + "Check by whether `leafcutter2-star2junc` is on `PATH`, not by the version string: packaged builds do not always carry the upstream version. The `dnachun` conda build is labelled `1.0.1` but ships 2.0.1, so a version comparison alone would wrongly reject it.\n", + "\n", + "`pixi global install leafcutter2` installs it. LeafCutter2 is not published on PyPI, so `pip install leafcutter2` fails; to install from source use `pip install git+https://github.com/leafcutter2/leafcutter2.git`, or put that URL in a project manifest's `[pypi-dependencies]`.\n", + "\n", + "Junction extraction (`leafcutter2`, `leafcutter2_preprocessing`):\n", + "\n", + "* `--anchor-len` -- minimum anchor length on each side of a junction, default `8`.\n", + "* `--min-intron-len` -- shortest intron considered, default `50`.\n", + "* `--max-intron-len` -- longest intron considered, default `500000`.\n", + "* `--min-mapq` -- minimum mapping quality of a read before its junctions are counted, default `0` (no filter). regtools counts every alignment of a read, so a read that maps to several places adds support at each of them, and in repeated gene families this can create junctions that are not really there. STAR gives uniquely mapped reads a mapping quality of `255` and multimappers `3` or less, so `--min-mapq 255` keeps unique reads only.\n", + "\n", + "Clustering, classification and quantification (`leafcutter2`, `leafcutter2_cluster`):\n", + "\n", + "* `--annotation-gtf` **`reference_data/Homo_sapiens.GRCh38.103.chr.reformatted.ERCC.gtf`**\n", + "(GTF carrying `gene`, `transcript`, `CDS`, `start_codon` and `stop_codon` features. Classification reads the coding sequence from it, so a GTF without start and stop codons will not do.)\n", + "\n", + "* `--genome-fasta` **`reference_data/GRCh38_full_analysis_set_plus_decoy_hla.noALT_noHLA_noDecoy_ERCC.fasta`**\n", + "(genome assembly matching the GTF, with a `.fai` index beside it)\n", + "\n", + "- `--juncfiles` **`tests/fixtures/splicing_calling/leafcutter/protocol_example.junction_files.txt`**\n", + "(`leafcutter2_cluster` only: one junction file path per line)\n", + "\n", + "```\n", + "tests/fixtures/splicing_calling/leafcutter/SAMPLE_001.junc.gz\n", + "tests/fixtures/splicing_calling/leafcutter/SAMPLE_002.junc.gz\n", + "```\n", + "\n", + "* `--min-clu-reads` -- minimum reads in a cluster, default `30`.\n", + "* `--min-reads` -- minimum reads for a junction to be considered, default `5`.\n", + "* `--min-clu-ratio` -- minimum fraction of cluster reads supporting a junction, default `0.001`.\n", + "* `--min-read-std` -- minimum standard deviation of reads across samples, default `0.5`.\n", + "* `--max-intron-len` -- longest intron clustered, default `500000`.\n", + "* `--offset` -- coordinate offset. Defaults to `1` in `leafcutter2`; **required, with no default, in `leafcutter2_cluster`**. See below.\n", + "* `--output-prefix` -- prefix for every output file, default the `--samples` name with all extensions stripped. Set it when two workflows write into one `--cwd`, or when the manifest name carries dots that are not extensions.\n", + "\n", + "`--max-intron-len` is `500000` here against a LeafCutter2 default of `100000`. The larger value is the GTEx sQTL discovery default used throughout this protocol, and the one `splicing_calling` applies. Leaving it at `100000` silently discards every intron above that length, so the two pipelines would no longer be comparable. The reason for the larger value is protocol compatibility, not a claim about where cryptic exons occur.\n", + "\n", + "`--offset` depends on the junction file format, and getting it wrong corrupts the classification rather than failing loudly.\n", + "\n", + "Junction files come in two shapes. regtools `.junc` is BED12, with the anchor blocks in columns 11 and 12; the BED6 form written by `star2junc`, and used by LeafCutter2's own example data, carries intron coordinates directly. The two need different offsets:\n", + "\n", + "| Input | Offset | Evidence |\n", + "| --- | --- | --- |\n", + "| regtools `.junc` (BED12) | `1` | Clustering the repository's two junction fixtures gives no intron shared with `leafcutter_cluster_regtools.R` at offset `0`, and exact agreement on all six at offset `1`. |\n", + "| BED6, including `star2junc` output | `0` | LeafCutter2's twelve-sample chr10 example classifies 2,324 `PR` / 345 `UP` / 236 `NE` / 125 `IN` at offset `0`, with intron IDs matching the published ones. At offset `1` the same data gives 505 / 1,261 / 1,138 / 125. Confirmed on three whole-transcriptome brain samples against Ensembl 108: 55,248 junctions, 68% `PR`. |\n", + "\n", + "`leafcutter2` defaults to `1`, because its junctions always come from regtools via `leafcutter2_1`, so the format is known.\n", + "\n", + "`leafcutter2_cluster` has no default and will not run without `--offset`. Its junction list comes from outside the module, so neither value is safe to assume: a default would be wrong roughly half the time and wrong silently. Pass `0` for BED6, `1` for regtools `.junc`, as the minimal working example does.\n", + "\n", + "The step rejects a junction list that mixes the two formats, since one offset cannot suit both. Beyond that, an offset error is silent: the symptom is a collapse in the productive fraction, because shifted coordinates no longer meet the annotated splice sites. Check the `PR` share before trusting a run.\n", + "\n", + "The GTF and FASTA are not in the repository; both are built by [`reference_data_preparation`](https://github.com/statfungen/xqtl-protocol/blob/main/code/reference_data/reference_data_preparation.ipynb) and are the same pair `RNA_calling` and `bulk_expression_normalization` use. Chromosome names must match across the junction files, the GTF and the FASTA. This pair is `chr`-prefixed, so junctions called against a bare-numbered assembly will not classify; the clustering steps check the two naming styles agree before starting and stop if they do not.\n", + "\n", + "Differential splicing (`differential_splicing`):\n", + "\n", + "- `--counts` **`output/leafcutter2/leafcutter1_files/protocol_example_perind_numers.counts.gz`**\n", + "(the LeafCutter1-format intron counts written by `leafcutter2_2` or `leafcutter2_cluster`. The header holds the sample names only; each row is an intron and its read count in each sample. The preview is the repository's `expected_perind_numers.counts.gz`, which has the same layout.)\n", + "\n", + "```\n", + "SAMPLE_001 SAMPLE_002\n", + "chr22:12314919:12319407:clu_1_- 31 23\n", + "chr22:12314919:12351352:clu_1_- 25 0\n", + "```\n", + "\n", + "- `--groups` **``**\n", + "(space or tab delimited, no header. Column 1 is the sample name, which must match a column name in `--counts`: the junction file base name, not the manifest `sample_id`. Column 2 is the group; exactly two groups are compared, and the second group named is compared against the first. Further columns are covariates. Numeric columns are treated as continuous, so code a categorical covariate as text, for example `batch1` rather than `1`. Samples missing from this file are left out of the test. No groups file ships with the repository.)\n", + "\n", + "* `--min-samples-per-intron` -- ignore introns with reads in fewer samples than this, default `5`.\n", + "* `--min-samples-per-group` -- samples per group that need `--min-coverage` reads in a cluster for it to be tested, default `3`.\n", + "* `--min-coverage` -- reads a cluster needs in each of those samples, default `20`.\n", + "* `--timeout` -- seconds allowed for one cluster's model fit, default `30`.\n", + "* `--output-prefix` -- prefix for the output files, default the `--groups` name without its extension.\n", + "\n", + "`leafcutter_ds.R` needs R with the `leafcutter` package, which the pixi environment does not provide. Supply an image that has it with `--container`, such as the tool image `splicing_calling` uses. Each of the 24 parts is one job, and `--numThreads`, `--walltime` and `--mem` apply to each part; the largest chromosomes take the longest.\n", + "\n", + "Runtime:\n", + "\n", + "* `--numThreads`, `--job-size`, `--walltime`, `--mem` -- threads (default `8`) and cluster resources.\n", + "* `--modular-script-dir` -- location of the shell drivers, default `code/script`." + ], + "id": "6dcc2f7f" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "## Output\n", + "\n", + "- **`output/leafcutter2/SAMPLE_001.junc`** (`leafcutter2_1`)\n", + "(per-sample junctions extracted from the BAM by regtools, BED12 with the anchor blocks in columns 11 and 12)\n", + "\n", + "- **`output/leafcutter2/protocol_example.junction_counts.gz`** (`leafcutter2_2`, `leafcutter2_cluster`)\n", + "(one row per junction, keyed `chrom:start:end:clu_N_strand:CLASS`, giving raw supporting-read counts per sample. This is the table LeafCutter's R differential tools read.)\n", + "\n", + "```\n", + "chrom SAMPLE_001 SAMPLE_002\n", + "chr22:12314919:12319407:clu_1_-:IN 31 23\n", + "chr22:12314919:12351352:clu_1_-:IN 25 0\n", + "chr22:28168701:28196318:clu_2_-:UP 11 6\n", + "```\n", + "\n", + "- **`output/leafcutter2/protocol_example.cluster_ratios.gz`** (`leafcutter2_2`, `leafcutter2_cluster`)\n", + "(the same rows as `numerator/denominator` strings, the junction's reads over its cluster's reads)\n", + "\n", + "```\n", + "chrom SAMPLE_001 SAMPLE_002\n", + "chr22:12314919:12319407:clu_1_-:IN 31/56 23/23\n", + "chr22:12314919:12351352:clu_1_-:IN 25/56 0/23\n", + "```\n", + "\n", + "- **`output/leafcutter2/clustering/protocol_example_clusters`** (`leafcutter2_2`, `leafcutter2_cluster`)\n", + "(the intron cluster definitions, one cluster per line as `start:end:reads`. Passing this back through the tool's `--cluster` flag skips clustering on a repeat run.)\n", + "\n", + "```\n", + "chr22:- 12314919:12319407:54 12314919:12351352:25\n", + "chr22:- 28168701:28196318:17 28168701:28214161:15\n", + "```\n", + "\n", + "- **`output/leafcutter2/clustering/protocol_example_junction_classifications.txt`** (`leafcutter2_2`, `leafcutter2_cluster`)\n", + "(the classification table the `:CLASS` label is derived from. `Gene_name` carries whatever the GTF's `gene_name` tag holds, which in the protocol's reformatted annotation is the Ensembl gene ID.)\n", + "\n", + "```\n", + "Gene_name\tIntron_coord\tStrand\tAnnot\tCoding\tUTR\tGencodePC\n", + "ENSG00000100154\tchr22:28629830-28679621\t-\tTrue\tTrue\tFalse\tTrue\n", + "ENSG00000100154\tchr22:28306643-28629551\t-\tTrue\tTrue\tFalse\tTrue\n", + "```\n", + "\n", + "- **`output/leafcutter2/clustering/protocol_example_exon_stats.txt`** (`leafcutter2_2`, `leafcutter2_cluster`)\n", + "(per-exon counts from the classification pass)\n", + "\n", + "- **`output/leafcutter2/clustering/protocol_example_lowusage_introns`** (`leafcutter2_2`, `leafcutter2_cluster`)\n", + "(introns dropped for falling below `--min-clu-ratio`)\n", + "\n", + "- **`output/leafcutter2/clustering/protocol_example_nuc_rule_distances.txt`** (`leafcutter2_2`, `leafcutter2_cluster`)\n", + "(distances used by the 50-nucleotide NMD rule)\n", + "\n", + "- **`output/leafcutter2/clustering/protocol_example_long_exon_distances.txt`** (`leafcutter2_2`, `leafcutter2_cluster`)\n", + "(distances used by the long-final-exon exception to that rule)\n", + "\n", + "Names under `clustering/` and `leafcutter1_files/` are LeafCutter2's own, built by appending an underscore and a suffix to `--outprefix`; this module cannot change them. The files it names itself use a dot.\n", + "\n", + "- **`output/leafcutter2/leafcutter1_files/protocol_example_perind.counts.gz`** (`leafcutter2_2`, `leafcutter2_cluster`)\n", + "(LeafCutter1-format cluster ratios without the class label, written because this module always passes `--keepleafcutter1`. It lets the original `leafcutter_ds.R` run on LeafCutter2 clusters.)\n", + "\n", + "- **`output/leafcutter2/leafcutter1_files/protocol_example_perind_numers.counts.gz`** (`leafcutter2_2`, `leafcutter2_cluster`)\n", + "(the matching LeafCutter1-format numerator table)\n", + "\n", + "- **`output/leafcutter2/protocol_example.intron_usage_perind.junc`** (`leafcutter2_preprocessing_2`)\n", + "(the list of per-sample `.junc` files, one path per line)\n", + "\n", + "- **`output/leafcutter2/SAMPLE_001.SJ.out.junc.gz`** (`star2junc`)\n", + "(BED6 junctions converted from a STAR `SJ.out.tab`, read counts in column 5. The name comes from the `SJ.out.tab` it was converted from.)\n", + "\n", + "```\n", + "chr22 12314919 12319407 . 31 -\n", + "chr22 28168701 28196318 . 11 -\n", + "```\n", + "\n", + "- **`output/leafcutter2/_parts/.part_1.counts.gz`** (`differential_splicing_1`)\n", + "(the `--counts` table split by chromosome, one file for each of `1` to `22`, `X` and `other`, each with the original header. `` is `--output-prefix`. A chromosome with no clusters gets a header-only file.)\n", + "\n", + "- **`output/leafcutter2/_parts/.part_1_cluster_significance.txt`** and **`output/leafcutter2/_parts/.part_1_effect_sizes.txt`** (`differential_splicing_2`)\n", + "(`leafcutter_ds.R` results for one part. Their `p.adjust` column is corrected within that part only and is superseded by the joined files below. A part with no clusters leaves both files empty.)\n", + "\n", + "- **`output/leafcutter2/_cluster_significance.txt`** (`differential_splicing_3`)\n", + "(one row per cluster. `status` is `Success` when the cluster was tested and otherwise names the filter that removed it; `loglr` and `df` are the likelihood-ratio statistic and its degrees of freedom; `p` is the p-value; `p.adjust` is the Benjamini-Hochberg false discovery rate over every tested cluster. No `differential_splicing` run ships with the repository; the rows below are from a 200-sample cohort run, filtered to tested clusters.)\n", + "\n", + "```\n", + "status\tloglr\tdf\tp\tcluster\tp.adjust\n", + "Success\t1.3909991384935\t3\t0.426471900986588\tchr1:clu_1000_+\t1\n", + "Success\t2.08124492446643\t2\t0.124774780291386\tchr1:clu_10000_-\t0.763086823387392\n", + "```\n", + "\n", + "- **`output/leafcutter2/_effect_sizes.txt`** (`differential_splicing_3`)\n", + "(one row per intron. `logef` is the fitted log effect; the two group columns, named after the groups, are the fitted share of the cluster's reads using the intron in each group; `deltapsi` is the second group minus the first. Rows from the same cohort run.)\n", + "\n", + "```\n", + "intron\tlogef\tnonTDP\tTDP\tdeltapsi\n", + "chr1:11018873:11020429:clu_1000_+\t-0.0418300775955741\t0.430996568014776\t0.441382860788809\t0.0103862927740326\n", + "chr1:11018873:11020434:clu_1000_+\t-0.00616456524633462\t0.000214498361652778\t0.000227643349884984\t1.31449882322058e-05\n", + "```\n", + "\n", + "Sample column names in `junction_counts.gz` and `cluster_ratios.gz` are the junction files' base names, not the `sample_id` column of the manifest. Junctions converted by `star2junc` therefore carry names like `SAMPLE_001.SJ.out`, and real STAR output often adds a pass suffix, giving `SAMPLE_001.1pass.SJ.out`. A groups file for differential splicing must use these names, not the manifest's.\n", + "\n", + "Each step also writes a `.stderr` log beside its output. LeafCutter2 logs to standard error, so the corresponding `.stdout` is empty and is not kept.\n", + "\n", + "**`protocol_example.cluster_ratios.gz` is the file that feeds `splicing_normalization`**, not `junction_counts.gz`. Its `prepare_phenotype` step splits every cell on `/` and reads the denominator, so the `numerator/denominator` form is required; handing it the integer counts fails on the missing second field. `junction_counts.gz` is for differential splicing tools that want raw counts, such as LeafCutter's `leafcutter_ds.R`.\n", + "\n", + "The fifth `:CLASS` field in the intron ID is safe for that step: it reads only the first three colon-separated fields as coordinates and carries the full ID through unchanged." + ], + "id": "349a3030" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "## Minimal Working Example" + ], + "id": "5aaa2860" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Cluster and classify from junction files\n", + "\n", + "`leafcutter2_cluster` takes a list of junction files and runs clustering, classification and quantification. The repository ships two regtools junction fixtures, so this is the one workflow that runs on repository data; the GTF and FASTA are not shipped and must be supplied. The fixtures cover chr22, so the reference must include that chromosome and use `chr`-prefixed names. `--offset 1` is passed because the fixtures are regtools `.junc`. Almost all of the runtime is parsing the annotation, not the junctions, so it is near-constant regardless of cohort size; peak memory was 3.3 GB against a 1.3 GB GTF. Four of the six introns in `expected_perind_numers.counts.gz` survive, at identical coordinates; the other two belong to a 12-read cluster dropped by the 30-read `--min-clu-reads` minimum." + ], + "id": "f0d4f419" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "**Timing**: ~7 min (on toy dataset)" + ], + "id": "112ccee0" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "sos run pipeline/splicing_calling_leafcutter2.ipynb leafcutter2_cluster \\\n", + " --cwd output/leafcutter2 \\\n", + " --samples tests/fixtures/splicing_calling/leafcutter/protocol_example.sample_list.txt \\\n", + " --juncfiles tests/fixtures/splicing_calling/leafcutter/protocol_example.junction_files.txt \\\n", + " --annotation-gtf reference_data/Homo_sapiens.GRCh38.103.chr.reformatted.ERCC.gtf \\\n", + " --genome-fasta reference_data/GRCh38_full_analysis_set_plus_decoy_hla.noALT_noHLA_noDecoy_ERCC.fasta \\\n", + " --offset 1" + ], + "id": "0f4229f6" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Junction extraction and clustering from BAMs\n", + "\n", + "`leafcutter2` extracts junctions from every BAM with regtools and then clusters, classifies and quantifies them. This is the entry point for a full cohort. The one alignment the repository ships covers chr22:16M-17M in a single sample, so `--min-clu-reads 3` is needed here: at the default of 30 no cluster survives, and LeafCutter2 then fails in classification rather than exiting cleanly. The repository's own `splicing_calling` test uses the same lowered value on this data. A real cohort should leave the default alone." + ], + "id": "9ecdd9df" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "**Timing**: ~7 min (on toy dataset)" + ], + "id": "7dc8f816" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "sos run pipeline/splicing_calling_leafcutter2.ipynb leafcutter2 \\\n", + " --cwd output/leafcutter2 \\\n", + " --samples tests/fixtures/splicing_calling/leafcutter/protocol_example.bam_list.txt \\\n", + " --data-dir tests/fixtures/phenotype_formatting \\\n", + " --annotation-gtf reference_data/Homo_sapiens.GRCh38.103.chr.reformatted.ERCC.gtf \\\n", + " --genome-fasta reference_data/GRCh38_full_analysis_set_plus_decoy_hla.noALT_noHLA_noDecoy_ERCC.fasta \\\n", + " --min-clu-reads 3" + ], + "id": "8f158952" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Junction extraction only\n", + "\n", + "`leafcutter2_preprocessing` is the first half of the command above, stopping once the list of `.junc` files is written." + ], + "id": "c6a0b93b" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "**Timing**: ~1 min (on toy dataset)" + ], + "id": "5896b6ff" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "sos run pipeline/splicing_calling_leafcutter2.ipynb leafcutter2_preprocessing \\\n", + " --cwd output/leafcutter2 \\\n", + " --samples tests/fixtures/splicing_calling/leafcutter/protocol_example.bam_list.txt \\\n", + " --data-dir tests/fixtures/phenotype_formatting" + ], + "id": "eb8b27df" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Junction conversion from STAR output\n", + "\n", + "`star2junc` converts each `SJ.out.tab` named in the manifest into the junction BED format LeafCutter2 reads, for cohorts whose BAMs are no longer available. Its output feeds `leafcutter2_cluster`." + ], + "id": "93af9004" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "**Timing**: ~1 s (on toy dataset)" + ], + "id": "4d5ae8da" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "sos run pipeline/splicing_calling_leafcutter2.ipynb star2junc \\\n", + " --cwd output/leafcutter2 \\\n", + " --samples tests/fixtures/splicing_calling/leafcutter/protocol_example.sample_list.txt \\\n", + " --data-dir tests/fixtures/splicing_calling/leafcutter" + ], + "id": "842d463d" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Differential splicing between two groups\n", + "\n", + "`differential_splicing` splits the clustered intron counts by chromosome, tests each part with `leafcutter_ds.R`, and joins the parts with the false discovery rate recomputed over all clusters. It reads the LeafCutter1-format table written by either clustering workflow. The two fixture samples are too few to test, so the clustered cohort and the groups file are placeholders." + ], + "id": "6356926a" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "**Timing**: TBD (on toy dataset)" + ], + "id": "c3b7333f" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "sos run pipeline/splicing_calling_leafcutter2.ipynb differential_splicing \\\n", + " --cwd output/leafcutter2 \\\n", + " --samples \\\n", + " --counts output/leafcutter2/leafcutter1_files/_perind_numers.counts.gz \\\n", + " --groups \\\n", + " --container " + ], + "id": "4c409bec" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "## Command Interface" + ], + "id": "ce89106f" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "sos run pipeline/splicing_calling_leafcutter2.ipynb -h" + ], + "id": "f6b87dc6" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "```\n", + "usage: sos run pipeline/splicing_calling_leafcutter2.ipynb\n", + " [workflow_name | -t targets] [options] [workflow_options]\n", + " workflow_name: Single or combined workflows defined in this script\n", + " targets: One or more targets to generate\n", + " options: Single-hyphen sos parameters (see \"sos run -h\" for details)\n", + " workflow_options: Double-hyphen workflow-specific parameters\n", + "\n", + "Workflows:\n", + " leafcutter2\n", + " leafcutter2_preprocessing\n", + " leafcutter2_cluster\n", + " star2junc\n", + " differential_splicing\n", + "\n", + "Global Workflow Options:\n", + " --modular-script-dir code/script (as path)\n", + " --cwd output (as path)\n", + " The output directory for generated files.\n", + " --samples VAL (as path, required)\n", + " Sample meta data list\n", + " --data-dir path(f\"{samples:d}\")\n", + "\n", + " Raw data directory, default to the same directory as\n", + " sample list\n", + " --job-size 1 (as int)\n", + " For cluster jobs, number commands to run per job\n", + " --walltime 5h\n", + " Wall clock time expected\n", + " --mem 16G\n", + " Memory expected\n", + " --numThreads 8 (as int)\n", + " Number of threads\n", + " --container ''\n", + " Software container option\n", + "\n", + "Sections\n", + " leafcutter2_1, leafcutter2_preprocessing_1:\n", + " Workflow Options:\n", + " --anchor-len 8 (as int)\n", + " anchor length (default 8)\n", + " --min-intron-len 50 (as int)\n", + " minimum intron length to be analyzed (default 50)\n", + " --max-intron-len 500000 (as int)\n", + " maximum intron length to be analyzed (default 500000)\n", + " --min-mapq 0 (as int)\n", + " keep only reads with at least this mapping quality\n", + " before extraction (default 0, off; 255 keeps uniquely\n", + " mapped reads for STAR alignments)\n", + " leafcutter2_2:\n", + " Workflow Options:\n", + " --annotation-gtf VAL (as path, required)\n", + " GTF annotation with gene, transcript, CDS, start_codon\n", + " and stop_codon features\n", + " --genome-fasta VAL (as path, required)\n", + " Genome assembly FASTA matching the GTF, with a .fai\n", + " index beside it\n", + " --output-prefix f'{samples:bnn}'\n", + "\n", + " prefix for every output file; defaults to the manifest\n", + " name with all extensions stripped. Set it explicitly\n", + " when two workflows write into one --cwd, or when the\n", + " manifest name carries dots that are not extensions\n", + " (cohort.v1.sample_list.txt would otherwise collapse to\n", + " \"cohort\").\n", + " --min-clu-reads 30 (as int)\n", + " minimum reads in a cluster (default 30 reads)\n", + " --min-reads 5 (as int)\n", + " minimum reads for a junction to be considered for\n", + " clustering (default 5 reads)\n", + " --min-read-std 0.5 (as float)\n", + " minimum standard deviation of reads across samples\n", + " (default 0.5)\n", + " --min-clu-ratio 0.001 (as float)\n", + " minimum fraction of reads in a cluster that support a\n", + " junction (default 0.001)\n", + " --max-intron-len 500000 (as int)\n", + " maximum intron length to be analyzed (default 500000,\n", + " the GTEx value, not LeafCutter2's 100000)\n", + " --offset 1 (as int)\n", + " coordinate offset; 1 matches\n", + " leafcutter_cluster_regtools.R intron ends for regtools\n", + " .junc input\n", + " leafcutter2_cluster:\n", + " Workflow Options:\n", + " --juncfiles VAL (as path, required)\n", + " text file listing one junction file path per line\n", + " --annotation-gtf VAL (as path, required)\n", + " GTF annotation with gene, transcript, CDS, start_codon\n", + " and stop_codon features\n", + " --genome-fasta VAL (as path, required)\n", + " Genome assembly FASTA matching the GTF, with a .fai\n", + " index beside it\n", + " --output-prefix f'{samples:bnn}'\n", + "\n", + " prefix for every output file; defaults to the manifest\n", + " name with all extensions stripped. Set it explicitly\n", + " when two workflows write into one --cwd, or when the\n", + " manifest name carries dots that are not extensions\n", + " (cohort.v1.sample_list.txt would otherwise collapse to\n", + " \"cohort\").\n", + " --min-clu-reads 30 (as int)\n", + " minimum reads in a cluster (default 30 reads)\n", + " --min-reads 5 (as int)\n", + " minimum reads for a junction to be considered for\n", + " clustering (default 5 reads)\n", + " --min-read-std 0.5 (as float)\n", + " minimum standard deviation of reads across samples\n", + " (default 0.5)\n", + " --min-clu-ratio 0.001 (as float)\n", + " minimum fraction of reads in a cluster that support a\n", + " junction (default 0.001)\n", + " --max-intron-len 500000 (as int)\n", + " maximum intron length to be analyzed (default 500000,\n", + " the GTEx value, not LeafCutter2's 100000)\n", + " --offset VAL (as int, required)\n", + " coordinate offset. Required, with no default: it depends\n", + " on the junction file format, and the wrong value\n", + " corrupts the classification silently. Pass 0 for BED6, 1\n", + " for regtools .junc.\n", + " leafcutter2_preprocessing_2:\n", + " Workflow Options:\n", + " --output-prefix f'{samples:bnn}'\n", + "\n", + " prefix for every output file; defaults to the manifest\n", + " name with all extensions stripped. Set it explicitly\n", + " when two workflows write into one --cwd, or when the\n", + " manifest name carries dots that are not extensions\n", + " (cohort.v1.sample_list.txt would otherwise collapse to\n", + " \"cohort\").\n", + " star2junc:\n", + " differential_splicing_1:\n", + " Workflow Options:\n", + " --counts VAL (as path, required)\n", + " LeafCutter1-format intron counts from leafcutter2 or\n", + " leafcutter2_cluster\n", + " (leafcutter1_files/_perind_numers.counts.gz)\n", + " --groups VAL (as path, required)\n", + " no header: sample, group (exactly two), then any\n", + " covariates\n", + " --output-prefix f'{groups:bn}'\n", + "\n", + " prefix for every output file; defaults to the groups\n", + " file name without its extension\n", + " differential_splicing_2:\n", + " Workflow Options:\n", + " --groups VAL (as path, required)\n", + " no header: sample, group (exactly two), then any\n", + " covariates\n", + " --min-samples-per-intron 5 (as int)\n", + " ignore introns with reads in fewer samples than this\n", + " (default 5)\n", + " --min-samples-per-group 3 (as int)\n", + " samples per group that need min_coverage reads in a\n", + " cluster for it to be tested (default 3)\n", + " --min-coverage 20 (as int)\n", + " reads a cluster needs in each of those samples (default\n", + " 20)\n", + " --timeout 30 (as int)\n", + " seconds allowed for one cluster's model fit (default 30)\n", + " differential_splicing_3:\n", + " Workflow Options:\n", + " --groups VAL (as path, required)\n", + " no header: sample, group (exactly two), then any\n", + " covariates\n", + " --output-prefix f'{groups:bn}'\n", + "\n", + " prefix for every output file; defaults to the groups\n", + " file name without its extension\n", + "```" + ], + "id": "df9313f1" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "## Workflow implementation" + ], + "id": "8c6885b2" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "[global]\n", + "parameter: modular_script_dir = path('code/script') # override with --modular-script-dir\n", + "# The output directory for generated files.\n", + "parameter: cwd = path(\"output\")\n", + "# Sample meta data list\n", + "parameter: samples = path\n", + "# Raw data directory, default to the same directory as sample list\n", + "parameter: data_dir = path(f\"{samples:d}\")\n", + "\n", + "# For cluster jobs, number commands to run per job\n", + "parameter: job_size = 1\n", + "# Wall clock time expected\n", + "parameter: walltime = \"5h\"\n", + "# Memory expected\n", + "parameter: mem = \"16G\"\n", + "# Number of threads\n", + "parameter: numThreads = 8\n", + "# Software container option\n", + "parameter: container = \"\"\n", + "from sos.utils import expand_size\n", + "cwd = path(f'{cwd:a}')\n", + "\n", + "# Build the input file lists from the sample manifest (basic SoS input plumbing; no pandas so\n", + "# it runs in the base env, no def/handles left in globals so the lists pickle to task workers).\n", + "# regtools strandness codes: rf->RF, fr->FR, strand_missing->XS. Blank/\"NA\" drops that sample.\n", + "_lines = open(samples).read().splitlines()\n", + "_hdr = _lines[0].split('\\t')\n", + "_rows = [dict(zip(_hdr, _ln.split('\\t'))) for _ln in _lines[1:] if _ln.strip()]\n", + "_sm = {'rf': 'RF', 'fr': 'FR', 'strand_missing': 'XS'}\n", + "_blank = lambda v: (v or 'NA').strip() in ('', 'NA')\n", + "# A manifest may give either the long form (rf, fr, strand_missing) or the regtools code it maps\n", + "# to (RF, FR, XS). Anything else is rejected here rather than passed to regtools, which would\n", + "# take it as a literal and silently produce wrongly stranded junctions.\n", + "_ok = set(_sm) | set(_sm.values())\n", + "_bad = sorted({(_r.get('strand') or '').strip() for _r in _rows} - _ok)\n", + "if _bad:\n", + " raise ValueError(f\"unknown strand value(s) {_bad} in {samples}; expected one of {sorted(_ok)}\")\n", + "# BAM rows and SJ rows are filtered independently, and every per-sample list is derived from\n", + "# its own filtered row set, so dropping a row with a blank or NA path cannot shift the\n", + "# strandness of the row after it.\n", + "_bam_rows = [_r for _r in _rows if not _blank(_r.get('coord_bam_list'))]\n", + "_sj_rows = [_r for _r in _rows if not _blank(_r.get('SJ_list'))]\n", + "sample_id = [(_r.get('sample_id') or 'NA').strip() for _r in _bam_rows]\n", + "strandness = [_sm.get(_s, _s) for _s in [(_r.get('strand') or '').strip() for _r in _bam_rows]]\n", + "bam_data = [f'{data_dir}/{_r[\"coord_bam_list\"].strip()}' for _r in _bam_rows]\n", + "sj_data = [f'{data_dir}/{_r[\"SJ_list\"].strip()}' for _r in _sj_rows]\n", + "# Junction files are named after the BAM basename, so a collision would overwrite a sample.\n", + "_bn = [_b.rsplit('/', 1)[-1] for _b in bam_data]\n", + "if len(set(_bn)) != len(_bn):\n", + " raise ValueError(f\"duplicate BAM basenames in {samples}: junction outputs would collide\")\n", + "del _lines, _hdr, _rows, _sm, _blank, _ok, _bad, _bam_rows, _sj_rows, _bn" + ], + "id": "f4a5359d" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Junction extraction\n", + "\n", + "Documentation: [LeafCutter2](https://github.com/leafcutter2/leafcutter2); the regtools parameter choices are [discussed here](https://github.com/davidaknowles/leafcutter/issues/127). This step is identical to `splicing_calling`'s first step, so junctions extracted by either module are interchangeable. `leafcutter2_1` extracts junctions from each BAM, `leafcutter2_preprocessing_2` writes the junction list instead of clustering." + ], + "id": "b3595d73" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "[leafcutter2_1, leafcutter2_preprocessing_1]\n", + "# anchor length (default 8)\n", + "parameter: anchor_len = 8\n", + "# minimum intron length to be analyzed (default 50)\n", + "parameter: min_intron_len = 50\n", + "# maximum intron length to be analyzed (default 500000)\n", + "parameter: max_intron_len = 500000\n", + "# keep only reads with at least this mapping quality before extraction (default 0, off;\n", + "# 255 keeps uniquely mapped reads for STAR alignments)\n", + "parameter: min_mapq = 0\n", + "input: bam_data, group_by = 1, group_with = \"strandness\"\n", + "output: f'{cwd}/{_input:bn}.junc'\n", + "task: trunk_workers = 1, trunk_size = job_size, walltime = walltime, mem = mem, cores = numThreads\n", + "bash: expand= \"${ }\", stderr = f'{_output:n}.stderr', stdout = f'{_output:n}.stdout', container=container\n", + " bash ${modular_script_dir}/molecular_phenotypes/calling/regtools_junctions.sh \\\n", + " --bam ${_input} \\\n", + " --output ${_output} \\\n", + " --min-anchor ${anchor_len} \\\n", + " --min-intron ${min_intron_len} \\\n", + " --max-intron ${max_intron_len} \\\n", + " --min-mapq ${min_mapq} \\\n", + " --strandness ${_strandness}" + ], + "id": "d9d00145" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Clustering, classification and quantification\n", + "\n", + "`leafcutter2_2` clusters the extracted junctions and classifies each one as productive, unproductive, ambiguous or intergenic. `--keepleafcutter1` is always passed so that LeafCutter1-format tables are written alongside, which keeps the original `leafcutter_ds.R` usable on these clusters. Both clustering steps call `leafcutter2_cluster.sh`, which checks the junction files and annotation before running `leafcutter2` and stops if no cluster survives the read filters." + ], + "id": "724281fd" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "[leafcutter2_2]\n", + "# GTF annotation with gene, transcript, CDS, start_codon and stop_codon features\n", + "parameter: annotation_gtf = path\n", + "# Genome assembly FASTA matching the GTF, with a .fai index beside it\n", + "parameter: genome_fasta = path\n", + "# prefix for every output file; defaults to the manifest name with all extensions stripped.\n", + "# Set it explicitly when two workflows write into one --cwd, or when the manifest name carries\n", + "# dots that are not extensions (cohort.v1.sample_list.txt would otherwise collapse to \"cohort\").\n", + "parameter: output_prefix = f'{samples:bnn}'\n", + "# minimum reads in a cluster (default 30 reads)\n", + "parameter: min_clu_reads = 30\n", + "# minimum reads for a junction to be considered for clustering (default 5 reads)\n", + "parameter: min_reads = 5\n", + "# minimum standard deviation of reads across samples (default 0.5)\n", + "parameter: min_read_std = 0.5\n", + "# minimum fraction of reads in a cluster that support a junction (default 0.001)\n", + "parameter: min_clu_ratio = 0.001\n", + "# maximum intron length to be analyzed (default 500000, the GTEx value, not LeafCutter2's 100000)\n", + "parameter: max_intron_len = 500000\n", + "# coordinate offset; 1 matches leafcutter_cluster_regtools.R intron ends for regtools .junc input\n", + "parameter: offset = 1\n", + "input: group_by = 'all'\n", + "output: counts = f'{cwd}/{output_prefix}.junction_counts.gz',\n", + " ratios = f'{cwd}/{output_prefix}.cluster_ratios.gz',\n", + " lc1_counts = f'{cwd}/leafcutter1_files/{output_prefix}_perind.counts.gz',\n", + " lc1_numers = f'{cwd}/leafcutter1_files/{output_prefix}_perind_numers.counts.gz',\n", + " classifications = f'{cwd}/clustering/{output_prefix}_junction_classifications.txt'\n", + "depends: annotation_gtf, genome_fasta, path(f'{genome_fasta}.fai')\n", + "task: trunk_workers = 1, trunk_size = job_size, walltime = walltime, mem = mem, cores = numThreads\n", + "bash: expand= \"${ }\", stderr = f'{cwd}/{output_prefix}.stderr', stdout = f'{cwd}/{output_prefix}.stdout', container=container\n", + " set -e\n", + " _juncfile=${cwd}/${output_prefix}.intron_usage_perind.junc\n", + " rm -f $_juncfile\n", + " for i in ${_input:r}; do\n", + " echo $i >> $_juncfile ; done\n", + " bash ${modular_script_dir}/molecular_phenotypes/calling/leafcutter2_cluster.sh \\\n", + " --juncfiles $_juncfile \\\n", + " --outprefix ${output_prefix} \\\n", + " --rundir ${cwd} \\\n", + " --annot ${annotation_gtf} \\\n", + " --genome ${genome_fasta} \\\n", + " --maxintronlen ${max_intron_len} \\\n", + " --minclureads ${min_clu_reads} \\\n", + " --minreads ${min_reads} \\\n", + " --minreadstd ${min_read_std} \\\n", + " --mincluratio ${min_clu_ratio} \\\n", + " --offset ${offset}" + ], + "id": "827cab05" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Clustering from an existing junction list\n", + "\n", + "`leafcutter2_cluster` is an alternative entry point to the step above: it takes a junction file list directly rather than extracting junctions from BAMs. It writes the same outputs, so the two do not chain." + ], + "id": "87c8783e" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "[leafcutter2_cluster]\n", + "# text file listing one junction file path per line\n", + "parameter: juncfiles = path\n", + "# GTF annotation with gene, transcript, CDS, start_codon and stop_codon features\n", + "parameter: annotation_gtf = path\n", + "# Genome assembly FASTA matching the GTF, with a .fai index beside it\n", + "parameter: genome_fasta = path\n", + "# prefix for every output file; defaults to the manifest name with all extensions stripped.\n", + "# Set it explicitly when two workflows write into one --cwd, or when the manifest name carries\n", + "# dots that are not extensions (cohort.v1.sample_list.txt would otherwise collapse to \"cohort\").\n", + "parameter: output_prefix = f'{samples:bnn}'\n", + "# minimum reads in a cluster (default 30 reads)\n", + "parameter: min_clu_reads = 30\n", + "# minimum reads for a junction to be considered for clustering (default 5 reads)\n", + "parameter: min_reads = 5\n", + "# minimum standard deviation of reads across samples (default 0.5)\n", + "parameter: min_read_std = 0.5\n", + "# minimum fraction of reads in a cluster that support a junction (default 0.001)\n", + "parameter: min_clu_ratio = 0.001\n", + "# maximum intron length to be analyzed (default 500000, the GTEx value, not LeafCutter2's 100000)\n", + "parameter: max_intron_len = 500000\n", + "# coordinate offset. Required, with no default: it depends on the junction file format, and the\n", + "# wrong value corrupts the classification silently. Pass 0 for BED6, 1 for regtools .junc.\n", + "parameter: offset = int\n", + "# Junction files are declared as dependencies so a missing or changed one invalidates the run.\n", + "_junc_list = [_l.strip() for _l in open(juncfiles) if _l.strip()]\n", + "input: juncfiles\n", + "output: counts = f'{cwd}/{output_prefix}.junction_counts.gz',\n", + " ratios = f'{cwd}/{output_prefix}.cluster_ratios.gz',\n", + " lc1_counts = f'{cwd}/leafcutter1_files/{output_prefix}_perind.counts.gz',\n", + " lc1_numers = f'{cwd}/leafcutter1_files/{output_prefix}_perind_numers.counts.gz',\n", + " classifications = f'{cwd}/clustering/{output_prefix}_junction_classifications.txt'\n", + "depends: annotation_gtf, genome_fasta, path(f'{genome_fasta}.fai'), _junc_list\n", + "task: trunk_workers = 1, trunk_size = job_size, walltime = walltime, mem = mem, cores = numThreads\n", + "bash: expand= \"${ }\", stderr = f'{cwd}/{output_prefix}.stderr', stdout = f'{cwd}/{output_prefix}.stdout', container=container\n", + " set -e\n", + " bash ${modular_script_dir}/molecular_phenotypes/calling/leafcutter2_cluster.sh \\\n", + " --juncfiles ${_input} \\\n", + " --outprefix ${output_prefix} \\\n", + " --rundir ${cwd} \\\n", + " --annot ${annotation_gtf} \\\n", + " --genome ${genome_fasta} \\\n", + " --maxintronlen ${max_intron_len} \\\n", + " --minclureads ${min_clu_reads} \\\n", + " --minreads ${min_reads} \\\n", + " --minreadstd ${min_read_std} \\\n", + " --mincluratio ${min_clu_ratio} \\\n", + " --offset ${offset}" + ], + "id": "2be4e48a" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Junction list only\n", + "\n", + "`leafcutter2_preprocessing_2` writes the list of per-sample `.junc` files and stops, for cohorts whose clustering is done elsewhere." + ], + "id": "743b5a04" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "[leafcutter2_preprocessing_2]\n", + "# prefix for every output file; defaults to the manifest name with all extensions stripped.\n", + "# Set it explicitly when two workflows write into one --cwd, or when the manifest name carries\n", + "# dots that are not extensions (cohort.v1.sample_list.txt would otherwise collapse to \"cohort\").\n", + "parameter: output_prefix = f'{samples:bnn}'\n", + "input: group_by = 'all'\n", + "output: f'{cwd}/{output_prefix}.intron_usage_perind.junc'\n", + "task: trunk_workers = 1, trunk_size = job_size, walltime = walltime, mem = mem, cores = numThreads\n", + "bash: expand= \"${ }\", stderr = f'{_output:n}.stderr', stdout = f'{_output:n}.stdout', container=container\n", + " rm -f ${_output:r}\n", + " for i in ${_input:r}; do\n", + " echo $i >> ${_output:r} ; done" + ], + "id": "55398f83" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Junction conversion from STAR output\n", + "\n", + "`star2junc` converts each `SJ.out.tab` named in the manifest into the junction BED format LeafCutter2 reads. Use it when the BAMs are unavailable; note that `SJ.out.tab` records uniquely mapped junction reads only, so counts will not match those regtools extracts from the same library." + ], + "id": "865b4e67" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "[star2junc]\n", + "input: sj_data, group_by = 1\n", + "output: f'{cwd}/{_input:bn}.junc.gz'\n", + "task: trunk_workers = 1, trunk_size = job_size, walltime = walltime, mem = mem, cores = numThreads\n", + "bash: expand= \"${ }\", stderr = f'{_output:nn}.stderr', stdout = f'{_output:nn}.stdout', container=container\n", + " leafcutter2-star2junc ${_input} ${_output}" + ], + "id": "3f75f782" + }, + { + "cell_type": "markdown", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Differential splicing\n", + "\n", + "`differential_splicing_1` checks the groups file against the count table and splits the table into 24 parts by chromosome; `differential_splicing_2` runs `leafcutter_ds.R` on each part as its own job; `differential_splicing_3` joins the parts and recomputes the false discovery rate over every tested cluster. `leafcutter_ds.R` is the script from [LeafCutter](https://github.com/davidaknowles/leafcutter), shipped beside the module's other scripts." + ], + "id": "984da69a" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "[differential_splicing_1]\n", + "# LeafCutter1-format intron counts from leafcutter2 or leafcutter2_cluster\n", + "# (leafcutter1_files/_perind_numers.counts.gz)\n", + "parameter: counts = path\n", + "# no header: sample, group (exactly two), then any covariates\n", + "parameter: groups = path\n", + "# prefix for every output file; defaults to the groups file name without its extension\n", + "parameter: output_prefix = f'{groups:bn}'\n", + "input: counts\n", + "output: [f'{cwd}/{output_prefix}_parts/{output_prefix}.part_{x}.counts.gz' for x in [str(i) for i in range(1, 23)] + ['X', 'other']]\n", + "bash: expand= \"${ }\", stderr = f'{cwd}/{output_prefix}.split.stderr', stdout = f'{cwd}/{output_prefix}.split.stdout'\n", + " Rscript ${modular_script_dir}/molecular_phenotypes/calling/leafcutter_ds_split.R \\\n", + " --counts ${_input} \\\n", + " --groups ${groups} \\\n", + " --output-prefix ${cwd}/${output_prefix}_parts/${output_prefix}\n" + ], + "id": "8555eed9" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "[differential_splicing_2]\n", + "# no header: sample, group (exactly two), then any covariates\n", + "parameter: groups = path\n", + "# ignore introns with reads in fewer samples than this (default 5)\n", + "parameter: min_samples_per_intron = 5\n", + "# samples per group that need min_coverage reads in a cluster for it to be tested (default 3)\n", + "parameter: min_samples_per_group = 3\n", + "# reads a cluster needs in each of those samples (default 20)\n", + "parameter: min_coverage = 20\n", + "# seconds allowed for one cluster's model fit (default 30)\n", + "parameter: timeout = 30\n", + "input: group_by = 1\n", + "output: f'{_input:nn}_cluster_significance.txt', f'{_input:nn}_effect_sizes.txt'\n", + "task: trunk_workers = 1, trunk_size = job_size, walltime = walltime, mem = mem, cores = numThreads\n", + "bash: expand= \"${ }\", stderr = f'{_input:nn}.stderr', stdout = f'{_input:nn}.stdout', container=container\n", + " set -e\n", + " if [ \"$(zcat ${_input} | head -n2 | wc -l)\" -lt 2 ]; then\n", + " # no clusters on this chromosome: empty results, which the join skips\n", + " : > ${_output[0]}\n", + " : > ${_output[1]}\n", + " else\n", + " Rscript ${modular_script_dir}/molecular_phenotypes/calling/leafcutter_ds.R \\\n", + " --num_threads ${numThreads} \\\n", + " --min_samples_per_intron ${min_samples_per_intron} \\\n", + " --min_samples_per_group ${min_samples_per_group} \\\n", + " --min_coverage ${min_coverage} \\\n", + " --timeout ${timeout} \\\n", + " --output_prefix ${_input:nn} \\\n", + " ${_input} ${groups}\n", + " fi\n" + ], + "id": "27bc897a" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "kernel": "SoS" + }, + "outputs": [], + "source": [ + "[differential_splicing_3]\n", + "# no header: sample, group (exactly two), then any covariates\n", + "parameter: groups = path\n", + "# prefix for every output file; defaults to the groups file name without its extension\n", + "parameter: output_prefix = f'{groups:bn}'\n", + "input: group_by = 'all'\n", + "output: f'{cwd}/{output_prefix}_cluster_significance.txt', f'{cwd}/{output_prefix}_effect_sizes.txt'\n", + "bash: expand= \"${ }\", stderr = f'{cwd}/{output_prefix}.merge.stderr', stdout = f'{cwd}/{output_prefix}.merge.stdout'\n", + " Rscript ${modular_script_dir}/molecular_phenotypes/calling/leafcutter_ds_merge.R \\\n", + " --output-prefix ${cwd}/${output_prefix} \\\n", + " --files ${_input}\n" + ], + "id": "a507fda7" + }, + { + "cell_type": "markdown", + "id": "7e2e09ee", + "metadata": { + "kernel": "SoS" + }, + "source": [ + "### Troubleshooting\n", + "\n", + "| Symptom | Cause | Fix |\n", + "| --- | --- | --- |\n", + "| `ERROR: chromosome naming differs` | The junction files and the GTF use different chromosome naming (`22` against `chr22`). The preflight check stops the run before clustering. | Supply a GTF and FASTA whose naming matches the junction files. |\n", + "| `Could not find () in annotations`, followed by `ValueError: Cannot set a DataFrame with multiple columns to the single column SJClass` | The naming styles agree, so the preflight passes, but the GTF still does not cover some chromosome present in the junction files. Clustering completes and the crash comes later, in classification. | Supply a GTF and FASTA covering every chromosome in the junction files. |\n", + "| Productive fraction collapses; `UP` and `NE` dominate `junction_counts.gz` | `--offset` does not match the junction file format. | `1` for regtools `.junc`, `0` for BED6. See Input. |\n", + "| `ERROR: junction files mix formats` | The `--juncfiles` list names both BED6 and BED12 files, which need different offsets. | Convert them to one format, or cluster each set separately. |\n", + "| `the following arguments are required: --offset` | `leafcutter2_cluster` has no offset default by design. | Pass `--offset 0` for BED6 or `--offset 1` for regtools `.junc`. |\n", + "| `ERROR: no clusters survived filtering`, or `ValueError: Cannot set a DataFrame with multiple columns to the single column SJClass` with an empty `clustering/_clusters` | No cluster met `--min-clu-reads`, so there was nothing to classify. Clustering reports success and the failure comes later. | Lower `--min-clu-reads`, or check the junction files actually carry reads in the region. |\n", + "| `exitcode=127` | `leafcutter2` is not on `PATH`. | Activate the pixi environment holding it before running, or supply `--container`. |\n", + "| `AttributeError: module 'leafcutter2.Transcript_tools' has no attribute 'ClassifySpliceJunction'`, after clustering reports success | A pre-2.0 LeafCutter2 is installed. Clustering works, classification does not. | Install LeafCutter2 2.0 or newer. See Input. |\n", + "| `leafcutter2-star2junc: command not found` | Same cause: that command only exists in 2.x. | Install LeafCutter2 2.0 or newer. |\n", + "| Introns above 100 kb missing | `--max-intron-len` left at LeafCutter2's default. | This module defaults to `500000`; check it has not been overridden. |\n", + "| Classification runs but every junction is `IN` | The GTF lacks `CDS`, `start_codon` or `stop_codon` features, or uses a tag this module does not auto-detect. | Use a GTF carrying those features; set `--transcript_type`, `--gene_name` or `--transcript_name` on the tool if the tags differ. |\n", + "| `there is no package called 'leafcutter'` in a `differential_splicing_2` log | `leafcutter_ds.R` needs the R `leafcutter` package, which the pixi environment lacks. | Pass `--container` with an image that has it. |\n", + "| `ERROR: no sample in matches a column of the count table` | The groups file uses manifest `sample_id` values, but the count table is named after the junction files. | Use the column names of `--counts` in column 1. |\n", + "| `ERROR: gives 3 groups` | `leafcutter_ds.R` compares exactly two groups. | Keep two groups in column 2, or drop the other samples from the file. |\n", + "| One `differential_splicing_2` job stops at the wall-clock limit | The largest chromosomes take longest. | Raise `--walltime`; the finished parts are reused on rerun. |\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SoS", + "language": "sos", + "name": "sos" + }, + "language_info": { + "codemirror_mode": "sos", + "file_extension": ".sos", + "mimetype": "text/x-sos", + "name": "sos", + "nbconvert_exporter": "sos_notebook.converter.SoS_Exporter", + "pygments_lexer": "sos" + }, + "sos": { + "kernels": [ + [ + "Bash", + "bash", + "Bash", + "#E6EEFF", + "shell" + ], + [ + "R", + "ir", + "R", + "#DCDCDA", + "r" + ], + [ + "SoS", + "sos", + "", + "", + "sos" + ] + ], + "version": "0.22.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/code/script/molecular_phenotypes/calling/leafcutter2_cluster.sh b/code/script/molecular_phenotypes/calling/leafcutter2_cluster.sh new file mode 100755 index 000000000..d00f95ea4 --- /dev/null +++ b/code/script/molecular_phenotypes/calling/leafcutter2_cluster.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +# ============================================================ +# leafcutter2_cluster.sh +# Cluster, classify and quantify junctions with LeafCutter2, for the leafcutter2_2 +# and leafcutter2_cluster steps of splicing_calling_leafcutter2.ipynb. +# +# Three checks wrap the leafcutter2 call, because each failure they catch is +# otherwise silent or surfaces much later: +# 1. every junction file has the same column count. BED12 (regtools .junc) and +# BED6 (star2junc) need different --offset values, so a mixed list cannot be right. +# 2. junction and annotation chromosome naming agree (chr22 against 22). If they +# differ, nothing classifies and every junction simply comes back unannotated. +# 3. at least one cluster survived the read filters. If none did, clustering still +# reports success and the failure appears later, in classification. +# +# --keepleafcutter1 is always passed so the LeafCutter1-format tables that +# leafcutter_ds.R reads are written alongside. +# ============================================================ +# No pipefail: the checks read only the first lines (zcat | head), which ends zcat early. +set -eu + +JUNCFILES="" +OUTPREFIX="" +RUNDIR="" +ANNOT="" +GENOME="" +MAXINTRONLEN=500000 +MINCLUREADS=30 +MINREADS=5 +MINREADSTD=0.5 +MINCLURATIO=0.001 +OFFSET="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --juncfiles) JUNCFILES="$2"; shift 2 ;; + --outprefix) OUTPREFIX="$2"; shift 2 ;; + --rundir) RUNDIR="$2"; shift 2 ;; + --annot) ANNOT="$2"; shift 2 ;; + --genome) GENOME="$2"; shift 2 ;; + --maxintronlen) MAXINTRONLEN="$2"; shift 2 ;; + --minclureads) MINCLUREADS="$2"; shift 2 ;; + --minreads) MINREADS="$2"; shift 2 ;; + --minreadstd) MINREADSTD="$2"; shift 2 ;; + --mincluratio) MINCLURATIO="$2"; shift 2 ;; + --offset) OFFSET="$2"; shift 2 ;; + *) echo "Unknown argument: $1" >&2; exit 1 ;; + esac +done + +: "${JUNCFILES:?--juncfiles is required}" +: "${OUTPREFIX:?--outprefix is required}" +: "${RUNDIR:?--rundir is required}" +: "${ANNOT:?--annot is required}" +: "${GENOME:?--genome is required}" +: "${OFFSET:?--offset is required (0 for BED6, 1 for regtools .junc)}" + +# 1. One offset applies to the whole run. +ncol=$(while read -r f; do [ -n "$f" ] && zcat -f "$f" | head -n1 | awk '{print NF}'; done < "$JUNCFILES" | sort -u | tr '\n' ' ') +if [ "$(echo $ncol | wc -w)" -gt 1 ]; then + echo "ERROR: junction files mix formats (column counts: $ncol). A single --offset cannot suit both." >&2 + exit 1 +fi + +# 2. Chromosome naming. +jchr=$(zcat -f "$(head -n1 "$JUNCFILES")" | head -n1 | cut -f1) +achr=$(zcat -f "$ANNOT" | grep -v '^#' | head -n1 | cut -f1) +case "$jchr" in chr*) jp=prefixed;; *) jp=bare;; esac +case "$achr" in chr*) ap=prefixed;; *) ap=bare;; esac +if [ "$jp" != "$ap" ]; then + echo "ERROR: chromosome naming differs. Junctions use '$jchr', annotation uses '$achr'." >&2 + exit 1 +fi + +leafcutter2 \ + --juncfiles "$JUNCFILES" \ + --outprefix "$OUTPREFIX" \ + --rundir "$RUNDIR" \ + --annot "$ANNOT" \ + --genome "$GENOME" \ + --maxintronlen "$MAXINTRONLEN" \ + --minclureads "$MINCLUREADS" \ + --minreads "$MINREADS" \ + --minreadstd "$MINREADSTD" \ + --mincluratio "$MINCLURATIO" \ + --offset "$OFFSET" \ + --keepleafcutter1 + +# 3. An empty result means the filters removed every cluster. +if [ "$(zcat "$RUNDIR/$OUTPREFIX.cluster_ratios.gz" | head -n2 | wc -l)" -lt 2 ]; then + echo "ERROR: no clusters survived filtering. Lower --min-clu-reads (currently $MINCLUREADS)" >&2 + echo " or --min-reads (currently $MINREADS), or check that the junction files are not empty." >&2 + exit 1 +fi diff --git a/code/script/molecular_phenotypes/calling/leafcutter_ds.R b/code/script/molecular_phenotypes/calling/leafcutter_ds.R new file mode 100644 index 000000000..1fee708c8 --- /dev/null +++ b/code/script/molecular_phenotypes/calling/leafcutter_ds.R @@ -0,0 +1,109 @@ +#!/usr/bin/env Rscript +# leafcutter_ds.R from LeafCutter (https://github.com/davidaknowles/leafcutter, +# scripts/leafcutter_ds.R; Apache License 2.0), used by the differential_splicing +# workflow of splicing_calling_leafcutter2.ipynb. +# One change from upstream: the count table is restricted to the samples present in +# both it and the groups file, so a groups file naming a sample the table lacks drops +# that sample instead of stopping the run. +library(optparse) +library(leafcutter) + +arguments <- parse_args(OptionParser(usage = "%prog [options] counts_file groups_file", description="LeafCutter differential splicing command line tool. Required inputs:\n : Intron usage counts file. Must be .txt or .txt.gz, output from clustering pipeline.\n : Two+K column file: 1. sample names (must match column names in counts_file), 2. groups (currently only two groups, i.e. pairwise, supported. Some samples in counts_file can be missing from this file, in which case they will not be included in the analysis. Additional columns can be used to specify confounders, e.g. batch/sex/age. Numeric columns will be treated as continuous, so use e.g. batch1, batch2, batch3 rather than 1, 2, 3 if you a categorical variable.",option_list=list( + make_option(c("-o","--output_prefix"), default = "leafcutter_ds", help="The prefix for the two output files, _cluster_significance.txt (containing test status, log likelihood ratio, degree of freedom, and p-value for each cluster) and _effect_sizes.txt (containing the effect sizes for each intron) [default %default]"), + make_option(c("-s","--max_cluster_size"), default=Inf, help="Don't test clusters with more introns than this [default %default]"), + make_option(c("-i","--min_samples_per_intron"), default=5, help="Ignore introns used (i.e. at least one supporting read) in fewer than n samples [default %default]") , + make_option(c("-g","--min_samples_per_group"), default=3, help="Require this many samples in each group to have at least min_coverage reads [default %default]"), + make_option(c("-c","--min_coverage"), default=20, help="Require min_samples_per_group samples in each group to have at least this many reads [default %default]"), + make_option(c("-t","--timeout"), default=30, help="Maximum time (in seconds) allowed for a single optimization run [default %default]"), + make_option(c("-p","--num_threads"), default=1, help="Number of threads to use [default %default]"), + make_option(c("-e","--exon_file"), default=NULL, help="File defining known exons, example in data/gencode19_exons.txt.gz. Columns should be chr, start, end, strand, gene_name. Optional, only just to label the clusters."), + make_option(c("--init"), default="smart", help="One of 'smart' (default) or 'random'."), + make_option(c("--seed"), default=12345, help="Random seed if using random initialization."))), + positional_arguments = 2) + +opt=arguments$opt +counts_file=arguments$args[1] +groups_file=arguments$args[2] + +cat("Loading counts from",counts_file,"\n") +if (!file.exists(counts_file)) stop("File ",counts_file," does not exist") +counts=read.table(counts_file, header=T, check.names = F) + +cat("Loading metadata from",groups_file,"\n") +if (!file.exists(groups_file)) stop("File ",groups_file," does not exist") +meta=read.table(groups_file, header=F, stringsAsFactors = F) +colnames(meta)[1:2]=c("sample","group") + +common_cols <- intersect(colnames(counts), meta$sample) +counts <- counts[, common_cols] +meta <- meta[meta$sample %in% colnames(counts),] + +#counts=counts[,meta$sample] + +group_names=unique(meta$group) # keep order from groups_file unless numeric +if (is.numeric(meta$group)) group_names=sort(group_names) +meta$group=factor(meta$group, group_names) + +stopifnot(length(group_names)==2) + +cat("Encoding as",group_names[1],"=0,",group_names[2],"=1\n") +numeric_x=as.numeric(meta$group)-1 + +confounders=NULL +if (ncol(meta)>2) { + confounders=meta[,3:ncol(meta),drop=F] + # scale continuous confounders + for (i in seq_len(ncol(confounders))) + if (is.numeric(confounders[,i])) + confounders[,i]=scale(confounders[,i]) + # convert factors to one-of-K encoding + confounders=model.matrix( ~., data=confounders ) + confounders=confounders[,2:ncol(confounders),drop=F] # remove intercept +} + +minimum_group_size=min(sum(numeric_x==0),sum(numeric_x==1)) +if (minimum_group_size < opt$min_samples_per_intron) + stop("The number of samples in the smallest group is less than min_samples_per_intron, which means no clusters are testable. You can reduce min_samples_per_intron using the -i option, but note that we have only carefully checked the calibration of leafcutter p-values down to n=4 samples per group.") +if (minimum_group_size < opt$min_samples_per_group) + stop("The number of samples in the smallest group is less than min_samples_per_group, which means no clusters are testable. You can reduce min_samples_per_intron using the -g option, but note that we have only carefully checked the calibration of leafcutter p-values down to n=4 samples per group.") + +require(doMC) +registerDoMC(opt$num_threads) + +cat("Settings:\n") +print(opt) + +cat("Running differential splicing analysis...\n") +results <- differential_splicing(counts, numeric_x, confounders=confounders, max_cluster_size=opt$max_cluster_size, min_samples_per_intron=opt$min_samples_per_intron, min_samples_per_group=opt$min_samples_per_group, min_coverage=opt$min_coverage, timeout=opt$timeout, init=opt$init, seed=opt$seed) + +cat("Saving results...\n") + +# Make cluster table +cluster_table = cluster_results_table(results) +cluster_table$cluster = add_chr(cluster_table$cluster) + +# Add gene names to clusters if an exon file is available +if (!is.null(opt$exon_file)) { + cat("Loading exons from",opt$exon_file,"\n") + if (file.exists(opt$exon_file)) { + tryCatch( { + exons_table = read.table(opt$exon_file, header=T, stringsAsFactors = F) + intron_meta = get_intron_meta(rownames(counts)) + exons_table$chr = add_chr(exons_table$chr) + intron_meta$chr = add_chr(intron_meta$chr) + clu_gene_map = map_clusters_to_genes(intron_meta, exons_table) + cluster_table = merge(cluster_table, clu_gene_map, by.x="cluster", by.y="clu", all.x=TRUE) + }, error=function(err) warning(as.character(err)) ) # ignore errors here + } else warning("File ",opt$exon_file," does not exist") +} else cat("No exon_file provided.\n") +write.table( cluster_table, paste0(opt$output_prefix,"_cluster_significance.txt"), quote=F, sep="\t", row.names = F) + +# Write effect size table +effect_size_table = leaf_cutter_effect_sizes(results) +colnames(effect_size_table)[3:4] = group_names +effect_size_table$intron = add_chr(effect_size_table$intron) +write.table( effect_size_table, paste0(opt$output_prefix,"_effect_sizes.txt"), quote=F, col.names = T, row.names = F, sep="\t") + +# Save RData image +# save.image(paste0(opt$output_prefix,"_cluster_significance.RData")); +cat("All done, exiting\n") diff --git a/code/script/molecular_phenotypes/calling/leafcutter_ds_merge.R b/code/script/molecular_phenotypes/calling/leafcutter_ds_merge.R new file mode 100644 index 000000000..3c1deaf2a --- /dev/null +++ b/code/script/molecular_phenotypes/calling/leafcutter_ds_merge.R @@ -0,0 +1,80 @@ +#!/usr/bin/env Rscript +# ============================================================ +# leafcutter_ds_merge.R +# Join per-part leafcutter_ds.R results and recompute the FDR over all clusters, +# for the differential_splicing_3 step of splicing_calling_leafcutter2.ipynb. +# +# Each part was tested separately, so its p.adjust column was corrected only within +# that part. The p-values themselves do not depend on the split, so the column is +# recomputed here with p.adjust(p, method = "fdr") over every cluster that has a +# p-value, as leafcutter_ds.R does in an unsplit run. Clusters without a p-value +# keep NA. +# +# Each _cluster_significance.txt is read with its _effect_sizes.txt +# sibling. Other paths are ignored, so a step's whole output list can be passed. +# Empty files (parts with no clusters) are skipped. Writes +# _cluster_significance.txt and _effect_sizes.txt. +# ============================================================ + +suppressPackageStartupMessages(library(argparser)) + +parser <- arg_parser("Join per-part leafcutter_ds.R results and recompute the FDR") +parser <- add_argument(parser, "--output-prefix", type = "character", help = "/ for the joined tables") +parser <- add_argument(parser, "--files", nargs = Inf, help = "per-part *_cluster_significance.txt files") +argv <- parse_args(parser) +if (is.na(argv$output_prefix)) stop("--output-prefix is required") +if (all(is.na(argv$files))) stop("--files is required") + +die <- function(...) { message("ERROR: ", ...); quit(status = 1) } + +SIG <- "_cluster_significance.txt" +EFF <- "_effect_sizes.txt" + +# Header and body lines of a table; NULL header for an empty file. +read_table <- function(path) { + lines <- vroom::vroom_lines(path) + lines <- lines[nzchar(trimws(lines))] + if (!length(lines)) list(header = NULL, body = character(0)) + else list(header = lines[[1L]], body = lines[-1L]) +} + +sig_files <- argv$files[endsWith(argv$files, SIG)] +if (!length(sig_files)) die("no *", SIG, " files given") + +sig_hdr <- eff_hdr <- NULL +rows <- list() +eff_rows <- character(0) +used <- 0L +for (s in sig_files) { + e <- paste0(substr(s, 1L, nchar(s) - nchar(SIG)), EFF) + if (!file.exists(e)) die(e, " is missing") + sig <- read_table(s) + eff <- read_table(e) + if (is.null(sig$header)) next + if (!is.null(sig_hdr) && sig$header != sig_hdr) die(s, " has a different header") + if (!is.null(eff$header) && !is.null(eff_hdr) && eff$header != eff_hdr) + die(e, " has a different header (were the groups the same?)") + sig_hdr <- sig$header + if (!is.null(eff$header)) eff_hdr <- eff$header + rows <- c(rows, strsplit(sig$body, "\t", fixed = TRUE)) + eff_rows <- c(eff_rows, eff$body) + used <- used + 1L +} +if (is.null(sig_hdr)) die("every part was empty; nothing was tested") + +cols <- strsplit(sig_hdr, "\t", fixed = TRUE)[[1]] +ip <- match("p", cols) +iq <- match("p.adjust", cols) +p <- vapply(rows, `[[`, "", ip) +tested <- !p %in% c("NA", "") +q <- rep("NA", length(rows)) +adj <- p.adjust(as.numeric(p[tested]), method = "fdr") +q[tested] <- as.character(adj) +for (i in seq_along(rows)) rows[[i]][[iq]] <- q[[i]] + +vroom::vroom_write_lines(c(sig_hdr, vapply(rows, paste, "", collapse = "\t")), + paste0(argv$output_prefix, SIG)) +vroom::vroom_write_lines(c(if (is.null(eff_hdr)) "" else eff_hdr, eff_rows), + paste0(argv$output_prefix, EFF)) +cat("parts with clusters ", used, " of ", length(sig_files), "; clusters ", length(rows), + "; tested ", sum(tested), "; FDR < 0.05 ", sum(adj < 0.05), "\n", sep = "") diff --git a/code/script/molecular_phenotypes/calling/leafcutter_ds_split.R b/code/script/molecular_phenotypes/calling/leafcutter_ds_split.R new file mode 100644 index 000000000..32243fd86 --- /dev/null +++ b/code/script/molecular_phenotypes/calling/leafcutter_ds_split.R @@ -0,0 +1,79 @@ +#!/usr/bin/env Rscript +# ============================================================ +# leafcutter_ds_split.R +# Split a LeafCutter intron count table into one table per chromosome, for the +# differential_splicing_1 step of splicing_calling_leafcutter2.ipynb. +# +# leafcutter_ds.R tests every cluster on its own, so the clusters can be tested in +# separate jobs and the results joined afterwards. Only the multiple-testing +# correction needs every cluster at once; leafcutter_ds_merge.R recomputes it. +# +# Rows go to parts 1-22 and X by their chromosome (a leading "chr" is ignored) and +# everything else (Y, MT, unplaced contigs) to "other". All 24 parts are always +# written, with the header, so the set of output files is fixed in advance; a part +# with no clusters holds the header only. +# +# With --groups, the groups file is checked against the count table first, so a +# naming mismatch stops the run here rather than in every per-part job. +# +# Writes .part_.counts.gz for each name in PARTS. +# ============================================================ + +suppressPackageStartupMessages(library(argparser)) + +parser <- arg_parser("Split a LeafCutter intron count table by chromosome") +parser <- add_argument(parser, "--counts", type = "character", help = "_perind_numers.counts.gz") +parser <- add_argument(parser, "--output-prefix", type = "character", help = "/ for the part files") +parser <- add_argument(parser, "--groups", type = "character", default = NA, + help = "optional groups file (sample, group, covariates) to check against the table") +argv <- parse_args(parser) +if (is.na(argv$counts)) stop("--counts is required") +if (is.na(argv$output_prefix)) stop("--output-prefix is required") + +die <- function(...) { message("ERROR: ", ...); quit(status = 1) } + +PARTS <- c(as.character(1:22), "X", "other") + +part_of <- function(intron_id) { + chrom <- sub("^chr", "", sub(":.*$", "", intron_id)) + ifelse(chrom %in% PARTS[-length(PARTS)], chrom, "other") +} + +# Fail early on the mistakes leafcutter_ds.R would otherwise hit in every part. +check_groups <- function(groups, header) { + columns <- strsplit(trimws(header), "\\s+")[[1]] + lines <- vroom::vroom_lines(groups) + rows <- strsplit(trimws(lines[nzchar(trimws(lines))]), "\\s+") + if (any(lengths(rows) < 2L)) + die(groups, " needs at least two columns: sample and group") + sample <- vapply(rows, `[[`, "", 1L) + group <- vapply(rows, `[[`, "", 2L) + used <- sample %in% columns + if (!any(used)) + die("no sample in ", groups, " matches a column of the count table. ", + "Column names look like: ", paste(head(sort(columns), 3L), collapse = " ")) + labels <- sort(unique(group[used])) + if (length(labels) != 2L) + die(groups, " gives ", length(labels), " groups (", paste(labels, collapse = ", "), + ") among the matched samples; leafcutter_ds compares exactly two") + n <- table(factor(group[used], labels)) + cat("groups: ", sum(used), " of ", length(rows), " samples matched; ", + paste0(labels, "=", n, collapse = ", "), "\n", sep = "") +} + +lines <- vroom::vroom_lines(argv$counts) +if (!length(lines) || !nzchar(trimws(lines[[1L]]))) die(argv$counts, " is empty") +header <- lines[[1L]] +body <- lines[-1L] +body <- body[nzchar(trimws(body))] +if (!is.na(argv$groups)) check_groups(argv$groups, header) + +d <- dirname(argv$output_prefix) +if (nzchar(d)) dir.create(d, showWarnings = FALSE, recursive = TRUE) +part <- factor(part_of(body), PARTS) +for (p in PARTS) + vroom::vroom_write_lines(c(header, body[part == p]), + paste0(argv$output_prefix, ".part_", p, ".counts.gz")) +n <- table(part) +cat("introns per part: ", paste0(PARTS, "=", n[PARTS], collapse = " "), "\n", sep = "") +cat("total ", length(body), "\n", sep = "") diff --git a/code/script/molecular_phenotypes/calling/regtools_junctions.sh b/code/script/molecular_phenotypes/calling/regtools_junctions.sh index b9d5e5879..0864af995 100755 --- a/code/script/molecular_phenotypes/calling/regtools_junctions.sh +++ b/code/script/molecular_phenotypes/calling/regtools_junctions.sh @@ -12,6 +12,12 @@ # NOTE: regtools 1.0.0's option parser stops at the first positional argument, # so ALL options (including -o) MUST precede the BAM. It also takes the strand # mode as the XS/RF/FR string (NOT an integer). +# +# --min-mapq N (default 0, off) keeps only reads with mapping quality >= N before +# extraction; regtools itself has no such filter, so reads that map to several places +# are otherwise counted at every one of them. STAR gives uniquely mapped reads 255 and +# multimappers 3 or less, so --min-mapq 255 keeps unique reads only. The filtered BAM +# is written beside --output and removed when the script exits. # ============================================================ set -euo pipefail @@ -21,6 +27,7 @@ MIN_ANCHOR=8 MIN_INTRON=50 MAX_INTRON=500000 STRANDNESS="" +MIN_MAPQ=0 while [[ $# -gt 0 ]]; do case "$1" in @@ -30,6 +37,7 @@ while [[ $# -gt 0 ]]; do --min-intron) MIN_INTRON="$2"; shift 2 ;; --max-intron) MAX_INTRON="$2"; shift 2 ;; --strandness) STRANDNESS="$2"; shift 2 ;; + --min-mapq) MIN_MAPQ="$2"; shift 2 ;; *) echo "Unknown argument: $1" >&2; exit 1 ;; esac done @@ -37,8 +45,18 @@ done : "${BAM:?--bam is required}" : "${OUTPUT:?--output is required}" : "${STRANDNESS:?--strandness is required (XS | RF | FR)}" +case "$MIN_MAPQ" in ""|*[!0-9]*) echo "--min-mapq must be a whole number, got '$MIN_MAPQ'" >&2; exit 1 ;; esac -samtools index "$BAM" +if [ "$MIN_MAPQ" -gt 0 ]; then + FILTERED="${OUTPUT}.mapq${MIN_MAPQ}.bam" + trap 'rm -f "$FILTERED" "$FILTERED.bai"' EXIT + samtools view -b -q "$MIN_MAPQ" -o "$FILTERED" "$BAM" + samtools index "$FILTERED" + READS="$FILTERED" +else + samtools index "$BAM" + READS="$BAM" +fi regtools junctions extract \ -a "$MIN_ANCHOR" -m "$MIN_INTRON" -M "$MAX_INTRON" -s "$STRANDNESS" \ - -o "$OUTPUT" "$BAM" + -o "$OUTPUT" "$READS" diff --git a/tests/fixtures/splicing_calling/leafcutter/SAMPLE_001.SJ.out.tab b/tests/fixtures/splicing_calling/leafcutter/SAMPLE_001.SJ.out.tab new file mode 100644 index 000000000..20a721a77 --- /dev/null +++ b/tests/fixtures/splicing_calling/leafcutter/SAMPLE_001.SJ.out.tab @@ -0,0 +1,407 @@ +chr22 11869899 11873840 1 1 0 1 0 86 +chr22 11873926 11876103 1 1 0 1 0 40 +chr22 11876133 11876223 1 1 0 2 0 73 +chr22 11876297 11882267 1 1 0 3 0 73 +chr22 11882339 11886400 1 1 0 1 0 71 +chr22 11890231 11891781 1 1 0 1 0 85 +chr22 12108049 12110445 2 1 0 1 0 127 +chr22 12314920 12319406 2 1 0 31 0 145 +chr22 12314920 12351351 2 1 0 25 0 145 +chr22 12512851 12549903 2 1 0 2 0 110 +chr22 12544737 12634286 2 1 0 5 0 115 +chr22 15154621 15157695 2 1 0 1 0 131 +chr22 15216222 15225210 2 1 0 18 0 143 +chr22 15624070 15624537 2 1 0 2 0 62 +chr22 15931908 15980703 1 1 0 2 0 110 +chr22 15970683 15972221 2 1 0 1 0 87 +chr22 15986486 15986827 1 1 0 1 0 101 +chr22 15986486 15988023 1 1 0 1 0 101 +chr22 15986486 15988705 1 1 0 1 0 101 +chr22 16064638 16071769 1 1 0 1 0 132 +chr22 16072823 16093709 1 1 0 1 0 76 +chr22 16168027 16188604 2 1 0 2 0 103 +chr22 16257035 16303779 1 1 0 1 0 93 +chr22 16449558 16497248 1 1 0 1 0 70 +chr22 16451669 16770416 2 1 0 11 0 148 +chr22 16451636 16770383 2 1 0 7 0 143 +chr22 16452845 16479532 2 1 0 1 0 122 +chr22 16452845 16480480 2 1 0 1 0 122 +chr22 16454319 16515913 2 1 0 7 0 119 +chr22 16479109 16480060 2 1 0 1 0 82 +chr22 16479109 16516734 2 1 0 4 0 135 +chr22 16479421 16480369 2 1 0 2 0 110 +chr22 16480033 16516706 2 1 0 3 0 145 +chr22 16634141 16666766 2 1 0 1 0 89 +chr22 16663722 16709953 2 1 0 2 0 81 +chr22 16663919 16710149 1 1 0 2 0 126 +chr22 16664774 16770383 2 1 0 5 0 143 +chr22 16702204 16703992 2 1 0 1 0 114 +chr22 16942269 16979012 1 1 0 1 0 97 +chr22 17207291 17209355 2 1 0 1 0 137 +chr22 17505017 17524117 1 1 0 1 0 133 +chr22 17563714 17569923 1 1 0 1 0 104 +chr22 17563714 17579744 1 1 0 2 0 128 +chr22 17598289 17600026 2 1 0 2 0 70 +chr22 17600096 17601091 2 1 0 3 0 90 +chr22 17601182 17612811 2 1 0 2 0 90 +chr22 17612879 17613210 2 1 0 1 0 67 +chr22 17613321 17619460 2 1 0 4 0 82 +chr22 17619527 17628602 2 1 0 4 0 75 +chr22 17631914 17632945 1 1 0 1 0 97 +chr22 17872024 17885877 2 1 0 1 0 82 +chr22 17886052 17887169 2 1 0 1 0 63 +chr22 17887233 17887322 2 1 0 1 0 63 +chr22 17896982 17899447 2 1 0 2 0 79 +chr22 17904840 17906548 2 1 0 2 0 127 +chr22 18052945 18053102 1 1 0 1 0 107 +chr22 18093278 18093587 2 1 0 1 0 113 +chr22 18124305 18126353 1 1 0 2 0 122 +chr22 18156480 18156581 1 1 0 1 0 111 +chr22 18536809 18537291 2 1 0 2 0 129 +chr22 18982579 18983091 2 1 0 1 0 110 +chr22 19057163 19063201 2 1 0 2 0 93 +chr22 19063279 19064847 2 1 0 1 0 77 +chr22 19176694 19176845 2 1 0 1 0 105 +chr22 19176951 19177119 2 1 0 2 0 105 +chr22 19388555 19392100 2 1 0 1 0 81 +chr22 19392215 19394341 2 1 0 1 0 114 +chr22 19450745 19454748 2 1 0 2 0 95 +chr22 19454831 19455679 2 1 0 5 0 89 +chr22 19720239 19720319 1 1 0 2 0 117 +chr22 19721958 19722236 1 1 0 1 0 87 +chr22 19722340 19722427 1 1 0 1 0 91 +chr22 20141531 20142755 1 1 0 1 0 94 +chr22 20465577 20471349 2 1 0 1 0 115 +chr22 20471516 20488984 2 1 0 1 0 80 +chr22 20507747 20537116 1 1 0 2 0 88 +chr22 20537205 20551435 1 1 0 4 0 88 +chr22 20551488 20553144 1 1 0 2 0 52 +chr22 20553175 20554935 1 1 0 2 0 30 +chr22 20573199 20595471 2 1 0 2 0 88 +chr22 20624186 20626095 2 1 0 2 0 88 +chr22 20708099 20709295 2 1 0 3 0 136 +chr22 20709380 20709907 2 1 0 2 0 90 +chr22 20709998 20710698 2 1 0 2 0 142 +chr22 20714701 20717707 2 1 0 1 0 71 +chr22 20717779 20718692 2 1 0 1 0 71 +chr22 20718823 20721297 2 1 0 1 0 84 +chr22 20727865 20729312 2 1 0 3 0 141 +chr22 20729507 20729631 2 1 0 6 0 136 +chr22 20734195 20734394 2 1 0 1 0 124 +chr22 20734554 20742227 2 1 0 5 0 139 +chr22 20742356 20742607 2 1 0 1 0 79 +chr22 20742765 20744627 2 1 0 2 0 93 +chr22 20744721 20747582 2 1 0 7 0 120 +chr22 20747703 20749904 2 1 0 2 0 120 +chr22 20749995 20751292 2 1 0 1 0 90 +chr22 20751756 20752902 2 1 0 2 0 108 +chr22 20753028 20753109 2 1 0 4 0 101 +chr22 20753181 20761303 2 1 0 1 0 71 +chr22 20765694 20793192 2 1 0 4 0 120 +chr22 20793244 20796145 2 1 0 2 0 79 +chr22 20796315 20798583 2 1 0 1 0 103 +chr22 20799277 20799670 2 1 0 3 0 145 +chr22 20799767 20801972 2 1 0 1 0 96 +chr22 20813507 20818482 2 1 0 4 0 149 +chr22 20818550 20819640 2 1 0 5 0 125 +chr22 20819901 20820538 2 1 0 1 0 129 +chr22 20834656 20838614 2 1 0 1 0 90 +chr22 20977777 20977887 1 1 0 2 0 75 +chr22 21476161 21476643 2 1 0 4 0 129 +chr22 21592957 21610856 1 1 0 2 0 117 +chr22 21611044 21621514 1 1 0 2 0 144 +chr22 21694818 21694936 1 1 0 1 0 96 +chr22 21695071 21695393 1 1 0 1 0 89 +chr22 21772983 21788256 2 1 0 1 0 132 +chr22 21788389 21788693 2 1 0 2 0 132 +chr22 22298212 22303223 1 1 0 3 0 74 +chr22 22303298 22303942 1 1 0 3 0 74 +chr22 22480000 22480319 1 1 0 1 0 80 +chr22 22625796 22626335 2 1 0 1 0 67 +chr22 22972281 23005786 2 1 0 1 0 83 +chr22 23132889 23261940 1 1 0 93 0 94 +chr22 23150155 23152460 1 1 0 1 0 66 +chr22 23152527 23153032 1 1 0 3 0 102 +chr22 23156033 23157991 1 1 0 1 0 52 +chr22 23158044 23158897 1 1 0 1 0 82 +chr22 23261055 23261354 1 1 0 2 0 92 +chr22 23285202 23287158 1 1 0 2 0 118 +chr22 23287279 23288096 1 1 0 1 0 76 +chr22 23288173 23289516 1 1 0 4 0 105 +chr22 23289622 23290338 1 1 0 2 0 105 +chr22 23292639 23295023 1 1 0 2 0 70 +chr22 23488859 23498483 1 1 0 2 0 67 +chr22 23709868 23714186 2 1 0 1 0 119 +chr22 23714343 23715008 2 1 0 1 0 80 +chr22 23884430 23884648 1 1 0 1 0 132 +chr22 23958702 23960293 2 1 0 2 0 88 +chr22 23960382 23961019 2 1 0 1 0 88 +chr22 23971624 23973767 2 1 0 1 0 83 +chr22 23980310 23980947 1 1 0 1 0 88 +chr22 23981036 23982627 1 1 0 2 0 88 +chr22 24011729 24035443 1 1 0 2 0 142 +chr22 24035521 24036088 1 1 0 2 0 93 +chr22 24036182 24038347 1 1 0 2 0 93 +chr22 24049221 24050824 1 1 0 2 0 68 +chr22 24063147 24064034 1 1 0 1 0 95 +chr22 24064188 24066986 1 1 0 1 0 141 +chr22 24302385 24313312 1 1 0 2 0 77 +chr22 24583809 24607953 1 1 0 1 0 110 +chr22 24597214 24641897 2 1 0 1 0 67 +chr22 24644800 24645635 1 1 0 2 0 110 +chr22 24645746 24647002 1 1 0 1 0 110 +chr22 24847797 24850279 1 1 0 2 0 121 +chr22 24855064 24855284 1 1 0 2 0 103 +chr22 25170939 25174239 1 1 0 1 0 86 +chr22 25672348 25674436 1 1 0 2 0 92 +chr22 25674529 25678815 1 1 0 2 0 92 +chr22 25711164 25714407 1 1 0 1 0 129 +chr22 25714571 25718244 1 1 0 1 0 135 +chr22 25718382 25721283 1 1 0 3 0 127 +chr22 26191700 26219905 2 1 0 2 0 53 +chr22 26375690 26377672 1 1 0 2 0 103 +chr22 26422240 26422567 2 1 0 1 0 57 +chr22 26657655 26663315 1 1 0 1 0 83 +chr22 26657655 26660698 1 1 0 1 0 101 +chr22 26663399 26665456 1 1 0 1 0 83 +chr22 26663399 26665530 1 1 0 1 0 83 +chr22 26666938 26668157 1 1 0 1 0 81 +chr22 26666938 26667184 1 1 0 1 0 126 +chr22 26667311 26668157 1 1 0 1 0 126 +chr22 28036844 28039911 2 1 0 2 0 77 +chr22 28037840 28087833 1 1 0 3 0 112 +chr22 28039959 28086882 2 1 0 1 0 69 +chr22 28083624 28133336 1 1 0 1 0 94 +chr22 28133487 28163920 2 1 0 2 0 88 +chr22 28134731 28165210 2 1 0 1 0 116 +chr22 28164006 28191650 2 1 0 1 0 85 +chr22 28164978 28192591 2 1 0 2 0 79 +chr22 28164978 28210438 2 1 0 1 0 79 +chr22 28168702 28196317 2 1 0 11 0 101 +chr22 28168702 28214160 2 1 0 9 0 101 +chr22 28507933 28530931 2 1 0 1 0 125 +chr22 28987202 29042494 1 1 0 2 0 88 +chr22 29215040 29231019 1 1 0 1 0 95 +chr22 29268350 29272215 1 1 0 2 0 47 +chr22 29272253 29272379 1 1 0 2 0 52 +chr22 29272432 29273740 1 1 0 2 0 56 +chr22 29334411 29338989 2 1 0 2 0 90 +chr22 29340858 29341500 2 1 0 2 0 96 +chr22 29350151 29351170 2 1 0 2 0 106 +chr22 29351267 29351704 2 1 0 1 0 96 +chr22 29359960 29363000 2 1 0 2 0 72 +chr22 29639213 29642201 1 1 0 1 0 84 +chr22 29642286 29654656 1 1 0 2 0 84 +chr22 29654726 29655593 1 1 0 1 0 69 +chr22 29655677 29658188 1 1 0 1 0 76 +chr22 29658265 29661204 1 1 0 1 0 76 +chr22 29668447 29671825 1 1 0 1 0 114 +chr22 29673487 29674835 1 1 0 2 0 134 +chr22 29731355 29738329 2 1 0 1 0 142 +chr22 29738442 29740649 2 1 0 1 0 97 +chr22 29991671 29998760 1 1 0 2 0 123 +chr22 30002994 30007113 1 1 0 2 0 93 +chr22 30013542 30016527 1 1 0 1 0 77 +chr22 30020885 30022028 1 1 0 1 0 88 +chr22 30339252 30340195 2 1 0 3 0 118 +chr22 30340382 30340694 2 1 0 3 0 101 +chr22 30342351 30342804 2 1 0 2 0 78 +chr22 30342880 30344932 2 1 0 1 0 75 +chr22 30529350 30532524 2 1 0 1 0 117 +chr22 30532714 30532796 2 1 0 1 0 91 +chr22 30787609 30837197 1 1 0 1 0 95 +chr22 30971780 30972854 1 1 0 2 0 111 +chr22 31212425 31225719 1 1 0 1 0 103 +chr22 31272705 31273451 1 1 0 1 0 56 +chr22 31273508 31275150 1 1 0 2 0 142 +chr22 31442119 31442961 2 1 0 1 0 94 +chr22 31450361 31454143 2 1 0 1 0 116 +chr22 31455316 31455851 2 1 0 2 0 115 +chr22 31837156 31838684 1 1 0 1 0 130 +chr22 31906067 31906204 1 1 0 1 0 83 +chr22 32475125 32478980 1 1 0 2 0 63 +chr22 32484125 32485067 1 1 0 6 0 98 +chr22 32491182 32493104 1 1 0 1 0 107 +chr22 32493282 32498143 1 1 0 1 0 86 +chr22 32941561 32942083 1 1 0 1 0 93 +chr22 32946477 32964214 1 1 0 1 0 76 +chr22 33138423 33156650 2 1 0 1 0 104 +chr22 33277256 33283201 2 1 0 1 0 88 +chr22 33382045 33384191 2 1 0 2 0 109 +chr22 33650669 33761370 2 1 0 1 0 127 +chr22 33761559 33919994 2 1 0 1 0 138 +chr22 34203460 34210229 2 1 0 2 0 136 +chr22 34550603 34612528 1 1 0 16 0 143 +chr22 34550817 34559624 1 1 0 9 0 122 +chr22 34550970 34559777 1 1 0 2 0 111 +chr22 34612557 34678316 1 1 0 2 0 126 +chr22 34613188 34678953 2 1 0 2 0 125 +chr22 34678317 34746583 1 1 0 2 0 113 +chr22 34746584 34780036 1 1 0 6 0 132 +chr22 34747997 34821455 1 1 0 2 0 131 +chr22 34788548 34793901 2 1 0 2 0 104 +chr22 35744250 35745922 2 1 0 2 0 119 +chr22 35745996 35746472 2 1 0 1 0 73 +chr22 35810005 35840191 2 1 0 1 0 105 +chr22 36289298 36291985 2 1 0 2 0 88 +chr22 36292235 36293328 2 1 0 1 0 113 +chr22 36301666 36302567 2 1 0 2 0 109 +chr22 36517432 36518762 2 1 0 2 0 101 +chr22 36518911 36519404 2 1 0 2 0 106 +chr22 36519538 36520575 2 1 0 2 0 122 +chr22 36523981 36524595 2 1 0 1 0 89 +chr22 36524733 36525663 2 1 0 2 0 134 +chr22 36525710 36525998 2 1 0 1 0 46 +chr22 37056412 37057397 1 1 0 2 0 96 +chr22 37057494 37059312 1 1 0 1 0 96 +chr22 37618547 37620237 1 1 0 1 0 115 +chr22 37620362 37620812 1 1 0 1 0 88 +chr22 37623468 37623551 1 1 0 1 0 82 +chr22 37623634 37624968 1 1 0 2 0 108 +chr22 37675712 37676985 1 1 0 3 0 80 +chr22 37677066 37678482 1 1 0 4 0 82 +chr22 37849483 37850014 1 1 0 2 0 49 +chr22 37850064 37851279 1 1 0 4 0 136 +chr22 37863039 37863271 1 1 0 1 0 74 +chr22 37863346 37870175 1 1 0 1 0 74 +chr22 37870348 37874369 1 1 0 1 0 115 +chr22 37876012 37877673 1 1 0 1 0 82 +chr22 37958100 38063244 2 1 0 12 0 67 +chr22 38019712 38020568 2 1 0 1 0 107 +chr22 38072611 38072999 1 1 0 2 0 93 +chr22 38073093 38073570 1 1 0 2 0 93 +chr22 38112306 38112503 2 1 0 2 0 107 +chr22 38294535 38298785 2 1 0 2 0 79 +chr22 38298935 38299894 2 1 0 2 0 95 +chr22 38299667 38344511 1 1 0 1 0 90 +chr22 38300953 38302860 2 1 0 1 0 103 +chr22 38442366 38474897 1 1 0 3 0 103 +chr22 38464739 38512094 2 1 0 2 0 53 +chr22 38486441 38487878 2 1 0 2 0 114 +chr22 38494803 38494885 2 1 0 2 0 113 +chr22 38495047 38495795 2 1 0 2 0 131 +chr22 38495938 38498084 2 1 0 1 0 66 +chr22 38498151 38498439 2 1 0 5 0 132 +chr22 38498574 38499399 2 1 0 2 0 100 +chr22 38499500 38501129 2 1 0 3 0 100 +chr22 38501281 38505950 2 1 0 3 0 126 +chr22 38682997 38683766 1 1 0 2 0 106 +chr22 38688002 38688934 2 1 0 1 0 131 +chr22 38689425 38699802 2 1 0 4 0 136 +chr22 38742556 38745683 2 1 0 3 0 128 +chr22 38745812 38748712 2 1 0 2 0 128 +chr22 38822834 38823082 2 1 0 3 0 116 +chr22 38823263 38826499 2 1 0 1 0 141 +chr22 38826748 38828286 2 1 0 2 0 103 +chr22 39134474 39141370 2 1 0 2 0 66 +chr22 39141437 39149788 2 1 0 2 0 66 +chr22 39149833 39152375 2 1 0 1 0 44 +chr22 39312985 39313190 2 1 0 4 0 120 +chr22 39313311 39313633 2 1 0 5 0 120 +chr22 39313730 39314106 2 1 0 4 0 96 +chr22 39314847 39315368 2 1 0 1 0 85 +chr22 39316842 39317460 2 1 0 1 0 74 +chr22 39317630 39318399 2 1 0 3 0 149 +chr22 39350110 39374315 1 1 0 1 0 122 +chr22 39376198 39381695 1 1 0 2 0 142 +chr22 39512495 39513516 1 1 0 1 0 133 +chr22 39520752 39521353 1 1 0 1 0 92 +chr22 39672309 39672948 1 1 0 1 0 104 +chr22 39674034 39677340 1 1 0 1 0 79 +chr22 39677420 39677986 1 1 0 1 0 79 +chr22 40277152 40277998 1 1 0 1 0 53 +chr22 40278045 40279994 1 1 0 1 0 52 +chr22 40280144 40285644 1 1 0 2 0 121 +chr22 40431481 40435498 2 1 0 2 0 76 +chr22 40435555 40463220 2 1 0 2 0 56 +chr22 40826667 40827095 2 1 0 1 0 105 +chr22 40827230 40829625 2 1 0 3 0 60 +chr22 40829675 40830839 2 1 0 3 0 49 +chr22 40835888 40840625 2 1 0 1 0 67 +chr22 40840693 40844838 2 1 0 1 0 67 +chr22 40844910 40848293 2 1 0 1 0 76 +chr22 40848370 40850822 2 1 0 1 0 76 +chr22 41168868 41169502 1 1 0 2 0 114 +chr22 41172664 41173622 1 1 0 2 0 141 +chr22 41224252 41224724 1 1 0 1 0 77 +chr22 41224802 41224966 1 1 0 2 0 77 +chr22 41229657 41230138 1 1 0 1 0 117 +chr22 41251110 41252871 2 1 0 3 0 120 +chr22 41252992 41254307 2 1 0 2 0 120 +chr22 41348168 41349119 1 1 0 1 0 92 +chr22 41394317 41395744 1 1 0 1 0 137 +chr22 41508050 41511875 1 1 0 5 0 116 +chr22 41511969 41515376 1 1 0 3 0 93 +chr22 41515536 41515766 1 1 0 2 0 133 +chr22 41522988 41523204 1 1 0 3 0 118 +chr22 41523942 41524845 1 1 0 1 0 89 +chr22 41524969 41525192 1 1 0 2 0 112 +chr22 41604154 41607261 2 1 0 1 0 102 +chr22 41621346 41621989 1 1 0 1 0 97 +chr22 41622087 41628117 1 1 0 2 0 97 +chr22 41637792 41646895 1 1 0 2 0 124 +chr22 41653691 41656902 1 1 0 2 0 94 +chr22 41675196 41680243 2 1 0 2 0 110 +chr22 41874020 41875336 1 1 0 1 0 79 +chr22 41875452 41875542 1 1 0 2 0 97 +chr22 41875725 41877228 1 1 0 2 0 99 +chr22 41877422 41877941 1 1 0 3 0 129 +chr22 41986113 41987205 1 1 0 1 0 76 +chr22 41987288 41987621 1 1 0 1 0 121 +chr22 41989685 41991572 1 1 0 4 0 107 +chr22 41991669 41992663 1 1 0 3 0 96 +chr22 41992764 41994289 1 1 0 1 0 57 +chr22 41994342 41994620 1 1 0 4 0 137 +chr22 41994715 41996901 1 1 0 2 0 94 +chr22 42514305 42514681 2 1 0 1 0 98 +chr22 42514780 42515150 2 1 0 2 0 98 +chr22 42588196 42601250 2 1 0 52 0 144 +chr22 42627390 42627604 2 1 0 1 0 84 +chr22 42627689 42628151 2 1 0 1 0 84 +chr22 42628282 42630881 2 1 0 1 0 107 +chr22 42630989 42631377 2 1 0 1 0 107 +chr22 42638428 42652595 1 1 0 2 0 102 +chr22 42871470 42876136 2 1 0 2 0 137 +chr22 42876334 42879047 2 1 0 1 0 122 +chr22 42884562 42888642 2 1 0 1 0 129 +chr22 42966245 43003477 2 1 0 1 0 113 +chr22 43059528 43063812 2 1 0 1 0 109 +chr22 43063922 43064189 2 1 0 1 0 109 +chr22 43069845 43075473 2 1 0 1 0 107 +chr22 43695769 43711474 2 1 0 1 0 95 +chr22 43765394 43782179 2 1 0 1 0 106 +chr22 43782326 43808994 2 1 0 1 0 95 +chr22 43955599 43963285 1 1 0 1 0 111 +chr22 43963397 43964451 1 1 0 2 0 111 +chr22 43964554 43968730 1 1 0 1 0 102 +chr22 43972343 43972870 1 1 0 2 0 113 +chr22 44612438 44612537 2 1 0 1 0 58 +chr22 44910704 44912634 2 1 0 2 0 93 +chr22 45116358 45121708 2 1 0 1 0 110 +chr22 45178901 45181285 1 1 0 1 0 82 +chr22 45181368 45183401 1 1 0 1 0 82 +chr22 45197217 45197789 2 1 0 2 0 141 +chr22 45200036 45202989 2 1 0 2 0 68 +chr22 45729591 45738730 1 1 0 1 0 103 +chr22 45738840 45740368 1 1 0 3 0 83 +chr22 46350464 46352120 1 1 0 1 0 54 +chr22 46352175 46352263 1 1 0 1 0 67 +chr22 46352331 46353766 1 1 0 2 0 101 +chr22 46353868 46355443 1 1 0 1 0 101 +chr22 46665707 46666824 1 1 0 1 0 58 +chr22 46666874 46668095 1 1 0 2 0 72 +chr22 46668168 46668688 1 1 0 1 0 72 +chr22 46690201 46691571 2 1 0 2 0 90 +chr22 46894429 46894783 1 1 0 2 0 94 +chr22 50133809 50155737 1 1 0 1 0 116 +chr22 50231075 50243609 2 1 0 1 0 49 +chr22 50255371 50255452 2 1 0 1 0 84 +chr22 50394136 50406688 1 1 0 1 0 109 +chr22 50439858 50439960 1 1 0 1 0 89 +chr22 50440050 50440821 1 1 0 1 0 107 +chr22 50600884 50601788 1 1 0 1 0 90 +chr22 50601895 50603222 1 1 0 1 0 99 +chr22 50704249 50704737 1 1 0 2 0 125 +chr22 50768875 50769040 2 1 0 2 0 84 +chr22 50769125 50769454 2 1 0 2 0 84 +chr22 50785294 50798654 1 1 0 2 0 133 diff --git a/tests/fixtures/splicing_calling/leafcutter/SAMPLE_002.SJ.out.tab b/tests/fixtures/splicing_calling/leafcutter/SAMPLE_002.SJ.out.tab new file mode 100644 index 000000000..24034904c --- /dev/null +++ b/tests/fixtures/splicing_calling/leafcutter/SAMPLE_002.SJ.out.tab @@ -0,0 +1,307 @@ +chr22 11478700 11478783 2 1 0 1 0 61 +chr22 11478906 11478990 2 1 0 2 0 115 +chr22 11903143 11903786 1 1 0 1 0 73 +chr22 12314920 12319406 2 1 0 23 0 141 +chr22 12319668 12364414 1 1 0 1 0 131 +chr22 12496724 12499629 1 1 0 2 0 86 +chr22 12602817 12604669 1 1 0 1 0 92 +chr22 12604740 12615408 1 1 0 1 0 84 +chr22 15179528 15181234 1 1 0 2 0 134 +chr22 15204087 15216344 1 1 0 4 0 81 +chr22 15215213 15224212 2 1 0 1 0 85 +chr22 15216378 15225366 1 1 0 8 0 143 +chr22 15497664 15536498 2 1 0 2 0 111 +chr22 15628579 15629735 2 1 0 1 0 121 +chr22 15968414 15974955 2 1 0 2 0 96 +chr22 15975052 15978296 2 1 0 2 0 96 +chr22 15990052 15990566 2 1 0 2 0 79 +chr22 16015723 16039593 2 1 0 1 0 95 +chr22 16168501 16189079 1 1 0 6 0 110 +chr22 16448463 16494312 2 1 0 3 0 110 +chr22 16448516 16494365 2 1 0 1 0 132 +chr22 16451949 16454633 2 1 0 1 0 95 +chr22 16455437 16480376 2 1 0 2 0 99 +chr22 16561786 16562232 1 1 0 1 0 84 +chr22 16663722 16709953 2 1 0 5 0 126 +chr22 17006087 17029339 2 1 0 1 0 89 +chr22 17581160 17581357 1 1 0 1 0 56 +chr22 17581414 17582562 1 1 0 1 0 66 +chr22 17583535 17587135 1 1 0 1 0 116 +chr22 17592737 17594528 2 1 0 2 0 101 +chr22 17594617 17598193 2 1 0 1 0 88 +chr22 17738230 17739348 2 1 0 1 0 123 +chr22 17810814 17816689 2 1 0 2 0 95 +chr22 18053044 18053203 2 1 0 2 0 76 +chr22 18156582 18156683 1 1 0 1 0 123 +chr22 18980781 18981235 2 1 0 2 0 63 +chr22 19361342 19361726 2 1 0 1 0 80 +chr22 19361932 19375630 2 1 0 1 0 140 +chr22 19471809 19475067 2 1 0 2 0 53 +chr22 19475101 19475469 2 1 0 2 0 51 +chr22 19720239 19720319 1 1 0 1 0 75 +chr22 19720667 19720767 1 1 0 1 0 85 +chr22 19941898 19961198 1 1 0 2 0 91 +chr22 20717779 20718692 2 1 0 1 0 123 +chr22 20718823 20721297 2 1 0 1 0 85 +chr22 20727865 20729312 2 1 0 2 0 69 +chr22 20742765 20744627 2 1 0 1 0 93 +chr22 20744721 20747582 2 1 0 1 0 93 +chr22 20749995 20751292 2 1 0 2 0 84 +chr22 20751377 20751673 2 1 0 1 0 84 +chr22 20751756 20752902 2 1 0 1 0 125 +chr22 20753028 20753109 2 1 0 2 0 125 +chr22 20753181 20761303 2 1 0 2 0 83 +chr22 20761387 20764816 2 1 0 1 0 83 +chr22 20796315 20798583 2 1 0 5 0 89 +chr22 20805166 20807361 2 1 0 1 0 90 +chr22 20811033 20813357 2 1 0 1 0 92 +chr22 20990526 20991627 1 1 0 2 0 132 +chr22 21708571 21721654 2 1 0 2 0 65 +chr22 21806040 21807663 2 1 0 4 0 149 +chr22 22303298 22303942 1 1 0 1 0 103 +chr22 22475590 22478040 2 1 0 2 0 70 +chr22 23132889 23261940 1 1 0 71 0 99 +chr22 23261541 23268407 1 1 0 1 0 108 +chr22 23271593 23273080 1 1 0 1 0 56 +chr22 23273134 23273633 1 1 0 1 0 53 +chr22 23295156 23309423 1 1 0 2 0 74 +chr22 23309484 23310323 1 1 0 2 0 60 +chr22 23314074 23314551 1 1 0 2 0 106 +chr22 23546896 23547897 2 1 0 1 0 133 +chr22 23958702 23960293 2 1 0 2 0 88 +chr22 23960382 23961019 2 1 0 2 0 88 +chr22 23980310 23980947 1 1 0 2 0 88 +chr22 23981036 23982627 1 1 0 2 0 88 +chr22 24043085 24049090 1 1 0 1 0 104 +chr22 24050975 24054872 1 1 0 1 0 89 +chr22 24225653 24226075 2 1 0 4 0 98 +chr22 24270984 24302194 1 1 0 1 0 78 +chr22 24549002 24555614 2 1 0 1 0 102 +chr22 24597617 24642941 1 1 0 2 0 76 +chr22 25049365 25170819 1 1 0 2 0 128 +chr22 25376009 25381380 2 1 0 1 0 84 +chr22 26293147 26294291 1 1 0 2 0 123 +chr22 26297081 26298983 1 1 0 4 0 118 +chr22 26299170 26305978 1 1 0 1 0 130 +chr22 26313903 26340435 1 1 0 2 0 145 +chr22 26422240 26422567 2 1 0 1 0 97 +chr22 26502053 26503665 2 1 0 1 0 102 +chr22 26503794 26506302 2 1 0 1 0 99 +chr22 26526268 26528213 2 1 0 1 0 49 +chr22 26528263 26532694 2 1 0 1 0 51 +chr22 26532746 26536287 2 1 0 1 0 51 +chr22 26672988 26693680 1 1 0 1 0 95 +chr22 27858510 27860130 2 1 0 1 0 90 +chr22 27898026 27910963 2 1 0 1 0 110 +chr22 28036844 28039911 2 1 0 4 0 95 +chr22 28036892 28086882 2 1 0 1 0 110 +chr22 28037499 28087492 1 1 0 1 0 67 +chr22 28038098 28088091 1 1 0 1 0 97 +chr22 28038396 28041459 2 1 0 2 0 128 +chr22 28039959 28086882 2 1 0 1 0 110 +chr22 28040567 28087492 1 1 0 4 0 115 +chr22 28041006 28087935 2 1 0 1 0 88 +chr22 28096409 28098914 2 1 0 1 0 98 +chr22 28101281 28105278 2 1 0 1 0 93 +chr22 28168702 28196317 2 1 0 6 0 107 +chr22 28168702 28214160 2 1 0 6 0 107 +chr22 28192314 28210160 1 1 0 1 0 82 +chr22 28807709 28847632 2 1 0 1 0 75 +chr22 29098954 29121356 1 1 0 1 0 76 +chr22 29121482 29125262 1 1 0 1 0 134 +chr22 29273865 29278029 1 1 0 1 0 97 +chr22 29287135 29288605 1 1 0 2 0 109 +chr22 29339134 29339753 2 1 0 2 0 81 +chr22 29339775 29340655 2 1 0 2 0 117 +chr22 29351267 29351704 2 1 0 1 0 121 +chr22 29351826 29354649 2 1 0 2 0 121 +chr22 29354872 29358725 2 1 0 1 0 104 +chr22 29359960 29363000 2 1 0 4 0 136 +chr22 29543543 29544459 2 1 0 2 0 111 +chr22 29544604 29549051 2 1 0 2 0 107 +chr22 29549159 29550727 2 1 0 2 0 107 +chr22 29560829 29561170 2 1 0 1 0 37 +chr22 29561203 29561505 2 1 0 1 0 82 +chr22 29561647 29561791 2 1 0 1 0 139 +chr22 29806291 29806484 2 1 0 2 0 69 +chr22 29806554 29806796 2 1 0 2 0 69 +chr22 29934118 29940030 1 1 0 1 0 59 +chr22 29943967 29957035 1 1 0 2 0 53 +chr22 29957089 29970975 1 1 0 2 0 53 +chr22 30020885 30022028 1 1 0 2 0 144 +chr22 31099180 31099744 1 1 0 1 0 121 +chr22 31099897 31100884 1 1 0 1 0 133 +chr22 31258427 31259120 1 1 0 1 0 85 +chr22 31260078 31262133 1 1 0 1 0 106 +chr22 31262240 31262594 1 1 0 1 0 106 +chr22 31327310 31328786 2 1 0 1 0 125 +chr22 31420426 31423279 1 1 0 1 0 120 +chr22 31426783 31427059 1 1 0 3 0 140 +chr22 31442119 31442961 2 1 0 1 0 84 +chr22 31619837 31620552 2 1 0 2 0 81 +chr22 31620714 31620995 2 1 0 1 0 120 +chr22 31621143 31621333 2 1 0 1 0 110 +chr22 31934450 31937915 2 1 0 1 0 102 +chr22 32849535 32857248 1 1 0 2 0 64 +chr22 33316249 33337645 2 1 0 2 0 144 +chr22 34550817 34559624 1 1 0 5 0 144 +chr22 34746584 34780036 1 1 0 1 0 126 +chr22 34788548 34793901 2 1 0 3 0 96 +chr22 34793783 34821876 2 1 0 1 0 125 +chr22 35299981 35317876 1 1 0 1 0 85 +chr22 35317962 35321958 1 1 0 2 0 85 +chr22 35322038 35323027 1 1 0 1 0 79 +chr22 36305103 36305929 2 1 0 2 0 115 +chr22 36320364 36320797 2 1 0 2 0 106 +chr22 36341527 36348903 2 1 0 3 0 86 +chr22 36498157 36501240 2 1 0 1 0 99 +chr22 36501408 36504097 2 1 0 1 0 80 +chr22 37632516 37632600 1 1 0 2 0 83 +chr22 37677066 37678482 1 1 0 1 0 125 +chr22 37678655 37679602 1 1 0 1 0 82 +chr22 37755191 37755549 1 1 0 1 0 78 +chr22 37755660 37757612 1 1 0 1 0 104 +chr22 37819587 37827640 1 1 0 2 0 90 +chr22 37878172 37886764 1 1 0 2 0 145 +chr22 37886846 37888425 1 1 0 1 0 81 +chr22 37932680 37932797 1 1 0 1 0 80 +chr22 37932889 37933038 1 1 0 1 0 74 +chr22 37933113 37937079 1 1 0 1 0 74 +chr22 37958100 38063244 2 1 0 14 0 67 +chr22 38224980 38225423 2 1 0 2 0 133 +chr22 38230745 38231243 2 1 0 1 0 91 +chr22 38231335 38245934 2 1 0 2 0 104 +chr22 38298935 38299894 2 1 0 2 0 131 +chr22 38303421 38314081 2 1 0 2 0 89 +chr22 38314170 38317159 2 1 0 1 0 88 +chr22 38488116 38492055 2 1 0 2 0 86 +chr22 38492116 38493709 2 1 0 2 0 60 +chr22 38494132 38494629 2 1 0 2 0 148 +chr22 38494803 38494885 2 1 0 3 0 89 +chr22 38495938 38498084 2 1 0 3 0 120 +chr22 38498151 38498439 2 1 0 3 0 118 +chr22 38498574 38499399 2 1 0 2 0 100 +chr22 38499500 38501129 2 1 0 2 0 100 +chr22 38501281 38505950 2 1 0 1 0 109 +chr22 38736381 38738172 2 1 0 1 0 85 +chr22 38739427 38739721 2 1 0 1 0 105 +chr22 38742556 38745683 2 1 0 2 0 103 +chr22 38826748 38828286 2 1 0 2 0 69 +chr22 39313311 39313633 2 1 0 5 0 120 +chr22 39313730 39314106 2 1 0 4 0 102 +chr22 39314209 39314685 2 1 0 2 0 102 +chr22 39314847 39315368 2 1 0 3 0 142 +chr22 39315556 39316705 2 1 0 2 0 123 +chr22 39415654 39416790 1 1 0 1 0 80 +chr22 39417850 39418731 1 1 0 1 0 83 +chr22 39486249 39487346 1 1 0 3 0 127 +chr22 39520752 39521353 1 1 0 1 0 89 +chr22 40178141 40246014 1 1 0 2 0 46 +chr22 40277152 40277998 1 1 0 1 0 55 +chr22 40278045 40279994 1 1 0 1 0 50 +chr22 40280144 40281118 1 1 0 1 0 78 +chr22 40285771 40300454 1 1 0 1 0 111 +chr22 40312998 40315282 1 1 0 1 0 104 +chr22 40315508 40315941 1 1 0 2 0 71 +chr22 40316013 40321089 1 1 0 2 0 71 +chr22 40363072 40364275 1 1 0 1 0 90 +chr22 40364366 40364879 1 1 0 1 0 90 +chr22 40365057 40366435 1 1 0 1 0 97 +chr22 40370689 40400695 1 1 0 1 0 118 +chr22 40400814 40401592 1 1 0 1 0 118 +chr22 40409526 40409681 1 1 0 2 0 106 +chr22 40552368 40594673 2 1 0 1 0 136 +chr22 40815969 40837397 2 1 0 2 0 61 +chr22 40827230 40829625 2 1 0 1 0 105 +chr22 40829675 40830839 2 1 0 1 0 117 +chr22 40830957 40832568 2 1 0 7 0 139 +chr22 40832672 40835559 2 1 0 4 0 111 +chr22 40835671 40835802 2 1 0 5 0 111 +chr22 40835888 40840625 2 1 0 3 0 85 +chr22 40840693 40844838 2 1 0 2 0 71 +chr22 40844910 40848293 2 1 0 3 0 73 +chr22 40865606 40883639 1 1 0 1 0 128 +chr22 40882178 40886312 1 1 0 1 0 76 +chr22 40886516 40907586 1 1 0 1 0 63 +chr22 40907650 40909121 1 1 0 1 0 63 +chr22 41135907 41137652 1 1 0 1 0 78 +chr22 41137791 41140139 1 1 0 1 0 85 +chr22 41140258 41141047 1 1 0 2 0 84 +chr22 41169617 41170405 1 1 0 3 0 145 +chr22 41170572 41172498 1 1 0 1 0 136 +chr22 41224252 41224724 1 1 0 2 0 77 +chr22 41224802 41224966 1 1 0 2 0 77 +chr22 41246673 41249329 2 1 0 2 0 122 +chr22 41249452 41249728 2 1 0 2 0 130 +chr22 41348168 41349119 1 1 0 1 0 136 +chr22 41351647 41355468 1 1 0 1 0 88 +chr22 41355603 41355756 1 1 0 3 0 94 +chr22 41394317 41395744 1 1 0 1 0 136 +chr22 41518573 41520170 1 1 0 4 0 106 +chr22 41520277 41522829 1 1 0 4 0 150 +chr22 41522988 41523204 1 1 0 2 0 89 +chr22 41523942 41524845 1 1 0 2 0 87 +chr22 41525349 41526261 1 1 0 2 0 148 +chr22 41526454 41527287 1 1 0 1 0 133 +chr22 41577441 41577807 2 1 0 1 0 78 +chr22 41647083 41650722 1 1 0 2 0 107 +chr22 41658353 41661330 1 1 0 2 0 114 +chr22 41661445 41663621 1 1 0 1 0 114 +chr22 41675196 41680243 2 1 0 1 0 101 +chr22 41690844 41693462 1 1 0 1 0 95 +chr22 41867281 41868610 1 1 0 4 0 139 +chr22 41868793 41870888 1 1 0 2 0 99 +chr22 41897162 41898648 1 1 0 1 0 130 +chr22 41898782 41900329 1 1 0 1 0 118 +chr22 42086315 42087059 2 1 0 1 0 130 +chr22 42087176 42090605 2 1 0 1 0 99 +chr22 42558458 42560185 1 1 0 2 0 80 +chr22 42560266 42571120 1 1 0 2 0 80 +chr22 42627390 42627604 2 1 0 2 0 84 +chr22 42627689 42628151 2 1 0 1 0 84 +chr22 42630989 42631377 2 1 0 1 0 73 +chr22 42631451 42636714 2 1 0 2 0 79 +chr22 42758545 42783296 1 1 0 1 0 70 +chr22 42817858 42822269 2 1 0 1 0 78 +chr22 42822410 42823655 2 1 0 1 0 138 +chr22 42882305 42884385 2 1 0 2 0 117 +chr22 43059528 43063812 2 1 0 1 0 109 +chr22 43063922 43064189 2 1 0 2 0 109 +chr22 43716973 43731698 2 1 0 2 0 113 +chr22 43826114 43829059 2 1 0 1 0 115 +chr22 45197949 45199847 2 1 0 2 0 115 +chr22 45203986 45205216 2 1 0 3 0 116 +chr22 45205319 45205629 2 1 0 2 0 102 +chr22 45205708 45205792 2 1 0 1 0 78 +chr22 45205913 45211955 2 1 0 2 0 97 +chr22 45533165 45533760 1 1 0 2 0 134 +chr22 45689904 45692995 1 1 0 1 0 83 +chr22 45693079 45700281 1 1 0 1 0 83 +chr22 45702848 45718412 1 1 0 2 0 115 +chr22 45718494 45729424 1 1 0 1 0 81 +chr22 46439007 46440447 2 1 0 2 0 61 +chr22 46491496 46531436 2 1 0 1 0 113 +chr22 46665707 46666824 1 1 0 1 0 73 +chr22 46666874 46668095 1 1 0 1 0 49 +chr22 46668909 46672842 1 1 0 1 0 84 +chr22 46723478 46768343 1 1 0 1 0 120 +chr22 49669615 49669737 2 1 0 2 0 93 +chr22 49669615 49669696 2 1 0 2 0 115 +chr22 49669797 49669948 1 1 0 1 0 73 +chr22 50074333 50076840 2 1 0 2 0 112 +chr22 50076913 50077400 2 1 0 1 0 72 +chr22 50224257 50224331 2 1 0 2 0 89 +chr22 50280072 50280488 2 1 0 1 0 78 +chr22 50386257 50407997 2 1 0 1 0 107 +chr22 50408897 50450302 2 1 0 1 0 69 +chr22 50414690 50416091 1 1 0 1 0 67 +chr22 50416158 50418866 1 1 0 2 0 113 +chr22 50418980 50419348 1 1 0 1 0 113 +chr22 50466483 50466604 2 1 0 2 0 106 +chr22 50466711 50467337 2 1 0 1 0 106 +chr22 50517483 50517576 1 1 0 1 0 85 +chr22 50517662 50517740 1 1 0 1 0 85 +chr22 50518053 50518132 1 1 0 1 0 79 +chr22 50522040 50522180 1 1 0 2 0 71 +chr22 50522252 50522342 1 1 0 2 0 71 +chr22 50722438 50730720 1 1 0 1 0 88 diff --git a/tests/fixtures/splicing_calling/leafcutter/protocol_example.bam_list.txt b/tests/fixtures/splicing_calling/leafcutter/protocol_example.bam_list.txt new file mode 100644 index 000000000..592a70c7d --- /dev/null +++ b/tests/fixtures/splicing_calling/leafcutter/protocol_example.bam_list.txt @@ -0,0 +1,2 @@ +sample_id strand coord_bam_list SJ_list +SAMPLE_001 XS protocol_example.chr22_16M_17M.bam NA diff --git a/tests/fixtures/splicing_calling/leafcutter/protocol_example.junction_files.txt b/tests/fixtures/splicing_calling/leafcutter/protocol_example.junction_files.txt new file mode 100644 index 000000000..360c19958 --- /dev/null +++ b/tests/fixtures/splicing_calling/leafcutter/protocol_example.junction_files.txt @@ -0,0 +1,2 @@ +tests/fixtures/splicing_calling/leafcutter/SAMPLE_001.junc.gz +tests/fixtures/splicing_calling/leafcutter/SAMPLE_002.junc.gz diff --git a/tests/fixtures/splicing_calling/leafcutter/protocol_example.sample_list.txt b/tests/fixtures/splicing_calling/leafcutter/protocol_example.sample_list.txt new file mode 100644 index 000000000..0e072cc91 --- /dev/null +++ b/tests/fixtures/splicing_calling/leafcutter/protocol_example.sample_list.txt @@ -0,0 +1,3 @@ +sample_id strand coord_bam_list SJ_list +SAMPLE_001 rf SAMPLE_001.Aligned.sortedByCoord.out.bam SAMPLE_001.SJ.out.tab +SAMPLE_002 rf SAMPLE_002.Aligned.sortedByCoord.out.bam SAMPLE_002.SJ.out.tab diff --git a/tests/fixtures/splicing_calling/leafcutter/reference/Homo_sapiens.GRCh38.103.chr22.leafcutter2.reformatted.gtf b/tests/fixtures/splicing_calling/leafcutter/reference/Homo_sapiens.GRCh38.103.chr22.leafcutter2.reformatted.gtf new file mode 100644 index 000000000..7e6135133 --- /dev/null +++ b/tests/fixtures/splicing_calling/leafcutter/reference/Homo_sapiens.GRCh38.103.chr22.leafcutter2.reformatted.gtf @@ -0,0 +1,320 @@ +chr22 havana gene 16428947 16476870 . - . gene_id "ENSG00000227367"; gene_version "1"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; +chr22 havana transcript 16428947 16476870 . - . gene_id "ENSG00000227367"; gene_version "1"; transcript_id "ENST00000421957"; transcript_version "1"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC9B1P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16476699 16476870 . - . gene_id "ENSG00000227367"; gene_version "1"; transcript_id "ENST00000421957"; transcript_version "1"; exon_number "1"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC9B1P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001666715"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16474088 16474229 . - . gene_id "ENSG00000227367"; gene_version "1"; transcript_id "ENST00000421957"; transcript_version "1"; exon_number "2"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC9B1P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001754042"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16472852 16472978 . - . gene_id "ENSG00000227367"; gene_version "1"; transcript_id "ENST00000421957"; transcript_version "1"; exon_number "3"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC9B1P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001671201"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16459930 16460104 . - . gene_id "ENSG00000227367"; gene_version "1"; transcript_id "ENST00000421957"; transcript_version "1"; exon_number "4"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC9B1P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001767092"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16439313 16439391 . - . gene_id "ENSG00000227367"; gene_version "1"; transcript_id "ENST00000421957"; transcript_version "1"; exon_number "5"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC9B1P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001695368"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16438287 16438437 . - . gene_id "ENSG00000227367"; gene_version "1"; transcript_id "ENST00000421957"; transcript_version "1"; exon_number "6"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC9B1P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001643934"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16434364 16434454 . - . gene_id "ENSG00000227367"; gene_version "1"; transcript_id "ENST00000421957"; transcript_version "1"; exon_number "7"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC9B1P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001719021"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16433326 16433461 . - . gene_id "ENSG00000227367"; gene_version "1"; transcript_id "ENST00000421957"; transcript_version "1"; exon_number "8"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC9B1P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001782535"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16428947 16429161 . - . gene_id "ENSG00000227367"; gene_version "1"; transcript_id "ENST00000421957"; transcript_version "1"; exon_number "9"; gene_name "SLC9B1P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC9B1P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001557721"; exon_version "2"; tag "basic"; transcript_support_level "NA"; +chr22 ensembl gene 16486985 16488322 . + . gene_id "ENSG00000280263"; gene_version "1"; gene_name "ACTR3BP6"; gene_source "ensembl"; gene_biotype "processed_pseudogene"; +chr22 ensembl transcript 16486985 16488322 . + . gene_id "ENSG00000280263"; gene_version "1"; transcript_id "ENST00000623630"; transcript_version "1"; gene_name "ACTR3BP6"; gene_source "ensembl"; gene_biotype "processed_pseudogene"; transcript_name "ACTR3BP6-201"; transcript_source "ensembl"; transcript_type "processed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 ensembl exon 16486985 16488322 . + . gene_id "ENSG00000280263"; gene_version "1"; transcript_id "ENST00000623630"; transcript_version "1"; exon_number "1"; gene_name "ACTR3BP6"; gene_source "ensembl"; gene_biotype "processed_pseudogene"; transcript_name "ACTR3BP6-201"; transcript_source "ensembl"; transcript_type "processed_pseudogene"; exon_id "ENSE00003758877"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana gene 16503304 16509475 . + . gene_id "ENSG00000235969"; gene_version "1"; gene_name "CHEK2P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; +chr22 havana transcript 16503304 16509475 . + . gene_id "ENSG00000235969"; gene_version "1"; transcript_id "ENST00000450340"; transcript_version "1"; gene_name "CHEK2P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "CHEK2P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16503304 16503376 . + . gene_id "ENSG00000235969"; gene_version "1"; transcript_id "ENST00000450340"; transcript_version "1"; exon_number "1"; gene_name "CHEK2P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "CHEK2P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001677472"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16508155 16508239 . + . gene_id "ENSG00000235969"; gene_version "1"; transcript_id "ENST00000450340"; transcript_version "1"; exon_number "2"; gene_name "CHEK2P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "CHEK2P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001767761"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16509388 16509475 . + . gene_id "ENSG00000235969"; gene_version "1"; transcript_id "ENST00000450340"; transcript_version "1"; exon_number "3"; gene_name "CHEK2P4"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "CHEK2P4-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001608172"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana gene 16521059 16527237 . + . gene_id "ENSG00000273362"; gene_version "1"; gene_name "AP000547.2"; gene_source "havana"; gene_biotype "lncRNA"; +chr22 havana transcript 16521059 16527237 . + . gene_id "ENSG00000273362"; gene_version "1"; transcript_id "ENST00000609641"; transcript_version "1"; gene_name "AP000547.2"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.2-201"; transcript_source "havana"; transcript_type "lncRNA"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16521059 16521289 . + . gene_id "ENSG00000273362"; gene_version "1"; transcript_id "ENST00000609641"; transcript_version "1"; exon_number "1"; gene_name "AP000547.2"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.2-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003706382"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16525947 16526113 . + . gene_id "ENSG00000273362"; gene_version "1"; transcript_id "ENST00000609641"; transcript_version "1"; exon_number "2"; gene_name "AP000547.2"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.2-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003707054"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16526975 16527237 . + . gene_id "ENSG00000273362"; gene_version "1"; transcript_id "ENST00000609641"; transcript_version "1"; exon_number "3"; gene_name "AP000547.2"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.2-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003702906"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana gene 16572027 16574637 . + . gene_id "ENSG00000233995"; gene_version "1"; gene_name "AP000547.1"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; +chr22 havana transcript 16572027 16574637 . + . gene_id "ENSG00000233995"; gene_version "1"; transcript_id "ENST00000454360"; transcript_version "1"; gene_name "AP000547.1"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "AP000547.1-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16572027 16572150 . + . gene_id "ENSG00000233995"; gene_version "1"; transcript_id "ENST00000454360"; transcript_version "1"; exon_number "1"; gene_name "AP000547.1"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "AP000547.1-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001732752"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16572708 16572753 . + . gene_id "ENSG00000233995"; gene_version "1"; transcript_id "ENST00000454360"; transcript_version "1"; exon_number "2"; gene_name "AP000547.1"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "AP000547.1-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001623204"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16573044 16573212 . + . gene_id "ENSG00000233995"; gene_version "1"; transcript_id "ENST00000454360"; transcript_version "1"; exon_number "3"; gene_name "AP000547.1"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "AP000547.1-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001597534"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16573422 16573527 . + . gene_id "ENSG00000233995"; gene_version "1"; transcript_id "ENST00000454360"; transcript_version "1"; exon_number "4"; gene_name "AP000547.1"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "AP000547.1-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001739921"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16574466 16574637 . + . gene_id "ENSG00000233995"; gene_version "1"; transcript_id "ENST00000454360"; transcript_version "1"; exon_number "5"; gene_name "AP000547.1"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "AP000547.1-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00001596670"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana gene 16575363 16582707 . - . gene_id "ENSG00000239435"; gene_version "2"; gene_name "KCNMB3P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; +chr22 havana transcript 16575363 16582707 . - . gene_id "ENSG00000239435"; gene_version "2"; transcript_id "ENST00000493696"; transcript_version "2"; gene_name "KCNMB3P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "KCNMB3P1-202"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16582507 16582707 . - . gene_id "ENSG00000239435"; gene_version "2"; transcript_id "ENST00000493696"; transcript_version "2"; exon_number "1"; gene_name "KCNMB3P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "KCNMB3P1-202"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001930505"; exon_version "2"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16580811 16581287 . - . gene_id "ENSG00000239435"; gene_version "2"; transcript_id "ENST00000493696"; transcript_version "2"; exon_number "2"; gene_name "KCNMB3P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "KCNMB3P1-202"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001839032"; exon_version "2"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16575363 16578073 . - . gene_id "ENSG00000239435"; gene_version "2"; transcript_id "ENST00000493696"; transcript_version "2"; exon_number "3"; gene_name "KCNMB3P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "KCNMB3P1-202"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00003755408"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana transcript 16581077 16582602 . - . gene_id "ENSG00000239435"; gene_version "2"; transcript_id "ENST00000472972"; transcript_version "1"; gene_name "KCNMB3P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "KCNMB3P1-201"; transcript_source "havana"; transcript_type "processed_transcript"; transcript_support_level "2"; +chr22 havana exon 16582507 16582602 . - . gene_id "ENSG00000239435"; gene_version "2"; transcript_id "ENST00000472972"; transcript_version "1"; exon_number "1"; gene_name "KCNMB3P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "KCNMB3P1-201"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001937172"; exon_version "1"; transcript_support_level "2"; +chr22 havana exon 16581077 16581287 . - . gene_id "ENSG00000239435"; gene_version "2"; transcript_id "ENST00000472972"; transcript_version "1"; exon_number "2"; gene_name "KCNMB3P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "KCNMB3P1-201"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001878881"; exon_version "1"; transcript_support_level "2"; +chr22 ensembl_havana gene 16590751 16592810 . - . gene_id "ENSG00000198445"; gene_version "4"; gene_name "CCT8L2"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; +chr22 ensembl_havana transcript 16590751 16592810 . - . gene_id "ENSG00000198445"; gene_version "4"; transcript_id "ENST00000359963"; transcript_version "4"; gene_name "CCT8L2"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CCT8L2-201"; transcript_source "ensembl_havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS13738"; tag "basic"; transcript_support_level "NA"; +chr22 ensembl_havana exon 16590751 16592810 . - . gene_id "ENSG00000198445"; gene_version "4"; transcript_id "ENST00000359963"; transcript_version "4"; exon_number "1"; gene_name "CCT8L2"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CCT8L2-201"; transcript_source "ensembl_havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS13738"; exon_id "ENSE00001806026"; exon_version "2"; tag "basic"; transcript_support_level "NA"; +chr22 ensembl_havana CDS 16590880 16592550 . - 0 gene_id "ENSG00000198445"; gene_version "4"; transcript_id "ENST00000359963"; transcript_version "4"; exon_number "1"; gene_name "CCT8L2"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CCT8L2-201"; transcript_source "ensembl_havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS13738"; protein_id "ENSP00000353048"; protein_version "3"; tag "basic"; transcript_support_level "NA"; +chr22 ensembl_havana start_codon 16592548 16592550 . - 0 gene_id "ENSG00000198445"; gene_version "4"; transcript_id "ENST00000359963"; transcript_version "4"; exon_number "1"; gene_name "CCT8L2"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CCT8L2-201"; transcript_source "ensembl_havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS13738"; tag "basic"; transcript_support_level "NA"; +chr22 ensembl_havana stop_codon 16590877 16590879 . - 0 gene_id "ENSG00000198445"; gene_version "4"; transcript_id "ENST00000359963"; transcript_version "4"; exon_number "1"; gene_name "CCT8L2"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CCT8L2-201"; transcript_source "ensembl_havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS13738"; tag "basic"; transcript_support_level "NA"; +chr22 ensembl_havana five_prime_utr 16592551 16592810 . - . gene_id "ENSG00000198445"; gene_version "4"; transcript_id "ENST00000359963"; transcript_version "4"; gene_name "CCT8L2"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CCT8L2-201"; transcript_source "ensembl_havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS13738"; tag "basic"; transcript_support_level "NA"; +chr22 ensembl_havana three_prime_utr 16590751 16590876 . - . gene_id "ENSG00000198445"; gene_version "4"; transcript_id "ENST00000359963"; transcript_version "4"; gene_name "CCT8L2"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CCT8L2-201"; transcript_source "ensembl_havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS13738"; tag "basic"; transcript_support_level "NA"; +chr22 havana_tagene gene 16592895 16600110 . + . gene_id "ENSG00000287285"; gene_version "1"; gene_name "AP000547.4"; gene_source "havana_tagene"; gene_biotype "lncRNA"; +chr22 havana_tagene transcript 16592895 16600110 . + . gene_id "ENSG00000287285"; gene_version "1"; transcript_id "ENST00000656324"; transcript_version "1"; gene_name "AP000547.4"; gene_source "havana_tagene"; gene_biotype "lncRNA"; transcript_name "AP000547.4-201"; transcript_source "havana_tagene"; transcript_type "lncRNA"; tag "basic"; +chr22 havana_tagene exon 16592895 16592975 . + . gene_id "ENSG00000287285"; gene_version "1"; transcript_id "ENST00000656324"; transcript_version "1"; exon_number "1"; gene_name "AP000547.4"; gene_source "havana_tagene"; gene_biotype "lncRNA"; transcript_name "AP000547.4-201"; transcript_source "havana_tagene"; transcript_type "lncRNA"; exon_id "ENSE00003870517"; exon_version "1"; tag "basic"; +chr22 havana_tagene exon 16599420 16600110 . + . gene_id "ENSG00000287285"; gene_version "1"; transcript_id "ENST00000656324"; transcript_version "1"; exon_number "2"; gene_name "AP000547.4"; gene_source "havana_tagene"; gene_biotype "lncRNA"; transcript_name "AP000547.4-201"; transcript_source "havana_tagene"; transcript_type "lncRNA"; exon_id "ENSE00003867293"; exon_version "1"; tag "basic"; +chr22 havana gene 16595089 16595485 . - . gene_id "ENSG00000240122"; gene_version "1"; gene_name "FABP5P11"; gene_source "havana"; gene_biotype "processed_pseudogene"; +chr22 havana transcript 16595089 16595485 . - . gene_id "ENSG00000240122"; gene_version "1"; transcript_id "ENST00000430910"; transcript_version "1"; gene_name "FABP5P11"; gene_source "havana"; gene_biotype "processed_pseudogene"; transcript_name "FABP5P11-201"; transcript_source "havana"; transcript_type "processed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16595089 16595485 . - . gene_id "ENSG00000240122"; gene_version "1"; transcript_id "ENST00000430910"; transcript_version "1"; exon_number "1"; gene_name "FABP5P11"; gene_source "havana"; gene_biotype "processed_pseudogene"; transcript_name "FABP5P11-201"; transcript_source "havana"; transcript_type "processed_pseudogene"; exon_id "ENSE00001596581"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana gene 16601887 16698742 . + . gene_id "ENSG00000100181"; gene_version "22"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; +chr22 havana transcript 16601887 16698742 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000558085"; transcript_version "6"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-205"; transcript_source "havana"; transcript_type "processed_transcript"; tag "basic"; transcript_support_level "2"; +chr22 havana exon 16601887 16602215 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000558085"; transcript_version "6"; exon_number "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-205"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00002570186"; exon_version "1"; tag "basic"; transcript_support_level "2"; +chr22 havana exon 16638579 16638740 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000558085"; transcript_version "6"; exon_number "2"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-205"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001605063"; exon_version "1"; tag "basic"; transcript_support_level "2"; +chr22 havana exon 16697496 16698742 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000558085"; transcript_version "6"; exon_number "3"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-205"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00002538847"; exon_version "2"; tag "basic"; transcript_support_level "2"; +chr22 havana transcript 16601911 16648830 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000400593"; transcript_version "6"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-202"; transcript_source "havana"; transcript_type "processed_transcript"; transcript_support_level "1"; +chr22 havana exon 16601911 16602215 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000400593"; transcript_version "6"; exon_number "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-202"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00003795523"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16611658 16611893 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000400593"; transcript_version "6"; exon_number "2"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-202"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00003791808"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16614077 16614178 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000400593"; transcript_version "6"; exon_number "3"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-202"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00003796833"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16622841 16622897 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000400593"; transcript_version "6"; exon_number "4"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-202"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001543732"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16637040 16637090 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000400593"; transcript_version "6"; exon_number "5"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-202"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001696455"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16638579 16638740 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000400593"; transcript_version "6"; exon_number "6"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-202"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001605063"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16647168 16647257 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000400593"; transcript_version "6"; exon_number "7"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-202"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001752794"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16647663 16647785 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000400593"; transcript_version "6"; exon_number "8"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-202"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001688048"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16648527 16648830 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000400593"; transcript_version "6"; exon_number "9"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-202"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001788422"; exon_version "1"; transcript_support_level "1"; +chr22 havana transcript 16602044 16653809 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000426585"; transcript_version "5"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-204"; transcript_source "havana"; transcript_type "processed_transcript"; transcript_support_level "1"; +chr22 havana exon 16602044 16602215 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000426585"; transcript_version "5"; exon_number "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-204"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001675045"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16622841 16622897 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000426585"; transcript_version "5"; exon_number "2"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-204"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001543732"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16637040 16637090 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000426585"; transcript_version "5"; exon_number "3"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-204"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001696455"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16638579 16638740 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000426585"; transcript_version "5"; exon_number "4"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-204"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001605063"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16648527 16653809 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000426585"; transcript_version "5"; exon_number "5"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-204"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001613048"; exon_version "1"; transcript_support_level "1"; +chr22 havana transcript 16619615 16653692 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000383140"; transcript_version "7"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-201"; transcript_source "havana"; transcript_type "processed_transcript"; transcript_support_level "1"; +chr22 havana exon 16619615 16619720 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000383140"; transcript_version "7"; exon_number "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-201"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001773127"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16620052 16620160 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000383140"; transcript_version "7"; exon_number "2"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-201"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001782294"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16622841 16622897 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000383140"; transcript_version "7"; exon_number "3"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-201"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001543732"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16637040 16637090 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000383140"; transcript_version "7"; exon_number "4"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-201"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001696455"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16638579 16638740 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000383140"; transcript_version "7"; exon_number "5"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-201"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001605063"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16647605 16647785 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000383140"; transcript_version "7"; exon_number "6"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-201"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001788901"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16648527 16648648 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000383140"; transcript_version "7"; exon_number "7"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-201"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001620549"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16653510 16653692 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000383140"; transcript_version "7"; exon_number "8"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-201"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001649259"; exon_version "1"; transcript_support_level "1"; +chr22 havana transcript 16637020 16638980 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000585784"; transcript_version "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-206"; transcript_source "havana"; transcript_type "processed_transcript"; transcript_support_level "2"; +chr22 havana exon 16637020 16637090 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000585784"; transcript_version "1"; exon_number "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-206"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00002736492"; exon_version "1"; transcript_support_level "2"; +chr22 havana exon 16638579 16638980 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000585784"; transcript_version "1"; exon_number "2"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-206"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00002896340"; exon_version "1"; transcript_support_level "2"; +chr22 havana transcript 16637040 16638740 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000636884"; transcript_version "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-208"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16637040 16637090 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000636884"; transcript_version "1"; exon_number "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-208"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001696455"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16638579 16638740 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000636884"; transcript_version "1"; exon_number "2"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-208"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001605063"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana transcript 16638579 16640737 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000588424"; transcript_version "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-207"; transcript_source "havana"; transcript_type "processed_transcript"; transcript_support_level "5"; +chr22 havana exon 16638579 16638740 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000588424"; transcript_version "1"; exon_number "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-207"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001605063"; exon_version "1"; transcript_support_level "5"; +chr22 havana exon 16639298 16640737 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000588424"; transcript_version "1"; exon_number "2"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-207"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00002923192"; exon_version "1"; transcript_support_level "5"; +chr22 havana transcript 16649930 16653805 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000415121"; transcript_version "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-203"; transcript_source "havana"; transcript_type "processed_transcript"; transcript_support_level "1"; +chr22 havana exon 16649930 16649961 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000415121"; transcript_version "1"; exon_number "1"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-203"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001798341"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16652322 16652483 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000415121"; transcript_version "1"; exon_number "2"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-203"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001806015"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16652933 16653805 . + . gene_id "ENSG00000100181"; gene_version "22"; transcript_id "ENST00000415121"; transcript_version "1"; exon_number "3"; gene_name "TPTEP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "TPTEP1-203"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001762391"; exon_version "1"; transcript_support_level "1"; +chr22 havana gene 16601911 16615111 . + . gene_id "ENSG00000283633"; gene_version "1"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; +chr22 havana transcript 16601911 16615111 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000592918"; transcript_version "5"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-201"; transcript_source "havana"; transcript_type "lncRNA"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 16601911 16602215 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000592918"; transcript_version "5"; exon_number "1"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003792889"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 16611658 16611893 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000592918"; transcript_version "5"; exon_number "2"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003797761"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 16614077 16615111 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000592918"; transcript_version "5"; exon_number "3"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00002924237"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana transcript 16601948 16615111 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000592107"; transcript_version "5"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-202"; transcript_source "havana"; transcript_type "lncRNA"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 16601948 16602215 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000592107"; transcript_version "5"; exon_number "1"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-202"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00002911043"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 16611658 16611893 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000592107"; transcript_version "5"; exon_number "2"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-202"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003797761"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 16614077 16614178 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000592107"; transcript_version "5"; exon_number "3"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-202"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003800255"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 16614699 16615111 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000592107"; transcript_version "5"; exon_number "4"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-202"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00002871438"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana transcript 16602050 16614333 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000591299"; transcript_version "1"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-203"; transcript_source "havana"; transcript_type "lncRNA"; tag "basic"; transcript_support_level "2"; +chr22 havana exon 16602050 16602215 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000591299"; transcript_version "1"; exon_number "1"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-203"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00002800237"; exon_version "1"; tag "basic"; transcript_support_level "2"; +chr22 havana exon 16611658 16611893 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000591299"; transcript_version "1"; exon_number "2"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-203"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003797761"; exon_version "1"; tag "basic"; transcript_support_level "2"; +chr22 havana exon 16613985 16614333 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000591299"; transcript_version "1"; exon_number "3"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-203"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00002779343"; exon_version "1"; tag "basic"; transcript_support_level "2"; +chr22 havana transcript 16612582 16615104 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000588548"; transcript_version "1"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-204"; transcript_source "havana"; transcript_type "lncRNA"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16612582 16615104 . + . gene_id "ENSG00000283633"; gene_version "1"; transcript_id "ENST00000588548"; transcript_version "1"; exon_number "1"; gene_name "AP000547.3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000547.3-204"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00002951757"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana gene 16616170 16617114 . + . gene_id "ENSG00000267338"; gene_version "1"; gene_name "AP000365.1"; gene_source "havana"; gene_biotype "lncRNA"; +chr22 havana transcript 16616170 16617114 . + . gene_id "ENSG00000267338"; gene_version "1"; transcript_id "ENST00000438850"; transcript_version "1"; gene_name "AP000365.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000365.1-201"; transcript_source "havana"; transcript_type "lncRNA"; tag "basic"; transcript_support_level "4"; +chr22 havana exon 16616170 16616346 . + . gene_id "ENSG00000267338"; gene_version "1"; transcript_id "ENST00000438850"; transcript_version "1"; exon_number "1"; gene_name "AP000365.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000365.1-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001700739"; exon_version "1"; tag "basic"; transcript_support_level "4"; +chr22 havana exon 16616746 16617114 . + . gene_id "ENSG00000267338"; gene_version "1"; transcript_id "ENST00000438850"; transcript_version "1"; exon_number "2"; gene_name "AP000365.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AP000365.1-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001789206"; exon_version "1"; tag "basic"; transcript_support_level "4"; +chr22 havana gene 16645695 16646581 . - . gene_id "ENSG00000249288"; gene_version "1"; gene_name "SLC25A15P5"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; +chr22 havana transcript 16645695 16646581 . - . gene_id "ENSG00000249288"; gene_version "1"; transcript_id "ENST00000508033"; transcript_version "1"; gene_name "SLC25A15P5"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC25A15P5-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16646448 16646581 . - . gene_id "ENSG00000249288"; gene_version "1"; transcript_id "ENST00000508033"; transcript_version "1"; exon_number "1"; gene_name "SLC25A15P5"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC25A15P5-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00002021604"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16645695 16645813 . - . gene_id "ENSG00000249288"; gene_version "1"; transcript_id "ENST00000508033"; transcript_version "1"; exon_number "2"; gene_name "SLC25A15P5"; gene_source "havana"; gene_biotype "unprocessed_pseudogene"; transcript_name "SLC25A15P5-201"; transcript_source "havana"; transcript_type "unprocessed_pseudogene"; exon_id "ENSE00002032018"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana gene 16653892 16659628 . - . gene_id "ENSG00000249263"; gene_version "2"; gene_name "PARP4P3"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; +chr22 havana transcript 16653892 16659628 . - . gene_id "ENSG00000249263"; gene_version "2"; transcript_id "ENST00000510265"; transcript_version "2"; gene_name "PARP4P3"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "PARP4P3-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16659497 16659628 . - . gene_id "ENSG00000249263"; gene_version "2"; transcript_id "ENST00000510265"; transcript_version "2"; exon_number "1"; gene_name "PARP4P3"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "PARP4P3-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00003601172"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16653892 16654076 . - . gene_id "ENSG00000249263"; gene_version "2"; transcript_id "ENST00000510265"; transcript_version "2"; exon_number "2"; gene_name "PARP4P3"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "PARP4P3-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00002047806"; exon_version "2"; tag "basic"; transcript_support_level "NA"; +chr22 havana gene 16654066 16675540 . - . gene_id "ENSG00000189295"; gene_version "13"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; +chr22 havana transcript 16654066 16675540 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000456726"; transcript_version "5"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-201"; transcript_source "havana"; transcript_type "lncRNA"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16675123 16675540 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000456726"; transcript_version "5"; exon_number "1"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001592270"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16673600 16673752 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000456726"; transcript_version "5"; exon_number "2"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003620128"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16671518 16671588 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000456726"; transcript_version "5"; exon_number "3"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003625905"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16670217 16670261 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000456726"; transcript_version "5"; exon_number "4"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001685886"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16669462 16669620 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000456726"; transcript_version "5"; exon_number "5"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001638194"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16661476 16661555 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000456726"; transcript_version "5"; exon_number "6"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001740990"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16659858 16659969 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000456726"; transcript_version "5"; exon_number "7"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001620353"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16659497 16659628 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000456726"; transcript_version "5"; exon_number "8"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003478233"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16654066 16654076 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000456726"; transcript_version "5"; exon_number "9"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001725000"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana transcript 16669464 16675452 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000457060"; transcript_version "1"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-202"; transcript_source "havana"; transcript_type "lncRNA"; transcript_support_level "3"; +chr22 havana exon 16675123 16675452 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000457060"; transcript_version "1"; exon_number "1"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-202"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001611736"; exon_version "1"; transcript_support_level "3"; +chr22 havana exon 16671518 16671588 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000457060"; transcript_version "1"; exon_number "2"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-202"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003625905"; exon_version "1"; transcript_support_level "3"; +chr22 havana exon 16670217 16670261 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000457060"; transcript_version "1"; exon_number "3"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-202"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001685886"; exon_version "1"; transcript_support_level "3"; +chr22 havana exon 16669464 16669620 . - . gene_id "ENSG00000189295"; gene_version "13"; transcript_id "ENST00000457060"; transcript_version "1"; exon_number "4"; gene_name "ANKRD62P1-PARP4P3"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "ANKRD62P1-PARP4P3-202"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001769991"; exon_version "1"; transcript_support_level "3"; +chr22 havana gene 16671090 16679493 . - . gene_id "ENSG00000259271"; gene_version "1"; gene_name "ANKRD62P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; +chr22 havana transcript 16671090 16679493 . - . gene_id "ENSG00000259271"; gene_version "1"; transcript_id "ENST00000434304"; transcript_version "2"; gene_name "ANKRD62P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "ANKRD62P1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16679292 16679493 . - . gene_id "ENSG00000259271"; gene_version "1"; transcript_id "ENST00000434304"; transcript_version "2"; exon_number "1"; gene_name "ANKRD62P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "ANKRD62P1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00003518483"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16677193 16677376 . - . gene_id "ENSG00000259271"; gene_version "1"; transcript_id "ENST00000434304"; transcript_version "2"; exon_number "2"; gene_name "ANKRD62P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "ANKRD62P1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00003521508"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16675123 16676046 . - . gene_id "ENSG00000259271"; gene_version "1"; transcript_id "ENST00000434304"; transcript_version "2"; exon_number "3"; gene_name "ANKRD62P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "ANKRD62P1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001593736"; exon_version "2"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16673600 16673752 . - . gene_id "ENSG00000259271"; gene_version "1"; transcript_id "ENST00000434304"; transcript_version "2"; exon_number "4"; gene_name "ANKRD62P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "ANKRD62P1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00003633457"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16671518 16671588 . - . gene_id "ENSG00000259271"; gene_version "1"; transcript_id "ENST00000434304"; transcript_version "2"; exon_number "5"; gene_name "ANKRD62P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "ANKRD62P1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00003503074"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16671090 16671178 . - . gene_id "ENSG00000259271"; gene_version "1"; transcript_id "ENST00000434304"; transcript_version "2"; exon_number "6"; gene_name "ANKRD62P1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "ANKRD62P1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001745875"; exon_version "2"; tag "basic"; transcript_support_level "NA"; +chr22 havana gene 16676016 16694648 . - . gene_id "ENSG00000273244"; gene_version "1"; gene_name "AC005301.1"; gene_source "havana"; gene_biotype "lncRNA"; +chr22 havana transcript 16676016 16694648 . - . gene_id "ENSG00000273244"; gene_version "1"; transcript_id "ENST00000423580"; transcript_version "2"; gene_name "AC005301.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AC005301.1-201"; transcript_source "havana"; transcript_type "lncRNA"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16694578 16694648 . - . gene_id "ENSG00000273244"; gene_version "1"; transcript_id "ENST00000423580"; transcript_version "2"; exon_number "1"; gene_name "AC005301.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AC005301.1-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00002568320"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16691975 16692139 . - . gene_id "ENSG00000273244"; gene_version "1"; transcript_id "ENST00000423580"; transcript_version "2"; exon_number "2"; gene_name "AC005301.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AC005301.1-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003500841"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16690573 16690616 . - . gene_id "ENSG00000273244"; gene_version "1"; transcript_id "ENST00000423580"; transcript_version "2"; exon_number "3"; gene_name "AC005301.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AC005301.1-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003611377"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16690103 16690280 . - . gene_id "ENSG00000273244"; gene_version "1"; transcript_id "ENST00000423580"; transcript_version "2"; exon_number "4"; gene_name "AC005301.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AC005301.1-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003637368"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16679292 16679493 . - . gene_id "ENSG00000273244"; gene_version "1"; transcript_id "ENST00000423580"; transcript_version "2"; exon_number "5"; gene_name "AC005301.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AC005301.1-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003579924"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16677193 16677376 . - . gene_id "ENSG00000273244"; gene_version "1"; transcript_id "ENST00000423580"; transcript_version "2"; exon_number "6"; gene_name "AC005301.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AC005301.1-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00003686527"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana exon 16676016 16676046 . - . gene_id "ENSG00000273244"; gene_version "1"; transcript_id "ENST00000423580"; transcript_version "2"; exon_number "7"; gene_name "AC005301.1"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "AC005301.1-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001790939"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 havana gene 16690103 16704477 . - . gene_id "ENSG00000241717"; gene_version "1"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; +chr22 havana transcript 16690103 16704477 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16704309 16704477 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "1"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001638969"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16703993 16704106 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "2"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001775995"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16702043 16702203 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "3"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001718001"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16701154 16701312 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "4"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001688511"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16700314 16700449 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "5"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001617518"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16696778 16698156 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "6"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001687710"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16695242 16695358 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "7"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001745760"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16695004 16695144 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "8"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001638598"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16694578 16694721 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "9"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001596500"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16691975 16692139 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "10"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00003475019"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16690573 16690616 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "11"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00003484966"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana exon 16690103 16690280 . - . gene_id "ENSG00000241717"; gene_version "1"; transcript_id "ENST00000457911"; transcript_version "1"; exon_number "12"; gene_name "VWFP1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "VWFP1-201"; transcript_source "havana"; transcript_type "transcribed_unprocessed_pseudogene"; exon_id "ENSE00003520301"; exon_version "1"; tag "basic"; transcript_support_level "NA"; +chr22 havana_tagene gene 16725072 16747761 . + . gene_id "ENSG00000288024"; gene_version "1"; gene_name "AC005301.2"; gene_source "havana_tagene"; gene_biotype "lncRNA"; +chr22 havana_tagene transcript 16725072 16747761 . + . gene_id "ENSG00000288024"; gene_version "1"; transcript_id "ENST00000670988"; transcript_version "1"; gene_name "AC005301.2"; gene_source "havana_tagene"; gene_biotype "lncRNA"; transcript_name "AC005301.2-201"; transcript_source "havana_tagene"; transcript_type "lncRNA"; tag "basic"; +chr22 havana_tagene exon 16725072 16725240 . + . gene_id "ENSG00000288024"; gene_version "1"; transcript_id "ENST00000670988"; transcript_version "1"; exon_number "1"; gene_name "AC005301.2"; gene_source "havana_tagene"; gene_biotype "lncRNA"; transcript_name "AC005301.2-201"; transcript_source "havana_tagene"; transcript_type "lncRNA"; exon_id "ENSE00003874043"; exon_version "1"; tag "basic"; +chr22 havana_tagene exon 16745351 16745479 . + . gene_id "ENSG00000288024"; gene_version "1"; transcript_id "ENST00000670988"; transcript_version "1"; exon_number "2"; gene_name "AC005301.2"; gene_source "havana_tagene"; gene_biotype "lncRNA"; transcript_name "AC005301.2-201"; transcript_source "havana_tagene"; transcript_type "lncRNA"; exon_id "ENSE00003873706"; exon_version "1"; tag "basic"; +chr22 havana_tagene exon 16747055 16747761 . + . gene_id "ENSG00000288024"; gene_version "1"; transcript_id "ENST00000670988"; transcript_version "1"; exon_number "3"; gene_name "AC005301.2"; gene_source "havana_tagene"; gene_biotype "lncRNA"; transcript_name "AC005301.2-201"; transcript_source "havana_tagene"; transcript_type "lncRNA"; exon_id "ENSE00003861144"; exon_version "1"; tag "basic"; +chr22 havana gene 16746628 16748645 . - . gene_id "ENSG00000235343"; gene_version "2"; gene_name "LINC01665"; gene_source "havana"; gene_biotype "lncRNA"; +chr22 havana_tagene transcript 16746628 16748549 . - . gene_id "ENSG00000235343"; gene_version "2"; transcript_id "ENST00000665507"; transcript_version "1"; gene_name "LINC01665"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "LINC01665-202"; transcript_source "havana_tagene"; transcript_type "lncRNA"; tag "basic"; +chr22 havana_tagene exon 16748276 16748549 . - . gene_id "ENSG00000235343"; gene_version "2"; transcript_id "ENST00000665507"; transcript_version "1"; exon_number "1"; gene_name "LINC01665"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "LINC01665-202"; transcript_source "havana_tagene"; transcript_type "lncRNA"; exon_id "ENSE00003860979"; exon_version "1"; tag "basic"; +chr22 havana_tagene exon 16746628 16747739 . - . gene_id "ENSG00000235343"; gene_version "2"; transcript_id "ENST00000665507"; transcript_version "1"; exon_number "2"; gene_name "LINC01665"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "LINC01665-202"; transcript_source "havana_tagene"; transcript_type "lncRNA"; exon_id "ENSE00003874903"; exon_version "1"; tag "basic"; +chr22 havana transcript 16746869 16748645 . - . gene_id "ENSG00000235343"; gene_version "2"; transcript_id "ENST00000422917"; transcript_version "1"; gene_name "LINC01665"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "LINC01665-201"; transcript_source "havana"; transcript_type "lncRNA"; transcript_support_level "1"; +chr22 havana exon 16748276 16748645 . - . gene_id "ENSG00000235343"; gene_version "2"; transcript_id "ENST00000422917"; transcript_version "1"; exon_number "1"; gene_name "LINC01665"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "LINC01665-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001764059"; exon_version "1"; transcript_support_level "1"; +chr22 havana exon 16746869 16747739 . - . gene_id "ENSG00000235343"; gene_version "2"; transcript_id "ENST00000422917"; transcript_version "1"; exon_number "2"; gene_name "LINC01665"; gene_source "havana"; gene_biotype "lncRNA"; transcript_name "LINC01665-201"; transcript_source "havana"; transcript_type "lncRNA"; exon_id "ENSE00001677923"; exon_version "1"; transcript_support_level "1"; +chr22 ensembl_havana gene 27978014 28679865 . - . gene_id "ENSG00000100154"; gene_version "14"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; +chr22 havana transcript 27978014 28679865 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28679622 28679865 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001556591"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28679622 28679723 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana start_codon 28679721 28679723 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28629552 28629830 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001551541"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28629552 28629830 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28306496 28306643 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00003640178"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28306496 28306643 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28297580 28297852 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "4"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00003492820"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28297580 28297852 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "4"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28296198 28296328 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "5"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001492788"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28296198 28296328 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "5"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28163092 28163599 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "6"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001492787"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28163092 28163599 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "6"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28107062 28108403 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "7"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001231767"; exon_version "4"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28107062 28108403 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "7"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28105279 28105802 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "8"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00000879682"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28105279 28105802 . - 1 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "8"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28101171 28101280 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "9"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001173060"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28101171 28101280 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "9"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28098915 28099044 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "10"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001173052"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28098915 28099044 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "10"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28096190 28096408 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "11"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001173076"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28096190 28096408 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "11"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28094080 28094245 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "12"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00000651956"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28094080 28094245 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "12"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28030226 28030366 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "13"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001297696"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28030226 28030366 . - 1 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "13"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28014248 28014392 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "14"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00000879679"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28014248 28014392 . - 1 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "14"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 28001374 28001553 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "15"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00000651949"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 28001374 28001553 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "15"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 27998540 27999260 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "16"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00000651948"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 27998540 27999260 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "16"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 27996135 27996259 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "17"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00000651947"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 27996135 27996259 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "17"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 27993287 27993518 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "18"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00003685416"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 27993287 27993518 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "18"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 27992587 27992663 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "19"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00000651945"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 27992587 27992663 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "19"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 27990789 27990812 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "20"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001321146"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 27990789 27990812 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "20"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 27989878 27990007 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "21"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00000651944"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 27989878 27990007 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "21"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 27985249 27985356 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "22"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00003566454"; exon_version "1"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 27985249 27985356 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "22"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana exon 27978014 27983851 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "23"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; exon_id "ENSE00001559219"; exon_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana CDS 27982224 27983851 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "23"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; protein_id "ENSP00000381003"; protein_version "2"; tag "basic"; transcript_support_level "1"; +chr22 havana stop_codon 27982221 27982223 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; exon_number "23"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; tag "basic"; transcript_support_level "1"; +chr22 havana five_prime_utr 28679724 28679865 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; tag "basic"; transcript_support_level "1"; +chr22 havana three_prime_utr 27978014 27982220 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000397906"; transcript_version "6"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-201"; transcript_source "havana"; transcript_type "protein_coding"; tag "CCDS"; ccds_id "CCDS46678"; tag "basic"; transcript_support_level "1"; +chr22 ensembl transcript 27978014 28306645 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28306496 28306645 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00003712179"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28306496 28306643 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28297580 28297852 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00003492820"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28297580 28297852 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28296198 28296328 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00001492788"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28296198 28296328 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28163092 28163599 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "4"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00001492787"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28163092 28163599 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "4"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28107062 28108403 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "5"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00001231767"; exon_version "4"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28107062 28108403 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "5"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28105279 28105802 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "6"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00000879682"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28105279 28105802 . - 1 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "6"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28101171 28101280 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "7"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00001173060"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28101171 28101280 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "7"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28098915 28099044 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "8"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00001173052"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28098915 28099044 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "8"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28096190 28096408 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "9"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00001173076"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28096190 28096408 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "9"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28094080 28094245 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "10"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00000651956"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28094080 28094245 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "10"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28030226 28030366 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "11"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00001297696"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28030226 28030366 . - 1 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "11"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28014248 28014392 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "12"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00000879679"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28014248 28014392 . - 1 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "12"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 28001374 28001553 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "13"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00000651949"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 28001374 28001553 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "13"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 27998540 27999260 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "14"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00000651948"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 27998540 27999260 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "14"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 27996135 27996259 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "15"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00000651947"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 27996135 27996259 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "15"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 27993287 27993518 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "16"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00003685416"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 27993287 27993518 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "16"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 27992587 27992663 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "17"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00000651945"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 27992587 27992663 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "17"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 27990789 27990812 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "18"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00001321146"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 27990789 27990812 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "18"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 27989878 27990007 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "19"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00000651944"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 27989878 27990007 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "19"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 27985249 27985356 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "20"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00003566454"; exon_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 27985249 27985356 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "20"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl exon 27978014 27983851 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "21"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; exon_id "ENSE00001559219"; exon_version "2"; tag "basic"; transcript_support_level "5"; +chr22 ensembl CDS 27982224 27983851 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "21"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; protein_id "ENSP00000479834"; protein_version "1"; tag "basic"; transcript_support_level "5"; +chr22 ensembl stop_codon 27982221 27982223 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; exon_number "21"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; tag "basic"; transcript_support_level "5"; +chr22 ensembl five_prime_utr 28306644 28306645 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; tag "basic"; transcript_support_level "5"; +chr22 ensembl three_prime_utr 27978014 27982220 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000612946"; transcript_version "4"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-208"; transcript_source "ensembl"; transcript_type "protein_coding"; tag "basic"; transcript_support_level "5"; +chr22 havana transcript 27983599 27996239 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana exon 27996135 27996239 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; exon_id "ENSE00001726746"; exon_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana CDS 27996135 27996239 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; protein_id "ENSP00000410244"; protein_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana exon 27993287 27993518 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; exon_id "ENSE00003685416"; exon_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana CDS 27993287 27993518 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; protein_id "ENSP00000410244"; protein_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana exon 27992587 27992663 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; exon_id "ENSE00000651945"; exon_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana CDS 27992587 27992663 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; protein_id "ENSP00000410244"; protein_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana exon 27989878 27990007 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "4"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; exon_id "ENSE00000651944"; exon_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana CDS 27989878 27990007 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "4"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; protein_id "ENSP00000410244"; protein_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana exon 27985249 27985356 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "5"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; exon_id "ENSE00003566454"; exon_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana CDS 27985249 27985356 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "5"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; protein_id "ENSP00000410244"; protein_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana exon 27983599 27983851 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "6"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; exon_id "ENSE00001625734"; exon_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana CDS 27983599 27983851 . - 2 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000431039"; transcript_version "1"; exon_number "6"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-202"; transcript_source "havana"; transcript_type "protein_coding"; protein_id "ENSP00000410244"; protein_version "1"; tag "cds_end_NF"; tag "cds_start_NF"; tag "mRNA_end_NF"; tag "mRNA_start_NF"; transcript_support_level "3"; +chr22 havana transcript 27983752 27990076 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000480563"; transcript_version "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-206"; transcript_source "havana"; transcript_type "retained_intron"; transcript_support_level "3"; +chr22 havana exon 27989878 27990076 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000480563"; transcript_version "1"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-206"; transcript_source "havana"; transcript_type "retained_intron"; exon_id "ENSE00001852426"; exon_version "1"; transcript_support_level "3"; +chr22 havana exon 27985249 27985356 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000480563"; transcript_version "1"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-206"; transcript_source "havana"; transcript_type "retained_intron"; exon_id "ENSE00003550588"; exon_version "1"; transcript_support_level "3"; +chr22 havana exon 27983752 27983851 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000480563"; transcript_version "1"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-206"; transcript_source "havana"; transcript_type "retained_intron"; exon_id "ENSE00001840432"; exon_version "1"; transcript_support_level "3"; +chr22 havana transcript 27992612 27996424 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000469670"; transcript_version "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-205"; transcript_source "havana"; transcript_type "retained_intron"; transcript_support_level "3"; +chr22 havana exon 27996135 27996424 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000469670"; transcript_version "1"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-205"; transcript_source "havana"; transcript_type "retained_intron"; exon_id "ENSE00001878331"; exon_version "1"; transcript_support_level "3"; +chr22 havana exon 27993287 27993518 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000469670"; transcript_version "1"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-205"; transcript_source "havana"; transcript_type "retained_intron"; exon_id "ENSE00003602135"; exon_version "1"; transcript_support_level "3"; +chr22 havana exon 27992612 27992663 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000469670"; transcript_version "1"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-205"; transcript_source "havana"; transcript_type "retained_intron"; exon_id "ENSE00001859545"; exon_version "1"; transcript_support_level "3"; +chr22 havana transcript 28028815 28094135 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000442232"; transcript_version "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-203"; transcript_source "havana"; transcript_type "protein_coding"; tag "cds_start_NF"; tag "mRNA_start_NF"; transcript_support_level "2"; +chr22 havana exon 28094080 28094135 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000442232"; transcript_version "1"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-203"; transcript_source "havana"; transcript_type "protein_coding"; exon_id "ENSE00001757870"; exon_version "1"; tag "cds_start_NF"; tag "mRNA_start_NF"; transcript_support_level "2"; +chr22 havana CDS 28094080 28094135 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000442232"; transcript_version "1"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-203"; transcript_source "havana"; transcript_type "protein_coding"; protein_id "ENSP00000388788"; protein_version "1"; tag "cds_start_NF"; tag "mRNA_start_NF"; transcript_support_level "2"; +chr22 havana exon 28030226 28030366 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000442232"; transcript_version "1"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-203"; transcript_source "havana"; transcript_type "protein_coding"; exon_id "ENSE00001297696"; exon_version "1"; tag "cds_start_NF"; tag "mRNA_start_NF"; transcript_support_level "2"; +chr22 havana CDS 28030226 28030366 . - 1 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000442232"; transcript_version "1"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-203"; transcript_source "havana"; transcript_type "protein_coding"; protein_id "ENSP00000388788"; protein_version "1"; tag "cds_start_NF"; tag "mRNA_start_NF"; transcript_support_level "2"; +chr22 havana exon 28028815 28029116 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000442232"; transcript_version "1"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-203"; transcript_source "havana"; transcript_type "protein_coding"; exon_id "ENSE00001654926"; exon_version "1"; tag "cds_start_NF"; tag "mRNA_start_NF"; transcript_support_level "2"; +chr22 havana CDS 28028990 28029116 . - 1 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000442232"; transcript_version "1"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-203"; transcript_source "havana"; transcript_type "protein_coding"; protein_id "ENSP00000388788"; protein_version "1"; tag "cds_start_NF"; tag "mRNA_start_NF"; transcript_support_level "2"; +chr22 havana stop_codon 28028987 28028989 . - 0 gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000442232"; transcript_version "1"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-203"; transcript_source "havana"; transcript_type "protein_coding"; tag "cds_start_NF"; tag "mRNA_start_NF"; transcript_support_level "2"; +chr22 havana three_prime_utr 28028815 28028986 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000442232"; transcript_version "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-203"; transcript_source "havana"; transcript_type "protein_coding"; tag "cds_start_NF"; tag "mRNA_start_NF"; transcript_support_level "2"; +chr22 havana transcript 28296214 28443073 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000490475"; transcript_version "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-207"; transcript_source "havana"; transcript_type "processed_transcript"; transcript_support_level "5"; +chr22 havana exon 28442886 28443073 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000490475"; transcript_version "1"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-207"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001862939"; exon_version "1"; transcript_support_level "5"; +chr22 havana exon 28306496 28306643 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000490475"; transcript_version "1"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-207"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00003566593"; exon_version "1"; transcript_support_level "5"; +chr22 havana exon 28297580 28297852 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000490475"; transcript_version "1"; exon_number "3"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-207"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00003667769"; exon_version "1"; transcript_support_level "5"; +chr22 havana exon 28296214 28296328 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000490475"; transcript_version "1"; exon_number "4"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-207"; transcript_source "havana"; transcript_type "processed_transcript"; exon_id "ENSE00001817484"; exon_version "1"; transcript_support_level "5"; +chr22 havana transcript 28629428 28679812 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000468807"; transcript_version "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-204"; transcript_source "havana"; transcript_type "retained_intron"; transcript_support_level "2"; +chr22 havana exon 28679622 28679812 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000468807"; transcript_version "1"; exon_number "1"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-204"; transcript_source "havana"; transcript_type "retained_intron"; exon_id "ENSE00001938107"; exon_version "1"; transcript_support_level "2"; +chr22 havana exon 28629428 28629830 . - . gene_id "ENSG00000100154"; gene_version "14"; transcript_id "ENST00000468807"; transcript_version "1"; exon_number "2"; gene_name "TTC28"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "TTC28-204"; transcript_source "havana"; transcript_type "retained_intron"; exon_id "ENSE00001917942"; exon_version "1"; transcript_support_level "2"; diff --git a/tests/fixtures/splicing_calling/leafcutter/reference/README.md b/tests/fixtures/splicing_calling/leafcutter/reference/README.md new file mode 100644 index 000000000..44bf2b185 --- /dev/null +++ b/tests/fixtures/splicing_calling/leafcutter/reference/README.md @@ -0,0 +1,31 @@ +# LeafCutter2 reference fixture + +chr22 GTF + FASTA pair for `test_cluster_and_classify` in +`tests/notebooks/molecular_phenotypes/calling/test_splicing_calling_leafcutter2.py`. +LeafCutter2 classifies only junctions inside a gene with CDS / start_codon / +stop_codon records and reads those genes' sequence, so the pair covers the three +clusters the `SAMPLE_00{1,2}.junc.gz` fixtures keep at `--minclureads 3` +(two intergenic, one inside TTC28). Do **not** remove without migrating that test. + +| File | Derivation | +|---|---| +| `Homo_sapiens.GRCh38.103.chr22.leafcutter2.reformatted.gtf` | Every Ensembl 103 record of the 21 chr22 genes overlapping those clusters, then `hg_gtf_1` (chr prefix, `transcript_biotype` -> `transcript_type`) | +| `chr22.leafcutter2.fa.gz` (+ `.fai`, `.gzi`) | Full-length chr22 from the protocol FASTA, N everywhere except those genes and clusters (+/- 1 kb); bgzipped | + +## Rebuild + +```bash +# Ensembl release 103 GTF (checksum in the same directory's CHECKSUMS) +curl -O https://ftp.ensembl.org/pub/release-103/gtf/homo_sapiens/Homo_sapiens.GRCh38.103.chr.gtf.gz +D=tests/fixtures/splicing_calling/leafcutter/reference +Rscript $D/build_reference.R \ + --ensembl-gtf Homo_sapiens.GRCh38.103.chr.gtf.gz \ + --fasta /GRCh38_full_analysis_set_plus_decoy_hla.noALT_noHLA_noDecoy_ERCC.fasta \ + --outdir $D +zcat $D/chr22.leafcutter2.fa.gz | head -n1 > hdr.fa +Rscript code/script/reference_data/reference_data_preparation.R --step hg_gtf_1 \ + --hg-reference hdr.fa \ + --hg-gtf $D/Homo_sapiens.GRCh38.103.chr22.leafcutter2.gtf \ + --output $D/Homo_sapiens.GRCh38.103.chr22.leafcutter2.reformatted.gtf +rm hdr.fa $D/Homo_sapiens.GRCh38.103.chr22.leafcutter2.gtf +``` diff --git a/tests/fixtures/splicing_calling/leafcutter/reference/build_reference.R b/tests/fixtures/splicing_calling/leafcutter/reference/build_reference.R new file mode 100644 index 000000000..1dd55f232 --- /dev/null +++ b/tests/fixtures/splicing_calling/leafcutter/reference/build_reference.R @@ -0,0 +1,66 @@ +#!/usr/bin/env Rscript +# ============================================================ +# build_reference.R +# Build the chr22 GTF + FASTA pair that test_cluster_and_classify feeds to +# leafcutter2_cluster. LeafCutter2 classifies only junctions inside an annotated +# gene with CDS / start_codon / stop_codon records, and translates those genes from +# the FASTA, so the pair must cover the loci the junction fixtures cluster into. +# +# At --minclureads 3 the SAMPLE_00{1,2}.junc.gz fixtures keep three clusters: +# chr22:12314919-12351352 intergenic +# chr22:16451635-16770384 intergenic +# chr22:28168701-28214161 inside TTC28 (ENSG00000100154, protein coding) +# +# Outputs (in --outdir): +# Homo_sapiens.GRCh38.103.chr22.leafcutter2.gtf every Ensembl 103 record of the +# genes overlapping those clusters, Ensembl naming. Run hg_gtf_1 on it to get +# the committed *.reformatted.gtf (see README.md). +# chr22.leafcutter2.fa.gz (+ .fai, .gzi) full-length chr22, N everywhere except +# the kept genes and the clusters (each padded by PAD bp), bgzipped. +# ============================================================ + +suppressPackageStartupMessages({ + library(argparser) + library(vroom) + library(dplyr) + library(Biostrings) + library(Rsamtools) +}) + +parser <- arg_parser("Build the LeafCutter2 chr22 reference fixture") +parser <- add_argument(parser, "--ensembl-gtf", type = "character", + help = "Ensembl release 103 Homo_sapiens.GRCh38.103.chr.gtf.gz") +parser <- add_argument(parser, "--fasta", type = "character", + help = "protocol FASTA (GRCh38_full_analysis_set_plus_decoy_hla.noALT_noHLA_noDecoy_ERCC.fasta, indexed)") +parser <- add_argument(parser, "--outdir", type = "character", default = ".", help = "output directory") +argv <- parse_args(parser) + +CLUSTERS <- data.frame(start = c(12314919L, 16451635L, 28168701L), + end = c(12351352L, 16770384L, 28214161L)) +PAD <- 1000L + +gtf <- vroom::vroom(argv$ensembl_gtf, delim = "\t", col_names = FALSE, comment = "#", + col_types = cols(.default = "c"), progress = FALSE) %>% + filter(X1 == "22") %>% + mutate(gene_id = sub('.*gene_id "([^"]+)".*', "\\1", X9)) +genes <- gtf %>% + filter(X3 == "gene") %>% + mutate(start = as.integer(X4), end = as.integer(X5)) +hit <- vapply(seq_len(nrow(genes)), function(i) + any(genes$start[[i]] <= CLUSTERS$end & genes$end[[i]] >= CLUSTERS$start), TRUE) +genes <- genes[hit, ] +message("genes kept: ", paste(genes$gene_id, collapse = ", ")) +out_gtf <- gtf %>% filter(gene_id %in% genes$gene_id) %>% select(-gene_id) +vroom::vroom_write(out_gtf, file.path(argv$outdir, "Homo_sapiens.GRCh38.103.chr22.leafcutter2.gtf"), + delim = "\t", col_names = FALSE, quote = "none", escape = "none") + +chr22 <- scanFa(FaFile(argv$fasta), param = GRanges("chr22", IRanges(1L, seqlengths(FaFile(argv$fasta))[["chr22"]])))[[1]] +keep <- reduce(IRanges(c(genes$start, CLUSTERS$start) - PAD, c(genes$end, CLUSTERS$end) + PAD)) +masked <- DNAString(strrep("N", length(chr22))) +for (i in seq_along(keep)) subseq(masked, start(keep)[[i]], end(keep)[[i]]) <- subseq(chr22, start(keep)[[i]], end(keep)[[i]]) +message("unmasked bp: ", sum(width(keep)), " of ", length(chr22)) +fa <- file.path(argv$outdir, "chr22.leafcutter2.fa") +writeXStringSet(DNAStringSet(list(chr22 = masked)), fa, width = 60L) +invisible(bgzip(fa, paste0(fa, ".gz"), overwrite = TRUE)) +unlink(fa) +invisible(indexFa(paste0(fa, ".gz"))) diff --git a/tests/fixtures/splicing_calling/leafcutter/reference/chr22.leafcutter2.fa.gz b/tests/fixtures/splicing_calling/leafcutter/reference/chr22.leafcutter2.fa.gz new file mode 100644 index 000000000..0ca4f75bb Binary files /dev/null and b/tests/fixtures/splicing_calling/leafcutter/reference/chr22.leafcutter2.fa.gz differ diff --git a/tests/fixtures/splicing_calling/leafcutter/reference/chr22.leafcutter2.fa.gz.fai b/tests/fixtures/splicing_calling/leafcutter/reference/chr22.leafcutter2.fa.gz.fai new file mode 100644 index 000000000..3d0ee93c3 --- /dev/null +++ b/tests/fixtures/splicing_calling/leafcutter/reference/chr22.leafcutter2.fa.gz.fai @@ -0,0 +1 @@ +chr22 50818468 7 60 61 diff --git a/tests/fixtures/splicing_calling/leafcutter/reference/chr22.leafcutter2.fa.gz.gzi b/tests/fixtures/splicing_calling/leafcutter/reference/chr22.leafcutter2.fa.gz.gzi new file mode 100644 index 000000000..98acd5849 Binary files /dev/null and b/tests/fixtures/splicing_calling/leafcutter/reference/chr22.leafcutter2.fa.gz.gzi differ diff --git a/tests/notebooks/molecular_phenotypes/calling/test_splicing_calling_leafcutter2.py b/tests/notebooks/molecular_phenotypes/calling/test_splicing_calling_leafcutter2.py new file mode 100644 index 000000000..f85819da9 --- /dev/null +++ b/tests/notebooks/molecular_phenotypes/calling/test_splicing_calling_leafcutter2.py @@ -0,0 +1,194 @@ +"""Notebook tier: splicing_calling_leafcutter2.ipynb workflows. + +The clustering test uses the chr22 GTF + FASTA pair in FIX/reference, built by +build_reference.R to cover the loci the junction fixtures cluster into. +""" +from __future__ import annotations + +import gzip +import shutil + +import pytest + +NB = "code/SoS/molecular_phenotypes/calling/splicing_calling_leafcutter2.ipynb" +FIX = "tests/fixtures/splicing_calling/leafcutter" +GTF = "reference/Homo_sapiens.GRCh38.103.chr22.leafcutter2.reformatted.gtf" +FASTA = "reference/chr22.leafcutter2.fa.gz" + + +def test_cluster_requires_explicit_offset(run_sos, repo_root, tmp_path): + """--offset has no default on leafcutter2_cluster by design: it depends on the junction + file format and the wrong value corrupts classification silently. Omitting it must fail + at argument parsing, before any work is done, so this needs no binary and no reference data.""" + fix = repo_root / FIX + p = run_sos(repo_root / NB, "leafcutter2_cluster", + dict(cwd=tmp_path, samples=fix / "protocol_example.sample_list.txt", + juncfiles=fix / "protocol_example.junction_files.txt", + annotation_gtf=tmp_path / "absent.gtf", + genome_fasta=tmp_path / "absent.fa"), + cwd=repo_root, timeout=300) + assert p.returncode != 0 + assert "--offset" in (p.stdout + p.stderr) + + +def test_star2junc(run_sos, repo_root, tmp_path): + """Converts the shipped SJ.out.tab fixtures to BED6. Needs no reference data.""" + fix = repo_root / FIX + p = run_sos(repo_root / NB, "star2junc", + dict(cwd=tmp_path, samples=fix / "protocol_example.sample_list.txt", + data_dir=fix), + cwd=repo_root, timeout=600) + assert p.returncode == 0, p.stdout + p.stderr + + for sid in ("SAMPLE_001", "SAMPLE_002"): + out = tmp_path / f"{sid}.SJ.out.junc.gz" + assert out.exists(), f"missing {out}" + rows = [l for l in gzip.open(out, "rt").read().splitlines() if l.strip()] + assert rows, "no junctions written" + # BED6: chrom, start, end, name, score, strand + assert len(rows[0].split("\t")) == 6, rows[0] + + +def test_cluster_and_classify(run_sos, repo_root, tmp_path): + """leafcutter2_cluster on the shipped regtools junctions (hence --offset 1). + + --min-clu-reads 3 because the fixtures yield no cluster at the default 30, and + LeafCutter2 reports clustering success before failing later. The FASTA is copied + into tmp_path because LeafCutter2 (pyfastx) writes its index next to it. + """ + fix = repo_root / FIX + fasta = tmp_path / "ref" / "chr22.leafcutter2.fa.gz" + fasta.parent.mkdir() + for ext in ("", ".fai", ".gzi"): + shutil.copy(fix / (FASTA + ext), str(fasta) + ext) + p = run_sos(repo_root / NB, "leafcutter2_cluster", + dict(cwd=tmp_path, samples=fix / "protocol_example.sample_list.txt", + juncfiles=fix / "protocol_example.junction_files.txt", + annotation_gtf=fix / GTF, genome_fasta=fasta, + offset=1, min_clu_reads=3), + cwd=repo_root, timeout=1800) + assert p.returncode == 0, p.stdout + p.stderr + + ratios = tmp_path / "protocol_example.cluster_ratios.gz" + counts = tmp_path / "protocol_example.junction_counts.gz" + assert ratios.exists() and counts.exists() + + rows = [l for l in gzip.open(ratios, "rt").read().splitlines() if l.strip()] + assert len(rows) > 1, "no clusters survived filtering" + assert rows[0].split()[1:] == ["SAMPLE_001", "SAMPLE_002"], rows[0] + + chrom, *cells = rows[1].split() + # intron id carries the 5th :CLASS field that LeafCutter1 ids lack + parts = chrom.split(":") + assert len(parts) == 5, chrom + assert parts[4] in {"PR", "UP", "NE", "IN"}, chrom + # the reference fixture covers TTC28 so that some junction is classified against + # the annotation rather than only labelled intergenic (IN) + classes = {r.split()[0].split(":")[4] for r in rows[1:]} + assert classes - {"IN"}, classes + # cluster_ratios is numerator/denominator -- this is what splicing_normalization parses + assert all("/" in c for c in cells), cells + # junction_counts is plain integers, and is NOT a valid normalization input + crows = [l for l in gzip.open(counts, "rt").read().splitlines() if l.strip()] + assert "/" not in crows[1].split()[1], crows[1] + + +# ---------------------------------------------------------------- differential_splicing +# The split and join scripts need only base R, argparser and vroom; the per-part +# leafcutter_ds.R step needs the R leafcutter package and is not exercised here. +import subprocess + +from helpers.r_runner import rscript_bin + +SCRIPTS = "code/script/molecular_phenotypes/calling" +PARTS = [str(i) for i in range(1, 23)] + ["X", "other"] +SIG_HDR = "status\tloglr\tdf\tp\tcluster\tp.adjust" +EFF_HDR = "intron\tlogef\tA\tB\tdeltapsi" + + +def _script(repo_root, name, *args): + return subprocess.run([rscript_bin(), str(repo_root / SCRIPTS / name), *map(str, args)], + capture_output=True, text=True) + + +def _counts(path): + with gzip.open(path, "wt") as f: + f.write("S1 S2 S3\n") + f.write("chr1:10:20:clu_1_+ 1 2 3\n") + f.write("1:30:40:clu_2_+ 1 2 3\n") + f.write("chrX:10:20:clu_3_- 4 5 6\n") + f.write("chrY:10:20:clu_4_- 4 5 6\n") + f.write("GL000220.1:5:9:clu_5_+ 1 1 1\n") + + +def test_ds_split_by_chromosome(repo_root, tmp_path): + """Every row lands in exactly one part, 'chr' or not; all 24 parts exist with the header.""" + counts, groups = tmp_path / "c.counts.gz", tmp_path / "g.txt" + _counts(counts) + groups.write_text("S1 A\nS2 B\nS3 B\n") + p = _script(repo_root, "leafcutter_ds_split.R", "--counts", counts, "--groups", groups, + "--output-prefix", tmp_path / "parts" / "g") + assert p.returncode == 0, p.stderr + got = {} + for part in PARTS: + rows = gzip.open(tmp_path / "parts" / f"g.part_{part}.counts.gz", "rt").read().splitlines() + assert rows[0] == "S1 S2 S3", part + got[part] = [r.split()[0] for r in rows[1:]] + assert got["1"] == ["chr1:10:20:clu_1_+", "1:30:40:clu_2_+"] + assert got["X"] == ["chrX:10:20:clu_3_-"] + assert got["other"] == ["chrY:10:20:clu_4_-", "GL000220.1:5:9:clu_5_+"] + assert sum(len(v) for v in got.values()) == 5 + + +@pytest.mark.parametrize("groups, message", [ + ("SAMPLE_X A\nSAMPLE_Y B\n", "no sample"), + ("S1 A\nS2 B\nS3 C\n", "3 groups"), +]) +def test_ds_split_rejects_bad_groups(repo_root, tmp_path, groups, message): + """A groups file leafcutter_ds.R cannot use stops the run before any part is tested.""" + counts, g = tmp_path / "c.counts.gz", tmp_path / "g.txt" + _counts(counts) + g.write_text(groups) + p = _script(repo_root, "leafcutter_ds_split.R", "--counts", counts, "--groups", g, + "--output-prefix", tmp_path / "parts" / "g") + assert p.returncode != 0 + assert message in p.stderr, p.stderr + + +def test_ds_merge_recomputes_fdr(repo_root, tmp_path): + """The joined p.adjust is Benjamini-Hochberg over every tested cluster, as R's + p.adjust(method = "fdr") gives in one unsplit run; empty parts are skipped.""" + def part(name, sig_rows, eff_rows): + (tmp_path / f"{name}_cluster_significance.txt").write_text( + "".join(r + "\n" for r in ([SIG_HDR] + sig_rows if sig_rows else []))) + (tmp_path / f"{name}_effect_sizes.txt").write_text( + "".join(r + "\n" for r in ([EFF_HDR] + eff_rows if eff_rows else []))) + return tmp_path / f"{name}_cluster_significance.txt" + a = part("a", ["Success\t5\t1\t0.01\t1:clu_1_+\t0.02", "Success\t2\t1\t0.04\t1:clu_2_+\t0.04"], + ["1:1:2:clu_1_+\t0.1\t0.5\t0.6\t0.1"]) + b = part("b", ["Success\t3\t1\t0.03\t2:clu_3_-\t0.03", + "<=1 sample with coverage>min_coverage\tNA\tNA\tNA\t2:clu_4_-\tNA"], + ["2:1:2:clu_3_-\t-0.1\t0.6\t0.5\t-0.1"]) + c = part("c", [], []) + p = _script(repo_root, "leafcutter_ds_merge.R", "--output-prefix", tmp_path / "all", "--files", a, b, c) + assert p.returncode == 0, p.stderr + rows = (tmp_path / "all_cluster_significance.txt").read_text().splitlines() + assert rows[0] == SIG_HDR + q = {r.split("\t")[4]: r.split("\t")[5] for r in rows[1:]} + # m = 3 tested: 0.01 -> 0.03, 0.03 -> min(0.045, 0.04) = 0.04, 0.04 -> 0.04 + assert float(q["1:clu_1_+"]) == pytest.approx(0.03) + assert float(q["2:clu_3_-"]) == pytest.approx(0.04) + assert float(q["1:clu_2_+"]) == pytest.approx(0.04) + assert q["2:clu_4_-"] == "NA" + eff = (tmp_path / "all_effect_sizes.txt").read_text().splitlines() + assert eff[0] == EFF_HDR and len(eff) == 3 + + +def test_regtools_driver_rejects_bad_min_mapq(repo_root, tmp_path): + """--min-mapq is checked before samtools or regtools is called, so this needs neither.""" + p = subprocess.run(["bash", str(repo_root / SCRIPTS / "regtools_junctions.sh"), + "--bam", tmp_path / "x.bam", "--output", tmp_path / "x.junc", + "--strandness", "XS", "--min-mapq", "unique"], + capture_output=True, text=True) + assert p.returncode != 0 + assert "--min-mapq must be a whole number" in p.stderr, p.stderr