Snakemake:制定规则等待先前规则的完全执行

Snakemake: Make rule wait for full excecution of previous rule

我的问题:

我有一个规则,将给定的输入分成碎片并将它们保存到给定的目录中。例如。它们以以下格式保存在该目录中:shard_output_folder/shard{1-X}.data。 假设以下规则应该占用所有这些碎片并“合并”它们,最终生成一个输出文件。在这里我不知道如何确保 snakemake 不会执行 merge_rule 直到上一步生成所有碎片。我的脚本在生成所有必要的分片之前启动合并步骤:(

希望你们中的一些人能够帮助我! :)

示意图:

rule split_data_in_shards_rule:
    input:
        "some.data"
    output:
        directory("shard_output_folder")
    shell:
        python script.py {input} > {output}

rule merge_output_of_previous_rule:
    input:
        directory("shard_output_folder")
    output:
        "merged.data"
    shell:
        merge.py "shard_output_folder" > "merged.data"

Snakemake根据规则的输入输出来决定规则的执行顺序。如果你定义一个目录而不是文件作为规则的输出,它确实会让 snakemake 感到困惑。 文档 (https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#directories-as-outputs) 指出:

Always consider if you can’t formulate your workflow using normal files before resorting to using directory()

确保第一条规则在执行第二条规则之前运行到最后的一种方法是使用 touch() 函数 (https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#flag-files):

rule split_data_in_shards_rule:
    input:
        "some.data"
    output:
        directory("shard_output_folder"),
        touch("shard_output_folder/done.txt")
    shell:
        """
        python script.py {input} > {output}
        """

rule merge_output_of_previous_rule:
    input:
        directory("shard_output_folder"),
        "shard_output_folder/done.txt"
    output:
        "merged.data"
    shell:
        """
        merge.py "shard_output_folder" > "merged.data"
        """

注意:在您的 shell 命令两边添加了三重引号。

另一种方法是使用 dynamic() 个文件 (https://snakemake.readthedocs.io/en/v6.0.0/snakefiles/rules.html#dynamic-files)