TF1 using class function

From: Jeffrey McDonald (jemcdon+@pitt.edu)
Date: Fri Nov 12 1999 - 20:04:35 MET


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