在Snakemake中是否可以使用“可选”通配符或文件名的一部分?

问题描述

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

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',tt|gs}_d{amount}.npz'
    run:
        # DO STUFF

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

谢谢!

解决方法

感谢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开头的字符串。 希望它能帮助到别人。

,

您不能用非常简单的方式做到这一点吗?

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会从您要求的最终文件中解析通配符,并遵循规则以查看如何生成此文件。