Nextflow中如何将ALIGNMENT流程的BAM文件传递给MKDUP流程?
解决Nextflow中MKDUP流程${sample_id}空值错误问题
问题核心在于ALIGNMENT流程的输出未传递sample_id,导致MKDUP流程无法获取该值,进而触发空值错误。以下是具体修复方案:
1. 修改ALIGNMENT流程的输出,绑定sample_id
原ALIGNMENT仅输出BAM文件路径,未将样本ID与文件关联。需将输出改为包含sample_id的tuple,确保下游流程能同时拿到样本标识和对应文件:
process ALIGNMENT { debug true publishDir "${params.outDir}/${sample_id}/BAM_Files", mode:"copy" input: tuple val(sample_id), path(reads) // 关键修改:将sample_id与BAM文件打包成tuple输出 output: tuple val(sample_id), path("${sample_id}_alignSort.bam"), emit: alignSortBam path("${sample_id}_alignSort.bam.bai") script: """ echo ${reads[0]} bwa mem -M -t 70 \ ${params.genome} ${reads[0]} ${reads[1]} \ -R "@RG\tID:${sample_id}\tSM:${sample_id}\tPL:MGI\tPU:Lane1\tLB:MGI" | samtools view -S -b | \ samtools sort -o ${sample_id}_alignSort.bam samtools index -@ 7 ${sample_id}_alignSort.bam ${sample_id}_alignSort.bam.bai echo The path of sample_alignSort.bam is: ${sample_id}_alignSort.bam """ }
2. 确认MKDUP流程的输入逻辑
MKDUP的输入定义tuple val(sample_id), path(alignSortBam)无需修改,只要ALIGNMENT输出正确的tuple,就能正常获取sample_id。
3. 验证workflow调用
原workflow中的MKDUP(ALIGNMENT.out.alignSortBam)现在会接收包含sample_id和BAM文件的tuple,流程可正常执行,${sample_id}不再为空。
完整修改后的脚本(关键部分已标记)
params.rawFiles = "/mnt/NGS1/WES_Analysis/test/*_{1,2}.fq.gz" params.genome = "/mnt/NGS1/WES_Analysis/Database/resources_broad_hg38_v0_Homo_sapiens_assembly38.fasta" params.outDir = "/mnt/NGS1/WES_Analysis/test/Output" log.info """\ genome: ${params.genome} rawFiles: ${params.rawFiles} Output Dir: ${params.outDir} """ .stripIndent() process FASTP { debug true publishDir "${params.outDir}/${sample_id}/Quality", mode:"copy" input: tuple val(sample_id), path(reads) output: tuple val(sample_id), path("${sample_id}_trim_*.fq.gz"), emit: reads path("${sample_id}.fastp.json"), emit: json path("${sample_id}.fastp.html"), emit: html script: """ echo ${reads[0]} fastp --in1 ${reads[0]} --in2 ${reads[1]} \ -q 20 -u 20 -l 40 --detect_adapter_for_pe \ --out1 ${sample_id}_trim_1.fq.gz --out2 ${sample_id}_trim_2.fq.gz \ -w 16 --json ${sample_id}.fastp.json --html ${sample_id}.fastp.html """ } process ALIGNMENT { debug true publishDir "${params.outDir}/${sample_id}/BAM_Files", mode:"copy" input: tuple val(sample_id), path(reads) // 关键修改:输出tuple包含sample_id和BAM文件 output: tuple val(sample_id), path("${sample_id}_alignSort.bam"), emit: alignSortBam path("${sample_id}_alignSort.bam.bai") script: """ echo ${reads[0]} bwa mem -M -t 70 \ ${params.genome} ${reads[0]} ${reads[1]} \ -R "@RG\tID:${sample_id}\tSM:${sample_id}\tPL:MGI\tPU:Lane1\tLB:MGI" | samtools view -S -b | \ samtools sort -o ${sample_id}_alignSort.bam samtools index -@ 7 ${sample_id}_alignSort.bam ${sample_id}_alignSort.bam.bai echo The path of sample_alignSort.bam is: ${sample_id}_alignSort.bam """ } process MKDUP { debug true publishDir "${params.outDir}/${sample_id}/BAM_Files", mode:"copy" input: tuple val(sample_id), path(alignSortBam) output: path("${sample_id}_alignSortMkDup.bam") script: """ echo mkdup :- ${alignSortBam} gatk MarkDuplicatesSpark -OBI true \ -I ${alignSortBam} \ -O ${sample_id}_alignSortMkDup.bam \ -M ${sample_id}_metrics.txt """ } workflow{ read_pairs_ch = Channel.fromFilePairs( params.rawFiles ) FASTP( read_pairs_ch ) ALIGNMENT(FASTP.out.reads) MKDUP(ALIGNMENT.out.alignSortBam) }
原理说明
Nextflow流程间的数据传递依赖Channel,只有上游流程输出包含元数据(如sample_id)和文件的tuple时,下游流程才能同时获取两类信息。原ALIGNMENT仅输出文件路径,丢失了sample_id,导致MKDUP流程中${sample_id}变量无值。
内容的提问来源于stack exchange,提问作者Nikhil Panchal
相关产品推荐
相关产品推荐

