File indexing completed on 2024-09-07 04:37:19
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <memory>
0021
0022
0023 #include "FWCore/Framework/interface/Frameworkfwd.h"
0024 #include "FWCore/Framework/interface/global/EDProducer.h"
0025
0026 #include "FWCore/Framework/interface/Event.h"
0027 #include "FWCore/Framework/interface/MakerMacros.h"
0028
0029 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0030 #include "FWCore/Utilities/interface/StreamID.h"
0031
0032 #include "DataFormats/PatCandidates/interface/Muon.h"
0033 #include "DataFormats/PatCandidates/interface/Jet.h"
0034 #include "DataFormats/PatCandidates/interface/Electron.h"
0035 #include "DataFormats/VertexReco/interface/Vertex.h"
0036
0037 #include "DataFormats/Common/interface/View.h"
0038 #include "DataFormats/Candidate/interface/VertexCompositePtrCandidate.h"
0039
0040 #include "PhysicsTools/NanoAOD/interface/MatchingUtils.h"
0041
0042
0043
0044
0045
0046 template <typename T>
0047 class LeptonJetVarProducer : public edm::global::EDProducer<> {
0048 public:
0049 explicit LeptonJetVarProducer(const edm::ParameterSet& iConfig)
0050 : srcJet_(consumes<edm::View<pat::Jet>>(iConfig.getParameter<edm::InputTag>("srcJet"))),
0051 srcLep_(consumes<edm::View<T>>(iConfig.getParameter<edm::InputTag>("srcLep"))),
0052 srcVtx_(consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("srcVtx"))) {
0053 produces<edm::ValueMap<float>>("ptRatio");
0054 produces<edm::ValueMap<float>>("ptRel");
0055 produces<edm::ValueMap<float>>("jetNDauChargedMVASel");
0056 produces<edm::ValueMap<reco::CandidatePtr>>("jetForLepJetVar");
0057 }
0058 ~LeptonJetVarProducer() override {}
0059
0060 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0061
0062 private:
0063 void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
0064
0065 std::tuple<float, float, float> calculatePtRatioRel(edm::Ptr<reco::Candidate> lep,
0066 edm::Ptr<pat::Jet> jet,
0067 const reco::Vertex& vtx) const;
0068
0069
0070
0071 edm::EDGetTokenT<edm::View<pat::Jet>> srcJet_;
0072 edm::EDGetTokenT<edm::View<T>> srcLep_;
0073 edm::EDGetTokenT<std::vector<reco::Vertex>> srcVtx_;
0074 };
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089 template <typename T>
0090 void LeptonJetVarProducer<T>::produce(edm::StreamID streamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
0091 auto srcJet = iEvent.getHandle(srcJet_);
0092 auto srcLep = iEvent.getHandle(srcLep_);
0093 const auto& vtxProd = iEvent.get(srcVtx_);
0094
0095 unsigned int nJet = srcJet->size();
0096 unsigned int nLep = srcLep->size();
0097
0098 std::vector<float> ptRatio(nLep, -1);
0099 std::vector<float> ptRel(nLep, -1);
0100 std::vector<float> jetNDauChargedMVASel(nLep, 0);
0101 std::vector<reco::CandidatePtr> jetForLepJetVar(nLep, reco::CandidatePtr());
0102
0103 const auto& pv = vtxProd.at(0);
0104
0105 for (unsigned int il = 0; il < nLep; il++) {
0106 for (unsigned int ij = 0; ij < nJet; ij++) {
0107 auto lep = srcLep->ptrAt(il);
0108 auto jet = srcJet->ptrAt(ij);
0109 if (matchByCommonSourceCandidatePtr(*lep, *jet)) {
0110 auto res = calculatePtRatioRel(lep, jet, pv);
0111 ptRatio[il] = std::get<0>(res);
0112 ptRel[il] = std::get<1>(res);
0113 jetNDauChargedMVASel[il] = std::get<2>(res);
0114 jetForLepJetVar[il] = jet;
0115 break;
0116 }
0117 }
0118 }
0119
0120 auto ptRatioV = std::make_unique<edm::ValueMap<float>>();
0121 edm::ValueMap<float>::Filler fillerRatio(*ptRatioV);
0122 fillerRatio.insert(srcLep, ptRatio.begin(), ptRatio.end());
0123 fillerRatio.fill();
0124 iEvent.put(std::move(ptRatioV), "ptRatio");
0125
0126 auto ptRelV = std::make_unique<edm::ValueMap<float>>();
0127 edm::ValueMap<float>::Filler fillerRel(*ptRelV);
0128 fillerRel.insert(srcLep, ptRel.begin(), ptRel.end());
0129 fillerRel.fill();
0130 iEvent.put(std::move(ptRelV), "ptRel");
0131
0132 auto jetNDauChargedMVASelV = std::make_unique<edm::ValueMap<float>>();
0133 edm::ValueMap<float>::Filler fillerNDau(*jetNDauChargedMVASelV);
0134 fillerNDau.insert(srcLep, jetNDauChargedMVASel.begin(), jetNDauChargedMVASel.end());
0135 fillerNDau.fill();
0136 iEvent.put(std::move(jetNDauChargedMVASelV), "jetNDauChargedMVASel");
0137
0138 auto jetForLepJetVarV = std::make_unique<edm::ValueMap<reco::CandidatePtr>>();
0139 edm::ValueMap<reco::CandidatePtr>::Filler fillerjetForLepJetVar(*jetForLepJetVarV);
0140 fillerjetForLepJetVar.insert(srcLep, jetForLepJetVar.begin(), jetForLepJetVar.end());
0141 fillerjetForLepJetVar.fill();
0142 iEvent.put(std::move(jetForLepJetVarV), "jetForLepJetVar");
0143 }
0144
0145 template <typename T>
0146 std::tuple<float, float, float> LeptonJetVarProducer<T>::calculatePtRatioRel(edm::Ptr<reco::Candidate> lep,
0147 edm::Ptr<pat::Jet> jet,
0148 const reco::Vertex& vtx) const {
0149 auto rawp4 = jet->correctedP4("Uncorrected");
0150 auto lepp4 = lep->p4();
0151
0152 if ((rawp4 - lepp4).R() < 1e-4)
0153 return std::tuple<float, float, float>(1.0, 0.0, 0.0);
0154
0155 auto l1corrFactor = jet->jecFactor("L1FastJet") / jet->jecFactor("Uncorrected");
0156
0157 auto jetp4 = (rawp4 - lepp4 * (1.0 / l1corrFactor)) * (jet->pt() / rawp4.pt()) + lepp4;
0158 auto ptratio = lepp4.pt() / jetp4.pt();
0159 auto ptrel = lepp4.Vect().Cross((jetp4 - lepp4).Vect().Unit()).R();
0160
0161 unsigned int jndau = 0;
0162 for (const auto& _d : jet->daughterPtrVector()) {
0163 const auto d = dynamic_cast<const pat::PackedCandidate*>(_d.get());
0164 if (d->charge() == 0)
0165 continue;
0166 if (d->fromPV() <= 1)
0167 continue;
0168 if (deltaR(*d, *lep) > 0.4)
0169 continue;
0170 if (!(d->hasTrackDetails()))
0171 continue;
0172 auto tk = d->pseudoTrack();
0173 if (tk.pt() > 1 && tk.hitPattern().numberOfValidHits() >= 8 && tk.hitPattern().numberOfValidPixelHits() >= 2 &&
0174 tk.normalizedChi2() < 5 && fabs(tk.dxy(vtx.position())) < 0.2 && fabs(tk.dz(vtx.position())) < 17)
0175 jndau++;
0176 }
0177
0178 return std::tuple<float, float, float>(ptratio, ptrel, float(jndau));
0179 }
0180
0181
0182 template <typename T>
0183 void LeptonJetVarProducer<T>::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0184
0185
0186 edm::ParameterSetDescription desc;
0187 desc.add<edm::InputTag>("srcJet")->setComment("jet input collection");
0188 desc.add<edm::InputTag>("srcLep")->setComment("lepton input collection");
0189 desc.add<edm::InputTag>("srcVtx")->setComment("primary vertex input collection");
0190 std::string modname;
0191 if (typeid(T) == typeid(pat::Muon))
0192 modname += "Muon";
0193 else if (typeid(T) == typeid(pat::Electron))
0194 modname += "Electron";
0195 modname += "JetVarProducer";
0196 descriptions.add(modname, desc);
0197 }
0198
0199 typedef LeptonJetVarProducer<pat::Muon> MuonJetVarProducer;
0200 typedef LeptonJetVarProducer<pat::Electron> ElectronJetVarProducer;
0201
0202
0203 DEFINE_FWK_MODULE(MuonJetVarProducer);
0204 DEFINE_FWK_MODULE(ElectronJetVarProducer);