Hi Marc-Andre, I cannot reproduce this problem with the official versions 3.05/07 or 3.10/01 see an example of log in attachement. Rene Brun On Sat, 22 Nov 2003, Marc-Andre Pleier wrote: > Dear Rooters, > > I encounter the following problem (see attached sourcecode example > for reproducing this...): > > Using a fitfunction I created myself which is used in a subroutine > for a TF1 instantiation a la TF1 * myfit = new TF1("myfit",function,...); > I am not able to extract the fit parameters that are printed on the > screen by Minuit, if this subroutine is called more than once. > > For example fitting the same histogram more than once, I get the same > Minuit output on the screen, but when I try to get the fit parameters > from the second call on, the values returned are the parameter initial > values instead of the Minuit values. > This problem disappears when I call the TF1 destructor at the end > of the subroutine. > > If I use the same subroutine with a predefined function like gaus, > this problem doesn't show up. > But if I don't put the TF1 destructor call in that routine as well, > any call to my self-defined function after will again only > return the parameter initial values instead of the Minuit values. > > Could somebody explain me why ROOT is behaving that way? > > To reproduce this effect, you can simply compile the attached code > and switch the destructor calls on and off. > > I am using ROOT Version 3.05/00 23 February 2003. > > Cheers, > Marc-Andre. > > ----------------------------------------------------------------------------- > Marc-Andre Pleier Phone : +1 630 840 8575 > Fermilab D0 Fax : +1 630 840 8886 > P.O. Box 500, MS 352 Email: pleier@fnal.gov > Batavia, IL 60510-0500, USA > ----------------------------------------------------------------------------- > > > Here is my code: > > #include <TF1.h> > #include <TH1.h> > #include <TFile.h> > #include <iostream> > using namespace std; > > double mygauss(Double_t *x, Double_t *par) > { > Double_t fitval = par[0]*exp(-.5*((x[0]-par[1])/par[2])*((x[0]-par[1])/par[2])); > return fitval; > } > > void fitmegood(TH1D * loose) > { > TF1 * myfit = new TF1("myfit", "gaus",50.,130.); > myfit->SetParameters(7.,90.,4.); > loose->Fit("myfit"); > cout << "fitpars : " << myfit->GetParameter(1) << " | " << myfit->GetParameter(2) << endl; > // if we want fitmebad to work for all calls in the second block... > //myfit->~TF1(); > return; > } > > void fitmebad(TH1D * loose) > { > TF1 * myfit = new TF1("myfit", mygauss,50., 130., 3); > myfit->SetParameters(7.,90.,4.); > loose->Fit("myfit"); > cout << "fitpars : " << myfit->GetParameter(1) << " | " << myfit->GetParameter(2) << endl; > // if we want fitmebad to work for second++ calls in the first block... > //myfit->~TF1(); > return; > } > > int main(void) > { > // Create a plot to be fitted... > TF1 * willy = new TF1("willy", "gaus", 40., 140.); > willy->SetParameters(7.42, 92., 3.5); > TH1D* loose = new TH1D("willyplot", "test the fitting",100, 40., 140.); > loose->FillRandom("willy", 150.); > > cout << "Fit using self-defined gaussian, block 1:" << endl; > fitmebad(loose); > fitmebad(loose); > fitmebad(loose); > > cout << "Fit using predefined gaussian:" << endl; > fitmegood(loose); > fitmegood(loose); > fitmegood(loose); > > cout << "Fit using self-defined gaussian, block 2:" << endl; > fitmebad(loose); > fitmebad(loose); > fitmebad(loose); > > return 0; > } > > >
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:17 MET