ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Tracking
TrkFitter
TrkDistributedKalmanFilter
src
TrkTrackState.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2025 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
15
#include "
TrkDistributedKalmanFilter/TrkBaseNode.h
"
16
#include "
TrkDistributedKalmanFilter/TrkFilteringNodes.h
"
17
#include "
TrkDistributedKalmanFilter/TrkPlanarSurface.h
"
18
#include "
TrkDistributedKalmanFilter/TrkTrackState.h
"
19
#include "
TrkParameters/TrackParameters.h
"
20
21
#include "memory.h"
22
#include <cmath>
23
#include <cstdio>
24
#include <cstdlib>
25
26
namespace
Trk
27
{
28
TrkTrackState::TrkTrackState
()
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
;
49
resetCovariance
();
50
}
51
52
void
TrkTrackState::resetCovariance
() {
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
61
TrkTrackState::TrkTrackState
(
const
TrkTrackState
* pTS) {
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
73
void
TrkTrackState::serialize
(
char
fileName[]) {
74
FILE* pFile = fopen(fileName,
"a"
);
75
if
(!pFile) {
76
std::cerr <<
"Cannot open file "
<< fileName <<
" for write.\n"
;
77
std::abort();
78
}
79
fprintf(pFile,
"%f %f %f %f %f\n"
,
80
m_Rk
[0],
m_Rk
[1],
m_Rk
[2],
m_Rk
[3],
m_Rk
[4]);
81
for
(
int
i = 0; i < 5; i++) {
82
for
(
int
j = 0; j < 5; j++) {
83
if
(j < i) fprintf(pFile,
" "
);
84
else
fprintf(pFile,
"%f "
,
getTrackCovariance
(i, j));
85
}
86
fprintf(pFile,
"\n"
);
87
}
88
fclose(pFile);
89
}
90
91
void
TrkTrackState::report
() {
92
printf(
"STATE x0=%f y0=%f phi=%f theta=%f qOverP=%f pT=%f\n"
,
93
m_Rk
[0],
m_Rk
[1],
m_Rk
[2],
m_Rk
[3],
m_Rk
[4], sin(
m_Rk
[3]) /
m_Rk
[4]);
94
printf(
"COVARIANCE \n"
);
95
for
(
auto
& i :
m_Gk
) {
96
for
(
double
j : i) {
97
printf(
"%E "
, j);
98
}
99
printf(
"\n"
);
100
}
101
}
102
103
void
TrkTrackState::attachToSurface
(
TrkPlanarSurface
* pS) {
104
m_pSurface
= pS;
105
m_isScattered
=
false
;
106
}
107
108
TrkPlanarSurface
*
TrkTrackState::getSurface
() {
109
return
m_pSurface
;
110
}
111
112
void
TrkTrackState::updateTrackState
(
const
double
* pUpd) {
113
for
(
int
i = 0; i < 5; i++)
m_Rk
[i] += pUpd[i];
114
if
(
m_Rk
[2] >
M_PI
)
m_Rk
[2] -= 2 *
M_PI
;
115
if
(
m_Rk
[2] < -
M_PI
)
m_Rk
[2] += 2 *
M_PI
;
116
if
(
m_Rk
[3] < 0.0)
m_Rk
[3] +=
M_PI
;
117
if
(
m_Rk
[3] >
M_PI
)
m_Rk
[3] -=
M_PI
;
118
}
119
120
void
TrkTrackState::updateTrackCovariance
(
const
double
* pUpd) {
121
int
idx = 0;
122
123
for
(
int
i = 0; i < 5; i++) {
124
for
(
int
j = i; j < 5; j++) {
125
m_Gk
[i][j] += pUpd[idx];
126
idx++;
127
m_Gk
[j][i] =
m_Gk
[i][j];
128
}
129
}
130
}
131
132
void
TrkTrackState::setScatteringMode
(
int
mode) {
133
m_scattMode
= mode;
134
}
135
136
int
TrkTrackState::getScatteringMode
()
const
{
137
return
m_scattMode
;
138
}
139
140
void
TrkTrackState::setTrackState
(
const
double
R[5]) {
141
for
(
int
i = 0; i < 5; i++)
m_Re
[i] =
m_Rk
[i] = R[i];
142
}
143
144
void
TrkTrackState::setTrackCovariance
(
double
G
[5][5]) {
145
for
(
int
i = 0; i < 5; i++)
146
for
(
int
j = 0; j < 5; j++)
147
m_Ge
[i][j] =
m_Gk
[i][j] =
G
[i][j];
148
}
149
150
void
TrkTrackState::setPreviousState
(
TrkTrackState
* pTS) {
151
m_pPrevState
= pTS;
152
}
153
154
void
TrkTrackState::setSmootherGain
(
double
A
[5][5]) {
155
for
(
int
i = 0; i < 5; i++)
156
for
(
int
j = 0; j < 5; j++)
157
m_A
[i][j] =
A
[i][j];
158
}
159
160
void
TrkTrackState::applyMultipleScattering
() {
161
double
lenCorr, sigmaMS, s2, a2, radLength, lV[3], gV[3],
a
;
162
TrkPlanarSurface
* pS =
m_pSurface
;
163
164
if
(pS ==
nullptr
)
return
;
165
166
gV[0] = sin(
m_Re
[3]) * cos(
m_Re
[2]);
167
gV[1] = sin(
m_Re
[3]) * sin(
m_Re
[2]);
168
gV[2] = cos(
m_Re
[3]);
169
pS->
rotateVectorToLocal
(gV, lV);
170
lenCorr = 1.0 / fabs(lV[2]);
171
radLength =
m_pSurface
->getRadLength() * lenCorr;
172
sigmaMS = 13.6 * fabs(
m_Re
[4]) * sqrt(radLength) * (1.0 + 0.038 * log(radLength));
173
s2 = sigmaMS * sigmaMS;
174
a
= 1.0 / sin(
m_Rk
[3]);
175
a2 =
a
*
a
;
176
m_Ge
[2][2] += s2 * a2;
177
m_Ge
[3][3] += s2;
178
m_Ge
[2][3] += s2 *
a
;
179
m_Ge
[3][2] =
m_Ge
[2][3];
180
m_Gk
[2][2] =
m_Ge
[2][2];
181
m_Gk
[2][3] =
m_Ge
[2][3];
182
m_Gk
[3][2] =
m_Ge
[3][2];
183
m_Gk
[3][3] =
m_Ge
[3][3];
184
}
185
186
void
TrkTrackState::applyEnergyLoss
(
int
dir) {
187
double
lenCorr, effLength, lV[3], gV[3];
188
TrkPlanarSurface
* pS =
m_pSurface
;
189
190
if
(pS ==
nullptr
)
return
;
191
192
gV[0] = sin(
m_Re
[3]) * cos(
m_Re
[2]);
193
gV[1] = sin(
m_Re
[3]) * sin(
m_Re
[2]);
194
gV[2] = cos(
m_Re
[3]);
195
pS->
rotateVectorToLocal
(gV, lV);
196
lenCorr = 1.0 / fabs(lV[2]);
197
effLength =
m_pSurface
->getRadLength() * lenCorr;
198
199
if
(abs(dir) == 1) {
200
m_Re
[4] += dir * (
m_Re
[4] * effLength * (1.0 - 0.5 * effLength));
201
m_Ge
[4][4] +=
m_Re
[4] *
m_Re
[4] * effLength * (0.415 - 0.744 * effLength);
202
m_Rk
[4] =
m_Re
[4];
203
m_Gk
[4][4] =
m_Ge
[4][4];
204
}
else
if
(abs(dir) == 2) {
205
m_Ge
[4][4] += 1e-5;
206
m_Rk
[4] =
m_Re
[4];
207
m_Gk
[4][4] =
m_Ge
[4][4];
208
}
209
}
210
211
void
TrkTrackState::applyMaterialEffects
() {
212
if
(
m_scattMode
!= 0)
applyMultipleScattering
();
213
if
(
m_scattMode
== -2)
applyEnergyLoss
(-1);
214
else
if
(
m_scattMode
== 2)
applyEnergyLoss
(1);
215
if
(
m_pSurface
!=
nullptr
) {
216
if
(
m_pSurface
->isBreakPoint())
applyEnergyLoss
(2);
217
}
218
}
219
220
void
TrkTrackState::runSmoother
() {
221
double
dR[5], dG[5][5], B[5][5];
222
int
i, j, m;
223
224
if
(
m_pPrevState
==
nullptr
)
return
;
225
226
for
(i = 0; i < 5; i++) {
227
dR[i] =
m_Rk
[i] -
m_Re
[i];
228
for
(j = 0; j < 5; j++) dG[i][j] =
m_Gk
[i][j] -
m_Ge
[i][j];
229
}
230
231
if
(dR[2] >
M_PI
) dR[2] -= 2 *
M_PI
;
232
if
(dR[2] < -
M_PI
) dR[2] += 2 *
M_PI
;
233
for
(i = 0; i < 5; i++) {
234
for
(j = 0; j < 5; j++)
m_pPrevState
->m_Rk[i] +=
m_A
[i][j] * dR[j];
235
}
236
237
if
(
m_pPrevState
->m_Rk[2] >
M_PI
)
m_pPrevState
->m_Rk[2] -= 2 *
M_PI
;
238
if
(
m_pPrevState
->m_Rk[2] < -
M_PI
)
m_pPrevState
->m_Rk[2] += 2 *
M_PI
;
239
if
(
m_pPrevState
->m_Rk[3] < 0.0)
m_pPrevState
->m_Rk[3] +=
M_PI
;
240
if
(
m_pPrevState
->m_Rk[3] >
M_PI
)
m_pPrevState
->m_Rk[3] -=
M_PI
;
241
for
(i = 0; i < 5; i++)
242
for
(j = 0; j < 5; j++) {
243
B[i][j] = 0.0;
244
for
(m = 0; m < 5; m++) B[i][j] +=
m_A
[i][m] * dG[m][j];
245
}
246
for
(i = 0; i < 5; i++)
247
for
(j = 0; j < 5; j++) {
248
for
(m = 0; m < 5; m++)
249
m_pPrevState
->m_Gk[i][j] += B[i][m] *
m_A
[j][m];
250
}
251
}
252
}
M_PI
#define M_PI
Definition
ActiveFraction.h:14
a
static Double_t a
Definition
LArPhysWaveHECTool.cxx:38
G
#define G(x, y, z)
Definition
MD5.cxx:113
TrackParameters.h
TrkBaseNode.h
TrkFilteringNodes.h
TrkPlanarSurface.h
TrkTrackState.h
Trk::TrkPlanarSurface
Definition
TrkPlanarSurface.h:25
Trk::TrkPlanarSurface::rotateVectorToLocal
void rotateVectorToLocal(const double *, double *)
Definition
TrkPlanarSurface.cxx:99
Trk::TrkTrackState::getSurface
TrkPlanarSurface * getSurface()
Definition
TrkTrackState.cxx:108
Trk::TrkTrackState::applyEnergyLoss
void applyEnergyLoss(int)
Definition
TrkTrackState.cxx:186
Trk::TrkTrackState::m_scattMode
int m_scattMode
Definition
TrkTrackState.h:62
Trk::TrkTrackState::updateTrackCovariance
void updateTrackCovariance(const double *)
Definition
TrkTrackState.cxx:120
Trk::TrkTrackState::getScatteringMode
int getScatteringMode() const
Definition
TrkTrackState.cxx:136
Trk::TrkTrackState::setTrackState
void setTrackState(const double A[5])
Definition
TrkTrackState.cxx:140
Trk::TrkTrackState::TrkTrackState
TrkTrackState()
Definition
TrkTrackState.cxx:28
Trk::TrkTrackState::applyMaterialEffects
void applyMaterialEffects()
Definition
TrkTrackState.cxx:211
Trk::TrkTrackState::updateTrackState
void updateTrackState(const double *)
Definition
TrkTrackState.cxx:112
Trk::TrkTrackState::getTrackCovariance
double getTrackCovariance(int i, int j)
Definition
TrkTrackState.h:51
Trk::TrkTrackState::m_isScattered
bool m_isScattered
Definition
TrkTrackState.h:63
Trk::TrkTrackState::report
void report()
Definition
TrkTrackState.cxx:91
Trk::TrkTrackState::setTrackCovariance
void setTrackCovariance(double A[5][5])
Definition
TrkTrackState.cxx:144
Trk::TrkTrackState::setPreviousState
void setPreviousState(TrkTrackState *)
Definition
TrkTrackState.cxx:150
Trk::TrkTrackState::runSmoother
void runSmoother()
Definition
TrkTrackState.cxx:220
Trk::TrkTrackState::m_Gk
double m_Gk[5][5]
Definition
TrkTrackState.h:61
Trk::TrkTrackState::m_Re
double m_Re[5]
Definition
TrkTrackState.h:60
Trk::TrkTrackState::serialize
void serialize(char fileName[])
Definition
TrkTrackState.cxx:73
Trk::TrkTrackState::m_Ge
double m_Ge[5][5]
Definition
TrkTrackState.h:61
Trk::TrkTrackState::m_Rk
double m_Rk[5]
Definition
TrkTrackState.h:60
Trk::TrkTrackState::applyMultipleScattering
void applyMultipleScattering()
Definition
TrkTrackState.cxx:160
Trk::TrkTrackState::m_pSurface
TrkPlanarSurface * m_pSurface
Definition
TrkTrackState.h:64
Trk::TrkTrackState::setSmootherGain
void setSmootherGain(double A[5][5])
Definition
TrkTrackState.cxx:154
Trk::TrkTrackState::setScatteringMode
void setScatteringMode(int)
Definition
TrkTrackState.cxx:132
Trk::TrkTrackState::resetCovariance
void resetCovariance()
Definition
TrkTrackState.cxx:52
Trk::TrkTrackState::attachToSurface
void attachToSurface(TrkPlanarSurface *)
Definition
TrkTrackState.cxx:103
Trk::TrkTrackState::m_A
double m_A[5][5]
Definition
TrkTrackState.h:66
Trk::TrkTrackState::m_pPrevState
TrkTrackState * m_pPrevState
Definition
TrkTrackState.h:65
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition
FakeTrackBuilder.h:9
A
hold the test vectors and ease the comparison
Generated on
for ATLAS Offline Software by
1.17.0