使用Combine和Map时Nextflow流程无输出及样本ID捕获问题
解决方法
先搞定通道无输出的问题
你原代码里的核心问题有两个:
- 通配符和实际文件名不匹配:样本名是下划线分隔(比如
MM_sample1_tumor_R1.fastq.gz),但你写的通配符用了-,根本抓不到文件,导致tumorSamples和normalSamples通道全是空的,后续自然没输出。 - 样本配对逻辑错了:用
combine会把所有肿瘤和正常样本做笛卡尔积乱配对,应该用join按样本ID精准配对。
再捕获sampleid
可以通过fromFilePairs的正则分组,从文件名里提取出MM_sample1这类样本标识。
修正后的完整代码
process align { debug true input: tuple val(sampleid), path(tumorSamples), path(normalSamples) output: stdout script: """ echo "we are all good ${tumorSamples} ${normalSamples} ${sampleid} \\n" """ } workflow { // 用正确通配符匹配文件,正则捕获样本核心标识 tumorSamples = Channel.fromFilePairs( '/sc/arion/projects/test_input_data/MM_*_tumor_R{1,2}.fastq.gz', by: /MM_(\w+)_tumor/ ).map { sample_key, tumor_files -> def sampleid = "MM_${sample_key}" tuple(sampleid, tumor_files) } normalSamples = Channel.fromFilePairs( '/sc/arion/projects/test_input_data/MM_*_normal_R{1,2}.fastq.gz', by: /MM_(\w+)_normal/ ).map { sample_key, normal_files -> def sampleid = "MM_${sample_key}" tuple(sampleid, normal_files) } // 按sampleid精准配对肿瘤-正常样本 pairedSamples = tumorSamples.join(normalSamples) pairedSamples.view() // 现在能看到配对后的样本数据了 align(pairedSamples).view() }
关键修正点
- 通配符匹配:把原通配符里的
-换成_,用R{1,2}匹配双端测序文件,确保能正确抓取到样本。 - 样本配对:用
join替代combine,保证同一个sampleid的肿瘤和正常文件配对,避免无关样本组合。 - sampleid提取:通过
fromFilePairs的by参数定义正则,捕获sample1这类核心标识,再拼接成完整的MM_sample1作为sampleid。 - 通道结构:确保传给
align流程的tuple结构和流程输入定义一致(sampleid+ 肿瘤文件 + 正常文件),原代码的map操作丢失了sampleid,导致流程无法接收正确参数。
内容的提问来源于stack exchange,提问作者Death Metal
相关产品推荐
相关产品推荐

