ATLAS Offline Software
TrkTrackState.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3  */
4 
6 // TrkTrackState.cxx
7 // Source file for TrkTrackState class
9 // (c) ATLAS Detector software
11 // Author: Dmitry Emeliyanov, RAL
12 // D.Emeliyanov@rl.ac.uk
14 
20 
21 #include "memory.h"
22 #include <cmath>
23 #include <cstdio>
24 #include <cstdlib>
25 
26 namespace Trk
27 {
29  : m_scattMode(0),
30  m_isScattered(false),
31  m_pSurface(nullptr),
32  m_pPrevState(nullptr) {
33  memset(m_Rk, 0, sizeof(m_Rk));
34  memset(m_Gk, 0, sizeof(m_Gk));
35 }
36 
37  TrkTrackState::TrkTrackState(const double Rk[5]) {
38  int i;
39 
40  for (i = 0; i < 5; i++) m_Rk[i] = Rk[i];
41  if (m_Rk[2] > M_PI) m_Rk[2] -= 2 * M_PI;
42  if (m_Rk[2] < -M_PI) m_Rk[2] += 2 * M_PI;
43  if (m_Rk[3] < 0.0) m_Rk[3] += M_PI;
44  if (m_Rk[3] > M_PI) m_Rk[3] -= M_PI;
45  m_pSurface = nullptr;
46  m_scattMode = 0;
47  m_isScattered = false;
48  m_pPrevState = nullptr;
50  }
51 
53  memset(m_Gk, 0, sizeof(m_Gk));
54  m_Gk[0][0] = 100.0;
55  m_Gk[1][1] = 100.0;
56  m_Gk[2][2] = 0.01;
57  m_Gk[3][3] = 0.01;
58  m_Gk[4][4] = 1e-5;
59  }
60 
62  for (int i = 0; i < 5; i++) {
63  m_Rk[i] = pTS->m_Rk[i];
64  }
65  for (int i = 0; i < 5; i++)
66  for (int j = 0; j < 5; j++) m_Gk[i][j] = pTS->m_Gk[i][j];
67  m_scattMode = pTS->m_scattMode;
68  m_pSurface = nullptr;
69  m_isScattered = false;
70  m_pPrevState = nullptr;
71  }
72 
74  FILE* pFile;
75 
76  pFile = fopen(fileName, "a");
77  fprintf(pFile, "%f %f %f %f %f\n",
78  m_Rk[0], m_Rk[1], m_Rk[2], m_Rk[3], m_Rk[4]);
79  for (int i = 0; i < 5; i++) {
80  for (int j = 0; j < 5; j++) {
81  if (j < i) fprintf(pFile, " ");
82  else fprintf(pFile, "%f ", getTrackCovariance(i, j));
83  }
84  fprintf(pFile, "\n");
85  }
86  fclose(pFile);
87  }
88 
90  printf("STATE x0=%f y0=%f phi=%f theta=%f qOverP=%f pT=%f\n",
91  m_Rk[0], m_Rk[1], m_Rk[2], m_Rk[3], m_Rk[4], sin(m_Rk[3]) / m_Rk[4]);
92  printf("COVARIANCE \n");
93  for (auto & i : m_Gk) {
94  for (double j : i) {
95  printf("%E ", j);
96  }
97  printf("\n");
98  }
99  }
100 
102  m_pSurface = pS;
103  m_isScattered = false;
104  }
105 
107  return m_pSurface;
108  }
109 
110  void TrkTrackState::updateTrackState(const double* pUpd) {
111  for (int i = 0; i < 5; i++) m_Rk[i] += pUpd[i];
112  if (m_Rk[2] > M_PI) m_Rk[2] -= 2 * M_PI;
113  if (m_Rk[2] < -M_PI) m_Rk[2] += 2 * M_PI;
114  if (m_Rk[3] < 0.0) m_Rk[3] += M_PI;
115  if (m_Rk[3] > M_PI) m_Rk[3] -= M_PI;
116  }
117 
118  void TrkTrackState::updateTrackCovariance(const double* pUpd) {
119  int idx = 0;
120 
121  for (int i = 0; i < 5; i++) {
122  for (int j = i; j < 5; j++) {
123  m_Gk[i][j] += pUpd[idx];
124  idx++;
125  m_Gk[j][i] = m_Gk[i][j];
126  }
127  }
128  }
129 
131  m_scattMode = mode;
132  }
133 
135  return m_scattMode;
136  }
137 
138  void TrkTrackState::setTrackState(const double R[5]) {
139  for (int i = 0; i < 5; i++) m_Re[i] = m_Rk[i] = R[i];
140  }
141 
143  for (int i = 0; i < 5; i++)
144  for (int j = 0; j < 5; j++)
145  m_Ge[i][j] = m_Gk[i][j] = G[i][j];
146  }
147 
149  m_pPrevState = pTS;
150  }
151 
152  void TrkTrackState::setSmootherGain(double A[5][5]) {
153  for (int i = 0; i < 5; i++)
154  for (int j = 0; j < 5; j++)
155  m_A[i][j] = A[i][j];
156  }
157 
159  double lenCorr, sigmaMS, s2, a2, radLength, lV[3], gV[3], a;
161 
162  if (pS == nullptr) return;
163 
164  gV[0] = sin(m_Re[3]) * cos(m_Re[2]);
165  gV[1] = sin(m_Re[3]) * sin(m_Re[2]);
166  gV[2] = cos(m_Re[3]);
167  pS->rotateVectorToLocal(gV, lV);
168  lenCorr = 1.0 / fabs(lV[2]);
169  radLength = m_pSurface->getRadLength() * lenCorr;
170  sigmaMS = 13.6 * fabs(m_Re[4]) * sqrt(radLength) * (1.0 + 0.038 * log(radLength));
171  s2 = sigmaMS * sigmaMS;
172  a = 1.0 / sin(m_Rk[3]);
173  a2 = a * a;
174  m_Ge[2][2] += s2 * a2;
175  m_Ge[3][3] += s2;
176  m_Ge[2][3] += s2 * a;
177  m_Ge[3][2] = m_Ge[2][3];
178  m_Gk[2][2] = m_Ge[2][2];
179  m_Gk[2][3] = m_Ge[2][3];
180  m_Gk[3][2] = m_Ge[3][2];
181  m_Gk[3][3] = m_Ge[3][3];
182  }
183 
185  double lenCorr, effLength, lV[3], gV[3];
187 
188  if (pS == nullptr) return;
189 
190  gV[0] = sin(m_Re[3]) * cos(m_Re[2]);
191  gV[1] = sin(m_Re[3]) * sin(m_Re[2]);
192  gV[2] = cos(m_Re[3]);
193  pS->rotateVectorToLocal(gV, lV);
194  lenCorr = 1.0 / fabs(lV[2]);
195  effLength = m_pSurface->getRadLength() * lenCorr;
196 
197  if (abs(dir) == 1) {
198  m_Re[4] += dir * (m_Re[4] * effLength * (1.0 - 0.5 * effLength));
199  m_Ge[4][4] += m_Re[4] * m_Re[4] * effLength * (0.415 - 0.744 * effLength);
200  m_Rk[4] = m_Re[4];
201  m_Gk[4][4] = m_Ge[4][4];
202  } else if (abs(dir) == 2) {
203  m_Ge[4][4] += 1e-5;
204  m_Rk[4] = m_Re[4];
205  m_Gk[4][4] = m_Ge[4][4];
206  }
207  }
208 
211  if (m_scattMode == -2) applyEnergyLoss(-1);
212  else if (m_scattMode == 2) applyEnergyLoss(1);
213  if (m_pSurface != nullptr) {
215  }
216  }
217 
219  double dR[5], dG[5][5], B[5][5];
220  int i, j, m;
221 
222  if (m_pPrevState == nullptr) return;
223 
224  for (i = 0; i < 5; i++) {
225  dR[i] = m_Rk[i] - m_Re[i];
226  for (j = 0; j < 5; j++) dG[i][j] = m_Gk[i][j] - m_Ge[i][j];
227  }
228 
229  if (dR[2] > M_PI) dR[2] -= 2 * M_PI;
230  if (dR[2] < -M_PI) dR[2] += 2 * M_PI;
231  for (i = 0; i < 5; i++) {
232  for (j = 0; j < 5; j++) m_pPrevState->m_Rk[i] += m_A[i][j] * dR[j];
233  }
234 
235  if (m_pPrevState->m_Rk[2] > M_PI) m_pPrevState->m_Rk[2] -= 2 * M_PI;
236  if (m_pPrevState->m_Rk[2] < -M_PI) m_pPrevState->m_Rk[2] += 2 * M_PI;
237  if (m_pPrevState->m_Rk[3] < 0.0) m_pPrevState->m_Rk[3] += M_PI;
238  if (m_pPrevState->m_Rk[3] > M_PI) m_pPrevState->m_Rk[3] -= M_PI;
239  for (i = 0; i < 5; i++)
240  for (j = 0; j < 5; j++) {
241  B[i][j] = 0.0;
242  for (m = 0; m < 5; m++) B[i][j] += m_A[i][m] * dG[m][j];
243  }
244  for (i = 0; i < 5; i++)
245  for (j = 0; j < 5; j++) {
246  for (m = 0; m < 5; m++)
247  m_pPrevState->m_Gk[i][j] += B[i][m] * m_A[j][m];
248  }
249  }
250 }
Trk::TrkTrackState::getSurface
TrkPlanarSurface * getSurface()
Definition: TrkTrackState.cxx:106
Trk::TrkTrackState::applyMultipleScattering
void applyMultipleScattering()
Definition: TrkTrackState.cxx:158
Trk::TrkTrackState::TrkTrackState
TrkTrackState()
Definition: TrkTrackState.cxx:28
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
TrackParameters.h
Trk::TrkTrackState::updateTrackCovariance
void updateTrackCovariance(const double *)
Definition: TrkTrackState.cxx:118
Trk::TrkTrackState::m_isScattered
bool m_isScattered
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:63
Trk::TrkTrackState
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:24
Trk::TrkPlanarSurface
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkPlanarSurface.h:25
Trk::TrkTrackState::m_pSurface
TrkPlanarSurface * m_pSurface
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:64
M_PI
#define M_PI
Definition: ActiveFraction.h:11
Trk::TrkTrackState::applyMaterialEffects
void applyMaterialEffects()
Definition: TrkTrackState.cxx:209
Trk::TrkTrackState::m_scattMode
int m_scattMode
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:62
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
Trk::TrkTrackState::runSmoother
void runSmoother()
Definition: TrkTrackState.cxx:218
Trk::TrkTrackState::report
void report()
Definition: TrkTrackState.cxx:89
Trk::TrkPlanarSurface::rotateVectorToLocal
void rotateVectorToLocal(const double *, double *)
Definition: TrkPlanarSurface.cxx:99
Trk::TrkTrackState::getScatteringMode
int getScatteringMode() const
Definition: TrkTrackState.cxx:134
TrkTrackState.h
FortranAlgorithmOptions.fileName
fileName
Definition: FortranAlgorithmOptions.py:13
lumiFormat.i
int i
Definition: lumiFormat.py:92
G
#define G(x, y, z)
Definition: MD5.cxx:113
TrkBaseNode.h
Trk::TrkTrackState::setScatteringMode
void setScatteringMode(int)
Definition: TrkTrackState.cxx:130
Trk::TrkTrackState::serialize
void serialize(char fileName[])
Definition: TrkTrackState.cxx:73
Preparation.mode
mode
Definition: Preparation.py:95
Trk::TrkTrackState::attachToSurface
void attachToSurface(TrkPlanarSurface *)
Definition: TrkTrackState.cxx:101
Trk::TrkTrackState::applyEnergyLoss
void applyEnergyLoss(int)
Definition: TrkTrackState.cxx:184
beamspotman.dir
string dir
Definition: beamspotman.py:623
Trk::TrkTrackState::setPreviousState
void setPreviousState(TrkTrackState *)
Definition: TrkTrackState.cxx:148
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
Trk::TrkPlanarSurface::getRadLength
double getRadLength() const
Definition: TrkPlanarSurface.cxx:129
Trk::TrkTrackState::m_Gk
double m_Gk[5][5]
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:61
TrkFilteringNodes.h
Trk::TrkTrackState::setSmootherGain
void setSmootherGain(double A[5][5])
Definition: TrkTrackState.cxx:152
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
a
TList * a
Definition: liststreamerinfos.cxx:10
Trk::TrkTrackState::updateTrackState
void updateTrackState(const double *)
Definition: TrkTrackState.cxx:110
ReadCellNoiseFromCoolCompare.s2
s2
Definition: ReadCellNoiseFromCoolCompare.py:379
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
Trk::TrkTrackState::setTrackCovariance
void setTrackCovariance(double A[5][5])
Definition: TrkTrackState.cxx:142
Trk::TrkTrackState::m_Ge
double m_Ge[5][5]
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:61
Trk::TrkTrackState::setTrackState
void setTrackState(const double A[5])
Definition: TrkTrackState.cxx:138
Trk::TrkTrackState::m_pPrevState
TrkTrackState * m_pPrevState
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:65
Trk::TrkTrackState::m_Re
double m_Re[5]
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:60
Trk::TrkTrackState::m_Rk
double m_Rk[5]
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:60
Trk::TrkPlanarSurface::isBreakPoint
bool isBreakPoint() const
Definition: TrkPlanarSurface.cxx:139
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
Trk::TrkTrackState::resetCovariance
void resetCovariance()
Definition: TrkTrackState.cxx:52
TrkPlanarSurface.h
Trk::TrkTrackState::m_A
double m_A[5][5]
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:66
Trk::TrkTrackState::getTrackCovariance
double getTrackCovariance(int i, int j)
Definition: Tracking/TrkFitter/TrkDistributedKalmanFilter/TrkDistributedKalmanFilter/TrkTrackState.h:51