如何筛选.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))
关键细节说明
- 正则匹配逻辑:
r'Ch(\d+)$'专门匹配名称末尾的Ch+数字组合,确保不会误匹配名称中间的相似字符(比如你的命名格式是ChM在末尾,这个正则完全适用)。 - 集合优化:把通道列表转成集合后,判断元素是否存在的时间复杂度从O(n)降到O(1),通道数量越多,效率提升越明显。
- 路径兼容:如果直方图名称是带路径的格式(比如
Name/NameEvent1Ch0),key.GetName()会返回完整路径名,正则依然能正确提取末尾的通道号,无需额外处理。
内容的提问来源于stack exchange,提问作者Beth Long
相关产品推荐
相关产品推荐

