BmnRoot
Loading...
Searching...
No Matches
CbmKFParticle_simd.cxx
Go to the documentation of this file.
1//3456789012345678901234567890123456789012345678901234567890123456789012
10#include "CbmKFParticle_simd.h"
11#include "CbmKFParticle.h"
12#include "CbmKF.h"
13#include "CbmKFMath.h"
14#include "CbmKFTrack.h"
15#include "CbmStsKFTrackFitter.h"
16#include "TMath.h"
17
18#include "CbmKFHit.h"
19#include "CbmStsHit.h"
20//#include "TDatabasePDG.h"
21
22#include "CbmKFParticleDatabase.h"
23
24//#include "CbmKFField.h"
25
26#include "TStopwatch.h"
27
28#include <cmath>
29#include <vector>
30
31#define cnst static const fvec
32
33using namespace std;
34
35CbmKFParticle_simd::CbmKFParticle_simd(): fId(-1), fDaughterIds(), NDF(0), Chi2(0), Q(0), fPDG(0), AtProductionVertex(0), fIsVtxGuess(0), fIsVtxErrGuess(0), fField()
36{
37 cnst ZERO = 0.0, ONE = 1.;
38
39 for(int i=0; i<8; i++)
40 r[i] = ZERO;
41 for(int i=0; i<36; i++)
42 C[i] = ZERO;
43 for(int i=0; i<3; i++)
44 {
45 fVtxGuess[i] = ZERO;
46 fVtxErrGuess[i] = ONE;
47 }
48
49}
50
51
53 fId(part.Id()),
54 fDaughterIds(),
55 NDF(part.GetNDF()),
56 Chi2(part.GetChi2()),
57 Q(part.GetQ()),
58 fPDG(part.GetPDG()),
59 AtProductionVertex(part.GetAtProductionVertex()),
60 fIsVtxGuess(0),
61 fIsVtxErrGuess(0),
62 fField()
63{
65 for( int i = 0; i < part.NDaughters(); ++i ) {
66 fDaughterIds.push_back( part.DaughterIds()[i] );
67 }
68
69 for( int i = 0; i < 8; ++i )
70 r[i] = part.GetParameters()[i];
71 for( int i = 0; i < 36; ++i )
72 C[i] = part.GetCovMatrix()[i];
73
75}
76
77
78CbmKFParticle_simd::CbmKFParticle_simd( CbmKFParticle *part[]): fId(-1), fDaughterIds(), NDF(0), Chi2(0), Q(0), fPDG(0), AtProductionVertex(0), fIsVtxGuess(0), fIsVtxErrGuess(0), fField(){
79 Create(part);
80}
81
83
84 { // check
85 bool ok = 1;
86 const int nD = (parts[0])->NDaughters();
87 for ( int ie = 1; ie < N; ie++ ) {
88 const CbmKFParticle &part = *(parts[ie]);
89 ok &= part.NDaughters() == nD;
90 }
91// assert(ok);
92 if (!ok) {
93 std::cout << " void CbmKFParticle_simd::Create(CbmKFParticle *parts[], int N) " << std::endl;
94 exit(1);
95 }
96 }
97
98 fDaughterIds.resize( (parts[0])->NDaughters(), fvec(-1) );
99
100 for ( int ie = 0; ie < N; ie++ ) {
101 CbmKFParticle &part = *(parts[ie]);
102
103 fId[ie] = part.Id();
104 fDaughterIds.back()[ie] = part.Id();
105
106 fPDG[ie] = part.GetPDG();
107
108 for( int i = 0; i < 8; ++i )
109 r[i][ie] = part.GetParameters()[i];
110 for( int i = 0; i < 36; ++i )
111 C[i][ie] = part.GetCovMatrix()[i];
112
113 NDF[ie] = part.GetNDF();
114 Chi2[ie] = part.GetChi2();
115 Q[ie] = part.GetQ();
116 AtProductionVertex = part.GetAtProductionVertex(); // CHECKME
117
118 L1FieldRegion field(part.fieldRegion);
119 fField.SetOneEntry( ie, field, 0 );
120 }
121}
122
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()
124{
125 fDaughterIds.push_back( Track.Id() );
126
127 fvec m[6];
128 fvec V[15];
129 fvec TrMass;
130
131 CbmKFTrack Tr(Track);
132 for(unsigned int i=0; i<6; i++)
133 m[i] = Tr.GetTrack()[i];
134 for(unsigned int i=0; i<15; i++)
135 V[i] = Tr.GetCovMatrix()[i];
136// TrMass = pdg ? TDatabasePDG::Instance()->GetParticle(*pdg)->Mass() :Tr.GetMass();
137 TrMass = pdg ? CbmKFParticleDatabase::Instance()->GetMass(*pdg) :Tr.GetMass();
138
139 NDF = Tr.GetRefNDF();
140 Chi2 = Tr.GetRefChi2();
141
142 fvec a = m[2], b = m[3], qp = m[4];
143
144 //* convert the track to (x,y,px,py,pz,e,t/p) parameterization
145
146 fvec c2 = 1./(1. + a*a + b*b);
147 fvec pq = 1./qp;
148 fvec p2 = pq*pq;
149 fvec pz = sqrt(p2*c2);
150 fvec px = a*pz;
151 fvec py = b*pz;
152 fvec E = sqrt( TrMass*TrMass + p2 );
153
154 fvec H[3] = { -px*c2, -py*c2, -pz*pq };
155 fvec HE = -pq*p2/E;
156
157 r[0] = m[0];
158 r[1] = m[1];
159 r[2] = m[5];
160 r[3] = px;
161 r[4] = py;
162 r[5] = pz;
163 r[6] = E;
164 r[7] = 0;
165
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]);
173
174 C[ 0] = V[0];
175 C[ 1] = V[1];
176 C[ 2] = V[2];
177 C[ 3] = 0;
178 C[ 4] = 0;
179 C[ 5] = 0;
180 C[ 6] = V[3]*pz + a*cxpz;
181 C[ 7] = V[4]*pz + a*cypz;
182 C[ 8] = 0;
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;
186 C[12] = 0;
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;
189 C[15] = cxpz;
190 C[16] = cypz;
191 C[17] = 0;
192 C[18] = capz*pz + a*cpzpz;
193 C[19] = cbpz*pz + b*cpzpz;
194 C[20] = cpzpz;
195 C[21] = HE*V[10];
196 C[22] = HE*V[11];
197 C[23] = 0;
198 C[24] = HE*( V[12]*pz + a*cqpz );
199 C[25] = HE*( V[13]*pz + b*cqpz );
200 C[26] = HE*cqpz;
201 C[27] = HE*HE*V[14];
202 C[28] = C[29] = C[30] = C[31] = C[32] = C[33] = C[34] = 0;
203 C[35] = 1.;
204
205 for(int j=0; j<fvecLen; j++)
206 Q[j] = (qp[j]>0.) ?1 :( (qp[j]<0) ?-1 :0);
207}
208
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()
210{
211 Create(Track,fvecLen,qHypo,pdg);
212}
213
214void CbmKFParticle_simd::Create(CbmKFTrackInterface* Track[], int NTracks, Int_t *qHypo, const Int_t *pdg)
215{
216 fvec m[6];
217 fvec V[15];
218 fvec TrMass;
219
220 fDaughterIds.push_back( fvec(-1) );
221 for (int j=0; j<NTracks; j++)
222 {
223 fDaughterIds.back()[j] = Track[j]->Id();
224
225// TrMass[j] = pdg ? TDatabasePDG::Instance()->GetParticle(*pdg)->Mass() : Track[j]->GetMass();
226 TrMass[j] = pdg ? CbmKFParticleDatabase::Instance()->GetMass(*pdg) : Track[j]->GetMass();
227
228 NDF[j] = Track[j]->GetRefNDF();
229 Chi2[j] = Track[j]->GetRefChi2();
230
231 for(int i = 0; i < 6; i++) m[i][j] = Track[j]->GetTrack()[i];
232 for(int i = 0; i < 15; i++) V[i][j] = Track[j]->GetCovMatrix()[i];
233
234 }
235
236 fvec a = m[2], b = m[3], qp = m[4];
237
238 //* convert the track to (x,y,px,py,pz,e,t/p) parameterization
239
240 fvec c2 = 1./(1. + a*a + b*b);
241 fvec pq = 1./qp;
242 fvec p2 = pq*pq;
243 fvec pz = sqrt(p2*c2);
244 fvec px = a*pz;
245 fvec py = b*pz;
246 fvec E = sqrt( TrMass*TrMass + p2 );
247
248 fvec H[3] = { -px*c2, -py*c2, -pz*pq };
249 fvec HE = -pq*p2/E;
250
251 r[0] = m[0];
252 r[1] = m[1];
253 r[2] = m[5];
254 r[3] = px;
255 r[4] = py;
256 r[5] = pz;
257 r[6] = E;
258 r[7] = 0;
259
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]);
267
268 C[ 0] = V[0];
269 C[ 1] = V[1];
270 C[ 2] = V[2];
271 C[ 3] = 0.f;
272 C[ 4] = 0.f;
273 C[ 5] = 0.f;
274 C[ 6] = V[3]*pz + a*cxpz;
275 C[ 7] = V[4]*pz + a*cypz;
276 C[ 8] = 0.f;
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;
280 C[12] = 0.f;
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;
283 C[15] = cxpz;
284 C[16] = cypz;
285 C[17] = 0.f;
286 C[18] = capz*pz + a*cpzpz;
287 C[19] = cbpz*pz + b*cpzpz;
288 C[20] = cpzpz;
289 C[21] = HE*V[10];
290 C[22] = HE*V[11];
291 C[23] = 0.f;
292 C[24] = HE*( V[12]*pz + a*cqpz );
293 C[25] = HE*( V[13]*pz + b*cqpz );
294 C[26] = HE*cqpz;
295 C[27] = HE*HE*V[14];
296 C[28] = C[29] = C[30] = C[31] = C[32] = C[33] = C[34] = 0;
297 C[35] = 1.f;
298
299 for(int j=0; j<fvecLen; j++)
300 Q[j] = (qp[j]>0.) ?1 :( (qp[j]<0) ?-1 :0);
302 fIsVtxGuess = false;
303 fIsVtxErrGuess = false;
304}
305
306void CbmKFParticle_simd::SetField(const L1FieldRegion &field, bool isOneEntry, const int iVec)
307{
308 if(!isOneEntry)
309 fField = field;
310 else
311 fField.SetOneEntry(field,iVec);
312}
313
315{
316 fvec T[6],Cov[15];
317
318 fvec px=r[3], py=r[4], pz=r[5];
319 fvec p = sqrt( px*px + py*py + pz*pz );
320 fvec pzi = 1/pz;
321 fvec qp=1/p;
322
323 for(int j=0; j<fvecLen; j++)
324 if( Q[j]!=0 ) qp[j] = Q[j]*qp[j];
325
326 T[0] = r[0]; // dX = dx -T[2]*dz
327 T[1] = r[1]; // dY = dy -T[3]*dz
328 T[2] = px*pzi; // dtx= (dpx - T[2]*dpz)/pz
329 T[3] = py*pzi; // dty= (dpy - T[3]*dpz)/pz
330 T[4] = qp; // dq = (px*dpx + py*dpy + pz*dpz)*(-q/p^3)
331 T[5] = r[2];
332
333 fvec qp3 = qp*qp*qp;
334 fvec pzi2= pzi*pzi;
335
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] );
341
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 );
357
358 for(int j=0; j<fvecLen; j++)
359 {
360 for(int i=0;i<6;i++) Track[j]->GetTrack()[i] = T[i][j];
361 for(int i=0;i<15;i++) Track[j]->GetCovMatrix()[i] = Cov[i][j];
362
363 Track[j]->GetRefNDF() = (int) NDF[j];
364 Track[j]->GetRefChi2() = Chi2[j];
365 }
366}
367
368
370{
371 fvec x = r[3];
372 fvec y = r[4];
373 fvec z = r[5];
374 fvec x2 = x*x;
375 fvec y2 = y*y;
376 fvec z2 = z*z;
377 fvec p2 = x2+y2+z2;
378 P = sqrt(p2);
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 );
381}
382
384{
385 // S = sigma^2 of m2/2
386
387 fvec S = ( r[3]*r[3]*C[9] + r[4]*r[4]*C[14] + r[5]*r[5]*C[20]
388 + r[6]*r[6]*C[27]
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] ) )
391 );
392 fvec m2 = r[6]*r[6] - r[3]*r[3] - r[4]*r[4] - r[5]*r[5];
393 for(int j=0; j<fvecLen; j++)
394 {
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;
397 }
398}
399
400
402{
403 fvec x = r[3];
404 fvec y = r[4];
405 fvec z = r[5];
406 fvec t = r[7];
407 fvec x2 = x*x;
408 fvec y2 = y*y;
409 fvec z2 = z*z;
410 fvec p2 = x2+y2+z2;
411 L = t*sqrt(p2);
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])
415 );
416}
417
419 fvec m, dm;
420 GetMass( m, dm );
421 fvec cTM = (-r[3]*C[31] - r[4]*C[32] - r[5]*C[33] + r[6]*C[34]);
422 TauC = r[7]*m;
423 Error = sqrt( m*m*C[35] + 2*r[7]*cTM + r[7]*r[7]*dm*dm);
424}
425
427{
428 fVtxGuess[0] = x;
429 fVtxGuess[1] = y;
430 fVtxGuess[2] = z;
431 fIsVtxGuess = 1;
432}
433
435{
436 fVtxErrGuess[0] = dx;
437 fVtxErrGuess[1] = dy;
438 fVtxErrGuess[2] = dz;
439 fIsVtxErrGuess = 1;
440}
441
442#undef cnst
443
#define cnst
friend F32vec4 sqrt(const F32vec4 &a)
Definition P4_F32vec4.h:34
const int fvecLen
Definition P4_F32vec4.h:233
int i
Definition P4_F32vec4.h:22
__m128 m
Definition P4_F32vec4.h:27
F32vec4 fvec
Definition P4_F32vec4.h:231
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 SetVtxGuess(fvec &x, fvec &y, fvec &z)
void GetMass(fvec &M, fvec &Error)
void GetKFTrack(CbmKFTrackInterface **Track)
void GetLifeTime(fvec &T, fvec &Error)
int NDaughters() const
Double_t * GetParameters()
Int_t GetNDF() const
Double_t GetChi2() const
int GetPDG() const
Bool_t GetAtProductionVertex() const
int Id() const
const vector< int > & DaughterIds() const
Double_t GetQ() const
float fieldRegion[10]
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 GetMass()
Definition CbmKFTrack.h:55
Double_t * GetTrack()
Is it electron.
Definition CbmKFTrack.h:51
Double_t & GetRefChi2()
array[15] of covariance matrix
Definition CbmKFTrack.h:53
Int_t & GetRefNDF()
Chi^2 after fit.
Definition CbmKFTrack.h:54
Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
Definition CbmKFTrack.h:52
void SetOneEntry(const int i0, const L1FieldRegion &f1, const int i1)
Definition L1Field.h:176
STL namespace.