BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
CbmKFSecondaryVertexFinder.cxx
Go to the documentation of this file.
1/** Implementation of the CbmKFSecondaryVertexFinder class
2 *
3 * @author S.Gorbunov, I.Kisel
4 * @version 1.0
5 * @since 06.02.06
6 *
7 */
8
10
11#include "CbmKF.h"
12#include "CbmKFTrack.h"
13
14#include <cmath>
15
16using std::fabs;
17using std::vector;
18
20{
21 vTracks.clear();
22 VGuess = 0;
23 VParent = 0;
24 MassConstraint = -1;
25}
26
31
33{
34 vTracks.push_back(Track);
35}
36
37void CbmKFSecondaryVertexFinder::SetTracks(vector<CbmKFTrackInterface*>& vTr)
38{
39 vTracks = vTr;
40}
41
46
51
56
58{
59 const Int_t MaxIter = 3;
60
61 if (VGuess) {
62 r[0] = VGuess->GetRefX();
63 r[1] = VGuess->GetRefY();
64 r[2] = VGuess->GetRefZ();
65 } else {
66 if (CbmKF::Instance()->vTargets.empty()) {
67 r[0] = r[1] = r[2] = 0.;
68 } else {
70 r[0] = r[1] = 0.;
71 r[2] = t.z;
72 }
73 }
74
75 r[3] = 0;
76 r[4] = 0;
77 r[5] = 0;
78 r[6] = 0;
79 r[7] = 0;
80
81 for (Int_t iteration = 0; iteration < MaxIter; ++iteration) {
82
83 for (int i = 0; i < 8; i++)
84 r0[i] = r[i];
85
86 r[3] = 0;
87 r[4] = 0;
88 r[5] = 0;
89 r[6] = 0;
90
91 for (Int_t i = 0; i < 36; ++i)
92 C[i] = 0.0;
93
94 C[0] = C[2] = C[5] = 100.0;
95 C[35] = 1.E4;
96 NDF = -3;
97 Chi2 = 0.;
98
99 for (vector<CbmKFTrackInterface*>::iterator tr = vTracks.begin(); tr != vTracks.end(); ++tr) {
100 CbmKFTrack T(**tr);
101
102 T.Extrapolate(r0[2]);
103
104 Double_t* m = T.GetTrack();
105 Double_t* V = T.GetCovMatrix();
106
107 //* Fit of vertex track slopes and momentum (a,b,qp) to r0 vertex
108
109 Double_t a = m[2], b = m[3], qp = m[4];
110 {
111 Double_t s = V[0] * V[2] - V[1] * V[1];
112 s = (s > 1.E-20) ? 1. / s : 0;
113 Double_t zetas[2] = {(r0[0] - m[0]) * s, (r0[1] - m[1]) * s};
114 a += (V[3] * V[2] - V[4] * V[1]) * zetas[0] + (-V[3] * V[1] + V[4] * V[0]) * zetas[1];
115 b += (V[6] * V[2] - V[7] * V[1]) * zetas[0] + (-V[6] * V[1] + V[7] * V[0]) * zetas[1];
116 qp += (V[10] * V[2] - V[11] * V[1]) * zetas[0] + (-V[10] * V[1] + V[11] * V[0]) * zetas[1];
117 }
118
119 //* convert the track to (x,y,px,py,pz,e) parameterization
120 double mm[6], VV[21];
121 {
122 double c2 = 1. / (1. + a * a + b * b);
123 double p = 1. / qp;
124 double p2 = p * p;
125 double pz = sqrt(p2 * c2);
126 double px = a * pz;
127 double py = b * pz;
128 double E = sqrt(T.GetMass() * T.GetMass() + p2);
129
130 double da = (m[2] - a);
131 double db = (m[3] - b);
132 double dq = (m[4] - qp);
133
134 double H[3] = {-px * c2, -py * c2, -pz * p};
135 double HE = -p * p2 / E;
136
137 double dpz = H[0] * da + H[1] * db + H[2] * dq;
138
139 mm[0] = m[0];
140 mm[1] = m[1];
141 mm[2] = px + da + a * dpz;
142 mm[3] = py + db + b * dpz;
143 mm[4] = pz + dpz;
144 mm[5] = E + HE * dq;
145
146 double cxpz = H[0] * V[3] + H[1] * V[6] + H[2] * V[10];
147 double cypz = H[0] * V[4] + H[1] * V[7] + H[2] * V[11];
148 double capz = H[0] * V[5] + H[1] * V[8] + H[2] * V[12];
149 double cbpz = H[0] * V[8] + H[1] * V[9] + H[2] * V[13];
150 double cqpz = H[0] * V[12] + H[1] * V[13] + H[2] * V[14];
151 double cpzpz = H[0] * H[0] * V[5] + H[1] * H[1] * V[9] + H[2] * H[2] * V[14]
152 + 2 * (H[0] * H[1] * V[8] + H[0] * H[2] * V[12] + H[1] * H[2] * V[13]);
153
154 VV[0] = V[0];
155 VV[1] = V[1];
156 VV[2] = V[2];
157 VV[3] = V[3] * pz + a * cxpz;
158 VV[4] = V[4] * pz + a * cypz;
159 VV[5] = V[5] * pz * pz + 2 * a * pz * capz + a * a * cpzpz;
160 VV[6] = V[6] * pz + b * cxpz;
161 VV[7] = V[7] * pz + b * cypz;
162 VV[8] = V[8] * pz * pz + a * pz * cbpz + b * pz * capz + a * b * cpzpz;
163 VV[9] = V[9] * pz * pz + 2 * b * pz * cbpz + b * b * cpzpz;
164 VV[10] = cxpz;
165 VV[11] = cypz;
166 VV[12] = capz * pz + a * cpzpz;
167 VV[13] = cbpz * pz + b * cpzpz;
168 VV[14] = cpzpz;
169 VV[15] = HE * V[10];
170 VV[16] = HE * V[11];
171 VV[17] = HE * (V[12] * pz + a * cqpz);
172 VV[18] = HE * (V[13] * pz + b * cqpz);
173 VV[19] = HE * cqpz;
174 VV[20] = HE * HE * V[14];
175 }
176
177 //* Measure the state vector with the track estimate
178
179 Chi2 += T.GetRefChi2();
180 NDF += T.GetRefNDF() - 3;
181
182 //* Update the state vector with the momentum part of the track estimate
183
184 r[3] += mm[2];
185 r[4] += mm[3];
186 r[5] += mm[4];
187 r[6] += mm[5];
188
189 C[9] += VV[5];
190 C[13] += VV[8];
191 C[14] += VV[9];
192 C[18] += VV[12];
193 C[19] += VV[13];
194 C[20] += VV[14];
195 C[24] += VV[17];
196 C[25] += VV[18];
197 C[26] += VV[19];
198 C[27] += VV[20];
199
200 NDF += 3;
201 Chi2 += 0.;
202
203 //* Update the state vector with the coordinate part of the track estimate
204
205 //* Residual (measured - estimated)
206
207 Double_t zeta[2] = {mm[0] - (r[0] - a * (r[2] - r0[2])), mm[1] - (r[1] - b * (r[2] - r0[2]))};
208
209 //* Measurement matrix H= { { 1, 0, -a, 0..0}, { 0, 1, -b,0..0} };
210
211 //* S = (H*C*H' + V )^{-1}
212
213 Double_t S[3] = {VV[0] + C[0] - 2 * a * C[3] + a * a * C[5],
214 VV[1] + C[1] - b * C[3] - a * C[4] + a * b * C[5],
215 VV[2] + C[2] - 2 * b * C[4] + b * b * C[5]};
216
217 //* Invert S
218 {
219 Double_t s = S[0] * S[2] - S[1] * S[1];
220
221 if (s < 1.E-20)
222 continue;
223 s = 1. / s;
224 Double_t S0 = S[0];
225 S[0] = s * S[2];
226 S[1] = -s * S[1];
227 S[2] = s * S0;
228 }
229
230 //* CHt = CH' - D'
231
232 Double_t CHt0[7], CHt1[7];
233
234 CHt0[0] = C[0] - a * C[3];
235 CHt1[0] = C[1] - b * C[3];
236 CHt0[1] = C[1] - a * C[4];
237 CHt1[1] = C[2] - b * C[4];
238 CHt0[2] = C[3] - a * C[5];
239 CHt1[2] = C[4] - b * C[5];
240 CHt0[3] = C[6] - a * C[8] - VV[3];
241 CHt1[3] = C[7] - b * C[8] - VV[4];
242 CHt0[4] = C[10] - a * C[12] - VV[6];
243 CHt1[4] = C[11] - b * C[12] - VV[7];
244 CHt0[5] = C[15] - a * C[17] - VV[10];
245 CHt1[5] = C[16] - b * C[17] - VV[11];
246 CHt0[6] = C[21] - a * C[23] - VV[15];
247 CHt1[6] = C[22] - b * C[23] - VV[16];
248
249 //* Kalman gain K = CH'*S
250
251 Double_t K0[7], K1[7];
252
253 for (Int_t i = 0; i < 7; ++i) {
254 K0[i] = CHt0[i] * S[0] + CHt1[i] * S[1];
255 K1[i] = CHt0[i] * S[1] + CHt1[i] * S[2];
256 }
257
258 //* New estimation of the vertex position r += K*zeta
259
260 for (Int_t i = 0; i < 7; ++i)
261 r[i] += K0[i] * zeta[0] + K1[i] * zeta[1];
262
263 //* New covariance matrix C -= K*(CH')'
264
265 for (Int_t i = 0, k = 0; i < 7; ++i) {
266 for (Int_t j = 0; j <= i; ++j, ++k)
267 C[k] -= K0[i] * CHt0[j] + K1[i] * CHt1[j];
268 }
269
270 //* Calculate Chi^2 & NDF
271
272 NDF += 2;
273 Chi2 += zeta[0] * zeta[0] * S[0] + 2 * zeta[0] * zeta[1] * S[1] + zeta[1] * zeta[1] * S[2];
274
275 } // add tracks
276
277 // Put constraints if they exist
278
281
282 } // iterations
283}
284
286{
287 vtx.GetRefX() = r[0];
288 vtx.GetRefY() = r[1];
289 vtx.GetRefZ() = r[2];
290 for (int i = 0; i < 6; i++)
291 vtx.GetCovMatrix()[i] = C[i];
292 vtx.GetRefChi2() = Chi2;
293 vtx.GetRefNDF() = NDF;
294}
295
302
304{
305
306 if (!Par)
307 return;
308
309 Double_t px = r[3], py = r[4], pz = r[5];
310
311 Double_t p = sqrt(px * px + py * py + pz * pz);
312 double pzi = 1 / pz;
313 double qp = 1 / p;
314 Par[0] = r[0];
315 Par[1] = r[1];
316 Par[2] = px * pzi;
317 Par[3] = py * pzi;
318 Par[4] = qp;
319 Par[5] = r[2];
320
321 if (!Cov)
322 return;
323
324 double qp3 = qp * qp * qp;
325 Double_t J[5][6];
326
327 for (Int_t i = 0; i < 5; i++)
328 for (Int_t j = 0; j < 6; ++j)
329 J[i][j] = 0.0;
330
331 J[0][0] = 1;
332 J[0][2] = -Par[2];
333 J[1][1] = 1;
334 J[1][2] = -Par[3];
335 J[2][3] = pzi;
336 J[2][5] = -Par[2] * pzi;
337 J[3][4] = pzi;
338 J[3][5] = -Par[3] * pzi;
339 J[4][3] = -qp3 * px;
340 J[4][4] = -qp3 * py;
341 J[4][4] = -qp3 * pz;
342
343 Double_t JC[5][6];
344
345 for (Int_t i = 0; i < 5; i++)
346 for (Int_t j = 0; j < 6; j++) {
347 JC[i][j] = 0;
348 for (Int_t k = 0; k < 6; k++)
349 JC[i][j] += J[i][k] * Cij(k, j);
350 }
351
352 Int_t ii = 0;
353 for (Int_t i = 0; i < 5; i++)
354 for (Int_t j = i; j < 5; j++, ii++) {
355 Cov[ii] = 0;
356 for (Int_t k = 0; k < 6; k++)
357 Cov[ii] += JC[i][k] * J[j][k];
358 }
359}
360
362{
363 // S = sigma^2 of m2/2
364
365 Double_t S = (r[3] * r[3] * C[9] + r[4] * r[4] * C[14] + r[5] * r[5] * C[20] + r[6] * r[6] * C[27]
366 + 2
367 * (+r[3] * r[4] * C[13] + r[5] * (r[3] * C[18] + r[4] * C[19])
368 - r[6] * (r[3] * C[24] + r[4] * C[25] + r[5] * C[26])));
369 Double_t m2 = r[6] * r[6] - r[3] * r[3] - r[4] * r[4] - r[5] * r[5];
370
371 if (M)
372 *M = (m2 > 1.e-20) ? sqrt(m2) : 0.;
373 if (Error_)
374 *Error_ = (S >= 0 && m2 > 1.e-20) ? sqrt(S / m2) : 1.e4;
375}
376
378{
379 if (MassConstraint < 0)
380 return;
381 double H[8];
382 H[0] = H[1] = H[2] = 0.;
383 H[3] = -2 * r0[3];
384 H[4] = -2 * r0[4];
385 H[5] = -2 * r0[5];
386 H[6] = 2 * r0[6];
387 H[7] = 0;
388 double m2 = r0[6] * r0[6] - r0[3] * r0[3] - r0[4] * r0[4] - r0[5] * r0[5];
389
390 double zeta = MassConstraint * MassConstraint - m2;
391 for (Int_t i = 0; i < 8; ++i)
392 zeta -= H[i] * (r[i] - r0[i]);
393
394 Double_t S = 0.;
395 Double_t CHt[8];
396 for (Int_t i = 0; i < 8; ++i) {
397 CHt[i] = 0.0;
398 for (Int_t j = 0; j < 8; ++j)
399 CHt[i] += Cij(i, j) * H[j];
400 S += H[i] * CHt[i];
401 }
402
403 if (S < 1.e-20)
404 return;
405 S = 1. / S;
406 Chi2 += zeta * zeta * S;
407 NDF += 1;
408 for (Int_t i = 0, ii = 0; i < 8; ++i) {
409 Double_t Ki = CHt[i] * S;
410 r[i] += Ki * zeta;
411 for (Int_t j = 0; j <= i; ++j)
412 C[ii++] -= Ki * CHt[j];
413 }
414}
415
417{
418
419 r0[0] += T * r0[3];
420 r0[1] += T * r0[4];
421 r0[2] += T * r0[5];
422
423 r[0] += T * r[3];
424 r[1] += T * r[4];
425 r[2] += T * r[5];
426
427 double C30 = C[6] + T * C[9];
428 double C41 = C[11] + T * C[14];
429 double C52 = C[17] + T * C[20];
430 double T54 = T * C[19];
431
432 C[0] += T * (C[6] + C30);
433 C[1] += T * (C[7] + C[10]);
434 C[2] += T * (C[11] + C41);
435 C[10] += T * C[13];
436 C[6] = C30;
437 C[11] = C41;
438
439 C[15] += T * C[18];
440 C[16] += T54;
441 C[3] += T * (C[8] + C[15]);
442 C[4] += T * (C[12] + C[16]);
443 C[5] += T * (C[17] + C52);
444 C[17] = C52;
445 C[12] += T54;
446
447 C[7] += T * C[13];
448 C[8] += T * C[18];
449
450 C[21] += T * C[24];
451 C[22] += T * C[25];
452 C[23] += T * C[26];
453 C[28] += T * C[31];
454 C[29] += T * C[32];
455 C[30] += T * C[33];
456}
457
459{
460 if (!VParent)
461 return;
462
463 double m[3], *V;
464 {
465 m[0] = VParent->GetRefX();
466 m[1] = VParent->GetRefY();
467 m[2] = VParent->GetRefZ();
468 V = VParent->GetCovMatrix();
469 }
470
471 Extrapolate(-r0[7]);
472
473 {
474 double inf = 1.e8;
475 double xinf = r0[0] * inf;
476 double yinf = r0[1] * inf;
477 double zinf = r0[2] * inf;
478 C[0] += r0[0] * xinf;
479 C[1] += r0[0] * yinf;
480 C[2] += r0[1] * yinf;
481 C[3] += r0[0] * zinf;
482 C[4] += r0[1] * zinf;
483 C[5] += r0[2] * zinf;
484 C[28] = -2 * xinf;
485 C[29] = -2 * yinf;
486 C[30] = -2 * zinf;
487 C[31] = 0;
488 C[32] = 0;
489 C[33] = 0;
490 C[34] = 0;
491 C[35] = inf;
492 }
493 r[7] = r0[7];
494
495 double Ai[6];
496 Ai[0] = C[4] * C[4] - C[2] * C[5];
497 Ai[1] = C[1] * C[5] - C[3] * C[4];
498 Ai[3] = C[2] * C[3] - C[1] * C[4];
499 double det = (C[0] * Ai[0] + C[1] * Ai[1] + C[3] * Ai[3]);
500 det = (det > 1.e-8) ? 1. / det : 0;
501 Ai[0] *= det;
502 Ai[1] *= det;
503 Ai[3] *= det;
504 Ai[2] = (C[3] * C[3] - C[0] * C[5]) * det;
505 Ai[4] = (C[0] * C[4] - C[1] * C[3]) * det;
506 Ai[5] = (C[1] * C[1] - C[0] * C[2]) * det;
507
508 double B[5][3];
509 B[0][0] = C[6] * Ai[0] + C[7] * Ai[1] + C[8] * Ai[3];
510 B[0][1] = C[6] * Ai[1] + C[7] * Ai[2] + C[8] * Ai[4];
511 B[0][2] = C[6] * Ai[3] + C[7] * Ai[4] + C[8] * Ai[5];
512
513 B[1][0] = C[10] * Ai[0] + C[11] * Ai[1] + C[12] * Ai[3];
514 B[1][1] = C[10] * Ai[1] + C[11] * Ai[2] + C[12] * Ai[4];
515 B[1][2] = C[10] * Ai[3] + C[11] * Ai[4] + C[12] * Ai[5];
516
517 B[2][0] = C[15] * Ai[0] + C[16] * Ai[1] + C[17] * Ai[3];
518 B[2][1] = C[15] * Ai[1] + C[16] * Ai[2] + C[17] * Ai[4];
519 B[2][2] = C[15] * Ai[3] + C[16] * Ai[4] + C[17] * Ai[5];
520
521 B[3][0] = C[21] * Ai[0] + C[22] * Ai[1] + C[23] * Ai[3];
522 B[3][1] = C[21] * Ai[1] + C[22] * Ai[2] + C[23] * Ai[4];
523 B[3][2] = C[21] * Ai[3] + C[22] * Ai[4] + C[23] * Ai[5];
524
525 B[4][0] = C[28] * Ai[0] + C[29] * Ai[1] + C[30] * Ai[3];
526 B[4][1] = C[28] * Ai[1] + C[29] * Ai[2] + C[30] * Ai[4];
527 B[4][2] = C[28] * Ai[3] + C[29] * Ai[4] + C[30] * Ai[5];
528
529 double z[3] = {m[0] - r[0], m[1] - r[1], m[2] - r[2]};
530 r[0] = m[0];
531 r[1] = m[1];
532 r[2] = m[2];
533 r[3] += B[0][0] * z[0] + B[0][1] * z[1] + B[0][2] * z[2];
534 r[4] += B[1][0] * z[0] + B[1][1] * z[1] + B[1][2] * z[2];
535 r[5] += B[2][0] * z[0] + B[2][1] * z[1] + B[2][2] * z[2];
536 r[6] += B[3][0] * z[0] + B[3][1] * z[1] + B[3][2] * z[2];
537 r[7] += B[4][0] * z[0] + B[4][1] * z[1] + B[4][2] * z[2];
538
539 {
540 double AV[6] = {C[0] - V[0], C[1] - V[1], C[2] - V[2], C[3] - V[3], C[4] - V[4], C[5] - V[5]};
541 double AVi[6];
542 AVi[0] = AV[4] * AV[4] - AV[2] * AV[5];
543 AVi[1] = AV[1] * AV[5] - AV[3] * AV[4];
544 AVi[2] = AV[3] * AV[3] - AV[0] * AV[5];
545 AVi[3] = AV[2] * AV[3] - AV[1] * AV[4];
546 AVi[4] = AV[0] * AV[4] - AV[1] * AV[3];
547 AVi[5] = -123; // FIXME assing correct value
548 det = (AV[0] * AVi[0] + AV[1] * AVi[1] + AV[3] * AVi[3]);
549 det = (det > 1.e-8) ? 1. / det : 0;
550 NDF += 2;
551 Chi2 += (+(AVi[0] * z[0] + AVi[1] * z[1] + AVi[3] * z[2]) * z[0]
552 + (AVi[1] * z[0] + AVi[2] * z[1] + AVi[4] * z[2]) * z[1]
553 + (AVi[3] * z[0] + AVi[4] * z[1] + AVi[5] * z[2]) * z[2])
554 * det;
555 }
556
557 double d0, d1, d2;
558 C[0] = V[0];
559 C[1] = V[1];
560 C[2] = V[2];
561 C[3] = V[3];
562 C[4] = V[4];
563 C[5] = V[5];
564
565 d0 = B[0][0] * V[0] + B[0][1] * V[1] + B[0][2] * V[3] - C[6];
566 d1 = B[0][0] * V[1] + B[0][1] * V[2] + B[0][2] * V[4] - C[7];
567 d2 = B[0][0] * V[3] + B[0][1] * V[4] + B[0][2] * V[5] - C[8];
568
569 C[6] += d0;
570 C[7] += d1;
571 C[8] += d2;
572 C[9] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
573
574 d0 = B[1][0] * V[0] + B[1][1] * V[1] + B[1][2] * V[3] - C[10];
575 d1 = B[1][0] * V[1] + B[1][1] * V[2] + B[1][2] * V[4] - C[11];
576 d2 = B[1][0] * V[3] + B[1][1] * V[4] + B[1][2] * V[5] - C[12];
577
578 C[10] += d0;
579 C[11] += d1;
580 C[12] += d2;
581 C[13] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
582 C[14] += d0 * B[1][0] + d1 * B[1][1] + d2 * B[1][2];
583
584 d0 = B[2][0] * V[0] + B[2][1] * V[1] + B[2][2] * V[3] - C[15];
585 d1 = B[2][0] * V[1] + B[2][1] * V[2] + B[2][2] * V[4] - C[16];
586 d2 = B[2][0] * V[3] + B[2][1] * V[4] + B[2][2] * V[5] - C[17];
587
588 C[15] += d0;
589 C[16] += d1;
590 C[17] += d2;
591 C[18] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
592 C[19] += d0 * B[1][0] + d1 * B[1][1] + d2 * B[1][2];
593 C[20] += d0 * B[2][0] + d1 * B[2][1] + d2 * B[2][2];
594
595 d0 = B[3][0] * V[0] + B[3][1] * V[1] + B[3][2] * V[3] - C[21];
596 d1 = B[3][0] * V[1] + B[3][1] * V[2] + B[3][2] * V[4] - C[22];
597 d2 = B[3][0] * V[3] + B[3][1] * V[4] + B[3][2] * V[5] - C[23];
598
599 C[21] += d0;
600 C[22] += d1;
601 C[23] += d2;
602 C[24] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
603 C[25] += d0 * B[1][0] + d1 * B[1][1] + d2 * B[1][2];
604 C[26] += d0 * B[2][0] + d1 * B[2][1] + d2 * B[2][2];
605 C[27] += d0 * B[3][0] + d1 * B[3][1] + d2 * B[3][2];
606
607 d0 = B[4][0] * V[0] + B[4][1] * V[1] + B[4][2] * V[3] - C[28];
608 d1 = B[4][0] * V[1] + B[4][1] * V[2] + B[4][2] * V[4] - C[29];
609 d2 = B[4][0] * V[3] + B[4][1] * V[4] + B[4][2] * V[5] - C[30];
610
611 C[28] += d0;
612 C[29] += d1;
613 C[30] += d2;
614 C[31] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
615 C[32] += d0 * B[1][0] + d1 * B[1][1] + d2 * B[1][2];
616 C[33] += d0 * B[2][0] + d1 * B[2][1] + d2 * B[2][2];
617 C[34] += d0 * B[3][0] + d1 * B[3][1] + d2 * B[3][2];
618 C[35] += d0 * B[4][0] + d1 * B[4][1] + d2 * B[4][2];
619
620 {
621 Extrapolate(r[7]);
622
623 double CH00 = C[0] + r0[0] * C[28];
624 double CH10 = C[1] + r0[0] * C[29];
625 double CH11 = C[2] + r0[1] * C[29];
626 double CH20 = C[3] + r0[0] * C[30];
627 double CH21 = C[4] + r0[1] * C[30];
628 double CH22 = C[5] + r0[2] * C[30];
629
630 C[28] += r0[0] * C[35];
631 C[29] += r0[1] * C[35];
632 C[30] += r0[2] * C[35];
633
634 C[0] = CH00 + r0[0] * C[28];
635 C[1] = CH10 + r0[1] * C[28];
636 C[2] = CH11 + r0[1] * C[29];
637 C[3] = CH20 + r0[2] * C[28];
638 C[4] = CH21 + r0[2] * C[29];
639 C[5] = CH22 + r0[2] * C[30];
640
641 C[6] += r0[0] * C[31];
642 C[7] += r0[1] * C[31];
643 C[8] += r0[2] * C[31];
644 C[10] += r0[0] * C[32];
645 C[11] += r0[1] * C[32];
646 C[12] += r0[2] * C[32];
647 C[15] += r0[0] * C[33];
648 C[16] += r0[1] * C[33];
649 C[17] += r0[2] * C[33];
650 C[21] += r0[0] * C[34];
651 C[22] += r0[1] * C[34];
652 C[23] += r0[2] * C[34];
653 }
654}
int i
Definition P4_F32vec4.h:22
__m128 m
Definition P4_F32vec4.h:27
int Int_t
double Double_t
void SetTopoConstraint(CbmKFVertexInterface *Parent=0)
Double_t & Cij(Int_t i, Int_t j)
void SetTracks(std::vector< CbmKFTrackInterface * > &vTracks)
void GetMass(Double_t *M, Double_t *Error)
void SetApproximation(CbmKFVertexInterface *Guess=0)
std::vector< CbmKFTrackInterface * > vTracks
void SetMassConstraint(Double_t MotherMass=-1)
void GetVertex(CbmKFVertexInterface &vtx)
void GetMotherTrack(Double_t T[], Double_t C[])
void AddTrack(CbmKFTrackInterface *Track)
Double_t z
virtual Double_t & GetRefY()
virtual Double_t & GetRefX()
I/O parameters for vertex fit routines.
virtual Double_t & GetRefZ()
virtual Double_t & GetRefChi2()
Array[6] of covariance matrix.
virtual Int_t & GetRefNDF()
Chi^2 after fit.
void GetVertex(CbmVertex &v)
virtual Double_t * GetCovMatrix()
static CbmKF * Instance()
Definition CbmKF.h:34
std::vector< CbmKFTube > vTargets
Definition CbmKF.h:62
CbmVertex.h.
Definition CbmVertex.h:21
RVec< PromoteType< T > > sqrt(const RVec< T > &v)