1

我正在尝试使用 uproot 从 Delphes .root 输出文件中进行一些基本选择。Delphes 的 c++ 代码示例循环遍历事件并访问重构的 BranchElements,它具有访问属于各种类的分支元素的方法。

例如,根文件包含一个<TBranchElement b'Jet' at 0x7fb36526b3c8>(在 c++ 中)Delphes 示例代码可以用来进入object=jet->Constituents.At(i)“for”循环,然后如果这object是一个object->IsA() == Tower::Classthen 调用object->P4()来获取 4momentum。因此,虽然使用 uproot 只能分别获取这两个值,但在 Delphes 示例中,使用 Jet 类使用一种方法来访问 Tower 类(从中重建 Jet)。

我看到的信息是:

    Jet_size                   (no streamer)              asdtype('>i4')
    Jet                        TStreamerInfo              asdtype('>i4')
    Jet.fUniqueID              TStreamerBasicType         asjagged(asdtype('>u4'))
.
.
.
    Jet.Constituents           TStreamerInfo              asgenobj(SimpleArray(TRefArray))


<TBranchElement b'Jet' at 0x7fb3657825f8>

<TBranchElement b'Jet.Constituents' at 0x7fb47840cba8>

对于 uproot,如果将 TBranchElement 作为数组加载,则只能访问 中的数组元素Jet.Constituents[i],它们是数字列表。我如何能够以Jet.Constituents引用Tower.PT它包含的(或 eta、phi 等)值的方式加载?

4

1 回答 1

1

如果您有一个 数组TRefs,则可以将它们直接用作另一个集合的整数索引。(请参阅本教程,从 开始In[29],了解整数数组索引的一般介绍,包括 Numpy 和 Awkward 数组。)

也就是说,如果您有一个 数组TRef,如本例所示

import uproot
t = uproot.open("issue324.root")["Delphes"]
refs = t["Track.Particle"].array()
refs.id
# <JaggedArray [
#      [752 766 780 ... 1813 1367 1666]
#      ...
#      [745 762 783 ... 1863 1713 1717]]>

给你索引和

pt = t["Particle.PT"].array()

你要引用的数组,所以

pt[refs.id - 1]
# <JaggedArray [
#      [0.7637838 1.1044897 5.463864 ... 4.252923 1.9702696 9.213475]
#      ...
#      [1.2523094 0.37887865 0.7390242 ... 1.0288503 3.4785874 1.804613]]>

选择感兴趣的值(纠正这些索引以 开头和 Python 索引以 开头pt的事实)。10

TRefArray如果您有一个如本例中所示的数组,

t["Tower.Particles"].array()
# <ObjectArray [[[1414, 1418, 1471, 1571], [1447], [1572],
#               ...,
#               [864, 1325], [992, 1437], [1262, 1501]]]>

它实际上是ObjectArray根据需要从数据中生成子数组的(因为 ROOT 本身并不存储双重锯齿状数据)。您可以JaggedArrays通过调用awkward.fromiter它们将它们转换为本机:

import awkward
a = awkward.fromiter(t["Tower.Particles"].array())
# <JaggedArray [[[1414 1418 1471 1571] [1447] [1572] 
#                ...
#                [864 1325] [992 1437] [1262 1501]]]>

然后在任何双重锯齿状集合中使用这些双重锯齿状索引(其中所有元素数量都排成一行,就像您引用的集合一样)。

于 2019-10-11T16:36:13.133 回答