我的问题与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上的一些配置,这样在任何情况下,无论我如何更改管道,这条规则都会在最后执行。我不确定这种方法是否存在。
非常感谢您的帮助!
答案 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。