File indexing completed on 2024-04-06 12:10:16
0001 #include "FWCore/Framework/interface/Frameworkfwd.h"
0002 #include "FWCore/Framework/interface/stream/EDFilter.h"
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "FWCore/Framework/interface/MakerMacros.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006
0007 #include "DataFormats/Common/interface/ValueMap.h"
0008 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
0009 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
0010 #include "DataFormats/PatCandidates/interface/Electron.h"
0011
0012 #include "EgammaAnalysis/ElectronTools/interface/ElectronEffectiveArea.h"
0013
0014 class ElectronIsolatorFromEffectiveArea : public edm::stream::EDFilter<> {
0015 public:
0016 typedef edm::ValueMap<double> CandDoubleMap;
0017 typedef ElectronEffectiveArea EEA;
0018 explicit ElectronIsolatorFromEffectiveArea(const edm::ParameterSet&);
0019
0020 private:
0021 bool filter(edm::Event&, const edm::EventSetup&) override;
0022 edm::InputTag gsfElectronTag;
0023 edm::InputTag pfElectronTag;
0024 edm::InputTag patElectronTag;
0025 edm::EDGetTokenT<reco::GsfElectronCollection> gsfElectronToken;
0026 edm::EDGetTokenT<reco::PFCandidateCollection> pfElectronToken;
0027 edm::EDGetTokenT<pat::ElectronCollection> patElectronToken;
0028 edm::EDGetTokenT<double> rhoIsoToken;
0029 const EEA::ElectronEffectiveAreaType modeEEA;
0030 const EEA::ElectronEffectiveAreaTarget targetEEA;
0031 static std::map<std::string, EEA::ElectronEffectiveAreaType> EEA_type();
0032 static std::map<std::string, EEA::ElectronEffectiveAreaTarget> EEA_target();
0033 };
0034
0035 ElectronIsolatorFromEffectiveArea::ElectronIsolatorFromEffectiveArea(const edm::ParameterSet& config)
0036 : gsfElectronTag(edm::InputTag("")),
0037 pfElectronTag(edm::InputTag("")),
0038 patElectronTag(edm::InputTag("")),
0039 rhoIsoToken(consumes<double>(config.getParameter<edm::InputTag>("rhoIso"))),
0040 modeEEA(EEA_type()[config.getParameter<std::string>("EffectiveAreaType")]),
0041 targetEEA(EEA_target()[config.getParameter<std::string>("EffectiveAreaTarget")]) {
0042 if (config.existsAs<edm::InputTag>("gsfElectrons"))
0043 gsfElectronTag = config.getParameter<edm::InputTag>("gsfElectrons");
0044 if (config.existsAs<edm::InputTag>("pfElectrons"))
0045 pfElectronTag = config.getParameter<edm::InputTag>("pfElectrons");
0046 if (config.existsAs<edm::InputTag>("patElectrons"))
0047 patElectronTag = config.getParameter<edm::InputTag>("patElectrons");
0048 if (!gsfElectronTag.label().empty())
0049 gsfElectronToken = consumes<reco::GsfElectronCollection>(gsfElectronTag);
0050 if (!pfElectronTag.label().empty())
0051 pfElectronToken = consumes<reco::PFCandidateCollection>(pfElectronTag);
0052 if (!patElectronTag.label().empty())
0053 patElectronToken = consumes<pat::ElectronCollection>(patElectronTag);
0054 produces<CandDoubleMap>();
0055 }
0056
0057 bool ElectronIsolatorFromEffectiveArea::filter(edm::Event& event, const edm::EventSetup&) {
0058 std::unique_ptr<CandDoubleMap> product(new CandDoubleMap());
0059 CandDoubleMap::Filler filler(*product);
0060
0061 edm::Handle<double> rho;
0062 event.getByToken(rhoIsoToken, rho);
0063
0064 if (!gsfElectronTag.label().empty()) {
0065 edm::Handle<reco::GsfElectronCollection> gsfElectrons;
0066 event.getByToken(gsfElectronToken, gsfElectrons);
0067 std::vector<double> gsfCorrectionsEA;
0068 if (gsfElectrons.isValid()) {
0069 for (reco::GsfElectronCollection::const_iterator it = gsfElectrons->begin(); it != gsfElectrons->end(); ++it)
0070 gsfCorrectionsEA.push_back((*rho) *
0071 EEA::GetElectronEffectiveArea(modeEEA, it->superCluster()->eta(), targetEEA));
0072 filler.insert(gsfElectrons, gsfCorrectionsEA.begin(), gsfCorrectionsEA.end());
0073 }
0074 }
0075
0076 if (!pfElectronTag.label().empty()) {
0077 edm::Handle<reco::PFCandidateCollection> pfElectrons;
0078 event.getByToken(pfElectronToken, pfElectrons);
0079 std::vector<double> pfCorrectionsEA;
0080 if (pfElectrons.isValid()) {
0081 for (reco::PFCandidateCollection::const_iterator it = pfElectrons->begin(); it != pfElectrons->end(); ++it)
0082 pfCorrectionsEA.push_back(
0083 (*rho) * EEA::GetElectronEffectiveArea(modeEEA, it->gsfElectronRef()->superCluster()->eta(), targetEEA));
0084 filler.insert(pfElectrons, pfCorrectionsEA.begin(), pfCorrectionsEA.end());
0085 }
0086 }
0087
0088 if (!patElectronTag.label().empty()) {
0089 edm::Handle<pat::ElectronCollection> patElectrons;
0090 event.getByToken(patElectronToken, patElectrons);
0091 std::vector<double> patCorrectionsEA;
0092 if (patElectrons.isValid()) {
0093 for (pat::ElectronCollection::const_iterator it = patElectrons->begin(); it != patElectrons->end(); ++it)
0094 patCorrectionsEA.push_back((*rho) *
0095 EEA::GetElectronEffectiveArea(modeEEA, it->superCluster()->eta(), targetEEA));
0096 filler.insert(patElectrons, patCorrectionsEA.begin(), patCorrectionsEA.end());
0097 }
0098 }
0099
0100 filler.fill();
0101 event.put(std::move(product));
0102 return true;
0103 }
0104
0105
0106
0107 std::map<std::string, ElectronEffectiveArea::ElectronEffectiveAreaType> ElectronIsolatorFromEffectiveArea::EEA_type() {
0108 std::map<std::string, EEA::ElectronEffectiveAreaType> m;
0109 m["kEleGammaAndNeutralHadronIso03"] = EEA::kEleGammaAndNeutralHadronIso03;
0110 m["kEleGammaAndNeutralHadronIso04"] = EEA::kEleGammaAndNeutralHadronIso04;
0111 return m;
0112 }
0113
0114 std::map<std::string, ElectronEffectiveArea::ElectronEffectiveAreaTarget>
0115 ElectronIsolatorFromEffectiveArea::EEA_target() {
0116 std::map<std::string, EEA::ElectronEffectiveAreaTarget> m;
0117 m["kEleEANoCorr"] = EEA::kEleEANoCorr;
0118 m["kEleEAData2011"] = EEA::kEleEAData2011;
0119 m["kEleEASummer11MC"] = EEA::kEleEASummer11MC;
0120 m["kEleEAFall11MC"] = EEA::kEleEAFall11MC;
0121 m["kEleEAData2012"] = EEA::kEleEAData2012;
0122 return m;
0123 }
0124
0125 DEFINE_FWK_MODULE(ElectronIsolatorFromEffectiveArea);