Snakemake检查点规则缺失通配符:染色体推断失败求助
Snakemake Checkpoint 染色体通配符推断问题解决
问题背景
用Snakemake的checkpoint处理动态生成的文件,按染色体并行执行GenomeAnalysisTK任务,之后要按实验合并所有染色体的结果,但运行时抛出错误:WorkflowError: Missing wildcard values for chromosome
相关代码如下:
checkpoint GenomeAnalysisTK: input: bamlist = rules.RealignerTargetCreator.output.bamlist, intervals = rules.RealignerTargetCreator.output.intervals, fasta = fasta output: temp(directory("splits/{chromosome}")) conda: "gatk3" wildcard_constraints: chromosome='|'.join([x for x in detect_chromosomes(fai)]), shell: """ mkdir -p {output} && cd {output} gatk3 -Xmx24g -T IndelRealigner -I {input.bamlist} -targetIntervals {input.intervals} -L {wildcards.chromosome} -R {input.fasta} -compress 0 --nWayOut .{wildcards.chromosome}.indelrealigned.bam """ def agg(wildcards): output=checkpoints.GenomeAnalysisTK.get(**wildcards).output[0] return expand("splits/{chromosome}/{{experiment}}/{chromosome}.indelrealigned.bam") rule merge_realigned: input: agg output: "{patient}/{sample}/{experiment}.merged.indelrealigned.bam" threads: config["other_threads"], params: compression_level = 0 wildcard_constraints: chromosome='|'.join([x for x in detect_chromosomes(fai)]), shell: "samtools merge -@ {threads} -l {params.compression_level} {output} {input}"
错误根源
merge_realigned规则的输出不含chromosome通配符,但规则里加了该通配符的约束,Snakemake找不到对应值agg函数里的expand没有从checkpoint实际生成的目录中提取真实染色体,而是硬套通配符模板,无法动态关联生成的文件
修复步骤
1. 重写agg函数,动态提取染色体
从checkpoint生成的splits/{chromosome}目录中,直接获取真实的染色体名称,再展开对应文件路径:
import os import glob def agg(wildcards): # 获取checkpoint输出的根目录 checkpoint_dir = checkpoints.GenomeAnalysisTK.get(**wildcards).output[0] # 遍历目录下的所有子目录,提取染色体名称 chromosomes = [os.path.basename(subdir) for subdir in glob.glob(f"{checkpoint_dir}/*") if os.path.isdir(subdir)] # 针对每个染色体,生成对应实验的文件路径 return expand("splits/{chrom}/{experiment}/{chrom}.indelrealigned.bam", chrom=chromosomes, experiment=wildcards.experiment)
2. 移除merge规则中多余的chromosome约束
因为merge_realigned的输出不涉及chromosome通配符,直接删掉该规则下的wildcard_constraints里的染色体相关内容:
rule merge_realigned: input: agg output: "{patient}/{sample}/{experiment}.merged.indelrealigned.bam" threads: config["other_threads"], params: compression_level = 0 # 删掉chromosome的wildcard_constraints shell: "samtools merge -@ {threads} -l {params.compression_level} {output} {input}"
3. 确保顶层规则能触发所有任务
添加rule all来定义最终需要生成的所有合并文件,让Snakemake能正确解析patient、sample、experiment这些通配符:
# 替换成你实际的patient/sample/experiment列表 patients = ["P001", "P002"] samples = ["S01", "S02"] experiments = ["EXP1", "EXP2"] rule all: input: expand("{patient}/{sample}/{experiment}.merged.indelrealigned.bam", patient=patients, sample=samples, experiment=experiments)
核心逻辑说明
- Checkpoint的作用就是在运行时生成文件后,让Snakemake重新扫描文件系统获取真实文件列表,必须利用这一点动态提取染色体,而不是提前假设通配符值
- 规则的
wildcard_constraints只能包含输出路径里存在的通配符,否则Snakemake会报错找不到对应值
内容的提问来源于stack exchange,提问作者PabloB
相关产品推荐
相关产品推荐

