ATLAS Offline Software
Loading...
Searching...
No Matches
ALFA_ODTracking.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 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 Int_t iHitLayer[ODSIDESCNT][NBINTOT];
92 Float_t fPosition;
93 Float_t fFiberXPos = 23;
94
95 fFiberXPos = (m_iDataType==1)? 22 : 23;
96
97 std::list<int>::const_iterator iIter;
98
100
101 for (Int_t iSide=0; iSide<ODSIDESCNT; iSide++)
102 {
103 Results.iSide = -1;
104 Results.fRecPos = -9999.0;
105 Results.fOverY = -9999.0;
106 Results.iNumY = -1;
107
108 iSign = (iSide==0)? -1 : 1;
109
110 for (Int_t iBin=0; iBin<NBINTOT; iBin++)
111 {
112 iHitLayer[iSide][iBin] = 0;
113 }
114
115 for (Int_t iPlate=0; iPlate<ODPLATESCNT; iPlate++)
116 {
117 //multiplicity cut
118 if (MapLayers[2*iPlate+iSide].ListFibers.size()<=(UInt_t)m_iMultiplicityCut && !MapLayers[2*iPlate+iSide].ListFibers.empty())
119 {
120 //Making the projections
121 for (iIter=MapLayers[2*iPlate+iSide].ListFibers.begin(); iIter!=MapLayers[2*iPlate+iSide].ListFibers.end(); ++iIter)
122 {
123// cout << "iPot, iPlate, iSide, iFiber = " << iRPot << ", " << iPlate << ", " << iSide << ", " << *iIter << endl;
124 fPosition = -1*(iSign*fFiberXPos*faOD[iRPot][iPlate][iSide][*iIter] + fbOD[iRPot][iPlate][iSide][*iIter]);
125 for (Int_t iBin=0; iBin<480; iBin++)
126 {
127 iHitLayer[iSide][(int)(((fPosition-0.24)*1000)+iBin-128000)]++;
128 }
129 }
130 }
131 }
132
133 Int_t iNum = 0;
134 std::vector<int> *vecMaxHit = new std::vector<int>;
135
136 //Determining the maximum overlap between fibers
137 for (Int_t iBin=0; iBin<NBINTOT; iBin++)
138 {
139 if (iHitLayer[iSide][iBin]>iNum) iNum = iHitLayer[iSide][iBin];
140 }
141
142 //Determining the position and the width of the maximum
143 //iNum = <0;3> depends on the count of hit layers
144 if (iNum>=m_iLayerCut)
145 {
146 for (Int_t iBin=0; iBin<NBINTOT; iBin++)
147 {
148 if (iHitLayer[iSide][iBin]==iNum)
149 {
150 vecMaxHit->push_back(iBin);
151 }
152 }
153
154 Float_t fHitMinPos, fHitMaxPos;
155// Int_t iHitMinPos_tmp, iHitMaxPos_tmp;
156// Int_t iFullWidth;
157
158 fHitMinPos = -128.0 - (double)(vecMaxHit->front())*1e-3;
159 fHitMaxPos = -128.0 - (double)(vecMaxHit->back())*1e-3;
160
161// iHitMinPos_tmp = vecMaxHit->front();
162// iHitMaxPos_tmp = vecMaxHit->back();
163
164 // Making sure that the plateau belongs to the same track
165// iFullWidth = vecMaxHit->size();
166
167// for (Int_t i=0; i<iFullWidth; i++)
168// {
169// if (vecMaxHit->at(iFullWidth-i-1)-iHitMinPos_tmp < 500)
170// {
171// iHitMaxPos_tmp = vecMaxHit->at(iFullWidth-i-1);
172// fHitMaxPos = -128.0 - (double)(iHitMaxPos_tmp)*1e-3;
173// break;
174// }
175// }
176
177 if ((fHitMinPos-fHitMaxPos)<m_fDistanceCut)
178 {
179 fPosition = (fHitMinPos + fHitMaxPos)/2.0;
180 Results.iSide = iSide;
181 Results.fRecPos = fPosition;
182 Results.fOverY = fHitMinPos-fHitMaxPos;
183 Results.iNumY = iNum;
184 m_listResults.push_back(Results);
185 }
186
187 // m_iFibSelOD ------------------------------------------------------------------
188 Float_t fMin = 0.0;
189 Float_t fDist = 0.0/*, fDistMin = 0.0*/;
190 Int_t iFibSel = 9999;
191
192 if (Results.fRecPos !=-9999.0)
193 {
194 for (Int_t iPlate=0; iPlate<ODPLATESCNT; iPlate++)
195 {
196 iFibSel = 9999;
197 fMin = 0.24/cos(TMath::Pi()/4.0);
198
199 for (iIter=MapLayers[2*iPlate+iSide].ListFibers.begin(); iIter!=MapLayers[2*iPlate+iSide].ListFibers.end(); ++iIter)
200 {
201 fPosition = iSign*fFiberXPos*faOD[iRPot][iPlate][iSide][*iIter] + fbOD[iRPot][iPlate][iSide][*iIter];
202 fDist = TMath::Abs(Results.fRecPos-fPosition);
203
204 if (fDist<=fMin)
205 {
206// fDistMin = Results.fRecPos-fPosition;
207 fMin = fDist;
208 iFibSel = *iIter;
209 }
210 }
211
212 m_iFibSel[iSide][iPlate] = iFibSel;
213 }
214 }
215 }
216
217
218 delete vecMaxHit;
219 }
220}
221
222void 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])
223{
224 Int_t iSign;
225 Float_t fDistanceA;
226 Float_t fDistanceB;
227 Float_t fPosition;
228
229 Float_t fFiberXPos = 23;
230 fFiberXPos = (m_iDataType==1)? 22 : 23;
231
233 Results.clear();
234
235// std::list<int>::iterator intIter0;
236// std::list<int>::iterator intIter1;
237// std::list<int>::iterator intIter2;
238 std::list<int>::const_iterator intIter0;
239 std::list<int>::const_iterator intIter1;
240 std::list<int>::const_iterator intIter2;
241
242 for (Int_t iSide=0; iSide<ODSIDESCNT; iSide++)
243 {
244 iSign = (iSide==0) ? -1 : 1;
245
246 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))
247 {
248 if (!MapLayers[0+iSide].ListFibers.empty())
249 {
250 for (intIter0=MapLayers[0+iSide].ListFibers.begin(); intIter0!=MapLayers[0+iSide].ListFibers.end(); ++intIter0)
251 {
252 if (!MapLayers[2+iSide].ListFibers.empty())
253 {
254 for (intIter1=MapLayers[2+iSide].ListFibers.begin(); intIter1!=MapLayers[2+iSide].ListFibers.end(); ++intIter1)
255 {
256 if (!MapLayers[4+iSide].ListFibers.empty())
257 {
258 for (intIter2=MapLayers[4+iSide].ListFibers.begin(); intIter2!=MapLayers[4+iSide].ListFibers.end(); ++intIter2)
259 {
260 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]);
261 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]);
262
263 if (fDistanceA<m_fDistanceCut && fDistanceB<m_fDistanceCut)
264 {
265 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;
266 Results.iSide = iSide;
267 Results.fRecPos = fPosition;
268 m_listResults.push_back(Results);
269 }
270 }
271 }
272 else
273 {
274 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]);
275 if (fDistanceA < m_fDistanceCut)
276 {
277 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;
278 Results.iSide = iSide;
279 Results.fRecPos = fPosition;
280 m_listResults.push_back(Results);
281 }
282 }
283 }
284 }
285 else
286 {
287 if (!MapLayers[4+iSide].ListFibers.empty())
288 {
289 for (intIter2=MapLayers[2*2+iSide].ListFibers.begin(); intIter2!=MapLayers[2*2+iSide].ListFibers.end(); ++intIter2)
290 {
291 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]);
292 if (fDistanceA < m_fDistanceCut)
293 {
294 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;
295 Results.iSide = iSide;
296 Results.fRecPos = fPosition;
297 m_listResults.push_back(Results);
298 }
299 }
300 }
301 }
302 }
303 }
304 else
305 {
306 if (!MapLayers[2+iSide].ListFibers.empty())
307 {
308 for (intIter1=MapLayers[2*1+iSide].ListFibers.begin(); intIter1!=MapLayers[2*1+iSide].ListFibers.end(); ++intIter1)
309 {
310 if (!MapLayers[4+iSide].ListFibers.empty())
311 {
312 for (intIter2=MapLayers[2*2+iSide].ListFibers.begin(); intIter2!=MapLayers[2*2+iSide].ListFibers.end(); ++intIter2)
313 {
314 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]);
315 if (fDistanceB<m_fDistanceCut)
316 {
317 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;
318 Results.iSide = iSide;
319 Results.fRecPos = fPosition;
320 m_listResults.push_back(Results);
321 }
322 }
323 }
324 }
325 }
326 }
327 }
328 }
329}
330
332{
333 ATH_MSG_DEBUG("begin ALFA_ODTracking::GetData()");
334
335
336 for (int iSide=0; iSide<ODSIDESCNT; iSide++)
337 {
338 for (int iPlate=0; iPlate<ODPLATESCNT; iPlate++)
339 {
340 iFibSel[iSide][iPlate] = m_iFibSel[iSide][iPlate];
341 }
342 }
343
344 ATH_MSG_DEBUG("end ALFA_ODTracking::GetData()");
345}
#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