跳转至

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 instructionCPU 不支持所需的 SIMD 指令集bwa-mem2.sse41 或从源码编译
[mem_sam_pe] paired reads have different namesR1 和 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