使用Snakemake Checkpoint分块处理后合并文件的通配符缺失问题
解决方案
核心问题是合并规则仅持有library通配符,无法直接匹配需要library/run/side的checkpoint输出。解决方式是从已知的library-run-side映射中遍历所有对应组合,逐个获取每个组合的chunk结果,再汇总为合并规则的输入。
步骤1:添加辅助函数获取library对应的run和side
假设你的LIBRARY_RUN_FASTQS结构为{library: {run: [R1_fastq, R2_fastq]}},先写一个函数提取指定library下的所有run和side组合:
def get_library_runs_sides(library): # 从全局变量中提取当前library的所有run,每个run对应side 1和2 runs = LIBRARY_RUN_FASTQS[library].keys() return [(run, side) for run in runs for side in ["1", "2"]]
步骤2:修改分块文件收集函数
更新get_pair_chunks,遍历当前library的所有run+side组合,逐个调用checkpoint获取chunk_id,再生成对应的已处理分块路径:
def get_pair_chunks(wildcards): library = wildcards.library all_parsed_chunks = [] # 遍历当前library下的所有run和side for run, side in get_library_runs_sides(library): # 调用checkpoint获取该run+side组合的输出目录 checkpoint_dir = checkpoints.chunk_fastq.get( library=library, run=run, side=side ).output[0] # 提取目录下的所有chunk_id chunk_ids = glob_wildcards(f"{checkpoint_dir}/{{chunk_id}}.fastq.gz").chunk_id # 生成对应的parsed chunks路径 run_side_chunks = expand( "outputs/parsed_chunks/{library}.{run}.{chunk_id}.{custom_genome_name}.pairs.gz", library=library, run=run, chunk_id=chunk_ids, custom_genome_name=custom_genome_name, ) all_parsed_chunks.extend(run_side_chunks) return all_parsed_chunks
步骤3:验证中间规则的通配符匹配
确保parse_sort_chunks的输出通配符{chunk_id,[0-9]+}与checkpoint生成的数字型chunk_id(split -d生成的00、01等)匹配,避免路径匹配失败。
关键说明
- 利用已知的library-run映射关系,绕开合并规则缺少
run/side通配符的限制,通过遍历组合补全checkpoint所需的完整参数 - 每个run+side组合的chunk结果会被单独收集,最终汇总为整个library的所有分块文件,满足合并需求
内容的提问来源于stack exchange,提问作者Phlya
相关产品推荐
相关产品推荐

