3. BLAST 变体与工具选择:到底该用哪一个?
好,这是很关键的一讲。我们刚才聊了 BLAST 的基本原理,但你打开 NCBI 的 BLAST 页面,会发现一堆选项:BLASTN、BLASTP、BLASTX、TBLASTN、TBLASTX……再加上一个 blastx 的变体……嗯,有点晕是吧?
别急。实际项目里不是每个工具都要用,选错了轻则跑得慢,重则漏掉关键注释。我今天就把这几个「变体」的适用场景拆开揉碎了讲清楚。每个工具解决什么问题,写什么命令,我在项目里踩过什么坑,一起过一遍。
一句话总结选择逻辑:看你的“查询序列”和“目标数据库”分别是什么“语言”——是核酸(DNA/RNA)还是氨基酸(蛋白质)。两两组合,就是五种模式。
3.1 BLASTN:核酸 vs 核酸
简单粗暴。你的查询序列是 DNA,数据库也是 DNA。它直接比较碱基序列,速度最快,对同源性的分辨率也最高。特别适合:
- 已知基因在另一个菌株里的等位基因查找
- 16S rRNA 鉴定(物种鉴定经典场景)
- 质粒序列比对,看同源区域
我个人习惯在跑 BLASTN 时把 -word_size 调小一点,默认一般是 11,但如果在做耐药基因筛查(比如找 mecA 的同源变异),我会降到 7,这样能抓到更发散的同源片段。代价是速度下降,不过小基因组无所谓。
常用命令示例:
blastn -query query.fasta -db nt -out results.txt \
-outfmt 6 -evalue 1e-10 -word_size 11
我的实战经验:BLASTN 的 -task 参数有个坑。默认是 megablast(对大段高度相似序列优化),如果你在找跨种属的保守区,记得换成 blastn 或 dc-megablast,不然会漏。我之前有一次跑沙门氏菌的毒力基因,差点因为这个漏了一个关键缺失片段。
3.2 BLASTP:蛋白 vs 蛋白
你手上有一段蛋白序列,或者你已将基因翻译成了蛋白质,去比对蛋白质数据库。
做抗生素抗性基因注释时,我几乎首选 BLASTP。为什么?因为蛋白质序列比核酸更保守。核酸序列很容易因同义突变而看上去“差异大”,但蛋白序列能保留核心功能结构域。换句话说,你用 BLASTP 能找到更远缘的同源基因——这在你注释未知病原菌时特别重要。
- 适用于:已有 ORF 预测结果,做功能注释
- 推荐数据库:NR、Swiss-Prot、UniRef
- 参数注意:
-evalue我一般设为 1e-5,再高噪声太多
命令示例:
blastp -query proteins.faa -db nr -out blastp_results.txt \
-outfmt "6 qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore" \
-num_threads 8 -evalue 1e-5
避坑:NR 数据库很大。我第一次跑全基因组注释,拿了一整条 Klebsiella 染色体翻译后的蛋白,对着 NR 跑 BLASTP……跑了 3 天。
现在我的习惯是先拿 Swiss-Prot 跑一轮拿到功能标签,再用 NR 查漏补缺。这样快很多。
3.3 BLASTX:核酸 vs 蛋白(我最常用的一个)
你有一段 DNA 或 cDNA,但不知道它里面有没有“隐藏”的编码区。BLASTX 会帮你把输入的核酸序列自动按六种读框翻译成蛋白质,再比对蛋白数据库。
这在病原菌基因组里太常用了:你测序得到一个 contig,有很多片段,你想立刻知道这些片段大概编码什么——不需要等 ORF 预测完成。BLASTX 能做到。
- 典型场景:新基因组初步功能标注、RNA-seq 读段的功能注释
- 优势:能发现新基因、跨物种的远同源关系
- 注意点:速度慢(因为内部要翻译六框架)
我一般做初筛时这么用:
blastx -query contigs.fasta -db nr -out blastx_contigs.txt \
-outfmt 6 -evalue 1e-3 -num_threads 8
小技巧:如果你不想等太久,可以先用 -max_target_seqs 设为 1,先拿一条最优匹配,后面再有针对性地细做。另外,BLASTX 的 -strand both 默认打开,我一般保持默认,因为不明白链方向。
3.4 TBLASTN:蛋白 vs 核酸
和 BLASTX 刚好反过来——你的查询是蛋白质序列,数据库是核酸。工具会把数据库中的每条核酸序列翻译成六框蛋白,然后和你的查询蛋白比对。
这有什么用?比如你有一个已知的抗性蛋白序列,想看看在某个细菌基因组(DNA序列)里有没有编码类似蛋白的区域——即使这些区域没有正式标注为基因,也能找到。
- 适合场景:在未注释的基因组草图中找同源结构域
- 一种“反向”推测:已知蛋白,找其编码基因的可能位置
- 我曾在噬菌体序列注释中用过,效果很好
命令示例:
tblastn -query protein.fasta -db assembled_genome.fasta \
-out tblastn.out -outfmt 6 -evalue 1e-5
注意:TBLASTN 的计算开销大,因为数据库每条序列翻译6次。如果基因组较大,建议先做索引或用分块查询。我曾经在跑一个 50 Mb 的植物病原菌基因组时,TBLASTN 跑了将近 8 小时。建议只在必要场景用。
3.5 TBLASTX:核酸 vs 核酸,但蛋白层面
这个最「重型」。查询序列和数据库序列都是核酸,但内部都会翻译成六种读框的蛋白序列,再在蛋白层面比对——相当于你做了两次 BLASTX。
说实话,我个人很少用。只在一种情况下用过:当我比对两条相距较远的基因组(比如不同属的细菌),且怀疑存在极保守的新基因,核酸层面的比对全无结果时,才会尝试 TBLASTX。
它超级慢,而且结果解读需要小心。因为从核酸到蛋白、再到跨读框匹配,假阳性会增加。
tblastx -query unknown.fasta -db reference_genome.fasta \
-out tblastx.txt -outfmt 6 -evalue 1e-3
一句话总结:常规基因组注释,BLASTX 是最平衡的选择。但具体场景具体分析,没有万金油。
3.6 对比一览表
| 工具 | 查询类型 | 数据库类型 | 核心用途 | 推荐频率 |
|---|---|---|---|---|
| BLASTN | 核酸 | 核酸 | 同源基因、标记基因鉴定 | 高频 |
| BLASTP | 蛋白 | 蛋白 | 蛋白功能注释 | 高频 |
| BLASTX | 核酸 | 蛋白 | 新基因组初步注释、RNA-seq | 极高频 |
| TBLASTN | 蛋白 | 核酸 | 在未注释序列中找同源区 | 中频 |
| TBLASTX | 核酸 | 核酸 | 极远缘同源搜索 | 低频 |
3.7 一个直观的选择逻辑
我把这个选择逻辑画了一张流程图,方便你贴在工位旁:
核心原则:DNA vs DNA 用 BLASTN;Protein vs Protein 用 BLASTP;跨类型比对需要额外翻译步骤,但回报是能跨更大的进化距离找到同源关系。