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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:05:29