Re: [ROOT] Fit function compiling problems

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Feb 02 2001 - 19:01:54 MET


Hi Daniel,

In your loop, for(Int_t c = 0; c<3; c++){
you create a TF1* func with always the same name "myfunc", then you delete
the function at the end of the loop. Unfortunately this deletes the CINT byte
code
for the function. Your technique will work for either a basic function
"pol1",etc
or a compiled function.
The solution is to give a different name to your functions (say "myfunc0",
"myfunc1", etc and delete the fonctions outside the loop.

Rene Brun



Daniel Bowerman wrote:
> 
> Hi rooters,
> 
> I'm trying to perform a fit within a loop and then access the fit
> parameters. I construct a TProfile histogram and a TF1 using my own
> function. I fill the TProfile and perform the fit. The fit works perfectly
> the first time round but I then get error messages such as
> "Function:myfunc cannot be compiled" where myfunc is the function I've
> defined. Consequently the fit doesn't work for any other passes of the loop.
> 
> The function is defined by:
> 
> Double_t myfit(Double_t *x, Double_t *par){
> 
>   Double_t xval = x[0];
>   Double_t xfit = 0;
>   if(xval<par[0]){
>     xfit = par[2]+(par[3]*(xval+100));
>   }
>   if(xval>par[0]&&xval<par[1]){
>     xfit = (par[2]+par[3]*(par[0]+100))+(par[4]*(xval-par[0]));
>   }
>   if(xval>par[1]){
>     xfit =
> (par[2]+par[3]*(par[0]+100))+(par[4]*(par[1]-par[0]))+par[5]*(xval-par[1]);
>   }
>   return xfit;
> }
> 
> And the code of interest in the macro is:
> 
> for(Int_t c = 0; c<3; c++){
>      TProfile *xtalfit = new TProfile("xtalfit","xtalfit",1600,
>                                                 -200,1400,200,400);
>      TF1 *func = new TF1("myfunc",myfit,-100,1300,6);
>      func->SetParLimits(0,550,725);
>      func->SetParLimits(1,750,900);
> 
>      Int_t nbytes = 0;
>      Int_t noentries = h6->GetEntries();
>      for (Int_t i=0; i<noentries;i++) {
>        nbytes += h6->GetEntry(i);
>        if(channel==c&&(channel>chann || etc...
> 
>         //Fill the Profile histogram
>          xtalfit->Fill(xpoint,ypoint);
>        }
>      }
> 
>      // Perform the fit
>      xtalfit->Draw();
>      xtalfit->Fit("myfunc","","",-100,1300);
> 
>      // access the parameters
>      param0 = func->GetParameter(0);
>      param1 = func->GetParameter(1);
> 
>      // clean up - doesn't make any difference
>      delete xtalfit;
>      delete func;
> }
> 
> Sorry if I'm missing something obvious but any help you can provide is
> much appreciated.
> 
> Thanks,
> Dan.
> 
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>         Daniel Bowerman                         |Tel: +1-650-926-2767
>         Imperial College                        |Fax: +1-650-926-3767
>         Stanford Linear Accelerator Center      |
>         M/S 59, P.O. Box 4349                   |
>         Stanford, CA 94309, USA                 |bowerman@SLAC.Stanford.edu
> 
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



This archive was generated by hypermail 2b29 : Fri Jun 08 2001 - 11:51:00 MEST