【问题标题】:Is it possible in Snakemake to have "optional" wildcard or part of the filename?Snakemake 中是否有可能具有“可选”通配符或文件名的一部分?
【发布时间】:2020-09-08 13:34:34
【问题描述】:

我想知道是否可以将 Snakemake 中的这两个规则合并为一条规则(它们在“运行:”中的作用相同):

rule without_d:
    input:
        vals_pca    = 'stats/input_{type}.npz',
    output:
        for_cnv     = 'stats/output_{type, tt|gs}.npz'
    run:
        # DO STUFF

rule with_d:
    input:
        vals_pca    = 'stats/input_{type}_d{amount}.npz',
    output:
        for_cnv     = 'stats/output_{type, tt|gs}_d{amount}.npz'
    run:
        # DO STUFF

我尝试定义stats/output_{type}{amount}.npz,但通配符显然与空字符串不匹配。 第二个想法是将其放入“或”中,例如stats/{output, output_{type}|output_{type}_d{amount}},但这里的问题是通配符中的通配符。

谢谢!

【问题讨论】:

    标签: python wildcard snakemake


    【解决方案1】:

    感谢 Eric,我意识到正则表达式可以用于 snakemake 规则的通配符。唯一的问题是,snakemake 不接受“空”通配符,但这可以被覆盖,如帖子中所述:https://groups.google.com/g/snakemake/c/S7fTL4jAYIM?pli=1 因此,我的问题的解决方案如下:

    rule both:
        input:
            vals_pca    = 'stats/input_{type}{amount}.npz',
        output:
            for_cnv     = 'stats/output_{type, tt|gs}{amount, .{0}|_d.+}.npz'
        run:
            # DO STUFF
    

    Snakemake 将匹配{amount, .{0}|_d.+} 作为空字符串或以_d 开头的字符串。 希望它会对某人有所帮助。

    【讨论】:

      【解决方案2】:

      你不能用非常简单的方法来做吗:

      rule with_something:
          input:
              vals_pca    = 'stats/input_{something}.npz',
          output:
              for_cnv     = 'stats/output_{something}.npz'
          run:
              # DO STUFF
      

      通配符由输出文件定义。如果您要求文件output_typeWhatever_dWhatever.npz,则规则将查找input_typeWhatever_dWhatever.npz。如果您要求文件output_typeWhatever.npz,则规则将用作输入input_typeWhatever.npz

      让您的规则尽可能简单/通用。不要忘记,snakemake 会从您请求的最终文件中解析通配符,并按照规则查看如何生成此文件。

      【讨论】:

      • 谢谢,埃里克;我正在考虑它,但该解决方案的问题是,该规则将匹配任何后缀到“output_”,而不仅仅是以接受的类型开头的后缀。或者,假设我们没有该类型,因此输出如下:output.npzoutput_d{value}.npz - 您的解决方案无法解决该问题,因为我们不能使用 output{suffix}.npz 规则,因为 {suffix} 不会匹配空字符串。
      • 我建议您为 Snakefile 中的每个规则使用特定模式。如果所有规则都生成像stats/output_{suffix}.npz 这样的文件,那么您的工作流程将非常混乱。在您的问题中,您没有解决 type 是空字符串的情况。此外,您可以定义更复杂的约束,例如{suffix, tt\w+|gs\w+}(尽管尚未在约束中测试这些正则表达式)。但是,我的解决方案将解决 output_d{value}.npz(不设置约束)输出。也许您应该在问题中显示您可能想要的不同后缀大小写。
      猜你喜欢
      • 2020-10-24
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      相关资源
      最近更新 更多