23 #ifdef HomogeneousField
28 #ifdef NonhomogeneousField
29 #include "CbmKFTrack.h"
32 #ifdef HomogeneousField
64 for(
int i=0;
i<21;
i++ ) C[
i] = Cov[
i];
72 #ifdef NonhomogeneousField
75 Create(Track, NTracks, qHypo, pdg);
85 for (
int j=0; j<NTracks; j++)
92 fNDF[j] = Track[j]->GetRefNDF();
93 fChi2[j] = Track[j]->GetRefChi2();
95 for(
int i = 0;
i < 6;
i++) m[
i][j] = Track[j]->GetTrack()[
i];
96 for(
int i = 0;
i < 15;
i++) V[
i][j] = Track[j]->GetCovMatrix()[
i];
100 fvec a = m[2],
b = m[3], qp = m[4];
110 fvec eE =
sqrt( TrMass*TrMass + p2 );
112 fvec H[3] = { -px*
c2, -py*
c2, -pz*pq };
124 fvec cxpz = H[0]*V[ 3] + H[1]*V[ 6] + H[2]*V[10];
125 fvec cypz = H[0]*V[ 4] + H[1]*V[ 7] + H[2]*V[11];
126 fvec capz = H[0]*V[ 5] + H[1]*V[ 8] + H[2]*V[12];
127 fvec cbpz = H[0]*V[ 8] + H[1]*V[ 9] + H[2]*V[13];
128 fvec cqpz = H[0]*V[12] + H[1]*V[13] + H[2]*V[14];
129 fvec cpzpz = H[0]*H[0]*V[5] +H[1]*H[1]*V[9] + H[2]*H[2]*V[14]
130 + 2*( H[0]*H[1]*V[8] +H[0]*H[2]*V[12] +H[1]*H[2]*V[13]);
138 fC[ 6] = V[3]*pz + a*cxpz;
139 fC[ 7] = V[4]*pz + a*cypz;
141 fC[ 9] = V[5]*pz*pz + 2*a*pz*capz + a*a*cpzpz;
142 fC[10] = V[6]*pz+b*cxpz;
143 fC[11] = V[7]*pz+b*cypz;
145 fC[13] = V[8]*pz*pz + a*pz*cbpz + b*pz*capz + a*b*cpzpz;
146 fC[14] = V[9]*pz*pz + 2*b*pz*cbpz + b*b*cpzpz;
150 fC[18] = capz*pz + a*cpzpz;
151 fC[19] = cbpz*pz + b*cpzpz;
156 fC[24] = HE*( V[12]*pz + a*cqpz );
157 fC[25] = HE*( V[13]*pz + b*cqpz );
159 fC[27] = HE*HE*V[14];
160 fC[28] = fC[29] = fC[30] = fC[31] = fC[32] = fC[33] = fC[34] = 0;
164 fQ[j] = (qp[j]>0.) ?1 :( (qp[j]<0) ?-1 :0);
179 CbmKFTrack Tr(Track);
180 for(
unsigned int i=0;
i<6;
i++)
181 m[
i] = Tr.GetTrack()[
i];
182 for(
unsigned int i=0;
i<15;
i++)
183 V[
i] = Tr.GetCovMatrix()[
i];
187 fNDF = Tr.GetRefNDF();
188 fChi2 = Tr.GetRefChi2();
190 fvec a = m[2], b = m[3], qp = m[4];
194 fvec c2 = 1./(1. + a*a + b*
b);
200 fvec eE =
sqrt( TrMass*TrMass + p2 );
202 fvec H[3] = { -px*
c2, -py*
c2, -pz*pq };
214 fvec cxpz = H[0]*V[ 3] + H[1]*V[ 6] + H[2]*V[10];
215 fvec cypz = H[0]*V[ 4] + H[1]*V[ 7] + H[2]*V[11];
216 fvec capz = H[0]*V[ 5] + H[1]*V[ 8] + H[2]*V[12];
217 fvec cbpz = H[0]*V[ 8] + H[1]*V[ 9] + H[2]*V[13];
218 fvec cqpz = H[0]*V[12] + H[1]*V[13] + H[2]*V[14];
219 fvec cpzpz = H[0]*H[0]*V[5] +H[1]*H[1]*V[9] + H[2]*H[2]*V[14]
220 + 2*( H[0]*H[1]*V[8] +H[0]*H[2]*V[12] +H[1]*H[2]*V[13]);
228 fC[ 6] = V[3]*pz + a*cxpz;
229 fC[ 7] = V[4]*pz + a*cypz;
231 fC[ 9] = V[5]*pz*pz + 2*a*pz*capz + a*a*cpzpz;
232 fC[10] = V[6]*pz+b*cxpz;
233 fC[11] = V[7]*pz+b*cypz;
235 fC[13] = V[8]*pz*pz + a*pz*cbpz + b*pz*capz + a*b*cpzpz;
236 fC[14] = V[9]*pz*pz + 2*b*pz*cbpz + b*b*cpzpz;
240 fC[18] = capz*pz + a*cpzpz;
241 fC[19] = cbpz*pz + b*cpzpz;
246 fC[24] = HE*( V[12]*pz + a*cqpz );
247 fC[25] = HE*( V[13]*pz + b*cqpz );
249 fC[27] = HE*HE*V[14];
250 fC[28] = fC[29] = fC[30] = fC[31] = fC[32] = fC[33] = fC[34] = 0;
254 fQ[j] = (qp[j]>0.) ?1 :( (qp[j]<0) ?-1 :0);
279 #ifdef HomogeneousField
287 for(Int_t iPart = 0; iPart<
fvecLen; iPart++)
290 for(Int_t
i=0;
i<3;
i++)
293 for(Int_t
i=0;
i<3;
i++)
294 fP[
i+3][iPart] = r[
i];
297 for(Int_t
i=0;
i<21;
i++)
304 for(Int_t iPart = 0; iPart<
fvecLen; iPart++)
318 for(Int_t
i=0;
i<3;
i++)
321 for(Int_t
i=0;
i<3;
i++)
325 for(Int_t
i=0;
i<21;
i++)
337 Create(Track, NTracks, qHypo, pdg);
346 for(Int_t iPart = 0; iPart<NTracks; iPart++)
349 for(Int_t
i=0;
i<3;
i++)
352 for(Int_t
i=0;
i<3;
i++)
353 fP[
i+3][iPart] = r[
i];
356 for(Int_t
i=0;
i<21;
i++)
363 for(Int_t iPart = 0; iPart<NTracks; iPart++)
378 for(Int_t
i=0;
i<3;
i++)
381 for(Int_t
i=0;
i<21;
i++)
399 pti = (!mask) & (One/pt);
400 cosA =
if3(mask, One, cosA*pti);
401 sinA =
if3(mask, One, sinA*pti);
406 PSIMD[0]= p.
GetY()*cosA - p.
GetX()*sinA;
409 PSIMD[3]= p.
GetPz()*pti;
410 PSIMD[4]= p.
GetQ()*pti;
412 for(
int iPart=0; iPart<
fvecLen; iPart++)
414 X[iPart] = XSIMD[iPart];
415 Alpha[iPart] = AlphaSIMD[iPart];
416 P[0][iPart] = PSIMD[0][iPart];
417 P[1][iPart] = PSIMD[1][iPart];
418 P[2][iPart] = PSIMD[2][iPart];
419 P[3][iPart] = PSIMD[3][iPart];
420 P[4][iPart] = PSIMD[4][iPart];
431 for (
int ie = 1; ie < nPart; ie++ ) {
437 std::cout <<
" void CbmKFParticle_simd::Create(CbmKFParticle *parts[], int N) " << std::endl;
444 for (
int ie = 0; ie < nPart; ie++ ) {
452 for(
int i = 0;
i < 8; ++
i )
454 for(
int i = 0;
i < 36; ++
i )
461 #ifdef NonhomogeneousField
463 fField.SetOneEntry( ie, field, 0 );
485 for(
int i = 0;
i < 8; ++
i )
487 for(
int i = 0;
i < 36; ++
i )
490 #ifdef NonhomogeneousField
515 pt =
if3(mask, One, pt);
516 ex = (!mask) & (px/pt);
517 ey = (!mask) & (py/pt);
518 val =
if3(mask,
fvec(1.e4), dy*ex - dx*ey);
522 fvec h3 = (dy*ey + dx*ex)*ey/pt;
523 fvec h4 = -(dy*ey + dx*ex)*ex/pt;
532 err+= h0*(h0*Cv[0] + h1*Cv[1] ) + h1*(h0*Cv[1] + h1*Cv[2] );
553 #ifdef HomogeneousField
577 #ifdef HomogeneousField
592 fvec mP[8], mC[36], mP1[8], mC1[36];
597 return sqrt(dx*dx+dy*dy);
606 fvec mP1[8], mC1[36];
609 fvec d[2]={
fP[0]-mP1[0],
fP[1]-mP1[1] };
611 fvec sigmaS = .1+10.*
sqrt( (d[0]*d[0]+d[1]*d[1] )/
612 (mP1[3]*mP1[3]+mP1[4]*mP1[4] ) );
614 fvec h[2] = { mP1[3]*sigmaS, mP1[4]*sigmaS };
633 ret =
if3(mask, ret, val/err);
646 #ifdef HomogeneousField
663 fvec mP[8], mC[36], mP1[8], mC1[36];
666 fvec n =
sqrt( mP[3]*mP[3] + mP[4]*mP[4] + mP[5]*mP[5] );
667 fvec n1=
sqrt( mP1[3]*mP1[3] + mP1[4]*mP1[4] + mP1[5]*mP1[5] );
671 a = ( mP[3]*mP1[3] + mP[4]*mP1[4] + mP[5]*mP1[5] )/n;
685 fvec mP[8], mC[36], mP1[8], mC1[36];
688 fvec n =
sqrt( mP[3]*mP[3] + mP[4]*mP[4] );
689 fvec n1=
sqrt( mP1[3]*mP1[3] + mP1[4]*mP1[4] );
693 a = ( mP[3]*mP1[3] + mP[4]*mP1[4] )/n;
707 fvec mP[8], mC[36], mP1[8], mC1[36];
710 fvec nr =
sqrt( mP[3]*mP[3] + mP[4]*mP[4] );
711 fvec n1r=
sqrt( mP1[3]*mP1[3] + mP1[4]*mP1[4] );
713 fvec n1=
sqrt( n1r*n1r + mP1[5]*mP1[5] );
717 a = ( nr*n1r +mP[5]*mP1[5])/n;
766 const fvec mipt2 = mass*ipt2;
779 const fvec f0 =
Px()*mipt2;
781 const fvec mipt2derivative = mipt2*(1-2*
Px()*
Px()*ipt2);
782 const fvec f2 = dx*mipt2derivative;
783 const fvec f3 = -dy*mipt2derivative;
816 return ( dx*
Px() + dy*
Py() )*mipt2;
821 Part.
SetId(static_cast<int>(
Id()[iPart]));
830 for(
int iP=0; iP<8; iP++)
832 for(
int iC=0; iC<36; iC++)
835 Part.
NDF() =
static_cast<int>(
GetNDF()[iPart]);
837 Part.
Q() =
GetQ()[iPart];
839 #ifdef NonomogeneousField
840 Part.SetFieldCoeff(
fField.cx0[iPart], 0);
841 Part.SetFieldCoeff(
fField.cx1[iPart], 1);
842 Part.SetFieldCoeff(
fField.cx2[iPart], 2);
843 Part.SetFieldCoeff(
fField.cy0[iPart], 3);
844 Part.SetFieldCoeff(
fField.cy1[iPart], 4);
845 Part.SetFieldCoeff(
fField.cy2[iPart], 5);
846 Part.SetFieldCoeff(
fField.cz0[iPart], 6);
847 Part.SetFieldCoeff(
fField.cz1[iPart], 7);
848 Part.SetFieldCoeff(
fField.cz2[iPart], 8);
849 Part.SetFieldCoeff(
fField.z0[iPart], 9);
855 for(
int i=0;
i<nPart;
i++)
void GetDStoParticle(const KFParticleSIMD &p, fvec &DS, fvec &DSp) const
friend F32vec4 acos(const F32vec4 &a)
std::vector< fvec > fDaughterIds
fvec GetAngleXY(const KFParticleSIMD &p) const
Bool_t GetAtProductionVertex() const
void SetNDaughters(int n)
friend F32vec4 sqrt(const F32vec4 &a)
Double_t val[nBoxes][nFEBox]
fvec GetDeviationFromVertexXY(const fvec v[], const fvec Cv[]=0) const
int GetNContributors() const
Double_t * CovarianceMatrix()
void GetDStoParticleXY(const KFParticleBaseSIMD &p, fvec &DS, fvec &DSp) const
fvec GetPseudoProperDecayTime(const KFParticleSIMD &primVertex, const fvec &mass, fvec *timeErr2=0) const
fvec GetDStoPoint(const fvec xyz[]) const
TString pt(TString pts, TString exts="px py pz")
fvec * CovarianceMatrix()
fvec GetCovariance(int i) const
const Double_t & Chi2() const
void GetXYZ(float *position) const
static KFParticleDatabase * Instance()
fvec GetDeviationFromParticleXY(const KFParticleSIMD &p) const
void SetAtProductionVertex(Bool_t b)
void SetNDaughters(int n)
std::vector< fvec > & DaughterIds()
friend F32vec4 fabs(const F32vec4 &a)
void ConstructGamma(const KFParticleSIMD &daughter1, const KFParticleSIMD &daughter2)
friend F32vec4 atan2(const F32vec4 &y, const F32vec4 &x)
bool GetCovarianceXYZPxPyPz(float cv[21]) const
const int & GetPDG() const
Bool_t fAtProductionVertex
const Int_t & NDF() const
fvec GetAngle(const KFParticleSIMD &p) const
const std::vector< int > & DaughterIds() const
void PxPyPz(float *position) const
void Transport(fvec dS, fvec P[], fvec C[]) const
void GetKFParticle(KFParticle &Part, int iPart=0)
void GetCovarianceMatrix(float *covmatrix) const
void XvYvZv(float *position) const
fvec GetAngleRZ(const KFParticleSIMD &p) const
fvec GetDistanceFromVertexXY(const fvec vtx[], fvec &val, fvec &err) const
void Create(const fvec Param[], const fvec Cov[], fvec Charge, fvec mass)
fvec GetDistanceFromParticleXY(const KFParticleSIMD &p) const
static void GetExternalTrackParam(const KFParticleBaseSIMD &p, Double_t X[fvecLen], Double_t Alpha[fvecLen], Double_t P[5][fvecLen])