Snakemake 无法匹配通配符,尽管它已定义甚至建议

Snakemake is unable to match wildcard although it's defined and even suggested

尽管阅读了完整的文档和一些示例,但我仍然对通配符的概念感到非常困惑,所以也许有人可以阐明这种奇怪的行为。这可能是一个错误,但这是一个非常基本的例子,我很确定我做错了或理解错了。

这是我的Snakefile,它应该生成一堆文件,这些文件在存储文件位置的字典中定义(这些文件可以由 iRODS、XRootD 等各种数据提供程序提供服务,但现在不重要了)。

import os

some_files = {
    "foo": "some_location/foo",
    "bar": "another_location/bar",
    "baz": "yet_another_loc/baz"
}

rule all:
    input: ["raw/" + os.path.basename(f) for f in some_files.keys()]

rule generate_files:
    output:
        temp("raw/{fname}")
    shell:
        "echo grabbed file from {some_files[wildcards.fname]} > {output}"

如您所见,我需要使用我在上一个问题 () 中提出的类似“技巧”,通过添加规则并列出这些文件(在 rule all),效果很好。

然后 rule generate_files 应该使用相应的 URL 和 some_files 中定义的协议生成(检索)那些。为了简单起见,它现在只是将原点回显到 output 文件中。

为了实现这一点,我认为我可以简单地使用 shell 部分中的 wildcards.fname 但是当我 运行 工作流程时,我得到:

░ tamasgal@silentbox-(2):PhD/snakemake  master ●●● snakemake took 16s
░ 08:47:35 > snakemake -c1
Building DAG of jobs...
Using shell: /bin/bash
Provided cores: 1 (use --cores to define parallelism)
Rules claiming more threads will be scaled down.
Job stats:
job               count    min threads    max threads
--------------  -------  -------------  -------------
all                   1              1              1
generate_files        3              1              1
total                 4              1              1

Select jobs to execute...

[Fri Feb 18 08:47:38 2022]
rule generate_files:
    output: raw/bar
    jobid: 2
    wildcards: fname=bar
    resources: tmpdir=/var/folders/84/mcvklq757tq1nfrkbxvvbq8m0000gn/T

RuleException in line 12 of /Users/tamasgal/Dev/PhD/snakemake/Snakefile:
NameError: The name 'wildcards.fname' is unknown in this context. Please make sure that you defined that variable. Also note that braces not used for variable access have to be escaped by repeating them, i.e. {{print }}

如果我使用 fname(而不是 wildcards.fname),Snakemake 建议使用 wildcards.fname,这同样不起作用。这是 运行 fname in output:

时的输出
[Fri Feb 18 08:47:48 2022]
rule generate_files:
    output: raw/bar
    jobid: 2
    wildcards: fname=bar
    resources: tmpdir=/var/folders/84/mcvklq757tq1nfrkbxvvbq8m0000gn/T

RuleException in line 12 of /Users/tamasgal/Dev/PhD/snakemake/Snakefile:
NameError: The name 'fname' is unknown in this context. Did you mean 'wildcards.fname'?

为什么会这样?工作流的输出清楚地显示 wildcards: fname=bar,因此它存在并被定义。这是一个错误吗?

嗯,您可能需要尝试在 shell 部分之外的 some_files[wildcards.fname] 处?在我看来,它可以告诉输出 raw/bar 的通配符应该是什么,但它无法处理使用它来访问 shell 部分中的字典。对我来说,这似乎可以用 input function 来处理。

超出我的想象:

rule generate_files:
    input:
        some_file = lambda wildcards: some_files[wildcards.fname]
    output:
        temp("raw/{fname}")
    shell:
        "echo grabbed file from {input.some_file} > {output}"

编辑:如果失败是因为文件不是本地的,所以 Snakemake 找不到它,您可以提供它的路径作为参数:

rule generate_files:
    params:
        some_file = lambda wildcards: some_files[wildcards.fname]
    output:
        temp("raw/{fname}")
    shell:
        "echo grabbed file from {params.some_file} > {output}"