BLAST 程序家族:五兄弟各显神通

说到 BLAST,新手最容易蒙的就是这五个程序到底该用哪个。我刚开始做序列比对时,也经常对着参数列表发呆——blastn、blastp、blastx、tblastn、tblastx,名字长得差不多,但处理逻辑完全不同。用错了,轻则跑不出结果,重则白白浪费几小时。

说白了,这五个程序的核心区别就两个变量:你的查询序列是什么类型(核酸还是蛋白),你要搜索的数据库是什么类型(核酸还是蛋白)。排列组合一下,正好覆盖所有场景。我画了张图帮你理清关系:

BLAST 程序家族关系图 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 帮我找到了很多保守的功能域。

实用技巧: blastx 的翻译过程会降低比对速度,因为每个查询序列要翻译六次。如果你的查询片段比较短(< 200 bp),可以考虑先做 blastn 看看能不能直接命中,不行再用 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 替代。只有在跨门级比较、且数据库也是核酸库时,才会祭出这个慢家伙。

性能警告: 我曾用 tblastx 跑一个 5000 条 EST 的库,在 32 核服务器上跑了整整 18 小时。如果你只是想快速看看,建议先用 blastx 探查一下,或者限制 -evalue 到 1e-3 以下。

一表打尽:五大程序对比

程序 查询类型 数据库类型 是否翻译 速度 典型场景
blastn 核酸 核酸库 否 最快 DNA同源搜索、基因组比对
blastp 蛋白 蛋白库 否 快 蛋白功能注释、结构域识别
blastx 核酸 蛋白库 查询翻译 中等 新序列功能预测、转录组注释
tblastn 蛋白 核酸库 数据库翻译 中等 未注释基因组中找同源蛋白
tblastx 核酸 核酸库 双方翻译 最慢 远缘同源检测、EST跨物种比对

怎么选?记住这个口诀

说一千道一万,最终归结为一个问题:你的查询和数据库各自是核酸还是蛋白?对照下面的清单,一分钟就能定下来:

  • 核酸查核酸库 → blastn 或 megablast
  • 蛋白查蛋白库 → blastp
  • 核酸查蛋白库 → blastx
  • 蛋白查核酸库 → tblastn
  • 核酸查核酸库(但想看蛋白级保守性) → tblastx

我曾经犯过一个低级错误:拿着一段 cDNA 跑去用 blastn 搜蛋白库,结果空跑半小时。后来才反应过来——blastn 根本不接受蛋白数据库,如果混了会报错。再后来我写了个小脚本,自动检测输入文件是核酸还是蛋白,然后再匹配正确的程序。你想想看,如果每次都要手动判断,时间久了肯定出错。

一点补充: 实际命令行中,如果你确定序列类型,还可以用 -query_gencode 指定翻译密码表。比如线粒体编码用 2 号密码表。这个参数在 blastx 和 tblastn 里非常实用,尤其是分析线粒体或叶绿体数据时。我有个项目就栽在这个上面,默认用标准密码表翻译,结果多肽链提前终止,后来改过来才对了。

好了,五种程序的脾性你应该心里有数了。后面每个程序的具体参数调优,我们会在不同章节拆开细讲。今天就先到这儿——记住那张图和表格,下次面对 BLAST 不会选错。