File indexing completed on 2023-03-17 11:28:59
0001
0002
0003 from __future__ import print_function
0004 from builtins import range
0005 import copy
0006 import math
0007 import array
0008 import collections
0009
0010 import ROOT
0011 ROOT.gROOT.SetBatch(True)
0012 ROOT.PyConfig.IgnoreCommandLineOptions = True
0013
0014 import Validation.RecoTrack.plotting.plotting as plotting
0015 import Validation.RecoTrack.plotting.trackingPlots as trackingPlots
0016
0017 _colorindex = 2000
0018 _colortmp = {}
0019 def makeColor(hexstr):
0020 r = int("0x"+hexstr[0:2], 16)
0021 g = int("0x"+hexstr[2:4], 16)
0022 b = int("0x"+hexstr[4:6], 16)
0023
0024 global _colorindex
0025 global _colortmp
0026
0027 _colorindex += 1
0028 _colortmp[_colorindex] = ROOT.TColor(_colorindex, r/255., g/255., b/255.)
0029 return _colorindex
0030
0031 iter_colors = dict(
0032 InitialStep = makeColor("cde7ff"),
0033 HighPtTripletStep = makeColor("b2d3f3"),
0034 LowPtQuadStep = makeColor("97c0e8"),
0035 LowPtTripletStep = makeColor("7cacdc"),
0036 PixelPairStep = makeColor("6199d1"),
0037 DetachedQuadStep = makeColor("fdddc2"),
0038 DetachedTripletStep = makeColor("f8cba6"),
0039 MixedTripletStep = makeColor("f4ba8a"),
0040 PixelLessStep = makeColor("dee8c9"),
0041 TobTecStep = makeColor("cddcab"),
0042 JetCoreRegionalStep = makeColor("c1b3d1"),
0043 MuonSeededStepInOut = makeColor("e2a8a5"),
0044 MuonSeededStepOutIn = makeColor("a74a44"),
0045 )
0046
0047 class Files:
0048 def __init__(self, filesLegends):
0049 self._files = []
0050 self._legends = []
0051 self._styles = []
0052 for fl in filesLegends:
0053 self._legends.append(fl[1])
0054 self._styles.append(fl[2])
0055 if isinstance(fl[0], tuple):
0056 self._files.append([ROOT.TFile.Open(f) for f in fl[0]])
0057 else:
0058 self._files.append(ROOT.TFile.Open(fl[0]))
0059
0060 def getFiles(self):
0061 return self._files
0062
0063 def getHistos(self, name):
0064 ret = []
0065 for f in self._files:
0066 path = "DQMData/Run 1/"+name
0067 if isinstance(f, list):
0068 fil = f[0]
0069
0070
0071
0072 obj = fil.Get(path)
0073 else:
0074
0075
0076 obj = f.Get(path)
0077 if not obj:
0078 raise Exception("Object %s not found from %s" % (path, f.GetPath()))
0079 ret.append(obj)
0080 return ret
0081
0082 def getLegends(self):
0083 return self._legends
0084
0085 def getStyles(self):
0086 return self._styles
0087
0088 def applyStyle(h, color, markerStyle):
0089 h.SetMarkerStyle(markerStyle)
0090 h.SetMarkerColor(color)
0091 h.SetMarkerSize(1.2)
0092 h.SetLineColor(color)
0093 h.SetLineWidth(2)
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 class Plot:
0107 def __init__(self, histos, legends, styles):
0108 self._histos = histos[:]
0109 self._legends = legends[:]
0110 self._styles = styles[:]
0111
0112 def remove(self, i):
0113 del self._histos[i]
0114 del self._legends[i]
0115 del self._styles[i]
0116
0117 def histos(self):
0118 return self._histos
0119
0120 def setHistos(self, histos):
0121 if len(self._histos) != len(histos):
0122 raise Exception("Had %d histograms, was trying to set %d" % (len(self._histos), len(histos)))
0123 self._histos = histos
0124
0125 def scale(self, scale):
0126 for h in self._histos:
0127 h.Scale(scale)
0128
0129 def rebin(self, rebin):
0130 for h in self._histos:
0131 h.Rebin(rebin)
0132
0133 def normalizeToUnitArea(self):
0134 for h in self._histos:
0135 if h is None:
0136 continue
0137 i = h.Integral()
0138 if i == 0:
0139 continue
0140 if h.GetSumw2().fN <= 0:
0141 h.Sumw2()
0142 h.Scale(1.0/i)
0143
0144 def draw(self, opt=""):
0145 self._isHist = ("hist" in opt.lower())
0146
0147 for h, style in zip(self._histos, self._styles):
0148 style(h)
0149 if self._isHist:
0150 h.SetLineWidth(3)
0151
0152 h.Draw("same"+opt)
0153
0154 def addToLegend(self, legend, legendColumns):
0155 st = "LP"
0156 if self._isHist:
0157 st = "L"
0158
0159 for h, label in zip(self._histos, self._legends):
0160 legend.AddEntry(h, label, st)
0161
0162 def getXmin(self):
0163 if len(self._histos) == 0:
0164 return 0
0165 return min([h.GetXaxis().GetBinLowEdge(h.GetXaxis().GetFirst()) for h in self._histos])
0166
0167 def getXmax(self):
0168 if len(self._histos) == 0:
0169 return 1
0170 return max([h.GetXaxis().GetBinUpEdge(h.GetXaxis().GetLast()) for h in self._histos])
0171
0172 def getYmax(self):
0173 if len(self._histos) == 0:
0174 return 1
0175 return max([h.GetMaximum() for h in self._histos])
0176
0177 class PlotStack:
0178 def __init__(self):
0179 self._histos = []
0180 self._legends = []
0181
0182 def add(self, histo, legend):
0183 histo.ResetBit(ROOT.TH1.kIsAverage)
0184 self._histos.append(histo)
0185 self._legends.append(legend)
0186
0187 def draw(self, opt=""):
0188 self._stack = ROOT.THStack()
0189 for h in self._histos:
0190 self._stack.Add(h)
0191 self._stack.Draw("same"+opt)
0192
0193 def addToLegend(self, legend, legendColumns):
0194 st = "f"
0195 for h, label in zip(self._histos, self._legends):
0196 legend.AddEntry(h, label, st)
0197
0198
0199
0200 class PlotText:
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211 def __init__(self, x, y, text, size=None, bold=True, align="left", color=ROOT.kBlack, font=None):
0212 self.x = x
0213 self.y = y
0214 self.text = text
0215
0216 self.l = ROOT.TLatex()
0217 self.l.SetNDC()
0218 if not bold:
0219 self.l.SetTextFont(self.l.GetTextFont()-20)
0220 if font is not None:
0221 self.l.SetTextFont(font)
0222 if size is not None:
0223 self.l.SetTextSize(size)
0224 if isinstance(align, basestring):
0225 if align.lower() == "left":
0226 self.l.SetTextAlign(11)
0227 elif align.lower() == "center":
0228 self.l.SetTextAlign(21)
0229 elif align.lower() == "right":
0230 self.l.SetTextAlign(31)
0231 else:
0232 raise Exception("Error: Invalid option '%s' for text alignment! Options are: 'left', 'center', 'right'."%align)
0233 else:
0234 self.l.SetTextAlign(align)
0235 self.l.SetTextColor(color)
0236
0237
0238
0239
0240
0241
0242 def Draw(self, options=None):
0243 self.l.DrawLatex(self.x, self.y, self.text)
0244
0245
0246 class PlotTextBox:
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257 def __init__(self, xmin, ymin, xmax, ymax, lineheight=0.05, fillColor=ROOT.kWhite, transparent=True, **kwargs):
0258
0259 self.xmin = xmin
0260 self.xmax = xmax
0261 self.ymin = ymin
0262 self.ymax = ymax
0263 self.lineheight = lineheight
0264 self.fillColor = fillColor
0265 self.transparent = transparent
0266 self.texts = []
0267 self.textArgs = {}
0268 self.textArgs.update(kwargs)
0269
0270 self.currenty = ymax
0271
0272 def clone(self):
0273 return copy.deepcopy(self)
0274
0275
0276 def addText(self, text, yspace=0):
0277 self.currenty -= self.lineheight
0278 self.currenty -= yspace
0279 self.addPlotObject(PlotText(self.xmin+0.01, self.currenty, text, **self.textArgs))
0280
0281 def replaceText(self, index, text):
0282 y = self.currenty + (len(self.texts)-1-index)*self.lineheight
0283 self.replacePlotObject(index, PlotText(self.xmin+0.01, y, text, **self.textArgs))
0284
0285 def removeText(self, index):
0286 self.currenty += self.lineheight
0287 self.removePlotObject(index)
0288
0289
0290 def addPlotObject(self, obj):
0291 self.texts.append(obj)
0292
0293 def replacePlotObject(self, index, obj):
0294 self.texts[index] = obj
0295
0296 def removePlotObject(self, index):
0297 del self.texts[index]
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308 def move(self, dx=0, dy=0, dw=0, dh=0):
0309 self.xmin += dx
0310 self.xmax += dx
0311 if self.ymin is not None:
0312 self.ymin += dy
0313 self.ymax += dy
0314 self.currenty += dy
0315
0316 self.xmax += dw
0317 if self.ymin is not None:
0318 self.ymin -= dh
0319
0320 for t in self.texts:
0321 t.x += dx
0322 t.y += dy
0323
0324
0325
0326
0327 def Draw(self, options=""):
0328 if not self.transparent:
0329 ymin = self.ymin
0330 if ymin is None:
0331 ymin = self.currenty - 0.02
0332 self.pave = ROOT.TPave(self.xmin, ymin, self.xmax, self.ymax, 0, "NDC")
0333 self.pave.SetFillColor(self.fillColor)
0334 self.pave.Draw(options)
0335 for t in self.texts:
0336 t.Draw(options)
0337
0338 def calculateEfficiency(tfile, num_name, denom_name, rebin=None):
0339 num = tfile.Get(num_name)
0340 denom = tfile.Get(denom_name)
0341 if not num:
0342 raise Exception("Did not find %s from %s" % (num_name, tfile.GetName()))
0343 if not denom:
0344 raise Exception("Did not find %s from %s" % (denom_name, tfile.GetName()))
0345
0346 eff = num.Clone()
0347 den = denom.Clone()
0348 if rebin is not None:
0349 eff.Rebin(rebin)
0350 den.Rebin(rebin)
0351 eff.Divide(den)
0352 return eff
0353
0354 def main():
0355 ROOT.gROOT.LoadMacro("tdrstyle.C")
0356 ROOT.setTDRStyle()
0357 ROOT.gROOT.LoadMacro("CMS_lumi_v2.C")
0358
0359 ROOT.gStyle.SetTitleYOffset(1.0)
0360 ROOT.gStyle.SetPadGridX(True)
0361 ROOT.gStyle.SetPadGridY(True)
0362
0363 styleRun2 = lambda h: applyStyle(h, ROOT.kBlue, 21)
0364 styleRun2Realistic = lambda h: applyStyle(h, ROOT.kMagenta, 34)
0365 stylePhase1 = lambda h: applyStyle(h, ROOT.kRed, 20)
0366 stylePhase1PU70 = lambda h: applyStyle(h, ROOT.kBlack, 22)
0367 stylePhase1CA = lambda h: applyStyle(h, ROOT.kBlack, 22)
0368
0369 stylePU0 = lambda h: applyStyle(h, ROOT.kBlue, 21)
0370 stylePU35 = lambda h: applyStyle(h, ROOT.kRed, 20)
0371 stylePU50 = lambda h: applyStyle(h, ROOT.kBlack, 22)
0372 stylePU70 = lambda h: applyStyle(h, ROOT.kOrange+7, 34)
0373
0374 phase0 = (
0375
0376 "DQM_Phase0_pu35_v4.root",
0377
0378 "2016",
0379 styleRun2
0380 )
0381 phase1 = (
0382
0383 "DQM_Phase1_pu35_v7.root",
0384
0385 "2017",
0386 stylePhase1
0387 )
0388 phase1ca = (
0389
0390 "DQM_Phase1CA_pu35_v4.root",
0391
0392 "2017 (CA)",
0393 stylePhase1CA
0394 )
0395
0396
0397 files1 = Files([phase0, phase1])
0398 files1ca = Files([phase0, phase1ca])
0399 files2 = Files([phase1, phase1ca])
0400 files2_pu50 = Files([("DQM_Phase1_pu50_v7.root", "2017", stylePhase1), ("DQM_Phase1CA_pu50_v4.root", "2017 (CA)", stylePhase1CA)])
0401 files2_pu70 = Files([("DQM_Phase1_pu70_v7.root", "2017", stylePhase1), ("DQM_Phase1CA_pu70_v4.root", "2017 (CA)", stylePhase1CA)])
0402
0403 filespu = Files([
0404
0405
0406
0407 ("DQM_Phase1_pu0_v7.root", "2017 no PU", stylePU0),
0408 ("DQM_Phase1_pu35_v7.root", "2017 #LTPU#GT=35", stylePU35),
0409 ("DQM_Phase1_pu50_v7.root", "2017 #LTPU#GT=50", stylePU50),
0410 ("DQM_Phase1_pu70_v7.root", "2017 #LTPU#GT=70", stylePU70),
0411 ])
0412 filescapu = Files([
0413 ("DQM_Phase1CA_pu0_v5.root", "2017 (CA) no PU", stylePU0),
0414 ("DQM_Phase1CA_pu35_v4.root", "2017 (CA) #LTPU#GT=35", stylePU35),
0415 ("DQM_Phase1CA_pu50_v4.root", "2017 (CA) #LTPU#GT=50", stylePU50),
0416 ("DQM_Phase1CA_pu70_v4.root", "2017 (CA) #LTPU#GT=70", stylePU70),
0417 ])
0418
0419 files0pu_time = Files([
0420 ("../DQM_Phase0_ttbar_pu0_v1.root", "2016 no PU", stylePU0),
0421 ("../DQM_Phase0_ttbar_pu35_v1.root", "2016 #LTPU#GT=35", stylePU35),
0422 ("../DQM_Phase0_ttbar_pu50_v1.root", "2016 #LTPU#GT=50", stylePU50),
0423 ("../DQM_Phase0_ttbar_pu70_v1.root", "2016 #LTPU#GT=70", stylePU70),
0424 ])
0425 filespu_time = Files([
0426 ("../DQM_Phase1_ttbar_pu0_v5.root", "2017 no PU", stylePU0),
0427 ("../DQM_Phase1_ttbar_pu35_v5.root", "2017 #LTPU#GT=35", stylePU35),
0428 ("../DQM_Phase1_ttbar_pu50_v5.root", "2017 #LTPU#GT=50", stylePU50),
0429 ("../DQM_Phase1_ttbar_pu70_v5.root", "2017 #LTPU#GT=70", stylePU70),
0430 ])
0431 filescapu_time = Files([
0432 ("../DQM_Phase1CA_ttbar_pu0_v5.root", "2017 (CA) no PU", stylePU0),
0433 ("../DQM_Phase1CA_ttbar_pu35_v5.root", "2017 (CA) #LTPU#GT=35", stylePU35),
0434 ("../DQM_Phase1CA_ttbar_pu50_v5.root", "2017 (CA) #LTPU#GT=50", stylePU50),
0435 ("../DQM_Phase1CA_ttbar_pu70_v5.root", "2017 (CA) #LTPU#GT=70", stylePU70),
0436 ])
0437
0438
0439 pileup = "#LTPU#GT=35"
0440
0441 plotEffAndFake(files1, "ttbar_pu35_phase0_phase1", pileup)
0442 plotEffAndFake(files1ca, "ttbar_pu35_phase0_phase1ca", pileup, hasCA=True)
0443 plotEffAndFake(files2, "ttbar_pu35_phase1_ca", pileup, hasCA=True)
0444 plotEffAndFake(files2_pu50, "ttbar_pu50_phase1_ca", pileup.replace("35", "50"), hasCA=True)
0445 plotEffAndFake(files2_pu70, "ttbar_pu70_phase1_ca", pileup.replace("35", "70"), hasPU70=True, hasCA=True)
0446
0447 plotResol(files1, "ttbar_pu35_phase0_phase1", pileup)
0448
0449 plotResol(files2, "ttbar_pu35_phase1_ca", pileup)
0450
0451 plotVertex(files1, "ttbar_pu35_phase0_phase1", pileup)
0452
0453 plotVertex(files2, "ttbar_pu35_phase1_ca", pileup)
0454
0455
0456 plotColoredEff(files1.getFiles()[1], "ttbar_pu35_phase1", pileup)
0457 plotColoredEff(files1ca.getFiles()[1], "ttbar_pu35_phase1ca", pileup)
0458
0459
0460
0461 plotEffAndFake(filespu, "ttbar_phase1_vs_pu", None, hasPU70=True)
0462 plotResol(filespu, "ttbar_phase1_vs_pu", None, hasPU70=True)
0463 plotVertex(filespu, "ttbar_phase1_vs_pu", None, hasPU70=True)
0464
0465 plotEffAndFake(filescapu, "ttbar_phase1_ca_vs_pu", None, hasPU70=True, hasCA=True)
0466 plotResol(filescapu, "ttbar_phase1_ca_vs_pu", None, hasPU70=True)
0467 plotVertex(filescapu, "ttbar_phase1_ca_vs_pu", None, hasPU70=True)
0468
0469 plotTime([files0pu_time, filespu_time], "ttbar_phase0_phase1_vs_pu", [0, 35, 50, 70], ["2016", "2017"], [styleRun2, stylePhase1])
0470 plotTime([files0pu_time, filespu_time, filescapu_time], "ttbar_phase0_phase1ca_vs_pu", [0, 35, 50, 70], ["2016", "2017", "2017 (CA)"], [styleRun2, stylePhase1, stylePhase1CA])
0471
0472
0473 if False:
0474 peakrss = {
0475 "2016": {0: 1515.45,
0476 35: 1820.23,
0477 50: 2021.14,
0478 70: 2375.56},
0479 "2017": {0: 1696.24,
0480 35: 2110.91,
0481 50: 2190.12,
0482 70: 2674.59},
0483 "2017 (CA)": {0: 1697.5,
0484 35: 2213.77,
0485 50: 2413.3,
0486 70: 2795.5},
0487 }
0488
0489
0490 peakrss = {
0491 "2016": {0: 1278.68,
0492 35: 1664.89,
0493 50: 1888.64,
0494 70: 2314.17},
0495 "2017": {0: 1435.69,
0496 35: 2143.47,
0497 50: 2525.84,
0498 70: 2915.48},
0499 "2017 (CA)": {0: 1452.07,
0500 35: 2266.03,
0501 50: 2502.52,
0502 70: 3051.34},
0503 }
0504
0505 peakrss_v2 = {
0506 "2016": {0: 1267.67,
0507 35: 1674.13,
0508 50: 1853.39,
0509 70: 2192.17},
0510 "2017": {0: 1434.75,
0511 35: 2123.64,
0512 50: 2335.03,
0513 70: 2667.48},
0514 "2017 (CA)": {0: 1441.02,
0515 35: 2191.23,
0516 50: 2445.68,
0517 70: 2729.58},
0518 }
0519
0520 peakrss_trajectory = {
0521 "2017 90X IB": {0: 1445.08,
0522 35: 2112.86,
0523 50: 2320.14,
0524 60: 2578.23},
0525 "2017 90X IB+#17098": {0: 1422.88,
0526 35: 1974.98,
0527 50: 2128.61,
0528 60: 2300.59},
0529 }
0530
0531 plotMemory("ttbar_phase0_phase1_vs_pu", peakrss, ["2016", "2017"], [styleRun2, stylePhase1])
0532 plotMemory("ttbar_phase0_phase1ca_vs_pu", peakrss, ["2016", "2017", "2017 (CA)"], [styleRun2, stylePhase1, stylePhase1CA])
0533
0534 plotMemory("90x_ttbar_phase1_vs_pu", peakrss_trajectory, ["2017 90X IB", "2017 90X IB+#17098"], [stylePhase1, stylePhase1CA])
0535
0536 printEffFake(files1, pileup)
0537 print("With CA")
0538 printEffFake(files1ca, pileup)
0539
0540
0541
0542
0543
0544
0545 def plotDebug(files, prefix):
0546 folder_dqm = "Tracking/Run summary/TrackParameters/"
0547
0548 _common = {
0549
0550 "ymax": 5e-1,
0551 "legendDx": -0.27, "legendDy": -0.0,
0552 "ylog": True
0553 }
0554
0555 plot = Plot(files.getHistos(folder_dqm+"generalTracks/GeneralProperties/TrackPErrOverP_ImpactPoint_GenTk"), files.getLegends(), files.getStyles())
0556 for h in plot._histos:
0557 h.Scale(1.0/h.Integral())
0558 drawPlot(prefix+"_dqm_perroverp", plot, ymin=1e-4, **_common)
0559
0560 plot = Plot(files.getHistos(folder_dqm+"generalTracks/GeneralProperties/TrackPtErrOverPt_ImpactPoint_GenTk"), files.getLegends(), files.getStyles())
0561 for h in plot._histos:
0562 h.Scale(1.0/h.Integral())
0563 drawPlot(prefix+"_dqm_pterroverpt", plot, ymin=1e-5, **_common)
0564
0565 plot = Plot(files.getHistos(folder_dqm+"generalTracks/GeneralProperties/TrackEtaErr_ImpactPoint_GenTk"), files.getLegends(), files.getStyles())
0566 for h in plot._histos:
0567 h.Scale(1.0/h.Integral())
0568 drawPlot(prefix+"_dqm_etaerr", plot, ymin=1e-8, **_common)
0569
0570
0571
0572
0573 def plotEffAndFake(files, prefix, pileup, hasPU70=False, hasCA=False):
0574 folder_eff = "Tracking/Run summary/Track/cutsRecoHp_trackingParticleRecoAsssociation/"
0575 folder_fake = "Tracking/Run summary/Track/cutsRecoPt09Hp_trackingParticleRecoAsssociation/"
0576
0577 isrun2 = ("run2" in prefix)
0578 isrun2real = isrun2 and (len(files.getFiles()) == 3)
0579
0580 xmin = 0.33
0581 xmax = 0.87
0582 legendDw = -0.1
0583 if isrun2:
0584 legendDw = 0
0585
0586 if isrun2real:
0587 legendDw = 0.25
0588
0589 putext = ""
0590 if pileup is not None:
0591 putext = " (%s)" % pileup
0592
0593 effbox = PlotTextBox(xmin, None, xmax, 0.31, transparent=False)
0594 effbox.addText("t#bar{t} event tracks%s"%putext)
0595 effbox.addText("p_{T} > 0.9 GeV, |#eta| < 2.5, ^{}d_{0} < 3.5 cm")
0596
0597 fakebox = PlotTextBox(xmin, None, xmax-0.04, 0.85, transparent=False)
0598 fakebox.addText("t#bar{t} event tracks%s"%putext)
0599 fakebox.addText("p_{T} > 0.9 GeV")
0600
0601
0602
0603 effbox_eta = effbox.clone()
0604 effbox_eta.replaceText(1, "p_{T} > 0.9 GeV, ^{}d_{0} < 3.5 cm")
0605 plot = Plot(files.getHistos(folder_eff+"effic"), files.getLegends(), files.getStyles())
0606 _common = {
0607 "xtitle": "Simulated track #eta",
0608 "xmin": -3, "xmax": 3, "ymin": 0, "ymax": 1,
0609 "legendDx": -0.27, "legendDy": -0.4, "legendDw": legendDw,
0610 "customise": lambda: effbox_eta.Draw()
0611 }
0612 if isrun2real:
0613 _common["legendTextSize"] = 0.035
0614 _common["legendDx"] -= 0.05
0615
0616 drawPlot(prefix+"_efficiency_eta", plot, ytitle="Tracking efficiency", **_common)
0617
0618 _common["xtitle"] = "Track #eta"
0619 _common["ymin"] = 0
0620 _common["ymax"] = 0.2
0621 _common["legendDy"] = -0.2
0622 _common["customise"] = lambda: fakebox.Draw()
0623
0624 plot = Plot(files.getHistos(folder_fake+"fakerate"),
0625 files.getLegends(), files.getStyles())
0626 drawPlot(prefix+"_fakerate_eta", plot, ytitle="Tracking fake rate", **_common)
0627
0628 _common["ymax"] = 0.1
0629 plot = Plot(files.getHistos(folder_fake+"duplicatesRate"),
0630 files.getLegends(), files.getStyles())
0631 drawPlot(prefix+"_duprate_eta", plot, ytitle="Tracking duplicate rate", **_common)
0632
0633
0634 effbox_pt = effbox.clone()
0635 effbox_pt.replaceText(1, "|#eta| < 2.5, ^{}d_{0} < 3.5 cm")
0636 effbox_pt.move(dx=0.05)
0637 fakebox_pt = fakebox.clone()
0638 fakebox_pt.removeText(1)
0639 plot = Plot(files.getHistos(folder_eff+"efficPt"), files.getLegends(), files.getStyles())
0640 _common = {
0641 "xtitle": "Simulated track p_{T} (GeV)",
0642 "xmin": 1e-1, "xmax": 2e2, "ymin": 0, "ymax": 1,
0643 "xlog": True,
0644 "legendDx": -0.22, "legendDy": -0.4, "legendDw": legendDw,
0645 "customise": lambda: effbox_pt.Draw()
0646 }
0647 if isrun2real:
0648 _common["legendTextSize"] = 0.035
0649 _common["legendDx"] -= 0.05
0650 drawPlot(prefix+"_efficiency_pt", plot, ytitle="Tracking efficiency", **_common)
0651
0652 _common["xtitle"] = "Track p_{T} (GeV)"
0653 _common["ymin"] = 0
0654 _common["ymax"] = 0.6
0655 _common["legendDy"] = -0.2
0656 _common["customise"] = lambda: fakebox_pt.Draw()
0657 if isrun2real:
0658 _common["legendDx"] -= 0.05
0659 _common["legendDy"] += 0.06
0660
0661 folder_fake_pt = folder_fake.replace("Pt09", "")
0662 plot = Plot(files.getHistos(folder_fake_pt+"fakeratePt"),
0663 files.getLegends(), files.getStyles())
0664 drawPlot(prefix+"_fakerate_pt", plot, ytitle="Tracking fake rate", **_common)
0665
0666 _common["ymax"] = 0.1
0667 plot = Plot(files.getHistos(folder_fake_pt+"duplicatesRate_Pt"),
0668 files.getLegends(), files.getStyles())
0669
0670
0671
0672 effbox_r = effbox.clone()
0673 effbox_r.move(dy=0.6)
0674 effbox_r.replaceText(1, "p_{T} > 0.9 GeV, |#eta| < 2.5")
0675 fakebox_r = fakebox.clone()
0676 fakebox_r.move(dy=-0.55, dx=0.1)
0677 plot = Plot(files.getHistos(folder_eff+"effic_vs_vertpos"), files.getLegends(), files.getStyles())
0678 _common = {
0679 "xtitle": "Sim. track prod. vertex radius (cm)",
0680 "xmin": 0, "xmax": 60, "ymin": 0, "ymax": 1,
0681 "legendDx": 0.1, "legendDy": -0.12, "legendDw": legendDw,
0682 "customise": lambda: effbox_r.Draw()
0683 }
0684 if isrun2:
0685 _common["legendDx"] = -0.35
0686 _common["legendDy"] = -0.55
0687 if isrun2real:
0688 _common["legendTextSize"] = 0.035
0689 _common["legendDx"] -= 0.05
0690 _common["legendDy"] -= 0.02
0691 if hasPU70 and hasCA:
0692 _common["legendDx"] -= 0.1
0693
0694 drawPlot(prefix+"_efficiency_r", plot, ytitle="Tracking efficiency", **_common)
0695
0696 _common["xtitle"] = "Track PCA radius (cm)"
0697 _common["ymin"] = 0
0698
0699 _common["ymax"] = 1
0700 _common["legendDy"] = -0.35
0701 _common["customise"] = lambda: fakebox_r.Draw()
0702 if isrun2:
0703 _common["legendDx"] = 0
0704 if isrun2real:
0705 _common["legendDx"] -= 0.25
0706 _common["legendDy"] -= 0.2
0707 fakebox_r.move(dy=0.2, dx=0.02)
0708 if hasPU70:
0709 _common["ymax"] = 1
0710 _common["legendDx"] -= 0.05
0711 fakebox_r.move(dy=0.0, dx=0.2, dw=-0.2)
0712 if hasCA:
0713 _common["legendDx"] += 0.07
0714 _common["legendDw"] += 0.1
0715 _common["legendDy"] -= 0.2
0716 fakebox_r.move(dy=0.2)
0717
0718
0719 plot = Plot(files.getHistos(folder_fake+"fakerate_vs_vertpos"),
0720 files.getLegends(), files.getStyles())
0721 drawPlot(prefix+"_fakerate_r", plot, ytitle="Tracking fake rate", **_common)
0722
0723 _common["ymax"] = 0.1
0724 fakebox_r.move(dx=-0.2, dy=0.4)
0725 if hasPU70:
0726 fakebox_r.move(dx=0.1)
0727 plot = Plot(files.getHistos(folder_fake+"duplicatesRate_vertpos"),
0728 files.getLegends(), files.getStyles())
0729
0730
0731
0732
0733
0734
0735 def plotColoredEff(phase1file, prefix, pileup):
0736
0737
0738 folder_track = "DQMData/Run 1/Tracking/Run summary/Track/cutsReco%sByOriginalAlgoHp_trackingParticleRecoAsssociation/"
0739 iterations = [
0740 "InitialStep",
0741 "HighPtTripletStep",
0742 "LowPtQuadStep",
0743 "LowPtTripletStep",
0744 "DetachedQuadStep",
0745 "DetachedTripletStep",
0746 "MixedTripletStep",
0747 "PixelPairStep",
0748 "PixelLessStep",
0749 "TobTecStep",
0750 "JetCoreRegionalStep",
0751 "MuonSeededStepInOut",
0752 "MuonSeededStepOutIn",
0753 ]
0754 legendLabels = [x.replace("Step", "").replace("Regional", "").replace("SeededInOut", " inside-out").replace("SeededOutIn", " outside-in") for x in iterations]
0755 legendLabels[1:] = ["+"+x for x in legendLabels[1:]]
0756
0757 putext = ""
0758 if pileup is not None:
0759 putext = " (%s)" % pileup
0760
0761 xmin = 0.33
0762 xmax = 0.87
0763 legendDw = 0
0764 effbox = PlotTextBox(xmin, None, xmax, 0.31, transparent=True)
0765 effbox.addText("t#bar{t} event tracks%s"%putext)
0766 effbox.addText("p_{T} > 0.9 GeV, |#eta| < 2.5, ^{}d_{0} < 3.5 cm")
0767
0768
0769 effbox_pt = effbox.clone()
0770 effbox_pt.replaceText(1, "|#eta| < 2.5, ^{}d_{0} < 3.5 cm")
0771 effbox_pt.move(dx=0.06, dy=-0.02)
0772
0773 plot = PlotStack()
0774 for it, leg in zip(iterations, legendLabels):
0775 hname = folder_track%it + "efficPt"
0776 h = phase1file.Get(hname)
0777 if not h:
0778 raise Exception("Did not find %s from %s" % (hname, phase1file.GetName()))
0779 h.SetFillColor(iter_colors[it])
0780 h.SetLineColor(ROOT.kBlack)
0781 plot.add(h, leg)
0782 _common = {
0783 "xtitle": "Simulated track p_{T} (GeV)",
0784 "xmin": 1e-1, "xmax": 2e2, "ymin": 0, "ymax": 1,
0785 "xlog": True,
0786 "legendDx": -0.13, "legendDy": -0.24, "legendDw": legendDw, "legendDh": 0.23,
0787 "legendTransparent": True,
0788 "customise": lambda: effbox_pt.Draw(),
0789 "drawOpt": "HIST",
0790 }
0791 drawPlot(prefix+"_efficiency_pt_cum", plot, ytitle="Tracking efficiency", **_common)
0792
0793
0794
0795 effbox_eta = effbox.clone()
0796 effbox_eta.replaceText(1, "p_{T} > 0.9 GeV, ^{}d_{0} < 3.5 cm")
0797 effbox_eta.move(dx=0.06, dy=-0.02)
0798
0799 plot = PlotStack()
0800 for it, leg in zip(iterations, legendLabels):
0801 hname = folder_track%it + "effic"
0802 h = phase1file.Get(hname)
0803 if not h:
0804 raise Exception("Did not find %s from %s" % (hname, phase1file.GetName()))
0805 h.SetFillColor(iter_colors[it])
0806 h.SetLineColor(ROOT.kBlack)
0807 plot.add(h, leg)
0808 _common = {
0809 "xtitle": "Simulated track #eta",
0810 "xmin": -3, "xmax": 3, "ymin": 0, "ymax": 1,
0811 "legendDx": -0.15, "legendDy": -0.24, "legendDw": legendDw, "legendDh": 0.23,
0812 "legendTransparent": True,
0813 "customise": lambda: effbox_eta.Draw(),
0814 "drawOpt": "HIST",
0815 }
0816 drawPlot(prefix+"_efficiency_eta_cum", plot, ytitle="Tracking efficiency", **_common)
0817
0818
0819 effbox_r = effbox.clone()
0820
0821 effbox_r.removeText(1)
0822 effbox_r.addText("p_{T} > 0.9 GeV,", yspace=0.01)
0823 effbox_r.addText("|#eta| < 2.5", yspace=0.01)
0824 effbox_r.transparent = False
0825 effbox_r.move(dx=-0.1, dy=0.6)
0826 _common = {
0827 "xtitle": "Sim. track prod. vertex radius (cm)",
0828 "xmin": 0, "xmax": 60, "ymin": 0, "ymax": 1.2,
0829 "legendDx": 0.02, "legendDy": -0.07, "legendDw": legendDw, "legendDh": 0.23,
0830
0831
0832
0833 "customiseBeforeLegend": lambda: effbox_r.Draw(),
0834 "drawOpt": "HIST",
0835 }
0836 plot = PlotStack()
0837 for it, leg in zip(iterations, legendLabels):
0838
0839
0840
0841
0842 num_name = folder_track%it + "num_assoc(simToReco)_vertpos"
0843 denom_name = folder_track%it + "num_simul_vertpos"
0844 eff = calculateEfficiency(phase1file, num_name, denom_name, rebin=2)
0845 eff.SetFillColor(iter_colors[it])
0846 eff.SetLineColor(ROOT.kBlack)
0847 plot.add(eff, leg)
0848
0849 drawPlot(prefix+"_efficiency_r_cum", plot, ytitle="Tracking efficiency", **_common)
0850
0851
0852
0853
0854 def plotFake(files, prefix, pileup):
0855 folder_track = "Tracking/Run summary/Track/"
0856 folder_vertex = "Vertexing/Run summary/PrimaryVertexV/"
0857
0858 iterations = [
0859 "InitialStep",
0860 "LowPtQuadStep",
0861 "HighPtTripletStep",
0862 "LowPtTripletStep",
0863 "DetachedQuadStep",
0864 "DetachedTripletStep",
0865 "MixedTripletStep",
0866 "PixelLessStep",
0867 "TobTecStep",
0868 "JetCoreRegionalStep",
0869 "MuonSeededStepInOut",
0870 "MuonSeededStepOutIn",
0871 ]
0872 binLabels = ["All tracks (p_{T} > 0.9 GeV)"] + [x.replace("Step", "").replace("Regional", "").replace("SeededInOut", " inside-out").replace("SeededOutIn", " outside-in") for x in iterations]
0873 colls = ["cutsRecoTracksPt09Hp"] + ["cutsRecoTracks%sPt09Hp" % x for x in iterations]
0874
0875 plot = Plot(files.getHistos(folder_track+"num_reco_coll"), files.getLegends(), files.getStyles())
0876 plot_assoc = Plot(files.getHistos(folder_track+"num_assoc(recoToSim)_coll"), files.getLegends(), files.getStyles())
0877 plot_norm = Plot(files.getHistos(folder_vertex+"offlinePrimaryVertices/TruePVLocationIndexCumulative"), files.getLegends(), files.getStyles())
0878 newhistos = []
0879 for (h, hassoc, hnorm) in zip(plot._histos, plot_assoc._histos, plot_norm._histos):
0880 d = plotting._th1ToOrderedDict(h)
0881 dassoc = plotting._th1ToOrderedDict(hassoc)
0882 norm = hnorm.GetEntries()
0883 hnew = ROOT.TH1F(h.GetName()+"_new", "", len(colls), 0, len(colls))
0884 for i, coll in enumerate(colls):
0885 if coll in d:
0886 vreco = d[coll]
0887 vassoc = dassoc[coll]
0888 vfake = vreco[0]-vassoc[0]
0889 print(vfake, norm)
0890 hnew.SetBinContent(i+1, vfake)
0891 hnew.SetBinError(i+1, math.sqrt(vfake))
0892 newhistos.append(hnew)
0893 plot._histos = newhistos
0894
0895 _common = {
0896 "xtitle": "",
0897
0898 "legendDx": 0.02, "legendDy": -0.07,
0899
0900
0901
0902
0903
0904 "xbinlabels": binLabels,
0905 "xbinlabelsize": 0.03,
0906 "xbinlabeloption": "d",
0907 }
0908 drawPlot(prefix+"_fakes_vs_coll", plot, ytitle="Number of fake tracks / event", **_common)
0909
0910
0911
0912
0913
0914 def plotResol(files, prefix, pileup, hasPU70=False):
0915 folder_track = "Tracking/Run summary/Track/cutsRecoHp_trackingParticleRecoAsssociation/"
0916
0917 folder_vertex = "Vertexing/Run summary/PrimaryVertexV/selectedOfflinePrimaryVertices/"
0918
0919 isrun2 = ("run2" in prefix)
0920 isrun2real = isrun2 and (len(files.getFiles()) == 3)
0921
0922 xmin = 0.33
0923 xmax = 0.87
0924 legendDw = -0.1
0925 if isrun2:
0926 legendDw = 0
0927 if isrun2real:
0928 legendDw = 0.25
0929 hasNoPU = ("no PU" in files.getLegends()[0])
0930
0931 putext = ""
0932 if pileup is not None:
0933 putext = " (%s)" % pileup
0934
0935 effbox = PlotTextBox(xmin, None, xmax, 0.85, transparent=False)
0936 effbox.addText("t#bar{t} event tracks%s"%putext)
0937
0938
0939 vertbox = PlotTextBox(xmin, None, xmax-0.15, 0.85, transparent=False)
0940 vertbox.addText("t#bar{t} events%s"%putext)
0941
0942
0943 plot = Plot(files.getHistos(folder_track+"dxyres_vs_pt_Sigma"), files.getLegends(), files.getStyles())
0944 _common = {
0945 "xtitle": "Simulated track p_{T} (GeV)",
0946 "xmin": 1e-1,
0947
0948 "xmax": 1e2,
0949 "ymin": 0, "ymax": 0.05,
0950 "xlog": True,
0951 "legendDx": -0.1, "legendDy": -0.15, "legendDw": legendDw,
0952 "customise": lambda: effbox.Draw(),
0953
0954 }
0955 if isrun2real:
0956 _common["legendTextSize"] = 0.035
0957 _common["legendDx"] -= 0.17
0958 _common["legendDy"] += 0.15
0959 effbox.move(dy=-0.15, dx=0.05)
0960
0961 _common_ip = copy.copy(_common)
0962 _common_ip["ymax"] = _common_ip["ymax"]*10000
0963
0964 plot.scale(10000)
0965 drawPlot(prefix+"_resolution_dxy_pt", plot, ytitle="d_{0} resolution (#mum)", **_common_ip)
0966
0967
0968 plot = Plot(files.getHistos(folder_track+"dzres_vs_pt_Sigma"), files.getLegends(), files.getStyles())
0969 plot.scale(10000)
0970 drawPlot(prefix+"_resolution_dz_pt", plot, ytitle="d_{z} resolution (#mum)", **_common_ip)
0971
0972
0973 plot = Plot(files.getHistos(folder_track+"ptres_vs_pt_Sigma"), files.getLegends(), files.getStyles())
0974 drawPlot(prefix+"_resolution_pt_pt", plot, ytitle="p_{T} resolution / p_{T}", **_common)
0975
0976
0977 plot = Plot(files.getHistos(folder_track+"ptres_vs_pt_Sigma"), files.getLegends(), files.getStyles())
0978 new = []
0979 for h in plot.histos():
0980 x = []
0981 y = []
0982 axis = h.GetXaxis()
0983 for i in range(1, h.GetNbinsX()+1):
0984 x.append(axis.GetBinCenter(i)**2)
0985 y.append(h.GetBinContent(i))
0986
0987 gr = ROOT.TGraph(len(x), array.array("d", x), array.array("d", y))
0988 new.append(gr)
0989 plot.setHistos(new)
0990 _common_pt2 = copy.copy(_common)
0991 _common_pt2["xtitle"] = "Simulated track p_{T}^{2} (GeV^{2})"
0992 _common_pt2["xmin"] = 1e-2
0993 _common_pt2["xmax"] = 1e4
0994
0995
0996
0997 _common["xtitle"] = "Simulated track #eta"
0998 _common["xmin"] = -3
0999 _common["xmax"] = 3
1000 _common["xlog"] = False
1001 _common_ip = copy.copy(_common)
1002 _common_ip["ymax"] = 0.1*10000
1003 plot = Plot(files.getHistos(folder_track+"dxyres_vs_eta_Sigma"), files.getLegends(), files.getStyles())
1004 plot.scale(10000)
1005 drawPlot(prefix+"_resolution_dxy_eta", plot, ytitle="d_{0} resolution (#mum)", **_common_ip)
1006
1007 plot = Plot(files.getHistos(folder_track+"dzres_vs_eta_Sigma"), files.getLegends(), files.getStyles())
1008 plot.scale(10000)
1009 drawPlot(prefix+"_resolution_dz_eta", plot, ytitle="d_{z} resolution (#mum)", **_common_ip)
1010
1011 plot = Plot(files.getHistos(folder_track+"ptres_vs_eta_Sigma"), files.getLegends(), files.getStyles())
1012 drawPlot(prefix+"_resolution_pt_eta", plot, ytitle="p_{T} resolution / p_{T}", **_common)
1013
1014
1015 _common["xtitle"] = "Simulated track #phi"
1016 _common["xmin"] = -3.15
1017 _common["xmax"] = 3.15
1018 _common["xlog"] = False
1019 _common_ip = copy.copy(_common)
1020 _common_ip["ymax"] = 0.1*10000
1021 plot = Plot(files.getHistos(folder_track+"dxyres_vs_phi_Sigma"), files.getLegends(), files.getStyles())
1022 plot.scale(10000)
1023 drawPlot(prefix+"_resolution_dxy_phi", plot, ytitle="d_{0} resolution (#mum)", **_common_ip)
1024
1025 plot = Plot(files.getHistos(folder_track+"dzres_vs_phi_Sigma"), files.getLegends(), files.getStyles())
1026 plot.scale(10000)
1027 drawPlot(prefix+"_resolution_dz_phi", plot, ytitle="d_{z} resolution (#mum)", **_common_ip)
1028
1029 plot = Plot(files.getHistos(folder_track+"ptres_vs_phi_Sigma"), files.getLegends(), files.getStyles())
1030 drawPlot(prefix+"_resolution_pt_phi", plot, ytitle="p_{T} resolution / p_{T}", **_common)
1031
1032
1033 vertbox.move(dx=0.15,dy=0.05)
1034 plot = Plot(files.getHistos(folder_vertex+"RecoAllAssoc2GenMatched_ResolX_vs_NumTracks_Sigma"), files.getLegends(), files.getStyles())
1035 if hasNoPU:
1036 plot.remove(0)
1037 plot.scale(1e4)
1038 _common = {
1039 "xtitle": "Number of tracks",
1040 "xmin": 0, "xmax": 100, "ymin": 0, "ymax": 100,
1041 "legendDx": 0.03, "legendDy": -0.12, "legendDw": legendDw,
1042 "customise": lambda: vertbox.Draw(),
1043
1044 }
1045 if isrun2real:
1046 _common["legendTextSize"] = 0.035
1047 _common["legendDx"] -= 0.3
1048 _common["legendDy"] += 0.13
1049 vertbox.move(dy=-0.15, dx=0.05)
1050 drawPlot(prefix+"_vertex_resolution_x_ntrk", plot, ytitle="Vertex x resolution (#mum)", **_common)
1051
1052 plot = Plot(files.getHistos(folder_vertex+"RecoAllAssoc2GenMatched_ResolX_vs_NumTracks_Sigma"), files.getLegends(), files.getStyles())
1053 if hasNoPU:
1054 plot.remove(0)
1055 plot.scale(1e4)
1056 drawPlot(prefix+"_vertex_resolution_xy_ntrk", plot, ytitle="Vertex x/y resolution (#mum)", **_common)
1057
1058
1059 plot = Plot(files.getHistos(folder_vertex+"RecoAllAssoc2GenMatched_ResolY_vs_NumTracks_Sigma"), files.getLegends(), files.getStyles())
1060 if hasNoPU:
1061 plot.remove(0)
1062 plot.scale(1e4)
1063 drawPlot(prefix+"_vertex_resolution_y_ntrk", plot, ytitle="Vertex y resolution (#mum)", **_common)
1064
1065
1066 plot = Plot(files.getHistos(folder_vertex+"RecoAllAssoc2GenMatched_ResolZ_vs_NumTracks_Sigma"), files.getLegends(), files.getStyles())
1067 if hasNoPU:
1068 plot.remove(0)
1069 plot.scale(1e4)
1070 drawPlot(prefix+"_vertex_resolution_z_ntrk", plot, ytitle="Vertex z resolution (#mum)", **_common)
1071
1072
1073
1074
1075
1076 def plotVertex(files, prefix, pileup, hasPU70=False):
1077
1078 folder_vertex = "Vertexing/Run summary/PrimaryVertexV/selectedOfflinePrimaryVertices/"
1079
1080 xmin = 0.33
1081 xmax = 0.87
1082 legendDw = -0.1
1083
1084 hasNoPU = ("no PU" in files.getLegends()[0])
1085
1086 putext = ""
1087 if pileup is not None:
1088 putext = "(%s)" % pileup
1089
1090 vertbox = PlotTextBox(xmin, None, xmax-0.15, 0.35, transparent=False)
1091 vertbox.addText("t#bar{t} events%s"%putext)
1092
1093
1094 plot = Plot(files.getHistos(folder_vertex+"effic_vs_NumVertices"), files.getLegends(), files.getStyles())
1095 _common = dict(
1096 xtitle="Simulated interactions",
1097 xmin=10, xmax=70, ymin=0, ymax=1,
1098 legendDx=-0.2, legendDy=-0.3, legendDw=legendDw,
1099 customise=lambda: vertbox.Draw()
1100 )
1101 if hasPU70:
1102 _common["xmax"] = 100
1103 if hasNoPU:
1104 plot.remove(0)
1105 drawPlot(prefix+"_vertex_efficiency_pu", plot, ytitle="Vertex efficiency", **_common)
1106
1107
1108 _common["ymax"] = 0.2
1109 _common["legendDy"] += 0.15
1110 vertbox.move(dy=0.55)
1111 plot = Plot(files.getHistos(folder_vertex+"fakerate_vs_PU"), files.getLegends(), files.getStyles())
1112 if hasNoPU:
1113 plot.remove(0)
1114 drawPlot(prefix+"_vertex_fakerate_pu", plot, ytitle="Vertex fake rate", **_common)
1115
1116
1117 _common_nvtx = copy.copy(_common)
1118 _common_nvtx["ymin"] = _common_nvtx["ymax"]
1119 _common_nvtx["ymax"] = _common_nvtx["xmax"]
1120 _common_nvtx["legendDy"] += 0.05
1121 plot = Plot(files.getHistos(folder_vertex+"RecoVtx_vs_GenVtx"), files.getLegends(), files.getStyles())
1122 if hasNoPU:
1123 plot.remove(0)
1124 drawPlot(prefix+"_vertex_nvtx_vs_pu", plot, ytitle="Vertices", **_common_nvtx)
1125
1126
1127 plot = Plot(files.getHistos(folder_vertex+"merged_vs_PU"), files.getLegends(), files.getStyles())
1128 if hasNoPU:
1129 plot.remove(0)
1130 drawPlot(prefix+"_vertex_mergerate_pu", plot, ytitle="Vertex merge rate", **_common)
1131
1132 vertbox.move(dx=0.1)
1133 del _common["xtitle"]
1134 del _common["xmin"]
1135 del _common["xmax"]
1136 _common["ymax"] = 1
1137 _common["legendDx"] += 0.3
1138 plot = Plot(files.getHistos(folder_vertex+"merged_vs_ClosestVertexInZ"), files.getLegends(), files.getStyles())
1139 drawPlot(prefix+"_vertex_mergerate_closestz", plot, xtitle="Distance to closest vertex in z (cm)", ytitle="Vertex merge rate", xlog=True, **_common)
1140
1141
1142 vertbox.move(dx=-0.2)
1143 _common["ymin"] = 5e-4
1144 _common["ymax"] = 1
1145 _common["legendDx"] -= 0.3
1146 plot = Plot(files.getHistos(folder_vertex+"RecoPVAssoc2GenPVMatched_Purity"), files.getLegends(), files.getStyles())
1147 if hasNoPU:
1148 plot.remove(0)
1149 plot.normalizeToUnitArea()
1150
1151
1152
1153
1154
1155 def plotTime(fileCollections, prefix, pileups, legends, styles):
1156 folderTime = "DQMData/Run 1/DQM/Run summary/TimerService/process RECO/Paths"
1157
1158 xmin = 0.33-0.07
1159 xmax = 0.87
1160 legendDw = -0.1
1161 vertbox = PlotTextBox(xmin, None, xmax-0.3, 0.7, transparent=False)
1162 vertbox.addText("t#bar{t} events")
1163
1164 relbox = vertbox.clone()
1165
1166 relbox.addText("tracking time of", yspace=0.01)
1167 relbox.addText("2016 no PU = 1")
1168
1169 creator = plotting.AggregateBins("iteration", "reconstruction_step_module_average", trackingPlots._iterModuleMap(includeConvStep=False), ignoreMissingBins=True)
1170
1171 normfactor = None
1172
1173 maxAbs = 20
1174 maxRel = 80
1175
1176 graphs = []
1177 graphs_abs = []
1178 for files in fileCollections:
1179 times = []
1180 for f in files.getFiles():
1181 tdir = f.Get(folderTime)
1182 h = creator.create(tdir)
1183 if not h:
1184 raise Exception("Did not find time from file %s" % f.GetPath())
1185 times.append(h.Integral()/1000.)
1186
1187
1188 if normfactor is None:
1189 normfactor = 1/times[0]
1190
1191 gr = ROOT.TGraph(len(pileups), array.array("d", pileups), array.array("d", times))
1192 graphs_abs.append(gr)
1193 gr = ROOT.TGraph(len(pileups), array.array("d", pileups), array.array("d", [t*normfactor for t in times]))
1194 graphs.append(gr)
1195
1196 print("Time normalization factor", normfactor)
1197
1198
1199 plot = Plot(graphs, legends, styles)
1200 drawPlot(prefix+"_time_vs_pu", plot, xtitle="Average pileup", ytitle="Tracking time (a.u.)",
1201 drawOpt="PL", ymax=maxRel,
1202 legendDx=-0.2, legendDw=legendDw,
1203 customise=lambda: relbox.Draw()
1204 )
1205 plot = Plot(graphs_abs, legends, styles)
1206 drawPlot(prefix+"_time_vs_pu_abs", plot, xtitle="Average pileup", ytitle="Tracking time (s)",
1207 drawOpt="PL", ymax=maxAbs,
1208 legendDx=-0.2, legendDw=legendDw,
1209 customise=lambda: vertbox.Draw()
1210 )
1211
1212
1213
1214 creator = plotting.AggregateBins("iteration", "reconstruction_step_module_average", trackingPlots._stepModuleMap(), ignoreMissingBins=True)
1215
1216 graphs_seed = []
1217 graphs_seed_abs = []
1218 graphs_build = []
1219 graphs_build_abs = []
1220 for files in fileCollections:
1221 times_seed = []
1222 times_build = []
1223 for f in files.getFiles():
1224 tdir = f.Get(folderTime)
1225 h = creator.create(tdir)
1226 if not h:
1227 raise Exception("Did not find time from file %s" % f.GetPath())
1228
1229 d = plotting._th1ToOrderedDict(h)
1230
1231 times_seed.append(d["Seeding"][0]/1000.)
1232 times_build.append(d["Building"][0]/1000.)
1233
1234 gr = ROOT.TGraph(len(pileups), array.array("d", pileups), array.array("d", times_seed))
1235 graphs_seed_abs.append(gr)
1236 gr = ROOT.TGraph(len(pileups), array.array("d", pileups), array.array("d", [t*normfactor for t in times_seed]))
1237 graphs_seed.append(gr)
1238
1239 gr = ROOT.TGraph(len(pileups), array.array("d", pileups), array.array("d", times_build))
1240 graphs_build_abs.append(gr)
1241 gr = ROOT.TGraph(len(pileups), array.array("d", pileups), array.array("d", [t*normfactor for t in times_build]))
1242 graphs_build.append(gr)
1243
1244 plot = Plot(graphs_seed, legends, styles)
1245 drawPlot(prefix+"_seedtime_vs_pu", plot, xtitle="Average pileup", ytitle="Seeding time (a.u.)",
1246 drawOpt="PL", ymax=maxRel,
1247 legendDx=-0.2, legendDw=legendDw,
1248 customise=lambda: relbox.Draw()
1249 )
1250 plot = Plot(graphs_seed_abs, legends, styles)
1251 drawPlot(prefix+"_seedtime_vs_pu_abs", plot, xtitle="Average pileup", ytitle="Seeding time (s)",
1252 drawOpt="PL", ymax=maxAbs,
1253 legendDx=-0.2, legendDw=legendDw,
1254 customise=lambda: vertbox.Draw()
1255 )
1256
1257 plot = Plot(graphs_build, legends, styles)
1258 drawPlot(prefix+"_buildtime_vs_pu", plot, xtitle="Average pileup", ytitle="Pattern recognition time (a.u.)",
1259 drawOpt="PL", ymax=maxRel,
1260 legendDx=-0.2, legendDw=legendDw,
1261 customise=lambda: relbox.Draw()
1262 )
1263 plot = Plot(graphs_build_abs, legends, styles)
1264 drawPlot(prefix+"_buildtime_vs_pu_abs", plot, xtitle="Average pileup", ytitle="Pattern recognition time (s)",
1265 drawOpt="PL", ymax=maxAbs,
1266 legendDx=-0.2, legendDw=legendDw,
1267 customise=lambda: vertbox.Draw()
1268 )
1269
1270
1271
1272 creator = plotting.AggregateBins("initialStepPreSplitting", "reconstruction_step_module_average", collections.OrderedDict(trackingPlots._iterations[0].modules()), ignoreMissingBins=True)
1273
1274 graphs = []
1275 graphs_abs = []
1276 for files in fileCollections:
1277 times = []
1278 for f in files.getFiles():
1279 tdir = f.Get(folderTime)
1280 h = creator.create(tdir)
1281 if not h:
1282 raise Exception("Did not find time from file %s" % f.GetPath())
1283
1284 d = plotting._th1ToOrderedDict(h)
1285
1286 times.append(d["Seeding"][0]/1000.)
1287
1288 gr = ROOT.TGraph(len(pileups), array.array("d", pileups), array.array("d", times))
1289 graphs_abs.append(gr)
1290 gr = ROOT.TGraph(len(pileups), array.array("d", pileups), array.array("d", [t*normfactor for t in times]))
1291 graphs.append(gr)
1292
1293 ymaxfac = 0.025
1294
1295 plot = Plot(graphs, legends, styles)
1296 drawPlot(prefix+"_pixeltracks_vs_pu", plot, xtitle="Average pileup", ytitle="Pixel tracking time (a.u.)",
1297 drawOpt="PL", ymax=maxRel*ymaxfac,
1298 legendDx=-0.2, legendDw=legendDw,
1299 customise=lambda: relbox.Draw()
1300 )
1301 plot = Plot(graphs_abs, legends, styles)
1302 drawPlot(prefix+"_pixeltracks_vs_pu_abs", plot, xtitle="Average pileup", ytitle="Pixel tracking time (s)",
1303 drawOpt="PL", ymax=maxAbs*ymaxfac,
1304 legendDx=-0.2, legendDw=legendDw,
1305 customise=lambda: vertbox.Draw()
1306 )
1307
1308
1309
1310
1311 def plotMemory(prefix, data, legends, styles):
1312 xmin = 0.33
1313 xmax = 0.87
1314 legendDw = -0.1
1315 vertbox = PlotTextBox(xmin, None, xmax-0.3, 0.73, transparent=False)
1316 vertbox.addText("t#bar{t} events")
1317
1318 graphs = []
1319 for l in legends:
1320 d = data[l]
1321 x = d.keys()
1322 x.sort()
1323 y = [d[i]/1000. for i in x]
1324 gr = ROOT.TGraph(len(x), array.array("d", x), array.array("d", y))
1325 graphs.append(gr)
1326
1327 plot = Plot(graphs, legends, styles)
1328 drawPlot(prefix+"_trkonly_peakrss_vs_pu", plot, xtitle="Average pileup", ytitle="Peak memory (GB)",
1329 drawOpt="PL",
1330 ymin=1, ymax=3.2,
1331 legendDx=-0.2, legendDw=legendDw,
1332 customise=lambda: vertbox.Draw()
1333 )
1334
1335
1336
1337
1338
1339 def printEffFake(files, pileup):
1340 print("For pileup", pileup)
1341 for f, l in zip(files.getFiles(), files.getLegends()):
1342 eff_h = f.Get("DQMData/Run 1/Tracking/Run summary/Track/effic_vs_coll")
1343 fake_h = f.Get("DQMData/Run 1/Tracking/Run summary/Track/fakerate_vs_coll")
1344
1345 eff_d = plotting._th1ToOrderedDict(eff_h)
1346 fake_d = plotting._th1ToOrderedDict(fake_h)
1347
1348 print(l)
1349
1350
1351
1352 coll = "cutsRecoTracksHp"
1353 collPt = "cutsRecoTracksPt09Hp"
1354 print("Efficiency", eff_d[coll])
1355 print("Fake rate ", fake_d[coll])
1356 print("Efficiency (track pt>0.9)", eff_d[collPt])
1357 print("Fake rate (track pt>0.9)", fake_d[collPt])
1358
1359
1360
1361
1362 def drawPlot(name, plot, xmin=None, ymin=0, xmax=None, ymax=None, xlog=False, ylog=False,
1363 xtitle=None, ytitle=None,
1364 drawOpt="PE",
1365 addLegend=True, legendDx=0, legendDy=0, legendDw=0, legendDh=0, legendTransparent=False, legendColumns=1, legendTextSize=0.04,
1366 rebin=None,
1367 ratio=False, ratioYmin=0.5, ratioYmax=1,
1368 customiseBeforeLegend=None, customise=None,
1369 period=4,
1370
1371 pos=0,
1372 xbinlabels=None, xbinlabelsize=None, xbinlabeloption=None):
1373
1374
1375
1376
1377
1378 ratioFactor = 1.25
1379
1380 W = 600
1381 H = 600
1382 H_ref = 600
1383 W_ref = 600
1384
1385 T = 0.08*H_ref
1386 B = 0.16*H_ref
1387 L = 0.18*W_ref
1388 R = 0.04*W_ref
1389
1390 H_canv = H
1391 if ratio:
1392 H_canv = int(H*ratioFactor)
1393
1394 canv = ROOT.TCanvas(name,name,10,10,W,H_canv);
1395 canv.SetFillColor(0);
1396 canv.SetBorderMode(0);
1397 canv.SetFrameFillStyle(0);
1398 canv.SetFrameBorderMode(0);
1399 canv.SetLeftMargin( L/W );
1400 canv.SetRightMargin( R/W );
1401 canv.SetTopMargin( T/H );
1402 canv.SetBottomMargin( B/H );
1403 canv.SetTickx(0);
1404 canv.SetTicky(0);
1405
1406 if ratio:
1407 plotting._modifyPadForRatio(canv, ratioFactor)
1408
1409 if xmin is None:
1410 xmin = plot.getXmin()
1411 if xmax is None:
1412 xmax = plot.getXmax()
1413 if ymax is None:
1414 ymax = 1.1*plot.getYmax()
1415
1416 bounds = (xmin, ymin, xmax, ymax)
1417 args = {"nrows": 1,
1418 "zmax": None}
1419 if xbinlabels is not None:
1420 args["xbinlabels"] = xbinlabels
1421 args["xbinlabelsize"] = xbinlabelsize
1422 args["xbinlabeloption"] = xbinlabeloption
1423 if ratio:
1424 ratioBounds = (xmin, ratioYmin, xmax, ratioYmax)
1425 frame = plotting.FrameRatio(canv, bounds, ratioBounds, ratioFactor, **args)
1426 frame._frameRatio.GetYaxis().SetLabelSize(0.12)
1427 else:
1428 frame = plotting.Frame(canv, bounds, **args)
1429
1430 if xtitle is not None:
1431 frame.setXTitle(xtitle)
1432 if ytitle is not None:
1433 frame.setYTitle(ytitle)
1434
1435 frame.setXTitleOffset(1.15)
1436 frame.setYTitleOffset(1.55)
1437
1438 frame.setLogx(xlog)
1439 frame.setLogy(ylog)
1440
1441 if rebin is not None:
1442 plot.rebin(rebin)
1443
1444 if ratio:
1445 frame._pad.cd()
1446
1447 plot.draw(drawOpt)
1448
1449 ratios = None
1450 if ratio:
1451 frame._padRatio.cd()
1452 ratios = plotting._calculateRatios(plot._histos)
1453 for r in ratios[1:]:
1454 r.draw()
1455 frame._pad.cd()
1456
1457 if customiseBeforeLegend is not None:
1458 customiseBeforeLegend()
1459
1460 if addLegend:
1461 lx1 = 0.6
1462 lx2 = 0.95
1463
1464 ly1 = 0.75
1465 ly2 = 0.9
1466
1467
1468
1469
1470
1471 lx1 += legendDx
1472 lx2 += legendDx
1473 ly1 += legendDy
1474 ly2 += legendDy
1475
1476 lx2 += legendDw
1477 ly1 -= legendDh
1478
1479 legend = ROOT.TLegend(lx1, ly1, lx2, ly2)
1480 if legendColumns != 1:
1481 legend.SetNColumns(legendColumns)
1482 legend.SetTextSize(legendTextSize)
1483 legend.SetLineColor(1)
1484 legend.SetLineWidth(1)
1485 legend.SetLineStyle(1)
1486 legend.SetFillColor(0)
1487 legend.SetMargin(0.07)
1488 legend.SetBorderSize(0)
1489 if legendTransparent:
1490 legend.SetFillStyle(0)
1491 plot.addToLegend(legend, legendColumns)
1492 legend.Draw()
1493
1494 frame._pad.cd()
1495 ROOT.CMS_lumi_v2(frame._pad, period, pos)
1496
1497 canv.Update()
1498 canv.RedrawAxis();
1499 canv.GetFrame().Draw()
1500
1501 if customise is not None:
1502 customise()
1503
1504 canv.SaveAs(name+".png")
1505 canv.SaveAs(name+".pdf")
1506
1507 if __name__ == "__main__":
1508 main()