我正在学习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
在more "active"/"customized"python代码。
在input
,output
和log
文件名中,在定义这些文件名遵循的模式时使用通配符作为{wildcard_name}
。
当解析规则之间的依赖关系时,Snakemake会将规则的输出文件名模式与它已经知道的下游规则需要作为输入的具体文件名相匹配(这个过程从最上面的规则开始,它应该只有具体的文件名作为输入,而不是模式(注意,如果你使用expand
,这将产生一个具体文件名列表的效果))。当这个匹配过程成功时,Snakemake将会知道一些新的东西:
- 一个能够提供所需文件的规则
- 从该规则的输出名称模式中提取的通配符将在执行该规则期间假定的值
- 该规则将生成或需要的日志和输入文件的具体名称
这些值将用于创建可以在python代码中操作的wildcards
对象:表示使用shell
执行的shell命令的字符串,使用run
运行的python代码,以及在确定params
或输入文件名(如果使用函数而不是简单的字符串或文件名模式)时应该执行的python代码。
在您的示例中,通过匹配"data/raw_external/D_melanogaster.fa.gz"
和"data/raw_external/{genome_id}.fa.gz"
, snakemaker确定您的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