52 double gauss2D(
double *x,
double *par) {
53 double z1 = double((x[0]-par[1])/par[2]);
54 double z2 = double((x[1]-par[3])/par[4]);
55 return par[0]*exp(-0.5*(z1*z1+z2*z2));
57 double my2Dfunc(
double *x,
double *par) {
58 return gauss2D(x,&par[0]) + gauss2D(x,&par[5]);
67 void myFcn(Int_t & , Double_t * , Double_t &fval, Double_t *p, Int_t )
69 TAxis *xaxis1 = h1->GetXaxis();
70 TAxis *yaxis1 = h1->GetYaxis();
71 TAxis *xaxis2 = h2->GetXaxis();
72 TAxis *yaxis2 = h2->GetYaxis();
74 int nbinX1 = h1->GetNbinsX();
75 int nbinY1 = h1->GetNbinsY();
76 int nbinX2 = h2->GetNbinsX();
77 int nbinY2 = h2->GetNbinsY();
83 for (
int ix = 1; ix <= nbinX1; ++ix) {
84 x[0] = xaxis1->GetBinCenter(ix);
85 for (
int iy = 1; iy <= nbinY1; ++iy) {
86 if ( h1->GetBinError(ix,iy) > 0 ) {
87 x[1] = yaxis1->GetBinCenter(iy);
88 tmp = (h1->GetBinContent(ix,iy) - my2Dfunc(x,p))/h1->GetBinError(ix,iy);
94 for (
int ix = 1; ix <= nbinX2; ++ix) {
95 x[0] = xaxis2->GetBinCenter(ix);
96 for (
int iy = 1; iy <= nbinY2; ++iy) {
97 if ( h2->GetBinError(ix,iy) > 0 ) {
98 x[1] = yaxis2->GetBinCenter(iy);
99 tmp = (h2->GetBinContent(ix,iy) - my2Dfunc(x,p))/h2->GetBinError(ix,iy);
108 void FillHisto(TH2D * h,
int n,
double * p) {
111 const double mx1 = p[1];
112 const double my1 = p[3];
113 const double sx1 = p[2];
114 const double sy1 = p[4];
115 const double mx2 = p[6];
116 const double my2 = p[8];
117 const double sx2 = p[7];
118 const double sy2 = p[9];
120 const double w1 = 0.5;
123 for (
int i = 0; i < n; ++i) {
127 double r = rndm.Rndm(1);
144 int fit2dHist(
int option=1) {
161 h1 =
new TH2D(
"h1",
"core",nbx1,xlow1,xup1,nby1,ylow1,yup1);
162 h2 =
new TH2D(
"h2",
"tails",nbx2,xlow2,xup2,nby2,ylow2,yup2);
164 double iniParams[10] = { 100, 6., 2., 7., 3, 100, 12., 3., 11., 2. };
166 TF2 * func =
new TF2(
"func",my2Dfunc,xlow2,xup2,ylow2,yup2, 10);
167 func->SetParameters(iniParams);
172 FillHisto(h1,n1,iniParams);
173 FillHisto(h2,n2,iniParams);
176 double dx1 = (xup1-xlow1)/
double(nbx1);
177 double dy1 = (yup1-ylow1)/
double(nby1);
178 double dx2 = (xup2-xlow2)/
double(nbx2);
179 double dy2 = (yup2-ylow2)/
double(nby2);
182 h2->Scale( (
double(n1) * dx1 * dy1 ) / (
double(n2) * dx2 * dy2 ) );
185 if (option > 10) global =
true;
188 std::cout <<
"Do global fit" << std::endl;
192 if (option%10 == 2) TVirtualFitter::SetDefaultFitter(
"Minuit2");
193 else TVirtualFitter::SetDefaultFitter(
"Minuit");
194 TVirtualFitter * minuit = TVirtualFitter::Fitter(0,10);
195 for (
int i = 0; i < 10; ++i) {
196 minuit->SetParameter(i, func->GetParName(i), func->GetParameter(i), 0.01, 0,0);
198 minuit->SetFCN(myFcn);
203 minuit->ExecuteCommand(
"SET PRINT",arglist,2);
208 minuit->ExecuteCommand(
"MIGRAD",arglist,2);
211 double minParams[10];
212 double parErrors[10];
213 for (
int i = 0; i < 10; ++i) {
214 minParams[i] = minuit->GetParameter(i);
215 parErrors[i] = minuit->GetParError(i);
217 double chi2, edm, errdef;
219 minuit->GetStats(chi2,edm,errdef,nvpar,nparx);
221 func->SetParameters(minParams);
222 func->SetParErrors(parErrors);
223 func->SetChisquare(chi2);
224 int ndf = npfits-nvpar;
228 h1->GetListOfFunctions()->Add(func);
229 h2->GetListOfFunctions()->Add(func);
238 TCanvas * c1 =
new TCanvas(
"c1",
"Two HIstogram Fit example",100,10,900,800);
241 gStyle->SetStatY(0.6);
245 func->SetRange(xlow1,ylow1,xup1,yup1);
246 func->DrawCopy(
"cont1 same");
249 func->DrawCopy(
"surf1 same");
251 func->SetRange(xlow2,ylow2,xup2,yup2);
253 func->DrawCopy(
"cont1 same");
257 func->Draw(
"surf1 same");