Hi Matt,
I have modified your macro such that it can be run with the interpreter
or the compiler. At the same time, I show how to use the script
compiler.
Rene Brun
First interactive session
=========================
Root > .L myfit.cxx
Root > myfit()
Second interactive session
==========================
Root > .L myfit.cxx++
Root > myfit(); //will use the compiled code in shared lib myfit.so
//file myfit.cxx
#include "TF1.h"
#include "TH1.h"
#include "TMath.h"
Double_t myfunction(Double_t *x, Double_t *par)
{
Float_t xx =x[0];
Double_t f = 0;
if (xx != 0) f =TMath::Abs(par[0]*sin(par[1]*xx)/xx);
return f;
}
void myfunc()
{
TF1 *f1 = new TF1("myfunc",myfunction,0,10,2);
f1->SetParameters(2,1);
f1->SetParNames("constant","coefficient");
f1->Draw();
}
void myfit()
{
myfunc();
TH1F *h1=new TH1F("h1","test",100,0,10);
h1->FillRandom("myfunc",20000);
TF1 *f1= (TF1*)gROOT->GetFunction("myfunc");
f1->SetParameters(800,1);
h1->Fit("myfunc");
}
Matthew D. Langston wrote:
>
> I believe I have found a bug in ROOT 2.23.12 with TF1 and TF2. It
> appears that a TF1 or a TF2 can't call a user defined function that is
> loaded from a shared library under Linux.
>
> For example, when I take the example out of the class description for
> TF1 (see http://root.cern.ch/root/html/TF1.html#TF1:description) and run
> it only through the CINT interpreter, the example works properly,
> However, when I compile the function "myfunction" and put it into a
> shared library, then ROOT segvios (i.e. the error message is ubiquitous
> " *** Break *** segmentation violation").
>
> For reference, I have cut-and_pasted the example from the class
> description for TF1 here. Has anyone else seen this problem? It seems
> like it could be a significant problem if one needed to use a compiled
> function to do a fit using Minuit (which is my case).
>
> -------------macro myfunc.C-----------------------------
> Double_t myfunction(Double_t *x, Double_t *par)
> {
> Float_t xx =x[0];
> Double_t f = TMath::Abs(par[0]*sin(par[1]*xx)/xx);
> return f;
> }
> void myfunc()
> {
> TF1 *f1 = new TF1("myfunc",myfunction,0,10,2);
> f1->SetParameters(2,1);
> f1->SetParNames("constant","coefficient");
> f1->Draw();
> }
> void myfit()
> {
> TH1F *h1=new TH1F("h1","test",100,0,10);
> h1->FillRandom("myfunc",20000);
> TF1 *f1=gROOT->GetFunction("myfunc");
> f1->SetParameters(800,1);
> h1.Fit("myfunc");
> }
> --------end of macro myfunc.C---------------------------------
>
> In an interactive session you can do:
> Root > .L myfunc.C
> Root > myfunc();
> Root > myfit();
>
> --
> Matthew D. Langston
> SLD, Stanford Linear Accelerator Center
> langston@SLAC.Stanford.EDU
> 650.926.3279
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:22 MET