#ifndef __CINT__ #include "RooGlobalFunc.h" #endif #include "TMath.h" #include "TFile.h" #include "TH1.h" #include "TH1D.h" #include "TString.h" #include "TGraph.h" #include "TRandom3.h" #include "TCanvas.h" #include "TDirectory.h" #include "RooRealVar.h" #include "RooDataSet.h" #include "RooDataHist.h" #include "RooGaussian.h" #include "RooPlot.h" #include "Math/IFunction.h" using namespace RooFit ; using namespace std; class Vavilov_Func : public ROOT::Math::IBaseFunctionMultiDim{ public: mutable ROOT::Math::VavilovAccurate pdf; unsigned int NDim() const { return 3; } double DoEval(const double* x) const { return pdf.Pdf(x[0], x[1], x[2]); } ROOT::Math::IBaseFunctionMultiDim* Clone() const { return new Vavilov_Func(*this); } }; void Test2(){ /////%%%%%% Roofit %%%%%/// Double_t minX= -5; Double_t maxX= 0; RooRealVar x("E","E", minX, maxX); Double_t mean=-3; Double_t sigma=0.29; RooRealVar mg2("mean2","mean2",mean) ; RooRealVar sg2("sigma2","sigma2",sigma) ; RooGaussian gauss2("gauss2","gauss2",x,mg2,sg2) ; RooDataSet* data = gauss2.generate(x,10000) ; Double_t maxVav= 50.; Double_t minVav= -3; /*Double_t a=(maxVav-minVav)/(maxX-minX); Double_t b= 50-a*maxX; a=3/sigma; b=minVav-3*mean/sigma;*/ RooRealVar slope("slope","slope",1.); RooRealVar offset("offset","offset",0.1,-5.,5.); RooLinearVar y("xbis", "x shifted", x,slope,offset); RooRealVar kappa("kappa","kappa vavilov",8.,0.01,10.); RooRealVar beta2("beta2","beta2 vavilov",0.5,0.,1.); Vavilov_Func vaviFunc; RooFunctorPdfBinding vaviPdf("vavi", "Bound vavilov", vaviFunc,RooArgList(y,kappa,beta2)); x.setBins(10000,"cache") ; vaviPdf.fitTo(*data); RooPlot* frame2 = x.frame(Title("Imported TH1 with Vavilov X Gaussian")); TCanvas * c2 = new TCanvas("c2","c2", 1200, 800); data->plotOn(frame2); gauss2.plotOn(frame2,LineColor(kMagenta)); vaviPdf.plotOn(frame2,LineColor(kBlack)); vaviPdf.paramOn(frame2,Format(("NE"),AutoPrecision(2)),Layout(.60,.9,.9)); frame2->Draw(); Double_t chi2 = frame2->chiSquare(4); TPaveLabel *t2 = new TPaveLabel(0.60,0.50,0.9,0.55, Form("#chi^{2}/dof = %f", chi2),"brNDC"); t2->Draw(); frame2->addObject(t2) ; frame2->Draw(); c2->SetGrid(); /*TCanvas * c3 = new TCanvas("c3","c3", 1200, 800); TF1 *f1 = new TF1("f1", "TMath::Vavilov(x, 9, 0.26)", -5,0); f1->Draw();*/ }