最后强制执行某个规则

时间:2021-06-24 15:24:51

标签: workflow snakemake

我的问题与this one非常相似。

我正在编写一条蛇形管道,它做了很多对齐前和对齐后的质量控制。在流程结束时,我对这些 QC 结果运行 multiQC。

基本上,工作流程是:预处理 -> fastqc -> 对齐 -> 对齐后 QC,例如 picard、qualimap 和 preseq -> 峰调用 -> 基序分析 -> multiQC。

只要 multiQC 支持,MultiQC 就应该生成所有这些输出的报告。

强制 multiqc 在最后运行的一种方法是将上述规则的所有输出文件包含在 multiqc 规则的输入指令中,如下所示:

rule a:
  input: "a.input"
  output: "a.output"
  
rule b:
  input: "b.input"
  output: "b.output"
  
rule c:
  input: "b.output"
  output: "c.output"
  
rule multiqc:
  input: "a.output", "c.output"
  output: "multiqc.output"

但是,我想要一种更灵活的方式,不依赖于特定的上游输出文件。这样,当我更改管道(添加或删除任何规则)时,我不需要更改 multiqc 规则的依赖项。 multiqc 的输入应该只是一个包含我希望 multiqc 扫描的所有文件的目录。

在我的情况下,如何强制 multiQC 规则在管道的最后执行?或者有什么通用的方法可以强制snakemake中的某个规则作为最后一个工作运行?可能是通过smakemake上的一些配置,这样在任何情况下,无论我如何更改管道,这条规则都会在最后执行。我不确定这种方法是否存在。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

根据您的评论,我认为您真正想做的是运行灵活配置的 QC 方法数量,然后最后总结它们。摘要应仅在您要运行的所有 QC 方法完成后运行。

您可以手动设置 MultiQC 规则,使其在最后自动执行,而不是强制在最后执行 MultiQC 规则 - 通过要求 QC 方法的输出作为输入。

通过在配置文件中传递 QC 规则的名称,或者作为命令行参数更容易实现,您可以轻松实现灵活配置要运行哪些 QC 规则的目标。

这是一个最小的工作示例供您扩展:

###Snakefile###

rule end:
    input: 'start.out', 
           expand('opt_{qc}.out',qc=config['qc'])

rule start:
    output: 'start.out'

rule qc_a:
    input: 'start.out'
    output: 'opt_a.out'
    #shell: #whatever qc method a needs here

rule qc_b:
    input: 'start.out'
    output: 'opt_b.out'
    #shell: #whatever qc method b needs here

这是您配置要运行的 QC 方法的方式:

snakemake -npr end --config qc=['b']  #run just method b
snakemake -npr end --config qc=['a','b']  #run method a and b
snakemake -npr end --config qc=[]  #run no QC method

答案 1 :(得分:1)

似乎我正在寻找蛇形中的 onsuccess handler

相关问题