5 #include "GaudiKernel/ISvcLocator.h"
6 #include "GaudiKernel/IIncidentSvc.h"
7 #include "GaudiKernel/Incident.h"
8 #include "GaudiKernel/DataIncident.h"
9 #include "GaudiKernel/ServiceHandle.h"
11 #include "CLHEP/Random/Ranlux64Engine.h"
12 #include "CLHEP/Random/RandGauss.h"
32 m_engines(), m_engines_copy(),
57 (
"Initializing " <<
name()
58 <<
"\n INITIALISING RANDOM NUMBER STREAMS. ");
67 static const int PRIORITY = 100;
68 pIncSvc->addListener(
this,
"EndEvent", PRIORITY);
69 pIncSvc->addListener(
this,
"AfterReseedIncident", PRIORITY);
74 pIncSvc->addListener(
this,
"BeginEvent", PRIORITY);
75 pIncSvc->addListener(
this,
"ReseedIncident", PRIORITY);
77 pIncSvc.release().ignore();
81 if (m_useOldBrokenSeeding) m_defaultLuxLevel = 3;
83 if (m_read_from_file) {
85 ifstream
infile( m_file_to_read.value().c_str() );
87 ATH_MSG_ERROR (
" Unable to open: " << m_file_to_read.value());
88 return StatusCode::FAILURE;
93 std::vector<uint32_t> seeds;
97 <<
" INITIALISING " <<
stream <<
" stream with seeds ";
98 for (std::vector<uint32_t>::const_iterator
i = seeds.begin();
i != seeds.end(); ++
i){
106 msg() << ((*i) & 0xffffffff
u) <<
" ";
108 msg() <<
" read from file " << m_file_to_read.value() <<
endmsg;
109 if (CreateStream(seeds,
stream)) {
111 <<
stream <<
" stream initialized succesfully" <<
endmsg;
115 return StatusCode::FAILURE;
120 <<
"\n in input file " << m_file_to_read.value() <<
endmsg;
121 return StatusCode::FAILURE;
129 for (
const auto&
i : m_streams_seeds) {
133 short ll(m_defaultLuxLevel);
137 <<
", luxury level " <<
ll
138 <<
", reseeding offset " <<
offset);
141 return StatusCode::FAILURE;
145 bool not_found(
true);
146 if ( number_of_streams() != 0 ) {
148 while (
sf !=
end() && (not_found=((*sf).first !=
stream))) ++
sf;
153 (
" INITIALISING " <<
stream <<
" stream with seeds "
157 m_reseedingOffsets.insert(std::make_pair(
stream,
offset));
166 return StatusCode::SUCCESS;
173 if ( inc.type() ==
"EndEvent" ||
174 inc.type() ==
"AfterReseedIncident" )
177 m_engines_copy.clear();
180 CLHEP::HepRandomEngine* engine = GetEngine(iE->first);
181 std::vector<unsigned long>
v = engine->put();
182 std::vector<uint32_t> tseeds(
v.size());
183 for (
size_t i=0;
i<
v.size(); ++
i) {
191 tseeds[
i] = (
v[
i] & 0xffffffff
u);
193 m_engines_copy.insert(std::make_pair(iE->first, tseeds));
198 }
else if (inc.type() ==
"BeginEvent") {
200 EventContext context = inc.context();
201 const EventIDBase& ei = context.eventID();
205 vector<string>::const_iterator
i(m_reseedStreamNames.begin());
206 vector<string>::const_iterator
e(m_reseedStreamNames.end());
210 if (!(this->setAllOnDefinedSeeds(ei.event_number(),
212 throw GaudiException(
"can not reseed all streams ",
name(), StatusCode::FAILURE);
215 const string& strName(*
i++);
216 if (0 == this->setOnDefinedSeeds(ei.event_number(),
219 throw GaudiException(
string(
"can not reseed stream ") + strName,
220 name(), StatusCode::FAILURE);
223 <<
" for random service " <<
endmsg;
228 else if (inc.type() ==
"ReseedIncident") {
229 typedef ContextIncident<std::pair<unsigned,unsigned> > Ctxt;
230 const Ctxt* incident =
dynamic_cast<const Ctxt*
>(&inc);
232 throw GaudiException(
string(
"can not cast to ContextIncident "),
233 name(), StatusCode::FAILURE);
235 const std::pair<unsigned,unsigned>&
data = incident->tag();
239 vector<string>::const_iterator
i(m_reseedStreamNames.begin());
240 vector<string>::const_iterator
e(m_reseedStreamNames.end());
244 if (!(this->setAllOnDefinedSeeds(
data.first,
246 throw GaudiException(
"can not reseed all streams ",
name(), StatusCode::FAILURE);
249 const string& strName(*
i++);
250 if (0 == this->setOnDefinedSeeds(
data.first,
253 throw GaudiException(
string(
"can not reseed stream ") + strName,
254 name(), StatusCode::FAILURE);
257 <<
" for random service " <<
endmsg;
269 if (m_save_to_file) {
271 std::ofstream
outfile( m_file_to_write.value().c_str() );
273 ATH_MSG_ERROR (
"error: unable to open: " << m_file_to_write.value());
275 for (std::map<std::string, std::vector<uint32_t> >::const_iterator
i = m_engines_copy.begin();
276 i != m_engines_copy.end();
279 for (std::vector<uint32_t>::const_iterator j = (*i).second.begin(); j !=(*i).second.end(); ++j){
284 ATH_MSG_DEBUG (
" wrote seeds to " << m_file_to_write.value() );
288 return StatusCode::SUCCESS;
291 CLHEP::HepRandomEngine*
295 if ( citer == m_engines.end() )
302 return (CLHEP::HepRandomEngine*)(*iter).second;
313 const std::string&
streamName,
short luxLevel )
318 if ( citer == m_engines.end() )
320 new CLHEP::Ranlux64Engine(
s[0], luxLevel)));
322 ((*iter).second)->setSeed(
s[0], luxLevel);
330 if ( citer == m_engines.end() )
332 new CLHEP::Ranlux64Engine() ) );
334 std::vector<unsigned long> longSeeds(seeds.size());
335 for (
size_t i=0;
i<seeds.size(); ++
i) longSeeds[
i]=seeds[
i];
336 return (((*iter).second)->getState( longSeeds ));
346 seed1 = m_PYTHIA_default_seed1;
347 seed2 = m_PYTHIA_default_seed2;
351 seed1 = m_HERWIG_default_seed1;
352 seed2 = m_HERWIG_default_seed2;
356 seed1 = m_default_seed1;
357 seed2 = m_default_seed2;
360 (
" INITIALISING " <<
StreamName <<
" stream with DEFAULT seeds "
366 ((*iter).second)->setSeed(
s[0]);
372 engineConstIter citer = m_engines.find(
StreamName);
373 if ( citer == m_engines.end() ) {
376 std::vector<unsigned long>
v = ((*citer).second)->put();
378 for (std::vector<unsigned long>::const_iterator
i =
v.begin();
i !=
v.end(); ++
i){
386 msg() << ((*i) & 0xffffffff
u) <<
" ";
395 for (engineConstIter
i = m_engines.begin();
i != m_engines.end(); ++
i)
399 CLHEP::HepRandomEngine*
403 if (m_useOldBrokenSeeding)
407 map<string, uint32_t>::const_iterator citer(m_reseedingOffsets.find(
streamName));
408 bool hasOffset(citer != m_reseedingOffsets.end() && 0 != citer->second);
409 if (hasOffset) theHash=
crc_combine(theHash, citer->second);
416 return this->setOnDefinedSeeds(theHash,
streamName);
419 CLHEP::HepRandomEngine*
422 if (m_useOldBrokenSeeding)
423 return oldSetOnDefinedSeeds(theSeed,
streamName);
425 engineConstIter citer = m_engines.find(
streamName);
427 if ( citer == m_engines.end() )
429 new CLHEP::Ranlux64Engine() ) );
434 CLHEP::Ranlux64Engine* eng = (*iter).second;
438 eng->setSeed( (int32_t)theSeed, eng->getLuxury() );
443 CLHEP::HepRandomEngine*
448 if ( citer == m_engines.end() )
452 long seeds[2] = { (long)(1000*
runNumber + hashedStream),
454 assert( seeds[0] > 0 );
455 assert( seeds[1] > 0 );
456 const long*
s = seeds;
457 ((*iter).second)->setSeed(
s[0], m_defaultLuxLevel);
458 return (CLHEP::HepRandomEngine*)(*iter).second;
461 CLHEP::HepRandomEngine*
465 if ( citer == m_engines.end() )
469 long seeds[2] = { (long)(hashedStream % (theSeed+13)),
471 assert( seeds[0] > 0 );
472 assert( seeds[1] > 0 );
473 const long*
s = seeds;
474 ((*iter).second)->setSeed(
s[0], m_defaultLuxLevel );
475 return (CLHEP::HepRandomEngine*)(*iter).second;
483 engineIter
i(m_engines.begin()),
e(m_engines.end());
496 engineIter
i(m_engines.begin()),
e(m_engines.end());
498 (allOK=(0 != this->setOnDefinedSeeds(theSeed, (*
i++).
first)))) {