BLAST 程序家族:五兄弟各显神通
说到 BLAST,新手最容易蒙的就是这五个程序到底该用哪个。我刚开始做序列比对时,也经常对着参数列表发呆——blastn、blastp、blastx、tblastn、tblastx,名字长得差不多,但处理逻辑完全不同。用错了,轻则跑不出结果,重则白白浪费几小时。
说白了,这五个程序的核心区别就两个变量:你的查询序列是什么类型(核酸还是蛋白),你要搜索的数据库是什么类型(核酸还是蛋白)。排列组合一下,正好覆盖所有场景。我画了张图帮你理清关系:
blastn:核酸找核酸,最常用的老大哥
blastn 的输入是核酸序列,搜索的目标也是核酸数据库。这活儿干得最直接——不需要翻译,直接比对碱基。如果你的问题是“这段 DNA 在基因组里有没有相似片段”,那就选它。
我遇到过一些新手把 cDNA 序列直接用 blastx 去搜 RNA 数据库,结果一堆假阳性。其实大部分场景下 blastn 就够了,速度也快。举个例子:
blastn -query my_sequence.fasta -db nr_nt -out results.txt -evalue 1e-5
注意那个 -task blastn 参数,默认就是 blastn,但你也可以选 megablast 来加速高相似度比对。我个人习惯,如果目标序列和数据库同源性>95%,直接用 megablast,省时间。
blastp:蛋白找蛋白,功能注释的主力
blastp 是蛋白序列对蛋白数据库。做功能注释时,这几乎是我的首选。为什么呢?蛋白序列的保守性比核酸强,跨物种比对时信号更清晰。
有一次我在一个细菌基因组里预测到一个未知 ORF,用 blastp 跑 NR 库,结果 top hit 是人类的一个激酶——E-value 1e-30。这才意识到可能是个水平转移事件。
blastp -query protein.fasta -db nr -outfmt 6 -evalue 1e-10
输出格式 -outfmt 6 是制表符分割,方便后续脚本处理。我看很多教程喜欢列 -outfmt 7 带注释,但我觉得机器解析还是 6 好。
blastx:核酸翻译后找蛋白,跨界的利器
blastx 把查询的核酸序列在六个阅读框翻译成蛋白,然后跟蛋白数据库比对。这个程序特别适合分析 EST、RNA-seq 的 contig,或者那些你怀疑有编码潜力的新序列。
我曾用 blastx 处理一批 coral 的转录组数据,因为珊瑚的基因组还没组装好,但蛋白库里有近缘种。blastx 帮我找到了很多保守的功能域。
tblastn:蛋白找核酸库,反向搜索
tblastn 把蛋白序列作为查询,去搜索核酸数据库——但数据库会被动态翻译成蛋白。这听起来有点绕,但应用场景很明确:你想知道某蛋白在未注释的基因组里有没有同源片段。
比如我用一个已知的激酶蛋白去搜一个刚测序的昆虫基因组(还没做基因预测),tblastn 就能定位到可能的编码区域。我记得有一次,tblastn 的结果帮我发现了一个基因的第二个外显子,而之前的注释全漏了。
tblastn -query kinase.fasta -db insect_genome.fna -evalue 1e-5 -seg yes -soft_masking true
-seg yes 和 -soft_masking true 可以过滤低复杂度区域,避免假阳性。嗯,这里容易踩坑。
tblastx:核酸翻译后互相找,最慢但最全
tblastx 是“双重翻译”——查询和数据库都从核酸翻译成蛋白,再比对。这基本是最后的手段了,因为它比 blastx 还慢一个数量级。但当你手头只有 EST 或 cDNA 数据,又想检测远缘同源时,tblastx 往往能挖到别人找不到的线索。
坦白讲,我用了十年 BLAST,实际生产中 tblastx 的使用比例不到 2%。大部分场景可以用 blastx 或 tblastn 替代。只有在跨门级比较、且数据库也是核酸库时,才会祭出这个慢家伙。
一表打尽:五大程序对比
| 程序 | 查询类型 | 数据库类型 | 是否翻译 | 速度 | 典型场景 |
|---|---|---|---|---|---|
| blastn | 核酸 | 核酸库 | 否 | 最快 | DNA同源搜索、基因组比对 |
| blastp | 蛋白 | 蛋白库 | 否 | 快 | 蛋白功能注释、结构域识别 |
| blastx | 核酸 | 蛋白库 | 查询翻译 | 中等 | 新序列功能预测、转录组注释 |
| tblastn | 蛋白 | 核酸库 | 数据库翻译 | 中等 | 未注释基因组中找同源蛋白 |
| tblastx | 核酸 | 核酸库 | 双方翻译 | 最慢 | 远缘同源检测、EST跨物种比对 |
怎么选?记住这个口诀
说一千道一万,最终归结为一个问题:你的查询和数据库各自是核酸还是蛋白?对照下面的清单,一分钟就能定下来:
- 核酸查核酸库 → blastn 或 megablast
- 蛋白查蛋白库 → blastp
- 核酸查蛋白库 → blastx
- 蛋白查核酸库 → tblastn
- 核酸查核酸库(但想看蛋白级保守性) → tblastx
我曾经犯过一个低级错误:拿着一段 cDNA 跑去用 blastn 搜蛋白库,结果空跑半小时。后来才反应过来——blastn 根本不接受蛋白数据库,如果混了会报错。再后来我写了个小脚本,自动检测输入文件是核酸还是蛋白,然后再匹配正确的程序。你想想看,如果每次都要手动判断,时间久了肯定出错。
-query_gencode 指定翻译密码表。比如线粒体编码用 2 号密码表。这个参数在 blastx 和 tblastn 里非常实用,尤其是分析线粒体或叶绿体数据时。我有个项目就栽在这个上面,默认用标准密码表翻译,结果多肽链提前终止,后来改过来才对了。
好了,五种程序的脾性你应该心里有数了。后面每个程序的具体参数调优,我们会在不同章节拆开细讲。今天就先到这儿——记住那张图和表格,下次面对 BLAST 不会选错。