//____________________________________________________________________ void fitCircle(Int_t n=10000) { //generates n points around a circle and fit them TCanvas *c1 = new TCanvas("c1","c1",600,600); c1->SetGrid(); gr = new TGraph(n); if (n> 999) gr->SetMarkerStyle(1); else gr->SetMarkerStyle(3); TRandom3 r; Double_t x,y; for (Int_t i=0;i<n;i++) { r.Circle(x,y,r.Gaus(4,0.3)); gr->SetPoint(i,x,y); } c1->DrawFrame(-5,-5,5,5); gr->Draw("p"); auto chi2Function = [&](const Double_t *par) { //minimisation function computing the sum of squares of residuals // looping at the graph points Int_t np = gr->GetN(); Double_t f = 0; Double_t *x = gr->GetX(); Double_t *y = gr->GetY(); for (Int_t i=0;i<np;i++) { Double_t u = x[i] - par[0]; Double_t v = y[i] - par[1]; Double_t dr = par[2] - std::sqrt(u*u+v*v); f += dr*dr; } return f; }; // wrap chi2 funciton in a function object for the fit // 3 is the number of fit parameters (size of array par) ROOT::Math::Functor fcn(chi2Function,3); ROOT::Fit::Fitter fitter; double pStart[3] = {0,0,1}; fitter.SetFCN(fcn, pStart); fitter.Config().ParSettings(0).SetName("x0"); fitter.Config().ParSettings(1).SetName("y0"); fitter.Config().ParSettings(2).SetName("R"); // do the fit bool ok = fitter.FitFCN(); if (!ok) { Error("line3Dfit","Line3D Fit failed"); } const ROOT::Fit::FitResult & result = fitter.Result(); result.Print(std::cout); //Draw the circle on top of the points TArc *arc = new TArc(result.Parameter(0),result.Parameter(1),result.Parameter(2)); arc->SetLineColor(kRed); arc->SetLineWidth(4); arc->Draw(); }
//____________________________________________________________________ void fitCircle(Int_t n=10000) { //generates n points around a circle and fit them TCanvas *c1 = new TCanvas("c1","c1",600,600); c1->SetGrid(); gr = new TGraph(n); if (n> 999) gr->SetMarkerStyle(1); else gr->SetMarkerStyle(3); TRandom3 r; Double_t x,y; for (Int_t i=0;i<n;i++) { r.Circle(x,y,r.Gaus(4,0.3)); gr->SetPoint(i,x,y); } c1->DrawFrame(-5,-5,5,5); gr->Draw("p"); //Fit a circle to the graph points TVirtualFitter::SetDefaultFitter("Minuit"); //default is Minuit TVirtualFitter *fitter = TVirtualFitter::Fitter(0, 3); fitter->SetFCN(myfcn); fitter->SetParameter(0, "x0", 0, 0.1, 0,0); fitter->SetParameter(1, "y0", 0, 0.1, 0,0); fitter->SetParameter(2, "R", 1, 0.1, 0,0); Double_t arglist[1] = {0}; fitter->ExecuteCommand("MIGRAD", arglist, 0); //Draw the circle on top of the points TArc *arc = new TArc(fitter->GetParameter(0), fitter->GetParameter(1),fitter->GetParameter(2)); arc->SetLineColor(kRed); arc->SetLineWidth(4); arc->Draw(); }
void makegraph_xyhits_mchamp1000(){ //bool save_plots = false; bool save_plots = true; TCanvas* canvas = new TCanvas("c1","c1",10,10,700,550); //canvas_style(canvas); //TH2* h1=new TH2F("h1","",2000,0,2000,2000,-1000,1000); TH2* h1=new TH2F("h1","",1000,-1000,0,1000,0,1000); h1->SetStats(kFALSE); h1->SetTitle(";x [cm];y [cm]"); //h2_style(h1,3,1,1,1001,50,-1111.,-1111.,510,510,20,1,1.4,0); const Int_t n_hits = 20; Float_t x[n_hits] = {-522.992, -524.292, -525.592, -526.892, -606.525, -607.825, -609.124, -610.424, -630.144, -631.444, -632.744, -634.044, -741.681, -743.086, -744.378, -745.665, -765.758, -767.126, -768.413, -769.755}; Float_t y[n_hits] = {82.024, 82.388, 82.661, 82.971, 101.400, 101.678, 101.929, 102.318, 106.826, 107.214, 107.421, 107.769, 132.755, 132.924, 133.286, 133.657, 138.406, 138.637, 139.007, 139.285}; graph = new TGraph(n_hits, x, y); //gr_style(graph,1,1,1,1001,50,-1111,-1111,510,510,20,1,1.3,1); graph->SetMarkerStyle(20); graph->SetMarkerSize(1); graph->SetMarkerColor(1); graph->SetTitle(";x [cm];y [cm]"); //graph->GetYaxis()->SetRangeUser(0,20); //Fit a circle to the graph points TVirtualFitter::SetDefaultFitter("Minuit"); //default is Minuit TVirtualFitter *fitter = TVirtualFitter::Fitter(0, 3); Int_t a,c; Double_t b,f,par; fitter->SetFCN(myfcn); fitter->SetParameter(0, "x0", 0, 0.1, -1000, 1000); fitter->SetParameter(1, "y0", 1000, 0.1, 0, 2000); fitter->SetParameter(2, "R", 1000, 0.1, 0, 1000); Double_t arglist[1] = {0}; fitter->ExecuteCommand("MIGRAD", arglist, 0); //Draw the circle on top of the points TArc *arc = new TArc(fitter->GetParameter(0), fitter->GetParameter(1),fitter->GetParameter(2)); arc->SetLineColor(kRed); arc->SetLineWidth(4); Leg1 = new TLegend(0.45,0.75,0.75,0.85); //Leg1->AddEntry(graph_noChaCut,"Average Before TS","p"); Leg1->AddEntry(graph,"After TS","p"); //Leg1->AddEntry(graph_predicted,"Predicted After TS","p"); Leg1->SetBorderSize(0); Leg1->SetTextSize(0.04); Leg1->SetFillColor(0); //TPaveLabel *text1 = new TPaveLabel(.17,.85,.37,.89,"CMS Preliminary #sqrt{s}=8 TeV","NDC"); //TPaveLabel *text1 = new TPaveLabel(.17,.85,.37,.89,"CMS Preliminary #sqrt{s}=8 TeV 3.4 fb^{-1}","NDC"); //TPaveLabel *text1 = new TPaveLabel(.17,.85,.37,.89,"CMS Preliminary #sqrt{s}=8 TeV 4.4 fb^{-1}","NDC"); TPaveLabel *text1 = new TPaveLabel(.17,.85,.37,.89,"CMS Preliminary #sqrt{s}=8 TeV","NDC"); text1->SetBorderSize(0); text1->SetTextSize(0.7); text1->SetFillColor(0); TPaveLabel *text2 = new TPaveLabel(.17,.85,.37,.89,"1000 GeV H++, Event 58654","NDC"); text2->SetBorderSize(0); text2->SetTextSize(0.7); text2->SetFillColor(0); TPaveText* text1a = new TPaveText(-500,500,-300,700); text1a->SetBorderSize(0); text1a->SetTextSize(0.05); text1a->SetFillColor(0); double p0 = fitter->GetParameter(0); double p1 = fitter->GetParameter(1); double p2 = fitter->GetParameter(2); double e0 = fitter->GetParError(0); double e1 = fitter->GetParError(1); double e2 = fitter->GetParError(2); char p0name[50], p1name[50], p2name[50]; sprintf(p0name,"x0 = %.2f #pm %.2f",p0,e0); sprintf(p1name,"y0 = %.2f #pm %.2f",p1,e1); sprintf(p2name,"R = %.2f #pm %.2f",p2,e2); text1a->AddText(p0name); text1a->AddText(p1name); text1a->AddText(p2name); canvas->cd(); h1->Draw(); arc->Draw("same"); graph->Draw("Psame"); //text1->Draw(); text1a->Draw(); text2->Draw(); //Leg1->Draw(); if(save_plots) canvas->SaveAs("../plots/hits_xy_mchamp1000.eps"); //return 0; }