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
0061 elif dm == 'kThreeProngOther':
0062 return 110
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