Snakemake:使用--debug-dag检测循环依赖项

时间:2019-07-26 07:50:29

标签: snakemake

我在工作流程中使用snakemake进行NGS分析。 在一个规则中,我利用了另一条规则的唯一(临时)输出。该规则的输出也是唯一的,并且有助于最终输出的创建。在这些规则上使用一个简单的通配符{sample}。我看不到任何周期性依赖关系,但是snakemake告诉我有:

Snakefile的xxx行中的

CyclicGraphException:规则的循环依赖性

我了解可以调查此问题:--debug-dag。

如何解释输出?什么是候选人还是被选中?

这是我的(伪)规则代码:

rule split_fasta:
    input:
        dataFile="data/path1/{sample}.tab",
        scaffolds="data/path2/{sample}.fasta",
        database="path/to/db",
    output:
        onefasta="data/path2/{sample}_one.fasta",
        twofasta="data/path2/{sample}_two.fasta",
        threefasta="data/path2/{sample}_three.fasta",
    conda:
        "envs/env.yaml"
    log:
        "logs/split_fasta_{sample}.log"
    benchmark:
        "logs/benchmark/split_fasta_{sample}.txt"
    threads: 4
    shell:
        """
python bin/split_fasta.py {input.dataFile} {input.scaffolds} {input.database} {output.onefasta} {output.twofasta} {output.threefasta} 
        """

除了此规则外,输入和输出之间没有其他连接。

问题已经解决,在下游和上游存在一些细微的依赖关系。

但是,为了将来参考,我想知道如何解释--debug-dag选项的输出。

1 个答案:

答案 0 :(得分:0)

--debug-dag    Print candidate and selected jobs (including their wildcards) while inferring DAG. This can help to debug unexpected DAG topology or errors.

似乎没有比这更多的文档了,但是我相信候选作业是可以通过通配符匹配所需字符串的作业。选定的工作是从候选项中选择的(通过通配符约束,规则顺序或第一个具有--allow-ambiguity选项的候选项)。

作为一个例子,我有一个规则来进行适配器修整,并且我有一个针对配对端和单端的规则:

rule trim_SE:
    input:
        "{sample}.fastq.gz"
    output:
        "{sample}_trimmed.fastq.gz"
    shell:
         ...

rule trim_PE:
    input:
        "{sample}_R1.fastq.gz",
        "{sample}_R2.fastq.gz"
    output:
        "{sample}_R1_trimmed.fastq.gz"
        "{sample}_R2_trimmed.fastq.gz"
    shell:
         ...

如果我现在告诉snakemake生成输出exp_R1_trimmed.fastq.gz,它会抱怨它可以使用任何一条规则。

AmbiguousRuleException:
Rules trim_PE and trim_SE are ambiguous for the file exp_R1_trimmed.fastq.gz.
Consider starting rule output with a unique prefix, constrain your wildcards, or use the ruleorder directive.
Wildcards:
    trim_PE: sample=exp
    trim_SE: sample=exp_R1

我们可以通过例如放置一个规则顺序来解决此问题:

ruleorder: trim_PE > trim_SE

然后根据需要生成文件。如果现在使用--debug-dag选项,我们将获得两条候选规则和一条选定规则(基于我们的规则顺序)。

candidate job trim_PE
    wildcards: sample=exp
candidate job trim_SE
    wildcards: sample=exp_R1
selected job sra2fastq_PE
    wildcards: sample=GSM2837484

如果规则trim_PE和trim_SE依赖于下游的其他规则,我们可以使用--debug-dag选项来检测通配符扩展在哪条规则中出错,而不是仅在出错的规则中出错。