@@ -125,17 +125,20 @@ class sbndaq::SBNDXARAPUCADecoder : public art::EDProducer {
125125 art::ServiceHandle<art::TFileService> tfs; /* *< ServiceHandle object to store the histograms in the decoder_hist.root output file. */
126126 int fstore_debug_waveforms; /* *< Number of waveforms to store in the ServiceHandle object for debugging purposes (0: none, -1: all, n: first n waveforms each event). */
127127
128+ bool fcombine_ext_frag; /* *< If `true` combines extended fragments into a single raw::OpDetWaveform object. */
129+
128130 bool fdebug_tdc_handle; /* *< If `true` SPEC-TDC information is printed. */
129131 bool fdebug_ptb_handle; /* *< If `true` PTB information is printed. */
130132 bool fdebug_fragments_handle; /* *< If `true` V1740B CAEN fragments art::Handle information is printed. */
131133 bool fdebug_timing; /* *< If `true` timing data is printed. */
132134 bool fdebug_buffer; /* *< If `true` the buffer status is printed. */
133135 bool fdebug_waveforms; /* *< If `true` waveforms decoding data is printed. */
134136 bool fdebug_extended_fragments; /* *< If `true` extended fragments information is printed. */
137+ bool fdebug_jittering; /* *< If `true` trigger jittering information is printed. */
135138 bool fverbose; /* *< If `true` it increases verbosity of console output for detailed processing steps. */
136139
137140 // Main processing method.
138- void decode_fragment (int32_t & prev_TTT, uint64_t timestamp, uint64_t & nominal_frag_timestamp, int32_t & nominal_TTT, std::vector<size_t > & fragment_indices, const artdaq::Fragment& fragment, std::vector <raw::OpDetWaveform>& prod_wvfms, std::vector<std::vector<uint16_t >>& wvfms, bool last_one);
141+ void decode_fragment (uint64_t timestamp, uint64_t & nominal_frag_timestamp, int32_t & nominal_TTT, int32_t & prev_TTT , std::vector<size_t > & fragment_indices, const artdaq::Fragment& fragment, std::vector <raw::OpDetWaveform>& prod_wvfms, std::vector<std::vector<uint16_t >>& wvfms, bool last_one);
139142
140143 // Timing.
141144 void shift_time (uint64_t TTT_ticks, int64_t TTT_end_ns, uint64_t frag_timestamp, uint64_t timestamp, uint32_t num_samples_per_wvfm, double & ini_wvfm_timestamp, double & end_wvfm_timestamp);
@@ -212,13 +215,17 @@ sbndaq::SBNDXARAPUCADecoder::SBNDXARAPUCADecoder(fhicl::ParameterSet const& p)
212215 // Gets the number of waveforms to store in the debug output file.
213216 fstore_debug_waveforms = p.get <int > (" store_debug_waveforms" , 0 );
214217
218+ // Gets the combination of extended fragments option.
219+ fcombine_ext_frag = p.get <bool > (" combine_ext_frag" , true );
220+
215221 // Gets the debug and verbose options.
216222 fdebug_ptb_handle = p.get <bool > (" debug_ptb_handle" , false );
217223 fdebug_tdc_handle = p.get <bool > (" debug_tdc_handle" , false );
218224 fdebug_fragments_handle = p.get <bool > (" debug_fragments_handle" , false );
219225 fdebug_timing = p.get <bool > (" debug_timing" , false );
220226 fdebug_waveforms = p.get <bool > (" debug_waveforms" , false );
221227 fdebug_extended_fragments = p.get <bool > (" debug_extended_fragments" , false );
228+ fdebug_jittering = p.get <bool > (" debug_jittering" , false );
222229 fdebug_buffer = p.get <bool > (" debug_buffer" , false );
223230 fverbose = p.get <bool > (" verbose" , false );
224231
@@ -320,7 +327,7 @@ void sbndaq::SBNDXARAPUCADecoder::produce(art::Event& e) {
320327 }
321328
322329 int32_t nominal_TTT = TTT_DEFAULT;
323- int32_t prev_TTT = TTT_DEFAULT ;
330+ int32_t prev_TTT = 0 ;
324331 uint64_t nominal_frag_timestamp = TTT_DEFAULT;
325332 bool last_one = false ;
326333
@@ -361,7 +368,7 @@ void sbndaq::SBNDXARAPUCADecoder::produce(art::Event& e) {
361368 for (size_t f = 0 ; f < num_caen_fragments; f++) {
362369 const artdaq::Fragment fragment = *container_fragment[f].get ();
363370 last_one = f == (num_caen_fragments - 1 );
364- decode_fragment (prev_TTT, timestamp, nominal_frag_timestamp, nominal_TTT, fragment_indices, fragment, *prod_wvfms, wvfms, last_one);
371+ decode_fragment (timestamp, nominal_frag_timestamp, nominal_TTT, prev_TTT , fragment_indices, fragment, *prod_wvfms, wvfms, last_one);
365372 } // End CAEN V1740 fragments loop.
366373 }
367374 } // End Container fragments loop.
@@ -374,7 +381,7 @@ void sbndaq::SBNDXARAPUCADecoder::produce(art::Event& e) {
374381 for (size_t f = 0 ; f < frag_handle_size; f++) {
375382 const artdaq::Fragment fragment = fragment_handle->at (f);
376383 last_one = f == (frag_handle_size - 1 );
377- decode_fragment (prev_TTT, timestamp, nominal_frag_timestamp, nominal_TTT, fragment_indices, fragment, *prod_wvfms, wvfms, last_one);
384+ decode_fragment (timestamp, nominal_frag_timestamp, nominal_TTT, prev_TTT , fragment_indices, fragment, *prod_wvfms, wvfms, last_one);
378385 } // End CAEN V1740 fragments loop.
379386 }
380387 } // End extracting CAEN V1740 fragments.
@@ -426,7 +433,7 @@ void sbndaq::SBNDXARAPUCADecoder::produce(art::Event& e) {
426433 * @see dump_waveforms
427434 */
428435
429- void sbndaq::SBNDXARAPUCADecoder::decode_fragment (int32_t & prev_TTT, uint64_t timestamp, uint64_t & nominal_frag_timestamp, int32_t & nominal_TTT, std::vector<size_t > & fragment_indices, const artdaq::Fragment& fragment, std::vector <raw::OpDetWaveform>& prod_wvfms, std::vector<std::vector<uint16_t >>& wvfms, bool last_one) {
436+ void sbndaq::SBNDXARAPUCADecoder::decode_fragment (uint64_t timestamp, uint64_t & nominal_frag_timestamp, int32_t & nominal_TTT, int32_t & prev_TTT , std::vector<size_t > & fragment_indices, const artdaq::Fragment& fragment, std::vector <raw::OpDetWaveform>& prod_wvfms, std::vector<std::vector<uint16_t >>& wvfms, bool last_one) {
430437 auto fragment_id = fragment.fragmentID () - ffragment_id_offset;
431438 auto it = std::find (fboard_id_list.begin (), fboard_id_list.end (), fragment_id);
432439 size_t board_idx;
@@ -506,68 +513,76 @@ void sbndaq::SBNDXARAPUCADecoder::decode_fragment(int32_t& prev_TTT, uint64_t ti
506513 double ini_wvfm_timestamp = 0 ;
507514 double end_wvfm_timestamp = 0 ;
508515
509- bool is_nominal_length = (num_nominal_samples_per_wvfm == num_samples_per_wvfm);
510- bool is_first = (fragment_indices[board_idx] == 0 );
511-
512- int32_t TTT_dif = 0 ;
513- // If the fragment timestamp is greater than the TTT end timestamp, it means that rollover occurred.
514- if (nominal_TTT > TTT_end_ns) {
515- if (fverbose | fdebug_timing) std::cout << " > SBNDXARAPUCADecoder::decode_fragment: CAEN TTT rollover occurred." << std::endl;
516- TTT_dif = nominal_TTT - (NANOSEC_IN_SEC - TTT_end_ns);
517- } else {
518- TTT_dif = TTT_end_ns - nominal_TTT;
519- }
520- bool is_in_time = TTT_dif <= static_cast <int >(num_nominal_samples_per_wvfm * fns_per_sample);
521-
522516 if (fverbose) {
523517 std::cout << " > SBNDXARAPUCADecoder::decode_fragment: processing the decoded fragment and combines the extended ones to their nominal ones if needed." << std::endl;
524518 }
525- if (is_nominal_length) {
526- // ///
519+
520+ if (fcombine_ext_frag) {
521+ bool is_nominal_length = (num_nominal_samples_per_wvfm == num_samples_per_wvfm);
522+ bool is_first = (fragment_indices[board_idx] == 0 );
523+
524+ int32_t TTT_dif = 0 ;
525+ // If the fragment timestamp is greater than the TTT end timestamp, it means that rollover occurred.
526+ if (nominal_TTT > TTT_end_ns) {
527+ if (fverbose | fdebug_timing) std::cout << " > SBNDXARAPUCADecoder::decode_fragment: CAEN TTT rollover occurred." << std::endl;
528+ TTT_dif = nominal_TTT - (NANOSEC_IN_SEC - TTT_end_ns);
529+ } else {
530+ TTT_dif = TTT_end_ns - nominal_TTT;
531+ }
532+ bool is_in_time = TTT_dif <= static_cast <int >(num_nominal_samples_per_wvfm * fns_per_sample);
533+
527534 int32_t TTT_ini_ns = TTT_end_ns - static_cast <int32_t >(num_nominal_samples_per_wvfm * fns_per_sample);
528- std::cout << " \t\t NOMINAL fragment (" << num_samples_per_wvfm << " ), [" << TTT_ini_ns << " , " << TTT_end_ns << " ] diff with prev: " << TTT_end_ns - prev_TTT << " ns, length: " << num_samples_per_wvfm * fns_per_sample << " ns, diff_with_length: " << (TTT_end_ns - prev_TTT) - (num_samples_per_wvfm * fns_per_sample) << std::endl;
529- // ////
530- if (!is_first) {
535+
536+ if (is_nominal_length) {
537+ if (fdebug_jittering) {
538+ std::cout << " \t\t NOMINAL fragment (" << num_samples_per_wvfm << " ), [" << TTT_ini_ns << " , " << TTT_end_ns << " ] diff with prev: " << TTT_end_ns - prev_TTT << " ns, length: " << num_samples_per_wvfm * fns_per_sample << " ns, diff_with_length: " << (TTT_end_ns - prev_TTT) - (num_samples_per_wvfm * fns_per_sample) << std::endl;
539+ }
540+ if (!is_first) {
541+ if (fdebug_extended_fragments) {
542+ std::cout << " \t\t NOT FIRST NOMINAL fragment " << std::endl;
543+ std::cout << " \t\t nominal_TTT: " << nominal_TTT << " TTT_end_ns: " << TTT_end_ns << std::endl;
544+ std::cout << " \t\t nominal_frag_timestamp: " << nominal_frag_timestamp << " frag_timestamp : " << frag_timestamp << std::endl;
545+ }
546+ shift_time (TTT_ticks, nominal_TTT, nominal_frag_timestamp, timestamp, num_nominal_samples_per_wvfm, ini_wvfm_timestamp, end_wvfm_timestamp);
547+ dump_waveforms (prod_wvfms, wvfms, fragment_indices, board_idx, num_channels, ini_wvfm_timestamp, end_wvfm_timestamp);
548+ } else {
549+ if (fdebug_extended_fragments) std::cout << " \t\t FIRST NOMINAL fragment " << std::endl;
550+ }
551+ combine_waveforms (wvfms, fragment_wvfms, num_channels);
552+ nominal_TTT = TTT_end_ns;
553+ nominal_frag_timestamp = frag_timestamp;
554+ } else if (is_in_time) {
531555 if (fdebug_extended_fragments) {
532- std::cout << " \t\t NOT FIRST NOMINAL fragment " << std::endl;
533- std::cout << " \t\t nominal_TTT: " << nominal_TTT << " TTT_end_ns: " << TTT_end_ns << std::endl;
534- std::cout << " \t\t nominal_frag_timestamp: " << nominal_frag_timestamp << " frag_timestamp : " << frag_timestamp << std::endl;
556+ std::cout << " \t\t EXTENDED fragment " << std::endl;
557+ std::cout << " \t\t TTT_dif w.r.t. nominal TTT: " << TTT_dif << " ns, is_in_time: " << is_in_time << std::endl;
535558 }
559+ if (fdebug_jittering) {
560+ std::cout << " \t\t EXTENDED fragment (" << num_samples_per_wvfm << " ), [" << TTT_ini_ns << " , " << TTT_end_ns << " ] diff with prev: " << TTT_end_ns - prev_TTT << " ns, length: " << num_samples_per_wvfm * fns_per_sample << " ns, diff_with_length: " << (TTT_end_ns - prev_TTT) - (num_samples_per_wvfm * fns_per_sample) << std::endl;
561+ }
562+
563+ combine_waveforms (wvfms, fragment_wvfms, num_channels);
564+ } else if (!is_in_time) {
565+ // combine_waveforms(wvfms, fragment_wvfms, num_channels); //TEMP!!!!!
566+ if (fdebug_jittering) {
567+ std::cout << " \t\t EXTENDED? fragment (" << num_samples_per_wvfm << " ), [" << TTT_ini_ns << " , " << TTT_end_ns << " ] diff with prev: " << TTT_end_ns - prev_TTT << " ns, length: " << num_samples_per_wvfm * fns_per_sample << " ns, diff_with_length: " << (TTT_end_ns - prev_TTT) - (num_samples_per_wvfm * fns_per_sample) << std::endl;
568+ }
569+ std::cout << " \t\t WARNING: EXTENDED fragment out of time window! TTT_dif: " << TTT_dif << " ns, fragment idx: " << fragment_indices[board_idx] << " , board idx: " << board_idx << " (slot " << fboard_id_list[board_idx] << " ), " << num_samples_per_wvfm << " samples. Skipping this fragment..." << std::endl;
570+ }
571+
572+ fragment_indices[board_idx]++;
573+
574+ if (last_one) {
575+ if (fdebug_extended_fragments) std::cout << " \t\t LAST fragment " << std::endl;
536576 shift_time (TTT_ticks, nominal_TTT, nominal_frag_timestamp, timestamp, num_nominal_samples_per_wvfm, ini_wvfm_timestamp, end_wvfm_timestamp);
537577 dump_waveforms (prod_wvfms, wvfms, fragment_indices, board_idx, num_channels, ini_wvfm_timestamp, end_wvfm_timestamp);
538- } else {
539- if (fdebug_extended_fragments) std::cout << " \t\t FIRST NOMINAL fragment " << std::endl;
540578 }
541- combine_waveforms (wvfms, fragment_wvfms, num_channels);
542- nominal_TTT = TTT_end_ns;
543- nominal_frag_timestamp = frag_timestamp;
544- } else if (is_in_time) {
545- if (fdebug_extended_fragments) {
546- std::cout << " \t\t EXTENDED fragment " << std::endl;
547- std::cout << " \t\t TTT_dif w.r.t. nominal TTT: " << TTT_dif << " ns, is_in_time: " << is_in_time << std::endl;
548- }
549- // ///
550- int32_t TTT_ini_ns = TTT_end_ns - static_cast <int32_t >(num_nominal_samples_per_wvfm * fns_per_sample);
551- std::cout << " \t\t EXTENDED fragment (" << num_samples_per_wvfm << " ), [" << TTT_ini_ns << " , " << TTT_end_ns << " ] diff with prev: " << TTT_end_ns - prev_TTT << " ns, length: " << num_samples_per_wvfm * fns_per_sample << " ns, diff_with_length: " << (TTT_end_ns - prev_TTT) - (num_samples_per_wvfm * fns_per_sample) << std::endl;
552- // ////
553- combine_waveforms (wvfms, fragment_wvfms, num_channels);
554- } else if (!is_in_time) {
555- // combine_waveforms(wvfms, fragment_wvfms, num_channels); //TEMP!!!!!
556- // ///
557- int32_t TTT_ini_ns = TTT_end_ns - static_cast <int32_t >(num_nominal_samples_per_wvfm * fns_per_sample);
558- std::cout << " \t\t EXTENDED? fragment (" << num_samples_per_wvfm << " ), [" << TTT_ini_ns << " , " << TTT_end_ns << " ] diff with prev: " << TTT_end_ns - prev_TTT << " ns, length: " << num_samples_per_wvfm * fns_per_sample << " ns, diff_with_length: " << (TTT_end_ns - prev_TTT) - (num_samples_per_wvfm * fns_per_sample) << std::endl;
559- // ////
560- std::cout << " \t\t WARNING: EXTENDED fragment out of time window! TTT_dif: " << TTT_dif << " ns, fragment idx: " << fragment_indices[board_idx] << " , board idx: " << board_idx << " (slot " << fboard_id_list[board_idx] << " ), " << num_samples_per_wvfm << " samples. Skipping this fragment..." << std::endl;
579+ prev_TTT = TTT_end_ns;
580+ } else {
581+ shift_time (TTT_ticks, TTT_end_ns, frag_timestamp, timestamp, num_samples_per_wvfm, ini_wvfm_timestamp, end_wvfm_timestamp);
582+ dump_waveforms (prod_wvfms, fragment_wvfms, fragment_indices, board_idx, num_channels, ini_wvfm_timestamp, end_wvfm_timestamp);
583+ fragment_indices[board_idx]++;
561584 }
562-
563- fragment_indices[board_idx]++;
564585
565- if (last_one) {
566- if (fdebug_extended_fragments) std::cout << " \t\t LAST fragment " << std::endl;
567- shift_time (TTT_ticks, nominal_TTT, nominal_frag_timestamp, timestamp, num_nominal_samples_per_wvfm, ini_wvfm_timestamp, end_wvfm_timestamp);
568- dump_waveforms (prod_wvfms, wvfms, fragment_indices, board_idx, num_channels, ini_wvfm_timestamp, end_wvfm_timestamp);
569- }
570- prev_TTT = TTT_end_ns;
571586 }
572587
573588}
0 commit comments