00001
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
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
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
00050
00051
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
00083 m_outputLevel.declareUpdateHandler(&Algorithm::initOutputLevel, this);
00084
00085 }
00086
00087
00088 Algorithm::~Algorithm() {
00089 delete m_subAlgms;
00090 delete m_propertyMgr;
00091 }
00092
00093
00094 StatusCode Algorithm::sysInitialize() {
00095
00096
00097
00098 if ( Gaudi::StateMachine::INITIALIZED <= FSMState() ) return StatusCode::SUCCESS;
00099
00100
00101 StatusCode sc = setProperties();
00102 if( sc.isFailure() ) return StatusCode::FAILURE;
00103
00104
00105
00106 if ( !isEnabled( ) ) return StatusCode::SUCCESS;
00107
00108 m_targetState = Gaudi::StateMachine::ChangeState(Gaudi::StateMachine::INITIALIZE,m_state);
00109
00110
00111
00112 setOutputLevel( m_outputLevel );
00113
00114
00115
00116
00117
00118
00119
00120 Gaudi::Utils::AlgContext cnt
00121 ( this , registerContext() ? contextSvc().get() : 0 ) ;
00122
00123
00124 try {
00125
00126 {
00127 Gaudi::Guards::AuditorGuard guard
00128 ( this,
00129
00130 (m_auditorInitialize) ? auditorSvc().get() : 0,
00131 IAuditor::Initialize);
00132
00133 sc = initialize();
00134 }
00135 if( sc.isSuccess() ) {
00136
00137
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
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
00183 StatusCode Algorithm::sysStart() {
00184
00185
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
00192
00193 m_errorCount = 0;
00194
00195
00196 Gaudi::Utils::AlgContext cnt
00197 ( this , registerContext() ? contextSvc().get() : 0 ) ;
00198
00199 StatusCode sc(StatusCode::FAILURE);
00200
00201 try
00202 {
00203 {
00204 Gaudi::Guards::AuditorGuard guard
00205 (this,
00206
00207 (m_auditorStart) ? auditorSvc().get() : 0,
00208 IAuditor::Start);
00209
00210 sc = start();
00211 }
00212 if( sc.isSuccess() ) {
00213
00214
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
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
00260 StatusCode Algorithm::sysReinitialize() {
00261
00262
00263 if ( !isEnabled( ) ) return StatusCode::SUCCESS;
00264
00265
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
00275
00276 setOutputLevel( m_outputLevel );
00277
00278
00279
00280
00281
00282
00283 Gaudi::Utils::AlgContext cnt
00284 ( this , registerContext() ? contextSvc().get() : 0 ) ;
00285
00286 StatusCode sc(StatusCode::SUCCESS);
00287
00288 try {
00289 {
00290 Gaudi::Guards::AuditorGuard guard(this,
00291
00292 (m_auditorReinitialize) ? auditorSvc().get() : 0,
00293 IAuditor::ReInitialize);
00294
00295 sc = reinitialize();
00296 }
00297 if( sc.isSuccess() ) {
00298
00299
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
00344 StatusCode Algorithm::sysRestart() {
00345
00346
00347 if ( !isEnabled( ) ) return StatusCode::SUCCESS;
00348
00349
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
00359
00360 setOutputLevel( m_outputLevel );
00361
00362
00363
00364 m_errorCount = 0;
00365
00366
00367 Gaudi::Utils::AlgContext cnt
00368 ( this , registerContext() ? contextSvc().get() : 0 ) ;
00369
00370 StatusCode sc(StatusCode::FAILURE);
00371
00372 try {
00373 {
00374 Gaudi::Guards::AuditorGuard guard(this,
00375
00376 (m_auditorRestart) ? auditorSvc().get() : 0,
00377 IAuditor::ReStart);
00378
00379 sc = restart();
00380 }
00381 if( sc.isSuccess() ) {
00382
00383
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
00427 StatusCode Algorithm::sysBeginRun() {
00428
00429
00430 if ( !isEnabled( ) ) return StatusCode::SUCCESS;
00431
00432
00433
00434 setOutputLevel( m_outputLevel );
00435
00436
00437
00438 m_errorCount = 0;
00439
00440
00441 Gaudi::Utils::AlgContext cnt
00442 ( this , registerContext() ? contextSvc().get() : 0 ) ;
00443
00444 StatusCode sc(StatusCode::FAILURE);
00445
00446 try {
00447 {
00448 Gaudi::Guards::AuditorGuard guard(this,
00449
00450 (m_auditorBeginRun) ? auditorSvc().get() : 0,
00451 IAuditor::BeginRun);
00452
00453 sc = beginRun();
00454 }
00455 if( sc.isSuccess() ) {
00456
00457
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
00503 StatusCode Algorithm::sysEndRun() {
00504
00505
00506 if ( !isEnabled( ) ) return StatusCode::SUCCESS;
00507
00508
00509
00510 setOutputLevel( m_outputLevel );
00511
00512
00513
00514 m_errorCount = 0;
00515
00516
00517 Gaudi::Utils::AlgContext cnt
00518 ( this , registerContext() ? contextSvc().get() : 0 ) ;
00519
00520
00521 StatusCode sc(StatusCode::FAILURE);
00522 try {
00523 {
00524 Gaudi::Guards::AuditorGuard guard(this,
00525
00526 (m_auditorEndRun) ? auditorSvc().get() : 0,
00527 IAuditor::EndRun);
00528
00529 sc = endRun();
00530 }
00531 if( sc.isSuccess() ) {
00532
00533
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
00589
00590
00591
00592
00593 Gaudi::Utils::AlgContext cnt
00594 ( this , registerContext() ? contextSvc().get() : 0 ) ;
00595
00596 Gaudi::Guards::AuditorGuard guard(this,
00597
00598 (m_auditorExecute) ? auditorSvc().get() : 0,
00599 IAuditor::Execute,
00600 status);
00601 try {
00602 status = execute();
00603 setExecuted(true);
00604
00605 if (status.isFailure()) {
00606 status = exceptionSvc()->handleErr(*this,status);
00607 }
00608
00609 }
00610 catch( const GaudiException& Exception )
00611 {
00612 setExecuted(true);
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);
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);
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
00653 m_errorCount++;
00654
00655 if( m_errorCount < m_errorMax ) {
00656 log << MSG::WARNING << "Continuing from error (cnt=" << m_errorCount
00657 << ", max=" << m_errorMax << ")" << endmsg;
00658
00659 status = StatusCode::SUCCESS;
00660 }
00661 }
00662 return status;
00663 }
00664
00665
00666 StatusCode Algorithm::sysStop() {
00667
00668
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
00675 Gaudi::Utils::AlgContext cnt
00676 ( this , registerContext() ? contextSvc().get() : 0 ) ;
00677
00678 StatusCode sc(StatusCode::FAILURE);
00679
00680 try {
00681
00682 std::vector<Algorithm *>::reverse_iterator it;
00683 for (it = m_subAlgms->rbegin(); it != m_subAlgms->rend(); it++) {
00684 (*it)->sysStop().ignore();
00685 }
00686 {
00687 Gaudi::Guards::AuditorGuard guard(this,
00688
00689 (m_auditorStop) ? auditorSvc().get() : 0,
00690 IAuditor::Stop);
00691
00692
00693 sc = stop();
00694 }
00695 if( sc.isSuccess() ) {
00696
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
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
00734 Gaudi::Utils::AlgContext cnt
00735 ( this , registerContext() ? contextSvc().get() : 0 ) ;
00736
00737 StatusCode sc(StatusCode::FAILURE);
00738
00739 try {
00740
00741
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 {
00751 Gaudi::Guards::AuditorGuard guard(this,
00752
00753 (m_auditorFinalize) ? auditorSvc().get() : 0,
00754 IAuditor::Finalize);
00755
00756 sc = finalize();
00757 }
00758 if (fail) sc = StatusCode::FAILURE;
00759
00760 if( sc.isSuccess() ) {
00761
00762
00763 for (it = m_subAlgms->begin(); it != m_subAlgms->end(); it++) {
00764 (*it)->release();
00765 }
00766
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
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816 return StatusCode::SUCCESS;
00817 }
00818
00819 StatusCode Algorithm::restart() {
00820
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
00894
00895 SmartIF<IMessageSvc>& Algorithm::msgSvc() const {
00896 if ( !m_MS.isValid() ) {
00897
00898 m_MS = serviceLocator();
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
00916 serviceAccessor(randSvc, IRndmGenSvc, "RndmGenSvc", m_RGS)
00917 serviceAccessor(toolSvc, IToolSvc, "ToolSvc", m_ptoolSvc)
00918 serviceAccessor(contextSvc, IAlgContextSvc,"AlgContextSvc", m_contextSvc)
00919
00920
00921
00922 SmartIF<IChronoStatSvc>& Algorithm::chronoStatService() const {
00923 return chronoSvc();
00924 }
00925
00926 SmartIF<IDataProviderSvc>& Algorithm::detDataService() const {
00927 return detSvc();
00928 }
00929
00930 SmartIF<IConversionSvc>& Algorithm::detDataCnvService() const {
00931 return detCnvSvc();
00932 }
00933
00934 SmartIF<IDataProviderSvc>& Algorithm::eventDataService() const {
00935 return eventSvc();
00936 }
00937
00938 SmartIF<IConversionSvc>& Algorithm::eventDataCnvService() const {
00939 return eventCnvSvc();
00940 }
00941
00942 SmartIF<IHistogramSvc>& Algorithm::histogramDataService() const {
00943 return histoSvc();
00944 }
00945
00946 SmartIF<IMessageSvc>& Algorithm::messageService() const {
00947 return msgSvc();
00948 }
00949
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
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
01059
01060
01061
01062
01063
01064
01065
01066
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
01095 StatusCode Algorithm::setProperties() {
01096 if( m_pSvcLocator != 0 ) {
01097 SmartIF<IJobOptionsSvc> jos(m_pSvcLocator->service("JobOptionsSvc"));
01098 if( jos.isValid() ) {
01099
01100 StatusCode sc = jos->setMyProperties( getGaudiThreadGenericName(name()), this );
01101 if( sc.isFailure() ) return StatusCode::FAILURE;
01102
01103
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
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
01139
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& )
01167 {
01168
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 }