BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
CbmKFParticle_simd.cxx
Go to the documentation of this file.
1// 3456789012345678901234567890123456789012345678901234567890123456789012
2/** Implementation of the CbmKFParticle_simd class
3 *
4 * @author S.Gorbunov, I.Kisel
5 * @version 1.0
6 * @since 06.02.06
7 *
8 */
9
10#include "CbmKFParticle_simd.h"
11
12#include "CbmKF.h"
13#include "CbmKFHit.h"
14#include "CbmKFMath.h"
15#include "CbmKFParticle.h"
16#include "CbmKFTrack.h"
17#include "CbmStsHit.h"
18#include "CbmStsKFTrackFitter.h"
19#include "TMath.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
36 : fId(-1)
37 , fDaughterIds()
38 , NDF(0)
39 , Chi2(0)
40 , Q(0)
41 , fPDG(0)
43 , fIsVtxGuess(0)
45 , fField()
46{
47 cnst ZERO = 0.0, ONE = 1.;
48
49 for (int i = 0; i < 8; i++)
50 r[i] = ZERO;
51 for (int i = 0; i < 36; i++)
52 C[i] = ZERO;
53 for (int i = 0; i < 3; i++) {
54 fVtxGuess[i] = ZERO;
55 fVtxErrGuess[i] = ONE;
56 }
57}
58
60 : fId(part.Id())
61 , fDaughterIds()
62 , NDF(part.GetNDF())
63 , Chi2(part.GetChi2())
64 , Q(part.GetQ())
65 , fPDG(part.GetPDG())
66 , AtProductionVertex(part.GetAtProductionVertex())
67 , fIsVtxGuess(0)
69 , fField()
70{
72 for (int i = 0; i < part.NDaughters(); ++i) {
73 fDaughterIds.push_back(part.DaughterIds()[i]);
74 }
75
76 for (int i = 0; i < 8; ++i)
77 r[i] = part.GetParameters()[i];
78 for (int i = 0; i < 36; ++i)
79 C[i] = part.GetCovMatrix()[i];
80
82}
83
85 : fId(-1)
86 , fDaughterIds()
87 , NDF(0)
88 , Chi2(0)
89 , Q(0)
90 , fPDG(0)
92 , fIsVtxGuess(0)
94 , fField()
95{
96 Create(part);
97}
98
100{
101
102 { // check
103 bool ok = 1;
104 const int nD = (parts[0])->NDaughters();
105 for (int ie = 1; ie < N; ie++) {
106 const CbmKFParticle& part = *(parts[ie]);
107 ok &= part.NDaughters() == nD;
108 }
109 // assert(ok);
110 if (!ok) {
111 std::cout << " void CbmKFParticle_simd::Create(CbmKFParticle *parts[], int N) " << std::endl;
112 exit(1);
113 }
114 }
115
116 fDaughterIds.resize((parts[0])->NDaughters(), fvec(-1));
117
118 for (int ie = 0; ie < N; ie++) {
119 CbmKFParticle& part = *(parts[ie]);
120
121 fId[ie] = part.Id();
122 fDaughterIds.back()[ie] = part.Id();
123
124 fPDG[ie] = part.GetPDG();
125
126 for (int i = 0; i < 8; ++i)
127 r[i][ie] = part.GetParameters()[i];
128 for (int i = 0; i < 36; ++i)
129 C[i][ie] = part.GetCovMatrix()[i];
130
131 NDF[ie] = part.GetNDF();
132 Chi2[ie] = part.GetChi2();
133 Q[ie] = part.GetQ();
134 AtProductionVertex = part.GetAtProductionVertex(); // CHECKME
135
136 L1FieldRegion field(part.fieldRegion);
137 fField.SetOneEntry(ie, field, 0);
138 }
139}
140
142 : fId(-1)
143 , fDaughterIds()
144 , NDF(0)
145 , Chi2(0)
146 , Q(0)
147 , fPDG(0)
149 , fIsVtxGuess(0)
150 , fIsVtxErrGuess(0)
151 , fField()
152{
153 fDaughterIds.push_back(Track.Id());
154
155 fvec m[6];
156 fvec V[15];
157 fvec TrMass;
158
159 CbmKFTrack Tr(Track);
160 for (unsigned int i = 0; i < 6; i++)
161 m[i] = Tr.GetTrack()[i];
162 for (unsigned int i = 0; i < 15; i++)
163 V[i] = Tr.GetCovMatrix()[i];
164 // TrMass = pdg ? TDatabasePDG::Instance()->GetParticle(*pdg)->Mass() :Tr.GetMass();
165 TrMass = pdg ? CbmKFParticleDatabase::Instance()->GetMass(*pdg) : Tr.GetMass();
166
167 NDF = Tr.GetRefNDF();
168 Chi2 = Tr.GetRefChi2();
169
170 fvec a = m[2], b = m[3], qp = m[4];
171
172 //* convert the track to (x,y,px,py,pz,e,t/p) parameterization
173
174 fvec c2 = 1. / (1. + a * a + b * b);
175 fvec pq = 1. / qp;
176 fvec p2 = pq * pq;
177 fvec pz = sqrt(p2 * c2);
178 fvec px = a * pz;
179 fvec py = b * pz;
180 fvec E = sqrt(TrMass * TrMass + p2);
181
182 fvec H[3] = {-px * c2, -py * c2, -pz * pq};
183 fvec HE = -pq * p2 / E;
184
185 r[0] = m[0];
186 r[1] = m[1];
187 r[2] = m[5];
188 r[3] = px;
189 r[4] = py;
190 r[5] = pz;
191 r[6] = E;
192 r[7] = 0;
193
194 fvec cxpz = H[0] * V[3] + H[1] * V[6] + H[2] * V[10];
195 fvec cypz = H[0] * V[4] + H[1] * V[7] + H[2] * V[11];
196 fvec capz = H[0] * V[5] + H[1] * V[8] + H[2] * V[12];
197 fvec cbpz = H[0] * V[8] + H[1] * V[9] + H[2] * V[13];
198 fvec cqpz = H[0] * V[12] + H[1] * V[13] + H[2] * V[14];
199 fvec cpzpz = H[0] * H[0] * V[5] + H[1] * H[1] * V[9] + H[2] * H[2] * V[14]
200 + 2 * (H[0] * H[1] * V[8] + H[0] * H[2] * V[12] + H[1] * H[2] * V[13]);
201
202 C[0] = V[0];
203 C[1] = V[1];
204 C[2] = V[2];
205 C[3] = 0;
206 C[4] = 0;
207 C[5] = 0;
208 C[6] = V[3] * pz + a * cxpz;
209 C[7] = V[4] * pz + a * cypz;
210 C[8] = 0;
211 C[9] = V[5] * pz * pz + 2 * a * pz * capz + a * a * cpzpz;
212 C[10] = V[6] * pz + b * cxpz;
213 C[11] = V[7] * pz + b * cypz;
214 C[12] = 0;
215 C[13] = V[8] * pz * pz + a * pz * cbpz + b * pz * capz + a * b * cpzpz;
216 C[14] = V[9] * pz * pz + 2 * b * pz * cbpz + b * b * cpzpz;
217 C[15] = cxpz;
218 C[16] = cypz;
219 C[17] = 0;
220 C[18] = capz * pz + a * cpzpz;
221 C[19] = cbpz * pz + b * cpzpz;
222 C[20] = cpzpz;
223 C[21] = HE * V[10];
224 C[22] = HE * V[11];
225 C[23] = 0;
226 C[24] = HE * (V[12] * pz + a * cqpz);
227 C[25] = HE * (V[13] * pz + b * cqpz);
228 C[26] = HE * cqpz;
229 C[27] = HE * HE * V[14];
230 C[28] = C[29] = C[30] = C[31] = C[32] = C[33] = C[34] = 0;
231 C[35] = 1.;
232
233 for (int j = 0; j < fvecLen; j++)
234 Q[j] = (qp[j] > 0.) ? 1 : ((qp[j] < 0) ? -1 : 0);
235}
236
238 : fId(-1)
239 , fDaughterIds()
240 , NDF(0)
241 , Chi2(0)
242 , Q(0)
243 , fPDG(0)
245 , fIsVtxGuess(0)
246 , fIsVtxErrGuess(0)
247 , fField()
248{
249 Create(Track, fvecLen, qHypo, pdg);
250}
251
252void CbmKFParticle_simd::Create(CbmKFTrackInterface* Track[], int NTracks, Int_t* qHypo, const Int_t* pdg)
253{
254 fvec m[6];
255 fvec V[15];
256 fvec TrMass;
257
258 fDaughterIds.push_back(fvec(-1));
259 for (int j = 0; j < NTracks; j++) {
260 fDaughterIds.back()[j] = Track[j]->Id();
261
262 // TrMass[j] = pdg ? TDatabasePDG::Instance()->GetParticle(*pdg)->Mass() : Track[j]->GetMass();
263 TrMass[j] = pdg ? CbmKFParticleDatabase::Instance()->GetMass(*pdg) : Track[j]->GetMass();
264
265 NDF[j] = Track[j]->GetRefNDF();
266 Chi2[j] = Track[j]->GetRefChi2();
267
268 for (int i = 0; i < 6; i++)
269 m[i][j] = Track[j]->GetTrack()[i];
270 for (int i = 0; i < 15; i++)
271 V[i][j] = Track[j]->GetCovMatrix()[i];
272 }
273
274 fvec a = m[2], b = m[3], qp = m[4];
275
276 //* convert the track to (x,y,px,py,pz,e,t/p) parameterization
277
278 fvec c2 = 1. / (1. + a * a + b * b);
279 fvec pq = 1. / qp;
280 fvec p2 = pq * pq;
281 fvec pz = sqrt(p2 * c2);
282 fvec px = a * pz;
283 fvec py = b * pz;
284 fvec E = sqrt(TrMass * TrMass + p2);
285
286 fvec H[3] = {-px * c2, -py * c2, -pz * pq};
287 fvec HE = -pq * p2 / E;
288
289 r[0] = m[0];
290 r[1] = m[1];
291 r[2] = m[5];
292 r[3] = px;
293 r[4] = py;
294 r[5] = pz;
295 r[6] = E;
296 r[7] = 0;
297
298 fvec cxpz = H[0] * V[3] + H[1] * V[6] + H[2] * V[10];
299 fvec cypz = H[0] * V[4] + H[1] * V[7] + H[2] * V[11];
300 fvec capz = H[0] * V[5] + H[1] * V[8] + H[2] * V[12];
301 fvec cbpz = H[0] * V[8] + H[1] * V[9] + H[2] * V[13];
302 fvec cqpz = H[0] * V[12] + H[1] * V[13] + H[2] * V[14];
303 fvec cpzpz = H[0] * H[0] * V[5] + H[1] * H[1] * V[9] + H[2] * H[2] * V[14]
304 + 2 * (H[0] * H[1] * V[8] + H[0] * H[2] * V[12] + H[1] * H[2] * V[13]);
305
306 C[0] = V[0];
307 C[1] = V[1];
308 C[2] = V[2];
309 C[3] = 0.f;
310 C[4] = 0.f;
311 C[5] = 0.f;
312 C[6] = V[3] * pz + a * cxpz;
313 C[7] = V[4] * pz + a * cypz;
314 C[8] = 0.f;
315 C[9] = V[5] * pz * pz + 2 * a * pz * capz + a * a * cpzpz;
316 C[10] = V[6] * pz + b * cxpz;
317 C[11] = V[7] * pz + b * cypz;
318 C[12] = 0.f;
319 C[13] = V[8] * pz * pz + a * pz * cbpz + b * pz * capz + a * b * cpzpz;
320 C[14] = V[9] * pz * pz + 2 * b * pz * cbpz + b * b * cpzpz;
321 C[15] = cxpz;
322 C[16] = cypz;
323 C[17] = 0.f;
324 C[18] = capz * pz + a * cpzpz;
325 C[19] = cbpz * pz + b * cpzpz;
326 C[20] = cpzpz;
327 C[21] = HE * V[10];
328 C[22] = HE * V[11];
329 C[23] = 0.f;
330 C[24] = HE * (V[12] * pz + a * cqpz);
331 C[25] = HE * (V[13] * pz + b * cqpz);
332 C[26] = HE * cqpz;
333 C[27] = HE * HE * V[14];
334 C[28] = C[29] = C[30] = C[31] = C[32] = C[33] = C[34] = 0;
335 C[35] = 1.f;
336
337 for (int j = 0; j < fvecLen; j++)
338 Q[j] = (qp[j] > 0.) ? 1 : ((qp[j] < 0) ? -1 : 0);
340 fIsVtxGuess = false;
341 fIsVtxErrGuess = false;
342}
343
344void CbmKFParticle_simd::SetField(const L1FieldRegion& field, bool isOneEntry, const int iVec)
345{
346 if (!isOneEntry)
347 fField = field;
348 else
349 fField.SetOneEntry(field, iVec);
350}
351
353{
354 fvec T[6], Cov[15];
355
356 fvec px = r[3], py = r[4], pz = r[5];
357 fvec p = sqrt(px * px + py * py + pz * pz);
358 fvec pzi = 1 / pz;
359 fvec qp = 1 / p;
360
361 for (int j = 0; j < fvecLen; j++)
362 if (Q[j] != 0)
363 qp[j] = Q[j] * qp[j];
364
365 T[0] = r[0]; // dX = dx -T[2]*dz
366 T[1] = r[1]; // dY = dy -T[3]*dz
367 T[2] = px * pzi; // dtx= (dpx - T[2]*dpz)/pz
368 T[3] = py * pzi; // dty= (dpy - T[3]*dpz)/pz
369 T[4] = qp; // dq = (px*dpx + py*dpy + pz*dpz)*(-q/p^3)
370 T[5] = r[2];
371
372 fvec qp3 = qp * qp * qp;
373 fvec pzi2 = pzi * pzi;
374
375 fvec cXpz = C[15] - T[2] * C[17];
376 fvec cYpz = C[16] - T[3] * C[17];
377 fvec cqpx = -qp3 * (px * C[9] + py * C[13] + pz * C[18]);
378 fvec cqpy = -qp3 * (px * C[13] + py * C[14] + pz * C[19]);
379 fvec cqpz = -qp3 * (px * C[18] + py * C[19] + pz * C[20]);
380
381 Cov[0] = C[0] + T[2] * (-2 * C[3] + T[2] * C[5]);
382 Cov[1] = C[1] - T[2] * C[4] + T[3] * (-C[3] + T[2] * C[5]);
383 Cov[2] = C[2] + T[3] * (-2 * C[4] + T[3] * C[5]);
384 Cov[3] = pzi * (C[6] - T[2] * (C[8] + cXpz));
385 Cov[4] = pzi * (C[7] - T[3] * C[8] - T[2] * cYpz);
386 Cov[5] = pzi2 * (C[9] + T[2] * (-2 * C[18] + T[2] * C[20]));
387 Cov[6] = pzi * (C[10] - T[2] * C[12] - T[3] * cXpz);
388 Cov[7] = pzi * (C[11] - T[3] * (C[12] + cYpz));
389 Cov[8] = pzi2 * (C[13] - T[2] * C[19] - T[3] * C[18] + T[2] * T[3] * C[20]);
390 Cov[9] = pzi2 * (C[14] + T[3] * (-2 * C[19] + T[3] * C[20]));
391 Cov[10] = -qp3 * (px * C[6] + py * C[10] + pz * C[15]) - T[2] * cqpz;
392 Cov[11] = -qp3 * (px * C[7] + py * C[11] + pz * C[16]) - T[3] * cqpz;
393 Cov[12] = pzi * (cqpx - T[2] * cqpz);
394 Cov[13] = pzi * (cqpy - T[3] * cqpz);
395 Cov[14] = -qp3 * (px * cqpx + py * cqpy + pz * cqpz);
396
397 for (int j = 0; j < fvecLen; j++) {
398 for (int i = 0; i < 6; i++)
399 Track[j]->GetTrack()[i] = T[i][j];
400 for (int i = 0; i < 15; i++)
401 Track[j]->GetCovMatrix()[i] = Cov[i][j];
402
403 Track[j]->GetRefNDF() = (int)NDF[j];
404 Track[j]->GetRefChi2() = Chi2[j];
405 }
406}
407
409{
410 fvec x = r[3];
411 fvec y = r[4];
412 fvec z = r[5];
413 fvec x2 = x * x;
414 fvec y2 = y * y;
415 fvec z2 = z * z;
416 fvec p2 = x2 + y2 + z2;
417 P = sqrt(p2);
418 Error = sqrt((x2 * C[9] + y2 * C[14] + z2 * C[20] + 2 * (x * y * C[13] + x * z * C[18] + y * z * C[19])) / p2);
419}
420
422{
423 // S = sigma^2 of m2/2
424
425 fvec S = (r[3] * r[3] * C[9] + r[4] * r[4] * C[14] + r[5] * r[5] * C[20] + r[6] * r[6] * C[27]
426 + 2
427 * (+r[3] * r[4] * C[13] + r[5] * (r[3] * C[18] + r[4] * C[19])
428 - r[6] * (r[3] * C[24] + r[4] * C[25] + r[5] * C[26])));
429 fvec m2 = r[6] * r[6] - r[3] * r[3] - r[4] * r[4] - r[5] * r[5];
430 for (int j = 0; j < fvecLen; j++) {
431 M[j] = (m2[j] > 1.e-20) ? sqrt(m2[j]) : 0.;
432 Error[j] = (S[j] >= 0 && m2[j] > 1.e-20) ? sqrt(S[j] / m2[j]) : 1.e4;
433 }
434}
435
437{
438 fvec x = r[3];
439 fvec y = r[4];
440 fvec z = r[5];
441 fvec t = r[7];
442 fvec x2 = x * x;
443 fvec y2 = y * y;
444 fvec z2 = z * z;
445 fvec p2 = x2 + y2 + z2;
446 L = t * sqrt(p2);
447 Error =
448 sqrt(p2 * C[35]
449 + t * t / p2 * (x2 * C[9] + y2 * C[14] + z2 * C[20] + 2 * (x * y * C[13] + x * z * C[18] + y * z * C[19]))
450 + 2 * t * (x * C[31] + y * C[32] + z * C[33]));
451}
452
454{
455 fvec m, dm;
456 GetMass(m, dm);
457 fvec cTM = (-r[3] * C[31] - r[4] * C[32] - r[5] * C[33] + r[6] * C[34]);
458 TauC = r[7] * m;
459 Error = sqrt(m * m * C[35] + 2 * r[7] * cTM + r[7] * r[7] * dm * dm);
460}
461
463{
464 fVtxGuess[0] = x;
465 fVtxGuess[1] = y;
466 fVtxGuess[2] = z;
467 fIsVtxGuess = 1;
468}
469
471{
472 fVtxErrGuess[0] = dx;
473 fVtxErrGuess[1] = dy;
474 fVtxErrGuess[2] = dz;
475 fIsVtxErrGuess = 1;
476}
477
478#undef cnst
#define cnst
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
int Int_t
void Error(const char *location, const char *msgfmt,...)
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)
const fvec & GetPDG() const
vector< fvec > fDaughterIds
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()
Information not to be changed.
virtual Double_t & GetRefChi2()
array[15] of covariance matrix
RVec< PromoteType< T > > sqrt(const RVec< T > &v)
Definition json.hpp:4446