4. BLAST 软件家族:选对工具,事半功倍
做细菌基因组注释,绕不开 BLAST。但很多人一上来就用默认的 blastn,结果跑出来的结果一堆假阳性,或者根本查不到同源序列。
我刚开始做注释时也踩过这个坑。有一次项目要注释一批噬菌体基因,我直接用 blastn 去比对,结果一大半序列都匹配不上。后来才发现,这些噬菌体基因跟数据库里已知序列的核酸相似度很低,但蛋白水平高度保守。换成 blastx 之后,命中率直接翻倍。
今天我们就聊聊 BLAST 家族里最常用的四个成员。什么时候用哪个,怎么选,我会把经验都告诉你。
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
4.3 blastp:蛋白水平的直接对话
blastp 是用蛋白序列比对蛋白数据库。蛋白序列的保守性比核酸强得多,所以 blastp 能发现更深层次的同源关系。
我做功能注释时,只要手上已经有预测好的蛋白序列,第一步一定是跑 blastp。为什么呢?因为蛋白比对的 e-value 更可靠,假阳性率更低。
举个例子:两个物种的某个基因,核酸序列可能只有 50% 相似,但翻译成蛋白之后,相似度可能达到 80%。如果只用 blastn,你就永远找不到这个同源基因。
blastp 的适用场景很明确:
- 功能已知的蛋白,找同源蛋白
- 蛋白结构域分析
- 进化分析,构建蛋白系统发育树
4.4 blastx:寻找隐藏的基因
blastx 是我最喜欢的一个工具。它把核酸序列翻译成六个阅读框的蛋白序列,然后去比对蛋白数据库。
为什么需要六个阅读框?因为核酸序列有正链和反链,每一条链又有三个阅读框。我们不知道基因到底在哪个阅读框里,所以 BLAST 会全部尝试一遍。
我经常遇到这种情况:从宏基因组数据中组装出一段 contig,看起来像是基因,但 blastn 查不到任何已知序列。这时候 blastx 就派上用场了。它能发现那些核酸层面不保守、但蛋白层面保守的基因。
有一次,我注释一个未培养细菌的基因组,里面有大量推测蛋白(hypothetical protein)。跑 blastn 全都没有结果,但跑 blastx 之后,超过 60% 都能匹配到已知的蛋白功能域。
blastx 的典型场景:
- 对新组装的基因组进行从头注释
- 鉴定未知功能的 ORF
- 在宏基因组数据中寻找功能基因
- 注释病毒或噬菌体基因组
4.5 tblastn:从蛋白出发找基因
tblastn 是 blastx 的镜像操作。你用一段已知的蛋白序列,去搜索核酸数据库。BLAST 会把核酸数据库里的每一条序列都翻译成六个阅读框,然后跟你的蛋白序列比对。
这个工具在基因组注释中特别实用。比如你知道某个蛋白家族的保守序列,想知道某个新基因组里有没有同源基因。直接用 tblastn 扫一遍基因组,比先用基因预测工具、再跑 blastp 要快得多。
tblastn 的典型用法:
- 寻找特定蛋白家族在基因组中的分布
- 验证基因预测的准确性
- 在未注释的基因组中寻找同源基因
4.6 选择原则:一张流程图解决问题
说了这么多,到底怎么选?我画了一张流程图,把决策路径整理出来了:
跟着这张图走,基本不会选错。我自己的经验是,90% 的情况下,只需要记住两件事:
- 核酸序列查核酸库 → blastn(快速、简单)
- 其余情况 → 优先考虑蛋白比对(更敏感、更准确)
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
记住,选对工具是成功的一半。下次做注释时,先停下来想一想:我的数据是什么类型的?数据库是什么类型的?想清楚再跑,别像我当初一样,傻乎乎地只用 blastn。好了,这就是 BLAST 四兄弟的完整介绍。快去试试吧。