otsdaq-mu2e-stm  5.02.01
baseline_config.hh
1 #ifndef BASELINE_CONFIG_HH_
2 #define BASELINE_CONFIG_HH_
3 
4 #include <algorithm>
5 #include <cstdint>
6 
7 // Include config files
8 #include "Mu2e-STMDAQ/config/config.hh"
9 #include "Mu2e-STMDAQ/config/include/fw_config.hh"
10 #include "Mu2e-STMDAQ/config/include/buffer_config.hh"
11 
12 // Baseline configurable variables
14 
15  // Histogram
16  const size_t hist_bin_num; // Number of histogram bins
17  const int16_t hist_min_adc; // Minimum adc value
18  const int16_t hist_max_adc; // Maximum adc value
19  const double hist_bin_width; // Histogram bin width
20  const double hist_inv_bin_width; // Histogram inverse bin width
21  const std::vector<double> hist_bin_centres; // Histogram bin centres
22 
23  // Sliding window histogram
24  const double hist_window_period; // The period in time for a hist window
25  const size_t hist_window_buffers; // Num of hist window buffers
26  const bool window_delay; // Delay DAQ to calculate baseline?
27 
28  // Expectation-Maximization variables
29  const size_t EM_max_iters; // Maximum EM iterations
30  const double EM_LL_tol; // Convergence tolerance for log-likelihood change
31  const double EM_var_floor; // Minimum allowed variance (prevents numerical collapse)
32 
33  // Baseline mean and sigma from previous run
34  const double prev_mean, prev_sigma;
35 
36  // Constructor
37  baseline_info(Config& cfg, const std::shared_ptr<AsyncLogger> logger,
38  fw_info fw_config, buffer_info buffer_config,
39  double max_adc_in_buffer) :
40  hist_bin_num(cfg.getValue<int>("stm.baseline.hist.bin_num")), // Number of bins
41  hist_min_adc(std::clamp(cfg.getValue<int>("stm.baseline.hist.min_adc"), // Minimum adc value
42  static_cast<int>(std::numeric_limits<int16_t>::min()),
43  static_cast<int>(std::numeric_limits<int16_t>::max()))),
44  hist_max_adc(std::clamp(cfg.getValue<int>("stm.baseline.hist.max_adc"), // Maximum adc value
45  static_cast<int>(std::numeric_limits<int16_t>::min()),
46  static_cast<int>(std::numeric_limits<int16_t>::max()))),
47  hist_bin_width(((double)hist_max_adc - (double)hist_min_adc)/(double)hist_bin_num), // Bin width
48  hist_inv_bin_width(1/hist_bin_width), // Inverse bin width
49  hist_bin_centres([&] { // Calculate histogram bin centres
50  std::vector<double> centres(hist_bin_num);
51  for (std::size_t i = 0; i < hist_bin_num; ++i) {
52  centres[i] =
53  static_cast<double>(hist_min_adc) +
54  (static_cast<double>(i) + 0.5) * hist_bin_width;
55  }
56  return centres;
57  }()),
58  hist_window_period(cfg.getValue<double>("stm.baseline.hist.window_period")), // The period in time for a hist window
59  hist_window_buffers(std::ceil(hist_window_period*1e6/(double)(max_adc_in_buffer*buffer_config.max_packet_num*fw_config.tADC))),
60  window_delay(cfg.getValue<int>("stm.baseline.window_delay")), // Delay DAQ for baseline calc
61  EM_max_iters(cfg.getValue<int>("stm.baseline.EM.max_iters")), // Maximum iterations
62  EM_LL_tol(cfg.getValue<double>("stm.baseline.EM.LL_tol")), // Convergence tolerance
63  EM_var_floor(cfg.getValue<double>("stm.baseline.EM.var_floor")), // Minimum variance
64  prev_mean(cfg.getValue<double>("stm.baseline.last_value.mean")),
65  prev_sigma(cfg.getValue<double>("stm.baseline.last_value.sigma"))
66  {
67 
68  // Notify user
69  if (logger){
70  logger->log("Config:baseline_info: Number of histogram bins = " +
71  std::to_string(hist_bin_num) +
72  ".",1);
73  logger->log("Config:baseline_info: Histogram ADC range set between " +
74  std::to_string(hist_min_adc) +
75  " and " +
76  std::to_string(hist_max_adc) +
77  ".",1);
78  logger->log("Config:baseline_info: Histogram bin width = " +
79  std::to_string(hist_bin_width) +
80  " ADCs (inverse = " +
81  std::to_string(hist_inv_bin_width) +
82  ").",1);
83  logger->log("Config:baseline_info: Histogram window period = " +
84  std::to_string(hist_window_period) +
85  " s ~ " +
86  std::to_string(hist_window_buffers) +
87  " * " +
88  std::to_string(buffer_config.raw_size*1e-3) +
89  " kB raw data buffers.",1);
90 
91  // Check whether baseline operations are on
92  const bool ops_baseline_class =
93  cfg.getValue<int>("stm.operations.Baseline");
94  const bool ops_baseline_func =
95  cfg.getValue<int>("stm.operations.Baseline.calc_baseline");
96 
97  // Check any of the conditions requiring fallback to no window delay
98  if (!ops_baseline_class || !ops_baseline_func){
99  std::string msg =
100  "Config:baseline_info: Baseline operations disabled in config. Forcing baseline calculation window delay to be OFF.";
101  logger->log(msg, 2);
102  // Force manual baseline
103  const_cast<bool&>(window_delay) = false;
104  }
105 
106  logger->log(std::string("Config:baseline_info: Delay DAQ by 1 window period to calculate baseline = ") +
107  (window_delay ? "TRUE." : "FALSE."),1);
108  logger->log("Config:baseline_info: Maximum EM iterations = " +
109  std::to_string(EM_max_iters) +
110  ".",1);
111  logger->log("Config:baseline_info: EM Convergence tolerance = " +
112  std::to_string(EM_LL_tol) +
113  ".",1);
114  logger->log("Config:baseline_info: EM Minimum variance = " +
115  std::to_string(EM_var_floor) +
116  ".",1);
117  logger->log("Config:baseline_info: Baseline value from previous run = " +
118  std::to_string(prev_mean) + " ± " + std::to_string(prev_sigma) +
119  " ADCs.",1);
120  }
121 
122  }
123 
124 
125 };
126 
127 #endif
Definition: config.hh:19