我该如何使用通配符多次运行我的snakemake规则的子集?

时间:2019-07-14 14:42:28

标签: snakemake

我有一个蛇形管道,其中输入文件分为两组-输入我想通过整个管道(真实输入)和仅应通过前几个规则(控制输入)通过的输入。我该如何通过所有规则传递真实输入,而仅通过前几个规则传递控制输入?

最明显的解决方案是委派,即在第一组(真)上运行所有规则,然后复制粘贴要在第二组(控件)上运行的规则,并分别为它们提供第二组输入

但是,我认为这不是代码可维护性的好习惯,我更希望以某种方式使用通配符的解决方案。

下面的代码使用更少的规则简化了问题:


INPUT = [NAME1, NAME2, NAME3, CONTROL]
LABELS = [A, B, C, D]

rule all:
    input:
        expand("output/{input}_results.txt",
            input = INPUT)

rule split_data:
    '''
    Read the true input and control then split them
    '''
    input:
        "data/{input}.txt"
    output:
        "data/{input}/{label}.txt", label = LABELS)
    script:
        "scripts/split_data.py"

rule run_true_data:
    '''
    Read only the true split and produce results.
    '''
    input:
        "data/{{input}}/{label}.txt", label = LABELS)
    output:
         "output/{input}_results.txt"
    script:
        "scripts/produce_results.py"

在上述理想版本中,输入通配符应仅针对 的split_data产生[NAME1,NAME2,NAME3,CONTROL]。同时run_true_data和所有人都应仅接收[NAME1,NAME2,NAME3]。

此外,应根据通配符(例如,带有lambda)生成标签,但这目前并不重要,因此,为了避免混淆,我没有将其包括在内。

1 个答案:

答案 0 :(得分:0)

也许您需要添加更多有关该问题确切性质的详细信息。如果第二条规则只需要一组不同的输入,为什么不为此步骤添加另一个通配符,将输入限制为仅必需的条目。类似于以下脚本

INPUT = ["NAME1", "NAME2", "NAME3", "CONTROL"]
TRUE_INPUT = ["NAME1", "NAME2", "NAME3"]
LABELS = ["A", "B", "C", "D"]

rule all:
    input:
        expand("data/{input}/{label}.txt",
            input = INPUT, label = LABELS),
        expand("output/{true_input}_results.txt", true_input = TRUE_INPUT)

rule split_data:
    '''
    Read the true input and control then split them
    '''
    input:
        "data/{input}.txt"
    output:
        "data/{input}/{label}.txt"
    script:
        "scripts/split_data.py"

rule run_true_data:
    '''
    Read only the true split and produce results.
    '''
    input:
        lambda wildcards: ["data/{}/{}.txt".format(wildcards.true_input, label) for label in LABELS]
    output:
         "output/{true_input}_results.txt"
    script:
        "scripts/produce_results.py"

通过这种方式,您应该能够控制规则run_true_data的标签和输入