Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 
7 using 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 
33 {
34 
35 }
36 
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
96  sc = SelectHitInLayer();
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 
114 StatusCode 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 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
ALFA_CenterGravity::m_fRecXPos
Float_t m_fRecXPos
Definition: ALFA_CenterGravity.h:51
ALFA_CenterGravity::HistInitialize
void HistInitialize()
Definition: ALFA_CenterGravity.cxx:323
ALFA_CenterGravity::m_fTLow
Float_t m_fTLow
Definition: ALFA_CenterGravity.h:43
ALFA_CenterGravity::m_fRHigh
Float_t m_fRHigh
Definition: ALFA_CenterGravity.h:46
ALFA_CenterGravity::m_iTBins
Int_t m_iTBins
Definition: ALFA_CenterGravity.h:34
ALFA_CenterGravity::m_iRPot
Int_t m_iRPot
Definition: ALFA_CenterGravity.h:32
ALFAFIBERSCNT
#define ALFAFIBERSCNT
Definition: ALFA_constants.h:10
eRPotName
eRPotName
Definition: ALFA_GeometryReader.h:27
_FIBERS
Definition: ALFA_LocRec/ALFA_UserObjects.h:30
M_PI
#define M_PI
Definition: ActiveFraction.h:11
RPOTSCNT
#define RPOTSCNT
Definition: ALFA_CLinkAlg.h:26
ALFA_CenterGravity::m_fRecYPos
Float_t m_fRecYPos
Definition: ALFA_CenterGravity.h:52
ALFA_CenterGravity::m_faMD
Float_t m_faMD[ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT]
Definition: ALFA_CenterGravity.h:58
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
ALFA_CenterGravity::m_fHitBV
Float_t m_fHitBV
Definition: ALFA_CenterGravity.h:49
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ALFA_CenterGravity::m_fbMinU
Float_t m_fbMinU
Definition: ALFA_CenterGravity.h:38
ALFA_CenterGravity::Initialize
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])
Definition: ALFA_CenterGravity.cxx:37
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ALFA_CenterGravity.h
ALFA_CenterGravity::SelectHitInLayer
StatusCode SelectHitInLayer()
Definition: ALFA_CenterGravity.cxx:124
ALFA_CenterGravity::m_fFiberD
Float_t m_fFiberD
Definition: ALFA_CenterGravity.h:40
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
ALFA_CenterGravity::m_fbMD
Float_t m_fbMD[ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT]
Definition: ALFA_CenterGravity.h:59
_FIBERS::ListFibers
std::list< int > ListFibers
Definition: ALFA_LocRec/ALFA_UserObjects.h:31
ALFA_CenterGravity::~ALFA_CenterGravity
~ALFA_CenterGravity()
Definition: ALFA_CenterGravity.cxx:32
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
ALFALAYERSCNT
#define ALFALAYERSCNT
Definition: ALFA_constants.h:8
ALFA_CenterGravity::m_fzStep
Float_t m_fzStep
Definition: ALFA_CenterGravity.h:41
ALFA_CenterGravity::m_fbMinV
Float_t m_fbMinV
Definition: ALFA_CenterGravity.h:39
ALFA_CenterGravity::GetData
void GetData(Int_t(&iFibSel)[ALFALAYERSCNT *ALFAPLATESCNT])
Definition: ALFA_CenterGravity.cxx:337
ALFA_CenterGravity::m_fHitBU
Float_t m_fHitBU
Definition: ALFA_CenterGravity.h:48
ALFA_CenterGravity::ALFA_CenterGravity
ALFA_CenterGravity()
Definition: ALFA_CenterGravity.cxx:9
ALFA_CenterGravity::Finalize
StatusCode Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
Definition: ALFA_CenterGravity.cxx:114
ALFA_CenterGravity::m_histU_PT
TH2D * m_histU_PT
Definition: ALFA_CenterGravity.h:63
ALFA_CenterGravity::m_ListMDHits
std::list< MDHIT > m_ListMDHits
Definition: ALFA_CenterGravity.h:67
ALFA_CenterGravity::m_iRBins
Int_t m_iRBins
Definition: ALFA_CenterGravity.h:35
ALFA_CenterGravity::m_histV_PT
TH2D * m_histV_PT
Definition: ALFA_CenterGravity.h:64
ALFA_CenterGravity::m_fzMD
Float_t m_fzMD[ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT]
Definition: ALFA_CenterGravity.h:60
ALFA_CenterGravity::Execute
StatusCode Execute()
Definition: ALFA_CenterGravity.cxx:91
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
ALFA_CenterGravity::CenterGravity
StatusCode CenterGravity()
Definition: ALFA_CenterGravity.cxx:267
ALFA_CenterGravity::m_fRLow
Float_t m_fRLow
Definition: ALFA_CenterGravity.h:45
ALFA_CenterGravity::m_fTHigh
Float_t m_fTHigh
Definition: ALFA_CenterGravity.h:44
ALFA_CenterGravity::HistFinalize
void HistFinalize()
Definition: ALFA_CenterGravity.cxx:329
ALFA_CenterGravity::m_iFHits
Int_t m_iFHits[20]
Definition: ALFA_CenterGravity.h:55
ALFAPLATESCNT
#define ALFAPLATESCNT
Definition: ALFA_constants.h:9
fitman.k
k
Definition: fitman.py:528