ATLAS Offline Software
Loading...
Searching...
No Matches
ALFA_MDTracking.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
8 AthMessaging("ALFA_MDTracking")
9{
10 ATH_MSG_DEBUG("begin ALFA_MDTracking::ALFA_MDTracking");
11
12 m_iNumU = 0;
13 m_iNumV = 0;
14 m_fOverlapU = -9999.0;
15 m_fOverlapV = -9999.0;
16
17
19 m_iUVCut = 0;
20 m_fOverlapCut = 0.0;
21 m_fRecXPos = 0.0;
22 m_fRecYPos = 0.0;
23 m_iRPot = 0;
24
25 memset(&m_iFibSel, 0, sizeof(m_iFibSel));
26 std::fill_n(m_iFibSel, sizeof(m_iFibSel)/sizeof(Int_t), -9999);
27
28 ATH_MSG_DEBUG("end ALFA_MDTracking::ALFA_MDTracking");
29}
30
32{
33 ATH_MSG_DEBUG("begin ALFA_MDTracking::~ALFA_MDTracking");
34 ATH_MSG_DEBUG("end ALFA_MDTracking::~ALFA_MDTracking");
35}
36
37StatusCode ALFA_MDTracking::Initialize(Float_t faMD[RPOTSCNT][ALFALAYERSCNT*ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT*ALFAPLATESCNT][ALFAFIBERSCNT], Int_t iMultiplicityCut, Int_t iUVCut, Float_t fOverlapCut)
38{
39 ATH_MSG_DEBUG("begin ALFA_MDTracking::Initialize()");
40
41 m_iMultiplicityCut = iMultiplicityCut;
42 m_iUVCut = iUVCut;
43 m_fOverlapCut = fOverlapCut;
44
45 for (Int_t iRPot = 0; iRPot < RPOTSCNT; iRPot++)
46 {
47 for (Int_t iLayer = 0; iLayer < ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
48 {
49 for (Int_t iFiber = 0; iFiber < ALFAFIBERSCNT; iFiber++)
50 {
51 m_faMD[iRPot][iLayer][iFiber] = faMD[iRPot][iLayer][iFiber];
52 m_fbMD[iRPot][iLayer][iFiber] = fbMD[iRPot][iLayer][iFiber];
53 }
54 }
55 }
56
57 ATH_MSG_DEBUG("end ALFA_MDTracking::Initialize()");
58
59 return StatusCode::SUCCESS;
60}
61
62StatusCode ALFA_MDTracking::Execute(Int_t iRPot, const std::list<MDHIT> &ListMDHits)
63{
64 ATH_MSG_DEBUG("ALFA_MDTracking::Execute()");
65
66 FIBERS structFibers;
67 Int_t iNumUFiberHits = 0;
68 Int_t iNumVFiberHits = 0;
69
70 m_iRPot = iRPot;
71 m_MapLayers.clear();
72
73 std::list<MDHIT>::const_iterator iter;
74 for (iter=ListMDHits.begin(); iter!=ListMDHits.end(); ++iter)
75 {
76 if (iRPot == (*iter).iRPot)
77 {
78 if(m_MapLayers.find((*iter).iPlate)==m_MapLayers.end())
79 {
80 structFibers.ListFibers.clear();
81 m_MapLayers.insert(std::pair<int, FIBERS>((*iter).iPlate, structFibers));
82 m_MapLayers[(*iter).iPlate].ListFibers.push_back((*iter).iFiber);
83 }
84 else
85 {
86 m_MapLayers[(*iter).iPlate].ListFibers.push_back((*iter).iFiber);
87 }
88 }
89 }
90
91 //Checking that the multiplicity cut conditions are satisfied
92 //At least more than UV_cut layers have a multiplicity lower than multi_cut
93 for (Int_t iLayer=0; iLayer<ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
94 {
95 if ((Int_t)m_MapLayers[iLayer].ListFibers.size()<=m_iMultiplicityCut && (Int_t)m_MapLayers[iLayer].ListFibers.size()>0)
96 {
97 if (fmod(double(iLayer),double(2)) == 1) iNumUFiberHits++;
98 else iNumVFiberHits++;
99 }
100 }
101
102 m_fRecXPos = -9999.0;
103 m_fRecYPos = -9999.0;
104 m_fOverlapU = -9999.0;
105 m_fOverlapV = -9999.0;
106
107 memset(&m_iFibSel, 0, sizeof(m_iFibSel));
108 std::fill_n(m_iFibSel, sizeof(m_iFibSel)/sizeof(Int_t), -9999);
109
110 if (iNumUFiberHits>=m_iUVCut && iNumVFiberHits>=m_iUVCut) OverLap();
111
112 ATH_MSG_DEBUG("end ALFA_MDTracking::Execute()");
113 return StatusCode::SUCCESS;
114}
115
116StatusCode ALFA_MDTracking::Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
117{
118 ATH_MSG_DEBUG("begin ALFA_MDTracking::Finalize()");
119
120 fRecXPos = m_fRecXPos;
121 fRecYPos = m_fRecYPos;
122
123 ATH_MSG_DEBUG("end ALFA_MDTracking::Execute()");
124
125 return StatusCode::SUCCESS;
126}
127
128void ALFA_MDTracking::HistFill(Float_t &b_p, Float_t &b_n, Float_t &fOverP, Float_t &fOverN, Int_t &iNumU, Int_t &iNumV, Int_t iFlag)
129{
130 ATH_MSG_DEBUG("begin ALFA_MDTracking::HistFill()");
131
132 Int_t iHit;
133 Float_t fFibCen;
134 Float_t fbRef[2] = {-127.0, -127.0};
135 Float_t fXInter, fYInter;
136 Float_t fMinP, fMaxP;
137 Float_t fMinN, fMaxN;
138 Int_t iMinP_tmp, iMaxP_tmp;
139 Int_t iMinN_tmp, iMaxN_tmp;
140 Int_t iFullWidth;
141 const Int_t NBINTOT = 72000;
142 std::vector<Int_t> Over_p(NBINTOT);
143 std::vector<Int_t> Over_n(NBINTOT);
144
145 if (iFlag==0) //First call, Event not reconstructed for U and V
146 {
147 fbRef[0]=-127.0;
148 fbRef[1]=-127.0;
149 }
150
151 if (iFlag==1) //Event reconstructed for U but not for V so let's try to refine
152 {
153 fbRef[0]=b_p;
154 fbRef[1]=-127.0;
155 }
156
157 if (iFlag==2) //Event reconstructed for V but not for U so let's try to refine
158 {
159 fbRef[0]=-127.0;
160 fbRef[1]=b_n;
161 }
162
163 if (iFlag==3) //Event reconstructed for U and V, ultime refinement
164 {
165 fbRef[0]=b_p;
166 fbRef[1]=b_n;
167 }
168
169 for (Int_t iBin=0;iBin<72000;iBin++)
170 {
171 Over_p[iBin]=0;
172 Over_n[iBin]=0;
173 }
174
175 std::list<int>::iterator iter;
176 for (Int_t iLayer=0; iLayer<ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
177 {
178 for (iter=m_MapLayers[iLayer].ListFibers.begin(); iter!=m_MapLayers[iLayer].ListFibers.end(); ++iter)
179 {
180 iHit = *iter;
181
182 if (m_faMD[m_iRPot][iLayer][iHit]>=0)
183 {
184 fXInter = (fbRef[1]-m_fbMD[m_iRPot][iLayer][iHit])/(1+m_faMD[m_iRPot][iLayer][iHit]);
185 fYInter = (m_faMD[m_iRPot][iLayer][iHit]*fbRef[1]+m_fbMD[m_iRPot][iLayer][iHit])/(1+m_faMD[m_iRPot][iLayer][iHit])-fbRef[1];
186 fFibCen = (fYInter-fXInter)/sqrt(2.0);
187
188 for (Int_t bin=0;bin<480;bin++)
189 {
190 Over_p[(int)((fFibCen-0.24)*1000)+bin+36000]++;
191 }
192 }
193 else
194 {
195 fXInter = (m_fbMD[m_iRPot][iLayer][iHit]-fbRef[0])/(1-m_faMD[m_iRPot][iLayer][iHit]);
196 fYInter = (m_fbMD[m_iRPot][iLayer][iHit]-m_faMD[m_iRPot][iLayer][iHit]*fbRef[0])/(1-m_faMD[m_iRPot][iLayer][iHit])-fbRef[0];
197 fFibCen = (fYInter+fXInter)/sqrt(2.0);
198
199 for (Int_t bin=0;bin<480;bin++)
200 {
201 Over_n[(int)((fFibCen-0.24)*1000)+bin+36000]++;
202 }
203 }
204 }
205 }
206
207 //Determine maximum
208 iNumU=0;
209 iNumV=0;
210
211 std::vector<int> *vecMaxP = new std::vector<int>;
212 std::vector<int> *vecMaxN = new std::vector<int>;
213
214 for (Int_t i=0;i<72000;i++)
215 {
216 if (Over_p[i]>iNumU) iNumU = Over_p[i];
217 if (Over_n[i]>iNumV) iNumV = Over_n[i];
218 }
219
220 if (iNumU>=m_iUVCut) // If more than m_iUVCut fibers in the maximum we do the reconstruction
221 {
222 for (Int_t i=0; i<NBINTOT; i++)
223 {
224 if (Over_p[i]==iNumU)
225 {
226 vecMaxP->push_back(i);
227 }
228 }
229
230 fMinP = -36.0 + double(vecMaxP->front())*1e-3;
231 fMaxP = -36.0 + double(vecMaxP->back())*1e-3;
232 iMinP_tmp = vecMaxP->front();
233 iMaxP_tmp = vecMaxP->back();
234
235// Making sure that the plateau belongs to the same track
236 iFullWidth = vecMaxP->size();
237
238 for (Int_t i=0; i<iFullWidth; i++)
239 {
240 if (vecMaxP->at(iFullWidth-i-1)-iMinP_tmp < 500)
241 {
242 iMaxP_tmp = vecMaxP->at(iFullWidth-i-1);
243 fMaxP = -36.0 + double(iMaxP_tmp)*1e-3;
244 break;
245 }
246 }
247
248 if ((fMaxP-fMinP)<m_fOverlapCut) //Check for multiple tracks
249 {
250 b_p = fbRef[1]+(fMinP+fMaxP)/sqrt(2.);
251 fOverP = fMaxP-fMinP;
252 }
253 else
254 {
255 b_p = -9999.0;
256 fOverP = -9999.0;
257 }
258 }
259 else
260 {
261 b_p = -9999.0;
262 fOverP = -9999.0;
263 }
264
265 if (iNumV>=m_iUVCut) // If more than m_iUVCut fibers in the maximum we do the reconstruction
266 {
267 for (Int_t i=0; i<NBINTOT; i++)
268 {
269 if (Over_n[i]==iNumV)
270 {
271 vecMaxN->push_back(i);
272 }
273 }
274
275 fMinN = -36.0 + double(vecMaxN->front())*1e-3;
276 fMaxN = -36.0 + double(vecMaxN->back())*1e-3;
277 iMinN_tmp = vecMaxN->front();
278 iMaxN_tmp = vecMaxN->back();
279
280// Making sure that the plateau belongs to the same track
281 iFullWidth = vecMaxN->size();
282
283 for (Int_t i=0; i<iFullWidth; i++)
284 {
285 if (vecMaxN->at(iFullWidth-i-1)-iMinN_tmp < 500)
286 {
287 iMaxN_tmp = vecMaxN->at(iFullWidth-i-1);
288 fMaxN = -36.0 + double(iMaxN_tmp)*1e-3;
289 break;
290 }
291 }
292
293 if ((fMaxN-fMinN)<m_fOverlapCut) //Check for multiple tracks
294 {
295 b_n = fbRef[0]+(fMinN+fMaxN)/sqrt(2.);
296 fOverN = fMaxN-fMinN;
297 }
298 else
299 {
300 b_n = -9999.0;
301 fOverN = -9999.0;
302 }
303 }
304 else
305 {
306 b_n = -9999.0;
307 fOverN = -9999.0;
308 }
309
310// if (b_p!=-9999.0 && b_n!=-9999.0)
311// {
312// if ((b_n+b_p)/2.0<=-135.5 && (iNumU>=m_iUVCut && iNumV>=m_iUVCut))
313// {
314// b_n = -9999.0;
315// b_p = -9999.0;
316// }
317// }
318
319 delete vecMaxP;
320 delete vecMaxN;
321
322 ATH_MSG_DEBUG("endl ALFA_MDTracking::HistFill()");
323}
324
326{
327 ATH_MSG_DEBUG("ALFA_MDTracking::OverLap()");
328
329 Float_t fBMeanN = -9999.0;
330 Float_t fBMeanP = -9999.0;
331 Float_t fOverRegP;
332 Float_t fOverRegN;
333 Int_t iNumU, iNumV;
334
335 //First call, projection on middle fiber for U and V
336 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 0);
337
338 //If first projection worked, we do the ultimate one
339 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0)
340 {
341 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
342 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0)
343 {
344 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
345 }
346 }
347 else
348 {
349 //If first projection worked for p side but not for n, we try to refine n projection using the information from p side
350 if (fBMeanP!=-9999.0 && fBMeanN==-9999.0)
351 {
352 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 1);
353
354 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0)
355 {
356 //if it as worked for both we do the ultimate one
357 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
358 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0) HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
359 }
360 }
361
362 //If first projection worked for p side but not for n, we try to refine n projection using the information from p side
363 if (fBMeanP==-9999.0 && fBMeanN!=-9999.0)
364 {
365 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 2);
366
367 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0)
368 {
369 //if it as worked for both we do the ultimate one
370 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
371 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0) HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
372 }
373 }
374 }
375
376 Float_t fxTmp, fyTmp;
377 Float_t fMinX,fMinY;
378 Float_t fDistX,fDistY;
379// Float_t fDistMinX,fDistMinY;
380 Int_t iHit;
381 Float_t fOverlapU, fOverlapV;
382 Int_t iFibSelX, iFibSelY;
383
384 std::list<int>::iterator iter;
385 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0)
386 {
387 m_fRecXPos = (fBMeanN-fBMeanP)/2.0;
388 m_fRecYPos = (fBMeanN+fBMeanP)/2.0;
389 fOverlapU = fOverRegP;
390 fOverlapV = fOverRegN;
391
392 for (Int_t iLayer=0; iLayer<ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
393 {
394 fMinX = 0.24/cos(TMath::Pi()/4.0);
395 fMinY = 0.24/cos(TMath::Pi()/4.0);
396
397 iFibSelX = -9999, iFibSelY = -9999;
398 for (iter=m_MapLayers[iLayer].ListFibers.begin(); iter!=m_MapLayers[iLayer].ListFibers.end(); ++iter)
399 {
400 iHit = *iter;
401 fxTmp = (m_fRecYPos-m_fbMD[m_iRPot][iLayer][iHit])/m_faMD[m_iRPot][iLayer][iHit];
402 fyTmp = m_faMD[m_iRPot][iLayer][iHit]*m_fRecXPos+m_fbMD[m_iRPot][iLayer][iHit];
403 fDistX = TMath::Abs(m_fRecXPos-fxTmp);
404 fDistY = TMath::Abs(m_fRecYPos-fyTmp);
405
406 if (fDistX<=fMinX)
407 {
408// fDistMinX = m_fRecXPos-fxTmp;
409 fMinX = fDistX;
410 iFibSelX = iHit;
411 }
412
413 if (fDistY<=fMinY)
414 {
415// fDistMinY = m_fRecYPos-fyTmp;
416 fMinY = fDistY;
417 iFibSelY = iHit;
418 }
419 }
420
421 if (iFibSelX==iFibSelY) m_iFibSel[iLayer] = iFibSelX;
422 }
423 }
424 else
425 {
426 m_fRecXPos = -9999.0;
427 m_fRecYPos = -9999.0;
428 iNumU = 0;
429 iNumV = 0;
430 fOverlapU = -9999.0;
431 fOverlapV = -9999.0;
432 }
433
434 SetData(iNumU, iNumV, fOverlapU, fOverlapV);
435
436 ATH_MSG_DEBUG("end ALFA_MDTracking::OverLap()");
437}
438
439void ALFA_MDTracking::SetData(Int_t iNumU, Int_t iNumV, Float_t fOverlapU, Float_t fOverlapV)
440{
441 ATH_MSG_DEBUG("begin ALFA_MDTracking::SetData()");
442
443 m_iNumU = iNumU;
444 m_iNumV = iNumV;
445 m_fOverlapU = fOverlapU;
446 m_fOverlapV = fOverlapV;
447
448 ATH_MSG_DEBUG("end ALFA_MDTracking::SetData()");
449}
450
451void ALFA_MDTracking::GetData(Int_t &iNumU, Int_t &iNumV, Float_t &fOverlapU, Float_t &fOverlapV, Int_t (&iFibSel)[ALFALAYERSCNT*ALFAPLATESCNT])
452{
453 ATH_MSG_DEBUG("begin ALFA_MDTracking::GetData()");
454
455 iNumU = m_iNumU;
456 iNumV = m_iNumV;
457 fOverlapU = m_fOverlapU;
458 fOverlapV = m_fOverlapV;
459
460 for (Int_t iLayer=0; iLayer<ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
461 {
462 iFibSel[iLayer] = m_iFibSel[iLayer];
463 }
464
465 ATH_MSG_DEBUG("end ALFA_MDTracking::GetData()");
466}
#define RPOTSCNT
struct _FIBERS FIBERS
#define ALFALAYERSCNT
#define ALFAPLATESCNT
#define ALFAFIBERSCNT
#define ATH_MSG_DEBUG(x)
StatusCode Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
Int_t m_iFibSel[ALFALAYERSCNT *ALFAPLATESCNT]
StatusCode Execute(Int_t iRPot, const std::list< MDHIT > &ListMDHits)
void GetData(Int_t &NumU, Int_t &NumV, Float_t &OL_U, Float_t &OL_V, Int_t(&iFibSel)[ALFALAYERSCNT *ALFAPLATESCNT])
Float_t m_faMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT]
StatusCode Initialize(Float_t faMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Int_t iMultiplicityCut, Int_t iUVCut, Float_t fOverlapCut)
Float_t m_fbMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT]
std::map< int, FIBERS > m_MapLayers
void SetData(Int_t NumU, Int_t NumV, Float_t OL_U, Float_t OL_V)
void HistFill(Float_t &b_p, Float_t &b_n, Float_t &Ov_p, Float_t &Ov_n, Int_t &NumU, Int_t &NumV, Int_t iFlag)
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
std::list< int > ListFibers