BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
KFParticleBaseSIMD.cxx
Go to the documentation of this file.
1//---------------------------------------------------------------------------------
2// Implementation of the KFParticleBaseSIMD class
3// .
4// @author S.Gorbunov, I.Kisel, I.Kulakov, M.Zyzak
5// @version 1.0
6// @since 13.05.07
7//
8// Class to reconstruct and store the decayed particle parameters.
9// The method is described in CBM-SOFT note 2007-003,
10// ``Reconstruction of decayed particles based on the Kalman filter'',
11// http://www.gsi.de/documents/DOC-2007-May-14-1.pdf
12//
13// This class describes general mathematics which is used by KFParticle class
14//
15// -= Copyright &copy ALICE HLT and CBM L1 Groups =-
16//_________________________________________________________________________________
17
18#include "KFParticleBaseSIMD.h"
19
20#include <iostream>
21
22static const fvec Zero = 0;
23static const fvec One = 1;
24static const fvec small = 1.e-20;
25
27 : fQ(0)
28 , fNDF(-3)
29 , fChi2(0)
30 , fSFromDecay(0)
32 , fIsVtxGuess(0)
34 , fIsLinearized(0)
37 , fMassHypo(-1)
38 , fId(-1)
39 , fDaughterIds()
40 , fPDG(0)
41{
42 //* Constructor
43
44 Initialize();
45}
46
47void KFParticleBaseSIMD::Initialize(const fvec Param[], const fvec Cov[], Int_t Charge, fvec Mass)
48{
49 // Constructor from "cartesian" track, particle mass hypothesis should be provided
50 //
51 // Param[6] = { X, Y, Z, Px, Py, Pz } - position and momentum
52 // Cov [21] = lower-triangular part of the covariance matrix:
53 //
54 // ( 0 . . . . . )
55 // ( 1 2 . . . . )
56 // Cov. matrix = ( 3 4 5 . . . ) - numbering of covariance elements in Cov[]
57 // ( 6 7 8 9 . . )
58 // ( 10 11 12 13 14 . )
59 // ( 15 16 17 18 19 20 )
60
61 for (Int_t i = 0; i < 6; i++)
62 fP[i] = Param[i];
63 for (Int_t i = 0; i < 21; i++)
64 fC[i] = Cov[i];
65
66 fvec energy = sqrt(Mass * Mass + fP[3] * fP[3] + fP[4] * fP[4] + fP[5] * fP[5]);
67 fP[6] = energy;
68 fP[7] = 0;
69 fQ = Charge;
70 fNDF = 0;
71 fChi2 = 0;
73 fIsLinearized = 0;
74 fSFromDecay = 0;
75
76 fvec energyInv = 1. / energy;
77 fvec h0 = fP[3] * energyInv, h1 = fP[4] * energyInv, h2 = fP[5] * energyInv;
78
79 fC[21] = h0 * fC[6] + h1 * fC[10] + h2 * fC[15];
80 fC[22] = h0 * fC[7] + h1 * fC[11] + h2 * fC[16];
81 fC[23] = h0 * fC[8] + h1 * fC[12] + h2 * fC[17];
82 fC[24] = h0 * fC[9] + h1 * fC[13] + h2 * fC[18];
83 fC[25] = h0 * fC[13] + h1 * fC[14] + h2 * fC[19];
84 fC[26] = h0 * fC[18] + h1 * fC[19] + h2 * fC[20];
85 fC[27] = (h0 * h0 * fC[9] + h1 * h1 * fC[14] + h2 * h2 * fC[20]
86 + 2 * (h0 * h1 * fC[13] + h0 * h2 * fC[18] + h1 * h2 * fC[19]));
87 for (Int_t i = 28; i < 36; i++)
88 fC[i] = 0;
89 fC[35] = 1.;
90
91 SumDaughterMass = Mass;
92 fMassHypo = Mass;
93}
94
96{
97 //* Initialise covariance matrix and set current parameters to 0.0
98
99 for (Int_t i = 0; i < 8; i++)
100 fP[i] = 0;
101 for (Int_t i = 0; i < 36; ++i)
102 fC[i] = 0.;
103 fC[0] = fC[2] = fC[5] = 100.;
104 fC[35] = 1.;
105 fNDF = -3;
106 fChi2 = 0.;
107 fQ = 0;
108 fSFromDecay = 0;
110 fVtxGuess[0] = fVtxGuess[1] = fVtxGuess[2] = 0.;
111 fVtxErrGuess[0] = fVtxErrGuess[1] = fVtxErrGuess[2] = 0.;
112 fIsVtxGuess = 0;
113 fIsVtxGuess = 0;
114 fIsLinearized = 0;
115 SumDaughterMass = 0;
116 fMassHypo = -1;
117}
118
120{
121 //* Set decay vertex parameters for linearisation
122
123 fVtxGuess[0] = x;
124 fVtxGuess[1] = y;
125 fVtxGuess[2] = z;
126 fIsLinearized = 1;
127}
128
130{
131 //* Set errors of the decay vertex parameters for linearisation
132
133 fVtxErrGuess[0] = dx;
134 fVtxErrGuess[1] = dy;
135 fVtxErrGuess[2] = dz;
136 fIsVtxErrGuess = 1;
137}
138
140{
141 //* Calculate particle momentum
142
143 fvec ret = Zero;
144
145 fvec x = fP[3];
146 fvec y = fP[4];
147 fvec z = fP[5];
148 fvec x2 = x * x;
149 fvec y2 = y * y;
150 fvec z2 = z * z;
151 fvec p2 = x2 + y2 + z2;
152 p = sqrt(p2);
153 error = (x2 * fC[9] + y2 * fC[14] + z2 * fC[20] + 2 * (x * y * fC[13] + x * z * fC[18] + y * z * fC[19]));
154 const fvec LocalSmall = 1.e-4;
155 fvec mask = fvec(fvec(Zero < error) & fvec(LocalSmall < fabs(p)));
156 error = (mask & error);
157 error = sqrt(error);
158 ret = (!mask);
159 return ret;
160}
161
163{
164 //* Calculate particle transverse momentum
165
166 fvec ret = Zero;
167
168 fvec px = fP[3];
169 fvec py = fP[4];
170 fvec px2 = px * px;
171 fvec py2 = py * py;
172 fvec pt2 = px2 + py2;
173 pt = sqrt(pt2);
174 error = (px2 * fC[9] + py2 * fC[14] + 2 * px * py * fC[13]);
175 const fvec LocalSmall = 1.e-8;
176 fvec mask = fvec(fvec(Zero < error) & fvec(LocalSmall < fabs(pt)));
177 error = (mask & error);
178 error = sqrt(error);
179 error = error / pt;
180 error += ((!mask) & fvec(1.e10));
181 ret = (!mask);
182 return ret;
183}
184
186{
187 //* Calculate particle pseudorapidity
188
189 fvec ret = Zero;
190
191 const fvec BIG = 1.e10;
192 const fvec LocalSmall = 1.e-8;
193
194 fvec px = fP[3];
195 fvec py = fP[4];
196 fvec pz = fP[5];
197 fvec pt2 = px * px + py * py;
198 fvec p2 = pt2 + pz * pz;
199 fvec p = sqrt(p2);
200 fvec a = p + pz;
201 fvec b = p - pz;
202 eta = BIG;
203 fvec c = Zero;
204 c = fvec(b > LocalSmall) & (a / b);
205 fvec logc = 0.5 * log(c);
206 eta = if3(fvec(LocalSmall < fabs(c)), logc, eta);
207
208 fvec h3 = -px * pz;
209 fvec h4 = -py * pz;
210 fvec pt4 = pt2 * pt2;
211 fvec p2pt4 = p2 * pt4;
212 error = (h3 * h3 * fC[9] + h4 * h4 * fC[14] + pt4 * fC[20]
213 + 2 * (h3 * (h4 * fC[13] + fC[18] * pt2) + pt2 * h4 * fC[19]));
214
215 fvec mask = fvec(fvec(LocalSmall < fabs(p2pt4)) & fvec(Zero < error));
216 error = if3(mask, (sqrt(error / p2pt4)), BIG);
217
218 ret = (!mask);
219
220 return ret;
221}
222
224{
225 //* Calculate particle polar angle
226
227 fvec ret = Zero;
228
229 fvec px = fP[3];
230 fvec py = fP[4];
231 fvec px2 = px * px;
232 fvec py2 = py * py;
233 fvec pt2 = px2 + py2;
234 phi = atan2(py, px);
235 error = (py2 * fC[9] + px2 * fC[14] - fvec(2.f) * px * py * fC[13]);
236
237 fvec mask = fvec(fvec(Zero < error) & fvec(fvec(1.e-4) < pt2));
238 error = if3(mask, sqrt(error) / pt2, fvec(1.e10));
239 ret = !mask;
240 return ret;
241}
242
244{
245 //* Calculate distance to the origin
246
247 fvec ret = Zero;
248
249 fvec x = fP[0];
250 fvec y = fP[1];
251 fvec x2 = x * x;
252 fvec y2 = y * y;
253 r = sqrt(x2 + y2);
254 error = (x2 * fC[0] + y2 * fC[2] - fvec(2.f) * x * y * fC[1]);
255
256 fvec mask = fvec(fvec(Zero < error) & fvec(fvec(1.e-4) < r));
257 error = if3(mask, sqrt(error) / r, fvec(1.e10));
258 ret = !mask;
259 return ret;
260}
261
263{
264 //* Calculate particle mass
265
266 // s = sigma^2 of m2/2
267
268 const fvec BIG = 1.e20;
269 const fvec LocalSmall = 1.e-10;
270
271 fvec ret = Zero;
272
273 fvec s = (fP[3] * fP[3] * fC[9] + fP[4] * fP[4] * fC[14] + fP[5] * fP[5] * fC[20] + fP[6] * fP[6] * fC[27]
274 + fvec(2.f)
275 * (+fP[3] * fP[4] * fC[13] + fP[5] * (fP[3] * fC[18] + fP[4] * fC[19])
276 - fP[6] * (fP[3] * fC[24] + fP[4] * fC[25] + fP[5] * fC[26])));
277 // fvec m2 = fabs(fP[6]*fP[6] - fP[3]*fP[3] - fP[4]*fP[4] - fP[5]*fP[5]);
278 // m = sqrt(m2);
279 // if( m>1.e-10 ){
280 // if( s>=0 ){
281 // error = sqrt(s)/m;
282 // return 0;
283 // }
284 // }
285 // error = 1.e20;
286 fvec m2 = (fP[6] * fP[6] - fP[3] * fP[3] - fP[4] * fP[4] - fP[5] * fP[5]);
287
288 fvec mask = fvec(Zero <= m2);
289 m = if3(mask, sqrt(m2), -sqrt(-m2));
290
291 mask = fvec(mask & fvec(fvec(Zero <= s) & (LocalSmall < m)));
292 error = if3(mask, sqrt(s) / m, BIG);
293
294 ret = !mask;
295 return ret;
296}
297
299{
300 //* Calculate particle decay length [cm]
301
302 fvec ret = Zero;
303 const fvec BIG = 1.e20;
304
305 fvec x = fP[3];
306 fvec y = fP[4];
307 fvec z = fP[5];
308 fvec t = fP[7];
309 fvec x2 = x * x;
310 fvec y2 = y * y;
311 fvec z2 = z * z;
312 fvec p2 = x2 + y2 + z2;
313 l = t * sqrt(p2);
314
315 error = p2 * fC[35]
316 + t * t / p2
317 * (x2 * fC[9] + y2 * fC[14] + z2 * fC[20]
318 + fvec(2.f) * (x * y * fC[13] + x * z * fC[18] + y * z * fC[19]))
319 + fvec(2.f) * t * (x * fC[31] + y * fC[32] + z * fC[33]);
320
321 fvec mask = fvec(fvec(1.e-4) < p2);
322 error = if3(mask, sqrt(fabs(error)), BIG);
323 ret = !mask;
324 return ret;
325}
326
328{
329 //* Calculate particle decay length in XY projection [cm]
330
331 const fvec BIG = 1.e20;
332 fvec ret = Zero;
333
334 fvec x = fP[3];
335 fvec y = fP[4];
336 fvec t = fP[7];
337 fvec x2 = x * x;
338 fvec y2 = y * y;
339 fvec pt2 = x2 + y2;
340 l = t * sqrt(pt2);
341
342 error = pt2 * fC[35] + t * t / pt2 * (x2 * fC[9] + y2 * fC[14] + 2 * x * y * fC[13])
343 + fvec(2.f) * t * (x * fC[31] + y * fC[32]);
344 fvec mask = fvec(fvec(1.e-4) < pt2);
345 error = if3(mask, sqrt(fabs(error)), BIG);
346 ret = !mask;
347 return ret;
348}
349
351{
352 //* Calculate particle decay time [s]
353
354 const fvec BIG = 1.e20;
355 fvec ret = Zero;
356
357 fvec m, dm;
358 GetMass(m, dm);
359 fvec cTM = (-fP[3] * fC[31] - fP[4] * fC[32] - fP[5] * fC[33] + fP[6] * fC[34]);
360 tauC = fP[7] * m;
361 error = m * m * fC[35] + 2 * fP[7] * cTM + fP[7] * fP[7] * dm * dm;
362 fvec mask = fvec(Zero < error);
363 error = if3(mask, sqrt(error), BIG);
364 ret = !mask;
365 return ret;
366}
367
369{
370 //* Add daughter via operator+=
371
372 AddDaughter(Daughter);
373}
374
375fvec KFParticleBaseSIMD::GetSCorrection(const fvec Part[], const fvec XYZ[]) const
376{
377 //* Get big enough correction for S error to let the particle Part be fitted to XYZ point
378
379 fvec d[3] = {XYZ[0] - Part[0], XYZ[1] - Part[1], XYZ[2] - Part[2]};
380 fvec p2 = Part[3] * Part[3] + Part[4] * Part[4] + Part[5] * Part[5];
381 // fvec sigmaS = if3( fvec(fvec(1.e-4)<p2) , ( fvec(10.1)+fvec(3.)*sqrt( d[0]*d[0]+d[1]*d[1]+d[2]*d[2]) )/sqrt(p2)
382 // , One); fvec sigmaS = if3( fvec(fvec(1.e-4)<p2) , ( fvec(0.1)+fvec(10.)*sqrt( d[0]*d[0]+d[1]*d[1]+d[2]*d[2])
383 // )/sqrt(p2) , One);
384
385 fvec sigmaS =
386 if3(fvec(fvec(1.e-4) < p2), fvec(0.1) + fvec(10.) * sqrt((d[0] * d[0] + d[1] * d[1] + d[2] * d[2]) / p2), One);
387 // fvec sigmaS = GetDStoPoint(XYZ)*0.08;
388
389 return sigmaS;
390}
391
392void KFParticleBaseSIMD::GetMeasurement(const fvec XYZ[], fvec m[], fvec V[], Bool_t isAtVtxGuess) const
393{
394 //* Get additional covariances V used during measurement
395
396 fvec b[3];
397 GetFieldValue(XYZ, b);
398 const fvec kCLight = 0.000299792458;
399 b[0] *= kCLight * GetQ();
400 b[1] *= kCLight * GetQ();
401 b[2] *= kCLight * GetQ();
402
403 if (!isAtVtxGuess)
404 Transport(GetDStoPoint(XYZ), m, V);
405 else {
406 for (int iM = 0; iM < 8; iM++)
407 m[iM] = fP[iM];
408 for (int iV = 0; iV < 8; iV++)
409 V[iV] = fC[iV];
410 }
411
412 fvec sigmaS = GetSCorrection(m, XYZ);
413
414 fvec h[6];
415
416 h[0] = m[3] * sigmaS;
417 h[1] = m[4] * sigmaS;
418 h[2] = m[5] * sigmaS;
419 h[3] = (h[1] * b[2] - h[2] * b[1]);
420 h[4] = (h[2] * b[0] - h[0] * b[2]);
421 h[5] = (h[0] * b[1] - h[1] * b[0]);
422
423 V[0] += h[0] * h[0];
424 V[1] += h[1] * h[0];
425 V[2] += h[1] * h[1];
426 V[3] += h[2] * h[0];
427 V[4] += h[2] * h[1];
428 V[5] += h[2] * h[2];
429
430 V[6] += h[3] * h[0];
431 V[7] += h[3] * h[1];
432 V[8] += h[3] * h[2];
433 V[9] += h[3] * h[3];
434
435 V[10] += h[4] * h[0];
436 V[11] += h[4] * h[1];
437 V[12] += h[4] * h[2];
438 V[13] += h[4] * h[3];
439 V[14] += h[4] * h[4];
440
441 V[15] += h[5] * h[0];
442 V[16] += h[5] * h[1];
443 V[17] += h[5] * h[2];
444 V[18] += h[5] * h[3];
445 V[19] += h[5] * h[4];
446 V[20] += h[5] * h[5];
447}
448
450{
451 AddDaughterId(Daughter.Id());
452
453 if (fNDF[0] < -1) { // first daughter -> just copy
454 fNDF = -1;
455 fQ = Daughter.GetQ();
456 if (Daughter.fC[35][0] > 0) { // TODO Check this: only the first daughter is used here!
457 Daughter.GetMeasurement(fVtxGuess, fP, fC, isAtVtxGuess);
458 } else {
459 for (Int_t i = 0; i < 8; i++)
460 fP[i] = Daughter.fP[i];
461 for (Int_t i = 0; i < 36; i++)
462 fC[i] = Daughter.fC[i];
463 }
464 fSFromDecay = 0;
465 fMassHypo = Daughter.fMassHypo;
467 return;
468 }
469
470 if (fConstructMethod == 0)
471 AddDaughterWithEnergyFit(Daughter, isAtVtxGuess);
472 else if (fConstructMethod == 1)
473 AddDaughterWithEnergyCalc(Daughter, isAtVtxGuess);
474 else if (fConstructMethod == 2)
475 AddDaughterWithEnergyFitMC(Daughter, isAtVtxGuess);
476
478 fMassHypo = -1;
479}
480
482{
483 //* Energy considered as an independent veriable, fitted independently from momentum, without any constraints on
484 // mass
485
486 //* Add daughter
487
488 // if(!isAtVtxGuess)
489 // TransportToDecayVertex();
490
491 Int_t maxIter = 1;
492
493 if ((!fIsLinearized) && (!isAtVtxGuess)) {
494 if (fNDF[0] == -1) {
495 fvec ds, ds1;
496 GetDStoParticle(Daughter, ds, ds1);
497 TransportToDS(ds);
498 fvec m[8];
499 fvec mCd[36];
500 Daughter.Transport(ds1, m, mCd);
501 fVtxGuess[0] = .5 * (fP[0] + m[0]);
502 fVtxGuess[1] = .5 * (fP[1] + m[1]);
503 fVtxGuess[2] = .5 * (fP[2] + m[2]);
504 } else {
505 fVtxGuess[0] = fP[0];
506 fVtxGuess[1] = fP[1];
507 fVtxGuess[2] = fP[2];
508 }
509 maxIter = 3;
510 }
511
512 for (Int_t iter = 0; iter < maxIter; iter++) {
513
514 fvec *ffP = fP, *ffC = fC;
515
516 fvec m[8], mV[36];
517
518 if (Daughter.fC[35][0] > 0) { // TODO Check this: only the first daughter is used here!
519 Daughter.GetMeasurement(fVtxGuess, m, mV, isAtVtxGuess);
520 } else {
521 for (Int_t i = 0; i < 8; i++)
522 m[i] = Daughter.fP[i];
523 for (Int_t i = 0; i < 36; i++)
524 mV[i] = Daughter.fC[i];
525 }
526 //*
527
528 fvec mS[6] = {ffC[0] + mV[0], ffC[1] + mV[1], ffC[2] + mV[2], ffC[3] + mV[3], ffC[4] + mV[4], ffC[5] + mV[5]};
530
531 //* Residual (measured - estimated)
532
533 fvec zeta[3] = {m[0] - ffP[0], m[1] - ffP[1], m[2] - ffP[2]};
534
535 //* CHt = CH' - D'
536
537 fvec mCHt0[7], mCHt1[7], mCHt2[7];
538
539 mCHt0[0] = ffC[0];
540 mCHt1[0] = ffC[1];
541 mCHt2[0] = ffC[3];
542 mCHt0[1] = ffC[1];
543 mCHt1[1] = ffC[2];
544 mCHt2[1] = ffC[4];
545 mCHt0[2] = ffC[3];
546 mCHt1[2] = ffC[4];
547 mCHt2[2] = ffC[5];
548 mCHt0[3] = ffC[6] - mV[6];
549 mCHt1[3] = ffC[7] - mV[7];
550 mCHt2[3] = ffC[8] - mV[8];
551 mCHt0[4] = ffC[10] - mV[10];
552 mCHt1[4] = ffC[11] - mV[11];
553 mCHt2[4] = ffC[12] - mV[12];
554 mCHt0[5] = ffC[15] - mV[15];
555 mCHt1[5] = ffC[16] - mV[16];
556 mCHt2[5] = ffC[17] - mV[17];
557 mCHt0[6] = ffC[21] - mV[21];
558 mCHt1[6] = ffC[22] - mV[22];
559 mCHt2[6] = ffC[23] - mV[23];
560
561 //* Kalman gain K = mCH'*S
562
563 fvec k0[7], k1[7], k2[7];
564
565 for (Int_t i = 0; i < 7; ++i) {
566 k0[i] = mCHt0[i] * mS[0] + mCHt1[i] * mS[1] + mCHt2[i] * mS[3];
567 k1[i] = mCHt0[i] * mS[1] + mCHt1[i] * mS[2] + mCHt2[i] * mS[4];
568 k2[i] = mCHt0[i] * mS[3] + mCHt1[i] * mS[4] + mCHt2[i] * mS[5];
569 }
570
571 //* New estimation of the vertex position
572
573 if (iter < maxIter - 1) {
574 for (Int_t i = 0; i < 3; ++i)
575 fVtxGuess[i] = ffP[i] + k0[i] * zeta[0] + k1[i] * zeta[1] + k2[i] * zeta[2];
576 continue;
577 }
578
579 // last itearation -> update the particle
580
581 //* Add the daughter momentum to the particle momentum
582
583 ffP[3] += m[3];
584 ffP[4] += m[4];
585 ffP[5] += m[5];
586 ffP[6] += m[6];
587
588 ffC[9] += mV[9];
589 ffC[13] += mV[13];
590 ffC[14] += mV[14];
591 ffC[18] += mV[18];
592 ffC[19] += mV[19];
593 ffC[20] += mV[20];
594 ffC[24] += mV[24];
595 ffC[25] += mV[25];
596 ffC[26] += mV[26];
597 ffC[27] += mV[27];
598
599 //* New estimation of the vertex position r += K*zeta
600
601 for (Int_t i = 0; i < 7; ++i)
602 fP[i] = ffP[i] + (k0[i] * zeta[0] + k1[i] * zeta[1] + k2[i] * zeta[2]);
603
604 //* New covariance matrix C -= K*(mCH')'
605
606 for (Int_t i = 0, k = 0; i < 7; ++i) {
607 for (Int_t j = 0; j <= i; ++j, ++k) {
608 fC[k] = ffC[k] - (k0[i] * mCHt0[j] + k1[i] * mCHt1[j] + k2[i] * mCHt2[j]);
609 }
610 }
611
612 //* Calculate Chi^2
613 if (iter == (maxIter - 1)) {
614 fNDF += 2;
615 fQ += Daughter.GetQ();
616 fSFromDecay = 0;
617 fChi2 += (mS[0] * zeta[0] + mS[1] * zeta[1] + mS[3] * zeta[2]) * zeta[0]
618 + (mS[1] * zeta[0] + mS[2] * zeta[1] + mS[4] * zeta[2]) * zeta[1]
619 + (mS[3] * zeta[0] + mS[4] * zeta[1] + mS[5] * zeta[2]) * zeta[2];
620 }
621 }
622}
623
625{
626 //* Energy considered as a dependent variable, calculated from the momentum and mass hypothesis
627
628 //* Add daughter
629
630 // if(!isAtVtxGuess)
631 // TransportToDecayVertex();
632
633 Int_t maxIter = 1;
634
635 if ((!fIsLinearized) && (!isAtVtxGuess)) {
636 if (fNDF[0] == -1) {
637 fvec ds, ds1;
638 GetDStoParticle(Daughter, ds, ds1);
639 TransportToDS(ds);
640 fvec m[8];
641 fvec mCd[36];
642 Daughter.Transport(ds1, m, mCd);
643 fVtxGuess[0] = .5 * (fP[0] + m[0]);
644 fVtxGuess[1] = .5 * (fP[1] + m[1]);
645 fVtxGuess[2] = .5 * (fP[2] + m[2]);
646 } else {
647 fVtxGuess[0] = fP[0];
648 fVtxGuess[1] = fP[1];
649 fVtxGuess[2] = fP[2];
650 }
651 maxIter = 3;
652 }
653
654 for (Int_t iter = 0; iter < maxIter; iter++) {
655
656 fvec *ffP = fP, *ffC = fC;
657
658 fvec m[8], mV[36];
659
660 if (Daughter.fC[35][0] > 0) { // TODO Check this: only the first daughter is used here!
661 Daughter.GetMeasurement(fVtxGuess, m, mV, isAtVtxGuess);
662 } else {
663 for (Int_t i = 0; i < 8; i++)
664 m[i] = Daughter.fP[i];
665 for (Int_t i = 0; i < 36; i++)
666 mV[i] = Daughter.fC[i];
667 }
668
669 fvec massMf2 = m[6] * m[6] - (m[3] * m[3] + m[4] * m[4] + m[5] * m[5]);
670 fvec massRf2 = fP[6] * fP[6] - (fP[3] * fP[3] + fP[4] * fP[4] + fP[5] * fP[5]);
671
672 //*
673
674 fvec mS[6] = {ffC[0] + mV[0], ffC[1] + mV[1], ffC[2] + mV[2], ffC[3] + mV[3], ffC[4] + mV[4], ffC[5] + mV[5]};
676
677 //* Residual (measured - estimated)
678
679 fvec zeta[3] = {m[0] - ffP[0], m[1] - ffP[1], m[2] - ffP[2]};
680
681 //* CHt = CH' - D'
682
683 fvec mCHt0[6], mCHt1[6], mCHt2[6];
684
685 mCHt0[0] = ffC[0];
686 mCHt1[0] = ffC[1];
687 mCHt2[0] = ffC[3];
688 mCHt0[1] = ffC[1];
689 mCHt1[1] = ffC[2];
690 mCHt2[1] = ffC[4];
691 mCHt0[2] = ffC[3];
692 mCHt1[2] = ffC[4];
693 mCHt2[2] = ffC[5];
694 mCHt0[3] = ffC[6] - mV[6];
695 mCHt1[3] = ffC[7] - mV[7];
696 mCHt2[3] = ffC[8] - mV[8];
697 mCHt0[4] = ffC[10] - mV[10];
698 mCHt1[4] = ffC[11] - mV[11];
699 mCHt2[4] = ffC[12] - mV[12];
700 mCHt0[5] = ffC[15] - mV[15];
701 mCHt1[5] = ffC[16] - mV[16];
702 mCHt2[5] = ffC[17] - mV[17];
703
704 //* Kalman gain K = mCH'*S
705
706 fvec k0[6], k1[6], k2[6];
707
708 for (Int_t i = 0; i < 6; ++i) {
709 k0[i] = mCHt0[i] * mS[0] + mCHt1[i] * mS[1] + mCHt2[i] * mS[3];
710 k1[i] = mCHt0[i] * mS[1] + mCHt1[i] * mS[2] + mCHt2[i] * mS[4];
711 k2[i] = mCHt0[i] * mS[3] + mCHt1[i] * mS[4] + mCHt2[i] * mS[5];
712 }
713
714 //* New estimation of the vertex position
715
716 if (iter < maxIter - 1) {
717 for (Int_t i = 0; i < 3; ++i)
718 fVtxGuess[i] = ffP[i] + k0[i] * zeta[0] + k1[i] * zeta[1] + k2[i] * zeta[2];
719 continue;
720 }
721
722 //* find mf and mVf - optimum value of the measurement and its covariance matrix
723 //* mVHt = V*H'
724 fvec mVHt0[6], mVHt1[6], mVHt2[6];
725
726 mVHt0[0] = mV[0];
727 mVHt1[0] = mV[1];
728 mVHt2[0] = mV[3];
729 mVHt0[1] = mV[1];
730 mVHt1[1] = mV[2];
731 mVHt2[1] = mV[4];
732 mVHt0[2] = mV[3];
733 mVHt1[2] = mV[4];
734 mVHt2[2] = mV[5];
735 mVHt0[3] = mV[6];
736 mVHt1[3] = mV[7];
737 mVHt2[3] = mV[8];
738 mVHt0[4] = mV[10];
739 mVHt1[4] = mV[11];
740 mVHt2[4] = mV[12];
741 mVHt0[5] = mV[15];
742 mVHt1[5] = mV[16];
743 mVHt2[5] = mV[17];
744
745 //* Kalman gain Km = mCH'*S
746
747 fvec km0[6], km1[6], km2[6];
748
749 for (Int_t i = 0; i < 6; ++i) {
750 km0[i] = mVHt0[i] * mS[0] + mVHt1[i] * mS[1] + mVHt2[i] * mS[3];
751 km1[i] = mVHt0[i] * mS[1] + mVHt1[i] * mS[2] + mVHt2[i] * mS[4];
752 km2[i] = mVHt0[i] * mS[3] + mVHt1[i] * mS[4] + mVHt2[i] * mS[5];
753 }
754
755 fvec mf[7] = {m[0], m[1], m[2], m[3], m[4], m[5], m[6]};
756
757 for (Int_t i = 0; i < 6; ++i)
758 mf[i] = mf[i] - km0[i] * zeta[0] - km1[i] * zeta[1] - km2[i] * zeta[2];
759
760 fvec energyMf = sqrt(massMf2 + (mf[3] * mf[3] + mf[4] * mf[4] + mf[5] * mf[5]));
761
762 fvec mVf[28];
763 for (Int_t iC = 0; iC < 28; iC++)
764 mVf[iC] = mV[iC];
765
766 //* hmf = d(energyMf)/d(mf)
767 fvec hmf[7];
768 hmf[3] = if3(fvec(fabs(energyMf) < small), Zero, hmf[3] / energyMf);
769 hmf[4] = if3(fvec(fabs(energyMf) < small), Zero, hmf[4] / energyMf);
770 hmf[5] = if3(fvec(fabs(energyMf) < small), Zero, hmf[5] / energyMf);
771 hmf[6] = 0;
772
773 for (Int_t i = 0, k = 0; i < 6; ++i) {
774 for (Int_t j = 0; j <= i; ++j, ++k) {
775 mVf[k] = mVf[k] - (km0[i] * mVHt0[j] + km1[i] * mVHt1[j] + km2[i] * mVHt2[j]);
776 }
777 }
778 fvec mVf24 = mVf[24], mVf25 = mVf[25], mVf26 = mVf[26];
779 mVf[21] = mVf[6] * hmf[3] + mVf[10] * hmf[4] + mVf[15] * hmf[5] + mVf[21] * hmf[6];
780 mVf[22] = mVf[7] * hmf[3] + mVf[11] * hmf[4] + mVf[16] * hmf[5] + mVf[22] * hmf[6];
781 mVf[23] = mVf[8] * hmf[3] + mVf[12] * hmf[4] + mVf[17] * hmf[5] + mVf[23] * hmf[6];
782 mVf[24] = mVf[9] * hmf[3] + mVf[13] * hmf[4] + mVf[18] * hmf[5] + mVf[24] * hmf[6];
783 mVf[25] = mVf[13] * hmf[3] + mVf[14] * hmf[4] + mVf[19] * hmf[5] + mVf[25] * hmf[6];
784 mVf[26] = mVf[18] * hmf[3] + mVf[19] * hmf[4] + mVf[20] * hmf[5] + mVf[26] * hmf[6];
785 mVf[27] = mVf[24] * hmf[3] + mVf[25] * hmf[4] + mVf[26] * hmf[5]
786 + (mVf24 * hmf[3] + mVf25 * hmf[4] + mVf26 * hmf[5] + mVf[27] * hmf[6])
787 * hmf[6]; // here mVf[] are already modified
788
789 mf[6] = energyMf;
790
791 //* find rf and mCf - optimum value of the measurement and its covariance matrix
792
793 //* mCCHt = C*H'
794 fvec mCCHt0[6], mCCHt1[6], mCCHt2[6];
795
796 mCCHt0[0] = ffC[0];
797 mCCHt1[0] = ffC[1];
798 mCCHt2[0] = ffC[3];
799 mCCHt0[1] = ffC[1];
800 mCCHt1[1] = ffC[2];
801 mCCHt2[1] = ffC[4];
802 mCCHt0[2] = ffC[3];
803 mCCHt1[2] = ffC[4];
804 mCCHt2[2] = ffC[5];
805 mCCHt0[3] = ffC[6];
806 mCCHt1[3] = ffC[7];
807 mCCHt2[3] = ffC[8];
808 mCCHt0[4] = ffC[10];
809 mCCHt1[4] = ffC[11];
810 mCCHt2[4] = ffC[12];
811 mCCHt0[5] = ffC[15];
812 mCCHt1[5] = ffC[16];
813 mCCHt2[5] = ffC[17];
814
815 //* Kalman gain Krf = mCH'*S
816
817 fvec krf0[6], krf1[6], krf2[6];
818
819 for (Int_t i = 0; i < 6; ++i) {
820 krf0[i] = mCCHt0[i] * mS[0] + mCCHt1[i] * mS[1] + mCCHt2[i] * mS[3];
821 krf1[i] = mCCHt0[i] * mS[1] + mCCHt1[i] * mS[2] + mCCHt2[i] * mS[4];
822 krf2[i] = mCCHt0[i] * mS[3] + mCCHt1[i] * mS[4] + mCCHt2[i] * mS[5];
823 }
824 fvec rf[7] = {ffP[0], ffP[1], ffP[2], ffP[3], ffP[4], ffP[5], ffP[6]};
825
826 for (Int_t i = 0; i < 6; ++i)
827 rf[i] = rf[i] + krf0[i] * zeta[0] + krf1[i] * zeta[1] + krf2[i] * zeta[2];
828
829 fvec energyRf = sqrt(massRf2 + (rf[3] * rf[3] + rf[4] * rf[4] + rf[5] * rf[5]));
830
831 fvec mCf[28];
832 for (Int_t iC = 0; iC < 28; iC++)
833 mCf[iC] = ffC[iC];
834 //* hrf = d(Erf)/d(rf)
835 fvec hrf[7];
836 hrf[3] = if3(fvec(fabs(energyRf) < small), Zero, rf[3] / energyRf);
837 hrf[4] = if3(fvec(fabs(energyRf) < small), Zero, rf[4] / energyRf);
838 hrf[5] = if3(fvec(fabs(energyRf) < small), Zero, rf[5] / energyRf);
839 // hrf[6] = if3( fvec(fabs(E_rf) < small), Zero, rf[6]/E_rf);
840 hrf[6] = 0;
841
842 for (Int_t i = 0, k = 0; i < 6; ++i) {
843 for (Int_t j = 0; j <= i; ++j, ++k) {
844 mCf[k] = mCf[k] - (krf0[i] * mCCHt0[j] + krf1[i] * mCCHt1[j] + krf2[i] * mCCHt2[j]);
845 }
846 }
847 fvec mCf24 = mCf[24], mCf25 = mCf[25], mCf26 = mCf[26];
848 mCf[21] = mCf[6] * hrf[3] + mCf[10] * hrf[4] + mCf[15] * hrf[5] + mCf[21] * hrf[6];
849 mCf[22] = mCf[7] * hrf[3] + mCf[11] * hrf[4] + mCf[16] * hrf[5] + mCf[22] * hrf[6];
850 mCf[23] = mCf[8] * hrf[3] + mCf[12] * hrf[4] + mCf[17] * hrf[5] + mCf[23] * hrf[6];
851 mCf[24] = mCf[9] * hrf[3] + mCf[13] * hrf[4] + mCf[18] * hrf[5] + mCf[24] * hrf[6];
852 mCf[25] = mCf[13] * hrf[3] + mCf[14] * hrf[4] + mCf[19] * hrf[5] + mCf[25] * hrf[6];
853 mCf[26] = mCf[18] * hrf[3] + mCf[19] * hrf[4] + mCf[20] * hrf[5] + mCf[26] * hrf[6];
854 mCf[27] = mCf[24] * hrf[3] + mCf[25] * hrf[4] + mCf[26] * hrf[5]
855 + (mCf24 * hrf[3] + mCf25 * hrf[4] + mCf26 * hrf[5] + mCf[27] * hrf[6])
856 * hrf[6]; // here mCf[] are already modified
857
858 for (Int_t iC = 21; iC < 28; iC++) {
859 ffC[iC] = mCf[iC];
860 mV[iC] = mVf[iC];
861 }
862
863 fP[6] = energyRf + energyMf;
864 rf[6] = energyRf;
865
866 // fvec Dvv[3][3]; do not need this
867 fvec mDvp[3][3];
868 fvec mDpv[3][3];
869 fvec mDpp[3][3];
870 fvec mDe[7];
871
872 for (int i = 0; i < 3; i++) {
873 for (int j = 0; j < 3; j++) {
874 mDvp[i][j] = km0[i + 3] * mCCHt0[j] + km1[i + 3] * mCCHt1[j] + km2[i + 3] * mCCHt2[j];
875 mDpv[i][j] = km0[i] * mCCHt0[j + 3] + km1[i] * mCCHt1[j + 3] + km2[i] * mCCHt2[j + 3];
876 mDpp[i][j] = km0[i + 3] * mCCHt0[j + 3] + km1[i + 3] * mCCHt1[j + 3] + km2[i + 3] * mCCHt2[j + 3];
877 }
878 }
879
880 mDe[0] = hmf[3] * mDvp[0][0] + hmf[4] * mDvp[1][0] + hmf[5] * mDvp[2][0];
881 mDe[1] = hmf[3] * mDvp[0][1] + hmf[4] * mDvp[1][1] + hmf[5] * mDvp[2][1];
882 mDe[2] = hmf[3] * mDvp[0][2] + hmf[4] * mDvp[1][2] + hmf[5] * mDvp[2][2];
883 mDe[3] = hmf[3] * mDpp[0][0] + hmf[4] * mDpp[1][0] + hmf[5] * mDpp[2][0];
884 mDe[4] = hmf[3] * mDpp[0][1] + hmf[4] * mDpp[1][1] + hmf[5] * mDpp[2][1];
885 mDe[5] = hmf[3] * mDpp[0][2] + hmf[4] * mDpp[1][2] + hmf[5] * mDpp[2][2];
886 mDe[6] = 2 * (mDe[3] * hrf[3] + mDe[4] * hrf[4] + mDe[5] * hrf[5]);
887
888 // last itearation -> update the particle
889
890 //* Add the daughter momentum to the particle momentum
891
892 ffP[3] += m[3];
893 ffP[4] += m[4];
894 ffP[5] += m[5];
895
896 ffC[9] += mV[9];
897 ffC[13] += mV[13];
898 ffC[14] += mV[14];
899 ffC[18] += mV[18];
900 ffC[19] += mV[19];
901 ffC[20] += mV[20];
902 ffC[24] += mV[24];
903 ffC[25] += mV[25];
904 ffC[26] += mV[26];
905 ffC[27] += mV[27];
906
907 ffC[21] += mDe[0];
908 ffC[22] += mDe[1];
909 ffC[23] += mDe[2];
910 ffC[24] += mDe[3];
911 ffC[25] += mDe[4];
912 ffC[26] += mDe[5];
913 ffC[27] += mDe[6];
914
915 //* New estimation of the vertex position r += K*zeta
916
917 for (Int_t i = 0; i < 6; ++i)
918 fP[i] = ffP[i] + k0[i] * zeta[0] + k1[i] * zeta[1] + k2[i] * zeta[2];
919
920 //* New covariance matrix C -= K*(mCH')'
921
922 for (Int_t i = 0, k = 0; i < 6; ++i) {
923 for (Int_t j = 0; j <= i; ++j, ++k) {
924 fC[k] = ffC[k] - (k0[i] * mCHt0[j] + k1[i] * mCHt1[j] + k2[i] * mCHt2[j]);
925 }
926 }
927
928 for (int i = 21; i < 28; i++)
929 fC[i] = ffC[i];
930
931 //* Calculate Chi^2
932
933 if (iter == (maxIter - 1)) {
934 fNDF += 2;
935 fQ += Daughter.GetQ();
936 fSFromDecay = 0;
937 fChi2 += (mS[0] * zeta[0] + mS[1] * zeta[1] + mS[3] * zeta[2]) * zeta[0]
938 + (mS[1] * zeta[0] + mS[2] * zeta[1] + mS[4] * zeta[2]) * zeta[1]
939 + (mS[3] * zeta[0] + mS[4] * zeta[1] + mS[5] * zeta[2]) * zeta[2];
940 }
941 }
942}
943
945{
946 //* Energy considered as an independent variable, fitted independently from momentum, without any constraints on
947 // mass
948
949 //* Add daughter
950
951 // if(!isAtVtxGuess)
952 // TransportToDecayVertex();
953
954 Int_t maxIter = 1;
955
956 if ((!fIsLinearized) && (!isAtVtxGuess)) {
957 if (fNDF[0] == -1) {
958 fvec ds, ds1;
959 GetDStoParticle(Daughter, ds, ds1);
960 TransportToDS(ds);
961 fvec m[8];
962 fvec mCd[36];
963 Daughter.Transport(ds1, m, mCd);
964 fVtxGuess[0] = .5 * (fP[0] + m[0]);
965 fVtxGuess[1] = .5 * (fP[1] + m[1]);
966 fVtxGuess[2] = .5 * (fP[2] + m[2]);
967 } else {
968 fVtxGuess[0] = fP[0];
969 fVtxGuess[1] = fP[1];
970 fVtxGuess[2] = fP[2];
971 }
972 maxIter = 3;
973 }
974
975 for (Int_t iter = 0; iter < maxIter; iter++) {
976
977 fvec *ffP = fP, *ffC = fC;
978 fvec m[8], mV[36];
979
980 if (Daughter.fC[35][0] > 0) { // TODO Check this: only the first daughter is used here!
981 Daughter.GetMeasurement(fVtxGuess, m, mV, isAtVtxGuess);
982 } else {
983 for (Int_t i = 0; i < 8; i++)
984 m[i] = Daughter.fP[i];
985 for (Int_t i = 0; i < 36; i++)
986 mV[i] = Daughter.fC[i];
987 }
988 //*
989
990 fvec mS[6] = {ffC[0] + mV[0], ffC[1] + mV[1], ffC[2] + mV[2], ffC[3] + mV[3], ffC[4] + mV[4], ffC[5] + mV[5]};
992
993 //* Residual (measured - estimated)
994
995 fvec zeta[3] = {m[0] - ffP[0], m[1] - ffP[1], m[2] - ffP[2]};
996
997 //* CHt = CH'
998
999 fvec mCHt0[7], mCHt1[7], mCHt2[7];
1000
1001 mCHt0[0] = ffC[0];
1002 mCHt1[0] = ffC[1];
1003 mCHt2[0] = ffC[3];
1004 mCHt0[1] = ffC[1];
1005 mCHt1[1] = ffC[2];
1006 mCHt2[1] = ffC[4];
1007 mCHt0[2] = ffC[3];
1008 mCHt1[2] = ffC[4];
1009 mCHt2[2] = ffC[5];
1010 mCHt0[3] = ffC[6];
1011 mCHt1[3] = ffC[7];
1012 mCHt2[3] = ffC[8];
1013 mCHt0[4] = ffC[10];
1014 mCHt1[4] = ffC[11];
1015 mCHt2[4] = ffC[12];
1016 mCHt0[5] = ffC[15];
1017 mCHt1[5] = ffC[16];
1018 mCHt2[5] = ffC[17];
1019 mCHt0[6] = ffC[21];
1020 mCHt1[6] = ffC[22];
1021 mCHt2[6] = ffC[23];
1022
1023 //* Kalman gain K = mCH'*S
1024
1025 fvec k0[7], k1[7], k2[7];
1026
1027 for (Int_t i = 0; i < 7; ++i) {
1028 k0[i] = mCHt0[i] * mS[0] + mCHt1[i] * mS[1] + mCHt2[i] * mS[3];
1029 k1[i] = mCHt0[i] * mS[1] + mCHt1[i] * mS[2] + mCHt2[i] * mS[4];
1030 k2[i] = mCHt0[i] * mS[3] + mCHt1[i] * mS[4] + mCHt2[i] * mS[5];
1031 }
1032
1033 //* New estimation of the vertex position
1034
1035 if (iter < maxIter - 1) {
1036 for (Int_t i = 0; i < 3; ++i)
1037 fVtxGuess[i] = ffP[i] + k0[i] * zeta[0] + k1[i] * zeta[1] + k2[i] * zeta[2];
1038 continue;
1039 }
1040
1041 // last itearation -> update the particle
1042
1043 //* VHt = VH'
1044
1045 fvec mVHt0[7], mVHt1[7], mVHt2[7];
1046
1047 mVHt0[0] = mV[0];
1048 mVHt1[0] = mV[1];
1049 mVHt2[0] = mV[3];
1050 mVHt0[1] = mV[1];
1051 mVHt1[1] = mV[2];
1052 mVHt2[1] = mV[4];
1053 mVHt0[2] = mV[3];
1054 mVHt1[2] = mV[4];
1055 mVHt2[2] = mV[5];
1056 mVHt0[3] = mV[6];
1057 mVHt1[3] = mV[7];
1058 mVHt2[3] = mV[8];
1059 mVHt0[4] = mV[10];
1060 mVHt1[4] = mV[11];
1061 mVHt2[4] = mV[12];
1062 mVHt0[5] = mV[15];
1063 mVHt1[5] = mV[16];
1064 mVHt2[5] = mV[17];
1065 mVHt0[6] = mV[21];
1066 mVHt1[6] = mV[22];
1067 mVHt2[6] = mV[23];
1068
1069 //* Kalman gain Km = mCH'*S
1070
1071 fvec km0[7], km1[7], km2[7];
1072
1073 for (Int_t i = 0; i < 7; ++i) {
1074 km0[i] = mVHt0[i] * mS[0] + mVHt1[i] * mS[1] + mVHt2[i] * mS[3];
1075 km1[i] = mVHt0[i] * mS[1] + mVHt1[i] * mS[2] + mVHt2[i] * mS[4];
1076 km2[i] = mVHt0[i] * mS[3] + mVHt1[i] * mS[4] + mVHt2[i] * mS[5];
1077 }
1078
1079 for (Int_t i = 0; i < 7; ++i)
1080 ffP[i] = ffP[i] + k0[i] * zeta[0] + k1[i] * zeta[1] + k2[i] * zeta[2];
1081
1082 for (Int_t i = 0; i < 7; ++i)
1083 m[i] = m[i] - km0[i] * zeta[0] - km1[i] * zeta[1] - km2[i] * zeta[2];
1084
1085 for (Int_t i = 0, k = 0; i < 7; ++i) {
1086 for (Int_t j = 0; j <= i; ++j, ++k) {
1087 ffC[k] = ffC[k] - (k0[i] * mCHt0[j] + k1[i] * mCHt1[j] + k2[i] * mCHt2[j]);
1088 }
1089 }
1090
1091 for (Int_t i = 0, k = 0; i < 7; ++i) {
1092 for (Int_t j = 0; j <= i; ++j, ++k) {
1093 mV[k] = mV[k] - (km0[i] * mVHt0[j] + km1[i] * mVHt1[j] + km2[i] * mVHt2[j]);
1094 }
1095 }
1096
1097 fvec mDf[7][7];
1098
1099 for (Int_t i = 0; i < 7; ++i) {
1100 for (Int_t j = 0; j < 7; ++j) {
1101 mDf[i][j] = (km0[i] * mCHt0[j] + km1[i] * mCHt1[j] + km2[i] * mCHt2[j]);
1102 }
1103 }
1104
1105 fvec mJ1[7][7], mJ2[7][7];
1106 for (Int_t iPar1 = 0; iPar1 < 7; iPar1++) {
1107 for (Int_t iPar2 = 0; iPar2 < 7; iPar2++) {
1108 mJ1[iPar1][iPar2] = 0;
1109 mJ2[iPar1][iPar2] = 0;
1110 }
1111 }
1112
1113 fvec mMassParticle = ffP[6] * ffP[6] - (ffP[3] * ffP[3] + ffP[4] * ffP[4] + ffP[5] * ffP[5]);
1114 fvec mMassDaughter = m[6] * m[6] - (m[3] * m[3] + m[4] * m[4] + m[5] * m[5]);
1115 mMassParticle = if3(fvec(mMassParticle > Zero), sqrt(mMassParticle), Zero);
1116 mMassDaughter = if3(fvec(mMassDaughter > Zero), sqrt(mMassDaughter), Zero);
1117
1118 fvec mask1 = fvec(fMassHypo > fvec(-0.5));
1119 fvec mask2 = fvec(fvec(!mask1) & fvec(fvec(mMassParticle < SumDaughterMass) | fvec(ffP[6] < Zero)));
1120 SetMassConstraint(ffP, ffC, mJ1, fMassHypo, mask1);
1121 SetMassConstraint(ffP, ffC, mJ1, SumDaughterMass, mask2);
1122
1123 fvec mask3 = fvec(fvec(Daughter.fMassHypo) > fvec(-0.5));
1124 fvec mask4 = fvec(fvec(!mask3) & fvec(fvec(mMassDaughter < Daughter.SumDaughterMass) | fvec(m[6] < Zero)));
1125 SetMassConstraint(m, mV, mJ2, Daughter.fMassHypo, mask3);
1126 SetMassConstraint(m, mV, mJ2, Daughter.SumDaughterMass, mask4);
1127
1128 fvec mDJ[7][7];
1129
1130 for (Int_t i = 0; i < 7; i++) {
1131 for (Int_t j = 0; j < 7; j++) {
1132 mDJ[i][j] = 0;
1133 for (Int_t k = 0; k < 7; k++) {
1134 mDJ[i][j] += mDf[i][k] * mJ1[j][k];
1135 }
1136 }
1137 }
1138
1139 for (Int_t i = 0; i < 7; ++i) {
1140 for (Int_t j = 0; j < 7; ++j) {
1141 mDf[i][j] = 0;
1142 for (Int_t l = 0; l < 7; l++) {
1143 mDf[i][j] += mJ2[i][l] * mDJ[l][j];
1144 }
1145 }
1146 }
1147
1148 //* Add the daughter momentum to the particle momentum
1149
1150 ffP[3] += m[3];
1151 ffP[4] += m[4];
1152 ffP[5] += m[5];
1153 ffP[6] += m[6];
1154
1155 ffC[9] += mV[9];
1156 ffC[13] += mV[13];
1157 ffC[14] += mV[14];
1158 ffC[18] += mV[18];
1159 ffC[19] += mV[19];
1160 ffC[20] += mV[20];
1161 ffC[24] += mV[24];
1162 ffC[25] += mV[25];
1163 ffC[26] += mV[26];
1164 ffC[27] += mV[27];
1165
1166 ffC[6] += mDf[3][0];
1167 ffC[7] += mDf[3][1];
1168 ffC[8] += mDf[3][2];
1169 ffC[10] += mDf[4][0];
1170 ffC[11] += mDf[4][1];
1171 ffC[12] += mDf[4][2];
1172 ffC[15] += mDf[5][0];
1173 ffC[16] += mDf[5][1];
1174 ffC[17] += mDf[5][2];
1175 ffC[21] += mDf[6][0];
1176 ffC[22] += mDf[6][1];
1177 ffC[23] += mDf[6][2];
1178
1179 ffC[9] += mDf[3][3] + mDf[3][3];
1180 ffC[13] += mDf[4][3] + mDf[3][4];
1181 ffC[14] += mDf[4][4] + mDf[4][4];
1182 ffC[18] += mDf[5][3] + mDf[3][5];
1183 ffC[19] += mDf[5][4] + mDf[4][5];
1184 ffC[20] += mDf[5][5] + mDf[5][5];
1185 ffC[24] += mDf[6][3] + mDf[3][6];
1186 ffC[25] += mDf[6][4] + mDf[4][6];
1187 ffC[26] += mDf[6][5] + mDf[5][6];
1188 ffC[27] += mDf[6][6] + mDf[6][6];
1189
1190 //* New estimation of the vertex position r += K*zeta
1191
1192 for (Int_t i = 0; i < 7; ++i)
1193 fP[i] = ffP[i];
1194
1195 //* New covariance matrix C -= K*(mCH')'
1196
1197 for (Int_t i = 0, k = 0; i < 7; ++i) {
1198 for (Int_t j = 0; j <= i; ++j, ++k) {
1199 fC[k] = ffC[k];
1200 }
1201 }
1202 //* Calculate Chi^2
1203
1204 if (iter == (maxIter - 1)) {
1205 fNDF += 2;
1206 fQ += Daughter.GetQ();
1207 fSFromDecay = 0;
1208 fChi2 += (mS[0] * zeta[0] + mS[1] * zeta[1] + mS[3] * zeta[2]) * zeta[0]
1209 + (mS[1] * zeta[0] + mS[2] * zeta[1] + mS[4] * zeta[2]) * zeta[1]
1210 + (mS[3] * zeta[0] + mS[4] * zeta[1] + mS[5] * zeta[2]) * zeta[2];
1211 }
1212 }
1213}
1214
1216{
1217 //* Set production vertex for the particle, when the particle was not used in the vertex fit
1218
1219 const fvec *m = Vtx.fP, *mV = Vtx.fC;
1220
1221 Bool_t noS = (fC[35][0] <= 0); // no decay length allowed //TODO Check this: only the first daughter is used here!
1222
1223 if (noS) {
1225 fP[7] = 0;
1226 fC[28] = fC[29] = fC[30] = fC[31] = fC[32] = fC[33] = fC[34] = fC[35] = 0;
1227 } else {
1229 fP[7] = -fSFromDecay;
1230 fC[28] = fC[29] = fC[30] = fC[31] = fC[32] = fC[33] = fC[34] = 0;
1231 fC[35] = 0.1;
1232
1233 Convert(1);
1234 }
1235
1236 fvec mAi[6] = {fC[0], fC[1], fC[2], fC[3], fC[4], fC[5]};
1237
1238 InvertCholetsky3(mAi);
1239 // InvertSym3( fC, mAi );
1240
1241 fvec mB[5][3];
1242
1243 mB[0][0] = fC[6] * mAi[0] + fC[7] * mAi[1] + fC[8] * mAi[3];
1244 mB[0][1] = fC[6] * mAi[1] + fC[7] * mAi[2] + fC[8] * mAi[4];
1245 mB[0][2] = fC[6] * mAi[3] + fC[7] * mAi[4] + fC[8] * mAi[5];
1246
1247 mB[1][0] = fC[10] * mAi[0] + fC[11] * mAi[1] + fC[12] * mAi[3];
1248 mB[1][1] = fC[10] * mAi[1] + fC[11] * mAi[2] + fC[12] * mAi[4];
1249 mB[1][2] = fC[10] * mAi[3] + fC[11] * mAi[4] + fC[12] * mAi[5];
1250
1251 mB[2][0] = fC[15] * mAi[0] + fC[16] * mAi[1] + fC[17] * mAi[3];
1252 mB[2][1] = fC[15] * mAi[1] + fC[16] * mAi[2] + fC[17] * mAi[4];
1253 mB[2][2] = fC[15] * mAi[3] + fC[16] * mAi[4] + fC[17] * mAi[5];
1254
1255 mB[3][0] = fC[21] * mAi[0] + fC[22] * mAi[1] + fC[23] * mAi[3];
1256 mB[3][1] = fC[21] * mAi[1] + fC[22] * mAi[2] + fC[23] * mAi[4];
1257 mB[3][2] = fC[21] * mAi[3] + fC[22] * mAi[4] + fC[23] * mAi[5];
1258
1259 mB[4][0] = fC[28] * mAi[0] + fC[29] * mAi[1] + fC[30] * mAi[3];
1260 mB[4][1] = fC[28] * mAi[1] + fC[29] * mAi[2] + fC[30] * mAi[4];
1261 mB[4][2] = fC[28] * mAi[3] + fC[29] * mAi[4] + fC[30] * mAi[5];
1262
1263 fvec z[3] = {m[0] - fP[0], m[1] - fP[1], m[2] - fP[2]};
1264
1265 {
1266 fvec mAVi[6] = {fC[0] - mV[0], fC[1] - mV[1], fC[2] - mV[2], fC[3] - mV[3], fC[4] - mV[4], fC[5] - mV[5]};
1267
1268 // fvec init = InvertSym3( mAVi, mAVi ) ;
1269 InvertCholetsky3(mAVi);
1270
1271 fvec dChi2 = (+(mAVi[0] * z[0] + mAVi[1] * z[1] + mAVi[3] * z[2]) * z[0]
1272 + (mAVi[1] * z[0] + mAVi[2] * z[1] + mAVi[4] * z[2]) * z[1]
1273 + (mAVi[3] * z[0] + mAVi[4] * z[1] + mAVi[5] * z[2]) * z[2]);
1274
1275 // Take Abs(dChi2) here. Negative value of 'det' or 'dChi2' shows that the particle
1276 // was not used in the production vertex fit
1277
1278 // fChi2 += (!init) & fabs( dChi2 );
1279 fChi2 += fabs(dChi2);
1280 fNDF += 2;
1281 }
1282
1283 fP[0] = m[0];
1284 fP[1] = m[1];
1285 fP[2] = m[2];
1286 fP[3] += mB[0][0] * z[0] + mB[0][1] * z[1] + mB[0][2] * z[2];
1287 fP[4] += mB[1][0] * z[0] + mB[1][1] * z[1] + mB[1][2] * z[2];
1288 fP[5] += mB[2][0] * z[0] + mB[2][1] * z[1] + mB[2][2] * z[2];
1289 fP[6] += mB[3][0] * z[0] + mB[3][1] * z[1] + mB[3][2] * z[2];
1290 fP[7] += mB[4][0] * z[0] + mB[4][1] * z[1] + mB[4][2] * z[2];
1291
1292 fvec d0, d1, d2;
1293
1294 fC[0] = mV[0];
1295 fC[1] = mV[1];
1296 fC[2] = mV[2];
1297 fC[3] = mV[3];
1298 fC[4] = mV[4];
1299 fC[5] = mV[5];
1300
1301 d0 = mB[0][0] * mV[0] + mB[0][1] * mV[1] + mB[0][2] * mV[3] - fC[6];
1302 d1 = mB[0][0] * mV[1] + mB[0][1] * mV[2] + mB[0][2] * mV[4] - fC[7];
1303 d2 = mB[0][0] * mV[3] + mB[0][1] * mV[4] + mB[0][2] * mV[5] - fC[8];
1304
1305 fC[6] += d0;
1306 fC[7] += d1;
1307 fC[8] += d2;
1308 fC[9] += d0 * mB[0][0] + d1 * mB[0][1] + d2 * mB[0][2];
1309
1310 d0 = mB[1][0] * mV[0] + mB[1][1] * mV[1] + mB[1][2] * mV[3] - fC[10];
1311 d1 = mB[1][0] * mV[1] + mB[1][1] * mV[2] + mB[1][2] * mV[4] - fC[11];
1312 d2 = mB[1][0] * mV[3] + mB[1][1] * mV[4] + mB[1][2] * mV[5] - fC[12];
1313
1314 fC[10] += d0;
1315 fC[11] += d1;
1316 fC[12] += d2;
1317 fC[13] += d0 * mB[0][0] + d1 * mB[0][1] + d2 * mB[0][2];
1318 fC[14] += d0 * mB[1][0] + d1 * mB[1][1] + d2 * mB[1][2];
1319
1320 d0 = mB[2][0] * mV[0] + mB[2][1] * mV[1] + mB[2][2] * mV[3] - fC[15];
1321 d1 = mB[2][0] * mV[1] + mB[2][1] * mV[2] + mB[2][2] * mV[4] - fC[16];
1322 d2 = mB[2][0] * mV[3] + mB[2][1] * mV[4] + mB[2][2] * mV[5] - fC[17];
1323
1324 fC[15] += d0;
1325 fC[16] += d1;
1326 fC[17] += d2;
1327 fC[18] += d0 * mB[0][0] + d1 * mB[0][1] + d2 * mB[0][2];
1328 fC[19] += d0 * mB[1][0] + d1 * mB[1][1] + d2 * mB[1][2];
1329 fC[20] += d0 * mB[2][0] + d1 * mB[2][1] + d2 * mB[2][2];
1330
1331 d0 = mB[3][0] * mV[0] + mB[3][1] * mV[1] + mB[3][2] * mV[3] - fC[21];
1332 d1 = mB[3][0] * mV[1] + mB[3][1] * mV[2] + mB[3][2] * mV[4] - fC[22];
1333 d2 = mB[3][0] * mV[3] + mB[3][1] * mV[4] + mB[3][2] * mV[5] - fC[23];
1334
1335 fC[21] += d0;
1336 fC[22] += d1;
1337 fC[23] += d2;
1338 fC[24] += d0 * mB[0][0] + d1 * mB[0][1] + d2 * mB[0][2];
1339 fC[25] += d0 * mB[1][0] + d1 * mB[1][1] + d2 * mB[1][2];
1340 fC[26] += d0 * mB[2][0] + d1 * mB[2][1] + d2 * mB[2][2];
1341 fC[27] += d0 * mB[3][0] + d1 * mB[3][1] + d2 * mB[3][2];
1342
1343 d0 = mB[4][0] * mV[0] + mB[4][1] * mV[1] + mB[4][2] * mV[3] - fC[28];
1344 d1 = mB[4][0] * mV[1] + mB[4][1] * mV[2] + mB[4][2] * mV[4] - fC[29];
1345 d2 = mB[4][0] * mV[3] + mB[4][1] * mV[4] + mB[4][2] * mV[5] - fC[30];
1346
1347 fC[28] += d0;
1348 fC[29] += d1;
1349 fC[30] += d2;
1350 fC[31] += d0 * mB[0][0] + d1 * mB[0][1] + d2 * mB[0][2];
1351 fC[32] += d0 * mB[1][0] + d1 * mB[1][1] + d2 * mB[1][2];
1352 fC[33] += d0 * mB[2][0] + d1 * mB[2][1] + d2 * mB[2][2];
1353 fC[34] += d0 * mB[3][0] + d1 * mB[3][1] + d2 * mB[3][2];
1354 fC[35] += d0 * mB[4][0] + d1 * mB[4][1] + d2 * mB[4][2];
1355
1356 if (noS) {
1357 fP[7] = 0;
1358 fC[28] = fC[29] = fC[30] = fC[31] = fC[32] = fC[33] = fC[34] = fC[35] = 0;
1359 } else {
1360 TransportToDS(fP[7]);
1361 Convert(0);
1362 }
1363
1364 fSFromDecay = 0;
1365}
1366
1367void KFParticleBaseSIMD::SetMassConstraint(fvec* mP, fvec* mC, fvec mJ[7][7], fvec mass, fvec mask)
1368{
1369 //* Set nonlinear mass constraint (Mass) on the state vector mP with a covariance matrix mC.
1370
1371 const fvec energy2 = mP[6] * mP[6], p2 = mP[3] * mP[3] + mP[4] * mP[4] + mP[5] * mP[5], mass2 = mass * mass;
1372
1373 const fvec a = energy2 - p2 + 2. * mass2;
1374 const fvec b = -2. * (energy2 + p2);
1375 const fvec c = energy2 - p2 - mass2;
1376
1377 fvec lambda = if3(fvec(fabs(b) > fvec(1.e-10)), -c / b, Zero);
1378
1379 fvec d = 4. * energy2 * p2 - mass2 * (energy2 - p2 - 2. * mass2);
1380 fvec qMask = fvec(fvec(d >= Zero) & fvec(fabs(a) > fvec(1.e-10)));
1381 lambda = if3(qMask, ((energy2 + p2 - sqrt(d)) / a), lambda);
1382
1383 lambda = if3(fvec(mP[6] < Zero), fvec(-1000000.f), lambda);
1384
1385 Int_t iIter = 0;
1386 for (iIter = 0; iIter < 100; iIter++) {
1387 fvec lambda2 = lambda * lambda;
1388 fvec lambda4 = lambda2 * lambda2;
1389
1390 // fvec lambda0 = lambda;
1391
1392 fvec f = -mass2 * lambda4 + a * lambda2 + b * lambda + c;
1393 fvec df = -4. * mass2 * lambda2 * lambda + 2. * a * lambda + b;
1394 lambda -= if3(fvec(fabs(df) > fvec(1.e-10)), f / df, Zero);
1395 // if(TMath::Abs(lambda0 - lambda) < 1.e-8) break;
1396 }
1397
1398 const fvec lpi = 1. / (1. + lambda);
1399 const fvec lmi = 1. / (1. - lambda);
1400 const fvec lp2i = lpi * lpi;
1401 const fvec lm2i = lmi * lmi;
1402
1403 fvec lambda2 = lambda * lambda;
1404
1405 fvec dfl = -4. * mass2 * lambda2 * lambda + 2. * a * lambda + b;
1406 fvec dfx[7] = {0}; //,0,0,0};
1407 dfx[0] = -2. * (1. + lambda) * (1. + lambda) * mP[3];
1408 dfx[1] = -2. * (1. + lambda) * (1. + lambda) * mP[4];
1409 dfx[2] = -2. * (1. + lambda) * (1. + lambda) * mP[5];
1410 dfx[3] = 2. * (1. - lambda) * (1. - lambda) * mP[6];
1411 fvec dlx[4] = {1, 1, 1, 1};
1412
1413 for (int i = 0; i < 4; i++)
1414 dlx[i] = if3(fvec(fabs(dfl) > fvec(1.e-10)), -dfx[i] / dfl, dlx[i]);
1415
1416 fvec dxx[4] = {mP[3] * lm2i, mP[4] * lm2i, mP[5] * lm2i, -mP[6] * lp2i};
1417
1418 for (Int_t i = 0; i < 7; i++)
1419 for (Int_t j = 0; j < 7; j++)
1420 mJ[i][j] = 0;
1421 mJ[0][0] = 1.;
1422 mJ[1][1] = 1.;
1423 mJ[2][2] = 1.;
1424
1425 for (Int_t i = 3; i < 7; i++)
1426 for (Int_t j = 3; j < 7; j++)
1427 mJ[i][j] = dlx[j - 3] * dxx[i - 3];
1428
1429 for (Int_t i = 3; i < 6; i++)
1430 mJ[i][i] += lmi;
1431 mJ[6][6] += lpi;
1432
1433 fvec mCJ[7][7];
1434
1435 for (Int_t i = 0; i < 7; i++) {
1436 for (Int_t j = 0; j < 7; j++) {
1437 mCJ[i][j] = 0;
1438 for (Int_t k = 0; k < 7; k++) {
1439 mCJ[i][j] += mC[IJ(i, k)] * mJ[j][k];
1440 }
1441 }
1442 }
1443
1444 for (Int_t i = 0; i < 7; ++i) {
1445 for (Int_t j = 0; j <= i; ++j) {
1446 mC[IJ(i, j)] = if3(mask, Zero, mC[IJ(i, j)]);
1447 for (Int_t l = 0; l < 7; l++) {
1448 mC[IJ(i, j)] += if3(mask, mJ[i][l] * mCJ[l][j], Zero);
1449 }
1450 }
1451 }
1452
1453 mP[3] *= if3(mask, lmi, One);
1454 mP[4] *= if3(mask, lmi, One);
1455 mP[5] *= if3(mask, lmi, One);
1456 mP[6] *= if3(mask, lpi, One);
1457}
1458
1460{
1461 //* Set nonlinear mass constraint (mass)
1462
1463 fvec mJ[7][7];
1464 SetMassConstraint(fP, fC, mJ, mass, fvec(One > Zero));
1465 fMassHypo = mass;
1466 SumDaughterMass = mass;
1467}
1468
1470{
1471 //* Set hard( SigmaMass=0 ) or soft (SigmaMass>0) mass constraint
1472
1473 fMassHypo = Mass;
1474 SumDaughterMass = Mass;
1475
1476 fvec m2 = Mass * Mass; // measurement, weighted by Mass
1477 fvec s2 = m2 * SigmaMass * SigmaMass; // sigma^2
1478
1479 fvec p2 = fP[3] * fP[3] + fP[4] * fP[4] + fP[5] * fP[5];
1480 fvec e0 = sqrt(m2 + p2);
1481
1482 fvec mH[8];
1483 mH[0] = mH[1] = mH[2] = 0.;
1484 mH[3] = -2 * fP[3];
1485 mH[4] = -2 * fP[4];
1486 mH[5] = -2 * fP[5];
1487 mH[6] = 2 * fP[6]; // e0;
1488 mH[7] = 0;
1489
1490 fvec zeta = e0 * e0 - e0 * fP[6];
1491 zeta = m2 - (fP[6] * fP[6] - p2);
1492
1493 fvec mCHt[8], s2_est = 0;
1494 for (Int_t i = 0; i < 8; ++i) {
1495 mCHt[i] = 0.0;
1496 for (Int_t j = 0; j < 8; ++j)
1497 mCHt[i] += Cij(i, j) * mH[j];
1498 s2_est += mH[i] * mCHt[i];
1499 }
1500
1501 // TODO Next line should be uncommented
1502 // if( s2_est<1.e-20 ) return; // calculated mass error is already 0,
1503 // the particle can not be constrained on mass
1504
1505 fvec w2 = 1. / (s2 + s2_est);
1506 fChi2 += zeta * zeta * w2;
1507 fNDF += 1;
1508 for (Int_t i = 0, ii = 0; i < 8; ++i) {
1509 fvec ki = mCHt[i] * w2;
1510 fP[i] += ki * zeta;
1511 for (Int_t j = 0; j <= i; ++j)
1512 fC[ii++] -= ki * mCHt[j];
1513 }
1514}
1515
1517{
1518 //* Set no decay length for resonances
1519
1521
1522 fvec h[8];
1523 h[0] = h[1] = h[2] = h[3] = h[4] = h[5] = h[6] = 0;
1524 h[7] = 1;
1525
1526 fvec zeta = 0 - fP[7];
1527 for (Int_t i = 0; i < 8; ++i)
1528 zeta -= h[i] * (fP[i] - fP[i]);
1529
1530 fvec s = fC[35];
1531 // if( s>1.e-20 ) //TODO Should be uncommented!
1532 {
1533 s = 1. / s;
1534 fChi2 += zeta * zeta * s;
1535 fNDF += 1;
1536 for (Int_t i = 0, ii = 0; i < 7; ++i) {
1537 fvec ki = fC[28 + i] * s;
1538 fP[i] += ki * zeta;
1539 for (Int_t j = 0; j <= i; ++j)
1540 fC[ii++] -= ki * fC[28 + j];
1541 }
1542 }
1543 fP[7] = 0;
1544 fC[28] = fC[29] = fC[30] = fC[31] = fC[32] = fC[33] = fC[34] = fC[35] = 0;
1545}
1546
1548 Int_t nDaughters,
1549 const KFParticleBaseSIMD* Parent,
1550 Float_t Mass,
1551 Bool_t IsConstrained,
1552 Bool_t isAtVtxGuess)
1553{
1554 //* Full reconstruction in one go
1555
1556 //* Parameters: array of pointers to the input daughter particles (vDaughters), a number of daughters (nDaughters),
1557 //* pointer to the production vertex or particle (Parent), if the pointer is set - a constraint on the production
1558 //* is set on the reconstructed particle, if 0 - will not be set, a mass hypothesis (Mass), if Mass>0 - a mass
1559 // constraint
1560 //* will be set, a flag (IsConstrained), which indicates whether daughters are constrained on the production region,
1561 //* a flag (isAtVtxGuess), which indicates whether daughters are already transported to the vertex guess or not,
1562 //* if it is set to 1, a vertex guess should be provided, by default is set to 0.
1563
1564 //* examples:
1565 //* 1) construction of a secondary particle with no vertex guess:
1566 //* const KFParticleSIMD* vDaughtersPointer[2] = {&vDaughters[0], &vDaughters[1]};
1567 //* mother.Construct(vDaughtersPointer, 2, 0);
1568 //* 2) construction of the primary particle with a vertex guess
1569 //* fvec errGuess[3] = {100*sqrt(PrimVtx.CovarianceMatrix()[0]),
1570 //* 100*sqrt(PrimVtx.CovarianceMatrix()[2]),
1571 //* 100*sqrt(PrimVtx.CovarianceMatrix()[5])};
1572 //* mother.SetVtxGuess(PrimVtx.X(), PrimVtx.Y(), PrimVtx.Z());
1573 //* mother.SetVtxErrGuess(errGuess[0], errGuess[1], errGuess[2]);
1574 //* const KFParticleSIMD* vDaughtersPointer[2] = {&vDaughters[0], &vDaughters[1]};
1575 //* mother.Construct(vDaughtersPointer, 2, 0, -1, 0, 1);
1576
1577 Int_t maxIter = 1;
1578 bool wasLinearized = fIsLinearized;
1579 if ((!fIsLinearized || IsConstrained) && (!isAtVtxGuess)) {
1580 // fVtxGuess[0] = fVtxGuess[1] = fVtxGuess[2] = 0; //!!!!
1581 fvec ds = 0., ds1 = 0.;
1582 fvec P[8], C[36];
1583 vDaughters[0]->GetDStoParticle(*vDaughters[1], ds, ds1);
1584 vDaughters[0]->Transport(ds, P, C);
1585 fVtxGuess[0] = P[0];
1586 fVtxGuess[1] = P[1];
1587 fVtxGuess[2] = P[2];
1588 /* fVtxGuess[0] = GetX();
1589 fVtxGuess[1] = GetY();
1590 fVtxGuess[2] = GetZ();*/
1591
1592 if (!fIsVtxErrGuess) {
1593 fVtxErrGuess[0] = if3(fvec(C[0] > Zero), 10 * sqrt(C[0]), One);
1594 fVtxErrGuess[1] = if3(fvec(C[2] > Zero), 10 * sqrt(C[2]), One);
1595 fVtxErrGuess[2] = if3(fvec(C[5] > Zero), 10 * sqrt(C[5]), One);
1596 }
1597
1598 fIsLinearized = 1;
1599 maxIter = 3;
1600 } else {
1601 if (!fIsVtxErrGuess) {
1602 fVtxErrGuess[0] = 1;
1603 fVtxErrGuess[1] = 1;
1604 fVtxErrGuess[2] = 1;
1605 }
1606 }
1607
1608 fvec constraintC[6];
1609
1610 if (IsConstrained) {
1611 for (Int_t i = 0; i < 6; ++i)
1612 constraintC[i] = fC[i];
1613 } else {
1614 for (Int_t i = 0; i < 6; ++i)
1615 constraintC[i] = 0.;
1616 // constraintC[0] = constraintC[2] = constraintC[5] = 100.;
1617
1618 constraintC[0] = fVtxErrGuess[0] * fVtxErrGuess[0];
1619 constraintC[2] = fVtxErrGuess[1] * fVtxErrGuess[1];
1620 constraintC[5] = fVtxErrGuess[2] * fVtxErrGuess[2];
1621 }
1622
1623 for (Int_t iter = 0; iter < maxIter; iter++) {
1624
1626 SetNDaughters(nDaughters);
1627
1629 fSFromDecay = 0;
1630 fP[0] = fVtxGuess[0];
1631 fP[1] = fVtxGuess[1];
1632 fP[2] = fVtxGuess[2];
1633 fP[3] = 0;
1634 fP[4] = 0;
1635 fP[5] = 0;
1636 fP[6] = 0;
1637 fP[7] = 0;
1638 SumDaughterMass = 0;
1639
1640 for (Int_t i = 0; i < 6; ++i)
1641 fC[i] = constraintC[i];
1642 for (Int_t i = 6; i < 36; ++i)
1643 fC[i] = 0.;
1644 fC[35] = 1.;
1645
1646 fNDF = IsConstrained ? 0 : -3;
1647 fChi2 = 0.;
1648 fQ = 0;
1649
1650 for (Int_t itr = 0; itr < nDaughters; itr++) {
1651 AddDaughter(*vDaughters[itr], isAtVtxGuess);
1652 }
1653 if (iter < maxIter - 1) {
1654 for (Int_t i = 0; i < 3; i++)
1655 fVtxGuess[i] = fP[i];
1656 }
1657 }
1658 fIsLinearized = wasLinearized;
1659
1660 if (Mass >= 0)
1661 SetMassConstraint(Mass);
1662 if (Parent)
1663 SetProductionVertex(*Parent);
1664}
1665
1666void KFParticleBaseSIMD::Convert(bool ToProduction)
1667{
1668 //* Tricky function - convert the particle error along its trajectory to
1669 //* the value which corresponds to its production/decay vertex
1670 //* It is done by combination of the error of decay length with the position errors
1671
1672 fvec fld[3];
1673 {
1674 GetFieldValue(fP, fld);
1675 const fvec kCLight = fQ * 0.000299792458;
1676 fld[0] *= kCLight;
1677 fld[1] *= kCLight;
1678 fld[2] *= kCLight;
1679 }
1680
1681 fvec h[6];
1682
1683 h[0] = fP[3];
1684 h[1] = fP[4];
1685 h[2] = fP[5];
1686 if (ToProduction) {
1687 h[0] = -h[0];
1688 h[1] = -h[1];
1689 h[2] = -h[2];
1690 }
1691 h[3] = h[1] * fld[2] - h[2] * fld[1];
1692 h[4] = h[2] * fld[0] - h[0] * fld[2];
1693 h[5] = h[0] * fld[1] - h[1] * fld[0];
1694
1695 fvec c;
1696
1697 c = fC[28] + h[0] * fC[35];
1698 fC[0] += h[0] * (c + fC[28]);
1699 fC[28] = c;
1700
1701 fC[1] += h[1] * fC[28] + h[0] * fC[29];
1702 c = fC[29] + h[1] * fC[35];
1703 fC[2] += h[1] * (c + fC[29]);
1704 fC[29] = c;
1705
1706 fC[3] += h[2] * fC[28] + h[0] * fC[30];
1707 fC[4] += h[2] * fC[29] + h[1] * fC[30];
1708 c = fC[30] + h[2] * fC[35];
1709 fC[5] += h[2] * (c + fC[30]);
1710 fC[30] = c;
1711
1712 fC[6] += h[3] * fC[28] + h[0] * fC[31];
1713 fC[7] += h[3] * fC[29] + h[1] * fC[31];
1714 fC[8] += h[3] * fC[30] + h[2] * fC[31];
1715 c = fC[31] + h[3] * fC[35];
1716 fC[9] += h[3] * (c + fC[31]);
1717 fC[31] = c;
1718
1719 fC[10] += h[4] * fC[28] + h[0] * fC[32];
1720 fC[11] += h[4] * fC[29] + h[1] * fC[32];
1721 fC[12] += h[4] * fC[30] + h[2] * fC[32];
1722 fC[13] += h[4] * fC[31] + h[3] * fC[32];
1723 c = fC[32] + h[4] * fC[35];
1724 fC[14] += h[4] * (c + fC[32]);
1725 fC[32] = c;
1726
1727 fC[15] += h[5] * fC[28] + h[0] * fC[33];
1728 fC[16] += h[5] * fC[29] + h[1] * fC[33];
1729 fC[17] += h[5] * fC[30] + h[2] * fC[33];
1730 fC[18] += h[5] * fC[31] + h[3] * fC[33];
1731 fC[19] += h[5] * fC[32] + h[4] * fC[33];
1732 c = fC[33] + h[5] * fC[35];
1733 fC[20] += h[5] * (c + fC[33]);
1734 fC[33] = c;
1735
1736 fC[21] += h[0] * fC[34];
1737 fC[22] += h[1] * fC[34];
1738 fC[23] += h[2] * fC[34];
1739 fC[24] += h[3] * fC[34];
1740 fC[25] += h[4] * fC[34];
1741 fC[26] += h[5] * fC[34];
1742}
1743
1745{
1746 //* Transport the particle to its decay vertex
1747
1750 Convert(0);
1752}
1753
1755{
1756 //* Transport the particle to its production vertex
1757
1760 Convert(1);
1762}
1763
1765{
1766 //* Transport the particle on dS parameter (SignedPath/Momentum)
1767
1768 Transport(dS, fP, fC);
1769 fSFromDecay += dS;
1770}
1771
1773 fvec& l,
1774 fvec& dl,
1775 fvec* isParticleFromVertex) const
1776{
1777 //* Get dS to a certain space point without field
1778
1779 fvec c[6] = {Vertex.fC[0] + fC[0], Vertex.fC[1] + fC[1], Vertex.fC[2] + fC[2],
1780 Vertex.fC[3] + fC[3], Vertex.fC[4] + fC[4], Vertex.fC[5] + fC[5]};
1781
1782 fvec dx = (Vertex.fP[0] - fP[0]);
1783 fvec dy = (Vertex.fP[1] - fP[1]);
1784 fvec dz = (Vertex.fP[2] - fP[2]);
1785
1786 l = sqrt(dx * dx + dy * dy + dz * dz);
1787 dl = c[0] * dx * dx + c[2] * dy * dy + c[5] * dz * dz + 2 * (c[1] * dx * dy + c[3] * dx * dz + c[4] * dy * dz);
1788 fvec ok = fvec(fvec(0) < dl);
1789 dl = fvec(ok & (sqrt(dl) / l)) + fvec(!ok & fvec(1.e8));
1790
1791 if (isParticleFromVertex) {
1792 *isParticleFromVertex = fvec(ok & fvec(l < fvec(3 * dl)));
1793 fvec cos = dx * fP[3] + dy * fP[4] + dz * fP[5];
1794 // fvec dCos = dy*dy*fC[14] + dz*dz*fC[20] + dx*dx*fC[9] + 2*dz*fC[15]*fP[3] + c[0]* fP[3]*fP[3] +
1795 // 2*dz*fC[16]* fP[4] + 2 *c[1] *fP[3] *fP[4] + c[2] *fP[4]*fP[4] + 2 *dz *fC[17]* fP[5] +
1796 // 2*c[3] *fP[3]* fP[5] + 2 *c[4] *fP[4] *fP[5] + c[5]*fP[5] *fP[5] +
1797 // 2*dy *(dz *fC[19] + fC[10] *fP[3] + fC[11]* fP[4] + fC[12]* fP[5]) +
1798 // 2*dx *(dy *fC[13] + dz *fC[18] + fC[6]* fP[3] + fC[7]* fP[4] + fC[8]* fP[5]);
1799 // ok = fvec(fvec(0)<dCos);
1800 // dCos = fvec(ok & ( dCos ));
1801 // dCos = sqrt(dCos);
1802 *isParticleFromVertex = fvec((*isParticleFromVertex) | fvec(!(*isParticleFromVertex) & fvec(cos < Zero)));
1803 }
1804}
1805
1807{
1808
1809 //* Get dS to a certain space point for Bz field
1810 const fvec kCLight = 0.000299792458;
1811 fvec bq = B * fQ * kCLight;
1812 fvec pt2 = fP[3] * fP[3] + fP[4] * fP[4];
1813
1814 fvec dx = xyz[0] - fP[0];
1815 fvec dy = xyz[1] - fP[1];
1816 fvec a = dx * fP[3] + dy * fP[4];
1817 fvec dS = Zero;
1818
1819 const fvec LocalSmall = 1.e-8;
1820 fvec mask = fvec(fabs(bq) < LocalSmall);
1821 dS = if3(mask, a / pt2, (atan2(bq * a, pt2 + bq * (dy * fP[3] - dx * fP[4])) / bq));
1822
1823#if 0
1824 {
1825
1826 fvec px = fP[3];
1827 fvec py = fP[4];
1828 fvec pz = fP[5];
1829 fvec ss[2], g[2][5];
1830
1831 ss[0] = dS;
1832 ss[1] = -dS;
1833 for( Int_t i=0; i<2; i++){
1834 fvec bs = bq*ss[i];
1835 fvec c = TMath::Cos(bs), s = TMath::Sin(bs);
1836 fvec cB,sB;
1837 if( TMath::Abs(bq)>1.e-8){
1838 cB= (1-c)/bq;
1839 sB= s/bq;
1840 }else{
1841 const fvec kOvSqr6 = 1./TMath::Sqrt(6.);
1842 sB = (1.-bs*kOvSqr6)*(1.+bs*kOvSqr6)*ss[i];
1843 cB = .5*sB*bs;
1844 }
1845 g[i][0] = fP[0] + sB*px + cB*py;
1846 g[i][1] = fP[1] - cB*px + sB*py;
1847 g[i][2] = fP[2] + ss[i]*pz;
1848 g[i][3] = + c*px + s*py;
1849 g[i][4] = - s*px + c*py;
1850 }
1851
1852 Int_t i=0;
1853
1854 fvec dMin = 1.e10;
1855 for( Int_t j=0; j<2; j++){
1856 fvec xx = g[j][0]-xyz[0];
1857 fvec yy = g[j][1]-xyz[1];
1858 fvec zz = g[j][2]-xyz[2];
1859 fvec d = xx*xx + yy*yy + zz*zz;
1860 if( d<dMin ){
1861 dMin = d;
1862 i = j;
1863 }
1864 }
1865
1866 dS = ss[i];
1867
1868 fvec x= g[i][0], y= g[i][1], z= g[i][2], ppx= g[i][3], ppy= g[i][4];
1869 fvec ddx = x-xyz[0];
1870 fvec ddy = y-xyz[1];
1871 fvec ddz = z-xyz[2];
1872 fvec c = ddx*ppx + ddy*ppy + ddz*pz ;
1873 fvec pp2 = ppx*ppx + ppy*ppy + pz*pz;
1874 if( TMath::Abs(pp2)>1.e-8 ){
1875 dS+=c/pp2;
1876 }
1877 }
1878#endif
1879 return dS;
1880}
1881
1883{
1884
1885 //* Get dS to a certain space point for Bz field
1886
1887 const fvec kCLight = 0.000299792458;
1888 fvec bq = B * fQ * kCLight;
1889 fvec pt2 = fP[3] * fP[3] + fP[5] * fP[5];
1890
1891 fvec dx = xyz[0] - fP[0];
1892 fvec dy = -xyz[2] + fP[2];
1893 fvec a = dx * fP[3] - dy * fP[5];
1894 fvec dS = Zero;
1895
1896 const fvec LocalSmall = 1.e-8;
1897 fvec mask = fvec(fabs(bq) < LocalSmall);
1898 dS = if3(mask, a / pt2, (atan2(bq * a, pt2 + bq * (dy * fP[3] + dx * fP[5])) / bq));
1899 return dS;
1900}
1901
1903{
1904 //* Get dS to another particle for Bz field
1905
1906 fvec px = fP[3];
1907 fvec py = fP[4];
1908 fvec pz = fP[5];
1909
1910 fvec px1 = p.fP[3];
1911 fvec py1 = p.fP[4];
1912 fvec pz1 = p.fP[5];
1913
1914 const fvec kCLight = 0.000299792458;
1915
1916 fvec bq = B * fQ * kCLight;
1917 fvec bq1 = B * p.fQ * kCLight;
1918 fvec s = Zero, ds = Zero, s1 = Zero, ds1 = Zero;
1919
1920 const fvec LocalSmall = 1.e-8;
1921
1922 fvec bq_big = fvec(LocalSmall < fabs(bq));
1923 fvec bq1_big = fvec(LocalSmall < fabs(bq1));
1924 {
1925 const fvec two = 2.;
1926 const fvec four = 2.;
1927 fvec dx = (p.fP[0] - fP[0]);
1928 fvec dy = (p.fP[1] - fP[1]);
1929 fvec d2 = (dx * dx + dy * dy);
1930
1931 fvec p2 = (px * px + py * py);
1932 fvec p21 = (px1 * px1 + py1 * py1);
1933
1934 fvec a = (px * py1 - py * px1);
1935 fvec b = (px * px1 + py * py1);
1936
1937 fvec ldx = bq * bq1 * dx - bq1 * py + bq * py1;
1938 fvec ldy = bq * bq1 * dy + bq1 * px - bq * px1;
1939 fvec l2 = ldx * ldx + ldy * ldy;
1940
1941 fvec cS = bq1 * p2 + bq * bq1 * (dy * px - dx * py) - bq * b;
1942 fvec cS1 = bq * p21 - bq * bq1 * (dy * px1 - dx * py1) - bq1 * b;
1943
1944 fvec ca = bq * bq * bq1 * d2 + two * (cS + bq * bq * (py1 * dx - px1 * dy));
1945 fvec ca1 = bq * bq1 * bq1 * d2 + two * (cS1 - bq1 * bq1 * (py * dx - px * dy));
1946
1947 fvec sa = 4 * l2 * p2 - ca * ca;
1948 fvec sa1 = 4 * l2 * p21 - ca1 * ca1;
1949
1950 const fvec saNeg = fvec(sa < Zero);
1951 sa = (!saNeg) & sa;
1952 const fvec sa1Neg = fvec(sa1 < Zero);
1953 sa1 = (!sa1Neg) & sa1;
1954
1955 s = if3(bq_big, (atan2(bq * (bq1 * (dx * px + dy * py) + a), cS) / bq),
1956 (((dx * px + dy * py) + (py * px1 - px * py1) / bq1) / p2));
1957 ds = if3(bq_big, (atan2(sqrt(sa), ca) / bq), (s * s - (d2 - two * (px1 * dy - py1 * dx) / bq1) / p2));
1958 fvec dsNeg = fvec(ds < Zero);
1959 ds = (fvec((!dsNeg) & (!bq_big)) & sqrt(ds)) + (bq_big & ds);
1960
1961 s1 = if3(bq1_big, (atan2(-bq1 * (bq * (dx * px1 + dy * py1) + a), cS1) / bq1),
1962 ((-(dx * px1 + dy * py1) + (py * px1 - px * py1) / bq) / p21));
1963 ds1 = if3(bq1_big, (atan2(sqrt(sa1), ca1) / bq1), (s1 * s1 - (d2 + two * (px * dy - py * dx) / bq) / p21));
1964 fvec ds1Neg = fvec(ds1 < Zero);
1965 ds1 = (fvec((!ds1Neg) & (!bq1_big)) & sqrt(ds1)) + (bq1_big & ds1);
1966 }
1967
1968 fvec ss[2], ss1[2], g[2][5], g1[2][5];
1969
1970 ss[0] = s + ds;
1971 ss[1] = s - ds;
1972 ss1[0] = s1 + ds1;
1973 ss1[1] = s1 - ds1;
1974 // std::cout << " ss " << ss[0][0] << " " << ss[1][0] << " " << ss1[0][0] << " " << ss1[1][0] << std::endl;
1975 for (Int_t i = 0; i < 2; i++) {
1976 fvec bs = bq * ss[i];
1977 fvec c = cos(bs), sss = sin(bs);
1978
1979 fvec cB, sB;
1980 const fvec kOvSqr6 = 1. / sqrt(6.);
1981 sB = if3(bq_big, (sss / bq), ((One - bs * kOvSqr6) * (One + bs * kOvSqr6) * ss[i]));
1982 cB = if3(bq_big, ((One - c) / bq), (.5 * sB * bs));
1983
1984 g[i][0] = fP[0] + sB * px + cB * py;
1985 g[i][1] = fP[1] - cB * px + sB * py;
1986 g[i][2] = fP[2] + ss[i] * pz;
1987 g[i][3] = +c * px + sss * py;
1988 g[i][4] = -sss * px + c * py;
1989
1990 bs = bq1 * ss1[i];
1991 c = cos(bs);
1992 sss = sin(bs);
1993
1994 sB = if3(bq1_big, (sss / bq1), ((One - bs * kOvSqr6) * (One + bs * kOvSqr6) * ss1[i]));
1995 cB = if3(bq1_big, ((One - c) / bq1), (.5 * sB * bs));
1996
1997 g1[i][0] = p.fP[0] + sB * px1 + cB * py1;
1998 g1[i][1] = p.fP[1] - cB * px1 + sB * py1;
1999 g1[i][2] = p.fP[2] + ss[i] * pz1;
2000 g1[i][3] = +c * px1 + sss * py1;
2001 g1[i][4] = -sss * px1 + c * py1;
2002 }
2003
2004 DS = ss[0];
2005 DS1 = ss1[0];
2006
2007 fvec dMin = 1.e10;
2008 for (Int_t j = 0; j < 2; j++) {
2009 for (Int_t j1 = 0; j1 < 2; j1++) {
2010 fvec xx = g[j][0] - g1[j1][0];
2011 fvec yy = g[j][1] - g1[j1][1];
2012 fvec zz = g[j][2] - g1[j1][2];
2013 fvec d = xx * xx + yy * yy + zz * zz;
2014
2015 fvec mask = fvec(d < dMin);
2016 DS = (mask & ss[j]) + ((!mask) & DS);
2017 DS1 = (mask & ss1[j]) + ((!mask) & DS1);
2018 dMin = (mask & d) + ((!mask) & dMin);
2019 }
2020 }
2021#if 0
2022 {
2023 fvec x= g[i][0], y= g[i][1], z= g[i][2], ppx= g[i][3], ppy= g[i][4];
2024 fvec x1=g1[i1][0], y1= g1[i1][1], z1= g1[i1][2], ppx1= g1[i1][3], ppy1= g1[i1][4];
2025 fvec dx = x1-x;
2026 fvec dy = y1-y;
2027 fvec dz = z1-z;
2028 fvec a = ppx*ppx1 + ppy*ppy1 + pz*pz1;
2029 fvec b = dx*ppx1 + dy*ppy1 + dz*pz1;
2030 fvec c = dx*ppx + dy*ppy + dz*pz ;
2031 fvec pp2 = ppx*ppx + ppy*ppy + pz*pz;
2032 fvec pp21= ppx1*ppx1 + ppy1*ppy1 + pz1*pz1;
2033 fvec det = pp2*pp21 - a*a;
2034 if( fabs(det)>1.e-8 ){
2035 DS+=(a*b-pp21*c)/det;
2036 DS1+=(a*c-pp2*b)/det;
2037 }
2038 }
2039#endif
2040}
2041
2043{
2044 //* Get dS to another particle for Bz field
2045
2046 fvec px = fP[3];
2047 fvec py = -fP[5];
2048 fvec pz = fP[4];
2049
2050 fvec px1 = p.fP[3];
2051 fvec py1 = -p.fP[5];
2052 fvec pz1 = p.fP[4];
2053
2054 const fvec kCLight = 0.000299792458;
2055
2056 fvec bq = B * fQ * kCLight;
2057 fvec bq1 = B * p.fQ * kCLight;
2058 fvec s = Zero, ds = Zero, s1 = Zero, ds1 = Zero;
2059
2060 const fvec LocalSmall = 1.e-8;
2061
2062 fvec bq_big = fvec(LocalSmall < fabs(bq));
2063 fvec bq1_big = fvec(LocalSmall < fabs(bq1));
2064 {
2065 const fvec two = 2.;
2066 const fvec four = 2.;
2067 fvec dx = (p.fP[0] - fP[0]);
2068 fvec dy = (-p.fP[2] + fP[2]);
2069 fvec d2 = (dx * dx + dy * dy);
2070
2071 fvec p2 = (px * px + py * py);
2072 fvec p21 = (px1 * px1 + py1 * py1);
2073
2074 fvec a = (px * py1 - py * px1);
2075 fvec b = (px * px1 + py * py1);
2076
2077 fvec ldx = bq * bq1 * dx - bq1 * py + bq * py1;
2078 fvec ldy = bq * bq1 * dy + bq1 * px - bq * px1;
2079 fvec l2 = ldx * ldx + ldy * ldy;
2080
2081 fvec cS = bq1 * p2 + bq * bq1 * (dy * px - dx * py) - bq * b;
2082 fvec cS1 = bq * p21 - bq * bq1 * (dy * px1 - dx * py1) - bq1 * b;
2083
2084 fvec ca = bq * bq * bq1 * d2 + two * (cS + bq * bq * (py1 * dx - px1 * dy));
2085 fvec ca1 = bq * bq1 * bq1 * d2 + two * (cS1 - bq1 * bq1 * (py * dx - px * dy));
2086
2087 fvec sa = 4 * l2 * p2 - ca * ca;
2088 fvec sa1 = 4 * l2 * p21 - ca1 * ca1;
2089
2090 const fvec saNeg = fvec(sa < Zero);
2091 sa = (!saNeg) & sa;
2092 const fvec sa1Neg = fvec(sa1 < Zero);
2093 sa1 = (!sa1Neg) & sa1;
2094
2095 s = if3(bq_big, (atan2(bq * (bq1 * (dx * px + dy * py) + a), cS) / bq),
2096 (((dx * px + dy * py) + (py * px1 - px * py1) / bq1) / p2));
2097 ds = if3(bq_big, (atan2(sqrt(sa), ca) / bq), (s * s - (d2 - two * (px1 * dy - py1 * dx) / bq1) / p2));
2098 fvec dsNeg = fvec(ds < Zero);
2099 ds = (fvec((!dsNeg) & (!bq_big)) & sqrt(ds)) + (bq_big & ds);
2100
2101 s1 = if3(bq1_big, (atan2(-bq1 * (bq * (dx * px1 + dy * py1) + a), cS1) / bq1),
2102 ((-(dx * px1 + dy * py1) + (py * px1 - px * py1) / bq) / p21));
2103 ds1 = if3(bq1_big, (atan2(sqrt(sa1), ca1) / bq1), (s1 * s1 - (d2 + two * (px * dy - py * dx) / bq) / p21));
2104 fvec ds1Neg = fvec(ds1 < Zero);
2105 ds1 = (fvec((!ds1Neg) & (!bq1_big)) & sqrt(ds1)) + (bq1_big & ds1);
2106 }
2107
2108 fvec ss[2], ss1[2], g[2][5], g1[2][5];
2109
2110 ss[0] = s + ds;
2111 ss[1] = s - ds;
2112 ss1[0] = s1 + ds1;
2113 ss1[1] = s1 - ds1;
2114 // std::cout << " ss " << ss[0][0] << " " << ss[1][0] << " " << ss1[0][0] << " " << ss1[1][0] << std::endl;
2115 for (Int_t i = 0; i < 2; i++) {
2116 fvec bs = bq * ss[i];
2117 fvec c = cos(bs), sss = sin(bs);
2118
2119 fvec cB, sB;
2120 const fvec kOvSqr6 = 1. / sqrt(6.);
2121 sB = if3(bq_big, (sss / bq), ((One - bs * kOvSqr6) * (One + bs * kOvSqr6) * ss[i]));
2122 cB = if3(bq_big, ((One - c) / bq), (.5 * sB * bs));
2123
2124 g[i][0] = fP[0] + sB * px + cB * py;
2125 g[i][1] = -fP[2] - cB * px + sB * py;
2126 g[i][2] = fP[1] + ss[i] * pz;
2127 g[i][3] = +c * px + sss * py;
2128 g[i][4] = -sss * px + c * py;
2129
2130 bs = bq1 * ss1[i];
2131 c = cos(bs);
2132 sss = sin(bs);
2133
2134 sB = if3(bq1_big, (sss / bq1), ((One - bs * kOvSqr6) * (One + bs * kOvSqr6) * ss1[i]));
2135 cB = if3(bq1_big, ((One - c) / bq1), (.5 * sB * bs));
2136
2137 g1[i][0] = p.fP[0] + sB * px1 + cB * py1;
2138 g1[i][1] = -p.fP[2] - cB * px1 + sB * py1;
2139 g1[i][2] = p.fP[1] + ss[i] * pz1;
2140 g1[i][3] = +c * px1 + sss * py1;
2141 g1[i][4] = -sss * px1 + c * py1;
2142 }
2143
2144 DS = ss[0];
2145 DS1 = ss1[0];
2146
2147 fvec dMin = 1.e10;
2148 for (Int_t j = 0; j < 2; j++) {
2149 for (Int_t j1 = 0; j1 < 2; j1++) {
2150 fvec xx = g[j][0] - g1[j1][0];
2151 fvec yy = g[j][1] - g1[j1][1];
2152 fvec zz = g[j][2] - g1[j1][2];
2153 fvec d = xx * xx + yy * yy + zz * zz;
2154
2155 fvec mask = fvec(d < dMin);
2156 DS = (mask & ss[j]) + ((!mask) & DS);
2157 DS1 = (mask & ss1[j]) + ((!mask) & DS1);
2158 dMin = (mask & d) + ((!mask) & dMin);
2159 }
2160 }
2161}
2162
2164{
2165 //* Transport the particle on dS, output to P[],C[], for CBM field
2166
2167 const fvec* r = fP;
2168 fvec p2 = r[3] * r[3] + r[4] * r[4] + r[5] * r[5];
2169 fvec dS = if3(fabs(p2) > fvec(1.E-4),
2170 ((r[3] * (xyz[0] - r[0]) + r[4] * (xyz[1] - r[1]) + r[5] * (xyz[2] - r[2])) / p2), Zero);
2171
2172 // fvec dS = 0;
2173 //
2174 // if( fQ[0]==0 ){
2175 // dS = GetDStoPointLine( xyz );
2176 // return dS;
2177 // }
2178 //
2179 // fvec fld[3];
2180 // GetFieldValue( fP, fld );
2181 // dS = GetDStoPointBy( fld[1],xyz );
2182
2183 dS = if3(fabs(dS) > 1.E3, Zero, dS);
2184
2185 return dS;
2186}
2187
2189{
2190 fvec p12 = fP[3] * fP[3] + fP[4] * fP[4] + fP[5] * fP[5];
2191 fvec p22 = p.fP[3] * p.fP[3] + p.fP[4] * p.fP[4] + p.fP[5] * p.fP[5];
2192 fvec p1p2 = fP[3] * p.fP[3] + fP[4] * p.fP[4] + fP[5] * p.fP[5];
2193
2194 fvec drp1 = fP[3] * (p.fP[0] - fP[0]) + fP[4] * (p.fP[1] - fP[1]) + fP[5] * (p.fP[2] - fP[2]);
2195 fvec drp2 = p.fP[3] * (p.fP[0] - fP[0]) + p.fP[4] * (p.fP[1] - fP[1]) + p.fP[5] * (p.fP[2] - fP[2]);
2196
2197 fvec detp = p1p2 * p1p2 - p12 * p22;
2198
2199 dS = (drp2 * p1p2 - drp1 * p22) / detp; // TODO put defence against detp = 0
2200 dS1 = (drp2 * p12 - drp1 * p1p2) / detp;
2201}
2202
2204{
2205 //* Transport the particle on dS, output to P[],C[], for CBM field
2206
2207 fvec mTy[2];
2208 fvec mY[2];
2209 fvec mZ[2];
2210
2211 mY[0] = GetY();
2212 mZ[0] = GetZ();
2213 mTy[0] = if3(fabs(GetPz()) > small, GetPy() / GetPz(), 1.);
2214
2215 mY[1] = p.GetY();
2216 mZ[1] = p.GetZ();
2217 mTy[1] = if3(fabs(p.GetPz()) > small, p.GetPy() / p.GetPz(), 1.);
2218
2219 fvec r0[3];
2220 fvec dty = mTy[0] - mTy[1];
2221
2222 r0[2] = if3(fabs(dty) > small, (mTy[0] * mZ[0] - mTy[1] * mZ[1] + mY[1] - mY[0]) / dty, 0.);
2223 r0[1] = mY[0] + mTy[0] * (r0[2] - mZ[0]);
2224 r0[0] = GetX() + GetPx() / GetPz() * (r0[2] - mZ[0]);
2225
2226 dS = GetDStoPointCBM(r0);
2227 dS1 = p.GetDStoPoint(r0);
2228
2229 // if( fQ[0]==0 ){
2230 // GetDStoParticleLine( p, dS, dS1 );
2231 // return;
2232 // }
2233 //
2234 // fvec fld[3];
2235 // GetFieldValue( fP, fld );
2236 //
2237 // GetDStoParticleBy(fld[1],p,dS,dS1);
2238}
2239
2241{
2242 //* Transport the particle on dS, output to P[],C[], for CBM field
2243
2244 if (fQ[0] == 0) {
2245 TransportLine(dS, P, C);
2246 return;
2247 }
2248
2249 const fvec kCLight = 0.000299792458;
2250
2251 fvec c = fQ * kCLight;
2252
2253 // construct coefficients
2254
2255 fvec px = fP[3], py = fP[4], pz = fP[5];
2256
2257 fvec sx = 0, sy = 0, sz = 0, syy = 0, syz = 0, syyy = 0, ssx = 0, ssy = 0, ssz = 0, ssyy = 0, ssyz = 0, ssyyy = 0;
2258
2259 { // get field integrals
2260
2261 fvec fld[3][3];
2262 fvec p0[3], p1[3], p2[3];
2263
2264 // line track approximation
2265
2266 p0[0] = fP[0];
2267 p0[1] = fP[1];
2268 p0[2] = fP[2];
2269
2270 p2[0] = fP[0] + px * dS;
2271 p2[1] = fP[1] + py * dS;
2272 p2[2] = fP[2] + pz * dS;
2273
2274 p1[0] = 0.5 * (p0[0] + p2[0]);
2275 p1[1] = 0.5 * (p0[1] + p2[1]);
2276 p1[2] = 0.5 * (p0[2] + p2[2]);
2277
2278 // first order track approximation
2279 {
2280 GetFieldValue(p0, fld[0]);
2281 GetFieldValue(p1, fld[1]);
2282 GetFieldValue(p2, fld[2]);
2283
2284 fvec ssy1 = (7 * fld[0][1] + 6 * fld[1][1] - fld[2][1]) * c * dS * dS / 96.;
2285 fvec ssy2 = (fld[0][1] + 2 * fld[1][1]) * c * dS * dS / 6.;
2286
2287 p1[0] -= ssy1 * pz;
2288 p1[2] += ssy1 * px;
2289 p2[0] -= ssy2 * pz;
2290 p2[2] += ssy2 * px;
2291 }
2292
2293 GetFieldValue(p0, fld[0]);
2294 GetFieldValue(p1, fld[1]);
2295 GetFieldValue(p2, fld[2]);
2296
2297 for (int iF1 = 0; iF1 < 3; iF1++)
2298 for (int iF2 = 0; iF2 < 3; iF2++)
2299 fld[iF1][iF2] = if3((fabs(fld[iF1][iF2]) > fvec(100.)), Zero, fld[iF1][iF2]);
2300
2301 sx = c * (fld[0][0] + 4 * fld[1][0] + fld[2][0]) * dS / 6.;
2302 sy = c * (fld[0][1] + 4 * fld[1][1] + fld[2][1]) * dS / 6.;
2303 sz = c * (fld[0][2] + 4 * fld[1][2] + fld[2][2]) * dS / 6.;
2304
2305 ssx = c * (fld[0][0] + 2 * fld[1][0]) * dS * dS / 6.;
2306 ssy = c * (fld[0][1] + 2 * fld[1][1]) * dS * dS / 6.;
2307 ssz = c * (fld[0][2] + 2 * fld[1][2]) * dS * dS / 6.;
2308
2309 fvec c2[3][3] = {{5, -4, -1}, {44, 80, -4}, {11, 44, 5}}; // /=360.
2310 fvec cc2[3][3] = {{38, 8, -4}, {148, 208, -20}, {3, 36, 3}}; // /=2520.
2311 for (Int_t n = 0; n < 3; n++)
2312 for (Int_t m = 0; m < 3; m++) {
2313 syz += c2[n][m] * fld[n][1] * fld[m][2];
2314 ssyz += cc2[n][m] * fld[n][1] * fld[m][2];
2315 }
2316
2317 syz *= c * c * dS * dS / 360.;
2318 ssyz *= c * c * dS * dS * dS / 2520.;
2319
2320 syy = c * (fld[0][1] + 4 * fld[1][1] + fld[2][1]) * dS;
2321 syyy = syy * syy * syy / 1296;
2322 syy = syy * syy / 72;
2323
2324 ssyy = (fld[0][1] * (38 * fld[0][1] + 156 * fld[1][1] - fld[2][1])
2325 + fld[1][1] * (208 * fld[1][1] + 16 * fld[2][1]) + fld[2][1] * (3 * fld[2][1]))
2326 * dS * dS * dS * c * c / 2520.;
2327 ssyyy = (fld[0][1]
2328 * (fld[0][1] * (85 * fld[0][1] + 526 * fld[1][1] - 7 * fld[2][1])
2329 + fld[1][1] * (1376 * fld[1][1] + 84 * fld[2][1]) + fld[2][1] * (19 * fld[2][1]))
2330 + fld[1][1] * (fld[1][1] * (1376 * fld[1][1] + 256 * fld[2][1]) + fld[2][1] * (62 * fld[2][1]))
2331 + fld[2][1] * fld[2][1] * (3 * fld[2][1]))
2332 * dS * dS * dS * dS * c * c * c / 90720.;
2333 }
2334
2335 fvec mJ[11];
2336
2337 mJ[0] = dS - ssyy;
2338 mJ[1] = ssx;
2339 mJ[2] = ssyyy - ssy;
2340 mJ[3] = -ssz;
2341 mJ[4] = dS;
2342 mJ[5] = ssx + ssyz;
2343
2344 mJ[6] = 1 - syy;
2345 mJ[7] = sx;
2346 mJ[8] = syyy - sy;
2347 mJ[9] = -sz;
2348 mJ[10] = sx + syz;
2349
2350 P[0] = fP[0] + mJ[0] * px + mJ[1] * py + mJ[2] * pz;
2351 P[1] = fP[1] + mJ[3] * px + mJ[4] * py + mJ[5] * pz;
2352 P[2] = fP[2] - mJ[2] * px - mJ[1] * py + mJ[0] * pz;
2353 P[3] = mJ[6] * px + mJ[7] * py + mJ[8] * pz;
2354 P[4] = mJ[9] * px + py + mJ[10] * pz;
2355 P[5] = -mJ[8] * px - mJ[7] * py + mJ[6] * pz;
2356 P[6] = fP[6];
2357 P[7] = fP[7];
2358
2359 if (C != fC) {
2360 for (int iC = 0; iC < 36; iC++)
2361 C[iC] = fC[iC];
2362 }
2363
2364 multQSQt1(mJ, C);
2365
2366 // fvec mJ[8][8];
2367 // for( Int_t i=0; i<8; i++ ) for( Int_t j=0; j<8; j++) mJ[i][j]=0;
2368 //
2369 // mJ[0][0]=1; mJ[0][1]=0; mJ[0][2]=0; mJ[0][3]=dS-ssyy; mJ[0][4]=ssx; mJ[0][5]=ssyyy-ssy;
2370 // mJ[1][0]=0; mJ[1][1]=1; mJ[1][2]=0; mJ[1][3]=-ssz; mJ[1][4]=dS; mJ[1][5]=ssx+ssyz;
2371 // mJ[2][0]=0; mJ[2][1]=0; mJ[2][2]=1; mJ[2][3]=ssy-ssyyy; mJ[2][4]=-ssx; mJ[2][5]=dS-ssyy;
2372 //
2373 // mJ[3][0]=0; mJ[3][1]=0; mJ[3][2]=0; mJ[3][3]=1-syy; mJ[3][4]=sx; mJ[3][5]=syyy-sy;
2374 // mJ[4][0]=0; mJ[4][1]=0; mJ[4][2]=0; mJ[4][3]=-sz; mJ[4][4]=1; mJ[4][5]=sx+syz;
2375 // mJ[5][0]=0; mJ[5][1]=0; mJ[5][2]=0; mJ[5][3]=sy-syyy; mJ[5][4]=-sx; mJ[5][5]=1-syy;
2376 // mJ[6][6] = mJ[7][7] = 1;
2377 //
2378 // P[0] = fP[0] + mJ[0][3]*px + mJ[0][4]*py + mJ[0][5]*pz;
2379 // P[1] = fP[1] + mJ[1][3]*px + mJ[1][4]*py + mJ[1][5]*pz;
2380 // P[2] = fP[2] + mJ[2][3]*px + mJ[2][4]*py + mJ[2][5]*pz;
2381 // P[3] = mJ[3][3]*px + mJ[3][4]*py + mJ[3][5]*pz;
2382 // P[4] = mJ[4][3]*px + mJ[4][4]*py + mJ[4][5]*pz;
2383 // P[5] = mJ[5][3]*px + mJ[5][4]*py + mJ[5][5]*pz;
2384 // P[6] = fP[6];
2385 // P[7] = fP[7];
2386
2387 // MultQSQt( mJ, fC, C);
2388}
2389
2391{
2392 const fvec A00 = S[0] + S[6] * J[0] + S[10] * J[1] + S[15] * J[2];
2393 const fvec A10 = S[1] + S[7] * J[0] + S[11] * J[1] + S[16] * J[2];
2394 const fvec A20 = S[3] + S[8] * J[0] + S[12] * J[1] + S[17] * J[2];
2395 const fvec A30 = S[6] + S[9] * J[0] + S[13] * J[1] + S[18] * J[2];
2396 const fvec A40 = S[10] + S[13] * J[0] + S[14] * J[1] + S[19] * J[2];
2397 const fvec A50 = S[15] + S[18] * J[0] + S[19] * J[1] + S[20] * J[2];
2398 const fvec A60 = S[21] + S[24] * J[0] + S[25] * J[1] + S[26] * J[2];
2399 const fvec A70 = S[28] + S[31] * J[0] + S[32] * J[1] + S[33] * J[2];
2400
2401 S[0] = A00 + J[0] * A30 + J[1] * A40 + J[2] * A50;
2402 S[1] = A10 + J[3] * A30 + J[4] * A40 + J[5] * A50;
2403 S[3] = A20 - J[2] * A30 - J[1] * A40 + J[0] * A50;
2404 S[6] = J[6] * A30 + J[7] * A40 + J[8] * A50;
2405 S[10] = J[9] * A30 + A40 + J[10] * A50;
2406 S[15] = -J[8] * A30 - J[7] * A40 + J[6] * A50;
2407 S[21] = A60;
2408 S[28] = A70;
2409
2410 // const fvec A01 = S[1 ]+S[6 ]*J[3]+S[10]*J[4]+S[15]*J[5];
2411 const fvec A11 = S[2] + S[7] * J[3] + S[11] * J[4] + S[16] * J[5];
2412 const fvec A21 = S[4] + S[8] * J[3] + S[12] * J[4] + S[17] * J[5];
2413 const fvec A31 = S[7] + S[9] * J[3] + S[13] * J[4] + S[18] * J[5];
2414 const fvec A41 = S[11] + S[13] * J[3] + S[14] * J[4] + S[19] * J[5];
2415 const fvec A51 = S[16] + S[18] * J[3] + S[19] * J[4] + S[20] * J[5];
2416 const fvec A61 = S[22] + S[24] * J[3] + S[25] * J[4] + S[26] * J[5];
2417 const fvec A71 = S[29] + S[31] * J[3] + S[32] * J[4] + S[33] * J[5];
2418
2419 S[2] = A11 + J[3] * A31 + J[4] * A41 + J[5] * A51;
2420 S[4] = A21 - J[2] * A31 - J[1] * A41 + J[0] * A51;
2421 S[7] = J[6] * A31 + J[7] * A41 + J[8] * A51;
2422 S[11] = J[9] * A31 + A41 + J[10] * A51;
2423 S[16] = -J[8] * A31 - J[7] * A41 + J[6] * A51;
2424 S[22] = A61;
2425 S[29] = A71;
2426
2427 // const fvec A02 = S[3 ]+S[6 ]*J[2][3]+S[10]*J[2][4]+S[15]*J[2][5];
2428 // const fvec A12 = S[4 ]+S[7 ]*J[2][3]+S[11]*J[2][4]+S[16]*J[2][5];
2429 const fvec A22 = S[5] - S[8] * J[2] - S[12] * J[1] + S[17] * J[0];
2430 const fvec A32 = S[8] - S[9] * J[2] - S[13] * J[1] + S[18] * J[0];
2431 const fvec A42 = S[12] - S[13] * J[2] - S[14] * J[1] + S[19] * J[0];
2432 const fvec A52 = S[17] - S[18] * J[2] - S[19] * J[1] + S[20] * J[0];
2433 const fvec A62 = S[23] - S[24] * J[2] - S[25] * J[1] + S[26] * J[0];
2434 const fvec A72 = S[30] - S[31] * J[2] - S[32] * J[1] + S[33] * J[0];
2435
2436 S[5] = A22 - J[2] * A32 - J[1] * A42 + J[0] * A52;
2437 S[8] = J[6] * A32 + J[7] * A42 + J[8] * A52;
2438 S[12] = J[9] * A32 + A42 + J[10] * A52;
2439 S[17] = -J[8] * A32 - J[7] * A42 + J[6] * A52;
2440 S[23] = A62;
2441 S[30] = A72;
2442
2443 // const fvec A03 = S[6] *J[6]+S[10]*J[7]+S[15]*J[8];
2444 // const fvec A13 = S[7] *J[6]+S[11]*J[7]+S[16]*J[8];
2445 // const fvec A23 = S[8] *J[6]+S[12]*J[7]+S[17]*J[8];
2446 const fvec A33 = S[9] * J[6] + S[13] * J[7] + S[18] * J[8];
2447 const fvec A43 = S[13] * J[6] + S[14] * J[7] + S[19] * J[8];
2448 const fvec A53 = S[18] * J[6] + S[19] * J[7] + S[20] * J[8];
2449 const fvec A63 = S[24] * J[6] + S[25] * J[7] + S[26] * J[8];
2450 const fvec A73 = S[31] * J[6] + S[32] * J[7] + S[33] * J[8];
2451
2452 // const fvec A04 = S[6] *J[9]+S[10]*J[4][4]+S[15]*J[10];
2453 // const fvec A14 = S[7] *J[9]+S[11]*J[4][4]+S[16]*J[10];
2454 // const fvec A24 = S[8] *J[9]+S[12]*J[4][4]+S[17]*J[10];
2455 const fvec A34 = S[9] * J[9] + S[13] + S[18] * J[10];
2456 const fvec A44 = S[13] * J[9] + S[14] + S[19] * J[10];
2457 const fvec A54 = S[18] * J[9] + S[19] + S[20] * J[10];
2458 const fvec A64 = S[24] * J[9] + S[25] + S[26] * J[10];
2459 const fvec A74 = S[31] * J[9] + S[32] + S[33] * J[10];
2460
2461 // const fvec A05 = S[6] *J[5][3]+S[10]*J[5][4]+S[15]*J[6];
2462 // const fvec A15 = S[7] *J[5][3]+S[11]*J[5][4]+S[16]*J[6];
2463 // const fvec A25 = S[8] *J[5][3]+S[12]*J[5][4]+S[17]*J[6];
2464 const fvec A35 = -S[9] * J[8] - S[13] * J[7] + S[18] * J[6];
2465 const fvec A45 = -S[13] * J[8] - S[14] * J[7] + S[19] * J[6];
2466 const fvec A55 = -S[18] * J[8] - S[19] * J[7] + S[20] * J[6];
2467 const fvec A65 = -S[24] * J[8] - S[25] * J[7] + S[26] * J[6];
2468 const fvec A75 = -S[31] * J[8] - S[32] * J[7] + S[33] * J[6];
2469
2470 S[9] = J[6] * A33 + J[7] * A43 + J[8] * A53;
2471 S[13] = J[9] * A33 + A43 + J[10] * A53;
2472 S[18] = -J[8] * A33 - J[7] * A43 + J[6] * A53;
2473 S[24] = A63;
2474 S[31] = A73;
2475
2476 S[14] = J[9] * A34 + A44 + J[10] * A54;
2477 S[19] = -J[8] * A34 - J[7] * A44 + J[6] * A54;
2478 S[25] = A64;
2479 S[32] = A74;
2480
2481 S[20] = -J[8] * A35 - J[7] * A45 + J[6] * A55;
2482 S[26] = A65;
2483 S[33] = A75;
2484
2485 // S[27] = S27;
2486 // S[34] = S34;
2487 // S[35] = S35;
2488}
2489
2491{
2492 //* Transport the particle on dS, output to P[],C[], for Bz field
2493
2494 const fvec kCLight = 0.000299792458;
2495 b = b * fQ * kCLight;
2496 fvec bs = b * t;
2497 fvec s = sin(bs), c = cos(bs);
2498 fvec sB, cB;
2499
2500 const fvec kOvSqr6 = 1. / sqrt(6.);
2501 const fvec LocalSmall = 1.e-10;
2502
2503 sB = if3(fvec(LocalSmall < fabs(bs)), (s / b), ((One - bs * kOvSqr6) * (One + bs * kOvSqr6) * t));
2504 cB = if3(fvec(LocalSmall < fabs(bs)), ((One - c) / b), (.5 * sB * bs));
2505
2506 fvec px = fP[3];
2507 fvec py = fP[4];
2508 fvec pz = fP[5];
2509
2510 p[0] = fP[0] + sB * px + cB * py;
2511 p[1] = fP[1] - cB * px + sB * py;
2512 p[2] = fP[2] + t * pz;
2513 p[3] = c * px + s * py;
2514 p[4] = -s * px + c * py;
2515 p[5] = fP[5];
2516 p[6] = fP[6];
2517 p[7] = fP[7];
2518
2519 /*
2520 fvec mJ[8][8] = { {1,0,0, sB, cB, 0, 0, 0 },
2521 {0,1,0, -cB, sB, 0, 0, 0 },
2522 {0,0,1, 0, 0, t, 0, 0 },
2523 {0,0,0, c, s, 0, 0, 0 },
2524 {0,0,0, -s, c, 0, 0, 0 },
2525 {0,0,0, 0, 0, 1, 0, 0 },
2526 {0,0,0, 0, 0, 0, 1, 0 },
2527 {0,0,0, 0, 0, 0, 0, 1 } };
2528 fvec mA[8][8];
2529 for( Int_t k=0,i=0; i<8; i++)
2530 for( Int_t j=0; j<=i; j++, k++ ) mA[i][j] = mA[j][i] = fC[k];
2531
2532 fvec mJC[8][8];
2533 for( Int_t i=0; i<8; i++ )
2534 for( Int_t j=0; j<8; j++ ){
2535 mJC[i][j]=0;
2536 for( Int_t k=0; k<8; k++ ) mJC[i][j]+=mJ[i][k]*mA[k][j];
2537 }
2538
2539 for( Int_t k=0,i=0; i<8; i++)
2540 for( Int_t j=0; j<=i; j++, k++ ){
2541 e[k] = 0;
2542 for( Int_t l=0; l<8; l++ ) e[k]+=mJC[i][l]*mJ[j][l];
2543 }
2544
2545 return;
2546 */
2547
2548 fvec c6 = fC[6], c7 = fC[7], c8 = fC[8], c17 = fC[17], c18 = fC[18], c24 = fC[24], c31 = fC[31];
2549
2550 fvec cBC13 = cB * fC[13], mJC13 = c7 - cB * fC[9] + sB * fC[13], mJC14 = fC[11] - cBC13 + sB * fC[14],
2551 mJC23 = c8 + t * c18, mJC24 = fC[12] + t * fC[19], mJC33 = c * fC[9] + s * fC[13],
2552 mJC34 = c * fC[13] + s * fC[14], mJC43 = -s * fC[9] + c * fC[13], mJC44 = -s * fC[13] + c * fC[14];
2553
2554 e[0] = fC[0] + 2 * (sB * c6 + cB * fC[10]) + (sB * fC[9] + 2 * cBC13) * sB + cB * cB * fC[14];
2555 e[1] = fC[1] - cB * c6 + sB * fC[10] + mJC13 * sB + mJC14 * cB;
2556 e[2] = fC[2] - cB * c7 + sB * fC[11] - mJC13 * cB + mJC14 * sB;
2557 e[3] = fC[3] + t * fC[15] + mJC23 * sB + mJC24 * cB;
2558 e[4] = fC[4] + t * fC[16] - mJC23 * cB + mJC24 * sB;
2559
2560 e[15] = fC[15] + c18 * sB + fC[19] * cB;
2561 e[16] = fC[16] - c18 * cB + fC[19] * sB;
2562 e[17] = c17 + fC[20] * t;
2563 e[18] = c18 * c + fC[19] * s;
2564 e[19] = -c18 * s + fC[19] * c;
2565
2566 e[5] = fC[5] + (c17 + e[17]) * t;
2567
2568 e[6] = c * c6 + s * fC[10] + mJC33 * sB + mJC34 * cB;
2569 e[7] = c * c7 + s * fC[11] - mJC33 * cB + mJC34 * sB;
2570 e[8] = c * c8 + s * fC[12] + e[18] * t;
2571 e[9] = mJC33 * c + mJC34 * s;
2572 e[10] = -s * c6 + c * fC[10] + mJC43 * sB + mJC44 * cB;
2573
2574 e[11] = -s * c7 + c * fC[11] - mJC43 * cB + mJC44 * sB;
2575 e[12] = -s * c8 + c * fC[12] + e[19] * t;
2576 e[13] = mJC43 * c + mJC44 * s;
2577 e[14] = -mJC43 * s + mJC44 * c;
2578 e[20] = fC[20];
2579 e[21] = fC[21] + fC[25] * cB + c24 * sB;
2580 e[22] = fC[22] - c24 * cB + fC[25] * sB;
2581 e[23] = fC[23] + fC[26] * t;
2582 e[24] = c * c24 + s * fC[25];
2583 e[25] = c * fC[25] - c24 * s;
2584 e[26] = fC[26];
2585 e[27] = fC[27];
2586 e[28] = fC[28] + fC[32] * cB + c31 * sB;
2587 e[29] = fC[29] - c31 * cB + fC[32] * sB;
2588 e[30] = fC[30] + fC[33] * t;
2589 e[31] = c * c31 + s * fC[32];
2590 e[32] = c * fC[32] - s * c31;
2591 e[33] = fC[33];
2592 e[34] = fC[34];
2593 e[35] = fC[35];
2594}
2595
2597{
2598 //* Calculate distance from vertex [cm]
2599
2600 return GetDistanceFromVertex(Vtx.fP);
2601}
2602
2604{
2605 //* Calculate distance from vertex [cm]
2606
2607 fvec mP[8], mC[36];
2608 Transport(GetDStoPoint(vtx), mP, mC);
2609 fvec d[3] = {vtx[0] - mP[0], vtx[1] - mP[1], vtx[2] - mP[2]};
2610 return sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
2611}
2612
2614{
2615 //* Calculate distance to other particle [cm]
2616
2617 fvec dS, dS1;
2618 GetDStoParticle(p, dS, dS1);
2619 fvec mP[8], mC[36], mP1[8], mC1[36];
2620 Transport(dS, mP, mC);
2621 p.Transport(dS1, mP1, mC1);
2622 fvec dx = mP[0] - mP1[0];
2623 fvec dy = mP[1] - mP1[1];
2624 fvec dz = mP[2] - mP1[2];
2625 return sqrt(dx * dx + dy * dy + dz * dz);
2626}
2627
2629{
2630 //* Calculate sqrt(Chi2/ndf) deviation from vertex
2631
2632 return GetDeviationFromVertex(Vtx.fP, Vtx.fC);
2633}
2634
2636{
2637 //* Calculate sqrt(Chi2/ndf) deviation from vertex
2638 //* v = [xyz], Cv=[Cxx,Cxy,Cyy,Cxz,Cyz,Czz]-covariance matrix
2639
2640 fvec mP[8];
2641 fvec mC[36];
2642
2643 Transport(GetDStoPoint(v), mP, mC);
2644
2645 fvec d[3] = {v[0] - mP[0], v[1] - mP[1], v[2] - mP[2]};
2646
2647 fvec sigmaS =
2648 .1 + 10. * sqrt((d[0] * d[0] + d[1] * d[1] + d[2] * d[2]) / (mP[3] * mP[3] + mP[4] * mP[4] + mP[5] * mP[5]));
2649
2650 fvec h[3] = {mP[3] * sigmaS, mP[4] * sigmaS, mP[5] * sigmaS};
2651
2652 fvec mSi[6] = {mC[0] + h[0] * h[0], mC[1] + h[1] * h[0], mC[2] + h[1] * h[1],
2653 mC[3] + h[2] * h[0], mC[4] + h[2] * h[1], mC[5] + h[2] * h[2]};
2654
2655 if (Cv) {
2656 mSi[0] += Cv[0];
2657 mSi[1] += Cv[1];
2658 mSi[2] += Cv[2];
2659 mSi[3] += Cv[3];
2660 mSi[4] += Cv[4];
2661 mSi[5] += Cv[5];
2662 }
2663
2664 fvec mS[6];
2665
2666 mS[0] = mSi[2] * mSi[5] - mSi[4] * mSi[4];
2667 mS[1] = mSi[3] * mSi[4] - mSi[1] * mSi[5];
2668 mS[2] = mSi[0] * mSi[5] - mSi[3] * mSi[3];
2669 mS[3] = mSi[1] * mSi[4] - mSi[2] * mSi[3];
2670 mS[4] = mSi[1] * mSi[3] - mSi[0] * mSi[4];
2671 mS[5] = mSi[0] * mSi[2] - mSi[1] * mSi[1];
2672
2673 fvec s = (mSi[0] * mS[0] + mSi[1] * mS[1] + mSi[3] * mS[3]);
2674 s = if3(fvec(fabs(s) > 1.E-8), One / s, Zero);
2675
2676 return sqrt(fabs(s
2677 * ((mS[0] * d[0] + mS[1] * d[1] + mS[3] * d[2]) * d[0]
2678 + (mS[1] * d[0] + mS[2] * d[1] + mS[4] * d[2]) * d[1]
2679 + (mS[3] * d[0] + mS[4] * d[1] + mS[5] * d[2]) * d[2]))
2680 / 2);
2681}
2682
2684{
2685 //* Calculate sqrt(Chi2/ndf) deviation from other particle
2686
2687 fvec dS, dS1;
2688 GetDStoParticle(p, dS, dS1);
2689 fvec mP1[8], mC1[36];
2690 p.Transport(dS1, mP1, mC1);
2691
2692 fvec d[3] = {fP[0] - mP1[0], fP[1] - mP1[1], fP[2] - mP1[2]};
2693
2694 fvec sigmaS =
2695 .1
2696 + 10. * sqrt((d[0] * d[0] + d[1] * d[1] + d[2] * d[2]) / (mP1[3] * mP1[3] + mP1[4] * mP1[4] + mP1[5] * mP1[5]));
2697
2698 fvec h[3] = {mP1[3] * sigmaS, mP1[4] * sigmaS, mP1[5] * sigmaS};
2699
2700 mC1[0] += h[0] * h[0];
2701 mC1[1] += h[1] * h[0];
2702 mC1[2] += h[1] * h[1];
2703 mC1[3] += h[2] * h[0];
2704 mC1[4] += h[2] * h[1];
2705 mC1[5] += h[2] * h[2];
2706
2707 return GetDeviationFromVertex(mP1, mC1) * sqrt(2. / 1.);
2708}
2709
2711{
2712 //* Subtract the particle from the vertex
2713
2714 fvec m[8];
2715 fvec mCm[36];
2716
2717 if (Vtx.fIsLinearized) {
2718 GetMeasurement(Vtx.fVtxGuess, m, mCm);
2719 } else {
2720 GetMeasurement(Vtx.fP, m, mCm);
2721 }
2722
2723 fvec mV[6];
2724
2725 mV[0] = mCm[0];
2726 mV[1] = mCm[1];
2727 mV[2] = mCm[2];
2728 mV[3] = mCm[3];
2729 mV[4] = mCm[4];
2730 mV[5] = mCm[5];
2731
2732 //*
2733
2734 fvec mS[6];
2735 {
2736 fvec mSi[6] = {mV[0] - Vtx.fC[0], mV[1] - Vtx.fC[1], mV[2] - Vtx.fC[2],
2737 mV[3] - Vtx.fC[3], mV[4] - Vtx.fC[4], mV[5] - Vtx.fC[5]};
2738
2739 mS[0] = mSi[2] * mSi[5] - mSi[4] * mSi[4];
2740 mS[1] = mSi[3] * mSi[4] - mSi[1] * mSi[5];
2741 mS[2] = mSi[0] * mSi[5] - mSi[3] * mSi[3];
2742 mS[3] = mSi[1] * mSi[4] - mSi[2] * mSi[3];
2743 mS[4] = mSi[1] * mSi[3] - mSi[0] * mSi[4];
2744 mS[5] = mSi[0] * mSi[2] - mSi[1] * mSi[1];
2745
2746 fvec s = (mSi[0] * mS[0] + mSi[1] * mS[1] + mSi[3] * mS[3]);
2747 s = if3(fvec(fabs(s) > small), One / s, Zero);
2748 mS[0] *= s;
2749 mS[1] *= s;
2750 mS[2] *= s;
2751 mS[3] *= s;
2752 mS[4] *= s;
2753 mS[5] *= s;
2754 }
2755
2756 //* Residual (measured - estimated)
2757
2758 fvec zeta[3] = {m[0] - Vtx.fP[0], m[1] - Vtx.fP[1], m[2] - Vtx.fP[2]};
2759
2760 //* mCHt = mCH' - D'
2761
2762 fvec mCHt0[3], mCHt1[3], mCHt2[3];
2763
2764 mCHt0[0] = Vtx.fC[0];
2765 mCHt1[0] = Vtx.fC[1];
2766 mCHt2[0] = Vtx.fC[3];
2767 mCHt0[1] = Vtx.fC[1];
2768 mCHt1[1] = Vtx.fC[2];
2769 mCHt2[1] = Vtx.fC[4];
2770 mCHt0[2] = Vtx.fC[3];
2771 mCHt1[2] = Vtx.fC[4];
2772 mCHt2[2] = Vtx.fC[5];
2773
2774 //* Kalman gain K = mCH'*S
2775
2776 fvec k0[3], k1[3], k2[3];
2777
2778 for (Int_t i = 0; i < 3; ++i) {
2779 k0[i] = mCHt0[i] * mS[0] + mCHt1[i] * mS[1] + mCHt2[i] * mS[3];
2780 k1[i] = mCHt0[i] * mS[1] + mCHt1[i] * mS[2] + mCHt2[i] * mS[4];
2781 k2[i] = mCHt0[i] * mS[3] + mCHt1[i] * mS[4] + mCHt2[i] * mS[5];
2782 }
2783
2784 //* New estimation of the vertex position r += K*zeta
2785
2786 fvec dChi2 = -(mS[0] * zeta[0] + mS[1] * zeta[1] + mS[3] * zeta[2]) * zeta[0]
2787 - (mS[1] * zeta[0] + mS[2] * zeta[1] + mS[4] * zeta[2]) * zeta[1]
2788 - (mS[3] * zeta[0] + mS[4] * zeta[1] + mS[5] * zeta[2]) * zeta[2];
2789
2790 // fvec mask = fvec( (Vtx.fChi2 - dChi2) < Zero ); //TODO Check and correct!
2791 fvec mask = fvec(One > Zero); // TODO Check and correct!
2792
2793 for (Int_t i = 0; i < 3; ++i)
2794 Vtx.fP[i] -= (mask & (k0[i] * zeta[0] + k1[i] * zeta[1] + k2[i] * zeta[2]));
2795 //* New covariance matrix C -= K*(mCH')'
2796
2797 for (Int_t i = 0, k = 0; i < 3; ++i) {
2798 for (Int_t j = 0; j <= i; ++j, ++k)
2799 Vtx.fC[k] += (mask & (k0[i] * mCHt0[j] + k1[i] * mCHt1[j] + k2[i] * mCHt2[j]));
2800 }
2801
2802 //* Calculate Chi^2
2803
2804 Vtx.fNDF -= 2; // TODO Check and correct!
2805 Vtx.fChi2 += (mask & dChi2);
2806}
2807
2809{
2810 //* Subtract the particle from the mother particle
2811
2812 fvec m[8];
2813 fvec mV[36];
2814
2815 if (Vtx.fIsLinearized) {
2816 GetMeasurement(Vtx.fVtxGuess, m, mV, 0);
2817 } else {
2818 GetMeasurement(Vtx.fP, m, mV);
2819 }
2820
2821 fvec mS[6] = {mV[0] - Vtx.fC[0], mV[1] - Vtx.fC[1], mV[2] - Vtx.fC[2],
2822 mV[3] - Vtx.fC[3], mV[4] - Vtx.fC[4], mV[5] - Vtx.fC[5]};
2823 InvertCholetsky3(mS);
2824
2825 //* Residual (measured - estimated)
2826
2827 fvec zeta[3] = {m[0] - Vtx.fP[0], m[1] - Vtx.fP[1], m[2] - Vtx.fP[2]};
2828
2829 //* CHt = CH' - D'
2830
2831 fvec mCHt0[7], mCHt1[7], mCHt2[7];
2832
2833 mCHt0[0] = mV[0];
2834 mCHt1[0] = mV[1];
2835 mCHt2[0] = mV[3];
2836 mCHt0[1] = mV[1];
2837 mCHt1[1] = mV[2];
2838 mCHt2[1] = mV[4];
2839 mCHt0[2] = mV[3];
2840 mCHt1[2] = mV[4];
2841 mCHt2[2] = mV[5];
2842 mCHt0[3] = Vtx.fC[6] - mV[6];
2843 mCHt1[3] = Vtx.fC[7] - mV[7];
2844 mCHt2[3] = Vtx.fC[8] - mV[8];
2845 mCHt0[4] = Vtx.fC[10] - mV[10];
2846 mCHt1[4] = Vtx.fC[11] - mV[11];
2847 mCHt2[4] = Vtx.fC[12] - mV[12];
2848 mCHt0[5] = Vtx.fC[15] - mV[15];
2849 mCHt1[5] = Vtx.fC[16] - mV[16];
2850 mCHt2[5] = Vtx.fC[17] - mV[17];
2851 mCHt0[6] = Vtx.fC[21] - mV[21];
2852 mCHt1[6] = Vtx.fC[22] - mV[22];
2853 mCHt2[6] = Vtx.fC[23] - mV[23];
2854
2855 //* Kalman gain K = mCH'*S
2856
2857 fvec k0[7], k1[7], k2[7];
2858
2859 for (Int_t i = 0; i < 7; ++i) {
2860 k0[i] = mCHt0[i] * mS[0] + mCHt1[i] * mS[1] + mCHt2[i] * mS[3];
2861 k1[i] = mCHt0[i] * mS[1] + mCHt1[i] * mS[2] + mCHt2[i] * mS[4];
2862 k2[i] = mCHt0[i] * mS[3] + mCHt1[i] * mS[4] + mCHt2[i] * mS[5];
2863 }
2864
2865 //* Add the daughter momentum to the particle momentum
2866
2867 Vtx.fP[3] -= m[3];
2868 Vtx.fP[4] -= m[4];
2869 Vtx.fP[5] -= m[5];
2870 Vtx.fP[6] -= m[6];
2871
2872 Vtx.fC[9] -= mV[9];
2873 Vtx.fC[13] -= mV[13];
2874 Vtx.fC[14] -= mV[14];
2875 Vtx.fC[18] -= mV[18];
2876 Vtx.fC[19] -= mV[19];
2877 Vtx.fC[20] -= mV[20];
2878 Vtx.fC[24] -= mV[24];
2879 Vtx.fC[25] -= mV[25];
2880 Vtx.fC[26] -= mV[26];
2881 Vtx.fC[27] -= mV[27];
2882
2883 //* New estimation of the vertex position r += K*zeta
2884
2885 for (Int_t i = 0; i < 3; ++i)
2886 Vtx.fP[i] = m[i] - (k0[i] * zeta[0] + k1[i] * zeta[1] + k2[i] * zeta[2]);
2887 for (Int_t i = 3; i < 7; ++i)
2888 Vtx.fP[i] = Vtx.fP[i] - (k0[i] * zeta[0] + k1[i] * zeta[1] + k2[i] * zeta[2]);
2889
2890 //* New covariance matrix C -= K*(mCH')'
2891
2892 fvec ffC[28] = {-mV[0], -mV[1], -mV[2], -mV[3], -mV[4], -mV[5], mV[6],
2893 mV[7], mV[8], Vtx.fC[9], mV[10], mV[11], mV[12], Vtx.fC[13],
2894 Vtx.fC[14], mV[15], mV[16], mV[17], Vtx.fC[18], Vtx.fC[19], Vtx.fC[20],
2895 mV[21], mV[22], mV[23], Vtx.fC[24], Vtx.fC[25], Vtx.fC[26], Vtx.fC[27]};
2896
2897 for (Int_t i = 0, k = 0; i < 7; ++i) {
2898 for (Int_t j = 0; j <= i; ++j, ++k) {
2899 Vtx.fC[k] = ffC[k] + (k0[i] * mCHt0[j] + k1[i] * mCHt1[j] + k2[i] * mCHt2[j]);
2900 }
2901 }
2902
2903 //* Calculate Chi^2
2904 Vtx.fNDF -= 2;
2905 Vtx.fQ -= GetQ();
2906 Vtx.fSFromDecay = 0;
2907 Vtx.fChi2 -= ((mS[0] * zeta[0] + mS[1] * zeta[1] + mS[3] * zeta[2]) * zeta[0]
2908 + (mS[1] * zeta[0] + mS[2] * zeta[1] + mS[4] * zeta[2]) * zeta[1]
2909 + (mS[3] * zeta[0] + mS[4] * zeta[1] + mS[5] * zeta[2]) * zeta[2]);
2910}
2911
2913{
2914 //* Transport the particle as a straight line
2915
2916 P[0] = fP[0] + dS * fP[3];
2917 P[1] = fP[1] + dS * fP[4];
2918 P[2] = fP[2] + dS * fP[5];
2919 P[3] = fP[3];
2920 P[4] = fP[4];
2921 P[5] = fP[5];
2922 P[6] = fP[6];
2923 P[7] = fP[7];
2924
2925 fvec c6 = fC[6] + dS * fC[9];
2926 fvec c11 = fC[11] + dS * fC[14];
2927 fvec c17 = fC[17] + dS * fC[20];
2928 fvec sc13 = dS * fC[13];
2929 fvec sc18 = dS * fC[18];
2930 fvec sc19 = dS * fC[19];
2931
2932 C[0] = fC[0] + dS * (fC[6] + c6);
2933 C[2] = fC[2] + dS * (fC[11] + c11);
2934 C[5] = fC[5] + dS * (fC[17] + c17);
2935
2936 C[7] = fC[7] + sc13;
2937 C[8] = fC[8] + sc18;
2938 C[9] = fC[9];
2939
2940 C[12] = fC[12] + sc19;
2941
2942 C[1] = fC[1] + dS * (fC[10] + C[7]);
2943 C[3] = fC[3] + dS * (fC[15] + C[8]);
2944 C[4] = fC[4] + dS * (fC[16] + C[12]);
2945 C[6] = c6;
2946
2947 C[10] = fC[10] + sc13;
2948 C[11] = c11;
2949
2950 C[13] = fC[13];
2951 C[14] = fC[14];
2952 C[15] = fC[15] + sc18;
2953 C[16] = fC[16] + sc19;
2954 C[17] = c17;
2955
2956 C[18] = fC[18];
2957 C[19] = fC[19];
2958 C[20] = fC[20];
2959 C[21] = fC[21] + dS * fC[24];
2960 C[22] = fC[22] + dS * fC[25];
2961 C[23] = fC[23] + dS * fC[26];
2962
2963 C[24] = fC[24];
2964 C[25] = fC[25];
2965 C[26] = fC[26];
2966 C[27] = fC[27];
2967 C[28] = fC[28] + dS * fC[31];
2968 C[29] = fC[29] + dS * fC[32];
2969 C[30] = fC[30] + dS * fC[33];
2970
2971 C[31] = fC[31];
2972 C[32] = fC[32];
2973 C[33] = fC[33];
2974 C[34] = fC[34];
2975 C[35] = fC[35];
2976}
2977
2979 const KFParticleBaseSIMD& daughter2,
2980 fvec Bz)
2981{
2982 //* Create gamma
2983
2984 const KFParticleBaseSIMD* daughters[2] = {&daughter1, &daughter2};
2985
2986 fvec v0[3];
2987
2988 if (!fIsLinearized) {
2989 fvec ds, ds1;
2990 fvec m[8];
2991 fvec mCd[36];
2992 daughter1.GetDStoParticle(daughter2, ds, ds1);
2993 daughter1.Transport(ds, m, mCd);
2994 fP[0] = m[0];
2995 fP[1] = m[1];
2996 fP[2] = m[2];
2997 daughter2.Transport(ds1, m, mCd);
2998 fP[0] = .5 * (fP[0] + m[0]);
2999 fP[1] = .5 * (fP[1] + m[1]);
3000 fP[2] = .5 * (fP[2] + m[2]);
3001 } else {
3002 fP[0] = fVtxGuess[0];
3003 fP[1] = fVtxGuess[1];
3004 fP[2] = fVtxGuess[2];
3005 }
3006
3007 fvec daughterP[2][8], daughterC[2][36];
3008 fvec vtxMom[2][3];
3009
3010 int nIter = fIsLinearized ? 1 : 2;
3011
3012 for (int iter = 0; iter < nIter; iter++) {
3013
3014 v0[0] = fP[0];
3015 v0[1] = fP[1];
3016 v0[2] = fP[2];
3017
3019 fSFromDecay = 0;
3020 fP[0] = v0[0];
3021 fP[1] = v0[1];
3022 fP[2] = v0[2];
3023 fP[3] = 0;
3024 fP[4] = 0;
3025 fP[5] = 0;
3026 fP[6] = 0;
3027 fP[7] = 0;
3028
3029 // fit daughters to the vertex guess
3030
3031 {
3032 for (int id = 0; id < 2; id++) {
3033
3034 fvec* p = daughterP[id];
3035 fvec* mC = daughterC[id];
3036
3037 daughters[id]->GetMeasurement(v0, p, mC);
3038
3039 fvec mAi[6];
3040 InvertSym3(mC, mAi);
3041
3042 fvec mB[3][3];
3043
3044 mB[0][0] = mC[6] * mAi[0] + mC[7] * mAi[1] + mC[8] * mAi[3];
3045 mB[0][1] = mC[6] * mAi[1] + mC[7] * mAi[2] + mC[8] * mAi[4];
3046 mB[0][2] = mC[6] * mAi[3] + mC[7] * mAi[4] + mC[8] * mAi[5];
3047
3048 mB[1][0] = mC[10] * mAi[0] + mC[11] * mAi[1] + mC[12] * mAi[3];
3049 mB[1][1] = mC[10] * mAi[1] + mC[11] * mAi[2] + mC[12] * mAi[4];
3050 mB[1][2] = mC[10] * mAi[3] + mC[11] * mAi[4] + mC[12] * mAi[5];
3051
3052 mB[2][0] = mC[15] * mAi[0] + mC[16] * mAi[1] + mC[17] * mAi[3];
3053 mB[2][1] = mC[15] * mAi[1] + mC[16] * mAi[2] + mC[17] * mAi[4];
3054 mB[2][2] = mC[15] * mAi[3] + mC[16] * mAi[4] + mC[17] * mAi[5];
3055
3056 fvec z[3] = {v0[0] - p[0], v0[1] - p[1], v0[2] - p[2]};
3057
3058 vtxMom[id][0] = p[3] + mB[0][0] * z[0] + mB[0][1] * z[1] + mB[0][2] * z[2];
3059 vtxMom[id][1] = p[4] + mB[1][0] * z[0] + mB[1][1] * z[1] + mB[1][2] * z[2];
3060 vtxMom[id][2] = p[5] + mB[2][0] * z[0] + mB[2][1] * z[1] + mB[2][2] * z[2];
3061
3062 daughters[id]->Transport(daughters[id]->GetDStoPoint(v0), p, mC);
3063 }
3064
3065 } // fit daughters to guess
3066
3067 // fit new vertex
3068 {
3069
3070 fvec mpx0 = vtxMom[0][0] + vtxMom[1][0];
3071 fvec mpy0 = vtxMom[0][1] + vtxMom[1][1];
3072 fvec mpt0 = sqrt(mpx0 * mpx0 + mpy0 * mpy0);
3073 // fvec a0 = TMath::ATan2(mpy0,mpx0);
3074
3075 fvec ca0 = mpx0 / mpt0;
3076 fvec sa0 = mpy0 / mpt0;
3077 fvec r[3] = {v0[0], v0[1], v0[2]};
3078 fvec mC[3][3] = {{1000., 0, 0}, {0, 1000., 0}, {0, 0, 1000.}};
3079 fvec chi2 = 0;
3080
3081 for (int id = 0; id < 2; id++) {
3082 const fvec kCLight = 0.000299792458;
3083 fvec q = Bz * daughters[id]->GetQ() * kCLight;
3084 fvec px0 = vtxMom[id][0];
3085 fvec py0 = vtxMom[id][1];
3086 fvec pz0 = vtxMom[id][2];
3087 fvec pt0 = sqrt(px0 * px0 + py0 * py0);
3088 fvec mG[3][6], mB[3], mH[3][3];
3089 // r = {vx,vy,vz};
3090 // m = {x,y,z,Px,Py,Pz};
3091 // V = daughter.C
3092 // G*m + B = H*r;
3093 // q*x + Py - q*vx - sin(a)*Pt = 0
3094 // q*y - Px - q*vy + cos(a)*Pt = 0
3095 // (Px*cos(a) + Py*sin(a) ) (vz -z) - Pz( cos(a)*(vx-x) + sin(a)*(vy-y)) = 0
3096
3097 mG[0][0] = q;
3098 mG[0][1] = 0;
3099 mG[0][2] = 0;
3100 mG[0][3] = -sa0 * px0 / pt0;
3101 mG[0][4] = 1 - sa0 * py0 / pt0;
3102 mG[0][5] = 0;
3103 mH[0][0] = q;
3104 mH[0][1] = 0;
3105 mH[0][2] = 0;
3106 mB[0] = py0 - sa0 * pt0 - mG[0][3] * px0 - mG[0][4] * py0;
3107
3108 // q*y - Px - q*vy + cos(a)*Pt = 0
3109
3110 mG[1][0] = 0;
3111 mG[1][1] = q;
3112 mG[1][2] = 0;
3113 mG[1][3] = -1 + ca0 * px0 / pt0;
3114 mG[1][4] = +ca0 * py0 / pt0;
3115 mG[1][5] = 0;
3116 mH[1][0] = 0;
3117 mH[1][1] = q;
3118 mH[1][2] = 0;
3119 mB[1] = -px0 + ca0 * pt0 - mG[1][3] * px0 - mG[1][4] * py0;
3120
3121 // (Px*cos(a) + Py*sin(a) ) (z -vz) - Pz( cos(a)*(x-vx) + sin(a)*(y-vy)) = 0
3122
3123 mG[2][0] = -pz0 * ca0;
3124 mG[2][1] = -pz0 * sa0;
3125 mG[2][2] = px0 * ca0 + py0 * sa0;
3126 mG[2][3] = 0;
3127 mG[2][4] = 0;
3128 mG[2][5] = 0;
3129
3130 mH[2][0] = mG[2][0];
3131 mH[2][1] = mG[2][1];
3132 mH[2][2] = mG[2][2];
3133
3134 mB[2] = 0;
3135
3136 // fit the vertex
3137
3138 // V = GVGt
3139
3140 fvec mGV[3][6];
3141 fvec mV[6];
3142 fvec m[3];
3143 for (int i = 0; i < 3; i++) {
3144 m[i] = mB[i];
3145 for (int k = 0; k < 6; k++)
3146 m[i] += mG[i][k] * daughterP[id][k];
3147 }
3148 for (int i = 0; i < 3; i++) {
3149 for (int j = 0; j < 6; j++) {
3150 mGV[i][j] = 0;
3151 for (int k = 0; k < 6; k++)
3152 mGV[i][j] += mG[i][k] * daughterC[id][IJ(k, j)];
3153 }
3154 }
3155 for (int i = 0, k = 0; i < 3; i++) {
3156 for (int j = 0; j <= i; j++, k++) {
3157 mV[k] = 0;
3158 for (int l = 0; l < 6; l++)
3159 mV[k] += mGV[i][l] * mG[j][l];
3160 }
3161 }
3162
3163 //* CHt
3164
3165 fvec mCHt[3][3];
3166 fvec mHCHt[6];
3167 fvec mHr[3];
3168 for (int i = 0; i < 3; i++) {
3169 mHr[i] = 0;
3170 for (int k = 0; k < 3; k++)
3171 mHr[i] += mH[i][k] * r[k];
3172 }
3173
3174 for (int i = 0; i < 3; i++) {
3175 for (int j = 0; j < 3; j++) {
3176 mCHt[i][j] = 0;
3177 for (int k = 0; k < 3; k++)
3178 mCHt[i][j] += mC[i][k] * mH[j][k];
3179 }
3180 }
3181
3182 for (int i = 0, k = 0; i < 3; i++) {
3183 for (int j = 0; j <= i; j++, k++) {
3184 mHCHt[k] = 0;
3185 for (int l = 0; l < 3; l++)
3186 mHCHt[k] += mH[i][l] * mCHt[l][j];
3187 }
3188 }
3189
3190 fvec mS[6] = {mHCHt[0] + mV[0], mHCHt[1] + mV[1], mHCHt[2] + mV[2],
3191 mHCHt[3] + mV[3], mHCHt[4] + mV[4], mHCHt[5] + mV[5]};
3192
3193 InvertSym3(mS, mS);
3194
3195 //* Residual (measured - estimated)
3196
3197 fvec zeta[3] = {m[0] - mHr[0], m[1] - mHr[1], m[2] - mHr[2]};
3198
3199 //* Kalman gain K = mCH'*S
3200
3201 fvec k[3][3];
3202
3203 for (Int_t i = 0; i < 3; ++i) {
3204 k[i][0] = mCHt[i][0] * mS[0] + mCHt[i][1] * mS[1] + mCHt[i][2] * mS[3];
3205 k[i][1] = mCHt[i][0] * mS[1] + mCHt[i][1] * mS[2] + mCHt[i][2] * mS[4];
3206 k[i][2] = mCHt[i][0] * mS[3] + mCHt[i][1] * mS[4] + mCHt[i][2] * mS[5];
3207 }
3208
3209 //* New estimation of the vertex position r += K*zeta
3210
3211 for (Int_t i = 0; i < 3; ++i)
3212 r[i] = r[i] + k[i][0] * zeta[0] + k[i][1] * zeta[1] + k[i][2] * zeta[2];
3213
3214 //* New covariance matrix C -= K*(mCH')'
3215
3216 for (Int_t i = 0; i < 3; ++i) {
3217 for (Int_t j = 0; j <= i; ++j) {
3218 mC[i][j] = mC[i][j] - (k[i][0] * mCHt[j][0] + k[i][1] * mCHt[j][1] + k[i][2] * mCHt[j][2]);
3219 mC[j][i] = mC[i][j];
3220 }
3221 }
3222
3223 //* Calculate Chi^2
3224
3225 chi2 += ((mS[0] * zeta[0] + mS[1] * zeta[1] + mS[3] * zeta[2]) * zeta[0]
3226 + (mS[1] * zeta[0] + mS[2] * zeta[1] + mS[4] * zeta[2]) * zeta[1]
3227 + (mS[3] * zeta[0] + mS[4] * zeta[1] + mS[5] * zeta[2]) * zeta[2]);
3228 }
3229
3230 // store vertex
3231
3232 fNDF = 2;
3233 fChi2 = chi2;
3234 for (int i = 0; i < 3; i++)
3235 fP[i] = r[i];
3236 for (int i = 0, k = 0; i < 3; i++) {
3237 for (int j = 0; j <= i; j++, k++) {
3238 fC[k] = mC[i][j];
3239 }
3240 }
3241 }
3242
3243 } // iterations
3244
3245 // now fit daughters to the vertex
3246
3247 fQ = 0;
3248 fSFromDecay = 0;
3249
3250 for (Int_t i = 3; i < 8; ++i)
3251 fP[i] = 0.;
3252 for (Int_t i = 6; i < 35; ++i)
3253 fC[i] = 0.;
3254 fC[35] = 100.;
3255
3256 for (int id = 0; id < 2; id++) {
3257
3258 fvec* p = daughterP[id];
3259 fvec* mC = daughterC[id];
3260 daughters[id]->GetMeasurement(v0, p, mC);
3261
3262 const fvec *m = fP, *mV = fC;
3263
3264 fvec mAi[6];
3265 InvertSym3(mC, mAi);
3266
3267 fvec mB[4][3];
3268
3269 mB[0][0] = mC[6] * mAi[0] + mC[7] * mAi[1] + mC[8] * mAi[3];
3270 mB[0][1] = mC[6] * mAi[1] + mC[7] * mAi[2] + mC[8] * mAi[4];
3271 mB[0][2] = mC[6] * mAi[3] + mC[7] * mAi[4] + mC[8] * mAi[5];
3272
3273 mB[1][0] = mC[10] * mAi[0] + mC[11] * mAi[1] + mC[12] * mAi[3];
3274 mB[1][1] = mC[10] * mAi[1] + mC[11] * mAi[2] + mC[12] * mAi[4];
3275 mB[1][2] = mC[10] * mAi[3] + mC[11] * mAi[4] + mC[12] * mAi[5];
3276
3277 mB[2][0] = mC[15] * mAi[0] + mC[16] * mAi[1] + mC[17] * mAi[3];
3278 mB[2][1] = mC[15] * mAi[1] + mC[16] * mAi[2] + mC[17] * mAi[4];
3279 mB[2][2] = mC[15] * mAi[3] + mC[16] * mAi[4] + mC[17] * mAi[5];
3280
3281 mB[3][0] = mC[21] * mAi[0] + mC[22] * mAi[1] + mC[23] * mAi[3];
3282 mB[3][1] = mC[21] * mAi[1] + mC[22] * mAi[2] + mC[23] * mAi[4];
3283 mB[3][2] = mC[21] * mAi[3] + mC[22] * mAi[4] + mC[23] * mAi[5];
3284
3285 fvec z[3] = {m[0] - p[0], m[1] - p[1], m[2] - p[2]};
3286
3287 // {
3288 // fvec mAV[6] = { mC[0]-mV[0], mC[1]-mV[1], mC[2]-mV[2],
3289 // mC[3]-mV[3], mC[4]-mV[4], mC[5]-mV[5] };
3290 //
3291 // fvec mAVi[6];
3292 // if( !InvertSym3(mAV, mAVi) ){
3293 // fvec dChi2 = ( +(mAVi[0]*z[0] + mAVi[1]*z[1] + mAVi[3]*z[2])*z[0]
3294 // +(mAVi[1]*z[0] + mAVi[2]*z[1] + mAVi[4]*z[2])*z[1]
3295 // +(mAVi[3]*z[0] + mAVi[4]*z[1] + mAVi[5]*z[2])*z[2] );
3296 // fChi2+= TMath::Abs( dChi2 );
3297 // }
3298 // fNDF += 2;
3299 // }
3300
3301 //* Add the daughter momentum to the particle momentum
3302
3303 fP[3] += p[3] + mB[0][0] * z[0] + mB[0][1] * z[1] + mB[0][2] * z[2];
3304 fP[4] += p[4] + mB[1][0] * z[0] + mB[1][1] * z[1] + mB[1][2] * z[2];
3305 fP[5] += p[5] + mB[2][0] * z[0] + mB[2][1] * z[1] + mB[2][2] * z[2];
3306 fP[6] += p[6] + mB[3][0] * z[0] + mB[3][1] * z[1] + mB[3][2] * z[2];
3307
3308 fvec d0, d1, d2;
3309
3310 d0 = mB[0][0] * mV[0] + mB[0][1] * mV[1] + mB[0][2] * mV[3] - mC[6];
3311 d1 = mB[0][0] * mV[1] + mB[0][1] * mV[2] + mB[0][2] * mV[4] - mC[7];
3312 d2 = mB[0][0] * mV[3] + mB[0][1] * mV[4] + mB[0][2] * mV[5] - mC[8];
3313
3314 // fC[6]+= mC[ 6] + d0;
3315 // fC[7]+= mC[ 7] + d1;
3316 // fC[8]+= mC[ 8] + d2;
3317 fC[9] += mC[9] + d0 * mB[0][0] + d1 * mB[0][1] + d2 * mB[0][2];
3318
3319 d0 = mB[1][0] * mV[0] + mB[1][1] * mV[1] + mB[1][2] * mV[3] - mC[10];
3320 d1 = mB[1][0] * mV[1] + mB[1][1] * mV[2] + mB[1][2] * mV[4] - mC[11];
3321 d2 = mB[1][0] * mV[3] + mB[1][1] * mV[4] + mB[1][2] * mV[5] - mC[12];
3322
3323 // fC[10]+= mC[10]+ d0;
3324 // fC[11]+= mC[11]+ d1;
3325 // fC[12]+= mC[12]+ d2;
3326 fC[13] += mC[13] + d0 * mB[0][0] + d1 * mB[0][1] + d2 * mB[0][2];
3327 fC[14] += mC[14] + d0 * mB[1][0] + d1 * mB[1][1] + d2 * mB[1][2];
3328
3329 d0 = mB[2][0] * mV[0] + mB[2][1] * mV[1] + mB[2][2] * mV[3] - mC[15];
3330 d1 = mB[2][0] * mV[1] + mB[2][1] * mV[2] + mB[2][2] * mV[4] - mC[16];
3331 d2 = mB[2][0] * mV[3] + mB[2][1] * mV[4] + mB[2][2] * mV[5] - mC[17];
3332
3333 // fC[15]+= mC[15]+ d0;
3334 // fC[16]+= mC[16]+ d1;
3335 // fC[17]+= mC[17]+ d2;
3336 fC[18] += mC[18] + d0 * mB[0][0] + d1 * mB[0][1] + d2 * mB[0][2];
3337 fC[19] += mC[19] + d0 * mB[1][0] + d1 * mB[1][1] + d2 * mB[1][2];
3338 fC[20] += mC[20] + d0 * mB[2][0] + d1 * mB[2][1] + d2 * mB[2][2];
3339
3340 d0 = mB[3][0] * mV[0] + mB[3][1] * mV[1] + mB[3][2] * mV[3] - mC[21];
3341 d1 = mB[3][0] * mV[1] + mB[3][1] * mV[2] + mB[3][2] * mV[4] - mC[22];
3342 d2 = mB[3][0] * mV[3] + mB[3][1] * mV[4] + mB[3][2] * mV[5] - mC[23];
3343
3344 // fC[21]+= mC[21] + d0;
3345 // fC[22]+= mC[22] + d1;
3346 // fC[23]+= mC[23] + d2;
3347 fC[24] += mC[24] + d0 * mB[0][0] + d1 * mB[0][1] + d2 * mB[0][2];
3348 fC[25] += mC[25] + d0 * mB[1][0] + d1 * mB[1][1] + d2 * mB[1][2];
3349 fC[26] += mC[26] + d0 * mB[2][0] + d1 * mB[2][1] + d2 * mB[2][2];
3350 fC[27] += mC[27] + d0 * mB[3][0] + d1 * mB[3][1] + d2 * mB[3][2];
3351 }
3352
3353 // SetMassConstraint(0,0);
3355}
3356
3358 KFParticleBaseSIMD& negative,
3359 fvec QtAlfa[2])
3360{
3361 // example:
3362 // KFParticle PosParticle(...)
3363 // KFParticle NegParticle(...)
3364 // Gamma.ConstructGamma(PosParticle, NegParticle);
3365 // fvec VertexGamma[3] = {Gamma.GetX(), Gamma.GetY(), Gamma.GetZ()};
3366 // PosParticle.TransportToPoint(VertexGamma);
3367 // NegParticle.TransportToPoint(VertexGamma);
3368 // fvec armenterosQtAlfa[2] = {0.};
3369 // KFParticle::GetArmenterosPodolanski(PosParticle, NegParticle, armenterosQtAlfa );
3370
3371 fvec alpha = 0., qt = 0.;
3372 fvec spx = positive.GetPx() + negative.GetPx();
3373 fvec spy = positive.GetPy() + negative.GetPy();
3374 fvec spz = positive.GetPz() + negative.GetPz();
3375 fvec sp = sqrt(spx * spx + spy * spy + spz * spz);
3376 fvec mask = fvec(fabs(sp) < fvec(1.E-10));
3377 fvec pn, pp, pln, plp;
3378
3379 pn = sqrt(negative.GetPx() * negative.GetPx() + negative.GetPy() * negative.GetPy()
3380 + negative.GetPz() * negative.GetPz());
3381 pp = sqrt(positive.GetPx() * positive.GetPx() + positive.GetPy() * positive.GetPy()
3382 + positive.GetPz() * positive.GetPz());
3383 pln = (negative.GetPx() * spx + negative.GetPy() * spy + negative.GetPz() * spz) / sp;
3384 plp = (positive.GetPx() * spx + positive.GetPy() * spy + positive.GetPz() * spz) / sp;
3385
3386 mask = fvec(mask & fvec(fabs(pn) < fvec(1.E-10)));
3387 fvec ptm = (1. - ((pln / pn) * (pln / pn)));
3388 qt = if3(fvec(ptm >= Zero), pn * sqrt(ptm), Zero);
3389 alpha = (plp - pln) / (plp + pln);
3390
3391 QtAlfa[0] = fvec(qt & mask);
3392 QtAlfa[1] = fvec(alpha & mask);
3393}
3394
3396{
3397 // Rotates the KFParticle object around OZ axis, OZ axis is set by the vertex position
3398 // fvec angle - angle of rotation in XY plane in [rad]
3399 // fvec Vtx[3] - position of the vertex in [cm]
3400
3401 // Before rotation the center of the coordinat system should be moved to the vertex position; move back after
3402 // rotation
3403 X() = X() - Vtx[0];
3404 Y() = Y() - Vtx[1];
3405 Z() = Z() - Vtx[2];
3406
3407 // Rotate the kf particle
3408 fvec c = cos(angle);
3409 fvec s = sin(angle);
3410
3411 fvec mA[8][8];
3412 for (Int_t i = 0; i < 8; i++) {
3413 for (Int_t j = 0; j < 8; j++) {
3414 mA[i][j] = 0;
3415 }
3416 }
3417 for (int i = 0; i < 8; i++) {
3418 mA[i][i] = 1;
3419 }
3420 mA[0][0] = c;
3421 mA[0][1] = s;
3422 mA[1][0] = -s;
3423 mA[1][1] = c;
3424 mA[3][3] = c;
3425 mA[3][4] = s;
3426 mA[4][3] = -s;
3427 mA[4][4] = c;
3428
3429 fvec mAC[8][8];
3430 fvec mAp[8];
3431
3432 for (Int_t i = 0; i < 8; i++) {
3433 mAp[i] = 0;
3434 for (Int_t k = 0; k < 8; k++) {
3435 mAp[i] += mA[i][k] * fP[k];
3436 }
3437 }
3438
3439 for (Int_t i = 0; i < 8; i++) {
3440 fP[i] = mAp[i];
3441 }
3442
3443 for (Int_t i = 0; i < 8; i++) {
3444 for (Int_t j = 0; j < 8; j++) {
3445 mAC[i][j] = 0;
3446 for (Int_t k = 0; k < 8; k++) {
3447 mAC[i][j] += mA[i][k] * GetCovariance(k, j);
3448 }
3449 }
3450 }
3451
3452 for (Int_t i = 0; i < 8; i++) {
3453 for (Int_t j = 0; j <= i; j++) {
3454 fvec xx = 0;
3455 for (Int_t k = 0; k < 8; k++) {
3456 xx += mAC[i][k] * mA[j][k];
3457 }
3458 Covariance(i, j) = xx;
3459 }
3460 }
3461
3462 X() = GetX() + Vtx[0];
3463 Y() = GetY() + Vtx[1];
3464 Z() = GetZ() + Vtx[2];
3465}
3466
3468{
3469 //* Invert symmetric matric stored in low-triagonal form
3470
3471 fvec ret = 0;
3472 fvec a0 = A[0], a1 = A[1], a2 = A[2], a3 = A[3];
3473
3474 Ai[0] = a2 * A[5] - A[4] * A[4];
3475 Ai[1] = a3 * A[4] - a1 * A[5];
3476 Ai[3] = a1 * A[4] - a2 * a3;
3477 fvec det = (a0 * Ai[0] + a1 * Ai[1] + a3 * Ai[3]);
3478
3479 fvec idet = 1. / det;
3480 fvec init = fvec(small < fabs(det));
3481 det = init & idet;
3482 ret += (!init);
3483
3484 Ai[0] *= det;
3485 Ai[1] *= det;
3486 Ai[3] *= det;
3487 Ai[2] = (a0 * A[5] - a3 * a3) * det;
3488 Ai[4] = (a1 * a3 - a0 * A[4]) * det;
3489 Ai[5] = (a0 * a2 - a1 * a1) * det;
3490 return ret;
3491}
3492
3494{
3495 fvec d[3], uud, u[3][3];
3496 for (int i = 0; i < 3; i++) {
3497 d[i] = Zero;
3498 for (int j = 0; j < 3; j++)
3499 u[i][j] = Zero;
3500 }
3501
3502 for (int i = 0; i < 3; i++) {
3503 uud = Zero;
3504 for (int j = 0; j < i; j++)
3505 uud += u[j][i] * u[j][i] * d[j];
3506 uud = a[i * (i + 3) / 2] - uud;
3507
3508 fvec smallval = 1.e-12f;
3509 fvec initialised = fvec(fabs(uud) < smallval);
3510 uud = ((!initialised) & uud) + (smallval & initialised);
3511
3512 d[i] = uud / fabs(uud);
3513 u[i][i] = sqrt(fabs(uud));
3514
3515 for (int j = i + 1; j < 3; j++) {
3516 uud = Zero;
3517 for (int k = 0; k < i; k++)
3518 uud += u[k][i] * u[k][j] * d[k];
3519 uud = a[j * (j + 1) / 2 + i] - uud;
3520 u[i][j] = d[i] / u[i][i] * uud;
3521 }
3522 }
3523
3524 fvec u1[3];
3525
3526 for (int i = 0; i < 3; i++) {
3527 u1[i] = u[i][i];
3528 u[i][i] = One / u[i][i];
3529 }
3530 for (int i = 0; i < 2; i++) {
3531 u[i][i + 1] = -u[i][i + 1] * u[i][i] * u[i + 1][i + 1];
3532 }
3533 for (int i = 0; i < 1; i++) {
3534 u[i][i + 2] = u[i][i + 1] * u1[i + 1] * u[i + 1][i + 2] - u[i][i + 2] * u[i][i] * u[i + 2][i + 2];
3535 }
3536
3537 for (int i = 0; i < 3; i++)
3538 a[i + 3] = u[i][2] * u[2][2] * d[2];
3539 for (int i = 0; i < 2; i++)
3540 a[i + 1] = u[i][1] * u[1][1] * d[1] + u[i][2] * u[1][2] * d[2];
3541 a[0] = u[0][0] * u[0][0] * d[0] + u[0][1] * u[0][1] * d[1] + u[0][2] * u[0][2] * d[2];
3542}
3543
3544void KFParticleBaseSIMD::MultQSQt(const fvec Q[], const fvec S[], fvec SOut[])
3545{
3546 //* Matrix multiplication Q*S*Q^T, Q - square matrix, S - symmetric
3547
3548 const Int_t kN = 8;
3549 fvec mA[kN * kN];
3550
3551 for (Int_t i = 0, ij = 0; i < kN; i++) {
3552 for (Int_t j = 0; j < kN; j++, ++ij) {
3553 mA[ij] = 0;
3554 for (Int_t k = 0; k < kN; ++k)
3555 mA[ij] += S[(k <= i) ? i * (i + 1) / 2 + k : k * (k + 1) / 2 + i] * Q[j * kN + k];
3556 }
3557 }
3558
3559 for (Int_t i = 0; i < kN; i++) {
3560 for (Int_t j = 0; j <= i; j++) {
3561 Int_t ij = (j <= i) ? i * (i + 1) / 2 + j : j * (j + 1) / 2 + i;
3562 SOut[ij] = 0;
3563 for (Int_t k = 0; k < kN; k++)
3564 SOut[ij] += Q[i * kN + k] * mA[k * kN + j];
3565 }
3566 }
3567}
3568
3569// 72-charachters line to define the printer border
3570// 3456789012345678901234567890123456789012345678901234567890123456789012
static const fvec One
static const fvec Zero
static const fvec small
friend F32vec4 fabs(const F32vec4 &a)
Definition P4_F32vec4.h:52
__m128 v
Definition P4_F32vec4.h:1
int i
Definition P4_F32vec4.h:22
__m128 m
Definition P4_F32vec4.h:27
#define if3(a, b, c)
Definition P4_F32vec4.h:148
F32vec4 fvec
Definition P4_F32vec4.h:231
bool Bool_t
int Int_t
float Float_t
void GetDStoParticleBz(fvec Bz, const KFParticleBaseSIMD &p, fvec &dS, fvec &dS1) const
static void InvertCholetsky3(fvec a[6])
static fvec InvertSym3(const fvec A[], fvec Ainv[])
void AddDaughterWithEnergyFitMC(const KFParticleBaseSIMD &Daughter, Bool_t isAtVtxGuess)
virtual void GetFieldValue(const fvec xyz[], fvec B[]) const =0
void SubtractFromParticle(KFParticleBaseSIMD &Vtx) const
const fvec & Q() const
fvec & Covariance(Int_t i)
void ConstructGammaBz(const KFParticleBaseSIMD &daughter1, const KFParticleBaseSIMD &daughter2, fvec Bz)
void TransportLine(fvec S, fvec P[], fvec C[]) const
fvec GetDeviationFromParticle(const KFParticleBaseSIMD &p) const
void GetDistanceToVertexLine(const KFParticleBaseSIMD &Vertex, fvec &l, fvec &dl, fvec *isParticleFromVertex=0) const
static Int_t IJ(Int_t i, Int_t j)
void GetMeasurement(const fvec XYZ[], fvec m[], fvec V[], Bool_t isAtVtxGuess=0) const
fvec GetDistanceFromParticle(const KFParticleBaseSIMD &p) const
void operator+=(const KFParticleBaseSIMD &Daughter)
std::vector< fvec > fDaughterIds
fvec GetDStoPointBy(fvec By, const fvec xyz[]) const
fvec GetMomentum(fvec &P, fvec &SigmaP) const
const fvec & S() const
void Convert(bool ToProduction)
void SetMassConstraint(fvec Mass, fvec SigmaMass=0)
fvec GetR(fvec &R, fvec &SigmaR) const
void AddDaughter(const KFParticleBaseSIMD &Daughter, Bool_t isAtVtxGuess=0)
void AddDaughterWithEnergyFit(const KFParticleBaseSIMD &Daughter, Bool_t isAtVtxGuess)
virtual fvec GetDStoPoint(const fvec xyz[]) const =0
fvec GetSCorrection(const fvec Part[], const fvec XYZ[]) const
fvec GetDistanceFromVertex(const fvec vtx[]) const
const fvec & X() const
void TransportCBM(fvec dS, fvec P[], fvec C[]) const
fvec GetDecayLength(fvec &L, fvec &SigmaL) const
void GetDStoParticleLine(const KFParticleBaseSIMD &p, fvec &dS, fvec &dS1) const
fvec GetDecayLengthXY(fvec &L, fvec &SigmaL) const
void RotateXY(fvec angle, fvec Vtx[3])
void SetVtxGuess(fvec x, fvec y, fvec z)
static void multQSQt1(const fvec J[11], fvec S[])
void SetNonlinearMassConstraint(fvec Mass)
virtual void GetDStoParticle(const KFParticleBaseSIMD &p, fvec &DS, fvec &DSp) const =0
fvec GetCovariance(Int_t i) const
fvec GetDeviationFromVertex(const fvec v[], const fvec Cv[]=0) const
virtual void Transport(fvec dS, fvec P[], fvec C[]) const =0
fvec GetLifeTime(fvec &T, fvec &SigmaT) const
void GetDStoParticleCBM(const KFParticleBaseSIMD &p, fvec &dS, fvec &dS1) const
fvec GetDStoPointCBM(const fvec xyz[]) const
fvec GetDStoPointBz(fvec Bz, const fvec xyz[]) const
const fvec & Y() const
void SetVtxErrGuess(fvec &x, fvec &y, fvec &z)
void GetDStoParticleBy(fvec B, const KFParticleBaseSIMD &p, fvec &dS, fvec &dS1) const
void SetProductionVertex(const KFParticleBaseSIMD &Vtx)
void Construct(const KFParticleBaseSIMD *vDaughters[], Int_t nDaughters, const KFParticleBaseSIMD *ProdVtx=0, Float_t Mass=-1, Bool_t IsConstrained=0, Bool_t isAtVtxGuess=0)
void AddDaughterWithEnergyCalc(const KFParticleBaseSIMD &Daughter, Bool_t isAtVtxGuess)
fvec GetPt(fvec &Pt, fvec &SigmaPt) const
void SubtractFromVertex(KFParticleBaseSIMD &Vtx) const
void TransportBz(fvec Bz, fvec dS, fvec P[], fvec C[]) const
fvec GetPhi(fvec &Phi, fvec &SigmaPhi) const
fvec & Cij(Int_t i, Int_t j)
fvec GetEta(fvec &Eta, fvec &SigmaEta) const
fvec GetMass(fvec &M, fvec &SigmaM) const
const fvec & Z() const
static void MultQSQt(const fvec Q[], const fvec S[], fvec SOut[])
static void GetArmenterosPodolanski(KFParticleBaseSIMD &positive, KFParticleBaseSIMD &negative, fvec QtAlfa[2])
void AddDaughterId(fvec id)
RVec< PromoteType< T > > cos(const RVec< T > &v)
RVec< PromoteType< T > > log(const RVec< T > &v)
RVec< PromoteType< T > > sqrt(const RVec< T > &v)
RVec< PromoteTypes< T0, T1 > > atan2(const RVec< T0 > &v, const T1 &y)
RVec< PromoteType< T > > sin(const RVec< T > &v)
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:20362
Double_t Sqrt(Double_t x)
Double_t Cos(Double_t)
Double_t Abs(Double_t d)
Double_t Sin(Double_t)