11 #ifndef PNDCATRACKPARAMVECTOR_H
12 #define PNDCATRACKPARAMVECTOR_H
50 for (
int i = 0;
i < 5; ++
i )
fP[
i].setZero();
51 for (
int i = 0;
i < 15; ++
i )
fC[
i].setZero();
61 for (
int i = 0;
i < 5; ++
i )
fP[
i].setZero();
62 for (
int i = 0;
i < 15; ++
i )
fC[
i].setZero();
71 const float_v
r =
sqrt( r0*r0+r1*r1 );
89 float_v
X()
const {
return fX; }
90 float_v
Y()
const {
return fP[0]; }
91 float_v
Z()
const {
return fP[1]; }
93 float_v
DzDs()
const {
return fP[3]; }
94 float_v
QPt()
const {
return fP[4]; }
99 float_v
X0()
const {
return X(); }
100 float_v
X1()
const {
return Y(); }
101 float_v
X2()
const {
return Z(); }
130 float_v
GetKappa(
const float_v &Bz )
const {
return fP[4]*Bz; }
140 const float_v&
Par(
int i )
const {
return fP[
i]; }
141 const float_v&
Cov(
int i )
const {
return fC[
i]; }
145 const float_v *
Par()
const {
return fP; }
146 const float_v *
Cov()
const {
return fC; }
175 void SetPar(
int i,
const float_v &
v,
const float_m &
m ) {
fP[
i](
m ) = v; }
177 void SetCov(
int i,
const float_v &
v,
const float_m &
m ) {
fC[
i](
m ) = v; }
182 void SetX(
const float_v &
v,
const float_m &
m ) {
fX( m ) =
v; }
183 void SetY(
const float_v &
v,
const float_m &
m ) {
fP[0](
m ) = v; }
184 void SetZ(
const float_v &
v,
const float_m &
m ) {
fP[1](
m ) = v; }
191 void SetQPt(
const float_v &
v,
const float_m &
m ) {
fP[4](
m ) = v; }
214 float_v
GetS(
const float_v &
x,
const float_v &
y,
const float_v &Bz )
const;
216 void GetDCAPoint(
const float_v &
x,
const float_v &
y,
const float_v &
z,
217 float_v *px, float_v *py, float_v *
pz,
const float_v &Bz )
const;
219 float_m
Transport0(
const int_v& ista,
const PndCAParam& param,
const float_m &mask = float_m(
true ) );
224 const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi = .999
f );
226 float_m
TransportToX(
const float_v &
x,
const float_v &Bz,
const float maxSinPhi = .999
f,
const float_m &mask = float_m(
true ) );
229 const float_v &Bz,
const float maxSinPhi = .999
f, float_v *DL = 0,
const float_m &mask = float_m(
true ) );
231 float_m
Transport0ToX(
const float_v &x,
const float_v &Bz,
const float_m &mask );
233 float_m
TransportToX(
const float_v &x,
const float_v &sinPhi0,
234 const float_v &Bz,
const float_v maxSinPhi = .999
f,
const float_m &mask = float_m(
true ) );
237 PndCATrackFitParam &
par,
const float_v &XOverX0,
238 const float_v &XThimesRho,
239 const float_v &Bz,
const float maxSinPhi = .999
f,
const float_m &mask = float_m(
true ) );
242 PndCATrackFitParam &par,
const float_v &XOverX0,
243 const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi = .999
f );
246 const float maxSinPhi = .999
f,
const float_m &mask = float_m(
true ) );
247 float_m
Rotate(
const float_v &alpha,
const float maxSinPhi = .999
f,
const float_m &mask = float_m(
true ) );
248 void RotateXY( float_v alpha, float_v &x, float_v &
y, float_v &
sin,
const float_m &mask = float_m(
true ) )
const ;
250 float_m
FilterWithMaterial(
const float_v &y,
const float_v &
z, float_v err2Y, float_v errYZ, float_v err2Z,
251 float maxSinPhi=0.999
f,
const float_m &mask = float_m(
true ),
const int_v& hitNDF = int_v(2) ,
const float_v& chi2Cut = 10e10f );
254 float maxSinPhi=0.999
f,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f );
258 const float_v &kp0 = 2.33
f,
259 const float_v &kp1 = 0.20
f,
260 const float_v &kp2 = 3.00
f,
261 const float_v &kp3 = 173e-9
f,
262 const float_v &kp4 = 0.49848
f
270 const PndCATrackFitParam &par,
const float_m &_mask );
278 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 ) );
279 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 ) );
282 float_m
Transport(
const int_v& ista,
const PndCAParam& param,
const float_m &mask = float_m(
true ) );
284 float_m
Filter(
const PndCAHitV& hit,
const PndCAParam& param,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f );
287 float_m
Filter(
const PndCAHit& hit,
const PndCAParam& param,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f );
289 float_m
Accept(
const PndCAHit& hit,
const PndCAParam& param,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f )
const;
290 float_m
AcceptWithMaterial(
const float_v &y,
const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z,
291 float maxSinPhi=0.999
f,
const float_m &mask = float_m(
true ),
const int_v& hitNDF = int_v(2) ,
const float_v& chi2Cut = 10e10f )
const;
294 float maxSinPhi=0.999
f,
const float_m &mask = float_m(
true ),
const float_v& chi2Cut = 10e10f )
const;
314 const float_v &Bz,
const float_v maxSinPhi,
const float_m &_mask )
325 const float_v &ey = sinPhi0;
326 const float_v &
dx = x -
X();
329 const float_v &dxBz = dx * Bz;
330 const float_v &dS = dx * exi;
331 const float_v &
h2 = dS * exi * exi;
332 const float_v &
h4 = .5f * h2 * dxBz;
335 const float_v &sinPhi =
SinPhi() + dxBz *
QPt();
338 float_m mask = _mask &&
CAMath::Abs( exi ) <= 1.e4f;
339 mask &= ( (
CAMath::Abs( sinPhi ) <= maxSinPhi) || (maxSinPhi <= 0.
f) );
343 fP[0]( mask ) += dS * ey + h2 * (
SinPhi() - ey ) + h4 *
QPt();
344 fP[1]( mask ) += dS *
DzDs();
345 fP[2]( mask ) = sinPhi;
350 const float_v
c20 =
fC[3];
352 const float_v
c22 =
fC[5];
354 const float_v c31 =
fC[7];
356 const float_v c33 =
fC[9];
357 const float_v c40 =
fC[10];
359 const float_v c42 =
fC[12];
361 const float_v c44 =
fC[14];
363 const float_v two( 2.
f );
365 fC[0] ( mask ) += h2 * h2 * c22 + h4 * h4 * c44
366 + two * ( h2 * c20 + h4 * ( c40 + h2 * c42 ) );
369 fC[2] ( mask ) += dS * ( two * c31 + dS * c33 );
371 fC[3] ( mask ) += h2 * c22 + h4 * c42 + dxBz * ( c40 + h2 * c42 + h4 * c44 );
373 const float_v &dxBz_c44 = dxBz * c44;
374 fC[12]( mask ) += dxBz_c44;
375 fC[5] ( mask ) += dxBz * ( two * c42 + dxBz_c44 );
378 fC[7] ( mask ) += dS * c33;
382 fC[10]( mask ) += h2 * c42 + h4 * c44;
393 const float maxSinPhi,
const float_m &mask )
396 if ( (
CAMath::Abs(alpha) < 1e-6
f || !mask).isFull() )
return mask;
401 const float_v cosPhi = cP * cA + sP * sA;
402 const float_v sinPhi = -cP * sA + sP * cA;
404 float_m ReturnMask(mask);
407 float_v tmp = alpha*0.15915494f;
408 ReturnMask &= abs(tmp - round(tmp)) < 0.167f;
416 const float_v j0 = cP / cosPhi;
417 const float_v j2 = cosPhi / cP;
418 const float_v
d =
SinPhi() - sP;
420 SetX( x0*cA +
y0*sA, ReturnMask );
421 SetY(-x0*sA +
y0*cA, ReturnMask );
425 fC[0](ReturnMask) *= j0 * j0;
426 fC[1](ReturnMask) *= j0;
427 fC[3](ReturnMask) *= j0;
428 fC[6](ReturnMask) *= j0;
429 fC[10](ReturnMask) *= j0;
431 fC[3](ReturnMask) *= j2;
432 fC[4](ReturnMask) *= j2;
433 fC[5](ReturnMask) *= j2 * j2;
434 fC[8](ReturnMask) *= j2;
435 fC[12](ReturnMask) *= j2;
445 if ( (abs(alpha) < 1e-6
f || !mask).isFull() )
return;
450 x(mask) = (
X()*cA +
Y()*sA );
451 y(mask) = ( -
X()*sA +
Y()*cA );
458 float_v zeta0, zeta1, S00, S10, S11, si;
459 float_v F00, F10, F20, F30, F40, F01, F11, F21, F31, F41 ;
460 float_v K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
461 float_v& c00 =
fC[0];
462 float_v&
c10 =
fC[1];
463 float_v&
c11 =
fC[2];
464 float_v&
c20 =
fC[3];
465 float_v&
c21 =
fC[4];
466 float_v&
c22 =
fC[5];
467 float_v& c30 =
fC[6];
468 float_v& c31 =
fC[7];
469 float_v& c32 =
fC[8];
470 float_v& c33 =
fC[9];
471 float_v& c40 =
fC[10];
472 float_v& c41 =
fC[11];
473 float_v& c42 =
fC[12];
474 float_v& c43 =
fC[13];
475 float_v& c44 =
fC[14];
477 zeta0 =
Y() + extrDy - yV;
478 zeta1 =
Z() + extrDz - zV;
484 F00 = c00; F01 =
c10;
486 F20 = J[0]*
c22; F21 = J[3]*
c22;
487 F30 = J[1]*c33; F31 = J[4]*c33;
488 F40 = J[2]*c44; F41 = J[5]*c44;
490 S00 = info.
C00() + F00 + J[0]*F20 + J[1]*F30 + J[2]*F40;
491 S10 = info.
C10() + F10 + J[3]*F20 + J[4]*F30 + J[5]*F40;
492 S11 = info.
C11() + F11 + J[3]*F21 + J[4]*F31 + J[5]*F41;
494 si = 1.f/(S00*S11 - S10*S10);
495 float_v S00tmp = S00;
500 fChi2(active) += zeta0*zeta0*S00 + 2.f*zeta0*zeta1*S10 + zeta1*zeta1*S11;
502 K00 = F00*S00 + F01*S10; K01 = F00*S10 + F01*S11;
503 K10 = F10*S00 + F11*S10; K11 = F10*S10 + F11*S11;
504 K20 = F20*S00 + F21*S10; K21 = F20*S10 + F21*S11;
505 K30 = F30*S00 + F31*S10; K31 = F30*S10 + F31*S11;
506 K40 = F40*S00 + F41*S10; K41 = F40*S10 + F41*S11;
508 fP[0](active) -= K00*zeta0 + K01*zeta1;
509 fP[1](active) -= K10*zeta0 + K11*zeta1;
510 fP[2](active) -= K20*zeta0 + K21*zeta1;
511 fP[3](active) -= K30*zeta0 + K31*zeta1;
512 fP[4](active) -= K40*zeta0 + K41*zeta1;
514 c00(active) -= ( K00*F00 + K01*F01 );
515 c10(active) -= ( K10*F00 + K11*F01 );
516 c11(active) -= ( K10*F10 + K11*F11 );
517 c20(active) = -( K20*F00 + K21*F01 );
518 c21(active) = -( K20*F10 + K21*F11 );
519 c22(active) -= ( K20*F20 + K21*F21 );
520 c30(active) = -( K30*F00 + K31*F01 );
521 c31(active) = -( K30*F10 + K31*F11 );
522 c32(active) = -( K30*F20 + K31*F21 );
523 c33(active) -= ( K30*F30 + K31*F31 );
524 c40(active) = -( K40*F00 + K41*F01 );
525 c41(active) = -( K40*F10 + K41*F11 );
526 c42(active) = -( K40*F20 + K41*F21 );
527 c43(active) = -( K40*F30 + K41*F31 );
528 c44(active) -= ( K40*F40 + K41*F41 );
535 const float_v &ey =
SinPhi();
536 const float_v &
dx = x -
X();
539 const float_v &dxBz = dx * cBz;
540 const float_v &dS = dx * exi;
541 const float_v &
h2 = dS * exi * exi;
542 const float_v &
h4 = .5f * h2 * dxBz;
544 float_m mask = active &&
CAMath::Abs( exi ) <= 1.e4f;
546 extrDy(mask) = dS*ey;
547 extrDz(mask) = dS*
DzDs();
567 float_m active = mask;
577 float_m active = mask;
float_v Err2QMomentum() const
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)
float_v Err2SinPhi() 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 SetChi2(const float_v &v, const float_m &m)
const float_v & Cov(int i) const
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 SetSinPhi(const float_v &v, const float_m &m)
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 T Sqrt(const T &x)
const float_v & C11() const
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
friend F32vec4 sin(const F32vec4 &a)
float_v GetS(const float_v &x, const float_v &y, const float_v &Bz) const
static float_v BetheBlochSolid(const float_v &bg)
const float_v * Cov() const
void SetNDF(const int_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 SetISec(const int_v &v)
void SetAngle(const float_v &v, const float_m &m)
float_m Filter(const PndCAHitV &hit, const PndCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f)
void SetTrackParam(const PndCATrackParamVector ¶m, const float_m &m=float_m(true))
void SetSignCosPhi(const float_v &v, const float_m &m)
float_m Transport0(const int_v &ista, const PndCAParam ¶m, const float_m &mask=float_m(true))
const float_v * Par() const
static T RSqrt(const T &x)
float_m TransportToXWithMaterial(const float_v &x, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi=.999f)
float_v GetSignCosPhi() const
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 float_v BetheBlochGas(const float_v &bg)
float_v GetCosPhiPositive() const
void SetCov(int i, const float_v &v)
static float_v ApproximateBetheBloch(const float_v &beta2)
float_v GetDist2(const PndCATrackParamVector &t) const
void SetX(const float_v &v, const float_m &m)
float_v QMomentum() const
const float_v & C10() const
void SetY(const float_v &v, const float_m &m)
void InitDirection(float_v r0, float_v r1, float_v r2)
void SetY(const float_v &v)
void SetQMomentum(const float_v &v)
void SetCov(int i, const float_v &v, const float_m &m)
float_m CorrectForMeanMaterial(const float_v &xOverX0, const float_v &xTimesRho, const PndCATrackFitParam &par, const float_m &_mask)
float GetR(short iSt) const
void SetErr2QPt(float_v v)
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)
void SetNDF(const int_v &v, const int_m &m)
float_v GetDistXZ2(const PndCATrackParamVector &t) const
const float_v & Par(int i) const
void SetPar(int i, const float_v &v)
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)
void SetTrackParam(const PndCATrackParamVector &p, int k, int m)
float_v GetKappa(const float_v &Bz) const
void SetISec(const int_v &v, const int_m &m)
void SetQPt(const float_v &v, const float_m &m)
PndCATrackParamVector TrackParamVector
void SetZ(const float_v &v, const float_m &m)
float_v SignCosPhi() const
void SetDzDs(const float_v &v, const float_m &m)
const float_v & C00() const
void SetPar(int i, const float_v &v, const float_m &m)
float_v GetSinPhi() const
void SetZ(const float_v &v)