136 UNUSED_PARAM1(param);
160 return dx*dx + dy*dy + dz*
dz;
169 return dx*dx + dz*
dz;
180 const float_v &
x = _x -
GetX();
181 const float_v &
y = _y -
GetY();
182 float_v dS = x * ex + y * ey;
184 if ( !mask.isEmpty() ) {
185 dS( mask ) =
CAMath::ATan2( k * dS, 1 + k * ( x * ey - y * ex ) ) / k;
191 float_v *xp, float_v *yp, float_v *zp,
const float_v &Bz )
const
195 const float_v &
x0 =
GetX();
196 const float_v &
y0 =
GetY();
200 const float_v &
dx = x -
x0;
201 const float_v &
dy = y -
y0;
202 const float_v &ax = dx * k + ey;
203 const float_v &ay = dy * k - ex;
204 const float_v &
a =
sqrt( ax * ax + ay * ay );
205 *xp = x0 + ( dx - ey * ( ( dx * dx + dy *
dy ) * k - 2.
f * ( -dx * ey + dy * ex ) ) / ( a + 1.
f ) ) / a;
206 *yp = y0 + ( dy + ex * ( ( dx * dx + dy *
dy ) * k - 2.
f * ( -dx * ey + dy * ex ) ) / ( a + 1.
f ) ) / a;
207 const float_v
s =
GetS( x, y, Bz );
210 const float_m mask =
CAMath::Abs( k ) > 1.e-2
f && dZ > .1f;
228 const float_v ex = t0.
CosPhi();
229 const float_v ey = t0.
SinPhi();
230 const float_v k = t0.
QPt() * Bz;
231 const float_v
dx = x -
X();
233 float_v ey1 = k * dx + ey;
240 const float_v dx2 = dx *
dx;
241 const float_v ss = ey + ey1;
242 const float_v cc = ex + ex1;
244 const float_v cci = 1.f / cc;
245 const float_v exi = 1.f / ex;
246 const float_v ex1i = 1.f / ex1;
250 const float_v tg = ss * cci;
252 const float_v
dy = dx * tg;
258 const float_v
dz = dS * t0.
DzDs();
261 ( *DL )( mask ) = -dS * CAMath::Sqrt( 1.f + t0.
DzDs() * t0.
DzDs() );
272 const float_v
h2 = dx * ( 1.f + ey * ey1 + ex * ex1 ) * exi * ex1i * cci;
273 const float_v
h4 = dx2 * ( cc + ss * ey1 * ex1i ) * cci * cci * Bz;
274 const float_v dxBz = dx * Bz;
285 fX( mask ) =
X() +
dx;
286 fP[0]( mask ) =
Y() + dy + h2 * d[0] + h4 * d[2];
287 fP[1]( mask ) =
Z() + dz + dS * d[1];
288 fP[2]( mask ) = t0.
SinPhi() + d[0] + dxBz * d[2];
291 const float_v c00 =
fC[0];
292 const float_v
c10 =
fC[1];
293 const float_v
c11 =
fC[2];
294 const float_v
c20 =
fC[3];
295 const float_v
c21 =
fC[4];
296 const float_v
c22 =
fC[5];
297 const float_v c30 =
fC[6];
298 const float_v c31 =
fC[7];
299 const float_v c32 =
fC[8];
300 const float_v c33 =
fC[9];
301 const float_v c40 =
fC[10];
302 const float_v c41 =
fC[11];
303 const float_v c42 =
fC[12];
304 const float_v c43 =
fC[13];
305 const float_v c44 =
fC[14];
307 fC[0]( mask ) = ( c00 + h2 * h2 * c22 + h4 * h4 * c44
308 + 2.f * ( h2 * c20 + h4 * c40 + h2 * h4 * c42 ) );
310 fC[1]( mask ) = c10 + h2 * c21 + h4 * c41 + dS * ( c30 + h2 * c32 + h4 * c43 );
311 fC[2]( mask ) = c11 + 2.f * dS * c31 + dS * dS * c33;
313 fC[3]( mask ) = c20 + h2 * c22 + h4 * c42 + dxBz * ( c40 + h2 * c42 + h4 * c44 );
314 fC[4]( mask ) = c21 + dS * c32 + dxBz * ( c41 + dS * c43 );
315 fC[5]( mask ) = c22 + 2.f * dxBz * c42 + dxBz * dxBz * c44;
317 fC[6]( mask ) = c30 + h2 * c32 + h4 * c43;
318 fC[7]( mask ) = c31 + dS * c33;
319 fC[8]( mask ) = c32 + dxBz * c43;
322 fC[10]( mask ) = c40 + h2 * c42 + h4 * c44;
323 fC[11]( mask ) = c41 + dS * c43;
324 fC[12]( mask ) = c42 + dxBz * c44;
325 fC[13]( mask ) = c43;
326 fC[14]( mask ) = c44;
334 const float maxSinPhi,
const float_m &mask )
348 const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi,
const float_m &mask_ )
358 float_m mask = mask_ &&
TransportToX( x, t0, Bz, maxSinPhi, &dl, mask_ );
363 const float_v dzds2 = t0.
DzDs()*t0.
DzDs();
365 float_v koeff =
sqrt( (1 + dzds2)*( 1 + sphi2 ) );
373 const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi )
382 const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi )
418 const float mK = 0.307075e-3
f;
419 const float _2me = 1.022e-3
f;
420 const float_v &rho = kp0;
421 const float_v &
x0 = kp1 * 2.303f;
422 const float_v &x1 = kp2 * 2.303f;
423 const float_v &mI = kp3;
424 const float_v &mZA = kp4;
425 const float_v &maxT = _2me * bg2;
431 d2( x > x1 ) = lhwI + x - 0.5f;
432 const float_v &
r = ( x1 -
x ) / ( x1 - x0 );
433 d2( x > x0 && x <= x1 ) = lhwI + x - 0.5f + ( 0.5f - lhwI -
x0 ) * r * r * r;
435 return mK*mZA*( float_v(
Vc::One ) + bg2 ) / bg2*( 0.5
f*
CAMath::Log( maxT * maxT / ( mI*mI ) ) - bg2 / ( float_v(
Vc::One ) + bg2 ) - d2 );
459 const float_v rho = 0.9e-3
f;
460 const float_v
x0 = 2.f;
461 const float_v x1 = 4.f;
462 const float_v mI = 140.e-9
f;
463 const float_v mZA = 0.49555f;
479 const float_v &beta2_1subBeta2 = beta2 / ( float_v(
Vc::One ) - beta2 );
480 const float_v &_0p000153_beta2 = 0.153e-3
f / beta2;
481 const float log_3p5mul5940 = 9.942227380852058f;
482 const float log_5940 = 8.68946441235669f;
483 const float_v log_beta2_1subBeta2 =
CAMath::Log( beta2_1subBeta2 );
485 float_v ret = _0p000153_beta2 * ( log_5940 + log_beta2_1subBeta2 - beta2 );
486 ret( beta2_1subBeta2 > 3.5
f*3.5
f ) =
487 _0p000153_beta2 * ( log_3p5mul5940 + 0.5f * log_beta2_1subBeta2 - beta2 );
488 ret.setZero( beta2 >= float_v(
Vc::One ) );
498 const float_v k2 =
fP[4] *
fP[4];
499 const float_v mass2 = mass * mass;
500 const float_v beta2 = p2 / ( p2 + mass2 * k2 );
502 float_v pp2 = 10000.f; pp2( k2 > 1.e-8
f ) = p2 / k2;
508 par.
fTheta2 = 14.1f * 14.1f / ( beta2 * pp2 * 1.e6f );
513 const float knst = 0.07f;
519 par.
fK43 = fP[3] * fP[4] * par.
fK22;
520 par.
fK44 = fP[3] * fP[3] * fP[4] * fP[4];
532 float_v &fC22 =
fC[5];
533 float_v &fC33 =
fC[9];
534 float_v &fC40 =
fC[10];
535 float_v &fC41 =
fC[11];
536 float_v &fC42 =
fC[12];
537 float_v &fC43 =
fC[13];
538 float_v &fC44 =
fC[14];
542 const float_v &
dE = par.
fBethe * xTimesRho;
544 float_m mask = _mask && dE <= 0.3f * par.
fE;
546 mask &= corr >= 0.3f && corr <= 1.3f;
548 fP[4]( mask ) *= corr;
549 fC40 ( mask ) *=
corr;
550 fC41 ( mask ) *=
corr;
551 fC42 ( mask ) *=
corr;
552 fC43 ( mask ) *=
corr;
553 fC44 ( mask ) *= corr *
corr;
558 assert( xOverX0 >= 0 );
559 const float_v &theta2 = par.
fTheta2 * xOverX0;
560 fC22( mask ) += theta2 * par.
fK22 * ( float_v(
Vc::One ) -
fP[2] *
fP[2] );
561 fC33( mask ) += theta2 * par.
fK33;
562 fC43( mask ) += theta2 * par.
fK43;
563 fC44( mask ) += theta2 * par.
fK44;
569 const float maxSinPhi,
const float_m &mask )
572 if ( (
CAMath::Abs(alpha) < 1e-6
f || !mask).isFull() )
return mask;
577 const float_v cosPhi = cP * cA + sP * sA;
578 const float_v sinPhi = -cP * sA + sP * cA;
580 float_m ReturnMask(mask);
583 float_v tmp = alpha*0.15915494f;
584 ReturnMask &= abs(tmp - round(tmp)) < 0.167f;
592 const float_v j0 = cP / cosPhi;
593 const float_v j2 = cosPhi / cP;
594 const float_v
d =
SinPhi() - sP;
596 SetX( x0*cA +
y0*sA, ReturnMask );
597 SetY(-x0*sA +
y0*cA, ReturnMask );
603 fC[0](ReturnMask) *= j0 * j0;
604 fC[1](ReturnMask) *= j0;
605 fC[3](ReturnMask) *= j0;
606 fC[6](ReturnMask) *= j0;
607 fC[10](ReturnMask) *= j0;
609 fC[3](ReturnMask) *= j2;
610 fC[4](ReturnMask) *= j2;
611 fC[5](ReturnMask) *= j2 * j2;
612 fC[8](ReturnMask) *= j2;
613 fC[12](ReturnMask) *= j2;
622 assert( maxSinPhi > 0.
f );
625 const float_v c00 =
fC[0];
626 const float_v
c10 =
fC[1];
627 const float_v
c11 =
fC[2];
628 const float_v
c20 =
fC[3];
629 const float_v
c21 =
fC[4];
631 const float_v c30 =
fC[6];
632 const float_v c31 =
fC[7];
635 const float_v c40 =
fC[10];
636 const float_v c41 =
fC[11];
653 float_v
d = float_v(
Vc::One ) / ( err2Y*err2Z - errYZ*errYZ );
657 success &= (err2Y > 1.e-8
f ) && ( err2Z > 1.e-8
f );
659 const float_v mS0 = err2Z*
d;
660 const float_v mS1 = -errYZ*
d;
661 const float_v mS2 = err2Y*
d;
666 k00 = c00 * mS0 + c10*mS1, k01 = c00 * mS1 + c10*mS2,
667 k10 = c10 * mS0 + c11*mS1, k11 = c10 * mS1 + c11*mS2,
668 k20 = c20 * mS0 + c21*mS1, k21 = c20 * mS1 + c21*mS2,
669 k30 = c30 * mS0 + c31*mS1, k31 = c30 * mS1 + c31*mS2,
670 k40 = c40 * mS0 + c41*mS1, k41 = c40 * mS1 + c41*mS2;
672 const float_v sinPhi = fP[2] + k20 * z0 + k21 * z1;
676 fNDF( static_cast<int_m>(success) ) += hitNDF;
677 fChi2(success) += mS0 * z0 * z0 + 2 * z0 * z1 * mS1 + mS2 * z1 * z1;
678 success &=
fChi2 < chi2Cut;
679 if ( success.isEmpty() )
return success;
685 fP[ 0](
success) += k00 * z0 + k01 * z1;
686 fP[ 1](
success) += k10 * z0 + k11 * z1;
688 fP[ 3](
success) += k30 * z0 + k31 * z1;
689 fP[ 4](
success) += k40 * z0 + k41 * z1;
690 fC[ 0](
success) -= (k00 * c00 + k01 * c10);
692 fC[ 1](
success) -= (k10 * c00 + k11 * c10);
693 fC[ 2](
success) -= (k10 * c10 + k11 * c11);
695 fC[ 3](
success) -= (k20 * c00 + k21 * c10);
696 fC[ 4](
success) -= (k20 * c10 + k21 * c11);
697 fC[ 5](
success) -= (k20 * c20 + k21 * c21);
699 fC[ 6](
success) -= (k30 * c00 + k31 * c10);
700 fC[ 7](
success) -= (k30 * c10 + k31 * c11);
701 fC[ 8](
success) -= (k30 * c20 + k31 * c21);
702 fC[ 9](
success) -= (k30 * c30 + k31 * c31);
704 fC[10](
success) -= (k40 * c00 + k41 * c10);
705 fC[11](
success) -= (k40 * c10 + k41 * c11);
708 fC[12](
success) -= (k40 * c20 + k41 * c21);
709 fC[13](
success) -= (k40 * c30 + k41 * c31);
710 fC[14](
success) -= (k40 * c40 + k41 * c41);
719 assert( maxSinPhi > 0.
f );
721 success &= ( err2 > 1.e-8
f );
723 const float_v& c00 =
fC[0];
724 const float_v&
c10 =
fC[1];
725 const float_v&
c11 =
fC[2];
727 const float_v& sb = info.
sin;
728 const float_v& cb = info.
cos;
730 const float_v u = cb*y + sb*
z;
731 const float_v zeta = cb*
fP[0] + sb*
fP[1] - u;
734 const float_v F0 = cb*c00 + sb*
c10;
735 const float_v F1 = cb*c10 + sb*
c11;
737 const float_v HCH = ( F0*cb + F1*sb );
739 const float_v wi = 1/( err2 + HCH );
740 const float_v zetawi = zeta *wi;
742 fChi2(success) += zeta * zetawi;
743 success &=
fChi2 < chi2Cut;
744 if ( success.isEmpty() )
return success;
746 const float_v&
c20 =
fC[3];
747 const float_v&
c21 =
fC[4];
748 const float_v& c30 =
fC[6];
749 const float_v& c31 =
fC[7];
750 const float_v& c40 =
fC[10];
751 const float_v& c41 =
fC[11];
753 const float_v F2 = cb*c20 + sb*
c21;
754 const float_v F3 = cb*c30 + sb*c31;
755 const float_v F4 = cb*c40 + sb*c41;
758 const float_v K1 = F1*wi;
759 const float_v K2 = F2*wi;
760 const float_v K3 = F3*wi;
761 const float_v K4 = F4*wi;
764 const float_v sinPhi =
fP[2] - F2*zetawi;
768 fNDF( static_cast<int_m>(success) ) += 1;
802 float_m active = mask;
804 active &=
TransportToX( param.
GetR( ista, active ), tE, param.
cBz(), 0.999f, NULL, active );
818 float_m active = mask & hit.
IsValid();
848 float_m active = mask;
872 float_m active = mask;
879 active &=
TransportJ0ToX0( target.
X0(),
static_cast<float_v
>(target.
B()), eY, eZ, J, active );
881 fNDF (static_cast<int_m>(active)) += target.
NDF();
961 const float_v ey =
SinPhi();
963 const float_v
dx = x -
X();
965 float_m mask = _mask &&
CAMath::Abs( ey ) <= .999f;
967 const float_v exi = 1.f / ex;
968 const float_v dS = dx * exi;
969 const float_v
h2 = dx * exi * exi *exi;
970 const float_v
h4 = 0.5f*dx* Bz *
h2;
971 const float_v dxBz = dx * Bz;
974 fP[0] += dS*ey + h4 *
fP[4];
975 fP[1] += dS *
DzDs();
976 fP[2] += dxBz * fP[4];
978 const float_v c00 =
fC[0];
979 const float_v
c10 =
fC[1];
980 const float_v
c11 =
fC[2];
981 const float_v
c20 =
fC[3];
982 const float_v
c21 =
fC[4];
983 const float_v
c22 =
fC[5];
984 const float_v c30 =
fC[6];
985 const float_v c31 =
fC[7];
986 const float_v c32 =
fC[8];
987 const float_v c33 =
fC[9];
988 const float_v c40 =
fC[10];
989 const float_v c41 =
fC[11];
990 const float_v c42 =
fC[12];
991 const float_v c43 =
fC[13];
992 const float_v c44 =
fC[14];
994 fC[0] = ( c00 + h2 * h2 * c22 + h4 * h4 * c44
995 + 2.f * ( h2 * c20 + h4 * c40 + h2 * h4 * c42 ) );
997 fC[1] = c10 + h2 * c21 + h4 * c41 + dS * ( c30 + h2 * c32 + h4 * c43 );
998 fC[2] = c11 + 2.f * dS * c31 + dS * dS * c33;
1000 fC[3] = c20 + h2 * c22 + h4 * c42 + dxBz * ( c40 + h2 * c42 + h4 * c44 );
1001 fC[4] = c21 + dS * c32 + dxBz * ( c41 + dS * c43 );
1002 fC[5] = c22 + 2.f * dxBz * c42 + dxBz * dxBz * c44;
1004 fC[6] = c30 + h2 * c32 + h4 * c43;
1005 fC[7] = c31 + dS * c33;
1006 fC[8] = c32 + dxBz * c43;
1008 fC[10] = c40 + h2 * c42 + h4 * c44;
1009 fC[11] = c41 + dS * c43;
1010 fC[12] = c42 + dxBz * c44;
1017 float_m active = mask & hit.
IsValid();
1036 assert( maxSinPhi > 0.
f );
1039 const float_v c00 =
fC[0];
1040 const float_v
c10 =
fC[1];
1041 const float_v
c11 =
fC[2];
1042 const float_v
c20 =
fC[3];
1043 const float_v
c21 =
fC[4];
1051 float_v d1 = ( err2Y*err2Z - errYZ*errYZ );
1054 success &= (err2Y > 1.e-8
f ) && ( err2Z > 1.e-8
f );
1056 const float_v mS0 = err2Z;
1057 const float_v mS1 = -errYZ;
1058 const float_v mS2 = err2Y;
1062 const float_v k20 = (c20 * mS0 + c21*mS1), k21 = (c20 * mS1 + c21*mS2);
1063 const float_v sinPhi = d1*fP[2] + ( k20 * z0 + k21 * z1 );
1065 float_v chi2 = ( mS0 * z0 * z0 + 2 * z0 * z1 * mS1 + mS2 * z1 * z1 );
1066 success &= chi2 < d1*(chi2Cut-
fChi2);
1075 assert( maxSinPhi > 0.
f );
1077 success &= ( err2 > 1.e-8
f );
1079 const float_v& c00 = fC[0];
1080 const float_v&
c10 = fC[1];
1081 const float_v&
c11 = fC[2];
1083 const float_v& sb = info.sin;
1084 const float_v& cb = info.cos;
1086 const float_v u = cb*
y + sb*
z;
1087 const float_v zeta = cb*fP[0] + sb*fP[1] - u;
1090 const float_v F0 = cb*c00 + sb*
c10;
1091 const float_v F1 = cb*c10 + sb*
c11;
1093 const float_v HCH = ( F0*cb + F1*sb );
1095 const float_v w = ( err2 + HCH );
1096 success &= zeta*zeta < w*(chi2Cut - fChi2);
static T ASin(const T &x)
float_m FilterVtx(const float_v &xV, const float_v &yV, const PndCAX1X2MeasurementInfo &info, float_v &extrDx, float_v &extrDy, float_v J[], const float_m &active=float_m(true))
float_v GetCosPhi() const
void InitByTarget(const PndCATarget &target)
const PndCAFieldValue & B() 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))
float_m Rotate(const float_v &alpha, PndCATrackLinearisationVector &t0, const float maxSinPhi=.999f, const float_m &mask=float_m(true))
float_m TransportToX(const float_v &x, const float_v &Bz, const float maxSinPhi=.999f, const float_m &mask=float_m(true))
void CalculateFitParameters(PndCATrackFitParam &par, const float_v &mass=0.13957f)
float_m Transport0ToX(const float_v &x, const float_v &Bz, const float_m &mask)
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 SetAngle(const float_v &v)
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 SetSignCosPhi(const float_v &v)
void SetSinPhi(const float_v &v)
friend F32vec4 sqrt(const F32vec4 &a)
static const UInt_t success
static T Sqrt(const T &x)
void SetChi2(const float_v &v)
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
const PndCAStation & Station(short i) const
float_v GetS(const float_v &x, const float_v &y, const float_v &Bz) const
static float_v BetheBlochSolid(const float_v &bg)
static T Round(const T &x)
void SetCosPhi(float_v v)
float_m Filter(const PndCAHitV &hit, const PndCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f)
float_m Transport0(const int_v &ista, const PndCAParam ¶m, const float_m &mask=float_m(true))
float_m TransportToXWithMaterial(const float_v &x, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi=.999f)
float_m Accept(const PndCAHit &hit, const PndCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f) const
void InitCovMatrix(float_v d2QMom=0.f)
float_m AddTarget(const PndCATarget &target, const float_m &mask=float_m(true))
void SetQPt(const float_v &v)
static T Min(const T &x, const T &y)
static float_v BetheBlochGas(const float_v &bg)
void SetCov(int i, const float_v &v)
static float_v ApproximateBetheBloch(const float_v &beta2)
static T ATan2(const T &y, const T &x)
float_v GetDist2(const PndCATrackParamVector &t) const
void SetSinPhi(float_v v)
void SetY(const float_v &v)
float_m CorrectForMeanMaterial(const float_v &xOverX0, const float_v &xTimesRho, const PndCATrackFitParam &par, const float_m &_mask)
float GetR(short iSt) const
float_v X1Corrected(float_v sinPhi) const
static T Max(const T &x, const T &y)
void SetX(const float_v &v)
float_m AcceptWithMaterial(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) const
void SetDzDs(const float_v &v)
float_v GetDistXZ2(const PndCATrackParamVector &t) const
float_m Transport(const int_v &ista, const PndCAParam ¶m, const float_m &mask=float_m(true))
void InitByHit(const PndCAHitV &hit, const PndCAParam ¶m, const float_v &dQMom)
float_v GetKappa(const float_v &Bz) const
float_v X1Corrected(const PndCATrackParamVector &p) const
float_v GetSinPhi() const
void SetZ(const float_v &v)