【问题标题】:How to target intermediary Snakemake rule that contains wildcards如何定位包含通配符的中间 Snakemake 规则
【发布时间】:2021-07-13 21:58:22
【问题描述】:

我有一个工作流程,对于这个问题非常简化,如下所示:

rule all:
    input: multiext("final",".a",".b",".c",".d")

rule final_cheap:
    input: "intermediary.{ext}"
    output: "final.{ext}"
    #dummy for cheap but complicated operation
    shell: "cp {input} {output}"

rule intermediary_cheap:
    input: "start.{ext}"
    output: "intermediary.{ext}"
    #dummy for cheap complicated operation
    shell: "cp {input} {output}" 

rule start_expensive:
    output: "start.{ext}"
    #dummy for very expensive operation
    shell: "touch {output}" 

第一步非常昂贵,接下来是两个复杂的步骤。

在我使用snakemake -c1 运行此工作流一次后,我想重新运行该工作流,但只是从中间规则开始。如何使用命令行标志实现此目标?

snakemake intermediary_cheap all 不起作用,因为 intermediary_cheap 包含通配符,即使包含 all 确实显示了所需通配符的值。

是否有命令行标志告诉snakemake 运行规则并忽略来自规则intermediary_cheap 的所有输出,例如snakemake all --forcerule=intermediary_cheap? (我发明了 --forcerule 标志,据我所知它并不存在。

我现在使用的解决方法是手动删除规则intermediary_cheap 的输出,然后使用--force 强制执行规则,然后运行rule all,这会注意到一些上游输入已更改。但这需要知道生成的精确文件名,而只知道规则会更好,因为它处于更高的抽象级别。

【问题讨论】:

    标签: snakemake


    【解决方案1】:

    我以前没用过,但我想你想要:

    snakemake -c 1 --forcerun intermediary_cheap
    
      --forcerun [TARGET [TARGET ...]], -R [TARGET [TARGET ...]]
                            Force the re-execution or creation of the given rules
                            or files. Use this option if you changed a rule and
                            want to have all its output in your workflow updated.
                            (default: None)
    

    【讨论】:

    • 你是明星!这就是解决方案。如果您希望生成所有输出,只需按照您的建议进行操作。如果你只想生成final.a 说,在顶部添加:snakemake -c1 --forcerun intermediary_cheap -- final.a -- 是必要的,因为我们只是想要这样,规则 intermediary_cheap 被强制。如果您想包含它,您可以编辑您的答案。谢谢!
    猜你喜欢
    • 2022-12-13
    • 2020-12-15
    • 1970-01-01
    • 2022-08-23
    • 2023-03-13
    • 2022-06-28
    • 1970-01-01
    • 2021-06-11
    • 2012-05-15
    相关资源
    最近更新 更多