41 #include "CLHEP/Random/engineIDulong.h" 42 #include "CLHEP/Random/JamesRandom.h" 43 #include "CLHEP/Random/RanecuEngine.h" 63 saveFileName_(pset.getUntrackedParameter<
std::
string>(
"saveFileName")),
64 saveFileNameRecorded_(
false),
65 restoreFileName_(pset.getUntrackedParameter<
std::
string>(
"restoreFileName")),
66 enableChecking_(pset.getUntrackedParameter<
bool>(
"enableChecking")),
67 eventSeedOffset_(pset.getUntrackedParameter<unsigned>(
"eventSeedOffset")),
68 verbose_(pset.getUntrackedParameter<
bool>(
"verbose")) {
70 if(pset.
exists(
"restoreStateTag")) {
82 <<
"In the configuration for the RandomNumberGeneratorService both\n" 83 <<
"restoreFileName and restoreStateLabel were set to nonempty values\n" 84 <<
"which is illegal. It is impossible to restore the random engine\n" 85 <<
"states two different ways in the same process.\n";
92 <<
"The saveFileName parameter must be a simple file name with no path\n" 93 <<
"specification. In the configuration, it was given the value \"" 102 for(
auto const&
label : pSets) {
107 bool initialSeedExists = modulePSet.
exists(
"initialSeed");
108 bool initialSeedSetExists = modulePSet.
exists(
"initialSeedSet");
110 if(initialSeedExists && initialSeedSetExists) {
112 <<
"For the module with the label \"" <<
label <<
"\",\n" 113 <<
"both the parameters \"initialSeed\" and \"initialSeedSet\"\n" 114 <<
"have been set in the configuration. You must set one or\n" 115 <<
"the other. It is illegal to set both.\n";
116 }
else if(!initialSeedExists && !initialSeedSetExists) {
118 <<
"For the module with the label \"" <<
label <<
"\",\n" 119 <<
"neither the parameter \"initialSeed\" nor \"initialSeedSet\"\n" 120 <<
"has been set in the configuration. You must set one or\n" 122 }
else if(initialSeedExists) {
124 initialSeedSet.clear();
125 initialSeedSet.push_back(initialSeed);
126 }
else if(initialSeedSetExists) {
133 if(initialSeedSet.size() != 2
U) {
135 <<
"Random engines of type \"RanecuEngine\" require 2 seeds\n" 136 <<
"be specified with the parameter named \"initialSeedSet\".\n" 137 <<
"Either \"initialSeedSet\" was not in the configuration\n" 138 <<
"or its size was not 2 for the module with label \"" <<
label <<
"\".\n" ;
143 <<
"The RanecuEngine seeds should be in the range 0 to 2147483647.\n" 144 <<
"The seeds passed to the RandomNumberGenerationService from the\n" 145 "configuration file were " << initialSeedSet[0] <<
" and " << initialSeedSet[1]
146 <<
"\nThis was for the module with label \"" <<
label <<
"\".\n";
151 if(initialSeedSet.size() != 1
U) {
153 <<
"Random engines of type \"HepJamesRandom\" and \"TRandom3\n" 154 <<
"require exactly 1 seed be specified in the configuration.\n" 155 <<
"There were " << initialSeedSet.size() <<
" seeds set for the\n" 156 <<
"module with label \"" <<
label <<
"\".\n" ;
158 if(engineName ==
"HepJamesRandom") {
161 <<
"The CLHEP::HepJamesRandom engine seed should be in the range 0 to 900000000.\n" 162 <<
"The seed passed to the RandomNumberGenerationService from the\n" 163 "configuration file was " << initialSeedSet[0] <<
". This was for \n" 164 <<
"the module with label " <<
label <<
".\n";
166 }
else if(engineName !=
"TRandom3") {
168 <<
"The random engine name, \"" << engineName
169 <<
"\", does not correspond to a supported engine.\n" 170 <<
"This engine was configured for the module with label \"" <<
label <<
"\"";
210 CLHEP::HepRandomEngine&
216 <<
"RandomNumberGeneratorService::getEngine\n" 217 "Requested a random number engine from the RandomNumberGeneratorService\n" 218 "when no module was active. ModuleCallingContext is null\n";
224 std::vector<ModuleIDToEngine>::iterator iter = std::lower_bound(moduleIDVector.begin(),
225 moduleIDVector.end(),
227 if(iter == moduleIDVector.end() || iter->moduleID() != moduleID) {
229 <<
"The module with label \"" 231 <<
"\" requested a random number engine from the \n" 232 "RandomNumberGeneratorService, but that module was not configured\n" 233 "for random numbers. An engine is created only if a seed(s) is provided\n" 234 "in the configuration file. Please add the following PSet to the\n" 235 "configuration file for the RandomNumberGeneratorService:\n\n" 237 " initialSeed = cms.untracked.uint32(your_seed),\n" 238 " engineName = cms.untracked.string('TRandom3')\n" 240 "where you replace \"your_seed\" with a number and add a comma if necessary\n" 241 "The \"engineName\" parameter is optional. If absent the default is \"HepJamesRandom\".\n";
244 return *iter->labelAndEngine()->engine();
247 CLHEP::HepRandomEngine&
253 <<
"RandomNumberGeneratorService::getEngine\n" 254 "Requested a random number engine from the RandomNumberGeneratorService\n" 255 "when no module was active. ModuleCallingContext is null\n";
261 std::vector<ModuleIDToEngine>::iterator iter = std::lower_bound(moduleIDVector.begin(),
262 moduleIDVector.end(),
264 if(iter == moduleIDVector.end() || iter->moduleID() != moduleID) {
266 <<
"The module with label \"" 268 <<
"\" requested a random number engine from the \n" 269 "RandomNumberGeneratorService, but that module was not configured\n" 270 "for random numbers. An engine is created only if a seed(s) is provided\n" 271 "in the configuration file. Please add the following PSet to the\n" 272 "configuration file for the RandomNumberGeneratorService:\n\n" 274 " initialSeed = cms.untracked.uint32(your_seed),\n" 275 " engineName = cms.untracked.string('TRandom3')\n" 277 "where you replace \"your_seed\" with a number and add a comma if necessary\n" 278 "The \"engineName\" parameter is optional. If absent the default is \"HepJamesRandom\".\n";
281 return *iter->labelAndEngine()->engine();
296 <<
"RandomNumberGeneratorService::getEngine()\n" 297 "Requested a random number engine from the RandomNumberGeneratorService\n" 298 "from an unallowed transition. ModuleCallingContext is null\n";
303 std::map<std::string, SeedsAndName>::const_iterator iter =
seedsAndNameMap_.find(label);
306 <<
"The module with label \"" 308 <<
"\" requested a random number seed from the \n" 309 "RandomNumberGeneratorService, but that module was not configured\n" 310 "for random numbers. An engine is created only if a seed(s) is provided\n" 311 "in the configuration file. Please add the following PSet to the\n" 312 "configuration file for the RandomNumberGeneratorService:\n\n" 313 " " << label <<
" = cms.PSet(\n" 314 " initialSeed = cms.untracked.uint32(your_seed),\n" 315 " engineName = cms.untracked.string('TRandom3')\n" 317 "where you replace \"your_seed\" with a number and add a comma if necessary\n" 318 "The \"engineName\" parameter is optional. If absent the default is \"HepJamesRandom\".\n";
320 return iter->second.seeds()[0];
340 val.addOptionalUntracked<std::uint32_t>(
"initialSeed");
341 val.addOptionalUntracked<std::vector<std::uint32_t> >(
"initialSeedSet");
342 val.addOptionalUntracked<
std::string>(
"engineName");
345 wnode.setComment(
"The name of each ParameterSet will be the associated module label.");
348 descriptions.
add(
"RandomNumberGeneratorService", desc);
355 iter->second.setModuleID(description.
id());
366 <<
"Configuration is illegal. The RandomNumberGeneratorService is configured\n" 367 <<
"to run replay using a text file to input the random engine states and\n" 368 <<
"the number of streams is greater than 1. Either set the\n" 369 <<
"parameter named \"restoreFileName\" in the RandomNumberGeneratorService\n" 370 <<
"to the empty string or set the parameter \"numberOfStreams\" in the top\n" 371 <<
"level options parameter set to 1. (Probably these are the default values\n" 372 <<
"and just not setting the parameters will also work)\n";
384 for(
unsigned int iStream = 0; iStream <
nStreams_; ++iStream) {
385 unsigned int seedOffset = iStream;
388 outFiles_[iStream] = std::make_shared<std::ofstream>();
391 for(
unsigned int iLumi = 0; iLumi < nConcurrentLumis; ++iLumi) {
444 bool expected =
false;
448 reportSvc->reportRandomStateFile(fullName);
513 std::vector<RandomEngineState>
const&
518 std::vector<RandomEngineState>
const&
526 os <<
"\n\nRandomNumberGeneratorService dump\n\n";
528 os <<
" Contents of seedsAndNameMap (label moduleID engineType seeds)\n";
530 os <<
" " <<
entry.first
531 <<
" " <<
entry.second.moduleID()
532 <<
" " <<
entry.second.engineName();
533 for(
auto val :
entry.second.seeds()) {
538 os <<
" nStreams_ = " <<
nStreams_ <<
"\n";
544 os <<
" verbose_ = " <<
verbose_ <<
"\n";
548 os <<
"\n streamEngines_\n";
549 unsigned int iStream = 0;
551 os <<
" Stream " << iStream <<
"\n";
552 for(
auto const&
i :
k) {
553 os <<
" " <<
i.label();
554 for(
auto const& j :
i.seeds()) {
557 os <<
" " <<
i.engine()->name();
558 if(
i.engine()->name() ==
std::string(
"HepJamesRandom")) {
559 os <<
" " <<
i.engine()->getSeed();
561 os <<
" engine does not know seeds";
567 os <<
"\n lumiEngines_\n";
568 unsigned int iLumi = 0;
570 os <<
" lumiIndex " << iLumi <<
"\n";
571 for(
auto const&
i :
k) {
572 os <<
" " <<
i.label();
573 for(
auto const& j :
i.seeds()) {
576 os <<
" " <<
i.engine()->name();
577 if(
i.engine()->name() ==
std::string(
"HepJamesRandom")) {
578 os <<
" " <<
i.engine()->getSeed();
580 os <<
" engine does not know seeds";
594 std::vector<ModuleIDToEngine>::iterator iter = std::lower_bound(moduleIDVector.begin(),
595 moduleIDVector.end(),
597 if(iter != moduleIDVector.end() && iter->moduleID() == moduleID) {
599 iter->setEngineState(labelAndEngine->
engine()->put());
610 std::vector<ModuleIDToEngine>::iterator iter = std::lower_bound(moduleIDVector.begin(),
611 moduleIDVector.end(),
613 if(iter != moduleIDVector.end() && iter->moduleID() == moduleID) {
615 if(iter->engineState() != labelAndEngine->
engine()->put()) {
617 <<
"It is illegal to generate random numbers during beginStream, endStream,\n" 618 "beginRun, endRun, beginLumi, endLumi because that makes it very difficult\n" 619 "to replay the processing of individual events. Random numbers were\n" 620 "generated during one of these methods for the module with class name\n\"" 635 <<
"In the configuration for the RandomNumberGeneratorService the\n" 636 <<
"restoreStateTag contains the current process which is illegal.\n" 637 <<
"The process name in the replay process should have been changed\n" 638 <<
"to be different than the original process name and the restoreStateTag\n" 639 <<
"should contain either the original process name or an empty process name.\n";
648 <<
"The RandomNumberGeneratorService is trying to restore\n" 649 <<
"the state of the random engines by reading a product from\n" 651 <<
"It could not find the product.\n" 652 <<
"Either the product in the LuminosityBlock was dropped or\n" 653 <<
"not produced or the configured input tag is incorrect or there is a bug somewhere\n";
668 <<
"The RandomNumberGeneratorService is trying to restore\n" 669 <<
"the state of the random engines by reading a product from\n" 671 <<
"It could not find the product.\n" 672 <<
"Either the product in the Event was dropped or\n" 673 <<
"not produced or the configured input tag is incorrect or there is a bug somewhere\n";
681 cache.resize(engines.size());
682 std::vector<RandomEngineState>::iterator state = cache.begin();
684 for(std::vector<LabelAndEngine>::const_iterator iter = engines.begin();
685 iter != engines.end();
689 state->setLabel(label);
690 state->setSeed(iter->seeds());
692 std::vector<unsigned long> stateL = iter->engine()->put();
693 state->clearStateVector();
694 state->reserveStateVector(stateL.size());
695 for(
auto element : stateL) {
696 state->push_back_stateVector(static_cast<std::uint32_t>(element));
703 std::vector<LabelAndEngine>& engines) {
704 std::vector<LabelAndEngine>::iterator labelAndEngine = engines.begin();
705 for(
auto const& cachedState : cache) {
707 std::string const& engineLabel = cachedState.getLabel();
709 std::vector<std::uint32_t>
const& engineState = cachedState.getState();
710 std::vector<unsigned long> engineStateL;
711 engineStateL.reserve(engineState.size());
712 for(
auto const&
value : engineState) {
713 engineStateL.push_back(static_cast<unsigned long>(
value));
716 std::vector<std::uint32_t>
const& engineSeeds = cachedState.getSeed();
717 std::vector<long> engineSeedsL;
718 engineSeedsL.reserve(engineSeeds.size());
719 for(
auto const&
val : engineSeeds) {
720 long seedL =
static_cast<long>(
val);
721 engineSeedsL.push_back(seedL);
730 std::uint32_t seedu32 =
static_cast<std::uint32_t
>(seedL);
731 assert(
val == seedu32);
734 assert(labelAndEngine != engines.end() && engineLabel == labelAndEngine->label());
735 std::shared_ptr<CLHEP::HepRandomEngine>
const& engine = labelAndEngine->engine();
739 if(engineStateL[0] == CLHEP::engineIDulong<CLHEP::HepJamesRandom>()) {
744 engine->setSeed(engineSeedsL[0], 0);
745 engine->get(engineStateL);
747 labelAndEngine->setSeed(engineSeeds[0], 0);
748 }
else if(engineStateL[0] == CLHEP::engineIDulong<CLHEP::RanecuEngine>()) {
753 engine->get(engineStateL);
755 labelAndEngine->setSeed(engineSeeds[0], 0);
756 labelAndEngine->setSeed(engineSeeds[1], 1);
757 }
else if(engineStateL[0] == CLHEP::engineIDulong<TRandomAdaptor>()) {
762 engine->setSeed(engineSeedsL[0], 0);
763 engine->get(engineStateL);
765 labelAndEngine->setSeed(engineSeeds[0], 0);
770 <<
"The RandomNumberGeneratorService is trying to restore the state\n" 771 "of the random engines. The state in the event indicates an engine\n" 772 "of an unknown type. This should not be possible unless you are\n" 773 "running with an old code release on a new file that was created\n" 774 "with a newer release which had new engine types added. In this case\n" 775 "the only solution is to use a newer release. In any other case, notify\n" 776 "the EDM developers because this should not be possible\n";
786 if(typeFromConfig != typeFromEvent) {
788 <<
"The RandomNumberGeneratorService is trying to restore\n" 789 <<
"the state of the random engine for the module \"" 790 << engineLabel <<
"\". An\n" 791 <<
"error was detected because the type of the engine in the\n" 792 <<
"input file and the configuration file do not match.\n" 793 <<
"In the configuration file the type is \"" << typeFromConfig
794 <<
"\".\nIn the input file the type is \"" << typeFromEvent <<
"\". If\n" 795 <<
"you are not generating any random numbers in this module, then\n" 796 <<
"remove the line in the configuration file that gives it\n" 797 <<
"a seed and the error will go away. Otherwise, you must give\n" 798 <<
"this module the same engine type in the configuration file or\n" 799 <<
"stop trying to restore the random engine state.\n";
810 if(!outFile.is_open()) {
811 std::stringstream
file;
814 file <<
"_" << streamID.
value();
821 <<
"Unable to open the file \"" 822 << file.str() <<
"\" to save the state of the random engines.\n";
826 outFile.seekp(0, std::ios_base::beg);
827 outFile <<
"<RandomEngineStates>\n";
829 outFile <<
"<Event>\n";
831 outFile <<
"</Event>\n";
833 outFile <<
"<Lumi>\n";
835 outFile <<
"</Lumi>\n";
837 outFile <<
"</RandomEngineStates>\n";
844 for(std::vector<RandomEngineState>::const_iterator iter = v.begin(),
846 iter != iEnd; ++iter) {
848 std::vector<std::uint32_t>
const& seedVector = iter->getSeed();
851 std::vector<std::uint32_t>
const& stateVector = iter->getState();
854 outFile <<
"<ModuleLabel>\n" << iter->getLabel() <<
"\n</ModuleLabel>\n";
856 outFile <<
"<SeedLength>\n" << seedVectorLength <<
"\n</SeedLength>\n" ;
857 outFile <<
"<InitialSeeds>\n";
859 outFile <<
"</InitialSeeds>\n";
860 outFile <<
"<FullStateLength>\n" << stateVectorLength <<
"\n</FullStateLength>\n";
861 outFile <<
"<FullState>\n";
863 outFile <<
"</FullState>\n";
870 if(v.empty())
return;
871 size_t numItems = v.size();
872 for(
size_t i = 0;
i < numItems; ++
i) {
873 if(
i != 0 &&
i % 10 == 0) outFile <<
"\n";
874 outFile << std::setw(13) << v[
i];
881 std::string fullName(getcwd(directory,
sizeof(directory)) ? directory :
"/PathIsTooBig");
888 std::vector<RandomEngineState>&
cache) {
895 std::vector<RandomEngineState>&
cache) {
903 std::vector<RandomEngineState>&
cache,
905 std::ifstream inFile;
909 <<
"Unable to open the file \"" 910 << fileName <<
"\" to restore the random engine states.\n";
915 if(!inFile.good() || text !=
std::string(
"<RandomEngineStates>")) {
917 <<
"Attempting to read file with random number engine states.\n" 919 <<
"\" is ill-structured or otherwise corrupted.\n" 920 <<
"Cannot read the file header word.\n";
922 bool saveToCache =
false;
927 std::vector<RandomEngineState>&
cache,
934 std::vector<std::uint32_t> seedVector;
936 std::vector<std::uint32_t> stateVector;
946 <<
"\" is ill-structured or otherwise corrupted.\n" 947 <<
"Cannot read next field and did not hit the end yet.\n";
951 if(leading ==
std::string(
"</RandomEngineStates>"))
return false;
963 saveToCache = (leading == whichStates);
969 is >> moduleLabel >> trailing;
975 <<
"\" is ill-structured or otherwise corrupted.\n" 976 <<
"Cannot read a module label when restoring random engine states.\n";
979 is >> leading >> seedVectorSize >> trailing;
985 <<
"\" is ill-structured or otherwise corrupted.\n" 986 <<
"Cannot read seed vector length when restoring random engine states.\n";
994 <<
"\" is ill-structured or otherwise corrupted.\n" 995 <<
"Cannot read beginning of InitialSeeds when restoring random engine states.\n";
1001 <<
"\" is ill-structured or otherwise corrupted.\n" 1002 <<
"The number of seeds exceeds 64K.\n";
1012 <<
"\" is ill-structured or otherwise corrupted.\n" 1013 <<
"Cannot read end of InitialSeeds when restoring random engine states.\n";
1016 is >> leading >> stateVectorSize >> trailing;
1022 <<
"\" is ill-structured or otherwise corrupted.\n" 1023 <<
"Cannot read state vector length when restoring random engine states.\n";
1031 <<
"\" is ill-structured or otherwise corrupted.\n" 1032 <<
"Cannot read beginning of FullState when restoring random engine states.\n";
1038 <<
"\" is ill-structured or otherwise corrupted.\n" 1039 <<
"The number of states exceeds 64K.\n";
1042 readVector(is, stateVectorSize, stateVector);
1049 <<
"\" is ill-structured or otherwise corrupted.\n" 1050 <<
"Cannot read end of FullState when restoring random engine states.\n";
1055 randomEngineState.
setLabel(moduleLabel);
1056 std::vector<RandomEngineState>::iterator state =
1057 std::lower_bound(cache.begin(), cache.end(), randomEngineState);
1059 if(state != cache.end() && moduleLabel == state->getLabel()) {
1060 if(seedVector.size() != state->getSeed().size() ||
1061 stateVector.size() != state->getState().size()) {
1064 <<
"\" is ill-structured or otherwise corrupted.\n" 1065 <<
"Vectors containing engine state are the incorrect size for the type of random engine.\n";
1067 state->setSeed(seedVector);
1068 state->setState(stateVector);
1077 v.reserve(numItems);
1079 for(
unsigned i = 0;
i < numItems; ++
i) {
1084 <<
"\" is ill-structured or otherwise corrupted.\n" 1085 <<
"Cannot read vector when restoring random engine states.\n";
1093 unsigned int seedOffset,
1094 unsigned int eventSeedOffset,
1095 std::vector<ModuleIDToEngine>& moduleIDVector) {
1102 unsigned int moduleID =
i.second.moduleID();
1106 VUint32 const& seeds =
i.second.seeds();
1108 if(name ==
"RanecuEngine") {
1109 std::shared_ptr<CLHEP::HepRandomEngine> engine = std::make_shared<CLHEP::RanecuEngine>();
1110 engines.emplace_back(label, seeds, engine);
1115 long int seedL =
static_cast<long int>(seeds[0]);
1117 if(name ==
"HepJamesRandom") {
1118 std::shared_ptr<CLHEP::HepRandomEngine> engine = std::make_shared<CLHEP::HepJamesRandom>(seedL);
1119 engines.emplace_back(label, seeds, engine);
1120 if(seedOffset != 0 || eventSeedOffset != 0) {
1132 std::uint32_t seedu32 =
static_cast<std::uint32_t
>(seedL);
1133 assert(seeds[0] == seedu32);
1135 std::shared_ptr<CLHEP::HepRandomEngine> engine = std::make_shared<TRandomAdaptor>(seedL);
1136 engines.emplace_back(label, seeds, engine);
1137 if(seedOffset != 0 || eventSeedOffset != 0) {
1142 moduleIDVector.emplace_back(&engines.back(), moduleID);
1145 std::sort(moduleIDVector.begin(), moduleIDVector.end());
1152 std::uint32_t offset1,
1153 std::uint32_t offset2) {
1155 if(engineName ==
"RanecuEngine") {
1156 assert(seeds.size() == 2
U);
1161 std::uint32_t seed0 = (seeds[0] + offset1) % mod;
1162 seed0 = (seed0 + offset2) % mod;
1163 labelAndEngine.
setSeed(seed0, 0);
1164 labelAndEngine.
setSeed(seeds[1], 1);
1166 seedL[0] =
static_cast<long int>(seed0);
1167 seedL[1] =
static_cast<long int>(seeds[1]);
1168 labelAndEngine.
engine()->setSeeds(seedL,0);
1170 assert(seeds.size() == 1
U);
1172 if(engineName ==
"HepJamesRandom") {
1177 std::uint32_t seed0 = (seeds[0] + offset1) % mod;
1178 seed0 = (seed0 + offset2) % mod;
1179 labelAndEngine.
setSeed(seed0, 0);
1181 long int seedL =
static_cast<long int>(seed0);
1182 labelAndEngine.
engine()->setSeed(seedL, 0);
1184 assert(engineName ==
"TRandom3");
1189 std::uint32_t seed0 = seeds[0];
1190 if((max32 - seed0) >= offset1) {
1193 seed0 = offset1 - (max32 - seed0) - 1
U;
1195 if((max32 - seed0) >= offset2) {
1198 seed0 = offset2 - (max32 - seed0) - 1
U;
1200 labelAndEngine.
setSeed(seed0, 0);
1202 long seedL =
static_cast<long>(seed0);
1211 std::uint32_t seedu32 =
static_cast<std::uint32_t
>(seedL);
1212 assert(seed0 == seedu32);
1214 labelAndEngine.
engine()->setSeed(seedL, 0);
void writeStates(std::vector< RandomEngineState > const &v, std::ofstream &outFile)
T getUntrackedParameter(std::string const &, T const &) const
void preModuleStreamEndLumi(StreamContext const &sc, ModuleCallingContext const &mcc)
void readVector(std::istream &is, unsigned numItems, std::vector< std::uint32_t > &v)
void watchPreallocate(Preallocate::slot_type const &iSlot)
CLHEP::HepRandomEngine & getEngine(StreamID const &streamID) override
Use this engine in event methods.
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
static const std::uint32_t maxSeedRanecu
LuminosityBlockIndex index() const
void watchPostModuleEndStream(PostModuleEndStream::slot_type const &iSlot)
void readFromEvent(Event const &event)
std::uint32_t mySeed() const override
void watchPreModuleConstruction(PreModuleConstruction::slot_type const &iSlot)
std::atomic< bool > saveFileNameRecorded_
std::string constructSaveFileName() const
void setLabel(const std::string &value)
bool exists(std::string const ¶meterName) const
checks if a parameter exists
static ModuleCallingContext const * getCurrentModuleOnThread()
std::string const & moduleName() const
std::shared_ptr< CLHEP::HepRandomEngine const > engine() const
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
void preModuleEndStream(StreamContext const &sc, ModuleCallingContext const &mcc)
void watchPostModuleStreamEndLumi(PostModuleStreamEndLumi::slot_type const &iSlot)
void watchPostModuleStreamBeginRun(PostModuleStreamBeginRun::slot_type const &iSlot)
void preModuleConstruction(ModuleDescription const &description)
void postModuleStreamEndRun(StreamContext const &sc, ModuleCallingContext const &mcc)
void postModuleStreamCheck(StreamContext const &sc, ModuleCallingContext const &mcc)
void watchPreModuleBeginStream(PreModuleBeginStream::slot_type const &iSlot)
void resetEngineSeeds(LabelAndEngine &labelAndEngine, std::string const &engineName, VUint32 const &seeds, std::uint32_t offset1, std::uint32_t offset2)
bool getByLabel(std::string const &label, Handle< PROD > &result) const
void readFromLuminosityBlock(LuminosityBlock const &lumi)
std::string const & moduleLabel() const
void preModuleBeginStream(StreamContext const &sc, ModuleCallingContext const &mcc)
edm::InputTag restoreStateTag_
void postModuleStreamBeginRun(StreamContext const &sc, ModuleCallingContext const &mcc)
void setSeed(std::uint32_t v, unsigned int index)
void snapShot(std::vector< LabelAndEngine > const &engines, std::vector< RandomEngineState > &cache)
std::string saveFileName_
void postModuleEndStream(StreamContext const &sc, ModuleCallingContext const &mcc)
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
unsigned int maxNumberOfStreams() const
std::vector< std::vector< ModuleIDToEngine > > streamModuleIDToEngine_
void saveStatesToFile(std::string const &fileName, StreamID const &streamID, LuminosityBlockIndex const &lumiIndex)
RandomNumberGeneratorService(ParameterSet const &pset, ActivityRegistry &activityRegistry)
void preModuleStreamBeginLumi(StreamContext const &sc, ModuleCallingContext const &mcc)
std::vector< edm::propagate_const< std::shared_ptr< std::ofstream > > > outFiles_
~RandomNumberGeneratorService() override
void consumes(ConsumesCollector &&iC) const override
void createEnginesInVector(std::vector< LabelAndEngine > &engines, unsigned int seedOffset, unsigned int eventSeedOffset, std::vector< ModuleIDToEngine > &moduleIDVector)
bool readEngineState(std::istream &is, std::vector< RandomEngineState > &cache, std::string const &whichStates, bool &saveToCache)
void preModuleStreamBeginRun(StreamContext const &sc, ModuleCallingContext const &mcc)
ModuleDescription const * moduleDescription() const
static const std::uint32_t maxSeedTRandom3
std::vector< std::vector< LabelAndEngine > > streamEngines_
std::uint32_t eventSeedOffset_
std::vector< std::vector< RandomEngineState > > eventCache_
unsigned int value() const
void readStatesFromFile(std::string const &fileName, std::vector< RandomEngineState > &cache, std::string const &whichStates)
static void fillDescriptions(ConfigurationDescriptions &descriptions)
void readEventStatesFromTextFile(std::string const &fileName, std::vector< RandomEngineState > &cache)
std::vector< std::vector< RandomEngineState > > lumiCache_
std::vector< RandomEngineState > const & getLumiCache(LuminosityBlockIndex const &) const override
These two are used by the RandomEngineStateProducer.
static const std::vector< std::uint32_t >::size_type maxStates
void watchPostModuleStreamEndRun(PostModuleStreamEndRun::slot_type const &iSlot)
StreamID const & streamID() const
void preModuleStreamEndRun(StreamContext const &sc, ModuleCallingContext const &mcc)
void watchPreModuleStreamBeginLumi(PreModuleStreamBeginLumi::slot_type const &iSlot)
void preallocate(SystemBounds const &)
void watchPostModuleBeginStream(PostModuleBeginStream::slot_type const &iSlot)
std::vector< std::uint32_t > VUint32
unsigned int value() const
unsigned int maxNumberOfConcurrentLuminosityBlocks() const
void watchPostModuleStreamBeginLumi(PostModuleStreamBeginLumi::slot_type const &iSlot)
ParameterSet const & getParameterSet(std::string const &) const
void watchPreModuleStreamEndLumi(PreModuleStreamEndLumi::slot_type const &iSlot)
void checkEngineType(std::string const &typeFromConfig, std::string const &typeFromEvent, std::string const &engineLabel) const
void watchPreModuleStreamBeginRun(PreModuleStreamBeginRun::slot_type const &iSlot)
edm::InputTag restoreStateBeginLumiTag_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void watchPreModuleEndStream(PreModuleEndStream::slot_type const &iSlot)
void postModuleStreamEndLumi(StreamContext const &sc, ModuleCallingContext const &mcc)
static std::string const emptyString("")
char data[epos_bytes_allocation]
void postEventRead(Event const &event) override
void watchPreModuleStreamEndRun(PreModuleStreamEndRun::slot_type const &iSlot)
void writeVector(VUint32 const &v, std::ofstream &outFile)
std::string restoreFileName_
static const std::vector< std::uint32_t >::size_type maxSeeds
StreamID streamID() const
void readLumiStatesFromTextFile(std::string const &fileName, std::vector< RandomEngineState > &cache)
std::vector< RandomEngineState > const & getEventCache(StreamID const &) const override
void restoreFromCache(std::vector< RandomEngineState > const &cache, std::vector< LabelAndEngine > &engines)
std::vector< std::vector< LabelAndEngine > > lumiEngines_
void postModuleBeginStream(StreamContext const &sc, ModuleCallingContext const &mcc)
void print(std::ostream &os) const override
For debugging.
T mod(const T &a, const T &b)
std::map< std::string, SeedsAndName > seedsAndNameMap_
std::vector< std::vector< ModuleIDToEngine > > lumiModuleIDToEngine_
void preModuleStreamCheck(StreamContext const &sc, ModuleCallingContext const &mcc)
static const std::uint32_t maxSeedHepJames
void preBeginLumi(LuminosityBlock const &lumi) override
void postModuleStreamBeginLumi(StreamContext const &sc, ModuleCallingContext const &mcc)