Go to the documentation of this file.00001 #include <map>
00002 #include <boost/assign.hpp>
00003 #include "RecoTauTag/RecoTau/interface/PFTauDecayModeTools.h"
00004 #include "DataFormats/JetReco/interface/GenJet.h"
00005 #include "PhysicsTools/JetMCUtils/interface/JetMCTag.h"
00006
00007 namespace reco { namespace tau {
00008
00009 namespace {
00010
00011
00012 static std::map<std::string, reco::PFTau::hadronicDecayMode> dmTranslator =
00013 boost::assign::map_list_of
00014 ("oneProng0Pi0", reco::PFTau::kOneProng0PiZero)
00015 ("oneProng1Pi0", reco::PFTau::kOneProng1PiZero)
00016 ("oneProng2Pi0", reco::PFTau::kOneProng2PiZero)
00017 ("oneProngOther", reco::PFTau::kOneProngNPiZero)
00018 ("threeProng0Pi0", reco::PFTau::kThreeProng0PiZero)
00019 ("threeProng1Pi0", reco::PFTau::kThreeProng1PiZero)
00020 ("threeProngOther", reco::PFTau::kThreeProngNPiZero)
00021 ("electron", reco::PFTau::kNull)
00022 ("muon", reco::PFTau::kNull);
00023
00024 static std::map<reco::PFTau::hadronicDecayMode, std::string> dmInverter =
00025 boost::assign::map_list_of
00026 (reco::PFTau::kOneProng0PiZero, "oneProng0Pi0")
00027 (reco::PFTau::kOneProng1PiZero, "oneProng1Pi0")
00028 (reco::PFTau::kOneProng2PiZero, "oneProng2Pi0")
00029 (reco::PFTau::kOneProngNPiZero, "oneProngOther")
00030 (reco::PFTau::kThreeProng0PiZero, "threeProng0Pi0")
00031 (reco::PFTau::kThreeProng1PiZero, "threeProng1Pi0")
00032 (reco::PFTau::kThreeProngNPiZero, "threeProngOther")
00033 (reco::PFTau::kNull, "unknown")
00034 (reco::PFTau::kRareDecayMode, "rare");
00035 }
00036
00037 unsigned int chargedHadronsInDecayMode(PFTau::hadronicDecayMode mode) {
00038 int modeAsInt = static_cast<int>(mode);
00039 return (modeAsInt / PFTau::kOneProngNPiZero) + 1;
00040 }
00041
00042 unsigned int piZerosInDecayMode(PFTau::hadronicDecayMode mode) {
00043 int modeAsInt = static_cast<int>(mode);
00044 return (modeAsInt % PFTau::kOneProngNPiZero);
00045 }
00046
00047 PFTau::hadronicDecayMode translateDecayMode(
00048 unsigned int nCharged, unsigned int nPiZeros) {
00049
00050 if(!nCharged) return PFTau::kNull;
00051
00052 const unsigned int maxPiZeros = PFTau::kOneProngNPiZero;
00053
00054 unsigned int trackIndex = (nCharged-1)*(maxPiZeros+1);
00055
00056 if(trackIndex >= PFTau::kRareDecayMode) return PFTau::kRareDecayMode;
00057
00058 nPiZeros = (nPiZeros <= maxPiZeros) ? nPiZeros : maxPiZeros;
00059 return static_cast<PFTau::hadronicDecayMode>(trackIndex + nPiZeros);
00060 }
00061
00062 PFTau::hadronicDecayMode translateGenDecayModeToReco(
00063 const std::string& name) {
00064 std::map<std::string, reco::PFTau::hadronicDecayMode>::const_iterator
00065 found = dmTranslator.find(name);
00066 if (found != dmTranslator.end()) {
00067 return found->second;
00068 } else
00069 return reco::PFTau::kRareDecayMode;
00070 }
00071
00072 std::string translateRecoDecayModeToGen(PFTau::hadronicDecayMode decayMode) {
00073 std::map<reco::PFTau::hadronicDecayMode, std::string>::const_iterator
00074 found = dmInverter.find(decayMode);
00075 if (found != dmInverter.end()) {
00076 return found->second;
00077 } else
00078 return "unknown";
00079 }
00080
00081
00082 PFTau::hadronicDecayMode getDecayMode(const reco::GenJet* genJet) {
00083 if (!genJet)
00084 return reco::PFTau::kNull;
00085 return translateGenDecayModeToReco(JetMCTagUtils::genTauDecayMode(*genJet));
00086 }
00087
00088 }}