我有一组文件,这些文件将被单独处理以产生多个文件。在运行前确切地知道多少个文件。 (如果重要的话,这是对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)。
答案 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"