BWA-MEM2 比对加速
BWA-MEM2 是 BWA-MEM 的高性能继任者,利用 SIMD 指令集加速短读长序列比对,速度提升 1.3-3.1 倍,输出与 BWA-MEM 完全一致。
核心知识点
| 知识点 | 说明 |
|---|
| 工具定位 | 短读长(Illumina)序列比对工具,BWA-MEM 的加速版 |
| 最新版本 | v2.2.1(MIT 许可证) |
| 加速原理 | 利用 CPU 的 SIMD 指令集(SSE4.1/AVX2/AVX-512)加速比对 |
| 性能提升 | 比 BWA-MEM 快 50%-100%,输出比对结果完全一致 |
| 输出格式 | SAM/BAM/CRAM,与 samtools、GATK 完全兼容 |
| 适用场景 | 全基因组测序(WGS)、外显子组、靶向测序、微生物基因组、临床变异检测 |
| 开发团队 | Intel 并行计算实验室(基于 Heng Li 的原始 BWA) |
| 长读长替代 | PacBio/Nanopore 请用 minimap2,不要用 BWA-MEM2 |
安装配置
方法一:Conda 安装(推荐)
# 创建专用环境
conda create -n align python=3.10 # 创建名为 align 的环境
conda activate align # 激活环境
# 从 bioconda 安装 bwa-mem2
conda install -c bioconda bwa-mem2 # 安装 bwa-mem2
# 验证安装
bwa-mem2 version # 查看版本号,应显示 2.2.1
方法二:下载预编译二进制文件
# 下载最新版本的预编译文件
curl -L https://github.com/bwa-mem2/bwa-mem2/releases/download/v2.2.1/bwa-mem2-2.2.1_x64-linux.tar.bz2 \
-o bwa-mem2.tar.bz2 # 下载压缩包
tar -xjf bwa-mem2.tar.bz2 # 解压缩
# 移动到 PATH 目录
sudo cp bwa-mem2-2.2.1_x64-linux/bwa-mem2* /usr/local/bin/ # 复制可执行文件到系统路径
# 验证安装
bwa-mem2 version # 确认安装成功
方法三:从源码编译
# 克隆仓库
git clone --recursive https://github.com/bwa-mem2/bwa-mem2 # 克隆含子模块的仓库
cd bwa-mem2 # 进入目录
# 编译
make # 编译,自动检测 CPU 指令集
# 可选:指定编译器优化
# make CXX=icpc # 使用 Intel 编译器(如果有的话,性能更好)
基本使用
1. 构建参考基因组索引
# 对参考基因组建索引(只需要做一次)
bwa-mem2 index ref_genome.fa # 为参考基因组建立索引
# 会生成 .0123, .amb, .ann, .bwt.2bit.64, .pac 等索引文件
# 注意:索引文件与 BWA 不通用,需要重新建
2. 单端比对
# 单端测序数据比对
bwa-mem2 mem \
-t 8 \ # 使用 8 个线程
ref_genome.fa \ # 参考基因组(已建索引)
reads.fq.gz \ # 输入的测序数据(支持 gzip 压缩)
> aligned.sam # 输出 SAM 格式比对结果
3. 双端比对(最常用)
# 双端测序数据比对 + 排序 + 转 BAM
bwa-mem2 mem \
-t 16 \ # 使用 16 个线程
-R "@RG\tID:sample1\tSM:sample1\tPL:ILLUMINA" \ # 添加 Read Group 信息(GATK 必需)
ref_genome.fa \ # 参考基因组
sample_R1.fq.gz \ # 正向读长文件
sample_R2.fq.gz \ # 反向读长文件
| samtools sort -@ 4 -o aligned.bam # 管道传给 samtools 排序并输出 BAM
4. 批量比对脚本
#!/bin/bash
# batch_align.sh - 批量比对脚本
REF="ref_genome.fa" # 参考基因组路径
THREADS=16 # 线程数
OUTDIR="aligned" # 输出目录
mkdir -p $OUTDIR # 创建输出目录
# 遍历所有 R1 文件
for R1 in raw_data/*_R1.fq.gz; do
SAMPLE=$(basename $R1 _R1.fq.gz) # 提取样本名
R2=${R1/_R1/_R2} # 推断 R2 文件名
echo "正在比对: $SAMPLE"
bwa-mem2 mem \
-t $THREADS \ # 多线程比对
-R "@RG\tID:${SAMPLE}\tSM:${SAMPLE}\tPL:ILLUMINA" \ # Read Group
$REF $R1 $R2 \ # 参考基因组和输入文件
| samtools sort -@ 4 \ # 排序
-o ${OUTDIR}/${SAMPLE}.sorted.bam # 输出排序后的 BAM
samtools index ${OUTDIR}/${SAMPLE}.sorted.bam # 建立 BAM 索引
done
echo "全部比对完成!"
高级用法
1. 常用参数详解
bwa-mem2 mem \
-t 16 \ # 线程数,建议设为 CPU 核心数的 80%
-k 19 \ # 最小种子长度,默认 19,越大越快但可能漏掉短匹配
-w 100 \ # 带宽(band width),控制比对的最大 indel 长度
-M \ # 将较短的 split hits 标记为 secondary(Picard 兼容需要)
-Y \ # 对补充比对使用软裁剪(soft clipping)
-K 10000000 \ # 每批处理的碱基数,影响内存和可重复性
ref.fa R1.fq R2.fq > out.sam
2. 与 GATK 流程整合
# 第一步:比对
bwa-mem2 mem -t 16 -M \
-R "@RG\tID:sample\tSM:sample\tPL:ILLUMINA\tLB:lib1" \
ref.fa R1.fq.gz R2.fq.gz \
| samtools sort -@ 4 -o sorted.bam # 排序
# 第二步:标记重复序列
picard MarkDuplicates \
I=sorted.bam \ # 输入排序后的 BAM
O=dedup.bam \ # 输出去重后的 BAM
M=metrics.txt # 输出重复统计报告
# 第三步:建索引
samtools index dedup.bam # 为去重 BAM 建索引
# 第四步:碱基质量重校准(BQSR)
gatk BaseRecalibrator \
-I dedup.bam \ # 输入去重 BAM
-R ref.fa \ # 参考基因组
--known-sites known_snps.vcf \ # 已知变异位点
-O recal.table # 输出校准表
gatk ApplyBQSR \
-I dedup.bam \ # 输入去重 BAM
-R ref.fa \ # 参考基因组
--bqsr-recal-file recal.table \ # 校准表
-O final.bam # 最终 BAM 文件
3. CPU 指令集自动检测
# BWA-MEM2 会自动检测你的 CPU 支持哪种 SIMD 指令集
# 优先级:AVX-512 > AVX2 > SSE4.1
# 查看你的 CPU 支持哪些指令集
lscpu | grep -i "avx\|sse" # 检查 CPU 指令集支持
# 手动指定使用特定版本(预编译包里有多个版本)
# bwa-mem2 → 自动选择最快版本
# bwa-mem2.sse41 → 强制使用 SSE4.1 版本
# bwa-mem2.avx2 → 强制使用 AVX2 版本
# bwa-mem2.avx512bw → 强制使用 AVX-512 版本
常见报错与解决
| 报错信息 | 原因 | 解决方法 |
|---|
[E::bwa_idx_load_from_disk] fail to locate the index | 索引文件不存在或路径错 | 先运行 bwa-mem2 index ref.fa 建索引 |
Illegal instruction | CPU 不支持所需的 SIMD 指令集 | 用 bwa-mem2.sse41 或从源码编译 |
[mem_sam_pe] paired reads have different names | R1 和 R2 文件不配对 | 检查文件是否配对,read 名是否一致 |
bus error / 内存不足 | 参考基因组太大,内存不够 | 人类基因组索引约需 30GB 内存 |
bwa-mem2 index: command not found | 未安装或不在 PATH 中 | 检查安装路径,which bwa-mem2 |
| 输出 SAM 为空 | 输入文件为空或格式错误 | 检查 zcat reads.fq.gz | head 是否有内容 |
速查表
# ===== BWA-MEM2 速查表 =====
# 安装
conda install -c bioconda bwa-mem2 # conda 安装
# 建索引(只做一次)
bwa-mem2 index ref.fa # 为参考基因组建索引
# 单端比对
bwa-mem2 mem -t 8 ref.fa reads.fq > out.sam
# 双端比对(标准用法)
bwa-mem2 mem -t 16 -R "@RG\tID:s1\tSM:s1\tPL:ILLUMINA" \
ref.fa R1.fq.gz R2.fq.gz | samtools sort -o sorted.bam
# 建 BAM 索引
samtools index sorted.bam
# 查看比对统计
samtools flagstat sorted.bam # 比对率等统计信息
samtools stats sorted.bam | head -40 # 详细统计
# 常用参数
# -t N 线程数
# -M 兼容 Picard
# -Y soft clip 补充比对
# -R STR Read Group 信息
# -k INT 最小种子长度(默认19)
# -K INT 每批碱基数(影响可重复性)
# BWA-MEM2 vs BWA-MEM
# 速度:快 1.3-3.1 倍
# 结果:完全一致
# 索引:不通用,需重建
# 内存:略高于 BWA-MEM