I want to get a set of exon regions for each protein coding gene.

I extracted a set of relevant information (chromosome, start, end, gene ID, gene name, gene type, exon number and exon ID) from a GTF using:

awk '$3 == "exon"' annotation.gtf \
  | gtf2bed \
  | cut -f1-4,10 \
  | awk 'match($0, /gene_name \"[a-zA-Z0-9\_\-.\/]*\"/, gene_name) 
    && match($0, /gene_type \"[^"]*\"/, gene_type) 
    && match($0, /exon_number [0-9]*/, exon_number) 
    && match($0, /exon_id \"[^"]*\"/, exon_id) { 
      print $1,$2,$3,$4,gene_name[0],gene_type[0],exon_number[0],exon_id[0];
    }' \
  | tr -d '"' \
  | tr ' ' $'\t' \
  | cut -f1-4,6,8,10,12 \
  | grep 'protein_coding' \
  > annotation.exons.bed

However, during a sanity check, I noticed that for some genes there are some exons with overlapping coordinates, same gene information and exon number, but different exon ID, e.g.:

chr2    9423650 9424052 ENSG00000119203.14      CPSF3   protein_coding  1       ENSE00001829522.1
chr2    9423653 9423823 ENSG00000119203.14      CPSF3   protein_coding  1       ENSE00001830696.2
chr2    9423883 9424960 ENSG00000119203.14      CPSF3   protein_coding  1       ENSE00001932298.1

I did not directly work with exons in the past, but I am aware of alternative splicing. My understanding was that exons can be skipped during alternative splicing, but I assumed that exon number was unique for bases, within the same gene (on the same strand).

In the example above, the first 2 listed exons have the same exon number, overlapping (but not exactly the same) bases, and different exon ID. Is this due to some additional information that I can retrieve from the GTF, i.e., from:

chr2    9423650 9424052 ENSG00000119203.14      .       +       HAVANA  exon    .       gene_id "ENSG00000119203.14"; transcript_id "ENST00000475482.5"; gene_type "protein_coding"; gene_name "CPSF3"; transcript_type "protein_coding"; transcript_name "CPSF3-203"; exon_number 1; exon_id "ENSE00001829522.1"; level 2; protein_id "ENSP00000419744.1"; transcript_support_level "4"; hgnc_id "HGNC:2326"; tag "mRNA_end_NF"; tag "cds_end_NF"; havana_gene "OTTHUMG00000090415.5"; havana_transcript "OTTHUMT00000353331.3";
chr2    9423653 9423823 ENSG00000119203.14      .       +       HAVANA  exon    .       gene_id "ENSG00000119203.14"; transcript_id "ENST00000238112.8"; gene_type "protein_coding"; gene_name "CPSF3"; transcript_type "protein_coding"; transcript_name "CPSF3-201"; exon_number 1; exon_id "ENSE00001830696.2"; level 2; protein_id "ENSP00000238112.3"; transcript_support_level "1"; hgnc_id "HGNC:2326"; tag "basic"; tag "MANE_Select"; tag "appris_principal_1"; tag "CCDS"; ccdsid "CCDS1664.1"; havana_gene "OTTHUMG00000090415.5"; havana_transcript "OTTHUMT00000206843.2";


Is this because the different exons belong to different transcripts? However, shouldn't different exons still be non-overlapping one against each other?


1 Answer 1


I'm not quite sure what you're asking, but pretty much anything can happen in terms of exons and transcripts:

  • Two different genes encoded on different strands can share the same genomic region as an exon

  • Two different genes encoded on the same strand can share the same genomic region as an exon (including identical exon boundaries)

  • A gene can have multiple transcript isoforms that share the same genomic region on the same frame

  • A gene can have multiple isoforms that share the same genomic region in different frames

  • Genes can have variable regions which are modified during somatic development (e.g. T-cell and B-cell receptors)

  • Gene transcripts can be spliced together in different orders in different isoforms

  • Exons from one transcript isoform can overlap with exons from another isoform (but not necessarily cover identical regions)

  • Stop codons can occasionally be "read-through", resulting in a longer protein/peptide than the expected translation

As an example of different isoforms within the same gene exhibiting different translation mechanisms, here are graphical representations of annotated transcript isoforms for Gapdh on the mouse GRCm38 assembly, created in JBrowse. I wouldn't put complete trust in any of these (especially not the ones that have no defined intronic regions), but it's a useful demonstration of the types of things that can happen. Compare, Gapdh-207, where an untranslated region starts halfway through an exon, and Gapdh-209, where the translated protein starts halfway through an untranslated exon in Gapdh-207:

Gapdh isoforms, showing overlapping exons

If there is a situation where it seems like exons from the same isoform have overlapping regions, it might be worth looking elsewhere in the genome to see if there's a transcribed gene copy somewhere. That, at least, doesn't seem to be something I'd expect to happen through the normal translation process.

Also, don't expect annotations to be complete. Even on something as [presumably] well-studied as the mouse mitochondrial genome, we can identify clear transcript start/stop points from long polyA cDNA sequences that are completely absent in the genome annotations. This is most obvious for the completely unannotated reverse strand (e.g. transcript starting at around 16,200bp), but also happens on the forward strand as well (e.g. coverage steps within mt-Nd5):

GRCm38 mitochondrial genome, with annotation and mapped transcript coverage plots

  • $\begingroup$ Thank you, I believe my confusion was due to the fact that I was not aware of the exon behavior from your two last points. This I think might explain what it is happening in my case, where the exon 1 from the first transcript shares some bases (but not exactly the same interval) with exon 1 from the second transcript. I used to think that transcripts (on the same strand) might have different exons, but the set of exons from which they could select their subset was composed by non-overlapping exons. $\endgroup$
    – gc5
    Mar 16, 2022 at 1:07
  • $\begingroup$ May I know which software or tool you are using to show Gadph exons in the images your provided here $\endgroup$ Feb 19, 2023 at 12:24
  • $\begingroup$ I've updated my answer. I used JBrowse (v1 to be specific, but v2 is the most current version). $\endgroup$
    – gringer
    Feb 19, 2023 at 12:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.