如何用Python筛选ROOT文件TTree分支并修改分支名称?
最优实现方案
Python环境下优先选用uproot实现该需求,该方案不需要依赖完整ROOT框架,读写效率远高于PyROOT绑定方案,且完全支持你提到的uproot.recreate创建新ROOT文件的操作。
核心实现逻辑
你只需要提前构造旧分支名到新分支名的映射字典,仅把需要保留的40个分支纳入映射范围,读取原TTree时只加载目标分支,重命名后直接写入新文件即可,步骤如下:
- 定义分支映射规则:键为原文件旧分支名,值为修改后的新分支名
- 读取原ROOT文件内的目标TTree,仅加载映射范围内的分支
- 按映射关系重命名分支后,写入新ROOT文件的TTree中
可直接运行的示例代码
import uproot # 按需修改为你自己的分支映射规则,仅保留需要的40个分支即可 branch_mapping = { "old_branch_1": "new_branch_1", "old_branch_2": "new_branch_2", # 剩余38个分支的映射关系自行补全 } # 读取原ROOT文件的TTree,替换为你自己的原文件名和TTree名 with uproot.open("input.root:your_old_tree_name") as old_tree: # 仅加载目标分支,避免多余内存占用 selected_data = old_tree.arrays(filter_name=list(branch_mapping.keys())) # 按映射规则重命名分支 renamed_data = {branch_mapping[old_name]: selected_data[old_name] for old_name in branch_mapping} # 创建新ROOT文件,写入重命名后的TTree with uproot.recreate("output.root") as new_file: # 可自行修改新TTree的名称,也可保留和原TTree一致的名称 new_file["your_new_tree_name"] = renamed_data
特殊场景适配
- 如果需要保留原分支的压缩参数、单位、注释等元信息,可在读取时通过
old_tree[old_branch].title、old_tree[old_branch].compression等属性取出元信息,写入新文件时传入对应参数即可 - 数据量过大内存不足时,可指定
arrays方法的entry_start、entry_stop参数分块读写,逐段写入新TTree
内容的提问来源于stack exchange,提问作者Dizzy
相关产品推荐
相关产品推荐

