如何在 Python 中使用 uproot 读取 TMatrixT?

How do I read a TMatrixT with uproot in Python?

我有一个 *.root 文件,我正在尝试使用 uproot (uproot4) 读入 Python。它看起来像这样:

>>> data = up.open('file.root')
>>> data.keys()
['ring_sums;1', 'tpc_multiplicity;1', 'impact_parameter;1']
>>> data['ring_sums']
<TMatrixT<double> (version 4) at 0x0205b219d748>

如何读取 TMatrixT 类型?使用 .keys()、.values() 和 .items() 不起作用。

>>> data['ring_sums'].values()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Model_TMatrixT_3c_double_3e__v4' object has no attribute 'values'

将数据读出到笨拙数组、pandas 数据帧或 numpy 数组的正确方法是什么?

TMatrixT 是一个 class Uproot 还没有任何专门的代码(还?),但无论如何都可以读取它,因为它的“流”(反序列化指令)包含在 ROOT 文件中.因此,它以一种相当通用的方式呈现。

您可以在 all_members (dict) 中找到一个对象的所有成员数据,或者使用 member("memberName") 方法只提取一个。因此,例如,try

data['ring_sums'].member("fElements")

因为 TMatrixT::fElements seems to be relevant. These will probably come out as an unshaped NumPy array (or uproot.models.TArray,它是 NumPy 数组的子class)。您可能需要 reshape 将它变成正确的形式,并且可能会在其他成员中找到合适的形状(可能属于超级class)。

如果您找到使用 TMatrixT 对象的好方法并希望它变得自动化,也许在 values 方法中,请将其添加为 pull request or describe it as a feature request 用于 Uproot(a新的“行为”)。