You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Nextflow工作流实现单样本MultiQC报告生成

为每个样本单独生成MultiQC报告的Nextflow工作流修改方案求助

需求概述

原Nextflow工作流为输入列表中所有样本生成统一MultiQC报告,现需调整为每个样本单独生成专属MultiQC报告,输入文件支持BAM/CRAM格式。

输入配置文件(input.yaml)

samples:
-
 biosample_id: NA12878-chr14-AKT1
 aln: NA12878-chr14-AKT1.bam
-
 biosample_id: NA12878-chr14-AKT2
 aln: NA12878-chr14-AKT2.bam

当前工作流相关代码

main.nf 中MultiQC模块调用逻辑

Channel
        .empty()
        .mix( mosdepth_bam.out.dists )
        .mix( mosdepth_bam.out.summary )
        .mix( mosdepth_cram.out.dists )
        .mix( mosdepth_cram.out.summary )
        .mix( mosdepth_datamash.out.coverage )
        .mix( verifybamid2_bam.out.freemix )
        .mix( verifybamid2_cram.out.freemix )
        .mix( verifybamid2_bam.out.ancestry )
        .mix( verifybamid2_cram.out.ancestry )
        .mix( samtools_stats_bam.out )
        .mix( samtools_stats_cram.out )
        .map { sample, files -> files }
        .collect()
        .set { log_files }

    multiqc( log_files )

modules/multiqc/main.nf 原代码

process multiqc {

input:
path 'data/*'

output:
path "multiqc_report.html", emit: report
path "multiqc_data", emit: data
path "multiqc_data/multiqc_data.json", emit: json_data

"""
multiqc \\
    --data-format json \\
    --enable-npm-plugin \\
    .
"""
}

尝试的修改方案

修改后的main.nf

Channel
    samples.map { it.biosample_id }
    .set { sample_ids }

multiqc( sample_ids, samtools_stats_bam.out.stats.mix( samtools_stats_cram.out.stats, mosdepth_bam.out.dists, mosdepth_bam.out.summary, mosdepth_cram.out.dists, mosdepth_cram.out.summary, mosdepth_datamash.out.coverage, verifybamid2_bam.out.freemix, verifybamid2_cram.out.freemix, verifybamid2_bam.out.ancestry, verifybamid2_cram.out.ancestry, ).collect() )

修改后的modules/multiqc/main.nf

process multiqc {

    tag { sample }

    input:
    tuple val(sample), path('*')
  output:
   
  tuple val(sample), path("${sample}/multiqc_report.html"), emit: report
  tuple val(sample), path("${sample}/multiqc_data"), emit: data
  tuple val(sample), path("${sample}/multiqc_data/multiqc_data.json"), emit: json_data

  """
  multiqc \\
    --data-format json \\
    --enable-npm-plugin \\
    -o ${sample} \\
    .
  """
}

正确修改方案

核心思路

确保上游所有QC流程输出携带样本ID,按样本分组收集QC文件,再传递给MultiQC流程生成单样本报告。

修正后的main.nf MultiQC逻辑

// 整合所有上游QC输出通道(每个通道元素需为 (样本ID, 文件) 格式)
def all_qc_channels = [
    mosdepth_bam.out.dists,
    mosdepth_bam.out.summary,
    mosdepth_cram.out.dists,
    mosdepth_cram.out.summary,
    mosdepth_datamash.out.coverage,
    verifybamid2_bam.out.freemix,
    verifybamid2_cram.out.freemix,
    verifybamid2_bam.out.ancestry,
    verifybamid2_cram.out.ancestry,
    samtools_stats_bam.out,
    samtools_stats_cram.out
]

Channel.empty()
    .mix(all_qc_channels)
    .groupTuple()  // 按样本ID分组,得到 (样本ID, [该样本所有QC文件])
    .set { per_sample_qc_files }

// 为每个样本单独调用MultiQC
multiqc( per_sample_qc_files )

修正后的modules/multiqc/main.nf

process multiqc {
    tag { sample_id }
    publishDir "results/multiqc", mode: 'copy'  // 统一输出到结果目录

    input:
    tuple val(sample_id), path(qc_files)

    output:
    tuple val(sample_id), path("${sample_id}_multiqc_report.html"), emit: report
    tuple val(sample_id), path("${sample_id}_multiqc_data"), emit: data
    tuple val(sample_id), path("${sample_id}_multiqc_data/multiqc_data.json"), emit: json_data

    script:
    """
    multiqc \\
        --data-format json \\
        --enable-npm-plugin \\
        --title "${sample_id} QC Report" \\
        --outdir . \\
        ${qc_files.join(' ')}
    """
}

关键修改说明

  1. 按样本分组:使用groupTuple()替代全局collect(),确保每个样本的QC文件独立成组,而非合并所有样本文件。
  2. 明确文件输入:MultiQC脚本直接指定待分析的QC文件,避免用.误读工作目录中其他无关文件。
  3. 独立命名输出:用样本ID作为报告前缀,避免多样本报告覆盖。
  4. 上游流程要求:需确保所有上游QC流程(如mosdepth、samtools stats)的输出为包含样本ID的tuple格式(例如tuple val(sample_id), path("*.txt"))。

内容的提问来源于stack exchange,提问作者user3214212

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:55:53