ATLAS Offline Software
Loading...
Searching...
No Matches
ALFA_MDOverlap.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6using namespace std;
7
9 AthMessaging("ALFA_MDOverlap"),
10 m_iRPot (0),
11 m_iTBins (0),
12 m_iRBins (0),
13 m_fbMinU (0.0),
14 m_fbMinV (0.0),
15 m_fFiberD (0.0),
16 m_fzStep (0.0),
17 m_fTLow (0.0),
18 m_fTHigh (0.0),
19 m_fRLow (0.0),
20 m_fRHigh (0.0),
21 m_fHitBU (0.0),
22 m_fHitBV (0.0),
23 m_fRecXPos (0.0),
24 m_fRecYPos (0.0),
25 m_histU_PT (nullptr),
26 m_histV_PT (nullptr)
27{
28 memset(&m_iFHits, 0, sizeof(m_iFHits));
29}
30
35
36StatusCode ALFA_MDOverlap::Initialize(const eRPotName &eRPName, const std::list<MDHIT> &ListMDHits, Float_t faMD[RPOTSCNT][ALFALAYERSCNT*ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT*ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fzMD[RPOTSCNT][ALFALAYERSCNT*ALFAPLATESCNT][ALFAFIBERSCNT])
37{
38 m_iRPot = eRPName - 1;
39 m_ListMDHits = ListMDHits;
40
41 for (Int_t iLayer = 0; iLayer < ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
42 {
43 for (Int_t iFiber = 0; iFiber < ALFAFIBERSCNT; iFiber++)
44 {
45 m_faMD[iLayer][iFiber] = faMD[m_iRPot][iLayer][iFiber];
46 m_fbMD[iLayer][iFiber] = fbMD[m_iRPot][iLayer][iFiber];
47 m_fzMD[iLayer][iFiber] = fzMD[m_iRPot][iLayer][iFiber];
48 }
49 }
50
51 Float_t fzBase = m_fzMD[0][0];
52 m_fbMinU = 1111.0;
53 m_fbMinV = 1111.0;
54
55 for (Int_t iLayer = 0; iLayer < ALFAPLATESCNT*ALFALAYERSCNT; iLayer++)
56 {
57 for (Int_t iFiber = 0; iFiber < ALFAFIBERSCNT; iFiber++)
58 {
59 if ((m_fbMD[iLayer][iFiber] < m_fbMinU) && m_faMD[iLayer][iFiber] < 0)
60 {
61 m_fbMinU = m_fbMD[iLayer][iFiber];
62 }
63
64 if ((m_fbMD[iLayer][iFiber] < m_fbMinV) && m_faMD[iLayer][iFiber] > 0)
65 {
66 m_fbMinV = m_fbMD[iLayer][iFiber];
67 }
68
69 // rescale zPos
70 m_fzMD[iLayer][iFiber] -= fzBase;
71 }
72 }
73
74 m_fFiberD = 0.7071;
75 m_fzStep = 2.0;
76
77 m_fTLow = (1.0/4.0)*M_PI;
78 m_fTHigh = (3.0/4.0)*M_PI;
79 m_fRLow = 0.0;
80 m_fRHigh = 64.0;
81 m_iTBins = 100;
82 m_iRBins = 64;
83
84
86
87 return StatusCode::SUCCESS;
88}
89
91{
92 StatusCode sc;
93
94 // SELECT CANDIDATE HITS
96 if(sc.isFailure())
97 {
98 ATH_MSG_ERROR("hit selection failure");
99 return sc;
100 }
101
102 sc = Overlap();
103 if(sc.isFailure())
104 {
105 ATH_MSG_ERROR("Overlap failure");
106 return sc;
107 }
108
109
110 return StatusCode::SUCCESS;
111}
112
113StatusCode ALFA_MDOverlap::Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
114{
115 fRecXPos = m_fRecXPos;
116 fRecYPos = m_fRecYPos;
117
118 HistFinalize();
119
120 return StatusCode::SUCCESS;
121}
122
124{
125 // Reset Histograms
126 m_histU_PT->Reset();
127 m_histV_PT->Reset();
128
129 // U (V) vs Z and Hough Transformed 2D histograms
130 Float_t fU = 0;
131 Float_t fZ = 0;
132 Float_t fRadius = 0;
133 Float_t fTheta = 0;
134
135 FIBERS structFibers;
136 std::map<int, FIBERS> mapLayers;
137
138 std::list<int>::iterator iterFiber;
139 Int_t iHitFiber;
140
141 mapLayers.clear();
142
143 std::list<MDHIT>::const_iterator iter;
144 for (iter=m_ListMDHits.begin(); iter!=m_ListMDHits.end(); ++iter)
145 {
146 if (m_iRPot == (*iter).iRPot)
147 {
148 if(mapLayers.find((*iter).iPlate)==mapLayers.end())
149 {
150 structFibers.ListFibers.clear();
151
152 mapLayers.insert(std::pair<int, FIBERS>((*iter).iPlate, structFibers));
153 mapLayers[(*iter).iPlate].ListFibers.push_back((*iter).iFiber);
154 }
155 else
156 {
157 mapLayers[(*iter).iPlate].ListFibers.push_back((*iter).iFiber);
158 }
159 }
160 }
161
162 for (Int_t iLayer = 0; iLayer < ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
163 {
164 for (iterFiber=mapLayers[iLayer].ListFibers.begin(); iterFiber!=mapLayers[iLayer].ListFibers.end(); ++iterFiber)
165 {
166 iHitFiber = *iterFiber;
167
168 if (fmod((double)iLayer,(double)2) == 0) // for U-fibers
169 {
170 fU = (m_fbMD[iLayer][iHitFiber]-m_fbMinU)/m_fFiberD;
171 fZ = m_fzMD[iLayer][iHitFiber]/m_fzStep + 0.5;
172
173 for(Int_t k=0; k < m_iTBins; k++)
174 {
175 fTheta = m_fTLow + (k+0.5)*(m_fTHigh-m_fTLow)/m_iTBins;
176 fRadius = fZ*cos(fTheta)+fU*sin(fTheta);
177
178 m_histU_PT->Fill(fTheta, fRadius, 1.0);
179 }
180 }
181 else // for V-fibers
182 {
183 fU = (m_fbMD[iLayer][iHitFiber]-m_fbMinV)/m_fFiberD;
184 fZ = (m_fzMD[iLayer][iHitFiber]+1.0)/m_fzStep + 0.5;
185
186 for(Int_t k=0; k < m_iTBins; k++)
187 {
188 fTheta = m_fTLow + (k+0.5)*(m_fTHigh-m_fTLow)/m_iTBins;
189 fRadius = fZ*cos(fTheta)+fU*sin(fTheta);
190
191 m_histV_PT->Fill(fTheta, fRadius, 1.0);
192 }
193 }
194 }
195 }
196
197 // Get maximumbin from PT histograms and determine seed track
198 Int_t iULocMax, iULocMay, iULocMaz;
199 Int_t iVLocMax, iVLocMay, iVLocMaz;
200
201 m_histU_PT->GetMaximumBin(iULocMax, iULocMay, iULocMaz);
202 m_histV_PT->GetMaximumBin(iVLocMax, iVLocMay, iVLocMaz);
203
204 // Select Hits closest to seed track ( dr < 2.0 )
205 Float_t fRMinU, fRMinV, fRTmp, fRdr;
206
207 Float_t fRLineU = m_fRLow + (iULocMay-0.5)*(m_fRHigh-m_fRLow)/m_iRBins; // -0.5 since bins start with 1 (first bin, second...)
208 Float_t fRLineV = m_fRLow + (iVLocMay-0.5)*(m_fRHigh-m_fRLow)/m_iRBins;
209
210 Double_t fTLineU = m_fTLow + (iULocMax-0.5)*(m_fTHigh-m_fTLow)/m_iTBins;
211 Double_t fTLineV = m_fTLow + (iVLocMax-0.5)*(m_fTHigh-m_fTLow)/m_iTBins;
212
213 Float_t fAlphaU = -cos(fTLineU)/sin(fTLineU);
214 Float_t fAlphaV = -cos(fTLineV)/sin(fTLineV);
215
216 Float_t fBetaU = fRLineU/sin(fTLineU);
217 Float_t fBetaV = fRLineV/sin(fTLineV);
218
219 Float_t fBUMin = fAlphaU*0.0 + fBetaU;
220 Float_t fBUMax = fAlphaU*19.0 + fBetaU;
221
222 Float_t fBVMin = fAlphaV*1.0 + fBetaV;
223 Float_t fBVMax = fAlphaV*20.0 + fBetaV;
224
225 m_fHitBU = (fBUMax-fBUMin)/2.0 + fBUMin;
226 m_fHitBV = (fBVMax-fBVMin)/2.0 + fBVMin;
227
228 for (Int_t iLayer = 0; iLayer < ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
229 {
230 fRMinU = 2.0;
231 fRMinV = 2.0;
232 m_iFHits[iLayer] = -9999;
233
234 for (iterFiber=mapLayers[iLayer].ListFibers.begin(); iterFiber!=mapLayers[iLayer].ListFibers.end(); ++iterFiber)
235 {
236 iHitFiber = *iterFiber;
237
238 if (fmod((double)iLayer,(double)2) == 0) // for U-fibers
239 {
240 fU = (m_fbMD[iLayer][iHitFiber]-m_fbMinU)/m_fFiberD;
241 fZ = m_fzMD[iLayer][iHitFiber]/m_fzStep + 0.5;
242
243 fRTmp = fZ*cos(fTLineU) + fU*sin(fTLineU);
244 fRdr = fabs(fRLineU - fRTmp);
245
246 if (fRdr < fRMinU)
247 {
248 fRMinU = fRdr;
249 m_iFHits[iLayer] = iHitFiber;
250 }
251 }
252 else // for V-fibers
253 {
254 fU = (m_fbMD[iLayer][iHitFiber]-m_fbMinV)/m_fFiberD;
255 fZ = (m_fzMD[iLayer][iHitFiber]+1.0)/m_fzStep + 0.5;
256
257 fRTmp = fZ*cos(fTLineV) + fU*sin(fTLineV);
258 fRdr = fabs(fRLineV - fRTmp);
259
260 if (fRdr < fRMinV)
261 {
262 fRMinV = fRdr;
263 m_iFHits[iLayer] = iHitFiber;
264 }
265 }
266 }
267 }
268
269 return StatusCode::SUCCESS;
270}
271
273{
274 Int_t n_p = 0;
275 Int_t n_n = 0;
276 Float_t faMeanP = 0;
277 Float_t fbMeanP = 0;
278 Float_t faMeanN = 0;
279 Float_t fbMeanN = 0;
280
281 Float_t fbMinP, fbMaxP, fbMinN, fbMaxN;
282 Float_t fActive = 0.48;
283 Float_t fHalfStep = 0;
284
285 for(Int_t iLayer = 0; iLayer < ALFAPLATESCNT*ALFALAYERSCNT; iLayer++)
286 {
287 if(m_iFHits[iLayer]!= -9999)
288 {
289 if(m_faMD[iLayer][0] >= 0)
290 {
291 fbMeanP += m_fbMD[iLayer][m_iFHits[iLayer]];
292 ++n_p;
293 }
294 else
295 {
296 fbMeanN += m_fbMD[iLayer][m_iFHits[iLayer]];
297 ++n_n;
298 }
299 }
300 }
301
302 if ((n_p >= 1) && (n_n >= 1))
303 {
304 fbMeanP = fbMeanP / n_p + 0.07071;
305 fbMeanN = fbMeanN / n_n - 0.07071;
306 }
307
308 // these mean b values are just used to generate reasonable start values
309 // and to avoid that one starts from a bad (i.e. cross talk) fiber
310 fbMinP = fbMeanP + fActive;
311 fbMaxP = fbMeanP - fActive;
312 fbMinN = fbMeanN + fActive;
313 fbMaxN = fbMeanN - fActive;
314
315 Int_t iLayMinU = -9999;
316 Int_t iLayMaxU = -9999;
317 Int_t iLayMinV = -9999;
318 Int_t iLayMaxV = -9999;
319
320 // now find minimum overlap in b values, separately for positive and
321 // negative slopes
322
323 n_p = 0;
324 n_n = 0;
325 for(Int_t iLayer = 0; iLayer < ALFAPLATESCNT*ALFALAYERSCNT; iLayer++)
326 {
327 if(iLayer>=0 && m_iFHits[iLayer]!= -9999)
328 {
329 if(m_faMD[iLayer][0] >= 0)
330 {
331 fHalfStep = fabs(0.5*fActive/sin(atan(m_faMD[iLayer][m_iFHits[iLayer]])));
332
333 if (m_fbMD[iLayer][m_iFHits[iLayer]] + fHalfStep > fbMaxP)
334 {
335 if (fbMinP > m_fbMD[iLayer][m_iFHits[iLayer]] + fHalfStep)
336 {
337 fbMinP = m_fbMD[iLayer][m_iFHits[iLayer]] + fHalfStep;
338 iLayMinU = iLayer;
339 }
340 }
341
342 if (m_fbMD[iLayer][m_iFHits[iLayer]] - fHalfStep < fbMinP)
343 {
344 if (fbMaxP > m_fbMD[iLayer][m_iFHits[iLayer]] - fHalfStep)
345 {
346 }
347 else
348 {
349 fbMaxP = m_fbMD[iLayer][m_iFHits[iLayer]] - fHalfStep;
350 iLayMaxU = iLayer;
351 }
352 }
353
354 faMeanP = faMeanP + m_faMD[iLayer][m_iFHits[iLayer]];
355 ++n_p;
356 }
357 else
358 {
359 fHalfStep = fabs(0.5*fActive/sin(atan(m_faMD[iLayer][m_iFHits[iLayer]])));
360
361 if (m_fbMD[iLayer][m_iFHits[iLayer]] + fHalfStep > fbMaxN)
362 {
363 if (fbMinN > m_fbMD[iLayer][m_iFHits[iLayer]] + fHalfStep)
364 {
365 fbMinN =m_fbMD[iLayer][m_iFHits[iLayer]] + fHalfStep;
366 iLayMinV = iLayer;
367 }
368 }
369
370 if (m_fbMD[iLayer][m_iFHits[iLayer]] - fHalfStep < fbMinN)
371 {
372 if (fbMaxN > m_fbMD[iLayer][m_iFHits[iLayer]] - fHalfStep)
373 {
374 }
375 else
376 {
377 fbMaxN = m_fbMD[iLayer][m_iFHits[iLayer]] - fHalfStep;
378 iLayMaxV = iLayer;
379 }
380 }
381
382 faMeanN = faMeanN + m_faMD[iLayer][m_iFHits[iLayer]];
383 ++n_n;
384 }
385 }
386 }
387
388 Double_t fPolyX[4];
389 Double_t fPolyY[4];
390
391// Float_t OL_x;
392// Float_t OL_y;
393
394 if (iLayMinU>=0 && iLayMaxU>=0 && iLayMinV>=0 && iLayMaxV>=0)
395 {
396 fPolyX[0] = (m_fbMD[iLayMinU][m_iFHits[iLayMinU]] - m_fbMD[iLayMinV][m_iFHits[iLayMinV]])/(m_faMD[iLayMinV][m_iFHits[iLayMinV]] - m_faMD[iLayMinU][m_iFHits[iLayMinU]]);
397 fPolyY[0] = m_faMD[iLayMinU][m_iFHits[iLayMinU]]*fPolyX[0] + m_fbMD[iLayMinU][m_iFHits[iLayMinU]] + fActive*0.707/2.0;
398
399 fPolyX[1] = (m_fbMD[iLayMinU][m_iFHits[iLayMinU]] - m_fbMD[iLayMaxV][m_iFHits[iLayMaxV]] + fActive*0.707)/(m_faMD[iLayMaxV][m_iFHits[iLayMaxV]] - m_faMD[iLayMinU][m_iFHits[iLayMinU]]);
400 fPolyY[1] = m_faMD[iLayMinU][m_iFHits[iLayMinU]]*fPolyX[1] + m_fbMD[iLayMinU][m_iFHits[iLayMinU]] + fActive*0.707/2.0;
401
402 fPolyX[2] = (m_fbMD[iLayMaxU][m_iFHits[iLayMaxU]] - m_fbMD[iLayMinV][m_iFHits[iLayMinV]] - fActive*0.707)/(m_faMD[iLayMinV][m_iFHits[iLayMinV]] - m_faMD[iLayMaxU][m_iFHits[iLayMaxU]]);
403 fPolyY[2] = m_faMD[iLayMaxU][m_iFHits[iLayMaxU]]*fPolyX[2] + m_fbMD[iLayMaxU][m_iFHits[iLayMaxU]] - fActive*0.707/2.0;
404
405 fPolyX[3] = (m_fbMD[iLayMaxU][m_iFHits[iLayMaxU]] - m_fbMD[iLayMaxV][m_iFHits[iLayMaxV]])/(m_faMD[iLayMaxV][m_iFHits[iLayMaxV]] - m_faMD[iLayMaxU][m_iFHits[iLayMaxU]]);
406 fPolyY[3] = m_faMD[iLayMaxU][m_iFHits[iLayMaxU]]*fPolyX[3] + m_fbMD[iLayMaxU][m_iFHits[iLayMaxU]] - fActive*0.707/2.0;
407
408 m_fRecXPos = (fPolyX[0] + fPolyX[1] + fPolyX[2] + fPolyX[3])/4.0;
409 m_fRecYPos = (fPolyY[0] + fPolyY[1] + fPolyY[2] + fPolyY[3])/4.0;
410
411// OL_x = (fabs(fPolyX[0] - m_fRecXPos) + fabs(fPolyX[1] - m_fRecXPos) + fabs(fPolyX[2] - m_fRecXPos) + fabs(fPolyX[3] - m_fRecXPos))/4.0;
412// OL_y = (fabs(fPolyY[0] - m_fRecYPos) + fabs(fPolyY[1] - m_fRecYPos) + fabs(fPolyY[2] - m_fRecYPos) + fabs(fPolyY[3] - m_fRecYPos))/4.0;
413 }
414 else
415 {
416 m_fRecXPos = -9999.0;
417 m_fRecYPos = -9999.0;
418
419// OL_x = -9999.0;
420// OL_y = -9999.0;
421 }
422
423 return StatusCode::SUCCESS;
424}
425
426
428{
429 m_histU_PT = new TH2D("histU_PT", "Hough Trans. of U", m_iTBins, m_fTLow, m_fTHigh, m_iRBins, m_fRLow, m_fRHigh);
430 m_histV_PT = new TH2D("histV_PT", "Hough Trans. of V", m_iTBins, m_fTLow, m_fTHigh, m_iRBins, m_fRLow, m_fRHigh);
431}
432
434{
435 delete m_histU_PT;
436 delete m_histV_PT;
437}
438
440{
441 for (Int_t iLayer=0; iLayer<ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
442 {
443 iFibSel[iLayer] = m_iFHits[iLayer];
444 }
445}
#define RPOTSCNT
struct _FIBERS FIBERS
#define ALFALAYERSCNT
#define ALFAPLATESCNT
#define ALFAFIBERSCNT
#define M_PI
#define ATH_MSG_ERROR(x)
static Double_t sc
Int_t m_iFHits[ALFALAYERSCNT *ALFAPLATESCNT]
Float_t m_faMD[ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT]
StatusCode Initialize(const eRPotName &eRPName, const std::list< MDHIT > &ListMDHits, Float_t faMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fzMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT])
Float_t m_fbMD[ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT]
StatusCode Execute()
StatusCode Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
std::list< MDHIT > m_ListMDHits
Float_t m_fzMD[ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT]
StatusCode Overlap()
void GetData(Int_t(&iFibSel)[ALFALAYERSCNT *ALFAPLATESCNT])
StatusCode SelectHitInLayer()
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
STL namespace.
std::list< int > ListFibers