Snakemake:使用 --debug-dag 来检测循环依赖关系



我在NGS分析的工作流程中使用蛇形。 在一个规则中,我利用了另一个规则的唯一(临时)输出。这一个规则的输出也是唯一的,有助于创建最终输出。在这些规则上使用简单的通配符 {sample}。我没有看到任何循环依赖,但蛇告诉我有:

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 选项的输出。

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

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

例如,我有一个执行适配器修剪的规则,并且我有一个针对配对端和单端的规则:

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选项来检测通配符扩展在哪个规则中出错,而不是只在规则中出错时出错。

最新更新