【问题标题】:Parallelizing snakemake rule并行化蛇形规则
【发布时间】:2018-06-13 02:20:42
【问题描述】:

对不起,如果这是一个幼稚的问题,但我仍在努力解决 Snakemake 的复杂性。

我有一个目录,其中包含许多我想并行应用规则的文件(即我想向集群提交相同的脚本,为每次提交指定不同的输入文件)。

我首先尝试对输入文件使用扩展,但这只会导致提交一个作业:

CHROMS = [str(c) for c in range(1, 23)] + ["X"]
rule vep:
    input:
        expand("data/split/chr{chrom}.vcf", 
               chrom=CHROMS)
    output:
        expand("data/vep/split/chr{chrom}.ann.vcf",
               chrom=CHROMS)
    shell:
        "vep "
        "{input} "
        "{output}"

这里有替代方法吗?

谢谢!

【问题讨论】:

  • 此外,当前形式的shell 命令会导致错误,因为其中的每一行都将充当单独的命令。相反,您必须使用` 转义换行符,即"vep \ {input} \ {output}"。注意:\ 旁边的换行符在 stackoverflow cmets 中的格式似乎不正确。
  • @JeeYem 没试过,但是这个语法是不是真的有效,导致3个字符串串联?
  • 我昨天简单检查了一下,你的语法会导致问题。在snakemake 中尝试-p 标志以查看将要执行的命令。
  • @bli 使用的语法实际上是有效的,我错了。我在其他地方看到了类似的实现,在测试中,snakemake 确实按照您的建议将它们连接起来。对困惑感到抱歉。不知道上次测试时我是怎么错过的。
  • @JeeYem 我认为这是一个通用的 python 功能,允许在多行中切割字符串。如果我没记错的话,我曾在 argparse 帮助消息中看到过它。

标签: python snakemake


【解决方案1】:

目前,您的工作流程确实包括仅应用“vep”规则一次,它会执行 vep 并将您的所有输入和输出作为参数。我不知道vep 是如何工作的,但它可能会失败或没有达到您的预期。

您可能应该在不扩展的情况下编写规则的输入和输出,并使用“全部”规则驱动它,即扩展:

CHROMS = [str(c) for c in range(1, 23)] + ["X"]


rule all:
    input:
        expand("data/vep/split/chr{chrom}.ann.vcf",
               chrom=CHROMS)

rule vep:
    input:
        "data/split/chr{chrom}.vcf"
    output:
        "data/vep/split/chr{chrom}.ann.vcf"
    shell:
        "vep "
        "{input} "
        "{output}"

为了生成“all”规则的所需输入,snakemake 将确定需要应用“vep”规则的次数和方式(即chrom 通配符的值)。

确保将“全部”规则放在所有其他规则之前。

【讨论】:

  • 正如您在另一个线程中所说,这是初学者的常见问题,我责怪文档。对于解释通配符从结束目标向后解析到开始,特别是它们不需要在每条规则中定义,而只在规则链的最后一个定义一次,它们相当不清楚。对于那些习惯于从头到尾评估的典型编程的人来说,这非常违反直觉。我为此苦苦挣扎了好几个星期,觉得在每个规则和 for 循环中进行扩展是一种处理一次输入一个任务的方法太笨重且效率低下。现在说得通了!
猜你喜欢
  • 1970-01-01
  • 2022-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多