Example to fit two histograms at the same time.
Processing /mnt/build/workspace/root-makedoc-v608/rootspi/rdoc/src/v6-08-00-patches/tutorials/fit/TwoHistoFit2D.C...
Do global fit
PARAMETER DEFINITIONS:
NO. NAME VALUE STEP SIZE LIMITS
1 p0 1.00000e+02 1.00000e-02 no limits
2 p1 6.00000e+00 1.00000e-02 no limits
3 p2 2.00000e+00 1.00000e-02 no limits
4 p3 7.00000e+00 1.00000e-02 no limits
5 p4 3.00000e+00 1.00000e-02 no limits
6 p5 1.00000e+02 1.00000e-02 no limits
7 p6 1.20000e+01 1.00000e-02 no limits
8 p7 3.00000e+00 1.00000e-02 no limits
9 p8 1.10000e+01 1.00000e-02 no limits
10 p9 2.00000e+00 1.00000e-02 no limits
**********
** 1 **SET PRINT 0 1.008e-321
**********
**********
** 2 **MIGRAD 5000 0.01
**********
MIGRAD MINIMIZATION HAS CONVERGED.
FCN=4015.63 FROM MIGRAD STATUS=CONVERGED 525 CALLS 526 TOTAL
EDM=7.6486e-07 STRATEGY= 1 ERROR MATRIX UNCERTAINTY 4.8 per cent
EXT PARAMETER STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 p0 2.55114e+01 2.22488e-01 1.18177e-03 1.29664e-03
2 p1 6.03551e+00 1.56999e-02 1.78147e-04 5.19787e-02
3 p2 1.95953e+00 1.34972e-02 1.02338e-04 -2.33229e-02
4 p3 7.09821e+00 3.32869e-02 2.39025e-04 2.42668e-02
5 p4 2.94271e+00 2.42010e-02 -1.88552e-04 2.78492e-03
6 p5 2.63145e+01 2.69272e-01 -2.31447e-03 -2.60065e-03
7 p6 1.19850e+01 3.51596e-02 4.24095e-04 -3.93611e-02
8 p7 2.90086e+00 2.64547e-02 8.06256e-05 -5.19640e-03
9 p8 1.09762e+01 1.47334e-02 -6.74373e-05 -1.09628e-02
10 p9 1.95760e+00 1.14466e-02 2.85422e-05 -1.15592e-01
Chi2 Fit = 4015.63 ndf = 3921 3921
(int) 0
#include <vector>
#include <map>
#include <iostream>
double gauss2D(double *x, double *par) {
double z1 = double((x[0]-par[1])/par[2]);
double z2 = double((x[1]-par[3])/par[4]);
return par[0]*
exp(-0.5*(z1*z1+z2*z2));
}
double my2Dfunc(double *x, double *par) {
double *p1 = &par[0];
double *p2 = &par[5];
return gauss2D(x,p1) + gauss2D(x,p2);
}
std::vector<std::pair<double, double> > coords;
std::vector<double > values;
std::vector<double > errors;
{
int n = coords.size();
double chi2 = 0;
double tmp,x[2];
for (
int i = 0; i <
n; ++i ) {
x[0] = coords[i].first;
x[1] = coords[i].second;
tmp = ( values[i] - my2Dfunc(x,p))/errors[i];
chi2 += tmp*tmp;
}
fval = chi2;
}
void FillHisto(
TH2D * h,
int n,
double * p) {
const double mx1 = p[1];
const double my1 = p[3];
const double sx1 = p[2];
const double sy1 = p[4];
const double mx2 = p[6];
const double my2 = p[8];
const double sx2 = p[7];
const double sy2 = p[9];
const double w1 = 0.5;
for (
int i = 0; i <
n; ++i) {
if (r < w1) {
x = x*sx1 + mx1;
y = y*sy1 + my1;
}
else {
x = x*sx2 + mx2;
y = y*sy2 + my2;
}
}
}
int TwoHistoFit2D(bool global = true) {
int nbx1 = 50;
int nby1 = 50;
int nbx2 = 50;
int nby2 = 50;
double xlow1 = 0.;
double ylow1 = 0.;
double xup1 = 10.;
double yup1 = 10.;
double xlow2 = 5.;
double ylow2 = 5.;
double xup2 = 20.;
double yup2 = 20.;
TH2D * h1 =
new TH2D(
"h1",
"core",nbx1,xlow1,xup1,nby1,ylow1,yup1);
TH2D * h2 =
new TH2D(
"h2",
"tails",nbx2,xlow2,xup2,nby2,ylow2,yup2);
double iniParams[10] = { 100, 6., 2., 7., 3, 100, 12., 3., 11., 2. };
TF2 * func =
new TF2(
"func",my2Dfunc,xlow2,xup2,ylow2,yup2, 10);
int n1 = 50000;
int n2 = 50000;
FillHisto(h1,n1,iniParams);
FillHisto(h2,n2,iniParams);
double dx1 = (xup1-xlow1)/double(nbx1);
double dy1 = (yup1-ylow1)/double(nby1);
double dx2 = (xup2-xlow2)/double(nbx2);
double dy2 = (yup2-ylow2)/double(nby2);
h2->
Scale( (
double(n1) * dx1 * dy1 ) / (
double(n2) * dx2 * dy2 ) );
if (global) {
std::cout << "Do global fit" << std::endl;
coords = std::vector<std::pair<double,double> >();
values = std::vector<double>();
errors = std::vector<double>();
for (int ix = 1; ix <= nbinX1; ++ix) {
for (int iy = 1; iy <= nbinY1; ++iy) {
}
}
}
for (int ix = 1; ix <= nbinX2; ++ix) {
for (int iy = 1; iy <= nbinY2; ++iy) {
}
}
}
for (int i = 0; i < 10; ++i) {
}
double arglist[100];
arglist[0] = 0;
arglist[0] = 5000;
arglist[1] = 0.01;
double minParams[10];
double parErrors[10];
for (int i = 0; i < 10; ++i) {
}
double chi2, edm, errdef;
int nvpar, nparx;
minuit->
GetStats(chi2,edm,errdef,nvpar,nparx);
int ndf = coords.size()-nvpar;
std::cout <<
"Chi2 Fit = " << chi2 <<
" ndf = " << ndf <<
" " << func->
GetNDF() << std::endl;
}
else {
}
TCanvas * c1 =
new TCanvas(
"c1",
"Two HIstogram Fit example",100,10,900,800);
func->
Draw(
"surf1 same");
return 0;
}
- Author
- Rene Brun
Definition in file TwoHistoFit2D.C.