24#ifdef HomogeneousField
26#include "AliVVertex.h"
29#ifdef NonhomogeneousField
30#include "CbmKFParticleDatabase.h"
31#include "CbmKFTrack.h"
32#include "CbmKFVertex.h"
35#ifdef HomogeneousField
36fvec KFParticleSIMD::fgBz = -5.;
43#ifdef NonhomogeneousField
70 for (
int i = 0;
i < 21;
i++)
79#ifdef NonhomogeneousField
83 Create(Track, NTracks, qHypo, pdg);
93 for (
int j = 0; j < NTracks; j++) {
102 for (
int i = 0;
i < 6;
i++)
103 m[
i][j] = Track[j]->GetTrack()[
i];
104 for (
int i = 0;
i < 15;
i++)
105 V[
i][j] = Track[j]->GetCovMatrix()[
i];
108 fvec a =
m[2], b =
m[3], qp =
m[4];
112 fvec c2 = 1. / (1. + a * a + b * b);
118 fvec eE =
sqrt(TrMass * TrMass + p2);
120 fvec H[3] = {-px * c2, -py * c2, -pz * pq};
121 fvec HE = -pq * p2 / eE;
132 fvec cxpz = H[0] * V[3] + H[1] * V[6] + H[2] * V[10];
133 fvec cypz = H[0] * V[4] + H[1] * V[7] + H[2] * V[11];
134 fvec capz = H[0] * V[5] + H[1] * V[8] + H[2] * V[12];
135 fvec cbpz = H[0] * V[8] + H[1] * V[9] + H[2] * V[13];
136 fvec cqpz = H[0] * V[12] + H[1] * V[13] + H[2] * V[14];
137 fvec cpzpz = H[0] * H[0] * V[5] + H[1] * H[1] * V[9] + H[2] * H[2] * V[14]
138 + 2 * (H[0] * H[1] * V[8] + H[0] * H[2] * V[12] + H[1] * H[2] * V[13]);
146 fC[6] = V[3] * pz + a * cxpz;
147 fC[7] = V[4] * pz + a * cypz;
149 fC[9] = V[5] * pz * pz + 2 * a * pz * capz + a * a * cpzpz;
150 fC[10] = V[6] * pz + b * cxpz;
151 fC[11] = V[7] * pz + b * cypz;
153 fC[13] = V[8] * pz * pz + a * pz * cbpz + b * pz * capz + a * b * cpzpz;
154 fC[14] = V[9] * pz * pz + 2 * b * pz * cbpz + b * b * cpzpz;
158 fC[18] = capz * pz + a * cpzpz;
159 fC[19] = cbpz * pz + b * cpzpz;
164 fC[24] = HE * (V[12] * pz + a * cqpz);
165 fC[25] = HE * (V[13] * pz + b * cqpz);
167 fC[27] = HE * HE * V[14];
171 for (
int j = 0; j <
fvecLen; j++)
172 fQ[j] = (qp[j] > 0.) ? 1 : ((qp[j] < 0) ? -1 : 0);
191 for (
unsigned int i = 0;
i < 6;
i++)
192 m[
i] = Tr.GetTrack()[
i];
193 for (
unsigned int i = 0;
i < 15;
i++)
194 V[
i] = Tr.GetCovMatrix()[
i];
198 fNDF = Tr.GetRefNDF();
199 fChi2 = Tr.GetRefChi2();
201 fvec a =
m[2], b =
m[3], qp =
m[4];
205 fvec c2 = 1. / (1. + a * a + b * b);
211 fvec eE =
sqrt(TrMass * TrMass + p2);
213 fvec H[3] = {-px * c2, -py * c2, -pz * pq};
214 fvec HE = -pq * p2 / eE;
225 fvec cxpz = H[0] * V[3] + H[1] * V[6] + H[2] * V[10];
226 fvec cypz = H[0] * V[4] + H[1] * V[7] + H[2] * V[11];
227 fvec capz = H[0] * V[5] + H[1] * V[8] + H[2] * V[12];
228 fvec cbpz = H[0] * V[8] + H[1] * V[9] + H[2] * V[13];
229 fvec cqpz = H[0] * V[12] + H[1] * V[13] + H[2] * V[14];
230 fvec cpzpz = H[0] * H[0] * V[5] + H[1] * H[1] * V[9] + H[2] * H[2] * V[14]
231 + 2 * (H[0] * H[1] * V[8] + H[0] * H[2] * V[12] + H[1] * H[2] * V[13]);
239 fC[6] = V[3] * pz + a * cxpz;
240 fC[7] = V[4] * pz + a * cypz;
242 fC[9] = V[5] * pz * pz + 2 * a * pz * capz + a * a * cpzpz;
243 fC[10] = V[6] * pz + b * cxpz;
244 fC[11] = V[7] * pz + b * cypz;
246 fC[13] = V[8] * pz * pz + a * pz * cbpz + b * pz * capz + a * b * cpzpz;
247 fC[14] = V[9] * pz * pz + 2 * b * pz * cbpz + b * b * cpzpz;
251 fC[18] = capz * pz + a * cpzpz;
252 fC[19] = cbpz * pz + b * cpzpz;
257 fC[24] = HE * (V[12] * pz + a * cqpz);
258 fC[25] = HE * (V[13] * pz + b * cqpz);
260 fC[27] = HE * HE * V[14];
264 for (
int j = 0; j <
fvecLen; j++)
265 fQ[j] = (qp[j] > 0.) ? 1 : ((qp[j] < 0) ? -1 : 0);
293#ifdef HomogeneousField
302 track[iPart].XvYvZv(r);
305 track[iPart].PxPyPz(r);
307 fP[
i + 3][iPart] = r[
i];
308 fQ[iPart] = track[iPart].Charge();
309 track[iPart].GetCovarianceXYZPxPyPz(C);
324 for (Int_t
i = 0;
i < 3;
i++)
326 vertex.GetCovarianceMatrix(C);
327 for (Int_t
i = 0;
i < 21;
i++)
329 fChi2 = vertex.GetChi2();
330 fNDF = 2 * vertex.GetNContributors() - 3;
345 fvec pt =
sqrt(cosA * cosA + sinA * sinA);
348 pti = (!mask) & (
One / pt);
349 cosA =
if3(mask,
One, cosA * pti);
350 sinA =
if3(mask,
One, sinA * pti);
352 fvec AlphaSIMD = atan2SIMD(sinA, cosA);
355 PSIMD[0] = p.
GetY() * cosA - p.
GetX() * sinA;
358 PSIMD[3] = p.
GetPz() * pti;
359 PSIMD[4] = p.
GetQ() * pti;
361 for (
int iPart = 0; iPart <
fvecLen; iPart++) {
362 X[iPart] = XSIMD[iPart];
363 Alpha[iPart] = AlphaSIMD[iPart];
364 P[0][iPart] = PSIMD[0][iPart];
365 P[1][iPart] = PSIMD[1][iPart];
366 P[2][iPart] = PSIMD[2][iPart];
367 P[3][iPart] = PSIMD[3][iPart];
368 P[4][iPart] = PSIMD[4][iPart];
375#ifdef NonhomogeneousField
382 for (
int ie = 1; ie < nPart; ie++) {
388 std::cout <<
" void CbmKFParticle_simd::Create(CbmKFParticle *parts[], int N) " << std::endl;
395 for (
int ie = 0; ie < nPart; ie++) {
399 for (
int iD = 0; iD < (parts[0])->NDaughters(); iD++)
404 for (
int i = 0;
i < 8; ++
i)
406 for (
int i = 0;
i < 36; ++
i)
417 fField.SetOneEntry(ie, field, 0);
422#ifdef NonhomogeneousField
441 for (
int i = 0;
i < 8; ++
i)
443 for (
int i = 0;
i < 36; ++
i)
463 fvec dx = mP[0] - vtx[0];
464 fvec dy = mP[1] - vtx[1];
472 ex = (!mask) & (px / pt);
473 ey = (!mask) & (py / pt);
474 val =
if3(mask,
fvec(1.e4), dy * ex - dx * ey);
478 fvec h3 = (dy * ey + dx * ex) * ey / pt;
479 fvec h4 = -(dy * ey + dx * ex) * ex / pt;
494 err += h0 * (h0 * Cv[0] + h1 * Cv[1]) + h1 * (h0 * Cv[1] + h1 * Cv[2]);
514#ifdef HomogeneousField
538#ifdef HomogeneousField
553 fvec mP[8], mC[36], mP1[8], mC1[36];
556 fvec dx = mP[0] - mP1[0];
557 fvec dy = mP[1] - mP1[1];
558 return sqrt(dx * dx + dy * dy);
567 fvec mP1[8], mC1[36];
570 fvec d[2] = {
fP[0] - mP1[0],
fP[1] - mP1[1]};
572 fvec sigmaS = .1 + 10. *
sqrt((d[0] * d[0] + d[1] * d[1]) / (mP1[3] * mP1[3] + mP1[4] * mP1[4]));
574 fvec h[2] = {mP1[3] * sigmaS, mP1[4] * sigmaS};
576 mC1[0] += h[0] * h[0];
577 mC1[1] += h[1] * h[0];
578 mC1[2] += h[1] * h[1];
592 ret =
if3(mask, ret, val / err);
604#ifdef HomogeneousField
621 fvec mP[8], mC[36], mP1[8], mC1[36];
624 fvec n =
sqrt(mP[3] * mP[3] + mP[4] * mP[4] + mP[5] * mP[5]);
625 fvec n1 =
sqrt(mP1[3] * mP1[3] + mP1[4] * mP1[4] + mP1[5] * mP1[5]);
629 a = (mP[3] * mP1[3] + mP[4] * mP1[4] + mP[5] * mP1[5]) /
n;
643 fvec mP[8], mC[36], mP1[8], mC1[36];
646 fvec n =
sqrt(mP[3] * mP[3] + mP[4] * mP[4]);
647 fvec n1 =
sqrt(mP1[3] * mP1[3] + mP1[4] * mP1[4]);
651 a = (mP[3] * mP1[3] + mP[4] * mP1[4]) /
n;
665 fvec mP[8], mC[36], mP1[8], mC1[36];
668 fvec nr =
sqrt(mP[3] * mP[3] + mP[4] * mP[4]);
669 fvec n1r =
sqrt(mP1[3] * mP1[3] + mP1[4] * mP1[4]);
671 fvec n1 =
sqrt(n1r * n1r + mP1[5] * mP1[5]);
675 a = (nr * n1r + mP[5] * mP1[5]) /
n;
723 const fvec mipt2 = mass * ipt2;
724 const fvec dx =
X() - pV.
X();
725 const fvec dy =
Y() - pV.
Y();
736 const fvec f0 =
Px() * mipt2;
737 const fvec f1 =
Py() * mipt2;
738 const fvec mipt2derivative = mipt2 * (1 - 2 *
Px() *
Px() * ipt2);
739 const fvec f2 = dx * mipt2derivative;
740 const fvec f3 = -dy * mipt2derivative;
758 *timeErr2 = f5 * mC55 * f5 + f5 * mC54 * f4 + f4 * mC44 * f4 + f3 * mC33 * f3 + f3 * mC32 * f2 + f3 * mC31 * f1
759 + f3 * mC30 * f0 + f2 * mC22 * f2 + f2 * mC21 * f1 + f2 * mC20 * f0 + f1 * mC11 * f1
760 + f1 * mC10 * f0 + f0 * mC00 * f0;
762 return (dx *
Px() + dy *
Py()) * mipt2;
767 Part.
SetId(
static_cast<int>(
Id()[iPart]));
776 for (
int iP = 0; iP < 8; iP++)
778 for (
int iC = 0; iC < 36; iC++)
781 Part.
NDF() =
static_cast<int>(
GetNDF()[iPart]);
783 Part.
Q() =
GetQ()[iPart];
800 for (
int i = 0;
i < nPart;
i++)
friend F32vec4 fabs(const F32vec4 &a)
static CbmKFParticleDatabase * Instance()
virtual Int_t & GetRefNDF()
Chi^2 after fit.
virtual Double_t GetMass()
Information not to be changed.
virtual Double_t & GetRefChi2()
array[15] of covariance matrix
virtual Double_t & GetRefY()
virtual Double_t & GetRefX()
I/O parameters for vertex fit routines.
virtual Double_t & GetRefZ()
virtual Double_t & GetRefChi2()
Array[6] of covariance matrix.
virtual Int_t & GetRefNDF()
Chi^2 after fit.
virtual Double_t * GetCovMatrix()
const int & GetPDG() const
void SetNDaughters(int n)
std::vector< fvec > fDaughterIds
std::vector< fvec > & DaughterIds()
Bool_t fAtProductionVertex
const Double_t & GetMassHypo() const
const std::vector< int > & DaughterIds() const
fvec GetDistanceFromParticleXY(const KFParticleSIMD &p) const
fvec GetCovariance(int i) const
fvec GetAngle(const KFParticleSIMD &p) const
fvec GetDeviationFromVertexXY(const fvec v[], const fvec Cv[]=0) const
void GetDStoParticle(const KFParticleSIMD &p, fvec &DS, fvec &DSp) const
fvec GetDStoPoint(const fvec xyz[]) const
void Create(const fvec Param[], const fvec Cov[], Int_t Charge, fvec mass)
static void GetExternalTrackParam(const KFParticleBaseSIMD &p, fvec &X, fvec &Alpha, fvec P[5])
void Transport(fvec dS, fvec P[], fvec C[]) const
fvec GetDeviationFromParticleXY(const KFParticleSIMD &p) const
fvec GetAngleRZ(const KFParticleSIMD &p) const
fvec GetAngleXY(const KFParticleSIMD &p) const
fvec GetPseudoProperDecayTime(const KFParticleSIMD &primVertex, const fvec &mass, fvec *timeErr2=0) const
fvec * CovarianceMatrix()
void GetKFParticle(KFParticle &Part, int iPart=0)
fvec GetDistanceFromVertexXY(const fvec vtx[], fvec &val, fvec &err) const
void ConstructGamma(const KFParticleSIMD &daughter1, const KFParticleSIMD &daughter2)
void GetDStoParticleXY(const KFParticleBaseSIMD &p, fvec &DS, fvec &DSp) const
Double_t * CovarianceMatrix()
void SetAtProductionVertex(Bool_t b)
const Int_t & NDF() const
Bool_t GetAtProductionVertex() const
void SetFieldCoeff(float c, int i)
void SetNDaughters(int n)
const Double_t & Chi2() const
RVec< PromoteType< T > > sqrt(const RVec< T > &v)
RVec< PromoteType< T > > acos(const RVec< T > &v)
*brief user defined string literal for JSON values *sa std::size_t n
RooConstVar & C(double value)