14template<
typename DataT,
class Settings>
18 DataT zeta = m.CosPhi() *
fTr.X() + m.SinPhi() *
fTr.Y() - m.U();
21 DataT F0 = m.CosPhi() *
fTr.C00() + m.SinPhi() *
fTr.C10();
22 DataT F1 = m.CosPhi() *
fTr.C10() + m.SinPhi() *
fTr.C11();
24 DataT HCH = (F0 * m.CosPhi() + F1 * m.SinPhi());
26 DataT F2 = m.CosPhi() *
fTr.C20() + m.SinPhi() *
fTr.C21();
27 DataT F3 = m.CosPhi() *
fTr.C30() + m.SinPhi() *
fTr.C31();
28 DataT F4 = m.CosPhi() *
fTr.C40() + m.SinPhi() *
fTr.C41();
30 constexpr bool doProtect = !std::is_same<DataTscal, double>::value;
37 DataT w = m.Du2() + (doProtect ? (DataT(1.0000001) * HCH) : HCH);
40 DataT zetawi = zeta / (
kf::utils::iif(maskDoFilter, m.Du2(), DataT(0.)) + HCH);
45 fTr.ChiSq() += zeta * zeta * wi;
48 if constexpr (Settings::kDoFitTime) {
49 DataT F5 = m.CosPhi() *
fTr.C50() + m.SinPhi() *
fTr.C51();
50 DataT F6 = m.CosPhi() *
fTr.C60() + m.SinPhi() *
fTr.C61();
54 fTr.Time() -= F5 * zetawi;
55 fTr.Vi() -= F6 * zetawi;
78 fTr.X() -= F0 * zetawi;
79 fTr.Y() -= F1 * zetawi;
80 fTr.Tx() -= F2 * zetawi;
81 fTr.Ty() -= F3 * zetawi;
82 fTr.Qp() -= F4 * zetawi;
84 fTr.C00() -= F0 * F0 * wi;
100 fTr.C42() -= K4 * F2;
101 fTr.C43() -= K4 * F3;
102 fTr.C44() -= K4 * F4;
107template<
typename DataT,
class Settings>
112 if constexpr (!Settings::kDoFitTime) {
117 DataT F0 =
fTr.C50();
118 DataT F1 =
fTr.C51();
119 DataT F2 =
fTr.C52();
120 DataT F3 =
fTr.C53();
121 DataT F4 =
fTr.C54();
122 DataT F5 =
fTr.C55();
123 DataT F6 =
fTr.C65();
125 DataT HCH =
fTr.C55();
134 const DataTmask maskDoFilter = mask && (HCH < dt2 * 16.f);
136 DataT wi =
kf::utils::iif(mask, DataT(1.) / (dt2 + DataT(1.0000001) * HCH), DataT(0.));
150 fTr.X() -= F0 * zetawi;
151 fTr.Y() -= F1 * zetawi;
152 fTr.Tx() -= F2 * zetawi;
153 fTr.Ty() -= F3 * zetawi;
154 fTr.Qp() -= F4 * zetawi;
155 fTr.Time() -= F5 * zetawi;
158 fTr.C00() -= F0 * F0 * wi;
160 fTr.C10() -= K1 * F0;
161 fTr.C11() -= K1 * F1;
163 fTr.C20() -= K2 * F0;
164 fTr.C21() -= K2 * F1;
165 fTr.C22() -= K2 * F2;
167 fTr.C30() -= K3 * F0;
169 fTr.C32() -= K3 * F2;
170 fTr.C33() -= K3 * F3;
172 fTr.C40() -= K4 * F0;
173 fTr.C41() -= K4 * F1;
174 fTr.C42() -= K4 * F2;
175 fTr.C43() -= K4 * F3;
176 fTr.C44() -= K4 * F4;
178 fTr.C50() -= K5 * F0;
179 fTr.C51() -= K5 * F1;
180 fTr.C52() -= K5 * F2;
182 fTr.C54() -= K5 * F4;
183 fTr.C55() -= K5 * F5;
185 fTr.C60() -= K6 * F0;
186 fTr.C61() -= K6 * F1;
187 fTr.C62() -= K6 * F2;
189 fTr.C64() -= K6 * F4;
190 fTr.C65() -= K6 * F5;
191 fTr.C66() -= K6 * F6;
195template<
typename DataT,
class Settings>
213 auto maskOld =
fMask;
214 if (skipUnmeasuredCoordinates) {
215 fMask = maskOld & (mxy.
NdfX() > DataT(0.));
218 if (skipUnmeasuredCoordinates) {
219 fMask = maskOld & (mxy.
NdfY() > DataT(0.));
232 DataT zeta0, zeta1, S00, S10, S11, si;
233 DataT F00, F10, F20, F30, F40, F50, F60;
234 DataT F01, F11, F21, F31, F41, F51, F61;
235 DataT K00, K10, K20, K30, K40, K50, K60;
236 DataT K01, K11, K21, K31, K41, K51, K61;
238 zeta0 =
fTr.X() - mxy.
X();
239 zeta1 =
fTr.Y() - mxy.
Y();
258 S00 = F00 + mxy.
Dx2();
259 S10 = F10 + mxy.
Dxy();
260 S11 = F11 + mxy.
Dy2();
262 si = 1.f / (S00 * S11 - S10 * S10);
268 fTr.ChiSq() += zeta0 * zeta0 * S00 + 2.f * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
271 K00 = F00 * S00 + F01 * S10;
272 K01 = F00 * S10 + F01 * S11;
274 K10 = F10 * S00 + F11 * S10;
275 K11 = F10 * S10 + F11 * S11;
277 K20 = F20 * S00 + F21 * S10;
278 K21 = F20 * S10 + F21 * S11;
280 K30 = F30 * S00 + F31 * S10;
281 K31 = F30 * S10 + F31 * S11;
283 K40 = F40 * S00 + F41 * S10;
284 K41 = F40 * S10 + F41 * S11;
286 K50 = F50 * S00 + F51 * S10;
287 K51 = F50 * S10 + F51 * S11;
289 K60 = F60 * S00 + F61 * S10;
290 K61 = F60 * S10 + F61 * S11;
292 fTr.X() -= K00 * zeta0 + K01 * zeta1;
293 fTr.Y() -= K10 * zeta0 + K11 * zeta1;
294 fTr.Tx() -= K20 * zeta0 + K21 * zeta1;
295 fTr.Ty() -= K30 * zeta0 + K31 * zeta1;
296 fTr.Qp() -= K40 * zeta0 + K41 * zeta1;
297 fTr.Time() -= K50 * zeta0 + K51 * zeta1;
298 fTr.Vi() -= K60 * zeta0 + K61 * zeta1;
300 fTr.C00() -= K00 * F00 + K01 * F01;
302 fTr.C10() -= K10 * F00 + K11 * F01;
303 fTr.C11() -= K10 * F10 + K11 * F11;
305 fTr.C20() -= K20 * F00 + K21 * F01;
306 fTr.C21() -= K20 * F10 + K21 * F11;
307 fTr.C22() -= K20 * F20 + K21 * F21;
309 fTr.C30() -= K30 * F00 + K31 * F01;
310 fTr.C31() -= K30 * F10 + K31 * F11;
311 fTr.C32() -= K30 * F20 + K31 * F21;
312 fTr.C33() -= K30 * F30 + K31 * F31;
314 fTr.C40() -= K40 * F00 + K41 * F01;
315 fTr.C41() -= K40 * F10 + K41 * F11;
316 fTr.C42() -= K40 * F20 + K41 * F21;
317 fTr.C43() -= K40 * F30 + K41 * F31;
318 fTr.C44() -= K40 * F40 + K41 * F41;
320 fTr.C50() -= K50 * F00 + K51 * F01;
321 fTr.C51() -= K50 * F10 + K51 * F11;
322 fTr.C52() -= K50 * F20 + K51 * F21;
323 fTr.C53() -= K50 * F30 + K51 * F31;
324 fTr.C54() -= K50 * F40 + K51 * F41;
325 fTr.C55() -= K50 * F50 + K51 * F51;
327 fTr.C60() -= K60 * F00 + K61 * F01;
328 fTr.C61() -= K60 * F10 + K61 * F11;
329 fTr.C62() -= K60 * F20 + K61 * F21;
330 fTr.C63() -= K60 * F30 + K61 * F31;
331 fTr.C64() -= K60 * F40 + K61 * F41;
332 fTr.C65() -= K60 * F50 + K61 * F51;
333 fTr.C66() -= K60 * F60 + K61 * F61;
337template<
typename DataT,
class Settings>
339 std::array<DataT, 5>& Jx,
340 std::array<DataT, 5>& Jy)
const
351 DataT z =
fTr.GetZ();
358 DataT cL = c_light *
sqrt(DataT(1.) + xx + yy);
361 std::tie(Sx, Sy, Sz) =
Field.GetDoubleIntegrals(
x,
y, z,
x +
h * tx,
y +
h * ty, zm);
367 Jx[4] = cL * (Sx * xy - Sy * (xx + DataT(1.)) + Sz * ty);
373 Jy[4] = cL * (Sx * (yy + DataT(1.)) - Sy * xy - Sz * tx);
376template<
typename DataT,
class Settings>
378 const std::array<DataT, 5>& Jx,
379 const std::array<DataT, 5>& Jy)
385 DataT zeta0 = T.X() + Jx[2] * T.Tx() + Jx[4] * T.Qp() - m.X();
386 DataT zeta1 = T.Y() + Jy[3] * T.Ty() + Jy[4] * T.Qp() - m.Y();
399 DataT F00 = T.C00() + Jx[2] * T.C20() + Jx[4] * T.C40();
400 DataT F01 = T.C10() + Jy[3] * T.C30() + Jy[4] * T.C40();
402 DataT F10 = T.C10() + Jx[2] * T.C21() + Jx[4] * T.C41();
403 DataT F11 = T.C11() + Jy[3] * T.C31() + Jy[4] * T.C41();
405 DataT F20 = T.C20() + Jx[2] * T.C22() + Jx[4] * T.C42();
406 DataT F21 = T.C21() + Jy[3] * T.C32() + Jy[4] * T.C42();
408 DataT F30 = T.C30() + Jx[2] * T.C32() + Jx[4] * T.C43();
409 DataT F31 = T.C31() + Jy[3] * T.C33() + Jy[4] * T.C43();
411 DataT F40 = T.C40() + Jx[2] * T.C42() + Jx[4] * T.C44();
412 DataT F41 = T.C41() + Jy[3] * T.C43() + Jy[4] * T.C44();
416 DataT S00 = m.Dx2() + F00 + Jx[2] * F20 + Jx[4] * F40;
417 DataT S10 = m.Dxy() + F10 + Jy[3] * F30 + Jy[4] * F40;
418 DataT S11 = m.Dy2() + F11 + Jy[3] * F31 + Jy[4] * F41;
421 DataT si = DataT(1.) / (S00 * S11 - S10 * S10);
428 T.ChiSq() += zeta0 * zeta0 * S00 + DataT(2.) * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
429 T.Ndf() += m.NdfX() + m.NdfY();
431 DataT K00 = F00 * S00 + F01 * S10;
432 DataT K01 = F00 * S10 + F01 * S11;
433 DataT K10 = F10 * S00 + F11 * S10;
434 DataT K11 = F10 * S10 + F11 * S11;
435 DataT K20 = F20 * S00 + F21 * S10;
436 DataT K21 = F20 * S10 + F21 * S11;
437 DataT K30 = F30 * S00 + F31 * S10;
438 DataT K31 = F30 * S10 + F31 * S11;
439 DataT K40 = F40 * S00 + F41 * S10;
440 DataT K41 = F40 * S10 + F41 * S11;
442 T.X() -= K00 * zeta0 + K01 * zeta1;
443 T.Y() -= K10 * zeta0 + K11 * zeta1;
444 T.Tx() -= K20 * zeta0 + K21 * zeta1;
445 T.Ty() -= K30 * zeta0 + K31 * zeta1;
446 T.Qp() -= K40 * zeta0 + K41 * zeta1;
448 T.C00() -= (K00 * F00 + K01 * F01);
449 T.C10() -= (K10 * F00 + K11 * F01);
450 T.C11() -= (K10 * F10 + K11 * F11);
451 T.C20() -= (K20 * F00 + K21 * F01);
452 T.C21() -= (K20 * F10 + K21 * F11);
453 T.C22() -= (K20 * F20 + K21 * F21);
454 T.C30() -= (K30 * F00 + K31 * F01);
455 T.C31() -= (K30 * F10 + K31 * F11);
456 T.C32() -= (K30 * F20 + K31 * F21);
457 T.C33() -= (K30 * F30 + K31 * F31);
458 T.C40() -= (K40 * F00 + K41 * F01);
459 T.C41() -= (K40 * F10 + K41 * F11);
460 T.C42() -= (K40 * F20 + K41 * F21);
461 T.C43() -= (K40 * F30 + K41 * F31);
462 T.C44() -= (K40 * F40 + K41 * F41);
466template<
typename DataT,
class Settings>
468 const std::array<DataT, 5>& Jy)
474 DataT zeta = T.Y() + Jy[3] * T.Ty() + Jy[4] * T.Qp() - m.Y();
476 DataT F1 = T.C11() + Jy[3] * T.C31() + Jy[4] * T.C41();
477 DataT F3 = T.C31() + Jy[3] * T.C33() + Jy[4] * T.C43();
478 DataT F4 = Jy[4] * T.C44();
480 DataT S = DataT(1.) / (m.Dy2() + F1 + Jy[3] * F3 + Jy[4] * F4);
482 T.ChiSq() += zeta * zeta * S;
490 T.C11() -= (K1 * F1);
491 T.C31() -= (K3 * F1);
492 T.C33() -= (K3 * F3);
496template<
typename DataT,
class Settings>
498 const std::array<DataT, 5>& jL,
501 const std::array<DataT, 5>& jR)
506 DataT chi2 = T.ChiSq();
511 DataT yL = mL.
Y() - l4 * qp;
512 DataT lS = mL.
Dy2() + l4 * l4 * qpS;
521 DataT yR = mR.
Y() - r4 * qp;
522 DataT rS = mR.
Dy2() + r4 * r4 * qpS;
526 DataT a = lS + mS + l3 * l3 * msM;
531 DataT zeta = (l3 * (yM - yR) + r3 * (yL - yM));
533 DataT b = r3 * lS + (r3 - l3) * mS + r3 * l3 * l3 * msM;
535 DataT c = l3 * l3 * rS + (l3 - r3) * (l3 - r3) * mS + r3 * r3 * lS + r3 * r3 * l3 * l3 * msM;
537 chi2 += zeta * zeta / c;
539 ty = ((yL - yM) * c - b * zeta) / l3 / c;
540 c33 = (a * c - b * b) / l3 / l3 / c;
548template<
typename DataT,
class Settings>
550 const std::array<DataT, 5>& jL,
553 const std::array<DataT, 5>& jR)
558 DataT chi2 = T.ChiSq();
563 DataT yL = mL.
Y() - l4 * qp;
564 DataT lS = mL.
Dy2() + l4 * l4 * qpS;
573 DataT yR = mR.
Y() - r4 * qp;
574 DataT rS = mR.
Dy2() + r4 * r4 * qpS;
577 DataT zeta = (l3 * (yM - yR) + r3 * (yL - yM));
578 DataT c = l3 * l3 * rS + (l3 - r3) * (l3 - r3) * mS + r3 * r3 * lS + r3 * r3 * l3 * l3 * msM;
580 chi2 += zeta * zeta / c;
585template<
typename DataT,
class Settings>
594 DataT F0, F1, F2, F3, F4, F5, F6;
595 DataT K1, K2, K3, K4, K5, K6;
613 F0 =
h *
fTr.C40() -
fTr.C60();
614 F1 =
h *
fTr.C41() -
fTr.C61();
615 F2 =
h *
fTr.C42() -
fTr.C62();
616 F3 =
h *
fTr.C43() -
fTr.C63();
617 F4 =
h *
fTr.C44() -
fTr.C64();
618 F5 =
h *
fTr.C54() -
fTr.C65();
619 F6 =
h *
fTr.C64() -
fTr.C66();
635 fTr.X() -= F0 * zetawi;
636 fTr.Y() -= F1 * zetawi;
637 fTr.Tx() -= F2 * zetawi;
638 fTr.Ty() -= F3 * zetawi;
639 fTr.Qp() -= F4 * zetawi;
640 fTr.Time() -= F5 * zetawi;
641 fTr.Vi() -= F6 * zetawi;
643 fTr.C00() -= F0 * F0 * wi;
645 fTr.C10() -= K1 * F0;
646 fTr.C11() -= K1 * F1;
648 fTr.C20() -= K2 * F0;
649 fTr.C21() -= K2 * F1;
650 fTr.C22() -= K2 * F2;
652 fTr.C30() -= K3 * F0;
653 fTr.C31() -= K3 * F1;
654 fTr.C32() -= K3 * F2;
655 fTr.C33() -= K3 * F3;
657 fTr.C40() -= K4 * F0;
658 fTr.C41() -= K4 * F1;
659 fTr.C42() -= K4 * F2;
660 fTr.C43() -= K4 * F3;
661 fTr.C44() -= K4 * F4;
663 fTr.C50() -= K5 * F0;
664 fTr.C51() -= K5 * F1;
665 fTr.C52() -= K5 * F2;
666 fTr.C53() -= K5 * F3;
667 fTr.C54() -= K5 * F4;
668 fTr.C55() -= K5 * F5;
670 fTr.C60() -= K6 * F0;
671 fTr.C61() -= K6 * F1;
672 fTr.C62() -= K6 * F2;
673 fTr.C63() -= K6 * F3;
674 fTr.C64() -= K6 * F4;
675 fTr.C65() -= K6 * F5;
676 fTr.C66() -= K6 * F6;
681template<
typename DataT,
class Settings>
687 DataT F0, F1, F2, F3, F4, F5, F6;
688 DataT K1, K2, K3, K4, K5;
690 zeta =
fTr.Vi() - vi;
718 fTr.X() -= F0 * zetawi;
719 fTr.Y() -= F1 * zetawi;
720 fTr.Tx() -= F2 * zetawi;
721 fTr.Ty() -= F3 * zetawi;
722 fTr.Qp() -= F4 * zetawi;
723 fTr.Time() -= F5 * zetawi;
727 fTr.C00() -= F0 * F0 * wi;
729 fTr.C10() -= K1 * F0;
730 fTr.C11() -= K1 * F1;
732 fTr.C20() -= K2 * F0;
733 fTr.C21() -= K2 * F1;
734 fTr.C22() -= K2 * F2;
736 fTr.C30() -= K3 * F0;
737 fTr.C31() -= K3 * F1;
738 fTr.C32() -= K3 * F2;
739 fTr.C33() -= K3 * F3;
741 fTr.C40() -= K4 * F0;
742 fTr.C41() -= K4 * F1;
743 fTr.C42() -= K4 * F2;
744 fTr.C43() -= K4 * F3;
745 fTr.C44() -= K4 * F4;
747 fTr.C50() -= K5 * F0;
748 fTr.C51() -= K5 * F1;
749 fTr.C52() -= K5 * F2;
750 fTr.C53() -= K5 * F3;
751 fTr.C54() -= K5 * F4;
752 fTr.C55() -= K5 * F5;
761 fTr.C60() = DataT(0.);
762 fTr.C61() = DataT(0.);
763 fTr.C62() = DataT(0.);
764 fTr.C63() = DataT(0.);
765 fTr.C64() = DataT(0.);
766 fTr.C65() = DataT(0.);
767 fTr.C66() = DataT(1.e-8);
771template<
typename DataT,
class Settings>
817 const std::array<DataT, 5> stepDz = {0., 0.,
h * DataT(0.5),
h * DataT(0.5),
h};
821 DataT f[5][
N] = {{DataT(0.)}};
822 DataT
F[5][
N][
N] = {{{DataT(0.)}}};
829 if constexpr (std::is_same_v<Linearization_t, LinearizationFull<DataT>>) {
838 else if constexpr (std::is_same_v<Linearization_t, LinearizationQp<DataT>>) {
842 LOG(fatal) <<
"TrackKalmanFilter<DataT,Settings>::ExtrapolateStep: Unknown Linearization_t type";
846 for (
int step = 1; step <= 4; ++step) {
848 DataT rstep[
N] = {DataT(0.)};
849 for (
int i = 0; i <
N; ++i) {
850 rstep[i] = r0[i] + stepDz[step] * f[step - 1][i];
852 DataT z =
fTr.GetZ() + stepDz[step];
855 DataT Bx =
B.GetBx();
856 DataT By =
B.GetBy();
857 DataT Bz =
B.GetBz();
864 DataT txty = tx * ty;
865 DataT L2 = DataT(1.) + tx2 + ty2;
866 DataT L2i = DataT(1.) / L2;
868 DataT cL = c_light * L;
869 DataT cLqp0 = cL * r0[4];
877 DataT f2tmp = txty * Bx - (DataT(1.) + tx2) * By + ty * Bz;
878 f[step][2] = cLqp0 * f2tmp;
880 F[step][2][2] = cLqp0 * (tx * f2tmp * L2i + ty * Bx - DataT(2.) * tx * By);
881 F[step][2][3] = cLqp0 * (ty * f2tmp * L2i + tx * Bx + Bz);
882 F[step][2][4] = cL * f2tmp;
884 DataT f3tmp = -txty * By - tx * Bz + (DataT(1.) + ty2) * Bx;
885 f[step][3] = cLqp0 * f3tmp;
886 F[step][3][2] = cLqp0 * (tx * f3tmp * L2i - ty * By - Bz);
887 F[step][3][3] = cLqp0 * (ty * f3tmp * L2i + DataT(2.) * ty * Bx - tx * By);
888 F[step][3][4] = cL * f3tmp;
892 if constexpr (Settings::kDoFitTime) {
895 F[step][5][2] = vi * tx / L;
896 F[step][5][3] = vi * ty / L;
905 cnst stepW[5] = {0.,
h / DataT(6.),
h / DataT(3.),
h / DataT(3.),
h / DataT(6.)};
907 DataT R[
N][
N] = {{DataT(0.)}};
909 for (
int i = 0; i <
N; ++i) {
912 DataT k[5][
N][
N] = {{{DataT(0.)}}};
913 for (
int step = 1; step <= 4; ++step) {
914 for (
int i = 0; i <
N; i++) {
915 for (
int j = 0; j <
N; j++) {
916 k[step][i][j] =
F[step][i][j];
917 for (
int m = 0; m <
N; m++) {
918 k[step][i][j] += stepDz[step] *
F[step][i][m] * k[step - 1][m][j];
920 R[i][j] += stepW[step] * k[step][i][j];
928 DataT dPar[7] = {
fTr.X() - r0[0],
938 for (
int i = 0; i <
N; i++) {
939 for (
int step = 1; step <= 4; step++) {
940 r0[i] += stepW[step] * f[step][i];
946 DataT r[
N] = {DataT(0.)};
947 for (
int i = 0; i <
N; i++) {
951 for (
int i = 0; i <
N; i++) {
952 for (
int j = 0; j <
N; j++) {
953 r[i] += R[i][j] * dPar[j];
959 if constexpr (std::is_same_v<Linearization_t, LinearizationFull<DataT>>) {
968 else if constexpr (std::is_same_v<Linearization_t, LinearizationQp<DataT>>) {
979 if constexpr (Settings::kDoFitTime) {
988 for (
int i = 0, ii = 0; i <
N; i++) {
989 for (
int j = 0; j <= i; j++, ii++) {
990 C[i][j] =
fTr.GetCovMatrix()[ii];
996 for (
int i = 0; i <
N; i++) {
997 for (
int j = 0; j <
N; j++) {
999 for (
int m = 0; m <
N; m++) {
1000 RC[i][j] += R[i][m] *
C[m][j];
1005 for (
int i = 0, ii = 0; i <
N; i++) {
1006 for (
int j = 0; j <= i; j++, ii++) {
1008 for (
int m = 0; m <
N; m++) {
1009 Cij += RC[i][m] * R[j][m];
1011 fTr.CovMatrix()[ii] = Cij;
1019template<
typename DataT,
class Settings>
1032 cnst dz = (zMasked -
fTr.GetZ());
1038 DataT time = t.Time();
1041 if constexpr (std::is_same<Linearization_t, LinearizationFull<DataT>>::value) {
1058 t.X() = t.X() + t.Tx() * dz;
1059 t.Y() = t.Y() + t.Ty() * dz;
1062 if constexpr (std::is_same<Linearization_t, LinearizationFull<DataT>>::value) {
1071 if constexpr (Settings::kDoFitTime) {
1073 DataT L =
sqrt(DataT(1.) + tx * tx + ty * ty);
1075 if constexpr (std::is_same<Linearization_t, LinearizationFull<DataT>>::value) {
1079 DataT j52 = dz * tx * vi / L;
1080 DataT j53 = dz * ty * vi / L;
1083 DataT jc50 = t.C50() + j52 * t.C20() + j53 * t.C30() + j56 * t.C60();
1084 DataT jc51 = t.C51() + j52 * t.C21() + j53 * t.C31() + j56 * t.C61();
1085 DataT jc52 = t.C52() + j52 * t.C22() + j53 * t.C32() + j56 * t.C62();
1086 DataT jc53 = t.C53() + j52 * t.C23() + j53 * t.C33() + j56 * t.C63();
1087 DataT jc54 = t.C54() + j52 * t.C24() + j53 * t.C34() + j56 * t.C64();
1088 DataT jc55 = t.C55() + j52 * t.C25() + j53 * t.C35() + j56 * t.C65();
1089 DataT jc56 = t.C56() + j52 * t.C26() + j53 * t.C36() + j56 * t.C66();
1091 DataT dtx = t.Tx() - tx;
1092 DataT dty = t.Ty() - ty;
1093 DataT dvi = t.Vi() - vi;
1095 t.Time() = t.Time() + L * vi * dz + j52 * dtx + j53 * dty + j56 * dvi;
1097 t.C50() = jc50 + jc52 * dz;
1098 t.C60() = t.C60() + t.C62() * dz;
1100 t.C51() = jc51 + jc53 * dz;
1101 t.C61() = t.C61() + t.C63() * dz;
1106 t.C55() = jc55 + jc52 * j52 + jc53 * j53 + jc56 * j56;
1107 t.C65() = t.C65() + t.C62() * j52 + t.C63() * j53 + t.C66() * j56;
1110 DataT jc00 = t.C00() + dz * t.C20();
1111 DataT jc02 = t.C02() + dz * t.C22();
1113 DataT jc10 = t.C10() + dz * t.C30();
1114 DataT jc11 = t.C11() + dz * t.C31();
1115 DataT jc12 = t.C12() + dz * t.C32();
1116 DataT jc13 = t.C13() + dz * t.C33();
1130 t.C00() = jc00 + jc02 * dz;
1131 t.C10() = jc10 + jc12 * dz;
1132 t.C20() = t.C20() + t.C22() * dz;
1133 t.C30() = t.C30() + t.C32() * dz;
1134 t.C40() = t.C40() + t.C42() * dz;
1136 t.C11() = jc11 + jc13 * dz;
1137 t.C21() = t.C21() + t.C23() * dz;
1138 t.C31() = t.C31() + t.C33() * dz;
1139 t.C41() = t.C41() + t.C43() * dz;
1143template<
typename DataT,
class Settings>
1156template<
typename DataT,
class Settings>
1165 DataT txtx = tx * tx;
1166 DataT tyty = ty * ty;
1167 DataT txtx1 = DataT(1.) + txtx;
1168 DataT tyty1 = DataT(1.) + tyty;
1169 DataT t =
sqrt(txtx1 + tyty);
1172 DataT lg = DataT(.0136) * (DataT(1.) + DataT(0.038) *
log(radThick * t));
1175 DataT s0 = lg * qp * t;
1176 DataT a = (DataT(1.) +
fMass2 * qp * qp) * s0 * s0 * t * radThick;
1192template<
typename DataT,
class Settings>
1198 DataT tx =
fTr.Tx();
1199 DataT ty =
fTr.Ty();
1200 DataT txtx = tx * tx;
1201 DataT tyty = ty * ty;
1202 DataT txtx1 = txtx + kONE;
1203 DataT
h = txtx + tyty;
1204 DataT t =
sqrt(txtx1 + tyty);
1208 cnst c1(0.0136), c2 = c1 * DataT(0.038), c3 = c2 * DataT(0.5), c4 = -c3 / DataT(2.0), c5 = c3 / DataT(3.0),
1209 c6 = -c3 / DataT(4.0);
1211 DataT s0 = (c1 + c2 *
log(radThick) + c3 *
h + h2 * (c4 + c5 *
h + c6 * h2)) * qp0t;
1215 DataT
D = (fDownstream) ? DataT(1.) : DataT(-1.);
1216 DataT T23 = (thickness * thickness) / DataT(3.0);
1217 DataT T2 = thickness / DataT(2.0);
1234template<
typename DataT,
class Settings>
1237 cnst qp2cut(1. / (10. * 10.));
1239 cnst p2 = DataT(1.) / qp02;
1246 DataT dE = bethe * radThick * tr * 2.33f * 9.34961f;
1251 cnst E2Corrected = ECorrected * ECorrected;
1253 DataT corr =
sqrt(p2 / (E2Corrected -
fMass2));
1263 fTr.C44() *= corr * corr;
1268template<
typename DataT,
class Settings>
1272 cnst qp2cut(1. / (10. * 10.));
1274 cnst p2 = DataT(1.) / qp02;
1279 i = (12. * atomicZ + 7.) * 1.e-9;
1282 i = (9.76 * atomicZ + 58.8 * std::pow(atomicZ, -0.19)) * 1.e-9;
1289 DataT dE = bethe * radThick * tr * radLen * rho;
1294 cnst E2Corrected = ECorrected * ECorrected;
1296 DataT corr =
sqrt(p2 / (E2Corrected -
fMass2));
1309 DataT STEP = radThick * tr * radLen;
1310 DataT EMASS(0.511 * 1e-3);
1312 DataT BETA = P / ECorrected;
1313 DataT GAMMA = ECorrected /
fMass;
1316 DataT XI = (DataT(153.5) * Z * STEP * RHO) / (
A * BETA * BETA);
1319 DataT ETA = BETA * GAMMA;
1320 DataT ETASQ = ETA * ETA;
1321 DataT RATIO = EMASS /
fMass;
1322 DataT F1 = DataT(2.) * EMASS * ETASQ;
1323 DataT F2 = DataT(1.) + DataT(2.) * RATIO * GAMMA + RATIO * RATIO;
1324 DataT EMAX = DataT(1e6) * F1 / F2;
1326 DataT DEDX2 = XI * EMAX * (DataT(1.) - (BETA * BETA / DataT(2.))) * DataT(1e-12);
1329 DataT SDEDX = (E2 * DEDX2) / (P2 * P2 * P2);
1340template<
typename DataT,
class Settings>
1361 cnst kp4 = 0.49848f;
1366 cnst x0 = kp1 * 2.303f;
1367 cnst x1 = kp2 * 2.303f;
1370 cnst maxT = _2me * bg2;
1375 cnst lhwI =
log(28.816f * 1e-9f *
sqrt(rho * mZA) / mI);
1379 cnst r = (x1 -
x) / (x1 - x0);
1380 init = (
x > x0) & (x1 >
x);
1381 d2 =
kf::utils::iif(init, lhwI +
x - 0.5f + (0.5f - lhwI - x0) * r * r * r, d2);
1383 return mK * mZA * (DataT(1.f) + bg2) / bg2
1384 * (0.5f *
log(_2me * bg2 * maxT / (mI * mI)) - bg2 / (DataT(1.f) + bg2) - d2);
1387template<
typename DataT,
class Settings>
1414 cnst x0 = kp1 * 2.303f;
1415 cnst x1 = kp2 * 2.303f;
1418 cnst maxT = _2me * bg2;
1423 cnst lhwI =
log(28.816f * 1e-9f *
sqrt(rho * mZA) / mI);
1427 cnst r = (x1 -
x) / (x1 - x0);
1428 init = (
x > x0) & (x1 >
x);
1429 d2 =
kf::utils::iif(init, lhwI +
x - 0.5f + (0.5f - lhwI - x0) * r * r * r, d2);
1431 return mK * mZA * (DataT(1.f) + bg2) / bg2
1432 * (0.5f *
log(_2me * bg2 * maxT / (mI * mI)) - bg2 / (DataT(1.f) + bg2) - d2);
1436template<
typename DataT,
class Settings>
1438 DataT C00, DataT C10, DataT C11)
1444 DataT zeta =
x - m.X();
1452 DataT wi = DataT(1.) / (m.Dx2() + HCH);
1453 DataT zetawi = zeta * wi;
1454 chi2x = m.NdfX() * zeta * zetawi;
1461 C00 -= F0 * F0 * wi;
1469 DataT cosPhi = -m.Dxy() / m.Dx2();
1470 DataT u = cosPhi * m.X() + m.Y();
1471 DataT du2 = m.Dy2() + cosPhi * m.Dxy();
1473 DataT zeta = cosPhi *
x +
y - u;
1476 DataT F0 = cosPhi * C00 + C10;
1477 DataT F1 = cosPhi * C10 + C11;
1479 DataT HCH = (F0 * cosPhi + F1);
1481 chi2u += m.NdfY() * zeta * zeta / (du2 + HCH);
1484 return std::tuple<DataT, DataT>(chi2x, chi2u);
1488template<
typename DataT,
class Settings>
1490 const DataT hitZ[],
const DataT hitT[],
const DataT By[],
1496 const DataT c_light(0.000299792458), c_light_i(DataT(1.) / c_light);
1498 DataT A0 = 0., A1 = 0., A2 = 0., A3 = 0., A4 = 0., A5 = 0.;
1499 DataT a0 = 0., a1 = 0., a2 = 0.;
1500 DataT b0 = 0., b1 = 0., b2 = 0.;
1506 DataT sy = 0., Sy = 0.;
1508 for (
int i = 0; i < NHits; i++) {
1512 DataTmask setTime = (!isTimeSet) && hitWtime[i] && hitW[i];
1514 isTimeSet = isTimeSet || setTime;
1518 DataT z = hitZ[i] - trackZ;
1521 DataT dZ = z - prevZ;
1522 Sy += w * dZ * sy + DataT(0.5) * dZ * dZ * By[i];
1523 sy += w * dZ * By[i];
1564 m11 = m00 * m11 - m01 * m01;
1565 m12 = m00 * m12 - m01 * m02;
1566 a1 = m00 * a1 - m01 * a0;
1568 m21 = m00 * m21 - m02 * m01;
1569 m22 = m00 * m22 - m02 * m02;
1570 a2 = m00 * a2 - m02 * a0;
1574 m22 = m11 * m22 - m21 * m12;
1575 a2 = m11 * a2 - m21 * a1;
1586 fTr.Tx() = a1 / m11;
1587 a0 -=
fTr.Tx() * m01;
1594 DataT txtx1 = DataT(1.) +
fTr.Tx() *
fTr.Tx();
1596 DataT L1 = L *
fTr.Tx();
1599 A2 = A2 + (A4 + A4 + A5 * L1) * L1;
1605 A2 = A0 * A2 - A1 * A1;
1606 b1 = A0 * b1 - A1 * b0;
1609 fTr.Y() = (b0 - A1 *
fTr.Ty()) / A0;
1611 fTr.Qp() = -L * c_light_i /
sqrt(txtx1 +
fTr.Ty() *
fTr.Ty());
Definition of the KfMeasurementXy class.
friend fvec sqrt(const fvec &a)
friend fvec log(const fvec &a)
Track fit utilities for the CA tracking based on the Kalman filter.
Generates beam ions for transport simulation.
Magnetic field region, corresponding to a hit triplet.
Magnetic flux density vector.
Magnetic field manager class.
The class describes a 1D - measurement U in XY coordinate system.
void SetSinPhi(DataT sinPhi)
void SetCosPhi(DataT cosPhi)
The class describes a 2D - measurement (x, y) in XY coordinate system.
static constexpr int kNactiveParams
void FilterTime(DataT t, DataT dt2, const DataTmask &m)
filter the track with the time measurement
void EnergyLossCorrection(DataT radThick, FitDirection direction)
void ExtrapolateNoField(DataT z)
extrapolate the track to the given Z assuming no magnetic field
void FilterExtrapolatedXY(const kf::MeasurementXy< DataT > &m, const std::array< DataT, 5 > &Jx, const std::array< DataT, 5 > &Jy)
kf::TrackParam< DataT > fTr
track parameters
kf::utils::masktype< DataT > DataTmask
Linearization_t fLinearisation
linearization parameters
void Filter1d(const kf::MeasurementU< DataT > &m)
filter the track with the 1d measurement
void FilterExtrapolatedY(const kf::MeasurementXy< DataT > &m, const std::array< DataT, 5 > &Jy)
void Extrapolate(DataT z, const kf::FieldRegion< DataT > &F)
static DataT ApproximateBetheBloch(DataT bg2)
Approximate mean energy loss with Bethe-Bloch formula.
DataT fMass
particle mass (muon mass by default)
kf::utils::scaltype< DataT > DataTscal
void MultipleScattering(DataT radThick, DataT tx0, DataT ty0, DataT qp0)
apply multiple scattering correction to the track with the given Qp0
void FilterExtrapolatedYChi2(const kf::MeasurementXy< DataT > &mL, const std::array< DataT, 5 > &jL, const kf::MeasurementXy< DataT > &mM, DataT msM, const kf::MeasurementXy< DataT > &mR, const std::array< DataT, 5 > &jR)
static std::tuple< DataT, DataT > GetChi2XChi2U(kf::MeasurementXy< DataT > m, DataT x, DataT y, DataT C00, DataT C10, DataT C11)
git two chi^2 components of the track fit to measurement
void GuessTrack(const DataT &trackZ, const DataT hitX[], const DataT hitY[], const DataT hitZ[], const DataT hitT[], const DataT By[], const DataTmask hitW[], const DataTmask hitWtime[], int NHits)
fast guess of track parameterts based on its hits
void FilterXY(const kf::MeasurementXy< DataT > &m, bool skipUnmeasuredCoordinates=false)
filter the track with the XY measurement
void ExtrapolateInOneStep(DataT z, const kf::FieldRegion< DataT > &Field)
void MultipleScatteringInThickMaterial(DataT radThick, DataT thickness, bool fDownstream)
apply multiple scattering correction in thick material to the track
void MeasureVelocityWithQp()
measure the track velocity with the track Qp and the mass
void FilterVi(DataT vi)
filter the inverse speed
DataTmask fMask
mask of active elements in simd vectors
void ExtrapolateLineInField(DataT z_out, const kf::FieldRegion< DataT > &F)
extrapolate the track to the given Z using linearization at the straight line
void GetMeasurementModelAtZline(DataT zm, const kf::FieldRegion< DataT > &Field, std::array< DataT, 5 > &Jx, std::array< DataT, 5 > &Jy) const
extrapolate track as a line, return the extrapolated X, Y and the Jacobians
void CleanNonActiveCovariances()
constexpr auto SpeedOfLightInv
Inverse speed of light [ns/cm].
constexpr auto SpeedOfLight
Speed of light [cm/ns].
T max(const T &a, const T &b)
fvec iif(const fmask &m, const fvec &t, const fvec &f)
@ N
Do not fit the time component.