Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-10-22 22:52:35

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 // copy-pasted from ElectronHEEPIDValueMapProducer
0017 
0018 class SuperclusValueMapProducer : public edm::stream::EDProducer<> {
0019 public:
0020   explicit SuperclusValueMapProducer(const edm::ParameterSet&);
0021   ~SuperclusValueMapProducer() = 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();  // first try PV
0080   else
0081     pos = (*bsHandle).position();  // fall back to BS
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   for (const auto& tag : tags)
0112     out.push_back(consumes<pat::PackedCandidateCollection>(tag));
0113 
0114   return out;
0115 }
0116 
0117 template <typename T>
0118 void SuperclusValueMapProducer::writeValueMap(edm::Event& iEvent,
0119                                               const edm::Handle<edm::View<reco::SuperCluster>>& handle,
0120                                               const std::vector<T>& values,
0121                                               const std::string& label) {
0122   std::unique_ptr<edm::ValueMap<T>> valMap(new edm::ValueMap<T>());
0123   typename edm::ValueMap<T>::Filler filler(*valMap);
0124   filler.insert(handle, values.begin(), values.end());
0125   filler.fill();
0126   iEvent.put(std::move(valMap), label);
0127 }
0128 
0129 DEFINE_FWK_MODULE(SuperclusValueMapProducer);