为snakemake规则生成参数化数量的输出文件

时间:2017-01-12 17:49:45

标签: snakemake

我的工作流程需要在两个不同的群集上执行。第一个集群根据资源可用性将作业调度到节点。第二个集群为给定作业保留整个节点,并要求其用户在其作业脚本中有效地使用这些多个核心。对于第二个集群,可以接受的做法是在后台提交较少数量的作业和堆栈流程。

对于玩具示例,请说我要创建四个文件:

SAMPLES = [1, 2, 3, 4]

rule all:
    input:
        expand("sample.{sample}", sample=SAMPLES)

    rule normal_create_files:
        input:
        output:
            expand("sample.{sample}", sample=SAMPLES)
        shell:
            "touch {output}"

这可以与每个样本一个作业并行运行。

除了每个创建一个文件的四个作业外,我希望能够创建两个作业,每个作业创建两个文件。

我已经尝试了一些想法,但还没有走得太远。以下工作流程与上面的工作流程相同,只是它创建批次并在每个批次中将作业作为后台进程启动:

rule all:
    input:
        expand("sample.{sample}", sample=SAMPLES)

rule stacked_create_files:
    input:
    output:
        "sample.{sample}"
    run:
        import subprocess as sp

        def chunks(l, n):
            for i in range(0, len(l), n):
                yield l[i:i + n]

        pids = []
        for chunk in chunks({output}.pop(), 2):
            for sample in chunk:
                pids.append(sp.Popen(["touch", sample]))

        exit_codes = [p.wait() for p in pids]

然而,这仍然创造了四个工作岗位!

我在相关主题上也遇到了Karel Brinda's response on the mailing list。他指出了他自己的项目,他在python中进行动态规则创建。接下来我会尝试这些方法。

理想的解决方案是生成一组输出文件的单一规则,但能够批量生成这些文件。批次数将由配置参数设置。

这里有没有人遇到类似的情况?任何想法或想法将不胜感激!

1 个答案:

答案 0 :(得分:1)

我认为您问题的真正解决方案是将Snakemake工作分组在一起的能力。此功能目前正处于规划阶段(实际上我有一个关于此的研究补助金)。

实际上,目前唯一的解决方案是以某种方式将其编码为规则本身(例如通过代码生成)。

将来,您将能够指定如何对作业的DAG进行分区/分组。每个生成的作业组都作为一个批次提交给集群。