Nextflow tuple输入不匹配问题:如何同时获取sample_id与BAM路径?
问题
使用Nextflow构建多流程管线时,想把前一流程输出的样本ID和排序后BAM文件作为gatk_markduplicates流程的输入,但使用tuple val(sample_id), path(x)作为输入时触发错误:
WARN: Input tuple does not match input set cardinality declared by process `gatk_markduplicates` -- offending value: /Users/username/.../tiny_t_L007.sorted.bam ERROR ~ Error executing process > 'gatk_markduplicates (1)' Caused by: Not a valid path value type: org.codehaus.groovy.runtime.NullObject (null)
单独用val(sample_id)或path(x)时流程可正常运行,但无法同时获取样本ID和BAM文件路径。相关代码如下:
main.nf
params.outdir_fastp="./trimmed" params.outdir_index="./bwa_index" params.rawFiles = "/Users/username/Downloads/tiny/tumor/*_R{1,2}_xxx.fastq.gz" params.outdir_bwa_mem="./bwamem" params.hg38genome ="/Users/username/Downloads/NM.fasta" params.gatk_mark_duplicates="./gatk_mark_duplicates" include { FASTP} from './fastp_process.nf' include {bwa_index} from './index_process.nf' include { align_bwa_mem} from './bwamem_process.nf' include { gatk_markduplicates} from './gatk_markduplicates_process.nf' workflow { read_pairs_ch = Channel.fromFilePairs( params.rawFiles ) FASTP(read_pairs_ch) bwa_index(params.hg38genome) align_bwa_mem(FASTP.out.reads,bwa_index.out) gatk_markduplicates(align_bwa_mem.out.sorted_bams) }
align_bwa_mem 流程代码
process align_bwa_mem { tag {sample_id} debug true publishDir params.outdir_bwa_mem , mode: "copy" input : tuple val(sample_id), path(reads) tuple val(idxbase), path("bwa_index/*") output: path("${sample_id}.sorted.bam"), emit : sorted_bams script: def (fq1,fq2)=reads rg="'@RG\tID:${sample_id}\tSM:${sample_id}\tPL:illumina'" """ bwa mem -M -R $rg -v 1 "bwa_index/${idxbase}" $fq1 $fq2 | samtools sort -O bam -T - > ${sample_id}.sorted.bam > ${sample_id}.bam """ }
gatk_markduplicates 流程代码
process gatk_markduplicates { tag {sample_id} debug true publishDir params.gatk_mark_duplicates , mode:"copy" input: tuple val(sample_id), path(x) // works fine with only `val(sample_id)` output: stdout script: """ echo "$x\n" echo "$sample_id\n" """ }
原因分析
核心问题出在align_bwa_mem的输出定义:当前仅输出单个BAM文件路径,未将sample_id与BAM路径打包为tuple。下游gatk_markduplicates期望接收包含两个元素的tuple(样本ID+文件路径),但实际收到的是单个路径值,导致tuple匹配失败,sample_id被解析为null,触发错误。
另外,align_bwa_mem脚本中的> ${sample_id}.bam是冗余重定向,会覆盖前面生成的sorted.bam文件,需要删除。
解决方案
- 修改
align_bwa_mem的输出,将sample_id与BAM路径打包为tuple发射:
output: tuple val(sample_id), path("${sample_id}.sorted.bam"), emit : sorted_bams
- 删除脚本中的冗余重定向,修正后的命令行:
bwa mem -M -R $rg -v 1 "bwa_index/${idxbase}" $fq1 $fq2 | samtools sort -O bam -T - > ${sample_id}.sorted.bam
修改后,align_bwa_mem.out.sorted_bams会输出包含样本ID和对应BAM路径的tuple,下游gatk_markduplicates的tuple val(sample_id), path(x)输入即可正确匹配,同时获取到样本ID和文件路径。
内容的提问来源于stack exchange,提问作者Death Metal
相关产品推荐
相关产品推荐

