File indexing completed on 2024-04-06 12:23:34
0001 #include "PhysicsTools/JetMCAlgos/plugins/TauGenJetProducer.h"
0002
0003 #include "FWCore/Framework/interface/ESHandle.h"
0004
0005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0006 #include "FWCore/Utilities/interface/Exception.h"
0007 #include "FWCore/Framework/interface/EventSetup.h"
0008
0009 #include "DataFormats/JetReco/interface/GenJetCollection.h"
0010 #include "DataFormats/JetReco/interface/GenJet.h"
0011 #include "DataFormats/Common/interface/RefToPtr.h"
0012
0013 #include "PhysicsTools/HepMCCandAlgos/interface/GenParticlesHelper.h"
0014 #include "PhysicsTools/JetMCUtils/interface/JetMCTag.h"
0015 #include "DataFormats/TauReco/interface/PFTau.h"
0016
0017 using namespace std;
0018 using namespace edm;
0019 using namespace reco;
0020
0021 namespace {
0022
0023 const std::map<std::string, int> decayModeStringToCodeMap = {{"null", PFTau::kNull},
0024 {"oneProng0Pi0", PFTau::kOneProng0PiZero},
0025 {"oneProng1Pi0", PFTau::kOneProng1PiZero},
0026 {"oneProng2Pi0", PFTau::kOneProng2PiZero},
0027 {"threeProng0Pi0", PFTau::kThreeProng0PiZero},
0028 {"threeProng1Pi0", PFTau::kThreeProng1PiZero},
0029 {"electron", PFTau::kRareDecayMode + 1},
0030 {"muon", PFTau::kRareDecayMode + 2},
0031 {"rare", PFTau::kRareDecayMode},
0032 {"tau", PFTau::kNull - 1}};
0033 }
0034
0035 TauGenJetProducer::TauGenJetProducer(const edm::ParameterSet& iConfig)
0036 : tokenGenParticles_(consumes<GenParticleCollection>(iConfig.getParameter<InputTag>("GenParticles"))),
0037 includeNeutrinos_(iConfig.getParameter<bool>("includeNeutrinos")),
0038 verbose_(iConfig.getUntrackedParameter<bool>("verbose", false)) {
0039 produces<GenJetCollection>();
0040 }
0041
0042 TauGenJetProducer::~TauGenJetProducer() {}
0043
0044 void TauGenJetProducer::produce(edm::StreamID, Event& iEvent, const EventSetup& iSetup) const {
0045 Handle<GenParticleCollection> genParticles = iEvent.getHandle(tokenGenParticles_);
0046
0047 auto pOutVisTaus = std::make_unique<GenJetCollection>();
0048
0049 using namespace GenParticlesHelper;
0050
0051 GenParticleRefVector allStatus2Taus;
0052 findParticles(*genParticles, allStatus2Taus, 15, 2);
0053
0054 for (IGR iTau = allStatus2Taus.begin(); iTau != allStatus2Taus.end(); ++iTau) {
0055
0056 GenParticleRefVector descendents;
0057 findDescendents(*iTau, descendents, 1);
0058 if (descendents.empty()) {
0059 edm::LogWarning("NoTauDaughters") << "Tau p4: " << (*iTau)->p4() << " vtx: " << (*iTau)->vertex()
0060 << " has no daughters";
0061
0062 math::XYZPoint vertex;
0063 GenJet::Specific specific;
0064 Jet::Constituents constituents;
0065
0066 constituents.push_back(refToPtr(*iTau));
0067 GenJet jet((*iTau)->p4(), vertex, specific, constituents);
0068 jet.setCharge((*iTau)->charge());
0069 jet.setStatus(decayModeStringToCodeMap.at("tau"));
0070 pOutVisTaus->emplace_back(std::move(jet));
0071 continue;
0072 }
0073
0074
0075 GenParticleRefVector status2TauDaughters;
0076 findDescendents(*iTau, status2TauDaughters, 2, 15);
0077 if (!status2TauDaughters.empty())
0078 continue;
0079
0080
0081 math::XYZTLorentzVector sumVisMom;
0082 Particle::Charge charge = 0;
0083 Jet::Constituents constituents;
0084
0085 if (verbose_)
0086 cout << "tau " << (*iTau) << endl;
0087
0088 for (IGR igr = descendents.begin(); igr != descendents.end(); ++igr) {
0089 int absPdgId = abs((*igr)->pdgId());
0090
0091
0092 if (!includeNeutrinos_) {
0093 if (absPdgId == 12 || absPdgId == 14 || absPdgId == 16)
0094 continue;
0095 }
0096
0097 if (verbose_)
0098 cout << "\t" << (*igr) << endl;
0099
0100 charge += (*igr)->charge();
0101 sumVisMom += (*igr)->p4();
0102
0103
0104
0105 constituents.push_back(refToPtr(*igr));
0106 }
0107
0108 math::XYZPoint vertex;
0109 GenJet::Specific specific;
0110
0111 GenJet jet(sumVisMom, vertex, specific, constituents);
0112
0113 if (charge != (*iTau)->charge())
0114 edm::LogError("TauGenJetProducer") << " charge of Tau: " << (*iTau)
0115 << " not equal to charge of sum of charge of all descendents.\n"
0116 << " Tau's charge: " << (*iTau)->charge() << " sum: " << charge
0117 << " # descendents: " << constituents.size() << "\n";
0118
0119 jet.setCharge(charge);
0120
0121 if (auto search = decayModeStringToCodeMap.find(JetMCTagUtils::genTauDecayMode(jet));
0122 search != decayModeStringToCodeMap.end())
0123 jet.setStatus(search->second);
0124 else
0125 jet.setStatus(decayModeStringToCodeMap.at("null"));
0126 pOutVisTaus->push_back(jet);
0127 }
0128 iEvent.put(std::move(pOutVisTaus));
0129 }
0130
0131 DEFINE_FWK_MODULE(TauGenJetProducer);