| # Gaudi Framework, version v21r10p1 |

Home |  | Generated: 29 Jul 2010

# Algorithm.cpp

Go to the documentation of this file.

    00001 //$Id: Algorithm.cpp,v 1.42 2008/10/23 15:57:37 marcocle Exp $
    00002 #include "GaudiKernel/Kernel.h"
    00003 #include "GaudiKernel/ISvcLocator.h"
    00004 #include "GaudiKernel/IMessageSvc.h"
    00005 #include "GaudiKernel/IJobOptionsSvc.h"
    00006 #include "GaudiKernel/IAlgManager.h"
    00007 #include "GaudiKernel/IAuditorSvc.h"
    00008 #include "GaudiKernel/IDataProviderSvc.h"
    00009 #include "GaudiKernel/IConversionSvc.h"
    00010 #include "GaudiKernel/IHistogramSvc.h"
    00011 #include "GaudiKernel/INTupleSvc.h"
    00012 #include "GaudiKernel/IRndmGenSvc.h"
    00013 #include "GaudiKernel/IToolSvc.h"
    00014 #include "GaudiKernel/IExceptionSvc.h"
    00015 #include "GaudiKernel/IAlgContextSvc.h"
    00016 #include "GaudiKernel/IProperty.h"
    00017
    00018 #include "GaudiKernel/Algorithm.h"
    00019 #include "GaudiKernel/PropertyMgr.h"
    00020 #include "GaudiKernel/MsgStream.h"
    00021 #include "GaudiKernel/Chrono.h"
    00022 #include "GaudiKernel/Stat.h"
    00023 #include "GaudiKernel/GaudiException.h"
    00024 #include "GaudiKernel/ServiceLocatorHelper.h"
    00025 #include "GaudiKernel/ThreadGaudi.h"
    00026 #include "GaudiKernel/Guards.h"
    00027
    00028 // Constructor
    00029 Algorithm::Algorithm( const std::string& name, ISvcLocator *pSvcLocator,
    00030                       const std::string& version)
    00031   : m_name(name),
    00032     m_version(version),
    00033     m_registerContext ( false ) ,
    00034     m_pSvcLocator(pSvcLocator),
    00035     m_filterPassed(true),
    00036     m_isEnabled(true),
    00037     m_isExecuted(false),
    00038     m_state(Gaudi::StateMachine::CONFIGURED),
    00039     m_targetState(Gaudi::StateMachine::CONFIGURED)
    00040 {
    00041   m_propertyMgr = new PropertyMgr();
    00042   m_subAlgms = new std::vector<Algorithm *>();
    00043
    00044   // Declare common Algorithm properties with their defaults
    00045   declareProperty( "OutputLevel",        m_outputLevel = MSG::NIL);
    00046   declareProperty( "Enable",             m_isEnabled = true);
    00047   declareProperty( "ErrorMax",           m_errorMax  = 1);
    00048   declareProperty( "ErrorCount",         m_errorCount = 0);
    00049   // Auditor monitoring properties
    00050
    00051   // Get the default setting for service auditing from the AppMgr
    00052   declareProperty( "AuditAlgorithms", m_auditInit );
    00053
    00054   bool audit(false);
    00055   SmartIF<IProperty> appMgr(serviceLocator()->service("ApplicationMgr"));
    00056   if (appMgr.isValid()) {
    00057     const Property& prop = appMgr->getProperty("AuditAlgorithms");
    00058     Property &pr = const_cast<Property&>(prop);
    00059     if (m_name != "IncidentSvc") {
    00060       setProperty( pr ).ignore();
    00061     }
    00062     audit = m_auditInit.value();
    00063   }
    00064
    00065   declareProperty( "AuditInitialize"  , m_auditorInitialize   = audit ) ;
    00066   declareProperty( "AuditReinitialize", m_auditorReinitialize = audit ) ;
    00067   declareProperty( "AuditRestart"     , m_auditorRestart      = audit ) ;
    00068   declareProperty( "AuditExecute"     , m_auditorExecute      = audit ) ;
    00069   declareProperty( "AuditFinalize"    , m_auditorFinalize     = audit ) ;
    00070   declareProperty( "AuditBeginRun"    , m_auditorBeginRun     = audit ) ;
    00071   declareProperty( "AuditEndRun"      , m_auditorEndRun       = audit ) ;
    00072   declareProperty( "AuditStart"       , m_auditorStart        = audit ) ;
    00073   declareProperty( "AuditStop"        , m_auditorStop         = audit ) ;
    00074
    00075   declareProperty( "MonitorService"   , m_monitorSvcName      = "MonitorSvc" );
    00076
    00077   declareProperty
    00078     ( "RegisterForContextService" ,
    00079       m_registerContext  ,
    00080       "The flag to enforce the registration for Algorithm Context Service") ;
    00081
    00082   // update handlers.
    00083   m_outputLevel.declareUpdateHandler(&Algorithm::initOutputLevel, this);
    00084
    00085 }
    00086
    00087 // Default Destructor
    00088 Algorithm::~Algorithm() {
    00089   delete m_subAlgms;
    00090   delete m_propertyMgr;
    00091 }
    00092
    00093 // IAlgorithm implementation
    00094 StatusCode Algorithm::sysInitialize() {
    00095
    00096   // Bypass the initialization if the algorithm
    00097   // has already been initialized.
    00098   if ( Gaudi::StateMachine::INITIALIZED <= FSMState() ) return StatusCode::SUCCESS;
    00099
    00100   // Set the Algorithm's properties
    00101   StatusCode sc = setProperties();
    00102   if( sc.isFailure() ) return StatusCode::FAILURE;
    00103
    00104   // Bypass the initialization if the algorithm is disabled.
    00105   // Need to do this after setProperties.
    00106   if ( !isEnabled( ) ) return StatusCode::SUCCESS;
    00107
    00108   m_targetState = Gaudi::StateMachine::ChangeState(Gaudi::StateMachine::INITIALIZE,m_state);
    00109
    00110   // Check current outputLevel to evetually inform the MessagsSvc
    00111   //if( m_outputLevel != MSG::NIL ) {
    00112   setOutputLevel( m_outputLevel );
    00113   //}
    00114
    00115   // TODO: (MCl) where shoud we do this? initialize or start?
    00116   // Reset Error count
    00117   //m_errorCount = 0;
    00118
    00119   // lock the context service
    00120   Gaudi::Utils::AlgContext cnt
    00121     ( this , registerContext() ? contextSvc().get() : 0 ) ;
    00122
    00123   // Invoke initialize() method of the derived class inside a try/catch clause
    00124   try {
    00125
    00126     { // limit the scope of the guard
    00127       Gaudi::Guards::AuditorGuard guard
    00128         ( this,
    00129           // check if we want to audit the initialize
    00130           (m_auditorInitialize) ? auditorSvc().get() : 0,
    00131           IAuditor::Initialize);
    00132       // Invoke the initialize() method of the derived class
    00133       sc = initialize();
    00134     }
    00135     if( sc.isSuccess() ) {
    00136
    00137       // Now initialize care of any sub-algorithms
    00138       std::vector<Algorithm *>::iterator it;
    00139       bool fail(false);
    00140       for (it = m_subAlgms->begin(); it != m_subAlgms->end(); it++) {
    00141         if ((*it)->sysInitialize().isFailure()) fail = true;
    00142       }
    00143       if( fail ) {
    00144         sc = StatusCode::FAILURE;
    00145         MsgStream log ( msgSvc() , name() );
    00146         log << MSG::ERROR << " Error initializing one or several sub-algorithms"
    00147             << endmsg;
    00148       } else {
    00149         // Update the state.
    00150         m_state = m_targetState;
    00151       }
    00152     }
    00153   }
    00154   catch ( const GaudiException& Exception )
    00155   {
    00156     MsgStream log ( msgSvc() , name() ) ;
    00157     log << MSG::FATAL << " Exception with tag=" << Exception.tag()
    00158         << " is caught " << endmsg;
    00159     log << MSG::ERROR << Exception  << endmsg;
    00160     Stat stat( chronoSvc() , Exception.tag() );
    00161     sc = StatusCode::FAILURE;
    00162   }
    00163   catch( const std::exception& Exception )
    00164   {
    00165     MsgStream log ( msgSvc() , name() ) ;
    00166     log << MSG::FATAL << " Standard std::exception is caught " << endmsg;
    00167     log << MSG::ERROR << Exception.what()  << endmsg;
    00168     Stat stat( chronoSvc() , "*std::exception*" );
    00169     sc = StatusCode::FAILURE;
    00170   }
    00171   catch(...)
    00172   {
    00173     MsgStream log ( msgSvc() , name() ) ;
    00174     log << MSG::FATAL << "UNKNOWN Exception is caught " << endmsg;
    00175     Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
    00176     sc = StatusCode::FAILURE;
    00177   }
    00178
    00179   return sc;
    00180 }
    00181
    00182 // IAlgorithm implementation
    00183 StatusCode Algorithm::sysStart() {
    00184
    00185   // Bypass the startup if already running or disabled.
    00186   if ( Gaudi::StateMachine::RUNNING == FSMState() ||
    00187        !isEnabled() ) return StatusCode::SUCCESS;
    00188
    00189   m_targetState = Gaudi::StateMachine::ChangeState(Gaudi::StateMachine::START,m_state);
    00190
    00191   // TODO: (MCl) where shoud we do this? initialize or start?
    00192   // Reset Error count
    00193   m_errorCount = 0;
    00194
    00195   // lock the context service
    00196   Gaudi::Utils::AlgContext cnt
    00197     ( this , registerContext() ? contextSvc().get() : 0 ) ;
    00198
    00199   StatusCode sc(StatusCode::FAILURE);
    00200   // Invoke start() method of the derived class inside a try/catch clause
    00201   try
    00202   {
    00203     { // limit the scope of the guard
    00204       Gaudi::Guards::AuditorGuard guard
    00205         (this,
    00206          // check if we want to audit the initialize
    00207          (m_auditorStart) ? auditorSvc().get() : 0,
    00208          IAuditor::Start);
    00209       // Invoke the start() method of the derived class
    00210       sc = start();
    00211     }
    00212     if( sc.isSuccess() ) {
    00213
    00214       // Now start any sub-algorithms
    00215       std::vector<Algorithm *>::iterator it;
    00216       bool fail(false);
    00217       for (it = m_subAlgms->begin(); it != m_subAlgms->end(); it++) {
    00218         if ((*it)->sysStart().isFailure()) fail = true;
    00219       }
    00220       if( fail ) {
    00221         sc = StatusCode::FAILURE;
    00222         MsgStream log ( msgSvc() , name() );
    00223         log << MSG::ERROR << " Error starting one or several sub-algorithms"
    00224             << endmsg;
    00225       } else {
    00226         // Update the state.
    00227         m_state = m_targetState;
    00228       }
    00229     }
    00230   }
    00231   catch ( const GaudiException& Exception )
    00232   {
    00233     MsgStream log ( msgSvc() , name() );
    00234     log << MSG::FATAL << "in sysStart(): exception with tag=" << Exception.tag()
    00235         << " is caught" << endmsg;
    00236     log << MSG::ERROR << Exception << endmsg;
    00237     Stat stat( chronoSvc() , Exception.tag() );
    00238     sc = StatusCode::FAILURE;
    00239   }
    00240   catch( const std::exception& Exception )
    00241   {
    00242     MsgStream log ( msgSvc() , name() );
    00243     log << MSG::FATAL << "in sysStart(): standard std::exception is caught" << endmsg;
    00244     log << MSG::ERROR << Exception.what()  << endmsg;
    00245     Stat stat( chronoSvc() , "*std::exception*" );
    00246     sc = StatusCode::FAILURE;
    00247   }
    00248   catch(...)
    00249   {
    00250     MsgStream log ( msgSvc() , name() );
    00251     log << MSG::FATAL << "in sysStart(): UNKNOWN Exception is caught" << endmsg;
    00252     Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
    00253     sc = StatusCode::FAILURE;
    00254   }
    00255
    00256   return sc;
    00257 }
    00258
    00259 // IAlgorithm implementation
    00260 StatusCode Algorithm::sysReinitialize() {
    00261
    00262   // Bypass the initialization if the algorithm is disabled.
    00263   if ( !isEnabled( ) ) return StatusCode::SUCCESS;
    00264
    00265   // Check that the current status is the correct one.
    00266   if ( Gaudi::StateMachine::INITIALIZED != FSMState() ) {
    00267     MsgStream log ( msgSvc() , name() );
    00268     log << MSG::ERROR
    00269         << "sysReinitialize(): cannot reinitialize algorithm not initialized"
    00270         << endmsg;
    00271     return StatusCode::FAILURE;
    00272   }
    00273
    00274   // Check current outputLevel to evetually inform the MessagsSvc
    00275   //if( m_outputLevel != MSG::NIL ) {
    00276   setOutputLevel( m_outputLevel );
    00277   //}
    00278
    00279   // Reset Error count
    00280   // m_errorCount = 0; // done during start
    00281
    00282   // lock the context service
    00283   Gaudi::Utils::AlgContext cnt
    00284     ( this , registerContext() ? contextSvc().get() : 0 ) ;
    00285
    00286   StatusCode sc(StatusCode::SUCCESS);
    00287   // Invoke reinitialize() method of the derived class inside a try/catch clause
    00288   try {
    00289     { // limit the scope of the guard
    00290       Gaudi::Guards::AuditorGuard guard(this,
    00291                                         // check if we want to audit the initialize
    00292                                         (m_auditorReinitialize) ? auditorSvc().get() : 0,
    00293                                         IAuditor::ReInitialize);
    00294       // Invoke the reinitialize() method of the derived class
    00295       sc = reinitialize();
    00296     }
    00297     if( sc.isSuccess() ) {
    00298
    00299       // Now initialize care of any sub-algorithms
    00300       std::vector<Algorithm *>::iterator it;
    00301       bool fail(false);
    00302       for (it = m_subAlgms->begin(); it != m_subAlgms->end(); it++) {
    00303         if((*it)->sysReinitialize().isFailure()) fail = true;
    00304       }
    00305
    00306       if (fail) {
    00307         sc = StatusCode::FAILURE;
    00308         MsgStream log ( msgSvc() , name() );
    00309         log << MSG::ERROR
    00310             << "sysReinitialize(): Error reinitializing one or several "
    00311             << "sub-algorithms" << endmsg;
    00312       }
    00313     }
    00314   }
    00315   catch ( const GaudiException& Exception )
    00316   {
    00317     MsgStream log ( msgSvc() , name() );
    00318     log << MSG::FATAL << "sysReinitialize(): Exception with tag=" << Exception.tag()
    00319         << " is caught" << endmsg;
    00320     log << MSG::ERROR << Exception  << endmsg;
    00321     Stat stat( chronoSvc() , Exception.tag() );
    00322     sc = StatusCode::FAILURE;
    00323   }
    00324   catch( const std::exception& Exception )
    00325   {
    00326     MsgStream log ( msgSvc() , name() );
    00327     log << MSG::FATAL << "sysReinitialize(): Standard std::exception is caught" << endmsg;
    00328     log << MSG::ERROR << Exception.what()  << endmsg;
    00329     Stat stat( chronoSvc() , "*std::exception*" );
    00330     sc = StatusCode::FAILURE;
    00331   }
    00332   catch(...)
    00333   {
    00334     MsgStream log ( msgSvc() , name() );
    00335     log << MSG::FATAL << "sysReinitialize(): UNKNOWN Exception is caught" << endmsg;
    00336     Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
    00337     sc = StatusCode::FAILURE;
    00338   }
    00339
    00340   return sc;
    00341 }
    00342
    00343 // IAlgorithm implementation
    00344 StatusCode Algorithm::sysRestart() {
    00345
    00346   // Bypass the initialization if the algorithm is disabled.
    00347   if ( !isEnabled( ) ) return StatusCode::SUCCESS;
    00348
    00349   // Check that the current status is the correct one.
    00350   if ( Gaudi::StateMachine::RUNNING != FSMState() ) {
    00351     MsgStream log ( msgSvc() , name() );
    00352     log << MSG::ERROR
    00353         << "sysRestart(): cannot restart algorithm not started"
    00354         << endmsg;
    00355     return StatusCode::FAILURE;
    00356   }
    00357
    00358   // Check current outputLevel to evetually inform the MessagsSvc
    00359   //if( m_outputLevel != MSG::NIL ) {
    00360   setOutputLevel( m_outputLevel );
    00361   //}
    00362
    00363   // Reset Error count
    00364   m_errorCount = 0;
    00365
    00366   // lock the context service
    00367   Gaudi::Utils::AlgContext cnt
    00368     ( this , registerContext() ? contextSvc().get() : 0 ) ;
    00369
    00370   StatusCode sc(StatusCode::FAILURE);
    00371   // Invoke reinitialize() method of the derived class inside a try/catch clause
    00372   try {
    00373     { // limit the scope of the guard
    00374       Gaudi::Guards::AuditorGuard guard(this,
    00375                                         // check if we want to audit the initialize
    00376                                         (m_auditorRestart) ? auditorSvc().get() : 0,
    00377                                         IAuditor::ReStart);
    00378       // Invoke the reinitialize() method of the derived class
    00379       sc = restart();
    00380     }
    00381     if( sc.isSuccess() ) {
    00382
    00383       // Now initialize care of any sub-algorithms
    00384       std::vector<Algorithm *>::iterator it;
    00385       bool fail(false);
    00386       for (it = m_subAlgms->begin(); it != m_subAlgms->end(); it++) {
    00387         if ((*it)->sysRestart().isFailure()) fail = true;
    00388       }
    00389       if( fail ) {
    00390         sc = StatusCode::FAILURE;
    00391         MsgStream log ( msgSvc() , name() );
    00392         log << MSG::ERROR
    00393             << "sysRestart(): Error restarting one or several sub-algorithms"
    00394             << endmsg;
    00395       }
    00396     }
    00397   }
    00398   catch ( const GaudiException& Exception )
    00399   {
    00400     MsgStream log ( msgSvc() , name() );
    00401     log << MSG::FATAL << "sysRestart(): Exception with tag=" << Exception.tag()
    00402         << " is caught" << endmsg;
    00403     log << MSG::ERROR << Exception  << endmsg;
    00404     Stat stat( chronoSvc() , Exception.tag() );
    00405     sc = StatusCode::FAILURE;
    00406   }
    00407   catch( const std::exception& Exception )
    00408   {
    00409     MsgStream log ( msgSvc() , name() );
    00410     log << MSG::FATAL << "sysRestart(): Standard std::exception is caught" << endmsg;
    00411     log << MSG::ERROR << Exception.what()  << endmsg;
    00412     Stat stat( chronoSvc() , "*std::exception*" );
    00413     sc = StatusCode::FAILURE;
    00414   }
    00415   catch(...)
    00416   {
    00417     MsgStream log ( msgSvc() , name() );
    00418     log << MSG::FATAL << "sysRestart(): UNKNOWN Exception is caught" << endmsg;
    00419     Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
    00420     sc = StatusCode::FAILURE;
    00421   }
    00422
    00423   return sc;
    00424 }
    00425
    00426 // IAlgorithm implementation
    00427 StatusCode Algorithm::sysBeginRun() {
    00428
    00429   // Bypass the beginRun if the algorithm is disabled.
    00430   if ( !isEnabled( ) ) return StatusCode::SUCCESS;
    00431
    00432   // Check current outputLevel to evetually inform the MessagsSvc
    00433   //if( m_outputLevel != MSG::NIL ) {
    00434   setOutputLevel( m_outputLevel );
    00435   //}
    00436
    00437   // Reset Error count
    00438   m_errorCount = 0;
    00439
    00440   // lock the context service
    00441   Gaudi::Utils::AlgContext cnt
    00442     ( this , registerContext() ? contextSvc().get() : 0 ) ;
    00443
    00444   StatusCode sc(StatusCode::FAILURE);
    00445   // Invoke beginRun() method of the derived class inside a try/catch clause
    00446   try {
    00447     { // limit the scope of the guard
    00448       Gaudi::Guards::AuditorGuard guard(this,
    00449                                         // check if we want to audit the initialize
    00450                                         (m_auditorBeginRun) ? auditorSvc().get() : 0,
    00451                                         IAuditor::BeginRun);
    00452       // Invoke the beginRun() method of the derived class
    00453       sc = beginRun();
    00454     }
    00455     if( sc.isSuccess() ) {
    00456
    00457       // Now call beginRun for any sub-algorithms
    00458       std::vector<Algorithm *>::iterator it;
    00459       bool fail(false);
    00460       for (it = m_subAlgms->begin(); it != m_subAlgms->end(); it++) {
    00461         if((*it)->sysBeginRun().isFailure()) fail = true;
    00462       }
    00463       if( fail ) {
    00464         sc = StatusCode::FAILURE;
    00465         MsgStream log ( msgSvc() , name() );
    00466         log << MSG::ERROR << " Error executing BeginRun for one or several sub-algorithms"
    00467           << endmsg;
    00468       }
    00469     }
    00470   }
    00471   catch ( const GaudiException& Exception )
    00472   {
    00473     MsgStream log ( msgSvc() , name() );
    00474     log << MSG::FATAL << " Exception with tag=" << Exception.tag()
    00475         << " is caught " << endmsg;
    00476     log << MSG::ERROR << Exception  << endmsg;
    00477     Stat stat( chronoSvc() , Exception.tag() );
    00478     sc = StatusCode::FAILURE;
    00479   }
    00480   catch( const std::exception& Exception )
    00481   {
    00482     MsgStream log ( msgSvc() , name() );
    00483     log << MSG::FATAL << " Standard std::exception is caught " << endmsg;
    00484     log << MSG::ERROR << Exception.what()  << endmsg;
    00485     Stat stat( chronoSvc() , "*std::exception*" );
    00486     sc = StatusCode::FAILURE;
    00487   }
    00488   catch(...)
    00489   {
    00490     MsgStream log ( msgSvc() , name() );
    00491     log << MSG::FATAL << "UNKNOWN Exception is caught " << endmsg;
    00492     Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
    00493     sc = StatusCode::FAILURE;
    00494   }
    00495   return sc;
    00496 }
    00497
    00498 StatusCode Algorithm::beginRun() {
    00499   return StatusCode::SUCCESS;
    00500 }
    00501
    00502 // IAlgorithm implementation
    00503 StatusCode Algorithm::sysEndRun() {
    00504
    00505   // Bypass the endRun if the algorithm is disabled.
    00506   if ( !isEnabled( ) ) return StatusCode::SUCCESS;
    00507
    00508   // Check current outputLevel to eventually inform the MessagsSvc
    00509   //if( m_outputLevel != MSG::NIL ) {
    00510   setOutputLevel( m_outputLevel );
    00511   //}
    00512
    00513   // Reset Error count
    00514   m_errorCount = 0;
    00515
    00516   // lock the context service
    00517   Gaudi::Utils::AlgContext cnt
    00518     ( this , registerContext() ? contextSvc().get() : 0 ) ;
    00519
    00520   // Invoke endRun() method of the derived class inside a try/catch clause
    00521   StatusCode sc(StatusCode::FAILURE);
    00522   try {
    00523     { // limit the scope of the guard
    00524       Gaudi::Guards::AuditorGuard guard(this,
    00525                                         // check if we want to audit the initialize
    00526                                         (m_auditorEndRun) ? auditorSvc().get() : 0,
    00527                                         IAuditor::EndRun);
    00528       // Invoke the endRun() method of the derived class
    00529       sc = endRun();
    00530     }
    00531     if( sc.isSuccess() ) {
    00532
    00533       // Now call endRun for any sub-algorithms
    00534       std::vector<Algorithm *>::iterator it;
    00535       bool fail(false);
    00536       for (it = m_subAlgms->begin(); it != m_subAlgms->end(); it++) {
    00537         if ((*it)->sysEndRun().isFailure()) fail = true;
    00538       }
    00539       if( fail ) {
    00540         sc = StatusCode::FAILURE;
    00541         MsgStream log ( msgSvc() , name() );
    00542         log << MSG::ERROR << " Error calling endRun for one or several sub-algorithms"
    00543             << endmsg;
    00544       }
    00545     }
    00546   }
    00547   catch ( const GaudiException& Exception )
    00548   {
    00549     MsgStream log ( msgSvc() , name() );
    00550     log << MSG::FATAL << " Exception with tag=" << Exception.tag()
    00551         << " is caught " << endmsg;
    00552     log << MSG::ERROR << Exception  << endmsg;
    00553     Stat stat( chronoSvc() , Exception.tag() );
    00554     sc = StatusCode::FAILURE;
    00555   }
    00556   catch( const std::exception& Exception )
    00557   {
    00558     MsgStream log ( msgSvc() , name() );
    00559     log << MSG::FATAL << " Standard std::exception is caught " << endmsg;
    00560     log << MSG::ERROR << Exception.what()  << endmsg;
    00561     Stat stat( chronoSvc() , "*std::exception*" );
    00562     sc = StatusCode::FAILURE;
    00563   }
    00564   catch(...)
    00565   {
    00566     MsgStream log ( msgSvc() , name() );
    00567     log << MSG::FATAL << "UNKNOWN Exception is caught " << endmsg;
    00568     Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
    00569     sc = StatusCode::FAILURE;
    00570   }
    00571   return sc;
    00572 }
    00573
    00574 StatusCode Algorithm::endRun() {
    00575   return StatusCode::SUCCESS;
    00576 }
    00577
    00578
    00579 StatusCode Algorithm::sysExecute() {
    00580   if (!isEnabled()) {
    00581     MsgStream log ( msgSvc() , name() );
    00582     log << MSG::VERBOSE << ".sysExecute(): is not enabled. Skip execution" <<endmsg;
    00583     return StatusCode::SUCCESS;
    00584   }
    00585
    00586   StatusCode status;
    00587
    00588   // Should performance profile be performed ?
    00589   // invoke execute() method of Algorithm class
    00590   //   and catch all uncaught exceptions
    00591
    00592   // lock the context service
    00593   Gaudi::Utils::AlgContext cnt
    00594     ( this , registerContext() ? contextSvc().get() : 0 ) ;
    00595
    00596   Gaudi::Guards::AuditorGuard guard(this,
    00597                                     // check if we want to audit the initialize
    00598                                     (m_auditorExecute) ? auditorSvc().get() : 0,
    00599                                     IAuditor::Execute,
    00600                                     status);
    00601   try {
    00602     status = execute();
    00603     setExecuted(true);  // set the executed flag
    00604
    00605     if (status.isFailure()) {
    00606       status = exceptionSvc()->handleErr(*this,status);
    00607     }
    00608
    00609   }
    00610   catch( const GaudiException& Exception )
    00611   {
    00612     setExecuted(true);  // set the executed flag
    00613
    00614     MsgStream log ( msgSvc() , name() );
    00615     if (Exception.code() == StatusCode::FAILURE) {
    00616       log << MSG::FATAL;
    00617     } else {
    00618       log << MSG::ERROR << " Recoverable";
    00619     }
    00620
    00621     log << " Exception with tag=" << Exception.tag()
    00622         << " is caught " << endmsg;
    00623
    00624     log << MSG::ERROR << Exception  << endmsg;
    00625
    00626     Stat stat( chronoSvc() , Exception.tag() ) ;
    00627     status = exceptionSvc()->handle(*this,Exception);
    00628   }
    00629   catch( const std::exception& Exception )
    00630   {
    00631     setExecuted(true);  // set the executed flag
    00632
    00633     MsgStream log ( msgSvc() , name() );
    00634     log << MSG::FATAL << " Standard std::exception is caught " << endmsg;
    00635     log << MSG::ERROR << Exception.what()  << endmsg;
    00636     Stat stat( chronoSvc() , "*std::exception*" ) ;
    00637     status = exceptionSvc()->handle(*this,Exception);
    00638   }
    00639   catch(...)
    00640   {
    00641     setExecuted(true);  // set the executed flag
    00642
    00643     MsgStream log ( msgSvc() , name() );
    00644     log << MSG::FATAL << "UNKNOWN Exception is caught " << endmsg;
    00645     Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
    00646
    00647     status = exceptionSvc()->handle(*this);
    00648   }
    00649
    00650   if( status.isFailure() ) {
    00651     MsgStream log ( msgSvc() , name() );
    00652     // Increment the error count
    00653     m_errorCount++;
    00654     // Check if maximum is exeeded
    00655     if( m_errorCount < m_errorMax ) {
    00656       log << MSG::WARNING << "Continuing from error (cnt=" << m_errorCount
    00657           << ", max=" << m_errorMax << ")" << endmsg;
    00658       // convert to success
    00659       status = StatusCode::SUCCESS;
    00660     }
    00661   }
    00662   return status;
    00663 }
    00664
    00665 // IAlgorithm implementation
    00666 StatusCode Algorithm::sysStop() {
    00667
    00668   // Bypass the startup if already running or disabled.
    00669   if ( Gaudi::StateMachine::INITIALIZED == FSMState() ||
    00670        !isEnabled() ) return StatusCode::SUCCESS;
    00671
    00672   m_targetState = Gaudi::StateMachine::ChangeState(Gaudi::StateMachine::STOP,m_state);
    00673
    00674   // lock the context service
    00675   Gaudi::Utils::AlgContext cnt
    00676     ( this , registerContext() ? contextSvc().get() : 0 ) ;
    00677
    00678   StatusCode sc(StatusCode::FAILURE);
    00679   // Invoke stop() method of the derived class inside a try/catch clause
    00680   try {
    00681     // Stop first any sub-algorithms (in reverse order)
    00682     std::vector<Algorithm *>::reverse_iterator it;
    00683     for (it = m_subAlgms->rbegin(); it != m_subAlgms->rend(); it++) {
    00684       (*it)->sysStop().ignore();
    00685     }
    00686     { // limit the scope of the guard
    00687       Gaudi::Guards::AuditorGuard guard(this,
    00688                                         // check if we want to audit the initialize
    00689                                         (m_auditorStop) ? auditorSvc().get() : 0,
    00690                                         IAuditor::Stop);
    00691
    00692       // Invoke the stop() method of the derived class
    00693       sc = stop();
    00694     }
    00695     if( sc.isSuccess() ) {
    00696       // Update the state.
    00697       m_state = m_targetState;
    00698     }
    00699   }
    00700   catch ( const GaudiException& Exception )  {
    00701     MsgStream log ( msgSvc() , name() );
    00702     log << MSG::FATAL << "in sysStop(): exception with tag=" << Exception.tag()
    00703         << " is caught" << endmsg;
    00704     log << MSG::ERROR << Exception << endmsg;
    00705     Stat stat( chronoSvc() , Exception.tag() );
    00706     sc = StatusCode::FAILURE;
    00707   }
    00708   catch( const std::exception& Exception ) {
    00709     MsgStream log ( msgSvc() , name() );
    00710     log << MSG::FATAL << "in sysStop(): standard std::exception is caught" << endmsg;
    00711     log << MSG::ERROR << Exception.what()  << endmsg;
    00712     Stat stat( chronoSvc() , "*std::exception*" );
    00713     sc = StatusCode::FAILURE;
    00714   }
    00715   catch(...) {
    00716     MsgStream log ( msgSvc() , name() );
    00717     log << MSG::FATAL << "in sysStop(): UNKNOWN Exception is caught" << endmsg;
    00718     Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
    00719     sc = StatusCode::FAILURE;
    00720   }
    00721
    00722   return sc;
    00723 }
    00724
    00725 StatusCode Algorithm::sysFinalize() {
    00726
    00727   // Bypass the finalialization if the algorithm hasn't been initilized.
    00728   if ( Gaudi::StateMachine::CONFIGURED == FSMState() ||
    00729        !isEnabled() ) return StatusCode::SUCCESS;
    00730
    00731   m_targetState = Gaudi::StateMachine::ChangeState(Gaudi::StateMachine::FINALIZE,m_state);
    00732
    00733   // lock the context service
    00734   Gaudi::Utils::AlgContext cnt
    00735     ( this , registerContext() ? contextSvc().get() : 0 ) ;
    00736
    00737   StatusCode sc(StatusCode::FAILURE);
    00738   // Invoke finalize() method of the derived class inside a try/catch clause
    00739   try {
    00740     // Order changed (bug #3903 overview: finalize and nested algorithms)
    00741     // Finalize first any sub-algoithms (it can be done more than once)
    00742     std::vector<Algorithm *>::iterator it;
    00743     bool fail(false);
    00744     for (it = m_subAlgms->begin(); it != m_subAlgms->end(); it++) {
    00745       if (!(*it)->sysFinalize().isSuccess()) {
    00746         fail = true;
    00747       }
    00748     }
    00749
    00750     { // limit the scope of the guard
    00751       Gaudi::Guards::AuditorGuard guard(this,
    00752                                         // check if we want to audit the initialize
    00753                                         (m_auditorFinalize) ? auditorSvc().get() : 0,
    00754                                         IAuditor::Finalize);
    00755       // Invoke the finalize() method of the derived class
    00756       sc = finalize();
    00757     }
    00758     if (fail) sc = StatusCode::FAILURE;
    00759
    00760     if( sc.isSuccess() ) {
    00761
    00762       // Release all sub-algorithms
    00763       for (it = m_subAlgms->begin(); it != m_subAlgms->end(); it++) {
    00764         (*it)->release();
    00765       }
    00766       // Indicate that this Algorithm has been finalized to prevent duplicate attempts
    00767       m_state = m_targetState;
    00768     }
    00769   }
    00770   catch( const GaudiException& Exception )
    00771   {
    00772     MsgStream log ( msgSvc() , name() );
    00773     log << MSG::FATAL << " Exception with tag=" << Exception.tag()
    00774         << " is caught " << endmsg;
    00775     log << MSG::ERROR << Exception  << endmsg;
    00776     Stat stat( chronoSvc() , Exception.tag() ) ;
    00777     sc = StatusCode::FAILURE;
    00778   }
    00779   catch( const std::exception& Exception )
    00780   {
    00781     MsgStream log ( msgSvc() , name() );
    00782     log << MSG::FATAL << " Standard std::exception is caught " << endmsg;
    00783     log << MSG::ERROR << Exception.what()  << endmsg;
    00784     Stat stat( chronoSvc() , "*std::exception*" ) ;
    00785     sc = StatusCode::FAILURE;
    00786   }
    00787   catch( ... )
    00788   {
    00789     MsgStream log ( msgSvc() , name() );
    00790     log << MSG::FATAL << "UNKNOWN Exception is caught " << endmsg;
    00791     Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
    00792     sc = StatusCode::FAILURE;
    00793   }
    00794   return sc;
    00795 }
    00796
    00797 StatusCode Algorithm::reinitialize() {
    00798   /* @TODO
    00799    * MCl 2008-10-23: the implementation of reinitialize as finalize+initialize
    00800    *                 is causing too many problems
    00801    *
    00802   // Default implementation is finalize+initialize
    00803   StatusCode sc = finalize();
    00804   if (sc.isFailure()) {
    00805     MsgStream log ( msgSvc() , name() );
    00806     log << MSG::ERROR << "reinitialize(): cannot be finalized" << endmsg;
    00807     return sc;
    00808   }
    00809   sc = initialize();
    00810   if (sc.isFailure()) {
    00811     MsgStream log ( msgSvc() , name() );
    00812     log << MSG::ERROR << "reinitialize(): cannot be initialized" << endmsg;
    00813     return sc;
    00814   }
    00815   */
    00816   return StatusCode::SUCCESS;
    00817 }
    00818
    00819 StatusCode Algorithm::restart() {
    00820   // Default implementation is stop+start
    00821   StatusCode sc = stop();
    00822   if (sc.isFailure()) {
    00823     MsgStream log ( msgSvc() , name() );
    00824     log << MSG::ERROR << "restart(): cannot be stopped" << endmsg;
    00825     return sc;
    00826   }
    00827   sc = start();
    00828   if (sc.isFailure()) {
    00829     MsgStream log ( msgSvc() , name() );
    00830     log << MSG::ERROR << "restart(): cannot be started" << endmsg;
    00831     return sc;
    00832   }
    00833   return StatusCode::SUCCESS;
    00834 }
    00835
    00836 const std::string& Algorithm::name() const {
    00837   return m_name;
    00838 }
    00839
    00840 const std::string& Algorithm::version() const {
    00841   return m_version;
    00842 }
    00843
    00844 bool Algorithm::isExecuted() const {
    00845   return m_isExecuted;
    00846 }
    00847
    00848 void Algorithm::setExecuted( bool state ) {
    00849   m_isExecuted = state;
    00850 }
    00851
    00852 void Algorithm::resetExecuted() {
    00853   m_isExecuted   = false;
    00854   m_filterPassed = true;
    00855 }
    00856
    00857 bool Algorithm::isEnabled() const {
    00858   return m_isEnabled;
    00859 }
    00860
    00861 bool Algorithm::filterPassed() const {
    00862   return m_filterPassed;
    00863 }
    00864
    00865 void Algorithm::setFilterPassed( bool state ) {
    00866   m_filterPassed = state;
    00867 }
    00868
    00869 std::vector<Algorithm*>* Algorithm::subAlgorithms( ) const {
    00870   return m_subAlgms;
    00871 }
    00872
    00873 void Algorithm::setOutputLevel( int level ) {
    00874   if ( msgSvc() != 0 )
    00875   {
    00876     if ( MSG::NIL != level )
    00877     { msgSvc()->setOutputLevel( name(), level ) ; }
    00878     m_outputLevel = msgSvc()->outputLevel( name() );
    00879   }
    00880 }
    00881
    00882 #define serviceAccessor(METHOD,INTERFACE,NAME,MEMBER) \
    00883 SmartIF<INTERFACE>& Algorithm::METHOD() const { \
    00884   if ( !MEMBER.isValid() ) { \
    00885     MEMBER = service(NAME); \
    00886     if( !MEMBER.isValid() ) { \
    00887       throw GaudiException("Service [" NAME  "] not found", name(), StatusCode::FAILURE); \
    00888     } \
    00889   } \
    00890   return MEMBER; \
    00891 }
    00892
    00893 //serviceAccessor(msgSvc, IMessageSvc, "MessageSvc", m_MS)
    00894 // Message service needs a special treatment to avoid infinite recursion
    00895 SmartIF<IMessageSvc>& Algorithm::msgSvc() const {
    00896   if ( !m_MS.isValid() ) {
    00897     //can not use service() method (infinite recursion!)
    00898     m_MS = serviceLocator(); // default message service
    00899     if( !m_MS.isValid() ) {
    00900       throw GaudiException("Service [MessageSvc] not found", name(), StatusCode::FAILURE);
    00901     }
    00902   }
    00903   return m_MS;
    00904 }
    00905
    00906 serviceAccessor(auditorSvc, IAuditorSvc, "AuditorSvc", m_pAuditorSvc)
    00907 serviceAccessor(chronoSvc, IChronoStatSvc, "ChronoStatSvc", m_CSS)
    00908 serviceAccessor(detSvc, IDataProviderSvc, "DetectorDataSvc", m_DDS)
    00909 serviceAccessor(detCnvSvc, IConversionSvc, "DetectorPersistencySvc", m_DCS)
    00910 serviceAccessor(eventSvc, IDataProviderSvc, "EventDataSvc", m_EDS)
    00911 serviceAccessor(eventCnvSvc, IConversionSvc, "EventPersistencySvc", m_ECS)
    00912 serviceAccessor(histoSvc, IHistogramSvc, "HistogramDataSvc", m_HDS)
    00913 serviceAccessor(exceptionSvc, IExceptionSvc, "ExceptionSvc", m_EXS)
    00914 serviceAccessor(ntupleSvc, INTupleSvc, "NTupleSvc", m_NTS)
    00915 //serviceAccessor(atupleSvc, IAIDATupleSvc, "AIDATupleSvc", m_ATS)
    00916 serviceAccessor(randSvc, IRndmGenSvc, "RndmGenSvc", m_RGS)
    00917 serviceAccessor(toolSvc, IToolSvc, "ToolSvc", m_ptoolSvc)
    00918 serviceAccessor(contextSvc, IAlgContextSvc,"AlgContextSvc", m_contextSvc)
    00919
    00920
    00921 // Obsoleted name, kept due to the backwards compatibility
    00922 SmartIF<IChronoStatSvc>& Algorithm::chronoStatService() const {
    00923   return chronoSvc();
    00924 }
    00925 // Obsoleted name, kept due to the backwards compatibility
    00926 SmartIF<IDataProviderSvc>& Algorithm::detDataService() const {
    00927   return detSvc();
    00928 }
    00929 // Obsoleted name, kept due to the backwards compatibility
    00930 SmartIF<IConversionSvc>& Algorithm::detDataCnvService() const {
    00931   return detCnvSvc();
    00932 }
    00933 // Obsoleted name, kept due to the backwards compatibility
    00934 SmartIF<IDataProviderSvc>& Algorithm::eventDataService() const {
    00935   return eventSvc();
    00936 }
    00937 // Obsoleted name, kept due to the backwards compatibility
    00938 SmartIF<IConversionSvc>& Algorithm::eventDataCnvService() const {
    00939   return eventCnvSvc();
    00940 }
    00941 // Obsoleted name, kept due to the backwards compatibility
    00942 SmartIF<IHistogramSvc>& Algorithm::histogramDataService() const {
    00943   return histoSvc();
    00944 }
    00945 // Obsoleted name, kept due to the backwards compatibility
    00946 SmartIF<IMessageSvc>& Algorithm::messageService() const {
    00947   return msgSvc();
    00948 }
    00949 // Obsoleted name, kept due to the backwards compatibility
    00950 SmartIF<INTupleSvc>& Algorithm::ntupleService() const {
    00951   return ntupleSvc();
    00952 }
    00953
    00954 #if 0
    00955 IAuditorSvc* Algorithm::auditorSvc() const {
    00956   if ( 0 == m_pAuditorSvc ) {
    00957     StatusCode sc = service( "AuditorSvc", m_pAuditorSvc, true );
    00958     if( sc.isFailure() ) {
    00959       throw GaudiException("Service [AuditorSvc] not found", name(), sc);
    00960     }
    00961   }
    00962   return m_pAuditorSvc;
    00963 }
    00964
    00965 IChronoStatSvc* Algorithm::chronoSvc() const {
    00966   if ( 0 == m_CSS ) {
    00967     StatusCode sc = service( "ChronoStatSvc", m_CSS, true );
    00968     if( sc.isFailure() ) {
    00969       throw GaudiException("Service [ChronoStatSvc] not found", name(), sc);
    00970     }
    00971   }
    00972   return m_CSS;
    00973 }
    00974
    00975 IDataProviderSvc* Algorithm::detSvc() const {
    00976   if ( 0 == m_DDS ) {
    00977     StatusCode sc = service( "DetectorDataSvc", m_DDS, true );
    00978     if( sc.isFailure() ) {
    00979       throw GaudiException("Service [DetectorDataSvc] not found", name(), sc);
    00980     }
    00981   }
    00982   return m_DDS;
    00983 }
    00984
    00985 IConversionSvc* Algorithm::detCnvSvc() const {
    00986   if ( 0 == m_DCS ) {
    00987     StatusCode sc = service( "DetectorPersistencySvc", m_DCS, true );
    00988     if( sc.isFailure() ) {
    00989       throw GaudiException("Service [DetectorPersistencySvc] not found",
    00990                            name(), sc);
    00991     }
    00992   }
    00993   return m_DCS;
    00994 }
    00995
    00996 IDataProviderSvc* Algorithm::eventSvc() const {
    00997   if ( 0 == m_EDS ) {
    00998     StatusCode sc = service( "EventDataSvc", m_EDS, true );
    00999     if( sc.isFailure() ) {
    01000       throw GaudiException("Service [EventDataSvc] not found", name(), sc);
    01001     }
    01002   }
    01003   return m_EDS;
    01004 }
    01005
    01006 IConversionSvc* Algorithm::eventCnvSvc() const {
    01007   if ( 0 == m_ECS ) {
    01008     StatusCode sc = service( "EventPersistencySvc", m_ECS, true );
    01009     if( sc.isFailure() ) {
    01010       throw GaudiException("Service [EventPersistencySvc] not found",
    01011                            name(), sc);
    01012     }
    01013   }
    01014   return m_ECS;
    01015 }
    01016
    01017 IHistogramSvc* Algorithm::histoSvc() const {
    01018   if ( 0 == m_HDS ) {
    01019     StatusCode sc = service( "HistogramDataSvc", m_HDS, true );
    01020     if( sc.isFailure() ) {
    01021       throw GaudiException("Service [HistogramDataSvc] not found", name(), sc);
    01022     }
    01023   }
    01024   return m_HDS;
    01025 }
    01026
    01027 IExceptionSvc* Algorithm::exceptionSvc() const {
    01028   if ( 0 == m_EXS ) {
    01029     StatusCode sc = service( "ExceptionSvc", m_EXS, true );
    01030     if( sc.isFailure() ) {
    01031       throw GaudiException("Service [ExceptionSvc] not found", name(), sc);
    01032     }
    01033   }
    01034   return m_EXS;
    01035 }
    01036
    01037 IMessageSvc* Algorithm::msgSvc() const {
    01038   if ( 0 == m_MS ) {
    01039     //can not use service() method (infinite recursion!)
    01040     StatusCode sc = serviceLocator()->service( "MessageSvc", m_MS, true );
    01041     if( sc.isFailure() ) {
    01042       throw GaudiException("Service [MessageSvc] not found", name(), sc);
    01043     }
    01044   }
    01045   return m_MS;
    01046 }
    01047
    01048 INTupleSvc* Algorithm::ntupleSvc() const {
    01049   if ( 0 == m_NTS ) {
    01050     StatusCode sc = service( "NTupleSvc", m_NTS, true );
    01051     if( sc.isFailure() ) {
    01052       throw GaudiException("Service [NTupleSvc] not found", name(), sc);
    01053     }
    01054   }
    01055   return m_NTS;
    01056 }
    01057
    01058 // AIDATupleSvc:
    01059 // IAIDATupleSvc* Algorithm::atupleSvc() const {
    01060 //   if ( 0 == m_ATS ) {
    01061 //     StatusCode sc = service( "AIDATupleSvc", m_ATS, true );
    01062 //     if( sc.isFailure() ) {
    01063 //       throw GaudiException("Service [AIDATupleSvc] not found", name(), sc);
    01064 //     }
    01065 //   }
    01066 //   return m_ATS;
    01067 // }
    01068
    01069 IRndmGenSvc* Algorithm::randSvc() const {
    01070   if ( 0 == m_RGS ) {
    01071     StatusCode sc = service( "RndmGenSvc", m_RGS, true );
    01072     if( sc.isFailure() ) {
    01073       throw GaudiException("Service [RndmGenSvc] not found", name(), sc);
    01074     }
    01075   }
    01076   return m_RGS;
    01077 }
    01078
    01079 IToolSvc* Algorithm::toolSvc() const {
    01080   if ( 0 == m_ptoolSvc ) {
    01081     StatusCode sc = service( "ToolSvc", m_ptoolSvc, true );
    01082     if( sc.isFailure() ) {
    01083       throw GaudiException("Service [ToolSvc] not found", name(), sc);
    01084     }
    01085   }
    01086   return m_ptoolSvc;
    01087 }
    01088 #endif
    01089
    01090 SmartIF<ISvcLocator>& Algorithm::serviceLocator() const {
    01091   return *const_cast<SmartIF<ISvcLocator>*>(&m_pSvcLocator);
    01092 }
    01093
    01094 // Use the job options service to set declared properties
    01095 StatusCode Algorithm::setProperties() {
    01096   if( m_pSvcLocator != 0 )    {
    01097     SmartIF<IJobOptionsSvc> jos(m_pSvcLocator->service("JobOptionsSvc"));
    01098     if( jos.isValid() ) {
    01099       // set first generic Properties
    01100       StatusCode sc = jos->setMyProperties( getGaudiThreadGenericName(name()), this );
    01101       if( sc.isFailure() ) return StatusCode::FAILURE;
    01102
    01103       // set specific Properties
    01104       if (isGaudiThreaded(name())) {
    01105         if(jos->setMyProperties( name(), this ).isFailure()) {
    01106           return StatusCode::FAILURE;
    01107         }
    01108       }
    01109       return sc;
    01110     }
    01111   }
    01112   return StatusCode::FAILURE;
    01113 }
    01114
    01115 StatusCode Algorithm::createSubAlgorithm(const std::string& type,
    01116                                          const std::string& name,
    01117                                          Algorithm*& pSubAlgorithm) {
    01118   if( m_pSvcLocator == 0 ) return StatusCode::FAILURE;
    01119
    01120   SmartIF<IAlgManager> am(m_pSvcLocator);
    01121   if ( !am.isValid() ) return StatusCode::FAILURE;
    01122
    01123   // Maybe modify the AppMgr interface to return Algorithm* ??
    01124   IAlgorithm *tmp;
    01125   StatusCode sc = am->createAlgorithm
    01126     (type, name+getGaudiThreadIDfromName(Algorithm::name()), tmp);
    01127   if( sc.isFailure() ) return StatusCode::FAILURE;
    01128
    01129   try{
    01130     pSubAlgorithm = dynamic_cast<Algorithm*>(tmp);
    01131     m_subAlgms->push_back(pSubAlgorithm);
    01132   } catch(...){
    01133     sc = StatusCode::FAILURE;
    01134   }
    01135   return sc;
    01136 }
    01137
    01138 // IProperty implementation
    01139 // Delegate to the Property manager
    01140 StatusCode Algorithm::setProperty(const Property& p) {
    01141   return m_propertyMgr->setProperty(p);
    01142 }
    01143 StatusCode Algorithm::setProperty(const std::string& s) {
    01144   return m_propertyMgr->setProperty(s);
    01145 }
    01146 StatusCode Algorithm::setProperty(const std::string& n, const std::string& v) {
    01147   return m_propertyMgr->setProperty(n,v);
    01148 }
    01149 StatusCode Algorithm::getProperty(Property* p) const {
    01150   return m_propertyMgr->getProperty(p);
    01151 }
    01152 const Property& Algorithm::getProperty( const std::string& name) const{
    01153   return m_propertyMgr->getProperty(name);
    01154 }
    01155 StatusCode Algorithm::getProperty(const std::string& n, std::string& v ) const {
    01156   return m_propertyMgr->getProperty(n,v);
    01157 }
    01158 const std::vector<Property*>& Algorithm::getProperties( ) const {
    01159   return m_propertyMgr->getProperties();
    01160 }
    01161
    01165 void
    01166 Algorithm::initOutputLevel(Property& /*prop*/)
    01167 {
    01168   // do nothing... yet ?
    01169 }
    01170
    01171 StatusCode
    01172 Algorithm::service_i(const std::string& svcName,
    01173                      bool createIf,
    01174                      const InterfaceID& iid,
    01175                      void** ppSvc) const {
    01176   const ServiceLocatorHelper helper(*serviceLocator(), *this);
    01177   return helper.getService(svcName, createIf, iid, ppSvc);
    01178 }
    01179
    01180 StatusCode
    01181 Algorithm::service_i(const std::string& svcType,
    01182                      const std::string& svcName,
    01183                      const InterfaceID& iid,
    01184                      void** ppSvc) const {
    01185   const ServiceLocatorHelper helper(*serviceLocator(), *this);
    01186   return helper.createService(svcType, svcName, iid, ppSvc);
    01187 }
    01188
    01189 SmartIF<IService> Algorithm::service(const std::string& name, const bool createIf, const bool quiet) const {
    01190   const ServiceLocatorHelper helper(*serviceLocator(), *this);
    01191   return helper.service(name, quiet, createIf);
    01192 }