[ROOT] Histogram fit drawing "goption" option

From: eric.anciant@noos.fr
Date: Sat Jul 31 2004 - 12:05:12 MEST


Hello rooters,

I am having a hard time understanding the use of the "goption" parameter 
used when fitting histogram by a function ;  Int_t TH1::Fit(TF1 *f1 
,Option_t *option ,Option_t *goption, Axis_t xxmin, Axis_t xxmax)

What I "naively" believed about this option is illustrated in the macro 
below where I tried several way of fitting 1D and 2D histograms and 
drawing the resulting function above the histogram : In the canvas with 
1D histograms, I would have assumed that either pad 2 or pad 3 would
Have looked like pad 4, but they both look like pad 1
In the canvas with 2D histograms the two pads look different, I would 
have expect them to look the same.

I could no find in roottalk diggest or manual or HTML doc a detailed 
explanation of the effects of this option.
Looking in the source makes me even more puzzled, because it seems That 
goption is applied to draw the histogram, not the fitting function
QUOTE :
       if (!Foption.Nograph && GetDimension() < 3) Draw(goption);

(yet in the macro exemple below, the option doesn't seems to affect the 
way the histograms are drawn neither)

Wouldn't it make more sense if this drawing option was applied to the 
function instead of the histogram ? Or am I missing something ? This 
would be particularly helpfull for 2D histrograms, since in that case 
the "default" scattered points drawing of the 2D function doesn't suit, 
most of the time, the way the histrogram is drawn.

I am using ROOT 4.00.08 with GDK on WIN2K (however, I verified that the 
described behaviours are the same on ROOT 3.10, or on linux box )

Thanks,

eric



**** MACRO *****
// RMK : I know the duplication of the functions is useless, but at some 
point I // got nervous about to what object the drawing option were 
applied ... // it is eventually not the point ...

{
	// 1D thing **********

	TCanvas canvas1D("canvasFit1D","canvasFit1D");
	canvas1D.Divide(2,2);
	gStyle->SetOptFit(1);
	TH1D histo1D("fittedHisto1D","fittedHisto1D",11,-5,5);
	histo1D.FillRandom("gaus");
	TF1 fitgaus1D_1("fitgaus1D_1","gaus");
	TF1 fitgaus1D_2("fitgaus1D_2","gaus");
	TF1 fitgaus1D_3("fitgaus1D_3","gaus");


	fitgaus1D_1.SetNpx(22); // twice more than bins ...
	fitgaus1D_2.SetNpx(22); // twice more than bins ...
	fitgaus1D_3.SetNpx(22); // twice more than bins ...

	canvas1D.cd(1);
	histo1D.Draw();
	canvas1D.cd(2);
	TH1D* histo1D_copy = histo1D.DrawCopy();
	canvas1D.cd(3);
	TH1D* histo1D_copy2 = histo1D.DrawCopy();
	canvas1D.cd(4);
	TH1D* histo1D_copy3 = histo1D.DrawCopy();

	canvas1D.cd(1);
	histo1D.Fit(&fitgaus1D_1);

	canvas1D.cd(2);
	histo1D_copy->Fit(&fitgaus1D_2,"","Ptext"); // no text, no marker ... 
"L" Option

	canvas1D.cd(3);
	histo1D_copy2->Fit(&fitgaus1D_3,"","samePtext"); // no text, no marker 
.... "L" option

	canvas1D.cd(4);
	fitgaus1D_1.Draw("samePtext");  // P, text and no "L" option


	// 2D thing ***************************

	TCanvas canvas2D("canvasFit2D","canvasFit2D");
	canvas2D.Divide(1,2);
	gStyle->SetOptFit(1);

	TH2D histo("fittedHisto","fittedHisto",11,-5,5,11,-5,5);
	histo.Fill(0,0,10);
	histo.Fill(1,0,1);
	histo.Fill(0,1,1);
	histo.Fill(-1,0,1);
	histo.Fill(0,-1,1);

	canvas2D.cd(1);
	histo.Draw("lego2");

	canvas2D.cd(2);
	TH2D* histocopy = histo.DrawCopy("lego2");

	TF2 fitgaus_1("fitgaus2D_1","xygaus");
	fitgaus_1.SetParameters(10,0,0.1,0,0.1);
	TF2 fitgaus_2("fitgaus2D_2","xygaus");
	fitgaus_2.SetParameters(10,0,0.1,0,0.1);

	canvas2D.cd(1);
	histo.Fit(&fitgaus_1,"0"); // fit without drawing
	fitgaus_1.Draw("surfsame"); // superimpose fit on histogram

	canvas2D.cd(2);
	histocopy->Fit(&fitgaus_2,"","surfsame"); // : try to superimpose 
during fit => scattered points plot

}



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:09 MET