我正在创建一个 snakemake 管道,在某些时候,我可以在其中过滤我的结果。但是我可以应用两种过滤器,所以我想在启动管道时将其作为参数提供,然后根据参数,我想应用一个或另一个规则。
举个例子:
snakemake --snakefile my_pipeline.sm --config filter=${1}
过滤器可以是Hard
或Soft
my_pipeline.sm 符合 4 条规则:
rule A:
input:
A.bam
outpu:
A.vcf
shell:
"do.something"
rule B:
input:
A.vcf
output:
A.hard_filtered.vcf
shell:
"do.something"
rule C:
input:
A.vcf
output:
A.soft_filtered.vcf
shell:
"do.something"
rule D:
input:
A.*_filtered.vcf
output:
A.annotated.vcf
shell:
"do.something"
如果过滤器参数是Hard
,是否执行rule B
,而如果filter argument是Soft<,是否执行
;而不是在唯一规则的 shell 命令中执行条件从句?我没有在 snakemake 手册中找到此信息。rule C
/
最佳答案
Snakemake 有一个叫做ruleorder
的功能。这使您可以消除规则的歧义。例如,在您的代码中(这是行不通的,但我们假设它已被更正)您有两个相等的分支来完成目标文件:
- A.bam -> A.vcf -> A.hard_filtered.vcf -> A.annotated.vcf
- A.bam -> A.vcf -> A.soft_filtered.vcf -> A.annotated.vcf
Snakemake 会提示它不知道该选择哪个分支。这可以通过以下方式解决:
ruleorder: rule1 > rule2
现在 Snakemake 总是更喜欢规则 1 而不是规则 2。
您可以根据配置(来自文件或命令行)定义两种不同的顺序。下面是我简化的代码示例。
configfile: "config.yml"
if config["filtering"] == "soft":
ruleorder: annotate_soft > annotate_hard
else:
ruleorder: annotate_hard > annotate_soft
rule all:
input:
"A.annotated.vcf"
rule hard:
input:
"A.vcf"
output:
"A.hard_filtered.vcf"
shell:
"echo 'hard' > {output}"
rule soft:
input:
"A.vcf"
output:
"A.soft_filtered.vcf"
shell:
"echo 'soft' > {output}"
rule annotate_hard:
input:
"A.hard_filtered.vcf"
output:
"A.annotated.vcf"
shell:
"cp {input} {output}"
rule annotate_soft:
input:
"A.soft_filtered.vcf"
output:
"A.annotated.vcf"
shell:
"cp {input} {output}"
关于snakemake - 根据提供给 snakemake 管道的参数有条件地执行一个或另一个规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62593351/