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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:20:37