Snakemake导入规则时如何使用参数默认值?
问题
尝试通用化Snakemake工作流时遇到异常。创建了analysis.smk文件编写通用规则以便多工作流导入使用,规则内容如下:
rule analysis: output: test.root input: input_test.root params: variable: "SvB" rebin: 10 shell: `python run_analysis.py {params.variable} {params.rebin}`
在另一个Snakefile中导入该规则并使用:
module analysis: snakefile: "analysis.smk" config: config use rule analysis from analysis as run_analysis with: output: f"{config['output']}/hist.root" input: f"{config['output']}/input_hist.root" params: rebin: 20
运行时出现错误:
AttributeError: 'Params' object has no attribute 'variable', when formatting the following:
原因是未定义variable参数。只想修改部分参数值,其余使用默认值,这是预期行为吗?使用的是Snakemake 8.27.1版本。
解决方案
这不是预期行为,而是Snakemake模块规则重载的特性:当在with块中指定params时,会完全覆盖原规则的params,而非合并。要实现只修改部分参数、保留默认值的需求,有两种可行方法:
方法1:显式继承原参数
在重载规则时,直接引用原模块规则的默认参数值,示例如下:
use rule analysis from analysis as run_analysis with: output: f"{config['output']}/hist.root" input: f"{config['output']}/input_hist.root" params: variable: analysis.params.variable rebin: 20
方法2:将默认参数移至配置文件
把通用规则的默认参数绑定到配置项,通过config.get()设置默认值,这样重载时未指定的参数会自动使用配置默认值。
修改analysis.smk:
rule analysis: output: test.root input: input_test.root params: variable: config.get("variable", "SvB") rebin: config.get("rebin", 10) shell: `python run_analysis.py {params.variable} {params.rebin}`
导入时只需指定需要修改的参数:
use rule analysis from analysis as run_analysis with: output: f"{config['output']}/hist.root" input: f"{config['output']}/input_hist.root" params: rebin: 20
此时variable会自动使用默认值"SvB"。
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

