ATLAS Offline Software
Loading...
Searching...
No Matches
Rec::ParticleCaloCellAssociationTool Class Reference

#include <ParticleCaloCellAssociationTool.h>

Inheritance diagram for Rec::ParticleCaloCellAssociationTool:
Collaboration diagram for Rec::ParticleCaloCellAssociationTool:

Public Types

typedef std::unordered_map< size_t, std::unique_ptr< ParticleCellAssociation > > Cache
 Method to get the ParticleCellAssociation for a given Particle.

Public Member Functions

 ParticleCaloCellAssociationTool (const std::string &, const std::string &, const IInterface *)
virtual ~ParticleCaloCellAssociationTool () override
virtual StatusCode initialize () override final
virtual StatusCode finalize () override final
virtual std::unique_ptr< ParticleCellAssociationparticleCellAssociation (const xAOD::IParticle &particle, float dr, const CaloCellContainer *container=nullptr, const CaloExtensionCollection *extensionCache=nullptr) const override final
 Method to get the ParticleCellAssociation for a given Particle.
virtual ParticleCellAssociationparticleCellAssociation (const xAOD::IParticle &particle, float dr, IParticleCaloCellAssociationTool::Cache &cache, const CaloCellContainer *container=nullptr, const CaloExtensionCollection *extensionCache=nullptr) const override final
 Method to get the ParticleCellAssociation for a given Particle.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Static Public Member Functions

static const InterfaceID & interfaceID ()

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
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.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

void getCellIntersections (const Trk::CaloExtension &caloExtension, const std::vector< const CaloCell * > &cells, ParticleCellAssociation::CellIntersections &cellIntersections) const
void associateCells (const CaloCellContainer &container, const Trk::CaloExtension &caloExtension, float dr, std::vector< const CaloCell * > &cells) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

ToolHandle< Trk::IParticleCaloExtensionToolm_caloExtensionTool
SG::ReadHandleKey< CaloCellContainerm_cellContainerName
Gaudi::Property< double > m_coneSize { this, "ConeSize", 0.2 }
SG::ReadCondHandleKey< CaloDetDescrManagerm_caloMgrKey {this,"CaloDetDescrManager", "CaloDetDescrManager"}
Trk::CaloCellSelectorLayerdR m_defaultSelector
PathLengthUtils m_pathLenUtil
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 32 of file ParticleCaloCellAssociationTool.h.

Member Typedef Documentation

◆ Cache

typedef std::unordered_map<size_t,std::unique_ptr< ParticleCellAssociation > > Rec::IParticleCaloCellAssociationTool::Cache
inherited

Method to get the ParticleCellAssociation for a given Particle.

Parameters
particleinput particle
drcone size used for the association @ param cache cache for keeping previous results
containercell container to be used if provided
extensionCacheA calo extension cache to be used if provided
Returns
ParticleCellAssociation* (plain ptr cache has ownership)

An alg looping over a single collection of IParticles
re-using them multiple times can use a local cache of the form std::unordered_map<size_t,std::unique_ptr<ParticleCellAssociation >>. where the key is the value of IParticle::index()

This method adds the ParticleCellAssociation to the cache look-up table which retains ownership.

Definition at line 56 of file IParticleCaloCellAssociationTool.h.

◆ StoreGateSvc_t

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

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ ParticleCaloCellAssociationTool()

Rec::ParticleCaloCellAssociationTool::ParticleCaloCellAssociationTool ( const std::string & t,
const std::string & n,
const IInterface * p )

Definition at line 22 of file ParticleCaloCellAssociationTool.cxx.

26 : AthAlgTool(t, n, p)
28{
29 declareInterface<IParticleCaloCellAssociationTool>(this);
30}
AthAlgTool()
Default constructor:

◆ ~ParticleCaloCellAssociationTool()

Rec::ParticleCaloCellAssociationTool::~ParticleCaloCellAssociationTool ( )
overridevirtualdefault

Member Function Documentation

◆ associateCells()

void Rec::ParticleCaloCellAssociationTool::associateCells ( const CaloCellContainer & container,
const Trk::CaloExtension & caloExtension,
float dr,
std::vector< const CaloCell * > & cells ) const
private

Definition at line 424 of file ParticleCaloCellAssociationTool.cxx.

429{
431 if (!pars) {
432 ATH_MSG_DEBUG("associateCells() - NO TrackParameters found in "
433 "caloExtension.caloEntryLayerIntersection()");
434 return;
435 }
436
437 double eta = pars->position().eta();
438 double phi = pars->position().phi();
439
440 // Use Calorimeter list for CPU reasons
441 SG::ReadCondHandle<CaloDetDescrManager> caloMgrHandle{m_caloMgrKey};
442 const CaloDetDescrManager* caloMgr=*caloMgrHandle;
443 CaloCellList myList(caloMgr,&container);
444 myList.select(eta, phi, dr);
445 cells.reserve(myList.ncells());
446 cells.insert(cells.end(), myList.begin(), myList.end());
447 ATH_MSG_DEBUG("associated cells " << cells.size() << " using cone " << dr);
448}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_DEBUG(x)
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
const TrackParameters * caloEntryLayerIntersection() const
access to intersection with the calorimeter entry layer return nullptr if the intersection failed
ParametersBase< TrackParametersDim, Charged > TrackParameters

◆ declareGaudiProperty()

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

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

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

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

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ 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.

◆ evtStore()

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.

◆ 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 Rec::ParticleCaloCellAssociationTool::finalize ( )
finaloverridevirtual

Definition at line 51 of file ParticleCaloCellAssociationTool.cxx.

52{
53 return StatusCode::SUCCESS;
54}

◆ getCellIntersections()

void Rec::ParticleCaloCellAssociationTool::getCellIntersections ( const Trk::CaloExtension & caloExtension,
const std::vector< const CaloCell * > & cells,
ParticleCellAssociation::CellIntersections & cellIntersections ) const
private

Definition at line 143 of file ParticleCaloCellAssociationTool.cxx.

147{
148 // use 3D pathlength in cells
149
150 bool use3D = true;
151
152 cellIntersections.reserve(extension.caloLayerIntersections().size() * 1.3);
153
155 CaloExtensionHelpers::entryExitLayerMap(extension, entryExitLayerMap);
156 ATH_MSG_DEBUG("EntryExitLayerMap " << entryExitLayerMap.size());
157
159 CaloExtensionHelpers::eLossLayerMap(extension, eLossLayerMap);
160 CaloExtensionHelpers::pathLenLayerMap(extension, pathLenLayerMap);
161
162 ATH_MSG_DEBUG("Getting cells intersections using cells " << cells.size());
163 for (const auto* cell : cells) {
164 // get sampling and look up entry/exit points
165 CaloSampling::CaloSample sample = cell->caloDDE()->getSampling();
166
167 auto pos = entryExitLayerMap.find(sample);
168 if (pos == entryExitLayerMap.end())
169 continue;
170 //
171 // pos2 and weight2 are introduced because the PreSamplerB has sometimes a
172 // very small size
173 // PresamplerB and EMB1 are merged
174 //
175 auto pos2 = pos;
176 if (sample == CaloSampling::PreSamplerB) {
177 pos2 = entryExitLayerMap.find(CaloSampling::EMB1);
178 if (pos2 == entryExitLayerMap.end()) {
179 pos2 = pos;
180 }
181 }
183 double path = 0.;
184
185 double drFix = cell->caloDDE()->dr();
186 double dzFix = cell->caloDDE()->dz();
187 // double dphi = cell->caloDDE()->dphi();
188
189 int isample = cell->caloDDE()->getSampling();
190 bool barrel = false;
191 if (cell->caloDDE()->getSubCalo() == CaloCell_ID::TILE)
192 barrel = true;
193 if (sample == CaloSampling::PreSamplerB || sample == CaloSampling::EMB1 ||
194 sample == CaloSampling::EMB2 || sample == CaloSampling::EMB3)
195 barrel = true;
196
197 double drTG = fabs((pos->second.first - pos2->second.second).perp());
198 double dzTG = fabs((pos->second.first - pos2->second.second).z());
199
200 if (barrel)
201 ATH_MSG_VERBOSE(" barrel cell sampling "
202 << cell->caloDDE()->getSampling() << " dr "
203 << cell->caloDDE()->dr() << " drTG " << drTG);
204 if (!barrel)
205 ATH_MSG_VERBOSE(" endcap cell sampling "
206 << cell->caloDDE()->getSampling() << " dz "
207 << cell->caloDDE()->dz() << " dzTG " << dzTG);
208
209 if (drFix == 0.) {
210 // recalculate the r values from the other cells
211 // BUG/FEATURE: extract dr from cell container for sampling 4 5 6 7 needed
212 // EME BUG/FEATURE: extract dr from cell container for sampling 8 9 10 11
213 // needed HEC
214 if (cell->caloDDE()->deta() > 0) {
215 double theta = atan2(cell->caloDDE()->r(), cell->z());
216 double dtheta =
217 2 * cell->caloDDE()->deta() * sin(theta / 2.) * cos(theta / 2);
218 if (theta + dtheta < M_PI) {
219 double dr =
220 fabs(cell->z() * tan(theta + dtheta) - cell->z() * tan(theta));
221 drFix = fabs(dr);
222 double detaCheck =
223 -log(tan((theta + dtheta) / 2.)) + log(tan((theta) / 2.));
224 ATH_MSG_VERBOSE(" FIX cell sampling "
225 << cell->caloDDE()->getSampling() << " deta "
226 << cell->caloDDE()->deta() << " detaCheck "
227 << detaCheck << " drFix " << drFix);
228 } else {
229 ATH_MSG_WARNING(" FIXR cell sampling failed: theta "
230 << theta << " dtheta " << dtheta << " sum/pi "
231 << (theta + dtheta) * M_1_PI << " deta "
232 << cell->caloDDE()->deta());
233 }
234 // ATH_MSG_VERBOSE(" FIX cell sampling deta " << deta << "
235 // dtheta " << dtheta << " scale " << scale << " theta " <<
236 // theta );
237 } else {
238 double drMin = 100000.;
239 int dscut = 1;
240 if (!barrel)
241 dscut = 0;
242 const CaloCell* cellFound = nullptr;
243 for (const auto* celln : cells) {
244 if (cell == celln)
245 continue;
246 if (cell->caloDDE()->getSubCalo() == celln->caloDDE()->getSubCalo()) {
247 int dsample = isample - celln->caloDDE()->getSampling();
248 if (abs(dsample) == dscut) {
249 double drNew = fabs(cell->caloDDE()->r() - celln->caloDDE()->r());
250 if (drNew < 1)
251 continue;
252 if (drNew < drMin) {
253 drMin = drNew;
254 cellFound = celln;
255 }
256 }
257 }
258 }
259 drFix = drMin;
260 ATH_MSG_VERBOSE(" Problem cell sampling "
261 << cell->caloDDE()->getSampling() << " x "
262 << cell->caloDDE()->x() << " y " << cell->caloDDE()->y()
263 << " z " << cell->caloDDE()->z() << " dr "
264 << cell->caloDDE()->dr() << " drFix " << drFix
265 << " drTG " << drTG);
266 if (cellFound)
267 ATH_MSG_VERBOSE(" cellFound sampling "
268 << cellFound->caloDDE()->getSampling() << " x "
269 << cellFound->caloDDE()->x() << " y "
270 << cellFound->caloDDE()->y() << " z "
271 << cellFound->caloDDE()->z() << " dr "
272 << cellFound->caloDDE()->dr() << " dscut " << dscut
273 << " drFix " << drFix);
274 }
275 }
276
277 if (dzFix == 0.) {
278 // recalculate z values from the other cells
279 // BUG/FEATURE: extract dz from cell container for sampling 0 1 2 3 needed
280 // EMB
281 if (cell->caloDDE()->deta() > 0) {
282 double theta = atan2(cell->caloDDE()->r(), cell->z());
283 double dtheta =
284 2 * cell->caloDDE()->deta() * sin(theta / 2.) * cos(theta / 2);
285 if (theta + dtheta < M_PI) {
286 double dz = fabs(cell->caloDDE()->r() / tan(theta + dtheta) -
287 cell->caloDDE()->r() / tan(theta));
288 dzFix = dz;
289 } else {
290 ATH_MSG_WARNING(" FIXZ cell sampling failed: theta "
291 << theta << " dtheta " << dtheta << " sum/pi "
292 << (theta + dtheta) * M_1_PI << " deta "
293 << cell->caloDDE()->deta());
294 }
295 double detaCheck =
296 -log(tan((theta + dtheta) / 2.)) + log(tan((theta) / 2.));
297 ATH_MSG_VERBOSE(" Fix cell sampling "
298 << cell->caloDDE()->getSampling() << " deta "
299 << cell->caloDDE()->deta() << " detaCheck "
300 << detaCheck << " dtheta " << dtheta << " dzFix "
301 << dzFix);
302 } else {
303 double dzMin = 100000.;
304 int dscut = 1;
305 if (barrel)
306 dscut = 0;
307 const CaloCell* cellFound = nullptr;
308 for (const auto* celln : cells) {
309 if (cell == celln)
310 continue;
311 if (cell->caloDDE()->getSubCalo() == celln->caloDDE()->getSubCalo()) {
312 int isample2 = celln->caloDDE()->getSampling();
313 if (abs(isample - isample2) == dscut) {
314 double dzNew = fabs(cell->caloDDE()->z() - celln->caloDDE()->z());
315 if (dzNew < 1)
316 continue;
317 if (dzNew < dzMin) {
318 dzMin = dzNew;
319 cellFound = celln;
320 }
321 }
322 }
323 }
324 dzFix = dzMin;
325 ATH_MSG_VERBOSE(" Problem cell sampling "
326 << cell->caloDDE()->getSampling() << " x "
327 << cell->caloDDE()->x() << " y " << cell->caloDDE()->y()
328 << " z " << cell->caloDDE()->z() << " dz "
329 << cell->caloDDE()->dz() << " dzFix " << dzFix
330 << " dzTG " << dzTG);
331 if (cellFound)
332 ATH_MSG_VERBOSE(" cellFound sampling "
333 << cellFound->caloDDE()->getSampling() << " x "
334 << cellFound->caloDDE()->x() << " y "
335 << cellFound->caloDDE()->y() << " z "
336 << cellFound->caloDDE()->z() << " dz "
337 << cellFound->caloDDE()->dz() << " dscut " << dscut
338 << " dzFix " << dzFix);
339 }
340 }
341 //
342 // always use fixed values that correspond to the Calorimeter Tracking
343 // Geometry these are different from the CaloCell values
344 //
345
346 if (cell->energy() > 50.)
347 ATH_MSG_DEBUG(" cell sampling and size "
348 << cell->caloDDE()->getSampling() << " cell energy "
349 << cell->energy() << " dzFix " << dzFix << " dzTG " << dzTG
350 << " drFix " << drFix << " drTG " << drTG << " barrel "
351 << barrel);
352
353 if (!barrel)
354 dzFix = dzTG;
355 if (barrel)
356 drFix = drTG;
357
358 if (use3D) {
359 // m_pathLenUtil.pathInsideCell( *cell, entryExitLayerMap);
360 double pathInMM = PathLengthUtils::get3DPathLength(
361 *cell, pos->second.first, pos2->second.second, drFix, dzFix);
362 double totpath = (pos->second.first - pos2->second.second).mag();
363 path = totpath != 0 ? pathInMM / totpath : 0.;
364 if (path > 0 || cell->energy() > 50.) {
365 ATH_MSG_DEBUG(" cell sampling and size "
366 << cell->caloDDE()->getSampling() << " cell energy "
367 << cell->energy() << " drFix " << drFix << " dzFix "
368 << dzFix << " path " << path << " length TG " << totpath);
369 ATH_MSG_DEBUG(" cell dr " << cell->caloDDE()->dr() << " cell dz "
370 << cell->caloDDE()->dz() << " deta "
371 << cell->caloDDE()->deta());
372 }
373 }
374
376 double path2 = 0.;
377
378 if (!use3D)
379 path2 = pathInsideCell(*cell, pos->second.first, pos2->second.second);
380
381 if (path2 <= 0. && path <= 0.)
382 continue;
383
384 // auto entrancePair = entryExitLayerMap.find(entranceID);
385 auto eLossPair = eLossLayerMap.find(sample);
386 double eLoss = 0.;
387 //
388 // Just store total expected eloss
389 //
390 if (eLossPair != eLossLayerMap.end()) {
391 eLoss = eLossPair->second;
392 if (sample == CaloSampling::PreSamplerB) {
393 auto eLossPair2 = eLossLayerMap.find(CaloSampling::EMB1);
394 if (eLossPair2 != eLossLayerMap.end()) {
395 eLoss = 0.5 * (eLossPair->second) + 0.5 * (eLossPair2->second);
396 }
397 } else if (sample == CaloSampling::EMB1) {
398 auto eLossPair2 = eLossLayerMap.find(CaloSampling::PreSamplerB);
399 if (eLossPair2 != eLossLayerMap.end()) {
400 eLoss = 0.5 * (eLossPair->second) + 0.5 * (eLossPair2->second);
401 }
402 }
403 } // IF
404
405 ATH_MSG_DEBUG(" PATH3D = "
406 << path << " PATH2D = " << path2 << " eLoss " << eLoss
407 << " cell energy " << (cell)->energy() << " radius "
408 << cell->caloDDE()->r() << " phi " << cell->caloDDE()->phi()
409 << " dr " << cell->caloDDE()->dr() << " dphi "
410 << cell->caloDDE()->dphi() << " x " << cell->caloDDE()->x()
411 << " y " << cell->caloDDE()->y() << " z "
412 << cell->caloDDE()->z() << " dx " << cell->caloDDE()->dx()
413 << " dy " << cell->caloDDE()->dy() << " dz "
414 << cell->caloDDE()->dz() << " volume "
415 << cell->caloDDE()->volume());
416
417 cellIntersections.emplace_back(
418 cell, new ParticleCellIntersection(*cell, eLoss, use3D ? path : path2));
419 }
420 ATH_MSG_DEBUG(" added cell intersections " << cellIntersections.size());
421}
#define M_PI
Scalar theta() const
theta method
Scalar mag() const
mag method
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
double pathInsideCell(const CaloCell &cell, const Amg::Vector3D &entry, const Amg::Vector3D &exit)
Return the % of path length crossed by the track inside a cell in Z for a ladder shaped cell.
const CaloDetDescrElement * caloDDE() const
get pointer to CaloDetDescrElement (data member)
Definition CaloCell.h:321
CaloCell_ID::CaloSample getSampling() const
cell sampling
static double get3DPathLength(const CaloCell &cell, const Amg::Vector3D &entry, const Amg::Vector3D &exit, double drFix, double dzFix)
void entryExitLayerMap(const Trk::CaloExtension &extension, EntryExitLayerMap &result, const LayersToSelect *selection=nullptr)
std::map< CaloSampling::CaloSample, double > ScalarLayerMap
void pathLenLayerMap(const Trk::CaloExtension &extension, ScalarLayerMap &result)
void eLossLayerMap(const Trk::CaloExtension &extension, ScalarLayerMap &result)
std::map< CaloSampling::CaloSample, std::pair< Amg::Vector3D, Amg::Vector3D > > EntryExitLayerMap
path
python interpreter configuration --------------------------------------—
Definition athena.py:128

◆ initialize()

StatusCode Rec::ParticleCaloCellAssociationTool::initialize ( )
finaloverridevirtual

Definition at line 35 of file ParticleCaloCellAssociationTool.cxx.

36{
37 /* Retrieve track extrapolator from ToolService */
39
40 m_defaultSelector.setConeSize(m_coneSize);
41
42 if (!m_cellContainerName.key().empty()) {
43 ATH_CHECK(m_cellContainerName.initialize());
44 }
45
46 ATH_CHECK(m_caloMgrKey.initialize());
47 return StatusCode::SUCCESS;
48}
#define ATH_CHECK
Evaluate an expression and check for errors.
ToolHandle< Trk::IParticleCaloExtensionTool > m_caloExtensionTool
SG::ReadHandleKey< CaloCellContainer > m_cellContainerName

◆ 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.

◆ interfaceID()

const InterfaceID & Rec::IParticleCaloCellAssociationTool::interfaceID ( )
inlinestaticinherited

Definition at line 65 of file IParticleCaloCellAssociationTool.h.

65 {
67}
static const InterfaceID IID_IParticleCaloCellAssociationTool("Rec::IParticleCaloCellAssociationTool", 1, 0)

◆ msg()

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

Definition at line 24 of file AthCommonMsg.h.

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

◆ 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.

◆ particleCellAssociation() [1/2]

std::unique_ptr< ParticleCellAssociation > Rec::ParticleCaloCellAssociationTool::particleCellAssociation ( const xAOD::IParticle & particle,
float dr,
const CaloCellContainer * container = nullptr,
const CaloExtensionCollection * extensionCache = nullptr ) const
finaloverridevirtual

Method to get the ParticleCellAssociation for a given Particle.

Parameters
particleinput particle
drcone size used for the association
containercell container to be used if provided
Returns
std::unique_ptr<ParticleCellAssociation>

Implements Rec::IParticleCaloCellAssociationTool.

Definition at line 57 of file ParticleCaloCellAssociationTool.cxx.

62{
63 ATH_MSG_DEBUG(" particleCellAssociation: ptr " << &particle << " dr " << dr);
64 // get the extrapolation into the calo
65 std::unique_ptr<const Trk::CaloExtension> caloExtensionUPtr;
66 const Trk::CaloExtension* caloExtension = nullptr;
67 if (extensionCache)
68 caloExtension =
69 m_caloExtensionTool->caloExtension(particle, *extensionCache);
70 else {
71 caloExtensionUPtr = m_caloExtensionTool->caloExtension(
72 Gaudi::Hive::currentContext(), particle);
73 caloExtension = caloExtensionUPtr.get();
74 }
75 if (!caloExtension) {
76 ATH_MSG_DEBUG("Failed to get calo extension");
77 return nullptr;
78 }
79 if (caloExtension->caloLayerIntersections().empty()) {
81 "Received a caloExtension object without track extrapolation");
82 return nullptr;
83 }
84 // retrieve the cell container if not provided, return false it retrieval
85 // failed
86 if (!container) {
87 if (m_cellContainerName.key().empty()) {
88 ATH_MSG_DEBUG("Failed to get calo cell container");
89 return nullptr;
90 }
91 SG::ReadHandle<CaloCellContainer> cccHdl(m_cellContainerName);
92 container = &(*cccHdl);
93 }
94 std::vector<const CaloCell*> cells;
95 // update cone size in case it is smaller than the default
96 if (dr < m_coneSize) {
97 dr = m_coneSize;
98 }
99 associateCells(*container, *caloExtension, dr, cells);
100
101 // get cell intersections
103 getCellIntersections(*caloExtension, cells, cellIntersections);
104 if (!caloExtensionUPtr)
105 // Have to manually copy the calo extension object. Clearly the class
106 // wants to be shared through a shared_ptr but this clearly is not an
107 // option
108 caloExtensionUPtr = std::make_unique<Trk::CaloExtension>(
109 caloExtension->caloEntryLayerIntersection()
110 ? caloExtension->caloEntryLayerIntersection()->uniqueClone()
111 : nullptr,
112 caloExtension->muonEntryLayerIntersection()
113 ? caloExtension->muonEntryLayerIntersection()->uniqueClone()
114 : nullptr,
115 std::vector<Trk::CurvilinearParameters>(
116 caloExtension->caloLayerIntersections()));
117 return std::make_unique<ParticleCellAssociation>(caloExtensionUPtr.release(),
118 std::move(cells),
119 dr,
120 std::move(cellIntersections),
121 container);
122}
void associateCells(const CaloCellContainer &container, const Trk::CaloExtension &caloExtension, float dr, std::vector< const CaloCell * > &cells) const
void getCellIntersections(const Trk::CaloExtension &caloExtension, const std::vector< const CaloCell * > &cells, ParticleCellAssociation::CellIntersections &cellIntersections) const
std::vector< std::pair< const CaloCell *, ParticleCellIntersection * > > CellIntersections
typedef for vector of cell intersections
const std::vector< CurvilinearParameters > & caloLayerIntersections() const
access to the intersections with the calorimeter layers.
const TrackParameters * muonEntryLayerIntersection() const
access to intersection with the muon entry layer return nullptr if the intersection failed
std::unique_ptr< ParametersBase< DIM, T > > uniqueClone() const
clone method for polymorphic deep copy returning unique_ptr; it is not overriden, but uses the existi...

◆ particleCellAssociation() [2/2]

ParticleCellAssociation * Rec::ParticleCaloCellAssociationTool::particleCellAssociation ( const xAOD::IParticle & particle,
float dr,
IParticleCaloCellAssociationTool::Cache & cache,
const CaloCellContainer * container = nullptr,
const CaloExtensionCollection * extensionCache = nullptr ) const
finaloverridevirtual

Method to get the ParticleCellAssociation for a given Particle.

Parameters
particleinput particle
drcone size used for the association @ param cache cache for keeping previous results
containercell container to be used if provided
Returns
ParticleCellAssociation* (plain ptr cache has ownership)

An alg looping over a single collection of IParticles re-using them multiple times can use a local cache of the form std::unordered_map<size_t,std::unique_ptr<ParticleCellAssociation >>. where the key is the value of IParticle::index()

This method adds the ParticleCellAssociation to the cache look-up table which retains ownership.

Implements Rec::IParticleCaloCellAssociationTool.

Definition at line 125 of file ParticleCaloCellAssociationTool.cxx.

131{
132 /*if not there , default ctor for unique_ptr (nullptr)*/
133 std::unique_ptr<ParticleCellAssociation>& association =
134 cache[particle.index()];
135 if (association == nullptr) {
137 particleCellAssociation(particle, dr, container, extensionCache);
138 }
139 return association.get();
140}
virtual std::unique_ptr< ParticleCellAssociation > particleCellAssociation(const xAOD::IParticle &particle, float dr, const CaloCellContainer *container=nullptr, const CaloExtensionCollection *extensionCache=nullptr) const override final
Method to get the ParticleCellAssociation for a given Particle.
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses

◆ 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();
384 }
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)

◆ 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 {
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 asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ 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) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ m_caloExtensionTool

ToolHandle<Trk::IParticleCaloExtensionTool> Rec::ParticleCaloCellAssociationTool::m_caloExtensionTool
private
Initial value:
{
this,
"ParticleCaloExtensionTool",
""
}

Definition at line 94 of file ParticleCaloCellAssociationTool.h.

94 {
95 this,
96 "ParticleCaloExtensionTool",
97 ""
98 };

◆ m_caloMgrKey

SG::ReadCondHandleKey<CaloDetDescrManager> Rec::ParticleCaloCellAssociationTool::m_caloMgrKey {this,"CaloDetDescrManager", "CaloDetDescrManager"}
private

Definition at line 106 of file ParticleCaloCellAssociationTool.h.

106{this,"CaloDetDescrManager", "CaloDetDescrManager"};

◆ m_cellContainerName

SG::ReadHandleKey<CaloCellContainer> Rec::ParticleCaloCellAssociationTool::m_cellContainerName
private
Initial value:
{ this,
"CaloCellContainer",
"AllCalo" }

Definition at line 100 of file ParticleCaloCellAssociationTool.h.

100 { this,
101 "CaloCellContainer",
102 "AllCalo" };

◆ m_coneSize

Gaudi::Property<double> Rec::ParticleCaloCellAssociationTool::m_coneSize { this, "ConeSize", 0.2 }
private

Definition at line 104 of file ParticleCaloCellAssociationTool.h.

104{ this, "ConeSize", 0.2 };

◆ m_defaultSelector

Trk::CaloCellSelectorLayerdR Rec::ParticleCaloCellAssociationTool::m_defaultSelector
private

Definition at line 108 of file ParticleCaloCellAssociationTool.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_pathLenUtil

PathLengthUtils Rec::ParticleCaloCellAssociationTool::m_pathLenUtil
private

Definition at line 110 of file ParticleCaloCellAssociationTool.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: