DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
HDF5Reader.py
Go to the documentation of this file.
1"""
2Generic HDF5Reader class to read and store data.
3"""
4from hdf5libs import HDF5RawDataFile
5from tqdm import tqdm
6
7import abc
8
9
10class HDF5Reader(abc.ABC):
11 """
12 Abstract reader class for HDF5 files.
13
14 Derived classes must complete all methods
15 decorated with @abc.abstractmethod.
16 """
17
18 # Useful print colors
19 _FAIL_TEXT_COLOR = '\033[91m'
20 _WARNING_TEXT_COLOR = '\033[93m'
21 _BOLD_TEXT = '\033[1m'
22 _END_TEXT_COLOR = '\033[0m'
23
24
25 def __init__(self, filename: str, verbosity: int = 0, batch_mode: bool = False) -> None:
26 """
27 Loads a given HDF5 file.
28
29 Parameters:
30 filename (str): HDF5 file to open.
31 verbosity (int): Verbose level. 0: Only errors. 1: Warnings. 2: All.
32
33 Returns nothing.
34 """
35 # Generic loading
36 self._h5_file = HDF5RawDataFile(filename)
37 self._fragment_paths = self._h5_file.get_all_fragment_dataset_paths()
38 self.run_id = self._h5_file.get_int_attribute('run_number')
39 self.file_index = self._h5_file.get_int_attribute('file_index')
40
41 self._verbosity = verbosity
42
43 self._filter_fragment_paths() # Derived class must define this.
44
45 self._num_empty = 0 # Counts the number of empty fragments.
46
47 self._batch_mode = batch_mode
48
49 return None
50
51 @abc.abstractmethod
52 def _filter_fragment_paths(self) -> None:
53 """
54 Filter the fragment paths of interest.
55
56 This should be according to the derived reader's
57 data type of interest, e.g., filter for TriggerActivity.
58 """
59 ...
60
61 def get_fragment_paths(self) -> list[str]:
62 """ Return the list of fragment paths. """
63 return list(self._fragment_paths)
64
65 def set_fragment_paths(self, fragment_paths: list[str]) -> None:
66 """ Set the list of fragment paths. """
67 self._fragment_paths = fragment_paths
68 return None
69
70 @abc.abstractmethod
71 def read_fragment(self, fragment_path: str) -> None:
72 """ Read one fragment from :fragment_path:. """
73 ...
74
75 def read_all_fragments(self) -> None:
76 """ Read all fragments. """
77 for fragment_path in tqdm(self._fragment_paths, desc='Reading all the fragments', disable=self._batch_mode):
78 _ = self.read_fragment(fragment_path)
79
80 # self.read_fragment should increment self._num_empty.
81 # Print how many were empty as a debug.
82 if self._verbosity >= 1 and self._num_empty != 0:
83 print(
85 + self._BOLD_TEXT
86 + f"WARNING: Skipped {self._num_empty} frags."
87 + self._END_TEXT_COLOR
88 )
89
90 return None
91
92 @abc.abstractmethod
93 def clear_data(self) -> None:
94 """ Clear the contents of the member data. """
95 ...
96
97 def reset_fragment_paths(self) -> None:
98 """ Reset the fragment paths to the initialized state. """
99 self._fragment_paths = self._h5_file.get_all_fragment_dataset_paths()
None __init__(self, str filename, int verbosity=0, bool batch_mode=False)
Definition HDF5Reader.py:25
None read_fragment(self, str fragment_path)
Definition HDF5Reader.py:71
None set_fragment_paths(self, list[str] fragment_paths)
Definition HDF5Reader.py:65
list[str] get_fragment_paths(self)
Definition HDF5Reader.py:61