6#include <boost/lexical_cast.hpp>
7#include <boost/tokenizer.hpp>
10#include "GaudiKernel/IIncidentSvc.h"
11#include "GaudiKernel/ISvcLocator.h"
12#include "GaudiKernel/Incident.h"
13#include "GaudiKernel/MsgStream.h"
18bool
interpretSeeds( const
string& buffer,
string& stream,
std::vector<
unsigned long>& seed ) {
22 typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
23 boost::char_separator<char> sep(
" " );
24 tokenizer tokens( buffer, sep );
25 if ( status = ( distance( tokens.begin(), tokens.end() ) == 32 ) )
27 tokenizer::iterator token( tokens.begin() );
31 for (
int i = 0; i < 31; i++ )
33 long tmp = boost::lexical_cast<long>( *token++ );
34 seed.push_back( tmp );
36 }
catch ( boost::bad_lexical_cast e )
44 : base_class( name, svc ) {
46 m_read_from_file =
false;
47 m_file_to_read =
"BesRndmGenSvc.out";
48 ofile =
"BesRndmGenSvc.out";
51 m_default_seed = 11000;
52 m_EVTGEN_default_seed = 35910;
53 m_PYTHIA_default_seed = 93531;
54 m_HERWIG_default_seed = 35391;
55 m_LUNDCRM_default_seed = 12456;
56 m_SIM_default_seed = 23569;
57 m_MIX_default_seed = 76543;
58 m_KKMC_default_seed = 26877;
60 declareProperty(
"Seeds", m_streams_seeds );
61 declareProperty(
"StreamName", m_StreamName =
"EVTGEN" );
62 declareProperty(
"ReadFromFile", m_read_from_file );
63 declareProperty(
"FileToRead", m_file_to_read );
64 declareProperty(
"RdmOutFile", ofile );
65 declareProperty(
"RndmSeed", m_default_seed );
67 Stream_EVTGEN =
"EVTGEN";
68 Stream_PYTHIA =
"PYTHIA";
69 Stream_HERWIG =
"HERWIG";
70 Stream_LUNDCRM =
"LUNDCRM";
101 MsgStream log(
msgSvc(), name() );
102 log << MSG::INFO <<
"Initializing " << name() <<
" - package version "
103 <<
"FIXME: PACKAGE_VERSION"
104 <<
"\n INITIALISING RANDOM NUMBER STREAMS. " << endmsg;
106 if ( !( Service::initialize().isSuccess() ) ) {
return StatusCode::FAILURE; }
109 m_EVTGEN_default_seed = m_default_seed + 35910;
110 m_PYTHIA_default_seed = m_default_seed + 93531;
111 m_HERWIG_default_seed = m_default_seed + 35391;
112 m_LUNDCRM_default_seed = m_default_seed + 12456;
113 m_SIM_default_seed = m_default_seed + 23569;
114 m_MIX_default_seed = m_default_seed + 76543;
115 m_KKMC_default_seed = m_default_seed + 26877;
118 IIncidentSvc* pIncSvc( 0 );
121 if ( !( service(
"IncidentSvc", pIncSvc,
true ) ).isSuccess() )
123 log << MSG::ERROR <<
"Could not locate IncidentSvc " << endmsg;
124 return StatusCode::FAILURE;
128 static const int PRIORITY = 100;
129 pIncSvc->addListener(
this,
"EndEvent", PRIORITY );
131 if ( m_read_from_file )
134 ifstream infile( m_file_to_read.c_str() );
137 log << MSG::ERROR <<
" Unable to open: " << m_file_to_read << endmsg;
138 return StatusCode::FAILURE;
143 while ( std::getline( infile, buffer ) )
146 std::vector<unsigned long>
v;
150 log << MSG::DEBUG <<
" INITIALISING " << stream <<
" stream, "
151 <<
" read from file " << m_file_to_read << endmsg;
152 CLHEP::HepRandomEngine* engine =
GetEngine( stream );
157 log << MSG::ERROR <<
"bad line\n"
158 << buffer <<
"\n in input file " << m_file_to_read << endmsg;
159 return StatusCode::FAILURE;
166 for ( VStrings::const_iterator i = m_streams_seeds.begin(); i != m_streams_seeds.end(); ++i )
169 std::vector<unsigned long>
v;
172 { log << MSG::VERBOSE <<
"Seeds property: stream " << stream << endmsg; }
175 log << MSG::ERROR <<
"bad Seeds property\n" << *i << endmsg;
176 return StatusCode::FAILURE;
180 bool not_found =
true;
185 if ( ( *sf ).first == stream ) not_found =
false;
187 }
while ( sf !=
end() && not_found );
192 log << MSG::DEBUG <<
" INITIALISING " << stream << endmsg;
197 return StatusCode::SUCCESS;
201 MsgStream log(
msgSvc(), name() );
202 log << MSG::DEBUG <<
" Handle EndEvent " << endmsg;
204 if ( inc.type() ==
"EndEvent" )
207 m_engines_copy.clear();
210 CLHEP::HepRandomEngine* engine =
GetEngine( ( *i ).first );
211 std::vector<unsigned long>
s = engine->put();
212 std::vector<long int> tseeds;
213 for (
unsigned int j = 0; j <
s.size(); j++ ) { tseeds.push_back(
s[j] ); }
214 m_engines_copy.insert(
215 std::map<std::string, std::vector<long int>>::value_type( ( *i ).first, tseeds ) );
242 MsgStream log(
msgSvc(), name() );
243 log << MSG::INFO <<
" FINALISING " << endmsg;
244 return Service::finalize();
249 if ( citer == m_engines->end() )
251 m_engines->insert(
engineValType( StreamName,
new CLHEP::RanluxEngine() ) );
252 SetStreamSeeds( StreamName );
256 return (CLHEP::HepRandomEngine*)( *iter ).second;
261 if ( citer == m_engines->end() )
262 m_engines->insert(
engineValType( StreamName,
new CLHEP::RanluxEngine() ) );
264 ( ( *iter ).second )->setSeed( seed, 3 );
267void BesRndmGenSvc::SetStreamSeeds(
const std::string& StreamName ) {
269 if ( StreamName ==
"PYTHIA" ) { theseed = m_PYTHIA_default_seed; }
270 else if ( StreamName ==
"HERWIG" ) { theseed = m_HERWIG_default_seed; }
271 else if ( StreamName ==
"EVTGEN" ) { theseed = m_EVTGEN_default_seed; }
272 else if ( StreamName ==
"LUNDCRM" ) { theseed = m_LUNDCRM_default_seed; }
273 else if ( StreamName ==
"SIM" ) { theseed = m_SIM_default_seed; }
274 else if ( StreamName ==
"MIX" ) { theseed = m_MIX_default_seed; }
275 else if ( StreamName ==
"KKMC" ) { theseed = m_KKMC_default_seed; }
278 theseed = m_default_seed;
279 MsgStream log(
msgSvc(), name() );
280 log << MSG::WARNING <<
" INITIALISING " << StreamName <<
" stream with DEFAULT seed "
281 << theseed << endmsg;
285 ( ( *iter ).second )->setSeed( theseed, 3 );
289 MsgStream log(
msgSvc(), name() );
291 if ( citer == m_engines->end() )
292 { log << MSG::WARNING <<
" Stream = " << StreamName <<
" NOT FOUND" << endmsg; }
295 const long s = ( ( *citer ).second )->getSeed();
296 log << MSG::INFO <<
" Stream = " << StreamName <<
", Seed = " <<
s << endmsg;
303 const std::string& StreamName ) {
305 if ( citer == m_engines->end() )
306 m_engines->insert(
engineValType( StreamName,
new CLHEP::RanluxEngine() ) );
309 long theseed = 10000 * EventNumber;
310 ( ( *iter ).second )->setSeed( theseed, 3 );
311 return (CLHEP::HepRandomEngine*)( *iter ).second;
DECLARE_COMPONENT(BesBdkRc)
bool interpretSeeds(const string &buffer, string &stream, std::vector< unsigned long > &seed)
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
StatusCode initialize()
Gaudi Service Implementation.
BesRndmGenSvc(const std::string &name, ISvcLocator *svc)
Standard Constructor.
engineConstIter begin(void) const
CLHEP::HepRandomEngine * GetEngine(const std::string &StreamName)
Interface to the CLHEP engine.
void handle(const Incident &)
IIncidentListener implementation. Handles EndEvent incident.
void CreateStream(long seed, const std::string &StreamName)
std::map< std::string, CLHEP::RanluxEngine * > engineMap
CLHEP engines typedefs:
engineConstIter end(void) const
engineMap::const_iterator engineConstIter
CLHEP::HepRandomEngine * setOnDefinedSeeds(int EventNumber, const std::string &StreamName)
set the seeds for an engine. First param will usually be the event number
virtual ~BesRndmGenSvc()
Standard Destructor.
engineMap::value_type engineValType
unsigned int number_of_streams(void) const
engineMap::iterator engineIter