Snakemake: wildcard.wildcard_name 和 {wildcard} 的区别?

Snakemake: Difference between wildcard.wildcard_name and {wildcard}?

我正在学习Snakemake,我对wildcard.wildcard_name{wildcard_name}之间的区别感到困惑。例如,如果这是规则:

rule get_genome_fasta:
"""
Retrieve the sequence in fasta format for a genome.
"""
output:
    "data/raw_external/{genome_id}.fa.gz"
params:
    fasta_path = lambda wildcards: config["genomes"][wildcards.genome_id]["fasta"]
log:
    "results/logs/get_genome_fasta/{genome_id}.log"
shell:
    """
    wget {params.fasta_path} -O {output} -o {log}
    """

wildcards.genome_id{genome_id}有什么区别?非常感谢!

首先,您需要知道 Snakemake 基于 Python。如果您熟悉这种编程语言的语法,将会有所帮助。

您在不同的上下文中使用这两种形式:{wildcard_name} 在定义文件名模式的字符串中,wildcards.wildcard_name 在更多“活动”/“自定义”python 代码中。

inputoutputlog 文件名中,您在定义这些文件名遵循的模式时使用通配符作为 {wildcard_name}

当解析规则之间的依赖关系时,Snakemake 会将规则的输出文件名模式与它已经知道下游规则需要作为输入的具体文件名进行匹配(这个过程从最顶层的规则开始,它应该只有具体文件名作为输入,而不是模式(请注意,如果您使用 expand,这会产生一个具体文件名列表的效果)。 当这个匹配过程成功后,Snakemake 会知道几个新的东西:

  • 能够提供所需文件的规则
  • 从该规则的输出名称模式中提取的通配符在执行该规则期间将采用的值
  • 此规则将分别生成或需要的日志和输入文件的具体名称

这些值将用于创建您可以在 python 代码中操作的 wildcards 对象:字符串表示要使用 shell 执行的 shell 命令, python 使用 run 到 运行 的代码,以及在确定 params 或输入文件名时应执行的 python 代码,以防使用函数而不是输入文件名而不是简单的字符串或文件名模式。

在你的例子中,通过匹配,比如 "data/raw_external/D_melanogaster.fa.gz""data/raw_external/{genome_id}.fa.gz",Snakemake 确定你的 get_genome_fasta 规则应该能够生成一个文件 "data/raw_external/D_melanogaster.fa.gz",为此,需要为通配符 genome_id 设置值 "D_melanogaster"。这直接插入到日志文件名模式中。这也作为 wildcards 对象的属性提供,该对象被传递给计算 fasta_path param 值的函数。在这种情况下,您使用了“lambda 函数”,但您也可以通过定义标准 Python 函数来完成同样的操作:

def set_fasta_path(wildcards):
    return config["genomes"][wildcards.genome_id]["fasta"]

# [...]

    params:
        fasta_path = set_fasta_path