我正在编写一个管道,其中第一个参考基因组上的读取映射导致sam文件(规则map_on_genome
),然后在一个已排序和索引的bam文件中(规则{{1 }})。在处理完这个bam文件(规则sam2indexedbam
)之后,我提取了一些我希望在同一个基因组上重新映射的读数,它们具有相同的参数。我还修剪了在第一次映射期间没有映射的读取的额外核苷酸(规则small_RNA_seq_annotate
),我想尝试再次映射得到的修剪读数。
理想情况下,extract_nomap_siRNAs
和rules map_on_genome
因此会在sam2indexedbam
和small_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
规则的输出,则错误消失。
我认为这种硬编码打破了循环依赖。