跳转至

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_lengthk-mer 计算长度4
-l最短 contig 长度(bp)1000
--threads线程数1
--iterationsEM 算法最大迭代次数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 sklearnscikit-learn 未安装conda install scikit-learn
Convergence failed迭代次数不足增加 --iterations
coverage_table has no samplesBAM 路径错误检查 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