3 #include <Math/Point2D.h>
4 #include <Math/Point2Dfwd.h>
5 #include <Math/Point3D.h>
6 #include <Math/Vector2D.h>
7 #include <Math/Vector3D.h>
8 #include <Math/Vector3Dfwd.h>
27 XYPoint p1 = {points[0].X(), points[0].Y()};
28 XYPoint p2 = {points[1].X(), points[1].Y()};
29 XYPoint p3 = {points[2].X(), points[2].Y()};
31 double a = 2 * (p2 - p1).X();
32 double b = 2 * (p2 - p1).Y();
33 double c = p2.Mag2() - p1.Mag2();
34 double d = 2 * (p3 - p2).X();
35 double e = 2 * (p3 - p2).Y();
36 double f = p3.Mag2() - p2.Mag2();
39 center /= (b * d - e * a);
50 return std::abs(pointToCenter.Rho() -
GetRadius());
74 int iter, IterMAX = 99;
77 double Xm = 0, Ym = 0, Zm = 0;
78 double Mz, Mxy, Mxx, Myy, Mxz, Myz, Mzz, Cov_xy, Var_z;
79 double A0, A1, A2, A22, A3, A33;
80 double Dy, xnew, x, ynew,
y;
81 double DET, Xcenter, Ycenter;
85 bool doChargeWeight = points.size() == charge.size();
87 for (
int i = 0; i < points.size(); ++i) {
88 const auto hitQ = doChargeWeight ? charge[i] : 1;
89 const auto &pos = points[i];
91 Xm += pos.X() * hitQ / 10.;
92 Ym += pos.Y() * hitQ / 10.;
100 Mxx = Myy = Mxy = Mxz = Myz = Mzz = 0.;
102 for (
const auto &pos : points) {
105 Zi = Xi * Xi + Yi * Yi;
115 Mxx /= points.size();
116 Myy /= points.size();
117 Mxy /= points.size();
118 Mxz /= points.size();
119 Myz /= points.size();
120 Mzz /= points.size();
125 Cov_xy = Mxx * Myy - Mxy * Mxy;
126 Var_z = Mzz - Mz * Mz;
128 A2 = -3.0 * Mz * Mz - Mzz;
129 A1 = Var_z * Mz + 4.0 * Cov_xy * Mz - Mxz * Mxz - Myz * Myz;
130 A0 = Mxz * (Mxz * Myy - Myz * Mxy) + Myz * (Myz * Mxx - Mxz * Mxy) - Var_z * Cov_xy;
138 for (x = 0.,
y = A0, iter = 0; iter < IterMAX; iter++)
140 Dy = A1 + x * (A22 + A33 * x);
142 if ((xnew == x) || (!std::isfinite(xnew)))
144 ynew = A0 + xnew * (A1 + xnew * (A2 + xnew * A3));
145 if (std::abs(ynew) >= std::abs(
y))
153 DET = x * x - x * Mz + Cov_xy;
154 Xcenter = (Mxz * (Myy - x) - Myz * Mxy) / DET / 2.0;
155 Ycenter = (Myz * (Mxx - x) - Mxz * Mxy) / DET / 2.0;
161 r = sqrt(Xcenter * Xcenter + Ycenter * Ycenter + Mz);
167 fChi2 = fabs(Mz - r * r);