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è)置一個數(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)預(yù)先定義的屬性特征宾肺,并且這些特征往往還有特殊的含義: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:注釋的來源钮呀。通常是預(yù)測軟件名或是公共數(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值用空格分開,如果值為空监右,則表示沒有對應(yīng)的基因边灭。
- transcript_id value; 預(yù)測的轉(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)