diff --git a/FWCore/Concurrency/interface/SharedResourceNames.h b/FWCore/Concurrency/interface/SharedResourceNames.h index 521caa4ef4792..29dd0382aa479 100644 --- a/FWCore/Concurrency/interface/SharedResourceNames.h +++ b/FWCore/Concurrency/interface/SharedResourceNames.h @@ -28,6 +28,7 @@ namespace edm { static const std::string kPhotos; static const std::string kTauola; static const std::string kEvtGen; + static const std::string kHerwig6; }; // Each time the following function is called, it returns a different diff --git a/FWCore/Concurrency/src/SharedResourceNames.cc b/FWCore/Concurrency/src/SharedResourceNames.cc index 76ce68243c723..5d9aa56a67ce5 100644 --- a/FWCore/Concurrency/src/SharedResourceNames.cc +++ b/FWCore/Concurrency/src/SharedResourceNames.cc @@ -10,6 +10,7 @@ const std::string edm::SharedResourceNames::kPythia8 = "Pythia8"; const std::string edm::SharedResourceNames::kPhotos = "Photos"; const std::string edm::SharedResourceNames::kTauola = "Tauola"; const std::string edm::SharedResourceNames::kEvtGen = "EvtGen"; +const std::string edm::SharedResourceNames::kHerwig6 = "Herwig6"; static std::atomic counter; diff --git a/FWCore/ServiceRegistry/interface/RandomEngineSentry.h b/FWCore/ServiceRegistry/interface/RandomEngineSentry.h index 9ce2a47ecb26e..58de055cfe9b2 100644 --- a/FWCore/ServiceRegistry/interface/RandomEngineSentry.h +++ b/FWCore/ServiceRegistry/interface/RandomEngineSentry.h @@ -26,13 +26,13 @@ namespace edm { template class RandomEngineSentry { public: - explicit RandomEngineSentry(T* t, CLHEP::HepRandomEngine* engine): t_(t) { + explicit RandomEngineSentry(T* t, CLHEP::HepRandomEngine* engine): t_(t), engine_(engine) { if(t) { t->setRandomEngine(engine); } } - explicit RandomEngineSentry(T* t, StreamID const& streamID): t_(t) { + explicit RandomEngineSentry(T* t, StreamID const& streamID): t_(t), engine_(nullptr) { if(t) { Service rng; if (!rng.isAvailable()) { @@ -40,12 +40,12 @@ namespace edm { << "Attempt to get a random engine when the RandomNumberGeneratorService is not configured.\n" "You must configure the service if you want an engine.\n"; } - CLHEP::HepRandomEngine& engine = rng->getEngine(streamID); - t->setRandomEngine(&engine); + engine_ = &rng->getEngine(streamID); + t->setRandomEngine(engine_); } } - explicit RandomEngineSentry(T* t, LuminosityBlockIndex const& lumi): t_(t) { + explicit RandomEngineSentry(T* t, LuminosityBlockIndex const& lumi): t_(t), engine_(nullptr) { if(t) { Service rng; if (!rng.isAvailable()) { @@ -53,15 +53,18 @@ namespace edm { << "Attempt to get a random engine when the RandomNumberGeneratorService is not configured.\n" "You must configure the service if you want an engine.\n"; } - CLHEP::HepRandomEngine& engine = rng->getEngine(lumi); - t->setRandomEngine(&engine); + engine_ = &rng->getEngine(lumi); + t->setRandomEngine(engine_); } } ~RandomEngineSentry() { if(t_) t_->setRandomEngine(nullptr); } + CLHEP::HepRandomEngine* randomEngine() const { return engine_; } + private: T* t_; + CLHEP::HepRandomEngine* engine_; }; } #endif diff --git a/GeneratorInterface/AMPTInterface/interface/AMPTHadronizer.h b/GeneratorInterface/AMPTInterface/interface/AMPTHadronizer.h index 39815a3714b29..4260bcfa2b507 100644 --- a/GeneratorInterface/AMPTInterface/interface/AMPTHadronizer.h +++ b/GeneratorInterface/AMPTInterface/interface/AMPTHadronizer.h @@ -3,7 +3,6 @@ #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "GeneratorInterface/Core/interface/BaseHadronizer.h" -#include "CLHEP/Random/RandomEngine.h" #include #include @@ -16,7 +15,9 @@ namespace HepMC { class GenVertex; } -extern CLHEP::HepRandomEngine* _amptRandomEngine; +namespace CLHEP { + class HepRandomEngine; +} namespace gen { @@ -50,6 +51,8 @@ namespace gen private: + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + void add_heavy_ion_rec(HepMC::GenEvent *evt); HepMC::GenParticle* build_ampt( int index, int barcode ); HepMC::GenVertex* build_ampt_vertex(int i, int id); diff --git a/GeneratorInterface/AMPTInterface/src/AMPTHadronizer.cc b/GeneratorInterface/AMPTInterface/src/AMPTHadronizer.cc index 0e158be9a58a2..f9fb7ad68fce1 100644 --- a/GeneratorInterface/AMPTInterface/src/AMPTHadronizer.cc +++ b/GeneratorInterface/AMPTInterface/src/AMPTHadronizer.cc @@ -7,10 +7,6 @@ #include "FWCore/Framework/interface/Run.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" -#include "FWCore/Utilities/interface/EDMException.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" #include "GeneratorInterface/AMPTInterface/interface/AMPTHadronizer.h" #include "GeneratorInterface/AMPTInterface/interface/AMPTWrapper.h" @@ -30,14 +26,14 @@ using namespace edm; using namespace std; using namespace gen; -CLHEP::HepRandomEngine* _amptRandomEngine; +static CLHEP::HepRandomEngine* amptRandomEngine; extern "C" { float gen::ranart_(int *idummy) { if(0) idummy = idummy; - float rannum = _amptRandomEngine->flat(); + float rannum = amptRandomEngine->flat(); return rannum; } } @@ -47,7 +43,7 @@ extern "C" float gen::ran1_(int *idummy) { if(0) idummy = idummy; - return _amptRandomEngine->flat(); + return amptRandomEngine->flat(); } } @@ -100,17 +96,19 @@ AMPTHadronizer::AMPTHadronizer(const ParameterSet &pset) : cosphi0_(1.), rotate_(pset.getParameter("rotateEventPlane")) { - // Default constructor - edm::Service rng; - _amptRandomEngine = &(rng->getEngine()); } - //_____________________________________________________________________ AMPTHadronizer::~AMPTHadronizer() { } +//_____________________________________________________________________ +void AMPTHadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) +{ + amptRandomEngine = v; +} + //_____________________________________________________________________ void AMPTHadronizer::add_heavy_ion_rec(HepMC::GenEvent *evt) { diff --git a/GeneratorInterface/BeamHaloGenerator/interface/BeamHaloProducer.h b/GeneratorInterface/BeamHaloGenerator/interface/BeamHaloProducer.h index 10e03b3bafd2b..d1b1b831632f0 100644 --- a/GeneratorInterface/BeamHaloGenerator/interface/BeamHaloProducer.h +++ b/GeneratorInterface/BeamHaloGenerator/interface/BeamHaloProducer.h @@ -10,12 +10,17 @@ #include "FWCore/Framework/interface/one/EDProducer.h" #include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/LuminosityBlock.h" #include "FWCore/Framework/interface/Run.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" +namespace CLHEP { + class HepRandomEngine; +} + namespace edm { - class BeamHaloProducer : public one::EDProducer { + class BeamHaloProducer : public one::EDProducer { public: /// Constructor @@ -23,6 +28,8 @@ namespace edm /// Destructor virtual ~BeamHaloProducer(); + void setRandomEngine(CLHEP::HepRandomEngine* v); + private: bool call_ki_bhg_init(long& seed); bool call_bh_set_parameters(int* ival, float* fval,const std::string cval_string); @@ -31,8 +38,10 @@ namespace edm private: - virtual void produce(Event & e, const EventSetup & es); - virtual void endRunProduce(Run & r, const EventSetup & es); + virtual void produce(Event & e, const EventSetup & es) override; + virtual void endRunProduce(Run & r, const EventSetup & es) override; + virtual void beginLuminosityBlock(LuminosityBlock const&, EventSetup const&) override; + virtual void endLuminosityBlock(LuminosityBlock const&, EventSetup const&) override { } void clear(); @@ -46,6 +55,8 @@ namespace edm float EG_MIN_; float EG_MAX_; std::string G3FNAME_; + + bool isInitialized_; }; } diff --git a/GeneratorInterface/BeamHaloGenerator/src/BeamHaloProducer.cc b/GeneratorInterface/BeamHaloGenerator/src/BeamHaloProducer.cc index 91995394e2452..532072ecbb974 100644 --- a/GeneratorInterface/BeamHaloGenerator/src/BeamHaloProducer.cc +++ b/GeneratorInterface/BeamHaloGenerator/src/BeamHaloProducer.cc @@ -3,9 +3,8 @@ #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/Run.h" -#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/ServiceRegistry/interface/RandomEngineSentry.h" #include "FWCore/Utilities/interface/Exception.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" #include "SimDataFormats/GeneratorProducts/interface/GenRunInfoProduct.h" @@ -58,7 +57,8 @@ BeamHaloProducer::~BeamHaloProducer() { BeamHaloProducer::BeamHaloProducer( const ParameterSet & pset) : - evt(0) + evt(0), + isInitialized_(false) { int iparam[8]; @@ -83,17 +83,6 @@ BeamHaloProducer::BeamHaloProducer( const ParameterSet & pset) : cparam = pset.getUntrackedParameter("G3FNAME","input.txt"); call_bh_set_parameters(iparam,fparam,cparam); - -// -- Seed for randomnumbers - Service rng; - _BeamHalo_randomEngine = &(rng->getEngine()); - long seed = (long)(rng->mySeed()); - - -// -- initialisation - call_ki_bhg_init(seed); - - produces(); produces(); produces(); @@ -106,7 +95,26 @@ void BeamHaloProducer::clear() { } +void BeamHaloProducer::setRandomEngine(CLHEP::HepRandomEngine* v) { + _BeamHalo_randomEngine = v; +} + +void BeamHaloProducer::beginLuminosityBlock(LuminosityBlock const& lumi, EventSetup const&) +{ + if(!isInitialized_) { + isInitialized_ = true; + RandomEngineSentry randomEngineSentry(this, lumi.index()); + + // -- initialisation + long seed = 1; // This seed is not actually used + call_ki_bhg_init(seed); + } +} + void BeamHaloProducer::produce(Event & e, const EventSetup & es) { + + RandomEngineSentry randomEngineSentry(this, e.streamID()); + // cout << "in produce " << endl; // auto_ptr bare_product(new HepMCProduct()); diff --git a/GeneratorInterface/CascadeInterface/BuildFile.xml b/GeneratorInterface/CascadeInterface/BuildFile.xml index b8ac34a5fe2fd..a7ed0ef5faf52 100644 --- a/GeneratorInterface/CascadeInterface/BuildFile.xml +++ b/GeneratorInterface/CascadeInterface/BuildFile.xml @@ -1,4 +1,5 @@ + diff --git a/GeneratorInterface/CascadeInterface/plugins/Cascade2Hadronizer.cc b/GeneratorInterface/CascadeInterface/plugins/Cascade2Hadronizer.cc index a286f829db149..74a755e0db119 100644 --- a/GeneratorInterface/CascadeInterface/plugins/Cascade2Hadronizer.cc +++ b/GeneratorInterface/CascadeInterface/plugins/Cascade2Hadronizer.cc @@ -1,8 +1,5 @@ #include "GeneratorInterface/CascadeInterface/plugins/Cascade2Hadronizer.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" - - #include "HepMC/GenEvent.h" #include "HepMC/PdfInfo.h" #include "HepMC/PythiaWrapper6_4.h" @@ -12,17 +9,16 @@ #include "HepMC/IO_HEPEVT.h" #include "HepMC/IO_GenEvent.h" +#include "FWCore/Concurrency/interface/SharedResourceNames.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "GeneratorInterface/Core/interface/FortranCallback.h" +#include "GeneratorInterface/Core/interface/FortranInstance.h" HepMC::IO_HEPEVT hepevtio; #include "HepPID/ParticleIDTranslations.hh" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" -#include "CLHEP/Random/RandFlat.h" -#include "FWCore/Utilities/interface/Exception.h" +#include "FWCore/Utilities/interface/EDMException.h" //-- Pythia6 routines and functionalities to pass around Pythia6 params @@ -31,12 +27,14 @@ HepMC::IO_HEPEVT hepevtio; #include "SimDataFormats/GeneratorProducts/interface/GenRunInfoProduct.h" +#include "CLHEP/Random/RandomEngine.h" + using namespace edm; using namespace std; #define debug 0 -CLHEP::RandFlat* fFlat_extern; +static CLHEP::HepRandomEngine* cascade2RandomEngine; extern "C" { @@ -44,7 +42,7 @@ extern "C" { static int call = 0; - double rdm_nb = fFlat_extern->fire(); + double rdm_nb = cascade2RandomEngine->flat(); if(debug && ++call < 100) cout<<"dcasrn from c++, call: "< Cascade2Hadronizer::theSharedResources = { edm::SharedResourceNames::kPythia6, + gen::FortranInstance::kFortranInstance }; + Cascade2Hadronizer::Cascade2Hadronizer(edm::ParameterSet const& pset) : BaseHadronizer(pset), fPy6Service(new Pythia6ServiceWithCallback(pset)), //-- this will store py6 parameters for further settings - - //-- fRandomEngine(&getEngineReference()), - - //-- defined in GeneratorInterface/Core/src/RNDMEngineAccess.cc - //-- CLHEP::HepRandomEngine& gen::getEngineReference() - //-- { edm::Service rng; - //-- return rng->getEngine(); } fComEnergy(pset.getParameter("comEnergy")), fextCrossSection(pset.getUntrackedParameter("crossSection",-1.)), @@ -107,12 +101,6 @@ namespace gen { fParameters = pset.getParameter("Cascade2Parameters"); - edm::Service rng; - if(debug) cout<<"seed: "<mySeed()<getEngine(); - fFlat = new CLHEP::RandFlat(engine); - fFlat_extern = fFlat; - fConvertToPDG = false; if(pset.exists("doPDGConvert")) fConvertToPDG = pset.getParameter("doPDGConvert"); @@ -143,6 +131,11 @@ namespace gen { if(fPy6Service != 0) delete fPy6Service; } + void Cascade2Hadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) { + cascade2RandomEngine = v; + fPy6Service->setRandomEngine(v); + } + void Cascade2Hadronizer::flushTmpStorage(){ pyjets_local.n = 0 ; diff --git a/GeneratorInterface/CascadeInterface/plugins/Cascade2Hadronizer.h b/GeneratorInterface/CascadeInterface/plugins/Cascade2Hadronizer.h index 1546857c3d804..dcebad771d535 100644 --- a/GeneratorInterface/CascadeInterface/plugins/Cascade2Hadronizer.h +++ b/GeneratorInterface/CascadeInterface/plugins/Cascade2Hadronizer.h @@ -2,18 +2,19 @@ #define gen_Cascade2Hadronizer_h #include +#include +#include #include "FWCore/ParameterSet/interface/ParameterSetfwd.h" #include "GeneratorInterface/Core/interface/ParameterCollector.h" #include "GeneratorInterface/Core/interface/BaseHadronizer.h" -#include "CLHEP/Random/RandomEngine.h" namespace HepMC { class GenEvent; } namespace CLHEP { - class RandFlat; + class HepRandomEngine; } namespace gen { @@ -49,6 +50,11 @@ namespace gen { private: + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + virtual std::vector const& doSharedResources() const override { return theSharedResources; } + + static const std::vector theSharedResources; + //-- methods void flushTmpStorage(); @@ -60,8 +66,6 @@ namespace gen { edm::ParameterSet fParameters; Pythia6Service* fPy6Service; - - CLHEP::RandFlat* fFlat; double fComEnergy ; //-- irrelevant for setting py6 as hadronizer (or if anything, it should be picked up from LHERunInfoProduct) double fextCrossSection; diff --git a/GeneratorInterface/Core/interface/FortranInstance.h b/GeneratorInterface/Core/interface/FortranInstance.h index ac9f477bb8833..6345ad36929f0 100644 --- a/GeneratorInterface/Core/interface/FortranInstance.h +++ b/GeneratorInterface/Core/interface/FortranInstance.h @@ -1,6 +1,8 @@ #ifndef gen_FortranInstance_h #define gen_FortranInstance_h +#include + namespace gen { // the callbacks from Pythia6/Herwig6 which are passed to the FortranInstance @@ -66,6 +68,8 @@ class FortranInstance { virtual void upEvnt(); virtual bool upVeto(); + static const std::string kFortranInstance; + private: // list all the Fortran callbacks here friend void gen::upinit_(); diff --git a/GeneratorInterface/Core/interface/RNDMEngineAccess.h b/GeneratorInterface/Core/interface/RNDMEngineAccess.h index bad3f7af08220..650cf295ae5a2 100644 --- a/GeneratorInterface/Core/interface/RNDMEngineAccess.h +++ b/GeneratorInterface/Core/interface/RNDMEngineAccess.h @@ -1,12 +1 @@ -#ifndef gen_RNDMEngineAccess_h -#define gen_RNDMEngineAccess_h - -#include - -namespace gen { - - CLHEP::HepRandomEngine& getEngineReference(); - -} // namespace gen - -#endif +#error RNDMEngineAccess.h is an obsolete header. It should not be used anymore diff --git a/GeneratorInterface/Core/src/FortranInstance.cc b/GeneratorInterface/Core/src/FortranInstance.cc index 6153d288da87e..731b5ea5889cd 100644 --- a/GeneratorInterface/Core/src/FortranInstance.cc +++ b/GeneratorInterface/Core/src/FortranInstance.cc @@ -8,7 +8,6 @@ #include "GeneratorInterface/Core/interface/FortranInstance.h" - // make sure PDFSET is pulled in when linking against the // archive lhapdf library. extern "C" void pdfset_(void); @@ -31,6 +30,8 @@ void gen::upveto_(int *veto) gen::FortranInstance *gen::FortranInstance::currentInstance = 0; +const std::string gen::FortranInstance::kFortranInstance = "FortranInstance"; + // FortranInstance methods gen::FortranInstance::~FortranInstance() diff --git a/GeneratorInterface/Core/src/RNDMEngineAccess.cc b/GeneratorInterface/Core/src/RNDMEngineAccess.cc deleted file mode 100644 index 6f22c6192223e..0000000000000 --- a/GeneratorInterface/Core/src/RNDMEngineAccess.cc +++ /dev/null @@ -1,21 +0,0 @@ -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" -#include "FWCore/Utilities/interface/Exception.h" - -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" - -using namespace gen; - -CLHEP::HepRandomEngine& gen::getEngineReference() -{ - edm::Service rng; - if(!rng.isAvailable()) { - throw cms::Exception("Configuration") - << "The RandomNumberProducer module requires the RandomNumberGeneratorService\n" - "which appears to be absent. Please add that service to your configuration\n" - "or remove the modules that require it." << std::endl; - } - -// The Service has already instantiated an engine. Make contact with it. - return rng->getEngine(); -} diff --git a/GeneratorInterface/CosmicMuonGenerator/BuildFile.xml b/GeneratorInterface/CosmicMuonGenerator/BuildFile.xml index 23f0c00719be3..6d03963bfdbe2 100644 --- a/GeneratorInterface/CosmicMuonGenerator/BuildFile.xml +++ b/GeneratorInterface/CosmicMuonGenerator/BuildFile.xml @@ -1,5 +1,6 @@ + diff --git a/GeneratorInterface/CosmicMuonGenerator/interface/CMSCGEN.h b/GeneratorInterface/CosmicMuonGenerator/interface/CMSCGEN.h index d0e63c7d91b69..549fd668cbdb3 100644 --- a/GeneratorInterface/CosmicMuonGenerator/interface/CMSCGEN.h +++ b/GeneratorInterface/CosmicMuonGenerator/interface/CMSCGEN.h @@ -94,6 +94,8 @@ class CMSCGEN //destructor ~CMSCGEN(); + void setRandomEngine(CLHEP::HepRandomEngine* v); + // to set the energy and cos theta range int initialize(double,double,double,double,CLHEP::HepRandomEngine*,bool,bool); int initialize(double,double,double,double,int,bool,bool); diff --git a/GeneratorInterface/CosmicMuonGenerator/interface/CosMuoGenProducer.h b/GeneratorInterface/CosmicMuonGenerator/interface/CosMuoGenProducer.h index 05291795fb12f..061056c3d52c2 100644 --- a/GeneratorInterface/CosmicMuonGenerator/interface/CosMuoGenProducer.h +++ b/GeneratorInterface/CosmicMuonGenerator/interface/CosMuoGenProducer.h @@ -8,6 +8,7 @@ #include "FWCore/Framework/interface/one/EDProducer.h" #include "FWCore/Framework/interface/EventSetup.h" #include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/LuminosityBlock.h" #include "FWCore/Framework/interface/Run.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Utilities/interface/Exception.h" @@ -16,16 +17,20 @@ namespace edm { - class CosMuoGenProducer : public one::EDProducer { + class CosMuoGenProducer : public one::EDProducer { public: CosMuoGenProducer(const ParameterSet& ); virtual ~CosMuoGenProducer(); - private: - virtual void produce(Event & e, const EventSetup& es); - - virtual void endRunProduce(Run & r, const EventSetup & es); - + private: + + virtual void beginLuminosityBlock(LuminosityBlock const&, EventSetup const&) override; + virtual void endLuminosityBlock(LuminosityBlock const&, EventSetup const&) override { } + + virtual void produce(Event & e, const EventSetup& es) override; + + virtual void endRunProduce(Run & r, const EventSetup & es) override; + void clear(); // define the configurable generator parameters int32_t RanS; // seed of random number generator (from Framework) @@ -80,6 +85,8 @@ namespace edm // the event format itself HepMC::GenEvent* fEvt; bool cmVerbosity_; + + bool isInitialized_; }; } diff --git a/GeneratorInterface/CosmicMuonGenerator/interface/CosmicMuonGenerator.h b/GeneratorInterface/CosmicMuonGenerator/interface/CosmicMuonGenerator.h index 26d5cda2bd6d0..d847ae7e80063 100644 --- a/GeneratorInterface/CosmicMuonGenerator/interface/CosmicMuonGenerator.h +++ b/GeneratorInterface/CosmicMuonGenerator/interface/CosmicMuonGenerator.h @@ -267,8 +267,9 @@ class CosmicMuonGenerator{ // initialize the generator + void setRandomEngine(CLHEP::HepRandomEngine* v); void initialize(CLHEP::HepRandomEngine *rng = 0); - // prints rate + statistics + // prints rate + statistics void terminate(); // initialize, generate and terminate the Cosmic Muon Generator void runCMG(); diff --git a/GeneratorInterface/CosmicMuonGenerator/src/CMSCGEN.cc b/GeneratorInterface/CosmicMuonGenerator/src/CMSCGEN.cc index b25bec28e8b84..80c31df1b9601 100644 --- a/GeneratorInterface/CosmicMuonGenerator/src/CMSCGEN.cc +++ b/GeneratorInterface/CosmicMuonGenerator/src/CMSCGEN.cc @@ -20,6 +20,13 @@ CMSCGEN::~CMSCGEN() delete RanGen2; } +void CMSCGEN::setRandomEngine(CLHEP::HepRandomEngine* v) { + if (delRanGen) + delete RanGen2; + RanGen2 = v; + delRanGen = false; +} + int CMSCGEN::initialize(double pmin_in, double pmax_in, double thetamin_in, double thetamax_in, CLHEP::HepRandomEngine *rnd, bool TIFOnly_constant, bool TIFOnly_linear) { if (delRanGen) diff --git a/GeneratorInterface/CosmicMuonGenerator/src/CosMuoGenProducer.cc b/GeneratorInterface/CosmicMuonGenerator/src/CosMuoGenProducer.cc index fbf2e3696753c..b4b7912b5312f 100644 --- a/GeneratorInterface/CosmicMuonGenerator/src/CosMuoGenProducer.cc +++ b/GeneratorInterface/CosmicMuonGenerator/src/CosMuoGenProducer.cc @@ -1,8 +1,6 @@ -#include #include "FWCore/Framework/interface/Run.h" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" +#include "FWCore/ServiceRegistry/interface/RandomEngineSentry.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" #include "SimDataFormats/GeneratorProducts/interface/GenRunInfoProduct.h" @@ -47,18 +45,12 @@ edm::CosMuoGenProducer::CosMuoGenProducer( const ParameterSet & pset ) : AllMu(pset.getParameter("AcptAllMu")), extCrossSect(pset.getUntrackedParameter("crossSection", -1.)), extFilterEff(pset.getUntrackedParameter("filterEfficiency", -1.)), - cmVerbosity_(pset.getParameter("Verbosity")) + cmVerbosity_(pset.getParameter("Verbosity")), + isInitialized_(false) { //if not specified (i.e. negative) then use MinP also for MinP_CMS if(MinP_CMS < 0) MinP_CMS = MinP; - edm::Service rng; - if (!rng.isAvailable()) - throw cms::Exception("Configuration") - << "The RandomNumberProducer module requires the RandomNumberGeneratorService\n" - "which appears to be absent. Please add that service to your configuration\n" - "or remove the modules that require it." << std::endl; - // set up the generator CosMuoGen = new CosmicMuonGenerator(); // Begin JMM change @@ -99,7 +91,6 @@ edm::CosMuoGenProducer::CosMuoGenProducer( const ParameterSet & pset ) : CosMuoGen->setMaxEnu(MaxEn); CosMuoGen->setNuProdAlt(NuPrdAlt); CosMuoGen->setAcptAllMu(AllMu); - CosMuoGen->initialize(&rng->getEngine()); produces(); produces(); produces(); @@ -112,6 +103,15 @@ edm::CosMuoGenProducer::~CosMuoGenProducer(){ clear(); } +void edm::CosMuoGenProducer::beginLuminosityBlock(LuminosityBlock const& lumi, EventSetup const&) +{ + if(!isInitialized_) { + isInitialized_ = true; + RandomEngineSentry randomEngineSentry(CosMuoGen, lumi.index()); + CosMuoGen->initialize(randomEngineSentry.randomEngine()); + } +} + void edm::CosMuoGenProducer::endRunProduce( Run &run, const EventSetup& es ) { std::auto_ptr genRunInfo(new GenRunInfoProduct()); @@ -131,6 +131,8 @@ void edm::CosMuoGenProducer::clear(){} void edm::CosMuoGenProducer::produce(Event &e, const edm::EventSetup &es) { + RandomEngineSentry randomEngineSentry(CosMuoGen, e.streamID()); + // generate event if (!MultiMuon) { CosMuoGen->nextEvent(); diff --git a/GeneratorInterface/CosmicMuonGenerator/src/CosmicMuonGenerator.cc b/GeneratorInterface/CosmicMuonGenerator/src/CosmicMuonGenerator.cc index 36e60cf4fc8bb..88b5b71f4cfc3 100644 --- a/GeneratorInterface/CosmicMuonGenerator/src/CosmicMuonGenerator.cc +++ b/GeneratorInterface/CosmicMuonGenerator/src/CosmicMuonGenerator.cc @@ -15,6 +15,14 @@ void CosmicMuonGenerator::runCMG(){ terminate(); } +void CosmicMuonGenerator::setRandomEngine(CLHEP::HepRandomEngine* v) { + if (delRanGen) + delete RanGen; + RanGen = v; + delRanGen = false; + Cosmics->setRandomEngine(v); +} + void CosmicMuonGenerator::initialize(CLHEP::HepRandomEngine *rng){ if (delRanGen) delete RanGen; diff --git a/GeneratorInterface/ExhumeInterface/BuildFile.xml b/GeneratorInterface/ExhumeInterface/BuildFile.xml index 17d745939c7ee..b4c90ade871e1 100644 --- a/GeneratorInterface/ExhumeInterface/BuildFile.xml +++ b/GeneratorInterface/ExhumeInterface/BuildFile.xml @@ -1,4 +1,5 @@ + diff --git a/GeneratorInterface/ExhumeInterface/interface/Event.h b/GeneratorInterface/ExhumeInterface/interface/Event.h index ce29be92e93fc..0b50e6e7160fb 100644 --- a/GeneratorInterface/ExhumeInterface/interface/Event.h +++ b/GeneratorInterface/ExhumeInterface/interface/Event.h @@ -20,6 +20,12 @@ namespace Exhume{ Event(CrossSection&, CLHEP::HepRandomEngine*); ~Event(); + + inline void SetRandomEngine(CLHEP::HepRandomEngine* engine){ + randomEngine = engine; + Process->SetRandomEngine(engine); + } + void Generate(); inline void Setx1Max(const double &xx_){ x1Max = xx_; diff --git a/GeneratorInterface/ExhumeInterface/interface/ExhumeHadronizer.h b/GeneratorInterface/ExhumeInterface/interface/ExhumeHadronizer.h index 46adac204c83d..c0cf01a25944e 100644 --- a/GeneratorInterface/ExhumeInterface/interface/ExhumeHadronizer.h +++ b/GeneratorInterface/ExhumeInterface/interface/ExhumeHadronizer.h @@ -2,6 +2,8 @@ #define gen_ExhumeHadronizer_h #include +#include +#include #include @@ -27,8 +29,7 @@ namespace Exhume{ class CrossSection; } -namespace CLHEP -{ +namespace CLHEP { class HepRandomEngine; } @@ -62,6 +63,12 @@ namespace gen const char* classname() const; private: + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + virtual std::vector const& doSharedResources() const override { return theSharedResources; } + + static const std::vector theSharedResources; + Pythia6Service* pythia6Service_; CLHEP::HepRandomEngine* randomEngine_; @@ -79,7 +86,7 @@ namespace gen bool convertToPDG_; //Pythia6Hadronizer* pythia6Hadronizer_; - Exhume::Event* exhumeEvent_; + Exhume::Event* exhumeEvent_; Exhume::CrossSection* exhumeProcess_; }; } diff --git a/GeneratorInterface/ExhumeInterface/src/Event.cpp b/GeneratorInterface/ExhumeInterface/src/Event.cpp index d7cc9433540aa..2ce8316540e61 100644 --- a/GeneratorInterface/ExhumeInterface/src/Event.cpp +++ b/GeneratorInterface/ExhumeInterface/src/Event.cpp @@ -4,8 +4,7 @@ ///////////////////////////////////////////////////////////////////////////// #include "GeneratorInterface/ExhumeInterface/interface/Event.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" - +#include "CLHEP/Random/RandomEngine.h" ////////////////////////////////////////////////////////////////////////////// Exhume::Event::Event(CrossSection &Process_, CLHEP::HepRandomEngine* engine){ diff --git a/GeneratorInterface/ExhumeInterface/src/ExhumeHadronizer.cc b/GeneratorInterface/ExhumeInterface/src/ExhumeHadronizer.cc index 2b81d31cb42c2..0db7a7104d130 100644 --- a/GeneratorInterface/ExhumeInterface/src/ExhumeHadronizer.cc +++ b/GeneratorInterface/ExhumeInterface/src/ExhumeHadronizer.cc @@ -1,10 +1,10 @@ #include "GeneratorInterface/ExhumeInterface/interface/ExhumeHadronizer.h" -#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/Concurrency/interface/SharedResourceNames.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "GeneratorInterface/Core/interface/FortranCallback.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" +#include "GeneratorInterface/Core/interface/FortranInstance.h" #include "GeneratorInterface/Pythia6Interface/interface/Pythia6Service.h" #include "HepPID/ParticleIDTranslations.hh" @@ -70,17 +70,21 @@ inline bool call_pygive(const std::string &line) pygive(line.c_str(), line.length()); return (pydat1.mstu[26] == numWarn)&&(pydat1.mstu[22] == numErr); -} - +} + +const std::vector ExhumeHadronizer::theSharedResources = { edm::SharedResourceNames::kPythia6, + gen::FortranInstance::kFortranInstance }; + ExhumeHadronizer::ExhumeHadronizer(edm::ParameterSet const& pset) : BaseHadronizer(pset), pythia6Service_(new Pythia6Service(pset)), - randomEngine_(&getEngineReference()), + randomEngine_(nullptr), comEnergy_(pset.getParameter("comEnergy")), myPSet_(pset), hepMCVerbosity_(pset.getUntrackedParameter("pythiaHepMCVerbosity",false)), maxEventsToPrint_(pset.getUntrackedParameter("maxEventsToPrint", 0)), - pythiaListVerbosity_(pset.getUntrackedParameter("pythiaPylistVerbosity", 0)) + pythiaListVerbosity_(pset.getUntrackedParameter("pythiaPylistVerbosity", 0)), + exhumeEvent_(nullptr) { convertToPDG_ = false; @@ -99,6 +103,15 @@ ExhumeHadronizer::~ExhumeHadronizer(){ delete exhumeProcess_; } +void ExhumeHadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) +{ + pythia6Service_->setRandomEngine(v); + randomEngine_ = v; + if(exhumeEvent_) { + exhumeEvent_->SetRandomEngine(v); + } +} + void ExhumeHadronizer::finalizeEvent() { //pythia6Hadronizer_->finalizeEvent(); @@ -229,8 +242,7 @@ bool ExhumeHadronizer::initializeForInternalPartons() } pypars.msti[0] = sigID; - //exhumeEvent_ = new Exhume::Event(*exhumeProcess_,&getEngineReference()); - exhumeEvent_ = new Exhume::Event(*exhumeProcess_,randomEngine_); + exhumeEvent_ = new Exhume::Event(*exhumeProcess_, randomEngine_); double massRangeLow = processPSet.getParameter("MassRangeLow"); double massRangeHigh = processPSet.getParameter("MassRangeHigh"); diff --git a/GeneratorInterface/ExhumeInterface/src/TwoSpace.cpp b/GeneratorInterface/ExhumeInterface/src/TwoSpace.cpp index 7058539f6f7ff..4c70c7161a60d 100644 --- a/GeneratorInterface/ExhumeInterface/src/TwoSpace.cpp +++ b/GeneratorInterface/ExhumeInterface/src/TwoSpace.cpp @@ -1,5 +1,5 @@ #include "GeneratorInterface/ExhumeInterface/interface/TwoSpace.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" +#include "CLHEP/Random/RandomEngine.h" Exhume::TwoSpace::TwoSpace(const edm::ParameterSet& pset): CrossSection(pset){ diff --git a/GeneratorInterface/ExternalDecays/BuildFile.xml b/GeneratorInterface/ExternalDecays/BuildFile.xml index f0619101a4b1d..53cea175bc322 100644 --- a/GeneratorInterface/ExternalDecays/BuildFile.xml +++ b/GeneratorInterface/ExternalDecays/BuildFile.xml @@ -7,6 +7,7 @@ + diff --git a/GeneratorInterface/ExternalDecays/src/ExternalDecayDriver.cc b/GeneratorInterface/ExternalDecays/src/ExternalDecayDriver.cc index fcaacad483af5..3ee1ee032441a 100644 --- a/GeneratorInterface/ExternalDecays/src/ExternalDecayDriver.cc +++ b/GeneratorInterface/ExternalDecays/src/ExternalDecayDriver.cc @@ -1,14 +1,12 @@ #include "GeneratorInterface/ExternalDecays/interface/ExternalDecayDriver.h" +#include "GeneratorInterface/Core/interface/FortranInstance.h" #include "GeneratorInterface/EvtGenInterface/interface/EvtGenFactory.h" #include "GeneratorInterface/EvtGenInterface/interface/EvtGenInterfaceBase.h" #include "GeneratorInterface/TauolaInterface/interface/TauolaFactory.h" #include "GeneratorInterface/TauolaInterface/interface/TauolaInterfaceBase.h" #include "GeneratorInterface/PhotosInterface/interface/PhotosFactory.h" #include "GeneratorInterface/PhotosInterface/interface/PhotosInterfaceBase.h" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" -#include "FWCore/Utilities/interface/Exception.h" #include "HepMC/GenEvent.h" #include "FWCore/Concurrency/interface/SharedResourceNames.h" @@ -23,8 +21,7 @@ ExternalDecayDriver::ExternalDecayDriver( const ParameterSet& pset ) fEvtGenInterface(0), fPhotosInterface(0) { - - std::vector extGenNames = + std::vector extGenNames = pset.getParameter< std::vector >("parameterSets"); for (unsigned int ip=0; ipcreate("EvtGenLHC91", pset.getUntrackedParameter< ParameterSet >(curSet))); exSharedResources.emplace_back(edm::SharedResourceNames::kEvtGen); exSharedResources.emplace_back(edm::SharedResourceNames::kPythia6); + exSharedResources.emplace_back(gen::FortranInstance::kFortranInstance); } else if ( curSet == "Tauola" || curSet == "Tauolapp113a" ){ // this is for old tauola27 (+pretauola) diff --git a/GeneratorInterface/GenFilters/interface/PythiaFilterIsolatedTrack.h b/GeneratorInterface/GenFilters/interface/PythiaFilterIsolatedTrack.h index b7c68888db2d1..667fcd0f15004 100644 --- a/GeneratorInterface/GenFilters/interface/PythiaFilterIsolatedTrack.h +++ b/GeneratorInterface/GenFilters/interface/PythiaFilterIsolatedTrack.h @@ -28,7 +28,6 @@ #include "FWCore/ServiceRegistry/interface/Service.h" #include "FWCore/Utilities/interface/RandomNumberGenerator.h" -#include "CLHEP/Random/RandFlat.h" class PythiaFilterIsolatedTrack : public edm::EDFilter { public: @@ -54,6 +53,5 @@ class PythiaFilterIsolatedTrack : public edm::EDFilter { // to get a random number edm::Service rng_; - CLHEP::RandFlat *flatDistribution_; }; #endif diff --git a/GeneratorInterface/GenFilters/src/PythiaFilterIsolatedTrack.cc b/GeneratorInterface/GenFilters/src/PythiaFilterIsolatedTrack.cc index 4d849ba4536df..f1b91fb950fe0 100644 --- a/GeneratorInterface/GenFilters/src/PythiaFilterIsolatedTrack.cc +++ b/GeneratorInterface/GenFilters/src/PythiaFilterIsolatedTrack.cc @@ -3,6 +3,9 @@ #include "SimGeneral/HepPDTRecord/interface/ParticleDataTable.h" #include "FWCore/Framework/interface/EventSetup.h" #include "FWCore/Framework/interface/ESHandle.h" + +#include "CLHEP/Random/RandomEngine.h" + #include #include #include @@ -85,24 +88,23 @@ PythiaFilterIsolatedTrack::PythiaFilterIsolatedTrack(const edm::ParameterSet& iC PixelEfficiency_(iConfig.getUntrackedParameter("PixelEfficiency", 0.8)) { - // initialize the random number generator service + // check if the random number generator service was configured if(!rng_.isAvailable()) { throw cms::Exception("Configuration") << "PythiaFilterIsolatedTrack requires the RandomNumberGeneratorService\n"; } - CLHEP::HepRandomEngine& engine = rng_->getEngine(); - flatDistribution_ = new CLHEP::RandFlat(engine, 0.0, 1.0); } PythiaFilterIsolatedTrack::~PythiaFilterIsolatedTrack() { - delete flatDistribution_; } // ------------ method called to produce the data ------------ bool PythiaFilterIsolatedTrack::filter(edm::Event& iEvent, const edm::EventSetup& iSetup){ + CLHEP::HepRandomEngine& engine = rng_->getEngine(iEvent.streamID()); + edm::ESHandle pdt; iSetup.getData( pdt ); @@ -162,7 +164,7 @@ bool PythiaFilterIsolatedTrack::filter(edm::Event& iEvent, const edm::EventSetup // if the seed fails the isolation requirement, try a different seed // occasionally allow a seed to pass to isolation requirement if(getDistInCM(EtaPhi1.first, EtaPhi1.second, EtaPhi2.first, EtaPhi2.second) < IsolCone_ && - flatDistribution_->fire() < PixelEfficiency_) { + engine.flat() < PixelEfficiency_) { failsIso=true; break; } diff --git a/GeneratorInterface/Herwig6Interface/BuildFile.xml b/GeneratorInterface/Herwig6Interface/BuildFile.xml index e2496a61c8991..2457f4cfb0f0b 100644 --- a/GeneratorInterface/Herwig6Interface/BuildFile.xml +++ b/GeneratorInterface/Herwig6Interface/BuildFile.xml @@ -1,3 +1,4 @@ + diff --git a/GeneratorInterface/Herwig6Interface/interface/Herwig6Instance.h b/GeneratorInterface/Herwig6Interface/interface/Herwig6Instance.h index ff6b664a6b19f..7a7d04f8406aa 100644 --- a/GeneratorInterface/Herwig6Interface/interface/Herwig6Instance.h +++ b/GeneratorInterface/Herwig6Interface/interface/Herwig6Instance.h @@ -3,7 +3,9 @@ #include "GeneratorInterface/Core/interface/FortranInstance.h" -namespace CLHEP { class HepRandomEngine; } // forward declaration +namespace CLHEP { + class HepRandomEngine; +} namespace gen { @@ -15,8 +17,7 @@ extern "C" { class Herwig6Instance : public FortranInstance { public: - Herwig6Instance(CLHEP::HepRandomEngine *randomEngine = 0); - Herwig6Instance(int dummy); + Herwig6Instance(); virtual ~Herwig6Instance(); // passes a configuration parameter @@ -28,6 +29,8 @@ class Herwig6Instance : public FortranInstance { // method to open External Particle Spectra Files void openParticleSpecFile(const std::string fileName); + void setHerwigRandomEngine(CLHEP::HepRandomEngine* v) { randomEngine = v; } + protected: // intercept HERWIG warnings and errors (default: no) virtual bool hwwarn(const std::string &fn, int code); diff --git a/GeneratorInterface/Herwig6Interface/plugins/Herwig6Hadronizer.cc b/GeneratorInterface/Herwig6Interface/plugins/Herwig6Hadronizer.cc index fe4757a6076d7..79c200fae73f9 100644 --- a/GeneratorInterface/Herwig6Interface/plugins/Herwig6Hadronizer.cc +++ b/GeneratorInterface/Herwig6Interface/plugins/Herwig6Hadronizer.cc @@ -17,6 +17,7 @@ #include #include "HepPID/ParticleIDTranslations.hh" +#include "FWCore/Concurrency/interface/SharedResourceNames.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" @@ -29,6 +30,7 @@ #include "GeneratorInterface/Core/interface/BaseHadronizer.h" #include "GeneratorInterface/Core/interface/GeneratorFilter.h" #include "GeneratorInterface/Core/interface/HadronizerFilter.h" +#include "GeneratorInterface/Core/interface/FortranInstance.h" #include "GeneratorInterface/LHEInterface/interface/LHEEvent.h" @@ -37,6 +39,10 @@ #include "DataFormats/Math/interface/LorentzVector.h" +namespace CLHEP { + class HepRandomEngine; +} + extern "C" { void hwuidt_(int *iopt, int *ipdg, int *iwig, char nwig[8]); double hwualf_(int *mode, double* scale); @@ -108,6 +114,10 @@ class Herwig6Hadronizer : public gen::BaseHadronizer, const char *classname() const { return "Herwig6Hadronizer"; } private: + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + virtual std::vector const& doSharedResources() const override { return theSharedResources; } + void clear(); int pythiaStatusCode(const HepMC::GenParticle *p) const; @@ -116,6 +126,8 @@ class Herwig6Hadronizer : public gen::BaseHadronizer, virtual void upInit() override; virtual void upEvnt() override; + static const std::vector theSharedResources; + HepMC::IO_HERWIG conv; bool needClear; bool externalPartons; @@ -151,6 +163,9 @@ extern "C" { void mysetpdfpath_(const char *path); } // extern "C" +const std::vector Herwig6Hadronizer::theSharedResources = { edm::SharedResourceNames::kHerwig6, + gen::FortranInstance::kFortranInstance }; + Herwig6Hadronizer::Herwig6Hadronizer(const edm::ParameterSet ¶ms) : BaseHadronizer(params), needClear(false), @@ -186,6 +201,11 @@ Herwig6Hadronizer::~Herwig6Hadronizer() clear(); } +void Herwig6Hadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) +{ + setHerwigRandomEngine(v); +} + void Herwig6Hadronizer::clear() { if (!needClear) diff --git a/GeneratorInterface/Herwig6Interface/src/Herwig6Instance.cc b/GeneratorInterface/Herwig6Interface/src/Herwig6Instance.cc index 743fa6cff104c..3bfa09c9de832 100644 --- a/GeneratorInterface/Herwig6Interface/src/Herwig6Instance.cc +++ b/GeneratorInterface/Herwig6Interface/src/Herwig6Instance.cc @@ -20,8 +20,6 @@ #include "FWCore/Utilities/interface/Exception.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" - #include "GeneratorInterface/Herwig6Interface/interface/herwig.h" #include "GeneratorInterface/Herwig6Interface/interface/Herwig6Instance.h" @@ -79,14 +77,8 @@ extern "C" { // Herwig6Instance methods -Herwig6Instance::Herwig6Instance(CLHEP::HepRandomEngine *randomEngine) : - randomEngine(randomEngine ? randomEngine : &getEngineReference()), - timeoutPrivate(0) -{ -} - -Herwig6Instance::Herwig6Instance(int dummy) : - randomEngine(0), +Herwig6Instance::Herwig6Instance() : + randomEngine(nullptr), timeoutPrivate(0) { } diff --git a/GeneratorInterface/HiGenCommon/plugins/BetaBoostEvtVtxGenerator.cc b/GeneratorInterface/HiGenCommon/plugins/BetaBoostEvtVtxGenerator.cc index 0fe479e6bf0e3..15b98d4a8b784 100644 --- a/GeneratorInterface/HiGenCommon/plugins/BetaBoostEvtVtxGenerator.cc +++ b/GeneratorInterface/HiGenCommon/plugins/BetaBoostEvtVtxGenerator.cc @@ -43,8 +43,9 @@ using namespace edm; using namespace std; using namespace CLHEP; -class RandGaussQ; - +namespace CLHEP { + class HepRandomEngine; +} class BetaBoostEvtVtxGenerator : public edm::EDProducer{ public: @@ -53,7 +54,7 @@ class BetaBoostEvtVtxGenerator : public edm::EDProducer{ /// return a new event vertex //virtual CLHEP::Hep3Vector * newVertex(); - virtual HepMC::FourVector* newVertex() ; + virtual HepMC::FourVector* newVertex(CLHEP::HepRandomEngine*) ; virtual void produce( edm::Event&, const edm::EventSetup& ) override; virtual TMatrixD* GetInvLorentzBoost(); @@ -81,7 +82,6 @@ class BetaBoostEvtVtxGenerator : public edm::EDProducer{ /// beta function double BetaFunction(double z, double z0); - CLHEP::HepRandomEngine& getEngine(); private: /** Copy constructor */ @@ -102,36 +102,17 @@ class BetaBoostEvtVtxGenerator : public edm::EDProducer{ TMatrixD *boost_; double fTimeOffset; - CLHEP::HepRandomEngine* fEngine; edm::InputTag sourceLabel; - CLHEP::RandGaussQ* fRandom ; - bool verbosity_; - }; BetaBoostEvtVtxGenerator::BetaBoostEvtVtxGenerator(const edm::ParameterSet & p ): - fVertex(0), boost_(0), fTimeOffset(0), fEngine(0), + fVertex(0), boost_(0), fTimeOffset(0), sourceLabel(p.getParameter("src")), verbosity_(p.getUntrackedParameter("verbosity",false)) -{ - - edm::Service rng; - - if ( ! rng.isAvailable()) { - - throw cms::Exception("Configuration") - << "The BaseEvtVtxGenerator requires the RandomNumberGeneratorService\n" - "which is not present in the configuration file. You must add the service\n" - "in the configuration file or remove the modules that require it."; - } - - CLHEP::HepRandomEngine& engine = rng->getEngine(); - fEngine = &engine; - fRandom = new CLHEP::RandGaussQ(getEngine()); - +{ fX0 = p.getParameter("X0")*cm; fY0 = p.getParameter("Y0")*cm; fZ0 = p.getParameter("Z0")*cm; @@ -156,34 +137,28 @@ BetaBoostEvtVtxGenerator::~BetaBoostEvtVtxGenerator() { delete fVertex ; if (boost_ != 0 ) delete boost_; - delete fRandom; -} - -CLHEP::HepRandomEngine& BetaBoostEvtVtxGenerator::getEngine(){ - return *fEngine; } - //Hep3Vector* BetaBoostEvtVtxGenerator::newVertex() { -HepMC::FourVector* BetaBoostEvtVtxGenerator::newVertex() { +HepMC::FourVector* BetaBoostEvtVtxGenerator::newVertex(CLHEP::HepRandomEngine* engine) { double X,Y,Z; - - double tmp_sigz = fRandom->fire(0., fSigmaZ); + + double tmp_sigz = CLHEP::RandGaussQ::shoot(engine, 0.0, fSigmaZ); Z = tmp_sigz + fZ0; double tmp_sigx = BetaFunction(Z,fZ0); // need sqrt(2) for beamspot width relative to single beam width tmp_sigx /= sqrt(2.0); - X = fRandom->fire(0.,tmp_sigx) + fX0; // + Z*fdxdz ; + X = CLHEP::RandGaussQ::shoot(engine, 0.0, tmp_sigx) + fX0; // + Z*fdxdz ; double tmp_sigy = BetaFunction(Z,fZ0); // need sqrt(2) for beamspot width relative to single beam width tmp_sigy /= sqrt(2.0); - Y = fRandom->fire(0.,tmp_sigy) + fY0; // + Z*fdydz; + Y = CLHEP::RandGaussQ::shoot(engine, 0.0, tmp_sigy) + fY0; // + Z*fdydz; - double tmp_sigt = fRandom->fire(0., fSigmaZ); + double tmp_sigt = CLHEP::RandGaussQ::shoot(engine, 0.0, fSigmaZ); double T = tmp_sigt + fTimeOffset; if ( fVertex == 0 ) fVertex = new HepMC::FourVector(); @@ -277,6 +252,13 @@ TMatrixD* BetaBoostEvtVtxGenerator::GetInvLorentzBoost() { void BetaBoostEvtVtxGenerator::produce( Event& evt, const EventSetup& ) { + edm::Service rng; + if (!rng.isAvailable()) { + throw cms::Exception("Configuration") + << "Attempt to get a random engine when the RandomNumberGeneratorService is not configured.\n" + "You must configure the service if you want an engine.\n"; + } + CLHEP::HepRandomEngine* engine = &rng->getEngine(evt.streamID()); Handle HepMCEvt ; @@ -284,7 +266,7 @@ void BetaBoostEvtVtxGenerator::produce( Event& evt, const EventSetup& ) // generate new vertex & apply the shift // - HepMCEvt->applyVtxGen( newVertex() ) ; + HepMCEvt->applyVtxGen( newVertex(engine) ) ; //HepMCEvt->LorentzBoost( 0., 142.e-6 ); HepMCEvt->boostToLab( GetInvLorentzBoost(), "vertex" ); @@ -296,8 +278,5 @@ void BetaBoostEvtVtxGenerator::produce( Event& evt, const EventSetup& ) return ; } - - - #include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(BetaBoostEvtVtxGenerator); diff --git a/GeneratorInterface/HiGenCommon/plugins/HiCentralityBiasFilter.cc b/GeneratorInterface/HiGenCommon/plugins/HiCentralityBiasFilter.cc index 6f85c9c3cbae1..6a4f5ded3bbb4 100644 --- a/GeneratorInterface/HiGenCommon/plugins/HiCentralityBiasFilter.cc +++ b/GeneratorInterface/HiGenCommon/plugins/HiCentralityBiasFilter.cc @@ -108,7 +108,7 @@ HiCentralityBiasFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup - CLHEP::HepRandomEngine& engine = rng_->getEngine(); + CLHEP::HepRandomEngine& engine = rng_->getEngine(iEvent.streamID()); Handle mc; iEvent.getByLabel(hepmcSrc_,mc); diff --git a/GeneratorInterface/HiGenCommon/plugins/MixBoostEvtVtxGenerator.cc b/GeneratorInterface/HiGenCommon/plugins/MixBoostEvtVtxGenerator.cc index f5f7b1a37c8cb..9fb67a878994f 100644 --- a/GeneratorInterface/HiGenCommon/plugins/MixBoostEvtVtxGenerator.cc +++ b/GeneratorInterface/HiGenCommon/plugins/MixBoostEvtVtxGenerator.cc @@ -26,8 +26,6 @@ ________________________________________________________________________ #include "FWCore/Framework/interface/EDProducer.h" #include "FWCore/Utilities/interface/InputTag.h" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" #include "DataFormats/VertexReco/interface/Vertex.h" #include "DataFormats/VertexReco/interface/VertexFwd.h" @@ -84,7 +82,6 @@ class MixBoostEvtVtxGenerator : public edm::EDProducer{ /// beta function double BetaFunction(double z, double z0); - CLHEP::HepRandomEngine& getEngine(); private: /** Copy constructor */ @@ -105,7 +102,6 @@ class MixBoostEvtVtxGenerator : public edm::EDProducer{ TMatrixD *boost_; double fTimeOffset; - CLHEP::HepRandomEngine* fEngine; edm::InputTag sourceLabel; CLHEP::RandGaussQ* fRandom ; @@ -119,7 +115,7 @@ class MixBoostEvtVtxGenerator : public edm::EDProducer{ MixBoostEvtVtxGenerator::MixBoostEvtVtxGenerator(const edm::ParameterSet & pset ): - fVertex(0), boost_(0), fTimeOffset(0), fEngine(0), + fVertex(0), boost_(0), fTimeOffset(0), signalLabel(pset.getParameter("signalLabel")), hiLabel(pset.getParameter("heavyIonLabel")), useRecVertex(pset.exists("useRecVertex")?pset.getParameter("useRecVertex"):false) @@ -127,18 +123,6 @@ MixBoostEvtVtxGenerator::MixBoostEvtVtxGenerator(const edm::ParameterSet & pset vtxOffset.resize(3); if(pset.exists("vtxOffset")) vtxOffset=pset.getParameter< std::vector >("vtxOffset"); - edm::Service rng; - - if ( ! rng.isAvailable()) { - - throw cms::Exception("Configuration") - << "The BaseEvtVtxGenerator requires the RandomNumberGeneratorService\n" - "which is not present in the configuration file. You must add the service\n" - "in the configuration file or remove the modules that require it."; - } - - CLHEP::HepRandomEngine& engine = rng->getEngine(); - fEngine = &engine; produces("matchedVertex"); @@ -151,10 +135,6 @@ MixBoostEvtVtxGenerator::~MixBoostEvtVtxGenerator() delete fRandom; } -CLHEP::HepRandomEngine& MixBoostEvtVtxGenerator::getEngine(){ - return *fEngine; -} - //Hep3Vector* MixBoostEvtVtxGenerator::newVertex() { HepMC::FourVector* MixBoostEvtVtxGenerator::newVertex() { diff --git a/GeneratorInterface/HijingInterface/interface/HijingHadronizer.h b/GeneratorInterface/HijingInterface/interface/HijingHadronizer.h index 126d1b5dc67db..31a4538a2ffef 100644 --- a/GeneratorInterface/HijingInterface/interface/HijingHadronizer.h +++ b/GeneratorInterface/HijingInterface/interface/HijingHadronizer.h @@ -3,7 +3,6 @@ #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "GeneratorInterface/Core/interface/BaseHadronizer.h" -#include "CLHEP/Random/RandomEngine.h" #include #include @@ -16,7 +15,9 @@ namespace HepMC { class GenVertex; } -extern CLHEP::HepRandomEngine* hijRandomEngine; +namespace CLHEP { + class HepRandomEngine; +} namespace gen { @@ -44,7 +45,10 @@ namespace gen const char* classname() const; private: - + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + virtual std::vector const& doSharedResources() const override { return theSharedResources; } + void add_heavy_ion_rec(HepMC::GenEvent *evt); HepMC::GenParticle* build_hijing( int index, int barcode ); HepMC::GenVertex* build_hijing_vertex(int i, int id); @@ -77,6 +81,8 @@ namespace gen double cosphi0_; bool rotate_; // Switch to rotate event plane + static const std::vector theSharedResources; + // unsigned int shadowingswitch_; // shadowing switcher // 1-ON, 0-OFF // double signn_; // inelastic nucleon nucleon cross section [mb] diff --git a/GeneratorInterface/HijingInterface/interface/HijingPythiaWrapper.h b/GeneratorInterface/HijingInterface/interface/HijingPythiaWrapper.h index cff7dcf4417ee..aef3dd6206a38 100644 --- a/GeneratorInterface/HijingInterface/interface/HijingPythiaWrapper.h +++ b/GeneratorInterface/HijingInterface/interface/HijingPythiaWrapper.h @@ -4,8 +4,6 @@ #include "GeneratorInterface/Pythia6Interface/interface/Pythia6Service.h" #include "HepMC/PythiaWrapper6_4.h" -#include "CLHEP/Random/RandomEngine.h" - extern "C" { void py1ent_(int& ip, int& kf, double& pe, double& the, double& phi); @@ -59,41 +57,6 @@ float ranff_(unsigned int *iseed) return (*iseed) / 4294967296.0; } - -CLHEP::HepRandomEngine* hijRandomEngine; - -extern "C" -{ - float gen::hijran_(int *idummy) - { - return hijRandomEngine->flat(); - } -} - - - - -extern "C" { - float ran_(unsigned int* iseed){ - return hijRandomEngine->flat(); - // return ranff_(iseed); - // return gen::pyr_(0); - } -} - -extern "C" { - float rlu_(unsigned int* iseed){ - return hijRandomEngine->flat(); - // return ranff_(iseed); - // return gen::pyr_(0); - } -} - - - - - - /* #include "CLHEP/Random/RandomEngine.h" diff --git a/GeneratorInterface/HijingInterface/src/HijingHadronizer.cc b/GeneratorInterface/HijingInterface/src/HijingHadronizer.cc index b90b0edc1a1db..54e71e2b8b824 100644 --- a/GeneratorInterface/HijingInterface/src/HijingHadronizer.cc +++ b/GeneratorInterface/HijingInterface/src/HijingHadronizer.cc @@ -3,14 +3,12 @@ #include "boost/lexical_cast.hpp" +#include "FWCore/Concurrency/interface/SharedResourceNames.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/Run.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" #include "FWCore/Utilities/interface/EDMException.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" #include "GeneratorInterface/HijingInterface/interface/HijingHadronizer.h" #include "GeneratorInterface/HijingInterface/interface/HijingPythiaWrapper.h" @@ -22,6 +20,7 @@ #include "HepMC/GenEvent.h" #include "HepMC/HeavyIon.h" #include "HepMC/SimpleVector.h" + #include "CLHEP/Random/RandomEngine.h" static const double pi = 3.14159265358979; @@ -30,6 +29,33 @@ using namespace edm; using namespace std; using namespace gen; +static CLHEP::HepRandomEngine* hijRandomEngine; + +extern "C" +{ + float gen::hijran_(int *idummy) + { + return hijRandomEngine->flat(); + } +} + +extern "C" { + float ran_(unsigned int* iseed){ + return hijRandomEngine->flat(); + // return ranff_(iseed); + // return gen::pyr_(0); + } +} + +extern "C" { + float rlu_(unsigned int* iseed){ + return hijRandomEngine->flat(); + // return ranff_(iseed); + // return gen::pyr_(0); + } +} + +const std::vector HijingHadronizer::theSharedResources = { edm::SharedResourceNames::kPythia6 }; HijingHadronizer::HijingHadronizer(const ParameterSet &pset) : BaseHadronizer(pset), @@ -51,9 +77,6 @@ HijingHadronizer::HijingHadronizer(const ParameterSet &pset) : rotate_(pset.getParameter("rotateEventPlane")) { // Default constructor - Service rng; - hijRandomEngine = &(rng->getEngine()); - } @@ -63,6 +86,14 @@ HijingHadronizer::~HijingHadronizer() // destructor } + +//_____________________________________________________________________ +void HijingHadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) +{ + hijRandomEngine = v; +} + + //_____________________________________________________________________ void HijingHadronizer::add_heavy_ion_rec(HepMC::GenEvent *evt) { diff --git a/GeneratorInterface/HydjetInterface/BuildFile.xml b/GeneratorInterface/HydjetInterface/BuildFile.xml index f7f597fa1c57b..2b6ae269bab6c 100644 --- a/GeneratorInterface/HydjetInterface/BuildFile.xml +++ b/GeneratorInterface/HydjetInterface/BuildFile.xml @@ -1,5 +1,6 @@ + diff --git a/GeneratorInterface/HydjetInterface/interface/HydjetHadronizer.h b/GeneratorInterface/HydjetInterface/interface/HydjetHadronizer.h index fad6c69ba87df..952517db39202 100644 --- a/GeneratorInterface/HydjetInterface/interface/HydjetHadronizer.h +++ b/GeneratorInterface/HydjetInterface/interface/HydjetHadronizer.h @@ -20,6 +20,10 @@ #include #include +namespace CLHEP { + class HepRandomEngine; +} + namespace HepMC { class GenEvent; class GenParticle; @@ -50,6 +54,12 @@ namespace gen const char* classname() const; private: + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + virtual std::vector const& doSharedResources() const override { return theSharedResources; } + + static const std::vector theSharedResources; + void add_heavy_ion_rec(HepMC::GenEvent *evt); HepMC::GenParticle* build_hyjet( int index, int barcode ); HepMC::GenVertex* build_hyjet_vertex(int i, int id); diff --git a/GeneratorInterface/HydjetInterface/src/HydjetHadronizer.cc b/GeneratorInterface/HydjetInterface/src/HydjetHadronizer.cc index 0d046c97ea9d6..a790527159d92 100644 --- a/GeneratorInterface/HydjetInterface/src/HydjetHadronizer.cc +++ b/GeneratorInterface/HydjetInterface/src/HydjetHadronizer.cc @@ -10,15 +10,14 @@ #include "boost/lexical_cast.hpp" +#include "FWCore/Concurrency/interface/SharedResourceNames.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/Run.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" #include "FWCore/Utilities/interface/EDMException.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" +#include "GeneratorInterface/Core/interface/FortranInstance.h" #include "GeneratorInterface/HydjetInterface/interface/HydjetHadronizer.h" #include "GeneratorInterface/HydjetInterface/interface/HydjetWrapper.h" #include "GeneratorInterface/Pythia6Interface/interface/Pythia6Declarations.h" @@ -48,6 +47,8 @@ namespace { } } +const std::vector HydjetHadronizer::theSharedResources = { edm::SharedResourceNames::kPythia6, + gen::FortranInstance::kFortranInstance }; //_____________________________________________________________________ HydjetHadronizer::HydjetHadronizer(const ParameterSet &pset) : @@ -110,6 +111,13 @@ HydjetHadronizer::~HydjetHadronizer() } +//_____________________________________________________________________ +void HydjetHadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) +{ + pythia6Service_->setRandomEngine(v); +} + + //_____________________________________________________________________ void HydjetHadronizer::add_heavy_ion_rec(HepMC::GenEvent *evt) { diff --git a/GeneratorInterface/LHEInterface/interface/Hadronisation.h b/GeneratorInterface/LHEInterface/interface/Hadronisation.h index 5e3dd0af0b49b..351fc443af9af 100644 --- a/GeneratorInterface/LHEInterface/interface/Hadronisation.h +++ b/GeneratorInterface/LHEInterface/interface/Hadronisation.h @@ -13,6 +13,10 @@ #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/PluginManager/interface/PluginFactory.h" +namespace CLHEP { + class HepRandomEngine; +} + namespace lhef { class LHEEvent; @@ -27,6 +31,8 @@ class Hadronisation { bool setEvent(const boost::shared_ptr &event); void clear(); + void setRandomEngine(CLHEP::HepRandomEngine* v) { doSetRandomEngine(v); } + virtual void statistics() {} virtual double totalBranchingRatio(int pdgId) const { return 1.0; } @@ -64,6 +70,9 @@ class Hadronisation { virtual void newRunInfo(const boost::shared_ptr &runInfo); private: + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) { } + sigc::signal&> sigShower; sigc::signal sigInit; sigc::signal sigBeforeHadronisation; diff --git a/GeneratorInterface/LHEInterface/plugins/LHEProducer.cc b/GeneratorInterface/LHEInterface/plugins/LHEProducer.cc index 572e7561f4721..b58a51f82a1ac 100644 --- a/GeneratorInterface/LHEInterface/plugins/LHEProducer.cc +++ b/GeneratorInterface/LHEInterface/plugins/LHEProducer.cc @@ -13,6 +13,7 @@ #include "FWCore/Framework/interface/Run.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ServiceRegistry/interface/RandomEngineSentry.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h" @@ -175,6 +176,8 @@ void LHEProducer::endRunProduce(edm::Run &run, const edm::EventSetup &es) bool LHEProducer::filter(edm::Event &event, const edm::EventSetup &es) { + edm::RandomEngineSentry randomEngineSentry(hadronisation.get(), event.streamID()); + std::auto_ptr result(new edm::HepMCProduct); edm::Handle product; diff --git a/GeneratorInterface/MCatNLOInterface/plugins/MCatNLOSource.cc b/GeneratorInterface/MCatNLOInterface/plugins/MCatNLOSource.cc index 3405617c6af3e..efc3a2bb21426 100644 --- a/GeneratorInterface/MCatNLOInterface/plugins/MCatNLOSource.cc +++ b/GeneratorInterface/MCatNLOInterface/plugins/MCatNLOSource.cc @@ -40,7 +40,7 @@ using namespace lhef; MCatNLOSource::MCatNLOSource(const edm::ParameterSet ¶ms, const edm::InputSourceDescription &desc) : ProducerSourceFromFiles(params, desc, false), - gen::Herwig6Instance(0), + gen::Herwig6Instance(), skipEvents(params.getUntrackedParameter("skipEvents", 0)), nEvents(0), ihpro(0), diff --git a/GeneratorInterface/PomwigInterface/BuildFile.xml b/GeneratorInterface/PomwigInterface/BuildFile.xml index 16d9b1fb71991..05ea7c24dd1cb 100644 --- a/GeneratorInterface/PomwigInterface/BuildFile.xml +++ b/GeneratorInterface/PomwigInterface/BuildFile.xml @@ -1,4 +1,5 @@ + diff --git a/GeneratorInterface/PomwigInterface/interface/PomwigHadronizer.h b/GeneratorInterface/PomwigInterface/interface/PomwigHadronizer.h index 8f6b5bfdea10f..77596f9399d16 100644 --- a/GeneratorInterface/PomwigInterface/interface/PomwigHadronizer.h +++ b/GeneratorInterface/PomwigInterface/interface/PomwigHadronizer.h @@ -9,6 +9,13 @@ #include +#include +#include + +namespace CLHEP { + class HepRandomEngine; +} + namespace gen { class PomwigHadronizer : public gen::BaseHadronizer, public gen::Herwig6Instance @@ -34,9 +41,15 @@ namespace gen const char *classname() const { return "PomwigHadronizer"; } private: + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + virtual std::vector const& doSharedResources() const override { return theSharedResources; } + void clear(); bool initializeDPDF(); + static const std::vector theSharedResources; + bool needClear; gen::ParameterCollector parameters; diff --git a/GeneratorInterface/PomwigInterface/src/PomwigHadronizer.cc b/GeneratorInterface/PomwigInterface/src/PomwigHadronizer.cc index 957d0a470eb71..c914663c89b13 100644 --- a/GeneratorInterface/PomwigInterface/src/PomwigHadronizer.cc +++ b/GeneratorInterface/PomwigInterface/src/PomwigHadronizer.cc @@ -21,6 +21,7 @@ #include #include "HepPID/ParticleIDTranslations.hh" +#include "FWCore/Concurrency/interface/SharedResourceNames.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" @@ -31,6 +32,7 @@ #include "GeneratorInterface/Core/interface/ParameterCollector.h" #include "GeneratorInterface/Core/interface/BaseHadronizer.h" +#include "GeneratorInterface/Core/interface/FortranInstance.h" #include "GeneratorInterface/LHEInterface/interface/LHEEvent.h" @@ -86,6 +88,9 @@ extern "C" { void mysetpdfpath_(const char *path); } +const std::vector PomwigHadronizer::theSharedResources = { edm::SharedResourceNames::kHerwig6, + gen::FortranInstance::kFortranInstance }; + PomwigHadronizer::PomwigHadronizer(const edm::ParameterSet ¶ms) : BaseHadronizer(params), needClear(false), @@ -112,6 +117,11 @@ PomwigHadronizer::~PomwigHadronizer() clear(); } +void PomwigHadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) +{ + setHerwigRandomEngine(v); +} + void PomwigHadronizer::clear() { if (!needClear) diff --git a/GeneratorInterface/PyquenInterface/BuildFile.xml b/GeneratorInterface/PyquenInterface/BuildFile.xml index 55c827d0bfb95..47d0404b37037 100644 --- a/GeneratorInterface/PyquenInterface/BuildFile.xml +++ b/GeneratorInterface/PyquenInterface/BuildFile.xml @@ -1,4 +1,5 @@ + diff --git a/GeneratorInterface/PyquenInterface/interface/PyquenHadronizer.h b/GeneratorInterface/PyquenInterface/interface/PyquenHadronizer.h index da617ab45ab98..a614f4565b055 100644 --- a/GeneratorInterface/PyquenInterface/interface/PyquenHadronizer.h +++ b/GeneratorInterface/PyquenInterface/interface/PyquenHadronizer.h @@ -13,10 +13,17 @@ #include "GeneratorInterface/HiGenCommon/interface/BaseHiGenEvtSelector.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Utilities/interface/InputTag.h" + #include #include +#include + #include "HepMC/GenEvent.h" +namespace CLHEP { + class HepRandomEngine; +} + namespace gen { class Pythia6Service; @@ -42,6 +49,12 @@ namespace gen const char* classname() const; private: + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + virtual std::vector const& doSharedResources() const override { return theSharedResources; } + + static const std::vector theSharedResources; + void add_heavy_ion_rec(HepMC::GenEvent *evt); bool pyqpythia_init(const edm::ParameterSet &pset); diff --git a/GeneratorInterface/PyquenInterface/src/PyquenHadronizer.cc b/GeneratorInterface/PyquenInterface/src/PyquenHadronizer.cc index 2a4c4b07569d5..ebdd4f9093753 100644 --- a/GeneratorInterface/PyquenInterface/src/PyquenHadronizer.cc +++ b/GeneratorInterface/PyquenInterface/src/PyquenHadronizer.cc @@ -8,6 +8,8 @@ #include #include "GeneratorInterface/PyquenInterface/interface/PyquenHadronizer.h" + +#include "GeneratorInterface/Core/interface/FortranInstance.h" #include "GeneratorInterface/PyquenInterface/interface/PyquenWrapper.h" #include "GeneratorInterface/Pythia6Interface/interface/Pythia6Declarations.h" #include "GeneratorInterface/Pythia6Interface/interface/Pythia6Service.h" @@ -15,10 +17,9 @@ #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" +#include "FWCore/Concurrency/interface/SharedResourceNames.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" #include "GeneratorInterface/HiGenCommon/interface/HiGenEvtSelectorFactory.h" @@ -31,6 +32,9 @@ using namespace std; HepMC::IO_HEPEVT hepevtio; +const std::vector PyquenHadronizer::theSharedResources = { edm::SharedResourceNames::kPythia6, + gen::FortranInstance::kFortranInstance }; + PyquenHadronizer :: PyquenHadronizer(const ParameterSet & pset): BaseHadronizer(pset), pset_(pset), @@ -88,6 +92,13 @@ PyquenHadronizer::~PyquenHadronizer() } +//_____________________________________________________________________ +void PyquenHadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) +{ + pythia6Service_->setRandomEngine(v); +} + + //_____________________________________________________________________ void PyquenHadronizer::add_heavy_ion_rec(HepMC::GenEvent *evt) { diff --git a/GeneratorInterface/Pythia6Interface/BuildFile.xml b/GeneratorInterface/Pythia6Interface/BuildFile.xml index 16382cb4233f4..1ed0b122d2253 100644 --- a/GeneratorInterface/Pythia6Interface/BuildFile.xml +++ b/GeneratorInterface/Pythia6Interface/BuildFile.xml @@ -1,5 +1,6 @@ + diff --git a/GeneratorInterface/Pythia6Interface/interface/PtYDistributor.h b/GeneratorInterface/Pythia6Interface/interface/PtYDistributor.h index 831bde376cfcd..46169a1b3e29c 100644 --- a/GeneratorInterface/Pythia6Interface/interface/PtYDistributor.h +++ b/GeneratorInterface/Pythia6Interface/interface/PtYDistributor.h @@ -1,14 +1,14 @@ #ifndef gen_PTYDISTRIBUTOR_H #define gen_PTYDISTRIBUTOR_H -#include -#include -#include - -#include "CLHEP/Random/JamesRandom.h" -#include "CLHEP/Random/RandGeneral.h" +namespace edm { + class FileInPath; +} -#include "FWCore/ParameterSet/interface/FileInPath.h" +namespace CLHEP { + class RandGeneral; + class HepRandomEngine; +} namespace gen { @@ -16,16 +16,16 @@ namespace gen public: PtYDistributor() {}; //PtYDistributor(std::string inputfile, CLHEP::HepRandomEngine& fRandomEngine, double ptmax, double ptmin, double ymax, double ymin, int ptbins, int ybins); - PtYDistributor(const edm::FileInPath& fip, CLHEP::HepRandomEngine& fRandomEngine, + PtYDistributor(const edm::FileInPath& fip, double ptmax, double ptmin, double ymax, double ymin, int ptbins, int ybins); virtual ~PtYDistributor() {}; - double fireY(); - double firePt(); - double fireY(double ymin, double ymax); - double firePt(double ptmin, double ptmax); - + double fireY(CLHEP::HepRandomEngine*); + double firePt(CLHEP::HepRandomEngine*); + double fireY(double ymin, double ymax, CLHEP::HepRandomEngine*); + double firePt(double ptmin, double ptmax, CLHEP::HepRandomEngine*); + private: double ptmax_; double ptmin_; @@ -37,9 +37,6 @@ namespace gen CLHEP::RandGeneral* fYGenerator; CLHEP::RandGeneral* fPtGenerator; - }; } - #endif - diff --git a/GeneratorInterface/Pythia6Interface/interface/Pythia6Service.h b/GeneratorInterface/Pythia6Interface/interface/Pythia6Service.h index a1cda5a03e033..06f7dcebbfc51 100644 --- a/GeneratorInterface/Pythia6Interface/interface/Pythia6Service.h +++ b/GeneratorInterface/Pythia6Interface/interface/Pythia6Service.h @@ -10,8 +10,7 @@ // #include "HepMC/PythiaWrapper6_2.h" -namespace CLHEP -{ +namespace CLHEP { class HepRandomEngine; } @@ -45,6 +44,7 @@ namespace gen // initialise Pythia on first call from "dummy" instance virtual void enter(); + CLHEP::HepRandomEngine* randomEngine() const { return fRandomEngine; } void setRandomEngine(CLHEP::HepRandomEngine* v) { fRandomEngine = v; } private: diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6EGun.cc b/GeneratorInterface/Pythia6Interface/plugins/Pythia6EGun.cc index 1c404a17ae6e2..da228b3210d92 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6EGun.cc +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6EGun.cc @@ -34,7 +34,7 @@ Pythia6EGun::~Pythia6EGun() { } -void Pythia6EGun::generateEvent() +void Pythia6EGun::generateEvent(CLHEP::HepRandomEngine*) { Pythia6Service::InstanceWrapper guard(fPy6Service); // grab Py6 instance diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6EGun.h b/GeneratorInterface/Pythia6Interface/plugins/Pythia6EGun.h index 4f6efcc94ac46..7b8783707baa7 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6EGun.h +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6EGun.h @@ -3,6 +3,10 @@ #include "Pythia6ParticleGun.h" +namespace CLHEP { + class HepRandomEngine; +} + namespace gen { class Pythia6EGun : public Pythia6ParticleGun @@ -15,7 +19,7 @@ namespace gen { // void produce( edm::Event&, const edm::EventSetup& ) ; protected: - void generateEvent(); + void generateEvent(CLHEP::HepRandomEngine*); private: diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6Gun.cc b/GeneratorInterface/Pythia6Interface/plugins/Pythia6Gun.cc index bddea94f2aa77..b5e77b7a3d635 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6Gun.cc +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6Gun.cc @@ -13,6 +13,8 @@ #include "FWCore/Framework/interface/EDProducer.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/LuminosityBlock.h" +#include "FWCore/ServiceRegistry/interface/RandomEngineSentry.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" @@ -71,8 +73,17 @@ void Pythia6Gun::beginJob() void Pythia6Gun::beginRun( Run const&, EventSetup const& es ) { + std::cout << " FYI: MSTU(10)=1 is ENFORCED in Py6-PGuns, for technical reasons" + << std::endl; + return; +} + +void Pythia6Gun::beginLuminosityBlock(LuminosityBlock const& lumi, EventSetup const&) { + assert ( fPy6Service ) ; + RandomEngineSentry sentry(fPy6Service, lumi.index()); + Pythia6Service::InstanceWrapper guard(fPy6Service); // grab Py6 instance fPy6Service->setGeneralParams(); @@ -82,10 +93,6 @@ void Pythia6Gun::beginRun( Run const&, EventSetup const& es ) call_pygive("MSTU(10)=1"); call_pyinit("NONE", "", "", 0.0); - - std::cout << " FYI: MSTU(10)=1 is ENFORCED in Py6-PGuns, for technical reasons" - << std::endl; - return; } void Pythia6Gun::endRun( Run const&, EventSetup const& es ) @@ -194,9 +201,10 @@ void Pythia6Gun::attachPy6DecaysToGenEvent() void Pythia6Gun::produce( edm::Event& evt, const edm::EventSetup& ) { + RandomEngineSentry sentry(fPy6Service, evt.streamID()); + + generateEvent(fPy6Service->randomEngine()) ; - generateEvent() ; - fEvt->set_beam_particles(0,0); fEvt->set_event_number(evt.id().event()) ; fEvt->set_signal_process_id(pypars.msti[0]) ; diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6Gun.h b/GeneratorInterface/Pythia6Interface/plugins/Pythia6Gun.h index e78d0645ea970..9f91a6d001a2c 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6Gun.h +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6Gun.h @@ -24,6 +24,15 @@ #include "HepPID/ParticleIDTranslations.hh" +namespace CLHEP { + class HepRandomEngine; +} + +namespace edm { + class EventSetup; + class LuminosityBlock; +} + namespace gen { @@ -37,6 +46,7 @@ namespace gen Pythia6Gun( const edm::ParameterSet& ); virtual ~Pythia6Gun(); void beginJob() override; + void beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override; void beginRun( edm::Run const&, edm::EventSetup const& ) override; void endRun( edm::Run const&, edm::EventSetup const& ) override; void produce( edm::Event&, const edm::EventSetup& ) override; @@ -45,7 +55,7 @@ namespace gen void attachPy6DecaysToGenEvent(); void loadEvent( edm::Event& ); - virtual void generateEvent() = 0; + virtual void generateEvent(CLHEP::HepRandomEngine*) = 0; HepMC::GenParticle* addAntiParticle( int&, int&, double&, double&, double& ); Pythia6Service* fPy6Service; diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6Hadronizer.cc b/GeneratorInterface/Pythia6Interface/plugins/Pythia6Hadronizer.cc index 9611e06d956aa..cb630c21894c9 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6Hadronizer.cc +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6Hadronizer.cc @@ -9,9 +9,11 @@ #include "HepMC/HEPEVT_Wrapper.h" #include "HepMC/IO_HEPEVT.h" +#include "FWCore/Concurrency/interface/SharedResourceNames.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "GeneratorInterface/Core/interface/FortranCallback.h" +#include "GeneratorInterface/Core/interface/FortranInstance.h" #include "GeneratorInterface/LHEInterface/interface/LHERunInfo.h" @@ -96,6 +98,9 @@ static struct { JetMatching* Pythia6Hadronizer::fJetMatching = 0; +const std::vector Pythia6Hadronizer::theSharedResources = { edm::SharedResourceNames::kPythia6, + gen::FortranInstance::kFortranInstance }; + Pythia6Hadronizer::Pythia6Hadronizer(edm::ParameterSet const& ps) : BaseHadronizer(ps), fPy6Service( new Pythia6ServiceWithCallback(ps) ), // this will store py6 params for further settings @@ -249,6 +254,11 @@ Pythia6Hadronizer::~Pythia6Hadronizer() if ( fJetMatching != 0 ) delete fJetMatching; } +void Pythia6Hadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) +{ + fPy6Service->setRandomEngine(v); +} + void Pythia6Hadronizer::flushTmpStorage() { diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6Hadronizer.h b/GeneratorInterface/Pythia6Interface/plugins/Pythia6Hadronizer.h index 7fe477e5c616b..cf0677dbca18c 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6Hadronizer.h +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6Hadronizer.h @@ -7,6 +7,8 @@ // Hadronizer concept. #include +#include +#include #include @@ -27,6 +29,9 @@ namespace HepMC class GenEvent; } +namespace CLHEP { + class HepRandomEngine; +} namespace gen { @@ -63,6 +68,10 @@ class JetMatching; private: // methods // + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + virtual std::vector const& doSharedResources() const override { return theSharedResources; } + void flushTmpStorage(); void fillTmpStorage(); @@ -111,7 +120,8 @@ class JetMatching; // tmp stuff, to deal with EvtGen corrupting pyjets // int NPartsBeforeDecays; - + + static const std::vector theSharedResources; }; } diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6JetGun.cc b/GeneratorInterface/Pythia6Interface/plugins/Pythia6JetGun.cc index fcf6312d5ed1c..7b59f720d3c07 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6JetGun.cc +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6JetGun.cc @@ -37,7 +37,7 @@ Pythia6JetGun::~Pythia6JetGun() { } -void Pythia6JetGun::generateEvent() +void Pythia6JetGun::generateEvent(CLHEP::HepRandomEngine*) { Pythia6Service::InstanceWrapper guard(fPy6Service); // grab Py6 instance diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6JetGun.h b/GeneratorInterface/Pythia6Interface/plugins/Pythia6JetGun.h index bb64c37c6a3ae..fe2a2b2ac7725 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6JetGun.h +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6JetGun.h @@ -3,6 +3,10 @@ #include "Pythia6ParticleGun.h" +namespace CLHEP { + class HepRandomEngine; +} + namespace gen { class Pythia6JetGun : public Pythia6ParticleGun @@ -15,7 +19,7 @@ namespace gen { // void produce( edm::Event&, const edm::EventSetup& ) ; protected: - void generateEvent() ; + void generateEvent(CLHEP::HepRandomEngine*) ; private: diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonEGun.cc b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonEGun.cc index 1f93485e2a773..7ddb4bb346aef 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonEGun.cc +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonEGun.cc @@ -33,7 +33,7 @@ Pythia6PartonEGun::~Pythia6PartonEGun() { } -void Pythia6PartonEGun::generateEvent() +void Pythia6PartonEGun::generateEvent(CLHEP::HepRandomEngine*) { Pythia6Service::InstanceWrapper guard(fPy6Service); // grab Py6 instance diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonEGun.h b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonEGun.h index 6926a29cd8961..6f94f99ff8da0 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonEGun.h +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonEGun.h @@ -3,6 +3,10 @@ #include "Pythia6PartonGun.h" +namespace CLHEP { + class HepRandomEngine; +} + namespace gen { class Pythia6PartonEGun : public Pythia6PartonGun @@ -15,7 +19,7 @@ namespace gen { protected: - void generateEvent() ; + void generateEvent(CLHEP::HepRandomEngine*) ; private: diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonPtGun.cc b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonPtGun.cc index 98f6947de8ad4..a29088e7109d2 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonPtGun.cc +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonPtGun.cc @@ -33,7 +33,7 @@ Pythia6PartonPtGun::~Pythia6PartonPtGun() { } -void Pythia6PartonPtGun::generateEvent() +void Pythia6PartonPtGun::generateEvent(CLHEP::HepRandomEngine*) { Pythia6Service::InstanceWrapper guard(fPy6Service); // grab Py6 instance diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonPtGun.h b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonPtGun.h index af5a4237e5320..6d6f1483f20cf 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonPtGun.h +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PartonPtGun.h @@ -3,6 +3,10 @@ #include "Pythia6PartonGun.h" +namespace CLHEP { + class HepRandomEngine; +} + namespace gen { class Pythia6PartonPtGun : public Pythia6PartonGun @@ -15,7 +19,7 @@ namespace gen { protected: - void generateEvent() ; + void generateEvent(CLHEP::HepRandomEngine*) ; private: diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtGun.cc b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtGun.cc index 97dab99c8b914..58f5804ad59f6 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtGun.cc +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtGun.cc @@ -34,7 +34,7 @@ Pythia6PtGun::~Pythia6PtGun() { } -void Pythia6PtGun::generateEvent() +void Pythia6PtGun::generateEvent(CLHEP::HepRandomEngine*) { Pythia6Service::InstanceWrapper guard(fPy6Service); // grab Py6 instance diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtGun.h b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtGun.h index a9293729caca0..7156add1b61ba 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtGun.h +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtGun.h @@ -3,6 +3,10 @@ #include "Pythia6ParticleGun.h" +namespace CLHEP { + class HepRandomEngine; +} + namespace gen { class Pythia6PtGun : public Pythia6ParticleGun @@ -15,7 +19,7 @@ namespace gen { // void produce( edm::Event&, const edm::EventSetup& ) ; protected: - void generateEvent() ; + void generateEvent(CLHEP::HepRandomEngine*) ; private: diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtYDistGun.cc b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtYDistGun.cc index 5a0a432abb2df..31a0f40583cd7 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtYDistGun.cc +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtYDistGun.cc @@ -11,8 +11,6 @@ #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" - #include "FWCore/Framework/interface/MakerMacros.h" using namespace edm; @@ -25,8 +23,7 @@ Pythia6PtYDistGun::Pythia6PtYDistGun( const ParameterSet& pset ) : ParameterSet pgun_params = pset.getParameter("PGunParameters"); - fPtYGenerator = new PtYDistributor( pgun_params.getParameter("kinematicsFile"), - getEngineReference(), + fPtYGenerator = new PtYDistributor( pgun_params.getParameter("kinematicsFile"), pgun_params.getParameter("MaxPt"), pgun_params.getParameter("MinPt"), pgun_params.getParameter("MaxY"), @@ -40,7 +37,7 @@ Pythia6PtYDistGun::~Pythia6PtYDistGun() if ( fPtYGenerator ) delete fPtYGenerator; } -void Pythia6PtYDistGun::generateEvent() +void Pythia6PtYDistGun::generateEvent(CLHEP::HepRandomEngine* engine) { Pythia6Service::InstanceWrapper guard(fPy6Service); // grab Py6 instance @@ -66,8 +63,8 @@ void Pythia6PtYDistGun::generateEvent() int dum = 0; double pt=0, y=0, u=0, ee=0, the=0; - pt = fPtYGenerator->firePt(); - y = fPtYGenerator->fireY(); + pt = fPtYGenerator->firePt(engine); + y = fPtYGenerator->fireY(engine); u = exp(y); double mass = pymass_(py6PID); diff --git a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtYDistGun.h b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtYDistGun.h index 88471b86cb519..b24b942c0d76e 100644 --- a/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtYDistGun.h +++ b/GeneratorInterface/Pythia6Interface/plugins/Pythia6PtYDistGun.h @@ -2,32 +2,29 @@ #define gen_Pythia6PtYDistGun_h #include "Pythia6ParticleGun.h" -// #include "GeneratorInterface/Pythia6Interface/interface/PtYDistributor.h" +namespace CLHEP { + class HepRandomEngine; +} namespace gen { -class PtYDistributor; - - class Pythia6PtYDistGun : public Pythia6ParticleGun - { - - public: - - Pythia6PtYDistGun( const edm::ParameterSet& ); - virtual ~Pythia6PtYDistGun(); - // void produce( edm::Event&, const edm::EventSetup& ) ; - - protected: - void generateEvent() ; - - private: - - PtYDistributor* fPtYGenerator; - - }; + class PtYDistributor; + class Pythia6PtYDistGun : public Pythia6ParticleGun + { + public: -} + Pythia6PtYDistGun( const edm::ParameterSet& ); + virtual ~Pythia6PtYDistGun(); + + protected: + void generateEvent(CLHEP::HepRandomEngine*); + + private: + + PtYDistributor* fPtYGenerator; + }; +} #endif diff --git a/GeneratorInterface/Pythia6Interface/src/PtYDistributor.cc b/GeneratorInterface/Pythia6Interface/src/PtYDistributor.cc index 1265cdfba6f77..866876437d970 100644 --- a/GeneratorInterface/Pythia6Interface/src/PtYDistributor.cc +++ b/GeneratorInterface/Pythia6Interface/src/PtYDistributor.cc @@ -1,13 +1,19 @@ #include "GeneratorInterface/Pythia6Interface/interface/PtYDistributor.h" -//#include "FWCore/ParameterSet/interface/FileInPath.h" + +#include "FWCore/ParameterSet/interface/FileInPath.h" #include "FWCore/Utilities/interface/EDMException.h" #include "TFile.h" #include "TGraph.h" +#include "CLHEP/Random/RandGeneral.h" + +#include +#include + using namespace gen; -PtYDistributor::PtYDistributor(const edm::FileInPath& fip, CLHEP::HepRandomEngine& fRandomEngine, +PtYDistributor::PtYDistributor(const edm::FileInPath& fip, double ptmax = 100, double ptmin = 0, double ymax = 10, double ymin = -10, int ptbins = 1000, int ybins = 50) @@ -52,31 +58,31 @@ PtYDistributor::PtYDistributor(const edm::FileInPath& fip, CLHEP::HepRandomEngin aProbFunc2[ip] = ypt; } - fYGenerator = new CLHEP::RandGeneral(fRandomEngine,aProbFunc1,ybins_); - fPtGenerator = new CLHEP::RandGeneral(fRandomEngine,aProbFunc2,ptbins_); + fYGenerator = new CLHEP::RandGeneral(nullptr,aProbFunc1,ybins_); + fPtGenerator = new CLHEP::RandGeneral(nullptr,aProbFunc2,ptbins_); f.Close(); } // from file double -PtYDistributor::fireY(){ - return fireY(ymin_,ymax_); +PtYDistributor::fireY(CLHEP::HepRandomEngine* engine){ + return fireY(ymin_,ymax_, engine); } double -PtYDistributor::firePt(){ - return firePt(ptmin_,ptmax_); +PtYDistributor::firePt(CLHEP::HepRandomEngine* engine){ + return firePt(ptmin_,ptmax_, engine); } double -PtYDistributor::fireY(double ymin, double ymax){ +PtYDistributor::fireY(double ymin, double ymax, CLHEP::HepRandomEngine* engine){ double y = -999; if(fYGenerator){ while(y < ymin || y > ymax) - y = ymin_+(ymax_-ymin_)*fYGenerator->fire(); + y = ymin_+(ymax_-ymin_)*fYGenerator->shoot(engine); }else{ throw edm::Exception(edm::errors::NullPointerError,"PtYDistributor") <<"Random y requested but Random Number Generator for y not Initialized!"; @@ -85,13 +91,13 @@ PtYDistributor::fireY(double ymin, double ymax){ } double -PtYDistributor::firePt(double ptmin, double ptmax){ +PtYDistributor::firePt(double ptmin, double ptmax, CLHEP::HepRandomEngine* engine){ double pt = -999; if(fPtGenerator){ while(pt < ptmin || pt > ptmax) - pt = ptmin_+(ptmax_-ptmin_)*fPtGenerator->fire(); + pt = ptmin_+(ptmax_-ptmin_)*fPtGenerator->shoot(engine); }else{ throw edm::Exception(edm::errors::NullPointerError,"PtYDistributor") <<"Random pt requested but Random Number Generator for pt not Initialized!"; diff --git a/GeneratorInterface/Pythia6Interface/src/Pythia6Service.cc b/GeneratorInterface/Pythia6Interface/src/Pythia6Service.cc index 97eae684205ae..94d77b10539ad 100644 --- a/GeneratorInterface/Pythia6Interface/src/Pythia6Service.cc +++ b/GeneratorInterface/Pythia6Interface/src/Pythia6Service.cc @@ -18,8 +18,6 @@ #include "FWCore/ParameterSet/interface/FileInPath.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" - #include "GeneratorInterface/Pythia6Interface/interface/Pythia6Service.h" #include "GeneratorInterface/Pythia6Interface/interface/Pythia6Declarations.h" // #include "GeneratorInterface/Core/interface/ParameterCollector.h" @@ -83,7 +81,7 @@ Pythia6Service::Pythia6Service() } Pythia6Service::Pythia6Service( const ParameterSet& ps ) - : fRandomEngine(&getEngineReference()), fUnitSLHA(24), fUnitPYUPDA(25) + : fRandomEngine(nullptr), fUnitSLHA(24), fUnitPYUPDA(25) { if (fPythia6Owner) throw cms::Exception("PythiaError") << diff --git a/GeneratorInterface/ReggeGribovPartonMCInterface/interface/ReggeGribovPartonMCHadronizer.h b/GeneratorInterface/ReggeGribovPartonMCInterface/interface/ReggeGribovPartonMCHadronizer.h index 7c9344a92c01c..6822244545cd3 100644 --- a/GeneratorInterface/ReggeGribovPartonMCInterface/interface/ReggeGribovPartonMCHadronizer.h +++ b/GeneratorInterface/ReggeGribovPartonMCInterface/interface/ReggeGribovPartonMCHadronizer.h @@ -5,24 +5,21 @@ #include "GeneratorInterface/Core/interface/BaseHadronizer.h" #include "FWCore/ParameterSet/interface/FileInPath.h" -#include "CLHEP/Random/RandomEngine.h" -#include "CLHEP/Random/RandFlat.h" - -#include "boost/scoped_ptr.hpp" - #include #include #include #include -boost::scoped_ptr gFlatDistribution_; // yes, this must be global... - namespace HepMC { class GenEvent; class GenParticle; class GenVertex; } +namespace CLHEP { + class HepRandomEngine; +} + extern "C" { //iout,ievent,noutpart,impactpar,outpart,outpx,outpy,outpz,oute,outm,outstat @@ -221,6 +218,9 @@ namespace gen const char* classname() const; private: + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + edm::ParameterSet pset_; double m_BeamMomentum; double m_TargetMomentum; @@ -242,6 +242,8 @@ namespace gen double m_PartEnergy[nmxhep]; double m_PartMass[nmxhep]; int m_PartStatus[nmxhep]; + + bool m_IsInitialized; }; } /*end namespace*/ diff --git a/GeneratorInterface/ReggeGribovPartonMCInterface/src/ReggeGribovPartonMCHadronizer.cc b/GeneratorInterface/ReggeGribovPartonMCInterface/src/ReggeGribovPartonMCHadronizer.cc index 4dec5f110b241..5519e3ac57447 100644 --- a/GeneratorInterface/ReggeGribovPartonMCInterface/src/ReggeGribovPartonMCHadronizer.cc +++ b/GeneratorInterface/ReggeGribovPartonMCInterface/src/ReggeGribovPartonMCHadronizer.cc @@ -8,7 +8,6 @@ #include "SimDataFormats/GeneratorProducts/interface/GenRunInfoProduct.h" #include "CLHEP/Random/RandomEngine.h" -#include "CLHEP/Random/RandFlat.h" #include #include @@ -22,9 +21,6 @@ #include "FWCore/Framework/interface/Run.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/Utilities/interface/RandomNumberGenerator.h" -#include "FWCore/Utilities/interface/EDMException.h" #include "FWCore/Framework/interface/Frameworkfwd.h" #include "FWCore/Framework/interface/EDProducer.h" #include "FWCore/Framework/interface/ESHandle.h" @@ -35,6 +31,7 @@ #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" + using namespace edm; using namespace std; using namespace gen; @@ -44,17 +41,19 @@ using namespace gen; EPOS::IO_EPOS conv; +static CLHEP::HepRandomEngine* reggeGribovRandomEngine; + extern "C" { float gen::rangen_() { - float a = float(gFlatDistribution_->fire()); + float a = float(reggeGribovRandomEngine->flat()); return a; } double gen::drangen_(int *idummy) { - double a = gFlatDistribution_->fire(); + double a = reggeGribovRandomEngine->flat(); return a; } } @@ -73,19 +72,9 @@ ReggeGribovPartonMCHadronizer::ReggeGribovPartonMCHadronizer(const ParameterSet m_SkipNuclFrag(pset.getParameter("skipNuclFrag")), m_NEvent(0), m_NParticles(0), - m_ImpactParameter(0.) + m_ImpactParameter(0.), + m_IsInitialized(false) { - Service rng; - if ( ! rng.isAvailable()) - { - throw cms::Exception("Configuration") - << "ReggeGribovPartonMCHadronizer requires the RandomNumberGeneratorService\n" - "which is not present in the configuration file. You must add the service\n" - "in the configuration file or remove the modules that require it."; - } - - gFlatDistribution_.reset(new CLHEP::RandFlat(rng->getEngine(), 0., 1.)); - int nevet = 1; //needed for CS int noTables = 0; //don't calculate tables int LHEoutput = 0; //no lhe @@ -101,9 +90,6 @@ ReggeGribovPartonMCHadronizer::ReggeGribovPartonMCHadronizer(const ParameterSet //change impact paramter nucl2_.bminim = float(m_bMin); nucl2_.bmaxim = float(m_bMax); - - //use set parameters to init models - crmc_init_f_(); } @@ -111,9 +97,16 @@ ReggeGribovPartonMCHadronizer::ReggeGribovPartonMCHadronizer(const ParameterSet ReggeGribovPartonMCHadronizer::~ReggeGribovPartonMCHadronizer() { // destructor - gFlatDistribution_.reset(); } + +//_____________________________________________________________________ +void ReggeGribovPartonMCHadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) +{ + reggeGribovRandomEngine = v; +} + + //_____________________________________________________________________ bool ReggeGribovPartonMCHadronizer::generatePartonsAndHadronize() { @@ -218,8 +211,13 @@ bool ReggeGribovPartonMCHadronizer::declareStableParticles ( const std::vector #include #include #include @@ -20,9 +21,10 @@ #include "GeneratorInterface/Core/interface/BaseHadronizer.h" #include "GeneratorInterface/Core/interface/GeneratorFilter.h" #include "GeneratorInterface/Core/interface/HadronizerFilter.h" -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" #include "GeneratorInterface/SherpaInterface/interface/SherpackFetcher.h" +#include "CLHEP/Random/RandomEngine.h" + class SherpaHadronizer : public gen::BaseHadronizer { public: SherpaHadronizer(const edm::ParameterSet ¶ms); @@ -40,7 +42,9 @@ class SherpaHadronizer : public gen::BaseHadronizer { const char *classname() const { return "SherpaHadronizer"; } private: - + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override; + std::string SherpaProcess; std::string SherpaChecksum; std::string SherpaPath; @@ -51,19 +55,22 @@ class SherpaHadronizer : public gen::BaseHadronizer { unsigned int maxEventsToPrint; SHERPA::Sherpa Generator; - CLHEP::HepRandomEngine* randomEngine; - }; class CMS_SHERPA_RNG: public ATOOLS::External_RNG { public: - CMS_SHERPA_RNG(){randomEngine = &gen::getEngineReference();}; + CMS_SHERPA_RNG() : randomEngine(nullptr) { } + void setRandomEngine(CLHEP::HepRandomEngine* v) { randomEngine = v; } private: CLHEP::HepRandomEngine* randomEngine; double Get() override; }; - +void SherpaHadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) { + CMS_SHERPA_RNG* cmsSherpaRng = dynamic_cast(ATOOLS::ran->GetExternalRng()); + assert(cmsSherpaRng != nullptr); + cmsSherpaRng->setRandomEngine(v); +} SherpaHadronizer::SherpaHadronizer(const edm::ParameterSet ¶ms) : BaseHadronizer(params), @@ -250,10 +257,17 @@ ATOOLS::External_RNG *CMS_SHERPA_RNG_Getter::operator()(const ATOOLS::RNG_Key &) void CMS_SHERPA_RNG_Getter::PrintInfo(std::ostream &str,const size_t) const { str<<"CMS_SHERPA_RNG interface"; } -double CMS_SHERPA_RNG::Get(){ - return randomEngine->flat(); - } - +double CMS_SHERPA_RNG::Get() { + if(randomEngine == nullptr) { + throw edm::Exception(edm::errors::LogicError) + << "The Sherpa code attempted to a generate random number while\n" + << "the engine pointer was null. This might mean that the code\n" + << "was modified to generate a random number outside the event and\n" + << "beginLuminosityBlock methods, which is not allowed.\n"; + } + return randomEngine->flat(); +} + #include "GeneratorInterface/ExternalDecays/interface/ExternalDecayDriver.h" typedef edm::GeneratorFilter SherpaGeneratorFilter; diff --git a/GeneratorInterface/ThePEGInterface/interface/RandomEngineGlue.h b/GeneratorInterface/ThePEGInterface/interface/RandomEngineGlue.h index 4612a7a005317..fd2727a3f53c5 100644 --- a/GeneratorInterface/ThePEGInterface/interface/RandomEngineGlue.h +++ b/GeneratorInterface/ThePEGInterface/interface/RandomEngineGlue.h @@ -25,6 +25,8 @@ class RandomEngineGlue : public RandomGenerator { RandomEngineGlue(); virtual ~RandomEngineGlue(); + void setRandomEngine(CLHEP::HepRandomEngine* v) { randomEngine = v; } + void flush(); static void Init(); @@ -33,6 +35,9 @@ class RandomEngineGlue : public RandomGenerator { public: RandomEngineGlue *getInstance() const { return instance; } + CLHEP::HepRandomEngine* getRandomEngine() const { return randomEngine; } + void setRandomEngine(CLHEP::HepRandomEngine* v) { randomEngine = v; } + private: friend class RandomEngineGlue; friend class ThePEG::Proxy; @@ -40,6 +45,16 @@ class RandomEngineGlue : public RandomGenerator { inline Proxy(ProxyID id) : Base(id), instance(0) {} RandomEngineGlue *instance; + + // I do not like putting this here, but I could not + // think of an alternative without modifying the + // external code in ThePEG. The problem is the + // function ThePEG::Repository::makeRun both + // sets the pointer in the proxy and uses the + // engine. There is no opportunity to set the + // engine pointer before it is used without passing + // it in through the proxy. + CLHEP::HepRandomEngine *randomEngine; }; protected: diff --git a/GeneratorInterface/ThePEGInterface/interface/ThePEGInterface.h b/GeneratorInterface/ThePEGInterface/interface/ThePEGInterface.h index fb08067374196..b280695cc9bc0 100644 --- a/GeneratorInterface/ThePEGInterface/interface/ThePEGInterface.h +++ b/GeneratorInterface/ThePEGInterface/interface/ThePEGInterface.h @@ -23,11 +23,17 @@ #include "GeneratorInterface/ThePEGInterface/interface/RandomEngineGlue.h" +namespace CLHEP { + class HepRandomEngine; +} + class ThePEGInterface { public: ThePEGInterface(const edm::ParameterSet ¶ms); virtual ~ThePEGInterface(); + void setPEGRandomEngine(CLHEP::HepRandomEngine*); + protected: void initRepository(const edm::ParameterSet ¶ms) const; void initGenerator(); diff --git a/GeneratorInterface/ThePEGInterface/plugins/ThePEGHadronisation.cc b/GeneratorInterface/ThePEGInterface/plugins/ThePEGHadronisation.cc index 2f09a7690d502..a5025e9a4160d 100644 --- a/GeneratorInterface/ThePEGInterface/plugins/ThePEGHadronisation.cc +++ b/GeneratorInterface/ThePEGInterface/plugins/ThePEGHadronisation.cc @@ -29,6 +29,10 @@ #include "GeneratorInterface/ThePEGInterface/interface/ThePEGInterface.h" +namespace CLHEP { + class HepRandomEngine; +} + using namespace std; using namespace ThePEG; using namespace lhef; @@ -41,6 +45,9 @@ class ThePEGHadronisation : public ThePEGInterface, public Hadronisation { ~ThePEGHadronisation(); private: + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override { setPEGRandomEngine(v); } + void doInit(); std::auto_ptr doHadronisation(); void newRunInfo(const boost::shared_ptr &runInfo); diff --git a/GeneratorInterface/ThePEGInterface/plugins/ThePEGHadronizer.cc b/GeneratorInterface/ThePEGInterface/plugins/ThePEGHadronizer.cc index e001eb07ce1c5..b3b9db6f7dd8b 100644 --- a/GeneratorInterface/ThePEGInterface/plugins/ThePEGHadronizer.cc +++ b/GeneratorInterface/ThePEGInterface/plugins/ThePEGHadronizer.cc @@ -19,6 +19,10 @@ #include "GeneratorInterface/ThePEGInterface/interface/ThePEGInterface.h" +namespace CLHEP { + class HepRandomEngine; +} + class ThePEGHadronizer : public ThePEGInterface, public gen::BaseHadronizer { public: ThePEGHadronizer(const edm::ParameterSet ¶ms); @@ -41,6 +45,9 @@ class ThePEGHadronizer : public ThePEGInterface, public gen::BaseHadronizer { const char *classname() const { return "ThePEGHadronizer"; } private: + + virtual void doSetRandomEngine(CLHEP::HepRandomEngine* v) override { setPEGRandomEngine(v); } + unsigned int eventsToPrint; ThePEG::EventPtr thepegEvent; diff --git a/GeneratorInterface/ThePEGInterface/src/RandomEngineGlue.cc b/GeneratorInterface/ThePEGInterface/src/RandomEngineGlue.cc index 5185271a40e6b..9cedd52a80653 100644 --- a/GeneratorInterface/ThePEGInterface/src/RandomEngineGlue.cc +++ b/GeneratorInterface/ThePEGInterface/src/RandomEngineGlue.cc @@ -9,14 +9,14 @@ #include -#include "GeneratorInterface/Core/interface/RNDMEngineAccess.h" - #include "GeneratorInterface/ThePEGInterface/interface/RandomEngineGlue.h" +#include "FWCore/Utilities/interface/EDMException.h" + using namespace ThePEG; RandomEngineGlue::RandomEngineGlue() : - randomEngine(&gen::getEngineReference()) + randomEngine(nullptr) { } @@ -32,6 +32,13 @@ void RandomEngineGlue::flush() void RandomEngineGlue::fill() { + if(randomEngine == nullptr) { + throw edm::Exception(edm::errors::LogicError) + << "The PEG code attempted to a generate random number while\n" + << "the engine pointer was null. This might mean that the code\n" + << "was tried to generate a random number outside the event and\n" + << "beginLuminosityBlock methods, which is not allowed.\n"; + } nextNumber = theNumbers.begin(); for(RndVector::iterator it = nextNumber; it != theNumbers.end(); ++it) *it = randomEngine->flat(); @@ -51,6 +58,7 @@ void RandomEngineGlue::doinit() throw(InitException) throw InitException(); proxy->instance = this; + randomEngine = proxy->getRandomEngine(); flush(); } diff --git a/GeneratorInterface/ThePEGInterface/src/ThePEGInterface.cc b/GeneratorInterface/ThePEGInterface/src/ThePEGInterface.cc index 2487a853c19ee..a244133bdb941 100644 --- a/GeneratorInterface/ThePEGInterface/src/ThePEGInterface.cc +++ b/GeneratorInterface/ThePEGInterface/src/ThePEGInterface.cc @@ -69,6 +69,14 @@ ThePEGInterface::~ThePEGInterface() edm::LogInfo("ThePEGInterface") << "Event generator finalized"; } +void ThePEGInterface::setPEGRandomEngine(CLHEP::HepRandomEngine* v) { + randomEngineGlueProxy_->setRandomEngine(v); + ThePEG::RandomEngineGlue *rnd = randomEngineGlueProxy_->getInstance(); + if(rnd) { + rnd->setRandomEngine(v); + } +} + string ThePEGInterface::dataFile(const string &fileName) const { if (fileName.empty() || fileName[0] == '/') diff --git a/IOMC/EventVertexGenerators/interface/BaseEvtVtxGenerator.h b/IOMC/EventVertexGenerators/interface/BaseEvtVtxGenerator.h index 2abc48e8aa5cf..99c102beef4dc 100644 --- a/IOMC/EventVertexGenerators/interface/BaseEvtVtxGenerator.h +++ b/IOMC/EventVertexGenerators/interface/BaseEvtVtxGenerator.h @@ -34,7 +34,7 @@ class BaseEvtVtxGenerator : public edm::EDProducer virtual void produce( edm::Event&, const edm::EventSetup&) override; //virtual CLHEP::Hep3Vector* newVertex() = 0; - virtual HepMC::FourVector* newVertex() = 0 ; + virtual HepMC::FourVector* newVertex(CLHEP::HepRandomEngine*) = 0 ; /** This method - and the comment - is a left-over from COBRA-OSCAR time : * return the last generated event vertex. * If no vertex has been generated yet, a NULL pointer is returned. */ @@ -45,13 +45,6 @@ class BaseEvtVtxGenerator : public edm::EDProducer protected: - // Returns a reference to encourage users to use a reference - // when initializing CLHEP distributions. If a pointer - // is used, then the distribution thinks it owns the engine - // and will delete the engine when the distribution is destroyed - // (a big problem since the distribution does not own the memory). - CLHEP::HepRandomEngine& getEngine(); - //CLHEP::Hep3Vector* fVertex; HepMC::FourVector* fVertex ; TMatrixD *boost_; @@ -59,7 +52,6 @@ class BaseEvtVtxGenerator : public edm::EDProducer private : - CLHEP::HepRandomEngine* fEngine; edm::InputTag sourceLabel; }; diff --git a/IOMC/EventVertexGenerators/interface/BeamProfileVtxGenerator.h b/IOMC/EventVertexGenerators/interface/BeamProfileVtxGenerator.h index c17c0d97b2171..4ba08e03d9130 100644 --- a/IOMC/EventVertexGenerators/interface/BeamProfileVtxGenerator.h +++ b/IOMC/EventVertexGenerators/interface/BeamProfileVtxGenerator.h @@ -12,9 +12,8 @@ #include "IOMC/EventVertexGenerators/interface/BaseEvtVtxGenerator.h" #include -namespace CLHEP -{ - class HepRandom; +namespace CLHEP { + class HepRandomEngine; } class BeamProfileVtxGenerator : public BaseEvtVtxGenerator @@ -25,7 +24,7 @@ class BeamProfileVtxGenerator : public BaseEvtVtxGenerator /// return a new event vertex //virtual CLHEP::Hep3Vector * newVertex(); - virtual HepMC::FourVector* newVertex() ; + virtual HepMC::FourVector* newVertex(CLHEP::HepRandomEngine*) ; virtual TMatrixD* GetInvLorentzBoost() { return 0; @@ -68,7 +67,6 @@ class BeamProfileVtxGenerator : public BaseEvtVtxGenerator bool fType, ffile; int nBinx, nBiny; std::vector fdistn; - CLHEP::HepRandom* fRandom; double fTimeOffset; }; diff --git a/IOMC/EventVertexGenerators/interface/BetafuncEvtVtxGenerator.h b/IOMC/EventVertexGenerators/interface/BetafuncEvtVtxGenerator.h index ad6515caec54d..ff709c2f97358 100644 --- a/IOMC/EventVertexGenerators/interface/BetafuncEvtVtxGenerator.h +++ b/IOMC/EventVertexGenerators/interface/BetafuncEvtVtxGenerator.h @@ -23,7 +23,7 @@ ________________________________________________________________________ #include "CondFormats/DataRecord/interface/SimBeamSpotObjectsRcd.h" namespace CLHEP { - class RandGaussQ; + class HepRandomEngine; } class BetafuncEvtVtxGenerator : public BaseEvtVtxGenerator @@ -37,7 +37,7 @@ class BetafuncEvtVtxGenerator : public BaseEvtVtxGenerator /// return a new event vertex //virtual CLHEP::Hep3Vector * newVertex(); - virtual HepMC::FourVector* newVertex() ; + virtual HepMC::FourVector* newVertex(CLHEP::HepRandomEngine*) ; virtual TMatrixD* GetInvLorentzBoost(); @@ -84,9 +84,7 @@ class BetafuncEvtVtxGenerator : public BaseEvtVtxGenerator double fbetastar, femittance; // double falpha; double fTimeOffset; - - CLHEP::RandGaussQ* fRandom ; - + void update(const edm::EventSetup& iEventSetup); edm::ESWatcher parameterWatcher_; }; diff --git a/IOMC/EventVertexGenerators/interface/FlatEvtVtxGenerator.h b/IOMC/EventVertexGenerators/interface/FlatEvtVtxGenerator.h index b777c6fc80c6f..4c1822e9995ba 100644 --- a/IOMC/EventVertexGenerators/interface/FlatEvtVtxGenerator.h +++ b/IOMC/EventVertexGenerators/interface/FlatEvtVtxGenerator.h @@ -10,7 +10,7 @@ #include "IOMC/EventVertexGenerators/interface/BaseEvtVtxGenerator.h" namespace CLHEP { - class RandFlat; + class HepRandomEngine; } class FlatEvtVtxGenerator : public BaseEvtVtxGenerator @@ -21,7 +21,7 @@ class FlatEvtVtxGenerator : public BaseEvtVtxGenerator /// return a new event vertex //virtual CLHEP::Hep3Vector* newVertex(); - virtual HepMC::FourVector* newVertex() ; + virtual HepMC::FourVector* newVertex(CLHEP::HepRandomEngine*) ; virtual TMatrixD* GetInvLorentzBoost() { return 0; @@ -50,7 +50,6 @@ class FlatEvtVtxGenerator : public BaseEvtVtxGenerator private: double fMinX, fMinY, fMinZ; double fMaxX, fMaxY, fMaxZ; - CLHEP::RandFlat* fRandom ; double fTimeOffset; }; diff --git a/IOMC/EventVertexGenerators/interface/GaussEvtVtxGenerator.h b/IOMC/EventVertexGenerators/interface/GaussEvtVtxGenerator.h index f64d9d640ee08..01d52027bd586 100644 --- a/IOMC/EventVertexGenerators/interface/GaussEvtVtxGenerator.h +++ b/IOMC/EventVertexGenerators/interface/GaussEvtVtxGenerator.h @@ -10,7 +10,7 @@ #include "IOMC/EventVertexGenerators/interface/BaseEvtVtxGenerator.h" namespace CLHEP { - class RandGaussQ; + class HepRandomEngine; } class GaussEvtVtxGenerator : public BaseEvtVtxGenerator @@ -21,7 +21,7 @@ class GaussEvtVtxGenerator : public BaseEvtVtxGenerator /// return a new event vertex //virtual CLHEP::Hep3Vector* newVertex(); - virtual HepMC::FourVector* newVertex() ; + virtual HepMC::FourVector* newVertex(CLHEP::HepRandomEngine*) ; virtual TMatrixD* GetInvLorentzBoost() { return 0; @@ -50,7 +50,6 @@ class GaussEvtVtxGenerator : public BaseEvtVtxGenerator private: double fSigmaX, fSigmaY, fSigmaZ; double fMeanX, fMeanY, fMeanZ; - CLHEP::RandGaussQ* fRandom ; double fTimeOffset; }; diff --git a/IOMC/EventVertexGenerators/interface/GaussianZBeamSpotFilter.h b/IOMC/EventVertexGenerators/interface/GaussianZBeamSpotFilter.h index 67c49ad99244d..5070a5a40e006 100644 --- a/IOMC/EventVertexGenerators/interface/GaussianZBeamSpotFilter.h +++ b/IOMC/EventVertexGenerators/interface/GaussianZBeamSpotFilter.h @@ -14,11 +14,6 @@ #include "FWCore/Framework/interface/MakerMacros.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" -namespace CLHEP { - class HepRandomEngine; - class RandFlat; -} - class GaussianZBeamSpotFilter : public edm::EDFilter { public: @@ -35,9 +30,6 @@ class GaussianZBeamSpotFilter : public edm::EDFilter double baseZ0_; double newSZ_; double newZ0_; - - CLHEP::RandFlat* fRandom ; - }; #endif diff --git a/IOMC/EventVertexGenerators/src/BaseEvtVtxGenerator.cc b/IOMC/EventVertexGenerators/src/BaseEvtVtxGenerator.cc index d80f3f8b654f1..15f6dcf9e5128 100644 --- a/IOMC/EventVertexGenerators/src/BaseEvtVtxGenerator.cc +++ b/IOMC/EventVertexGenerators/src/BaseEvtVtxGenerator.cc @@ -27,7 +27,7 @@ using namespace CLHEP; //using namespace HepMC; BaseEvtVtxGenerator::BaseEvtVtxGenerator( const ParameterSet& pset ) - : fVertex(0), boost_(0), fTimeOffset(0), fEngine(0), + : fVertex(0), boost_(0), fTimeOffset(0), sourceLabel(pset.getParameter("src")) { @@ -41,21 +41,15 @@ BaseEvtVtxGenerator::BaseEvtVtxGenerator( const ParameterSet& pset ) "The label of this module MUST be VtxSmeared."; } */ - - Service rng; + Service rng; if ( ! rng.isAvailable()) { - throw cms::Exception("Configuration") << "The BaseEvtVtxGenerator requires the RandomNumberGeneratorService\n" "which is not present in the configuration file. You must add the service\n" "in the configuration file or remove the modules that require it."; } - CLHEP::HepRandomEngine& engine = rng->getEngine(); - fEngine = &engine; - - produces(); } @@ -69,15 +63,16 @@ BaseEvtVtxGenerator::~BaseEvtVtxGenerator() void BaseEvtVtxGenerator::produce( Event& evt, const EventSetup& ) { - - + edm::Service rng; + CLHEP::HepRandomEngine* engine = &rng->getEngine(evt.streamID()); + Handle HepMCEvt ; evt.getByLabel( sourceLabel, HepMCEvt ) ; // generate new vertex & apply the shift // - HepMCEvt->applyVtxGen( newVertex() ) ; + HepMCEvt->applyVtxGen( newVertex(engine) ) ; //HepMCEvt->LorentzBoost( 0., 142.e-6 ); HepMCEvt->boostToLab( GetInvLorentzBoost(), "vertex" ); @@ -90,8 +85,3 @@ void BaseEvtVtxGenerator::produce( Event& evt, const EventSetup& ) return ; } - -CLHEP::HepRandomEngine& BaseEvtVtxGenerator::getEngine() -{ - return *fEngine; -} diff --git a/IOMC/EventVertexGenerators/src/BeamProfileVtxGenerator.cc b/IOMC/EventVertexGenerators/src/BeamProfileVtxGenerator.cc index aa95e662e7bff..7affe53fdcbd1 100644 --- a/IOMC/EventVertexGenerators/src/BeamProfileVtxGenerator.cc +++ b/IOMC/EventVertexGenerators/src/BeamProfileVtxGenerator.cc @@ -17,7 +17,7 @@ #include BeamProfileVtxGenerator::BeamProfileVtxGenerator(const edm::ParameterSet & p) : - BaseEvtVtxGenerator(p), fRandom(0) { + BaseEvtVtxGenerator(p) { meanX(p.getParameter("BeamMeanX")*cm); meanY(p.getParameter("BeamMeanY")*cm); @@ -82,15 +82,14 @@ BeamProfileVtxGenerator::BeamProfileVtxGenerator(const edm::ParameterSet & p) : } BeamProfileVtxGenerator::~BeamProfileVtxGenerator() { - delete fRandom; } //Hep3Vector * BeamProfileVtxGenerator::newVertex() { -HepMC::FourVector* BeamProfileVtxGenerator::newVertex() { +HepMC::FourVector* BeamProfileVtxGenerator::newVertex(CLHEP::HepRandomEngine* engine) { double aX, aY; if (ffile) { - double r1 = (dynamic_cast(fRandom))->fire(); + double r1 = engine->flat(); int ixy = 0, ix, iy; for (unsigned int i=0; i fdistn[i]) ixy = i+1; @@ -100,15 +99,15 @@ HepMC::FourVector* BeamProfileVtxGenerator::newVertex() { } else { ix = ixy%nBinx; iy = (ixy-ix)/nBinx; } - aX = 0.5*(2*ix-nBinx+2*(dynamic_cast(fRandom))->fire())*fSigmaX + fMeanX ; - aY = 0.5*(2*iy-nBiny+2*(dynamic_cast(fRandom))->fire())*fSigmaY + fMeanY ; + aX = 0.5*(2*ix-nBinx+2*engine->flat())*fSigmaX + fMeanX ; + aY = 0.5*(2*iy-nBiny+2*engine->flat())*fSigmaY + fMeanY ; } else { if (fType) { - aX = fSigmaX*(dynamic_cast(fRandom))->fire() +fMeanX; - aY = fSigmaY*(dynamic_cast(fRandom))->fire() +fMeanY; + aX = fSigmaX*CLHEP::RandGaussQ::shoot(engine) + fMeanX; + aY = fSigmaY*CLHEP::RandGaussQ::shoot(engine) + fMeanY; } else { - aX = (dynamic_cast(fRandom))->fire(-0.5*fSigmaX,0.5*fSigmaX) + fMeanX ; - aY = (dynamic_cast(fRandom))->fire(-0.5*fSigmaY,0.5*fSigmaY) + fMeanY; + aX = CLHEP::RandFlat::shoot(engine, -0.5*fSigmaX, 0.5*fSigmaX) + fMeanX ; + aY = CLHEP::RandFlat::shoot(engine, -0.5*fSigmaY, 0.5*fSigmaY) + fMeanY; } } @@ -199,12 +198,5 @@ void BeamProfileVtxGenerator::eta(double s) { } void BeamProfileVtxGenerator::setType(bool s) { - fType = s; - delete fRandom; - - if (fType == true) - fRandom = new CLHEP::RandGaussQ(getEngine()); - else - fRandom = new CLHEP::RandFlat(getEngine()); } diff --git a/IOMC/EventVertexGenerators/src/BetafuncEvtVtxGenerator.cc b/IOMC/EventVertexGenerators/src/BetafuncEvtVtxGenerator.cc index 25667d406f72a..3bece775991fb 100644 --- a/IOMC/EventVertexGenerators/src/BetafuncEvtVtxGenerator.cc +++ b/IOMC/EventVertexGenerators/src/BetafuncEvtVtxGenerator.cc @@ -40,9 +40,6 @@ ________________________________________________________________________ BetafuncEvtVtxGenerator::BetafuncEvtVtxGenerator(const edm::ParameterSet & p ) : BaseEvtVtxGenerator(p) { - - fRandom = new CLHEP::RandGaussQ(getEngine()); - readDB_=p.getParameter("readDB"); if (!readDB_){ fX0 = p.getParameter("X0")*cm; @@ -67,7 +64,6 @@ BetafuncEvtVtxGenerator::BetafuncEvtVtxGenerator(const edm::ParameterSet & p ) BetafuncEvtVtxGenerator::~BetafuncEvtVtxGenerator() { - delete fRandom; } void BetafuncEvtVtxGenerator::beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const& iEventSetup){ @@ -100,25 +96,25 @@ void BetafuncEvtVtxGenerator::update(const edm::EventSetup& iEventSetup){ } //Hep3Vector* BetafuncEvtVtxGenerator::newVertex() { -HepMC::FourVector* BetafuncEvtVtxGenerator::newVertex() { +HepMC::FourVector* BetafuncEvtVtxGenerator::newVertex(CLHEP::HepRandomEngine* engine) { double X,Y,Z; - double tmp_sigz = fRandom->fire(0., fSigmaZ); + double tmp_sigz = CLHEP::RandGaussQ::shoot(engine, 0., fSigmaZ); Z = tmp_sigz + fZ0; double tmp_sigx = BetaFunction(Z,fZ0); // need sqrt(2) for beamspot width relative to single beam width tmp_sigx /= sqrt(2.0); - X = fRandom->fire(0.,tmp_sigx) + fX0; // + Z*fdxdz ; + X = CLHEP::RandGaussQ::shoot(engine, 0., tmp_sigx) + fX0; // + Z*fdxdz ; double tmp_sigy = BetaFunction(Z,fZ0); // need sqrt(2) for beamspot width relative to single beam width tmp_sigy /= sqrt(2.0); - Y = fRandom->fire(0.,tmp_sigy) + fY0; // + Z*fdydz; + Y = CLHEP::RandGaussQ::shoot(engine, 0., tmp_sigy) + fY0; // + Z*fdydz; - double tmp_sigt = fRandom->fire(0., fSigmaZ); + double tmp_sigt = CLHEP::RandGaussQ::shoot(engine, 0., fSigmaZ); double T = tmp_sigt + fTimeOffset; if ( fVertex == 0 ) fVertex = new HepMC::FourVector(); diff --git a/IOMC/EventVertexGenerators/src/FlatEvtVtxGenerator.cc b/IOMC/EventVertexGenerators/src/FlatEvtVtxGenerator.cc index 1a2afd593bc58..1f8f44883d52e 100644 --- a/IOMC/EventVertexGenerators/src/FlatEvtVtxGenerator.cc +++ b/IOMC/EventVertexGenerators/src/FlatEvtVtxGenerator.cc @@ -13,10 +13,7 @@ FlatEvtVtxGenerator::FlatEvtVtxGenerator(const edm::ParameterSet& p ) : BaseEvtVtxGenerator(p) -{ - - fRandom = new CLHEP::RandFlat(getEngine()) ; - +{ fMinX = p.getParameter("MinX")*cm; fMinY = p.getParameter("MinY")*cm; fMinZ = p.getParameter("MinZ")*cm; @@ -42,18 +39,16 @@ FlatEvtVtxGenerator::FlatEvtVtxGenerator(const edm::ParameterSet& p ) } } -FlatEvtVtxGenerator::~FlatEvtVtxGenerator() +FlatEvtVtxGenerator::~FlatEvtVtxGenerator() { - delete fRandom; } - //Hep3Vector * FlatEvtVtxGenerator::newVertex() { -HepMC::FourVector* FlatEvtVtxGenerator::newVertex() { +HepMC::FourVector* FlatEvtVtxGenerator::newVertex(CLHEP::HepRandomEngine* engine) { double aX,aY,aZ; - aX = fRandom->fire(fMinX,fMaxX) ; - aY = fRandom->fire(fMinY,fMaxY) ; - aZ = fRandom->fire(fMinZ,fMaxZ) ; + aX = CLHEP::RandFlat::shoot(engine, fMinX, fMaxX); + aY = CLHEP::RandFlat::shoot(engine, fMinY, fMaxY); + aZ = CLHEP::RandFlat::shoot(engine, fMinZ, fMaxZ); //if (fVertex == 0) fVertex = new CLHEP::Hep3Vector; //fVertex->set(aX,aY,aZ); diff --git a/IOMC/EventVertexGenerators/src/GaussEvtVtxGenerator.cc b/IOMC/EventVertexGenerators/src/GaussEvtVtxGenerator.cc index e98be726970f7..0389b4b58a4c5 100644 --- a/IOMC/EventVertexGenerators/src/GaussEvtVtxGenerator.cc +++ b/IOMC/EventVertexGenerators/src/GaussEvtVtxGenerator.cc @@ -14,9 +14,6 @@ GaussEvtVtxGenerator::GaussEvtVtxGenerator(const edm::ParameterSet & p ) : BaseEvtVtxGenerator(p) { - - fRandom = new CLHEP::RandGaussQ(getEngine()); - fMeanX = p.getParameter("MeanX")*cm; fMeanY = p.getParameter("MeanY")*cm; fMeanZ = p.getParameter("MeanZ")*cm; @@ -44,16 +41,15 @@ GaussEvtVtxGenerator::GaussEvtVtxGenerator(const edm::ParameterSet & p ) GaussEvtVtxGenerator::~GaussEvtVtxGenerator() { - delete fRandom; } //Hep3Vector* GaussEvtVtxGenerator::newVertex() { -HepMC::FourVector* GaussEvtVtxGenerator::newVertex() { +HepMC::FourVector* GaussEvtVtxGenerator::newVertex(CLHEP::HepRandomEngine* engine) { double X,Y,Z; - X = fSigmaX * fRandom->fire() + fMeanX ; - Y = fSigmaY * fRandom->fire() + fMeanY ; - Z = fSigmaZ * fRandom->fire() + fMeanZ ; + X = CLHEP::RandGaussQ::shoot(engine, fMeanX, fSigmaX); + Y = CLHEP::RandGaussQ::shoot(engine, fMeanY, fSigmaY); + Z = CLHEP::RandGaussQ::shoot(engine, fMeanZ, fSigmaZ); //if (fVertex == 0) fVertex = new CLHEP::Hep3Vector; if ( fVertex == 0 ) fVertex = new HepMC::FourVector() ; diff --git a/IOMC/EventVertexGenerators/src/GaussianZBeamSpotFilter.cc b/IOMC/EventVertexGenerators/src/GaussianZBeamSpotFilter.cc index d3d294902cbd2..954d06506ad76 100644 --- a/IOMC/EventVertexGenerators/src/GaussianZBeamSpotFilter.cc +++ b/IOMC/EventVertexGenerators/src/GaussianZBeamSpotFilter.cc @@ -4,12 +4,13 @@ #include "FWCore/ServiceRegistry/interface/Service.h" #include "FWCore/Utilities/interface/RandomNumberGenerator.h" +#include "FWCore/Utilities/interface/Exception.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" #include "HepMC/GenRanges.h" #include "CLHEP/Units/GlobalSystemOfUnits.h" -#include "CLHEP/Random/RandFlat.h" +#include "CLHEP/Random/RandomEngine.h" GaussianZBeamSpotFilter::GaussianZBeamSpotFilter(const edm::ParameterSet& iPSet): src_(iPSet.getParameter("src")), @@ -17,21 +18,15 @@ GaussianZBeamSpotFilter::GaussianZBeamSpotFilter(const edm::ParameterSet& iPSet) baseZ0_(iPSet.getParameter("baseZ0")*cm), newSZ_(iPSet.getParameter("newSZ")*cm), newZ0_(iPSet.getParameter("newZ0")*cm) -{ - +{ edm::Service rng; - if ( ! rng.isAvailable()) { - throw cms::Exception("Configuration") << "The GaussianZBeamSpotFilter requires the RandomNumberGeneratorService\n" "which is not present in the configuration file. You must add the service\n" "in the configuration file or remove the modules that require it."; } - CLHEP::HepRandomEngine& engine = rng->getEngine(); - fRandom = new CLHEP::RandFlat(engine); - if ( baseZ0_ != newZ0_ ) { edm::LogError("InconsistentZPosition") << "Z0 : old " << baseZ0_ << " and new " << newZ0_ << " are different"; } @@ -49,6 +44,9 @@ bool GaussianZBeamSpotFilter::filter(edm::Event& iEvent,const edm::EventSetup& i bool pass = true; + edm::Service rng; + CLHEP::HepRandomEngine& engine = rng->getEngine(iEvent.streamID()); + edm::Handle HepMCEvt ; iEvent.getByLabel( src_, HepMCEvt ) ; @@ -61,7 +59,7 @@ bool GaussianZBeamSpotFilter::filter(edm::Event& iEvent,const edm::EventSetup& i double vtxZ = (*vitr)->point3d().z(); double gaussRatio = std::exp(-(vtxZ-newZ0_)*(vtxZ-newZ0_)/(2.0*newSZ_*newSZ_)+(vtxZ-baseZ0_)*(vtxZ-baseZ0_)/(2.0*baseSZ_*baseSZ_)); - if ( fRandom->fire() > gaussRatio ) { pass = false; } + if ( engine.flat() > gaussRatio ) { pass = false; } // std::cout << "base sigmaZ = " << baseSZ_ << " new sigmaZ = " << newSZ_ << " vtxZ = " << vtxZ << " gaussian ratio = " << gaussRatio << " pass = " << pass << std::endl; } diff --git a/IOMC/ParticleGuns/interface/FlatBaseThetaGunProducer.h b/IOMC/ParticleGuns/interface/FlatBaseThetaGunProducer.h index c6439f3b0c2b5..be90187b93f8d 100644 --- a/IOMC/ParticleGuns/interface/FlatBaseThetaGunProducer.h +++ b/IOMC/ParticleGuns/interface/FlatBaseThetaGunProducer.h @@ -14,9 +14,6 @@ #include "FWCore/Framework/interface/EventSetup.h" #include "FWCore/Framework/interface/Run.h" -#include "CLHEP/Random/JamesRandom.h" -#include "CLHEP/Random/RandFlat.h" - #include #include "boost/shared_ptr.hpp" @@ -57,9 +54,6 @@ class FlatBaseThetaGunProducer : public one::EDProducer 0) LogDebug("FlatThetaGun") << "FileRandomKEThetaGunProducer : Begin New Event Generation"; + edm::Service rng; + CLHEP::HepRandomEngine* engine = &rng->getEngine(e.streamID()); + // event loop (well, another step in it...) // no need to clean up GenEvent memory - done in HepMCProduct @@ -85,7 +93,7 @@ void FileRandomKEThetaGunProducer::produce(edm::Event & e, const edm::EventSetup for (int ip=0; ipfire(); + double r1 = engine->flat(); for (unsigned int ii=kineticE.size()-2; ii>0; --ii) { if (r1 > fdistn[ii]) { keMin = kineticE[ii]; keMax = kineticE[ii+1]; @@ -97,8 +105,8 @@ void FileRandomKEThetaGunProducer::produce(edm::Event & e, const edm::EventSetup LogDebug("FlatThetaGun") << "FileRandomKEThetaGunProducer: KE " << ke << " in range " << keMin << ":" << keMax << " with " << r1 <<" in " << rMin <<":" <fire(fMinTheta, fMaxTheta); - double phi = fRandomGenerator->fire(fMinPhi, fMaxPhi); + double theta = CLHEP::RandFlat::shoot(engine, fMinTheta, fMaxTheta); + double phi = CLHEP::RandFlat::shoot(engine, fMinPhi, fMaxPhi); int PartID = fPartIDs[0]; const HepPDT::ParticleData* PData = fPDGTable->particle(HepPDT::ParticleID(abs(PartID))) ; diff --git a/IOMC/ParticleGuns/src/FlatBaseThetaGunProducer.cc b/IOMC/ParticleGuns/src/FlatBaseThetaGunProducer.cc index 2f383f5f63441..84f516ebe5126 100644 --- a/IOMC/ParticleGuns/src/FlatBaseThetaGunProducer.cc +++ b/IOMC/ParticleGuns/src/FlatBaseThetaGunProducer.cc @@ -17,27 +17,8 @@ using namespace edm; -namespace { - - CLHEP::HepRandomEngine& getEngineReference() { - - edm::Service rng; - if(!rng.isAvailable()) { - throw cms::Exception("Configuration") - << "The RandomNumberProducer module requires the RandomNumberGeneratorService\n" - "which appears to be absent. Please add that service to your configuration\n" - "or remove the modules that require it."; - } - - // The Service has already instantiated an engine. Make contact with it. - return (rng->getEngine()); - } -} - FlatBaseThetaGunProducer::FlatBaseThetaGunProducer(const edm::ParameterSet& pset) : - fEvt(0), - fRandomEngine(getEngineReference()), - fRandomGenerator(0) { + fEvt(0) { edm::ParameterSet pgun_params = pset.getParameter("PGunParameters") ; @@ -48,15 +29,21 @@ FlatBaseThetaGunProducer::FlatBaseThetaGunProducer(const edm::ParameterSet& pset fMaxPhi = pgun_params.getParameter("MaxPhi"); fVerbosity = pset.getUntrackedParameter( "Verbosity",0 ) ; - // The Service has already instantiated an engine. Use it. - fRandomGenerator = new CLHEP::RandFlat(fRandomEngine) ; - fAddAntiParticle = pset.getParameter("AddAntiParticle") ; + fAddAntiParticle = pset.getParameter("AddAntiParticle") ; + + edm::Service rng; + if(!rng.isAvailable()) { + throw cms::Exception("Configuration") + << "The module inheriting from FlatBaseThetaGunProducer requires the\n" + "RandomNumberGeneratorService, which appears to be absent. Please\n" + "add that service to your configuration or remove the modules that" + "require it."; + } - produces(); + produces(); } FlatBaseThetaGunProducer::~FlatBaseThetaGunProducer() { -// if ( fRandomGenerator != NULL ) delete fRandomGenerator; } diff --git a/IOMC/ParticleGuns/src/FlatRandomEThetaGunProducer.cc b/IOMC/ParticleGuns/src/FlatRandomEThetaGunProducer.cc index 6e6cb72bfe661..9cf989a2e79c6 100644 --- a/IOMC/ParticleGuns/src/FlatRandomEThetaGunProducer.cc +++ b/IOMC/ParticleGuns/src/FlatRandomEThetaGunProducer.cc @@ -8,6 +8,14 @@ #include "FWCore/Framework/interface/Event.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/Utilities/interface/RandomNumberGenerator.h" + +#include "CLHEP/Random/RandFlat.h" + +namespace CLHEP { + class HepRandomEngine; +} using namespace edm; @@ -38,7 +46,10 @@ void FlatRandomEThetaGunProducer::produce(edm::Event & e, const edm::EventSetup& if ( fVerbosity > 0 ) { LogDebug("FlatThetaGun") << "FlatRandomEThetaGunProducer : Begin New Event Generation"; } - + + edm::Service rng; + CLHEP::HepRandomEngine* engine = &rng->getEngine(e.streamID()); + // event loop (well, another step in it...) // no need to clean up GenEvent memory - done in HepMCProduct @@ -58,9 +69,9 @@ void FlatRandomEThetaGunProducer::produce(edm::Event & e, const edm::EventSetup& // int barcode = 1; for (unsigned int ip=0; ipfire(fMinE, fMaxE) ; - double theta = fRandomGenerator->fire(fMinTheta, fMaxTheta) ; - double phi = fRandomGenerator->fire(fMinPhi, fMaxPhi) ; + double energy = CLHEP::RandFlat::shoot(engine, fMinE, fMaxE); + double theta = CLHEP::RandFlat::shoot(engine, fMinTheta, fMaxTheta); + double phi = CLHEP::RandFlat::shoot(engine, fMinPhi, fMaxPhi); int PartID = fPartIDs[ip] ; const HepPDT::ParticleData* PData = fPDGTable->particle(HepPDT::ParticleID(abs(PartID))) ; diff --git a/IOMC/ParticleGuns/src/FlatRandomPtThetaGunProducer.cc b/IOMC/ParticleGuns/src/FlatRandomPtThetaGunProducer.cc index 69995c2dd7129..6c98b0b104995 100644 --- a/IOMC/ParticleGuns/src/FlatRandomPtThetaGunProducer.cc +++ b/IOMC/ParticleGuns/src/FlatRandomPtThetaGunProducer.cc @@ -8,6 +8,14 @@ #include "FWCore/Framework/interface/Event.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/Utilities/interface/RandomNumberGenerator.h" + +#include "CLHEP/Random/RandFlat.h" + +namespace CLHEP { + class HepRandomEngine; +} using namespace edm; @@ -36,6 +44,9 @@ void FlatRandomPtThetaGunProducer::produce(edm::Event &e, const EventSetup& es) LogDebug("FlatThetaGun") << "FlatRandomPtThetaGunProducer : Begin New Event Generation"; } + edm::Service rng; + CLHEP::HepRandomEngine* engine = &rng->getEngine(e.streamID()); + // event loop (well, another step in it...) // no need to clean up GenEvent memory - done in HepMCProduct @@ -56,9 +67,9 @@ void FlatRandomPtThetaGunProducer::produce(edm::Event &e, const EventSetup& es) int barcode = 1 ; for (unsigned int ip=0; ipfire(fMinPt, fMaxPt) ; - double theta = fRandomGenerator->fire(fMinTheta, fMaxTheta) ; - double phi = fRandomGenerator->fire(fMinPhi, fMaxPhi) ; + double pt = CLHEP::RandFlat::shoot(engine, fMinPt, fMaxPt); + double theta = CLHEP::RandFlat::shoot(engine, fMinTheta, fMaxTheta); + double phi = CLHEP::RandFlat::shoot(engine, fMinPhi, fMaxPhi); int PartID = fPartIDs[ip] ; const HepPDT::ParticleData* PData = fPDGTable->particle(HepPDT::ParticleID(abs(PartID))) ;