Re: TF1 using class function

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Nov 15 1999 - 18:49:57 MET


Hi Jeff,
One cannot pass a pointer to a member function as argument to TF1.

You can solve your problem by using the second argument of your
parameters
to contain a pointer to your objects or equivalent as you already do
with
the first parameter.

I could add an additional TF1 constructor accepting a TObject* as
argument.

Rene Brun


Jeffrey McDonald wrote:
> 
> Hi,
> 
>     I've a question regarding using the root class TF1 to make plots
> from a function in a class.  The class is a library (or the makings of
> one) to describe/plot LaplaceTransforms of a given type.  The user
> creates a "simple pole in frequency space" and the function can return
> the value of the function evaluated in the time domain.   I can send
> you the class library if you wish.
> 
>     The  user generates a LaplaceTransform via:
> 
> LaplaceTransformA *Lt1 = new LaplaceTransformA(3,0.15);   //
> multiplicity 3 and simple pole at -0.15
> LaplaceTransformA *Lt2 = new LaplaceTransformA(4,0.15);
> 
>    Lt1->time_domain(double *time);    // function returns double
> returns the value of the function in the time domain.
> I'd like to be able to do something like:
> 
>  TF1 *f1 = new TF1("calibration",Lt1->time_domain,0,1 ,1);
> 
> but this doesn't work.  So, I have to calculate the value by taking
> having another function
> which takes a pointer to the LaplaceTransformA and then accesses the
> Lt1->time_domain() and
> returns the functional value.
> 
> A snipet of code:
> 
>  Lt[i] = new LaplaceTransformA(i+3,0.15);
>  ltplot(& Lt[i]);
> 
> uses the functions below to calculate the functional value of
> Lt[i].time_domain();
> 
> void ltplot(LaplaceTransformA * ltp){
>     TF1 *f1 = new TF1("calibration",plot_laplace,0,1 ,1);
>     f1->SetParameters((double *)ltp);
>     f1->Draw();
>     return;
> }
> 
> and
> 
> double plot_laplace(double *t,double *par ){
> 
>     LaplaceTransformA *Lt2 = (LaplaceTransformA *)par;
>     double rvalue = Lt2->time_domain(t) ;
>     return (rvalue);
> };
> 
> -----This works, but there is an apparent limitation if I want to Draw
> multiple functions on the same
> canvas,  i.e, it doesn't look like I can use  have multiple instances
> of TF1s pointing to the same
> function (plot_laplace) -- with different "parameters".   For example,
> 
>     TF1 *f2 = new TF1("calibration",plot_laplace,0,1 ,1);
>     f2->SetParameters((double *)Lt2);
> 
> will give an exception if I try to draw it -- I can draw the function
> again if I re-create f1.
> What I'd really like is to be able to have a function draw a routine
> from a class.  Unfortunately, I'm
> not schooled enough in C++/ROOT to be able to know how do to do this,
> yet.
> 
> Any suggestions or advice on how to make the object TF1 work with a
> function from a class would
> be welcome.
> The function looks like:
> 
> double LaplaceTransformA::time_domain(double *time, double *par) {
>   int order;
>   double TimeConstant;
> 
>   order = LT_pole->get_mult();
>   TimeConstant = LT_pole->get_pole();
> 
>   if (order != 0 ){
>     switch( order ) {
>     case 1:
>       return( exp(-*time/TimeConstant)/TimeConstant );
>       break;
>     default:
>       return
> (*time*exp(-*time/TimeConstant)/TimeConstant/(double)fact(order-1));
>       break;
>     }
> 
>   }
> }
> 
> 
> When I try to use it in a function,  I find:
> 
> root [0] .L laplace.h
> root [1] LaplaceTransformA *Lt1 = new LaplaceTransformA(3,0.15);
> root [2]  TF1 *f1 = new TF1("calibration",Lt1->time_domain,0,1,1);
> Error: No symbol Lt1->time_domain in current scope
> FILE:/tmp/file9oXnNv_cint LINE:1
> 
> Please advise.
> 
> Regards,
> 
>     Jeff
> 
> _____________________________________________________
> Jeffrey McDonald, University of Pittsburgh jemcdon+@pitt.edu
> 100 Allen Hall                             office: 412-624-9160
> 3941 O'Hara St.                            lab:    412-624-9160
> Dept. of Physics and Astronomy             fax:    412-624-9163
> University of Pittsburgh
> Pittsburgh, PA 15260
> 
>



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:42 MET