57{
58 using clock_type = boost::chrono::thread_clock;
59 auto time_cast = [](const auto & before, const auto & after)
60 {
61 return boost::chrono::duration_cast<boost::chrono::microseconds>(after - before).count();
62 };
63
64 auto start = clock_type::now();
65
66 SG::ReadCondHandle<CaloDetDescrManager> caloMgrHandle{
m_caloMgrKey, ctx};
67 const CaloDetDescrManager * calo_dd_man = *caloMgrHandle;
68
69 cd.m_geometry.allocate();
70
72
73#if CALORECGPU_ETA_PHI_MAP_DEBUG
83
85 {
86 min_eta_pos[
i] = std::numeric_limits<float>::max();
87 max_eta_pos[
i] = std::numeric_limits<float>::lowest();
88 min_eta_neg[
i] = std::numeric_limits<float>::max();
89 max_eta_neg[
i] = std::numeric_limits<float>::lowest();
90 min_phi_pos[
i] = std::numeric_limits<float>::max();
91 max_phi_pos[
i] = std::numeric_limits<float>::lowest();
92 min_phi_neg[
i] = std::numeric_limits<float>::max();
93 max_phi_neg[
i] = std::numeric_limits<float>::lowest();
94 min_deta [
i] = std::numeric_limits<float>::max();
95 min_dphi [
i] = std::numeric_limits<float>::max();
96 max_deta [
i] = std::numeric_limits<float>::lowest();
97 max_dphi [
i] = std::numeric_limits<float>::lowest();
100 min_dr [
i] = std::numeric_limits<float>::max();
101 min_dz [
i] = std::numeric_limits<float>::max();
102 max_dr [
i] = std::numeric_limits<float>::lowest();
103 max_dz [
i] = std::numeric_limits<float>::lowest();
104
105 cd.m_geometry->nCellsPerSampling[
i] = 0;
106 }
107#else
109
111 {
112 min_eta[
i] = std::numeric_limits<float>::max();
113 max_eta[
i] = std::numeric_limits<float>::lowest();
114
115 cd.m_geometry->nCellsPerSampling[
i] = 0;
116 }
117#endif
118
120 {
121 const CaloDetDescrElement * caloElement = calo_dd_man->
get_element((IdentifierHash) cell);
122
123 const Identifier cell_identifier = calo_id->
cell_id((IdentifierHash) cell);
124
125 const int sampling = calo_id->
calo_sample(cell_identifier);
126 const int intra_calo_sampling = calo_id->
sampling(cell_identifier);
127 const int subcalo = caloElement->
getSubCalo();
128 const int region = calo_id->
region(cell_identifier);
129
131
134
135 cd.m_geometry->otherCellInfo[
cell] = OtherCellInfo(sampling,
139 is_PS,
140 is_HECIW_or_FCAL);
141 cd.m_geometry->x[
cell] = caloElement->
x();
142 cd.m_geometry->y[
cell] = caloElement->
y();
143 cd.m_geometry->z[
cell] = caloElement->
z();
144 cd.m_geometry->r[
cell] = caloElement->
r();
145 cd.m_geometry->eta[
cell] = caloElement->
eta();
146 cd.m_geometry->phi[
cell] = caloElement->
phi();
147
148 cd.m_geometry->dx[
cell] = caloElement->
dx();
149 cd.m_geometry->dy[
cell] = caloElement->
dy();
150 cd.m_geometry->dz[
cell] = caloElement->
dz();
151 cd.m_geometry->dr[
cell] = caloElement->
dr();
152 cd.m_geometry->deta[
cell] = caloElement->
deta();
153 cd.m_geometry->dphi[
cell] = caloElement->
dphi();
154
156 cd.m_geometry->neighbours.offsets[
cell] = 0;
157
158#if CALORECGPU_ETA_PHI_MAP_DEBUG
159 const float eta_minus = caloElement->
eta() - caloElement->
deta() / 2;
160 const float eta_plus = caloElement->
eta() + caloElement->
deta() / 2;
161 const float phi_minus = caloElement->
phi() - caloElement->
dphi() / 2;
162 const float phi_plus = caloElement->
phi() + caloElement->
dphi() / 2;
163
164 if (caloElement->
eta() >= 0)
165 {
166 min_eta_pos[sampling] = std::min({min_eta_pos[sampling], eta_minus, eta_plus});
167 min_phi_pos[sampling] = std::min({min_phi_pos[sampling], phi_minus, phi_plus});
168 max_eta_pos[sampling] = std::max({max_eta_pos[sampling], eta_minus, eta_plus});
169 max_phi_pos[sampling] = std::max({max_phi_pos[sampling], phi_minus, phi_plus});
170 }
171 else
172 {
173 min_eta_neg[sampling] = std::min({min_eta_neg[sampling], eta_minus, eta_plus});
174 min_phi_neg[sampling] = std::min({min_phi_neg[sampling], phi_minus, phi_plus});
175 max_eta_neg[sampling] = std::max({max_eta_neg[sampling], eta_minus, eta_plus});
176 max_phi_neg[sampling] = std::max({max_phi_neg[sampling], phi_minus, phi_plus});
177 }
178 min_deta[sampling] = std::min(min_deta[sampling], caloElement->
deta());
179 min_dphi[sampling] = std::min(min_dphi[sampling], caloElement->
dphi());
180 max_deta[sampling] = std::max(max_deta[sampling], caloElement->
deta());
181 max_dphi[sampling] = std::max(max_dphi[sampling], caloElement->
dphi());
182 min_dr [sampling] = std::min(min_dr [sampling], caloElement->
dr ());
183 min_dz [sampling] = std::min(min_dz [sampling], caloElement->
dz ());
184 max_dr [sampling] = std::max(max_dr [sampling], caloElement->
dr ());
185 max_dz [sampling] = std::max(max_dz [sampling], caloElement->
dz ());
186
187 avg_deta[sampling] += caloElement->
deta();
188 avg_dphi[sampling] += caloElement->
dphi();
189#else
190 const float eta_below = fabsf(caloElement->
eta() - caloElement->
deta() / 2);
191 const float eta_above = fabsf(caloElement->
eta() + caloElement->
deta() / 2);
192 min_eta[sampling] = std::min(min_eta[sampling], std::min(eta_below, eta_above));
193 max_eta[sampling] = std::max(max_eta[sampling], std::max(eta_below, eta_above));
194#endif
195
196 cd.m_geometry->nCellsPerSampling[sampling] += 1;
197 }
198
199 auto after_geo = clock_type::now();
200
202 {
203#if CALORECGPU_ETA_PHI_MAP_DEBUG
204 avg_deta[
i] /=
cd.m_geometry->nCellsPerSampling[
i];
205 avg_dphi[
i] /=
cd.m_geometry->nCellsPerSampling[
i];
206 if (
cd.m_geometry->nCellsPerSampling[i] > 0)
207 {
208 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",
209 i, min_eta_neg[i], min_phi_neg[i], max_eta_neg[i], max_phi_neg[i],
210 min_eta_pos[i], min_phi_pos[i], max_eta_pos[i], max_phi_pos[i],
211 min_deta[i], min_dphi[i], max_deta[i], max_dphi[i],
212 avg_deta[i], avg_dphi[i],
cd.m_geometry->nCellsPerSampling[i],
213 min_dr[i], min_dz[i], max_dr[i], max_dz[i]);
214 }
215 const float this_min_eta = std::min(fabsf(max_eta_neg[i]), fabsf(min_eta_pos[i]));
216 const float this_max_eta = std::max(fabsf(min_eta_neg[i]), fabsf(max_eta_pos[i]));
217#else
218 const float this_min_eta = min_eta[
i];
219 const float this_max_eta = max_eta[
i];
220#endif
221
222 if (
cd.m_geometry->nCellsPerSampling[i] <= 0)
223 {
224 cd.m_geometry->etaPhiToCell.initialize(i, -1, 1);
225
226 }
227 else
228 {
229 cd.m_geometry->etaPhiToCell.initialize(i, this_min_eta, this_max_eta);
230 }
231 }
232
233 cd.m_geometry->fill_eta_phi_map();
234
235#if CALORECGPU_ETA_PHI_MAP_DEBUG
237 {
238 auto printer = [&](
const auto &
entry)
239 {
240 printf(
"CALORECGPU ETA PHI MAP DEBUG OUTPUT: %d | %d\n", i,
entry.get_max_real_overlap());
241 };
242
243 cd.m_geometry->etaPhiToCell.apply_to_sampling(i, printer);
244 }
245#endif
246
247 auto after_eta_phi = clock_type::now();
248
249 std::vector<IdentifierHash> neighbour_vector, full_neighs, prev_neighs;
250
252 {
253 for (
int neigh_bit_set = 0; neigh_bit_set <
NumNeighOptions; ++neigh_bit_set)
254 {
255 const unsigned int curr_neigh_opt = (1U << neigh_bit_set);
256
258
259
260
261
262
263
264 {
266 {
269 full_neighs);
270 }
271 else
272 {
275 prev_neighs);
278 neighbour_vector);
279
280
281
282
283
284 std::sort(neighbour_vector.begin(), neighbour_vector.end());
285 std::sort(prev_neighs.begin(), prev_neighs.end());
286
287 full_neighs.clear();
288
289 std::set_difference( prev_neighs.begin(), prev_neighs.end(),
290 neighbour_vector.begin(), neighbour_vector.end(),
291 std::back_inserter(full_neighs) );
292
293 }
294
295 prev_neighs.resize(
cd.m_geometry->neighbours.get_total_number_of_neighbours(cell));
296
297
298 for (size_t neigh = 0; neigh < prev_neighs.size(); ++neigh)
299 {
300 prev_neighs[neigh] =
cd.m_geometry->neighbours.get_neighbour(cell, neigh);
301 }
302
303 std::sort(full_neighs.begin(), full_neighs.end());
304 std::sort(prev_neighs.begin(), prev_neighs.end());
305
306 neighbour_vector.clear();
307
308 std::set_difference( full_neighs.begin(), full_neighs.end(),
309 prev_neighs.begin(), prev_neighs.end(),
310 std::back_inserter(neighbour_vector) );
311 }
312 else
313 {
315 }
316
317 std::sort(neighbour_vector.begin(), neighbour_vector.end());
318
319 const int neighs_start =
cd.m_geometry->neighbours.get_total_number_of_neighbours(cell);
320
321 for (size_t neigh_num = 0; neigh_num < neighbour_vector.size(); ++neigh_num)
322 {
323 cd.m_geometry->neighbours.set_neighbour(cell, neighs_start + neigh_num, neighbour_vector[neigh_num]);
324 }
325
327
328 }
329 }
330
331#if CALORECGPU_ADD_FULL_PAIRS_LIST_TO_CONSTANT_INFORMATION
332
333
334
335
336
337 {
338 int num_pairs = 0;
339
340 auto add_neighbours = [&](
const int cell,
const unsigned int curr_neigh_opt)
341 {
343
344 const int num_neighs =
cd.m_geometry->neighbours.get_neighbours(curr_neigh_opt, cell, neighbours);
345
346 for (int neigh = 0; neigh < num_neighs; ++neigh)
347 {
348 cd.m_geometry->neighPairs.cell_A[num_pairs] =
cell;
349 cd.m_geometry->neighPairs.cell_B[num_pairs] = neighbours[neigh];
350 ++num_pairs;
351 }
352 };
353
354 for (
int neigh_bit_set = 0; neigh_bit_set <
NumNeighOptions; ++neigh_bit_set)
355 {
356 const unsigned int curr_neigh_opt = (1U << neigh_bit_set);
357
359 {
360 if (
cd.m_geometry->is_PS(cell) ||
cd.m_geometry->is_HECIW_or_FCal(cell))
361 {
362 continue;
363 }
364
365 add_neighbours(cell, curr_neigh_opt);
366 }
367
368
369
371 {
372 if (!
cd.m_geometry->is_PS(cell))
373 {
374 continue;
375 }
376
377 add_neighbours(cell, curr_neigh_opt);
378 }
379
380
381
383 {
384 if (!
cd.m_geometry->is_HECIW_or_FCal(cell))
385 {
386 continue;
387 }
388
389 add_neighbours(cell, curr_neigh_opt);
390 }
391
392
393 }
394 }
395#endif
396
397 auto after_pairs = clock_type::now();
398
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 SG::ReadCondHandle<CaloNoise> noise_handle(
m_noiseCDOKey, ctx);
431 const CaloNoise * noise_tool = *noise_handle;
432
433 IdentifierHash t_start, t_end;
435
437 {
439 }
441 {
443 }
444
446
447 cd.m_cell_noise.allocate();
448
449 if (!blob)
450 {
452 }
453 else
454 {
455 cd.m_cell_noise->noise_properties = CellNoiseProperties(
blob->getObjVersion(), noise_tool->
getNoiseType());
456 }
457
458 cd.m_cell_noise->luminosity = noise_tool->
getLumi();
459
461 {
463 {
464 cd.m_cell_noise->noise[
cell][gain_state] = noise_tool->
larStorage()[(gain_state > 2 ? 0 : gain_state)][cell];
465 }
466 }
467 for (
int cell = t_start;
cell <
int(t_end); ++
cell)
468 {
470 {
472 cd.m_cell_noise->double_gaussian_constants[0][
cell - t_start][gain_state] =
blob->getData(cell - t_start, gain_state, 2);
473 cd.m_cell_noise->double_gaussian_constants[1][
cell - t_start][gain_state] =
blob->getData(cell - t_start, gain_state, 3);
474 cd.m_cell_noise->double_gaussian_constants[2][
cell - t_start][gain_state] =
blob->getData(cell - t_start, gain_state, 4);
475 cd.m_cell_noise->double_gaussian_constants[3][
cell - t_start][gain_state] =
blob->getData(cell - t_start, gain_state, 1);
476 }
477 }
479 {
481 {
482 cd.m_cell_noise->noise[
cell][gain_state] = 0;
483 }
484 }
485
486 auto after_noise = clock_type::now();
487
489
490
491 auto after_send = clock_type::now();
492
494 {
496 time_cast(start, after_geo),
497 time_cast(after_geo, after_eta_phi),
498 time_cast(after_eta_phi, after_pairs),
499 time_cast(after_pairs, after_noise),
500 time_cast(after_noise, after_send)
501 );
502 }
503
504 return StatusCode::SUCCESS;
505
506}
#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...