here,
I have a problem when fitting with the chi2-square method!
With the following program I create several random-histograms consisting
of two parts: a flat poisson-background (with mean 2) and a Gaussian line
centered at channel 50, with sigma 2.0 and with 100 counts in it.
Then I fit this histogram with the function 'function' (assuming a flat
backgriund and a gaussian line), using the Chi-square method or the
Maximum likelihood method (adding a 'L' to the fitting options).
Each results of each fit are then given into a second histogram 'sum'.
When I do the fit with Maximum likelihood, the results in histogram 'sum'
are really good, fluctuating around the true value of 100. But when I use
the chi-square method, the results are centered around 95 which is quite
wrong! Only a few percent of the results give values larger than 100!
So what is wrong here? Maybe the chi-square method itself gives confusing
results? Or is there a bug in the fitting procedure?
Thanks for help
A. Dietz
P.S. When doing the same but with 10000 counts in the line, BOTH methods
give very good results.
Program:
start()
{
gROOT->Reset();
c1 = new TCanvas("c1","The fitting problem",200,10,600,400);
c1->SetGrid();
// Create one histograms.
main = new TH1F("main","Test spectrum",100,0,100);
sum = new TH1F("sum" ,"Fittig results",100,80,120);
sum->SetStats(kFALSE);
sum->SetFillColor(47);
main->SetStats(kFALSE);
main->SetFillColor(46);
for (Int_t k=0;k<=100;k++) {
// setting random seeds
gRandom->SetSeed(k);
Float_t value;
// filling spectrum with Poisson background
for (Int_t i=0;i<=100;i++) {
value=gRandom->Poisson(1);
main->SetBinContent(i,value);
}
// adding gaussian line at channel 50, sigma 2.0=channel with 100
counts in it
Int_t counts=100;
for ( Int_t i=0; i<counts; i++) {
value = gRandom->Gaus(50,2.0);
main->Fill(value);
}
main->Draw("");
c1->Update();
c1->Modified();
// fiting the spectrum
TF1* func=new TF1("func",function,0,100,4);
func->SetParameters(1,100,50,2);
main->Fit("func","QWEMR"); // or with likelihood: "LQWEMR"
// printing out size of line
Float_t size=func->GetParameter(1);
cout << "Size of line: " << size << endl;
// store result to histogram 'sum'
sum->Fill(size);
}
// showing the results of the fit
sum->Draw();
}
// fitting function
Double_t function(Double_t* x, Double_t* p)
{
Double_t dummy=(x[0]-p[2])/p[3];
Double_t result=p[0] + p[1]*exp(-0.5*dummy*dummy)/ (2.506 * p[3]);
return result;
}
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:47 MET