42 int iter, iterMax = 20;
43 int i_iter, i_max_Robust = 4;
44 const int MinNuberOfHits = 3;
45 const int MaxNuberOfHits = 2000;
47 double M0, Mx, My, Mz, Mxy, Mxx, Myy, Mxz, Myz, Mzz, Mxz2, Myz2,
49 double A0, A1, A2, A22, epsilon = 0.000000000001;
50 double Dy, xnew, xold, ynew, yold = 100000000000.;
52 double SumS1 = 0., SumS2 = 0.;
55 double sigma_min = 0.05;
57 double d[MaxNuberOfHits];
58 double w[MaxNuberOfHits];
61 for (
int i = 0; i < MaxNuberOfHits; i++)
65 for (
int i = 0; i < nofHits; i++) {
74 for (i_iter = 0; i_iter < i_max_Robust; i_iter++) {
77 for (
int i = 0; i < nofHits; i++) {
80 d[i] =
sqrt(dx * dx + dy * dy) - radius;
81 SumS1 += w[i] * d[i] * d[i];
88 sigma =
sqrt(SumS1 / SumS2);
90 if (sigma < sigma_min) sigma = sigma_min;
94 for (
int i = 0; i < nofHits; i++) {
95 if (d[i] <= ctsigma) {
96 w[i] = (1 - (d[i] / (ctsigma)) * (d[i] / (ctsigma))) * (1 - (d[i] / (ctsigma)) * (d[i] / (ctsigma)));
105 Mxx = Myy = Mxy = Mxz = Myz = Mzz = 0.;
106 for (
int i = 0; i < nofHits; i++) {
110 Zi = Xi * Xi + Yi * Yi;
120 if (M0 < MinNuberOfHits) {
122 Mxx = Myy = Mxy = Mxz = Myz = Mzz = 0.;
124 for (
int i = 0; i < nofHits; i++) {
127 Zi = Xi * Xi + Yi * Yi;
146 Cov_xy = Mxx * Myy - Mxy * Mxy;
150 A2 = 4. * Cov_xy - 3. * Mz * Mz - Mzz;
151 A1 = Mzz * Mz + 4. * Cov_xy * Mz - Mxz2 - Myz2 - Mz * Mz * Mz;
152 A0 = Mxz2 * Myy + Myz2 * Mxx - Mzz * Cov_xy - 2. * Mxz * Myz * Mxy + Mz * Mz * Cov_xy;
159 for (iter = 0; iter < iterMax; iter++) {
160 ynew = A0 + xnew * (A1 + xnew * (A2 + 4. * xnew * xnew));
162 if (fabs(ynew) > fabs(yold)) {
168 Dy = A1 + xnew * (A22 + 16. * xnew * xnew);
170 xnew = xold - ynew / Dy;
172 if (fabs((xnew - xold) / xnew) < epsilon)
break;
175 if (iter == iterMax - 1) {
185 GAM = -Mz - xnew - xnew;
186 DET = xnew * xnew - xnew * Mz + Cov_xy;
187 centerX = (Mxz * (Myy - xnew) - Myz * Mxy) / DET / 2.;
188 centerY = (Myz * (Mxx - xnew) - Mxz * Mxy) / DET / 2.;
189 radius =
sqrt(centerX * centerX + centerY * centerY - GAM);
190 centerX = centerX + Mx;
191 centerY = centerY + My;