Hi all,
I tried to define my own p.d.f to fit some data with a model of an exponential decay times a branching component p0 plus a constant background (for example: p0 * exp(-0.5*t) + background) to get the branching ratio p0, assuming that I’ve already known the number of events in the exponential term.
The code I used for fitting is as follows:
RooRealVar x("x","x",0,10) ;
RooRealVar nsig("nsig","nsig",80000,0,160000) ;
RooRealVar nbkg("nbkg","nbkg",5000,0,10000) ;
RooRealVar p0("p0","p0",0.8,0,1);
RooGenericPdf signal("signal","signal","p0*exp(-0.5*x)",RooArgSet(p0,x));
RooPolynomial background("background","background",x,RooArgList());
RooExtendPdf signalext("signalext","sigalext",signal,nsig) ;
RooExtendPdf backgroundext("backgroundext","backgroundext",background,nbkg) ;
RooAddPdf model("model","model",RooArgList(backgroundext,signalext)) ;
RooDataSet* data = model.generate(x);
nsig.setConstant(kTRUE);
nbkg.setConstant(kTRUE);
model.fitTo(*data,Extended());
model.Print();
TCanvas* c1=new TCanvas("c1","c1",600,600) ;
c1->cd();
RooPlot* xframe = x.frame(Title("extended ML fit example")) ;
data->plotOn(xframe,Name("data"),Binning(1000));
model.plotOn(xframe);
gPad->SetLeftMargin(0.15) ; xframe->GetYaxis()->SetTitleOffset(1.4) ; xframe->Draw() ;
Here I’ve tried to fit the toy Monte-Carlo data first.
The result were a wrong value of p0 and a failed fitting status, although I’ve fixed the number of events for both signal and background.
MINUIT WARNING IN HESSE
============== Second derivative zero for parameter1
MNHESS FAILS AND WILL RETURN DIAGONAL MATRIX.
FCN=-731997 FROM HESSE STATUS=FAILED 3 CALLS 30 TOTAL
EDM=0 STRATEGY= 1 ERROR MATRIX UNCERTAINTY 100.0 per cent
EXT PARAMETER APPROXIMATE INTERNAL INTERNAL
NO. NAME VALUE ERROR STEP SIZE VALUE
1 p0 5.71505e-01 3.36588e-01 0.00000e+00 6.43501e-01
ERR DEF= 0.5
EXTERNAL ERROR MATRIX. NDIM= 25 NPAR= 1 ERR DEF=0.5
Is there anything wrong with my code?
Thanks,