CONCOCT — 基于覆盖度和组成的宏基因组 binning 工具
一句话说明
CONCOCT 利用高斯混合模型,结合多样本覆盖度和 contig 核苷酸组成,对宏基因组 contig 进行无监督聚类分箱。
安装与配置
# 激活已有 binning 环境或新建
conda create -n concoct python=3.9 -y
conda activate concoct
# 从 bioconda 安装 CONCOCT(当前稳定版 v1.1.0)
conda install -c bioconda -c conda-forge concoct -y
# 验证安装
concoct --version # 查看版本号
cut_up_fasta.py --help # 查看 contig 切割工具帮助
核心用法
第一步:切割 contig(提高分辨率)
# CONCOCT 推荐将长 contig 切成 10kb 小块以提高精度
# cut_up_fasta.py:CONCOCT 自带的 contig 切割脚本
# -c 10000:每块大小 10000bp
# -o 0:不允许重叠
# --merge_last:最后一块合并到前一块(避免过短片段)
# -b:输出 BED 格式(记录切割位置)
cut_up_fasta.py assembly.fa \
-c 10000 \
-o 0 \
--merge_last \
-b contigs_10K.bed \
> contigs_10K.fa # 输出切割后的 contig 文件
第二步:比对并生成覆盖度表
# 将每个样本的 reads 比对到切割后的 contig
bwa index contigs_10K.fa # 建索引
# 多样本循环比对(每个样本生成一个 BAM)
for sample in sample1 sample2 sample3; do
bwa mem -t 16 contigs_10K.fa \
${sample}_R1.fq.gz ${sample}_R2.fq.gz \
| samtools sort -o ${sample}.bam # 比对并排序
samtools index ${sample}.bam # 建 BAM 索引
done
# 生成覆盖度表(CONCOCT 专用格式)
# concoct_coverage_table.py:计算每个 contig 在每个样本中的覆盖度
concoct_coverage_table.py \
contigs_10K.bed \
sample1.bam sample2.bam sample3.bam \
> coverage_table.tsv # 输出覆盖度矩阵
第三步:运行 CONCOCT
# 主程序:基于高斯混合模型聚类
# --composition_file:切割后的 contig fasta
# --coverage_file:覆盖度矩阵
# --clusters:预期聚类数(通常设为样本多样性的估计值)
# --kmer_length:k-mer 长度(默认 4)
# -l:最短 contig 长度过滤
mkdir -p concoct_output
concoct \
--composition_file contigs_10K.fa \
--coverage_file coverage_table.tsv \
-b concoct_output/ \
--clusters 400 \
--kmer_length 4 \
-l 1000 \
--threads 16 # 使用线程数
第四步:合并聚类结果到原始 contig
# 将切割 contig 的聚类结果合并回原始 contig
merge_cutup_clustering.py \
concoct_output/clustering_gt1000.csv \
> concoct_output/clustering_merged.csv # 合并后的聚类文件
# 根据聚类结果提取 bin fasta 文件
mkdir -p concoct_bins
extract_fasta_bins.py \
assembly.fa \
concoct_output/clustering_merged.csv \
--output_path concoct_bins/ # 输出目录
参数详解
| 参数 | 说明 | 默认值 |
|---|
--clusters | 期望聚类数(bin 数目) | 400 |
--kmer_length | k-mer 计算长度 | 4 |
-l | 最短 contig 长度(bp) | 1000 |
--threads | 线程数 | 1 |
--iterations | EM 算法最大迭代次数 | 500 |
--epsilon | 收敛阈值 | 1e-6 |
--seed | 随机种子 | 1 |
-b | 输出目录 | 必填 |
实战案例
# 完整流程:3 个时间点样本的宏基因组 binning
# 场景:同一患者不同时间点的肠道宏基因组
# 1. 切割组装结果
cut_up_fasta.py coassembly.fa -c 10000 -o 0 --merge_last \
-b contigs_10K.bed > contigs_10K.fa
# 2. 三个样本依次比对
for t in T0 T1 T2; do
bwa mem -t 8 contigs_10K.fa ${t}_R1.fq.gz ${t}_R2.fq.gz \
| samtools sort -o ${t}.bam && samtools index ${t}.bam
done
# 3. 生成覆盖度表
concoct_coverage_table.py contigs_10K.bed T0.bam T1.bam T2.bam \
> coverage_table.tsv
# 4. 运行 CONCOCT
concoct --composition_file contigs_10K.fa \
--coverage_file coverage_table.tsv \
-b concoct_out/ --clusters 300 --threads 8
# 5. 合并并提取 bins
merge_cutup_clustering.py concoct_out/clustering_gt1000.csv \
> concoct_out/clustering_merged.csv
mkdir bins && extract_fasta_bins.py coassembly.fa \
concoct_out/clustering_merged.csv --output_path bins/
常见报错与解决
| 报错信息 | 原因 | 解决方法 |
|---|
ImportError: No module named sklearn | scikit-learn 未安装 | conda install scikit-learn |
Convergence failed | 迭代次数不足 | 增加 --iterations 值 |
coverage_table has no samples | BAM 路径错误 | 检查 BAM 文件路径和索引 |
bins 数量远少于 --clusters | 实际多样性低 | 减小 --clusters 参数 |
Memory Error | 内存溢出 | 过滤更短 contig,增大 -l |
速查表
# 标准完整流程四步走
cut_up_fasta.py assembly.fa -c 10000 -o 0 --merge_last -b cut.bed > cut.fa
concoct_coverage_table.py cut.bed *.bam > cov.tsv
concoct --composition_file cut.fa --coverage_file cov.tsv -b out/ --threads 16
merge_cutup_clustering.py out/clustering_gt1000.csv > out/merged.csv
extract_fasta_bins.py assembly.fa out/merged.csv --output_path bins/
# 查看最终 bin 数量
ls bins/ | wc -l