File indexing completed on 2023-03-17 11:15:52
0001 #include "FWCore/Framework/interface/global/EDProducer.h"
0002 #include "FWCore/Utilities/interface/InputTag.h"
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0005 #include "DataFormats/Common/interface/ValueMap.h"
0006 #include "DataFormats/Candidate/interface/Candidate.h"
0007 #include "DataFormats/Candidate/interface/CandidateFwd.h"
0008 #include "DataFormats/RecoCandidate/interface/IsoDeposit.h"
0009 #include "DataFormats/RecoCandidate/interface/IsoDepositFwd.h"
0010
0011 class IsolationProducerForTracks : public edm::global::EDProducer<> {
0012 public:
0013 IsolationProducerForTracks(const edm::ParameterSet&);
0014
0015 private:
0016 void produce(edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const override;
0017
0018 const edm::EDGetTokenT<reco::CandidateView> tracksToken_;
0019 const edm::EDGetTokenT<reco::CandidateView> highPtTracksToken_;
0020 const edm::EDGetTokenT<reco::IsoDepositMap> isoDepsToken_;
0021 const double trackPtMin_;
0022 const double coneSize_;
0023 };
0024
0025 #include "DataFormats/Common/interface/Handle.h"
0026 #include "DataFormats/Common/interface/Association.h"
0027 #include "DataFormats/Common/interface/Ref.h"
0028 #include "DataFormats/Candidate/interface/OverlapChecker.h"
0029 #include <iostream>
0030 #include <iterator>
0031 #include <vector>
0032
0033 using namespace edm;
0034 using namespace reco;
0035
0036 typedef edm::ValueMap<float> TkIsoMap;
0037
0038 IsolationProducerForTracks::IsolationProducerForTracks(const ParameterSet& pset)
0039 : tracksToken_(consumes<CandidateView>(pset.getParameter<InputTag>("tracks"))),
0040 highPtTracksToken_(consumes<CandidateView>(pset.getParameter<InputTag>("highPtTracks"))),
0041 isoDepsToken_(consumes<IsoDepositMap>(pset.getParameter<InputTag>("isoDeps"))),
0042 trackPtMin_(pset.getParameter<double>("trackPtMin")),
0043 coneSize_(pset.getParameter<double>("coneSize")) {
0044 produces<TkIsoMap>();
0045 }
0046
0047 void IsolationProducerForTracks::produce(edm::StreamID, Event& event, const EventSetup& setup) const {
0048 auto caloIsolations = std::make_unique<TkIsoMap>();
0049 TkIsoMap::Filler filler(*caloIsolations);
0050 {
0051 Handle<CandidateView> tracks;
0052 event.getByToken(tracksToken_, tracks);
0053
0054 Handle<CandidateView> highPtTracks;
0055 event.getByToken(highPtTracksToken_, highPtTracks);
0056
0057 Handle<IsoDepositMap> isoDeps;
0058 event.getByToken(isoDepsToken_, isoDeps);
0059
0060 int nTracks = tracks->size();
0061 int nHighPtTracks = highPtTracks->size();
0062 std::vector<double> iso(nTracks);
0063
0064 OverlapChecker overlap;
0065
0066 for (int i = 0; i < nTracks; ++i) {
0067 const Candidate& tkCand = (*tracks)[i];
0068 double caloIso = -1.0;
0069 if (tkCand.pt() > trackPtMin_) {
0070 for (int j = 0; j < nHighPtTracks; ++j) {
0071 const Candidate& highPtTkCand = (*highPtTracks)[j];
0072 if (overlap(tkCand, highPtTkCand)) {
0073 CandidateBaseRef tkRef = highPtTracks->refAt(j);
0074 const IsoDeposit& isoDep = (*isoDeps)[tkRef];
0075 caloIso = isoDep.depositWithin(coneSize_);
0076 break;
0077 }
0078 }
0079 }
0080 iso[i] = caloIso;
0081 }
0082 filler.insert(tracks, iso.begin(), iso.end());
0083 }
0084
0085
0086 filler.fill();
0087 event.put(std::move(caloIsolations));
0088 }
0089
0090 #include "FWCore/Framework/interface/MakerMacros.h"
0091
0092 DEFINE_FWK_MODULE(IsolationProducerForTracks);