File indexing completed on 2024-04-06 12:10:16
0001
0002 #include <memory>
0003
0004
0005 #include "FWCore/Framework/interface/Frameworkfwd.h"
0006 #include "FWCore/Framework/interface/stream/EDFilter.h"
0007
0008 #include "FWCore/Framework/interface/Event.h"
0009 #include "FWCore/Framework/interface/MakerMacros.h"
0010
0011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0012 #include "EgammaAnalysis/ElectronTools/interface/EGammaMvaEleEstimator.h"
0013 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
0014 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
0015 #include "DataFormats/PatCandidates/interface/Electron.h"
0016 #include "DataFormats/VertexReco/interface/Vertex.h"
0017 #include "DataFormats/VertexReco/interface/VertexFwd.h"
0018 #include "TrackingTools/Records/interface/TransientTrackRecord.h"
0019 #include "TrackingTools/IPTools/interface/IPTools.h"
0020
0021
0022
0023
0024 class ElectronIdMVAProducer : public edm::stream::EDFilter<> {
0025 public:
0026 explicit ElectronIdMVAProducer(const edm::ParameterSet&);
0027 ~ElectronIdMVAProducer() override;
0028
0029 private:
0030 bool filter(edm::Event&, const edm::EventSetup&) override;
0031
0032
0033 bool verbose_;
0034 edm::EDGetTokenT<reco::VertexCollection> vertexToken_;
0035 edm::EDGetTokenT<reco::GsfElectronCollection> electronToken_;
0036 edm::EDGetTokenT<double> eventrhoToken_;
0037 edm::EDGetTokenT<EcalRecHitCollection> reducedEBRecHitCollectionToken_;
0038 edm::EDGetTokenT<EcalRecHitCollection> reducedEERecHitCollectionToken_;
0039 const EcalClusterLazyTools::ESGetTokens ecalClusterToolsESGetTokens_;
0040 edm::ESGetToken<TransientTrackBuilder, TransientTrackRecord> ttrackbuilderToken_;
0041
0042 double _Rho;
0043 std::string method_;
0044 std::vector<std::string> mvaWeightFiles_;
0045 bool Trig_;
0046 bool NoIP_;
0047
0048 EGammaMvaEleEstimator* mvaID_;
0049 };
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062 ElectronIdMVAProducer::ElectronIdMVAProducer(const edm::ParameterSet& iConfig)
0063 : ecalClusterToolsESGetTokens_{consumesCollector()} {
0064 verbose_ = iConfig.getUntrackedParameter<bool>("verbose", false);
0065 vertexToken_ = consumes<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("vertexTag"));
0066 electronToken_ = consumes<reco::GsfElectronCollection>(iConfig.getParameter<edm::InputTag>("electronTag"));
0067 eventrhoToken_ = consumes<double>(edm::InputTag("kt6PFJets", "rho"));
0068 reducedEBRecHitCollectionToken_ =
0069 consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("reducedEBRecHitCollection"));
0070 reducedEERecHitCollectionToken_ =
0071 consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("reducedEERecHitCollection"));
0072 method_ = iConfig.getParameter<std::string>("method");
0073 std::vector<std::string> fpMvaWeightFiles = iConfig.getParameter<std::vector<std::string> >("mvaWeightFile");
0074 Trig_ = iConfig.getParameter<bool>("Trig");
0075 NoIP_ = iConfig.getParameter<bool>("NoIP");
0076
0077 ttrackbuilderToken_ = esConsumes(edm::ESInputTag("", "TransientTrackBuilder"));
0078
0079 produces<edm::ValueMap<float> >("");
0080
0081 mvaID_ = new EGammaMvaEleEstimator();
0082
0083 EGammaMvaEleEstimator::MVAType type_;
0084 if (Trig_ && !NoIP_) {
0085 type_ = EGammaMvaEleEstimator::kTrig;
0086 }
0087
0088 if (Trig_ && NoIP_) {
0089 type_ = EGammaMvaEleEstimator::kTrigNoIP;
0090 }
0091
0092 if (!Trig_) {
0093 type_ = EGammaMvaEleEstimator::kNonTrig;
0094 }
0095
0096 bool manualCat_ = true;
0097
0098 std::string path_mvaWeightFileEleID;
0099 for (unsigned ifile = 0; ifile < fpMvaWeightFiles.size(); ++ifile) {
0100 path_mvaWeightFileEleID = edm::FileInPath(fpMvaWeightFiles[ifile].c_str()).fullPath();
0101 mvaWeightFiles_.push_back(path_mvaWeightFileEleID);
0102 }
0103
0104 mvaID_->initialize(method_, type_, manualCat_, mvaWeightFiles_);
0105 }
0106
0107 ElectronIdMVAProducer::~ElectronIdMVAProducer() {
0108
0109
0110 }
0111
0112
0113
0114
0115
0116
0117 bool ElectronIdMVAProducer::filter(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0118 std::unique_ptr<edm::ValueMap<float> > out(new edm::ValueMap<float>());
0119
0120 edm::Handle<reco::VertexCollection> vertexCollection;
0121 iEvent.getByToken(vertexToken_, vertexCollection);
0122
0123 reco::Vertex dummy;
0124 const reco::Vertex* pv = &dummy;
0125 if (!vertexCollection->empty()) {
0126 pv = &*vertexCollection->begin();
0127 } else {
0128 reco::Vertex::Error e;
0129 e(0, 0) = 0.0015 * 0.0015;
0130 e(1, 1) = 0.0015 * 0.0015;
0131 e(2, 2) = 15. * 15.;
0132 reco::Vertex::Point p(0, 0, 0);
0133 dummy = reco::Vertex(p, e, 0, 0, 0);
0134 }
0135
0136 EcalClusterLazyTools lazyTools(iEvent,
0137 ecalClusterToolsESGetTokens_.get(iSetup),
0138 reducedEBRecHitCollectionToken_,
0139 reducedEERecHitCollectionToken_);
0140 auto const& thebuilder = iSetup.getData(ttrackbuilderToken_);
0141
0142 edm::Handle<reco::GsfElectronCollection> egCollection;
0143 iEvent.getByToken(electronToken_, egCollection);
0144 const reco::GsfElectronCollection egCandidates = (*egCollection.product());
0145
0146 _Rho = 0;
0147 edm::Handle<double> rhoPtr;
0148 iEvent.getByToken(eventrhoToken_, rhoPtr);
0149 _Rho = *rhoPtr;
0150
0151 std::vector<float> values;
0152 values.reserve(egCollection->size());
0153
0154 for (reco::GsfElectronCollection::const_iterator egIter = egCandidates.begin(); egIter != egCandidates.end();
0155 ++egIter) {
0156 double mvaVal = -999999;
0157 if (!NoIP_) {
0158 mvaVal = mvaID_->mvaValue(*egIter, *pv, thebuilder, lazyTools, verbose_);
0159 }
0160 if (NoIP_) {
0161 mvaVal = mvaID_->mvaValue(*egIter, *pv, _Rho, lazyTools, verbose_);
0162 }
0163
0164 values.push_back(mvaVal);
0165 }
0166
0167 edm::ValueMap<float>::Filler filler(*out);
0168 filler.insert(egCollection, values.begin(), values.end());
0169 filler.fill();
0170
0171 iEvent.put(std::move(out));
0172
0173 return true;
0174 }
0175
0176
0177 DEFINE_FWK_MODULE(ElectronIdMVAProducer);