def showRatios(ratios, outUrl): """shows the ratio plots""" ROOT.gStyle.SetOptTitle(0) ROOT.gStyle.SetOptStat(0) ROOT.gROOT.SetBatch(True) os.system('rm %s' % outUrl) outDir = os.path.dirname(outUrl) COLOURS = [1, '#f4a582', '#bababa', '#abdda4'] for key in ratios: p = Plot(key + '_ratio', com='13 TeV') p.doPoissonErrorBars = False p.ratiorange = (0.68, 1.34) p.spimposeWithErrors = True ic = 0 for h in ratios[key]: p.add(h=h, title=h.GetTitle(), color=COLOURS[ic], isData=False, spImpose=True, isSyst=False) ic += 1 p.show(outDir=outDir, lumi=41400, noStack=False, saveTeX=False, noRatio=True) p.appendTo(outUrl) p.reset()
def drawVariations(h, exp, cat): for c in comp: projs = getProjections(exp, comp[c]) p = Plot('%s_%s' % (cat, c)) p.doPoissonErrorBars = False p.add(h, 'nominal', 1, True, False, False) for px in projs: if c == 'qg': px.Scale(h.Integral() / px.Integral()) p.add(px, px.GetTitle(), px.GetLineColor(), False, False, False) p.show('./', 41000, True)
def showShapes(resultsDir, name, title, mass, boson, r95, sig, lumi, plotData=True, showPseudoData=True, showAllBkgs=True): """ show the shapes corresponding to a given analysis """ shapeFiles = [ os.path.join(resultsDir, f) for f in os.listdir(resultsDir) if 'shapes_' in f and '.root' in f ] for f in shapeFiles: try: angle = int(re.search('_a(\d+)', f).group(1)) except: print 'No angle could be parsed, assuming this is an inclusive analysis' angle = None fIn = ROOT.TFile.Open(f) #check consistency of the file with the boson to plot if 'shapes_22' in f and boson == 'g': v = 'g' channel = '#gamma' elif 'shapes_169' in f and boson == 'z': v = 'zmm' channel = 'Z#rightarrow#mu#mu' elif 'shapes_121' in f and boson == 'z': v = 'zee' channel = 'Z#rightarrowee' else: continue for icat in range(2): if angle: bkgH = fIn.Get('bkg_%s_a%d_%d' % (v, angle, icat)) fidsigH = fIn.Get('fidsig_%s_a%d_%d_m%d' % (v, angle, icat, mass)) outfidsigH = fIn.Get('outfidsig_%s_a%d_%d_m%d' % (v, angle, icat, mass)) dataH = fIn.Get('data_obs_%s_a%d_%d' % (v, angle, icat)) else: bkgH = fIn.Get('bkg_%s_%d' % (v, icat)) fidsigH = fIn.Get('fidsig_%s_%d_m%d' % (v, icat, mass)) outfidsigH = fIn.Get('outfidsig_%s_%d_m%d' % (v, icat, mass)) dataH = fIn.Get('data_obs_%s_%d' % (v, icat)) print bkgH, fidsigH, outfidsigH, dataH try: fidsigH.Scale(5) outfidsigH.Scale(5) except: fidsigH = None outfidsigH = None if showPseudoData: dataH.Reset('ICE') nexp = bkgH.Integral() if fidsigH: nexp += bkgH.Integral() if outfidsigH: nexp += outfidsigH.Integral() for iev in range(ROOT.gRandom.Poisson(nexp)): dataH.Fill(bkgH.GetRandom()) try: #main shapes if angle: p = Plot('%s_%s_a%d_cat%d' % (name, v, angle, icat)) else: p = Plot('%s_%s_inc_cat%d' % (name, v, icat)) p.xtit = 'Missing mass [GeV]' p.ytit = 'Events' if fidsigH: p.add(fidsigH, title='#scale[0.5]{5x}' + title + '#scale[0.8]{(%d)}' % mass, color=ROOT.TColor.GetColor('#fdc086'), isData=False, spImpose=False, isSyst=False) if showAllBkgs: if outfidsigH: p.add(outfidsigH, title='#scale[0.5]{5x}non-fiducial', color=ROOT.TColor.GetColor('#a6cee3'), isData=False, spImpose=False, isSyst=False) p.add(bkgH, title='background', color=ROOT.TColor.GetColor('#1f78b4'), isData=False, spImpose=False, isSyst=False) else: allBkg = bkgH.Clone('allbkg') if outfidsigH: allBkg.Add(outfidsigH) p.add(allBkg, title='background', color=ROOT.TColor.GetColor('#1f78b4'), isData=False, spImpose=False, isSyst=False) if plotData: dtitle = 'pseudo-data' if showPseudoData else 'Data' p.add(dataH, title=dtitle, color=1, isData=True, spImpose=False, isSyst=False) if fidsigH: p.add(fidsigH.Clone(), title=title + '#scale[0.8]{(%d)}' % mass, color=ROOT.TColor.GetColor('#fdc086'), isData=False, spImpose=True, isSyst=False) if showAllBkgs and outfidsigH: p.add(outfidsigH.Clone(), title='non-fiducial', color=ROOT.TColor.GetColor('#a6cee3'), isData=False, spImpose=True, isSyst=False) p.ratiorange = [0.68, 1.32] subcatName = 'low pileup' if icat == 0 else 'high pileup' if angle: extraText = '%s, %d#murad\\%s' % (channel, angle, subcatName) else: extraText = '%s, inclusive\\%s' % (channel, subcatName) if r95: extraText += '\\#mu_{95}(exp.)<%3.3f' % r95 if sig: extraText += '\\S(exp.)=%3.3f' % sig p.show('./', lumi * 1000, extraText=extraText) colors = [ROOT.kGreen + 1, ROOT.kAzure + 3, ROOT.kRed + 2] #background systs if angle: p = Plot('%s_%s_a%d_cat%d_bkgunc' % (name, v, angle, icat)) else: p = Plot('%s_%s_inc_cat%d_bkgunc' % (name, v, icat)) p.noErrorsOnRatio = True p.doPoissonErrorBars = False p.xtit = 'Missing mass [GeV]' p.ytit = 'Events' p.add(bkgH, title='background', color=1, isData=True, spImpose=False, isSyst=False) ic = 0 for syst, title in [('Up', 'Pileup spec.'), ('SingleDiffUp', 'Single diff.')]: if angle: p.add(fIn.Get('bkg_%s_a%d_%d_bkgShape%s' % (v, angle, icat, syst)), title=title, color=colors[ic], isData=False, spImpose=False, isSyst=False) else: p.add(fIn.Get('bkg_%s_inc_%d_bkgShape%s' % (v, icat, syst)), title=title, color=colors[ic], isData=False, spImpose=False, isSyst=False) ic += 1 p.ratiorange = [0.76, 1.24] if angle: extraText = '%s, %d#murad' % (channel, angle) else: extraText = '%s, inclusive' % (channel) p.show('./', lumi, noStack=True, extraText=extraText) #signal systs if fidsigH: if angle: p = Plot('%s_%s_a%d_cat%d_sigunc' % (name, v, angle, icat)) else: p = Plot('%s_%s_inc_cat%d_sigunc' % (name, v, icat)) fidsigH.Scale(1. / 5.) p.doPoissonErrorBars = False p.noErrorsOnRatio = True p.xtit = 'Missing mass [GeV]' p.ytit = 'Events' p.add(fidsigH, title='signal', color=1, isData=True, spImpose=False, isSyst=False) ic = 0 for syst, title in [('ShapeUp', 'Pileup spec.'), ('CalibUp', 'Time dependence'), ('PzModelUp', 'p_{z}(pp)')]: if angle: p.add(fIn.Get('fidsig_%s_a%d_%d_m%d_sig%s' % (v, angle, icat, mass, syst)), title=title, color=colors[ic], isData=False, spImpose=False, isSyst=False) else: p.add(fIn.Get('fidsig_%s_%d_m%d_sig%s' % (v, icat, mass, syst)), title=title, color=colors[ic], isData=False, spImpose=False, isSyst=False) ic += 1 p.ratiorange = [0.76, 1.24] if angle: extraText = '%s, %d#murad\\m_{X}=%d GeV' % ( channel, angle, mass) else: extraText = '%s, inclusive\\m_{X}=%d GeV' % (channel, mass) p.show('./', lumi, noStack=True, extraText=extraText) #out fiducial signal systs if outfidsigH: if angle: p = Plot('%s_%s_a%d_cat%d_outfidsigunc' % (name, v, angle, icat)) else: p = Plot('%s_%s_inc_cat%d_outfidsigunc' % (name, v, icat)) outfidsigH.Scale(1. / 5.) p.doPoissonErrorBars = False p.noErrorsOnRatio = True p.xtit = 'Missing mass [GeV]' p.ytit = 'Events' p.add(outfidsigH, title='out-fid. signal', color=1, isData=True, spImpose=False, isSyst=False) ic = 0 for syst, title in [('ShapeUp', 'Pileup spec.'), ('CalibUp', 'Time dependence'), ('PzModelUp', 'p_{z}(pp)')]: if angle: p.add(fIn.Get('outfidsig_%s_a%d_%d_m%d_sig%s' % (v, angle, icat, mass, syst)), title=title, color=colors[ic], isData=False, spImpose=False, isSyst=False) else: p.add(fIn.Get('outfidsig_%s_%d_m%d_sig%s' % (v, icat, mass, syst)), title=title, color=colors[ic], isData=False, spImpose=False, isSyst=False) ic += 1 p.ratiorange = [0.76, 1.24] if angle: extraText = '%s, %d#murad\\m_{X}=%d GeV' % ( channel, angle, mass) else: extraText = '%s, inclusive\\m_{X}=%d GeV' % (channel, mass) p.show('./', lumi, noStack=True, extraText=extraText) except Exception as e: print e pass fIn.Close()
plot.mcUnc = 0.0 totalMC = sigH.Clone('tmptotal') totalMC.Reset('ICE') for h in plot.mc: totalMC.Add(plot.mc[h]) plot.normUncGr = ROOT.TGraphErrors(totalMC) plot.normUncGr.SetFillStyle(3354) plot.normUncGr.SetFillColor(ROOT.kGray + 3) plot.normUncGr.SetMarkerStyle(1) plot.normUncGr.SetLineColor(1) plot.normUncGr.SetName("normuncgr") plot.normUncGr.SetTitle('Stat #oplus syst') totalMC.Delete() plot.show(outDir="plots/", lumi=35882, extraText=extraText, saveTeX=countOnly) def main(): os.system('mkdir -p plots') plots = sys.argv[1].split(',') chList = "eehighpt1b,eehighpt2b,eelowpt1b,eelowpt2b" chList += ",mmhighpt1b,mmhighpt2b,mmlowpt1b,mmlowpt2b" chList += ",emhighpt1b,emhighpt2b,emlowpt1b,emlowpt2b" if len(sys.argv) > 2: chList = sys.argv[2] plotter = 'root://eoscms//eos/cms/store/cmst3/group/top/TOP17010/final/0c522df/plots/plotter.root' if len(sys.argv) > 3: plotter = sys.argv[3]
def drawPlots(): """draw final plots comparing distributions in data""" def fillHistos(fIn, histos, era, ch): eraKey = (era, ch) for k in fIn.GetListOfKeys(): kname = k.GetName() hname = kname.split('_')[0] tag = ''.join(kname.split('_')[1:]) key = (hname, tag) if not key in histos: histos[key] = {} histos[key][eraKey] = k.ReadObj().Clone(kname + '%s_%d' % (era, ch)) histos[key][eraKey].SetDirectory(0) histos[key][eraKey].GetYaxis().SetTitle('PDF') return histos histos = {} for era, ch in list(product(list('BCDEF'), [11 * 11, 13 * 13])): fIn = ROOT.TFile.Open('RPcontrol_era%s_ch%d.root' % (era, ch)) fillHistos(fIn, histos, era, ch) fIn.Close() perAlgo = ['multi', 'px', 'strip'] perAlgoPlusInc = perAlgo + [''] + ['a120', 'a130', 'a140', 'a150'] perSide = product(perAlgo, ['pos', 'posinc', 'neg', 'neginc']) colors = ["#fdc086", "#7fc97f", "#DCDCDC", 633, "#386cb0", 9] for d, tags in [ #('n', perSide), #('csi', perSide), #('mpp', perAlgo), ##('mmass', perAlgo), ('nvtx', perAlgoPlusInc), #('xangle', perAlgoPlusInc), ('ptll', perAlgoPlusInc), #('nch', perAlgoPlusInc), #('rue', perAlgoPlusInc), #('met', perAlgoPlusInc), #('dphimetz', perAlgoPlusInc), ]: hglobal = None hperAlgo = {} hperXangle = {} for tag in tags: hinc = None hperEra = {} hperCh = {} key = (d, ''.join(tag)) if not key in histos: continue for eraKey, h in histos[key].items(): era, ch = eraKey #global inclusive histogram if len(tag) == 0: print key, eraKey if hglobal is None: hglobal = h.Clone(d + '_global') hglobal.SetDirectory(0) else: hglobal.Add(h) #inclusive histogram (this tag only) if hinc is None: hinc = h.Clone(d + '_inc') hinc.SetDirectory(0) else: hinc.Add(h) #per angle histos if len(tag) == 4 and tag[0] == 'a': xangle = tag[1:] print key, xangle if not xangle in hperXangle: hperXangle[xangle] = h.Clone(d + '_' + xangle) hperXangle[xangle].SetDirectory(0) else: hperXangle[xangle].Add(h) #per era histogram if not era in hperEra: hperEra[era] = h.Clone('%s_%s' % (d, era)) hperEra[era].SetDirectory(0) else: hperEra[era].Add(h) #per ch histogram if not ch in hperCh: hperCh[ch] = h.Clone('%s_%d' % (d, ch)) hperCh[ch].SetDirectory(0) else: hperCh[ch].Add(h) #per algo histogram algo = tag algoExtra = None if d == 'csi' and not 'inc' in tag[1]: algo = tag[0] algoExtra = '_pos' if 'pos' in tag[1] else '_neg' if isinstance(algo, str) and (algo in perAlgo + ['']): algoKey = algo if algoExtra: algoKey += algoExtra if not algoKey in hperAlgo: hperAlgo[algoKey] = h.Clone('%s_%s' % (d, algoKey)) hperAlgo[algoKey].SetDirectory(0) else: hperAlgo[algoKey].Add(h) if hinc is None: continue hinc.Scale(1. / hinc.Integral()) #per era p = Plot('%s_%s_perEra' % key, com='13 TeV') p.savelog = True p.range = [1e-3, 1] p.doPoissonErrorBars = False for i, era in enumerate(hperEra.keys()): hperEra[era].Scale(1. / hperEra[era].Integral()) p.add(hperEra[era], title=era, color=colors[i], isData=False, spImpose=False, isSyst=False) p.add(hinc.Clone(), title='total', color=1, isData=False, spImpose=True, isSyst=False) p.show(outDir='./', lumi=37500, noStack=True) #per ch p = Plot('%s_%s_perCh' % key, com='13 TeV') p.savelog = True p.range = [1e-3, 1] p.doPoissonErrorBars = False for i, ch in enumerate(hperCh.keys()): hperCh[ch].Scale(1. / hperCh[ch].Integral()) p.add(hperCh[ch], title='ee' if ch == 11 * 11 else '#mu#mu', color=colors[i], isData=False, spImpose=False, isSyst=False) p.add(hinc.Clone(), title='total', color=1, isData=False, spImpose=True, isSyst=False) p.show(outDir='./', lumi=37500, noStack=True) #per xangle p = Plot('%s_perxangle' % d, com='13 TeV') p.savelog = True p.range = [1e-3, 1] p.doPoissonErrorBars = False for i, xangle in enumerate(['120', '130', '140', '150']): hperXangle[xangle].Scale(1. / hperXangle[xangle].Integral()) spImpose = True if xangle == '' else False title = '%s#murad' % xangle ci = colors[i] p.add(hperXangle[xangle], title=title, color=ci, isData=False, spImpose=spImpose, isSyst=False) if hglobal: hglobal.Scale(1. / hglobal.Integral()) p.add(hglobal.Clone(), title='total', color=1, isData=False, spImpose=True, isSyst=False) try: p.show(outDir='./', lumi=37500, noStack=True) except Exception as e: print d, e #per algo p = Plot('%s_peralgo' % d, com='13 TeV') p.savelog = True p.range = [1e-3, 1] p.doPoissonErrorBars = False for i, algo in enumerate(hperAlgo.keys()): hperAlgo[algo].Scale(1. / hperAlgo[algo].Integral()) spImpose = True if algo == '' else False title = 'inclusive' if algo == '' else algo title = title.replace('_pos', ' (+)') title = title.replace('_neg', ' (-)') ci = colors[i] if algo != '' else 1 p.add(hperAlgo[algo], title=title, color=ci, isData=False, spImpose=spImpose, isSyst=False) p.show(outDir='./', lumi=37500, noStack=True)
def main(args): parser = argparse.ArgumentParser(description='usage: %prog [options]') parser.add_argument( '-i', '--input', dest='input', default= '/eos/cms/store/cmst3/user/psilva/ExclusiveAna/final/ab05162/analysis_0p04/', help='input directory with the files [default: %default]') parser.add_argument( '--sig', dest='sig', default= '{boson}_m_X_{mass}_xangle_{xangle}_2017_preTS2_opt_v1_simu_reco.root', help='signal point [%default]') parser.add_argument('--massList', dest='massList', default='800,1000,1200', help='signal mass list (CSV) [%default]') parser.add_argument( '--selCuts', dest='selCuts', default='bosonpt>40 && l1pt>30 && l2pt>20', help='preselection for Z categories [default: %default]') parser.add_argument('--doPerAngle', dest='doPerAngle', default=False, help='do per crossing angle [default: %default]', action='store_true') parser.add_argument('--lumi', dest='lumi', default=37500., type=float, help='integrated luminosity [default: %default]') parser.add_argument('-o', '--output', dest='output', default='analysis/bkg', help='Output directory [default: %default]') opt = parser.parse_args(args) ROOT.gROOT.SetBatch(True) ROOT.gStyle.SetOptTitle(0) ROOT.gStyle.SetOptStat(0) os.system('mkdir -p %s' % opt.output) selCuts = [(opt.selCuts, '', 'e#mu')] if opt.doPerAngle: for xangle in VALIDLHCXANGLES: selCuts.append((opt.selCuts + ' && xangle==%d' % xangle, '_%d' % xangle, 'e#mu, %d #murad' % xangle)) for cuts, pfix, catTitle in selCuts: os.system('rm %s/plotter_%s.root' % (opt.output, pfix)) data = fillShapes(inputDir=opt.input, selCuts=cuts, proc='MuonEG') #sigs={} #for m in opt.massList.split(): # if not m in sigs: sigs[m]={} # for xangle in VALIDLHCXANGLES: # newSigs=fillShapes(inputDir=opt.input,selCuts=opt.selCuts,tag=opt.sig.format(mass=m,xangle=xangle)) # for dist in newSigs: # if not dist in sigs[m]: # sigs[m]=newSigs[dist]['data'].Clone('{0}_{1}'.format(dist,m)) # #FIXME scale me according to xsec #FIXME plot me for dist in data: pname = dist + pfix for c in [':', ',', '>', '=', '(', ')', '-', '<', '?']: pname = pname.replace(c, '') p = Plot(pname) p.doChi2 = True p.nominalDistForSystsName = 'background' #if dist=='mmiss': # newBins=range(0,1000,40)+[1000,1100,1200,1500,2000] # print 'Rebinning',dist,'to',newBins # for k in data[dist]: # data[dist][k]=rebinUnequalBinSize(data[dist][k],newBins) #main distributions #doDivideByBinWidth=True if dist=='mmiss' or dist=='(bosony>=0?mmiss:-mmiss)' else False #if doDivideByBinWidth: # p.doPoissonErrorBars=False p.add(data[dist]['data'], title='data', color=ROOT.kBlack, isData=True, spImpose=False, isSyst=False) #,doDivideByBinWidth=doDivideByBinWidth) p.add(data[dist]['bkg'], title='background', color=ROOT.TColor.GetColor('#1f78b4'), isData=False, spImpose=False, isSyst=False) #,doDivideByBinWidth=doDivideByBinWidth) #background systematics for syst in [ '{0}_bkgshape_MuonEG_obsUp', '{0}_bkgshape_MuonEG_obsDown', '{0}_bkgsinglediff_MuonEG_obsDown', '{0}_bkgsinglediff_MuonEG_obsUp' ]: p.add(data[dist][syst.format(dist)], title=syst, color=ROOT.TColor.GetColor('#1f78b4'), isData=False, spImpose=False, isSyst=True) #doDivideByBinWidth=doDivideByBinWidth) #p.ratiorange=[0.78,1.22] #p.ratiorange=[0.58,1.42] p.ratiorange = [0., 2.] p.show(opt.output, opt.lumi, extraText=catTitle) p.appendTo('%s/plotter_%s.root' % (opt.output, pfix)) p.reset()
plot.finalize() plot.mcUnc = 0.0 totalMC = sigH.Clone('tmptotal') totalMC.Reset('ICE') for h in plot.mc: totalMC.Add(plot.mc[h]) plot.normUncGr = ROOT.TGraphErrors(totalMC) plot.normUncGr.SetFillStyle(3444) plot.normUncGr.SetFillColor(1) plot.normUncGr.SetMarkerStyle(1) plot.normUncGr.SetLineColor(1) plot.normUncGr.SetName("normuncgr") plot.normUncGr.SetTitle('Stat #oplus norm') totalMC.Delete() plot.show(outDir="plots/", lumi=35922, extraText=extraText) def main(): os.system('mkdir -p plots') plots = sys.argv[1].split(',') chList = "eehighpt1b,eehighpt2b,eelowpt1b,eelowpt2b" chList += ",mmhighpt1b,mmhighpt2b,mmlowpt1b,mmlowpt2b" chList += ",emhighpt1b,emhighpt2b,emlowpt1b,emlowpt2b" if len(sys.argv) > 2: chList = sys.argv[2] plotter = 'root://eoscms//eos/cms/store/cmst3/group/top/TOP17010/final/0c522df/plots/plotter.root' if len(sys.argv) > 3: plotter = sys.argv[3]
def drawPlots(data, mc, period): """draw final plots comparing distributions in data and in mc""" files = {'data': data, 'mc': mc} base = 'passStrip' baseTitle = '=2 strip' base = 'passPix' baseTitle = '=2 px' for d, pfix in [ ('xangle', ''), #('nvtx',''), ('yboson',''), ('dyboson',''), #('n','RP003'), ('n','RP023'), ('n','RP103'), ('n','RP123'), #('csi','RP003'), ('csi','RP023'), ('csi','RP103'), ('csi','RP123'), ('mpp', 'far'), ('mpp', 'near'), ('mmass', 'far'), ('mmass', 'near'), #('dmpp',''), ('dmmass',''), ]: hpercat = {} for tag in ['', 'matched']: for x in files: for cat in [base, 'passPixandpassStrip']: try: hpercat[(x, tag, cat)] = files[x].Get( '%s_%s%s%s' % (d, cat, tag, pfix)) hpercat[(x, tag, cat)].SetDirectory(0) hpercat[(x, tag, cat)].Sumw2() hpercat[(x, tag, cat)].GetYaxis().SetTitle('PDF') except: pass #remove overlap #hpercat[(x,tag,base)].Add(hpercat[(x,tag,'passPixandpassStrip')],-1) #build the total hpercat[(x, tag, 'tot')] = hpercat[(x, tag, base)].Clone( 'tot_%s_%s' % (d, tag)) hpercat[(x, tag, 'tot')].Add(hpercat[(x, tag, 'passPixandpassStrip')]) hpercat[(x, tag, 'tot')].SetDirectory(0) ntot = hpercat[(x, tag, 'tot')].Integral() continue for cat in [base, 'passPixandpassStrip']: hpercat[(x, tag, cat)].Scale(1. / ntot) if tag == '': print base, hpercat[('data', '', base)].Integral() print base + 'passPixandpassStrip', hpercat[( 'data', '', 'passPixandpassStrip')].Integral() print '\t', hpercat[('data', '', base)].Integral() / hpercat[ ('data', '', 'passPixandpassStrip')].Integral() continue if tag == 'matched': continue p = Plot('%s%s_%s_era%s' % (d, pfix, tag, period), com='13 TeV') p.savelog = True p.range = [1e-3, 1] p.doPoissonErrorBars = False p.add(hpercat[('data', tag, base)], title=baseTitle, color=633, isData=False, spImpose=False, isSyst=False) p.add(hpercat[('data', tag, 'passPixandpassStrip')], title='=2 px+strip', color="#fdc086", isData=False, spImpose=False, isSyst=False) try: hpercat[('mc', tag, 'tot')].Scale( 1. / hpercat[('mc', tag, 'tot')].Integral()) p.add(hpercat[('mc', tag, 'tot')], title='signal', color=1, isData=False, spImpose=True, isSyst=False) except: pass p.show(outDir='./', lumi=37500, noStack=False) continue #efficiency effgr = {} for x, ms in [('data', 20), ('mc', 24)]: effgr[x] = ROOT.TGraphAsymmErrors() effgr[x].Divide(hpercat[(x, 'matched', 'tot')], hpercat[(x, '', 'tot')]) effgr[x].SetMarkerStyle(ms) effgr[x].SetTitle(x) effgr[x].SetName(x) p = Plot('%s%s_eff_era%s' % (d, pfix, period), com='13 TeV') p.ytit = 'Efficiency' p.xtit = hpercat[(x, 'matched', 'tot')].GetXaxis().GetTitle() p.savelog = False p.range = [1e-3, 1] #p.add(effgr['mc'], title='MC', color=ROOT.kCyan+1, isData=False, spImpose=True, isSyst=False) p.add(effgr['data'], title='Data', color=1, isData=False, spImpose=True, isSyst=False) p.show(outDir='./', lumi=37500, noStack=True)
isSyst=False) totalBkgf0 = hdy.Clone('totalbkgf0') p.add(h=totalBkgf0, title='DY', color=ROOT.kRed + 1, isData=False, spImpose=False, isSyst=False) totalBkg = hdy.Clone('totalbkg') totalBkg.Scale(1 - f * dilFactorBkg) totalBkg.Add(fhsigmix) totalBkg.Scale(totalBkgf0.Integral() / totalBkg.Integral()) p.add(h=totalBkg, title='DY+mix.signal', color=ROOT.kAzure + 1, isData=True, spImpose=False, isSyst=False) extraText = '%d #murad\\m_{X}=%d GeV\\signal fraction: %3.2f\\' % (xangle, mass, f) p.show(outDir='./', lumi=lumi, noStack=True, saveTeX=False, noRatio=False, extraText=extraText) p.reset()
p.ytit = '95% CL limits on #sigma_{fid}#timesBR [pb]' for i in range(len(sys.argv) - 1): name, url = sys.argv[i + 1].split(':') fIn = ROOT.TFile.Open(url) c = fIn.Get('c') gr = c.GetListOfPrimitives().At(2).GetListOfGraphs().At(2) gr.SetLineWidth(3) gr.SetLineStyle(1 + i % 2) p.add(gr, title=name, color=colors[i], isData=False, spImpose=True, isSyst=False) fIn.Close() p.show('./', lumi=37500, noRatio=True) p.reset() p = Plot('limitcomparison_obs') p.spimposeOpt = 'l' p.xtit = 'm_{X} [GeV]' p.ytit = '95% CL limits on #sigma_{fid}#timesBR [pb]' for i in range(len(sys.argv) - 1): name, url = sys.argv[i + 1].split(':') fIn = ROOT.TFile.Open(url) c = fIn.Get('c') gr = c.GetListOfPrimitives().At(2).GetListOfGraphs().At(3) gr.SetLineWidth(3) gr.SetLineStyle(1 + i % 2) p.add(gr, title=name,
def main(): ROOT.gStyle.SetOptStat(0) ROOT.gStyle.SetOptTitle(0) ROOT.gROOT.SetBatch(True) isSingleRP = True if 'single' in sys.argv[1] else False isExc = True if '1exc' in sys.argv[1] else False pfix = 'pxonly' if isSingleRP else '' pfix += 'exc' if isExc else '' hnopu = {} hrpinhpur = {} hout = {} hin = {} for xangle in VALIDLHCXANGLES: for era in 'preTS2', 'postTS2': url = sys.argv[1].format(xangle, era) mass = re.findall(r'\d+', os.path.basename(url))[0] fEra = FPRETS2 if era == 'preTS2' else FPOSTTS2 xsecWgt = SIGNALXSECS[xangle] * LUMI * fEra print url #determine analysis type cats = [4] if isSingleRP else [1, 2, 3, 4] #open file and build te plots fIn = ROOT.TFile.Open(url) data = fIn.Get('data') for icat in cats: if not icat in hnopu: hnopu[icat] = fIn.Get('mmass_mm%dnopu' % icat).Clone( 'hnopu%d' % icat) hnopu[icat].Reset('ICE') hnopu[icat].SetDirectory(0) hrpinhpur[icat] = fIn.Get('mmass_mmrpinhpur%d' % icat).Clone('hrpinhpur%d' % icat) hrpinhpur[icat].Reset('ICE') hrpinhpur[icat].SetDirectory(0) for ch in ['ee', 'mm']: hnopu[icat].Add(fIn.Get('mmass_%s%dnopu' % (ch, icat)), xsecWgt) hrpinhpur[icat].Add( fIn.Get('mmass_%srpinhpur%d' % (ch, icat)), xsecWgt) # # project in-fiducial vs out-fiducial components # data.Draw( "mmiss>>hout(50,0,2500)", "ppsEff*wgt*(!(%s) && protonCat==%d && mmiss>0 && mixType==1)" % (FIDUCIALCUTS, icat), 'goff') h = ROOT.gDirectory.Get('hout') if not icat in hout: hout[icat] = h.Clone('hout%d' % icat) hout[icat].SetDirectory(0) hout[icat].Reset('ICE') hout[icat].Add(h, xsecWgt) data.Draw( "mmiss>>hin(50,0,2500)", "ppsEff*wgt*(%s && protonCat==%d && mmiss>0 && mixType==1)" % (FIDUCIALCUTS, icat), "goff") h = ROOT.gDirectory.Get('hin') if not icat in hin: hin[icat] = h.Clone('hin%d' % icat) hin[icat].SetDirectory(0) hin[icat].Reset('ICE') hin[icat].Add(h, xsecWgt) #final plots for icat in hin: pcatTitle = 'single-single' if not isSingleRP: pcatTitle = 'multi-multi' if icat == 2: pcatTitle = 'multi-single' if icat == 3: pcatTitle = 'single-multi' if icat == 4: pcatTitle = 'single-single' finalExtraText = 'm_{{X}}={0} GeV ({1})'.format(mass, pcatTitle) p = Plot('mmass_{0}_sigacc_{1}{2}'.format(mass, icat, pfix), com='13 TeV') p.saveLog = True p.xtitle = 'Missing mass [GeV]' p.ytitle = 'Events' hin[icat].SetLineWidth(2) p.add(hin[icat], title='in accept.', color=ROOT.kRed, isData=False, spImpose=False, isSyst=False) p.add(hout[icat], title='out accept.', color=ROOT.kBlack, isData=False, spImpose=True, isSyst=False) p.show(outDir='./', lumi=37500, extraText=finalExtraText) p = Plot('mmass_{0}_puonfidsig_{1}{2}'.format(mass, icat, pfix), com='13 TeV') p.saveLog = True p.xtitle = 'Missing mass [GeV]' p.ytitle = 'Events' p.add(hnopu[icat], title='no pileup', color=ROOT.kGray, isData=False, spImpose=False, isSyst=False) p.add(hrpinhpur[icat], title='pileup+cuts', color=1, isData=False, spImpose=True, isSyst=False) p.show(outDir='./', lumi=37500, extraText=finalExtraText)
sigH.Scale(1. / sigH.Integral()) sigH.GetXaxis().SetTitle(t) sigH.GetYaxis().SetTitle('PDF') dyT.Draw(v.format('dy'), 'evwgt*(%s)' % c) dyH = ROOT.gDirectory.Get('dy') dyH.Scale(1. / dyH.Integral()) dyH.GetXaxis().SetTitle(t) dyH.GetYaxis().SetTitle('PDF') p = Plot(v.split(' >>')[0], com='13 TeV') p.frameMin = 0 p.add(dyH, title='DY', color=ROOT.kMagenta + 1, isData=False, spImpose=True, isSyst=False) p.add(sigH, title='#splitline{m_{X}=950 GeV}{#scale[0.5]{120#murad post-TS2}}', color=ROOT.kBlack, isData=False, spImpose=True, isSyst=False) p.show( outDir='./', lumi=37500, ) sigH.Delete() dyH.Delete()
p.spimposeWithErrors = True for ic in [0, 1]: title = histos[ic].GetTitle() histos[ic].GetXaxis().SetTitle('Missing mass [GeV]') histos[ic].GetYaxis().SetTitle('Events') if ic == 0: p.add(h=histos[ic], title=title, color=COLOURS[ic], isData=True, spImpose=False, isSyst=False) else: for frac in [0.001, 0.01, 0.1]: h = histos[ic] idx = len(histos) - 1 histos.append(h.Clone('siginj%d_%d' % (ic, idx))) histos[-1].Scale(frac) histos[-1].Add(histos[0], 1. - frac) title = 'f(sig)=%.g' % frac p.add(h=histos[-1], title=title, color=COLOURS[idx], isData=False, spImpose=False, isSyst=False) p.show(outDir='./', lumi=4776, noStack=True, saveTeX=False, noRatio=False) p.reset()
def main(args): parser = argparse.ArgumentParser(description='usage: %prog [options]') parser.add_argument( '-i', '--input', dest='input', default= '/eos/cms/store/cmst3/user/psilva/ExclusiveAna/final/ab05162/analysis_0p04/', help='input directory with the files [default: %default]') parser.add_argument( '--selCuts', dest='selCuts', default='bosonpt>40 && l1pt>30 && l2pt>20', help='preselection for Z categories [default: %default]') parser.add_argument('--doPerNch', dest='doPerNch', default=False, action='store_true', help='break-down per Nch [default: %default]') parser.add_argument('--doPerEra', dest='doPerEra', default=False, action='store_true', help='break-down per era [default: %default]') parser.add_argument( '--doPerPU', dest='doPerPU', default=False, action='store_true', help='break-down per pileup category [default: %default]') parser.add_argument('--doPerAngle', dest='doPerAngle', default=False, action='store_true', help='break-down per angle [default: %default]') parser.add_argument('--lumi', dest='lumi', default=37500., type=float, help='integrated luminosity [default: %default]') parser.add_argument('-o', '--output', dest='output', default='analysis/bkg', help='Output directory [default: %default]') opt = parser.parse_args(args) ROOT.gROOT.SetBatch(True) ROOT.gStyle.SetOptTitle(0) ROOT.gStyle.SetOptStat(0) os.system('mkdir -p %s' % opt.output) #do all possible combinations of these categories baseCats = ['protonCat==%d' % (i + 1) for i in range(4)] subCats = [''] if opt.doPerEra: subCats += ['era==%d' % int(ord(x)) for x in 'BCDEF'] if opt.doPerPU: subCats += ['nvtx<20', 'nvtx>=20'] if opt.doPerAngle: subCats += ['xangle==%d' % i for i in [120, 130, 140, 150]] if opt.doPerNch: subCats += ['nch<15', 'nch>=15'] catList = list(itertools.product(baseCats, subCats)) outF = '%s/plotter_embkg.root' % opt.output os.system('rm %s' % outF) print '[doBackgroundValidation] with %d variations to test' % len(catList) print '\t output will be available in', outF for i, cat in enumerate(catList): selCut = '' for c in cat: if len(c) == 0: continue selCut += '%s&&' % c selCut += opt.selCuts titleCut = parseTitleFromCut(selCut) print '\t', i, selCut data = fillShapes(inputDir=opt.input, selCuts=selCut, proc='MuonEG') for dist in data: pname = '%s_%d' % (dist, i) for c in [':', ',', '>', '=', '(', ')', '-', '<', '?']: pname = pname.replace(c, '') p = Plot(pname) p.doChi2 = False #True p.nominalDistForSystsName = 'background' #if dist=='mmiss': # newBins=range(0,1000,40)+[1000,1100,1200,1500,2000] # print 'Rebinning',dist,'to',newBins # for k in data[dist]: # data[dist][k]=rebinUnequalBinSize(data[dist][k],newBins) p.add(data[dist]['data'], title='data', color=ROOT.kBlack, isData=True, spImpose=False, isSyst=False) p.add(data[dist]['bkg'], title='background', color=ROOT.kCyan - 6, isData=False, spImpose=False, isSyst=False) #background systematics ci = 1 for syst in [ '{0}_bkgshape_MuonEG_obsUp', '{0}_bkgshape_MuonEG_obsDown', '{0}_bkgsinglediffUp_MuonEG_obs', '{0}_bkgsinglediffDown_MuonEG_obs', ]: ci = ci + 1 p.add( data[dist][syst.format(dist)], title=syst, color=ROOT.kCyan - 6, #ci isData=False, spImpose=False, #True, isSyst=True) #False) #p.ratiorange=[0.78,1.22] p.ratiorange = [0.58, 1.43] p.show(opt.output, opt.lumi, extraText='\\'.join(titleCut)) p.appendTo(outF) p.reset()
p.add(h=simScenariosH[(172.5, 0.90)].Clone(), title=simScenariosH[(172.5, 0.90)].GetTitle(), color=1, isData=True, spImpose=False, isSyst=False, doDivideByBinWidth=True) p.add(h=rwScenariosH[(172.5, 0.90)].Clone(), title=rwScenariosH[(172.5, 0.90)].GetTitle(), color=2, isData=False, spImpose=False, isSyst=False, doDivideByBinWidth=True) #p.add(h=rwScenariosH[(172.5,2.0)].Clone(), title=rwScenariosH[(172.5,2.0)].GetTitle(),color=3,isData=False,spImpose=False,isSyst=False,doDivideByBinWidth=True) p.show('./', lumi=35900, noStack=True) p = Plot('mlbwidth_m_closure', '13 TeV') p.ratiorange = [0.858, 1.142] p.savelog = True p.doPoissonErrorBars = False p.range = (1e-4, 0.014) p.ytit = 'PDF' p.add(h=simScenariosH[(172.5, 1.31)].Clone(), title=simScenariosH[(172.5, 1.31)].GetTitle(), color=1, isData=True, spImpose=False, isSyst=False, doDivideByBinWidth=True) p.add(h=rwScenariosH[(171.5, 1.28)].Clone(),
# # before and after pileup mixing/selection # p = Plot('mmass_{0}_xangle{1}_sig'.format(mass, xangle), com='13 TeV') p.frameMin = 0 p.add(nopu, title='no pileup', color=ROOT.kGray, isData=False, spImpose=False, isSyst=False) p.add(pu, title='pileup', color=1, isData=False, spImpose=True, isSyst=False) finalExtraText = '#scale[0.8]{{m={0} GeV #alpha={1}#murad}}'.format( mass, xangle) p.show(outDir='./', lumi=37500, extraText=finalExtraText) # # in-fiducial vs out-fiducial components # fiducialCuts = 'gencsi1>0.03 & gencsi1<0.13 && gencsi2>0.03 && gencsi2<0.16' data.Draw("mmiss>>hout(50,0,2500)", "ppsEff*wgt*(!(%s) && mmiss>0 && mixType==1)" % fiducialCuts, 'goff') hout = ROOT.gDirectory.Get('hout') hout.SetDirectory(0) hout.Scale(SIGNALXSECS[int(xangle)] * 37500.) hout.GetXaxis().SetTitle('Missing mass [GeV]') hout.GetYaxis().SetTitle('Events') data.Draw("mmiss>>hin(50,0,2500)", "ppsEff*wgt*(%s && mmiss>0 && mixType==1)" % fiducialCuts, "goff")
def drawPlots(data, period): """draw final plots comparing distributions in data and in mc""" base = 'passStrip' baseTitle = '=2 strip' base = 'passPix' baseTitle = '=2 px' for d, pfix in [ ('xangle', ''), ('nvtx', ''), ('yboson', ''), ('dyboson', ''), ('n', 'RP003'), ('n', 'RP023'), ('n', 'RP103'), ('n', 'RP123'), ('csi', 'RP003'), ('csi', 'RP023'), ('csi', 'RP103'), ('csi', 'RP123'), ('mpp', 'far'), ('mpp', 'near'), ('mmass', 'far'), ('mmass', 'near'), ('dmpp', ''), ('dmmass', ''), ]: hpercat = {} for tag in ['', 'matched']: for cat in [base, 'passPixandpassStrip']: try: hpercat[(tag, cat)] = data.Get('%s_%s%s%s' % (d, cat, tag, pfix)) hpercat[(tag, cat)].SetDirectory(0) hpercat[(tag, cat)].Sumw2() hpercat[(tag, cat)].GetYaxis().SetTitle('PDF') except Exception as e: print e pass #build the total hpercat[(tag, 'tot')] = hpercat[(tag, base)].Clone('tot_%s_%s' % (d, tag)) hpercat[(tag, 'tot')].Add(hpercat[(tag, 'passPixandpassStrip')]) hpercat[(tag, 'tot')].SetDirectory(0) ntot = hpercat[(tag, 'tot')].Integral() continue for cat in [base, 'passPixandpassStrip']: hpercat[(tag, cat)].Scale(1. / ntot) if tag == '': print base, hpercat[('', base)].Integral() print base + 'passPixandpassStrip', hpercat[( '', 'passPixandpassStrip')].Integral() print '\t', hpercat[('', base)].Integral() / hpercat[ ('', 'passPixandpassStrip')].Integral() continue if tag == 'matched': continue p = Plot('%s%s_%s_era%s' % (d, pfix, tag, period), com='13 TeV') p.savelog = True p.range = [1e-3, 1] p.doPoissonErrorBars = False p.add(hpercat[(tag, base)], title=baseTitle, color=633, isData=False, spImpose=False, isSyst=False) p.add(hpercat[(tag, 'passPixandpassStrip')], title='=2 px+strip', color="#fdc086", isData=False, spImpose=False, isSyst=False) p.show(outDir='./', lumi=37500, noStack=False) continue
def showShapes(resultsDir,name,plotTitle,mass,boson,lumi,plotData=True,showPseudoData=True,showAllBkgs=True,plotpfix=''): """ show the shapes corresponding to a given analysis """ colors=[ROOT.kGreen+1,ROOT.kAzure+3,ROOT.kOrange+2,ROOT.kGray,ROOT.kRed+2] shapeFiles=[os.path.join(resultsDir,f) for f in os.listdir(resultsDir) if 'shapes_' in f and '.root' in f] for f in shapeFiles: fIn=ROOT.TFile.Open(f) #check consistency of the file with the boson to plot if 'shapes_22' in f and boson=='g': v='g' channel='#gamma' elif 'shapes_169' in f and boson=='z': v='zmm' channel='Z#rightarrow#mu#mu' elif 'shapes_121' in f and boson=='z': v='zee' channel='Z#rightarrowee' else: continue bkgH = fIn.Get('bkg_%s'%v) fidsigH = fIn.Get('fidsig_%s_m%d'%(v,mass)) outfidsigH = fIn.Get('outfidsig_%s_m%d'%(v,mass)) dataH = fIn.Get('data_obs_%s'%(v)) if showPseudoData: dataH.Reset('ICE') nexp=bkgH.Integral() if fidsigH: nexp+=bkgH.Integral() if outfidsigH: nexp+=outfidsigH.Integral() for iev in range( ROOT.gRandom.Poisson( nexp ) ): dataH.Fill( bkgH.GetRandom() ) try: p=Plot('%s_%s_inc%s'%(name,v,plotpfix)) p.xtit='Missing mass [GeV]' p.ytit='Events' if fidsigH: p.add(fidsigH, title='fiducial #scale[0.8]{(%d)}'%mass, color=ROOT.TColor.GetColor('#fdc086'), isData=False, spImpose=False, isSyst=False) if showAllBkgs: if outfidsigH: p.add(outfidsigH, title='non-fiducial', color=ROOT.TColor.GetColor('#a6cee3'), isData=False, spImpose=False, isSyst=False) p.add(bkgH, title='background', color=ROOT.TColor.GetColor('#1f78b4'), isData=False, spImpose=False, isSyst=False) else: allBkg=bkgH.Clone('allbkg') if outfidsigH : allBkg.Add(outfidsigH) p.add(allBkg, title='background', color=ROOT.TColor.GetColor('#1f78b4'), isData=False, spImpose=False, isSyst=False) if plotData: dtitle='pseudo-data' if showPseudoData else 'Data' p.add(dataH, title=dtitle, color=1, isData=True, spImpose=False, isSyst=False) if fidsigH: p.add(fidsigH.Clone(), title=plotTitle+'#scale[0.8]{(%d)}'%mass, color=ROOT.TColor.GetColor('#fdc086'), isData=False, spImpose=True, isSyst=False) if showAllBkgs and outfidsigH: p.add(outfidsigH.Clone(), title='non-fiducial', color=ROOT.TColor.GetColor('#a6cee3'), isData=False, spImpose=True, isSyst=False) p.ratiorange=[0.68,1.32] p.show('./',lumi*1000,extraText=plotTitle) #background systs p=Plot('%s_%s_inc_bkgunc%s'%(name,v,plotpfix)) p.noErrorsOnRatio=True p.doPoissonErrorBars=False p.xtit='Missing mass [GeV]' p.ytit='Events' p.add(bkgH, title='background', color=1, isData=True,spImpose=False, isSyst=False) ic=0 for syst,title in [('Up', 'e#mu mix'), ('SingleDiffUp', 'single arm mix')]: h=fIn.Get('bkg_%s_bkgShape%s'%(v,syst)) p.add(h, title=title, color=colors[ic], isData=False, spImpose=False, isSyst=False) ic+=1 p.ratiorange=[0.76,1.24] p.show('./',lumi,noStack=True,extraText=plotTitle) #signal systs if fidsigH: p=Plot('%s_%s_sigunc%s'%(name,v,plotpfix)) #fidsigH.Scale(1./5.) p.doPoissonErrorBars=False p.noErrorsOnRatio=True p.xtit='Missing mass [GeV]' p.ytit='Events' p.add(fidsigH, title='signal', color=1, isData=True,spImpose=False, isSyst=False) ic=0 for syst,title in [('ShapeUp', 'e#mu mix.'), ('CalibUp', 'Time dependence'), ('PPSEffUp', 'PPS efficiency'), ('PzModelUp', 'p_{z}(pp)')]: h=fIn.Get('fidsig_%s_m%d_sig%s'%(v,mass,syst)) print ic,syst,title,h p.add(h, title=title, color=colors[ic], isData=False, spImpose=False, isSyst=False) ic+=1 p.ratiorange=[0.5,1.46] p.show('./',lumi,noStack=True,extraText=plotTitle) #out fiducial signal systs if outfidsigH: p=Plot('%s_%s_outfidsigunc%s'%(name,v,plotpfix)) #outfidsigH.Scale(1./5.) p.doPoissonErrorBars=False p.noErrorsOnRatio=True p.xtit='Missing mass [GeV]' p.ytit='Events' p.add(outfidsigH, title='out-fid. signal', color=1, isData=True,spImpose=False, isSyst=False) ic=0 for syst,title in [('ShapeUp', 'e#mu mix.'), ('CalibUp', 'Time dependence'), ('PPSEffUp', 'PPS efficiency'), ('PzModelUp', 'p_{z}(pp)')]: h=fIn.Get('outfidsig_%s_m%d_sig%s'%(v,mass,syst)) p.add(h, title=title, color=colors[ic], isData=False, spImpose=False, isSyst=False) ic+=1 p.ratiorange=[0.5,1.46] p.show('./',lumi,noStack=True,extraText=plotTitle) except Exception as e: print e pass fIn.Close()
'wzb', 'ZeroBias (weighted)', lw=1, lc=ROOT.kRed, ms=1, weights=weights) for key in zbh: p = Plot('%s_2017%s' % (key, era), com='13 TeV') p.doPoissonErrorBars = False p.add(zbh[key], title=zbh[key].GetTitle(), color=ROOT.kGray, isData=False, spImpose=False, isSyst=False) p.add(wzbh[key], title=wzbh[key].GetTitle(), color=ROOT.kRed, isData=False, spImpose=False, isSyst=False) p.add(mmh[key], title=mmh[key].GetTitle(), color=1, isData=True, spImpose=False, isSyst=False) p.show(outDir='./', lumi=41833, noStack=True)