如何修改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(' ')} """ }
关键修改说明
- 按样本分组:使用
groupTuple()替代全局collect(),确保每个样本的QC文件独立成组,而非合并所有样本文件。 - 明确文件输入:MultiQC脚本直接指定待分析的QC文件,避免用
.误读工作目录中其他无关文件。 - 独立命名输出:用样本ID作为报告前缀,避免多样本报告覆盖。
- 上游流程要求:需确保所有上游QC流程(如mosdepth、samtools stats)的输出为包含样本ID的tuple格式(例如
tuple val(sample_id), path("*.txt"))。
内容的提问来源于stack exchange,提问作者user3214212
相关产品推荐
相关产品推荐

