在 Snakemake 中是否可以使用 "optional" 通配符或部分文件名?

Is it possible in Snakemake to have "optional" wildcard or part of the filename?

我想知道是否可以在一条规则中加入 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}},但这里的问题是通配符中的通配符。

谢谢!

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

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.

尽可能simple/generic遵守规则。不要忘记 snakemake 会从您请求的最终文件中解析通配符,并根据规则查看如何生成此文件。

感谢 Eric,我意识到可以在 snakemake 规则的通配符中使用正则表达式。唯一的问题是 snakemake 不接受“空”通配符,但这可以被覆盖,如 post 此处所述: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 开头的字符串。 希望对大家有所帮助。