BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnKalmanFilter.cxx
Go to the documentation of this file.
1#include "BmnKalmanFilter.h"
2
3#include "BmnFieldMap.h"
4
5using namespace std;
6using namespace TMath;
7
13
19
20BmnStatus BmnKalmanFilter::Update(FairTrackParam* par, const BmnHit* hit, Double_t& chiSq)
21{
22 Double_t cIn[15];
23 par->CovMatrix(cIn);
24
25 static const Double_t ONE = 1., TWO = 2.;
26
27 Double_t dxx = hit->GetDx() * hit->GetDx();
28 Double_t dxy = 0.0;
29 Double_t dyy = hit->GetDy() * hit->GetDy();
30
31 Double_t dx = hit->GetX() - par->GetX();
32 Double_t dy = hit->GetY() - par->GetY();
33
34 Double_t t =
35 (dxx * dyy + dxx * cIn[5] + dyy * cIn[0] + cIn[0] * cIn[5] - dxy * dxy - TWO * dxy * cIn[1] - cIn[1] * cIn[1]);
36 if (t == 0.0)
37 return kBMNERROR;
38 else
39 t = ONE
40 / (dxx * dyy + dxx * cIn[5] + dyy * cIn[0] + cIn[0] * cIn[5] - dxy * dxy - TWO * dxy * cIn[1]
41 - cIn[1] * cIn[1]);
42
43 Double_t R00 = (dyy + cIn[5]) * t;
44 Double_t R01 = -(dxy + cIn[1]) * t;
45 Double_t R11 = (dxx + cIn[0]) * t;
46
47 Double_t K00 = cIn[0] * R00 + cIn[1] * R01;
48 Double_t K01 = cIn[0] * R01 + cIn[1] * R11;
49 Double_t K10 = cIn[1] * R00 + cIn[5] * R01;
50 Double_t K11 = cIn[1] * R01 + cIn[5] * R11;
51 Double_t K20 = cIn[2] * R00 + cIn[6] * R01;
52 Double_t K21 = cIn[2] * R01 + cIn[6] * R11;
53 Double_t K30 = cIn[3] * R00 + cIn[7] * R01;
54 Double_t K31 = cIn[3] * R01 + cIn[7] * R11;
55 Double_t K40 = cIn[4] * R00 + cIn[8] * R01;
56 Double_t K41 = cIn[4] * R01 + cIn[8] * R11;
57
58 Double_t xOut[5] = {par->GetX(), par->GetY(), par->GetTx(), par->GetTy(), par->GetQp()};
59 xOut[0] += K00 * dx + K01 * dy;
60 xOut[1] += K10 * dx + K11 * dy;
61 xOut[2] += K20 * dx + K21 * dy;
62 xOut[3] += K30 * dx + K31 * dy;
63 xOut[4] += K40 * dx + K41 * dy;
64
65 Double_t cOut[15];
66 for (Int_t i = 0; i < 15; ++i)
67 cOut[i] = cIn[i];
68
69 cOut[0] += -K00 * cIn[0] - K01 * cIn[1];
70 cOut[1] += -K00 * cIn[1] - K01 * cIn[5];
71 cOut[2] += -K00 * cIn[2] - K01 * cIn[6];
72 cOut[3] += -K00 * cIn[3] - K01 * cIn[7];
73 cOut[4] += -K00 * cIn[4] - K01 * cIn[8];
74
75 cOut[5] += -K11 * cIn[5] - K10 * cIn[1];
76 cOut[6] += -K11 * cIn[6] - K10 * cIn[2];
77 cOut[7] += -K11 * cIn[7] - K10 * cIn[3];
78 cOut[8] += -K11 * cIn[8] - K10 * cIn[4];
79
80 cOut[9] += -K20 * cIn[2] - K21 * cIn[6];
81 cOut[10] += -K20 * cIn[3] - K21 * cIn[7];
82 cOut[11] += -K20 * cIn[4] - K21 * cIn[8];
83
84 cOut[12] += -K30 * cIn[3] - K31 * cIn[7];
85 cOut[13] += -K30 * cIn[4] - K31 * cIn[8];
86
87 cOut[14] += -K40 * cIn[4] - K41 * cIn[8];
88
89 par->SetX(xOut[0]);
90 par->SetY(xOut[1]);
91 par->SetTx(xOut[2]);
92 par->SetTy(xOut[3]);
93 par->SetQp(xOut[4]);
94 par->SetCovMatrix(cOut);
95
96 Double_t xmx = hit->GetX() - par->GetX();
97 Double_t ymy = hit->GetY() - par->GetY();
98 Double_t C0 = cOut[0];
99 Double_t C1 = cOut[1];
100 Double_t C5 = cOut[5];
101
102 Double_t norm = dxx * dyy - dxx * C5 - dyy * C0 + C0 * C5 - dxy * dxy + 2 * dxy * C1 - C1 * C1;
103
104 chiSq = ((xmx * (dyy - C5) - ymy * (dxy - C1)) * xmx + (-xmx * (dxy - C1) + ymy * (dxx - C0)) * ymy) / norm;
105
106 return kBMNSUCCESS;
107}
108
110{
111 if (thisNode->GetPredictedParam()->GetQp() == 0.0)
112 return kBMNERROR;
113 if (prevNode->GetPredictedParam()->GetQp() == 0.0)
114 return kBMNERROR;
115
116 Double_t cov1[15];
117 prevNode->GetPredictedParam()->CovMatrix(cov1);
118 vector<Double_t> invPrevPredC(cov1, cov1 + 15);
119 if (!InvSym15(invPrevPredC))
120 return kBMNERROR;
121
122 vector<Double_t> Ft(prevNode->GetF());
123 Transpose25(Ft);
124
125 Double_t cov2[15];
126 thisNode->GetUpdatedParam()->CovMatrix(cov2);
127 vector<Double_t> thisUpdC(cov2, cov2 + 15);
128
129 vector<Double_t> A(25);
130 vector<Double_t> temp1(25);
131 Mult15On25(thisUpdC, Ft, temp1);
132 Mult25On15(temp1, invPrevPredC, A);
133
134 vector<Double_t> thisUpdX;
135 thisUpdX.push_back(thisNode->GetUpdatedParam()->GetX());
136 thisUpdX.push_back(thisNode->GetUpdatedParam()->GetY());
137 thisUpdX.push_back(thisNode->GetUpdatedParam()->GetTx());
138 thisUpdX.push_back(thisNode->GetUpdatedParam()->GetTy());
139 thisUpdX.push_back(thisNode->GetUpdatedParam()->GetQp());
140
141 vector<Double_t> prevSmoothedX;
142 prevSmoothedX.push_back(prevNode->GetSmoothedParam()->GetX());
143 prevSmoothedX.push_back(prevNode->GetSmoothedParam()->GetY());
144 prevSmoothedX.push_back(prevNode->GetSmoothedParam()->GetTx());
145 prevSmoothedX.push_back(prevNode->GetSmoothedParam()->GetTy());
146 prevSmoothedX.push_back(prevNode->GetSmoothedParam()->GetQp());
147
148 vector<Double_t> prevPredX;
149 prevPredX.push_back(prevNode->GetPredictedParam()->GetX());
150 prevPredX.push_back(prevNode->GetPredictedParam()->GetY());
151 prevPredX.push_back(prevNode->GetPredictedParam()->GetTx());
152 prevPredX.push_back(prevNode->GetPredictedParam()->GetTy());
153 prevPredX.push_back(prevNode->GetPredictedParam()->GetQp());
154
155 vector<Double_t> temp2(5), temp3(5);
156 Subtract(prevSmoothedX, prevPredX, temp2);
157 Mult25On5(A, temp2, temp3);
158 vector<Double_t> thisSmoothedX(5);
159 Add(thisUpdX, temp3, thisSmoothedX);
160
161 Double_t cov3[15];
162 prevNode->GetSmoothedParam()->CovMatrix(cov3);
163 vector<Double_t> prevSmoothedC(cov3, cov3 + 15);
164
165 Double_t cov4[15];
166 prevNode->GetPredictedParam()->CovMatrix(cov4);
167 vector<Double_t> prevPredC(cov4, cov4 + 15);
168
169 vector<Double_t> temp4(15);
170 Subtract(prevSmoothedC, prevPredC, temp4);
171
172 vector<Double_t> temp5(15);
173 Similarity(A, temp4, temp5);
174 vector<Double_t> thisSmoothedC(15);
175 Add(thisUpdC, temp5, thisSmoothedC);
176
177 FairTrackParam par;
178 par.SetX(thisSmoothedX[0]);
179 par.SetY(thisSmoothedX[1]);
180 par.SetTx(thisSmoothedX[2]);
181 par.SetTy(thisSmoothedX[3]);
182 par.SetQp(thisSmoothedX[4]);
183
184 Double_t cov5[15];
185 for (Int_t i = 0; i < 15; ++i)
186 cov5[i] = thisSmoothedC[i];
187 par.SetCovMatrix(cov5);
188 par.SetZ(thisNode->GetUpdatedParam()->GetZ());
189
190 thisNode->SetSmoothedParam(&par);
191
192 return kBMNSUCCESS;
193}
194
196{
197 Double_t zIn = par->GetZ();
198 FairField* field = FairRunAna::Instance()->GetField();
199
200 Double_t xIn[5];
201 xIn[0] = par->GetX();
202 xIn[1] = par->GetY();
203 xIn[2] = par->GetTx();
204 xIn[3] = par->GetTy();
205 xIn[4] = par->GetQp();
206
207 Double_t xOut[5];
208 Double_t F1[25];
209
210 RK4Order(xIn, zIn, xOut, zOut, F1, field);
211
212 Double_t cIn[15];
213 par->CovMatrix(cIn);
214
215 Double_t cOut[15];
216 TransportC(cIn, F1, cOut);
217
218 par->SetX(xOut[0]);
219 par->SetY(xOut[1]);
220 par->SetTx(xOut[2]);
221 par->SetTy(xOut[3]);
222 par->SetQp(xOut[4]);
223 par->SetCovMatrix(cOut);
224 par->SetZ(zOut);
225
226 // Копируем F1 в F (если F — не nullptr)
227 if (F != NULL) {
228 for (Int_t i = 0; i < 25; i++)
229 F[i] = F1[i];
230 }
231 return kBMNSUCCESS;
232}
233
235 Double_t zIn,
236 Double_t* xOut,
237 Double_t zOut,
238 Double_t* derivs,
239 FairField* field)
240{
241 const Double_t fC = 0.000299792458;
242 const Double_t coef[4] = {0.0, 0.5, 0.5, 1.0};
243
244 Double_t Ax[4], Ay[4];
245 Double_t dAx_dtx[4], dAy_dtx[4], dAx_dty[4], dAy_dty[4];
246 Double_t k[4][4];
247
248 Double_t h = zOut - zIn;
249 Double_t hC = h * fC;
250 Double_t hCqp = h * fC * xIn[4];
251 Double_t x0[4];
252 Double_t x[4] = {xIn[0], xIn[1], xIn[2], xIn[3]};
253
254 for (UInt_t iStep = 0; iStep < 4; iStep++) {
255 if (iStep > 0) {
256 for (UInt_t i = 0; i < 4; i++)
257 x[i] = xIn[i] + coef[iStep] * k[i][iStep - 1];
258 }
259
260 Double_t zCur = zIn + coef[iStep] * h;
261 Double_t Bx = field->GetBx(x[0], x[1], zCur);
262 Double_t By = field->GetBy(x[0], x[1], zCur);
263 Double_t Bz = field->GetBz(x[0], x[1], zCur);
264
265 Double_t tx = x[2], ty = x[3];
266 Double_t txtx = tx * tx, tyty = ty * ty, txty = tx * ty;
267 Double_t inv = 1.0 / (1.0 + txtx + tyty);
268 Double_t t1 = Sqrt(1.0 + txtx + tyty);
269
270 Ax[iStep] = (txty * Bx + ty * Bz - (1.0 + txtx) * By) * t1;
271 Ay[iStep] = (-txty * By - tx * Bz + (1.0 + tyty) * Bx) * t1;
272
273 dAx_dtx[iStep] = Ax[iStep] * tx * inv + (ty * Bx - 2.0 * tx * By) * t1;
274 dAx_dty[iStep] = Ax[iStep] * ty * inv + (tx * Bx + Bz) * t1;
275 dAy_dtx[iStep] = Ay[iStep] * tx * inv + (-ty * By - Bz) * t1;
276 dAy_dty[iStep] = Ay[iStep] * ty * inv + (-tx * By + 2.0 * ty * Bx) * t1;
277
278 k[0][iStep] = tx * h;
279 k[1][iStep] = ty * h;
280 k[2][iStep] = Ax[iStep] * hCqp;
281 k[3][iStep] = Ay[iStep] * hCqp;
282 }
283
284 for (UInt_t i = 0; i < 4; i++)
285 xOut[i] = CalcOut(xIn[i], k[i]);
286 xOut[4] = xIn[4];
287
288 derivs[0] = 1.;
289 derivs[5] = 0.;
290 derivs[10] = 0.;
291 derivs[15] = 0.;
292 derivs[20] = 0.;
293 derivs[1] = 0.;
294 derivs[6] = 1.;
295 derivs[11] = 0.;
296 derivs[16] = 0.;
297 derivs[21] = 0.;
298
299 x[0] = x0[0] = 0.0;
300 x[1] = x0[1] = 0.0;
301 x[2] = x0[2] = 1.0;
302 x[3] = x0[3] = 0.0;
303 for (UInt_t iStep = 0; iStep < 4; iStep++) {
304 if (iStep > 0) {
305 for (UInt_t i = 0; i < 4; i++)
306 if (i != 2)
307 x[i] = x0[i] + coef[iStep] * k[i][iStep - 1];
308 }
309 k[0][iStep] = x[2] * h;
310 k[1][iStep] = x[3] * h;
311 k[3][iStep] = (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]) * hCqp;
312 }
313 derivs[2] = CalcOut(x0[0], k[0]);
314 derivs[7] = CalcOut(x0[1], k[1]);
315 derivs[12] = 1.0;
316 derivs[17] = CalcOut(x0[3], k[3]);
317 derivs[22] = 0.0;
318
319 x[0] = x0[0] = 0.0;
320 x[1] = x0[1] = 0.0;
321 x[2] = x0[2] = 0.0;
322 x[3] = x0[3] = 1.0;
323 for (UInt_t iStep = 0; iStep < 4; iStep++) {
324 if (iStep > 0) {
325 for (UInt_t i = 0; i < 4; i++)
326 if (i != 3)
327 x[i] = x0[i] + coef[iStep] * k[i][iStep - 1];
328 }
329 k[0][iStep] = x[2] * h;
330 k[1][iStep] = x[3] * h;
331 k[2][iStep] = (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]) * hCqp;
332 }
333 derivs[3] = CalcOut(x0[0], k[0]);
334 derivs[8] = CalcOut(x0[1], k[1]);
335 derivs[13] = CalcOut(x0[2], k[2]);
336 derivs[18] = 1.;
337 derivs[23] = 0.;
338
339 x[0] = x0[0] = 0.0;
340 x[1] = x0[1] = 0.0;
341 x[2] = x0[2] = 0.0;
342 x[3] = x0[3] = 0.0;
343 for (UInt_t iStep = 0; iStep < 4; iStep++) {
344 if (iStep > 0) {
345 for (UInt_t i = 0; i < 4; i++)
346 x[i] = x0[i] + coef[iStep] * k[i][iStep - 1];
347 }
348 k[0][iStep] = x[2] * h;
349 k[1][iStep] = x[3] * h;
350 k[2][iStep] = Ax[iStep] * hC + hCqp * (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]);
351 k[3][iStep] = Ay[iStep] * hC + hCqp * (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]);
352 }
353 derivs[4] = CalcOut(x0[0], k[0]);
354 derivs[9] = CalcOut(x0[1], k[1]);
355 derivs[14] = CalcOut(x0[2], k[2]);
356 derivs[19] = CalcOut(x0[3], k[3]);
357 derivs[24] = 1.;
358}
359
361 Double_t zOut,
362 Int_t pdg,
363 vector<Double_t>* F,
364 Double_t* length)
365{
366 BmnFieldMap* field = (BmnFieldMap*)FairRunAna::Instance()->GetField();
367 Bool_t isField = !(field->IsFieldOff());
368
369 if (!IsParCorrect(par, isField))
370 return kBMNERROR;
371
372 Double_t zIn = par->GetZ();
373 Double_t dz = zOut - zIn;
374 Bool_t downstream = dz > 0;
375
376 if (isField) {
377 if (F != NULL) {
378 if (F->size() != 25)
379 F->resize(25);
380 std::fill(F->begin(), F->end(), 0.0);
381 (*F)[0] = 1.;
382 (*F)[6] = 1.;
383 (*F)[12] = 1.;
384 (*F)[18] = 1.;
385 (*F)[24] = 1.;
386 }
387
388 Int_t nofSteps = Int_t(abs(dz) / 10);
389 Double_t stepSize = (nofSteps == 0) ? abs(dz) : 10.0;
390 Double_t z = zIn;
391
392 vector<BmnMaterialInfo> inter;
393
394 for (Int_t iStep = 0; iStep < nofSteps + 1; iStep++) {
395 if (z == zOut)
396 break;
397
398 if (iStep != nofSteps)
399 z = (downstream) ? z + stepSize : z - stepSize;
400 else
401 z = zOut;
402
403 inter.clear();
404 if (fNavigator->FindIntersections(par, z, inter) == kBMNERROR)
405 return kBMNERROR;
406
407 for (UInt_t iMat = 0; iMat < inter.size(); iMat++) {
408 BmnMaterialInfo& mat = inter[iMat];
409
410 if (F != NULL) {
411 Double_t Fnew[25];
412 RK4TrackExtrapolate(par, mat.GetZpos(), Fnew); // ← если переделать сигнатуру
413 UpdateF(F->data(), Fnew);
414 } else {
415 if (RK4TrackExtrapolate(par, mat.GetZpos(), nullptr) == kBMNERROR)
416 return kBMNERROR;
417 }
418
419 fMaterial->Update(par, &mat, pdg, downstream);
420 if (length)
421 *length += mat.GetLength();
422 }
423 }
424 } else {
425 Float_t x0 = par->GetX(), y0 = par->GetY(), z0 = par->GetZ();
426 Float_t tx = par->GetTx(), ty = par->GetTy();
427 Float_t xOut = tx * (zOut - z0) + x0;
428 Float_t yOut = ty * (zOut - z0) + y0;
429 par->SetX(xOut);
430 par->SetY(yOut);
431 par->SetZ(zOut);
432 if (length)
433 *length = Sqrt(Sq(xOut - x0) + Sq(yOut - y0) + Sq(zOut - z0));
434 }
435
436 return IsParCorrect(par, isField) ? kBMNSUCCESS : kBMNERROR;
437}
439 Double_t zOut,
440 Int_t pdg,
441 vector<Double_t>* F,
442 Double_t* length,
443 Bool_t isField)
444{
445 return TGeoTrackPropagate(par, zOut, pdg, F, length);
446}
447
448// ============================================================
449// Residuals
450// ============================================================
451
453 BmnHit** hitsArray,
454 Int_t nHits,
455 Int_t pdg,
456 Double_t* resX,
457 Double_t* resY,
458 Int_t* station,
459 Int_t& nRes)
460{
461 nRes = 0;
462
463 if (!track || !hitsArray)
464 return kBMNERROR;
465 if (nHits < 2)
466 return kBMNSUCCESS;
467 if (nHits > kMaxHits)
468 return kBMNERROR;
469
470 Double_t xL[kMaxHits], yL[kMaxHits];
471 Bool_t validL[kMaxHits];
472
473 for (Int_t k = 0; k < nHits; k++) {
474 xL[k] = 0.0;
475 yL[k] = 0.0;
476 validL[k] = kFALSE;
477 }
478
479 FairTrackParam parF(*(track->GetParamFirst()));
480 FairTrackParam parL(*(track->GetParamLast()));
481
482 FairTrackParam parFtmp = parF;
483 for (Int_t k = 0; k < nHits; k++) {
484 BmnHit* hit = hitsArray[k];
485
486 if (TGeoTrackPropagate(&parFtmp, hit->GetZ(), pdg, nullptr, nullptr) == kBMNERROR)
487 continue;
488
489 xL[k] = parFtmp.GetX();
490 yL[k] = parFtmp.GetY();
491 validL[k] = kTRUE;
492
493 Double_t chi2 = 0;
494 Update(&parFtmp, hit, chi2);
495 }
496
497 FairTrackParam parLtmp = parL;
498 for (Int_t k = nHits - 1; k >= 0; k--) {
499 BmnHit* hit = hitsArray[k];
500
501 if (TGeoTrackPropagate(&parLtmp, hit->GetZ(), pdg, nullptr, nullptr) == kBMNERROR)
502 continue;
503
504 Double_t xR = parLtmp.GetX();
505 Double_t yR = parLtmp.GetY();
506
507 if (validL[k]) {
508 Double_t xAvg = 0.5 * (xL[k] + xR);
509 Double_t yAvg = 0.5 * (yL[k] + yR);
510
511 resX[nRes] = xAvg - hit->GetX();
512 resY[nRes] = yAvg - hit->GetY();
513 station[nRes] = hit->GetStation();
514 nRes++;
515 }
516
517 Double_t chi2 = 0;
518 Update(&parLtmp, hit, chi2);
519 }
520
521 return kBMNSUCCESS;
522}
523
525 BmnHit** hitsArray,
526 Int_t nHits,
527 Int_t station,
528 Int_t pdg,
529 Double_t& resX,
530 Double_t& resY)
531{
532 if (!hitsArray)
533 return kBMNERROR;
534 if (nHits > kMaxHits)
535 return kBMNERROR;
536
537 Double_t resX_arr[kMaxHits], resY_arr[kMaxHits];
538 Int_t station_arr[kMaxHits];
539 Int_t nRes = 0;
540
541 BmnStatus status = ComputeResiduals(track, hitsArray, nHits, pdg, resX_arr, resY_arr, station_arr, nRes);
542 if (status != kBMNSUCCESS)
543 return kBMNERROR;
544
545 for (Int_t k = 0; k < nRes; k++) {
546 if (station_arr[k] == station) {
547 resX = resX_arr[k];
548 resY = resY_arr[k];
549 return kBMNSUCCESS;
550 }
551 }
552
553 return kBMNERROR;
554}
Bool_t IsParCorrect(const FairTrackParam *par, const Bool_t isField)
Definition BmnMath.cxx:59
Bool_t Similarity(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
Bool_t Mult25On5(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
Bool_t Subtract(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
Bool_t Mult15On25(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
Bool_t Transpose25(vector< Double_t > &a)
Bool_t InvSym15(vector< Double_t > &a)
Bool_t Mult25On15(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
int i
Definition P4_F32vec4.h:22
bool Bool_t
int Int_t
float Float_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
TMatrixTSparse< Element > & Add(TMatrixTSparse< Element > &target, Element scalar, const TMatrixTSparse< Element > &source)
BmnStatus
Define status code.
Definition BmnEnums.h:93
@ kBMNERROR
Error.
Definition BmnEnums.h:95
@ kBMNSUCCESS
Success.
Definition BmnEnums.h:94
Bool_t IsFieldOff() const
Whether magnetic field is off.
Definition BmnFieldMap.h:93
FairTrackParam * GetSmoothedParam()
Definition BmnFitNode.h:50
void SetSmoothedParam(const FairTrackParam *par)
Definition BmnFitNode.h:59
const vector< Double_t > & GetF() const
Definition BmnFitNode.h:46
const FairTrackParam * GetPredictedParam() const
Definition BmnFitNode.h:48
FairTrackParam * GetUpdatedParam()
Definition BmnFitNode.h:49
Short_t GetStation() const
Definition BmnHit.h:35
BmnStatus GetResidual(CbmStsTrack *track, BmnHit **hitsArray, Int_t nHits, Int_t station, Int_t pdg, Double_t &resX, Double_t &resY)
void RK4Order(const Double_t *xIn, Double_t zIn, Double_t *xOut, Double_t zOut, Double_t *derivs, FairField *field)
void UpdateF(Double_t *F, const Double_t *newF)
BmnMaterialEffects * fMaterial
static const Int_t kMaxHits
BmnGeoNavigator * fNavigator
BmnStatus RK4TrackExtrapolate(FairTrackParam *par, Double_t zOut, Double_t *F)
BmnStatus TGeoTrackPropagate(FairTrackParam *par, Double_t zOut, Int_t pdg, vector< Double_t > *F, Double_t *length, Bool_t isField)
BmnStatus ComputeResiduals(CbmStsTrack *track, BmnHit **hitsArray, Int_t nHits, Int_t pdg, Double_t *resX, Double_t *resY, Int_t *station, Int_t &nRes)
BmnStatus Update(FairTrackParam *par, const BmnHit *hit, Double_t &chiSq)
BmnStatus Smooth(BmnFitNode *thisNode, BmnFitNode *prevNode)
virtual ~BmnKalmanFilter()
void TransportC(const Double_t *cIn, const Double_t *F, Double_t *cOut)
Double_t CalcOut(Double_t in, const Double_t k[4])
Interface for material effects calculation algorithm.
Float_t GetZpos() const
Float_t GetLength() const
FairTrackParam * GetParamLast()
Definition CbmStsTrack.h:70
FairTrackParam * GetParamFirst()
Definition CbmStsTrack.h:69
RVec< PromoteType< T > > abs(const RVec< T > &v)
Double_t Sq(Double_t x)
Double_t Sqrt(Double_t x)
Definition json.hpp:4446