Double_t GetRand(TF1 *func, Double_t X_MIN, Double_t X_MAX, int seed ) { Double_t Y_MAX; Y_MAX = func->GetMaximum(); //std::cout << "Y_MAX=" << Y_MAX << std::endl; TRandom2* r = new TRandom3(seed); Double_t x =0; Double_t y = r->Uniform(); Double_t f_y = 3e+6; while(1) { x = r->Uniform(X_MIN, X_MAX); //std::cout << "x=" << x << std::endl; y = r->Uniform(0, Y_MAX); //std::cout << "y=" << y << std::endl; f_y = func->Eval(x); //std::cout << "f_y=" << f_y << std::endl; if(f_y > y) break; } //std::cout << "x budur=" << x << std::endl; return x; }
void ThreeDFit() { const int n = 1000; double x[n], y[n], z[n], v[n]; double ev = 0.1; // generate the data TRandom2 r; for (int i = 0; i < n; ++i) { x[i] = r.Uniform(0,10); y[i] = r.Uniform(0,10); z[i] = r.Uniform(0,10); v[i] = sin(x[i] ) + cos(y[i]) + z[i] + r.Gaus(0,ev); } // create a 3d binned data structure ROOT::Fit::BinData data(n,3); double xx[3]; for(int i = 0; i < n; ++i) { xx[0] = x[i]; xx[1] = y[i]; xx[2] = z[i]; // add the 3d-data coordinate, the predictor value (v[i]) and its errors data.Add(xx, v[i], ev); } TF3 * f3 = new TF3("f3","[0] * sin(x) + [1] * cos(y) + [2] * z",0,10,0,10,0,10); f3->SetParameters(2,2,2); ROOT::Fit::Fitter fitter; // wrapped the TF1 in a IParamMultiFunction interface for teh Fitter class ROOT::Math::WrappedMultiTF1 wf(*f3,3); fitter.SetFunction(wf); // bool ret = fitter.Fit(data); if (ret) { const ROOT::Fit::FitResult & res = fitter.Result(); // print result (should be around 1) res.Print(std::cout); // copy all fit result info (values, chi2, etc..) in TF3 f3->SetFitResult(res); // test fit p-value (chi2 probability) double prob = res.Prob(); if (prob < 1.E-2) Error("exampleFit3D","Bad data fit - fit p-value is %f",prob); else std::cout << "Good fit : p-value = " << prob << std::endl; } else Error("exampleFit3D","3D fit failed"); }