File indexing completed on 2024-04-06 12:31:20
0001 #include "DataFormats/Math/interface/deltaR.h"
0002 #include "AnalysisDataFormats/TopObjects/interface/TtGenEvent.h"
0003 #include "AnalysisDataFormats/TopObjects/interface/TtSemiLepEvtPartons.h"
0004 #include "TopQuarkAnalysis/TopJetCombination/interface/TtSemiLepHypothesis.h"
0005
0006 class TtSemiLepHypGenMatch : public TtSemiLepHypothesis {
0007 public:
0008 explicit TtSemiLepHypGenMatch(const edm::ParameterSet&);
0009
0010 private:
0011
0012 void buildKey() override { key_ = TtSemiLeptonicEvent::kGenMatch; };
0013
0014 void buildHypo(edm::Event&,
0015 const edm::Handle<edm::View<reco::RecoCandidate> >&,
0016 const edm::Handle<std::vector<pat::MET> >&,
0017 const edm::Handle<std::vector<pat::Jet> >&,
0018 std::vector<int>&,
0019 const unsigned int iComb) override;
0020
0021 int findMatchingLepton(const edm::Handle<TtGenEvent>& genEvt, const edm::Handle<edm::View<reco::RecoCandidate> >&);
0022
0023 protected:
0024 edm::EDGetTokenT<TtGenEvent> genEvtToken_;
0025 };
0026
0027 TtSemiLepHypGenMatch::TtSemiLepHypGenMatch(const edm::ParameterSet& cfg)
0028 : TtSemiLepHypothesis(cfg), genEvtToken_(consumes<TtGenEvent>(edm::InputTag("genEvt"))) {}
0029
0030 void TtSemiLepHypGenMatch::buildHypo(edm::Event& evt,
0031 const edm::Handle<edm::View<reco::RecoCandidate> >& leps,
0032 const edm::Handle<std::vector<pat::MET> >& mets,
0033 const edm::Handle<std::vector<pat::Jet> >& jets,
0034 std::vector<int>& match,
0035 const unsigned int iComb) {
0036
0037
0038
0039
0040 edm::Handle<TtGenEvent> genEvt;
0041 evt.getByToken(genEvtToken_, genEvt);
0042
0043
0044
0045
0046 for (unsigned idx = 0; idx < match.size(); ++idx) {
0047 if (isValid(match[idx], jets)) {
0048 switch (idx) {
0049 case TtSemiLepEvtPartons::LightQ:
0050 if (std::abs(genEvt->hadronicDecayQuark()->pdgId()) == 4)
0051 lightQ_ = makeCandidate(jets, match[idx], jetCorrectionLevel("cQuark"));
0052 else
0053 lightQ_ = makeCandidate(jets, match[idx], jetCorrectionLevel("udsQuark"));
0054 break;
0055 case TtSemiLepEvtPartons::LightQBar:
0056 if (std::abs(genEvt->hadronicDecayQuarkBar()->pdgId()) == 4)
0057 lightQBar_ = makeCandidate(jets, match[idx], jetCorrectionLevel("cQuark"));
0058 else
0059 lightQBar_ = makeCandidate(jets, match[idx], jetCorrectionLevel("udsQuark"));
0060 break;
0061 case TtSemiLepEvtPartons::HadB:
0062 hadronicB_ = makeCandidate(jets, match[idx], jetCorrectionLevel("bQuark"));
0063 break;
0064 case TtSemiLepEvtPartons::LepB:
0065 leptonicB_ = makeCandidate(jets, match[idx], jetCorrectionLevel("bQuark"));
0066 break;
0067 }
0068 }
0069 }
0070
0071
0072
0073
0074 int iLepton = findMatchingLepton(genEvt, leps);
0075 if (iLepton < 0)
0076 return;
0077 lepton_ = makeCandidate(leps, iLepton);
0078 match.push_back(iLepton);
0079
0080
0081
0082
0083 if (mets->empty())
0084 return;
0085 if (neutrinoSolutionType_ == -1)
0086 neutrino_ = makeCandidate(mets, 0);
0087 else
0088 setNeutrino(mets, leps, iLepton, neutrinoSolutionType_);
0089 }
0090
0091
0092 int TtSemiLepHypGenMatch::findMatchingLepton(const edm::Handle<TtGenEvent>& genEvt,
0093 const edm::Handle<edm::View<reco::RecoCandidate> >& leps) {
0094 int genIdx = -1;
0095
0096
0097 if (leps->empty())
0098 return genIdx;
0099
0100 if (genEvt->isTtBar() && genEvt->isSemiLeptonic(leptonType(&(leps->front()))) && genEvt->singleLepton()) {
0101 double minDR = -1;
0102 for (unsigned i = 0; i < leps->size(); ++i) {
0103 double dR =
0104 deltaR(genEvt->singleLepton()->eta(), genEvt->singleLepton()->phi(), (*leps)[i].eta(), (*leps)[i].phi());
0105 if (minDR < 0 || dR < minDR) {
0106 minDR = dR;
0107 genIdx = i;
0108 }
0109 }
0110 }
0111 return genIdx;
0112 }
0113
0114 #include "FWCore/Framework/interface/MakerMacros.h"
0115 DEFINE_FWK_MODULE(TtSemiLepHypGenMatch);