我正在创建一个蛇形管道,在某处可以过滤结果。但是我可以应用两种过滤器,因此我想在启动pipelin时将其作为参数,然后根据该参数,我想应用一个规则或另一个规则。
例如:
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"
如果过滤器参数为rule B
,是否仍要执行Hard
,如果过滤器参数为rule C
,则要执行Soft
;而不是在唯一规则的shell命令中执行条件子句?我在snakemake手册中找不到此信息。
答案 0 :(得分:1)
Snakemake具有称为ruleorder
的功能。这使您可以消除规则的歧义。例如,在您的代码中(这行不通,但假设已更正),您有两个相等的分支来完成目标文件:
Snakemake将抱怨它不知道要选择哪个分支。可以通过以下方式解决此问题:
ruleorder: rule1 > rule2
现在,Snakemake总是比Rule2更喜欢rule1。
您可以根据配置(来自文件或命令行)定义两种不同的顺序。下面是我的简化代码示例。
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}"