From 7a44c12458d00bca2e29af3a3d6d6bed40c78caf Mon Sep 17 00:00:00 2001 From: Giovanni Date: Wed, 20 Sep 2017 17:02:58 +0200 Subject: [PATCH] introduce semi-deterministic smearing (+ code-checks) --- .../CalibratedElectronProducersRun2.cc | 23 +++++++++++++++++-- .../plugins/CalibratedPhotonProducersRun2.cc | 22 ++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/EgammaAnalysis/ElectronTools/plugins/CalibratedElectronProducersRun2.cc b/EgammaAnalysis/ElectronTools/plugins/CalibratedElectronProducersRun2.cc index a1473e4af2f4c..29223ce78326a 100644 --- a/EgammaAnalysis/ElectronTools/plugins/CalibratedElectronProducersRun2.cc +++ b/EgammaAnalysis/ElectronTools/plugins/CalibratedElectronProducersRun2.cc @@ -17,14 +17,16 @@ #include "EgammaAnalysis/ElectronTools/interface/ElectronEnergyCalibratorRun2.h" #include +#include +#include template class CalibratedElectronProducerRun2T: public edm::stream::EDProducer<> { public: explicit CalibratedElectronProducerRun2T( const edm::ParameterSet & ) ; - virtual ~CalibratedElectronProducerRun2T(); - virtual void produce( edm::Event &, const edm::EventSetup & ) override ; + ~CalibratedElectronProducerRun2T() override; + void produce( edm::Event &, const edm::EventSetup & ) override ; private: edm::EDGetTokenT > theElectronToken; @@ -33,6 +35,8 @@ class CalibratedElectronProducerRun2T: public edm::stream::EDProducer<> EpCombinationTool theEpCombinationTool; ElectronEnergyCalibratorRun2 theEnCorrectorRun2; + std::unique_ptr theSemiDeterministicRng; + }; template @@ -42,6 +46,10 @@ CalibratedElectronProducerRun2T::CalibratedElectronProducerRun2T( const edm:: theEpCombinationTool(), theEnCorrectorRun2(theEpCombinationTool, conf.getParameter("isMC"), conf.getParameter("isSynchronization"), conf.getParameter("correctionFile")) { + if (conf.existsAs("semiDeterministic") && conf.getParameter("semiDeterministic")) { + theSemiDeterministicRng.reset(new TRandom2()); + theEnCorrectorRun2.initPrivateRng(theSemiDeterministicRng.get()); + } produces >(); } @@ -63,6 +71,17 @@ CalibratedElectronProducerRun2T::produce( edm::Event & iEvent, const edm::Eve std::unique_ptr > out(new std::vector()); out->reserve(in->size()); + if (theSemiDeterministicRng && !in->empty()) { // no need to set a seed if in is empty + const auto & first = in->front(); + std::seed_seq seeder = {int(iEvent.id().event()), int(iEvent.id().luminosityBlock()), int(iEvent.id().run()), + int(in->size()), int(std::numeric_limits::max()*first.phi()/M_PI) & 0xFFF, int(first.pdgId())}; + uint32_t seed = 0, tries = 10; + do { + seeder.generate(&seed,&seed+1); tries++; + } while (seed == 0 && tries < 10); + theSemiDeterministicRng->SetSeed(seed ? seed : iEvent.id().event()); + } + for (const T &ele : *in) { out->push_back(ele); theEnCorrectorRun2.calibrate(out->back(), iEvent.id().run(), iEvent.streamID()); diff --git a/EgammaAnalysis/ElectronTools/plugins/CalibratedPhotonProducersRun2.cc b/EgammaAnalysis/ElectronTools/plugins/CalibratedPhotonProducersRun2.cc index 3a20aa38ad05a..543781d62befe 100644 --- a/EgammaAnalysis/ElectronTools/plugins/CalibratedPhotonProducersRun2.cc +++ b/EgammaAnalysis/ElectronTools/plugins/CalibratedPhotonProducersRun2.cc @@ -13,17 +13,20 @@ #include "EgammaAnalysis/ElectronTools/interface/PhotonEnergyCalibratorRun2.h" #include +#include +#include template class CalibratedPhotonProducerRun2T: public edm::stream::EDProducer<> { public: explicit CalibratedPhotonProducerRun2T( const edm::ParameterSet & ) ; - virtual ~CalibratedPhotonProducerRun2T(); - virtual void produce( edm::Event &, const edm::EventSetup & ) override ; + ~CalibratedPhotonProducerRun2T() override; + void produce( edm::Event &, const edm::EventSetup & ) override ; private: edm::EDGetTokenT > thePhotonToken; PhotonEnergyCalibratorRun2 theEnCorrectorRun2; + std::unique_ptr theSemiDeterministicRng; }; template @@ -31,6 +34,10 @@ CalibratedPhotonProducerRun2T::CalibratedPhotonProducerRun2T( const edm::Para thePhotonToken(consumes >(conf.getParameter("photons"))), theEnCorrectorRun2(conf.getParameter("isMC"), conf.getParameter("isSynchronization"), conf.getParameter("correctionFile")) { + if (conf.existsAs("semiDeterministic") && conf.getParameter("semiDeterministic")) { + theSemiDeterministicRng.reset(new TRandom2()); + theEnCorrectorRun2.initPrivateRng(theSemiDeterministicRng.get()); + } produces >(); } @@ -45,6 +52,17 @@ CalibratedPhotonProducerRun2T::produce( edm::Event & iEvent, const edm::Event edm::Handle > in; iEvent.getByToken(thePhotonToken, in); + if (theSemiDeterministicRng && !in->empty()) { // no need to set a seed if in is empty + const auto & first = in->front(); + std::seed_seq seeder = {int(iEvent.id().event()), int(iEvent.id().luminosityBlock()), int(iEvent.id().run()), + int(in->size()), int(std::numeric_limits::max()*first.phi()/M_PI) & 0xFFF, int(first.pdgId())}; + uint32_t seed = 0, tries = 10; + do { + seeder.generate(&seed,&seed+1); tries++; + } while (seed == 0 && tries < 10); + theSemiDeterministicRng->SetSeed(seed ? seed : iEvent.id().event()); + } + std::unique_ptr > out(new std::vector()); out->reserve(in->size());