void FitFunc() { TGraphErrors *graph_no_target = new TGraphErrors("without_target.csv", "%lg, %lg, %*lg, %lg"); graph_no_target->SetMarkerStyle(21); graph_no_target->SetMarkerColor(kBlue); graph_no_target->SetLineColor(kBlue); TCanvas *c1 = new TCanvas("c1", "Data without target", 800, 600); gPad->SetLogy(); graph_no_target->Draw("APE"); graph_no_target->GetXaxis()->SetLimits(-50, 50); graph_no_target->SetMinimum(1e-1); graph_no_target->SetMaximum(1000000); TF1 *fitFunc = new TF1("fitFunc", "[0]*( (1-[1])*ROOT::Math::normal_pdf(x - [2], [3]) + [1]*ROOT::Math::tdistribution_pdf( (x-[2])/[4], [5]) ) ", -50, 50); fitFunc->SetNpx(1000); fitFunc->SetParLimits(0,1e5,1e6); fitFunc->SetParLimits(1,0,1.); fitFunc->SetParLimits(2,-1.,1.); fitFunc->SetParameters(300000, 0.05, 0.1, 0.6, 3, 3); graph_no_target->Fit(fitFunc,"LME"); TGraphErrors *graph_target = new TGraphErrors("with_target.csv", "%lg, %lg, %*lg, %lg"); TF1Convolution *f_conv = new TF1Convolution("fitFunc", "ROOT::Math::tdistribution_pdf(x/[1],[0])", -50,50, true); f_conv->SetRange(-50,50.); f_conv->SetNofPointsFFT(1000); TF1 *f = new TF1("f_conv", *f_conv, -50., 50., f_conv->GetNpar()); for(int i=1;i<=5;i++) f->FixParameter(i,fitFunc->GetParameter(i)); f->SetParameter(0,5e6); f->SetParameter(6,10); f->SetParameter(7,10); f->SetNpx(1000); TCanvas *c2 = new TCanvas("c2", "Data with target", 800, 600); gPad->SetLogy(); graph_target->Draw("APE"); graph_target->GetXaxis()->SetLimits(-50, 50); graph_target->SetMinimum(1e-1); graph_target->SetMaximum(1000000); graph_target->Fit(f, "LME", "", -50, 50); f = graph_target->GetFunction("f_conv"); f->GetNDF(); f->GetChisquare(); f->GetProb(); std::cout << "Chi-squared: " << f->GetChisquare() << std::endl; std::cout << "NDF: " << f->GetNDF() << std::endl; std::cout << "Probability: " << f->GetProb() << std::endl; }