2 #include "Mu2e-STMDAQ/processing/operation_manager.hh"
5 OperationManager::OperationManager(
Config& cfg_,
6 const std::shared_ptr<AsyncLogger>& logger_,
7 const std::shared_ptr<STMdata>& stm_,
8 const std::shared_ptr<SignalHandler>& signal_)
9 : cfg(cfg_), logger(logger_), stm(stm_), signal(signal_)
12 auto class_names = cfg.extractKeysAndValues(
"stm.operations");
15 bool form_events =
false;
18 int ch_num = stm->master_config.ch_num;
21 for(
const auto& class_ : class_names)
24 if(!isValidClass(class_.first))
27 std::stringstream output;
28 output <<
"Operation class key: \"" << class_.first <<
"\" in "
29 << cfg.getXMLpath() <<
" is NOT a valid class name.";
30 logger->log(output.str(), 0);
35 std::string class_node =
"stm.operations." + class_.first;
37 bool use_class = cfg.getValue<
int>(class_node);
43 logger->log(class_.first +
" class is OFF.", 1);
48 if(class_.first ==
"FormEvents")
51 if((class_.first ==
"ZeroSuppress" || class_.first ==
"MWD" ||
52 class_.first ==
"PulseHeight") &&
56 logger->log(
"WARNING: " + class_.first +
57 " ON when FormEvents OFF. Switching off " + class_.first +
60 logger->log(class_.first +
" is OFF.", 1);
66 std::pair<std::string, std::string> find_peaks_op = {
"ZeroSuppress",
68 if(class_.first ==
"Noise" &&
69 std::find(useOpsFlag.begin(), useOpsFlag.end(), find_peaks_op) ==
72 logger->log(
"WARNING: " + class_.first +
" ON when " + find_peaks_op.first +
73 "::" + find_peaks_op.second +
74 " operation is OFF. Switching off " + class_.first +
".",
76 logger->log(class_.first +
" is OFF.", 1);
81 if(ch_num == 1 && class_.first ==
"MWD")
83 logger->log(
"WARNING: " + class_.first +
" ON for " +
84 stm->master_config.ch_name +
", use PulseHeight instead" +
85 ". Switching off " + class_.first +
".",
87 logger->log(class_.first +
" is OFF.", 1);
90 else if(ch_num == 0 && class_.first ==
"PulseHeight")
92 logger->log(
"WARNING: " + class_.first +
" ON for " +
93 stm->master_config.ch_name +
", use MWD instead" +
94 ". Switching off " + class_.first +
".",
96 logger->log(class_.first +
" is OFF.", 1);
101 if(ch_num == 1 && class_.first ==
"Baseline")
103 logger->log(
"WARNING: Switching off " + class_.first +
" for " +
104 stm->master_config.ch_name +
".",
106 logger->log(class_.first +
" is OFF.", 1);
111 logger->log(class_.first +
" class is ON.", 1);
114 auto it = class_map.find(class_.first);
116 if(it != class_map.end())
119 classes[class_.first] = it->second.constructor();
125 logger->log(
"ERROR: No class_map entry for class: " + class_.first, 0);
129 auto op_names = cfg.extractKeysAndValues(class_node);
132 bool rest_off =
false;
135 for(
const auto& op_ : op_names)
138 if(!isValidOp(class_.first, op_.first))
141 std::stringstream output;
142 output <<
"Operation key: \"" << class_.first <<
"::" << op_.first
143 <<
"\" in " << cfg.getXMLpath()
144 <<
" is NOT a valid class.operation name.";
145 logger->log(output.str(), 0);
150 std::string op_node = class_node +
"." + op_.first;
152 std::string op_name = class_.first +
"::" + op_.first;
154 bool use_op = cfg.getValue<
int>(op_node);
157 if(use_op && rest_off && class_.first !=
"WriteManager")
160 logger->log(
"WARNING: " + class_.first +
"::" + op_.first +
161 " ON when earlier " + class_.first +
162 " operations OFF. Switching off " + class_.first +
163 "::" + op_.first +
".",
171 logger->log(
"- " + op_name +
" is OFF.", 1);
178 logger->log(
"- " + op_name +
" is ON.", 1);
180 useOpsFlag.push_back({class_.first, op_.first});
208 for(
const auto& [className, opName] : useOpsFlag)
211 if(classes.find(className) == classes.end() || !classes[className])
213 logger->log(
"ERROR: OperationManager: class '" + className +
"' is null.", 0);
218 const bool needs2 = classes[className]->requires_two_buffers(opName);
224 className +
"::" + opName,
225 op2{[
this, className, opName](std::shared_ptr<DataStruct>& buffer,
226 std::shared_ptr<DataStruct>& prev_buffer) {
227 classes[className]->execute(opName, buffer, prev_buffer);
234 className +
"::" + opName,
235 op1{[
this, className, opName](std::shared_ptr<DataStruct>& buffer) {
236 classes[className]->execute(opName, buffer);
242 logger->log(
"OperationManager initialised a total of " +
243 std::to_string(useOps.size()) +
" operations",
247 if(classes.count(
"DQM"))
249 auto dqm_ptr = std::dynamic_pointer_cast<DQM>(classes[
"DQM"]);
256 std::vector<std::pair<std::string, op_any>> OperationManager::getUseOps()
const