177 canv_heigh = sum(pad_heights)
178 pad_bottom = [(1-sum([pad_heights[j]
for j
in range(i+1)])/canv_heigh)
for i
in range(len(pad_heights))]
179 canv = ROOT.TCanvas(
"c",
"c",600,int(canv_heigh))
182 pad1 = ROOT.TPad(
"pad1",
"pad1",0,pad_bottom[0],1,1)
184 pad1.SetBottomMargin(0.05)
188 for r
in range(NRef):
189 ratio_pads.append(ROOT.TPad(f
"pad{r+2}",f
"pad{r+2}",0,pad_bottom[r+1],1,pad_bottom[r]))
190 ratio_pads[r].SetTopMargin(0.05)
191 ratio_pads[r].SetBottomMargin(0.05
if r!=(NRef-1)
else 1./3.)
192 ratio_pads[r].SetNumber(r+2)
194 if cfg[
'log'] ==
'x':
196 for r
in range(NRef): ratio_pads[r].SetLogx()
198 if cfg[
'log'] ==
'y':
201 if cfg[
'log'] ==
'xy':
204 for r
in range(NRef): ratio_pads[r].SetLogx()
208 for r
in range(NRef): ratio_pads[r].Draw()
214 scaleshift = canv.GetPad(1).GetHNDC()/canv.GetPad(2).GetHNDC()
216 level = 0.01
if 'rate' in type
else 2
217 xmin, xmax = h.GetXaxis().GetXmin(), h.GetXaxis().GetXmax()
218 ymax,ymin = h.GetMaximum(), h.GetMinimum()
220 requirement_line = (ROOT.TLine(xmin,level,xmax,level))
221 requirement_line.SetLineStyle(2)
222 requirement_line.SetLineColor(ROOT.kRed)
223 requirement_line.SetLineWidth(1)
225 shiftup = 0.01*scaleshift
if 'rate' not in type
else 0.01
226 shiftdn = 0.07*scaleshift
if 'rate' not in type
else 0.07
227 y = level + shiftup*(ymax-ymin)
if level < ymax
else ymax - shiftdn *(ymax-ymin)
228 x = (.63*(xmax-xmin)+xmin)
if not logx
else math.exp( math.log(xmin) + 0.63*(math.log(xmax) - math.log(xmin)) )
230 requirement_text = ROOT.TLatex(x,y, f
"#uparrow URD requirement = {level}" if level > ymax
else f
"URD requirement = {level}")
231 requirement_text.SetTextFont(42)
232 requirement_text.SetTextSize(0.04*scale
if 'rate' not in type
else 0.04)
233 requirement_text.SetTextColor(ROOT.kRed)
234 return requirement_line, requirement_text
238 h.SetLineColor(cfg[
'linecolor'])
239 h.SetLineStyle(cfg[
'linestyle'])
240 h.SetMarkerStyle(cfg[
'markstyle'])
241 h.SetMarkerColor(cfg[
'markcolor'])
249 if 'Efficiencies' in cfg[
'category']:
250 h.GetPaintedGraph().SetMaximum(1.2
if cfg[
'ymax']==0
else cfg[
'ymax'])
251 h.GetPaintedGraph().SetMinimum(0.7
if cfg[
'ymin']==0
else cfg[
'ymin'])
255 if 'y' in str(cfg[
'log']):
256 h.GetPaintedGraph().SetMaximum(10*
max(1,abs(math.log10(
max(h.GetPaintedGraph().GetY()))))*
max(h.GetPaintedGraph().GetY())
if cfg[
'ymax']==0
else cfg[
'ymax'])
257 h.GetPaintedGraph().SetMinimum(
max(1e-10,
min(h.GetPaintedGraph().GetY())*(0.9))
if cfg[
'ymin']==0
else cfg[
'ymin'])
260 h.GetPaintedGraph().SetMaximum(1.5*float(
max(h.GetPaintedGraph().GetY()))
if cfg[
'ymax']==0
else cfg[
'ymax'])
261 h.GetPaintedGraph().SetMinimum(0
if cfg[
'ymin']==0
else cfg[
'ymin'])
263 h.GetPaintedGraph().GetXaxis().SetTitleSize(0)
264 h.GetPaintedGraph().GetXaxis().SetLabelSize(0)
265 h.GetPaintedGraph().GetYaxis().SetLabelSize(0.05)
266 h.GetPaintedGraph().GetXaxis().SetTitleSize(0.05)
271 h.SetMaximum(1.5
if cfg[
'ymax']==0
else cfg[
'ymax'])
272 h.SetMinimum(0
if cfg[
'ymin']==0
else cfg[
'ymin'])
276 if 'y' in str(cfg[
'log']):
277 h.SetMaximum(1.5*
max(1,
max(1,abs(math.log10(h.GetMaximum()))))*h.GetMaximum()
if cfg[
'ymax']==0
else cfg[
'ymax'])
278 h.SetMinimum(
max(1e-10, h.GetMinimum()*(0.9))
if cfg[
'ymin']==0
else cfg[
'ymin'])
279 if 'avgNum' in cfg[
'histo']: h.SetMinimum(100
if cfg[
'ymin']==0
else cfg[
'ymin'])
282 h.SetMaximum(1.4*h.GetMaximum()
if cfg[
'ymax']==0
else cfg[
'ymax'])
283 h.SetMinimum(0
if cfg[
'ymin']==0
else cfg[
'ymin'])
285 h.GetXaxis().SetTitleSize(0)
286 h.GetXaxis().SetLabelSize(0)
287 h.GetYaxis().SetLabelSize(0.05)
288 h.GetYaxis().SetTitleSize(0.05)
290def setRatioStyle(ratio, cfg, color, linestyle, markstyle, ref='C000', multigraph=False, labelsizescale = 65./35., lastpad = False, splittitle = False):
291 if 'vs_truthMu' in cfg[
'histo']: ratio.GetXaxis().SetTitle(
'Truth <#mu>')
292 ratio.GetXaxis().SetTitleOffset(1.5)
293 ratio.GetYaxis().SetTitle(
'#splitline{Ratio wrt}{%s}' %ref
if splittitle
else 'Ratio wrt %s' %ref)
294 ratio.GetYaxis().SetTitleSize(0.05*labelsizescale)
295 ratio.GetYaxis().SetNdivisions(505)
296 ratio.GetYaxis().SetTitleOffset(1.3*1/labelsizescale)
298 if cfg[
'ratioyrange']
is None:
303 ratio.GetYaxis().SetRangeUser(
max(0.,
min(ratio.GetMinimum()-0.1,abs(1.9-ratio.GetMaximum()))),
max(ratio.GetMaximum()+0.1,abs(2-ratio.GetMinimum())))
306 ratio.GetYaxis().SetRangeUser(cfg[
'ratioyrange'][0],cfg[
'ratioyrange'][1])
308 ratio.GetXaxis().SetLabelSize(0.05*labelsizescale
if lastpad
else 0)
309 ratio.GetXaxis().SetTitleSize(0.05*labelsizescale
if lastpad
else 0)
310 ratio.GetYaxis().SetLabelSize(0.05*labelsizescale)
311 ratio.GetYaxis().SetTitleSize(0.05*labelsizescale)
315 ratio.SetLineColor(color)
316 ratio.SetLineStyle(linestyle)
317 ratio.SetMarkerStyle(markstyle)
318 ratio.SetMarkerColor(color)
319 ratio.SetMarkerSize(0.8)
323 xmin, xmax = histos[0].GetPaintedGraph().GetXaxis().GetXmin(), histos[0].GetPaintedGraph().GetXaxis().GetXmax()
324 g1 = ROOT.TGraphAsymmErrors(histos[0].GetPaintedGraph())
325 g2 = ROOT.TGraphAsymmErrors(histos[1].GetPaintedGraph())
326 title = g1.GetXaxis().GetTitle()
327 ratio = ROOT.TGraphAsymmErrors()
328 n, n_ref, n_test =
max(g1.GetN(),g2.GetN()), g1.GetN(), g2.GetN()
329 x_ref_arr, y_ref_arr = g1.GetX(), g1.GetY()
330 x_test_arr, y_test_arr = g2.GetX(), g2.GetY()
337 if i_test < n_test
and i_ref < n_ref:
339 x_ref, y_ref = x_ref_arr[i_ref], y_ref_arr[i_ref]
340 x_test, y_test = x_test_arr[i_test], y_test_arr[i_test]
341 err_ref_low, err_ref_high = g1.GetErrorYlow(i_ref), g1.GetErrorYhigh(i_ref)
342 err_test_low, err_test_high = g2.GetErrorYlow(i_test), g2.GetErrorYhigh(i_test)
346 y_ref, y_test = y_ref_arr[i_ref], y_test_arr[i_test]
352 y_ref, y_test = 0, y_test_arr[i_test]
357 y_test, y_ref = 0, y_ref_arr[i_ref]
360 r = y_test / y_ref
if y_ref != 0
else 1000
361 if y_test == 0
and y_ref == 0: r = 1
362 err_r_low.append(r * math.sqrt((err_ref_low / y_ref)**2 + (err_test_low / y_test)**2)
if y_ref > 0
and y_test > 0
else 0)
363 err_r_high.append(r * math.sqrt((err_ref_high / y_ref)**2 + (err_test_high / y_test)**2)
if y_ref > 0
and y_test > 0
else 0)
364 ratio.SetPoint(i, x_ref, r)
365 ratio.GetXaxis().SetTitle(title)
368 for i
in range(ratio.GetN()):
370 width = ratio.GetPointX(i+1)-ratio.GetPointX(i)
if i < ratio.GetN()-1
else ratio.GetPointX(i)-ratio.GetPointX(i-1)
371 ratio.SetPointError(i, width/2.,width/2., err_r_low[i], err_r_high[i])
373 ratio.GetXaxis().SetLimits(xmin, xmax)
381 for j,g
in enumerate(multigraphs[r].GetListOfGraphs()):
384 ymin = ROOT.gPad.GetFrame().GetY1()
385 ymax = ROOT.gPad.GetFrame().GetY2()
387 for i
in range(g.GetN()):
389 if g.GetPointY(i) > ymax:
390 markers[r].append(ROOT.TMarker(g.GetPointX(i), ymax-(ymax-ymin)*0.05, 26))
391 markers[r][outliers_index].SetMarkerColor(configs[j+NRef][
'linecolor'])
392 markers[r][outliers_index].SetMarkerSize(1.2)
393 markers[r][outliers_index].Draw(
'same')
396 if g.GetPointY(i) < ymin
and g.GetPointY(i) > 0:
397 markers[r].append(ROOT.TMarker(g.GetPointX(i), ymin+(ymax-ymin)*0.05, 32))
398 markers[r][outliers_index].SetMarkerColor(configs[j+NRef][
'linecolor'])
399 markers[r][outliers_index].SetMarkerSize(1.2)
400 markers[r][outliers_index].Draw(
'same')
407 for j,ratio
in enumerate(ratios):
409 ymin = ROOT.gPad.GetFrame().GetY1()
410 ymax = ROOT.gPad.GetFrame().GetY2()
412 for i
in range(ratio.GetNbinsX()):
414 if ratio.GetBinContent(i) > ymax:
415 markers[r].append(ROOT.TMarker(ratio.GetXaxis().GetBinCenter(i), ymax-(ymax-ymin)*0.05, 26))
416 markers[r][outliers_index].SetMarkerColor(configs[j+NRef][
'linecolor'])
417 markers[r][outliers_index].SetMarkerSize(1.2)
418 markers[r][outliers_index].Draw(
'same')
421 if ratio.GetBinContent(i) < ymin
and ratio.GetBinContent(i) > 0:
422 markers[r].append(ROOT.TMarker(ratio.GetXaxis().GetBinCenter(i), ymin+(ymax-ymin)*0.05, 32))
423 markers[r][outliers_index].SetMarkerColor(configs[j+NRef][
'linecolor'])
424 markers[r][outliers_index].SetMarkerSize(1.2)
425 markers[r][outliers_index].Draw(
'same')
436def draw(args, configs, tails=False, pu_comparison=False):
438 NRef = len(args.ref)
if not pu_comparison
else 1
441 legend =
getLegend(args.legend_coord[0],args.legend_coord[1],args.legend_coord[2],args.legend_coord[3])
442 doComparison = len(configs) > 1
443 isTEfficiencyObj =
False
447 for i,cfg
in enumerate(configs):
452 if not tails: h.Draw(
'same' if i!=0
else '')
454 else: h.Draw(
'sameHISTE' if i%2!=0
else 'samePE')
458 if doComparison
and cfg[
'dimension'] ==
'1D':
462 draw_option =
'l' if i%2!=0
else 'lp'
463 jet =
'b-Jet' if i%2==0
else 'LF-Jet'
464 legend.AddEntry(h, f
"{cfg['legend']} {jet}",draw_option)
466 else: legend.AddEntry(h, cfg[
'legend'],draw_option)
479 for r
in range(NRef):
481 labelsizescales = [canv.GetPad(1).GetHNDC()/canv.GetPad(i+2).GetHNDC()
for i
in range(NRef)]
484 multigraphs.append(ROOT.TMultiGraph())
487 if not tails
and not pu_comparison:
489 for i
in range(NRef, len(configs)):
490 ratio_histos = [histos[r]
if not isTProfile(histos[r])
else histos[r].ProjectionX(), histos[i]
if not isTProfile(histos[i])
else histos[i].ProjectionX()]
495 ratio = ratio_histos[1].Clone()
496 ratio.Divide(ratio_histos[0])
499 for i, ratio
in enumerate(ratios):
500 color = configs[i+NRef][
'linecolor']
501 linestyle = configs[i+1][
'linestyle']
502 markstyle = configs[i+1][
'markstyle']
503 setRatioStyle(ratio, configs[i], color, linestyle, markstyle, ref=configs[r][
'pipeline'], labelsizescale = labelsizescales[r], lastpad = (r==NRef-1), splittitle = (NRef>1))
506 multigraphs[r].Add(ratio,
'p')
512 xmin, xmax = ratios[0].GetXaxis().GetXmin(), ratios[0].GetXaxis().GetXmax()
513 setRatioStyle(multigraphs[r], configs[i], color, linestyle, markstyle, ref=configs[r][
'pipeline'], multigraph=
True, labelsizescale = labelsizescales[r], lastpad = (r==NRef-1), splittitle = (NRef>1))
514 multigraphs[r].Draw(
'a')
516 multigraphs[r].GetXaxis().SetLimits(xmin, xmax)
523 if args.type ==
'resolution' and not pu_comparison
and 'C000' in args.ref[0]:
524 requirement_line, requirement_text =
getURDRequirementLine(ratios[0],
'resolution', canv, labelsizescales[r], logx = (
'x' in args.log))
525 urd_lines.append(requirement_line)
526 urd_text.append(requirement_text)
527 urd_lines[r].Draw(
'same')
528 urd_text[r].Draw(
'same')
532 ratio_histos = [histos[i],histos[i+1]]
533 ratio = ratio_histos[0].Clone()
534 ratio.Divide(ratio_histos[1])
537 for i, ratio
in enumerate(ratios):
538 color = configs[i*2][
'linecolor']
539 linestyle = configs[i*2][
'linestyle']
540 markstyle = configs[i*2][
'markstyle']
541 setRatioStyle(ratio, configs[i], color, linestyle, markstyle, ref=configs[r][
'pipeline'],labelsizescale = labelsizescales[r], lastpad = (r==NRef-1))
542 ratio.GetYaxis().SetTitle(
'b-Jet / LF-Jet' if tails
else '<#mu> = 140/<#mu> = 200')
547 var = cfg[
'histo']
if not cfg[
'category'] ==
'Efficiencies/Technical' else cfg[
'histo'].
replace(
'eff',
'tech_eff')
548 canv.SaveAs(f
"{args.output}/{args.tag+'_' if args.tag != '' else ''}{var}.png")
554 inputTest = args.test
556 pipelinesRef = args.pipelineRef
557 pipelinesTest = args.pipelineTest
558 trkanalysesRef = args.trkAnalysisRef
559 trkanalysesTest = args.trkAnalysisTest
560 doTails = (args.type ==
'tails')
561 doPUComparison = args.pu_comparison
564 if not doTails
and not doPUComparison:
565 colors = [ ROOT.kRed, ROOT.kBlue, ROOT.kGreen+2, ROOT.kOrange+7, ROOT.kMagenta, ROOT.kCyan+1, ROOT.kViolet, ROOT.kTeal+2, ROOT.kPink+6, ROOT.kAzure+1]
566 linestyles = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
567 markstyles = [ 20, 21, 22, 23, 24, 25, 26, 27, 28, 30 ]
568 inputFiles = inputRef+inputTest
569 pipelines = pipelinesRef+pipelinesTest
570 trkanalyses = trkanalysesRef+trkanalysesTest
571 inputFiles = inputRef+inputTest
579 for i,pipeline
in enumerate(pipelines):
580 isReference = (i<len(pipelinesRef))
581 f = ROOT.TFile.Open(inputFiles[i],
'READ')
582 configs.append(
getConfig(f, chain, pipeline, trkanalyses[i], args, colors[i], markstyles[i], linestyles[i], isReference))
588 colors = [ROOT.kRed, ROOT.kRed, ROOT.kBlue, ROOT.kBlue]
589 linestyles = [2,1,2,1]
590 markstyles = [20,0,24,0]
if doTails
else [20, 24, 20, 24]
591 pipelines = args.pipelineRef+args.pipelineRef+args.pipelineTest+args.pipelineTest
if doTails
else args.pipelineRef+args.pipelineTest
592 trkanalyses = args.trkAnalysisRef
593 trkanalyses.extend(args.trkAnalysisTest)
594 inputFiles = inputRef+inputRef+inputTest+inputTest
if doTails
else inputRef+inputTest
597 for i,trkana
in enumerate(trkanalyses):
598 f = ROOT.TFile.Open(inputFiles[i],
'READ')
599 configs.append(
getConfig(f, chain, pipelines[i], trkanalyses[i], args, colors[i], markstyles[i], linestyles[i]))
601 draw(args, configs, tails=doTails,pu_comparison=doPUComparison)
T * Get(TFile &f, const std::string &n, const std::string &dir="", const chainmap_t *chainmap=0, std::vector< std::string > *saved=0)
get a histogram given a path, and an optional initial directory if histogram is not found,...
setRatioStyle(ratio, cfg, color, linestyle, markstyle, ref='C000', multigraph=False, labelsizescale=65./35., lastpad=False, splittitle=False)