Smoove — LUMPY结构变异检测的简化最佳实践封装¶
一句话说明¶
Smoove 是对 LUMPY/SVTyper 工具链的"傻瓜封装"——它把繁琐的多步结构变异检测流程(过滤、调用、基因分型、合并)整合成几个简单命令,同时降低假阳性,比直接用 lumpyexpress 更快更准。
安装与配置¶
# 方法1:Docker运行(最推荐,依赖最复杂)
docker pull brentp/smoove:latest # 包含所有依赖(lumpy、svtyper等)
# 运行smoove(检查依赖)
docker run brentp/smoove smoove # 显示已安装依赖列表
# 方法2:conda安装(部分依赖需单独安装)
conda create -n smoove python=3.8
conda activate smoove
conda install -c bioconda smoove lumpy-sv svtyper mosdepth
# 验证安装(smoove运行时会列出找到的依赖)
smoove # 无参数运行,显示依赖状态
# 方法3:下载预编译二进制(smoove本身是单二进制)
wget https://github.com/brentp/smoove/releases/download/v0.2.7/smoove
chmod +x smoove
export PATH=$(pwd):$PATH
核心用法¶
单样本SV检测¶
# smoove call:调用LUMPY并进行基因分型
smoove call \
--outdir smoove_results \ # 输出目录
--name SAMPLE_NAME \ # 样本名称
--fasta reference.fasta \ # 参考基因组
-p 8 \ # 线程数
--genotype \ # 同时用SVTyper进行基因分型
sample.bam # 输入BAM(需排序和索引)
多样本群体分析流程¶
# 第一步:对每个样本单独检测SV
for bam in sample1.bam sample2.bam sample3.bam; do
name="${bam%.bam}"
smoove call \
--outdir smoove_call_out \
--name $name \
--fasta reference.fasta \
-p 8 \
--genotype \
$bam
done
# 第二步:合并所有样本的SV位点
smoove merge \
--name cohort \ # 合并后样本集合名
--fasta reference.fasta \
-o smoove_merged \ # 输出目录
smoove_call_out/*.genotyped.vcf.gz # 所有样本的VCF
# 第三步:对每个样本根据合并位点重新基因分型
for bam in sample1.bam sample2.bam sample3.bam; do
name="${bam%.bam}"
smoove genotype \
-d \ # 使用duphold注释(推荐,提高精度)
-x \ # 每个样本独立运行
--name $name \
--outdir smoove_genotype_out \
--fasta reference.fasta \
--vcf smoove_merged/cohort.sites.vcf.gz \ # 合并后的SV位点
$bam
done
# 第四步:汇总所有样本基因分型结果
smoove paste \
--name cohort_final \ # 最终文件名前缀
smoove_genotype_out/*.vcf.gz # 所有基因分型VCF
参数详解¶
| 子命令 | 参数 | 说明 |
|---|---|---|
call | --outdir | 输出目录 |
call | --name | 样本名称(写入VCF) |
call | --fasta | 参考基因组 |
call | -p | 线程数 |
call | --genotype | 同时运行SVTyper基因分型 |
call | --exclude | 排除区域BED文件(推荐,过滤重复区) |
merge | --name | 合并后的样本集名称 |
genotype | -d | 使用duphold注释深度支持(推荐) |
paste | --name | 最终输出文件前缀 |
annotate | --gff | 使用GFF文件注释SV位于哪些基因 |
实战案例¶
# 完整多样本SV分析(3个样本)
REF="hg38.fasta"
SAMPLES=(sample1 sample2 sample3)
BAMS=(sample1.bam sample2.bam sample3.bam)
# 推荐排除区域(smoove提供)
EXCL="exclude.cnvnator_100bp.GRCh38.20170403.bed"
# 1. 单样本检测(使用Docker)
for i in "${!SAMPLES[@]}"; do
name="${SAMPLES[$i]}"
bam="${BAMS[$i]}"
docker run -v $(pwd):/data brentp/smoove \
smoove call \
--outdir /data/smoove_call \
--name $name \
--fasta /data/$REF \
--exclude /data/$EXCL \ # 排除低可图区域
-p 16 \
--genotype \
/data/$bam
done
# 2. 合并SV位点
docker run -v $(pwd):/data brentp/smoove \
smoove merge \
--name cohort \
--fasta /data/$REF \
-o /data/smoove_merge \
/data/smoove_call/*.genotyped.vcf.gz
# 3. 联合基因分型
for i in "${!SAMPLES[@]}"; do
name="${SAMPLES[$i]}"
bam="${BAMS[$i]}"
docker run -v $(pwd):/data brentp/smoove \
smoove genotype -d -x \
--name $name \
--outdir /data/smoove_geno \
--fasta /data/$REF \
--vcf /data/smoove_merge/cohort.sites.vcf.gz \
/data/$bam
done
# 4. 汇总最终结果
docker run -v $(pwd):/data brentp/smoove \
smoove paste --name final_cohort /data/smoove_geno/*.vcf.gz
# 5. 过滤高质量SV(PASS变异)
bcftools view -f PASS final_cohort.smoove.square.vcf.gz | \
grep -v "^#" | awk '{print $5}' | sort | uniq -c
常见报错与解决¶
报错1:smoove: lumpy not found - 原因:LUMPY未安装或不在PATH中 - 解决:使用Docker(推荐):docker pull brentp/smoove;或conda install -c bioconda lumpy-sv
报错2:ERROR: BAM file is not sorted - 原因:输入BAM未排序 - 解决:samtools sort -o sorted.bam input.bam && samtools index sorted.bam
报错3:paste步骤VCF列数不一致 - 原因:部分样本的genotype步骤失败或产生不完整VCF - 解决:检查smoove_geno目录中各样本VCF是否存在且完整;重跑失败样本的genotype步骤
速查表¶
| 命令 | 说明 |
|---|---|
smoove call --genotype | 单样本SV检测+基因分型 |
smoove merge | 合并多样本SV位点 |
smoove genotype -d -x | 联合基因分型(-d用duphold,-x并行) |
smoove paste | 汇总所有样本基因分型结果 |
smoove annotate --gff | 注释SV所在基因 |
docker pull brentp/smoove | 获取包含全部依赖的Docker镜像 |
--exclude excl.bed | 排除重复/低可图区域(降低假阳性) |
final_cohort.smoove.square.vcf.gz | 最终群体SV矩阵 |