ATLAS Offline Software
Public Member Functions | Protected Member Functions | Protected Attributes | Private Types | Private Member Functions | Private Attributes | List of all members
BasicEventDataGPUExporter Class Reference

Standard tool to export cell energy and gain to the GPU. More...

#include <BasicEventDataGPUExporter.h>

Inheritance diagram for BasicEventDataGPUExporter:
Collaboration diagram for BasicEventDataGPUExporter:

Public Member Functions

 BasicEventDataGPUExporter (const std::string &type, const std::string &name, const IInterface *parent)
 
virtual StatusCode initialize () override
 
virtual StatusCode convert (const EventContext &ctx, const CaloRecGPU::ConstantDataHolder &constant_data, const xAOD::CaloClusterContainer *cluster_collection, CaloRecGPU::EventDataHolder &event_data) const override
 Fill the CaloRecGPU::EventDataHolder with the relevant information. More...
 
virtual StatusCode finalize () override
 
virtual ~BasicEventDataGPUExporter ()=default
 
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc. More...
 
const ServiceHandle< StoreGateSvc > & evtStore () const
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc. More...
 
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc. More...
 
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm. More...
 
virtual StatusCode sysStart () override
 Handle START transition. More...
 
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles. More...
 
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles. More...
 
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T > &t)
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleKey &hndl, const std::string &doc, const SG::VarHandleKeyType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleBase &hndl, const std::string &doc, const SG::VarHandleType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleKeyArray &hndArr, const std::string &doc, const SG::VarHandleKeyArrayType &)
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, T &property, const std::string &doc, const SG::NotHandleType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, T &property, const std::string &doc="none")
 Declare a new Gaudi property. More...
 
void updateVHKA (Gaudi::Details::PropertyBase &)
 
MsgStream & msg () const
 
MsgStream & msg (const MSG::Level lvl) const
 
bool msgLvl (const MSG::Level lvl) const
 
 DeclareInterfaceID (ICaloClusterGPUInputTransformer, 1, 0)
 

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution More...
 
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
 
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed. More...
 
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::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 Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t
 

Private Member Functions

Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyArrayType &)
 specialization for handling Gaudi::Property<SG::VarHandleKeyArray> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleType &)
 specialization for handling Gaudi::Property<SG::VarHandleBase> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &t, const SG::NotHandleType &)
 specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray> More...
 
void record_times_helper (size_t) const
 
void record_times_helper (size_t index, size_t t) const
 
template<class ... Args>
void record_times_helper (size_t index, size_t t, 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::ReadHandleKey< CaloCellContainerm_cellsKey {this, "CellsName", "", "Name(s) of Cell Containers"}
 vector of names of the cell containers to use as input. More...
 
Gaudi::Property< bool > m_considerSharedCells {this, "ConsiderSharedCells", false, "Take into account the possibility of a cell being shared between clusters."}
 If true, into account the possibility of a cell being shared between clusters. More...
 
Gaudi::Property< std::vector< int > > m_missingCellsToFill {this, "MissingCellsToFill", {}, "Force fill these cells as disabled on empty containers."}
 Cell indices to fill as disabled cells (useful if the cell vector is always missing the same cells). More...
 
const CaloCell_IDm_calo_id {nullptr}
 Pointer to Calo ID Helper. More...
 
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default) More...
 
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default) More...
 
std::vector< SG::VarHandleKeyArray * > m_vhka
 
bool m_varHandleArraysDeclared
 

Detailed Description

Standard tool to export cell energy and gain to the 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

Definition at line 30 of file BasicEventDataGPUExporter.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ BasicEventDataGPUExporter()

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

Definition at line 22 of file BasicEventDataGPUExporter.cxx.

22  :
24  CaloGPUTimed(this)
25 {
26  declareInterface<ICaloClusterGPUInputTransformer> (this);
27 }

◆ ~BasicEventDataGPUExporter()

virtual BasicEventDataGPUExporter::~BasicEventDataGPUExporter ( )
virtualdefault

Member Function Documentation

◆ convert()

StatusCode BasicEventDataGPUExporter::convert ( const EventContext &  ctx,
const CaloRecGPU::ConstantDataHolder constant_data,
const xAOD::CaloClusterContainer cluster_collection,
CaloRecGPU::EventDataHolder event_data 
) const
overridevirtual

Fill the CaloRecGPU::EventDataHolder with the relevant information.

Parameters
ctxThe event context.
constant_dataData held in GPU memory that is common to all events (cell noise and geometry).
cluster_collectionThe cluster collection, in the standard Athena structures.
event_dataData held in GPU memory that is specific to this event (including the description of the clusters themselves).

Implements ICaloClusterGPUInputTransformer.

Definition at line 42 of file BasicEventDataGPUExporter.cxx.

46 {
47  using clock_type = boost::chrono::thread_clock;
48  auto time_cast = [](const auto & before, const auto & after)
49  {
50  return boost::chrono::duration_cast<boost::chrono::microseconds>(after - before).count();
51  };
52 
53  const auto start = clock_type::now();
54 
55  ed.m_cell_info.allocate();
56 
57  SG::ReadHandle<CaloCellContainer> cell_collection(m_cellsKey, ctx);
58  if ( !cell_collection.isValid() )
59  {
60  ATH_MSG_ERROR( " Cannot retrieve CaloCellContainer: " << cell_collection.name() );
61  return StatusCode::FAILURE;
62  }
63 
64  /*
65  SG::ReadCondHandle<CaloNoise> noise_handle(m_noiseCDOKey, ctx);
66  const CaloNoise * noise_tool = *noise_handle;
67  //For Two Gaussian Noise comparisons.
68  */
69 
70  auto export_cell = [&](const CaloCell * cell, const int cell_index)
71  {
72  const float energy = cell->energy();
73  const unsigned int gain = GainConversion::from_standard_gain(cell->gain());
74  ed.m_cell_info->energy[cell_index] = energy;
75  ed.m_cell_info->gain[cell_index] = gain;
76  ed.m_cell_info->time[cell_index] = cell->time();
77 
78 
79  if (CaloRecGPU::GeometryArr::is_tile(cell_index))
80  {
81  const TileCell * tile_cell = (TileCell *) cell;
82 
83  ed.m_cell_info->qualityProvenance[cell_index] = QualityProvenance{tile_cell->qual1(),
84  tile_cell->qual2(),
85  tile_cell->qbit1(),
86  tile_cell->qbit2()};
87 
88  /*
89  //For Two Gaussian Noise comparisons.
90 
91  const float original_snr = noise_tool->getEffectiveSigma(cell->ID(),cell->gain(),cell->energy());
92  const float our_snr = cd.m_cell_noise->get_double_gaussian_noise(cell_index, gain, energy);
93  if (our_snr != original_snr)
94  {
95  std::cout << "---------------------------------------- ERR: " << cell_index << " " << our_snr << " " << original_snr << " " << our_snr - original_snr << std::endl;
96  }
97  */
98  }
99  else
100  {
101  ed.m_cell_info->qualityProvenance[cell_index] = QualityProvenance{cell->quality(), cell->provenance()};
102  }
103 
104  };
105 
106  //For Two Gaussian Noise comparisons.
107  //std::cout << "-------------------------------------------------------------------------- START" << std::endl;
108 
109  if (cell_collection->isOrderedAndComplete())
110  //Fast path: cell indices within the collection and identifierHashes match!
111  {
112  ATH_MSG_DEBUG("Taking quick path on event " << ctx.evt());
113  int cell_index = 0;
114  for (CaloCellContainer::const_iterator iCells = cell_collection->begin(); iCells != cell_collection->end(); ++iCells, ++cell_index)
115  {
116  const CaloCell * cell = (*iCells);
117  export_cell(cell, cell_index);
118  }
119  }
120  else if (cell_collection->isOrdered() && m_missingCellsToFill.size() > 0)
121  //Remediated: we know the missing cells, force them to be invalid.
122  //(Tests so far, on samples both oldish and newish, had 186986 and 187352 missing...)
123  {
124  ATH_MSG_DEBUG("Taking remediated fast path on event " << ctx.evt());
125  int cell_index = 0;
126  size_t missing_cell_count = 0;
127  for (CaloCellContainer::const_iterator iCells = cell_collection->begin(); iCells != cell_collection->end(); ++iCells, ++cell_index)
128  {
129  const CaloCell * cell = (*iCells);
130 
131  if (missing_cell_count < m_missingCellsToFill.size() && cell_index == m_missingCellsToFill[missing_cell_count])
132  {
133  --iCells;
134  ed.m_cell_info->gain[cell_index] = GainConversion::invalid_gain();
135  ++missing_cell_count;
136  continue;
137  }
138  else
139  {
140  export_cell(cell, cell_index);
141  }
142  }
143  }
144  else
145  //Slow path: be careful.
146  {
147  /*
148  std::vector<bool> has_cell(NCaloCells, false);
149  // */
150  ATH_MSG_DEBUG("Taking slow path on event " << ctx.evt());
151  for (int cell_index = 0; cell_index < NCaloCells; ++cell_index)
152  {
153  ed.m_cell_info->gain[cell_index] = GainConversion::invalid_gain();
154  }
155 
156  for (CaloCellContainer::const_iterator iCells = cell_collection->begin(); iCells != cell_collection->end(); ++iCells)
157  {
158  const CaloCell * cell = (*iCells);
159 
160  //const int cell_index = m_calo_id->calo_cell_hash(cell->ID());
161  const int cell_index = cell->caloDDE()->calo_hash();
162  //See calodde
163 
164  export_cell(cell, cell_index);
165 
166  /*
167  has_cell[cell_index] = true;
168  // */
169 
170  }
171 
172  /*
173  //Useful output for detecting missing cells in the calorimeter collection...
174 
175  for (size_t i = 0; i < has_cell.size(); ++i)
176  {
177  if (!has_cell[i])
178  {
179  const auto identifier = m_calo_id->cell_id(i);
180  const auto sampling = m_calo_id->calo_sample(m_calo_id->cell_id((IdentifierHash) i));
181  std::cout << i << " " << sampling << std::endl;
182  }
183  }
184  // */
185  }
186 
187  //For Two Gaussian Noise comparisons.
188  //std::cout << "-------------------------------------------------------------------------- END" << std::endl;
189 
190  const auto post_cells = clock_type::now();
191 
192  ed.m_clusters.allocate();
193  ed.m_cell_state.allocate();
194 
195  if (cluster_collection->size() > 0)
196  {
197 
198  for (int i = 0; i < NCaloCells; ++i)
199  {
200  ed.m_cell_state->clusterTag[i] = ClusterTag::make_invalid_tag();
201  }
202 
203  const auto cluster_end = cluster_collection->end();
204  auto cluster_iter = cluster_collection->begin();
205 
206  for (int cluster_number = 0; cluster_iter != cluster_end; ++cluster_iter, ++cluster_number )
207  {
208  const xAOD::CaloCluster * cluster = (*cluster_iter);
209  const CaloClusterCellLink * cell_links = cluster->getCellLinks();
210 
211  ed.m_clusters->clusterEnergy[cluster_number] = cluster->e();
212  ed.m_clusters->clusterEt[cluster_number] = cluster->et();
213  ed.m_clusters->clusterEta[cluster_number] = cluster->eta();
214  ed.m_clusters->clusterPhi[cluster_number] = cluster->phi();
215 
216  const int seed_cell_index = m_calo_id->calo_cell_hash(cluster->cell_begin()->ID());
217 
218  ed.m_clusters->seedCellID[cluster_number] = seed_cell_index;
219 
220  for (auto it = cell_links->begin(); it != cell_links->end(); ++it)
221  {
223  {
224  const int cell_ID = m_calo_id->calo_cell_hash(it->ID());
225  const float weight = it.weight();
226 
227  uint32_t weight_as_int = 0;
228  std::memcpy(&weight_as_int, &weight, sizeof(float));
229  //On the platforms we expect to be running this, it should be fine.
230  //Still UB.
231  //With C++20, we could do that bit-cast thing.
232 
233  if (weight_as_int == 0)
234  {
235  weight_as_int = 1;
236  //Subnormal,
237  //but just to distinguish from
238  //a non-shared cluster.
239  }
240 
241  const ClusterTag other_tag = ed.m_cell_state->clusterTag[cell_ID];
242 
243  const int other_index = other_tag.is_part_of_cluster() ? other_tag.cluster_index() : -1;
244 
245  if (other_index < 0)
246  {
247  if (weight < 0.5f)
248  {
249  ed.m_cell_state->clusterTag[cell_ID] = ClusterTag::make_tag(cluster_number, weight_as_int, 0);
250  }
251  else
252  {
253  ed.m_cell_state->clusterTag[cell_ID] = ClusterTag::make_tag(cluster_number);
254  }
255  }
256  else if (weight > 0.5f)
257  {
258  ed.m_cell_state->clusterTag[cell_ID] = ClusterTag::make_tag(cluster_number, other_tag.secondary_cluster_weight(), other_index);
259  }
260  else if (weight == 0.5f)
261  //Unlikely, but...
262  {
263  const int max_cluster = cluster_number > other_index ? cluster_number : other_index;
264  const int min_cluster = cluster_number > other_index ? other_index : cluster_number;
265  ed.m_cell_state->clusterTag[cell_ID] = ClusterTag::make_tag(max_cluster, weight_as_int, min_cluster);
266  }
267  else /*if (weight < 0.5f)*/
268  {
269  ed.m_cell_state->clusterTag[cell_ID] = ClusterTag::make_tag(other_index, weight_as_int, cluster_number);
270  }
271  }
272  else
273  {
274  ed.m_cell_state->clusterTag[m_calo_id->calo_cell_hash(it->ID())] = ClusterTag::make_tag(cluster_number);
275  }
276  }
277  }
278 
279  ed.m_clusters->number = cluster_collection->size();
280  }
281 
282  const auto post_clusters = clock_type::now();
283 
284  const bool has_cluster_info = cluster_collection->size() > 0;
285 
286  ed.sendToGPU(!m_keepCPUData, has_cluster_info, has_cluster_info, false);
287 
288  const auto post_send = clock_type::now();
289 
290  if (m_measureTimes)
291  {
292  record_times(ctx.evt(),
293  time_cast(start, post_cells),
294  time_cast(post_cells, post_clusters),
295  time_cast(post_clusters, post_send)
296  );
297  }
298 
299  return StatusCode::SUCCESS;
300 
301 }

◆ declareGaudiProperty() [1/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleKeyArrayType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKeyArray>

Definition at line 170 of file AthCommonDataStore.h.

172  {
173  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
174  hndl.value(),
175  hndl.documentation());
176 
177  }

◆ declareGaudiProperty() [2/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleKeyType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158  {
159  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
160  hndl.value(),
161  hndl.documentation());
162 
163  }

◆ declareGaudiProperty() [3/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleBase>

Definition at line 184 of file AthCommonDataStore.h.

186  {
187  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
188  hndl.value(),
189  hndl.documentation());
190  }

◆ declareGaudiProperty() [4/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  t,
const SG::NotHandleType  
)
inlineprivateinherited

specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray>

Definition at line 199 of file AthCommonDataStore.h.

200  {
201  return PBASE::declareProperty(t);
202  }

◆ DeclareInterfaceID()

ICaloClusterGPUInputTransformer::DeclareInterfaceID ( ICaloClusterGPUInputTransformer  ,
,
 
)
inherited

◆ declareProperty() [1/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleBase hndl,
const std::string &  doc,
const SG::VarHandleType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
hndlObject holding the property value.
docDocumentation string for the property.

This is the version for types that derive from SG::VarHandleBase. The property value object is put on the input and output lists as appropriate; then we forward to the base class.

Definition at line 245 of file AthCommonDataStore.h.

249  {
250  this->declare(hndl.vhKey());
251  hndl.vhKey().setOwner(this);
252 
253  return PBASE::declareProperty(name,hndl,doc);
254  }

◆ declareProperty() [2/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleKey hndl,
const std::string &  doc,
const SG::VarHandleKeyType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
hndlObject holding the property value.
docDocumentation string for the property.

This is the version for types that derive from SG::VarHandleKey. The property value object is put on the input and output lists as appropriate; then we forward to the base class.

Definition at line 221 of file AthCommonDataStore.h.

225  {
226  this->declare(hndl);
227  hndl.setOwner(this);
228 
229  return PBASE::declareProperty(name,hndl,doc);
230  }

◆ declareProperty() [3/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleKeyArray hndArr,
const std::string &  doc,
const SG::VarHandleKeyArrayType  
)
inlineinherited

Definition at line 259 of file AthCommonDataStore.h.

263  {
264 
265  // std::ostringstream ost;
266  // ost << Algorithm::name() << " VHKA declareProp: " << name
267  // << " size: " << hndArr.keys().size()
268  // << " mode: " << hndArr.mode()
269  // << " vhka size: " << m_vhka.size()
270  // << "\n";
271  // debug() << ost.str() << endmsg;
272 
273  hndArr.setOwner(this);
274  m_vhka.push_back(&hndArr);
275 
276  Gaudi::Details::PropertyBase* p = PBASE::declareProperty(name, hndArr, doc);
277  if (p != 0) {
278  p->declareUpdateHandler(&AthCommonDataStore<PBASE>::updateVHKA, this);
279  } else {
280  ATH_MSG_ERROR("unable to call declareProperty on VarHandleKeyArray "
281  << name);
282  }
283 
284  return p;
285 
286  }

◆ declareProperty() [4/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
T &  property,
const std::string &  doc,
const SG::NotHandleType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
propertyObject holding the property value.
docDocumentation string for the property.

This is the generic version, for types that do not derive from SG::VarHandleKey. It just forwards to the base class version of declareProperty.

Definition at line 333 of file AthCommonDataStore.h.

337  {
338  return PBASE::declareProperty(name, property, doc);
339  }

◆ declareProperty() [5/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
T &  property,
const std::string &  doc = "none" 
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
propertyObject holding the property value.
docDocumentation string for the property.

This dispatches to either the generic declareProperty or the one for VarHandle/Key/KeyArray.

Definition at line 352 of file AthCommonDataStore.h.

355  {
356  typedef typename SG::HandleClassifier<T>::type htype;
357  return declareProperty (name, property, doc, htype());
358  }

◆ declareProperty() [6/6]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T > &  t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145  {
146  typedef typename SG::HandleClassifier<T>::type htype;
148  }

◆ detStore()

const ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

95 { return m_detStore; }

◆ evtStore() [1/2]

ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

85 { return m_evtStore; }

◆ evtStore() [2/2]

const ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( ) const
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 90 of file AthCommonDataStore.h.

90 { return m_evtStore; }

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase &  ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ finalize()

StatusCode BasicEventDataGPUExporter::finalize ( )
overridevirtual

Definition at line 304 of file BasicEventDataGPUExporter.cxx.

305 {
306 
307  if (m_measureTimes)
308  {
309  print_times("Cells Clusters Transfer_to_GPU", 3);
310  }
311  return StatusCode::SUCCESS;
312 }

◆ initialize()

StatusCode BasicEventDataGPUExporter::initialize ( )
overridevirtual

Definition at line 29 of file BasicEventDataGPUExporter.cxx.

30 {
31 
32  //ATH_CHECK(m_noiseCDOKey.initialize());
33  //For Two Gaussian Noise comparisons.
34 
36 
37  ATH_CHECK( detStore()->retrieve(m_calo_id, "CaloCell_ID") );
38 
39  return StatusCode::SUCCESS;
40 }

◆ inputHandles()

virtual std::vector<Gaudi::DataHandle*> AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ msg() [1/2]

MsgStream& AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24  {
25  return this->msgStream();
26  }

◆ msg() [2/2]

MsgStream& AthCommonMsg< AlgTool >::msg ( const MSG::Level  lvl) const
inlineinherited

Definition at line 27 of file AthCommonMsg.h.

27  {
28  return this->msgStream(lvl);
29  }

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level  lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30  {
31  return this->msgLevel(lvl);
32  }

◆ outputHandles()

virtual std::vector<Gaudi::DataHandle*> AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ print_times()

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

Definition at line 138 of file CaloGPUTimed.h.

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

◆ 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 102 of file CaloGPUTimed.h.

103  {
104  const size_t time_size = 1;
105 
106  size_t old_size;
107 
108  //Scope just for the lock_guard.
109  {
110  std::lock_guard<std::mutex> lock_guard(m_timeMutex);
111  old_size = m_times.size();
112  m_times.resize(old_size + time_size);
113  m_eventNumbers.push_back(event_num);
114  }
115 
116  record_times_helper(old_size, value);
117  }

◆ 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 120 of file CaloGPUTimed.h.

121  {
122  const size_t time_size = sizeof...(args) + 1;
123 
124  size_t old_size;
125 
126  //Scope just for the lock_guard.
127  {
128  std::lock_guard<std::mutex> lock_guard(m_timeMutex);
129  old_size = m_times.size();
130  m_times.resize(old_size + time_size);
131  m_eventNumbers.push_back(event_num);
132  }
133 
134  record_times_helper(old_size, value, std::forward<Args>(args)...);
135 
136  }

◆ record_times() [3/3]

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

Definition at line 84 of file CaloGPUTimed.h.

85  {
86  size_t old_size;
87  //Scope just for the lock_guard.
88  {
89  std::lock_guard<std::mutex> lock_guard(m_timeMutex);
90  old_size = m_times.size();
91  m_times.resize(old_size + times.size());
92  m_eventNumbers.push_back(event_num);
93  }
94 
95  for (size_t i = 0; i < times.size(); ++i)
96  {
97  m_times[old_size + i] = times[i];
98  }
99  }

◆ record_times_helper() [1/3]

void CaloGPUTimed::record_times_helper ( size_t  index,
size_t  t 
) const
inlineprivateinherited

Definition at line 70 of file CaloGPUTimed.h.

71  {
72  m_times[index] = t;
73  }

◆ record_times_helper() [2/3]

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

Definition at line 76 of file CaloGPUTimed.h.

77  {
79  record_times_helper(index + 1, std::forward<Args>(args)...);
80  }

◆ record_times_helper() [3/3]

void CaloGPUTimed::record_times_helper ( size_t  ) const
inlineprivateinherited

Definition at line 64 of file CaloGPUTimed.h.

65  {
66  //Do nothing
67  }

◆ renounce()

std::enable_if_t<std::is_void_v<std::result_of_t<decltype(&T::renounce)(T)> > && !std::is_base_of_v<SG::VarHandleKeyArray, T> && std::is_base_of_v<Gaudi::DataHandle, T>, void> AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T &  h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381  {
382  h.renounce();
383  PBASE::renounce (h);
384  }

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364  {
365  handlesArray.renounce();
366  }

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in DerivationFramework::CfAthAlgTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and asg::AsgMetadataTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase &  )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308  {
309  // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310  // << " size: " << m_vhka.size() << endmsg;
311  for (auto &a : m_vhka) {
312  std::vector<SG::VarHandleKey*> keys = a->keys();
313  for (auto k : keys) {
314  k->setOwner(this);
315  }
316  }
317  }

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_calo_id

const CaloCell_ID* BasicEventDataGPUExporter::m_calo_id {nullptr}
private

Pointer to Calo ID Helper.

Definition at line 73 of file BasicEventDataGPUExporter.h.

◆ m_cellsKey

SG::ReadHandleKey<CaloCellContainer> BasicEventDataGPUExporter::m_cellsKey {this, "CellsName", "", "Name(s) of Cell Containers"}
private

vector of names of the cell containers to use as input.

Definition at line 57 of file BasicEventDataGPUExporter.h.

◆ m_considerSharedCells

Gaudi::Property<bool> BasicEventDataGPUExporter::m_considerSharedCells {this, "ConsiderSharedCells", false, "Take into account the possibility of a cell being shared between clusters."}
private

If true, into account the possibility of a cell being shared between clusters.

Hurts performance when not needed. Defaults to false.

Definition at line 64 of file BasicEventDataGPUExporter.h.

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_keepCPUData

Gaudi::Property<bool> BasicEventDataGPUExporter::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 true.

Definition at line 52 of file BasicEventDataGPUExporter.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_missingCellsToFill

Gaudi::Property<std::vector<int> > BasicEventDataGPUExporter::m_missingCellsToFill {this, "MissingCellsToFill", {}, "Force fill these cells as disabled on empty containers."}
private

Cell indices to fill as disabled cells (useful if the cell vector is always missing the same cells).

Definition at line 68 of file BasicEventDataGPUExporter.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::mutex CaloGPUTimed::m_timeMutex
mutableprotectedinherited

Mutex that is locked when recording times.

Definition at line 32 of file CaloGPUTimed.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files:
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::CaloCluster_v1::phi
virtual double phi() const
The azimuthal angle ( ) of the particle.
Definition: CaloCluster_v1.cxx:256
TileCell
Definition: TileCell.h:57
BasicEventDataGPUExporter::m_missingCellsToFill
Gaudi::Property< std::vector< int > > m_missingCellsToFill
Cell indices to fill as disabled cells (useful if the cell vector is always missing the same cells).
Definition: BasicEventDataGPUExporter.h:68
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
xAOD::CaloCluster_v1::cell_begin
const_cell_iterator cell_begin() const
Iterator of the underlying CaloClusterCellLink (const version)
Definition: CaloCluster_v1.h:812
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
header
Definition: hcg.cxx:526
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
BasicEventDataGPUExporter::m_cellsKey
SG::ReadHandleKey< CaloCellContainer > m_cellsKey
vector of names of the cell containers to use as input.
Definition: BasicEventDataGPUExporter.h:57
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
index
Definition: index.py:1
AthCommonDataStore::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
Trk::indices
std::pair< long int, long int > indices
Definition: AlSymMatBase.h:24
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
skel.it
it
Definition: skel.GENtoEVGEN.py:423
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
StoreGateSvc_t m_evtStore
Pointer to StoreGate (event store by default)
Definition: AthCommonDataStore.h:390
CaloGPUTimed::m_timeFileName
Gaudi::Property< std::string > m_timeFileName
File to which times should be saved.
Definition: CaloGPUTimed.h:50
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
std::vector< SG::VarHandleKeyArray * > m_vhka
Definition: AthCommonDataStore.h:398
xAOD::CaloCluster_v1::et
double et() const
Definition: CaloCluster_v1.h:856
athena.value
value
Definition: athena.py:122
CaloGPUTimed::record_times_helper
void record_times_helper(size_t) const
Definition: CaloGPUTimed.h:64
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
BasicEventDataGPUExporter::m_considerSharedCells
Gaudi::Property< bool > m_considerSharedCells
If true, into account the possibility of a cell being shared between clusters.
Definition: BasicEventDataGPUExporter.h:64
CaloRecGPU::ClusterTag
Definition: TagDefinitions.h:222
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
SG::VarHandleKeyArray::setOwner
virtual void setOwner(IDataHandleHolder *o)=0
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:200
CaloRecGPU::ClusterTag::cluster_index
constexpr int32_t cluster_index() const
Definition: TagDefinitions.h:243
TileCell::qual2
uint8_t qual2(void) const
get quality of second PMT (data member)
Definition: TileCell.h:206
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
python.handimod.now
now
Definition: handimod.py:675
AthCommonDataStore
Definition: AthCommonDataStore.h:52
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ParticleGun_FastCalo_ChargeFlip_Config.energy
energy
Definition: ParticleGun_FastCalo_ChargeFlip_Config.py:78
BasicEventDataGPUExporter::m_calo_id
const CaloCell_ID * m_calo_id
Pointer to Calo ID Helper.
Definition: BasicEventDataGPUExporter.h:73
xAOD::CaloCluster_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: CaloCluster_v1.cxx:251
lumiFormat.i
int i
Definition: lumiFormat.py:92
CaloRecGPU::GeometryArr::is_tile
constexpr static bool is_tile(const int cell)
Definition: ConstantInfoDefinitions.h:246
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
CaloGPUTimed::print_times
void print_times(const std::string &header, const size_t time_size) const
Definition: CaloGPUTimed.h:138
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TileCell::qbit1
uint8_t qbit1(void) const
get quality bits of first PMT (data member)
Definition: TileCell.h:209
CaloRecGPU::NCaloCells
constexpr int NCaloCells
Definition: BaseDefinitions.h:13
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
StoreGateSvc_t m_detStore
Pointer to StoreGate (detector store by default)
Definition: AthCommonDataStore.h:393
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
xAOD::CaloCluster_v1::getCellLinks
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
Definition: CaloCluster_v1.cxx:905
AthAlgTool::AthAlgTool
AthAlgTool()
Default constructor:
BasicEventDataGPUExporter::m_keepCPUData
Gaudi::Property< bool > m_keepCPUData
If true, do not delete the CPU version of the GPU-friendly data representation.
Definition: BasicEventDataGPUExporter.h:52
SG::VarHandleKeyArray::renounce
virtual void renounce()=0
SG::HandleClassifier::type
std::conditional< std::is_base_of< SG::VarHandleKeyArray, T >::value, VarHandleKeyArrayType, type2 >::type type
Definition: HandleClassifier.h:54
merge_scale_histograms.doc
string doc
Definition: merge_scale_histograms.py:9
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
CaloGPUTimed::m_timeMutex
std::mutex m_timeMutex
Mutex that is locked when recording times.
Definition: CaloGPUTimed.h:32
CaloGPUTimed::CaloGPUTimed
CaloGPUTimed(T *ptr)
Definition: CaloGPUTimed.h:55
CaloCell::ID
Identifier ID() const
get ID (from cached data member) non-virtual and inline for fast access
Definition: CaloCell.h:279
CaloRecGPU::ClusterTag::is_part_of_cluster
constexpr bool is_part_of_cluster() const
Definition: TagDefinitions.h:233
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
TileCell::qbit2
uint8_t qbit2(void) const
get quality bits of second PMT (data member)
Definition: TileCell.h:212
DeMoScan.index
string index
Definition: DeMoScan.py:362
a
TList * a
Definition: liststreamerinfos.cxx:10
h
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
CaloGPUTimed::record_times
void record_times(const size_t event_num, const std::vector< size_t > &times) const
Definition: CaloGPUTimed.h:84
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
CaloGPUTimed::m_measureTimes
Gaudi::Property< bool > m_measureTimes
If true, times are recorded to the file given by m_timeFileName.
Definition: CaloGPUTimed.h:46
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
CaloRecGPU::QualityProvenance
Definition: EventInfoDefinitions.h:116
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
SG::VarHandleBase::vhKey
SG::VarHandleKey & vhKey()
Return a non-const reference to the HandleKey.
Definition: StoreGate/src/VarHandleBase.cxx:616
TileCell::qual1
uint8_t qual1(void) const
get quality of first PMT (data member)
Definition: TileCell.h:203
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:790
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
AthCommonDataStore::declareGaudiProperty
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>
Definition: AthCommonDataStore.h:156
xAOD::CaloCluster_v1::e
virtual double e() const
The total energy of the particle.
Definition: CaloCluster_v1.cxx:265
python.CaloScaleNoiseConfig.args
args
Definition: CaloScaleNoiseConfig.py:80
CaloRecGPU::ClusterTag::secondary_cluster_weight
constexpr int32_t secondary_cluster_weight() const
Definition: TagDefinitions.h:263
plot_times.times
def times(fn)
Definition: plot_times.py:11
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
fitman.k
k
Definition: fitman.py:528