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/RanecuEngine.h"
12 #include "CLHEP/Random/RandGauss.h"
30 m_engines(), m_engines_copy()
54 (
"Initializing " <<
name()
55 <<
"\n INITIALISING RANDOM NUMBER STREAMS. ");
65 static const int PRIORITY = 100;
66 pIncSvc->addListener(
this,
"EndEvent", PRIORITY);
67 pIncSvc->addListener(
this,
"AfterReseedIncident", PRIORITY);
72 pIncSvc->addListener(
this,
"BeginEvent");
73 pIncSvc->addListener(
this,
"ReseedIncident", PRIORITY);
75 pIncSvc.release().ignore();
80 ifstream
infile( m_file_to_read.value().c_str() );
82 ATH_MSG_ERROR (
" Unable to open: " << m_file_to_read.value());
83 return StatusCode::FAILURE;
91 (
" INITIALISING " <<
stream <<
" stream with seeds "
93 <<
" read from file " << m_file_to_read.value());
98 <<
"\n in input file " << m_file_to_read.value());
99 return StatusCode::FAILURE;
107 for (
const auto&
i : m_streams_seeds.value()) {
113 (
"Seeds property: stream " <<
stream
115 <<
", reseeding offset " <<
offset);
118 return StatusCode::FAILURE;
122 bool not_found =
true;
123 if ( number_of_streams() != 0 ) {
126 if ((*sf).first ==
stream) not_found =
false;
128 }
while (
sf !=
end() && not_found);
133 (
" INITIALISING " <<
stream <<
" stream with seeds "
137 m_reseedingOffsets.insert(std::make_pair(
stream,
offset));
146 return StatusCode::SUCCESS;
152 if ( inc.type() ==
"EndEvent" ||
153 inc.type() ==
"AfterReseedIncident" )
156 m_engines_copy.clear();
159 CLHEP::HepRandomEngine* engine = GetEngine((*i).first);
160 const long*
s = engine->getSeeds();
161 std::vector<long int> tseeds;
162 tseeds.push_back(
s[0]);
163 tseeds.push_back(
s[1]);
164 m_engines_copy.insert(
165 std::map<std::string, std::vector<long int> >::
value_type( (*i).first,
169 }
else if (inc.type() ==
"BeginEvent") {
171 EventContext context = inc.context();
172 const EventIDBase& ei = context.eventID();
176 vector<string>::const_iterator
i(m_reseedStreamNames.begin());
177 vector<string>::const_iterator
e(m_reseedStreamNames.end());
181 if (!(this->setAllOnDefinedSeeds(ei.event_number(),
183 throw GaudiException(
"can not reseed all streams ",
name(), StatusCode::FAILURE);
186 const string& strName(*
i++);
187 if (0 == this->setOnDefinedSeeds(ei.event_number(),
190 throw GaudiException(
string(
"can not reseed stream ") + strName,
191 name(), StatusCode::FAILURE);
194 <<
" for random service " <<
endmsg;
199 else if (inc.type() ==
"ReseedIncident") {
200 typedef ContextIncident<std::pair<unsigned,unsigned> > Ctxt;
201 const Ctxt* incident =
dynamic_cast<const Ctxt*
>(&inc);
203 throw GaudiException(
string(
"can not cast to ContextIncident "),
204 name(), StatusCode::FAILURE);
206 const std::pair<unsigned,unsigned>&
data = incident->tag();
210 vector<string>::const_iterator
i(m_reseedStreamNames.begin());
211 vector<string>::const_iterator
e(m_reseedStreamNames.end());
215 if (!(this->setAllOnDefinedSeeds(
data.first,
217 throw GaudiException(
"can not reseed all streams ",
name(), StatusCode::FAILURE);
220 const string& strName(*
i++);
221 if (0 == this->setOnDefinedSeeds(
data.first,
224 throw GaudiException(
string(
"can not reseed stream ") + strName,
225 name(), StatusCode::FAILURE);
228 <<
" for random service " <<
endmsg;
240 if (m_save_to_file) {
242 std::ofstream
outfile( m_file_to_write.value().c_str() );
244 ATH_MSG_ERROR (
"error: unable to open: " << m_file_to_write.value());
246 for (std::map<std::string, std::vector<long int> >::const_iterator
i = m_engines_copy.begin();
247 i != m_engines_copy.end();
249 outfile << (*i).first <<
" " << (*i).second[0] <<
" " << (*i).second[1] <<
"\n";
251 ATH_MSG_DEBUG (
" wrote seeds to " << m_file_to_write.value() );
254 return StatusCode::SUCCESS;
257 CLHEP::HepRandomEngine*
261 if ( citer == m_engines.end() )
268 return (CLHEP::HepRandomEngine*)(*iter).second;
276 if (citer == m_engines.end())
279 long seeds[3] = { (long)
seed1, (
long)
seed2, 0 };
280 ((*iter).second)->setSeeds( seeds, -1 );
290 seed1 = m_PYTHIA_default_seed1;
291 seed2 = m_PYTHIA_default_seed2;
295 seed1 = m_HERWIG_default_seed1;
296 seed2 = m_HERWIG_default_seed2;
300 seed1 = m_default_seed1;
301 seed2 = m_default_seed2;
304 (
" INITIALISING " <<
streamName <<
" stream with DEFAULT seeds "
308 const long*
s = seeds;
310 ((*iter).second)->setSeeds(
s, -1 );
316 engineConstIter citer = m_engines.find(
streamName);
317 if ( citer == m_engines.end() )
323 const long*
s = ((*citer).second)->getSeeds();
325 <<
s[0] <<
", Seed2 = " <<
s[1]);
332 for (engineConstIter
i = m_engines.begin();
i != m_engines.end(); ++
i)
336 CLHEP::HepRandomEngine*
340 if (m_useOldBrokenSeeding)
344 map<string, uint32_t>::const_iterator citer(m_reseedingOffsets.find(
streamName));
345 bool hasOffset(citer != m_reseedingOffsets.end() && 0 != citer->second);
346 if (hasOffset) theHash=
crc_combine(theHash, citer->second);
353 return this->setOnDefinedSeeds(theHash,
streamName);
356 CLHEP::HepRandomEngine*
359 if (m_useOldBrokenSeeding)
360 return oldSetOnDefinedSeeds(theSeed,
streamName);
362 engineConstIter citer = m_engines.find(
streamName);
364 if ( citer == m_engines.end() )
366 new CLHEP::RanecuEngine() ) );
373 ((*iter).second)->setSeed( (int32_t)theSeed, 0);
374 return (CLHEP::HepRandomEngine*)(*iter).second;
377 CLHEP::HepRandomEngine*
382 if ( citer == m_engines.end() )
386 long seeds[3] = { (long)(1000*
runNumber + hashedStream),
388 assert( seeds[0] > 0 );
389 assert( seeds[1] > 0 );
390 const long*
s = seeds;
391 ((*iter).second)->setSeeds(
s, -1 );
392 return (CLHEP::HepRandomEngine*)(*iter).second;
395 CLHEP::HepRandomEngine*
399 if ( citer == m_engines.end() )
403 long seeds[3] = { (long)(hashedStream % (theSeed+13)), (
long)theSeed, 0 };
404 assert( seeds[0] > 0 );
405 assert( seeds[1] > 0 );
406 const long*
s = seeds;
407 ((*iter).second)->setSeeds(
s, -1 );
408 return (CLHEP::HepRandomEngine*)(*iter).second;
415 engineIter
i(m_engines.begin()),
e(m_engines.end());
428 engineIter
i(m_engines.begin()),
e(m_engines.end());
430 (allOK=(0 != this->setOnDefinedSeeds(theSeed, (*
i++).
first)))) {