Skip to content
Snippets Groups Projects

Resolve "uproot4 integration"

Merged Tamas Gal requested to merge 58-uproot4-integration-2 into master
Compare and Show latest version
4 files
+ 89
32
Compare changes
  • Side-by-side
  • Inline
Files
4
+ 54
10
@@ -87,7 +87,7 @@ class EventReader:
def _initialise_keys(self):
skip_keys = set(self.skip_keys)
all_keys = set(self._fobj[self.event_path].keys())
all_keys = set(self._fobj[self.event_path].keys())
toplevel_keys = set(k.split("/")[0] for k in all_keys)
valid_aliases = {}
for fromkey, tokey in self.aliases.items():
@@ -169,15 +169,46 @@ class EventReader:
if from_field in branch[key].keys():
fields.append(to_field)
log.debug(fields)
return Branch(branch[key], fields, self.nested_branches[key], self._index_chain)
return Branch(
branch[key], fields, self.nested_branches[key], self._index_chain
)
else:
return unfold_indices(branch[self.aliases.get(key, key)].array(), self._index_chain)
return unfold_indices(
branch[self.aliases.get(key, key)].array(), self._index_chain
)
def __iter__(self):
self._events = self._event_generator()
def __iter__(self, chunkwise=False):
self._events = self._event_generator(chunkwise=chunkwise)
return self
def _event_generator(self):
def _get_iterator_limits(self):
"""Determines start and stop, used for event iteration"""
if len(self._index_chain) > 1:
raise NotImplementedError(
"iteration is currently not supported with nested slices"
)
if self._index_chain:
s = self._index_chain[0]
if not isinstance(s, slice):
raise NotImplementedError("iteration is only supported with slices")
if s.step is None or s.step == 1:
start = s.start
stop = s.stop
else:
raise NotImplementedError(
"iteration is only supported with single steps"
)
else:
start = None
stop = None
return start, stop
def _event_generator(self, chunkwise=False):
start, stop = self._get_iterator_limits()
if chunkwise:
raise NotImplementedError("iterating over chunks is not implemented yet")
events = self._fobj[self.event_path]
group_count_keys = set(
k for k in self.keys() if k.startswith("n_")
@@ -195,7 +226,11 @@ class EventReader:
log.debug("keys: %s", keys)
log.debug("aliases: %s", self.aliases)
events_it = events.iterate(
keys, aliases=self.aliases, step_size=self._step_size
keys,
aliases=self.aliases,
step_size=self._step_size,
entry_start=start,
entry_stop=stop,
)
nested = []
nested_keys = (
@@ -208,6 +243,8 @@ class EventReader:
self.nested_branches[key].keys(),
aliases=self.nested_branches[key],
step_size=self._step_size,
entry_start=start,
entry_stop=stop,
)
)
group_counts = {}
@@ -276,6 +313,7 @@ class EventReader:
class Branch:
"""Helper class for nested branches likes tracks/hits"""
def __init__(self, branch, fields, aliases, index_chain):
self._branch = branch
self.fields = fields
@@ -284,7 +322,9 @@ class Branch:
def __getattr__(self, attr):
if attr not in self._aliases:
raise AttributeError(f"No field named {attr}. Available fields: {self.fields}")
raise AttributeError(
f"No field named {attr}. Available fields: {self.fields}"
)
key = self._aliases[attr]
if self._index_chain:
@@ -293,7 +333,9 @@ class Branch:
# optimise single-element and slice lookups
start = idx0
stop = idx0 + 1
arr = ak.flatten(self._branch[key].array(entry_start=start, entry_stop=stop))
arr = ak.flatten(
self._branch[key].array(entry_start=start, entry_stop=stop)
)
return unfold_indices(arr, self._index_chain[1:])
if isinstance(idx0, slice):
if idx0.step is None or idx0.step == 1:
@@ -305,7 +347,9 @@ class Branch:
return unfold_indices(self._branch[key].array(), self._index_chain)
def __getitem__(self, key):
return self.__class__(self._branch, self.fields, self._aliases, self._index_chain + [key])
return self.__class__(
self._branch, self.fields, self._aliases, self._index_chain + [key]
)
def __len__(self):
if not self._index_chain:
Loading