File indexing completed on 2023-03-17 10:59:10
0001 #ifndef CalibratedElectronProducerRun2_h
0002 #define CalibratedElectronProducerRun2_h
0003
0004 #include "DataFormats/Common/interface/Handle.h"
0005 #include "FWCore/Framework/interface/stream/EDProducer.h"
0006 #include "FWCore/Framework/interface/Event.h"
0007 #include "FWCore/Framework/interface/EventSetup.h"
0008 #include "FWCore/Framework/interface/ESHandle.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010
0011 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
0012 #include "DataFormats/PatCandidates/interface/Electron.h"
0013
0014 #include "CondFormats/DataRecord/interface/GBRWrapperRcd.h"
0015 #include "CondFormats/GBRForest/interface/GBRForest.h"
0016 #include "EgammaAnalysis/ElectronTools/interface/EpCombinationTool.h"
0017 #include "EgammaAnalysis/ElectronTools/interface/ElectronEnergyCalibratorRun2.h"
0018
0019 #include <memory>
0020
0021 #include <TRandom2.h>
0022 #include <random>
0023 #include <vector>
0024
0025 template <typename T>
0026 class CalibratedElectronProducerRun2T : public edm::stream::EDProducer<> {
0027 public:
0028 explicit CalibratedElectronProducerRun2T(const edm::ParameterSet &);
0029 ~CalibratedElectronProducerRun2T() override;
0030 void produce(edm::Event &, const edm::EventSetup &) override;
0031
0032 private:
0033 edm::EDGetTokenT<edm::View<T> > theElectronToken;
0034 std::string theGBRForestName;
0035
0036 EpCombinationTool theEpCombinationTool;
0037 ElectronEnergyCalibratorRun2 theEnCorrectorRun2;
0038 std::unique_ptr<TRandom> theSemiDeterministicRng;
0039
0040 edm::ESGetToken<GBRForest, GBRWrapperRcd> gbrforestToken_;
0041 };
0042
0043 template <typename T>
0044 CalibratedElectronProducerRun2T<T>::CalibratedElectronProducerRun2T(const edm::ParameterSet &conf)
0045 : theElectronToken(consumes<edm::View<T> >(conf.getParameter<edm::InputTag>("electrons"))),
0046 theGBRForestName(conf.getParameter<std::string>("gbrForestName")),
0047 theEpCombinationTool(),
0048 theEnCorrectorRun2(theEpCombinationTool,
0049 conf.getParameter<bool>("isMC"),
0050 conf.getParameter<bool>("isSynchronization"),
0051 conf.getParameter<std::string>("correctionFile")) {
0052 if (conf.existsAs<bool>("semiDeterministic") && conf.getParameter<bool>("semiDeterministic")) {
0053 theSemiDeterministicRng = std::make_unique<TRandom2>();
0054 theEnCorrectorRun2.initPrivateRng(theSemiDeterministicRng.get());
0055 }
0056 gbrforestToken_ = esConsumes(edm::ESInputTag("", theGBRForestName));
0057 produces<std::vector<T> >();
0058 }
0059
0060 template <typename T>
0061 CalibratedElectronProducerRun2T<T>::~CalibratedElectronProducerRun2T() {}
0062
0063 template <typename T>
0064 void CalibratedElectronProducerRun2T<T>::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) {
0065 const GBRForest *theGBRForest = &iSetup.getData(gbrforestToken_);
0066 theEpCombinationTool.init(theGBRForest);
0067
0068 edm::Handle<edm::View<T> > in;
0069 iEvent.getByToken(theElectronToken, in);
0070
0071 std::unique_ptr<std::vector<T> > out(new std::vector<T>());
0072 out->reserve(in->size());
0073
0074 if (theSemiDeterministicRng && !in->empty()) {
0075 const auto &first = in->front();
0076 std::seed_seq seeder = {int(iEvent.id().event()),
0077 int(iEvent.id().luminosityBlock()),
0078 int(iEvent.id().run()),
0079 int(in->size()),
0080 int(std::numeric_limits<int>::max() * first.phi() / M_PI) & 0xFFF,
0081 int(first.pdgId())};
0082 uint32_t seed = 0, tries = 10;
0083 do {
0084 seeder.generate(&seed, &seed + 1);
0085 tries++;
0086 } while (seed == 0 && tries < 10);
0087 theSemiDeterministicRng->SetSeed(seed ? seed : iEvent.id().event());
0088 }
0089
0090 for (const T &ele : *in) {
0091 out->push_back(ele);
0092 theEnCorrectorRun2.calibrate(out->back(), iEvent.id().run(), iEvent.streamID());
0093 }
0094
0095 iEvent.put(std::move(out));
0096 }
0097
0098 typedef CalibratedElectronProducerRun2T<reco::GsfElectron> CalibratedElectronProducerRun2;
0099 typedef CalibratedElectronProducerRun2T<pat::Electron> CalibratedPatElectronProducerRun2;
0100
0101 #include "FWCore/Framework/interface/MakerMacros.h"
0102
0103 DEFINE_FWK_MODULE(CalibratedElectronProducerRun2);
0104 DEFINE_FWK_MODULE(CalibratedPatElectronProducerRun2);
0105
0106 #endif