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

如何筛选.root文件中末尾含指定通道号的直方图并分类?

解决ROOT文件中带事件号的直方图按通道号分类问题

首先明确你的错误原因:root_file.Get()方法只能接收字符串类型的直方图名称,你传了re.compile()生成的正则对象,自然会报类型错误。

正确思路是先遍历ROOT文件里所有直方图的名称,用正则提取每个名称中的通道号,再根据通道号所属列表分类。具体实现如下:

完整代码实现

import ROOT
import re

# 定义通道分组
x_channels = [8,7,9,6,10,5,11,4,12,3,13,2,14,1,15,0]
y_channels = [27,28,26,29,25,30,24,31,23,16,22,17,21,18,20,19]
# 转集合提升查找效率
x_channels_set = set(x_channels)
y_channels_set = set(y_channels)

# 打开目标ROOT文件
root_file = ROOT.TFile.Open("your_target_file.root")

# 初始化结果列表
analogues_x = []
analogues_y = []

# 正则表达式:匹配名称末尾的Ch+数字,捕获通道号
channel_pattern = re.compile(r'Ch(\d+)$')

# 遍历文件中所有对象
for key in root_file.GetListOfKeys():
    hist_full_name = key.GetName()
    # 提取通道号
    match_result = channel_pattern.search(hist_full_name)
    if match_result:
        channel_num = int(match_result.group(1))
        # 根据通道号分组
        if channel_num in x_channels_set:
            analogues_x.append(root_file.Get(hist_full_name))
        elif channel_num in y_channels_set:
            analogues_y.append(root_file.Get(hist_full_name))

关键细节说明

  1. 正则匹配逻辑:r'Ch(\d+)$'专门匹配名称末尾的Ch+数字组合,确保不会误匹配名称中间的相似字符(比如你的命名格式是ChM在末尾,这个正则完全适用)。
  2. 集合优化:把通道列表转成集合后,判断元素是否存在的时间复杂度从O(n)降到O(1),通道数量越多,效率提升越明显。
  3. 路径兼容:如果直方图名称是带路径的格式(比如Name/NameEvent1Ch0),key.GetName()会返回完整路径名,正则依然能正确提取末尾的通道号,无需额外处理。

内容的提问来源于stack exchange,提问作者Beth Long

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:16:27