snakemake - 根据提供给 snakemake 管道的参数有条件地执行一个或另一个规则

标签 snakemake

我正在创建一个 snakemake 管道,在某些时候,我可以在其中过滤我的结果。但是我可以应用两种过滤器,所以我想在启动管道时将其作为参数提供,然后根据参数,我想应用一个或另一个规则。

举个例子:

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"

如果过滤器参数是Hard,是否执行rule B,而如果filter argument是Soft<,是否执行rule C/;而不是在唯一规则的 shell 命令中执行条件从句?我没有在 snakemake 手册中找到此信息。

最佳答案

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/

相关文章:

python - 一起使用 Snakemake 和 Dask 有意义吗?

kubernetes - 如何在本地Kubernetes或OpenShift集群上运行Snakemake工作流程?

if-statement - 根据 config.yaml 中的变量(非通配符)命名 Snakemake 中的输入/输出文件

python - 如何收集与输入函数匹配通配符的Snakemake输入文件?

snakemake - 处理snakemake中的SIGPIPE错误

python - Snakemake 中用于多输入和单输出的多个参数。 ConbineGVCFs gatk 问题

snakemake - 如何防止snakemake从失败的作业中删除输出文件夹?

python - 蛇制造 : rule's input with different pattern

snakemake - 如何在snakemake中只运行一个规则

bioinformatics - 使用不推荐使用的动态 API 构建具有动态输入的工作流