GFF/GTF 格式基础:字段定义、必需列、版本区别与常见应用场景
做生物信息学的人,少不了跟 GFF 和 GTF 打交道。我记得刚入行那会,下载了个注释文件,两眼一抹黑,就看一堆坐标和符号。后来踩了不少坑,才把这些格式吃透。
说白了,GFF(General Feature Format)和 GTF(Gene Transfer Format)都是用来描述基因组上各种特征的文本格式。基因、转录本、外显子、CDS,甚至重复区域、变异位点,都能塞进去。它们最大的共同点就是:每行一个特征,一行 9 列,用 Tab 分隔。
九列字段,一个都不能少
不管是 GFF2、GFF3 还是 GTF2,前八列的含义完全一样。区别主要在第九列 —— 属性字段。
| 列号 | 字段名 | 说 明 | 是否必需 |
|---|---|---|---|
| 1 | seqid | 染色体/contig 名称,比如 chr1、Scaffold_001 | 是 |
| 2 | source | 注释来源,比如 Ensembl、NCBI、自己生成的 | 是 |
| 3 | type | 特征类型,如 gene、transcript、exon、CDS | 是 |
| 4 | start | 起始坐标,1-based,包含该位点 | 是 |
| 5 | end | 终止坐标,1-based,包含该位点 | 是 |
| 6 | score | 置信度分数,通常用“.”占位 | 是(可用 . 代替) |
| 7 | strand | 链方向,+ 或 -,有时用 ? 表示不确定 | 是 |
| 8 | phase | CDS 起始相位,0/1/2(仅在 CDS 中有效) | 是(可用 . 代替) |
| 9 | attributes | 属性字段,格式因版本而异 | 是 |
经验之谈:我见过不少学生把 start 和 end 写反,或者相位填错。还有人在 source 列乱写注释文本,结果下游工具直接报错。第九列最容易出问题,后面几章会重点讲怎么修复。
版本区别:GFF2 → GFF3 → GTF2
为什么会分这么多版本?因为早期大家各自为战,后来才慢慢统一。我整理了个对照表,你一看就明白。
| 特征 | GFF2 | GFF3 | GTF2(也叫 GTF) |
|---|---|---|---|
| 第九列格式 | 自由文本,键值对用空格分隔,值可有引号 | 严格键=值,分号分隔,值必须用引号包裹 | 键=值,分号分隔,值必须用引号包裹 |
| 层级关系 | 无标准 ID/父节点 | 用 ID、Parent 属性建立层级 | 用 gene_id、transcript_id 关联 |
| 重复特征支持 | 不统一 | 允许多个相同类型特征(如多个外显子) | 类似 GFF3 |
| 推荐使用 | 已淘汰,遇到最好转成 GFF3 | 最通用,被各种工具广泛支持 | 专门用于基因/转录本注释 |
| 文件扩展名 | .gff | .gff3 或 .gff | .gtf 或 .gff |
我个人习惯:新项目一律用 GFF3。如果拿到的文件是 GFF2 或者老式 GTF,先用 gffread 转一下,省得后面被坑。
常见应用场景
GFF/GTF 几乎贯穿所有基因组相关分析。我挑几个最常用的场景说说。
- RNA-seq 定量(如 featureCounts、htseq-count):需要一个 GTF 文件来定义基因和转录本结构。如果里面 exon 坐标写错了,定量结果直接废掉。
- 变异注释(如 VEP、SnpEff):依赖 GFF3 来确定变异落在哪个基因、哪个转录本、哪个外显子上。属性字段不对,注释就会丢失或出错。
- 可视化(IGV、JBrowse):加载注释文件时,I 列必须格式正确,否则浏览器不显示或者显示错位。
- 基因组组装评估(BUSCO、QUAST):有时也用 GFF 来评估注释完整性。我遇到过因为第九列缺失 ID,BUSCO 直接跳过一整个基因的情况。
你想想看,这些场景里只要一个坐标偏差或属性格式错误,结果就全变了。所以打好格式基础,比学那些花哨算法更重要。
我曾经遇到过这样一个案例:一个 GFF2 文件被下游工具当成 GFF3 解析,结果第九列里没加引号的值全被切碎了。最后不得不写个脚本逐行修复。记住:永远确认你的文件版本,不要信任文件扩展名。
好了,这一章的格式基础就这些。后面我们会一个错误一个错误地排查,每个修复方法我都会附上真实案例。你先把九列字段记住,版本区别分得清,后面操作才不糊涂。