Re: [ROOT] Problem retrieving fitparameters from self-defined functions...

From: Marc-Andre Pleier (pleier@fnal.gov)
Date: Sat Nov 22 2003 - 22:52:00 MET


Hi Rene,

thanks for the quick answer!

I tried on a different machine with
ROOT Version  3.05/04  28 April 2003,
using gcc
and
ROOT Version  3.05/00  23 February 2003,
using the KCC compiler - for me the problem
still remains.

I also tried on a completely different linux
machine, independent of my experimental setup
here, with ROOT Version 3.03/04  21 April 2002,
and still see the problem.

Please find attached a tar file with my sourcecode,
Makefile and the text-output I get.

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
-----------------------------------------------------------------------------

On Sat, 22 Nov 2003, Rene Brun wrote:

> 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