最后执行一定的规则

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 的方式。停止思考:这条规则需要 运行 最后。从以下方面考虑:这些文件需要存在才能使此规则达到 运行.