3. BLAST命令行使用:BLAST+安装与实战
讲到序列比对,BLAST 绝对是绕不开的核心工具。不管是做基因组注释、功能预测,还是找同源序列,BLAST 都跑不掉。很多同学用惯了在线版,觉得点两下就能出结果。但我得说一句——真要做大规模数据分析,本地 BLAST 才是正道。
为什么?你想想看,几百条序列往 NCBI 网页一贴,服务器等半天不说,数据安全也是个问题。我个人的习惯:只要是做项目,不管大小,先搭本地 BLAST。今天咱们就把这事儿说透。
3.1 BLAST+ 的安装
BLAST+ 是 NCBI 官方维护的命令行工具集。相比老版的 blastall,它速度更快,参数也更规范。安装其实很简单。
核心思路:下载预编译二进制,解压,加入 PATH 就完事了。
以 Linux 系统为例,我通常这么干:
# 下载 BLAST+ 2.15.0(版本号根据需求调整)
wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/ncbi-blast-2.15.0+-x64-linux.tar.gz
# 解压
tar -zxvf ncbi-blast-2.15.0+-x64-linux.tar.gz
# 移到常用目录
sudo mv ncbi-blast-2.15.0+ /usr/local/
# 加入环境变量
export PATH=/usr/local/ncbi-blast-2.15.0+/bin:$PATH
Windows 用户呢?下载 Windows 版 exe 安装包,直接点下一步就行。安装完后记得把 C:\Program Files\NCBI\blast-2.15.0+\bin 加到系统环境变量里。
检查是否成功:打开终端输入 blastn -version。我习惯先跑这条命令确认环境没问题。
3.2 认识两大主力:blastn 与 blastp
BLAST+ 工具包里命令不少。但日常用得最多的,就两个:
- blastn —— 核酸 vs 核酸
- blastp —— 蛋白 vs 蛋白
这俩的逻辑一样,只是比对的对象不同。blastn 找的是 DNA 层面的相似性,blastp 看的是氨基酸层面的保守性。我在做植物基因组项目时遇到过一个问题:用 blastn 比对编码区序列,结果好多假阳性——因为内含子区域干扰太大。后来改用 blastp 比对翻译后的蛋白序列,结果明显干净多了。
注意:用 blastn 比对时,若 대상序列是真核生物,一定要考虑内含子问题。跨物种比对我更推荐用 blastp 做蛋白层面分析。
3.3 核心参数解析
咱们先看一个典型的 blastn 命令:
blastn -query my_seqs.fasta -db nt -out results.txt -outfmt 6 -evalue 1e-5 -num_threads 4
来拆解一下每个参数:
| 参数 | 作用 | 我的经验 |
|---|---|---|
-query |
输入文件(FASTA 格式) | 文件里序列别太多,建议一条记录一行 |
-db |
数据库名称 | 第一次用记得先建索引(makeblastdb) |
-out |
输出文件名 | 我习惯加时间戳,避免覆盖之前的结果 |
-outfmt |
输出格式(6=tabular, 5=XML) | 下游分析用 tabular,人工查阅用默认 |
-evalue |
期望阈值(越小越严格) | 同源搜索我设 1e-5,找直系同源设 1e-10 |
-num_threads |
线程数 | 别贪多,留一个给操作系统 |
blastp 的参数完全一样。唯一区别是数据库:blastp 用的是蛋白数据库(如 nr、swissprot)。
3.4 输出格式怎么选?
BLAST+ 支持 18 种输出格式。但常用的就三种:
- 默认格式(outfmt 0):带比对信息的可读文本,适合人工查看。如果你就想看一眼结果,用这个。
- Tabular 格式(outfmt 6):一列一列排好,每列含义固定。我几乎所有项目都用这个——因为写脚本处理起来太方便了。
- XML 格式(outfmt 5):结构化的标记语言,适合程序解析。如果你做 pipeline 开发,用这个。
避坑指南:我曾经因为用了默认格式做批量分析,结果还要写脚本解析那堆文本…自找麻烦。后来统一改用 tabular 格式,一行一个匹配,舒服多了。
Tabular 格式的 12 列分别是:
1. query acc.ver — 查询序列ID
2. subject acc.ver — 目标序列ID
3. % identity — 一致度
4. alignment length — 比对长度
5. mismatches — 错配数
6. gap opens — 空隙数
7. q.start — 查询序列起始
8. q.end — 查询序列终止
9. s.start — 目标序列起始
10. s.end — 目标序列终止
11. evalue — 期望值
12. bit score — 比特分
把这 12 列往 pandas 里一读,什么排序、筛选、统计,几分钟就能搞定。
3.5 实战:跑一次本地 BLAST
光说不练假把式。我们来跑一个完整的流程。
第一步:准备数据库
先得建索引。假设你手里有个 ref_genome.fasta 文件:
makeblastdb -in ref_genome.fasta -dbtype nucl -out my_db
-dbtype nucl 表示核酸数据库。如果是蛋白,就写 prot。
第二步:写查询序列
假设我们要找一段潜在的基因编码区,建一个 query.fasta:
>my_gene_1
ATGCGTACGATCGATCGATCGATCGATCGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAG
第三步:运行 blastn
blastn -query query.fasta -db my_db -out blast_results.txt -outfmt 6 -evalue 1e-5 -num_threads 4
第四步:看结果
打开 blast_results.txt:
my_gene_1 ref_chr1 98.45 200 3 0 1 200 15000 15200 3e-50 200.5
这行信息很丰富:我们的基因比对上 1 号染色体的 15000–15200 区域,一致度 98.45%,evalue 3e-50,非常靠谱。
调试小技巧:我刚开始跑 BLAST 时,经常遇到“Database not found”错误。这是因为当前目录不对,或者数据库路径没写全。用绝对路径最保险。
3.6 把整个流程画出来
下面这张图总结了本地 BLAST 的完整工作流,从序列输入到结果解析,每一步都离不开刚才讲的内容。
这张图把流程分成了四层:输入 → 索引 → 比对 → 输出解析。每个环节都有对应命令和参数。你跟着走一遍,就基本掌握本地 BLAST 的核心了。
再强调一次:做大规模批量比对时,千万别用默认格式输出。我见过有人这样干,结果几万条结果解析到崩溃。统一用 tabular(outfmt 6)或 XML(outfmt 5),后续处理省一大半时间。
嗯,BLAST 这章就到这儿。掌握了这些,你已经能独立完成一整套本地序列比对分析。下一步就是把这些匹配结果整合到基因组注释流程里,但那又是另一课的内容了。