【问题标题】:uproot question: The full TTree structure I can see in a TBrowser is not appearing in uprootuproot 问题:我可以在 TBrowser 中看到的完整 TTree 结构没有出现在 uproot 中
【发布时间】:2020-10-16 12:35:06
【问题描述】:

总结:运行uproot tutorial 时,TTree 分支似乎丢失了。

我有一个根文件,其中包含一个名为“prod”的 TTree,它有一组复杂的锯齿状叶子和分支,我可以在 ROOT 的 TBrowser 中看到这些叶子和分支。 我使用此根文件作为输入启动了 uproot 教程,并在交互式会话开始时收到以下错误:

>>>import uproot as up
>>> file = up.open('small.root')
>>> file
<ROOTDirectory b'small.root' at 0x025b5e3477c0>
>>> file.keys()
[b'prod;1']
>>> file.classnames()
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    file.classnames()
AttributeError: 'ROOTDirectory' object has no attribute 'classnames'
>>> file['prod']
<TTree b'prod' at 0x025b5dd15d00>

为什么我在尝试获取类名时会出错?

忽略这一点并继续前进。下一个问题是当我尝试查看 TTree 中的内容时 prod

>>> tree = file['prod']
>>> tree.keys()
[b'COSMIC', b'COSMICRES', b'COTNBC', b'COTTIME', b'GLB', b'LUM', b'MET', b'MU', b'PHOTON', b'RESIDUALS', b'TRACK', b'TRKDET', b'VERTEX', b'ZVTX', b'MOM_ntk', b'MOM_pt', b'MOM_px', b'MOM_py', b'MOM_pz']
>>> branches = tree.arrays(namedecode='utf-8')
>>> branches.keys()
dict_keys(['MET', 'MOM_ntk', 'MOM_pt', 'MOM_px', 'MOM_py', 'MOM_pz'])

uproot 教程暗示我应该得到所有的分支,但显然我错过了很多分支。特别是,唯一被转移的分支是那些我称之为“简单”的分支,因为它们只有数字数据成员。

其他分支中包含更多项目。例如,“MU”分支具有事件中每个 μ 子的属性。首先是这样的 μ 子的数量,然后是每个 μ 子属性的进一步分支,例如它的质量和与之相关的轨道编号。 “MET”、“MOM_ntk”、“MOM_pt”、“MOM_px”、“MOM_py”和“MOM_pz”都只包含浮点数列表。 MOM_ntk 每个事件只有一个编号(称为“alpha”),而其他 MOM 分支的每个分支中都有“alpha”编号。

该文件只有 1000 个事件,总大小只有 5MB 左右。

我想知道所有其他分支机构都去了哪里!我的朋友“COTNBC”或“GLB”在哪里(其中应该包含所有运行和事件编号)。

任何建议或帮助将不胜感激!


具有 32GB RAM 的 Windows 10 电脑 Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz x64 处理器

【问题讨论】:

    标签: python uproot


    【解决方案1】:

    根据您正在尝试做的事情和您获得的输出,您似乎期待 Uproot 4,但您拥有 Uproot 3。在 Uproot 4 与 Uproot 3 具有相同的功能之前,它将是在名为 uproot4 的包中(pip install uproot4import uproot4)。这样您就可以在此过渡期间同时使用两者。

    其中一个区别是 Uproot 3 的 keys() 方法不会通过分支的子分支递归,但 Uproot 4 会。 (两者都有一个 recurse=True/False 参数,但默认更改正是您所看到的原因。)

    名称更改(uproot4uprootuprootuproot3)将在年底前进行。 Uproot 4 只需要在此之前写入文件。

    【讨论】:

    • 您是否知道使用 6.0 之前的 root 版本制作的 uproot4 和 root 文件存在任何问题?此特定文件是在 ROOT 5.34 中制作的。
    • uproot4 使file.classnames() 方法在这个根文件上工作。还需要导入笨拙的 1 以使用 uproot4。 (只是说明这一点,以防其他人阅读。)但我遇到(也许)一个新问题。
    • 事实上,我仍然有一个问题,像“MU”这样更复杂的 tree.keys() 看起来像分支一样不可读。即使连根拔起4和笨拙1。
    • Uproot 测试(3 和 4)包括使用 5.23/02、5.24/00、5.25/02、5.26/00、5.27/02、5.28/00、5.29/02、5.30/ 制作的 ROOT 文件00 和 6.08/04 及更高版本。我认为 5.34 一定是 ROOT 5 沿袭的错误修复版本。兼容性的真正问题是文件中对象的版本号,但我们测试了一系列连续的 TTree、TBranch 和 TLeaf 版本号。
    • Uproot 4 应该能够读取比 Uproot 3 严格更大的数据类型集,但是在 C++ 的类型系统中仍然会有 Uproot 没有 Python 翻译的数据类型。如果“不可读”是指存在 UnknownInterpretation 异常,那么就是这样。您可以将其作为 GitHub 问题上的功能请求并包含示例文件。一个强大的动力是它是否是完成工作的严格要求,以及是否可以通过以“拆分”模式编写分支来使其易于阅读。您可能会在 GitHub 问题上找到其他示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多