ATLAS Offline Software
Public Member Functions | Public Attributes | Private Member Functions | Private Attributes | List of all members
python.RootUtils.RootFileDumper Class Reference
Inheritance diagram for python.RootUtils.RootFileDumper:
Collaboration diagram for python.RootUtils.RootFileDumper:

Public Member Functions

def __init__ (self, fname, tree_name=None)
 
def dump (self, tree_name, itr_entries, leaves=None, retvecs=False, sortleaves=True)
 

Public Attributes

 allgood
 
 root_file
 
 obj_name
 
 obj
 
 tree
 

Private Member Functions

def __init_obj (self, obj_name)
 
def _dump (self, obj, itr_entries, leaves=None, retvecs=False, sortleaves=True)
 
def _tree_dump (self, tree, itr_entries, leaves=None, retvecs=False, sortleaves=True)
 
def _reader_dump (self, reader, itr_entries, leaves=None, retvecs=False, sortleaves=True)
 

Private Attributes

 _trees
 

Detailed Description

A helper class to dump in more or less human readable form the content of
any TTree.

Definition at line 211 of file RootUtils.py.

Constructor & Destructor Documentation

◆ __init__()

def python.RootUtils.RootFileDumper.__init__ (   self,
  fname,
  tree_name = None 
)

Definition at line 217 of file RootUtils.py.

217  def __init__(self, fname, tree_name=None):
218  object.__init__(self)
219 
220  ROOT = import_root()
221 
222  # remember if an error or problem occurred during the dump
223  self.allgood = True
224 
225  self.root_file = ROOT.TFile.Open(fname)
226  if (self.root_file is None or
227  not isinstance(self.root_file, ROOT.TFile) or
228  not self.root_file.IsOpen()):
229  raise IOError('could not open [%s]'% fname)
230 
231  self.__init_obj(tree_name)
232 
233  if 0:
234  self._trees = []
235  keys = [k.GetName() for k in self.root_file.GetListOfKeys()]
236  for k in keys:
237  o = self.root_file.Get(k)
238  if isinstance(o, ROOT.TTree):
239  self._trees.append(k)
240  pass
241 
242  return
243 

Member Function Documentation

◆ __init_obj()

def python.RootUtils.RootFileDumper.__init_obj (   self,
  obj_name 
)
private

Definition at line 244 of file RootUtils.py.

244  def __init_obj(self, obj_name):
245 
246  ROOT = import_root()
247  from PyUtils.PoolFile import PoolOpts
248  TTreeNames = PoolOpts.TTreeNames
249  RNTupleNames = PoolOpts.RNTupleNames
250 
251  if obj_name is None:
252  for name, klass in ((TTreeNames.EventData, ROOT.TTree), (RNTupleNames.EventData, ROOT.RNTuple)):
253  if (obj := self.root_file.Get(name)) and isinstance(obj, klass):
254  self.obj_name = name
255  break
256  else:
257  raise AttributeError('No TTree named %r or RNTuple named %r in file %r' %
258  (TTreeNames.EventData, RNTupleNames.EventData,
259  self.root_file.GetName()))
260  else:
261  if (not (obj := self.root_file.Get(obj_name)) or
262  not isinstance(obj, ROOT.TTree) and not isinstance(obj, ROOT.RNTuple)):
263  raise AttributeError('No TTree or RNTuple named %r in file %r' %
264  (obj_name, self.root_file.GetName()))
265  self.obj_name = obj_name
266 
267  if isinstance(obj, ROOT.RNTuple):
268  try:
269  self.obj = ROOT.RNTupleReader.Open(obj)
270  except AttributeError:
271  self.obj = ROOT.Experimental.RNTupleReader.Open(obj)
272  elif isinstance(obj, ROOT.TTree):
273  self.obj = obj
274  # in case it is used somewhere
275  self.tree = self.obj
276 

◆ _dump()

def python.RootUtils.RootFileDumper._dump (   self,
  obj,
  itr_entries,
  leaves = None,
  retvecs = False,
  sortleaves = True 
)
private

Definition at line 277 of file RootUtils.py.

277  def _dump(self, obj, itr_entries, leaves=None, retvecs=False, sortleaves=True):
278  ROOT = import_root()
279  try:
280  RNTupleReader = ROOT.RNTupleReader
281  except AttributeError:
282  RNTupleReader = ROOT.Experimental.RNTupleReader
283  if isinstance(obj, ROOT.TTree):
284  yield from self._tree_dump(obj, itr_entries, leaves, retvecs, sortleaves)
285  elif isinstance(obj, RNTupleReader):
286  yield from self._reader_dump(obj, itr_entries, leaves, retvecs, sortleaves)
287  else:
288  raise NotImplementedError("'_dump' not implemented for object of class=%r" %
289  (obj.__class__.__name__,))
290 

◆ _reader_dump()

def python.RootUtils.RootFileDumper._reader_dump (   self,
  reader,
  itr_entries,
  leaves = None,
  retvecs = False,
  sortleaves = True 
)
private

Definition at line 408 of file RootUtils.py.

408  def _reader_dump(self, reader, itr_entries, leaves=None, retvecs=False, sortleaves=True):
409 
410  ROOT = import_root()
411  import AthenaPython.PyAthena as PyAthena
412  _pythonize = PyAthena.RootUtils.PyROOTInspector.pyroot_inspect2
413 
414  ntuple_name = self.obj_name
415  nentries = reader.GetNEntries()
416  from operator import methodcaller
417  if leaves is not None:
418  leaves = sorted(leaves)
419  else:
420  leaves = sorted(map(methodcaller('GetFieldName'), reader.GetDescriptor().GetTopLevelFields()))
421 
422  # handle itr_entries
423  if isinstance(itr_entries, str):
424  if ':' in itr_entries:
425  def toint(s):
426  if s == '':
427  return None
428  try:
429  return int(s)
430  except ValueError:
431  return s
432  from itertools import islice
433  itr_entries = islice(range(nentries),
434  *map(toint, itr_entries.split(':')))
435  elif ('range' in itr_entries or
436  ',' in itr_entries):
437  itr_entries = eval(itr_entries)
438  else:
439  try:
440  _n = int(itr_entries)
441  itr_entries = range(_n)
442  except ValueError:
443  print ("** err ** invalid 'itr_entries' argument. will iterate over all entries.")
444  itr_entries = range(nentries)
445  elif isinstance(itr_entries, list):
446  itr_entries = itr_entries
447  else:
448  itr_entries = range(itr_entries)
449 
450  list_ = list
451  map_ = map
452  str_ = str
453  isinstance_ = isinstance
454 
455  try:
456  from ROOT import RException
457  except ImportError:
458  from ROOT.Experimental import RException
459 
460  try:
461  entry = reader.CreateEntry()
462  except AttributeError:
463  entry = reader.GetModel().CreateEntry()
464 
465  for ientry in itr_entries:
466  try:
467  reader.LoadEntry(ientry, entry)
468  except RException as err:
469  from traceback import format_exception
470  import sys
471  print("Exception reading entry=%05i of ntuple %r\n%s" %
472  (ientry, ntuple_name, "".join(format_exception(err))), file=sys.stderr)
473  self.allgood = False
474  continue
475 
476  for br_name in leaves:
477  py_name = [br_name]
478  token = entry.GetToken(br_name)
479  typeName = entry.GetTypeName(token)
480  # Make sure dictionaries are completely loaded before
481  # trying to fetch it from ROOT. Otherwise we can run
482  # into cling parse failures due to it synthesizing
483  # incorrect forward declarations.
484  # See ATEAM-1000.
485  getattr(ROOT, typeName)
486  val = entry[token]
487  if val is not None:
488  try:
489  vals = _pythonize(val, py_name, True, retvecs)
490  except Exception as err:
491  print("**err** for branch [%s] val=%s (type=%s)" %
492  (br_name, val, type(val)))
493  self.allgood = False
494  print(err)
495  if sortleaves:
496  viter = sorted(vals, key = lambda x: '.'.join(s for s in x[0] if isinstance_(s, str_)))
497  else:
498  viter = vals
499  for o in viter:
500  n = list_(map_(str_, o[0]))
501  v = o[1]
502  yield ntuple_name, ientry, n, v
503 
504 

◆ _tree_dump()

def python.RootUtils.RootFileDumper._tree_dump (   self,
  tree,
  itr_entries,
  leaves = None,
  retvecs = False,
  sortleaves = True 
)
private

Definition at line 297 of file RootUtils.py.

297  def _tree_dump(self, tree, itr_entries, leaves=None, retvecs=False, sortleaves=True):
298 
299  ROOT = import_root()
300  import AthenaPython.PyAthena as PyAthena
301  _pythonize = PyAthena.RootUtils.PyROOTInspector.pyroot_inspect2
302 
303  tree_name = self.obj_name
304  nentries = tree.GetEntries()
305  if leaves is not None:
306  leaves = [str(b).rstrip('\0') for b in leaves]
307  leaves.sort()
308  else:
309  leaves = sorted([b.GetName().rstrip('\0') for b in tree.GetListOfBranches()])
310 
311  # handle itr_entries
312  if isinstance(itr_entries, str):
313  if ':' in itr_entries:
314  def toint(s):
315  if s == '':
316  return None
317  try:
318  return int(s)
319  except ValueError:
320  return s
321  from itertools import islice
322  itr_entries = islice(range(nentries),
323  *map(toint, itr_entries.split(':')))
324  elif ('range' in itr_entries or
325  ',' in itr_entries):
326  itr_entries = eval(itr_entries)
327  else:
328  try:
329  _n = int(itr_entries)
330  itr_entries = range(_n)
331  except ValueError:
332  print ("** err ** invalid 'itr_entries' argument. will iterate over all entries.")
333  itr_entries = range(nentries)
334  elif isinstance(itr_entries, list):
335  itr_entries = itr_entries
336  else:
337  itr_entries = range(itr_entries)
338 
339  list_ = list
340  map_ = map
341  str_ = str
342  isinstance_ = isinstance
343 
344  for ientry in itr_entries:
345  hdr = ":: entry [%05i]..." % (ientry,)
346  #print (hdr)
347  #print (hdr, file=self.fout)
348  err = tree.LoadTree(ientry)
349  if err < 0:
350  print ("**err** loading tree for entry",ientry)
351  self.allgood = False
352  break
353 
354  nbytes = tree.GetEntry(ientry)
355  if nbytes <= 0:
356  print ("**err** reading entry [%s] of tree [%s]" % (ientry, tree_name))
357  hdr = ":: entry [%05i]... [ERR]" % (ientry,)
358  print (hdr)
359  self.allgood = False
360  continue
361 
362  for br_name in leaves:
363  hdr = ":: branch [%s]..." % (br_name,)
364  #print (hdr)
365  #tree.GetBranch(br_name).GetEntry(ientry)
366  _vals = list()
367 
368  br = tree.GetBranch (br_name)
369  if br.GetClassName() != '':
370  # Make sure dictionaries are completely loaded before
371  # trying to fetch it from ROOT. Otherwise we can run
372  # into cling parse failures due to it synthesizing
373  # incorrect forward declarations.
374  # See ATEAM-1000.
375  getattr (ROOT, br.GetClassName())
376  val = getattr(tree, br_name)
377  _vals += [ ([br_name], val) ]
378  else:
379  for l in br.GetListOfLeaves():
380  if (br.GetNleaves() == 1 and (br_name == l.GetName() or
381  br_name.endswith('.' + l.GetName()))):
382  _vals += [ ([br_name], _getLeaf (l)) ]
383  else:
384  _vals += [ ([br_name, l.GetName()], _getLeaf (l)) ]
385  for py_name, val in _vals:
386  if val is None: continue
387  try:
388  vals = _pythonize(val, py_name, True, retvecs)
389  except Exception as err:
390  print ("**err** for branch [%s] val=%s (type=%s)" % (
391  br_name, val, type(val),
392  ))
393  self.allgood = False
394  print (err)
395  if sortleaves:
396  viter = sorted(vals, key = lambda x: '.'.join(s for s in x[0] if isinstance_(s, str_)))
397  else:
398  viter = vals
399  for o in viter:
400  n = list_(map_(str_, o[0]))
401  v = o[1]
402  yield tree_name, ientry, n, v
403 
404  pass # loop over branch names
405  pass # loop over entries

◆ dump()

def python.RootUtils.RootFileDumper.dump (   self,
  tree_name,
  itr_entries,
  leaves = None,
  retvecs = False,
  sortleaves = True 
)

Definition at line 291 of file RootUtils.py.

291  def dump(self, tree_name, itr_entries, leaves=None, retvecs=False, sortleaves=True):
292  if (tree_name is None and getattr(self, "obj_name", None) is None or
293  tree_name is not None and getattr(self, "obj_name", None) != tree_name):
294  self.__init_obj(tree_name)
295  yield from self._dump(self.obj, itr_entries, leaves, retvecs, sortleaves)
296 

Member Data Documentation

◆ _trees

python.RootUtils.RootFileDumper._trees
private

Definition at line 234 of file RootUtils.py.

◆ allgood

python.RootUtils.RootFileDumper.allgood

Definition at line 223 of file RootUtils.py.

◆ obj

python.RootUtils.RootFileDumper.obj

Definition at line 269 of file RootUtils.py.

◆ obj_name

python.RootUtils.RootFileDumper.obj_name

Definition at line 254 of file RootUtils.py.

◆ root_file

python.RootUtils.RootFileDumper.root_file

Definition at line 225 of file RootUtils.py.

◆ tree

python.RootUtils.RootFileDumper.tree

Definition at line 275 of file RootUtils.py.


The documentation for this class was generated from the following file:
DerivationFramework::TriggerMatchingUtils::sorted
std::vector< typename R::value_type > sorted(const R &r, PROJ proj={})
Helper function to create a sorted vector from an unsorted range.
dumpHVPathFromNtuple.append
bool append
Definition: dumpHVPathFromNtuple.py:91
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
python.RootUtils.import_root
def import_root(batch=True)
functions --------------------------------------------------------------—
Definition: RootUtils.py:22
run_Egamma1_LArStrip_Fex.dump
dump
Definition: run_Egamma1_LArStrip_Fex.py:87
Get
T * Get(TFile &f, const std::string &n, const std::string &dir="", const chainmap_t *chainmap=0, std::vector< std::string > *saved=0)
get a histogram given a path, and an optional initial directory if histogram is not found,...
Definition: comparitor.cxx:181
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
python.processes.powheg.ZZ.ZZ.__init__
def __init__(self, base_directory, **kwargs)
Constructor: all process options are set here.
Definition: ZZ.py:18
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
str
Definition: BTagTrackIpAccessor.cxx:11