Hi,
I’m just now teaching myself RooFit. If I generate data from a gaussian I don’t seem to be able to fit it with another gaussian, but can with the first gaussian. The fact that I can’t do this means I have some basic misunderstanding of how RooFit is designed (I’ve ready a bunch of the manual and other tutorials and it hasn’t helped yet).
I started with the very basic example from the tutorials and modified it a bit:
[code]///
/// Generate a gaussian and fit it. This example is motivated by the basic intro
/// RooFit tutorial (http://root.cern.ch/root/html/tutorials/roofit/rf101_basics.C.html)
///
#include <RooRealVar.h>
#include <RooGaussian.h>
#include <RooDataSet.h>
#include
using namespace std;
void main()
{
///
/// Create a gaussian
///
RooRealVar x ("x", "x", -10.0, 10.0);
RooRealVar mean ("mean", "mean of gaussian", 1, -10.0, 10.0);
RooRealVar sigma ("sigma", "width of gaussian", 1, 0.1, 10.0);
RooGaussian gauss("gauss", "gaussian PDF", x, mean, sigma);
///
/// Create the data
///
auto data = gauss.generate(x, 10000);
///
/// Now do the fitting
///
gauss.fitTo(*data);
///
/// Create a second gaussian and see if we can't fit it to the gaussian we have here
///
RooRealVar y ("y", "y", -10.0, 10.0);
RooRealVar mean1 ("mean1", "mean of gaussian fit", 1, -10.0, 10.0);
RooRealVar sigma1 ("sigma1", "width of gaussian fit", 1, 0.1, 10.0);
RooGaussian gauss1("gauss", "gaussian PDF", y, mean1, sigma1);
gauss1.fitTo(*data);
///
/// And get the results
///
cout << "From the fit where we fit the origianl guassian" << endl;
mean.Print();
sigma.Print();
cout << endl;
cout << "From the fit where we fit the second unrelated guassian" << endl;
mean1.Print();
sigma1.Print();
}
[/code]
First, as above, when I run that second fit it allows y, sigma1, and mean1 to float. If I then set y to be a constant (using the SetConstant method) it will fit only mean1 and sigma1, but the values are incorrect. With I have the setConstant on y, here is the bottom part of the output:
[code] EXT PARAMETER APPROXIMATE INTERNAL INTERNAL
NO. NAME VALUE ERROR STEP SIZE VALUE
1 mean1 1.83261e-007 2.21298e-001 5.91453e-007 1.83261e-008
2 sigma1 6.05661e+000 5.95286e+000 5.00000e-001 1.75079e+004
ERR DEF= 0.5
EXTERNAL ERROR MATRIX. NDIM= 25 NPAR= 2 ERR DEF=0.5
4.898e-002 -7.586e+005
-7.586e+005 1.177e+013
ERR MATRIX NOT POS-DEF
PARAMETER CORRELATION COEFFICIENTS
NO. GLOBAL 1 2
1 0.99897 1.000 -0.999
2 0.99897 -0.999 1.000
ERR MATRIX NOT POS-DEF
[#1] INFO:Minization – RooMinuit::optimizeConst: deactivating const optimizatio
n
From the fit where we fit the origianl guassian
RooRealVar::mean = 1.00665 +/- 0.0099736 L(-10 - 10)
RooRealVar::sigma = 0.99736 +/- 0.00705248 L(0.1 - 10)
From the fit where we fit the second unrelated guassian
RooRealVar::mean1 = 1.83261e-007 +/- 0.221298 L(-10 - 10)
RooRealVar::sigma1 = 6.05661 +/- 5.95286 L(0.1 - 10)[/code]
As you can see the first mean/sigma is as expected, but the second one fit from the second histogram is not.
What have I missed here? Many thanks!
Cheers, Gordon.