Purge_Dups — 基因组组装去冗余工具¶
一句话说明¶
Purge_Dups 用于去除基因组组装中由杂合区域产生的冗余 contig(haplotig),解决"组装大小是预期基因组的两倍"的问题,是杂合基因组组装后处理的必备步骤。
安装与配置¶
# 方法1:conda 安装(推荐)
conda install -c bioconda purge_dups # 从 bioconda 安装
# 方法2:源码编译
git clone https://github.com/dfguan/purge_dups.git # 克隆源码
cd purge_dups/src && make # 编译
# 验证安装
purge_dups --version 2>&1 || echo "purge_dups installed"
pd_config.py --help # 检查配置脚本
# 还需要 minimap2(用于比对)
conda install -c bioconda minimap2
什么时候需要 Purge_Dups¶
- 组装大小明显超过预期基因组大小(如预期 500Mb,实际组装 800Mb)
- BUSCO 的 Duplicated 比例很高(>10%)
- 组装后 contig 中有很多杂合区域被分别组装成独立的 contig
核心用法¶
标准流程(分步执行)¶
# 第1步:将读段比对到组装,计算覆盖度
minimap2 -x map-hifi -t 16 assembly.fasta hifi_reads.fq.gz \
| gzip -c > reads_vs_asm.paf.gz # 读段 vs 组装的 PAF 比对
# 第2步:计算覆盖度分布,确定阈值
pbcstat reads_vs_asm.paf.gz # 统计覆盖度
# 生成 PB.base.cov(碱基覆盖度)和 PB.stat(统计信息)
calcuts PB.stat > cutoffs 2> calcults.log # 自动计算覆盖度阈值
# 第3步:组装自身比对(找冗余区域)
split_fa assembly.fasta > assembly.split.fa # 切分 contig
minimap2 -x asm5 -t 16 -DP assembly.split.fa assembly.split.fa \
| gzip -c > asm_self.paf.gz # 自身比对
# 第4步:执行 purge
purge_dups \
-2 \ # 输出双倍单倍型
-T cutoffs \ # 覆盖度阈值文件
-c PB.base.cov \ # 碱基覆盖度
asm_self.paf.gz > dups.bed # 冗余区域 BED 文件
# 第5步:生成 purge 后的序列
get_seqs -e dups.bed assembly.fasta # 输出 purged.fa 和 hap.fa
# purged.fa — 去冗余后的主要组装(使用这个)
# hap.fa — 被移除的 haplotig(可作为备选单倍型)
一键式流程(使用 run_purge_dups.py)¶
# 创建配置文件
pd_config.py \
-l reads_vs_asm.paf.gz \ # 读段比对结果
-s asm_self.paf.gz \ # 自身比对结果
assembly.fasta \ # 输入组装
config.json # 输出配置文件
# 运行完整流程
run_purge_dups.py config.json \
/path/to/purge_dups/bin \ # purge_dups 的 bin 目录
purge_output # 输出目录
验证 Purge 效果¶
# 用 BUSCO 对比 purge 前后
busco -i assembly.fasta -o busco_before -m genome -l eukaryota_odb10 -c 16
busco -i purged.fa -o busco_after -m genome -l eukaryota_odb10 -c 16
# 对比结果:
# Duplicated 应该明显下降
# Complete + Single-copy 应该保持或略有提升
# Missing 不应该明显增加
# 检查组装大小变化
seqkit stats assembly.fasta purged.fa hap.fa
常见问题与踩坑¶
问题1:purge 后 BUSCO Complete 下降明显¶
原因:阈值设置过于激进,把真实的基因区域也移除了
解决:检查 calcuts 的覆盖度阈值是否合理,手动调整 cutoffs 文件中的上下限
问题2:HiFi 和 ONT 数据用哪个参数¶
HiFi 比对:minimap2 -x map-hifi
ONT 比对:minimap2 -x map-ont
自身比对:都用 minimap2 -x asm5
问题3:覆盖度阈值不正确¶
检查方法:查看 PB.stat 文件和 calcuts 输出
手动调整:cutoffs 文件格式为 min_cov med_cov max_cov,可手动编辑
问题4:什么时候不需要 Purge_Dups¶
- 纯合基因组(如近交系小鼠):不需要
- Hifiasm 的
hap1/hap2输出:已经分型,通常不需要 - Hifiasm 的
p_ctg输出:可能需要(取决于杂合度)
速查卡片¶
| 命令/参数 | 用途 |
|---|---|
pbcstat reads.paf.gz | 统计覆盖度 |
calcuts PB.stat > cutoffs | 计算覆盖度阈值 |
split_fa assembly.fa > split.fa | 切分组装序列 |
purge_dups -2 -T cutoffs -c cov self.paf.gz | 执行 purge |
get_seqs -e dups.bed assembly.fa | 生成 purge 后序列 |
purged.fa | 去冗余后的主要组装 |
hap.fa | 被移除的 haplotig |
-x map-hifi | HiFi 读段比对参数 |
-x asm5 | 自身比对参数 |
pd_config.py | 生成配置文件 |