Snakemake输出.bam的两条规则出现AmbiguousRuleException歧义错误求助
解决Snakemake规则歧义问题
问题原因
你的map和map_hybrid规则产生歧义,因为混合样本的输出文件名SRR14724459_SRR14724473__0.9.bam同时满足两个规则的输出通配符:
- 对于
map规则,它会把整个字符串匹配为{sample}通配符 - 对于
map_hybrid规则,它会拆分为{sample1}=SRR14724459、{sample2}=SRR14724473、{titration}=0.9(注意文件名里的双下划线大概率是笔误,应该调整为SRR14724459_SRR14724473_0.9.bam)
Snakemake无法自动判断应使用哪个规则,因此抛出AmbiguousRuleException。
解决方案
方案一:给通配符添加正则约束(推荐)
给map规则的sample通配符添加正则约束,明确它仅匹配不含下划线的单个样本名(你的单个样本名SRR14724459、SRR14724473都没有下划线,而混合样本名包含下划线,刚好可以区分)。
修改map规则的wildcard_constraints部分:
rule map: input: r1 = TRIMMED_DIR + "/{sample}/{sample}_R1_trimmed.fastq", r2 = TRIMMED_DIR + "/{sample}/{sample}_R2_trimmed.fastq" output: MAPPED_DIR + "/{sample}.bam" threads: 28 params: genome = HUMAN_GENOME_DIR log: LOG_DIR + "/map/{sample}_map.log" benchmark: BENCHMARK_DIR + "/map/{sample}_bwa_benchmark.txt" wildcard_constraints: sample=r'[^_]+' # 仅匹配不含下划线的字符串,限定为单个样本名 shell: """ bwa mem -t {threads} {params.genome} {input.r1} {input.r2} 2> {log} | samtools view -hSbo {output} - """
同时修正shell命令中的samtools参数错误:原命令samtools view -hSbo > {output}缺少输入源标识,需添加-表示从stdin读取。
方案二:修改混合样本输出文件名格式
给混合样本的输出文件添加唯一标识(比如_hybrid后缀),让它和单个样本的输出完全区分:
修改map_hybrid的输出:
rule map_hybrid: # 其他部分保持不变 output: MAPPED_DIR + "/{sample1}_{sample2}_{titration}_hybrid.bam" # 其他部分保持不变
同时修正rule all中的expand语句(原代码里的list_a_titrations等变量未定义,需替换为已定义的sample1、sample2、titration):
rule all: expand(MAPPED_DIR + "/{sample}.bam", sample=all_samples), expand(MAPPED_DIR + "/{sample1}_{sample2}_{titration}_hybrid.bam", zip, sample1=sample1, sample2=sample2, titration=titration)
方案三:指定规则优先级(临时方案)
在Snakefile开头添加规则优先级声明,当出现歧义时优先使用map_hybrid:
ruleorder: map_hybrid > map
这种方法无需修改文件名或通配符,但如果后续出现其他类似命名的文件,仍可能触发歧义,仅作为临时应急方案。
额外注意事项
- 原
rule all中的list_a_titrations、list_b_titrations、tit_list变量未定义,需替换为已定义的sample1、sample2、titration,否则会抛出变量未找到的错误。 - 混合样本文件名中的双下划线
__是异常格式,建议调整为单个下划线_,确保和map_hybrid规则的输出通配符完全匹配。
内容的提问来源于stack exchange,提问作者Hannele Padre
相关产品推荐
相关产品推荐

