10 #ifndef PNDFTSCATRACKPARAMVECTOR_H 11 #define PNDFTSCATRACKPARAMVECTOR_H 24 #include "FairField.h" 25 #include "FairRunAna.h" 47 : 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),
48 fC40(0.
f), fC41(0.
f), fC42(0.
f), fC43(0.
f), fC44(0.
f), fChi2(0.
f), fNDF(0.
f)
50 fZB[0] = fZB[1] = 10e10;
56 for (
int i = 0;
i < 5;
i++)
58 for (
int i = 0;
i < 15;
i++)
61 fChi2(
m) = param.
Chi2();
63 fNDF(static_cast<int_m>(
m)) = param.
NDF();
64 fAlpha(static_cast<int_m>(
m)) = param.
Angle();
69 for (
int i = 0;
i < 5;
i++)
71 for (
int i = 0;
i < 15;
i++)
73 fX[iV] = param.
X()[iVa];
74 fZ[iV] = param.
Z()[iVa];
75 fChi2[iV] = param.
Chi2()[iVa];
76 fNDF[iV] = param.
NDF()[iVa];
77 fAlpha[iV] = param.
Angle()[iVa];
84 cout <<
"CovMat " << endl;
86 cout <<
Cov(0) << endl;
87 cout <<
Cov(1) <<
" " <<
Cov(2) << endl;
88 cout <<
Cov(3) <<
" " <<
Cov(4) <<
" " <<
Cov(5) << endl;
89 cout <<
Cov(6) <<
" " <<
Cov(7) <<
" " <<
Cov(8) <<
" " <<
Cov(9) << endl;
90 cout <<
Cov(10) <<
" " <<
Cov(11) <<
" " <<
Cov(12) <<
" " <<
Cov(13) <<
" " <<
Cov(14) << endl;
104 float_m mask = (r0 > 0.f);
105 float_v tx(Vc::Zero);
107 float_v ty(Vc::Zero);
113 float_v
X()
const {
return fX; }
114 float_v
Y()
const {
return fY; }
115 float_v
Z()
const {
return fZ; }
116 float_v Tx()
const {
return fTx; }
117 float_v Ty()
const {
return fTy; }
118 float_v QP()
const {
return fQP; }
120 float_v Bx()
const {
return fBx; }
121 float_v By()
const {
return fBy; }
123 float_v
Chi2()
const {
return fChi2; }
124 int_v
NDF()
const {
return fNDF; }
126 float_v
Angle()
const {
return fAlpha; }
128 float_v
X0()
const {
return Z(); }
129 float_v
X1()
const {
return X(); }
130 float_v
X2()
const {
return Y(); }
131 float_v
Tx1()
const {
return Tx(); }
132 float_v
Tx2()
const {
return Ty(); }
133 float_v
QMomentum()
const {
return QP(); }
136 const float_v tx12 =
Tx1() *
Tx1();
137 return sqrt(tx12 / (1.
f + tx12));
140 const float_v &
Par(
int i)
const 154 const float_v &
Cov(
int i)
const 167 case 10:
return fC40;
168 case 11:
return fC41;
169 case 12:
return fC42;
170 case 13:
return fC43;
171 case 14:
return fC44;
177 float_v
Err2X1()
const {
return Err2X(); }
180 float_v Err2X()
const {
return fC00; }
181 float_v
Err2Y()
const {
return fC11; }
182 float_v Err2QP()
const {
return fC44; }
185 void SetX(
const float_v &
v) { fX =
v; }
186 void SetY(
const float_v &
v) { fY =
v; }
187 void SetZ(
const float_v &
v) { fZ =
v; }
188 void SetTx(
const float_v &
v) { fTx =
v; }
189 void SetTy(
const float_v &
v) { fTy =
v; }
190 void SetQP(
const float_v &
v) { fQP =
v; }
192 void SetBx(
const float_v &
v) { fBx =
v; }
193 void SetBy(
const float_v &
v) { fBy =
v; }
195 void SetChi2(
const float_v &
v) { fChi2 =
v; }
197 void SetNDF(
const int_v &
v) { fNDF =
v; }
199 void SetAngle(
const float_v &
v) { fAlpha =
v; }
204 case 0: fX =
v;
break;
205 case 1: fY =
v;
break;
206 case 2: fTx =
v;
break;
207 case 3: fTy =
v;
break;
208 case 4: fQP =
v;
break;
211 void SetCov(
int i, float_v v)
214 case 0: fC00 =
v;
break;
215 case 1: fC10 =
v;
break;
216 case 2: fC11 =
v;
break;
217 case 3: fC20 =
v;
break;
218 case 4: fC21 =
v;
break;
219 case 5: fC22 =
v;
break;
220 case 6: fC30 =
v;
break;
221 case 7: fC31 =
v;
break;
222 case 8: fC32 =
v;
break;
223 case 9: fC33 =
v;
break;
224 case 10: fC40 =
v;
break;
225 case 11: fC41 =
v;
break;
226 case 12: fC42 =
v;
break;
227 case 13: fC43 =
v;
break;
228 case 14: fC44 =
v;
break;
232 void SetDirection(
bool b) { fDirection = b; }
260 case 10:
return fC40;
261 case 11:
return fC41;
262 case 12:
return fC42;
263 case 13:
return fC43;
264 case 14:
return fC44;
270 void SetX(
const float_v &v,
const float_m &
m) { fX(m) =
v; }
271 void SetY(
const float_v &v,
const float_m &
m) { fY(m) =
v; }
272 void SetZ(
const float_v &v,
const float_m &
m) { fZ(m) =
v; }
273 void SetTx(
const float_v &v,
const float_m &
m) { fTx(m) =
v; }
274 void SetTy(
const float_v &v,
const float_m &
m) { fTy(m) =
v; }
275 void SetQP(
const float_v &v,
const float_m &
m) { fQP(m) =
v; }
276 void SetQMomentum(
const float_v &v,
const float_m &
m) { fQP(m) =
v; }
278 void SetChi2(
const float_v &v,
const float_m &
m) { fChi2(m) =
v; }
279 void SetNDF(
const int_v &v,
const int_m &
m) { fNDF(m) =
v; }
281 void SetField(
int i,
const CAFieldValue &b,
const float_v &zb)
290 void SetCovX12(float_v v00, float_v v10, float_v v11)
303 float_m TransportByLine(
const FTSCAHitV &hit,
const PndFTSCAParam ¶m,
const float_m &mask = float_m(
true));
308 float_m
Filter(
const FTSCAHit &hit,
const PndFTSCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
317 float_m RK4TransportToX0(
const float_v &x0_out,
const L1FieldRegion &F,
const float_v &qp0,
const float_m &mask = float_m(
true));
318 float_m TransportToX0Line(
const float_v &x0,
const float_m &mask = float_m(
true));
319 float_m PassMaterial(
const L1MaterialInfo &info,
const float_v &qp0,
const float_m &mask = float_m(
true));
320 void EnergyLossCorrection(
const float_v &mass2,
const float_v &radThick, float_v &qp0, float_v direction,
const float_m &mask);
323 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);
325 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));
327 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));
329 float_v fX, fY, fTx, fTy, fQP, fZ, fC00, fC10, fC11, fC20, fC21, fC22, fC30, fC31, fC32, fC33, fC40, fC41, fC42, fC43, fC44;
345 inline float_m PndFTSCATrackParamVector::TransportToX0Line(
const float_v &x0_out,
const float_m &mask)
347 float_v dz = (x0_out - fZ);
350 fX(mask) += fTx * dz;
351 fY(mask) += fTy * dz;
354 const float_v dzC32_in = dz * fC32;
356 fC21(mask) += dzC32_in;
357 fC10(mask) += dz * (fC21 + fC30);
359 const float_v C20_in = fC20;
361 fC20(mask) += dz * fC22;
362 fC00(mask) += dz * (fC20 + C20_in);
364 const float_v C31_in = fC31;
366 fC31(mask) += dz * fC33;
367 fC11(mask) += dz * (fC31 + C31_in);
368 fC30(mask) += dzC32_in;
370 fC40(mask) += dz * fC42;
371 fC41(mask) += dz * fC43;
377 const float_v &x0,
const float_v &y0,
const float_v &r,
const FTSCAStripInfoVector &info, float_v err2,
const float_m &active,
387 success &= (err2 > 1.e-8
f);
391 float_v h0(Vc::Zero);
392 float_v h1(Vc::Zero);
393 h0(active) = info.
cos;
394 h1(active) = info.
sin;
400 const float_v tx = h0 * fTx + h1 * fTy;
406 float_v rCorrection =
sqrt(1.
f + tx * tx);
408 float_v Diff = h0 * (fX - x0) + h1 * (fY - y0);
409 float_v zeta_1, zeta_2;
410 zeta_1 = h0 * (fX - x0) + h1 * (fY - y0) - r * rCorrection;
411 zeta_2 = h0 * (fX - x0) + h1 * (fY - y0) + r * rCorrection;
413 for (
int iDiff = 0; iDiff < 4; iDiff++) {
414 float Diff_f = (float)Diff[iDiff];
417 zeta[iDiff] = zeta_1[iDiff];
419 zeta[iDiff] = zeta_2[iDiff];
427 err2[0] = err2[0] + r[0] * r[0];
428 err2 *= rCorrection * rCorrection;
430 float_v wi, zetawi, HCH;
431 float_v F0, F1, F2, F3, F4;
432 float_v K1, K2, K3, K4;
438 F0 = h0 * fC00 + h1 * fC10;
439 F1 = h0 * fC10 + h1 * fC11;
442 HCH = (h0 * h0 * fC00 + 2.f * h0 * h1 * fC10) + h1 * h1 * fC11;
444 F2 = h0 * fC20 + h1 * fC21;
445 F3 = h0 * fC30 + h1 * fC31;
446 F4 = h0 * fC40 + h1 * fC41;
448 float_v dChi2(Vc::Zero);
450 cout<<
"we don't have to be here for now \n";
451 const float_m mask = success && (HCH > err2 * 16.f);
454 zetawi(mask) = zeta *wi;
455 dChi2(mask) += (zeta * zetawi);
458 wi = 1.f / (err2 + HCH);
460 dChi2(success) += zeta * zetawi;
473 fX(success) -= F0 * zetawi;
474 fY(success) -= F1 * zetawi;
475 fTx(success) -= F2 * zetawi;
476 fTy(success) -= F3 * zetawi;
477 fQP(success) -= F4 * zetawi;
479 fC00(success) -= F0 * F0 * wi;
480 fC10(success) -= K1 * F0;
481 fC11(success) -= K1 * F1;
482 fC20(success) -= K2 * F0;
483 fC21(success) -= K2 * F1;
484 fC22(success) -= K2 * F2;
485 fC30(success) -= K3 * F0;
486 fC31(success) -= K3 * F1;
487 fC32(success) -= K3 * F2;
488 fC33(success) -= K3 * F3;
489 fC40(success) -= K4 * F0;
490 fC41(success) -= K4 * F1;
491 fC42(success) -= K4 * F2;
492 fC43(success) -= K4 * F3;
493 fC44(success) -= K4 * F4;
495 fNDF(static_cast<int_m>(success)) += 1;
502 float_m active = mask;
506 active &= PassMaterial(material, qp0, active);
507 const float_v mass2 = 0.13957f * 0.13957f;
508 float_v direction = -1.f;
512 EnergyLossCorrection(mass2, material.
RadThick, qp0, direction, active);
517 inline float_m PndFTSCATrackParamVector::RK4TransportToX0(
const float_v &x0_out,
const L1FieldRegion & ,
const float_v & ,
const float_m &mask)
541 const float_v fC = 0.000299792458f;
556 float_v Ax[4], Ay[4];
557 float_v dAx_dtx[4], dAy_dtx[4], dAx_dty[4], dAy_dty[4];
560 float_v h = x0_out - fZ;
563 float_v hCqp = h * fC * xIn[4];
572 for (
unsigned int iStep = 0; iStep < 4; iStep++) {
575 x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1];
576 x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1];
577 x[2] = xIn[2] + coef[iStep] * k[2][iStep - 1];
578 x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1];
581 float_v bx(0.
f), by(0.
f), bz(0.
f);
584 for (
int xxx = 0; xxx < float_v::Size; xxx++) {
591 p[2] = fZ[xxx] + coef[iStep][xxx] * h[xxx];
595 FairRunAna::Instance()->GetField()->Field(p, b);
604 float_v txtx = tx * tx;
605 float_v tyty = ty * ty;
606 float_v txty = tx * ty;
607 float_v txtxtyty1 = 1.f + txtx + tyty;
608 float_v t1 =
sqrt(txtxtyty1);
609 float_v t2 = 1.f / txtxtyty1;
611 Ax[iStep] = (txty * bx + ty * bz - (1.f + txtx) * by) * t1;
612 Ay[iStep] = (-txty * by - tx * bz + (1.f + tyty) * bx) * t1;
614 dAx_dtx[iStep] = Ax[iStep] * tx * t2 + (ty * bx - 2.f * tx * by) * t1;
615 dAx_dty[iStep] = Ax[iStep] * ty * t2 + (tx * bx + bz) * t1;
616 dAy_dtx[iStep] = Ay[iStep] * tx * t2 + (-ty * by - bz) * t1;
617 dAy_dty[iStep] = Ay[iStep] * ty * t2 + (-tx * by + 2.f * ty * bx) * t1;
619 k[0][iStep] = tx * h;
620 k[1][iStep] = ty * h;
621 k[2][iStep] = Ax[iStep] * hCqp;
622 k[3][iStep] = Ay[iStep] * hCqp;
628 xOut[0] = xIn[0] + k[0][0] / 6.f + k[0][1] / 3.f + k[0][2] / 3.f + k[0][3] / 6.f;
629 xOut[1] = xIn[1] + k[1][0] / 6.f + k[1][1] / 3.f + k[1][2] / 3.f + k[1][3] / 6.f;
630 xOut[2] = xIn[2] + k[2][0] / 6.f + k[2][1] / 3.f + k[2][2] / 3.f + k[2][3] / 6.f;
631 xOut[3] = xIn[3] + k[3][0] / 6.f + k[3][1] / 3.f + k[3][2] / 3.f + k[3][3] / 6.f;
662 for (
unsigned int iStep = 0; iStep < 4; iStep++) {
664 x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1];
665 x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1];
666 x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1];
669 k[0][iStep] = x[2] * h;
670 k[1][iStep] = x[3] * h;
672 k[3][iStep] = (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]) * hCqp;
675 Fmat[2] = x0[0] + k[0][0] / 6.f + k[0][1] / 3.f + k[0][2] / 3.f + k[0][3] / 6.f;
677 Fmat[7] = x0[1] + k[1][0] / 6.f + k[1][1] / 3.f + k[1][2] / 3.f + k[1][3] / 6.f;
680 Fmat[17] = x0[3] + k[3][0] / 6.f + k[3][1] / 3.f + k[3][2] / 3.f + k[3][3] / 6.f;
689 for (
unsigned int iStep = 0; iStep < 4; iStep++) {
691 x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1];
692 x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1];
693 x[2] = xIn[2] + coef[iStep] * k[2][iStep - 1];
696 k[0][iStep] = x[2] * h;
697 k[1][iStep] = x[3] * h;
698 k[2][iStep] = (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]) * hCqp;
702 Fmat[3] = x0[0] + k[0][0] / 6.f + k[0][1] / 3.f + k[0][2] / 3.f + k[0][3] / 6.f;
704 Fmat[8] = x0[1] + k[1][0] / 6.f + k[1][1] / 3.f + k[1][2] / 3.f + k[1][3] / 6.f;
706 Fmat[13] = x0[2] + k[2][0] / 6.f + k[2][1] / 3.f + k[2][2] / 3.f + k[2][3] / 6.f;
716 for (
unsigned int iStep = 0; iStep < 4; iStep++) {
718 x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1];
719 x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1];
720 x[2] = xIn[2] + coef[iStep] * k[2][iStep - 1];
721 x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1];
724 k[0][iStep] = x[2] * h;
725 k[1][iStep] = x[3] * h;
726 k[2][iStep] = Ax[iStep] * hC + hCqp * (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]);
727 k[3][iStep] = Ay[iStep] * hC + hCqp * (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]);
730 Fmat[4] = x0[0] + k[0][0] / 6.f + k[0][1] / 3.f + k[0][2] / 3.f + k[0][3] / 6.f;
732 Fmat[9] = x0[1] + k[1][0] / 6.f + k[1][1] / 3.f + k[1][2] / 3.f + k[1][3] / 6.f;
734 Fmat[14] = x0[2] + k[2][0] / 6.f + k[2][1] / 3.f + k[2][2] / 3.f + k[2][3] / 6.f;
736 Fmat[19] = x[3] + k[3][0] / 6.f + k[3][1] / 3.f + k[3][2] / 3.f + k[3][3] / 6.f;
742 float_v A = fC20 + Fmat[2] * fC22 + Fmat[3] * fC32 + Fmat[4] * fC42;
743 float_v B = fC30 + Fmat[2] * fC32 + Fmat[3] * fC33 + Fmat[4] * fC43;
744 float_v C = fC40 + Fmat[2] * fC42 + Fmat[3] * fC43 + Fmat[4] * fC44;
746 float_v D = fC21 + Fmat[7] * fC22 + Fmat[8] * fC32 + Fmat[9] * fC42;
747 float_v E = fC31 + Fmat[7] * fC32 + Fmat[8] * fC33 + Fmat[9] * fC43;
748 float_v G = fC41 + Fmat[7] * fC42 + Fmat[8] * fC43 + Fmat[9] * fC44;
750 float_v H = fC22 + Fmat[13] * fC32 + Fmat[14] * fC42;
751 float_v I = fC32 + Fmat[13] * fC33 + Fmat[14] * fC43;
752 float_v J = fC42 + Fmat[13] * fC43 + Fmat[14] * fC44;
754 float_v K = fC43 + Fmat[17] * fC42 + Fmat[19] * fC44;
756 fC00(mask) = fC00 + Fmat[2] * fC20 + Fmat[3] * fC30 + Fmat[4] * fC40 + A * Fmat[2] + B * Fmat[3] + C * Fmat[4];
757 fC10(mask) = fC10 + Fmat[2] * fC21 + Fmat[3] * fC31 + Fmat[4] * fC41 + A * Fmat[7] + B * Fmat[8] + C * Fmat[9];
758 fC20(mask) = A + B * Fmat[13] + C * Fmat[14];
759 fC30(mask) = B + A * Fmat[17] + C * Fmat[19];
762 fC11(mask) = fC11 + Fmat[7] * fC21 + Fmat[8] * fC31 + Fmat[9] * fC41 + D * Fmat[7] + E * Fmat[8] + G * Fmat[9];
763 fC21(mask) = D + E * Fmat[13] + G * Fmat[14];
764 fC31(mask) = E + D * Fmat[17] + G * Fmat[19];
767 fC22(mask) = H + I * Fmat[13] + J * Fmat[14];
768 fC32(mask) = I + H * Fmat[17] + J * Fmat[19];
771 fC33(mask) = fC33 + Fmat[17] * fC32 + Fmat[19] * fC43 + (Fmat[17] * fC22 + fC32 + Fmat[19] * fC42) * Fmat[17] + K * Fmat[19];
788 const float_v c_light = 0.000299792458f;
793 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,
796 float_v dz(Vc::Zero);
797 dz(mask) = (x0_out - fZ);
799 const float_v dz2 = dz * dz;
800 const float_v dz3 = dz2 * dz;
803 const float_v x = fTx;
804 const float_v y = fTy;
805 const float_v xx = x * x;
806 const float_v xy = x * y;
807 const float_v yy = y * y;
808 const float_v y2 = y * c2;
809 const float_v x2 = x * c2;
810 const float_v x4 = x * c4;
811 const float_v xx31 = xx * c3 + c1;
812 const float_v xx159 = xx * c15 + c9;
814 const float_v Ay = -xx - c1;
815 const float_v Ayy = x * (xx * c3 + c3);
816 const float_v Ayz = -c2 * xy;
817 const float_v Ayyy = -(c15 * xx * xx + c18 * xx + c3);
819 const float_v Ayy_fX = c3 * xx31;
820 const float_v Ayyy_fX = -x4 * xx159;
822 const float_v bx = yy + c1;
823 const float_v Byy = y * xx31;
824 const float_v Byz = c2 * xx + c1;
825 const float_v Byyy = -xy * xx159;
827 const float_v Byy_fX = c6 * xy;
828 const float_v Byyy_fX = -y * (c45 * xx + c9);
829 const float_v Byyy_fY = -x * xx159;
833 const float_v t2 = c1 + xx + yy;
834 const float_v t =
sqrt(t2);
835 const float_v h = qp0 * c_light;
836 const float_v ht = h * t;
839 const float_v ddz = fZ - F.
z0;
840 float_v Fx0 = F.
cx0 + F.
cx1 * ddz + F.
cx2 * ddz * ddz;
841 float_v Fx1 = (F.
cx1 + c2 * F.
cx2 * ddz) * dz;
842 float_v Fx2 = F.
cx2 * dz2;
843 float_v Fy0 = F.
cy0 + F.
cy1 * ddz + F.
cy2 * ddz * ddz;
844 float_v Fy1 = (F.
cy1 + c2 * F.
cy2 * ddz) * dz;
845 float_v Fy2 = F.
cy2 * dz2;
846 float_v Fz0 = F.
cz0 + F.
cz1 * ddz + F.
cz2 * ddz * ddz;
847 float_v Fz1 = (F.
cz1 + c2 * F.
cz2 * ddz) * dz;
848 float_v Fz2 = F.
cz2 * dz2;
850 const float_v sx = (Fx0 + Fx1 * c2i + Fx2 * c3i);
851 const float_v sy = (Fy0 + Fy1 * c2i + Fy2 * c3i);
852 const float_v sz = (Fz0 + Fz1 * c2i + Fz2 * c3i);
854 const float_v Sx = (Fx0 * c2i + Fx1 * c6i + Fx2 * c12i);
855 const float_v Sy = (Fy0 * c2i + Fy1 * c6i + Fy2 * c12i);
856 const float_v Sz = (Fz0 * c2i + Fz1 * c6i + Fz2 * c12i);
860 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,
861 c20 = 2.f * 45.f * d, c21 = 2.f * 2.f * 9.f * d, c22 = 2.f * 2.f * 5.f * d;
862 syz = Fy0 * (c00 * Fz0 + c01 * Fz1 + c02 * Fz2) + Fy1 * (c10 * Fz0 + c11 * Fz1 + c12 * Fz2) + Fy2 * (c20 * Fz0 + c21 * Fz1 + c22 * Fz2);
867 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,
868 c20 = 2.f * 63.f * d, c21 = 2.f * 21.f * d, c22 = 2.f * 10.f * d;
869 Syz = Fy0 * (c00 * Fz0 + c01 * Fz1 + c02 * Fz2) + Fy1 * (c10 * Fz0 + c11 * Fz1 + c12 * Fz2) + Fy2 * (c20 * Fz0 + c21 * Fz1 + c22 * Fz2);
872 const float_v syy = sy * sy * c2i;
873 const float_v syyy = syy * sy * c3i;
877 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;
878 Syy = Fy0 * (c00 * Fy0 + c01 * Fy1 + c02 * Fy2) + Fy1 * (c03 * Fy1 + c04 * Fy2) + c05 * Fy2 * Fy2;
883 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,
884 c112 = 945 * d, c122 = 560 * d, c222 = 112 * d;
885 const float_v Fy22 = Fy2 * Fy2;
886 Syyy = Fy0 * (Fy0 * (c000 * Fy0 + c001 * Fy1 + c002 * Fy2) + Fy1 * (c011 * Fy1 + c012 * Fy2) + c022 * Fy22) + Fy1 * (Fy1 * (c111 * Fy1 + c112 * Fy2) + c122 * Fy22) +
890 const float_v sA1 = sx * xy + sy * Ay + sz * y;
891 const float_v sA1_fX = sx * y - sy * x2;
892 const float_v sA1_fY = sx * x + sz;
894 const float_v sB1 = sx * bx - sy * xy - sz * x;
895 const float_v sB1_fX = -sy * y - sz;
896 const float_v sB1_fY = sx * y2 - sy * x;
898 const float_v SA1 = Sx * xy + Sy * Ay + Sz * y;
899 const float_v SA1_fX = Sx * y - Sy * x2;
900 const float_v SA1_fY = Sx * x + Sz;
902 const float_v SB1 = Sx * bx - Sy * xy - Sz * x;
903 const float_v SB1_fX = -Sy * y - Sz;
904 const float_v SB1_fY = Sx * y2 - Sy * x;
906 const float_v sA2 = syy * Ayy + syz * Ayz;
907 const float_v sA2_fX = syy * Ayy_fX - syz * y2;
908 const float_v sA2_fY = -syz * x2;
909 const float_v sB2 = syy * Byy + syz * Byz;
910 const float_v sB2_fX = syy * Byy_fX + syz * x4;
911 const float_v sB2_fY = syy * xx31;
913 const float_v SA2 = Syy * Ayy + Syz * Ayz;
914 const float_v SA2_fX = Syy * Ayy_fX - Syz * y2;
915 const float_v SA2_fY = -Syz * x2;
916 const float_v SB2 = Syy * Byy + Syz * Byz;
917 const float_v SB2_fX = Syy * Byy_fX + Syz * x4;
918 const float_v SB2_fY = Syy * xx31;
920 const float_v sA3 = syyy * Ayyy;
921 const float_v sA3_fX = syyy * Ayyy_fX;
922 const float_v sB3 = syyy * Byyy;
923 const float_v sB3_fX = syyy * Byyy_fX;
924 const float_v sB3_fY = syyy * Byyy_fY;
926 const float_v SA3 = Syyy * Ayyy;
927 const float_v SA3_fX = Syyy * Ayyy_fX;
928 const float_v SB3 = Syyy * Byyy;
929 const float_v SB3_fX = Syyy * Byyy_fX;
930 const float_v SB3_fY = Syyy * Byyy_fY;
932 const float_v ht1 = ht * dz;
933 const float_v ht2 = ht * ht * dz2;
934 const float_v ht3 = ht * ht * ht * dz3;
935 const float_v ht1sA1 = ht1 * sA1;
936 const float_v ht1sB1 = ht1 * sB1;
937 const float_v ht1SA1 = ht1 * SA1;
938 const float_v ht1SB1 = ht1 * SB1;
939 const float_v ht2sA2 = ht2 * sA2;
940 const float_v ht2SA2 = ht2 * SA2;
941 const float_v ht2sB2 = ht2 * sB2;
942 const float_v ht2SB2 = ht2 * SB2;
943 const float_v ht3sA3 = ht3 * sA3;
944 const float_v ht3sB3 = ht3 * sB3;
945 const float_v ht3SA3 = ht3 * SA3;
946 const float_v ht3SB3 = ht3 * SB3;
948 fX(mask) += ((x + ht1SA1 + ht2SA2 + ht3SA3) * dz);
949 fY(mask) += ((y + ht1SB1 + ht2SB2 + ht3SB3) * dz);
950 fTx(mask) += (ht1sA1 + ht2sA2 + ht3sA3);
951 fTy(mask) += (ht1sB1 + ht2sB2 + ht3sB3);
958 const float_v ctdz = c_light * t * dz;
959 const float_v ctdz2 = c_light * t * dz2;
961 const float_v dqp = fQP - qp0;
962 const float_v t2i = c1 *
rcp(t2);
963 const float_v xt2i = x * t2i;
964 const float_v yt2i = y * t2i;
965 const float_v tmp0 = ht1SA1 + c2 * ht2SA2 + c3 * ht3SA3;
966 const float_v tmp1 = ht1SB1 + c2 * ht2SB2 + c3 * ht3SB3;
967 const float_v tmp2 = ht1sA1 + c2 * ht2sA2 + c3 * ht3sA3;
968 const float_v tmp3 = ht1sB1 + c2 * ht2sB2 + c3 * ht3sB3;
970 const float_v j02 = dz * (c1 + xt2i * tmp0 + ht1 * SA1_fX + ht2 * SA2_fX + ht3 * SA3_fX);
971 const float_v j12 = dz * (xt2i * tmp1 + ht1 * SB1_fX + ht2 * SB2_fX + ht3 * SB3_fX);
972 const float_v j22 = c1 + xt2i * tmp2 + ht1 * sA1_fX + ht2 * sA2_fX + ht3 * sA3_fX;
973 const float_v j32 = xt2i * tmp3 + ht1 * sB1_fX + ht2 * sB2_fX + ht3 * sB3_fX;
975 const float_v j03 = dz * (yt2i * tmp0 + ht1 * SA1_fY + ht2 * SA2_fY);
976 const float_v j13 = dz * (c1 + yt2i * tmp1 + ht1 * SB1_fY + ht2 * SB2_fY + ht3 * SB3_fY);
977 const float_v j23 = yt2i * tmp2 + ht1 * sA1_fY + ht2 * sA2_fY;
978 const float_v j33 = c1 + yt2i * tmp3 + ht1 * sB1_fY + ht2 * sB2_fY + ht3 * sB3_fY;
980 const float_v j04 = ctdz2 * (SA1 + c2 * ht1 * SA2 + c3 * ht2 * SA3);
981 const float_v j14 = ctdz2 * (SB1 + c2 * ht1 * SB2 + c3 * ht2 * SB3);
982 const float_v j24 = ctdz * (sA1 + c2 * ht1 * sA2 + c3 * ht2 * sA3);
983 const float_v j34 = ctdz * (sB1 + c2 * ht1 * sB2 + c3 * ht2 * sB3);
986 fX(mask) += j04 * dqp;
987 fY(mask) += j14 * dqp;
988 fTx(mask) += j24 * dqp;
989 fTy(mask) += j34 * dqp;
996 const float_v c42 = fC42, c43 = fC43;
998 const float_v cj00 = fC00 + fC20 * j02 + fC30 * j03 + fC40 * j04;
1000 const float_v cj20 = fC20 + fC22 * j02 + fC32 * j03 + c42 * j04;
1001 const float_v cj30 = fC30 + fC32 * j02 + fC33 * j03 + c43 * j04;
1003 const float_v cj01 = fC10 + fC20 * j12 + fC30 * j13 + fC40 * j14;
1004 const float_v cj11 = fC11 + fC21 * j12 + fC31 * j13 + fC41 * j14;
1005 const float_v cj21 = fC21 + fC22 * j12 + fC32 * j13 + c42 * j14;
1006 const float_v cj31 = fC31 + fC32 * j12 + fC33 * j13 + c43 * j14;
1010 const float_v cj22 = fC22 * j22 + fC32 * j23 + c42 * j24;
1011 const float_v cj32 = fC32 * j22 + fC33 * j23 + c43 * j24;
1015 const float_v cj23 = fC22 * j32 + fC32 * j33 + c42 * j34;
1016 const float_v cj33 = fC32 * j32 + fC33 * j33 + c43 * j34;
1018 fC40(mask) += (c42 * j02 + c43 * j03 + fC44 * j04);
1019 fC41(mask) += (c42 * j12 + c43 * j13 + fC44 * j14);
1020 fC42(mask) = (c42 * j22 + c43 * j23 + fC44 * j24);
1021 fC43(mask) = (c42 * j32 + c43 * j33 + fC44 * j34);
1023 fC00(mask) = (cj00 + j02 * cj20 + j03 * cj30 + j04 * fC40);
1024 fC10(mask) = (cj01 + j02 * cj21 + j03 * cj31 + j04 * fC41);
1025 fC11(mask) = (cj11 + j12 * cj21 + j13 * cj31 + j14 * fC41);
1029 fC20(mask) = (j22 * cj20 + j23 * cj30 + j24 * fC40);
1030 fC30(mask) = (j32 * cj20 + j33 * cj30 + j34 * fC40);
1031 fC21(mask) = (j22 * cj21 + j23 * cj31 + j24 * fC41);
1032 fC31(mask) = (j32 * cj21 + j33 * cj31 + j34 * fC41);
1033 fC22(mask) = (j22 * cj22 + j23 * cj32 + j24 * fC42);
1034 fC32(mask) = (j32 * cj22 + j33 * cj32 + j34 * fC42);
1035 fC33(mask) = (j32 * cj23 + j33 * cj33 + j34 * fC43);
1040 inline float_m PndFTSCATrackParamVector::PassMaterial(
const L1MaterialInfo &info,
const float_v &qp0,
const float_m &mask)
1042 const float_v mass2 = 0.1395679f * 0.1395679f;
1044 float_v txtx = fTx * fTx;
1045 float_v tyty = fTy * fTy;
1046 float_v txtx1 = txtx + 1.f;
1047 float_v h = txtx + tyty;
1048 float_v t =
sqrt(txtx1 + tyty);
1050 float_v qp0t = qp0 * t;
1052 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;
1054 float_v s0 = (c1 + c2 * info.
logRadThick + c3 * h + h2 * (c4 + c5 * h + c6 * h2)) * qp0t;
1055 float_v a = ((t + mass2 * qp0 * qp0t) * info.
RadThick * s0 * s0);
1059 fC22(mask) += txtx1 * a;
1060 fC32(mask) += fTx * fTy * a;
1061 fC33(mask) += (1.f + tyty) * a;
1082 const float_v &kp0 = 2.33f;
1083 const float_v &kp1 = 0.20f;
1084 const float_v &kp2 = 3.00f;
1085 const float_v &kp3 = 173e-9
f;
1086 const float_v &kp4 = 0.49848f;
1088 const float mK = 0.307075e-3
f;
1089 const float _2me = 1.022e-3
f;
1090 const float_v &rho = kp0;
1091 const float_v &x0 = kp1 * 2.303f;
1092 const float_v &x1 = kp2 * 2.303f;
1093 const float_v &mI = kp3;
1094 const float_v &mZA = kp4;
1095 const float_v &maxT = _2me * bg2;
1098 float_v d2(Vc::Zero);
1099 const float_v x = 0.5f *
log(bg2);
1100 const float_v lhwI =
log(28.816f * 1e-9f *
sqrt(rho * mZA) / mI);
1102 float_m init = x > x1;
1104 d2(init) = lhwI + x - 0.5f;
1105 const float_v &r = (x1 - x) / (x1 - x0);
1106 init = (x > x0) & (x1 > x);
1107 d2(init) = (lhwI + x - 0.5f + (0.5f - lhwI - x0) * r * r * r);
1109 return mK * mZA * (1.f + bg2) / bg2 * (0.5f *
log(_2me * bg2 * maxT / (mI * mI)) - bg2 / (1.f + bg2) - d2);
1112 inline void PndFTSCATrackParamVector::EnergyLossCorrection(
const float_v &mass2,
const float_v &radThick, float_v &qp0, float_v direction,
const float_m &mask)
1114 const float_v &p2 = 1.f / (qp0 * qp0);
1115 const float_v &E2 = mass2 + p2;
1119 float_v tr =
sqrt(1.f + fTx * fTx + fTy * fTy);
1121 const float_v &dE = bethe * radThick * tr * 2.33f * 9.34961f;
1123 const float_v &E2Corrected = (
sqrt(E2) + direction * dE) * (
sqrt(E2) + direction * dE);
1124 float_v corr =
sqrt(p2 / (E2Corrected - mass2));
1126 float_m init = !(corr == corr) || !(mask);
1134 fC44(mask) *= corr * corr;
1140 float_v zeta0, zeta1, S00, S10, S11, si;
1141 float_v F00, F10, F20, F30, F40, F01, F11, F21, F31, F41;
1142 float_v K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
1144 zeta0 = fX + extrDx - xV;
1145 zeta1 = fY + extrDy - yV;
1162 S00 = info.
C00 + F00 + J[0] * F20 + J[1] * F30 + J[2] * F40;
1163 S10 = info.
C10 + F10 + J[3] * F20 + J[4] * F30 + J[5] * F40;
1164 S11 = info.
C11 + F11 + J[3] * F21 + J[4] * F31 + J[5] * F41;
1166 si = 1.f / (S00 * S11 - S10 * S10);
1167 float_v S00tmp = S00;
1172 fChi2(active) += zeta0 * zeta0 * S00 + 2.f * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
1174 K00 = F00 * S00 + F01 * S10;
1175 K01 = F00 * S10 + F01 * S11;
1176 K10 = F10 * S00 + F11 * S10;
1177 K11 = F10 * S10 + F11 * S11;
1178 K20 = F20 * S00 + F21 * S10;
1179 K21 = F20 * S10 + F21 * S11;
1180 K30 = F30 * S00 + F31 * S10;
1181 K31 = F30 * S10 + F31 * S11;
1182 K40 = F40 * S00 + F41 * S10;
1183 K41 = F40 * S10 + F41 * S11;
1185 fX(active) -= K00 * zeta0 + K01 * zeta1;
1186 fY(active) -= K10 * zeta0 + K11 * zeta1;
1187 fTx(active) -= K20 * zeta0 + K21 * zeta1;
1188 fTy(active) -= K30 * zeta0 + K31 * zeta1;
1189 fQP(active) -= K40 * zeta0 + K41 * zeta1;
1191 fC00(active) -= (K00 * F00 + K01 * F01);
1192 fC10(active) -= (K10 * F00 + K11 * F01);
1193 fC11(active) -= (K10 * F10 + K11 * F11);
1194 fC20(active) = -(K20 * F00 + K21 * F01);
1195 fC21(active) = -(K20 * F10 + K21 * F11);
1196 fC22(active) -= (K20 * F20 + K21 * F21);
1197 fC30(active) = -(K30 * F00 + K31 * F01);
1198 fC31(active) = -(K30 * F10 + K31 * F11);
1199 fC32(active) = -(K30 * F20 + K31 * F21);
1200 fC33(active) -= (K30 * F30 + K31 * F31);
1201 fC40(active) = -(K40 * F00 + K41 * F01);
1202 fC41(active) = -(K40 * F10 + K41 * F11);
1203 fC42(active) = -(K40 * F20 + K41 * F21);
1204 fC43(active) = -(K40 * F30 + K41 * F31);
1205 fC44(active) -= (K40 * F40 + K41 * F41);
1211 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)
1213 const float_v c_light = 0.000299792458f, c1 = 1.f, c2i = 0.5f, c6i = 1.f / 6.f, c12i = 1.f / 12.f;
1215 const float_v dz = x0 - fZ;
1216 float_v dz2 = dz * dz;
1217 float_v dzc6i = dz * c6i;
1218 float_v dz2c12i = dz2 * c12i;
1220 float_v xx = fTx * fTx;
1221 float_v yy = fTy * fTy;
1222 float_v xy = fTx * fTy;
1224 float_v Ay = -xx - c1;
1225 float_v bx = yy + c1;
1227 float_v ctdz2 = c_light *
sqrt(c1 + xx + yy) * dz2;
1229 float_v Sx = F.
cx0 * c2i + F.
cx1 * dzc6i + F.
cx2 * dz2c12i;
1230 float_v Sy = F.
cy0 * c2i + F.
cy1 * dzc6i + F.
cy2 * dz2c12i;
1231 float_v Sz = F.
cz0 * c2i + F.
cz1 * dzc6i + F.
cz2 * dz2c12i;
1233 extrDx(active) = (fTx)*dz;
1234 extrDy(active) = (fTy)*dz;
1235 J04(active) = ctdz2 * (Sx * xy + Sy * Ay + Sz * fTy);
1236 J14(active) = ctdz2 * (Sx * bx - Sy * xy - Sz * fTx);
1256 template <
typename T>
1258 template <
typename _CharT,
typename _Traits>
1259 class basic_istream;
1260 typedef basic_istream<char, char_traits<char>>
istream;
1261 template <
typename _CharT,
typename _Traits>
1262 class basic_ostream;
1263 typedef basic_ostream<char, char_traits<char>>
ostream;
1280 for (
int i = 0; i < 5; ++
i)
1282 for (
int i = 0; i < 15; ++
i)
1294 const float_v r =
sqrt(r0 * r0 + r1 * r1);
1312 float_v
X()
const {
return fX; }
1313 float_v
Y()
const {
return fP[0]; }
1314 float_v
Z()
const {
return fP[1]; }
1316 float_v
DzDs()
const {
return fP[3]; }
1317 float_v
QPt()
const {
return fP[4]; }
1319 float_v
Angle()
const {
return fAlpha; }
1321 float_v
X0()
const {
return X(); }
1322 float_v
X1()
const {
return Y(); }
1323 float_v
X2()
const {
return Z(); }
1333 float_v
Chi2()
const {
return fChi2; }
1334 int_v
NDF()
const {
return fNDF; }
1342 float_v
GetX()
const {
return fX; }
1343 float_v
GetY()
const {
return fP[0]; }
1344 float_v
GetZ()
const {
return fP[1]; }
1352 float_v
GetKappa(
const float_v &Bz)
const {
return fP[4] * Bz; }
1362 const float_v &
Par(
int i)
const {
return fP[
i]; }
1363 const float_v &
Cov(
int i)
const {
return fC[
i]; }
1367 const float_v *
Par()
const {
return fP; }
1368 const float_v *
Cov()
const {
return fC; }
1369 float_v *
Par() {
return fP; }
1370 float_v *
Cov() {
return fC; }
1375 for (
int i = 0; i < 5; i++)
1376 fP[i](
m) = param.
Par()[
i];
1377 for (
int i = 0; i < 15; i++)
1378 fC[i](
m) = param.
Cov()[
i];
1382 fNDF(static_cast<int_m>(
m)) = param.
GetNDF();
1383 fAlpha(static_cast<int_m>(
m)) = param.
Angle();
1388 for (
int i = 0; i < 5; i++)
1389 fP[i][iV] = param.
Par()[
i][iVa];
1390 for (
int i = 0; i < 15; i++)
1391 fC[i][iV] = param.
Cov()[
i][iVa];
1392 fX[iV] = param.
X()[iVa];
1394 fChi2[iV] = param.
GetChi2()[iVa];
1395 fNDF[iV] = param.
GetNDF()[iVa];
1396 fAlpha[iV] = param.
Angle()[iVa];
1400 void SetPar(
int i,
const float_v &v,
const float_m &
m) { fP[
i](
m) = v; }
1402 void SetCov(
int i,
const float_v &v,
const float_m &
m) { fC[
i](
m) = v; }
1405 void SetY(
const float_v &v) { fP[0] =
v; }
1406 void SetZ(
const float_v &v) { fP[1] =
v; }
1407 void SetX(
const float_v &v,
const float_m &
m) { fX(m) =
v; }
1408 void SetY(
const float_v &v,
const float_m &
m) { fP[0](
m) = v; }
1409 void SetZ(
const float_v &v,
const float_m &
m) { fP[1](
m) = v; }
1413 void SetDzDs(
const float_v &v,
const float_m &
m) { fP[3](
m) = v; }
1416 void SetQPt(
const float_v &v,
const float_m &
m) { fP[4](
m) = v; }
1420 void SetChi2(
const float_v &v,
const float_m &
m) { fChi2(m) =
v; }
1423 void SetNDF(
const int_v &v,
const int_m &
m) { fNDF(m) =
v; }
1426 void SetAngle(
const float_v &v,
const float_m &
m) { fAlpha(m) =
v; }
1435 float_v
GetS(
const float_v &x,
const float_v &y,
const float_v &Bz)
const;
1437 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;
1439 float_m
TransportToX0WithMaterial(
const float_v &x,
const float_v &XOverX0,
const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi = .999f);
1441 float_m
TransportToX0(
const float_v &x,
const float_v &Bz,
const float maxSinPhi = .999f,
const float_m &mask = float_m(
true));
1446 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));
1449 const float_v &Bz,
const float maxSinPhi = .999f,
const float_m &mask = float_m(
true));
1455 float_m
Rotate(
const float_v &alpha,
const float maxSinPhi = .999f,
const float_m &mask = float_m(
true));
1456 void RotateXY(float_v alpha, float_v &x, float_v &y, float_v &
sin,
const float_m &mask = float_m(
true))
const;
1458 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),
1459 const int_v &hitNDF = int_v(2),
const float_v &chi2Cut = 10e10f);
1461 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),
1462 const float_v &chi2Cut = 10e10f);
1464 const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
1467 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,
1468 const float_v &kp4 = 0.49848f);
1480 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));
1481 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));
1485 float_m
Filter(
const FTSCAHitV &hit,
const PndFTSCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
1488 float_m
Filter(
const FTSCAHit &hit,
const PndFTSCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
1494 float_v fSignCosPhi;
1515 debugKF() <<
"Start TransportToX0(" << x <<
", " << _mask <<
")\n" << *
this << std::endl;
1517 const float_v &ey = sinPhi0;
1518 const float_v &dx = x -
X();
1519 const float_v &exi = float_v(Vc::One) *
CAMath::RSqrt(float_v(Vc::One) - ey * ey);
1521 const float_v &dxBz = dx * Bz;
1522 const float_v &dS = dx * exi;
1523 const float_v &h2 = dS * exi * exi;
1524 const float_v &h4 = .5f * h2 * dxBz;
1527 std::cout <<
" TrTo-sinPhi0 = " << sinPhi0 << std::endl;
1531 const float_v &sinPhi =
SinPhi() + dxBz *
QPt();
1534 std::cout <<
" TrTo-sinPhi = " << sinPhi << std::endl;
1536 float_m mask = _mask &&
CAMath::Abs(exi) <= 1.e4f;
1537 mask &= ((
CAMath::Abs(sinPhi) <= maxSinPhi) || (maxSinPhi <= 0.f));
1540 fP[0](mask) += dS * ey + h2 * (
SinPhi() - ey) + h4 *
QPt();
1541 fP[1](mask) += dS *
DzDs();
1542 fP[2](mask) = sinPhi;
1546 const float_v c20 = fC[3];
1548 const float_v c22 = fC[5];
1550 const float_v c31 = fC[7];
1552 const float_v c33 = fC[9];
1553 const float_v c40 = fC[10];
1555 const float_v c42 = fC[12];
1557 const float_v c44 = fC[14];
1559 const float_v two(2.f);
1561 fC[0](mask) += h2 * h2 * c22 + h4 * h4 * c44 + two * (h2 * c20 + h4 * (c40 + h2 * c42));
1564 fC[2](mask) += dS * (two * c31 + dS * c33);
1566 fC[3](mask) += h2 * c22 + h4 * c42 + dxBz * (c40 + h2 * c42 + h4 * c44);
1568 const float_v &dxBz_c44 = dxBz * c44;
1569 fC[12](mask) += dxBz_c44;
1570 fC[5](mask) += dxBz * (two * c42 + dxBz_c44);
1573 fC[7](mask) += dS * c33;
1577 fC[10](mask) += h2 * c42 + h4 * c44;
1582 debugKF() << mask <<
"\n" << *
this << std::endl;
1589 #define VALGRIND_CHECK_VALUE_IS_DEFINED(mask) 1590 #define VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED(v, k) 1591 #define VALGRIND_CHECK_MEM_IS_DEFINED(v, k) ; 1592 #define VALGRIND_CHECK_MEM_IS_ADDRESSABLE(v, k) ; 1594 #include <valgrind/memcheck.h> 1595 #define VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED(v, k) \ 1597 __typeof__(v + v) tmp(v); \ 1599 VALGRIND_CHECK_VALUE_IS_DEFINED(tmp); \ 1842 if ((abs(alpha) < 1e-6f || !mask).isFull())
1848 const float_v cosPhi = cP * cA + sP * sA;
1849 const float_v sinPhi = -cP * sA + sP * cA;
1853 mReturn &= abs(alpha) < 3.1415f * 0.25f;
1855 const float_v j0 = cP / cosPhi;
1856 const float_v j2 = cosPhi / cP;
1858 SetX(x * cA + y * sA, mReturn);
1859 SetY(-x * sA + y * cA, mReturn);
1870 fC[0](mReturn) *= j0 * j0;
1871 fC[1](mReturn) *= j0;
1872 fC[3](mReturn) *= j0;
1873 fC[6](mReturn) *= j0;
1874 fC[10](mReturn) *= j0;
1876 fC[3](mReturn) *= j2;
1877 fC[4](mReturn) *= j2;
1878 fC[5](mReturn) *= j2 * j2;
1879 fC[8](mReturn) *= j2;
1880 fC[12](mReturn) *= j2;
1882 fAlpha(mReturn) +=
alpha;
1890 if ((abs(alpha) < 1e-6f || !mask).isFull())
1896 x(mask) = (
X() * cA +
Y() * sA);
1897 y(mask) = (-
X() * sA +
Y() * cA);
1904 float_v zeta0, zeta1, S00, S10, S11, si;
1905 float_v F00, F10, F20, F30, F40, F01, F11, F21, F31, F41;
1906 float_v K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
1907 float_v &c00 = fC[0];
1908 float_v &c10 = fC[1];
1909 float_v &c11 = fC[2];
1910 float_v &c20 = fC[3];
1911 float_v &c21 = fC[4];
1912 float_v &c22 = fC[5];
1913 float_v &c30 = fC[6];
1914 float_v &c31 = fC[7];
1915 float_v &c32 = fC[8];
1916 float_v &c33 = fC[9];
1917 float_v &c40 = fC[10];
1918 float_v &c41 = fC[11];
1919 float_v &c42 = fC[12];
1920 float_v &c43 = fC[13];
1921 float_v &c44 = fC[14];
1923 zeta0 =
Y() + extrDy - yV;
1924 zeta1 =
Z() + extrDz - zV;
1941 S00 = info.
C00() + F00 + J[0] * F20 + J[1] * F30 + J[2] * F40;
1942 S10 = info.
C10() + F10 + J[3] * F20 + J[4] * F30 + J[5] * F40;
1943 S11 = info.
C11() + F11 + J[3] * F21 + J[4] * F31 + J[5] * F41;
1945 si = 1.f / (S00 * S11 - S10 * S10);
1946 float_v S00tmp = S00;
1951 fChi2(active) += zeta0 * zeta0 * S00 + 2.f * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
1953 K00 = F00 * S00 + F01 * S10;
1954 K01 = F00 * S10 + F01 * S11;
1955 K10 = F10 * S00 + F11 * S10;
1956 K11 = F10 * S10 + F11 * S11;
1957 K20 = F20 * S00 + F21 * S10;
1958 K21 = F20 * S10 + F21 * S11;
1959 K30 = F30 * S00 + F31 * S10;
1960 K31 = F30 * S10 + F31 * S11;
1961 K40 = F40 * S00 + F41 * S10;
1962 K41 = F40 * S10 + F41 * S11;
1964 fP[0](active) -= K00 * zeta0 + K01 * zeta1;
1965 fP[1](active) -= K10 * zeta0 + K11 * zeta1;
1966 fP[2](active) -= K20 * zeta0 + K21 * zeta1;
1967 fP[3](active) -= K30 * zeta0 + K31 * zeta1;
1968 fP[4](active) -= K40 * zeta0 + K41 * zeta1;
1970 c00(active) -= (K00 * F00 + K01 * F01);
1971 c10(active) -= (K10 * F00 + K11 * F01);
1972 c11(active) -= (K10 * F10 + K11 * F11);
1973 c20(active) = -(K20 * F00 + K21 * F01);
1974 c21(active) = -(K20 * F10 + K21 * F11);
1975 c22(active) -= (K20 * F20 + K21 * F21);
1976 c30(active) = -(K30 * F00 + K31 * F01);
1977 c31(active) = -(K30 * F10 + K31 * F11);
1978 c32(active) = -(K30 * F20 + K31 * F21);
1979 c33(active) -= (K30 * F30 + K31 * F31);
1980 c40(active) = -(K40 * F00 + K41 * F01);
1981 c41(active) = -(K40 * F10 + K41 * F11);
1982 c42(active) = -(K40 * F20 + K41 * F21);
1983 c43(active) = -(K40 * F30 + K41 * F31);
1984 c44(active) -= (K40 * F40 + K41 * F41);
1991 const float_v &ey =
SinPhi();
1992 const float_v &dx = x -
X();
1993 const float_v &exi =
CAMath::RSqrt(float_v(Vc::One) - ey * ey);
1995 const float_v &dxBz = dx * cBz;
1996 const float_v &dS = dx * exi;
1997 const float_v &h2 = dS * exi * exi;
1998 const float_v &h4 = .5f * h2 * dxBz;
2000 float_m mask = active &&
CAMath::Abs(exi) <= 1.e4f;
2002 extrDy(active) = dS * ey;
2003 extrDz(active) = dS *
DzDs();
2016 #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)