LCOV - code coverage report
Current view: top level - triggeralgs/src/ProtoDUNEBSMWindow - ProtoDUNEBSMWindow.cpp (source / functions) Coverage Total Hit
Test: code.result Lines: 0.0 % 61 0
Test Date: 2026-03-29 15:29:34 Functions: 0.0 % 11 0

            Line data    Source code
       1              : #include "triggeralgs/ProtoDUNEBSMWindow/ProtoDUNEBSMWindow.hpp"
       2              : 
       3              : #include <ostream>
       4              : #include <vector>
       5              : #include <numeric>
       6              : 
       7              : namespace triggeralgs {
       8              :       
       9            0 : bool ProtoDUNEBSMWindow::is_empty() const{
      10            0 :   return tp_list.empty();
      11              : };
      12              : 
      13            0 : void ProtoDUNEBSMWindow::add(TriggerPrimitive const &input_tp){
      14              :   // Add the input TP's contribution to the total ADC and add it to
      15              :   // the TP list. Also keep running sum of all the samples over threshold
      16              :   // and the peak ADC. These are used for samples/peak ratio cut
      17            0 :   adc_integral += input_tp.adc_integral;
      18            0 :   adc_peak_sum += input_tp.adc_peak;
      19            0 :   tot_sum += input_tp.samples_over_threshold;
      20            0 :   tp_list.push_back(input_tp);
      21            0 : };
      22              : 
      23            0 : void ProtoDUNEBSMWindow::clear(){
      24            0 :   tp_list.clear();
      25            0 : };
      26              :       
      27            0 : void ProtoDUNEBSMWindow::move(TriggerPrimitive const &input_tp, timestamp_t const &window_length){
      28              :   // Find all of the TPs in the window that need to be removed
      29              :   // if the input_tp is to be added and the size of the window
      30              :   // is to be conserved.
      31              :   // Substract those TPs' contribution from the total window ADC.
      32            0 :   uint32_t n_tps_to_erase = 0;
      33            0 :   for(auto tp : tp_list){
      34            0 :     if(!(input_tp.time_start-tp.time_start < window_length)){
      35            0 :       n_tps_to_erase++;
      36            0 :       adc_integral -= tp.adc_integral;
      37            0 :       adc_peak_sum -= tp.adc_peak;
      38            0 :       tot_sum -= tp.samples_over_threshold;
      39              :     }
      40              :     else break;
      41              :   }
      42              :   // Erase the TPs from the window.
      43            0 :   tp_list.erase(tp_list.begin(), tp_list.begin()+n_tps_to_erase);
      44              :   // Make the window start time the start time of what is now the
      45              :   // first TP.
      46            0 :   if(tp_list.size()!=0){
      47            0 :     time_start = tp_list.front().time_start;
      48            0 :     add(input_tp);
      49              :   }
      50            0 :   else reset(input_tp);
      51            0 : };
      52              : 
      53            0 : void ProtoDUNEBSMWindow::reset(TriggerPrimitive const &input_tp){
      54              :   // Empty the TP list.
      55            0 :   tp_list.clear();
      56              :   // Set the start time of the window to be the start time of the 
      57              :   // input_tp.
      58            0 :   time_start = input_tp.time_start;
      59              :   // Start the total ADC integral.
      60            0 :   adc_integral = input_tp.adc_integral;
      61              :   // Add the input TP to the TP list.
      62            0 :   tp_list.push_back(input_tp);
      63            0 : };
      64              : 
      65            0 : void ProtoDUNEBSMWindow::bin_window(
      66              :     std::vector<float> &input, timestamp_t time_bin_width, 
      67              :     channel_t chan_bin_width, int num_time_bins, 
      68              :     int num_chan_bins, channel_t first_channel,
      69              :     std::unique_ptr<PDVDEffectiveChannelMap> const &effective_channel_mapper, 
      70              :     bool use_pdvd_map) {
      71            0 :   std::fill(input.begin(), input.end(), 0.0f);
      72              : 
      73            0 :   const float inv_time_bin_width = 1.0f / time_bin_width;
      74            0 :   const float inv_chan_bin_width = 1.0f / chan_bin_width;
      75              : 
      76            0 :   for (const TriggerPrimitive& tp : tp_list) {
      77            0 :     channel_t temp_tp_channel = tp.channel;
      78              :     // If in PD-VD convert to effective channel here
      79            0 :     if (effective_channel_mapper && use_pdvd_map) {
      80            0 :       temp_tp_channel = effective_channel_mapper->remapCollectionPlaneChannel(temp_tp_channel);
      81              :     }
      82            0 :     size_t time_bin = static_cast<size_t>((tp.time_start - time_start) * inv_time_bin_width);
      83            0 :     size_t channel_bin = static_cast<size_t>((temp_tp_channel - first_channel) * inv_chan_bin_width);
      84            0 :     if (time_bin < num_time_bins && channel_bin < num_chan_bins) {
      85            0 :       size_t index = channel_bin * num_time_bins + time_bin;
      86            0 :       input[index] += tp.adc_integral;
      87              :     }
      88              :   }
      89            0 :   input[num_time_bins * num_chan_bins] = adc_integral;
      90            0 : };
      91              : 
      92            0 : void ProtoDUNEBSMWindow::fill_entry_window(std::vector<Entry> &entry_input, std::vector<float> &input) {
      93            0 :   for (size_t i = 0; i < input.size(); i++) {
      94            0 :     entry_input[i].fvalue = input[i];
      95              :   }
      96            0 : }
      97              : 
      98            0 : float ProtoDUNEBSMWindow::mean_sadc() {
      99            0 :   return static_cast<float>(adc_integral / tp_list.size());;
     100              : }
     101            0 : float ProtoDUNEBSMWindow::mean_adc_peak() {
     102            0 :   return static_cast<float>(adc_peak_sum / tp_list.size());
     103              : }
     104            0 : float ProtoDUNEBSMWindow::mean_tot() {
     105            0 :   return static_cast<float>(tot_sum / tp_list.size());
     106              : }
     107              : 
     108            0 : std::ostream& operator<<(std::ostream& os, const ProtoDUNEBSMWindow& window){
     109            0 :   if(window.is_empty()) os << "Window is empty!\n";
     110              :   else{
     111            0 :     os << "Window start: " << window.time_start << ", end: " << window.tp_list.back().time_start;
     112            0 :     os << ". Total of: " << window.adc_integral << " ADC counts with " << window.tp_list.size() << " TPs.\n"; 
     113              :   }
     114            0 :   return os;
     115              : };
     116              : 
     117              : }
        

Generated by: LCOV version 2.0-1