@@ -135,7 +135,7 @@ class sbndaq::SBNDXARAPUCADecoder : public art::EDProducer {
135135 bool fverbose; /* *< If `true` it increases verbosity of console output for detailed processing steps. */
136136
137137 // Main processing method.
138- void decode_fragment (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);
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);
139139
140140 // Timing.
141141 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);
@@ -320,6 +320,7 @@ void sbndaq::SBNDXARAPUCADecoder::produce(art::Event& e) {
320320 }
321321
322322 int32_t nominal_TTT = TTT_DEFAULT;
323+ int32_t prev_TTT = TTT_DEFAULT;
323324 uint64_t nominal_frag_timestamp = TTT_DEFAULT;
324325 bool last_one = false ;
325326
@@ -360,7 +361,7 @@ void sbndaq::SBNDXARAPUCADecoder::produce(art::Event& e) {
360361 for (size_t f = 0 ; f < num_caen_fragments; f++) {
361362 const artdaq::Fragment fragment = *container_fragment[f].get ();
362363 last_one = f == (num_caen_fragments - 1 );
363- decode_fragment (timestamp, nominal_frag_timestamp, nominal_TTT, fragment_indices, fragment, *prod_wvfms, wvfms, last_one);
364+ decode_fragment (prev_TTT, timestamp, nominal_frag_timestamp, nominal_TTT, fragment_indices, fragment, *prod_wvfms, wvfms, last_one);
364365 } // End CAEN V1740 fragments loop.
365366 }
366367 } // End Container fragments loop.
@@ -373,7 +374,7 @@ void sbndaq::SBNDXARAPUCADecoder::produce(art::Event& e) {
373374 for (size_t f = 0 ; f < frag_handle_size; f++) {
374375 const artdaq::Fragment fragment = fragment_handle->at (f);
375376 last_one = f == (frag_handle_size - 1 );
376- decode_fragment (timestamp, nominal_frag_timestamp, nominal_TTT, fragment_indices, fragment, *prod_wvfms, wvfms, last_one);
377+ decode_fragment (prev_TTT, timestamp, nominal_frag_timestamp, nominal_TTT, fragment_indices, fragment, *prod_wvfms, wvfms, last_one);
377378 } // End CAEN V1740 fragments loop.
378379 }
379380 } // End extracting CAEN V1740 fragments.
@@ -425,7 +426,7 @@ void sbndaq::SBNDXARAPUCADecoder::produce(art::Event& e) {
425426 * @see dump_waveforms
426427 */
427428
428- void sbndaq::SBNDXARAPUCADecoder::decode_fragment (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) {
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) {
429430 auto fragment_id = fragment.fragmentID () - ffragment_id_offset;
430431 auto it = std::find (fboard_id_list.begin (), fboard_id_list.end (), fragment_id);
431432 size_t board_idx;
@@ -445,12 +446,6 @@ void sbndaq::SBNDXARAPUCADecoder::decode_fragment(uint64_t timestamp, uint64_t&
445446 if (valid_fragment) {
446447 if (fverbose) std::cout << " \n > SBNDXARAPUCADecoder::decode_fragment: decoding V1740 CAEN fragment " << fragment_indices[board_idx] << " from the board " << board_idx << " (slot " << fboard_id_list[board_idx] << " ):" << std::endl;
447448
448- bool is_nominal_length = false ;
449- bool is_first = false ;
450-
451- double ini_wvfm_timestamp = 0 ;
452- double end_wvfm_timestamp = 0 ;
453-
454449 // =============== Accesses Event metadata and Event header for this fragment =============== //
455450
456451 CAENV1740Fragment caen_fragment (fragment);
@@ -508,13 +503,30 @@ void sbndaq::SBNDXARAPUCADecoder::decode_fragment(uint64_t timestamp, uint64_t&
508503 std::vector <std::vector <uint16_t > > fragment_wvfms (num_channels, std::vector<uint16_t >(num_samples_per_wvfm, 0 ));
509504 decode_waveforms (fragment, fragment_wvfms, header_size, num_channels, num_samples_per_wvfm, num_words_per_wvfms, num_samples_per_group);
510505
511- is_nominal_length = (num_nominal_samples_per_wvfm == num_samples_per_wvfm);
512- is_first = (fragment_indices[board_idx] == 0 );
506+ double ini_wvfm_timestamp = 0 ;
507+ double end_wvfm_timestamp = 0 ;
508+
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);
513521
514522 if (fverbose) {
515523 std::cout << " > SBNDXARAPUCADecoder::decode_fragment: processing the decoded fragment and combines the extended ones to their nominal ones if needed." << std::endl;
516524 }
517525 if (is_nominal_length) {
526+ // ///
527+ 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+ // ////
518530 if (!is_first) {
519531 if (fdebug_extended_fragments) {
520532 std::cout << " \t\t NOT FIRST NOMINAL fragment " << std::endl;
@@ -529,9 +541,23 @@ void sbndaq::SBNDXARAPUCADecoder::decode_fragment(uint64_t timestamp, uint64_t&
529541 combine_waveforms (wvfms, fragment_wvfms, num_channels);
530542 nominal_TTT = TTT_end_ns;
531543 nominal_frag_timestamp = frag_timestamp;
532- } else {
533- if (fdebug_extended_fragments) std::cout << " \t\t EXTENDED fragment " << std::endl;
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+ // ////
534553 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;
535561 }
536562
537563 fragment_indices[board_idx]++;
@@ -541,7 +567,9 @@ void sbndaq::SBNDXARAPUCADecoder::decode_fragment(uint64_t timestamp, uint64_t&
541567 shift_time (TTT_ticks, nominal_TTT, nominal_frag_timestamp, timestamp, num_nominal_samples_per_wvfm, ini_wvfm_timestamp, end_wvfm_timestamp);
542568 dump_waveforms (prod_wvfms, wvfms, fragment_indices, board_idx, num_channels, ini_wvfm_timestamp, end_wvfm_timestamp);
543569 }
570+ prev_TTT = TTT_end_ns;
544571 }
572+
545573}
546574
547575// =============== Timing functions =============== //
0 commit comments