Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-11-25 02:29:50

0001 
0002 class TauDecayModes( object ): 
0003 
0004     def __init__(self):
0005         self._decayModes() 
0006         
0007     def _decayModes(self):
0008         '''Builds the internal dictionaries from the enum defined in 
0009         http://cmslxr.fnal.gov/lxr/source/DataFormats/TauReco/interface/PFTau.h'''
0010         tmp = [
0011             'kNull',
0012             'kOneProng0PiZero',
0013             'kOneProng1PiZero',
0014             'kOneProng2PiZero',
0015             'kOneProng3PiZero',
0016             'kOneProngNPiZero',
0017             'kTwoProng0PiZero',
0018             'kTwoProng1PiZero',
0019             'kTwoProng2PiZero',
0020             'kTwoProng3PiZero',
0021             'kTwoProngNPiZero',
0022             'kThreeProng0PiZero',
0023             'kThreeProng1PiZero',
0024             'kThreeProng2PiZero',
0025             'kThreeProng3PiZero',
0026             'kThreeProngNPiZero',
0027             'kRareDecayMode'
0028             ]
0029         self.decayModes = dict( (index-1, name) for index, name in enumerate( tmp ) )
0030         self.decayModeNames = dict( (value, key) for key, value \
0031                                     in self.decayModes.items() )
0032 
0033     def intToName( self, anInt ):
0034         '''Returns the decay mode name corresponding to an int.'''
0035         return self.decayModes[ anInt ]
0036 
0037     def nameToInt( self, aName ):
0038         '''Returns the decay mode int corresponding to a name.'''
0039         return self.decayModeNames[ aName ]      
0040     
0041     def __str__(self):
0042         return str( self.decayModes )
0043 
0044     def genDecayModeInt(self, daughters):
0045         dm = self.genDecayMode(daughters)
0046         return self.translateGenModeToInt(dm)
0047 
0048     def genDecayModeFromJetInt(self, c):
0049         dm = self.genDecayModeFromGenJet(c)
0050         return self.translateGenModeToInt(dm)
0051 
0052     def translateGenModeToInt(self, dm):
0053         if dm in self.decayModeNames:
0054             return self.nameToInt(dm)
0055         elif dm == 'electron':
0056             return -11
0057         elif dm == 'muon':
0058             return -13
0059         elif dm == 'kOneProngOther':
0060             return 100 # one-prong + 100
0061         elif dm == 'kThreeProngOther':
0062             return 110 # three-prong + 100
0063         return -99
0064 
0065     @staticmethod
0066     def genDecayModeFromGenJet(c):
0067         ''' Returns generated tau decay mode. Needs to be called on genJet
0068         as stored in pat::Tau, if available.
0069 
0070         Translated from PhysicsTools/JetMCUtils/interface/JetMCTag.h,
0071         which is not available in FWlite.
0072         '''
0073 
0074         daughters = c.daughterPtrVector()
0075 
0076         return TauDecayModes.genDecayMode(daughters)
0077 
0078     @staticmethod
0079     def genDecayMode(daughters):
0080         ''' Returns the generated tau decay mode based on a passed list of all
0081         final daughters before further decay (as contained in miniAOD).
0082         '''
0083         numElectrons = 0
0084         numMuons = 0
0085         numChargedHadrons = 0
0086         numNeutralHadrons = 0
0087         numPhotons = 0
0088   
0089         for daughter in daughters:
0090             pdg_id = abs(daughter.pdgId())
0091             if pdg_id == 22:
0092                 numPhotons += 1
0093             elif pdg_id == 11:
0094                 numElectrons +=1
0095             elif pdg_id == 13:
0096                 numMuons += 1
0097             else:
0098                 if daughter.charge() != 0:
0099                     numChargedHadrons += 1
0100                 elif pdg_id not in [12, 14, 16]:
0101                     numNeutralHadrons += 1
0102 
0103         if numElectrons == 1:
0104             return "electron"
0105         if numMuons == 1:
0106             return "muon"
0107 
0108         if numChargedHadrons == 1:
0109             if numNeutralHadrons != 0:
0110                 return "kOneProngOther"
0111             if numPhotons == 0:
0112                 return "kOneProng0PiZero"
0113             elif numPhotons == 2:
0114                 return "kOneProng1PiZero"
0115             elif numPhotons == 4:
0116                 return "kOneProng2PiZero"
0117             elif numPhotons == 6:
0118                 return "kOneProng3PiZero"
0119             else:
0120                 return "kOneProngNPiZero"
0121         elif numChargedHadrons == 3:
0122             if numNeutralHadrons != 0:
0123                 return "kThreeProngOther"
0124             if numPhotons == 0:
0125                 return "kThreeProng0PiZero"
0126             elif numPhotons == 2:
0127                 return "kThreeProng1PiZero"
0128             elif numPhotons == 4:
0129                 return "kThreeProng2PiZero"
0130             elif numPhotons == 6:
0131                 return "kThreeProng3PiZero"
0132             else:
0133                 return "kThreeProngNPiZero"
0134 
0135         return "kRareDecayMode"
0136 
0137 tauDecayModes = TauDecayModes()
0138 
0139 if __name__ == '__main__':
0140 
0141     dec = TauDecayModes()
0142     print(dec)
0143 
0144     print(0, dec.intToName(0))
0145     print('kThreeProng0PiZero', dec.nameToInt('kThreeProng0PiZero'))
0146