ATLAS Offline Software
Loading...
Searching...
No Matches
python.RootUtils.RootFileDumper Class Reference
Inheritance diagram for python.RootUtils.RootFileDumper:
Collaboration diagram for python.RootUtils.RootFileDumper:

Public Types

typedef HLT::TypeInformation::for_each_type_c< typenameEDMLIST::map, my_functor, my_result<>, my_arg< HLT::TypeInformation::get_cont, CONTAINER > >::type result

Public Member Functions

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

Public Attributes

bool allgood = True
 root_file = ROOT.TFile.Open(fname)
 obj_name = name
 obj = ROOT.RNTupleReader.Open(obj)
 tree = self.obj

Protected Member Functions

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

Protected Attributes

list _trees = []

Private Member Functions

 __init_obj (self, obj_name)

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.

Member Typedef Documentation

◆ result

Definition at line 90 of file EDM_MasterSearch.h.

Constructor & Destructor Documentation

◆ __init__()

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
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,...

Member Function Documentation

◆ __init_obj()

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()

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

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()

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

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
void print(char *figname, TCanvas *c1)
STL class.

◆ _tree_dump()

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

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()

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
-event-from-file

Member Data Documentation

◆ _trees

list python.RootUtils.RootFileDumper._trees = []
protected

Definition at line 234 of file RootUtils.py.

◆ allgood

bool python.RootUtils.RootFileDumper.allgood = True

Definition at line 223 of file RootUtils.py.

◆ obj

python.RootUtils.RootFileDumper.obj = ROOT.RNTupleReader.Open(obj)

Definition at line 269 of file RootUtils.py.

◆ obj_name

python.RootUtils.RootFileDumper.obj_name = name

Definition at line 254 of file RootUtils.py.

◆ root_file

python.RootUtils.RootFileDumper.root_file = ROOT.TFile.Open(fname)

Definition at line 225 of file RootUtils.py.

◆ tree

python.RootUtils.RootFileDumper.tree = self.obj

Definition at line 275 of file RootUtils.py.


The documentation for this class was generated from the following file: