GTF與GFF文件格式的區(qū)別與轉(zhuǎn)換

GTF與GFF文件都是用于存儲注釋信息的文本類型,經(jīng)常可以看到二者格式之間的相互轉(zhuǎn)換。二者的名字相似,連內(nèi)容都極為相似,那么二者的差異究竟在哪里呢?

  • GFF (general feature format): 可以用于任何基因組注釋的存儲
  • GTF (gene transfer format): 嚴格的用于基因注釋信息的存儲

GFF

GFF文件是一種用來描述基因組特征的文件,現(xiàn)在我們所使用的大部分都是第三版)(GFF3)。gff文件除gff1以外均由9列數(shù)據(jù)組成,前8列在gff的3個版本中信息都是相同的,只是名稱不同。

第9列attributes的內(nèi)容存在很大的版本特異性,9列信息(以gff3為例)分別是:

1 2 3 4 5 6 7 8 9
seqid annotation source feature type start end score strand phase attributes
  • seqid :參考序列的id。

  • annotation source:注釋的來源。如果未知,則用點(.)代替。一般指明產(chǎn)生此gff3文件的軟件或方法。

  • feature type: 類型,此處的名詞是相對自由的,建議使用符合SO慣例的名稱(sequenceontology),如gene,repeat_region,exon,CDS等。

  • start coordinate:開始位點,從1開始計數(shù)(區(qū)別于bed文件從0開始計數(shù))。

  • end coordinate:結(jié)束位點。

  • score:得分,對于一些可以量化的屬性,可以在此設置一個數(shù)值以表示程度的不同。如果為空,用點(.)代替。

  • strand:“+”表示正鏈,“-”表示負鏈,“.”表示不需要指定正負鏈。

  • phase :步進。對于編碼蛋白質(zhì)的CDS來說,本列指定下一個密碼子開始的位置。可以是0、1或2,表示到達下一個密碼子需要跳過的堿基個數(shù)。

  • attributes:屬性。一個包含眾多屬性的列表,格式為“標簽=值”(tag=value),不同屬性之間以分號相隔,這一列最后沒有分號。如:

    ID=geneAExon1;Name=geneA;Parent=geneA;Organism=human
    
  • 幾個attributes舉例:

    • ID:type的標識;
    • Name:type的展示名稱。Name的值在可視化的時候得到展示。因此,Name可以根據(jù)自己展示的需要隨意取值;
    • Parent :指明type所從屬的上一級ID。用于將exons聚集成transcript,將transripts聚集成gene。

GFF允許使用#作為注釋符號,例如很多GFF文件都會使用如下的兩行來表明其版本其創(chuàng)建日期:

## gff-version 2
## created 11/11/11 

GFF文件每一列所代表的含義前面表格中有,但請注意,它的第3列feature type是不受約束的,你可以使用任意的名稱,但也不要太淘氣~用一些適當?shù)拿Q對于后面的分析會有很大的幫助。

我們需要注意的是GFF文件的第9列,從第二版開始(GFF2),所有的屬性都以標簽=值的方式呈現(xiàn),各個屬性之間以;作為分隔符

ID=geneAExon1;Name=geneA;Parent=geneA;Organism=human

在最新版本的GFF文件中(GFF3),有一些是已經(jīng)預先定義的屬性特征,并且這些特征往往還有特殊的含義:ID這個標簽實在各行都要有的;另外有一個Parent的屬性,它指明type所從屬的上一級ID。

GTF

當前所廣泛使用的GTF格式為第二版(GTF2),它主要是用來描述基因的注釋。GTF格式有兩個硬性標準:

  • 根據(jù)所使用的軟件的不同,feature types是必須注明的。
  • 第9列必須以gene_id以及transcript_id開頭
    GTF文件的第9列同GFF文件不同,雖然同樣是標簽與值配對的情況,但標簽與值之間以空格分開,且每個特征之后都要有分號;(包括最后一個特征)
1 2 3 4 5 6 7 8 9
seqname source feature start end score strand frame attributes
  • seqname: 序列的名字。通常格式染色體ID或是contig ID。

  • source:注釋的來源。通常是預測軟件名或是公共數(shù)據(jù)庫。

  • start:開始位點,從1開始計數(shù)。

  • end:結(jié)束位點。

  • feature :基因結(jié)構(gòu)。CDS,start_codon,stop_codon是一定要含有的類型。

  • score :這一列的值表示對該類型存在性和其坐標的可信度,不是必須的,可以用點“.”代替。

  • strand:鏈的正向與負向,分別用加號+和減號-表示。

  • frame:密碼子偏移,可以是0、1或2。

  • attributes:必須要有以下兩個值:

    • gene_id value; 表示轉(zhuǎn)錄本在基因組上的基因座的唯一的ID。 gene_id與value值用空格分開,如果值為空,則表示沒有對應的基因。
    • transcript_id value; 預測的轉(zhuǎn)錄本的唯一ID。transcript_id與value值用空格分開,空表示沒有轉(zhuǎn)錄本。
  • attribures之后有可能會有comments選項,以“#”開頭,一直到行末尾。

區(qū)別

gtf2的內(nèi)容和gff3也是很相似的,區(qū)別只在其中的3列:

- GTF2 GFF3
feature type 根據(jù)軟件名稱注明 可以是任意名稱
attributes 空格分隔 ‘=’分隔

格式轉(zhuǎn)換

使用Cufflinks里面的工具"gffread":

#gff2gtf
gffread my.gff3 -T -o my.gtf
#gtf2gff
gffread merged.gtf -o- > merged.gff3

使用腳本進行格式轉(zhuǎn)換

GTF to GFF

import sys

inFile = open(sys.argv[1],'r')

for line in inFile:
  #skip comment lines that start with the '#' character
  if line[0] != '#':
    #split line into columns by tab
    data = line.strip().split('\t')

    #parse the transcript/gene ID. I suck at using regex, so I usually just do a series of splits.
    #transcript_id和gene_ids是GTF第九列肯定存在的
    transcriptID = data[-1].split('transcript_id')[-1].split(';')[0].strip()[1:-1]
    geneID = data[-1].split('gene_id')[-1].split(';')[0].strip()[1:-1]

    #replace the last column with a GFF formatted attributes columns
    #I added a GID attribute just to conserve all the GTF data
    data[-1] = "ID=" + transcriptID + ";GID=" + geneID

    #print out this new GFF line
    print '\t'.join(data)

腳本運行

python myScript.py myFile.gtf > myFile.gff

GTF to GFF

import sys

inFile = open(sys.argv[1],'r')

for line in inFile:
  #skip comment lines that start with the '#' character
  if line[0] != '#':
    #split line into columns by tab
    data = line.strip().split('\t')

    ID = ''

    #if the feature is a gene 
    if data[2] == "gene":
      #get the id
      ID = data[-1].split('ID=')[-1].split(';')[0]

    #if the feature is anything else
    else:
      # get the parent as the ID
      ID = data[-1].split('Parent=')[-1].split(';')[0]
    
    #modify the last column
    data[-1] = 'gene_id "' + ID + '"; transcript_id "' + ID

    #print out this new GTF line
    print '\t'.join(data)

參考資料:

  1. Method: GFF/GTF conversion and differences
  2. NGS數(shù)據(jù)格式之gff/gtf
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文:http://blog.sina.com.cn/s/blog_751bd9440102v72b.html 一...
    簡單點lili閱讀 4,331評論 0 8
  • fastafasta格式是最基本的表示序列信息(核苷酸或者蛋白質(zhì))的格式。這里簡單介紹下,fasta格式的文件通常...
    tianzhanlan閱讀 5,351評論 0 10
  • 我們在做生物分析的時候,經(jīng)常會碰到GFF格式的文件以及GTF格式的注釋文件。他們有著相似的名字,甚至連內(nèi)容都極為相...
    dasdadf閱讀 54,322評論 4 63
  • 慢慢看,憋著急!很有用! 前言: 首先呢,在你的Linux系統(tǒng)中新建一個文件,Thanos.txt(紫薯俠賜予你力...
    劉小澤閱讀 3,452評論 6 33
  • 英雄兮項羽,這天下之主不要也罷,就留給那工于心計的劉邦,上天入地,碧落黃泉,自有你遨游之處。 —— 題記 項羽究竟...
    幽幽墨嘆閱讀 406評論 0 0

友情鏈接更多精彩內(nèi)容