def plot(NObserved, results, NControl, R, bkgPredict): r.gROOT.SetStyle("Plain") c = r.TCanvas("test") c.SetGrid() nbins = len(NObserved) obs = r.TH1D("obs", "obs", nbins, 0.5, nbins+0.5) pred = r.TH1D("pred", "pred", nbins, 0.5, nbins+0.5) pred2 = r.TH1D("pred2", "pred2", nbins, 0.5, nbins+0.5) for idx, b in enumerate(NObserved): obs.SetBinContent(idx+1, b) if bkgPredict: pred2.SetBinContent(idx+1, R["nominal"][idx]*bkgPredict[0][idx]) pred.SetBinContent(idx+1, results[idx].predicted()) perr = math.sqrt(results[idx].predicted()) serr = R["MCStats"][idx]*NControl[idx] pred.SetBinError(idx+1, math.sqrt(perr**2 + serr**2)) obs.GetXaxis().SetBinLabel(idx+1, utils.formatBin(idx, False)) pred.SetLineColor(r.kRed) pred2.SetLineColor(r.kGreen); obs.GetYaxis().SetRangeUser(0, 1.2*max(obs.GetMaximum(), pred.GetMaximum())) obs.SetStats(r.kFALSE) obs.Draw("hist") if bkgPredict: pred2.Draw("hist e same") pred.Draw("hist e same") leg = makeLegend() leg.AddEntry(pred, "Predicted", "L") if bkgPredict: leg.AddEntry(pred2, "Predicted (QCD Fit)", "L") leg.AddEntry(obs, "Observed", "L") leg.Draw() c.SaveAs("limit/%s_pred_obs.pdf" % channel.name)
# Load MC pseudo-data in bins data = utils.getZeroMC(channel, ctrl_channel) # This also calculates statistical uncertainties results = utils.makePredictions(data) # Get the scaled/smeared systematic variations systs = utils.getLiterallyAllSystematicsBkg(channel, ctrl_channel) # Loop through systematics and calculate systematic uncertainty for name, scaled in systs: utils.addSystematic(name, data, results, scaled) print name # LaTeX table l = Table() cols = [("value", "Bin", "l")] + [("bin%d" % i, utils.formatBin(i), "c") for i in range(len(bins))] l.defineColumns(cols) def fields(f): return dict([("bin%d" % idx, f(idx)) for idx in range(len(bins))]) l.addRowFields(value = "Events Predicted", **fields(lambda idx : "%.1f" % results[idx].predicted())) l.addRowFields(value = "Events Observed", **fields(lambda idx : "%.1f" % results[idx].observed())) l.addRowFields(value = "$N_{\\textrm{signal}}/N_{\\textrm{control}}$", **fields(lambda idx : "%.2f" % data[idx].R())) l.addHLine() l.addRowFields(value = "Statistical Uncertainty (\%)", **fields(lambda idx : "%.2f" % (results[idx].statErrorValue(0)*100/results[idx].predicted()))) l.addHLine() l.addRowFields(value = "Systematic Uncertainty (\%)", **fields( lambda idx : "%.2f" % (math.sqrt(results[idx].totalSystError()**2 +