Hi Marco, Thanks for reporting this problem with TGraph::Fit when one fits with a polynomial. I have found the origin of the problem and fixed it in TGraph::LeastSquareFit. The last data point was ignored by this function computing the initial value of parameters. In your example, you can circumvent the problem by calling gr->Fit("pol3","w") Rene Brun Marco van Leeuwen wrote: > > Hi All, > > In the past few months, I twice stumbled across the same problem, which > is probably due to some numerical imprecisions. The problem probably > only pops up in some special cases, but it can be quite nagging, so I > thought it is worthwhile to report. > > In some cases, when one tries to fit the same data in a TGraph and a > histogram, the TGraph fails and the histogram doesn't. This mainly > occurs when the data are in some small range, not centered at zero (e.g. > 1.7 to 1.9). It probably has to do with the initialization routines for > standard functions (pol, gaus, expo). I can think of a couple of reasons > why this should be so, and I even tried to investigate in the code, to > find out, but I soon got lost. So maybe somebody who is more familiar > with the code has an idea?? Strangely enough, it seems to me that the > routines are largely identical, and moreover, everywhere double > precision is used, but still there is this difference... > > Included is a macro which reproduces this behaviour for the pol3 case. > It initialises a TH1D and two TGraphErrors with the same data, but one > of the TGraphErrors has a shifted x-axis. Try it and see for yourself... > (Root v2.23/12 on Redhat) > > By the way, this also triggers the question: Is there a way to use e.g. > a "pol3" in a fit without having ROOT initialise the function itself?? > As far as I can see, ROOT always initialises the standardfunctions if > you try to fit them to a TGraph or TH1... > > Kind regards, > > Marco van Leeuwen. > > ----- fit_test.C > > {{ > gROOT->Reset(); > TCanvas *c1=new TCanvas("c1","Canvas #1",500,500); > TCanvas *c2=new TCanvas("c2","Canvas #2",500,600); > c2->Divide(1,2,0,0,0); > TF1 *f1=new TF1("f1","pol3",1.75,1.96); > f1->SetParameter(0,1.30015e+07); > f1->SetParameter(1,-2.10148e+07); > f1->SetParameter(2,1.13154e+07); > f1->SetParameter(3,-2.02969e+06); > TH1D *h1 = new TH1D("h1","test histo",1000,0,2); > TGraphErrors *gr = new TGraphErrors(105); > TGraphErrors *gr2 = new TGraphErrors(105); > for (Int_t i=875;i<980;i++){ > Float_t x=h1->GetBinCenter(i); > h1->SetBinContent(i,f1->Eval(x)+gRandom->Gaus(0,400)); > h1->SetBinError(i,400); > gr->SetPoint(i-875,x,h1->GetBinContent(i)); > gr->SetPointError(i-875,0,h1->GetBinError(i)); > gr2->SetPoint(i-875,x-1.85,h1->GetBinContent(i)); > gr2->SetPointError(i-875,0,h1->GetBinError(i)); > } > h1->GetXaxis()->SetRange(875,980); > c1->cd(); > h1->Draw(); > h1->Fit("pol3"); > c2->cd(1); > gPad->DrawFrame(1.74,-1200,1.96,1200); > gr->Draw("p"); > gr->Fit("pol3"); > c2->cd(2); > gPad->DrawFrame(-0.11,-1200,0.11,1200); > gr2->Draw("p"); > gr2->Fit("pol3"); > }}
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:19 MET