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

#include <TrigInDetAccelerationTool.h>

Inheritance diagram for TrigInDetAccelerationTool:
Collaboration diagram for TrigInDetAccelerationTool:

Public Member Functions

 TrigInDetAccelerationTool (const std::string &, const std::string &, const IInterface *)
virtual StatusCode initialize () override
virtual size_t exportSeedMakingJob (const TrigCombinatorialSettings &, const IRoiDescriptor *, const std::vector< TrigSiSpacePointBase > &, TrigAccel::DATA_EXPORT_BUFFER &) const override
virtual int extractTripletsFromOutput (std::shared_ptr< TrigAccel::OffloadBuffer >, const std::vector< TrigSiSpacePointBase > &, std::vector< TrigInDetTriplet > &) const override

Private Attributes

ServiceHandle< ITrigInDetAccelerationSvcm_accelSvc

Detailed Description

Definition at line 16 of file TrigInDetAccelerationTool.h.

Constructor & Destructor Documentation

◆ TrigInDetAccelerationTool()

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

Definition at line 10 of file TrigInDetAccelerationTool.cxx.

12 : base_class(t,n,p),
13 m_accelSvc("TrigInDetAccelerationSvc",this->name()) {
14
15 declareInterface< ITrigInDetAccelerationTool >( this );
16}
ServiceHandle< ITrigInDetAccelerationSvc > m_accelSvc

Member Function Documentation

◆ exportSeedMakingJob()

size_t TrigInDetAccelerationTool::exportSeedMakingJob ( const TrigCombinatorialSettings & tcs,
const IRoiDescriptor * roi,
const std::vector< TrigSiSpacePointBase > & vsp,
TrigAccel::DATA_EXPORT_BUFFER & output ) const
overridevirtual

Definition at line 24 of file TrigInDetAccelerationTool.cxx.

24 {
25
26 typedef struct SpIndexPair {
27 public:
28
29 struct compareZ {
30 public:
31 bool operator()(const std::pair<int, const TrigSiSpacePointBase*>& p1, const std::pair<int, const TrigSiSpacePointBase*>& p2) {
32 return p1.second->z() < p2.second->z();
33 }
34 };
35
36 struct compareR {
37 public:
38 bool operator()(const std::pair<int, const TrigSiSpacePointBase*>& p1, const std::pair<int, const TrigSiSpacePointBase*>& p2) {
39 return p1.second->r() < p2.second->r();
40 }
41 };
42
43 } SP_INDEX_PAIR;
44
45
46 //0. get InDet geometry information
47
48 const std::vector<short>& pixelLayers = m_accelSvc->getLayerInformation(1);
49 const std::vector<short>& sctLayers = m_accelSvc->getLayerInformation(2);
50 const std::vector<short>& layerTypes = m_accelSvc->getLayerInformation(0);
51
52
53 //1. check buffer size
54
55 size_t dataTypeSize = sizeof(TrigAccel::SEED_MAKING_JOB);
56 const size_t bufferOffset = 256;
57 size_t totalSize = bufferOffset+dataTypeSize;//make room for the header
58 if(!output.fit(totalSize)) output.reallocate(totalSize);
59
60 TrigAccel::SEED_MAKING_JOB* pJ = reinterpret_cast<TrigAccel::SEED_MAKING_JOB*>(output.m_buffer+bufferOffset);
61
62 // cppcheck-suppress memsetClassFloat; deliberate
63 memset(pJ,0,dataTypeSize);
64
66
71 sfs.m_maxEta = roi->etaPlus();
74
75 sfs.m_magFieldZ = tcs.m_magFieldZ;
76
80 sfs.m_tripletDoPSS = tcs.m_tripletDoPSS ? 1 : 0;
81 sfs.m_tripletDoPPS = tcs.m_tripletDoPPS ? 1 : 0;
82 sfs.m_doubletFilterRZ = tcs.m_doubletFilterRZ ? 1 : 0;
85 sfs.m_isFullScan = 1;
86
87 sfs.m_zedMinus = roi->zedMinus();
88 sfs.m_zedPlus = roi->zedPlus();
89
90 if(!(roi->isFullscan() || roi->composite() )){
91 //roi suitable for gpu
92 //composite rois are not supported at this point
93 sfs.m_isFullScan = 0;
94
95 sfs.m_phiMinus = roi->phiMinus();
96 sfs.m_phiPlus = roi->phiPlus();
97 }
98
100
101 unsigned int nSP = vsp.size();
104 ATH_MSG_WARNING("MAX_NUMBER_SPACEPOINTS exceeded, exported data truncated ...");
105 }
106
107 //2. arrange spacepoints into phi/Layer bins
108
109 double phiSliceWidth = 2*M_PI/tcs.m_nMaxPhiSlice;
110 int nLayers = static_cast<int>(layerTypes.size());
111 int nSlices = static_cast<int>(tcs.m_nMaxPhiSlice);
112
113 std::vector<std::vector<std::pair<int, const TrigSiSpacePointBase*> > > phiLArray;
114 phiLArray.resize(nLayers*nSlices);
115
116 for(unsigned int i=0;i<nSP;i++) {
117 const TrigSiSpacePointBase& sp = vsp[i];
118 const std::pair<IdentifierHash, IdentifierHash>& els = sp.offlineSpacePoint()->elementIdList();
119
120 IdentifierHash hashId = els.first;
121 short layerId = -1;
122 if(sp.isPixel()) {
123 layerId = pixelLayers[hashId];
124 } else if (sfs.m_maxEta < 3) { // Run 3 geometry
125 layerId = sctLayers[hashId];
126 } else {
127 // Ignore SPs from Strips for ITk Track Seeding
128 continue;
129 }
130
131 int phiIdx = (sp.phi()+M_PI)/phiSliceWidth;
132 if (phiIdx >= tcs.m_nMaxPhiSlice) {
133 phiIdx %= tcs.m_nMaxPhiSlice;
134 }
135 else if (phiIdx < 0) {
136 phiIdx += tcs.m_nMaxPhiSlice;
137 phiIdx %= tcs.m_nMaxPhiSlice;
138 }
139
140 std::vector<std::pair<int, const TrigSiSpacePointBase*> >& v = phiLArray[layerId + phiIdx*nLayers];
141 v.push_back(std::pair<int, const TrigSiSpacePointBase*>(i,&sp));//storing the original index of spacepoint
142 }
143
144 //sorting spacepoints in accordance with non-ref coordinate
145 int layerIdx=0;
146 for(std::vector<short>::const_iterator it = layerTypes.begin();it!=layerTypes.end();++it, layerIdx++) {
147 short barrel_ec = (*it);//0-barrel, !=0 - endcap
148 for(int slice = 0;slice<nSlices;slice++) {
149 std::vector<std::pair<int, const TrigSiSpacePointBase*> >& v = phiLArray[layerIdx + slice*nLayers];
150 if(barrel_ec==0) std::sort(v.begin(), v.end(), SP_INDEX_PAIR::compareZ());
151 else std::sort(v.begin(), v.end(), SP_INDEX_PAIR::compareR());
152 }
153 }
154
155 sps.m_nSpacepoints = nSP;
156 sps.m_nPhiSlices = nSlices;
157 sps.m_nLayers = nLayers;
158
159 int spIdx=0;
160 for(int slice = 0;slice<nSlices;slice++) {
161 for(int layer = 0;layer<nLayers;layer++) {
162 int layerStart = spIdx;
163 std::vector<std::pair<int, const TrigSiSpacePointBase*> >& v = phiLArray[layer + slice*nLayers];
164 for(std::vector<std::pair<int, const TrigSiSpacePointBase*> >::iterator it = v.begin();it!=v.end();++it) {
165 const TrigSiSpacePointBase* sp = (*it).second;
166 sps.m_index[spIdx] = (*it).first;
167 sps.m_type[spIdx] = sp->isPixel() ? 1 : 2;
168 sps.m_x[spIdx] = sp->x();
169 sps.m_y[spIdx] = sp->y();
170 sps.m_z[spIdx] = sp->z();
171 sps.m_r[spIdx] = sp->r();
172 sps.m_phi[spIdx] = sp->phi();
173 sps.m_covR[spIdx] = sp->dr()*sp->dr();
174 sps.m_covZ[spIdx] = sp->dz()*sp->dz();
175 spIdx++;
176 }
177 int layerEnd = spIdx;
178 sps.m_phiSlices[slice].m_layerBegin[layer] = layerStart;
179 sps.m_phiSlices[slice].m_layerEnd[layer] = layerEnd;
180 }
181 }
182
183 return totalSize;
184
185}
#define M_PI
#define ATH_MSG_WARNING(x)
static Double_t sp
static unsigned int totalSize(const MultiDimArray< T, N > &ht)
virtual bool isFullscan() const =0
is this a full detector RoI?
virtual double phiPlus() const =0
extreme phi values
virtual double zedPlus() const =0
the zed and eta values at the most forward and most rear ends of the RoI
virtual double phiMinus() const =0
virtual double zedMinus() const =0
virtual double etaPlus() const =0
virtual bool composite() const =0
Super RoI access methods.
@ layer
Definition HitInfo.h:79
static constexpr unsigned int MAX_NUMBER_SPACEPOINTS
struct TrigAccel::SeedFinderSettings SEED_FINDER_SETTINGS
struct TrigAccel::SeedMakingJob SEED_MAKING_JOB
struct TrigAccel::SpacePointStorage SPACEPOINT_STORAGE
output
Definition merge.py:16
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
SEED_FINDER_SETTINGS m_settings
SPACEPOINT_STORAGE m_data
int m_layerEnd[MAX_SILICON_LAYERS]
int m_layerBegin[MAX_SILICON_LAYERS]
float m_covR[MAX_NUMBER_SPACEPOINTS]
int m_index[MAX_NUMBER_SPACEPOINTS]
float m_phi[MAX_NUMBER_SPACEPOINTS]
float m_y[MAX_NUMBER_SPACEPOINTS]
float m_x[MAX_NUMBER_SPACEPOINTS]
float m_r[MAX_NUMBER_SPACEPOINTS]
float m_z[MAX_NUMBER_SPACEPOINTS]
int m_type[MAX_NUMBER_SPACEPOINTS]
float m_covZ[MAX_NUMBER_SPACEPOINTS]
SPACEPOINT_LAYER_RANGE m_phiSlices[MAX_PHI_SLICES]

◆ extractTripletsFromOutput()

int TrigInDetAccelerationTool::extractTripletsFromOutput ( std::shared_ptr< TrigAccel::OffloadBuffer > gpu_buffer,
const std::vector< TrigSiSpacePointBase > & vsp,
std::vector< TrigInDetTriplet > & output ) const
overridevirtual

Definition at line 187 of file TrigInDetAccelerationTool.cxx.

187 {
188 TrigAccel::OUTPUT_SEED_STORAGE* pOutput = reinterpret_cast<TrigAccel::OUTPUT_SEED_STORAGE *>(gpu_buffer->m_rawBuffer);
189
190 int nTriplets = pOutput->m_nSeeds;
191
192 //copy seeds into the output buffer
193
194 output.clear();
195
196 for(int k=0;k<nTriplets;k++) {
197 const TrigSiSpacePointBase& SPi = vsp[pOutput->m_innerIndex[k]];
198 const TrigSiSpacePointBase& SPm = vsp[pOutput->m_middleIndex[k]];
199 const TrigSiSpacePointBase& SPo = vsp[pOutput->m_outerIndex[k]];
200 output.emplace_back(SPi, SPm, SPo, pOutput->m_Q[k]);
201 }
202
203 return nTriplets;
204}
unsigned char * m_rawBuffer
struct TrigAccel::OutputSeedStorage OUTPUT_SEED_STORAGE
float m_Q[MAX_NUMBER_OUTPUT_SEEDS]
int m_innerIndex[MAX_NUMBER_OUTPUT_SEEDS]
int m_middleIndex[MAX_NUMBER_OUTPUT_SEEDS]
int m_outerIndex[MAX_NUMBER_OUTPUT_SEEDS]

◆ initialize()

StatusCode TrigInDetAccelerationTool::initialize ( )
overridevirtual

Definition at line 18 of file TrigInDetAccelerationTool.cxx.

18 {
19
20 ATH_CHECK(m_accelSvc.retrieve());
21 return StatusCode::SUCCESS;
22}
#define ATH_CHECK
Evaluate an expression and check for errors.

Member Data Documentation

◆ m_accelSvc

ServiceHandle<ITrigInDetAccelerationSvc> TrigInDetAccelerationTool::m_accelSvc
private

Definition at line 27 of file TrigInDetAccelerationTool.h.


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