重用规则并避免使用snakemake进行CyclicGraphException

时间:2017-02-15 16:08:49

标签: bioinformatics snakemake

我正在编写一个管道,其中第一个参考基因组上的读取映射导致sam文件(规则map_on_genome),然后在一个已排序和索引的bam文件中(规则{{1 }})。在处理完这个bam文件(规则sam2indexedbam)之后,我提取了一些我希望在同一个基因组上重新映射的读数,它们具有相同的参数。我还修剪了在第一次映射期间没有映射的读取的额外核苷酸(规则small_RNA_seq_annotate),我想尝试再次映射得到的修剪读数。

理想情况下,extract_nomap_siRNAsrules map_on_genome因此会在sam2indexedbamsmall_RNA_seq_annotate之前第一次使用,然后再次使用这些规则的输出。

在我试图这样做的时候,一个名为extract_nomap_siRNAs的通配符应该可以帮助snakemake在第一个映射和另一个映射之间产生差异,但显然我失败了因为我最终得到以下错误:

read_type

实现我想要的建议方法是什么(即避免代码重复)?

实施例

我试图在我的真实管道的简化版本中重现错误。以下是导致Cyclic dependency on rule sam2indexedbam.

的示例
CyclicGraphException

解决方案

如果我将规则rule all: input: expand("results/{read_type}_on_genome_sorted.bam", read_type=["reads", "nomap_siRNA", "piRNA", "siRNA", "miRNA"]), def source_fastq(wildcards): if wildcards.read_type == "nomap_siRNA": return rules.extract_nomap_siRNA.output.fastq elif wildcards.read_type == "piRNA": return rules.small_RNA_seq_annotate.output.pi_fastq elif wildcards.read_type == "siRNA": return rules.small_RNA_seq_annotate.output.si_fastq elif wildcards.read_type == "miRNA": return rules.small_RNA_seq_annotate.output.mi_fastq elif wildcards.read_type == "reads": return "data/reads.fastq" else: raise NotImplementedError("Unknown read type: %s" % wildcards.read_type) rule map_on_genome: input: source_fastq output: sam = "results/{read_type}_on_genome.sam", nomap = "results/{read_type}_nomap.fastq" shell: """ touch {output} """ rule extract_nomap_siRNA: input: rules.map_on_genome.output.sam #"results/reads_nomap.fastq" output: fastq = "results/{read_type}_unmapped_siRNA.fastq" shell: """ touch {output} """ rule sam2indexedbam: input: rules.map_on_genome.output.sam output: "results/{read_type}_on_genome_sorted.bam" shell: """ touch {output} """ rule small_RNA_seq_annotate: input: "results/reads_on_genome_sorted.bam" output: pi_fastq = "results/piRNA.fastq", si_fastq = "results/siRNA.fastq", mi_fastq = "results/miRNA.fastq" shell: """ touch {output.pi_fastq} touch {output.si_fastq} touch {output.mi_fastq} """ 的输入更改为硬编码文件路径而不是extract_nomap_siRNA规则的输出,则错误消失。

我认为这种硬编码打破了循环依赖。

0 个答案:

没有答案