使用snakemake检查点+聚合从互联网获取未知数量的ID

时间:2019-09-10 16:23:08

标签: python-3.x snakemake

以下是我尝试做的一个精简示例:

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的作业,然后下载一些数据,然后执行在聚合之前处理这些数据的中间步骤。

1 个答案:

答案 0 :(得分:0)

你很亲密!

应该让snakemake重新评估DAG的规则不是download_data,而是find_data。因为找到数据后,您要检查您拥有的数据。因此,只需要做find_data一个检查点并更改aggregate_signatures中的相应行:

checkpoint_output = checkpoints.find_data.get(**wildcards).output[0]