强制某个规则在最后执行

Force a certain rule to execute at the end

我的问题与非常相似。

我正在编写一个 snakemake 管道,它做了很多预对齐和 post 对齐质量控制。在管道的末端,我 运行 对这些 QC 结果进行 multiQC。

基本上,工作流程是:预处理 -> fastqc -> 比对 -> post-比对 QC,如 picard、qualimap 和 preseq -> peak calling -> motif analysis -> 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 的一些配置,使得在任何情况下,无论我如何更改管道,这条规则都会在最后执行。不知道有没有这种方法

非常感谢您的帮助!

从你的评论中我了解到你真正想做的是运行灵活配置一些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

看来 onsuccess handler in snakemake 是我要找的。