1. GFF/GTF 格式基础:别小看这几行文本
大家好,我是老张。干生物信息这行十几年了,我见过最让人头疼的,不是复杂的算法,而是一份格式乱七八糟的 GFF 文件。
你想想看,注释文件一错,下游所有分析都跟着歪。所以我总跟团队说:质控的第一步,是看懂你的注释文件到底在写什么。
1.1 为什么我们这么重视 GFF/GTF?
GFF(General Feature Format)和 GTF(Gene Transfer Format),说白了就是基因组的「说明书」。它们用简单的表格文本,告诉计算机:
- 某个基因在染色体的哪个位置
- 它由哪些外显子组成
- 它编码什么产物
我在项目中遇到过一份 GFF,注释信息全是对的,就因为在第 9 列少了个分号,结果整个基因的 CDS 区域死活调不出来。最后查了三天,才发现是格式问题。
记住:格式规范是注释文件的生命线。一个字符的偏差,可能导致整条染色体注释失效。
1.2 GFF 和 GTF 到底有什么区别?
很多人搞不清这两兄弟,其实记住一句话就行:GTF 是 GFF 的「亲儿子」,GFF3 是现在的主流版本。我做了个对比表格,看着更清楚:
| 特性 | GFF3 | GTF 2.2 | 说明 |
|---|---|---|---|
| 版本 | 推荐使用 | 经典格式 | GFF3 更灵活,GTF 更严格 |
| 第 3 列(类型) | 自由定义标签 | 固定使用 CDS/start_codon/stop_codon 等 | GTF 的 CDS 和 exon 不能乱写 |
| 第 9 列(属性) | 分号分隔的键值对 | 分号分隔的键值对 + 引号 | 这是最容易出错的地方 |
| 父子关系 | 用 Parent= 显式声明 | 用 gene_id/transcript_id 隐式关联 | GFF3 的关系更清晰 |
| 兼容性 | 大部分工具支持 | ENSEMBL 等数据库偏爱 GTF | 看下游工具的要求选格式 |
我个人习惯:如果从 UCSC 下载的 RefSeq 注释,通常是 GTF 格式;从 NCBI 或植物数据库拿到的,多数是 GFF3。收到文件后先用 head 看一下第 9 列,马上就能分清。
1.3 9 个字段,一个都不能少
GFF/GTF 是严格的 9 列结构,缺一不可。我常用的命令是 grep -v '^#' | head 来快速预览:
## 查看注释文件的前5行,跳过注释行
grep -v "^#" annotation.gff | head -5
每列的含义,我按顺序捋一遍:
- seqid:染色体或 scaffold 的名称。记得要和参考基因组的 FASTA 头部严格一致——大小写、连字符都不能错。
- source:注释的来源。可以是 Ensembl、NCBI、Augustus 等。这个字段有时候会被忽略,但我建议保留,方便溯源。
- type:特征类型。常见的有 gene、transcript、exon、CDS。GTF 里要求使用标准术语。
- start / end:特征在染色体上的起止位置。注意:GFF 是 1-based 坐标,和很多 BED 文件的 0-based 不一样。
- score:置信度评分。通常用“.”表示缺失。
- strand:链的方向。+ 表示正链,- 表示负链,? 表示不确定。
- phase:阅读框偏移。只用于 CDS,表示该特征起始点在密码子中的位置(0、1 或 2)。
- attributes:第 9 列,也是最复杂的一列。包含一组以分号分隔的键值对。
第 9 列的雷区: 我曾经见过一个同事,把 GTF 里所有的 gene_id 都写成了“geneID”,结果 stringtie 死活不认。记住:GTF 对属性键的大小写是敏感的,老老实实写小写!
1.4 常见变异和坑
格式讲完了,我再说几个实际项目中容易踩的坑。
- 注释来源不统一:同一个染色体,前半段用 Ensembl 注释,后半段用 NCBI 注释。不是不能混合,但我强烈不建议——不同来源的 ID 命名规则不同,很容易造成重复或遗漏。
- 版本号在哪里?:GFF 文件头部经常有注释行,用“##”开头。里面会注明格式版本和日期。我每次拿到新文件,都会先看一下头部有没有版本声明。
- 属性键的顺序有无规定?:没有硬性规定,但习惯上把主要的 ID(gene_id、transcript_id)放在前面。有些工具解析时对顺序有默认假设,比如 Cufflinks 要求 transcript_id 在前。
- 引号问题:GTF 的属性值必须用双引号括起来,而 GFF3 不需要。这一点特别容易混淆。
下面这个例子,展示了一个标准的 GTF 记录和两个常见的错误:
## 正确示例
1 ENSEMBL gene 1000 5000 . + . gene_id "ENSG000001"; gene_name "TP53";
## 错误1:缺少引号(GTF 中)
1 ENSEMBL gene 1000 5000 . + . gene_id ENSG000001;
## 错误2:属性键写错(GTF 中)
1 ENSEMBL gene 1000 5000 . + . GeneID "ENSG000001";
检查属性键是否规范,可以用 awk 快速抽取出第 9 列,然后看里面的键是否都符合预期:
awk -F'\t' '{print $9}' your_file.gff | head -3
说到这儿,我想让你对 GFF/GTF 的格式有个整体印象。下面的 SVG 图总结了 GFF/GTF 的解析与质控流程,从原始数据到最终校验,每个环节都不能少。
总结一下这一节的内容:GFF/GTF 是 9 列的制表符分隔文件,GFF3 更灵活,GTF 对命名更严格。第 9 列是注释的灵魂,也是最容易出问题的地方。拿到数据后,先从头看格式是否规范,再深入检查基因-转录本-外显子的层级关系。
嗯,这些内容是后面所有质控案例的基础。你先把格式记熟了,后面咱们才能谈怎么抓错误。