Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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])
Ejemplo n.º 4
0
    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])
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
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))
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
 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
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
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())
Ejemplo n.º 11
0
    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    
Ejemplo n.º 12
0
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 
Ejemplo n.º 13
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())
Ejemplo n.º 14
0
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 
Ejemplo n.º 15
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())
Ejemplo n.º 16
0
 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
Ejemplo n.º 17
0
    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
Ejemplo n.º 18
0
    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
Ejemplo n.º 19
0
    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
Ejemplo n.º 20
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)
Ejemplo n.º 21
0
 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
Ejemplo n.º 22
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)
Ejemplo n.º 23
0
 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
Ejemplo n.º 24
0
 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)
Ejemplo n.º 25
0
    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
Ejemplo n.º 26
0
    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
Ejemplo n.º 27
0
    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')
Ejemplo n.º 28
0
 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)
Ejemplo n.º 29
0
    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)
Ejemplo n.º 30
0
    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))                                                       
Ejemplo n.º 32
0
    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)
Ejemplo n.º 33
0
    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
Ejemplo n.º 34
0
    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
Ejemplo n.º 35
0
    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
Ejemplo n.º 36
0
    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
Ejemplo n.º 38
0
 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)
Ejemplo n.º 39
0
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))
Ejemplo n.º 40
0
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())
Ejemplo n.º 41
0
    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
Ejemplo n.º 42
0
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())
Ejemplo n.º 43
0
    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
Ejemplo n.º 44
0
 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
Ejemplo n.º 45
0
    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
Ejemplo n.º 46
0
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())
Ejemplo n.º 47
0
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
Ejemplo n.º 48
0
    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"),
])
Ejemplo n.º 49
0
 def drllValues(self, event, pairSelection, maxLeps):
     return self.llValues(
         event,
         lambda l1, l2: deltaR(l1.eta(), l1.phi(), l2.eta(), l2.phi()),
         pairSelection, maxLeps)
Ejemplo n.º 50
0
        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()),
Ejemplo n.º 51
0
    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
Ejemplo n.º 52
0
    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)
Ejemplo n.º 53
0
    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())
Ejemplo n.º 54
0
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
Ejemplo n.º 55
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
Ejemplo n.º 56
0
    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])
Ejemplo n.º 57
0
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