22 #ifndef PNDFTSCATRACKPARAMVECTOR_H 23 #define PNDFTSCATRACKPARAMVECTOR_H 36 #include "FairField.h" 37 #include "FairRunAna.h" 59 : fX(0.
f), fY(0.
f), fTx(0.
f), fTy(0.
f), fQP(0.
f), fZ(0.
f), fC00(0.
f), fC10(0.
f), fC11(0.
f), fC20(0.
f), fC21(0.
f), fC22(0.
f), fC30(0.
f), fC31(0.
f), fC32(0.
f), fC33(0.
f),
60 fC40(0.
f), fC41(0.
f), fC42(0.
f), fC43(0.
f), fC44(0.
f), fChi2(0.
f), fNDF(0.
f)
62 fZB[0] = fZB[1] = 10e10;
68 for (
int i = 0;
i < 5;
i++)
70 for (
int i = 0;
i < 15;
i++)
73 fChi2(
m) = param.
Chi2();
75 fNDF(static_cast<int_m>(
m)) = param.
NDF();
76 fAlpha(static_cast<int_m>(
m)) = param.
Angle();
81 for (
int i = 0;
i < 5;
i++)
83 for (
int i = 0;
i < 15;
i++)
85 fX[iV] = param.
X()[iVa];
86 fZ[iV] = param.
Z()[iVa];
87 fChi2[iV] = param.
Chi2()[iVa];
88 fNDF[iV] = param.
NDF()[iVa];
89 fAlpha[iV] = param.
Angle()[iVa];
96 cout <<
"CovMat " << endl;
98 cout <<
Cov(0) << endl;
99 cout <<
Cov(1) <<
" " <<
Cov(2) << endl;
100 cout <<
Cov(3) <<
" " <<
Cov(4) <<
" " <<
Cov(5) << endl;
101 cout <<
Cov(6) <<
" " <<
Cov(7) <<
" " <<
Cov(8) <<
" " <<
Cov(9) << endl;
102 cout <<
Cov(10) <<
" " <<
Cov(11) <<
" " <<
Cov(12) <<
" " <<
Cov(13) <<
" " <<
Cov(14) << endl;
116 float_m mask = (r0 > 0.f);
117 float_v tx(Vc::Zero);
119 float_v ty(Vc::Zero);
125 float_v
X()
const {
return fX; }
126 float_v
Y()
const {
return fY; }
127 float_v
Z()
const {
return fZ; }
128 float_v Tx()
const {
return fTx; }
129 float_v Ty()
const {
return fTy; }
130 float_v QP()
const {
return fQP; }
132 float_v Bx()
const {
return fBx; }
133 float_v By()
const {
return fBy; }
135 float_v
Chi2()
const {
return fChi2; }
136 int_v
NDF()
const {
return fNDF; }
138 float_v
Angle()
const {
return fAlpha; }
140 float_v
X0()
const {
return Z(); }
141 float_v
X1()
const {
return X(); }
142 float_v
X2()
const {
return Y(); }
143 float_v
Tx1()
const {
return Tx(); }
144 float_v
Tx2()
const {
return Ty(); }
145 float_v
QMomentum()
const {
return QP(); }
148 const float_v tx12 =
Tx1() *
Tx1();
149 return sqrt(tx12 / (1.
f + tx12));
152 const float_v &
Par(
int i)
const 166 const float_v &
Cov(
int i)
const 179 case 10:
return fC40;
180 case 11:
return fC41;
181 case 12:
return fC42;
182 case 13:
return fC43;
183 case 14:
return fC44;
189 float_v
Err2X1()
const {
return Err2X(); }
192 float_v Err2X()
const {
return fC00; }
193 float_v
Err2Y()
const {
return fC11; }
194 float_v Err2QP()
const {
return fC44; }
197 void SetX(
const float_v &
v) { fX =
v; }
198 void SetY(
const float_v &
v) { fY =
v; }
199 void SetZ(
const float_v &
v) { fZ =
v; }
200 void SetTx(
const float_v &
v) { fTx =
v; }
201 void SetTy(
const float_v &
v) { fTy =
v; }
202 void SetQP(
const float_v &
v) { fQP =
v; }
204 void SetBx(
const float_v &
v) { fBx =
v; }
205 void SetBy(
const float_v &
v) { fBy =
v; }
207 void SetChi2(
const float_v &
v) { fChi2 =
v; }
209 void SetNDF(
const int_v &
v) { fNDF =
v; }
211 void SetAngle(
const float_v &
v) { fAlpha =
v; }
216 case 0: fX =
v;
break;
217 case 1: fY =
v;
break;
218 case 2: fTx =
v;
break;
219 case 3: fTy =
v;
break;
220 case 4: fQP =
v;
break;
223 void SetCov(
int i, float_v v)
226 case 0: fC00 =
v;
break;
227 case 1: fC10 =
v;
break;
228 case 2: fC11 =
v;
break;
229 case 3: fC20 =
v;
break;
230 case 4: fC21 =
v;
break;
231 case 5: fC22 =
v;
break;
232 case 6: fC30 =
v;
break;
233 case 7: fC31 =
v;
break;
234 case 8: fC32 =
v;
break;
235 case 9: fC33 =
v;
break;
236 case 10: fC40 =
v;
break;
237 case 11: fC41 =
v;
break;
238 case 12: fC42 =
v;
break;
239 case 13: fC43 =
v;
break;
240 case 14: fC44 =
v;
break;
244 void SetDirection(
bool b) { fDirection = b; }
272 case 10:
return fC40;
273 case 11:
return fC41;
274 case 12:
return fC42;
275 case 13:
return fC43;
276 case 14:
return fC44;
282 void SetX(
const float_v &v,
const float_m &
m) { fX(m) =
v; }
283 void SetY(
const float_v &v,
const float_m &
m) { fY(m) =
v; }
284 void SetZ(
const float_v &v,
const float_m &
m) { fZ(m) =
v; }
285 void SetTx(
const float_v &v,
const float_m &
m) { fTx(m) =
v; }
286 void SetTy(
const float_v &v,
const float_m &
m) { fTy(m) =
v; }
287 void SetQP(
const float_v &v,
const float_m &
m) { fQP(m) =
v; }
288 void SetQMomentum(
const float_v &v,
const float_m &
m) { fQP(m) =
v; }
290 void SetChi2(
const float_v &v,
const float_m &
m) { fChi2(m) =
v; }
291 void SetNDF(
const int_v &v,
const int_m &
m) { fNDF(m) =
v; }
293 void SetField(
int i,
const CAFieldValue &b,
const float_v &zb)
302 void SetCovX12(float_v v00, float_v v10, float_v v11)
315 float_m TransportByLine(
const FTSCAHitV &hit,
const PndFTSCAParam ¶m,
const float_m &mask = float_m(
true));
320 float_m
Filter(
const FTSCAHit &hit,
const PndFTSCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
329 float_m RK4TransportToX0(
const float_v &x0_out,
const L1FieldRegion &F,
const float_v &qp0,
const float_m &mask = float_m(
true));
330 float_m TransportToX0Line(
const float_v &x0,
const float_m &mask = float_m(
true));
331 float_m PassMaterial(
const L1MaterialInfo &info,
const float_v &qp0,
const float_m &mask = float_m(
true));
332 void EnergyLossCorrection(
const float_v &mass2,
const float_v &radThick, float_v &qp0, float_v direction,
const float_m &mask);
335 float_m
Filter(
const float_v &y0,
const float_v &z0,
const float_v &r,
const FTSCAStripInfoVector &info, float_v err2,
const float_m &active,
const float_v &chi2Cut = 10e10f);
337 float_m
FilterVtx(
const float_v &xV,
const float_v &yV,
const L1XYMeasurementInfo &info, float_v &extrDx, float_v &extrDy, float_v J[],
const float_m &active = float_m(
true));
339 float_m TransportJXY0ToX0(
const float_v &x0,
const L1FieldRegion &F, float_v &extrDx, float_v &extrDy, float_v &J04, float_v &J14,
const float_m &active = float_m(
true));
341 float_v fX, fY, fTx, fTy, fQP, fZ, fC00, fC10, fC11, fC20, fC21, fC22, fC30, fC31, fC32, fC33, fC40, fC41, fC42, fC43, fC44;
357 inline float_m PndFTSCATrackParamVector::TransportToX0Line(
const float_v &x0_out,
const float_m &mask)
359 float_v dz = (x0_out - fZ);
362 fX(mask) += fTx * dz;
363 fY(mask) += fTy * dz;
366 const float_v dzC32_in = dz * fC32;
368 fC21(mask) += dzC32_in;
369 fC10(mask) += dz * (fC21 + fC30);
371 const float_v C20_in = fC20;
373 fC20(mask) += dz * fC22;
374 fC00(mask) += dz * (fC20 + C20_in);
376 const float_v C31_in = fC31;
378 fC31(mask) += dz * fC33;
379 fC11(mask) += dz * (fC31 + C31_in);
380 fC30(mask) += dzC32_in;
382 fC40(mask) += dz * fC42;
383 fC41(mask) += dz * fC43;
389 const float_v &x0,
const float_v &y0,
const float_v &r,
const FTSCAStripInfoVector &info, float_v err2,
const float_m &active,
399 success &= (err2 > 1.e-8
f);
403 float_v h0(Vc::Zero);
404 float_v h1(Vc::Zero);
405 h0(active) = info.
cos;
406 h1(active) = info.
sin;
412 const float_v tx = h0 * fTx + h1 * fTy;
418 float_v rCorrection =
sqrt(1.
f + tx * tx);
420 float_v Diff = h0 * (fX - x0) + h1 * (fY - y0);
421 float_v zeta_1, zeta_2;
422 zeta_1 = h0 * (fX - x0) + h1 * (fY - y0) - r * rCorrection;
423 zeta_2 = h0 * (fX - x0) + h1 * (fY - y0) + r * rCorrection;
425 for (
int iDiff = 0; iDiff < 4; iDiff++) {
426 float Diff_f = (float)Diff[iDiff];
429 zeta[iDiff] = zeta_1[iDiff];
431 zeta[iDiff] = zeta_2[iDiff];
439 err2[0] = err2[0] + r[0] * r[0];
440 err2 *= rCorrection * rCorrection;
442 float_v wi, zetawi, HCH;
443 float_v F0, F1, F2, F3, F4;
444 float_v K1, K2, K3, K4;
450 F0 = h0 * fC00 + h1 * fC10;
451 F1 = h0 * fC10 + h1 * fC11;
454 HCH = (h0 * h0 * fC00 + 2.f * h0 * h1 * fC10) + h1 * h1 * fC11;
456 F2 = h0 * fC20 + h1 * fC21;
457 F3 = h0 * fC30 + h1 * fC31;
458 F4 = h0 * fC40 + h1 * fC41;
460 float_v dChi2(Vc::Zero);
462 cout<<
"we don't have to be here for now \n";
463 const float_m mask = success && (HCH > err2 * 16.f);
466 zetawi(mask) = zeta *wi;
467 dChi2(mask) += (zeta * zetawi);
470 wi = 1.f / (err2 + HCH);
472 dChi2(success) += zeta * zetawi;
485 fX(success) -= F0 * zetawi;
486 fY(success) -= F1 * zetawi;
487 fTx(success) -= F2 * zetawi;
488 fTy(success) -= F3 * zetawi;
489 fQP(success) -= F4 * zetawi;
491 fC00(success) -= F0 * F0 * wi;
492 fC10(success) -= K1 * F0;
493 fC11(success) -= K1 * F1;
494 fC20(success) -= K2 * F0;
495 fC21(success) -= K2 * F1;
496 fC22(success) -= K2 * F2;
497 fC30(success) -= K3 * F0;
498 fC31(success) -= K3 * F1;
499 fC32(success) -= K3 * F2;
500 fC33(success) -= K3 * F3;
501 fC40(success) -= K4 * F0;
502 fC41(success) -= K4 * F1;
503 fC42(success) -= K4 * F2;
504 fC43(success) -= K4 * F3;
505 fC44(success) -= K4 * F4;
507 fNDF(static_cast<int_m>(success)) += 1;
514 float_m active = mask;
518 active &= PassMaterial(material, qp0, active);
519 const float_v mass2 = 0.13957f * 0.13957f;
520 float_v direction = -1.f;
524 EnergyLossCorrection(mass2, material.
RadThick, qp0, direction, active);
529 inline float_m PndFTSCATrackParamVector::RK4TransportToX0(
const float_v &x0_out,
const L1FieldRegion & ,
const float_v & ,
const float_m &mask)
553 const float_v fC = 0.000299792458f;
568 float_v Ax[4], Ay[4];
569 float_v dAx_dtx[4], dAy_dtx[4], dAx_dty[4], dAy_dty[4];
572 float_v h = x0_out - fZ;
575 float_v hCqp = h * fC * xIn[4];
584 for (
unsigned int iStep = 0; iStep < 4; iStep++) {
587 x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1];
588 x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1];
589 x[2] = xIn[2] + coef[iStep] * k[2][iStep - 1];
590 x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1];
593 float_v bx(0.
f), by(0.
f), bz(0.
f);
596 for (
int xxx = 0; xxx < float_v::Size; xxx++) {
603 p[2] = fZ[xxx] + coef[iStep][xxx] * h[xxx];
607 FairRunAna::Instance()->GetField()->Field(p, b);
616 float_v txtx = tx * tx;
617 float_v tyty = ty * ty;
618 float_v txty = tx * ty;
619 float_v txtxtyty1 = 1.f + txtx + tyty;
620 float_v t1 =
sqrt(txtxtyty1);
621 float_v t2 = 1.f / txtxtyty1;
623 Ax[iStep] = (txty * bx + ty * bz - (1.f + txtx) * by) * t1;
624 Ay[iStep] = (-txty * by - tx * bz + (1.f + tyty) * bx) * t1;
626 dAx_dtx[iStep] = Ax[iStep] * tx * t2 + (ty * bx - 2.f * tx * by) * t1;
627 dAx_dty[iStep] = Ax[iStep] * ty * t2 + (tx * bx + bz) * t1;
628 dAy_dtx[iStep] = Ay[iStep] * tx * t2 + (-ty * by - bz) * t1;
629 dAy_dty[iStep] = Ay[iStep] * ty * t2 + (-tx * by + 2.f * ty * bx) * t1;
631 k[0][iStep] = tx * h;
632 k[1][iStep] = ty * h;
633 k[2][iStep] = Ax[iStep] * hCqp;
634 k[3][iStep] = Ay[iStep] * hCqp;
640 xOut[0] = xIn[0] + k[0][0] / 6.f + k[0][1] / 3.f + k[0][2] / 3.f + k[0][3] / 6.f;
641 xOut[1] = xIn[1] + k[1][0] / 6.f + k[1][1] / 3.f + k[1][2] / 3.f + k[1][3] / 6.f;
642 xOut[2] = xIn[2] + k[2][0] / 6.f + k[2][1] / 3.f + k[2][2] / 3.f + k[2][3] / 6.f;
643 xOut[3] = xIn[3] + k[3][0] / 6.f + k[3][1] / 3.f + k[3][2] / 3.f + k[3][3] / 6.f;
674 for (
unsigned int iStep = 0; iStep < 4; iStep++) {
676 x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1];
677 x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1];
678 x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1];
681 k[0][iStep] = x[2] * h;
682 k[1][iStep] = x[3] * h;
684 k[3][iStep] = (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]) * hCqp;
687 Fmat[2] = x0[0] + k[0][0] / 6.f + k[0][1] / 3.f + k[0][2] / 3.f + k[0][3] / 6.f;
689 Fmat[7] = x0[1] + k[1][0] / 6.f + k[1][1] / 3.f + k[1][2] / 3.f + k[1][3] / 6.f;
692 Fmat[17] = x0[3] + k[3][0] / 6.f + k[3][1] / 3.f + k[3][2] / 3.f + k[3][3] / 6.f;
701 for (
unsigned int iStep = 0; iStep < 4; iStep++) {
703 x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1];
704 x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1];
705 x[2] = xIn[2] + coef[iStep] * k[2][iStep - 1];
708 k[0][iStep] = x[2] * h;
709 k[1][iStep] = x[3] * h;
710 k[2][iStep] = (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]) * hCqp;
714 Fmat[3] = x0[0] + k[0][0] / 6.f + k[0][1] / 3.f + k[0][2] / 3.f + k[0][3] / 6.f;
716 Fmat[8] = x0[1] + k[1][0] / 6.f + k[1][1] / 3.f + k[1][2] / 3.f + k[1][3] / 6.f;
718 Fmat[13] = x0[2] + k[2][0] / 6.f + k[2][1] / 3.f + k[2][2] / 3.f + k[2][3] / 6.f;
728 for (
unsigned int iStep = 0; iStep < 4; iStep++) {
730 x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1];
731 x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1];
732 x[2] = xIn[2] + coef[iStep] * k[2][iStep - 1];
733 x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1];
736 k[0][iStep] = x[2] * h;
737 k[1][iStep] = x[3] * h;
738 k[2][iStep] = Ax[iStep] * hC + hCqp * (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]);
739 k[3][iStep] = Ay[iStep] * hC + hCqp * (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]);
742 Fmat[4] = x0[0] + k[0][0] / 6.f + k[0][1] / 3.f + k[0][2] / 3.f + k[0][3] / 6.f;
744 Fmat[9] = x0[1] + k[1][0] / 6.f + k[1][1] / 3.f + k[1][2] / 3.f + k[1][3] / 6.f;
746 Fmat[14] = x0[2] + k[2][0] / 6.f + k[2][1] / 3.f + k[2][2] / 3.f + k[2][3] / 6.f;
748 Fmat[19] = x[3] + k[3][0] / 6.f + k[3][1] / 3.f + k[3][2] / 3.f + k[3][3] / 6.f;
754 float_v A = fC20 + Fmat[2] * fC22 + Fmat[3] * fC32 + Fmat[4] * fC42;
755 float_v B = fC30 + Fmat[2] * fC32 + Fmat[3] * fC33 + Fmat[4] * fC43;
756 float_v C = fC40 + Fmat[2] * fC42 + Fmat[3] * fC43 + Fmat[4] * fC44;
758 float_v D = fC21 + Fmat[7] * fC22 + Fmat[8] * fC32 + Fmat[9] * fC42;
759 float_v E = fC31 + Fmat[7] * fC32 + Fmat[8] * fC33 + Fmat[9] * fC43;
760 float_v G = fC41 + Fmat[7] * fC42 + Fmat[8] * fC43 + Fmat[9] * fC44;
762 float_v H = fC22 + Fmat[13] * fC32 + Fmat[14] * fC42;
763 float_v I = fC32 + Fmat[13] * fC33 + Fmat[14] * fC43;
764 float_v J = fC42 + Fmat[13] * fC43 + Fmat[14] * fC44;
766 float_v K = fC43 + Fmat[17] * fC42 + Fmat[19] * fC44;
768 fC00(mask) = fC00 + Fmat[2] * fC20 + Fmat[3] * fC30 + Fmat[4] * fC40 + A * Fmat[2] + B * Fmat[3] + C * Fmat[4];
769 fC10(mask) = fC10 + Fmat[2] * fC21 + Fmat[3] * fC31 + Fmat[4] * fC41 + A * Fmat[7] + B * Fmat[8] + C * Fmat[9];
770 fC20(mask) = A + B * Fmat[13] + C * Fmat[14];
771 fC30(mask) = B + A * Fmat[17] + C * Fmat[19];
774 fC11(mask) = fC11 + Fmat[7] * fC21 + Fmat[8] * fC31 + Fmat[9] * fC41 + D * Fmat[7] + E * Fmat[8] + G * Fmat[9];
775 fC21(mask) = D + E * Fmat[13] + G * Fmat[14];
776 fC31(mask) = E + D * Fmat[17] + G * Fmat[19];
779 fC22(mask) = H + I * Fmat[13] + J * Fmat[14];
780 fC32(mask) = I + H * Fmat[17] + J * Fmat[19];
783 fC33(mask) = fC33 + Fmat[17] * fC32 + Fmat[19] * fC43 + (Fmat[17] * fC22 + fC32 + Fmat[19] * fC42) * Fmat[17] + K * Fmat[19];
800 const float_v c_light = 0.000299792458f;
805 const float_v c1 = 1.f, c2 = 2.f, c3 = 3.f, c4 = 4.f, c6 = 6.f, c9 = 9.f, c15 = 15.f, c18 = 18.f, c45 = 45.f, c2i = 1.f / 2.f, c3i = 1.f / 3.f, c6i = 1.f / 6.f,
808 float_v dz(Vc::Zero);
809 dz(mask) = (x0_out - fZ);
811 const float_v dz2 = dz * dz;
812 const float_v dz3 = dz2 * dz;
815 const float_v x = fTx;
816 const float_v y = fTy;
817 const float_v xx = x * x;
818 const float_v xy = x * y;
819 const float_v yy = y * y;
820 const float_v y2 = y * c2;
821 const float_v x2 = x * c2;
822 const float_v x4 = x * c4;
823 const float_v xx31 = xx * c3 + c1;
824 const float_v xx159 = xx * c15 + c9;
826 const float_v Ay = -xx - c1;
827 const float_v Ayy = x * (xx * c3 + c3);
828 const float_v Ayz = -c2 * xy;
829 const float_v Ayyy = -(c15 * xx * xx + c18 * xx + c3);
831 const float_v Ayy_fX = c3 * xx31;
832 const float_v Ayyy_fX = -x4 * xx159;
834 const float_v bx = yy + c1;
835 const float_v Byy = y * xx31;
836 const float_v Byz = c2 * xx + c1;
837 const float_v Byyy = -xy * xx159;
839 const float_v Byy_fX = c6 * xy;
840 const float_v Byyy_fX = -y * (c45 * xx + c9);
841 const float_v Byyy_fY = -x * xx159;
845 const float_v t2 = c1 + xx + yy;
846 const float_v t =
sqrt(t2);
847 const float_v h = qp0 * c_light;
848 const float_v ht = h * t;
851 const float_v ddz = fZ - F.
z0;
852 float_v Fx0 = F.
cx0 + F.
cx1 * ddz + F.
cx2 * ddz * ddz;
853 float_v Fx1 = (F.
cx1 + c2 * F.
cx2 * ddz) * dz;
854 float_v Fx2 = F.
cx2 * dz2;
855 float_v Fy0 = F.
cy0 + F.
cy1 * ddz + F.
cy2 * ddz * ddz;
856 float_v Fy1 = (F.
cy1 + c2 * F.
cy2 * ddz) * dz;
857 float_v Fy2 = F.
cy2 * dz2;
858 float_v Fz0 = F.
cz0 + F.
cz1 * ddz + F.
cz2 * ddz * ddz;
859 float_v Fz1 = (F.
cz1 + c2 * F.
cz2 * ddz) * dz;
860 float_v Fz2 = F.
cz2 * dz2;
862 const float_v sx = (Fx0 + Fx1 * c2i + Fx2 * c3i);
863 const float_v sy = (Fy0 + Fy1 * c2i + Fy2 * c3i);
864 const float_v sz = (Fz0 + Fz1 * c2i + Fz2 * c3i);
866 const float_v Sx = (Fx0 * c2i + Fx1 * c6i + Fx2 * c12i);
867 const float_v Sy = (Fy0 * c2i + Fy1 * c6i + Fy2 * c12i);
868 const float_v Sz = (Fz0 * c2i + Fz1 * c6i + Fz2 * c12i);
872 const float_v d = 1.f / 360.f, c00 = 30.f * 6.f * d, c01 = 30.f * 2.f * d, c02 = 30.f * d, c10 = 3.f * 40.f * d, c11 = 3.f * 15.f * d, c12 = 3.f * 8.f * d,
873 c20 = 2.f * 45.f * d, c21 = 2.f * 2.f * 9.f * d, c22 = 2.f * 2.f * 5.f * d;
874 syz = Fy0 * (c00 * Fz0 + c01 * Fz1 + c02 * Fz2) + Fy1 * (c10 * Fz0 + c11 * Fz1 + c12 * Fz2) + Fy2 * (c20 * Fz0 + c21 * Fz1 + c22 * Fz2);
879 const float_v d = 1.f / 2520.f, c00 = 21.f * 20.f * d, c01 = 21.f * 5.f * d, c02 = 21.f * 2.f * d, c10 = 7.f * 30.f * d, c11 = 7.f * 9.f * d, c12 = 7.f * 4.f * d,
880 c20 = 2.f * 63.f * d, c21 = 2.f * 21.f * d, c22 = 2.f * 10.f * d;
881 Syz = Fy0 * (c00 * Fz0 + c01 * Fz1 + c02 * Fz2) + Fy1 * (c10 * Fz0 + c11 * Fz1 + c12 * Fz2) + Fy2 * (c20 * Fz0 + c21 * Fz1 + c22 * Fz2);
884 const float_v syy = sy * sy * c2i;
885 const float_v syyy = syy * sy * c3i;
889 const float_v d = 1.f / 2520.f, c00 = 420.f * d, c01 = 21.f * 15.f * d, c02 = 21.f * 8.f * d, c03 = 63.f * d, c04 = 70.f * d, c05 = 20.f * d;
890 Syy = Fy0 * (c00 * Fy0 + c01 * Fy1 + c02 * Fy2) + Fy1 * (c03 * Fy1 + c04 * Fy2) + c05 * Fy2 * Fy2;
895 const float_v d = 1.f / 181440.f, c000 = 7560 * d, c001 = 9 * 1008 * d, c002 = 5 * 1008 * d, c011 = 21 * 180 * d, c012 = 24 * 180 * d, c022 = 7 * 180 * d, c111 = 540 * d,
896 c112 = 945 * d, c122 = 560 * d, c222 = 112 * d;
897 const float_v Fy22 = Fy2 * Fy2;
898 Syyy = Fy0 * (Fy0 * (c000 * Fy0 + c001 * Fy1 + c002 * Fy2) + Fy1 * (c011 * Fy1 + c012 * Fy2) + c022 * Fy22) + Fy1 * (Fy1 * (c111 * Fy1 + c112 * Fy2) + c122 * Fy22) +
902 const float_v sA1 = sx * xy + sy * Ay + sz * y;
903 const float_v sA1_fX = sx * y - sy * x2;
904 const float_v sA1_fY = sx * x + sz;
906 const float_v sB1 = sx * bx - sy * xy - sz * x;
907 const float_v sB1_fX = -sy * y - sz;
908 const float_v sB1_fY = sx * y2 - sy * x;
910 const float_v SA1 = Sx * xy + Sy * Ay + Sz * y;
911 const float_v SA1_fX = Sx * y - Sy * x2;
912 const float_v SA1_fY = Sx * x + Sz;
914 const float_v SB1 = Sx * bx - Sy * xy - Sz * x;
915 const float_v SB1_fX = -Sy * y - Sz;
916 const float_v SB1_fY = Sx * y2 - Sy * x;
918 const float_v sA2 = syy * Ayy + syz * Ayz;
919 const float_v sA2_fX = syy * Ayy_fX - syz * y2;
920 const float_v sA2_fY = -syz * x2;
921 const float_v sB2 = syy * Byy + syz * Byz;
922 const float_v sB2_fX = syy * Byy_fX + syz * x4;
923 const float_v sB2_fY = syy * xx31;
925 const float_v SA2 = Syy * Ayy + Syz * Ayz;
926 const float_v SA2_fX = Syy * Ayy_fX - Syz * y2;
927 const float_v SA2_fY = -Syz * x2;
928 const float_v SB2 = Syy * Byy + Syz * Byz;
929 const float_v SB2_fX = Syy * Byy_fX + Syz * x4;
930 const float_v SB2_fY = Syy * xx31;
932 const float_v sA3 = syyy * Ayyy;
933 const float_v sA3_fX = syyy * Ayyy_fX;
934 const float_v sB3 = syyy * Byyy;
935 const float_v sB3_fX = syyy * Byyy_fX;
936 const float_v sB3_fY = syyy * Byyy_fY;
938 const float_v SA3 = Syyy * Ayyy;
939 const float_v SA3_fX = Syyy * Ayyy_fX;
940 const float_v SB3 = Syyy * Byyy;
941 const float_v SB3_fX = Syyy * Byyy_fX;
942 const float_v SB3_fY = Syyy * Byyy_fY;
944 const float_v ht1 = ht * dz;
945 const float_v ht2 = ht * ht * dz2;
946 const float_v ht3 = ht * ht * ht * dz3;
947 const float_v ht1sA1 = ht1 * sA1;
948 const float_v ht1sB1 = ht1 * sB1;
949 const float_v ht1SA1 = ht1 * SA1;
950 const float_v ht1SB1 = ht1 * SB1;
951 const float_v ht2sA2 = ht2 * sA2;
952 const float_v ht2SA2 = ht2 * SA2;
953 const float_v ht2sB2 = ht2 * sB2;
954 const float_v ht2SB2 = ht2 * SB2;
955 const float_v ht3sA3 = ht3 * sA3;
956 const float_v ht3sB3 = ht3 * sB3;
957 const float_v ht3SA3 = ht3 * SA3;
958 const float_v ht3SB3 = ht3 * SB3;
960 fX(mask) += ((x + ht1SA1 + ht2SA2 + ht3SA3) * dz);
961 fY(mask) += ((y + ht1SB1 + ht2SB2 + ht3SB3) * dz);
962 fTx(mask) += (ht1sA1 + ht2sA2 + ht3sA3);
963 fTy(mask) += (ht1sB1 + ht2sB2 + ht3sB3);
970 const float_v ctdz = c_light * t * dz;
971 const float_v ctdz2 = c_light * t * dz2;
973 const float_v dqp = fQP - qp0;
974 const float_v t2i = c1 *
rcp(t2);
975 const float_v xt2i = x * t2i;
976 const float_v yt2i = y * t2i;
977 const float_v tmp0 = ht1SA1 + c2 * ht2SA2 + c3 * ht3SA3;
978 const float_v tmp1 = ht1SB1 + c2 * ht2SB2 + c3 * ht3SB3;
979 const float_v tmp2 = ht1sA1 + c2 * ht2sA2 + c3 * ht3sA3;
980 const float_v tmp3 = ht1sB1 + c2 * ht2sB2 + c3 * ht3sB3;
982 const float_v j02 = dz * (c1 + xt2i * tmp0 + ht1 * SA1_fX + ht2 * SA2_fX + ht3 * SA3_fX);
983 const float_v j12 = dz * (xt2i * tmp1 + ht1 * SB1_fX + ht2 * SB2_fX + ht3 * SB3_fX);
984 const float_v j22 = c1 + xt2i * tmp2 + ht1 * sA1_fX + ht2 * sA2_fX + ht3 * sA3_fX;
985 const float_v j32 = xt2i * tmp3 + ht1 * sB1_fX + ht2 * sB2_fX + ht3 * sB3_fX;
987 const float_v j03 = dz * (yt2i * tmp0 + ht1 * SA1_fY + ht2 * SA2_fY);
988 const float_v j13 = dz * (c1 + yt2i * tmp1 + ht1 * SB1_fY + ht2 * SB2_fY + ht3 * SB3_fY);
989 const float_v j23 = yt2i * tmp2 + ht1 * sA1_fY + ht2 * sA2_fY;
990 const float_v j33 = c1 + yt2i * tmp3 + ht1 * sB1_fY + ht2 * sB2_fY + ht3 * sB3_fY;
992 const float_v j04 = ctdz2 * (SA1 + c2 * ht1 * SA2 + c3 * ht2 * SA3);
993 const float_v j14 = ctdz2 * (SB1 + c2 * ht1 * SB2 + c3 * ht2 * SB3);
994 const float_v j24 = ctdz * (sA1 + c2 * ht1 * sA2 + c3 * ht2 * sA3);
995 const float_v j34 = ctdz * (sB1 + c2 * ht1 * sB2 + c3 * ht2 * sB3);
998 fX(mask) += j04 * dqp;
999 fY(mask) += j14 * dqp;
1000 fTx(mask) += j24 * dqp;
1001 fTy(mask) += j34 * dqp;
1008 const float_v c42 = fC42, c43 = fC43;
1010 const float_v cj00 = fC00 + fC20 * j02 + fC30 * j03 + fC40 * j04;
1012 const float_v cj20 = fC20 + fC22 * j02 + fC32 * j03 + c42 * j04;
1013 const float_v cj30 = fC30 + fC32 * j02 + fC33 * j03 + c43 * j04;
1015 const float_v cj01 = fC10 + fC20 * j12 + fC30 * j13 + fC40 * j14;
1016 const float_v cj11 = fC11 + fC21 * j12 + fC31 * j13 + fC41 * j14;
1017 const float_v cj21 = fC21 + fC22 * j12 + fC32 * j13 + c42 * j14;
1018 const float_v cj31 = fC31 + fC32 * j12 + fC33 * j13 + c43 * j14;
1022 const float_v cj22 = fC22 * j22 + fC32 * j23 + c42 * j24;
1023 const float_v cj32 = fC32 * j22 + fC33 * j23 + c43 * j24;
1027 const float_v cj23 = fC22 * j32 + fC32 * j33 + c42 * j34;
1028 const float_v cj33 = fC32 * j32 + fC33 * j33 + c43 * j34;
1030 fC40(mask) += (c42 * j02 + c43 * j03 + fC44 * j04);
1031 fC41(mask) += (c42 * j12 + c43 * j13 + fC44 * j14);
1032 fC42(mask) = (c42 * j22 + c43 * j23 + fC44 * j24);
1033 fC43(mask) = (c42 * j32 + c43 * j33 + fC44 * j34);
1035 fC00(mask) = (cj00 + j02 * cj20 + j03 * cj30 + j04 * fC40);
1036 fC10(mask) = (cj01 + j02 * cj21 + j03 * cj31 + j04 * fC41);
1037 fC11(mask) = (cj11 + j12 * cj21 + j13 * cj31 + j14 * fC41);
1041 fC20(mask) = (j22 * cj20 + j23 * cj30 + j24 * fC40);
1042 fC30(mask) = (j32 * cj20 + j33 * cj30 + j34 * fC40);
1043 fC21(mask) = (j22 * cj21 + j23 * cj31 + j24 * fC41);
1044 fC31(mask) = (j32 * cj21 + j33 * cj31 + j34 * fC41);
1045 fC22(mask) = (j22 * cj22 + j23 * cj32 + j24 * fC42);
1046 fC32(mask) = (j32 * cj22 + j33 * cj32 + j34 * fC42);
1047 fC33(mask) = (j32 * cj23 + j33 * cj33 + j34 * fC43);
1052 inline float_m PndFTSCATrackParamVector::PassMaterial(
const L1MaterialInfo &info,
const float_v &qp0,
const float_m &mask)
1054 const float_v mass2 = 0.1395679f * 0.1395679f;
1056 float_v txtx = fTx * fTx;
1057 float_v tyty = fTy * fTy;
1058 float_v txtx1 = txtx + 1.f;
1059 float_v h = txtx + tyty;
1060 float_v t =
sqrt(txtx1 + tyty);
1062 float_v qp0t = qp0 * t;
1064 const float_v c1 = 0.0136f, c2 = c1 * 0.038f, c3 = c2 * 0.5f, c4 = -c3 / 2.0f, c5 = c3 / 3.0f, c6 = -c3 / 4.0f;
1066 float_v s0 = (c1 + c2 * info.
logRadThick + c3 * h + h2 * (c4 + c5 * h + c6 * h2)) * qp0t;
1067 float_v a = ((t + mass2 * qp0 * qp0t) * info.
RadThick * s0 * s0);
1071 fC22(mask) += txtx1 * a;
1072 fC32(mask) += fTx * fTy * a;
1073 fC33(mask) += (1.f + tyty) * a;
1094 const float_v &kp0 = 2.33f;
1095 const float_v &kp1 = 0.20f;
1096 const float_v &kp2 = 3.00f;
1097 const float_v &kp3 = 173e-9
f;
1098 const float_v &kp4 = 0.49848f;
1100 const float mK = 0.307075e-3
f;
1101 const float _2me = 1.022e-3
f;
1102 const float_v &rho = kp0;
1103 const float_v &x0 = kp1 * 2.303f;
1104 const float_v &x1 = kp2 * 2.303f;
1105 const float_v &mI = kp3;
1106 const float_v &mZA = kp4;
1107 const float_v &maxT = _2me * bg2;
1110 float_v d2(Vc::Zero);
1111 const float_v x = 0.5f *
log(bg2);
1112 const float_v lhwI =
log(28.816f * 1e-9f *
sqrt(rho * mZA) / mI);
1114 float_m init = x > x1;
1116 d2(init) = lhwI + x - 0.5f;
1117 const float_v &r = (x1 - x) / (x1 - x0);
1118 init = (x > x0) & (x1 > x);
1119 d2(init) = (lhwI + x - 0.5f + (0.5f - lhwI - x0) * r * r * r);
1121 return mK * mZA * (1.f + bg2) / bg2 * (0.5f *
log(_2me * bg2 * maxT / (mI * mI)) - bg2 / (1.f + bg2) - d2);
1124 inline void PndFTSCATrackParamVector::EnergyLossCorrection(
const float_v &mass2,
const float_v &radThick, float_v &qp0, float_v direction,
const float_m &mask)
1126 const float_v &p2 = 1.f / (qp0 * qp0);
1127 const float_v &E2 = mass2 + p2;
1131 float_v tr =
sqrt(1.f + fTx * fTx + fTy * fTy);
1133 const float_v &dE = bethe * radThick * tr * 2.33f * 9.34961f;
1135 const float_v &E2Corrected = (
sqrt(E2) + direction * dE) * (
sqrt(E2) + direction * dE);
1136 float_v corr =
sqrt(p2 / (E2Corrected - mass2));
1138 float_m init = !(corr == corr) || !(mask);
1146 fC44(mask) *= corr * corr;
1152 float_v zeta0, zeta1, S00, S10, S11, si;
1153 float_v F00, F10, F20, F30, F40, F01, F11, F21, F31, F41;
1154 float_v K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
1156 zeta0 = fX + extrDx - xV;
1157 zeta1 = fY + extrDy - yV;
1174 S00 = info.
C00 + F00 + J[0] * F20 + J[1] * F30 + J[2] * F40;
1175 S10 = info.
C10 + F10 + J[3] * F20 + J[4] * F30 + J[5] * F40;
1176 S11 = info.
C11 + F11 + J[3] * F21 + J[4] * F31 + J[5] * F41;
1178 si = 1.f / (S00 * S11 - S10 * S10);
1179 float_v S00tmp = S00;
1184 fChi2(active) += zeta0 * zeta0 * S00 + 2.f * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
1186 K00 = F00 * S00 + F01 * S10;
1187 K01 = F00 * S10 + F01 * S11;
1188 K10 = F10 * S00 + F11 * S10;
1189 K11 = F10 * S10 + F11 * S11;
1190 K20 = F20 * S00 + F21 * S10;
1191 K21 = F20 * S10 + F21 * S11;
1192 K30 = F30 * S00 + F31 * S10;
1193 K31 = F30 * S10 + F31 * S11;
1194 K40 = F40 * S00 + F41 * S10;
1195 K41 = F40 * S10 + F41 * S11;
1197 fX(active) -= K00 * zeta0 + K01 * zeta1;
1198 fY(active) -= K10 * zeta0 + K11 * zeta1;
1199 fTx(active) -= K20 * zeta0 + K21 * zeta1;
1200 fTy(active) -= K30 * zeta0 + K31 * zeta1;
1201 fQP(active) -= K40 * zeta0 + K41 * zeta1;
1203 fC00(active) -= (K00 * F00 + K01 * F01);
1204 fC10(active) -= (K10 * F00 + K11 * F01);
1205 fC11(active) -= (K10 * F10 + K11 * F11);
1206 fC20(active) = -(K20 * F00 + K21 * F01);
1207 fC21(active) = -(K20 * F10 + K21 * F11);
1208 fC22(active) -= (K20 * F20 + K21 * F21);
1209 fC30(active) = -(K30 * F00 + K31 * F01);
1210 fC31(active) = -(K30 * F10 + K31 * F11);
1211 fC32(active) = -(K30 * F20 + K31 * F21);
1212 fC33(active) -= (K30 * F30 + K31 * F31);
1213 fC40(active) = -(K40 * F00 + K41 * F01);
1214 fC41(active) = -(K40 * F10 + K41 * F11);
1215 fC42(active) = -(K40 * F20 + K41 * F21);
1216 fC43(active) = -(K40 * F30 + K41 * F31);
1217 fC44(active) -= (K40 * F40 + K41 * F41);
1223 PndFTSCATrackParamVector::TransportJXY0ToX0(
const float_v &x0,
const L1FieldRegion &F, float_v &extrDx, float_v &extrDy, float_v &J04, float_v &J14,
const float_m &active)
1225 const float_v c_light = 0.000299792458f, c1 = 1.f, c2i = 0.5f, c6i = 1.f / 6.f, c12i = 1.f / 12.f;
1227 const float_v dz = x0 - fZ;
1228 float_v dz2 = dz * dz;
1229 float_v dzc6i = dz * c6i;
1230 float_v dz2c12i = dz2 * c12i;
1232 float_v xx = fTx * fTx;
1233 float_v yy = fTy * fTy;
1234 float_v xy = fTx * fTy;
1236 float_v Ay = -xx - c1;
1237 float_v bx = yy + c1;
1239 float_v ctdz2 = c_light *
sqrt(c1 + xx + yy) * dz2;
1241 float_v Sx = F.
cx0 * c2i + F.
cx1 * dzc6i + F.
cx2 * dz2c12i;
1242 float_v Sy = F.
cy0 * c2i + F.
cy1 * dzc6i + F.
cy2 * dz2c12i;
1243 float_v Sz = F.
cz0 * c2i + F.
cz1 * dzc6i + F.
cz2 * dz2c12i;
1245 extrDx(active) = (fTx)*dz;
1246 extrDy(active) = (fTy)*dz;
1247 J04(active) = ctdz2 * (Sx * xy + Sy * Ay + Sz * fTy);
1248 J14(active) = ctdz2 * (Sx * bx - Sy * xy - Sz * fTx);
1268 template <
typename T>
1270 template <
typename _CharT,
typename _Traits>
1271 class basic_istream;
1272 typedef basic_istream<char, char_traits<char>>
istream;
1273 template <
typename _CharT,
typename _Traits>
1274 class basic_ostream;
1275 typedef basic_ostream<char, char_traits<char>>
ostream;
1292 for (
int i = 0; i < 5; ++
i)
1294 for (
int i = 0; i < 15; ++
i)
1306 const float_v r =
sqrt(r0 * r0 + r1 * r1);
1324 float_v
X()
const {
return fX; }
1325 float_v
Y()
const {
return fP[0]; }
1326 float_v
Z()
const {
return fP[1]; }
1328 float_v
DzDs()
const {
return fP[3]; }
1329 float_v
QPt()
const {
return fP[4]; }
1331 float_v
Angle()
const {
return fAlpha; }
1333 float_v
X0()
const {
return X(); }
1334 float_v
X1()
const {
return Y(); }
1335 float_v
X2()
const {
return Z(); }
1345 float_v
Chi2()
const {
return fChi2; }
1346 int_v
NDF()
const {
return fNDF; }
1354 float_v
GetX()
const {
return fX; }
1355 float_v
GetY()
const {
return fP[0]; }
1356 float_v
GetZ()
const {
return fP[1]; }
1364 float_v
GetKappa(
const float_v &Bz)
const {
return fP[4] * Bz; }
1374 const float_v &
Par(
int i)
const {
return fP[
i]; }
1375 const float_v &
Cov(
int i)
const {
return fC[
i]; }
1379 const float_v *
Par()
const {
return fP; }
1380 const float_v *
Cov()
const {
return fC; }
1381 float_v *
Par() {
return fP; }
1382 float_v *
Cov() {
return fC; }
1387 for (
int i = 0; i < 5; i++)
1388 fP[i](
m) = param.
Par()[
i];
1389 for (
int i = 0; i < 15; i++)
1390 fC[i](
m) = param.
Cov()[
i];
1394 fNDF(static_cast<int_m>(
m)) = param.
GetNDF();
1395 fAlpha(static_cast<int_m>(
m)) = param.
Angle();
1400 for (
int i = 0; i < 5; i++)
1401 fP[i][iV] = param.
Par()[
i][iVa];
1402 for (
int i = 0; i < 15; i++)
1403 fC[i][iV] = param.
Cov()[
i][iVa];
1404 fX[iV] = param.
X()[iVa];
1406 fChi2[iV] = param.
GetChi2()[iVa];
1407 fNDF[iV] = param.
GetNDF()[iVa];
1408 fAlpha[iV] = param.
Angle()[iVa];
1412 void SetPar(
int i,
const float_v &v,
const float_m &
m) { fP[
i](
m) = v; }
1414 void SetCov(
int i,
const float_v &v,
const float_m &
m) { fC[
i](
m) = v; }
1417 void SetY(
const float_v &v) { fP[0] =
v; }
1418 void SetZ(
const float_v &v) { fP[1] =
v; }
1419 void SetX(
const float_v &v,
const float_m &
m) { fX(m) =
v; }
1420 void SetY(
const float_v &v,
const float_m &
m) { fP[0](
m) = v; }
1421 void SetZ(
const float_v &v,
const float_m &
m) { fP[1](
m) = v; }
1425 void SetDzDs(
const float_v &v,
const float_m &
m) { fP[3](
m) = v; }
1428 void SetQPt(
const float_v &v,
const float_m &
m) { fP[4](
m) = v; }
1432 void SetChi2(
const float_v &v,
const float_m &
m) { fChi2(m) =
v; }
1435 void SetNDF(
const int_v &v,
const int_m &
m) { fNDF(m) =
v; }
1438 void SetAngle(
const float_v &v,
const float_m &
m) { fAlpha(m) =
v; }
1447 float_v
GetS(
const float_v &x,
const float_v &y,
const float_v &Bz)
const;
1449 void GetDCAPoint(
const float_v &x,
const float_v &y,
const float_v &z, float_v *px, float_v *py, float_v *
pz,
const float_v &Bz)
const;
1451 float_m
TransportToX0WithMaterial(
const float_v &x,
const float_v &XOverX0,
const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi = .999f);
1453 float_m
TransportToX0(
const float_v &x,
const float_v &Bz,
const float maxSinPhi = .999f,
const float_m &mask = float_m(
true));
1458 float_m
TransportToX0(
const float_v &x,
const float_v &sinPhi0,
const float_v &Bz,
const float_v maxSinPhi = .999f,
const float_m &mask = float_m(
true));
1461 const float_v &Bz,
const float maxSinPhi = .999f,
const float_m &mask = float_m(
true));
1467 float_m
Rotate(
const float_v &alpha,
const float maxSinPhi = .999f,
const float_m &mask = float_m(
true));
1468 void RotateXY(float_v alpha, float_v &x, float_v &y, float_v &
sin,
const float_m &mask = float_m(
true))
const;
1470 float_m
FilterWithMaterial(
const float_v &y,
const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z,
float maxSinPhi = 0.999f,
const float_m &mask = float_m(
true),
1471 const int_v &hitNDF = int_v(2),
const float_v &chi2Cut = 10e10f);
1473 float_m
FilterWithMaterial(
const float_v &y,
const float_v &z,
const FTSCAStripInfo &info, float_v err2,
float maxSinPhi = 0.999f,
const float_m &mask = float_m(
true),
1474 const float_v &chi2Cut = 10e10f);
1476 const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
1479 static float_v
BetheBlochGeant(
const float_v &bg,
const float_v &kp0 = 2.33f,
const float_v &kp1 = 0.20f,
const float_v &kp2 = 3.00f,
const float_v &kp3 = 173e-9f,
1480 const float_v &kp4 = 0.49848f);
1492 float_m
FilterVtx(
const float_v &xV,
const float_v &yV,
const CAX1X2MeasurementInfo &info, float_v &extrDx, float_v &extrDy, float_v J[],
const float_m &active = float_m(
true));
1493 float_m
TransportJ0ToX0(
const float_v &x0,
const float_v &cBz, float_v &extrDy, float_v &extrDz, float_v J[],
const float_m &active = float_m(
true));
1497 float_m
Filter(
const FTSCAHitV &hit,
const PndFTSCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
1500 float_m
Filter(
const FTSCAHit &hit,
const PndFTSCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
1506 float_v fSignCosPhi;
1527 debugKF() <<
"Start TransportToX0(" << x <<
", " << _mask <<
")\n" << *
this << std::endl;
1529 const float_v &ey = sinPhi0;
1530 const float_v &dx = x -
X();
1531 const float_v &exi = float_v(Vc::One) *
CAMath::RSqrt(float_v(Vc::One) - ey * ey);
1533 const float_v &dxBz = dx * Bz;
1534 const float_v &dS = dx * exi;
1535 const float_v &h2 = dS * exi * exi;
1536 const float_v &h4 = .5f * h2 * dxBz;
1539 std::cout <<
" TrTo-sinPhi0 = " << sinPhi0 << std::endl;
1543 const float_v &sinPhi =
SinPhi() + dxBz *
QPt();
1546 std::cout <<
" TrTo-sinPhi = " << sinPhi << std::endl;
1548 float_m mask = _mask &&
CAMath::Abs(exi) <= 1.e4f;
1549 mask &= ((
CAMath::Abs(sinPhi) <= maxSinPhi) || (maxSinPhi <= 0.f));
1552 fP[0](mask) += dS * ey + h2 * (
SinPhi() - ey) + h4 *
QPt();
1553 fP[1](mask) += dS *
DzDs();
1554 fP[2](mask) = sinPhi;
1558 const float_v c20 = fC[3];
1560 const float_v c22 = fC[5];
1562 const float_v c31 = fC[7];
1564 const float_v c33 = fC[9];
1565 const float_v c40 = fC[10];
1567 const float_v c42 = fC[12];
1569 const float_v c44 = fC[14];
1571 const float_v two(2.f);
1573 fC[0](mask) += h2 * h2 * c22 + h4 * h4 * c44 + two * (h2 * c20 + h4 * (c40 + h2 * c42));
1576 fC[2](mask) += dS * (two * c31 + dS * c33);
1578 fC[3](mask) += h2 * c22 + h4 * c42 + dxBz * (c40 + h2 * c42 + h4 * c44);
1580 const float_v &dxBz_c44 = dxBz * c44;
1581 fC[12](mask) += dxBz_c44;
1582 fC[5](mask) += dxBz * (two * c42 + dxBz_c44);
1585 fC[7](mask) += dS * c33;
1589 fC[10](mask) += h2 * c42 + h4 * c44;
1594 debugKF() << mask <<
"\n" << *
this << std::endl;
1601 #define VALGRIND_CHECK_VALUE_IS_DEFINED(mask) 1602 #define VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED(v, k) 1603 #define VALGRIND_CHECK_MEM_IS_DEFINED(v, k) ; 1604 #define VALGRIND_CHECK_MEM_IS_ADDRESSABLE(v, k) ; 1606 #include <valgrind/memcheck.h> 1607 #define VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED(v, k) \ 1609 __typeof__(v + v) tmp(v); \ 1611 VALGRIND_CHECK_VALUE_IS_DEFINED(tmp); \ 1854 if ((abs(alpha) < 1e-6f || !mask).isFull())
1860 const float_v cosPhi = cP * cA + sP * sA;
1861 const float_v sinPhi = -cP * sA + sP * cA;
1865 mReturn &= abs(alpha) < 3.1415f * 0.25f;
1867 const float_v j0 = cP / cosPhi;
1868 const float_v j2 = cosPhi / cP;
1870 SetX(x * cA + y * sA, mReturn);
1871 SetY(-x * sA + y * cA, mReturn);
1882 fC[0](mReturn) *= j0 * j0;
1883 fC[1](mReturn) *= j0;
1884 fC[3](mReturn) *= j0;
1885 fC[6](mReturn) *= j0;
1886 fC[10](mReturn) *= j0;
1888 fC[3](mReturn) *= j2;
1889 fC[4](mReturn) *= j2;
1890 fC[5](mReturn) *= j2 * j2;
1891 fC[8](mReturn) *= j2;
1892 fC[12](mReturn) *= j2;
1894 fAlpha(mReturn) +=
alpha;
1902 if ((abs(alpha) < 1e-6f || !mask).isFull())
1908 x(mask) = (
X() * cA +
Y() * sA);
1909 y(mask) = (-
X() * sA +
Y() * cA);
1916 float_v zeta0, zeta1, S00, S10, S11, si;
1917 float_v F00, F10, F20, F30, F40, F01, F11, F21, F31, F41;
1918 float_v K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
1919 float_v &c00 = fC[0];
1920 float_v &c10 = fC[1];
1921 float_v &c11 = fC[2];
1922 float_v &c20 = fC[3];
1923 float_v &c21 = fC[4];
1924 float_v &c22 = fC[5];
1925 float_v &c30 = fC[6];
1926 float_v &c31 = fC[7];
1927 float_v &c32 = fC[8];
1928 float_v &c33 = fC[9];
1929 float_v &c40 = fC[10];
1930 float_v &c41 = fC[11];
1931 float_v &c42 = fC[12];
1932 float_v &c43 = fC[13];
1933 float_v &c44 = fC[14];
1935 zeta0 =
Y() + extrDy - yV;
1936 zeta1 =
Z() + extrDz - zV;
1953 S00 = info.
C00() + F00 + J[0] * F20 + J[1] * F30 + J[2] * F40;
1954 S10 = info.
C10() + F10 + J[3] * F20 + J[4] * F30 + J[5] * F40;
1955 S11 = info.
C11() + F11 + J[3] * F21 + J[4] * F31 + J[5] * F41;
1957 si = 1.f / (S00 * S11 - S10 * S10);
1958 float_v S00tmp = S00;
1963 fChi2(active) += zeta0 * zeta0 * S00 + 2.f * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
1965 K00 = F00 * S00 + F01 * S10;
1966 K01 = F00 * S10 + F01 * S11;
1967 K10 = F10 * S00 + F11 * S10;
1968 K11 = F10 * S10 + F11 * S11;
1969 K20 = F20 * S00 + F21 * S10;
1970 K21 = F20 * S10 + F21 * S11;
1971 K30 = F30 * S00 + F31 * S10;
1972 K31 = F30 * S10 + F31 * S11;
1973 K40 = F40 * S00 + F41 * S10;
1974 K41 = F40 * S10 + F41 * S11;
1976 fP[0](active) -= K00 * zeta0 + K01 * zeta1;
1977 fP[1](active) -= K10 * zeta0 + K11 * zeta1;
1978 fP[2](active) -= K20 * zeta0 + K21 * zeta1;
1979 fP[3](active) -= K30 * zeta0 + K31 * zeta1;
1980 fP[4](active) -= K40 * zeta0 + K41 * zeta1;
1982 c00(active) -= (K00 * F00 + K01 * F01);
1983 c10(active) -= (K10 * F00 + K11 * F01);
1984 c11(active) -= (K10 * F10 + K11 * F11);
1985 c20(active) = -(K20 * F00 + K21 * F01);
1986 c21(active) = -(K20 * F10 + K21 * F11);
1987 c22(active) -= (K20 * F20 + K21 * F21);
1988 c30(active) = -(K30 * F00 + K31 * F01);
1989 c31(active) = -(K30 * F10 + K31 * F11);
1990 c32(active) = -(K30 * F20 + K31 * F21);
1991 c33(active) -= (K30 * F30 + K31 * F31);
1992 c40(active) = -(K40 * F00 + K41 * F01);
1993 c41(active) = -(K40 * F10 + K41 * F11);
1994 c42(active) = -(K40 * F20 + K41 * F21);
1995 c43(active) = -(K40 * F30 + K41 * F31);
1996 c44(active) -= (K40 * F40 + K41 * F41);
2003 const float_v &ey =
SinPhi();
2004 const float_v &dx = x -
X();
2005 const float_v &exi =
CAMath::RSqrt(float_v(Vc::One) - ey * ey);
2007 const float_v &dxBz = dx * cBz;
2008 const float_v &dS = dx * exi;
2009 const float_v &h2 = dS * exi * exi;
2010 const float_v &h4 = .5f * h2 * dxBz;
2012 float_m mask = active &&
CAMath::Abs(exi) <= 1.e4f;
2014 extrDy(active) = dS * ey;
2015 extrDz(active) = dS *
DzDs();
2028 #endif // !PANDA_FTS
float_v SignCosPhi() const
void SetAngle(const float_v &v)
void SetZ(const float_v &v)
basic_istream< char, char_traits< char > > istream
void SetQPt(const float_v &v)
void SetCov(int i, const float_v &v)
void RotateXY(float_v alpha, float_v &x, float_v &y, float_v &sin, const float_m &mask=float_m(true)) const
void SetAngle(const float_v &v, const float_m &m)
void InitByHit(const FTSCAHitV &hit, const PndFTSCAParam ¶m, const float_v &dQMom)
void SetY(const float_v &v)
void SetX(const float_v &v)
float_m CorrectForMeanMaterial(const float_v &xOverX0, const float_v &xTimesRho, const PndFTSCATrackFitParam &par, const float_m &_mask)
float_v GetSinPhi() const
float_v GetKappa(const float_v &Bz) const
void SetDzDs(const float_v &v)
friend F32vec4 sqrt(const F32vec4 &a)
void GetDCAPoint(const float_v &x, const float_v &y, const float_v &z, float_v *px, float_v *py, float_v *pz, const float_v &Bz) const
static const UInt_t success
static T Sqrt(const T &x)
void SetNDF(const int_v &v)
float_v GetCosPhi() const
void SetSignCosPhi(const float_v &v)
float_v GetDist2(const PndFTSCATrackParamVector &t) const
friend F32vec4 sin(const F32vec4 &a)
friend F32vec4 log(const F32vec4 &a)
void SetChi2(const float_v &v)
void SetTrackParamOne(int iV, const PndFTSCATrackParamVector ¶m, int iVa)
void SetNDF(const int_v &v, const int_m &m)
void SetSinPhi(const float_v &v)
const float_v & C00() const
float_v QMomentum() const
static float_v BetheBlochGeant(const float_v &bg, const float_v &kp0=2.33f, const float_v &kp1=0.20f, const float_v &kp2=3.00f, const float_v &kp3=173e-9f, const float_v &kp4=0.49848f)
static float_v BetheBlochSolid(const float_v &bg)
void SetZ(const float_v &v, const float_m &m)
float_m Rotate(const float_v &alpha, PndFTSCATrackLinearisationVector &t0, const float maxSinPhi=.999f, const float_m &mask=float_m(true))
void SetSinPhi(const float_v &v, const float_m &m)
float_m AddTarget(const FTSCATarget &target, const float_m &mask=float_m(true))
void SetErr2QPt(float_v v)
float_m FilterVtx(const float_v &xV, const float_v &yV, const CAX1X2MeasurementInfo &info, float_v &extrDx, float_v &extrDy, float_v J[], const float_m &active=float_m(true))
static T RSqrt(const T &x)
void SetCov(int i, const float_v &v, const float_m &m)
void SetChi2(const float_v &v, const float_m &m)
float_v Err2QMomentum() const
float_m Transport(const int_v &ista, const PndFTSCAParam ¶m, const float_m &mask=float_m(true))
void InitDirection(float_v r0, float_v r1, float_v r2)
const float_v & Par(int i) const
PndFTSCATrackParamVector()
float_m TransportJ0ToX0(const float_v &x0, const float_v &cBz, float_v &extrDy, float_v &extrDz, float_v J[], const float_m &active=float_m(true))
const float * Par() const
const float * Cov() const
void SetY(const float_v &v, const float_m &m)
void SetQPt(const float_v &v, const float_m &m)
void CalculateFitParameters(PndFTSCATrackFitParam &par, const float_v &mass=0.13957f)
float_v Err2SinPhi() const
void InitCovMatrix(float_v d2QMom=0.f)
friend std::istream & operator>>(std::istream &, PndFTSCATrackParamVector &)
float_v GetS(const float_v &x, const float_v &y, const float_v &Bz) const
float_v GetDistXZ2(const PndFTSCATrackParamVector &t) const
const float_v & C10() const
float_v GetCosPhiPositive() const
float_m TransportToX0WithMaterial(const float_v &x, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi=.999f)
float_m FilterWithMaterial(const float_v &y, const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z, float maxSinPhi=0.999f, const float_m &mask=float_m(true), const int_v &hitNDF=int_v(2), const float_v &chi2Cut=10e10f)
PndFTSCATrackParamVector TrackParamVector
float_v GetSignCosPhi() const
void SetQMomentum(const float_v &v)
static float_v ApproximateBetheBloch(const float_v &beta2)
const float_v & Cov(int i) const
float_m TransportToX0(const float_v &x, const float_v &Bz, const float maxSinPhi=.999f, const float_m &mask=float_m(true))
void SetSignCosPhi(const float_v &v, const float_m &m)
void SetPar(int i, const float_v &v)
basic_ostream< char, char_traits< char > > ostream
void InitByTarget(const FTSCATarget &target)
void SetDzDs(const float_v &v, const float_m &m)
void SetTrackParam(const PndFTSCATrackParamVector ¶m, const float_m &m=float_m(true))
const float_v & C11() const
friend std::ostream & operator<<(std::ostream &, const PndFTSCATrackParamVector &)
void SetX(const float_v &v, const float_m &m)
void ConvertTrackParamToVector(PndFTSCATrackParam t0[float_v::Size], int nTracksV)
PndFTSCANoDebugStream & debugKF()
static float_v BetheBlochGas(const float_v &bg)
float_m Filter(const FTSCAHitV &hit, const PndFTSCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f)
void SetPar(int i, const float_v &v, const float_m &m)