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"
16 #include "CLHEP/Random/RandGauss.h"
30 m_engines(), m_engines_copy() {
51 (
"Initializing " <<
name() <<
"\n INITIALISING RANDOM NUMBER STREAMS. ");
60 static const int PRIORITY = 100;
61 pIncSvc->addListener(
this,
"EndEvent", PRIORITY);
62 pIncSvc->addListener(
this,
"AfterReseedIncident", PRIORITY);
67 pIncSvc->addListener(
this,
"BeginEvent", PRIORITY);
68 pIncSvc->addListener(
this,
"ReseedIncident", PRIORITY);
70 pIncSvc.release().ignore();
72 if (m_read_from_file) {
74 ifstream
infile( m_file_to_read.value().c_str() );
76 ATH_MSG_ERROR (
" Unable to open: " << m_file_to_read.value());
77 return StatusCode::FAILURE;
82 std::vector<uint32_t> seeds;
86 <<
" INITIALISING " <<
stream <<
" stream with seeds ";
87 for (std::vector<uint32_t>::const_iterator
i = seeds.begin();
i != seeds.end(); ++
i){
95 msg() << ((*i) & 0xffffffff
u) <<
" ";
97 msg() <<
" read from file " << m_file_to_read.value() <<
endmsg;
98 if (CreateStream(seeds,
stream)) {
100 <<
stream <<
" stream initialized succesfully" <<
endmsg;
104 return StatusCode::FAILURE;
109 <<
"\n in input file " << m_file_to_read.value() <<
endmsg;
110 return StatusCode::FAILURE;
117 for (
const auto&
i : m_streams_seeds.value()) {
124 <<
", reseeding offset " <<
offset);
127 return StatusCode::FAILURE;
131 bool not_found(
true);
132 if ( number_of_streams() != 0 ) {
134 while (
sf !=
end() && (not_found=((*sf).first !=
stream))) ++
sf;
139 (
" INITIALISING " <<
stream <<
" stream with seeds "
143 m_reseedingOffsets.insert(std::make_pair(
stream,
offset));
152 return StatusCode::SUCCESS;
158 if ( inc.type() ==
"EndEvent" ||
159 inc.type() ==
"AfterReseedIncident" )
161 m_engines_copy.clear();
164 CLHEP::HepRandomEngine* engine = GetEngine(iE->first);
165 std::vector<unsigned long>
v = engine->put();
166 std::vector<uint32_t> tseeds(
v.size());
167 for (
size_t i=0;
i<
v.size(); ++
i) {
175 tseeds[
i] = (
v[
i] & 0xffffffff
u);
177 m_engines_copy.insert(std::make_pair(iE->first, tseeds));
182 }
else if (inc.type() ==
"BeginEvent") {
184 EventContext context = inc.context();
185 const EventIDBase& ei = context.eventID();
189 vector<string>::const_iterator
i(m_reseedStreamNames.begin());
190 vector<string>::const_iterator
e(m_reseedStreamNames.end());
194 if (!(this->setAllOnDefinedSeeds(ei.event_number(),
196 throw GaudiException(
"can not reseed all streams ",
name(), StatusCode::FAILURE);
199 const string& strName(*
i++);
200 if (0 == this->setOnDefinedSeeds(ei.event_number(),
203 throw GaudiException(
string(
"can not reseed stream ") + strName,
204 name(), StatusCode::FAILURE);
207 <<
" for random service " <<
endmsg;
212 else if (inc.type() ==
"ReseedIncident") {
213 typedef ContextIncident<std::pair<unsigned,unsigned> > Ctxt;
214 const Ctxt* incident =
dynamic_cast<const Ctxt*
>(&inc);
215 const std::pair<unsigned,unsigned>&
data = incident->tag();
219 vector<string>::const_iterator
i(m_reseedStreamNames.begin());
220 vector<string>::const_iterator
e(m_reseedStreamNames.end());
224 if (!(this->setAllOnDefinedSeeds(
data.first,
226 throw GaudiException(
"can not reseed all streams ",
name(), StatusCode::FAILURE);
229 const string& strName(*
i++);
230 if (0 == this->setOnDefinedSeeds(
data.first,
233 throw GaudiException(
string(
"can not reseed stream ") + strName,
234 name(), StatusCode::FAILURE);
237 <<
" for random service " <<
endmsg;
248 if (m_save_to_file) {
250 std::ofstream
outfile( m_file_to_write.value().c_str() );
252 ATH_MSG_ERROR (
"error: unable to open: " << m_file_to_write.value());
254 for (std::map<std::string, std::vector<uint32_t> >::const_iterator
i = m_engines_copy.begin();
255 i != m_engines_copy.end();
258 for (std::vector<uint32_t>::const_iterator j = (*i).second.begin(); j !=(*i).second.end(); ++j){
263 ATH_MSG_DEBUG (
" wrote seeds to " << m_file_to_write.value() );
266 return StatusCode::SUCCESS;
272 if ( citer == m_engines.end() )
279 return (CLHEP::HepRandomEngine*)(*iter).second;
284 long seeds[3] = { (long)
seed1, (
long)
seed2, 0 };
285 const long*
s = seeds;
286 engineConstIter citer = m_engines.find(
streamName);
287 if ( citer == m_engines.end() )
290 ((*iter).second)->setSeeds(
s, 0);
298 std::vector<unsigned long> longSeeds(seeds.size());
299 for (
size_t i=0;
i<seeds.size(); ++
i) longSeeds[
i]=seeds[
i];
300 return (((*iter).second)->getState( longSeeds ));
309 seed1 = m_PYTHIA_default_seed1;
310 seed2 = m_PYTHIA_default_seed2;
314 seed1 = m_HERWIG_default_seed1;
315 seed2 = m_HERWIG_default_seed2;
319 seed1 = m_default_seed1;
320 seed2 = m_default_seed2;
323 (
" INITIALISING " <<
StreamName <<
" stream with DEFAULT seeds "
326 long seeds[3] = { (long)
seed1, (
long)
seed2, 0 };
327 const long*
s = seeds;
329 ((*iter).second)->setSeeds(
s,0);
334 engineConstIter citer = m_engines.find(
StreamName);
335 if ( citer == m_engines.end() ) {
338 std::vector<unsigned long>
v = ((*citer).second)->put();
340 for (std::vector<unsigned long>::const_iterator
i =
v.begin();
i !=
v.end(); ++
i){
348 msg() << ((*i) & 0xffffffff
u) <<
" ";
356 for (engineConstIter
i = m_engines.begin();
i != m_engines.end(); ++
i)
364 map<string, uint32_t>::const_iterator citer(m_reseedingOffsets.find(
streamName));
365 bool hasOffset(citer != m_reseedingOffsets.end() && 0 != citer->second);
366 if (hasOffset) theHash=
crc_combine(theHash, citer->second);
373 return this->setOnDefinedSeeds(theHash,
streamName);
378 engineConstIter citer = m_engines.find(
streamName);
380 if ( citer == m_engines.end() )
386 CLHEP::HepRandomEngine* eng = (*iter).second;
387 eng->setSeed( theSeed, 0 );
388 return (CLHEP::HepRandomEngine*)eng;
395 engineIter
i(m_engines.begin()),
e(m_engines.end());
409 engineIter
i(m_engines.begin()),
e(m_engines.end());
411 (allOK=(0 != this->setOnDefinedSeeds(theSeed, (*
i++).
first)))) {