Hi,
I found some problems using TF1 function:
I am trying to do something similar to root.cern.ch/root/html/TF1.html “C - A general C function with parameters”
// Macro func.C
double yrapidity(double *x, double *par) {
if(par[0]<0.)return 0;
int xv = static_cast<int>(100*(x[0]));
int xb = static_cast<int>(xv/10);
if (xb>48) return 0;
double c = 1.;
double del0 = (eigen[xb])/c;
double del1 = (eigen[xb])/c;
double del2 = (eigen[xb])/c;
double del3 = (eigen[xb])/c;
double del4 = (eigen[xb])/c;
double del5 = (eigen[xb])/c;
double del6 = (eigen[xb])/c;
double del7 = (eigen[xb])/c;
double del8 = (eigen[xb])/c;
double del9 = (eigen[xb])/c;
double del10 = (eigen[xb])/c;
double del11 = (eigen[xb])/c;
double del12 = (eigen[xb])/c;
double del13 = (eigen[xb])/c;
double del14 = (eigen[xb])/c;
double del15 = (eigen[xb])/c;
double del16 = (eigen[xb])/c;
double del17 = (eigen[xb])/c;
double del18 = (eigen[xb])/c;
double del19 = (eigen[xb])/c;
double f=(par[0]*(eigen[xb]+
par[1]*del0+
par[2]*del1+
par[3]*del2+
par[4]*del3+
par[5]*del4+
par[6]*del5+
par[7]*del6+
par[8]*del7+
par[9]*del8+
par[10]*del9+
par[11]*del10+
par[12]*del11+
par[13]*del12+
par[14]*del13+
par[15]*del14+
par[16]*del15+
par[17]*del16+
par[18]*del17+
par[19]*del18+
par[20]*del19));
return f;
}
double eigen[50];
////////////////////////////////////////
/// main function
////////////////////////////////////////
int run(){
int Np=21;
double lumi=1;
for(int y=0; y<49; y++){
eigen[y]=1.5;
}
TF1 *fitfunction = new TF1("fitfunction",yrapidity,1.9,4.7,Np);
TF1 *f1=gROOT->GetFunction("fitfunction");
for(int npar=1; npar<Np;npar++){
f1->SetParameter(npar,0.);
}
// lumi=0.;
f1->SetParameter(0,lumi);
f1->Draw();
}
and I run with:
Root > .L func.C
Root > run();
I have a “tabulated” function, I simplified setting the value of the vector eigen[] to a constant
The problem is
When the number of parameter Np is 19 I can plot and use f1 in a fit and everything works
but when Np>19 it seems that I can’t manage the parameters and the function and SetParameter method is not working;
for example, if all the parameters (and lumi) are set to zero the function should be flat but the plot isn’t.
or if lumi is 1 i should get a constant = 1.5
p.s.
when I say Np=19 or Np>19 I changed the implementation of "double yrapidity(double *x, double *par)"
using the correct number of parameters as well.
any suggestion?
cheers,
Francesco