40 #include "CLHEP/Random/engineIDulong.h"
41 #include "CLHEP/Random/JamesRandom.h"
42 #include "CLHEP/Random/RanecuEngine.h"
62 saveFileName_(pset.getUntrackedParameter<std::
string>(
"saveFileName")),
63 saveFileNameRecorded_(
false),
64 restoreFileName_(pset.getUntrackedParameter<std::
string>(
"restoreFileName")),
65 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 \""
97 std::uint32_t initialSeed;
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() != 2U) {
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() != 1U) {
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 <<
"\"";
206 CLHEP::HepRandomEngine&
212 <<
"RandomNumberGeneratorService::getEngine\n"
213 "Requested a random number engine from the RandomNumberGeneratorService\n"
214 "when no module was active. ModuleCallingContext is null\n";
220 std::vector<ModuleIDToEngine>::iterator iter = std::lower_bound(moduleIDVector.begin(),
221 moduleIDVector.end(),
223 if(iter == moduleIDVector.end() || iter->moduleID() != moduleID) {
225 <<
"The module with label \""
227 <<
"\" requested a random number engine from the \n"
228 "RandomNumberGeneratorService, but that module was not configured\n"
229 "for random numbers. An engine is created only if a seed(s) is provided\n"
230 "in the configuration file. Please add the following PSet to the\n"
231 "configuration file for the RandomNumberGeneratorService:\n\n"
233 " initialSeed = cms.untracked.uint32(your_seed),\n"
234 " engineName = cms.untracked.string('TRandom3')\n"
236 "where you replace \"your_seed\" with a number and add a comma if necessary\n"
237 "The \"engineName\" parameter is optional. If absent the default is \"HepJamesRandom\".\n";
240 return *iter->labelAndEngine()->engine();
243 CLHEP::HepRandomEngine&
249 <<
"RandomNumberGeneratorService::getEngine\n"
250 "Requested a random number engine from the RandomNumberGeneratorService\n"
251 "when no module was active. ModuleCallingContext is null\n";
257 std::vector<ModuleIDToEngine>::iterator iter = std::lower_bound(moduleIDVector.begin(),
258 moduleIDVector.end(),
260 if(iter == moduleIDVector.end() || iter->moduleID() != moduleID) {
262 <<
"The module with label \""
264 <<
"\" requested a random number engine from the \n"
265 "RandomNumberGeneratorService, but that module was not configured\n"
266 "for random numbers. An engine is created only if a seed(s) is provided\n"
267 "in the configuration file. Please add the following PSet to the\n"
268 "configuration file for the RandomNumberGeneratorService:\n\n"
270 " initialSeed = cms.untracked.uint32(your_seed),\n"
271 " engineName = cms.untracked.string('TRandom3')\n"
273 "where you replace \"your_seed\" with a number and add a comma if necessary\n"
274 "The \"engineName\" parameter is optional. If absent the default is \"HepJamesRandom\".\n";
277 return *iter->labelAndEngine()->engine();
292 <<
"RandomNumberGeneratorService::getEngine()\n"
293 "Requested a random number engine from the RandomNumberGeneratorService\n"
294 "from an unallowed transition. ModuleCallingContext is null\n";
299 std::map<std::string, SeedsAndName>::const_iterator iter =
seedsAndNameMap_.find(label);
302 <<
"The module with label \""
304 <<
"\" requested a random number seed from the \n"
305 "RandomNumberGeneratorService, but that module was not configured\n"
306 "for random numbers. An engine is created only if a seed(s) is provided\n"
307 "in the configuration file. Please add the following PSet to the\n"
308 "configuration file for the RandomNumberGeneratorService:\n\n"
309 " " << label <<
" = cms.PSet(\n"
310 " initialSeed = cms.untracked.uint32(your_seed),\n"
311 " engineName = cms.untracked.string('TRandom3')\n"
313 "where you replace \"your_seed\" with a number and add a comma if necessary\n"
314 "The \"engineName\" parameter is optional. If absent the default is \"HepJamesRandom\".\n";
316 return iter->second.seeds()[0];
337 val.addOptionalUntracked<std::vector<std::uint32_t> >(
"initialSeedSet");
338 val.addOptionalUntracked<
std::string>(
"engineName");
341 wnode.setComment(
"The name of each ParameterSet will be the associated module label.");
344 descriptions.
add(
"RandomNumberGeneratorService", desc);
351 iter->second.setModuleID(description.
id());
362 <<
"Configuration is illegal. The RandomNumberGeneratorService is configured\n"
363 <<
"to run replay using a text file to input the random engine states and\n"
364 <<
"the number of streams is greater than 1. Either set the\n"
365 <<
"parameter named \"restoreFileName\" in the RandomNumberGeneratorService\n"
366 <<
"to the empty string or set the parameter \"numberOfStreams\" in the top\n"
367 <<
"level options parameter set to 1. (Probably these are the default values\n"
368 <<
"and just not setting the parameters will also work)\n";
380 for(
unsigned int iStream = 0; iStream <
nStreams_; ++iStream) {
381 unsigned int seedOffset = iStream;
384 outFiles_[iStream] = std::make_shared<std::ofstream>();
387 for(
unsigned int iLumi = 0; iLumi < nConcurrentLumis; ++iLumi) {
414 <<
"Configuration is illegal. The RandomNumberGeneratorService is configured\n"
415 <<
"to run replay using a text file to input the random engine states and\n"
416 <<
"the process is configured to fork multiple processes. No forking is\n"
417 <<
"is allowed with this type of replay\n";
422 for(
auto& labelAndEngine : engines) {
423 std::map<std::string, SeedsAndName>::const_iterator seedsAndName =
seedsAndNameMap_.find(labelAndEngine.label());
426 seedsAndName->second.engineName(),
427 seedsAndName->second.seeds(),
432 if (kMaxChildren != 0) {
435 for(
auto& labelAndEngine : engines) {
436 std::map<std::string, SeedsAndName>::const_iterator seedsAndName =
seedsAndNameMap_.find(labelAndEngine.label());
439 seedsAndName->second.engineName(),
440 seedsAndName->second.seeds(),
449 std::ostringstream
suffix;
450 suffix <<
"_" << childIndex;
491 bool expected =
false;
495 reportSvc->reportRandomStateFile(fullName);
560 std::vector<RandomEngineState>
const&
565 std::vector<RandomEngineState>
const&
573 os <<
"\n\nRandomNumberGeneratorService dump\n\n";
575 os <<
" Contents of seedsAndNameMap (label moduleID engineType seeds)\n";
577 os <<
" " <<
entry.first
578 <<
" " <<
entry.second.moduleID()
579 <<
" " <<
entry.second.engineName();
580 for(
auto val :
entry.second.seeds()) {
585 os <<
" nStreams_ = " <<
nStreams_ <<
"\n";
592 os <<
" verbose_ = " <<
verbose_ <<
"\n";
596 os <<
"\n streamEngines_\n";
597 unsigned int iStream = 0;
599 os <<
" Stream " << iStream <<
"\n";
600 for(
auto const&
i :
k) {
601 os <<
" " <<
i.label();
602 for(
auto const&
j :
i.seeds()) {
605 os <<
" " <<
i.engine()->name();
606 if(
i.engine()->name() ==
std::string(
"HepJamesRandom")) {
607 os <<
" " <<
i.engine()->getSeed();
609 os <<
" engine does not know seeds";
615 os <<
"\n lumiEngines_\n";
616 unsigned int iLumi = 0;
618 os <<
" lumiIndex " << iLumi <<
"\n";
619 for(
auto const&
i :
k) {
620 os <<
" " <<
i.label();
621 for(
auto const&
j :
i.seeds()) {
624 os <<
" " <<
i.engine()->name();
625 if(
i.engine()->name() ==
std::string(
"HepJamesRandom")) {
626 os <<
" " <<
i.engine()->getSeed();
628 os <<
" engine does not know seeds";
642 std::vector<ModuleIDToEngine>::iterator iter = std::lower_bound(moduleIDVector.begin(),
643 moduleIDVector.end(),
645 if(iter != moduleIDVector.end() && iter->moduleID() == moduleID) {
647 iter->setEngineState(labelAndEngine->
engine()->put());
658 std::vector<ModuleIDToEngine>::iterator iter = std::lower_bound(moduleIDVector.begin(),
659 moduleIDVector.end(),
661 if(iter != moduleIDVector.end() && iter->moduleID() == moduleID) {
663 if(iter->engineState() != labelAndEngine->
engine()->put()) {
665 <<
"It is illegal to generate random numbers during beginStream, endStream,\n"
666 "beginRun, endRun, beginLumi, endLumi because that makes it very difficult\n"
667 "to replay the processing of individual events. Random numbers were\n"
668 "generated during one of these methods for the module with class name\n\""
683 <<
"In the configuration for the RandomNumberGeneratorService the\n"
684 <<
"restoreStateTag contains the current process which is illegal.\n"
685 <<
"The process name in the replay process should have been changed\n"
686 <<
"to be different than the original process name and the restoreStateTag\n"
687 <<
"should contain either the original process name or an empty process name.\n";
696 <<
"The RandomNumberGeneratorService is trying to restore\n"
697 <<
"the state of the random engines by reading a product from\n"
699 <<
"It could not find the product.\n"
700 <<
"Either the product in the LuminosityBlock was dropped or\n"
701 <<
"not produced or the configured input tag is incorrect or there is a bug somewhere\n";
716 <<
"The RandomNumberGeneratorService is trying to restore\n"
717 <<
"the state of the random engines by reading a product from\n"
719 <<
"It could not find the product.\n"
720 <<
"Either the product in the Event was dropped or\n"
721 <<
"not produced or the configured input tag is incorrect or there is a bug somewhere\n";
729 cache.resize(engines.size());
730 std::vector<RandomEngineState>::iterator state = cache.begin();
732 for(std::vector<LabelAndEngine>::const_iterator iter = engines.begin();
733 iter != engines.end();
737 state->setLabel(label);
738 state->setSeed(iter->seeds());
740 std::vector<unsigned long> stateL = iter->engine()->put();
741 state->clearStateVector();
742 state->reserveStateVector(stateL.size());
743 for(
auto element : stateL) {
744 state->push_back_stateVector(static_cast<std::uint32_t>(element));
751 std::vector<LabelAndEngine>& engines) {
752 std::vector<LabelAndEngine>::iterator labelAndEngine = engines.begin();
753 for(
auto const& cachedState : cache) {
755 std::string const& engineLabel = cachedState.getLabel();
757 std::vector<std::uint32_t>
const& engineState = cachedState.getState();
758 std::vector<unsigned long> engineStateL;
759 engineStateL.reserve(engineState.size());
760 for(
auto const&
value : engineState) {
761 engineStateL.push_back(static_cast<unsigned long>(
value));
764 std::vector<std::uint32_t>
const& engineSeeds = cachedState.getSeed();
765 std::vector<long> engineSeedsL;
766 engineSeedsL.reserve(engineSeeds.size());
767 for(
auto const& val : engineSeeds) {
768 long seedL =
static_cast<long>(val);
769 engineSeedsL.push_back(seedL);
778 std::uint32_t seedu32 =
static_cast<std::uint32_t
>(seedL);
782 assert(labelAndEngine != engines.end() && engineLabel == labelAndEngine->label());
783 std::shared_ptr<CLHEP::HepRandomEngine>
const& engine = labelAndEngine->engine();
787 if(engineStateL[0] == CLHEP::engineIDulong<CLHEP::HepJamesRandom>()) {
792 engine->setSeed(engineSeedsL[0], 0);
793 engine->get(engineStateL);
795 labelAndEngine->setSeed(engineSeeds[0], 0);
796 }
else if(engineStateL[0] == CLHEP::engineIDulong<CLHEP::RanecuEngine>()) {
801 engine->get(engineStateL);
803 labelAndEngine->setSeed(engineSeeds[0], 0);
804 labelAndEngine->setSeed(engineSeeds[1], 1);
805 }
else if(engineStateL[0] == CLHEP::engineIDulong<TRandomAdaptor>()) {
810 engine->setSeed(engineSeedsL[0], 0);
811 engine->get(engineStateL);
813 labelAndEngine->setSeed(engineSeeds[0], 0);
818 <<
"The RandomNumberGeneratorService is trying to restore the state\n"
819 "of the random engines. The state in the event indicates an engine\n"
820 "of an unknown type. This should not be possible unless you are\n"
821 "running with an old code release on a new file that was created\n"
822 "with a newer release which had new engine types added. In this case\n"
823 "the only solution is to use a newer release. In any other case, notify\n"
824 "the EDM developers because this should not be possible\n";
834 if(typeFromConfig != typeFromEvent) {
836 <<
"The RandomNumberGeneratorService is trying to restore\n"
837 <<
"the state of the random engine for the module \""
838 << engineLabel <<
"\". An\n"
839 <<
"error was detected because the type of the engine in the\n"
840 <<
"input file and the configuration file do not match.\n"
841 <<
"In the configuration file the type is \"" << typeFromConfig
842 <<
"\".\nIn the input file the type is \"" << typeFromEvent <<
"\". If\n"
843 <<
"you are not generating any random numbers in this module, then\n"
844 <<
"remove the line in the configuration file that gives it\n"
845 <<
"a seed and the error will go away. Otherwise, you must give\n"
846 <<
"this module the same engine type in the configuration file or\n"
847 <<
"stop trying to restore the random engine state.\n";
858 if(!outFile.is_open()) {
859 std::stringstream
file;
862 file <<
"_" << streamID.
value();
869 <<
"Unable to open the file \""
870 << file.str() <<
"\" to save the state of the random engines.\n";
874 outFile.seekp(0, std::ios_base::beg);
875 outFile <<
"<RandomEngineStates>\n";
877 outFile <<
"<Event>\n";
879 outFile <<
"</Event>\n";
881 outFile <<
"<Lumi>\n";
883 outFile <<
"</Lumi>\n";
885 outFile <<
"</RandomEngineStates>\n";
892 for(std::vector<RandomEngineState>::const_iterator iter = v.begin(),
894 iter != iEnd; ++iter) {
896 std::vector<std::uint32_t>
const& seedVector = iter->getSeed();
899 std::vector<std::uint32_t>
const& stateVector = iter->getState();
902 outFile <<
"<ModuleLabel>\n" << iter->getLabel() <<
"\n</ModuleLabel>\n";
904 outFile <<
"<SeedLength>\n" << seedVectorLength <<
"\n</SeedLength>\n" ;
905 outFile <<
"<InitialSeeds>\n";
907 outFile <<
"</InitialSeeds>\n";
908 outFile <<
"<FullStateLength>\n" << stateVectorLength <<
"\n</FullStateLength>\n";
909 outFile <<
"<FullState>\n";
911 outFile <<
"</FullState>\n";
918 if(v.empty())
return;
919 size_t numItems = v.size();
920 for(
size_t i = 0;
i < numItems; ++
i) {
921 if(
i != 0 &&
i % 10 == 0) outFile <<
"\n";
922 outFile << std::setw(13) << v[
i];
936 std::vector<RandomEngineState>& cache) {
943 std::vector<RandomEngineState>& cache) {
951 std::vector<RandomEngineState>& cache,
953 std::ifstream inFile;
957 <<
"Unable to open the file \""
958 << fileName <<
"\" to restore the random engine states.\n";
963 if(!inFile.good() || text !=
std::string(
"<RandomEngineStates>")) {
965 <<
"Attempting to read file with random number engine states.\n"
967 <<
"\" is ill-structured or otherwise corrupted.\n"
968 <<
"Cannot read the file header word.\n";
970 bool saveToCache =
false;
975 std::vector<RandomEngineState>& cache,
982 std::vector<std::uint32_t> seedVector;
984 std::vector<std::uint32_t> stateVector;
994 <<
"\" is ill-structured or otherwise corrupted.\n"
995 <<
"Cannot read next field and did not hit the end yet.\n";
999 if(leading ==
std::string(
"</RandomEngineStates>"))
return false;
1004 saveToCache =
false;
1011 saveToCache = (leading == whichStates);
1017 is >> moduleLabel >> trailing;
1023 <<
"\" is ill-structured or otherwise corrupted.\n"
1024 <<
"Cannot read a module label when restoring random engine states.\n";
1027 is >> leading >> seedVectorSize >> trailing;
1033 <<
"\" is ill-structured or otherwise corrupted.\n"
1034 <<
"Cannot read seed vector length when restoring random engine states.\n";
1042 <<
"\" is ill-structured or otherwise corrupted.\n"
1043 <<
"Cannot read beginning of InitialSeeds when restoring random engine states.\n";
1049 <<
"\" is ill-structured or otherwise corrupted.\n"
1050 <<
"The number of seeds exceeds 64K.\n";
1060 <<
"\" is ill-structured or otherwise corrupted.\n"
1061 <<
"Cannot read end of InitialSeeds when restoring random engine states.\n";
1064 is >> leading >> stateVectorSize >> trailing;
1070 <<
"\" is ill-structured or otherwise corrupted.\n"
1071 <<
"Cannot read state vector length when restoring random engine states.\n";
1079 <<
"\" is ill-structured or otherwise corrupted.\n"
1080 <<
"Cannot read beginning of FullState when restoring random engine states.\n";
1086 <<
"\" is ill-structured or otherwise corrupted.\n"
1087 <<
"The number of states exceeds 64K.\n";
1090 readVector(is, stateVectorSize, stateVector);
1097 <<
"\" is ill-structured or otherwise corrupted.\n"
1098 <<
"Cannot read end of FullState when restoring random engine states.\n";
1103 randomEngineState.
setLabel(moduleLabel);
1104 std::vector<RandomEngineState>::iterator state =
1105 std::lower_bound(cache.begin(), cache.end(), randomEngineState);
1107 if(state != cache.end() && moduleLabel == state->getLabel()) {
1108 if(seedVector.size() != state->getSeed().size() ||
1109 stateVector.size() != state->getState().size()) {
1112 <<
"\" is ill-structured or otherwise corrupted.\n"
1113 <<
"Vectors containing engine state are the incorrect size for the type of random engine.\n";
1115 state->setSeed(seedVector);
1116 state->setState(stateVector);
1125 v.reserve(numItems);
1127 for(
unsigned i = 0;
i < numItems; ++
i) {
1132 <<
"\" is ill-structured or otherwise corrupted.\n"
1133 <<
"Cannot read vector when restoring random engine states.\n";
1141 unsigned int seedOffset,
1142 unsigned int eventSeedOffset,
1143 std::vector<ModuleIDToEngine>& moduleIDVector) {
1150 unsigned int moduleID =
i.second.moduleID();
1154 VUint32 const& seeds =
i.second.seeds();
1156 if(name ==
"RanecuEngine") {
1157 std::shared_ptr<CLHEP::HepRandomEngine> engine = std::make_shared<CLHEP::RanecuEngine>();
1158 engines.emplace_back(label, seeds, engine);
1163 long int seedL =
static_cast<long int>(seeds[0]);
1165 if(name ==
"HepJamesRandom") {
1166 std::shared_ptr<CLHEP::HepRandomEngine> engine = std::make_shared<CLHEP::HepJamesRandom>(seedL);
1167 engines.emplace_back(label, seeds, engine);
1168 if(seedOffset != 0 || eventSeedOffset != 0) {
1180 std::uint32_t seedu32 =
static_cast<std::uint32_t
>(seedL);
1181 assert(seeds[0] == seedu32);
1183 std::shared_ptr<CLHEP::HepRandomEngine> engine = std::make_shared<TRandomAdaptor>(seedL);
1184 engines.emplace_back(label, seeds, engine);
1185 if(seedOffset != 0 || eventSeedOffset != 0) {
1190 moduleIDVector.emplace_back(&engines.back(), moduleID);
1193 std::sort(moduleIDVector.begin(), moduleIDVector.end());
1200 std::uint32_t offset1,
1201 std::uint32_t offset2) {
1203 if(engineName ==
"RanecuEngine") {
1204 assert(seeds.size() == 2U);
1209 std::uint32_t seed0 = (seeds[0] + offset1) % mod;
1210 seed0 = (seed0 + offset2) % mod;
1211 labelAndEngine.
setSeed(seed0, 0);
1212 labelAndEngine.
setSeed(seeds[1], 1);
1214 seedL[0] =
static_cast<long int>(seed0);
1215 seedL[1] =
static_cast<long int>(seeds[1]);
1216 labelAndEngine.
engine()->setSeeds(seedL,0);
1218 assert(seeds.size() == 1U);
1220 if(engineName ==
"HepJamesRandom") {
1225 std::uint32_t seed0 = (seeds[0] + offset1) % mod;
1226 seed0 = (seed0 + offset2) % mod;
1227 labelAndEngine.
setSeed(seed0, 0);
1229 long int seedL =
static_cast<long int>(seed0);
1230 labelAndEngine.
engine()->setSeed(seedL, 0);
1232 assert(engineName ==
"TRandom3");
1237 std::uint32_t seed0 = seeds[0];
1238 if((max32 - seed0) >= offset1) {
1241 seed0 = offset1 - (max32 - seed0) - 1U;
1243 if((max32 - seed0) >= offset2) {
1246 seed0 = offset2 - (max32 - seed0) - 1U;
1248 labelAndEngine.
setSeed(seed0, 0);
1250 long seedL =
static_cast<long>(seed0);
1259 std::uint32_t seedu32 =
static_cast<std::uint32_t
>(seedL);
1260 assert(seed0 == seedu32);
1262 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)
virtual 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)
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_
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
virtual void print(std::ostream &os) const override
For debugging.
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)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
void readEventStatesFromTextFile(std::string const &fileName, std::vector< RandomEngineState > &cache)
std::vector< std::vector< RandomEngineState > > lumiCache_
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)
virtual std::uint32_t mySeed() const override
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 postForkReacquireResources(unsigned childIndex, unsigned kMaxChildren)
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("")
void watchPostForkReacquireResources(PostForkReacquireResources::slot_type const &iSlot)
virtual ~RandomNumberGeneratorService()
char data[epos_bytes_allocation]
virtual void postEventRead(Event const &event) override
virtual std::vector< RandomEngineState > const & getLumiCache(LuminosityBlockIndex const &) const override
These two are used by the RandomEngineStateProducer.
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)
ParameterDescriptionBase * addOptionalUntracked(U const &iLabel, T const &value)
void restoreFromCache(std::vector< RandomEngineState > const &cache, std::vector< LabelAndEngine > &engines)
volatile std::atomic< bool > shutdown_flag false
std::vector< std::vector< LabelAndEngine > > lumiEngines_
void postModuleBeginStream(StreamContext const &sc, ModuleCallingContext const &mcc)
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
virtual void preBeginLumi(LuminosityBlock const &lumi) override
virtual std::vector< RandomEngineState > const & getEventCache(StreamID const &) const override
void postModuleStreamBeginLumi(StreamContext const &sc, ModuleCallingContext const &mcc)