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