Skip to content
Snippets Groups Projects
Commit 5990fcc8 authored by Tamas Gal's avatar Tamas Gal :speech_balloon:
Browse files

Preliminary usr readout for flat branches

parent de84bbd9
No related branches found
No related tags found
1 merge request!27Refactor offline I/O
...@@ -12,7 +12,7 @@ EXCLUDE_KEYS = set(["AAObject", "t", "fBits", "fUniqueID"]) ...@@ -12,7 +12,7 @@ EXCLUDE_KEYS = set(["AAObject", "t", "fBits", "fUniqueID"])
BranchMapper = namedtuple( BranchMapper = namedtuple(
"BranchMapper", "BranchMapper",
['name', 'key', 'extra', 'exclude', 'update', 'attrparser']) ['name', 'key', 'extra', 'exclude', 'update', 'attrparser', 'flat'])
def _nested_mapper(key): def _nested_mapper(key):
...@@ -33,7 +33,8 @@ EVENTS_MAP = BranchMapper(name="events", ...@@ -33,7 +33,8 @@ EVENTS_MAP = BranchMapper(name="events",
'n_tracks': 'trks', 'n_tracks': 'trks',
'n_mc_tracks': 'mc_trks' 'n_mc_tracks': 'mc_trks'
}, },
attrparser=lambda a: a) attrparser=lambda a: a,
flat=True)
SUBBRANCH_MAPS = [ SUBBRANCH_MAPS = [
BranchMapper( BranchMapper(
...@@ -42,7 +43,8 @@ SUBBRANCH_MAPS = [ ...@@ -42,7 +43,8 @@ SUBBRANCH_MAPS = [
extra={}, extra={},
exclude=['trks.usr_data', 'trks.usr', 'trks.fUniqueID', 'trks.fBits'], exclude=['trks.usr_data', 'trks.usr', 'trks.fUniqueID', 'trks.fBits'],
update={}, update={},
attrparser=_nested_mapper), attrparser=_nested_mapper,
flat=False),
BranchMapper(name="mc_tracks", BranchMapper(name="mc_tracks",
key="mc_trks", key="mc_trks",
extra={}, extra={},
...@@ -51,7 +53,8 @@ SUBBRANCH_MAPS = [ ...@@ -51,7 +53,8 @@ SUBBRANCH_MAPS = [
'mc_trks.fitinf', 'mc_trks.fUniqueID', 'mc_trks.fBits' 'mc_trks.fitinf', 'mc_trks.fUniqueID', 'mc_trks.fBits'
], ],
update={}, update={},
attrparser=_nested_mapper), attrparser=_nested_mapper,
flat=False),
BranchMapper(name="hits", BranchMapper(name="hits",
key="hits", key="hits",
extra={}, extra={},
...@@ -60,7 +63,8 @@ SUBBRANCH_MAPS = [ ...@@ -60,7 +63,8 @@ SUBBRANCH_MAPS = [
'hits.pure_a', 'hits.fUniqueID', 'hits.fBits' 'hits.pure_a', 'hits.fUniqueID', 'hits.fBits'
], ],
update={}, update={},
attrparser=_nested_mapper), attrparser=_nested_mapper,
flat=False),
BranchMapper(name="mc_hits", BranchMapper(name="mc_hits",
key="mc_hits", key="mc_hits",
extra={}, extra={},
...@@ -70,7 +74,8 @@ SUBBRANCH_MAPS = [ ...@@ -70,7 +74,8 @@ SUBBRANCH_MAPS = [
'mc_hits.fUniqueID', 'mc_hits.fBits' 'mc_hits.fUniqueID', 'mc_hits.fBits'
], ],
update={}, update={},
attrparser=_nested_mapper), attrparser=_nested_mapper,
flat=False),
] ]
...@@ -123,40 +128,72 @@ class OfflineReader: ...@@ -123,40 +128,72 @@ class OfflineReader:
class Usr: class Usr:
"""Helper class to access AAObject `usr`` stuff""" """Helper class to access AAObject `usr`` stuff"""
def __init__(self, mapper, tree, index=None):
# Here, we assume that every event has the same names in the same order def __init__(self, mapper, branch, index=None):
# to massively increase the performance. This needs triple check if self._mapper = mapper
# it's always the case; the usr-format is simply a very bad design. self._name = mapper.name
self._name = mapper.key
self._index = index self._index = index
self._branch = branch
self._usr_names = []
self._usr_idx_lookup = {}
try: try:
tree[mapper.key + branch['usr']
'.usr'] # This will raise a KeyError in old aanet files # This will raise a KeyError in old aanet files
# which has a different strucuter and key (usr_data) # which has a different strucuter and key (usr_data)
# We do not support those... # We do not support those
self._usr_names = [ except (KeyError, IndexError):
n.decode("utf-8")
for n in tree[mapper.key + '.usr_names'].lazyarray(
basketcache=BASKET_CACHE)[0]
]
except (KeyError, IndexError): # e.g. old aanet files
print("The `usr` fields could not be parsed for the '{}' branch.". print("The `usr` fields could not be parsed for the '{}' branch.".
format(self._name)) format(self._name))
self._usr_names = [] return
if mapper.flat:
self._initialise_flat()
else: else:
self._usr_idx_lookup = { # self._initialise_nested()
name: index # branch[self._mapper.key + '.usr']
for index, name in enumerate(self._usr_names) pass
}
data = tree[mapper.key + def _initialise_flat(self):
'.usr'].lazyarray(basketcache=BASKET_CACHE) # Here, we assume that every event has the same names in the same order
if index is not None: # to massively increase the performance. This needs triple check if
data = data[index] # it's always the case.
self._usr_data = data self._usr_names = [
for name in self._usr_names: n.decode("utf-8")
setattr(self, name, self[name]) for n in self._branch['usr_names'].lazyarray(
basketcache=BASKET_CACHE)[0]
]
self._usr_idx_lookup = {
name: index
for index, name in enumerate(self._usr_names)
}
data = self._branch['usr'].lazyarray(basketcache=BASKET_CACHE)
if self._index is not None:
data = data[self._index]
self._usr_data = data
for name in self._usr_names:
setattr(self, name, self[name])
def _initialise_nested(self):
self._usr_names = [
n.decode("utf-8") for n in self.branch['usr_names'].lazyarray(
# TODO this will be fixed soon in uproot,
# see https://github.com/scikit-hep/uproot/issues/465
uproot.asgenobj(uproot.SimpleArray(uproot.STLVector(uproot.STLString())), self.branch['usr_names']._context, 6),
basketcache=BASKET_CACHE)[0]
]
self.__getitem__ = self.__getitem_nested__
def __getitem__(self, item): def __getitem__(self, item):
if self._mapper.flat:
return self.__getitem_flat__(item)
return self.__getitem_nested__(item)
def __getitem_flat__(self, item):
if self._index is not None: if self._index is not None:
return self._usr_data[self._index][:, self._usr_idx_lookup[item]] return self._usr_data[self._index][:, self._usr_idx_lookup[item]]
else: else:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment