如何解决Snakemake:wildcard.wildcard_name 和 {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 代码中。
在 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"
匹配,Snakemake 确定您的 get_genome_fasta
规则预计能够生成文件 "data/raw_external/D_melanogaster.fa.gz"
,并且为此,它需要为通配符 "D_melanogaster"
设置值 genome_id
。这直接插入到日志文件名模式中。这也作为 wildcards
对象的属性提供,该对象传递给计算 fasta_path
param
值的函数。在本例中,您使用了“lambda 函数”,但您也可以通过定义标准 Python 函数来实现相同的效果:
def set_fasta_path(wildcards):
return config["genomes"][wildcards.genome_id]["fasta"]
# [...]
params:
fasta_path = set_fasta_path
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。