Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #define GAUDI_RANDOMGENSVC_RNDMGENSVC_CPP
00016
00017
00018 #include <cfloat>
00019
00020
00021 #include "GaudiKernel/SmartIF.h"
00022 #include "GaudiKernel/SvcFactory.h"
00023 #include "GaudiKernel/ISvcManager.h"
00024 #include "GaudiKernel/IRndmEngine.h"
00025
00026 #include "GaudiKernel/MsgStream.h"
00027
00028 #include "RndmGen.h"
00029 #include "RndmGenSvc.h"
00030
00031 using ROOT::Reflex::PluginService;
00032
00033
00034
00035 DECLARE_SERVICE_FACTORY(RndmGenSvc)
00036
00037
00038 RndmGenSvc::RndmGenSvc(const std::string& nam, ISvcLocator* svc)
00039 : base_class(nam, svc), m_engine(0), m_serialize(0)
00040 {
00041 declareProperty("Engine", m_engineName = "HepRndm::Engine<CLHEP::RanluxEngine>");
00042 }
00043
00045 RndmGenSvc::~RndmGenSvc() {
00046 }
00047
00049 StatusCode RndmGenSvc::initialize() {
00050 StatusCode status = Service::initialize();
00051 MsgStream log(msgSvc(), name());
00052 std::string machName = name()+".Engine";
00053 SmartIF<IRndmEngine> engine;
00054 SmartIF<ISvcManager> mgr(serviceLocator());
00055
00056 if ( status.isSuccess() ) {
00057 status = setProperties();
00058 if ( status.isSuccess() ) {
00059
00060 const bool CREATE = false;
00061 engine = serviceLocator()->service(machName, CREATE);
00062 if ( !engine.isValid() && mgr.isValid() ) {
00063 using Gaudi::Utils::TypeNameString;
00064 engine = mgr->createService(TypeNameString(machName, m_engineName));
00065 }
00066 if ( engine.isValid() ) {
00067 SmartIF<ISerialize> serial(engine);
00068 SmartIF<IService> service(engine);
00069 if ( serial.isValid( ) && service.isValid( ) ) {
00070 status = service->sysInitialize();
00071 if ( status.isSuccess() ) {
00072 m_engine = engine;
00073 m_serialize = serial;
00074 m_engine->addRef();
00075 m_serialize->addRef();
00076 log << MSG::INFO << "Using Random engine:" << m_engineName << endmsg;
00077 return status;
00078 }
00079 }
00080 }
00081 }
00082 }
00083 return status;
00084 }
00085
00087 StatusCode RndmGenSvc::finalize() {
00088 StatusCode status = Service::finalize();
00089 if ( m_serialize ) m_serialize->release();
00090 m_serialize = 0;
00091 if ( m_engine ) {
00092 SmartIF<IService> service(m_engine);
00093 service->finalize().ignore();
00094 m_engine->release();
00095 }
00096 m_engine = 0;
00097 return status;
00098 }
00099
00101
00102 StreamBuffer& RndmGenSvc::serialize(StreamBuffer& str) {
00103 if ( 0 != m_serialize ) {
00104 return m_serialize->serialize(str);
00105 }
00106 MsgStream log(msgSvc(), name());
00107 log << MSG::ERROR << "Cannot input serialize Generator settings!" << endmsg;
00108 return str;
00109 }
00110
00112 StreamBuffer& RndmGenSvc::serialize(StreamBuffer& str) const {
00113 if ( 0 != m_serialize ) {
00114 return m_serialize->serialize(str);
00115 }
00116 MsgStream log(msgSvc(), name());
00117 log << MSG::ERROR << "Cannot output serialize Generator settings!" << endmsg;
00118 return str;
00119 }
00120
00122 IRndmEngine* RndmGenSvc::engine() {
00123 return m_engine;
00124 }
00125
00127 StatusCode RndmGenSvc::generator(const IRndmGen::Param& par, IRndmGen*& refpGen) {
00128 StatusCode status = StatusCode::FAILURE;
00129 IInterface* iface = PluginService::CreateWithId<IInterface*>(par.type(),(IInterface*)m_engine);
00130 if ( iface ) {
00131
00132 status = iface->queryInterface(IRndmGen::interfaceID(), (void**)& refpGen);
00133 if ( status.isSuccess() ) {
00134 status = refpGen->initialize(par);
00135 }
00136 else {
00137 iface->release();
00138 }
00139 }
00140
00141 return status;
00142 }
00143
00144
00145 double RndmGenSvc::rndm() const {
00146 if ( 0 != m_engine ) {
00147 return m_engine->rndm();
00148 }
00149 return -1;
00150 }
00151
00152
00153
00154
00155
00156
00157
00158 StatusCode RndmGenSvc::rndmArray( std::vector<double>& array, long howmany, long start) const {
00159 if ( 0 != m_engine ) {
00160 return m_engine->rndmArray(array, howmany, start);
00161 }
00162 return StatusCode::FAILURE;
00163 }
00164
00165
00166 StatusCode RndmGenSvc::setSeeds(const std::vector<long>& seeds) {
00167 if ( 0 != m_engine ) {
00168 return m_engine->setSeeds(seeds);
00169 }
00170 return StatusCode::FAILURE;
00171 }
00172
00173
00174 StatusCode RndmGenSvc::seeds(std::vector<long>& seeds) const {
00175 if ( 0 != m_engine ) {
00176 return m_engine->seeds(seeds);
00177 }
00178 return StatusCode::FAILURE;
00179 }
00180