예제 #1
0
def plot(file, var, region):
    signalRegion = False

    stack = StackMaker(config, var, region, signalRegion)

    histosL = []
    overlayL = []

    print file
    datas = []
    datasL = []
    for th1 in get_th1(file):
        print th1.GetBinLowEdge(0)
        if 'VH' in th1.GetName():
            overlayL.append(th1)
            th1.SetLineWidth(1)
        if 'data_obs' in th1.GetName():
            datasL.append(th1)
        else:
            histosL.append(th1)

    print 'histoL'
    print histosL
    typs = []
    typsL = []

    overlay_typs = []

    #append the name just once
    for histo in histosL:
        typsL.append(histo.GetName())
        print histo.GetName()
        if 'VH' in histo.GetName():
            overlay_typs.append(histo.GetName())

    print typsL
    print 'Overlay list'
    print overlayL

    overlay_histo_dict = HistoMaker.orderandadd([{
        overlay_typs[i]: overlayL[i]
    } for i in range(len(overlayL))], ['VH', 'VV'])

    overlayL2 = []
    stack.histos = histosL
    stack.typs = typsL
    stack.datas = datasL
    stack.datanames = region
    for key in overlay_histo_dict:
        overlayL2.append(overlay_histo_dict[key])

    appendix = ''

    stack.options['pdfName'] = stack.options['pdfName'].replace(
        '.pdf', '_unweighted.' + opts.format)

    stack.lumi = 18940

    stack.doPlot()
    print 'i am done!\n'
예제 #2
0
def plot(file,var,region):
    signalRegion = False

    stack = StackMaker(config,var,region,signalRegion)

    histosL = []
    overlayL = []


    print file
    datas = []
    datasL = []
    for th1 in get_th1(file):
        print th1.GetBinLowEdge(0)
        if 'VH' in th1.GetName(): 
            overlayL.append(th1)
            th1.SetLineWidth(1)
        if 'data_obs' in th1.GetName():
            datasL.append(th1)
        else:
            histosL.append(th1)

    print 'histoL'
    print histosL
    typs = []
    typsL = []

    overlay_typs=[]

    #append the name just once
    for histo in histosL:
        typsL.append(histo.GetName())
        print histo.GetName()
        if 'VH' in histo.GetName():
            overlay_typs.append(histo.GetName())

    print typsL
    print 'Overlay list'
    print overlayL

    overlay_histo_dict = HistoMaker.orderandadd([{overlay_typs[i]:overlayL[i]} for i in range(len(overlayL))],['VH','VV'])

    overlayL2=[]
    stack.histos = histosL
    stack.typs = typsL
    stack.datas = datasL
    stack.datanames=region
    for key in overlay_histo_dict:
         overlayL2.append(overlay_histo_dict[key])

    appendix = ''
    
    stack.options['pdfName'] = stack.options['pdfName'].replace('.pdf','_unweighted.'+opts.format)            
    
    stack.lumi = 18940

    stack.doPlot()
    print 'i am done!\n'
예제 #3
0
def log_s_over_b_allRegions(fileList, Region):

    print '-----> Running def log_s_over_b() for All Regions'

    #--------------
    # log s  over b
    #--------------

    region_list = ['Zuu_high', 'Zee_high', 'Zuu_low', 'Zee_low']

    histosL = {}
    s_b_d_histos = {}

    for file in fileList:
        for region in region_list:

            #print '\n\tRegion:', region

            #print file
            name = '%s' % file
            histosL[region] = []
            for th1 in get_th1(file, region):

                if 'btag' in th1.GetName(): continue
                if '_stats_' in th1.GetName(): continue
                if '_j_' in th1.GetName(): continue
                if 'eff' in th1.GetName(): continue
                if 'LHE' in th1.GetName(): continue
                if 'total' in th1.GetName(): continue
                if 'total_signal' in th1.GetName(): continue
                if 'total_background' in th1.GetName(): continue

                #print '\n\t Retrieving TH1 from file: ', th1.GetName(), th1.Integral()

                histosL[region].append(th1)

            i = 0
            j = 0

            #print ' histosL:',  histosL

            for hist in histosL[region]:

                if 'ZH' == hist.GetName() or 'ggZH' == hist.GetName():

                    #print '\n\t Setting ',hist, ' as signal...'

                    if j == 0:
                        hSignal = hist.Clone()
                    else:
                        hSignal.Add(hist)
                    j += 1

                elif 'data_obs' in hist.GetName():
                    hData = hist.Clone()

                else:
                    if i == 0:
                        hBkg = hist.Clone()
                    else:
                        hBkg.Add(hist)
                    i += 1

            # temp hack
            hData = hBkg + hSignal

            s_b_d_histos[region] = {'b': hBkg, 's': hSignal, 'd': hData}

    bmin = -4
    bmax = 0
    nbins = 10

    log_s_over_b_b = ROOT.TH1F("log_s_over_b_b", "log_s_over_b_b", nbins, bmin,
                               bmax)
    log_s_over_b_b.SetFillColor(4)
    log_s_over_b_b.GetXaxis().SetTitle("log(S/B)")
    log_s_over_b_b.GetYaxis().SetTitle("Events")
    log_s_over_b_s = ROOT.TH1F("log_s_over_b_s", "log_s_over_b_s", nbins, bmin,
                               bmax)
    log_s_over_b_s.SetFillColor(2)
    log_s_over_b_d = ROOT.TH1F("log_s_over_b_d", "log_s_over_b_d", nbins, bmin,
                               bmax)
    log_s_over_b = ROOT.THStack("log_s_over_b", "log_s_over_b")

    stack_log_s_over_b = ROOT.THStack("stack_log_s_over_b",
                                      "stack_log_s_over_b")

    print '\ns_b_d_histos', s_b_d_histos

    for key, s_b_d in s_b_d_histos.iteritems():

        print '\n-----> Looping over Histogram: ', key, s_b_d

        #for bin in range(0,s_b_d['b'].GetNbinsX()+1):
        for bin in range(1, nbins + 1):
            s = s_b_d['s'].GetBinContent(bin)
            b = s_b_d['b'].GetBinContent(bin)
            d = s_b_d['d'].GetBinContent(bin)
            sErr = s_b_d['s'].GetBinError(bin)
            bErr = s_b_d['b'].GetBinError(bin)
            dErr = s_b_d['d'].GetBinError(bin)

            logsb = -3.9
            if b > 0. and s > 0.:
                logsb = log10(s / b)
            elif s > 0.:
                logsb = -0.

            print '\n\t Calculating log_s/b for bin', bin
            print '\t\t sig:', s, '   bgk:', b
            print '\t\t Log_s/b', logsb
            print '\t\t Data Obs', d

            newBin = log_s_over_b_b.FindBin(logsb)
            log_s_over_b_b.SetBinContent(
                newBin, b + log_s_over_b_b.GetBinContent(newBin))
            log_s_over_b_s.SetBinContent(
                newBin, s + log_s_over_b_s.GetBinContent(newBin))
            log_s_over_b_d.SetBinContent(
                newBin, d + log_s_over_b_d.GetBinContent(newBin))
            log_s_over_b_b.SetBinError(
                newBin,
                sqrt(bErr * bErr + log_s_over_b_b.GetBinError(newBin) *
                     log_s_over_b_b.GetBinError(newBin)))
            #log_s_over_b_s.SetBinError(newBin, sqrt(sErr*sErr+log_s_over_b_s.GetBinError(newBin)*log_s_over_b_s.GetBinError(newBin)))
            log_s_over_b_d.SetBinError(
                newBin,
                sqrt(dErr * dErr + log_s_over_b_d.GetBinError(newBin) *
                     log_s_over_b_d.GetBinError(newBin)))

    stack = StackMaker(config, 'logSB', 'plot1', False)
    stack.setup = ['ZH', 'BKG']
    stack.typs = ['ZH', 'BKG']
    stack.lumi = 12900.
    stack.histos = [log_s_over_b_s, log_s_over_b_b]
    stack.datas = [log_s_over_b_d]
    stack.datanames = 'data_obs'
    stack.overlay = log_s_over_b_s
    stack.filename = Region
    stack.doPlot()
예제 #4
0
    l2.SetBorderSize(0)
    l2.SetFillColor(0)
    l2.SetFillStyle(4000)
    l2.SetTextFont(62)
    for channel,g in graphs.iteritems():
        print channel
#        l2.AddEntry(g,'ZH, Z#rightarrowl^{+}l^{-}',"pl")
        l2.AddEntry(g,'ZH, Z#rightarrow#nu#nu',"pl")
#        l2.AddEntry(g,channel,"pl")
    #l2.AddEntry(g,"Stat.","l")
    if(drawSys) : l2.AddEntry(g2,"Syst.","l")
    l2.SetTextSize(0.035)
#    l2.SetNColumns(3)
    l2.Draw("same")
    for channel,g in graphs.iteritems():
        print channel
        g.Draw("P same")
        for label in labels:
            StackMaker.myText("%.2f #pm %.2f" %(latex[label][1],latex[label][2]),conversion_x(xmin)-0.02,conversion_y(latex[label][3])-0.005,0.5)
    if(drawSys) : g2.Draw("[] same")
    StackMaker.myText("CMS Preliminary",conversion_x(xmin)+0.1,0.95,0.6)
    StackMaker.myText("#sqrt{s} =  13TeV, L = 2.19 fb^{-1}",conversion_x(xmin)+0.1,0.92,0.6)

    ROOT.gPad.SetLeftMargin(0.2)
    ROOT.gPad.Update()
    c.Print("histo.pdf")




예제 #5
0
파일: stack_from_dc.py 프로젝트: tsusa/Xbb
def drawFromDC():
    config = BetterConfigParser()
    config.read(opts.config)
    print "opts.config:", opts.config
    dataname = ''
    if 'Zmm' in opts.bin: dataname = 'Zmm'
    elif 'Zee' in opts.bin: dataname = 'Zee'
    elif 'Wmunu' in opts.bin: dataname = 'Wmn'
    elif 'Wenu' in opts.bin: dataname = 'Wen'
    elif 'Znunu' in opts.bin: dataname = 'Znn'
    elif 'Wtn' in opts.bin: dataname = 'Wtn'

    print 'Variable printing'
    print opts.var
    if (opts.var == ''):
        var = 'BDT'
        if dataname == 'Zmm' or dataname == 'Zee': var = 'BDT_Zll'
        elif dataname == 'Wmn' or dataname == 'Wen': var = 'BDT_Wln'
        elif dataname == 'Znn':
            if 'HighPt' in opts.bin: var = 'BDT_ZnnHighPt'
            elif 'LowPt' in opts.bin: var = 'BDT_ZnnLowPt'
            elif 'LowCSV' in opts.bin: var = 'BDT_ZnnLowCSV'
            else: var = 'BDT_Znn'
        if dataname == '' or var == 'BDT':
            raise RuntimeError, "Did not recognise mode or var from %s" % opts.bin
    else:
        var = opts.var

    region = 'BDT'
    ws_var = config.get('plotDef:%s' % var, 'relPath')
    ws_var = ROOT.RooRealVar(ws_var, ws_var, -1., 1.)
    blind = eval(config.get('Plot:%s' % region, 'blind'))
    Stack = StackMaker(config, var, region, True)

    if 'LowPt' in opts.bin or 'ch1_Wenu' == opts.bin or 'ch2_Wmunu' == opts.bin:
        print 'Niklas %s' % opts.bin
        Stack.addFlag2 = 'Low p_{T}(V)'
    elif 'MedPt' in opts.bin or 'ch1_Wenu2' == opts.bin or 'ch2_Wmunu2' == opts.bin:
        Stack.addFlag2 = 'Intermediate p_{T}(V)'
    elif 'HighPt' in opts.bin or 'ch1_Wenu3' == opts.bin or 'ch2_Wmunu3' == opts.bin:
        Stack.addFlag2 = 'High p_{T}(V)'
    else:
        Stack.addFlag2 = ''

    preFit = False
    addName = 'PostFit_%s' % (opts.fit)
    if not opts.mlfit:
        addName = 'PreFit'
        preFit = True

    Stack.options['pdfName'] = '%s_%s_%s.pdf' % (var, opts.bin, addName)

    log = eval(config.get('Plot:%s' % region, 'log'))

    setup = config.get('Plot_general', 'setup').split(',')
    if dataname == 'Zmm' or dataname == 'Zee':
        try:
            setup.remove('W1b')
            setup.remove('W2b')
            setup.remove('Wlight')
            setup.remove('WH')
        except:
            print '@INFO: Wb / Wligh / WH not present in the datacard'
#    if not dataname == 'Znn' and 'QCD' in setup:
#        setup.remove('QCD')
    Stack.setup = setup

    Dict = eval(config.get('LimitGeneral', 'Dict'))
    lumi = eval(config.get('Plot_general', 'lumi'))

    options = copy(opts)
    options.dataname = "data_obs"
    options.mass = 0
    options.format = "%8.3f +/- %6.3f"
    options.channel = opts.bin
    options.excludeSyst = []
    options.norm = False
    options.stat = False
    options.bin = True  # fake that is a binary output, so that we parse shape lines
    options.out = "tmp.root"
    options.fileName = args[0]
    options.cexpr = False
    options.fixpars = False
    options.libs = []
    options.verbose = 0
    options.poisson = 0
    options.nuisancesToExclude = []
    options.noJMax = None
    theBinning = ROOT.RooFit.Binning(Stack.nBins, Stack.xMin, Stack.xMax)

    file = open(opts.dc, "r")
    os.chdir(os.path.dirname(opts.dc))
    DC = parseCard(file, options)
    if not DC.hasShapes: DC.hasShapes = True
    MB = ShapeBuilder(DC, options)
    theShapes = {}
    theSyst = {}
    nuiVar = {}
    if opts.mlfit:
        nuiVar = readBestFit(opts.mlfit)
    if not opts.bin in DC.bins:
        raise RuntimeError, "Cannot open find %s in bins %s of %s" % (
            opts.bin, DC.bins, opts.dc)
    for b in DC.bins:
        if options.channel != None and (options.channel != b): continue
        exps = {}
        expNui = {}
        shapeNui = {}
        reducedShapeNui = {}
        for (p, e) in DC.exp[b].items(
        ):  # so that we get only self.DC.processes contributing to this bin
            exps[p] = [e, []]
            expNui[p] = [e, []]
        for (lsyst, nofloat, pdf, pdfargs, errline) in DC.systs:
            if pdf in ('param', 'flatParam'): continue
            # begin skip systematics
            skipme = False
            for xs in options.excludeSyst:
                if re.search(xs, lsyst):
                    skipme = True
            if skipme: continue
            # end skip systematics
            counter = 0
            for p in DC.exp[b].keys(
            ):  # so that we get only self.DC.processes contributing to this bin
                if errline[b][p] == 0: continue
                #                if p == 'QCD' and not 'QCD' in setup: continue
                if pdf == 'gmN':
                    exps[p][1].append(1 / sqrt(pdfargs[0] + 1))
                elif pdf == 'gmM':
                    exps[p][1].append(errline[b][p])
                elif type(errline[b][p]) == list:
                    kmax = max(errline[b][p][0], errline[b][p][1],
                               1.0 / errline[b][p][0], 1.0 / errline[b][p][1])
                    exps[p][1].append(kmax - 1.)
                elif pdf == 'lnN':
                    lnNVar = max(errline[b][p], 1.0 / errline[b][p]) - 1.
                    if not nuiVar.has_key('%s_%s' % (opts.fit, lsyst)):
                        nui = 0.
                    else:
                        nui = nuiVar['%s_%s' % (opts.fit, lsyst)][0]
                        lnNVar = lnNVar * nuiVar['%s_%s' %
                                                 (opts.fit, lsyst)][1]
                    exps[p][1].append(lnNVar)
                    expNui[p][1].append(abs(1 - errline[b][p]) * nui)
                elif ("shape" in pdf):
                    #print 'shape %s %s: %s'%(pdf,p,lsyst)
                    s0 = MB.getShape(b, p)
                    sUp = MB.getShape(b, p, lsyst + "Up")
                    sDown = MB.getShape(b, p, lsyst + "Down")
                    if (s0.InheritsFrom("RooDataHist")):
                        s0 = ROOT.RooAbsData.createHistogram(
                            s0, p, ws_var, theBinning)
                        s0.SetName(p)
                        sUp = ROOT.RooAbsData.createHistogram(
                            sUp, p + lsyst + 'Up', ws_var, theBinning)
                        sUp.SetName(p + lsyst + 'Up')
                        sDown = ROOT.RooAbsData.createHistogram(
                            sDown, p + lsyst + 'Down', ws_var, theBinning)
                        sDown.SetName(p + lsyst + 'Down')
                    theShapes[p] = s0.Clone()
                    theShapes[p + lsyst + 'Up'] = sUp.Clone()
                    theShapes[p + lsyst + 'Down'] = sDown.Clone()
                    if not nuiVar.has_key('%s_%s' % (opts.fit, lsyst)):
                        nui = 0.
                        reducedNui = 1.
                    else:
                        nui = nuiVar['%s_%s' % (opts.fit, lsyst)][0]
                        reducedNui = nuiVar['%s_%s' % (opts.fit, lsyst)][1]
                    shapeNui[p + lsyst] = nui
                    reducedShapeNui[lsyst] = reducedNui
                    if not 'CMS_vhbb_stat' in lsyst:
                        if counter == 0:
                            theSyst[lsyst] = s0.Clone()
                            theSyst[lsyst + 'Up'] = sUp.Clone()
                            theSyst[lsyst + 'Down'] = sDown.Clone()
                        else:
                            theSyst[lsyst].Add(s0)
                            theSyst[lsyst + 'Up'].Add(sUp.Clone())
                            theSyst[lsyst + 'Down'].Add(sDown.Clone())
                        counter += 1

    procs = DC.exp[b].keys()
    procs.sort()
    print "Original procs:", procs
    #    if not 'QCD' in setup and 'QCD' in procs:
    #        procs.remove('QCD')
    if not 'W2b' in setup and 'WjHF' in procs:
        procs.remove('WjHF')
    if not 'Wlight' in setup and 'WjLF' in procs:
        procs.remove('WjLF')
    fmt = ("%%-%ds " % max([len(p) for p in procs])) + "  " + options.format
    #Compute norm uncertainty and best fit
    theNormUncert = {}
    theBestFit = {}
    for p in procs:
        relunc = sqrt(sum([x * x for x in exps[p][1]]))
        print fmt % (p, exps[p][0], exps[p][0] * relunc)
        theNormUncert[p] = relunc
        absBestFit = sum([x for x in expNui[p][1]])
        theBestFit[p] = 1. + absBestFit

    histos = []
    typs = []

    setup2 = copy(setup)

    shapesUp = [[] for _ in range(0, len(setup2))]
    shapesDown = [[] for _ in range(0, len(setup2))]

    sigCount = 0
    signalList = ['ZH', 'WH']
    #signalList = ['VVb']
    for p in procs:
        b = opts.bin
        for s in setup:
            if not Dict[s] == p: continue
            if s in signalList:
                if sigCount == 0:
                    Overlay = copy(theShapes[Dict[s]])
                else:
                    Overlay.Add(theShapes[Dict[s]])
                sigCount += 1
            else:
                histos.append(theShapes[Dict[s]])
                typs.append(s)
            for (lsyst, nofloat, pdf, pdfargs, errline) in DC.systs:
                if errline[b][p] == 0: continue
                if ("shape" in pdf) and not 'CMS_vhbb_stat' in lsyst:
                    print 'syst %s' % lsyst
                    shapesUp[setup2.index(s)].append(theShapes[Dict[s] +
                                                               lsyst + 'Up'])
                    shapesDown[setup2.index(s)].append(
                        theShapes[Dict[s] + lsyst + 'Down'])

    #-------------
    #Compute absolute uncertainty from shapes
    counter = 0
    for (lsyst, nofloat, pdf, pdfargs, errline) in DC.systs:
        sumErr = 0
        for p in procs:
            sumErr += errline[b][p]
        if ("shape"
                in pdf) and not 'CMS_vhbb_stat' in lsyst and not sumErr == 0:
            theSystUp = theSyst[lsyst + 'Up'].Clone()
            theSystUp.Add(theSyst[lsyst].Clone(), -1.)
            theSystUp.Multiply(theSystUp)
            theSystDown = theSyst[lsyst + 'Down'].Clone()
            theSystDown.Add(theSyst[lsyst].Clone(), -1.)
            theSystDown.Multiply(theSystDown)
            theSystUp.Scale(reducedShapeNui[lsyst])
            theSystDown.Scale(reducedShapeNui[lsyst])
            if counter == 0:
                theAbsSystUp = theSystUp.Clone()
                theAbsSystDown = theSystDown.Clone()
            else:
                theAbsSystUp.Add(theSystUp.Clone())
                theAbsSystDown.Add(theSystDown.Clone())
            counter += 1

    #-------------
    #Best fit for shapes
    if not preFit:
        histos, Overlay, typs = getBestFitShapes(procs, theShapes, shapeNui,
                                                 theBestFit, DC, setup, opts,
                                                 Dict)

    counter = 0
    errUp = []
    total = []
    errDown = []
    nBins = histos[0].GetNbinsX()
    print 'total bins %s' % nBins
    Error = ROOT.TGraphAsymmErrors(histos[0])
    theTotalMC = histos[0].Clone()
    for h in range(1, len(histos)):
        theTotalMC.Add(histos[h])

    total = [[]] * nBins
    errUp = [[]] * nBins
    errDown = [[]] * nBins
    for bin in range(1, nBins + 1):
        binError = theTotalMC.GetBinError(bin)
        if math.isnan(binError):
            binError = 0.
        total[bin - 1] = theTotalMC.GetBinContent(bin)
        #Stat uncertainty of the MC outline
        errUp[bin - 1] = [binError]
        errDown[bin - 1] = [binError]
        #Relative norm uncertainty of the individual MC
        for h in range(0, len(histos)):
            print "h:", h
            print "bin:", bin
            print "histos:", histos
            print "theNormUncert:", theNormUncert
            print "histos[h]:", histos[h]
            errUp[bin - 1].append(histos[h].GetBinContent(bin) *
                                  theNormUncert[histos[h].GetName()])
            errDown[bin - 1].append(histos[h].GetBinContent(bin) *
                                    theNormUncert[histos[h].GetName()])
    #Shape uncertainty of the MC
    for bin in range(1, nBins + 1):
        #print sqrt(theSystUp.GetBinContent(bin))
        errUp[bin - 1].append(sqrt(theAbsSystUp.GetBinContent(bin)))
        errDown[bin - 1].append(sqrt(theAbsSystDown.GetBinContent(bin)))

    #Add all in quadrature
    totErrUp = [sqrt(sum([x**2 for x in bin])) for bin in errUp]
    totErrDown = [sqrt(sum([x**2 for x in bin])) for bin in errDown]

    #Make TGraph with errors
    for bin in range(1, nBins + 1):
        if not total[bin - 1] == 0:
            point = histos[0].GetXaxis().GetBinCenter(bin)
            Error.SetPoint(bin - 1, point, 1)
            Error.SetPointEYlow(bin - 1, totErrDown[bin - 1] / total[bin - 1])
            print 'down %s' % (totErrDown[bin - 1] / total[bin - 1])
            Error.SetPointEYhigh(bin - 1, totErrUp[bin - 1] / total[bin - 1])
            print 'up   %s' % (totErrUp[bin - 1] / total[bin - 1])

    #-----------------------
    #Read data
    data0 = MB.getShape(opts.bin, 'data_obs')
    if (data0.InheritsFrom("RooDataHist")):
        data0 = ROOT.RooAbsData.createHistogram(data0, 'data_obs', ws_var,
                                                theBinning)
        data0.SetName('data_obs')
    datas = [data0]
    datatyps = [None]
    datanames = [dataname]

    print "blind:", blind
    print "'BDT' in var:", 'BDT' in var
    if blind and 'BDT' in var:
        print "I'm blinding..."
        for bin in range(datas[0].GetNbinsX() / 2, datas[0].GetNbinsX() + 1):
            datas[0].SetBinContent(bin, 0)

    histos.append(copy(Overlay))
    if 'ZH' in signalList and 'WH' in signalList:
        typs.append('VH')
        if 'ZH' in Stack.setup: Stack.setup.remove('ZH')
        if 'WH' in Stack.setup: Stack.setup.remove('WH')
        Stack.setup.insert(0, 'VH')
    elif 'ZH' in signalList:
        typs.append('ZH')
    elif 'WH' in signalList:
        typs.append('WH')
    elif 'VVb' in signalList:
        typs.append('VVb')
    print Stack.setup

    Stack.histos = histos
    Stack.typs = typs
    Stack.datas = datas
    Stack.datatyps = datatyps
    Stack.datanames = datanames
    Stack.overlay = [Overlay]
    Stack.AddErrors = Error
    if dataname == 'Wtn':
        lumi = 18300.
    Stack.lumi = lumi
    Stack.doPlot()

    print 'i am done!\n'
예제 #6
0
    l2 = ROOT.TLegend(0.68, 0.80, 0.80, 0.85)
    l2.SetLineWidth(2)
    l2.SetBorderSize(0)
    l2.SetFillColor(0)
    l2.SetFillStyle(4000)
    l2.SetTextFont(62)
    for channel, g in graphs.iteritems():
        print channel
        l2.AddEntry(g, 'ZH, Z#rightarrowe^{+}e^{-}', "pl")
#        l2.AddEntry(g,channel,"pl")
#l2.AddEntry(g,"Stat.","l")
    if (drawSys): l2.AddEntry(g2, "Syst.", "l")
    l2.SetTextSize(0.035)
    #    l2.SetNColumns(3)
    l2.Draw("same")
    for channel, g in graphs.iteritems():
        print channel
        g.Draw("P same")
        for label in labels:
            StackMaker.myText(
                "%.2f #pm %.2f" % (latex[label][1], latex[label][2]),
                conversion_x(xmin) - 0.02, conversion_y(latex[label][3]), 0.5)
    if (drawSys): g2.Draw("[] same")
    StackMaker.myText("CMS Preliminary", conversion_x(xmin) + 0.1, 0.95, 0.6)
    StackMaker.myText("#sqrt{s} =  13TeV, L = 2.2 fb^{-1}",
                      conversion_x(xmin) + 0.1, 0.92, 0.6)

    ROOT.gPad.SetLeftMargin(0.2)
    ROOT.gPad.Update()
    c.Print("histo.pdf")
예제 #7
0
def drawFromDC():

    config = BetterConfigParser()
    config.read(opts.config)

    region = opts.region

    print "\nopts.config:",opts.config
    print "opts:", opts
    print "var:", opts.var
    print "bin:", opts.bin
    
    
    dataname = 'Zll'
    
    if 'Zmm' in opts.bin: dataname = 'Zmm'
    elif 'Zee' in opts.bin: dataname = 'Zee'
    elif 'Wmunu' in opts.bin: dataname = 'Wmn'
    elif 'Wenu' in opts.bin: dataname = 'Wen'
    elif 'Znunu' in opts.bin: dataname = 'Znn'
    elif 'Wtn' in opts.bin: dataname = 'Wtn'
    
    if (opts.var == ''):
        var = 'BDT'
        if dataname == 'Zmm' or dataname == 'Zee': var = 'BDT_Zll' 
        elif dataname == 'Wmn' or dataname == 'Wen': var = 'BDT_Wln' 
        elif dataname == 'Znn': 
            if 'HighPt' in opts.bin: var = 'BDT_ZnnHighPt' 
            if 'LowPt' in opts.bin: var = 'BDT_ZnnLowPt' 
            if 'LowCSV' in opts.bin: var = 'BDT_ZnnLowCSV' 
        if dataname == '' or var == 'BDT': raise RuntimeError, 'Did not recognise mode or var from '+opts.bin
    else:
        var = opts.var

    if 'BDT' in var:
        region = 'BDT'    
    else:
        region = opts.bin

    ws_var = config.get('plotDef:%s'%var,'relPath')

    if region == 'BDT':
        ws_var = ROOT.RooRealVar(ws_var,ws_var,-1.,1.)
    else:
        ws_var = ROOT.RooRealVar(ws_var,ws_var, 0, 1.)

    blind = eval(config.get('Plot:%s'%region,'blind'))

    print 'config:', config
    print 'var: ', var
    print 'region: ', region

    
    
    Stack=StackMaker(config,var,region,True)
    
    if 'LowPt' in opts.bin or 'ch1_Wenu' == opts.bin or 'ch2_Wmunu' == opts.bin:
        Stack.addFlag2 = 'Low p_{T}(V)'
    elif 'MedPt' in opts.bin or 'ch1_Wenu2' == opts.bin or 'ch2_Wmunu2' == opts.bin:
        Stack.addFlag2 = 'Intermediate p_{T}(V)'
    elif 'HighPt' in opts.bin or 'ch1_Wenu3' == opts.bin or 'ch2_Wmunu3' == opts.bin:
        Stack.addFlag2 = 'High p_{T}(V)'
        

    # check for pre or post fit options    
    preFit = False
    addName = 'PostFit_%s' %(opts.fit)
    if not opts.mlfit:
        addName = 'PreFit'
        preFit = True

    print '\n-----> Fit Type(opts.fit)  : ', opts.fit
    print '               (opts.mlfit): ', opts.mlfit
    print '               preFit      : ', preFit

        
    Stack.options['pdfName'] = '%s_%s_%s.pdf'  %(var,opts.bin,addName)
    
    log = eval(config.get('Plot:%s'%region,'log'))
    
    setup = config.get('Plot_general','setup').split(',')
    if dataname == 'Zmm' or dataname == 'Zee': 
        try:
            setup.remove('W1b')
            setup.remove('W2b')
            setup.remove('Wlight')
            setup.remove('WH')
        except:
            print '@INFO: Wb / Wligh / WH not present in the datacard'
    if not dataname == 'Znn' and 'QCD' in setup: 
        setup.remove('QCD')
    Stack.setup = setup

    Dict = eval(config.get('LimitGeneral','Dict'))
    lumi = eval(config.get('Plot_general','lumi'))
    
    options = copy(opts)
    options.dataname = "data_obs"
    options.mass = 0
    options.format = "%8.3f +/- %6.3f"
    options.channel = opts.bin
    options.excludeSyst = []
    options.norm = False
    options.stat = False
    options.bin = True # fake that is a binary output, so that we parse shape lines
    options.out = "tmp.root"
    options.fileName = args[0]
    options.cexpr = False
    options.fixpars = False
    options.libs = []
    options.verbose = 0
    options.poisson = 0
    options.nuisancesToExclude = []
    options.noJMax = None
    theBinning = ROOT.RooFit.Binning(Stack.nBins,Stack.xMin,Stack.xMax)

    file = open(opts.dc, "r")

    os.chdir(os.path.dirname(opts.dc))
    
    print '\nDC Path:', os.path.dirname(opts.dc)

    DC = parseCard(file, options)

    if not DC.hasShapes: DC.hasShapes = True

    MB = ShapeBuilder(DC, options)

    theShapes = {}
    theSyst = {}
    nuiVar = {}

    print '\n\n ------> Mlfit File: ', opts.mlfit
    
    if opts.mlfit:
        nuiVar = readBestFit(opts.mlfit)

    if not opts.bin in DC.bins: raise RuntimeError, "Cannot open find %s in bins %s of %s" % (opts.bin,DC.bins,opts.dc)

    print '\n-----> Looping over bins in datacard...'
    for b in DC.bins:

        print '  bin: ', b 
        
        if options.channel != None and (options.channel != b): continue
        exps = {}
        expNui = {}
        shapeNui = {}
        reducedShapeNui = {}

        for (p,e) in DC.exp[b].items(): # so that we get only self.DC.processes contributing to this bin
            exps[p] = [ e, [] ]
            expNui[p] = [ e, [] ]
            
        print '\n-----> Datacard systematics: ', DC.systs    
            
        for (lsyst,nofloat,pdf,pdfargs,errline) in DC.systs:

            print '\n-----> Looping over systematics in datacard: ', (lsyst,nofloat,pdf,pdfargs,errline)  

            if pdf in ('param', 'flatParam'): continue
            
            # begin skip systematics
            skipme = False
            for xs in options.excludeSyst:
                if re.search(xs, lsyst): 
                    skipme = True
            if skipme:
                print '\n-----> skipping systematics...'
                continue
            # end skip systematics

            counter = 0
            print '\n\t-----> Looping over keys in datacard: ', DC.exp[b].keys()
            
            for p in DC.exp[b].keys(): # so that we get only self.DC.processes contributing to this bin

                print '\n\t-----> Looping over process in this bin: ', p
                
                if errline[b][p] == 0: continue

                if p == 'QCD' and not 'QCD' in setup: continue

                if pdf == 'gmN':
                    exps[p][1].append(1/sqrt(pdfargs[0]+1));
                elif pdf == 'gmM':
                    exps[p][1].append(errline[b][p]);
                elif type(errline[b][p]) == list: 
                    kmax = max(errline[b][p][0], errline[b][p][1], 1.0/errline[b][p][0], 1.0/errline[b][p][1]);
                    exps[p][1].append(kmax-1.);
                elif pdf == 'lnN':
                     lnNVar = max(errline[b][p], 1.0/errline[b][p])-1.
                     if not nuiVar.has_key('%s_%s'%(opts.fit,lsyst)):
                         nui = 0.
                     else:
                        nui= nuiVar['%s_%s'%(opts.fit,lsyst)][0]
                        lnNVar = lnNVar*nuiVar['%s_%s'%(opts.fit,lsyst)][1]
                     exps[p][1].append(lnNVar)
                     expNui[p][1].append(abs(1-errline[b][p])*nui);

                elif 'shape' in pdf:
                    
                    print '\n\t-----> Filling the Shapes for this process...'
                    
                    #print 'shape %s %s: %s'%(pdf,p,lsyst)
                    s0 = MB.getShape(b,p)
                    sUp   = MB.getShape(b,p,lsyst+"Up")
                    sDown = MB.getShape(b,p,lsyst+"Down")
                    if (s0.InheritsFrom("RooDataHist")):
                        s0 = ROOT.RooAbsData.createHistogram(s0,p,ws_var,theBinning)
                        s0.SetName(p)
                        sUp = ROOT.RooAbsData.createHistogram(sUp,p+lsyst+'Up',ws_var,theBinning)
                        sUp.SetName(p+lsyst+'Up')
                        sDown = ROOT.RooAbsData.createHistogram(sDown,p+lsyst+'Down',ws_var,theBinning)
                        sDown.SetName(p+lsyst+'Down')
                    theShapes[p] = s0.Clone()
                    theShapes[p+lsyst+'Up'] = sUp.Clone()
                    theShapes[p+lsyst+'Down'] = sDown.Clone()
                    if not nuiVar.has_key('%s_%s'%(opts.fit,lsyst)):
                        nui = 0.
                        reducedNui = 1.
                    else:
                        nui= nuiVar['%s_%s'%(opts.fit,lsyst)][0]
                        reducedNui= nuiVar['%s_%s'%(opts.fit,lsyst)][1]
                    shapeNui[p+lsyst] = nui
                    reducedShapeNui[lsyst] = reducedNui
                    if not 'CMS_vhbb_stat' in lsyst:
                        if counter == 0:
                            theSyst[lsyst] = s0.Clone() 
                            theSyst[lsyst+'Up'] = sUp.Clone() 
                            theSyst[lsyst+'Down'] = sDown.Clone() 
                        else:
                            theSyst[lsyst].Add(s0)
                            theSyst[lsyst+'Up'].Add(sUp.Clone())
                            theSyst[lsyst+'Down'].Add(sDown.Clone()) 
                        counter += 1

    procs = DC.exp[b].keys(); procs.sort()

    if not 'QCD' in setup and 'QCD' in procs:
        procs.remove('QCD')
    if not 'W2b' in setup and 'WjHF' in procs:
        procs.remove('WjHF')
    if not 'Wlight' in setup and 'WjLF' in procs:
        procs.remove('WjLF')

    fmt = ("%%-%ds " % max([len(p) for p in procs]))+"  "+options.format;


    #Compute norm uncertainty and best fit
    theNormUncert = {}
    theBestFit = {}
    print '\n-----> Computing norm uncertaint and best fit...'    
    for p in procs:
        relunc = sqrt(sum([x*x for x in exps[p][1]]))
        print fmt % (p, exps[p][0], exps[p][0]*relunc)
        theNormUncert[p] = relunc
        absBestFit = sum([x for x in expNui[p][1]])
        theBestFit[p] = 1.+absBestFit

    
    histos = []
    typs = []

    setup2=copy(setup)

    shapesUp = [[] for _ in range(0,len(setup2))]
    shapesDown = [[] for _ in range(0,len(setup2))]
    
    sigCount = 0
    signalList = ['ZH','WH']

    # for shape analysis?
    for p in procs:

        b = opts.bin

        print 'process: ', p
        print 'setup:',setup
        print 'Dict:', Dict
        print 'theShapes:', theShapes

        for s in setup:
            print '-----> Fillings the shapes for: ', s
            if not Dict[s] == p: continue
            if s in signalList:
                if sigCount ==0:
                    Overlay=copy(theShapes[Dict[s]])
                else:
                    Overlay.Add(theShapes[Dict[s]])
                sigCount += 1
            else:
                histos.append(theShapes[Dict[s]])
                typs.append(s)
            for (lsyst,nofloat,pdf,pdfargs,errline) in DC.systs:
                if errline[b][p] == 0: continue
                if ("shape" in pdf) and not 'CMS_vhbb_stat' in lsyst:
                    print 'syst %s'%lsyst
                    shapesUp[setup2.index(s)].append(theShapes[Dict[s]+lsyst+'Up'])
                    shapesDown[setup2.index(s)].append(theShapes[Dict[s]+lsyst+'Down'])
    
    #-------------
    #Compute absolute uncertainty from shapes
    counter = 0
    for (lsyst,nofloat,pdf,pdfargs,errline) in DC.systs:
        sumErr = 0
        
        for p in procs:
            sumErr += errline[b][p]
        
            print '---> PDF:',pdf, lsyst

        if ("shape" in pdf) and not 'CMS_vhbb_stat' in lsyst and not sumErr == 0:
            theSystUp = theSyst[lsyst+'Up'].Clone()
            theSystUp.Add(theSyst[lsyst].Clone(),-1.)
            theSystUp.Multiply(theSystUp)
            theSystDown = theSyst[lsyst+'Down'].Clone()
            theSystDown.Add(theSyst[lsyst].Clone(),-1.)
            theSystDown.Multiply(theSystDown)
            theSystUp.Scale(reducedShapeNui[lsyst])
            theSystDown.Scale(reducedShapeNui[lsyst])
            if counter == 0:
                theAbsSystUp = theSystUp.Clone()
                theAbsSystDown = theSystDown.Clone()
            else:
                theAbsSystUp.Add(theSystUp.Clone())
                theAbsSystDown.Add(theSystDown.Clone())
            counter +=1
    
    #-------------
    #Best fit for shapes
    if not preFit:
        
        # Set the preFit as an overlay
        print '\n Making prefit overlay...'
        print procs

        i = 0
        for hist in theShapes:
            if hist not in procs: continue
            print 'Process:', hist
            print 'Shape:', theShapes[hist]
            print 'i:', i
            if i == 0:
                prefit_overlay=copy(theShapes[hist])
                #prefit_overlay=theShapes[hist]
                print 'First Integral:', theShapes[hist].Integral()
                i+=1
            else:
                #prefit_overlay.Add(theShapes[hist], 1.0)
                prefit_overlay.Add(theShapes[hist])
                print 'Integral:', theShapes[hist].Integral()

        print  'prefit_overlay:', prefit_overlay
        print 'Integral:', prefit_overlay.Integral()

        print '\n-----> Getting best fit shapes(for postFit)...'
        histos, Overlay, typs = getBestFitShapes(procs,theShapes,shapeNui,theBestFit,DC,setup,opts,Dict)
        

    

    counter = 0
    errUp=[]
    total=[]
    errDown=[]
    nBins = histos[0].GetNbinsX()

    #print histos
    # temp hack to get histo names right
    #names = ['ggZH','DY2B', 'DY1B', 'DYlight', 'TT', 'VV']
    #for name,i in enumerate(histos):
    #    i.SetName(names[name])
    #Overlay.SetName('ZH')    
    # end hack    

    print '\n total bins %s'%nBins
    print '\n histos: ',histos           
    print '\n theNormUncert: ',theNormUncert
    print '\n Overlay: ', Overlay
    
    Error = ROOT.TGraphAsymmErrors(histos[0])
    theTotalMC = histos[0].Clone()

    for h in range(1,len(histos)):
        theTotalMC.Add(histos[h])
    
    total = [[]]*nBins
    errUp = [[]]*nBins
    errDown = [[]]*nBins

    print '\n\n\t\t -----> The Histos: ', histos

    for bin in range(1,nBins+1):
        binError = theTotalMC.GetBinError(bin)
        if math.isnan(binError):
            binError = 0.
        total[bin-1]=theTotalMC.GetBinContent(bin)

        #Stat uncertainty of the MC outline
        errUp[bin-1] = [binError]
        errDown[bin-1] = [binError]

        # Temp hack to fix theNormUncert naming
        temp_theNormUncert = {}
        for i,hist in enumerate(histos):
            for x in theNormUncert:
                #print '\nx: ', x
                if x in histos[i].GetName():
                    temp_theNormUncert[histos[i].GetName()] = theNormUncert[x]
        #print  temp_theNormUncert    

        #Relative norm uncertainty of the individual MC
        for h in range(0,len(histos)):
            #errUp[bin-1].append(histos[h].GetBinContent(bin)*theNormUncert[histos[h].GetName()])
            #errDown[bin-1].append(histos[h].GetBinContent(bin)*theNormUncert[histos[h].GetName()])
            errUp[bin-1].append(histos[h].GetBinContent(bin)*temp_theNormUncert[histos[h].GetName()])
            errDown[bin-1].append(histos[h].GetBinContent(bin)*temp_theNormUncert[histos[h].GetName()])


    #Shape uncertainty of the MC
    for bin in range(1,nBins+1):
        #print sqrt(theSystUp.GetBinContent(bin))
        errUp[bin-1].append(sqrt(theAbsSystUp.GetBinContent(bin)))
        errDown[bin-1].append(sqrt(theAbsSystDown.GetBinContent(bin)))
    

    #Add all in quadrature
    totErrUp=[sqrt(sum([x**2 for x in bin])) for bin in errUp]
    totErrDown=[sqrt(sum([x**2 for x in bin])) for bin in errDown]

    #Make TGraph with errors
    for bin in range(1,nBins+1):
        if not total[bin-1] == 0:
            point=histos[0].GetXaxis().GetBinCenter(bin)
            Error.SetPoint(bin-1,point,1)
            Error.SetPointEYlow(bin-1,totErrDown[bin-1]/total[bin-1])
            #print 'down %s'%(totErrDown[bin-1]/total[bin-1])
            Error.SetPointEYhigh(bin-1,totErrUp[bin-1]/total[bin-1])
            #print 'up   %s'%(totErrUp[bin-1]/total[bin-1])

    #-----------------------
    #Read data
    data0 = MB.getShape(opts.bin,'data_obs')
    if (data0.InheritsFrom("RooDataHist")):
        data0 = ROOT.RooAbsData.createHistogram(data0,'data_obs',ws_var,theBinning)
        data0.SetName('data_obs')
    datas=[data0]
    datatyps = [None]
    datanames=[dataname] 
    
    print '\nDATA HIST:', data0
    print 'Data name:', dataname

    if blind and 'BDT' in var:
        for bin in range(10,datas[0].GetNbinsX()+1):
            datas[0].SetBinContent(bin,0)

    #for bin in range(0,datas[0].GetNbinsX()+1):
    #    print 'Data in bin x:', datas[0].GetBinContent(bin)

    histos.append(copy(Overlay))
    if 'ZH' in signalList and 'WH' in signalList:
        typs.append('ZH')
        if 'ZH' in Stack.setup: Stack.setup.remove('ZH')
        if 'WH' in Stack.setup: Stack.setup.remove('WH')
        Stack.setup.insert(0,'ZH')
    elif 'ZH' in signalList:
        typs.append('ZH')
    elif 'WH' in signalList:
        typs.append('WH')
    elif 'VVb' in signalList:
        typs.append('VVb')

    print '\n-----> Stack.setup(double check)...'
    print 'Histos:', histos
    print 'typs:', typs
    
    Stack.histos = histos
    Stack.typs = typs
    Stack.datas = datas
    Stack.datatyps = datatyps
    Stack.datanames= datanames
    
    Stack.prefit_overlay = [prefit_overlay]

    if region == 'BDT':
        Stack.overlay = [Overlay]
    print '\n\n\t\t Overlay: ',Stack.overlay
    
    Stack.AddErrors=Error
    if dataname == 'Wtn': 
        lumi = 18300.
    Stack.lumi = lumi
    Stack.doPlot()

    print 'i am done!\n'
예제 #8
0
def log_s_over_b(fileList):
    #--------------
    # log s  over b
    #--------------

    histosL={}
    s_b_d_histos = {}
    for file in fileList:
        print file
        name = '%s' %file
        histosL[name] = []
        for th1 in get_th1(file):
            #th1.Sumw2()
            if 'VVLF' in th1.GetName():
                    th1.SetName('VV')
            if 'Zj1b' in th1.GetName():
                    th1.SetName('Zj2b')
            if 'Wj1b' in th1.GetName():
                    th1.SetName('Wj2b')
            histosL[name].append(th1)
        i = 0
        for hist in histosL[name]:
            if 'VH' in hist.GetName() and not 'VVHF' in hist.GetName():
            #if 'VVHF' in hist.GetName():
                hSignal = hist.Clone()
            elif 'data_obs' in hist.GetName():
                hData = hist.Clone()
            else:
                if i == 0:
                    hBkg = hist.Clone()
                else:
                    hBkg.Add(hist)
                i += 1
        s_b_d_histos[name] = {'b': hBkg, 's': hSignal, 'd': hData}


    bmin=-4
    bmax=0
    nbins=16

    log_s_over_b_b = ROOT.TH1F("log_s_over_b_b","log_s_over_b_b",nbins,bmin,bmax)
    log_s_over_b_b.SetFillColor(4)
    log_s_over_b_b.GetXaxis().SetTitle("log(S/B)")
    log_s_over_b_b.GetYaxis().SetTitle("Events")
    log_s_over_b_s = ROOT.TH1F("log_s_over_b_s","log_s_over_b_s",nbins,bmin,bmax)
    log_s_over_b_s.SetFillColor(2)
    log_s_over_b_d = ROOT.TH1F("log_s_over_b_d","log_s_over_b_d",nbins,bmin,bmax)
    log_s_over_b = ROOT.THStack("log_s_over_b","log_s_over_b")

    stack_log_s_over_b = ROOT.THStack("stack_log_s_over_b","stack_log_s_over_b")

    for key, s_b_d in s_b_d_histos.iteritems():
        for bin in range(0,s_b_d['b'].GetNbinsX()+1):
            s = s_b_d['s'].GetBinContent(bin)
            b = s_b_d['b'].GetBinContent(bin)
            d = s_b_d['d'].GetBinContent(bin)
            sErr = s_b_d['s'].GetBinError(bin)
            bErr = s_b_d['b'].GetBinError(bin)
            dErr = s_b_d['d'].GetBinError(bin)
            logsb = -3.9
            if b > 0. and s > 0.:
                logsb = log10(s/b)
            elif s > 0.:
                logsb = -0.
            #print logsb
            newBin = log_s_over_b_b.FindBin(logsb) 
            log_s_over_b_b.SetBinContent(newBin, b+log_s_over_b_b.GetBinContent(newBin))
            log_s_over_b_s.SetBinContent(newBin, s+log_s_over_b_s.GetBinContent(newBin))
            log_s_over_b_d.SetBinContent(newBin, d+log_s_over_b_d.GetBinContent(newBin))
            log_s_over_b_b.SetBinError(newBin, sqrt(bErr*bErr+log_s_over_b_b.GetBinError(newBin)*log_s_over_b_b.GetBinError(newBin)))
            log_s_over_b_s.SetBinError(newBin, sqrt(sErr*sErr+log_s_over_b_s.GetBinError(newBin)*log_s_over_b_s.GetBinError(newBin)))
            log_s_over_b_d.SetBinError(newBin, sqrt(dErr*dErr+log_s_over_b_d.GetBinError(newBin)*log_s_over_b_d.GetBinError(newBin)))

    stack = StackMaker(config,'logSB','plot1',False)
    stack.setup = ['VH','BKG']
    stack.typs = ['VH','BKG']
    stack.lumi = 18940.
    stack.histos = [log_s_over_b_s,log_s_over_b_b]
    stack.datas = [log_s_over_b_d]
    stack.datanames='data_obs'
    stack.overlay = log_s_over_b_s
    stack.doPlot()
예제 #9
0
def drawFromDC():

    config = BetterConfigParser()
    config.read(opts.config)

    region = opts.region

    print "\nopts.config:", opts.config
    print "opts:", opts
    print "var:", opts.var
    print "bin:", opts.bin

    dataname = 'Zll'

    if 'Zuu' in opts.bin: dataname = 'Zuu'
    elif 'Zee' in opts.bin: dataname = 'Zee'
    elif 'Wmn' in opts.bin: dataname = 'Wmn'
    elif 'Wen' in opts.bin: dataname = 'Wen'
    elif 'Znn' in opts.bin: dataname = 'Znn'
    elif 'Wtn' in opts.bin: dataname = 'Wtn'

    if (opts.var == ''):
        var = 'BDT'
        if dataname == 'Zmm' or dataname == 'Zee': var = 'BDT_Zll'
        elif dataname == 'Wmn' or dataname == 'Wen': var = 'BDT_Wln'
        elif dataname == 'Znn': var = 'BDT_Znn'
        #if 'HighPt' in opts.bin: var = 'BDT_ZnnHighPt'
        #if 'LowPt' in opts.bin: var = 'BDT_ZnnLowPt'
        #if 'LowCSV' in opts.bin: var = 'BDT_ZnnLowCSV'
        if dataname == '' or var == 'BDT':
            raise RuntimeError, 'Did not recognise mode or var from ' + opts.bin
    else:
        var = opts.var

    if opts.var == 'BDT':
        if 'LowPt' in opts.bin: var = 'gg_plus_ZH125_low_Zpt'
        elif 'MedPt' in opts.bin: var = 'gg_plus_ZH125_low_Zpt'
        elif 'HighPt' in opts.bin: var = 'gg_plus_ZH125_high_Zpt'
        elif 'VV' in opts.bin: var = 'VV_bdt'
        else: var = 'gg_plus_ZH125_high_Zpt'

    if opts.var == 'CRBDT':
        if 'LowPt' in opts.bin: var = 'gg_plus_ZH125_low_Zpt_CR'
        elif 'MedPt' in opts.bin: var = 'gg_plus_ZH125_low_Zpt_CR'
        elif 'HighPt' in opts.bin: var = 'gg_plus_ZH125_high_Zpt_CR'
        else: var = 'gg_plus_ZH125_high_Zpt_CR'

    #if 'BDT' in var:
    #    region = 'BDT'
    #else:

    region = opts.bin

    ws_var = config.get('plotDef:%s' % var, 'relPath')

    print 'ws_var:', ws_var

    if opts.var == 'BDT':
        ws_var = ROOT.RooRealVar(ws_var, ws_var, -1, 1.)
    else:
        ws_var = ROOT.RooRealVar(ws_var, ws_var, -1, 1.)

    print 'config:', config
    print 'var: ', var

    #if 'Wen' in region:
    #    region = 'WenHighPt'
    #if 'Wmn' in region:
    #    region = 'WmnHighPt'

    if 'Znn' in region:
        region = 'Znn_13TeV_Signal'

    print 'region: ', region

    blind = eval(config.get('Plot:%s' % region, 'blind'))

    Stack = StackMaker(config, var, region, True)

    if 'low' in opts.bin or 'ch1_Wenu' == opts.bin or 'ch2_Wmunu' == opts.bin:
        Stack.addFlag2 = 'Low p_{T}(V)'
    elif 'MedPt' in opts.bin or 'ch1_Wenu2' == opts.bin or 'ch2_Wmunu2' == opts.bin:
        Stack.addFlag2 = 'Intermediate p_{T}(V)'
    elif 'high' in opts.bin or 'ch1_Wenu3' == opts.bin or 'ch2_Wmunu3' == opts.bin:
        Stack.addFlag2 = 'High p_{T}(V)'

    # check for pre or post fit options
    preFit = False
    addName = 'PostFit_%s' % (opts.fit)
    if not opts.mlfit:
        addName = 'PreFit'
        preFit = True

    print '\n-----> Fit Type(opts.fit)  : ', opts.fit
    print '               (opts.mlfit): ', opts.mlfit
    print '               preFit      : ', preFit
    print '               opts.bin    : ', opts.bin

    Stack.options['pdfName'] = '%s_%s_%s.pdf' % (var, opts.bin, addName)

    log = eval(config.get('Plot:%s' % region, 'log'))

    if 'Zll' in opts.bin or 'Zee' in opts.bin or 'Zuu' in opts.bin or 'Zmm' in opts.bin:
        #setup = config.get('Plot_general','setup').split(',')
        setup = [
            'ZH', 'ggZH', 'DY2b', 'DY1b', 'DYlight', 'TT', 'VVHF', 'VVLF', 'ST'
        ]
        signalList = ['ZH']

        channel = 'ZllHbb'

        if 'Zee' in opts.bin: lep_channel = 'Zee'
        elif 'Zuu' in opts.bin: lep_channel = 'Zmm'

        region_dic = {
            'BDT': 'SIG',
            ' Zlf': 'Zlf',
            'Zhf': 'Zhf',
            'TT': 'TT',
            '13TeV': 'SIG'
        }
        region_name = [
            region_dic[key] for key in region_dic if (key in opts.bin)
        ]

        region_name = 'SIG'

        if 'Zlf' in opts.bin: region_name = 'Zlf'
        if 'Zhf' in opts.bin: region_name = 'Zhf'
        if 'ttbar' in opts.bin: region_name = 'TT'

        if 'low' in opts.bin or 'Low' in opts.bin: pt_region_name = 'low'
        if 'high' in opts.bin or 'High' in opts.bin: pt_region_name = 'high'
        if 'med' in opts.bin or 'Med' in opts.bin: pt_region_name = 'med'

        # ['ZllHbb', 'ch1', 'Zmm', 'SIG', 'low']
        if 'Zmm' in lep_channel and 'low' in pt_region_name: zll_index = 'ch1'
        elif 'Zmm' in lep_channel and 'high' in pt_region_name:
            zll_index = 'ch3'
        elif 'Zee' in lep_channel and 'high' in pt_region_name:
            zll_index = 'ch4'
        elif 'Zee' in lep_channel and 'low' in pt_region_name:
            zll_index = 'ch2'
        else:
            zll_index = 'ch2'

        # binning
        nBins = Stack.nBins
        xMin = Stack.xMin
        xMax = Stack.xMax

        # for stat hists
        if 'Zee' in lep_channel and 'low' in pt_region_name and 'minCMVA' not in opts.var:
            stat_name = opts.bin
        elif 'Zee' in lep_channel and 'high' in pt_region_name and 'minCMVA' not in opts.var:
            stat_name = opts.bin
        elif 'Zmm' in lep_channel and 'low' in pt_region_name and 'minCMVA' not in opts.var:
            stat_name = opts.bin
        elif 'Zmm' in lep_channel and 'high' in pt_region_name and 'minCMVA' not in opts.var:
            stat_name = opts.bin
        else:
            stat_name = opts.bin

        if 'minCMVA' in opts.var:
            if 'low' in pt_region_name:
                if 'Zmm' in lep_channel:
                    if 'Zlf' in region_name: stat_name = 'Zlf_low_Zuu'
                    if 'Zhf' in region_name: stat_name = 'Zhf_low_Zuu'
                    if 'TT' in region_name: stat_name = 'ttbar_low_Zuu'
                else:
                    if 'Zlf' in region_name: stat_name = 'Zlf_low_Zee'
                    if 'Zhf' in region_name: stat_name = 'Zhf_low_Zee'
                    if 'TT' in region_name: stat_name = 'ttbar_low_Zee'

            if 'high' in pt_region_name:
                if 'Zmm' in lep_channel:
                    if 'Zlf' in region_name: stat_name = 'Zlf_high_Zuu'
                    if 'Zhf' in region_name: stat_name = 'Zhf_high_Zuu'
                    if 'TT' in region_name: stat_name = 'ttbar_high_Zuu'
                else:
                    if 'Zlf' in region_name: stat_name = 'Zlf_high_Zee'
                    if 'Zhf' in region_name: stat_name = 'Zhf_high_Zee'
                    if 'TT' in region_name: stat_name = 'ttbar_high_Zee'

    if 'Wmn' in opts.bin or 'Wen' in opts.bin:
        setup = [
            'WH', 'ZH', 'Wj2b', 'Wj1b', 'Wj0b', 'DY2b', 'DY1b', 'DYlight',
            'TT', 'VVHF', 'VVLF', 'ST'
        ]
        signalList = ['ZH', 'WH']

        channel = 'WlnHbb'
        if 'Wen' in opts.bin:
            lep_channel = 'Wen'
            if 'tt' in region: region_name = 'ttWen'
            elif 'whf' in region:
                if 'High' in opts.bin:
                    region_name = 'whfWenHigh'
                else:
                    region_name = 'whfWenLow'
            elif 'wlf' in region:
                region_name = 'wlfWen'

            else:
                region_name = opts.bin

        if 'Wmn' in opts.bin:
            lep_channel = 'Wmn'
            if 'tt' in region: region_name = 'ttWmn'
            elif 'whf' in region:
                if 'High' in opts.bin:
                    region_name = 'whfWmnHigh'
                else:
                    region_name = 'whfWmnLow'
            elif 'wlf' in region:
                region_name = 'wlfWmn'

            else:
                region_name = opts.bin

        pt_region_name = 'none'

        nBins = 40
        xMin = -1
        xMax = 1

        stat_name = 'BDT_' + opts.bin + '_'

    if 'Znn' in opts.bin:
        setup = [
            'ZH', 'ggZH', 'WH', 'DY2b', 'DY1b', 'DYlight', 'Wj2b', 'Wj1b',
            'Wj0b', 'TT', 'VVHF', 'VVLF', 'ST'
        ]
        signalList = ['ZH']

        channel = 'Znn'
        lep_channel = 'Znn'

        if 'nAddJet1' in opts.bin:
            pt_region_name = 'nAddJet1'
        elif 'nAddJet0' in opts.bin:
            pt_region_name = 'nAddJet0'
        else:
            pt_region_name = 'High'

        region_name = 'SR'

        nBins = 25
        xMin = -1
        xMax = 1

        if 'QCD' in opts.dc:
            region_name = 'QCD'
            stat_name = 'Znn_13TeV_QCD'
        elif 'TT' in opts.dc:
            region_name = 'TT'
            stat_name = 'Znn_13TeV_TT'
        elif 'Zbb' in opts.dc:
            region_name = 'Zbb'
            stat_name = 'Znn_13TeV_Zbb'
        elif 'Zlight' in opts.dc:
            region_name = 'Zlight'
            stat_name = 'Znn_13TeV_Zlight'
        else:
            stat_name = opts.bin

    print '############'
    print 'Channel is', channel
    print 'lepton channel is', lep_channel
    print 'region_name is', region_name
    print 'pt region_name is', pt_region_name

    print '/n----> The Binning:'
    print 'nBins:', nBins
    print 'xMin:', xMin
    print 'xMax:', xMax

    if dataname == 'Zmm' or dataname == 'Zee':
        try:
            setup.remove('W1b')
            setup.remove('W2b')
            setup.remove('Wlight')
            setup.remove('WH')
        except:
            print '@INFO: Wb / Wligh / WH not present in the datacard'
    if not dataname == 'Znn' and 'QCD' in setup:
        setup.remove('QCD')

    Stack.setup = setup

    Dict = eval(config.get('LimitGeneral', 'Dict'))
    lumi = eval(config.get('Plot_general', 'lumi'))

    options = copy(opts)
    options.dataname = "data_obs"
    options.mass = 0
    options.format = "%8.3f +/- %6.3f"
    options.channel = opts.bin
    options.excludeSyst = []
    options.norm = False
    options.stat = False
    options.bin = True  # fake that is a binary output, so that we parse shape lines
    options.out = "tmp.root"
    options.fileName = args[0]
    options.filename = region
    options.cexpr = False
    options.fixpars = False
    options.libs = []
    options.verbose = 0
    options.poisson = 0
    options.nuisancesToExclude = []
    options.noJMax = None

    theBinning = ROOT.RooFit.Binning(nBins, xMin, xMax)

    # for prefit erros
    prefit_error_histos = []
    postfit_error_histos = []

    histos = []
    typs = []
    shapes = {}
    shapesUp = [[] for _ in range(0, len(setup))]
    shapesDown = [[] for _ in range(0, len(setup))]

    sigCount = 0
    Overlay = []
    prefit_overlay = []

    dirname = ''

    #Open the mlfit.root and retrieve the mc
    file = ROOT.TFile.Open(opts.mlfit)
    if file == None: raise RuntimeError, "Cannot open file %s" % opts.mlfit
    print '\n\n-----> Fit File: ', file

    for dir in ROOT.gDirectory.GetListOfKeys():

        dirinfo = dir.GetName().split('_')

        print 'dirinfo:', dirinfo

        if 'Znn' in dirinfo[0] and 'Znn' not in opts.bin: continue
        if 'ZllHbb' in dirinfo[0] and ('Zmm' not in lep_channel
                                       and 'Zee' not in lep_channel):
            continue
        if 'W' in dirinfo[0] and 'W' not in opts.bin: continue

        if 'W' in opts.bin:
            print 'channel, lepton channel, region_name:', channel, lep_channel, region_name
            #if not (dirinfo[0] == channel and dirinfo[1] == lep_channel and dirinfo[2] == region_name):
            if not (dirinfo[0] == region_name and dirinfo[1] == 'postfit'):
                continue
            else:
                print '!!! Match !!!'

        if 'Znn' in opts.bin:
            print 'channel, lepton channel, region_name, pt_region_name:', channel, lep_channel, region_name, pt_region_name
            #if not (dirinfo[0] == lep_channel and dirinfo[2] == pt_region_name and dirinfo[3] == 'postfit'):
            if not (dirinfo[0] == lep_channel and dirinfo[2] == region_name
                    and dirinfo[3] == 'postfit'):
                continue
            else:
                print '!!! Match !!!'

        if 'Zuu' in opts.bin or 'Zee' in opts.bin:
            print 'channel, zll index, lepton channel, region_name, pt_region_name:', channel, zll_index, lep_channel, region_name, pt_region_name
            if not (dirinfo[0] == lep_channel and dirinfo[1] == region_name and
                    dirinfo[2] == pt_region_name and dirinfo[3] == 'postfit'):
                continue
            else:
                print '!!! Match !!!'

        print 'Directory:', dir.GetName()

        dirname = dir.GetName()

        # Pull out the MC stat uncertainties first
        #hists_WenHighPt40.root
        #vhbb_WenHighPt40_13TeV.txt

        if 'W' in opts.bin:
            stat_filename = opts.dc.replace('.txt', '.root')
            stat_filename = stat_filename.replace('vhbb', 'hists')
            stat_filename = stat_filename.replace('_13TeV', '')

        else:
            stat_filename = opts.dc.replace('.txt', '.root')
            stat_filename = stat_filename.replace('DC_', '')

        print '\n Opening card for MC stat hists:', stat_filename
        print 'Dir name:', stat_name

        stat_file = ROOT.TFile.Open(stat_filename)
        if 'W' not in opts.bin: ROOT.gDirectory.cd(stat_name)
        stat_hists = {}

        for s in setup:
            for dir in ROOT.gDirectory.GetListOfKeys():
                #print 'dir:', dir.GetName()

                if 'W' in opts.bin:
                    wlvname = dir.GetName().replace(stat_name, '')
                    if wlvname == Dict[s]:
                        stat_hists[wlvname] = ROOT.gDirectory.Get(
                            dir.GetName()).Clone()

                if dir.GetName() == Dict[s]:
                    stat_hists[dir.GetName()] = ROOT.gDirectory.Get(
                        dir.GetName()).Clone()

        #stat_file.Close()
        print '\nStat_hists:', stat_hists

        file = ROOT.TFile.Open(opts.mlfit)
        #ROOT.gDirectory.cd('shapes_fit_s')
        #ROOT.gDirectory.cd(fit_dir)

        ROOT.gDirectory.cd(dirname)
        subdir_list = [x for x in ROOT.gDirectory.GetListOfKeys()]
        for s in setup:
            print '\ns:', s
            found = False

            #for subdir in ROOT.gDirectory.GetListOfKeys():
            for subdir in subdir_list:
                print 'subdir name is', subdir.GetName()
                print 'Dict Key is', Dict[s]
                if subdir.GetName() == Dict[s]:
                    found = True

                    # Set Histos postFit shapes and preFit errors
                    hist = rebinHist(
                        ROOT.gDirectory.Get(subdir.GetName()).Clone(), nBins,
                        xMin, xMax, dirname, subdir, prefit_error_histos,
                        postfit_error_histos, stat_hists)

                    histos.append(hist)
                    typs.append(s)

                    if s in signalList:
                        hist.SetTitle(s)
                        Overlay.append(hist)
                        #print 'the Histogram title is', hist.GetTitle()

                    break

            if not found:
                print '@ERROR: didn\'t find  the postfit histogram. Aborting'
                hist = ROOT.TH1F(Dict[s], Dict[s], nBins, xMin, xMax)
                histos.append(hist)
                typs.append(s)
                #sys.exit()
        #ROOT.gDirectory.cd('/shapes_prefit/'+dirname)
        #total = rebinHist(ROOT.gDirectory.Get('total').Clone(), Stack.nBins, Stack.xMin, Stack.xMax)
        #total.SetTitle('prefit')
        #prefit_overlay.append(total)
        break

    # Get the total pre/post fit error
    #print '\n Calculating final pre/post fit errors'
    #print prefit_error_histos
    for i, iErrorHist in enumerate(prefit_error_histos):
        #print i,iErrorHist
        if i == 0:
            temp_prefit_error = iErrorHist.Clone()
        else:
            temp_prefit_error.Add(iErrorHist)

    for i, iErrorHist in enumerate(postfit_error_histos):
        #print i,iErrorHist
        if i == 0:
            temp_postfit_error = iErrorHist.Clone()
        else:
            temp_postfit_error.Add(iErrorHist)

    final_prefit_error = ROOT.TGraphAsymmErrors(temp_prefit_error)
    final_postfit_error = ROOT.TGraphAsymmErrors(temp_postfit_error)

    total = [[]] * nBins
    errUp = [[]] * nBins
    errDown = [[]] * nBins

    total_post = [[]] * nBins
    errUp_post = [[]] * nBins
    errDown_post = [[]] * nBins

    # rebin the final errors
    for bin in range(1, nBins + 1):
        binError = temp_prefit_error.GetBinError(bin)
        total[bin - 1] = temp_prefit_error.GetBinContent(bin)
        errUp[bin - 1] = [binError]
        errDown[bin - 1] = [binError]

        binError_post = temp_postfit_error.GetBinError(bin)
        total_post[bin - 1] = temp_postfit_error.GetBinContent(bin)
        errUp_post[bin - 1] = [binError_post]
        errDown_post[bin - 1] = [binError_post]

    #Add all in quadrature
    totErrUp = [sqrt(sum([x**2 for x in bin])) for bin in errUp]
    totErrDown = [sqrt(sum([x**2 for x in bin])) for bin in errDown]

    totErrUp_post = [sqrt(sum([x**2 for x in bin])) for bin in errUp_post]
    totErrDown_post = [sqrt(sum([x**2 for x in bin])) for bin in errDown_post]

    for bin in range(1, nBins + 1):
        if not total[bin - 1] == 0:
            point = histos[0].GetXaxis().GetBinCenter(bin)
            final_prefit_error.SetPoint(bin - 1, point, 1)
            final_prefit_error.SetPointEYlow(
                bin - 1, totErrDown[bin - 1] / total[bin - 1])
            final_prefit_error.SetPointEYhigh(
                bin - 1, totErrUp[bin - 1] / total[bin - 1])

        if not total_post[bin - 1] == 0:
            point = histos[0].GetXaxis().GetBinCenter(bin)
            final_postfit_error.SetPoint(bin - 1, point, 1)
            final_postfit_error.SetPointEYlow(
                bin - 1, totErrDown_post[bin - 1] / total_post[bin - 1])
            final_postfit_error.SetPointEYhigh(
                bin - 1, totErrUp_post[bin - 1] / total_post[bin - 1])

    # =================================================
    ##### Read data
    print '\n#### Datafile is ', opts.dc
    dc_file = open(opts.dc, "r")
    os.chdir(os.path.dirname(opts.dc))
    DC = parseCard(dc_file, options)
    if not DC.hasShapes: DC.hasShapes = True
    MB = ShapeBuilder(DC, options)
    data0 = MB.getShape(opts.bin, 'data_obs')
    print data0
    if (data0.InheritsFrom("RooDataHist")):
        data0 = ROOT.RooAbsData.createHistogram(data0, 'data_obs', ws_var,
                                                theBinning)
        data0.SetName('data_obs')
    datas = [data0]
    datatyps = [None]
    datanames = [dataname]

    print '\nDATA HIST:', data0
    print 'Data name:', dataname

    # if opts.var == 'BDT':
    #     print '!!!! Blinding !!!!'

    #     if 'Zee' in dataname or 'Zuu' in dataname:
    #         for bin in range(4,datas[0].GetNbinsX()+1):
    #             datas[0].SetBinContent(bin,0)

    #     if 'Znn' in dataname:
    #         for bin in range(20,datas[0].GetNbinsX()+1):
    #             datas[0].SetBinContent(bin,0)

    #     if 'W' in dataname:
    #         for bin in range(4,datas[0].GetNbinsX()+1):
    #             #print datas[0].GetBinContent(bin,0)
    #             datas[0].SetBinContent(bin,0)

    #else:
    for bin in range(0, datas[0].GetNbinsX() + 1):
        print datas[0].GetBinContent(bin, 0)

    # =======================================================

    #if 'VV' in opts.bin:
    if isVV:
        signalList = ['VVHF', ' VVHF']

    print 'Signal List:', signalList

    #histos.append(copy(Overlay))

    if 'ZH' in signalList and 'WH' in signalList:
        #typs.append('WH')
        #if 'ZH' in Stack.setup: Stack.setup.remove('ZH')
        #if 'WH' in Stack.setup: Stack.setup.remove('WH')
        #Stack.setup.insert(0,'WH')
        #print 'Stack.setup:', Stack.setup
        typs.append('WH')
        typs.append('ZH')

    #elif 'ZH' in signalList:
    #Stack.setup.remove('WH')
    #typs.append('ggZH')
    #    typs.append('ZH')

    if 'VVb' in signalList or 'VVHF' in signalList:
        #typs.append('WH')
        typs.append('ZH')
        typs.append('VVHF')

        if 'VVHF' in Stack.setup:
            Stack.setup.remove('VVHF')
            Stack.setup.insert(0, 'VVHF')

        if 'ZH' in Stack.setup:
            Stack.setup.remove('ZH')
            Stack.setup.insert(-1, 'ZH')

        if 'WH' in Stack.setup:
            Stack.setup.remove('WH')
            Stack.setup.insert(-1, 'WH')

        if 'ggZH' in Stack.setup:
            Stack.setup.remove('ggZH')
            Stack.setup.insert(-1, 'ggZH')

    Stack.nBins = nBins
    Stack.xMin = xMin
    Stack.xMax = xMax

    print '\n-----> Stack.setup(double check)...', Stack
    print 'Post Histos:', histos
    print 'Datas:', datas
    print 'typs:', typs

    Stack.histos = histos
    Stack.typs = typs
    Stack.datas = datas
    Stack.datatyps = datatyps
    Stack.datanames = datanames
    Stack.filename = region

    #if opts.var is not 'BDT':
    #Stack.prefit_overlay = [prefit_overlay]

    #if '13TeV' in region:
    #Stack.overlay = [Overlay]
    print '\n\n\t\t Overlay: ', Stack.overlay

    # Add custom postFit errors
    #Stack.AddErrors = final_prefit_error
    Stack.AddErrors_Postfit = final_postfit_error

    if dataname == 'Wtn':
        lumi = 18300.
    Stack.lumi = lumi
    Stack.doPlot()

    print 'i am done!\n'
예제 #10
0
def drawFromDC():

    config = BetterConfigParser()
    config.read(opts.config)

    region = opts.region

    print "\nopts.config:",opts.config
    print "opts:", opts
    print "var:", opts.var
    print "bin:", opts.bin

    #Should Read this from the parser
    datanames = config.get('dc:%s'%opts.bin,'data').split(' ')
    print 'dataname is', datanames

    region = opts.bin

    var = opts.var

    ws_var = config.get('plotDef:%s'%var,'relPath')
    nbin = int(config.get('plotDef:%s'%var,'nBins'))
    xmin = float(config.get('plotDef:%s'%var,'min'))
    xmax = float(config.get('plotDef:%s'%var,'max'))

    blind = eval(opts.blind)
    postfit = eval(opts.postfit)

    print 'config:', config
    print 'var: ', var
    print 'region: ', region
    print 'blind: ', blind
    print 'postfit: ', postfit

    Group_dc =  eval(config.get('Plot_general','Group_dc'))

    Stack=StackMaker(config,var,region,True)

    # check for pre or post fit options
    preFit = False
    addName = 'PostFit_%s' %(opts.fit)
    if not opts.mlfit:
        addName = 'PreFit'
        preFit = True

    print '\n-----> Fit Type(opts.fit)  : ', opts.fit
    print '               (opts.mlfit): ', opts.mlfit
    print '               preFit      : ', preFit


    Stack.options['pdfName'] = '%s_%s_%s.pdf'  %(var,opts.bin,addName)
    #log = eval(config.get('Plot:%s'%region,'log'))

    if 'Zee' in opts.bin or 'Zuu' in opts.bin:
        #VH
        setup = ['ggZHbb', 'qqZHbb','Zbb','Zb','Z_udscg','TT','VV2b','VVlight','ST']
        #VV
        #setup = ['VV2b','ggZHbb','qqZHbb','Z_udscg','Zb','Zbb','TT','VVlight','ST']
        channel = 'ZllHbb'
        if 'Zee' in opts.bin: lep_channel = 'Zee'
        elif 'Zuu' in opts.bin: lep_channel = 'Zuu'
        #region_dic = {'BDT':'SIG','CRZlight':'Zlf','CRZb':'Zhf','CRttbar':'TT'}
        region_dic = {
                'BDT':'BDT',
                'CRZlight':'CRZlight',
                'CRZb':'CRZb',
                'CRttbar':'CRttbar',
                'ZeeMass_lowpt':'ZeeMass_lowpt',
                'ZeeMass_highpt':'ZeeMass_highpt',
                'ZuuMass_lowpt':'ZuuMass_lowpt',
                'ZuuMass_highpt':'ZuuMass_highpt',
                'ZeeMassVV_lowpt':'ZeeMassVV_lowpt',
                'ZeeMassVV_highpt':'ZeeMassVV_highpt',
                'ZuuMassVV_lowpt':'ZuuMassVV_lowpt',
                'ZuuMassVV_highpt':'ZuuMassVV_highpt',
                'ZuuMass_Vptbin0':'ZuuMass_Vptbin0',
                'ZuuMass_Vptbin1':'ZuuMass_Vptbin1',
                'ZuuMass_Vptbin2':'ZuuMass_Vptbin2',
                'ZeeMass_Vptbin0':'ZeeMass_Vptbin0',
                'ZeeMass_Vptbin1':'ZeeMass_Vptbin1',
                'ZeeMass_Vptbin2':'ZeeMass_Vptbin2',
                }
        print 'opts.bin is', opts.bin
        region_name =  [region_dic[key] for key in region_dic if (key in opts.bin)]
        region_name = region_name[0]
        print 'region_name is', region_name
        pt_region_dic = {'lowpt':'lowpt','highpt':'highpt','bin0':'bin0','bin1':'bin1','bin2':'bin2'}
        pt_region_name =  [pt_region_dic[key] for key in pt_region_dic if (key in opts.bin)]
        pt_region_name = pt_region_name[0]

    else:
        print '@ERROR: This is not a Zll region. Aborting'
        sys.exit()

    Stack.setup = setup

    Dict = eval(config.get('LimitGeneral','Dict'))
    lumi = eval(config.get('General','lumi'))


    Stack.nBins = nbin
    Stack.xMin = xmin
    Stack.xMax = xmax

    print '/n----> The Binning:'
    print 'nBins:', Stack.nBins
    print 'xMin:', Stack.xMin
    print 'xMax:', Stack.xMax

    theBinning = ROOT.RooFit.Binning(Stack.nBins,Stack.xMin,Stack.xMax)


    #################
    #We are now skiping a large part of the orginal code, as everything that remains to be done is to read the postfit plot from the mlfit.root
    #How should the scale sys (lnN be handled) ?
    #

    histos = []
    typs = []
    shapes = {}
    shapesUp = [[] for _ in range(0,len(setup))]
    shapesDown = [[] for _ in range(0,len(setup))]
    #signalList = ['ggZHbb', 'qqZHbb']
    #signalList = []

    sigCount = 0
    #Overlay ={}
    Overlay = []
    prefit_overlay = []

    postfit_from_wc = False
    if opts.mlfit.split('/')[-1] != 'mlfit.root':
        postfit_from_wc = True

    dirname = ''
    ####
    #Open the mlfit.root and retrieve the mc
    print 'opts.mlfit is', opts.mlfit
    file = ROOT.TFile.Open(opts.mlfit)
    #if file == None: raise RuntimeError, "Cannot open file %s" % theFile
    #print '\n\n-----> Fit File: ',file
    print '====================='
    print 'POSTFIT IS', postfit
    print '====================='

    if postfit:
        if not postfit_from_wc:
            if not ROOT.gDirectory.cd('shapes_fit_s'):
                print '@ERROR: didn\'t find the shapes_fit_s directory. Aborting'
                sys.exit()
        else:
            pass
    else:
        if not ROOT.gDirectory.cd('shapes_prefit'):
            print '@ERROR: didn\'t find the shapes_prefit directory. Aborting'
            sys.exit()
    folder_found = False
    for dir in ROOT.gDirectory.GetListOfKeys():
        dirinfo = dir.GetName().split('_')
        print 'dir name is', dir.GetName().split('_')
        ##if not (dirinfo[0] == channel and dirinfo[2] == lep_channel and dirinfo[3] == region_name and dirinfo[4] == pt_region_name):
        print 'dirinfo is', dirinfo
        print 'lep_channel is', lep_channel
        print 'region_name is', region_name
        print 'pt_region_name is', pt_region_name
        if not (dirinfo[0] == lep_channel and dirinfo[1] == region_name and dirinfo[2] ==  pt_region_name):
            #for VV
            if not (dirinfo[2] == region_name.split('_')[0] and dirinfo[3] ==  pt_region_name):
                if not (len(dirinfo) > 3 and dirinfo[3] == region_name.split('_')[0] and dirinfo[4] == 'Vpt'+pt_region_name):
                    continue

        if postfit_from_wc and 'prefit' in dirinfo:
            continue
        folder_found = True
        dirname = dir.GetName()
        #signal, use prefit
        for s in setup:
            if ('ZHbb' in s and postfit) and not postfit_from_wc:
                print 'ERROR'
                sys.exit()
                ROOT.gDirectory.cd('/shapes_prefit')
                ROOT.gDirectory.cd(dirname)
                found = False
                for subdir in ROOT.gDirectory.GetListOfKeys():
                    #print 'subdir name is', subdir.GetName()
                    if subdir.GetName() == Dict[s]:
                        found = True
                        hist = rebinHist(gDirectory.Get(subdir.GetName()).Clone(), nbin, xmin, xmax)
                        histos.append(hist)
                        typs.append(s)
                        #print 's is', s
                        #print 'signalList is', signalList
                        #if s in signalList:
                        #    hist.SetTitle(s)
                        #    Overlay.append(hist)
                        #    print 'the Histogram title is', hist.GetTitle()
            else:
                #SF_ZJets = [0.95188, 0.94404, 1.0463]
                #SF_TTbar = 1.0373
                #;Vpt high
                #SF_ZJets = [1.1235, 0.91368, 1.2435]
                #SF_TTbar = 1.0601
                #Start be getting the SF
                print 'Gonna apply SF'
                scale = 1
                #if 'low' in opts.dc:
                #    if 'TT' in s:       scale =  1.01
                #    if 'Z_udscg' in s:  scale = 0.96
                #    if 'Zb' in s:       scale = 0.99
                #    if 'Zbb' in s  :    scale = 1.04
                #elif 'high' in opts.dc:
                #    if 'TT' in s:       scale = 1.01
                #    if 'Z_udscg' in s:  scale = 1.03
                #    if 'Zb' in s:       scale = 0.96
                #    if 'Zbb' in s:      scale = 1.23
                #else:
                #    pass
                #    #ROOT.gDirectory.cd('/shapes_fit_s')
                #if not postfit_from_wc:
                #    ROOT.gDirectory.cd('/shapes_prefit')
                #    print 'ERROR2'
                #    sys.exit()
                #else:
                #    scale = 1
                ROOT.gDirectory.cd(dirname)
                found = False
                for subdir in ROOT.gDirectory.GetListOfKeys():
                    print 'subdir name is', subdir.GetName()
                    #print 'Dict is ', Dict
                    if subdir.GetName() == Dict[s] or (postfit_from_wc and subdir.GetName() == s):
                        found = True
                        hist = rebinHist(gDirectory.Get(subdir.GetName()).Clone(), nbin, xmin, xmax, scale)
                        histos.append(hist)
                        typs.append(s)
                        print 's is', s
                        #print 'signalList is', signalList
                        #if s in signalList:
                        #    hist.SetTitle(s)
                        #    Overlay.append(hist)
                        #    print 'the Histogram title is', hist.GetTitle()
              #take prefit distr. for signal


            if not found:
                print '@ERROR: didn\'t find  the postfit histogram. Aborting'
                sys.exit()
        if not postfit_from_wc:
            ROOT.gDirectory.cd('/shapes_prefit/'+dirname)
            print 'ERROR3'
            sys.exit()
        if not postfit_from_wc:
            total = rebinHist(gDirectory.Get('total').Clone(), nbin, xmin, xmax)
            total.SetTitle('prefit')
            prefit_overlay.append(total)
            break
    if not folder_found:
        print '@ERROR: Folder was not found.'
        print 'lep_channel', lep_channel
        print 'region_name', region_name
        print 'pt_region_name', pt_region_name
        sys.exit()
    #retrieve the data
    options = copy(opts)
    options.dataname = "data_obs"
    options.mass = 0
    options.format = "%8.3f +/- %6.3f"
    options.channel = opts.bin
    options.excludeSyst = []
    options.norm = False
    options.stat = False
    options.bin = True # fake that is a binary output, so that we parse shape lines
    options.out = "tmp.root"
    options.fileName = args[0]
    options.cexpr = False
    options.fixpars = False
    options.libs = []
    options.verbose = 0
    options.poisson = 0
    options.nuisancesToExclude = []
    options.noJMax = None
    #This needs to be done from the "dc" root file
    print 'file is ',opts.dc
    dc_file= open(opts.dc, "r")
    os.chdir(os.path.dirname(opts.dc))
    DC = parseCard(dc_file, options)

    if not DC.hasShapes: DC.hasShapes = True
    MB = ShapeBuilder(DC, options)
    data0 = MB.getShape(opts.bin,'data_obs')
    if (data0.InheritsFrom("RooDataHist")):
        data0 = ROOT.RooAbsData.createHistogram(data0,'data_obs',ws_var,theBinning)
        data0.SetName('data_obs')

    datas=[data0]
    if blind and 'BDT' in var:
        for bin in range(datas[0].GetNbinsX()-3,datas[0].GetNbinsX()+1):
            datas[0].SetBinContent(bin,0)
    if blind and 'Mass' in var:
        for bin in range(datas[0].GetNbinsX()-13,datas[0].GetNbinsX()-7):
            datas[0].SetBinContent(bin,0)
    datatyps = [None]

    #print '\nshapes!!!', shapes
    print '\nOVERLAY!!!', Overlay

    #Add all the histos and overlay to the stackmaker such that they can be ploted
    #print 'before Stack, histos are', histos
    #sys.exit()
    Stack.histos = histos
    Stack.typs = typs
    Stack.overlay = Overlay
    Stack.prefit_overlay = prefit_overlay
    Stack.datas = datas
    Stack.datatyps = datatyps
    Stack.datanames= datanames
    Stack.AddErrors= True

    Stack.lumi = lumi
    if 'BDT' in var:
        Stack.forceLog = True
    Stack.doPlot()

    print 'i am done!\n'
예제 #11
0
파일: tree_stack.py 프로젝트: GLP90/Xbb_Mjj
def doPlot():

    vars = (config.get(section, 'vars')).split(',')
    data = config.get(section, 'Datas')
    mc = eval(config.get('Plot_general', 'samples'))

    print '  with Vars:', vars
    print '  Using MC samples: ', mc
    print '  and Data samples: ', data

    # Is set in plots.  Can be the mass of ZH/ggZH.
    SignalRegion = False
    if config.has_option(section, 'Signal'):
        mc.append(config.get(section, 'Signal'))
        SignalRegion = True

    #print '\n\n\t\t=====SignalRegion:', SignalRegion

    datasamples = info.get_samples(data)
    mcsamples = info.get_samples(mc)

    GroupDict = eval(config.get('Plot_general', 'Group'))

    #GETALL AT ONCE
    options = []
    Stacks = []
    for i in range(len(vars)):
        Stacks.append(StackMaker(config, vars[i], region, SignalRegion))
        options.append(Stacks[i].options)

# Init the HistoMaker class
    Plotter = HistoMaker(mcsamples + datasamples, path, config, options,
                         GroupDict)

    #print '\nProducing Plot of %s\n'%vars[v]
    Lhistos = [[] for _ in range(0, len(vars))]
    Ltyps = [[] for _ in range(0, len(vars))]
    Ldatas = [[] for _ in range(0, len(vars))]
    Ldatatyps = [[] for _ in range(0, len(vars))]
    Ldatanames = [[] for _ in range(0, len(vars))]

    #Find out Lumi:
    lumicounter = 0.
    lumi = 0.
    for job in datasamples:
        lumi += float(job.lumi)
        lumicounter += 1.

    if lumicounter > 0:
        lumi = lumi / lumicounter

    print '\n\t\t Luminosity Auto Calculation: ', lumi

    # temp hack
    #lumi = 3000.
    Plotter.lumi = lumi
    mass = Stacks[0].mass

    # Define the counters for statistics counting
    mass_count = Counter()
    bdt_count = Counter()

    for job in mcsamples:

        # hDictList returns list of TH1Fs of the specified vars to plot
        if addBlindingCut:
            hDictList = Plotter.get_histos_from_tree(
                job,
                config.get('Cuts', region) + ' & ' + addBlindingCut)
        else:
            hDictList = Plotter.get_histos_from_tree(job)

        #print '\n\n\t\tJob name: ', job.name
        if job.name == 'ZH125':
            #or job.name == 'ggZH125':
            Overlaylist = deepcopy(
                [hDictList[v].values()[0] for v in range(0, len(vars))])

        for v in range(0, len(vars)):
            Lhistos[v].append(hDictList[v].values()[0])
            Ltyps[v].append(hDictList[v].keys()[0])
            hist = hDictList[v].values()[0]

        # end variable loop
    # end MC sample loop

    # Loop over data
    for job in datasamples:

        # temp hack to turn off data
        #break

        #hTemp, typ = Plotter.get_histos_from_tree(job)
        if addBlindingCut:
            dDictList = Plotter.get_histos_from_tree(
                job,
                config.get('Cuts', region) + ' & ' + addBlindingCut)
        else:
            dDictList = Plotter.get_histos_from_tree(job)

        for v in range(0, len(vars)):
            Ldatas[v].append(dDictList[v].values()[0])
            Ldatatyps[v].append(dDictList[v].keys()[0])
            Ldatanames[v].append(job.name)

# produce the final plots and save
    for v in range(0, len(vars)):

        histos = Lhistos[v]
        typs = Ltyps[v]
        Stacks[v].histos = Lhistos[v]
        Stacks[v].typs = Ltyps[v]
        Stacks[v].datas = Ldatas[v]
        Stacks[v].datatyps = Ldatatyps[v]
        Stacks[v].datanames = Ldatanames[v]
        if SignalRegion:
            Stacks[v].overlay = Overlaylist[v]
        Stacks[v].lumi = lumi

        Stacks[v].doPlot()

        Stacks[v].overlay = []
        Stacks[v].histos = Lhistos[v]
        Stacks[v].typs = Ltyps[v]
        Stacks[v].datas = Ldatas[v]
        Stacks[v].datatyps = Ldatatyps[v]
        Stacks[v].datanames = Ldatanames[v]
        Stacks[v].normalize = True
        Stacks[v].options['pdfName'] = Stacks[v].options['pdfName'].replace(
            '.pdf', '_norm.pdf')
        #Stacks[v].doPlot()
        print 'i am done!\n'
예제 #12
0
def drawFromDC():

    config = BetterConfigParser()
    config.read(opts.config)

    region = opts.region

    print "\nopts.config:",opts.config
    print "opts:", opts
    print "var:", opts.var
    print "bin:", opts.bin


    #dataname = 'Zll'
    #dataname = 'SingleElectron_Run2016B_PromptReco'
    dataname = ['SingleElectron_Run2016B_PromptReco','SingleElectron_Run2016C_PromptReco','SingleElectron_Run2016D_PromptReco','SingleElectron_Run2016F_PromptReco','SingleElectron_Run2016G_PromptReco']

    #if 'Zuu' in opts.bin: dataname = 'Zuu'
    #elif 'Zee' in opts.bin: dataname = 'Zee'
    #elif 'Wmunu' in opts.bin: dataname = 'Wmn'
    #elif 'Wenu' in opts.bin: dataname = 'Wen'
    #elif 'Znunu' in opts.bin: dataname = 'Znn'
    #elif 'Wtn' in opts.bin: dataname = 'Wtn'

    #if (opts.var == ''):
    #    var = 'BDT'
    #    if dataname == 'Zmm' or dataname == 'Zee': var = 'BDT_Zll'
    #    elif dataname == 'Wmn' or dataname == 'Wen': var = 'BDT_Wln'
    #    elif dataname == 'Znn':
    #        if 'HighPt' in opts.bin: var = 'BDT_ZnnHighPt'
    #        if 'LowPt' in opts.bin: var = 'BDT_ZnnLowPt'
    #        if 'LowCSV' in opts.bin: var = 'BDT_ZnnLowCSV'
    #    if dataname == '' or var == 'BDT': raise RuntimeError, 'Did not recognise mode or var from '+opts.bin
    #else:
    #    var = opts.var


    if opts.var == 'BDT':
        if 'LowPt' in opts.bin: var = 'gg_plus_ZH125_low_Zpt'
        if 'MedPt' in opts.bin: var = 'gg_plus_ZH125_med_Zpt'
        if 'HighPt' in opts.bin: var = 'gg_plus_ZH125_high_Zpt'
        if 'VV' in opts.bin: var = 'VV_bdt'


    #if 'BDT' in var:
    #    region = 'BDT'
    #else:

    region = opts.bin

    var = opts.var

    ws_var = config.get('plotDef:%s'%var,'relPath')

    if 'gg_plus' in var:
        ws_var = ROOT.RooRealVar(ws_var,ws_var,-1.,1.)
    else:
        ws_var = ROOT.RooRealVar(ws_var,ws_var, 0, 1)

    #blind = eval(config.get('Plot:%s'%region,'blind'))
    #blind = True
    #blind = False
    blind = eval(opts.blind)

    print 'config:', config
    print 'var: ', var
    print 'region: ', region



    Stack=StackMaker(config,var,region,True)

    if 'LowPt' in opts.bin or 'ch1_Wenu' == opts.bin or 'ch2_Wmunu' == opts.bin:
        Stack.addFlag2 = 'Low p_{T}(V)'
    elif 'MedPt' in opts.bin or 'ch1_Wenu2' == opts.bin or 'ch2_Wmunu2' == opts.bin:
        Stack.addFlag2 = 'Intermediate p_{T}(V)'
    elif 'HighPt' in opts.bin or 'ch1_Wenu3' == opts.bin or 'ch2_Wmunu3' == opts.bin:
        Stack.addFlag2 = 'High p_{T}(V)'


    # check for pre or post fit options
    preFit = False
    addName = 'PostFit_%s' %(opts.fit)
    if not opts.mlfit:
        addName = 'PreFit'
        preFit = True

    print '\n-----> Fit Type(opts.fit)  : ', opts.fit
    print '               (opts.mlfit): ', opts.mlfit
    print '               preFit      : ', preFit


    Stack.options['pdfName'] = '%s_%s_%s.pdf'  %(var,opts.bin,addName)

    log = eval(config.get('Plot:%s'%region,'log'))

    setup = ['Z_udscg','Zb','Zbb','TT','VVlight','ST','VV2b','qqZHbb','ggZHbb']

    if dataname == 'Zmm' or dataname == 'Zee': 
        try:
            setup.remove('W1b')
            setup.remove('W2b')
            setup.remove('Wlight')
            setup.remove('WH')
        except: print '@INFO: Wb / Wligh / WH not present in the datacard'
    if not dataname == 'Znn' and 'QCD' in setup:
        setup.remove('QCD')
    Stack.setup = setup

    Dict = eval(config.get('LimitGeneral','Dict'))
    #Dict = eval(config.get('Plot_general','Group'))
    lumi = eval(config.get('Plot_general','lumi'))
    
    options = copy(opts)
    options.dataname = "data_obs"
    options.mass = 0
    options.format = "%8.3f +/- %6.3f"
    options.channel = opts.bin
    options.excludeSyst = []
    options.norm = False
    options.stat = False
    options.bin = True # fake that is a binary output, so that we parse shape lines
    options.out = "tmp.root"
    options.fileName = args[0]
    options.cexpr = False
    options.fixpars = False
    options.libs = []
    options.verbose = 0
    options.poisson = 0
    options.nuisancesToExclude = []
    options.noJMax = None
    theBinning = ROOT.RooFit.Binning(Stack.nBins,Stack.xMin,Stack.xMax)

    file = open(opts.dc, "r")

    os.chdir(os.path.dirname(opts.dc))

    print '\nDC Path:', os.path.dirname(opts.dc)

    DC = parseCard(file, options)

    if not DC.hasShapes: DC.hasShapes = True

    MB = ShapeBuilder(DC, options)

    theShapes = {}
    theSyst = {}
    nuiVar = {}

    print '\n\n ------> Mlfit File: ', opts.mlfit

    if opts.mlfit:
        nuiVar = readBestFit(opts.mlfit)

    if not opts.bin in DC.bins: raise RuntimeError, "Cannot open find %s in bins %s of %s" % (opts.bin,DC.bins,opts.dc)

    print '\n-----> Looping over bins in datacard...'
    for b in DC.bins:

        print '  bin: ', b

        if options.channel != None and (options.channel != b): continue
        exps = {}
        expNui = {}
        shapeNui = {}
        reducedShapeNui = {}

        for (p,e) in DC.exp[b].items(): # so that we get only self.DC.processes contributing to this bin
            exps[p] = [ e, [] ]
            expNui[p] = [ e, [] ]

        print '\n-----> Datacard systematics: ', DC.systs

        for (lsyst,nofloat,pdf,pdfargs,errline) in DC.systs:

            print '\n-----> Looping over systematics in datacard: ', (lsyst,nofloat,pdf,pdfargs,errline)

            if pdf in ('param', 'flatParam'): continue

            # begin skip systematics
            skipme = False
            for xs in options.excludeSyst:
                if re.search(xs, lsyst): 
                    skipme = True
            if skipme:
                print '\n-----> skipping systematics...'
                continue
            # end skip systematics

            counter = 0
            print '\n\t-----> Looping over keys in datacard: ', DC.exp[b].keys()

            for p in DC.exp[b].keys(): # so that we get only self.DC.processes contributing to this bin

                print '\n\t-----> Looping over process in this bin: ', p

                if errline[b][p] == 0: continue

                if p == 'QCD' and not 'QCD' in setup: continue

                if pdf == 'gmN':
                    exps[p][1].append(1/sqrt(pdfargs[0]+1));
                elif pdf == 'gmM':
                    exps[p][1].append(errline[b][p]);
                elif type(errline[b][p]) == list: 
                    kmax = max(errline[b][p][0], errline[b][p][1], 1.0/errline[b][p][0], 1.0/errline[b][p][1]);
                    exps[p][1].append(kmax-1.);
                elif pdf == 'lnN':
                     lnNVar = max(errline[b][p], 1.0/errline[b][p])-1.
                     if not nuiVar.has_key('%s_%s'%(opts.fit,lsyst)):
                         nui = 0.
                     else:
                        nui= nuiVar['%s_%s'%(opts.fit,lsyst)][0]
                        lnNVar = lnNVar*nuiVar['%s_%s'%(opts.fit,lsyst)][1]
                     exps[p][1].append(lnNVar)
                     expNui[p][1].append(abs(1-errline[b][p])*nui);

                elif 'shape' in pdf:

                    print '\n\t-----> Filling the Shapes for this process...'

                    #print 'shape %s %s: %s'%(pdf,p,lsyst)
                    s0 = MB.getShape(b,p)
                    sUp   = MB.getShape(b,p,lsyst+"Up")
                    sDown = MB.getShape(b,p,lsyst+"Down")
                    if (s0.InheritsFrom("RooDataHist")):
                        s0 = ROOT.RooAbsData.createHistogram(s0,p,ws_var,theBinning)
                        s0.SetName(p)
                        sUp = ROOT.RooAbsData.createHistogram(sUp,p+lsyst+'Up',ws_var,theBinning)
                        sUp.SetName(p+lsyst+'Up')
                        sDown = ROOT.RooAbsData.createHistogram(sDown,p+lsyst+'Down',ws_var,theBinning)
                        sDown.SetName(p+lsyst+'Down')
                    theShapes[p] = s0.Clone()
                    theShapes[p+lsyst+'Up'] = sUp.Clone()
                    theShapes[p+lsyst+'Down'] = sDown.Clone()
                    if not nuiVar.has_key('%s_%s'%(opts.fit,lsyst)):
                        nui = 0.
                        reducedNui = 1.
                    else:
                        nui= nuiVar['%s_%s'%(opts.fit,lsyst)][0]
                        reducedNui= nuiVar['%s_%s'%(opts.fit,lsyst)][1]
                    shapeNui[p+lsyst] = nui
                    reducedShapeNui[lsyst] = reducedNui
                    if not 'CMS_vhbb_stat' in lsyst:
                        if counter == 0:
                            theSyst[lsyst] = s0.Clone() 
                            theSyst[lsyst+'Up'] = sUp.Clone() 
                            theSyst[lsyst+'Down'] = sDown.Clone() 
                        else:
                            theSyst[lsyst].Add(s0)
                            theSyst[lsyst+'Up'].Add(sUp.Clone())
                            theSyst[lsyst+'Down'].Add(sDown.Clone()) 
                        counter += 1

    procs = DC.exp[b].keys(); procs.sort()

    if not 'QCD' in setup and 'QCD' in procs:
        procs.remove('QCD')
    if not 'W2b' in setup and 'WjHF' in procs:
        procs.remove('WjHF')
    if not 'Wlight' in setup and 'WjLF' in procs:
        procs.remove('WjLF')

    fmt = ("%%-%ds " % max([len(p) for p in procs]))+"  "+options.format;


    #Compute norm uncertainty and best fit
    theNormUncert = {}
    theBestFit = {}
    print '\n-----> Computing norm uncertaint and best fit...'
    for p in procs:
        relunc = sqrt(sum([x*x for x in exps[p][1]]))
        print fmt % (p, exps[p][0], exps[p][0]*relunc)
        theNormUncert[p] = relunc
        absBestFit = sum([x for x in expNui[p][1]])
        theBestFit[p] = 1.+absBestFit

    
    histos = []
    typs = []

    setup2=copy(setup)

    shapesUp = [[] for _ in range(0,len(setup2))]
    shapesDown = [[] for _ in range(0,len(setup2))]
    
    sigCount = 0
    #signalList = ['Zbb','WH']
    #signalList = ['Zbb']
    signalList = ['ZH']
    #signalList = ['ggZHbb','qqZHbb']
    Overlay ={}

    # for shape analysis?
    for p in procs:

        b = opts.bin

        print 'process: ', p
        print 'setup:',setup
        print 'Dict:', Dict
        #print 'theShapes:', theShapes


        for s in setup:
            print '-----> Fillings the shapes for: ', s
            #print Dict[s], p
            if Dict[s] != p:
                print 'not equal', p
                print 'not equal', Dict[s]
                continue
            if s in signalList:
                if sigCount ==0:
                    Overlay=copy(theShapes[Dict[s]])
                else:
                    Overlay.Add(theShapes[Dict[s]])
                sigCount += 1
            else:
                histos.append(theShapes[Dict[s]])
                typs.append(s)
            for (lsyst,nofloat,pdf,pdfargs,errline) in DC.systs:
                if errline[b][p] == 0: continue
                if ("shape" in pdf) and not 'CMS_vhbb_stat' in lsyst:
                    print 'syst %s'%lsyst
                    shapesUp[setup2.index(s)].append(theShapes[Dict[s]+lsyst+'Up'])
                    shapesDown[setup2.index(s)].append(theShapes[Dict[s]+lsyst+'Down'])

    #-------------
    #Compute absolute uncertainty from shapes
    counter = 0
    for (lsyst,nofloat,pdf,pdfargs,errline) in DC.systs:
        sumErr = 0

        for p in procs:
            sumErr += errline[b][p]

            print '---> PDF:',pdf, lsyst

        if ("shape" in pdf) and not 'CMS_vhbb_stat' in lsyst and not sumErr == 0:
            theSystUp = theSyst[lsyst+'Up'].Clone()
            theSystUp.Add(theSyst[lsyst].Clone(),-1.)
            theSystUp.Multiply(theSystUp)
            theSystDown = theSyst[lsyst+'Down'].Clone()
            theSystDown.Add(theSyst[lsyst].Clone(),-1.)
            theSystDown.Multiply(theSystDown)
            theSystUp.Scale(reducedShapeNui[lsyst])
            theSystDown.Scale(reducedShapeNui[lsyst])
            if counter == 0:
                theAbsSystUp = theSystUp.Clone()
                theAbsSystDown = theSystDown.Clone()
            else:
                theAbsSystUp.Add(theSystUp.Clone())
                theAbsSystDown.Add(theSystDown.Clone())
            counter +=1
    
    #-------------
    #Best fit for shapes
    if not preFit:

        # Set the preFit as an overlay
        print '\n Making prefit overlay...'
        print procs

        i = 0
        for hist in theShapes:
            if hist not in procs: continue
            print 'Process:', hist
            print 'Shape:', theShapes[hist]
            print 'i:', i
            if i == 0:
                prefit_overlay=copy(theShapes[hist])
                #prefit_overlay=theShapes[hist]
                print 'First Integral:', theShapes[hist].Integral()
                i+=1
            else:
                #prefit_overlay.Add(theShapes[hist], 1.0)
                prefit_overlay.Add(theShapes[hist])
                print 'Integral:', theShapes[hist].Integral()

        print  'prefit_overlay:', prefit_overlay
        print 'Integral:', prefit_overlay.Integral()

        print '\n-----> Getting best fit shapes(for postFit)...'
        histos, Overlay, typs = getBestFitShapes(procs,theShapes,shapeNui,theBestFit,DC,setup,opts,Dict)


    

    counter = 0
    errUp=[]
    total=[]
    errDown=[]
    nBins = histos[0].GetNbinsX()

    #print histos
    # temp hack to get histo names right
    #names = ['ggZH','DY2B', 'DY1B', 'DYlight', 'TT', 'VV']
    #for name,i in enumerate(histos):
    #    i.SetName(names[name])
    #Overlay.SetName('ZH')
    # end hack

    print '\n total bins %s'%nBins
    print '\n histos: ',histos
    print '\n theNormUncert: ',theNormUncert
    print '\n Overlay: ', Overlay

    Error = ROOT.TGraphAsymmErrors(histos[0])
    theTotalMC = histos[0].Clone()

    for h in range(1,len(histos)):
        theTotalMC.Add(histos[h])
    
    total = [[]]*nBins
    errUp = [[]]*nBins
    errDown = [[]]*nBins

    print '\n\n\t\t -----> The Histos: ', histos

    for bin in range(1,nBins+1):
        binError = theTotalMC.GetBinError(bin)
        if math.isnan(binError):
            binError = 0.
        total[bin-1]=theTotalMC.GetBinContent(bin)

        #Stat uncertainty of the MC outline
        errUp[bin-1] = [binError]
        errDown[bin-1] = [binError]

        # Temp hack to fix theNormUncert naming
        temp_theNormUncert = {}
        for i,hist in enumerate(histos):
            for x in theNormUncert:
                #print '\nx: ', x
                if x in histos[i].GetName():
                    temp_theNormUncert[histos[i].GetName()] = theNormUncert[x]
        #print  temp_theNormUncert

        #Relative norm uncertainty of the individual MC
        for h in range(0,len(histos)):
            #errUp[bin-1].append(histos[h].GetBinContent(bin)*theNormUncert[histos[h].GetName()])
            #errDown[bin-1].append(histos[h].GetBinContent(bin)*theNormUncert[histos[h].GetName()])
            errUp[bin-1].append(histos[h].GetBinContent(bin)*temp_theNormUncert[histos[h].GetName()])
            errDown[bin-1].append(histos[h].GetBinContent(bin)*temp_theNormUncert[histos[h].GetName()])


    #Shape uncertainty of the MC
    for bin in range(1,nBins+1):
        #print sqrt(theSystUp.GetBinContent(bin))
        errUp[bin-1].append(sqrt(theAbsSystUp.GetBinContent(bin)))
        errDown[bin-1].append(sqrt(theAbsSystDown.GetBinContent(bin)))
    

    #Add all in quadrature
    totErrUp=[sqrt(sum([x**2 for x in bin])) for bin in errUp]
    totErrDown=[sqrt(sum([x**2 for x in bin])) for bin in errDown]

    #Make TGraph with errors
    for bin in range(1,nBins+1):
        if not total[bin-1] == 0:
            point=histos[0].GetXaxis().GetBinCenter(bin)
            Error.SetPoint(bin-1,point,1)
            Error.SetPointEYlow(bin-1,totErrDown[bin-1]/total[bin-1])
            #print 'down %s'%(totErrDown[bin-1]/total[bin-1])
            Error.SetPointEYhigh(bin-1,totErrUp[bin-1]/total[bin-1])
            #print 'up   %s'%(totErrUp[bin-1]/total[bin-1])

    #-----------------------
    #Read data
    data0 = MB.getShape(opts.bin,'data_obs')
    if (data0.InheritsFrom("RooDataHist")):
        data0 = ROOT.RooAbsData.createHistogram(data0,'data_obs',ws_var,theBinning)
        data0.SetName('data_obs')
    datas=[data0]
    datatyps = [None]
    #datanames=[dataname]
    datanames= dataname

    print '\nDATA HIST:', data0
    print 'Data name:', dataname

    if blind:
        for bin in range(12,datas[0].GetNbinsX()+1):
            datas[0].SetBinContent(bin,0)

    #for bin in range(0,datas[0].GetNbinsX()+1):
    #    print 'Data in bin x:', datas[0].GetBinContent(bin)


    if 'VV' in opts.bin:
        signalList = ['VVb',' VVlight']

    print 'Signal List:', signalList

    histos.append(copy(Overlay))
    if 'Zbb' in signalList and 'WH' in signalList:
        typs.append('Zbb')
        if 'Zbb' in Stack.setup: Stack.setup.remove('Zbb')
        if 'WH' in Stack.setup: Stack.setup.remove('WH')
        Stack.setup.insert(0,'Zbb')
    elif 'Zbb' in signalList:
        typs.append('Zbb')
    elif 'WH' in signalList:
        typs.append('WH')
    elif 'ZH' in signalList:
        typs.append('ZH')
    if 'VVb' in signalList:
        typs.append('VVb')
        #typs.append('VVlight')


    print '\n-----> Stack.setup(double check)...'
    print 'Histos:', histos
    print 'typs:', typs

    Stack.histos = histos
    Stack.typs = typs
    Stack.datas = datas
    Stack.datatyps = datatyps
    Stack.datanames= datanames

    #Stack.prefit_overlay = [prefit_overlay]

    if '13TeV' in region:
        Stack.overlay = [Overlay]
    print '\n\n\t\t Overlay: ',Stack.overlay

    Stack.AddErrors=Error
    if dataname == 'Wtn': 
        lumi = 18300.
    Stack.lumi = lumi
    Stack.doPlot()

    print 'i am done!\n'
예제 #13
0
def log_s_over_b(fileList):

    print '-----> Running def log_s_over_b()...'	

    #--------------
    # log s  over b
    #--------------

    histosL={}
    s_b_d_histos = {}
    for file in fileList:
        print file
        name = '%s' %file
        histosL[name] = []
        for th1 in get_th1(file):

            #print '\n\t Retrieving TH1 from file: ', th1		
		
            #th1.Sumw2()
            if 'VVLF' in th1.GetName():
                    th1.SetName('VV')
            if 'Zj1b' in th1.GetName():
                    th1.SetName('Zj2b')
            if 'Wj1b' in th1.GetName():
                    th1.SetName('Wj2b')
            histosL[name].append(th1)

        i = 0
	j = 0

        for hist in histosL[name]:
	    
            if 'ZH' in hist.GetName() or 'ggZH' in hist.GetName():

		#print '\n\t Setting ',hist, ' as signal...'    

		if j == 0:
			hSignal = hist.Clone()
		else:
			hSignal.Add(hist)
		j += 1
			
            elif 'data_obs' in hist.GetName():
                hData = hist.Clone()

            else:
                if i == 0:
                    hBkg = hist.Clone()
                else:
	            #print '\n\t Setting ',hist, ' as background...' 		
                    hBkg.Add(hist)
                i += 1

	# temp hack
	hData = hSignal
		
        s_b_d_histos[name] = {'b': hBkg, 's': hSignal, 'd': hData}


    bmin=-4
    bmax=0
    nbins=16

    log_s_over_b_b = ROOT.TH1F("log_s_over_b_b","log_s_over_b_b",nbins,bmin,bmax)
    log_s_over_b_b.SetFillColor(4)
    log_s_over_b_b.GetXaxis().SetTitle("log(S/B)")
    log_s_over_b_b.GetYaxis().SetTitle("Events")
    log_s_over_b_s = ROOT.TH1F("log_s_over_b_s","log_s_over_b_s",nbins,bmin,bmax)
    log_s_over_b_s.SetFillColor(2)
    log_s_over_b_d = ROOT.TH1F("log_s_over_b_d","log_s_over_b_d",nbins,bmin,bmax)
    log_s_over_b = ROOT.THStack("log_s_over_b","log_s_over_b")

    stack_log_s_over_b = ROOT.THStack("stack_log_s_over_b","stack_log_s_over_b")

    print '\ns_b_d_histos',s_b_d_histos

    for key, s_b_d in s_b_d_histos.iteritems():

	print '\n-----> Looping over Histogram: ',s_b_d    

        for bin in range(0,s_b_d['b'].GetNbinsX()+1):
            s = s_b_d['s'].GetBinContent(bin)
            b = s_b_d['b'].GetBinContent(bin)
            d = s_b_d['d'].GetBinContent(bin)
            sErr = s_b_d['s'].GetBinError(bin)
            bErr = s_b_d['b'].GetBinError(bin)
            dErr = s_b_d['d'].GetBinError(bin)

            logsb = -3.9
            if b > 0. and s > 0.:
                logsb = log10(s/b)
            elif s > 0.:
                logsb = -0.

	    print '\n\t Calculating log_s/b for bin', bin	
	    print '\t\t sig:',s,'   bgk:',b
            print '\t\t Log_s/b',logsb 

            newBin = log_s_over_b_b.FindBin(logsb) 
            log_s_over_b_b.SetBinContent(newBin, b+log_s_over_b_b.GetBinContent(newBin))
            log_s_over_b_s.SetBinContent(newBin, s+log_s_over_b_s.GetBinContent(newBin))
            log_s_over_b_d.SetBinContent(newBin, d+log_s_over_b_d.GetBinContent(newBin))
            log_s_over_b_b.SetBinError(newBin, sqrt(bErr*bErr+log_s_over_b_b.GetBinError(newBin)*log_s_over_b_b.GetBinError(newBin)))
            log_s_over_b_s.SetBinError(newBin, sqrt(sErr*sErr+log_s_over_b_s.GetBinError(newBin)*log_s_over_b_s.GetBinError(newBin)))
            log_s_over_b_d.SetBinError(newBin, sqrt(dErr*dErr+log_s_over_b_d.GetBinError(newBin)*log_s_over_b_d.GetBinError(newBin)))

    stack = StackMaker(config,'logSB','plot1',False)
    stack.setup = ['ZH','BKG']
    stack.typs = ['ZH','BKG']
    stack.lumi = 10000.
    stack.histos = [log_s_over_b_s,log_s_over_b_b]
    stack.datas = [log_s_over_b_d]
    stack.datanames='data_obs'
    stack.overlay = log_s_over_b_s
    stack.doPlot()
예제 #14
0
파일: tree_stack.py 프로젝트: perrozzi/VHbb
def doPlot():
    vars = (config.get(section, 'vars')).split(',')
    data = config.get(section,'Datas')
    mc = eval(config.get('Plot_general','samples'))

    SignalRegion = False
    if config.has_option(section,'Signal'):
        mc.append(config.get(section,'Signal'))
        SignalRegion = True
            
    datasamples = info.get_samples(data)
    mcsamples = info.get_samples(mc)

    GroupDict = eval(config.get('Plot_general','Group'))

    #GETALL AT ONCE
    options = []
    Stacks = []
    for i in range(len(vars)):
        Stacks.append(StackMaker(config,vars[i],region,SignalRegion))
        options.append(Stacks[i].options)
    print options

    Plotter=HistoMaker(mcsamples+datasamples,path,config,options,GroupDict)

    #print '\nProducing Plot of %s\n'%vars[v]
    Lhistos = [[] for _ in range(0,len(vars))]
    Ltyps = [[] for _ in range(0,len(vars))]
    Ldatas = [[] for _ in range(0,len(vars))]
    Ldatatyps = [[] for _ in range(0,len(vars))]
    Ldatanames = [[] for _ in range(0,len(vars))]

    #Find out Lumi:
    lumicounter=0.
    lumi=0.
    for job in datasamples:
        lumi+=float(job.lumi)
        lumicounter+=1.

    if lumicounter > 0:
        lumi=lumi/lumicounter

    Plotter.lumi=lumi
    mass = Stacks[0].mass

    for job in mcsamples:
        #hTempList, typList = Plotter.get_histos_from_tree(job)
        if addBlindingCut:
            hDictList = Plotter.get_histos_from_tree(job,config.get('Cuts',region)+' & ' + addBlindingCut)
        else:
            hDictList = Plotter.get_histos_from_tree(job)
        if job.name == mass:
            print job.name
            Overlaylist= deepcopy([hDictList[v].values()[0] for v in range(0,len(vars))])
        for v in range(0,len(vars)):
            Lhistos[v].append(hDictList[v].values()[0])
            Ltyps[v].append(hDictList[v].keys()[0])

    for job in datasamples:
        #hTemp, typ = Plotter.get_histos_from_tree(job)
        if addBlindingCut:
            dDictList = Plotter.get_histos_from_tree(job,config.get('Cuts',region)+' & ' + addBlindingCut)
        else:
            dDictList = Plotter.get_histos_from_tree(job)
        for v in range(0,len(vars)):
            Ldatas[v].append(dDictList[v].values()[0])
            Ldatatyps[v].append(dDictList[v].keys()[0])
            Ldatanames[v].append(job.name)

    for v in range(0,len(vars)):

        histos = Lhistos[v]
        typs = Ltyps[v]
        Stacks[v].histos = Lhistos[v]
        Stacks[v].typs = Ltyps[v]
        Stacks[v].datas = Ldatas[v]
        Stacks[v].datatyps = Ldatatyps[v]
        Stacks[v].datanames= Ldatanames[v]
        #if SignalRegion:
        #    Stacks[v].overlay = Overlaylist[v]
        Stacks[v].lumi = lumi
        Stacks[v].doPlot()
        Stacks[v].histos = Lhistos[v]
        Stacks[v].typs = Ltyps[v]
        Stacks[v].datas = Ldatas[v]
        Stacks[v].datatyps = Ldatatyps[v]
        Stacks[v].datanames= Ldatanames[v]
        Stacks[v].normalize = True
        Stacks[v].options['pdfName'] = Stacks[v].options['pdfName'].replace('.pdf','_norm.pdf')
        Stacks[v].doPlot()
        print 'i am done!\n'
예제 #15
0
def plot(fileList):

    print '-----> Running def plot()...'

    signalRegion = True
    region = 'signal_Zuu_low_Zpt'
    var = 'HCSV_mass'

    # for subtracted bkg mass plot
    #mjj_sub = True

    opts.fom = 's/s+b'

    print '-----> Making Stacks...'
    stack = StackMaker(config, var, region, signalRegion)

    histosL = []
    overlayL = []

    #7-9 for the higgs
    #5-6 for the VV

    binmin = 7
    binmax = 9

    #binmin=5
    #binmax=6

    max_sb = 0
    max_ssb = 0
    for file in fileList:
        if max_sb < get_s_over_b(file, binmin, binmax):
            max_sb = get_s_over_b(file, binmin, binmax)
        if max_ssb < get_s_over_sb(file, binmin, binmax):
            max_ssb = get_s_over_sb(file, binmin, binmax)

    print '-----> max_ssb: ', max_ssb
    print '-----> max_sb : ', max_sb

    for file in fileList:

        #if eval(opts.rescale) == False:
        #        max_sb = 1.
        #        max_ssb = 1.
        for th1 in get_th1_allRegions(file):

            print 'Scaling factor for ', th1, ':', get_s_over_sb(
                file, binmin, binmax)

            if 's/b' in opts.fom:
                th1.Scale(get_s_over_b(th1, binmin, binmax) / max_sb)
            if 's/s+b' in opts.fom:
                print '--->Scaling by s/s+b...'
                #th1.Scale(get_s_over_sb(th1,binmin,binmax)/max_ssb)
                th1.Scale(get_s_over_sb(file, binmin, binmax))

            if 'Zj1b' in th1.GetName():
                th1.SetName('DY1b')
            if 'Zj2b' in th1.GetName():
                th1.SetName('DY2b')
            if 'Zj0b' in th1.GetName():
                th1.SetName('DYlight')
            if 's_Top' in th1.GetName():
                th1.SetName('ST')

            if 'Wj1b' in th1.GetName():
                th1.SetName('Wj1b')

            #if mjj_sub:
            #    if 'VVHF' in th1.GetName():
            #        th1.SetName('VV')
            #    if 'VH' in th1.GetName():
            #        th1.SetName('VH')

            # new stack for the overlay plot
            if 'VH' in th1.GetName() or 'VVHF' in th1.GetName(
            ) or 'ZH' in th1.GetName():
                overlayL.append(th1)
            histosL.append(th1)

    print 'histoL'
    print histosL
    typs = []
    typsL = []
    datas = []
    datasL = []

    overlay_typs = []

    #append the name just once
    for histo in histosL:
        typsL.append(histo.GetName())

        if 'data' in histo.GetName():
            datasL.append(histo)

        if 'VH' in histo.GetName() or 'VV' in histo.GetName(
        ) or 'ZH' in th1.GetName():
            overlay_typs.append(histo.GetName())

        if 'TT' in histo.GetName(): datasL.append(histo)  # temp hack

    #datasL.append(datas)
    #typsL.append(typs)
    print typsL
    print 'Overlay list'
    print overlayL

    #overlay_histo_dict = HistoMaker.orderandadd([{overlay_typs[i]:overlayL[i]} for i in range(len(overlayL))],['VH','VV'])

    overlayL2 = []
    stack.histos = histosL
    stack.typs = typsL
    stack.datas = datasL
    #    stack.datatyps = Ldatatyps[v]
    stack.datanames = 'data_obs'

    #for key in overlay_histo_dict:
    #     overlayL2.append(overlay_histo_dict[key])

    mjj_sub = eval(opts.sub)

    #if not mjj_sub:
    #     stack.overlay = overlayL2

    appendix = ''
    if (eval(opts.rescale) == True):
        appendix = '_rescaled_'

    if 's/s+b' in opts.fom:
        stack.options['pdfName'] = stack.options['pdfName'].replace(
            '.pdf',
            '_combined78tev_postFit_s_over_sb' + appendix + '.' + opts.format)
    elif 's/b' in opts.fom:
        stack.options['pdfName'] = stack.options['pdfName'].replace(
            '.pdf',
            '_combined78tev_postFit_s_over_b' + appendix + '.' + opts.format)
    else:
        stack.options['pdfName'] = stack.options['pdfName'].replace(
            '.pdf', '_unweighted.' + opts.format)

#    stack.options['pdfName'] = stack.options['pdfName'].replace('.pdf','_highPt_7tev.pdf')
#    stack.options['pdfName'] = stack.options['pdfName'].replace('.pdf','_combined_postFit_s_over_b_Hpt_weight_1.pdf'
    stack.lumi = 18940

    if mjj_sub == False:
        print '\n\t----> Making Nominal Mass plot...'
        stack.doPlot()
    elif mjj_sub == True:
        print '\n\t----> Making Subtracted Mass plot...'
        stack.options['pdfName'] = stack.options['pdfName'].replace(
            '.' + opts.format, '_subtracted.' + opts.format)
        #stack.doSubPlot(['VH','VV'])
        stack.doSubPlot(['VVHF', 'ZH', 'ggZH'])

    print 'i am done!\n'
예제 #16
0
def log_s_over_b(fileList):
    #--------------
    # log s  over b
    #--------------

    histosL = {}
    s_b_d_histos = {}
    for file in fileList:
        print file
        name = '%s' % file
        histosL[name] = []
        print 'file is', file
        for th1 in get_th1(file):
            #th1.Sumw2()
            if 'VVLF' in th1.GetName():
                th1.SetName('VV')
            if 'Zj1b' in th1.GetName():
                th1.SetName('Zj2b')
            if 'Wj1b' in th1.GetName():
                th1.SetName('Wj2b')
            histosL[name].append(th1)
        i = 0
        for hist in histosL[name]:
            if 'VH' in hist.GetName() and not 'VVHF' in hist.GetName():
                #if 'VVHF' in hist.GetName():
                hSignal = hist.Clone()
            elif 'data_obs' in hist.GetName():
                hData = hist.Clone()
            else:
                if i == 0:
                    hBkg = hist.Clone()
                else:
                    hBkg.Add(hist)
                i += 1
        s_b_d_histos[name] = {'b': hBkg, 's': hSignal, 'd': hData}

    bmin = -4
    bmax = 0
    nbins = 16

    log_s_over_b_b = ROOT.TH1F("log_s_over_b_b", "log_s_over_b_b", nbins, bmin,
                               bmax)
    log_s_over_b_b.SetFillColor(4)
    log_s_over_b_b.GetXaxis().SetTitle("log(S/B)")
    log_s_over_b_b.GetYaxis().SetTitle("Events")
    log_s_over_b_s = ROOT.TH1F("log_s_over_b_s", "log_s_over_b_s", nbins, bmin,
                               bmax)
    log_s_over_b_s.SetFillColor(2)
    log_s_over_b_d = ROOT.TH1F("log_s_over_b_d", "log_s_over_b_d", nbins, bmin,
                               bmax)
    log_s_over_b = ROOT.THStack("log_s_over_b", "log_s_over_b")

    stack_log_s_over_b = ROOT.THStack("stack_log_s_over_b",
                                      "stack_log_s_over_b")

    for key, s_b_d in s_b_d_histos.iteritems():
        for bin in range(0, s_b_d['b'].GetNbinsX() + 1):
            s = s_b_d['s'].GetBinContent(bin)
            b = s_b_d['b'].GetBinContent(bin)
            d = s_b_d['d'].GetBinContent(bin)
            sErr = s_b_d['s'].GetBinError(bin)
            bErr = s_b_d['b'].GetBinError(bin)
            dErr = s_b_d['d'].GetBinError(bin)
            logsb = -3.9
            if b > 0. and s > 0.:
                logsb = log10(s / b)
            elif s > 0.:
                logsb = -0.
            #print logsb
            newBin = log_s_over_b_b.FindBin(logsb)
            log_s_over_b_b.SetBinContent(
                newBin, b + log_s_over_b_b.GetBinContent(newBin))
            log_s_over_b_s.SetBinContent(
                newBin, s + log_s_over_b_s.GetBinContent(newBin))
            log_s_over_b_d.SetBinContent(
                newBin, d + log_s_over_b_d.GetBinContent(newBin))
            log_s_over_b_b.SetBinError(
                newBin,
                sqrt(bErr * bErr + log_s_over_b_b.GetBinError(newBin) *
                     log_s_over_b_b.GetBinError(newBin)))
            log_s_over_b_s.SetBinError(
                newBin,
                sqrt(sErr * sErr + log_s_over_b_s.GetBinError(newBin) *
                     log_s_over_b_s.GetBinError(newBin)))
            log_s_over_b_d.SetBinError(
                newBin,
                sqrt(dErr * dErr + log_s_over_b_d.GetBinError(newBin) *
                     log_s_over_b_d.GetBinError(newBin)))

    stack = StackMaker(config, 'logSB', 'plot1', False)
    stack.setup = ['VH', 'BKG']
    stack.typs = ['VH', 'BKG']
    stack.lumi = 18940.
    stack.histos = [log_s_over_b_s, log_s_over_b_b]
    stack.datas = [log_s_over_b_d]
    stack.datanames = 'data_obs'
    stack.overlay = log_s_over_b_s
    stack.doPlot()
예제 #17
0
def plot(fileList):
    signalRegion = True
    region = 'plot'
    var = 'Hmass'

    stack = StackMaker(config,var,region,signalRegion)

    histosL = []
    overlayL = []

    #7-9 for the higgs
    #5-6 for the VV
    binmin=7
    binmax=9
    
    max_sb = 0
    max_ssb = 0
    for file in fileList:
        if max_sb < get_s_over_b(file,binmin,binmax):
            max_sb = get_s_over_b(file,binmin,binmax)
        if max_ssb < get_s_over_sb(file,binmin,binmax):
            max_ssb = get_s_over_sb(file,binmin,binmax)
                        
    print max_ssb
    print max_sb

    for file in fileList:
        print file
        print get_s_over_b(file,binmin,binmax)
        if eval(opts.rescale) == False:
                max_sb = 1.
                max_ssb = 1.
        for th1 in get_th1(file):
            #th1.Sumw2()
            if 's/b' in opts.fom:
                th1.Scale(get_s_over_b(file,binmin,binmax)/max_sb)
            if 's/s+b' in opts.fom:
                th1.Scale(get_s_over_sb(file,binmin,binmax)/max_ssb)
            if 'VV' in th1.GetName():
                    th1.SetName('VV')
            if 'Zj1b' in th1.GetName():
                    th1.SetName('Zj2b')
            if 'Wj1b' in th1.GetName():
                    th1.SetName('Wj2b')
            # new stack for the overlay plot
            if 'VH' in th1.GetName() or 'VV' in th1.GetName():
                    overlayL.append(th1)
            histosL.append(th1)

    print 'histoL'
    print histosL
    typs = []
    typsL = []
    datas = []
    datasL = []

    overlay_typs=[]

    #append the name just once
    for histo in histosL:
        typsL.append(histo.GetName())
        if 'data' in histo.GetName():
            datasL.append(histo)
        if 'VH' in histo.GetName() or 'VV' in histo.GetName():
            overlay_typs.append(histo.GetName())

    #datasL.append(datas)
    #typsL.append(typs)
    print typsL
    print 'Overlay list'
    print overlayL

    overlay_histo_dict = HistoMaker.orderandadd([{overlay_typs[i]:overlayL[i]} for i in range(len(overlayL))],['VH','VV'])

    overlayL2=[]
    stack.histos = histosL
    stack.typs = typsL
    stack.datas = datasL
#    stack.datatyps = Ldatatyps[v]
    stack.datanames='data_obs'
    for key in overlay_histo_dict:
         overlayL2.append(overlay_histo_dict[key])

    mjj_sub = eval(opts.sub)
    if not mjj_sub:
         stack.overlay = overlayL2
         
    appendix = ''
    if(eval(opts.rescale) == True):
            appendix = '_rescaled_'
    
    if 's/s+b' in opts.fom:
            stack.options['pdfName'] = stack.options['pdfName'].replace('.pdf','_combined78tev_postFit_s_over_sb'+appendix+'.'+opts.format)
    elif 's/b' in opts.fom:
            stack.options['pdfName'] = stack.options['pdfName'].replace('.pdf','_combined78tev_postFit_s_over_b'+appendix+'.'+opts.format)
    else:
            stack.options['pdfName'] = stack.options['pdfName'].replace('.pdf','_unweighted.'+opts.format)            
    
#    stack.options['pdfName'] = stack.options['pdfName'].replace('.pdf','_highPt_7tev.pdf')
#    stack.options['pdfName'] = stack.options['pdfName'].replace('.pdf','_combined_postFit_s_over_b_Hpt_weight_1.pdf'
    stack.lumi = 18940

    if mjj_sub == False:
            stack.doPlot()
    elif mjj_sub == True:
            stack.options['pdfName'] = stack.options['pdfName'].replace('.'+opts.format,'_subtracted.'+opts.format)
            stack.doSubPlot(['VH','VV'])
    print 'i am done!\n'
예제 #18
0
def plot(fileList):
    signalRegion = True
    #region = 'plot'
    region = opts.region
    var = 'HCSVmass'

    stack = StackMaker(config, var, region, signalRegion)

    histosL = []
    overlayL = []

    #7-9 for the higgs
    #5-6 for the VV
    binmin = 7
    binmax = 9

    max_sb = 0
    max_ssb = 0
    for file in fileList:
        if max_sb < get_s_over_b(file, binmin, binmax):
            max_sb = get_s_over_b(file, binmin, binmax)
        if max_ssb < get_s_over_sb(file, binmin, binmax):
            max_ssb = get_s_over_sb(file, binmin, binmax)

    print max_ssb
    print max_sb

    for file in fileList:
        print file
        print get_s_over_b(file, binmin, binmax)
        if eval(opts.rescale) == False:
            max_sb = 1.
            max_ssb = 1.
        for th1 in get_th1(file):
            #th1.Sumw2()
            if 's/b' in opts.fom:
                th1.Scale(get_s_over_b(file, binmin, binmax) / max_sb)
            if 's/s+b' in opts.fom:
                th1.Scale(get_s_over_sb(file, binmin, binmax) / max_ssb)
            if 'VV' in th1.GetName():
                th1.SetName('VV')
            if 'Zj1b' in th1.GetName():
                th1.SetName('Zj2b')
            if 'Wj1b' in th1.GetName():
                th1.SetName('Wj2b')
            # new stack for the overlay plot
            if 'VH' in th1.GetName() or 'VV' in th1.GetName():
                overlayL.append(th1)
            histosL.append(th1)

    print 'histoL'
    print histosL
    typs = []
    typsL = []
    datas = []
    datasL = []

    overlay_typs = []

    #append the name just once
    for histo in histosL:
        typsL.append(histo.GetName())
        if 'data' in histo.GetName():
            datasL.append(histo)
        if 'VH' in histo.GetName() or 'VV' in histo.GetName():
            overlay_typs.append(histo.GetName())

    #datasL.append(datas)
    #typsL.append(typs)
    print typsL
    print 'Overlay list'
    print overlayL

    overlay_histo_dict = HistoMaker.orderandadd([{
        overlay_typs[i]: overlayL[i]
    } for i in range(len(overlayL))], ['VH', 'VV'])

    overlayL2 = []
    stack.histos = histosL
    stack.typs = typsL
    stack.datas = datasL
    #    stack.datatyps = Ldatatyps[v]
    stack.datanames = 'data_obs'
    for key in overlay_histo_dict:
        overlayL2.append(overlay_histo_dict[key])

    mjj_sub = eval(opts.sub)
    if not mjj_sub:
        stack.overlay = overlayL2

    appendix = ''
    if (eval(opts.rescale) == True):
        appendix = '_rescaled_'

    if 's/s+b' in opts.fom:
        stack.options['pdfName'] = stack.options['pdfName'].replace(
            '.pdf',
            '_combined78tev_postFit_s_over_sb' + appendix + '.' + opts.format)
    elif 's/b' in opts.fom:
        stack.options['pdfName'] = stack.options['pdfName'].replace(
            '.pdf',
            '_combined78tev_postFit_s_over_b' + appendix + '.' + opts.format)
    else:
        stack.options['pdfName'] = stack.options['pdfName'].replace(
            '.pdf', '_unweighted.' + opts.format)

#    stack.options['pdfName'] = stack.options['pdfName'].replace('.pdf','_highPt_7tev.pdf')
#    stack.options['pdfName'] = stack.options['pdfName'].replace('.pdf','_combined_postFit_s_over_b_Hpt_weight_1.pdf'
    stack.lumi = 18940

    if mjj_sub == False:
        stack.doPlot()
    elif mjj_sub == True:
        stack.options['pdfName'] = stack.options['pdfName'].replace(
            '.' + opts.format, '_subtracted.' + opts.format)
        stack.doSubPlot(['VH', 'VV'])
    print 'i am done!\n'
예제 #19
0
파일: tree_stack.py 프로젝트: jmduarte/Xbb
def doPlot():

    #print "Read Ploting Region information"
    #print "===============================\n"

    vars = (config.get(section, 'vars')).split(
        ',')  #get the variables to be ploted in each region
    #print "The variables are", vars, "\n"
    data = eval(config.get(
        section, 'Datas'))  # read the data corresponding to each CR (section)
    mc = eval(config.get('Plot_general',
                         'samples'))  # read the list of mc samples
    total_lumi = eval(config.get('Plot_general', 'lumi'))
    #print 'total lumi is', total_lumi
    print "The list of mc samples is", mc

    #print "Check if is Signal Region"
    #print "=========================\n"
    SignalRegion = False
    if config.has_option(section, 'Signal'):
        mc.append(config.get(section, 'Signal'))
        SignalRegion = True
    #print "After addind the signal, the mc is", mc

    #print "Getting information on data and mc samples"
    #print "==========================================\n"

    #print "Getting data sample"
    datasamples = info.get_samples(data)
    #print "datasamples is\n", datasamples
    #print "Getting mc sample"
    mcsamples = info.get_samples(mc)
    #print "mc sample is\n"
    #for sample in mcsamples:
    #print "sample name", sample.name

    GroupDict = eval(
        config.get('Plot_general', 'Group')
    )  #Contained in plots. Listed in general, under Group [Samples] group. This is a dictionnary that descriebes what samples should share the same color under the stack plot.

    #GETALL AT ONCE
    options = []
    Stacks = []
    #print "Start Loop over the list of variables(to fill the StackMaker )" print "==============================================================\n"
    for i in range(
            len(vars)
    ):  # loop over the list of variables to be ploted in each reagion
        #print "The variable is ", vars[i], "\n"
        Stacks.append(
            StackMaker(config, vars[i], region, SignalRegion)
        )  # defined in myutils DoubleStackMaker. The StackMaker merge together all the informations necessary to perform the plot (plot region, variables, samples and signal region ). "options" contains the variables information, including the cuts.
        options.append(Stacks[i].options)
    #print "Finished Loop over the list of variables(to fill the StackMaker )"
    #print "================================================================\n"
    #print 'loop options',options
    # print 'options',options

    #Prepare cached files in the temporary (tmpSamples) folder.
    Plotter = HistoMaker(mcsamples + datasamples, path, config, options,
                         GroupDict, filelist, opts.mergeplot)
    if len(filelist) > 0 or opts.mergeplot:
        print('ONLY CACHING PERFORMED, EXITING')
        sys.exit(1)

    #print '\nProducing Plot of %s\n'%vars[v]
    Lhistos = [[] for _ in range(0, len(vars))]
    Ltyps = [[] for _ in range(0, len(vars))]
    Ldatas = [[] for _ in range(0, len(vars))]
    Ldatatyps = [[] for _ in range(0, len(vars))]
    Ldatanames = [[] for _ in range(0, len(vars))]
    Ljobnames = [[] for _ in range(0, len(vars))]

    #print "Summing up the Luminosity"
    #print "=========================\n"

    #! Sums up the luminosity of the data:
    lumicounter = 0.
    lumi = 0.
    if datasamples == []:
        lumi = total_lumi
    else:
        print "Will run over datasamples to sum up the lumi"
        for job in datasamples:
            print "Datasample is", job
            lumi += float(job.lumi)
            lumicounter += 1.
        if lumicounter > 0:
            lumi = lumi / lumicounter

    print "The lumi is", lumi, "\n"

    Plotter.lumi = lumi
    mass = Stacks[0].mass

    #print 'mcsamples',mcsamples
    inputs = []
    for job in mcsamples:
        #        print 'job.name'
        #        cutOverWrite = None
        #        if addBlindingCut:
        #            cutOverWrite = config.get('Cuts',region)+' & ' + addBlindingCut
        inputs.append((Plotter, "get_histos_from_tree", (job, True)))

    #print 'inputs are', inputs

    # if('pisa' in config.get('Configuration','whereToLaunch')):
    multiprocess = int(config.get('Configuration', 'nprocesses'))
    #    multiprocess=0
    outputs = []
    if multiprocess > 1:
        from multiprocessing import Pool
        from myutils import GlobalFunction
        p = Pool(multiprocess)
        #print 'launching get_histos_from_tree with ',multiprocess,' processes'
        outputs = p.map(GlobalFunction, inputs)
    else:
        #print 'launching get_histos_from_tree with ',multiprocess,' processes'
        for input_ in inputs:
            outputs.append(getattr(
                input_[0],
                input_[1])(*input_[2]))  #ie. Plotter.get_histos_from_tree(job)
    #print 'get_histos_from_tree DONE'
    Overlaylist = []
    for i, job in enumerate(mcsamples):
        #print 'job.name',job.name,"mass==",mass
        #hTempList, typList = Plotter.get_histos_from_tree(job)
        hDictList = outputs[i]
        if job.name in mass:
            #print 'job.name == mass'
            histoList = []
            for v in range(0, len(vars)):
                histoCopy = deepcopy(hDictList[v].values()[0])
                histoCopy.SetTitle(job.name)
                histoList.append(histoCopy)
            Overlaylist.append(histoList)
#            Overlaylist.append(deepcopy([hDictList[v].values()[0] for v in range(0,len(vars))]))
# >>>>>>> silviodonato/master
        for v in range(0, len(vars)):
            Lhistos[v].append(hDictList[v].values()[0])
            Ltyps[v].append(hDictList[v].keys()[0])
            Ljobnames[v].append(job.name)

    #print "len(vars)=",len(vars)
    #print "Ltyps is", Ltyps
    ##invert Overlaylist[variable][job] -> Overlaylist[job][variable]
    #print "len(Overlaylist) before: ",len(Overlaylist)
    #print "Overlaylist",Overlaylist
#    newOverlaylist = [[None]*len(Overlaylist)]*len(vars)
#    for i,OverlaySameSample in enumerate(Overlaylist):
#            for j,Overlay in enumerate(OverlaySameSample):
#                newOverlaylist[j][i] = Overlay
#    Overlaylist = newOverlaylist
    Overlaylist = [list(a) for a in zip(*Overlaylist)]
    #print "len(Overlaylist) after: ",len(Overlaylist)
    #print "Overlaylist",Overlaylist

    ##merge overlays in groups
    for i in range(len(Overlaylist)):
        newhistos = {}
        #print "len(Overlaylist[i]):",Overlaylist[i]
        for histo in Overlaylist[i]:
            #print "histo.GetName()",histo.GetName(),
            #print "histo.GetTitle()",histo.GetTitle(),
            group = GroupDict[histo.GetTitle()]
            if not group in newhistos.keys():
                histo.SetTitle(group)
                newhistos[group] = histo
            else:
                #print "Before newhistos[group].Integral()",newhistos[group].Integral(),
                newhistos[group].Add(histo)
                #print "After newhistos[group].Integral()",newhistos[group].Integral()
        Overlaylist[i] = newhistos.values()

#   ### ORIGINAL ###
#    print 'mcsamples',mcsamples
#    for job in mcsamples:
#        print 'job.name',job.name
#        #hTempList, typList = Plotter.get_histos_from_tree(job)
#        if addBlindingCut:
#            hDictList = Plotter.get_histos_from_tree(job,config.get('Cuts',region)+' & ' + addBlindingCut)
#        else:
#            print 'going to get_histos_from_tree'
#            hDictList = Plotter.get_histos_from_tree(job)
#        if job.name == mass:
#            print 'job.name', job.name
#            Overlaylist= deepcopy([hDictList[v].values()[0] for v in range(0,len(vars))])
#        for v in range(0,len(vars)):
#            Lhistos[v].append(hDictList[v].values()[0])
#            Ltyps[v].append(hDictList[v].keys()[0])
#            Ljobnames[v].append(job.name)

#print "DATA samples\n"
#! Get the data histograms
    for job in datasamples:
        if addBlindingCut:
            dDictList = Plotter.get_histos_from_tree(
                job,
                config.get('Cuts', region) + ' & ' + addBlindingCut)
        else:
            dDictList = Plotter.get_histos_from_tree(job)
        #! add the variables list for each job (Samples)
        for v in range(0, len(vars)):
            Ldatas[v].append(dDictList[v].values()[0])
            Ldatatyps[v].append(dDictList[v].keys()[0])
            Ldatanames[v].append(job.name)

    for v in range(0, len(vars)):

        #print "Ltyps[v]:",Ltyps[v]
        #print "Lhistos[v]:",Lhistos[v]
        #print "Ldatas[v]:",Ldatas[v]
        #print "Ldatatyps[v]:",Ldatatyps[v]
        #print "Ldatanames[v]:",Ldatanames[v]
        #print "lumi:",lumi

        histos = Lhistos[v]
        typs = Ltyps[v]
        Stacks[v].histos = Lhistos[v]
        Stacks[v].typs = Ltyps[v]
        Stacks[v].datas = Ldatas[v]
        Stacks[v].datatyps = Ldatatyps[v]
        Stacks[v].datanames = Ldatanames[v]
        if SignalRegion:
            Stacks[v].overlay = Overlaylist[v]  ## from
        Stacks[v].lumi = lumi
        Stacks[v].jobnames = Ljobnames[v]
        Stacks[v].normalize = eval(config.get(section, 'Normalize'))
        Stacks[v].doPlot()
        ##FIXME##
        #        Stacks[v].histos = Lhistos[v]
        #        Stacks[v].typs = Ltyps[v]
        #        Stacks[v].datas = Ldatas[v]
        #        Stacks[v].datatyps = Ldatatyps[v]
        #        Stacks[v].datanames= Ldatanames[v]
        #        Stacks[v].normalize = True
        #        Stacks[v].options['pdfName'] = Stacks[v].options['pdfName'].replace('.pdf','_norm.pdf')
        #        Stacks[v].doPlot()
        print 'i am done!\n'
    print 'DOPLOT END'
예제 #20
0
def drawFromDC():

    config = BetterConfigParser()
    config.read(opts.config)

    region = opts.region

    print "\nopts.config:", opts.config
    print "opts:", opts
    print "var:", opts.var
    print "bin:", opts.bin

    dataname = 'Zll'

    if 'Zuu' in opts.bin: dataname = 'Zuu'
    elif 'Zee' in opts.bin: dataname = 'Zee'
    elif 'Wmn' in opts.bin: dataname = 'Wmn'
    elif 'Wen' in opts.bin: dataname = 'Wen'
    elif 'Znn' in opts.bin: dataname = 'Znn'
    elif 'Wtn' in opts.bin: dataname = 'Wtn'

    if (opts.var == ''):
        var = 'BDT'
        if dataname == 'Zmm' or dataname == 'Zee': var = 'BDT_Zll'
        elif dataname == 'Wmn' or dataname == 'Wen': var = 'BDT_Wln'
        elif dataname == 'Znn': var = 'BDT_Znn'
        #if 'HighPt' in opts.bin: var = 'BDT_ZnnHighPt'
        #if 'LowPt' in opts.bin: var = 'BDT_ZnnLowPt'
        #if 'LowCSV' in opts.bin: var = 'BDT_ZnnLowCSV'
        if dataname == '' or var == 'BDT':
            raise RuntimeError, 'Did not recognise mode or var from ' + opts.bin
    else:
        var = opts.var

    if opts.var == 'BDT':
        if 'LowPt' in opts.bin: var = 'gg_plus_ZH125_low_Zpt'
        elif 'MedPt' in opts.bin: var = 'gg_plus_ZH125_med_Zpt'
        elif 'HighPt' in opts.bin: var = 'gg_plus_ZH125_high_Zpt'
        elif 'VV' in opts.bin: var = 'VV_bdt'
        else: var = 'gg_plus_ZH125_high_Zpt'

    #if 'BDT' in var:
    #    region = 'BDT'
    #else:

    region = opts.bin

    ws_var = config.get('plotDef:%s' % var, 'relPath')

    print 'ws_var:', ws_var

    if opts.var == 'BDT':
        ws_var = ROOT.RooRealVar(ws_var, ws_var, -1., 1.)
    else:
        ws_var = ROOT.RooRealVar(ws_var, ws_var, 0, 1.)

    blind = eval(config.get('Plot:%s' % region, 'blind'))
    #blind = True

    # If Zvv change region to relevant CR
    if 'Znn' in region:
        if 'QCD' in opts.dc:
            region = 'Zvv_QCD'
        if 'TT' in opts.dc:
            region = 'Zvv_TT'
        if 'Zbb' in opts.dc:
            region = 'Zvv_Zbb'
        if 'Zlight' in opts.dc:
            region = 'Zvv_Zlight'

    print 'config:', config
    print 'var: ', var
    print 'region: ', region

    Stack = StackMaker(config, var, region, True)

    if 'low' in opts.bin or 'ch1_Wenu' == opts.bin or 'ch2_Wmunu' == opts.bin:
        Stack.addFlag2 = 'Low p_{T}(V)'
    elif 'MedPt' in opts.bin or 'ch1_Wenu2' == opts.bin or 'ch2_Wmunu2' == opts.bin:
        Stack.addFlag2 = 'Intermediate p_{T}(V)'
    elif 'high' in opts.bin or 'ch1_Wenu3' == opts.bin or 'ch2_Wmunu3' == opts.bin:
        Stack.addFlag2 = 'High p_{T}(V)'

    # check for pre or post fit options
    preFit = False
    addName = 'PostFit_%s' % (opts.fit)
    if not opts.mlfit:
        addName = 'PreFit'
        preFit = True

    print '\n-----> Fit Type(opts.fit)  : ', opts.fit
    print '               (opts.mlfit): ', opts.mlfit
    print '               preFit      : ', preFit
    print '               opts.bin    : ', opts.bin

    Stack.options['pdfName'] = '%s_%s_%s.pdf' % (var, opts.bin, addName)

    log = eval(config.get('Plot:%s' % region, 'log'))

    if 'Zll' in opts.bin or 'Zee' in opts.bin or 'Zuu' in opts.bin or 'minCMVA' in opts.var or 'Zmm' in opts.bin:
        #setup = config.get('Plot_general','setup').split(',')
        setup = [
            'ZH', 'ggZH', 'DY2b', 'DY1b', 'DYlight', 'TT', 'VVHF', 'VVLF', 'ST'
        ]
        signalList = ['ZH']

        #channel = 'ZllHbb'

        # For my own fits
        channel = ''

        if 'Zee' in opts.bin: lep_channel = 'Zee'
        elif 'Zuu' in opts.bin: lep_channel = 'Zmm'

        region_dic = {
            'BDT': 'SIG',
            ' Zlf': 'Zlf',
            'Zhf': 'Zhf',
            'TT': 'TT',
            '13TeV': 'SIG'
        }
        region_name = [
            region_dic[key] for key in region_dic if (key in opts.bin)
        ]

        if 'minCMVA' not in opts.var:
            region_name = region_name[0]
        else:
            if 'Zlf' in opts.bin: region_name = 'Zlf'
            if 'Zhf' in opts.bin: region_name = 'Zhf'
            if 'ttbar' in opts.bin: region_name = 'TT'

        pt_region_dic = {
            'lowpt': 'low',
            'highpt': 'high',
            'LowPt': 'low',
            'HighPt': 'high'
        }
        pt_region_name = [
            pt_region_dic[key] for key in pt_region_dic if (key in opts.bin)
        ]
        #pt_region_name = pt_region_name[0]
        if 'low' in opts.bin: pt_region_name = 'low'
        if 'high' in opts.bin: pt_region_name = 'high'

        print 'region_name is', region_name
        print 'pt region_name is', pt_region_name

    if 'Wmn' in opts.bin or 'Wen' in opts.bin:
        setup = [
            'WH', 'ZH', 'DY2b', 'DY1b', 'DYlight', 'TT', 'VVHF', 'VVLF', 'ST',
            'Wj0b', 'Wj1b', 'Wj2b'
        ]
        signalList = ['ZH', 'WH']

    if 'Znn' in opts.bin:
        setup = [
            'ZH', 'ggZH', 'DY2b', 'DY1b', 'DYlight', 'TT', 'VVHF', 'ST', 'WH',
            'Wj0b', 'Wj1b', 'Wj2b'
        ]
        signalList = ['ZH']

        lep_channel = 'Znn'
        pt_region_name = 'HighPt'
        if opts.var == 'BDT':
            region_name = ''
            region_type = 'SR'

        print 'region_name is', region_name
        print 'region_type is', region_type
        print 'pt region_name is', pt_region_name
        print 'Lepton channel:', lep_channel

    if dataname == 'Zmm' or dataname == 'Zee':
        try:
            setup.remove('W1b')
            setup.remove('W2b')
            setup.remove('Wlight')
            setup.remove('WH')
        except:
            print '@INFO: Wb / Wligh / WH not present in the datacard'
    if not dataname == 'Znn' and 'QCD' in setup:
        setup.remove('QCD')

    Stack.setup = setup

    Dict = eval(config.get('LimitGeneral', 'Dict'))
    lumi = eval(config.get('Plot_general', 'lumi'))

    options = copy(opts)
    options.dataname = "data_obs"
    options.mass = 0
    options.format = "%8.3f +/- %6.3f"
    options.channel = opts.bin
    options.excludeSyst = []
    options.norm = False
    options.stat = False
    options.bin = True  # fake that is a binary output, so that we parse shape lines
    options.out = "tmp.root"
    options.fileName = args[0]
    options.filename = region
    options.cexpr = False
    options.fixpars = False
    options.libs = []
    options.verbose = 0
    options.poisson = 0
    options.nuisancesToExclude = []
    options.noJMax = None

    theBinning = ROOT.RooFit.Binning(Stack.nBins, Stack.xMin, Stack.xMax)

    if 'Wmn' in opts.bin or 'Wen' in opts.bin or 'Znn' in opts.bin:  # SET: WLV MINCSV BINNING
        if 'CSV' in opts.var:
            Stack.nBins = 15
            print '\n\t Changing Wlv/Zvv CSV bins to ', 15
            theBinning = ROOT.RooFit.Binning(15, Stack.xMin, Stack.xMax)

    print '/n----> The Binning:'
    print 'nBins:', Stack.nBins
    print 'xMin:', Stack.xMin
    print 'xMax:', Stack.xMax

    error_histos = []
    histos = []
    typs = []
    shapes = {}
    shapesUp = [[] for _ in range(0, len(setup))]
    shapesDown = [[] for _ in range(0, len(setup))]

    sigCount = 0
    Overlay = []
    prefit_overlay = []

    dirname = ''
    ####
    #Open the mlfit.root and retrieve the mc
    file = ROOT.TFile.Open(opts.mlfit)
    if file == None: raise RuntimeError, "Cannot open file %s" % opts.mlfit
    print '\n\n-----> Fit File: ', file

    if not ROOT.gDirectory.cd('shapes_fit_s'):
        print '@ERROR: didn\'t find the shapes_fit_s directory. Aborting'
        sys.exit()

    for dir in ROOT.gDirectory.GetListOfKeys():

        dirinfo = dir.GetName().split('_')

        print 'dirinfo:', dirinfo

        if 'Znn' in opts.bin and 'BDT' in opts.var:
            print 'lepton channel, pt_region_name, region_type:', dirinfo[
                0], dirinfo[1], dirinfo[2]
            if not (dirinfo[0] == lep_channel and dirinfo[1] == pt_region_name
                    and dirinfo[2] == region_type):
                continue

        elif len(dirinfo) == 5:
            print 'channel, lepton channel, region_name, pt_region_name:', dirinfo[
                0], dirinfo[1], dirinfo[2], dirinfo[3], dirinfo[4]
            if not (dirinfo[0] == channel and dirinfo[2] == lep_channel
                    and dirinfo[3] == region_name
                    and dirinfo[4] == pt_region_name):
                continue

        elif len(dirinfo) == 4:
            print 'channel, lepton channel, region_name, pt_region_name:', dirinfo[
                0], dirinfo[1], dirinfo[2], dirinfo[3]
            if not (dirinfo[1] == lep_channel and dirinfo[2] == region_name
                    and dirinfo[3] == pt_region_name):
                continue

        print 'Directory:', dir.GetName()

        dirname = dir.GetName()

        ROOT.gDirectory.cd(dirname)
        for s in setup:
            found = False
            for subdir in ROOT.gDirectory.GetListOfKeys():
                print 'subdir name is', subdir.GetName()
                if subdir.GetName() == Dict[s]:
                    found = True

                    # Set Histos postFit shapes and preFit errors
                    hist = rebinHist(
                        ROOT.gDirectory.Get(subdir.GetName()).Clone(),
                        Stack.nBins, Stack.xMin, Stack.xMax)

                    histos.append(hist)
                    #error_histos.append(PostFit_Errors)
                    typs.append(s)
                    print 's is', s
                    print 'signalList is', signalList
                    if s in signalList:
                        hist.SetTitle(s)
                        Overlay.append(hist)
                        print 'the Histogram title is', hist.GetTitle()

            if not found:
                print '@ERROR: didn\'t find  the postfit histogram. Aborting'
                sys.exit()
        ROOT.gDirectory.cd('/shapes_prefit/' + dirname)
        total = rebinHist(
            ROOT.gDirectory.Get('total').Clone(), Stack.nBins, Stack.xMin,
            Stack.xMax)
        total.SetTitle('prefit')
        prefit_overlay.append(total)
        break

    # =================================================
    ##### Read data
    print 'file is ', opts.dc
    dc_file = open(opts.dc, "r")
    os.chdir(os.path.dirname(opts.dc))
    DC = parseCard(dc_file, options)
    if not DC.hasShapes: DC.hasShapes = True
    MB = ShapeBuilder(DC, options)
    data0 = MB.getShape(opts.bin, 'data_obs')
    if (data0.InheritsFrom("RooDataHist")):
        data0 = ROOT.RooAbsData.createHistogram(data0, 'data_obs', ws_var,
                                                theBinning)
        data0.SetName('data_obs')
    datas = [data0]
    datatyps = [None]
    datanames = [dataname]

    print '\nDATA HIST:', data0
    print 'Data name:', dataname

    if opts.var == 'BDT':
        for bin in range(11, datas[0].GetNbinsX() + 1):
            datas[0].SetBinContent(bin, 0)
    # =======================================================

    #if 'VV' in opts.bin:
    if isVV:
        signalList = ['VVHF', ' VVHF']

    print 'Signal List:', signalList

    #histos.append(copy(Overlay))

    if 'ZH' in signalList and 'WH' in signalList:
        #typs.append('WH')
        #if 'ZH' in Stack.setup: Stack.setup.remove('ZH')
        #if 'WH' in Stack.setup: Stack.setup.remove('WH')
        #Stack.setup.insert(0,'WH')
        #print 'Stack.setup:', Stack.setup
        typs.append('WH')
        typs.append('ZH')

    #elif 'ZH' in signalList:
    #Stack.setup.remove('WH')
    #typs.append('ggZH')
    #    typs.append('ZH')

    if 'VVb' in signalList or 'VVHF' in signalList:
        #typs.append('WH')
        typs.append('ZH')
        typs.append('VVHF')

        if 'VVHF' in Stack.setup:
            Stack.setup.remove('VVHF')
            Stack.setup.insert(0, 'VVHF')

        if 'ZH' in Stack.setup:
            Stack.setup.remove('ZH')
            Stack.setup.insert(-1, 'ZH')

        if 'WH' in Stack.setup:
            Stack.setup.remove('WH')
            Stack.setup.insert(-1, 'WH')

        if 'ggZH' in Stack.setup:
            Stack.setup.remove('ggZH')
            Stack.setup.insert(-1, 'ggZH')

    print '\n-----> Stack.setup(double check)...', Stack
    print 'Post Histos:', histos
    print 'Datas:', datas
    print 'typs:', typs

    Stack.histos = histos
    Stack.typs = typs
    Stack.datas = datas
    Stack.datatyps = datatyps
    Stack.datanames = datanames
    Stack.filename = region

    #if opts.var is not 'BDT':
    #Stack.prefit_overlay = [prefit_overlay]

    #if '13TeV' in region:
    #Stack.overlay = [Overlay]
    print '\n\n\t\t Overlay: ', Stack.overlay

    # Add custom postFit errors
    #Stack.AddErrors = theErrorGraph

    if dataname == 'Wtn':
        lumi = 18300.
    Stack.lumi = lumi
    Stack.doPlot()

    print 'i am done!\n'