#include #include #include #include #include #include void fitGraph2D() { gStyle->SetOptStat(0); gStyle->SetOptFit(); TCanvas *c = new TCanvas("c","Graph2D example",0,0,800,800); c->Divide(2,3); Double_t rnd, x, y, z; Double_t e = 0.3; Int_t nd = 400; Int_t np = 10000; TRandom r; Double_t fl = 6; TF2 *f2 = new TF2("f2","1000*(([0]*sin(x)/x)*([1]*sin(y)/y))+200",-fl,fl,-fl,fl); f2->SetParameters(1,1); TGraph2D *dt = new TGraph2D(); // Fill the 2D graph for (Int_t N=0; NGetRandom2(x,y); // Generate a random number in [-e,e] rnd = 2*r.Rndm()*e-e; z = f2->Eval(x,y)*(1+rnd); dt->SetPoint(N,x,y,z); } Double_t hr = 350; TH1D *h1 = new TH1D("h1", "#splitline{Difference between Original function}{and Function with noise}", 100, -hr, hr); TH1D *h2 = new TH1D("h2", "#splitline{Difference between Original function}{and Interpolation with Delaunay triangles}", 100, -hr, hr); TH1D *h3 = new TH1D("h3", "#splitline{Difference between Original function}{and Minuit fit}", 500, -hr, hr); f2->SetParameters(0.5,1.5); dt->Fit(f2); TF2 *fit2 = (TF2*)dt->FindObject("f2"); f2->SetParameters(1,1); for (Int_t N=0; NGetRandom2(x,y); // Generate a random number in [-e,e] rnd = 2*r.Rndm()*e-e; z = f2->Eval(x,y)*(1+rnd); h1->Fill(f2->Eval(x,y)-z); z = dt->Interpolate(x,y); h2->Fill(f2->Eval(x,y)-z); z = fit2->Eval(x,y); h3->Fill(f2->Eval(x,y)-z); } gStyle->SetPalette(1); c->cd(1); f2->SetTitle("Original function with Graph2D points on top"); f2->Draw("surf1"); dt->Draw("same p0"); c->cd(3); dt->SetMargin(0.1); dt->SetFillColor(36); dt->SetTitle("Histogram produced with Delaunay interpolation"); dt->Draw("surf4"); c->cd(5); fit2->SetTitle("Minuit fit result on the Graph2D points"); fit2->Draw("surf1"); h1->SetFillColor(47); h2->SetFillColor(38); h3->SetFillColor(29); c->cd(2); h1->Fit("gaus","Q") ; h1->Draw(); c->cd(4); h2->Fit("gaus","Q") ; h2->Draw(); c->cd(6); h3->Fit("gaus","Q") ; h3->Draw(); c->cd(); }