3#include "BmnFieldMap.h"
25 static const Double_t ONE = 1., TWO = 2.;
27 Double_t dxx = hit->GetDx() * hit->GetDx();
29 Double_t dyy = hit->GetDy() * hit->GetDy();
31 Double_t dx = hit->GetX() - par->GetX();
32 Double_t dy = hit->GetY() - par->GetY();
35 (dxx * dyy + dxx * cIn[5] + dyy * cIn[0] + cIn[0] * cIn[5] - dxy * dxy - TWO * dxy * cIn[1] - cIn[1] * cIn[1]);
40 / (dxx * dyy + dxx * cIn[5] + dyy * cIn[0] + cIn[0] * cIn[5] - dxy * dxy - TWO * dxy * cIn[1]
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;
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;
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];
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];
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];
84 cOut[12] += -K30 * cIn[3] - K31 * cIn[7];
85 cOut[13] += -K30 * cIn[4] - K31 * cIn[8];
87 cOut[14] += -K40 * cIn[4] - K41 * cIn[8];
94 par->SetCovMatrix(cOut);
96 Double_t xmx = hit->GetX() - par->GetX();
97 Double_t ymy = hit->GetY() - par->GetY();
102 Double_t norm = dxx * dyy - dxx * C5 - dyy * C0 + C0 * C5 - dxy * dxy + 2 * dxy * C1 - C1 * C1;
104 chiSq = ((xmx * (dyy - C5) - ymy * (dxy - C1)) * xmx + (-xmx * (dxy - C1) + ymy * (dxx - C0)) * ymy) / norm;
118 vector<Double_t> invPrevPredC(cov1, cov1 + 15);
122 vector<Double_t> Ft(prevNode->
GetF());
127 vector<Double_t> thisUpdC(cov2, cov2 + 15);
129 vector<Double_t> A(25);
130 vector<Double_t> temp1(25);
134 vector<Double_t> thisUpdX;
141 vector<Double_t> prevSmoothedX;
148 vector<Double_t> prevPredX;
155 vector<Double_t> temp2(5), temp3(5);
156 Subtract(prevSmoothedX, prevPredX, temp2);
158 vector<Double_t> thisSmoothedX(5);
159 Add(thisUpdX, temp3, thisSmoothedX);
163 vector<Double_t> prevSmoothedC(cov3, cov3 + 15);
167 vector<Double_t> prevPredC(cov4, cov4 + 15);
169 vector<Double_t> temp4(15);
170 Subtract(prevSmoothedC, prevPredC, temp4);
172 vector<Double_t> temp5(15);
174 vector<Double_t> thisSmoothedC(15);
175 Add(thisUpdC, temp5, thisSmoothedC);
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]);
186 cov5[
i] = thisSmoothedC[
i];
187 par.SetCovMatrix(cov5);
198 FairField* field = FairRunAna::Instance()->GetField();
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();
210 RK4Order(xIn, zIn, xOut, zOut, F1, field);
223 par->SetCovMatrix(cOut);
242 const Double_t coef[4] = {0.0, 0.5, 0.5, 1.0};
245 Double_t dAx_dtx[4], dAy_dtx[4], dAx_dty[4], dAy_dty[4];
252 Double_t x[4] = {xIn[0], xIn[1], xIn[2], xIn[3]};
254 for (UInt_t iStep = 0; iStep < 4; iStep++) {
256 for (UInt_t
i = 0;
i < 4;
i++)
257 x[
i] = xIn[
i] + coef[iStep] * k[
i][iStep - 1];
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);
266 Double_t txtx = tx * tx, tyty = ty * ty, txty = tx * ty;
267 Double_t inv = 1.0 / (1.0 + txtx + tyty);
270 Ax[iStep] = (txty * Bx + ty * Bz - (1.0 + txtx) * By) * t1;
271 Ay[iStep] = (-txty * By - tx * Bz + (1.0 + tyty) * Bx) * t1;
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;
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;
284 for (UInt_t
i = 0;
i < 4;
i++)
303 for (UInt_t iStep = 0; iStep < 4; iStep++) {
305 for (UInt_t
i = 0;
i < 4;
i++)
307 x[
i] = x0[
i] + coef[iStep] * k[
i][iStep - 1];
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;
313 derivs[2] =
CalcOut(x0[0], k[0]);
314 derivs[7] =
CalcOut(x0[1], k[1]);
316 derivs[17] =
CalcOut(x0[3], k[3]);
323 for (UInt_t iStep = 0; iStep < 4; iStep++) {
325 for (UInt_t
i = 0;
i < 4;
i++)
327 x[
i] = x0[
i] + coef[iStep] * k[
i][iStep - 1];
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;
333 derivs[3] =
CalcOut(x0[0], k[0]);
334 derivs[8] =
CalcOut(x0[1], k[1]);
335 derivs[13] =
CalcOut(x0[2], k[2]);
343 for (UInt_t iStep = 0; iStep < 4; iStep++) {
345 for (UInt_t
i = 0;
i < 4;
i++)
346 x[
i] = x0[
i] + coef[iStep] * k[
i][iStep - 1];
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]);
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]);
374 Bool_t downstream = dz > 0;
380 std::fill(F->begin(), F->end(), 0.0);
389 Double_t stepSize = (nofSteps == 0) ?
abs(dz) : 10.0;
392 vector<BmnMaterialInfo> inter;
394 for (
Int_t iStep = 0; iStep < nofSteps + 1; iStep++) {
398 if (iStep != nofSteps)
399 z = (downstream) ? z + stepSize : z - stepSize;
407 for (UInt_t iMat = 0; iMat < inter.size(); iMat++) {
419 fMaterial->Update(par, &mat, pdg, downstream);
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;
433 *length =
Sqrt(
Sq(xOut - x0) +
Sq(yOut - y0) +
Sq(zOut - z0));
463 if (!track || !hitsArray)
473 for (
Int_t k = 0; k < nHits; k++) {
482 FairTrackParam parFtmp = parF;
483 for (
Int_t k = 0; k < nHits; k++) {
484 BmnHit* hit = hitsArray[k];
489 xL[k] = parFtmp.GetX();
490 yL[k] = parFtmp.GetY();
494 Update(&parFtmp, hit, chi2);
497 FairTrackParam parLtmp = parL;
498 for (
Int_t k = nHits - 1; k >= 0; k--) {
499 BmnHit* hit = hitsArray[k];
511 resX[nRes] = xAvg - hit->GetX();
512 resY[nRes] = yAvg - hit->GetY();
518 Update(&parLtmp, hit, chi2);
545 for (
Int_t k = 0; k < nRes; k++) {
546 if (station_arr[k] == station) {
Bool_t IsParCorrect(const FairTrackParam *par, const Bool_t isField)
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)
TMatrixTSparse< Element > & Add(TMatrixTSparse< Element > &target, Element scalar, const TMatrixTSparse< Element > &source)
BmnStatus
Define status code.
Bool_t IsFieldOff() const
Whether magnetic field is off.
FairTrackParam * GetSmoothedParam()
void SetSmoothedParam(const FairTrackParam *par)
const vector< Double_t > & GetF() const
const FairTrackParam * GetPredictedParam() const
FairTrackParam * GetUpdatedParam()
Short_t GetStation() const
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 GetLength() const
FairTrackParam * GetParamLast()
FairTrackParam * GetParamFirst()
RVec< PromoteType< T > > abs(const RVec< T > &v)
Double_t Sqrt(Double_t x)