【问题标题】:uproot: best way to load and replot a TH2 histogram from a .root file on a jupyter notebookuproot:从 jupyter notebook 上的 .root 文件加载和重新绘制 TH2 直方图的最佳方法
【发布时间】:2020-09-04 09:32:54
【问题描述】:

我对 python 和连根拔起非常陌生。以前,我一直在 C++ 环境中使用 ROOT。 按照 uproot 教程,我可以从 .root 文件中读取我的 TH2D 图

我现在想通过 matplotlib 或 seaborn 重新创建和重新绘制现有图形,但我没有得到导入的 TH2 的结构。 myTH2D._members() 输出正确:

['fName',
 'fTitle',
 'fLineColor',
 'fLineStyle',
 'fLineWidth',
 'fFillColor',
 'fFillStyle',
 'fMarkerColor',
 'fMarkerStyle',
 'fMarkerSize',
 'fNcells',
 'fXaxis',
 'fYaxis',
 'fZaxis',
 'fBarOffset',
 'fBarWidth',
 'fEntries',
 'fTsumw',
 'fTsumw2',
 'fTsumwx',
 'fTsumwx2',
 'fMaximum',
 'fMinimum',
 'fNormFactor',
 'fContour',
 'fSumw2',
 'fOption',
 'fFunctions',
 'fBufferSize',
 'fBuffer',
 'fBinStatErrOpt',
 'fScalefactor',
 'fTsumwy',
 'fTsumwy2',
 'fTsumwxy']

myTH2D.edges 输出正确的轴,myTH2D.values 输出正确的计数(用粗略的 plt.imshow(myTH2D.values) 确认。当我调用 myTH2D.pandas() 时问题就开始了

count   variance
tof1 [ns]   tof2 [ns]       
[-inf, 4500.0)  [-inf, 4500.0)  0.0 0.0
[4500.0, 4507.142857142857) 0.0 0.0
[4507.142857142857, 4514.285714285715)  0.0 0.0
[4514.285714285715, 4521.428571428572)  0.0 0.0
[4521.428571428572, 4528.571428571428)  0.0 0.0
... ... ... ...
[7500.0, inf)   [6971.428571428572, 6978.571428571429)  0.0 0.0
[6978.571428571429, 6985.714285714286)  0.0 0.0
[6985.714285714286, 6992.857142857143)  0.0 0.0
[6992.857142857143, 7000.0) 0.0 0.0
[7000.0, inf)   0.0 0.0
123904 rows × 2 columns

并且使用myTH2D.numpy() 创建的 ntuple 以我不理解的方式嵌套:

(array([[0., 0., 0., ..., 0., 0., 0.],
        [0., 0., 0., ..., 0., 0., 0.],
        ...,
        [0., 0., 0., ..., 0., 0., 0.],
        [0., 0., 0., ..., 0., 0., 0.]]),
 [(array([4500.        , 4508.57142857, 4517.14285714, 4525.71428571,
          4534.28571429, 4542.85714286, 4551.42857143, 4560.        ,
          ...,
          7414.28571429, 7422.85714286, 7431.42857143, 7440.        ,
          7448.57142857, 7457.14285714, 7465.71428571, 7474.28571429,
          7482.85714286, 7491.42857143, 7500.        ]),
   array([4500.        , 4507.14285714, 4514.28571429, 4521.42857143,
          4528.57142857, 4535.71428571, 4542.85714286, 4550.        ,
          ...,
          6957.14285714, 6964.28571429, 6971.42857143, 6978.57142857,
          6985.71428571, 6992.85714286, 7000.        ]))])

您对如何处理这些 ntuple 有什么建议吗?

谢谢!

编辑:

使用以下语法,我几乎可以实现正确的情节。与原版相比翻了一番:

plt.pcolormesh(myTH2D[1][0][0],myTH2D[1][0][1],myTH2D[0])

尽管如此,我的问题仍然存在:我希望通过 pandas 处理数据,因此有标签:现在我不知道哪个是 x 轴,哪个是 y 轴。有什么想法吗?

【问题讨论】:

  • 我会重塑 myTH2D.numpy(),但我没有得到结构本身:myTH2D.numpy()[0] 是 350x350 矩阵中的 z 值(计数)。 myTH2D.numpy()[1] 似乎在一个两行的列中同时具有 x 和 y 轴,其中一个是一个数组(?)。
  • Reshape 是正确的方法,但是在 numpy 中的转换是错误的策略。请考虑使用 pandas() 在 DataFrame 中进行转换,并使用数据透视表取消堆叠结果对象:stackoverflow.com/questions/63790713/…

标签: uproot


【解决方案1】:

uproot3 理解 numpy.histogram。所以你可以这样做:

import uproot3 as uproot
import numpy as np

x = np.random.normal(size=10000)
y = np.random.normal(size=10000)

f = uproot.recreate('example.root', compression=uproot.ZLIB(4))
f["h"] = np.histogram2d(x, y, 80)
f.close()

您现在应该在 example.root 中有一个名为 hTH2F

【讨论】:

    【解决方案2】:

    从边和 bin 计数数组 (myTH2D.numpy()),您可以使用这些技术中的任何一种在 Matplotlib 中绘制它:

    Python: Creating a 2D histogram from a numpy matrix

    您提到了 Seaborn,但我对此不太熟悉。肯定有类似的功能。

    在最前沿,您可以改为安装 uproot4hist>=2.0.0(以获取历史预发布),然后只需

    myTH2D.to_hist().plot()
    

    hist 库旨在成为直方图的一站式商店,它即将推出第一个非预发布版本。 (该系列从 2.0.0 开始,因为它接管了一个不再更新的项目的名称。“hist”通常是一个失去的名称!)

    Uproot 4 代码库几乎可以取代当前的 Uproot;它需要文档和文件编写能力。该接口与解决 Uproot 3 的接口问题(例如字符串与字节串)略有不同,因此这就是为什么将其作为具有临时不同库名称的渐进过渡来处理,而不是一次全部更改。但是,如果您刚刚开始,您可能希望从新库开始,这样您就不必在不久的将来(今年秋天)适应变化。

    【讨论】:

    • 感谢您的回答!在使用其中一种需要数组中的 x、y 和 z 的方法之前,我想了解 myTH2D.numpy() 的结构,以及如何提取/调用绘制 histos 所需的三个数组!我将尝试 uproot4,但首先我想了解 ntuple 的结构。
    • 我忘了提到包“mplhep”,它还将 NumPy 风格的直方图数据映射到绘图中(无需显式构建颜色网格)。我不记得在 Uproot 3 中是如何处理下溢和溢出 bin 的,但在 Uproot 4 中,它们总是包含在第一个和最后一个 bin 中(0-1)。在昨天对 master 的提交中,每个函数都被赋予了一个文档字符串,包括像 edgesvalues 这样的直方图函数,这应该有助于解释所有这些意味着什么。
    • "mphelp" 确实是针对具体问题的解决方案,但是numpy中的转换是错误的策略。请考虑在 DataFrame 中使用 pandas() 进行转换,并使用数据透视表取消堆叠结果对象
    • 你提醒我这个功能有多重要,我们需要在 Uproot 4 中拥有它:github.com/scikit-hep/uproot4/issues/91
    • 感谢您打开这个问题。我希望我能参加,但我觉得我的知识仍然太有限。
    猜你喜欢
    • 2018-12-10
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多