10 #ifndef PNDCATRACKPARAMVECTOR_H 11 #define PNDCATRACKPARAMVECTOR_H 42 for (
int i = 0;
i < 5; ++
i)
44 for (
int i = 0;
i < 15; ++
i)
56 for (
int i = 0;
i < 5; ++
i)
58 for (
int i = 0;
i < 15; ++
i)
68 const float_v r =
sqrt(r0 * r0 + r1 * r1);
86 float_v
X()
const {
return fX; }
87 float_v
Y()
const {
return fP[0]; }
88 float_v
Z()
const {
return fP[1]; }
90 float_v
DzDs()
const {
return fP[3]; }
91 float_v
QPt()
const {
return fP[4]; }
96 float_v
X0()
const {
return X(); }
97 float_v
X1()
const {
return Y(); }
98 float_v
X2()
const {
return Z(); }
127 float_v
GetKappa(
const float_v &Bz)
const {
return fP[4] * Bz; }
137 const float_v &
Par(
int i)
const {
return fP[
i]; }
138 const float_v &
Cov(
int i)
const {
return fC[
i]; }
142 const float_v *
Par()
const {
return fP; }
143 const float_v *
Cov()
const {
return fC; }
144 float_v *
Par() {
return fP; }
145 float_v *
Cov() {
return fC; }
150 for (
int i = 0;
i < 5;
i++)
152 for (
int i = 0;
i < 15;
i++)
165 for (
int i = 0;
i < 5;
i++)
167 for (
int i = 0;
i < 15;
i++)
183 void SetX(
const float_v &
v,
const float_m &
m) {
fX(m) =
v; }
184 void SetY(
const float_v &
v,
const float_m &
m) {
fP[0](
m) = v; }
185 void SetZ(
const float_v &
v,
const float_m &
m) {
fP[1](
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, float_v *px, float_v *py, float_v *
pz,
const float_v &Bz)
const;
218 float_m
Transport0(
const int_v &ista,
const PndCAParam ¶m,
const float_m &mask = float_m(
true));
222 float_m
TransportToXWithMaterial(
const float_v &x,
const float_v &XOverX0,
const float_v &XThimesRho,
const float_v &Bz,
const float maxSinPhi = .999
f);
224 float_m
TransportToX(
const float_v &x,
const float_v &Bz,
const float maxSinPhi = .999
f,
const float_m &mask = float_m(
true));
228 float_m
Transport0ToX(
const float_v &x,
const float_v &Bz,
const float_m &mask);
230 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));
233 const float_v &Bz,
const float maxSinPhi = .999
f,
const float_m &mask = float_m(
true));
238 float_m
Rotate(
const float_v &alpha,
const float maxSinPhi = .999
f,
const float_m &mask = float_m(
true));
239 void RotateXY(float_v alpha, float_v &x, float_v &y, float_v &
sin,
const float_m &mask = float_m(
true))
const;
241 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),
242 const int_v &hitNDF = int_v(2),
const float_v &chi2Cut = 10e10f);
244 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),
245 const float_v &chi2Cut = 10e10f);
248 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,
249 const float_v &kp4 = 0.49848
f);
262 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));
263 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));
265 float_m
Transport(
const int_v &ista,
const PndCAParam ¶m,
const float_m &mask = float_m(
true));
267 float_m
Filter(
const PndCAHitV &hit,
const PndCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
270 float_m
Filter(
const PndCAHit &hit,
const PndCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f);
272 float_m
Accept(
const PndCAHit &hit,
const PndCAParam ¶m,
const float_m &mask = float_m(
true),
const float_v &chi2Cut = 10e10f)
const;
273 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),
274 const int_v &hitNDF = int_v(2),
const float_v &chi2Cut = 10e10f)
const;
276 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),
277 const float_v &chi2Cut = 10e10f)
const;
306 const float_v &ey = sinPhi0;
307 const float_v &dx = x -
X();
308 const float_v &exi = float_v(Vc::One) *
CAMath::RSqrt(float_v(Vc::One) - ey * ey);
310 const float_v &dxBz = dx * Bz;
311 const float_v &dS = dx * exi;
312 const float_v &h2 = dS * exi * exi;
313 const float_v &h4 = .5f * h2 * dxBz;
316 const float_v &sinPhi =
SinPhi() + dxBz *
QPt();
320 mask &= ((
CAMath::Abs(sinPhi) <= maxSinPhi) || (maxSinPhi <= 0.
f));
323 fP[0](mask) += dS * ey + h2 * (
SinPhi() - ey) + h4 *
QPt();
324 fP[1](mask) += dS *
DzDs();
325 fP[2](mask) = sinPhi;
329 const float_v c20 =
fC[3];
331 const float_v c22 =
fC[5];
333 const float_v c31 =
fC[7];
335 const float_v c33 =
fC[9];
336 const float_v c40 =
fC[10];
338 const float_v c42 =
fC[12];
340 const float_v c44 =
fC[14];
342 const float_v two(2.
f);
344 fC[0](mask) += h2 * h2 * c22 + h4 * h4 * c44 + two * (h2 * c20 + h4 * (c40 + h2 * c42));
347 fC[2](mask) += dS * (two * c31 + dS * c33);
349 fC[3](mask) += h2 * c22 + h4 * c42 + dxBz * (c40 + h2 * c42 + h4 * c44);
351 const float_v &dxBz_c44 = dxBz * c44;
352 fC[12](mask) += dxBz_c44;
353 fC[5](mask) += dxBz * (two * c42 + dxBz_c44);
356 fC[7](mask) += dS * c33;
360 fC[10](mask) += h2 * c42 + h4 * c44;
378 const float_v cosPhi = cP * cA + sP * sA;
379 const float_v sinPhi = -cP * sA + sP * cA;
381 float_m ReturnMask(mask);
384 float_v tmp = alpha * 0.15915494f;
385 ReturnMask &= abs(tmp - round(tmp)) < 0.167f;
393 const float_v j0 = cP / cosPhi;
394 const float_v j2 = cosPhi / cP;
395 const float_v d =
SinPhi() - sP;
397 SetX(x0 * cA + y0 * sA, ReturnMask);
398 SetY(-x0 * sA + y0 * cA, ReturnMask);
402 fC[0](ReturnMask) *= j0 * j0;
403 fC[1](ReturnMask) *= j0;
404 fC[3](ReturnMask) *= j0;
405 fC[6](ReturnMask) *= j0;
406 fC[10](ReturnMask) *= j0;
408 fC[3](ReturnMask) *= j2;
409 fC[4](ReturnMask) *= j2;
410 fC[5](ReturnMask) *= j2 * j2;
411 fC[8](ReturnMask) *= j2;
412 fC[12](ReturnMask) *= j2;
422 if ((abs(alpha) < 1e-6
f || !mask).isFull())
428 x(mask) = (
X() * cA +
Y() * sA);
429 y(mask) = (-
X() * sA +
Y() * cA);
436 float_v zeta0, zeta1, S00, S10, S11, si;
437 float_v F00, F10, F20, F30, F40, F01, F11, F21, F31, F41;
438 float_v K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
439 float_v &c00 =
fC[0];
440 float_v &c10 =
fC[1];
441 float_v &c11 =
fC[2];
442 float_v &c20 =
fC[3];
443 float_v &c21 =
fC[4];
444 float_v &c22 =
fC[5];
445 float_v &c30 =
fC[6];
446 float_v &c31 =
fC[7];
447 float_v &c32 =
fC[8];
448 float_v &c33 =
fC[9];
449 float_v &c40 =
fC[10];
450 float_v &c41 =
fC[11];
451 float_v &c42 =
fC[12];
452 float_v &c43 =
fC[13];
453 float_v &c44 =
fC[14];
455 zeta0 =
Y() + extrDy - yV;
456 zeta1 =
Z() + extrDz - zV;
473 S00 = info.
C00() + F00 + J[0] * F20 + J[1] * F30 + J[2] * F40;
474 S10 = info.
C10() + F10 + J[3] * F20 + J[4] * F30 + J[5] * F40;
475 S11 = info.
C11() + F11 + J[3] * F21 + J[4] * F31 + J[5] * F41;
477 si = 1.f / (S00 * S11 - S10 * S10);
478 float_v S00tmp = S00;
483 fChi2(active) += zeta0 * zeta0 * S00 + 2.f * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
485 K00 = F00 * S00 + F01 * S10;
486 K01 = F00 * S10 + F01 * S11;
487 K10 = F10 * S00 + F11 * S10;
488 K11 = F10 * S10 + F11 * S11;
489 K20 = F20 * S00 + F21 * S10;
490 K21 = F20 * S10 + F21 * S11;
491 K30 = F30 * S00 + F31 * S10;
492 K31 = F30 * S10 + F31 * S11;
493 K40 = F40 * S00 + F41 * S10;
494 K41 = F40 * S10 + F41 * S11;
496 fP[0](active) -= K00 * zeta0 + K01 * zeta1;
497 fP[1](active) -= K10 * zeta0 + K11 * zeta1;
498 fP[2](active) -= K20 * zeta0 + K21 * zeta1;
499 fP[3](active) -= K30 * zeta0 + K31 * zeta1;
500 fP[4](active) -= K40 * zeta0 + K41 * zeta1;
502 c00(active) -= (K00 * F00 + K01 * F01);
503 c10(active) -= (K10 * F00 + K11 * F01);
504 c11(active) -= (K10 * F10 + K11 * F11);
505 c20(active) = -(K20 * F00 + K21 * F01);
506 c21(active) = -(K20 * F10 + K21 * F11);
507 c22(active) -= (K20 * F20 + K21 * F21);
508 c30(active) = -(K30 * F00 + K31 * F01);
509 c31(active) = -(K30 * F10 + K31 * F11);
510 c32(active) = -(K30 * F20 + K31 * F21);
511 c33(active) -= (K30 * F30 + K31 * F31);
512 c40(active) = -(K40 * F00 + K41 * F01);
513 c41(active) = -(K40 * F10 + K41 * F11);
514 c42(active) = -(K40 * F20 + K41 * F21);
515 c43(active) = -(K40 * F30 + K41 * F31);
516 c44(active) -= (K40 * F40 + K41 * F41);
523 const float_v &ey =
SinPhi();
524 const float_v &dx = x -
X();
525 const float_v &exi =
CAMath::RSqrt(float_v(Vc::One) - ey * ey);
527 const float_v &dxBz = dx * cBz;
528 const float_v &dS = dx * exi;
529 const float_v &h2 = dS * exi * exi;
530 const float_v &h4 = .5f * h2 * dxBz;
532 float_m mask = active &&
CAMath::Abs(exi) <= 1.e4f;
534 extrDy(mask) = dS * ey;
535 extrDz(mask) = dS *
DzDs();
552 float_m active = mask;
563 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)