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

Merge branch 'master' of git.km3net.de:km3py/km3io

parents a2168b95 e7eb425b
No related branches found
No related tags found
No related merge requests found
Pipeline #6940 failed
...@@ -2,16 +2,25 @@ import uproot ...@@ -2,16 +2,25 @@ import uproot
class AanetReader: class AanetReader:
"""Reader for one Aanet ROOT file"""
def __init__(self, file_path): def __init__(self, file_path):
""" AanetReader class is a Aanet ROOT file wrapper
Parameters
----------
file_path : path-like object
Path to the file of interest. It can be a str or any python
path-like object that points to the file of ineterst.
"""
self.file_path = file_path self.file_path = file_path
self.data = uproot.open(self.file_path)['E'] self.data = uproot.open(self.file_path)['E']
self.lazy_data = self.data.lazyarrays() self.lazy_data = self.data.lazyarrays()
self._valid_keys = None self._events_keys = None
self._hits_keys = None self._hits_keys = None
self._tracks_keys = None self._tracks_keys = None
def read_event(self, key: str): def __getitem__(self, key):
"""event_reader function reads data stored in a branch of interest in an event tree. """reads data stored in the branch of interest in an event tree.
Parameters Parameters
---------- ----------
...@@ -21,111 +30,55 @@ class AanetReader: ...@@ -21,111 +30,55 @@ class AanetReader:
Returns Returns
------- -------
lazyarray lazyarray
Lazyarray of all data stored in a branch of interest (in an event tree). A lazyarray is an array-like Lazyarray of all data stored in the branch of interest. A lazyarray
object that reads data on demand. Here, only the first and last chunks of data are is an array-like object that reads data on demand. Here, only the
read in memory, and not all data in the array. The output of event_reader can be used first and last chunks of data are read in memory, and not all data
with all `Numpy's universal functions <https://docs.scipy.org/doc/numpy/reference/ufuncs.html>`. in the array. The output can be used with all `Numpy's universal
functions <https://docs.scipy.org/doc/numpy/reference/ufuncs.html>`
.
Raises Raises
------ ------
NameError KeyEroor
Some branches in an Aanet file structure are "fake branches" and do not contain data. Therefore, Some branches in an Aanet file structure are "fake branches" and do
the keys corresponding to these fake branches are not read. not contain data. Therefore, the keys corresponding to these fake
branches are not read.
""" """
evt_tree = self.data['Evt'] if key not in self.keys() and not isinstance(key, int):
evt_keys = self._event_keys(evt_tree) raise KeyError(f"'{key}' is not a valid key or is a fake branch.")
if key in evt_keys: return self.lazy_data[key]
evt_key_lazy = self.lazy_data[key]
return evt_key_lazy
else:
raise KeyError(
"{} could not be found or is a fake branch".format(key))
def read_hits(self, key: str):
"""hits_reader function reads data stored in a branch of interest in hits tree from an Aanet
event file.
Parameters
----------
hits_key : str
name of the branch of interest in hits tree.
Returns def __len__(self):
------- return len(self.lazy_data)
lazyarray
Lazyarray of all data stored in a branch of interest (in hits tree). A lazyarray is an array-like
object that reads data on demand. Here, only the first and last chunks of data are
read in memory, and not all data in the array. The output of event_reader can be used
with all `Numpy's universal functions <https://docs.scipy.org/doc/numpy/reference/ufuncs.html>`.
Raises
------
NameError
the hits.key stored in an Aanet file must be used to access the branch of interest
from hits tree data.
"""
hits_tree = self.data['Evt']['hits']
keys = [key.decode('utf8') for key in hits_tree.keys()]
if key in keys:
hits_key_lazy = self.lazy_data[key]
return hits_key_lazy
else:
raise KeyError("{} is not a valid hits key".format(key))
def read_tracks(self, key: str): def __repr__(self):
"""tracks_reader function reads data stored in a branch of interest in tracks tree return '\n'.join([
from an Aanet event file. f"Number of events: {self.__len__()}",
"Events keys are:\n\t" + '\n\t'.join(self.events_keys),
"Hits keys are:\n\t" + '\n\t'.join(self.hits_keys),
"Tracks keys are:\n\t" + '\n\t'.join(self.tracks_keys)
])
Parameters def keys(self):
---------- """constructs a list of all valid keys to be read from an Aanet event file.
tracks_key : str
name of the branch of interest in tracks tree.
Returns Returns
------- -------
lazyarray list
Lazyarray of all data stored in a branch of interest (in tracks tree). A lazyarray is an array-like list of all valid keys.
object that reads data on demand. Here, only the first and last chunks of data are
read in memory, and not all data in the array. The output of event_reader can be used
with all `Numpy's universal functions <https://docs.scipy.org/doc/numpy/reference/ufuncs.html>`.
Raises
------
NameError
the trks.key stored in an Aanet file must be used to access the branch of interest
from tracks tree data.
""" """
tracks_tree = self.data['Evt']['trks'] return self.events_keys + self.hits_keys + self.tracks_keys
keys = [key.decode('utf8') for key in tracks_tree.keys()]
if key in keys:
tracks_key_lazy = self.lazy_data[key]
return tracks_key_lazy
else:
raise KeyError("{} is not a valid tracks key".format(key))
@property @property
def valid_keys(self, evt_tree): def events_keys(self):
"""_event_keys function returns a list of all the keys of interest if self._events_keys is None:
for data analysis, and removes the keys of empty "fake branches"
found in Aanet event files.
Parameters
----------
evt_tree : aanet event (Evt) tree.
Returns
-------
list of str
list of all the event keys.
"""
if self._valid_keys is None:
fake_branches = ['Evt', 'AAObject', 'TObject', 't'] fake_branches = ['Evt', 'AAObject', 'TObject', 't']
t_baskets = ['t.fSec', 't.fNanoSec'] t_baskets = ['t.fSec', 't.fNanoSec']
self._valid_keys = [ self._events_keys = [
key.decode('utf-8') for key in evt_tree.keys() key.decode('utf-8') for key in self.data['Evt'].keys()
if key.decode('utf-8') not in fake_branches if key.decode('utf-8') not in fake_branches
] + t_baskets ] + t_baskets
return self._valid_keys return self._events_keys
@property @property
def hits_keys(self): def hits_keys(self):
......
%% Cell type:code id: tags:
``` python
# Add file to current python path
from pathlib import Path
import sys
sys.path.append(str(Path.cwd().parent))
Path.cwd()
print(sys.path)
```
%% Output
['/home/zineb/km3net/km3net/km3io/notebooks', '/home/zineb/miniconda3/envs/km3pipe/lib/python37.zip', '/home/zineb/miniconda3/envs/km3pipe/lib/python3.7', '/home/zineb/miniconda3/envs/km3pipe/lib/python3.7/lib-dynload', '', '/home/zineb/miniconda3/envs/km3pipe/lib/python3.7/site-packages', '/home/zineb/miniconda3/envs/km3pipe/lib/python3.7/site-packages/IPython/extensions', '/home/zineb/.ipython', '/home/zineb/km3net/km3net/km3io']
%% Cell type:code id: tags:
``` python
from km3io import AanetReader
```
%% Cell type:code id: tags:
``` python
# test samples directory - aanet test file
files_path = Path.cwd().parent / 'tests/samples'
aanet_file = files_path / 'aanet_v2.0.0.root'
```
%% Cell type:code id: tags:
``` python
reader = AanetReader(aanet_file)
reader
```
%% Output
Number of events: 10
Events keys are:
id
det_id
mc_id
run_id
mc_run_id
frame_index
trigger_mask
trigger_counter
overlays
hits
trks
w
w2list
w3list
mc_t
mc_hits
mc_trks
comment
index
flags
t.fSec
t.fNanoSec
Hits keys are:
hits.id
hits.dom_id
hits.channel_id
hits.tdc
hits.tot
hits.trig
hits.pmt_id
hits.t
hits.a
hits.pos.x
hits.pos.y
hits.pos.z
hits.dir.x
hits.dir.y
hits.dir.z
hits.pure_t
hits.pure_a
hits.type
hits.origin
hits.pattern_flags
Tracks keys are:
trks.fUniqueID
trks.fBits
trks.usr_data
trks.usr_names
trks.id
trks.pos.x
trks.pos.y
trks.pos.z
trks.dir.x
trks.dir.y
trks.dir.z
trks.t
trks.E
trks.len
trks.lik
trks.type
trks.rec_type
trks.rec_stages
trks.status
trks.mother_id
trks.fitinf
trks.hit_ids
trks.error_matrix
trks.comment
%% Cell type:code id: tags:
``` python
# big lazyarray with ALL file data!
lazy_data = reader.lazy_data
lazy_data
```
%% Output
<Table [<Row 0> <Row 1> <Row 2> ... <Row 7> <Row 8> <Row 9>] at 0x7f9011f02b50>
%% Cell type:code id: tags:
``` python
# getting the run_id for a specific event (event 5 for example)
reader[5]['run_id']
```
%% Output
5971
%% Cell type:code id: tags:
``` python
# one can check how many hits are in event 5
reader[5]['hits']
```
%% Output
60
%% Cell type:code id: tags:
``` python
# one can also check how many tracks are in event 5
reader[5]['trks']
```
%% Output
56
%% Cell type:code id: tags:
``` python
# the user is reminded to always specify the "correct" event/hits/tracks
# key in the Aanet event file
try:
reader['whatever']
except KeyError as e:
print(e)
```
%% Output
"'whatever' is not a valid key or is a fake branch."
%% Cell type:markdown id: tags:
# Now let's explore in more details the hits:
%% Cell type:code id: tags:
``` python
# reading all data from a specific branch in hits data: for example
# 'hits.dom_id'
reader['hits.dom_id']
```
%% Output
<ChunkedArray [[806451572 806451572 806451572 ... 809544061 809544061 809544061] [806451572 806451572 806451572 ... 809524432 809526097 809544061] [806451572 806451572 806451572 ... 809544061 809544061 809544061] ... [806451572 806455814 806465101 ... 809526097 809544058 809544061] [806455814 806455814 806455814 ... 809544061 809544061 809544061] [806455814 806455814 806455814 ... 809544058 809544058 809544061]] at 0x7f9011eb3b10>
%% Cell type:code id: tags:
``` python
# the user can access hits.dom_id data for a specific event (for example
# event 5)
reader['hits.dom_id'][5]
```
%% Output
array([806455814, 806487219, 806487219, 806487219, 806487226, 808432835,
808432835, 808432835, 808432835, 808432835, 808432835, 808432835,
808451904, 808451904, 808451907, 808451907, 808469129, 808469129,
808469129, 808493910, 808949744, 808949744, 808951460, 808951460,
808956908, 808961655, 808964908, 808969848, 808969857, 808972593,
808972593, 808972598, 808972598, 808972698, 808972698, 808974758,
808974811, 808976377, 808981510, 808981523, 808981812, 808982005,
808982005, 808982018, 808982077, 808982077, 808982547, 809007627,
809521500, 809521500, 809521500, 809524432, 809526097, 809526097,
809526097, 809526097, 809526097, 809526097, 809526097, 809544058],
dtype=int32)
%% Cell type:code id: tags:
``` python
# We previsouly checked (using reader[5]['hits']) that event
# 5 has 60 hits, now we can see that reader['hits.dom_id'][5]
# has exaclty 60 dom ids as well!
len(reader['hits.dom_id'][5])
```
%% Output
60
%% Cell type:code id: tags:
``` python
# one can access a dom id of the first hit
reader['hits.dom_id'][5][0]
```
%% Output
806455814
%% Cell type:markdown id: tags:
# Now let's explore in more details the tracks:
%% Cell type:code id: tags:
``` python
# reading all data from a specific branch in tracks data:
reader['trks.dir.z']
```
%% Output
<ChunkedArray [[-0.872885221293917 -0.872885221293917 -0.872885221293917 ... -0.6631226836266504 -0.5680647731737454 -0.5680647731737454] [-0.8351996698137462 -0.8351996698137462 -0.8351996698137462 ... -0.7485107718446855 -0.8229838871876581 -0.239315690284641] [-0.989148723802379 -0.989148723802379 -0.989148723802379 ... -0.9350162572437829 -0.88545604390297 -0.88545604390297] ... [-0.5704611045902105 -0.5704611045902105 -0.5704611045902105 ... -0.9350162572437829 -0.4647231989130516 -0.4647231989130516] [-0.9779941383490359 -0.9779941383490359 -0.9779941383490359 ... -0.88545604390297 -0.88545604390297 -0.8229838871876581] [-0.7396916780974963 -0.7396916780974963 -0.7396916780974963 ... -0.6631226836266504 -0.7485107718446855 -0.7485107718446855]] at 0x7f9011ebdf10>
%% Cell type:code id: tags:
``` python
# the user can access trks.dir.z data for a specific event (for example
# event 5)
reader['trks.dir.z'][5]
```
%% Output
array([-0.60246049, -0.60246049, -0.60246049, -0.51420541, -0.5475772 ,
-0.5772408 , -0.56068238, -0.64907684, -0.67781799, -0.66565114,
-0.63014839, -0.64566464, -0.62691012, -0.58465493, -0.59287533,
-0.63655091, -0.63771247, -0.73446841, -0.7456636 , -0.70941246,
-0.66312268, -0.66312268, -0.56806477, -0.56806477, -0.66312268,
-0.66312268, -0.74851077, -0.74851077, -0.66312268, -0.74851077,
-0.56806477, -0.74851077, -0.66312268, -0.74851077, -0.56806477,
-0.66312268, -0.56806477, -0.66312268, -0.56806477, -0.56806477,
-0.66312268, -0.74851077, -0.66312268, -0.93501626, -0.56806477,
-0.74851077, -0.66312268, -0.56806477, -0.82298389, -0.74851077,
-0.66312268, -0.56806477, -0.82298389, -0.56806477, -0.66312268,
-0.97094183])
%% Cell type:code id: tags:
``` python
# We previsouly checked (using reader[5]['trks']) that event
# 5 has 56 tracks, now we can see that reader['trks.dir.z'][5]
# has exaclty 56 values of trks.dir.z as well!
len(reader['trks.dir.z'][5])
```
%% Output
56
%% Cell type:code id: tags:
``` python
# one can access the first trks.dir.z from event 5 using
reader['trks.dir.z'][5][0]
```
%% Output
-0.6024604933159441
This diff is collapsed.
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