BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
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"
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.)
13inline 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
75inline 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
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
143inline 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
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/*
291inline 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
345inline 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
413inline 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
#define F01
#define F00
#define F31
#define F21
#define F30
#define F11
#define F10
#define F20
#define cnst
void L1Filter(L1TrackPar &T, L1UMeasurementInfo &info, fvec u, fvec w=1., fvec *du2=0)
void L1FilterChi2XYC00C10C11(const L1UMeasurementInfo &info, fvec &x, fvec &y, fvec &C00, fvec &C10, fvec &C11, fvec &chi2, const fvec &u, const fvec *du2=0)
void L1FilterXY(L1TrackPar &T, fvec x, fvec y, L1XYMeasurementInfo &info)
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)
void L1FilterVtx(L1TrackPar &T, fvec x, fvec y, L1XYMeasurementInfo &info, fvec extrDx, fvec extrDy, fvec J[])
F32vec4 fvec
Definition P4_F32vec4.h:231