ATLAS Offline Software
Loading...
Searching...
No Matches
ALFA_CenterGravity.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7using namespace std;
8
10 AthMessaging("ALFA_CenterGravity"),
11 m_iRPot (0),
12 m_iTBins (0),
13 m_iRBins (0),
14 m_fbMinU (0.0),
15 m_fbMinV (0.0),
16 m_fFiberD (0.0),
17 m_fzStep (0.0),
18 m_fTLow (0.0),
19 m_fTHigh (0.0),
20 m_fRLow (0.0),
21 m_fRHigh (0.0),
22 m_fHitBU (0.0),
23 m_fHitBV (0.0),
24 m_fRecXPos (0.0),
25 m_fRecYPos (0.0),
26 m_histU_PT (nullptr),
27 m_histV_PT (nullptr)
28{
29 memset(&m_iFHits, 0, sizeof(m_iFHits));
30}
31
36
37StatusCode ALFA_CenterGravity::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])
38{
39 m_iRPot = eRPName - 1;
40 m_ListMDHits = ListMDHits;
41
42 for (Int_t iLayer = 0; iLayer < ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
43 {
44 for (Int_t iFiber = 0; iFiber < ALFAFIBERSCNT; iFiber++)
45 {
46 m_faMD[iLayer][iFiber] = faMD[m_iRPot][iLayer][iFiber];
47 m_fbMD[iLayer][iFiber] = fbMD[m_iRPot][iLayer][iFiber];
48 m_fzMD[iLayer][iFiber] = fzMD[m_iRPot][iLayer][iFiber];
49 }
50 }
51
52 Float_t fzBase = m_fzMD[0][0];
53 m_fbMinU = 1111.0;
54 m_fbMinV = 1111.0;
55
56 for (Int_t iLayer = 0; iLayer < ALFAPLATESCNT*ALFALAYERSCNT; iLayer++)
57 {
58 for (Int_t iFiber = 0; iFiber < ALFAFIBERSCNT; iFiber++)
59 {
60 if ((m_fbMD[iLayer][iFiber] < m_fbMinU) && m_faMD[iLayer][iFiber] < 0)
61 {
62 m_fbMinU = m_fbMD[iLayer][iFiber];
63 }
64
65 if ((m_fbMD[iLayer][iFiber] < m_fbMinV) && m_faMD[iLayer][iFiber] > 0)
66 {
67 m_fbMinV = m_fbMD[iLayer][iFiber];
68 }
69
70 // rescale zPos
71 m_fzMD[iLayer][iFiber] -= fzBase;
72 }
73 }
74
75 m_fFiberD = 0.7071;
76 m_fzStep = 2.0;
77
78 m_fTLow = (1.0/4.0)*M_PI;
79 m_fTHigh = (3.0/4.0)*M_PI;
80 m_fRLow = 0.0;
81 m_fRHigh = 64.0;
82 m_iTBins = 100;
83 m_iRBins = 64;
84
85
87
88 return StatusCode::SUCCESS;
89}
90
92{
93 StatusCode sc;
94
95 // SELECT CANDIDATE HITS
97 if(sc.isFailure())
98 {
99 ATH_MSG_ERROR(" hit selection failure ");
100 return sc;
101 }
102
103 sc = CenterGravity();
104 if(sc.isFailure())
105 {
106 ATH_MSG_ERROR(" CenterGravity failure ");
107 return sc;
108 }
109
110
111 return StatusCode::SUCCESS;
112}
113
114StatusCode ALFA_CenterGravity::Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
115{
116 fRecXPos = m_fRecXPos;
117 fRecYPos = m_fRecYPos;
118
119 HistFinalize();
120
121 return StatusCode::SUCCESS;
122}
123
125{
126 // Reset Histograms
127 m_histU_PT->Reset();
128 m_histV_PT->Reset();
129
130 // U (V) vs Z and Hough Transformed 2D histograms
131 Float_t fU = 0;
132 Float_t fZ = 0;
133 Float_t fRadius = 0;
134 Float_t fTheta = 0;
135
136 FIBERS structFibers;
137 std::map<int, FIBERS> mapLayers;
138 mapLayers.clear();
139 std::list<int>::iterator iterFiber;
140
141 std::list<MDHIT>::const_iterator iter;
142 for (iter=m_ListMDHits.begin(); iter!=m_ListMDHits.end(); ++iter)
143 {
144 if (m_iRPot == (*iter).iRPot)
145 {
146 if(mapLayers.find((*iter).iPlate)==mapLayers.end())
147 {
148 structFibers.ListFibers.clear();
149
150 mapLayers.insert(std::pair<int, FIBERS>((*iter).iPlate, structFibers));
151 mapLayers[(*iter).iPlate].ListFibers.push_back((*iter).iFiber);
152 }
153 else
154 {
155 mapLayers[(*iter).iPlate].ListFibers.push_back((*iter).iFiber);
156 }
157 }
158 }
159
160 for (Int_t iLayer = 0; iLayer < ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
161 {
162 for (iterFiber=mapLayers[iLayer].ListFibers.begin(); iterFiber!=mapLayers[iLayer].ListFibers.end(); ++iterFiber)
163 {
164 if (fmod((double)iLayer,(double)2) == 0) // for U-fibers
165 {
166 fU = (m_fbMD[iLayer][*iterFiber]-m_fbMinU)/m_fFiberD;
167 fZ = m_fzMD[iLayer][*iterFiber]/m_fzStep + 0.5;
168
169 for(Int_t k=0; k < m_iTBins; k++)
170 {
171 fTheta = m_fTLow + (k+0.5)*(m_fTHigh-m_fTLow)/m_iTBins;
172 fRadius = fZ*cos(fTheta)+fU*sin(fTheta);
173
174 m_histU_PT->Fill(fTheta, fRadius, 1.0);
175 }
176 }
177 else // for V-fibers
178 {
179 fU = (m_fbMD[iLayer][*iterFiber]-m_fbMinV)/m_fFiberD;
180 fZ = (m_fzMD[iLayer][*iterFiber]+1.0)/m_fzStep + 0.5;
181
182 for(Int_t k=0; k < m_iTBins; k++)
183 {
184 fTheta = m_fTLow + (k+0.5)*(m_fTHigh-m_fTLow)/m_iTBins;
185 fRadius = fZ*cos(fTheta)+fU*sin(fTheta);
186
187 m_histV_PT->Fill(fTheta, fRadius, 1.0);
188 }
189 }
190 }
191 }
192
193 // Get maximumbin from PT histograms and determine seed track
194 Int_t iULocMax, iULocMay, iULocMaz;
195 Int_t iVLocMax, iVLocMay, iVLocMaz;
196
197 m_histU_PT->GetMaximumBin(iULocMax, iULocMay, iULocMaz);
198 m_histV_PT->GetMaximumBin(iVLocMax, iVLocMay, iVLocMaz);
199
200 // Select Hits closest to seed track ( dr < 2.0 )
201 Float_t fRMinU, fRMinV, fRTmp, fRdr;
202
203 Float_t fRLineU = m_fRLow + (iULocMay-0.5)*(m_fRHigh-m_fRLow)/m_iRBins; // -0.5 since bins start with 1 (first bin, second...)
204 Float_t fRLineV = m_fRLow + (iVLocMay-0.5)*(m_fRHigh-m_fRLow)/m_iRBins;
205
206 Double_t fTLineU = m_fTLow + (iULocMax-0.5)*(m_fTHigh-m_fTLow)/m_iTBins;
207 Double_t fTLineV = m_fTLow + (iVLocMax-0.5)*(m_fTHigh-m_fTLow)/m_iTBins;
208
209
210 Float_t fAlphaU = -cos(fTLineU)/sin(fTLineU);
211 Float_t fAlphaV = -cos(fTLineV)/sin(fTLineV);
212
213 Float_t fBetaU = fRLineU/sin(fTLineU);
214 Float_t fBetaV = fRLineV/sin(fTLineV);
215
216 Float_t fBUMin = fAlphaU*0.0 + fBetaU;
217 Float_t fBUMax = fAlphaU*19.0 + fBetaU;
218
219 Float_t fBVMin = fAlphaV*1.0 + fBetaV;
220 Float_t fBVMax = fAlphaV*20.0 + fBetaV;
221
222 m_fHitBU = (fBUMax-fBUMin)/2.0 + fBUMin;
223 m_fHitBV = (fBVMax-fBVMin)/2.0 + fBVMin;
224
225 for (Int_t iLayer = 0; iLayer < ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
226 {
227 //fRMinU = fRMinV = 2.0;
228 fRMinU = fRMinV = 0.5;
229 m_iFHits[iLayer] = -9999;
230
231 for (iterFiber=mapLayers[iLayer].ListFibers.begin(); iterFiber!=mapLayers[iLayer].ListFibers.end(); ++iterFiber)
232 {
233 if (fmod((double)iLayer,(double)2) == 0) // for U-fibers
234 {
235 fU = (m_fbMD[iLayer][*iterFiber]-m_fbMinU)/m_fFiberD;
236 fZ = m_fzMD[iLayer][*iterFiber]/m_fzStep + 0.5;
237
238 fRTmp = fZ*cos(fTLineU) + fU*sin(fTLineU);
239 fRdr = fabs(fRLineU - fRTmp);
240
241 if (fRdr < fRMinU)
242 {
243 fRMinU = fRdr;
244 m_iFHits[iLayer] = *iterFiber;
245 }
246 }
247 else // for V-fibers
248 {
249 fU = (m_fbMD[iLayer][*iterFiber]-m_fbMinV)/m_fFiberD;
250 fZ = (m_fzMD[iLayer][*iterFiber]+1.0)/m_fzStep + 0.5;
251
252 fRTmp = fZ*cos(fTLineV) + fU*sin(fTLineV);
253 fRdr = fabs(fRLineV - fRTmp);
254
255 if (fRdr < fRMinV)
256 {
257 fRMinV = fRdr;
258 m_iFHits[iLayer] = *iterFiber;
259 }
260 }
261 }
262 }
263
264 return StatusCode::SUCCESS;
265}
266
268{
269 Int_t n_p = 0;
270 Int_t n_n = 0;
271 Float_t faMeanP = 0;
272 Float_t fbMeanP = 0;
273 Float_t faMeanN = 0;
274 Float_t fbMeanN = 0;
275
276 // Layer loop
277 for(Int_t iLayer = 0; iLayer < ALFAPLATESCNT*ALFALAYERSCNT; iLayer++)
278 {
279 if(m_iFHits[iLayer]!= -9999)
280 {
281 // Separate pos. and neg. slope layers
282 if(m_faMD[iLayer][1] >= 0)
283 {
284 faMeanP = faMeanP + m_faMD[iLayer][m_iFHits[iLayer]];
285 fbMeanP = fbMeanP + m_fbMD[iLayer][m_iFHits[iLayer]]; // + 0.07071; // due to the staggering - see my ALFA talk from 18.02.2008
286 n_p++;
287 }
288 else
289 {
290 faMeanN = faMeanN + m_faMD[iLayer][m_iFHits[iLayer]];
291 fbMeanN = fbMeanN + m_fbMD[iLayer][m_iFHits[iLayer]]; // - 0.07071;
292 n_n++;
293 }
294 }
295 }
296
297 // At least one hit in pos. and neg. slope layer
298 if((n_p>=1)&&(n_n>=1))
299 {
300 faMeanP = faMeanP/n_p;
301 fbMeanP = fbMeanP/n_p;
302 faMeanN = faMeanN/n_n;
303 fbMeanN = fbMeanN/n_n;
304
305 if(faMeanP == faMeanN)
306 {
307 ATH_MSG_DEBUG("something goes wrong, faMeanP = faMeanN ");
308 }
309
310 m_fRecXPos = (fbMeanN - fbMeanP)/(faMeanP - faMeanN);
311 m_fRecYPos = faMeanP * m_fRecXPos + fbMeanP;
312 }
313 else
314 {
315 m_fRecXPos = -9999;
316 m_fRecYPos = -9999;
317 }
318
319 return StatusCode::SUCCESS;
320}
321
322
324{
325 m_histU_PT = new TH2D("histU_PT", "Hough Trans. of U", m_iTBins, m_fTLow, m_fTHigh, m_iRBins, m_fRLow, m_fRHigh);
326 m_histV_PT = new TH2D("histV_PT", "Hough Trans. of V", m_iTBins, m_fTLow, m_fTHigh, m_iRBins, m_fRLow, m_fRHigh);
327}
328
330{
331 if (m_histU_PT!=nullptr) delete m_histU_PT;
332 if (m_histV_PT!=nullptr) delete m_histV_PT;
333 m_histU_PT = nullptr;
334 m_histV_PT = nullptr;
335}
336
338{
339 for (Int_t iLayer=0; iLayer<ALFALAYERSCNT*ALFAPLATESCNT; iLayer++)
340 {
341 iFibSel[iLayer] = m_iFHits[iLayer];
342 }
343}
#define RPOTSCNT
struct _FIBERS FIBERS
#define ALFALAYERSCNT
#define ALFAPLATESCNT
#define ALFAFIBERSCNT
#define M_PI
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
static Double_t sc
Float_t m_fbMD[ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT]
Float_t m_faMD[ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT]
void GetData(Int_t(&iFibSel)[ALFALAYERSCNT *ALFAPLATESCNT])
std::list< MDHIT > m_ListMDHits
StatusCode Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
Float_t m_fzMD[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])
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
STL namespace.
std::list< int > ListFibers