ATLAS Offline Software
Loading...
Searching...
No Matches
ALFA_MDTracking.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
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 Int_t Over_p[NBINTOT], Over_n[NBINTOT];
143
144 if (iFlag==0) //First call, Event not reconstructed for U and V
145 {
146 fbRef[0]=-127.0;
147 fbRef[1]=-127.0;
148 }
149
150 if (iFlag==1) //Event reconstructed for U but not for V so let's try to refine
151 {
152 fbRef[0]=b_p;
153 fbRef[1]=-127.0;
154 }
155
156 if (iFlag==2) //Event reconstructed for V but not for U so let's try to refine
157 {
158 fbRef[0]=-127.0;
159 fbRef[1]=b_n;
160 }
161
162 if (iFlag==3) //Event reconstructed for U and V, ultime refinement
163 {
164 fbRef[0]=b_p;
165 fbRef[1]=b_n;
166 }
167
168 for (Int_t iBin=0;iBin<72000;iBin++)
169 {
170 Over_p[iBin]=0;
171 Over_n[iBin]=0;
172 }
173
174 std::list<int>::iterator iter;
175 for (Int_t iLayer=0; iLayer<ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
176 {
177 for (iter=m_MapLayers[iLayer].ListFibers.begin(); iter!=m_MapLayers[iLayer].ListFibers.end(); ++iter)
178 {
179 iHit = *iter;
180
181 if (m_faMD[m_iRPot][iLayer][iHit]>=0)
182 {
183 fXInter = (fbRef[1]-m_fbMD[m_iRPot][iLayer][iHit])/(1+m_faMD[m_iRPot][iLayer][iHit]);
184 fYInter = (m_faMD[m_iRPot][iLayer][iHit]*fbRef[1]+m_fbMD[m_iRPot][iLayer][iHit])/(1+m_faMD[m_iRPot][iLayer][iHit])-fbRef[1];
185 fFibCen = (fYInter-fXInter)/sqrt(2.0);
186
187 for (Int_t bin=0;bin<480;bin++)
188 {
189 Over_p[(int)((fFibCen-0.24)*1000)+bin+36000]++;
190 }
191 }
192 else
193 {
194 fXInter = (m_fbMD[m_iRPot][iLayer][iHit]-fbRef[0])/(1-m_faMD[m_iRPot][iLayer][iHit]);
195 fYInter = (m_fbMD[m_iRPot][iLayer][iHit]-m_faMD[m_iRPot][iLayer][iHit]*fbRef[0])/(1-m_faMD[m_iRPot][iLayer][iHit])-fbRef[0];
196 fFibCen = (fYInter+fXInter)/sqrt(2.0);
197
198 for (Int_t bin=0;bin<480;bin++)
199 {
200 Over_n[(int)((fFibCen-0.24)*1000)+bin+36000]++;
201 }
202 }
203 }
204 }
205
206 //Determine maximum
207 iNumU=0;
208 iNumV=0;
209
210 std::vector<int> *vecMaxP = new std::vector<int>;
211 std::vector<int> *vecMaxN = new std::vector<int>;
212
213 for (Int_t i=0;i<72000;i++)
214 {
215 if (Over_p[i]>iNumU) iNumU = Over_p[i];
216 if (Over_n[i]>iNumV) iNumV = Over_n[i];
217 }
218
219 if (iNumU>=m_iUVCut) // If more than m_iUVCut fibers in the maximum we do the reconstruction
220 {
221 for (Int_t i=0; i<NBINTOT; i++)
222 {
223 if (Over_p[i]==iNumU)
224 {
225 vecMaxP->push_back(i);
226 }
227 }
228
229 fMinP = -36.0 + double(vecMaxP->front())*1e-3;
230 fMaxP = -36.0 + double(vecMaxP->back())*1e-3;
231 iMinP_tmp = vecMaxP->front();
232 iMaxP_tmp = vecMaxP->back();
233
234// Making sure that the plateau belongs to the same track
235 iFullWidth = vecMaxP->size();
236
237 for (Int_t i=0; i<iFullWidth; i++)
238 {
239 if (vecMaxP->at(iFullWidth-i-1)-iMinP_tmp < 500)
240 {
241 iMaxP_tmp = vecMaxP->at(iFullWidth-i-1);
242 fMaxP = -36.0 + double(iMaxP_tmp)*1e-3;
243 break;
244 }
245 }
246
247 if ((fMaxP-fMinP)<m_fOverlapCut) //Check for multiple tracks
248 {
249 b_p = fbRef[1]+(fMinP+fMaxP)/sqrt(2.);
250 fOverP = fMaxP-fMinP;
251 }
252 else
253 {
254 b_p = -9999.0;
255 fOverP = -9999.0;
256 }
257 }
258 else
259 {
260 b_p = -9999.0;
261 fOverP = -9999.0;
262 }
263
264 if (iNumV>=m_iUVCut) // If more than m_iUVCut fibers in the maximum we do the reconstruction
265 {
266 for (Int_t i=0; i<NBINTOT; i++)
267 {
268 if (Over_n[i]==iNumV)
269 {
270 vecMaxN->push_back(i);
271 }
272 }
273
274 fMinN = -36.0 + double(vecMaxN->front())*1e-3;
275 fMaxN = -36.0 + double(vecMaxN->back())*1e-3;
276 iMinN_tmp = vecMaxN->front();
277 iMaxN_tmp = vecMaxN->back();
278
279// Making sure that the plateau belongs to the same track
280 iFullWidth = vecMaxN->size();
281
282 for (Int_t i=0; i<iFullWidth; i++)
283 {
284 if (vecMaxN->at(iFullWidth-i-1)-iMinN_tmp < 500)
285 {
286 iMaxN_tmp = vecMaxN->at(iFullWidth-i-1);
287 fMaxN = -36.0 + double(iMaxN_tmp)*1e-3;
288 break;
289 }
290 }
291
292 if ((fMaxN-fMinN)<m_fOverlapCut) //Check for multiple tracks
293 {
294 b_n = fbRef[0]+(fMinN+fMaxN)/sqrt(2.);
295 fOverN = fMaxN-fMinN;
296 }
297 else
298 {
299 b_n = -9999.0;
300 fOverN = -9999.0;
301 }
302 }
303 else
304 {
305 b_n = -9999.0;
306 fOverN = -9999.0;
307 }
308
309// if (b_p!=-9999.0 && b_n!=-9999.0)
310// {
311// if ((b_n+b_p)/2.0<=-135.5 && (iNumU>=m_iUVCut && iNumV>=m_iUVCut))
312// {
313// b_n = -9999.0;
314// b_p = -9999.0;
315// }
316// }
317
318 delete vecMaxP;
319 delete vecMaxN;
320
321 ATH_MSG_DEBUG("endl ALFA_MDTracking::HistFill()");
322}
323
325{
326 ATH_MSG_DEBUG("ALFA_MDTracking::OverLap()");
327
328 Float_t fBMeanN = -9999.0;
329 Float_t fBMeanP = -9999.0;
330 Float_t fOverRegP;
331 Float_t fOverRegN;
332 Int_t iNumU, iNumV;
333
334 //First call, projection on middle fiber for U and V
335 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 0);
336
337 //If first projection worked, we do the ultimate one
338 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0)
339 {
340 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
341 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0)
342 {
343 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
344 }
345 }
346 else
347 {
348 //If first projection worked for p side but not for n, we try to refine n projection using the information from p side
349 if (fBMeanP!=-9999.0 && fBMeanN==-9999.0)
350 {
351 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 1);
352
353 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0)
354 {
355 //if it as worked for both we do the ultimate one
356 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
357 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0) HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
358 }
359 }
360
361 //If first projection worked for p side but not for n, we try to refine n projection using the information from p side
362 if (fBMeanP==-9999.0 && fBMeanN!=-9999.0)
363 {
364 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 2);
365
366 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0)
367 {
368 //if it as worked for both we do the ultimate one
369 HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
370 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0) HistFill(fBMeanP, fBMeanN, fOverRegP, fOverRegN, iNumU, iNumV, 3);
371 }
372 }
373 }
374
375 Float_t fxTmp, fyTmp;
376 Float_t fMinX,fMinY;
377 Float_t fDistX,fDistY;
378// Float_t fDistMinX,fDistMinY;
379 Int_t iHit;
380 Float_t fOverlapU, fOverlapV;
381 Int_t iFibSelX, iFibSelY;
382
383 std::list<int>::iterator iter;
384 if (fBMeanP!=-9999.0 && fBMeanN!=-9999.0)
385 {
386 m_fRecXPos = (fBMeanN-fBMeanP)/2.0;
387 m_fRecYPos = (fBMeanN+fBMeanP)/2.0;
388 fOverlapU = fOverRegP;
389 fOverlapV = fOverRegN;
390
391 for (Int_t iLayer=0; iLayer<ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
392 {
393 fMinX = 0.24/cos(TMath::Pi()/4.0);
394 fMinY = 0.24/cos(TMath::Pi()/4.0);
395
396 iFibSelX = -9999, iFibSelY = -9999;
397 for (iter=m_MapLayers[iLayer].ListFibers.begin(); iter!=m_MapLayers[iLayer].ListFibers.end(); ++iter)
398 {
399 iHit = *iter;
400 fxTmp = (m_fRecYPos-m_fbMD[m_iRPot][iLayer][iHit])/m_faMD[m_iRPot][iLayer][iHit];
401 fyTmp = m_faMD[m_iRPot][iLayer][iHit]*m_fRecXPos+m_fbMD[m_iRPot][iLayer][iHit];
402 fDistX = TMath::Abs(m_fRecXPos-fxTmp);
403 fDistY = TMath::Abs(m_fRecYPos-fyTmp);
404
405 if (fDistX<=fMinX)
406 {
407// fDistMinX = m_fRecXPos-fxTmp;
408 fMinX = fDistX;
409 iFibSelX = iHit;
410 }
411
412 if (fDistY<=fMinY)
413 {
414// fDistMinY = m_fRecYPos-fyTmp;
415 fMinY = fDistY;
416 iFibSelY = iHit;
417 }
418 }
419
420 if (iFibSelX==iFibSelY) m_iFibSel[iLayer] = iFibSelX;
421 }
422 }
423 else
424 {
425 m_fRecXPos = -9999.0;
426 m_fRecYPos = -9999.0;
427 iNumU = 0;
428 iNumV = 0;
429 fOverlapU = -9999.0;
430 fOverlapV = -9999.0;
431 }
432
433 SetData(iNumU, iNumV, fOverlapU, fOverlapV);
434
435 ATH_MSG_DEBUG("end ALFA_MDTracking::OverLap()");
436}
437
438void ALFA_MDTracking::SetData(Int_t iNumU, Int_t iNumV, Float_t fOverlapU, Float_t fOverlapV)
439{
440 ATH_MSG_DEBUG("begin ALFA_MDTracking::SetData()");
441
442 m_iNumU = iNumU;
443 m_iNumV = iNumV;
444 m_fOverlapU = fOverlapU;
445 m_fOverlapV = fOverlapV;
446
447 ATH_MSG_DEBUG("end ALFA_MDTracking::SetData()");
448}
449
450void ALFA_MDTracking::GetData(Int_t &iNumU, Int_t &iNumV, Float_t &fOverlapU, Float_t &fOverlapV, Int_t (&iFibSel)[ALFALAYERSCNT*ALFAPLATESCNT])
451{
452 ATH_MSG_DEBUG("begin ALFA_MDTracking::GetData()");
453
454 iNumU = m_iNumU;
455 iNumV = m_iNumV;
456 fOverlapU = m_fOverlapU;
457 fOverlapV = m_fOverlapV;
458
459 for (Int_t iLayer=0; iLayer<ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
460 {
461 iFibSel[iLayer] = m_iFibSel[iLayer];
462 }
463
464 ATH_MSG_DEBUG("end ALFA_MDTracking::GetData()");
465}
#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