def makeEffPlotsVars(tree, varx, vary, sel, nbinx, xmin, xmax, nbiny, ymin, ymax, xtitle, ytitle, leglabel=None, header='', addon='', option='pt', marker=20): binning = [20, 30, 40, 50, 60, 70, 80, 100, 150, 200] c = TCanvas() if option == 'pt': _hist_ = TH1F('h_effp_' + addon, 'h_effp' + addon, len(binning) - 1, array('d', binning)) _ahist_ = TH1F('ah_effp_' + addon, 'ah_effp' + addon, len(binning) - 1, array('d', binning)) elif option == 'eta': _hist_ = TH1F('h_effp_' + addon, 'h_effp' + addon, nbinx, xmin, xmax) _ahist_ = TH1F('ah_effp_' + addon, 'ah_effp' + addon, nbinx, xmin, xmax) elif option == 'nvtx': _hist_ = TH1F('h_effp_' + addon, 'h_effp' + addon, len(vbinning) - 1, array('d', vbinning)) _ahist_ = TH1F('ah_effp_' + addon, 'ah_effp' + addon, len(vbinning) - 1, array('d', vbinning)) tree.Draw(varx + ' >> ' + _hist_.GetName(), sel) tree.Draw(varx + ' >> ' + _ahist_.GetName(), sel + ' && ' + vary) g_efficiency = TGraphAsymmErrors() g_efficiency.BayesDivide(_ahist_, _hist_) g_efficiency.GetXaxis().SetTitle(xtitle) g_efficiency.GetYaxis().SetTitle('efficiency') g_efficiency.GetYaxis().SetNdivisions(507) g_efficiency.SetLineWidth(3) g_efficiency.SetName(header) g_efficiency.SetMinimum(0.) g_efficiency.GetYaxis().SetTitleOffset(1.3) g_efficiency.SetMarkerStyle(marker) g_efficiency.SetMarkerSize(1) g_efficiency.Draw('ap') # save(c, 'plots/' + addon) return copy.deepcopy(g_efficiency)
def calculate(self, histo): from ROOT import TGraphAsymmErrors frac = self.__getWeightOneHisto(histo, self.__name) total = self.__getWeightOneHisto( histo, self.__norm) if(frac.GetEntries() > total.GetEntries()): raise StandardError," comparing '%s' to '%s' in '%s' makes no sense eff > 1!"%(self.__name, self.__norm, histo.GetName()) eff = TGraphAsymmErrors(1) eff.BayesDivide(frac, total) if eff.GetN() < 1: raise StandardError,"Efficiency cannot be calculated '%s' in '%s'"%(self.__name, histo.GetName()) return ( eff.GetY()[0], (eff.GetEYlow()[0],eff.GetEYhigh()[0]) )
def fillAcceptance(self): ''' This is to calculate the acceptance of the sample ''' if debug: print('Info in Sample.fillAcceptance()') #f = TFile.Open(self.infileName) #t = f.Get(self.treeName) #if not t: # raise RuntimeError( 'ERROR: no tree in file %s' % self.infileName) chain = TChain(self.treeName) for fn in self.infileNames: chain.Add(fn) self.effnum = ROOT.TH1F('effnum', 'effnum', 1, 0, 13000) self.effden = ROOT.TH1F('effden', 'effden', 1, 0, 13000) self.effnumB = dict([(b, ROOT.TH1F('effnum_%s' % b, 'effnum_%s' % b, 1, 0, 13000)) for b in self.Bspecies]) self.effdenB = dict([(b, ROOT.TH1F('effden_%s' % b, 'effden_%s' % b, 1, 0, 13000)) for b in self.Bspecies]) #if doInclusive: cutsnum = '(l0_pt>{mp} && abs(l0_eta)<1.5'.format(mp=muTrigPt) #else: #cutsnum = '(l0_pt>{mp} && abs(l0_eta)<1.5 && k_pt>1 && abs(k_eta)<2.5 && pi_pt>1 && abs(pi_eta)<2.5'.format(mp=muTrigPt) if doSkipDispl: cutsnum += '' else: cutsnum += '&& Lxy < 500' if not doDisplZ: pass else: cutsnum += '&& Lz < 20' if doSkipHNLptEta: cutsnum += '' else: cutsnum += '&& l1_pt>3 && abs(l1_eta)<2.5 && pi1_pt>0.8 && abs(pi1_eta)<2.5' cutsnum += ')' cutsden = '(l0_pt>{mp} && abs(l0_eta)<1.5)'.format(mp=muTrigPt) ###### fill the total acceptance chain.Draw('hnl_pt>>effnum', cutsnum+'*'+self.evt_w, 'goff') chain.Draw('hnl_pt>>effden', cutsden, 'goff') if TEfficiency.CheckConsistency(self.effnum,self.effden): peff = TEfficiency(self.effnum,self.effden) # check usage of TGraphAsymmetricErrors self.acc = peff.GetEfficiency(1) self.acc_errup = peff.GetEfficiencyErrorUp(1) self.acc_errdn = peff.GetEfficiencyErrorLow(1) tgra = TGraphAsymmErrors() tgra.BayesDivide(self.effnum, self.effden) self.acc_tg = tgra.GetY()[0] self.acc_errup_tg = tgra.GetErrorYhigh(0) self.acc_errdn_tg = tgra.GetErrorYlow(0) # for debugging purposes self.num = self.effnum.GetEntries() if self.num==0: print('**** 0 entries for mass={}'.format(self.mass)) self.den = self.effden.GetEntries() ###### fill the partial acceptances for ib,b in enumerate(self.Bspecies): bsel = '(abs(b_pdgid)=={bid})'.format(bid=self.BpdgIds[ib]) selnum = '(' + cutsnum + '&&' + bsel + ')' selden = '(' + cutsden + '&&' + bsel + ')' chain.Draw('hnl_pt>>effnum_{b}'.format(b=b), selnum + '*' + self.evt_w, 'goff') chain.Draw('hnl_pt>>effden_{b}'.format(b=b), selden, 'goff') if TEfficiency.CheckConsistency(self.effnumB[b],self.effdenB[b]): peff = TEfficiency(self.effnumB[b],self.effdenB[b]) self.accB[b] = peff.GetEfficiency(1) self.accB_errup[b] = peff.GetEfficiencyErrorUp(1) self.accB_errdn[b] = peff.GetEfficiencyErrorLow(1) else: self.accB[b] = 0 self.accB_errup[b] = 0 self.accB_errdn[b] = 0