BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
CbmKFParticleInterface.cxx
Go to the documentation of this file.
2
3#define cnst static const fvec
4
5// for particle finding
6#include "CbmKFTrack.h"
7#include "CbmL1Track.h"
8#include "CbmStsTrack.h"
9
10#include <map>
11using std::map;
12
13const float CbmKFParticleInterface::DefaultCuts[2][3] = {{3., 3., -100.}, {3., 3., -100.}};
14
18
24
26 : KFPart()
27{
28 KFPart.Create(part, nPart);
29}
30
32
38
44
46 int NDaughters,
48 float Mass,
49 float CutChi2)
50{
51 const int ND = NDaughters;
52
53 CbmKFParticle_simd* vDaughters_part = new CbmKFParticle_simd[ND];
54
55 for (int tr = 0; tr < NDaughters; ++tr)
56 vDaughters_part[tr].Create(vDaughters[tr]);
57
58 Construct(vDaughters_part, NDaughters, Parent, Mass, CutChi2);
59 delete[] vDaughters_part;
60}
61
63 int NDaughters,
65 float Mass,
66 float CutChi2,
67 bool isAtVtxGuess)
68{
70 KFPart.SetNDaughters(NDaughters);
71 for (int tr = 0; tr < NDaughters; tr++) {
72 KFPart.AddDaughterId(vDaughters[tr].Id());
73 }
74
75 int MaxIter = 3;
76 if (!(KFPart.fIsVtxGuess)) {
77 fvec Ty[2];
78 fvec Y[2];
79 fvec Z[2];
80
81 for (int tr = 0; tr < 2; tr++) {
82 Y[tr] = vDaughters[tr].GetY();
83 Z[tr] = vDaughters[tr].GetZ();
84 Ty[tr] = vDaughters[tr].GetPy() / vDaughters[tr].GetPz();
85 }
86
87 fvec r0[3];
88 r0[0] = 0.;
89 r0[1] = 0.;
90 r0[2] = (Ty[0] * Z[0] - Ty[1] * Z[1] + Y[1] - Y[0]) / (Ty[0] - Ty[1]);
91
92 CbmKFParticle_simd Daughter0 = vDaughters[0];
93 Extrapolate(&Daughter0, Daughter0.r, GetDStoPoint(Daughter0, r0));
94
95 KFPart.fVtxGuess[0] = Daughter0.GetX();
96 KFPart.fVtxGuess[1] = Daughter0.GetY();
97 KFPart.fVtxGuess[2] = Daughter0.GetZ();
98
99 if (!(KFPart.fIsVtxErrGuess)) {
100 KFPart.fVtxErrGuess[0] = 10. * sqrt(Daughter0.C[0]);
101 KFPart.fVtxErrGuess[1] = 10. * sqrt(Daughter0.C[2]);
102 KFPart.fVtxErrGuess[2] = 10. * sqrt(Daughter0.C[5]);
103 }
104 // KFPart.fVtxErrGuess[0] = 0.01*KFPart.fVtxGuess[0];
105 // KFPart.fVtxErrGuess[1] = 0.01*KFPart.fVtxGuess[1];
106 // KFPart.fVtxErrGuess[2] = 0.01*KFPart.fVtxGuess[2];
107 } else {
108 MaxIter = 1;
109 }
110
111 cnst ZERO = 0.0, ONE = 1.;
112 cnst TWO = 2.;
113 /**if( CbmKF::Instance()->vTargets.empty() ){
114 r[0] = r[1] = r[2] = 0.;
115 C[0] = C[2] = C[5] = 1.;
116 C[1] = C[3] = C[4] = 0;
117 }else{
118 CbmKFTube &t = CbmKF::Instance()->vTargets[0];
119 r[0] = r[1] = 0.;
120 r[2] = t.z;
121 C[0] = C[2] = t.R*t.R/9.;
122 C[5] = t.dz/6.;
123 C[1] = C[3] = C[4] = 0;
124 }**/
125
126 KFPart.r[3] = ZERO;
127 KFPart.r[4] = ZERO;
128 KFPart.r[5] = ZERO;
129 KFPart.r[6] = ZERO;
130 KFPart.r[7] = ZERO;
131
132 KFPart.r[0] = KFPart.fVtxGuess[0];
133 KFPart.r[1] = KFPart.fVtxGuess[1];
134 KFPart.r[2] = KFPart.fVtxGuess[2];
135
136 KFPart.C[0] = KFPart.fVtxErrGuess[0] * KFPart.fVtxErrGuess[0];
137 KFPart.C[2] = KFPart.fVtxErrGuess[1] * KFPart.fVtxErrGuess[1];
138 KFPart.C[5] = KFPart.fVtxErrGuess[2] * KFPart.fVtxErrGuess[2];
139 KFPart.C[1] = KFPart.C[3] = KFPart.C[4] = ZERO;
140
141 for (Int_t iteration = 0; iteration < MaxIter; ++iteration) {
142 fvec r0[8], C0[6];
143
144 for (int i = 0; i < 8; i++)
145 r0[i] = KFPart.r[i];
146 for (int i = 0; i < 6; i++)
147 C0[i] = KFPart.C[i];
148
149 KFPart.r[3] = ZERO;
150 KFPart.r[4] = ZERO;
151 KFPart.r[5] = ZERO;
152 KFPart.r[6] = ZERO;
153
154 for (Int_t i = 0; i < 36; ++i)
155 KFPart.C[i] = ZERO;
156
157 KFPart.C[0] = KFPart.fVtxErrGuess[0] * KFPart.fVtxErrGuess[0];
158 KFPart.C[2] = KFPart.fVtxErrGuess[1] * KFPart.fVtxErrGuess[1];
159 KFPart.C[5] = KFPart.fVtxErrGuess[2] * KFPart.fVtxErrGuess[2];
160
161 KFPart.C[35] = ONE;
162
163 L1FieldValue B = vDaughters[0].fField.Get(r0[2]);
164 B.x *= 0.000299792458; // multiply by c
165 B.y *= 0.000299792458;
166 B.z *= 0.000299792458;
167
168 KFPart.NDF = -3.;
169 KFPart.Chi2 = ZERO;
170 KFPart.Q = ZERO;
171
172 for (int tr = 0; tr < NDaughters; ++tr) {
173 CbmKFParticle_simd Daughter = vDaughters[tr];
174 if (!isAtVtxGuess)
175 Extrapolate(&Daughter, Daughter.r, GetDStoPoint(Daughter, r0));
176
177 fvec* m = Daughter.r;
178 fvec* Cd = Daughter.C;
179
180 fvec d[3] = {r0[0] - m[0], r0[1] - m[1], r0[2] - m[2]};
181 fvec SigmaS =
182 .1 + 10. * sqrt((d[0] * d[0] + d[1] * d[1] + d[2] * d[2]) / (m[3] * m[3] + m[4] * m[4] + m[5] * m[5]));
183
184 fvec h[6];
185
186 h[0] = m[3] * SigmaS;
187 h[1] = m[4] * SigmaS;
188 h[2] = m[5] * SigmaS;
189 h[3] = (h[1] * B.z - h[2] * B.y) * Daughter.Q;
190 h[4] = (h[2] * B.x - h[0] * B.z) * Daughter.Q;
191 h[5] = (h[0] * B.y - h[1] * B.x) * Daughter.Q;
192
193 //* Fit of daughter momentum (x,y,z) to r0[0,1,2] vertex
194 {
195 fvec zeta[3] = {r0[0] - m[0], r0[1] - m[1], r0[2] - m[2]};
196
197 fvec Vv[6] = {Cd[0] + h[0] * h[0], Cd[1] + h[1] * h[0], Cd[2] + h[1] * h[1],
198 Cd[3] + h[2] * h[0], Cd[4] + h[2] * h[1], Cd[5] + h[2] * h[2]};
199
200 fvec Vvp[9] = {Cd[6] + h[0] * h[3], Cd[7] + h[1] * h[3], Cd[8] + h[2] * h[3],
201 Cd[10] + h[0] * h[4], Cd[11] + h[1] * h[4], Cd[12] + h[2] * h[4],
202 Cd[15] + h[0] * h[5], Cd[16] + h[1] * h[5], Cd[17] + h[2] * h[5]};
203
204 /** if( CutChi2 >0. ){
205
206 fvec Si[6]={ Vv[0]+C0[0],
207 Vv[1]+C0[1], Vv[2]+C0[2],
208 Vv[3]+C0[3], Vv[4]+C0[4], Vv[5]+C0[5] };
209 fvec S[6] = { Si[2]*Si[5] - Si[4]*Si[4],
210 Si[3]*Si[4] - Si[1]*Si[5],
211 Si[0]*Si[5] - Si[3]*Si[3],
212 Si[1]*Si[4] - Si[2]*Si[3],
213 Si[1]*Si[3] - Si[0]*Si[4],
214 Si[0]*Si[2] - Si[1]*Si[1] };
215 fvec det = ( Si[0]*S[0] + Si[1]*S[1] + Si[3]*S[3] );
216 fvec chi2 =
217 ( +(S[0]*zeta[0] + S[1]*zeta[1] + S[3]*zeta[2])*zeta[0]
218 +(S[1]*zeta[0] + S[2]*zeta[1] + S[4]*zeta[2])*zeta[1]
219 +(S[3]*zeta[0] + S[4]*zeta[1] + S[5]*zeta[2])*zeta[2]);
220 if( chi2 > 2*CutChi2*det ) continue;
221 }
222 **/
223 fvec S[6] = {Vv[2] * Vv[5] - Vv[4] * Vv[4], Vv[3] * Vv[4] - Vv[1] * Vv[5],
224 Vv[0] * Vv[5] - Vv[3] * Vv[3], Vv[1] * Vv[4] - Vv[2] * Vv[3],
225 Vv[1] * Vv[3] - Vv[0] * Vv[4], Vv[0] * Vv[2] - Vv[1] * Vv[1]};
226
227 fvec s = (Vv[0] * S[0] + Vv[1] * S[1] + Vv[3] * S[3]);
228
229 fvec init = fvec(s > 1.E-20);
230 s = rcp(s) & init;
231 // for(int j = 0; j<fvecLen; j++)
232 // s[j] = ( s[j] > 1.E-20 ) ?1./s[j] :0;
233
234 S[0] *= s;
235 S[1] *= s;
236 S[2] *= s;
237 S[3] *= s;
238 S[4] *= s;
239 S[5] *= s;
240
241 fvec Sz[3] = {(S[0] * zeta[0] + S[1] * zeta[1] + S[3] * zeta[2]),
242 (S[1] * zeta[0] + S[2] * zeta[1] + S[4] * zeta[2]),
243 (S[3] * zeta[0] + S[4] * zeta[1] + S[5] * zeta[2])};
244
245 fvec x = m[3] + Vvp[0] * Sz[0] + Vvp[1] * Sz[1] + Vvp[2] * Sz[2];
246 fvec y = m[4] + Vvp[3] * Sz[0] + Vvp[4] * Sz[1] + Vvp[5] * Sz[2];
247 fvec z = m[5] + Vvp[6] * Sz[0] + Vvp[7] * Sz[1] + Vvp[8] * Sz[2];
248
249 h[0] = x * SigmaS;
250 h[1] = y * SigmaS;
251 h[2] = z * SigmaS;
252 h[3] = (h[1] * B.z - h[2] * B.y) * Daughter.Q;
253 h[4] = (h[2] * B.x - h[0] * B.z) * Daughter.Q;
254 h[5] = (h[0] * B.y - h[1] * B.x) * Daughter.Q;
255 }
256
257 fvec* V = Cd;
258
259 V[0] += h[0] * h[0];
260 V[1] += h[1] * h[0];
261 V[2] += h[1] * h[1];
262 V[3] += h[2] * h[0];
263 V[4] += h[2] * h[1];
264 V[5] += h[2] * h[2];
265
266 V[6] += h[3] * h[0];
267 V[7] += h[3] * h[1];
268 V[8] += h[3] * h[2];
269 V[9] += h[3] * h[3];
270
271 V[10] += h[4] * h[0];
272 V[11] += h[4] * h[1];
273 V[12] += h[4] * h[2];
274 V[13] += h[4] * h[3];
275 V[14] += h[4] * h[4];
276
277 V[15] += h[5] * h[0];
278 V[16] += h[5] * h[1];
279 V[17] += h[5] * h[2];
280 V[18] += h[5] * h[3];
281 V[19] += h[5] * h[4];
282 V[20] += h[5] * h[5];
283
284 // V[21] = Cd[21];
285 // V[22] = Cd[22];
286 // V[23] = Cd[23];
287 // V[24] = Cd[24];
288 // V[25] = Cd[25];
289 // V[26] = Cd[26];
290 // V[27] = Cd[27];
291
292 //*
293 KFPart.NDF += TWO;
294 KFPart.Q += Daughter.Q;
295
296 //*
297
298 fvec S[6];
299 {
300 fvec Si[6] = {KFPart.C[0] + V[0], KFPart.C[1] + V[1], KFPart.C[2] + V[2],
301 KFPart.C[3] + V[3], KFPart.C[4] + V[4], KFPart.C[5] + V[5]};
302
303 S[0] = Si[2] * Si[5] - Si[4] * Si[4];
304 S[1] = Si[3] * Si[4] - Si[1] * Si[5];
305 S[2] = Si[0] * Si[5] - Si[3] * Si[3];
306 S[3] = Si[1] * Si[4] - Si[2] * Si[3];
307 S[4] = Si[1] * Si[3] - Si[0] * Si[4];
308 S[5] = Si[0] * Si[2] - Si[1] * Si[1];
309
310 fvec s = (Si[0] * S[0] + Si[1] * S[1] + Si[3] * S[3]);
311
312 fvec init = fvec(s > 1.E-20);
313 s = rcp(s) & init;
314 // for(int j=0; j<fvecLen; j++)
315 // s[j] = ( s[j] > 1.E-20 ) ?1./s[j] :0;
316
317 S[0] *= s;
318 S[1] *= s;
319 S[2] *= s;
320 S[3] *= s;
321 S[4] *= s;
322 S[5] *= s;
323 }
324
325 //* Residual (measured - estimated)
326
327 fvec zeta[3] = {m[0] - KFPart.r[0], m[1] - KFPart.r[1], m[2] - KFPart.r[2]};
328
329 //* Add the daughter momentum to the particle momentum
330
331 KFPart.r[3] += m[3];
332 KFPart.r[4] += m[4];
333 KFPart.r[5] += m[5];
334 KFPart.r[6] += m[6];
335
336 KFPart.C[9] += V[9];
337 KFPart.C[13] += V[13];
338 KFPart.C[14] += V[14];
339 KFPart.C[18] += V[18];
340 KFPart.C[19] += V[19];
341 KFPart.C[20] += V[20];
342 KFPart.C[24] += V[24];
343 KFPart.C[25] += V[25];
344 KFPart.C[26] += V[26];
345 KFPart.C[27] += V[27];
346
347 //* CHt = CH' - D'
348
349 fvec CHt0[7], CHt1[7], CHt2[7];
350
351 CHt0[0] = KFPart.C[0];
352 CHt1[0] = KFPart.C[1];
353 CHt2[0] = KFPart.C[3];
354 CHt0[1] = KFPart.C[1];
355 CHt1[1] = KFPart.C[2];
356 CHt2[1] = KFPart.C[4];
357 CHt0[2] = KFPart.C[3];
358 CHt1[2] = KFPart.C[4];
359 CHt2[2] = KFPart.C[5];
360 CHt0[3] = KFPart.C[6] - V[6];
361 CHt1[3] = KFPart.C[7] - V[7];
362 CHt2[3] = KFPart.C[8] - V[8];
363 CHt0[4] = KFPart.C[10] - V[10];
364 CHt1[4] = KFPart.C[11] - V[11];
365 CHt2[4] = KFPart.C[12] - V[12];
366 CHt0[5] = KFPart.C[15] - V[15];
367 CHt1[5] = KFPart.C[16] - V[16];
368 CHt2[5] = KFPart.C[17] - V[17];
369 CHt0[6] = KFPart.C[21] - V[21];
370 CHt1[6] = KFPart.C[22] - V[22];
371 CHt2[6] = KFPart.C[23] - V[23];
372
373 //* Kalman gain K = CH'*S
374
375 fvec K0[7], K1[7], K2[7];
376
377 for (Int_t i = 0; i < 7; ++i) {
378 K0[i] = CHt0[i] * S[0] + CHt1[i] * S[1] + CHt2[i] * S[3];
379 K1[i] = CHt0[i] * S[1] + CHt1[i] * S[2] + CHt2[i] * S[4];
380 K2[i] = CHt0[i] * S[3] + CHt1[i] * S[4] + CHt2[i] * S[5];
381 }
382
383 //* New estimation of the vertex position r += K*zeta
384
385 for (Int_t i = 0; i < 7; ++i)
386 KFPart.r[i] += K0[i] * zeta[0] + K1[i] * zeta[1] + K2[i] * zeta[2];
387
388 //* New covariance matrix C -= K*(CH')'
389
390 for (Int_t i = 0, k = 0; i < 7; ++i) {
391 for (Int_t j = 0; j <= i; ++j, ++k)
392 KFPart.C[k] -= K0[i] * CHt0[j] + K1[i] * CHt1[j] + K2[i] * CHt2[j];
393 }
394
395 //* Calculate Chi^2 & NDF
396
397 KFPart.Chi2 += (S[0] * zeta[0] + S[1] * zeta[1] + S[3] * zeta[2]) * zeta[0]
398 + (S[1] * zeta[0] + S[2] * zeta[1] + S[4] * zeta[2]) * zeta[1]
399 + (S[3] * zeta[0] + S[4] * zeta[1] + S[5] * zeta[2]) * zeta[2];
400
401 } // add tracks
402
403 if (iteration == 0) {
404 r0[3] = KFPart.r[3];
405 r0[4] = KFPart.r[4];
406 r0[5] = KFPart.r[5];
407 r0[6] = KFPart.r[6];
408 if (Parent) {
409 fvec dx, dy, dz;
410 dx = Parent->GetRefX() - KFPart.r[0];
411 dy = Parent->GetRefY() - KFPart.r[1];
412 dz = Parent->GetRefZ() - KFPart.r[2];
413
414 r0[7] = KFPart.r[7] =
415 sqrt((dx * dx + dy * dy + dz * dz)
416 / (KFPart.r[3] * KFPart.r[3] + KFPart.r[4] * KFPart.r[4] + KFPart.r[5] * KFPart.r[5]));
417 }
418 }
419
420 if (Mass >= 0) {
421 fvec vMass = Mass;
422 MeasureMass(&KFPart, r0, vMass);
423 }
424 if (Parent)
425 MeasureProductionVertex(&KFPart, r0, Parent);
426 } // iterations
427
428 // calculate a field region for the constructed particle
429 L1FieldValue field[3];
430 fvec zField[3] = {0, KFPart.r[2] / 2, KFPart.r[2]};
431
432 for (int iPoint = 0; iPoint < 3; iPoint++) {
433 for (int iD = 0; iD < NDaughters; ++iD) {
434 L1FieldValue b = vDaughters[iD].fField.Get(zField[iPoint]);
435 field[iPoint].x += b.x;
436 field[iPoint].y += b.y;
437 field[iPoint].z += b.z;
438 }
439 field[iPoint].x /= NDaughters;
440 field[iPoint].y /= NDaughters;
441 field[iPoint].z /= NDaughters;
442 }
443
444 KFPart.fField.Set(field[2], zField[2], field[1], zField[1], field[0], zField[0]);
445
446 KFPart.AtProductionVertex = 0;
447}
448
450{
451 fvec* r = Particle->GetParameters();
452 fvec* C = Particle->GetCovMatrix();
453
454 fvec H[8] = {0};
455 H[0] = H[1] = H[2] = 0.;
456 H[3] = -2 * r0[3];
457 H[4] = -2 * r0[4];
458 H[5] = -2 * r0[5];
459 H[6] = 2 * r0[6];
460 H[7] = 0;
461 fvec m2 = r0[6] * r0[6] - r0[3] * r0[3] - r0[4] * r0[4] - r0[5] * r0[5];
462
463 fvec zeta = Mass * Mass - m2;
464 for (Int_t i = 0; i < 8; ++i)
465 zeta -= H[i] * (r[i] - r0[i]);
466
467 fvec S = 0.;
468 fvec CHt[8];
469 for (Int_t i = 0; i < 8; ++i) {
470 CHt[i] = 0.0;
471 for (Int_t j = 0; j < 8; ++j)
472 CHt[i] += Cij(i, j) * H[j];
473 S += H[i] * CHt[i];
474 }
475
476 fvec init = fvec(S > 1.E-20);
477 S = rcp(S) & init;
478
479 Particle->Chi2 += zeta * zeta * S;
480 Particle->NDF += (fvec(1.) & init);
481 for (Int_t i = 0, ii = 0; i < 8; ++i) {
482 fvec Ki = CHt[i] * S;
483 r[i] += Ki * zeta;
484 for (Int_t j = 0; j <= i; ++j)
485 C[ii++] -= Ki * CHt[j];
486 }
487}
488
490 fvec r0[],
491 CbmKFVertexInterface* Parent)
492{
493 fvec* r = Particle->GetParameters();
494 fvec* C = Particle->GetCovMatrix();
495
496 fvec m[3], V[6];
497
498 m[0] = Parent->GetRefX();
499 m[1] = Parent->GetRefY();
500 m[2] = Parent->GetRefZ();
501 double* V1 = Parent->GetCovMatrix();
502 for (int i = 0; i < 6; i++)
503 V[i] = V1[i];
504
505 r[7] = r0[7];
506 Extrapolate(r0, -r0[7]);
507 Convert(Particle, r0, 1);
508
509 fvec Ai[6];
510 Ai[0] = C[4] * C[4] - C[2] * C[5];
511 Ai[1] = C[1] * C[5] - C[3] * C[4];
512 Ai[3] = C[2] * C[3] - C[1] * C[4];
513 fvec det = 1. / (C[0] * Ai[0] + C[1] * Ai[1] + C[3] * Ai[3]);
514 Ai[0] *= det;
515 Ai[1] *= det;
516 Ai[3] *= det;
517 Ai[2] = (C[3] * C[3] - C[0] * C[5]) * det;
518 Ai[4] = (C[0] * C[4] - C[1] * C[3]) * det;
519 Ai[5] = (C[1] * C[1] - C[0] * C[2]) * det;
520
521 fvec B[5][3];
522
523 B[0][0] = C[6] * Ai[0] + C[7] * Ai[1] + C[8] * Ai[3];
524 B[0][1] = C[6] * Ai[1] + C[7] * Ai[2] + C[8] * Ai[4];
525 B[0][2] = C[6] * Ai[3] + C[7] * Ai[4] + C[8] * Ai[5];
526
527 B[1][0] = C[10] * Ai[0] + C[11] * Ai[1] + C[12] * Ai[3];
528 B[1][1] = C[10] * Ai[1] + C[11] * Ai[2] + C[12] * Ai[4];
529 B[1][2] = C[10] * Ai[3] + C[11] * Ai[4] + C[12] * Ai[5];
530
531 B[2][0] = C[15] * Ai[0] + C[16] * Ai[1] + C[17] * Ai[3];
532 B[2][1] = C[15] * Ai[1] + C[16] * Ai[2] + C[17] * Ai[4];
533 B[2][2] = C[15] * Ai[3] + C[16] * Ai[4] + C[17] * Ai[5];
534
535 B[3][0] = C[21] * Ai[0] + C[22] * Ai[1] + C[23] * Ai[3];
536 B[3][1] = C[21] * Ai[1] + C[22] * Ai[2] + C[23] * Ai[4];
537 B[3][2] = C[21] * Ai[3] + C[22] * Ai[4] + C[23] * Ai[5];
538
539 B[4][0] = C[28] * Ai[0] + C[29] * Ai[1] + C[30] * Ai[3];
540 B[4][1] = C[28] * Ai[1] + C[29] * Ai[2] + C[30] * Ai[4];
541 B[4][2] = C[28] * Ai[3] + C[29] * Ai[4] + C[30] * Ai[5];
542
543 fvec z[3] = {m[0] - r[0], m[1] - r[1], m[2] - r[2]};
544
545 {
546 fvec AV[6] = {C[0] - V[0], C[1] - V[1], C[2] - V[2], C[3] - V[3], C[4] - V[4], C[5] - V[5]};
547 fvec AVi[6];
548 AVi[0] = AV[4] * AV[4] - AV[2] * AV[5];
549 AVi[1] = AV[1] * AV[5] - AV[3] * AV[4];
550 AVi[2] = AV[3] * AV[3] - AV[0] * AV[5];
551 AVi[3] = AV[2] * AV[3] - AV[1] * AV[4];
552 AVi[4] = AV[0] * AV[4] - AV[1] * AV[3];
553 AVi[5] = AV[1] * AV[1] - AV[0] * AV[2];
554
555 det = 1. / (AV[0] * AVi[0] + AV[1] * AVi[1] + AV[3] * AVi[3]);
556
557 Particle->NDF += 2.;
558 Particle->Chi2 += (+(AVi[0] * z[0] + AVi[1] * z[1] + AVi[3] * z[2]) * z[0]
559 + (AVi[1] * z[0] + AVi[2] * z[1] + AVi[4] * z[2]) * z[1]
560 + (AVi[3] * z[0] + AVi[4] * z[1] + AVi[5] * z[2]) * z[2])
561 * det;
562 }
563
564 r[0] = m[0];
565 r[1] = m[1];
566 r[2] = m[2];
567 r[3] += B[0][0] * z[0] + B[0][1] * z[1] + B[0][2] * z[2];
568 r[4] += B[1][0] * z[0] + B[1][1] * z[1] + B[1][2] * z[2];
569 r[5] += B[2][0] * z[0] + B[2][1] * z[1] + B[2][2] * z[2];
570 r[6] += B[3][0] * z[0] + B[3][1] * z[1] + B[3][2] * z[2];
571 r[7] += B[4][0] * z[0] + B[4][1] * z[1] + B[4][2] * z[2];
572
573 fvec d0, d1, d2;
574
575 C[0] = V[0];
576 C[1] = V[1];
577 C[2] = V[2];
578 C[3] = V[3];
579 C[4] = V[4];
580 C[5] = V[5];
581
582 d0 = B[0][0] * V[0] + B[0][1] * V[1] + B[0][2] * V[3] - C[6];
583 d1 = B[0][0] * V[1] + B[0][1] * V[2] + B[0][2] * V[4] - C[7];
584 d2 = B[0][0] * V[3] + B[0][1] * V[4] + B[0][2] * V[5] - C[8];
585
586 C[6] += d0;
587 C[7] += d1;
588 C[8] += d2;
589 C[9] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
590
591 d0 = B[1][0] * V[0] + B[1][1] * V[1] + B[1][2] * V[3] - C[10];
592 d1 = B[1][0] * V[1] + B[1][1] * V[2] + B[1][2] * V[4] - C[11];
593 d2 = B[1][0] * V[3] + B[1][1] * V[4] + B[1][2] * V[5] - C[12];
594
595 C[10] += d0;
596 C[11] += d1;
597 C[12] += d2;
598 C[13] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
599 C[14] += d0 * B[1][0] + d1 * B[1][1] + d2 * B[1][2];
600
601 d0 = B[2][0] * V[0] + B[2][1] * V[1] + B[2][2] * V[3] - C[15];
602 d1 = B[2][0] * V[1] + B[2][1] * V[2] + B[2][2] * V[4] - C[16];
603 d2 = B[2][0] * V[3] + B[2][1] * V[4] + B[2][2] * V[5] - C[17];
604
605 C[15] += d0;
606 C[16] += d1;
607 C[17] += d2;
608 C[18] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
609 C[19] += d0 * B[1][0] + d1 * B[1][1] + d2 * B[1][2];
610 C[20] += d0 * B[2][0] + d1 * B[2][1] + d2 * B[2][2];
611
612 d0 = B[3][0] * V[0] + B[3][1] * V[1] + B[3][2] * V[3] - C[21];
613 d1 = B[3][0] * V[1] + B[3][1] * V[2] + B[3][2] * V[4] - C[22];
614 d2 = B[3][0] * V[3] + B[3][1] * V[4] + B[3][2] * V[5] - C[23];
615
616 C[21] += d0;
617 C[22] += d1;
618 C[23] += d2;
619 C[24] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
620 C[25] += d0 * B[1][0] + d1 * B[1][1] + d2 * B[1][2];
621 C[26] += d0 * B[2][0] + d1 * B[2][1] + d2 * B[2][2];
622 C[27] += d0 * B[3][0] + d1 * B[3][1] + d2 * B[3][2];
623
624 d0 = B[4][0] * V[0] + B[4][1] * V[1] + B[4][2] * V[3] - C[28];
625 d1 = B[4][0] * V[1] + B[4][1] * V[2] + B[4][2] * V[4] - C[29];
626 d2 = B[4][0] * V[3] + B[4][1] * V[4] + B[4][2] * V[5] - C[30];
627
628 C[28] += d0;
629 C[29] += d1;
630 C[30] += d2;
631 C[31] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
632 C[32] += d0 * B[1][0] + d1 * B[1][1] + d2 * B[1][2];
633 C[33] += d0 * B[2][0] + d1 * B[2][1] + d2 * B[2][2];
634 C[34] += d0 * B[3][0] + d1 * B[3][1] + d2 * B[3][2];
635 C[35] += d0 * B[4][0] + d1 * B[4][1] + d2 * B[4][2];
636
637 Extrapolate(Particle, r0, r[7]);
638 Convert(Particle, r0, 0);
639}
640
641void CbmKFParticleInterface::Convert(CbmKFParticle_simd* Particle, fvec r0[], bool ToProduction)
642{
643 fvec* C = Particle->GetCovMatrix();
644
645 L1FieldValue B = KFPart.fField.Get(r0[2]);
646 B.x *= 0.000299792458; // multiply by c
647 B.y *= 0.000299792458;
648 B.z *= 0.000299792458;
649
650 fvec h[6];
651
652 h[0] = r0[3];
653 h[1] = r0[4];
654 h[2] = r0[5];
655 if (ToProduction) {
656 h[0] = -h[0];
657 h[1] = -h[1];
658 h[2] = -h[2];
659 }
660 h[3] = h[1] * B.z - h[2] * B.y;
661 h[4] = h[2] * B.x - h[0] * B.z;
662 h[5] = h[0] * B.y - h[1] * B.x;
663
664 fvec c;
665
666 c = C[28] + h[0] * C[35];
667 C[0] += h[0] * (c + C[28]);
668 C[28] = c;
669
670 C[1] += h[1] * C[28] + h[0] * C[29];
671 c = C[29] + h[1] * C[35];
672 C[2] += h[1] * (c + C[29]);
673 C[29] = c;
674
675 C[3] += h[2] * C[28] + h[0] * C[30];
676 C[4] += h[2] * C[29] + h[1] * C[30];
677 c = C[30] + h[2] * C[35];
678 C[5] += h[2] * (c + C[30]);
679 C[30] = c;
680
681 C[6] += h[3] * C[28] + h[0] * C[31];
682 C[7] += h[3] * C[29] + h[1] * C[31];
683 C[8] += h[3] * C[30] + h[2] * C[31];
684 c = C[31] + h[3] * C[35];
685 C[9] += h[3] * (c + C[31]);
686 C[31] = c;
687
688 C[10] += h[4] * C[28] + h[0] * C[32];
689 C[11] += h[4] * C[29] + h[1] * C[32];
690 C[12] += h[4] * C[30] + h[2] * C[32];
691 C[13] += h[4] * C[31] + h[3] * C[32];
692 c = C[32] + h[4] * C[35];
693 C[14] += h[4] * (c + C[32]);
694 C[32] = c;
695
696 C[15] += h[5] * C[28] + h[0] * C[33];
697 C[16] += h[5] * C[29] + h[1] * C[33];
698 C[17] += h[5] * C[30] + h[2] * C[33];
699 C[18] += h[5] * C[31] + h[3] * C[33];
700 C[19] += h[5] * C[32] + h[4] * C[33];
701 c = C[33] + h[5] * C[35];
702 C[20] += h[5] * (c + C[33]);
703 C[33] = c;
704
705 C[21] += h[0] * C[34];
706 C[22] += h[1] * C[34];
707 C[23] += h[2] * C[34];
708 C[24] += h[3] * C[34];
709 C[25] += h[4] * C[34];
710 C[26] += h[5] * C[34];
711}
712
714{
715 fvec* r = Particle->GetParameters();
716 fvec* C = Particle->GetCovMatrix();
717
718 if (r0 && r0 != r) {
719 r0[0] += dS * r0[3];
720 r0[1] += dS * r0[4];
721 r0[2] += dS * r0[5];
722 }
723
724 r[0] += dS * r[3];
725 r[1] += dS * r[4];
726 r[2] += dS * r[5];
727
728 fvec C6 = C[6] + dS * C[9];
729 fvec C11 = C[11] + dS * C[14];
730 fvec C17 = C[17] + dS * C[20];
731 fvec SC13 = dS * C[13];
732 fvec SC18 = dS * C[18];
733 fvec SC19 = dS * C[19];
734
735 C[0] += dS * (C[6] + C6);
736 C[2] += dS * (C[11] + C11);
737 C[5] += dS * (C[17] + C17);
738
739 C[7] += SC13;
740 C[8] += SC18;
741 C[12] += SC19;
742
743 C[1] += dS * (C[10] + C[7]);
744 C[3] += dS * (C[15] + C[8]);
745 C[4] += dS * (C[16] + C[12]);
746
747 C[6] = C6;
748 C[10] += SC13;
749 C[11] = C11;
750 C[15] += SC18;
751 C[16] += SC19;
752 C[17] = C17;
753
754 C[21] += dS * C[24];
755 C[22] += dS * C[25];
756 C[23] += dS * C[26];
757 C[28] += dS * C[31];
758 C[29] += dS * C[32];
759 C[30] += dS * C[33];
760}
761
763{
764 if (Particle->Q[0] == 0) {
765 ExtrapolateLine(Particle, r0, dS);
766 return;
767 }
768
769 fvec* r = Particle->GetParameters();
770 fvec* C = Particle->GetCovMatrix();
771
772 const float c_light = 0.000299792458;
773
774 fvec c = Particle->Q * c_light;
775
776 // construct coefficients
777
778 fvec px = r[3], py = r[4], pz = r[5];
779
780 fvec sx = 0, sy = 0, sz = 0, syy = 0, syz = 0, syyy = 0, Sx = 0, Sy = 0, Sz = 0, Syy = 0, Syz = 0, Syyy = 0;
781
782 { // get field integrals
783
784 L1FieldValue B[3];
785 fvec p0[3], p1[3], p2[3];
786
787 // line track approximation
788
789 p0[0] = r[0];
790 p0[1] = r[1];
791 p0[2] = r[2];
792
793 p2[0] = r[0] + px * dS;
794 p2[1] = r[1] + py * dS;
795 p2[2] = r[2] + pz * dS;
796
797 p1[0] = 0.5 * (p0[0] + p2[0]);
798 p1[1] = 0.5 * (p0[1] + p2[1]);
799 p1[2] = 0.5 * (p0[2] + p2[2]);
800
801 B[0] = Particle->fField.Get(p0[2]);
802 B[1] = Particle->fField.Get(p1[2]);
803 B[2] = Particle->fField.Get(p2[2]);
804
805 // first order track approximation
806
807 fvec Sy1 = (7 * B[0].y + 6 * B[1].y - B[2].y) * c * dS * dS / 96.;
808 fvec Sy2 = (B[0].y + 2 * B[1].y) * c * dS * dS / 6.;
809
810 p1[0] -= Sy1 * pz;
811 p1[2] += Sy1 * px;
812 p2[0] -= Sy2 * pz;
813 p2[2] += Sy2 * px;
814
815 B[0] = Particle->fField.Get(p0[2]);
816 B[1] = Particle->fField.Get(p1[2]);
817 B[2] = Particle->fField.Get(p2[2]);
818
819 sx = c * (B[0].x + 4 * B[1].x + B[2].x) * dS / 6.;
820 sy = c * (B[0].y + 4 * B[1].y + B[2].y) * dS / 6.;
821 sz = c * (B[0].z + 4 * B[1].z + B[2].z) * dS / 6.;
822
823 Sx = c * (B[0].x + 2 * B[1].x) * dS * dS / 6.;
824 Sy = c * (B[0].y + 2 * B[1].y) * dS * dS / 6.;
825 Sz = c * (B[0].z + 2 * B[1].z) * dS * dS / 6.;
826
827 fvec c2[3][3] = {{5, -4, -1}, {44, 80, -4}, {11, 44, 5}}; // /=360.
828 fvec C2[3][3] = {{38, 8, -4}, {148, 208, -20}, {3, 36, 3}}; // /=2520.
829 for (Int_t n = 0; n < 3; n++)
830 for (Int_t m = 0; m < 3; m++) {
831 syz += c2[n][m] * B[n].y * B[m].z;
832 Syz += C2[n][m] * B[n].y * B[m].z;
833 }
834
835 syz *= c * c * dS * dS / 360.;
836 Syz *= c * c * dS * dS * dS / 2520.;
837
838 syy = c * (B[0].y + 4 * B[1].y + B[2].y) * dS;
839 syyy = syy * syy * syy / 1296;
840 syy = syy * syy / 72;
841
842 Syy = (B[0].y * (38 * B[0].y + 156 * B[1].y - B[2].y) + B[1].y * (208 * B[1].y + 16 * B[2].y)
843 + B[2].y * (3 * B[2].y))
844 * dS * dS * dS * c * c / 2520.;
845 Syyy = (B[0].y
846 * (B[0].y * (85 * B[0].y + 526 * B[1].y - 7 * B[2].y) + B[1].y * (1376 * B[1].y + 84 * B[2].y)
847 + B[2].y * (19 * B[2].y))
848 + B[1].y * (B[1].y * (1376 * B[1].y + 256 * B[2].y) + B[2].y * (62 * B[2].y))
849 + B[2].y * B[2].y * (3 * B[2].y))
850 * dS * dS * dS * dS * c * c * c / 90720.;
851 }
852
853 fvec J[11];
854 // for( int i=0; i<8; i++ ) for( int j=0; j<8; j++) J[i][j]=0;
855 //
856 // J[0][0]=1; J[0][1]=0; J[0][2]=0; J[0][3]=dS-Syy; J[0][4]=Sx; J[0][5]=Syyy-Sy;
857 // J[1][0]=0; J[1][1]=1; J[1][2]=0; J[1][3]=-Sz; J[1][4]=dS; J[1][5]=Sx+Syz;
858 // J[2][0]=0; J[2][1]=0; J[2][2]=1; J[2][3]=Sy-Syyy; J[2][4]=-Sx; J[2][5]=dS-Syy;
859 //
860 // J[3][0]=0; J[3][1]=0; J[3][2]=0; J[3][3]=1-syy; J[3][4]=sx; J[3][5]=syyy-sy;
861 // J[4][0]=0; J[4][1]=0; J[4][2]=0; J[4][3]=-sz; J[4][4]=1; J[4][5]=sx+syz;
862 // J[5][0]=0; J[5][1]=0; J[5][2]=0; J[5][3]=sy-syyy; J[5][4]=-sx; J[5][5]=1-syy;
863 // J[6][6] = J[7][7] = 1;
864
865 J[0] = dS - Syy;
866 J[1] = Sx;
867 J[2] = Syyy - Sy;
868 J[3] = -Sz;
869 J[4] = dS;
870 J[5] = Sx + Syz;
871
872 J[6] = 1 - syy;
873 J[7] = sx;
874 J[8] = syyy - sy;
875 J[9] = -sz;
876 J[10] = sx + syz;
877
878 r[0] += J[0] * px + J[1] * py + J[2] * pz;
879 r[1] += J[3] * px + J[4] * py + J[5] * pz;
880 r[2] += -J[2] * px - J[1] * py + J[0] * pz;
881 r[3] = J[6] * px + J[7] * py + J[8] * pz;
882 r[4] = J[9] * px + py + J[10] * pz;
883 r[5] = -J[8] * px - J[7] * py + J[6] * pz;
884
885 if (r0 && r0 != r) {
886 px = r0[3];
887 py = r0[4];
888 pz = r0[5];
889
890 r0[0] += J[0] * px + J[1] * py + J[2] * pz;
891 r0[1] += J[3] * px + J[4] * py + J[5] * pz;
892 r0[2] += -J[2] * px - J[1] * py + J[0] * pz;
893 r0[3] = J[6] * px + J[7] * py + J[8] * pz;
894 r0[4] = J[9] * px + py + J[10] * pz;
895 r0[5] = -J[8] * px - J[7] * py + J[6] * pz;
896 }
897
898 multQSQt1(J, C);
899}
900
902{
903 fvec A[64] = {0};
904
905 for (Int_t i = 0, n = 0; i < 8; i++)
906 for (Int_t j = 0; j < 8; j++, ++n)
907 for (Int_t k = 0; k < 8; ++k)
908 A[n] += S[IJ(i, k)] * Q[j * 8 + k];
909
910 for (Int_t i = 0; i < 8; i++) {
911 for (Int_t j = 0; j <= i; j++) {
912 Int_t n = IJ(i, j);
913 S[n] = 0;
914 for (Int_t k = 0; k < 8; k++)
915 S[n] += Q[i * 8 + k] * A[k * 8 + j];
916 }
917 }
918}
919
921{
922 const fvec A00 = S[0] + S[6] * J[0] + S[10] * J[1] + S[15] * J[2];
923 const fvec A10 = S[1] + S[7] * J[0] + S[11] * J[1] + S[16] * J[2];
924 const fvec A20 = S[3] + S[8] * J[0] + S[12] * J[1] + S[17] * J[2];
925 const fvec A30 = S[6] + S[9] * J[0] + S[13] * J[1] + S[18] * J[2];
926 const fvec A40 = S[10] + S[13] * J[0] + S[14] * J[1] + S[19] * J[2];
927 const fvec A50 = S[15] + S[18] * J[0] + S[19] * J[1] + S[20] * J[2];
928 const fvec A60 = S[21] + S[24] * J[0] + S[25] * J[1] + S[26] * J[2];
929 const fvec A70 = S[28] + S[31] * J[0] + S[32] * J[1] + S[33] * J[2];
930
931 S[0] = A00 + J[0] * A30 + J[1] * A40 + J[2] * A50;
932 S[1] = A10 + J[3] * A30 + J[4] * A40 + J[5] * A50;
933 S[3] = A20 - J[2] * A30 - J[1] * A40 + J[0] * A50;
934 S[6] = J[6] * A30 + J[7] * A40 + J[8] * A50;
935 S[10] = J[9] * A30 + A40 + J[10] * A50;
936 S[15] = -J[8] * A30 - J[7] * A40 + J[6] * A50;
937 S[21] = A60;
938 S[28] = A70;
939
940 // const fvec A01 = S[1 ]+S[6 ]*J[3]+S[10]*J[4]+S[15]*J[5];
941 const fvec A11 = S[2] + S[7] * J[3] + S[11] * J[4] + S[16] * J[5];
942 const fvec A21 = S[4] + S[8] * J[3] + S[12] * J[4] + S[17] * J[5];
943 const fvec A31 = S[7] + S[9] * J[3] + S[13] * J[4] + S[18] * J[5];
944 const fvec A41 = S[11] + S[13] * J[3] + S[14] * J[4] + S[19] * J[5];
945 const fvec A51 = S[16] + S[18] * J[3] + S[19] * J[4] + S[20] * J[5];
946 const fvec A61 = S[22] + S[24] * J[3] + S[25] * J[4] + S[26] * J[5];
947 const fvec A71 = S[29] + S[31] * J[3] + S[32] * J[4] + S[33] * J[5];
948
949 S[2] = A11 + J[3] * A31 + J[4] * A41 + J[5] * A51;
950 S[4] = A21 - J[2] * A31 - J[1] * A41 + J[0] * A51;
951 S[7] = J[6] * A31 + J[7] * A41 + J[8] * A51;
952 S[11] = J[9] * A31 + A41 + J[10] * A51;
953 S[16] = -J[8] * A31 - J[7] * A41 + J[6] * A51;
954 S[22] = A61;
955 S[29] = A71;
956
957 // const fvec A02 = S[3 ]+S[6 ]*J[2][3]+S[10]*J[2][4]+S[15]*J[2][5];
958 // const fvec A12 = S[4 ]+S[7 ]*J[2][3]+S[11]*J[2][4]+S[16]*J[2][5];
959 const fvec A22 = S[5] - S[8] * J[2] - S[12] * J[1] + S[17] * J[0];
960 const fvec A32 = S[8] - S[9] * J[2] - S[13] * J[1] + S[18] * J[0];
961 const fvec A42 = S[12] - S[13] * J[2] - S[14] * J[1] + S[19] * J[0];
962 const fvec A52 = S[17] - S[18] * J[2] - S[19] * J[1] + S[20] * J[0];
963 const fvec A62 = S[23] - S[24] * J[2] - S[25] * J[1] + S[26] * J[0];
964 const fvec A72 = S[30] - S[31] * J[2] - S[32] * J[1] + S[33] * J[0];
965
966 S[5] = A22 - J[2] * A32 - J[1] * A42 + J[0] * A52;
967 S[8] = J[6] * A32 + J[7] * A42 + J[8] * A52;
968 S[12] = J[9] * A32 + A42 + J[10] * A52;
969 S[17] = -J[8] * A32 - J[7] * A42 + J[6] * A52;
970 S[23] = A62;
971 S[30] = A72;
972
973 // const fvec A03 = S[6] *J[6]+S[10]*J[7]+S[15]*J[8];
974 // const fvec A13 = S[7] *J[6]+S[11]*J[7]+S[16]*J[8];
975 // const fvec A23 = S[8] *J[6]+S[12]*J[7]+S[17]*J[8];
976 const fvec A33 = S[9] * J[6] + S[13] * J[7] + S[18] * J[8];
977 const fvec A43 = S[13] * J[6] + S[14] * J[7] + S[19] * J[8];
978 const fvec A53 = S[18] * J[6] + S[19] * J[7] + S[20] * J[8];
979 const fvec A63 = S[24] * J[6] + S[25] * J[7] + S[26] * J[8];
980 const fvec A73 = S[31] * J[6] + S[32] * J[7] + S[33] * J[8];
981
982 // const fvec A04 = S[6] *J[9]+S[10]*J[4][4]+S[15]*J[10];
983 // const fvec A14 = S[7] *J[9]+S[11]*J[4][4]+S[16]*J[10];
984 // const fvec A24 = S[8] *J[9]+S[12]*J[4][4]+S[17]*J[10];
985 const fvec A34 = S[9] * J[9] + S[13] + S[18] * J[10];
986 const fvec A44 = S[13] * J[9] + S[14] + S[19] * J[10];
987 const fvec A54 = S[18] * J[9] + S[19] + S[20] * J[10];
988 const fvec A64 = S[24] * J[9] + S[25] + S[26] * J[10];
989 const fvec A74 = S[31] * J[9] + S[32] + S[33] * J[10];
990
991 // const fvec A05 = S[6] *J[5][3]+S[10]*J[5][4]+S[15]*J[6];
992 // const fvec A15 = S[7] *J[5][3]+S[11]*J[5][4]+S[16]*J[6];
993 // const fvec A25 = S[8] *J[5][3]+S[12]*J[5][4]+S[17]*J[6];
994 const fvec A35 = -S[9] * J[8] - S[13] * J[7] + S[18] * J[6];
995 const fvec A45 = -S[13] * J[8] - S[14] * J[7] + S[19] * J[6];
996 const fvec A55 = -S[18] * J[8] - S[19] * J[7] + S[20] * J[6];
997 const fvec A65 = -S[24] * J[8] - S[25] * J[7] + S[26] * J[6];
998 const fvec A75 = -S[31] * J[8] - S[32] * J[7] + S[33] * J[6];
999
1000 S[9] = J[6] * A33 + J[7] * A43 + J[8] * A53;
1001 S[13] = J[9] * A33 + A43 + J[10] * A53;
1002 S[18] = -J[8] * A33 - J[7] * A43 + J[6] * A53;
1003 S[24] = A63;
1004 S[31] = A73;
1005
1006 S[14] = J[9] * A34 + A44 + J[10] * A54;
1007 S[19] = -J[8] * A34 - J[7] * A44 + J[6] * A54;
1008 S[25] = A64;
1009 S[32] = A74;
1010
1011 S[20] = -J[8] * A35 - J[7] * A45 + J[6] * A55;
1012 S[26] = A65;
1013 S[33] = A75;
1014
1015 // S[27] = S27;
1016 // S[34] = S34;
1017 // S[35] = S35;
1018}
1019
1021{
1022 Extrapolate(&KFPart, r0, dS);
1023}
1024
1026{
1027 if (KFPart.AtProductionVertex)
1028 return;
1029 fvec r0[8];
1030 for (int i = 0; i < 8; i++)
1031 r0[i] = KFPart.r[i];
1032 Extrapolate(r0, -(KFPart.r[7]));
1033 Convert(&KFPart, r0, 1);
1034 KFPart.AtProductionVertex = 1;
1035}
1036
1038{
1039 if (!KFPart.AtProductionVertex)
1040 return;
1041 fvec r0[8];
1042 for (int i = 0; i < 8; i++)
1043 r0[i] = KFPart.r[i];
1044 Extrapolate(r0, KFPart.r[7]);
1045 Convert(&KFPart, r0, 0);
1046 KFPart.AtProductionVertex = 0;
1047}
1048
1050{
1051 // const fvec *r = Particle.GetParameters();
1052 //
1053 // const fvec dx = xyz[0] - r[0];
1054 // const fvec dy = xyz[1] - r[1];
1055 // const fvec dz = xyz[2] - r[2];
1056 // const fvec p2 = r[3]*r[3] + r[4]*r[4]+r[5]*r[5];
1057 //
1058 // L1FieldValue B = const_cast<L1FieldRegion*>(&Particle.fField)->Get(r[2]);
1059 // B.x *= 0.000299792458; //multiply by c
1060 // B.y *= 0.000299792458;
1061 // B.z *= 0.000299792458;
1062 //
1063 // fvec bq1 = B.x*Particle.Q;
1064 // fvec bq2 = B.y*Particle.Q;
1065 // fvec bq3 = B.z*Particle.Q;
1066 // fvec a = dx*r[3]+dy*r[4]+dz*r[5];
1067 // fvec B2 = B.x*B.x+B.y*B.y+B.z*B.z;
1068 // fvec bq = Particle.Q*sqrt(B2);
1069 // fvec pB = r[3]*B.x+r[4]*B.y+r[5]*B.z;
1070 // fvec rB = dx*B.x+dy*B.y+dz*B.z;
1071 //
1072 // fvec small = 0.0001;
1073 // fvec init = fvec(B2 > 0.0001);
1074 // B2 = (init & B2) + (fvec(!init) & small);
1075 // fvec pt2 = p2 - pB*pB/B2;
1076 // a = a - pB*rB/B2;
1077 //
1078 // fvec dS = atan2(bq*a, pt2 + bq1*(dz*r[4]-dy*r[5]) - bq2*(dz*r[3]-dx*r[5])+bq3*(dy*r[3]-dx*r[4]))/bq;
1079 // fvec dS2 = a/pt2;
1080 // fvec smallBq = 1.e-8;
1081 // fvec initBq = fvec(fabs(bq) > smallBq);
1082 // dS = (initBq & dS) + (fvec(!initBq) & dS2);
1083 // fvec initPt2 = fvec(pt2 > small);
1084 // dS = (initPt2 & dS) + (fvec(!initPt2) & fvec(0));
1085 //
1086 // //fvec dSm = rB/pB;
1087 // return dS;
1088
1089 const fvec* r = Particle.GetParameters();
1090 fvec p2 = r[3] * r[3] + r[4] * r[4] + r[5] * r[5];
1091 // if( p2<1.e-4 ) p2 = 1;
1092 return (r[3] * (xyz[0] - r[0]) + r[4] * (xyz[1] - r[1]) + r[5] * (xyz[2] - r[2])) / p2;
1093}
1094
1096{
1097 return GetDStoPoint(KFPart, xyz);
1098}
1099
1101{
1102 float r0[fvecLen], r1[fvecLen], r2[fvecLen];
1103 float C_temp[6][fvecLen];
1104 float Chi2_temp[fvecLen];
1105 int NDF_temp[fvecLen];
1106
1107 for (int j = 0; j < fvecLen; j++) {
1108 r0[j] = KFPart.r[0][j];
1109 r1[j] = KFPart.r[1][j];
1110 r2[j] = KFPart.r[2][j];
1111 for (int i = 0; i < 6; i++)
1112 C_temp[i][j] = KFPart.C[i][j];
1113
1114 Chi2_temp[j] = KFPart.Chi2[j];
1115 NDF_temp[j] = (int)KFPart.NDF[j];
1116 }
1117
1118 for (int j = 0; j < fvecLen; j++)
1119 vtx[j] = GetKFVertexJ(j);
1120}
1121
1123{
1124 CbmKFVertex vtx;
1125 vtx.GetRefX() = KFPart.r[0][j];
1126 vtx.GetRefY() = KFPart.r[1][j];
1127 vtx.GetRefZ() = KFPart.r[2][j];
1128 for (int i = 0; i < 6; i++)
1129 vtx.GetCovMatrix()[i] = KFPart.C[i][j];
1130 vtx.GetRefChi2() = KFPart.Chi2[j];
1131 vtx.GetRefNDF() = (int)KFPart.NDF[j];
1132
1133 return vtx;
1134}
1135
1137{
1138 vtx->GetRefX() = KFPart.r[0][j];
1139 vtx->GetRefY() = KFPart.r[1][j];
1140 vtx->GetRefZ() = KFPart.r[2][j];
1141 for (int i = 0; i < 6; i++)
1142 vtx->GetCovMatrix()[i] = KFPart.C[i][j];
1143 vtx->GetRefChi2() = KFPart.Chi2[j];
1144 vtx->GetRefNDF() = (int)KFPart.NDF[j];
1145}
1146
1148{
1149 Part.SetId(static_cast<int>(KFPart.Id()[iPart]));
1150
1151 Part.CleanDaughtersId();
1152 Part.SetNDaughters(KFPart.DaughterIds().size());
1153 for (unsigned int i = 0; i < KFPart.DaughterIds().size(); i++)
1154 Part.AddDaughter(static_cast<int>(KFPart.DaughterIds()[i][iPart]));
1155
1156 Part.SetPDG(static_cast<int>(KFPart.GetPDG()[iPart]));
1157
1158 for (int iP = 0; iP < 8; iP++)
1159 Part.GetParameters()[iP] = KFPart.GetParameters()[iP][iPart];
1160 for (int iC = 0; iC < 36; iC++)
1161 Part.GetCovMatrix()[iC] = KFPart.GetCovMatrix()[iC][iPart];
1162
1163 Part.NDF = static_cast<int>(KFPart.GetNDF()[iPart]);
1164 Part.Chi2 = KFPart.GetChi2()[iPart];
1165 Part.Q = KFPart.GetQ()[iPart];
1166 Part.AtProductionVertex = KFPart.AtProductionVertex;
1167
1168 Part.fieldRegion[0] = KFPart.fField.cx0[iPart];
1169 Part.fieldRegion[1] = KFPart.fField.cx1[iPart];
1170 Part.fieldRegion[2] = KFPart.fField.cx2[iPart];
1171 Part.fieldRegion[3] = KFPart.fField.cy0[iPart];
1172 Part.fieldRegion[4] = KFPart.fField.cy1[iPart];
1173 Part.fieldRegion[5] = KFPart.fField.cy2[iPart];
1174 Part.fieldRegion[6] = KFPart.fField.cz0[iPart];
1175 Part.fieldRegion[7] = KFPart.fField.cz1[iPart];
1176 Part.fieldRegion[8] = KFPart.fField.cz2[iPart];
1177 Part.fieldRegion[9] = KFPart.fField.z0[iPart];
1178}
1179
1181{
1182 for (int i = 0; i < nPart; i++)
1183 GetKFParticle(Part[i], i);
1184}
1185
1187{
1188 KFPart.SetVtxGuess(x, y, z);
1189}
1190
1192{
1193 KFPart.SetVtxErrGuess(dx, dy, dz);
1194}
1195
1197{
1198 KFPart.GetMomentum(P, Error);
1199}
1200
1202{
1203 KFPart.GetMass(M, Error);
1204}
1205
1206// template<class T>
1207void CbmKFParticleInterface::FindParticles(vector<CbmKFTrack>& vRTracks,
1208 vector<float>& ChiToPrimVtx,
1209 vector<L1FieldRegion>& vField,
1210 vector<CbmKFParticle>& Particles,
1211 CbmKFVertex& PrimVtx,
1212 const vector<int>& vTrackPDG,
1213 const float cuts[2][3])
1214{
1215 //* Finds particles (K0s and Lambda) from a given set of tracks
1216
1217 static const int NTrackTypes = 8;
1218
1219 int pdgPos[NTrackTypes] = {-11, -13, 211, 321, 2212, 211, 321, 2212};
1220 int pdgNeg[NTrackTypes] = {11, 13, -211, -321, -2212, -211, -321, -2212};
1221
1222 vector<short> idPosSec[NTrackTypes];
1223 vector<short> idNegSec[NTrackTypes];
1224
1225 vector<short> idPosPrim[NTrackTypes];
1226 vector<short> idNegPrim[NTrackTypes];
1227
1228 for (unsigned short iTr = 0; iTr < vRTracks.size(); iTr++) {
1229 CbmKFTrack& kfTrack = vRTracks[iTr];
1230 bool ok = 1;
1231 for (unsigned short iT = 0; iT < 5; iT++)
1232 ok = ok && finite(kfTrack.GetTrack()[iT]);
1233 for (unsigned short iC = 0; iC < 15; iC++)
1234 ok = ok && finite(kfTrack.GetCovMatrix()[iC]);
1235 ok = ok && (kfTrack.GetCovMatrix()[0] < 1. && kfTrack.GetCovMatrix()[0] > 0.)
1236 && (kfTrack.GetCovMatrix()[2] < 1. && kfTrack.GetCovMatrix()[2] > 0.)
1237 && (kfTrack.GetCovMatrix()[5] < 1. && kfTrack.GetCovMatrix()[5] > 0.)
1238 && (kfTrack.GetCovMatrix()[9] < 1. && kfTrack.GetCovMatrix()[9] > 0.)
1239 && (kfTrack.GetCovMatrix()[14] < 1. && kfTrack.GetCovMatrix()[14] > 0.);
1240 ok = ok && kfTrack.GetRefChi2() < 10 * kfTrack.GetRefNDF();
1241 if (!ok)
1242 continue;
1243
1244 const int pdg = abs(vTrackPDG[iTr]);
1245
1246 short pdgIndex = -1;
1247 switch (pdg) {
1248 case 11:
1249 pdgIndex = 0;
1250 break;
1251 case 13:
1252 pdgIndex = 1;
1253 break;
1254 case 211:
1255 pdgIndex = 2;
1256 break;
1257 case 321:
1258 pdgIndex = 3;
1259 break;
1260 case 2212:
1261 pdgIndex = 4;
1262 break;
1263 }
1264
1265 short incr = 3;
1266 short pdgIndexMax = pdgIndex + incr;
1267
1268 if (pdgIndex < 2) {
1269 incr = 1;
1270 pdgIndexMax = pdgIndex;
1271 }
1272
1273 if (pdgIndex < 0) {
1274 pdgIndex = 5;
1275 pdgIndexMax = 7;
1276 incr = 1;
1277 }
1278
1279 if (ChiToPrimVtx[iTr] < cuts[0][0]) {
1280 if (kfTrack.GetTrack()[4] >= 0.) {
1281 for (int ipdg = pdgIndex; ipdg <= pdgIndexMax; ipdg += incr)
1282 idPosPrim[ipdg].push_back(iTr);
1283 }
1284 if (kfTrack.GetTrack()[4] < 0.)
1285 for (int ipdg = pdgIndex; ipdg <= pdgIndexMax; ipdg += incr)
1286 idNegPrim[ipdg].push_back(iTr);
1287 } else {
1288 if (kfTrack.GetTrack()[4] >= 0.)
1289 for (int ipdg = pdgIndex; ipdg <= pdgIndexMax; ipdg += incr)
1290 idPosSec[ipdg].push_back(iTr);
1291 if (kfTrack.GetTrack()[4] < 0.)
1292 for (int ipdg = pdgIndex; ipdg <= pdgIndexMax; ipdg += incr)
1293 idNegSec[ipdg].push_back(iTr);
1294 }
1295 }
1296
1297 const int nPart = idPosSec[5].size() * idNegSec[5].size() + idPosSec[5].size() * idNegSec[7].size()
1298 + idPosSec[7].size() * idNegSec[5].size() + idPosPrim[2].size() * idNegPrim[3].size()
1299 + idPosPrim[3].size() * idNegPrim[2].size() + idPosPrim[3].size() * idNegPrim[3].size()
1300 + idPosPrim[4].size() * idNegPrim[3].size() + idPosPrim[3].size() * idNegPrim[4].size()
1301 + idPosPrim[0].size() * idNegPrim[0].size() + idPosPrim[1].size() * idNegPrim[1].size();
1302
1303 // std::cout << "NPart estim " << nPart << std::endl;
1304 Particles.reserve(vRTracks.size() + nPart);
1305
1306 const float massLambdaPDG = 1.115683;
1307 const float massK0sPDG = 0.497614;
1308 const float massKsiPDG = 1.32171;
1309
1310 for (unsigned short iTr = 0; iTr < vRTracks.size(); iTr++) {
1311 CbmKFTrack& kfTrack = vRTracks[iTr];
1312 kfTrack.SetId(iTr);
1313 CbmKFParticle tmp(&kfTrack);
1314 tmp.SetPDG(211); // vTrackPDG[iTr]);
1315 tmp.SetId(Particles.size());
1316 Particles.push_back(tmp);
1317 }
1318
1319 vector<float> vLambdaTopoChi2Ndf;
1320 vector<CbmKFParticle> vLambdaSec;
1321 vector<CbmKFParticle> vLambdaPrim;
1322
1323 vector<float> vLambdaBarTopoChi2Ndf;
1324 vector<CbmKFParticle> vLambdaBarSec;
1325 vector<CbmKFParticle> vLambdaBarPrim;
1326
1327 vector<float> vK0sTopoChi2Ndf;
1328 vector<CbmKFParticle> vK0sPrim;
1329
1330 vector<CbmKFParticle> vXiPrim;
1331 vector<CbmKFParticle> vXiSec;
1332 vector<CbmKFParticle> vXiBarPrim;
1333
1334 vector<CbmKFParticle> vXiStarPrim;
1335 vector<CbmKFParticle> vXiStarBarPrim;
1336
1337 const float SecCuts[3] = {3.f, 5.f, 4.f};
1338 // K0s -> pi+ pi-
1339 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[5], pdgPos[5], 310, idNegSec[5], idPosSec[5], PrimVtx,
1340 cuts[0], 0, &vK0sTopoChi2Ndf, SecCuts, massK0sPDG, 0.0022, &vK0sPrim, 0);
1341 // Lambda -> p pi-
1342 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[5], pdgPos[7], 3122, idNegSec[5], idPosSec[7], PrimVtx,
1343 cuts[1], 0, &vLambdaTopoChi2Ndf, SecCuts, massLambdaPDG, 0.0012, &vLambdaPrim, &vLambdaSec);
1344 // Lambda_bar -> pi+ p-
1345 Find2DaughterDecay(vRTracks, vField, Particles, pdgPos[5], pdgNeg[4], -3122, idPosSec[5], idNegSec[4], PrimVtx,
1346 cuts[1], 0, &vLambdaBarTopoChi2Ndf, SecCuts, massLambdaPDG, 0.0012, &vLambdaBarPrim,
1347 &vLambdaBarSec);
1348 // K*0 -> K+ pi-
1349 Find2DaughterDecay(vRTracks, vField, Particles, pdgPos[3], pdgNeg[2], 313, idPosPrim[3], idNegPrim[2], PrimVtx,
1350 cuts[1], 1);
1351 // K*0_bar -> pi+ K-
1352 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[3], pdgPos[2], -313, idNegPrim[3], idPosPrim[2], PrimVtx,
1353 cuts[1], 1);
1354 // Lambda* -> p K-
1355 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[3], pdgPos[4], 3124, idNegPrim[3], idPosPrim[4], PrimVtx,
1356 cuts[1], 1);
1357 // Lambda*_bar -> K+ p-
1358 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[4], pdgPos[3], -3124, idNegPrim[4], idPosPrim[3], PrimVtx,
1359 cuts[1], 1);
1360 // phi -> K+ K-
1361 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[3], pdgPos[3], 333, idNegPrim[3], idPosPrim[3], PrimVtx,
1362 cuts[1], 1);
1363 // //rho -> pi+ pi-
1364 // Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[2], pdgPos[2], 113,
1365 // idNegPrim[2], idPosPrim[2],
1366 // PrimVtx, cuts[1]);
1367 // gamma -> e+ e-
1368 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[0], pdgPos[0], 22, idNegPrim[0], idPosPrim[0], PrimVtx,
1369 cuts[1], 1);
1370 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[0], pdgPos[0], 22, idNegSec[0], idPosSec[0], PrimVtx,
1371 cuts[1], 0);
1372 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[0], pdgPos[0], 22, idNegSec[0], idPosPrim[0], PrimVtx,
1373 cuts[1], 0);
1374 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[0], pdgPos[0], 22, idNegPrim[0], idPosSec[0], PrimVtx,
1375 cuts[1], 0);
1376 // JPsi-> e+ e-
1377 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[0], pdgPos[0], 443, idNegPrim[0], idPosPrim[0], PrimVtx,
1378 cuts[1], 1, 1.f);
1379 // JPsi-> mu+ mu-
1380 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[1], pdgPos[1], 100443, idNegPrim[1], idPosPrim[1], PrimVtx,
1381 cuts[1], 1, 1.f);
1382 // rho, omega, phi -> e+ e-
1383 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[0], pdgPos[0], 100113, idNegPrim[0], idPosPrim[0], PrimVtx,
1384 cuts[1], 1, 0.2f);
1385 // rho, omega, phi -> mu+ mu-
1386 const float PCut = 1.f;
1387 Find2DaughterDecay(vRTracks, vField, Particles, pdgNeg[1], pdgPos[1], 200113, idNegPrim[1], idPosPrim[1], PrimVtx,
1388 cuts[1], 1, 0.2f, -100, 0, &PCut);
1389
1390 ExtrapolateToPV(vLambdaPrim, PrimVtx);
1391 ExtrapolateToPV(vLambdaBarPrim, PrimVtx);
1392 ExtrapolateToPV(vK0sPrim, PrimVtx);
1393
1394 // Find Xi-
1395 float cutXi[3] = {3., 5., 6.};
1396 FindTrackV0Decay(3312, Particles, vLambdaSec, vRTracks, vField, pdgNeg[5], idNegSec[5], PrimVtx, cutXi, 0, 0,
1397 &vXiPrim, massKsiPDG, 0.002);
1398
1399 float cutLL[3] = {6., 10000000., 3.};
1400 float cutLL2[3] = {6., 3., 3.};
1401 vector<CbmKFParticle> vLL;
1402 FindTrackV0Decay(3002, vLL, vLambdaSec, vRTracks, vField, pdgNeg[5], idNegSec[5], PrimVtx, cutLL, 0, &ChiToPrimVtx);
1403 // Find H0->Lambda p pi-
1404 // Find Omega*-
1405 FindTrackV0Decay(3001, Particles, vLL, vRTracks, vField, pdgPos[4], idPosSec[4], PrimVtx, cutLL2, 0, &ChiToPrimVtx);
1406 // Find Xi+
1407 float cutXiPlus[3] = {3., 5., 6.};
1408 FindTrackV0Decay(-3312, Particles, vLambdaBarSec, vRTracks, vField, pdgPos[5], idPosSec[5], PrimVtx, cutXiPlus, 0,
1409 0, &vXiBarPrim, massKsiPDG, 0.002);
1410 // Find Omega-
1411 float cutOmega[3] = {3., 3., 3.};
1412 FindTrackV0Decay(3334, Particles, vLambdaSec, vRTracks, vField, pdgNeg[6], idNegSec[6], PrimVtx, cutOmega, 0,
1413 &ChiToPrimVtx);
1414 // Find Omega+
1415 float cutOmegaPlus[3] = {3., 3., 3.};
1416 FindTrackV0Decay(-3334, Particles, vLambdaBarSec, vRTracks, vField, pdgPos[6], idPosSec[6], PrimVtx, cutOmegaPlus,
1417 0, &ChiToPrimVtx);
1418 // Find Xi*-
1419 float cutXiStarMinus[3] = {-100., 10000., 3.};
1420 FindTrackV0Decay(1003314, Particles, vLambdaPrim, vRTracks, vField, pdgNeg[3], idNegPrim[3], PrimVtx,
1421 cutXiStarMinus, 1);
1422 // Find Xi*+
1423 float cutXiStarPlus[3] = {-100., 10000., 3.};
1424 FindTrackV0Decay(-1003314, Particles, vLambdaBarPrim, vRTracks, vField, pdgPos[3], idPosPrim[3], PrimVtx,
1425 cutXiStarPlus, 1);
1426
1427 ExtrapolateToPV(vXiPrim, PrimVtx);
1428 ExtrapolateToPV(vXiBarPrim, PrimVtx);
1429
1430 // Find Xi*0
1431 float cutXiStar0[3] = {-100., 10000., 3.};
1432 FindTrackV0Decay(3324, Particles, vXiPrim, vRTracks, vField, pdgPos[5], idPosPrim[5], PrimVtx, cutXiStar0, 1, 0,
1433 &vXiStarPrim);
1434 // Find Xi*0 bar
1435 float cutXiBarStar0[3] = {-100., 10000., 3.};
1436 FindTrackV0Decay(-3324, Particles, vXiBarPrim, vRTracks, vField, pdgNeg[5], idNegPrim[5], PrimVtx, cutXiBarStar0, 1,
1437 0, &vXiStarBarPrim);
1438 // Find Omega*-
1439 const float cutOmegaStar[2] = {-100., 3.};
1440 for (unsigned int iPart = 0; iPart < vXiStarPrim.size(); iPart++)
1441 CombineTrackPart(vRTracks, vField, Particles, vXiStarPrim[iPart], pdgNeg[3], 1003334, idNegPrim[3],
1442 cutOmegaStar, 0);
1443 // Find Omega*+
1444 for (unsigned int iPart = 0; iPart < vXiStarBarPrim.size(); iPart++)
1445 CombineTrackPart(vRTracks, vField, Particles, vXiStarBarPrim[iPart], pdgPos[3], -1003334, idPosPrim[3],
1446 cutOmegaStar, 0);
1447 // Find K*+
1448 float cutKStarPlus[3] = {-100., 10000., 3.};
1449 FindTrackV0Decay(323, Particles, vK0sPrim, vRTracks, vField, pdgPos[5], idPosPrim[5], PrimVtx, cutKStarPlus, 1, 0);
1450 // Find K*-
1451 float cutKStarMinus[3] = {-100., 10000., 3.};
1452 FindTrackV0Decay(-323, Particles, vK0sPrim, vRTracks, vField, pdgNeg[5], idNegPrim[5], PrimVtx, cutKStarMinus, 1,
1453 0);
1454 // Find Sigma*+
1455 float cutSigmaStarPlus[3] = {-100., 10000., 3.};
1456 FindTrackV0Decay(3224, Particles, vLambdaPrim, vRTracks, vField, pdgPos[5], idPosPrim[5], PrimVtx, cutSigmaStarPlus,
1457 1, 0);
1458 // Find Sigma*+ bar
1459 float cutSigmaStarPlusBar[3] = {-100., 10000., 3.};
1460 FindTrackV0Decay(-3114, Particles, vLambdaBarPrim, vRTracks, vField, pdgPos[5], idPosPrim[5], PrimVtx,
1461 cutSigmaStarPlusBar, 1, 0);
1462 // Find Sigma*-
1463 float cutSigmaStarMinus[3] = {-100., 10000., 3.};
1464 FindTrackV0Decay(3114, Particles, vLambdaPrim, vRTracks, vField, pdgNeg[5], idNegPrim[5], PrimVtx,
1465 cutSigmaStarMinus, 1, 0);
1466 // Find Sigma*- bar
1467 float cutSigmaStarMinusBar[3] = {-100., 10000., 3.};
1468 FindTrackV0Decay(-3224, Particles, vLambdaBarPrim, vRTracks, vField, pdgNeg[5], idNegPrim[5], PrimVtx,
1469 cutSigmaStarMinusBar, 1, 0);
1470 // Find H-dibarion
1471 vector<CbmKFParticle> vHdibarion;
1472 float cutHdb[3] = {3., 3., 3.};
1473 for (unsigned short iL = 0; iL < vLambdaSec.size(); iL++) {
1474 CbmKFParticle_simd vDaughters[2] = {CbmKFParticle_simd(), CbmKFParticle_simd(vLambdaSec[iL])};
1475
1476 vector<int> daughterIds;
1477 for (unsigned int iD = 0; iD < vLambdaSec[iL].DaughterIds().size(); iD++)
1478 daughterIds.push_back(vLambdaSec[iL].DaughterIds()[iD]);
1479 FindHyperons(3000, vDaughters, daughterIds, vLambdaSec, vHdibarion, PrimVtx, cutHdb, iL + 1);
1480 }
1481
1482 for (unsigned int iH = 0; iH < vHdibarion.size(); iH++) {
1483 vHdibarion[iH].SetId(Particles.size());
1484 Particles.push_back(vHdibarion[iH]);
1485 }
1486 // chi2_prim chi2_geo z pt chi2_topo
1487 const float cutsD[8][8] = {{6., 3., 0.04, 0.3, 3.}, // D0 -> pi+ K-
1488 {6., 3., 0.04, 0.3, 3.}, // D+ -> K- pi+ pi+
1489 {6., 3., 0.04, 0.3, 3.}, // D0 -> pi+ pi+ pi- K-
1490 {6., 3., 0.04, 0.3, 3.}, // Ds+ -> K- K+ pi+
1491 {6., 3., 0.04, 0.3, 3.}, // Lambdac -> pi+ K- p
1492 {6., 3., -100., 0.3, -100.}, // D*0 -> D+ pi-
1493 {6., 3., -100., 0.3, -100.}, // D*+ -> D0 pi+
1494 {6., 3., -100., 0.3, -100.}}; // D*+4 -> D04 pi+
1495
1496 const int DMesLambdcDaughterPDG[5] = {211, -321, -211, 321, 2212};
1497 const int DMesLambdcMotherPDG[8] = {421, 411, 100421, 431, 4122, 10421, 10411, 20411};
1498 vector<short>* DMesLambdcIdTrack[5] = {&idPosSec[5], &idNegSec[3], &idNegSec[5], &idPosSec[3], &idPosSec[4]};
1499 FindDMesLambdac(vRTracks, vField, Particles, DMesLambdcDaughterPDG, DMesLambdcMotherPDG, DMesLambdcIdTrack, PrimVtx,
1500 cutsD, ChiToPrimVtx);
1501
1502 const int DMesLambdcBarDaughterPDG[5] = {-211, 321, 211, -321, -2212};
1503 const int DMesLambdcBarMotherPDG[8] = {-421, -411, -100421, -431, -4122, -10421, -10411, -20411};
1504 vector<short>* DMesLambdcBarIdTrack[5] = {&idNegSec[5], &idPosSec[3], &idPosSec[5], &idNegSec[3], &idNegSec[4]};
1505 FindDMesLambdac(vRTracks, vField, Particles, DMesLambdcBarDaughterPDG, DMesLambdcBarMotherPDG, DMesLambdcBarIdTrack,
1506 PrimVtx, cutsD, ChiToPrimVtx);
1507 // std::cout << "NPart " << Particles.size() << std::endl;
1508}
1509
1510// void CbmKFParticleInterface::FindParticles(vector<CbmL1Track>& vRTracks, vector<CbmKFParticle>& Particles,
1511// CbmKFVertex& PrimVtx, const vector<int>& vTrackPDG, const float
1512// cuts[2][3])
1513// {
1514// FindParticlesT(vRTracks, Particles, PrimVtx, vTrackPDG, cuts);
1515// }
1516//
1517// void CbmKFParticleInterface::FindParticles(vector<CbmStsTrack>& vRTracks, vector<CbmKFParticle>& Particles,
1518// CbmKFVertex& PrimVtx, const vector<int>& vTrackPDG, const float
1519// cuts[2][3])
1520// {
1521// FindParticlesT(vRTracks, Particles, PrimVtx, vTrackPDG, cuts);
1522// }
1523
1524void CbmKFParticleInterface::ExtrapolateToPV(vector<CbmKFParticle>& vParticles, CbmKFVertex& PrimVtx)
1525{
1526 fvec pVtx[3] = {PrimVtx.GetRefX(), PrimVtx.GetRefY(), PrimVtx.GetRefZ()};
1527 for (unsigned int iL = 0; iL < vParticles.size(); iL += fvecLen) {
1528 CbmKFParticle* parts[fvecLen];
1529 unsigned int nPart = vParticles.size();
1530
1531 unsigned int nEntries = (iL + fvecLen < nPart) ? fvecLen : (nPart - iL);
1532
1533 for (unsigned short iv = 0; iv < nEntries; iv++)
1534 parts[iv] = &vParticles[iL + iv];
1535
1536 CbmKFParticleInterface tmp(parts, nEntries);
1537 tmp.Extrapolate(tmp.KFPart.r, tmp.GetDStoPoint(pVtx));
1538
1539 for (unsigned int iv = 0; iv < nEntries; iv++) {
1540 tmp.GetKFParticle(vParticles[iL + iv], iv);
1541 }
1542 }
1543}
1544
1546{
1547 const fvec& x1 = p1.GetX();
1548 const fvec& y1 = p1.GetY();
1549 const fvec& z1 = p1.GetZ();
1550
1551 const fvec& x2 = p2.GetX();
1552 const fvec& y2 = p2.GetY();
1553 const fvec& z2 = p2.GetZ();
1554
1555 const fvec dx = x1 - x2;
1556 const fvec dy = y1 - y2;
1557 const fvec dz = z1 - z2;
1558
1559 const fvec& c0 = p1.GetCovariance(0) + p2.GetCovariance(0);
1560 const fvec& c1 = p1.GetCovariance(1) + p2.GetCovariance(1);
1561 const fvec& c2 = p1.GetCovariance(2) + p2.GetCovariance(2);
1562 const fvec& c3 = p1.GetCovariance(3) + p2.GetCovariance(3);
1563 const fvec& c4 = p1.GetCovariance(4) + p2.GetCovariance(4);
1564 const fvec& c5 = p1.GetCovariance(5) + p2.GetCovariance(5);
1565
1566 const fvec r2 = dx * dx + dy * dy + dz * dz;
1567 const fvec err2 = c0 * dx * dx + c2 * dy * dy + c5 * dz * dz + 2 * (c1 * dx * dy + c3 * dx * dz + c4 * dy * dz);
1568
1569 return (r2 * r2 / err2);
1570}
1571
1572// template<class T>
1573void CbmKFParticleInterface::Find2DaughterDecay(vector<CbmKFTrack>& vTracks,
1574 const vector<L1FieldRegion>& vField,
1575 vector<CbmKFParticle>& Particles,
1576 const int DaughterNegPDG,
1577 const int DaughterPosPDG,
1578 const int MotherPDG,
1579 vector<short>& idNeg,
1580 vector<short>& idPos,
1581 CbmKFVertex& PrimVtx,
1582 const float* cuts,
1583 bool isPrimary,
1584 vector<float>* vMotherTopoChi2Ndf,
1585 const float* secCuts,
1586 const float massMotherPDG,
1587 const float massMotherPDGSigma,
1588 vector<CbmKFParticle>* vMotherPrim,
1589 vector<CbmKFParticle>* vMotherSec)
1590{
1591 const int NPositive = idPos.size();
1592 CbmKFParticle mother_temp;
1593
1595 mother.SetPDG(MotherPDG);
1596 CbmKFParticleInterface motherTopo;
1597
1598 const short NPosVect = NPositive % fvecLen == 0 ? NPositive / fvecLen : NPositive / fvecLen + 1;
1599 vector<CbmKFParticle_simd> posPart(NPosVect);
1600
1601 // create particles from tracks
1603
1604 int iPosVect = 0;
1605 for (unsigned short iTrP = 0; iTrP < NPositive; iTrP += fvecLen) {
1606 const unsigned short NTracks = (iTrP + fvecLen < NPositive) ? fvecLen : (NPositive - iTrP);
1607
1608 L1FieldRegion posField;
1609 for (unsigned short iv = 0; iv < NTracks; iv++) {
1610 vvPos[iv] = &vTracks[idPos[iTrP + iv]];
1611
1612 int entrSIMDPos = idPos[iTrP + iv] % fvecLen;
1613 int entrVecPos = idPos[iTrP + iv] / fvecLen;
1614 posField.SetOneEntry(iv, vField[entrVecPos], entrSIMDPos);
1615 }
1616
1617 posPart[iPosVect].Create(vvPos, NTracks, 0, &DaughterPosPDG);
1618 posPart[iPosVect].SetField(posField);
1619 fvec posId;
1620 for (int iv = 0; iv < NTracks; iv++)
1621 posId[iv] = idPos[iTrP + iv];
1622 posPart[iPosVect].SetId(posId);
1623 iPosVect++;
1624 }
1625
1626 for (unsigned short iTrN = 0; iTrN < idNeg.size(); iTrN++) {
1627 CbmKFTrack& kfTrackNeg = vTracks[idNeg[iTrN]];
1628 CbmKFParticle_simd vDaughters[2] = {CbmKFParticle_simd(kfTrackNeg, 0, &DaughterNegPDG), CbmKFParticle_simd()};
1629 int entrSIMD = idNeg[iTrN] % fvecLen;
1630 int entrVec = idNeg[iTrN] / fvecLen;
1631 vDaughters[0].SetField(vField[entrVec], 1, entrSIMD);
1632 vDaughters[0].SetId(idNeg[iTrN]);
1633
1634 for (unsigned short iTrP = 0; iTrP < NPositive; iTrP += fvecLen) {
1635 const unsigned short NTracks = (iTrP + fvecLen < NPositive) ? fvecLen : (NPositive - iTrP);
1636
1637 vDaughters[1] = posPart[iTrP / fvecLen];
1638
1639 if (isPrimary) {
1640 fvec vtxGuess[3] = {PrimVtx.GetRefX(), PrimVtx.GetRefY(), PrimVtx.GetRefZ()};
1641 fvec errGuess[3] = {100 * sqrt(PrimVtx.GetCovMatrix()[0]), 100 * sqrt(PrimVtx.GetCovMatrix()[2]),
1642 100 * sqrt(PrimVtx.GetCovMatrix()[5])};
1643 mother.SetVtxGuess(vtxGuess[0], vtxGuess[1], vtxGuess[2]);
1644 mother.SetVtxErrGuess(errGuess[0], errGuess[1], errGuess[2]);
1645 mother.Construct(vDaughters, 2, 0, -1, -1, 1);
1646 } else
1647 mother.Construct(vDaughters, 2, 0);
1648
1649 if (vMotherTopoChi2Ndf) {
1650 motherTopo = mother;
1651 motherTopo.MeasureProductionVertex(&motherTopo.KFPart, motherTopo.GetParameters(), &PrimVtx);
1652 }
1653
1654 // if( (fabs(DaughterNegPDG) == 211) && (fabs(DaughterPosPDG) == 211) )
1655 // {
1656 // fvec pl0[3] = {vDaughters[0].GetPx(),vDaughters[0].GetPy(),vDaughters[0].GetPz()};
1657 // fvec pl1[3] = {vDaughters[1].GetPx(),vDaughters[1].GetPy(),vDaughters[1].GetPz()};
1658 //
1659 // fvec pcm[3] = {pl0[0]+pl1[0], pl0[1]+pl1[1], pl0[2]+pl1[2]};
1660 // fvec ecm = vDaughters[0].GetE()+vDaughters[1].GetE();
1661 //
1662 // fvec gamma = sqrt(fvec(1.) - (pcm[0]*pcm[0]+pcm[1]*pcm[1]+pcm[2]*pcm[2])/(ecm*ecm));
1663 //
1664 // fvec e0 = gamma*(vDaughters[0].GetE() - (pcm[0]*pl0[0]+pcm[1]*pl0[1]+pcm[2]*pl0[2])/ecm);
1665 // fvec e1 = gamma*(vDaughters[1].GetE() - (pcm[0]*pl1[0]+pcm[1]*pl1[1]+pcm[2]*pl1[2])/ecm);
1666 // if( fabs(e0[0]-e1[0]) > 1.e-7 )
1667 // std::cout << e0 << " " << e1 << std::endl;
1668 // }
1669
1670 // CbmKFParticle mother_temp[fvecLen];
1671 // mother.GetKFParticle(mother_temp, NTracks);
1672
1673 for (int iv = 0; iv < NTracks; iv++) {
1674 if (!finite(mother.GetChi2()[iv]))
1675 continue;
1676 if (!(mother.GetChi2()[iv] > 0.0f))
1677 continue;
1678 if (!(mother.GetChi2()[iv] == mother.GetChi2()[iv]))
1679 continue;
1680 if (mother.GetZ()[iv] < cuts[2])
1681 continue;
1682
1683 if (mother.GetChi2()[iv] / mother.GetNDF()[iv] < cuts[1]) {
1684 mother.GetKFParticle(mother_temp, iv);
1685 mother_temp.SetId(Particles.size());
1686 Particles.push_back(mother_temp);
1687
1688 float motherTopoChi2Ndf(0);
1689 if (vMotherTopoChi2Ndf)
1690 motherTopoChi2Ndf = motherTopo.GetChi2()[iv] / motherTopo.GetNDF()[iv];
1691 // vMotherTopoChi2Ndf->push_back(motherTopo.GetChi2()[iv]/motherTopo.GetNDF()[iv]);
1692
1693 if (vMotherPrim) {
1694 Double_t mass, errMass;
1695
1696 mother_temp.GetMass(mass, errMass);
1697 if ((fabs(mass - massMotherPDG) / massMotherPDGSigma) > secCuts[0])
1698 continue;
1699
1700 if (motherTopoChi2Ndf < secCuts[1]) {
1701 vMotherPrim->push_back(mother_temp);
1702 } else if (vMotherSec) {
1703 if (mother_temp.GetZ() < secCuts[2])
1704 continue;
1705 vMotherSec->push_back(mother_temp);
1706 }
1707 }
1708 }
1709 }
1710 }
1711 }
1712}
1713
1714// template<class T>
1715void CbmKFParticleInterface::Find2DaughterDecay(vector<CbmKFTrack>& vTracks,
1716 const vector<L1FieldRegion>& vField,
1717 vector<CbmKFParticle>& Particles,
1718 const int DaughterNegPDG,
1719 const int DaughterPosPDG,
1720 const int MotherPDG,
1721 vector<short>& idNeg,
1722 vector<short>& idPos,
1723 CbmKFVertex& PrimVtx,
1724 const float* cuts,
1725 bool isPrimary,
1726 const float PtCut,
1727 const float Chi2PrimCut,
1728 vector<float>* ChiToPrimVtx,
1729 const float* PCut)
1730{
1731 vector<short> idPosPt;
1732 vector<short> idNegPt;
1733
1734 for (unsigned int iEl = 0; iEl < idPos.size(); iEl++) {
1735 CbmKFTrack& kfTrack = vTracks[idPos[iEl]];
1736 const float tx = kfTrack.GetTrack()[2];
1737 const float ty = kfTrack.GetTrack()[3];
1738 const float p = fabs(1 / kfTrack.GetTrack()[4]);
1739 const float t2 = tx * tx + ty * ty;
1740 float pt = p * (sqrt(t2 / (1 + t2)));
1741 if (PCut)
1742 if (p < *PCut)
1743 continue;
1744 if (pt < PtCut)
1745 continue;
1746 if (Chi2PrimCut > -1)
1747 if (ChiToPrimVtx->at(idPos[iEl]) < Chi2PrimCut)
1748 continue;
1749 idPosPt.push_back(idPos[iEl]);
1750 }
1751
1752 for (unsigned int iEl = 0; iEl < idNeg.size(); iEl++) {
1753 CbmKFTrack& kfTrack = vTracks[idNeg[iEl]];
1754 const float tx = kfTrack.GetTrack()[2];
1755 const float ty = kfTrack.GetTrack()[3];
1756 const float p = fabs(1 / kfTrack.GetTrack()[4]);
1757 const float t2 = tx * tx + ty * ty;
1758 float pt = p * (sqrt(t2 / (1 + t2)));
1759 if (pt < PtCut)
1760 continue;
1761 if (Chi2PrimCut > -1)
1762 if (ChiToPrimVtx->at(idNeg[iEl]) < Chi2PrimCut)
1763 continue;
1764 idNegPt.push_back(idNeg[iEl]);
1765 }
1766
1767 Find2DaughterDecay(vTracks, vField, Particles, DaughterNegPDG, DaughterPosPDG, MotherPDG, idNegPt, idPosPt, PrimVtx,
1768 cuts, isPrimary);
1769}
1770
1771// template<class T>
1773 vector<CbmKFParticle>& Particles,
1774 vector<CbmKFParticle>& vV0,
1775 vector<CbmKFTrack>& vTracks,
1776 const vector<L1FieldRegion>& vField,
1777 const int DaughterPDG,
1778 vector<short>& idTrack,
1779 CbmKFVertex& PrimVtx,
1780 const float* cuts,
1781 bool isPrimary,
1782 vector<float>* ChiToPrimVtx,
1783 vector<CbmKFParticle>* vHyperonPrim,
1784 float hyperonPrimMass,
1785 float hyperonPrimMassErr,
1786 vector<CbmKFParticle>* vHyperonSec)
1787{
1788 CbmKFParticle hyperon_temp;
1789 CbmKFParticleInterface hyperon;
1790 hyperon.SetPDG(MotherPDG);
1791
1792 for (unsigned short iV0 = 0; iV0 < vV0.size(); iV0++) {
1793 unsigned short nElements = 0;
1794 CbmKFParticle_simd vDaughters[2] = {CbmKFParticle_simd(vV0[iV0]), CbmKFParticle_simd()};
1795
1797 L1FieldRegion field;
1798 fvec trId;
1799
1800 for (unsigned short iTr = 0; iTr < idTrack.size(); iTr++) {
1801 bool ok = 1;
1802 if (ChiToPrimVtx)
1803 if ((ChiToPrimVtx->at(idTrack[iTr]) < 7))
1804 ok = 0; // TODO 7 for Omega
1805
1806 if (ok) {
1807 trId[nElements] = idTrack[iTr];
1808 vvTr[nElements] = &vTracks[idTrack[iTr]];
1809
1810 int entrSIMD = idTrack[iTr] % fvecLen;
1811 int entrVec = idTrack[iTr] / fvecLen;
1812 field.SetOneEntry(nElements, vField[entrVec], entrSIMD);
1813
1814 nElements++;
1815 } else if ((iTr != idTrack.size() - 1))
1816 continue;
1817
1818 if ((nElements == fvecLen) || ((iTr == idTrack.size() - 1) && (nElements > 0))) {
1819 vDaughters[1].Create(vvTr, nElements, 0, &DaughterPDG);
1820 vDaughters[1].SetField(field);
1821 vDaughters[1].SetId(trId);
1822
1823 if (isPrimary) {
1824 fvec vtxGuess[3] = {PrimVtx.GetRefX(), PrimVtx.GetRefY(), PrimVtx.GetRefZ()};
1825 fvec errGuess[3] = {100 * sqrt(PrimVtx.GetCovMatrix()[0]), 100 * sqrt(PrimVtx.GetCovMatrix()[2]),
1826 100 * sqrt(PrimVtx.GetCovMatrix()[5])};
1827 hyperon.SetVtxGuess(vtxGuess[0], vtxGuess[1], vtxGuess[2]);
1828 hyperon.SetVtxErrGuess(errGuess[0], errGuess[1], errGuess[2]);
1829 hyperon.Construct(vDaughters, 2, 0, -1, -1, 1);
1830 } else
1831 hyperon.Construct(vDaughters, 2, 0);
1832
1833 CbmKFParticleInterface hyperonTopo(hyperon);
1834 hyperonTopo.MeasureProductionVertex(&hyperonTopo.KFPart, hyperonTopo.GetParameters(), &PrimVtx);
1835
1836 for (unsigned int iv = 0; iv < nElements; iv++) {
1837 bool isSameTrack = 0;
1838 for (unsigned short iD = 0; iD < vV0[iV0].DaughterIds().size(); iD++)
1839 if (vV0[iV0].DaughterIds()[iD] == trId[iv])
1840 isSameTrack = 1;
1841
1842 if (isSameTrack)
1843 continue;
1844 if (!finite(hyperon.GetChi2()[iv]))
1845 continue;
1846 if (!(hyperon.GetChi2()[iv] > 0.0f))
1847 continue;
1848 if (!(hyperon.GetChi2()[iv] == hyperon.GetChi2()[iv]))
1849 continue;
1850 if ((hyperon.GetZ()[iv] < cuts[0]) || ((vV0[iV0].GetZ() - hyperon.GetZ()[iv]) < 0))
1851 continue;
1852
1853 if (hyperonTopo.GetChi2()[iv] / hyperonTopo.GetNDF()[iv] > cuts[1])
1854 continue;
1855
1856 if (hyperon.GetChi2()[iv] / hyperon.GetNDF()[iv] > cuts[2])
1857 continue;
1858 hyperon.GetKFParticle(hyperon_temp, iv);
1859
1860 hyperon_temp.SetId(Particles.size());
1861 Particles.push_back(hyperon_temp);
1862
1863 if (vHyperonPrim) {
1864 Double_t mass, errMass;
1865
1866 hyperon_temp.GetMass(mass, errMass);
1867 if ((fabs(mass - hyperonPrimMass) / hyperonPrimMassErr) <= 3)
1868 vHyperonPrim->push_back(hyperon_temp);
1869 else if (vHyperonSec)
1870 vHyperonSec->push_back(hyperon_temp);
1871 }
1872 }
1873 nElements = 0;
1874 }
1875 }
1876 }
1877}
1878
1880 CbmKFParticle_simd vDaughters[2],
1881 vector<int>& daughterIds,
1882 vector<CbmKFParticle>& vLambdaSec,
1883 vector<CbmKFParticle>& vHyperon,
1884 CbmKFVertex& PrimVtx,
1885 const float* cuts,
1886 int startIndex)
1887{
1888 CbmKFParticle* lambdas[fvecLen];
1889 int nLambdasSec = vLambdaSec.size();
1890
1891 for (unsigned short iL = startIndex; iL < vLambdaSec.size(); iL += fvecLen) {
1892 unsigned int nEntries = (iL + fvecLen < nLambdasSec) ? fvecLen : (nLambdasSec - iL);
1893
1894 for (unsigned short iv = 0; iv < nEntries; iv++)
1895 lambdas[iv] = &vLambdaSec[iL + iv];
1896
1897 vDaughters[0].Create(lambdas, nEntries);
1898
1899 CbmKFParticleInterface hyperon;
1900
1901 hyperon.SetPDG(PDG);
1902 hyperon.Construct(vDaughters, 2, 0);
1903
1904 CbmKFParticleInterface hyperonTopo(hyperon);
1905 hyperonTopo.MeasureProductionVertex(&hyperonTopo.KFPart, hyperonTopo.GetParameters(), &PrimVtx);
1906
1907 for (unsigned int iv = 0; iv < nEntries; iv++) {
1908 bool isSameTrack = 0;
1909 for (unsigned short iD = 0; iD < lambdas[iv]->DaughterIds().size(); iD++)
1910 for (unsigned short iD0 = 0; iD0 < daughterIds.size(); iD0++)
1911 if (lambdas[iv]->DaughterIds()[iD] == daughterIds[iD0])
1912 isSameTrack = 1;
1913
1914 if (isSameTrack)
1915 continue;
1916 if (!finite(hyperon.GetChi2()[iv]))
1917 continue;
1918 if (!(hyperon.GetChi2()[iv] > 0.0f))
1919 continue;
1920 if (!(hyperon.GetChi2()[iv] == hyperon.GetChi2()[iv]))
1921 continue;
1922 if ((hyperon.GetZ()[iv] < cuts[0]) || ((lambdas[iv]->GetZ() - hyperon.GetZ()[iv]) < 0))
1923 continue;
1924
1925 if (hyperonTopo.GetChi2()[iv] / hyperonTopo.GetNDF()[iv] > cuts[1])
1926 continue;
1927
1928 if (hyperon.GetChi2()[iv] / hyperon.GetNDF()[iv] > cuts[2])
1929 continue;
1930 CbmKFParticle hyperon_temp;
1931 hyperon.GetKFParticle(hyperon_temp, iv);
1932 vHyperon.push_back(hyperon_temp);
1933 }
1934 }
1935}
1936
1937// template<class T>
1938void CbmKFParticleInterface::FindDMesLambdac(vector<CbmKFTrack>& vTracks,
1939 const vector<L1FieldRegion>& vField,
1940 vector<CbmKFParticle>& Particles,
1941 const int DaughterPDG[5], // pi, K_b, pi_b, K, p
1942 const int MotherPDG[8], // D0, D+, D0_4, Ds+, Lc
1943 vector<short>* idTrack[5], // pi, K_b, pi_b, K, p
1944 CbmKFVertex& PrimVtx,
1945 const float cuts[8][8],
1946 vector<float> ChiToPrimVtx)
1947{
1948 vector<short> id[5]; // pi, K_b, pi_b, K, p
1949 for (int iId = 0; iId < 5; iId++) {
1950 for (unsigned int iTr = 0; iTr < idTrack[iId]->size(); iTr++) {
1951 CbmKFTrack& kfTrack = vTracks[idTrack[iId]->at(iTr)];
1952 const float tx = kfTrack.GetTrack()[2];
1953 const float ty = kfTrack.GetTrack()[3];
1954 const float p = fabs(1 / kfTrack.GetTrack()[4]);
1955 const float t2 = tx * tx + ty * ty;
1956 float pt = p * (sqrt(t2 / (1 + t2)));
1957 if (pt < cuts[0][3])
1958 continue;
1959 if (ChiToPrimVtx[idTrack[iId]->at(iTr)] < cuts[0][0])
1960 continue;
1961 id[iId].push_back(idTrack[iId]->at(iTr));
1962 }
1963 }
1964
1965 vector<CbmKFParticle> kpi;
1966 vector<CbmKFParticle> kpipi;
1967 vector<CbmKFParticle> kpipipi;
1968 vector<CbmKFParticle> kpik;
1969 vector<CbmKFParticle> kpip;
1970
1971 const float cutskpi[3] = {3., 3., -100.};
1972 Find2DaughterDecay(vTracks, vField, kpi, DaughterPDG[0], DaughterPDG[1], MotherPDG[0], id[0], id[1], PrimVtx,
1973 cutskpi, 0);
1974
1975 for (unsigned int iKPi = 0; iKPi < kpi.size(); iKPi++) {
1976 unsigned short startPiIndex = kpi[iKPi].DaughterIds()[0] + 1;
1977
1978 CombineTrackPart(vTracks, vField, kpipi, kpi[iKPi], DaughterPDG[0], MotherPDG[1], id[0], cuts[1], startPiIndex,
1979 1);
1980 CombineTrackPart(vTracks, vField, kpik, kpi[iKPi], DaughterPDG[3], MotherPDG[3], id[3], cuts[3], 0, 1);
1981 CombineTrackPart(vTracks, vField, kpip, kpi[iKPi], DaughterPDG[4], MotherPDG[4], id[4], cuts[4], 0, 1);
1982 }
1983 for (unsigned int iKPiPi = 0; iKPiPi < kpipi.size(); iKPiPi++)
1984 CombineTrackPart(vTracks, vField, kpipipi, kpipi[iKPiPi], DaughterPDG[2], MotherPDG[2], id[2], cuts[2], 0, 1);
1985
1986 SelectParticleCandidates(Particles, kpi, PrimVtx, cuts[0]);
1987 SelectParticleCandidates(Particles, kpipi, PrimVtx, cuts[1]);
1988 SelectParticleCandidates(Particles, kpipipi, PrimVtx, cuts[2]);
1989 SelectParticleCandidates(Particles, kpik, PrimVtx, cuts[3]);
1990 SelectParticleCandidates(Particles, kpip, PrimVtx, cuts[4]);
1991
1992 vector<CbmKFParticle> d0pi;
1993 vector<CbmKFParticle> d2pi;
1994 vector<CbmKFParticle> d4pi;
1995
1996 for (unsigned int iKPiPi = 0; iKPiPi < kpipi.size(); iKPiPi++)
1997 CombineTrackPart(vTracks, vField, d0pi, kpipi[iKPiPi], DaughterPDG[2], MotherPDG[5], id[2], cuts[5], 0, 0);
1998
1999 for (unsigned int iKPi = 0; iKPi < kpi.size(); iKPi++)
2000 CombineTrackPart(vTracks, vField, d2pi, kpi[iKPi], DaughterPDG[0], MotherPDG[6], id[0], cuts[6], 0, 0);
2001
2002 for (unsigned int iKPiPiPi = 0; iKPiPiPi < kpipipi.size(); iKPiPiPi++)
2003 CombineTrackPart(vTracks, vField, d4pi, kpipipi[iKPiPiPi], DaughterPDG[0], MotherPDG[7], id[0], cuts[7], 0, 0);
2004
2005 SelectParticleCandidates(Particles, d0pi, PrimVtx, cuts[5]);
2006 SelectParticleCandidates(Particles, d2pi, PrimVtx, cuts[6]);
2007 SelectParticleCandidates(Particles, d4pi, PrimVtx, cuts[7]);
2008}
2009
2010// template<class T>
2011void CbmKFParticleInterface::CombineTrackPart(vector<CbmKFTrack>& vTracks,
2012 const vector<L1FieldRegion>& vField,
2013 vector<CbmKFParticle>& Particles,
2014 CbmKFParticle& part,
2015 const int DaughterPDG,
2016 const int MotherPDG,
2017 vector<short>& id,
2018 const float* cuts,
2019 const unsigned short startIndex,
2020 const bool IsSamePart)
2021{
2022 CbmKFParticle_simd vDaughters[2] = {CbmKFParticle_simd(part), CbmKFParticle_simd()};
2023
2025
2026 fvec vtxGuess[3] = {part.GetX(), part.GetY(), part.GetZ()};
2027 fvec errGuess[3] = {fvec(10.f * sqrt(part.GetCovMatrix()[0])), fvec(10.f * sqrt(part.GetCovMatrix()[2])),
2028 fvec(10.f * sqrt(part.GetCovMatrix()[5]))};
2029
2030 const unsigned short NTr = id.size();
2031 for (unsigned short iTr = startIndex; iTr < NTr; iTr += fvecLen) {
2032 const unsigned short NTracks = (iTr + fvecLen < NTr) ? fvecLen : (NTr - iTr);
2033
2034 L1FieldRegion trField;
2035 for (unsigned short iv = 0; iv < NTracks; iv++) {
2036 vTr[iv] = &vTracks[id[iTr + iv]];
2037
2038 int entrSIMDPos = id[iTr + iv] % fvecLen;
2039 int entrVecPos = id[iTr + iv] / fvecLen;
2040 trField.SetOneEntry(iv, vField[entrVecPos], entrSIMDPos);
2041 }
2042
2043 vDaughters[1].Create(vTr, NTracks, 0, &DaughterPDG);
2044 vDaughters[1].SetField(trField);
2045 fvec trId;
2046 for (int iv = 0; iv < NTracks; iv++)
2047 trId[iv] = id[iTr + iv];
2048 vDaughters[1].SetId(trId);
2049
2051 mother.SetPDG(MotherPDG);
2052 if (IsSamePart) {
2053 mother.SetVtxGuess(vtxGuess[0], vtxGuess[1], vtxGuess[2]);
2054 mother.SetVtxErrGuess(errGuess[0], errGuess[1], errGuess[2]);
2055 }
2056 mother.Construct(vDaughters, 2, 0);
2057
2058 for (int iv = 0; iv < NTracks; iv++) {
2059 if (!finite(mother.GetChi2()[iv]))
2060 continue;
2061 if (!(mother.GetChi2()[iv] > 0.0f))
2062 continue;
2063 if (!(mother.GetChi2()[iv] == mother.GetChi2()[iv]))
2064 continue;
2065
2066 if (mother.GetChi2()[iv] / mother.GetNDF()[iv] > cuts[1])
2067 continue;
2068
2069 bool isSameTrack = 0;
2070 for (unsigned short iD = 0; iD < part.DaughterIds().size(); iD++)
2071 if (part.DaughterIds()[iD] == id[iTr + iv])
2072 isSameTrack = 1;
2073 if (isSameTrack)
2074 continue;
2075
2076 CbmKFParticle mother_temp;
2077 mother.GetKFParticle(mother_temp, iv);
2078 mother_temp.CleanDaughtersId();
2079 mother_temp.AddDaughter(id[iTr + iv]);
2080 for (unsigned short iD = 0; iD < part.DaughterIds().size(); iD++)
2081 mother_temp.AddDaughter(part.DaughterIds()[iD]);
2082 Particles.push_back(mother_temp);
2083 }
2084 }
2085}
2086
2087void CbmKFParticleInterface::SelectParticleCandidates(vector<CbmKFParticle>& Particles,
2088 vector<CbmKFParticle>& vCandidates,
2089 CbmKFVertex& PrimVtx,
2090 const float cuts[5])
2091{
2092 CbmKFParticle* cand[fvecLen];
2093 int nCand = vCandidates.size();
2094
2095 for (unsigned short iC = 0; iC < nCand; iC += fvecLen) {
2096 unsigned int nEntries = (iC + fvecLen < nCand) ? fvecLen : (nCand - iC);
2097
2098 for (unsigned short iv = 0; iv < nEntries; iv++)
2099 cand[iv] = &vCandidates[iC + iv];
2100
2101 CbmKFParticleInterface candTopo(cand, nEntries);
2102
2103 candTopo.MeasureProductionVertex(&candTopo.KFPart, candTopo.GetParameters(), &PrimVtx);
2104
2105 for (unsigned int iv = 0; iv < nEntries; iv++) {
2106 if (!finite(candTopo.GetChi2()[iv]))
2107 continue;
2108 if (!(candTopo.GetChi2()[iv] > 0.0f))
2109 continue;
2110 if (!(candTopo.GetChi2()[iv] == candTopo.GetChi2()[iv]))
2111 continue;
2112 if (candTopo.GetZ()[iv] < cuts[2])
2113 continue;
2114
2115 if (candTopo.GetChi2()[iv] / candTopo.GetNDF()[iv] > cuts[4])
2116 continue;
2117
2118 Particles.push_back(vCandidates[iC + iv]);
2119 }
2120 }
2121}
2122
2123// template<class T>
2124void CbmKFParticleInterface::ConstructPVT(vector<CbmKFTrack>& vRTracks) {}
2125
2126// void CbmKFParticleInterface::ConstructPV(vector<CbmL1Track>& vRTracks)
2127// {
2128// ConstructPVT(vRTracks);
2129// }
2130//
2131// void CbmKFParticleInterface::ConstructPV(vector<CbmStsTrack>& vRTracks)
2132// {
2133// ConstructPVT(vRTracks);
2134// }
2135
2136#undef cnst
#define cnst
friend F32vec4 fabs(const F32vec4 &a)
Definition P4_F32vec4.h:52
const int fvecLen
Definition P4_F32vec4.h:233
int i
Definition P4_F32vec4.h:22
__m128 m
Definition P4_F32vec4.h:27
friend F32vec4 rcp(const F32vec4 &a)
Definition P4_F32vec4.h:45
F32vec4 fvec
Definition P4_F32vec4.h:231
int Int_t
double Double_t
void Error(const char *location, const char *msgfmt,...)
void multQSQt(const fvec Q[], fvec S[])
void MeasureMass(CbmKFParticle_simd *Particle, fvec r0[], fvec Mass)
void GetKFVertex(CbmKFVertex *vtx)
static void Find2DaughterDecay(vector< CbmKFTrack > &vTracks, const vector< L1FieldRegion > &vField, vector< CbmKFParticle > &Particles, const int DaughterNegPDG, const int DaughterPosPDG, const int MotherPDG, vector< short > &idNeg, vector< short > &idPos, CbmKFVertex &PrimVtx, const float *cuts=0, bool isPrimary=0, vector< float > *vMotherTopoChi2Ndf=0, const float *secCuts=0, const float massMotherPDG=0, const float massMotherPDGSigma=0, vector< CbmKFParticle > *vMotherPrim=0, vector< CbmKFParticle > *vMotherSec=0)
static void FindParticles(vector< CbmKFTrack > &vRTracks, vector< float > &ChiToPrimVtx, vector< L1FieldRegion > &vField, vector< CbmKFParticle > &Particles, CbmKFVertex &PrimVtx, const vector< int > &vTrackPDG, const float cuts[2][3]=DefaultCuts)
Find particles with 2-body decay channel from input tracks vRTracks with primary vertex PrimVtx:
void Construct(CbmKFTrackInterface *vDaughters[][fvecLen], int NDaughters, CbmKFVertexInterface *Parent=0, float Mass=-1, float CutChi2=-1)
static fvec GetChi2BetweenParticles(CbmKFParticle_simd &p1, CbmKFParticle_simd &p2)
fvec & Cij(Int_t i, Int_t j)
void SetVtxErrGuess(fvec &d_x, fvec &d_y, fvec &d_z)
void GetMomentum(fvec &P, fvec &Error)
static void SelectParticleCandidates(vector< CbmKFParticle > &Particles, vector< CbmKFParticle > &vCandidates, CbmKFVertex &PrimVtx, const float cuts[5])
static void FindTrackV0Decay(const int MotherPDG, vector< CbmKFParticle > &Particles, vector< CbmKFParticle > &vV0, vector< CbmKFTrack > &vTracks, const vector< L1FieldRegion > &field, const int DaughterPDG, vector< short > &idTrack, CbmKFVertex &PrimVtx, const float *cuts=0, bool isPrimary=0, vector< float > *ChiToPrimVtx=0, vector< CbmKFParticle > *vHyperonPrim=0, float hyperonPrimMass=0, float hyperonPrimMassErr=0, vector< CbmKFParticle > *vHyperonSec=0)
void GetKFParticle(CbmKFParticle &Part, int iPart=0)
void multQSQt1(const fvec J[11], fvec S[])
static void FindHyperons(int PDG, CbmKFParticle_simd vDaughters[2], vector< int > &daughterIds, vector< CbmKFParticle > &vLambdaSec, vector< CbmKFParticle > &vHyperon, CbmKFVertex &PrimVtx, const float *cuts=0, int startIndex=0)
CbmKFParticleInterface operator=(const CbmKFParticleInterface &c)
void GetMass(fvec &M, fvec &Error)
void ExtrapolateLine(CbmKFParticle_simd *Particle, fvec r0[], fvec T)
static Int_t IJ(Int_t i, Int_t j)
static const float DefaultCuts[2][3]
static void ExtrapolateToPV(vector< CbmKFParticle > &vParticles, CbmKFVertex &PrimVtx)
static void CombineTrackPart(vector< CbmKFTrack > &vTracks, const vector< L1FieldRegion > &vField, vector< CbmKFParticle > &Particles, CbmKFParticle &part, const int DaughterPDG, const int MotherPDG, vector< short > &id, const float *cuts, const unsigned short startIndex=0, const bool IsSamePart=0)
void Convert(CbmKFParticle_simd *Particle, fvec r0[], bool ToProduction)
void ConstructPVT(vector< CbmKFTrack > &vRTracks)
void MeasureProductionVertex(CbmKFParticle_simd *Particle, fvec r0[], CbmKFVertexInterface *Parent)
void SetVtxGuess(fvec &x, fvec &y, fvec &z)
fvec GetDStoPoint(const CbmKFParticle_simd &Particle, const fvec xyz[]) const
static void FindDMesLambdac(vector< CbmKFTrack > &vTracks, const vector< L1FieldRegion > &vField, vector< CbmKFParticle > &Particles, const int DaughterPDG[5], const int MotherPDG[8], vector< short > *idTrack[5], CbmKFVertex &PrimVtx, const float cuts[8][8], vector< float > ChiToPrimVtx)
void Extrapolate(CbmKFParticle_simd *Particle, fvec r0[], fvec T)
void Create(CbmKFTrackInterface *Track[], int Ntracks=fvecLen, Int_t *qHypo=0, const Int_t *pdg=0)
void AddDaughterId(fvec id)
fvec GetCovariance(Int_t i) const
void SetNDaughters(int n)
void GetMass(Double_t &M, Double_t &Error)
Double_t * GetParameters()
void SetId(int id)
void CleanDaughtersId()
Double_t GetY() const
Double_t GetZ() const
void SetPDG(int pdg)
Double_t GetX() const
const vector< int > & DaughterIds() const
float fieldRegion[10]
Bool_t AtProductionVertex
void AddDaughter(int id)
Double_t * GetCovMatrix()
Double_t * GetTrack()
Is it electron.
Definition CbmKFTrack.h:74
Double_t & GetRefChi2()
array[15] of covariance matrix
Definition CbmKFTrack.h:76
Int_t & GetRefNDF()
Chi^2 after fit.
Definition CbmKFTrack.h:77
Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
Definition CbmKFTrack.h:75
virtual Double_t & GetRefY()
virtual Double_t & GetRefX()
I/O parameters for vertex fit routines.
virtual Double_t & GetRefZ()
virtual Double_t * GetCovMatrix()
Double_t & GetRefZ()
Definition CbmKFVertex.h:39
Double_t & GetRefX()
I/O parameters for vertex fit routines.
Definition CbmKFVertex.h:37
Double_t * GetCovMatrix()
Definition CbmKFVertex.h:40
Double_t & GetRefChi2()
Array[6] of covariance matrix.
Definition CbmKFVertex.h:41
Double_t & GetRefY()
Definition CbmKFVertex.h:38
Int_t & GetRefNDF()
Chi^2 after fit.
Definition CbmKFVertex.h:42
void SetOneEntry(const int i0, const L1FieldRegion &f1, const int i1)
Definition L1Field.h:193
L1FieldValue Get(const fvec z)
Definition L1Field.h:120
RVec< PromoteType< T > > abs(const RVec< T > &v)
RVec< PromoteType< T > > sqrt(const RVec< T > &v)
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:20362
RooArgSet S(Args_t &&... args)
*brief create JSON pointer *sa reference_tokens const std::string const std::string & b
Definition json.hpp:11787