Snakemake多通配符配置:按唯一ID分组处理文件
Snakemake按ID分组处理多Patch文件解决方案
问题描述
给定一批命名格式为{唯一ID}_{patch信息}.tif的TIFF文件,需将同一ID下的所有patch文件交由单个Job处理,输出对应PNG文件(替换原文件后缀为.png)。当前编写的Snakemake规则未按预期解析通配符,无法实现分组处理。
示例输入文件:
93965_0_0_16000_16000.tif 93965_0_16000_16000_12799.tif 93965_16000_0_14548_16000.tif 93965_16000_16000_14548_12799.tif 93966_0_0_16000_16000.tif 93966_0_16000_16000_3800.tif 93966_16000_0_2980_16000.tif 93966_16000_16000_2980_3800.tif 93967_0_0_16000_16000.tif 93967_0_16000_16000_12799.tif 93967_16000_0_16000_16000.tif 93967_16000_16000_16000_12799.tif 93967_32000_0_2365_16000.tif 93967_32000_16000_2365_12799.tif 94297_0_0_16000_16000.tif 94297_0_16000_16000_16000.tif 94297_0_32000_16000_16000.tif 94297_0_48000_16000_7799.tif 94297_16000_0_16000_16000.tif 94297_16000_16000_16000_16000.tif 94297_16000_32000_16000_16000.tif
当前尝试的规则(未达预期)
rule process: input: '{id}_{patch}.tif' output: './output_{id}_{patch}.png' wildcard_constraints: patch = "\d+_\d+_\d+_\d+.*" shell: """ bash command {wildcard.id} """
解决方案
要实现同一ID下多patch文件由单个Job处理,需按ID分组收集输入文件,并确保输出与输入一一对应,具体实现如下:
1. 提取唯一ID集合
在Snakemake脚本开头添加Python代码,从输入文件中提取所有唯一ID:
import glob import os # 收集所有tif文件路径 tif_files = glob.glob("*.tif") # 提取每个文件名的第一个下划线前的部分作为ID,去重后排序 unique_ids = sorted(list(set(os.path.basename(f).split('_')[0] for f in tif_files)))
2. 编写分组处理规则
通过动态匹配生成每个ID对应的输入输出列表,实现单Job处理同一ID下的所有文件:
rule all: input: # 生成所有预期的PNG输出文件路径 expand("./output_{id}_{patch}.png", id=unique_ids, patch=[os.path.basename(f).split('_', 1)[1].replace('.tif', '') for f in tif_files]) rule process_id_group: input: # 动态获取当前ID对应的所有tif文件 lambda wildcards: glob.glob(f"{wildcards.id}_*.tif") output: # 动态生成当前ID对应的所有png输出文件 lambda wildcards: [f"./output_{os.path.basename(f).replace('.tif', '.png')}" for f in glob.glob(f"{wildcards.id}_*.tif")] shell: """ # 替换为实际的批量处理命令 for tif in {input}; do png="./output_$(basename "$tif" .tif).png" # 示例转换命令(可根据需求替换) convert "$tif" "$png" done """
3. 关键说明
- 分组逻辑:通过
lambda wildcards结合glob动态收集同一ID下的所有输入文件,确保单个Job处理该ID的全部patch。 - 通配符优化:避免了原规则中
patch通配符的模糊匹配问题,直接通过文件名拆分和路径匹配获取准确的输入输出列表。 - 输出对应:严格保证每个TIFF文件都有对应的PNG输出,完全符合需求。
内容的提问来源于stack exchange,提问作者PPenton
相关产品推荐
相关产品推荐

