59 const Int_t MaxIter = 3;
67 r[0] =
r[1] =
r[2] = 0.;
81 for (
Int_t iteration = 0; iteration < MaxIter; ++iteration) {
83 for (
int i = 0;
i < 8;
i++)
94 C[0] =
C[2] =
C[5] = 100.0;
99 for (vector<CbmKFTrackInterface*>::iterator tr =
vTracks.begin(); tr !=
vTracks.end(); ++tr) {
102 T.Extrapolate(
r0[2]);
111 Double_t s = V[0] * V[2] - V[1] * V[1];
112 s = (s > 1.E-20) ? 1. / s : 0;
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];
120 double mm[6], VV[21];
122 double c2 = 1. / (1. + a * a + b * b);
125 double pz =
sqrt(p2 * c2);
128 double E =
sqrt(T.GetMass() * T.GetMass() + p2);
130 double da = (
m[2] - a);
131 double db = (
m[3] - b);
132 double dq = (
m[4] - qp);
134 double H[3] = {-px * c2, -py * c2, -pz * p};
135 double HE = -p * p2 / E;
137 double dpz = H[0] * da + H[1] * db + H[2] * dq;
141 mm[2] = px + da + a * dpz;
142 mm[3] = py + db + b * dpz;
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]);
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;
166 VV[12] = capz * pz + a * cpzpz;
167 VV[13] = cbpz * pz + b * cpzpz;
171 VV[17] = HE * (V[12] * pz + a * cqpz);
172 VV[18] = HE * (V[13] * pz + b * cqpz);
174 VV[20] = HE * HE * V[14];
179 Chi2 += T.GetRefChi2();
180 NDF += T.GetRefNDF() - 3;
207 Double_t zeta[2] = {mm[0] - (
r[0] - a * (
r[2] -
r0[2])), mm[1] - (
r[1] - b * (
r[2] -
r0[2]))};
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]};
219 Double_t s = S[0] * S[2] - S[1] * S[1];
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];
254 K0[
i] = CHt0[
i] * S[0] + CHt1[
i] * S[1];
255 K1[
i] = CHt0[
i] * S[1] + CHt1[
i] * S[2];
261 r[
i] += K0[
i] * zeta[0] + K1[
i] * zeta[1];
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];
273 Chi2 += zeta[0] * zeta[0] * S[0] + 2 * zeta[0] * zeta[1] * S[1] + zeta[1] * zeta[1] * S[2];
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;
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;
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;
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];
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];
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];
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];
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];
529 double z[3] = {
m[0] -
r[0],
m[1] -
r[1],
m[2] -
r[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];
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]};
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];
548 det = (AV[0] * AVi[0] + AV[1] * AVi[1] + AV[3] * AVi[3]);
549 det = (det > 1.e-8) ? 1. / det : 0;
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])
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];
572 C[9] += d0 * B[0][0] + d1 * B[0][1] + d2 * B[0][2];
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];
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];
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];
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];
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];
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];
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];
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];
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];
630 C[28] +=
r0[0] *
C[35];
631 C[29] +=
r0[1] *
C[35];
632 C[30] +=
r0[2] *
C[35];
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];
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];