Skip to content

Commit 15f34cd

Browse files
committed
First version of timing check implemented (some extended fragments do not fulfill the requirements
1 parent 2f7ff45 commit 15f34cd

2 files changed

Lines changed: 43 additions & 15 deletions

File tree

sbndcode/Decoders/XARAPUCA/SBNDXARAPUCADecoder_module.cc

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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 =============== //

sbndcode/Decoders/XARAPUCA/xarapucadecoder.fcl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ xarapucadecoder:
3232
# - Output data product instance name.
3333
waveforms_instance_name: "XARAPUCAChannels" # Name for the instance product containing the raw decoded waveforms.
3434
timing_ref_instance_name: "" # Name for the instance product containing the timing reference information.
35-
store_debug_waveforms: 0 # Number of waveforms to store (0: none, -1: all, n: first n waveforms).
35+
store_debug_waveforms: -1 # Number of waveforms to store (0: none, -1: all, n: first n waveforms).
3636
# - Debug options.
3737
debug_tdc_handle: false # (De)activates SPEC-TDC art::Handle information printing.
3838
debug_ptb_handle: false # (De)activates PTB art::Handle information printing.

0 commit comments

Comments
 (0)