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)