ATLAS Offline Software
Loading...
Searching...
No Matches
TrigInDetAccelerationSvc.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
7
12
19#include "GaudiKernel/ConcurrencyFlags.h"
20
21#include <dlfcn.h>
22
26
27TrigInDetAccelerationSvc::TrigInDetAccelerationSvc( const std::string& name, ISvcLocator* pSvcLocator) :
28 base_class( name, pSvcLocator ),
29 m_nDCs(12),
30 m_moduleName("libTrigInDetCUDA.so"),
31 m_useITkGeometry(false),
32 m_libHandle(0),
33 m_pWF(0),
34 m_module(0),
35 m_detStore("DetectorStore", name),
36 m_evtStore("StoreGateSvc",name),
37 m_factoryConfigured(false) {
38
39 declareProperty( "NumberOfDCs", m_nDCs = 8 );
40 declareProperty( "ModuleName", m_moduleName = "libTrigInDetCUDA.so");
41 declareProperty( "useITkGeometry", m_useITkGeometry = false);
42 declareProperty( "MiddleSpacePointLayers", m_middleSpacePointLayers = std::vector<int>(), "Global IDs of layers that can contain middle spacepoints of track seeds" );
43}
44
45
49
51
52 ATH_MSG_INFO("TrigInDetAccelerationSvc: initialize");
53
54 ATH_CHECK (m_evtStore.retrieve() );
55 ATH_CHECK (m_detStore.retrieve() );
56
57 //load the OffloadFactory library
58
59 m_libHandle = dlopen(m_moduleName.c_str(), RTLD_LAZY);
60
61 if(!m_libHandle) {
62 ATH_MSG_INFO("TrigInDetAccelerationSvc: cannot load the factory library, error:"<<dlerror());
63 return StatusCode::SUCCESS;
64 }
65
66 dlerror();
67
68 //declare library interface methods
69 TrigAccel::Module* (*getModule)();
70
71 getModule = (TrigAccel::Module* (*)()) dlsym(m_libHandle, "getModule");
72
74
75 int factory_id_to_load = 0;
76
78 factory_id_to_load = TrigAccel::TrigITkModuleID_CUDA;
79 }else{
80 factory_id_to_load = TrigAccel::TrigInDetModuleID_CUDA;
81 }
82
83 m_pWF = m_module->getFactoryById(factory_id_to_load);
84
85 if(m_pWF == nullptr){
86 ATH_MSG_INFO("OffloadFactory with id "<<std::hex<<factory_id_to_load<<" not available from the module");
87 m_factoryConfigured = false;
88 return StatusCode::SUCCESS;
89 }
90
91 bool cfgResult = m_pWF->configure();
92
93 if(!cfgResult) {
94 ATH_MSG_INFO("OffloadFactory config failed");
95 m_factoryConfigured = false;
96 return StatusCode::SUCCESS;
97 }
98
100
101 for(int i=0;i<3;i++) m_layerInfo[i].clear();
102
103 ATH_MSG_INFO("TrigInDetAccelerationSvc: created OffloadFactory, factory id = "<<std::hex<<m_pWF->getFactoryId()<<std::dec);
104
105 /*
106 * Ask to be informed at the beginning of a new run so that we
107 * can collect geometry, conditions, etc. and copy them to on-GPU data structures
108 * For athenaHLT this should be UpdateAfterFork
109 */
110
111 SmartIF<IIncidentSvc> incsvc{service("IncidentSvc")};
112 const int priority = 100;
113 if( incsvc ) {
114 const bool is_multiprocess = (Gaudi::Concurrency::ConcurrencyFlags::numProcs() > 0);
115 if (is_multiprocess) {
116 incsvc->addListener( this, AthenaInterprocess::UpdateAfterFork::type(), priority);
117 }
118 else {
119 incsvc->addListener( this, "BeginRun", priority);
120 }
121 }
122
123 return StatusCode::SUCCESS;
124}
125
130
131 delete m_pWF;
132
133 dlclose(m_libHandle);
134
135 return StatusCode::SUCCESS;
136}
137
138
142
143void TrigInDetAccelerationSvc::handle(const Incident&) {
144
145 ATH_MSG_INFO("OnBeginRun ");
146
147 if (m_useITkGeometry) {
148 // barrel ec, subdetector id, itk volume id, itk layer disk id
149 std::map<std::tuple<short,short, int, int>,std::vector<PhiEtaHash> > hashMap;
150 if(!extractITkGeometryInformation(hashMap)) {
151 ATH_MSG_INFO("ITk Geometry extraction failed");
152 return;
153 }
154
155 if(!exportITkGeometryInformation(hashMap)) {
156 ATH_MSG_INFO("ITk Geometry export failed");
157 }
158
159 } else {
160 // subdetector id, barrel ec, layer disk
161 std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> > hashMap;
162
163 if(!extractGeometryInformation(hashMap)) {
164 ATH_MSG_INFO("Geometry extraction failed");
165 return;
166 }
167
168 if(!exportGeometryInformation(hashMap)) {
169 ATH_MSG_INFO("Geometry export failed");
170 }
171
172 }
173
174 return;
175}
176
177TrigAccel::Work* TrigInDetAccelerationSvc::createWork(unsigned int jobCode, std::shared_ptr<TrigAccel::OffloadBuffer> pB) const {
178
179 if(!m_factoryConfigured) return 0;
180
181 // To remove this, WorkFactory::createWork() should be made const
182 // (and thread-safe).
183 std::scoped_lock lock (m_workMutex);
185 return wf->createWork(jobCode, pB);
186
187}
188
189
190const std::vector<short>& TrigInDetAccelerationSvc::getLayerInformation(int i) const {
191 if (i<0 || i>2) i = 0;
192 return m_layerInfo[i];
193}
194
195bool TrigInDetAccelerationSvc::exportITkGeometryInformation(const std::map<std::tuple<short,short, int, int>,std::vector<PhiEtaHash> >& hashMap) const {
196
197 const InDetDD::PixelDetectorManager * pix_mgr = nullptr;
198
199 if (m_detStore->retrieve(pix_mgr,"ITkPixel").isFailure()) {
200 ATH_MSG_WARNING("failed to get ITkPixel Manager");
201 return false;
202 }
203
204 //export layer structure
205
206 size_t dataTypeSize = sizeof(TrigAccel::ITk::DETECTOR_MODEL);
207 const size_t bufferOffset = 256;
208 size_t totalSize = bufferOffset + dataTypeSize;
209
211
212 if(!pBG->fit(totalSize)) pBG->reallocate(totalSize);
213
214 TrigAccel::ITk::DETECTOR_MODEL* pArray = reinterpret_cast<TrigAccel::ITk::DETECTOR_MODEL*>(pBG->m_buffer + bufferOffset);
215
216 // cppcheck-suppress memsetClassFloat; deliberate
217 memset(pArray,0,dataTypeSize);
218
219 int nLayers = (int)hashMap.size();
220 pArray->m_nLayers = nLayers;
221 pArray->m_nModules=0;
222
223 int layerIdx=0;
224 int middleLayerIdx=0;
225
226 for(std::map<std::tuple<short,short, int, int>,std::vector<PhiEtaHash> >::const_iterator it = hashMap.begin();it!=hashMap.end();++it, layerIdx++) {
227
228 short barrel_ec = std::get<0>((*it).first);
229 int vol_id = std::get<2>((*it).first);
230 int lay_id = std::get<3>((*it).first);
231 if(barrel_ec == -100) barrel_ec = 0;
232 int globalLayerId = vol_id*1000 + lay_id;
233
234 pArray->m_layers[layerIdx].m_nElements = 0;
235 pArray->m_layers[layerIdx].m_subdet = globalLayerId;
236 pArray->m_layers[layerIdx].m_type = barrel_ec;
237
238 // Fill in a table of layer ids that can contain the middle SPs
239 if (std::find(m_middleSpacePointLayers.begin(), m_middleSpacePointLayers.end(), globalLayerId) != m_middleSpacePointLayers.end()){
240 pArray->m_middleSpacePointLayers[middleLayerIdx] = layerIdx;
241 ++middleLayerIdx;
242 }
243
244 std::vector<std::vector<PhiEtaHash>::const_iterator> vStops;
245 vStops.push_back((*it).second.begin());
246 std::vector<PhiEtaHash>::const_iterator firstIt = (*it).second.begin();
247 std::vector<PhiEtaHash>::const_iterator nextIt = (*it).second.begin();
248 ++nextIt;
249
250 int nPhiSlices=0;
251
252 for(; nextIt!=(*it).second.end();++nextIt, ++firstIt) {
253 if((*nextIt).m_phiIndex!=(*firstIt).m_phiIndex) {
254 vStops.push_back(nextIt);
255 nPhiSlices++;
256 }
257 }
258
259 nPhiSlices++;
260
261 vStops.push_back((*it).second.end());
262
263 float rc=0.0;
264 float minBound = 100000.0;
265 float maxBound =-100000.0;
266
267 pArray->m_layers[layerIdx].m_nPhiSlices = nPhiSlices;
268
269 //3. iterating over phi sectors
270
271 for(unsigned int iStops = 1; iStops<vStops.size();iStops++) {
272 int nPhiModules = 0;
273 bool first = true;
274
275 for(std::vector<PhiEtaHash>::const_iterator hIt = vStops[iStops-1];hIt!=vStops[iStops];++hIt, nPhiModules++) {
276
277 pArray->m_hashArray[pArray->m_nModules] = (*hIt).m_hash;
278 const InDetDD::SiDetectorElement *p = pix_mgr->getDetectorElement((*hIt).m_hash);
279
280 if (first) {
281 first = false;
282 }
283
284 pArray->m_layers[layerIdx].m_nElements++;
285
286 const Amg::Vector3D& C = p->center();
287 if (barrel_ec == 0) {
288 rc += sqrt(C(0)*C(0)+C(1)*C(1));
289 if(p->zMin() < minBound) minBound = p->zMin();
290 if(p->zMax() > maxBound) maxBound = p->zMax();
291 pArray->m_minRZ[pArray->m_nModules] = p->zMin();
292 pArray->m_maxRZ[pArray->m_nModules] = p->zMax();
293 } else {
294 rc += C(2);
295 if(p->rMin() < minBound) minBound = p->rMin();
296 if(p->rMax() > maxBound) maxBound = p->rMax();
297 pArray->m_minRZ[pArray->m_nModules] = p->rMin();
298 pArray->m_maxRZ[pArray->m_nModules] = p->rMax();
299 }
300
301 pArray->m_nModules++;
302 }
303
304 }
305 pArray->m_layers[layerIdx].m_refCoord = rc/pArray->m_layers[layerIdx].m_nElements;
306 pArray->m_layers[layerIdx].m_minBound = minBound;
307 pArray->m_layers[layerIdx].m_maxBound = maxBound;
308 }
309
310 std::shared_ptr<TrigAccel::OffloadBuffer> pDMBuff = std::make_shared<TrigAccel::OffloadBuffer>(pBG);
311
312 delete pBG;
313
315
317
318 return pW == 0;//request is actioned immediately, no actual WorkItem is created
319
320}
321
322
323bool TrigInDetAccelerationSvc::extractITkGeometryInformation(std::map<std::tuple<short,short,int,int>, std::vector<PhiEtaHash> >& hashMap) {
324
325 const PixelID* pixelId = nullptr;
326
327 if (m_detStore->retrieve(pixelId, "PixelID").isFailure()) {
328 ATH_MSG_WARNING("Could not get Pixel ID helper");
329 return false;
330 }
331
332 // Read Pixel layer details
333 short subdetid = 1;
334 for(int hash = 0; hash<(int)pixelId->wafer_hash_max(); hash++) {
335
336 Identifier offlineId = pixelId->wafer_id(hash);
337
338 if(offlineId==0) continue;
339
340 short barrel_ec = pixelId->barrel_ec(offlineId);
341 if(abs(barrel_ec)>2) continue;//no DBM needed
342
343 short phi_index = pixelId->phi_module(offlineId);
344 short eta_index = pixelId->eta_module(offlineId);
345 short layer_disk = pixelId->layer_disk(offlineId);
346
347 // Calculate new volume and layer id for ITk
348 int vol_id = -1;
349 if (barrel_ec== 0) vol_id = 8;
350 if (barrel_ec==-2) vol_id = 7;
351 if (barrel_ec== 2) vol_id = 9;
352
353 int new_vol=0, new_lay=0;
354
355 if (vol_id == 7 || vol_id == 9) {
356 new_vol = 10*vol_id + layer_disk;
357 new_lay = eta_index;
358 } else if (vol_id == 8) {
359 new_lay = 0;
360 new_vol = 10*vol_id + layer_disk;
361 }
362
363 auto t = std::make_tuple(barrel_ec==0 ? -100 : barrel_ec, subdetid, new_vol, new_lay);
364 std::map<std::tuple<short,short,int,int>,std::vector<PhiEtaHash> >::iterator it = hashMap.find(t);
365 if(it==hashMap.end())
366 hashMap.insert(std::pair<std::tuple<short,short,int,int>,std::vector<PhiEtaHash> >(t,std::vector<PhiEtaHash>(1, PhiEtaHash(phi_index, eta_index, hash) )));
367 else (*it).second.push_back(PhiEtaHash(phi_index, eta_index, hash));
368 }
369
370 m_layerInfo[0].clear();
371 m_layerInfo[1].clear();
372
373 m_layerInfo[0].resize(hashMap.size()); // Mapping from layerId to barrel_ec
374 m_layerInfo[1].resize(pixelId->wafer_hash_max(), -1); // Mapping from layerId to the module hash
375
376 // Map layer geometry details to module hash id
377 int layerId=0;
378 for(std::map<std::tuple<short,short,int,int>,std::vector<PhiEtaHash> >::iterator it = hashMap.begin();it!=hashMap.end();++it, layerId++) {
379
380 short barrel_ec = std::get<0>((*it).first);
381 short subdetId = std::get<1>((*it).first);
382 if(barrel_ec == -100) barrel_ec = 0;
383
384 m_layerInfo[0][layerId] = barrel_ec;
385
386 if(subdetId == 1) {//pixel
387 for(std::vector<PhiEtaHash>::iterator hIt = (*it).second.begin();hIt != (*it).second.end();++hIt) {
388 m_layerInfo[subdetId][(*hIt).m_hash] = layerId;
389 }
390 }
391 }
392
393 for(std::map<std::tuple<short,short,int,int>,std::vector<PhiEtaHash> >::iterator it = hashMap.begin();it!=hashMap.end();++it) {
394
395 //sorting along phi first, then along eta
396 std::sort((*it).second.begin(), (*it).second.end(), PhiEtaHash::compare());
397
398 }
399
400 return true;
401}
402
403
404bool TrigInDetAccelerationSvc::exportGeometryInformation(const std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> >& hashMap) const {
405
406 const InDetDD::SCT_DetectorManager * sct_mgr = nullptr;
407 const InDetDD::PixelDetectorManager * pix_mgr = nullptr;
408
409 if (m_detStore->retrieve(sct_mgr, "SCT").isFailure()) {
410 ATH_MSG_WARNING("failed to get SCT Manager");
411 return false;
412
413 }
414 if (m_detStore->retrieve(pix_mgr,"Pixel").isFailure()) {
415 ATH_MSG_WARNING("failed to get SCT Manager");
416 return false;
417 }
418
419 //export layer structure
420
421 size_t dataTypeSize = sizeof(TrigAccel::DETECTOR_MODEL);
422 const size_t bufferOffset = 256;
423 size_t totalSize = bufferOffset + dataTypeSize;
424
426
427 if(!pBG->fit(totalSize)) pBG->reallocate(totalSize);
428
429 TrigAccel::DETECTOR_MODEL* pArray = reinterpret_cast<TrigAccel::DETECTOR_MODEL*>(pBG->m_buffer + bufferOffset);
430
431 // cppcheck-suppress memsetClassFloat; deliberate
432 memset(pArray,0,dataTypeSize);
433
434 int nLayers = (int)hashMap.size();
435 pArray->m_nLayers = nLayers;
436 pArray->m_nModules=0;
437
438 int layerIdx=0;
439
440 for(std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> >::const_iterator it = hashMap.begin();it!=hashMap.end();++it, layerIdx++) {
441 short subdetid = std::get<0>((*it).first);
442 short barrel_ec = std::get<1>((*it).first);
443
444 pArray->m_layers[layerIdx].m_nElements = 0;
445 pArray->m_layers[layerIdx].m_subdet = subdetid;
446 pArray->m_layers[layerIdx].m_type = barrel_ec;
447
448 std::vector<std::vector<PhiEtaHash>::const_iterator> vStops;
449 vStops.push_back((*it).second.begin());
450 std::vector<PhiEtaHash>::const_iterator firstIt = (*it).second.begin();
451 std::vector<PhiEtaHash>::const_iterator nextIt = (*it).second.begin();
452 ++nextIt;
453
454 int nPhiSlices=0;
455
456 for(; nextIt!=(*it).second.end();++nextIt, ++firstIt) {
457 if((*nextIt).m_phiIndex!=(*firstIt).m_phiIndex) {
458 vStops.push_back(nextIt);
459 nPhiSlices++;
460 }
461 }
462
463 nPhiSlices++;
464
465 vStops.push_back((*it).second.end());
466
467 float rc=0.0;
468 float minBound = 100000.0;
469 float maxBound =-100000.0;
470
471 pArray->m_layers[layerIdx].m_nPhiSlices = nPhiSlices;
472
473 //3. iterating over phi sectors
474
475 for(unsigned int iStops = 1; iStops<vStops.size();iStops++) {
476
477 int nPhiModules = 0;
478
479 bool first = true;
480
481 for(std::vector<PhiEtaHash>::const_iterator hIt = vStops[iStops-1];hIt!=vStops[iStops];++hIt, nPhiModules++) {
482
483 pArray->m_hashArray[pArray->m_nModules] = (*hIt).m_hash;
484
485 const InDetDD::SiDetectorElement *p = (subdetid==1) ? pix_mgr->getDetectorElement((*hIt).m_hash) : sct_mgr->getDetectorElement((*hIt).m_hash);
486
487 if(first) {
488 first = false;
489 }
490
491 pArray->m_layers[layerIdx].m_nElements++;
492
493 const Amg::Vector3D& C = p->center();
494 if(barrel_ec == 0) {
495 rc += sqrt(C(0)*C(0)+C(1)*C(1));
496 if(p->zMin() < minBound) minBound = p->zMin();
497 if(p->zMax() > maxBound) maxBound = p->zMax();
498 pArray->m_minRZ[pArray->m_nModules] = p->zMin();
499 pArray->m_maxRZ[pArray->m_nModules] = p->zMax();
500 }
501 else {
502 rc += C(2);
503 if(p->rMin() < minBound) minBound = p->rMin();
504 if(p->rMax() > maxBound) maxBound = p->rMax();
505 pArray->m_minRZ[pArray->m_nModules] = p->rMin();
506 pArray->m_maxRZ[pArray->m_nModules] = p->rMax();
507 }
508
509 pArray->m_nModules++;
510 }
511
512 }
513 pArray->m_layers[layerIdx].m_refCoord = rc/pArray->m_layers[layerIdx].m_nElements;
514 pArray->m_layers[layerIdx].m_minBound = minBound;
515 pArray->m_layers[layerIdx].m_maxBound = maxBound;
516 }
517
518 std::shared_ptr<TrigAccel::OffloadBuffer> pDMBuff = std::make_shared<TrigAccel::OffloadBuffer>(pBG);
519
520 delete pBG;
521
523
525
526 return pW == 0;//request is actioned immediately, no actual WorkItem is created
527
528}
529
530
531bool TrigInDetAccelerationSvc::extractGeometryInformation(std::map<std::tuple<short,short,short>, std::vector<PhiEtaHash> >& hashMap) {
532
533 const PixelID* pixelId = nullptr;
534 const SCT_ID* sctId = nullptr;
535
536 if (m_detStore->retrieve(pixelId, "PixelID").isFailure()) {
537 ATH_MSG_WARNING("Could not get Pixel ID helper");
538 return false;
539 }
540
541 if (m_detStore->retrieve(sctId, "SCT_ID").isFailure()) {
542 ATH_MSG_WARNING("Could not get Pixel ID helper");
543 return false;
544 }
545
546 short subdetid = 1;
547
548 for(int hash = 0; hash<(int)pixelId->wafer_hash_max(); hash++) {
549
550 Identifier offlineId = pixelId->wafer_id(hash);
551
552 if(offlineId==0) continue;
553
554 short barrel_ec = pixelId->barrel_ec(offlineId);
555 if(abs(barrel_ec)>2) continue;//no DBM needed
556 short layer_disk = pixelId->layer_disk(offlineId);
557 short phi_index = pixelId->phi_module(offlineId);
558 short eta_index = pixelId->eta_module(offlineId);
559 auto t = std::make_tuple(subdetid, barrel_ec, layer_disk);
560 std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> >::iterator it = hashMap.find(t);
561 if(it==hashMap.end())
562 hashMap.insert(std::pair<std::tuple<short,short,short>,std::vector<PhiEtaHash> >(t,std::vector<PhiEtaHash>(1, PhiEtaHash(phi_index, eta_index, hash) )));
563 else (*it).second.push_back(PhiEtaHash(phi_index, eta_index, hash));
564 }
565 subdetid = 2;
566 for(int hash = 0; hash<(int)sctId->wafer_hash_max(); hash++) {
567
568 Identifier offlineId = sctId->wafer_id(hash);
569
570 if(offlineId==0) continue;
571
572 short barrel_ec = sctId->barrel_ec(offlineId);
573 short layer_disk = sctId->layer_disk(offlineId);
574 short phi_index = sctId->phi_module(offlineId);
575 short eta_index = sctId->eta_module(offlineId);
576
577 auto t = std::make_tuple(subdetid, barrel_ec, layer_disk);
578 std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> >::iterator it = hashMap.find(t);
579 if(it==hashMap.end())
580 hashMap.insert(std::pair<std::tuple<short,short,short>,std::vector<PhiEtaHash> >(t,std::vector<PhiEtaHash>(1, PhiEtaHash(phi_index, eta_index, hash))));
581 else (*it).second.push_back(PhiEtaHash(phi_index, eta_index, hash));
582 }
583
584 m_layerInfo[1].resize(pixelId->wafer_hash_max(), -1);
585 m_layerInfo[2].resize(sctId->wafer_hash_max(), -1);
586
587 int layerId=0;
588
589 for(std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> >::iterator it = hashMap.begin();it!=hashMap.end();++it, layerId++) {
590
591 short subdetId = std::get<0>((*it).first);
592 short barrel_ec = std::get<1>((*it).first);
593
594 m_layerInfo[0].push_back(barrel_ec);
595
596 if(subdetId == 1) {//pixel
597 for(std::vector<PhiEtaHash>::iterator hIt = (*it).second.begin();hIt != (*it).second.end();++hIt) {
598 m_layerInfo[subdetId][(*hIt).m_hash] = layerId;
599 }
600 }
601 if(subdetId == 2) {//SCT
602 for(std::vector<PhiEtaHash>::iterator hIt = (*it).second.begin();hIt != (*it).second.end();++hIt) {
603 m_layerInfo[subdetId][(*hIt).m_hash] = layerId;
604 }
605 }
606 }
607
608
609 for(std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> >::iterator it = hashMap.begin();it!=hashMap.end();++it) {
610
611 //sorting along phi first, then along eta
612
613 std::sort((*it).second.begin(), (*it).second.end(), PhiEtaHash::compare());
614
615 }
616 return true;
617}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
static Double_t rc
static unsigned int totalSize(const MultiDimArray< T, N > &ht)
This is an Identifier helper class for the Pixel subdetector.
bool getModule(std::istream &s, RegSelModule &m)
This is an Identifier helper class for the SCT subdetector.
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
static const std::string & type()
Incident type.
Definition Incidents.h:49
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated pixel ...
virtual const SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements : via Identifier
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT in...
virtual const SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements via Identifier
Class to hold geometrical description of a silicon detector element.
This is an Identifier helper class for the Pixel subdetector.
Definition PixelID.h:67
int layer_disk(const Identifier &id) const
Definition PixelID.h:607
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition PixelID.h:360
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition PixelID.h:600
size_type wafer_hash_max() const
Definition PixelID.cxx:801
int eta_module(const Identifier &id) const
Definition PixelID.h:632
int phi_module(const Identifier &id) const
Definition PixelID.h:625
This is an Identifier helper class for the SCT subdetector.
Definition SCT_ID.h:68
size_type wafer_hash_max() const
Definition SCT_ID.cxx:621
int layer_disk(const Identifier &id) const
Definition SCT_ID.h:687
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side) const
For a single side of module.
Definition SCT_ID.h:459
int phi_module(const Identifier &id) const
Definition SCT_ID.h:693
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition SCT_ID.h:681
int eta_module(const Identifier &id) const
Definition SCT_ID.h:699
virtual void handle(const Incident &) override
OnBeginRun data gathering and export.
ServiceHandle< StoreGateSvc > m_evtStore
virtual const std::vector< short > & getLayerInformation(int) const override
ServiceHandle< StoreGateSvc > m_detStore
virtual StatusCode initialize() override
Initialize.
bool exportITkGeometryInformation(const std::map< std::tuple< short, short, int, int >, std::vector< PhiEtaHash > > &hashMap) const
bool exportGeometryInformation(const std::map< std::tuple< short, short, short >, std::vector< PhiEtaHash > > &) const
std::vector< short > m_layerInfo[3]
virtual StatusCode finalize() override
Finalize.
virtual TrigAccel::Work * createWork(unsigned int, std::shared_ptr< TrigAccel::OffloadBuffer >) const override
bool extractITkGeometryInformation(std::map< std::tuple< short, short, int, int >, std::vector< PhiEtaHash > > &)
TrigInDetAccelerationSvc(const std::string &, ISvcLocator *)
Constructor.
std::vector< int > m_middleSpacePointLayers
TrigAccel::WorkFactory * m_pWF
bool extractGeometryInformation(std::map< std::tuple< short, short, short >, std::vector< PhiEtaHash > > &)
struct color C
Eigen::Matrix< double, 3, 1 > Vector3D
struct TrigAccel::ITk::DetectorModel DETECTOR_MODEL
struct TrigAccel::DataExportBuffer DATA_EXPORT_BUFFER
constexpr unsigned int TrigITkModuleID_CUDA
constexpr unsigned int TrigInDetModuleID_CUDA
struct TrigAccel::DetectorModel DETECTOR_MODEL
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
SILICON_LAYER m_layers[MAX_SILICON_LAYERS]
float m_minRZ[MAX_NUMBER_PIX_MODULES+MAX_NUMBER_SCT_MODULES]
float m_maxRZ[MAX_NUMBER_PIX_MODULES+MAX_NUMBER_SCT_MODULES]
int m_hashArray[MAX_NUMBER_PIX_MODULES+MAX_NUMBER_SCT_MODULES]
int m_hashArray[MAX_NUMBER_PIX_MODULES+MAX_NUMBER_SCT_MODULES]
int m_middleSpacePointLayers[MAX_SILICON_LAYERS]
float m_minRZ[MAX_NUMBER_PIX_MODULES+MAX_NUMBER_SCT_MODULES]
SILICON_LAYER m_layers[MAX_SILICON_LAYERS]
float m_maxRZ[MAX_NUMBER_PIX_MODULES+MAX_NUMBER_SCT_MODULES]