def recoverLeg(self, leg): ''' Run the recovewry algorithm. Associates a photon to the Z''' #Prefilter photons = leg.photons photonsHighPt = filter(lambda x: x.pt() > self.cfg.minPhotonPtTight, photons) photonsLowPt = filter(lambda x: x.pt() <= self.cfg.minPhotonPtTight, photons) photonsHighPt = sorted(photonsHighPt, key=lambda x: x.pt(), reverse=True) photon = None if len(photonsHighPt) > 0: photon = photonsHighPt[0] elif len(photonsLowPt): photonsLowPt = sorted( photonsLowPt, key=lambda x: deltaR(x.eta(), x.phi(), leg.eta(), leg.phi())) photon = photonsLowPt[0] if photon is not None: if deltaR(photon.eta(), photon.phi(), leg.eta(), leg.phi()) < self.cfg.leptonIsoCone: leg.fsrPhoton = photon
def calculateJetVars(self, fourLepton, jets, cleanDR=0.5): #Apply ID idJets = filter(lambda x: x.looseJetId() and x.passPuJetId('full', 2), jets) #Cross clean from leptons cleanedJets = filter(lambda x: deltaR(x.eta(),x.phi(),fourLepton.leg1.leg1.eta(),fourLepton.leg1.leg1.phi())>cleanDR and \ deltaR(x.eta(),x.phi(),fourLepton.leg1.leg2.eta(),fourLepton.leg1.leg2.phi())>cleanDR and \ deltaR(x.eta(),x.phi(),fourLepton.leg2.leg1.eta(),fourLepton.leg2.leg1.phi())>cleanDR and \ deltaR(x.eta(),x.phi(),fourLepton.leg2.leg2.eta(),fourLepton.leg2.leg2.phi())>cleanDR,idJets) bJets = filter( lambda x: x.bDiscriminator('combinedSecondaryVertexBJetTags') > 0.224, cleanedJets) jetVars = dict() jetVars['nJets'] = len(cleanedJets) jetVars['nBJets'] = len(bJets) jetVars['nBJetsTight'] = len( filter( lambda x: x.bDiscriminator('combinedSecondaryVertexBJetTags') > 0.679, cleanedJets)) ht = 0 if len(bJets) >= 2: jetVars['Mbb'] = (bJets[0].p4() + bJets[1].p4()).M() else: jetVars['Mbb'] = -99 for jet in cleanedJets: ht = ht + jet.pt() jetVars['HT'] = ht if len(cleanedJets) > 2: jetVars['Mjjj'] = (cleanedJets[0].p4() + cleanedJets[1].p4() + cleanedJets[2].p4()).M() else: jetVars['Mjjj'] = -99. if len(cleanedJets) > 1: jetVars['dEta'] = cleanedJets[0].eta() - cleanedJets[1].eta() jetVars['dPhi'] = deltaPhi(cleanedJets[0].phi(), cleanedJets[1].phi()) jetVars['Mjj'] = (cleanedJets[0].p4() + cleanedJets[1].p4()).M() jetVars['Ptjj'] = (cleanedJets[0].p4() + cleanedJets[1].p4()).Pt() else: jetVars['dEta'] = -99 jetVars['dPhi'] = -99 jetVars['Mjj'] = -99 jetVars['Ptjj'] = -99 if len(cleanedJets) > 0: #Add leading jet variables highestJet = max(cleanedJets, key=lambda x: x.pt()) jetVars['leadingPt'] = highestJet.pt() jetVars['leadingEta'] = highestJet.eta() else: jetVars['leadingPt'] = -99. jetVars['leadingEta'] = -99. fourLepton.jets = jetVars
def buildLeptonList(self, event): self.jets = [] for ptj in self.handles['jets'].product(): self.jets.append(Jet(ptj)) self.leptons = [] for pte in self.handles['electrons'].product(): self.leptons.append(Lepton(pte)) for ptm in self.handles['muons'].product(): self.leptons.append(Lepton(ptm)) self.photons = [] for ptg in self.handles['photons'].product(): if ptg.energy() > 1.0: self.photons.append(Photon(ptg)) # Find FSR tmpLept = set(self.leptons) for lept in self.leptons: leptonIso = self.leptonIso(lept) if leptonIso > 0.2: tmpLept.remove(lept) continue #if (self.eleele or self.mumu or self.tautau ) : # print self.eleele, self.mumu, self.tautau,lept, leptonIso for i, ph in enumerate(self.photons): dr = deltaR(lept.eta(), lept.phi(), ph.eta(), ph.phi()) if (abs(lept.pdgId()) == 11 or abs(lept.pdgId()) == 13) and dr < 0.4: #print 'found ISR ',ph,lept leph = lept.p4() p4ph = ph.p4() p4 = ph.p4() + lept.p4() lept.setP4(p4) #print 'added ISR ',ph,lept self.leptons = [] for lept in tmpLept: self.leptons.append(lept) self.leptonJets = [] for lept in self.leptons: drmin = 999. ijet = -1 for i, jet in enumerate(self.jets): dr = deltaR(lept.eta(), lept.phi(), jet.eta(), jet.phi()) if dr < drmin: drmin = dr ijet = i if ijet >= 0: if drmin < 0.1: self.jets[ijet].setP4(lept.p4()) self.jets[ijet].setPdgId(lept.pdgId()) self.leptonJets.append(self.jets[ijet])
def buildLeptonList(self,event): self.jets = [] for ptj in self.handles['jets'].product(): self.jets.append(Jet(ptj)) self.leptons = [] for pte in self.handles['electrons'].product(): self.leptons.append(Lepton(pte)) for ptm in self.handles['muons'].product(): self.leptons.append(Lepton(ptm)) self.photons = [] for ptg in self.handles['photons'].product(): if ptg.energy() > 1.0 : self.photons.append(Photon(ptg)) # Find FSR tmpLept = set(self.leptons) for lept in self.leptons : leptonIso = self.leptonIso(lept) if leptonIso > 0.2 : tmpLept.remove(lept) continue #if (self.eleele or self.mumu or self.tautau ) : # print self.eleele, self.mumu, self.tautau,lept, leptonIso for i,ph in enumerate(self.photons) : dr = deltaR(lept.eta(),lept.phi(),ph.eta(),ph.phi()) if (abs(lept.pdgId())==11 or abs(lept.pdgId())==13) and dr < 0.4 : #print 'found ISR ',ph,lept leph = lept.p4() p4ph = ph.p4() p4 = ph.p4() + lept.p4() lept.setP4(p4) #print 'added ISR ',ph,lept self.leptons = [] for lept in tmpLept : self.leptons.append(lept) self.leptonJets = [] for lept in self.leptons : drmin = 999. ijet = -1 for i,jet in enumerate(self.jets) : dr = deltaR(lept.eta(),lept.phi(),jet.eta(),jet.phi()) if dr < drmin : drmin = dr ijet = i if ijet >= 0 : if drmin < 0.1 : self.jets[ijet].setP4(lept.p4()) self.jets[ijet].setPdgId(lept.pdgId()) self.leptonJets.append(self.jets[ijet])
def calculateJetVars(self,fourLepton,jets,cleanDR = 0.5): #Apply ID idJets = filter(lambda x:x.looseJetId() and x.passPuJetId('full', 2),jets) #Cross clean from leptons cleanedJets = filter(lambda x: deltaR(x.eta(),x.phi(),fourLepton.leg1.leg1.eta(),fourLepton.leg1.leg1.phi())>cleanDR and \ deltaR(x.eta(),x.phi(),fourLepton.leg1.leg2.eta(),fourLepton.leg1.leg2.phi())>cleanDR and \ deltaR(x.eta(),x.phi(),fourLepton.leg2.leg1.eta(),fourLepton.leg2.leg1.phi())>cleanDR and \ deltaR(x.eta(),x.phi(),fourLepton.leg2.leg2.eta(),fourLepton.leg2.leg2.phi())>cleanDR,idJets) bJets = filter(lambda x: x.bDiscriminator('combinedSecondaryVertexBJetTags')>0.224,cleanedJets) jetVars=dict() jetVars['nJets']=len(cleanedJets) jetVars['nBJets']=len(bJets) jetVars['nBJetsTight']=len(filter(lambda x: x.bDiscriminator('combinedSecondaryVertexBJetTags')>0.679,cleanedJets)) ht=0 if len(bJets) >=2: jetVars['Mbb'] = (bJets[0].p4()+bJets[1].p4()).M() else: jetVars['Mbb']=-99 for jet in cleanedJets: ht = ht + jet.pt() jetVars['HT'] = ht if len(cleanedJets)>2: jetVars['Mjjj'] = (cleanedJets[0].p4()+cleanedJets[1].p4()+cleanedJets[2].p4()).M() else: jetVars['Mjjj'] = -99. if len(cleanedJets)>1: jetVars['dEta'] = cleanedJets[0].eta()-cleanedJets[1].eta() jetVars['dPhi'] = deltaPhi(cleanedJets[0].phi(),cleanedJets[1].phi()) jetVars['Mjj'] = (cleanedJets[0].p4()+cleanedJets[1].p4()).M() jetVars['Ptjj'] = (cleanedJets[0].p4()+cleanedJets[1].p4()).Pt() else: jetVars['dEta'] = -99 jetVars['dPhi'] = -99 jetVars['Mjj'] = -99 jetVars['Ptjj'] = -99 if len(cleanedJets)>0: #Add leading jet variables highestJet = max(cleanedJets,key=lambda x:x.pt()) jetVars['leadingPt']=highestJet.pt() jetVars['leadingEta']=highestJet.eta() else: jetVars['leadingPt']=-99. jetVars['leadingEta']=-99. fourLepton.jets = jetVars
def fillDiLepton(tree, diLepton): fill(tree, 'visMass', diLepton.mass()) fill(tree, 'svfitMass', diLepton.massSVFit()) fill(tree, 'pZetaMET', diLepton.pZetaMET()) fill(tree, 'pZetaVis', diLepton.pZetaVis()) fill(tree, 'pZetaDisc', diLepton.pZetaDisc()) fill(tree, 'mt', diLepton.mTLeg2()) fill(tree, 'mtleg1', diLepton.mTLeg1()) fill(tree, 'met', diLepton.met().pt()) fill(tree, 'metphi', diLepton.met().phi()) pthiggs = (diLepton.leg1().p4() + diLepton.leg2().p4() + diLepton.met().p4()).pt() fill(tree, 'pthiggs', pthiggs) l1eta = diLepton.leg1().eta() l2eta = diLepton.leg2().eta() l1phi = diLepton.leg1().phi() l2phi = diLepton.leg2().phi() metphi = diLepton.met().phi() fill(tree, 'deltaPhiL1L2', deltaPhi(l1phi, l2phi)) fill(tree, 'deltaEtaL1L2', abs(l1eta - l2eta)) fill(tree, 'deltaRL1L2', deltaR(l1eta, l1phi, l2eta, l2phi)) fill(tree, 'deltaPhiL1MET', deltaPhi(l1phi, metphi)) fill(tree, 'deltaPhiL2MET', deltaPhi(l2phi, metphi))
def recoverZ(self,z): ''' Run the recovewry algorithm. Associates a photon to the Z''' #merge the photons photons = z.leg1.photons+z.leg2.photons #Filter by MassZ photons = filter(lambda x: (TLorentzVector(x.px(),x.py(),x.pz(),x.energy())+z).M()<self.cfg.maxZMass,photons) #filter by mass improvement photons= filter(lambda x: abs((TLorentzVector(x.px(),x.py(),x.pz(),x.energy())+z).M()-91.188)<abs(z.M()-91.188),photons) if self.verbose: for photon in photons: print 'photon for recovery',photon.pt(),photon.eta(),photon.phi() #Split the high Pt and low Pt region photonsHighPt = filter(lambda x: x.pt()>self.cfg.minPhotonPtTight,photons) photonsLowPt = filter(lambda x: x.pt()<=self.cfg.minPhotonPtTight,photons) photonsHighPt=sorted(photonsHighPt,key=lambda x: x.pt(),reverse=True) # if there is high Pt photon get it photon=None if len(photonsHighPt)>0: #associate it to the Z photon=photonsHighPt[0] elif len(photonsLowPt): #sort by angle photonsLowPt = sorted(photonsLowPt,key=lambda x: min(deltaR(z.leg1.eta(),z.leg1.phi(),x.eta(),x.phi()),deltaR(z.leg2.eta(),z.leg2.phi(),x.eta(),x.phi()))) photon=photonsLowPt[0] if photon is not None: z.setFSR(photon)
def testDeltaR(self, diLepton): '''returns True if the two diLepton.leg1() and .leg2() have a delta R larger than the dR_min parameter.''' dR = deltaR(diLepton.leg1().eta(), diLepton.leg1().phi(), diLepton.leg2().eta(), diLepton.leg2().phi()) return dR > self.cfg_ana.dR_min
def recoverZ(self, z): ''' Run the recovewry algorithm. Associates a photon to the Z''' #merge the photons photons = z.leg1.photons + z.leg2.photons #Filter by MassZ photons = filter( lambda x: (TLorentzVector(x.px(), x.py(), x.pz(), x.energy()) + z). M() < self.cfg.maxZMass, photons) #filter by mass improvement photons = filter( lambda x: abs((TLorentzVector(x.px(), x.py(), x.pz(), x.energy()) + z).M() - 91.188) < abs(z.M() - 91.188), photons) if self.verbose: for photon in photons: print 'photon for recovery', photon.pt(), photon.eta( ), photon.phi() #Split the high Pt and low Pt region photonsHighPt = filter(lambda x: x.pt() > self.cfg.minPhotonPtTight, photons) photonsLowPt = filter(lambda x: x.pt() <= self.cfg.minPhotonPtTight, photons) photonsHighPt = sorted(photonsHighPt, key=lambda x: x.pt(), reverse=True) # if there is high Pt photon get it photon = None if len(photonsHighPt) > 0: #associate it to the Z photon = photonsHighPt[0] elif len(photonsLowPt): #sort by angle photonsLowPt = sorted( photonsLowPt, key=lambda x: min( deltaR(z.leg1.eta(), z.leg1.phi(), x.eta(), x.phi()), deltaR(z.leg2.eta(), z.leg2.phi(), x.eta(), x.phi()))) photon = photonsLowPt[0] if photon is not None: z.setFSR(photon)
def fillLepton( tree, pName, lepton ): fillParticle(tree, pName, lepton ) fill(tree, '{pName}_pdgId'.format(pName=pName), lepton.pdgId() ) fill(tree, '{pName}_charge'.format(pName=pName), lepton.charge() ) fill(tree, '{pName}_sip3d'.format(pName=pName), lepton.sip3D() ) fill(tree, '{pName}_sip3ds'.format(pName=pName), signedSip3D(lepton) ) fill(tree, '{pName}_ip3ds'.format(pName=pName), signedIp3D(lepton) ) fill(tree, '{pName}_dxy'.format(pName=pName), lepton.dxy() ) fill(tree, '{pName}_dz'.format(pName=pName), lepton.dz() ) fill(tree, '{pName}_relIso'.format(pName=pName), lepton.relIso(dBetaFactor=0.5)) fill(tree, '{pName}_chargedIso'.format(pName=pName), lepton.chargedHadronIso()) fill(tree, '{pName}_mvaIso'.format(pName=pName), lepton.mvaIso()) if hasattr(lepton, 'jet'): #fill(tree, '{pName}_ptRelJet'.format(pName=pName), lepton.ptRelJet) fill(tree, '{pName}_jetPtRatio'.format(pName=pName), lepton.pt()/lepton.jet.pt()) fill(tree, '{pName}_jetBTagCSV'.format(pName=pName), lepton.jet.btag('combinedSecondaryVertexBJetTags') if hasattr(lepton.jet, 'btag') else -99) #fill(tree, '{pName}_jetBTagTCHE'.format(pName=pName), # lepton.jet.btag('trackCountingHighEffBJetTags') if hasattr(lepton.jet, 'btag') else -99) fill(tree, '{pName}_jetDR'.format(pName=pName), deltaR(lepton.eta(),lepton.phi(),lepton.jet.eta(),lepton.jet.phi())) #fill(tree, '{pName}_jetSelf'.format(pName=pName), lepton.jet.pdgId() == lepton.pdgId()) #fill(tree, '{pName}_jetChHadMultiplicity'.format(pName=pName), lepton.jet.component(1).number() if hasattr(lepton.jet, 'component') else 0) #fill(tree, '{pName}_jetChHadEnergyFraction'.format(pName=pName), lepton.jet.component(1).fraction() if hasattr(lepton.jet, 'component') else 0) #fill(tree, '{pName}_jetPhoMultiplicity'.format(pName=pName), lepton.jet.component(4).number() if hasattr(lepton.jet, 'component') else 0) #fill(tree, '{pName}_jetPhoEnergyFraction'.format(pName=pName), lepton.jet.component(4).fraction() if hasattr(lepton.jet, 'component') else 0) #fill(tree, '{pName}_jetMuEnergyFraction'.format(pName=pName), lepton.jet.component(3).fraction() if hasattr(lepton.jet, 'component') else 0) if abs(lepton.pdgId())==11: fill(tree, '{pName}_pfpt'.format(pName=pName), lepton.sourcePtr().p4(ROOT.reco.GsfElectron.P4_PFLOW_COMBINATION).Pt()) fill(tree, '{pName}_innerHits'.format(pName=pName), lepton.numberOfHits()) fill(tree, '{pName}_mvaId'.format(pName=pName), lepton.mvaNonTrigV0()) fill(tree, '{pName}_tightId'.format(pName=pName), lepton.mvaTrigV0()) fill(tree, '{pName}_convVeto'.format(pName=pName), lepton.sourcePtr().passConversionVeto()) #fill(tree, '{pName}_relIso03'.format(pName=pName), (lepton.chargedHadronIso(0.3) + max(((lepton.neutralHadronIso(0.3)+lepton.photonIso(0.3))-0.5*(lepton.puChargedHadronIso(0.3))),0))) fill(tree, '{pName}_relIso03'.format(pName=pName), lepton.chargedHadronIso(0.3) + max(lepton.neutralHadronIso(0.3)+lepton.photonIso(0.3)-lepton.rho*lepton.EffectiveArea,0)) if abs(lepton.pdgId())==13: fill(tree, '{pName}_pfpt'.format(pName=pName), lepton.sourcePtr().pfP4().Pt()) fill(tree, '{pName}_innerHits'.format(pName=pName), lepton.sourcePtr().innerTrack().numberOfValidHits()) fill(tree, '{pName}_tightId'.format(pName=pName), lepton.tightId()) if hasattr(lepton, 'jet'): fill(tree, '{pName}_mva'.format(pName=pName), lepton.mvaValue) if hasattr(lepton, 'mvaNoCorr'): fill(tree, '{pName}_mvaNoCorr'.format(pName=pName), lepton.mvaNoCorr) fill(tree, '{pName}_mvaDoubleCorr'.format(pName=pName), lepton.mvaDoubleCorr) if hasattr(lepton, 'mcMatchId'): fill(tree, '{pName}_mcMatchTau'.format(pName=pName), lepton.mcMatchTau) fill(tree, '{pName}_mcMatchId'.format(pName=pName), lepton.mcMatchId) fill(tree, '{pName}_mcMatchAny'.format(pName=pName), lepton.mcMatchAny) fill(tree, '{pName}_mcDeltaRB'.format(pName=pName), lepton.mcDeltaRB) if abs(lepton.pdgId()) == 13: fill(tree, '{pName}_tightCharge'.format(pName=pName), lepton.sourcePtr().innerTrack().ptError()/lepton.sourcePtr().innerTrack().pt() < 0.2) elif abs(lepton.pdgId()) == 11: fill(tree, '{pName}_tightCharge'.format(pName=pName), lepton.sourcePtr().isGsfCtfScPixChargeConsistent() + lepton.sourcePtr().isGsfScPixChargeConsistent()) # charge misid vars (Jason) if abs(lepton.pdgId()) == 11: ele = lepton.sourcePtr() fill(tree, '{pName}_eleQ_pRelDiff'.format(pName=pName), abs(ele.superCluster().energy()-ele.gsfTrack().p())/ele.gsfTrack().p()) fill(tree, '{pName}_eleQ_gsfCtfQ'.format(pName=pName), ele.isGsfCtfChargeConsistent())
def testDiLeptonGhostSuppression(self, diLepton): leptons = [diLepton.leg1, \ diLepton.leg2] for l1,l2 in itertools.combinations(leptons,2): if deltaR(l1.eta(),l1.phi(),l2.eta(),l2.phi())<0.02: return False return True
def matchPromtTau(self, event, lep, particleID): for genp in event.genParticles: if abs(genp.pdgId())==15: for k in range(0,genp.numberOfDaughters()): if(deltaR(genp.daughter(k).p4().Eta(),genp.daughter(k).p4().Phi(),lep.p4().Eta(),lep.p4().Phi() ) < 0.2) and genp.daughter(k).pdgId()==particleID: return 1 return 0
def leptonIso( self, lepton ): phpt = 0. for ph in self.photons: dr = deltaR(lepton.eta(), lepton.phi(), ph.eta(), ph.phi()) if dr < 0.4 : phpt += ph.pt() return max(0., lepton.relIso() - phpt/lepton.pt())
def leptonIso(self, lepton): phpt = 0. for ph in self.photons: dr = deltaR(lepton.eta(), lepton.phi(), ph.eta(), ph.phi()) if dr < 0.4: phpt += ph.pt() return max(0., lepton.relIso() - phpt / lepton.pt())
def matchCMGmuon(self, event, lep): for i in range(0, min(len(event.ZallMuons), 10)): if (deltaR(event.ZallMuons[i].p4().Eta(), event.ZallMuons[i].p4().Phi(), lep.p4().Eta(), lep.p4().Phi()) < 0.1): return i return -99
def testFourLeptonTightIDZ2FSRBoth(self, fourLepton): photons=[] fsrExists=False if hasattr(fourLepton.leg1,'fsrPhoton'): fsrExists=True photons.append(fourLepton.leg1.fsrPhoton) if hasattr(fourLepton.leg2,'fsrPhoton'): fsrExists=True photons.append(fourLepton.leg2.fsrPhoton) if fsrExists: fourLepton.leg1.leg1.fsrPhotons=[] fourLepton.leg1.leg2.fsrPhotons=[] fourLepton.leg2.leg1.fsrPhotons=[] fourLepton.leg2.leg2.fsrPhotons=[] for gamma in photons: if deltaR(fourLepton.leg1.leg1.eta(),fourLepton.leg1.leg1.phi(),gamma.eta(),gamma.phi())<self.cfg_ana.FSR.leptonIsoCone: fourLepton.leg1.leg1.fsrPhotons.append(gamma) if deltaR(fourLepton.leg1.leg2.eta(),fourLepton.leg1.leg2.phi(),gamma.eta(),gamma.phi())<self.cfg_ana.FSR.leptonIsoCone: fourLepton.leg1.leg2.fsrPhotons.append(gamma) if deltaR(fourLepton.leg2.leg1.eta(),fourLepton.leg2.leg1.phi(),gamma.eta(),gamma.phi())<self.cfg_ana.FSR.leptonIsoCone: fourLepton.leg2.leg1.fsrPhotons.append(gamma) if deltaR(fourLepton.leg2.leg2.eta(),fourLepton.leg2.leg2.phi(),gamma.eta(),gamma.phi())<self.cfg_ana.FSR.leptonIsoCone: fourLepton.leg2.leg2.fsrPhotons.append(gamma) decision = self.testLeptonTight(fourLepton.leg2.leg1) and \ self.testLeptonTight(fourLepton.leg2.leg2) if hasattr(fourLepton.leg1.leg1,'fsrPhotons'): del fourLepton.leg1.leg1.fsrPhotons if hasattr(fourLepton.leg1.leg2,'fsrPhotons'): del fourLepton.leg1.leg2.fsrPhotons if hasattr(fourLepton.leg2.leg1,'fsrPhotons'): del fourLepton.leg2.leg1.fsrPhotons if hasattr(fourLepton.leg2.leg2,'fsrPhotons'): del fourLepton.leg2.leg2.fsrPhotons return decision
def recoverLeg(self,leg): ''' Run the recovewry algorithm. Associates a photon to the Z''' #Prefilter photons=leg.photons photonsHighPt = filter(lambda x: x.pt()>self.cfg.minPhotonPtTight,photons) photonsLowPt = filter(lambda x: x.pt()<=self.cfg.minPhotonPtTight,photons) photonsHighPt=sorted(photonsHighPt,key=lambda x: x.pt(),reverse=True) photon=None if len(photonsHighPt)>0: photon=photonsHighPt[0] elif len(photonsLowPt): photonsLowPt = sorted(photonsLowPt,key=lambda x: deltaR(x.eta(),x.phi(),leg.eta(),leg.phi())) photon=photonsLowPt[0] if photon is not None: if deltaR(photon.eta(),photon.phi(),leg.eta(),leg.phi())<self.cfg.leptonIsoCone: leg.fsrPhoton=photon
def matchPromt(self, event, lep, particleID): for genp in event.genParticles: if (deltaR(lep.p4().Eta(), lep.p4().Phi(), genp.p4().Eta(), genp.p4().Phi()) < 0.2) and genp.status() == 3 and genp.pdgId( ) == particleID: # status three are always promt return 1 return 0
def countBPartons(self,event): event.allBPartons = [ q for q in event.genParticles if abs(q.pdgId()) == 5 and abs(q.status()) == 2 and abs(q.pt()) > 15 ] event.allBPartons.sort(key = lambda q : q.pt(), reverse = True) event.bPartons = [] for q in event.allBPartons: duplicate = False for q2 in event.bPartons: if deltaR(q.eta(),q.phi(),q2.eta(),q2.phi()) < 0.5: duplicate = True continue if not duplicate: event.bPartons.append(q)
def doBTag(self,iEvent,event): bs = [] for gp in event.genParticles: if gp.status() != 2: continue id = abs(gp.pdgId()) if id == 5 or ((id % 1000) / 100) == 5 or ((id % 10000)/1000) == 5: bs.append(gp) for j in event.cleanJetsAll: for gp in bs: if deltaR(gp.eta(),gp.phi(),j.eta(),j.phi()) < 0.4: gp.btag = True
def doBTag(self, iEvent, event): bs = [] for gp in event.genParticles: if gp.status() != 2: continue id = abs(gp.pdgId()) if id == 5 or ((id % 1000) / 100) == 5 or ((id % 10000) / 1000) == 5: bs.append(gp) for j in event.cleanJetsAll: for gp in bs: if deltaR(gp.eta(), gp.phi(), j.eta(), j.phi()) < 0.4: gp.btag = True
def attachToClosestLepton(self,photon): nearestLepton=None dr=1000. for lepton in self.leptons: drNew = deltaR(lepton.eta(),lepton.phi(),photon.eta(),photon.phi()) if drNew<dr: dr=drNew nearestLepton=lepton if (nearestLepton is not None) and dr<self.cfg.maxLeptonPhotonDR: if dr<self.cfg.maxLeptonPhotonDRTight or (dr> self.cfg.maxLeptonPhotonDRTight and (photon.chargedHadronIso()+photon.photonIso()+photon.neutralHadronIso()+photon.puChargedHadronIso())/photon.pt()<self.cfg.maxPhotonDBIso and photon.pt()>self.cfg.minPhotonPtTight): nearestLepton.photons.append(photon)
def __call__(self,object): hasOverlap=False if abs(object.pdgId()) ==self.sourcePdgId: for p in self.collection: if abs(p.pdgId()) ==self.targetPdgId: if self.targetID(p)==True: if deltaR(object.eta(),object.phi(),p.eta(),p.phi())<self.dr: hasOverlap=True if hasOverlap: return False else: return True
def __call__(self, object): hasOverlap = False if abs(object.pdgId()) == self.sourcePdgId: for p in self.collection: if abs(p.pdgId()) == self.targetPdgId: if self.targetID(p) == True: if deltaR(object.eta(), object.phi(), p.eta(), p.phi()) < self.dr: hasOverlap = True if hasOverlap: return False else: return True
def makeTaus(self, event): event.selectedTaus = [] event.looseTaus = [] event.inclusiveTaus = [] #get all alltaus = map(Tau, self.handles['taus'].product()) foundTau = False for tau in alltaus: tau.associatedVertex = event.goodVertices[0] tau.lepVeto = False if self.cfg_ana.vetoLeptons: for lep in event.selectedLeptons: if deltaR(lep.eta(), lep.phi(), tau.eta(), tau.phi()) < self.cfg_ana.leptonVetoDR: tau.lepVeto = True if tau.lepVeto: continue if tau.pt() < self.cfg_ana.ptMin: continue if abs(tau.dxy()) > 0.5 or abs(tau.dz()) > 1.0: continue foundTau = True def id3(tau, X): """Create an integer equal to 1-2-3 for (loose,medium,tight)""" return tau.tauID(X % "Loose") + tau.tauID( X % "Medium") + tau.tauID(X % "Tight") tau.idMVA2 = id3(tau, "by%sIsolationMVA2") tau.idCI3hit = id3(tau, "by%sCombinedIsolationDeltaBetaCorr3Hits") #print "Tau pt %5.1f: idMVA2 %d, idCI3hit %d, %s, %s" % (tau.pt(), tau.idMVA2, tau.idCI3hit, tau.tauID(self.cfg_ana.tauID), tau.tauID(self.cfg_ana.tauLooseID)) if tau.tauID(self.cfg_ana.tauID): event.selectedTaus.append(tau) event.inclusiveTaus.append(tau) elif tau.tauID(self.cfg_ana.tauLooseID): event.looseTaus.append(tau) event.inclusiveTaus.append(tau) event.selectedTaus.sort(key=lambda l: l.pt(), reverse=True) event.looseTaus.sort(key=lambda l: l.pt(), reverse=True) self.counters.counter('events').inc('all events') if foundTau: self.counters.counter('events').inc('has >=1 tau at preselection') if len(event.selectedTaus): self.counters.counter('events').inc('has >=1 selected taus') if len(event.looseTaus): self.counters.counter('events').inc('has >=1 loose taus') if len(event.inclusiveTaus): self.counters.counter('events').inc('has >=1 inclusive taus')
def doJets(self, iEvent, event): event.cleanJetsAll = [] event.cleanJetsFwd = [] event.cleanJets = [] for j in self.mchandles['jets'].product(): if j.pt() < 25: continue for l in event.selectedLeptons: if l.pt() > 10 and deltaR(l.eta(), l.phi(), j.eta(), j.phi()) < 0.5: continue jo = JetFromGen(j) event.cleanJetsAll.append(jo) if abs(j.eta()) < 2.4: event.cleanJetsAll.append(jo) else: event.cleanJetsFwd.append(jo)
def buildTauList(self,event): llpairs = self.findPairs(self.leptonJets) dm = 999. event.llmass = 0. llindex = -1 for ill,ll in enumerate(llpairs) : if abs(ll.M()-91.2) < dm: dm = abs(ll.M()-91.2) event.llmass = ll.M() llindex = ill self.zLeptons = [] self.zLeptons.append(llpairs[llindex].leg1) self.zLeptons.append(llpairs[llindex].leg2) event.zLeptons = self.zLeptons event.zPair = llpairs[llindex] # define also an umatched jet list to see what is remaining self.unmatch=set(self.jets) # tau candidates (including low energy leptons) self.tauJets = [] for hadtau in self.hadtaus: self.tauJets.append(hadtau) for jet in self.jets: if deltaR(hadtau.eta(),hadtau.phi(),jet.eta(),jet.phi()) < 0.2: self.unmatch.remove(jet) for leptonJet in set(self.leptonJets): if leptonJet in self.unmatch: self.unmatch.remove(leptonJet) if leptonJet not in event.zLeptons: self.tauJets.append(leptonJet) # this is before pfjets # tmpJets = set(self.jets) # tmpLeptons = set(event.zLeptons) # for leptonJet in tmpLeptons: # tmpJets.remove(leptonJet) # self.tauJets = [] # for jet in tmpJets: # self.tauJets.append(jet) self.tauJets.sort(key=lambda a: a.energy(), reverse = True)
def buildTauList(self, event): llpairs = self.findPairs(self.leptonJets) dm = 999. event.llmass = 0. llindex = -1 for ill, ll in enumerate(llpairs): if abs(ll.M() - 91.2) < dm: dm = abs(ll.M() - 91.2) event.llmass = ll.M() llindex = ill self.zLeptons = [] self.zLeptons.append(llpairs[llindex].leg1) self.zLeptons.append(llpairs[llindex].leg2) event.zLeptons = self.zLeptons event.zPair = llpairs[llindex] # define also an umatched jet list to see what is remaining self.unmatch = set(self.jets) # tau candidates (including low energy leptons) self.tauJets = [] for hadtau in self.hadtaus: self.tauJets.append(hadtau) for jet in self.jets: if deltaR(hadtau.eta(), hadtau.phi(), jet.eta(), jet.phi()) < 0.2: self.unmatch.remove(jet) for leptonJet in set(self.leptonJets): if leptonJet in self.unmatch: self.unmatch.remove(leptonJet) if leptonJet not in event.zLeptons: self.tauJets.append(leptonJet) # this is before pfjets # tmpJets = set(self.jets) # tmpLeptons = set(event.zLeptons) # for leptonJet in tmpLeptons: # tmpJets.remove(leptonJet) # self.tauJets = [] # for jet in tmpJets: # self.tauJets.append(jet) self.tauJets.sort(key=lambda a: a.energy(), reverse=True)
def fParticleVars( pName, particle ): fill('{pName}Mass'.format(pName=pName), particle.mass() ) fill('{pName}Pt'.format(pName=pName), particle.pt() ) fill('{pName}Energy'.format(pName=pName), particle.energy() ) fill('{pName}Eta'.format(pName=pName), particle.eta() ) fill('{pName}Phi'.format(pName=pName), particle.phi() ) #fill('{pName}Charge'.format(pName=pName), particle.charge() ) if particle.numberOfDaughters() > 1: fill('{pName}deltaEtaDecay'.format(pName=pName), abs(particle.daughter(0).eta() - particle.daughter(1).eta() )) fill('{pName}deltaPhiDecay'.format(pName=pName), deltaPhi(particle.daughter(0).phi(), particle.daughter(1).phi() )) fill('{pName}deltaRDecay'.format(pName=pName), deltaR(particle.daughter(0).eta(), particle.daughter(0).phi(), particle.daughter(1).eta(), particle.daughter(1).phi() )) if (pName == 'jj'): fill('{pName}btag1'.format(pName=pName), particle.daughter(0).btag(7)) fill('{pName}btag2'.format(pName=pName), particle.daughter(1).btag(7))
def attachToClosestLepton(self, photon): nearestLepton = None dr = 1000. for lepton in self.leptons: drNew = deltaR(lepton.eta(), lepton.phi(), photon.eta(), photon.phi()) if drNew < dr: dr = drNew nearestLepton = lepton if (nearestLepton is not None) and dr < self.cfg.maxLeptonPhotonDR: if dr < self.cfg.maxLeptonPhotonDRTight or ( dr > self.cfg.maxLeptonPhotonDRTight and (photon.chargedHadronIso() + photon.photonIso() + photon.neutralHadronIso() + photon.puChargedHadronIso()) / photon.pt() < self.cfg.maxPhotonDBIso and photon.pt() > self.cfg.minPhotonPtTight): nearestLepton.photons.append(photon)
def process(self, iEvent, event): super(TopCandidateTreeAnalyzer,self).process(iEvent, event) self.readCollections( iEvent ) tr = self.tree event.jetsAlgos = {} # massTopCandidates = dict.fromkeys(self.listOfJetCollections,[]) for jetColl in self.listOfJetCollections : #grab jet collection with label jetColl event.jetsAlgos[jetColl] = self.buildTopJets( self.mchandles[jetColl].product(), event ) #grab fit parameters for this collection r = self.fitParameters[jetColl][0] sigma = self.fitParameters[jetColl][1] esigma = self.fitParameters[jetColl][2] mean = self.fitParameters[jetColl][3] emean = self.fitParameters[jetColl][4] for jet in event.jetsAlgos[jetColl] : if (jet.mass() > ( mean - 3*sigma ) and jet.mass() < ( mean + 3*sigma ) ) : fill( tr, 'massOfTopCandidate_' + jetColl, jet.mass()) fill( tr, 'ptOfTopCandidate_' + jetColl, jet.pt()) fill( tr, 'nConstituentsOfTopCandidate_' + jetColl, len( jet.getJetConstituents()) ) for tagger in self.listOfBTagsAlgos : nBTags = 0 for constituent in jet.getJetConstituents() : if constituent.getSelection('cuts_'+tagger) : nBTags+=1 fill( tr, 'nBTags_' + tagger + '_OfTopCandidate_' + jetColl, nBTags ) dRjetGenTop = 1000. for gen in event.genParticles : if (gen.status() == 3): if ( abs( gen.pdgId() ) == 6 ): dRjetGenTop = min( dRjetGenTop, deltaR( jet.eta(), jet.phi(), gen.eta(), gen.phi() ) ) fill( tr, 'isMatched_' + jetColl, dRjetGenTop < 0.5 ) self.tree.tree.Fill() # analyze each top cand #474self.tree.tree.Fill() # analyze each top cand return True
def photonPreFilter(self, photon): '''Generic cross cleaning of photons''' if self.verbose: print 'prefilter gamma', photon.pt(), photon.eta(), photon.phi() for leg in self.leptons: DR = deltaR(photon.eta(), photon.phi(), leg.eta(), leg.phi()) Deta = abs(photon.eta() - leg.eta()) Dphi = abs(deltaPhi(photon.phi(), leg.phi())) if self.verbose: print '---->vs leg', leg.pdgId(), self.electronID( leg), leg.pt(), leg.eta(), leg.phi(), '|', DR, Deta, Dphi if abs(leg.pdgId()) == 11 and self.electronID(leg): if DR < self.cfg.vetoElectronDR: return False if Deta < self.cfg.vetoElectronDEta and Dphi < self.cfg.vetoElectronDPhi: return False return True
def photonPreFilter(self,photon): '''Generic cross cleaning of photons''' if self.verbose: print 'prefilter gamma',photon.pt(),photon.eta(),photon.phi() for leg in self.leptons: DR = deltaR(photon.eta(),photon.phi(),leg.eta(),leg.phi()) Deta = abs(photon.eta()-leg.eta()) Dphi = abs(deltaPhi(photon.phi(),leg.phi())) if self.verbose: print '---->vs leg',leg.pdgId(),self.electronID(leg),leg.pt(),leg.eta(),leg.phi(),'|',DR,Deta,Dphi if abs(leg.pdgId())==11 and self.electronID(leg): if DR<self.cfg.vetoElectronDR: return False if Deta <self.cfg.vetoElectronDEta and Dphi<self.cfg.vetoElectronDPhi: return False return True
def makeTaus(self, event): event.selectedTaus = [] event.looseTaus = [] event.inclusiveTaus = [] #get all alltaus = map( Tau, self.handles['taus'].product() ) foundTau = False for tau in alltaus: tau.associatedVertex = event.goodVertices[0] tau.lepVeto = False if self.cfg_ana.vetoLeptons: for lep in event.selectedLeptons: if deltaR(lep.eta(), lep.phi(), tau.eta(), tau.phi()) < self.cfg_ana.leptonVetoDR: tau.lepVeto = True if tau.lepVeto: continue if tau.pt() < self.cfg_ana.ptMin: continue if abs(tau.dxy()) > 0.5 or abs(tau.dz()) > 1.0: continue foundTau = True def id3(tau,X): """Create an integer equal to 1-2-3 for (loose,medium,tight)""" return tau.tauID(X%"Loose") + tau.tauID(X%"Medium") + tau.tauID(X%"Tight") tau.idMVA2 = id3(tau, "by%sIsolationMVA2") tau.idCI3hit = id3(tau, "by%sCombinedIsolationDeltaBetaCorr3Hits") #print "Tau pt %5.1f: idMVA2 %d, idCI3hit %d, %s, %s" % (tau.pt(), tau.idMVA2, tau.idCI3hit, tau.tauID(self.cfg_ana.tauID), tau.tauID(self.cfg_ana.tauLooseID)) if tau.tauID(self.cfg_ana.tauID): event.selectedTaus.append(tau) event.inclusiveTaus.append(tau) elif tau.tauID(self.cfg_ana.tauLooseID): event.looseTaus.append(tau) event.inclusiveTaus.append(tau) event.selectedTaus.sort(key = lambda l : l.pt(), reverse = True) event.looseTaus.sort(key = lambda l : l.pt(), reverse = True) self.counters.counter('events').inc('all events') if foundTau: self.counters.counter('events').inc('has >=1 tau at preselection') if len(event.selectedTaus): self.counters.counter('events').inc('has >=1 selected taus') if len(event.looseTaus): self.counters.counter('events').inc('has >=1 loose taus') if len(event.inclusiveTaus): self.counters.counter('events').inc('has >=1 inclusive taus')
def process(self, iEvent, event): self.readCollections( iEvent ) event.topCandidates = {} jetCollBin = 0 for jetColl in self.listOfJetCollections : #grab jet collection with label jetColl event.topCandidates[jetColl] = self.buildTopJets( self.mchandles[jetColl].product(), event ) self.numberOfTopCandidates.Fill(jetCollBin, len(event.topCandidates[jetColl]) ) self.numberOfTopCandidates.GetXaxis().SetBinLabel(jetCollBin+1, jetColl) jetCollBin+=1 jetCollBin0 = 0 for jetColl0 in self.listOfJetCollections : jetCollBin1 = 0 for jetColl1 in self.listOfJetCollections : if ( jetColl0 == jetColl1 and not ( jetCollBin0*4 + len(event.topCandidates[jetColl0]) == jetCollBin1*4 +len(event.topCandidates[jetColl1]) ) ) : print jetColl0, jetColl1 self.numberOfTopCandidatesAvsA.Fill( jetCollBin0*4 + len(event.topCandidates[jetColl0]), jetCollBin1*4 +len(event.topCandidates[jetColl1]) ) self.numberOfTopCandidatesAvsA.GetXaxis().SetBinLabel(jetCollBin0*4 +1, re.sub('Recluster','',re.sub('topCandidates','',jetColl0))) self.numberOfTopCandidatesAvsA.GetYaxis().SetBinLabel(jetCollBin1*4 +1, re.sub('Recluster','',re.sub('topCandidates','',jetColl1))) jetCollBin1+=1 if ( len( event.topCandidates[jetColl0] ) == len( event.topCandidates[jetColl1] )) : for topCand0 in event.topCandidates[jetColl0] : dRtop0top1 = 100 for topCand1 in event.topCandidates[jetColl1] : dRtop0top1 = min(dRtop0top1, deltaR(topCand0.eta(), topCand0.phi(),topCand1.eta(),topCand1.phi() )) self.histosdR[jetColl0+'_'+jetColl1].Fill( dRtop0top1 ) if (dRtop0top1 < 0.3): self.histosPtMatchedTopCandidates[jetColl0+'_'+jetColl1].Fill( topCand0.pt(), topCand1.pt()) self.histosEtaMatchedTopCandidates[jetColl0+'_'+jetColl1].Fill( topCand0.eta(), topCand1.eta()) self.histosPhiMatchedTopCandidates[jetColl0+'_'+jetColl1].Fill( topCand0.phi(), topCand1.phi()) jetCollBin0+=1 return True
def doJets(self,iEvent,event): event.cleanJetsAll = [] event.cleanJetsFwd = [] event.cleanJets = [] for j in self.mchandles['jets'].product(): visfrac = 1.0 - j.invisibleEnergy()/j.energy() if j.pt()*visfrac < 25: continue #print "mc jet with pt %.1f, eta %.1f, vis %.1f, invis %.1f" % (j.pt(), j.eta(), j.emEnergy()+j.hadEnergy(), j.invisibleEnergy()) islepton = False for l in event.selectedLeptons: if l.pt() > 10 and deltaR(l.eta(),l.phi(),j.eta(),j.phi()) < 0.5: #print " ---> it's a lepton" islepton = True break if islepton: continue j.setP4(j.p4()*visfrac) jo = JetFromGen(j) event.cleanJetsAll.append(jo) if abs(j.eta()) < 2.4: event.cleanJets.append(jo) else: event.cleanJetsFwd.append(jo)
def fillDiLepton(tree, diLepton): fill(tree, 'visMass', diLepton.mass()) fill(tree, 'svfitMass', diLepton.massSVFit()) fill(tree, 'pZetaMET', diLepton.pZetaMET()) fill(tree, 'pZetaVis', diLepton.pZetaVis()) fill(tree, 'pZetaDisc', diLepton.pZetaDisc()) fill(tree, 'mt', diLepton.mTLeg2()) fill(tree, 'met', diLepton.met().pt()) pthiggs = (diLepton.leg1().p4()+diLepton.leg2().p4()+diLepton.met().p4()).pt() fill(tree, 'pthiggs', pthiggs) l1eta = diLepton.leg1().eta() l2eta = diLepton.leg2().eta() l1phi = diLepton.leg1().phi() l2phi = diLepton.leg2().phi() metphi = diLepton.met().phi() fill(tree, 'deltaPhiL1L2', deltaPhi(l1phi, l2phi)) fill(tree, 'deltaEtaL1L2', abs(l1eta-l2eta)) fill(tree, 'deltaRL1L2', deltaR(l1eta, l1phi, l2eta, l2phi)) fill(tree, 'deltaPhiL1MET', deltaPhi(l1phi, metphi)) fill(tree, 'deltaPhiL2MET', deltaPhi(l2phi, metphi))
def dR(x,y,x2=None,y2=None): if x2 != None: return deltaR(x,y,x2,y2) return deltaR(x.eta(),x.phi(),y.eta(),y.phi())
NTupleVariable("ip3d", lambda x : abs(signedIp3D(x)) , help="d_{3d} with respect to PV, in cm (absolute value)"), NTupleVariable("sip3d", lambda x : x.sip3D(), help="S_{ip3d} with respect to PV (absolute value)"), NTupleVariable("tightId", lambda x : x.tightId(), int, help="POG Tight ID (based on triggering MVA value for electrons, boolean for muons)"), NTupleVariable("convVeto", lambda x : x.sourcePtr().passConversionVeto() if abs(x.pdgId())==11 else 1, int, help="Conversion veto (always true for muons)"), NTupleVariable("lostHits", lambda x : x.numberOfHits() if abs(x.pdgId())==11 else x.sourcePtr().innerTrack().trackerExpectedHitsInner().numberOfLostHits(), int, help="Number of lost hits on inner track") ]) leptonTypeTTH = NTupleObjectType("leptonTTH", baseObjectTypes = [ leptonType ], variables = [ NTupleVariable("relIso", lambda x : x.relIso(dBetaFactor=0.5), help="PF Iso, R=0.4, with deltaBeta correction"), NTupleVariable("chargedRelIso", lambda x : x.chargedHadronIso()/x.pt(), help="PF Iso from charged hadrons only, R=0.4"), NTupleVariable("tightCharge", lambda lepton : ( lepton.sourcePtr().isGsfCtfScPixChargeConsistent() + lepton.sourcePtr().isGsfScPixChargeConsistent() ) if abs(lepton.pdgId()) == 11 else 2*(lepton.sourcePtr().innerTrack().ptError()/lepton.sourcePtr().innerTrack().pt() < 0.2), int, help="Tight charge criteria"), NTupleVariable("mvaId", lambda lepton : lepton.mvaNonTrigV0() if abs(lepton.pdgId()) == 11 else 1, help="EGamma POG MVA ID for non-triggering electrons (as HZZ); 1 for muons"), NTupleVariable("mvaIdTrig", lambda lepton : lepton.mvaTrigV0() if abs(lepton.pdgId()) == 11 else 1, help="EGamma POG MVA ID for triggering electrons; 1 for muons"), NTupleVariable("mva", lambda lepton : lepton.mvaValue, help="Lepton MVA (ttH version)"), NTupleVariable("jetPtRatio", lambda lepton : lepton.pt()/lepton.jet.pt()), NTupleVariable("jetBTagCSV", lambda lepton : lepton.jet.btag('combinedSecondaryVertexBJetTags') if hasattr(lepton.jet, 'btag') else -99), NTupleVariable("jetDR", lambda lepton : deltaR(lepton.eta(),lepton.phi(),lepton.jet.eta(),lepton.jet.phi())), NTupleVariable("mcMatchId", lambda x : x.mcMatchId, int, mcOnly=True, help="Match to source from hard scatter (25 for H, 6 for t, 23/24 for W/Z)"), NTupleVariable("mcMatchAny", lambda x : x.mcMatchAny, int, mcOnly=True, help="Match to any final state leptons: -mcMatchId if prompt, 0 if unmatched, 1 if light flavour, 2 if heavy flavour (b)"), NTupleVariable("mcMatchAny2", lambda x : x.mcMatchAny2, int, mcOnly=True, help="Match to any final state leptons: -mcMatchId if prompt, 0 if unmatched, 1 if light flavour, 2 if heavy flavour (b)"), NTupleVariable("mcMatchTau", lambda x : x.mcMatchTau, int, mcOnly=True, help="True if the leptons comes from a tau"), NTupleVariable("convVetoFull", lambda x : (x.sourcePtr().passConversionVeto() and x.numberOfHits() == 0) if abs(x.pdgId())==11 else 1, int, help="Conv veto + no missing hits for electrons, always true for muons."), ]) leptonTypeSusy = NTupleObjectType("leptonSusy", baseObjectTypes = [ leptonType ], variables = [ # Loose id NTupleVariable("looseIdSusy", lambda x : x.looseIdSusy if hasattr(x, 'looseIdSusy') else -1, int, help="Loose ID for Susy ntuples (always true on selected leptons)"), # Isolations with the two radia NTupleVariable("relIso03", lambda x : x.relIso03, help="PF Rel Iso, R=0.3, with deltaBeta correction for muons and rho corrections for electrons"), NTupleVariable("relIso04", lambda x : x.relIso04, help="PF Rel Iso, R=0.4, with deltaBeta correction for muons and rho corrections for electrons"), NTupleVariable("chargedHadRelIso03", lambda x : x.chargedHadronIso(0.3)/x.pt(), help="PF Rel Iso, R=0.3, charged hadrons only"), NTupleVariable("chargedHadRelIso04", lambda x : x.chargedHadronIso(0.4)/x.pt(), help="PF Rel Iso, R=0.4, charged hadrons only"), # Extra electron id variables
def fillLepton(tree, pName, lepton): fillParticle(tree, pName, lepton) fill(tree, '{pName}_pdgId'.format(pName=pName), lepton.pdgId()) fill(tree, '{pName}_charge'.format(pName=pName), lepton.charge()) fill(tree, '{pName}_sip3d'.format(pName=pName), lepton.sip3D()) fill(tree, '{pName}_sip3ds'.format(pName=pName), signedSip3D(lepton)) fill(tree, '{pName}_ip3ds'.format(pName=pName), signedIp3D(lepton)) fill(tree, '{pName}_dxy'.format(pName=pName), lepton.dxy()) fill(tree, '{pName}_dz'.format(pName=pName), lepton.dz()) fill(tree, '{pName}_relIso'.format(pName=pName), lepton.relIso(dBetaFactor=0.5)) fill(tree, '{pName}_chargedIso'.format(pName=pName), lepton.chargedHadronIso()) fill(tree, '{pName}_mvaIso'.format(pName=pName), lepton.mvaIso()) if hasattr(lepton, 'jet'): #fill(tree, '{pName}_ptRelJet'.format(pName=pName), lepton.ptRelJet) fill(tree, '{pName}_jetPtRatio'.format(pName=pName), lepton.pt() / lepton.jet.pt()) fill( tree, '{pName}_jetBTagCSV'.format(pName=pName), lepton.jet.btag('combinedSecondaryVertexBJetTags') if hasattr( lepton.jet, 'btag') else -99) #fill(tree, '{pName}_jetBTagTCHE'.format(pName=pName), # lepton.jet.btag('trackCountingHighEffBJetTags') if hasattr(lepton.jet, 'btag') else -99) fill( tree, '{pName}_jetDR'.format(pName=pName), deltaR(lepton.eta(), lepton.phi(), lepton.jet.eta(), lepton.jet.phi())) #fill(tree, '{pName}_jetSelf'.format(pName=pName), lepton.jet.pdgId() == lepton.pdgId()) #fill(tree, '{pName}_jetChHadMultiplicity'.format(pName=pName), lepton.jet.component(1).number() if hasattr(lepton.jet, 'component') else 0) #fill(tree, '{pName}_jetChHadEnergyFraction'.format(pName=pName), lepton.jet.component(1).fraction() if hasattr(lepton.jet, 'component') else 0) #fill(tree, '{pName}_jetPhoMultiplicity'.format(pName=pName), lepton.jet.component(4).number() if hasattr(lepton.jet, 'component') else 0) #fill(tree, '{pName}_jetPhoEnergyFraction'.format(pName=pName), lepton.jet.component(4).fraction() if hasattr(lepton.jet, 'component') else 0) #fill(tree, '{pName}_jetMuEnergyFraction'.format(pName=pName), lepton.jet.component(3).fraction() if hasattr(lepton.jet, 'component') else 0) if abs(lepton.pdgId()) == 11: fill( tree, '{pName}_pfpt'.format(pName=pName), lepton.sourcePtr().p4( ROOT.reco.GsfElectron.P4_PFLOW_COMBINATION).Pt()) fill(tree, '{pName}_innerHits'.format(pName=pName), lepton.numberOfHits()) fill(tree, '{pName}_mvaId'.format(pName=pName), lepton.mvaNonTrigV0()) fill(tree, '{pName}_tightId'.format(pName=pName), lepton.mvaTrigV0()) fill(tree, '{pName}_convVeto'.format(pName=pName), lepton.sourcePtr().passConversionVeto()) #fill(tree, '{pName}_relIso03'.format(pName=pName), (lepton.chargedHadronIso(0.3) + max(((lepton.neutralHadronIso(0.3)+lepton.photonIso(0.3))-0.5*(lepton.puChargedHadronIso(0.3))),0))) fill( tree, '{pName}_relIso03'.format(pName=pName), lepton.chargedHadronIso(0.3) + max( lepton.neutralHadronIso(0.3) + lepton.photonIso(0.3) - lepton.rho * lepton.EffectiveArea, 0)) fill(tree, '{pName}_edxy'.format(pName=pName), lepton.sourcePtr().edB()) fill(tree, '{pName}_edz'.format(pName=pName), lepton.sourcePtr().gsfTrack().dzError()) fill( tree, '{pName}_pxb1'.format(pName=pName), lepton.sourcePtr().gsfTrack().hitPattern(). hasValidHitInFirstPixelBarrel()) fill( tree, '{pName}_pxlay'.format(pName=pName), lepton.sourcePtr().gsfTrack().hitPattern(). pixelLayersWithMeasurement()) fill( tree, '{pName}_ehi'.format(pName=pName), lepton.sourcePtr().gsfTrack().trackerExpectedHitsInner(). numberOfLostHits()) fill( tree, '{pName}_eho'.format(pName=pName), lepton.sourcePtr().gsfTrack().trackerExpectedHitsOuter(). numberOfLostHits()) if abs(lepton.pdgId()) == 13: fill(tree, '{pName}_pfpt'.format(pName=pName), lepton.sourcePtr().pfP4().Pt()) fill(tree, '{pName}_innerHits'.format(pName=pName), lepton.sourcePtr().innerTrack().numberOfValidHits()) fill(tree, '{pName}_tightId'.format(pName=pName), lepton.tightId()) fill(tree, '{pName}_edxy'.format(pName=pName), lepton.sourcePtr().edB()) fill(tree, '{pName}_edz'.format(pName=pName), lepton.sourcePtr().innerTrack().dzError()) fill( tree, '{pName}_pxb1'.format(pName=pName), lepton.sourcePtr().innerTrack().hitPattern(). hasValidHitInFirstPixelBarrel()) fill( tree, '{pName}_pxlay'.format(pName=pName), lepton.sourcePtr().innerTrack().hitPattern(). pixelLayersWithMeasurement()) fill( tree, '{pName}_ehi'.format(pName=pName), lepton.sourcePtr().innerTrack().trackerExpectedHitsInner(). numberOfLostHits()) fill( tree, '{pName}_eho'.format(pName=pName), lepton.sourcePtr().innerTrack().trackerExpectedHitsOuter(). numberOfLostHits()) fill( tree, '{pName}_ptRelErr'.format(pName=pName), lepton.sourcePtr().innerTrack().ptError() / abs(lepton.sourcePtr().innerTrack().pt())) fill(tree, '{pName}_segComp'.format(pName=pName), lepton.sourcePtr().segmentCompatibility()) fill(tree, '{pName}_caloComp'.format(pName=pName), lepton.sourcePtr().caloCompatibility()) fill(tree, '{pName}_nStat'.format(pName=pName), lepton.sourcePtr().numberOfMatchedStations()) fill(tree, '{pName}_muTimeValid'.format(pName=pName), lepton.sourcePtr().isTimeValid()) fill(tree, '{pName}_timeIpInOut'.format(pName=pName), lepton.sourcePtr().time().timeAtIpInOut) fill(tree, '{pName}_timeIpInOutErr'.format(pName=pName), lepton.sourcePtr().time().timeAtIpInOutErr) #fill(tree, '{pName}_dEdx'.format(pName=pName), lepton.dEdX.dEdx() ) #fill(tree, '{pName}_dEdxErr'.format(pName=pName), lepton.dEdX.dEdxError() ) if hasattr(lepton, 'jet'): fill(tree, '{pName}_mva'.format(pName=pName), lepton.mvaValue) if hasattr(lepton, 'mvaNoCorr'): fill(tree, '{pName}_mvaNoCorr'.format(pName=pName), lepton.mvaNoCorr) fill(tree, '{pName}_mvaDoubleCorr'.format(pName=pName), lepton.mvaDoubleCorr) if hasattr(lepton, 'mcMatchId'): fill(tree, '{pName}_mcMatchTau'.format(pName=pName), lepton.mcMatchTau) fill(tree, '{pName}_mcMatchId'.format(pName=pName), lepton.mcMatchId) fill(tree, '{pName}_mcMatchAny'.format(pName=pName), lepton.mcMatchAny) fill(tree, '{pName}_mcMatchAny2'.format(pName=pName), lepton.mcMatchAny2) fill(tree, '{pName}_mcDeltaRB'.format(pName=pName), lepton.mcDeltaRB) if abs(lepton.pdgId()) == 13: fill( tree, '{pName}_tightCharge'.format(pName=pName), lepton.sourcePtr().innerTrack().ptError() / lepton.sourcePtr().innerTrack().pt() < 0.2) elif abs(lepton.pdgId()) == 11: fill( tree, '{pName}_tightCharge'.format(pName=pName), lepton.sourcePtr().isGsfCtfScPixChargeConsistent() + lepton.sourcePtr().isGsfScPixChargeConsistent()) # charge misid vars (Jason) if abs(lepton.pdgId()) == 11: ele = lepton.sourcePtr() fill( tree, '{pName}_eleQ_pRelDiff'.format(pName=pName), abs(ele.superCluster().energy() - ele.gsfTrack().p()) / ele.gsfTrack().p()) fill(tree, '{pName}_eleQ_gsfCtfQ'.format(pName=pName), ele.isGsfCtfChargeConsistent())
def selectionSequence(self, event, fillCounter): if fillCounter: self.counters.counter('ZAna').inc('Z all triggered events') # retrieve collections of interest (muons and jets) # loop over eletrons event.ZselElectrons = [electron for electron in event.ZElectrons if \ electron.pt()>20 and \ self.testElectronIDMedium(electron) and \ self.testElectronVtxMedium(electron,event)] # self.testElectronVtxMediumTight(electron,event) #and electron event.ZElTightID = [] event.ZElTightIso = [] event.ZElMediumID = [] event.ZElMediumIso = [] event.ZElIsPromt = [] for i in range(0, min(len(event.ZselElectrons), 9)): if self.testElectronIDTight(event.ZselElectrons[i]): event.ZElTightID.append(1) else: event.ZElTightID.append(0) if self.testElectronIDMedium(event.ZselElectrons[i]): event.ZElMediumID.append(1) else: event.ZElMediumID.append(0) if self.testElectronVtxTight(event.ZselElectrons[i], event): event.ZElTightIso.append(1) else: event.ZElTightIso.append(0) if self.testElectronVtxMedium(event.ZselElectrons[i], event): event.ZElMediumIso.append(1) else: event.ZElMediumIso.append(0) # print 'looping on muons' event.ZallMuons = copy.copy(event.Zmuons) event.ZallMuonsTrig = my_n.zeros(10, dtype=int) event.ZallMuonsID = [] event.ZallMuonsMatched = [] event.ZallMuonsSelMatched = [] if len(event.ZallMuons) > 0: for i in range(0, min(len(event.ZallMuons), 9)): #print self.cfg_comp.triggers if (event.passedTriggerAnalyzer): if (self.trigMatched(event, event.ZallMuons[i])): event.ZallMuonsTrig[i] = 1. else: event.ZallMuonsTrig[i] = 0. else: event.ZallMuonsTrig[i] = 0. if ((event.ZallMuons[i].isGlobalMuon() or event.ZallMuons[i].isTrackerMuon()) and len(event.goodVertices) > 0): event.ZallMuons[i].associatedVertex = event.goodVertices[0] if self.testLegID(event.ZallMuons[i]): event.ZallMuonsID.append(1.) else: event.ZallMuonsID.append(0.) else: event.ZallMuonsID.append(0.) event.ZselTriggeredMuons = [] event.ZselNoTriggeredMuons = [] event.ZselNoTriggeredExtraMuonsLeadingPt = [] event.ZallJets = copy.copy(event.Zjets) event.ZselJets = [] # check if the event is MC and if genp must be saved event.savegenpZ = True if not (self.cfg_ana.savegenp and self.cfg_comp.isMC): event.savegenpZ = False if self.cfg_comp.isMC: if len(event.ZallMuons) > 0: for i in range(0, min(len(event.ZallMuons), 9)): if ((self.matchPromt(event, event.ZallMuons[i], -13 * event.ZallMuons[i].charge()) + self.matchPromtTau(event, event.ZallMuons[i], -13 * event.ZallMuons[i].charge())) > 0): event.ZallMuonsMatched.append(1.) else: event.ZallMuonsMatched.append(0.) for i in range(0, min(len(event.ZselElectrons), 9)): if (self.matchPromt(event, event.ZselElectrons[i], -11 * event.ZselElectrons[i].charge()) + self.matchPromtTau( event, event.ZselElectrons[i], -11 * event.ZselElectrons[i].charge())) > 0: event.ZElIsPromt.append(1) #print 'promt dude' else: event.ZElIsPromt.append(0) #print 'just kidding' # save genp only for signal events # i.e. only one Z is present and daughters are muons genZ_dummy = [ genp for genp in event.genParticles if \ math.fabs(genp.pdgId())==23 ] if len(genZ_dummy) == 1: event.genZ = [ genp for genp in genZ_dummy if \ math.fabs(genp.daughter(0).pdgId())==13 ] event.genMuPos = [] event.genMuNeg = [] event.genMuPosStatus1 = [] event.genMuNegStatus1 = [] if len(event.genZ) == 1: # if the genp event is selected, associate gen muons # if(event.genZ[0].daughter(0).pdgId()==13): if (event.genZ[0].daughter(0).charge() > 0): event.genMuPos.append(event.genZ[0].daughter(0)) # print event.genZ[0].daughter(0).pdgId(),' event.genZ[0].daughter(0).charge()= ',event.genZ[0].daughter(0).charge() event.genMuNeg.append(event.genZ[0].daughter(1)) else: event.genMuPos.append(event.genZ[0].daughter(1)) event.genMuNeg.append(event.genZ[0].daughter(0)) if (len(event.genMuNeg) > 0): event.genMuNegStatus1.append( self.returnMuonDaughterStatus1(event.genMuNeg[0])) if (len(event.genMuPos) > 0): event.genMuPosStatus1.append( self.returnMuonDaughterStatus1(event.genMuPos[0])) event.genZ_mt = self.mT(event.genZ[0].daughter(0).p4(), event.genZ[0].daughter(1).p4()) event.muPosGenDeltaRgenP = 1e6 event.muNegGenDeltaRgenP = 1e6 else: # if the genp is not signal, don't save genp but do not exit # -----> events which will pass the reconstruction but are not signal # can be considered as background (for example, in Z+Jets, from Z decaying into electrons, taus) event.savegenpZ = False else: event.savegenpZ = False # store event MET and jets in all gen events (necessary to make cuts in genp studies...) event.ZpfmetNoMu = event.pfmet.p4() # clean jets by removing muons event.ZselJets = [ jet for jet in event.ZallJets if (jet.looseJetId() and jet.pt() > 10) #not (bestMatch( jet , event.ZallMuons ))[1] <0.01 \ #and jet.looseJetId() and jet.pt()>10 \ #jet.looseJetId() and jet.pt()>10 \ # ) ] # reco events must have good reco vertex and trigger fired... if not (event.passedVertexAnalyzer): return True # ...and at lest two reco muons... if len(event.ZallMuons) < 2: return True if fillCounter: self.counters.counter('ZAna').inc('Z >= 2 lepton') # check if the event is triggered according to cfg_ana # store separately muons that fired the trigger #if len(self.cfg_comp.triggers)>0: # muon object trigger matching #event.ZselTriggeredMuons = [lep for lep in event.ZallMuons if \ # self.trigMatched(event, lep)] # if len(event.ZselTriggeredMuons) == 0 : # return True, 'trigger matching failed' # else: # if fillCounter : self.counters.counter('ZAna').inc('Z at least 1 lep trig matched') # store muons that did not fire the trigger event.ZselNoTriggeredMuons = [lep for lep in event.ZallMuons] # check wether there are muons that did not fire the trigger, if so print some info # if len(event.ZselNoTriggeredMuons)>0: # print 'len(event.ZallMuons)= ',len(event.ZallMuons),' len(event.ZselTriggeredMuons)= ',len(event.ZselTriggeredMuons),' len(event.ZselNoTriggeredMuons)= ', len(event.ZselNoTriggeredMuons) # check for muon pair (with at least 1 triggering muon) which give invariant mass closest to Z pole event.BestZMuonPairList = self.BestZMuonPair( event.ZselNoTriggeredMuons) # mZ mu1 (always firing trigger) mu2 mu2 has fired trigger? # print 'event.BestZMuonPairList= ',event.BestZMuonPairList[0],' ',event.BestZMuonPairList[1],' ',event.BestZMuonPairList[2],' ',event.BestZMuonPairList[3] # check that a good muon pair exists, otherwise reject reco event if event.BestZMuonPairList[0] > 1e6: # return True, 'good muon pair not found (probably same charge)' return True, 'good muon pair not found' else: if fillCounter: self.counters.counter('ZAna').inc('Z good muon pair found') event.ZselNoTriggeredExtraMuonsLeadingPt = [lep for lep in event.ZselNoTriggeredMuons if \ lep !=event.BestZMuonPairList[2]] # if(len(event.ZselNoTriggeredExtraMuonsLeadingPt)>0 and lep.pt()>10): # return True, 'rejecting, non triggering leading extra muon has pT > 10 GeV' # print 'len(event.ZallMuons)= ',len(event.ZallMuons),' len(event.ZselTriggeredMuons)= ',len(event.ZselTriggeredMuons),' len(event.ZselNoTriggeredMuons)= ', len(event.ZselNoTriggeredMuons) # print 'event.BestZMuonPairList= ',event.BestZMuonPairList[0],' ',event.BestZMuonPairList[1],' ',event.BestZMuonPairList[2],' ',event.BestZMuonPairList[3],' ',event.ZselNoTriggeredExtraMuonsLeadingPt[0].pt() # else: # if fillCounter : self.counters.counter('ZAna').inc('Z non trg leading extra muon pT < 10 GeV') # Initialize MVAMet and retrieve it iLeadJet = 0 i2ndJet = 0 if (len(event.ZselJets) > 0): iLeadJet = event.ZselJets[0].p4() # if(len(event.ZselJets)>0): i2ndJet = event.ZselJets[0].p4() if (len(event.ZselJets) > 1): i2ndJet = event.ZselJets[1].p4() # print 'iLeadJet= ',iLeadJet, ' i2ndJet=',i2ndJet # self.mvamet.addVisObject(event.BestZMuonPairList[0].p4()) # visObjectP4s_array = [event.BestZMuonPairList[0].p4(),event.BestZMuonPairList[0].p4()] iJets_p4 = [] iJets_mva = [] iJets_neutFrac = [] for jet in event.ZselJets: iJets_p4.append(jet.p4()) iJets_mva.append(float(0)) iJets_neutFrac.append(float(0.5)) # self.mvamet.getMet( # # event.pfmet, #iPFMet, # event.pfMetForRegression, #iPFMet, # event.tkmet, #iTKMet, # event.nopumet, #iNoPUMet, # event.pumet, #iPUMet, # event.pucmet, #iPUCMet, # iLeadJet, #event.ZselJets[0], #iLeadJet, # i2ndJet, #event.ZselJets[1], #i2ndJet, # len(event.ZselJets), #iNJetsGt30, # len(event.allJets), #iNJetsGt1, # len(self.handles['vertices'].product()), #iNGoodVtx, # iJets_p4, #iJets, # iJets_mva, #iJets, # iJets_neutFrac, #iJets, # False, #iPrintDebug, # visObjectP4s_array #visObjectP4s # ) # GetMet_first = self.mvamet.GetMet_first(); # GetMet_second = self.mvamet.GetMet_second(); # associate properly positive and negative muons if (event.BestZMuonPairList[1].charge() > 0): event.BestZPosMuon = event.BestZMuonPairList[1] event.BestZNegMuon = event.BestZMuonPairList[2] else: event.BestZPosMuon = event.BestZMuonPairList[2] event.BestZNegMuon = event.BestZMuonPairList[1] # check the triggers if (self.trigMatched(event, event.BestZPosMuon)): event.BestZPosMuonHasTriggered = 1 else: event.BestZPosMuonHasTriggered = 0 if (self.trigMatched(event, event.BestZNegMuon)): event.BestZNegMuonHasTriggered = 1 else: event.BestZNegMuonHasTriggered = 0 # if the genp are saved, compute dR between gen and reco muons if event.savegenpZ: event.muPosGenDeltaRgenP = deltaR(event.BestZPosMuon.eta(), event.BestZPosMuon.phi(), event.genMuPos[0].eta(), event.genMuPos[0].phi()) event.muNegGenDeltaRgenP = deltaR(event.BestZNegMuon.eta(), event.BestZNegMuon.phi(), event.genMuNeg[0].eta(), event.genMuNeg[0].phi()) # associate lepton to good vertex to muons to compute dxy event.BestZPosMuon.associatedVertex = event.goodVertices[0] event.BestZNegMuon.associatedVertex = event.goodVertices[0] # testing offline muon cuts (tight+iso, no kinematical cuts) event.BestZPosMuonIsTightAndIso = 0 if self.testLeg(event.BestZPosMuon): event.BestZPosMuonIsTightAndIso = 1 event.BestZNegMuonIsTightAndIso = 0 if self.testLeg(event.BestZNegMuon): event.BestZNegMuonIsTightAndIso = 1 event.BestZPosMuonIsTight = 0 if self.testLegID(event.BestZPosMuon): event.BestZPosMuonIsTight = 1 event.BestZNegMuonIsTight = 0 if self.testLegID(event.BestZNegMuon): event.BestZNegMuonIsTight = 1 event.BestZNegMatchIndex = self.matchCMGmuon(event, event.BestZNegMuon) event.BestZPosMatchIndex = self.matchCMGmuon(event, event.BestZPosMuon) # assign negative lepton to MET to build W+ event.ZpfmetWpos = event.ZpfmetNoMu + event.BestZNegMuon.p4() # assign positive lepton to MET to build W- event.ZpfmetWneg = event.ZpfmetNoMu + event.BestZPosMuon.p4() # define a positive W from positive lepton and MET event.Wpos4VfromZ = event.BestZPosMuon.p4() + event.ZpfmetWpos event.Wpos4VfromZ_mt = self.mT(event.BestZPosMuon.p4(), event.ZpfmetWpos) # define a negative W from negative lepton and MET event.Wneg4VfromZ = event.BestZNegMuon.p4() + event.ZpfmetWneg event.Wneg4VfromZ_mt = self.mT(event.BestZNegMuon.p4(), event.ZpfmetWneg) # define a Z from the two leptons event.Z4V = event.BestZPosMuon.p4() + event.BestZNegMuon.p4() event.Z4V_mt = self.mT(event.BestZPosMuon.p4(), event.BestZNegMuon.p4()) # Code to study the Z recoil metVect = event.ZpfmetNoMu.Vect() metVect.SetZ(0.) # use only transverse info ZVect = event.Z4V.Vect() ZVect.SetZ(0.) # use only transverse info recoilVect = -copy.deepcopy( metVect) ## FIXED (met sign inverted) vU = - vMET - vZ recoilVect -= ZVect #print 'What must be true' uZVect = ZVect.Unit() zAxis = type(ZVect)(0, 0, 1) uZVectPerp = ZVect.Cross(zAxis).Unit() u1 = recoilVect.Dot(uZVect) # recoil parallel to Z pt u2 = -recoilVect.Dot(uZVectPerp) # recoil perpendicular to Z pt event.Zu1 = u1 event.Zu2 = u2 # test # recoilVect_test = - event.ZpfmetNoMu.Vect() - event.Z4V.Vect # recoilVect_test.SetZ(0.) # event.Zu1_test = recoilVect_test.Dot() # # Code to study the WPos-like recoil # metVectWlikePos = event.ZpfmetWpos.Vect() # metVectWlikePos.SetZ(0.) # use only transverse info # MuPosVect = event.BestZPosMuon.p4().Vect() # MuPosVect.SetZ(0.) # use only transverse info # recoilMuPosVect = copy.deepcopy(metVectWlikePos) # recoilMuPosVect -= MuPosVect # uMuPosVect = MuPosVect.Unit() # zAxis = type(MuPosVect)(0,0,1) # uMuPosVectPerp = MuPosVect.Cross(zAxis).Unit() # u1WPos = - recoilMuPosVect.Dot(uMuPosVect) # recoil parallel to WlikePos lepton pt # u2WPos = recoilMuPosVect.Dot(uMuPosVectPerp) # recoil perpendicular to WlikePos lepton pt # event.Zu1WPos = u1WPos # event.Zu2WPos = u2WPos if fillCounter: if event.Wpos4VfromZ.M() > 50: self.counters.counter('ZAna').inc('Z Inv Mass>50') if event.BestZPosMuonIsTightAndIso: self.counters.counter('ZAna').inc( 'Z pos Mu is MuIsTightAndIso') if self.testLegKine(event.BestZPosMuon, 30 * 91.1876 / 80.385, 2.1): self.counters.counter('ZAna').inc( 'Z pos Mu_eta<2.1 && Mu_pt>30*MZ/MW') if self.testLegKine(event.BestZNegMuon, 10, 2.4): self.counters.counter('ZAna').inc( 'Z neg Mu_eta<2.4 && Mu_pt>10') if event.ZpfmetWpos.Pt() > 25 * 91.1876 / 80.385: self.counters.counter('ZAna').inc( 'Z pfmet>25*MZ/MW') if event.Wpos4VfromZ.Pt( ) < 20 * 91.1876 / 80.385: self.counters.counter('ZAna').inc( 'Z pt<20*MZ/MW') if len(event.ZselJets) > 0: if event.ZselJets[0].pt() < 30: self.counters.counter('ZAna').inc( 'Z Jet_leading_pt<30') else: self.counters.counter('ZAna').inc( 'Z Jet_leading_pt<30') # event is fully considered as good # self.counters.counter('ZAna').inc('Z pass') event.ZGoodEvent = True # print 'must be true' # if event.BestZNegMuonHasTriggered+event.BestZPosMuonHasTriggered==0 : # print 'must be true' return True
def testJetIsNotSelLepton(self, jet, lep): '''returns testjetID && testjetIso && testjetKine for jet''' return deltaR(lep.p4().Eta(), lep.p4().Phi(), jet.p4().Eta(), jet.p4().Phi()) > 0.2
def process(self, iEvent, event): super(FatJetsTreeAnalyzer,self).process(iEvent, event) self.readCollections( iEvent ) tr = self.tree self.nTotEvents +=1 event.topCandidates = {} for algo in self.listOfFatJetAlgos : event.topCandidates[algo] = self.buildTopCandidates( self.mchandles[algo].product(), event ) for topCand in event.topCandidates[algo] : fill( tr, 'pt', topCand.pt() ) fill( tr, 'eta', topCand.eta() ) fill( tr, 'phi', topCand.phi() ) fill( tr, 'mass', topCand.mass() ) radius = re.sub('p','.',re.findall("[0-9]p[0-9]+",algo)[0]) fill( tr, 'radius', radius ) sumPt = 0. nConst = 0. csvValues = [] for const in topCand.getJetConstituents(): sumPt+= const.pt() nConst+=1. fill( tr, 'sumPtOvernConst', sumPt / nConst ) csvValues.append({"btag":const.btag("combinedSecondaryVertexBJetTags"),"mass":const.mass(), "pt":const.pt()}) csvValues = sorted(csvValues, key=lambda csvValues: csvValues["btag"], reverse = True) if len(csvValues)>1: fill( tr, 'secondBtag_btag' , csvValues[1]["btag"] ) fill( tr, 'secondBtag_pt' , csvValues[1]["pt"] ) fill( tr, 'secondBtag_mass' , csvValues[1]["mass"] ) fill( tr, 'firstBtag_btag' , csvValues[0]["btag"] ) fill( tr, 'firstBtag_pt' , csvValues[0]["pt"] ) fill( tr, 'firstBtag_mass' , csvValues[0]["mass"] ) elif len(csvValues)>0 : fill( tr, 'secondBtag_btag' , -1. ) fill( tr, 'secondBtag_pt' , -1. ) fill( tr, 'secondBtag_mass' , -1. ) fill( tr, 'firstBtag_btag' , csvValues[0]["btag"] ) fill( tr, 'firstBtag_pt' , csvValues[0]["pt"] ) fill( tr, 'firstBtag_mass' , csvValues[0]["mass"] ) else : fill( tr, 'secondBtag_btag' , -1. ) fill( tr, 'secondBtag_pt' , -1. ) fill( tr, 'secondBtag_mass' , -1. ) fill( tr, 'firstBtag_btag' , -1. ) fill( tr, 'firstBtag_pt' , -1. ) fill( tr, 'firstBtag_mass' , -1. ) ## fill( tr, 'invMassClosestToW' , topCand.pt() ) dR = 1000. matchedMass = -1000. for gen in event.genParticles: if abs(gen.pdgId())==6 : dRtmp = dR dR = min(dR, deltaR( topCand.eta(), topCand.phi(), gen.eta(), gen.phi())) if not(dR == dRtmp): matchedMass = gen.mass() fill( tr, 'dR', dR ) if dR < 0.3 and (abs(topCand.mass() - 185.)< 50.): fill( tr, 'isMatched' , 1 ) else : fill( tr, 'isMatched' , 0 ) self.tree.tree.Fill() mLSP = 0 mStop = 0 for gen in event.genParticles: # if (self.nTotEvents % 100 == 0): if abs(gen.pdgId())==1000006 : mStop = gen.mass() if abs(gen.pdgId())==1000022 : mLSP = gen.mass() self.mStopmLSP.Fill(mStop, mLSP) fill( tr, 'mStop' , mStop ) fill( tr, 'mLSP' , mLSP ) event.WCandidates = self.buildTopCandidates( self.mchandles['W'].product(), event ) if (len(event.WCandidates)): fillParticle(tr, 'W0', event.WCandidates[0] ) if (len(event.WCandidates)>1): fillParticle(tr, 'W1', event.WCandidates[1] ) if (len(event.WCandidates)>2): fillParticle(tr, 'W2', event.WCandidates[2] ) return True
def dR(x, y, x2=None, y2=None): if x2 != None: return deltaR(x, y, x2, y2) return deltaR(x.eta(), x.phi(), y.eta(), y.phi())
def matchCMGmuon(self, event, lep): for i in range(0, min(len(event.ZallMuons),10)): if(deltaR(event.ZallMuons[i].p4().Eta(),event.ZallMuons[i].p4().Phi(),lep.p4().Eta(),lep.p4().Phi() ) < 0.1): return i return -99
NTupleVariable("ip3d", lambda x : abs(signedIp3D(x)) , help="d_{3d} with respect to PV, in cm (absolute value)"), NTupleVariable("sip3d", lambda x : x.sip3D(), help="S_{ip3d} with respect to PV (absolute value)"), NTupleVariable("relIso", lambda x : x.relIso(dBetaFactor=0.5), help="PF Iso, R=0.4, with deltaBeta correction"), NTupleVariable("chargedRelIso", lambda x : x.chargedHadronIso()/x.pt(), help="PF Iso from charged hadrons only, R=0.4"), NTupleVariable("tightId", lambda x : x.tightId(), int, help="POG Tight ID (based on triggering MVA value for electrons, boolean for muons)"), NTupleVariable("convVeto", lambda x : x.sourcePtr().passConversionVeto() if abs(x.pdgId())==11 else 1, int, help="Conversion veto (always true for muons)"), NTupleVariable("lostHits", lambda x : x.numberOfHits() if abs(x.pdgId())==11 else x.sourcePtr().innerTrack().trackerExpectedHitsInner().numberOfLostHits(), int, help="Number of lost hits on inner track") ]) leptonTypeTTH = NTupleObjectType("leptonTTH", baseObjectTypes = [ leptonType ], variables = [ NTupleVariable("tightCharge", lambda lepton : ( lepton.sourcePtr().isGsfCtfScPixChargeConsistent() + lepton.sourcePtr().isGsfScPixChargeConsistent() ) if abs(lepton.pdgId()) == 11 else 2*(lepton.sourcePtr().innerTrack().ptError()/lepton.sourcePtr().innerTrack().pt() < 0.2), int, help="Tight charge criteria"), NTupleVariable("mvaId", lambda lepton : lepton.mvaNonTrigV0() if abs(lepton.pdgId()) == 11 else 1, help="EGamma POG MVA ID for non-triggering electrons (as HZZ); 1 for muons"), NTupleVariable("mvaIdTrig", lambda lepton : lepton.mvaTrigV0() if abs(lepton.pdgId()) == 11 else 1, help="EGamma POG MVA ID for triggering electrons; 1 for muons"), NTupleVariable("mva", lambda lepton : lepton.mvaValue, help="Lepton MVA (ttH version)"), NTupleVariable("jetPtRatio", lambda lepton : lepton.pt()/lepton.jet.pt()), NTupleVariable("jetBTagCSV", lambda lepton : lepton.jet.btag('combinedSecondaryVertexBJetTags') if hasattr(lepton.jet, 'btag') else -99), NTupleVariable("jetDR", lambda lepton : deltaR(lepton.eta(),lepton.phi(),lepton.jet.eta(),lepton.jet.phi())), NTupleVariable("mcMatchId", lambda x : x.mcMatchId, int, mcOnly=True, help="Match to source from hard scatter (25 for H, 6 for t, 23/24 for W/Z)"), NTupleVariable("mcMatchAny", lambda x : x.mcMatchAny, int, mcOnly=True, help="Match to any final state leptons: -mcMatchId if prompt, 0 if unmatched, 1 if light flavour, 2 if heavy flavour (b)"), NTupleVariable("mcMatchTau", lambda x : x.mcMatchTau, int, mcOnly=True, help="True if the leptons comes from a tau"), NTupleVariable("convVetoFull", lambda x : (x.sourcePtr().passConversionVeto() and x.numberOfHits() == 0) if abs(x.pdgId())==11 else 1, int, help="Conv veto + no missing hits for electrons, always true for muons."), ]) leptonTypeSusyFR = NTupleObjectType("leptonSusyFR", baseObjectTypes = [ leptonTypeTTH ], variables = [ NTupleVariable("relIso03", lambda x : x.relIso03, help="PF Rel Iso, R, with deltaBeta correction"), NTupleVariable("looseFakeId", lambda x : x.looseFakeId, int, help="Loose ID for Susy Fake Rate exercise"), NTupleVariable("tightFakeId", lambda x : x.tightFakeId, int, help="Tight ID for Susy Fake Rate exercise"), #NTupleVariable("rho", lambda x : x.rho if hasattr(x, 'rho') else -99.0, help="PF Rel Iso, R, with deltaBeta correction"), #NTupleVariable("EA", lambda x : x.EffectiveArea if hasattr(x, 'EffectiveArea') else -99.0, help="PF Rel Iso, R, with deltaBeta correction"), #NTupleVariable("relIso03_ch", lambda x : x.chargedHadronIso(0.3) if abs(x.pdgId())==11 else 0, help="PF Rel Iso, R, with deltaBeta correction"), #NTupleVariable("relIso03_nh", lambda x : x.neutralHadronIso(0.3) if abs(x.pdgId())==11 else 0, help="PF Rel Iso, R, with deltaBeta correction"), #NTupleVariable("relIso03_ph", lambda x : x.photonIso(0.3) if abs(x.pdgId())==11 else 0, help="PF Rel Iso, R, with deltaBeta correction"), ])
def drllValues(self, event, pairSelection, maxLeps): return self.llValues( event, lambda l1, l2: deltaR(l1.eta(), l1.phi(), l2.eta(), l2.phi()), pairSelection, maxLeps)
for s in self.vars: s.set(lep,ncorr) return self.reader.EvaluateMVA(self.name) class CategorizedMVA: def __init__(self,catMvaPairs): self.catMvaPairs = catMvaPairs def __call__(self,lep,ncorr): for c,m in self.catMvaPairs: if c(lep): return m(lep,ncorr) return -99. _CommonSpect = [ ] _CommonVars = [ MVAVar("neuRelIso := relIso - chargedIso/pt",lambda x: x.relIso(dBetaFactor=0.5) - x.chargedHadronIso()/x.pt()), MVAVar("chRelIso := chargedIso/pt",lambda x: x.chargedHadronIso()/x.pt()), MVAVar("jetDR_in := min(dr_in,0.5)", lambda x : min(deltaR(x.eta(),x.phi(),x.jet.eta(),x.jet.phi()),0.5), corrfunc=ROOT.correctJetDRMC), MVAVar("jetPtRatio_in := min(ptf_in,1.5)", lambda x : min(x.pt()/x.jet.pt(),1.5), corrfunc=ROOT.correctJetPtRatioMC), MVAVar("jetBTagCSV_in := max(CSV_in,0)", lambda x : max( (x.jet.btag('combinedSecondaryVertexBJetTags') if hasattr(x.jet, 'btag') else -99) ,0.)), #MVAVar("jetDR_out := min(dr_out,5)", lambda x : min(x.dr_out,5.)), #MVAVar("jetPtRatio_out := min(ptf_out,1.5)", lambda x : min(x.ptf_out,1.5)), #MVAVar("jetBTagCSV_out := max(CSV_out,0)", lambda x : max(x.CSV_out,0.)), MVAVar("sip3d",lambda x: x.sip3D(), corrfunc=ROOT.scaleSip3dMC), ] _MuonVars = [ MVAVar("dxy := log(abs(dxy))",lambda x: log(abs(x.dxy())), corrfunc=ROOT.scaleDxyMC), MVAVar("dz := log(abs(dz))", lambda x: log(abs(x.dz())), corrfunc=ROOT.scaleDzMC), ] _ElectronVars = [ MVAVar("mvaId",lambda x: x.mvaNonTrigV0()),
def selectionSequence(self, event, fillCounter): if fillCounter: self.counters.counter('ZAna').inc('Z all triggered events') # retrieve collections of interest (muons and jets) if self.cfg_comp.isMC : if (hasattr(self.cfg_ana,'storeLHE_weight') and self.cfg_ana.storeLHE_weight): for i in range(0,event.LHEweights.comments_size()): if not "rwgt" in event.LHEweights.getComment(i).split()[0]: event.LHE_weights.append(float(event.LHEweights.getComment(i).split()[1])/float(event.LHEweights.getComment(206).split()[1])) # CHECK THE 216 FOR THE SAMPLE IN USE !!! if (hasattr(self.cfg_ana,'use_newWeights') and self.cfg_ana.use_newWeights): event.LHE_weights_str.append(event.LHEweights.getComment(i)) # if (hasattr(self.cfg_ana,'use_newWeights') and self.cfg_ana.use_newWeights): # print 'standard weights' # for i in range(0,len(event.LHE_weights_str)): # print i, event.LHE_weights_str[i].split()[0], float(event.LHE_weights_str[i].split()[1])/float(event.LHEweights.getComment(206).split()[1]), event.LHE_weights_str[i].split()[2], event.LHE_weights_str[i].split()[3], event.LHE_weights_str[i].split()[4], event.LHE_weights_str[i].split()[5], event.LHE_weights_str[i].split()[6] if (hasattr(self.cfg_ana,'use_newWeights') and self.cfg_ana.use_newWeights): # print 'new weights' for i in range(0,event.newLHEweights_str.size()): if not "rwgt" in event.newLHEweights_str[i].split()[0]: event.newLHE_weights.append(float(event.newLHEweights_str[i].split()[1])/float(event.LHEweights.getComment(206).split()[1])) # CHECK THE 216 FOR THE SAMPLE IN USE !!! # print len(event.newLHE_weights)-1, event.newLHEweights_str[i].split()[0], float(event.newLHEweights_str[i].split()[1])/float(event.LHEweights.getComment(206).split()[1]), event.newLHEweights_str[i].split()[2], event.newLHEweights_str[i].split()[3], event.newLHEweights_str[i].split()[4], event.newLHEweights_str[i].split()[5], event.newLHEweights_str[i].split()[6] start_transplant_index = 0 for i in range(0,len(event.newLHEweights_str)): if(event.LHE_weights_str[i].split()[6] == event.newLHEweights_str[0].split()[6]): # print 'i',i,'event.LHE_weights_str[i].split()[6]',event.LHE_weights_str[i].split()[6],'event.newLHEweights_str[0].split()[6]',event.newLHEweights_str[0].split()[6] start_transplant_index = i # print 'start_transplant_index',start_transplant_index, 'event.LHEweights.getComment(206)',event.LHEweights.getComment(206) for i in range(0,len(event.newLHEweights_str)): event.LHE_weights[i+start_transplant_index] = float(event.newLHEweights_str[i].split()[1])/float(event.LHEweights.getComment(206).split()[1]) # print 'standard weights after transplant' # for i in range(0,len(event.LHE_weights_str)): # print i, event.LHE_weights_str[i].split()[0], float(event.LHE_weights_str[i].split()[1])/float(event.LHEweights.getComment(206).split()[1]), '--->', event.LHE_weights[i], event.LHE_weights_str[i].split()[2], event.LHE_weights_str[i].split()[3], event.LHE_weights_str[i].split()[4], event.LHE_weights_str[i].split()[5], event.LHE_weights_str[i].split()[6] ##------------------------ Initial declaration of vectors -------------------------------------- event.BestZPosMuonHasTriggered = 0 event.BestZNegMuonHasTriggered = 0 # print 'looping on muons' event.ZallMuons = copy.copy(event.Zmuons) event.ZallMuonsTrig = my_n.zeros(50, dtype=int); event.ZallMuonsID = [] event.ZallMuonsID_8TeV = [] event.ZallMuonsMatched = [] event.ZallMuonsSelMatched = [] # if len(event.ZallMuons)>0: # for i in range(0, len(event.ZallMuons)): # if hasattr(self.cfg_ana, 'triggerBits'): # for T, TL in self.cfg_ana.triggerBits.iteritems(): # if(trigMatched(self, event, event.ZallMuons[i], TL)): # event.ZallMuonsTrig[i]=1. # else: # event.ZallMuonsTrig[i]=0. # else: # event.ZallMuonsTrig[i]=0. # if((event.ZallMuons[i].isGlobalMuon() or event.ZallMuons[i].isTrackerMuon()) and len(event.goodVertices)>0): # event.ZallMuons[i].associatedVertex = event.goodVertices[0] # if testLegID(self, event.ZallMuons[i]): # event.ZallMuonsID.append(1.) # else: # event.ZallMuonsID.append(0.) # else: # event.ZallMuonsID.append(0.) # if((event.ZallMuons[i].isGlobalMuon() or event.ZallMuons[i].isTrackerMuon()) and len(event.goodVertices)>0): # if testLegID_8TeV(self, event.ZallMuons[i]): # event.ZallMuonsID_8TeV.append(1.) # else: # event.ZallMuonsID_8TeV.append(0.) # else: # event.ZallMuonsID_8TeV.append(0.) event.ZselTriggeredMuons = [] event.ZselNoTriggeredMuons = [] event.ZselNoTriggeredExtraMuonsLeadingPt = [] event.ZallJets = copy.copy(event.Zjets) event.ZselJets = [] # store event MET and jets in all gen events (necessary to make cuts in genp studies...) # event.ZpfmetNoMu = event.pfmet.p4() # not needed # clean jets by removing muons event.ZselJets = [ jet for jet in event.ZallJets if ( jet.looseJetId() and jet.pt()>10 ) ] ##------------------------ HERE MC related stuff -------------------------------------- # check if the event is MC and if genp must be saved event.savegenpZ=True if not (self.cfg_ana.savegenp and self.cfg_comp.isMC): event.savegenpZ=False if self.cfg_comp.isMC and self.cfg_ana.savegenp: if len(event.ZallMuons)>0: for i in range(0, min(len(event.ZallMuons),9)): if( (matchPromt(self,event,event.ZallMuons[i],-13*event.ZallMuons[i].charge())+ matchPromtTau(self,event,event.ZallMuons[i],-13*event.ZallMuons[i].charge()))>0): event.ZallMuonsMatched.append(1.) else: event.ZallMuonsMatched.append(0.) # for i in range(0, min(len(event.ZselElectrons),9)): # if (matchPromt(self,event,event.ZselElectrons[i],-11*event.ZselElectrons[i].charge())+ matchPromtTau(self,event,event.ZselElectrons[i],-11*event.ZselElectrons[i].charge()))>0: # event.ZElIsPromt.append(1) # #print 'promt dude' # else: # event.ZElIsPromt.append(0) # #print 'just kidding' # save genp only for signal events # i.e. only one Z is present and daughters are muons if False: print "============", event.eventId,"===========================" for i,p in enumerate(event.genParticles): # print "\n : %5d: pdgId %+5d status %3d pt %6.1f " % (i, p.pdgId(),p.status(),p.pt()), if abs(p.pdgId())==13: print "\n muons: %5d: pdgId %+5d status %3d pt %6.1f " % (i, p.pdgId(),p.status(),p.pt()), if abs(p.pdgId())==23: print "\n Z: %5d: pdgId %+5d status %3d pt %6.1f " % (i, p.pdgId(),p.status(),p.pt()), if abs(p.pdgId())==13 or abs(p.pdgId())==23: if p.numberOfMothers() > 0: imom, mom = p.motherRef().key(), p.mother() print " | mother %5d pdgId %+5d status %3d pt %6.1f " % (imom, mom.pdgId(),mom.status(),mom.pt()), else: print " | no mother particle ", for j in xrange(min(3, p.numberOfDaughters())): idau, dau = p.daughterRef(j).key(), p.daughter(j) print " | dau[%d] %5d pdgId %+5d status %3d pt %6.1f " % (j,idau,dau.pdgId(),dau.status(),dau.pt()), print "" print "\n" print "\n =========================================================" # for genp in event.genParticles: # if math.fabs(genp.pdgId())==23: # print 'genp.pdgId()=',genp.pdgId(), 'genp.status()=',genp.status(), 'genp.numberOfDaughters()=',genp.numberOfDaughters() # # if(genp.numberOfDaughters()>0 and genp.status()==62): # if(genp.numberOfDaughters()>0): # print 'genp.daughter(0)',genp.daughter(0).pdgId(),'status',genp.daughter(0).status() # if(genp.numberOfDaughters()>1): # print 'genp.daughter(1)',genp.daughter(1).pdgId(),'status',genp.daughter(1).status() genZ_dummy = [ genp for genp in event.genParticles if \ math.fabs(genp.pdgId())==23 and (self.cfg_ana.doMad or genp.status()==62 ) ] if len(genZ_dummy)==1: event.genZ = [ genp for genp in genZ_dummy if \ math.fabs(genp.daughter(0).pdgId())==13 ] event.genMuPos = [] event.genMuNeg = [] event.genMuPosStatus1 = [] event.genMuNegStatus1 = [] if len(event.genZ)==1: # if the genp event is selected, associate gen muons if(event.genZ[0].daughter(0).charge()>0): event.genMuPos.append(event.genZ[0].daughter(0)) # print event.genZ[0].daughter(0).pdgId(),' event.genZ[0].daughter(0).charge()= ',event.genZ[0].daughter(0).charge() event.genMuNeg.append(event.genZ[0].daughter(1)) else: event.genMuPos.append(event.genZ[0].daughter(1)) event.genMuNeg.append(event.genZ[0].daughter(0)) if(len(event.genMuNeg) >0): event.genMuNegStatus1.append(returnMuonDaughterStatus1(self,event.genMuNeg[0])) if(len(event.genMuPos) >0): event.genMuPosStatus1.append(returnMuonDaughterStatus1(self,event.genMuPos[0])) event.genZ_PostFSR = event.genMuNegStatus1[0].p4() + event.genMuPosStatus1[0].p4() event.genZ_mt = mT(self,event.genZ[0].daughter(0).p4() , event.genZ[0].daughter(1).p4()) event.muPosGenDeltaRgenP=1e6 event.muNegGenDeltaRgenP=1e6 else: # if the genp is not signal, don't save genp but do not exit # -----> events which will pass the reconstruction but are not signal # can be considered as background (for example, in Z+Jets, from Z decaying into electrons, taus) event.savegenpZ=False else: event.savegenpZ=False ##------------------------ HERE THERE is the selection -------------------------------------- # reco events must have good reco vertex and trigger fired... if not (event.passedVertexAnalyzer): if not hasattr(self.cfg_ana,'keepFailingEvents') or (hasattr(self.cfg_ana,'keepFailingEvents') and not self.cfg_ana.keepFailingEvents): return False else: return True # ...and at lest two reco muons... if len(event.ZallMuons) < 2 : if not hasattr(self.cfg_ana,'keepFailingEvents') or (hasattr(self.cfg_ana,'keepFailingEvents') and not self.cfg_ana.keepFailingEvents): return False else: return True if fillCounter : self.counters.counter('ZAna').inc('Z >= 2 lepton') # check if the event is triggered according to cfg_ana # store separately muons that fired the trigger if hasattr(self.cfg_ana, 'triggerBits'): for lep in event.ZallMuons: for T, TL in self.cfg_ana.triggerBits.iteritems(): # muon object trigger matching if(trigMatched(self, event, lep, TL)): event.ZselTriggeredMuons.append(lep) continue # for T, TL in self.cfg_ana.triggerBits.iteritems(): # # muon object trigger matching # event.ZselTriggeredMuons = [lep for lep in event.ZallMuons if \ # trigMatched(self, event, lep, TL)] # # exit if there are no triggered muons if len(event.ZselTriggeredMuons) == 0: return (hasattr(self.cfg_ana,'keepFailingEvents') and self.cfg_ana.keepFailingEvents) else: if fillCounter: self.counters.counter('ZAna').inc('Z at least 1 lep trig matched') # # store muons that did not fire the trigger # event.ZselNoTriggeredMuons = [lep for lep in event.ZallMuons if \ # not trigMatched(self, event, lep, TL)] # check wether there are muons that did not fire the trigger, if so print some info # if len(event.ZselNoTriggeredMuons)>0: # print 'len(event.ZallMuons)= ',len(event.ZallMuons),' len(event.ZselTriggeredMuons)= ',len(event.ZselTriggeredMuons) # for imu in range (0,len(event.ZselTriggeredMuons)): # print event.ZselTriggeredMuons[imu].pt(),event.ZselTriggeredMuons[imu].eta() # ,' len(event.ZselNoTriggeredMuons)= ', len(event.ZselNoTriggeredMuons) # check for muon pair (with at least 1 triggering muon) which give invariant mass closest to Z pole event.BestZMuonPairList = BestZMuonPair(self,event.ZallMuons) # mZ mu1 (always firing trigger) mu2 mu2 has fired trigger? # print 'event.BestZMuonPairList= ',event.BestZMuonPairList[0],' ',event.BestZMuonPairList[1],' ',event.BestZMuonPairList[2],' ',event.BestZMuonPairList[3] # check that a good muon pair exists, otherwise reject reco event if event.BestZMuonPairList[0] > 1e6 : # return True, 'good muon pair not found (probably same charge)' if hasattr(self.cfg_ana,'keepFailingEvents') and not self.cfg_ana.keepFailingEvents: return False else: return True, 'good muon pair not found' else: if fillCounter : self.counters.counter('ZAna').inc('Z good muon pair found') ##------------------------ MAKE THE MUONS -------------------------------------- # associate properly positive and negative muons if(event.BestZMuonPairList[1].charge()>0): event.BestZPosMuon = event.BestZMuonPairList[1] event.BestZNegMuon = event.BestZMuonPairList[2] else: event.BestZPosMuon = event.BestZMuonPairList[2] event.BestZNegMuon = event.BestZMuonPairList[1] # check the triggers if hasattr(self.cfg_ana, 'triggerBits'): for T, TL in self.cfg_ana.triggerBits.iteritems(): if(trigMatched(self, event, event.BestZPosMuon, TL)): event.BestZPosMuonHasTriggered = 1 break else: event.BestZPosMuonHasTriggered = 0 if hasattr(self.cfg_ana, 'triggerBits'): for T, TL in self.cfg_ana.triggerBits.iteritems(): if(trigMatched(self, event, event.BestZNegMuon, TL)): event.BestZNegMuonHasTriggered = 1 break else: event.BestZNegMuonHasTriggered = 0 event.ZselNoTriggeredExtraMuonsLeadingPt = [lep for lep in event.ZallMuons if \ lep !=event.BestZMuonPairList[2] and lep !=event.BestZMuonPairList[1]] # if(len(event.ZselNoTriggeredExtraMuonsLeadingPt)>0 and lep.pt()>10): # return True, 'rejecting, non triggering leading extra muon has pT > 10 GeV' # print 'len(event.ZallMuons)= ',len(event.ZallMuons),' len(event.ZselTriggeredMuons)= ',len(event.ZselTriggeredMuons),' len(event.ZselNoTriggeredMuons)= ', len(event.ZselNoTriggeredMuons) # print 'event.BestZMuonPairList= ',event.BestZMuonPairList[0],' ',event.BestZMuonPairList[1],' ',event.BestZMuonPairList[2],' ',event.BestZMuonPairList[3],' ',event.ZselNoTriggeredExtraMuonsLeadingPt[0].pt() # else: # if fillCounter : self.counters.counter('ZAna').inc('Z non trg leading extra muon pT < 10 GeV') # if the genp are saved, compute dR between gen and reco muons if event.savegenpZ : event.muPosGenDeltaRgenP = deltaR( event.BestZPosMuon.eta(), event.BestZPosMuon.phi(), event.genMuPos[0].eta(), event.genMuPos[0].phi() ) event.muNegGenDeltaRgenP = deltaR( event.BestZNegMuon.eta(), event.BestZNegMuon.phi(), event.genMuNeg[0].eta(), event.genMuNeg[0].phi() ) # associate lepton to good vertex to muons to compute dxy event.BestZPosMuon.associatedVertex = event.goodVertices[0] event.BestZNegMuon.associatedVertex = event.goodVertices[0] # testing offline muon cuts (tight+iso, no kinematical cuts) event.BestZPosMuonIsTightAndIso=0 if testLeg(self, event.BestZPosMuon ): event.BestZPosMuonIsTightAndIso=1 event.BestZNegMuonIsTightAndIso=0 if testLeg(self, event.BestZNegMuon ): event.BestZNegMuonIsTightAndIso=1 event.BestZPosMuonIsTight=0 if testLegID( self, event.BestZPosMuon ): event.BestZPosMuonIsTight=1 event.BestZNegMuonIsTight=0 if testLegID( self, event.BestZNegMuon ): event.BestZNegMuonIsTight=1 event.covMatrixPosMuon = [] RetrieveMuonMatrixIntoVector(self,event.BestZPosMuon,event.covMatrixPosMuon) event.covMatrixNegMuon = [] RetrieveMuonMatrixIntoVector(self,event.BestZNegMuon,event.covMatrixNegMuon) ##------------------------ MAKE THE RECOIL variables -------------------------------------- # print event.BestZPosMuon.covarianceMatrix().Print("") # print event.covMatrixPosMuon # print event.BestZNegMuon.covarianceMatrix().Print("") # print event.covMatrixNegMuon event.BestZNegMatchIndex = matchCMGmuon(self,event,event.BestZNegMuon) event.BestZPosMatchIndex = matchCMGmuon(self,event,event.BestZPosMuon) # assign negative lepton to MET to build W+ event.ZpfmetWpos = event.pfmet.p4() + event.BestZNegMuon.p4() # assign positive lepton to MET to build W- event.ZpfmetWneg = event.pfmet.p4() + event.BestZPosMuon.p4() # define a positive W from positive lepton and MET event.Wpos4VfromZ = event.BestZPosMuon.p4() + event.ZpfmetWpos event.Wpos4VfromZ_mt = mT(self,event.BestZPosMuon.p4() , event.ZpfmetWpos) # define a negative W from negative lepton and MET event.Wneg4VfromZ = event.BestZNegMuon.p4() + event.ZpfmetWneg event.Wneg4VfromZ_mt = mT(self,event.BestZNegMuon.p4() , event.ZpfmetWneg) # define a Z from the two leptons event.Z4V = event.BestZPosMuon.p4() + event.BestZNegMuon.p4() event.Z4V_mt = mT(self,event.BestZPosMuon.p4() , event.BestZNegMuon.p4()) # Code to study the Z recoil metVect = event.pfmet.p4().Vect() metVect.SetZ(0.) # use only transverse info ZVect = event.Z4V.Vect() ZVect.SetZ(0.) # use only transverse info recoilVect = - copy.deepcopy(metVect) ## FIXED (met sign inverted) vU = - vMET - vZ recoilVect -= ZVect #print 'What must be true' uZVect = ZVect.Unit() zAxis = type(ZVect)(0,0,1) uZVectPerp = ZVect.Cross(zAxis).Unit() u1 = recoilVect.Dot(uZVect) # recoil parallel to Z pt u2 = - recoilVect.Dot(uZVectPerp) # recoil perpendicular to Z pt event.Zu1 = u1 event.Zu2 = u2 ##------------------------ FINAL COUNTERS -------------------------------------- if fillCounter: if event.Wpos4VfromZ.M() > 50: self.counters.counter('ZAna').inc('Z Inv Mass>50') if event.BestZPosMuonIsTightAndIso : self.counters.counter('ZAna').inc('Z pos Mu is MuIsTightAndIso') if testLegKine(self, event.BestZPosMuon , 30*91.1876/80.385 , 2.1 ) : self.counters.counter('ZAna').inc('Z pos Mu_eta<2.1 && Mu_pt>30*MZ/MW') if testLegKine(self, event.BestZNegMuon , 10 , 2.4 ) : self.counters.counter('ZAna').inc('Z neg Mu_eta<2.4 && Mu_pt>10') if event.ZpfmetWpos.Pt() >25*91.1876/80.385: self.counters.counter('ZAna').inc('Z pfmet>25*MZ/MW') if event.Wpos4VfromZ.Pt() < 20*91.1876/80.385: self.counters.counter('ZAna').inc('Z pt<20*MZ/MW') if len(event.ZselJets) > 0: if event.ZselJets[0].pt() < 30: self.counters.counter('ZAna').inc('Z Jet_leading_pt<30') else: self.counters.counter('ZAna').inc('Z Jet_leading_pt<30') # event is fully considered as good event.ZGoodEvent = True ##------------------------ EXTRA -------------------------------------- if not hasattr(self.cfg_ana,'keepFailingEvents') or (hasattr(self.cfg_ana,'keepFailingEvents') and not self.cfg_ana.keepFailingEvents): if( \ not event.passedVertexAnalyzer \ # or not event.passedTriggerAnalyzer # or not event.Z4V.M()>70 or not event.Z4V.M()<110 \ or not event.Z4V.M()>50 \ ## commented Zpt ##or not event.Z4V.Pt()<50 \ or not event.BestZPosMuon.charge() != event.BestZNegMuon.charge() \ or not event.BestZPosMuonIsTight == 1 or not event.BestZNegMuonIsTight == 1 \ # or not event.BestZPosMuon.pt() > 6 or not math.fabs(event.BestZNegMuon.pt()) > 6 \ # or not event.BestZPosMuon.relIso(0.5) < 0.5 or not event.BestZNegMuon.relIso(0.5) < 0.5 \ # or not math.fabs(event.BestZPosMuon.eta()) < 2.4 or not math.fabs(event.BestZNegMuon.eta()) < 2.4 \ # or not math.fabs(event.BestZPosMuon.dxy()) < 0.2 or not math.fabs(event.BestZNegMuon.dxy()) < 0.2 \ # or not math.fabs(event.BestZPosMuon.dz()) < 0.5 or not math.fabs(event.BestZNegMuon.dz()) < 0.5 \ or not ( \ ( event.BestZPosMuon.pt() > 30 and event.BestZPosMuon.relIso(0.5) < 0.12 \ and math.fabs(event.BestZPosMuon.eta()) < 2.1 and math.fabs(event.BestZPosMuon.dxy()) < 0.2 \ and math.fabs(event.BestZPosMuon.dz()) < 0.5 ) \ or\ ( event.BestZNegMuon.pt() > 30 and event.BestZNegMuon.relIso(0.5) < 0.12 \ and math.fabs(event.BestZNegMuon.eta()) < 2.1 and math.fabs(event.BestZNegMuon.dxy()) < 0.2 \ and math.fabs(event.BestZNegMuon.dz()) < 0.5 ) \ )\ ): return False return True
def selectionSequence(self, event, fillCounter): if fillCounter: self.counters.counter('WAna').inc('W all events') if self.cfg_comp.isMC : if (hasattr(self.cfg_ana,'storeLHE_weight') and self.cfg_ana.storeLHE_weight): # print event.LHEweights.comments_size() for i in range(0,event.LHEweights.comments_size()): # print 'i',i,event.LHEweights.getComment(i).split()[0] if not "rwgt" in event.LHEweights.getComment(i).split()[0]: event.LHE_weights.append(float(event.LHEweights.getComment(i).split()[1])/float(event.LHEweights.getComment(206).split()[1])) # CHECK THE 216 FOR THE SAMPLE IN USE !!! # print len(event.LHE_weights)-1, event.LHEweights.getComment(i).split()[0], float(event.LHEweights.getComment(i).split()[1])/float(event.LHEweights.getComment(206).split()[1]), event.LHEweights.getComment(i).split()[2], event.LHEweights.getComment(i).split()[3], event.LHEweights.getComment(i).split()[4], event.LHEweights.getComment(i).split()[5] # print len(event.LHE_weights) ##------------------------ Initial declaration of vectors -------------------------------------- event.allMuonsTrgBit=[] # retrieve collections of interest (muons and jets) event.allMuons = copy.copy(event.muons) for i in range(0,len(event.allMuons)): event.allMuonsTrgBit.append(0) event.selMuons = [] event.NoTriggeredMuonsLeadingPt = copy.copy(event.muons) event.allJets = copy.copy(event.jets) event.selJets = copy.copy(event.jets) event.selJets = [ jet for jet in event.allJets if ( \ not (bestMatch( jet , event.muons ))[1] <0.5 \ and jet.looseJetId() and jet.pt()>30 \ ) ] ##------------------------ HERE MC related stuff -------------------------------------- # check if the event is MC and if genp must be saved event.savegenpW=False # for genp in event.genParticles: # if math.fabs(genp.pdgId())==24 and genp.numberOfDaughters()>1: # print 'genp.pdgId()=',genp.pdgId(), 'genp.status()=',genp.status(), 'genp.numberOfDaughters()=',genp.numberOfDaughters() # if(genp.numberOfDaughters()>0): # print 'genp.daughter(0)',genp.daughter(0).pdgId(),'status',genp.daughter(0).status() # if(genp.numberOfDaughters()>1): # print 'genp.daughter(1)',genp.daughter(1).pdgId(),'status',genp.daughter(1).status() # return False # save genp only for signal events # i.e. only one W is present and daughters are muon plus neutrino genW_dummy = [ genp for genp in event.genParticles if \ (math.fabs(genp.pdgId())==24 and (self.cfg_ana.doMad or genp.status()==62))if \ (( genp.numberOfDaughters()>1 and (\ math.fabs(genp.daughter(0).pdgId())==11 or math.fabs(genp.daughter(1).pdgId())==11 or math.fabs(genp.daughter(0).pdgId())==13 or math.fabs(genp.daughter(1).pdgId())==13 or math.fabs(genp.daughter(0).pdgId())==15 or math.fabs(genp.daughter(1).pdgId())==15 ) ) or (genp.numberOfDaughters()==1 and \ math.fabs(genp.daughter(0).pdgId())==13 ) ) ] # if the genp event is selected, associate gen muon and neutrino event.genMu = [] event.genMuStatus1 = [] event.genNu = [] event.genNu_p4 = [] event.genWLept = [] if self.cfg_ana.savegenp and self.cfg_comp.isMC: if len(genW_dummy)==1: event.genW = [ genp for genp in genW_dummy if \ ( \ ( math.fabs(genW_dummy[0].daughter(0).pdgId())==13 ) or \ ( genW_dummy[0].numberOfDaughters()>1 and math.fabs(genW_dummy[0].daughter(1).pdgId())==13 ) \ ) ] if len(event.genW)==1: event.savegenpW=True event.genNu_p4 = genW_dummy[0].p4() - event.genW[0].daughter(0).p4() event.genWLept.append(event.genW[0]) if [ math.fabs(event.genW[0].daughter(0).pdgId())==13 ]: event.genMu.append(event.genW[0].daughter(0)) if event.genW[0].numberOfDaughters()>1: event.genNu.append(event.genW[0].daughter(1)) elif event.genW[0].numberOfDaughters()>1: event.genMu.append(event.genW[0].daughter(1)) event.genNu.append(event.genW[0].daughter(0)) if(len(event.genMu) >0): if(math.fabs(event.genW[0].mother(0).pdgId())!=6): event.genMuStatus1.append(returnMuonDaughterStatus1(self,event.genMu[0])) else: event.genMuStatus1.append(event.genMu[0]) if event.genW[0].numberOfDaughters()>1: event.genW_mt = mT(self,event.genW[0].daughter(0).p4() , event.genW[0].daughter(1).p4()) else: event.genW_mt = mT(self,event.genW[0].daughter(0).p4() , event.genNu_p4) event.muGenDeltaRgenP=1e6 # if len(genW_dummy)>1: # event.genW = [ genp for genp in genW_dummy if \ # ( \ # ( math.fabs(genW_dummy[0].daughter(0).pdgId())==11 ) or \ # ( math.fabs(genW_dummy[0].daughter(1).pdgId())==11 ) or \ # ( math.fabs(genW_dummy[0].daughter(0).pdgId())==13 ) or \ # ( math.fabs(genW_dummy[0].daughter(1).pdgId())==13 ) or \ # ( math.fabs(genW_dummy[0].daughter(0).pdgId())==15 ) or \ # ( math.fabs(genW_dummy[0].daughter(1).pdgId())==15 ) or \ # ( math.fabs(genW_dummy[1].daughter(0).pdgId())==11 ) or \ # ( math.fabs(genW_dummy[1].daughter(1).pdgId())==11 ) or \ # ( math.fabs(genW_dummy[1].daughter(0).pdgId())==13 ) or \ # ( math.fabs(genW_dummy[1].daughter(1).pdgId())==13 ) or \ # ( math.fabs(genW_dummy[1].daughter(0).pdgId())==15 ) or \ # ( math.fabs(genW_dummy[1].daughter(1).pdgId())==15 ) \ # ) ] # if len(event.genW)==2: # if ( math.fabs(event.genW[0].daughter(0).pdgId())==13. or math.fabs(event.genW[0].daughter(0).pdgId())==15. or math.fabs(event.genW[0].daughter(0).pdgId())==11. ): # # print 'event.savegenpW 2 ',event.savegenpW # event.savegenpW=False # # print 'found leptonic W0 a' # event.genWLept.append(event.genW[0]) # if ( math.fabs(event.genW[0].daughter(0).pdgId())==13 ): # event.genMu.append(event.genW[0].daughter(0)) # event.genNu.append(event.genW[0].daughter(1)) # event.genW_mt = mT(self,event.genMu[0].p4() , event.genNu[0].p4()) # event.muGenDeltaRgenP=1e6 # if(len(event.genMu) >0): # event.genMuStatus1.append(returnMuonDaughterStatus1(self,event.genMu[0])) # event.savegenpW=True # if ( math.fabs(event.genW[0].daughter(1).pdgId())==13. or math.fabs(event.genW[0].daughter(1).pdgId())==15. or math.fabs(event.genW[0].daughter(1).pdgId())==11. ): # # print 'event.savegenpW 3 ',event.savegenpW # event.savegenpW=False # # print 'found leptonic W0 b' # event.genWLept.append(event.genW[0]) # if ( math.fabs(event.genW[0].daughter(1).pdgId())==13 ): # event.genMu.append(event.genW[0].daughter(1)) # event.genNu.append(event.genW[0].daughter(0)) # event.genW_mt = mT(self,event.genMu[0].p4() , event.genNu[0].p4()) # event.muGenDeltaRgenP=1e6 # if(len(event.genMu) >0): # event.genMuStatus1.append(returnMuonDaughterStatus1(self,event.genMu[0])) # # print 'event.savegenpW 4 ',event.savegenpW # event.savegenpW=True # if ( math.fabs(event.genW[1].daughter(0).pdgId())==13. or math.fabs(event.genW[1].daughter(0).pdgId())==15. or math.fabs(event.genW[1].daughter(0).pdgId())==11. ): # # print 'event.savegenpW 5 ',event.savegenpW # event.savegenpW=False # # print 'found leptonic W1 c' # event.genWLept.append(event.genW[1]) # if ( math.fabs(event.genW[1].daughter(0).pdgId())==13 ): # event.genMu.append(event.genW[1].daughter(0)) # event.genNu.append(event.genW[1].daughter(1)) # event.genW_mt = mT(self,event.genMu[0].p4() , event.genNu[0].p4()) # event.muGenDeltaRgenP=1e6 # if(len(event.genMu) >0): # event.genMuStatus1.append(returnMuonDaughterStatus1(self,event.genMu[0])) # event.savegenpW=True # if ( math.fabs(event.genW[1].daughter(1).pdgId())==13. or math.fabs(event.genW[1].daughter(1).pdgId())==15. or math.fabs(event.genW[1].daughter(1).pdgId())==11. ): # # print 'event.savegenpW 6 ',event.savegenpW # event.savegenpW=False # # print 'found leptonic W1 d' # event.genWLept.append(event.genW[1]) # if ( math.fabs(event.genW[1].daughter(1).pdgId())==13 ): # event.genMu.append(event.genW[1].daughter(1)) # event.genNu.append(event.genW[1].daughter(0)) # event.genW_mt = mT(self,event.genMu[0].p4() , event.genNu[0].p4()) # event.muGenDeltaRgenP=1e6 # if(len(event.genMu) >0): # event.genMuStatus1.append(returnMuonDaughterStatus1(self,event.genMu[0])) # event.savegenpW=True # if the genp is not signal, don't save genp but do not exit # -----> events which will pass the reconstruction but are not signal # can be considered as background (for example, in W+Jets, from W decaying into electrons, taus) # else: # ## here put false for fully hadronic WW # print 'event.savegenpW 7 ',event.savegenpW # event.savegenpW=False # print 'genW found ', len(genW_dummy) # print 'genWLeptonic found ', len(event.genWLept) ##------------------------ HERE THERE is the selection -------------------------------------- keepFailingEvents = True if not hasattr(self.cfg_ana,'keepFailingEvents') \ or (hasattr(self.cfg_ana,'keepFailingEvents') and not self.cfg_ana.keepFailingEvents): keepFailingEvents = False # print 'keepFailingEvents',keepFailingEvents # if not (event.passedVertexAnalyzer and event.passedTriggerAnalyzer): ##------------ # reco events must have good reco vertex if not (event.passedVertexAnalyzer): return keepFailingEvents ##------------ # ...and at lest one reco muon... if len(event.muons) == 0: return keepFailingEvents if fillCounter: self.counters.counter('WAna').inc('W ev trig, good vertex and >= 1 lepton') #check if the event is triggered according to cfg_ana if hasattr(self.cfg_ana, 'triggerBits'): for imu in range(0,len(event.allMuons)): for T, TL in self.cfg_ana.triggerBits.iteritems(): # muon object trigger matching if trigMatched(self, event, event.allMuons[imu], TL): # print event.allMuons[imu].pt(), event.allMuons[imu].eta(), TL event.allMuonsTrgBit[imu]=1 # continue if(event.allMuonsTrgBit[imu]==1): event.selMuons.append(event.allMuons[imu]) # for T, TL in self.cfg_ana.triggerBits.iteritems(): # # muon object trigger matching # event.selMuons = [lep for lep in event.allMuons if \ # trigMatched(self, event, lep, TL)] # print 'len(event.selMuons) = ',len(event.selMuons) # for i in range(0,len(event.selMuons)): # print i,event.selMuons[i].pt(), event.selMuons[i].eta() # exit if there are no triggered muons ##------------ # reco events must have trigger fired... if len(event.selMuons) == 0: return keepFailingEvents, 'trigger matching failed' else: if fillCounter: self.counters.counter('WAna').inc('W at least 1 lep trig matched') ##------------ # to select W impose only 1 triggering lepton in the event: # the number of triggering lepton is checked on the whole lepton collection # before any cut, otherwise could be a Z!!! if len(event.selMuons) != 1: return keepFailingEvents, 'more than 1 lep trig matched' else: if fillCounter: self.counters.counter('WAna').inc('W only 1 lep trig matched') if len(event.selMuons)!= 1: print 'BUT CONTINUING!' # print len(event.selMuons), event.selMuons[0].pt() if not (event.selMuons[0].pt()>0): return keepFailingEvents # store muons that did not fire the trigger if hasattr(self.cfg_ana, 'triggerBits'): for T, TL in self.cfg_ana.triggerBits.iteritems(): event.NoTriggeredMuonsLeadingPt = [lep for lep in event.allMuons if \ (not trigMatched(self, event, lep, TL) \ and lep.pt()>10)] # print "len(event.NoTriggeredMuonsLeadingPt)= ",len(event.NoTriggeredMuonsLeadingPt) # if len(event.NoTriggeredMuonsLeadingPt)>0 : print "event.NoTriggeredMuonsLeadingPt[0].pt() = ",event.NoTriggeredMuonsLeadingPt[0].pt() if len(event.NoTriggeredMuonsLeadingPt) > 0: if event.NoTriggeredMuonsLeadingPt[0].pt()>10: # if (event.NoTriggeredMuonsLeadingPt[0].pt()<10): print "ESISTE UN LEPTONE NON TRIGGERING WITH PT>10, event.NoTriggeredMuonsLeadingPt[0].pt() = ",event.NoTriggeredMuonsLeadingPt[0].pt() return keepFailingEvents, 'rejecting event with non triggering lepton with pT > 10 GeV' else: if fillCounter: self.counters.counter('WAna').inc('W non trg leading lepton pT < 10 GeV') else: if fillCounter: self.counters.counter('WAna').inc('W non trg leading lepton pT < 10 GeV') ##------------------------ MAKE THE MUON -------------------------------------- # if the genp are saved, compute dR between gen and reco muon if (event.savegenpW and len(event.genW)==1): event.muGenDeltaRgenP = deltaR( event.selMuons[0].eta(), event.selMuons[0].phi(), event.genMu[0].eta(), event.genMu[0].phi() ) # associate good vertex to muon to compute dxy event.selMuons[0].associatedVertex = event.goodVertices[0] # testing offline muon cuts (tight+iso, no kinematical cuts) event.selMuonIsTightAndIso = testLeg(self, event.selMuons[0] ) event.selMuonIsTight = testLegID( self,event.selMuons[0] ) # define a W from lepton and MET event.W4V = event.selMuons[0].p4() + event.pfmet.p4() event.W4V_mt = mT(self,event.selMuons[0].p4() , event.pfmet.p4()) event.covMatrixMuon = [] RetrieveMuonMatrixIntoVector(self,event.selMuons[0],event.covMatrixMuon) # print event.covMatrixMuon ##------------------------ MAKE THE JETS and RECOIL variables -------------------------------------- # Code to study the recoil (not very useful for W...) metVect = event.pfmet.p4().Vect() metVect.SetZ(0.) # use only transverse info WVect = event.W4V.Vect() WVect.SetZ(0.) # use only transverse info recoilVect = - copy.deepcopy(metVect) ## FIXED (met sign inverted) # recoilVect -= WVect temp_recoil = event.selMuons[0].p4().Vect() temp_recoil.SetZ(0.) # use only transverse info recoilVect -= temp_recoil ## FIXED (subtract only lepton for consistent recoil definition) uWVect = WVect.Unit() zAxis = type(WVect)(0,0,1) uWVectPerp = WVect.Cross(zAxis).Unit() u1 = recoilVect.Dot(uWVect) # recoil parallel to W pt u2 = - recoilVect.Dot(uWVectPerp) # recoil perpendicular to W pt event.u1 = u1 event.u2 = u2 ##------------------------ FINAL COUNTERS -------------------------------------- if fillCounter: if event.selMuonIsTightAndIso : self.counters.counter('WAna').inc('W lep is MuIsTightAndIso') if testLegKine( self, event.selMuons[0] , 30 , 2.1 ) : self.counters.counter('WAna').inc('W Mu_eta<2.1 && Mu_pt>30') if event.pfmet.pt() >25: self.counters.counter('WAna').inc('W pfmet>25') if event.W4V.Pt() < 20: self.counters.counter('WAna').inc('W pt<20') if len(event.selJets) > 0: if event.selJets[0].pt()<30: self.counters.counter('WAna').inc('W Jet_leading_pt<30') else: self.counters.counter('WAna').inc('W Jet_leading_pt<30') # event is fully considered as good # if fillCounter: self.counters.counter('WAna').inc('W pass') event.WGoodEvent = True return (event.WGoodEvent or keepFailingEvents)
def buildLeptonList(self, event): self.eleele = False self.mumu = False self.tautau = False self.electrons = [] self.muons = [] self.taus = [] for ptc in self.mchandles['genParticles'].product(): isElectron = abs(ptc.pdgId()) == 11 isMuon = abs(ptc.pdgId()) == 13 isTau = abs(ptc.pdgId()) == 15 if isElectron: if ptc.numberOfMothers() and ptc.mother(0).pdgId() != 23: continue self.electrons.append(GenParticle(ptc)) if isMuon: if ptc.numberOfMothers() and ptc.mother(0).pdgId() != 23: continue self.muons.append(GenParticle(ptc)) if isTau: if ptc.numberOfMothers() and ptc.mother(0).pdgId() != 23: continue self.taus.append(GenParticle(ptc)) if len(self.electrons) == 2: self.eleele = True if len(self.muons) == 2: self.mumu = True if len(self.taus) == 2: self.tautau = True event.eleele = self.eleele event.mumu = self.mumu event.tautau = self.tautau self.jets = [] for ptj in self.handles['jets'].product(): self.jets.append(Jet(ptj)) self.leptons = [] for pte in self.handles['electrons'].product(): self.leptons.append(Lepton(pte)) for ptm in self.handles['muons'].product(): self.leptons.append(Lepton(ptm)) self.photons = [] for ptg in self.handles['photons'].product(): if ptg.energy() > 1.0: self.photons.append(Photon(ptg)) # Find FSR tmpLept = set(self.leptons) for lept in self.leptons: leptonIso = self.leptonIso(lept) if leptonIso > 0.05: tmpLept.remove(lept) continue #if (self.eleele or self.mumu or self.tautau ) : # print self.eleele, self.mumu, self.tautau,lept, leptonIso for i, ph in enumerate(self.photons): dr = deltaR(lept.eta(), lept.phi(), ph.eta(), ph.phi()) if abs(lept.pdgId()) == 13 and dr < 0.4: #print 'found ISR ',ph,lept leph = lept.p4() p4ph = ph.p4() p4 = ph.p4() + lept.p4() lept.setP4(p4) #print 'added ISR ',ph,lept self.leptons = [] for lept in tmpLept: self.leptons.append(lept) for lept in self.leptons: drmin = 999. ijet = -1 for i, jet in enumerate(self.jets): dr = deltaR(lept.eta(), lept.phi(), jet.eta(), jet.phi()) if dr < drmin: drmin = dr ijet = i if ijet >= 0: if drmin < 0.1: self.jets[ijet].setP4(lept.p4()) self.jets[ijet].setPdgId(lept.pdgId())
def matchPromt(self, event, lep, particleID): for genp in event.genParticles: if (deltaR( lep.p4().Eta(),lep.p4().Phi(), genp.p4().Eta(),genp.p4().Phi() ) < 0.2) and genp.status()==3 and genp.pdgId()==particleID: # status three are always promt return 1 return 0
def selectionSequence(self, event, fillCounter): if fillCounter: self.counters.counter('WAna').inc('W all events') # retrieve collections of interest (muons and jets) event.allMuons = copy.copy(event.muons) event.selMuons = copy.copy(event.muons) event.NoTriggeredMuonsLeadingPt = copy.copy(event.muons) event.allJets = copy.copy(event.jets) event.selJets = copy.copy(event.jets) # check if the event is MC and if genp must be saved event.savegenpW = True if not (self.cfg_ana.savegenp and self.cfg_comp.isMC): event.savegenpW = False # save genp only for signal events # i.e. only one W is present and daughters are muon plus neutrino genW_dummy = [ genp for genp in event.genParticles if \ math.fabs(genp.pdgId())==24 ] if len(genW_dummy) == 1: event.genW = [ genp for genp in genW_dummy if \ ( \ ( math.fabs(genW_dummy[0].daughter(0).pdgId())==13 ) or \ ( math.fabs(genW_dummy[0].daughter(1).pdgId())==13 ) \ ) ] # if the genp event is selected, associate gen muon and neutrino event.genMu = [] event.genMuStatus1 = [] event.genNu = [] if len(event.genW) == 1: if [math.fabs(event.genW[0].daughter(0).pdgId()) == 13]: event.genMu.append(event.genW[0].daughter(0)) event.genNu.append(event.genW[0].daughter(1)) else: event.genMu.append(event.genW[0].daughter(1)) event.genNu.append(event.genW[0].daughter(0)) if (len(event.genMu) > 0): event.genMuStatus1.append( self.returnMuonDaughterStatus1(event.genMu[0])) event.genW_mt = self.mT(event.genW[0].daughter(0).p4(), event.genW[0].daughter(1).p4()) event.muGenDeltaRgenP = 1e6 else: # if the genp is not signal, don't save genp but do not exit # -----> events which will pass the reconstruction but are not signal # can be considered as background (for example, in W+Jets, from W decaying into electrons, taus) event.savegenpW = False else: event.savegenpW = False # store event number of muons, MET and jets in all gen events (necessary to make cuts in genp studies...) # total number of reco muons event.nMuons = len(event.selMuons) # clean jets by removing muons event.selJets = [ jet for jet in event.allJets if ( \ not (bestMatch( jet , event.selMuons ))[1] <0.5 \ and jet.looseJetId() and jet.pt()>30 \ ) ] # reco events must have good reco vertex and trigger fired... if not (event.passedVertexAnalyzer and event.passedTriggerAnalyzer): return True # ...and at lest one reco muon... if len(event.selMuons) == 0: return True if fillCounter: self.counters.counter('WAna').inc( 'W ev trig, good vertex and >= 1 lepton') #check if the event is triggered according to cfg_ana if len(self.cfg_comp.triggers) > 0: # muon object trigger matching event.selMuons = [lep for lep in event.allMuons if \ self.trigMatched(event, lep)] # exit if there are no triggered muons if len(event.selMuons) == 0: return True, 'trigger matching failed' else: if fillCounter: self.counters.counter('WAna').inc( 'W at least 1 lep trig matched') # to select W impose only 1 triggering lepton in the event: # the number of triggering lepton is checked on the whole lepton collection # before any cut, otherwise could be a Z!!! if len(event.selMuons) != 1: return True, 'more than 1 lep trig matched' else: if fillCounter: self.counters.counter('WAna').inc('W only 1 lep trig matched') # store muons that did not fire the trigger event.NoTriggeredMuonsLeadingPt = [lep for lep in event.allMuons if \ not self.trigMatched(event, lep) ] # print "len(event.NoTriggeredMuonsLeadingPt)= ",len(event.NoTriggeredMuonsLeadingPt) # if len(event.NoTriggeredMuonsLeadingPt)>0 : print "event.NoTriggeredMuonsLeadingPt[0].pt() = ",event.NoTriggeredMuonsLeadingPt[0].pt() if len(event.NoTriggeredMuonsLeadingPt) > 0: if event.NoTriggeredMuonsLeadingPt[0].pt() > 10: # if (event.NoTriggeredMuonsLeadingPt[0].pt()<10): print "ESISTE UN LEPTONE NON TRIGGERING WITH PT>10, event.NoTriggeredMuonsLeadingPt[0].pt() = ",event.NoTriggeredMuonsLeadingPt[0].pt() return True, 'rejecting event with non triggering lepton with pT > 10 GeV' else: if fillCounter: self.counters.counter('WAna').inc( 'W non trg leading lepton pT < 10 GeV') else: if fillCounter: self.counters.counter('WAna').inc( 'W non trg leading lepton pT < 10 GeV') # if the genp are saved, compute dR between gen and reco muon if event.savegenpW: event.muGenDeltaRgenP = deltaR(event.selMuons[0].eta(), event.selMuons[0].phi(), event.genMu[0].eta(), event.genMu[0].phi()) # associate good vertex to muon to compute dxy event.selMuons[0].associatedVertex = event.goodVertices[0] # testing offline muon cuts (tight+iso, no kinematical cuts) event.selMuonIsTightAndIso = self.testLeg(event.selMuons[0]) event.selMuonIsTight = self.testLegID(event.selMuons[0]) # START RETRIEVING MVAMET # INPUT DEFINITIONS AS OF HTT # mvaMETTauMu = cms.EDProducer( # "MVAMETProducerTauMu", # pfmetSrc = cms.InputTag('pfMetForRegression'), # tkmetSrc = cms.InputTag('tkMet'), # nopumetSrc = cms.InputTag('nopuMet'), # pucmetSrc = cms.InputTag('pcMet'), # pumetSrc = cms.InputTag('puMet'), # recBosonSrc = cms.InputTag('cmgTauMuSel'), # jetSrc = cms.InputTag('cmgPFJetSel'), # leadJetSrc = cms.InputTag('cmgPFBaseJetLead'), # vertexSrc = cms.InputTag('goodPVFilter'), # nJetsPtGt1Src = cms.InputTag('nJetsPtGt1'), # rhoSrc = cms.InputTag('kt6PFJets','rho'), # enable = cms.bool(True), # verbose = cms.untracked.bool( False ), # weights_gbrmet = cms.string(weights_gbrmet), # weights_gbrmetphi = cms.string(weights_gbrmetphi), # weights_gbrmetu1cov = cms.string(weights_gbrmetu1cov), # weights_gbrmetu2cov = cms.string(weights_gbrmetu2cov), # #COLIN: make delta R a parameter # ) # self.prepareObjectsForMVAMET(event) # self.mvamet.getMet( # event.cleanpfmetForRegression, #iPFMet, # event.cleantkmet, #iTKMet, # event.cleannopumet, #iNoPUMet, # event.pumet, #iPUMet, # event.cleanpucmet, #iPUCMet, # event.iLeadJet, #event.iLeadJet, # event.i2ndJet, #event.i2ndJet, # event.NJetsGt30, #iNJetsGt30, # event.nJetsPtGt1Clean, #iNJetsGt1, # len(event.goodVertices), #iNGoodVtx, # event.iJets_p4, #iJets, # event.iJets_mva, #iJets, # event.iJets_neutFrac, #iJets, # False, #iPrintDebug, # event.visObjectP4s_array #visObjectP4s # ) # event.mvamet = self.mvamet.GetMet_first(); # event.GetMVAMet_second = self.mvamet.GetMet_second(); # print 'AFTER MVAmet_test' # print 'event.pfmet.pt() ', event.pfmet.pt() # print 'event.selMuons[0].pt() ',event.selMuons[0].pt(),' event.mvamet.Pt() ',event.mvamet.Pt() # print '' # print 'event.GetMVAMet_second ',event.GetMVAMet_second,' event.GetMVAMet_second.significance() ',event.GetMVAMet_second.significance().Print() # define a W from lepton and MET event.W4V = event.selMuons[0].p4() + event.pfmet.p4() event.W4V_mt = self.mT(event.selMuons[0].p4(), event.pfmet.p4()) # Code to study the recoil (not very useful for W...) metVect = event.pfmet.p4().Vect() metVect.SetZ(0.) # use only transverse info WVect = event.W4V.Vect() WVect.SetZ(0.) # use only transverse info recoilVect = -copy.deepcopy(metVect) ## FIXED (met sign inverted) # recoilVect -= WVect temp_recoil = event.selMuons[0].p4().Vect() temp_recoil.SetZ(0.) # use only transverse info recoilVect -= temp_recoil ## FIXED (subtract only lepton for consistent recoil definition) uWVect = WVect.Unit() zAxis = type(WVect)(0, 0, 1) uWVectPerp = WVect.Cross(zAxis).Unit() u1 = recoilVect.Dot(uWVect) # recoil parallel to W pt u2 = -recoilVect.Dot(uWVectPerp) # recoil perpendicular to W pt event.u1 = u1 event.u2 = u2 if fillCounter: if event.selMuonIsTightAndIso: self.counters.counter('WAna').inc('W lep is MuIsTightAndIso') if self.testLegKine(event.selMuons[0], 30, 2.1): self.counters.counter('WAna').inc( 'W Mu_eta<2.1 && Mu_pt>30') if event.pfmet.pt() > 25: self.counters.counter('WAna').inc('W pfmet>25') if event.W4V.Pt() < 20: self.counters.counter('WAna').inc('W pt<20') if len(event.selJets) > 0: if event.selJets[0].pt() < 30: self.counters.counter('WAna').inc( 'W Jet_leading_pt<30') else: self.counters.counter('WAna').inc( 'W Jet_leading_pt<30') # event is fully considered as good # if fillCounter: self.counters.counter('WAna').inc('W pass') event.WGoodEvent = True return True
def buildLeptonList(self,event): self.hadtaus = [] for ptj in self.handles['taus'].product(): thistau=Tau(ptj) # add only "good" pftaus if thistau.tauID("decayModeFinding")!=1.0: continue if thistau.tauID("byVLooseCombinedIsolationDeltaBetaCorr")<=0.: continue self.hadtaus.append(Tau(ptj)) self.jets = [] for ptj in self.handles['jets'].product(): # check if they are close to jets and then remove them from the jet list thisjet=Jet(ptj) matched=False # use the following if you want to remove hadtaus from jets # for tau in self.hadtaus: # if deltaR(tau.eta(),tau.phi(),thisjet.eta(),thisjet.phi()) < 0.2: # matched=True # break if not matched: self.jets.append(Jet(ptj)) self.leptons = [] for pte in self.handles['electrons'].product(): self.leptons.append(Lepton(pte)) for ptm in self.handles['muons'].product(): self.leptons.append(Lepton(ptm)) self.photons = [] for ptg in self.handles['photons'].product(): if ptg.energy() > 1.0 : self.photons.append(Photon(ptg)) # Find FSR tmpLept = set(self.leptons) for lept in self.leptons : leptonIso = self.leptonIso(lept) if leptonIso > 0.05 : tmpLept.remove(lept) continue #if (self.eleele or self.mumu or self.tautau ) : # print self.eleele, self.mumu, self.tautau,lept, leptonIso for i,ph in enumerate(self.photons) : dr = deltaR(lept.eta(),lept.phi(),ph.eta(),ph.phi()) if abs(lept.pdgId()) == 13 and dr < 0.4 : #print 'found ISR ',ph,lept leph = lept.p4() p4ph = ph.p4() p4 = ph.p4() + lept.p4() lept.setP4(p4) #print 'added ISR ',ph,lept self.leptons = [] for lept in tmpLept : self.leptons.append(lept) self.leptonJets = [] for lept in self.leptons : drmin = 999. ijet = -1 for i,jet in enumerate(self.jets) : dr = deltaR(lept.eta(),lept.phi(),jet.eta(),jet.phi()) if dr < drmin : drmin = dr ijet = i if ijet >= 0 : if drmin < 0.1 : self.jets[ijet].setP4(lept.p4()) self.jets[ijet].setPdgId(lept.pdgId()) self.leptonJets.append(self.jets[ijet])
def testJetIsNotSelLepton(self, jet, lep): '''returns testjetID && testjetIso && testjetKine for jet''' return deltaR( lep.p4().Eta(),lep.p4().Phi(), jet.p4().Eta(),jet.p4().Phi() ) > 0.2