14#include "CbmKFTrack.h"
15#include "CbmStsKFTrackFitter.h"
22#include "CbmKFParticleDatabase.h"
26#include "TStopwatch.h"
31#define cnst static const fvec
37 cnst ZERO = 0.0, ONE = 1.;
39 for(
int i=0;
i<8;
i++)
41 for(
int i=0;
i<36;
i++)
43 for(
int i=0;
i<3;
i++)
59 AtProductionVertex(part.GetAtProductionVertex()),
69 for(
int i = 0;
i < 8; ++
i )
71 for(
int i = 0;
i < 36; ++
i )
87 for (
int ie = 1; ie < N; ie++ ) {
93 std::cout <<
" void CbmKFParticle_simd::Create(CbmKFParticle *parts[], int N) " << std::endl;
100 for (
int ie = 0; ie < N; ie++ ) {
104 fDaughterIds.back()[ie] = part.
Id();
108 for(
int i = 0;
i < 8; ++
i )
110 for(
int i = 0;
i < 36; ++
i )
123CbmKFParticle_simd::CbmKFParticle_simd(
CbmKFTrackInterface &Track, Int_t *qHypo,
const Int_t *pdg): fId(-1), fDaughterIds(), NDF(0), Chi2(0), Q(0), fPDG(0), AtProductionVertex(1), fIsVtxGuess(0), fIsVtxErrGuess(0), fField()
125 fDaughterIds.push_back( Track.
Id() );
132 for(
unsigned int i=0;
i<6;
i++)
134 for(
unsigned int i=0;
i<15;
i++)
142 fvec a =
m[2], b =
m[3], qp =
m[4];
146 fvec c2 = 1./(1. + a*a + b*b);
152 fvec E =
sqrt( TrMass*TrMass + p2 );
154 fvec H[3] = { -px*c2, -py*c2, -pz*pq };
166 fvec cxpz = H[0]*V[ 3] + H[1]*V[ 6] + H[2]*V[10];
167 fvec cypz = H[0]*V[ 4] + H[1]*V[ 7] + H[2]*V[11];
168 fvec capz = H[0]*V[ 5] + H[1]*V[ 8] + H[2]*V[12];
169 fvec cbpz = H[0]*V[ 8] + H[1]*V[ 9] + H[2]*V[13];
170 fvec cqpz = H[0]*V[12] + H[1]*V[13] + H[2]*V[14];
171 fvec cpzpz = H[0]*H[0]*V[5] +H[1]*H[1]*V[9] + H[2]*H[2]*V[14]
172 + 2*( H[0]*H[1]*V[8] +H[0]*H[2]*V[12] +H[1]*H[2]*V[13]);
180 C[ 6] = V[3]*pz + a*cxpz;
181 C[ 7] = V[4]*pz + a*cypz;
183 C[ 9] = V[5]*pz*pz + 2*a*pz*capz + a*a*cpzpz;
184 C[10] = V[6]*pz+b*cxpz;
185 C[11] = V[7]*pz+b*cypz;
187 C[13] = V[8]*pz*pz + a*pz*cbpz + b*pz*capz + a*b*cpzpz;
188 C[14] = V[9]*pz*pz + 2*b*pz*cbpz + b*b*cpzpz;
192 C[18] = capz*pz + a*cpzpz;
193 C[19] = cbpz*pz + b*cpzpz;
198 C[24] = HE*( V[12]*pz + a*cqpz );
199 C[25] = HE*( V[13]*pz + b*cqpz );
202 C[28] =
C[29] =
C[30] =
C[31] =
C[32] =
C[33] =
C[34] = 0;
206 Q[j] = (qp[j]>0.) ?1 :( (qp[j]<0) ?-1 :0);
209CbmKFParticle_simd::CbmKFParticle_simd(
CbmKFTrackInterface* Track[], Int_t *qHypo,
const Int_t *pdg): fId(-1), fDaughterIds(), NDF(0), Chi2(0), Q(0), fPDG(0), AtProductionVertex(0), fIsVtxGuess(0), fIsVtxErrGuess(0), fField()
220 fDaughterIds.push_back(
fvec(-1) );
221 for (
int j=0; j<NTracks; j++)
223 fDaughterIds.back()[j] = Track[j]->
Id();
231 for(
int i = 0;
i < 6;
i++)
m[
i][j] = Track[j]->GetTrack()[
i];
236 fvec a =
m[2], b =
m[3], qp =
m[4];
240 fvec c2 = 1./(1. + a*a + b*b);
246 fvec E =
sqrt( TrMass*TrMass + p2 );
248 fvec H[3] = { -px*c2, -py*c2, -pz*pq };
260 fvec cxpz = H[0]*V[ 3] + H[1]*V[ 6] + H[2]*V[10];
261 fvec cypz = H[0]*V[ 4] + H[1]*V[ 7] + H[2]*V[11];
262 fvec capz = H[0]*V[ 5] + H[1]*V[ 8] + H[2]*V[12];
263 fvec cbpz = H[0]*V[ 8] + H[1]*V[ 9] + H[2]*V[13];
264 fvec cqpz = H[0]*V[12] + H[1]*V[13] + H[2]*V[14];
265 fvec cpzpz = H[0]*H[0]*V[5] +H[1]*H[1]*V[9] + H[2]*H[2]*V[14]
266 + 2*( H[0]*H[1]*V[8] +H[0]*H[2]*V[12] +H[1]*H[2]*V[13]);
274 C[ 6] = V[3]*pz + a*cxpz;
275 C[ 7] = V[4]*pz + a*cypz;
277 C[ 9] = V[5]*pz*pz + 2*a*pz*capz + a*a*cpzpz;
278 C[10] = V[6]*pz+b*cxpz;
279 C[11] = V[7]*pz+b*cypz;
281 C[13] = V[8]*pz*pz + a*pz*cbpz + b*pz*capz + a*b*cpzpz;
282 C[14] = V[9]*pz*pz + 2*b*pz*cbpz + b*b*cpzpz;
286 C[18] = capz*pz + a*cpzpz;
287 C[19] = cbpz*pz + b*cpzpz;
292 C[24] = HE*( V[12]*pz + a*cqpz );
293 C[25] = HE*( V[13]*pz + b*cqpz );
296 C[28] =
C[29] =
C[30] =
C[31] =
C[32] =
C[33] =
C[34] = 0;
300 Q[j] = (qp[j]>0.) ?1 :( (qp[j]<0) ?-1 :0);
318 fvec px=
r[3], py=
r[4], pz=
r[5];
319 fvec p =
sqrt( px*px + py*py + pz*pz );
324 if( Q[j]!=0 ) qp[j] = Q[j]*qp[j];
336 fvec cXpz=
C[15]-T[2]*
C[17];
337 fvec cYpz=
C[16]-T[3]*
C[17];
338 fvec cqpx = -qp3*( px*
C[ 9] + py*
C[13] + pz*
C[18] );
339 fvec cqpy = -qp3*( px*
C[13] + py*
C[14] + pz*
C[19] );
340 fvec cqpz = -qp3*( px*
C[18] + py*
C[19] + pz*
C[20] );
342 Cov[ 0]=
C[0] + T[2]*( - 2*
C[3] + T[2]*
C[5] );
343 Cov[ 1]=
C[1] - T[2]*
C[4] + T[3]*( -
C[3] + T[2]*
C[5] );
344 Cov[ 2]=
C[2] + T[3]*( - 2*
C[4] + T[3]*
C[5]);
345 Cov[ 3]= pzi*(
C[6] - T[2]*(
C[8] + cXpz) );
346 Cov[ 4]= pzi*(
C[7] - T[3]*
C[8] - T[2]*cYpz );
347 Cov[ 5]= pzi2*(
C[9] + T[2]*( -2*
C[18] + T[2]*
C[20]) );
348 Cov[ 6]= pzi*(
C[10]-T[2]*
C[12]-T[3]*cXpz );
349 Cov[ 7]= pzi*(
C[11]-T[3]*(
C[12] +cYpz) );
350 Cov[ 8]= pzi2*(
C[13] - T[2]*
C[19] -T[3]*
C[18] + T[2]*T[3]*
C[20] );
351 Cov[ 9]= pzi2*(
C[14] + T[3]*( -2*
C[19] + T[3]*
C[20]) );
352 Cov[10]=-qp3*(px*
C[6]+py*
C[10]+pz*
C[15]) - T[2]*cqpz;
353 Cov[11]=-qp3*(px*
C[7]+py*
C[11]+pz*
C[16]) - T[3]*cqpz;
354 Cov[12]= pzi*( cqpx - T[2]*cqpz );
355 Cov[13]= pzi*( cqpy - T[3]*cqpz );
356 Cov[14]=-qp3*( px*cqpx + py*cqpy + pz*cqpz );
360 for(
int i=0;
i<6;
i++) Track[j]->GetTrack()[
i] = T[
i][j];
379 Error =
sqrt( (x2*
C[9]+y2*
C[14]+z2*
C[20]
380 + 2*(x*y*
C[13]+x*z*
C[18]+y*z*
C[19]) )/p2 );
387 fvec S = (
r[3]*
r[3]*
C[9] +
r[4]*
r[4]*
C[14] +
r[5]*
r[5]*
C[20]
389 +2*( +
r[3]*
r[4]*
C[13] +
r[5]*(
r[3]*
C[18] +
r[4]*
C[19])
390 -
r[6]*(
r[3]*
C[24] +
r[4]*
C[25] +
r[5]*
C[26] ) )
392 fvec m2 =
r[6]*
r[6] -
r[3]*
r[3] -
r[4]*
r[4] -
r[5]*
r[5];
395 M[j] = ( m2[j]>1.e-20 ) ?
sqrt(m2[j]) :0. ;
396 Error[j] = ( S[j]>=0 && m2[j]>1.e-20 ) ?
sqrt(S[j]/m2[j]) :1.e4;
412 Error =
sqrt( p2*
C[35] + t*t/p2*(x2*
C[9]+y2*
C[14]+z2*
C[20]
413 + 2*(x*y*
C[13]+x*z*
C[18]+y*z*
C[19]) )
414 + 2*t*(x*
C[31]+y*
C[32]+z*
C[33])
421 fvec cTM = (-
r[3]*
C[31] -
r[4]*
C[32] -
r[5]*
C[33] +
r[6]*
C[34]);
423 Error =
sqrt(
m*
m*
C[35] + 2*
r[7]*cTM +
r[7]*
r[7]*dm*dm);
friend F32vec4 sqrt(const F32vec4 &a)
static CbmKFParticleDatabase * Instance()
void Create(CbmKFTrackInterface *Track[], int Ntracks=fvecLen, Int_t *qHypo=0, const Int_t *pdg=0)
void GetDecayLength(fvec &L, fvec &Error)
void SetVtxErrGuess(fvec &d_x, fvec &d_y, fvec &d_z)
void GetMomentum(fvec &P, fvec &Error)
void SetNDaughters(int n)
void SetVtxGuess(fvec &x, fvec &y, fvec &z)
void GetMass(fvec &M, fvec &Error)
void GetKFTrack(CbmKFTrackInterface **Track)
void GetLifeTime(fvec &T, fvec &Error)
Double_t * GetParameters()
Bool_t GetAtProductionVertex() const
const vector< int > & DaughterIds() const
Double_t * GetCovMatrix()
virtual Int_t & GetRefNDF()
Chi^2 after fit.
virtual Double_t GetMass()
virtual Double_t & GetRefChi2()
array[15] of covariance matrix
Double_t * GetTrack()
Is it electron.
Double_t & GetRefChi2()
array[15] of covariance matrix
Int_t & GetRefNDF()
Chi^2 after fit.
Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
void SetOneEntry(const int i0, const L1FieldRegion &f1, const int i1)