File indexing completed on 2024-12-20 03:14:02
0001 #include "FWCore/Framework/interface/Frameworkfwd.h"
0002 #include "FWCore/Framework/interface/stream/EDProducer.h"
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "FWCore/Framework/interface/ESHandle.h"
0005 #include "FWCore/Framework/interface/MakerMacros.h"
0006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0007
0008 #include "DataFormats/Common/interface/ValueMap.h"
0009 #include "DataFormats/Common/interface/View.h"
0010 #include "DataFormats/Common/interface/Handle.h"
0011 #include "DataFormats/Math/interface/Point3D.h"
0012 #include "DataFormats/PatCandidates/interface/PackedCandidate.h"
0013
0014 #include "RecoEgamma/EgammaIsolationAlgos/interface/SuperclusTkIsolFromCands.h"
0015
0016
0017
0018 class SuperclusValueMapProducer : public edm::stream::EDProducer<> {
0019 public:
0020 explicit SuperclusValueMapProducer(const edm::ParameterSet&);
0021 ~SuperclusValueMapProducer() override = default;
0022
0023 private:
0024 void produce(edm::Event&, const edm::EventSetup&) override;
0025
0026 std::vector<edm::EDGetTokenT<pat::PackedCandidateCollection>> setTokens(const std::vector<edm::InputTag>& tags);
0027
0028 template <typename T>
0029 static void writeValueMap(edm::Event& iEvent,
0030 const edm::Handle<edm::View<reco::SuperCluster>>& handle,
0031 const std::vector<T>& values,
0032 const std::string& label);
0033
0034 std::vector<SuperclusTkIsolFromCands::PIDVeto> candVetos_;
0035
0036 const std::vector<edm::InputTag> candTags_;
0037 const std::vector<edm::EDGetTokenT<pat::PackedCandidateCollection>> candTokens_;
0038 const edm::EDGetTokenT<edm::View<reco::SuperCluster>> scToken_;
0039 const edm::EDGetTokenT<edm::View<reco::Vertex>> pvToken_;
0040 const edm::EDGetTokenT<reco::BeamSpot> bsToken_;
0041
0042 const SuperclusTkIsolFromCands::Configuration trkIsoCalcCfg_;
0043
0044 const std::string superclusTkIsoLabel_ = "superclusTkIso";
0045 };
0046
0047 SuperclusValueMapProducer::SuperclusValueMapProducer(const edm::ParameterSet& iConfig)
0048 : candTags_(iConfig.getParameter<std::vector<edm::InputTag>>("cands")),
0049 candTokens_(setTokens(candTags_)),
0050 scToken_(consumes<edm::View<reco::SuperCluster>>(iConfig.getParameter<edm::InputTag>("srcSc"))),
0051 pvToken_(consumes<edm::View<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("srcPv"))),
0052 bsToken_(consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("srcBs"))),
0053 trkIsoCalcCfg_(iConfig.getParameter<edm::ParameterSet>("trkIsoConfig")) {
0054 auto fillVetos = [](const auto& in, auto& out) {
0055 std::transform(in.begin(), in.end(), std::back_inserter(out), SuperclusTkIsolFromCands::pidVetoFromStr);
0056 };
0057
0058 fillVetos(iConfig.getParameter<std::vector<std::string>>("candVetos"), candVetos_);
0059
0060 if (candVetos_.size() != candTags_.size())
0061 throw cms::Exception("ConfigError") << "Error candVetos should be the same size as cands" << std::endl;
0062
0063 produces<edm::ValueMap<float>>(superclusTkIsoLabel_);
0064 }
0065
0066 void SuperclusValueMapProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0067 edm::Handle<edm::View<reco::SuperCluster>> scHandle;
0068 iEvent.getByToken(scToken_, scHandle);
0069
0070 edm::Handle<edm::View<reco::Vertex>> pvHandle;
0071 iEvent.getByToken(pvToken_, pvHandle);
0072
0073 edm::Handle<reco::BeamSpot> bsHandle;
0074 iEvent.getByToken(bsToken_, bsHandle);
0075
0076 math::XYZPoint pos;
0077
0078 if (pvHandle.isValid() && !pvHandle->empty())
0079 pos = pvHandle->front().position();
0080 else
0081 pos = (*bsHandle).position();
0082
0083 std::vector<edm::Handle<pat::PackedCandidateCollection>> candHandles(candTokens_.size());
0084 std::vector<std::unique_ptr<SuperclusTkIsolFromCands>> tkIsoCalc;
0085
0086 for (unsigned idx = 0; idx < candTokens_.size(); idx++) {
0087 iEvent.getByToken(candTokens_.at(idx), candHandles.at(idx));
0088 tkIsoCalc.push_back(
0089 std::make_unique<SuperclusTkIsolFromCands>(trkIsoCalcCfg_, *(candHandles.at(idx)), candVetos_.at(idx)));
0090 }
0091
0092 std::vector<float> vecTkIso;
0093 vecTkIso.reserve(scHandle->size());
0094
0095 for (const auto& sc : *scHandle) {
0096 float tkIso = 0.;
0097
0098 for (auto& calc : tkIsoCalc)
0099 tkIso += (*calc)(sc, pos).ptSum;
0100
0101 vecTkIso.push_back(tkIso);
0102 }
0103
0104 writeValueMap(iEvent, scHandle, vecTkIso, superclusTkIsoLabel_);
0105 }
0106
0107 std::vector<edm::EDGetTokenT<pat::PackedCandidateCollection>> SuperclusValueMapProducer::setTokens(
0108 const std::vector<edm::InputTag>& tags) {
0109 std::vector<edm::EDGetTokenT<pat::PackedCandidateCollection>> out;
0110
0111 out.reserve(tags.size());
0112 for (const auto& tag : tags)
0113 out.push_back(consumes<pat::PackedCandidateCollection>(tag));
0114
0115 return out;
0116 }
0117
0118 template <typename T>
0119 void SuperclusValueMapProducer::writeValueMap(edm::Event& iEvent,
0120 const edm::Handle<edm::View<reco::SuperCluster>>& handle,
0121 const std::vector<T>& values,
0122 const std::string& label) {
0123 std::unique_ptr<edm::ValueMap<T>> valMap(new edm::ValueMap<T>());
0124 typename edm::ValueMap<T>::Filler filler(*valMap);
0125 filler.insert(handle, values.begin(), values.end());
0126 filler.fill();
0127 iEvent.put(std::move(valMap), label);
0128 }
0129
0130 DEFINE_FWK_MODULE(SuperclusValueMapProducer);