def rooFit106():

    print ">>> setup model..."
    x = RooRealVar("x", "x", -3, 3)
    mean = RooRealVar("mean", "mean of gaussian", 1, -10, 10)
    sigma = RooRealVar("sigma", "width of gaussian", 1, 0.1, 10)
    gauss = RooGaussian("gauss", "gauss", x, mean, sigma)
    data = gauss.generate(RooArgSet(x), 10000)  # RooDataSet
    gauss.fitTo(data)

    print ">>> plot pdf and data..."
    frame = x.frame(Name("frame"), Title("RooPlot with decorations"),
                    Bins(40))  # RooPlot
    data.plotOn(frame)
    gauss.plotOn(frame)

    print ">>> RooGaussian::paramOn - add box with pdf parameters..."
    # https://root.cern.ch/doc/master/classRooAbsPdf.html#aa43b2556a1b419bad2b020ba9b808c1b
    # Layout(Double_t xmin, Double_t xmax, Double_t ymax)
    # left edge of box starts at 20% of x-axis
    gauss.paramOn(frame, Layout(0.55))

    print ">>> RooDataSet::statOn - add box with data statistics..."
    # https://root.cern.ch/doc/master/classRooAbsData.html#a538d58020b296a1623323a84d2bb8acb
    # x size of box is from 55% to 99% of x-axis range, top of box is at 80% of y-axis range)
    data.statOn(frame, Layout(0.20, 0.55, 0.8))

    print ">>> add text and arrow..."
    text = TText(2, 100, "Signal")
    text.SetTextSize(0.04)
    text.SetTextColor(kRed)
    frame.addObject(text)

    arrow = TArrow(2, 100, -1, 50, 0.01, "|>")
    arrow.SetLineColor(kRed)
    arrow.SetFillColor(kRed)
    arrow.SetLineWidth(3)
    frame.addObject(arrow)

    print ">>> persist frame with all decorations in ROOT file..."
    file = TFile("rooFit106.root", "RECREATE")
    frame.Write()
    file.Close()

    # To read back and plot frame with all decorations in clean root session do
    #   [0] TFile f("rooFit106.root")
    #   [1] xframe->Draw()

    print ">>> draw functions and toy data on canvas..."
    canvas = TCanvas("canvas", "canvas", 100, 100, 800, 600)
    gPad.SetLeftMargin(0.15)
    gPad.SetRightMargin(0.05)
    frame.GetYaxis().SetTitleOffset(1.6)
    frame.GetYaxis().SetLabelOffset(0.010)
    frame.GetYaxis().SetTitleSize(0.045)
    frame.GetYaxis().SetLabelSize(0.042)
    frame.GetXaxis().SetTitleSize(0.045)
    frame.GetXaxis().SetLabelSize(0.042)
    frame.Draw()
    canvas.SaveAs("rooFit106.png")
Пример #2
0
def rooFit103():

    print ">>> construct generic pdf from interpreted expression..."
    # To construct a proper p.d.f, the formula expression is explicitly normalized internally
    # by dividing  it by a numeric integral of the expresssion over x in the range [-20,20]
    x = RooRealVar("x", "x", -20, 20)
    alpha = RooRealVar("alpha", "alpha", 5, 0.1, 10)
    genpdf = RooGenericPdf("genpdf", "genpdf",
                           "(1+0.1*abs(x)+sin(sqrt(abs(x*alpha+0.1))))",
                           RooArgList(x, alpha))

    print ">>> generate and fit toy data...\n"
    data = genpdf.generate(RooArgSet(x), 10000)  # RooDataSet
    genpdf.fitTo(data)
    frame1 = x.frame(Title("Interpreted expression pdf"))  # RooPlot
    data.plotOn(frame1, Binning(40))
    genpdf.plotOn(frame1)

    print "\n>>> construct standard pdf with formula replacing parameter..."
    mean2 = RooRealVar("mean2", "mean^2", 10, 0, 200)
    sigma = RooRealVar("sigma", "sigma", 3, 0.1, 10)
    mean = RooFormulaVar("mean", "mean", "sqrt(mean2)", RooArgList(mean2))
    gaus2 = RooGaussian("gaus2", "gaus2", x, mean, sigma)

    print ">>> generate and fit toy data...\n"
    gaus1 = RooGaussian("gaus1", "gaus1", x, RooConst(10), RooConst(3))
    data2 = gaus1.generate(RooArgSet(x), 1000)  # RooDataSet
    result = gaus2.fitTo(data2, Save())  # RooFitResult
    result.Print()
    frame2 = x.frame(Title("Tailored Gaussian pdf"))  # RooPlot
    data2.plotOn(frame2, Binning(40))
    gaus2.plotOn(frame2)

    print "\n>>> draw pfds and fits on canvas..."
    canvas = TCanvas("canvas", "canvas", 100, 100, 1400, 600)
    canvas.Divide(2)
    canvas.cd(1)
    gPad.SetLeftMargin(0.15)
    gPad.SetRightMargin(0.02)
    frame1.GetYaxis().SetLabelOffset(0.008)
    frame1.GetYaxis().SetTitleOffset(1.6)
    frame1.GetYaxis().SetTitleSize(0.045)
    frame1.GetXaxis().SetTitleSize(0.045)
    frame1.Draw()
    canvas.cd(2)
    gPad.SetLeftMargin(0.15)
    gPad.SetRightMargin(0.02)
    frame2.GetYaxis().SetLabelOffset(0.008)
    frame2.GetYaxis().SetTitleOffset(1.6)
    frame2.GetYaxis().SetTitleSize(0.045)
    frame2.GetXaxis().SetTitleSize(0.045)
    frame2.Draw()
    canvas.SaveAs("rooFit103.png")
Пример #3
0
def rooFit101():

    print ">>> build gaussian pdf..."
    x = RooRealVar("x", "x", -10, 10)
    mean = RooRealVar("mean", "mean of gaussian", 1, -10, 10)
    sigma = RooRealVar("sigma", "width of gaussian", 1, 0.1, 10)
    gauss = RooGaussian("gauss", "gaussian PDF", x, mean, sigma)

    print ">>> plot pdf..."
    frame1 = x.frame(Title("Gaussian pdf"))  # RooPlot
    #xframe.SetTitle("Gaussian pdf")
    gauss.plotOn(frame1)

    print ">>> change parameter value and plot..."
    sigma.setVal(3)
    gauss.plotOn(frame1, LineColor(kRed))

    print ">>> generate events..."
    data = gauss.generate(RooArgSet(x), 10000)  # RooDataSet
    frame2 = x.frame()
    data.plotOn(frame2, Binning(40))
    gauss.plotOn(frame2)

    print ">>> fit gaussian...\n"
    gauss.fitTo(data)
    mean.Print()
    sigma.Print()

    print "\n>>> draw pdfs and fits on canvas..."
    canvas = TCanvas("canvas", "canvas", 100, 100, 1400, 600)
    canvas.Divide(2)
    canvas.cd(1)
    gPad.SetLeftMargin(0.15)
    gPad.SetRightMargin(0.02)
    frame1.GetYaxis().SetLabelOffset(0.008)
    frame1.GetYaxis().SetTitleOffset(1.6)
    frame1.GetYaxis().SetTitleSize(0.045)
    frame1.GetXaxis().SetTitleSize(0.045)
    frame1.Draw()
    canvas.cd(2)
    gPad.SetLeftMargin(0.15)
    gPad.SetRightMargin(0.02)
    frame2.GetYaxis().SetLabelOffset(0.008)
    frame2.GetYaxis().SetTitleOffset(1.6)
    frame2.GetYaxis().SetTitleSize(0.045)
    frame2.GetXaxis().SetTitleSize(0.045)
    frame2.Draw()
    canvas.SaveAs("rooFit101.png")
Пример #4
0
class Test_lhcb:

    def setUp(self):
        from e5.lhcb.util import setup_roofit, silence_roofit
        setup_roofit()
        silence_roofit()
        from ROOT import RooArgSet, RooGaussian, RooRealVar
        self.x = RooRealVar('x', 'x', -10, 10)
        self.mean = RooRealVar('mean', 'mean', 1, -10, 10)
        self.sigma = RooRealVar('sigma', 'sigma', 1, 0, 10)
        self.model = RooGaussian('model', 'model', self.x, self.mean, self.sigma)
        self.data = self.model.generate(RooArgSet(self.x), 1000)

    def test_max_ap(self):
        from e5.lhcb.fit import max_ap
        max_ap(self.model, self.data)

    def test_assemble_model(self):
        from e5.lhcb.model import assemble_model
        w = assemble_model(os.path.dirname(__file__) + '/../testdata/test.model')
        assert w

    def test_save_dataset(self):
        from e5.lhcb.util import save_dataset
        #from lhcb.fit import load_dataset
        save_dataset(self.data, 'mytest.root')
        assert os.path.exists('mytest.root')
        os.remove('mytest.root')

    def test_get_cmdline_parser(self):
        from e5.lhcb.config import get_cmdline_parser
        parser = get_cmdline_parser()
        args = parser.parse_args('show --graph model test.model'.split())

    def test_get_named_section(self):
        from e5.lhcb.config import get_config, get_named_section
        config = get_config(os.path.dirname(__file__) + '/../testdata/test.cfg')
        assert bool(get_named_section(config, 'named', 'first'))

    def test_add_weights(self):
        from e5.lhcb.fit import add_weights
        sigData, bkgData = add_weights(self.model, self.data, ['sigN', 'bkgN'])
        assert sigData
        assert bkgData
Пример #5
0
def rooFit107():
    
    print ">>> setup model..."
    x      = RooRealVar("x","x",-3,3)
    mean   = RooRealVar("mean","mean of gaussian",1,-10,10)
    sigma  = RooRealVar("sigma","width of gaussian",1,0.1,10)
    gauss  = RooGaussian("gauss","gauss",x,mean,sigma)
    data   = gauss.generate(RooArgSet(x),1000) # RooDataSet
    gauss.fitTo(data)
    
    print ">>> plot pdf and data..."
    frame1 = x.frame(Name("frame1"),Title("Red Curve / SumW2 Histo errors"),Bins(20)) # RooPlot
    frame2 = x.frame(Name("frame2"),Title("Dashed Curve / No XError bars"),Bins(20)) # RooPlot
    frame3 = x.frame(Name("frame3"),Title("Filled Curve / Blue Histo"),Bins(20)) # RooPlot
    frame4 = x.frame(Name("frame4"),Title("Partial Range / Filled Bar chart"),Bins(20)) # RooPlot
    
    print ">>> data plotting styles..."
    data.plotOn(frame1,DataError(RooAbsData.SumW2))
    data.plotOn(frame2,XErrorSize(0))                           # Remove horizontal error bars
    data.plotOn(frame3,MarkerColor(kBlue),LineColor(kBlue))     # Blue markers and error bors
    data.plotOn(frame4,DrawOption("B"),DataError(RooAbsData.None),
                       XErrorSize(0),FillColor(kGray))          # Filled bar chart
    
    print ">>> data plotting styles..."
    gauss.plotOn(frame1,LineColor(kRed))    
    gauss.plotOn(frame2,LineStyle(kDashed))                              # Change line style to dashed
    gauss.plotOn(frame3,DrawOption("F"),FillColor(kOrange),MoveToBack()) # Filled shapes in green color
    gauss.plotOn(frame4,Range(-8,3),LineColor(kMagenta))
    
    print ">>> draw pfds and fits on canvas..."
    canvas = TCanvas("canvas","canvas",100,100,1000,1200)
    canvas.Divide(2,2)
    for i, frame in enumerate([frame1,frame2,frame3,frame4],1):
        canvas.cd(i)
        gPad.SetLeftMargin(0.15); gPad.SetRightMargin(0.05)
        frame.GetYaxis().SetTitleOffset(1.6)
        frame.GetYaxis().SetLabelOffset(0.010)
        frame.GetYaxis().SetTitleSize(0.045)
        frame.GetYaxis().SetLabelSize(0.042)
        frame.GetXaxis().SetTitleSize(0.045)
        frame.GetXaxis().SetLabelSize(0.042)
        frame.Draw()
    canvas.SaveAs("rooFit107.png")
Пример #6
0
def test_plot():
    c = TCanvas('c', 'canvas', 300, 300)

    x = RooRealVar("x", "x", -10, 10)
    mean = RooRealVar("mean", "mean of gaussian", 1, -10, 10)
    sigma = RooRealVar("sigma", "width of gaussian", 1, 0.1, 10)

    gauss = RooGaussian("gauss", "gaussian PDF", x, mean, sigma)

    xframe = x.frame(RooFit.Title("Gaussian p.d.f."))
    #gauss.plotOn(xframe)
    sigma.setVal(3)

    as_x = RooArgSet(x)
    data = gauss.generate(as_x, 10000)
    data.plotOn(xframe, RooFit.MarkerSize(0.6), RooFit.MarkerStyle(20))
    xframe.Draw()

    pdffile = 'test.pdf'
    c.SaveAs(pdffile)
Пример #7
0
def test_plot():
    c = TCanvas('c', 'canvas', 300, 300)

    x = RooRealVar("x","x",-10,10)
    mean = RooRealVar("mean","mean of gaussian",1,-10,10) 
    sigma = RooRealVar("sigma","width of gaussian",1,0.1,10)

    gauss = RooGaussian("gauss","gaussian PDF",x,mean,sigma) 

    xframe = x.frame(RooFit.Title("Gaussian p.d.f."))
    #gauss.plotOn(xframe)
    sigma.setVal(3)
    
    as_x = RooArgSet(x)
    data = gauss.generate(as_x,10000)
    data.plotOn(xframe, RooFit.MarkerSize(0.6), RooFit.MarkerStyle(20)) 
    xframe.Draw()

    pdffile = 'test.pdf'
    c.SaveAs(pdffile)
Пример #8
0
"""


# -------------------------------------------
# 7. use ext PDF to fit SB only and plot

xframe7 = x.frame(RooFit.Title("7. use ext PDF to fit SB only and plot"))

# gauss 10
mean10 = RooRealVar("mean10","mean of gaussian",3,-10,10)
sigma10 = RooRealVar("sigma10","width of gaussian",2,0.1,10)

gauss10 = RooGaussian("gauss10","gaussian PDF",x,mean10,sigma10)

# generate to MC 
data3 = gauss10.generate(RooArgSet(x),1000)

# split to half dataset
data3_half  = RooDataSet("data3_half", "data3 half", RooArgSet(x), RooFit.Import( data3 ), RooFit.Cut("x<3") )

# set range

x.setRange("whole_range",-10 ,10 )
x.setRange("right_gaussian_range",3 ,10 )
x.setRange("left_gaussian_range",-10 ,3 )

# another PDF gauss 11
mean11 = RooRealVar("mean11","mean of gaussian",2,-10,10)
sigma11 = RooRealVar("sigma11","width of gaussian",3,0.1,10)

gauss11 = RooGaussian("gauss11","gaussian PDF",x ,mean11 ,sigma11)
def rf101_basics():
    # S e t u p   m o d e l
    # ---------------------

    # Declare variables x,mean,sigma with associated name, title, initial value and allowed range
    x = RooRealVar("x", "x", -10, 10)
    mean = RooRealVar("mean", "mean of gaussian", 1, -10, 10)
    sigma = RooRealVar("sigma", "width of gaussian", 1, 0.1, 10)

    # Build gaussian p.d.f in terms of x,mean and sigma
    gauss = RooGaussian("gauss", "gaussian PDF", x, mean, sigma)

    # Construct plot frame in 'x'
    xframe = x.frame(RooFit.Title("Gaussian p.d.f."))

    # P l o t   m o d e l   a n d   c h a n g e   p a r a m e t e r   v a l u e s
    # ---------------------------------------------------------------------------

    # Plot gauss in frame (i.e. in x)
    gauss.plotOn(xframe)

    # Change the value of sigma to 3
    sigma.setVal(3)

    # Plot gauss in frame (i.e. in x) and draw frame on canvas
    gauss.plotOn(xframe, RooFit.LineColor(kRed))

    # G e n e r a t e   e v e n t s
    # -----------------------------

    # Generate a dataset of 1000 events in x from gauss
    data = gauss.generate(RooArgSet(x), 10000.)

    # Make a second plot frame in x and draw both the
    # data and the p.d.f in the frame
    xframe2 = x.frame(RooFit.Title("Gaussian p.d.f. with data"))
    data.plotOn(xframe2)
    gauss.plotOn(xframe2)

    # F i t   m o d e l   t o   d a t a
    # -----------------------------

    # Fit pdf to data
    gauss.fitTo(data)

    # Print values of mean and sigma (that now reflect fitted values and errors)
    mean.Print()
    sigma.Print()

    # Draw all frames on a canvas
    c = TCanvas("rf101_basics", "rf101_basics", 800, 400)
    c.Divide(2)
    c.cd(1)
    gPad.SetLeftMargin(0.15)
    xframe.GetYaxis().SetTitleOffset(1.6)
    xframe.Draw()
    c.cd(2)
    gPad.SetLeftMargin(0.15)
    xframe2.GetYaxis().SetTitleOffset(1.6)
    xframe2.Draw()
    raw_input()
Пример #10
0
# -------------------------------------------------
# use Gaussian to generate toy MC

x = RooRealVar("x","x",-10,10)
xframe = x.frame(RooFit.Title("Gaussian p.d.f."))

mean1 = RooRealVar("mean1","mean of gaussian",2,-10,10)
sigma1 = RooRealVar("sigma1","width of gaussian",1,0.1,10)

mean1.setConstant(True)
sigma1.setConstant(True)

gauss1 = RooGaussian("gauss1","gaussian PDF",x,mean1,sigma1)

data = gauss1.generate(RooArgSet(x),1000) 

data.plotOn(xframe)
gauss1.plotOn(xframe,RooFit.LineColor(4))

# -------------------------------------------------
# use another Gaussian to fit toy MC

mean2 = RooRealVar("mean2","mean of gaussian",2,-10,10)
sigma2 = RooRealVar("sigma2","width of gaussian",1,0.1,10)

gauss2 = RooGaussian("gauss2","gaussian PDF",x,mean2,sigma2)

fit_result = gauss2.fitTo(data, RooFit.SumW2Error(True), RooFit.Strategy(2), RooFit.Minimizer("Minuit2"), RooFit.Save(1), RooFit.PrintLevel(1))

gauss2.plotOn(xframe,RooFit.LineColor(2))
Пример #11
0
# -------------------------------------------
# 1. gau1 generate toy MC, use gau2 to fit

x = RooRealVar("x","x",-10,10)
xframe1 = x.frame(RooFit.Title("1. use gauss1 generate toy MC, use gauss2 to fit"))

# gauss1
mean1 = RooRealVar("mean1","mean of gaussian",2,-10,10)
sigma1 = RooRealVar("sigma1","width of gaussian",2,0.1,10)

gauss1 = RooGaussian("gauss1","gaussian PDF",x,mean1,sigma1)


# generate toy MC
data1 = gauss1.generate(RooArgSet(x),500) 

data1.plotOn(xframe1)
gauss1.plotOn(xframe1)

#gauss1.plotOn(xframe1, RooFit.Normalization(500, RooAbsReal.NumEvent) , RooFit.LineColor(RooFit.kGreen))

# gauss2
mean2 = RooRealVar("mean2","mean of gaussian",0,-10,10)
sigma2 = RooRealVar("sigma2","width of gaussian",1,0.1,10)

gauss2 = RooGaussian("gauss2","gaussian PDF",x,mean2,sigma2)

# fit
gauss2.fitTo(data1)
Пример #12
0
gauss = RooGaussian("gauss", "gaussian PDF", x, mean, sigma)

# Construct plot frame in 'x'
xframe = x.frame()

# Plot on X
gauss.plotOn(xframe)

# Change sigma value
sigma.setVal(3)

# Plot on X
gauss.plotOn(xframe, RooFit.LineColor(2))

# Generate data (1000 events in x in a gaussian)
data = gauss.generate(ROOT.RooArgSet(x), 10000)

# Make another frame
xframe2 = x.frame()
data.plotOn(xframe2)
gauss.plotOn(xframe2)

# F i t   m o d e l   t o   d a t a

gauss.fitTo(data)

mean.Print()
sigma.Print()

c = TCanvas("rf101_basics", "rf101_basics", 800, 400)
def rooFit109():

    print ">>> setup model..."
    x = RooRealVar("x", "x", -10, 10)
    sigma = RooRealVar("sigma", "sigma", 3, 0.1, 10)
    mean = RooRealVar("mean", "mean", 0, -10, 10)
    gauss = RooGaussian("gauss", "gauss", x, RooConst(0),
                        sigma)  # RooConst(0) gives segfaults
    data = gauss.generate(RooArgSet(x), 100000)  # RooDataSet
    #sigma = 3.15 # overwrites RooRealVar with a float
    sigma.setVal(3.15)

    print ">>> plot data and slightly distorted model..."
    frame1 = x.frame(Title("Data with distorted Gaussian pdf"),
                     Bins(40))  # RooPlot
    data.plotOn(frame1, DataError(RooAbsData.SumW2))
    gauss.plotOn(frame1)

    print ">>> calculate chi^2..."
    # Show the chi^2 of the curve w.r.t. the histogram
    # If multiple curves or datasets live in the frame you can specify
    # the name of the relevant curve and/or dataset in chiSquare()
    print ">>>   chi^2 = %.2f" % frame1.chiSquare()

    print ">>> construct histograms with the residuals and pull of the data wrt the curve"
    hresid = frame1.residHist()  # RooHist
    hpull = frame1.pullHist()  # RooHist
    frame2 = x.frame(Title("Residual Distribution"))  # RooPlot
    frame2.addPlotable(hresid, "P")
    frame3 = x.frame(Title("Pull Distribution"))  # RooPlot
    frame3.addPlotable(hpull, "P")

    print ">>> draw functions and toy data on canvas..."
    canvas = TCanvas("canvas", "canvas", 100, 100, 2000, 400)
    canvas.Divide(3)
    for i, frame in enumerate([frame1, frame2, frame3], 1):
        canvas.cd(i)
        gPad.SetLeftMargin(0.14)
        gPad.SetRightMargin(0.04)
        frame.GetYaxis().SetTitleOffset(1.5)
        frame.GetYaxis().SetLabelOffset(0.010)
        frame.GetYaxis().SetTitleSize(0.045)
        frame.GetYaxis().SetLabelSize(0.042)
        frame.GetXaxis().SetTitleSize(0.045)
        frame.GetXaxis().SetLabelSize(0.042)
        frame.Draw()
    canvas.SaveAs("rooFit109.png")
    canvas.Close()

    # ratio/pull/residual plot
    print ">>> draw with pull plot..."
    canvas = TCanvas("canvas", "canvas", 100, 100, 1000, 1000)
    canvas.Divide(2)
    canvas.cd(1)
    gPad.SetPad("pad1", "pad1", 0, 0.33, 1, 1, 0, -1, 0)
    gPad.SetTopMargin(0.10)
    gPad.SetBottomMargin(0.03)
    gPad.SetLeftMargin(0.14)
    gPad.SetRightMargin(0.04)
    gPad.SetBorderMode(0)
    gStyle.SetTitleFontSize(0.062)
    frame1.GetYaxis().SetTitle("Events / %.3g GeV" % frame1.getFitRangeBinW())
    frame1.GetYaxis().SetTitleSize(0.059)
    frame1.GetYaxis().SetTitleOffset(1.21)
    #frame1.GetYaxis().SetLabelOffset(0.010)
    frame1.GetXaxis().SetLabelSize(0)
    frame1.GetYaxis().SetLabelSize(0.045)
    frame1.Draw()
    canvas.cd(2)
    gPad.SetPad("pad2", "pad2", 0, 0, 1, 0.33, 0, -1, 0)
    gPad.SetTopMargin(0.01)
    gPad.SetBottomMargin(0.30)
    gPad.SetLeftMargin(0.14)
    gPad.SetRightMargin(0.04)
    gPad.SetBorderMode(0)
    gPad.SetGridy(kTRUE)
    line1 = TLine(frame3.GetXaxis().GetXmin(), 0,
                  frame3.GetXaxis().GetXmax(), 0)
    line2 = TLine(frame3.GetXaxis().GetXmin(), 0,
                  frame3.GetXaxis().GetXmax(), 0)
    line1.SetLineColor(0)  # white to clear dotted grid lines
    line2.SetLineColor(12)  # dark grey
    line2.SetLineStyle(2)
    frame3.SetTitle("")
    frame3.GetYaxis().SetTitle("pull")
    frame3.GetXaxis().SetTitle("#Deltam^{2}_{ll} [GeV]")
    frame3.GetXaxis().SetTitleSize(0.13)
    frame3.GetYaxis().SetTitleSize(0.12)
    frame3.GetXaxis().SetTitleOffset(1.0)
    frame3.GetYaxis().SetTitleOffset(0.58)
    frame3.GetXaxis().SetLabelSize(0.10)
    frame3.GetYaxis().SetLabelSize(0.10)
    frame3.GetXaxis().SetLabelOffset(0.02)
    frame3.GetYaxis().SetLabelOffset(0.01)
    frame3.GetYaxis().SetRangeUser(-5, 5)
    frame3.GetYaxis().CenterTitle(True)
    frame3.GetYaxis().SetNdivisions(505)
    frame3.Draw("")
    line1.Draw("SAME")
    line2.Draw("SAME")
    frame3.Draw("SAME")
    canvas.SaveAs("rooFit109_ratiolike.png")
    canvas.Close()
Пример #14
0
sumfail = RooAddPdf("sumfail", "fixed extended sum pdf", componentsfail,
                    yieldsfail)

#Creates category
myFitCat = RooCategory("myFitCat", "Category: pass or fail")
myFitCat.defineType("fail", 1)
myFitCat.defineType("pass", 0)

#Create PDF for simultaneous fit
totalPdf = RooSimultaneous("totalPdf", "totalPdf", myFitCat)
totalPdf.addPdf(sumpass, "pass")
totalPdf.addPdf(sumfail, "fail")

#Generate data and combine
#For combining binned data look rf_combine_binned_data.py
data_pass = gauss1.generate(RooArgSet(Mkk), 6000)
data_fail = gauss1.generate(RooArgSet(Mkk), 4000)
combData = RooDataSet("combData", "combined data", RooArgSet(Mkk),
                      RooFit.Index(myFitCat), RooFit.Import("pass", data_pass),
                      RooFit.Import("fail", data_fail))

#FIT
totalPdf.fitTo(combData)

#PLOT
sampleSet = RooArgSet(myFitCat)
frame1 = Mkk.frame(RooFit.Bins(50), RooFit.Title("Passed sample"))

# Plot all data tagged as passed sample
combData.plotOn(frame1, RooFit.Cut("myFitCat==myFitCat::pass"))
totalPdf.plotOn(frame1, RooFit.Slice(myFitCat, "pass"),
Пример #15
0
result = model.fitTo(data, RooFit.Extended(), RooFit.Save())

cf_p = TCanvas('cf_p', 'fit, parametrized')

cf_p_frame = x.frame()
data.plotOn(cf_p_frame)
model.plotOn(cf_p_frame)
cf_p_frame.Draw()


######### model definition, template  

nsig_tpl = 10000
nbgd_tpl = 1000000

exp_sig_data = sig.generate(RooArgSet(x), nsig_tpl)
exp_sig_hist = exp_sig_data.binnedClone()
tsig = RooHistPdf('tsig', 'tsig', RooArgSet(x), exp_sig_hist)

exp_bgd_data = bgd.generate(RooArgSet(x), nbgd_tpl)
exp_bgd_hist = exp_bgd_data.binnedClone()
tbgd = RooHistPdf('tbgd', 'tbgd', RooArgSet(x), exp_bgd_hist)

# modelsig = RooAddPdf("modelsig", "modelsig", RooArgList(tsig), RooArgList(vysig))
# tmodel = RooAddPdf("tmodel", "tmodel", RooArgList(tsig), RooArgList(vysig))
tmodel = RooAddPdf("tmodel", "tmodel", RooArgList(tsig, tbgd),
                   RooArgList(vysig, vybgd))

######### data generation, template 

tdata = tmodel.generate(RooArgSet(x), ndata)
Пример #16
0
# Second Gaussian PDF
mean2 = RooRealVar("mean2", "Mean of Gaussian 2", 1.02052, 1.0, 1.1)
sigma2 = RooRealVar("sigma2", "Width of Gaussian 2", 0.0072, 0.001, 1)

gauss2 = RooGaussian("gauss2", "gauss1(Mkk,mean2,sigma2)", Mkk, mean2, sigma2)
r2 = RooRealVar("r2", "ratio of width of gaussian 2", 3.2, 0, 10)

customGaussR = RooGenericPdf(
    "customGaussR", "custom PDF build",
    "1/(sigma1*r2) * exp(- (Mkk - mean2)**2 / (2 * (sigma1*r2) ** 2))",
    RooArgList(Mkk, mean2, sigma1, r2))

# faster method:
r_sigma2 = RooFormulaVar("r_sigma2", "sigma1 * r2", RooArgList(sigma1, r2))
gauss2R = RooGaussian("gauss2R", "gauss1(Mkk,mean2,sigma2)", Mkk, mean2,
                      r_sigma2)

toyDataCustom = customGaussR.generate(RooArgSet(Mkk), 100000)
toyData = gauss2.generate(RooArgSet(Mkk), 100000)
toyDataR = gauss2R.generate(RooArgSet(Mkk), 100000)

c = TCanvas("c", "c", 800, 800)
frame1 = Mkk.frame(RooFit.Bins(50), RooFit.Title("Comparison of PDFs"))

# Plot all data tagged as passed sample
toyData.plotOn(frame1)
toyDataR.plotOn(frame1)
toyDataCustom.plotOn(frame1)
#totalPdf.paramOn(frame1, RooFit.Layout(0.55, 0.9, 0.9), RooFit.Format("NEU", RooFit.AutoPrecision(1)))
frame1.Draw()
def rf101_basics():
    # S e t u p   m o d e l 
    # ---------------------

    # Declare variables x,mean,sigma with associated name, title, initial value and allowed range
    x = RooRealVar("x","x",-10,10) 
    mean = RooRealVar("mean","mean of gaussian",1,-10,10) 
    sigma = RooRealVar("sigma","width of gaussian",1,0.1,10) 

    # Build gaussian p.d.f in terms of x,mean and sigma
    gauss = RooGaussian("gauss","gaussian PDF",x,mean,sigma)   

    # Construct plot frame in 'x'
    xframe = x.frame(RooFit.Title("Gaussian p.d.f.")) 


    # P l o t   m o d e l   a n d   c h a n g e   p a r a m e t e r   v a l u e s
    # ---------------------------------------------------------------------------

    # Plot gauss in frame (i.e. in x) 
    gauss.plotOn(xframe) 

    # Change the value of sigma to 3
    sigma.setVal(3) 

    # Plot gauss in frame (i.e. in x) and draw frame on canvas
    gauss.plotOn(xframe,RooFit.LineColor(kRed)) 
  

    # G e n e r a t e   e v e n t s 
    # -----------------------------

    # Generate a dataset of 1000 events in x from gauss
    data = gauss.generate(RooArgSet(x),10000.)   
  
    # Make a second plot frame in x and draw both the 
    # data and the p.d.f in the frame
    xframe2 = x.frame(RooFit.Title("Gaussian p.d.f. with data")) 
    data.plotOn(xframe2) 
    gauss.plotOn(xframe2) 
  

    # F i t   m o d e l   t o   d a t a
    # -----------------------------

    # Fit pdf to data
    gauss.fitTo(data) 

    # Print values of mean and sigma (that now reflect fitted values and errors)
    mean.Print() 
    sigma.Print() 

    # Draw all frames on a canvas
    c = TCanvas("rf101_basics","rf101_basics",800,400) 
    c.Divide(2) 
    c.cd(1)
    gPad.SetLeftMargin(0.15)
    xframe.GetYaxis().SetTitleOffset(1.6)
    xframe.Draw() 
    c.cd(2)
    gPad.SetLeftMargin(0.15)
    xframe2.GetYaxis().SetTitleOffset(1.6)
    xframe2.Draw() 
    raw_input()
Пример #18
0
def toy_run(n_params,
            n_gauss,
            n_toys,
            toys_nevents,
            run_zfit,
            intermediate_result_factory=None):
    # pdf = chebys[0]

    # zfit.settings.set_verbosity(10)

    performance = {}
    performance["column"] = "number of events"
    for nevents in toys_nevents:
        # n_toys = 30 if nevents < 50000 else 10

        if run_zfit:
            zfit.run.create_session(reset_graph=True)
            # zfit.sess.close()
            # zfit.sess = tf.Session
        # initial_param_val, obs, pdf = build_pdf(n_gauss, n_params, run_zfit)

        lower = -1
        upper = 1
        # create observables
        if run_zfit:
            obs = zfit.Space("obs1", limits=(lower, upper))
        else:
            obs = RooRealVar("obs", "obs1", lower, upper)
            ROOT.SetOwnership(obs, False)
        # create parameters
        params = []
        params_initial = []
        mu_lower, mu_upper = 1, 3
        sigma_lower, sigma_upper = 0.5, 2
        # step_size = 0.003
        for i in range(n_params):
            if run_zfit:
                mu = zfit.Parameter(
                    f"mu_{i}_{nevents}",
                    np.random.uniform(low=mu_lower, high=mu_upper),
                    mu_lower,
                    mu_upper,
                    # step_size=step_size
                )
                sigma = zfit.Parameter(
                    f"sigma_{i}_{nevents}",
                    np.random.uniform(low=sigma_lower, high=sigma_upper),
                    sigma_lower,
                    sigma_upper,
                    # step_size=step_size
                )
            else:
                mu_initial = np.random.uniform(mu_lower, mu_upper)
                mu = RooRealVar(f"mu_{i}_{nevents}", "Mean of Gaussian",
                                mu_initial, mu_lower, mu_upper)
                ROOT.SetOwnership(mu, False)
                sigma_initial = np.random.uniform(mu_lower, mu_upper)
                sigma = RooRealVar(f"sigma_{i}_{nevents}", "Width of Gaussian",
                                   sigma_initial, sigma_lower, sigma_upper)
                ROOT.SetOwnership(sigma, False)
                params_initial.append((mu_initial, sigma_initial))
            params.append((mu, sigma))
        # create pdfs
        pdfs = []
        for i in range(n_gauss):
            mu, sigma = params[i % n_params]
            if run_zfit:
                shifted_mu = mu + 0.3 * i
                shifted_sigma = sigma + 0.1 * i
                pdf = zfit.pdf.Gauss(obs=obs,
                                     mu=shifted_mu,
                                     sigma=shifted_sigma)
                # from zfit.models.basic import CustomGaussOLD
                # pdf = CustomGaussOLD(obs=obs, mu=shifted_mu, sigma=shifted_sigma)
                # pdf.update_integration_options(mc_sampler=tf.random_uniform)
            else:
                shift1 = RooFit.RooConst(float(0.3 * i))
                shifted_mu = RooAddition(f"mu_shifted_{i}_{nevents}",
                                         f"Shifted mu {i}",
                                         RooArgList(mu, shift1))
                shift2 = RooFit.RooConst(float(0.1 * i))
                shifted_sigma = RooAddition(f"sigma_shifted_{i}_{nevents}",
                                            f"Shifted sigma {i}",
                                            RooArgList(sigma, shift2))
                pdf = RooGaussian(f"pdf_{i}_{nevents}", "Gaussian pdf", obs,
                                  shifted_mu, shifted_sigma)
                ROOT.SetOwnership(pdf, False)
                ROOT.SetOwnership(shift1, False)
                ROOT.SetOwnership(shifted_mu, False)
                ROOT.SetOwnership(shift2, False)
                ROOT.SetOwnership(shifted_sigma, False)
            pdfs.append(pdf)
        initial_param_val = 1 / n_gauss
        fracs = []
        for i in range(n_gauss - 1):
            frac_value = 1 / n_gauss
            lower_value = 0.0001
            upper_value = 1.5 / n_gauss
            if run_zfit:
                frac = zfit.Parameter(f"frac_{i}",
                                      value=1 / n_gauss,
                                      lower_limit=lower_value,
                                      upper_limit=upper_value)
                frac.floating = False
            else:
                frac = RooRealVar(f"frac_{i}_{nevents}", "Fraction of a gauss",
                                  frac_value)
                ROOT.SetOwnership(frac, False)
            fracs.append(frac)
        if run_zfit:
            sum_pdf = zfit.pdf.SumPDF(pdfs=pdfs, fracs=fracs)
            # sum_pdf.update_integration_options(mc_sampler=tf.random_uniform)

        else:
            sum_pdf = RooAddPdf(f"sum_pdf_{nevents}", "sum of pdfs",
                                RooArgList(*pdfs), RooArgList(*fracs))
            ROOT.SetOwnership(sum_pdf, False)
        pdf = sum_pdf

        # Create dictionary to save fit results
        failed_fits = 0
        successful_fits = 0
        performance[nevents] = {"success": [], "fail": []}

        if run_zfit:
            sampler = pdf.create_sampler(n=nevents, fixed_params=True)
            sampler.set_data_range(obs)
            nll = zfit.loss.UnbinnedNLL(pdf, sampler)

            minimizer = zfit.minimize.MinuitMinimizer(
                zfit.minimizers.baseminimizer.ToyStrategyFail(),
                verbosity=5,
                minimize_strategy=1)
            # minimizer.minimizer_options['tol'] = 100

            # minimizer._use_tfgrad = False

        timer = zfit_benchmark.timer.Timer(f"Toys {nevents}")
        if run_zfit:
            sampler.resample()
            # with tf.device("/device:GPU:0"):
            jit_scope = tf.contrib.compiler.jit.experimental_jit_scope
            # with jit_scope():
            to_run = [nll.value(), nll.gradients()]
            zfit.run(to_run)
            dependents = pdf.get_dependents()
        else:
            mgr = ROOT.RooMCStudy(pdf, RooArgSet(obs), RooFit.Silence())
            ROOT.SetOwnership(mgr, False)
        run_toystudy = False
        with progressbar.ProgressBar(max_value=n_toys) as bar:
            ident = 0
            with timer:
                if not run_toystudy:
                    while successful_fits < n_toys:
                        # print(f"starting run number {len(fitResults)}")
                        if run_zfit:
                            sampler.resample()

                            for param in dependents:
                                param.randomize()
                        else:
                            for (mu, sigma), (mu_val, sigma_val) in zip(
                                    params, params_initial):
                                mu.setVal(mu_val)
                                sigma.setVal(sigma_val)

                            data = pdf.generate(RooArgSet(obs), nevents)

                            for mu, sigma in params:
                                mu.setVal(np.random.uniform(
                                    mu_lower, mu_upper))
                                sigma.setVal(
                                    np.random.uniform(sigma_lower,
                                                      sigma_upper))

                        with timer.child(
                                f"toy number {successful_fits} {ident}"
                        ) as child:
                            if run_zfit:
                                # sampler.resample()

                                # with tf.device("/device:GPU:0"):
                                minimum = minimizer.minimize(nll)
                                # print(minimum.hesse())
                            else:

                                # for mu, sigma in params:
                                #     mu.setVal(np.random.uniform(mu_lower, mu_upper))
                                #     sigma.setVal(np.random.uniform(sigma_lower, sigma_upper))
                                # for frac in fracs:
                                #     frac.setVal(np.random.uniform(lower_value, upper_value))
                                result = pdf.fitTo(data, RooFit.NumCPU(12),
                                                   RooFit.Save(True),
                                                   RooFit.Hesse(False),
                                                   RooFit.Minos(False))
                        if ident == 0:
                            ident += 1
                            continue  # warm up run
                        if run_zfit:
                            if minimum.converged:
                                bar.update(successful_fits)
                                successful_fits += 1
                                fail_or_success = "success"
                            else:
                                child.elapsed = Decimal()
                                failed_fits += 1
                                fail_or_success = "fail"
                        else:
                            if result.status() == 0:
                                bar.update(successful_fits)
                                successful_fits += 1
                                fail_or_success = "success"
                            else:
                                child.elapsed = Decimal()
                                failed_fits += 1
                                fail_or_success = "fail"

                        ident += 1
                        performance[nevents][fail_or_success].append(
                            float(child.elapsed))
                else:

                    mgr.generateAndFit(n_toys, nevents)
                    performance[nevents]["success"].append(
                        [float(timer.elapsed) / n_toys for _ in range(n_toys)])

        with open(f"{run_name}tmp.yaml", "w") as f:
            if intermediate_result_factory:
                dump_result = intermediate_result_factory(performance)
            else:
                dump_result = performance.copy()
            dump_result["ATTENTION"] = "NOT FINISHED"
            yaml.dump(dump_result, f)
    return performance