Reading branch leafs with pyROOT

I have a tree structure as following:

image

I want to get values of the “global_time_stamp” leaf in the Plane_0 object.

My code I would expect to work:

import ROOT

f_flame = ROOT.TFile("/afs/desy.de/user/d/dudarboh/FCAL/synchronization/fire1036_srs184_FIRE.root")
t_flame = f_flame.TreeOnFire
for event in t_flame:
    event_time = event.GetLeaf("Plane_0.global_time_stamp").GetValue()
    print(event_time)

return:

TClass::Init:0: RuntimeWarning: no dictionary for class Plane is available
TClass::Init:0: RuntimeWarning: no dictionary for class TimeFrame is available
Traceback (most recent call last):
  File "sync.py", line 33, in <module>
    event_time = event.GetLeaf("Plane_0.global_time_stamp").GetValue()
ReferenceError: attempt to access a null-pointer

or accessing it by dot operators like this:
event_time = event.Plane_0.global_time_stamp

return:

TClass::Init:0: RuntimeWarning: no dictionary for class Plane is available
TClass::Init:0: RuntimeWarning: no dictionary for class TimeFrame is available
Traceback (most recent call last):
  File "sync.py", line 33, in <module>
    event_time = event.Plane_0.global_time_stamp
AttributeError: 'Plane' object has no attribute 'global_time_stamp'

BUT

I can acces these variables by:

event_time = event.GetLeaf("global_time_stamp").GetValue()
return:
expected behavior

Additional info:
print(event.GetLeaf("global_time_stamp").GetFullName())
return:
Plane_0.global_time_stamp

Questions:
Is this expected behaviour? Or what am I doing wrong?
How do I access Plane_1, Plane_2, etc…

ROOT file is here for testing.

cheers,
Bohdan

ROOT Version: 6.22/00
Platform: Centos 7
Python: 3.7.6


Hi Bohdan,

The GetLeaf() call by default returns the first leaf with a matching name, therefore it picks the one in the Plane_0 branch. You can call GetLeaf() with two parameters to ask for a leaf in a given branch, e.g.

GetLeaf("Plane_1", "global_time_stamp")

Cheers,
Jakob

You can call GetLeaf() with two parameters

This doesn’t work for me…

Example:

import ROOT

f_fire = ROOT.TFile("/afs/desy.de/user/d/dudarboh/FCAL/synchronization/fire1036_srs184_FIRE.root")
t_fire = f_fire.TreeOnFire

for event in t_fire:
    print(event.GetLeaf("Plane_0","global_time_stamp").GetValue())

Output:

TClass::Init:0: RuntimeWarning: no dictionary for class Plane is available
TClass::Init:0: RuntimeWarning: no dictionary for class TimeFrame is available
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    print(event.GetLeaf("Plane_0","global_time_stamp").GetValue())
ReferenceError: attempt to access a null-pointer

ROOT version: 6.22/00
Python version: 3.7.6
System: RedHat CentOS 7.9.2009
Data file to reproduce the error is attached in the previous post.

Strange, I just tried your script and for it works actually with both, the dot notation and the call with two parameters. Can you try with the latest ROOT 6.22/06.

I just checked with ROOT 6.22/06 on lxplus.cern.ch: the dot notation works, the two parameter version doesn’t. Both versions work with the ROOT master branch.

Ok, true, both work on master…

cheers,
Bohdan