58{
59 using clock_type = boost::chrono::thread_clock;
60 auto time_cast = [](const auto & before, const auto & after)
61 {
62 return boost::chrono::duration_cast<boost::chrono::microseconds>(after - before).count();
63 };
64
65 auto start = clock_type::now();
66
67 SG::ReadCondHandle<CaloDetDescrManager> caloMgrHandle{
m_caloMgrKey, ctx};
68 const CaloDetDescrManager * calo_dd_man = *caloMgrHandle;
69
70 cd.m_geometry.allocate();
71
73
74#if CALORECGPU_ETA_PHI_MAP_DEBUG
84
86 {
87 min_eta_pos[
i] = std::numeric_limits<float>::max();
88 max_eta_pos[
i] = std::numeric_limits<float>::lowest();
89 min_eta_neg[
i] = std::numeric_limits<float>::max();
90 max_eta_neg[
i] = std::numeric_limits<float>::lowest();
91 min_phi_pos[
i] = std::numeric_limits<float>::max();
92 max_phi_pos[
i] = std::numeric_limits<float>::lowest();
93 min_phi_neg[
i] = std::numeric_limits<float>::max();
94 max_phi_neg[
i] = std::numeric_limits<float>::lowest();
95 min_deta [
i] = std::numeric_limits<float>::max();
96 min_dphi [
i] = std::numeric_limits<float>::max();
97 max_deta [
i] = std::numeric_limits<float>::lowest();
98 max_dphi [
i] = std::numeric_limits<float>::lowest();
101 min_dr [
i] = std::numeric_limits<float>::max();
102 min_dz [
i] = std::numeric_limits<float>::max();
103 max_dr [
i] = std::numeric_limits<float>::lowest();
104 max_dz [
i] = std::numeric_limits<float>::lowest();
105
106 cd.m_geometry->nCellsPerSampling[
i] = 0;
107 }
108#else
110
112 {
113 min_eta[
i] = std::numeric_limits<float>::max();
114 max_eta[
i] = std::numeric_limits<float>::lowest();
115
116 cd.m_geometry->nCellsPerSampling[
i] = 0;
117 }
118#endif
119
121 {
122 const CaloDetDescrElement * caloElement = calo_dd_man->
get_element((IdentifierHash) cell);
123
124 const Identifier cell_identifier = calo_id->
cell_id((IdentifierHash) cell);
125
126 const int sampling = calo_id->
calo_sample(cell_identifier);
127 const int intra_calo_sampling = calo_id->
sampling(cell_identifier);
128 const int subcalo = caloElement->
getSubCalo();
129 const int region = calo_id->
region(cell_identifier);
130
132
135
136 cd.m_geometry->otherCellInfo[
cell] = OtherCellInfo(sampling,
140 is_PS,
141 is_HECIW_or_FCAL);
142 cd.m_geometry->x[
cell] = caloElement->
x();
143 cd.m_geometry->y[
cell] = caloElement->
y();
144 cd.m_geometry->z[
cell] = caloElement->
z();
145 cd.m_geometry->r[
cell] = caloElement->
r();
146 cd.m_geometry->eta[
cell] = caloElement->
eta();
147 cd.m_geometry->phi[
cell] = caloElement->
phi();
148
149 cd.m_geometry->dx[
cell] = caloElement->
dx();
150 cd.m_geometry->dy[
cell] = caloElement->
dy();
151 cd.m_geometry->dz[
cell] = caloElement->
dz();
152 cd.m_geometry->dr[
cell] = caloElement->
dr();
153 cd.m_geometry->deta[
cell] = caloElement->
deta();
154 cd.m_geometry->dphi[
cell] = caloElement->
dphi();
155
157 cd.m_geometry->neighbours.offsets[
cell] = 0;
158
159#if CALORECGPU_ETA_PHI_MAP_DEBUG
160 const float eta_minus = caloElement->
eta() - caloElement->
deta() / 2;
161 const float eta_plus = caloElement->
eta() + caloElement->
deta() / 2;
162 const float phi_minus = caloElement->
phi() - caloElement->
dphi() / 2;
163 const float phi_plus = caloElement->
phi() + caloElement->
dphi() / 2;
164
165 if (caloElement->
eta() >= 0)
166 {
167 min_eta_pos[sampling] = std::min({min_eta_pos[sampling], eta_minus, eta_plus});
168 min_phi_pos[sampling] = std::min({min_phi_pos[sampling], phi_minus, phi_plus});
169 max_eta_pos[sampling] = std::max({max_eta_pos[sampling], eta_minus, eta_plus});
170 max_phi_pos[sampling] = std::max({max_phi_pos[sampling], phi_minus, phi_plus});
171 }
172 else
173 {
174 min_eta_neg[sampling] = std::min({min_eta_neg[sampling], eta_minus, eta_plus});
175 min_phi_neg[sampling] = std::min({min_phi_neg[sampling], phi_minus, phi_plus});
176 max_eta_neg[sampling] = std::max({max_eta_neg[sampling], eta_minus, eta_plus});
177 max_phi_neg[sampling] = std::max({max_phi_neg[sampling], phi_minus, phi_plus});
178 }
179 min_deta[sampling] = std::min(min_deta[sampling], caloElement->
deta());
180 min_dphi[sampling] = std::min(min_dphi[sampling], caloElement->
dphi());
181 max_deta[sampling] = std::max(max_deta[sampling], caloElement->
deta());
182 max_dphi[sampling] = std::max(max_dphi[sampling], caloElement->
dphi());
183 min_dr [sampling] = std::min(min_dr [sampling], caloElement->
dr ());
184 min_dz [sampling] = std::min(min_dz [sampling], caloElement->
dz ());
185 max_dr [sampling] = std::max(max_dr [sampling], caloElement->
dr ());
186 max_dz [sampling] = std::max(max_dz [sampling], caloElement->
dz ());
187
188 avg_deta[sampling] += caloElement->
deta();
189 avg_dphi[sampling] += caloElement->
dphi();
190#else
191 const float eta_below = fabsf(caloElement->
eta() - caloElement->
deta() / 2);
192 const float eta_above = fabsf(caloElement->
eta() + caloElement->
deta() / 2);
193 min_eta[sampling] = std::min(min_eta[sampling], std::min(eta_below, eta_above));
194 max_eta[sampling] = std::max(max_eta[sampling], std::max(eta_below, eta_above));
195#endif
196
197 cd.m_geometry->nCellsPerSampling[sampling] += 1;
198 }
199
200 auto after_geo = clock_type::now();
201
203 {
204#if CALORECGPU_ETA_PHI_MAP_DEBUG
205 avg_deta[
i] /=
cd.m_geometry->nCellsPerSampling[
i];
206 avg_dphi[
i] /=
cd.m_geometry->nCellsPerSampling[
i];
207 if (
cd.m_geometry->nCellsPerSampling[i] > 0)
208 {
209 printf("CALORECGPU ETA PHI MAP DEBUG OUTPUT: %d | %f %f %f %f | %f %f %f %f | %f %f | %f %f | %f %f %d | %f %f | %f %f\n",
210 i, min_eta_neg[i], min_phi_neg[i], max_eta_neg[i], max_phi_neg[i],
211 min_eta_pos[i], min_phi_pos[i], max_eta_pos[i], max_phi_pos[i],
212 min_deta[i], min_dphi[i], max_deta[i], max_dphi[i],
213 avg_deta[i], avg_dphi[i],
cd.m_geometry->nCellsPerSampling[i],
214 min_dr[i], min_dz[i], max_dr[i], max_dz[i]);
215 }
216 const float this_min_eta = std::min(fabsf(max_eta_neg[i]), fabsf(min_eta_pos[i]));
217 const float this_max_eta = std::max(fabsf(min_eta_neg[i]), fabsf(max_eta_pos[i]));
218#else
219 const float this_min_eta = min_eta[
i];
220 const float this_max_eta = max_eta[
i];
221#endif
222
223 if (
cd.m_geometry->nCellsPerSampling[i] <= 0)
224 {
225 cd.m_geometry->etaPhiToCell.initialize(i, -1, 1);
226
227 }
228 else
229 {
230 cd.m_geometry->etaPhiToCell.initialize(i, this_min_eta, this_max_eta);
231 }
232 }
233
234 cd.m_geometry->fill_eta_phi_map();
235
236#if CALORECGPU_ETA_PHI_MAP_DEBUG
238 {
239 auto printer = [&](
const auto &
entry)
240 {
241 printf(
"CALORECGPU ETA PHI MAP DEBUG OUTPUT: %d | %d\n", i,
entry.get_max_real_overlap());
242 };
243
244 cd.m_geometry->etaPhiToCell.apply_to_sampling(i, printer);
245 }
246#endif
247
248 auto after_eta_phi = clock_type::now();
249
250 std::vector<IdentifierHash> neighbour_vector, full_neighs, prev_neighs;
251
253 {
254 for (
int neigh_bit_set = 0; neigh_bit_set <
NumNeighOptions; ++neigh_bit_set)
255 {
256 const unsigned int curr_neigh_opt = (1U << neigh_bit_set);
257
259
260
261
262
263
264
265 {
267 {
270 full_neighs);
271 }
272 else
273 {
276 prev_neighs);
279 neighbour_vector);
280
281
282
283
284
285 std::sort(neighbour_vector.begin(), neighbour_vector.end());
286 std::sort(prev_neighs.begin(), prev_neighs.end());
287
288 full_neighs.clear();
289
290 std::set_difference( prev_neighs.begin(), prev_neighs.end(),
291 neighbour_vector.begin(), neighbour_vector.end(),
292 std::back_inserter(full_neighs) );
293
294 }
295
296 prev_neighs.resize(
cd.m_geometry->neighbours.get_total_number_of_neighbours(cell));
297
298
299 for (size_t neigh = 0; neigh < prev_neighs.size(); ++neigh)
300 {
301 prev_neighs[neigh] =
cd.m_geometry->neighbours.get_neighbour(cell, neigh);
302 }
303
304 std::sort(full_neighs.begin(), full_neighs.end());
305 std::sort(prev_neighs.begin(), prev_neighs.end());
306
307 neighbour_vector.clear();
308
309 std::set_difference( full_neighs.begin(), full_neighs.end(),
310 prev_neighs.begin(), prev_neighs.end(),
311 std::back_inserter(neighbour_vector) );
312 }
313 else
314 {
316 }
317
318 std::sort(neighbour_vector.begin(), neighbour_vector.end());
319
320 const int neighs_start =
cd.m_geometry->neighbours.get_total_number_of_neighbours(cell);
321
322 for (size_t neigh_num = 0; neigh_num < neighbour_vector.size(); ++neigh_num)
323 {
324 cd.m_geometry->neighbours.set_neighbour(cell, neighs_start + neigh_num, neighbour_vector[neigh_num]);
325 }
326
328
329 }
330 }
331
332#if CALORECGPU_ADD_FULL_PAIRS_LIST_TO_CONSTANT_INFORMATION
333
334
335
336
337
338 {
339 int num_pairs = 0;
340
341 auto add_neighbours = [&](
const int cell,
const unsigned int curr_neigh_opt)
342 {
344
345 const int num_neighs =
cd.m_geometry->neighbours.get_neighbours(curr_neigh_opt, cell, neighbours);
346
347 for (int neigh = 0; neigh < num_neighs; ++neigh)
348 {
349 cd.m_geometry->neighPairs.cell_A[num_pairs] =
cell;
350 cd.m_geometry->neighPairs.cell_B[num_pairs] = neighbours[neigh];
351 ++num_pairs;
352 }
353 };
354
355 for (
int neigh_bit_set = 0; neigh_bit_set <
NumNeighOptions; ++neigh_bit_set)
356 {
357 const unsigned int curr_neigh_opt = (1U << neigh_bit_set);
358
360 {
361 if (
cd.m_geometry->is_PS(cell) ||
cd.m_geometry->is_HECIW_or_FCal(cell))
362 {
363 continue;
364 }
365
366 add_neighbours(cell, curr_neigh_opt);
367 }
368
369
370
372 {
373 if (!
cd.m_geometry->is_PS(cell))
374 {
375 continue;
376 }
377
378 add_neighbours(cell, curr_neigh_opt);
379 }
380
381
382
384 {
385 if (!
cd.m_geometry->is_HECIW_or_FCal(cell))
386 {
387 continue;
388 }
389
390 add_neighbours(cell, curr_neigh_opt);
391 }
392
393
394 }
395 }
396#endif
397
398 auto after_pairs = clock_type::now();
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431 SG::ReadCondHandle<CaloNoise> noise_handle(
m_noiseCDOKey, ctx);
432 const CaloNoise * noise_tool = *noise_handle;
433
434 IdentifierHash t_start, t_end;
436
438 {
440 }
442 {
444 }
445
447
448 cd.m_cell_noise.allocate();
449
450 if (!blob)
451 {
453 }
454 else
455 {
456 cd.m_cell_noise->noise_properties = CellNoiseProperties(
blob->getObjVersion(), noise_tool->
getNoiseType());
457 }
458
459 cd.m_cell_noise->luminosity = noise_tool->
getLumi();
460
462 {
464 {
465 cd.m_cell_noise->noise[
cell][gain_state] = noise_tool->
larStorage()[(gain_state > 2 ? 0 : gain_state)][cell];
466 }
467 }
468 for (
int cell = t_start;
cell <
int(t_end); ++
cell)
469 {
471 {
473 cd.m_cell_noise->double_gaussian_constants[0][
cell - t_start][gain_state] =
blob->getData(cell - t_start, gain_state, 2);
474 cd.m_cell_noise->double_gaussian_constants[1][
cell - t_start][gain_state] =
blob->getData(cell - t_start, gain_state, 3);
475 cd.m_cell_noise->double_gaussian_constants[2][
cell - t_start][gain_state] =
blob->getData(cell - t_start, gain_state, 4);
476 cd.m_cell_noise->double_gaussian_constants[3][
cell - t_start][gain_state] =
blob->getData(cell - t_start, gain_state, 1);
477 }
478 }
480 {
482 {
483 cd.m_cell_noise->noise[
cell][gain_state] = 0;
484 }
485 }
486
487 auto after_noise = clock_type::now();
488
490
491
492 auto after_send = clock_type::now();
493
495 {
497 time_cast(start, after_geo),
498 time_cast(after_geo, after_eta_phi),
499 time_cast(after_eta_phi, after_pairs),
500 time_cast(after_pairs, after_noise),
501 time_cast(after_noise, after_send)
502 );
503 }
504
505 return StatusCode::SUCCESS;
506
507}
#define ATH_MSG_WARNING(x)
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
Key for the CaloDetDescrManager in the Condition Store.
Gaudi::Property< bool > m_keepCPUData
If true, do not delete the CPU version of the GPU-friendly data representation.
SG::ReadCondHandleKey< CaloNoise > m_noiseCDOKey
Key of the CaloNoise Conditions data object.
int sampling(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
int get_neighbours(const IdentifierHash caloHash, const LArNeighbours::neighbourOption &option, std::vector< IdentifierHash > &neighbourList) const
access to hashes for neighbours return == 0 for neighbours found
void calo_cell_hash_range(const Identifier id, IdentifierHash &caloCellMin, IdentifierHash &caloCellMax) const
to loop on 'global' cell hashes of one sub-calorimeter alone
int region(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
int calo_sample(const Identifier id) const
returns an int taken from Sampling enum and describing the subCalo to which the Id belongs.
Identifier cell_id(const int subCalo, const int barec_or_posneg, const int sampling_or_fcalmodule, const int region_or_dummy, const int eta, const int phi) const
Make a cell (== channel) ID from constituting fields and subCalo index; for (Mini)FCAL,...
CaloCell_ID::SUBCALO getSubCalo() const
cell subcalo
float dphi() const
cell dphi
float eta() const
cell eta
float phi() const
cell phi
float deta() const
cell deta
float volume() const
cell volume
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
const CaloCell_ID * getCaloCell_ID() const
get calo cell ID helper
Gaudi::Property< bool > m_measureTimes
If true, times are recorded to the file given by m_timeFileName.
void record_times(const size_t event_num, const std::vector< size_t > ×) const
const CaloCondBlobFlt * getTileBlob() const
boost::multi_array< float, 2 > & larStorage()
Non-const accessor to underlying storage for filling:
NOISETYPE getNoiseType() const
boost::multi_array< float, 2 > & tileStorage()
static constexpr int from_region_enum(const int region)
static constexpr int from_subcalo_enum(const int subcalo)
static constexpr int from_intra_calorimeter_sampling_enum(const int sampling)
constexpr int NumSamplings
constexpr int NMaxNeighbours
constexpr int TileCellAfterEnd
constexpr int NumNeighOptions
constexpr int TileCellStart
constexpr int NumGainStates
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
static constexpr carrier invalid_value()
static constexpr carrier offset_delta(const int i)
Returns, for each i, what must be added to the offset to increase the stores numbers appropriately wh...