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

Add single item accessor for Evt

parent f05051af
No related branches found
No related tags found
1 merge request!27Refactor offline I/O
...@@ -11,7 +11,7 @@ BASKET_CACHE_SIZE = 110 * 1024**2 ...@@ -11,7 +11,7 @@ BASKET_CACHE_SIZE = 110 * 1024**2
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):
...@@ -22,13 +22,14 @@ def _nested_mapper(key): ...@@ -22,13 +22,14 @@ def _nested_mapper(key):
EXCLUDE_KEYS = set(["AAObject", "t", "fBits", "fUniqueID"]) EXCLUDE_KEYS = set(["AAObject", "t", "fBits", "fUniqueID"])
BRANCH_MAPS = [ BRANCH_MAPS = [
BranchMapper("tracks", "trks", {}, ['trks.usr_data', 'trks.usr'], {}, BranchMapper("tracks", "trks", {}, ['trks.usr_data', 'trks.usr'], {},
_nested_mapper), _nested_mapper, False),
BranchMapper("mc_tracks", "mc_trks", {}, BranchMapper("mc_tracks", "mc_trks", {},
['mc_trks.usr_data', 'mc_trks.usr'], {}, _nested_mapper), ['mc_trks.usr_data', 'mc_trks.usr'], {}, _nested_mapper,
BranchMapper("hits", "hits", {}, ['hits.usr'], {}, _nested_mapper), False),
BranchMapper("hits", "hits", {}, ['hits.usr'], {}, _nested_mapper, False),
BranchMapper("mc_hits", "mc_hits", {}, BranchMapper("mc_hits", "mc_hits", {},
['mc_hits.usr', 'mc_hits.dom_id', 'mc_hits.channel_id'], {}, ['mc_hits.usr', 'mc_hits.dom_id', 'mc_hits.channel_id'], {},
_nested_mapper), _nested_mapper, False),
BranchMapper("events", "Evt", { BranchMapper("events", "Evt", {
't_sec': 't.fSec', 't_sec': 't.fSec',
't_ns': 't.fNanoSec' 't_ns': 't.fNanoSec'
...@@ -37,7 +38,7 @@ BRANCH_MAPS = [ ...@@ -37,7 +38,7 @@ BRANCH_MAPS = [
'n_mc_hits': 'mc_hits', 'n_mc_hits': 'mc_hits',
'n_tracks': 'trks', 'n_tracks': 'trks',
'n_mc_tracks': 'mc_trks' 'n_mc_tracks': 'mc_trks'
}, lambda a: a), }, lambda a: a, True),
] ]
...@@ -124,10 +125,6 @@ class OfflineReader: ...@@ -124,10 +125,6 @@ class OfflineReader:
else: else:
warnings.warn("Your file header has an unsupported format") warnings.warn("Your file header has an unsupported format")
@cached_property
def usr(self):
return Usr(self._tree)
def get_best_reco(self): def get_best_reco(self):
"""returns the best reconstructed track fit data. The best fit is defined """returns the best reconstructed track fit data. The best fit is defined
as the track fit with the maximum reconstruction stages. When "nan" is as the track fit with the maximum reconstruction stages. When "nan" is
...@@ -469,13 +466,14 @@ class OfflineReader: ...@@ -469,13 +466,14 @@ class OfflineReader:
class Usr: class Usr:
"""Helper class to access AAObject usr stuff""" """Helper class to access AAObject usr stuff"""
def __init__(self, tree): def __init__(self, name, tree, index=slice(None)):
# Here, we assume that every event has the same names in the same order # Here, we assume that every event has the same names in the same order
# to massively increase the performance. This needs triple check if it's # to massively increase the performance. This needs triple check if it's
# always the case; the usr-format is simply a very bad design. # always the case; the usr-format is simply a very bad design.
self._name = name
try: try:
self._usr_names = [ self._usr_names = [
n.decode("utf-8") for n in tree['Evt']['usr_names'].array()[0] n.decode("utf-8") for n in tree['usr_names'].array()[0]
] ]
except (KeyError, IndexError): # e.g. old aanet files except (KeyError, IndexError): # e.g. old aanet files
self._usr_names = [] self._usr_names = []
...@@ -484,9 +482,9 @@ class Usr: ...@@ -484,9 +482,9 @@ class Usr:
name: index name: index
for index, name in enumerate(self._usr_names) for index, name in enumerate(self._usr_names)
} }
self._usr_data = tree['Evt']['usr'].lazyarray( self._usr_data = tree['usr'].lazyarray(
basketcache=uproot.cache.ThreadSafeArrayCache( basketcache=uproot.cache.ThreadSafeArrayCache(
BASKET_CACHE_SIZE)) BASKET_CACHE_SIZE))[index]
for name in self._usr_names: for name in self._usr_names:
setattr(self, name, self[name]) setattr(self, name, self[name])
...@@ -502,6 +500,9 @@ class Usr: ...@@ -502,6 +500,9 @@ class Usr:
entries.append("{}: {}".format(name, self[name])) entries.append("{}: {}".format(name, self[name]))
return '\n'.join(entries) return '\n'.join(entries)
def __repr__(self):
return "<{}[{}]>".format(self.__class__.__name__, self._name)
def _to_num(value): def _to_num(value):
"""Convert a value to a numerical one if possible""" """Convert a value to a numerical one if possible"""
...@@ -576,17 +577,30 @@ class Branch: ...@@ -576,17 +577,30 @@ class Branch:
def keys(self): def keys(self):
return self._keymap.keys() return self._keymap.keys()
@cached_property
def usr(self):
return Usr(self._mapper.name, self._branch, index=self._index)
def __getitem__(self, item): def __getitem__(self, item):
"""Slicing magic a la numpy""" """Slicing magic a la numpy"""
if isinstance(item, slice): if isinstance(item, slice):
return self.__class__(self._tree, self._mapper, index=item) return self.__class__(self._tree, self._mapper, index=item)
if isinstance(item, int): if isinstance(item, int):
return BranchElement( if self._mapper.flat:
self._mapper.name, { return BranchElement(
key: self._branch[self._keymap[key]].array()[self._index, self._mapper.name, {
item] key:
for key in self.keys() self._branch[self._keymap[key]].array()[self._index]
}) for key in self.keys()
})[item]
else:
return BranchElement(
self._mapper.name, {
key:
self._branch[self._keymap[key]].array()[self._index,
item]
for key in self.keys()
})
if isinstance(item, tuple): if isinstance(item, tuple):
return self[item[0]][item[1]] return self[item[0]][item[1]]
return self._branch[self._keymap[item]].lazyarray( return self._branch[self._keymap[item]].lazyarray(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment