一条规则中所有通配符的未确定文件总数

时间:2019-02-17 20:44:45

标签: snakemake

我有一组文件,这些文件将被单独处理以产生多个文件。在运行前确切地知道多少个文件。 (如果重要的话,这是对DNA测序结果进行多路分解。)然后,我有了一个脚本,可以一次获取所有这些文件。

现在我有这样的东西:

checkpoint demultiplex:
    input: "{sample}.fastq"
    output: directory("{sample}")
    shell:
        # in reality the number of output files is not known
        "mkdir -p {output} &&"
        "touch {output}/{wildcards.sample}-1.fastq &&"
        "touch {output}/{wildcards.sample}-2.fastq &&"
        "touch {output}/{wildcards.sample}-3.fastq"

def find_outputs(wildcards) :
    outdir = checkpoints.demultiplex.get(**wildcards)
    return glob.glob("{sample}/{sample}-*.fastq".format_map(wildcards))

rule analysis:
    input: find_outputs
    outputs: "results.txt"
    script: "scripts/do_analysis.R"

这显然是行不通的,因为从未定义{sample}的值(假设它们应为A,B,C,D)。

1 个答案:

答案 0 :(得分:0)

在我写问题时,我想出了这个答案,这似乎行得通。但是,如果您有更清洁的东西,我会很乐意接受!

要使checkpoints.<rule>.get()发挥其魔力,它必须位于作为引用而不是被调用的函数的主体中。另外,此函数需要使用一个参数通配符。

因此,我们创建了一个函数,该函数返回具有所需行为的闭包。通配符的值(在这种情况下为空)将被忽略,从而使我们可以手动指定值。

def find_outputs(sample):
    def f(wildcards):
        checkpoints.demultiplex.get(sample = sample)
        return glob.glob("{sample}/{sample}-*.fastq".format(sample = sample))
    return f

rule analysis:
    input:
        find_outputs("A"),
        find_outputs("B"),
        find_outputs("C"),
        find_outputs("D")
    output: "results.txt"
    script: "script/do_analysis.R"