Re: [ROOT] fitting with a member function

From: Rene Brun (Rene.Brun@cern.ch)
Date: Tue Jul 22 2003 - 18:56:15 MEST


Hi John,

It could be that you use the wrong path to the Root documentation.

The class TF1 is described at:

http://root.cern.ch/root/htmldoc/TF1.html

The paragraph that I quoted is at the end of the introduction after
the example.


Rene Brun

"Dr. John Krane" wrote:
> 
> Thanks Rene,
> 
> I have been looking at http://root.cern.ch/root/html/TH1.htm and didn't
> see this very clear discussion.  Sorry: I always feel silly when I miss
> a well-documented fact.  I will try the full-blown TVirtualFitter method
> that I was hoping to avoid.
> 
> (What should I have typed into the "search the root reference guide"
> window to find the TF1 doc you mentioned?  Your excerpt is actually not
> in the TH1.htm page that I have been using as a reference, nor in the
> "fitting with a user-defined function" etc. pages in the ref guide.  I
> also didn't see it in the User's Guide 3.02c.  A new source of
> documentation is always welcome...what is the origin of that excerpt?)
> 
>         - John
> 
> Rene Brun wrote:
> > Hi John,
> >
> > The TF1 doc has this remark:
> >
> > //
> > //     WHY TF1 CANNOT ACCEPT A CLASS MEMBER FUNCTION ?
> > //     ===============================================
> > // This is a frequently asked question.
> > // C++ is a strongly typed language. There is no way for TF1 (without
> > // recompiling this class) to know about all possible user defined data types.
> > // This also apply to the case of a static class function.
> >
> >
> > In the C-style function referenced by TF1 and called from TH1::Fit,
> > you can call your class member function.
> > You can either use a global to access an object of your class
> > or use TVirtualFitter::SetUserFunc to register the address of a TObject*
> > to the fitter. In the C-style function, you can retrieve this pointer
> > with something like:
> >   TObject *myobject = TVirtualfitter::GetFitter()->GetUserFunc();
> >
> > Rene Brun
> >
> >
> > "Dr. John Krane" wrote:
> >
> >>Hi,
> >>
> >>I'm trying to use weighted histograms to fit a distribution.  Because I
> >>want to be able to change the histos that I'm using as components, I
> >>made a little class that holds an array of TH1F.  A member function
> >>provides the weighted sum of these histograms, with the weights being
> >>the fit parameters and the interface being as required by TF1.  So I
> >>tried to make a TF1 for use with the ->Fit method, like this:
> >>
> >>   cerr<< "Assign the histos that contribute to fit"<<endl;
> >>   func_fit fclass;
> >>   fclass.add_param(d1or);   //first histo
> >>   fclass.add_param(d1crl);  //second histo...etc.
> >>
> >>   TF1 *fitFcn = new
> >>      TF1("fitFcn",fclass.func_val,-600.,-1.,fclass.get_nparam());
> >>
> >>Well the compiler within ROOT doesn't like that, so I tried making a
> >>pointer-to-member-function and giving that to root, but I didn't get
> >>anywhere.  Does anybody know how to provide a member-function to TF1?  I
> >>think my class solution is quite clean for what I'd like to do, but I
> >>need to get around this barrier...
> >>
> >>        - John
> >
> >
> >



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:13 MET