GFF/GTF 标准九列介绍归纳总结
说句实话,刚接触 GFF/GTF 的时候,我也有点懵。九列数据摆在那,每一列都有它自己的规矩。但你要是搞清楚了,就会发现这格式设计得其实很巧妙。下面我就结合实际工作中的踩坑经历,给你聊聊这九列到底是什么、应该怎么写。
九列概览
一个规范的 GFF/GTF 文件,每一行必须有且只有 9 列,用 Tab 分隔。少一列、多一列,或者用了空格、逗号,都会报错。我记得第一次处理一个 2G 的 GFF,就因为第三列混进了空格,解析程序跑了半小时直接崩了。
| 列号 | 名称 | 含义简述 | 常见错误 |
|---|---|---|---|
| 1 | seqid | 序列ID(染色体/ scaffold) | ID 不统一、含空格 |
| 2 | source | 注释来源(软件/数据库) | 空白或随意填写 |
| 3 | type | 特征类型(gene/mRNA/exon) | 拼写错误、大小写混乱 |
| 4 | start | 起始位置(1-based) | 0-based 混用、超出范围 |
| 5 | end | 终止位置 | start > end、跨物种乱用 |
| 6 | score | 置信分数 | 有值但缺小数点 |
| 7 | strand | 链方向(+ / - / .) | 混用 1/-1 等非标字符 |
| 8 | phase | 相位(CDS 专用 0/1/2) | 非 CDS 也乱填数字 |
| 9 | attributes | 属性键值对 | GTF 与 GFF 格式混用 |
第一列:seqid(序列ID)
说白了,这就是告诉你这段注释在哪个染色体上。我见过有人把这一列填成物种名、菌株编号,甚至直接写「chr1」「1」「NC_000001.11」混着用。你想想看,这样的文件放到 IGV 里展示,序列根本匹配不上。
避坑指南:同一基因组的所有 GFF/GTF 行,seqid 必须和参考基因组 FASTA 里的序列名完全一致。我曾经因为 FASTA 里是「chr1」,GFF 里写「1」,结果下游工具全是 0 匹配。
第二列:source(注释来源)
这一列用来记录注释是怎么来的。比如用 BRAKER2 预测的,就填「BRAKER2」;用 RefSeq 注释的,就填「RefSeq」。我个人的习惯是,自己的项目每次都会写清楚来源版本,比如「maker_v3.01」。不然几个月之后回头看,根本想不起来这批注释是用什么工具跑的。
第三列:type(特征类型)
这一列最常见的问题就是随意发明新类型。GFF 规范推荐使用 SO(Sequence Ontology)术语。比如基因是「gene」、转录本是「mRNA」、外显子是「exon」、CDS 是「CDS」。有些人喜欢写「transcript」「coding_exon」这样的非标准名,写到后面你自己都分不清谁是谁。
小经验:推荐到 SO 官网 查一下标准术语列表。工具链对 SO 术语的支持是最好的。
第四、五列:start 与 end(位置坐标)
GFF/GTF 的位置是 1-based 封闭区间。什么意思?就是序列的第一个碱基位置是 1,不是 0。如果你从某个工具导出位置时发现偏移,八成是遇到了 0-based 半开区间,比如 BED 格式。
# GFF/GTF 示例:位置在第 100 到 200 个碱基(共 101 bp)
chr1 Ensembl exon 100 200 . + . gene_id "ENSG0001";
你知道吗?start 必须小于等于 end。对于负链(-)上的特征也一样,不是把大的写在前面。我见过有人把负链上的基因写成 start=5000, end=1000,这行数据直接无效。
第六列:score(置信分数)
这一列如果没有分数,就填小数点「.」,不能空着或写「NA」「null」。有分数的时候,通常是一个浮点数,不能写成整数 100 不带小数点。嗯,虽然有些工具处理起来不报错,但规范就是规范。
第七列:strand(链方向)
合法值只有三个:+ 表示正链、- 表示负链、. 表示不知道或者不适用。我见过有人填「1」「-1」「fwd」「rev」,这些都会被格式校验工具直接拒绝。
第八列:phase(相位)
这一列专门给 CDS 特征用的。表示 CDS 起始位置相对于密码子第一帧的偏移量。合法值是 0、1、2。如果是非 CDS 特征(比如 exon、gene),就填 .。
我曾经踩过的坑:在做全基因组注释时,把 phase 列填成了 0 或 1,但对应的特征明明是 gene。后来用 GATK 跑变异时,工具直接报「phase not valid for non-CDS feature」。检查后才发现是我自己 copy-paste 时把列写串了。
第九列:attributes(属性键值对)
这一列是难点,也是最容易出错的。GFF 和 GTF 在这一列的格式不一样,很多人混着用。
# GFF3 格式:键=值,多值用 , 分隔
ID=gene0001;Name=BRCA1;Note=tumor suppressor
# GTF 格式:键 "值",值必须用双引号,用 ; 结尾
gene_id "ENSG00000139618"; gene_name "BRCA1";
我个人建议:做基因组注释用 GFF3 格式,做转录组定量用 GTF 格式。千万不能写一半 GFF3 一半 GTF,解析工具会直接罢工。
关键点:GTF 里 gene_id 和 transcript_id 是必填属性,缺一个都不行。GFF3 里则必须有 ID 属性,用来唯一标识每一行。
九列结构关系图
归纳记忆表
为了方便你快速记忆,我整理了一个口诀:
1 seqid,2 source,3 type,
4 start,5 end,6 score 填点,
7 strand,8 phase,9 属性绑,
Tab 分隔,缺列用点,GFF/GFF 别搞反了。
我的建议:刚开始写 GFF/GTF 的时候,可以先拿一个小样本跑验证工具,比如 gt gff3validator 或 gffread --validate。只要它们不报错,你的九列格式基本就对了。