Hi, I have a TF2 function and I do not have problems evaluating it, everything works fine, here is that part of my code:
TF2 *fitlogpoi = new TF2("fitlogpoi", logpoisson,0,0,0,0,4);
TF1 *fitfunc = new TF1("fitfunc", myfcn4,0,0,4);
Double_t *xbin = gr->GetX();
Double_t fitres;
Double_t fitlog=0;
Double_t logsum;
Double_t dlldp1=0,d2lldp21=0;
Double_t dlldp2=0,d2lldp22=0;
Double_t dlldp3=0,d2lldp23=0;
Double_t dlldp4=0,d2lldp24=0;
Double_t delta1;
Double_t inifit1,inifit2,inifit3,inifit4;
Double_t A1Bi,A1Pb,A1Ra,A1Th;
Double_t totfit;
Double_t bin;
Double_t par1=1,par2=1,par3=1,par4=1;
for (Int_t i=0;i<var1;i++){
if (i==35) {xbin[i]=5;}
//Vetoed events
if (i==239) {xbin[i]=-1;}
if (i==290) {xbin[i]=-1;}
if (xbin[i] > -1){
//log sum
//--------------------------------
logsum=0;
for (Int_t j=1;j<=xbin[i];j++) {
logsum = logsum + TMath::Log(j);
}
bin=i+1;
//fit poisson
//-------------------------------
fitlogpoi->SetParameters(par1,par2,par3,par4);
fitres[i] = fitlogpoi->Eval(bin,xbin[i]);
fitlog = fitlog + fitres[i] - logsum;
fitfunc->SetParameters(1,1,1,1);
totfit[i] = fitfunc->Eval(bin);
//fit one by one params
//----------------------------------
fitfunc->SetParameters(par1,0,0,0);
inifit1 = fitfunc->Eval(bin);
dlldp1 = dlldp1 + ( inifit1 * ( 1 - ( xbin[i] / totfit[i] ) ) );
d2lldp21 = d2lldp21 + ( inifit1 * inifit1 * xbin[i] / ( totfit[i] * totfit[i] ) );
delta1 = - dlldp1 / d2lldp21;
fitfunc->SetParameters(0,par2,0,0);
inifit2 = fitfunc->Eval(bin);
dlldp2 = dlldp2 + ( inifit2 * ( 1 - ( xbin[i] / totfit[i] ) ) );
d2lldp22 = d2lldp22 + ( inifit2 * inifit2 * xbin[i] / ( totfit[i] * totfit[i] ) );
delta2 = - dlldp2 / d2lldp22;
fitfunc->SetParameters(0,0,par3,0);
inifit3 = fitfunc->Eval(bin);
dlldp3 = dlldp3 + ( inifit3 * ( 1 - ( xbin[i] / totfit[i] ) ) );
d2lldp23 = d2lldp23 + ( inifit3 * inifit3 * xbin[i] / ( totfit[i] * totfit[i] ) );
delta3 = - dlldp3 / d2lldp23;
fitfunc->SetParameters(0,0,0,par4);
inifit4 = fitfunc->Eval(bin);
dlldp4 = dlldp4 + ( inifit4 * ( 1 - ( xbin[i] / totfit[i] ) ) );
d2lldp24 = d2lldp24 + ( inifit4 * inifit4 * xbin[i] / ( totfit[i] * totfit[i] ) );
delta4 = - dlldp4 / d2lldp24;
par1=par1+delta1;
par2=par2+delta2;
par3=par3+delta3;
par4=par4+delta4;
}
}
The problems are by setting the parameters with variables instead of the numbers:
fitlogpoi->SetParameters(1,1,1,1);
and
Double_t par1=1,par2=1,par3=1,par4=1;
fitlogpoi->SetParameters(par1,par2,par3,par4);
Cheers