英文:
snakemake chose rule to run
问题
我正在尝试编辑一个 Snakemake 流程,这个流程有很多规则,如下所示:
rule A:
rule B:
rule C:
...
rule C
的输入是 rule B
的输出,以下是一个简单的示例:
rule B:
output:
'path/to/output_B.txt'
shell:
"""
echo "This is rule B output" > {output}
"""
rule C:
input:
'path/to/output_B.txt'
output:
'path/to/output_C.txt'
shell:
"""
cat {input} > {output}
"""
我的期望:
现在,我想添加一个 rule D
和一个名为 use_rule_D
的配置文件参数,当 use_rule_D
设置为 true
时,我希望 Snakemake 调用 rule D
来生成 rule C
的输入,而不是 rule B
。
我的解决方案:
我添加了一个 rule D
,输出为 /path/to/output_D.txt
,并使用一个函数来选择 rule B
的输入。这个方法有效:
rule B:
output:
'path/to/output_B.txt'
shell:
"""
echo "This is rule B output" > {output}
"""
def get_input(config):
if config['use_rule_D']:
return 'path/to/output_D.txt'
return 'path/to/output_B.txt'
rule C:
input:
input_data=get_input(config)
output:
'path/to/output_C.txt'
shell:
"""
cat {input.input} > {output}
"""
rule D:
output:
'path/to/output_D.txt'
shell:
"""
echo "This is rule D output" > {output}
"""
但是,我的实际 Snakemake 脚本中有很多规则都需要 rule B
的输出。这意味着我需要修改每个相关的输入。我希望创建一个简单的方法,使 Snakemake 可以根据不同的参数生成 /path/to/output_B.txt
,然后用于不同的规则。
英文:
I am trying to edit a snakemake pipeline, This pipeline has a lot of rules, like:
rule A:
rule B:
rule C:
...
The rule C
input is the output of B, here is a simple example:
rule B:
output:
'path/to/output_B.txt'
shell:
"""
echo "This is rule B output" > {output}
"""
rule C:
input:
'path/to/output_B.txt'
output:
'path/to/output_C.txt'
shell:
"""
cat {input} > {output}
"""
My expected:
Now, I want to add a rule D
and a params in configfile called use_rule_D
, when use_rule_D
be set to true
, I want snakemake call rule D
to generate input of rule C
instead rule B
My solutions:
I add rule D
with output /path/to/output_D.txt
and use a function to chose the input of rule B
, Its work
rule B:
output:
'path/to/output_B.txt'
shell:
"""
echo "This is rule B output" > {output}
"""
def get_input(config):
if config['use_rule_D']:
return 'path/to/output_D.txt'
return 'path/to/output_B.txt'
rule C:
input:
input_data=get_input(config)
output:
'path/to/output_C.txt'
shell:
"""
cat {input.input} > {output}
"""
rule D:
output:
'path/to/output_D.txt'
shell:
"""
echo "This is rule D output" > {output}
"""
But, there are many rule in my real snakemake script need the output of rule B
, This means that I need to modify every relevant input. I want to create a simple method to make Snakemake generate /path/to/output_B.txt
using different rules under different parameters.
答案1
得分: 2
> 我想要在配置文件中添加规则 D 和一个名为 use_rule_D 的参数,当 use_rule_D 被设置为 true 时,我希望 snakemake 调用规则 D 来生成规则 C 的输入,而不是规则 B。
要实现这一点的一种方法是在 Snakefile 中添加显式条件:
if config.get("use_rule_D") is True:
# 使用规则 D
rule B:
output:
'path/to/output_complex.txt'
else:
# 使用规则 B
rule B:
output:
'path/to/output_complex.txt'
请注意,在这两种情况下,输出都是相同的(output_complex.txt
),但预期执行(shell
/run
)会有所不同。将输出命名为相同的名称允许您避免为下游规则定义条件。
英文:
> I want to add a rule D and a params in configfile called use_rule_D, when use_rule_D be set to true, I want snakemake call rule D to generate input of rule C instead rule B
One way to achieve this is to add an explicit conditional in the snakefile:
if config.get("use_rule_D") is True:
# use rule D
rule B:
output:
'path/to/output_complex.txt'
else:
# use rule B
rule B:
output:
'path/to/output_complex.txt'
Note that in both cases the output is the same (output_complex.txt
), but the execution (shell
/run
) is expected to be different. Having the same name for the output allows you to avoid defining conditionals for downstream rules.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论