DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
utils.py
Go to the documentation of this file.
1#general imports
2import sys
3
4#dunedaq imports
5import daqdataformats
6import detdataformats
7import fddetdataformats
8import trgdataformats
9import detchannelmaps
10
11#unpacker imports
15import h5py
16
17#analysis imports
18import numpy as np
19import numpy.fft
20
22
23 def get_offline_channel_from_det_crate_slot_stream_chan(det, crate, slot, stream, ch):
24 return (ch + (stream << 10 ) + (slot << 18 ) + (crate << 22))
26 return -1
28 return 0xffff
30 return "Null"
31
33
34 is_fragment_unpacker = False
35
36 is_detector_unpacker = False
37 is_trigger_unpacker = False
38
39 def __init__(self, index=None):
40 self.index = index
41
42 def get_all_data(self,in_data=None):
43 return None
44
46
47 is_fragment_unpacker = False
48
49 is_detector_unpacker = False
50 is_trigger_unpacker = False
51
52 def get_srcid_data(self,sid):
53 return [ SourceIDData(run=self.index.run,
54 trigger=self.index.trigger,
55 sequence=self.index.sequence,
56 src_id=sid.id,
57 subsystem=sid.subsystem,
58 subsystem_str=daqdataformats.SourceID.subsystem_to_string(sid.subsystem),
59 version=sid.version) ]
60
61 def get_all_data(self,in_data):
62 #in_data = sid
63 return { "sid": self.get_srcid_data(in_data) }
64
66
67 is_fragment_unpacker = False
68
69 def get_trh_data(self,trh,n_fragments):
70 return [ TriggerRecordData(run=trh.get_run_number(),
71 trigger=trh.get_trigger_number(),
72 sequence=trh.get_sequence_number(),
73 trigger_timestamp_dts=trh.get_trigger_timestamp(),
74 n_fragments=n_fragments,
75 n_requested_components=trh.get_num_requested_components(),
76 error_bits=trh.get_header().error_bits,
77 trigger_type=trh.get_trigger_type(),
78 max_sequence_number=trh.get_max_sequence_number(),
79 total_size_bytes=trh.get_total_size_bytes()) ]
80
81 def get_all_data(self,in_data):
82 #in_data[0]=trh
83 #in_data[1]=n_fragments
84 return { "trh": self.get_trh_data(in_data[0],in_data[1]) }
85
87
88 is_fragment_unpacker = True
89
90 is_detector_unpacker = False
91 is_trigger_unpacker = False
92
93 def get_n_obj(self,frag):
94 return None
95
96 def get_trg_data(self,in_data):
97 return None, None
98
99 def get_det_data(self,in_data):
100 return None, None, None, None
101
102 def get_frh_data(self,frag):
103 frh = frag.get_header()
104 return [ FragmentHeaderData(run=frh.run_number,
105 trigger=frh.trigger_number,
106 sequence=frh.sequence_number,
107 src_id=frh.element_id.id,
108 trigger_timestamp_dts=frh.trigger_timestamp,
109 window_begin_dts=frh.window_begin,
110 window_end_dts=frh.window_end,
111 det_id=frh.detector_id,
112 error_bits=frh.error_bits,
113 fragment_type=frh.fragment_type,
114 total_size_bytes=frh.size,
115 data_size_bytes=frag.get_data_size()) ]
116
117 def get_all_data(self,in_data):
118 #in_data = fragment
119
120 data_dict = { "frh": self.get_frh_data(in_data) }
121
122 #if no data, nothing to unpack further
123 if in_data.get_data_size()==0:
124 return data_dict
125
126 type_string = f'{detdataformats.DetID.Subdetector(in_data.get_detector_id()).name}_{in_data.get_fragment_type().name}'
127
129 trgh, trgd = self.get_trg_data(in_data)
130 if trgh is not None: data_dict[f"trgh_{type_string}"] = trgh
131 if trgd[0] is not None: data_dict[f"trgd_{type_string}"] = trgd[0]
132 if trgd[1] is not None: data_dict[f"trgd_{type_string}_inputs"] = trgd[1]
133
135 daqh, deth, detd, detw = self.get_det_data(in_data)
136 if daqh is not None: data_dict["daqh"] = daqh
137 if deth is not None: data_dict[f"deth_{type_string}"] = deth
138 if detd is not None: data_dict[f"detd_{type_string}"] = detd
139 if detw is not None: data_dict[f"detw_{type_string}"] = detw
140
141 return data_dict
142
144
145 is_trigger_unpacker = True
146
147 def get_trg_data(self,frag):
148 return self.get_trg_header_data(frag),self.get_trg_obj_data(frag)
149
150 def get_trg_header_data(self,frag):
151 frh = frag.get_header()
152 return [ TriggerHeaderData(run=frh.run_number,
153 trigger=frh.trigger_number,
154 sequence=frh.sequence_number,
155 src_id=frh.element_id.id,
156 n_obj=self.get_n_obj(frag),
157 version=self.get_trg_data_version(frag)) ]
158
159
161
162 trg_obj = trgdataformats.TriggerPrimitive
163
164 def __init__(self,channel_map=None):
165 super().__init__()
166 if 'TPC' in channel_map:
167 self.channel_map = detchannelmaps.make_tpc_map(channel_map)
168 elif 'PDS' in channel_map:
169 self.channel_map = detchannelmaps.make_pds_map(channel_map)
170 else:
171 self.channel_map = NullChannelMap
172
173 def get_n_obj(self,frag):
174 return int(frag.get_data_size()/self.trg_obj.sizeof())
175
176 def get_trg_data_version(self,frag):
177 if self.get_n_objget_n_obj(frag)==0:
178 return None
179 trig_obj = self.trg_obj(frag.get_data())
180 return trig_obj.version
181
182 def get_trg_obj_data(self,frag):
183 frh = frag.get_header()
184 tpd_list = []
185 for i_tp in range(self.get_n_objget_n_obj(frag)):
186 tp = self.trg_obj(frag.get_data(i_tp*self.trg_obj.sizeof()))
187 ch_info = self.channel_map.get_channel_info_from_offline_channel(tp.channel)
188 tpd_list.append( TriggerPrimitiveData(run=frh.run_number,
189 trigger=frh.trigger_number,
190 sequence=frh.sequence_number,
191 src_id=frh.element_id.id,
192 time_start=tp.time_start,
193 samples_to_peak=tp.samples_to_peak,
194 samples_over_threshold=tp.samples_over_threshold,
195 channel=tp.channel,
196 plane=self.channel_map.get_plane_from_offline_channel(tp.channel),
197 element=ch_info.element,
198 adc_integral=tp.adc_integral,
199 adc_peak=tp.adc_peak,
200 detid=tp.detid,
201 flag=tp.flag,
202 id_ta=-1) )
203 return tpd_list, None
204
206
207 trg_obj = trgdataformats.TriggerActivity
208
209 def __init__(self,channel_map=None):
210 super().__init__()
211 if 'TPC' in channel_map:
212 self.channel_map = detchannelmaps.make_tpc_map(channel_map)
213 elif 'PDS' in channel_map:
214 self.channel_map = detchannelmaps.make_pds_map(channel_map)
215 else:
216 self.channel_map = NullChannelMap
217
218 def get_n_obj(self,frag):
219 frag_data_size = frag.get_data_size()
220 size_so_far = 0
221 n_tobjs = 0
222 while size_so_far < frag_data_size:
223 tobj = self.trg_obj(frag.get_data(size_so_far))
224 n_tobjs = n_tobjs + 1
225 size_so_far = size_so_far + tobj.sizeof()
226 return n_tobjs
227
228 def get_trg_data_version(self,frag):
229 if self.get_n_objget_n_obj(frag)==0:
230 return None
231 trig_obj = self.trg_obj(frag.get_data())
232 return trig_obj.data.version
233
234 def get_trg_obj_data(self,frag):
235 frh = frag.get_header()
236 ta_list = []
237 tpd_list = []
238 size_so_far = 0
239 for i_ta in range(self.get_n_objget_n_obj(frag)):
240 ta= self.trg_obj(frag.get_data(size_so_far))
241 size_so_far = size_so_far + ta.sizeof()
242 ch_info_ta = self.channel_map.get_channel_info_from_offline_channel(ta.data.channel_peak)
243 ta_list.append( TriggerActivityData(run=frh.run_number,
244 trigger=frh.trigger_number,
245 sequence=frh.sequence_number,
246 src_id=frh.element_id.id,
247 id=i_ta,
248 time_start=ta.data.time_start,
249 time_end=ta.data.time_end,
250 time_peak=ta.data.time_peak,
251 time_activity=ta.data.time_activity,
252 channel_start=ta.data.channel_start,
253 channel_end=ta.data.channel_end,
254 channel_peak=ta.data.channel_peak,
255 plane=self.channel_map.get_plane_from_offline_channel(ta.data.channel_peak),
256 element=ch_info_ta.element,
257 adc_integral=ta.data.adc_integral,
258 adc_peak=ta.data.adc_peak,
259 detid=ta.data.detid,
260 ta_type=ta.data.type,
261 algorithm=ta.data.algorithm,
262 n_tps=len(ta),
263 id_tc=-1) )
264 for i_tp in range(len(ta)):
265 tp = ta[i_tp]
266 ch_info_tp = self.channel_map.get_channel_info_from_offline_channel(tp.channel)
267 tpd_list.append( TriggerPrimitiveData(run=frh.run_number,
268 trigger=frh.trigger_number,
269 sequence=frh.sequence_number,
270 src_id=frh.element_id.id,
271 time_start=tp.time_start,
272 samples_to_peak=tp.samples_to_peak,
273 samples_over_threshold=tp.samples_over_threshold,
274 channel=tp.channel,
275 plane=self.channel_map.get_plane_from_offline_channel(tp.channel),
276 element=ch_info_tp.element,
277 adc_integral=tp.adc_integral,
278 adc_peak=tp.adc_peak,
279 detid=tp.detid,
280 flag=tp.flag,
281 id_ta=i_ta) )
282
283 if len(tpd_list)==0:
284 tpd_list=None
285 return ta_list, tpd_list
286
288
289 trg_obj = trgdataformats.TriggerCandidate
290
291 def __init__(self,channel_map=None):
292 super().__init__()
293 if not channel_map:
294 self.channel_map = NullChannelMap
295 elif 'TPC' in channel_map:
296 self.channel_map = detchannelmaps.make_tpc_map(channel_map)
297 elif 'PDS' in channel_map:
298 self.channel_map = detchannelmaps.make_pds_map(channel_map)
299 else:
300 self.channel_map = NullChannelMap
301
302 def get_n_obj(self,frag):
303 frag_data_size = frag.get_data_size()
304 size_so_far = 0
305 n_tobjs = 0
306 while size_so_far < frag_data_size:
307 tobj = self.trg_obj(frag.get_data(size_so_far))
308 n_tobjs = n_tobjs + 1
309 size_so_far = size_so_far + tobj.sizeof()
310 return n_tobjs
311
312 def get_trg_data_version(self,frag):
313 if self.get_n_objget_n_obj(frag)==0:
314 return None
315 trig_obj = self.trg_obj(frag.get_data())
316 return trig_obj.data.version
317
318 def get_trg_obj_data(self,frag):
319 frh = frag.get_header()
320 tc_list = []
321 ta_list = []
322 size_so_far = 0
323 for i_tc in range(self.get_n_objget_n_obj(frag)):
324 tc = self.trg_obj(frag.get_data(size_so_far))
325 size_so_far = size_so_far + tc.sizeof()
326 tc_list.append( TriggerCandidateData(run=frh.run_number,
327 trigger=frh.trigger_number,
328 sequence=frh.sequence_number,
329 src_id=frh.element_id.id,
330 id=i_tc,
331 time_start=tc.data.time_start,
332 time_end=tc.data.time_end,
333 time_candidate=tc.data.time_candidate,
334 detid=tc.data.detid,
335 tc_type=tc.data.type,
336 algorithm=tc.data.algorithm,
337 n_tas=len(tc) ) )
338 for i_ta in range(len(tc)):
339 ta = tc[i_ta]
340 ch_info_ta = self.channel_map.get_channel_info_from_offline_channel(ta.channel_peak)
341 ta_list.append( TriggerActivityData(run=frh.run_number,
342 trigger=frh.trigger_number,
343 sequence=frh.sequence_number,
344 src_id=frh.element_id.id,
345 id=i_ta,
346 time_start=ta.time_start,
347 time_end=ta.time_end,
348 time_peak=ta.time_peak,
349 time_activity=ta.time_activity,
350 channel_start=ta.channel_start,
351 channel_end=ta.channel_end,
352 channel_peak=ta.channel_peak,
353 plane=self.channel_map.get_plane_from_offline_channel(ta.channel_peak),
354 element=ch_info_ta.element,
355 adc_integral=ta.adc_integral,
356 adc_peak=ta.adc_peak,
357 detid=ta.detid,
358 ta_type=ta.type,
359 algorithm=ta.algorithm,
360 n_tps=-1,
361 id_tc=i_tc) )
362 if len(ta_list)==0:
363 ta_list=None
364 return tc_list, ta_list
365
366
368
369 is_detector_unpacker = True
370
371 def __init__(self,channel_map=None,ana_data_prescale=1,wvfm_data_prescale=None):
372 super().__init__()
373 self.ana_data_prescale = None if not ana_data_prescale else int(ana_data_prescale)
374 self.wvfm_data_prescale = None if not wvfm_data_prescale else int(wvfm_data_prescale)
375 if not channel_map:
376 self.channel_map = NullChannelMap
377 elif 'TPC' in channel_map:
378 self.channel_map = detchannelmaps.make_tpc_map(channel_map)
379 elif 'PDS' in channel_map:
380 self.channel_map = detchannelmaps.make_pds_map(channel_map)
381 else:
382 self.channel_map = NullChannelMap
383
385 return None
386
387 def get_det_data_version(self,frag):
388 return None
389
390 def get_timestamp_first(self,frag):
391 return None
392
394 return None, None, None, None
395
396 def get_daq_header_data(self,frag):
397 frh = frag.get_header()
398 det_id, crate_id, slot_id, stream_id = self.get_det_crate_slot_stream(frag)
399 return [ DAQHeaderData(run=frh.run_number,
400 trigger=frh.trigger_number,
401 sequence=frh.sequence_number,
402 src_id=frh.element_id.id,
403 n_obj=self.get_n_obj(frag),
404 daq_header_version=self.get_daq_header_version(frag),
405 det_data_version=self.get_det_data_version(frag),
406 det_id=det_id,
407 crate_id=crate_id,
408 slot_id=slot_id,
409 stream_id=stream_id,
410 timestamp_first_dts=self.get_timestamp_first(frag)) ]
411
412 def get_det_header_data(self,frag):
413 return None
414
415 def get_det_data_all(self,frag):
416 return None, None
417
418 def get_det_data(self,frag):
419 det_ana_data, det_wvfm_data = self.get_det_data_all(frag)
420 return self.get_daq_header_data(frag), self.get_det_header_data(frag), det_ana_data, det_wvfm_data
421
422
424
426 frame_obj = fddetdataformats.WIBEthFrame
427
428 SAMPLING_PERIOD = 32
429 N_CHANNELS_PER_FRAME = 64
430
431 def get_n_obj(self,frag):
432 return self.unpacker.get_n_frames(frag)
433
435 return self.frame_obj(frag.get_data()).get_daqheader().version
436
437 def get_timestamp_first(self,frag):
438 return self.frame_obj(frag.get_data()).get_timestamp()
439
440 def get_det_data_version(self,frag):
441 return self.frame_obj(frag.get_data()).get_wibheader().version
442
444 dh = self.frame_obj(frag.get_data()).get_daqheader()
445 return dh.det_id, dh.crate_id, dh.slot_id, dh.stream_id
446
447 def get_det_header_data(self,frag):
448 frh = frag.get_header()
449
450 n_frames = self.get_n_objget_n_obj(frag)
451
452 pulser_arr = np.empty(n_frames)
453 calibration_arr = np.empty(n_frames)
454 ready_arr = np.empty(n_frames)
455 context_arr = np.empty(n_frames)
456 wib_sync_arr = np.empty(n_frames)
457 femb_sync_arr = np.empty(n_frames)
458 cd_arr = np.empty(n_frames)
459 crc_err_arr = np.empty(n_frames)
460 link_valid_arr = np.empty(n_frames)
461 lol_arr = np.empty(n_frames)
462 colddata_ts0_arr = np.empty(n_frames)
463 colddata_ts1_arr = np.empty(n_frames)
464
465 for i in range(n_frames):
466 wh = self.frame_obj(frag.get_data(i*self.frame_obj.sizeof())).get_wibheader()
467
468 pulser_arr[i] = wh.pulser
469 calibration_arr[i] = wh.calibration
470 ready_arr[i] = wh.ready
471 context_arr[i] = wh.context
472
473 wib_sync_arr[i] = wh.wib_sync
474 femb_sync_arr[i] = wh.femb_sync
475
476 cd_arr[i] = wh.cd
477 crc_err_arr[i] = wh.crc_err
478 link_valid_arr[i] = wh.link_valid
479 lol_arr[i] = wh.lol
480
481 colddata_ts0_arr[i] = wh.colddata_timestamp_0
482 colddata_ts1_arr[i] = wh.colddata_timestamp_1
483
484 pulser_change_idx, pulser_change_val, _ = sparsify_array_diff_locs_and_vals(pulser_arr)
485 calibration_change_idx, calibration_change_val, _ = sparsify_array_diff_locs_and_vals(calibration_arr)
486 ready_change_idx, ready_change_val, _ = sparsify_array_diff_locs_and_vals(context_arr)
487 context_change_idx, context_change_val, _ = sparsify_array_diff_locs_and_vals(context_arr)
488
489 wib_sync_change_idx, wib_sync_change_val, _ = sparsify_array_diff_locs_and_vals(wib_sync_arr)
490 femb_sync_change_idx, femb_sync_change_val, _ = sparsify_array_diff_locs_and_vals(femb_sync_arr)
491
492 cd_change_idx, cd_change_val, _ = sparsify_array_diff_locs_and_vals(cd_arr)
493 crc_err_change_idx, crc_err_change_val, _ = sparsify_array_diff_locs_and_vals(crc_err_arr)
494 link_valid_change_idx, link_valid_change_val, _ = sparsify_array_diff_locs_and_vals(link_valid_arr)
495 lol_change_idx, lol_change_val, _ = sparsify_array_diff_locs_and_vals(context_arr)
496
497 colddata_ts0_diff = np.diff(colddata_ts0_arr)
498 colddata_ts0_diff[colddata_ts0_diff<0] = colddata_ts0_diff[colddata_ts0_diff<0]+0x8000
499 colddata_ts0_diff_change_idx, colddata_ts0_diff_change_val, _ = sparsify_array_diff_locs_and_vals(colddata_ts0_diff)
500
501 colddata_ts1_diff = np.diff(colddata_ts1_arr)
502 colddata_ts1_diff[colddata_ts1_diff<0] = colddata_ts1_diff[colddata_ts1_diff<0]+0x8000
503 colddata_ts1_diff_change_idx, colddata_ts1_diff_change_val, _ = sparsify_array_diff_locs_and_vals(colddata_ts1_diff)
504
505 ts_arr = self.unpacker.np_array_timestamp(frag)
506 ts_diff_change_idx, ts_diff_change_val, _ = sparsify_array_diff_locs_and_vals(np.diff(ts_arr))
507
508 wh = self.frame_obj(frag.get_data()).get_wibheader()
509 ts_diff_vals, ts_diff_counts = np.unique(np.diff(self.unpacker.np_array_timestamp(frag)),return_counts=True)
510 return [ WIBEthHeaderData(run=frh.run_number,
511 trigger=frh.trigger_number,
512 sequence=frh.sequence_number,
513 src_id=frh.element_id.id,
514 femb_id=(wh.channel>>1)&0x3,
515 colddata_id=wh.channel&0x1,
516 version=wh.version,
517 pulser_vals=pulser_change_val, pulser_idx=pulser_change_idx,
518 calibration_vals=calibration_change_val, calibration_idx=calibration_change_idx,
519 ready_vals=ready_change_val, ready_idx=ready_change_idx,
520 context_vals=context_change_val, context_idx=context_change_idx,
521 wib_sync_vals=wib_sync_change_val, wib_sync_idx=wib_sync_change_idx,
522 femb_sync_vals=femb_sync_change_val, femb_sync_idx=femb_sync_change_idx,
523 cd_vals=cd_change_val, cd_idx=cd_change_idx,
524 crc_err_vals=crc_err_change_val, crc_err_idx=crc_err_change_idx,
525 link_valid_vals=link_valid_change_val, link_valid_idx=link_valid_change_idx,
526 lol_vals=lol_change_val, lol_idx=lol_change_idx,
527 colddata_timestamp_0_diff_vals=colddata_ts0_diff_change_val,
528 colddata_timestamp_0_diff_idx=colddata_ts0_diff_change_idx,
529 colddata_timestamp_0_first=colddata_ts0_arr[0],
530 colddata_timestamp_1_diff_vals=colddata_ts1_diff_change_val,
531 colddata_timestamp_1_diff_idx=colddata_ts1_diff_change_idx,
532 colddata_timestamp_1_first=colddata_ts1_arr[0],
533 timestamp_dts_diff_vals=ts_diff_change_val, timestamp_dts_diff_idx=ts_diff_change_idx,
534 timestamp_dts_first=ts_arr[0],
535 n_frames=n_frames,
536 n_channels=self.N_CHANNELS_PER_FRAME,
537 sampling_period=self.SAMPLING_PERIOD) ]
538
539 def get_det_data_all(self,frag):
540 frh = frag.get_header()
541 trigger_number = frh.trigger_number
542
543 get_ana_data = (self.ana_data_prescale is not None and (trigger_number % self.ana_data_prescale)==0)
544 get_wvfm_data = (self.wvfm_data_prescale is not None and (trigger_number % self.wvfm_data_prescale)==0)
545
546 #print(f'\t\tTrigger number {trigger_number}: get_ana_data? {get_ana_data} get_wvfm_data? {get_wvfm_data}')
547
548 if not (get_ana_data or get_wvfm_data):
549 return None,None
550
551 ana_data = None
552 wvfm_data = None
553
554 adcs = self.unpacker.np_array_adc(frag)
555 det, crate, slot, stream = self.get_det_crate_slot_streamget_det_crate_slot_stream(frag)
556 channels = [ self.channel_map.get_offline_channel_from_det_crate_slot_stream_chan(det, crate, slot, stream, c) for c in range(self.N_CHANNELS_PER_FRAME) ]
557 planes = [ self.channel_map.get_plane_from_offline_channel(uc) for uc in channels ]
558 elements = [ self.channel_map.get_element_id_from_offline_channel(uc) for uc in channels ]
559 wib_chans = range(self.N_CHANNELS_PER_FRAME)
560
561 if get_ana_data:
562 adc_mean = np.mean(adcs,axis=0)
563 adc_rms = np.std(adcs,axis=0)
564 adc_max = np.max(adcs,axis=0)
565 adc_min = np.min(adcs,axis=0)
566 adc_median = np.median(adcs,axis=0)
567 ana_data = [ WIBEthAnalysisData(run=frh.run_number,
568 trigger=frh.trigger_number,
569 sequence=frh.sequence_number,
570 src_id=frh.element_id.id,
571 channel=channels[i_ch],
572 plane=planes[i_ch],
573 element=elements[i_ch],
574 wib_chan=wib_chans[i_ch],
575 adc_mean=adc_mean[i_ch],
576 adc_rms=adc_rms[i_ch],
577 adc_max=adc_max[i_ch],
578 adc_min=adc_min[i_ch],
579 adc_median=adc_median[i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
580 if get_wvfm_data:
581 timestamps = self.unpacker.np_array_timestamp(frag)
582 ffts = np.abs(np.fft.rfft(adcs,axis=0))
583 wvfm_data = [ WIBEthWaveformData(run=frh.run_number,
584 trigger=frh.trigger_number,
585 sequence=frh.sequence_number,
586 src_id=frh.element_id.id,
587 channel=channels[i_ch],
588 plane=planes[i_ch],
589 element=elements[i_ch],
590 wib_chan=wib_chans[i_ch],
591 timestamps=timestamps,
592 adcs=adcs[:,i_ch],
593 fft_mag=ffts[:,i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
594
595 return ana_data, wvfm_data
596
597
599
601 frame_obj = fddetdataformats.TDEEthFrame
602
603 SAMPLING_PERIOD = 31.25
604 N_CHANNELS_PER_FRAME = 64
605
606 def get_n_obj(self,frag):
607 return self.unpacker.get_n_frames(frag)
608
610 return self.frame_obj(frag.get_data()).get_daqheader().version
611
612 def get_timestamp_first(self,frag):
613 return self.frame_obj(frag.get_data()).get_timestamp()
614
615 def get_det_data_version(self,frag):
616 return self.frame_obj(frag.get_data()).get_tdeheader().version
617
619 dh = self.frame_obj(frag.get_data()).get_daqheader()
620 return dh.det_id, dh.crate_id, dh.slot_id, dh.stream_id
621
622 def get_det_header_data(self,frag):
623 frh = frag.get_header()
624
625 n_frames = self.get_n_objget_n_obj(frag)
626
627 errors_arr = np.empty(n_frames)
628 tai_time_arr = np.empty(n_frames)
629
630 for i in range(n_frames):
631 tdeh = self.frame_obj(frag.get_data(i*self.frame_obj.sizeof())).get_tdeheader()
632
633 errors_arr[i] = tdeh.tde_errors
634 tai_time_arr[i] = tdeh.TAItime
635
636 errors_change_idx, errors_change_val, _ = sparsify_array_diff_locs_and_vals(errors_arr)
637
638 tai_time_diff = np.diff(tai_time_arr)
639 tai_time_diff_change_idx, tai_time_diff_change_val, _ = sparsify_array_diff_locs_and_vals(tai_time_diff)
640
641 ts_arr = self.unpacker.np_array_timestamp(frag)
642 ts_diff_change_idx, ts_diff_change_val, _ = sparsify_array_diff_locs_and_vals(np.diff(ts_arr))
643
644 tdeh = self.frame_obj(frag.get_data()).get_tdeheader()
645 ts_diff_vals, ts_diff_counts = np.unique(np.diff(self.unpacker.np_array_timestamp(frag)),return_counts=True)
646 return [ TDEEthHeaderData(run=frh.run_number,
647 trigger=frh.trigger_number,
648 sequence=frh.sequence_number,
649 src_id=frh.element_id.id,
650 channel_id=tdeh.channel,
651 tde_header=tdeh.tde_header,
652 version=tdeh.version,
653 errors_vals=errors_change_val, errors_idx=errors_change_idx,
654 tai_time_diff_vals=tai_time_diff_change_val,
655 tai_time_diff_idx=tai_time_diff_change_idx,
656 tai_time_first=tai_time_arr[0],
657 timestamp_dts_diff_vals=ts_diff_change_val,
658 timestamp_dts_diff_idx=ts_diff_change_idx,
659 timestamp_dts_first=ts_arr[0],
660 n_frames=n_frames,
661 n_channels=self.N_CHANNELS_PER_FRAME,
662 sampling_period=self.SAMPLING_PERIOD) ]
663
664 def get_det_data_all(self,frag):
665 frh = frag.get_header()
666 trigger_number = frh.trigger_number
667
668 get_ana_data = (self.ana_data_prescale is not None and (trigger_number % self.ana_data_prescale)==0)
669 get_wvfm_data = (self.wvfm_data_prescale is not None and (trigger_number % self.wvfm_data_prescale)==0)
670
671 #print(f'\t\tTrigger number {trigger_number}: get_ana_data? {get_ana_data} get_wvfm_data? {get_wvfm_data}')
672
673 if not (get_ana_data or get_wvfm_data):
674 return None,None
675
676 ana_data = None
677 wvfm_data = None
678
679 adcs = self.unpacker.np_array_adc(frag)
680 det, crate, slot, stream = self.get_det_crate_slot_streamget_det_crate_slot_stream(frag)
681 channels = [ self.channel_map.get_offline_channel_from_det_crate_slot_stream_chan(det, crate, slot, stream, c) for c in range(self.N_CHANNELS_PER_FRAME) ]
682 planes = [ self.channel_map.get_plane_from_offline_channel(uc) for uc in channels ]
683 elements = [ self.channel_map.get_element_id_from_offline_channel(uc) for uc in channels ]
684 tde_chans = range(self.N_CHANNELS_PER_FRAME)
685
686 if get_ana_data:
687 adc_mean = np.mean(adcs,axis=0)
688 adc_rms = np.std(adcs,axis=0)
689 adc_max = np.max(adcs,axis=0)
690 adc_min = np.min(adcs,axis=0)
691 adc_median = np.median(adcs,axis=0)
692 ana_data = [ TDEEthAnalysisData(run=frh.run_number,
693 trigger=frh.trigger_number,
694 sequence=frh.sequence_number,
695 src_id=frh.element_id.id,
696 channel=channels[i_ch],
697 plane=planes[i_ch],
698 element=elements[i_ch],
699 tde_chan=tde_chans[i_ch],
700 adc_mean=adc_mean[i_ch],
701 adc_rms=adc_rms[i_ch],
702 adc_max=adc_max[i_ch],
703 adc_min=adc_min[i_ch],
704 adc_median=adc_median[i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
705 if get_wvfm_data:
706 timestamps = self.unpacker.np_array_timestamp(frag)
707 ffts = np.abs(np.fft.rfft(adcs,axis=0))
708 wvfm_data = [ TDEEthWaveformData(run=frh.run_number,
709 trigger=frh.trigger_number,
710 sequence=frh.sequence_number,
711 src_id=frh.element_id.id,
712 channel=channels[i_ch],
713 plane=planes[i_ch],
714 element=elements[i_ch],
715 tde_chan=tde_chans[i_ch],
716 timestamps=timestamps,
717 adcs=adcs[:,i_ch],
718 fft_mag=ffts[:,i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
719
720 return ana_data, wvfm_data
721
723
725 frame_obj = fddetdataformats.DAPHNEStreamFrame
726
727 SAMPLING_PERIOD = 1
728 N_CHANNELS_PER_FRAME = 4
729
730 def get_n_obj(self,frag):
731 return self.unpacker.get_n_frames_stream(frag)
732
734 return self.frame_obj(frag.get_data()).get_daqheader().version
735
736 def get_timestamp_first(self,frag):
737 return self.frame_obj(frag.get_data()).get_timestamp()
738
739 def get_det_data_version(self,frag):
740 return 0
741
743 dh = self.frame_obj(frag.get_data()).get_daqheader()
744 return dh.det_id, dh.crate_id, dh.slot_id, dh.link_id
745
746 def get_det_header_data(self,frag):
747 frh = frag.get_header()
748 dh = self.frame_obj(frag.get_data()).get_header()
749 ts_diffs_vals, ts_diffs_counts = np.unique(np.diff( np.array(self.unpacker.np_array_timestamp_stream(frag), dtype=np.int64)), return_counts=True)
750 return [ DAPHNEStreamHeaderData(run=frh.run_number,
751 trigger=frh.trigger_number,
752 sequence=frh.sequence_number,
753 src_id=frh.element_id.id,
754 n_channels=self.N_CHANNELS_PER_FRAME,
755 sampling_period=self.SAMPLING_PERIOD,
756 ts_diffs_vals=ts_diffs_vals,
757 ts_diffs_counts=ts_diffs_counts) ]
758
759 def get_det_data_all(self,frag):
760 frh = frag.get_header()
761 trigger_number = frh.trigger_number
762
763 get_ana_data = (self.ana_data_prescale is not None and (trigger_number % self.ana_data_prescale)==0)
764 get_wvfm_data = (self.wvfm_data_prescale is not None and (trigger_number % self.wvfm_data_prescale)==0)
765
766 if not (get_ana_data or get_wvfm_data):
767 return None,None
768
769 ana_data = None
770 wvfm_data = None
771
772 adcs = self.unpacker.np_array_adc_stream(frag)
773 dh = self.frame_obj(frag.get_data()).get_header()
774 det, crate, slot, stream = self.get_det_crate_slot_streamget_det_crate_slot_stream(frag)
775 daphne_chans = [ dh.channel_0, dh.channel_1, dh.channel_2, dh.channel_3 ]
776 channels = [ self.channel_map.get_offline_channel_from_det_crate_slot_stream_chan(det, crate, slot, stream, c) for c in daphne_chans ]
777
778 if get_ana_data:
779 adc_mean = np.mean(adcs,axis=0)
780 adc_rms = np.std(adcs,axis=0)
781 adc_max = np.max(adcs,axis=0)
782 adc_min = np.min(adcs,axis=0)
783 adc_median = np.median(adcs,axis=0)
784 ana_data = [ DAPHNEStreamAnalysisData(run=frh.run_number,
785 trigger=frh.trigger_number,
786 sequence=frh.sequence_number,
787 src_id=frh.element_id.id,
788 channel=channels[i_ch],
789 daphne_chan=daphne_chans[i_ch],
790 adc_mean=adc_mean[i_ch],
791 adc_rms=adc_rms[i_ch],
792 adc_max=adc_max[i_ch],
793 adc_min=adc_min[i_ch],
794 adc_median=adc_median[i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
795 if get_wvfm_data:
796 timestamps = self.unpacker.np_array_timestamp_stream(frag)
797 ffts = np.abs(np.fft.rfft(adcs,axis=0))
798 wvfm_data = [ DAPHNEStreamWaveformData(run=frh.run_number,
799 trigger=frh.trigger_number,
800 sequence=frh.sequence_number,
801 src_id=frh.element_id.id,
802 channel=channels[i_ch],
803 daphne_chan=channels[i_ch],
804 adcs=adcs[:,i_ch],
805 timestamps=timestamps,
806 fft_mag=ffts[:,i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
807 return ana_data, wvfm_data
808
809
811
813 frame_obj = fddetdataformats.DAPHNEFrame
814
815 SAMPLING_PERIOD = 1
816 N_CHANNELS_PER_FRAME = 1
817
818 def get_n_obj(self,frag):
819 return self.unpacker.get_n_frames(frag)
820
822 return self.frame_obj(frag.get_data()).get_daqheader().version
823
824 def get_timestamp_first(self,frag):
825 return self.frame_obj(frag.get_data()).get_timestamp()
826
827 def get_det_data_version(self,frag):
828 return 0
829
831 dh = self.frame_obj(frag.get_data()).get_daqheader()
832 return dh.det_id, dh.crate_id, dh.slot_id, dh.link_id
833
834 def get_det_header_data(self,frag):
835 return None
836
837 def get_det_data_all(self,frag):
838 frh = frag.get_header()
839 trigger_number = frh.trigger_number
840 wvfm_data = None
841 ana_data = None
842
843 get_ana_data = (self.ana_data_prescale is not None and (trigger_number % self.ana_data_prescale)==0)
844 get_wvfm_data = (self.wvfm_data_prescale is not None and (trigger_number % self.wvfm_data_prescale)==0)
845
846 if not (get_ana_data or get_wvfm_data):
847 return None,None
848
849 n_frames = self.get_n_objget_n_obj(frag)
850 adcs = self.unpacker.np_array_adc(frag)
851
852 daphne_headers = [ self.frame_obj(frag.get_data(iframe*self.frame_obj.sizeof())).get_header() for iframe in range(n_frames) ]
853 timestamp = self.unpacker.np_array_timestamp(frag)
854
855 if (len(adcs)) == 0:
856 return None, None
857
858 det, crate, slot, stream = self.get_det_crate_slot_streamget_det_crate_slot_stream(frag)
859
860 if get_ana_data:
861 ax = 1
862 adc_mean = np.mean(adcs,axis=ax)
863 adc_rms = np.std(adcs,axis=ax)
864 adc_max = np.max(adcs,axis=ax)
865 adc_min = np.min(adcs,axis=ax)
866 adc_median = np.median(adcs,axis=ax)
867 ts_max = np.argmax(adcs,axis=ax)*self.SAMPLING_PERIOD + timestamp
868 ts_min = np.argmin(adcs,axis=ax)*self.SAMPLING_PERIOD + timestamp
869
870 ana_data = [ DAPHNEAnalysisData(run=frh.run_number,
871 trigger=frh.trigger_number,
872 sequence=frh.sequence_number,
873 src_id=frh.element_id.id,
874 channel=self.channel_map.get_offline_channel_from_det_crate_slot_stream_chan(det, crate, slot, stream, daphne_headers[iframe].channel),
875 daphne_chan=daphne_headers[iframe].channel,
876 timestamp_dts=timestamp[iframe],
877 trigger_sample_value=daphne_headers[iframe].trigger_sample_value,
878 threshold=daphne_headers[iframe].threshold,
879 baseline=daphne_headers[iframe].baseline,
880 adc_mean=adc_mean[iframe],
881 adc_rms=adc_rms[iframe],
882 adc_max=adc_max[iframe],
883 adc_min=adc_min[iframe],
884 adc_median=adc_median[iframe],
885 timestamp_max_dts=ts_max[iframe],
886 timestamp_min_dts=ts_min[iframe]) for iframe in range(n_frames) ]
887
888
889 if get_wvfm_data:
890
891 wvfm_data = [ DAPHNEWaveformData(run=frh.run_number,
892 trigger=frh.trigger_number,
893 sequence=frh.sequence_number,
894 src_id=frh.element_id.id,
895 channel=self.channel_map.get_offline_channel_from_det_crate_slot_stream_chan(det, crate, slot, stream, daphne_headers[iframe].channel),
896 daphne_chan=daphne_headers[iframe].channel,
897 timestamp_dts=timestamp[iframe],
898 timestamps=np.arange(np.size(adcs[iframe,:]))*self.SAMPLING_PERIOD+timestamp[iframe],
899 adcs=adcs[iframe,:]) for iframe in range(n_frames) ]
900
901 return ana_data, wvfm_data
902
903
904
__init__(self, channel_map=None, ana_data_prescale=1, wvfm_data_prescale=None)
Definition utils.py:371
get_offline_channel_from_det_crate_slot_stream_chan(det, crate, slot, stream, ch)
Definition utils.py:23
__init__(self, index=None)
Definition utils.py:39
get_all_data(self, in_data=None)
Definition utils.py:42
sparsify_array_diff_locs_and_vals(arr)
Sparsification and desparsifications for arrays.