【问题标题】:Reading TTree Friend with uproot连根拔起阅读 TTree 朋友
【发布时间】:2020-06-08 23:11:10
【问题描述】:

是否有与 uproot 等效的 TTree::AddFriend() ? 我在 2 个不同的文件中有 2 个并行树,我需要使用 uproot.iterate 和使用解释(设置 uproot.iterate 的“分支”选项)读取它们。

也许我可以通过从文件上的 iterate() 调用手动获取多个迭代器,然后在每个迭代器上调用 next() 来做到这一点……但也许有一种类似于 AddFriend 的更简单的方法?

感谢任何提示!

编辑:我不确定我是否清楚,所以这里有更多细节。我的问题不是关于数组的使用,而是关于如何从不同的文件中读取它们。这是我正在做的一个模型:

# I will fill this array and give it as input to my DNN
# it's very big so I will fill it in place

bigarray = ndarray( (2,numentries),...)

# get a handle on a tree, just to be able to build interpretations :
t0 = .. first tree in input_files
interpretations = dict(
    a=t0['a'].interpretation.toarray(bigarray[0]),
    b=t0['b'].interpretation.toarray(bigarray[1]),
    )
# iterate with :
uproot.iterate( input_files, treename,
                branches = interpretations )    

如果ab 属于两个不同文件中的两棵树呢?

【问题讨论】:

  • 没有理由将它们混合在相同的解释中或尝试在单个命令中读取它们。尝试从一个文件中独立于另一个文件中的b 读取a,然后合并数组以为您的 DNN 提供输入。您可以轻松做到这一点取决于它们是否以相同的顺序表示相同的事件。如果他们不这样做,您需要按照我在下面的描述进行JOIN
  • 原因是方便,假设两棵树中的事件确实是对齐的,这就是 TTree::AddFriend 的设计目的。无论如何,再次感谢您的回答!

标签: numpy root-framework uproot


【解决方案1】:

在基于数组的编程中,朋友是隐含的:您可以在事后JOIN 任意两列——您不必提前将它们声明为朋友。

在最简单的情况下,如果您的数组ab 具有相同的长度和相同的顺序,您可以将它们一起使用,例如a + bab 是否来自同一个文件并不重要。即使我有这些是锯齿状的(如jets.phi)而另一个不是(如met.phi),你仍然可以,因为非锯齿状数组将被广播以匹配锯齿状数组。

请注意,awkward.Tableawkward.JaggedArray.zip 可以将数组组合成单个 Table 或锯齿状 Table 以进行记账。

如果两个数组的顺序不同,可能是因为每个写入器都是单独并行化的,那么您将需要一些列作为键,将一个数组的行与另一个数组的不同行关联起来。这是一个经典的数据库风格JOIN,虽然 Uproot 和 Awkward 没有为它提供例程,但 Pandas 提供了。 (在 Pandas 文档中查找“合并、连接和连接”——有很多内容!)您可以通过使用 awkward.topandas 函数准备列来保持 Pandas 中数组的锯齿状。

下期讨论了很多此类事情,尽管下期中的用户必须加入文件集,而不仅仅是一棵树。 (原则上,一个进程必须先查看所有文件以查看哪些文件包含哪些密钥:分布式数据库问题。)即使您的情况不是这样,您也可能会在那里找到更多提示以了解如何开始。

https://github.com/scikit-hep/uproot/issues/314

【讨论】:

  • 非常感谢吉姆的回答。我编辑了我的帖子,因为我不确定我是否足够清楚。
  • 忘了说:我正在调查您指向的链接。但我没有使用 pandas,所以不确定它是否与我的情况有关。
猜你喜欢
  • 2017-12-15
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2012-05-29
  • 2015-10-21
  • 1970-01-01
  • 2014-03-23
  • 2013-08-15
相关资源
最近更新 更多