22 #ifndef PNDCATRACKPARAMVECTOR_H 23 #define PNDCATRACKPARAMVECTOR_H 54 for (
int i = 0;
i < 5; ++
i)
56 for (
int i = 0;
i < 15; ++
i)
68 for (
int i = 0;
i < 5; ++
i)
70 for (
int i = 0;
i < 15; ++
i)
80 const float_v r =
sqrt(r0 * r0 + r1 * r1);
98 float_v
X()
const {
return fX; }
99 float_v
Y()
const {
return fP[0]; }
100 float_v
Z()
const {
return fP[1]; }
103 float_v
QPt()
const {
return fP[4]; }
108 float_v
X0()
const {
return X(); }
109 float_v
X1()
const {
return Y(); }
110 float_v
X2()
const {
return Z(); }
139 float_v
GetKappa(
const float_v &Bz)
const {
return fP[4] * Bz; }
149 const float_v &
Par(
int i)
const {
return fP[
i]; }
150 const float_v &
Cov(
int i)
const {
return fC[
i]; }
154 const float_v *
Par()
const {
return fP; }
155 const float_v *
Cov()
const {
return fC; }
156 float_v *
Par() {
return fP; }
157 float_v *
Cov() {
return fC; }
162 for (
int i = 0;
i < 5;
i++)
164 for (
int i = 0;
i < 15;
i++)
177 for (
int i = 0;
i < 5;
i++)
179 for (
int i = 0;
i < 15;
i++)
195 void SetX(
const float_v &
v,
const float_m &
m) {
fX(m) =
v; }
196 void SetY(
const float_v &
v,
const float_m &
m) {
fP[0](
m) = v; }
197 void SetZ(
const float_v &
v,
const float_m &
m) {
fP[1](
m) = v; }
226 float_v
GetS(
const float_v &x,
const float_v &y,
const float_v &Bz)
const;
228 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;
230 float_m
Transport0(
const int_v &ista,
const PndCAParam ¶m,
const float_m &mask = float_m(
true));
234 float_m
TransportToXWithMaterial(
const float_v &x,
const float_v &XOverX0,
const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi = .999
f);
236 float_m
TransportToX(
const float_v &x,
const float_v &Bz,
const float maxSinPhi = .999
f,
const float_m &mask = float_m(
true));
240 float_m
Transport0ToX(
const float_v &x,
const float_v &Bz,
const float_m &mask);
242 float_m
TransportToX(
const float_v &x,
const float_v &sinPhi0,
const float_v &Bz,
const float_v maxSinPhi = .999
f,
const float_m &mask = float_m(
true));
245 const float_v &Bz,
const float maxSinPhi = .999
f,
const float_m &mask = float_m(
true));
250 float_m
Rotate(
const float_v &alpha,
const float maxSinPhi = .999
f,
const float_m &mask = float_m(
true));
251 void RotateXY(float_v alpha, float_v &x, float_v &y, float_v &
sin,
const float_m &mask = float_m(
true))
const;
253 float_m
FilterWithMaterial(
const float_v &y,
const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z,
float maxSinPhi = 0.999
f,
const float_m &mask = float_m(
true),
254 const int_v &hitNDF = int_v(2),
const float_v &chi2Cut = 10e10f);
256 float_m
FilterWithMaterial(
const float_v &y,
const float_v &z,
const PndCAStripInfo &info, float_v err2,
float maxSinPhi = 0.999
f,
const float_m &mask = float_m(
true),
257 const float_v &chi2Cut = 10e10f);
260 static float_v
BetheBlochGeant(
const float_v &bg,
const float_v &kp0 = 2.33
f,
const float_v &kp1 = 0.20
f,
const float_v &kp2 = 3.00
f,
const float_v &kp3 = 173e-9
f,
261 const float_v &kp4 = 0.49848
f);
274 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));
275 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));
277 float_m
Transport(
const int_v &ista,
const PndCAParam ¶m,
const float_m &mask = float_m(
true));
279 float_m
Filter(
const PndCAHitV &hit,
const PndCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
282 float_m
Filter(
const PndCAHit &hit,
const PndCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
284 float_m
Accept(
const PndCAHit &hit,
const PndCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f)
const;
285 float_m
AcceptWithMaterial(
const float_v &y,
const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z,
float maxSinPhi = 0.999
f,
const float_m &mask = float_m(
true),
286 const int_v &hitNDF = int_v(2),
const float_v &chi2Cut = 10e10f)
const;
288 float_m
AcceptWithMaterial(
const float_v &y,
const float_v &z,
const PndCAStripInfo &info, float_v err2,
float maxSinPhi = 0.999
f,
const float_m &mask = float_m(
true),
289 const float_v &chi2Cut = 10e10f)
const;
318 const float_v &ey = sinPhi0;
319 const float_v &dx = x -
X();
320 const float_v &exi = float_v(Vc::One) *
CAMath::RSqrt(float_v(Vc::One) - ey * ey);
322 const float_v &dxBz = dx * Bz;
323 const float_v &dS = dx * exi;
324 const float_v &h2 = dS * exi * exi;
325 const float_v &h4 = .5f * h2 * dxBz;
328 const float_v &sinPhi =
SinPhi() + dxBz *
QPt();
332 mask &= ((
CAMath::Abs(sinPhi) <= maxSinPhi) || (maxSinPhi <= 0.
f));
335 fP[0](mask) += dS * ey + h2 * (
SinPhi() - ey) + h4 *
QPt();
336 fP[1](mask) += dS *
DzDs();
337 fP[2](mask) = sinPhi;
341 const float_v c20 =
fC[3];
343 const float_v c22 =
fC[5];
345 const float_v c31 =
fC[7];
347 const float_v c33 =
fC[9];
348 const float_v c40 =
fC[10];
350 const float_v c42 =
fC[12];
352 const float_v c44 =
fC[14];
354 const float_v two(2.
f);
356 fC[0](mask) += h2 * h2 * c22 + h4 * h4 * c44 + two * (h2 * c20 + h4 * (c40 + h2 * c42));
359 fC[2](mask) += dS * (two * c31 + dS * c33);
361 fC[3](mask) += h2 * c22 + h4 * c42 + dxBz * (c40 + h2 * c42 + h4 * c44);
363 const float_v &dxBz_c44 = dxBz * c44;
364 fC[12](mask) += dxBz_c44;
365 fC[5](mask) += dxBz * (two * c42 + dxBz_c44);
368 fC[7](mask) += dS * c33;
372 fC[10](mask) += h2 * c42 + h4 * c44;
390 const float_v cosPhi = cP * cA + sP * sA;
391 const float_v sinPhi = -cP * sA + sP * cA;
393 float_m ReturnMask(mask);
396 float_v tmp = alpha * 0.15915494f;
397 ReturnMask &= abs(tmp - round(tmp)) < 0.167f;
405 const float_v j0 = cP / cosPhi;
406 const float_v j2 = cosPhi / cP;
407 const float_v d =
SinPhi() - sP;
409 SetX(x0 * cA + y0 * sA, ReturnMask);
410 SetY(-x0 * sA + y0 * cA, ReturnMask);
414 fC[0](ReturnMask) *= j0 * j0;
415 fC[1](ReturnMask) *= j0;
416 fC[3](ReturnMask) *= j0;
417 fC[6](ReturnMask) *= j0;
418 fC[10](ReturnMask) *= j0;
420 fC[3](ReturnMask) *= j2;
421 fC[4](ReturnMask) *= j2;
422 fC[5](ReturnMask) *= j2 * j2;
423 fC[8](ReturnMask) *= j2;
424 fC[12](ReturnMask) *= j2;
434 if ((abs(alpha) < 1e-6
f || !mask).isFull())
440 x(mask) = (
X() * cA +
Y() * sA);
441 y(mask) = (-
X() * sA +
Y() * cA);
448 float_v zeta0, zeta1, S00, S10, S11, si;
449 float_v F00, F10, F20, F30, F40, F01, F11, F21, F31, F41;
450 float_v K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
451 float_v &c00 =
fC[0];
452 float_v &c10 =
fC[1];
453 float_v &c11 =
fC[2];
454 float_v &c20 =
fC[3];
455 float_v &c21 =
fC[4];
456 float_v &c22 =
fC[5];
457 float_v &c30 =
fC[6];
458 float_v &c31 =
fC[7];
459 float_v &c32 =
fC[8];
460 float_v &c33 =
fC[9];
461 float_v &c40 =
fC[10];
462 float_v &c41 =
fC[11];
463 float_v &c42 =
fC[12];
464 float_v &c43 =
fC[13];
465 float_v &c44 =
fC[14];
467 zeta0 =
Y() + extrDy - yV;
468 zeta1 =
Z() + extrDz - zV;
485 S00 = info.
C00() + F00 + J[0] * F20 + J[1] * F30 + J[2] * F40;
486 S10 = info.
C10() + F10 + J[3] * F20 + J[4] * F30 + J[5] * F40;
487 S11 = info.
C11() + F11 + J[3] * F21 + J[4] * F31 + J[5] * F41;
489 si = 1.f / (S00 * S11 - S10 * S10);
490 float_v S00tmp = S00;
495 fChi2(active) += zeta0 * zeta0 * S00 + 2.f * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
497 K00 = F00 * S00 + F01 * S10;
498 K01 = F00 * S10 + F01 * S11;
499 K10 = F10 * S00 + F11 * S10;
500 K11 = F10 * S10 + F11 * S11;
501 K20 = F20 * S00 + F21 * S10;
502 K21 = F20 * S10 + F21 * S11;
503 K30 = F30 * S00 + F31 * S10;
504 K31 = F30 * S10 + F31 * S11;
505 K40 = F40 * S00 + F41 * S10;
506 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();
537 const float_v &exi =
CAMath::RSqrt(float_v(Vc::One) - ey * ey);
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();
564 float_m active = mask;
575 float_m active = mask;
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))
void InitByTarget(const PndCATarget &target)
const float_v & C00() const
const float * 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 SetChi2(const float_v &v, const float_m &m)
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)
float_v QMomentum() const
void SetSignCosPhi(const float_v &v)
float_m Accept(const PndCAHit &hit, const PndCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f) const
void SetSinPhi(const float_v &v)
friend F32vec4 sqrt(const F32vec4 &a)
static T Sqrt(const T &x)
void SetChi2(const float_v &v)
friend F32vec4 sin(const F32vec4 &a)
float_v GetSinPhi() const
float GetR(short iSt) const
float_v GetDist2(const PndCATrackParamVector &t) const
const float * Par() 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)
void SetNDF(const int_v &v)
static float_v BetheBlochSolid(const float_v &bg)
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))
static float_v ApproximateBetheBloch(const float_v &beta2)
float_v GetDistXZ2(const PndCATrackParamVector &t) const
static T RSqrt(const T &x)
float_v GetKappa(const float_v &Bz) const
float_m TransportToXWithMaterial(const float_v &x, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi=.999f)
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)
float_v SignCosPhi() const
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 SetX(const float_v &v, const float_m &m)
float_v GetCosPhi() 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)
float_v Err2SinPhi() const
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_v GetSignCosPhi() const
void SetErr2QPt(float_v v)
const float_v & C11() const
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
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)
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)
const float_v & C10() const
void SetISec(const int_v &v, const int_m &m)
void SetQPt(const float_v &v, const float_m &m)
PndCATrackParamVector TrackParamVector
const float_v & Cov(int i) const
void SetZ(const float_v &v, const float_m &m)
void SetDzDs(const float_v &v, const float_m &m)
float_v Err2QMomentum() const
float_v GetS(const float_v &x, const float_v &y, const float_v &Bz) const
float_v GetCosPhiPositive() const
static float_v BetheBlochGas(const float_v &bg)
const float_v & Par(int i) const
void SetPar(int i, const float_v &v, const float_m &m)
void SetZ(const float_v &v)