Hi,
I fit a function with TF1, like this:
Double_t myfcn4hist ( Double_t *x, Double_t *par) {
Double_t ATh = par[3],ARa = par[2],APb = par[1],ABi = par[0];
Double_t gamma = lambPb / (lambPb - lambRa);
Double_t beta = lambBi / (lambBi - lambRa);
Double_t alpha = lambBi / (lambBi - lambPb);
Double_t eBi = TMath::Exp(-lambBi * x[0]);
Double_t ePb = TMath::Exp(-lambPb * x[0]);
Double_t eRa = TMath::Exp(-lambRa * x[0]);
Double_t rate1 = ABi * eBi;
Double_t rate2 = APb * alpha * (ePb-eBi);
Double_t rate3 = ARa * gamma * (beta*eRa - alpha*ePb + (alpha-beta)*eBi);
Double_t rate4 = ATh * (1 - beta*gamma*eRa + (gamma-1)*alpha*ePb + (beta*gamma-alpha*gamma+alpha-1)*eBi);
Double_t rate = rate1 + rate2 + rate3 + rate4;
return rate;
}
TH1F *timelota = new TH1F("timelota","counts",var1,0.,var1);
TF1 *activity = new TF1("activity",myfcn4hist,0,var1,parms);
timelota->Fit("activity","R");
and I also put the histogram entries in a TGraph, fitting like this:
void myfcn4(Int_t &, Double_t *, Double_t &f, Double_t *par, Int_t) {
Int_t np = gr->GetN();
f = 0;
Double_t *xbin = gr->GetX();
for (Int_t i=0;i<np;i++) {
Double_t ATh = par[3],ARa = par[2],APb = par[1],ABi = par[0];
Double_t gamma = lambPb / (lambPb - lambRa);
Double_t beta = lambBi / (lambBi - lambRa);
Double_t alpha = lambBi / (lambBi - lambPb);
Double_t eBi = TMath::Exp(-lambBi * xbin[i]);
Double_t ePb = TMath::Exp(-lambPb * xbin[i]);
Double_t eRa = TMath::Exp(-lambRa * xbin[i]);
Double_t rate1 = ABi * eBi;
Double_t rate2 = APb * alpha * (ePb-eBi);
Double_t rate3 = ARa * gamma * (beta*eRa - alpha*ePb + (alpha-beta)*eBi);
Double_t rate4 = ATh * (1 - beta*gamma*eRa + (gamma-1)*alpha*ePb + (beta*gamma-alpha*gamma+alpha-1)*eBi);
Double_t rate = rate1 + rate2 + rate3 + rate4;
f += rate*rate;
}
}
TVirtualFitter::SetDefaultFitter("Minuit");
TVirtualFitter *fitter = TVirtualFitter::Fitter(0, 3);
fitter->SetFCN(myfcn4);
fitter->SetParameter(0, "ABi", 1, 0.1, 0,0);
fitter->SetParameter(1, "APb", 1, 0.1, 0,0);
fitter->SetParameter(2, "ARa", 1, 0.1, 0,0);
fitter->SetParameter(3, "ATh", 1, 0.1, 0,0);
Double_t arglist[1] = {0};
fitter->ExecuteCommand("MIGRAD", arglist, 0);
I got different results from both fits, actually the second one is very different and with problems for the error matrix.
Does any one know why is there a difference?
Not complete codes, just the essentials.
Cheers