根本问题:无法理解特定的 '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 的。
我在 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 的。