Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
BasicConstantGPUDataExporter Class Reference

Standard tool to export calorimeter geometry and cell noise to GPU. More...

#include <BasicConstantGPUDataExporter.h>

Inheritance diagram for BasicConstantGPUDataExporter:
Collaboration diagram for BasicConstantGPUDataExporter:

Public Member Functions

 BasicConstantGPUDataExporter (const std::string &type, const std::string &name, const IInterface *parent)
 
virtual StatusCode initialize () override
 
virtual StatusCode convert (CaloRecGPU::ConstantDataHolder &constant_data, const bool override_keep_CPU_info) const override
 
virtual StatusCode convert (const EventContext &ctx, CaloRecGPU::ConstantDataHolder &constant_data, const bool override_keep_CPU_info) const override
 
virtual StatusCode finalize () override
 
virtual ~BasicConstantGPUDataExporter ()=default
 

Protected Member Functions

void record_times (const size_t event_num, const std::vector< size_t > &times) const
 
template<class ... Args>
void record_times (const size_t event_num, const size_t &value) const
 
template<class ... Args>
void record_times (const size_t event_num, const size_t &value, Args &&... args) const
 
void print_times (const std::string &header, const size_t time_size) const
 

Protected Attributes

std::shared_mutex m_timeMutex
 Mutex that is locked when recording times. More...
 
std::vector< size_t > m_times ATLAS_THREAD_SAFE
 Vector to hold execution times to be recorded if necessary. More...
 
std::vector< size_t > m_eventNumbers ATLAS_THREAD_SAFE
 Vector to hold the event numbers to be recorded if necessary. More...
 
Gaudi::Property< bool > m_measureTimes
 If true, times are recorded to the file given by m_timeFileName. More...
 
Gaudi::Property< std::string > m_timeFileName
 File to which times should be saved. More...
 

Private Member Functions

void record_times_helper (const size_t) const
 
template<class Arg >
void record_times_helper (const size_t index, Arg &&arg) const
 
template<class ... Args>
void record_times_helper (size_t index, Args &&... args) const
 

Private Attributes

Gaudi::Property< bool > m_keepCPUData {this, "KeepCPUData", true, "Keep CPU version of GPU data format"}
 If true, do not delete the CPU version of the GPU-friendly data representation. More...
 
SG::ReadCondHandleKey< CaloNoisem_noiseCDOKey {this, "CaloNoiseKey", "totalNoise", "SG Key of CaloNoise data object"}
 Key of the CaloNoise Conditions data object. More...
 
SG::ReadCondHandleKey< CaloDetDescrManagerm_caloMgrKey
 Key for the CaloDetDescrManager in the Condition Store. More...
 
bool m_hasBeenInitialized
 

Detailed Description

Standard tool to export calorimeter geometry and cell noise to GPU.

Author
Nuno Fernandes nuno..nosp@m.dos..nosp@m.santo.nosp@m.s.fe.nosp@m.rnand.nosp@m.es@c.nosp@m.ern.c.nosp@m.h
Date
29 May 2022 For the time being, this must be run on first event, so that the noise tool exists and so on. Hopefully we can find a way around this in the future.

Definition at line 28 of file BasicConstantGPUDataExporter.h.

Constructor & Destructor Documentation

◆ BasicConstantGPUDataExporter()

BasicConstantGPUDataExporter::BasicConstantGPUDataExporter ( const std::string &  type,
const std::string &  name,
const IInterface *  parent 
)

Definition at line 25 of file BasicConstantGPUDataExporter.cxx.

25  :
26  base_class(type, name, parent),
27  CaloGPUTimed(this),
29 {
30 }

◆ ~BasicConstantGPUDataExporter()

virtual BasicConstantGPUDataExporter::~BasicConstantGPUDataExporter ( )
virtualdefault

Member Function Documentation

◆ convert() [1/2]

StatusCode BasicConstantGPUDataExporter::convert ( CaloRecGPU::ConstantDataHolder constant_data,
const bool  override_keep_CPU_info 
) const
overridevirtual

Definition at line 49 of file BasicConstantGPUDataExporter.cxx.

50 {
51  ATH_MSG_ERROR("BasicConstantGPUDataExporter (" << this->name() << ") must be used with the "
52  "GPU data preparation happening on the first event.");
53 
54  return StatusCode::FAILURE;
55 }

◆ convert() [2/2]

StatusCode BasicConstantGPUDataExporter::convert ( const EventContext &  ctx,
CaloRecGPU::ConstantDataHolder constant_data,
const bool  override_keep_CPU_info 
) const
overridevirtual

Definition at line 57 of file BasicConstantGPUDataExporter.cxx.

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 
68  const CaloDetDescrManager * calo_dd_man = *caloMgrHandle;
69 
70  cd.m_geometry.allocate();
71 
72  const CaloCell_ID * calo_id = calo_dd_man->getCaloCell_ID();
73 
74  float min_eta_pos[NumSamplings], max_eta_pos[NumSamplings],
75  min_eta_neg[NumSamplings], max_eta_neg[NumSamplings],
76  min_phi_pos[NumSamplings], max_phi_pos[NumSamplings],
77  min_phi_neg[NumSamplings], max_phi_neg[NumSamplings],
78  min_deta [NumSamplings], min_dphi [NumSamplings];
79 
80  for (int i = 0; i < NumSamplings; ++i)
81  {
82  min_eta_pos[i] = std::numeric_limits<float>::max();
83  max_eta_pos[i] = std::numeric_limits<float>::lowest();
84  min_eta_neg[i] = std::numeric_limits<float>::max();
85  max_eta_neg[i] = std::numeric_limits<float>::lowest();
86  min_phi_pos[i] = std::numeric_limits<float>::max();
87  max_phi_pos[i] = std::numeric_limits<float>::lowest();
88  min_phi_neg[i] = std::numeric_limits<float>::max();
89  max_phi_neg[i] = std::numeric_limits<float>::lowest();
90  min_deta [i] = std::numeric_limits<float>::max();
91  min_dphi [i] = std::numeric_limits<float>::max();
92  }
93 
94  for (int cell = 0; cell < NCaloCells; ++cell)
95  {
96  const CaloDetDescrElement * caloElement = calo_dd_man->get_element((IdentifierHash) cell);
97 
98  const Identifier cell_identifier = calo_id->cell_id((IdentifierHash) cell);
99 
100  const int sampling = calo_id->calo_sample(cell_identifier);
101  const int intra_calo_sampling = calo_id->sampling(cell_identifier);
102  const int subcalo = caloElement->getSubCalo();
103  const int region = calo_id->region(cell_identifier);
104 
105  const bool is_PS = (subcalo == CaloCell_ID::LAREM && intra_calo_sampling == 0);
106 
107  const bool is_HECIW_or_FCAL = ( (subcalo == CaloCell_ID::LARHEC && region == 1 ) ||
108  (subcalo == CaloCell_ID::LARFCAL && intra_calo_sampling > 1 ) );
109 
110  cd.m_geometry->otherCellInfo[cell] = OtherCellInfo(sampling,
111  ConstantEnumConversion::from_intra_calorimeter_sampling_enum(intra_calo_sampling),
112  ConstantEnumConversion::from_subcalo_enum(subcalo),
113  ConstantEnumConversion::from_region_enum(region),
114  is_PS,
115  is_HECIW_or_FCAL);
116  cd.m_geometry->x[cell] = caloElement->x();
117  cd.m_geometry->y[cell] = caloElement->y();
118  cd.m_geometry->z[cell] = caloElement->z();
119  cd.m_geometry->r[cell] = caloElement->r();
120  cd.m_geometry->eta[cell] = caloElement->eta();
121  cd.m_geometry->phi[cell] = caloElement->phi();
122 
123  cd.m_geometry->dx[cell] = caloElement->dx();
124  cd.m_geometry->dy[cell] = caloElement->dy();
125  cd.m_geometry->dz[cell] = caloElement->dz();
126  cd.m_geometry->dr[cell] = caloElement->dr();
127  cd.m_geometry->deta[cell] = caloElement->deta();
128  cd.m_geometry->dphi[cell] = caloElement->dphi();
129 
130  cd.m_geometry->volume[cell] = caloElement->volume();
131  cd.m_geometry->neighbours.offsets[cell] = 0;
132 
133  if (caloElement->eta() >= 0)
134  {
135  min_eta_pos[sampling] = std::min(min_eta_pos[sampling], caloElement->eta() - caloElement->deta() / 2);
136  min_phi_pos[sampling] = std::min(min_phi_pos[sampling], caloElement->phi() - caloElement->dphi() / 2);
137  max_eta_pos[sampling] = std::max(max_eta_pos[sampling], caloElement->eta() + caloElement->deta() / 2);
138  max_phi_pos[sampling] = std::max(max_phi_pos[sampling], caloElement->phi() + caloElement->dphi() / 2);
139  }
140  else
141  {
142  min_eta_neg[sampling] = std::min(min_eta_neg[sampling], caloElement->eta() - caloElement->deta() / 2);
143  min_phi_neg[sampling] = std::min(min_phi_neg[sampling], caloElement->phi() - caloElement->dphi() / 2);
144  max_eta_neg[sampling] = std::max(max_eta_neg[sampling], caloElement->eta() + caloElement->deta() / 2);
145  max_phi_neg[sampling] = std::max(max_phi_neg[sampling], caloElement->phi() + caloElement->dphi() / 2);
146  }
147  min_deta[sampling] = std::min(min_deta[sampling], caloElement->deta());
148  min_dphi[sampling] = std::min(min_dphi[sampling], caloElement->dphi());
149 
150  }
151 
152  for (int i = 0; i < NumSamplings; ++i)
153  {
154  constexpr float corrective_factor = 0.99f;
155  cd.m_geometry->etaPhiToCell.initialize(i, min_eta_neg[i], min_phi_neg[i], max_eta_neg[i], max_phi_neg[i],
156  min_eta_pos[i], min_phi_pos[i], max_eta_pos[i], max_phi_pos[i],
157  min_deta[i]*corrective_factor, min_dphi[i]*corrective_factor);
158  }
159 
160  cd.m_geometry->fill_eta_phi_map();
161 
162  std::vector<IdentifierHash> neighbour_vector, full_neighs, prev_neighs;
163 
164  for (int cell = 0; cell < NCaloCells; ++cell)
165  {
166  for (int neigh_bit_set = 0; neigh_bit_set < NumNeighOptions; ++neigh_bit_set)
167  {
168  const unsigned int curr_neigh_opt = (1U << neigh_bit_set);
169 
170  if (curr_neigh_opt == LArNeighbours::corners2D || curr_neigh_opt == LArNeighbours::corners3D)
171  //Scanning the ATLAS codebase, neighbour handling has special cases
172  //for all2D (LarFCAL_Base_ID.cxx, LArMiniFCAL_ID.cxx, Tile_Base_ID.cxx)
173  //and all3DwithCorners (Tile_Base_ID.cxx), which include
174  //neighbours not returned when just the constituent bits are set separately.
175  //As an imperfect workaround, we stuff them in the immediately previous option
176  //(corners, for both 2D and 3D).
177  {
178  if (curr_neigh_opt == LArNeighbours::corners2D)
179  {
180  calo_id->get_neighbours((IdentifierHash) cell,
182  full_neighs);
183  }
184  else /*if (curr_neigh_opt == LArNeighbours::corners3D)*/
185  {
186  calo_id->get_neighbours((IdentifierHash) cell,
188  prev_neighs);
189  calo_id->get_neighbours((IdentifierHash) cell,
191  neighbour_vector);
192  //We will exclude the cells that could come from later options
193  //(it seems, from Tile_Base_ID.cxx, all3DwithCorners will give more than super3D),
194  //which... might make some sense, but seems unexpected.
195 
196 
197  std::sort(neighbour_vector.begin(), neighbour_vector.end());
198  std::sort(prev_neighs.begin(), prev_neighs.end());
199 
200  full_neighs.clear();
201 
202  std::set_difference( prev_neighs.begin(), prev_neighs.end(),
203  neighbour_vector.begin(), neighbour_vector.end(),
204  std::back_inserter(full_neighs) );
205 
206  }
207 
208  prev_neighs.resize(cd.m_geometry->neighbours.get_total_number_of_neighbours(cell));
209  //We want to add just the neighbours that are not part of this.
210 
211  for (size_t neigh = 0; neigh < prev_neighs.size(); ++neigh)
212  {
213  prev_neighs[neigh] = cd.m_geometry->neighbours.get_neighbour(cell, neigh);
214  }
215 
216  std::sort(full_neighs.begin(), full_neighs.end());
217  std::sort(prev_neighs.begin(), prev_neighs.end());
218 
219  neighbour_vector.clear();
220 
221  std::set_difference( full_neighs.begin(), full_neighs.end(),
222  prev_neighs.begin(), prev_neighs.end(),
223  std::back_inserter(neighbour_vector) );
224  }
225  else
226  {
227  calo_id->get_neighbours((IdentifierHash) cell, (LArNeighbours::neighbourOption) curr_neigh_opt, neighbour_vector);
228  }
229 
230  std::sort(neighbour_vector.begin(), neighbour_vector.end());
231 
232  const int neighs_start = cd.m_geometry->neighbours.get_total_number_of_neighbours(cell);
233 
234  for (size_t neigh_num = 0; neigh_num < neighbour_vector.size(); ++neigh_num)
235  {
236  cd.m_geometry->neighbours.set_neighbour(cell, neighs_start + neigh_num, neighbour_vector[neigh_num]);
237  }
238 
239  cd.m_geometry->neighbours.offsets[cell] += NeighOffset::offset_delta(neigh_bit_set) * neighbour_vector.size();
240 
241  }
242  }
243 
244 #if CALORECGPU_ADD_FULL_PAIRS_LIST_TO_CONSTANT_INFORMATION
245 
246 //Note: the commented out code is used to output the hard-coded numbers
247 //in NeighPairsArr. For the time being, it should remain here until
248 //a more definitive solution for the geometry is found.
249 
250  {
251  int num_pairs = 0;
252 
253  auto add_neighbours = [&](const int cell, const unsigned int curr_neigh_opt)
254  {
255  int neighbours[NMaxNeighbours];
256 
257  const int num_neighs = cd.m_geometry->neighbours.get_neighbours(curr_neigh_opt, cell, neighbours);
258 
259  for (int neigh = 0; neigh < num_neighs; ++neigh)
260  {
261  cd.m_geometry->neighPairs.cell_A[num_pairs] = cell;
262  cd.m_geometry->neighPairs.cell_B[num_pairs] = neighbours[neigh];
263  ++num_pairs;
264  }
265  };
266 
267  for (int neigh_bit_set = 0; neigh_bit_set < NumNeighOptions; ++neigh_bit_set)
268  {
269  const unsigned int curr_neigh_opt = (1U << neigh_bit_set);
270 
271  for (int cell = 0; cell < NCaloCells; ++cell)
272  {
273  if (cd.m_geometry->is_PS(cell) || cd.m_geometry->is_HECIW_or_FCal(cell))
274  {
275  continue;
276  }
277 
278  add_neighbours(cell, curr_neigh_opt);
279  }
280 
281  //const int PS_start = num_pairs;
282 
283  for (int cell = 0; cell < NCaloCells; ++cell)
284  {
285  if (!cd.m_geometry->is_PS(cell))
286  {
287  continue;
288  }
289 
290  add_neighbours(cell, curr_neigh_opt);
291  }
292 
293  //const int HECIW_FCal_start = num_pairs;
294 
295  for (int cell = 0; cell < NCaloCells; ++cell)
296  {
297  if (!cd.m_geometry->is_HECIW_or_FCal(cell))
298  {
299  continue;
300  }
301 
302  add_neighbours(cell, curr_neigh_opt);
303  }
304 
305  //std::cout << neigh_bit_set << " " << num_pairs << " " << PS_start << " " << HECIW_FCal_start << std::endl;
306  }
307  }
308 #endif
309 
310  auto after_geo = clock_type::now();
311 
312  /*
313  //Useful output for debugging and studying regularities in calorimeter geometry...
314 
315  std::cout << "ID\tCaloSample\tSampling\tRegion\tSubCalo";
316  for (int j = 0; j < NumNeighOptions; ++j)
317  {
318  std::cout << "\tn_" << j;
319  }
320  std::cout << "\tn_total\tOffset" << std::endl;
321 
322  for (int cell = 0; cell < NCaloCells; ++cell)
323  {
324 
325  const CaloDetDescrElement * caloElement = calo_dd_man->get_element((IdentifierHash) cell);
326  std::cout << cell << "\t"
327  << (int) calo_id->calo_sample(calo_id->cell_id((IdentifierHash) cell)) << "\t"
328  << (int) calo_id->sampling(calo_id->cell_id((IdentifierHash) cell)) << "\t"
329  << (int) calo_id->region(calo_id->cell_id((IdentifierHash) cell)) << "\t"
330  << (int) caloElement->getSubCalo();
331 
332  const NeighOffset n_off = cd.m_geometry->neighbours.offsets[cell];
333 
334  for (int j = 0; j < NumNeighOptions; ++j)
335  {
336  std::cout << "\t" << n_off.get_num_cells(j);
337  }
338 
339  std::cout << "\t" << n_off.get_total_number() << "\t" << n_off << std::endl;
340  }
341  // */
342 
343  SG::ReadCondHandle<CaloNoise> noise_handle(m_noiseCDOKey, ctx);
344  const CaloNoise * noise_tool = *noise_handle;
345 
346  IdentifierHash t_start, t_end;
347  calo_id->calo_cell_hash_range(CaloCell_ID::TILE, t_start, t_end);
348 
349  if (t_start != TileCellStart)
350  {
351  ATH_MSG_WARNING("Tile start (" << t_start << ") differs from assumed constant value (" << TileCellStart << ")!");
352  }
353  if (t_end != TileCellAfterEnd)
354  {
355  ATH_MSG_WARNING("Tile end (" << t_end << ") differs from assumed constant value (" << TileCellAfterEnd << ")!");
356  }
357 
358  const CaloCondBlobFlt * blob = noise_tool->getTileBlob();
359 
360  cd.m_cell_noise.allocate();
361 
362  if (!blob)
363  {
364  cd.m_cell_noise->noise_properties = CellNoiseProperties::invalid_value();
365  }
366  else
367  {
368  cd.m_cell_noise->noise_properties = CellNoiseProperties(blob->getObjVersion(), noise_tool->getNoiseType());
369  }
370 
371  cd.m_cell_noise->luminosity = noise_tool->getLumi();
372 
373  for (int cell = 0; cell < int(t_start); ++cell)
374  {
375  for (int gain_state = 0; gain_state < CaloRecGPU::NumGainStates; ++gain_state)
376  {
377  cd.m_cell_noise->noise[cell][gain_state] = noise_tool->larStorage()[(gain_state > 2 ? 0 : gain_state)][cell];
378  }
379  }
380  for (int cell = t_start; cell < int(t_end); ++cell)
381  {
382  for (int gain_state = 0; gain_state < CaloRecGPU::NumGainStates; ++gain_state)
383  {
384  cd.m_cell_noise->noise[cell][gain_state] = noise_tool->tileStorage()[gain_state][cell - t_start];
385  cd.m_cell_noise->double_gaussian_constants[0][cell - t_start][gain_state] = blob->getData(cell - t_start, gain_state, 2);
386  cd.m_cell_noise->double_gaussian_constants[1][cell - t_start][gain_state] = blob->getData(cell - t_start, gain_state, 3);
387  cd.m_cell_noise->double_gaussian_constants[2][cell - t_start][gain_state] = blob->getData(cell - t_start, gain_state, 4);
388  cd.m_cell_noise->double_gaussian_constants[3][cell - t_start][gain_state] = blob->getData(cell - t_start, gain_state, 1);
389  }
390  }
391  for (int cell = t_end; cell < NCaloCells; ++cell)
392  {
393  for (int gain_state = 0; gain_state < CaloRecGPU::NumGainStates; ++gain_state)
394  {
395  cd.m_cell_noise->noise[cell][gain_state] = 0;
396  }
397  }
398 
399  auto after_noise = clock_type::now();
400 
401  cd.sendToGPU(!(m_keepCPUData || keep_CPU_info));
402 
403 
404  auto after_send = clock_type::now();
405 
406  if (m_measureTimes)
407  {
408  record_times(ctx.evt(), time_cast(start, after_geo),
409  time_cast(after_geo, after_noise),
410  time_cast(after_noise, after_send)
411  );
412  }
413 
414  return StatusCode::SUCCESS;
415 
416 }

◆ finalize()

StatusCode BasicConstantGPUDataExporter::finalize ( )
overridevirtual

Definition at line 418 of file BasicConstantGPUDataExporter.cxx.

419 {
420 
421  if (m_measureTimes)
422  {
423  print_times("Geometry Geometry_Correction Noise Transfer_to_GPU", 3 /*4*/);
424  }
425  return StatusCode::SUCCESS;
426 }

◆ initialize()

StatusCode BasicConstantGPUDataExporter::initialize ( )
overridevirtual

Definition at line 32 of file BasicConstantGPUDataExporter.cxx.

33 {
35  {
36  ATH_MSG_INFO("Initializing data tool again...");
37  return StatusCode::SUCCESS;
38  }
39 
41 
43 
44  m_hasBeenInitialized = true;
45 
46  return StatusCode::SUCCESS;
47 }

◆ print_times()

void CaloGPUTimed::print_times ( const std::string &  header,
const size_t  time_size 
) const
inlineprotectedinherited

Definition at line 143 of file CaloGPUTimed.h.

144  {
145  std::shared_lock<std::shared_mutex> lock(m_timeMutex);
146 
147  if (m_timeFileName.size() == 0)
148  {
149  return;
150  }
151 
152  std::vector<size_t> indices(m_eventNumbers.size());
153 
154  std::iota(indices.begin(), indices.end(), 0);
155  std::sort(indices.begin(), indices.end(), [&](size_t a, size_t b)
156  {
157  return m_eventNumbers[a] < m_eventNumbers[b];
158  }
159  );
160  std::ofstream out(m_timeFileName);
161 
162  out << "Event_Number Total " << header << "\n";
163 
164  for (const size_t idx : indices)
165  {
166  out << m_eventNumbers[idx] << " ";
167 
168  size_t total = 0;
169 
170  for (size_t i = 0; i < time_size; ++i)
171  {
172  total += m_times[idx * time_size + i];
173  }
174 
175  out << total << " ";
176 
177  for (size_t i = 0; i < time_size; ++i)
178  {
179  out << m_times[idx * time_size + i] << " ";
180  }
181  out << "\n";
182  }
183 
184  out << std::endl;
185 
186  out.close();
187  }

◆ record_times() [1/3]

template<class ... Args>
void CaloGPUTimed::record_times ( const size_t  event_num,
const size_t &  value 
) const
inlineprotectedinherited

Definition at line 105 of file CaloGPUTimed.h.

106  {
107  const size_t time_size = 1;
108 
109  size_t old_size;
110 
111  {
112  std::unique_lock<std::shared_mutex> lock(m_timeMutex);
113  old_size = m_times.size();
114  m_times.resize(old_size + time_size);
115  m_eventNumbers.push_back(event_num);
116  }
117  {
118  std::shared_lock<std::shared_mutex> lock(m_timeMutex);
119  record_times_helper(old_size, value);
120  }
121  }

◆ record_times() [2/3]

template<class ... Args>
void CaloGPUTimed::record_times ( const size_t  event_num,
const size_t &  value,
Args &&...  args 
) const
inlineprotectedinherited

Definition at line 124 of file CaloGPUTimed.h.

125  {
126  const size_t time_size = sizeof...(args) + 1;
127 
128  size_t old_size;
129 
130  {
131  std::unique_lock<std::shared_mutex> lock(m_timeMutex);
132  old_size = m_times.size();
133  m_times.resize(old_size + time_size);
134  m_eventNumbers.push_back(event_num);
135  }
136  {
137  std::shared_lock<std::shared_mutex> lock(m_timeMutex);
138  record_times_helper(old_size, value, std::forward<Args>(args)...);
139  }
140 
141  }

◆ record_times() [3/3]

void CaloGPUTimed::record_times ( const size_t  event_num,
const std::vector< size_t > &  times 
) const
inlineprotectedinherited

Definition at line 86 of file CaloGPUTimed.h.

87  {
88  size_t old_size;
89  {
90  std::unique_lock<std::shared_mutex> lock(m_timeMutex);
91  old_size = m_times.size();
92  m_times.resize(old_size + times.size());
93  m_eventNumbers.push_back(event_num);
94  }
95  {
96  std::shared_lock<std::shared_mutex> lock(m_timeMutex);
97  for (size_t i = 0; i < times.size(); ++i)
98  {
99  m_times[old_size + i] = times[i];
100  }
101  }
102  }

◆ record_times_helper() [1/3]

template<class Arg >
void CaloGPUTimed::record_times_helper ( const size_t  index,
Arg &&  arg 
) const
inlineprivateinherited

Definition at line 70 of file CaloGPUTimed.h.

71  {
72  // coverity[missing_lock]
73  m_times[index] = std::forward<Arg>(arg);
74 
75  //This is called within a function that holds the lock itself.
76  }

◆ record_times_helper() [2/3]

void CaloGPUTimed::record_times_helper ( const  size_t) const
inlineprivateinherited

Definition at line 64 of file CaloGPUTimed.h.

65  {
66  //Do nothing
67  }

◆ record_times_helper() [3/3]

template<class ... Args>
void CaloGPUTimed::record_times_helper ( size_t  index,
Args &&...  args 
) const
inlineprivateinherited

Definition at line 79 of file CaloGPUTimed.h.

80  {
81  (record_times_helper(index++, std::forward<Args>(args)), ...);
82  }

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/2]

std::vector<size_t> m_times CaloGPUTimed::ATLAS_THREAD_SAFE
mutableprotectedinherited

Vector to hold execution times to be recorded if necessary.

Definition at line 35 of file CaloGPUTimed.h.

◆ ATLAS_THREAD_SAFE [2/2]

std::vector<size_t> m_eventNumbers CaloGPUTimed::ATLAS_THREAD_SAFE
mutableprotectedinherited

Vector to hold the event numbers to be recorded if necessary.

Definition at line 40 of file CaloGPUTimed.h.

◆ m_caloMgrKey

SG::ReadCondHandleKey<CaloDetDescrManager> BasicConstantGPUDataExporter::m_caloMgrKey
private
Initial value:
{this, "CaloDetDescrManager", "CaloDetDescrManager",
"SG Key for CaloDetDescrManager in the Condition Store"}

Key for the CaloDetDescrManager in the Condition Store.

Definition at line 62 of file BasicConstantGPUDataExporter.h.

◆ m_hasBeenInitialized

bool BasicConstantGPUDataExporter::m_hasBeenInitialized
private

Definition at line 66 of file BasicConstantGPUDataExporter.h.

◆ m_keepCPUData

Gaudi::Property<bool> BasicConstantGPUDataExporter::m_keepCPUData {this, "KeepCPUData", true, "Keep CPU version of GPU data format"}
private

If true, do not delete the CPU version of the GPU-friendly data representation.

Defaults to false.

Definition at line 52 of file BasicConstantGPUDataExporter.h.

◆ m_measureTimes

Gaudi::Property<bool> CaloGPUTimed::m_measureTimes
protectedinherited

If true, times are recorded to the file given by m_timeFileName.

Defaults to false.

Definition at line 46 of file CaloGPUTimed.h.

◆ m_noiseCDOKey

SG::ReadCondHandleKey<CaloNoise> BasicConstantGPUDataExporter::m_noiseCDOKey {this, "CaloNoiseKey", "totalNoise", "SG Key of CaloNoise data object"}
private

Key of the CaloNoise Conditions data object.

Typical values are '"electronicNoise', 'pileupNoise', or '"totalNoise' (default)

Definition at line 57 of file BasicConstantGPUDataExporter.h.

◆ m_timeFileName

Gaudi::Property<std::string> CaloGPUTimed::m_timeFileName
protectedinherited

File to which times should be saved.

Definition at line 50 of file CaloGPUTimed.h.

◆ m_timeMutex

std::shared_mutex CaloGPUTimed::m_timeMutex
mutableprotectedinherited

Mutex that is locked when recording times.

Definition at line 32 of file CaloGPUTimed.h.


The documentation for this class was generated from the following files:
CaloDetDescrElement::deta
float deta() const
cell deta
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:356
LArNeighbours::neighbourOption
neighbourOption
Definition: LArNeighbours.h:12
CaloCell_Base_ID::LARFCAL
@ LARFCAL
Definition: CaloCell_Base_ID.h:46
LArNeighbours::corners3D
@ corners3D
Definition: LArNeighbours.h:25
header
Definition: hcg.cxx:526
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CaloDetDescrElement::y
float y() const
cell y
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:365
CaloCondBlobFlt
Class for storing a number of floats (Flt) and functions on those.
Definition: CaloCondBlobFlt.h:29
python.CaloAddPedShiftConfig.args
args
Definition: CaloAddPedShiftConfig.py:45
BasicConstantGPUDataExporter::m_noiseCDOKey
SG::ReadCondHandleKey< CaloNoise > m_noiseCDOKey
Key of the CaloNoise Conditions data object.
Definition: BasicConstantGPUDataExporter.h:57
CaloGPUTimed::m_timeMutex
std::shared_mutex m_timeMutex
Mutex that is locked when recording times.
Definition: CaloGPUTimed.h:32
LArNeighbours::corners2D
@ corners2D
Definition: LArNeighbours.h:17
index
Definition: index.py:1
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
Trk::indices
std::pair< long int, long int > indices
Definition: AlSymMatBase.h:24
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
CaloDetDescrElement
This class groups all DetDescr information related to a CaloCell. Provides a generic interface for al...
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:66
CaloDetDescrManager_Base::get_element
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
Definition: CaloDetDescrManager.cxx:159
CaloDetDescrElement::dr
float dr() const
cell dr
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:360
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
CaloNoise::getNoiseType
NOISETYPE getNoiseType() const
Definition: CaloNoise.h:87
CaloGPUTimed::m_timeFileName
Gaudi::Property< std::string > m_timeFileName
File to which times should be saved.
Definition: CaloGPUTimed.h:50
athena.value
value
Definition: athena.py:124
CaloCell_Base_ID::LARHEC
@ LARHEC
Definition: CaloCell_Base_ID.h:46
CaloRecGPU::NumSamplings
constexpr int NumSamplings
Definition: BaseDefinitions.h:44
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
CaloDetDescrElement::getSubCalo
CaloCell_ID::SUBCALO getSubCalo() const
cell subcalo
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:433
CaloDetDescrElement::dz
float dz() const
cell dz
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:379
BasicConstantGPUDataExporter::m_hasBeenInitialized
bool m_hasBeenInitialized
Definition: BasicConstantGPUDataExporter.h:66
CaloRecGPU::TileCellAfterEnd
constexpr int TileCellAfterEnd
Definition: BaseDefinitions.h:19
python.handimod.now
now
Definition: handimod.py:675
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
LArNeighbours::all3DwithCorners
@ all3DwithCorners
Definition: LArNeighbours.h:26
python.LArMinBiasAlgConfig.int
int
Definition: LArMinBiasAlgConfig.py:59
CaloGPUTimed::print_times
void print_times(const std::string &header, const size_t time_size) const
Definition: CaloGPUTimed.h:143
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CaloCell_Base_ID::TILE
@ TILE
Definition: CaloCell_Base_ID.h:46
CaloRecGPU::NCaloCells
constexpr int NCaloCells
Definition: BaseDefinitions.h:13
BasicConstantGPUDataExporter::m_keepCPUData
Gaudi::Property< bool > m_keepCPUData
If true, do not delete the CPU version of the GPU-friendly data representation.
Definition: BasicConstantGPUDataExporter.h:52
CaloRecGPU::NMaxNeighbours
constexpr int NMaxNeighbours
Definition: BaseDefinitions.h:12
BasicConstantGPUDataExporter::m_caloMgrKey
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
Key for the CaloDetDescrManager in the Condition Store.
Definition: BasicConstantGPUDataExporter.h:62
LArNeighbours::super3D
@ super3D
Definition: LArNeighbours.h:29
CaloRecGPU::OtherCellInfo
Definition: ConstantInfoDefinitions.h:125
CaloNoise
Definition: CaloNoise.h:16
create_dcsc_inputs_sqlite.arg
list arg
Definition: create_dcsc_inputs_sqlite.py:48
CaloDetDescrElement::volume
float volume() const
cell volume
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:381
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
CaloGPUTimed::CaloGPUTimed
CaloGPUTimed(T *ptr)
Definition: CaloGPUTimed.h:55
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
CaloRecGPU::NumGainStates
constexpr int NumGainStates
Definition: BaseDefinitions.h:40
CaloDetDescrElement::x
float x() const
cell x
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:363
CaloGPUTimed::record_times_helper
void record_times_helper(const size_t) const
Definition: CaloGPUTimed.h:64
CaloNoise::tileStorage
boost::multi_array< float, 2 > & tileStorage()
Definition: CaloNoise.h:72
CaloRecGPU::NumNeighOptions
constexpr int NumNeighOptions
Definition: BaseDefinitions.h:47
CaloDetDescrElement::dphi
float dphi() const
cell dphi
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:358
CaloRecGPU::CellNoiseProperties
Definition: ConstantInfoDefinitions.h:376
DeMoScan.index
string index
Definition: DeMoScan.py:364
a
TList * a
Definition: liststreamerinfos.cxx:10
CaloDetDescrManager
This class provides the client interface for accessing the detector description information common to...
Definition: CaloDetDescrManager.h:473
CaloDetDescrElement::dx
float dx() const
cell dx
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:375
CaloGPUTimed::record_times
void record_times(const size_t event_num, const std::vector< size_t > &times) const
Definition: CaloGPUTimed.h:86
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CaloNoise::larStorage
boost::multi_array< float, 2 > & larStorage()
Non-const accessor to underlying storage for filling:
Definition: CaloNoise.h:71
CaloGPUTimed::m_measureTimes
Gaudi::Property< bool > m_measureTimes
If true, times are recorded to the file given by m_timeFileName.
Definition: CaloGPUTimed.h:46
CaloDetDescrElement::z
float z() const
cell z
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:367
CaloNoise::getTileBlob
const CaloCondBlobFlt * getTileBlob() const
Definition: CaloNoise.h:83
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
CaloDetDescrManager::getCaloCell_ID
const CaloCell_ID * getCaloCell_ID() const
get calo cell ID helper
Definition: CaloDetDescrManager.cxx:1590
calibdata.cd
cd
Definition: calibdata.py:51
CaloDetDescrElement::eta
float eta() const
cell eta
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:344
CaloDetDescrElement::phi
float phi() const
cell phi
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:346
CaloDetDescrElement::r
float r() const
cell r
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:348
CaloCell_Base_ID::LAREM
@ LAREM
Definition: CaloCell_Base_ID.h:46
CaloDetDescrElement::dy
float dy() const
cell dy
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:377
CaloRecGPU::TileCellStart
constexpr int TileCellStart
Definition: BaseDefinitions.h:17
LArNeighbours::all2D
@ all2D
Definition: LArNeighbours.h:18
plot_times.times
def times(fn)
Definition: plot_times.py:11
CaloCondBlobAlgs_fillNoiseFromASCII.blob
blob
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:96
CaloNoise::getLumi
float getLumi() const
Definition: CaloNoise.h:85
Identifier
Definition: IdentifierFieldParser.cxx:14