根本问题:无法理解特定的 'branch'

Uproot issue: Trouble making sense of a particular 'branch'

我在 python 中打开了一个根文件:

file = uproot.open('C:\Users\me\Documents\test.root')
print(file.keys())
[b'evts;1', b'miscAccum;1', b'cal;1', b'configstr;1', b'time;1', b'Plugs;1', b'acc;1']
print(file[b'Plugs'].keys())
[b'veto;1', b'miscAccum;1', b'calfine;1']

一切都很好,但是如果我尝试使用 print(file[b'time'].keys()) 探索时间分支,我会收到一条错误消息

'TVectorT_3c_double_3e_' object has no attribute 'keys'

我如何探索这个分支中的价值?

目录 (uproot.ReadOnlyDirectory) and TTrees (uproot.TTree) 是可以启动更多阅读的对象,因此它们可以作为具有 keys() 和方括号语法 (__getitem__) 的映射来导航。

此对象显然具有 class 类型 TVectorT_3c_double_3e_(Python 模型,uproot.Model, of C++ class TVectorT<double>). Some objects like this have custom "behaviors," which are user-friendly properties and methods. For example, the model of TParameter<double> has a value property (see uproot.behaviors.TParameter)。这个没有。

当 Uproot 读取一个对象并且没有自定义行为时,您仍然可以通过 uproot.Model.member method or the uproot.Model.all_members 属性 (dict) 访问其 C++ 私有成员数据。事实上,高层行为是这样实现的:C++ 私有成员数据的读取是自动的,但是人类必须通过编写函数来设计高层 API,以更用户友好的方式访问它们,这是发生在TParameter<double> 但还没有 TVectorT<double>

(一阶,ROOT有无穷多个class)

所以,明确地说,做

file["time"].all_members

看看你得到了什么。


另一件事,与此无关:我注意到您正在使用 Uproot 3,因为所有密钥都是 bytes 而不是 str。由于您没有维护遗留脚本,因此您应该升级到 Uproot 4。自 2020 年 12 月起,Uproot 4 只是“uproot”:

pip install uproot awkward

(通常,你也想要笨拙的数组,所以我把它包含在 pip-install 中。你可能需要 pip uninstall 你现在拥有的版本重新开始。)

我上面描述的文档链接和界面都是针对 Uproot 4 的。