You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:25:02