在Snakemake中重用规则

时间:2016-12-06 16:17:10

标签: python-3.x snakemake

有没有办法在snakemake中重用规则只更改params

例如:

rule job1:
    ...
    params:
        reference = "path/to/ref1"
    ...

rule job2:
    input: rules.job1.output
    ...
    params:
        reference = "path/to/ref2"

job1job2规则正在执行相同的操作,但我需要连续调用它们,并且必须修改reference参数。它为非常类似的任务生成了许多代码。

我尝试为此步骤创建子工作流,主Snakefile更具可读性。但是,子工作流程代码仍在重复。

有任何想法或建议吗?我错过了什么吗?

修改
更具体地说,job2必须在job1之后执行,使用后者的输出。

2 个答案:

答案 0 :(得分:3)

如果规则相同,则可以在命名输出文件时使用通配符。这样,相同的规则将执行两次:

references = ["ref1", "ref2"]

rule all:
  input: expand("my_output_{ref}", ref=references)

rule job:
    input: "my_input"
    output: "my_output_{ref}"
    params: ref = "path/to/{ref}"
    shell: "... {params.ref} {output}"

希望这会有所帮助,如果没有,你可以提出更具体的问题吗?

修改

好的,可以通过使用python函数为规则定义自定义输入。也许你可以走向这个方向。请参阅此工作示例:

references = ["ref1", "ref2"]

rule all:
  input: expand("my_output_{ref}", ref=references)


def rule_input(wildcards):
    if (wildcards.ref == "ref1"):
        input = "my_first_input"
    elif (wildcards.ref == "ref2"):
        input = "my_output_ref1"
    return(input)

rule job:
    input: rule_input
    output: "my_output_{ref}"
    params: ref = "path/to/{ref}"
    shell: "echo input: {input} ; echo output: {output} ; touch {output}"

答案 1 :(得分:2)

Snakemake不支持规则之间的继承。因此,如果您不能使用通配符,则可以选择使用委托。您将两个规则的常量部分预定义为变量,然后从规则体中引用这些部分。 另一种选择可能是输入/参数函数(参见文档和教程),只有一个规则定义。这样,你可以拥有完全不同的输入文件,遵循一些基于例如一张通配符。