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 'TPC' in channel_map:
294 self.channel_map = detchannelmaps.make_tpc_map(channel_map)
295 elif 'PDS' in channel_map:
296 self.channel_map = detchannelmaps.make_pds_map(channel_map)
297 else:
298 self.channel_map = NullChannelMap
299
300 def get_n_obj(self,frag):
301 frag_data_size = frag.get_data_size()
302 size_so_far = 0
303 n_tobjs = 0
304 while size_so_far < frag_data_size:
305 tobj = self.trg_obj(frag.get_data(size_so_far))
306 n_tobjs = n_tobjs + 1
307 size_so_far = size_so_far + tobj.sizeof()
308 return n_tobjs
309
310 def get_trg_data_version(self,frag):
311 if self.get_n_objget_n_obj(frag)==0:
312 return None
313 trig_obj = self.trg_obj(frag.get_data())
314 return trig_obj.data.version
315
316 def get_trg_obj_data(self,frag):
317 frh = frag.get_header()
318 tc_list = []
319 ta_list = []
320 size_so_far = 0
321 for i_tc in range(self.get_n_objget_n_obj(frag)):
322 tc = self.trg_obj(frag.get_data(size_so_far))
323 size_so_far = size_so_far + tc.sizeof()
324 tc_list.append( TriggerCandidateData(run=frh.run_number,
325 trigger=frh.trigger_number,
326 sequence=frh.sequence_number,
327 src_id=frh.element_id.id,
328 id=i_tc,
329 time_start=tc.data.time_start,
330 time_end=tc.data.time_end,
331 time_candidate=tc.data.time_candidate,
332 detid=tc.data.detid,
333 tc_type=tc.data.type,
334 algorithm=tc.data.algorithm,
335 n_tas=len(tc) ) )
336 for i_ta in range(len(tc)):
337 ta = tc[i_ta]
338 ch_info_ta = self.channel_map.get_channel_info_from_offline_channel(ta.data.channel_peak)
339 ta_list.append( TriggerActivityData(run=frh.run_number,
340 trigger=frh.trigger_number,
341 sequence=frh.sequence_number,
342 src_id=frh.element_id.id,
343 id=i_ta,
344 time_start=ta.time_start,
345 time_end=ta.time_end,
346 time_peak=ta.time_peak,
347 time_activity=ta.time_activity,
348 channel_start=ta.channel_start,
349 channel_end=ta.channel_end,
350 channel_peak=ta.channel_peak,
351 plane=self.channel_map.get_plane_from_offline_channel(ta.channel_peak),
352 element=ch_info_ta.element,
353 adc_integral=ta.adc_integral,
354 adc_peak=ta.adc_peak,
355 detid=ta.detid,
356 ta_type=ta.type,
357 algorithm=ta.algorithm,
358 n_tps=-1,
359 id_tc=i_tc) )
360 if len(ta_list)==0:
361 ta_list=None
362 return tc_list, ta_list
363
364
366
367 is_detector_unpacker = True
368
369 def __init__(self,ana_data_prescale=1,wvfm_data_prescale=None):
370 super().__init__()
371 self.ana_data_prescale = None if not ana_data_prescale else int(ana_data_prescale)
372 self.wvfm_data_prescale = None if not wvfm_data_prescale else int(wvfm_data_prescale)
373
375 return None
376
377 def get_det_data_version(self,frag):
378 return None
379
380 def get_timestamp_first(self,frag):
381 return None
382
384 return None, None, None, None
385
386 def get_daq_header_data(self,frag):
387 frh = frag.get_header()
388 det_id, crate_id, slot_id, stream_id = self.get_det_crate_slot_stream(frag)
389 return [ DAQHeaderData(run=frh.run_number,
390 trigger=frh.trigger_number,
391 sequence=frh.sequence_number,
392 src_id=frh.element_id.id,
393 n_obj=self.get_n_obj(frag),
394 daq_header_version=self.get_daq_header_version(frag),
395 det_data_version=self.get_det_data_version(frag),
396 det_id=det_id,
397 crate_id=crate_id,
398 slot_id=slot_id,
399 stream_id=stream_id,
400 timestamp_first_dts=self.get_timestamp_first(frag)) ]
401
402 def get_det_header_data(self,frag):
403 return None
404
405 def get_det_data_all(self,frag):
406 return None, None
407
408 def get_det_data(self,frag):
409 det_ana_data, det_wvfm_data = self.get_det_data_all(frag)
410 return self.get_daq_header_data(frag), self.get_det_header_data(frag), det_ana_data, det_wvfm_data
411
412
414
416 frame_obj = fddetdataformats.WIBEthFrame
417
418 SAMPLING_PERIOD = 32
419 N_CHANNELS_PER_FRAME = 64
420
421 def __init__(self,channel_map=None,ana_data_prescale=1,wvfm_data_prescale=None):
422 super().__init__(ana_data_prescale=ana_data_prescale, wvfm_data_prescale=wvfm_data_prescale)
423 self.channel_map = detchannelmaps.make_tpc_map(channel_map) if channel_map else NullChannelMap
424
425 def get_n_obj(self,frag):
426 return self.unpacker.get_n_frames(frag)
427
429 return self.frame_obj(frag.get_data()).get_daqheader().version
430
431 def get_timestamp_first(self,frag):
432 return self.frame_obj(frag.get_data()).get_timestamp()
433
434 def get_det_data_version(self,frag):
435 return self.frame_obj(frag.get_data()).get_wibheader().version
436
438 dh = self.frame_obj(frag.get_data()).get_daqheader()
439 return dh.det_id, dh.crate_id, dh.slot_id, dh.stream_id
440
441 def get_det_header_data(self,frag):
442 frh = frag.get_header()
443
444 n_frames = self.get_n_objget_n_obj(frag)
445
446 pulser_arr = np.empty(n_frames)
447 calibration_arr = np.empty(n_frames)
448 ready_arr = np.empty(n_frames)
449 context_arr = np.empty(n_frames)
450 wib_sync_arr = np.empty(n_frames)
451 femb_sync_arr = np.empty(n_frames)
452 cd_arr = np.empty(n_frames)
453 crc_err_arr = np.empty(n_frames)
454 link_valid_arr = np.empty(n_frames)
455 lol_arr = np.empty(n_frames)
456 colddata_ts0_arr = np.empty(n_frames)
457 colddata_ts1_arr = np.empty(n_frames)
458
459 for i in range(n_frames):
460 wh = self.frame_obj(frag.get_data(i*self.frame_obj.sizeof())).get_wibheader()
461
462 pulser_arr[i] = wh.pulser
463 calibration_arr[i] = wh.calibration
464 ready_arr[i] = wh.ready
465 context_arr[i] = wh.context
466
467 wib_sync_arr[i] = wh.wib_sync
468 femb_sync_arr[i] = wh.femb_sync
469
470 cd_arr[i] = wh.cd
471 crc_err_arr[i] = wh.crc_err
472 link_valid_arr[i] = wh.link_valid
473 lol_arr[i] = wh.lol
474
475 colddata_ts0_arr[i] = wh.colddata_timestamp_0
476 colddata_ts1_arr[i] = wh.colddata_timestamp_1
477
478 pulser_change_idx, pulser_change_val, _ = sparsify_array_diff_locs_and_vals(pulser_arr)
479 calibration_change_idx, calibration_change_val, _ = sparsify_array_diff_locs_and_vals(calibration_arr)
480 ready_change_idx, ready_change_val, _ = sparsify_array_diff_locs_and_vals(context_arr)
481 context_change_idx, context_change_val, _ = sparsify_array_diff_locs_and_vals(context_arr)
482
483 wib_sync_change_idx, wib_sync_change_val, _ = sparsify_array_diff_locs_and_vals(wib_sync_arr)
484 femb_sync_change_idx, femb_sync_change_val, _ = sparsify_array_diff_locs_and_vals(femb_sync_arr)
485
486 cd_change_idx, cd_change_val, _ = sparsify_array_diff_locs_and_vals(cd_arr)
487 crc_err_change_idx, crc_err_change_val, _ = sparsify_array_diff_locs_and_vals(crc_err_arr)
488 link_valid_change_idx, link_valid_change_val, _ = sparsify_array_diff_locs_and_vals(link_valid_arr)
489 lol_change_idx, lol_change_val, _ = sparsify_array_diff_locs_and_vals(context_arr)
490
491 colddata_ts0_diff = np.diff(colddata_ts0_arr)
492 colddata_ts0_diff[colddata_ts0_diff<0] = colddata_ts0_diff[colddata_ts0_diff<0]+0x8000
493 colddata_ts0_diff_change_idx, colddata_ts0_diff_change_val, _ = sparsify_array_diff_locs_and_vals(colddata_ts0_diff)
494
495 colddata_ts1_diff = np.diff(colddata_ts1_arr)
496 colddata_ts1_diff[colddata_ts1_diff<0] = colddata_ts1_diff[colddata_ts1_diff<0]+0x8000
497 colddata_ts1_diff_change_idx, colddata_ts1_diff_change_val, _ = sparsify_array_diff_locs_and_vals(colddata_ts1_diff)
498
499 ts_arr = self.unpacker.np_array_timestamp(frag)
500 ts_diff_change_idx, ts_diff_change_val, _ = sparsify_array_diff_locs_and_vals(np.diff(ts_arr))
501
502 wh = self.frame_obj(frag.get_data()).get_wibheader()
503 ts_diff_vals, ts_diff_counts = np.unique(np.diff(self.unpacker.np_array_timestamp(frag)),return_counts=True)
504 return [ WIBEthHeaderData(run=frh.run_number,
505 trigger=frh.trigger_number,
506 sequence=frh.sequence_number,
507 src_id=frh.element_id.id,
508 femb_id=(wh.channel>>1)&0x3,
509 colddata_id=wh.channel&0x1,
510 version=wh.version,
511 pulser_vals=pulser_change_val, pulser_idx=pulser_change_idx,
512 calibration_vals=calibration_change_val, calibration_idx=calibration_change_idx,
513 ready_vals=ready_change_val, ready_idx=ready_change_idx,
514 context_vals=context_change_val, context_idx=context_change_idx,
515 wib_sync_vals=wib_sync_change_val, wib_sync_idx=wib_sync_change_idx,
516 femb_sync_vals=femb_sync_change_val, femb_sync_idx=femb_sync_change_idx,
517 cd_vals=cd_change_val, cd_idx=cd_change_idx,
518 crc_err_vals=crc_err_change_val, crc_err_idx=crc_err_change_idx,
519 link_valid_vals=link_valid_change_val, link_valid_idx=link_valid_change_idx,
520 lol_vals=lol_change_val, lol_idx=lol_change_idx,
521 colddata_timestamp_0_diff_vals=colddata_ts0_diff_change_val,
522 colddata_timestamp_0_diff_idx=colddata_ts0_diff_change_idx,
523 colddata_timestamp_0_first=colddata_ts0_arr[0],
524 colddata_timestamp_1_diff_vals=colddata_ts1_diff_change_val,
525 colddata_timestamp_1_diff_idx=colddata_ts1_diff_change_idx,
526 colddata_timestamp_1_first=colddata_ts1_arr[0],
527 timestamp_dts_diff_vals=ts_diff_change_val, timestamp_dts_diff_idx=ts_diff_change_idx,
528 timestamp_dts_first=ts_arr[0],
529 n_frames=n_frames,
530 n_channels=self.N_CHANNELS_PER_FRAME,
531 sampling_period=self.SAMPLING_PERIOD) ]
532
533 def get_det_data_all(self,frag):
534 frh = frag.get_header()
535 trigger_number = frh.trigger_number
536
537 get_ana_data = (self.ana_data_prescale is not None and (trigger_number % self.ana_data_prescale)==0)
538 get_wvfm_data = (self.wvfm_data_prescale is not None and (trigger_number % self.wvfm_data_prescale)==0)
539
540 #print(f'\t\tTrigger number {trigger_number}: get_ana_data? {get_ana_data} get_wvfm_data? {get_wvfm_data}')
541
542 if not (get_ana_data or get_wvfm_data):
543 return None,None
544
545 ana_data = None
546 wvfm_data = None
547
548 adcs = self.unpacker.np_array_adc(frag)
549 det, crate, slot, stream = self.get_det_crate_slot_streamget_det_crate_slot_stream(frag)
550 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) ]
551 planes = [ self.channel_map.get_plane_from_offline_channel(uc) for uc in channels ]
552 elements = [ self.channel_map.get_element_id_from_offline_channel(uc) for uc in channels ]
553 wib_chans = range(self.N_CHANNELS_PER_FRAME)
554
555 if get_ana_data:
556 adc_mean = np.mean(adcs,axis=0)
557 adc_rms = np.std(adcs,axis=0)
558 adc_max = np.max(adcs,axis=0)
559 adc_min = np.min(adcs,axis=0)
560 adc_median = np.median(adcs,axis=0)
561 ana_data = [ WIBEthAnalysisData(run=frh.run_number,
562 trigger=frh.trigger_number,
563 sequence=frh.sequence_number,
564 src_id=frh.element_id.id,
565 channel=channels[i_ch],
566 plane=planes[i_ch],
567 element=elements[i_ch],
568 wib_chan=wib_chans[i_ch],
569 adc_mean=adc_mean[i_ch],
570 adc_rms=adc_rms[i_ch],
571 adc_max=adc_max[i_ch],
572 adc_min=adc_min[i_ch],
573 adc_median=adc_median[i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
574 if get_wvfm_data:
575 timestamps = self.unpacker.np_array_timestamp(frag)
576 ffts = np.abs(np.fft.rfft(adcs,axis=0))
577 wvfm_data = [ WIBEthWaveformData(run=frh.run_number,
578 trigger=frh.trigger_number,
579 sequence=frh.sequence_number,
580 src_id=frh.element_id.id,
581 channel=channels[i_ch],
582 plane=planes[i_ch],
583 element=elements[i_ch],
584 wib_chan=wib_chans[i_ch],
585 timestamps=timestamps,
586 adcs=adcs[:,i_ch],
587 fft_mag=ffts[:,i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
588
589 return ana_data, wvfm_data
590
591
593
595 frame_obj = fddetdataformats.TDEEthFrame
596
597 SAMPLING_PERIOD = 31.25
598 N_CHANNELS_PER_FRAME = 64
599
600 def __init__(self,channel_map=None,ana_data_prescale=1,wvfm_data_prescale=None):
601 super().__init__(ana_data_prescale=ana_data_prescale, wvfm_data_prescale=wvfm_data_prescale)
602 if 'TPC' in channel_map:
603 self.channel_map = detchannelmaps.make_tpc_map(channel_map)
604 elif 'PDS' in channel_map:
605 self.channel_map = detchannelmaps.make_pds_map(channel_map)
606 else:
607 self.channel_map = NullChannelMap
608
609 def get_n_obj(self,frag):
610 return self.unpacker.get_n_frames(frag)
611
613 return self.frame_obj(frag.get_data()).get_daqheader().version
614
615 def get_timestamp_first(self,frag):
616 return self.frame_obj(frag.get_data()).get_timestamp()
617
618 def get_det_data_version(self,frag):
619 return self.frame_obj(frag.get_data()).get_tdeheader().version
620
622 dh = self.frame_obj(frag.get_data()).get_daqheader()
623 return dh.det_id, dh.crate_id, dh.slot_id, dh.stream_id
624
625 def get_det_header_data(self,frag):
626 frh = frag.get_header()
627
628 n_frames = self.get_n_objget_n_obj(frag)
629
630 errors_arr = np.empty(n_frames)
631 tai_time_arr = np.empty(n_frames)
632
633 for i in range(n_frames):
634 tdeh = self.frame_obj(frag.get_data(i*self.frame_obj.sizeof())).get_tdeheader()
635
636 errors_arr[i] = tdeh.tde_errors
637 tai_time_arr[i] = tdeh.TAItime
638
639 errors_change_idx, errors_change_val, _ = sparsify_array_diff_locs_and_vals(errors_arr)
640
641 tai_time_diff = np.diff(tai_time_arr)
642 tai_time_diff_change_idx, tai_time_diff_change_val, _ = sparsify_array_diff_locs_and_vals(tai_time_diff)
643
644 ts_arr = self.unpacker.np_array_timestamp(frag)
645 ts_diff_change_idx, ts_diff_change_val, _ = sparsify_array_diff_locs_and_vals(np.diff(ts_arr))
646
647 tdeh = self.frame_obj(frag.get_data()).get_tdeheader()
648 ts_diff_vals, ts_diff_counts = np.unique(np.diff(self.unpacker.np_array_timestamp(frag)),return_counts=True)
649 return [ TDEEthHeaderData(run=frh.run_number,
650 trigger=frh.trigger_number,
651 sequence=frh.sequence_number,
652 src_id=frh.element_id.id,
653 channel_id=tdeh.channel,
654 tde_header=tdeh.tde_header,
655 version=tdeh.version,
656 errors_vals=errors_change_val, errors_idx=errors_change_idx,
657 tai_time_diff_vals=tai_time_diff_change_val,
658 tai_time_diff_idx=tai_time_diff_change_idx,
659 tai_time_first=tai_time_arr[0],
660 timestamp_dts_diff_vals=ts_diff_change_val,
661 timestamp_dts_diff_idx=ts_diff_change_idx,
662 timestamp_dts_first=ts_arr[0],
663 n_frames=n_frames,
664 n_channels=self.N_CHANNELS_PER_FRAME,
665 sampling_period=self.SAMPLING_PERIOD) ]
666
667 def get_det_data_all(self,frag):
668 frh = frag.get_header()
669 trigger_number = frh.trigger_number
670
671 get_ana_data = (self.ana_data_prescale is not None and (trigger_number % self.ana_data_prescale)==0)
672 get_wvfm_data = (self.wvfm_data_prescale is not None and (trigger_number % self.wvfm_data_prescale)==0)
673
674 #print(f'\t\tTrigger number {trigger_number}: get_ana_data? {get_ana_data} get_wvfm_data? {get_wvfm_data}')
675
676 if not (get_ana_data or get_wvfm_data):
677 return None,None
678
679 ana_data = None
680 wvfm_data = None
681
682 adcs = self.unpacker.np_array_adc(frag)
683 det, crate, slot, stream = self.get_det_crate_slot_streamget_det_crate_slot_stream(frag)
684 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) ]
685 planes = [ self.channel_map.get_plane_from_offline_channel(uc) for uc in channels ]
686 elements = [ self.channel_map.get_element_id_from_offline_channel(uc) for uc in channels ]
687 tde_chans = range(self.N_CHANNELS_PER_FRAME)
688
689 if get_ana_data:
690 adc_mean = np.mean(adcs,axis=0)
691 adc_rms = np.std(adcs,axis=0)
692 adc_max = np.max(adcs,axis=0)
693 adc_min = np.min(adcs,axis=0)
694 adc_median = np.median(adcs,axis=0)
695 ana_data = [ TDEEthAnalysisData(run=frh.run_number,
696 trigger=frh.trigger_number,
697 sequence=frh.sequence_number,
698 src_id=frh.element_id.id,
699 channel=channels[i_ch],
700 plane=planes[i_ch],
701 element=elements[i_ch],
702 tde_chan=tde_chans[i_ch],
703 adc_mean=adc_mean[i_ch],
704 adc_rms=adc_rms[i_ch],
705 adc_max=adc_max[i_ch],
706 adc_min=adc_min[i_ch],
707 adc_median=adc_median[i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
708 if get_wvfm_data:
709 timestamps = self.unpacker.np_array_timestamp(frag)
710 ffts = np.abs(np.fft.rfft(adcs,axis=0))
711 wvfm_data = [ TDEEthWaveformData(run=frh.run_number,
712 trigger=frh.trigger_number,
713 sequence=frh.sequence_number,
714 src_id=frh.element_id.id,
715 channel=channels[i_ch],
716 plane=planes[i_ch],
717 element=elements[i_ch],
718 tde_chan=tde_chans[i_ch],
719 timestamps=timestamps,
720 adcs=adcs[:,i_ch],
721 fft_mag=ffts[:,i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
722
723 return ana_data, wvfm_data
724
726
728 frame_obj = fddetdataformats.DAPHNEStreamFrame
729
730 SAMPLING_PERIOD = 1
731 N_CHANNELS_PER_FRAME = 4
732
733 def get_n_obj(self,frag):
734 return self.unpacker.get_n_frames_stream(frag)
735
737 return self.frame_obj(frag.get_data()).get_daqheader().version
738
739 def get_timestamp_first(self,frag):
740 return self.frame_obj(frag.get_data()).get_timestamp()
741
742 def get_det_data_version(self,frag):
743 return 0
744
746 dh = self.frame_obj(frag.get_data()).get_daqheader()
747 return dh.det_id, dh.crate_id, dh.slot_id, dh.link_id
748
749 def get_det_header_data(self,frag):
750 frh = frag.get_header()
751 dh = self.frame_obj(frag.get_data()).get_header()
752 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)
753 return [ DAPHNEStreamHeaderData(run=frh.run_number,
754 trigger=frh.trigger_number,
755 sequence=frh.sequence_number,
756 src_id=frh.element_id.id,
757 n_channels=self.N_CHANNELS_PER_FRAME,
758 sampling_period=self.SAMPLING_PERIOD,
759 ts_diffs_vals=ts_diffs_vals,
760 ts_diffs_counts=ts_diffs_counts) ]
761
762 def get_det_data_all(self,frag):
763 frh = frag.get_header()
764 trigger_number = frh.trigger_number
765
766 get_ana_data = (self.ana_data_prescale is not None and (trigger_number % self.ana_data_prescale)==0)
767 get_wvfm_data = (self.wvfm_data_prescale is not None and (trigger_number % self.wvfm_data_prescale)==0)
768
769 if not (get_ana_data or get_wvfm_data):
770 return None,None
771
772 ana_data = None
773 wvfm_data = None
774
775 adcs = self.unpacker.np_array_adc_stream(frag)
776 dh = self.frame_obj(frag.get_data()).get_header()
777 channels = [ dh.channel_0, dh.channel_1, dh.channel_2, dh.channel_3 ]
778 daphne_chans = [ dh.channel_0, dh.channel_1, dh.channel_2, dh.channel_3 ]
779
780 if get_ana_data:
781 adc_mean = np.mean(adcs,axis=0)
782 adc_rms = np.std(adcs,axis=0)
783 adc_max = np.max(adcs,axis=0)
784 adc_min = np.min(adcs,axis=0)
785 adc_median = np.median(adcs,axis=0)
786 ana_data = [ DAPHNEStreamAnalysisData(run=frh.run_number,
787 trigger=frh.trigger_number,
788 sequence=frh.sequence_number,
789 src_id=frh.element_id.id,
790 channel=channels[i_ch],
791 daphne_chan=daphne_chans[i_ch],
792 adc_mean=adc_mean[i_ch],
793 adc_rms=adc_rms[i_ch],
794 adc_max=adc_max[i_ch],
795 adc_min=adc_min[i_ch],
796 adc_median=adc_median[i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
797 if get_wvfm_data:
798 timestamps = self.unpacker.np_array_timestamp_stream(frag)
799 ffts = np.abs(np.fft.rfft(adcs,axis=0))
800 wvfm_data = [ DAPHNEStreamWaveformData(run=frh.run_number,
801 trigger=frh.trigger_number,
802 sequence=frh.sequence_number,
803 src_id=frh.element_id.id,
804 channel=channels[i_ch],
805 daphne_chan=channels[i_ch],
806 adcs=adcs[:,i_ch],
807 timestamps=timestamps,
808 fft_mag=ffts[:,i_ch]) for i_ch in range(self.N_CHANNELS_PER_FRAME) ]
809 return ana_data, wvfm_data
810
811
813
815 frame_obj = fddetdataformats.DAPHNEFrame
816
817 SAMPLING_PERIOD = 1
818 N_CHANNELS_PER_FRAME = 1
819
820 def get_n_obj(self,frag):
821 return self.unpacker.get_n_frames(frag)
822
824 return self.frame_obj(frag.get_data()).get_daqheader().version
825
826 def get_timestamp_first(self,frag):
827 return self.frame_obj(frag.get_data()).get_timestamp()
828
829 def get_det_data_version(self,frag):
830 return 0
831
833 dh = self.frame_obj(frag.get_data()).get_daqheader()
834 return dh.det_id, dh.crate_id, dh.slot_id, dh.link_id
835
836 def get_det_header_data(self,frag):
837 return None
838
839 def get_det_data_all(self,frag):
840 frh = frag.get_header()
841 trigger_number = frh.trigger_number
842 wvfm_data = None
843 ana_data = None
844
845 get_ana_data = (self.ana_data_prescale is not None and (trigger_number % self.ana_data_prescale)==0)
846 get_wvfm_data = (self.wvfm_data_prescale is not None and (trigger_number % self.wvfm_data_prescale)==0)
847
848 if not (get_ana_data or get_wvfm_data):
849 return None,None
850
851 n_frames = self.get_n_objget_n_obj(frag)
852 adcs = self.unpacker.np_array_adc(frag)
853
854 daphne_headers = [ self.frame_obj(frag.get_data(iframe*self.frame_obj.sizeof())).get_header() for iframe in range(n_frames) ]
855 timestamp = self.unpacker.np_array_timestamp(frag)
856
857 if (len(adcs)) == 0:
858 return None, None
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=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=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, ana_data_prescale=1, wvfm_data_prescale=None)
Definition utils.py:369
get_offline_channel_from_det_crate_slot_stream_chan(det, crate, slot, stream, ch)
Definition utils.py:23
__init__(self, channel_map=None, ana_data_prescale=1, wvfm_data_prescale=None)
Definition utils.py:600
__init__(self, index=None)
Definition utils.py:39
get_all_data(self, in_data=None)
Definition utils.py:42
__init__(self, channel_map=None, ana_data_prescale=1, wvfm_data_prescale=None)
Definition utils.py:421
sparsify_array_diff_locs_and_vals(arr)
Sparsification and desparsifications for arrays.