是否可以通过Python Snakemake中的函数返回规则?

时间:2019-08-09 19:05:40

标签: snakemake

我正在构建一个包含三个规则的4次迭代的管道。除了可以将三个规则复制并粘贴4次并在每个规则中稍稍更改变量之外,还可以使用一个规则函数来接收需要更改的变量并返回规则吗?

我在Internet上找不到相关文档。

rule A:
    input: 
        OUTPUT_DIR + "/XR/{pop}.pull"
    output: 
        OUTPUT_DIR + "/XR/{pop}.nemo"
    shell:"./scriptA {input} {output}"

rule B:
    input: 
        OUTPUT_DIR + "/XR/{pop}.pull",
        OUTPUT_DIR + "/XR/{pop}.nemo",
    output: 
        OUTPUT_DIR + "/XR/{pop}.freqs"
    shell:"./scriptB {input[0]} {input[1]} {output}"

rule C:
    input: 
        OUTPUT_DIR + "/XR/{pop}.pull",
        OUTPUT_DIR + "/XR/{pop}.freqs",
    output: 
        OUTPUT_DIR + "/XR/{pop}.impute"
    shell:"./scriptC {input[0]} {input[1]} {output}"

上面的代码是一个迭代。如果我想进行第二次迭代,并做一些细微的更改(例如,仅将XR文件夹更改为XRQ文件夹怎么办?

1 个答案:

答案 0 :(得分:1)

如果模式中唯一需要的更改是文件夹的名称,则可以将其设为通配符:这是Snakemake中最明显和最受欢迎的方式。例如:

rule all:
    input: expand(OUTPUT_DIR + "/{folder}/{pop}.impute", folder=["XR", "XRQ"], pop=["pop1", "pop2", "pop3", "pop4"])

rule A:
    input: 
        OUTPUT_DIR + "/{folder}/{pop}.pull"
    output: 
        OUTPUT_DIR + "/{folder}/{pop}.nemo"
    shell:"./scriptA {input} {output}"

rule B:
    input: 
        OUTPUT_DIR + "/{folder}/{pop}.pull",
        OUTPUT_DIR + "/{folder}/{pop}.nemo",
    output: 
        OUTPUT_DIR + "/{folder}/{pop}.freqs"
    shell:"./scriptB {input[0]} {input[1]} {output}"

rule C:
    input: 
        OUTPUT_DIR + "/{folder}/{pop}.pull",
        OUTPUT_DIR + "/{folder}/{pop}.freqs",
    output: 
        OUTPUT_DIR + "/{folder}/{pop}.impute"
    shell:"./scriptC {input[0]} {input[1]} {output}"

无论如何,如果差异更加复杂,请提供更多详细信息并向我们显示根规则:在您提供的代码中,没有哪个规则可以解决所有通配符。