ATLAS Offline Software
Loading...
Searching...
No Matches
SiTrackerSpacePointFinder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5/***************************************************************************
6-------------------
7ATLAS Collaboration
8***************************************************************************/
9
10//<<<<<< INCLUDES >>>>>>
11
12
14
15// For processing clusters
19
20// Space point Classes,
25
26
27// general Atlas classes
31
33
34namespace InDet {
35
36//------------------------------------------------------------------------
38 ISvcLocator* pSvcLocator)
39 : AthCondAlgorithm(name, pSvcLocator)
40{ }
41
42//-----------------------------------------------------------------------
44{
45 // Check that clusters, space points and ids have names
46 if (m_selectSCTs && m_Sct_clcontainerKey.key().empty()){
47 ATH_MSG_FATAL( "SCTs selected and no name set for SCT clusters");
48 return StatusCode::FAILURE;
49 }
51
52 if (m_selectPixels && m_Pixel_clcontainerKey.key().empty()){
53 ATH_MSG_FATAL( "Pixels selected and no name set for Pixel clusters");
54 return StatusCode::FAILURE;
55 }
57
58 if (m_selectSCTs && m_SpacePointContainer_SCTKey.key().empty()){
59 ATH_MSG_FATAL( "No name set for SCT space points");
60 return StatusCode::FAILURE;
61 }
63
65 ATH_MSG_FATAL( "No name set for Pixels space points");
66 return StatusCode::FAILURE;
67 }
69
70 if (m_overlap && m_spacepointoverlapCollectionKey.key().empty()){
71 ATH_MSG_FATAL( "No name set for overlap space points");
72 return StatusCode::FAILURE;
73 }
75
76 // create containers (requires the Identifier Helpers)
77 if (m_selectPixels){
78 ATH_CHECK(detStore()->retrieve(m_idHelperPixel,"PixelID"));
79 }
80
81 if (m_selectSCTs) {
82 ATH_CHECK(detStore()->retrieve(m_idHelper,"SCT_ID"));
83 }
84
85 // Initialize the key of input SiElementPropertiesTable and SiDetectorElementCollection for SCT
88
91
94 m_cachemode = !m_SpacePointCache_SCTKey.key().empty() || !m_SpacePointCache_PixKey.key().empty();
95
96 if (!m_monTool.empty()) CHECK(m_monTool.retrieve());
97
99 ATH_MSG_INFO("Use SCT SP overlap cuts based on layer number parity");
100
102 ATH_MSG_INFO("Doing eta overlap space points in strips endcap");
103
104 return StatusCode::SUCCESS;
105}
106
107//-------------------------------------------------------------------------
108
109StatusCode SiTrackerSpacePointFinder::execute (const EventContext& ctx) const
110{
112 const InDetDD::SiDetectorElementCollection* elements = nullptr;
113 const SiElementPropertiesTable* properties = nullptr;
114
115 auto nReceivedSPsSCT = Monitored::Scalar<int>( "numSctSpacePoints" , 0 );
116 auto nReceivedSPsPIX = Monitored::Scalar<int>( "numPixSpacePoints" , 0 );
117
118 auto mon = Monitored::Group( m_monTool, nReceivedSPsPIX,nReceivedSPsSCT );
119
120 if (m_selectSCTs) {
122 elements = sctDetEle.retrieve();
123 if (elements==nullptr) {
124 ATH_MSG_FATAL("Pointer of SiDetectorElementCollection (" << m_SCTDetEleCollKey.fullKey() << ") could not be retrieved");
125 return StatusCode::SUCCESS;
126 }
128 properties = sctProperties.retrieve();
129 if (properties==nullptr) {
130 ATH_MSG_FATAL("Pointer of SiElementPropertiesTable (" << m_SCTPropertiesKey.fullKey() << ") could not be retrieved");
131 return StatusCode::SUCCESS;
132 }
133 }
134 SPFCache r_cache(ctx);
135 if (! m_overrideBS){
137 const InDet::BeamSpotData* beamSpot = *beamSpotHandle;
138 r_cache.vertex = beamSpot->beamVtx().position();
139 } else {
141 }
142
143 // register the IdentifiableContainer into StoreGate
144 SG::WriteHandle<SpacePointContainer> spacePointContainerPixel;
145 std::unique_ptr<DataPool<PixelSpacePoint>> dataItemsPixel = nullptr;
146 if (m_selectPixels){
148 if(m_SpacePointCache_PixKey.key().empty()){
149 ATH_CHECK( spacePointContainerPixel.record( std::make_unique<SpacePointContainer>(m_idHelperPixel->wafer_hash_max()) ) );
150 ATH_MSG_DEBUG("Created SpacePointContainer " << m_SpacePointContainerPixelKey.key() << " N= " << m_idHelperPixel->wafer_hash_max());
151 }else{
153 ATH_CHECK(updateH.isValid());
154 ATH_CHECK( spacePointContainerPixel.record( std::make_unique<SpacePointContainer>(updateH.ptr()) ) );
155 ATH_MSG_DEBUG("Created SpacePointContainer " << m_SpacePointContainerPixelKey.key() << " from cache " << m_SpacePointCache_PixKey.key());
156 }
157 const bool hasExternalCache = spacePointContainerPixel->hasExternalCache();
158 if (!hasExternalCache) {
159 dataItemsPixel = std::make_unique<DataPool<PixelSpacePoint>>(ctx);
160 dataItemsPixel->reserve(5000); // Some large default size
161 } else if (m_useDataPoolWithCache) {
162 dataItemsPixel = std::make_unique<DataPool<PixelSpacePoint>>(ctx);
163 // Default size for now 1024 let it expand on its own
164 }
165 }
166
167 SG::WriteHandle<SpacePointContainer> spacePointContainer_SCT;
168 std::unique_ptr<DataPool<SCT_SpacePoint>> dataItemsSCT = nullptr;
169 if (m_selectSCTs){
171 if(m_SpacePointCache_SCTKey.key().empty()){
172 ATH_CHECK( spacePointContainer_SCT.record( std::make_unique<SpacePointContainer>(m_idHelper->wafer_hash_max()) ) );
173 ATH_MSG_DEBUG("Created SpacePointContainer " << m_SpacePointContainer_SCTKey.key() << " N= " << m_idHelper->wafer_hash_max());
174 }else{
176 ATH_CHECK(updateH.isValid());
177 ATH_CHECK( spacePointContainer_SCT.record( std::make_unique<SpacePointContainer>(updateH.ptr()) ) );
178 ATH_MSG_DEBUG("Created SpacePointContainer " << m_SpacePointContainer_SCTKey.key() << " from cache " << m_SpacePointCache_SCTKey.key());
179 }
180 const bool hasExternalCache = spacePointContainer_SCT->hasExternalCache();
181 if (!hasExternalCache) {
182 dataItemsSCT = std::make_unique<DataPool<SCT_SpacePoint>>(ctx);
183 dataItemsSCT->reserve(10000); // Some large default size
184 } else if (m_useDataPoolWithCache) {
185 dataItemsSCT = std::make_unique<DataPool<SCT_SpacePoint>>(ctx);
186 // Default size for now 1024 let it expand on its own
187 }
188 }
189
190 SG::WriteHandle<SpacePointOverlapCollection> spacepointoverlapCollection;
191 if(m_overlap){
193 ATH_CHECK( spacepointoverlapCollection.record( std::make_unique<SpacePointOverlapCollection>() ) );
194 if (dataItemsSCT) {
195 // if we have a DataPool it will own the elements
196 spacepointoverlapCollection.ptr()->clear(SG::VIEW_ELEMENTS);
197 }
198 ATH_MSG_DEBUG( "Container '" << spacepointoverlapCollection.name() << "' initialised" );
199 }
200
201 int sctCacheCount = 0;
202 int pixCacheCount = 0;
203
204 if (m_selectSCTs){
205 // retrieve SCT cluster container
207 if (!sct_clcontainer.isValid()){
208 msg(MSG:: FATAL) << "Could not find the data object "<< sct_clcontainer.name() << " !" << endmsg;
209 return StatusCode::RECOVERABLE;
210 }
211
212 r_cache.SCTCContainer = sct_clcontainer.cptr();
213
214 ATH_MSG_DEBUG( "SCT Cluster container found: " << sct_clcontainer->size() << " collections" );
215 // Get hold of all clusters and iterate through them.
216 // Pixel clusters will be converted immediately to pixel space points.
217 // For SCT clusters, posssible pairs will be found and space points computed.
218 // It is possible, though unlikely, that there are no clusters for the
219 // event. Therefore we do not terminate the job if we don't find any.
220 SCT_ClusterContainer::const_iterator it = sct_clcontainer->begin();
221 SCT_ClusterContainer::const_iterator itend = sct_clcontainer->end();
222
223 for (; it != itend; ++it){
224 const SCT_ClusterCollection *colNext=&(**it);
225
226 // Create SpacePointCollection
227 IdentifierHash idHash = colNext->identifyHash();
228 SpacePointContainer::IDC_WriteHandle lock = spacePointContainer_SCT->getWriteHandle(idHash);
230 ATH_MSG_DEBUG("SCT Hash " << idHash << " is already in cache");
231 ++sctCacheCount;
232 continue; //Skip if already present in cache
233 }
234
235 Identifier elementID = colNext->identify();
236 auto spacepointCollection = std::make_unique<SpacePointCollection>(idHash);
237 spacepointCollection->setIdentifier(elementID);
238 if(dataItemsSCT){
239 //if we have a DataPool it will own the elements
240 spacepointCollection->clear(SG::VIEW_ELEMENTS);
241 }
242
243 if(!colNext->empty() && !elements->getDetectorElement(colNext->identifyHash())->isStereo()) {
245 colNext, properties, elements, spacepointCollection.get(),
246 spacepointoverlapCollection.ptr(), r_cache, dataItemsSCT.get());
247 } else {
248 ATH_MSG_DEBUG( "Empty SCT cluster collection" );
249 }
250
251 size_t size = spacepointCollection->size();
252 if (size == 0){
253 ATH_MSG_VERBOSE( "SiTrackerSpacePointFinder algorithm found no space points" );
254 } else {
255 //In a MT environment the cache maybe filled by another thread in which case this will delete the duplicate
256 StatusCode sc= lock.addOrDelete( std::move(spacepointCollection) );
257 if (sc.isFailure()){
258 ATH_MSG_ERROR( "Failed to add SpacePoints to container" );
259 return StatusCode::RECOVERABLE;
260 }
261 ATH_MSG_VERBOSE( size << " SpacePoints successfully added to Container !" );
262 nReceivedSPsSCT += size;
263 m_nspacePoints += size;
264 }
265 }
266 m_numberOfSCT+= sct_clcontainer->size();
267 }
268
269 if (m_selectPixels)
270 {
271
273 if (!pixel_clcontainer.isValid()){
274 msg(MSG:: FATAL) << "Could not find the data object "<< pixel_clcontainer.name() << " !" << endmsg;
275 return StatusCode::RECOVERABLE;
276 }
277
278 ATH_MSG_DEBUG( "Data object " << pixel_clcontainer.name() << " found" );
279
280 // loop over Pixel clusterCollections
281 PixelClusterContainer::const_iterator colNext = pixel_clcontainer->begin();
282 PixelClusterContainer::const_iterator lastCol = pixel_clcontainer->end();
283
284
285 int numColl=0;
286 for (; colNext != lastCol; ++colNext)
287 {
288 ATH_MSG_VERBOSE( "Collection num " << numColl++ );
289 IdentifierHash idHash = (*colNext)->identifyHash();
290 SpacePointContainer::IDC_WriteHandle lock = spacePointContainerPixel->getWriteHandle(idHash);
292 ATH_MSG_DEBUG("pixel Hash " << idHash << " is already in cache");
293 ++pixCacheCount;
294 continue;
295 }
296 // Create SpacePointCollection
297 Identifier elementID = (*colNext)->identify();
298 auto spacepointCollection = std::make_unique< SpacePointCollection >(idHash);
299 spacepointCollection->setIdentifier(elementID);
300 if(dataItemsPixel){
301 //if we have a DataPool it will own the elements
302 spacepointCollection->clear(SG::VIEW_ELEMENTS);
303 }
304
305 if (!(*colNext)->empty())
306 {
307 m_SiSpacePointMakerTool->fillPixelSpacePointCollection(
308 *colNext, spacepointCollection.get(), dataItemsPixel.get());
309 } else {
310 ATH_MSG_DEBUG( "Empty pixel cluster collection" );
311 }
312 size_t size = spacepointCollection->size();
313 if (size == 0)
314 {
315 ATH_MSG_DEBUG( "SiTrackerSpacePointFinder algorithm found no space points" );
316 }
317 else
318 {
319 StatusCode sc = lock.addOrDelete( std::move(spacepointCollection) );
320 if (sc.isFailure())
321 {
322 ATH_MSG_ERROR( "Failed to add SpacePoints to container" );
323 return StatusCode::RECOVERABLE;
324 }
325 ATH_MSG_VERBOSE( size
326 << " SpacePoints successfully added to Container !" );
327 nReceivedSPsPIX += size;
328 m_nspacePoints += size;
329 }
330 }
331 m_numberOfPixel+= pixel_clcontainer->size();
332 }
333
334 // store the overlap space points.
335 // check that the set isn't empty.
336 if(m_overlap){
337 if (spacepointoverlapCollection->empty())
338 {
339 ATH_MSG_DEBUG( "No overlap space points found" );
340 }
341 else
342 {
343 ATH_MSG_DEBUG( spacepointoverlapCollection->size() <<" overlap space points registered." );
344 m_nspacePointsOverlap += spacepointoverlapCollection->size();
345 }
346 }
347
348 if(m_cachemode)//Prevent unnecessary atomic counting
349 {
350 m_sctCacheHits += sctCacheCount;
351 m_pixCacheHits += pixCacheCount;
352 }
353
354 return StatusCode::SUCCESS;
355
356}
357
358//---------------------------------------------------------------------------
360{
361 ATH_MSG_DEBUG( m_numberOfEvents << " events processed" );
362 ATH_MSG_DEBUG( m_numberOfPixel << " pixel collections processed" );
363 ATH_MSG_DEBUG( m_numberOfSCT << " sct collections processed" );
364 ATH_MSG_DEBUG( m_nspacePoints+m_nspacePointsOverlap << " space points made, including "<<
365 m_nspacePointsOverlap << " overlap space points" );
366
367 if(m_cachemode){
368 //These are debug messages because they can be indeterminate in an MT environment and it could
369 //lead to confusing log comparisons.
370 ATH_MSG_DEBUG( m_sctCacheHits << " sct cache hits" );
371 ATH_MSG_DEBUG( m_pixCacheHits << " pix cache hits" );
372 }
373 return StatusCode::SUCCESS;
374}
375
376//--------------------------------------------------------------------------
377
378void SiTrackerSpacePointFinder::addSCT_SpacePoints(const SCT_ClusterCollection* sctClusters,
379 const SiElementPropertiesTable* properties,
381 SpacePointCollection* spacepointCollection,
382 SpacePointOverlapCollection* spacepointOverlapCollection,
383 SPFCache &r_cache,
384 DataPool<SCT_SpacePoint>* dataItemsSCT) const
385{
386 // For each trigger element, first evaluate and collect the quantities you need to build the space points.
387 // The detector element array has capacity 6:
388 // [0] is the trigger element
389 // [1] is the opposite element
390 // [2]-[3] are the elements tested for eta overlaps
391 // [4]-[5] are the elements tested for phi overlaps
392 // For each element you save the corresponding cluster collections and the
393 // space point compatibility range as described below.
394 //
395 // For the opposite element and the ones tested for eta overlaps, you have to check
396 // if clusters are compatible with the local position of the trigger cluster
397 // requiring that the distance between the two clusters in phi is withing a specified range.
398 // - For the clusters on the opposite element: [-m_overlapLimitOpposite, m_overlapLimitOpposite]
399 //
400 // - For the eta overlapping clusters : you use m_overlapLimitEtaMin and m_overlapLimitEtaMax
401 // in different combination depending if you are checking a stereo module or not
402 //
403 // For each element, the extremes of these ranges are saved in the overlapExtents array
404 // which is later on used in SiSpacePointMakerTool::fillSCT_SpacePointCollection
405 // - overlapExtents[0], overlapExtents[1] are filled for the opposite element
406 // - overlapExtents[2], overlapExtents[3], overlapExtents[4], overlapExtents[5] are filled for the eta overlapping elements
407 //
408 // For the elements tested for phi overlaps, you have to check
409 // if clusters are compatible with the local position of the trigger cluster.
410 // This needs that the trigger cluster is at the edge of the trigger module:
411 // e.g. -hwidth < locX_trigger < -hwidth+m_overlapLimitPhi (or hwidth-m_overlapLimitPhi < locX_trigger < hwidth)
412 // and that the other cluster is on the compatible edge of its module:
413 // e.g. hwidth-m_overlapLimitPhi < locX_other < hwidth (or -hwidth < locX_other < -hwidth+m_overlapLimitPhi)
414 //
415 // For each element, the extremes of these ranges are saved in the overlapExtents array
416 // which is later on used in SiSpacePointMakerTool::fillSCT_SpacePointCollection
417 // - overlapExtents[6], overlapExtents[7], overlapExtents[10], overlapExtents[11]
418 // overlapExtents[8], overlapExtents[9], overlapExtents[12], overlapExtents[13] are filled for the phi overlapping elements
419
420 enum NeighbourIndices{ThisOne, Opposite, PhiMinus, PhiPlus, EtaMinus, EtaPlus, nNeighbours};
421
422 std::array<const SCT_ClusterCollection*, nNeighbours> neighbourClusters{};
423 std::array<const InDetDD::SiDetectorElement*, nNeighbours> neighbourElements{};
424 std::array<double, 14> overlapExtents{};
425
426 // Get the detector element (and its Identifier) correspoding to the cluster collection
427 IdentifierHash triggerIdHash(sctClusters->identifyHash());
428 const InDetDD::SiDetectorElement *triggerElement = elements->getDetectorElement(triggerIdHash);
429 Identifier thisID = triggerElement->identify();
430
431 // Retrieve the neighbours of the detector element
432 const std::vector<IdentifierHash>* others(properties->neighbours(triggerIdHash));
433 if (others==nullptr || others->empty() ) return;
434
435 // Save the current detector element and clusters
436 neighbourElements[0] = triggerElement;
437 neighbourClusters[0] = sctClusters;
438 int n = 0 ;
439
440 // Default case: you test the opposite element and the overlapping in phi (total 3 elements)
441 int Nmax = 4 ;
442
443 // In the barrel, test the eta overlaps as well (total 5 elements)
444 // or also in the endcaps if we specifically request it
445 if (m_idHelper->is_barrel(thisID) || m_doEndcapEtaOverlapSP) Nmax = 6;
446
447 // You can remove all the overlaps if requrested. Here you test only the opposite element
448 if(!m_overlap) Nmax = 2;
449
450 float hwidth(properties->halfWidth(triggerIdHash));
451
452 // This flag is use to trigger if the search should be performed.
453 // In case there are no other detector elements and/or cluster collection
454 // this flag stays false.
455 bool search = false;
456
457 // The order of the elements in others is such that you first get the opposite element,
458 // the overlapping in phi and then the overlapping in eta
459 // For this reason you need to re-order the indices, since the SiSpacePointMakerTool will process
460 // first the eta overlaps and then the phi ones
461 const std::array<size_t, nNeighbours> neigbourIndices{ThisOne, Opposite, EtaMinus, EtaPlus, PhiMinus, PhiPlus};
462
463 for (const auto& otherHash : *others) {
464
465 if(++n==Nmax) break;
466 const SCT_ClusterCollection* otherClusters = r_cache.SCTCContainer->indexFindPtr (otherHash);
467 const InDetDD::SiDetectorElement* otherElement = elements ->getDetectorElement(otherHash);
468
469 if(!otherElement || !otherClusters) continue;
470
471 neighbourElements[neigbourIndices[n]] = otherElement;
472 neighbourClusters[neigbourIndices[n]] = otherClusters;
473 search = true ;
474
475 switch (n) {
476 case Opposite: {
477 overlapExtents[ 0] = -m_overlapLimitOpposite;
478 overlapExtents[ 1] = m_overlapLimitOpposite;
479 break;
480 }
481 case PhiMinus: {
482 overlapExtents[ 6] =-hwidth;
483 overlapExtents[ 7] =-hwidth+m_overlapLimitPhi;
484 overlapExtents[ 8] = hwidth-m_overlapLimitPhi;
485 overlapExtents[ 9] = hwidth;
486 break;
487 }
488 case PhiPlus: {
489 overlapExtents[10] = hwidth-m_overlapLimitPhi;
490 overlapExtents[11] = hwidth;
491 overlapExtents[12] =-hwidth;
492 overlapExtents[13] =-hwidth+m_overlapLimitPhi;
493 break;
494 }
495 case EtaMinus: {
496 overlapExtents[ 2] = m_overlapLimitEtaMin;
497 overlapExtents[ 3] = m_overlapLimitEtaMax;
498 if (m_useSCTLayerDep_OverlapCuts && (m_idHelper->layer_disk(thisID) & 1) != 0) {
499 overlapExtents[ 2] =-m_overlapLimitEtaMax;
500 overlapExtents[ 3] =-m_overlapLimitEtaMin;
501 }
502 break;
503 }
504 default: {
505 overlapExtents[ 4] = m_overlapLimitEtaMin;
506 overlapExtents[ 5] = m_overlapLimitEtaMax;
507 if (m_useSCTLayerDep_OverlapCuts && (m_idHelper->layer_disk(thisID) & 1) == 0) {
508 overlapExtents[ 4] = -m_overlapLimitEtaMax;
509 overlapExtents[ 5] = -m_overlapLimitEtaMin;
510 }
511 break;
512 }
513 }
514 }
515
516 if (search) {
517 m_SiSpacePointMakerTool->fillSCT_SpacePointCollection(
518 neighbourElements, neighbourClusters, overlapExtents, m_allClusters,
519 r_cache.vertex, spacepointCollection, spacepointOverlapCollection,
520 dataItemsSCT);
521 }
522}
523
524} //namespace
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
#define CHECK(...)
Evaluate an expression and check for errors.
static Double_t sc
Header file to be included by clients of the Monitored infrastructure.
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
const ServiceHandle< StoreGateSvc > & detStore() const
Base class for conditions algorithms.
a typed memory pool that saves time spent allocation small object.
Definition DataPool.h:63
const T * get(size_type n) const
Access an element, as an rvalue.
bool OnlineAndPresentInAnotherView()
This method is to avoid calling an expensive operation in the offline case.
StatusCode addOrDelete(std::unique_ptr< T > ptr)
This is a "hash" representation of an Identifier.
Class to hold the SiDetectorElement objects to be put in the detector store.
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Class to hold geometrical description of a silicon detector element.
bool isStereo() const
Check if it is the stereo side (useful for SCT)
virtual Identifier identify() const override final
identifier of this detector element (inline)
virtual StatusCode initialize() override
SG::WriteHandleKey< SpacePointContainer > m_SpacePointContainer_SCTKey
virtual StatusCode execute(const EventContext &ctx) const override
SG::UpdateHandleKey< SpacePointCache > m_SpacePointCache_PixKey
SG::ReadHandleKey< PixelClusterContainer > m_Pixel_clcontainerKey
SG::WriteHandleKey< SpacePointOverlapCollection > m_spacepointoverlapCollectionKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
For SCT alignment.
bool m_cachemode
used for online MT counters
ToolHandle< GenericMonitoringTool > m_monTool
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
For beam spot.
SG::WriteHandleKey< SpacePointContainer > m_SpacePointContainerPixelKey
SG::ReadCondHandleKey< InDet::SiElementPropertiesTable > m_SCTPropertiesKey
To get SCT neighbours.
SG::ReadHandleKey< SCT_ClusterContainer > m_Sct_clcontainerKey
void addSCT_SpacePoints(const SCT_ClusterCollection *next, const SiElementPropertiesTable *properties, const InDetDD::SiDetectorElementCollection *elements, SpacePointCollection *spacepointCollection, SpacePointOverlapCollection *spacepointOverlapCollection, SPFCache &, DataPool< SCT_SpacePoint > *dataItemsSCT) const
ToolHandle< SiSpacePointMakerTool > m_SiSpacePointMakerTool
SG::UpdateHandleKey< SpacePointCache > m_SpacePointCache_SCTKey
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
const_pointer_type retrieve()
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
pointer_type ptr()
Dereference the pointer.
const std::string & name() const
Return the StoreGate ID for the referenced object.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
void search(TDirectory *td, const std::string &s, std::string cwd, node *n)
recursive directory search for TH1 and TH2 and TProfiles
Definition hcg.cxx:739
Eigen::Matrix< double, 3, 1 > Vector3D
Primary Vertex Finder.
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
This is a temporary object to aid reentrant coding.