def savehisto(histo1, histo2, label1, label2, outfile, canvas, XaxisTitle="", YaxisTitle="", plotTitle="", stats=1, logY=1): histo1.SetTitle(plotTitle) histo1.GetXaxis().SetTitle(XaxisTitle) histo1.GetYaxis().SetTitle(YaxisTitle) histo1.SetStats(stats) #histo1.Scale(1/histo1.GetEntries()) #histo2.Scale(1/histo2.GetEntries()) histo1.Draw("") canvas.Update() stats1 = histo1.FindObject("stats") #stats1.SetLabel(label1) stats1.SetOptStat(101111) stats1.SetY1NDC(0.7) stats1.SetY2NDC(0.9) histo2.SetLineColor(2) histo2.SetStats(stats) histo2.Draw("sames") canvas.Update() stats2 = histo2.FindObject("stats") #stats2.SetLabel(label2) stats2.SetOptStat(101111) stats2.SetY1NDC(0.45) stats2.SetY2NDC(0.65) legend = TLegend(.4, .9, .5, .8) legend.SetBorderSize(0) legend.SetFillColor(0) legend.SetFillStyle(0) legend.SetTextFont(42) legend.SetTextSize(0.035) legend.AddEntry(histo1, label1, "LP") legend.AddEntry(histo2, label2, "LP") legend.SetX1NDC(0.1) legend.SetX2NDC(0.3) legend.Draw("") canvas.SetLogy(logY) canvas.Print(outfile + ".pdf")
def draw(cfg, isLog=False): SetTdrStyle() canvas.SetLogy(isLog) fIn = [TFile.Open(f) for f in cfi.mergedInputFile] for dIdx, data in enumerate(cfg['data']): data['hist'] = [ fIn[data['fileIndex']].Get(cfg['name'] + postfix) for postfix in data['postfix'] ] for hIdx, hist in enumerate(data['hist']): hist.GetXaxis().SetTitle(cfg['xTitle']) hist.GetYaxis().SetTitle(cfg['yTitle']) if data['isData']: hist.SetLineColor(data['fillColor'][hIdx][0]) hist.SetMarkerColor(data['fillColor'][hIdx][0]) hist.SetMarkerStyle(data['fillColor'][hIdx][1]) hist.SetMarkerSize(0.75) else: hist.SetLineColor(data['fillColor'][hIdx]) hist.SetMarkerColor(data['fillColor'][hIdx]) hist.SetFillColor(data['fillColor'][hIdx]) # Merge total plots hTotalName = "{0}_total_{1}".format(cfg['name'], dIdx) for hIdx, hist in enumerate(data['hist']): if 'hTotal' in data.keys(): data['hTotal'].Add(hist) else: if data['isData']: data['hTotal'] = hist.Clone(hTotalName) data['hTotal'].SetLineColor(data['fillColor'][-1][0]) data['hTotal'].SetMarkerColor(data['fillColor'][-1][0]) data['hTotal'].SetMarkerStyle(data['fillColor'][-1][1]) else: data['hTotal'] = THStack(hTotalName, "") data['hTotal'].Add(hist) # Post-processing of hTotal for dIdx, data in enumerate(cfg['data']): exec data['forceNorm'] if data['hTotal'].InheritsFrom("THStack"): for h in data['hist']: h.Scale(forceNormS) else: data['hTotal'].Scale(forceNormS) if isLog: data['hTotal'].SetMaximum(data['hTotal'].GetMaximum() * 100.) if data['hTotal'].GetMinimum() * 10**5 > data['hTotal'].GetMaximum( ): data['hTotal'].SetMinimum(data['hTotal'].GetMinimum() * 0.01) else: data['hTotal'].SetMinimum(0) data['hTotal'].SetMaximum(data['hTotal'].GetMaximum() * 1.5) # Create ratio plots if 'hRatio' in cfg.keys() and data['hTotal'].InheritsFrom("TH1"): cfg['hRatio'].append([ TRatioPlot(cfg['data'][0]['hTotal'], data['hTotal'], opt) for opt in cfg['ratioOpts'] ]) else: cfg['hRatio'] = [ [], ] # Legend stLeg = TLegend(*cfg['stLegPos']) setDefaultLegend(stLeg) for data in cfg['data']: if data['isData']: stLeg.AddEntry(data['hTotal'], data['legend'][0], "ep") else: for hIdx, hist in enumerate(data['hist']): stLeg.AddEntry(hist, data['legend'][hIdx], "f") # Draw stack plots for dIdx, data in enumerate(cfg['data']): if dIdx == 0: data['hTotal'].Draw(data['drawOpt']) data['hTotal'].GetXaxis().SetTitle(cfg['xTitle']) data['hTotal'].GetYaxis().SetTitle(cfg['yTitle']) else: data['hTotal'].Draw("SAME " + data['drawOpt']) stLeg.Draw() drawLatexCMS(x=0.10, y=0.91) drawLatexLumi(x=0.89, y=0.91) drawLatexJetType(x=0.50, y=0.86) drawLatexSel(x=0.50, y=0.81) if "stExtra" in cfg.keys(): exec cfg['stExtra'] # Print files for oFormat in cfi.outputFormats: canvas.Update() canvas.Print( os.path.join( cfi.outputDir, "hstack_{0}{1}.{2}".format(cfg['name'], "_log" if isLog else "", oFormat))) # Legend rpLeg = TLegend(stLeg) rpLeg.SetX1NDC(cfg['rpLegPos'][0]) rpLeg.SetY1NDC(cfg['rpLegPos'][1]) rpLeg.SetX2NDC(cfg['rpLegPos'][2]) rpLeg.SetY2NDC(cfg['rpLegPos'][3]) for oIdx, rpOpt in enumerate(cfg['ratioOpts']): for dIdx, rp in enumerate(cfg['hRatio'][1:], start=1): rp[oIdx].SetH1DrawOpt(cfg['data'][0]['drawOpt']) rp[oIdx].SetH2DrawOpt(cfg['data'][dIdx]['drawOpt']) rp[oIdx].SetGraphDrawOpt("P Z 0 2") rp[oIdx].Draw() rp[oIdx].GetXaxis().SetTitle(cfg['xTitle']) rp[oIdx].GetUpperRefYaxis().SetTitle(cfg['yTitle']) rp[oIdx].GetLowerRefYaxis().SetTitle("Ratio") rp[oIdx].GetLowerRefYaxis().SetNdivisions(505) rp[oIdx].GetLowerRefYaxis().SetLabelSize(0.03) rp[oIdx].GetLowerRefGraph().SetMaximum(1.5) rp[oIdx].GetLowerRefGraph().SetMinimum(0.5) rp[oIdx].GetLowerRefGraph().SetFillColor( cfg['data'][dIdx]['fillColor'][-1][0]) rp[oIdx].GetLowerRefGraph().SetLineColor( cfg['data'][dIdx]['fillColor'][-1][0]) rp[oIdx].GetLowerRefGraph().SetMarkerColor( cfg['data'][dIdx]['fillColor'][-1][0]) rp[oIdx].GetLowerRefGraph().SetMarkerStyle( cfg['data'][dIdx]['fillColor'][-1][1]) if "rpExtra" in cfg.keys(): exec cfg['rpExtra'] cfg['hRatio'][1][oIdx].Draw() for dIdx, rp in enumerate(cfg['hRatio'][2:], start=2): cfg['hRatio'][1][oIdx].GetUpperPad().cd() cfg['data'][dIdx]['hTotal'].Draw(cfg['data'][dIdx]['drawOpt'] + " SAME") cfg['hRatio'][1][oIdx].GetLowerPad().cd() rp[oIdx].GetLowerRefGraph().Draw("0 P SAME") canvas.cd() rpLeg.Draw() drawLatexCMS(x=0.10, y=0.93) drawLatexLumi(x=0.88, y=0.93) drawLatexJetType(x=0.50, y=0.89) drawLatexSel(x=0.50, y=0.84) for oFormat in cfi.outputFormats: canvas.Update() canvas.Print( os.path.join( cfi.outputDir, "hratio_{0}_{1}{2}.{3}".format(rpOpt, cfg['name'], "_log" if isLog else "", oFormat))) pass
def sobWeightedPlot(self, fileName, datasetName, channel, cat, log, mass, tanb, blind, sob=False): # print 'yuta', channel, cat c = TCanvas(fileName, '', 600, 600) c.cd() if log: c.SetLogy(1) f = self.openTFile('Plot_' + fileName + '.root') isEMSM = fileName.find('SM') != -1 and fileName.find('em') != -1 isETSM = fileName.find('SM') != -1 and fileName.find('et') != -1 samples = ['ggH', 'Ztt', 'signal', 'data_obs', 'ttbar', 'EWK', 'Fakes'] if isEMSM: samples.append('ggH_hww') if isETSM: samples.append('Zee') dataGraph = self.tfileGet(f, 'Graph_from_data_obs') histDict = {} for sample in samples: histDict[sample] = self.tfileGet(f, sample) # print 'check :', sample, histDict[sample].GetSumOfWeights() if not histDict[sample]: print 'Missing histogram', sample, 'in file', 'Plot_' + fileName + '.root' # original for plots xminInset = 60 # 0 xmaxInset = 179 # 340 (for full range) # all range # xminInset = 0 # 0 # xmaxInset = 350 # 340 (for full range) # xminInset = 40 # 0 # xmaxInset = 200 # 340 (for full range) # xminInset = 120 # 0 # xmaxInset = 251 # 340 (for full range) if tanb > 0: xminInset = mass - 100 xmaxInset = mass + 100 if sob: xminInset = 0.4 xmaxInset = 0.7 ztt = histDict['Ztt'] ggH = histDict['ggH'] data = histDict['data_obs'] # This is to fix a weird plotting bug if sob: new_data = TH1F('new_data', '', ggH.GetNbinsX(), 0., 0.7) for i in range(1, new_data.GetNbinsX() + 1): new_data.SetBinContent(i, data.GetBinContent(i)) # print data.GetBinContent(i) data = new_data ggH_hww = 0 zee = 0 signal = histDict['signal'] if isEMSM: ggH_hww = histDict['ggH_hww'] if isETSM: print 'retrieve Zee' zee = histDict['Zee'] tt = histDict['ttbar'] ewk = histDict['EWK'] fakes = histDict['Fakes'] ztt.GetYaxis().SetRangeUser(0., 1.3 * self.findMaxY(data, 0)) if log: ztt.GetYaxis().SetRangeUser(0.001, 50. * self.findMaxY(data, 0)) ztt.GetXaxis().SetTitle('#bf{m_{#tau#tau} [GeV]}') ztt.GetYaxis().SetTitle('#bf{S/B Weighted dN/dm_{#tau#tau} [1/GeV]}') if tanb > 0. and not log: ztt.GetXaxis().SetRangeUser(0., mass + 200.) if sob: ztt.GetXaxis().SetTitle('S/(S+B)') ztt.GetYaxis().SetTitle('Events') ztt.SetTitleOffset(1.3, 'Y') ztt.SetTitleOffset(1., 'X') ztt.GetYaxis().SetNdivisions(505) ztt.SetNdivisions(505) for b in range(0, signal.GetNbinsX() + 2): if signal.GetBinCenter( b) < xminInset or xmaxInset < signal.GetBinCenter(b): signal.SetBinContent(b, 0.) signal.SetBinError(b, 0.) signal.SetName('sig') signal.SetFillStyle(3353) # 1001=solid , 3004,3005=diagonal signal.SetFillColor(2) signal.SetLineColor(2) signal.SetLineStyle(1) signal.SetLineWidth(0) ggH.SetBinContent(0, 0) # remove red line on top of y axis in plot ggH.SetBinContent(ggH.GetNbinsX() + 1, 0) ggH.SetBinError(0, 0) ggH.SetBinError(ggH.GetNbinsX() + 1, 0) ggH.SetName('ggH') ggH.SetFillStyle(3353) # 1001=solid , 3004,3005=diagonal ggH.SetFillColor(2) ggH.SetLineColor(2) ggH.SetLineStyle(1) ggH.SetLineWidth(0) if isEMSM: errorBand = TH1F(ggH_hww) else: errorBand = TH1F(ztt) errorBand.SetName("errorBand") errorBand.SetMarkerSize(0) errorBand.SetFillColor(1) errorBand.SetFillStyle(3013) errorBand.SetLineWidth(1) legend = TLegend() mssmLabel = '' if tanb > 0: mssmLabel = "tan#beta={tanb}".format(tanb=tanb) higgsLabel = "H(125 GeV)#rightarrow#tau#tau" if tanb > 0: higgsLabel = "H(125 GeV)#rightarrow#tau#tau" legend.SetFillStyle(0) legend.SetFillColor(0) legend.SetBorderSize(0) legend.AddEntry(ggH, higgsLabel, "F") if tanb > 0: legend.AddEntry(TObject(0), mssmLabel, "") legend.AddEntry(data, "observed", "LP") if isEMSM: legend.AddEntry(ggH_hww, "H(125 GeV)#rightarrowWW", "F") legend.AddEntry(ztt, "Z#rightarrow#tau#tau", "F") legend.AddEntry(tt, "t#bar{t}", "F") if isETSM: legend.AddEntry(zee, "Z#rightarrowee", "F") legend.AddEntry(ewk, "electroweak", "F") legend.AddEntry(fakes, "QCD", "F") legend.SetX1NDC(0.63) legend.SetX2NDC(1.05) legend.SetY1NDC(0.25) legend.SetY2NDC(0.46) if log: legend.SetX1NDC(0.18) legend.SetX2NDC(0.60) legend.SetY1NDC(0.17) legend.SetY2NDC(0.38) legend.SetTextSize(.028) legend.SetTextAlign(12) if isEMSM: dataDiff = self.diffPlot(data, ggH_hww, 1) dataDiffGraph = self.diffGraph(dataGraph, ggH_hww, 1) errBand = self.getErrorBand(ggH_hww) else: dataDiff = self.diffPlot(data, ztt, 1) dataDiffGraph = self.diffGraph(dataGraph, ztt, 1) errBand = self.getErrorBand(ztt) errBand.SetFillStyle( 3013 ) # 1001=solid , 3004,3005=diagonal, 3013=hatched official for H.tau tau errBand.SetFillColor(1) errBand.SetLineStyle(1) errBand.SetLineColor(1) errBand.SetLineWidth(1) errBandFrame = TH1F( 'errBandFrame', '', int((xmaxInset - xminInset) / dataDiff.GetBinWidth(1)), xminInset, xmaxInset) errBandFrame.GetYaxis().SetTitle("") errBandFrame.GetYaxis().SetRangeUser( -1.1 * self.findMinY(dataDiff, blind, 0, xminInset, xmaxInset), 2.0 * self.findMaxY(dataDiff, blind, 0, xminInset, xmaxInset)) # errBandFrame.GetYaxis().SetRangeUser(-1.*self.findMinY(dataDiff,blind,0,xminInset,xmaxInset),1.1*self.findMaxY(dataDiff,blind,0,xminInset,xmaxInset)) # good ! # errBandFrame.GetYaxis().SetRangeUser(-0.2*self.findMinY(dataDiff,blind,0,xminInset,xmaxInset),0.5*self.findMaxY(dataDiff,blind,0,xminInset,xmaxInset)) print 'Yuta', channel, cat if (channel == 'e#tau_{h}' and cat == 'vbf') or (channel == 'e#tau_{h}' and cat == ''): print 'enter' errBandFrame.GetYaxis().SetRangeUser( -2. * self.findMinY(dataDiff, blind, 0, xminInset, xmaxInset), 2.0 * self.findMaxY(dataDiff, blind, 0, xminInset, xmaxInset)) errBandFrame.GetYaxis().SetNdivisions(5) errBandFrame.GetYaxis().SetLabelSize(0.06) errBandFrame.GetXaxis().SetTitle("#bf{m_{#tau#tau} [GeV]} ") errBandFrame.GetXaxis().SetTitleColor(kBlack) errBandFrame.GetXaxis().SetTitleSize(0.07) errBandFrame.GetXaxis().SetTitleOffset(0.85) errBandFrame.GetXaxis().SetLabelSize(0.06) errBandFrame.GetXaxis().SetNdivisions(506) # errBandFrame.SetNdivisions(505) legendDiff = TLegend() legendDiff.SetFillStyle(0) legendDiff.SetFillColor(0) legendDiff.SetBorderSize(0) legendDiff.AddEntry(signal, higgsLabel, "F") if tanb > 0: legendDiff.AddEntry(TObject(0), mssmLabel, '') # That might not work in python # legendDiff.AddEntry(dataDiff,"Data - Background","LP") legendDiff.AddEntry(dataDiffGraph, "Data - Background", "LEP") legendDiff.AddEntry(errBand, "Bkg. Uncertainty", "F") legendDiff.SetX1NDC(0.45) legendDiff.SetX2NDC(0.88) legendDiff.SetY1NDC(0.67) legendDiff.SetY2NDC(0.88) if dataDiff.GetBinContent(dataDiff.FindBin(mass)) < 0.: legendDiff.SetX1NDC(0.45) legendDiff.SetX2NDC(0.88) legendDiff.SetY1NDC(0.24) legendDiff.SetY2NDC(0.45) legendDiff.SetTextSize(.045) legendDiff.SetTextAlign(12) padBack = TPad( "padBack", "padBack", 0.57, 0.58, 0.975, 0.956) # TPad must be created after TCanvas otherwise ROOT crashes padBack.SetFillColor(0) pad = TPad( "diff", "diff", 0.45, 0.5, 0.9765, 0.957) # TPad must be created after TCanvas otherwise ROOT crashes pad.cd() pad.SetFillColor(0) pad.SetFillStyle(0) errBandFrame.Draw() errBand.Draw("e2lsame") signal.Draw("histsame") line = TLine() line.DrawLine(xminInset, 0, xmaxInset, 0) # dataDiff.Draw("pe same") if blind == False: self.HideBin(dataDiffGraph) dataDiffGraph.SetMarkerSize(0.5) dataDiffGraph.Draw('pe same') for ibin in range(0, dataDiffGraph.GetN()): x = Double(0.) y = Double(0.) dataDiffGraph.GetPoint(ibin, x, y) print 'Yuta_bin=', ibin, 'x=', x, 'y=', y, dataDiffGraph.GetErrorYhigh( ibin), dataDiffGraph.GetErrorYlow(ibin) print 'Yuta_error=', ibin, errBand.GetXaxis().GetBinCenter( ibin + 1), errBand.GetBinError(ibin + 1) legendDiff.Draw() pad.RedrawAxis() c.cd() ztt.Draw("hist") ggH.Draw("hist same") if isEMSM: ggH_hww.Draw("hist same") ztt.Draw("hist same") errorBand.Draw("e2 same") tt.Draw("hist same") if isETSM: zee.Draw("hist same") ewk.Draw("hist same") fakes.Draw("hist same") # data.Draw("pe same") dataGraph.SetMarkerSize(1) dataGraph.Draw('PE same') if blind == False: self.HideBin(dataGraph) print '#####', data.Integral(), data.GetBinContent(1) legend.Draw() c.RedrawAxis() padBack.Draw() # clear the background axe pad.Draw() if log: c.SetLogy(1) self.CMSPrelim(c, datasetName, channel, cat) savepath = 'figure/Plot_' + fileName if cat == '': savepath = savepath + '.pdf' else: savepath = savepath + '_' + cat + '.pdf' # c.Print('figure/Plot_'+fileName+".eps") # c.Print('figure/Plot_'+fileName+".png") # c.Print('figure/Plot_'+fileName+".pdf") c.Print(savepath) c.Close()
def MakeOneDHist(pathToDir, distribution): numFittingSamples = 0 HeaderLabel = TPaveLabel(header_x_left, header_y_bottom, header_x_right, header_y_top, HeaderText, "NDC") HeaderLabel.SetTextAlign(32) HeaderLabel.SetBorderSize(0) HeaderLabel.SetFillColor(0) HeaderLabel.SetFillStyle(0) LumiLabel = TPaveLabel(topLeft_x_left, topLeft_y_bottom, topLeft_x_right, topLeft_y_top, LumiText, "NDC") LumiLabel.SetBorderSize(0) LumiLabel.SetFillColor(0) LumiLabel.SetFillStyle(0) NormLabel = TPaveLabel() NormLabel.SetDrawOption("NDC") NormLabel.SetX1NDC(topLeft_x_left) NormLabel.SetX2NDC(topLeft_x_right) NormLabel.SetBorderSize(0) NormLabel.SetFillColor(0) NormLabel.SetFillStyle(0) NormText = "" if arguments.normalizeToUnitArea: NormText = "Scaled to unit area" elif arguments.normalizeToData: NormText = "MC scaled to data" NormLabel.SetLabel(NormText) YieldsLabel = TPaveText(0.39, 0.7, 0.59, 0.9, "NDC") YieldsLabel.SetBorderSize(0) YieldsLabel.SetFillColor(0) YieldsLabel.SetFillStyle(0) YieldsLabel.SetTextAlign(12) RatiosLabel = TPaveText() RatiosLabel.SetDrawOption("NDC") RatiosLabel.SetBorderSize(0) RatiosLabel.SetFillColor(0) RatiosLabel.SetFillStyle(0) RatiosLabel.SetTextAlign(32) Legend = TLegend() Legend.SetBorderSize(0) Legend.SetFillColor(0) Legend.SetFillStyle(0) fittingIntegral = 0 scaleFactor = 1 HistogramsToFit = [] TargetDataset = distribution['target_dataset'] FittingLegendEntries = [] DataLegendEntries = [] FittingHistogramDatasets = [] Stack_list = [] Stack_list.append(THStack("stack_before", distribution['name'])) Stack_list.append(THStack("stack_after", distribution['name'])) fileName = condor_dir + "/" + distribution['target_dataset'] + ".root" if not os.path.exists(fileName): return inputFile = TFile(fileName) if inputFile.IsZombie() or not inputFile.GetNkeys(): return Target = inputFile.Get("OSUAnalysis/" + distribution['channel'] + "/" + distribution['name']).Clone() Target.SetDirectory(0) inputFile.Close() Target.SetMarkerStyle(20) Target.SetMarkerSize(0.8) Target.SetFillStyle(0) Target.SetLineColor(colors[TargetDataset]) Target.SetLineStyle(1) Target.SetLineWidth(2) targetIntegral = Target.Integral() if (arguments.normalizeToUnitArea and Target.Integral() > 0): Target.Scale(1. / Target.Integral()) if arguments.rebinFactor: RebinFactor = int(arguments.rebinFactor) #don't rebin histograms which will have less than 5 bins or any gen-matching histograms if Target.GetNbinsX() >= RebinFactor * 5 and Target.GetName().find( "GenMatch") is -1: Target.Rebin(RebinFactor) ### formatting target histogram and adding to legend legendIndex = 0 Legend.AddEntry(Target, labels[TargetDataset], "LEP") legendIndex = legendIndex + 1 if not outputFile.Get("OSUAnalysis"): outputFile.mkdir("OSUAnalysis") if not outputFile.Get("OSUAnalysis/" + distribution['channel']): outputFile.Get("OSUAnalysis").mkdir(distribution['channel']) for sample in distribution[ 'datasets']: # loop over different samples requested to be fit dataset_file = "%s/%s.root" % (condor_dir, sample) inputFile = TFile(dataset_file) HistogramObj = inputFile.Get(pathToDir + "/" + distribution['channel'] + "/" + distribution['name']) if not HistogramObj: print "WARNING: Could not find histogram " + pathToDir + "/" + distribution[ 'channel'] + "/" + distribution[ 'name'] + " in file " + dataset_file + ". Will skip it and continue." continue Histogram = HistogramObj.Clone() Histogram.SetDirectory(0) inputFile.Close() if arguments.rebinFactor: RebinFactor = int(arguments.rebinFactor) #don't rebin histograms which will have less than 5 bins or any gen-matching histograms if Histogram.GetNbinsX() >= RebinFactor * 5 and Histogram.GetName( ).find("GenMatch") is -1: Histogram.Rebin(RebinFactor) xAxisLabel = Histogram.GetXaxis().GetTitle() unitBeginIndex = xAxisLabel.find("[") unitEndIndex = xAxisLabel.find("]") if unitBeginIndex is not -1 and unitEndIndex is not -1: #x axis has a unit yAxisLabel = "Entries / " + str(Histogram.GetXaxis().GetBinWidth( 1)) + " " + xAxisLabel[unitBeginIndex + 1:unitEndIndex] else: yAxisLabel = "Entries per bin (" + str( Histogram.GetXaxis().GetBinWidth(1)) + " width)" if not arguments.makeFancy: histoTitle = Histogram.GetTitle() else: histoTitle = "" legLabel = labels[sample] if (arguments.printYields): yieldHist = Histogram.Integral() legLabel = legLabel + " (%.1f)" % yieldHist FittingLegendEntries.append(legLabel) if (types[sample] == "bgMC"): numFittingSamples += 1 fittingIntegral += Histogram.Integral() Histogram.SetLineStyle(1) if (arguments.noStack): Histogram.SetFillStyle(0) Histogram.SetLineColor(colors[sample]) Histogram.SetLineWidth(2) else: Histogram.SetFillStyle(1001) Histogram.SetFillColor(colors[sample]) Histogram.SetLineColor(1) Histogram.SetLineWidth(1) elif (types[sample] == "signalMC"): numFittingSamples += 1 Histogram.SetFillStyle(0) Histogram.SetLineColor(colors[sample]) Histogram.SetLineStyle(1) Histogram.SetLineWidth(2) if (arguments.normalizeToUnitArea and Histogram.Integral() > 0): Histogram.Scale(1. / Histogram.Integral()) HistogramsToFit.append(Histogram) FittingHistogramDatasets.append(sample) #scaling histograms as per user's specifications if targetIntegral > 0 and fittingIntegral > 0: scaleFactor = targetIntegral / fittingIntegral for fittingHist in HistogramsToFit: if arguments.normalizeToData: fittingHist.Scale(scaleFactor) if arguments.normalizeToUnitArea and not arguments.noStack and fittingIntegral > 0: fittingHist.Scale(1. / fittingIntegral) elif arguments.normalizeToUnitArea and arguments.noStack and fittingHist.Integral( ) > 0: fittingHist.Scale(1. / fittingHist.Integral()) def fitf(x, par): xBin = HistogramsToFit[0].FindBin(x[0]) value = 0.0 for i in range(0, len(HistogramsToFit)): value += par[i] * HistogramsToFit[i].GetBinContent(xBin) + par[ i + len(HistogramsToFit)] * HistogramsToFit[i].GetBinError(xBin) return value lowerLimit = Target.GetBinLowEdge(1) upperLimit = Target.GetBinLowEdge(Target.GetNbinsX()) + Target.GetBinWidth( Target.GetNbinsX()) if 'lowerLimit' in distribution: lowerLimit = distribution['lowerLimit'] if 'upperLimit' in distribution: upperLimit = distribution['upperLimit'] func = TF1("fit", fitf, lowerLimit, upperLimit, 2 * len(HistogramsToFit)) for i in range(0, len(HistogramsToFit)): if 'fixed_datasets' in distribution and distribution['datasets'][ i] in distribution['fixed_datasets']: func.FixParameter(i, 1.0) else: func.SetParameter(i, 1.0) # func.SetParLimits (i, 0.0, 1.0e2) # comment this out so we don't have to pre-normalize the QCD input sample func.SetParName(i, labels[FittingHistogramDatasets[i]]) shiftedScaleFactors = [] if arguments.parametricErrors: # loop over all input histograms and shift them +- 1 sigma for i in range(0, len(HistogramsToFit)): sfs = [] # -1 => -1 sigma, +1 => +1 sigma for j in [-1, 1]: # loop over the parameters holding the errors for each dataset, fixing all to 0 for k in range(len(HistogramsToFit), 2 * len(HistogramsToFit)): func.FixParameter(k, 0) # fix the error of the dataset of interest to +-1 func.FixParameter(i + len(HistogramsToFit), j) # perform new fit for k in range(0, distribution['iterations'] - 1): if j == -1: print "Scale down " + labels[FittingHistogramDatasets[ i]] + " iteration " + str(k + 1) + "..." if j == 1: print "Scale up " + labels[FittingHistogramDatasets[ i]] + " iteration " + str(k + 1) + "..." Target.Fit("fit", "QEMR0") Target.Fit("fit", "VEMR0") # save the new scale factors for each dataset for k in range(0, len(HistogramsToFit)): sfs.append(func.GetParameter(k)) shiftedScaleFactors.append(sfs) # reset the parameters with the errors of each dataset to 0 for i in range(len(HistogramsToFit), 2 * len(HistogramsToFit)): func.FixParameter(i, 0) # do the fit to get the central values for i in range(0, distribution['iterations'] - 1): print "Iteration " + str(i + 1) + "..." Target.Fit("fit", "QEMR0") Target.Fit("fit", "VEMR0") if arguments.parametricErrors: # make a list of the largest errors on each contribution by shifting any other contribution parErrors = [] # loop over all the datasets for i in range(0, len(HistogramsToFit)): centralValue = func.GetParameter(i) maxError = 0 # find the maximum deviation from the central value and save that for shiftedScaleFactor in shiftedScaleFactors[i]: currentError = abs(shiftedScaleFactor - centralValue) if currentError > maxError: maxError = currentError parErrors.append(maxError) finalMax = 0 if not arguments.noStack: for fittingHist in HistogramsToFit: finalMax += fittingHist.GetMaximum() else: for fittingHist in HistogramsToFit: if (fittingHist.GetMaximum() > finalMax): finalMax = fittingHist.GetMaximum() if (Target.GetMaximum() > finalMax): finalMax = Target.GetMaximum() Target.SetMaximum(1.1 * finalMax) Target.SetMinimum(0.0001) Canvas = TCanvas(distribution['name'] + "_FitFunction") Canvas.cd(1) Target.Draw() func.Draw("same") outputFile.cd("OSUAnalysis/" + distribution['channel']) Canvas.Write() if arguments.savePDFs: if histogram == input_histograms[0]: Canvas.Print(pdfFileName + "(", "pdf") else: Canvas.Print(pdfFileName, "pdf") Target.SetStats(0) ### formatting bgMC histograms and adding to legend legendIndex = numFittingSamples - 1 for Histogram in reversed(HistogramsToFit): if (arguments.noStack): Legend.AddEntry(Histogram, FittingLegendEntries[legendIndex], "L") else: Legend.AddEntry(Histogram, FittingLegendEntries[legendIndex], "F") legendIndex = legendIndex - 1 ### Drawing histograms to canvas makeRatioPlots = arguments.makeRatioPlots makeDiffPlots = arguments.makeDiffPlots yAxisMin = 0.0001 if arguments.setYMin: yAxisMin = float(arguments.setYMin) ### Draw everything to the canvases !!!! for i in range(0, 2): # 0 => before, 1 => after integrals = [] ratios = [] errors = [] if i == 1: # loop over each dataset, saving it's yield and the errors on it for j in range(0, len(HistogramsToFit)): integrals.append(HistogramsToFit[j].Integral()) HistogramsToFit[j].Scale(func.GetParameter(j)) ratios.append(func.GetParameter(j)) errors.append(func.GetParError(j)) for fittingHist in HistogramsToFit: if not arguments.noStack: Stack_list[i].Add(fittingHist) #creating the histogram to represent the statistical errors on the stack if not arguments.noStack: ErrorHisto = HistogramsToFit[0].Clone("errors") ErrorHisto.SetFillStyle(3001) ErrorHisto.SetFillColor(13) ErrorHisto.SetLineWidth(0) if i == 1: Legend.AddEntry(ErrorHisto, "Stat. Errors", "F") for Histogram in HistogramsToFit: if Histogram is not HistogramsToFit[0]: ErrorHisto.Add(Histogram) if i == 0: Canvas = TCanvas(distribution['name'] + "_Before") if i == 1: Canvas = TCanvas(distribution['name'] + "_After") if makeRatioPlots or makeDiffPlots: Canvas.SetFillStyle(0) Canvas.Divide(1, 2) Canvas.cd(1) gPad.SetPad(0, 0.25, 1, 1) gPad.SetMargin(0.15, 0.05, 0.01, 0.07) gPad.SetFillStyle(0) gPad.Update() gPad.Draw() if arguments.setLogY: gPad.SetLogy() Canvas.cd(2) gPad.SetPad(0, 0, 1, 0.25) # format: gPad.SetMargin(l,r,b,t) gPad.SetMargin(0.15, 0.05, 0.4, 0.01) gPad.SetFillStyle(0) gPad.SetGridy(1) gPad.Update() gPad.Draw() Canvas.cd(1) ### finding the maximum value of anything going on the canvas, so we know how to set the y-axis finalMax = 0 if numFittingSamples is not 0 and not arguments.noStack: finalMax = ErrorHisto.GetMaximum() + ErrorHisto.GetBinError( ErrorHisto.GetMaximumBin()) else: for bgMCHist in HistogramsToFit: if (bgMCHist.GetMaximum() > finalMax): finalMax = bgMCHist.GetMaximum() if (Target.GetMaximum() > finalMax): finalMax = Target.GetMaximum() + Target.GetBinError( Target.GetMaximumBin()) finalMax = 1.15 * finalMax if arguments.setYMax: finalMax = float(arguments.setYMax) if not arguments.noStack: # draw stacked background samples Stack_list[i].SetTitle(histoTitle) Stack_list[i].Draw("HIST") Stack_list[i].GetXaxis().SetTitle(xAxisLabel) Stack_list[i].GetYaxis().SetTitle(yAxisLabel) Stack_list[i].SetMaximum(finalMax) Stack_list[i].SetMinimum(yAxisMin) if makeRatioPlots or makeDiffPlots: Stack_list[i].GetHistogram().GetXaxis().SetLabelSize(0) #draw shaded error bands ErrorHisto.Draw("A E2 SAME") else: #draw the unstacked backgrounds HistogramsToFit[0].SetTitle(histoTitle) HistogramsToFit[0].Draw("HIST") HistogramsToFit[0].GetXaxis().SetTitle(xAxisLabel) HistogramsToFit[0].GetYaxis().SetTitle(yAxisLabel) HistogramsToFit[0].SetMaximum(finalMax) HistogramsToFit[0].SetMinimum(yAxisMin) for bgMCHist in HistogramsToFit: bgMCHist.Draw("A HIST SAME") Target.Draw("A E X0 SAME") #legend coordinates, empirically determined :-) x_left = 0.6761745 x_right = 0.9328859 x_width = x_right - x_left y_max = 0.9 entry_height = 0.05 if (numFittingSamples is not 0): #then draw the data & bgMC legend numExtraEntries = 2 # count the target and (lack of) title Legend.SetX1NDC(x_left) numExtraEntries = numExtraEntries + 1 # count the stat. errors entry Legend.SetY1NDC(y_max - entry_height * (numExtraEntries + numFittingSamples)) Legend.SetX2NDC(x_right) Legend.SetY2NDC(y_max) Legend.Draw() RatiosLabel.SetX1NDC(x_left - 0.1) RatiosLabel.SetX2NDC(x_right) RatiosLabel.SetY2NDC(Legend.GetY1NDC() - 0.1) RatiosLabel.SetY1NDC(RatiosLabel.GetY2NDC() - entry_height * (numFittingSamples)) # Deciding which text labels to draw and drawing them drawLumiLabel = False drawNormLabel = False offsetNormLabel = False drawHeaderLabel = False if not arguments.normalizeToUnitArea: #don't draw the lumi label if there's no data and it's scaled to unit area drawLumiLabel = True # move the normalization label down before drawing if we drew the lumi. label offsetNormLabel = True if arguments.normalizeToUnitArea or arguments.normalizeToData: drawNormLabel = True if arguments.makeFancy: drawHeaderLabel = True drawLumiLabel = False # now that flags are set, draw the appropriate labels if drawLumiLabel: LumiLabel.Draw() if drawNormLabel: if offsetNormLabel: NormLabel.SetY1NDC(topLeft_y_bottom - topLeft_y_offset) NormLabel.SetY2NDC(topLeft_y_top - topLeft_y_offset) else: NormLabel.SetY1NDC(topLeft_y_bottom) NormLabel.SetY2NDC(topLeft_y_top) NormLabel.Draw() if drawHeaderLabel: HeaderLabel.Draw() YieldsLabel.Clear() mcYield = Stack_list[i].GetStack().Last().Integral() dataYield = Target.Integral() if i == 0: YieldsLabel.AddText("Before Fit to Data") if i == 1: YieldsLabel.AddText("After Fit to Data") YieldsLabel.AddText("data yield: " + '%.1f' % dataYield) YieldsLabel.AddText("bkgd yield: " + '%.1f' % mcYield) YieldsLabel.AddText("data/bkgd: " + '%.2f' % (dataYield / mcYield)) if i == 1: for j in range(0, len(FittingLegendEntries)): if abs(ratios[j] - 1) < 0.001 and abs( errors[j] ) < 0.001: #then it probably was held fixed continue if arguments.showFittedYields: yield_ = ratios[j] * integrals[j] yielderror_ = errors[j] * yield_ text = FittingLegendEntries[ j] + " yield: " + '%.0f' % yield_ + ' #pm %.0f' % yielderror_ else: text = FittingLegendEntries[ j] + " ratio: " + '%.2f' % ratios[ j] + ' #pm %.2f' % errors[j] text = text + " (fit)" if arguments.parametricErrors: yield_ = ratios[j] * integrals[j] yieldParError_ = parErrors[j] * yield_ if arguments.showFittedYields: text += ' #pm %.2f' % yieldParError_ else: text += ' #pm %.2f' % parErrors[j] text = text + " (sys)" RatiosLabel.AddText(text) YieldsLabel.Draw() RatiosLabel.Draw() # drawing the ratio or difference plot if requested if (makeRatioPlots or makeDiffPlots): Canvas.cd(2) BgSum = Stack_list[i].GetStack().Last() if makeRatioPlots: if arguments.ratioRelErrMax: Comparison = ratioHistogram(Target, BgSum, arguments.ratioRelErrMax) else: Comparison = ratioHistogram(Target, BgSum) elif makeDiffPlots: Comparison = Target.Clone("diff") Comparison.Add(BgSum, -1) Comparison.SetTitle("") Comparison.GetYaxis().SetTitle("Data-Bkgd") Comparison.GetXaxis().SetTitle(xAxisLabel) Comparison.GetYaxis().CenterTitle() Comparison.GetYaxis().SetTitleSize(0.1) Comparison.GetYaxis().SetTitleOffset(0.5) Comparison.GetXaxis().SetTitleSize(0.15) Comparison.GetYaxis().SetLabelSize(0.1) Comparison.GetXaxis().SetLabelSize(0.15) if makeRatioPlots: RatioYRange = 1.15 if arguments.ratioYRange: RatioYRange = float(arguments.ratioYRange) Comparison.GetYaxis().SetRangeUser(-1 * RatioYRange, RatioYRange) elif makeDiffPlots: YMax = Comparison.GetMaximum() YMin = Comparison.GetMinimum() if YMax <= 0 and YMin <= 0: Comparison.GetYaxis().SetRangeUser(-1.2 * YMin, 0) elif YMax >= 0 and YMin >= 0: Comparison.GetYaxis().SetRangeUser(0, 1.2 * YMax) else: #axis crosses y=0 if abs(YMax) > abs(YMin): Comparison.GetYaxis().SetRangeUser( -1.2 * YMax, 1.2 * YMax) else: Comparison.GetYaxis().SetRangeUser( -1.2 * YMin, 1.2 * YMin) Comparison.GetYaxis().SetNdivisions(205) Comparison.Draw("E0") if i == 0: Canvas.Write(distribution['name'] + "_Before") if arguments.savePDFs: pathToDirString = plainTextString(pathToDir) Canvas.SaveAs(condor_dir + "/fitting_histogram_pdfs/" + pathToDirString + "/" + distribution['name'] + "_Before.pdf") if i == 1: Canvas.Write(distribution['name'] + "_After") if arguments.savePDFs: pathToDirString = plainTextString(pathToDir) Canvas.SaveAs(condor_dir + "/fitting_histogram_pdfs/" + pathToDirString + "/" + distribution['name'] + "_After.pdf")
def MakeOneHist(histogramName): HeaderLabel = TPaveLabel(header_x_left, header_y_bottom, header_x_right, header_y_top, HeaderText, "NDC") HeaderLabel.SetTextAlign(32) HeaderLabel.SetBorderSize(0) HeaderLabel.SetFillColor(0) HeaderLabel.SetFillStyle(0) LumiLabel = TPaveLabel(topLeft_x_left, topLeft_y_bottom, topLeft_x_right, topLeft_y_top, LumiText, "NDC") LumiLabel.SetBorderSize(0) LumiLabel.SetFillColor(0) LumiLabel.SetFillStyle(0) NormLabel = TPaveLabel() NormLabel.SetDrawOption("NDC") NormLabel.SetX1NDC(topLeft_x_left) NormLabel.SetX2NDC(topLeft_x_right) NormLabel.SetBorderSize(0) NormLabel.SetFillColor(0) NormLabel.SetFillStyle(0) NormText = "" if arguments.normalizeToUnitArea: NormText = "Scaled to unit area" Legend = TLegend() Legend.SetBorderSize(0) Legend.SetFillColor(0) Legend.SetFillStyle(0) Canvas = TCanvas(histogramName) Histograms = [] LegendEntries = [] colorIndex = 0 for source in input_sources: # loop over different input sources in config file dataset_file = "condor/%s/%s.root" % (source['condor_dir'], source['dataset']) inputFile = TFile(dataset_file) NumHistogramObj = inputFile.Get("OSUAnalysis/" + source['num_channel'] + "/" + histogramName) if 'condor_dir_den' in source: # If specified, take the denominator histogram from a different condor directory. dataset_fileDen = "condor/%s/%s.root" % (source['condor_dir_den'], source['dataset']) inputFileDen = TFile(dataset_fileDen) DenHistogramObj = inputFileDen.Get("OSUAnalysis/" + source['den_channel'] + "/" + histogramName) else: # Default is to use the same condor directory DenHistogramObj = inputFile.Get("OSUAnalysis/" + source['den_channel'] + "/" + histogramName) if not NumHistogramObj: print "WARNING: Could not find histogram " + source[ 'num_channel'] + "/" + histogramName + " in file " + dataset_file + ". Will skip it and continue." return if not DenHistogramObj: print "WARNING: Could not find histogram " + source[ 'den_channel'] + "/" + histogramName + " in file " + dataset_file + ". Will skip it and continue." return Histogram = NumHistogramObj.Clone() if Histogram.Class().InheritsFrom("TH2"): Histogram.SetName(Histogram.GetName() + "__" + source['dataset']) Histogram.SetDirectory(0) DenHistogram = DenHistogramObj.Clone() DenHistogram.SetDirectory(0) inputFile.Close() if arguments.rebinFactor: RebinFactor = int(arguments.rebinFactor) #don't rebin histograms which will have less than 5 bins or any gen-matching histograms if Histogram.GetNbinsX() >= RebinFactor * 5 and Histogram.GetTitle( ).find("GenMatch") is -1 and not Histogram.Class().InheritsFrom( "TH2"): Histogram.Rebin(RebinFactor) DenHistogram.Rebin(RebinFactor) xAxisLabel = Histogram.GetXaxis().GetTitle() unitBeginIndex = xAxisLabel.find("[") unitEndIndex = xAxisLabel.find("]") if unitBeginIndex is not -1 and unitEndIndex is not -1: #x axis has a unit yAxisLabel = "#epsilon_{ " + cutName + "} (" + str( Histogram.GetXaxis().GetBinWidth(1) ) + " " + xAxisLabel[unitBeginIndex + 1:unitEndIndex] + " width)" else: yAxisLabel = "#epsilon_{ " + cutName + "} (" + str( Histogram.GetXaxis().GetBinWidth(1)) + " width)" if arguments.normalizeToUnitArea: yAxisLabel = yAxisLabel + " (Unit Area Norm.)" #Histogram = ROOT.TGraphAsymmErrors(NumHistogramObj,DenHistogramObj) if arguments.noTGraph or Histogram.Class().InheritsFrom("TH2"): Histogram.Divide(DenHistogram) else: Histogram = TGraphAsymmErrors(Histogram, DenHistogram) if not arguments.makeFancy: fullTitle = Histogram.GetTitle() splitTitle = fullTitle.split(":") # print splitTitle histoTitle = splitTitle[1].lstrip(" ") else: histoTitle = "" if 'color' in source: Histogram.SetMarkerColor(colors[source['color']]) Histogram.SetLineColor(colors[source['color']]) else: Histogram.SetMarkerColor(colors[colorList[colorIndex]]) Histogram.SetLineColor(colors[colorList[colorIndex]]) colorIndex = colorIndex + 1 if colorIndex is len(colorList): colorIndex = 0 markerStyle = 20 if 'marker' in source: markerStyle = markers[source['marker']] if 'fill' in source: markerStyle = markerStyle + fills[source['fill']] Histogram.SetMarkerStyle(markerStyle) Histogram.SetLineWidth(line_width) Histogram.SetFillStyle(0) LegendEntries.append(source['legend_entry']) Histograms.append(Histogram) ### scaling histograms as per user's specifications for histogram in Histograms: if arguments.normalizeToUnitArea and histogram.Integral() > 0: histogram.Scale(1. / histogram.Integral()) ### formatting histograms and adding to legend legendIndex = 0 for histogram in Histograms: Legend.AddEntry(histogram, LegendEntries[legendIndex], "LEP") legendIndex = legendIndex + 1 ### finding the maximum value of anything going on the canvas, so we know how to set the y-axis finalMax = 0 if arguments.noTGraph: for histogram in Histograms: currentMax = histogram.GetMaximum() + histogram.GetBinError( histogram.GetMaximumBin()) if (currentMax > finalMax): finalMax = currentMax finalMax = 1.5 * finalMax if finalMax is 0: finalMax = 1 if arguments.setYMax: finalMax = float(arguments.setYMax) ### Drawing histograms to canvas makeRatioPlots = arguments.makeRatioPlots makeDiffPlots = arguments.makeDiffPlots yAxisMin = 0.0001 if arguments.setYMin: yAxisMin = float(arguments.setYMin) if makeRatioPlots or makeDiffPlots: Canvas.SetFillStyle(0) Canvas.Divide(1, 2) Canvas.cd(1) gPad.SetPad(0, 0.25, 1, 1) gPad.SetMargin(0.15, 0.05, 0.01, 0.07) gPad.SetFillStyle(0) gPad.Update() gPad.Draw() if arguments.setLogY: gPad.SetLogy() Canvas.cd(2) gPad.SetPad(0, 0, 1, 0.25) #format: gPad.SetMargin(l,r,b,t) gPad.SetMargin(0.15, 0.05, 0.4, 0.01) gPad.SetFillStyle(0) gPad.SetGridy(1) gPad.Update() gPad.Draw() Canvas.cd(1) histCounter = 0 plotting_options = "" if arguments.plot_hist: plotting_options = "HIST" for histogram in Histograms: if histogram.Class().InheritsFrom("TH2"): histogram.SetTitle(histoTitle) histogram.Draw("colz") DatasetName = histogram.GetName() DatasetName = DatasetName[ DatasetName.rfind('__') + 2:] # substring starting with the last underscore DatasetLabel = TPaveLabel(topLeft_x_left, topLeft_y_bottom, topLeft_x_right, topLeft_y_top, DatasetName, "NDC") DatasetLabel.SetBorderSize(0) DatasetLabel.SetFillColor(0) DatasetLabel.SetFillStyle(0) DatasetLabel.Draw() outputFile.cd() Canvas.SetName(histogram.GetName()) Canvas.Write() if arguments.makeFancy: HeaderLabel.Draw() else: if histogram.InheritsFrom("TGraph") and histCounter == 0: plotting_options = "AP" histogram.SetTitle(histoTitle) histogram.Draw(plotting_options) histogram.GetXaxis().SetTitle(xAxisLabel) histogram.GetYaxis().SetTitle(yAxisLabel) if histogram.InheritsFrom("TH1"): histogram.SetMaximum(finalMax) histogram.SetMinimum(yAxisMin) if makeRatioPlots or makeDiffPlots: histogram.GetXaxis().SetLabelSize(0) if histCounter is 0: if histogram.InheritsFrom("TH1"): plotting_options = plotting_options + " SAME" elif histogram.InheritsFrom("TGraph"): plotting_options = "P" histCounter = histCounter + 1 if histogram.Class().InheritsFrom("TH2"): return #legend coordinates, empirically determined :-) x_left = 0.1677852 x_right = 0.9647651 y_min = 0.6765734 y_max = 0.9 Legend.SetX1NDC(x_left) Legend.SetY1NDC(y_min) Legend.SetX2NDC(x_right) Legend.SetY2NDC(y_max) Legend.Draw() if arguments.makeFancy: HeaderLabel.Draw() #drawing the ratio or difference plot if requested if makeRatioPlots or makeDiffPlots: Canvas.cd(2) if makeRatioPlots: Comparison = ratioHistogram(Histograms[0], Histograms[1]) elif makeDiffPlots: Comparison = Histograms[0].Clone("diff") Comparison.Add(Histograms[1], -1) Comparison.SetTitle("") Comparison.GetYaxis().SetTitle("hist1-hist2") Comparison.GetXaxis().SetTitle(xAxisLabel) Comparison.GetYaxis().CenterTitle() Comparison.GetYaxis().SetTitleSize(0.1) Comparison.GetYaxis().SetTitleOffset(0.5) Comparison.GetXaxis().SetTitleSize(0.15) Comparison.GetYaxis().SetLabelSize(0.1) Comparison.GetXaxis().SetLabelSize(0.15) if makeRatioPlots: RatioYRange = 1.15 if arguments.ratioYRange: RatioYRange = float(arguments.ratioYRange) Comparison.GetYaxis().SetRangeUser(-1 * RatioYRange, RatioYRange) elif makeDiffPlots: YMax = Comparison.GetMaximum() YMin = Comparison.GetMinimum() if YMax <= 0 and YMin <= 0: Comparison.GetYaxis().SetRangeUser(-1.2 * YMin, 0) elif YMax >= 0 and YMin >= 0: Comparison.GetYaxis().SetRangeUser(0, 1.2 * YMax) else: #axis crosses y=0 if abs(YMax) > abs(YMin): Comparison.GetYaxis().SetRangeUser(-1.2 * YMax, 1.2 * YMax) else: Comparison.GetYaxis().SetRangeUser(-1.2 * YMin, 1.2 * YMin) Comparison.GetYaxis().SetNdivisions(205) Comparison.Draw("E0") outputFile.cd() Canvas.Write() if arguments.savePDFs: Canvas.SaveAs("efficiency_histograms_pdfs/" + histogramName + ".pdf")
def MakeOneDHist(histogramDirectory, histogramName,integrateDir): if arguments.verbose: print "Creating histogram", histogramName, "in directory", histogramDirectory HeaderLabel = TPaveLabel(header_x_left,header_y_bottom,header_x_right,header_y_top,HeaderText,"NDC") HeaderLabel.SetTextAlign(32) HeaderLabel.SetTextFont(42) HeaderLabel.SetTextSize(0.697674) HeaderLabel.SetBorderSize(0) HeaderLabel.SetFillColor(0) HeaderLabel.SetFillStyle(0) CMSLabel = TPaveLabel(header_x_left,header_y_bottom,header_x_right,header_y_top,HeaderText,"NDC") CMSLabel.SetTextAlign(32) CMSLabel.SetTextFont(42) CMSLabel.SetTextSize(0.697674) CMSLabel.SetBorderSize(0) CMSLabel.SetFillColor(0) CMSLabel.SetFillStyle(0) if makeFancy: LumiLabel = TPaveLabel(topLeft_x_left,topLeft_y_bottom,topLeft_x_right,topLeft_y_top,"CMS Preliminary","NDC") LumiLabel.SetTextFont(62) LumiLabel.SetTextSize(0.7) LumiLabel.SetTextAlign(12) else: LumiLabel = TPaveLabel(topLeft_x_left,topLeft_y_bottom,topLeft_x_right,topLeft_y_top,LumiText,"NDC") LumiLabel.SetTextAlign(32) LumiLabel.SetTextFont(42) LumiLabel.SetBorderSize(0) LumiLabel.SetFillColor(0) LumiLabel.SetFillStyle(0) Legend = TLegend() Legend.SetBorderSize(0) Legend.SetFillColor(0) Legend.SetFillStyle(0) canvasName = histogramName if integrateDir is "left": canvasName += "_CumulativeLeft" elif integrateDir is "right": canvasName += "_CumulativeRight" Canvas = TCanvas(canvasName) Histograms = [] RefIndex = -99 LegendEntries = [] colorIndex = 0 markerStyleIndex = 0 fillIndex = 0 for source in input_sources: # loop over different input sources in config file dataset_file = "condor/%s/%s.root" % (source['condor_dir'],source['dataset']) inputFile = TFile(dataset_file) if arguments.generic: if histogramDirectory == "": histPath = histogramName else: histPath = histogramDirectory + "/" + histogramName HistogramObj = inputFile.Get(histPath) else: HistogramObj = inputFile.Get(source['channel'] + "Plotter/" + histogramDirectory + "/" + histogramName) if not HistogramObj: print "WARNING: Could not find histogram " + source['channel'] + "/" + histogramName + " in file " + dataset_file + ". Will skip it and continue." return Histogram = HistogramObj.Clone() Histogram.SetDirectory(0) inputFile.Close() Histogram.Sumw2() if arguments.verbose: print " Got histogram", Histogram.GetName(), "from file", dataset_file if arguments.rebinFactor: RebinFactor = int(arguments.rebinFactor) #don't rebin histograms which will have less than 5 bins or any gen-matching histograms if Histogram.GetNbinsX() >= RebinFactor*5 and Histogram.GetTitle().find("GenMatch") is -1: Histogram.Rebin(RebinFactor) # correct bin contents of object multiplcity plots if Histogram.GetName().startswith("num") and "PV" not in Histogram.GetName(): # include overflow bin for bin in range(2,Histogram.GetNbinsX()+2): content = Histogram.GetBinContent(bin) Histogram.SetBinContent(bin, content/float(bin-1)) xAxisLabel = Histogram.GetXaxis().GetTitle() unitBeginIndex = xAxisLabel.find("[") unitEndIndex = xAxisLabel.find("]") xAxisLabelVar = xAxisLabel if "_pfx" in Histogram.GetName() or "_pfy" in Histogram.GetName() or "_sigma" in Histogram.GetName(): yAxisLabel = Histogram.GetYaxis().GetTitle() else: if unitBeginIndex is not -1 and unitEndIndex is not -1: #x axis has a unit yAxisLabel = "Entries / " + str(Histogram.GetXaxis().GetBinWidth(1)) + " " + xAxisLabel[unitBeginIndex+1:unitEndIndex] xAxisLabelVar = xAxisLabel[0:unitBeginIndex] else: yAxisLabel = "Entries per bin (" + str(Histogram.GetXaxis().GetBinWidth(1)) + " width)" if arguments.normalizeToUnitArea: yAxisLabel = yAxisLabel + " (Unit Area Norm.)" if arguments.normalizeToUnitArea and arguments.makeSignificancePlots: unit = "Efficiency" else: unit = "Yield" if integrateDir is "left": yAxisLabel = unit + ", " + xAxisLabelVar + "< x (" + str(Histogram.GetXaxis().GetBinWidth(1)) + " bin width)" if integrateDir is "right": yAxisLabel = unit + ", " + xAxisLabelVar + "> x (" + str(Histogram.GetXaxis().GetBinWidth(1)) + " bin width)" nbins = Histogram.GetNbinsX() if not noOverFlow: Histogram.SetBinContent(nbins, Histogram.GetBinContent(nbins) + Histogram.GetBinContent(nbins+1)) # Add overflow Histogram.SetBinError(nbins, math.sqrt(math.pow(Histogram.GetBinError(nbins),2) + math.pow(Histogram.GetBinError(nbins+1),2))) # Set the errors to be the sum in quadrature if not noUnderFlow: Histogram.SetBinContent(1, Histogram.GetBinContent(1) + Histogram.GetBinContent(0)) # Add underflow Histogram.SetBinError(1, math.sqrt(math.pow(Histogram.GetBinError(1), 2) + math.pow(Histogram.GetBinError(0), 2))) # Set the errors to be the sum in quadrature if not arguments.makeFancy and not arguments.generic: fullTitle = Histogram.GetTitle() splitTitle = fullTitle.split(":") if len(splitTitle) > 1: histoTitle = splitTitle[1].lstrip(" ") else: histoTitle = splitTitle[0] else: histoTitle = "" if 'color' in source: Histogram.SetMarkerColor(colors[source['color']]) Histogram.SetLineColor(colors[source['color']]) else: Histogram.SetMarkerColor(colors[colorList[colorIndex]]) Histogram.SetLineColor(colors[colorList[colorIndex]]) colorIndex = colorIndex + 1 if colorIndex is len(colorList): colorIndex = 0 markerStyleIndex = markerStyleIndex + 1 if markerStyleIndex is len(markerStyleList): markerStyleIndex = 0 fillIndex = fillIndex + 1 if 'scale' in source: Histogram.Scale(source['scale']) markerStyle = 20 if 'marker' in source: markerStyle = markers[source['marker']] else: markerStyle = markers[markerStyleList[markerStyleIndex]] fillStyle = 0 if 'fill' in source: markerStyle = markerStyle + fills[source['fill']] else: markerStyle = markerStyle + fills[fillList[fillIndex]] Histogram.SetMarkerStyle(markerStyle) Histogram.SetMarkerSize(0.5) Histogram.SetLineWidth(line_width) Histogram.SetFillStyle(0) if arguments.normalizeToUnitArea and Histogram.Integral() > 0: Histogram.Scale(1./Histogram.Integral()) Histogram = MakeIntegralHist(Histogram, integrateDir) LegendEntries.append(source['legend_entry']) Histograms.append(Histogram) if 'reference' in source: if source['reference']: RefIndex = len(Histograms)-1 ### formatting histograms and adding to legend legendIndex = 0 for histogram in Histograms: Legend.AddEntry(histogram,LegendEntries[legendIndex],"LEP") # Legend.AddEntry(histogram,LegendEntries[legendIndex],"P") legendIndex = legendIndex+1 ### finding the maximum value of anything going on the canvas, so we know how to set the y-axis finalMax = 0 for histogram in Histograms: currentMax = histogram.GetMaximum() + histogram.GetBinError(histogram.GetMaximumBin()) if(currentMax > finalMax): finalMax = currentMax finalMax = 1.5*finalMax if arguments.setYMax: finalMax = float(arguments.setYMax) ### Drawing histograms to canvas makeRatioPlots = arguments.makeRatioPlots makeDiffPlots = arguments.makeDiffPlots addOneToRatio = -1 if arguments.addOneToRatio: addOneToRatio = arguments.addOneToRatio yAxisMin = 0.0001 if arguments.setYMin: yAxisMin = float(arguments.setYMin) if makeRatioPlots or makeDiffPlots: Canvas.SetFillStyle(0) Canvas.Divide(1,2) Canvas.cd(1) gPad.SetPad(0,0.25,1,1) gPad.SetMargin(0.15,0.05,0.01,0.07) gPad.SetFillStyle(0) gPad.Update() gPad.Draw() if arguments.setLogY: gPad.SetLogy() Canvas.cd(2) gPad.SetPad(0,0,1,0.25) #format: gPad.SetMargin(l,r,b,t) gPad.SetMargin(0.15,0.05,0.4,0.01) gPad.SetFillStyle(0) gPad.SetGridy(1) gPad.Update() gPad.Draw() Canvas.cd(1) histCounter = 0 plotting_options = "" if arguments.generic: plotting_options = "p,e" if arguments.plot_hist: plotting_options = "HIST" for histogram in Histograms: histogram.SetTitle(histoTitle) if arguments.verbose: print " Drawing hist " + histogram.GetName() + ", with plotting_options = " + plotting_options + ", with mean = " + str(histogram.GetMean()) + ", with color = " + str(histogram.GetLineColor()) histogram.Draw(plotting_options) histogram.GetXaxis().SetTitle(xAxisLabel) histogram.GetYaxis().SetTitle(yAxisLabel) histogram.SetMaximum(finalMax) if "_pfx" not in Histogram.GetName() and "_pfy" not in Histogram.GetName() and "_sigma" not in Histogram.GetName(): histogram.SetMinimum(yAxisMin) if makeRatioPlots or makeDiffPlots: histogram.GetXaxis().SetLabelSize(0) if histCounter is 0: plotting_options = plotting_options + " SAME" histCounter = histCounter + 1 #legend coordinates, empirically determined :-) x_left = 0.1677852 x_right = 0.9647651 y_min = 0.6765734 y_max = 0.9 Legend.SetX1NDC(x_left) Legend.SetY1NDC(y_min) Legend.SetX2NDC(x_right) Legend.SetY2NDC(y_max) Legend.Draw() # Deciding which text labels to draw and drawing them if arguments.makeFancy: HeaderLabel.Draw() LumiLabel.Draw() #drawing the ratio or difference plot if requested if makeRatioPlots or makeDiffPlots: Comparisons = [] Canvas.cd(2) if RefIndex == -99: Reference = Histograms[0] else: Reference = Histograms[RefIndex] for Histogram in Histograms: if Histogram is Reference: continue if makeRatioPlots: makeRatio = functools.partial (ratioHistogram,Histogram, Reference) if arguments.ratioRelErrMax is not -1: # it gets initialized to this dummy value of -1 makeRatio = functools.partial (makeRatio, relErrMax = float(arguments.ratioRelErrMax)) if addOneToRatio != -1: # it gets initialized to this dummy value of -1 makeRatio = functools.partial (makeRatio, addOne = bool (addOneToRatio)) Comparison = makeRatio() elif makeDiffPlots: Comparison = Reference.Clone("diff") Comparison.Add(Histograms[1],-1) Comparison.SetTitle("") Comparison.GetYaxis().SetTitle("X-ref") Comparison.SetLineColor(Histogram.GetLineColor()) Comparison.SetFillColor(Histogram.GetFillColor()) Comparison.SetFillStyle(Histogram.GetFillStyle()) Comparison.SetMarkerColor(Histogram.GetMarkerColor()) Comparison.SetMarkerStyle(Histogram.GetMarkerStyle()) Comparison.GetXaxis().SetTitle(xAxisLabel) Comparison.GetYaxis().CenterTitle() Comparison.GetYaxis().SetTitleSize(0.1) Comparison.GetYaxis().SetTitleOffset(0.5) Comparison.GetXaxis().SetTitleSize(0.15) Comparison.GetYaxis().SetLabelSize(0.1) Comparison.GetXaxis().SetLabelSize(0.15) if makeRatioPlots: RatioYRange = 1.15 if arguments.ratioYRange: RatioYRange = float(arguments.ratioYRange) if addOneToRatio == -1: # it gets initialized to this dummy value of -1 Comparison.GetYaxis().SetRangeUser(-1*RatioYRange, RatioYRange) else: Comparison.GetYaxis().SetRangeUser(-1*RatioYRange + 1.0, RatioYRange + 1.0) elif makeDiffPlots: YMax = Comparison.GetMaximum() YMin = Comparison.GetMinimum() if YMax <= 0 and YMin <= 0: Comparison.GetYaxis().SetRangeUser(-1.2*YMin,0) elif YMax >= 0 and YMin >= 0: Comparison.GetYaxis().SetRangeUser(0,1.2*YMax) else: #axis crosses y=0 if abs(YMax) > abs(YMin): Comparison.GetYaxis().SetRangeUser(-1.2*YMax,1.2*YMax) else: Comparison.GetYaxis().SetRangeUser(-1.2*YMin,1.2*YMin) Comparison.GetYaxis().SetNdivisions(205) Comparisons.append(Comparison) option = "E0" for index,Comparison in enumerate(Comparisons): if index == 0: option += " SAME" Comparison.Draw(option) outputFile.cd(histogramDirectory) Canvas.Write() if arguments.verbose: print " Finished writing canvas: ", Canvas.GetName() if arguments.savePDFs: Canvas.SaveAs("comparison_histograms_pdfs/"+histogramName+".pdf")
def MakeOneHist(varXaxis, varConst, xvalues, constval): if len(xvalues)<=1: return # Do not make plot if there is only 1 xvalue Legend = TLegend() Legend.SetBorderSize(0) Legend.SetFillColor(0) Legend.SetFillStyle(0) Canvas = TCanvas("sigEff_"+varConst+str(constval)+"_vs_"+varXaxis) Histograms = [] LegendEntries = [] colorIndex = 0 for source in input_sources: # loop over different input sources in config file # print "Debug: running over input_source from: ", source['condor_dir'], " for varXaxis=", varXaxis, ", varConst=", varConst # Create histogram of efficiencies with appropriate binning xAxisBins = array('d') xBinWidth = xvalues[1] - xvalues[0] for xval in xvalues: xAxisBins.append(xval - xBinWidth/2.0) xAxisBins.append(xvalues[-1] + xBinWidth/2.0) # add an extra bin boundary for the last bin. Histogram = TH1F("Histogram", ";x title;signal efficiency", len(xvalues), xAxisBins) Histogram.SetDirectory(0) # Now fill the histogram of efficiencies: for xval in xvalues: if varXaxis=="mass" and varConst=="lifetime": mass = xval lifetime = constval elif varXaxis=="lifetime" and varConst=="mass": lifetime = xval mass = constval else: print "Unrecognized value of varXaxis=", varXaxis return dataset_file = "condor/%s/%s.root" % (source['condor_dir'],dataset) dataset_file = dataset_file.replace("MASS", str(mass)) dataset_file = dataset_file.replace("LIFETIME", str(lifetime)) inputFile = TFile(dataset_file) HistCutflow = inputFile.Get("OSUAnalysis/" + source['channel'] + "CutFlow") if not HistCutflow: print "WARNING: Could not find histogram OSUAnalysis/" + source['channel'] + "CutFlow in file " + dataset_file + ". Will skip it and continue." return # calculate efficiency nbinsCutflow = HistCutflow.GetNbinsX() if arguments.xsecFile: xsec = float(signal_cross_sections[str(mass)]['value']) denom = xsec * intLumi else: denom = HistCutflow.GetBinContent(1) # denominator is the first entry in the cutflow histogram eff = HistCutflow.GetBinContent(nbinsCutflow) / denom effErr = HistCutflow.GetBinError (nbinsCutflow) / denom ibin = Histogram.FindBin(xval) Histogram.SetBinContent(ibin, eff) Histogram.SetBinError (ibin, effErr) print "Setting bin content for varConst = ", varConst, " = ", constval, " in ibin=", ibin, ", xval=", xval, ", eff=", eff, " +- ", effErr, ", fractional error =", effErr/eff, " numerator = ", HistCutflow.GetBinContent(nbinsCutflow), " denom = ", denom, " from file: ", dataset_file inputFile.Close() if varXaxis=="mass": xAxisLabel = "chargino mass [GeV]" elif varXaxis=="lifetime": xAxisLabel = "chargino c#tau [cm]" else: print "Unrecognized value of varXaxis=", varXaxis return yAxisLabel = "efficiency" if 'color' in source: Histogram.SetMarkerColor(colors[source['color']]) Histogram.SetLineColor(colors[source['color']]) else: Histogram.SetMarkerColor(colors[colorList[colorIndex]]) Histogram.SetLineColor(colors[colorList[colorIndex]]) colorIndex = colorIndex + 1 if colorIndex is len(colorList): colorIndex = 0 markerStyle = 20 if 'marker' in source: markerStyle = markers[source['marker']] if 'fill' in source: markerStyle = markerStyle + fills[source['fill']] Histogram.SetMarkerStyle(markerStyle) Histogram.SetMarkerSize(1) # Histogram.SetLineWidth(line_width) Histogram.SetFillStyle(0) LegendEntries.append(source['legend_entry']) Histograms.append(Histogram) # Finish loop over input_sources # formatting histograms and adding to legend legendIndex = 0 for histogram in Histograms: # print "Adding entry to legend: ", LegendEntries[legendIndex] # Legend.AddEntry(histogram,LegendEntries[legendIndex],"LEP") Legend.AddEntry(histogram,LegendEntries[legendIndex],"P") legendIndex = legendIndex+1 # finding the maximum value of anything going on the canvas, so we know how to set the y-axis finalMax = 0 for histogram in Histograms: # currentMax = histogram.GetMaximum() + histogram.GetBinError(histogram.GetMaximumBin()) currentMax = histogram.GetMaximum() if(currentMax > finalMax): finalMax = currentMax finalMax = 1.5*finalMax if finalMax is 0: finalMax = 1 ## if arguments.setYMax: ## finalMax = float(arguments.setYMax) # Drawing histograms to canvas makeRatioPlots = arguments.makeRatioPlots makeDiffPlots = arguments.makeDiffPlots yAxisMin = 0.0 ## if arguments.setYMin: ## yAxisMin = float(arguments.setYMin) if makeRatioPlots or makeDiffPlots: Canvas.SetFillStyle(0) Canvas.Divide(1,2) Canvas.cd(1) gPad.SetPad(0,0.25,1,1) gPad.SetMargin(0.15,0.05,0.01,0.07) gPad.SetFillStyle(0) gPad.Update() gPad.Draw() ## if arguments.setLogY: ## gPad.SetLogy() Canvas.cd(2) gPad.SetPad(0,0,1,0.25) #format: gPad.SetMargin(l,r,b,t) gPad.SetMargin(0.15,0.05,0.4,0.01) gPad.SetFillStyle(0) gPad.SetGridy(1) gPad.Update() gPad.Draw() Canvas.cd(1) histCounter = 0 plotting_options = "pe, x0" # x0 suppresses the error bar along x ## if arguments.plot_hist: ## plotting_options = "HIST" for histogram in Histograms: # histogram.SetTitle(histoTitle) histogram.Draw(plotting_options) histogram.GetXaxis().SetTitle(xAxisLabel) histogram.GetYaxis().SetTitle(yAxisLabel) if histogram.InheritsFrom("TH1"): histogram.SetMaximum(finalMax) histogram.SetMinimum(yAxisMin) if makeRatioPlots or makeDiffPlots: histogram.GetXaxis().SetLabelSize(0) if histCounter is 0: if histogram.InheritsFrom("TH1"): plotting_options = plotting_options + " SAME" elif histogram.InheritsFrom("TGraph"): plotting_options = "P" histCounter = histCounter + 1 x_left = 0.15 x_right = 0.55 y_min = 0.6 y_max = 0.8 Legend.SetX1NDC(x_left) Legend.SetY1NDC(y_min) Legend.SetX2NDC(x_right) Legend.SetY2NDC(y_max) Legend.Draw() customText = "chargino " + varConst + " " + str(constval) if varConst == "mass": customText += " GeV" elif varConst == "lifetime": customText += " cm" customText = customText.replace("lifetime", "c#tau") CustomLabel = TPaveLabel(x_left, 0.8, x_right, 0.9, customText, "NDC") CustomLabel.SetBorderSize(0) CustomLabel.SetFillColor(0) CustomLabel.SetFillStyle(0) CustomLabel.Draw() #drawing the ratio or difference plot if requested if makeRatioPlots or makeDiffPlots: Canvas.cd(2) if makeRatioPlots: # Comparison = ratioHistogram(Histograms[0],Histograms[1], 1000) Comparison = Histograms[0].Clone() Comparison.Divide(Histograms[1]) Comparison.GetYaxis().SetTitle("ratio") elif makeDiffPlots: Comparison = Histograms[0].Clone("diff") Comparison.Add(Histograms[1],-1) Comparison.SetTitle("") Comparison.GetYaxis().SetTitle("hist1-hist2") Comparison.GetXaxis().SetTitle(xAxisLabel) Comparison.GetYaxis().CenterTitle() Comparison.GetYaxis().SetTitleSize(0.1) Comparison.GetYaxis().SetTitleOffset(0.5) Comparison.GetXaxis().SetTitleSize(0.15) Comparison.GetYaxis().SetLabelSize(0.1) Comparison.GetXaxis().SetLabelSize(0.15) if makeRatioPlots: # RatioYRange = 1.15 if arguments.ratioYRange: RatioYRange = float(arguments.ratioYRange) Comparison.GetYaxis().SetRangeUser(0.7, 1.3) elif makeDiffPlots: YMax = Comparison.GetMaximum() YMin = Comparison.GetMinimum() if YMax <= 0 and YMin <= 0: Comparison.GetYaxis().SetRangeUser(-1.2*YMin,0) elif YMax >= 0 and YMin >= 0: Comparison.GetYaxis().SetRangeUser(0,1.2*YMax) else: #axis crosses y=0 if abs(YMax) > abs(YMin): Comparison.GetYaxis().SetRangeUser(-1.2*YMax,1.2*YMax) else: Comparison.GetYaxis().SetRangeUser(-1.2*YMin,1.2*YMin) Comparison.GetYaxis().SetNdivisions(205) # Comparison.Draw("E0") Comparison.Draw("PE, X0") # X0 suppresses error bar in x direction outputFile.cd() Canvas.Write() if arguments.savePDFs: Canvas.SaveAs("efficiency_histograms_pdfs/"+histogramName+".pdf")
def MCSPlot(self, pname): #print self.fname f = TFile(self.fname) self.RMS = {} self.RMSErr = {} self.Chi2 = {} self.RMSsysdiff = {} self.RMSsyserr = {} # create a plot for each histvarname for histvar in self.histvarnames: self.RMS[histvar] = {} self.RMSErr[histvar] = {} self.RMSsysdiff[histvar] = {} self.RMSsyserr[histvar] = {} self.Chi2[histvar] = {} names = [histvar + '_' + x for x in self.histstatenames] print names hists = [f.Get(histvar + '_' + x) for x in self.histstatenames] print hists[0] hists[0].SetTitle("") # hists[3].Scale(norm) # self.formatHist(hist[0], 0) resplots = [x.Clone() for x in hists] resplots[0].SetTitle('') resplots[0].GetYaxis().SetTitle("Normalized Residuals") # if histvar == 'thetaScatt': leg = TLegend(0.55, 0.73, 0.89, 0.92) leg.SetLineColor(10) # else: # leg = TLegend(0.35,0.2,0.65,0.5) for i in range(len(self.histstatedesc)): hists[i].Sumw2() if histvar == 'theta2Scatt': hists[i].Rebin(8) resplots[i].Rebin(8) elif histvar == 'thetaScatt': hists[i].Rebin(1) resplots[i].Rebin(1) else: hists[i].Rebin(1) resplots[i].Rebin(1) self.formatHists(hists[i], i) self.formatHists(resplots[i], i) self.addToRMS(i, hists[i], hists[0], resplots[i], histvar) if histvar == 'theta2Scatt': hists[i].GetYaxis().SetTitle('Probability per ' + str( round(1000 * 1000 * hists[i].GetXaxis().GetBinWidth(4), 2)) + ' mrad^{2}') else: hists[i].GetYaxis().SetTitle('Probability per ' + str( round(1000 * hists[i].GetXaxis().GetBinWidth(4), 2)) + ' mrad') leg.AddEntry(hists[i], self.histstatedesc[i], self.histopts[i]) #print hists[0] self.calculateChi2(i, hists[i], hists[0], resplots[i], histvar, pname) c = TCanvas(self.fname[:-5] + '_' + histvar + '_c1') if self.desc[0] == 'XePion': t1 = TText(0.18, 0.885, "MICE ISIS cycle 2015/03") t2 = TText(0.18, 0.85, "Xe, " + self.desc[1][2:5] + ", MAUS v3.1.2") else: t1 = TText(0.18, 0.885, "MICE ISIS cycle 2015/04") t2 = TText(0.18, 0.85, "LiH, " + self.desc[1][2:5] + ", MAUS v3.1.2") t1.SetNDC(1) t1.SetTextSize(0.04) t1.SetTextFont(42) t2.SetNDC(1) t2.SetTextSize(0.03) t2.SetTextFont(42) hists[0].GetYaxis().SetRangeUser(4e-4, 2.0) hists[0].SetTitle(";" + hists[0].GetXaxis().GetTitle() + " (radians);" + hists[0].GetYaxis().GetTitle()) hists[0].Draw('ep') c.SetBottomMargin(0.15) c.SetTopMargin(0.075) for h in hists[1:len(self.histstatedesc)]: h.Draw('epsame') leg.SetTextSize(0.04) leg.Draw('same') t1.Draw() t2.Draw() c.SetLogy() c.SaveAs(pname + '_' + self.fname[:-5] + '_' + histvar + '_sys.eps') c.SaveAs(pname + '_' + self.fname[:-5] + '_' + histvar + '_sys.root') c.SaveAs(pname + '_' + self.fname[:-5] + '_' + histvar + '_sys_pq.jpg') c.Clear() c.SetLogy(0) resplots[0].GetYaxis().SetRangeUser(-2, 2) resplots[0].SetTitle(";" + resplots[0].GetXaxis().GetTitle() + " (radians);" + resplots[0].GetYaxis().GetTitle()) leg.SetX1NDC(0.5) leg.SetX2NDC(0.89) leg.SetY1NDC(0.2) leg.SetY2NDC(0.4) resplots[0].Draw("p") for r in resplots: r.Draw('psame') leg.SetTextSize(0.04) leg.Draw('same') t1.Draw() t2.Draw() # pblock.Draw() c.SaveAs(pname + '_' + self.fname[:-5] + '_' + histvar + '_sys_res_T.eps') c.SaveAs(pname + '_' + self.fname[:-5] + '_' + histvar + '_sys_res_pq.jpg') momhist = f.Get("cor_mom") #mom = [momhist.GetMean() + 19.468, momhist.GetMeanError()] #if self.fname.find("LiHMuon_03172") >= 0: # mom = [momhist.GetMean()*1.107 + 1.05, momhist.GetMeanError()] #elif self.fname.find("LiHMuon_03200") >= 0: # mom = [momhist.GetMean()*1.104 + 1.139, momhist.GetMeanError()] #elif self.fname.find("LiHMuon_03240") >= 0: # mom = [momhist.GetMean()*1.17 - 9.41, momhist.GetMeanError()] if self.fname.find("LiHMuon_03172") >= 0: mom = [momhist.GetMean(), momhist.GetMeanError()] elif self.fname.find("LiHMuon_03200") >= 0: mom = [momhist.GetMean(), momhist.GetMeanError()] elif self.fname.find("LiHMuon_03240") >= 0: mom = [momhist.GetMean(), momhist.GetMeanError()] rms = [momhist.GetRMS(), momhist.GetRMSError()] summary = [] syssummary = [] def sigfig(x): if math.fabs(x) > 1e-5: return int(math.ceil(math.fabs(math.log(math.fabs(x), 10)))) else: return 1 # syssummary.append("p (MeV/c) & "+self.histvarnames[0]+"&"+self.histvarnames[1]+"&"+self.histvarnames[3]+"\\\\") if pname != "Truth": for sys in self.sysFiles: # if sys[3] == 'Material': stindx = 1 # else: stindx = 0 # print sys[3], self.histstatenames[stindx] difference0 = self.RMSsysdiff[self.histvarnames[0]][ self.histstatenames[stindx]][sys[3]] difference1 = self.RMSsysdiff[self.histvarnames[1]][ self.histstatenames[stindx]][sys[3]] difference3 = self.RMSsysdiff[self.histvarnames[3]][ self.histstatenames[stindx]][sys[3]] syserr0 = self.RMSsyserr[self.histvarnames[0]][ self.histstatenames[stindx]][sys[3]] syserr1 = self.RMSsyserr[self.histvarnames[1]][ self.histstatenames[stindx]][sys[3]] syserr3 = self.RMSsyserr[self.histvarnames[3]][ self.histstatenames[stindx]][sys[3]] relerr0 = syserr0 / self.RMS[self.histvarnames[0]][ self.histstatenames[0]] relerr1 = syserr1 / self.RMS[self.histvarnames[1]][ self.histstatenames[0]] relerr3 = syserr3 / self.RMS[self.histvarnames[3]][ self.histstatenames[0]] syssummary.append(str(round(mom[0],sigfig(mom[1])))+"$\pm$"+str(round(mom[1],sigfig(mom[1])))+\ " & "+str(round(difference0,sigfig(difference0)))+\ " & "+str(round(syserr0,sigfig(syserr0)))+\ " & "+str(round(relerr0,sigfig(relerr0)))+\ " & "+str(round(difference1,sigfig(difference1)))+\ " & "+str(round(syserr1,sigfig(syserr1)))+\ " & "+str(round(relerr1,sigfig(relerr1)))+\ " & "+str(round(difference3,sigfig(difference3)))+\ " & "+str(round(syserr3,sigfig(syserr3)))+\ " & "+str(round(relerr3,sigfig(relerr3)))+"\\\\") # print syssummary[-1] syssummary.append(str(round(mom[0],2))+"$\pm$"+str(round(mom[1],2))+\ " & "+ str(round(rms[0],2))+"$\pm$"+str(round(rms[1],2))+\ " & "+str(round(self.RMSsysdiff[self.histvarnames[0]][self.histstatenames[0]]['Sum'],2))+\ " & "+str(round(self.RMSsyserr[self.histvarnames[0]][self.histstatenames[0]]['Sum'],2))+\ " & "+str(round(self.RMSsyserr[self.histvarnames[0]][self.histstatenames[0]]['Sum']/self.RMS[self.histvarnames[0]][self.histstatenames[0]],2))+\ " & "+str(round(self.RMSsysdiff[self.histvarnames[1]][self.histstatenames[0]]['Sum'],2))+\ " & "+str(round(self.RMSsyserr[self.histvarnames[1]][self.histstatenames[0]]['Sum'],2))+\ " & "+str(round(self.RMSsyserr[self.histvarnames[1]][self.histstatenames[0]]['Sum']/self.RMS[self.histvarnames[1]][self.histstatenames[0]],2))+\ " & "+str(round(self.RMSsysdiff[self.histvarnames[3]][self.histstatenames[0]]['Sum'],2))+ " & "+str(round(self.RMSsyserr[self.histvarnames[3]][self.histstatenames[0]]['Sum'],2))+ " & "+str(round(self.RMSsyserr[self.histvarnames[3]][self.histstatenames[0]]['Sum']/self.RMS[self.histvarnames[2]][self.histstatenames[0]],2))+"\\\\") # summary.append("p (MeV/c) & &"+str(self.histstatenames[0])+" & "+str(self.histstatenames[1])+" & $\chi^{2}$/ndf & "+ # +str(self.histstatenames[2])+" & $\chi^{2}$/ndf \\\\") # print mom, self.RMS, self.RMSErr, self.Chi2 for histvar in self.histvarnames: summary.append(str(round(mom[0],2))+"$\pm$"+str(round(mom[1],2))+\ "& $\ "+histvar+"$ & "+str(round(self.RMS[histvar][self.histstatenames[0]],2))+ \ "$\pm$"+str(round(self.RMSErr[histvar][self.histstatenames[0]],2))+ \ "$\pm$"+str(round(self.RMSsyserr[histvar][self.histstatenames[0]]["Sum"],2))+ \ " & "+str(round(self.RMS[histvar][self.histstatenames[1]],2))+ \ "$\pm$"+str(round(self.RMSErr[histvar][self.histstatenames[1]],2))+ \ # "$\pm$"+str(round(self.RMSsyserr[histvar][self.histstatenames[1]]["Sum"],2))+\ " & "+str(round(self.Chi2[histvar][self.histstatenames[1]][0],1))+ \ " / "+ str(self.Chi2[histvar][self.histstatenames[1]][1])+ \ " & "+str(round(self.RMS[histvar][self.histstatenames[2]],2))+ \ "$\pm$"+str(round(self.RMSErr[histvar][self.histstatenames[2]],2))+ \ #"$\pm$"+str(round(self.RMSsyserr[histvar][self.histstatenames[2]]["Sum"],2))+\ " & "+str(round(self.Chi2[histvar][self.histstatenames[2]][0],1))+ \ " / "+ str(self.Chi2[histvar][self.histstatenames[2]][1]) +"\\\\") # print summary[-1] f.Close() return [summary, syssummary]
def MakeOneDHist(histogramName,integrateDir): HeaderLabel = TPaveLabel(header_x_left,header_y_bottom,header_x_right,header_y_top,HeaderText,"NDC") HeaderLabel.SetTextAlign(32) HeaderLabel.SetBorderSize(0) HeaderLabel.SetFillColor(0) HeaderLabel.SetFillStyle(0) LumiLabel = TPaveLabel(topLeft_x_left,topLeft_y_bottom,topLeft_x_right,topLeft_y_top,LumiText,"NDC") LumiLabel.SetBorderSize(0) LumiLabel.SetFillColor(0) LumiLabel.SetFillStyle(0) NormLabel = TPaveLabel() NormLabel.SetDrawOption("NDC") NormLabel.SetX1NDC(topLeft_x_left) NormLabel.SetX2NDC(topLeft_x_right) NormLabel.SetBorderSize(0) NormLabel.SetFillColor(0) NormLabel.SetFillStyle(0) NormText = "" if arguments.normalizeToUnitArea: NormText = "Scaled to unit area" Legend = TLegend() Legend.SetBorderSize(0) Legend.SetFillColor(0) Legend.SetFillStyle(0) canvasName = histogramName if integrateDir is "left": canvasName += "_CumulativeLeft" elif integrateDir is "right": canvasName += "_CumulativeRight" Canvas = TCanvas(canvasName) Histograms = [] LegendEntries = [] colorIndex = 0 for source in input_sources: # loop over different input sources in config file dataset_file = "condor/%s/%s.root" % (source['condor_dir'],source['dataset']) inputFile = TFile(dataset_file) if arguments.generic: HistogramObj = inputFile.Get(source['channel'] + "/" +histogramName) else: HistogramObj = inputFile.Get("OSUAnalysis/" + source['channel'] + "/" +histogramName) if not HistogramObj: print "WARNING: Could not find histogram " + source['channel'] + "/" + histogramName + " in file " + dataset_file + ". Will skip it and continue." return Histogram = HistogramObj.Clone() Histogram.SetDirectory(0) inputFile.Close() if arguments.rebinFactor: RebinFactor = int(arguments.rebinFactor) #don't rebin histograms which will have less than 5 bins or any gen-matching histograms if Histogram.GetNbinsX() >= RebinFactor*5 and Histogram.GetTitle().find("GenMatch") is -1: Histogram.Rebin(RebinFactor) xAxisLabel = Histogram.GetXaxis().GetTitle() unitBeginIndex = xAxisLabel.find("[") unitEndIndex = xAxisLabel.find("]") xAxisLabelVar = xAxisLabel if unitBeginIndex is not -1 and unitEndIndex is not -1: #x axis has a unit yAxisLabel = "Entries / " + str(Histogram.GetXaxis().GetBinWidth(1)) + " " + xAxisLabel[unitBeginIndex+1:unitEndIndex] xAxisLabelVar = xAxisLabel[0:unitBeginIndex] else: yAxisLabel = "Entries per bin (" + str(Histogram.GetXaxis().GetBinWidth(1)) + " width)" if arguments.normalizeToUnitArea: yAxisLabel = yAxisLabel + " (Unit Area Norm.)" if arguments.normalizeToUnitArea and arguments.makeSignificancePlots: unit = "Efficiency" else: unit = "Yield" if integrateDir is "left": yAxisLabel = unit + ", " + xAxisLabelVar + "< x (" + str(Histogram.GetXaxis().GetBinWidth(1)) + " bin width)" if integrateDir is "right": yAxisLabel = unit + ", " + xAxisLabelVar + "> x (" + str(Histogram.GetXaxis().GetBinWidth(1)) + " bin width)" if not arguments.makeFancy and not arguments.generic: fullTitle = Histogram.GetTitle() splitTitle = fullTitle.split(":") # print splitTitle histoTitle = splitTitle[1].lstrip(" ") else: histoTitle = "" if 'color' in source: Histogram.SetMarkerColor(colors[source['color']]) Histogram.SetLineColor(colors[source['color']]) else: Histogram.SetMarkerColor(colors[colorList[colorIndex]]) Histogram.SetLineColor(colors[colorList[colorIndex]]) colorIndex = colorIndex + 1 if colorIndex is len(colorList): colorIndex = 0 markerStyle = 20 if 'marker' in source: markerStyle = markers[source['marker']] if 'fill' in source: markerStyle = markerStyle + fills[source['fill']] Histogram.SetMarkerStyle(markerStyle) Histogram.SetLineWidth(line_width) Histogram.SetFillStyle(0) if arguments.normalizeToUnitArea and Histogram.Integral() > 0: Histogram.Scale(1./Histogram.Integral()) Histogram = MakeIntegralHist(Histogram, integrateDir) LegendEntries.append(source['legend_entry']) Histograms.append(Histogram) ### formatting histograms and adding to legend legendIndex = 0 for histogram in Histograms: Legend.AddEntry(histogram,LegendEntries[legendIndex],"LEP") legendIndex = legendIndex+1 ### finding the maximum value of anything going on the canvas, so we know how to set the y-axis finalMax = 0 for histogram in Histograms: currentMax = histogram.GetMaximum() + histogram.GetBinError(histogram.GetMaximumBin()) if(currentMax > finalMax): finalMax = currentMax finalMax = 1.5*finalMax if arguments.setYMax: finalMax = float(arguments.setYMax) ### Drawing histograms to canvas makeRatioPlots = arguments.makeRatioPlots makeDiffPlots = arguments.makeDiffPlots #makeSignifPlots = arguments.makeSignificancePlots yAxisMin = 0.0001 if arguments.setYMin: yAxisMin = float(arguments.setYMin) if makeRatioPlots or makeDiffPlots: Canvas.SetFillStyle(0) Canvas.Divide(1,2) Canvas.cd(1) gPad.SetPad(0,0.25,1,1) gPad.SetMargin(0.15,0.05,0.01,0.07) gPad.SetFillStyle(0) gPad.Update() gPad.Draw() if arguments.setLogY: gPad.SetLogy() Canvas.cd(2) gPad.SetPad(0,0,1,0.25) #format: gPad.SetMargin(l,r,b,t) gPad.SetMargin(0.15,0.05,0.4,0.01) gPad.SetFillStyle(0) gPad.SetGridy(1) gPad.Update() gPad.Draw() Canvas.cd(1) histCounter = 0 plotting_options = "" if arguments.generic: plotting_options = "p,e" if arguments.plot_hist: plotting_options = "HIST" for histogram in Histograms: histogram.SetTitle(histoTitle) if arguments.verbose: print "Debug: drawing hist " + histogram.GetName() + ", with plotting_options = " + plotting_options + ", with mean = " + str(histogram.GetMean()) + ", with color = " + str(histogram.GetLineColor()) histogram.Draw(plotting_options) histogram.GetXaxis().SetTitle(xAxisLabel) histogram.GetYaxis().SetTitle(yAxisLabel) histogram.SetMaximum(finalMax) histogram.SetMinimum(yAxisMin) if makeRatioPlots or makeDiffPlots: histogram.GetXaxis().SetLabelSize(0) if histCounter is 0: plotting_options = plotting_options + " SAME" histCounter = histCounter + 1 #legend coordinates, empirically determined :-) x_left = 0.1677852 x_right = 0.9647651 y_min = 0.6765734 y_max = 0.9 Legend.SetX1NDC(x_left) Legend.SetY1NDC(y_min) Legend.SetX2NDC(x_right) Legend.SetY2NDC(y_max) Legend.Draw() # Deciding which text labels to draw and drawing them drawHeaderLabel = False if arguments.makeFancy: drawHeaderLabel = True #now that flags are set, draw the appropriate labels if drawHeaderLabel: HeaderLabel.Draw() #drawing the ratio or difference plot if requested if makeRatioPlots or makeDiffPlots: Canvas.cd(2) if makeRatioPlots: if arguments.ratioRelErrMax: Comparison = ratioHistogram(Histograms[0],Histograms[1],float(arguments.ratioRelErrMax)) else: Comparison = ratioHistogram(Histograms[0],Histograms[1]) elif makeDiffPlots: Comparison = Histograms[0].Clone("diff") Comparison.Add(Histograms[1],-1) Comparison.SetTitle("") Comparison.GetYaxis().SetTitle("hist1-hist2") Comparison.GetXaxis().SetTitle(xAxisLabel) Comparison.GetYaxis().CenterTitle() Comparison.GetYaxis().SetTitleSize(0.1) Comparison.GetYaxis().SetTitleOffset(0.5) Comparison.GetXaxis().SetTitleSize(0.15) Comparison.GetYaxis().SetLabelSize(0.1) Comparison.GetXaxis().SetLabelSize(0.15) if makeRatioPlots: RatioYRange = 1.15 if arguments.ratioYRange: RatioYRange = float(arguments.ratioYRange) Comparison.GetYaxis().SetRangeUser(-1*RatioYRange, RatioYRange) elif makeDiffPlots: YMax = Comparison.GetMaximum() YMin = Comparison.GetMinimum() if YMax <= 0 and YMin <= 0: Comparison.GetYaxis().SetRangeUser(-1.2*YMin,0) elif YMax >= 0 and YMin >= 0: Comparison.GetYaxis().SetRangeUser(0,1.2*YMax) else: #axis crosses y=0 if abs(YMax) > abs(YMin): Comparison.GetYaxis().SetRangeUser(-1.2*YMax,1.2*YMax) else: Comparison.GetYaxis().SetRangeUser(-1.2*YMin,1.2*YMin) Comparison.GetYaxis().SetNdivisions(205) Comparison.Draw("E0") outputFile.cd() Canvas.Write() if arguments.savePDFs: Canvas.SaveAs("comparison_histograms_pdfs/"+histogramName+".pdf")