11 #ifndef PNDFTSCATRACKPARAMVECTOR_H
12 #define PNDFTSCATRACKPARAMVECTOR_H
25 #include "FairField.h"
26 #include "FairRunAna.h"
51 fC20(0.
f), fC21(0.
f), fC22(0.
f),
52 fC30(0.
f), fC31(0.
f), fC32(0.
f), fC33(0.
f),
53 fC40(0.
f), fC41(0.
f), fC42(0.
f), fC43(0.
f), fC44(0.
f),
55 { fZB[0] = fZB[1] = 10e10; fDirection =
true; }
64 fNDF(static_cast<int_m>(
m)) = param.
NDF();
70 for(
int i=0;
i<5;
i++)
Par(
i)[iV] = param.
Par(
i)[iVa];
71 for(
int i=0;
i<15;
i++)
Cov(
i)[iV] = param.
Cov(
i)[iVa];
72 fX[iV] = param.
X()[iVa];
73 fZ[iV] = param.
Z()[iVa];
83 cout <<
"CovMat " << endl;
85 cout <<
Cov(0) << endl;
86 cout <<
Cov(1) <<
" "<<
Cov(2) << endl;
87 cout <<
Cov(3) <<
" "<<
Cov(4) <<
" "<<
Cov(5) << endl;
88 cout <<
Cov(6) <<
" "<<
Cov(7) <<
" "<<
Cov(8) <<
" "<<
Cov(9) << endl;
89 cout <<
Cov(10) <<
" "<<
Cov(11) <<
" "<<
Cov(12) <<
" "<<
Cov(13) <<
" "<<
Cov(14) << endl;
102 float_m mask = (r0 > 0.f);
112 float_v
X()
const {
return fX; }
113 float_v
Y()
const {
return fY; }
114 float_v
Z()
const {
return fZ; }
115 float_v Tx()
const {
return fTx; }
116 float_v Ty()
const {
return fTy; }
117 float_v QP()
const {
return fQP;}
119 float_v Bx()
const {
return fBx; }
120 float_v By()
const {
return fBy; }
124 int_v
NDF()
const {
return fNDF; }
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(); }
135 const float_v tx12 =
Tx1()*
Tx1();
136 return sqrt( tx12/(1.
f + tx12) );
139 const float_v&
Par(
int i )
const {
148 assert(0);
return fX;
151 const float_v&
Cov(
int i )
const {
163 case 10:
return fC40;
164 case 11:
return fC41;
165 case 12:
return fC42;
166 case 13:
return fC43;
167 case 14:
return fC44;
169 assert(0);
return fC00;
172 float_v
Err2X1()
const {
return Err2X(); }
175 float_v Err2X()
const {
return fC00; }
176 float_v
Err2Y()
const {
return fC11; }
177 float_v Err2QP()
const {
return fC44; }
182 void SetX(
const float_v &
v ) {
fX =
v; }
183 void SetY(
const float_v &
v ) {
fY =
v; }
184 void SetZ(
const float_v &
v ) {
fZ =
v; }
185 void SetTx(
const float_v &
v ) { fTx =
v; }
186 void SetTy(
const float_v &
v ) { fTy =
v; }
187 void SetQP(
const float_v &
v ) { fQP =
v; }
189 void SetBx(
const float_v &
v ) { fBx =
v; }
190 void SetBy(
const float_v &
v ) { fBy =
v; }
198 void SetPar(
int i, float_v
v ) {
200 case 0:
fX =
v;
break;
201 case 1:
fY =
v;
break;
202 case 2: fTx =
v;
break;
203 case 3: fTy =
v;
break;
204 case 4: fQP =
v;
break;
207 void SetCov(
int i, float_v v ) {
209 case 0: fC00 =
v;
break;
210 case 1: fC10 =
v;
break;
211 case 2: fC11 =
v;
break;
212 case 3: fC20 =
v;
break;
213 case 4: fC21 =
v;
break;
214 case 5: fC22 =
v;
break;
215 case 6: fC30 =
v;
break;
216 case 7: fC31 =
v;
break;
217 case 8: fC32 =
v;
break;
218 case 9: fC33 =
v;
break;
219 case 10: fC40 =
v;
break;
220 case 11: fC41 =
v;
break;
221 case 12: fC42 =
v;
break;
222 case 13: fC43 =
v;
break;
223 case 14: fC44 =
v;
break;
227 void SetDirection(
bool b ) { fDirection =
b; }
229 float_v&
Par(
int i ) {
237 assert(0);
return fX;
240 float_v&
Cov(
int i ) {
252 case 10:
return fC40;
253 case 11:
return fC41;
254 case 12:
return fC42;
255 case 13:
return fC43;
256 case 14:
return fC44;
258 assert(0);
return fC00;
261 void SetX(
const float_v &v,
const float_m &
m ) {
fX( m ) =
v; }
262 void SetY(
const float_v &v,
const float_m &
m ) {
fY( m ) =
v; }
263 void SetZ(
const float_v &v,
const float_m &
m ) {
fZ( m ) =
v; }
264 void SetTx(
const float_v &v,
const float_m &
m ) { fTx( m ) =
v; }
265 void SetTy(
const float_v &v,
const float_m &
m ) { fTy( m ) =
v; }
266 void SetQP(
const float_v &v,
const float_m &
m ) { fQP( m ) =
v; }
267 void SetQMomentum(
const float_v &v,
const float_m &
m ) { fQP( m ) =
v; }
269 void SetChi2(
const float_v &v,
const float_m &
m ) {
fChi2(m) =
v; }
270 void SetNDF(
const int_v &v,
const int_m &
m ) {
fNDF(m) =
v; }
277 void SetCovX12( float_v v00, float_v v10, float_v v11 ) { fC00 = v00; fC10 = v10; fC11 = v11; }
285 float_m TransportByLine(
const FTSCAHitV& hit,
const PndFTSCAParam& param,
const float_m &mask = float_m(
true ) );
287 float_m
Filter(
const FTSCAHitV& hit,
const PndFTSCAParam& param,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f );
290 float_m
Filter(
const FTSCAHit& hit,
const PndFTSCAParam& param,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f );
298 float_m
TransportToX0(
const float_v &x0,
const L1FieldRegion &F,
const float_v &qp0,
const float_m &mask = float_m(
true ) );
299 float_m RK4TransportToX0(
const float_v &x0_out,
const L1FieldRegion &F,
const float_v &qp0,
const float_m &mask = float_m(
true) );
300 float_m TransportToX0Line(
const float_v &x0,
const float_m &mask = float_m(
true ) );
301 float_m PassMaterial(
const L1MaterialInfo &info,
const float_v &qp0,
const float_m &mask = float_m(
true ) );
302 void EnergyLossCorrection(
const float_v& mass2,
const float_v& radThick, float_v &qp0, float_v direction,
const float_m &mask);
305 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 );
307 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 ) );
309 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 ) );
312 float_v
fX,
fY,fTx,fTy,fQP,
fZ,
316 fC30, fC31, fC32, fC33,
317 fC40, fC41, fC42, fC43, fC44;
333 inline float_m PndFTSCATrackParamVector::TransportToX0Line(
const float_v &x0_out,
const float_m &mask )
335 float_v
dz = (x0_out -
fZ);
342 const float_v dzC32_in = dz * fC32;
344 fC21(mask) += dzC32_in;
345 fC10(mask) += dz * ( fC21 + fC30 );
347 const float_v C20_in = fC20;
349 fC20(mask) += dz * fC22;
350 fC00(mask) += dz * ( fC20 + C20_in );
352 const float_v C31_in = fC31;
354 fC31(mask) += dz * fC33;
355 fC11(mask) += dz * ( fC31 + C31_in );
356 fC30(mask) += dzC32_in;
358 fC40(mask) += dz * fC42;
359 fC41(mask) += dz * fC43;
373 success &= ( err2 > 1.e-8
f );
379 h0(active) = info.
cos;
380 h1(active) = info.
sin;
387 const float_v tx = h0*fTx +
h1*fTy;
393 float_v rCorrection =
sqrt(1.
f+tx*tx);
396 float_v Diff = h0*(
fX -
x0) +
h1*(
fY - y0);
397 float_v zeta_1, zeta_2;
398 zeta_1 = h0*(
fX -
x0) +
h1*(
fY - y0) - r*rCorrection;
399 zeta_2 = h0*(
fX -
x0) +
h1*(
fY - y0) + r*rCorrection;
401 for (
int iDiff=0; iDiff < 4; iDiff++)
403 float Diff_f = (float)Diff[iDiff];
407 zeta[iDiff] = zeta_1[iDiff];
411 zeta[iDiff] = zeta_2[iDiff];
418 if (err2[0] < 0.01
f) err2[0] = err2[0] + r[0]*r[0];
419 err2 *= rCorrection*rCorrection;
421 float_v wi, zetawi, HCH;
422 float_v F0, F1, F2, F3, F4;
423 float_v K1, K2, K3, K4;
425 if (fC00[0] < 0.
f) fC00[0]=0.f;
428 F0 = h0*fC00 +
h1*fC10;
429 F1 = h0*fC10 +
h1*fC11;
432 HCH = (h0*h0*fC00 + 2.f*h0*
h1*fC10) +
h1*
h1*fC11;
434 F2 = h0*fC20 +
h1*fC21;
435 F3 = h0*fC30 +
h1*fC31;
436 F4 = h0*fC40 +
h1*fC41;
440 cout<<
"we don't have to be here for now \n";
441 const float_m mask = success && (HCH > err2 * 16.f);
444 zetawi(mask) = zeta *wi;
445 dChi2(mask) += (zeta * zetawi);
448 wi = 1.f/( err2 + HCH );
450 dChi2(success) += zeta * zetawi;
463 fX(success) -= F0*zetawi;
464 fY(success) -= F1*zetawi;
465 fTx(success) -= F2*zetawi;
466 fTy(success) -= F3*zetawi;
467 fQP(success) -= F4*zetawi;
469 fC00(success) -= F0*F0*wi;
470 fC10(success) -= K1*F0;
471 fC11(success) -= K1*F1;
472 fC20(success) -= K2*F0;
473 fC21(success) -= K2*F1;
474 fC22(success) -= K2*F2;
475 fC30(success) -= K3*F0;
476 fC31(success) -= K3*F1;
477 fC32(success) -= K3*F2;
478 fC33(success) -= K3*F3;
479 fC40(success) -= K4*F0;
480 fC41(success) -= K4*F1;
481 fC42(success) -= K4*F2;
482 fC43(success) -= K4*F3;
483 fC44(success) -= K4*F4;
485 fNDF( static_cast<int_m>(success) ) += 1;
492 float_m active = mask;
496 active &= PassMaterial( material, qp0, active );
497 const float_v mass2 = 0.13957f*0.13957f;
498 float_v direction = -1.f;
502 EnergyLossCorrection(mass2, material.
RadThick, qp0, direction, active);
507 inline float_m PndFTSCATrackParamVector::RK4TransportToX0(
const float_v &x0_out,
const L1FieldRegion &,
const float_v &,
const float_m &mask )
531 const float_v
fC = 0.000299792458f;
534 coef[0] = 0.f; coef[1] = 0.5f;
535 coef[2] = 0.5f; coef[3] = 1.f;
538 xIn[0] =
fX; xIn[2] = fTx;
539 xIn[1] =
fY; xIn[3] = fTy; xIn[4] = fQP;
541 float_v Ax[4], Ay[4];
542 float_v dAx_dtx[4], dAy_dtx[4], dAx_dty[4], dAy_dty[4];
545 float_v
h = x0_out -
fZ;
548 float_v hCqp = h * fC * xIn[4];
552 x[0] =
fX; x[2] = fTx;
553 x[1] =
fY; x[3] = fTy;
555 for (
unsigned int iStep = 0; iStep < 4; iStep++) {
558 x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1];
559 x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1];
560 x[2] = xIn[2] + coef[iStep] * k[2][iStep - 1];
561 x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1];
564 float_v bx(0.
f), by(0.
f), bz(0.
f);
567 for (
int xxx = 0; xxx < float_v::Size; xxx++)
575 p[2] = fZ[xxx] + coef[iStep][xxx] * h[xxx];
579 FairRunAna::Instance()->GetField()->Field(p,b);
588 float_v txtx = tx * tx;
589 float_v tyty = ty * ty;
590 float_v txty = tx * ty;
591 float_v txtxtyty1= 1.f + txtx + tyty;
592 float_v
t1 =
sqrt(txtxtyty1);
593 float_v
t2 = 1.f / txtxtyty1;
595 Ax[iStep] = ( txty * bx + ty * bz - ( 1.f + txtx ) * by ) *
t1;
596 Ay[iStep] = (-txty * by - tx * bz + ( 1.f + tyty ) * bx ) *
t1;
598 dAx_dtx[iStep] = Ax[iStep] * tx * t2 + ( ty * bx - 2.f * tx * by ) * t1;
599 dAx_dty[iStep] = Ax[iStep] * ty * t2 + ( tx * bx + bz ) * t1;
600 dAy_dtx[iStep] = Ay[iStep] * tx * t2 + (-ty * by - bz ) * t1;
601 dAy_dty[iStep] = Ay[iStep] * ty * t2 + (-tx * by + 2.f * ty * bx ) * t1;
603 k[0][iStep] = tx *
h;
604 k[1][iStep] = ty *
h;
605 k[2][iStep] = Ax[iStep] * hCqp;
606 k[3][iStep] = Ay[iStep] * hCqp;
612 xOut[0] = xIn[0] + k[0][0]/6.f + k[0][1]/3.f + k[0][2]/3.f + k[0][3]/6.f;
613 xOut[1] = xIn[1] + k[1][0]/6.f + k[1][1]/3.f + k[1][2]/3.f + k[1][3]/6.f;
614 xOut[2] = xIn[2] + k[2][0]/6.f + k[2][1]/3.f + k[2][2]/3.f + k[2][3]/6.f;
615 xOut[3] = xIn[3] + k[3][0]/6.f + k[3][1]/3.f + k[3][2]/3.f + k[3][3]/6.f;
646 for (
unsigned int iStep = 0; iStep < 4; iStep++) {
648 x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1];
649 x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1];
650 x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1];
653 k[0][iStep] = x[2] *
h;
654 k[1][iStep] = x[3] *
h;
656 k[3][iStep] = (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]) * hCqp;
660 Fmat[2] = x0[0] + k[0][0]/6.f + k[0][1]/3.f + k[0][2]/3.f + k[0][3]/6.f;
662 Fmat[7] = x0[1] + k[1][0]/6.f + k[1][1]/3.f + k[1][2]/3.f + k[1][3]/6.f;
665 Fmat[17] = x0[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[2] = xIn[2] + coef[iStep] * k[2][iStep - 1];
681 k[0][iStep] = x[2] *
h;
682 k[1][iStep] = x[3] *
h;
683 k[2][iStep] = (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]) * hCqp;
687 Fmat[3] = x0[0] + k[0][0]/6.f + k[0][1]/3.f + k[0][2]/3.f + k[0][3]/6.f;
689 Fmat[8] = x0[1] + k[1][0]/6.f + k[1][1]/3.f + k[1][2]/3.f + k[1][3]/6.f;
691 Fmat[13] = x0[2] + k[2][0]/6.f + k[2][1]/3.f + k[2][2]/3.f + k[2][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];
706 x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1];
709 k[0][iStep] = x[2] *
h;
710 k[1][iStep] = x[3] *
h;
711 k[2][iStep] = Ax[iStep] * hC +
712 hCqp * (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]);
713 k[3][iStep] = Ay[iStep] * hC +
714 hCqp * (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]);
718 Fmat[4] = x0[0] + k[0][0]/6.f + k[0][1]/3.f + k[0][2]/3.f + k[0][3]/6.f;
720 Fmat[9] = x0[1] + k[1][0]/6.f + k[1][1]/3.f + k[1][2]/3.f + k[1][3]/6.f;
722 Fmat[14] = x0[2] + k[2][0]/6.f + k[2][1]/3.f + k[2][2]/3.f + k[2][3]/6.f;
724 Fmat[19] = x[3] + k[3][0]/6.f + k[3][1]/3.f + k[3][2]/3.f + k[3][3]/6.f;
731 float_v A = fC20 + Fmat[2] * fC22 + Fmat[3] * fC32 + Fmat[4] * fC42;
732 float_v B = fC30 + Fmat[2] * fC32 + Fmat[3] * fC33 + Fmat[4] * fC43;
733 float_v
C = fC40 + Fmat[2] * fC42 + Fmat[3] * fC43 + Fmat[4] * fC44;
735 float_v D = fC21 + Fmat[7] * fC22 + Fmat[8] * fC32 + Fmat[9] * fC42;
736 float_v E = fC31 + Fmat[7] * fC32 + Fmat[8] * fC33 + Fmat[9] * fC43;
737 float_v G = fC41 + Fmat[7] * fC42 + Fmat[8] * fC43 + Fmat[9] * fC44;
739 float_v H = fC22 + Fmat[13] * fC32 + Fmat[14] * fC42;
740 float_v I = fC32 + Fmat[13] * fC33 + Fmat[14] * fC43;
741 float_v J = fC42 + Fmat[13] * fC43 + Fmat[14] * fC44;
743 float_v K = fC43 + Fmat[17] * fC42 + Fmat[19] * fC44;
745 fC00(mask) = fC00 + Fmat[2] * fC20 + Fmat[3] * fC30 + Fmat[4] * fC40 + A * Fmat[2] + B * Fmat[3] + C * Fmat[4];
746 fC10(mask) = fC10 + Fmat[2] * fC21 + Fmat[3] * fC31 + Fmat[4] * fC41 + A * Fmat[7] + B * Fmat[8] + C * Fmat[9];
747 fC20(mask) = A + B * Fmat[13] + C * Fmat[14];
748 fC30(mask) = B + A * Fmat[17] + C * Fmat[19];
751 fC11(mask) = fC11 + Fmat[7] * fC21 + Fmat[8] * fC31 + Fmat[9] * fC41 + D * Fmat[7] + E * Fmat[8] + G * Fmat[9];
752 fC21(mask) = D + E * Fmat[13] + G * Fmat[14];
753 fC31(mask) = E + D * Fmat[17] + G * Fmat[19];
756 fC22(mask) = H + I * Fmat[13] + J * Fmat[14];
757 fC32(mask) = I + H * Fmat[17] + J * Fmat[19];
760 fC33(mask) = fC33 + Fmat[17] * fC32 + Fmat[19] * fC43 + (Fmat[17] * fC22 + fC32 + Fmat[19] * fC42) * Fmat[17] + K * Fmat[19];
777 const float_v c_light = 0.000299792458f;
783 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,
784 c2i = 1.f/2.f, c3i = 1.f/3.f, c6i = 1.f/6.f, c12i = 1.f/12.f;
787 dz(mask) = (x0_out -
fZ);
789 const float_v dz2 =
dz*
dz;
790 const float_v dz3 = dz2*
dz;
793 const float_v x = fTx;
794 const float_v
y = fTy;
795 const float_v xx = x*
x;
796 const float_v xy = x*
y;
797 const float_v yy = y*
y;
798 const float_v y2 = y*
c2;
799 const float_v x2 = x*
c2;
800 const float_v x4 = x*
c4;
801 const float_v xx31 = xx*
c3+
c1;
802 const float_v xx159 = xx*c15+
c9;
804 const float_v Ay = -xx-
c1;
805 const float_v Ayy = x*(xx*
c3+
c3);
806 const float_v Ayz = -c2*xy;
807 const float_v Ayyy = -(c15*xx*xx+c18*xx+
c3);
809 const float_v Ayy_fX =
c3*xx31;
810 const float_v Ayyy_fX = -x4*xx159;
812 const float_v bx = yy+
c1;
813 const float_v Byy = y*xx31;
814 const float_v Byz = c2*xx+
c1;
815 const float_v Byyy = -xy*xx159;
817 const float_v Byy_fX =
c6*xy;
818 const float_v Byyy_fX = -y*(c45*xx+
c9);
819 const float_v Byyy_fY = -x*xx159;
823 const float_v
t2 = c1 + xx + yy;
824 const float_v t =
sqrt( t2 );
825 const float_v h = qp0*c_light;
826 const float_v ht = h*
t;
830 const float_v ddz = fZ-F.
z0;
831 float_v Fx0 = F.
cx0 + F.
cx1*ddz + F.
cx2*ddz*ddz;
832 float_v Fx1 = (F.
cx1 + c2*F.
cx2*ddz)*dz;
833 float_v Fx2 = F.
cx2*dz2;
834 float_v Fy0 = F.
cy0 + F.
cy1*ddz + F.
cy2*ddz*ddz;
835 float_v Fy1 = (F.
cy1 + c2*F.
cy2*ddz)*dz;
836 float_v Fy2 = F.
cy2*dz2;
837 float_v Fz0 = F.
cz0 + F.
cz1*ddz + F.
cz2*ddz*ddz;
838 float_v Fz1 = (F.
cz1 + c2*F.
cz2*ddz)*dz;
839 float_v Fz2 = F.
cz2*dz2;
841 const float_v sx = ( Fx0 + Fx1*c2i + Fx2*c3i );
842 const float_v sy = ( Fy0 + Fy1*c2i + Fy2*c3i );
843 const float_v sz = ( Fz0 + Fz1*c2i + Fz2*c3i );
845 const float_v Sx = ( Fx0*c2i + Fx1*c6i + Fx2*c12i );
846 const float_v Sy = ( Fy0*c2i + Fy1*c6i + Fy2*c12i );
847 const float_v Sz = ( Fz0*c2i + Fz1*c6i + Fz2*c12i );
853 c00 = 30.f*6.f*
d, c01 = 30.f*2.f*
d, c02 = 30.f*
d,
854 c10 = 3.f*40.f*
d,
c11 = 3.f*15.f*
d, c12 = 3.f*8.f*
d,
855 c20 = 2.f*45.f*
d,
c21 = 2.f*2.f*9.f*
d,
c22 = 2.f*2.f*5.f*
d;
856 syz = Fy0*( c00*Fz0 + c01*Fz1 + c02*Fz2)
857 + Fy1*( c10*Fz0 + c11*Fz1 + c12*Fz2)
858 + Fy2*( c20*Fz0 + c21*Fz1 + c22*Fz2) ;
865 c00 = 21.f*20.f*
d, c01 = 21.f*5.f*
d, c02 = 21.f*2.f*
d,
866 c10 = 7.f*30.f*
d,
c11 = 7.f*9.f*
d, c12 = 7.f*4.f*
d,
868 Syz = Fy0*( c00*Fz0 + c01*Fz1 + c02*Fz2 )
869 + Fy1*( c10*Fz0 + c11*Fz1 + c12*Fz2 )
870 + Fy2*( c20*Fz0 + c21*Fz1 + c22*Fz2 ) ;
873 const float_v syy = sy*sy*c2i;
874 const float_v syyy = syy*sy*c3i;
879 d= 1.f/2520.f, c00= 420.f*
d, c01= 21.f*15.f*
d, c02= 21.f*8.f*
d,
880 c03= 63.f*
d, c04= 70.f*
d, c05= 20.f*
d;
881 Syy = Fy0*(c00*Fy0+c01*Fy1+c02*Fy2) + Fy1*(c03*Fy1+c04*Fy2) + c05*Fy2*Fy2 ;
888 c000 = 7560*
d, c001 = 9*1008*
d, c002 = 5*1008*
d,
889 c011 = 21*180*
d, c012 = 24*180*
d, c022 = 7*180*
d,
890 c111 = 540*
d, c112 = 945*
d, c122 = 560*
d, c222 = 112*
d;
891 const float_v Fy22 = Fy2*Fy2;
892 Syyy = Fy0*( Fy0*(c000*Fy0+c001*Fy1+c002*Fy2)+ Fy1*(c011*Fy1+c012*Fy2)+c022*Fy22 )
893 + Fy1*( Fy1*(c111*Fy1+c112*Fy2)+c122*Fy22) + c222*Fy22*Fy2 ;
897 const float_v sA1 = sx*xy + sy*Ay + sz*
y ;
898 const float_v sA1_fX = sx*y - sy*x2 ;
899 const float_v sA1_fY = sx*x + sz ;
901 const float_v sB1 = sx*bx - sy*xy - sz*
x ;
902 const float_v sB1_fX = -sy*y - sz ;
903 const float_v sB1_fY = sx*y2 - sy*
x ;
905 const float_v SA1 = Sx*xy + Sy*Ay + Sz*
y ;
906 const float_v SA1_fX = Sx*y - Sy*x2 ;
907 const float_v SA1_fY = Sx*x + Sz;
909 const float_v SB1 = Sx*bx - Sy*xy - Sz*
x ;
910 const float_v SB1_fX = -Sy*y - Sz;
911 const float_v SB1_fY = Sx*y2 - Sy*
x;
914 const float_v sA2 = syy*Ayy + syz*Ayz ;
915 const float_v sA2_fX = syy*Ayy_fX - syz*y2 ;
916 const float_v sA2_fY = -syz*x2 ;
917 const float_v sB2 = syy*Byy + syz*Byz ;
918 const float_v sB2_fX = syy*Byy_fX + syz*x4 ;
919 const float_v sB2_fY = syy*xx31 ;
921 const float_v SA2 = Syy*Ayy + Syz*Ayz ;
922 const float_v SA2_fX = Syy*Ayy_fX - Syz*y2 ;
923 const float_v SA2_fY = -Syz*x2 ;
924 const float_v SB2 = Syy*Byy + Syz*Byz ;
925 const float_v SB2_fX = Syy*Byy_fX + Syz*x4 ;
926 const float_v SB2_fY = Syy*xx31 ;
928 const float_v sA3 = syyy*Ayyy ;
929 const float_v sA3_fX = syyy*Ayyy_fX;
930 const float_v sB3 = syyy*Byyy ;
931 const float_v sB3_fX = syyy*Byyy_fX;
932 const float_v sB3_fY = syyy*Byyy_fY;
935 const float_v SA3 = Syyy*Ayyy ;
936 const float_v SA3_fX = Syyy*Ayyy_fX;
937 const float_v SB3 = Syyy*Byyy ;
938 const float_v SB3_fX = Syyy*Byyy_fX;
939 const float_v SB3_fY = Syyy*Byyy_fY;
941 const float_v ht1 = ht*
dz;
942 const float_v ht2 = ht*ht*dz2;
943 const float_v ht3 = ht*ht*ht*dz3;
944 const float_v ht1sA1 = ht1*sA1;
945 const float_v ht1sB1 = ht1*sB1;
946 const float_v ht1SA1 = ht1*SA1;
947 const float_v ht1SB1 = ht1*SB1;
948 const float_v ht2sA2 = ht2*sA2;
949 const float_v ht2SA2 = ht2*SA2;
950 const float_v ht2sB2 = ht2*sB2;
951 const float_v ht2SB2 = ht2*SB2;
952 const float_v ht3sA3 = ht3*sA3;
953 const float_v ht3sB3 = ht3*sB3;
954 const float_v ht3SA3 = ht3*SA3;
955 const float_v ht3SB3 = ht3*SB3;
957 fX (mask) += ((x + ht1SA1 + ht2SA2 + ht3SA3)*dz);
958 fY (mask) += ((y + ht1SB1 + ht2SB2 + ht3SB3)*dz);
959 fTx(mask) += (ht1sA1 + ht2sA2 + ht3sA3);
960 fTy(mask) += (ht1sB1 + ht2sB2 + ht3sB3);
967 const float_v ctdz = c_light*t*
dz;
968 const float_v ctdz2 = c_light*t*dz2;
970 const float_v dqp = fQP - qp0;
971 const float_v t2i = c1*
rcp(t2);
972 const float_v xt2i = x*t2i;
973 const float_v yt2i = y*t2i;
974 const float_v tmp0 = ht1SA1 + c2*ht2SA2 +
c3*ht3SA3;
975 const float_v tmp1 = ht1SB1 + c2*ht2SB2 +
c3*ht3SB3;
976 const float_v tmp2 = ht1sA1 + c2*ht2sA2 +
c3*ht3sA3;
977 const float_v tmp3 = ht1sB1 + c2*ht2sB2 +
c3*ht3sB3;
979 const float_v j02 = dz*(c1 + xt2i*tmp0 + ht1*SA1_fX + ht2*SA2_fX + ht3*SA3_fX);
980 const float_v j12 = dz*( xt2i*tmp1 + ht1*SB1_fX + ht2*SB2_fX + ht3*SB3_fX);
981 const float_v j22 = c1 + xt2i*tmp2 + ht1*sA1_fX + ht2*sA2_fX + ht3*sA3_fX ;
982 const float_v j32 = xt2i*tmp3 + ht1*sB1_fX + ht2*sB2_fX + ht3*sB3_fX ;
984 const float_v j03 = dz*( yt2i*tmp0 + ht1*SA1_fY + ht2*SA2_fY );
985 const float_v j13 = dz*(c1 + yt2i*tmp1 + ht1*SB1_fY + ht2*SB2_fY + ht3*SB3_fY );
986 const float_v j23 = yt2i*tmp2 + ht1*sA1_fY + ht2*sA2_fY ;
987 const float_v j33 = c1 + yt2i*tmp3 + ht1*sB1_fY + ht2*sB2_fY + ht3*sB3_fY ;
989 const float_v j04 = ctdz2*( SA1 + c2*ht1*SA2 +
c3*ht2*SA3 );
990 const float_v j14 = ctdz2*( SB1 + c2*ht1*SB2 +
c3*ht2*SB3 );
991 const float_v j24 = ctdz *( sA1 + c2*ht1*sA2 +
c3*ht2*sA3 );
992 const float_v j34 = ctdz *( sB1 + c2*ht1*sB2 +
c3*ht2*sB3 );
1006 const float_v c42 = fC42, c43 = fC43;
1008 const float_v cj00 = fC00 + fC20*j02 + fC30*j03 + fC40*j04;
1010 const float_v cj20 = fC20 + fC22*j02 + fC32*j03 + c42*j04;
1011 const float_v cj30 = fC30 + fC32*j02 + fC33*j03 + c43*j04;
1013 const float_v cj01 = fC10 + fC20*j12 + fC30*j13 + fC40*j14;
1014 const float_v cj11 = fC11 + fC21*j12 + fC31*j13 + fC41*j14;
1015 const float_v cj21 = fC21 + fC22*j12 + fC32*j13 + c42*j14;
1016 const float_v cj31 = fC31 + fC32*j12 + fC33*j13 + c43*j14;
1020 const float_v cj22 = fC22*j22 + fC32*j23 + c42*j24;
1021 const float_v cj32 = fC32*j22 + fC33*j23 + c43*j24;
1025 const float_v cj23 = fC22*j32 + fC32*j33 + c42*j34;
1026 const float_v cj33 = fC32*j32 + fC33*j33 + c43*j34;
1028 fC40(mask)+= (c42*j02 + c43*j03 + fC44*j04);
1029 fC41(mask)+= (c42*j12 + c43*j13 + fC44*j14);
1030 fC42(mask) = (c42*j22 + c43*j23 + fC44*j24);
1031 fC43(mask) = (c42*j32 + c43*j33 + fC44*j34);
1033 fC00(mask) = (cj00 + j02*cj20 + j03*cj30 + j04*fC40);
1034 fC10(mask) = (cj01 + j02*cj21 + j03*cj31 + j04*fC41);
1035 fC11(mask) = (cj11 + j12*cj21 + j13*cj31 + j14*fC41);
1039 fC20(mask) = (j22*cj20 + j23*cj30 + j24*fC40);
1040 fC30(mask) = (j32*cj20 + j33*cj30 + j34*fC40);
1041 fC21(mask) = (j22*cj21 + j23*cj31 + j24*fC41);
1042 fC31(mask) = (j32*cj21 + j33*cj31 + j34*fC41);
1043 fC22(mask) = (j22*cj22 + j23*cj32 + j24*fC42);
1044 fC32(mask) = (j32*cj22 + j33*cj32 + j34*fC42);
1045 fC33(mask) = (j32*cj23 + j33*cj33 + j34*fC43);
1050 inline float_m PndFTSCATrackParamVector::PassMaterial(
const L1MaterialInfo &info,
const float_v &qp0,
const float_m &mask )
1052 const float_v mass2 = 0.1395679f*0.1395679f;
1054 float_v txtx = fTx*fTx;
1055 float_v tyty = fTy*fTy;
1056 float_v txtx1 = txtx + 1.f;
1057 float_v h = txtx + tyty;
1058 float_v t =
sqrt(txtx1 + tyty);
1060 float_v qp0t = qp0*
t;
1062 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;
1065 float_v
a = ( (t+mass2*qp0*qp0t)*info.
RadThick*s0*s0 );
1069 fC22(mask) += txtx1*
a;
1070 fC32(mask) += fTx*fTy*
a; fC33(mask) += (1.f + tyty)*a;
1091 const float_v &kp0 = 2.33f;
1092 const float_v &kp1 = 0.20f;
1093 const float_v &kp2 = 3.00f;
1094 const float_v &kp3 = 173e-9
f;
1095 const float_v &kp4 = 0.49848f;
1097 const float mK = 0.307075e-3
f;
1098 const float _2me = 1.022e-3
f;
1099 const float_v &rho = kp0;
1100 const float_v &x0 = kp1 * 2.303f;
1101 const float_v &x1 = kp2 * 2.303f;
1102 const float_v &mI = kp3;
1103 const float_v &mZA = kp4;
1104 const float_v &maxT = _2me * bg2;
1108 const float_v x = 0.5f *
log( bg2 );
1109 const float_v lhwI =
log( 28.816f * 1e-9f *
sqrt( rho * mZA ) / mI );
1111 float_m
init = x > x1;
1113 d2(init) = lhwI + x - 0.5f;
1114 const float_v &r = ( x1 -
x ) / ( x1 - x0 );
1115 init = (x >
x0) & (x1 > x);
1116 d2(init) = (lhwI + x - 0.5f + ( 0.5f - lhwI -
x0 ) * r * r * r);
1118 return mK*mZA*( 1.f + bg2 ) / bg2*( 0.5f*
log( _2me*bg2*maxT/(mI*mI) ) - bg2 / ( 1.f + bg2 ) - d2 );
1121 inline void PndFTSCATrackParamVector::EnergyLossCorrection(
const float_v& mass2,
const float_v& radThick, float_v &qp0, float_v direction,
const float_m &mask)
1123 const float_v&
p2 = 1.f/(qp0*qp0);
1124 const float_v& E2 = mass2 +
p2;
1128 float_v
tr =
sqrt(1.f + fTx*fTx + fTy*fTy) ;
1130 const float_v&
dE = bethe * radThick*tr * 2.33f * 9.34961f;
1132 const float_v& E2Corrected = (
sqrt(E2) + direction*
dE) * (
sqrt(E2) + direction*
dE);
1133 float_v
corr =
sqrt( p2/( E2Corrected - mass2 ) );
1135 float_m init = !(corr ==
corr) || !(mask) ;
1143 fC44(mask) *= corr *
corr;
1148 float_v zeta0, zeta1, S00, S10, S11, si;
1149 float_v F00, F10, F20, F30, F40, F01, F11, F21, F31, F41 ;
1150 float_v K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
1152 zeta0 =
fX + extrDx - xV;
1153 zeta1 =
fY + extrDy - yV;
1159 F00 = fC00; F01 = fC10;
1160 F10 = fC10; F11 = fC11;
1161 F20 = J[0]*fC22; F21 = J[3]*fC22;
1162 F30 = J[1]*fC33; F31 = J[4]*fC33;
1163 F40 = J[2]*fC44; F41 = J[5]*fC44;
1165 S00 = info.
C00 + F00 + J[0]*F20 + J[1]*F30 + J[2]*F40;
1166 S10 = info.
C10 + F10 + J[3]*F20 + J[4]*F30 + J[5]*F40;
1167 S11 = info.
C11 + F11 + J[3]*F21 + J[4]*F31 + J[5]*F41;
1169 si = 1.f/(S00*S11 - S10*S10);
1170 float_v S00tmp = S00;
1175 fChi2(active) += zeta0*zeta0*S00 + 2.f*zeta0*zeta1*S10 + zeta1*zeta1*S11;
1177 K00 = F00*S00 + F01*S10; K01 = F00*S10 + F01*S11;
1178 K10 = F10*S00 + F11*S10; K11 = F10*S10 + F11*S11;
1179 K20 = F20*S00 + F21*S10; K21 = F20*S10 + F21*S11;
1180 K30 = F30*S00 + F31*S10; K31 = F30*S10 + F31*S11;
1181 K40 = F40*S00 + F41*S10; K41 = F40*S10 + F41*S11;
1183 fX (active) -= K00*zeta0 + K01*zeta1;
1184 fY (active) -= K10*zeta0 + K11*zeta1;
1185 fTx(active) -= K20*zeta0 + K21*zeta1;
1186 fTy(active) -= K30*zeta0 + K31*zeta1;
1187 fQP(active) -= K40*zeta0 + K41*zeta1;
1189 fC00(active) -= ( K00*F00 + K01*F01 );
1190 fC10(active) -= ( K10*F00 + K11*F01 );
1191 fC11(active) -= ( K10*F10 + K11*F11 );
1192 fC20(active) = -( K20*F00 + K21*F01 );
1193 fC21(active) = -( K20*F10 + K21*F11 );
1194 fC22(active) -= ( K20*F20 + K21*F21 );
1195 fC30(active) = -( K30*F00 + K31*F01 );
1196 fC31(active) = -( K30*F10 + K31*F11 );
1197 fC32(active) = -( K30*F20 + K31*F21 );
1198 fC33(active) -= ( K30*F30 + K31*F31 );
1199 fC40(active) = -( K40*F00 + K41*F01 );
1200 fC41(active) = -( K40*F10 + K41*F11 );
1201 fC42(active) = -( K40*F20 + K41*F21 );
1202 fC43(active) = -( K40*F30 + K41*F31 );
1203 fC44(active) -= ( K40*F40 + K41*F41 );
1208 inline float_m 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 )
1210 const float_v c_light = 0.000299792458f, c1 = 1.f, c2i = 0.5f, c6i = 1.f/6.f, c12i = 1.f/12.f;
1212 const float_v dz = x0 -
fZ;
1213 float_v dz2 = dz*
dz;
1214 float_v dzc6i = dz*c6i;
1215 float_v dz2c12i = dz2*c12i;
1217 float_v xx = fTx*fTx;
1218 float_v yy = fTy*fTy;
1219 float_v xy = fTx*fTy;
1221 float_v Ay = -xx-
c1;
1224 float_v ctdz2 = c_light*
sqrt( c1 + xx + yy )*dz2;
1226 float_v Sx = F.
cx0*c2i + F.
cx1*dzc6i + F.
cx2*dz2c12i ;
1227 float_v Sy = F.
cy0*c2i + F.
cy1*dzc6i + F.
cy2*dz2c12i ;
1228 float_v Sz = F.
cz0*c2i + F.
cz1*dzc6i + F.
cz2*dz2c12i ;
1230 extrDx(active) = ( fTx )*dz ;
1231 extrDy(active) = ( fTy )*dz ;
1232 J04(active) = ctdz2 * (Sx*xy + Sy*Ay + Sz*fTy);
1233 J14(active) = ctdz2 * (Sx*bx - Sy*xy - Sz*fTx);
1280 for (
int i = 0; i < 5; ++
i )
fP[i].setZero();
1281 for (
int i = 0; i < 15; ++
i ) fC[i].setZero();
1292 const float_v r =
sqrt( r0*r0+r1*r1 );
1310 float_v
X()
const {
return fX; }
1311 float_v
Y()
const {
return fP[0]; }
1312 float_v
Z()
const {
return fP[1]; }
1319 float_v
X0()
const {
return X(); }
1320 float_v
X1()
const {
return Y(); }
1321 float_v
X2()
const {
return Z(); }
1360 const float_v&
Par(
int i )
const {
return fP[
i]; }
1361 const float_v&
Cov(
int i )
const {
return fC[
i]; }
1365 const float_v *
Par()
const {
return fP; }
1366 const float_v *
Cov()
const {
return fC; }
1373 for(
int i=0; i<5; i++)
fP[i](
m) = param.
Par()[
i];
1374 for(
int i=0; i<15; i++) fC[i](
m) = param.
Cov()[
i];
1384 for(
int i=0; i<5; i++)
fP[i][iV] = param.
Par()[
i][iVa];
1385 for(
int i=0; i<15; i++) fC[i][iV] = param.
Cov()[
i][iVa];
1386 fX[iV] = param.
X()[iVa];
1394 void SetPar(
int i,
const float_v &v,
const float_m &
m ) {
fP[
i](
m ) = v; }
1396 void SetCov(
int i,
const float_v &v,
const float_m &
m ) { fC[
i](
m ) = v; }
1401 void SetX(
const float_v &v,
const float_m &
m ) {
fX( m ) =
v; }
1402 void SetY(
const float_v &v,
const float_m &
m ) {
fP[0](
m ) = v; }
1403 void SetZ(
const float_v &v,
const float_m &
m ) {
fP[1](
m ) = v; }
1407 void SetDzDs(
const float_v &v,
const float_m &
m ) {
fP[3](
m ) = v; }
1410 void SetQPt(
const float_v &v,
const float_m &
m ) {
fP[4](
m ) = v; }
1430 float_v
GetS(
const float_v &x,
const float_v &y,
const float_v &Bz )
const;
1432 void GetDCAPoint(
const float_v &x,
const float_v &y,
const float_v &
z,
1433 float_v *px, float_v *py, float_v *
pz,
const float_v &Bz )
const;
1437 const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi = .999f );
1439 float_m
TransportToX0(
const float_v &x,
const float_v &Bz,
const float maxSinPhi = .999f,
const float_m &mask = float_m(
true ) );
1442 const float_v &Bz,
const float maxSinPhi = .999f, float_v *DL = 0,
const float_m &mask = float_m(
true ) );
1444 float_m
TransportToX0(
const float_v &x,
const float_v &sinPhi0,
1445 const float_v &Bz,
const float_v maxSinPhi = .999f,
const float_m &mask = float_m(
true ) );
1448 PndFTSCATrackFitParam &
par,
const float_v &XOverX0,
1449 const float_v &XThimesRho,
1450 const float_v &Bz,
const float maxSinPhi = .999f,
const float_m &mask = float_m(
true ) );
1453 PndFTSCATrackFitParam &par,
const float_v &XOverX0,
1454 const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi = .999f );
1457 const float maxSinPhi = .999f,
const float_m &mask = float_m(
true ) );
1458 float_m
Rotate(
const float_v &alpha,
const float maxSinPhi = .999f,
const float_m &mask = float_m(
true ) );
1459 void RotateXY( float_v alpha, float_v &x, float_v &y, float_v &
sin,
const float_m &mask = float_m(
true ) )
const ;
1461 float_m
FilterWithMaterial(
const float_v &y,
const float_v &
z, float_v err2Y, float_v errYZ, float_v err2Z,
1462 float maxSinPhi=0.999f,
const float_m &mask = float_m(
true ),
const int_v& hitNDF = int_v(2) ,
const float_v& chi2Cut = 10e10f );
1465 float maxSinPhi=0.999f,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f );
1467 float maxSinPhi=0.999f,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f );
1471 const float_v &kp0 = 2.33f,
1472 const float_v &kp1 = 0.20f,
1473 const float_v &kp2 = 3.00f,
1474 const float_v &kp3 = 173e-9f,
1475 const float_v &kp4 = 0.49848f
1483 const PndFTSCATrackFitParam &par,
const float_m &_mask );
1491 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 ) );
1492 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 ) );
1495 float_m
Transport(
const int_v& ista,
const PndFTSCAParam& param,
const float_m &mask = float_m(
true ) );
1497 float_m
Filter(
const FTSCAHitV& hit,
const PndFTSCAParam& param,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f );
1500 float_m
Filter(
const FTSCAHit& hit,
const PndFTSCAParam& param,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f );
1519 const float_v &Bz,
const float_v maxSinPhi,
const float_m &_mask )
1528 debugKF() <<
"Start TransportToX0(" << x <<
", " << _mask <<
")\n" << *
this << std::endl;
1530 const float_v &ey = sinPhi0;
1531 const float_v &
dx = x -
X();
1534 const float_v &dxBz = dx * Bz;
1535 const float_v &dS = dx * exi;
1536 const float_v &
h2 = dS * exi * exi;
1537 const float_v &
h4 = .5f * h2 * dxBz;
1540 std::cout <<
" TrTo-sinPhi0 = " << sinPhi0 << std::endl;
1544 const float_v &sinPhi =
SinPhi() + dxBz *
QPt();
1547 std::cout <<
" TrTo-sinPhi = " << sinPhi << std::endl;
1549 float_m mask = _mask &&
CAMath::Abs( exi ) <= 1.e4f;
1550 mask &= ( (
CAMath::Abs( sinPhi ) <= maxSinPhi) || (maxSinPhi <= 0.f) );
1554 fP[0]( mask ) += dS * ey + h2 * (
SinPhi() - ey ) + h4 *
QPt();
1555 fP[1]( mask ) += dS *
DzDs();
1556 fP[2]( mask ) = sinPhi;
1561 const float_v
c20 = fC[3];
1563 const float_v
c22 = fC[5];
1565 const float_v c31 = fC[7];
1567 const float_v c33 = fC[9];
1568 const float_v c40 = fC[10];
1570 const float_v c42 = fC[12];
1572 const float_v c44 = fC[14];
1574 const float_v two( 2.f );
1576 fC[0] ( mask ) += h2 * h2 * c22 + h4 * h4 * c44
1577 + two * ( h2 * c20 + h4 * ( c40 + h2 * c42 ) );
1580 fC[2] ( mask ) += dS * ( two * c31 + dS * c33 );
1582 fC[3] ( mask ) += h2 * c22 + h4 * c42 + dxBz * ( c40 + h2 * c42 + h4 * c44 );
1584 const float_v &dxBz_c44 = dxBz * c44;
1585 fC[12]( mask ) += dxBz_c44;
1586 fC[5] ( mask ) += dxBz * ( two * c42 + dxBz_c44 );
1589 fC[7] ( mask ) += dS * c33;
1593 fC[10]( mask ) += h2 * c42 + h4 * c44;
1598 debugKF() << mask <<
"\n" << *
this << std::endl;
1605 #define VALGRIND_CHECK_VALUE_IS_DEFINED( mask )
1606 #define VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( v, k )
1607 #define VALGRIND_CHECK_MEM_IS_DEFINED( v, k );
1608 #define VALGRIND_CHECK_MEM_IS_ADDRESSABLE( v, k );
1610 #include <valgrind/memcheck.h>
1611 #define VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( v, k ) \
1613 __typeof__( v + v ) tmp( v ); \
1614 tmp.setZero( !k ); \
1615 VALGRIND_CHECK_VALUE_IS_DEFINED( tmp ); \
1858 if ( (abs(alpha) < 1e-6f || !mask).isFull() )
return mask;
1863 const float_v cosPhi = cP * cA + sP * sA;
1864 const float_v sinPhi = -cP * sA + sP * cA;
1868 mReturn &= abs(alpha) < 3.1415f * 0.25f;
1870 const float_v j0 = cP / cosPhi;
1871 const float_v j2 = cosPhi / cP;
1873 SetX( x*cA + y*sA, mReturn);
1874 SetY( -x*sA + y*cA, mReturn );
1886 fC[0](mReturn) *= j0 * j0;
1887 fC[1](mReturn) *= j0;
1888 fC[3](mReturn) *= j0;
1889 fC[6](mReturn) *= j0;
1890 fC[10](mReturn) *= j0;
1892 fC[3](mReturn) *= j2;
1893 fC[4](mReturn) *= j2;
1894 fC[5](mReturn) *= j2 * j2;
1895 fC[8](mReturn) *= j2;
1896 fC[12](mReturn) *= j2;
1906 if ( (abs(alpha) < 1e-6f || !mask).isFull() )
return;
1911 x(mask) = (
X()*cA +
Y()*sA );
1912 y(mask) = ( -
X()*sA +
Y()*cA );
1919 float_v zeta0, zeta1, S00, S10, S11, si;
1920 float_v F00, F10, F20, F30, F40, F01, F11, F21, F31, F41 ;
1921 float_v K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
1922 float_v& c00 = fC[0];
1923 float_v&
c10 = fC[1];
1924 float_v&
c11 = fC[2];
1925 float_v&
c20 = fC[3];
1926 float_v&
c21 = fC[4];
1927 float_v&
c22 = fC[5];
1928 float_v& c30 = fC[6];
1929 float_v& c31 = fC[7];
1930 float_v& c32 = fC[8];
1931 float_v& c33 = fC[9];
1932 float_v& c40 = fC[10];
1933 float_v& c41 = fC[11];
1934 float_v& c42 = fC[12];
1935 float_v& c43 = fC[13];
1936 float_v& c44 = fC[14];
1938 zeta0 =
Y() + extrDy - yV;
1939 zeta1 =
Z() + extrDz - zV;
1945 F00 = c00; F01 =
c10;
1947 F20 = J[0]*
c22; F21 = J[3]*
c22;
1948 F30 = J[1]*c33; F31 = J[4]*c33;
1949 F40 = J[2]*c44; F41 = J[5]*c44;
1951 S00 = info.
C00() + F00 + J[0]*F20 + J[1]*F30 + J[2]*F40;
1952 S10 = info.
C10() + F10 + J[3]*F20 + J[4]*F30 + J[5]*F40;
1953 S11 = info.
C11() + F11 + J[3]*F21 + J[4]*F31 + J[5]*F41;
1955 si = 1.f/(S00*S11 - S10*S10);
1956 float_v S00tmp = S00;
1961 fChi2(active) += zeta0*zeta0*S00 + 2.f*zeta0*zeta1*S10 + zeta1*zeta1*S11;
1963 K00 = F00*S00 + F01*S10; K01 = F00*S10 + F01*S11;
1964 K10 = F10*S00 + F11*S10; K11 = F10*S10 + F11*S11;
1965 K20 = F20*S00 + F21*S10; K21 = F20*S10 + F21*S11;
1966 K30 = F30*S00 + F31*S10; K31 = F30*S10 + F31*S11;
1967 K40 = F40*S00 + F41*S10; K41 = F40*S10 + F41*S11;
1969 fP[0](active) -= K00*zeta0 + K01*zeta1;
1970 fP[1](active) -= K10*zeta0 + K11*zeta1;
1971 fP[2](active) -= K20*zeta0 + K21*zeta1;
1972 fP[3](active) -= K30*zeta0 + K31*zeta1;
1973 fP[4](active) -= K40*zeta0 + K41*zeta1;
1975 c00(active) -= ( K00*F00 + K01*F01 );
1976 c10(active) -= ( K10*F00 + K11*F01 );
1977 c11(active) -= ( K10*F10 + K11*F11 );
1978 c20(active) = -( K20*F00 + K21*F01 );
1979 c21(active) = -( K20*F10 + K21*F11 );
1980 c22(active) -= ( K20*F20 + K21*F21 );
1981 c30(active) = -( K30*F00 + K31*F01 );
1982 c31(active) = -( K30*F10 + K31*F11 );
1983 c32(active) = -( K30*F20 + K31*F21 );
1984 c33(active) -= ( K30*F30 + K31*F31 );
1985 c40(active) = -( K40*F00 + K41*F01 );
1986 c41(active) = -( K40*F10 + K41*F11 );
1987 c42(active) = -( K40*F20 + K41*F21 );
1988 c43(active) = -( K40*F30 + K41*F31 );
1989 c44(active) -= ( K40*F40 + K41*F41 );
1996 const float_v &ey =
SinPhi();
1997 const float_v &
dx = x -
X();
2000 const float_v &dxBz = dx * cBz;
2001 const float_v &dS = dx * exi;
2002 const float_v &
h2 = dS * exi * exi;
2003 const float_v &
h4 = .5f * h2 * dxBz;
2005 float_m mask = active &&
CAMath::Abs( exi ) <= 1.e4f;
2007 extrDy(active) = dS*ey;
2008 extrDz(active) = dS*
DzDs();
2021 #endif // !PANDA_FTS
static float_v BetheBlochGas(const float_v &bg)
void SetAngle(const float_v &v)
void SetZ(const float_v &v)
void SetQPt(const float_v &v)
void SetCov(int i, const float_v &v)
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)
const float_v * Par() const
void SetX(const float_v &v)
float_m CorrectForMeanMaterial(const float_v &xOverX0, const float_v &xTimesRho, const PndFTSCATrackFitParam &par, const float_m &_mask)
void SetDzDs(const float_v &v)
friend F32vec4 sqrt(const F32vec4 &a)
static const UInt_t success
static T Sqrt(const T &x)
void SetNDF(const int_v &v)
void SetSignCosPhi(const float_v &v)
friend F32vec4 sin(const F32vec4 &a)
float_v GetCosPhiPositive() const
friend F32vec4 log(const F32vec4 &a)
const float_v & C11() const
void SetChi2(const float_v &v)
std::ostream & operator<<(std::ostream &o, const PndEventInfo &a)
float_v QMomentum() const
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)
float_v GetS(const float_v &x, const float_v &y, const float_v &Bz) const
float_v GetKappa(const float_v &Bz) const
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))
static float_v ApproximateBetheBloch(const float_v &beta2)
void SetSinPhi(const float_v &v, const float_m &m)
float_m AddTarget(const FTSCATarget &target, const float_m &mask=float_m(true))
float_v GetSignCosPhi() const
void SetErr2QPt(float_v v)
float_v GetCosPhi() const
float_v Err2SinPhi() const
float_v GetSinPhi() const
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))
float_v GetDistXZ2(const PndFTSCATrackParamVector &t) const
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_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)
PndFTSCATrackParamVector()
basic_ostream< char, char_traits< char > > ostream
const float_v * Cov() const
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))
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)
void InitCovMatrix(float_v d2QMom=0.f)
friend std::istream & operator>>(std::istream &, PndFTSCATrackParamVector &)
basic_istream< char, char_traits< char > > istream
static float_v BetheBlochSolid(const float_v &bg)
float_m TransportToX0WithMaterial(const float_v &x, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi=.999f)
const float_v & C10() const
float_v SignCosPhi() const
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)
void RotateXY(float_v alpha, float_v &x, float_v &y, float_v &sin, const float_m &mask=float_m(true)) const
void SetQMomentum(const float_v &v)
TBuffer & operator>>(TBuffer &buf, PndAnaPidSelector *&obj)
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
float_m TransportToX0(const float_v &x, const float_v &Bz, const float maxSinPhi=.999f, const float_m &mask=float_m(true))
float_v Err2QMomentum() const
void SetSignCosPhi(const float_v &v, const float_m &m)
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)
void SetPar(int i, const float_v &v)
const float_v & Cov(int i) const
const float_v & Par(int i) const
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))
friend std::ostream & operator<<(std::ostream &, const PndFTSCATrackParamVector &)
PndCATrackParamVector TrackParamVector
void SetX(const float_v &v, const float_m &m)
float_v GetDist2(const PndFTSCATrackParamVector &t) const
const float_v & C00() const
void ConvertTrackParamToVector(PndFTSCATrackParam t0[float_v::Size], int nTracksV)
PndFTSCANoDebugStream & debugKF()
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)