Re: TF1 cloning problem (correctiong subject)

From: Lorenzo Moneta <Lorenzo.Moneta_at_cern.ch>
Date: Wed, 13 Jun 2012 07:42:04 +0000


Hi,

 A real Clone (and I/O) of the TF1 object works only for native or interpreted functions. In case of functions made from + code, the Clone method just copies the function values in the bin centers, so you cannot use this function afterwards for fitting, only for plotting. You must in that case re-create the function object from the original code  

 Best Regards

 Lorenzo
On Jun 12, 2012, at 11:06 PM, Arthur E. Snyder wrote:

> BTW, the problem does not occur with 'native' functions like 'gaus'
> 
> -AE
> 
> A.E. Snyder, The Former Group C (TFC)        \!c*p?/
> SLAC Mail Stop #95                          ((.   .))
> Box 4349                                        |
> Stanford, Ca, USA, 94309                      '\|/`
> e-mail:snyder_at_slac.stanford.edu                 o
> phone:650-926-2701                              _
> http://www.slac.stanford.edu/~snyder          BaBar
> FAX:707-313-0250                          Collaboration
>                                                &
>                                           Fermi/GLAST
> 
> 
> 
> On Tue, 12 Jun 2012, Arthur E. Snyder wrote:
> 

>>> Hi Rooters,
>>>
>>> I find the following weird behavior with cloned |TF1|s:
>>>
>>> fp=makePowerLaw(); <---creates a simple power law TF1
>>>
>>> make function: lo=1 up=10 power=2 name=powerLaw
>>> (class TF1*)0xa0f6ad0
>>>
>>> root [29] fp->Print()
>>> powerLaw : Ndim= 1, Npar= 4, Noper= 0
>>> Par 0 p0 = 1
>>> Par 1 p1 = 2
>>> Par 2 p2 = 1
>>> Par 3 p3 = 10
>>> root [30]
>>>
>>> root [30] fpa=(TF1*)fp->Clone()
>>> (class TF1*)0xa0f6968
>>>
>>> root [32] fpa->Print()
>>> powerLaw : Ndim= 1, Npar= 4, Noper= 0
>>> Par 0 p0 = 1
>>> Par 1 p1 = 2
>>> Par 2 p2 = 1
>>> Par 3 p3 = 10
>>>
>>>
>>> root [31] fpa->Draw()
>>> root [32]
>>>
>>> --at this point cloned copy makes same plot as original |fp|
>>>
>>> root [6] fpa->SetParameter(1,4)
>>> root [7] fpa->Print()
>>> powerLaw : Ndim= 1, Npar= 4, Noper= 0
>>> Par 0 p0 = 1
>>> Par 1 p1 = 4
>>> Par 2 p2 = 1
>>> Par 3 p3 = 10
>>>
>>> --changing parameter of clone seems to work, but ..
>>>
>>> root [8] fpa->Draw() <--- attached looks the same as fp->Draw() with p1=2!
>>>
>>> but the plot still shows the same as above .. i.e., p1=2, not 4
>>>
>>> If I look with debugger this:
>>>
>>> (gdb) b 'powerLaw(double*, double*)'
>>> Breakpoint 1 at 0x4b8feb2: file
>>> /afs/slac.stanford.edu/u/ek/snyder/glast/root/./powerLaw.C, line 10.
>>> (gdb) c
>>>
>>> I find |fpa->Draw()| does not stop in the underlying c++ function
>>> |PowerLaw|.
>>>
>>> |fp| does stop in |PowerLaw|
>>>
>>> This is pretty strange. A clone is not a clone. It's behavior is not the
>>> same as the function i was cloned from. It seems to have somekind of copy
>>> of the curve, but no control over it.
>>>
>>> If I try to fit with clone, it fails.
>>>
>>> Is this a bug or a feature?
>>>
>>> -Arthur
>>>
>>>
>>> powerLaw:
>>>
>>> double powerLaw(double* x,double *par) {
>>>
>>> double N=par[0];
>>> double power=par[1];
>>> double xp=x[0];
>>>
>>>
>>> double emin=par[2];
>>> double emax=par[3];
>>>
>>> if(xp<=0) return 0.0;
>>>
>>> double temp=1.0/TMath::Power(xp,power);
>>>
>>> double fIntegral=
>>>
>>> (TMath::Power((emin),(-power+1))-TMath::Power((emax),(-power+1)))/(power-1);
>>>
>>> temp/=fIntegral;
>>> temp*=N;
>>>
>>> return temp;
>>> }
>>>
>>>
>>>
>>> A.E. Snyder, The Former Group C (TFC) \!c*p?/
>>> SLAC Mail Stop #95 ((. .))
>>> Box 4349 |
>>> Stanford, Ca, USA, 94309 '\|/`
>>> e-mail:snyder_at_slac.stanford.edu o
>>> phone:650-926-2701 _
>>> http://www.slac.stanford.edu/~snyder BaBar
>>> FAX:707-313-0250 Collaboration
>>> &
>>> Fermi/GLAST
>>>
>>>
>>>
>>> On Tue, 12 Jun 2012, Chris Jones wrote:
>>>
>>>
>>> [NON-Text Body part not included]

>>
> Received on Wed Jun 13 2012 - 09:42:10 CEST

This archive was generated by hypermail 2.2.0 : Wed Jun 13 2012 - 11:50:02 CEST