BmnRoot
26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Toggle main menu visibility
Loading...
Searching...
No Matches
L1Filtration.h
Go to the documentation of this file.
1
#ifndef L1Filtration_h
2
#define L1Filtration_h
3
4
#include "
CbmL1Def.h
"
5
#include "
L1TrackPar.h
"
6
#include "
L1UMeasurementInfo.h
"
7
#include "
L1XYMeasurementInfo.h
"
8
9
// #define cnst static const fvec
10
#define cnst const fvec
11
12
// inline void L1Filter( L1TrackPar &T, L1UMeasurementInfo &info, fvec u, fvec w = 1.)
13
inline
void
L1Filter
(
L1TrackPar
& T,
L1UMeasurementInfo
& info,
fvec
u,
fvec
w = 1.,
fvec
* du2 = 0)
// AZ
14
{
15
fvec
wi, zeta, zetawi, HCH;
16
fvec
F0, F1, F2, F3, F4;
17
fvec
K1, K2, K3, K4;
18
19
zeta = info.
cos_phi
* T.x + info.
sin_phi
* T.y - u;
20
21
// F = CH'
22
F0 = info.
cos_phi
* T.C00 + info.
sin_phi
* T.C10;
23
F1 = info.
cos_phi
* T.C10 + info.
sin_phi
* T.C11;
24
25
HCH = (F0 * info.
cos_phi
+ F1 * info.
sin_phi
);
26
27
F2 = info.
cos_phi
* T.C20 + info.
sin_phi
* T.C21;
28
F3 = info.
cos_phi
* T.C30 + info.
sin_phi
* T.C31;
29
F4 = info.
cos_phi
* T.C40 + info.
sin_phi
* T.C41;
30
31
#if 0
// use mask
32
const
fvec
mask = (HCH < info.
sigma2
* 16.);
33
wi = w/( (mask & info.
sigma2
) +HCH );
34
zetawi = zeta *wi;
35
T.chi2 += mask & (zeta * zetawi);
36
#else
37
if
(du2)
38
wi = w / (*du2 + HCH);
// AZ
39
else
// AZ
40
wi = w / (info.
sigma2
+ HCH);
41
// cout << wi << " " << *du2 << " " << info.sigma2 << endl; //AZ
42
zetawi = zeta * wi;
43
T.chi2 += zeta * zetawi;
44
#endif
// 0
45
T.NDF += w;
46
47
K1 = F1 * wi;
48
K2 = F2 * wi;
49
K3 = F3 * wi;
50
K4 = F4 * wi;
51
52
T.x -= F0 * zetawi;
53
T.y -= F1 * zetawi;
54
T.tx -= F2 * zetawi;
55
T.ty -= F3 * zetawi;
56
T.qp -= F4 * zetawi;
57
58
T.C00 -= F0 * F0 * wi;
59
T.C10 -= K1 * F0;
60
T.C11 -= K1 * F1;
61
T.C20 -= K2 * F0;
62
T.C21 -= K2 * F1;
63
T.C22 -= K2 * F2;
64
T.C30 -= K3 * F0;
65
T.C31 -= K3 * F1;
66
T.C32 -= K3 * F2;
67
T.C33 -= K3 * F3;
68
T.C40 -= K4 * F0;
69
T.C41 -= K4 * F1;
70
T.C42 -= K4 * F2;
71
T.C43 -= K4 * F3;
72
T.C44 -= K4 * F4;
73
}
74
75
inline
void
L1FilterChi2
(
const
L1UMeasurementInfo
& info,
76
const
fvec
& x,
77
const
fvec
& y,
78
const
fvec
& C00,
79
// const fvec& C10, const fvec& C11, fvec& chi2, const fvec& u )
80
const
fvec
& C10,
81
const
fvec
& C11,
82
fvec
& chi2,
83
const
fvec
& u,
84
const
fvec
* du2 = 0)
// AZ
85
{
86
fvec
zeta, HCH;
87
fvec
F0, F1;
88
89
zeta = info.
cos_phi
* x + info.
sin_phi
* y - u;
90
91
// F = CH'
92
F0 = info.
cos_phi
* C00 + info.
sin_phi
* C10;
93
F1 = info.
cos_phi
* C10 + info.
sin_phi
* C11;
94
95
HCH = (F0 * info.
cos_phi
+ F1 * info.
sin_phi
);
96
97
if
(du2)
98
chi2 += zeta * zeta / (*du2 + HCH);
// AZ
99
else
// AZ
100
chi2 += zeta * zeta / (info.
sigma2
+ HCH);
101
}
102
103
inline
void
L1FilterChi2XYC00C10C11
(
const
L1UMeasurementInfo
& info,
104
fvec
& x,
105
fvec
& y,
106
fvec
& C00,
107
fvec
& C10,
108
// fvec& C11, fvec& chi2, const fvec& u )
109
fvec
& C11,
110
fvec
& chi2,
111
const
fvec
& u,
112
const
fvec
* du2 = 0)
// AZ
113
{
114
fvec
wi, zeta, zetawi, HCH;
115
fvec
F0, F1;
116
fvec
K1;
117
118
zeta = info.
cos_phi
* x + info.
sin_phi
* y - u;
119
120
// F = CH'
121
F0 = info.
cos_phi
* C00 + info.
sin_phi
* C10;
122
F1 = info.
cos_phi
* C10 + info.
sin_phi
* C11;
123
124
HCH = (F0 * info.
cos_phi
+ F1 * info.
sin_phi
);
125
126
if
(du2)
127
wi = 1. / (*du2 + HCH);
// AZ
128
else
// AZ
129
wi = 1. / (info.
sigma2
+ HCH);
130
zetawi = zeta * wi;
131
chi2 += zeta * zetawi;
132
133
K1 = F1 * wi;
134
135
x -= F0 * zetawi;
136
y -= F1 * zetawi;
137
138
C00 -= F0 * F0 * wi;
139
C10 -= K1 * F0;
140
C11 -= K1 * F1;
141
}
142
143
inline
void
L1FilterVtx
(
L1TrackPar
& T,
fvec
x,
fvec
y,
L1XYMeasurementInfo
& info,
fvec
extrDx,
fvec
extrDy,
fvec
J[])
144
{
145
cnst
TWO = 2.;
146
147
fvec
zeta0, zeta1, S00, S10, S11, si;
148
fvec
F00
,
F10
,
F20
,
F30
, F40,
F01
,
F11
,
F21
,
F31
, F41;
149
fvec
K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
150
151
// zeta0 = T.x + J[0]*T.tx + J[1]*T.ty + J[2]*T.qp - x;
152
// zeta1 = T.y + J[3]*T.tx + J[4]*T.ty + J[5]*T.qp - y;
153
154
zeta0 = T.x + extrDx - x;
155
zeta1 = T.y + extrDy - y;
156
157
// H = 1 0 J[0] J[1] J[2]
158
// 0 1 J[3] J[4] J[5]
159
160
// F = CH'
161
F00
= T.C00;
162
F01
= T.C10;
163
F10
= T.C10;
164
F11
= T.C11;
165
F20
= J[0] * T.C22;
166
F21
= J[3] * T.C22;
167
F30
= J[1] * T.C33;
168
F31
= J[4] * T.C33;
169
F40 = J[2] * T.C44;
170
F41 = J[5] * T.C44;
171
172
S00 = info.
C00
+
F00
+ J[0] *
F20
+ J[1] *
F30
+ J[2] * F40;
173
S10 = info.
C10
+
F10
+ J[3] *
F20
+ J[4] *
F30
+ J[5] * F40;
174
S11 = info.
C11
+
F11
+ J[3] *
F21
+ J[4] *
F31
+ J[5] * F41;
175
176
si = 1. / (S00 * S11 - S10 * S10);
177
// si = fvec(rcp(fvec((S00*S11 - S10*S10)[0])));
178
fvec
S00tmp = S00;
179
S00 = si * S11;
180
S10 = -si * S10;
181
S11 = si * S00tmp;
182
183
T.chi2 += zeta0 * zeta0 * S00 + 2. * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
184
T.NDF += TWO;
185
186
K00 =
F00
* S00 +
F01
* S10;
187
K01 =
F00
* S10 +
F01
* S11;
188
K10 =
F10
* S00 +
F11
* S10;
189
K11 =
F10
* S10 +
F11
* S11;
190
K20 =
F20
* S00 +
F21
* S10;
191
K21 =
F20
* S10 +
F21
* S11;
192
K30 =
F30
* S00 +
F31
* S10;
193
K31 =
F30
* S10 +
F31
* S11;
194
K40 = F40 * S00 + F41 * S10;
195
K41 = F40 * S10 + F41 * S11;
196
197
T.x -= K00 * zeta0 + K01 * zeta1;
198
T.y -= K10 * zeta0 + K11 * zeta1;
199
T.tx -= K20 * zeta0 + K21 * zeta1;
200
T.ty -= K30 * zeta0 + K31 * zeta1;
201
T.qp -= K40 * zeta0 + K41 * zeta1;
202
203
T.C00 -= (K00 *
F00
+ K01 *
F01
);
204
T.C10 -= (K10 *
F00
+ K11 *
F01
);
205
T.C11 -= (K10 *
F10
+ K11 *
F11
);
206
T.C20 = -(K20 *
F00
+ K21 *
F01
);
207
T.C21 = -(K20 *
F10
+ K21 *
F11
);
208
T.C22 -= (K20 *
F20
+ K21 *
F21
);
209
T.C30 = -(K30 *
F00
+ K31 *
F01
);
210
T.C31 = -(K30 *
F10
+ K31 *
F11
);
211
T.C32 = -(K30 *
F20
+ K31 *
F21
);
212
T.C33 -= (K30 *
F30
+ K31 *
F31
);
213
T.C40 = -(K40 *
F00
+ K41 *
F01
);
214
T.C41 = -(K40 *
F10
+ K41 *
F11
);
215
T.C42 = -(K40 *
F20
+ K41 *
F21
);
216
T.C43 = -(K40 *
F30
+ K41 *
F31
);
217
T.C44 -= (K40 * F40 + K41 * F41);
218
}
219
220
inline
void
L1FilterXY
(
L1TrackPar
& T,
fvec
x,
fvec
y,
L1XYMeasurementInfo
& info)
221
{
222
cnst
TWO = 2.;
223
224
fvec
zeta0, zeta1, S00, S10, S11, si;
225
fvec
F00
,
F10
,
F20
,
F30
, F40,
F01
,
F11
,
F21
,
F31
, F41;
226
fvec
K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
227
228
zeta0 = T.x - x;
229
zeta1 = T.y - y;
230
231
// F = CH'
232
F00
= T.C00;
233
F10
= T.C10;
234
F20
= T.C20;
235
F30
= T.C30;
236
F40 = T.C40;
237
F01
= T.C10;
238
F11
= T.C11;
239
F21
= T.C21;
240
F31
= T.C31;
241
F41 = T.C41;
242
243
S00 =
F00
+ info.
C00
;
244
S10 =
F10
+ info.
C10
;
245
S11 =
F11
+ info.
C11
;
246
247
si = 1. / (S00 * S11 - S10 * S10);
248
fvec
S00tmp = S00;
249
S00 = si * S11;
250
S10 = -si * S10;
251
S11 = si * S00tmp;
252
253
T.chi2 += zeta0 * zeta0 * S00 + 2. * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
254
T.NDF += TWO;
255
256
K00 =
F00
* S00 +
F01
* S10;
257
K01 =
F00
* S10 +
F01
* S11;
258
K10 =
F10
* S00 +
F11
* S10;
259
K11 =
F10
* S10 +
F11
* S11;
260
K20 =
F20
* S00 +
F21
* S10;
261
K21 =
F20
* S10 +
F21
* S11;
262
K30 =
F30
* S00 +
F31
* S10;
263
K31 =
F30
* S10 +
F31
* S11;
264
K40 = F40 * S00 + F41 * S10;
265
K41 = F40 * S10 + F41 * S11;
266
267
T.x -= K00 * zeta0 + K01 * zeta1;
268
T.y -= K10 * zeta0 + K11 * zeta1;
269
T.tx -= K20 * zeta0 + K21 * zeta1;
270
T.ty -= K30 * zeta0 + K31 * zeta1;
271
T.qp -= K40 * zeta0 + K41 * zeta1;
272
273
T.C00 -= K00 *
F00
+ K01 *
F01
;
274
T.C10 -= K10 *
F00
+ K11 *
F01
;
275
T.C11 -= K10 *
F10
+ K11 *
F11
;
276
T.C20 -= K20 *
F00
+ K21 *
F01
;
277
T.C21 -= K20 *
F10
+ K21 *
F11
;
278
T.C22 -= K20 *
F20
+ K21 *
F21
;
279
T.C30 -= K30 *
F00
+ K31 *
F01
;
280
T.C31 -= K30 *
F10
+ K31 *
F11
;
281
T.C32 -= K30 *
F20
+ K31 *
F21
;
282
T.C33 -= K30 *
F30
+ K31 *
F31
;
283
T.C40 -= K40 *
F00
+ K41 *
F01
;
284
T.C41 -= K40 *
F10
+ K41 *
F11
;
285
T.C42 -= K40 *
F20
+ K41 *
F21
;
286
T.C43 -= K40 *
F30
+ K41 *
F31
;
287
T.C44 -= K40 * F40 + K41 * F41;
288
}
289
290
/*
291
inline void L1Filter1D( L1TrackPar &T, fvec &u, fvec &sigma2, fvec H[] )
292
{
293
294
cnst ZERO = 0.0, ONE = 1.;
295
296
fvec wi, zeta, zetawi, HCH;
297
fvec F0, F1, F2, F3, F4;
298
fvec K1, K2, K3, K4;
299
300
zeta = H[0]*T.x +H[1]*T.y +H[2]*T.tx +H[3]*T.ty +H[4]*T.qp - u;
301
302
// F = CH'
303
F0 = H[0]*T.C00 + H[1]*T.C10 + H[2]*T.C20+ H[3]*T.C30+ H[4]*T.C40;
304
F1 = H[0]*T.C10 + H[1]*T.C11 + H[2]*T.C21+ H[3]*T.C31+ H[4]*T.C41;
305
F2 = H[0]*T.C20 + H[1]*T.C21 + H[2]*T.C22+ H[3]*T.C32+ H[4]*T.C42;
306
F3 = H[0]*T.C30 + H[1]*T.C31 + H[2]*T.C32+ H[3]*T.C33+ H[4]*T.C43;
307
F4 = H[0]*T.C40 + H[1]*T.C41 + H[2]*T.C42+ H[3]*T.C43+ H[4]*T.C44;
308
309
HCH = H[0]*F0 +H[1]*F1 +H[2]*F2 +H[3]*F3 +H[4]*F4 ;
310
311
wi = rcp(fvec(sigma2 +HCH));
312
zetawi = zeta * wi;
313
T.chi2 += zeta * zetawi;
314
T.NDF += ONE;
315
316
K1 = F1*wi;
317
K2 = F2*wi;
318
K3 = F3*wi;
319
K4 = F4*wi;
320
321
T.x -= F0*zetawi;
322
T.y -= F1*zetawi;
323
T.tx -= F2*zetawi;
324
T.ty -= F3*zetawi;
325
T.qp -= F4*zetawi;
326
327
T.C00-= F0*F0*wi;
328
T.C10-= K1*F0;
329
T.C11-= K1*F1;
330
T.C20-= K2*F0;
331
T.C21-= K2*F1;
332
T.C22-= K2*F2;
333
T.C30-= K3*F0;
334
T.C31-= K3*F1;
335
T.C32-= K3*F2;
336
T.C33-= K3*F3;
337
T.C40-= K4*F0;
338
T.C41-= K4*F1;
339
T.C42-= K4*F2;
340
T.C43-= K4*F3;
341
T.C44-= K4*F4;
342
}
343
344
345
inline void L1Filter2D( L1TrackPar &T, fvec &x, fvec &y, L1XYMeasurementInfo &info, fvec H[] )
346
{
347
cnst TWO = 2.;
348
349
fvec zeta0, zeta1, S00, S10, S11, si;
350
fvec F00, F10, F20, F30, F40, F01, F11, F21, F31, F41 ;
351
fvec K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
352
353
zeta0 = H[0]*T.x +H[1]*T.y +H[2]*T.tx +H[3]*T.ty +H[4]*T.qp - x;
354
zeta1 = H[5]*T.x +H[6]*T.y +H[7]*T.tx +H[8]*T.ty +H[9]*T.qp - y;
355
356
// F = CH'
357
F00 = H[0]*T.C00 + H[1]*T.C10 + H[2]*T.C20+ H[3]*T.C30+ H[4]*T.C40;
358
F10 = H[0]*T.C10 + H[1]*T.C11 + H[2]*T.C21+ H[3]*T.C31+ H[4]*T.C41;
359
F20 = H[0]*T.C20 + H[1]*T.C21 + H[2]*T.C22+ H[3]*T.C32+ H[4]*T.C42;
360
F30 = H[0]*T.C30 + H[1]*T.C31 + H[2]*T.C32+ H[3]*T.C33+ H[4]*T.C43;
361
F40 = H[0]*T.C40 + H[1]*T.C41 + H[2]*T.C42+ H[3]*T.C43+ H[4]*T.C44;
362
F01 = H[5]*T.C00 + H[6]*T.C10 + H[7]*T.C20+ H[8]*T.C30+ H[9]*T.C40;
363
F11 = H[5]*T.C10 + H[6]*T.C11 + H[7]*T.C21+ H[8]*T.C31+ H[9]*T.C41;
364
F21 = H[5]*T.C20 + H[6]*T.C21 + H[7]*T.C22+ H[8]*T.C32+ H[9]*T.C42;
365
F31 = H[5]*T.C30 + H[6]*T.C31 + H[7]*T.C32+ H[8]*T.C33+ H[9]*T.C43;
366
F41 = H[5]*T.C40 + H[6]*T.C41 + H[7]*T.C42+ H[8]*T.C43+ H[9]*T.C44;
367
368
S00 = H[0]*F00 +H[1]*F10 +H[2]*F20 +H[3]*F30 +H[4]*F40 + info.C00;
369
S10 = H[5]*F00 +H[6]*F10 +H[7]*F20 +H[8]*F30 +H[9]*F40 + info.C10;
370
S11 = H[5]*F01 +H[6]*F11 +H[7]*F21 +H[8]*F31 +H[9]*F41 + info.C11;
371
372
si = rcp(fvec(S00*S11 - S10*S10));
373
fvec S00tmp = S00;
374
S00 = si*S11;
375
S10 = -si*S10;
376
S11 = si*S00tmp;
377
378
T.chi2+= zeta0*zeta0*S00 + 2.*zeta0*zeta1*S10 + zeta1*zeta1*S11;
379
T.NDF += TWO;
380
381
K00 = F00*S00 + F01*S10; K01 = F00*S10 + F01*S11;
382
K10 = F10*S00 + F11*S10; K11 = F10*S10 + F11*S11;
383
K20 = F20*S00 + F21*S10; K21 = F20*S10 + F21*S11;
384
K30 = F30*S00 + F31*S10; K31 = F30*S10 + F31*S11;
385
K40 = F40*S00 + F41*S10; K41 = F40*S10 + F41*S11;
386
387
T.x -= K00*zeta0 + K01*zeta1;
388
T.y -= K10*zeta0 + K11*zeta1;
389
T.tx -= K20*zeta0 + K21*zeta1;
390
T.ty -= K30*zeta0 + K31*zeta1;
391
T.qp -= K40*zeta0 + K41*zeta1;
392
393
T.C00-= K00*F00 + K01*F01;
394
T.C10-= K10*F00 + K11*F01;
395
T.C11-= K10*F10 + K11*F11;
396
T.C20-= K20*F00 + K21*F01;
397
T.C21-= K20*F10 + K21*F11;
398
T.C22-= K20*F20 + K21*F21;
399
T.C30-= K30*F00 + K31*F01;
400
T.C31-= K30*F10 + K31*F11;
401
T.C32-= K30*F20 + K31*F21;
402
T.C33-= K30*F30 + K31*F31;
403
T.C40-= K40*F00 + K41*F01;
404
T.C41-= K40*F10 + K41*F11;
405
T.C42-= K40*F20 + K41*F21;
406
T.C43-= K40*F30 + K41*F31;
407
T.C44-= K40*F40 + K41*F41;
408
}
409
410
411
412
413
inline void L1FilterFirst( fvec *T, L1Cov &C, fvec &Chi2, fvec &NDF, L1XYMeasurementInfo &info, fvec &x, fvec &y, fvec
414
&w )
415
{
416
cnst ZERO = 0.0, ONE = 1.;
417
418
fvec w1 = !w;
419
C.C00= w&info.C00 + w1&INF;
420
C.C10= w&info.C10 + w1&INF; C.C11= w&info.C11 + w1&INF;
421
C.C20= ZERO; C.C21= ZERO; C.C22= INF;
422
C.C30= ZERO; C.C31= ZERO; C.C32= ZERO; C.C33= INF;
423
C.C40= ZERO; C.C41= ZERO; C.C42= ZERO; C.C43= ZERO; C.C44= INF;
424
425
T[0] = w&x + w1&T[0];
426
T[1] = w&y + w1&T[1];
427
NDF = -3.0;
428
Chi2 = ZERO;
429
}
430
*/
431
432
#undef cnst
433
434
#endif
CbmL1Def.h
F01
#define F01
F00
#define F00
F31
#define F31
F21
#define F21
F30
#define F30
F11
#define F11
F10
#define F10
F20
#define F20
cnst
#define cnst
Definition
L1AddMaterial.h:9
L1Filter
void L1Filter(L1TrackPar &T, L1UMeasurementInfo &info, fvec u, fvec w=1., fvec *du2=0)
Definition
L1Filtration.h:13
L1FilterChi2XYC00C10C11
void L1FilterChi2XYC00C10C11(const L1UMeasurementInfo &info, fvec &x, fvec &y, fvec &C00, fvec &C10, fvec &C11, fvec &chi2, const fvec &u, const fvec *du2=0)
Definition
L1Filtration.h:103
L1FilterXY
void L1FilterXY(L1TrackPar &T, fvec x, fvec y, L1XYMeasurementInfo &info)
Definition
L1Filtration.h:220
L1FilterChi2
void L1FilterChi2(const L1UMeasurementInfo &info, const fvec &x, const fvec &y, const fvec &C00, const fvec &C10, const fvec &C11, fvec &chi2, const fvec &u, const fvec *du2=0)
Definition
L1Filtration.h:75
L1FilterVtx
void L1FilterVtx(L1TrackPar &T, fvec x, fvec y, L1XYMeasurementInfo &info, fvec extrDx, fvec extrDy, fvec J[])
Definition
L1Filtration.h:143
L1TrackPar.h
L1UMeasurementInfo.h
L1XYMeasurementInfo.h
fvec
F32vec4 fvec
Definition
P4_F32vec4.h:231
L1TrackPar
Definition
L1TrackPar.h:7
L1UMeasurementInfo
Definition
L1UMeasurementInfo.h:7
L1UMeasurementInfo::sigma2
fvec sigma2
Definition
L1UMeasurementInfo.h:16
L1UMeasurementInfo::cos_phi
fvec cos_phi
Definition
L1UMeasurementInfo.h:16
L1UMeasurementInfo::sin_phi
fvec sin_phi
Definition
L1UMeasurementInfo.h:16
L1XYMeasurementInfo
Definition
L1XYMeasurementInfo.h:7
L1XYMeasurementInfo::C10
fvec C10
Definition
L1XYMeasurementInfo.h:15
L1XYMeasurementInfo::C11
fvec C11
Definition
L1XYMeasurementInfo.h:15
L1XYMeasurementInfo::C00
fvec C00
Definition
L1XYMeasurementInfo.h:15
reconstruction
cat
L1Algo
L1Filtration.h
Generated on
for BmnRoot by
1.17.0