32 using namespace ROOT::Math;
36 void line(
double t,
const double *p,
double &x,
double &y,
double &z) {
53 SumDistance2(TGraph2D *g) : fGraph(g) {}
56 double distance2(
double x,
double y,
double z,
const double *p) {
60 XYZVector x0(p[0], p[2], 0. );
61 XYZVector x1(p[0] + p[1], p[2] + p[3], 1. );
62 XYZVector u = (x1-x0).Unit();
63 double d2 = ((xp-x0).Cross(u)).Mag2();
68 double operator() (
const double *par) {
70 double * x = fGraph->GetX();
71 double * y = fGraph->GetY();
72 double * z = fGraph->GetZ();
73 int npoints = fGraph->GetN();
75 for (
int i = 0; i < npoints; ++i) {
76 double d = distance2(x[i],y[i],z[i],par);
80 std::cout <<
"Total Initial distance square = " << sum << std::endl;
90 gStyle->SetOptStat(0);
101 TGraph2D * gr =
new TGraph2D();
104 double p0[4] = {10,20,1,2};
107 for (Int_t N=0; N<nd; N++) {
110 double t = gRandom->Uniform(0,10);
114 x += gRandom->Gaus(0,err);
115 y += gRandom->Gaus(0,err);
116 z += gRandom->Gaus(0,err);
117 gr->SetPoint(N,x,y,z);
122 ROOT::Fit::Fitter fitter;
126 SumDistance2 sdist(gr);
127 ROOT::Math::Functor fcn(sdist,4);
129 double pStart[4] = {1,1,1,1};
130 fitter.SetFCN(fcn,pStart);
132 for (
int i = 0; i < 4; ++i) fitter.Config().ParSettings(i).SetStepSize(0.01);
134 bool ok = fitter.FitFCN();
136 Error(
"line3Dfit",
"Line3D Fit failed");
140 const ROOT::Fit::FitResult & result = fitter.Result();
142 std::cout <<
"Total final distance square " << result.MinFcnValue() << std::endl;
143 result.Print(std::cout);
149 const double * parFit = result.GetParams();
155 TPolyLine3D *l =
new TPolyLine3D(n);
156 for (
int i = 0; i <n;++i) {
157 double t = t0+ dt*i/n;
159 line(t,parFit,x,y,z);
160 l->SetPoint(i,x,y,z);
162 l->SetLineColor(kRed);
166 TPolyLine3D *l0 =
new TPolyLine3D(n);
167 for (
int i = 0; i <n;++i) {
168 double t = t0+ dt*i/n;
171 l0->SetPoint(i,x,y,z);
173 l0->SetLineColor(kBlue);