Hi Johannes,
If the fit looks good but the chisquare wrong, it is symptomatic
of wrong errors for your histogram. In particular, when you fill
histograms with weights, you should call TH1::Sumw2 before filling,
otherwise ROOT will take bin_error = sqrt(bin_content).
I suggest to call Sumw2 for all your histograms involved in the fit.
If this does not solve this problem, please send me a small tar file
with your histogram in a file.root and a script. Make sure
that the script is autonomous such that I can use it directly.
Rene Brun
On Sat, 16 Feb 2002, Johannes wrote:
> Hi Rooters,
>
> I have some problems with the calculation of the
> chisquare of a signal+background histogram fit.
> Although the fit both of the signal and the combined
> signal+background looks quite good, the chisquare is
> by far too high.
> I already tried to set the fit limits close by the
> signal gauss, but it doesn't help.
>
>
> Here's my code:
>
> TF1* gaussian = new TF1 ("gaussian",
> "2*[0]*(1/(sqrt(2*pi)*[2]))*exp(-.5*((x-[1])/[2])^2)",0.,75000.);
>
> TF1* ceby = new TF1("ceby",
> "[0]*cheby_0+[1]*cheby_1+[2]*cheby_2+[3]*cheby_3+[4]*cheby_4");
>
> TF1* fit_func = new TF1("fit_func",
> "(2*[0]*(1/(sqrt(2*pi)*[2]))*exp(-.5*((x-[1])/[2])^2))+[3]*cheby_0+[4]*cheby_1+[5]
> *cheby_2+[6]*cheby_3+[7]*cheby_4",10000.,75000.);
>
>
> [...]
> gaussian->SetParameter(0,start_parameter[0]);
> gaussian->SetParameter(1,start_parameter[1]);
> gaussian->SetParameter(2,start_parameter[2]);
> ceby->SetParameter(3,start_parameter[3]);
> ceby->SetParameter(4,start_parameter[4]);
> ceby->SetParameter(5,start_parameter[5]);
> ceby->SetParameter(6,start_parameter[6]);
> ceby->SetParameter(7,start_parameter[7]);
>
> calibration_histos[i]->Fit("ceby","0+","");
> // 0(zero)=Store, do not draw
> TH1F* htemp=(TH1F*)calibration_histos[i]->Clone();
> htemp->SetName("htemp");
> htemp->Reset();
> background=calibration_histos[i]->GetFunction("ceby");
> for (int bin=min_bin;bin<max_bin;bin++)
> {
> float x;
> x=calibration_histos[i]->GetBinCenter(bin);
> double value, difference;
> value=ceby->Eval(x);
>
> difference=fabs(value-calibration_histos[i]->GetBinContent(bin));
> htemp->Fill(x,difference);
> }
> htemp->Fit("gaussian","0+","");
> signal=htemp->GetFunction("gaussian");
>
> signal->GetParameters(¶meters[0]);
> background->GetParameters(¶meters[3]);
> fit_func->SetParameters(parameters);
> calibration_histos[i]->Fit("fit_func","0+","");
> for (int grumpf=0; grumpf<8;grumpf++)
> {
> cerr << endl << parameters[grumpf] << endl;
> cerr << fit_func->GetParameter(grumpf);
> }
>
> calibration_histos[i]->Draw("");
> htemp->Draw("same");
> gaussian->Draw("same");
> fit_func->Draw("same");
> c1->Update();
> fit_parameters_act.chisqr=fit_func->GetChisquare();
> cerr<<endl<<"CHISQUAREGAUSS:"<<gaussian->GetChisquare()
> << endl;
> cerr<<endl<<"CHISQUAREFIT_FUNC"<<fit_parameters_act.chisqr
> << endl;
>
> [...]
>
> Hope i didn't overlook something completely trivial...
>
>
> Regards
>
>
> Johannes
>
>
> __________________________________________________
> Do You Yahoo!?
> Yahoo! Sports - Coverage of the 2002 Olympic Games
> http://sports.yahoo.com
>
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:41 MET