我在工作流程中使用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选项的输出。
答案 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
选项来检测通配符扩展在哪条规则中出错,而不是仅在出错的规则中出错。