<p>It is certainly possible to encode polycistrons in GFF3. In fact, this is discussed explicitly in the <a href="https://github.com/The-Sequence-Ontology/Specifications/blob/master/gff3.md" rel="nofollow noreferrer">GFF3 specification</a>.</p>

<blockquote>
  <h3><em>Polycistronic transcripts</em></h3>
  
  <p>This is the case in which a single (possibly spliced) transcript encodes multiple open reading frames that generate independent protein products.</p>
  
  <p><code>-----&gt;XXXXXXX*--&gt;BBBBBB*---&gt;ZZZZ*--&gt;AAAAAA*-----</code></p>
  
  <p>Since the single transcript corresponds to multiple genes that can be identified by genetic analysis, the recommended solution here is to create four "gene" objects and make them the parent for a single transcript. The transcript will contain a single exon (in the unspliced case) and four separate CDSs:</p>

<pre><code>chrX  . gene XXXX YYYY  .  +  . ID=gene01;name=resA
chrX  . gene XXXX YYYY  .  +  . ID=gene02;name=resB
chrX  . gene XXXX YYYY  .  +  . ID=gene03;name=resX
chrX  . gene XXXX YYYY  .  +  . ID=gene04;name=resZ
chrX  . mRNA XXXX YYYY  .  +  . ID=tran01;Parent=gene01,gene02,gene03,gene04
chrX  . exon XXXX YYYY  .  +  . ID=exon00001;Parent=tran01
chrX  . CDS  XXXX YYYY  .  +  . Parent=tran01;Derives_from=gene01
chrX  . CDS  XXXX YYYY  .  +  . Parent=tran01;Derives_from=gene02
chrX  . CDS  XXXX YYYY  .  +  . Parent=tran01;Derives_from=gene03
chrX  . CDS  XXXX YYYY  .  +  . Parent=tran01;Derives_from=gene04
</code></pre>
  
  <p>To disambiguate the relationship between which genes encode which CDSs, you may use the <code>Derives_from</code> relationship.</p>
</blockquote>

<p>This example doesn't indicate what the coordinates of each feature should be, but I think it makes most sense to have the <code>gene</code> and <code>CDS</code> feature coordinates correspond to the region coding each protein product, and the <code>mRNA</code> and <code>exon</code> feature coordinates correspond to the entire span.</p>

<p><strong>BIG CAVEAT</strong>: Polycistrons are not typically considered a normal feature of eukaryotic genomes—they're much more common in bacteria and archaea. However, there are some confirmed cases of eukaryotic polycistronic mRNAs. That said, if overlapping gene predictions are observed in a GFF3 file, one cannot immediately assume that these are polycistronic. One or both of the gene predictions might be technical artifacts, or real genes that are incorrectly annotated, or (more rarely) actual overlapping genes. A claim that multiple protein products are expressed from a single transcript would require some convincing experimental validation.</p>

CC BY-SA 4.0
2019-02-28T19:25:28.097Z
2019-02-28T19:25:28.097Z
Daniel Standage
<p>If you found another CDS from 3750 to 3904 then it would necessarily be on a different transcript, given that you already have a CDS from 3860 to 3913 and having overlapping CDSs on the same transcript doesn't make much biological sense (though I'm sure there's some weird organism out there that has a gene like this). So the likely GFF3 file would look like:</p>

<pre><code>1   T1  gene    3631    4605    .   +   .   ID=ATNG01010
1   T1  mRNA    3631    4605    .   +   .   ID=ATNG01010.1;Parent=ATNG01010
1   T1  exon    3631    3913    .   +   .   ID=ATNG01010:exon:1;Parent=ATNG01010.1
1   T1  CDS     3860    3913    .   +   0   ID=ATNG01010:CDS:1;Parent=ATNG01010.1
1   T1  exon    3996    4276    .   +   .   ID=ATNG01010:exon:2;Parent=ATNG01010.1
1   T1  CDS     3996    4260    .   +   2   ID=ATNG01010:CDS:2;Parent=ATNG01010.1
1   T1  exon    4486    4605    .   +   .   ID=ATNG01010:exon:3;Parent=ATNG01010.1
1   T1  mRNA    3631    4605    .   +   .   ID=ATNG01010.2;Parent=ATNG01010
1   T1  exon    3631    3913    .   +   .   ID=ATNG01010.2:exon:1;Parent=ATNG01010.2
1   T1  CDS     3759    3904    .   +   0   ID=ATNG01010.2:CDS:1;Parent=ATNG01010.2
1   T1  exon    3996    4276    .   +   .   ID=ATNG01010.2:exon:2;Parent=ATNG01010.2
1   T1  CDS     3996    4260    .   +   2   ID=ATNG01010.2:CDS:2;Parent=ATNG01010.2
1   T1  exon    4486    4605    .   +   .   ID=ATNG01010.2:exon:3;Parent=ATNG01010.2
</code></pre>

<p>Note that I've just added another transcript, since that's likely what would be biologically going on.</p>

CC BY-SA 3.0
2018-01-04T16:43:38.587Z
I calculate the ORF wrong (should be from 3752 to 3904, not 3750 to 3904). Please see the updated question. It does overlap with the original CDS but not in the same frame. This is a type of [uORF](https://www.researchgate.net/figure/The-location-of-a-uORF-and-the-main-ORF-on-the-mRNA-1-A-distant-type-2-A-contiguous_221915475). Any thought? Again, thanks for your help and sorry for the mistake.
l0110
CC BY-SA 3.0
2018-01-04T18:53:15.647Z
Then the answer from @gringer is the more relevant one.
Devon Ryan
CC BY-SA 3.0
2018-01-04T08:30:13.557Z
2018-01-04T08:30:13.557Z
Devon Ryan
<p>I found one similar example in an <a href="ftp://ftp.arabidopsis.org/home/tair//Maps/gbrowse_data/TAIR10/TAIR10_GFF3_genes.gff" rel="nofollow noreferrer">Arabidopsis annotation file</a>. It is case of the cpuORF (CONSERVED PEPTIDE UPSTREAM OPEN READING FRAME ). Although the first and the third mRNA isoforms are identical, they repeated the mRNA isoform and name them differently to accommodate the additional ORF/CDS. I guess this is another way to do it.
<a href="https://i.sstatic.net/lqu2c.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/lqu2c.png" alt="enter image description here"></a> </p>

<p>See the ranges for AT5G03190.1 isoform and AT5G03190.3 isoform.</p>

<pre><code>Chr5    TAIR10  gene    758374  760382  .   +   .   ID=AT5G03190;Note=protein_coding_gene;Name=AT5G03190
Chr5    TAIR10  mRNA    758374  760382  .   +   .   ID=AT5G03190.1;Parent=AT5G03190;Name=AT5G03190.1;Index=1
Chr5    TAIR10  protein 758793  760148  .   +   .   ID=AT5G03190.1-Protein;Name=AT5G03190.1;Derives_from=AT5G03190.1
Chr5    TAIR10  exon    758374  760382  .   +   .   Parent=AT5G03190.1
Chr5    TAIR10  five_prime_UTR  758374  758792  .   +   .   Parent=AT5G03190.1
Chr5    TAIR10  CDS 758793  760148  .   +   0   Parent=AT5G03190.1,AT5G03190.1-Protein;
Chr5    TAIR10  three_prime_UTR 760149  760382  .   +   .   Parent=AT5G03190.1
Chr5    TAIR10  mRNA    758374  760382  .   +   .   ID=AT5G03190.2;Parent=AT5G03190;Name=AT5G03190.2;Index=1
Chr5    TAIR10  protein 758539  760148  .   +   .   ID=AT5G03190.2-Protein;Name=AT5G03190.2;Derives_from=AT5G03190.2
Chr5    TAIR10  exon    758374  758660  .   +   .   Parent=AT5G03190.2
Chr5    TAIR10  five_prime_UTR  758374  758538  .   +   .   Parent=AT5G03190.2
Chr5    TAIR10  CDS 758539  758660  .   +   0   Parent=AT5G03190.2,AT5G03190.2-Protein;
Chr5    TAIR10  exon    758843  760382  .   +   .   Parent=AT5G03190.2
Chr5    TAIR10  CDS 758843  760148  .   +   1   Parent=AT5G03190.2,AT5G03190.2-Protein;
Chr5    TAIR10  three_prime_UTR 760149  760382  .   +   .   Parent=AT5G03190.2
Chr5    TAIR10  mRNA    758374  760382  .   +   .   ID=AT5G03190.3;Parent=AT5G03190;Name=AT5G03190.3;Index=1
Chr5    TAIR10  protein 758539  758676  .   +   .   ID=AT5G03190.3-Protein;Name=AT5G03190.3;Derives_from=AT5G03190.3
Chr5    TAIR10  exon    758374  760382  .   +   .   Parent=AT5G03190.3
Chr5    TAIR10  five_prime_UTR  758374  758538  .   +   .   Parent=AT5G03190.3
Chr5    TAIR10  CDS 758539  758676  .   +   0   Parent=AT5G03190.3,AT5G03190.3-Protein;
Chr5    TAIR10  three_prime_UTR 758677  760382  .   +   .   Parent=AT5G03190.3
</code></pre>

CC BY-SA 3.0
2018-01-04T19:04:42.663Z
2018-01-04T19:13:59.193Z
2018-01-04T19:13:59.193Z
l0110
<p>The <a href="https://github.com/The-Sequence-Ontology/Specifications/blob/master/gff3.md" rel="nofollow noreferrer">GFF3 file format specification</a> doesn't care where annotations are described in the file, although it can make some things easier if the annotations are ordered by the start position:</p>

<pre><code>1   T1  gene    3631    4605    .   +   .   ID=ATNG01010
1   T1  mRNA    3631    4605    .   +   .   ID=ATNG01010.1;Parent=ATNG01010
1   T1  exon    3631    3913    .   +   .   ID=ATNG01010:exon:1;Parent=ATNG01010.1
1   T1  CDS     3750    3904    .   -   0   ID=ATRV01011:CDS:1;Parent=ATRV01011.0
1   T1  CDS     3860    3913    .   +   0   ID=ATNG01010:CDS:1;Parent=ATNG01010.1
1   T1  exon    3996    4276    .   +   .   ID=ATNG01010:exon:2;Parent=ATNG01010.1
1   T1  CDS     3996    4260    .   +   2   ID=ATNG01010:CDS:2;Parent=ATNG01010.1
1   T1  exon    4486    4605    .   +   .   ID=ATNG01010:exon:3;Parent=ATNG01010.1
</code></pre>

<p>There are many examples in well-studied genomes of overlapping genes, so the GFF3 format needs to be flexible enough to handle these. Different genes can be encoded across the same region, but on different strands. But different genes can also be encoded on the same strand, sometimes sharing an exon.</p>

CC BY-SA 3.0
2018-01-04T16:36:21.207Z
thanks for your help. So essentially we can just use a new name (e.g here from ATNG to ATRV) to describe the new protein, correct? Also please see my edit. The second protein should actually be in a different open reading frame. Sorry I calculate it wrong the first time. However, I assume your answer still apply.
l0110
CC BY-SA 3.0
2018-01-04T06:35:35.630Z
2018-01-04T19:52:25.757Z
2018-01-04T19:52:25.757Z
gringer
<p>Below is an example of a simple GFF3 file:</p>

<pre><code>1   T1  gene    3631    4605    .   +   .   ID=ATNG01010
1   T1  mRNA    3631    4605    .   +   .   ID=ATNG01010.1;Parent=ATNG01010
1   T1  exon    3631    3913    .   +   .   ID=ATNG01010:exon:1;Parent=ATNG01010.1
1   T1  CDS 3860    3913    .   +   0   ID=ATNG01010:CDS:1;Parent=ATNG01010.1
1   T1  exon    3996    4276    .   +   .   ID=ATNG01010:exon:2;Parent=ATNG01010.1
1   T1  CDS 3996    4260    .   +   2   ID=ATNG01010:CDS:2;Parent=ATNG01010.1
1   T1  exon    4486    4605    .   +   .   ID=ATNG01010:exon:3;Parent=ATNG01010.1
</code></pre>

<p>My question is: if we found another coding sequence (encoding a different protein) range from 3752 to 3904, how should the GFF3 be formatted? It seems to me that the GFF3 file can only allow one protein-coding gene per mRNA. If not, could anyone show me one example? Thank you!</p>

<p>[Edit]:
Sorry, using "CDS" is misleading. I changed the title and contents to "contain more than one protein-coding genes" instead of "more than one CDS". I also change the starting position of the second protein to 3752 (was 3750) to reflect the fact. My sincere apologies. </p>

<sequence-annotation><gff3>
In GFF3, annotating more than one protein-coding gene (i.e. polycistronic) contained in a eukaryotic mRNA
# In GFF3, annotating more than one protein-coding gene (i.e. polycistronic) contained in a eukaryotic mRNA

(Asked by: username_0 on 2018-01-04)

Below is an example of a simple GFF3 file:
1   T1  gene    3631    4605    .   +   .   ID=ATNG01010
1   T1  mRNA    3631    4605    .   +   .   ID=ATNG01010.1;Parent=ATNG01010
1   T1  exon    3631    3913    .   +   .   ID=ATNG01010:exon:1;Parent=ATNG01010.1
1   T1  CDS 3860    3913    .   +   0   ID=ATNG01010:CDS:1;Parent=ATNG01010.1
1   T1  exon    3996    4276    .   +   .   ID=ATNG01010:exon:2;Parent=ATNG01010.1
1   T1  CDS 3996    4260    .   +   2   ID=ATNG01010:CDS:2;Parent=ATNG01010.1
1   T1  exon    4486    4605    .   +   .   ID=ATNG01010:exon:3;Parent=ATNG01010.1

My question is: if we found another coding sequence (encoding a different protein) range from 3752 to 3904, how should the GFF3 be formatted? It seems to me that the GFF3 file can only allow one protein-coding gene per mRNA. If not, could anyone show me one example? Thank you!
[Edit]:
Sorry, using "CDS" is misleading. I changed the title and contents to "contain more than one protein-coding genes" instead of "more than one CDS". I also change the starting position of the second protein to 3752 (was 3750) to reflect the fact. My sincere apologies.

**Tags:** sequence-annotation, gff3

---

## 4 answers

### Answer by username_3 on 2018-01-04. Score: 5 | Accepted answer

The GFF3 file format specification doesn't care where annotations are described in the file, although it can make some things easier if the annotations are ordered by the start position:
1   T1  gene    3631    4605    .   +   .   ID=ATNG01010
1   T1  mRNA    3631    4605    .   +   .   ID=ATNG01010.1;Parent=ATNG01010
1   T1  exon    3631    3913    .   +   .   ID=ATNG01010:exon:1;Parent=ATNG01010.1
1   T1  CDS     3750    3904    .   -   0   ID=ATRV01011:CDS:1;Parent=ATRV01011.0
1   T1  CDS     3860    3913    .   +   0   ID=ATNG01010:CDS:1;Parent=ATNG01010.1
1   T1  exon    3996    4276    .   +   .   ID=ATNG01010:exon:2;Parent=ATNG01010.1
1   T1  CDS     3996    4260    .   +   2   ID=ATNG01010:CDS:2;Parent=ATNG01010.1
1   T1  exon    4486    4605    .   +   .   ID=ATNG01010:exon:3;Parent=ATNG01010.1

There are many examples in well-studied genomes of overlapping genes, so the GFF3 format needs to be flexible enough to handle these. Different genes can be encoded across the same region, but on different strands. But different genes can also be encoded on the same strand, sometimes sharing an exon.

> **Comments:**
> **username_0**: thanks for your help. So essentially we can just use a new name (e.g here from ATNG to ATRV) to describe the new protein, correct? Also please see my edit. The second protein should actually be in a different open reading frame. Sorry I calculate it wrong the first time. However, I assume your answer still apply.  

---

### Answer by username_1 on 2019-02-28. Score: 2

It is certainly possible to encode polycistrons in GFF3. In fact, this is discussed explicitly in the GFF3 specification.

Polycistronic transcripts
This is the case in which a single (possibly spliced) transcript encodes multiple open reading frames that generate independent protein products.
----->XXXXXXX*-->BBBBBB*--->ZZZZ*-->AAAAAA*-----
Since the single transcript corresponds to multiple genes that can be identified by genetic analysis, the recommended solution here is to create four "gene" objects and make them the parent for a single transcript. The transcript will contain a single exon (in the unspliced case) and four separate CDSs:
chrX  . gene XXXX YYYY  .  +  . ID=gene01;name=resA
chrX  . gene XXXX YYYY  .  +  . ID=gene02;name=resB
chrX  . gene XXXX YYYY  .  +  . ID=gene03;name=resX
chrX  . gene XXXX YYYY  .  +  . ID=gene04;name=resZ
chrX  . mRNA XXXX YYYY  .  +  . ID=tran01;Parent=gene01,gene02,gene03,gene04
chrX  . exon XXXX YYYY  .  +  . ID=exon00001;Parent=tran01
chrX  . CDS  XXXX YYYY  .  +  . Parent=tran01;Derives_from=gene01
chrX  . CDS  XXXX YYYY  .  +  . Parent=tran01;Derives_from=gene02
chrX  . CDS  XXXX YYYY  .  +  . Parent=tran01;Derives_from=gene03
chrX  . CDS  XXXX YYYY  .  +  . Parent=tran01;Derives_from=gene04

To disambiguate the relationship between which genes encode which CDSs, you may use the Derives_from relationship.

This example doesn't indicate what the coordinates of each feature should be, but I think it makes most sense to have the gene and CDS feature coordinates correspond to the region coding each protein product, and the mRNA and exon feature coordinates correspond to the entire span.
BIG CAVEAT: Polycistrons are not typically considered a normal feature of eukaryotic genomes—they're much more common in bacteria and archaea. However, there are some confirmed cases of eukaryotic polycistronic mRNAs. That said, if overlapping gene predictions are observed in a GFF3 file, one cannot immediately assume that these are polycistronic. One or both of the gene predictions might be technical artifacts, or real genes that are incorrectly annotated, or (more rarely) actual overlapping genes. A claim that multiple protein products are expressed from a single transcript would require some convincing experimental validation.


---

### Answer by username_2 on 2018-01-04. Score: 1

If you found another CDS from 3750 to 3904 then it would necessarily be on a different transcript, given that you already have a CDS from 3860 to 3913 and having overlapping CDSs on the same transcript doesn't make much biological sense (though I'm sure there's some weird organism out there that has a gene like this). So the likely GFF3 file would look like:
1   T1  gene    3631    4605    .   +   .   ID=ATNG01010
1   T1  mRNA    3631    4605    .   +   .   ID=ATNG01010.1;Parent=ATNG01010
1   T1  exon    3631    3913    .   +   .   ID=ATNG01010:exon:1;Parent=ATNG01010.1
1   T1  CDS     3860    3913    .   +   0   ID=ATNG01010:CDS:1;Parent=ATNG01010.1
1   T1  exon    3996    4276    .   +   .   ID=ATNG01010:exon:2;Parent=ATNG01010.1
1   T1  CDS     3996    4260    .   +   2   ID=ATNG01010:CDS:2;Parent=ATNG01010.1
1   T1  exon    4486    4605    .   +   .   ID=ATNG01010:exon:3;Parent=ATNG01010.1
1   T1  mRNA    3631    4605    .   +   .   ID=ATNG01010.2;Parent=ATNG01010
1   T1  exon    3631    3913    .   +   .   ID=ATNG01010.2:exon:1;Parent=ATNG01010.2
1   T1  CDS     3759    3904    .   +   0   ID=ATNG01010.2:CDS:1;Parent=ATNG01010.2
1   T1  exon    3996    4276    .   +   .   ID=ATNG01010.2:exon:2;Parent=ATNG01010.2
1   T1  CDS     3996    4260    .   +   2   ID=ATNG01010.2:CDS:2;Parent=ATNG01010.2
1   T1  exon    4486    4605    .   +   .   ID=ATNG01010.2:exon:3;Parent=ATNG01010.2

Note that I've just added another transcript, since that's likely what would be biologically going on.

> **Comments:**
> **username_0**: I calculate the ORF wrong (should be from 3752 to 3904, not 3750 to 3904). Please see the updated question. It does overlap with the original CDS but not in the same frame. This is a type of [uORF](https://www.researchgate.net/figure/The-location-of-a-uORF-and-the-main-ORF-on-the-mRNA-1-A-distant-type-2-A-contiguous_221915475). Any thought? Again, thanks for your help and sorry for the mistake.  
> **username_2**: Then the answer from @gringer is the more relevant one.  

---

### Answer by username_0 on 2018-01-04. Score: 1

I found one similar example in an Arabidopsis annotation file. It is case of the cpuORF (CONSERVED PEPTIDE UPSTREAM OPEN READING FRAME ). Although the first and the third mRNA isoforms are identical, they repeated the mRNA isoform and name them differently to accommodate the additional ORF/CDS. I guess this is another way to do it.
 
See the ranges for AT5G03190.1 isoform and AT5G03190.3 isoform.
Chr5    TAIR10  gene    758374  760382  .   +   .   ID=AT5G03190;Note=protein_coding_gene;Name=AT5G03190
Chr5    TAIR10  mRNA    758374  760382  .   +   .   ID=AT5G03190.1;Parent=AT5G03190;Name=AT5G03190.1;Index=1
Chr5    TAIR10  protein 758793  760148  .   +   .   ID=AT5G03190.1-Protein;Name=AT5G03190.1;Derives_from=AT5G03190.1
Chr5    TAIR10  exon    758374  760382  .   +   .   Parent=AT5G03190.1
Chr5    TAIR10  five_prime_UTR  758374  758792  .   +   .   Parent=AT5G03190.1
Chr5    TAIR10  CDS 758793  760148  .   +   0   Parent=AT5G03190.1,AT5G03190.1-Protein;
Chr5    TAIR10  three_prime_UTR 760149  760382  .   +   .   Parent=AT5G03190.1
Chr5    TAIR10  mRNA    758374  760382  .   +   .   ID=AT5G03190.2;Parent=AT5G03190;Name=AT5G03190.2;Index=1
Chr5    TAIR10  protein 758539  760148  .   +   .   ID=AT5G03190.2-Protein;Name=AT5G03190.2;Derives_from=AT5G03190.2
Chr5    TAIR10  exon    758374  758660  .   +   .   Parent=AT5G03190.2
Chr5    TAIR10  five_prime_UTR  758374  758538  .   +   .   Parent=AT5G03190.2
Chr5    TAIR10  CDS 758539  758660  .   +   0   Parent=AT5G03190.2,AT5G03190.2-Protein;
Chr5    TAIR10  exon    758843  760382  .   +   .   Parent=AT5G03190.2
Chr5    TAIR10  CDS 758843  760148  .   +   1   Parent=AT5G03190.2,AT5G03190.2-Protein;
Chr5    TAIR10  three_prime_UTR 760149  760382  .   +   .   Parent=AT5G03190.2
Chr5    TAIR10  mRNA    758374  760382  .   +   .   ID=AT5G03190.3;Parent=AT5G03190;Name=AT5G03190.3;Index=1
Chr5    TAIR10  protein 758539  758676  .   +   .   ID=AT5G03190.3-Protein;Name=AT5G03190.3;Derives_from=AT5G03190.3
Chr5    TAIR10  exon    758374  760382  .   +   .   Parent=AT5G03190.3
Chr5    TAIR10  five_prime_UTR  758374  758538  .   +   .   Parent=AT5G03190.3
Chr5    TAIR10  CDS 758539  758676  .   +   0   Parent=AT5G03190.3,AT5G03190.3-Protein;
Chr5    TAIR10  three_prime_UTR 758677  760382  .   +   .   Parent=AT5G03190.3


---

