有条件地执行一条规则或另一条规则,具体取决于赋予蛇形管道的参数

时间:2020-06-26 11:01:32

标签: snakemake

我正在创建一个蛇形管道,在某处可以过滤结果。但是我可以应用两种过滤器,因此我想在启动pipelin时将其作为参数,然后根据该参数,我想应用一个规则或另一个规则。

例如:

snakemake --snakefile my_pipeline.sm --config filter=${1}

其中过滤器可以为HardSoft

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手册中找不到此信息。

1 个答案:

答案 0 :(得分:1)

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总是比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}"