GFF/GTF 标准九列介绍归纳总结

说句实话,刚接触 GFF/GTF 的时候,我也有点懵。九列数据摆在那,每一列都有它自己的规矩。但你要是搞清楚了,就会发现这格式设计得其实很巧妙。下面我就结合实际工作中的踩坑经历,给你聊聊这九列到底是什么、应该怎么写。

九列概览

一个规范的 GFF/GTF 文件,每一行必须有且只有 9 列,用 Tab 分隔。少一列、多一列,或者用了空格、逗号,都会报错。我记得第一次处理一个 2G 的 GFF,就因为第三列混进了空格,解析程序跑了半小时直接崩了。

列号名称含义简述常见错误
1seqid序列ID(染色体/ scaffold)ID 不统一、含空格
2source注释来源(软件/数据库)空白或随意填写
3type特征类型(gene/mRNA/exon)拼写错误、大小写混乱
4start起始位置(1-based)0-based 混用、超出范围
5end终止位置start > end、跨物种乱用
6score置信分数有值但缺小数点
7strand链方向(+ / - / .)混用 1/-1 等非标字符
8phase相位(CDS 专用 0/1/2)非 CDS 也乱填数字
9attributes属性键值对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 属性,用来唯一标识每一行。

九列结构关系图

GFF/GTF 标准九列结构 1. seqid 2. source 3. type 4. start 5. end 6. score 7. strand 8. phase 9. attributes(键值对) 💡 关键规范 1. 所有列必须用 Tab 分隔,不能混用空格或逗号 2. 缺失字段用 . 表示,不能留空或写 NULL 3. GFF 与 GTF 的第 9 列语法不可互换 第 1-5 列:描述注释的基因组位置和特征类型 第 6-8 列:描述分数、方向和相位(可缺失) 第 9 列:提供特征间的层级关系和额外属性 GFF3:ID=xxx;Name=xxx GTF:gene_id "xxx"; GFF1/2:已被淘汰

归纳记忆表

为了方便你快速记忆,我整理了一个口诀:

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。只要它们不报错,你的九列格式基本就对了。