35 const int nsig = 5.E4;
36 const int nbkg = 1.e6;
37 Int_t NEvents = nsig+nbkg;
40 double signal_mean = 3;
41 TF1 *f_cb =
new TF1(
"MyCrystalBall",
"crystalball",-5.,5.);
42 TF1 *f_exp =
new TF1(
"MyExponential",
"expo",-5.,5.);
45 f_exp-> SetParameters(1.,-0.3);
46 f_cb -> SetParameters(1,signal_mean,0.3,2,1.5);
50 TF1NormSum *fnorm_exp_cb =
new TF1NormSum(f_cb,f_exp,nsig,nbkg);
53 TF1 * f_sum =
new TF1(
"fsum", *fnorm_exp_cb, -5., 5., fnorm_exp_cb->GetNpar());
57 f_sum->SetParameters( fnorm_exp_cb->GetParameters().data() );
58 f_sum->SetParName(1,
"NBackground");
59 f_sum->SetParName(0,
"NSignal");
60 for (
int i = 2; i < f_sum->GetNpar(); ++i)
61 f_sum->SetParName(i,fnorm_exp_cb->GetParName(i) );
66 TH1D *h_sum =
new TH1D(
"h_ExpCB",
"Exponential Bkg + CrystalBall function", NBins, -5., 5.);
67 for (
int i=0; i<NEvents; i++)
69 h_sum -> Fill(f_sum -> GetRandom());
71 printf(
"Time to generate %d events: ",NEvents);
77 h_sum -> Scale(1.,
"width");
80 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(
"Minuit2");
81 new TCanvas(
"Fit",
"Fit",800,1000);
83 auto result = h_sum -> Fit(
"fsum",
"SQ");
86 printf(
"Time to fit using ROOT TF1Normsum: ");
90 std::vector<double> pref = {nsig, nbkg, signal_mean};
91 for (
unsigned int i = 0; i< pref.size(); ++i) {
92 if (!TMath::AreEqualAbs(pref[i], f_sum->GetParameter(i), f_sum->GetParError(i)*10.) )
93 Error(
"testFitNormSum",
"Difference found in fitted %s - difference is %g sigma",f_sum->GetParName(i), (f_sum->GetParameter(i)-pref[i])/f_sum->GetParError(i));
96 gStyle->SetOptStat(0);
98 auto t1 =
new TLatex(-2.5, 300000, TString::Format(
"%s = %8.0f #pm %4.0f",
"NSignal",f_sum->GetParameter(0), f_sum->GetParError(0) ) );
99 auto t2 =
new TLatex(-2.5, 270000, TString::Format(
"%s = %8.0f #pm %4.0f",
"Nbackgr",f_sum->GetParameter(1), f_sum->GetParError(1) ) );