def save(name): hm.SetHisto(name) hm.Save(outname = outpath+'/'+name, htag = '') s = Stack(outpath = outpath+'/plots/') s.SetColors(colors) s.SetProcesses(processes) s.SetLumi(GetLumi(year)) s.SetOutName(name) s.SetHistosFromMH(hm) s.DrawStack(vardic[name] if name in vardic.keys() else '', 'Events')
def StackPlot(var = 'mt2', xtit = 'm_{T2} (GeV)'): hm = HistoManager(process, syst, path=path) hm.ReadHistosFromFile(var) hm.GetDataHisto() s = Stack(outpath=outpath) s.SetColors(colors) s.SetProcesses(processes) s.SetLumi(GetLumi(year)) s.SetOutName('stack_'+var) s.SetHistosFromMH(hm) s.DrawStack(xtit, 'Events')
def DrawHisto(self, doSF=False, name='', chan='', level='', rebin=1, log=True): self.SetChanAndLevel('', level) self.SetMode('SF' if doSF else 'OF') if name == '': name = 'DYDD_%s_%s' % ('SF' if doSF else 'OF', self.GetLevel()) hData = self.GetDYhisto(chan, level, True) hMC = self.GetDYhisto(chan, level, False) hemu = self.GetDYhisto('ElMu', level, True) hData.SetMarkerStyle(20) hData.SetMarkerColor(1) hData.SetLineColor(1) hData.SetMarkerSize(1.3) hMC.SetFillStyle(1000) hMC.SetLineColor(kAzure - 8) hMC.SetFillColor(kAzure - 8) hemu.SetFillStyle(1000) hemu.SetLineColor(kGray) hemu.SetFillColor(kGray) hData.Rebin(rebin) hemu.Rebin(rebin) hMC.Rebin(rebin) ke, kee = self.GetKfactor(elname) km, kme = self.GetKfactor(muname) hemu.Scale(0.5 * (ke if chan == 'ElE' else km)) hs = THStack() hs.Add(hemu) hs.Add(hMC) lab = 'e^{#pm}e^{#mp}' if chan == 'ElEl' else '#mu^{#pm}#mu^{#mp}' rlab = 'ee' if chan == 'ElEl' else '#mu#mu' processes = [ 'Z/#gamma*#rightarrow %s' % (lab), '0.5 k_{%s} #times Data(e#mu)' % rlab ] colors = {processes[0]: kAzure - 9, processes[1]: kGray} s = Stack(doRatio=False) s.SetXtitle(size=0.06, offset=0.8, nDiv=510, labSize=0.05) s.SetTextCMS(cmstex='CMS', x=0.13, y=0.88, s=0.06) s.SetTextCMSmode(texcmsMode='Preliminary', x=0.225, y=0.875, s=0.052) s.SetLumi(304.32) s.SetTextLumi(texlumi='%2.1f pb^{-1} (5.02 TeV)', texlumiX=0.68, texlumiY=0.95, texlumiS=0.045) s.SetDataHisto(hData) s.SetColors(colors) s.SetStack(hs) s.SetOutName('DYestimate_%s%s' % (chan, level) + ('_log' if log else '')) s.SetOutPath(self.outpath) plotMinimum = 0.5 if log else 0 plotMaxScale = 10 if log else 1.3 s.SetLogY(log) s.SetPlotMaxScale(plotMaxScale) s.SetPlotMinimum(plotMinimum) maximum = hData.GetMaximum() * (5 if log else 1.2) s.AddLine(76, 0.5, 76, maximum) s.AddLine(106, 0.5, 106, maximum) s.processes = processes s.SetLegendPos(x0=0.60, y0=0.55, x1=0.93, y1=0.91, size=0.042, ncol=1) s.DrawStack('m_{%s} (GeV)' % rlab)
def StackPlot(var='NJets', ch='ElMu', lev='2jets', blind=False, ratiolims=[0.4, 1.6], binlabels='', rangeX=[0, 0]): hm = HistoManager(processes, syst, path=path) fname = '%s%s%s' % (var, ('_' + ch) if ch != '' else '', ('_' + lev) if lev != '' else '') hm.ReadHistosFromFile(fname, rebin=(rebin[var] if var in rebin.keys() else 1)) hm.AddNormUnc(normunc) hm.GetDataHisto() s = Stack(outpath=outpath + '/stackplots/') s.SetRangeX(rangeX) s.SetColors(colors) s.SetProcesses(processes) s.SetLumi(Lumi) s.SetRangeX(ran[var][lev] if var in ran and ( isinstance(ran[var], dict) and lev in ran[var].keys()) else ( ran[var] if var in ran.keys() else [0, 0])) s.SetHistoPadMargins(top=0.08, bottom=0.10, right=0.06, left=0.10) s.SetRatioPadMargins(top=0.03, bottom=0.40, right=0.06, left=0.10) s.SetTextLumi(texlumi='%2.1f pb^{-1} (5.02 TeV)', texlumiX=0.62, texlumiY=0.97, texlumiS=0.05) if binlabels != '': s.SetBinLabels(binlabels) s.SetOutName('stack_' + fname) s.SetHistosFromMH(hm) s.SetTextChan(pltlabel[ch][lev] if (ch in pltlabel and lev in pltlabel[ch]) else '', x=0.18, s=0.036) xtit = titdic[var] if var in titdic else '' if ('%s') in xtit: xtit = xtit % pltlabel[ch]['dilepton'] rmin, rmax = ratiolims s.SetRatioMin(rmin) s.SetRatioMax(rmax) s.SetYratioTitle('Data/Pred.') s.SetPlotMaxScale(1.8) # blind if blind: hData = s.TotMC.Clone("Asimov") hData.SetLineWidth(0) hData.SetMarkerStyle(20) hData.SetMarkerColor(kGray) hData2 = hData.Clone("Asimov2") hData2.Divide(hData) s.SetDataHisto(hData) s.SetRatio(hData2) s.DrawStack(xtit, 'Events') if var == 'NJets' and lev == 'dilepton': s.SetLogY() s.SetPlotMaxScale(100) s.SetPlotMinimum(0.5) s.SetOutName('stack_log_' + fname) s.DrawStack(xtit, 'Events')
def StackPlotFancyRatios(var = 'mt2', xtit = 'm_{T2} (GeV)'): pr = [ 'ttZ', 'tW', 'Othernonprompt', 'tWnonprompt', 'Semileptonictt', 'ttDilepNonprompt', 'ttnongaus', 'ttgaus', 'tt'] if isinstance(year, str): if chan=='all': hm = HistoManager(pr, syst, path=GetOutPath(2016, region, 'emu' , ms, ml), signalList = 'stop'); hm .ReadHistosFromFile(var) hm17 = HistoManager(pr, syst, path=GetOutPath(2017, region, 'emu' , ms, ml), signalList = 'stop'); hm17 .ReadHistosFromFile(var) hm18 = HistoManager(pr, syst, path=GetOutPath(2018, region, 'emu' , ms, ml), signalList = 'stop'); hm18 .ReadHistosFromFile(var) hmee = HistoManager(pr, syst, path=GetOutPath(2016, region, 'ee' , ms, ml), signalList = 'stop'); hmee .ReadHistosFromFile(var) hm17ee = HistoManager(pr, syst, path=GetOutPath(2017, region, 'ee' , ms, ml), signalList = 'stop'); hm17ee.ReadHistosFromFile(var) hm18ee = HistoManager(pr, syst, path=GetOutPath(2018, region, 'ee' , ms, ml), signalList = 'stop'); hm18ee.ReadHistosFromFile(var) hmmm = HistoManager(pr, syst, path=GetOutPath(2016, region, 'mumu' , ms, ml), signalList = 'stop'); hmmm .ReadHistosFromFile(var) hm17mm = HistoManager(pr, syst, path=GetOutPath(2017, region, 'mumu' , ms, ml), signalList = 'stop'); hm17mm.ReadHistosFromFile(var) hm18mm = HistoManager(pr, syst, path=GetOutPath(2018, region, 'mumu' , ms, ml), signalList = 'stop'); hm18mm.ReadHistosFromFile(var) hm.Add(hm17).Add(hm18).Add(hmee).Add(hm17ee).Add(hm18ee).Add(hmmm).Add(hm17mm).Add(hm18mm) else: hm = HistoManager(pr, syst, path=GetOutPath(2016, region, chan, ms, ml), signalList = 'stop') hm.ReadHistosFromFile(var) hm17 = HistoManager(pr, syst, path=GetOutPath(2017, region, chan, ms, ml), signalList = 'stop') hm17.ReadHistosFromFile(var) hm18 = HistoManager(pr, syst, path=GetOutPath(2018, region, chan, ms, ml), signalList = 'stop') hm18.ReadHistosFromFile(var) hm.Add(hm17).Add(hm18) else: hm = HistoManager(pr, '', path=path, signalList = 'stop') hm.ReadHistosFromFile(var) #hm.AddNormUnc({'tt':0.06, 'ttgaus':0.06, 'ttnongaus':0.3, 'ttDilepNonprompt':30, 'Semileptonictt':0.3, 'tWnonprompt':0.3, 'Nonprompt':0.3, 'ttZ':0.3,'tW':0.15}) outdir = GetWebpath(year, region, chan, ms, ml) s = Stack(outpath=outdir+'/stackplots/') s.SetLegendName(legendNames) s.SetColors(colors) s.SetProcesses(pr) s.SetLumi(GetLumi(year) if isinstance(year, int) else (GetLumi(2016) + GetLumi(2017) + GetLumi(2018)) ) s.SetOutName('stack_'+var) s.SetHistosFromMH(hm) s.SetLegendPos(x0 = 0.45, y0 = 0.65, x1 = 0.93, y1 = 0.91, size = 0.035, ncol = 2) s.hRatioStatUnc.SetFillColorAlpha(0, 0) s.hRatioUnc.SetFillColorAlpha(0, 0) if (not var in ['mt2', 'met', 'dnn']) or (region != 'SR'): s.SetDataHisto(hm.indic['data_obs']['data_obs']) else : #hData = hm.GetSumBkg().Clone("Asimov") hData = s.TotMC.Clone("Asimov") hData.SetLineWidth(0); hData.SetMarkerStyle(20); hData.SetMarkerColor(kGray) hData2 = hData.Clone("Asimov2") hData2.Divide(hData) s.SetDataHisto(hData) s.SetRatio(hData2) #s.AddSignalHisto(hm.indic['stop']['stop'], color = kTeal+2, mode = 'ontop', ratioBkg = True) if region == 'SR': s.SetTextChan('SR: BS + p_{T}^{miss} #geq 50, m_{T2} #geq 80') elif region == 'BS': s.SetTextChan('BS: e#mu, #geq 2 jets, #geq 1 btag') elif region == 'ttmt2': s.SetTextChan('BS + met < 50') elif region == 'ttmet': s.SetTextChan('BS + m_{T2} < 80') hbkg=s.TotMC.Clone("Asimov") h1=hm.indic['ttgaus']['ttgaus'].Clone('ttgaus') h1.SetLineColor(colors['ttgaus']);h1.SetLineWidth(3); h1.SetFillColor(0) h1.Divide(hbkg) s.SetRatio(h1) h2=hm.indic['ttnongaus']['ttnongaus'].Clone('ttnongaus') h2.SetLineColor(colors['ttnongaus']);h2.SetLineWidth(3); h2.SetFillColor(0) h2.Divide(hbkg) h3=hm.indic['tt']['tt'].Clone('tt') h3.SetLineColor(colors['tt']);h3.SetLineWidth(3); h3.SetFillColor(0) h3.Divide(hbkg) s.extraRatio.append(h3) s.extraRatio.append(h2) s.extraRatio.append(h1) s.SetRatioMin(0); s.SetRatioMax(1) s.SetYratioTitle('Ratio') s.DrawStack(xtit, 'Events') s.SetLogY() s.SetOutName('stackFancy_'+var+'_log') s.SetPlotMinimum(1.) s.SetPlotMaxScale(1200) s.SetLegendRatioPos(0,0,0,0,0) s.DrawStack(xtit, 'Events')
def DrawPostFit(ms=235, ml=60, htype='fit_s', var='dnn', ch='', year=''): getdir = lambda dirtype, ch: 'shapes_%s/%s/' % (dirtype, ch) getfname = lambda ms, ml: 'postfit_%s_%s_%s' % (var, str(ms), str(ml)) # Get channels if not isinstance(ch, list): if ch == '': ch = ['ee', 'mumu', 'emu'] elif ',' in ch: ch = ch.replace(' ', '').split(',') else: ch = [ch] if not isinstance(year, list): if year == '': year = [2016, 2017, 2018] elif isinstance(year, str) and ',' in year: year = year.replace(' ', '').split(',') else: year = [year] pch = [] for y in year: for c in ch: pch.append(chdic[y][c]) if len(year) == 3: yearname = 'comb' else: yearname = str(year[0]) if len(ch) == 3: chname = 'all' else: chname = ch[0] # test or not depending on var ttname = 'tt' if not 'dnn' in var else 'tt_test' pr = bkg + [ttname] sig = ('stop' if not 'dnn' in var else 'stop_test') if htype != 'fit_b' else [] hm = HistoManager(pr, '', path=pathToPostFit, signalList=sig) pathInTree = [getdir(htype, x) for x in pch] hm.SetPathInTree(pathInTree) hm.ReadHistosFromFile(getfname(ms, ml), dataname='data', rebin=1) hm.ReArrangeDic({ 'Others': ['ttW', 'ttZ', 'Nonprompt', 'VV'], 't#bar{t}+tW': ['tW', ttname], 'Drell-Yan': ['DY'] }) hm.GetDataHisto() #hm.indic['data_obs']['data_obs'] = hm.GetSumBkg() outdir = GetOutpath(region, year, ms, ml, ch) fprocess = ['Others', 'Drell-Yan', 't#bar{t}+tW'] s = Stack(outpath=outdir + '/postfit/') colors['Others'] = kTeal + 2 colors['t#bar{t}+tW'] = colors['tt'] colors['Drell-Yan'] = colors['DY'] s.SetColors(colors) s.SetProcesses(fprocess) s.SetLumi( GetLumi(year[0]) if len(year) == 1 else (GetLumi(2016) + GetLumi(2017) + GetLumi(2018))) outname = htype + '_' + var + '%s_%s_%i_%i' % (yearname, chname, ms, ml) s.SetOutName(outname) s.SetHistosFromMH(hm) #s.Set t = TopHistoReader(pathToPostFit) t.ReComputeStatUnc = False t.SetPathInTree(pathInTree) hbkg = t.GetNamedHisto('total_background', getfname(ms, ml)) hbkg.SetLineStyle(0) hbkg.SetLineWidth(0) hbkg.SetMarkerSize(0) s.SetTotMC(hbkg) s.SetMCunc(hbkg) s.SetMCstatUnc(None) s.SetMCnormUnc(None) s.SetRatioStatUnc(None) s.SetRatioNormUnc(None) s.SetRatioUnc(GetRatioHistoUncFromHisto(hbkg)) s.SetRatioUncStyle() s.SetUncStyle() if sig != []: s.AddSignalHisto(hm.indic[sig][sig], color=kViolet + 2, mode='ontop', ratioBkg=True, name='stop') s.SetTextChan('SR: BS + p_{T}^{miss} #geq 50, m_{T2} #geq 80') s.SetRatioMin(0.5) s.SetRatioMax(1.5) s.SetPlotMaxScale(1.8) xtit = 'DNN score (%i, %i)' % (ms, ml) chlab = '' if chname == 'ee': chlab = 'ee' elif chname == 'mumu': chlab = '#mu#mu' elif chname == 'emu': chlab = 'e#mu' flab = 'Prefit' if htype == 'fit_b': flab = 'Fit background only' elif htype == 'fit_s': flab = 'Fit S+B' mlab = '#splitline{m_{#tilde{t}_{1}} = %1.0f GeV}{m_{#tilde{#chi}_{1}^{0}} = %1.0f GeV}' % ( ms, ml) s.AddTex(flab, x=0.15, y=0.77, s=0.05) s.AddTex(mlab, x=0.15, y=0.62, s=0.04) s.AddTex(chlab, x=0.15, y=0.84, s=0.04) s.DrawStack(xtit, 'Events') s.SetLogY() s.SetZoom(False) if var == 'dnn' and region == 'SR': s.SetZoom(True) s.SetOutName('log_' + outname) s.SetPlotMinimum(1) s.SetPlotMaxScale(1200) s.SetYratioTitle('Ratio')
def save(name, hm, processes=[''], oname=''): hm.SetHisto(name) opath = webpath + '/SS/%s/%s/' % (year, region) if not isinstance(year, str): hm.Save(outname=outpath + '/' + name, htag='') s = Stack(outpath=opath + '/plots%s/' % oname) s.SetLegendName(legendNames) s.SetColors(colors) s.SetProcesses(processes) s.SetLumi( GetLumi(year) if not isinstance(year, str) else GetLumi(2016) + GetLumi(2017) + GetLumi(2018)) s.SetOutName(name) s.SetHistosFromMH(hm) s.SetRatioMin(0.) s.SetRatioMax(2) s.DrawStack(vardic[name] if name in vardic.keys() else '', 'Events')
sys.path.append(basepath) from plotter.TopHistoReader import TopHistoReader, HistoManager from plotter.Plotter import Stack from ROOT.TMath import Sqrt as sqrt from ROOT import kRed, kOrange, kBlue, kTeal, kGreen, kGray, kAzure, kPink, kCyan, kBlack, kSpring, kViolet, kYellow from ROOT import TCanvas, gROOT gROOT.SetBatch(1) year = 2018 #hm.SetHisto(hname, 1) #hm16 = HistoManager(processes, systematics, '', path = path[2016], processDic = processDic[2016], lumi = GetLumi(2016)*1000) #hm17 = HistoManager(processes, systematics, '', path = path[2017], processDic = processDic[2017], lumi = GetLumi(2017)*1000) hm18 = HistoManager(processes, systematics, '', path = path[2018], processDic = processDic[2018], lumi = GetLumi(2018)*1000) s = Stack(outpath = '/nfs/fanae/user/juanr/www/temp/%s/'%year) s.SetColors(colors) s.SetProcesses(processes) s.SetLumi(GetLumi(year))# if not isinstance(year, str) else GetLumi(2016)+GetLumi(2017)+GetLumi(2018)) def Draw(var = 'H_Lep0Pt_ElMu_2jets', ch = 'ElMu', lev = 'dilepton', rebin = 1, xtit = '', ytit = 'Events', doStackOverflow = False, binlabels = '', setLogY = False, maxscale = 1.15): name = 'H_%s_%s_%s'%(var, ch, lev) #hm16.SetStackOverflow(doStackOverflow) #hm17.SetStackOverflow(doStackOverflow) hm18.SetStackOverflow(doStackOverflow) hm18.SetHisto(name, rebin) hm = hm18#hm16.Add(hm17).Add(hm18) s.SetHistosFromMH(hm) s.SetOutName(name) s.SetBinLabels(binlabels)
def StackPlot(var = 'mt2', xtit = 'm_{T2} (GeV)', rebin=1): pr = process.replace(' ', '').split(',')#['VV', 'ttW', 'DY', 'Nonprompt', 'ttZ', 'tW', 'tt'] #pr = ['Others', 'Nonprompt', 'ttZ', 'tW', 'tt'] if year == 'comb': hm = HistoManager(pr, syst, path=GetPath(region, 2016, ms, ml, ch), signalList = 'stop'); hm.SetStackOverflow() hm.ReadHistosFromFile(var,rebin=rebin) hm17 = HistoManager(pr, syst, path=GetPath(region, 2017, ms, ml, ch), signalList = 'stop'); hm17.SetStackOverflow() hm17.ReadHistosFromFile(var,rebin=rebin) hm18 = HistoManager(pr, syst, path=GetPath(region, 2018, ms, ml, ch), signalList = 'stop'); hm18.SetStackOverflow() hm18.ReadHistosFromFile(var,rebin=rebin) hm.Add(hm17).Add(hm18) else: hm = HistoManager(pr, syst, path=path, signalList = 'stop'); hm.SetStackOverflow() hm.ReadHistosFromFile(var, rebin=rebin) hm.AddNormUnc({'tt':0.06, 'Nonprompt':0.3, 'DY':0.3,'ttZ':0.3,'tW':0.15}) hm.GetDataHisto() #if ('mt2' in var or 'met' in var or 'dnn' in var or 'lblb' in var) and region != 'CR': # #del hm.indic['data_obs'] # blind # hm.indic['data_obs']['data_obs'] = hm.GetSumBkg() outdir = GetOutpath(region, year, ms, ml, ch) s = Stack(outpath=outdir+'/stackplots/') s.SetColors(colors) s.SetProcesses(pr) s.SetLumi(GetLumi(year) if isinstance(year, int) else (GetLumi(2016) + GetLumi(2017) + GetLumi(2018)) ) s.SetOutName('stack_'+var) s.SetHistosFromMH(hm) s.SetDataHisto(hm.indic['data_obs']['data_obs']) #if not ('mt2' in var or 'met' in var or 'dnn' in var or 'lblb' in var) or (region == 'CR'): s.SetDataHisto(hm.indic['data_obs']['data_obs']) #else : # #hData = hm.GetSumBkg().Clone("Asimov") # hData = s.TotMC.Clone("Asimov") # hData.SetLineWidth(0); hData.SetMarkerStyle(20); hData.SetMarkerColor(kGray) # hData2 = hData.Clone("Asimov2") # hData2.Divide(hData) # s.SetDataHisto(hData) # s.SetRatio(hData2) s.AddSignalHisto(hm.indic['stop']['stop'], color = kTeal+2, mode = 'ontop', ratioBkg = True) if region == 'SR': s.SetTextChan('SR: BS + p_{T}^{miss} #geq 50, m_{T2} #geq 80') elif region == 'BS': s.SetTextChan('BS: e#mu, #geq 2 jets, #geq 1 btag') elif region == 'CR': s.SetTextChan('BS + met < 50, m_{T2} < 80 ') elif region == 'ttmt2': s.SetTextChan('BS + met < 50') elif region == 'ttmet': s.SetTextChan('BS + m_{T2} < 80') s.SetRatioMin(0.0); s.SetRatioMax(2.5) #s.SetYratioTitle('S/(S+B)') s.SetYratioTitle('Ratio') s.SetPlotMaxScale(2.5) s.DrawStack(xtit, 'Events') s.SetLogY() s.SetOutName('stack_log_'+var) s.SetPlotMinimum(0.1) s.SetPlotMaxScale(1200) s.DrawStack(xtit, 'Events')