Gaudi Framework, version v22r2

Home   Generated: Tue May 10 2011

Sequencer.cpp

Go to the documentation of this file.
00001 //$Id: Sequencer.cpp,v 1.7 2008/06/02 14:22:04 marcocle Exp $
00002 
00003 // Sequencer class
00004 // Implements:
00005 // 1) Common functionality of IInterface
00006 // 2) Default behavior for the IAlgorithm
00007 
00008 #include "GaudiAlg/Sequencer.h"
00009 
00010 #include "GaudiKernel/IAlgManager.h"
00011 #include "GaudiKernel/ISvcLocator.h"
00012 #include "GaudiKernel/AlgFactory.h"
00013 #include "GaudiKernel/MsgStream.h"
00014 #include "GaudiKernel/Chrono.h"
00015 #include "GaudiKernel/Stat.h"
00016 #include "GaudiKernel/GaudiException.h"
00017 
00021 Sequencer::Sequencer( const std::string& name, ISvcLocator* pSvcLocator )
00022 : Algorithm( name, pSvcLocator ),
00023   m_branchFilterPassed( false )
00024 {
00025 
00026   // Create vector of branch algorithms
00027   m_branchAlgs = new std::vector<Algorithm*>();
00028 
00029   // Declare Sequencer properties with their defaults
00030   declareProperty( "Members", m_names );
00031   declareProperty( "BranchMembers", m_branchNames );
00032   declareProperty( "StopOverride", m_stopOverride=false );
00033 
00034   // Associate action handlers with the "Members" and "BranchMembers" properties
00035   m_names.declareUpdateHandler      ( &Sequencer::membershipHandler      , this );
00036   m_branchNames.declareUpdateHandler( &Sequencer::branchMembershipHandler, this );
00037 
00038 }
00039 
00043 Sequencer::~Sequencer()
00044 {
00045   delete m_branchAlgs;
00046 }
00047 
00048 StatusCode
00049 Sequencer::initialize()
00050 {
00051   StatusCode result = StatusCode::SUCCESS;
00052   MsgStream log( msgSvc( ), name( ) );
00053 
00054   std::vector<Algorithm*>* theAlgs;
00055   std::vector<Algorithm*>::iterator it;
00056   std::vector<Algorithm*>::iterator itend;
00057 
00058   result = decodeMemberNames();
00059   if( result.isFailure() ) {
00060     log << MSG::ERROR << "Unable to configure one or more sequencer members " << endmsg;
00061     return result;
00062   }
00063   result = decodeBranchMemberNames();
00064   if( result.isFailure() ) {
00065     log << MSG::ERROR << "Unable to configure one or more branch members " << endmsg;
00066     return result;
00067   }
00068 
00069   // Loop over all sub-algorithms
00070   theAlgs = subAlgorithms( );
00071   itend   = theAlgs->end( );
00072   for (it = theAlgs->begin(); it != itend; it++) {
00073     Algorithm* theAlgorithm = (*it);
00074     result = theAlgorithm->sysInitialize( );
00075     if( result.isFailure() ) {
00076       log << MSG::ERROR << "Unable to initialize Algorithm " << theAlgorithm->name() << endmsg;
00077       return result;
00078     }
00079   }
00080 
00081   // Loop over all branches
00082   theAlgs = branchAlgorithms( );
00083   itend   = theAlgs->end( );
00084   for (it = theAlgs->begin(); it != itend; it++) {
00085     Algorithm* theAlgorithm = (*it);
00086     result = theAlgorithm->sysInitialize( );
00087     if( result.isFailure() ) {
00088       log << MSG::ERROR << "Unable to initialize Algorithm " << theAlgorithm->name() << endmsg;
00089       return result;
00090     }
00091   }
00092 
00093   return result;
00094 }
00095 
00096 StatusCode
00097 Sequencer::reinitialize()
00098 {
00099   // Bypass the loop if this sequencer is disabled
00100   if ( isEnabled( ) ) {
00101 
00102     // Loop over all members calling their reinitialize functions
00103     // if they are not disabled.
00104     std::vector<Algorithm*>* theAlgms = subAlgorithms( );
00105     std::vector<Algorithm*>::iterator it;
00106     std::vector<Algorithm*>::iterator itend = theAlgms->end( );
00107     for (it = theAlgms->begin(); it != itend; it++) {
00108       Algorithm* theAlgorithm = (*it);
00109       if ( ! theAlgorithm->isEnabled( ) ) {
00110         theAlgorithm->reinitialize( ).ignore();
00111       }
00112     }
00113     // Loop over all branch members calling their reinitialize functions
00114     // if they are not disabled.
00115     theAlgms = branchAlgorithms( );
00116     itend    = theAlgms->end( );
00117     for (it = theAlgms->begin(); it != itend; it++) {
00118       Algorithm* theAlgorithm = (*it);
00119       if ( ! theAlgorithm->isEnabled( ) ) {
00120         theAlgorithm->reinitialize( ).ignore();
00121       }
00122     }
00123 
00124   }
00125   return StatusCode::SUCCESS;
00126 }
00127 
00128 StatusCode
00129 Sequencer::execute()
00130 {
00131   StatusCode result = StatusCode::SUCCESS;
00132   MsgStream log( msgSvc( ), name( ) );
00133 
00134   log << MSG::DEBUG << name( ) << " Sequencer::execute( )" << endmsg;
00135 
00136   // Bypass the loop if this sequencer is disabled or has already been executed
00137   if ( isEnabled( ) && ! isExecuted( ) ) {
00138     Algorithm* lastAlgorithm;
00139     result = execute( subAlgorithms( ), m_isInverted, lastAlgorithm );
00140     if ( result.isSuccess( ) ) {
00141       bool passed = filterPassed( );
00142       if ( ! passed && ! isStopOverride( ) ) {
00143 
00144         // Filter failed and stop override not set. Execute the
00145         // branch if there is one associated with the filter
00146         // algorithm that failed. Note that the first member on
00147         // the branch is the failing algorithm and so should
00148         // be skipped.
00149         std::vector<Algorithm*>* theAlgs = branchAlgorithms( );
00150         if ( theAlgs->size( ) > 0 ) {
00151           Algorithm* branchAlgorithm = (*theAlgs)[0];
00152           if ( lastAlgorithm == branchAlgorithm ) {
00153 
00154             // Branch specified - Loop over branch members
00155             result = execute( branchAlgorithms( ),
00156                               m_isBranchInverted,
00157                               lastAlgorithm, 1 );
00158             if ( result.isSuccess( ) ) {
00159 
00160               // The final filter passed state will be set true if either
00161               // of the main or branches passed, otherwise false.
00162 
00163               // Save the branch  filter passed state.
00164               setBranchFilterPassed( filterPassed( ) ).ignore();
00165             }
00166           }
00167         }
00168       }
00169     }
00170 
00171     // Prevent multiple executions of this sequencer for the current event
00172     setExecuted( true );
00173   }
00174   return result;
00175 }
00176 
00177 StatusCode
00178 Sequencer::finalize()
00179 {
00180   // Loop over all branch members calling their finalize functions
00181   // if they are not disabled. Note that the Algorithm::sysFinalize
00182   // function already does this for the main members.
00183   std::vector<Algorithm*>* theAlgs = branchAlgorithms( );
00184   std::vector<Algorithm*>::iterator it;
00185   std::vector<Algorithm*>::iterator itend = theAlgs->end( );
00186   for (it = theAlgs->begin(); it != itend; it++) {
00187     Algorithm* theAlgorithm = (*it);
00188     if (theAlgorithm->sysFinalize( ).isFailure()) {
00189       MsgStream log( msgSvc( ), name( ) );
00190       log << MSG::ERROR << "Unable to finalize Algorithm "
00191           << theAlgorithm->name() << endmsg;
00192     }
00193   }
00194   return StatusCode::SUCCESS;
00195 }
00196 
00197 StatusCode
00198 Sequencer::start()
00199 {
00200   StatusCode result = StatusCode::SUCCESS;
00201   MsgStream log( msgSvc( ), name( ) );
00202 
00203   std::vector<Algorithm*>* theAlgs;
00204   std::vector<Algorithm*>::iterator it;
00205   std::vector<Algorithm*>::iterator itend;
00206 
00207   // Loop over all sub-algorithms
00208   theAlgs = subAlgorithms( );
00209   itend   = theAlgs->end( );
00210   for (it = theAlgs->begin(); it != itend; it++) {
00211     Algorithm* theAlgorithm = (*it);
00212     result = theAlgorithm->sysStart( );
00213     if( result.isFailure() ) {
00214       log << MSG::ERROR << "Unable to start Algorithm " << theAlgorithm->name() << endmsg;
00215       return result;
00216     }
00217   }
00218 
00219   // Loop over all branches
00220   theAlgs = branchAlgorithms( );
00221   itend   = theAlgs->end( );
00222   for (it = theAlgs->begin(); it != itend; it++) {
00223     Algorithm* theAlgorithm = (*it);
00224     result = theAlgorithm->sysStart( );
00225     if( result.isFailure() ) {
00226       log << MSG::ERROR << "Unable to start Algorithm " << theAlgorithm->name() << endmsg;
00227       return result;
00228     }
00229   }
00230 
00231   return result;
00232 }
00233 
00234 StatusCode
00235 Sequencer::stop()
00236 {
00237   // Loop over all branch members calling their finalize functions
00238   // if they are not disabled.
00239   std::vector<Algorithm*>* theAlgs;
00240   std::vector<Algorithm*>::iterator it;
00241   std::vector<Algorithm*>::iterator itend;
00242 
00243   theAlgs = subAlgorithms( );
00244   itend   = theAlgs->end( );
00245   for (it = theAlgs->begin(); it != itend; it++) {
00246     Algorithm* theAlgorithm = (*it);
00247     if (theAlgorithm->sysStop( ).isFailure()) {
00248       MsgStream log( msgSvc( ), name( ) );
00249       log << MSG::ERROR << "Unable to stop Algorithm "
00250           << theAlgorithm->name() << endmsg;
00251     }
00252   }
00253 
00254   theAlgs = branchAlgorithms( );
00255   itend   = theAlgs->end( );
00256   for (it = theAlgs->begin(); it != itend; it++) {
00257     Algorithm* theAlgorithm = (*it);
00258     if (theAlgorithm->sysStop( ).isFailure()) {
00259       MsgStream log( msgSvc( ), name( ) );
00260       log << MSG::ERROR << "Unable to stop Algorithm "
00261           << theAlgorithm->name() << endmsg;
00262     }
00263   }
00264   return StatusCode::SUCCESS;
00265 }
00266 
00267 StatusCode
00268 Sequencer::beginRun()
00269 {
00270   StatusCode result = StatusCode::SUCCESS;
00271   MsgStream log( msgSvc( ), name( ) );
00272 
00273   // Bypass the loop if this sequencer is disabled
00274   if ( isEnabled( ) ) {
00275 
00276     // Loop over all members calling their sysInitialize functions
00277     // if they are not disabled. Note that the Algoriithm::sysInitialize
00278     // function protects this from affecting Algorithms that have already
00279     // been initialized.
00280     std::vector<Algorithm*>* theAlgs = subAlgorithms( );
00281     std::vector<Algorithm*>::iterator it;
00282     std::vector<Algorithm*>::iterator itend = theAlgs->end( );
00283     for (it = theAlgs->begin(); it != itend; it++) {
00284       Algorithm* theAlgorithm = (*it);
00285       result = theAlgorithm->sysInitialize( );
00286       if( result.isFailure() ) {
00287         log << MSG::ERROR << "Unable to initialize Algorithm " << theAlgorithm->name() << endmsg;
00288         break;
00289       }
00290       result = theAlgorithm->sysStart( );
00291       if( result.isFailure() ) {
00292         log << MSG::ERROR << "Unable to start Algorithm " << theAlgorithm->name() << endmsg;
00293         break;
00294       }
00295     }
00296 
00297     // Loop over all members calling their beginRun functions
00298     // if they are not disabled.
00299     for (it = theAlgs->begin(); it != itend; it++) {
00300       Algorithm* theAlgorithm = (*it);
00301       if ( ! theAlgorithm->isEnabled( ) ) {
00302         theAlgorithm->beginRun( ).ignore();
00303       }
00304     }
00305 
00306     // Loop over all branch members calling their sysInitialize functions
00307     // if they are not disabled. Note that the Algoriithm::sysInitialize
00308     // function protects this from affecting Algorithms that have already
00309     // been initialized.
00310     theAlgs = branchAlgorithms( );
00311     itend   = theAlgs->end( );
00312     for (it = theAlgs->begin(); it != itend; it++) {
00313       Algorithm* theAlgorithm = (*it);
00314       result = theAlgorithm->sysInitialize( );
00315       if( result.isFailure() ) {
00316         log << MSG::ERROR << "Unable to initialize Algorithm " << theAlgorithm->name() << endmsg;
00317         break;
00318       }
00319       result = theAlgorithm->sysStart( );
00320       if( result.isFailure() ) {
00321         log << MSG::ERROR << "Unable to start Algorithm " << theAlgorithm->name() << endmsg;
00322         break;
00323       }
00324     }
00325 
00326     // Loop over all branch members calling their beginRun functions
00327     // if they are not disabled.
00328     for (it = theAlgs->begin(); it != itend; it++) {
00329       Algorithm* theAlgorithm = (*it);
00330       if ( ! theAlgorithm->isEnabled( ) ) {
00331         theAlgorithm->beginRun( ).ignore();
00332       }
00333     }
00334   }
00335   return StatusCode::SUCCESS;
00336 }
00337 
00338 StatusCode
00339 Sequencer::endRun()
00340 {
00341   // Bypass the loop if this sequencer is disabled
00342   if ( isEnabled( ) ) {
00343 
00344     // Loop over all members calling their endRun functions
00345     // if they are not disabled.
00346     std::vector<Algorithm*>* theAlgms = subAlgorithms( );
00347     std::vector<Algorithm*>::iterator it;
00348     std::vector<Algorithm*>::iterator itend = theAlgms->end( );
00349     for (it = theAlgms->begin(); it != itend; it++) {
00350       Algorithm* theAlgorithm = (*it);
00351       if ( ! theAlgorithm->isEnabled( ) ) {
00352         theAlgorithm->endRun( ).ignore();
00353       }
00354     }
00355     // Loop over all branch members calling their endRun functions
00356     // if they are not disabled.
00357     theAlgms = branchAlgorithms( );
00358     itend    = theAlgms->end( );
00359     for (it = theAlgms->begin(); it != itend; it++) {
00360       Algorithm* theAlgorithm = (*it);
00361       if ( ! theAlgorithm->isEnabled( ) ) {
00362         theAlgorithm->endRun( ).ignore();
00363       }
00364     }
00365   }
00366   return StatusCode::SUCCESS;
00367 }
00368 
00369 void
00370 Sequencer::resetExecuted( )
00371 {
00372   Algorithm::resetExecuted( );
00373 
00374   // Loop over all members calling their resetExecuted functions
00375   // if they are not disabled.
00376   std::vector<Algorithm*>* subAlgms = subAlgorithms( );
00377   std::vector<Algorithm*>::iterator it;
00378   std::vector<Algorithm*>::iterator itend = subAlgms->end( );
00379   for (it = subAlgms->begin(); it != itend; it++) {
00380     Algorithm* theAlgorithm = (*it);
00381     theAlgorithm->resetExecuted( );
00382   }
00383 
00384   // Loop over all branch members calling their resetExecuted functions
00385   // if they are not disabled.
00386   subAlgms = branchAlgorithms( );
00387   itend    = subAlgms->end( );
00388   for (it = subAlgms->begin(); it != itend; it++) {
00389     Algorithm* theAlgorithm = (*it);
00390     theAlgorithm->resetExecuted( );
00391   }
00392 
00393   // Reset the branch filter passed flag
00394   m_branchFilterPassed = false;
00395 }
00396 
00397 bool
00398 Sequencer::branchFilterPassed( ) const
00399 {
00400   return m_branchFilterPassed;
00401 }
00402 
00403 StatusCode
00404 Sequencer::setBranchFilterPassed( bool state )
00405 {
00406   m_branchFilterPassed = state;
00407   return StatusCode::SUCCESS;
00408 }
00409 
00410 bool
00411 Sequencer::isStopOverride( ) const
00412 {
00413   return m_stopOverride.value( );
00414 }
00415 
00416 StatusCode
00417 Sequencer::append( Algorithm* pAlgorithm )
00418 {
00419   StatusCode result = append( pAlgorithm, subAlgorithms( ) );
00420   return result;
00421 }
00422 
00423 StatusCode
00424 Sequencer::appendToBranch( Algorithm* pAlgorithm )
00425 {
00426   StatusCode result = append( pAlgorithm, branchAlgorithms( ) );
00427   return result;
00428 }
00429 
00430 StatusCode
00431 Sequencer::createAndAppend( const std::string& type,
00432                             const std::string& name,
00433                             Algorithm*& pAlgorithm )
00434 {
00435   StatusCode result = createAndAppend( type, name, pAlgorithm, subAlgorithms( ) );
00436   return result;
00437 }
00438 
00439 StatusCode
00440 Sequencer::createAndAppendToBranch( const std::string& type,
00441                                     const std::string& name,
00442                                     Algorithm*& pAlgorithm )
00443 {
00444   StatusCode result = createAndAppend( type, name, pAlgorithm, branchAlgorithms( ) );
00445   return result;
00446 }
00447 
00448 StatusCode
00449 Sequencer::remove( Algorithm* pAlgorithm )
00450 {
00451   std::string theName = pAlgorithm->name( );
00452   StatusCode result = remove( theName );
00453   return result;
00454 }
00455 
00456 StatusCode
00457 Sequencer::remove( const std::string& algname )
00458 {
00459   StatusCode result = remove( algname, subAlgorithms( ) );
00460   return result;
00461 }
00462 
00463 StatusCode
00464 Sequencer::removeFromBranch( Algorithm* pAlgorithm )
00465 {
00466   std::string theName = pAlgorithm->name( );
00467   StatusCode result = removeFromBranch( theName );
00468   return result;
00469 }
00470 
00471 StatusCode
00472 Sequencer::removeFromBranch( const std::string& algname )
00473 {
00474   StatusCode result = remove( algname, branchAlgorithms( ) );
00475   return result;
00476 }
00477 
00478 std::vector<Algorithm*>*
00479 Sequencer::branchAlgorithms( ) const {
00480   return m_branchAlgs;
00481 }
00482 
00483 StatusCode
00484 Sequencer::decodeMemberNames( )
00485 {
00486   StatusCode result = StatusCode::SUCCESS;
00487 
00488   // Decode the membership list
00489   result = decodeNames( m_names,
00490                         subAlgorithms( ),
00491                         m_isInverted );
00492 
00493   return result;
00494 }
00495 
00496 void
00497 Sequencer::membershipHandler( Property& /* theProp */ )
00498 {
00499   if ( isInitialized() ) decodeMemberNames();
00500 }
00501 
00502 StatusCode
00503 Sequencer::decodeBranchMemberNames( )
00504 {
00505   StatusCode result = StatusCode::SUCCESS;
00506 
00507   // Decode the branch membership list
00508   result = decodeNames( m_branchNames,
00509                         branchAlgorithms( ),
00510                         m_isBranchInverted );
00511 
00512   return result;
00513 }
00514 
00515 void
00516 Sequencer::branchMembershipHandler( Property& /* theProp */ )
00517 {
00518   if ( isInitialized() ) decodeBranchMemberNames();
00519 }
00520 
00525 StatusCode
00526 Sequencer::append( Algorithm* pAlgorithm,
00527                    std::vector<Algorithm*>* theAlgs )
00528 {
00529   StatusCode result = StatusCode::SUCCESS;
00530   // Check that the specified algorithm doesn't already exist in the membership list
00531   std::vector<Algorithm*>::iterator it;
00532   std::vector<Algorithm*>::iterator itend = theAlgs->end( );
00533   for (it = theAlgs->begin(); it != itend; it++) {
00534     Algorithm* theAlgorithm = (*it);
00535     if ( theAlgorithm == pAlgorithm ) {
00536       result = StatusCode::FAILURE;
00537       break;
00538     }
00539   }
00540   if ( result.isSuccess( ) ) {
00541     theAlgs->push_back( pAlgorithm );
00542     pAlgorithm->addRef();
00543   }
00544   return result;
00545 }
00546 
00547 StatusCode
00548 Sequencer::createAndAppend( const std::string& type,
00549                                 const std::string& algName,
00550                                 Algorithm*& pAlgorithm,
00551                                 std::vector<Algorithm*>* theAlgs )
00552 {
00553   StatusCode result = StatusCode::FAILURE;
00554   MsgStream log( msgSvc( ), name( ) );
00555   SmartIF<IAlgManager> theAlgMgr(serviceLocator()->service("ApplicationMgr"));
00556   if ( theAlgMgr.isValid() ) {
00557     IAlgorithm* tmp;
00558     result = theAlgMgr->createAlgorithm( type, algName, tmp );
00559     if ( result.isSuccess( ) ) {
00560       try{
00561         pAlgorithm = dynamic_cast<Algorithm*>(tmp);
00562         theAlgs->push_back( pAlgorithm );
00563       } catch(...){
00564         log << MSG::ERROR << "Unable to create Algorithm " << algName << endmsg;
00565         result = StatusCode::FAILURE;
00566       }
00567     }
00568   }
00569   return result;
00570 }
00571 
00572 StatusCode
00573 Sequencer::decodeNames( StringArrayProperty& theNames,
00574                         std::vector<Algorithm*>* theAlgs,
00575                         std::vector<bool>& theLogic )
00576 {
00577   StatusCode result;
00578   MsgStream log( msgSvc( ), name( ) );
00579   SmartIF<IAlgManager> theAlgMgr(serviceLocator()->service("ApplicationMgr"));
00580   if ( theAlgMgr.isValid() ) {
00581     // Clear the existing list of algorithms
00582     theAlgs->clear( );
00583 
00584     // Build the list of member algorithms from the contents of the
00585     // theNames list.
00586     const std::vector<std::string>& theNameVector = theNames.value( );
00587     std::vector<std::string>::const_iterator it;
00588     std::vector<std::string>::const_iterator itend = theNameVector.end( );
00589     for (it = theNameVector.begin(); it != itend; it++) {
00590 
00591       // Parse the name for a syntax of the form:
00592       //
00593       // <type>/<name>
00594       //
00595       // Where <name> is the algorithm instance name, and <type> is the
00596       // algorithm class type (being a subclass of Algorithm).
00597       const Gaudi::Utils::TypeNameString typeName(*it);
00598       std::string theName = typeName.name();
00599       std::string theType = typeName.type();
00600 
00601       // Parse the name for a syntax of the form:
00602       //
00603       // <name>:invert
00604       //
00605       // Where <name> is the algorithm instance name and ":invert"
00606       // indicates that the filter passed logic is inverted.
00607       bool isInverted = false;
00608       std::string::size_type invert = theName.find_first_of( ":" );
00609       // Skip all occurrences of "::" (allow namespaces)
00610       while ( std::string::npos != invert
00611               && invert < (theName.size() - 1) && theName[invert+1] == ':' )
00612         invert = theName.find_first_of( ":", invert+2 );
00613       if ( std::string::npos != invert ) {
00614         if ( theName == theType ) {
00615           // This means that we got something like "Type:invert",
00616           // so we have to strip the ":invert" from the type too.
00617           theType = theType.substr( 0, invert );
00618         }
00619         theName = theName.substr( 0, invert );
00620         isInverted = true;
00621       }
00622       // Check whether the supplied name corresponds to an existing
00623       // Algorithm object.
00624       SmartIF<IAlgorithm>& theIAlg = theAlgMgr->algorithm(theName, false);
00625       Algorithm*  theAlgorithm = 0;
00626       StatusCode status = StatusCode::SUCCESS;
00627       if ( theIAlg.isValid() ) {
00628         try{
00629           theAlgorithm = dynamic_cast<Algorithm*>(theIAlg.get());
00630         } catch(...){
00631           log << MSG::WARNING << theName << " is not an Algorithm - Failed dynamic cast" << endmsg;
00632           theAlgorithm = 0; // release
00633         }
00634       }
00635       if ( theAlgorithm ) {
00636 
00637         // The specified Algorithm already exists - just append it to the membership list.
00638         status = append( theAlgorithm, theAlgs );
00639         if ( status.isSuccess( ) ) {
00640           log << MSG::DEBUG << theName << " already exists - appended to member list" << endmsg;
00641         } else {
00642           log << MSG::WARNING << theName << " already exists - append failed!!!" << endmsg;
00643           result = StatusCode::FAILURE;
00644         }
00645       } else {
00646 
00647         // The specified name doesn't exist - create a new object of the specified type
00648         // and append it to the membership list.
00649         status = createAndAppend( theType, theName, theAlgorithm, theAlgs );
00650         if ( status.isSuccess( ) ) {
00651           log << MSG::DEBUG << theName << " doesn't exist - created and appended to member list" << endmsg;
00652         } else {
00653           log << MSG::WARNING << theName << " doesn't exist - creation failed!!!" << endmsg;
00654           result = StatusCode::FAILURE;
00655         }
00656       }
00657       if ( status.isSuccess( ) ) {
00658         theLogic.push_back( isInverted );
00659       }
00660     }
00661 
00662   }
00663   // Print membership list
00664   if ( result.isSuccess() && theAlgs->size() != 0 ) {
00665     log << MSG::INFO << "Member list: ";
00666     std::vector<Algorithm*>::iterator ai = theAlgs->begin();
00667     std::vector<bool>::iterator li = theLogic.begin();
00668     for ( ; ai != theAlgs->end(); ++ai, ++li ) {
00669 
00670       if ( ai != theAlgs->begin() ) log << ", ";
00671 
00672       if ( (*ai)->name() == System::typeinfoName(typeid(**ai)) )
00673         log << (*ai)->name();
00674       else
00675         log << System::typeinfoName(typeid(**ai)) << "/" << (*ai)->name();
00676 
00677       if (*li) log << ":invert";
00678     }
00679     log << endmsg;
00680   }
00681   return result;
00682 }
00683 
00684 StatusCode
00685 Sequencer::execute( std::vector<Algorithm*>* theAlgs,
00686                     std::vector<bool>& theLogic,
00687                     Algorithm*& lastAlgorithm,
00688                     unsigned int first )
00689 {
00690   StatusCode result = StatusCode::SUCCESS;
00691 
00692   // Loop over all algorithms calling their execute functions if they
00693   // are (a) not disabled, and (b) aren't already executed. Note that
00694   // in the latter case the filter state is still examined. Terminate
00695   // the loop if an algorithm indicates that it's filter didn't pass.
00696   unsigned int size = theAlgs->size( );
00697   for (unsigned int i = first; i < size; i++) {
00698     lastAlgorithm = (*theAlgs)[i];
00699     result = executeMember( lastAlgorithm );
00700     if ( result.isSuccess( ) ) {
00701 
00702       // Take the filter passed status of this algorithm as my own status.
00703       // Note that we take into account inverted logic.
00704       bool passed = lastAlgorithm->filterPassed( );
00705       bool isInverted = theLogic[i];
00706       if ( isInverted ) {
00707         passed = ! passed;
00708       }
00709       setFilterPassed( passed );
00710 
00711       // The behaviour when the filter fails depends on the StopOverride property.
00712       // The default action is to stop processing, but this default can be
00713       // overridden by setting the "StopOverride" property to true.
00714       if ( ! isStopOverride( ) ) {
00715         if ( ! passed ) break;
00716       }
00717     } else {
00718       break;
00719     }
00720   }
00721   return result;
00722 }
00723 
00724 StatusCode
00725 Sequencer::executeMember( Algorithm* theAlgorithm )
00726 {
00727   StatusCode result = StatusCode::SUCCESS;
00728   if ( theAlgorithm->isEnabled( ) ) {
00729     if ( ! theAlgorithm->isExecuted( ) ) {
00730       result = theAlgorithm->sysExecute( );
00731 
00732       // Set the executed state of the algorithm.
00733       // I think this should be done by the algorithm itself, but just in case...
00734       theAlgorithm->setExecuted( true );
00735     }
00736   }
00737   return result;
00738 }
00739 
00740 StatusCode
00741 Sequencer::remove( const std::string& algname, std::vector<Algorithm*>* theAlgs )
00742 {
00743   MsgStream log( msgSvc( ), name( ) );
00744   StatusCode result = StatusCode::FAILURE;
00745 
00746   // Test that the algorithm exists in the member list
00747   std::vector<Algorithm*>::iterator it;
00748   std::vector<Algorithm*>::iterator itend = theAlgs->end( );
00749   for (it = theAlgs->begin(); it != itend; it++) {
00750     Algorithm* theAlgorithm = (*it);
00751     if ( theAlgorithm->name( ) == algname ) {
00752 
00753       // Algorithm with specified name exists in the algorithm list - remove it
00754       // THIS ISN'T IMPLEMENTED YET!!!!
00755       log << MSG::INFO <<"Sequencer::remove( ) isn't implemented yet!!!!!" << endmsg;
00756       result = StatusCode::SUCCESS;
00757       break;
00758     }
00759   }
00760   return result;
00761 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Tue May 10 2011 18:53:23 for Gaudi Framework, version v22r2 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004