156 def check_fragments(self, k_nrecords):
157 if self.record_type != "TriggerRecord":
158 print("Check fragments only works on TriggerRecord data.")
159 else:
160 report = []
161 n = 0
162 for i in self.records:
163 if n >= k_nrecords and k_nrecords > 0:
164 break
165 dset = self.h5file[i.header]
166 data_array = bytearray(dset[:])
167 (trh_version, ) = struct.unpack('<I', data_array[4:8])
168 if trh_version != TRIGGER_RECORD_HEADER_VERSION:
169 raise ValueError(f"Invalid TriggerRecord Header format version: expected {TRIGGER_RECORD_HEADER_VERSION} and found {trh_version}")
170 (h, j, k) = struct.unpack('<3Q', data_array[8:32])
171 (s, ) = struct.unpack('<H', data_array[48:50])
172 nf = len(i.fragments)
173 empty_frag_count = 0
174 for frag in i.fragments:
175 frag_dset = self.h5file[frag]
176 frag_data = bytearray(frag_dset[:])
177 (frag_version, ) = struct.unpack('<I', frag_data[4:8])
178 if frag_version != FRAGMENT_HEADER_VERSION:
179 raise ValueError(f"Invalid Fragment Header format version: expected {FRAGMENT_HEADER_VERSION} and found {frag_version}")
180 (frag_size, ) = struct.unpack('<Q', frag_data[8:16])
181 if frag_size <= 72:
182 empty_frag_count += 1
183 report.append((h, s, k, nf, nf - k, empty_frag_count))
184 n += 1
185 print("{:-^80}".format("Column Definitions"))
186 print("i: Trigger record number;")
187 print("s: Sequence number;")
188 print("N_frag_exp: expected no. of fragments stored in header;")
189 print("N_frag_act: no. of fragments written in trigger record;")
190 print("N_diff: N_frag_act - N_frag_exp")
191 print("N_frag_empty: no. of empty fragments (size <= 72)")
192 print("{:-^80}".format("Column Definitions"))
193 print("{:^10}{:^10}{:^15}{:^15}{:^10}{:^12}".format(
194 "i", "s", "N_frag_exp", "N_frag_act", "N_diff", "N_frag_empty"))
195 for i in range(len(report)):
196 print("{:^10}{:^10}{:^15}{:^15}{:^10}{:^12}".format(*report[i]))
197 return
198