def WriteTree(runSet): print 'Writing tree' # Make a tree froot = TFile('mu.root', 'RECREATE') tree = TTree("mu", "Flat ntuple for mu") tree.SetDirectory(froot) leaves = "run/F:lb/F:mu/F" leafValues = array("f", [0.0, 0.0, 0.0]) newBranch = tree.Branch("mu_vars", leafValues, leaves) for r, lbs in runSet.iteritems(): for i in range(lbs.FirstLB(), lbs.LastLB()): leafValues[2] = lbs.GetMeanPileUp(i) leafValues[0] = float(r) leafValues[1] = i print 'mu: %s run: %s lb: %s' % (leafValues[2], leafValues[0], leafValues[1]) tree.Fill() tree.Write() #froot.Write() froot.Close()
def makesample(sample): # help function to create file with tree fname = "%s/%s_%s.root"%(outdir,sample,channel) file = TFile(fname,'RECREATE') hist = TH1D('cutflow','cutflow',20,0,20) tree = TTree('tree','tree') tree.Branch('m_vis', m_vis, 'm_vis/F') tree.Branch('pt_1', pt_1, 'pt_1/F') tree.Branch('pt_2', pt_2, 'pt_2/F') tree.Branch('dm_2', dm_2, 'dm_2/I') tree.Branch('eta_1', eta_1, 'eta_1/F') tree.Branch('eta_2', eta_2, 'eta_2/F') tree.Branch('njets', njets, 'njets/I') tree.Branch('genmatch_2', genmatch_2, 'genmatch_2/I') tree.Branch('NUP', NUP, 'NUP/I') tree.Branch('weight', weight, 'weight/F') tree.SetDirectory(file) hist.SetDirectory(file) hist.SetBinContent( 1,1) hist.SetBinContent(17,1) histdict[sample] = hist filedict[sample] = (file,tree)
tree_ds.SetBranchAddress(branchName, branches[branchName]) tree_bu.SetBranchAddress(branchName, branches[branchName]) tree_bd.SetBranchAddress(branchName, branches[branchName]) tree_bkg.SetBranchAddress(branchName, branches[branchName]) branches['category'] = array('i', [-999]) tree_ds.SetBranchAddress('category', branches['category']) tree_bu.SetBranchAddress('category', branches['category']) tree_bd.SetBranchAddress('category', branches['category']) tree_bkg.SetBranchAddress('category', branches['category']) #Setup a new tree T3MFMiniTree = TFile("T3MMiniTree" + "_" + args.weights_prefix + ".root", "recreate") T3MMiniTree = TTree('T3MMiniTree', 'T3MMiniTree') T3MMiniTree.SetDirectory(T3MFMiniTree) for branchName in branchList_miniTree: branches_miniTree[branchName] = array('f', [-999]) T3MMiniTree.Branch(branchName, branches_miniTree[branchName], branchName + '/F') # Book methods for reader in mvaReaderList: mvaReaders[reader].BookMVA('BDT', mvaWeights[reader]) print branches_miniTree # print some example classifications print('Classifying signal events (Ds)') for i in range(tree_ds.GetEntriesFast()):
#root_file = sys.argv[1] filename = sys.argv[1] #filename = root_files_directory + root_file file = TFile(filename, 'read') tree = file.Get('t1') nb_entries = tree.GetEntries() #newfilename = root_files_directory #newfile = TFile(root_files_directory + root_file[:-5] + '-t2.root', 'recreate') newfilename = filename[:-5] + '-t2.root' newfile = TFile(newfilename, 'recreate') newtree = TTree('t2', '') newtree.SetDirectory(newfile) #che eto takoe?? max_size = 1000000 eventid = array('i', [0]) etot_NR = array('f', [0.]) etot_ER = array('f', [0.]) ns_NR = array('i', [0]) ns_ER = array('i', [0]) ed_NR = array('f', max_size * [0.]) ed_ER = array('f', max_size * [0.]) xp_NR = array('f', max_size * [0.]) xp_ER = array('f', max_size * [0.]) yp_NR = array('f', max_size * [0.]) yp_ER = array('f', max_size * [0.])
class JetIDAnalyzer(Analyzer): '''A simple jet analyzer.''' def declareHandles(self): super(JetIDAnalyzer, self).declareHandles() self.handles['jets'] = AutoHandle(*self.cfg_ana.jetCollection) if self.cfg_ana.useGenLeptons: self.mchandles['leptons2'] = AutoHandle( 'genLeptonsStatus2', 'std::vector<reco::GenParticle>') else: self.mchandles['genParticles'] = AutoHandle( 'prunedGen', 'std::vector<reco::GenParticle>') ### self.mchandles['genJets'] = AutoHandle ( ### *self.cfg_ana.genJetsCollection ### ) self.handles['vertices'] = AutoHandle('offlinePrimaryVertices', 'std::vector<reco::Vertex>') # .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... def beginLoop(self): super(JetIDAnalyzer, self).beginLoop() self.file = TFile('/'.join([self.looperName, 'testJets.root']), 'recreate') if self.cfg_ana.applyPFLooseId: from ROOT import PFJetIDSelectionFunctor self.isPFLooseFunc = PFJetIDSelectionFunctor( 0, PFJetIDSelectionFunctor.LOOSE) ## Workaround: for some reason PyROOT does not bind PFJetIDSelectionFunctor(Jet) nor PFJetIDSelectionFunctor.getBitsTemplates from ROOT import pat self.isPFLooseFunc.bits = pat.strbitset() for i in "CHF", "NHF", "CEF", "NEF", "NCH", "nConstituents": self.isPFLooseFunc.bits.push_back(i) ## /Workaround self.isPFLoose = lambda x: self.isPFLooseFunc( x, self.isPFLooseFunc.bits) else: self.isPFLoose = lambda x: True # general histograms self.jetHistos = JetHistograms('Jets') self.cleanJetHistos = JetHistograms('CleanJets') self.matchedCleanJetHistos = JetHistograms('MatchedCleanJets') self.unmatchedCleanJetHistos = JetHistograms('UnmatchedCleanJets') ## Pileup JetID if self.cfg_ana.jetIdMva: self.puidalgo = PileupJetIdNtupleAlgo(*self.cfg_ana.jetIdMva) self.runMva = True else: self.puidalgo = PileupJetIdNtupleAlgo() self.runMva = False self.vtxBins = (0, 10, 15, 20, 30) ## (0,2,4,6,10,15,20,30,35) self.vtxBinLabels = mkBinLabels(self.vtxBins) self.ptBins = (20, 30, 50) ## (20,30,40,50,100) self.etaBins = (0, 1.4, 2.5, 3.0) self.puEtaLables = ["_barrel", "_endtk", "_endNOtk", "_fwd"] reweight_f = TF1("f", "pol2(0)+expo(3)") reweight_f.SetParameters(0.1955298, -0.003830591, 1.944794e-05, 4.649755, -0.1722024) self.reweight = ("pt", reweight_f) ## PileUp histograms if self.cfg_ana.doJetIdHisto: # histograms for pileup jet identification variables self.gluCleanHistosId = PileupJetHistograms( "GluonMatchedCleanHistosId", self.vtxBins, self.ptBins, self.etaBins, etalabels=self.puEtaLables, reweight=self.reweight) self.quarkCleanHistosId = PileupJetHistograms( "QuarkMatchedCleanHistosId", self.vtxBins, self.ptBins, self.etaBins, etalabels=self.puEtaLables, reweight=self.reweight) self.reweiMatchedCleanHistosId = PileupJetHistograms( "ReweiMatchedCleanHistosId", self.vtxBins, self.ptBins, self.etaBins, etalabels=self.puEtaLables, reweight=self.reweight) self.unmatchedCleanHistosId = PileupJetHistograms( "UnmatchedCleanHistosId", self.vtxBins, self.ptBins, self.etaBins, etalabels=self.puEtaLables) ### self.jetKin = [] ### for vtx in self.vtxBinLabels: ### self.jetKin.append([]) ### for eta in self.puEtaLables: ### self.jetKin[-1].append( JetHistograms('Jets%s%s' % (vtx,eta) ) ) if self.cfg_ana.dumpTree: self.tree = TTree("tree", "tree") self.tree.SetDirectory(self.file) self.puidalgo.bookBranches(self.tree) gROOT.ProcessLine( """struct MyTreeVars{ Int_t nvtx; Bool_t isMatched; Int_t jetFlavour; Float_t partonPt; Float_t genPt; Float_t genDr; }""" ) from ROOT import MyTreeVars self.treevars = MyTreeVars() for i, j in ("nvtx", "I"), ("isMatched", "O"), ("jetFlavour", "I"), ("partonPt", "F"), ("genPt", "F"), ("genDr", "F"): self.tree.Branch(i, AddressOf(self.treevars, i), "%s/%s" % (i, j)) self.h_nvtx = TH1F("h_nvtx", "", 50, 0, 50) self.h_genjetspt = TH1F("h_genjetspt", "", 500, 0, 500) # .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... def process(self, iEvent, event): #read all the handles defined beforehand self.readCollections(iEvent) jetEtaCut = 4.5 # get the vertexes event.vertices = self.handles['vertices'].product() self.h_nvtx.Fill(len(event.vertices)) event.vertexBin = int(len(event.vertices)) # get the jets in the jets variable jets = self.handles['jets'].product() # filter jets with some selections event.jets = [ jet for jet in jets if (abs(jet.eta()) < jetEtaCut and jet.pt() > self.cfg_ana.ptCut and self.isPFLoose(jet)) ] self.jetHistos.fillEvent(event.jets) try: # get status 2 leptons if 'leptons2' in self.mchandles: event.genLeptons = map(GenParticle, self.mchandles['leptons2'].product()) else: event.genLeptons = [ lep for lep in self.mchandles['genParticles'].product() if lep.status() == 3 and (abs(lep.pdgId()) == 11 or abs( lep.pdgId()) == 13 or abs(lep.pdgId()) == 15) ] except: event.genLeptons = None if event.genLeptons: #FIXME why are there cases in which there's 4 or 6 leptons? if len(event.genLeptons) != 2: return # in case I want to filter out taus # 11, 13, 15 : e, u, T # remove leptons from jets if closer than 0.2 event.cleanJets = cleanObjectCollection(event.jets, event.genLeptons, 0.2) else: event.cleanJets = event.jets ### event.matchingCleanJets = matchObjectCollection2 (event.cleanJets, event.selGenJets, 0.25) # assign to each jet its gen match (easy life :)) event.selGenJets = [] for jet in event.cleanJets: try: jet.gen = jet.genJet() jet.gen.pt() event.selGenJets.append(jet.gen) except: jet.gen = None for jet in event.selGenJets: self.h_genjetspt.Fill(jet.pt()) self.jetHistos.fillStats(len(event.selGenJets), len(event.jets)) ### try: ### # get genJets ### event.genJets = map (GenJet, self.mchandles['genJets'].product ()) ### event.selGenJets = event.genJets ### for jet in event.selGenJets : ### self.h_genjetspt.Fill (jet.pt ()) ### ### # first stats plots ### self.jetHistos.fillStats (len (event.selGenJets), len (event.jets)) ### except: ### pass ## run the PileupJetIdAlgo and attach the id to the jet ijet = 0 for jet in event.cleanJets: try: jet.puIdentifier = self.puidalgo.computeIdVariables( jet.sourcePtr().get(), 0., event.vertices[0], self.runMva) except: jet.puIdentifier = self.puidalgo.computeIdVariables( jet, 0., event.vertices[0], self.runMva) if self.cfg_ana.dumpTree: ## self.puidalgo.fillJet(jet.puIdentifier,ijet,0) self.puidalgo.setIJetIEvent(ijet, 0) self.treevars.nvtx = len(event.vertices) self.treevars.isMatched = False self.treevars.jetFlavour = -999 self.treevars.genPt = 0. self.treevars.partonPt = 0. self.treevars.genDr = -100. if jet.gen: self.treevars.isMatched = True self.treevars.jetFlavour = jet.partonFlavour() self.treevars.genPt = jet.gen.pt() self.treevars.genDr = deltaR(jet.gen.eta(), jet.gen.phi(), jet.eta(), jet.phi()) try: self.treevars.partonPt = jet.genParton.pt() except: pass self.tree.Fill() ijet += 1 self.cleanJetHistos.fillEvent(event.cleanJets) event.matchedCleanJets = [ jet for jet in event.cleanJets if jet.gen != None ] event.unmatchedCleanJets = [ jet for jet in event.cleanJets if jet.gen == None ] self.matchedCleanJetHistos.fillEvent(event.matchedCleanJets) self.unmatchedCleanJetHistos.fillEvent(event.unmatchedCleanJets) event.cleanGluJets = [] event.cleanQuarkJets = [] vtxbin = findBin(self.vtxBinLabels, len(event.vertices)) for jet in event.matchedCleanJets: flav = abs(jet.partonFlavour()) if flav == 21: event.cleanGluJets.append(jet) elif flav > 0 and flav <= 3: event.cleanQuarkJets.append(jet) jet.weight = self.reweight[1](getattr(jet, self.reweight[0])()) etabin = findBin(self.etaBins, jet.eta()) ### self.jetKin[vtxbin][etabin].fillJet(jet) if self.cfg_ana.doJetIdHisto: self.gluCleanHistosId.fillEvent(event.cleanGluJets, event.vertices) self.quarkCleanHistosId.fillEvent(event.cleanQuarkJets, event.vertices) ### self.matchedCleanHistosId.fillEvent(event.matchedCleanJets,event.vertices) self.reweiMatchedCleanHistosId.fillEvent(event.matchedCleanJets, event.vertices) self.unmatchedCleanHistosId.fillEvent(event.unmatchedCleanJets, event.vertices) # .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... def write(self): from ROOT import gROOT gROOT.SetBatch(True) self.jetHistos.Write(self.file) self.cleanJetHistos.Write(self.file) self.matchedCleanJetHistos.Write(self.file) self.unmatchedCleanJetHistos.Write(self.file) if self.cfg_ana.doJetIdHisto: self.gluCleanHistosId.summary() self.gluCleanHistosId.Write(self.file) self.quarkCleanHistosId.summary() self.quarkCleanHistosId.Write(self.file) self.reweiMatchedCleanHistosId.summary() self.reweiMatchedCleanHistosId.Write(self.file) ### self.matchedCleanHistosId.Write(self.file) self.unmatchedCleanHistosId.Write(self.file) ### for j in self.jetKin: ### for h in j: ### h.Write(self.file) self.file.cd() self.h_nvtx.Write() self.h_genjetspt.Write() if self.cfg_ana.dumpTree: self.tree.Write() self.file.Close()
def selectEvents(fileName,saveProbes=False,saveSummary=False,outputDir='./',xsec=-1,correctionsMap={}): gSystem.ExpandPathName(fileName) file=TFile.Open(fileName) #exclusivity of triggers per PD eTriggersOnly = ('SingleEle' in fileName) muTriggersOnly = ('SingleMu' in fileName) #normalizations and corrections origEvents=1.0 puWeightsGr=None if xsec>0 : origEvents=file.Get('smDataAnalyzer/cutflow').GetBinContent(1) if origEvents==0 : print '[Warning] 0 initial events ?' #derive pileup weights origPileup=file.Get('smDataAnalyzer/pileup') try: dataPileupFile=TFile.Open(correctionsMap['pu']) dataPileup=dataPileupFile.Get('pileup') normF=origPileup.Integral()/dataPileup.Integral() if normF>0 : puWeightsGr=TGraph() for xbin in xrange(1,origPileup.GetXaxis().GetNbins()+1) : iweight=1.0 if origPileup.GetBinContent(xbin)>0 : iweight=normF*dataPileup.GetBinContent(xbin)/origPileup.GetBinContent(xbin) puWeightsGr.SetPoint( puWeightsGr.GetN(), origPileup.GetXaxis().GetBinCenter(xbin), iweight ) dataPileupFile.Close() except : print 'No data pileup file provided or other error occurred. If you wish add -w pu,pu_file.root' jecCorrector=None jecUncertainty=None try: prefix='Data' if xsec>0 : prefix='MC' jecDir=correctionsMap['jec'] gSystem.ExpandPathName(jecDir) jetCorLevels='L1FastJet' jetCorFiles=jecDir+'/'+prefix+'_L1FastJet_AK5PFchs.txt' jetCorLevels=jetCorLevels+':L2Relative' jetCorFiles=jetCorFiles+':'+jecDir+'/'+prefix+'_L2Relative_AK5PFchs.txt' jetCorLevels=jetCorLevels+':L3Absolute' jetCorFiles=jetCorFiles+':'+jecDir+'/'+prefix+'_L3Absolute_AK5PFchs.txt' #if prefix=='Data': # jetCorLevels=jetCorLevels+':L2L3Residual' # jetCorFiles=jetCorFiles+':'+jecDir+'/'+prefix+'_L2L3Residual_AK5PFchs.txt' jecCorrector=FactorizedJetCorrector(jetCorLevels,jetCorFiles) print 'Jet energy corrector initialized with levels ',jetCorLevels,' for ',prefix if prefix=='MC': jecUncertainty=JetCorrectionUncertainty(jecDir+"/"+prefix+"_Uncertainty_AK5PFchs.txt") print 'Jet uncertainty is ',jecUncertainty except Exception as e: print '[Error]',e tree=file.Get("smDataAnalyzer/data") nev = tree.GetEntries() outUrl=outputDir+'/'+os.path.basename(fileName) monitor=Monitor(outUrl) #same the initial normalization and cross section monitor.addValue(origEvents,'iniEvents') monitor.addValue(xsec,'crossSection') #some basic histograms monitor.addHisto('nvtx', ';Vertices;Events', 50,0,50) monitor.addHisto('nvtxraw', ';Vertices;Events', 50,0,50) monitor.addHisto('vmass', ';Mass [GeV];Events', 50,0,250) monitor.addHisto('vmt', ';Transverse mass [GeV];Events', 50,0,250) monitor.addHisto('vpt', ';Boson transverse momentum [GeV];Events',50,0,250) monitor.addHisto('leg1pt', ';Transverse momentum [GeV];Events', 50,0,250) monitor.addHisto('leg2pt', ';Transverse momentum [GeV];Events', 50,0,250) monitor.addHisto('leg1iso', ';Relative isolation;Events', 50,0,0.5) monitor.addHisto('leg2iso', ';Relative isolation;Events', 50,0,0.5) #save a summary ntuple for analysis summaryTuple=None if saveSummary : varList='cat:weight:nvtx:njets' varList=varList+':v_mass:v_mt:v_pt:genv_mass:genv_pt' varList=varList+':leg1_pt:leg1_eta:leg1_phi:genleg1_pt:leg1_relIso' varList=varList+':leg2_pt:leg2_eta:leg2_phi:genleg2_pt:leg2_relIso' varList=varList+':sumEt:ht' varList=varList+':met_lesup:met_lesdown:met_jesup:met_jesdown:met_jerup:met_jerdown:met_umetup:met_umetdown' summaryTuple=TNtuple('data','summary',varList) summaryTuple.SetDirectory(0) monitor.addObject(summaryTuple) #save a dedicated ntuple for Tag and Probe probesTuple=None probesId = array.array( 'f', [ 0 ] ) probesPt = array.array( 'f', [ 0 ] ) probesEta = array.array( 'f', [ 0 ] ) probesPhi = array.array( 'f', [ 0 ] ) probesNvtx = array.array( 'f', [ 0 ] ) probesMass = array.array( 'f', [ 0 ] ) probesIsMatched = array.array( 'i', [0] ) probesPassLoose = array.array( 'i', [ 0 ] ) probesPassTight = array.array( 'i', [ 0 ] ) probesFireTrigger = array.array( 'i', [ 0 ] ) if saveProbes : probesTuple=TTree('tandp','summary for tandp') probesTuple.Branch( 'id', probesId, 'id/F' ) probesTuple.Branch( 'pt', probesPt, 'pt/F' ) probesTuple.Branch( 'eta', probesEta, 'eta/F' ) probesTuple.Branch( 'phi', probesPhi, 'phi/F' ) probesTuple.Branch( 'nvtx', probesNvtx, 'nvtx/F' ) probesTuple.Branch( 'mass', probesMass, 'mass/F' ) probesTuple.Branch( 'isMatched', probesIsMatched, 'isMatched/I' ) probesTuple.Branch( 'passLoose', probesPassLoose, 'passLoose/I' ) probesTuple.Branch( 'passTight', probesPassTight, 'passTight/I' ) probesTuple.Branch( 'fireTrigger', probesFireTrigger, 'fireTrigger/I' ) probesTuple.SetDirectory(0) monitor.addObject(probesTuple) # # LOOP OVER THE EVENTS # for iev in xrange(0,nev): tree.GetEntry(iev) if iev%10000 == 0 : sys.stdout.write("\r[ %d/100 ] completed" %(100.*iev/nev)) sys.stdout.flush() #check mc truth (select V bosons from the hard process genBosonP4=TLorentzVector(0,0,0,0) genNeutP4=TLorentzVector(0,0,0,0) for g in xrange(0,tree.mcn): if tree.mc_status[g]!=3 : continue genP4=TLorentzVector(tree.mc_px[g],tree.mc_py[g],tree.mc_pz[g],tree.mc_en[g]) if abs(tree.mc_id[g])==12 or abs(tree.mc_id[g])==14 or abs(tree.mc_id[g])==14 : genNeutP4=genNeutP4+genP4 if abs(tree.mc_id[g])!=23 and abs(tree.mc_id[g])!=24 : continue genBosonP4=genP4 #get triggers that fired eFire,mFire,emFire=decodeTriggerWord(tree.tbits) if eTriggersOnly : mFire=False if muTriggersOnly : eFire=False #select the leptons leptonCands=[] validTags=[] lepSums=[TLorentzVector(0,0,0,0)]*3 lepFlux=TLorentzVector(0,0,0,0) for l in xrange(0,tree.ln) : lep=LeptonCand(tree.ln_id[l],tree.ln_px[l],tree.ln_py[l],tree.ln_pz[l],tree.ln_en[l]) if lep.p4.Pt()<20 : continue if abs(tree.ln_id[l])==11 : if math.fabs(lep.p4.Eta())>2.5 : continue if math.fabs(lep.p4.Eta())>1.4442 and math.fabs(lep.p4.Eta())<1.566 : continue if abs(tree.ln_id[l])==13 : if math.fabs(lep.p4.Eta())>2.1 : continue relIso, isLoose, isLooseIso, isTight, isTightIso = selectLepton(tree.ln_id[l],tree.ln_idbits[l],tree.ln_gIso[l],tree.ln_chIso[l],tree.ln_nhIso[l],tree.ln_puchIso[l],lep.p4.Pt()) lep.selectionInfo(relIso,isLoose, isLooseIso, isTight, isTightIso) lep.triggerInfo(tree.ln_Tbits[l]) #check the generator level information genMatchIdx=tree.ln_genid[l] if genMatchIdx < tree.mcn : lep.genMatch(tree.mc_id[genMatchIdx],tree.mc_px[genMatchIdx],tree.mc_py[genMatchIdx],tree.mc_pz[genMatchIdx],tree.mc_en[genMatchIdx]) else : lep.genMatch(0,0,0,0,0) leptonCands.append(lep) if not saveProbes: continue if not isTight or not isTightIso or lep.Tbits==0 : continue if abs(lep.id)==11 and not eFire: continue if abs(lep.id)==13 and not mFire: continue validTags.append( len(leptonCands)-1 ) lepSums[1]=lepSums[1]+lep.getP4('lesup')-lep.p4 lepSums[2]=lepSums[2]+lep.getP4('lesdown')-lep.p4 lepFlux=lepFlux+lep.p4 #check if probes tree should be saved if saveProbes and len(validTags)>0: # choose a random tag tagIdx=random.choice(validTags) tag=leptonCands[tagIdx] #find probe probe=None for l in xrange(0,len(leptonCands)) : if l==tagIdx: continue if abs(tag.id)!=abs(leptonCands[l].id) : continue probe=leptonCands[l] break #for electrons save superclusters if probe is not found matchToEle=1 #if abs(tag.id)==11 and probe is None : # matchToEle=0 # for sc in xrange(0,tree.scn) : # sc_en=tree.scn_e[sc] # sc_eta=tree.scn_eta[sc] # sc_phi=tree.scn_phi[sc] # sc_pt=sc_en/math.cosh(sc_eta) # sc_p4=TLorentzVector(0,0,0,0) # sc_p4.SetPtEtaPhiE(sc_pt,sc_eta,sc_phi,sc_en) # lscp4=tag.p4+sc_p4 # if math.fabs(lscp4.M()-91)>30 : continue # scCand=LeptonCand(tag.id,sc_p4.Px(),sc_p4.Py(),sc_p4.Pz(),sc_p4.E()) # scCand.selectionInfo(0,0,0,0,0) # scCand.triggerInfo(0) # probe=scCand # break if abs(tag.id)==13 : matchToEle=0 #save info if probe is not None: tpp4=tag.p4+probe.p4 if math.fabs(tpp4.M()-91)<30 : probesId[0]=probe.id probesPt[0]=probe.p4.Pt() probesEta[0]=probe.p4.Eta() probesPhi[0]=probe.p4.Phi() probesNvtx[0]=tree.nvtx probesMass[0]=tpp4.M() probesIsMatched[0]=(probe.genId!=0) probesPassLoose[0]=(probe.passLoose and probe.passLooseIso) probesPassTight[0]=(probe.passTight and probe.passTightIso) probesFireTrigger[0]=(probe.Tbits>0) probesTuple.Fill() #jets selJets=[] jetSums=[TLorentzVector(0,0,0,0)]*5 jetFlux=TLorentzVector(0,0,0,0) ht=0 for j in xrange(0,tree.jn) : jet=JetCand(tree.jn_px[j],tree.jn_py[j],tree.jn_pz[j],tree.jn_en[j],tree.jn_area[j],tree.jn_torawsf[j]) #cross clean with loose isolated leptons overlapFound=False for l in leptonCands: if not l.passLoose or not l.passLooseIso : continue dR=jet.p4.DeltaR(l.p4) if dR>0.4 : continue overlapFound=True break if overlapFound: continue #very loose kinematics cuts if math.fabs(jet.p4.Eta())>4.7 or jet.p4.Pt()<10 : continue #save it jet.genMatch(tree.jn_genpx[j],tree.jn_py[j],tree.jn_pz[j],tree.jn_en[j],tree.jn_genid[j],tree.jn_genflav[j]) jet.updateJEC(jecCorrector,jecUncertainty,tree.rho,tree.nvtx) selJets.append(jet) #account for all the corrections you have applied jetSums[0]=jetSums[0] + jet.getCorrectedJet() - jet.getCorrectedJet('raw') jetSums[1]=jetSums[1] + jet.getCorrectedJet('jesup') - jet.getCorrectedJet() jetSums[2]=jetSums[2] + jet.getCorrectedJet('jesdown') - jet.getCorrectedJet() jetSums[3]=jetSums[3] + jet.getCorrectedJet('jerup') - jet.getCorrectedJet() jetSums[4]=jetSums[4] + jet.getCorrectedJet('jerdown') - jet.getCorrectedJet() jetFlux=jetFlux+jet.p4 ht=ht+jet.p4.Pt() # met metCand=METCand(tree.met_pt[0]*math.cos(tree.met_phi[0]),tree.met_pt[0]*math.sin(tree.met_phi[0]),0,tree.met_pt[0]) metCand.genMatch(genNeutP4.Px(),genNeutP4.Py(),genNeutP4.Pz(),genNeutP4.E()) metCand.addSumEts(tree.met_sumet[0], tree.met_chsumet[0]) metCand.addJetCorrections(jetSums) metCand.addLeptonCorrections(lepSums) unclFlux=-(metCand.p4+lepFlux+jetFlux) unclSums=[TLorentzVector(0,0,0,0),unclFlux*0.10,unclFlux*(-0.10)] metCand.addUnclusteredCorrections(unclSums) #build the candidate vCand=buildVcand(eFire,mFire,emFire,leptonCands,metCand) if vCand is None : continue #prepare to save weight=1.0 if puWeightsGr is not None: weight=puWeightsGr.Eval(tree.ngenITpu) #show isolations for ileg in [0,1]: hname='leg'+str(ileg+1)+'iso' lid='' if abs(vCand.m_legs[ileg].id)==11 : lid='e' elif abs(vCand.m_legs[ileg].id)==13 : lid='mu' else : continue monitor.fill(hname,[lid],vCand.m_legs[ileg].relIso,weight) tags=[vCand.tag] monitor.fill('nvtxraw',tags, tree.nvtx, 1.0) monitor.fill('nvtx', tags, tree.nvtx, weight) monitor.fill('vmass', tags, vCand.p4.M(), weight) monitor.fill('vpt', tags, vCand.p4.Pt(), weight) monitor.fill('leg1pt', tags, vCand.m_legs[0].p4.Pt(), weight) monitor.fill('leg2pt', tags, vCand.m_legs[1].p4.Pt(), weight) for var in ['','lesup','lesdown','jesup','jesdown','jerup','jerdown','umetup','umetdown']: mtVar=vCand.computeMt(var) monitor.fill('vmt', [vCand.tag+var], mtVar, weight) if saveSummary : values=[ vCand.id, weight, tree.nvtx, len(selJets), vCand.p4.M(), vCand.mt, vCand.p4.Pt(), genBosonP4.M(), genBosonP4.Pt(), vCand.m_legs[0].p4.Pt(),vCand.m_legs[0].p4.Eta(),vCand.m_legs[0].p4.Phi(), vCand.m_legs[0].genP4.Pt(), vCand.m_legs[0].relIso, vCand.m_legs[1].p4.Pt(),vCand.m_legs[1].p4.Eta(),vCand.m_legs[1].p4.Phi(), vCand.m_legs[1].genP4.Pt(), vCand.m_legs[1].relIso, metCand.sumet, ht, metCand.p4Vars['lesup'].Pt(),metCand.p4Vars['lesdown'].Pt(),metCand.p4Vars['jesup'].Pt(),metCand.p4Vars['jesdown'].Pt(),metCand.p4Vars['jerup'].Pt(),metCand.p4Vars['jerdown'].Pt(),metCand.p4Vars['umetup'].Pt(),metCand.p4Vars['umetdown'].Pt() ] summaryTuple.Fill(array.array("f",values)) file.Close() monitor.close()