ATLAS Offline Software
Loading...
Searching...
No Matches
ALFA_ODTracking.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7using namespace std;
8
10 AthMessaging("ALFA_ODTracking")
11{
12 m_listResults.clear();
13
15 m_fDistanceCut = 0.0;
16 m_iLayerCut = 0;
17 m_iDataType = 0;
18
19 memset(&m_iFibSel, 0, sizeof(m_iFibSel));
20 std::fill_n(&m_iFibSel[0][0], sizeof(m_iFibSel)/sizeof(Int_t), 9999);
21}
22
27
28StatusCode ALFA_ODTracking::Initialize(Int_t iMultiplicityCut, Float_t fDistanceCut, Int_t iLayerCut, Int_t iDataType)
29{
30 m_iMultiplicityCut = (int)iMultiplicityCut;
31 m_fDistanceCut = fDistanceCut;
32 m_iLayerCut = iLayerCut;
33 m_iDataType = iDataType;
34
35 return StatusCode::SUCCESS;
36}
37
38StatusCode ALFA_ODTracking::Execute(Int_t iRPot, const std::list<ODHIT> &ListODHits, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT])
39{
40 Int_t iLayer;
41 FIBERS structFibers;
42 std::map<int, FIBERS> MapLayers;
43 MapLayers.clear();
44 std::list<ODHIT>::const_iterator iter;
45 for (iter=ListODHits.begin(); iter!=ListODHits.end(); ++iter)
46 {
47 if (iRPot == (*iter).iRPot)
48 {
49 iLayer = 2*(*iter).iPlate + (*iter).iSide;
50 if(MapLayers.find(iLayer)==MapLayers.end())
51 {
52 structFibers.ListFibers.clear();
53 MapLayers.insert(std::pair<int, FIBERS>(iLayer, structFibers));
54 MapLayers[iLayer].ListFibers.push_back((*iter).iFiber);
55 }
56 else
57 {
58 MapLayers[iLayer].ListFibers.push_back((*iter).iFiber);
59 }
60 }
61 }
62
63 memset(&m_iMulti, 0, sizeof(m_iMulti));
64
65 Int_t iSide, iPlate;
66 Int_t iMaxLay = ODSIDESCNT*ODPLATESCNT;
67 for (Int_t iLayer=0; iLayer<iMaxLay; iLayer++)
68 {
69 iPlate = iLayer/2;
70 iSide = iLayer%2;
71 m_iMulti[iSide][iPlate] = MapLayers[iLayer].ListFibers.size();
72 }
73
74 FiberProjection(iRPot, MapLayers, faOD, fbOD);
75// FindingPosition(iRPot, MapLayers, faOD, fbOD);
76
77 return StatusCode::SUCCESS;
78}
79
80StatusCode ALFA_ODTracking::Finalize(std::list<ODRESULT>* pListResults)
81{
82 *pListResults = m_listResults;
83
84 return StatusCode::SUCCESS;
85}
86
87void ALFA_ODTracking::FiberProjection(Int_t iRPot, std::map<int, FIBERS> &MapLayers, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT])
88{
89 const Int_t NBINTOT = 17000;
90 Int_t iSign;
91
92 std::vector<Int_t> iHitLayer[ODSIDESCNT];
93 for (size_t i = 0; i < ODSIDESCNT; ++i) {
94 iHitLayer[i].resize (NBINTOT);
95 }
96
97 Float_t fPosition;
98 Float_t fFiberXPos = 23;
99
100 fFiberXPos = (m_iDataType==1)? 22 : 23;
101
102 std::list<int>::const_iterator iIter;
103
105
106 for (Int_t iSide=0; iSide<ODSIDESCNT; iSide++)
107 {
108 Results.iSide = -1;
109 Results.fRecPos = -9999.0;
110 Results.fOverY = -9999.0;
111 Results.iNumY = -1;
112
113 iSign = (iSide==0)? -1 : 1;
114
115 for (Int_t iBin=0; iBin<NBINTOT; iBin++)
116 {
117 iHitLayer[iSide][iBin] = 0;
118 }
119
120 for (Int_t iPlate=0; iPlate<ODPLATESCNT; iPlate++)
121 {
122 //multiplicity cut
123 if (MapLayers[2*iPlate+iSide].ListFibers.size()<=(UInt_t)m_iMultiplicityCut && !MapLayers[2*iPlate+iSide].ListFibers.empty())
124 {
125 //Making the projections
126 for (iIter=MapLayers[2*iPlate+iSide].ListFibers.begin(); iIter!=MapLayers[2*iPlate+iSide].ListFibers.end(); ++iIter)
127 {
128// cout << "iPot, iPlate, iSide, iFiber = " << iRPot << ", " << iPlate << ", " << iSide << ", " << *iIter << endl;
129 fPosition = -1*(iSign*fFiberXPos*faOD[iRPot][iPlate][iSide][*iIter] + fbOD[iRPot][iPlate][iSide][*iIter]);
130 for (Int_t iBin=0; iBin<480; iBin++)
131 {
132 iHitLayer[iSide][(int)(((fPosition-0.24)*1000)+iBin-128000)]++;
133 }
134 }
135 }
136 }
137
138 Int_t iNum = 0;
139 std::vector<int> *vecMaxHit = new std::vector<int>;
140
141 //Determining the maximum overlap between fibers
142 for (Int_t iBin=0; iBin<NBINTOT; iBin++)
143 {
144 if (iHitLayer[iSide][iBin]>iNum) iNum = iHitLayer[iSide][iBin];
145 }
146
147 //Determining the position and the width of the maximum
148 //iNum = <0;3> depends on the count of hit layers
149 if (iNum>=m_iLayerCut)
150 {
151 for (Int_t iBin=0; iBin<NBINTOT; iBin++)
152 {
153 if (iHitLayer[iSide][iBin]==iNum)
154 {
155 vecMaxHit->push_back(iBin);
156 }
157 }
158
159 Float_t fHitMinPos, fHitMaxPos;
160// Int_t iHitMinPos_tmp, iHitMaxPos_tmp;
161// Int_t iFullWidth;
162
163 fHitMinPos = -128.0 - (double)(vecMaxHit->front())*1e-3;
164 fHitMaxPos = -128.0 - (double)(vecMaxHit->back())*1e-3;
165
166// iHitMinPos_tmp = vecMaxHit->front();
167// iHitMaxPos_tmp = vecMaxHit->back();
168
169 // Making sure that the plateau belongs to the same track
170// iFullWidth = vecMaxHit->size();
171
172// for (Int_t i=0; i<iFullWidth; i++)
173// {
174// if (vecMaxHit->at(iFullWidth-i-1)-iHitMinPos_tmp < 500)
175// {
176// iHitMaxPos_tmp = vecMaxHit->at(iFullWidth-i-1);
177// fHitMaxPos = -128.0 - (double)(iHitMaxPos_tmp)*1e-3;
178// break;
179// }
180// }
181
182 if ((fHitMinPos-fHitMaxPos)<m_fDistanceCut)
183 {
184 fPosition = (fHitMinPos + fHitMaxPos)/2.0;
185 Results.iSide = iSide;
186 Results.fRecPos = fPosition;
187 Results.fOverY = fHitMinPos-fHitMaxPos;
188 Results.iNumY = iNum;
189 m_listResults.push_back(Results);
190 }
191
192 // m_iFibSelOD ------------------------------------------------------------------
193 Float_t fMin = 0.0;
194 Float_t fDist = 0.0/*, fDistMin = 0.0*/;
195 Int_t iFibSel = 9999;
196
197 if (Results.fRecPos !=-9999.0)
198 {
199 for (Int_t iPlate=0; iPlate<ODPLATESCNT; iPlate++)
200 {
201 iFibSel = 9999;
202 fMin = 0.24/cos(TMath::Pi()/4.0);
203
204 for (iIter=MapLayers[2*iPlate+iSide].ListFibers.begin(); iIter!=MapLayers[2*iPlate+iSide].ListFibers.end(); ++iIter)
205 {
206 fPosition = iSign*fFiberXPos*faOD[iRPot][iPlate][iSide][*iIter] + fbOD[iRPot][iPlate][iSide][*iIter];
207 fDist = TMath::Abs(Results.fRecPos-fPosition);
208
209 if (fDist<=fMin)
210 {
211// fDistMin = Results.fRecPos-fPosition;
212 fMin = fDist;
213 iFibSel = *iIter;
214 }
215 }
216
217 m_iFibSel[iSide][iPlate] = iFibSel;
218 }
219 }
220 }
221
222
223 delete vecMaxHit;
224 }
225}
226
227void ALFA_ODTracking::FindingPosition(Int_t iRPot, std::map<int, FIBERS> &MapLayers, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT])
228{
229 Int_t iSign;
230 Float_t fDistanceA;
231 Float_t fDistanceB;
232 Float_t fPosition;
233
234 Float_t fFiberXPos = 23;
235 fFiberXPos = (m_iDataType==1)? 22 : 23;
236
238 Results.clear();
239
240// std::list<int>::iterator intIter0;
241// std::list<int>::iterator intIter1;
242// std::list<int>::iterator intIter2;
243 std::list<int>::const_iterator intIter0;
244 std::list<int>::const_iterator intIter1;
245 std::list<int>::const_iterator intIter2;
246
247 for (Int_t iSide=0; iSide<ODSIDESCNT; iSide++)
248 {
249 iSign = (iSide==0) ? -1 : 1;
250
251 if (((Int_t)MapLayers[0+iSide].ListFibers.size()<=m_iMultiplicityCut) && ((Int_t)MapLayers[2+iSide].ListFibers.size()<=m_iMultiplicityCut) && ((Int_t)MapLayers[4+iSide].ListFibers.size()<=m_iMultiplicityCut))
252 {
253 if (!MapLayers[0+iSide].ListFibers.empty())
254 {
255 for (intIter0=MapLayers[0+iSide].ListFibers.begin(); intIter0!=MapLayers[0+iSide].ListFibers.end(); ++intIter0)
256 {
257 if (!MapLayers[2+iSide].ListFibers.empty())
258 {
259 for (intIter1=MapLayers[2+iSide].ListFibers.begin(); intIter1!=MapLayers[2+iSide].ListFibers.end(); ++intIter1)
260 {
261 if (!MapLayers[4+iSide].ListFibers.empty())
262 {
263 for (intIter2=MapLayers[4+iSide].ListFibers.begin(); intIter2!=MapLayers[4+iSide].ListFibers.end(); ++intIter2)
264 {
265 fDistanceA = TMath::Abs(iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0] + fbOD[iRPot][0][iSide][*intIter0] - iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1] - fbOD[iRPot][1][iSide][*intIter1]);
266 fDistanceB = TMath::Abs(iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1] + fbOD[iRPot][1][iSide][*intIter1] - iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2] - fbOD[iRPot][2][iSide][*intIter2]);
267
268 if (fDistanceA<m_fDistanceCut && fDistanceB<m_fDistanceCut)
269 {
270 fPosition = (iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0]+fbOD[iRPot][0][iSide][*intIter0] + iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1]+fbOD[iRPot][1][iSide][*intIter1] + iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2]+fbOD[iRPot][2][iSide][*intIter2])/3.0;
271 Results.iSide = iSide;
272 Results.fRecPos = fPosition;
273 m_listResults.push_back(Results);
274 }
275 }
276 }
277 else
278 {
279 fDistanceA = TMath::Abs(iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0]+fbOD[iRPot][0][iSide][*intIter0] - iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1]-fbOD[iRPot][1][iSide][*intIter1]);
280 if (fDistanceA < m_fDistanceCut)
281 {
282 fPosition = (iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0]+fbOD[iRPot][0][iSide][*intIter0] + iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1]+fbOD[iRPot][1][iSide][*intIter1])/2.0;
283 Results.iSide = iSide;
284 Results.fRecPos = fPosition;
285 m_listResults.push_back(Results);
286 }
287 }
288 }
289 }
290 else
291 {
292 if (!MapLayers[4+iSide].ListFibers.empty())
293 {
294 for (intIter2=MapLayers[2*2+iSide].ListFibers.begin(); intIter2!=MapLayers[2*2+iSide].ListFibers.end(); ++intIter2)
295 {
296 fDistanceA = TMath::Abs(iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0]+fbOD[iRPot][0][iSide][*intIter0] - iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2]-fbOD[iRPot][2][iSide][*intIter2]);
297 if (fDistanceA < m_fDistanceCut)
298 {
299 fPosition = (iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0]+fbOD[iRPot][0][iSide][*intIter0] + iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2]+fbOD[iRPot][2][iSide][*intIter2])/2.0;
300 Results.iSide = iSide;
301 Results.fRecPos = fPosition;
302 m_listResults.push_back(Results);
303 }
304 }
305 }
306 }
307 }
308 }
309 else
310 {
311 if (!MapLayers[2+iSide].ListFibers.empty())
312 {
313 for (intIter1=MapLayers[2*1+iSide].ListFibers.begin(); intIter1!=MapLayers[2*1+iSide].ListFibers.end(); ++intIter1)
314 {
315 if (!MapLayers[4+iSide].ListFibers.empty())
316 {
317 for (intIter2=MapLayers[2*2+iSide].ListFibers.begin(); intIter2!=MapLayers[2*2+iSide].ListFibers.end(); ++intIter2)
318 {
319 fDistanceB = TMath::Abs(iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1]+fbOD[iRPot][1][iSide][*intIter1] - iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2]-fbOD[iRPot][2][iSide][*intIter2]);
320 if (fDistanceB<m_fDistanceCut)
321 {
322 fPosition = (iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1]+fbOD[iRPot][1][iSide][*intIter1] + iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2]+fbOD[iRPot][2][iSide][*intIter2])/2.0;
323 Results.iSide = iSide;
324 Results.fRecPos = fPosition;
325 m_listResults.push_back(Results);
326 }
327 }
328 }
329 }
330 }
331 }
332 }
333 }
334}
335
337{
338 ATH_MSG_DEBUG("begin ALFA_ODTracking::GetData()");
339
340
341 for (int iSide=0; iSide<ODSIDESCNT; iSide++)
342 {
343 for (int iPlate=0; iPlate<ODPLATESCNT; iPlate++)
344 {
345 iFibSel[iSide][iPlate] = m_iFibSel[iSide][iPlate];
346 }
347 }
348
349 ATH_MSG_DEBUG("end ALFA_ODTracking::GetData()");
350}
#define ODLAYERSCNT
#define RPOTSCNT
#define ODPLATESCNT
#define ODFIBERSCNT
struct _ODRESULT ODRESULT
struct _FIBERS FIBERS
#define ODSIDESCNT
#define ATH_MSG_DEBUG(x)
std::vector< Result > Results
void GetData(Int_t(&iFibSel)[ODSIDESCNT][ODPLATESCNT])
StatusCode Finalize(std::list< ODRESULT > *pListResults)
void FindingPosition(Int_t iRPot, std::map< int, FIBERS > &MapLayers, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT])
StatusCode Execute(Int_t iRPot, const std::list< ODHIT > &ListODHits, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT])
void FiberProjection(Int_t iRPot, std::map< int, FIBERS > &MapLayers, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT])
Int_t m_iMulti[ODSIDESCNT][ODPLATESCNT]
StatusCode Initialize(Int_t fMultiplicityCut, Float_t fDistanceCut, Int_t iLayerCut, Int_t iDataType)
Int_t m_iFibSel[ODSIDESCNT][ODPLATESCNT]
std::list< ODRESULT > m_listResults
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
STL namespace.
std::list< int > ListFibers