强制某个规则在最后执行
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 是我要找的。
我的问题与
我正在编写一个 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 是我要找的。