Skip to content

Commit 3f44697

Browse files
committed
Add jittering debug option and combine fragments option
1 parent 15f34cd commit 3f44697

2 files changed

Lines changed: 76 additions & 58 deletions

File tree

sbndcode/Decoders/XARAPUCA/SBNDXARAPUCADecoder_module.cc

Lines changed: 71 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

sbndcode/Decoders/XARAPUCA/xarapucadecoder.fcl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ xarapucadecoder:
2323
# - SPEC-TDC access configuration
2424
spectdc_product_name: "tdcdecoder" # Name for getting SPEC-TDC Decoder products (if any).
2525
spectdc_ftrig_ch: 3 # Channel assigned to flash triggers.
26-
spectdc_etrig_ch: 4 # Channel assigned to ETT (Event Trigger Timestamp) triggers.
26+
spectdc_etrig_ch: 2 # Channel assigned to ETT (Event Trigger Timestamp) triggers.
2727
# - PTB access configuration
2828
ptb_product_name: "ptbdecoder" # Name for getting PTB Decoder products (if any).
2929
allowed_hl_triggers: [1, 2, 3, 4, 5, 14, 15] # List of allowed HLT trigger types (1-5, 14, 15).
@@ -32,7 +32,9 @@ 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: -1 # Number of waveforms to store (0: none, -1: all, n: first n waveforms).
35+
store_debug_waveforms: 0 # Number of waveforms to store (0: none, -1: all, n: first n waveforms).
36+
# Combination of extended fragments.
37+
combine_ext_frag: false # (De)activates the combination of extended fragments into a single raw::OpDetWaveform object.
3638
# - Debug options.
3739
debug_tdc_handle: false # (De)activates SPEC-TDC art::Handle information printing.
3840
debug_ptb_handle: false # (De)activates PTB art::Handle information printing.
@@ -41,6 +43,7 @@ xarapucadecoder:
4143
debug_buffer: false # (De)activates buffer status printing.
4244
debug_waveforms: false # (De)activates waveforms decoding printing.
4345
debug_extended_fragments: false # (De)activates extended fragments information printing.
46+
debug_jittering: false # (De)activates trigger jittering information printing.
4447
# - Verbose option.
4548
verbose: false # (De)activates verbosity.
4649
}

0 commit comments

Comments
 (0)