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