ATLAS Offline Software
Loading...
Searching...
No Matches
TrigInDetAccelerationSvc Class Reference

Service for creating GPU-accelerated Work items for HLT ID algorithms. More...

#include <TrigInDetAccelerationSvc.h>

Inheritance diagram for TrigInDetAccelerationSvc:
Collaboration diagram for TrigInDetAccelerationSvc:

Classes

struct  PhiEtaHash

Public Member Functions

 TrigInDetAccelerationSvc (const std::string &, ISvcLocator *)
 Constructor.
virtual ~TrigInDetAccelerationSvc () override
virtual StatusCode initialize () override
 Initialize.
virtual StatusCode finalize () override
 Finalize.
virtual void handle (const Incident &) override
 OnBeginRun data gathering and export.
virtual bool isReady () const override
virtual TrigAccel::WorkcreateWork (unsigned int, std::shared_ptr< TrigAccel::OffloadBuffer >) const override
virtual const std::vector< short > & getLayerInformation (int) const override
virtual size_t getMiddleLayersSize () const override

Private Member Functions

bool exportGeometryInformation (const std::map< std::tuple< short, short, short >, std::vector< PhiEtaHash > > &) const
bool extractGeometryInformation (std::map< std::tuple< short, short, short >, std::vector< PhiEtaHash > > &)
bool extractITkGeometryInformation (std::map< std::tuple< short, short, int, int >, std::vector< PhiEtaHash > > &)
bool exportITkGeometryInformation (const std::map< std::tuple< short, short, int, int >, std::vector< PhiEtaHash > > &hashMap) const

Private Attributes

int m_nDCs
std::string m_moduleName
bool m_useITkGeometry
std::vector< int > m_middleSpacePointLayers
void * m_libHandle
TrigAccel::WorkFactorym_pWF
TrigAccel::Modulem_module
ServiceHandle< StoreGateSvcm_detStore
ServiceHandle< StoreGateSvcm_evtStore
bool m_factoryConfigured
std::vector< short > m_layerInfo [3]
std::mutex m_workMutex

Detailed Description

Service for creating GPU-accelerated Work items for HLT ID algorithms.

Definition at line 29 of file TrigInDetAccelerationSvc.h.

Constructor & Destructor Documentation

◆ TrigInDetAccelerationSvc()

TrigInDetAccelerationSvc::TrigInDetAccelerationSvc ( const std::string & name,
ISvcLocator * pSvcLocator )

Constructor.

Definition at line 27 of file TrigInDetAccelerationSvc.cxx.

27 :
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}
ServiceHandle< StoreGateSvc > m_evtStore
ServiceHandle< StoreGateSvc > m_detStore
std::vector< int > m_middleSpacePointLayers
TrigAccel::WorkFactory * m_pWF

◆ ~TrigInDetAccelerationSvc()

virtual TrigInDetAccelerationSvc::~TrigInDetAccelerationSvc ( )
inlineoverridevirtual

Definition at line 35 of file TrigInDetAccelerationSvc.h.

35{};

Member Function Documentation

◆ createWork()

TrigAccel::Work * TrigInDetAccelerationSvc::createWork ( unsigned int jobCode,
std::shared_ptr< TrigAccel::OffloadBuffer > pB ) const
overridevirtual

Definition at line 177 of file TrigInDetAccelerationSvc.cxx.

177 {
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);
184 TrigAccel::WorkFactory* wf ATLAS_THREAD_SAFE = m_pWF;
185 return wf->createWork(jobCode, pB);
186
187}
#define ATLAS_THREAD_SAFE

◆ exportGeometryInformation()

bool TrigInDetAccelerationSvc::exportGeometryInformation ( const std::map< std::tuple< short, short, short >, std::vector< PhiEtaHash > > & hashMap) const
private

Definition at line 404 of file TrigInDetAccelerationSvc.cxx.

404 {
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}
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
virtual const SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements : via Identifier
virtual const SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements via Identifier
virtual TrigAccel::Work * createWork(unsigned int, std::shared_ptr< TrigAccel::OffloadBuffer >) const override
struct color C
Eigen::Matrix< double, 3, 1 > Vector3D
bool first
Definition DeMoScan.py:534
struct TrigAccel::DataExportBuffer DATA_EXPORT_BUFFER
struct TrigAccel::DetectorModel DETECTOR_MODEL
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]

◆ exportITkGeometryInformation()

bool TrigInDetAccelerationSvc::exportITkGeometryInformation ( const std::map< std::tuple< short, short, int, int >, std::vector< PhiEtaHash > > & hashMap) const
private

Definition at line 195 of file TrigInDetAccelerationSvc.cxx.

195 {
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}
struct TrigAccel::ITk::DetectorModel DETECTOR_MODEL
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]

◆ extractGeometryInformation()

bool TrigInDetAccelerationSvc::extractGeometryInformation ( std::map< std::tuple< short, short, short >, std::vector< PhiEtaHash > > & hashMap)
private

Definition at line 531 of file TrigInDetAccelerationSvc.cxx.

531 {
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}
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
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
std::vector< short > m_layerInfo[3]
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.

◆ extractITkGeometryInformation()

bool TrigInDetAccelerationSvc::extractITkGeometryInformation ( std::map< std::tuple< short, short, int, int >, std::vector< PhiEtaHash > > & hashMap)
private

Definition at line 323 of file TrigInDetAccelerationSvc.cxx.

323 {
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}

◆ finalize()

StatusCode TrigInDetAccelerationSvc::finalize ( )
overridevirtual

Finalize.

Definition at line 129 of file TrigInDetAccelerationSvc.cxx.

129 {
130
131 delete m_pWF;
132
133 dlclose(m_libHandle);
134
135 return StatusCode::SUCCESS;
136}

◆ getLayerInformation()

const std::vector< short > & TrigInDetAccelerationSvc::getLayerInformation ( int i) const
overridevirtual

Definition at line 190 of file TrigInDetAccelerationSvc.cxx.

190 {
191 if (i<0 || i>2) i = 0;
192 return m_layerInfo[i];
193}

◆ getMiddleLayersSize()

virtual size_t TrigInDetAccelerationSvc::getMiddleLayersSize ( ) const
inlineoverridevirtual

Definition at line 47 of file TrigInDetAccelerationSvc.h.

47{return m_middleSpacePointLayers.size();};

◆ handle()

void TrigInDetAccelerationSvc::handle ( const Incident & )
overridevirtual

OnBeginRun data gathering and export.

Definition at line 143 of file TrigInDetAccelerationSvc.cxx.

143 {
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}
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
bool extractITkGeometryInformation(std::map< std::tuple< short, short, int, int >, std::vector< PhiEtaHash > > &)
bool extractGeometryInformation(std::map< std::tuple< short, short, short >, std::vector< PhiEtaHash > > &)

◆ initialize()

StatusCode TrigInDetAccelerationSvc::initialize ( )
overridevirtual

Initialize.

Definition at line 50 of file TrigInDetAccelerationSvc.cxx.

50 {
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}
#define ATH_CHECK
Evaluate an expression and check for errors.
bool getModule(std::istream &s, RegSelModule &m)
static const std::string & type()
Incident type.
Definition Incidents.h:49
constexpr unsigned int TrigITkModuleID_CUDA
constexpr unsigned int TrigInDetModuleID_CUDA

◆ isReady()

virtual bool TrigInDetAccelerationSvc::isReady ( ) const
inlineoverridevirtual

Definition at line 41 of file TrigInDetAccelerationSvc.h.

41 {
43 }

Member Data Documentation

◆ m_detStore

ServiceHandle<StoreGateSvc> TrigInDetAccelerationSvc::m_detStore
private

Definition at line 78 of file TrigInDetAccelerationSvc.h.

◆ m_evtStore

ServiceHandle<StoreGateSvc> TrigInDetAccelerationSvc::m_evtStore
private

Definition at line 79 of file TrigInDetAccelerationSvc.h.

◆ m_factoryConfigured

bool TrigInDetAccelerationSvc::m_factoryConfigured
private

Definition at line 81 of file TrigInDetAccelerationSvc.h.

◆ m_layerInfo

std::vector<short> TrigInDetAccelerationSvc::m_layerInfo[3]
private

Definition at line 91 of file TrigInDetAccelerationSvc.h.

◆ m_libHandle

void* TrigInDetAccelerationSvc::m_libHandle
private

Definition at line 75 of file TrigInDetAccelerationSvc.h.

◆ m_middleSpacePointLayers

std::vector<int> TrigInDetAccelerationSvc::m_middleSpacePointLayers
private

Definition at line 74 of file TrigInDetAccelerationSvc.h.

◆ m_module

TrigAccel::Module* TrigInDetAccelerationSvc::m_module
private

Definition at line 77 of file TrigInDetAccelerationSvc.h.

◆ m_moduleName

std::string TrigInDetAccelerationSvc::m_moduleName
private

Definition at line 72 of file TrigInDetAccelerationSvc.h.

◆ m_nDCs

int TrigInDetAccelerationSvc::m_nDCs
private

Definition at line 71 of file TrigInDetAccelerationSvc.h.

◆ m_pWF

TrigAccel::WorkFactory* TrigInDetAccelerationSvc::m_pWF
private

Definition at line 76 of file TrigInDetAccelerationSvc.h.

◆ m_useITkGeometry

bool TrigInDetAccelerationSvc::m_useITkGeometry
private

Definition at line 73 of file TrigInDetAccelerationSvc.h.

◆ m_workMutex

std::mutex TrigInDetAccelerationSvc::m_workMutex
mutableprivate

Definition at line 93 of file TrigInDetAccelerationSvc.h.


The documentation for this class was generated from the following files: