46 Double_t qp0 = (QP0) ? *QP0 :
GetTrack()[4];
48 Bool_t downstream_direction = (z_out > z_in);
50 if (downstream_direction) {
59 vector<CbmKFMaterial*>::iterator i, ibeg, iend;
62 if (iend != KF->
vMaterial.end() && (*iend)->ZReference - (*iend)->ZThickness / 2 < Z) {
65 if (downstream_direction) {
75 for (i = ibeg; i != iend; downstream_direction ? ++i : --i) {
76 Double_t zthick = (*i)->ZThickness, zcross = (*i)->ZReference;
81 double z0 = (downstream_direction) ? zcross - zthick / 2. : zcross + zthick / 2.;
82 double d = (downstream_direction) ? 1 : -1;
83 double dz = 1.E-1 * (*i)->RadLength;
85 while (z_ + dz < zthick) {
86 err = err || (*i)->Pass(z0 + d * (z_ + dz / 2.), dz, *
this, downstream_direction, qp0);
90 err = err || (*i)->Pass(z0 + d * (z_ + dz / 2.), dz, *
this, downstream_direction, qp0);
118 const Double_t INF = 10000.;
145 err =
h->Filter(*
this, downstream, qp0);
146 Int_t istold =
h->MaterialIndex;
147 for (Int_t i = 1; i < NHits; i++) {
149 Int_t ist =
h->MaterialIndex;
150 for (Int_t j = istold + 1; j < ist; j++) {
151 err = err || KF->
vMaterial[j]->Pass(*
this, downstream, qp0);
153 err = err ||
h->Filter(*
this, downstream, qp0);
159 err =
h->Filter(*
this, downstream, qp0);
160 Int_t istold =
h->MaterialIndex;
161 for (Int_t i = NHits - 2; i >= 0; i--) {
163 Int_t ist =
h->MaterialIndex;
164 for (Int_t j = istold - 1; j > ist; j--) {
165 err = err || KF->
vMaterial[j]->Pass(*
this, downstream, qp0);
167 err = err ||
h->Filter(*
this, downstream, qp0);
194 T[0] = T[1] = T[2] = T[3] = T[4] = T[5] = 0;
215 T[0] = T[1] = T[2] = T[3] = T[4] = T[5] = 0;
238 const Double_t INF = 100.;
264 if (KF->
vMaterial[
h->MaterialIndex]->ZReference <= Z) {
265 h->Filter(*
this, 1, qp0);
266 Int_t istold =
h->MaterialIndex;
267 for (Int_t i = 1; i < NHits; i++) {
269 Int_t ist =
h->MaterialIndex;
270 Int_t j = istold + 1;
271 for (; j < ist; j++) {
277 if (j < ist || KF->vMaterial[
h->MaterialIndex]->ZReference > Z) {
280 h->Filter(*
this, 1, qp0);
287 double Ts[6], Cs[15];
288 for (
int k = 0; k < 6; k++) {
291 for (
int k = 0; k < 15; k++) {
312 if (KF->
vMaterial[
h->MaterialIndex]->ZReference > Z) {
313 h->Filter(*
this, 0, qp0);
314 Int_t istold =
h->MaterialIndex;
315 for (Int_t i = NHits - 2; i >= 0; i--) {
317 Int_t ist =
h->MaterialIndex;
318 Int_t j = istold - 1;
319 for (; j > ist; j--) {
325 if (j > ist || KF->
vMaterial[
h->MaterialIndex]->ZReference <= Z) {
328 h->Filter(*
this, 0, qp0);
338 for (
int k = 0; k < 15; k++) {
345 for (
int k = 0; k < 5; k++) {
348 for (
int k = 0; k < 5; k++) {
349 for (
int l = 0; l < 5; l++) {
350 T[k] -= K[k * 5 + l] * r[l];
356 for (
int l = 0; l < 5; l++) {
359 for (
int l = 0; l < 5; ++l) {
360 for (
int j = 0; j <= l; ++j) {
363 for (
int k = 0; k < 5; ++k) {
368 for (
int l = 0; l < 15; l++) {
392 Double_t a = T[2], b = T[3];
397 Double_t zeta[2] = {
x - T[0],
y - T[1]};
399 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]}};
401 for (Int_t iter = 0; iter < MaxIter; iter++) {
403 Double_t Cv0 = Cv[0] - a * (2 * Cv[3] - a * Cv[5]);
404 Double_t Cv1 = Cv[1] - b * Cv[3] - a * (Cv[4] - b * Cv[5]);
405 Double_t Cv2 = Cv[2] - b * (2 * Cv[4] - b * Cv[5]);
407 Double_t S[3] = {C[0] + Cv0, C[1] + Cv1, C[2] + Cv2};
411 Double_t s = S[0] * S[2] - S[1] * S[1];
426 if (iter < MaxIter - 1) {
428 for (Int_t i = 2; i < 4; ++i) {
429 K[i][0] = CHt[i][0] * S[0] + CHt[i][1] * S[1];
430 K[i][1] = CHt[i][0] * S[1] + CHt[i][1] * S[2];
435 a = T[2] + K[2][0] * zeta[0] + K[2][1] * zeta[1];
436 b = T[3] + K[3][0] * zeta[0] + K[3][1] * zeta[1];
441 for (Int_t i = 0; i < 5; ++i) {
442 K[i][0] = CHt[i][0] * S[0] + CHt[i][1] * S[1];
443 K[i][1] = CHt[i][0] * S[1] + CHt[i][1] * S[2];
450 T[2] += K[2][0] * zeta[0] + K[2][1] * zeta[1];
451 T[3] += K[3][0] * zeta[0] + K[3][1] * zeta[1];
452 T[4] += K[4][0] * zeta[0] + K[4][1] * zeta[1];
456 GetRefChi2() += zeta[0] * zeta[0] * S[0] + 2 * zeta[0] * zeta[1] * S[1] + zeta[1] * zeta[1] * S[2];
460 C[0] -= K[0][0] * CHt[0][0] + K[0][1] * CHt[0][1];
461 C[1] -= K[1][0] * CHt[0][0] + K[1][1] * CHt[0][1];
462 C[2] -= K[1][0] * CHt[1][0] + K[1][1] * CHt[1][1];
463 C[3] -= K[2][0] * CHt[0][0] + K[2][1] * CHt[0][1];
464 C[4] -= K[2][0] * CHt[1][0] + K[2][1] * CHt[1][1];
465 C[5] -= K[2][0] * CHt[2][0] + K[2][1] * CHt[2][1];
466 C[6] -= K[3][0] * CHt[0][0] + K[3][1] * CHt[0][1];
467 C[7] -= K[3][0] * CHt[1][0] + K[3][1] * CHt[1][1];
468 C[8] -= K[3][0] * CHt[2][0] + K[3][1] * CHt[2][1];
469 C[9] -= K[3][0] * CHt[3][0] + K[3][1] * CHt[3][1];
470 C[10] -= K[4][0] * CHt[0][0] + K[4][1] * CHt[0][1];
471 C[11] -= K[4][0] * CHt[1][0] + K[4][1] * CHt[1][1];
472 C[12] -= K[4][0] * CHt[2][0] + K[4][1] * CHt[2][1];
473 C[13] -= K[4][0] * CHt[3][0] + K[4][1] * CHt[3][1];
474 C[14] -= K[4][0] * CHt[4][0] + K[4][1] * CHt[4][1];