以下是我尝试做的一个精简示例:
rule all:
input: "results.txt"
rule find_data:
output: "work_dir/data.txt"
run:
# pretend this retrives IDs
with open(output[0], 'w') as fh:
for i in map(str, range(5)):
print(i, file=fh)
checkpoint download_data:
input: "work_dir/data.txt"
output: directory("work_dir/{sample_id}")
run:
with open(input[0], 'r') as fh:
for l in fh:
l = l.rstrip()
# pretend this downloads data
shell("touch work_dir/{}".format(l))
def aggregate_signatures(wildcards):
checkpoint_output = checkpoints.download_data.get(**wildcards).output[0]
return expand("work_dir/{sample_id}", sample_id=checkpoint_output.sample_id)
rule make_database:
input: aggregate_signatures
output: "results.txt"
shell:
"cat {input} > {output}"
哪个会导致错误
InputFunctionException in line 40 of /Users/ian.fiddes/test_sourmash/sourmash/Snakefile:
WorkflowError: Missing wildcard values for sample_id
Wildcards:
我不确定上面的代码在功能上与snakemake手册的“数据相关的条件执行”部分中的示例有何不同。
这里的想法是从互联网上下载一些未知数量的ID,然后让每个作业使用一个ID的作业,然后下载一些数据,然后执行在聚合之前处理这些数据的中间步骤。
答案 0 :(得分:0)
你很亲密!
应该让snakemake重新评估DAG的规则不是download_data
,而是find_data
。因为找到数据后,您要检查您拥有的数据。因此,只需要做find_data
一个检查点并更改aggregate_signatures
中的相应行:
checkpoint_output = checkpoints.find_data.get(**wildcards).output[0]