46 GlobalChi2( ROOT::Math::IMultiGenFunction & f1,
47 ROOT::Math::IMultiGenFunction & f2) :
48 fChi2_1(&f1), fChi2_2(&f2) {}
52 double operator() (
const double *par)
const {
54 for (
int i = 0; i < 2; ++i) p1[i] = par[iparB[i] ];
57 for (
int i = 0; i < 5; ++i) p2[i] = par[iparSB[i] ];
59 return (*fChi2_1)(p1) + (*fChi2_2)(p2);
62 const ROOT::Math::IMultiGenFunction * fChi2_1;
63 const ROOT::Math::IMultiGenFunction * fChi2_2;
68 TH1D * hB =
new TH1D(
"hB",
"histo B",100,0,100);
69 TH1D * hSB =
new TH1D(
"hSB",
"histo S+B",100, 0,100);
71 TF1 * fB =
new TF1(
"fB",
"expo",0,100);
72 fB->SetParameters(1,-0.05);
75 TF1 * fS =
new TF1(
"fS",
"gaus",0,100);
76 fS->SetParameters(1,30,5);
78 hSB->FillRandom(
"fB",2000);
79 hSB->FillRandom(
"fS",1000);
83 TF1 * fSB =
new TF1(
"fSB",
"expo + gaus(2)",0,100);
85 ROOT::Math::WrappedMultiTF1 wfB(*fB,1);
86 ROOT::Math::WrappedMultiTF1 wfSB(*fSB,1);
88 ROOT::Fit::DataOptions opt;
89 ROOT::Fit::DataRange rangeB;
91 rangeB.SetRange(10,90);
92 ROOT::Fit::BinData dataB(opt,rangeB);
93 ROOT::Fit::FillData(dataB, hB);
95 ROOT::Fit::DataRange rangeSB;
96 rangeSB.SetRange(10,50);
97 ROOT::Fit::BinData dataSB(opt,rangeSB);
98 ROOT::Fit::FillData(dataSB, hSB);
100 ROOT::Fit::Chi2Function chi2_B(dataB, wfB);
101 ROOT::Fit::Chi2Function chi2_SB(dataSB, wfSB);
103 GlobalChi2 globalChi2(chi2_B, chi2_SB);
105 ROOT::Fit::Fitter fitter;
108 double par0[Npar] = { 5,5,-0.1,100, 30,10};
111 fitter.Config().SetParamsSettings(6,par0);
113 fitter.Config().ParSettings(4).Fix();
115 fitter.Config().ParSettings(2).SetLimits(-10,-1.E-4);
116 fitter.Config().ParSettings(3).SetLimits(0,10000);
117 fitter.Config().ParSettings(3).SetStepSize(5);
119 fitter.Config().MinimizerOptions().SetPrintLevel(0);
120 fitter.Config().SetMinimizer(
"Minuit2",
"Migrad");
124 fitter.FitFCN(6,globalChi2,0,dataB.Size()+dataSB.Size(),
true);
125 ROOT::Fit::FitResult result = fitter.Result();
126 result.Print(std::cout);
128 TCanvas * c1 =
new TCanvas(
"Simfit",
"Simultaneous fit of two histograms",
132 gStyle->SetOptFit(1111);
134 fB->SetFitResult( result, iparB);
135 fB->SetRange(rangeB().first, rangeB().second);
136 fB->SetLineColor(kBlue);
137 hB->GetListOfFunctions()->Add(fB);
141 fSB->SetFitResult( result, iparSB);
142 fSB->SetRange(rangeSB().first, rangeSB().second);
143 fSB->SetLineColor(kRed);
144 hSB->GetListOfFunctions()->Add(fSB);