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) {
139 std::size_t
const splitted_size = input_1d_vec.size() / numSplits;
141 std::vector<std::vector<float>> output_2d_vec;
143 for (
size_t i = 0;
i < input_1d_vec.size();
i += numSplits - 1) {
144 std::vector<float> chunch_vec(input_1d_vec.begin() +
i, input_1d_vec.begin() +
i + splitted_size);
145 output_2d_vec.push_back(chunch_vec);
147 return output_2d_vec;
152 std::vector<float> digi3DHistVector_serialized;
154 for (
const std::vector<std::vector<float>> &digiHcal2DHist_depth : digiHcal2DHist_depth_all) {
155 std::vector<float> digiHcalDHist_serialized_depth = Serialize2DVector(digiHcal2DHist_depth);
156 digi3DHistVector_serialized.insert(digi3DHistVector_serialized.end(),
157 digiHcalDHist_serialized_depth.begin(),
158 digiHcalDHist_serialized_depth.end());
161 return digi3DHistVector_serialized;
165 const std::vector<std::vector<float>> &ad_model_output_vectors,
const int selOutputIdx) {
167 const unsigned short numDepth = 7;
168 const unsigned short numDIeta = 64;
170 const std::vector<float> &output_vector = ad_model_output_vectors[selOutputIdx];
171 std::vector<std::vector<float>> output_2d_vec = Map1DTo2DVector(output_vector, numDepth);
173 std::vector<std::vector<std::vector<float>>> digiHcal3DHist;
174 for (
const std::vector<float> &output_vector_depth : output_2d_vec) {
175 std::vector<std::vector<float>> digiHcal2DHist_depth = Map1DTo2DVector(output_vector_depth, numDIeta);
176 digiHcal3DHist.push_back(digiHcal2DHist_depth);
179 return digiHcal3DHist;
185 std::vector<float> &adThr,
186 std::vector<float> &input_model_state_memory_e_0_0,
187 std::vector<float> &input_model_state_memory_e_0_1,
188 std::vector<float> &input_model_state_memory_e_1_0,
189 std::vector<float> &input_model_state_memory_e_1_1,
190 std::vector<float> &input_model_state_memory_d_0_0,
191 std::vector<float> &input_model_state_memory_d_0_1,
192 std::vector<float> &input_model_state_memory_d_1_0,
193 std::vector<float> &input_model_state_memory_d_1_1) {
200 input_values.clear();
201 input_values.emplace_back(digiHcalMapTW);
203 input_values.emplace_back(adThr);
204 input_values.emplace_back(input_model_state_memory_e_0_0);
205 input_values.emplace_back(input_model_state_memory_e_0_1);
206 input_values.emplace_back(input_model_state_memory_e_1_0);
207 input_values.emplace_back(input_model_state_memory_e_1_1);
208 input_values.emplace_back(input_model_state_memory_d_0_0);
209 input_values.emplace_back(input_model_state_memory_d_0_1);
210 input_values.emplace_back(input_model_state_memory_d_1_0);
211 input_values.emplace_back(input_model_state_memory_d_1_1);
217 return output_values;
222 const std::vector<std::vector<float>> &digiHcal2DHist_depth_1,
223 const std::vector<std::vector<float>> &digiHcal2DHist_depth_2,
224 const std::vector<std::vector<float>> &digiHcal2DHist_depth_3,
225 const std::vector<std::vector<float>> &digiHcal2DHist_depth_4,
226 const std::vector<std::vector<float>> &digiHcal2DHist_depth_5,
227 const std::vector<std::vector<float>> &digiHcal2DHist_depth_6,
228 const std::vector<std::vector<float>> &digiHcal2DHist_depth_7,
229 const float LS_numEvents,
230 const float flagDecisionThr)
235 std::vector<std::vector<std::vector<float>>> digiHcal2DHist_depth_all;
237 if (hcal_subsystem_name ==
"he") {
238 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_1);
239 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_2);
240 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_3);
241 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_4);
242 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_5);
243 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_6);
244 digiHcal2DHist_depth_all.push_back(digiHcal2DHist_depth_7);
247 else if (hcal_subsystem_name ==
"hb") {
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);
255 std::vector<float> digiHcalMapTW = PrepareONNXDQMMapVectors(digiHcal2DHist_depth_all);
257 std::vector<float> adThr{flagDecisionThr};
258 std::vector<float>
numEvents{LS_numEvents};
262 std::vector<std::vector<float>> output_tensors = Inference(digiHcalMapTW,
265 input_model_state_memory_e_0_0,
266 input_model_state_memory_e_0_1,
267 input_model_state_memory_e_1_0,
268 input_model_state_memory_e_1_1,
269 input_model_state_memory_d_0_0,
270 input_model_state_memory_d_0_1,
271 input_model_state_memory_d_1_0,
272 input_model_state_memory_d_1_1);
280 std::vector<std::vector<float>> ad_model_output_vectors, ad_model_state_vectors;
281 for (
size_t i = 0;
i < output_tensors.size();
i++) {
283 2, state_output_name_tag.length());
284 if (output_names_startstr == state_output_name_tag) {
285 ad_model_state_vectors.emplace_back(output_tensors[
i]);
287 ad_model_output_vectors.emplace_back(output_tensors[
i]);
291 if (ad_model_output_vectors.size() == num_state_vectors) {
292 input_model_state_memory_e_0_0 = ad_model_state_vectors[0];
293 input_model_state_memory_e_0_1 = ad_model_state_vectors[1];
294 input_model_state_memory_e_1_0 = ad_model_state_vectors[2];
295 input_model_state_memory_e_1_1 = ad_model_state_vectors[3];
296 input_model_state_memory_d_0_0 = ad_model_state_vectors[4];
297 input_model_state_memory_d_0_1 = ad_model_state_vectors[5];
298 input_model_state_memory_d_1_0 = ad_model_state_vectors[6];
299 input_model_state_memory_d_1_1 = ad_model_state_vectors[7];
301 std::cout <<
"Warning: the number of output state vectors does NOT equals to expected!. The states are set to " 316 if (--model_state_refresh_counter == 0)
319 return ad_model_output_vectors;
std::vector< std::vector< std::vector< float > > > ONNXOutputToDQMHistMap(const std::vector< std::vector< float >> &ad_model_output_vectors, const int selOutputIdx=7)
Converts 1D serialized vector output of the onnx into 3d hcal-hehp vector.
::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)
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.