35 std::string instanceName{
"DESMOD Digioccupancy Map AD inference"};
45 auto uOrtSession = std::make_unique<ONNXRuntime>(
model_path, &session_options);
49 hcal_subsystem_name = model_system_name;
51 IsModelExist(hcal_subsystem_name);
53 if (hcal_subsystem_name ==
"he") {
54 std::vector<std::vector<int64_t>> input_shapes_ = {
55 {batch_size, 64, 72, 7, 1},
58 {batch_size, model_state_inner_dim, model_state_layer_dims[0][0]},
59 {batch_size, model_state_inner_dim, model_state_layer_dims[0][0]},
60 {batch_size, model_state_inner_dim, model_state_layer_dims[0][1]},
61 {batch_size, model_state_inner_dim, model_state_layer_dims[0][1]},
62 {batch_size, model_state_inner_dim, model_state_layer_dims[1][0]},
63 {batch_size, model_state_inner_dim, model_state_layer_dims[1][0]},
64 {batch_size, model_state_inner_dim, model_state_layer_dims[1][1]},
65 {batch_size, model_state_inner_dim, model_state_layer_dims[1][1]}};
66 input_shapes = input_shapes_;
69 else if (hcal_subsystem_name ==
"hb") {
70 std::vector<std::vector<int64_t>> input_shapes_ = {
71 {batch_size, 64, 72, 4, 1},
74 {batch_size, model_state_inner_dim, model_state_layer_dims[0][0]},
75 {batch_size, model_state_inner_dim, model_state_layer_dims[0][0]},
76 {batch_size, model_state_inner_dim, model_state_layer_dims[0][1]},
77 {batch_size, model_state_inner_dim, model_state_layer_dims[0][1]},
78 {batch_size, model_state_inner_dim, model_state_layer_dims[1][0]},
79 {batch_size, model_state_inner_dim, model_state_layer_dims[1][0]},
80 {batch_size, model_state_inner_dim, model_state_layer_dims[1][1]},
81 {batch_size, model_state_inner_dim, model_state_layer_dims[1][1]}};
82 input_shapes = input_shapes_;
87 if (
std::find(hcal_modeled_systems.begin(), hcal_modeled_systems.end(), hcal_subsystem_name) ==
88 hcal_modeled_systems.end()) {
90 "ML for OnlineDQM is not currently supported for the selected " + hcal_subsystem_name +
" system!\n";
91 throw std::invalid_argument(
err);
97 std::fill(input_model_state_memory_e_0_0.begin(),
98 input_model_state_memory_e_0_0.end(),
100 std::fill(input_model_state_memory_e_0_1.begin(),
101 input_model_state_memory_e_0_1.end(),
103 std::fill(input_model_state_memory_e_1_0.begin(),
104 input_model_state_memory_e_1_0.end(),
106 std::fill(input_model_state_memory_e_1_1.begin(),
107 input_model_state_memory_e_1_1.end(),
109 std::fill(input_model_state_memory_d_0_0.begin(),
110 input_model_state_memory_d_0_0.end(),
112 std::fill(input_model_state_memory_d_0_1.begin(),
113 input_model_state_memory_d_0_1.end(),
115 std::fill(input_model_state_memory_d_1_0.begin(),
116 input_model_state_memory_d_1_0.end(),
118 std::fill(input_model_state_memory_d_1_1.begin(),
119 input_model_state_memory_d_1_1.end(),
123 model_state_refresh_counter =
128 std::vector<float>
output;
129 for (
const auto &row : input_2d_vec) {
130 for (
const auto &element : row) {
131 output.push_back(element);
138 const int numSplits) {
140 throw std::invalid_argument(
"numSplits must be greater than 0.");
142 std::size_t
const splitted_size = input_1d_vec.size() / numSplits;
144 if (splitted_size * numSplits != input_1d_vec.size())
145 throw std::invalid_argument(
"Conversion is not allowed! The input vector length " +
146 std::to_string(input_1d_vec.size()) +
" must be divisible by the numSplits " +
149 std::vector<std::vector<float>> output_2d_vec;
151 for (
int i = 0;
i < numSplits;
i++) {
152 std::vector<float> chunch_vec(input_1d_vec.begin() +
i * splitted_size,
153 input_1d_vec.begin() + (
i + 1) * splitted_size);
154 output_2d_vec.push_back(chunch_vec);
156 return output_2d_vec;
161 std::vector<float> digi3DHistVector_serialized;
163 for (
const std::vector<std::vector<float>> &digiHcal2DHist_depth : digiHcal2DHist_depth_all) {
164 std::vector<float> digiHcalDHist_serialized_depth = Serialize2DVector(digiHcal2DHist_depth);
165 digi3DHistVector_serialized.insert(digi3DHistVector_serialized.end(),
166 digiHcalDHist_serialized_depth.begin(),
167 digiHcalDHist_serialized_depth.end());
170 return digi3DHistVector_serialized;
174 const std::vector<std::vector<float>> &ad_model_output_vectors,
177 const int selOutputIdx) {
180 const std::vector<float> &output_vector = ad_model_output_vectors[selOutputIdx];
181 std::vector<std::vector<float>> output_2d_vec = Map1DTo2DVector(output_vector, numDepth);
183 std::vector<std::vector<std::vector<float>>> digiHcal3DHist;
184 for (
const std::vector<float> &output_vector_depth : output_2d_vec) {
185 std::vector<std::vector<float>> digiHcal2DHist_depth = Map1DTo2DVector(output_vector_depth, numDIeta);
186 digiHcal3DHist.push_back(digiHcal2DHist_depth);
189 return digiHcal3DHist;
195 std::vector<float> &adThr,
196 std::vector<float> &input_model_state_memory_e_0_0,
197 std::vector<float> &input_model_state_memory_e_0_1,
198 std::vector<float> &input_model_state_memory_e_1_0,
199 std::vector<float> &input_model_state_memory_e_1_1,
200 std::vector<float> &input_model_state_memory_d_0_0,
201 std::vector<float> &input_model_state_memory_d_0_1,
202 std::vector<float> &input_model_state_memory_d_1_0,
203 std::vector<float> &input_model_state_memory_d_1_1) {
210 input_values.clear();
211 input_values.emplace_back(digiHcalMapTW);
213 input_values.emplace_back(adThr);
214 input_values.emplace_back(input_model_state_memory_e_0_0);
215 input_values.emplace_back(input_model_state_memory_e_0_1);
216 input_values.emplace_back(input_model_state_memory_e_1_0);
217 input_values.emplace_back(input_model_state_memory_e_1_1);
218 input_values.emplace_back(input_model_state_memory_d_0_0);
219 input_values.emplace_back(input_model_state_memory_d_0_1);
220 input_values.emplace_back(input_model_state_memory_d_1_0);
221 input_values.emplace_back(input_model_state_memory_d_1_1);
227 return output_values;
232 const std::vector<std::vector<float>> &digiHcal2DHist_depth_1,
233 const std::vector<std::vector<float>> &digiHcal2DHist_depth_2,
234 const std::vector<std::vector<float>> &digiHcal2DHist_depth_3,
235 const std::vector<std::vector<float>> &digiHcal2DHist_depth_4,
236 const std::vector<std::vector<float>> &digiHcal2DHist_depth_5,
237 const std::vector<std::vector<float>> &digiHcal2DHist_depth_6,
238 const std::vector<std::vector<float>> &digiHcal2DHist_depth_7,
239 const float LS_numEvents,
240 const float flagDecisionThr)
245 std::vector<std::vector<std::vector<float>>> digiHcal2DHist_depth_all;
247 if (hcal_subsystem_name ==
"he") {
248 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_1);
249 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_2);
250 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_3);
251 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_4);
252 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_5);
253 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_6);
254 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_7);
257 else if (hcal_subsystem_name ==
"hb") {
258 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_1);
259 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_2);
260 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_3);
261 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_4);
265 std::vector<float> digiHcalMapTW = PrepareONNXDQMMapVectors(digiHcal2DHist_depth_all);
267 std::vector<float> adThr{flagDecisionThr};
268 std::vector<float>
numEvents{LS_numEvents};
272 std::vector<std::vector<float>> output_tensors = Inference(digiHcalMapTW,
275 input_model_state_memory_e_0_0,
276 input_model_state_memory_e_0_1,
277 input_model_state_memory_e_1_0,
278 input_model_state_memory_e_1_1,
279 input_model_state_memory_d_0_0,
280 input_model_state_memory_d_0_1,
281 input_model_state_memory_d_1_0,
282 input_model_state_memory_d_1_1);
290 std::vector<std::vector<float>> ad_model_output_vectors, ad_model_state_vectors;
291 for (
size_t i = 0;
i < output_tensors.size();
i++) {
293 2, state_output_name_tag.length());
294 if (output_names_startstr == state_output_name_tag) {
295 ad_model_state_vectors.emplace_back(output_tensors[
i]);
297 ad_model_output_vectors.emplace_back(output_tensors[
i]);
301 if (ad_model_output_vectors.size() == num_state_vectors) {
302 input_model_state_memory_e_0_0 = ad_model_state_vectors[0];
303 input_model_state_memory_e_0_1 = ad_model_state_vectors[1];
304 input_model_state_memory_e_1_0 = ad_model_state_vectors[2];
305 input_model_state_memory_e_1_1 = ad_model_state_vectors[3];
306 input_model_state_memory_d_0_0 = ad_model_state_vectors[4];
307 input_model_state_memory_d_0_1 = ad_model_state_vectors[5];
308 input_model_state_memory_d_1_0 = ad_model_state_vectors[6];
309 input_model_state_memory_d_1_1 = ad_model_state_vectors[7];
311 std::cout <<
"Warning: the number of output state vectors does NOT equals to expected!. The states are set to " 326 if (--model_state_refresh_counter == 0)
329 return ad_model_output_vectors;
::Ort::SessionOptions defaultSessionOptions(Backend backend=Backend::cpu)
std::string fullPath() const
std::vector< std::vector< float > > Inference_CMSSW(const std::vector< std::vector< float >> &digiHcal2DHist_depth_1, const std::vector< std::vector< float >> &digiHcal2DHist_depth_2, const std::vector< std::vector< float >> &digiHcal2DHist_depth_3, const std::vector< std::vector< float >> &digiHcal2DHist_depth_4, const std::vector< std::vector< float >> &digiHcal2DHist_depth_5, const std::vector< std::vector< float >> &digiHcal2DHist_depth_6, const std::vector< std::vector< float >> &digiHcal2DHist_depth_7, const float LS_numEvents, const float flagDecisionThr=20)
Perform inference on a single image.
std::vector< std::vector< float > > Map1DTo2DVector(const std::vector< float > &input_1d_vec, const int numSplits)
Converts serialized 1d vectors into 2d.
std::vector< std::vector< float > > Inference(std::vector< float > &digiHcalMapTW, std::vector< float > &numEvents, std::vector< float > &adThr, std::vector< float > &input_model_state_memory_e_0_0, std::vector< float > &input_model_state_memory_e_0_1, std::vector< float > &input_model_state_memory_e_1_0, std::vector< float > &input_model_state_memory_e_1_1, std::vector< float > &input_model_state_memory_d_0_0, std::vector< float > &input_model_state_memory_d_0_1, std::vector< float > &input_model_state_memory_d_1_0, std::vector< float > &input_model_state_memory_d_1_1)
Perform inference on a single image.
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
static std::string to_string(const XMLCh *ch)
OnlineDQMDigiAD(const std::string model_system_name, const std::string &modelFilepath, cms::Ort::Backend backend=cms::Ort::Backend::cpu)
Constructor.
void InitializeState()
Resets ml model memory states to default and function needs to be called when new collision run start...
std::vector< float > PrepareONNXDQMMapVectors(std::vector< std::vector< std::vector< float >>> &digiHcal2DHist_depth_all)
Prepares model input serialized dqm histogram from 2D histogram inputs from the cmssw.
void IsModelExist(std::string hcal_subsystem_name)
check whether onnx model integration is added for the selected hcal system
std::vector< float > Serialize2DVector(const std::vector< std::vector< float >> &input_2d_vec)
Serializes 2d vectors into 1d.
std::vector< std::vector< std::vector< float > > > ONNXOutputToDQMHistMap(const std::vector< std::vector< float >> &ad_model_output_vectors, const int numDepth, const int numDIeta=64, const int selOutputIdx=7)
Converts 1D serialized vector output of the onnx into 3d hcal-hehp vector.