在最后执行某些规则

时间:2020-09-03 13:47:47

标签: workflow snakemake

我目前正在编写一个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}"

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以在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', sample= samples),
        ...
    output:
        'post-alignment-qc/multiQC/multiqc-report.html',
    shell:
        r"""
        multiqc -f -n {output.output_html} post-alignment-qc 2> {log.err}
        """

答案 1 :(得分:1)

对我来说,这似乎是一个经典的 A-B 问题。您隐藏的假设是,因为 multiqc 在其命令行参数中要求提供一个目录,Snakemake 规则的输入需要是一个目录。这是错误的。

输入应该是规则能够运行所需的所有东西。有一个文件夹存在,满足这个要求,因为文件夹可以是空的。这正是您遇到的问题。

您真正需要的是由其他命令生成的文件存在于文件夹中。因此,您应该将所需的输入定义为文件。这就是 Snakemake 的方式。不要再想:这条规则需要最后运行。从以下方面考虑:这些文件需要存在才能运行此规则。