14 template<
typename DataT>
18 DataT F0, F1, F2, F3, F4, F5, F6;
19 DataT K1, K2, K3, K4, K5, K6;
21 zeta = m.CosPhi() * fTr.X() + m.SinPhi() * fTr.Y() - m.U();
24 F0 = m.CosPhi() * fTr.C00() + m.SinPhi() * fTr.C10();
25 F1 = m.CosPhi() * fTr.C10() + m.SinPhi() * fTr.C11();
27 HCH = (F0 * m.CosPhi() + F1 * m.SinPhi());
29 F2 = m.CosPhi() * fTr.C20() + m.SinPhi() * fTr.C21();
30 F3 = m.CosPhi() * fTr.C30() + m.SinPhi() * fTr.C31();
31 F4 = m.CosPhi() * fTr.C40() + m.SinPhi() * fTr.C41();
32 F5 = m.CosPhi() * fTr.C50() + m.SinPhi() * fTr.C51();
33 F6 = m.CosPhi() * fTr.C60() + m.SinPhi() * fTr.C61();
35 constexpr bool doProtect = !std::is_same<DataTscal, double>::value;
42 DataT w = m.Du2() + (doProtect ? (DataT(1.0000001) * HCH) : HCH);
45 DataT zetawi = zeta / (
kf::utils::iif(maskDoFilter, m.Du2(), DataT(0.)) + HCH);
50 fTr.ChiSq() += zeta * zeta * wi;
60 fTr.X() -= F0 * zetawi;
61 fTr.Y() -= F1 * zetawi;
62 fTr.Tx() -= F2 * zetawi;
63 fTr.Ty() -= F3 * zetawi;
64 fTr.Qp() -= F4 * zetawi;
65 fTr.Time() -= F5 * zetawi;
66 fTr.Vi() -= F6 * zetawi;
68 fTr.C00() -= F0 * F0 * wi;
100 fTr.C65() -= K6 * F5;
101 fTr.C66() -= K6 * F6;
104 template<
typename DataT>
110 DataT F0 = fTr.C50();
111 DataT F1 = fTr.C51();
112 DataT F2 = fTr.C52();
113 DataT F3 = fTr.C53();
114 DataT F4 = fTr.C54();
115 DataT F5 = fTr.C55();
116 DataT F6 = fTr.C65();
118 DataT HCH = fTr.C55();
127 const DataTmask maskDoFilter = mask && (HCH < dt2 * 16.f);
129 DataT wi =
kf::utils::iif(mask, DataT(1.) / (dt2 + DataT(1.0000001) * HCH), DataT(0.));
133 fTr.ChiSqTime() +=
kf::utils::iif(maskDoFilter, zeta * zeta * wi, DataT(0.));
143 fTr.X() -= F0 * zetawi;
144 fTr.Y() -= F1 * zetawi;
145 fTr.Tx() -= F2 * zetawi;
146 fTr.Ty() -= F3 * zetawi;
147 fTr.Qp() -= F4 * zetawi;
148 fTr.Time() -= F5 * zetawi;
149 fTr.Vi() -= F6 * zetawi;
151 fTr.C00() -= F0 * F0 * wi;
153 fTr.C10() -= K1 * F0;
154 fTr.C11() -= K1 * F1;
156 fTr.C20() -= K2 * F0;
157 fTr.C21() -= K2 * F1;
158 fTr.C22() -= K2 * F2;
160 fTr.C30() -= K3 * F0;
161 fTr.C31() -= K3 * F1;
162 fTr.C32() -= K3 * F2;
163 fTr.C33() -= K3 * F3;
165 fTr.C40() -= K4 * F0;
166 fTr.C41() -= K4 * F1;
167 fTr.C42() -= K4 * F2;
168 fTr.C43() -= K4 * F3;
169 fTr.C44() -= K4 * F4;
171 fTr.C50() -= K5 * F0;
172 fTr.C51() -= K5 * F1;
173 fTr.C52() -= K5 * F2;
174 fTr.C53() -= K5 * F3;
175 fTr.C54() -= K5 * F4;
176 fTr.C55() -= K5 * F5;
178 fTr.C60() -= K6 * F0;
179 fTr.C61() -= K6 * F1;
180 fTr.C62() -= K6 * F2;
181 fTr.C63() -= K6 * F3;
182 fTr.C64() -= K6 * F4;
183 fTr.C65() -= K6 * F5;
184 fTr.C66() -= K6 * F6;
188 template<
typename DataT>
206 auto maskOld = fMask;
207 if (skipUnmeasuredCoordinates) {
208 fMask = maskOld & (mxy.
NdfX() > DataT(0.));
211 if (skipUnmeasuredCoordinates) {
212 fMask = maskOld & (mxy.
NdfY() > DataT(0.));
225 DataT zeta0, zeta1, S00, S10, S11, si;
226 DataT F00, F10, F20, F30, F40, F50, F60;
227 DataT F01, F11, F21, F31, F41, F51, F61;
228 DataT K00, K10, K20, K30, K40, K50, K60;
229 DataT K01, K11, K21, K31, K41, K51, K61;
231 zeta0 = fTr.X() - mxy.
X();
232 zeta1 = fTr.Y() - mxy.
Y();
251 S00 = F00 + mxy.
Dx2();
252 S10 = F10 + mxy.
Dxy();
253 S11 = F11 + mxy.
Dy2();
255 si = 1.f / (S00 * S11 - S10 * S10);
261 fTr.ChiSq() += zeta0 * zeta0 * S00 + 2.f * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
264 K00 = F00 * S00 + F01 * S10;
265 K01 = F00 * S10 + F01 * S11;
267 K10 = F10 * S00 + F11 * S10;
268 K11 = F10 * S10 + F11 * S11;
270 K20 = F20 * S00 + F21 * S10;
271 K21 = F20 * S10 + F21 * S11;
273 K30 = F30 * S00 + F31 * S10;
274 K31 = F30 * S10 + F31 * S11;
276 K40 = F40 * S00 + F41 * S10;
277 K41 = F40 * S10 + F41 * S11;
279 K50 = F50 * S00 + F51 * S10;
280 K51 = F50 * S10 + F51 * S11;
282 K60 = F60 * S00 + F61 * S10;
283 K61 = F60 * S10 + F61 * S11;
285 fTr.X() -= K00 * zeta0 + K01 * zeta1;
286 fTr.Y() -= K10 * zeta0 + K11 * zeta1;
287 fTr.Tx() -= K20 * zeta0 + K21 * zeta1;
288 fTr.Ty() -= K30 * zeta0 + K31 * zeta1;
289 fTr.Qp() -= K40 * zeta0 + K41 * zeta1;
290 fTr.Time() -= K50 * zeta0 + K51 * zeta1;
291 fTr.Vi() -= K60 * zeta0 + K61 * zeta1;
293 fTr.C00() -= K00 * F00 + K01 * F01;
295 fTr.C10() -= K10 * F00 + K11 * F01;
296 fTr.C11() -= K10 * F10 + K11 * F11;
298 fTr.C20() -= K20 * F00 + K21 * F01;
299 fTr.C21() -= K20 * F10 + K21 * F11;
300 fTr.C22() -= K20 * F20 + K21 * F21;
302 fTr.C30() -= K30 * F00 + K31 * F01;
303 fTr.C31() -= K30 * F10 + K31 * F11;
304 fTr.C32() -= K30 * F20 + K31 * F21;
305 fTr.C33() -= K30 * F30 + K31 * F31;
307 fTr.C40() -= K40 * F00 + K41 * F01;
308 fTr.C41() -= K40 * F10 + K41 * F11;
309 fTr.C42() -= K40 * F20 + K41 * F21;
310 fTr.C43() -= K40 * F30 + K41 * F31;
311 fTr.C44() -= K40 * F40 + K41 * F41;
313 fTr.C50() -= K50 * F00 + K51 * F01;
314 fTr.C51() -= K50 * F10 + K51 * F11;
315 fTr.C52() -= K50 * F20 + K51 * F21;
316 fTr.C53() -= K50 * F30 + K51 * F31;
317 fTr.C54() -= K50 * F40 + K51 * F41;
318 fTr.C55() -= K50 * F50 + K51 * F51;
320 fTr.C60() -= K60 * F00 + K61 * F01;
321 fTr.C61() -= K60 * F10 + K61 * F11;
322 fTr.C62() -= K60 * F20 + K61 * F21;
323 fTr.C63() -= K60 * F30 + K61 * F31;
324 fTr.C64() -= K60 * F40 + K61 * F41;
325 fTr.C65() -= K60 * F50 + K61 * F51;
326 fTr.C66() -= K60 * F60 + K61 * F61;
329 template<
typename DataT>
345 DataT zeta0 = extrX - m.X();
346 DataT zeta1 = extrY - m.Y();
356 DataT F20 = Jx[2] * T.C22();
357 DataT F21 = Jy[2] * T.C22();
358 DataT F30 = Jx[3] * T.C33();
359 DataT F31 = Jy[3] * T.C33();
360 DataT F40 = Jx[4] * T.C44();
361 DataT F41 = Jy[4] * T.C44();
365 DataT S00 = m.Dx2() + F00 + Jx[2] * F20 + Jx[3] * F30 + Jx[4] * F40;
366 DataT S10 = m.Dxy() + F10 + Jy[2] * F20 + Jy[3] * F30 + Jy[4] * F40;
367 DataT S11 = m.Dy2() + F11 + Jy[2] * F21 + Jy[3] * F31 + Jy[4] * F41;
369 DataT si = DataT(1.) / (S00 * S11 - S10 * S10);
376 T.ChiSq() += zeta0 * zeta0 * S00 + DataT(2.) * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
377 T.Ndf() += m.NdfX() + m.NdfY();
379 DataT K00 = F00 * S00 + F01 * S10;
380 DataT K01 = F00 * S10 + F01 * S11;
381 DataT K10 = F10 * S00 + F11 * S10;
382 DataT K11 = F10 * S10 + F11 * S11;
383 DataT K20 = F20 * S00 + F21 * S10;
384 DataT K21 = F20 * S10 + F21 * S11;
385 DataT K30 = F30 * S00 + F31 * S10;
386 DataT K31 = F30 * S10 + F31 * S11;
387 DataT K40 = F40 * S00 + F41 * S10;
388 DataT K41 = F40 * S10 + F41 * S11;
390 T.X() -= K00 * zeta0 + K01 * zeta1;
391 T.Y() -= K10 * zeta0 + K11 * zeta1;
392 T.Tx() -= K20 * zeta0 + K21 * zeta1;
393 T.Ty() -= K30 * zeta0 + K31 * zeta1;
394 T.Qp() -= K40 * zeta0 + K41 * zeta1;
396 T.C00() -= (K00 * F00 + K01 * F01);
397 T.C10() -= (K10 * F00 + K11 * F01);
398 T.C11() -= (K10 * F10 + K11 * F11);
399 T.C20() = -(K20 * F00 + K21 * F01);
400 T.C21() = -(K20 * F10 + K21 * F11);
401 T.C22() -= (K20 * F20 + K21 * F21);
402 T.C30() = -(K30 * F00 + K31 * F01);
403 T.C31() = -(K30 * F10 + K31 * F11);
404 T.C32() = -(K30 * F20 + K31 * F21);
405 T.C33() -= (K30 * F30 + K31 * F31);
406 T.C40() = -(K40 * F00 + K41 * F01);
407 T.C41() = -(K40 * F10 + K41 * F11);
408 T.C42() = -(K40 * F20 + K41 * F21);
409 T.C43() = -(K40 * F30 + K41 * F31);
410 T.C44() -= (K40 * F40 + K41 * F41);
414 template<
typename DataT>
423 DataT F0, F1, F2, F3, F4, F5, F6;
424 DataT K1, K2, K3, K4, K5, K6;
429 DataT vi0 =
sqrt(DataT(1.) + fMass2 * fQp0 * fQp0) * kClightNsInv;
431 DataT
h = fMass2 * fQp0 /
sqrt(DataT(1.) + fMass2 * fQp0 * fQp0) * kClightNsInv;
433 zeta = vi0 +
h * (fTr.Qp() - fQp0) - fTr.Vi();
441 F0 =
h * fTr.C40() - fTr.C60();
442 F1 =
h * fTr.C41() - fTr.C61();
443 F2 =
h * fTr.C42() - fTr.C62();
444 F3 =
h * fTr.C43() - fTr.C63();
445 F4 =
h * fTr.C44() - fTr.C64();
446 F5 =
h * fTr.C54() - fTr.C65();
447 F6 =
h * fTr.C64() - fTr.C66();
453 fTr.ChiSqTime() +=
kf::utils::iif(fMask, zeta * zeta * wi, DataT(0.));
463 fTr.X() -= F0 * zetawi;
464 fTr.Y() -= F1 * zetawi;
465 fTr.Tx() -= F2 * zetawi;
466 fTr.Ty() -= F3 * zetawi;
467 fTr.Qp() -= F4 * zetawi;
468 fTr.Time() -= F5 * zetawi;
469 fTr.Vi() -= F6 * zetawi;
471 fTr.C00() -= F0 * F0 * wi;
473 fTr.C10() -= K1 * F0;
474 fTr.C11() -= K1 * F1;
476 fTr.C20() -= K2 * F0;
477 fTr.C21() -= K2 * F1;
478 fTr.C22() -= K2 * F2;
480 fTr.C30() -= K3 * F0;
481 fTr.C31() -= K3 * F1;
482 fTr.C32() -= K3 * F2;
483 fTr.C33() -= K3 * F3;
485 fTr.C40() -= K4 * F0;
486 fTr.C41() -= K4 * F1;
487 fTr.C42() -= K4 * F2;
488 fTr.C43() -= K4 * F3;
489 fTr.C44() -= K4 * F4;
491 fTr.C50() -= K5 * F0;
492 fTr.C51() -= K5 * F1;
493 fTr.C52() -= K5 * F2;
494 fTr.C53() -= K5 * F3;
495 fTr.C54() -= K5 * F4;
496 fTr.C55() -= K5 * F5;
498 fTr.C60() -= K6 * F0;
499 fTr.C61() -= K6 * F1;
500 fTr.C62() -= K6 * F2;
501 fTr.C63() -= K6 * F3;
502 fTr.C64() -= K6 * F4;
503 fTr.C65() -= K6 * F5;
504 fTr.C66() -= K6 * F6;
509 template<
typename DataT>
515 DataT F0, F1, F2, F3, F4, F5, F6;
516 DataT K1, K2, K3, K4, K5;
518 zeta = fTr.Vi() - vi;
536 fTr.ChiSqTime() +=
kf::utils::iif(fMask, zeta * zeta * wi, DataT(0.));
546 fTr.X() -= F0 * zetawi;
547 fTr.Y() -= F1 * zetawi;
548 fTr.Tx() -= F2 * zetawi;
549 fTr.Ty() -= F3 * zetawi;
550 fTr.Qp() -= F4 * zetawi;
551 fTr.Time() -= F5 * zetawi;
555 fTr.C00() -= F0 * F0 * wi;
557 fTr.C10() -= K1 * F0;
558 fTr.C11() -= K1 * F1;
560 fTr.C20() -= K2 * F0;
561 fTr.C21() -= K2 * F1;
562 fTr.C22() -= K2 * F2;
564 fTr.C30() -= K3 * F0;
565 fTr.C31() -= K3 * F1;
566 fTr.C32() -= K3 * F2;
567 fTr.C33() -= K3 * F3;
569 fTr.C40() -= K4 * F0;
570 fTr.C41() -= K4 * F1;
571 fTr.C42() -= K4 * F2;
572 fTr.C43() -= K4 * F3;
573 fTr.C44() -= K4 * F4;
575 fTr.C50() -= K5 * F0;
576 fTr.C51() -= K5 * F1;
577 fTr.C52() -= K5 * F2;
578 fTr.C53() -= K5 * F3;
579 fTr.C54() -= K5 * F4;
580 fTr.C55() -= K5 * F5;
589 fTr.C60() = DataT(0.);
590 fTr.C61() = DataT(0.);
591 fTr.C62() = DataT(0.);
592 fTr.C63() = DataT(0.);
593 fTr.C64() = DataT(0.);
594 fTr.C65() = DataT(0.);
595 fTr.C66() = DataT(1.e-8);
598 template<
typename DataT>
607 ExtrapolateLineNoField(z_out);
613 DataT zNew = fTr.GetZ() +
sgn * fMaxExtraplationStep;
615 ExtrapolateStep(zNew, F);
620 template<
typename DataT>
622 DataT>::ExtrapolateStep
670 cnst h = (zMasked - fTr.GetZ());
672 cnst stepDz[5] = {0., 0.,
h * DataT(0.5),
h * DataT(0.5),
h};
674 DataT f[5][7] = {{DataT(0.)}};
675 DataT F[5][7][7] = {{{DataT(0.)}}};
680 DataT r0[7] = {fTr.X(), fTr.Y(), fTr.Tx(), fTr.Ty(), fQp0, fTr.Time(), fTr.Vi()};
681 DataT R0[7][7] = {{DataT(0.)}};
682 for (
int i = 0; i < 7; ++i) {
686 for (
int step = 1; step <= 4; ++step) {
688 DataT rstep[7] = {DataT(0.)};
689 for (
int i = 0; i < 7; ++i) {
690 rstep[i] = r0[i] + stepDz[step] * f[step - 1][i];
692 DataT z = fTr.GetZ() + stepDz[step];
695 DataT Bx = B.
GetBx();
696 DataT By = B.
GetBy();
697 DataT Bz = B.
GetBz();
704 DataT txty = tx * ty;
705 DataT L2 = DataT(1.) + tx2 + ty2;
706 DataT L2i = DataT(1.) / L2;
708 DataT cL = c_light * L;
709 DataT cLqp0 = cL * fQp0;
717 DataT f2tmp = txty * Bx - (DataT(1.) + tx2) * By + ty * Bz;
718 f[step][2] = cLqp0 * f2tmp;
720 F[step][2][2] = cLqp0 * (tx * f2tmp * L2i + ty * Bx - DataT(2.) * tx * By);
721 F[step][2][3] = cLqp0 * (ty * f2tmp * L2i + tx * Bx + Bz);
722 F[step][2][4] = cL * f2tmp;
724 DataT f3tmp = -txty * By - tx * Bz + (DataT(1.) + ty2) * Bx;
725 f[step][3] = cLqp0 * f3tmp;
726 F[step][3][2] = cLqp0 * (tx * f3tmp * L2i - ty * By - Bz);
727 F[step][3][3] = cLqp0 * (ty * f3tmp * L2i + DataT(2.) * ty * Bx - tx * By);
728 F[step][3][4] = cL * f3tmp;
732 if (fDoFitVelocity) {
735 F[step][5][2] = vi * tx / L;
736 F[step][5][3] = vi * ty / L;
744 F[step][5][2] = vi * tx / L;
745 F[step][5][3] = vi * ty / L;
755 DataT r[7] = {DataT(0.)};
756 DataT R[7][7] = {{DataT(0.)}};
758 cnst stepW[5] = {0.,
h / DataT(6.),
h / DataT(3.),
h / DataT(3.),
h / DataT(6.)};
760 DataT k[5][7][7] = {{{DataT(0.)}}};
761 for (
int step = 1; step <= 4; ++step) {
762 for (
int i = 0; i < 7; i++) {
763 for (
int j = 0; j < 7; j++) {
764 k[step][i][j] = F[step][i][j];
765 for (
int m = 0; m < 7; m++) {
766 k[step][i][j] += stepDz[step] * F[step][i][m] * k[step - 1][m][j];
772 for (
int i = 0; i < 7; i++) {
773 for (
int j = 0; j < 7; j++) {
775 for (
int step = 1; step <= 4; step++) {
776 R[i][j] += stepW[step] * k[step][i][j];
781 DataT dqp = fTr.Qp() - fQp0;
783 for (
int i = 0; i < 7; i++) {
785 for (
int step = 1; step <= 4; step++) {
786 r[i] += stepW[step] * f[step][i];
789 r[i] += R[i][4] * dqp;
808 for (
int i = 0; i < 7; i++) {
809 for (
int j = 0; j < 7; j++) {
810 C[i][j] = fTr.C(i, j);
815 for (
int i = 0; i < 7; i++) {
816 for (
int j = 0; j < 7; j++) {
818 for (
int m = 0; m < 7; m++) {
819 RC[i][j] += R[i][m] * C[m][j];
823 for (
int i = 0; i < 7; i++) {
824 for (
int j = 0; j < 7; j++) {
826 for (
int m = 0; m < 7; m++) {
827 Cij += RC[i][m] * R[j][m];
835 template<
typename DataT>
843 Extrapolate(z_out, F);
847 template<
typename DataT>
858 ExtrapolateStep(zOut, F);
866 cnst dz = (zMasked - t.GetZ());
868 DataT tx = t.GetTx();
869 DataT ty = t.GetTy();
870 DataT vi = t.GetVi();
872 DataT L =
sqrt(DataT(1.) + tx * tx + ty * ty);
874 DataT j52 = dz * tx * vi / L;
875 DataT j53 = dz * ty * vi / L;
882 t.Time() += L * vi * dz;
898 DataT jc00 = t.C00() + dz * t.C20();
900 DataT jc02 = t.C02() + dz * t.C22();
907 DataT jc10 = t.C10() + dz * t.C30();
908 DataT jc11 = t.C11() + dz * t.C31();
909 DataT jc12 = t.C12() + dz * t.C32();
910 DataT jc13 = t.C13() + dz * t.C33();
919 DataT jc50 = t.C50() + j52 * t.C20() + j53 * t.C30() + j56 * t.C60();
920 DataT jc51 = t.C51() + j52 * t.C21() + j53 * t.C31() + j56 * t.C61();
921 DataT jc52 = t.C52() + j52 * t.C22() + j53 * t.C32() + j56 * t.C62();
922 DataT jc53 = t.C53() + j52 * t.C23() + j53 * t.C33() + j56 * t.C63();
923 DataT jc54 = t.C54() + j52 * t.C24() + j53 * t.C34() + j56 * t.C64();
924 DataT jc55 = t.C55() + j52 * t.C25() + j53 * t.C35() + j56 * t.C65();
925 DataT jc56 = t.C56() + j52 * t.C26() + j53 * t.C36() + j56 * t.C66();
942 t.C00() = jc00 + jc02 * dz;
943 t.C10() = jc10 + jc12 * dz;
944 t.C20() = t.C20() + t.C22() * dz;
945 t.C30() = t.C30() + t.C32() * dz;
946 t.C40() = t.C40() + t.C42() * dz;
947 t.C50() = jc50 + jc52 * dz;
948 t.C60() = t.C60() + t.C62() * dz;
950 t.C11() = jc11 + jc13 * dz;
951 t.C21() = t.C21() + t.C23() * dz;
952 t.C31() = t.C31() + t.C33() * dz;
953 t.C41() = t.C41() + t.C43() * dz;
954 t.C51() = jc51 + jc53 * dz;
955 t.C61() = t.C61() + t.C63() * dz;
972 t.C55() = jc55 + jc52 * j52 + jc53 * j53 + jc56 * j56;
973 t.C65() = t.C65() + t.C62() * j52 + t.C63() * j53 + t.C66() * j56;
979 template<
typename DataT>
988 DataT txtx = tx * tx;
989 DataT tyty = ty * ty;
990 DataT txtx1 = DataT(1.) + txtx;
991 DataT tyty1 = DataT(1.) + tyty;
992 DataT t =
sqrt(txtx1 + tyty);
995 DataT lg = DataT(.0136) * (DataT(1.) + DataT(0.038) *
log(radThick * t));
998 DataT s0 = lg * qp * t;
999 DataT a = (DataT(1.) + fMass2 * qp * qp) * s0 * s0 * t * radThick;
1015 template<
typename DataT>
1020 DataT tx = fTr.Tx();
1021 DataT ty = fTr.Ty();
1022 DataT txtx = tx * tx;
1023 DataT tyty = ty * ty;
1024 DataT txtx1 = txtx + kONE;
1025 DataT
h = txtx + tyty;
1026 DataT t =
sqrt(txtx1 + tyty);
1028 DataT qp0t = fQp0 * t;
1030 cnst c1(0.0136), c2 = c1 * DataT(0.038), c3 = c2 * DataT(0.5), c4 = -c3 / DataT(2.0), c5 = c3 / DataT(3.0),
1031 c6 = -c3 / DataT(4.0);
1033 DataT s0 = (c1 + c2 *
log(radThick) + c3 *
h + h2 * (c4 + c5 *
h + c6 * h2)) * qp0t;
1035 DataT a = ((t + fMass2 * fQp0 * qp0t) * radThick * s0 * s0);
1037 DataT D = (fDownstream) ? DataT(1.) : DataT(-1.);
1038 DataT T23 = (thickness * thickness) / DataT(3.0);
1039 DataT T2 = thickness / DataT(2.0);
1042 fTr.C10() +=
kf::utils::iif(fMask, tx * ty * a * T23, DataT(0.));
1043 fTr.C20() +=
kf::utils::iif(fMask, txtx1 * a * D * T2, DataT(0.));
1044 fTr.C30() +=
kf::utils::iif(fMask, tx * ty * a * D * T2, DataT(0.));
1046 fTr.C11() +=
kf::utils::iif(fMask, (kONE + tyty) * a * T23, DataT(0.));
1047 fTr.C21() +=
kf::utils::iif(fMask, tx * ty * a * D * T2, DataT(0.));
1048 fTr.C31() +=
kf::utils::iif(fMask, (kONE + tyty) * a * D * T2, DataT(0.));
1052 fTr.C33() +=
kf::utils::iif(fMask, (kONE + tyty) * a, DataT(0.));
1056 template<
typename DataT>
1059 cnst qp2cut(1. / (10. * 10.));
1061 cnst p2 = DataT(1.) / qp02;
1062 cnst E2 = fMass2 + p2;
1064 cnst bethe = ApproximateBetheBloch(p2 / fMass2);
1066 DataT tr =
sqrt(DataT(1.f) + fTr.Tx() * fTr.Tx() + fTr.Ty() * fTr.Ty());
1068 DataT dE = bethe * radThick * tr * 2.33f * 9.34961f;
1073 cnst E2Corrected = ECorrected * ECorrected;
1075 DataT corr =
sqrt(p2 / (E2Corrected - fMass2));
1085 fTr.C44() *= corr * corr;
1090 template<
typename DataT>
1094 cnst qp2cut(1. / (10. * 10.));
1096 cnst p2 = DataT(1.) / qp02;
1097 cnst E2 = fMass2 + p2;
1101 i = (12. * atomicZ + 7.) * 1.e-9;
1104 i = (9.76 * atomicZ + 58.8 * std::pow(atomicZ, -0.19)) * 1.e-9;
1107 cnst bethe = ApproximateBetheBloch(p2 / fMass2, rho, 0.20, 3.00, i, atomicZ / atomicA);
1109 DataT tr =
sqrt(DataT(1.f) + fTr.Tx() * fTr.Tx() + fTr.Ty() * fTr.Ty());
1111 DataT dE = bethe * radThick * tr * radLen * rho;
1116 cnst E2Corrected = ECorrected * ECorrected;
1118 DataT corr =
sqrt(p2 / (E2Corrected - fMass2));
1131 DataT STEP = radThick * tr * radLen;
1132 DataT EMASS(0.511 * 1e-3);
1134 DataT BETA = P / ECorrected;
1135 DataT GAMMA = ECorrected / fMass;
1138 DataT XI = (DataT(153.5) * Z * STEP * RHO) / (A * BETA * BETA);
1141 DataT ETA = BETA * GAMMA;
1142 DataT ETASQ = ETA * ETA;
1143 DataT RATIO = EMASS / fMass;
1144 DataT F1 = DataT(2.) * EMASS * ETASQ;
1145 DataT F2 = DataT(1.) + DataT(2.) * RATIO * GAMMA + RATIO * RATIO;
1146 DataT EMAX = DataT(1e6) * F1 / F2;
1148 DataT DEDX2 = XI * EMAX * (DataT(1.) - (BETA * BETA / DataT(2.))) * DataT(1e-12);
1151 DataT SDEDX = (E2 * DEDX2) / (P2 * P2 * P2);
1162 template<
typename DataT>
1171 cnst c_light(0.000299792458);
1173 cnst tx = fTr.GetTx();
1174 cnst ty = fTr.GetTy();
1175 DataT dz = z - fTr.GetZ();
1181 DataT Ay = -xx - DataT(1.);
1182 DataT Bx = yy + DataT(1.);
1184 DataT ct = c_light *
sqrt(DataT(1.) + xx + yy);
1189 fTr.GetX() + dz * tx, fTr.GetY() + dz * ty, z);
1192 extrX = fTr.GetX() + tx * dz;
1193 extrY = fTr.GetY() + ty * dz;
1202 Jx[4] = ct * (Sx * xy + Sy * Ay + Sz * ty);
1210 Jy[4] = ct * (Sx * Bx - Sy * xy - Sz * tx);
1216 template<
typename DataT>
1223 std::array<DataT, kf::TrackParamV::kNtrackParam> Jx, Jy;
1224 GetExtrapolatedXYline(targZ, F, eX, eY, Jx, Jy);
1225 FilterExtrapolatedXY(targXY, eX, eY, Jx, Jy);
1228 template<
typename DataT>
1249 cnst kp4 = 0.49848f;
1254 cnst x0 = kp1 * 2.303f;
1255 cnst x1 = kp2 * 2.303f;
1258 cnst maxT = _2me * bg2;
1263 cnst lhwI =
log(28.816f * 1e-9f *
sqrt(rho * mZA) / mI);
1267 cnst r = (x1 -
x) / (x1 - x0);
1268 init = (
x > x0) & (x1 >
x);
1269 d2 =
kf::utils::iif(init, lhwI +
x - 0.5f + (0.5f - lhwI - x0) * r * r * r, d2);
1271 return mK * mZA * (DataT(1.f) + bg2) / bg2
1272 * (0.5f *
log(_2me * bg2 * maxT / (mI * mI)) - bg2 / (DataT(1.f) + bg2) - d2);
1275 template<
typename DataT>
1302 cnst x0 = kp1 * 2.303f;
1303 cnst x1 = kp2 * 2.303f;
1306 cnst maxT = _2me * bg2;
1311 cnst lhwI =
log(28.816f * 1e-9f *
sqrt(rho * mZA) / mI);
1315 cnst r = (x1 -
x) / (x1 - x0);
1316 init = (
x > x0) & (x1 >
x);
1317 d2 =
kf::utils::iif(init, lhwI +
x - 0.5f + (0.5f - lhwI - x0) * r * r * r, d2);
1319 return mK * mZA * (DataT(1.f) + bg2) / bg2
1320 * (0.5f *
log(_2me * bg2 * maxT / (mI * mI)) - bg2 / (DataT(1.f) + bg2) - d2);
1324 template<
typename DataT>
1326 DataT C00, DataT C10, DataT C11)
1332 DataT zeta =
x - m.X();
1340 DataT wi = DataT(1.) / (m.Dx2() + HCH);
1341 DataT zetawi = zeta * wi;
1342 chi2x = m.NdfX() * zeta * zetawi;
1349 C00 -= F0 * F0 * wi;
1357 DataT cosPhi = -m.Dxy() / m.Dx2();
1358 DataT u = cosPhi * m.X() + m.Y();
1359 DataT du2 = m.Dy2() + cosPhi * m.Dxy();
1361 DataT zeta = cosPhi *
x +
y - u;
1364 DataT F0 = cosPhi * C00 + C10;
1365 DataT F1 = cosPhi * C10 + C11;
1367 DataT HCH = (F0 * cosPhi + F1);
1369 chi2u += m.NdfY() * zeta * zeta / (du2 + HCH);
1372 return std::tuple<DataT, DataT>(chi2x, chi2u);
1376 template<
typename DataT>
1378 const DataT hitZ[],
const DataT hitT[],
const DataT By[],
1383 const DataT c_light(0.000299792458), c_light_i(DataT(1.) / c_light);
1385 DataT A0 = 0., A1 = 0., A2 = 0., A3 = 0., A4 = 0., A5 = 0.;
1386 DataT a0 = 0., a1 = 0., a2 = 0.;
1387 DataT b0 = 0., b1 = 0., b2 = 0.;
1393 DataT sy = 0., Sy = 0.;
1395 for (
int i = 0; i < NHits; i++) {
1399 DataTmask setTime = (!isTimeSet) && hitWtime[i] && hitW[i];
1401 isTimeSet = isTimeSet || setTime;
1405 DataT z = hitZ[i] - trackZ;
1408 DataT dZ = z - prevZ;
1409 Sy += w * dZ * sy + DataT(0.5) * dZ * dZ * By[i];
1410 sy += w * dZ * By[i];
1451 m11 = m00 * m11 - m01 * m01;
1452 m12 = m00 * m12 - m01 * m02;
1453 a1 = m00 * a1 - m01 * a0;
1455 m21 = m00 * m21 - m02 * m01;
1456 m22 = m00 * m22 - m02 * m02;
1457 a2 = m00 * a2 - m02 * a0;
1461 m22 = m11 * m22 - m21 * m12;
1462 a2 = m11 * a2 - m21 * a1;
1473 fTr.Tx() = a1 / m11;
1474 a0 -= fTr.Tx() * m01;
1481 DataT txtx1 = DataT(1.) + fTr.Tx() * fTr.Tx();
1483 DataT L1 = L * fTr.Tx();
1486 A2 = A2 + (A4 + A4 + A5 * L1) * L1;
1492 A2 = A0 * A2 - A1 * A1;
1493 b1 = A0 * b1 - A1 * b0;
1496 fTr.Y() = (b0 - A1 * fTr.Ty()) / A0;
1498 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.
Data class with information on a STS local track.
Magnetic field region, corresponding to a hit triplet.
std::tuple< T, T, T > GetDoubleIntegrals(const T &x1, const T &y1, const T &z1, const T &x2, const T &y2, const T &z2) const
Gets the double integrals of the field along the track.
Magnetic flux density vector.
T GetBz() const
Gets magnetic flux density z-component [kG].
T GetBx() const
Gets magnetic flux x-component [kG].
T GetBy() const
Gets magnetic flux density y-component [kG].
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.
void Filter1d(const kf::MeasurementU< DataT > &m)
filter the track with the 1d measurement
void FilterWithTargetAtLine(DataT targZ, const kf::MeasurementXy< DataT > &targXYInfo, const kf::FieldRegion< DataT > &F)
add target measuremet to the track using linearisation at a straight line
void MeasureVelocityWithQp()
measure the track velocity with the track Qp and the mass
void FilterExtrapolatedXY(const kf::MeasurementXy< DataT > &m, DataT extrX, DataT extrY, const std::array< DataT, kf::TrackParam< DataT >::kNtrackParam > &Jx, const std::array< DataT, kf::TrackParam< DataT >::kNtrackParam > &Jy)
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 FilterXY(const kf::MeasurementXy< DataT > &m, bool skipUnmeasuredCoordinates=false)
filter the track with the XY measurement
void ExtrapolateLineNoField(DataT z_out)
extrapolate the track to the given Z assuming no magnetic field
void MultipleScatteringInThickMaterial(DataT radThick, DataT thickness, bool fDownstream)
apply multiple scattering correction in thick material to the track
void FilterVi(DataT vi)
filter the inverse speed
static DataT ApproximateBetheBloch(DataT bg2)
Approximate mean energy loss with Bethe-Bloch formula.
void MultipleScattering(DataT radThick, DataT tx0, DataT ty0, DataT qp0)
apply multiple scattering correction to the track with the given Qp0
void GetExtrapolatedXYline(DataT z, const kf::FieldRegion< DataT > &F, DataT &extrX, DataT &extrY, std::array< DataT, kf::TrackParam< DataT >::kNtrackParam > &Jx, std::array< DataT, kf::TrackParam< DataT >::kNtrackParam > &Jy) const
extrapolate track as a line, return the extrapolated X, Y and the Jacobians
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
kf::utils::scaltype< DataT > DataTscal
void EnergyLossCorrection(DataT radThick, FitDirection direction)
void FilterTime(DataT t, DataT dt2, const DataTmask &m)
filter the track with the time measurement
kf::utils::masktype< DataT > DataTmask
void ExtrapolateLine(DataT z_out, const kf::FieldRegion< DataT > &F)
extrapolate the track to the given Z using linearization at the straight line
TrackParam classes of different types.
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)