如何使用outout加载引用值(TRefArray)

2024-09-25 00:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用outlot从Delphes.root输出文件中进行一些基本选择。Delphes的c++代码示例是循环事件和访问重构的BranchElements,这些BranchElements具有访问属于不同类的分支元素的方法。你知道吗

例如,根文件包含一个<TBranchElement b'Jet' at 0x7fb36526b3c8>(在c++中)Delphes示例代码可以使用它来获取“for”循环中的object=jet->Constituents.At(i),如果这个objectobject->IsA() == Tower::Class,则调用object->P4()来获取4momentum。 因此,虽然使用outlot只能分别获得这两个值,但在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>

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


Tags: 文件代码元素示例objectattowerjet
1条回答
网友
1楼 · 发布于 2024-09-25 00:34:31

如果有一个TRefs数组,可以直接将它们用作另一个集合的整数索引。(请参见this tutorial,从In[29]开始,了解整数数组索引的一般介绍,包括Numpy数组和尴尬数组。)

也就是说,如果有一个TRef数组,如this example

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]]>

选择感兴趣的pt值(纠正了这些索引以1开头,Python索引以0开头的事实)。你知道吗

如果有一个TRefArray数组,如this example

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

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

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

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

相关问题 更多 >