def getEfficiency(datasets, numerator="Numerator", denominator="Denominator"): # statOption = ROOT.TEfficiency.kFNormal statOption = ROOT.TEfficiency.kFCP # Clopper-Pearson # statOption = ROOT.TEfficiency.kFFC # Feldman-Cousins first = True isData = False teff = ROOT.TEfficiency() for dataset in datasets: n = dataset.getDatasetRootHisto(numerator).getHistogram() d = dataset.getDatasetRootHisto(denominator).getHistogram() if d.GetEntries() == 0: continue checkNegatives(n, d) # removeNegatives(n) # removeNegatives(d) print dataset.getName(), "entries", n.GetEntries(), d.GetEntries() print " bins", n.GetNbinsX(), d.GetNbinsX() print " lowedge", n.GetBinLowEdge(1), d.GetBinLowEdge(1) eff = ROOT.TEfficiency(n, d) eff.SetStatisticOption(statOption) weight = 1 if dataset.isMC(): weight = dataset.getCrossSection() / d.GetEntries() for i in range(1, d.GetNbinsX() + 1): print " bin", i, d.GetBinLowEdge(i), n.GetBinContent( i), d.GetBinContent(i) eff.SetWeight(weight) if first: teff = eff if dataset.isData(): tn = n td = d first = False else: teff.Add(eff) if dataset.isData(): tn.Add(n) td.Add(d) if isData: teff = ROOT.TEfficiency(tn, td) teff.SetStatisticOption(self.statOption) return teff
def getEfficiency(datasets,numerator="Numerator",denominator="Denominator"): # statOption = ROOT.TEfficiency.kFNormal statOption = ROOT.TEfficiency.kFCP # Clopper-Pearson # statOption = ROOT.TEfficiency.kFFC # Feldman-Cousins first = True isData = False teff = ROOT.TEfficiency() for dataset in datasets: n = dataset.getDatasetRootHisto(numerator).getHistogram() d = dataset.getDatasetRootHisto(denominator).getHistogram() if d.GetEntries() == 0: continue checkNegatives(n,d) # removeNegatives(n) # removeNegatives(d) print dataset.getName(),"entries",n.GetEntries(),d.GetEntries() print " bins",n.GetNbinsX(),d.GetNbinsX() print " lowedge",n.GetBinLowEdge(1),d.GetBinLowEdge(1) eff = ROOT.TEfficiency(n,d) eff.SetStatisticOption(statOption) weight = 1 if dataset.isMC(): weight = dataset.getCrossSection()/d.GetEntries() for i in range(1,d.GetNbinsX()+1): print " bin",i,d.GetBinLowEdge(i),n.GetBinContent(i),d.GetBinContent(i) eff.SetWeight(weight) if first: teff = eff if dataset.isData(): tn = n td = d first = False else: teff.Add(eff) if dataset.isData(): tn.Add(n) td.Add(d) if isData: teff = ROOT.TEfficiency(tn, td) teff.SetStatisticOption(self.statOption) return teff
def GetCutEfficiencyHisto(dataset, histoName, statOpt, **kwargs): ''' See https://root.cern.ch/doc/master/classTEfficiency.html ''' HasKeys(["verbose", "normalizeTo", "cutDirection"], **kwargs) verbose = kwargs.get("verbose") normalizeTo = kwargs.get("normalizeTo") cutDirection = kwargs.get("cutDirection") Verbose("Calculating the cut-efficiency (%s) for histo with name %s" % (cutDirection, histoName)) # Choose statistics options statOpts = [ "kFCP", "kFNormal", "KFWilson", "kFAC", "kFFC", "kBJeffrey", "kBUniform", "kBayesian" ] if statOpt not in statOpts: raise Exception( "Invalid statistics option \"%s\". Please choose one from the following:\n\t%s" % (statOpt, "\n\t".join(statOpts))) if statOpt == "kFCP": statOption = ROOT.TEfficiency.kFCP # Clopper-Pearson elif statOpt == "kFNormal": statOption = ROOT.TEfficiency.kFNormal # Normal Approximation elif statOpt == "kFWilson": statOption = ROOT.TEfficiency.kFWilson # Wilson elif statOpt == "kFAC": statOption = ROOT.TEfficiency.kFAC # Agresti-Coull elif statOpt == "kFFC": statOption = ROOT.TEfficiency.kFFC # Feldman-Cousins elif statOpt == "kBJeffrey": statOption = ROOT.TEfficiency.kBJeffrey # Jeffrey elif statOpt == "kBUniform": statOption = ROOT.TEfficiency.kBUniform # Uniform Prior elif statOpt == "kBayesian": statOption = ROOT.TEfficiency.kBayesian # Custom Prior else: raise Exception("This should never be reached") # Declare variables & options first = True isData = False teff = ROOT.TEfficiency() # Get the ROOT histogram rootHisto = dataset.getDatasetRootHisto(histoName) # Normalise the histogram NormalizeRootHisto(datasetsMgr, rootHisto, dataset.isMC(), normalizeTo) #NormalizeRootHisto(datasetsMgr, rootHisto, d.isMC(), normalizeTo) ## Get a clone of the wrapped histogram normalized as requested. h = rootHisto.getHistogram() titleX = h.GetXaxis().GetTitle() binWidth = h.GetXaxis().GetBinWidth(0) titleY = "efficiency (%s) / %s" % (cutDirection, GetBinwidthDecimals(binWidth) % (binWidth)) # If empty return if h.GetEntries() == 0: return # Create the numerator/denominator histograms numerator = h.Clone("Numerator") denominator = h.Clone("Denominator") # Reset the numerator/denominator histograms numerator.Reset() denominator.Reset() # Calculate the instances passing a given cut (all bins) nBinsX = h.GetNbinsX() + 1 for iBin in range(1, nBinsX): nTotal = h.Integral(0, nBinsX) if cutDirection == ">": nPass = h.Integral(iBin + 1, nBinsX) elif cutDirection == "<": nPass = nTotal - h.Integral(iBin + 1, nBinsX) else: raise Exception( "Invalid cut direction \"%s\". Please choose either \">\" or \"<\"" % (cutDirection)) # Sanity check if nPass < 0: nPass = 0 # Fill the numerator/denominator histograms # print "iBin = %s, nPass = %s, nTotal = %s" % (iBin, nPass, nTotal) numerator.SetBinContent(iBin, nPass) numerator.SetBinError(iBin, math.sqrt(nPass) / 10) # denominator.SetBinContent(iBin, nTotal) denominator.SetBinError(iBin, math.sqrt(nTotal) / 10) # Check for negative values CheckNegatives(numerator, denominator) # Create TEfficiency object using the two histos eff = ROOT.TEfficiency(numerator, denominator) eff.SetStatisticOption(statOption) Verbose("The statistic option was set to %s" % (eff.GetStatisticOption())) # Save info in a table (debugging) table = [] hLine = "=" * 70 msgAlign = '{:<5} {:<20} {:<20} {:<20}' title = msgAlign.format("Bin", "Efficiency", "Error-Low", "Error-Up") table.append("\n" + hLine) table.append(title) table.append(hLine) for iBin in range(1, nBinsX): e = eff.GetEfficiency(iBin) errLow = eff.GetEfficiencyErrorLow(iBin) errUp = eff.GetEfficiencyErrorUp(iBin) values = msgAlign.format(iBin, e, errLow, errUp) table.append(values) table.append(hLine) # Verbose mode if verbose: for l in table: print l weight = 1 if dataset.isMC(): weight = dataset.getCrossSection() eff.SetWeight(weight) if first: teff = eff if dataset.isData(): tn = numerator td = denominator first = False else: teff.Add(eff) if dataset.isData(): tn.Add(numerator) td.Add(denominator) if isData: teff = ROOT.TEfficiency(tn, td) teff.SetStatisticOption(self.statOption) style = styleDict[dataset.getName()] return Convert2TGraph(teff, dataset, style, titleX, titleY)
def GetCutEfficiencyHisto(dataset, histoName, statOpt, **kwargs): ''' See https://root.cern.ch/doc/master/classTEfficiency.html ''' HasKeys(["verbose", "normalizeTo", "cutDirection"], **kwargs) verbose = kwargs.get("verbose") normalizeTo = kwargs.get("normalizeTo") cutDirection= kwargs.get("cutDirection") Verbose("Calculating the cut-efficiency (%s) for histo with name %s" % (cutDirection, histoName) ) # Choose statistics options statOpts = ["kFCP", "kFNormal", "KFWilson", "kFAC", "kFFC", "kBJeffrey", "kBUniform", "kBayesian"] if statOpt not in statOpts: raise Exception("Invalid statistics option \"%s\". Please choose one from the following:\n\t%s" % (statOpt, "\n\t".join(statOpts))) if statOpt == "kFCP": statOption = ROOT.TEfficiency.kFCP # Clopper-Pearson elif statOpt == "kFNormal": statOption = ROOT.TEfficiency.kFNormal # Normal Approximation elif statOpt == "kFWilson": statOption = ROOT.TEfficiency.kFWilson # Wilson elif statOpt == "kFAC": statOption = ROOT.TEfficiency.kFAC # Agresti-Coull elif statOpt == "kFFC": statOption = ROOT.TEfficiency.kFFC # Feldman-Cousins elif statOpt == "kBJeffrey": statOption = ROOT.TEfficiency.kBJeffrey # Jeffrey elif statOpt == "kBUniform": statOption = ROOT.TEfficiency.kBUniform # Uniform Prior elif statOpt == "kBayesian": statOption = ROOT.TEfficiency.kBayesian # Custom Prior else: raise Exception("This should never be reached") # Declare variables & options first = True isData = False teff = ROOT.TEfficiency() # Get the ROOT histogram rootHisto = dataset.getDatasetRootHisto(histoName) # Normalise the histogram NormalizeRootHisto(datasetsMgr, rootHisto, dataset.isMC(), normalizeTo) #NormalizeRootHisto(datasetsMgr, rootHisto, d.isMC(), normalizeTo) ## Get a clone of the wrapped histogram normalized as requested. h = rootHisto.getHistogram() titleX = h.GetXaxis().GetTitle() binWidth = h.GetXaxis().GetBinWidth(0) titleY = "efficiency (%s) / %s" % (cutDirection, GetBinwidthDecimals(binWidth) % (binWidth) ) # If empty return if h.GetEntries() == 0: return # Create the numerator/denominator histograms numerator = h.Clone("Numerator") denominator = h.Clone("Denominator") # Reset the numerator/denominator histograms numerator.Reset() denominator.Reset() # Calculate the instances passing a given cut (all bins) nBinsX = h.GetNbinsX()+1 for iBin in range(1, nBinsX): nTotal = h.Integral(0, nBinsX) if cutDirection == ">": nPass = h.Integral(iBin+1, nBinsX) elif cutDirection == "<": nPass = nTotal - h.Integral(iBin+1, nBinsX) else: raise Exception("Invalid cut direction \"%s\". Please choose either \">\" or \"<\"" % (cutDirection)) # Sanity check if nPass < 0: nPass = 0 # Fill the numerator/denominator histograms # print "iBin = %s, nPass = %s, nTotal = %s" % (iBin, nPass, nTotal) numerator.SetBinContent(iBin, nPass) numerator.SetBinError(iBin, math.sqrt(nPass)/10) # denominator.SetBinContent(iBin, nTotal) denominator.SetBinError(iBin, math.sqrt(nTotal)/10) # Check for negative values CheckNegatives(numerator, denominator) # Create TEfficiency object using the two histos eff = ROOT.TEfficiency(numerator, denominator) eff.SetStatisticOption(statOption) Verbose("The statistic option was set to %s" % (eff.GetStatisticOption()) ) # Save info in a table (debugging) table = [] hLine = "="*70 msgAlign = '{:<5} {:<20} {:<20} {:<20}' title = msgAlign.format("Bin", "Efficiency", "Error-Low", "Error-Up") table.append("\n" + hLine) table.append(title) table.append(hLine) for iBin in range(1, nBinsX): e = eff.GetEfficiency(iBin) errLow = eff.GetEfficiencyErrorLow(iBin) errUp = eff.GetEfficiencyErrorUp(iBin) values = msgAlign.format(iBin, e, errLow, errUp) table.append(values) table.append(hLine) # Verbose mode if verbose: for l in table: print l weight = 1 if dataset.isMC(): weight = dataset.getCrossSection() eff.SetWeight(weight) if first: teff = eff if dataset.isData(): tn = numerator td = denominator first = False else: teff.Add(eff) if dataset.isData(): tn.Add(numerator) td.Add(denominator) if isData: teff = ROOT.TEfficiency(tn, td) teff.SetStatisticOption(self.statOption) style = styleDict[dataset.getName()] return Convert2TGraph(teff, dataset, style, titleX, titleY)
def GetEfficiency(datasetsMgr, datasets, numerator="Numerator",denominator="Denominator", **kwargs): ''' TEfficiency method: See https://root.cern.ch/doc/master/classTEfficiency.html ''' lumi = GetLumi(datasetsMgr) # Select Statistic Options statOption = ROOT.TEfficiency.kFCP ''' statOption = ROOT.TEfficiency.kFCP # Clopper-Pearson statOption = ROOT.TEfficiency.kFNormal # Normal Approximation statOption = ROOT.TEfficiency.kFWilson # Wilson statOption = ROOT.TEfficiency.kFAC # Agresti-Coull statOption = ROOT.TEfficiency.kFFC # Feldman-Cousins statOption = ROOT.TEfficiency.kBBJeffrey # Jeffrey statOption = ROOT.TEfficiency.kBBUniform # Uniform Prior statOption = ROOT.TEfficiency.kBBayesian # Custom Prior ''' first = True teff = ROOT.TEfficiency() # teff.SetStatisticOption(statOption) # For-loop: All datasets for dataset in datasets: num = dataset.getDatasetRootHisto(numerator) den = dataset.getDatasetRootHisto(denominator) # if dataset.isMC(): num.normalizeToLuminosity(lumi) den.normalizeToLuminosity(lumi) # Get Numerator and Denominator n = num.getHistogram() d = den.getHistogram() if d.GetEntries() == 0 or n.GetEntries() == 0: msg = "Denominator Or Numerator has no entries" Print(ErrorStyle() + msg + NormalStyle(), True) continue # Check Negatives CheckNegatives(n, d, True) # Remove Negatives RemoveNegatives(n) #RemoveNegatives(d) NumeratorBins = n.GetNbinsX() DenominatorBins = d.GetNbinsX() # Sanity Check if (NumeratorBins != DenominatorBins) : raise Exception("Numerator and Denominator Bins are NOT equal!") nBins = d.GetNbinsX() xMin = d.GetXaxis().GetXmin() xMax = d.GetXaxis().GetXmax() # ----------------------------------------------------------------------------------------- # # Ugly hack to ignore EMPTY (in the wanted range) histograms with overflows/underflows # ----------------------------------------------------------------------------------------- # if 0: print "\n" print "=========== getEfficiency:" print "Dataset = ", dataset.getName() print "Numerator :", n.GetName(), " entries=", n.GetEntries(), " Bins=", n.GetNbinsX(), " Low edge=", n.GetBinLowEdge(1) print "Denominator:", d.GetName(), " entries=", d.GetEntries(), " Bins=", d.GetNbinsX(), " Low edge=", d.GetBinLowEdge(1) print "\n" print ">>>>>> Sanity Check: <<<<<<" print "Numerator Mean = ", n.GetMean() print "Numerator RMS = ", n.GetRMS() print "Numerator Integral = ", n.Integral(1, nBins) print "Denominator Mean = ", d.GetMean() print "Denominator RMS = ", d.GetRMS() print "Denominator Integral = ", d.Integral(1, nBins) if (n.GetMean() == 0 or d.GetMean() == 0): continue if (n.GetRMS() == 0 or d.GetRMS() == 0): continue if (n.Integral(1,nBins) == 0 or d.Integral(1,nBins) == 0): continue Verbose("Passed the sanity check", True) eff = ROOT.TEfficiency(n, d) eff.SetStatisticOption(statOption) # For-loop: All bins if 0: for iBin in range(1, nBins+1): print iBin, "x=", n.GetBinLowEdge(iBin), " Num=", n.GetBinContent(iBin), " Den=", d.GetBinContent(iBin)," Eff=", eff.GetEfficiency(iBin) weight = 1 if dataset.isMC(): weight = dataset.getCrossSection() eff.SetWeight(weight) if first: teff = eff first = False if dataset.isData(): tn = n td = d else: teff.Add(eff) if dataset.isData(): tn.Add(n) td.Add(d) if dataset.isData(): teff = ROOT.TEfficiency(tn, td) teff.SetStatisticOption(statOption) Verbose("Final tEff", True) if 0: for iBin in range(1,nBins+1): print iBin, "x=", n.GetBinLowEdge(iBin)," Efficiency=", teff.GetEfficiency(iBin), " Weight = ", teff.GetWeight() return convert2TGraph(teff)
def getEfficiency2D(datasetsMgr, datasets, numerator="Numerator", denominator="Denominator", **kwargs): ''' TEfficiency method: See https://root.cern.ch/doc/master/classTEfficiency.html ''' HasKeys(["verbose"], **kwargs) verbose = True #kwargs.get("verbose") lumi = GetLumi(datasetsMgr) # Select Statistic Options statOption = ROOT.TEfficiency.kFCP ''' statOption = ROOT.TEfficiency.kFCP # Clopper-Pearson statOption = ROOT.TEfficiency.kFNormal # Normal Approximation statOption = ROOT.TEfficiency.kFWilson # Wilson statOption = ROOT.TEfficiency.kFAC # Agresti-Coull statOption = ROOT.TEfficiency.kFFC # Feldman-Cousins statOption = ROOT.TEfficiency.kBBJeffrey # Jeffrey statOption = ROOT.TEfficiency.kBBUniform # Uniform Prior statOption = ROOT.TEfficiency.kBBayesian # Custom Prior ''' print "getEfficiency function" first = True teff = ROOT.TEfficiency() # teff.SetStatisticOption(statOption) print "Loop over Datasets" for dataset in datasets: print "Datasets" #datasets.normalizeMCByLuminosity() for dataset in datasets: num = dataset.getDatasetRootHisto(numerator) den = dataset.getDatasetRootHisto(denominator) if dataset.isMC(): num.normalizeToLuminosity(lumi) den.normalizeToLuminosity(lumi) #num.normalizeMCByLuminosity() #den.normalizeMCByLuminosity() # Get Numerator and Denominator n = num.getHistogram() d = den.getHistogram() #tn = None #td = None #n.normalizeMCByLuminosity() #d.normalizeMCByLuminosity() #n = dataset.getDatasetRootHisto(numerator).getHistogram() #d = dataset.getDatasetRootHisto(denominator).getHistogram() if d.GetEntries() == 0 or n.GetEntries() == 0: print "Denominator Or Numerator has no entries" continue # Check Negatives CheckNegatives(n, d, True) # Remove Negatives RemoveNegatives(n) #RemoveNegatives(d) NumeratorBins = n.GetNbinsX() DenominatorBins = d.GetNbinsX() # Sanity Check if (NumeratorBins != DenominatorBins): raise Exception("Numerator and Denominator Bins are NOT equal!") nBinsX = d.GetNbinsX() xMin = d.GetXaxis().GetXmin() xMax = d.GetXaxis().GetXmax() nBinsY = d.GetNbinsY() #yMin = d.GetYaxis().GetYmin() #yMax = d.GetYaxis().GetYmax() print("NoProblem till here asdasd...") # ----------------------------------------------------------------------------------------- # # Ugly hack to ignore EMPTY (in the wanted range) histograms with overflows/underflows # ----------------------------------------------------------------------------------------- # print "\n" print "=========== getEfficiency:" print "Dataset = ", dataset.getName() #print "Numerator :", n.GetName(), " entries=", n.GetEntries(), " Bins=", n.GetNbinsX(), " Low edge=", n.GetBinLowEdge(1) #print "Denominator:", d.GetName(), " entries=", d.GetEntries(), " Bins=", d.GetNbinsX(), " Low edge=", d.GetBinLowEdge(1) print "\n" print ">>>>>> Sanity Check: <<<<<<" print "Numerator Mean = ", n.GetMean() print "Numerator RMS = ", n.GetRMS() print "Numerator Integral = ", n.Integral() print "Denominator Mean = ", d.GetMean() print "Denominator RMS = ", d.GetRMS() print "Denominator Integral = ", d.Integral() if (n.GetMean() == 0 or d.GetMean() == 0): continue if (n.GetRMS() == 0 or d.GetRMS() == 0): continue if (n.Integral() == 0 or d.Integral() == 0): continue print "Passed the sanity check" eff = ROOT.TEfficiency(n, d) eff.SetStatisticOption(statOption) # if "TT" in dataset.getName(): # print " " # print " TT sample" #for iBin in range(1, nBins+1): # print iBin, "x=", n.GetBinLowEdge(iBin), " Num=", n.GetBinContent(iBin), " Den=", d.GetBinContent(iBin)," Eff=", eff.GetEfficiency(iBin) # "Contrib. =", d.GetBinContent(iBin)/d.Integral(1, nBins)*100.0, "Contrib. = ", n.GetBinContent(iBin)/n.Integral(1, nBins)*100.0, ''' #if (verbose): print "\n" for iBin in range(1,nBins+1): #print iBin, "x=", n.GetBinLowEdge(iBin), " Numerator=", n.GetBinContent(iBin), " Denominator=", d.GetBinContent(iBin), " Efficiency=", eff.GetEfficiency(iBin\ ), " Weight=", eff.GetWeight() print "\n" ''' weight = 1 if dataset.isMC(): weight = dataset.getCrossSection() eff.SetWeight(weight) #print "dataset=", dataset.getName(), "has weight=", weight #print " Efficiency plot has weight=", eff.GetWeight() if first: teff = eff first = False if dataset.isData(): tn = n td = d else: teff.Add(eff) #print " " #print "Adding eff to TEfficiency=" #for iBin in range(1, nBins+1): # print iBin, "x=", n.GetBinLowEdge(iBin), " Numerator=", n.GetBinContent(iBin), "Contrib. = ", n.GetBinContent(iBin)/n.Integral(1, nBins)*100.0, " Denominator=", d.GetBinContent(iBin), "Contrib. =", d.GetBinContent(iBin)/d.Integral(1, nBins)*100.0, " Efficiency=", teff.GetEfficiency(iBin), " Weight=", teff.GetWeight() if dataset.isData(): tn.Add(n) td.Add(d) if dataset.isData(): teff = ROOT.TEfficiency(tn, td) teff.SetStatisticOption(statOption) ''' print " ------------------------- Final Data Plot ------------------------- " print "Integral = ", tn.Integral(1, nBins) print "Numerator:" for iBin in range(1, nBins+1): print iBin, "x=", tn.GetBinLowEdge(iBin), " Bin Content = ", tn.GetBinContent(iBin), " Percentage=", tn.GetBinContent(iBin)/tn.Integral(1, nBins)*100.0 print "Denominator: " print "Integral = ", td.Integral(1,nBins) for iBin in range(1, nBins+1): print iBin, "x=", td.GetBinLowEdge(iBin), " Bin Content = ", td.GetBinContent(iBin), " Percentage=", td.GetBinContent(iBin)/td.Integral(1, nBins)*100 print "-------------------------------------------------------------------- " ''' print " -----------------> Final tEff" #for iBin in range(1,nBins+1): # print iBin, "x=", n.GetBinLowEdge(iBin)," Efficiency=", teff.GetEfficiency(iBin), " Weight = ", teff.GetWeight() return teff
def GetEfficiency(datasetsMgr, datasets, numerator="Numerator",denominator="Denominator", **kwargs): ''' TEfficiency method: See https://root.cern.ch/doc/master/classTEfficiency.html ''' lumi = GetLumi(datasetsMgr) # Select Statistic Options statOption = ROOT.TEfficiency.kFCP ''' statOption = ROOT.TEfficiency.kFCP # Clopper-Pearson statOption = ROOT.TEfficiency.kFNormal # Normal Approximation statOption = ROOT.TEfficiency.kFWilson # Wilson statOption = ROOT.TEfficiency.kFAC # Agresti-Coull statOption = ROOT.TEfficiency.kFFC # Feldman-Cousins statOption = ROOT.TEfficiency.kBBJeffrey # Jeffrey statOption = ROOT.TEfficiency.kBBUniform # Uniform Prior statOption = ROOT.TEfficiency.kBBayesian # Custom Prior ''' first = True teff = ROOT.TEfficiency() # teff.SetStatisticOption(statOption) # For-loop: All datasets for dataset in datasets: num = dataset.getDatasetRootHisto(numerator) den = dataset.getDatasetRootHisto(denominator) # if dataset.isMC(): num.normalizeToLuminosity(lumi) den.normalizeToLuminosity(lumi) # Get Numerator and Denominator n = num.getHistogram() d = den.getHistogram() if d.GetEntries() == 0 or n.GetEntries() == 0: msg = "Denominator Or Numerator has no entries" Print(ErrorStyle() + msg + NormalStyle(), True) continue # Check Negatives CheckNegatives(n, d, True) # Remove Negatives RemoveNegatives(n) #RemoveNegatives(d) NumeratorBins = n.GetNbinsX() DenominatorBins = d.GetNbinsX() # Sanity Check if (NumeratorBins != DenominatorBins) : raise Exception("Numerator and Denominator Bins are NOT equal!") nBins = d.GetNbinsX() xMin = d.GetXaxis().GetXmin() xMax = d.GetXaxis().GetXmax() # ----------------------------------------------------------------------------------------- # # Ugly hack to ignore EMPTY (in the wanted range) histograms with overflows/underflows # ----------------------------------------------------------------------------------------- # if 0: print "\n" print "=========== getEfficiency:" print "Dataset = ", dataset.getName() print "Numerator :", n.GetName(), " entries=", n.GetEntries(), " Bins=", n.GetNbinsX(), " Low edge=", n.GetBinLowEdge(1) print "Denominator:", d.GetName(), " entries=", d.GetEntries(), " Bins=", d.GetNbinsX(), " Low edge=", d.GetBinLowEdge(1) print "\n" print ">>>>>> Sanity Check: <<<<<<" print "Numerator Mean = ", n.GetMean() print "Numerator RMS = ", n.GetRMS() print "Numerator Integral = ", n.Integral(1, nBins) print "Denominator Mean = ", d.GetMean() print "Denominator RMS = ", d.GetRMS() print "Denominator Integral = ", d.Integral(1, nBins) if (n.GetMean() == 0 or d.GetMean() == 0): continue if (n.GetRMS() == 0 or d.GetRMS() == 0): continue if (n.Integral(1,nBins) == 0 or d.Integral(1,nBins) == 0): continue Verbose("Passed the sanity check", True) eff = ROOT.TEfficiency(n, d) eff.SetStatisticOption(statOption) # For-loop: All bins if 0: for iBin in range(1, nBins+1): print iBin, "x=", n.GetBinLowEdge(iBin), " Num=", n.GetBinContent(iBin), " Den=", d.GetBinContent(iBin)," Eff=", eff.GetEfficiency(iBin) weight = 1 if dataset.isMC(): weight = dataset.getCrossSection() eff.SetWeight(weight) if first: teff = eff first = False if dataset.isData(): tn = n td = d else: teff.Add(eff) if dataset.isData(): tn.Add(n) td.Add(d) if dataset.isData(): teff = ROOT.TEfficiency(tn, td) teff.SetStatisticOption(statOption) Verbose("Final tEff", True) if 0: for iBin in range(1,nBins+1): print iBin, "x=", n.GetBinLowEdge(iBin)," Efficiency=", teff.GetEfficiency(iBin), " Weight = ", teff.GetWeight() return convert2TGraph(teff)