214 Double_t S0 = h0->GetDy();
215 Double_t S1 = h1->GetDy();
216 Double_t S2 = h2->GetDy();
218 Double_t W0 = 1.0 / S0 / S0;
219 Double_t W1 = 1.0 / S1 / S1;
220 Double_t W2 = 1.0 / S2 / S2;
222 Double_t X0 = h0->GetZ();
223 Double_t X1 = h1->GetZ();
224 Double_t X2 = h2->GetZ();
226 Double_t Y0 = h0->GetY();
227 Double_t Y1 = h1->GetY();
228 Double_t Y2 = h2->GetY();
230 Double_t SumW = W0 + W1 + W2;
231 Double_t SumWX = W0 * X0 + W1 * X1 + W2 * X2;
232 Double_t SumWY = W0 * Y0 + W1 * Y1 + W2 * Y2;
233 Double_t SumWXY = W0 * X0 * Y0 + W1 * X1 * Y1 + W2 * X2 * Y2;
234 Double_t SumWX2 = W0 * X0 * X0 + W1 * X1 * X1 + W2 * X2 * X2;
237 Double_t a = (SumW * SumWXY - SumWX * SumWY) / (SumW * SumWX2 - SumWX * SumWX);
238 Double_t b = (SumWX2 * SumWY - SumWX * SumWXY) / (SumW * SumWX2 - SumWX * SumWX);
240 Double_t chi2 = Sq((Y0 - a * X0 - b) / S0) + Sq((Y1 - a * X1 - b) / S1) + Sq((Y2 - a * X2 - b) / S2);
242 return TVector3(a, b, chi2);
591 Double_t* rh_sigm_seg,
596 Double_t sqrt_2 =
sqrt(2.);
598 Float_t A[4][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
601 Int_t h[8] = {0, 0, 0, 0, 0, 0, 0, 0};
603 for (Int_t
i = 0;
i < 4;
i++)
606 for (Int_t
i = 0;
i < 8;
i++) {
609 if (
i == skip_first ||
i == skip_second || Abs(rh_seg[
i] + 999.) < FLT_EPSILON) {
614 A[0][0] = 2 * z_loc[0] * z_loc[0] * h[0] / rh_sigm_seg[0] + z_loc[4] * z_loc[4] * h[4] / rh_sigm_seg[4]
615 + z_loc[6] * z_loc[6] * h[6] / rh_sigm_seg[6] + 2 * z_loc[1] * z_loc[1] * h[1] / rh_sigm_seg[1]
616 + z_loc[5] * z_loc[5] * h[5] / rh_sigm_seg[5] + z_loc[7] * z_loc[7] * h[7] / rh_sigm_seg[7];
618 A[0][1] = 2 * z_loc[0] * h[0] / rh_sigm_seg[0] + z_loc[4] * h[4] / rh_sigm_seg[4] + z_loc[6] * h[6] / rh_sigm_seg[6]
619 + 2 * z_loc[1] * h[1] / rh_sigm_seg[1] + z_loc[5] * h[5] / rh_sigm_seg[5]
620 + z_loc[7] * h[7] / rh_sigm_seg[7];
622 A[0][2] = z_loc[6] * z_loc[6] * h[6] / rh_sigm_seg[6] - z_loc[4] * z_loc[4] * h[4] / rh_sigm_seg[4]
623 + z_loc[7] * z_loc[7] * h[7] / rh_sigm_seg[7] - z_loc[5] * z_loc[5] * h[5] / rh_sigm_seg[5];
625 A[0][3] = z_loc[6] * h[6] / rh_sigm_seg[6] - z_loc[4] * h[4] / rh_sigm_seg[4] + z_loc[7] * h[7] / rh_sigm_seg[7]
626 - z_loc[5] * h[5] / rh_sigm_seg[5];
630 A[1][0] = 2 * z_loc[0] * h[0] / rh_sigm_seg[0] + z_loc[4] * h[4] / rh_sigm_seg[4] + z_loc[6] * h[6] / rh_sigm_seg[6]
631 + 2 * z_loc[1] * h[1] / rh_sigm_seg[1] + z_loc[5] * h[5] / rh_sigm_seg[5]
632 + z_loc[7] * h[7] / rh_sigm_seg[7];
634 A[1][1] = 2 * h[0] / rh_sigm_seg[0] + 1 * h[4] / rh_sigm_seg[4] + 1 * h[6] / rh_sigm_seg[6]
635 + 2 * h[1] / rh_sigm_seg[1] + 1 * h[5] / rh_sigm_seg[5] + 1 * h[7] / rh_sigm_seg[7];
637 A[1][2] = z_loc[6] * h[6] / rh_sigm_seg[6] - z_loc[4] * h[4] / rh_sigm_seg[4] + z_loc[7] * h[7] / rh_sigm_seg[7]
638 - z_loc[5] * h[5] / rh_sigm_seg[5];
640 A[1][3] = 1 * h[7] / rh_sigm_seg[7] - 1 * h[5] / rh_sigm_seg[5] + 1 * h[6] / rh_sigm_seg[6]
641 - 1 * h[4] / rh_sigm_seg[4];
645 A[2][0] = z_loc[6] * z_loc[6] * h[6] / rh_sigm_seg[6] - z_loc[4] * z_loc[4] * h[4] / rh_sigm_seg[4]
646 + z_loc[7] * z_loc[7] * h[7] / rh_sigm_seg[7] - z_loc[5] * z_loc[5] * h[5] / rh_sigm_seg[5];
648 A[2][1] = z_loc[6] * h[6] / rh_sigm_seg[6] - z_loc[4] * h[4] / rh_sigm_seg[4] + z_loc[7] * h[7] / rh_sigm_seg[7]
649 - z_loc[5] * h[5] / rh_sigm_seg[5];
651 A[2][2] = 2 * z_loc[2] * z_loc[2] * h[2] / rh_sigm_seg[2] + z_loc[4] * z_loc[4] * h[4] / rh_sigm_seg[4]
652 + z_loc[6] * z_loc[6] * h[6] / rh_sigm_seg[6] + 2 * z_loc[3] * z_loc[3] * h[3] / rh_sigm_seg[3]
653 + z_loc[5] * z_loc[5] * h[5] / rh_sigm_seg[5] + z_loc[7] * z_loc[7] * h[7] / rh_sigm_seg[7];
655 A[2][3] = 2 * z_loc[2] * h[2] / rh_sigm_seg[2] + z_loc[4] * h[4] / rh_sigm_seg[4] + z_loc[6] * h[6] / rh_sigm_seg[6]
656 + 2 * z_loc[3] * h[3] / rh_sigm_seg[3] + z_loc[5] * h[5] / rh_sigm_seg[5]
657 + z_loc[7] * h[7] / rh_sigm_seg[7];
661 A[3][0] = z_loc[6] * h[6] / rh_sigm_seg[6] - z_loc[4] * h[4] / rh_sigm_seg[4] + z_loc[7] * h[7] / rh_sigm_seg[7]
662 - z_loc[5] * h[5] / rh_sigm_seg[5];
664 A[3][1] = 1 * h[6] / rh_sigm_seg[6] - 1 * h[4] / rh_sigm_seg[4] + 1 * h[7] / rh_sigm_seg[7]
665 - 1 * h[5] / rh_sigm_seg[5];
667 A[3][2] = 2 * z_loc[2] * h[2] / rh_sigm_seg[2] + z_loc[4] * h[4] / rh_sigm_seg[4] + z_loc[6] * h[6] / rh_sigm_seg[6]
668 + 2 * z_loc[3] * h[3] / rh_sigm_seg[3] + z_loc[5] * h[5] / rh_sigm_seg[5]
669 + z_loc[7] * h[7] / rh_sigm_seg[7];
671 A[3][3] = 2 * h[2] / rh_sigm_seg[2] + 1 * h[4] / rh_sigm_seg[4] + 1 * h[6] / rh_sigm_seg[6]
672 + 2 * h[3] / rh_sigm_seg[3] + 1 * h[5] / rh_sigm_seg[5] + 1 * h[7] / rh_sigm_seg[7];
678 f[0] = 2 * z_loc[0] * rh_seg[0] * h[0] / rh_sigm_seg[0] + sqrt_2 * z_loc[6] * rh_seg[6] * h[6] / rh_sigm_seg[6]
679 - sqrt_2 * z_loc[4] * rh_seg[4] * h[4] / rh_sigm_seg[4] + 2 * z_loc[1] * rh_seg[1] * h[1] / rh_sigm_seg[1]
680 + sqrt_2 * z_loc[7] * rh_seg[7] * h[7] / rh_sigm_seg[7]
681 - sqrt_2 * z_loc[5] * rh_seg[5] * h[5] / rh_sigm_seg[5];
683 f[1] = 2 * rh_seg[0] * h[0] / rh_sigm_seg[0] + sqrt_2 * rh_seg[6] * h[6] / rh_sigm_seg[6]
684 - sqrt_2 * rh_seg[4] * h[4] / rh_sigm_seg[4] + 2 * rh_seg[1] * h[1] / rh_sigm_seg[1]
685 + sqrt_2 * rh_seg[7] * h[7] / rh_sigm_seg[7] - sqrt_2 * rh_seg[5] * h[5] / rh_sigm_seg[5];
687 f[2] = 2 * z_loc[2] * rh_seg[2] * h[2] / rh_sigm_seg[2] + sqrt_2 * z_loc[6] * rh_seg[6] * h[6] / rh_sigm_seg[6]
688 + sqrt_2 * z_loc[4] * rh_seg[4] * h[4] / rh_sigm_seg[4] + 2 * z_loc[3] * rh_seg[3] * h[3] / rh_sigm_seg[3]
689 + sqrt_2 * z_loc[7] * rh_seg[7] * h[7] / rh_sigm_seg[7]
690 + sqrt_2 * z_loc[5] * rh_seg[5] * h[5] / rh_sigm_seg[5];
692 f[3] = 2 * rh_seg[2] * h[2] / rh_sigm_seg[2] + sqrt_2 * rh_seg[6] * h[6] / rh_sigm_seg[6]
693 + sqrt_2 * rh_seg[4] * h[4] / rh_sigm_seg[4] + 2 * rh_seg[3] * h[3] / rh_sigm_seg[3]
694 + sqrt_2 * rh_seg[7] * h[7] / rh_sigm_seg[7] + sqrt_2 * rh_seg[5] * h[5] / rh_sigm_seg[5];
699 Int_t i1, j1, k1, l1;
705 for (i1 = 0; i1 < 4; i1++)
706 for (j1 = 0; j1 < 4; j1++)
707 A0[i1][j1] = A[i1][j1];
710 for (i1 = 0; i1 < 4; i1++)
711 for (j1 = 0; j1 < 4; j1++)
717 for (i1 = 0; i1 < 4; i1++) {
718 for (j1 = i1 + 1; j1 < 4; j1++)
719 if (Abs(A[i1][i1]) < Abs(A[j1][i1])) {
720 for (l1 = 0; l1 < 4; l1++)
721 temp[l1] = A[i1][l1];
722 for (l1 = 0; l1 < 4; l1++)
723 A[i1][l1] = A[j1][l1];
724 for (l1 = 0; l1 < 4; l1++)
725 A[j1][l1] = temp[l1];
726 for (l1 = 0; l1 < 4; l1++)
727 temp[l1] = b[i1][l1];
728 for (l1 = 0; l1 < 4; l1++)
729 b[i1][l1] = b[j1][l1];
730 for (l1 = 0; l1 < 4; l1++)
731 b[j1][l1] = temp[l1];
734 for (j1 = 4 - 1; j1 > -1; j1--) {
738 for (j1 = i1 + 1; j1 < 4; j1++) {
740 for (k1 = 0; k1 < 4; k1++) {
741 A[j1][k1] += A[i1][k1] * factor;
742 b[j1][k1] += b[i1][k1] * factor;
746 for (i1 = 3; i1 > 0; i1--) {
747 for (j1 = i1 - 1; j1 > -1; j1--) {
749 for (k1 = 0; k1 < 4; k1++) {
750 A[j1][k1] += A[i1][k1] * factor;
751 b[j1][k1] += b[i1][k1] * factor;
764 for (i1 = 0; i1 < 4; ++i1)
765 for (j1 = 0; j1 < 4; ++j1) {
768 for (k1 = 0; k1 < 4; ++k1)
769 sum += A0[i1][k1] * b[k1][j1];
773 for (i1 = 0; i1 < 4; i1++) {
775 for (j1 = 0; j1 < 4; j1++) {
776 par_ab[i1] += b[i1][j1] *
f[j1];
1001 if (tr.size() < 2) {
1007 for (
size_t i = 0;
i < tr.size() - 1; ++
i) {
1008 FairTrackParam* pi = tr[
i].GetParamFirst();
1009 Double_t axi = pi->GetTx();
1010 Double_t ayi = pi->GetTy();
1011 Double_t bxi = pi->GetX() - axi * pi->GetZ();
1012 Double_t byi = pi->GetY() - ayi * pi->GetZ();
1013 for (
size_t j =
i + 1; j < tr.size(); ++j) {
1014 FairTrackParam* pj = tr[j].GetParamFirst();
1015 Double_t axj = pj->GetTx();
1016 Double_t ayj = pj->GetTy();
1017 Double_t bxj = pj->GetX() - axj * pj->GetZ();
1018 Double_t byj = pj->GetY() - ayj * pj->GetZ();
1019 A += (Sq(axi - axj) + Sq(ayi - ayj));
1020 B += ((bxi - bxj) * (axi - axj) + (byi - byj) * (ayi - ayj));
1023 Double_t vz = -B / A;
1025 Double_t SumDist = 0;
1027 for (
size_t i = 0;
i < tr.size() - 1; ++
i) {
1028 FairTrackParam* pi = tr[
i].GetParamFirst();
1029 Double_t axi = pi->GetTx();
1030 Double_t ayi = pi->GetTy();
1031 Double_t bxi = pi->GetX() - axi * pi->GetZ();
1032 Double_t byi = pi->GetY() - ayi * pi->GetZ();
1033 for (
size_t j =
i + 1; j < tr.size(); ++j) {
1034 FairTrackParam* pj = tr[j].GetParamFirst();
1035 Double_t axj = pj->GetTx();
1036 Double_t ayj = pj->GetTy();
1037 Double_t bxj = pj->GetX() - axj * pj->GetZ();
1038 Double_t byj = pj->GetY() - ayj * pj->GetZ();
1039 SumDist += Sqrt(Sq(axi * vz + bxi - axj * vz - bxj) + Sq(ayi * vz + byi - ayj * vz - byj));
1043 dist = SumDist / cntr;
1060 TMatrixDSym covdet(5), icovdet(5);
1062 for (
int ir = 0; ir < 5; ir++) {
1063 covdet(ir, ir) = detPar->GetCovariance(ir, ir);
1064 if (detPar->GetCovariance(ir, ir) == 0)
1065 covdet(ir, ir) = 0.00001;
1067 covdet(4, 4) = 10000.;
1072 TMatrixDSym covinit(5), icovinit(5);
1074 for (
int ir = 0; ir < 5; ir++)
1075 for (
int ic = 0; ic < 5; ic++)
1076 covinit(ir, ic) = initPar->GetCovariance(ir, ic);
1080 TMatrixDSym covinitdet(5), icovinitdet(5);
1082 icovinitdet += icovinit;
1083 icovinitdet += icovdet;
1084 covinitdet = icovinitdet;
1085 covinitdet.Invert();
1087 TVectorD suminitdet(5), parinitdet(5);
1088 TVectorD parinit(5), pardet(5);
1089 pardet(0) = detPar->GetX();
1090 pardet(1) = detPar->GetY();
1091 pardet(2) = detPar->GetTx();
1092 pardet(3) = detPar->GetTy();
1094 parinit(0) = initPar->GetX();
1095 parinit(1) = initPar->GetY();
1096 parinit(2) = initPar->GetTx();
1097 parinit(3) = initPar->GetTy();
1098 parinit(4) = initPar->GetQp();
1100 suminitdet += icovinit * parinit;
1101 suminitdet += icovdet * pardet;
1102 parinitdet = covinitdet * suminitdet;
1106 initPar->SetX(parinitdet(0));
1107 initPar->SetY(parinitdet(1));
1108 initPar->SetTx(parinitdet(2));
1109 initPar->SetTy(parinitdet(3));
1110 initPar->SetQp(parinitdet(4));
1111 initPar->SetCovMatrix(covinitdet);
1117 dP2(0, 0) = parinitdet(0) - pardet(0);
1118 dP2(1, 0) = parinitdet(1) - pardet(1);
1119 dP2(2, 0) = parinitdet(2) - pardet(2);
1120 dP2(3, 0) = parinitdet(3) - pardet(3);
1121 dP2(4, 0) = parinitdet(4) - pardet(4);
1123 TMatrixD dP2_T(1, 5);
1125 dP2_T.Transpose(dP2);
1131 dP1(0, 0) = parinitdet(0) - parinit(0);
1132 dP1(1, 0) = parinitdet(1) - parinit(1);
1133 dP1(2, 0) = parinitdet(2) - parinit(2);
1134 dP1(3, 0) = parinitdet(3) - parinit(3);
1135 dP1(4, 0) = parinitdet(4) - parinit(4);
1137 TMatrixD dP1_T(1, 5);
1139 dP1_T.Transpose(dP1);
1142 chi = dP2_T * icovdet * dP2 + dP1_T * icovinit * dP1;