【问题标题】:Execute certain rule at the very end在最后执行某些规则
【发布时间】:2020-09-03 13:47:47
【问题描述】:

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

感谢任何帮助!

【问题讨论】:

    标签: workflow snakemake


    【解决方案1】:

    您可以将各个 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}"
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 2018-04-21
        • 1970-01-01
        相关资源
        最近更新 更多