58 using clock_type = boost::chrono::thread_clock;
59 auto time_cast = [](
const auto & before,
const auto & after)
61 return boost::chrono::duration_cast<boost::chrono::microseconds>(after - before).count();
64 auto start = clock_type::now();
69 cd.m_geometry.allocate();
73#if CALORECGPU_ETA_PHI_MAP_DEBUG
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();
105 cd.m_geometry->nCellsPerSampling[i] = 0;
112 min_eta[i] = std::numeric_limits<float>::max();
113 max_eta[i] = std::numeric_limits<float>::lowest();
115 cd.m_geometry->nCellsPerSampling[i] = 0;
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);
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();
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();
155 cd.m_geometry->volume[cell] = caloElement->
volume();
156 cd.m_geometry->neighbours.offsets[cell] = 0;
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;
164 if (caloElement->
eta() >= 0)
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});
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});
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 ());
187 avg_deta[sampling] += caloElement->
deta();
188 avg_dphi[sampling] += caloElement->
dphi();
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));
196 cd.m_geometry->nCellsPerSampling[sampling] += 1;
199 auto after_geo = clock_type::now();
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)
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]);
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]));
218 const float this_min_eta = min_eta[i];
219 const float this_max_eta = max_eta[i];
222 if (cd.m_geometry->nCellsPerSampling[i] <= 0)
224 cd.m_geometry->etaPhiToCell.initialize(i, -1, 1);
229 cd.m_geometry->etaPhiToCell.initialize(i, this_min_eta, this_max_eta);
233 cd.m_geometry->fill_eta_phi_map();
235#if CALORECGPU_ETA_PHI_MAP_DEBUG
238 auto printer = [&](
const auto & entry)
240 printf(
"CALORECGPU ETA PHI MAP DEBUG OUTPUT: %d | %d\n", i, entry.get_max_real_overlap());
243 cd.m_geometry->etaPhiToCell.apply_to_sampling(i, printer);
247 auto after_eta_phi = clock_type::now();
249 std::vector<IdentifierHash> neighbour_vector, full_neighs, prev_neighs;
253 for (
int neigh_bit_set = 0; neigh_bit_set <
NumNeighOptions; ++neigh_bit_set)
255 const unsigned int curr_neigh_opt = (1U << neigh_bit_set);
284 std::sort(neighbour_vector.begin(), neighbour_vector.end());
285 std::sort(prev_neighs.begin(), prev_neighs.end());
289 std::set_difference( prev_neighs.begin(), prev_neighs.end(),
290 neighbour_vector.begin(), neighbour_vector.end(),
291 std::back_inserter(full_neighs) );
295 prev_neighs.resize(cd.m_geometry->neighbours.get_total_number_of_neighbours(cell));
298 for (
size_t neigh = 0; neigh < prev_neighs.size(); ++neigh)
300 prev_neighs[neigh] = cd.m_geometry->neighbours.get_neighbour(cell, neigh);
303 std::sort(full_neighs.begin(), full_neighs.end());
304 std::sort(prev_neighs.begin(), prev_neighs.end());
306 neighbour_vector.clear();
308 std::set_difference( full_neighs.begin(), full_neighs.end(),
309 prev_neighs.begin(), prev_neighs.end(),
310 std::back_inserter(neighbour_vector) );
317 std::sort(neighbour_vector.begin(), neighbour_vector.end());
319 const int neighs_start = cd.m_geometry->neighbours.get_total_number_of_neighbours(cell);
321 for (
size_t neigh_num = 0; neigh_num < neighbour_vector.size(); ++neigh_num)
323 cd.m_geometry->neighbours.set_neighbour(cell, neighs_start + neigh_num, neighbour_vector[neigh_num]);
331#if CALORECGPU_ADD_FULL_PAIRS_LIST_TO_CONSTANT_INFORMATION
340 auto add_neighbours = [&](
const int cell,
const unsigned int curr_neigh_opt)
344 const int num_neighs = cd.m_geometry->neighbours.get_neighbours(curr_neigh_opt, cell, neighbours);
346 for (
int neigh = 0; neigh < num_neighs; ++neigh)
348 cd.m_geometry->neighPairs.cell_A[num_pairs] = cell;
349 cd.m_geometry->neighPairs.cell_B[num_pairs] = neighbours[neigh];
354 for (
int neigh_bit_set = 0; neigh_bit_set <
NumNeighOptions; ++neigh_bit_set)
356 const unsigned int curr_neigh_opt = (1U << neigh_bit_set);
360 if (cd.m_geometry->is_PS(cell) || cd.m_geometry->is_HECIW_or_FCal(cell))
365 add_neighbours(cell, curr_neigh_opt);
372 if (!cd.m_geometry->is_PS(cell))
377 add_neighbours(cell, curr_neigh_opt);
384 if (!cd.m_geometry->is_HECIW_or_FCal(cell))
389 add_neighbours(cell, curr_neigh_opt);
397 auto after_pairs = clock_type::now();
431 const CaloNoise * noise_tool = *noise_handle;
447 cd.m_cell_noise.allocate();
458 cd.m_cell_noise->luminosity = noise_tool->
getLumi();
460 for (
int cell = 0; cell < int(t_start); ++cell)
464 cd.m_cell_noise->noise[cell][gain_state] = noise_tool->
larStorage()[(gain_state > 2 ? 0 : gain_state)][cell];
467 for (
int cell = t_start; cell < int(t_end); ++cell)
471 cd.m_cell_noise->noise[cell][gain_state] = noise_tool->
tileStorage()[gain_state][cell - t_start];
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);
478 for (
int cell = t_end; cell <
NCaloCells; ++cell)
482 cd.m_cell_noise->noise[cell][gain_state] = 0;
486 auto after_noise = clock_type::now();
491 auto after_send = clock_type::now();
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)
504 return StatusCode::SUCCESS;