4. BLAST 软件家族:选对工具,事半功倍

做细菌基因组注释,绕不开 BLAST。但很多人一上来就用默认的 blastn,结果跑出来的结果一堆假阳性,或者根本查不到同源序列。

我刚开始做注释时也踩过这个坑。有一次项目要注释一批噬菌体基因,我直接用 blastn 去比对,结果一大半序列都匹配不上。后来才发现,这些噬菌体基因跟数据库里已知序列的核酸相似度很低,但蛋白水平高度保守。换成 blastx 之后,命中率直接翻倍。

今天我们就聊聊 BLAST 家族里最常用的四个成员。什么时候用哪个,怎么选,我会把经验都告诉你。

一个常见的误解:很多人以为 blastn 能解决所有问题。其实蛋白比对的灵敏度远高于核酸比对,尤其是在进化距离较远的时候。

4.1 为什么会有四个不同的 BLAST?

理由很简单:查询序列和数据库序列,可以是核酸,也可以是蛋白。两两组合,就有了四种可能。

你想想看,我们手里可能是一段 DNA 序列,也可能是一段氨基酸序列。数据库也一样,既有核酸库也有蛋白库。BLAST 把这四种组合都覆盖了:

工具 查询序列类型 数据库类型 核心用途
blastn 核酸 (DNA/RNA) 核酸 核酸 vs 核酸,找高度相似的同源序列
blastp 蛋白 蛋白 蛋白 vs 蛋白,找功能相似的蛋白
blastx 核酸 (翻译成蛋白) 蛋白 核酸 vs 蛋白,预测新基因、找远缘同源
tblastn 蛋白 核酸 (翻译成蛋白) 蛋白 vs 核酸,在基因组中找可能的编码区

用对了工具,结果清晰明了。用错了,轻则跑得慢,重则漏掉关键信息。

4.2 blastn:最快的核酸比对

blastn 是直接把核酸序列跟核酸数据库比对。它的特点是快,特别快。

但快到什么程度呢?我记得有一次比对一批 16S rRNA 基因序列,几万条数据,blastn 几分钟就跑完了。如果换成 blastx,同样的数据量,可能要跑一两个小时。

不过 blastn 也有局限性。它只适合找高度相似的序列,一般建议同一性(identity)在 70% 以上才可靠。低于这个阈值,结果就会充满噪音。

我个人习惯是:

  • 比对 rRNA 基因、保守的持家基因、PCR 产物鉴定 → 用 blastn
  • 比对完整的基因组、质粒、噬菌体 → 用 blastn
  • 比对新基因、未知功能的 ORF → 别用 blastn,换成 blastx 或 blastp
一个小技巧:blastn 的 -task 参数可以切换模式。默认是 megablast,适合高度相似的序列。如果序列相似度不高,试试 blastn 或 dc-megablast。

4.3 blastp:蛋白水平的直接对话

blastp 是用蛋白序列比对蛋白数据库。蛋白序列的保守性比核酸强得多,所以 blastp 能发现更深层次的同源关系。

我做功能注释时,只要手上已经有预测好的蛋白序列,第一步一定是跑 blastp。为什么呢?因为蛋白比对的 e-value 更可靠,假阳性率更低。

举个例子:两个物种的某个基因,核酸序列可能只有 50% 相似,但翻译成蛋白之后,相似度可能达到 80%。如果只用 blastn,你就永远找不到这个同源基因。

blastp 的适用场景很明确:

  • 功能已知的蛋白,找同源蛋白
  • 蛋白结构域分析
  • 进化分析,构建蛋白系统发育树
关键参数:blastp 的 -evalue 我一般设 1e-5。如果结果太少,可以放宽到 1e-3。但要注意,放宽 e-value 后,假阳性会增多,需要人工筛选。

4.4 blastx:寻找隐藏的基因

blastx 是我最喜欢的一个工具。它把核酸序列翻译成六个阅读框的蛋白序列,然后去比对蛋白数据库。

为什么需要六个阅读框?因为核酸序列有正链和反链,每一条链又有三个阅读框。我们不知道基因到底在哪个阅读框里,所以 BLAST 会全部尝试一遍。

我经常遇到这种情况:从宏基因组数据中组装出一段 contig,看起来像是基因,但 blastn 查不到任何已知序列。这时候 blastx 就派上用场了。它能发现那些核酸层面不保守、但蛋白层面保守的基因。

有一次,我注释一个未培养细菌的基因组,里面有大量推测蛋白(hypothetical protein)。跑 blastn 全都没有结果,但跑 blastx 之后,超过 60% 都能匹配到已知的蛋白功能域。

blastx 的典型场景:

  • 对新组装的基因组进行从头注释
  • 鉴定未知功能的 ORF
  • 在宏基因组数据中寻找功能基因
  • 注释病毒或噬菌体基因组
注意:blastx 比 blastn 慢很多,因为需要先把核酸翻译成蛋白,然后做蛋白比对。数据量大时,建议先用 prodigal 或 glimmer 预测 ORF,然后用 blastp,而不是直接跑 blastx。

4.5 tblastn:从蛋白出发找基因

tblastn 是 blastx 的镜像操作。你用一段已知的蛋白序列,去搜索核酸数据库。BLAST 会把核酸数据库里的每一条序列都翻译成六个阅读框,然后跟你的蛋白序列比对。

这个工具在基因组注释中特别实用。比如你知道某个蛋白家族的保守序列,想知道某个新基因组里有没有同源基因。直接用 tblastn 扫一遍基因组,比先用基因预测工具、再跑 blastp 要快得多。

tblastn 的典型用法:

  • 寻找特定蛋白家族在基因组中的分布
  • 验证基因预测的准确性
  • 在未注释的基因组中寻找同源基因
避坑指南:tblastn 的结果里,同一个位置上可能匹配到多个阅读框。一般取分数最高的那个就行。但要注意,有些假基因或 pseudogene 可能只在某个阅读框里有部分匹配。

4.6 选择原则:一张流程图解决问题

说了这么多,到底怎么选?我画了一张流程图,把决策路径整理出来了:

BLAST工具选择流程图 开始:确定查询和数据库类型 查询序列是核酸还是蛋白? 核酸 蛋白 数据库是核酸还是蛋白? 数据库是核酸还是蛋白? 核酸 vs 核酸 用 blastn 核酸 vs 蛋白 用 blastx 蛋白 vs 核酸 用 tblastn 蛋白 vs 蛋白 用 blastp 特殊情况:需要更高灵敏度? 考虑用 PSI-BLAST、DELTA-BLAST 或 PHI-BLAST 选中工具 → 设置参数 → 运行比对 → 解读结果 完成!进入下一章

跟着这张图走,基本不会选错。我自己的经验是,90% 的情况下,只需要记住两件事:

  1. 核酸序列查核酸库 → blastn(快速、简单)
  2. 其余情况 → 优先考虑蛋白比对(更敏感、更准确)

4.7 实战中的参数建议

每人都有自己的参数习惯。我整理了一份常用参数组合,供你参考:

我的常用配置
# blastn:注释 rRNA 基因
blastn -db nt -query 16S.fasta -out result.txt -outfmt 6 -evalue 1e-10 -num_threads 8

# blastp:预测蛋白的同源搜索
blastp -db nr -query proteins.faa -out result.txt -outfmt 6 -evalue 1e-5 -num_threads 8

# blastx:新基因组从头注释
blastx -db nr -query contigs.fasta -out result.txt -outfmt 6 -evalue 1e-5 -num_threads 8

# tblastn:在基因组中寻找特定蛋白家族
tblastn -db genome.fasta -query protein.faa -out result.txt -outfmt 6 -evalue 1e-5 -num_threads 8
  • -outfmt 6:表格格式,方便后续处理
  • -evalue:阈值,默认是 10,太宽松,建议用 1e-5
  • -num_threads:多线程,提高速度
  • -max_target_seqs:控制输出数量,默认 500,可设为 10 或 20
性能优化:数据量大时,建议先用 -max_hsps 1 减少冗余,或者用 -max_target_seqs 100 限制输出。我曾经用 50 万条序列做 blastx,不加限制跑了三天三夜。加上 -max_target_seqs 20 之后,一夜跑完。

记住,选对工具是成功的一半。下次做注释时,先停下来想一想:我的数据是什么类型的?数据库是什么类型的?想清楚再跑,别像我当初一样,傻乎乎地只用 blastn。好了,这就是 BLAST 四兄弟的完整介绍。快去试试吧。