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