Extract data from histogram as numpy array

I have a histogram (from a TTree) holding an oscilloscope waveform. I would like to apply a low-pass filter to the data, but don’t see easy ways to do this in ROOT, so I plan to pull out the x/y data to numpy arrays, and then use scipy for signal processing (e.g. scipy.signal.savgol_filter).

But how do I get the y-values from the histogram?

I’ve tried:

>>> y = hist.GetArray()
<read-write buffer ptr 0x7fdc10f35400, size 2147483647 at 0x111a06b70>
>>> print y[1]
-0.07441392540931702

which looks promising, but

>>> np.array(hist.GetArray())
 *** Break *** segmentation violation
[<unknown binary>]
[<unknown binary>]
[<unknown binary>]
...

I could loop and do GetBinContent() but figured that there must be a more efficient way.

Thanks

‘y’ will have a method SetSize(), into which you can pass the number of bins from the histo, then the np iteration will stop appropriately

That worked wonderfully:

>>> y = hist.GetArray()
>>> y.SetSize(hist.GetNbinsX())
>>> y = np.array(y)

Also, this apparently works as well:

yvals = np.array(hist)[1:-1]   # cut off over/underflow bins

(where np.array(hist) returns an array whose length is hist.GetNbinsX()+2)

How about for the x-values (the bins)?

In particular, I try:

>>> hist.GetXaxis().GetBinLowEdge(100)
-0.0003521595096514321
>>> x = hist.GetXaxis().GetXbins()
>>> x
<ROOT.TArrayD object at 0x7fd415027df8>
>>> np.array(x)
array([], dtype=float64)
### try comparable approach to the y-values...
>>> x.Set(hist.GetNbinsX())
>>> np.array(x)
array([ 0.,  0.,  0., ...,  0.,  0.,  0.])

So I can convert to a numpy array, but the resulting array is all zeros…

1 Like

Hi,

That’s not a python issue, the TAxis returns nullptr for equidistant bins. And I agree that the documentation is too minimalistic…

I.e. If GetXbins() is null you could use xrange for the “array”.

Cheers, Axel

I see. So since I know that my bins are equally spaced, this works for me:

>>> np.linspace(h.GetXaxis().GetXmin(), h.GetXaxis().GetXmax()-h.GetXaxis().GetBinWidth(1), num=h.GetNbinsX())

(where h is the histogram).

Thanks for the help!

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.