class Regression04Threading(MyTestCase): hasThread = gROOT.IsBatch() and 5 or 6 # can't test if no display ... noThread = 5 def test1SpecialCasegROOT(self): """Test the special role that gROOT plays vis-a-vis threading""" cmd = sys.executable + " -c 'import sys, ROOT; ROOT.gROOT; %s "\ "sys.exit( 5 + int(\"thread\" in ROOT.__dict__) )'" if self.hasThread == self.noThread: cmd += " - -b" stat, out = commands.getstatusoutput(cmd % "") self.assertEqual(WEXITSTATUS(stat), self.noThread) stat, out = commands.getstatusoutput(cmd % "ROOT.gROOT.SetBatch( 1 );") self.assertEqual(WEXITSTATUS(stat), self.noThread) stat, out = commands.getstatusoutput(cmd % "ROOT.gROOT.SetBatch( 0 );") self.assertEqual(WEXITSTATUS(stat), self.noThread) stat, out = commands.getstatusoutput( cmd % "ROOT.gROOT.ProcessLine( \"cout << 42 << endl;\" ); ") self.assertEqual(WEXITSTATUS(stat), self.hasThread) stat, out = commands.getstatusoutput(cmd % "ROOT.gDebug;") self.assertEqual(WEXITSTATUS(stat), self.hasThread) def test2ImportStyles(self): """Test different import styles vis-a-vis threading""" cmd = sys.executable + " -c 'import sys; %s ;"\ "import ROOT; sys.exit( 5 + int(\"thread\" in ROOT.__dict__) )'" if self.hasThread == self.noThread: cmd += " - -b" # Do not test 'from ROOT import *' on Python 3.x, since it's not supported if sys.hexversion < 0x300000: stat, out = commands.getstatusoutput(cmd % "from ROOT import *") self.assertEqual(WEXITSTATUS(stat), self.hasThread) stat, out = commands.getstatusoutput(cmd % "from ROOT import gROOT") self.assertEqual(WEXITSTATUS(stat), self.noThread) stat, out = commands.getstatusoutput(cmd % "from ROOT import gDebug") self.assertEqual(WEXITSTATUS(stat), self.hasThread) def test3SettingOfBatchMode(self): """Test various ways of preventing GUI thread startup""" cmd = sys.executable + " -c '%s import ROOT, sys; sys.exit( 5+int(\"thread\" in ROOT.__dict__ ) )'" if self.hasThread == self.noThread: cmd += " - -b" stat, out = commands.getstatusoutput( cmd % 'import ROOT; ROOT.PyConfig.StartGuiThread = 0;') self.assertEqual(WEXITSTATUS(stat), self.noThread) stat, out = commands.getstatusoutput( cmd % 'from ROOT import PyConfig; PyConfig.StartGuiThread = 0; from ROOT import gDebug;' ) self.assertEqual(WEXITSTATUS(stat), self.noThread) stat, out = commands.getstatusoutput( cmd % 'from ROOT import PyConfig; PyConfig.StartGuiThread = 1; from ROOT import gDebug;' ) self.assertEqual(WEXITSTATUS(stat), self.hasThread) # Do not test 'from ROOT import *' on Python 3.x, since it's not supported if sys.hexversion < 0x300000: stat, out = commands.getstatusoutput((cmd % 'from ROOT import *;') + ' - -b') self.assertEqual(WEXITSTATUS(stat), self.noThread) stat, out = commands.getstatusoutput( cmd % 'from ROOT import gROOT; gROOT.SetBatch( 1 ); from ROOT import *;' ) self.assertEqual(WEXITSTATUS(stat), self.noThread) if not gROOT.IsBatch(): # can't test if no display ... stat, out = commands.getstatusoutput( cmd % 'from ROOT import gROOT; gROOT.SetBatch( 0 ); from ROOT import *;' ) self.assertEqual(WEXITSTATUS(stat), self.hasThread)
def pullsVertical(fileName): content = filterPullFile(fileName) nbins, off = len(content), 0.10 b_pulls = TH1F("b_pulls", ";;Pulls", nbins, 0.-off, nbins-off) s_pulls = TH1F("s_pulls", ";;Pulls", nbins, 0.+off, nbins+off) # for i, s in enumerate(content): l = s.split() b_pulls.GetXaxis().SetBinLabel(i+1, l[0]) s_pulls.GetXaxis().SetBinLabel(i+1, l[0]) b_pulls.SetBinContent(i+1, float(l[1])) b_pulls.SetBinError(i+1, float(l[2])) s_pulls.SetBinContent(i+1, float(l[3])) s_pulls.SetBinError(i+1, float(l[4])) b_pulls.SetFillStyle(3005) b_pulls.SetFillColor(923) b_pulls.SetLineColor(923) b_pulls.SetLineWidth(1) b_pulls.SetMarkerStyle(20) b_pulls.SetMarkerSize(1.25) s_pulls.SetLineColor(602) s_pulls.SetMarkerColor(602) s_pulls.SetMarkerStyle(24) #24 s_pulls.SetLineWidth(1) b_pulls.GetYaxis().SetRangeUser(-2.5, 2.5) # Graphs h_pulls = TH2F("pulls", "", 6, -3., 3., nbins, 0, nbins) B_pulls = TGraphAsymmErrors(nbins) S_pulls = TGraphAsymmErrors(nbins) boxes = [] canvas = TCanvas("canvas", "Pulls", 600, 150+nbins*10)#nbins*20) canvas.cd() canvas.SetGrid(0, 1) canvas.GetPad(0).SetTopMargin(0.01) canvas.GetPad(0).SetRightMargin(0.01) canvas.GetPad(0).SetBottomMargin(0.05) canvas.GetPad(0).SetLeftMargin(0.25)#(0.25)#(0.065) canvas.GetPad(0).SetTicks(1, 1) for i, s in enumerate(content): l = s.split() if "1034h" in l[0]: l[0]="CMS_PDF_13TeV" h_pulls.GetYaxis().SetBinLabel(i+1, l[0].replace('CMS2016_', ''))#C #y1 = gStyle.GetPadBottomMargin() #y2 = 1. - gStyle.GetPadTopMargin() #h = (y2 - y1) / float(nbins) #y1 = y1 + float(i) * h #y2 = y1 + h #box = TPaveText(0, y1, 1, y2, 'NDC') #box.SetFillColor(0) #box.SetTextSize(0.02) #box.SetBorderSize(0) #box.SetTextAlign(12) #box.SetMargin(0.005) #if i % 2 == 0: # box.SetFillColor(18) #box.Draw() #boxes.append(box) B_pulls.SetPoint(i+1,float(l[1]),float(i+1)-0.3)#C B_pulls.SetPointError(i+1,float(l[2]),float(l[2]),0.,0.)#C for i, s in enumerate(content): l = s.split() S_pulls.SetPoint(i+1,float(l[3]),float(i+1)-0.7)#C S_pulls.SetPointError(i+1,float(l[4]),float(l[4]),0.,0.)#C h_pulls.GetXaxis().SetTitle("(#hat{#theta} - #theta_{0}) / #Delta#theta") h_pulls.GetXaxis().SetLabelOffset(-0.01) h_pulls.GetXaxis().SetTitleOffset(.6) h_pulls.GetYaxis().SetNdivisions(nbins, 0, 0) B_pulls.SetFillColor(1) B_pulls.SetLineColor(1) B_pulls.SetLineStyle(1) B_pulls.SetLineWidth(2) B_pulls.SetMarkerColor(1) B_pulls.SetMarkerStyle(20) B_pulls.SetMarkerSize(1)#(0.75) S_pulls.SetFillColor(629) S_pulls.SetLineColor(629) S_pulls.SetMarkerColor(629) S_pulls.SetLineWidth(2) S_pulls.SetMarkerStyle(20) S_pulls.SetMarkerSize(1) box1 = TBox(-1., 0., 1., nbins) box1.SetFillStyle(3001) #box1.SetFillStyle(0) box1.SetFillColor(417) box1.SetLineWidth(2) box1.SetLineStyle(2) box1.SetLineColor(417) box2 = TBox(-2., 0., 2., nbins) box2.SetFillStyle(3001) #box2.SetFillStyle(0) box2.SetFillColor(800) box2.SetLineWidth(2) box2.SetLineStyle(2) box2.SetLineColor(800) leg = TLegend(0.1, -0.05, 0.7, 0.08) leg.SetBorderSize(0) leg.SetFillStyle(0) leg.SetFillColor(0) leg.SetNColumns(2) leg.AddEntry(B_pulls, "B-only fit", "lp") leg.AddEntry(S_pulls, "S+B fit", "lp") if text: leg.AddEntry(0, text, "") h_pulls.Draw("") box2.Draw() box1.Draw() B_pulls.Draw("P6SAME") S_pulls.Draw("P6SAME") leg.Draw() # drawCMS(35867, "Preliminary") # drawAnalysis("VH") # drawRegion(outName) canvas.Print(outName+".png") canvas.Print(outName+".pdf") if not gROOT.IsBatch(): raw_input("Press Enter to continue...")
def systematics(sys, isShape=False, antiCorr=False): treeRead = True file = {} hist = {} tree = {} histUp = {} histDown = {} up = {} down = {} gUp = TGraph() gDown = TGraph() gUp.SetLineWidth(3) gDown.SetLineWidth(3) gUp.SetLineColor(632) gDown.SetLineColor(602) BTagAK4deepup = False BTagAK4deepdown = False BTagAK4deep = False BTagAK8deepup = False BTagAK8deepdown = False BTagAK8deep = False # g.SetMarkerStyle(20) # g.SetMarkerColor(418) # g.SetMarkerSize(1.25) var = sys cut = 'nnbbSR' if var == 'BTagAK4Weight_deep_up': var = 'X_mass' BTagAK4deepup = True elif var == 'BTagAK4Weight_deep_down': var = 'X_mass' BTagAK4deepdown = True elif var == 'BTagAK4Weight_deep': var = 'X_mass' BTagAK4deep = True elif var == 'BTagAK8Weight_deep_up': var = 'X_mass' BTagAK8deepup = True elif var == 'BTagAK8Weight_deep_down': var = 'X_mass' BTagAK8deepdown = True elif var == 'BTagAK8Weight_deep': var = 'X_mass' BTagAK8deep = True upAvg, downAvg, upMin, downMin, upMax, downMax = 0., 0., 2., 2., 0., 0. for k in sorted(selection.keys(), key=len, reverse=True): if k in cut: cut = cut.replace(k, selection[k]) for i, s in enumerate(sign): if '_MZ' in s: m = int((s.split('_MZ')[1]).split('_MA')[0]) elif '_M' in s: m = int(s.split('_M')[1]) else: m = 0 if treeRead: # Project from tree tree[s] = TChain("tree") for j, ss in enumerate(sample[s]['files']): if not 'data' in s or ('data' in s and ss in pd): tree[s].Add(NTUPLEDIR + ss + ".root") if variable[var]['nbins'] > 0: min_value = variable[var]['min'] max_value = variable[var]['max'] title = variable[var]['title'] if 'isZtoNN' in cut: if var == 'MET': min_value = 200 max_value = 2000 elif var == 'DPhi': title = "#Delta #varphi (AK8 jet-#slash{E}_{T})" elif var == 'VH_deltaR': title = "#Delta R (#slash{E}_{T}, AK8 jet)" hist[s] = TH1F( s, ";" + title + ";Events;" + ('log' if variable[var]['log'] else ''), variable[var]['nbins'], min_value, max_value) else: hist[s] = TH1F(s, ";" + variable[var]['title'], len(variable[var]['bins']) - 1, array('f', variable[var]['bins'])) hist[s].Sumw2() cutstring = "(eventWeightLumi)" + ("*(" + cut + ")") if var == 'LeptonWeightUp': cutstring = "(eventWeightLumi * LeptonWeightUp/LeptonWeight)" + ( "*(" + cut + ")") elif var == 'LeptonWeightDown': cutstring = "(eventWeightLumi * LeptonWeightDown/LeptonWeight)" + ( "*(" + cut + ")") elif var == 'TriggerWeightUp': cutstring = "(eventWeightLumi * TriggerWeightUp/TriggerWeight)" + ( "*(" + cut + ")") elif var == 'TriggerWeightDown': cutstring = "(eventWeightLumi * TriggerWeightDown/TriggerWeight)" + ( "*(" + cut + ")") #division by BTagAk4Weight_deep is because the weighted samples are used elif BTagAK4deepup: cutstring = "(eventWeightLumi * BTagAK4Weight_deep_up/BTagAK4Weight_deep)" + ( "*(" + cut + ")") elif BTagAK4deepdown: cutstring = "(eventWeightLumi * BTagAK4Weight_deep_down/BTagAK4Weight_deep)" + ( "*(" + cut + ")") elif BTagAK8deep: cutstring = "(eventWeightLumi * BTagAK8Weight_deep)" + ( "*(" + cut + ")") elif BTagAK8deepup: cutstring = "(eventWeightLumi * BTagAK8Weight_deep_up)" + ( "*(" + cut + ")") elif BTagAK8deepdown: cutstring = "(eventWeightLumi * BTagAK8Weight_deep_down)" + ( "*(" + cut + ")") tree[s].Project(s, var, cutstring) if not tree[s].GetTree() == None: hist[s].SetOption("%s" % tree[s].GetTree().GetEntriesFast()) """ for j, ss in enumerate(sample[s]['files']): file[ss] = TFile(NTUPLEDIR + ss + ".root", "READ") tmp = file[ss].Get("Sys/"+sys) if tmp == None: continue if not s in hist.keys(): hist[s] = tmp else: if antiCorr: for x in range(1, hist[s].GetNbinsX()+1): hist[s].SetBinContent(x, hist[s].GetBinContent(x)+tmp.GetBinContent(tmp.GetNbinsX()+1-x)) else: hist[s].Add( tmp ) if isShape: tmp = file[ss].Get("Sys/"+sys+"_up") print "Sys/"+sys+"_up" if tmp == None: continue if not s in histUp.keys(): histUp[s] = tmp else: histUp[s].Add( tmp ) # tmp = file[ss].Get("Sys/"+sys+"_down") if tmp == None: continue if not s in histDown.keys(): histDown[s] = tmp else: histDown[s].Add( tmp ) if 'accept' in sys: norm = None for j, ss in enumerate(sample[s]['files']): tmp = file[ss].Get("Sys/PDF_scale") if tmp == None: continue if norm == None: norm = tmp else: norm.Add( tmp ) hist[s].Divide(norm) """ if (isShape): shape = TF1("shape", "gaus", 0, 5000) shapeUp = TF1("shapeUp", "gaus", 0, 5000) shapeDown = TF1("shapeDown", "gaus", 0, 5000) hist[s].Fit(shape, "Q0", "") histUp[s].Fit(shapeUp, "Q0", "") histDown[s].Fit(shapeDown, "Q0", "") if 'scale' in sys or 'unc' in sys: up[s] = histUp[s].GetMean() / hist[s].GetMean() down[s] = histDown[s].GetMean() / hist[s].GetMean() # up[s] = shapeUp.GetParameter(1)/shape.GetParameter(1) # down[s] = shapeDown.GetParameter(1)/shape.GetParameter(1) elif 'res' in sys: up[s] = histUp[s].GetRMS() / hist[s].GetRMS() down[s] = histDown[s].GetRMS() / hist[s].GetRMS() # up[s] = shapeUp.GetParameter(2)/shape.GetParameter(2) # down[s] = shapeDown.GetParameter(2)/shape.GetParameter(2) else: up[s] = hist[s].GetBinContent( hist[s].FindBin(+1)) / hist[s].GetBinContent( hist[s].FindBin(0)) down[s] = hist[s].GetBinContent( hist[s].FindBin(-1)) / hist[s].GetBinContent( hist[s].FindBin(0)) gUp.SetPoint(i, m, up[s]) gDown.SetPoint(i, m, down[s]) #if mass < 1000: continue upAvg += up[s] downAvg += down[s] if abs(up[s]) > upMax: upMax = abs(up[s]) if abs(up[s]) < upMin: upMin = abs(up[s]) if abs(down[s]) > downMax: downMax = abs(down[s]) if abs(down[s]) < downMin: downMin = abs(down[s]) upAvg /= len(sign) downAvg /= len(sign) print " ---", sys, "--- | up: %.3f, down: %.3f, average: %.3f" % ( upAvg, downAvg, abs(upAvg - 1 + 1. - downAvg) / 2.), "|", "^{%.1f-%.1f}_{%.1f-%.1f}" % (100. * (1. - upMin), 100. * (1. - upMax), 100. * (downMin - 1.), 100. * (downMax - 1.)) c1 = TCanvas("c1", "Signals", 800, 600) c1.cd() c1.GetPad(0).SetTicky(2) gUp.Draw("AL") gDown.Draw("SAME, L") gUp.GetYaxis().SetRangeUser(0.65, 1.35) gUp.GetXaxis().SetTitle("m_{X} (GeV)") gUp.GetYaxis().SetTitle("Uncertainty") leg = TLegend(0.5, 0.90 - 0.20, 0.9, 0.90) leg.SetBorderSize(0) leg.SetFillStyle(0) #1001 leg.SetFillColor(0) leg.SetHeader(sys.replace('_', ' ')) leg.AddEntry(gUp, "+1 s. d. (%.1f%%)" % (100. * (upAvg - 1.)), "l") leg.AddEntry(gDown, " -1 s. d. (%.1f%%)" % (100. * (1. - downAvg)), "l") leg.Draw() drawCMS(-1, "Simulation", False) c1.Update() filename = sys if sys.startswith('W_mass') or sys.startswith('Z_mass'): filename += "_" + sign[0][:3] # c1.Print("plots/Systematics/"+filename+".png") # c1.Print("plots/Systematics/"+filename+".pdf") if not gROOT.IsBatch(): raw_input("Press Enter to continue...") if 'doubleB' in sys or 'subjet' in sys or 'mass' in sys: print sys + " = {", for m in [ 800, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 2000, 2500, 3000, 3500, 4000, 4500 ]: print "%d : [%.3f, %.3f], " % (m, gUp.Eval(m), gDown.Eval(m)), print "}" if 'extr' in sys or 'tagging' in sys: print sys + " = {", for m in [800, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500]: print "%d : [%.3f, %.3f], " % (m, gUp.Eval(m), gDown.Eval(m)), print "}" if 'QCD_scale' in sys or 'PDF_scale' in sys: print sys + " = {", for m in range(800, 4500 + 1, 10): print "%d : [%.3f, %.3f], " % (m, gUp.Eval(m), gDown.Eval(m)), print "}"
def cutvariation_fitter(self, min_cv_cut, max_cv_cut): # Test if we are in AliPhysics env #self.test_aliphysics() tmp_is_root_batch = gROOT.IsBatch() gROOT.SetBatch(True) from ROOT import AliHFInvMassFitter, AliVertexingHFUtils # Enable ROOT batch mode and reset in the end self.loadstyle() lfile = TFile.Open(self.n_filemass_cutvar, "READ") ntrials = 2 * self.p_ncutvar + 1 icvmax = 1 mass_fitter = [] ifit = 0 for icv in range(ntrials): fileout_name = self.make_file_path(self.d_results_cv, self.yields_filename, "root", \ None, [self.typean, str(icv)]) fileout = TFile(fileout_name, "RECREATE") yieldshistos = [TH1F("hyields%d" % (imult), "", \ self.p_nptfinbins, array("d", self.ptranges)) for imult in range(len(self.lvar2_binmin))] if self.p_nptfinbins < 9: nx = 4 ny = 2 canvy = 533 elif self.p_nptfinbins < 13: nx = 4 ny = 3 canvy = 800 else: nx = 5 ny = 4 canvy = 1200 canvas_data = [TCanvas("canvas_cutvar%d_%d" % (icv, imult), "Data", 1000, canvy) \ for imult in range(len(self.lvar2_binmin))] for imult in range(len(self.lvar2_binmin)): canvas_data[imult].Divide(nx, ny) for imult in range(len(self.lvar2_binmin)): mean_for_data, sigma_for_data = self.load_central_meansigma(imult) for ipt in range(self.p_nptfinbins): bin_id = self.bin_matching[ipt] suffix = "%s%d_%d_%d_%s%.2f_%.2f" % \ (self.v_var_binning, self.lpt_finbinmin[ipt], self.lpt_finbinmax[ipt], icv, self.v_var2_binning, self.lvar2_binmin[imult], self.lvar2_binmax[imult]) stepsmin = (self.lpt_probcutfin[bin_id] - min_cv_cut[ipt]) / self.p_ncutvar stepsmax = (max_cv_cut[ipt] - self.lpt_probcutfin[bin_id]) / self.p_ncutvar ntrials = 2 * self.p_ncutvar + 1 selml_cvval = 0 if icv < self.p_ncutvar: selml_cvval = min_cv_cut[ipt] + icv * stepsmin elif icv == self.p_ncutvar: selml_cvval = self.lpt_probcutfin[bin_id] else: selml_cvval = self.lpt_probcutfin[bin_id] + icvmax * stepsmax histname = "hmass" if self.apply_weights is True: histname = "h_invmass_weight" self.logger.info("*********** I AM USING WEIGHTED HISTOGRAMS") h_invmass = lfile.Get(histname + suffix) h_invmass_rebin_ = AliVertexingHFUtils.RebinHisto(h_invmass, self.p_rebin[ipt], -1) h_invmass_rebin = TH1F() h_invmass_rebin_.Copy(h_invmass_rebin) h_invmass_rebin.SetTitle("%.1f < #it{p}_{T} < %.1f (prob > %.4f)" \ % (self.lpt_finbinmin[ipt], self.lpt_finbinmax[ipt], \ selml_cvval)) h_invmass_rebin.GetXaxis().SetTitle("#it{M}_{inv} (GeV/#it{c}^{2})") h_invmass_rebin.GetYaxis().SetTitle("Entries/(%.0f MeV/#it{c}^{2})" \ % (h_invmass_rebin.GetBinWidth(1) * 1000)) h_invmass_rebin.GetYaxis().SetTitleOffset(1.1) mass_fitter.append(AliHFInvMassFitter(h_invmass_rebin, self.p_massmin[ipt], self.p_massmax[ipt], self.bkg_fmap[self.p_bkgfunc[ipt]], self.sig_fmap[self.p_sgnfunc[ipt]])) if self.p_dolike: mass_fitter[ifit].SetUseLikelihoodFit() mass_fitter[ifit].SetInitialGaussianMean(self.p_masspeak) mass_fitter[ifit].SetInitialGaussianSigma(self.p_sigmaarray[ipt]) if self.p_fixedmean: mass_fitter[ifit].SetFixGaussianMean(mean_for_data[ipt]) if self.p_fixedsigma: mass_fitter[ifit].SetFixGaussianSigma(sigma_for_data[ipt]) mass_fitter[ifit].SetNSigma4SideBands(self.p_exclude_nsigma_sideband) mass_fitter[ifit].SetCheckSignalCountsAfterFirstFit(False) #Reflections to be included if self.p_includesecpeak[ipt]: mass_fitter[ifit].IncludeSecondGausPeak(self.p_masssecpeak, self.p_fix_masssecpeak, self.p_widthsecpeak, self.p_fix_widthsecpeak) success = mass_fitter[ifit].MassFitter(False) canvas_data[imult].cd(ipt+1) if success != 1: mass_fitter[ifit].GetHistoClone().Draw() self.logger.error("Fit failed for suffix %s", suffix) ifit = ifit + 1 continue mass_fitter[ifit].DrawHere(gPad, self.p_nsigma_signal) # Write fitters to file fit_root_dir = fileout.mkdir(suffix) fit_root_dir.WriteObject(mass_fitter[ifit], "fittercutvar") # In case of success == 2, no signal was found, in case of 0, fit failed rawYield = mass_fitter[ifit].GetRawYield() rawYieldErr = mass_fitter[ifit].GetRawYieldError() yieldshistos[imult].SetBinContent(ipt + 1, rawYield) yieldshistos[imult].SetBinError(ipt + 1, rawYieldErr) ifit = ifit + 1 suffix2 = "cutvar%d_%s%.2f_%.2f" % \ (icv, self.v_var2_binning, self.lvar2_binmin[imult], \ self.lvar2_binmax[imult]) canvas_data[imult].SaveAs(self.make_file_path(self.d_results_cv, "canvas_FinalData", "eps", None, suffix2)) fileout.cd() yieldshistos[imult].Write() fileout.Close() if icv > self.p_ncutvar: icvmax = icvmax + 1 del mass_fitter[:] # Reset to former mode gROOT.SetBatch(tmp_is_root_batch)
def plotMM(): gStyle.SetOptFit(1111) NMM = 4 hmms = [[], []] hmm2s = [[], []] #f = TF1("gaus","gaus",) for idt in range(DTYPS): hmms[idt].append(f[idt].top.hmmppippimVw.ProjectionY('hmmppippim_%s' % DTYPS_NAME[idt])) hmms[idt].append(f[idt].top.hmmppipVw.ProjectionY('hmmppip_%s' % DTYPS_NAME[idt])) hmms[idt].append(f[idt].top.hmmppimVw.ProjectionY('hmmppim_%s' % DTYPS_NAME[idt])) hmms[idt].append(f[idt].top.hmmpippimVw.ProjectionY('hmmpippim_%s' % DTYPS_NAME[idt])) hmm2s[idt].append(f[idt].top.hmm2ppippimVw.ProjectionY( 'hmm2ppippim_%s' % DTYPS_NAME[idt])) hmm2s[idt].append(f[idt].top.hmm2ppipVw.ProjectionY('hmm2ppip_%s' % DTYPS_NAME[idt])) hmm2s[idt].append(f[idt].top.hmm2ppimVw.ProjectionY('hmm2ppim_%s' % DTYPS_NAME[idt])) hmm2s[idt].append(f[idt].top.hmm2pippimVw.ProjectionY('hmm2pippim_%s' % DTYPS_NAME[idt])) # hmms[idt].append(f[idt].Get("/top/hmmppippimVw").ProjectionY('hmmppippim_%s'%DTYPS_NAME[idt])) # hmms[idt].append(f[idt].Get("/top/hmmppimVw").ProjectionY('hmmppim_%s'%DTYPS_NAME[idt])) # hmms[idt].append(f[idt].Get("/top/hmmppipVw").ProjectionY('hmmppip_%s'%DTYPS_NAME[idt])) # hmms[idt].append(f[idt].Get("/top/hmmpippimVw").ProjectionY('hmmpippim_%s'%DTYPS_NAME[idt])) cmm = TCanvas("mm", "mm") cmm.Divide(2, 2) fsimc = [] for imm in range(NMM): pad = cmm.cd(imm + 1) # hmms[EXP][imm].SetLineColor(gROOT.ProcessLine("kBlue")) # hmms[EXP][imm].DrawNormalized("",10000) hmms[SIM][imm].SetLineColor(gROOT.ProcessLine("kRed")) hmms[SIM][imm].SetMarkerColor(gROOT.ProcessLine("kRed")) hsim = hmms[SIM][imm].DrawNormalized("", 10000) hmms[EXP][imm].SetLineColor(gROOT.ProcessLine("kBlue")) hmms[EXP][imm].SetMarkerColor(gROOT.ProcessLine("kBlue")) hexp = hmms[EXP][imm].DrawNormalized("sames", 10000) if imm == 1 or imm == 2: hsim.Fit("gaus", "", "", 0.1, 0.17) hexp.Fit("gaus", "", "", 0.1, 0.17) elif imm == 3: hsim.Fit("gaus", "", "", 0.9, 1.0) hexp.Fit("gaus", "", "", 0.9, 0.96) if imm != 0: fsim = hsim.GetFunction("gaus") fsim.SetLineColor(gROOT.ProcessLine("kBlack")) fexp = hexp.GetFunction("gaus") fexp.SetLineColor(gROOT.ProcessLine("kBlack")) pad.Update() fsimc.append(TF1(fsim)) fsimc[imm - 1].SetLineColor(gROOT.ProcessLine("kGreen")) fsimc[imm - 1].SetRange(hmms[SIM][imm].GetXaxis().GetXmin(), hmms[SIM][imm].GetXaxis().GetXmax()) fsimc[imm - 1].Draw("same") #pad.Update() cmm2 = TCanvas("mm2", "mm2") cmm2.Divide(2, 2) for imm in range(NMM): pad = cmm2.cd(imm + 1) # hmms[EXP][imm].SetLineColor(gROOT.ProcessLine("kBlue")) # hmms[EXP][imm].DrawNormalized("",10000) hmm2s[SIM][imm].SetLineColor(gROOT.ProcessLine("kRed")) hmm2s[SIM][imm].SetMarkerColor(gROOT.ProcessLine("kRed")) hsim = hmm2s[SIM][imm].DrawNormalized("", 10000) hmm2s[EXP][imm].SetLineColor(gROOT.ProcessLine("kBlue")) hmm2s[EXP][imm].SetMarkerColor(gROOT.ProcessLine("kBlue")) hexp = hmm2s[EXP][imm].DrawNormalized("sames", 10000) if imm == 1 or imm == 2: hsim.Fit("gaus", "", "", 0.1, 0.17) hexp.Fit("gaus", "", "", 0.1, 0.17) elif imm == 3: hsim.Fit("gaus", "", "", 0.9, 1.0) hexp.Fit("gaus", "", "", 0.9, 0.96) if imm != 0: hsim.GetFunction("gaus").SetLineColor(gROOT.ProcessLine("kBlack")) hexp.GetFunction("gaus").SetLineColor(gROOT.ProcessLine("kBlack")) pad.Update() if not gROOT.IsBatch(): plt.show() # wait for you to close the ROOT canvas before exiting wait(True)
graphs_rate_L4[j].GetYaxis().SetLimits(0,y_max_L4) else: graphs_rate_L4[j].SetMaximum(max(y_max_L4, graphs_rate_L4[j].GetHistogram().GetMaximum())*(1.01)) graphs_rate_L4[j].Draw("PL") graphs_rate_L4[j].SetMaximum(max(y_max_L4, graphs_rate_L4[j].GetHistogram().GetMaximum())*(1.01)) graphs_rate_L4[j].GetYaxis().SetLimits(0,y_max_L4) leg_L4.Draw() latex = TLatex() latex.SetNDC() latex.SetTextSize(0.04) latex.SetTextColor(1) latex.SetTextFont(42) latex.SetTextAlign(33) latex.SetTextSize(0.04) latex.SetTextFont(62) latex.DrawLatex(0.30, 0.96, "GIF++") etichetta = TLatex() etichetta.SetNDC() etichetta.SetTextSize(0.04) etichetta.SetTextColor(4) etichetta.SetTextFont(102) etichetta.DrawLatex(0.45, 0.93, "SL1_L4 HV scan rate") #etichetta.DrawLatex(0.45, 0.8, "#splitline{SL1_L4 threshold scan_rate}{Runs: "+str(run_interval)+"}") can_HV_scan_rate_SL1_L4.Update() can_HV_scan_rate_SL1_L4.Print(outpath + "Compare_HV_scan_rate_SL1_L4.png") can_HV_scan_rate_SL1_L4.Print(outpath + "Compare_HV_scan_rate_SL1_L4.pdf") if not gROOT.IsBatch(): raw_input("Press Enter to continue...") exit()
def plot(var, cut, year, norm=False, nm1=False): ### Preliminary Operations ### treeRead = not cut in ["nnqq", "en", "enqq", "mn", "mnqq", "ee", "eeqq", "mm", "mmqq", "em", "emqq", "qqqq"] # Read from tree channel = cut unit = '' if "GeV" in variable[var]['title']: unit = ' GeV' isBlind = BLIND and 'SR' in channel isAH = False #'qqqq' in channel or 'hp' in channel or 'lp' in channel showSignal = False if 'SB' in cut or 'TR' in cut else True #'SR' in channel or channel=='qqqq'#or len(channel)==5 stype = "HVT model B" if len(sign)>0 and 'AZh' in sign[0]: stype = "2HDM" elif len(sign)>0 and 'monoH' in sign[0]: stype = "Z'-2HDM m_{A}=300 GeV" if treeRead: for k in sorted(alias.keys(), key=len, reverse=True): if BTAGGING=='semimedium': if k in cut: if ADDSELECTION: cut = cut.replace(k, aliasSM[k]+SELECTIONS[options.selection]) else: cut = cut.replace(k, aliasSM[k]) else: if k in cut: if ADDSELECTION: cut = cut.replace(k, alias[k].format(WP=working_points[BTAGGING])+SELECTIONS[options.selection]) else: cut = cut.replace(k, alias[k].format(WP=working_points[BTAGGING])) # Determine Primary Dataset pd = sample['data_obs']['files'] print "Plotting from", ("tree" if treeRead else "file"), var, "in", channel, "channel with:" print " dataset:", pd print " cut :", cut if var == 'jj_deltaEta_widejet': if "jj_deltaEta_widejet<1.1 && " in cut: print print "omitting jj_deltaEta_widejet<1.1 cut to draw the deltaEta distribution" print cut = cut.replace("jj_deltaEta_widejet<1.1 && ", "") else: print print "no 'jj_deltaEta_widejet<1.1 && ' in the cut string detected, so it cannot be ommited explicitly" print ### Create and fill MC histograms ### # Create dict file = {} tree = {} hist = {} ### Create and fill MC histograms ### for i, s in enumerate(data+back+sign): if treeRead: # Project from tree tree[s] = TChain("tree") for j, ss in enumerate(sample[s]['files']): if not 'data' in s or ('data' in s and ss in pd): if year=="run2" or year in ss: if RECAL and 'data' in s: tree[s].Add(NTUPLEDIR + "Recal/" + ss + "_Recal.root") else: tree[s].Add(NTUPLEDIR + ss + ".root") if variable[var]['nbins']>0: hist[s] = TH1F(s, ";"+variable[var]['title']+";Events / ( "+str((variable[var]['max']-variable[var]['min'])/variable[var]['nbins'])+unit+" );"+('log' if variable[var]['log'] else ''), variable[var]['nbins'], variable[var]['min'], variable[var]['max']) else: hist[s] = TH1F(s, ";"+variable[var]['title']+";Events"+('log' if variable[var]['log'] else ''), len(variable[var]['bins'])-1, array('f', variable[var]['bins'])) hist[s].Sumw2() cutstring = "(eventWeightLumi)" + ("*("+cut+")" if len(cut)>0 else "") tree[s].Project(s, var, cutstring) if not tree[s].GetTree()==None: hist[s].SetOption("%s" % tree[s].GetTree().GetEntriesFast()) else: # Histogram written to file for j, ss in enumerate(sample[s]['files']): if not 'data' in s or ('data' in s and ss in pd): file[ss] = TFile(NTUPLEDIR + ss + ".root", "R") if file[ss].IsZombie(): print "WARNING: file", NTUPLEDIR + ss + ".root", "does not exist" continue tmphist = file[ss].Get(cut+"/"+var) if tmphist==None: continue if not s in hist.keys(): hist[s] = tmphist else: hist[s].Add(tmphist) hist[s].Scale(sample[s]['weight'] if hist[s].Integral() >= 0 else 0) hist[s].SetFillColor(sample[s]['fillcolor']) hist[s].SetFillStyle(sample[s]['fillstyle']) hist[s].SetLineColor(sample[s]['linecolor']) hist[s].SetLineStyle(sample[s]['linestyle']) if channel.endswith('TR') and channel.replace('TR', '') in topSF: hist['TTbarSL'].Scale(topSF[channel.replace('TR', '')][0]) hist['ST'].Scale(topSF[channel.replace('TR', '')][0]) hist['BkgSum'] = hist['data_obs'].Clone("BkgSum") if 'data_obs' in hist else hist[back[0]].Clone("BkgSum") hist['BkgSum'].Reset("MICES") hist['BkgSum'].SetFillStyle(3003) hist['BkgSum'].SetFillColor(1) for i, s in enumerate(back): hist['BkgSum'].Add(hist[s]) if options.norm: for i, s in enumerate(back + ['BkgSum']): hist[s].Scale(hist[data[0]].Integral()/hist['BkgSum'].Integral()) # Create data and Bkg sum histograms if options.blind or 'SR' in channel: hist['data_obs'] = hist['BkgSum'].Clone("data_obs") hist['data_obs'].Reset("MICES") # Set histogram style hist['data_obs'].SetMarkerStyle(20) hist['data_obs'].SetMarkerSize(1.25) for i, s in enumerate(data+back+sign+['BkgSum']): addOverflow(hist[s], False) # Add overflow for i, s in enumerate(sign): hist[s].SetLineWidth(3) for i, s in enumerate(sign): sample[s]['plot'] = True#sample[s]['plot'] and s.startswith(channel[:2]) if isAH: for i, s in enumerate(back): hist[s].SetFillStyle(3005) hist[s].SetLineWidth(2) #for i, s in enumerate(sign): # hist[s].SetFillStyle(0) if not var=="Events": sfnorm = hist[data[0]].Integral()/hist['BkgSum'].Integral() print "Applying SF:", sfnorm for i, s in enumerate(back+['BkgSum']): hist[s].Scale(sfnorm) if BLIND and var.endswith("Mass"): for i, s in enumerate(data+back+['BkgSum']): first, last = hist[s].FindBin(65), hist[s].FindBin(135) for j in range(first, last): hist[s].SetBinContent(j, -1.e-4) if BLIND and var.endswith("Tau21"): for i, s in enumerate(data): first, last = hist[s].FindBin(0), hist[s].FindBin(0.6) for j in range(first, last): hist[s].SetBinContent(j, -1.e-4) if SYNC and var == "jj_mass_widejet" and year in ["2016", "2017", "2018"]: #iFile = TFile("sync/JetHT_run" + year + "_red_cert_scan.root", "READ") #hist['sync'] = iFile.Get("Mjj") if year == '2016': iFile = TFile("sync/2016/2016_07Aug2017_1246_1p1.root", "READ") hist['sync'] = iFile.Get("h_mjj_data") elif year == '2017': iFile = TFile("sync/2017/histos_Run2017BCDEF_17Nov2017_JEC2017_mjj1530_cemf_lt_0p8_deltaETA_lt_1p1.root", "READ") hist['sync'] = iFile.Get("h_mjj_data") elif year == '2018': iFile = TFile("sync/2018/Double_sideband_inputs_18v10_preliminary_v2.root", "READ") hist['sync'] = iFile.Get("h_mjj") # hist['sync'] = tmp.Rebin(len(dijet_bins)-1, "sync", array('d', dijet_bins)) # hist['sync'] = tmp.Rebin(100, "sync") hist['sync'].SetMarkerStyle(31) hist['sync'].SetMarkerSize(1.25) hist['sync'].SetMarkerColor(2) print "Imported and drawing sync file" # Create stack if variable[var]['nbins']>0: bkg = THStack("Bkg", ";"+hist['BkgSum'].GetXaxis().GetTitle()+";Events / ( "+str((variable[var]['max']-variable[var]['min'])/variable[var]['nbins'])+unit+" )") else: bkg = THStack("Bkg", ";"+hist['BkgSum'].GetXaxis().GetTitle()+";Events; " ) for i, s in enumerate(back): bkg.Add(hist[s]) # Legend leg = TLegend(0.65, 0.6, 0.95, 0.9) leg.SetBorderSize(0) leg.SetFillStyle(0) #1001 leg.SetFillColor(0) if len(data) > 0: leg.AddEntry(hist[data[0]], sample[data[0]]['label'], "pe") for i, s in reversed(list(enumerate(['BkgSum']+back))): leg.AddEntry(hist[s], sample[s]['label'], "f") if showSignal: for i, s in enumerate(sign): if sample[s]['plot']: leg.AddEntry(hist[s], sample[s]['label'], "fl") leg.SetY1(0.9-leg.GetNRows()*0.05) # --- Display --- c1 = TCanvas("c1", hist.values()[0].GetXaxis().GetTitle(), 800, 800 if RATIO else 600) if RATIO: c1.Divide(1, 2) setTopPad(c1.GetPad(1), RATIO) setBotPad(c1.GetPad(2), RATIO) c1.cd(1) c1.GetPad(bool(RATIO)).SetTopMargin(0.06) c1.GetPad(bool(RATIO)).SetRightMargin(0.05) c1.GetPad(bool(RATIO)).SetTicks(1, 1) log = variable[var]['log'] #"log" in hist['BkgSum'].GetZaxis().GetTitle() if log: c1.GetPad(bool(RATIO)).SetLogy() # Draw bkg.Draw("HIST") # stack hist['BkgSum'].Draw("SAME, E2") # sum of bkg if not isBlind and len(data) > 0: hist['data_obs'].Draw("SAME, PE") # data outfile = TFile("Tyler_hist_"+channel+"_"+str(year)+".root", "RECREATE") hist['data_obs'].Write() outfile.Close() if 'sync' in hist: hist['sync'].Draw("SAME, PE") #data_graph.Draw("SAME, PE") if showSignal: smagn = 1. #if treeRead else 1.e2 #if log else 1.e2 for i, s in enumerate(sign): # if sample[s]['plot']: hist[s].Scale(smagn) hist[s].Draw("SAME, HIST") # signals Normalized, hist[s].Integral()*sample[s]['weight'] textS = drawText(0.80, 0.9-leg.GetNRows()*0.05 - 0.02, stype+" (x%d)" % smagn, True) #bkg.GetYaxis().SetTitleOffset(bkg.GetYaxis().GetTitleOffset()*1.075) bkg.GetYaxis().SetTitleOffset(0.9) #bkg.GetYaxis().SetTitleOffset(2.) bkg.SetMaximum((5. if log else 1.25)*max(bkg.GetMaximum(), hist['data_obs'].GetBinContent(hist['data_obs'].GetMaximumBin())+hist['data_obs'].GetBinError(hist['data_obs'].GetMaximumBin()))) #if bkg.GetMaximum() < max(hist[sign[0]].GetMaximum(), hist[sign[-1]].GetMaximum()): bkg.SetMaximum(max(hist[sign[0]].GetMaximum(), hist[sign[-1]].GetMaximum())*1.25) bkg.SetMinimum(max(min(hist['BkgSum'].GetBinContent(hist['BkgSum'].GetMinimumBin()), hist['data_obs'].GetMinimum()), 5.e-1) if log else 0.) if log: bkg.GetYaxis().SetNoExponent(bkg.GetMaximum() < 1.e4) #bkg.GetYaxis().SetMoreLogLabels(True) bkg.GetXaxis().SetRangeUser(variable[var]['min'], variable[var]['max']) #if log: bkg.SetMinimum(1) leg.Draw() #drawCMS(LUMI[year], "Preliminary") #drawCMS(LUMI[year], "Work in Progress", suppressCMS=True) drawCMS(LUMI[year], "", suppressCMS=True) drawRegion('XVH'+channel, True) drawAnalysis(channel) setHistStyle(bkg, 1.2 if RATIO else 1.1) setHistStyle(hist['BkgSum'], 1.2 if RATIO else 1.1) if RATIO: c1.cd(2) err = hist['BkgSum'].Clone("BkgErr;") err.SetTitle("") if SYNC: err.GetYaxis().SetTitle("Nano/Mini") else: err.GetYaxis().SetTitle("Data / MC") err.GetYaxis().SetTitleOffset(0.9) err.GetXaxis().SetRangeUser(variable[var]['min'], variable[var]['max']) for i in range(1, err.GetNbinsX()+1): err.SetBinContent(i, 1) if hist['BkgSum'].GetBinContent(i) > 0: err.SetBinError(i, hist['BkgSum'].GetBinError(i)/hist['BkgSum'].GetBinContent(i)) setBotStyle(err) errLine = err.Clone("errLine") errLine.SetLineWidth(1) errLine.SetFillStyle(0) res = hist['data_obs'].Clone("Residues") for i in range(0, res.GetNbinsX()+1): if hist['BkgSum'].GetBinContent(i) > 0: res.SetBinContent(i, res.GetBinContent(i)/hist['BkgSum'].GetBinContent(i)) res.SetBinError(i, res.GetBinError(i)/hist['BkgSum'].GetBinContent(i)) if 'sync' in hist: res.SetMarkerColor(1) res.SetMarkerStyle(20) res.Reset() for i in range(0, res.GetNbinsX()+1): x = hist['data_obs'].GetXaxis().GetBinCenter(i) if hist['sync'].GetBinContent(hist['sync'].FindBin(x)) > 0: res.SetBinContent(i, hist['data_obs'].GetBinContent(hist['data_obs'].FindBin(x))/hist['sync'].GetBinContent(hist['sync'].FindBin(x))) res.SetBinError(i, hist['data_obs'].GetBinError(hist['data_obs'].FindBin(x))/hist['sync'].GetBinContent(hist['sync'].FindBin(x))) setBotStyle(res) #err.GetXaxis().SetLabelOffset(err.GetXaxis().GetLabelOffset()*5) #err.GetXaxis().SetTitleOffset(err.GetXaxis().GetTitleOffset()*2) err.Draw("E2") errLine.Draw("SAME, HIST") if not isBlind and len(data) > 0: res.Draw("SAME, PE0") #res_graph.Draw("SAME, PE0") if len(err.GetXaxis().GetBinLabel(1))==0: # Bin labels: not a ordinary plot drawRatio(hist['data_obs'], hist['BkgSum']) drawStat(hist['data_obs'], hist['BkgSum']) if SYNC: err.GetYaxis().SetRangeUser(0.9,1.1) c1.Update() if gROOT.IsBatch(): if channel=="": channel="nocut" varname = var.replace('.', '_').replace('()', '') if not os.path.exists("plots/"+channel): os.makedirs("plots/"+channel) suffix = '' if "b" in channel or 'mu' in channel: suffix+="_"+BTAGGING if ADDSELECTION: suffix+="_"+options.selection #c1.Print("plots/"+channel+"/"+varname+"_"+year+suffix+".png") #c1.Print("plots/"+channel+"/"+varname+"_"+year+suffix+".pdf") # Print table printTable(hist, sign) # if True: # sFile = TFile("sync/data_2016.root", "RECREATE") # sFile.cd() # hist['data_obs']. if not gROOT.IsBatch(): raw_input("Press Enter to continue...")
def main(): try: # retrive command line options shortopts = "m:i:n:d:k:l:t:o:vh?" longopts = [ "methods=", "inputfile=", "nTrees=", "maxDepth=", "mass=", "varListKey=", "inputtrees=", "outputfile=", "verbose", "help", "usage" ] opts, args = getopt.getopt(sys.argv[1:], shortopts, longopts) except getopt.GetoptError: # print help information and exit: print "ERROR: unknown options in argument %s" % sys.argv[1:] usage() sys.exit(1) infname = DEFAULT_INFNAME treeNameSig = DEFAULT_TREESIG treeNameBkg = DEFAULT_TREEBKG outfname = DEFAULT_OUTFNAME methods = DEFAULT_METHODS nTrees = DEFAULT_NTREES mDepth = DEFAULT_MDEPTH varListKey = DEFAULT_VARLISTKEY verbose = True for o, a in opts: if o in ("-?", "-h", "--help", "--usage"): usage() sys.exit(0) elif o in ("-m", "--methods"): methods = a elif o in ("-d", "--maxDepth"): mDepth = a elif o in ("-l", "--varListKey"): varListKey = a elif o in ("-i", "--inputfile"): infname = a elif o in ("-n", "--nTrees"): nTrees = a elif o in ("-o", "--outputfile"): outfname = a elif o in ("-t", "--inputtrees"): a.strip() trees = a.rsplit(' ') trees.sort() trees.reverse() if len(trees) - trees.count('') != 2: print "ERROR: need to give two trees (each one for signal and background)" print trees sys.exit(1) treeNameSig = trees[0] treeNameBkg = trees[1] elif o in ("-v", "--verbose"): verbose = True varList = varsList.varList[varListKey] nVars = str(len(varList)) + 'vars' Note = methods + '_' + varListKey + '_' + nVars + '_mDepth' + mDepth outfname = "dataset/weights/TMVA_" + Note + ".root" # Print methods mlist = methods.replace(' ', ',').split(',') print "=== TMVAClassification: use method(s)..." for m in mlist: if m.strip() != '': print "=== - <%s>" % m.strip() # Import ROOT classes from ROOT import gSystem, gROOT, gApplication, TFile, TTree, TCut # check ROOT version, give alarm if 5.18 if gROOT.GetVersionCode() >= 332288 and gROOT.GetVersionCode() < 332544: print "*** You are running ROOT version 5.18, which has problems in PyROOT such that TMVA" print "*** does not run properly (function calls with enums in the argument are ignored)." print "*** Solution: either use CINT or a C++ compiled version (see TMVA/macros or TMVA/examples)," print "*** or use another ROOT version (e.g., ROOT 5.19)." sys.exit(1) # Import TMVA classes from ROOT from ROOT import TMVA # Output file outputFile = TFile(outfname, 'RECREATE') # Create instance of TMVA factory (see TMVA/macros/TMVAClassification.C for more factory options) # All TMVA output can be suppressed by removing the "!" (not) in # front of the "Silent" argument in the option string factory = TMVA.Factory( "TMVAClassification", outputFile, "!V:!Silent:Color:DrawProgressBar:Transformations=I;:AnalysisType=Classification" ) loader = TMVA.DataLoader("dataset") # Set verbosity # factory.SetVerbose( verbose ) # If you wish to modify default settings # (please check "src/Config.h" to see all available global options) # gConfig().GetVariablePlotting()).fTimesRMS = 8.0 (TMVA.gConfig().GetIONames()).fWeightFileDir = "weights/" + Note # Define the input variables that shall be used for the classifier training # note that you may also use variable expressions, such as: "3*var1/var2*abs(var3)" # [all types of expressions that can also be parsed by TTree::Draw( "expression" )] for iVar in varList: if iVar[0] == 'NJets_JetSubCalc': loader.AddVariable(iVar[0], iVar[1], iVar[2], 'I') else: loader.AddVariable(iVar[0], iVar[1], iVar[2], 'F') # You can add so-called "Spectator variables", which are not used in the MVA training, # but will appear in the final "TestTree" produced by TMVA. This TestTree will contain the # input variables, the response values of all trained MVAs, and the spectator variables inputDir = varsList.inputDir infname = "TTTT_TuneCP5_13TeV-amcatnlo-pythia8_hadd.root" iFileSig = TFile.Open(inputDir + infname) sigChain = iFileSig.Get("ljmet") loader.AddSignalTree(sigChain) bkg_list = [] bkg_trees_list = [] hist_list = [] weightsList = [] bkgList = varsList.bkg for i in range(len(bkgList)): bkg_list.append(TFile.Open(inputDir + bkgList[i])) print inputDir + bkgList[i] bkg_trees_list.append(bkg_list[i].Get("ljmet")) bkg_trees_list[i].GetEntry(0) if bkg_trees_list[i].GetEntries() == 0: continue loader.AddBackgroundTree(bkg_trees_list[i], 1) signalWeight = 1 #0.0159/sigChain.GetEntries() #xs (pb) # ====== register trees ==================================================== # To give different trees for training and testing, do as follows: # loader.AddSignalTree( signalTrainingTree, signalTrainWeight, "Training" ) # loader.AddSignalTree( signalTestTree, signalTestWeight, "Test" ) # Use the following code instead of the above two or four lines to add signal and background # training and test events "by hand" # NOTE that in this case one should not give expressions (such as "var1+var2") in the input # variable definition, but simply compute the expression before adding the event # # # --- begin ---------------------------------------------------------- # # ... *** please lookup code in TMVA/macros/TMVAClassification.C *** # # # --- end ------------------------------------------------------------ # # ====== end of register trees ============================================== # Set individual event weights (the variables must exist in the original TTree) # for signal : loader.SetSignalWeightExpression ("weight1*weight2"); # for background: loader.SetBackgroundWeightExpression("weight1*weight2"); loader.SetSignalWeightExpression(weightStrS) loader.SetBackgroundWeightExpression(weightStrB) # Apply additional cuts on the signal and background sample. # example for cut: mycut = TCut( "abs(var1)<0.5 && abs(var2-0.5)<1" ) mycutSig = TCut(cutStrS) mycutBkg = TCut(cutStrB) # Here, the relevant variables are copied over in new, slim trees that are # used for TMVA training and testing # "SplitMode=Random" means that the input events are randomly shuffled before # splitting them into training and test samples loader.PrepareTrainingAndTestTree( mycutSig, mycutBkg, "nTrain_Signal=0:nTrain_Background=0:SplitMode=Random:NormMode=NumEvents:!V" ) # -------------------------------------------------------------------------------------------------- # ---- Book MVA methods # # please lookup the various method configuration options in the corresponding cxx files, eg: # src/MethoCuts.cxx, etc, or here: http://tmva.sourceforge.net/optionRef.html # it is possible to preset ranges in the option string in which the cut optimisation should be done: # "...:CutRangeMin[2]=-1:CutRangeMax[2]=1"...", where [2] is the third input variable # Cut optimisation # bdtSetting for "BDT" bdtSetting = '!H:!V:NTrees=%s:MaxDepth=%s' % (nTrees, mDepth) bdtSetting += ':MinNodeSize=2.5%:BoostType=AdaBoost:AdaBoostBeta=0.5:UseBaggedBoost:BaggedSampleFraction=0.5:SeparationType=GiniIndex:nCuts=20' bdtSetting += ':IgnoreNegWeightsInTraining=True' # bdtSetting for "BDTMitFisher" bdtFSetting = '!H:!V:NTrees=%s' % nTrees bdtFSetting += ':MinNodeSize=2.5%:UseFisherCuts:MaxDepth=3:BoostType=AdaBoost:AdaBoostBeta=0.5:SeparationType=GiniIndex:nCuts=20' bdtFSetting += ':IgnoreNegWeightsInTraining=True' # bdtSetting for "BDTG" bdtGSetting = '!H:!V:NTrees=%s:MaxDepth=%s' % (nTrees, mDepth) bdtGSetting += ':MinNodeSize=2.5%:BoostType=Grad:Shrinkage=0.10:UseBaggedBoost:BaggedSampleFraction=0.5:nCuts=20' bdtGSetting += ':Pray' #Pray takes into account the effect of negative bins in BDTG #bdtGSetting += ':IgnoreNegWeightsInTraining=True' # bdtSetting for "BDTB" bdtBSetting = '!H:!V:NTrees=%s' % nTrees bdtBSetting += ':MinNodeSize=2.5%:BoostType=Bagging:SeparationType=GiniIndex:nCuts=20' bdtBSetting += ':IgnoreNegWeightsInTraining=True' # bdtSetting for "BDTD" bdtDSetting = '!H:!V:NTrees=%s' % nTrees bdtDSetting += ':MinNodeSize=2.5%:MaxDepth=3:BoostType=AdaBoost:SeparationType=GiniIndex:nCuts=20:VarTransform=Decorrelate' bdtDSetting += ':IgnoreNegWeightsInTraining=True' #Note also that explicitly setting *nEventsMin* so far OVERWRITES the option recomeded ^[[0m #BOOKING AN ALGORITHM # if methods=="BDT": factory.BookMethod( TMVA.Types.kBDT, "BDT",bdtSetting) if methods == "BDT": factory.BookMethod(loader, TMVA.Types.kBDT, "BDT", bdtSetting) if methods == "BDTG": factory.BookMethod(TMVA.Types.kBDT, "BDTG", bdtGSetting) if methods == "BDTMitFisher": factory.BookMethod(TMVA.Types.kBDT, "BDTMitFisher", bdtFSetting) if methods == "BDTB": factory.BookMethod(TMVA.Types.kBDT, "BDTB", bdtBSetting) if methods == "BDTD": factory.BookMethod(TMVA.Types.kBDT, "BDTD", bdtDSetting) # -------------------------------------------------------------------------------------------------- # ---- Now you can tell the loader to train, test, and evaluate the MVAs. # Train MVAs print "train all method" factory.TrainAllMethods() print "test all method" # Test MVAs factory.TestAllMethods() # Evaluate MVAs factory.EvaluateAllMethods() # Save the output. outputFile.Close() # save plots: os.chdir('dataset/weights/' + Note) if not gROOT.IsBatch(): TMVA.TMVAGui(outfname) print "DONE"
#!/usr/bin/env python3 import os, sys, re from ROOT import gROOT from rootUtil3 import useAtlasStyle, waitRootCmd, savehistory, mkupHistSimple, get_default_fig_dir funlist = [] sDir = get_default_fig_dir() sTag = 'test_' sDirectly = False if gROOT.IsBatch(): sDirectly = True def test(): return "In test" waitRootCmd() funlist.append(test) if __name__ == '__main__': savehistory('.') useAtlasStyle() for fun in funlist: print(fun())
def plot(var, cut, norm=False): PD = getPrimaryDataset(selection[cut]) if cut in selection: plotdir = cut PROC = data + back if not BLIND else back print col.OKGREEN + "Primary Dataset : " + col.ENDC, PD print col.OKGREEN + "CUT : " + col.ENDC, selection[cut] print col.OKGREEN + "WEIGHT : " + col.ENDC, weight[cut] if not sign: Histlist = ProjectDraw(var, cut, LUMI, PROC, PD, NTUPLEDIR) else: Histlist = ProjectDraw(var, cut, LUMI, PROC + sign, PD, NTUPLEDIR) if len(back) > 0: #If data_obs present, dummy BkgSum == first background process Histlist['BkgSum'] = Histlist['data_obs'].Clone( "BkgSum") if 'data_obs' in Histlist else Histlist[back[0]].Clone( "BkgSum") Histlist['BkgSum'].Reset("MICES") Histlist['BkgSum'].SetFillStyle(3003) Histlist['BkgSum'].SetFillColor(1) for i, s in enumerate(back): Histlist['BkgSum'].Add(Histlist[s].GetPtr()) if len(back) == 0 and len(data) == 0: for i, s in enumerate(sign): #Normalize signal to 1 #Histlist[s].Scale(1./Histlist[s].Integral()) Histlist[s].SetLineWidth(2) Histlist[s].SetFillStyle(0) if norm: sfnorm = hist['data_obs'].Integral() / hist['BkgSum'].Integral() for i, s in enumerate(back + ['BkgSum']): hist[s].Scale(sfnorm) if len(data + back) > 0: out = draw( Histlist, data if not BLIND else [], back, sign, SIGNAL, RATIO, POISSON, True if options.logy else (filter( lambda x: x.name() == var.split('[')[0], variable)[0]).log()) out[0].cd(1) drawCMS(LUMI, "Preliminary") drawRegion(cut) printTable(Histlist, sign) else: out = drawSignal( Histlist, sign, True if options.logy else (filter(lambda x: x.name() == var, variable)[0]).log()) out[0].cd(1) drawCMS(LUMI, "Simulation") drawRegion(cut) out[0].Update() if gROOT.IsBatch(): #pathname = PLOTDIR+"/Signal/"+cut if options.signal else PLOTDIR+"/"+plotdir pathname = PLOTDIR + "/" + plotdir if not os.path.exists(pathname): os.system('mkdir -p %s' % pathname) out[0].Print(pathname + "/" + var.replace('.', '_') + ".png") out[0].Print(pathname + "/" + var.replace('.', '_') + ".pdf") else: out[0].Draw() #if options.all: print col.WARNING + "PURGE OBJECTS IN MEMORY" + col.ENDC for process in Histlist: Histlist[process].Delete()
def limit2HDM(): global signals signals = range(800, 2000 + 1, 50) multF = HTOBB THEORY = ['T1', 'T2'] mass, val = fillValues("./combine/AZh/AZh_M%d.txt") Obs0s = TGraph() Exp0s = TGraph() Exp1s = TGraphAsymmErrors() Exp2s = TGraphAsymmErrors() massB, valB = fillValues("./combine/BBAZh/BBAZh_M%d.txt") Obs0sB = TGraph() Exp0sB = TGraph() Exp1sB = TGraphAsymmErrors() Exp2sB = TGraphAsymmErrors() for i, m in enumerate(mass): if not m in val: print "Key Error:", m, "not in value map" continue n = Exp0s.GetN() Obs0s.SetPoint(n, m, val[m][0] * multF) Exp0s.SetPoint(n, m, val[m][3] * multF) Exp1s.SetPoint(n, m, val[m][3] * multF) Exp1s.SetPointError(n, 0., 0., val[m][3] * multF - val[m][2] * multF, val[m][4] * multF - val[m][3] * multF) Exp2s.SetPoint(n, m, val[m][3] * multF) Exp2s.SetPointError(n, 0., 0., val[m][3] * multF - val[m][1] * multF, val[m][5] * multF - val[m][3] * multF) Obs0sB.SetPoint(n, m, valB[m][0] * multF) Exp0sB.SetPoint(n, m, valB[m][3] * multF) Exp1sB.SetPoint(n, m, valB[m][3] * multF) Exp1sB.SetPointError(n, 0., 0., valB[m][3] * multF - valB[m][2] * multF, valB[m][4] * multF - valB[m][3] * multF) Exp2sB.SetPoint(n, m, valB[m][3] * multF) Exp2sB.SetPointError(n, 0., 0., valB[m][3] * multF - valB[m][1] * multF, valB[m][5] * multF - valB[m][3] * multF) col = 629 Exp2s.SetLineWidth(2) Exp2s.SetLineStyle(1) Obs0s.SetLineWidth(3) Obs0s.SetMarkerStyle(0) Obs0s.SetLineColor(1) Exp0s.SetLineStyle(2) Exp0s.SetLineWidth(3) Exp0s.SetLineColor(1) # Exp1s.SetFillColorAlpha(col, 0.4) #kGreen+1 # Exp1s.SetLineColorAlpha(col, 0.4) # Exp2s.SetFillColorAlpha(col, 0.2) #kOrange # Exp2s.SetLineColorAlpha(col, 0.2) Exp1s.SetFillColor(417) Exp1s.SetLineColor(417) Exp2s.SetFillColor(800) Exp2s.SetLineColor(800) colB = 922 Exp2sB.SetLineWidth(2) Obs0sB.SetLineStyle(9) Obs0sB.SetLineWidth(3) Obs0sB.SetMarkerStyle(0) Obs0sB.SetLineColor(colB) Exp0sB.SetLineStyle(8) Exp0sB.SetLineWidth(3) Exp0sB.SetLineColor(colB) Exp1sB.SetFillColorAlpha(colB, 0.4) #kGreen+1 Exp1sB.SetLineColorAlpha(colB, 0.4) Exp2sB.SetFillColorAlpha(colB, 0.2) #kOrange Exp2sB.SetLineColorAlpha(colB, 0.2) Exp2s.GetXaxis().SetTitle("m_{A} (GeV)") Exp2s.GetXaxis().SetTitleSize(Exp2s.GetXaxis().GetTitleSize() * 1.25) Exp2s.GetXaxis().SetNoExponent(True) Exp2s.GetXaxis().SetMoreLogLabels(True) Exp2s.GetYaxis().SetTitle( "#sigma(A) #bf{#it{#Beta}}(A #rightarrow Zh) #bf{#it{#Beta}}(h #rightarrow bb) (fb)" ) Exp2s.GetYaxis().SetTitleOffset(1.5) Exp2s.GetYaxis().SetNoExponent(True) Exp2s.GetYaxis().SetMoreLogLabels() Theory = {} #for t in THEORY: # Theory[t] = TGraphAsymmErrors() # for m in sorted(THDM[t]['ggA'].keys()): # if m < mass[0] or m > mass[-1]: continue # Xs, Xs_Up, Xs_Down = 0., 0., 0. # Xs = THDM[t]['ggA'][m] # Xs_Up = Xs*(1.+math.sqrt((THDM['PDF']['ggA'][m][0]-1.)**2 + (THDM['QCD']['ggA'][m][0]-1.)**2)) # Xs_Down = Xs*(1.-math.sqrt((1.-THDM['PDF']['ggA'][m][1])**2 + (1.-THDM['QCD']['ggA'][m][1])**2)) # n = Theory[t].GetN() # Theory[t].SetPoint(n, m, Xs) # Theory[t].SetPointError(n, 0., 0., (Xs-Xs_Down), (Xs_Up-Xs)) # Theory[t].SetLineColor(theoryLineColor[t]) # Theory[t].SetFillColor(theoryFillColor[t]) # Theory[t].SetFillStyle(theoryFillStyle[t]) # Theory[t].SetLineWidth(2) # #Theory[t].SetLineStyle(7) c1 = TCanvas("c1", "Exclusion Limits", 800, 600) c1.cd() #SetPad(c1.GetPad(0)) c1.GetPad(0).SetTopMargin(0.06) c1.GetPad(0).SetRightMargin(0.05) c1.GetPad(0).SetLeftMargin(0.12) c1.GetPad(0).SetTicks(1, 1) c1.GetPad(0).SetLogy() Exp2s.Draw("A3") Exp1s.Draw("SAME, 3") Exp0s.Draw("SAME, L") # Exp2sB.Draw("SAME, 3") # Exp1sB.Draw("SAME, 3") Exp0sB.Draw("SAME, L") if not options.blind: Obs0s.Draw("SAME, L") Obs0sB.Draw("SAME, L") for t in THEORY: Theory[t].Draw("SAME, L3") Theory[t].Draw("SAME, L3X0Y0") #setHistStyle(Exp2s) # Exp2s.GetXaxis().SetTitleSize(0.045) # Exp2s.GetYaxis().SetTitleSize(0.04) # Exp2s.GetXaxis().SetLabelSize(0.04) # Exp2s.GetYaxis().SetLabelSize(0.04) # Exp2s.GetXaxis().SetTitleOffset(1) # Exp2s.GetYaxis().SetTitleOffset(1.25) Exp2s.GetXaxis().SetTitleSize(0.050) Exp2s.GetYaxis().SetTitleSize(0.050) Exp2s.GetXaxis().SetLabelSize(0.045) Exp2s.GetYaxis().SetLabelSize(0.045) Exp2s.GetXaxis().SetTitleOffset(0.90) Exp2s.GetYaxis().SetTitleOffset(1.25) Exp2s.GetYaxis().SetMoreLogLabels(True) Exp2s.GetYaxis().SetNoExponent(True) Exp2s.GetYaxis().SetRangeUser(0.5, 1.e3) Exp2s.GetXaxis().SetRangeUser(mass[0], mass[-1]) drawAnalysis('AZh') drawRegion('AZHsl', True) #drawCMS(LUMI, "") #Preliminary drawCMS(LUMI, "Work in Progress", suppressCMS=True) # legend leg = TLegend(0.6, 0.90, 0.99, 0.90) leg.SetBorderSize(0) leg.SetFillStyle(0) #1001 leg.SetFillColor(0) leg.SetHeader("95% CL upper limits") leg.AddEntry(None, "gg #rightarrow A #rightarrow Zh", "") #"95% CL upper limits" leg.AddEntry(Obs0s, "Observed", "l") leg.AddEntry(Exp0s, "Expected", "l") leg.AddEntry(Exp1s, "#pm 1 std. deviation", "f") leg.AddEntry(Exp2s, "#pm 2 std. deviation", "f") leg.AddEntry(None, "", "") leg.AddEntry(None, "bbA #rightarrow Zh", "") leg.AddEntry(Obs0sB, "Observed", "l") leg.AddEntry(Exp0sB, "Expected", "l") leg.SetY1(leg.GetY2() - leg.GetNRows() * 0.045) leg.Draw() # latex = TLatex() # latex.SetNDC() # latex.SetTextSize(0.040) # latex.SetTextFont(42) # latex.DrawLatex(0.65, leg.GetY1()-0.045, "cos(#beta-#alpha)=0.25, tan(#beta)=1") # legB = TLegend(0.12, 0.4-4*0.3/5., 0.65, 0.4) legB = TLegend(0.15, 0.27, 0.68, 0.27) legB.SetBorderSize(0) legB.SetFillStyle(0) #1001 legB.SetFillColor(0) for t in THEORY: legB.AddEntry(Theory[t], theoryLabel[t], "fl") legB.AddEntry(None, "cos(#beta-#alpha)=0.25, tan(#beta)=1", "") legB.SetY1(legB.GetY2() - legB.GetNRows() * 0.045) legB.Draw() c1.GetPad(0).RedrawAxis() leg.Draw() c1.Update() if not gROOT.IsBatch(): raw_input("Press Enter to continue...") c1.Print("plotsLimit/Exclusion/THDM.png") c1.Print("plotsLimit/Exclusion/THDM.pdf")
def limit(): method = '' channel = "bb" if INCLUDEACC: particleP = "X" else: particleP = "Z'" particle = 'b#bar{b}' multF = ZPTOBB THEORY = ['bstar'] if INCLUDEACC: THEORY.append('SSM') suffix = "_" + BTAGGING if ISMC: suffix += "_MC" if SY: suffix += "_comb" #if method=="cls": suffix="_CLs" if INCLUDEACC: suffix += "_acc" if SY: filename = "./combine/limits/bstar/" + BTAGGING + "/combined_run2/" + YEAR + "_M%d.txt" else: filename = "./combine/limits/bstar/" + BTAGGING + "/" + YEAR + "_M%d.txt" if CATEGORY != "": if SY: filename = filename.replace( BTAGGING + "/combined_run2/", BTAGGING + "/single_category/combined_run2/" + CATEGORY + "_") else: filename = filename.replace( BTAGGING + "/", BTAGGING + "/single_category/" + CATEGORY + "_") suffix += "_" + CATEGORY if ISMC: filename = filename.replace(".txt", "_MC.txt") mass, val = fillValues(filename) #print "mass =",mass #print "val =", val Obs0s = TGraph() Exp0s = TGraph() Exp1s = TGraphAsymmErrors() Exp2s = TGraphAsymmErrors() Sign = TGraph() pVal = TGraph() Best = TGraphAsymmErrors() Theory = {} for i, m in enumerate(mass): if not m in val: print "Key Error:", m, "not in value map" continue if INCLUDEACC: acc_factor = ACCEPTANCE[m] else: acc_factor = 1. n = Exp0s.GetN() Obs0s.SetPoint(n, m, val[m][0] * multF * acc_factor) Exp0s.SetPoint(n, m, val[m][3] * multF * acc_factor) Exp1s.SetPoint(n, m, val[m][3] * multF * acc_factor) Exp1s.SetPointError(n, 0., 0., (val[m][3] - val[m][2]) * multF * acc_factor, (val[m][4] - val[m][3]) * multF * acc_factor) Exp2s.SetPoint(n, m, val[m][3] * multF * acc_factor) Exp2s.SetPointError(n, 0., 0., (val[m][3] - val[m][1]) * multF * acc_factor, (val[m][5] - val[m][3]) * multF * acc_factor) if len(val[m]) > 6: Sign.SetPoint(n, m, val[m][6]) if len(val[m]) > 7: pVal.SetPoint(n, m, val[m][7]) if len(val[m]) > 8: Best.SetPoint(n, m, val[m][8]) if len(val[m]) > 10: Best.SetPointError(n, 0., 0., abs(val[m][9]), val[m][10]) for t in THEORY: Theory[t] = TGraphAsymmErrors() if 'bstar' == t: x = [] y = [] with open('bstar_deta1p1_lhc13TeV2.txt') as fin: for line in fin.readlines(): x.append(float(line.split()[0])) y.append(float(line.split()[1]) * 1000) for ind in range(len(x)): Theory[t].SetPoint(ind + 1, x[ind], y[ind]) Theory[t].SetLineColor(theoryLineColor[t]) Theory[t].SetFillColor(theoryFillColor[t]) Theory[t].SetFillStyle(theoryFillStyle[t]) Theory[t].SetLineWidth(2) continue Xs_dict = HVT[t]['Z']['XS'] if t != 'SSM' else SSM['Z'] for m in sorted(Xs_dict.keys()): if INCLUDEACC and t != 'SSM': acc_factor = ACCEPTANCE[m] else: acc_factor = 1. if m < SIGNALS[0] or m > SIGNALS[-1]: continue #if m < mass[0] or m > mass[-1]: continue #if t!= 'SSM' and m>4500: continue ## I don't have the higher mass xs if m > 4500: continue XsZ, XsZ_Up, XsZ_Down = 0., 0., 0. if t != 'SSM': XsZ = 1000. * HVT[t]['Z']['XS'][m] * SSM["BrZ"][ m] #assuming the same BR as the SSM Z' one XsZ_Up = XsZ * (1. + math.hypot(HVT[t]['Z']['QCD'][m][0] - 1., HVT[t]['Z']['PDF'][m][0] - 1.)) XsZ_Down = XsZ * (1. - math.hypot(1. - HVT[t]['Z']['QCD'][m][0], 1. - HVT[t]['Z']['PDF'][m][0])) else: XsZ = 1000. * SSM['Z'][m] * SSM["BrZ"][m] XsZ_Up = XsZ * (1. + math.hypot(HVT['A1']['Z']['QCD'][m][0] - 1., HVT['A1']['Z']['PDF'][m][0] - 1.)) XsZ_Down = XsZ * (1. - math.hypot(1. - HVT['A1']['Z']['QCD'][m][0], 1. - HVT['A1']['Z']['PDF'][m][0])) n = Theory[t].GetN() Theory[t].SetPoint(n, m, XsZ * acc_factor) Theory[t].SetPointError(n, 0., 0., (XsZ - XsZ_Down) * acc_factor, (XsZ_Up - XsZ) * acc_factor) Theory[t].SetLineColor(theoryLineColor[t]) Theory[t].SetFillColor(theoryFillColor[t]) Theory[t].SetFillStyle(theoryFillStyle[t]) Theory[t].SetLineWidth(2) #Theory[t].SetLineStyle(7) Exp2s.SetLineWidth(2) Exp2s.SetLineStyle(1) Obs0s.SetLineWidth(3) Obs0s.SetMarkerStyle(0) Obs0s.SetLineColor(1) Exp0s.SetLineStyle(2) Exp0s.SetLineWidth(3) Exp1s.SetFillColor(417) #kGreen+1 Exp1s.SetLineColor(417) #kGreen+1 Exp2s.SetFillColor(800) #kOrange Exp2s.SetLineColor(800) #kOrange Exp2s.GetXaxis().SetTitle("m_{" + particleP + "} (GeV)") Exp2s.GetXaxis().SetTitleSize(Exp2s.GetXaxis().GetTitleSize() * 1.25) Exp2s.GetXaxis().SetNoExponent(True) Exp2s.GetXaxis().SetMoreLogLabels(True) Exp2s.GetYaxis().SetTitle( "#sigma(" + particleP + ") #bf{#it{#Beta}}(" + particleP + " #rightarrow " + particle + "){} (fb)".format(" #times #Alpha" if INCLUDEACC else "")) Exp2s.GetYaxis().SetTitleOffset(1.5) Exp2s.GetYaxis().SetNoExponent(True) Exp2s.GetYaxis().SetMoreLogLabels() Sign.SetLineWidth(2) Sign.SetLineColor(629) Sign.GetXaxis().SetTitle("m_{" + particleP + "} (GeV)") Sign.GetXaxis().SetTitleSize(Sign.GetXaxis().GetTitleSize() * 1.1) Sign.GetYaxis().SetTitle("Significance") pVal.SetLineWidth(2) pVal.SetLineColor(629) pVal.GetXaxis().SetTitle("m_{" + particleP + "} (GeV)") pVal.GetXaxis().SetTitleSize(pVal.GetXaxis().GetTitleSize() * 1.1) pVal.GetYaxis().SetTitle("local p-Value") Best.SetLineWidth(2) Best.SetLineColor(629) Best.SetFillColor(629) Best.SetFillStyle(3003) Best.GetXaxis().SetTitle("m_{" + particleP + "} (GeV)") Best.GetXaxis().SetTitleSize(Best.GetXaxis().GetTitleSize() * 1.1) Best.GetYaxis().SetTitle("Best Fit (pb)") c1 = TCanvas("c1", "Exclusion Limits", 800, 600) c1.cd() #SetPad(c1.GetPad(0)) c1.GetPad(0).SetTopMargin(0.06) c1.GetPad(0).SetRightMargin(0.05) c1.GetPad(0).SetLeftMargin(0.12) c1.GetPad(0).SetTicks(1, 1) #c1.GetPad(0).SetGridx() #c1.GetPad(0).SetGridy() c1.GetPad(0).SetLogy() Exp2s.Draw("A3") Exp1s.Draw("SAME, 3") for t in THEORY: Theory[t].Draw("SAME, L3") Theory[t].Draw("SAME, L3X0Y0") Exp0s.Draw("SAME, L") if not options.blind: Obs0s.Draw("SAME, L") #setHistStyle(Exp2s) Exp2s.GetXaxis().SetTitleSize(0.050) Exp2s.GetYaxis().SetTitleSize(0.050) Exp2s.GetXaxis().SetLabelSize(0.045) Exp2s.GetYaxis().SetLabelSize(0.045) Exp2s.GetXaxis().SetTitleOffset(0.90) Exp2s.GetYaxis().SetTitleOffset(1.25) Exp2s.GetYaxis().SetMoreLogLabels(True) Exp2s.GetYaxis().SetNoExponent(True) if INCLUDEACC: Exp2s.GetYaxis().SetRangeUser(0.05, 5.e3) else: Exp2s.GetYaxis().SetRangeUser(0.1, 5.e3) #else: Exp2s.GetYaxis().SetRangeUser(0.1, 1.e2) #Exp2s.GetXaxis().SetRangeUser(mass[0], min(mass[-1], MAXIMUM[channel] if channel in MAXIMUM else 1.e6)) Exp2s.GetXaxis().SetRangeUser(SIGNALS[0], SIGNALS[-1]) #drawAnalysis(channel) drawAnalysis("") #drawRegion(channel, True) drawRegion("", True) #drawCMS(LUMI, "Simulation Preliminary") #Preliminary if CATEGORY == "": #drawCMS(LUMI, "Work in Progress", suppressCMS=True) drawCMS(LUMI, "", suppressCMS=True) else: #drawCMS(LUMI, "Work in Progress, "+CAT_LABELS[CATEGORY], suppressCMS=True) drawCMS(LUMI, CAT_LABELS[CATEGORY], suppressCMS=True) # legend top = 0.9 nitems = 4 + len(THEORY) leg = TLegend(0.55, top - nitems * 0.3 / 5., 0.98, top) #leg = TLegend(0.45, top-nitems*0.3/5., 0.98, top) leg.SetBorderSize(0) leg.SetFillStyle(0) #1001 leg.SetFillColor(0) leg.SetHeader("95% CL upper limits") leg.AddEntry(Obs0s, "Observed", "l") leg.AddEntry(Exp0s, "Expected", "l") leg.AddEntry(Exp1s, "#pm 1 std. deviation", "f") leg.AddEntry(Exp2s, "#pm 2 std. deviation", "f") for t in THEORY: leg.AddEntry(Theory[t], theoryLabel[t], "fl") leg.Draw() latex = TLatex() latex.SetNDC() latex.SetTextSize(0.045) latex.SetTextFont(42) #latex.DrawLatex(0.66, leg.GetY1()-0.045, particleP+" #rightarrow "+particle+"h") leg2 = TLegend(0.12, 0.225 - 2 * 0.25 / 5., 0.65, 0.225) leg2.SetBorderSize(0) leg2.SetFillStyle(0) #1001 leg2.SetFillColor(0) c1.GetPad(0).RedrawAxis() leg2.Draw() if not options.blind: Obs0s.Draw("SAME, L") c1.GetPad(0).Update() if not gROOT.IsBatch(): raw_input("Press Enter to continue...") c1.Print("combine/plotsLimit/ExclusionLimits/" + YEAR + suffix + ".png") c1.Print("combine/plotsLimit/ExclusionLimits/" + YEAR + suffix + ".pdf") if 'ah' in channel or 'sl' in channel: c1.Print("combine/plotsLimit/ExclusionLimits/" + YEAR + suffix + ".C") c1.Print("combine/plotsLimit/ExclusionLimits/" + YEAR + suffix + ".root") for t in THEORY: print "Model", t, ":", for m in range(mass[0], mass[-1], 1): if not (Theory[t].Eval(m) > Obs0s.Eval(m)) == ( Theory[t].Eval(m + 1) > Obs0s.Eval(m + 1)): print m, print "" return ##FIXME # ---------- Significance ---------- c2 = TCanvas("c2", "Significance", 800, 600) c2.cd() c2.GetPad(0).SetTopMargin(0.06) c2.GetPad(0).SetRightMargin(0.05) c2.GetPad(0).SetTicks(1, 1) c2.GetPad(0).SetGridx() c2.GetPad(0).SetGridy() Sign.GetYaxis().SetRangeUser(0., 5.) Sign.Draw("AL3") #drawCMS(LUMI, "Preliminary") drawCMS(LUMI, "Work in Progress", suppressCMS=True) drawAnalysis(channel[1:3]) c2.Print("combine/plotsLimit/Significance/" + YEAR + suffix + ".png") c2.Print("combine/plotsLimit/Significance/" + YEAR + suffix + ".pdf") # c2.Print("plotsLimit/Significance/"+YEAR+suffix+".root") # c2.Print("plotsLimit/Significance/"+YEAR+suffix+".C") # ---------- p-Value ---------- c3 = TCanvas("c3", "p-Value", 800, 600) c3.cd() c3.GetPad(0).SetTopMargin(0.06) c3.GetPad(0).SetRightMargin(0.05) c3.GetPad(0).SetTicks(1, 1) c3.GetPad(0).SetGridx() c3.GetPad(0).SetGridy() c3.GetPad(0).SetLogy() pVal.Draw("AL3") pVal.GetYaxis().SetRangeUser(2.e-7, 0.5) ci = [ 1., 0.317310508, 0.045500264, 0.002699796, 0.00006334, 0.000000573303, 0.000000001973 ] line = TLine() line.SetLineColor(922) line.SetLineStyle(7) text = TLatex() text.SetTextColor(922) text.SetTextSize(0.025) text.SetTextAlign(12) for i in range(1, len(ci) - 1): line.DrawLine(pVal.GetXaxis().GetXmin(), ci[i] / 2, pVal.GetXaxis().GetXmax(), ci[i] / 2) text.DrawLatex(pVal.GetXaxis().GetXmax() * 1.01, ci[i] / 2, "%d #sigma" % i) #drawCMS(LUMI, "Preliminary") drawCMS(LUMI, "Work in Progress", suppressCMS=True) drawAnalysis(channel[1:3]) c3.Print("combine/plotsLimit/pValue/" + YEAR + suffix + ".png") c3.Print("combine/plotsLimit/pValue/" + YEAR + suffix + ".pdf") # c3.Print("plotsLimit/pValue/"+YEAR+suffix+".root") # c3.Print("plotsLimit/pValue/"+YEAR+suffix+".C") # --------- Best Fit ---------- c4 = TCanvas("c4", "Best Fit", 800, 600) c4.cd() c4.GetPad(0).SetTopMargin(0.06) c4.GetPad(0).SetRightMargin(0.05) c4.GetPad(0).SetTicks(1, 1) c4.GetPad(0).SetGridx() c4.GetPad(0).SetGridy() Best.Draw("AL3") #drawCMS(LUMI, "Preliminary") drawCMS(LUMI, "Work in Progress", suppressCMS=True) drawAnalysis(channel[1:3]) c4.Print("combine/plotsLimit/BestFit/" + YEAR + suffix + ".png") c4.Print("combine/plotsLimit/BestFit/" + YEAR + suffix + ".pdf") # c4.Print("plotsLimit/BestFit/"+YEAR+suffix+".root") # c4.Print("plotsLimit/BestFit/"+YEAR+suffix+".C") if not gROOT.IsBatch(): raw_input("Press Enter to continue...") if 'ah' in channel: outFile = TFile("bands.root", "RECREATE") outFile.cd() pVal.Write("graph") Best.Write("best") outFile.Close()
def plot(var, cut, year, norm=False, nm1=False): from root_numpy import root2array, fill_hist, array2root import numpy.lib.recfunctions as rfn ### Preliminary Operations ### treeRead = not cut in [ "nnqq", "en", "enqq", "mn", "mnqq", "ee", "eeqq", "mm", "mmqq", "em", "emqq", "qqqq" ] # Read from tree channel = cut unit = '' if "GeV" in variable[var]['title']: unit = ' GeV' isBlind = BLIND and 'SR' in channel isAH = False #'qqqq' in channel or 'hp' in channel or 'lp' in channel showSignal = False if 'SB' in cut or 'TR' in cut else True #'SR' in channel or channel=='qqqq'#or len(channel)==5 stype = "HVT model B" if len(sign) > 0 and 'AZh' in sign[0]: stype = "2HDM" elif len(sign) > 0 and 'monoH' in sign[0]: stype = "Z'-2HDM m_{A}=300 GeV" if treeRead: for k in sorted(alias.keys(), key=len, reverse=True): if BTAGGING == 'semimedium': if k in cut: cut = cut.replace(k, aliasSM[k]) else: if k in cut: cut = cut.replace( k, alias[k].format(WP=working_points[BTAGGING])) print "Plotting from", ("tree" if treeRead else "file"), var, "in", channel, "channel with:" print " cut :", cut if var == 'jj_deltaEta_widejet': if "jj_deltaEta_widejet<1.1 && " in cut: print print "omitting jj_deltaEta_widejet<1.1 cut to draw the deltaEta distribution" print cut = cut.replace("jj_deltaEta_widejet<1.1 && ", "") else: print print "no 'jj_deltaEta_widejet<1.1 && ' in the cut string detected, so it cannot be ommited explicitly" print ### Create and fill MC histograms ### # Create dict file = {} tree = {} hist = {} ### Create and fill MC histograms ### for i, s in enumerate(back + sign): if True: #FIXME if variable[var]['nbins'] > 0: hist[s] = TH1F( s, ";" + variable[var]['title'] + ";Events / ( " + str( (variable[var]['max'] - variable[var]['min']) / variable[var]['nbins']) + unit + " );" + ('log' if variable[var]['log'] else ''), variable[var]['nbins'], variable[var]['min'], variable[var]['max']) else: hist[s] = TH1F( s, ";" + variable[var]['title'] + ";Events" + ('log' if variable[var]['log'] else ''), len(variable[var]['bins']) - 1, array('f', variable[var]['bins'])) hist[s].Sumw2() for j, ss in enumerate(sample[s]['files']): if not 'data' in s: if year == "run2" or year in ss: arr = root2array( NTUPLEDIR + ss + ".root", branches=[ var, "jpt_1", "jpt_2", "eventWeightLumi", "TMath::Abs(jflavour_1)==5 && TMath::Abs(jflavour_2)==5", "TMath::Abs(jflavour_1)==5 && TMath::Abs(jflavour_2)!=5", "TMath::Abs(jflavour_1)!=5 && TMath::Abs(jflavour_2)==5", "TMath::Abs(jflavour_1)!=5 && TMath::Abs(jflavour_2)!=5" ], selection=cut if len(cut) > 0 else "") print "imported " + NTUPLEDIR + ss + ".root" arr.dtype.names = [ var, "jpt_1", "jpt_2", "eventWeightLumi", "bb", "bq", "qb", "qq" ] MANtag_eff1 = np.array(map(MANtag_eff, arr["jpt_1"])) MANtag_eff2 = np.array(map(MANtag_eff, arr["jpt_2"])) MANtag_mis1 = np.array(map(MANtag_mis, arr["jpt_1"])) MANtag_mis2 = np.array(map(MANtag_mis, arr["jpt_2"])) MANtag_weight = np.multiply( arr["eventWeightLumi"], np.multiply(arr['bb'], np.multiply(MANtag_eff1, MANtag_eff2)) + np.multiply( arr['bq'], np.multiply(MANtag_eff1, MANtag_mis2)) + np.multiply(arr['qb'], np.multiply(MANtag_mis1, MANtag_eff2)) + np.multiply(arr['qq'], np.multiply(MANtag_mis1, MANtag_mis2))) fill_hist(hist[s], arr[var], weights=MANtag_weight) deepCSV_eff1 = np.array(map(deepCSV_eff, arr["jpt_1"])) deepCSV_eff2 = np.array(map(deepCSV_eff, arr["jpt_2"])) deepCSV_mis1 = np.array(map(deepCSV_mis, arr["jpt_1"])) deepCSV_mis2 = np.array(map(deepCSV_mis, arr["jpt_2"])) deepCSV_weight = np.multiply( arr["eventWeightLumi"], np.multiply( arr['bb'], np.multiply(deepCSV_eff1, deepCSV_eff2)) + np.multiply( arr['bq'], np.multiply(deepCSV_eff1, deepCSV_mis2)) + np.multiply( arr['qb'], np.multiply(deepCSV_mis1, deepCSV_eff2)) + np.multiply( arr['qq'], np.multiply(deepCSV_mis1, deepCSV_mis2))) if var == "jj_mass_widejet" and options.save and not "data" in ss: arr = rfn.append_fields(arr, "MANtag_weight", MANtag_weight, usemask=False) arr = rfn.append_fields(arr, "deepCSV_weight", deepCSV_weight, usemask=False) array2root(arr, NTUPLEDIR + "MANtag/" + ss + "_" + BTAGGING + ".root", treename="tree", mode='recreate') print "saved as", NTUPLEDIR + "MANtag/" + ss + "_" + BTAGGING + ".root" arr = None #tree[s] = TChain("tree") #for j, ss in enumerate(sample[s]['files']): # if not 'data' in s or ('data' in s and ss in pd): # if year=="run2" or year in ss: # tree[s].Add(NTUPLEDIR + ss + ".root") #if variable[var]['nbins']>0: hist[s] = TH1F(s, ";"+variable[var]['title']+";Events / ( "+str((variable[var]['max']-variable[var]['min'])/variable[var]['nbins'])+unit+" );"+('log' if variable[var]['log'] else ''), variable[var]['nbins'], variable[var]['min'], variable[var]['max']) #else: hist[s] = TH1F(s, ";"+variable[var]['title']+";Events"+('log' if variable[var]['log'] else ''), len(variable[var]['bins'])-1, array('f', variable[var]['bins'])) #hist[s].Sumw2() #cutstring = "(eventWeightLumi)" + ("*("+cut+")" if len(cut)>0 else "") #tree[s].Project(s, var, cutstring) #if not tree[s].GetTree()==None: hist[s].SetOption("%s" % tree[s].GetTree().GetEntriesFast()) #else: # Histogram written to file # for j, ss in enumerate(sample[s]['files']): # if not 'data' in s or ('data' in s and ss in pd): # file[ss] = TFile(NTUPLEDIR + ss + ".root", "R") # if file[ss].IsZombie(): # print "WARNING: file", NTUPLEDIR + ss + ".root", "does not exist" # continue # tmphist = file[ss].Get(cut+"/"+var) # if tmphist==None: continue # if not s in hist.keys(): hist[s] = tmphist # else: hist[s].Add(tmphist) hist[s].Scale(sample[s]['weight'] if hist[s].Integral() >= 0 else 0) hist[s].SetFillColor(sample[s]['fillcolor']) hist[s].SetFillStyle(sample[s]['fillstyle']) hist[s].SetLineColor(sample[s]['linecolor']) hist[s].SetLineStyle(sample[s]['linestyle']) if channel.endswith('TR') and channel.replace('TR', '') in topSF: hist['TTbarSL'].Scale(topSF[channel.replace('TR', '')][0]) hist['ST'].Scale(topSF[channel.replace('TR', '')][0]) hist['BkgSum'] = hist['data_obs'].Clone( "BkgSum") if 'data_obs' in hist else hist[back[0]].Clone("BkgSum") hist['BkgSum'].Reset("MICES") hist['BkgSum'].SetFillStyle(3003) hist['BkgSum'].SetFillColor(1) for i, s in enumerate(back): hist['BkgSum'].Add(hist[s]) #if options.norm: # for i, s in enumerate(back + ['BkgSum']): hist[s].Scale(hist[data[0]].Integral()/hist['BkgSum'].Integral()) # Create data and Bkg sum histograms if options.blind or 'SR' in channel: hist['data_obs'] = hist['BkgSum'].Clone("data_obs") hist['data_obs'].Reset("MICES") # Set histogram style hist['data_obs'].SetMarkerStyle(20) hist['data_obs'].SetMarkerSize(1.25) for i, s in enumerate(back + sign + ['BkgSum']): addOverflow(hist[s], False) # Add overflow for i, s in enumerate(sign): hist[s].SetLineWidth(3) for i, s in enumerate(sign): sample[s][ 'plot'] = True #sample[s]['plot'] and s.startswith(channel[:2]) if isAH: for i, s in enumerate(back): hist[s].SetFillStyle(3005) hist[s].SetLineWidth(2) #for i, s in enumerate(sign): # hist[s].SetFillStyle(0) if not var == "Events": sfnorm = hist[data[0]].Integral() / hist['BkgSum'].Integral() print "Applying SF:", sfnorm for i, s in enumerate(back + ['BkgSum']): hist[s].Scale(sfnorm) if BLIND and var.endswith("Mass"): for i, s in enumerate(data + back + ['BkgSum']): first, last = hist[s].FindBin(65), hist[s].FindBin(135) for j in range(first, last): hist[s].SetBinContent(j, -1.e-4) if BLIND and var.endswith("Tau21"): for i, s in enumerate(data): first, last = hist[s].FindBin(0), hist[s].FindBin(0.6) for j in range(first, last): hist[s].SetBinContent(j, -1.e-4) # Create stack if variable[var]['nbins'] > 0: bkg = THStack( "Bkg", ";" + hist['BkgSum'].GetXaxis().GetTitle() + ";Events / ( " + str( (variable[var]['max'] - variable[var]['min']) / variable[var]['nbins']) + unit + " )") else: bkg = THStack("Bkg", ";" + hist['BkgSum'].GetXaxis().GetTitle() + ";Events; ") for i, s in enumerate(back): bkg.Add(hist[s]) # Legend leg = TLegend(0.65, 0.6, 0.95, 0.9) leg.SetBorderSize(0) leg.SetFillStyle(0) #1001 leg.SetFillColor(0) if len(data) > 0: leg.AddEntry(hist[data[0]], sample[data[0]]['label'], "pe") for i, s in reversed(list(enumerate(['BkgSum'] + back))): leg.AddEntry(hist[s], sample[s]['label'], "f") if showSignal: for i, s in enumerate(sign): if sample[s]['plot']: leg.AddEntry(hist[s], sample[s]['label'], "fl") leg.SetY1(0.9 - leg.GetNRows() * 0.05) # --- Display --- c1 = TCanvas("c1", hist.values()[0].GetXaxis().GetTitle(), 800, 800 if RATIO else 600) if RATIO: c1.Divide(1, 2) setTopPad(c1.GetPad(1), RATIO) setBotPad(c1.GetPad(2), RATIO) c1.cd(1) c1.GetPad(bool(RATIO)).SetTopMargin(0.06) c1.GetPad(bool(RATIO)).SetRightMargin(0.05) c1.GetPad(bool(RATIO)).SetTicks(1, 1) log = variable[var]['log'] #"log" in hist['BkgSum'].GetZaxis().GetTitle() if log: c1.GetPad(bool(RATIO)).SetLogy() # Draw bkg.Draw("HIST") # stack hist['BkgSum'].Draw("SAME, E2") # sum of bkg if not isBlind and len(data) > 0: hist['data_obs'].Draw("SAME, PE") # data if 'sync' in hist: hist['sync'].Draw("SAME, PE") #data_graph.Draw("SAME, PE") if showSignal: smagn = 1. #if treeRead else 1.e2 #if log else 1.e2 for i, s in enumerate(sign): # if sample[s]['plot']: hist[s].Scale(smagn) hist[s].Draw( "SAME, HIST" ) # signals Normalized, hist[s].Integral()*sample[s]['weight'] textS = drawText(0.80, 0.9 - leg.GetNRows() * 0.05 - 0.02, stype + " (x%d)" % smagn, True) #bkg.GetYaxis().SetTitleOffset(bkg.GetYaxis().GetTitleOffset()*1.075) bkg.GetYaxis().SetTitleOffset(0.9) #bkg.GetYaxis().SetTitleOffset(2.) bkg.SetMaximum((5. if log else 1.25) * max( bkg.GetMaximum(), hist['data_obs'].GetBinContent(hist['data_obs'].GetMaximumBin()) + hist['data_obs'].GetBinError(hist['data_obs'].GetMaximumBin()))) #if bkg.GetMaximum() < max(hist[sign[0]].GetMaximum(), hist[sign[-1]].GetMaximum()): bkg.SetMaximum(max(hist[sign[0]].GetMaximum(), hist[sign[-1]].GetMaximum())*1.25) bkg.SetMinimum( max( min(hist['BkgSum'].GetBinContent(hist['BkgSum'].GetMinimumBin( )), hist['data_obs'].GetMinimum()), 5.e-1) if log else 0.) if log: bkg.GetYaxis().SetNoExponent(bkg.GetMaximum() < 1.e4) #bkg.GetYaxis().SetMoreLogLabels(True) bkg.GetXaxis().SetRangeUser(variable[var]['min'], variable[var]['max']) #if log: bkg.SetMinimum(1) leg.Draw() #drawCMS(LUMI[year], "Preliminary") drawCMS(LUMI[year], "Work in Progress", suppressCMS=True) drawRegion('XVH' + channel, True) drawAnalysis(channel) setHistStyle(bkg, 1.2 if RATIO else 1.1) setHistStyle(hist['BkgSum'], 1.2 if RATIO else 1.1) if RATIO: c1.cd(2) err = hist['BkgSum'].Clone("BkgErr;") err.SetTitle("") err.GetYaxis().SetTitle("Data / MC") err.GetYaxis().SetTitleOffset(0.9) err.GetXaxis().SetRangeUser(variable[var]['min'], variable[var]['max']) for i in range(1, err.GetNbinsX() + 1): err.SetBinContent(i, 1) if hist['BkgSum'].GetBinContent(i) > 0: err.SetBinError( i, hist['BkgSum'].GetBinError(i) / hist['BkgSum'].GetBinContent(i)) setBotStyle(err) errLine = err.Clone("errLine") errLine.SetLineWidth(1) errLine.SetFillStyle(0) res = hist['data_obs'].Clone("Residues") for i in range(0, res.GetNbinsX() + 1): if hist['BkgSum'].GetBinContent(i) > 0: res.SetBinContent( i, res.GetBinContent(i) / hist['BkgSum'].GetBinContent(i)) res.SetBinError( i, res.GetBinError(i) / hist['BkgSum'].GetBinContent(i)) if 'sync' in hist: res.SetMarkerColor(2) res.SetMarkerStyle(31) res.Reset() for i in range(0, res.GetNbinsX() + 1): x = hist['data_obs'].GetXaxis().GetBinCenter(i) if hist['sync'].GetBinContent(hist['sync'].FindBin(x)) > 0: res.SetBinContent( i, hist['data_obs'].GetBinContent( hist['data_obs'].FindBin(x)) / hist['sync'].GetBinContent(hist['sync'].FindBin(x))) res.SetBinError( i, hist['data_obs'].GetBinError( hist['data_obs'].FindBin(x)) / hist['sync'].GetBinContent(hist['sync'].FindBin(x))) setBotStyle(res) #err.GetXaxis().SetLabelOffset(err.GetXaxis().GetLabelOffset()*5) #err.GetXaxis().SetTitleOffset(err.GetXaxis().GetTitleOffset()*2) err.Draw("E2") errLine.Draw("SAME, HIST") if not isBlind and len(data) > 0: res.Draw("SAME, PE0") #res_graph.Draw("SAME, PE0") if len(err.GetXaxis().GetBinLabel( 1)) == 0: # Bin labels: not a ordinary plot drawRatio(hist['data_obs'], hist['BkgSum']) drawStat(hist['data_obs'], hist['BkgSum']) c1.Update() if gROOT.IsBatch(): if channel == "": channel = "nocut" varname = var.replace('.', '_').replace('()', '') if not os.path.exists("plots/" + channel): os.makedirs("plots/" + channel) suffix = '' if "b" in channel or 'mu' in channel: suffix += "_" + BTAGGING c1.Print("plots/MANtag_study/" + channel + "/" + varname + "_" + year + suffix + ".png") c1.Print("plots/MANtag_study/" + channel + "/" + varname + "_" + year + suffix + ".pdf") # Print table printTable(hist, sign) # if True: # sFile = TFile("sync/data_2016.root", "RECREATE") # sFile.cd() # hist['data_obs']. if not gROOT.IsBatch(): raw_input("Press Enter to continue...")