00001 #include "BesServices/BesRndmGenSvc.h"
00002
00003 #ifndef HAVE_NEW_IOSTREAMS
00004 #define BOOST_NO_STRINGSTREAM 1
00005 #endif
00006 #include <boost/lexical_cast.hpp>
00007 #include <boost/tokenizer.hpp>
00008
00009 #include "GaudiKernel/MsgStream.h"
00010 #include "GaudiKernel/ISvcLocator.h"
00011 #include "GaudiKernel/IIncidentSvc.h"
00012 #include "GaudiKernel/Incident.h"
00013 using namespace std;
00014
00015 bool interpretSeeds(const string& buffer,
00016 string& stream, std::vector<unsigned long>& seed) {
00017 bool status(false);
00018 seed.clear();
00019
00020 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
00021 boost::char_separator<char> sep(" ");
00022 tokenizer tokens(buffer, sep);
00023 if (status = (distance(tokens.begin(), tokens.end()) == 32)) {
00024 tokenizer::iterator token(tokens.begin());
00025 stream = *token++;
00026 try {
00027 for(int i=0; i<31; i++) {
00028 long tmp = boost::lexical_cast<long>(*token++);
00029 seed.push_back(tmp);
00030 }
00031 } catch (boost::bad_lexical_cast e) {
00032 status = false;
00033 }
00034 }
00035 return status;
00036 }
00037
00039 BesRndmGenSvc::BesRndmGenSvc(const std::string& name,ISvcLocator* svc)
00040 : Service(name,svc)
00041 {
00042
00043 m_read_from_file = false;
00044 m_file_to_read = "BesRndmGenSvc.out";
00045 ofile = "BesRndmGenSvc.out";
00046
00047
00048 m_default_seed = 11000;
00049 m_EVTGEN_default_seed = 35910;
00050 m_PYTHIA_default_seed = 93531;
00051 m_HERWIG_default_seed = 35391;
00052 m_LUNDCRM_default_seed = 12456;
00053 m_SIM_default_seed = 23569;
00054 m_MIX_default_seed = 76543;
00055 m_KKMC_default_seed = 26877;
00056
00057 declareProperty("Seeds", m_streams_seeds);
00058 declareProperty("StreamName", m_StreamName = "EVTGEN");
00059 declareProperty("ReadFromFile", m_read_from_file);
00060 declareProperty("FileToRead", m_file_to_read);
00061 declareProperty("RdmOutFile", ofile);
00062 declareProperty("RndmSeed", m_default_seed);
00063
00064 Stream_EVTGEN = "EVTGEN";
00065 Stream_PYTHIA = "PYTHIA";
00066 Stream_HERWIG = "HERWIG";
00067 Stream_LUNDCRM = "LUNDCRM";
00068 Stream_SIM = "SIM";
00069 Stream_MIX = "MIX";
00070 Stream_KKMC = "KKMC";
00071
00072 m_engines = new engineMap();
00073 }
00074
00075
00077 BesRndmGenSvc::~BesRndmGenSvc()
00078 {
00079 delete m_engines;
00080 }
00081
00082
00083
00084
00085
00086
00087 StatusCode
00088 BesRndmGenSvc::queryInterface(const InterfaceID& riid, void** ppvInterface)
00089 {
00090 if ( IBesRndmGenSvc::interfaceID().versionMatch(riid) ) {
00091 *ppvInterface = (IBesRndmGenSvc*)this;
00092 }
00093 else {
00094
00095 return Service::queryInterface(riid, ppvInterface);
00096 }
00097 addRef();
00098 return StatusCode::SUCCESS;
00099 }
00100
00101 StatusCode
00102 BesRndmGenSvc::initialize()
00103 {
00104 MsgStream log( messageService(), name() );
00105 log << MSG::INFO << "Initializing " << name()
00106 << " - package version " << PACKAGE_VERSION
00107 << "\n INITIALISING RANDOM NUMBER STREAMS. " << endreq;
00108
00109
00110 if (!(Service::initialize().isSuccess())) {
00111 return StatusCode::FAILURE;
00112 }
00113
00114
00115 m_EVTGEN_default_seed = m_default_seed+35910;
00116 m_PYTHIA_default_seed = m_default_seed+93531;
00117 m_HERWIG_default_seed = m_default_seed+35391;
00118 m_LUNDCRM_default_seed = m_default_seed+12456;
00119 m_SIM_default_seed = m_default_seed+23569;
00120 m_MIX_default_seed = m_default_seed+76543;
00121 m_KKMC_default_seed = m_default_seed+26877;
00122
00124 IIncidentSvc* pIncSvc(0);
00125
00126
00127 if (!(service("IncidentSvc", pIncSvc, true)).isSuccess()) {
00128 log << MSG::ERROR
00129 << "Could not locate IncidentSvc "
00130 << endreq;
00131 return StatusCode::FAILURE;
00132 }
00133
00134
00135 static const int PRIORITY = 100;
00136 pIncSvc->addListener(this, "EndEvent", PRIORITY);
00137
00138 if (m_read_from_file)
00139 {
00140
00141 ifstream infile( m_file_to_read.c_str() );
00142 if ( !infile )
00143 {
00144 log << MSG::ERROR << " Unable to open: " << m_file_to_read <<endreq;
00145 return StatusCode::FAILURE;
00146 }
00147 else
00148 {
00149 std::string buffer;
00150 while (std::getline(infile, buffer))
00151 {
00152 string stream;
00153 std::vector<unsigned long> v;
00154
00155 if (interpretSeeds(buffer, stream, v)) {
00156 log << MSG::DEBUG << " INITIALISING " << stream << " stream, "<< " read from file " <<m_file_to_read << endreq;
00157 CLHEP::HepRandomEngine* engine = GetEngine(stream);
00158 engine->get(v);
00159 } else {
00160 log << MSG::ERROR << "bad line\n" << buffer
00161 << "\n in input file " << m_file_to_read << endreq;
00162 return StatusCode::FAILURE;
00163 }
00164 }
00165
00166 }
00167 }
00168
00169
00170 for (VStrings::const_iterator i = m_streams_seeds.begin(); i != m_streams_seeds.end(); ++i)
00171 {
00172 string stream;
00173 std::vector<unsigned long> v;
00174
00175 if (interpretSeeds(*i, stream, v)) {
00176 log << MSG::VERBOSE << "Seeds property: stream " << stream << endreq;
00177 } else {
00178 log << MSG::ERROR << "bad Seeds property\n" << *i << endreq;
00179 return StatusCode::FAILURE;
00180 }
00181
00182
00183 bool not_found = true;
00184 if ( number_of_streams() != 0 )
00185 {
00186 BesRndmGenSvc::engineConstIter sf = begin();
00187 do
00188 {
00189 if ((*sf).first == stream) not_found = false;
00190 ++sf;
00191 } while (sf != end() && not_found);
00192 }
00193
00194 if (not_found)
00195 {
00196 log << MSG::DEBUG << " INITIALISING " << stream << endreq;
00197 CreateStream(v[0], stream);
00198 }
00199
00200 }
00201
00202 return StatusCode::SUCCESS;
00203 }
00204
00205 void
00206 BesRndmGenSvc::handle(const Incident &inc) {
00207 MsgStream log( messageService(), name() );
00208 log << MSG::DEBUG << " Handle EndEvent " << endreq;
00209
00210 if ( inc.type() == "EndEvent")
00211 {
00212
00213 m_engines_copy.clear();
00214 for (engineConstIter i = begin(); i != end(); ++i)
00215 {
00216 CLHEP::HepRandomEngine* engine = GetEngine((*i).first);
00217 std::vector<unsigned long> s = engine->put();
00218 std::vector<long int> tseeds;
00219 for(unsigned int j=0; j<s.size(); j++) {
00220 tseeds.push_back(s[j]);
00221 }
00222 m_engines_copy.insert(
00223 std::map<std::string, std::vector<long int> >::value_type( (*i).first,
00224 tseeds ) );
00225 }
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247 }
00248 }
00249
00250 StatusCode
00251 BesRndmGenSvc::finalize()
00252 {
00253 MsgStream log(messageService(), name());
00254 log << MSG::INFO << " FINALISING " << endreq;
00255 return Service::finalize();
00256 }
00257
00258 CLHEP::HepRandomEngine*
00259 BesRndmGenSvc::GetEngine ( const std::string& StreamName )
00260 {
00261 engineConstIter citer = m_engines->find(StreamName);
00262 if ( citer == m_engines->end() )
00263 {
00264 m_engines->insert( engineValType( StreamName, new CLHEP::RanluxEngine() ) );
00265 SetStreamSeeds ( StreamName );
00266 }
00267
00268 engineIter iter = m_engines->find(StreamName);
00269 return (CLHEP::HepRandomEngine*)(*iter).second;
00270 }
00271
00272 void
00273 BesRndmGenSvc::CreateStream ( long seed, const std::string& StreamName )
00274 {
00275 engineConstIter citer = m_engines->find(StreamName);
00276 if ( citer == m_engines->end() ) m_engines->insert( engineValType( StreamName,
00277 new CLHEP::RanluxEngine() ) );
00278 engineIter iter = m_engines->find(StreamName);
00279 ((*iter).second)->setSeed( seed, 3 );
00280 }
00281
00282 void
00283 BesRndmGenSvc::SetStreamSeeds ( const std::string& StreamName )
00284 {
00285 long theseed;
00286 if (StreamName == "PYTHIA")
00287 {
00288 theseed = m_PYTHIA_default_seed;
00289 }
00290 else if (StreamName == "HERWIG")
00291 {
00292 theseed = m_HERWIG_default_seed;
00293 }
00294 else if (StreamName == "EVTGEN")
00295 {
00296 theseed = m_EVTGEN_default_seed;
00297 }
00298 else if (StreamName == "LUNDCRM")
00299 {
00300 theseed = m_LUNDCRM_default_seed;
00301 }
00302 else if (StreamName == "SIM")
00303 {
00304 theseed = m_SIM_default_seed;
00305 }
00306 else if (StreamName == "MIX")
00307 {
00308 theseed = m_MIX_default_seed;
00309 }
00310 else if (StreamName == "KKMC")
00311 {
00312 theseed = m_KKMC_default_seed;
00313 }
00314 else
00315 {
00316 theseed = m_default_seed;
00317 }
00318 MsgStream log(messageService(), name());
00319 log << MSG::WARNING << " INITIALISING " << StreamName << " stream with DEFAULT seed "
00320 << theseed << endreq;
00321
00322 engineIter iter = m_engines->find(StreamName);
00323 ((*iter).second)->setSeed( theseed, 3);
00324 }
00325
00326 void
00327 BesRndmGenSvc::print ( const std::string& StreamName )
00328 {
00329 MsgStream log(messageService(), name());
00330 engineConstIter citer = m_engines->find(StreamName);
00331 if ( citer == m_engines->end() )
00332 {
00333 log << MSG::WARNING << " Stream = " << StreamName << " NOT FOUND" << endreq;
00334 }
00335 else
00336 {
00337 const long s = ((*citer).second)->getSeed();
00338 log << MSG::INFO << " Stream = " << StreamName << ", Seed = "
00339 << s << endreq;
00340 }
00341 }
00342
00343 void
00344 BesRndmGenSvc::print ( void )
00345 {
00346 print( m_StreamName );
00347 }
00348
00349 CLHEP::HepRandomEngine*
00350 BesRndmGenSvc::setOnDefinedSeeds (int EventNumber, const std::string& StreamName )
00351 {
00352 engineConstIter citer = m_engines->find(StreamName);
00353 if ( citer == m_engines->end() ) m_engines->insert( engineValType( StreamName,
00354 new CLHEP::RanluxEngine() ) );
00355 engineIter iter = m_engines->find(StreamName);
00356 long hashedStream;
00357
00358 long theseed = 10000*EventNumber + hashedStream;
00359 ((*iter).second)->setSeed( theseed, 3 );
00360 return (CLHEP::HepRandomEngine*)(*iter).second;
00361 }
00362