ATLAS Offline Software
ALFA_ODTracking.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 
7 using namespace std;
8 
10  AthMessaging("ALFA_ODTracking")
11 {
12  m_listResults.clear();
13 
15  m_fDistanceCut = 0.0;
16  m_iLayerCut = 0;
17  m_iDataType = 0;
18 
19  memset(&m_iFibSel, 0, sizeof(m_iFibSel));
20  std::fill_n(&m_iFibSel[0][0], sizeof(m_iFibSel)/sizeof(Int_t), 9999);
21 }
22 
24 {
25  m_listResults.clear();
26 }
27 
28 StatusCode ALFA_ODTracking::Initialize(Int_t iMultiplicityCut, Float_t fDistanceCut, Int_t iLayerCut, Int_t iDataType)
29 {
30  m_iMultiplicityCut = (int)iMultiplicityCut;
31  m_fDistanceCut = fDistanceCut;
32  m_iLayerCut = iLayerCut;
33  m_iDataType = iDataType;
34 
35  return StatusCode::SUCCESS;
36 }
37 
38 StatusCode ALFA_ODTracking::Execute(Int_t iRPot, const std::list<ODHIT> &ListODHits, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT])
39 {
40  Int_t iLayer;
41  FIBERS structFibers;
42  std::map<int, FIBERS> MapLayers;
43  MapLayers.clear();
44  std::list<ODHIT>::const_iterator iter;
45  for (iter=ListODHits.begin(); iter!=ListODHits.end(); ++iter)
46  {
47  if (iRPot == (*iter).iRPot)
48  {
49  iLayer = 2*(*iter).iPlate + (*iter).iSide;
50  if(MapLayers.find(iLayer)==MapLayers.end())
51  {
52  structFibers.ListFibers.clear();
53  MapLayers.insert(std::pair<int, FIBERS>(iLayer, structFibers));
54  MapLayers[iLayer].ListFibers.push_back((*iter).iFiber);
55  }
56  else
57  {
58  MapLayers[iLayer].ListFibers.push_back((*iter).iFiber);
59  }
60  }
61  }
62 
63  memset(&m_iMulti, 0, sizeof(m_iMulti));
64 
65  Int_t iSide, iPlate;
66  Int_t iMaxLay = ODSIDESCNT*ODPLATESCNT;
67  for (Int_t iLayer=0; iLayer<iMaxLay; iLayer++)
68  {
69  iPlate = iLayer/2;
70  iSide = iLayer%2;
71  m_iMulti[iSide][iPlate] = MapLayers[iLayer].ListFibers.size();
72  }
73 
74  FiberProjection(iRPot, MapLayers, faOD, fbOD);
75 // FindingPosition(iRPot, MapLayers, faOD, fbOD);
76 
77  return StatusCode::SUCCESS;
78 }
79 
80 StatusCode ALFA_ODTracking::Finalize(std::list<ODRESULT>* pListResults)
81 {
82  *pListResults = m_listResults;
83 
84  return StatusCode::SUCCESS;
85 }
86 
87 void ALFA_ODTracking::FiberProjection(Int_t iRPot, std::map<int, FIBERS> &MapLayers, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT])
88 {
89  const Int_t NBINTOT = 17000;
90  Int_t iSign;
91  Int_t iHitLayer[ODSIDESCNT][NBINTOT];
92  Float_t fPosition;
93  Float_t fFiberXPos = 23;
94 
95  fFiberXPos = (m_iDataType==1)? 22 : 23;
96 
97  std::list<int>::const_iterator iIter;
98 
100 
101  for (Int_t iSide=0; iSide<ODSIDESCNT; iSide++)
102  {
103  Results.iSide = -1;
104  Results.fRecPos = -9999.0;
105  Results.fOverY = -9999.0;
106  Results.iNumY = -1;
107 
108  iSign = (iSide==0)? -1 : 1;
109 
110  for (Int_t iBin=0; iBin<NBINTOT; iBin++)
111  {
112  iHitLayer[iSide][iBin] = 0;
113  }
114 
115  for (Int_t iPlate=0; iPlate<ODPLATESCNT; iPlate++)
116  {
117  //multiplicity cut
118  if (MapLayers[2*iPlate+iSide].ListFibers.size()<=(UInt_t)m_iMultiplicityCut && !MapLayers[2*iPlate+iSide].ListFibers.empty())
119  {
120  //Making the projections
121  for (iIter=MapLayers[2*iPlate+iSide].ListFibers.begin(); iIter!=MapLayers[2*iPlate+iSide].ListFibers.end(); ++iIter)
122  {
123 // cout << "iPot, iPlate, iSide, iFiber = " << iRPot << ", " << iPlate << ", " << iSide << ", " << *iIter << endl;
124  fPosition = -1*(iSign*fFiberXPos*faOD[iRPot][iPlate][iSide][*iIter] + fbOD[iRPot][iPlate][iSide][*iIter]);
125  for (Int_t iBin=0; iBin<480; iBin++)
126  {
127  iHitLayer[iSide][(int)(((fPosition-0.24)*1000)+iBin-128000)]++;
128  }
129  }
130  }
131  }
132 
133  Int_t iNum = 0;
134  std::vector<int> *vecMaxHit = new std::vector<int>;
135 
136  //Determining the maximum overlap between fibers
137  for (Int_t iBin=0; iBin<NBINTOT; iBin++)
138  {
139  if (iHitLayer[iSide][iBin]>iNum) iNum = iHitLayer[iSide][iBin];
140  }
141 
142  //Determining the position and the width of the maximum
143  //iNum = <0;3> depends on the count of hit layers
144  if (iNum>=m_iLayerCut)
145  {
146  for (Int_t iBin=0; iBin<NBINTOT; iBin++)
147  {
148  if (iHitLayer[iSide][iBin]==iNum)
149  {
150  vecMaxHit->push_back(iBin);
151  }
152  }
153 
154  Float_t fHitMinPos, fHitMaxPos;
155 // Int_t iHitMinPos_tmp, iHitMaxPos_tmp;
156 // Int_t iFullWidth;
157 
158  fHitMinPos = -128.0 - (double)(vecMaxHit->front())*1e-3;
159  fHitMaxPos = -128.0 - (double)(vecMaxHit->back())*1e-3;
160 
161 // iHitMinPos_tmp = vecMaxHit->front();
162 // iHitMaxPos_tmp = vecMaxHit->back();
163 
164  // Making sure that the plateau belongs to the same track
165 // iFullWidth = vecMaxHit->size();
166 
167 // for (Int_t i=0; i<iFullWidth; i++)
168 // {
169 // if (vecMaxHit->at(iFullWidth-i-1)-iHitMinPos_tmp < 500)
170 // {
171 // iHitMaxPos_tmp = vecMaxHit->at(iFullWidth-i-1);
172 // fHitMaxPos = -128.0 - (double)(iHitMaxPos_tmp)*1e-3;
173 // break;
174 // }
175 // }
176 
177  if ((fHitMinPos-fHitMaxPos)<m_fDistanceCut)
178  {
179  fPosition = (fHitMinPos + fHitMaxPos)/2.0;
180  Results.iSide = iSide;
181  Results.fRecPos = fPosition;
182  Results.fOverY = fHitMinPos-fHitMaxPos;
183  Results.iNumY = iNum;
184  m_listResults.push_back(Results);
185  }
186 
187  // m_iFibSelOD ------------------------------------------------------------------
188  Float_t fMin = 0.0;
189  Float_t fDist = 0.0/*, fDistMin = 0.0*/;
190  Int_t iFibSel = 9999;
191 
192  if (Results.fRecPos !=-9999.0)
193  {
194  for (Int_t iPlate=0; iPlate<ODPLATESCNT; iPlate++)
195  {
196  iFibSel = 9999;
197  fMin = 0.24/cos(TMath::Pi()/4.0);
198 
199  for (iIter=MapLayers[2*iPlate+iSide].ListFibers.begin(); iIter!=MapLayers[2*iPlate+iSide].ListFibers.end(); ++iIter)
200  {
201  fPosition = iSign*fFiberXPos*faOD[iRPot][iPlate][iSide][*iIter] + fbOD[iRPot][iPlate][iSide][*iIter];
202  fDist = TMath::Abs(Results.fRecPos-fPosition);
203 
204  if (fDist<=fMin)
205  {
206 // fDistMin = Results.fRecPos-fPosition;
207  fMin = fDist;
208  iFibSel = *iIter;
209  }
210  }
211 
212  m_iFibSel[iSide][iPlate] = iFibSel;
213  }
214  }
215  }
216 
217 
218  delete vecMaxHit;
219  }
220 }
221 
222 void ALFA_ODTracking::FindingPosition(Int_t iRPot, std::map<int, FIBERS> &MapLayers, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT*ODFIBERSCNT])
223 {
224  Int_t iSign;
225  Float_t fDistanceA;
226  Float_t fDistanceB;
227  Float_t fPosition;
228 
229  Float_t fFiberXPos = 23;
230  fFiberXPos = (m_iDataType==1)? 22 : 23;
231 
233  Results.clear();
234 
235 // std::list<int>::iterator intIter0;
236 // std::list<int>::iterator intIter1;
237 // std::list<int>::iterator intIter2;
238  std::list<int>::const_iterator intIter0;
239  std::list<int>::const_iterator intIter1;
240  std::list<int>::const_iterator intIter2;
241 
242  for (Int_t iSide=0; iSide<ODSIDESCNT; iSide++)
243  {
244  iSign = (iSide==0) ? -1 : 1;
245 
246  if (((Int_t)MapLayers[0+iSide].ListFibers.size()<=m_iMultiplicityCut) && ((Int_t)MapLayers[2+iSide].ListFibers.size()<=m_iMultiplicityCut) && ((Int_t)MapLayers[4+iSide].ListFibers.size()<=m_iMultiplicityCut))
247  {
248  if (!MapLayers[0+iSide].ListFibers.empty())
249  {
250  for (intIter0=MapLayers[0+iSide].ListFibers.begin(); intIter0!=MapLayers[0+iSide].ListFibers.end(); ++intIter0)
251  {
252  if (!MapLayers[2+iSide].ListFibers.empty())
253  {
254  for (intIter1=MapLayers[2+iSide].ListFibers.begin(); intIter1!=MapLayers[2+iSide].ListFibers.end(); ++intIter1)
255  {
256  if (!MapLayers[4+iSide].ListFibers.empty())
257  {
258  for (intIter2=MapLayers[4+iSide].ListFibers.begin(); intIter2!=MapLayers[4+iSide].ListFibers.end(); ++intIter2)
259  {
260  fDistanceA = TMath::Abs(iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0] + fbOD[iRPot][0][iSide][*intIter0] - iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1] - fbOD[iRPot][1][iSide][*intIter1]);
261  fDistanceB = TMath::Abs(iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1] + fbOD[iRPot][1][iSide][*intIter1] - iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2] - fbOD[iRPot][2][iSide][*intIter2]);
262 
263  if (fDistanceA<m_fDistanceCut && fDistanceB<m_fDistanceCut)
264  {
265  fPosition = (iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0]+fbOD[iRPot][0][iSide][*intIter0] + iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1]+fbOD[iRPot][1][iSide][*intIter1] + iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2]+fbOD[iRPot][2][iSide][*intIter2])/3.0;
266  Results.iSide = iSide;
267  Results.fRecPos = fPosition;
268  m_listResults.push_back(Results);
269  }
270  }
271  }
272  else
273  {
274  fDistanceA = TMath::Abs(iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0]+fbOD[iRPot][0][iSide][*intIter0] - iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1]-fbOD[iRPot][1][iSide][*intIter1]);
275  if (fDistanceA < m_fDistanceCut)
276  {
277  fPosition = (iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0]+fbOD[iRPot][0][iSide][*intIter0] + iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1]+fbOD[iRPot][1][iSide][*intIter1])/2.0;
278  Results.iSide = iSide;
279  Results.fRecPos = fPosition;
280  m_listResults.push_back(Results);
281  }
282  }
283  }
284  }
285  else
286  {
287  if (!MapLayers[4+iSide].ListFibers.empty())
288  {
289  for (intIter2=MapLayers[2*2+iSide].ListFibers.begin(); intIter2!=MapLayers[2*2+iSide].ListFibers.end(); ++intIter2)
290  {
291  fDistanceA = TMath::Abs(iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0]+fbOD[iRPot][0][iSide][*intIter0] - iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2]-fbOD[iRPot][2][iSide][*intIter2]);
292  if (fDistanceA < m_fDistanceCut)
293  {
294  fPosition = (iSign*fFiberXPos*faOD[iRPot][0][iSide][*intIter0]+fbOD[iRPot][0][iSide][*intIter0] + iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2]+fbOD[iRPot][2][iSide][*intIter2])/2.0;
295  Results.iSide = iSide;
296  Results.fRecPos = fPosition;
297  m_listResults.push_back(Results);
298  }
299  }
300  }
301  }
302  }
303  }
304  else
305  {
306  if (!MapLayers[2+iSide].ListFibers.empty())
307  {
308  for (intIter1=MapLayers[2*1+iSide].ListFibers.begin(); intIter1!=MapLayers[2*1+iSide].ListFibers.end(); ++intIter1)
309  {
310  if (!MapLayers[4+iSide].ListFibers.empty())
311  {
312  for (intIter2=MapLayers[2*2+iSide].ListFibers.begin(); intIter2!=MapLayers[2*2+iSide].ListFibers.end(); ++intIter2)
313  {
314  fDistanceB = TMath::Abs(iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1]+fbOD[iRPot][1][iSide][*intIter1] - iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2]-fbOD[iRPot][2][iSide][*intIter2]);
315  if (fDistanceB<m_fDistanceCut)
316  {
317  fPosition = (iSign*fFiberXPos*faOD[iRPot][1][iSide][*intIter1]+fbOD[iRPot][1][iSide][*intIter1] + iSign*fFiberXPos*faOD[iRPot][2][iSide][*intIter2]+fbOD[iRPot][2][iSide][*intIter2])/2.0;
318  Results.iSide = iSide;
319  Results.fRecPos = fPosition;
320  m_listResults.push_back(Results);
321  }
322  }
323  }
324  }
325  }
326  }
327  }
328  }
329 }
330 
332 {
333  ATH_MSG_DEBUG("begin ALFA_ODTracking::GetData()");
334 
335 
336  for (int iSide=0; iSide<ODSIDESCNT; iSide++)
337  {
338  for (int iPlate=0; iPlate<ODPLATESCNT; iPlate++)
339  {
340  iFibSel[iSide][iPlate] = m_iFibSel[iSide][iPlate];
341  }
342  }
343 
344  ATH_MSG_DEBUG("end ALFA_ODTracking::GetData()");
345 }
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
createLinkingScheme.iter
iter
Definition: createLinkingScheme.py:62
ODLAYERSCNT
#define ODLAYERSCNT
Definition: ALFA_CLinkAlg.h:30
ALFA_ODTracking::m_iMulti
Int_t m_iMulti[ODSIDESCNT][ODPLATESCNT]
Definition: ALFA_ODTracking.h:31
_FIBERS
Definition: ALFA_LocRec/ALFA_UserObjects.h:30
RPOTSCNT
#define RPOTSCNT
Definition: ALFA_CLinkAlg.h:26
ALFA_ODTracking::GetData
void GetData(Int_t(&iFibSel)[ODSIDESCNT][ODPLATESCNT])
Definition: ALFA_ODTracking.cxx:331
ALFA_ODTracking::Finalize
StatusCode Finalize(std::list< ODRESULT > *pListResults)
Definition: ALFA_ODTracking.cxx:80
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
ALFA_ODTracking::m_fDistanceCut
Float_t m_fDistanceCut
Definition: ALFA_ODTracking.h:30
ALFA_ODTracking::m_iDataType
Int_t m_iDataType
Definition: ALFA_ODTracking.h:31
ALFA_ODTracking::Execute
StatusCode Execute(Int_t iRPot, const std::list< ODHIT > &ListODHits, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT])
Definition: ALFA_ODTracking.cxx:38
ALFA_ODTracking::m_iFibSel
Int_t m_iFibSel[ODSIDESCNT][ODPLATESCNT]
Definition: ALFA_ODTracking.h:32
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_ODTracking::Initialize
StatusCode Initialize(Int_t fMultiplicityCut, Float_t fDistanceCut, Int_t iLayerCut, Int_t iDataType)
Definition: ALFA_ODTracking.cxx:28
ALFA_ODTracking::m_listResults
std::list< ODRESULT > m_listResults
Definition: ALFA_ODTracking.h:35
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
ODSIDESCNT
#define ODSIDESCNT
Definition: ALFA_constants.h:16
_FIBERS::ListFibers
std::list< int > ListFibers
Definition: ALFA_LocRec/ALFA_UserObjects.h:31
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
ALFA_ODTracking::m_iMultiplicityCut
Int_t m_iMultiplicityCut
Definition: ALFA_ODTracking.h:29
ALFA_ODTracking::FindingPosition
void FindingPosition(Int_t iRPot, std::map< int, FIBERS > &MapLayers, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT])
Definition: ALFA_ODTracking.cxx:222
Results
std::vector< Result > Results
Definition: CscSplitClusterFitter.cxx:22
ALFA_ODTracking::~ALFA_ODTracking
~ALFA_ODTracking()
Definition: ALFA_ODTracking.cxx:23
ODPLATESCNT
#define ODPLATESCNT
Definition: ALFA_CLinkAlg.h:31
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
ODFIBERSCNT
#define ODFIBERSCNT
Definition: ALFA_CLinkAlg.h:32
_ODRESULT
Definition: ALFA_LocRec/ALFA_UserObjects.h:35
ALFA_ODTracking::m_iLayerCut
Int_t m_iLayerCut
Definition: ALFA_ODTracking.h:31
ALFA_ODTracking::ALFA_ODTracking
ALFA_ODTracking()
Definition: ALFA_ODTracking.cxx:9
ALFA_ODTracking.h
ALFA_ODTracking::FiberProjection
void FiberProjection(Int_t iRPot, std::map< int, FIBERS > &MapLayers, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT])
Definition: ALFA_ODTracking.cxx:87