1

我在 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_' 对象没有属性 'keys'

如何探索此分支中的值?

4

1 回答 1

2

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

该对象显然具有类类型( C++ 类TVectorT_3c_double_3e_的 Python 模型uproot.ModelTVectorT<double>)。像这样的一些对象具有自定义的“行为”,它们是用户友好的属性和方法。例如,模型TParameter<double>有一个value属性(参见uproot.behaviors.TParameter)。这个没有。

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

(首先,ROOT 有无限多的类。)

所以,明确地说,做

file["time"].all_members

看看你得到了什么。


与此无关的另一件事:我注意到您使用的是 Uproot 3,因为所有键都是bytes而不是str. 由于您没有维护旧版脚本,因此您应该升级到 Uproot 4。自 2020 年 12 月以来,Uproot 4 只是“uproot”:

pip install uproot awkward

通常,您也需要 Awkward Array,因此我将其包含在 pip-install 中。您可能需要pip uninstall现在拥有的版本才能获得全新的版本。)

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

于 2022-01-12T16:20:48.640 回答