最后执行一定的规则
Execute certain rule at the very end
我目前正在写一个 Snakefile,它做了很多 post-比对质量控制(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}"
感谢任何帮助!
您可以将各个 QC 规则生成的文件作为 multiqc
规则的输入。这样,一旦所有这些文件可用,multiqc 就会启动:
samples = ['a', 'b', 'c']
rule collectInsertSizeMetrics:
input:
'{sample}.bam',
output:
'post-alignment-qc/{sample}.insertSizeMetrics.txt' # <- Some file produced by CollectInsertSizeMetrics
shell:
"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', sample=samples),
shell:
"multiqc -f -n {output.output_html} post-alignment-qc 2> {log.err}"
对我来说,这似乎是一个经典的 A-B 问题。您隐藏的假设是,因为 multiqc
在其命令行参数中要求一个目录,所以 Snakemake 规则的输入需要是一个目录。这是错误的。
输入应该是规则能够 运行 所需的所有内容。有文件夹存在,不满足这个要求,因为文件夹可以是空的。这正是您运行遇到的问题。
您真正需要的是由其他命令生成的文件出现在文件夹中。因此,您应该将所需的输入定义为 files。这就是 Snakemake 的方式。停止思考:这条规则需要 运行 最后。从以下方面考虑:这些文件需要存在才能使此规则达到 运行.
我目前正在写一个 Snakefile,它做了很多 post-比对质量控制(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}"
感谢任何帮助!
您可以将各个 QC 规则生成的文件作为 multiqc
规则的输入。这样,一旦所有这些文件可用,multiqc 就会启动:
samples = ['a', 'b', 'c']
rule collectInsertSizeMetrics:
input:
'{sample}.bam',
output:
'post-alignment-qc/{sample}.insertSizeMetrics.txt' # <- Some file produced by CollectInsertSizeMetrics
shell:
"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', sample=samples),
shell:
"multiqc -f -n {output.output_html} post-alignment-qc 2> {log.err}"
对我来说,这似乎是一个经典的 A-B 问题。您隐藏的假设是,因为 multiqc
在其命令行参数中要求一个目录,所以 Snakemake 规则的输入需要是一个目录。这是错误的。
输入应该是规则能够 运行 所需的所有内容。有文件夹存在,不满足这个要求,因为文件夹可以是空的。这正是您运行遇到的问题。
您真正需要的是由其他命令生成的文件出现在文件夹中。因此,您应该将所需的输入定义为 files。这就是 Snakemake 的方式。停止思考:这条规则需要 运行 最后。从以下方面考虑:这些文件需要存在才能使此规则达到 运行.