diff --git a/src/main/kotlin/org/jetbrains/bio/genome/Ensembl.kt b/src/main/kotlin/org/jetbrains/bio/genome/Ensembl.kt index 43ffe13..7554c8d 100644 --- a/src/main/kotlin/org/jetbrains/bio/genome/Ensembl.kt +++ b/src/main/kotlin/org/jetbrains/bio/genome/Ensembl.kt @@ -7,8 +7,6 @@ import org.slf4j.LoggerFactory import java.io.BufferedReader import java.io.BufferedWriter import java.nio.file.Path -import java.util.* -import kotlin.collections.ArrayList import kotlin.math.abs import kotlin.math.max import kotlin.math.min @@ -39,7 +37,7 @@ object Ensembl { } typealias Attributes = Array -class GtfReader(val reader: BufferedReader, val genome: Genome) { +class GtfReader(val reader: BufferedReader, val genome: Genome, val gff3: Boolean=false) { fun readTranscripts(): List { var hasDetailedUTRInfo: Boolean? = null @@ -52,7 +50,7 @@ class GtfReader(val reader: BufferedReader, val genome: Genome) { if (hasDetailedUTRInfo == null) { if (featureType == "five_prime_utr" || featureType == "three_prime_utr") { hasDetailedUTRInfo = true - } else if (featureType == "UTR") { + } else if (featureType == "utr") { hasDetailedUTRInfo = false } } @@ -143,17 +141,20 @@ class GtfReader(val reader: BufferedReader, val genome: Genome) { * 1. old: exon, CDS, start_codon, stop_codon * 2. 75: exon, CDS, start_codon, stop_codon, transcript, UTR * 3. 87: exon, CDS, stop_codon, gene, transcript, three_prime_utr, five_prime_utr + * 4. gff3 [chm13t2t-v1.1.gene_annotation.v4.gff3.gz]: + * exon, CDS, stop_codon, gene, transcript, start_codon, stop_codon, three_prime_UTR, five_prime_UTR, */ val chrStr = parts[0] - val type = parts[2] + val type = parts[2].toLowerCase() val chr = chrsNamesMapping[chrStr]?.let { chr -> if (genomeQuery.accepts(chr)) chr else null } ?: return type - when (type) { + when (type.toLowerCase()) { // just not to write long if condition: - "transcript", "exon", "CDS", "start_codon", "three_prime_utr" -> { /* noop */ } + "transcript", "exon", "cds", "start_codon", "three_prime_utr" -> { /* noop */ } + // e.g. five_prime_utr, stop_codon : transcript is already configured by 3' and start_codon else -> return type } @@ -167,20 +168,35 @@ class GtfReader(val reader: BufferedReader, val genome: Genome) { // transcript_source "havana" // Predicted genes: // transcript_source "ensembl" + // Or + // transcript_source "CAT" + + val transcriptIdKey: AttrTypes = when { + gff3 -> Gff3AttrTypes.TRANSCRIPT_ID + else -> GtfAttrTypes.TRANSCRIPT_ID + } - val transcriptId = attributes[GtfAttrTypes.TRANSCRIPT_ID.ordinal]!! + val geneNameKey: AttrTypes = when { + gff3 -> Gff3AttrTypes.GENE_NAME + else -> GtfAttrTypes.GENE_NAME + } + val geneIdKey: AttrTypes = when { + gff3 -> Gff3AttrTypes.GENE_ID + else -> GtfAttrTypes.GENE_ID + } + val transcriptId = attributes[transcriptIdKey.ordinal]!! val transcriptInfo = transcriptsMap.getOrPut(transcriptId) { TranscriptInfo(transcriptId, - attributes[GtfAttrTypes.GENE_NAME.ordinal]!!, - attributes[GtfAttrTypes.GENE_ID.ordinal]!!) + attributes[geneNameKey.ordinal]!!, + attributes[geneIdKey.ordinal]!!) } val location = Location(start - 1, end, chr, strand) when (type) { "exon" -> { transcriptInfo.exons.add(location) } - "CDS" -> { transcriptInfo.cds.add(location) } + "cds" -> { transcriptInfo.cds.add(location) } "transcript" -> { transcriptInfo.transcript = location } "three_prime_utr" -> { transcriptInfo.utr3.add(location) } "start_codon" -> { @@ -210,7 +226,10 @@ class GtfReader(val reader: BufferedReader, val genome: Genome) { } private fun parseAttributes(rest: String): Attributes { - val attrTypes = GtfAttrTypes.values() + val attrTypes: Array = when { + gff3 -> Gff3AttrTypes.values() + else -> GtfAttrTypes.values() + } val attributes = Array(attrTypes.size) { null } for (chunk in rest.split(";")) { @@ -221,17 +240,36 @@ class GtfReader(val reader: BufferedReader, val genome: Genome) { // if attr not set & is our key if (trimmed.startsWith(key)) { - val value = trimmed.substring(key.length).trimStart() - check(value[0] == '"' && value.last() == '"') { "Cannot parse: $key value, attrs list = $rest" } - attributes[i] = value.substring(1, value.length - 1) - break + + if (gff3) { + val chunks = trimmed.split('=', limit = 2) + check(chunks.size == 2) { "Cannot parse: $key value from <$trimmed>, attrs list = $rest" } + if (chunks[0] == key) { + attributes[i] = chunks[1] + } + } else { + val value = trimmed.substring(key.length).trimStart() + check(value[0] == '"' && value.last() == '"') { "Cannot parse: $key value from <$trimmed>, attrs list = $rest" } + attributes[i] = value.substring(1, value.length - 1) + break + } } } } - if (attributes[GtfAttrTypes.GENE_NAME.ordinal] == null) { + + val geneNameKey: AttrTypes = when { + gff3 -> Gff3AttrTypes.GENE_NAME + else -> GtfAttrTypes.GENE_NAME + } + val geneIdKey: AttrTypes = when { + gff3 -> Gff3AttrTypes.GENE_ID + else -> GtfAttrTypes.GENE_ID + } + + if (attributes[geneNameKey.ordinal] == null) { // not all gtf genes has 'gene_name' attr, i.e. defines gene symbol, e.g not info in ce11, rn5 - attributes[GtfAttrTypes.GENE_NAME.ordinal] = attributes[GtfAttrTypes.GENE_ID .ordinal] + attributes[geneNameKey.ordinal] = attributes[geneIdKey.ordinal] } check(attributes.all { it != null }) { @@ -241,12 +279,22 @@ class GtfReader(val reader: BufferedReader, val genome: Genome) { return attributes } - enum class GtfAttrTypes(val key: String) { + interface AttrTypes { + val key: String + val ordinal: Int + } + enum class GtfAttrTypes(override val key: String) : AttrTypes { TRANSCRIPT_ID("transcript_id"), GENE_ID("gene_id"), GENE_NAME("gene_name"); } + enum class Gff3AttrTypes(override val key: String) : AttrTypes { + TRANSCRIPT_ID("source_transcript"), + GENE_ID("source_gene"), + GENE_NAME("source_gene_common_name"); + } + class TranscriptInfo(val transcriptId: String, val geneName: String, val geneId: String) { diff --git a/src/main/kotlin/org/jetbrains/bio/genome/Genome.kt b/src/main/kotlin/org/jetbrains/bio/genome/Genome.kt index 937ce9c..f7c19c6 100644 --- a/src/main/kotlin/org/jetbrains/bio/genome/Genome.kt +++ b/src/main/kotlin/org/jetbrains/bio/genome/Genome.kt @@ -116,7 +116,7 @@ class Genome private constructor( val genesDescriptionsPath: Path by lazy { ensureNotNull(genesDescriptionsPath, "Gene Description") } /** - * Ensure *.gtf file exists and download it if necessary + * Ensure *.gtf or *.gff file exists and download it if necessary */ fun genesGtfPath(downloadIfMissed: Boolean = true) = ensureNotNull(genesGTFPath, "Genes GTF Annotations").also { genesGTFPath -> diff --git a/src/main/kotlin/org/jetbrains/bio/genome/Transcripts.kt b/src/main/kotlin/org/jetbrains/bio/genome/Transcripts.kt index 50108b1..b7056c3 100644 --- a/src/main/kotlin/org/jetbrains/bio/genome/Transcripts.kt +++ b/src/main/kotlin/org/jetbrains/bio/genome/Transcripts.kt @@ -281,8 +281,10 @@ object Transcripts { genome.genesGtfPath(true) val transcripts = LOG.time(level = Level.INFO, message = "Parsing genes $gtfFile") { + val fileNameLower = gtfFile.name.toLowerCase() + val gff3 = fileNameLower.endsWith(".gff3") || fileNameLower.endsWith(".gff3.gz") gtfFile.bufferedReader().use { reader -> - GtfReader(reader, genome).readTranscripts() + GtfReader(reader, genome, gff3=gff3).readTranscripts() // sort by 5' offset then by ensemblId (to be deterministic), // it is required for bound5Index() correct work, // please don't change it to sort by start offset diff --git a/src/test/kotlin/org/jetbrains/bio/genome/EnsemblTest.kt b/src/test/kotlin/org/jetbrains/bio/genome/EnsemblTest.kt index 0be8ba3..83ef23a 100644 --- a/src/test/kotlin/org/jetbrains/bio/genome/EnsemblTest.kt +++ b/src/test/kotlin/org/jetbrains/bio/genome/EnsemblTest.kt @@ -2,6 +2,7 @@ package org.jetbrains.bio.genome import org.junit.Test import kotlin.test.assertEquals +import kotlin.test.assertNull /** * @author Roman.Chernyatchik @@ -144,6 +145,73 @@ class GtfReaderTest { 1 havana five_prime_utr 1266802 1267164 . + . gene_id "ENSG00000099622"; gene_version "9"; transcript_id "ENST00000589266"; transcript_version "1"; gene_name "CIRBP"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CIRBP-017"; transcript_source "havana"; transcript_biotype "protein_coding"; havana_transcript "OTTHUMT00000449976"; havana_transcript_version "2"; tag "mRNA_end_NF"; 1 havana five_prime_utr 1270927 1270932 . + . gene_id "ENSG00000099622"; gene_version "9"; transcript_id "ENST00000589266"; transcript_version "1"; gene_name "CIRBP"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CIRBP-017"; transcript_source "havana"; transcript_biotype "protein_coding"; havana_transcript "OTTHUMT00000449976"; havana_transcript_version "2"; tag "mRNA_end_NF"; 1 havana three_prime_utr 1272993 1272995 . + . gene_id "ENSG00000099622"; gene_version "9"; transcript_id "ENST00000589266"; transcript_version "1"; gene_name "CIRBP"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CIRBP-017"; transcript_source "havana"; transcript_biotype "protein_coding"; havana_transcript "OTTHUMT00000449976"; havana_transcript_version "2"; tag "mRNA_end_NF"; +""" + + val ENST00000589266_GFF3 = """#ENST00000589266, chm13t2t-v1.1:1235322-1239883 +chr1 CAT transcript 1235322 1239883 10000 + . source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;frameshift=nan;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_G0027049;transcript_name=CIRBP-223;ID=CHM13_T0105406;Name=CIRBP;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;extra_paralog=False +chr1 CAT exon 1235322 1235689 . + . source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=exon:CHM13_T0105406:0;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +chr1 CAT intron 1235690 1239450 . + . source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=intron:CHM13_T0105406:0;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +chr1 CAT exon 1239451 1239559 . + . source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=exon:CHM13_T0105406:1;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +chr1 CAT CDS 1239457 1239559 . + 0 source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=CDS:CHM13_T0105406:0;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +chr1 CAT start_codon 1239457 1239459 . + 0 source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=start_codon:CHM13_T0105406;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +chr1 CAT intron 1239560 1239662 . + . source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=intron:CHM13_T0105406:1;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +chr1 CAT exon 1239663 1239769 . + . source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=exon:CHM13_T0105406:2;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +chr1 CAT CDS 1239663 1239769 . + 2 source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=CDS:CHM13_T0105406:1;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +chr1 CAT intron 1239770 1239851 . + . source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=intron:CHM13_T0105406:2;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +chr1 CAT exon 1239852 1239883 . + . source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=exon:CHM13_T0105406:3;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +chr1 CAT CDS 1239852 1239883 . + 0 source_transcript=ENST00000589266.5;source_transcript_name=CIRBP-223;source_gene=ENSG00000099622.14;transcript_modes=transMap;gene_biotype=protein_coding;transcript_biotype=protein_coding;alignment_id=ENST00000589266.5-0;exon_annotation_support=1,1,1,1;intron_annotation_support=1,2,2;transcript_class=ortholog;valid_start=True;valid_stop=False;adj_start=1239453;adj_stop=1239880;proper_orf=False;level=2;protein_id=ENSP00000467138.2;transcript_support_level=3;hgnc_id=HGNC:1982;tag=alternative_5_UTR,mRNA_end_NF,cds_end_NF;havana_gene=OTTHUMG00000180145.11;havana_transcript=OTTHUMT00000473912.2;paralogy=nan;unfiltered_paralogy=nan;source_gene_common_name=CIRBP;transcript_id=CHM13_T0105406;gene_id=CHM13_G0027049;Parent=CHM13_T0105406;transcript_name=CIRBP-223;ID=CDS:CHM13_T0105406:2;Name=CIRBP;rna_support=N/A;reference_support=True;gene_name=CHM13_G0027049;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False +""" + + val ENST00000457736_GFF3="""# several transcripts, but same IDs +chr4 Liftoff transcript 9127305 9128897 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002011;Parent=LOFF_G0002011;transcript_id=LOFF_T0002506;transcript_name=USP17L11-1;ID=LOFF_T0002506;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9127305 9128897 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002011;transcript_id=LOFF_T0002506;transcript_name=USP17L11-0;Parent=LOFF_T0002506;ID=exon:LOFF_T0002506:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9127305 9128897 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002011;transcript_id=LOFF_T0002506;transcript_name=USP17L11-0;Parent=LOFF_T0002506;ID=CDS:LOFF_T0002506:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9132054 9133646 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002012;Parent=LOFF_G0002012;transcript_id=LOFF_T0002508;transcript_name=USP17L11-1;ID=LOFF_T0002508;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9132054 9133646 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002012;transcript_id=LOFF_T0002508;transcript_name=USP17L11-0;Parent=LOFF_T0002508;ID=exon:LOFF_T0002508:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9132054 9133646 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002012;transcript_id=LOFF_T0002508;transcript_name=USP17L11-0;Parent=LOFF_T0002508;ID=CDS:LOFF_T0002508:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9136804 9138396 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002013;Parent=LOFF_G0002013;transcript_id=LOFF_T0002510;transcript_name=USP17L11-1;ID=LOFF_T0002510;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9136804 9138396 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002013;transcript_id=LOFF_T0002510;transcript_name=USP17L11-0;Parent=LOFF_T0002510;ID=exon:LOFF_T0002510:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9136804 9138396 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002013;transcript_id=LOFF_T0002510;transcript_name=USP17L11-0;Parent=LOFF_T0002510;ID=CDS:LOFF_T0002510:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9141553 9143145 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002014;Parent=LOFF_G0002014;transcript_id=LOFF_T0002512;transcript_name=USP17L11-1;ID=LOFF_T0002512;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9141553 9143145 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002014;transcript_id=LOFF_T0002512;transcript_name=USP17L11-0;Parent=LOFF_T0002512;ID=exon:LOFF_T0002512:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9141553 9143145 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002014;transcript_id=LOFF_T0002512;transcript_name=USP17L11-0;Parent=LOFF_T0002512;ID=CDS:LOFF_T0002512:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9146303 9147895 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002015;Parent=LOFF_G0002015;transcript_id=LOFF_T0002514;transcript_name=USP17L11-1;ID=LOFF_T0002514;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9146303 9147895 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002015;transcript_id=LOFF_T0002514;transcript_name=USP17L11-0;Parent=LOFF_T0002514;ID=exon:LOFF_T0002514:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9146303 9147895 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002015;transcript_id=LOFF_T0002514;transcript_name=USP17L11-0;Parent=LOFF_T0002514;ID=CDS:LOFF_T0002514:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9151054 9152646 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002016;Parent=LOFF_G0002016;transcript_id=LOFF_T0002516;transcript_name=USP17L11-1;ID=LOFF_T0002516;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9151054 9152646 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002016;transcript_id=LOFF_T0002516;transcript_name=USP17L11-0;Parent=LOFF_T0002516;ID=exon:LOFF_T0002516:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9151054 9152646 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002016;transcript_id=LOFF_T0002516;transcript_name=USP17L11-0;Parent=LOFF_T0002516;ID=CDS:LOFF_T0002516:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9165302 9166894 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002019;Parent=LOFF_G0002019;transcript_id=LOFF_T0002521;transcript_name=USP17L11-1;ID=LOFF_T0002521;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9165302 9166894 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002019;transcript_id=LOFF_T0002521;transcript_name=USP17L11-0;Parent=LOFF_T0002521;ID=exon:LOFF_T0002521:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9165302 9166894 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002019;transcript_id=LOFF_T0002521;transcript_name=USP17L11-0;Parent=LOFF_T0002521;ID=CDS:LOFF_T0002521:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9170051 9171643 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002020;Parent=LOFF_G0002020;transcript_id=LOFF_T0002523;transcript_name=USP17L11-1;ID=LOFF_T0002523;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9170051 9171643 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002020;transcript_id=LOFF_T0002523;transcript_name=USP17L11-0;Parent=LOFF_T0002523;ID=exon:LOFF_T0002523:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9170051 9171643 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002020;transcript_id=LOFF_T0002523;transcript_name=USP17L11-0;Parent=LOFF_T0002523;ID=CDS:LOFF_T0002523:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9174798 9176390 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002021;Parent=LOFF_G0002021;transcript_id=LOFF_T0002525;transcript_name=USP17L11-1;ID=LOFF_T0002525;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9174798 9176390 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002021;transcript_id=LOFF_T0002525;transcript_name=USP17L11-0;Parent=LOFF_T0002525;ID=exon:LOFF_T0002525:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9174798 9176390 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002021;transcript_id=LOFF_T0002525;transcript_name=USP17L11-0;Parent=LOFF_T0002525;ID=CDS:LOFF_T0002525:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9184299 9185891 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002023;Parent=LOFF_G0002023;transcript_id=LOFF_T0002528;transcript_name=USP17L11-1;ID=LOFF_T0002528;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9184299 9185891 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002023;transcript_id=LOFF_T0002528;transcript_name=USP17L11-0;Parent=LOFF_T0002528;ID=exon:LOFF_T0002528:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9184299 9185891 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002023;transcript_id=LOFF_T0002528;transcript_name=USP17L11-0;Parent=LOFF_T0002528;ID=CDS:LOFF_T0002528:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9189049 9190641 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002024;Parent=LOFF_G0002024;transcript_id=LOFF_T0002530;transcript_name=USP17L11-1;ID=LOFF_T0002530;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9189049 9190641 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002024;transcript_id=LOFF_T0002530;transcript_name=USP17L11-0;Parent=LOFF_T0002530;ID=exon:LOFF_T0002530:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9189049 9190641 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002024;transcript_id=LOFF_T0002530;transcript_name=USP17L11-0;Parent=LOFF_T0002530;ID=CDS:LOFF_T0002530:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9193800 9195392 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002025;Parent=LOFF_G0002025;transcript_id=LOFF_T0002532;transcript_name=USP17L11-1;ID=LOFF_T0002532;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9193800 9195392 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002025;transcript_id=LOFF_T0002532;transcript_name=USP17L11-0;Parent=LOFF_T0002532;ID=exon:LOFF_T0002532:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9193800 9195392 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002025;transcript_id=LOFF_T0002532;transcript_name=USP17L11-0;Parent=LOFF_T0002532;ID=CDS:LOFF_T0002532:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9198551 9200143 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002026;Parent=LOFF_G0002026;transcript_id=LOFF_T0002534;transcript_name=USP17L11-1;ID=LOFF_T0002534;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9198551 9200143 . + . gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002026;transcript_id=LOFF_T0002534;transcript_name=USP17L11-0;Parent=LOFF_T0002534;ID=exon:LOFF_T0002534:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9198551 9200143 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.2;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=True;gene_id=LOFF_G0002026;transcript_id=LOFF_T0002534;transcript_name=USP17L11-0;Parent=LOFF_T0002534;ID=CDS:LOFF_T0002534:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=paralog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff transcript 9227046 9228638 . + . gene_name=USP17L11;source_gene=ENSG00000233136.3;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=False;gene_id=LOFF_G0002032;Parent=LOFF_G0002032;transcript_id=LOFF_T0002541;transcript_name=USP17L11-1;ID=LOFF_T0002541;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=ortholog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff start_codon 9227046 9227048 . + . gene_name=USP17L11;source_gene=ENSG00000233136.3;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=False;gene_id=LOFF_G0002032;transcript_id=LOFF_T0002541;transcript_name=USP17L11-0;Parent=LOFF_T0002541;ID=start_codon:LOFF_T0002541;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=ortholog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff exon 9227046 9228638 . + . gene_name=USP17L11;source_gene=ENSG00000233136.3;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=False;gene_id=LOFF_G0002032;transcript_id=LOFF_T0002541;transcript_name=USP17L11-0;Parent=LOFF_T0002541;ID=exon:LOFF_T0002541:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=ortholog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff CDS 9227046 9228638 . + 0 gene_name=USP17L11;source_gene=ENSG00000233136.3;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=False;gene_id=LOFF_G0002032;transcript_id=LOFF_T0002541;transcript_name=USP17L11-0;Parent=LOFF_T0002541;ID=CDS:LOFF_T0002541:0;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=ortholog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A +chr4 Liftoff stop_codon 9228636 9228638 . + . gene_name=USP17L11;source_gene=ENSG00000233136.3;gene_biotype=protein_coding;transcript_biotype=protein_coding;source_transcript=ENST00000457736.1;Name=USP17L11;source_gene_common_name=USP17L11;extra_paralog=False;gene_id=LOFF_G0002032;transcript_id=LOFF_T0002541;transcript_name=USP17L11-0;Parent=LOFF_T0002541;ID=stop_codon:LOFF_T0002541;alignment_id=N/A;alternative_source_transcripts=N/A;paralogy=N/A;unfiltered_paralogy=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;exon_annotation_support=N/A;intron_annotation_support=N/A;transcript_class=ortholog;transcript_modes=Liftoff;valid_start=N/A;valid_stop=N/A;proper_orf=N/A""" + + val GFF3_HEAD = """##gff-version 3 +chr1 CAT gene 14253 21099 . + . source_gene_common_name=AC114498.1;source_gene=ENSG00000235146.2;gene_biotype=lncRNA;gene_alternate_contigs=chr6:172104635-172111468;gene_id=CHM13_G0000001;gene_name=AC114498.1;transcript_modes=transMap;ID=CHM13_G0000001;Name=AC114498.1;source_transcript=N/A;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;paralogy=N/A;unfiltered_paralogy=N/A;alignment_id=N/A;frameshift=N/A;exon_anotation_support=N/A;intron_annotation_support=N/A;transcript_class=N/A;valid_start=N/A;valid_stop=N/A;proper_orf=N/A;extra_paralog=False +chr1 CAT transcript 14253 21099 8940 + . source_transcript=ENST00000423796.1;source_transcript_name=AC114498.1-201;source_gene=ENSG00000235146.2;transcript_modes=transMap;gene_biotype=lncRNA;transcript_biotype=lncRNA;alignment_id=ENST00000423796.1-1;frameshift=nan;exon_annotation_support=1,1;intron_annotation_support=1;transcript_class=ortholog;valid_start=True;valid_stop=True;adj_start=nan;adj_stop=nan;proper_orf=True;level=2;transcript_support_level=5;tag=not_best_in_genome_evidence,basic;havana_gene=OTTHUMG00000002329.1;havana_transcript=OTTHUMT00000006707.1;paralogy=nan;unfiltered_paralogy=ENST00000423796.1-2;gene_alternate_contigs=chr6:172104635-172111468;source_gene_common_name=AC114498.1;transcript_id=CHM13_T0000001;gene_id=CHM13_G0000001;Parent=CHM13_G0000001;transcript_name=AC114498.1-201;ID=CHM13_T0000001;Name=AC114498.1;gene_name=CHM13_G0000001;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;extra_paralog=False +chr1 CAT exon 14253 14325 . + . source_transcript=ENST00000423796.1;source_transcript_name=AC114498.1-201;source_gene=ENSG00000235146.2;transcript_modes=transMap;gene_biotype=lncRNA;transcript_biotype=lncRNA;alignment_id=ENST00000423796.1-1;exon_annotation_support=1,1;intron_annotation_support=1;transcript_class=ortholog;valid_start=True;valid_stop=True;adj_start=nan;adj_stop=nan;proper_orf=True;level=2;transcript_support_level=5;tag=not_best_in_genome_evidence,basic;havana_gene=OTTHUMG00000002329.1;havana_transcript=OTTHUMT00000006707.1;paralogy=nan;unfiltered_paralogy=ENST00000423796.1-2;gene_alternate_contigs=chr6:172104635-172111468;source_gene_common_name=AC114498.1;transcript_id=CHM13_T0000001;gene_id=CHM13_G0000001;Parent=CHM13_T0000001;transcript_name=AC114498.1-201;ID=exon:CHM13_T0000001:0;Name=AC114498.1;rna_support=N/A;reference_support=True;gene_name=CHM13_G0000001;alternative_source_transcripts=N/A;collapsed_gene_ids=N/A;collapsed_gene_names=N/A;frameshift=N/A;extra_paralog=False """ val ENST00000457222 = """# ENST00000457222, hg19: +chrY:9236030-9238826 @@ -480,6 +548,36 @@ class GtfReaderTest { // according to GTF: assertEquals(listOf(Range(1272992, 1272995)), transcript.utr3.map(Location::toRange)) } + @Test + fun gff3_ENST00000457736() { + val reader = GtfReader(ENST00000457736_GFF3.reader().buffered(), Genome["to1"], gff3=true) + val transcripts = reader.readTranscripts() + assertEquals(14, transcripts.size) + + // todo: transcripts ranges check + } + @Test + fun gff3_ENST00000589266() { + val transcript = readTranscript(ENST00000589266_GFF3, gff3 = true) + + assertEquals(Range(1235321, 1239883), transcript.location.toRange()) + assertEquals(Range(1239851, 1239883), transcript.cds.map(Location::toRange).last()) + assertEquals(Range(1239456, 1239883), transcript.cdsRange) + + assertEquals(listOf(), transcript.utr3.map(Location::toRange)) + } + @Test + fun gff3_Head() { + val transcript = readTranscript(GFF3_HEAD, gff3 = true) + + assertEquals(Range(14252, 21099), transcript.location.toRange()) + assertEquals(listOf(), transcript.cds.map(Location::toRange)) + assertNull(transcript.cdsRange) + + // here stop codon should be [1272992, 1272994] => actually no UTR3, but + // according to GTF: + assertEquals(listOf(), transcript.utr3.map(Location::toRange)) + } @Test fun stopCodonInCDS() { @@ -550,8 +648,8 @@ class GtfReaderTest { )) } - private fun readTranscript(content: String): Transcript { - val reader = GtfReader(content.reader().buffered(), Genome["to1"]) + private fun readTranscript(content: String, gff3: Boolean=false): Transcript { + val reader = GtfReader(content.reader().buffered(), Genome["to1"], gff3=gff3) val transcripts = reader.readTranscripts() assertEquals(1, transcripts.size) return transcripts[0]