41 #include "CLHEP/Random/engineIDulong.h" 42 #include "CLHEP/Random/JamesRandom.h" 43 #include "CLHEP/Random/RanecuEngine.h" 44 #include "CLHEP/Random/MixMaxRng.h" 64 saveFileName_(pset.getUntrackedParameter<
std::
string>(
"saveFileName")),
65 saveFileNameRecorded_(
false),
66 restoreFileName_(pset.getUntrackedParameter<
std::
string>(
"restoreFileName")),
67 enableChecking_(pset.getUntrackedParameter<
bool>(
"enableChecking")),
68 eventSeedOffset_(pset.getUntrackedParameter<unsigned>(
"eventSeedOffset")),
69 verbose_(pset.getUntrackedParameter<
bool>(
"verbose")) {
70 if (pset.
exists(
"restoreStateTag")) {
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 \"" <<
saveFileName_ <<
"\"\n";
101 for (
auto const&
label : pSets) {
105 bool initialSeedExists = modulePSet.
exists(
"initialSeed");
106 bool initialSeedSetExists = modulePSet.
exists(
"initialSeedSet");
108 if (initialSeedExists && initialSeedSetExists) {
110 <<
"both the parameters \"initialSeed\" and \"initialSeedSet\"\n" 111 <<
"have been set in the configuration. You must set one or\n" 112 <<
"the other. It is illegal to set both.\n";
113 }
else if (!initialSeedExists && !initialSeedSetExists) {
115 <<
"neither the parameter \"initialSeed\" nor \"initialSeedSet\"\n" 116 <<
"has been set in the configuration. You must set one or\n" 118 }
else if (initialSeedExists) {
120 initialSeedSet.clear();
121 initialSeedSet.push_back(initialSeed);
122 }
else if (initialSeedSetExists) {
129 if (initialSeedSet.size() != 2
U) {
131 <<
"Random engines of type \"RanecuEngine\" require 2 seeds\n" 132 <<
"be specified with the parameter named \"initialSeedSet\".\n" 133 <<
"Either \"initialSeedSet\" was not in the configuration\n" 134 <<
"or its size was not 2 for the module with label \"" <<
label <<
"\".\n";
139 <<
"The RanecuEngine seeds should be in the range 0 to " <<
maxSeedRanecu <<
".\n" 140 <<
"The seeds passed to the RandomNumberGenerationService from the\n" 141 "configuration file were " 142 << initialSeedSet[0] <<
" and " << initialSeedSet[1] <<
"\nThis was for the module with label \"" 148 if (initialSeedSet.size() != 1
U) {
150 <<
"Random engines of type \"HepJamesRandom\", \"TRandom3\" and \"MixMaxRng\" \n" 151 <<
"require exactly 1 seed be specified in the configuration.\n" 152 <<
"There were " << initialSeedSet.size() <<
" seeds set for the\n" 153 <<
"module with label \"" <<
label <<
"\".\n";
155 if (engineName ==
"HepJamesRandom") {
158 <<
"The CLHEP::HepJamesRandom engine seed should be in the range 0 to " <<
maxSeedHepJames <<
".\n" 159 <<
"The seed passed to the RandomNumberGenerationService from the\n" 160 "configuration file was " 161 << initialSeedSet[0] <<
". This was for \n" 162 <<
"the module with label " <<
label <<
".\n";
164 }
else if (engineName ==
"MixMaxRng") {
167 <<
"The CLHEP::MixMaxRng engine seed should be in the range 0 to " <<
maxSeedTRandom3 <<
".\n" 168 <<
"The seed passed to the RandomNumberGenerationService from the\n" 169 "configuration file was " 170 << initialSeedSet[0] <<
". This was for \n" 171 <<
"the module with label " <<
label <<
".\n";
173 }
else if (engineName ==
"TRandom3") {
176 <<
"The CLHEP::MixMaxRng engine seed should be in the range 0 to " <<
maxSeedTRandom3 <<
".\n" 177 <<
"The seed passed to the RandomNumberGenerationService from the\n" 178 "configuration file was " 179 << initialSeedSet[0] <<
". This was for \n" 180 <<
"the module with label " <<
label <<
".\n";
184 <<
"The random engine name, \"" << engineName <<
"\", does not correspond to a supported engine.\n" 185 <<
"This engine was configured for the module with label \"" <<
label <<
"\"";
223 if (mcc ==
nullptr) {
225 <<
"RandomNumberGeneratorService::getEngine\n" 226 "Requested a random number engine from the RandomNumberGeneratorService\n" 227 "when no module was active. ModuleCallingContext is null\n";
233 std::vector<ModuleIDToEngine>::iterator iter =
234 std::lower_bound(moduleIDVector.begin(), moduleIDVector.end(),
target);
235 if (iter == moduleIDVector.end() || iter->moduleID() != moduleID) {
238 <<
"\" requested a random number engine from the \n" 239 "RandomNumberGeneratorService, but that module was not configured\n" 240 "for random numbers. An engine is created only if a seed(s) is provided\n" 241 "in the configuration file. Please add the following PSet to the\n" 242 "configuration file for the RandomNumberGeneratorService:\n\n" 246 " initialSeed = cms.untracked.uint32(your_seed),\n" 247 " engineName = cms.untracked.string('TRandom3')\n" 249 "where you replace \"your_seed\" with a number and add a comma if necessary\n" 250 "The \"engineName\" parameter is optional. If absent the default is \"HepJamesRandom\".\n";
252 return *iter->labelAndEngine()->engine();
257 if (mcc ==
nullptr) {
259 <<
"RandomNumberGeneratorService::getEngine\n" 260 "Requested a random number engine from the RandomNumberGeneratorService\n" 261 "when no module was active. ModuleCallingContext is null\n";
267 std::vector<ModuleIDToEngine>::iterator iter =
268 std::lower_bound(moduleIDVector.begin(), moduleIDVector.end(),
target);
269 if (iter == moduleIDVector.end() || iter->moduleID() != moduleID) {
272 <<
"\" requested a random number engine from the \n" 273 "RandomNumberGeneratorService, but that module was not configured\n" 274 "for random numbers. An engine is created only if a seed(s) is provided\n" 275 "in the configuration file. Please add the following PSet to the\n" 276 "configuration file for the RandomNumberGeneratorService:\n\n" 280 " initialSeed = cms.untracked.uint32(your_seed),\n" 281 " engineName = cms.untracked.string('TRandom3')\n" 283 "where you replace \"your_seed\" with a number and add a comma if necessary\n" 284 "The \"engineName\" parameter is optional. If absent the default is \"HepJamesRandom\".\n";
286 return *iter->labelAndEngine()->engine();
298 if (mcc ==
nullptr) {
300 <<
"RandomNumberGeneratorService::getEngine()\n" 301 "Requested a random number engine from the RandomNumberGeneratorService\n" 302 "from an unallowed transition. ModuleCallingContext is null\n";
307 std::map<std::string, SeedsAndName>::const_iterator iter =
seedsAndNameMap_.find(label);
310 <<
"The module with label \"" << label
311 <<
"\" requested a random number seed from the \n" 312 "RandomNumberGeneratorService, but that module was not configured\n" 313 "for random numbers. An engine is created only if a seed(s) is provided\n" 314 "in the configuration file. Please add the following PSet to the\n" 315 "configuration file for the RandomNumberGeneratorService:\n\n" 319 " initialSeed = cms.untracked.uint32(your_seed),\n" 320 " engineName = cms.untracked.string('TRandom3')\n" 322 "where you replace \"your_seed\" with a number and add a comma if necessary\n" 323 "The \"engineName\" parameter is optional. If absent the default is \"HepJamesRandom\".\n";
325 return iter->second.seeds()[0];
344 val.addOptionalUntracked<std::uint32_t>(
"initialSeed");
345 val.addOptionalUntracked<std::vector<std::uint32_t> >(
"initialSeedSet");
346 val.addOptionalUntracked<
std::string>(
"engineName");
349 wnode.setComment(
"The name of each ParameterSet will be the associated module label.");
352 descriptions.
add(
"RandomNumberGeneratorService", desc);
358 iter->second.setModuleID(description.
id());
367 <<
"Configuration is illegal. The RandomNumberGeneratorService is configured\n" 368 <<
"to run replay using a text file to input the random engine states and\n" 369 <<
"the number of streams is greater than 1. Either set the\n" 370 <<
"parameter named \"restoreFileName\" in the RandomNumberGeneratorService\n" 371 <<
"to the empty string or set the parameter \"numberOfStreams\" in the top\n" 372 <<
"level options parameter set to 1. (Probably these are the default values\n" 373 <<
"and just not setting the parameters will also work)\n";
385 for (
unsigned int iStream = 0; iStream <
nStreams_; ++iStream) {
386 unsigned int seedOffset = iStream;
389 outFiles_[iStream] = std::make_shared<std::ofstream>();
392 for (
unsigned int iLumi = 0; iLumi < nConcurrentLumis; ++iLumi) {
440 bool expected =
false;
444 reportSvc->reportRandomStateFile(fullName);
514 os <<
"\n\nRandomNumberGeneratorService dump\n\n";
516 os <<
" Contents of seedsAndNameMap (label moduleID engineType seeds)\n";
518 os <<
" " <<
entry.first <<
" " <<
entry.second.moduleID() <<
" " <<
entry.second.engineName();
519 for (
auto val :
entry.second.seeds()) {
524 os <<
" nStreams_ = " <<
nStreams_ <<
"\n";
530 os <<
" verbose_ = " <<
verbose_ <<
"\n";
534 os <<
"\n streamEngines_\n";
535 unsigned int iStream = 0;
537 os <<
" Stream " << iStream <<
"\n";
538 for (
auto const&
i :
k) {
539 os <<
" " <<
i.label();
540 for (
auto const&
j :
i.seeds()) {
543 os <<
" " <<
i.engine()->name();
544 if (
i.engine()->name() ==
std::string(
"HepJamesRandom")) {
545 os <<
" " <<
i.engine()->getSeed();
546 }
else if (
i.engine()->name() ==
std::string(
"MixMaxRng")) {
547 os <<
" " <<
i.engine()->getSeed();
549 os <<
" engine does not know seeds";
555 os <<
"\n lumiEngines_\n";
556 unsigned int iLumi = 0;
558 os <<
" lumiIndex " << iLumi <<
"\n";
559 for (
auto const&
i :
k) {
560 os <<
" " <<
i.label();
561 for (
auto const&
j :
i.seeds()) {
564 os <<
" " <<
i.engine()->name();
565 if (
i.engine()->name() ==
std::string(
"HepJamesRandom")) {
566 os <<
" " <<
i.engine()->getSeed();
567 }
else if (
i.engine()->name() ==
std::string(
"MixMaxRng")) {
568 os <<
" " <<
i.engine()->getSeed();
570 os <<
" engine does not know seeds";
583 std::vector<ModuleIDToEngine>::iterator iter =
584 std::lower_bound(moduleIDVector.begin(), moduleIDVector.end(),
target);
585 if (iter != moduleIDVector.end() && iter->moduleID() == moduleID) {
587 iter->setEngineState(labelAndEngine->
engine()->put());
597 std::vector<ModuleIDToEngine>::iterator iter =
598 std::lower_bound(moduleIDVector.begin(), moduleIDVector.end(),
target);
599 if (iter != moduleIDVector.end() && iter->moduleID() == moduleID) {
601 if (iter->engineState() != labelAndEngine->
engine()->put()) {
603 <<
"It is illegal to generate random numbers during beginStream, endStream,\n" 604 "beginRun, endRun, beginLumi, endLumi because that makes it very difficult\n" 605 "to replay the processing of individual events. Random numbers were\n" 606 "generated during one of these methods for the module with class name\n\"" 609 "and module label \"" 621 <<
"In the configuration for the RandomNumberGeneratorService the\n" 622 <<
"restoreStateTag contains the current process which is illegal.\n" 623 <<
"The process name in the replay process should have been changed\n" 624 <<
"to be different than the original process name and the restoreStateTag\n" 625 <<
"should contain either the original process name or an empty process name.\n";
634 <<
"The RandomNumberGeneratorService is trying to restore\n" 635 <<
"the state of the random engines by reading a product from\n" 637 <<
"It could not find the product.\n" 638 <<
"Either the product in the LuminosityBlock was dropped or\n" 639 <<
"not produced or the configured input tag is incorrect or there is a bug somewhere\n";
652 <<
"The RandomNumberGeneratorService is trying to restore\n" 653 <<
"the state of the random engines by reading a product from\n" 655 <<
"It could not find the product.\n" 656 <<
"Either the product in the Event was dropped or\n" 657 <<
"not produced or the configured input tag is incorrect or there is a bug somewhere\n";
664 std::vector<RandomEngineState>&
cache) {
665 cache.resize(engines.size());
666 std::vector<RandomEngineState>::iterator state = cache.begin();
668 for (std::vector<LabelAndEngine>::const_iterator iter = engines.begin(); iter != engines.end(); ++iter, ++state) {
670 state->setLabel(label);
671 state->setSeed(iter->seeds());
673 std::vector<unsigned long> stateL = iter->engine()->put();
674 state->clearStateVector();
675 state->reserveStateVector(stateL.size());
676 for (
auto element : stateL) {
677 state->push_back_stateVector(static_cast<std::uint32_t>(element));
683 std::vector<LabelAndEngine>& engines) {
684 std::vector<LabelAndEngine>::iterator labelAndEngine = engines.begin();
685 for (
auto const& cachedState : cache) {
686 std::string const& engineLabel = cachedState.getLabel();
688 std::vector<std::uint32_t>
const& engineState = cachedState.getState();
689 std::vector<unsigned long> engineStateL;
690 engineStateL.reserve(engineState.size());
691 for (
auto const&
value : engineState) {
692 engineStateL.push_back(static_cast<unsigned long>(
value));
695 std::vector<std::uint32_t>
const& engineSeeds = cachedState.getSeed();
696 std::vector<long> engineSeedsL;
697 engineSeedsL.reserve(engineSeeds.size());
698 for (
auto const&
val : engineSeeds) {
699 long seedL =
static_cast<long>(
val);
700 engineSeedsL.push_back(seedL);
709 std::uint32_t seedu32 =
static_cast<std::uint32_t
>(seedL);
710 assert(
val == seedu32);
713 assert(labelAndEngine != engines.end() && engineLabel == labelAndEngine->label());
714 std::shared_ptr<CLHEP::HepRandomEngine>
const& engine = labelAndEngine->engine();
718 if (engineStateL[0] == CLHEP::engineIDulong<CLHEP::HepJamesRandom>()) {
722 engine->setSeed(engineSeedsL[0], 0);
723 engine->get(engineStateL);
725 labelAndEngine->setSeed(engineSeeds[0], 0);
726 }
else if (engineStateL[0] == CLHEP::engineIDulong<CLHEP::RanecuEngine>()) {
730 engine->get(engineStateL);
732 labelAndEngine->setSeed(engineSeeds[0], 0);
733 labelAndEngine->setSeed(engineSeeds[1], 1);
734 }
else if (engineStateL[0] == CLHEP::engineIDulong<CLHEP::MixMaxRng>()) {
738 engine->setSeed(engineSeedsL[0], 0);
739 engine->get(engineStateL);
741 labelAndEngine->setSeed(engineSeeds[0], 0);
742 }
else if (engineStateL[0] == CLHEP::engineIDulong<TRandomAdaptor>()) {
746 engine->setSeed(engineSeedsL[0], 0);
747 engine->get(engineStateL);
749 labelAndEngine->setSeed(engineSeeds[0], 0);
754 <<
"The RandomNumberGeneratorService is trying to restore the state\n" 755 "of the random engines. The state in the event indicates an engine\n" 756 "of an unknown type. This should not be possible unless you are\n" 757 "running with an old code release on a new file that was created\n" 758 "with a newer release which had new engine types added. In this case\n" 759 "the only solution is to use a newer release. In any other case, notify\n" 760 "the EDM developers because this should not be possible\n";
769 if (typeFromConfig != typeFromEvent) {
771 <<
"The RandomNumberGeneratorService is trying to restore\n" 772 <<
"the state of the random engine for the module \"" << engineLabel <<
"\". An\n" 773 <<
"error was detected because the type of the engine in the\n" 774 <<
"input file and the configuration file do not match.\n" 775 <<
"In the configuration file the type is \"" << typeFromConfig <<
"\".\nIn the input file the type is \"" 776 << typeFromEvent <<
"\". If\n" 777 <<
"you are not generating any random numbers in this module, then\n" 778 <<
"remove the line in the configuration file that gives it\n" 779 <<
"a seed and the error will go away. Otherwise, you must give\n" 780 <<
"this module the same engine type in the configuration file or\n" 781 <<
"stop trying to restore the random engine state.\n";
790 if (!outFile.is_open()) {
791 std::stringstream
file;
794 file <<
"_" << streamID.
value();
801 <<
"Unable to open the file \"" << file.str() <<
"\" to save the state of the random engines.\n";
805 outFile.seekp(0, std::ios_base::beg);
806 outFile <<
"<RandomEngineStates>\n";
808 outFile <<
"<Event>\n";
810 outFile <<
"</Event>\n";
812 outFile <<
"<Lumi>\n";
814 outFile <<
"</Lumi>\n";
816 outFile <<
"</RandomEngineStates>\n";
821 for (
auto& state : v) {
822 std::vector<std::uint32_t>
const& seedVector = state.getSeed();
825 std::vector<std::uint32_t>
const& stateVector = state.getState();
828 outFile <<
"<ModuleLabel>\n" << state.getLabel() <<
"\n</ModuleLabel>\n";
830 outFile <<
"<SeedLength>\n" << seedVectorLength <<
"\n</SeedLength>\n";
831 outFile <<
"<InitialSeeds>\n";
833 outFile <<
"</InitialSeeds>\n";
834 outFile <<
"<FullStateLength>\n" << stateVectorLength <<
"\n</FullStateLength>\n";
835 outFile <<
"<FullState>\n";
837 outFile <<
"</FullState>\n";
844 size_t numItems = v.size();
845 for (
size_t i = 0;
i < numItems; ++
i) {
846 if (
i != 0 &&
i % 10 == 0)
848 outFile << std::setw(13) << v[
i];
861 std::vector<RandomEngineState>&
cache) {
867 std::vector<RandomEngineState>&
cache) {
873 std::vector<RandomEngineState>&
cache,
875 std::ifstream inFile;
879 <<
"Unable to open the file \"" << fileName <<
"\" to restore the random engine states.\n";
884 if (!inFile.good() || text !=
std::string(
"<RandomEngineStates>")) {
886 <<
"Attempting to read file with random number engine states.\n" 887 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 888 <<
"Cannot read the file header word.\n";
890 bool saveToCache =
false;
896 std::vector<RandomEngineState>&
cache,
903 std::vector<std::uint32_t> seedVector;
905 std::vector<std::uint32_t> stateVector;
914 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 915 <<
"Cannot read next field and did not hit the end yet.\n";
919 if (leading ==
std::string(
"</RandomEngineStates>"))
930 saveToCache = (leading == whichStates);
936 is >> moduleLabel >> trailing;
939 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 940 <<
"Cannot read a module label when restoring random engine states.\n";
943 is >> leading >> seedVectorSize >> trailing;
946 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 947 <<
"Cannot read seed vector length when restoring random engine states.\n";
951 if (!is.good() || leading !=
std::string(
"<InitialSeeds>")) {
953 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 954 <<
"Cannot read beginning of InitialSeeds when restoring random engine states.\n";
959 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 960 <<
"The number of seeds exceeds 64K.\n";
966 if (!is.good() || trailing !=
std::string(
"</InitialSeeds>")) {
968 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 969 <<
"Cannot read end of InitialSeeds when restoring random engine states.\n";
972 is >> leading >> stateVectorSize >> trailing;
973 if (!is.good() || leading !=
std::string(
"<FullStateLength>") || trailing !=
std::string(
"</FullStateLength>")) {
975 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 976 <<
"Cannot read state vector length when restoring random engine states.\n";
980 if (!is.good() || leading !=
std::string(
"<FullState>")) {
982 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 983 <<
"Cannot read beginning of FullState when restoring random engine states.\n";
988 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 989 <<
"The number of states exceeds 64K.\n";
995 if (!is.good() || trailing !=
std::string(
"</FullState>")) {
997 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 998 <<
"Cannot read end of FullState when restoring random engine states.\n";
1003 randomEngineState.
setLabel(moduleLabel);
1004 std::vector<RandomEngineState>::iterator state =
1005 std::lower_bound(cache.begin(), cache.end(), randomEngineState);
1007 if (state != cache.end() && moduleLabel == state->getLabel()) {
1008 if (seedVector.size() != state->getSeed().size() || stateVector.size() != state->getState().size()) {
1010 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 1011 <<
"Vectors containing engine state are the incorrect size for the type of random engine.\n";
1013 state->setSeed(seedVector);
1014 state->setState(stateVector);
1022 v.reserve(numItems);
1024 for (
unsigned i = 0;
i < numItems; ++
i) {
1028 <<
"File \"" <<
restoreFileName_ <<
"\" is ill-structured or otherwise corrupted.\n" 1029 <<
"Cannot read vector when restoring random engine states.\n";
1036 unsigned int seedOffset,
1037 unsigned int eventSeedOffset,
1038 std::vector<ModuleIDToEngine>& moduleIDVector) {
1045 unsigned int moduleID =
i.second.moduleID();
1049 VUint32 const& seeds =
i.second.seeds();
1051 if (name ==
"RanecuEngine") {
1052 std::shared_ptr<CLHEP::HepRandomEngine> engine = std::make_shared<CLHEP::RanecuEngine>();
1053 engines.emplace_back(label, seeds, engine);
1058 long int seedL =
static_cast<long int>(seeds[0]);
1060 if (name ==
"HepJamesRandom") {
1061 std::shared_ptr<CLHEP::HepRandomEngine> engine = std::make_shared<CLHEP::HepJamesRandom>(seedL);
1062 engines.emplace_back(label, seeds, engine);
1063 if (seedOffset != 0 || eventSeedOffset != 0) {
1066 }
else if (name ==
"MixMaxRng") {
1067 std::shared_ptr<CLHEP::HepRandomEngine> engine = std::make_shared<CLHEP::MixMaxRng>(seedL);
1068 engines.emplace_back(label, seeds, engine);
1069 if (seedOffset != 0 || eventSeedOffset != 0) {
1081 std::uint32_t seedu32 =
static_cast<std::uint32_t
>(seedL);
1082 assert(seeds[0] == seedu32);
1084 std::shared_ptr<CLHEP::HepRandomEngine> engine = std::make_shared<TRandomAdaptor>(seedL);
1085 engines.emplace_back(label, seeds, engine);
1086 if (seedOffset != 0 || eventSeedOffset != 0) {
1091 moduleIDVector.emplace_back(&engines.back(), moduleID);
1094 std::sort(moduleIDVector.begin(), moduleIDVector.end());
1100 std::uint32_t offset1,
1101 std::uint32_t offset2) {
1102 if (engineName ==
"RanecuEngine") {
1103 assert(seeds.size() == 2
U);
1108 std::uint32_t seed0 = (seeds[0] + offset1) % mod;
1109 seed0 = (seed0 + offset2) % mod;
1110 labelAndEngine.
setSeed(seed0, 0);
1111 labelAndEngine.
setSeed(seeds[1], 1);
1113 seedL[0] =
static_cast<long int>(seed0);
1114 seedL[1] =
static_cast<long int>(seeds[1]);
1115 labelAndEngine.
engine()->setSeeds(seedL, 0);
1117 assert(seeds.size() == 1
U);
1119 if (engineName ==
"HepJamesRandom" || engineName ==
"MixMaxRng") {
1124 std::uint32_t seed0 = (seeds[0] + offset1) % mod;
1125 seed0 = (seed0 + offset2) % mod;
1126 labelAndEngine.
setSeed(seed0, 0);
1128 long int seedL =
static_cast<long int>(seed0);
1129 labelAndEngine.
engine()->setSeed(seedL, 0);
1131 assert(engineName ==
"TRandom3");
1136 std::uint32_t seed0 = seeds[0];
1137 if ((max32 - seed0) >= offset1) {
1140 seed0 = offset1 - (max32 - seed0) - 1
U;
1142 if ((max32 - seed0) >= offset2) {
1145 seed0 = offset2 - (max32 - seed0) - 1
U;
1147 labelAndEngine.
setSeed(seed0, 0);
1149 long seedL =
static_cast<long>(seed0);
1158 std::uint32_t seedu32 =
static_cast<std::uint32_t
>(seedL);
1159 assert(seed0 == seedu32);
1161 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)