Workflow 使用通配符的Snakemake古标记

Workflow 使用通配符的Snakemake古标记,workflow,snakemake,Workflow,Snakemake,我从NCBI网站下载了一些SRA文件。现在我想将它们添加到我的snakemake工作流中。但是,如果它们不可用,我希望保留使用预回迁下载它们的功能。我有一个简单的规则 BASE = "/path/to/working/folder" rule all: input: [f"{BASE}/fastq/SRR000001.sra_1.fastq", f"{BASE}/fastq/SRR000001.sra_2.fastq"]

我从NCBI网站下载了一些SRA文件。现在我想将它们添加到我的
snakemake
工作流中。但是,如果它们不可用,我希望保留使用
预回迁
下载它们的功能。我有一个简单的规则

BASE = "/path/to/working/folder"

rule all:
    input: [f"{BASE}/fastq/SRR000001.sra_1.fastq", f"{BASE}/fastq/SRR000001.sra_2.fastq"]
    shell:
        "echo Finished"

rule get_sra:
    input: ancient("config/config.yaml")
    output:"{BASE_FOLDER}/sra/{SSR_ID}.sra"
    shell:
         "prefetch -p {wildcards.SSR_ID} --output-file {output} "

rule get_fastq:
    input: expand("{folder}/sra/{srr}.sra", folder=BASE, srr="{SRR_ID}")
    output:
          expand("{folder}/fastq/{srr}.sra_{i}.fastq", folder=BASE,
                 srr="{SRR_ID}", i=[1, 2])
    shell:
         "fasterq-dump {input} --outdir {BASE}/fastq"

         
如果我使用上述规则,我的工作流将重新创建我的SRA文件,因为它们的时间戳将更旧。但是,我不想再次从服务器下载完整的SRA文件并使用已下载的文件

为此,我尝试使用标签。但我无法将此标记与任何通配符一起使用

input: ancient("{BASE_FOLDER}/sra/{SSR_ID}.sra")
上述规则给出了如下错误:

无法根据输出文件确定输入文件中的通配符:


这个问题有什么解决办法吗?当我使用
expand

时,这也不起作用。问题是,在大括号中指定的并非所有内容实际上都是通配符。您可能有3个不同的用例,其中可以使用花括号:

  • 展开
    函数
  • f字串
  • 通配符
在前两种情况下(expand和f-string),结果是完全指定的字符串,没有任何通配符。如果你有类似的东西:

规则虚拟:
输入:“{wildcard}.input”
输出:展开(“{wildcard}.output”,通配符=[“1”,“2”])
结果很简单:

规则虚拟:
输入:“{wildcard}.input”
输出:[“1.输出”,“2.输出”]
如您所见,输出部分中根本没有通配符,因此输入无法确定其通配符的值

典型的解决方案是将此规则分为两个规则:

规则所有:
输入:展开(“{wildcard}.output”,通配符=[“1”,“2”])
规则做一些工作:
输入:“{wildcard}.input”
输出:“{wildcard}.output”

但是请注意,我在
规则all:
中调用的
{wildcard}
本身并不是一个通配符,而是在
展开
函数的本地上下文中任意选择的名称。

请提供导致此错误的代码。@DmitryKuzminov,我已经添加了完整的工作代码。在这种情况下,代码可以工作,但如果给定文件夹中已经存在SRA文件,我只想运行rule
get\u fastq
。这里的
古老(“config/config.yaml”)
只是虚拟输入。我明白了。现在回到我原来的问题,我可以在
做一些工作
的输入中使用
古代
标记吗?@Dexter,你可以在任何
输入
部分使用
古代