Nextflow流程中如何让FASTQC_check在FASTQC_1完成后运行?
解决Nextflow流程依赖与收尾任务问题
问题核心
你需要让FASTQC_check在FASTQC_1执行完毕后再启动,但二者不需要传递业务数据;同时所有任务结束后打印指定文件内容。当前代码的问题在于强制给FASTQC_check传入了FASTQC_1.out,不符合无业务关联的需求,而且收尾的判断逻辑也不对。
解决方案
方法1:使用Nextflow的after关键字(推荐,Nextflow 22.04+版本支持)
after可以直接指定流程的执行顺序,不需要传递任何数据,代码更简洁:
workflow { read_pairs_ch = Channel.fromFilePairs(params.reads) fastqc( read_pairs_ch ) trimmomatic( read_pairs_ch ) FASTQC_1( trimmomatic.out ) // 指定FASTQC_check在FASTQC_1完成后执行,无需传入输入 FASTQC_check() FASTQC_check.after FASTQC_1 // 所有流程完成后执行打印操作 workflow.onComplete { Channel .fromPath('/home/dungnguyen/genepanel/bin/data3.txt') .splitText() .view { line -> println line } } }
方法2:利用通道collect()等待流程完成(兼容旧版本)
如果你的Nextflow版本较低,不支持after,可以通过收集FASTQC_1的输出通道来等待其完成,再触发FASTQC_check:
workflow { read_pairs_ch = Channel.fromFilePairs(params.reads) fastqc( read_pairs_ch ) trimmomatic( read_pairs_ch ) def fastqc1_done = FASTQC_1( trimmomatic.out ).out.collect() // 等待fastqc1_done通道完成后,启动FASTQC_check(无需业务输入) fastqc1_done.subscribe { FASTQC_check() } // 所有流程完成后执行打印操作 workflow.onComplete { Channel .fromPath('/home/dungnguyen/genepanel/bin/data3.txt') .splitText() .view { line -> println line } } }
关键说明
- 移除
FASTQC_check(FASTQC_1.out)的输入传递,因为二者无业务关联,不需要输入数据(前提是FASTQC_check本身的流程定义不需要输入,或者有其他独立的输入来源)。 - 使用
workflow.onComplete确保打印操作在所有流程任务都完成后才执行,替代原来错误的if (FASTQC_check.out)判断(通道不能直接用if条件判断)。 - 两种方法都能实现
FASTQC_1完成后再启动FASTQC_check的需求,根据你的Nextflow版本选择即可。
内容的提问来源于stack exchange,提问作者Nguyễn Tiến Dũng
相关产品推荐
相关产品推荐

