コード例 #1
0
def doFit(hist,output,rap="BB",flavour="DATA",trackType="TunePNew",funct="doubleCB"):

	
	sig    = []
	sige   = []
	meanList   = []
	meanListe  = []
	nChi2  = []
	gSystem.Load("./RooCruijff_cxx.so")
	gSystem.Load("./RooDCBShape_cxx.so")
	for i,h in enumerate(hist):
		ws = RooWorkspace("tempWS")

		mass = RooRealVar('mass','mass',91, xLow, xHigh )
		getattr(ws,'import')(mass,RooCmdArg())			
		dataHist = RooDataHist("hist","hist",RooArgList(ws.var("mass")),h)
		getattr(ws,'import')(dataHist,RooCmdArg())

		ws.writeToFile("tmpWorkspace.root")
		
		subprocess.call(["python","fitCapsule.py",output,rap,flavour,trackType,funct,"%d"%xLow,"%d"%xHigh,"%d"%rebinFactor,"%d"%i])
		
		returnFile = TFile("tmpWorkspaceReturn.root","OPEN")
		wsReturn = returnFile.Get("tempWS")
		
		sig.append(wsReturn.var("Sig").getVal())
		sige.append(wsReturn.var("Sige").getVal())
		meanList.append(wsReturn.var("Mean").getVal())
		meanListe.append(wsReturn.var("Meane").getVal())
		nChi2.append(wsReturn.var("chi2").getVal()/wsReturn.var("nDOF").getVal())


	return meanList,meanListe,sig,sige, nChi2	
コード例 #2
0
def main():

    output = argv[1]
    rap = argv[2]
    flavour = argv[3]
    trackType = argv[4]
    funct = argv[5]
    fit_min = int(argv[6])
    fit_max = int(argv[7])
    rebinFactor = int(argv[8])
    i = int(argv[9])

    if funct == "CB":
        DOCRYSTALBALL = True
        DOCRUIJFF = False
        DODOUBLECB = False

    elif funct == "cruijff":
        DOCRUIJFF = True
        DOCRYSTALBALL = False
        DODOUBLECB = False

    elif funct == "doubleCB":
        DODOUBLECB = True
        DOCRYSTALBALL = False
        DOCRUIJFF = False

    print("+++++++++++++++++++++++++++++++++++++++++")
    print("Fitting histogram for %d < pt_{l} <%d" % (ptbins[i], ptbins[i + 1]))
    print("+++++++++++++++++++++++++++++++++++++++++\n")

    wsFile = TFile("tmpWorkspace.root")
    ws = wsFile.Get("tempWS")
    # fit with a gaussian

    if DOCRYSTALBALL:
        funct = TF1("crystal", "crystalball", fit_min, fit_max)
        funct.SetLineColor(kRed)
        if ws.data("hist").sum(False) < 1500:
            nDOF = (fit_max - fit_min) * 2 / (rebinFactor * 4) - 3
        else:
            nDOF = (fit_max - fit_min) * 2 / rebinFactor - 3

        ws.factory(
            "RooCBShape::cb(mass, mean[0.0], sigma[2,0,10], alphaL[3,-25,25], nL[5,-25,25])"
        )
        ws.factory("BreitWigner::bw(mass,meanZ[91.187], width[2.495])")
        bw = ws.pdf("bw")
        cb = ws.pdf("cb")
        ws.var("mass").setBins(2000, "cache")
        ws.var("mass").setMin("cache", 0)
        ws.var("mass").setMax("cache", 1000)
        ## need to be adjusted to be higher than limit setting

        sigpdf = RooFFTConvPdf("sig", "sig", ws.var("mass"), bw, cb)
        getattr(ws, 'import')(sigpdf, RooCmdArg())

        fitResult = ws.pdf("sig").fitTo(ws.data("hist"), RooFit.Save(),
                                        RooFit.SumW2Error(kFALSE),
                                        RooFit.Minos(kFALSE))

    elif DOCRUIJFF:

        gSystem.Load("./RooCruijff_cxx.so")
        ws.factory(
            "RooCruijff::cb(mass, mean[0.0], sigma[2,0,20], sigma, alphaL[1,0,25], alphaR[1,0,25])"
        )

        if ws.data("hist").sum(False) < 1500:
            nDOF = (fit_max - fit_min) * 2 / (6) - 3
        elif ws.data("hist").sum(False) < 2500:
            nDOF = (fit_max - fit_min) * 2 / (4) - 3
        else:
            nDOF = (fit_max - fit_min) * 2 / rebinFactor - 3

        ws.factory("BreitWigner::bw(mass,meanZ[91.187], width[2.495])")
        bw = ws.pdf("bw")
        cb = ws.pdf("cb")
        ws.var("mass").setBins(2000, "cache")
        ws.var("mass").setMin("cache", 0)
        ws.var("mass").setMax("cache", 1000)
        ## need to be adjusted to be higher than limit setting

        sigpdf = RooFFTConvPdf("sig", "sig", ws.var("mass"), bw, cb)
        getattr(ws, 'import')(sigpdf, RooCmdArg())

        fitResult = ws.pdf("sig").fitTo(ws.data("hist"), RooFit.Save(),
                                        RooFit.SumW2Error(kFALSE),
                                        RooFit.Minos(kFALSE))

    elif DODOUBLECB:

        gSystem.Load("./RooDCBShape_cxx.so")

        ws.factory(
            "RooDCBShape::cb(mass, mean[0.0,-1.5,1.5], sigma[2,0,20], alphaL[2,0,25] , alphaR[2,0,25], nL[1.5,0,25], nR[1.5,0,25])"
        )
        if i == 0:
            ws.var("nL").setVal(1)
            ws.var("nR").setVal(1)
        ws.factory("BreitWigner::bw(mass,meanZ[91.187], width[2.495])")
        bw = ws.pdf("bw")
        cb = ws.pdf("cb")
        ws.var("mass").setBins(2000, "cache")
        ws.var("mass").setMin("cache", 0)
        ws.var("mass").setMax("cache", 1000)
        ## need to be adjusted to be higher than limit setting

        sigpdf = RooFFTConvPdf("sig", "sig", ws.var("mass"), bw, cb)
        getattr(ws, 'import')(sigpdf, RooCmdArg())

        fitResult = ws.pdf("sig").fitTo(ws.data("hist"), RooFit.Save(),
                                        RooFit.SumW2Error(kFALSE),
                                        RooFit.Minos(kFALSE))

        chi2 = RooChi2Var("bla", "blubb", ws.pdf("sig"),
                          ws.data("hist")).getVal()

        if ws.data("hist").sum(False) < 1500:
            nDOF = (fit_max - fit_min) * 2 / (6) - 5
        elif ws.data("hist").sum(False) < 2500:
            nDOF = (fit_max - fit_min) * 2 / (4) - 5
        else:
            nDOF = (fit_max - fit_min) * 2 / rebinFactor - 5

    chi2 = RooChi2Var("bla", "blubb", ws.pdf("sig"), ws.data("hist")).getVal()

    nDOFforWS = RooRealVar('nDOF', 'nDOF', nDOF)
    getattr(ws, 'import')(nDOFforWS, RooCmdArg())
    chi2forWS = RooRealVar('chi2', 'chi2', chi2)
    getattr(ws, 'import')(chi2forWS, RooCmdArg())

    mean = RooRealVar('Mean', 'Mean', ws.var("meanZ").getVal())
    getattr(ws, 'import')(mean, RooCmdArg())
    meane = RooRealVar('Meane', 'Meane', ws.var("meanZ").getError())
    getattr(ws, 'import')(meane, RooCmdArg())
    sig = RooRealVar('Sig', 'Sig', ws.var("sigma").getVal())
    getattr(ws, 'import')(sig, RooCmdArg())
    sige = RooRealVar('Sige', 'Sige', ws.var("sigma").getError())
    getattr(ws, 'import')(sige, RooCmdArg())

    c1 = TCanvas("c1", "c1", 700, 700)
    c1.cd()
    plotPad = TPad("plotPad", "plotPad", 0, 0, 1, 1)
    style = setTDRStyle()
    gStyle.SetOptStat(0)
    gStyle.SetTitleXOffset(1.45)
    gStyle.SetPadLeftMargin(0.2)
    gStyle.SetTitleYOffset(2)
    plotPad.UseCurrentStyle()
    plotPad.Draw()
    plotPad.cd()

    if DODOUBLECB or DOCRYSTALBALL or DOCRUIJFF:
        ws.var("mass").setBins(30)
        frame = ws.var('mass').frame(
            RooFit.Title('Invariant mass of dimuon pairs'))
        frame.GetXaxis().SetTitle('m_{#mu#mu} [GeV]')
        frame.GetYaxis().SetTitle("Events / 2 GeV")
        RooAbsData.plotOn(ws.data('hist'), frame, RooFit.Name("hist"))
        ws.pdf('sig').plotOn(frame, RooFit.Name("sig"))
        frame.Draw()

        #chi2 = frame.chiSquare("sig","hist",nDOF)
    else:

        h.GetXaxis().SetTitle("m_{ll} [GeV]")
        h.SetLineColor(kBlack)
        h.GetXaxis().SetRangeUser(fit_min, fit_max)
        h.SetMarkerStyle(20)
        h.SetMarkerSize(0.7)

        h.Draw("E")
        if DOCRYSTALBALL or DOCRUIJFF or DODOUBLECB:
            funct.Draw("SAME")
        else:
            gaus.Draw("SAME")

    latex = TLatex()
    latex.SetTextFont(42)
    latex.SetTextAlign(31)
    latex.SetTextSize(0.04)
    latex.SetNDC(True)
    latexCMS = TLatex()
    latexCMS.SetTextFont(61)
    latexCMS.SetTextSize(0.055)
    latexCMS.SetNDC(True)
    latexCMSExtra = TLatex()
    latexCMSExtra.SetTextFont(52)
    latexCMSExtra.SetTextSize(0.03)
    latexCMSExtra.SetNDC(True)

    latex.DrawLatex(0.95, 0.96, "(13 TeV)")

    cmsExtra = "Preliminary"
    latexCMS.DrawLatex(0.78, 0.88, "CMS")
    yLabelPos = 0.84
    latexCMSExtra.DrawLatex(0.78, yLabelPos, "%s" % (cmsExtra))

    latexFit1 = TLatex()
    latexFit1.SetTextFont(42)
    latexFit1.SetTextSize(0.035)
    latexFit1.SetNDC(True)
    latexFit1.DrawLatex(0.25, 0.84,
                        "%d GeV < p_{T} < %d GeV" % (ptbins[i], ptbins[i + 1]))

    latexFit = TLatex()
    latexFit.SetTextFont(42)
    latexFit.SetTextSize(0.030)
    latexFit.SetNDC(True)
    latexFit.DrawLatex(
        0.25, 0.74, "%s = %5.3g #pm %5.3g GeV" %
        ("mean bias", ws.var("mean").getVal(), ws.var("mean").getError()))
    if funct == "CB":
        latexFit.DrawLatex(
            0.25, 0.7, "%s = %5.3g #pm %5.3g GeV" %
            ("#sigma", ws.var("sigma").getVal(), ws.var("sigma").getError()))
        latexFit.DrawLatex(
            0.25, 0.66, "%s = %5.3g #pm %5.3g" %
            ("alphaL", ws.var("alphaL").getVal(), ws.var("alphaL").getError()))
        latexFit.DrawLatex(
            0.25, 0.62, "%s = %5.3g #pm %5.3g" %
            ("nL", ws.var("nL").getVal(), ws.var("nL").getError()))
    if funct == "cruijff":
        latexFit.DrawLatex(
            0.25, 0.7, "%s = %5.3g #pm %5.3g GeV" %
            ("#sigma", ws.var("sigma").getVal(), ws.var("sigma").getError()))
        latexFit.DrawLatex(
            0.25, 0.66, "%s = %5.3g #pm %5.3g" %
            ("alphaL", ws.var("alphaL").getVal(), ws.var("alphaL").getError()))
        latexFit.DrawLatex(
            0.25, 0.62, "%s = %5.3g #pm %5.3g" %
            ("alphaR", ws.var("alphaR").getVal(), ws.var("alphaR").getError()))

    if funct == "doubleCB":
        latexFit.DrawLatex(
            0.25, 0.7, "%s = %5.3g #pm %5.3g GeV" %
            ("#sigma", ws.var("sigma").getVal(), ws.var("sigma").getError()))
        latexFit.DrawLatex(
            0.25, 0.66, "%s = %5.3g #pm %5.3g" %
            ("alphaL", ws.var("alphaL").getVal(), ws.var("alphaL").getError()))
        latexFit.DrawLatex(
            0.25, 0.62, "%s = %5.3g #pm %5.3g" %
            ("alphaR", ws.var("alphaR").getVal(), ws.var("alphaR").getError()))
        latexFit.DrawLatex(
            0.25, 0.58, "%s = %5.3g #pm %5.3g" %
            ("nL", ws.var("nL").getVal(), ws.var("nL").getError()))
        latexFit.DrawLatex(
            0.25, 0.54, "%s = %5.3g #pm %5.3g" %
            ("nR", ws.var("nR").getVal(), ws.var("nR").getError()))

    latexFit.DrawLatex(
        0.25, 0.5,
        "#chi^{2}/ndf = %5.1f / %2.0f = %4.2f" % (chi2, nDOF, chi2 / nDOF))

    saveas = "/MassRes_%s_%s_Pt%d_%d_%s" % (trackType, flavour, ptbins[i],
                                            ptbins[i + 1], rap)
    c1.SaveAs(output + saveas + ".root")
    c1.SaveAs(output + saveas + ".C")
    c1.SaveAs(output + saveas + ".png")
    c1.SaveAs(output + saveas + ".pdf")

    print("DONE Fitting...")
    ws.writeToFile("tmpWorkspaceReturn.root")
コード例 #3
0
def main():

    c1 = ROOT.TCanvas("Data", "Data", 600, 600)
    c1.Divide(1, 1)
    c2 = ROOT.TCanvas("MC", "MC", 600, 600)
    c2.Divide(2, 2)
    c3 = ROOT.TCanvas("MC RooHistPdfs", "MC RooHistPdfs", 600, 600)
    c3.Divide(2, 2)

    lo = 0
    hi = 10
    x = ROOT.RooRealVar("x", "x", lo, hi)

    frame = x.frame()

    ############################################################################
    # Generate a fake dataset
    # This is where you would read in the "real" data
    ############################################################################
    data = []
    # Signal
    data += np.random.normal(2, 0.5, 500).tolist()
    # Background
    data += np.random.normal(7, 1.5, 800).tolist()
    data += ((hi - lo) * np.random.random(3000) + lo).tolist()

    roodataset = ROOT.RooDataSet("roodataset", "roodataset", RooArgSet(x))
    for d in data:
        if d > lo and d < hi:
            x.setVal(d)
            roodataset.add(RooArgSet(x))

    roodataset.plotOn(frame)
    dhdata = RooDataHist("dhdata", "dhdata", RooArgSet(x), roodataset)

    ############################################################################
    # Generate the fake MC samples
    # This is where you would read in the "real" MC samples
    ############################################################################
    MC_samples = []
    nbins = 50
    hmc0 = ROOT.TH1F("hmc0", "hmc0", nbins, lo, hi)
    hmc1 = ROOT.TH1F("hmc1", "hmc1", nbins, lo, hi)
    hmc2 = ROOT.TH1F("hmc2", "hmc2", nbins, lo, hi)

    #xmc0 =  ROOT.RooRealVar("xmc0","xmc0",lo,hi);
    #xmc1 =  ROOT.RooRealVar("xmc1","xmc1",lo,hi);
    #xmc2 =  ROOT.RooRealVar("xmc2","xmc2",lo,hi);

    mcdataset0 = ROOT.RooDataSet("roodatasetmc0", "roodatasetmc0",
                                 RooArgSet(x))
    mcdataset1 = ROOT.RooDataSet("roodatasetmc1", "roodatasetmc1",
                                 RooArgSet(x))
    mcdataset2 = ROOT.RooDataSet("roodatasetmc2", "roodatasetmc2",
                                 RooArgSet(x))

    # Sample 0 - Signal
    mc = np.random.normal(2, 0.5, 10000)
    for m in mc:
        if m > lo and m < hi:
            hmc0.Fill(m)
            x.setVal(m)
            mcdataset0.add(RooArgSet(x))

    # Sample 1 - Background
    mc = np.random.normal(7, 1.5, 10000)
    for m in mc:
        if m > lo and m < hi:
            hmc1.Fill(m)
            x.setVal(m)
            mcdataset1.add(RooArgSet(x))

    # Sample 2 - Background
    mc = ((hi - lo) * np.random.random(10000) + lo)
    for m in mc:
        if m > lo and m < hi:
            hmc2.Fill(m)
            x.setVal(m)
            mcdataset2.add(RooArgSet(x))

    c2.cd(1)
    hmc0.SetMinimum(0)
    hmc0.Draw()

    c2.cd(2)
    hmc1.SetMinimum(0)
    hmc1.Draw()

    c2.cd(3)
    hmc2.SetMinimum(0)
    hmc2.Draw()

    framemc0 = x.frame()
    framemc1 = x.frame()
    framemc2 = x.frame()

    c3.cd(1)
    x.setBins(nbins)
    mcdataset0.plotOn(framemc0)
    framemc0.Draw()

    c3.cd(2)
    x.setBins(nbins)
    mcdataset1.plotOn(framemc1)
    framemc1.Draw()

    c3.cd(3)
    x.setBins(nbins)
    mcdataset2.plotOn(framemc2)
    framemc2.Draw()

    # Now make the RooHistPdfs and construct the model
    dhmc0 = RooDataHist("hdmc0", "hdmc0", RooArgSet(x), mcdataset0)
    mcpdf0 = RooHistPdf("mcpdf0", "mcpdf0", RooArgSet(x), dhmc0)

    dhmc1 = RooDataHist("hdmc1", "hdmc1", RooArgSet(x), mcdataset1)
    mcpdf1 = RooHistPdf("mcpdf1", "mcpdf1", RooArgSet(x), dhmc1)

    dhmc2 = RooDataHist("hdmc2", "hdmc2", RooArgSet(x), mcdataset2)
    mcpdf2 = RooHistPdf("mcpdf2", "mcpdf2", RooArgSet(x), dhmc2)

    a0 = RooRealVar("a0", "a0", 500, 100, 1500)
    a1 = RooRealVar("a1", "a1", 800, 100, 1500)
    a2 = RooRealVar("a2", "a2", 3000, 1000, 10000)

    model = RooAddPdf("model", "Three HistPdfs",
                      RooArgList(mcpdf0, mcpdf1, mcpdf2),
                      RooArgList(a0, a1, a2))

    #model.fitTo(dhdata,RooCmdArg("mhe"))
    model.fitTo(roodataset, RooCmdArg("mhe"))

    model.plotOn(frame)

    c1.cd(1)
    frame.Draw()
    c1.Draw()

    rep = ''
    while not rep in ['q', 'Q']:
        rep = input('enter "q" to quit: ')
        if 1 < len(rep):
            rep = rep[0]