56 Bool_t downstream_direction = (z_out > z_in);
58 if (downstream_direction) {
67 vector<CbmKFMaterial*>::iterator
i, ibeg, iend;
70 if (iend != KF->
vMaterial.end() && (*iend)->ZReference - (*iend)->ZThickness / 2 < Z)
72 if (downstream_direction) {
81 for (
i = ibeg;
i != iend; downstream_direction ? ++
i : --
i) {
82 Double_t zthick = (*i)->ZThickness, zcross = (*i)->ZReference;
86 double z0 = (downstream_direction) ? zcross - zthick / 2. : zcross + zthick / 2.;
87 double d = (downstream_direction) ? 1 : -1;
88 double dz = 1.E-1 * (*i)->RadLength;
90 while (z_ + dz < zthick) {
91 err = err || (*i)->Pass(z0 + d * (z_ + dz / 2.), dz, *
this, downstream_direction, qp0);
95 err = err || (*i)->Pass(z0 + d * (z_ + dz / 2.), dz, *
this, downstream_direction, qp0);
153 err = h->
Filter(*
this, downstream, qp0);
158 for (
Int_t j = istold + 1; j < ist; j++)
159 err = err || KF->
vMaterial[j]->Pass(*
this, downstream, qp0);
160 err = err || h->
Filter(*
this, downstream, qp0);
165 err = h->
Filter(*
this, downstream, qp0);
167 for (
Int_t i = NHits - 2;
i >= 0;
i--) {
170 for (
Int_t j = istold - 1; j > ist; j--)
171 err = err || KF->
vMaterial[j]->Pass(*
this, downstream, qp0);
172 err = err || h->
Filter(*
this, downstream, qp0);
198 T[0] = T[1] = T[2] = T[3] = T[4] = T[5] = 0;
219 T[0] = T[1] = T[2] = T[3] = T[4] = T[5] = 0;
271 Int_t j = istold + 1;
272 for (; j < ist; j++) {
277 if (j < ist || KF->vMaterial[h->
MaterialIndex]->ZReference > Z)
286 double Ts[6], Cs[15];
287 for (
int k = 0; k < 6; k++)
289 for (
int k = 0; k < 15; k++)
312 for (
Int_t i = NHits - 2;
i >= 0;
i--) {
315 Int_t j = istold - 1;
316 for (; j > ist; j--) {
333 for (
int k = 0; k < 15; k++)
339 for (
int k = 0; k < 5; k++)
341 for (
int k = 0; k < 5; k++)
342 for (
int l = 0; l < 5; l++)
343 T[k] -= K[k * 5 + l] * r[l];
347 for (
int l = 0; l < 5; l++)
349 for (
int l = 0; l < 5; ++l)
350 for (
int j = 0; j <= l; ++j) {
353 for (
int k = 0; k < 5; ++k)
356 for (
int l = 0; l < 15; l++)
383 Double_t zeta[2] = {x - T[0], y - T[1]};
385 Double_t CHt[5][2] = {{C[0], C[1]}, {C[1], C[2]}, {C[3], C[4]}, {C[6], C[7]}, {C[10], C[11]}};
387 for (
Int_t iter = 0; iter < MaxIter; iter++) {
389 Double_t Cv0 = Cv[0] - a * (2 * Cv[3] - a * Cv[5]);
390 Double_t Cv1 = Cv[1] - b * Cv[3] - a * (Cv[4] - b * Cv[5]);
391 Double_t Cv2 = Cv[2] - b * (2 * Cv[4] - b * Cv[5]);
393 Double_t S[3] = {C[0] + Cv0, C[1] + Cv1, C[2] + Cv2};
397 Double_t s = S[0] * S[2] - S[1] * S[1];
411 if (iter < MaxIter - 1) {
414 K[
i][0] = CHt[
i][0] * S[0] + CHt[
i][1] * S[1];
415 K[
i][1] = CHt[
i][0] * S[1] + CHt[
i][1] * S[2];
420 a = T[2] + K[2][0] * zeta[0] + K[2][1] * zeta[1];
421 b = T[3] + K[3][0] * zeta[0] + K[3][1] * zeta[1];
427 K[
i][0] = CHt[
i][0] * S[0] + CHt[
i][1] * S[1];
428 K[
i][1] = CHt[
i][0] * S[1] + CHt[
i][1] * S[2];
435 T[2] += K[2][0] * zeta[0] + K[2][1] * zeta[1];
436 T[3] += K[3][0] * zeta[0] + K[3][1] * zeta[1];
437 T[4] += K[4][0] * zeta[0] + K[4][1] * zeta[1];
441 GetRefChi2() += zeta[0] * zeta[0] * S[0] + 2 * zeta[0] * zeta[1] * S[1] + zeta[1] * zeta[1] * S[2];
445 C[0] -= K[0][0] * CHt[0][0] + K[0][1] * CHt[0][1];
446 C[1] -= K[1][0] * CHt[0][0] + K[1][1] * CHt[0][1];
447 C[2] -= K[1][0] * CHt[1][0] + K[1][1] * CHt[1][1];
448 C[3] -= K[2][0] * CHt[0][0] + K[2][1] * CHt[0][1];
449 C[4] -= K[2][0] * CHt[1][0] + K[2][1] * CHt[1][1];
450 C[5] -= K[2][0] * CHt[2][0] + K[2][1] * CHt[2][1];
451 C[6] -= K[3][0] * CHt[0][0] + K[3][1] * CHt[0][1];
452 C[7] -= K[3][0] * CHt[1][0] + K[3][1] * CHt[1][1];
453 C[8] -= K[3][0] * CHt[2][0] + K[3][1] * CHt[2][1];
454 C[9] -= K[3][0] * CHt[3][0] + K[3][1] * CHt[3][1];
455 C[10] -= K[4][0] * CHt[0][0] + K[4][1] * CHt[0][1];
456 C[11] -= K[4][0] * CHt[1][0] + K[4][1] * CHt[1][1];
457 C[12] -= K[4][0] * CHt[2][0] + K[4][1] * CHt[2][1];
458 C[13] -= K[4][0] * CHt[3][0] + K[4][1] * CHt[3][1];
459 C[14] -= K[4][0] * CHt[4][0] + K[4][1] * CHt[4][1];
static Double_t gTempD[100]
Abstract base class for hit is being used by the CbmKF Kalman Filter.
virtual Int_t Filter(CbmKFTrackInterface &track, Bool_t downstream, Double_t &QP0)=0
static Bool_t compareP_z(const CbmKFMaterial *a, Double_t z)
static Bool_t compareP_Z(Double_t z, const CbmKFMaterial *a)
static Bool_t GetThickness(Double_t z1, Double_t z2, Double_t mz, Double_t mthick, Double_t *mz_out, Double_t *mthick_out)
static void multSSQ(const Double_t *A, const Double_t *B, Double_t *C, Int_t n)
static Bool_t invS(Double_t A[], Int_t N)
static Int_t indexS(Int_t i, Int_t j)
Int_t Propagate(Double_t z_out, Double_t QP0, Bool_t line=false)
virtual Double_t * GetTrack()
Is it electron.
virtual Int_t & GetRefNDF()
Chi^2 after fit.
Int_t Extrapolate(Double_t z, Double_t *QP0=0, Bool_t line=false)
Access to i-th hit.
virtual Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
virtual Int_t GetNOfHits()
Number of Degrees of Freedom after fit.
Int_t Fit(Bool_t downstream=1, Bool_t line=false)
void Fit2Vertex(CbmKFVertexInterface &vtx)
virtual CbmKFHit * GetHit(Int_t i)
Number of hits.
virtual Double_t & GetRefChi2()
array[15] of covariance matrix
virtual Double_t & GetRefY()
virtual Double_t & GetRefX()
I/O parameters for vertex fit routines.
virtual Double_t & GetRefZ()
virtual Double_t * GetCovMatrix()
The CbmKF Kalman Filter algorithm.
Int_t Propagate(Double_t *T, Double_t *C, Double_t z_out, Double_t QP0, Bool_t line=false)
Propagation of (T, C) to z_out without material, using linearisation at qp0.
std::vector< CbmKFMaterial * > vMaterial
static CbmKF * Instance()