如何解决在最后执行某些规则
我目前正在编写一个Snakefile,该文件执行大量的对齐后质量控制(CollectInsertSizeMetics,CollectAlignmentSummaryMetrics,CollectGcBiasMetrics
,...)。
在Snakefile的最后,我正在运行multiQC来将所有指标合并到一个html报告中。
我知道,如果我将规则A的输出用作规则B的输入,则规则B仅在规则A完成后才会执行。
我的问题是multiQC的输入是一个目录,该目录从一开始就存在。在此目录中,multiQC将搜索某些文件,然后创建报告。
如果我当前正在执行我的Snakemake文件,则将在执行所有质量控制之前执行multiQC(例如,fastqc
需要花费一些时间),因此最终报告中将丢失这些内容。
所以我的问题是,如果有一个选项,它指定最后执行某个规则。
我知道我可以使用--wait-for-files
等待某个fastqc
报告,但这似乎很不灵活。
当前的最后一条规则如下:
rule multiQC:
input:
input_dir = "post-alignment-qc"
output:
output_html="post-alignment-qc/multiQC/mutliqc-report.html"
log:
err='post-alignment-qc/logs/fastQC/multiqc_stderr.err'
benchmark:
"post-alignment-qc/benchmark/multiQC/multiqc.tsv"
shell:
"multiqc -f -n {output.output_html} {input.input_dir} 2> {log.err}"
感谢您的帮助!
解决方法
您可以在multiqc
规则的输入中输入由各个QC规则生成的文件。这样,一旦所有这些文件可用,multiqc将启动。例如:
samples = ['a','b','c']
rule collectInsertSizeMetrics:
input:
'{sample}.bam',output:
'post-alignment-qc/{sample}.insertSizeMetrics.txt' # <- Some file produced by CollectInsertSizeMetrics
shell:
r"""
CollectInsertSizeMetics {input} > {output}
"""
rule CollectAlignmentSummaryMetrics:
...
output:
'post-alignment-qc/{sample}.CollectAlignmentSummaryMetrics.txt'
...
rule multiqc:
input:
expand('post-alignment-qc/{sample}.insertSizeMetrics.txt',sample= samples),expand('post-alignment-qc/{sample}.CollectAlignmentSummaryMetrics.txt',...
output:
'post-alignment-qc/multiQC/multiqc-report.html',shell:
r"""
multiqc -f -n {output.output_html} post-alignment-qc 2> {log.err}
"""
,
对我来说,这似乎是一个经典的 A-B 问题。您隐藏的假设是,因为 multiqc
在其命令行参数中要求提供一个目录,Snakemake 规则的输入需要是一个目录。这是错误的。
输入应该是规则能够运行所需的所有东西。有一个文件夹存在,不满足这个要求,因为文件夹可以是空的。这正是您遇到的问题。
您真正需要的是由其他命令生成的文件存在于文件夹中。因此,您应该将所需的输入定义为文件。这就是 Snakemake 的方式。不要再想:这条规则需要最后运行。从以下方面考虑:这些文件需要存在才能运行此规则。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。