Gaudi Framework, version v21r8

Home   Generated: 17 Mar 2010

HistorySvc.cpp

Go to the documentation of this file.
00001 // $Id: HistorySvc.cpp,v 1.18 2008/06/04 12:35:15 marcocle Exp $
00002 
00003 #ifndef GAUDISVC_FASTHISTORYSVC_H
00004  #include "HistorySvc.h"
00005 #endif
00006 
00007 #include "GaudiKernel/HistoryObj.h"
00008 
00009 #include "GaudiKernel/JobHistory.h"
00010 #include "GaudiKernel/AlgorithmHistory.h"
00011 #include "GaudiKernel/AlgToolHistory.h"
00012 #include "GaudiKernel/DataHistory.h"
00013 #include "GaudiKernel/ServiceHistory.h"
00014 
00015 #ifndef KERNEL_SVCFACTORY_H
00016  #include "GaudiKernel/SvcFactory.h"
00017 #endif
00018 #ifndef GAUDIKERNEL_ISVCLOCATOR_H
00019  #include "GaudiKernel/ISvcLocator.h"
00020 #endif
00021 
00022 #include "GaudiKernel/System.h"
00023 #include "GaudiKernel/Bootstrap.h"
00024 #include "GaudiKernel/IAlgManager.h"
00025 #include "GaudiKernel/IAlgorithm.h"
00026 #include "GaudiKernel/Algorithm.h"
00027 #include "GaudiKernel/IAlgTool.h"
00028 #include "GaudiKernel/AlgTool.h"
00029 #include "GaudiKernel/IService.h"
00030 #include "GaudiKernel/IJobOptionsSvc.h"
00031 #include "GaudiKernel/IAppMgrUI.h"
00032 #include "GaudiKernel/IIncidentSvc.h"
00033 #include "GaudiKernel/IToolSvc.h"
00034 #include "GaudiKernel/ServiceHandle.h"
00035 
00036 #include "GaudiKernel/IAlgContextSvc.h"
00037 
00038 #include <iostream>
00039 #include <fstream>
00040 #include <sstream>
00041 #include <limits>
00042 
00043 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00044 DECLARE_SERVICE_FACTORY(HistorySvc)
00045 
00046 using namespace std;
00047 
00048 //
00050 //
00051 
00052 struct DHH {
00053   CLID id;
00054   std::string key;
00055 
00056   DHH(const CLID& i, const std::string& k):id(i), key(k) {}
00057 
00058   bool operator < ( DHH const &rhs ) const {
00059     if (id != rhs.id) {
00060       return (id < rhs.id);
00061     } else {
00062       return (key < rhs.key);
00063     }
00064   }
00065 };
00066 
00067 void fenv_dummy(char**) {}
00068 
00069 HistorySvc::HistorySvc( const std::string& name, ISvcLocator* svc )
00070   : base_class( name, svc ),
00071     m_isInitialized(false),
00072     m_dump(false),
00073     p_algCtxSvc(0),
00074     m_jobHistory(0),
00075     m_outputFile(""),
00076     m_incidentSvc(0),
00077     m_log(msgSvc(), name )
00078 
00079 {
00080     declareProperty("Dump",m_dump);
00081     declareProperty("Activate", m_activate=true);
00082     declareProperty("OutputFile",m_outputFile);
00083 
00084     // hack to bring in environ
00085     vector<string> envtmp = System::getEnv();
00086     envtmp.size(); // prevent icc remark #177: X declared but never referenced
00087 }
00088 
00089 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00090 
00091 HistorySvc::~HistorySvc() {
00092   delete m_jobHistory;
00093 }
00094 
00095 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00096 
00097 StatusCode HistorySvc::reinitialize() {
00098 
00099   clearState();
00100 
00101   m_state = Gaudi::StateMachine::OFFLINE;
00102 
00103   return initialize();
00104 
00105 }
00106 
00107 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00108 
00109 void HistorySvc::clearState() {
00110   m_algs.clear();
00111   std::map<const Algorithm*, AlgorithmHistory*>::iterator algitr;
00112   for (algitr = m_algmap.begin(); algitr != m_algmap.end(); ++algitr) {
00113     AlgorithmHistory* h = algitr->second;
00114     (const_cast<Algorithm*> (algitr->first))->release();
00115     delete h;
00116   }
00117   m_algmap.clear();
00118 
00119   m_ialgtools.clear();
00120   m_algtools.clear();
00121   std::map<const AlgTool*, AlgToolHistory*>::iterator atitr;
00122   for (atitr=m_algtoolmap.begin(); atitr != m_algtoolmap.end(); ++atitr) {
00123     (const_cast<AlgTool*> (atitr->first))->release();
00124     delete atitr->second;
00125   }
00126   m_algtoolmap.clear();
00127 
00128   m_svcs.clear();
00129   std::map<const IService*, ServiceHistory*>::iterator svitr;
00130   for (svitr = m_svcmap.begin(); svitr != m_svcmap.end(); ++svitr) {
00131     (const_cast<IService*> (svitr->first))->release();
00132     delete svitr->second;
00133   }
00134   m_svcmap.clear();
00135 }
00136 
00137 
00138 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00139 
00140 StatusCode HistorySvc::initialize() {
00141 
00142   StatusCode status = Service::initialize();
00143   m_log.setLevel( m_outputLevel.value() );
00144 
00145   if (status.isFailure()) {
00146 #ifndef NDEBUG
00147     m_log << MSG::DEBUG << "Failed to initialize the base class (Service)"
00148           << endmsg;
00149 #endif
00150     return status;
00151   }
00152 
00153 #ifndef NDEBUG
00154   m_log << MSG::DEBUG << "Initializing HistorySvc" << endmsg;
00155 #endif
00156 
00157   if (!m_activate) return StatusCode::SUCCESS;
00158 
00159   static const bool CREATEIF(true);
00160 
00161   if ( service("AlgContextSvc",p_algCtxSvc,CREATEIF).isFailure() ) {
00162     m_log << MSG::ERROR << "unable to get the AlgContextSvc" << endmsg;
00163     return StatusCode::FAILURE;
00164   }
00165 
00166   if (service("IncidentSvc", m_incidentSvc, CREATEIF).isFailure()) {
00167     m_log << MSG::ERROR << "unable to get the IncidentSvc" << endmsg;
00168     return StatusCode::FAILURE;
00169   }
00170 
00171   // create a weak dependency on the ToolSvc, so that it doesn't get deleted
00172   // before we're done with it in finalize
00173   if (ServiceHandle<IToolSvc>("ToolSvc/ToolSvc",name()).retrieve().isFailure()) {
00174     m_log << MSG::ERROR << "could not retrieve the ToolSvc handle !"
00175           << endmsg;
00176     return StatusCode::FAILURE;
00177   }
00178 
00179   // add listener to be triggered by first BeginEvent with low priority
00180   // so it gets called first
00181   const bool rethrow = false;
00182   const bool oneShot = true; // make the listener called only once
00183   m_incidentSvc->addListener(this,IncidentType::BeginEvent,
00184                              std::numeric_limits<long>::min(),rethrow,oneShot);
00185 
00186   m_isInitialized = true;
00187 
00188   return StatusCode::SUCCESS;
00189 
00190 }
00191 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00192 
00193 StatusCode HistorySvc::captureState() {
00194 
00195   if (m_jobHistory == 0) {
00196     m_jobHistory = new JobHistory;
00197     IJobOptionsSvc *jo;
00198     if (service("JobOptionsSvc",jo).isFailure()) {
00199        m_log << MSG::ERROR
00200              << "Could not get jobOptionsSvc - "
00201              << "not adding properties to JobHistory" << endmsg;
00202     } else {
00203 
00204       bool foundAppMgr(false);
00205 
00206       std::vector<std::string> clients = jo->getClients();
00207       std::vector<std::string>::const_iterator it;
00208       std::vector<const Property*>::const_iterator itr;
00209       for (it=clients.begin(); it!=clients.end(); ++it) {
00210         if (*it == "ApplicationMgr") {
00211           foundAppMgr = true;
00212         }
00213         const std::vector<const Property*> *props = jo->getProperties(*it);
00214         for (itr=props->begin(); itr != props->end(); ++itr) {
00215           m_jobHistory->addProperty( *it, *itr );
00216         }
00217       }
00218 
00219       if (!foundAppMgr) {
00220         IProperty *ap;
00221         if (service("ApplicationMgr",ap).isFailure()) {
00222           m_log << MSG::ERROR << "could not get the ApplicationMgr" << endmsg;
00223         } else {
00224           std::vector<Property*>::const_iterator itr2;
00225           const std::vector<Property*> props = ap->getProperties();
00226           for (itr2=props.begin(); itr2 != props.end(); ++itr2) {
00227             m_jobHistory->addProperty( "ApplicationMgr", *itr2 );
00228           }
00229         }
00230       }
00231 
00232     }
00233   }
00234 
00236 
00237   StatusCode sc;
00238   IAlgManager* algMgr = 0;
00239   sc = Gaudi::svcLocator()->queryInterface( IAlgManager::interfaceID(),
00240                                             pp_cast<void>(&algMgr) );
00241   if (sc.isFailure()) {
00242     m_log << MSG::ERROR << "Could not get AlgManager" << endmsg;
00243     return StatusCode::FAILURE;
00244   } else {
00245 
00246     std::list<IAlgorithm*> algs;
00247     algs = algMgr->getAlgorithms();
00248     std::list<IAlgorithm*>::const_iterator itr;
00249     for (itr=algs.begin(); itr!=algs.end(); ++itr) {
00250       Algorithm* alg = dynamic_cast<Algorithm*> (*itr);
00251       if (alg == 0) {
00252         m_log << MSG::WARNING << "Algorithm " << (*itr)->name()
00253               << " does not inherit from Algorithm. Not registering it."
00254               << endmsg;
00255       } else {
00256         registerAlg( *alg ).ignore();
00257       }
00258     }
00259 
00260     m_log << MSG::INFO;
00261     m_log << "Registered " << algs.size() << " Algorithms" << endmsg;
00262 
00263   }
00264 
00266 
00267   m_isInitialized = true;
00268   std::set<const IAlgTool*>::const_iterator itra;
00269   for (itra = m_ialgtools.begin(); itra != m_ialgtools.end(); ++itra) {
00270     (const_cast<IAlgTool*>(*itra))->addRef();
00271     registerAlgTool(**itra).ignore();
00272   }
00273 
00274   m_log << MSG::INFO << "Registered " << m_algtools.size() << " AlgTools"
00275         << endmsg;
00276 
00278 
00279   std::list<IService*> svcs = Gaudi::svcLocator()->getServices();
00280 
00281   std::list<IService*>::const_iterator itrs;
00282   for (itrs=svcs.begin(); itrs!=svcs.end(); ++itrs) {
00283     (*itrs)->addRef();
00284     registerSvc(**itrs).ignore();
00285   }
00286 
00287   m_log << MSG::INFO;
00288   m_log << "Registered " << svcs.size() << " Services" << endmsg;
00289 
00290   return StatusCode::SUCCESS;
00291 
00292 
00293 }
00294 
00295 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00296 
00297 StatusCode HistorySvc::finalize() {
00298 
00299   if (!m_activate) return StatusCode::SUCCESS;
00300 
00301   if (m_dump) {
00302     listProperties().ignore();
00303   }
00304 
00305   if (m_outputFile != "") {
00306     std::ofstream ofs;
00307     ofs.open(m_outputFile.c_str());
00308     if (!ofs) {
00309       m_log << MSG::ERROR << "Unable to open output file \"m_outputFile\""
00310             << endmsg;
00311     } else {
00312 
00313       //      dumpProperties(ofs);
00314       dumpState(ofs);
00315 
00316       ofs.close();
00317     }
00318   }
00319 
00320   clearState();
00321 
00322   StatusCode status = Service::finalize();
00323 
00324   if ( status.isSuccess() )
00325     m_log << MSG::INFO << "Service finalised successfully" << endmsg;
00326 
00327   return status;
00328 
00329 }
00330 
00331 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00332 
00333 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00334 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00335 
00336 StatusCode
00337 HistorySvc::registerAlg(const Algorithm &alg) {
00338 
00339   JobHistory *job = getJobHistory();
00340   if (m_algmap.find(&alg) != m_algmap.end()) {
00341     m_log << MSG::WARNING << "Algorithm " << alg.name()
00342           << " already registered with HistorySvc" << endmsg;
00343     return StatusCode::SUCCESS;
00344   }
00345 
00346   (const_cast<Algorithm*>(&alg))->addRef();
00347 
00348   m_algs.insert(&alg);
00349 
00350   AlgorithmHistory *algHist = new AlgorithmHistory(alg, job);
00351   m_algmap[&alg] = algHist;
00352 
00353 #ifndef NDEBUG
00354   m_log << MSG::DEBUG << "Registering algorithm: ";
00355   m_log.setColor(MSG::CYAN);
00356   m_log << alg.name() << endmsg;
00357   m_log.resetColor();
00358 #endif
00359 
00360   return StatusCode(StatusCode::SUCCESS,true);
00361 
00362 }
00363 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00364 
00365 StatusCode
00366 HistorySvc::listProperties(const Algorithm &alg) const {
00367 
00368   m_log << MSG::INFO << "Dumping properties for " << alg.name() << endl;
00369 
00370   AlgorithmHistory *hist = getAlgHistory( alg );
00371 
00372   if (hist == 0) {
00373     return StatusCode::FAILURE;
00374   }
00375 
00376   ostringstream ost;
00377   ost << *hist;
00378 
00379   std::string str = ost.str();
00380 
00381   m_log << MSG::INFO << alg.name() << " --> " << endl << str << endmsg;
00382 
00383   return StatusCode(StatusCode::SUCCESS,true);
00384 
00385 }
00386 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00387 
00388 void
00389 HistorySvc::dumpProperties(const Algorithm &alg, std::ofstream& ofs) const {
00390 
00391   AlgorithmHistory *hist = getAlgHistory( alg );
00392 
00393   if (hist == 0) {
00394     return;
00395   }
00396 
00397   AlgorithmHistory::PropertyList::const_iterator itr;
00398   for (itr=hist->properties().begin(); itr!=hist->properties().end(); ++itr) {
00399     ofs << alg.name() << "  " << dumpProp(*itr) << std::endl;
00400   }
00401 
00402 }
00403 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00404 
00405 AlgorithmHistory*
00406 HistorySvc::getAlgHistory(const Algorithm &alg) const {
00407 
00408   const Algorithm *palg = &alg;
00409   set<const Algorithm*>::const_iterator itr = m_algs.find(palg);
00410   if ( itr == m_algs.end() ) {
00411     m_log << MSG::WARNING << "Algorithm " << alg.name() << " not registered"
00412           << endmsg;
00413     return 0;
00414   }
00415 
00416   map<const Algorithm*, AlgorithmHistory*>::const_iterator itr2;
00417   itr2 = m_algmap.find( *itr );
00418 
00419   return ( itr2->second );
00420 
00421 }
00422 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00423 
00424 void
00425 HistorySvc::getAlgHistory(std::set<AlgorithmHistory*>& algs) const {
00426 
00427   set<const Algorithm*>::const_iterator itr;
00428   for (itr=m_algs.begin(); itr!=m_algs.end(); ++itr) {
00429     AlgorithmHistory *ah = m_algmap.find(*itr)->second;
00430 
00431     algs.insert(ah);
00432   }
00433 
00434 }
00435 
00436 
00437 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00438 StatusCode
00439 HistorySvc::registerJob() {
00440 
00441 
00442   return StatusCode(StatusCode::SUCCESS,true);
00443 
00444 
00445 }
00446 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00447 
00448 
00449 StatusCode
00450 HistorySvc::listProperties() const {
00451 
00452   m_log << MSG::INFO;
00453   m_log.setColor(MSG::CYAN);
00454   m_log << "Dumping properties for all Algorithms" << endmsg;
00455 
00456   std::map<const Algorithm*, AlgorithmHistory*>::const_iterator itr;
00457   for (itr=m_algmap.begin(); itr != m_algmap.end(); ++itr) {
00458     const Algorithm* alg = itr->first;
00459 
00460     listProperties( *alg ).ignore();
00461 
00462   }
00463 
00464   m_log << MSG::INFO;
00465   m_log.setColor(MSG::CYAN);
00466   m_log << "Dumping properties for all AlgTools" << endmsg;
00467 
00468   std::map<const AlgTool*, AlgToolHistory*>::const_iterator itr_a;
00469   for (itr_a=m_algtoolmap.begin(); itr_a != m_algtoolmap.end(); ++itr_a) {
00470     const AlgTool* alg = itr_a->first;
00471 
00472     listProperties( *alg ).ignore();
00473 
00474   }
00475 
00476   m_log << MSG::INFO;
00477   m_log.setColor(MSG::CYAN);
00478   m_log << "Dumping properties for all Services" << endmsg;
00479 
00480   std::map<const IService*, ServiceHistory*>::const_iterator itr_s;
00481   for (itr_s=m_svcmap.begin(); itr_s != m_svcmap.end(); ++itr_s) {
00482     const IService* svc = itr_s->first;
00483 
00484     listProperties( *svc ).ignore();
00485 
00486   }
00487 
00488   m_log << MSG::INFO;
00489   m_log.setColor(MSG::CYAN);
00490   m_log << "Dumping properties for Job";
00491   m_log.resetColor();
00492 
00493   ostringstream ost;
00494   ost << *m_jobHistory;
00495   std::string str = ost.str();
00496 
00497   m_log << std::endl << str << endmsg;
00498 
00499   return StatusCode(StatusCode::SUCCESS,true);
00500 
00501 }
00502 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00503 
00504 void
00505 HistorySvc::dumpProperties(std::ofstream& ofs) const {
00506 
00507 
00508   ofs << "GLOBAL" << std::endl;
00509   const JobHistory::PropertyList props = m_jobHistory->properties();
00510   JobHistory::PropertyList::const_iterator itrj;
00511   for (itrj=props.begin(); itrj != props.end(); ++itrj) {
00512     std::string client = itrj->first;
00513     const Property* prp = itrj->second;
00514     ofs << client << "  " << dumpProp(prp) << std::endl;
00515   }
00516 
00517   ofs << std::endl << "SERVICES" << std::endl;
00518   std::map<const IService*, ServiceHistory*>::const_iterator itr_s;
00519   for (itr_s=m_svcmap.begin(); itr_s != m_svcmap.end(); ++itr_s) {
00520     const IService* svc = itr_s->first;
00521 
00522     dumpProperties( *svc, ofs );
00523 
00524   }
00525 
00526   ofs << std::endl << "ALGORITHMS" << std::endl;
00527   std::map<const Algorithm*, AlgorithmHistory*>::const_iterator itr;
00528   for (itr=m_algmap.begin(); itr != m_algmap.end(); ++itr) {
00529     const Algorithm* alg = itr->first;
00530 
00531     dumpProperties( *alg, ofs );
00532 
00533   }
00534 
00535   ofs << std::endl << "ALGTOOLS" << std::endl;
00536   std::map<const AlgTool*, AlgToolHistory*>::const_iterator itr_a;
00537   for (itr_a=m_algtoolmap.begin(); itr_a != m_algtoolmap.end(); ++itr_a) {
00538     const AlgTool* alg = itr_a->first;
00539 
00540     dumpProperties( *alg, ofs );
00541 
00542   }
00543 
00544 
00545 }
00546 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00547 
00548 JobHistory*
00549 HistorySvc::getJobHistory() const {
00550 
00551   return m_jobHistory;
00552 
00553 }
00554 
00555 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00556 IAlgorithm*
00557 HistorySvc::getCurrentIAlg() const {
00558   if (p_algCtxSvc == 0) {
00559     m_log << MSG::WARNING << "trying to create DataHistoryObj before "
00560           << "HistorySvc has been initialized" << endmsg;
00561     return 0;
00562 
00563   } else {
00564     return p_algCtxSvc->currentAlg();
00565   }
00566 }
00567 
00568 
00569 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00570 
00571 DataHistory*
00572 HistorySvc::createDataHistoryObj(const CLID& id, const std::string& key,
00573                                  const std::string& /* storeName */) {
00574 
00575   if (!m_activate) return 0;
00576 
00577 
00578   AlgorithmHistory *algHist;
00579 
00580   IAlgorithm* ialg = getCurrentIAlg();
00581   if (ialg == 0) {
00582 #ifndef NDEBUG
00583     m_log << MSG::DEBUG
00584           << "Could not discover current Algorithm:" << endl
00585           << "          object CLID: " << id << "  key: \"" << key
00586           << "\"" << endmsg;
00587 #endif
00588     algHist = 0;
00589   } else {
00590     Algorithm* alg = dynamic_cast<Algorithm*>(ialg);
00591     if (alg != 0) {
00592       algHist = getAlgHistory( *alg );
00593     } else {
00594       m_log << MSG::WARNING
00595             << "Could not extract concerete Algorithm:"
00596             << endl
00597             << "          object CLID: " << id << "  key: \"" << key
00598             << "\"" << endmsg;
00599       algHist = 0;
00600     }
00601   }
00602 
00603   DataHistory *hist = new DataHistory(id, key, algHist);
00604 
00605   return hist;
00606 
00607 }
00608 
00609 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00610 StatusCode
00611 HistorySvc::registerDataHistory(const CLID& id, const std::string& key,
00612                                 const std::string& storeName) {
00613 
00614   DHH dhh(id,key);
00615 
00616   pair<DHMitr,DHMitr> mitr = m_datMap.equal_range(dhh);
00617 
00618   if (mitr.first == mitr.second) {
00619     // not in the map
00620     DataHistory *dh = createDataHistoryObj(id,key,storeName);
00621     m_datMap.insert(pair<DHH,DataHistory*>(dhh,dh));
00622   } else {
00623     // found at least one
00624     bool match(false);
00625 
00626     std::string algName;
00627     IAlgorithm *ialg = getCurrentIAlg();
00628     if (ialg != 0) {
00629       algName = ialg->name();
00630     } else {
00631       algName = "UNKNOWN";
00632     }
00633 
00634     for (DHMitr itr = mitr.first; itr != mitr.second; ++itr) {
00635       DataHistory *dh = itr->second;
00636       if (dh->algorithmHistory()->algorithm_name() == algName) {
00637         match = true;
00638         break;
00639       }
00640     }
00641 
00642     if (! match) {
00643       DataHistory *dh = createDataHistoryObj(id,key,storeName);
00644       m_datMap.insert(pair<DHH,DataHistory*>(dhh,dh));
00645     }
00646   }
00647 
00648   return StatusCode::SUCCESS;
00649 
00650 }
00651 
00652 
00653 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00654 DataHistory*
00655 HistorySvc::getDataHistory(const CLID& id, const std::string& key,
00656                            const std::string& /*storeName*/) const {
00657 
00658   DHH dhh(id,key);
00659 
00660   pair<DHMCitr,DHMCitr> mitr = m_datMap.equal_range(dhh);
00661 
00662   if(mitr.first == mitr.second) {
00663     return 0;
00664   }
00665 
00666   return mitr.first->second;
00667 
00668 }
00669 
00670 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00671 
00672 int
00673 HistorySvc::getDataHistory(const CLID& id, const std::string& key,
00674                            const std::string& /*storeName*/,
00675                            std::list<DataHistory*>& dhlist) const {
00676 
00677   DHH dhh(id,key);
00678 
00679   int n(0);
00680 
00681   pair<DHMCitr,DHMCitr> mitr = m_datMap.equal_range(dhh);
00682 
00683   for (DHMCitr itr=mitr.first; itr != mitr.second; ++itr) {
00684     dhlist.push_back(itr->second);
00685     n++;
00686   }
00687 
00688   return n;
00689 
00690 }
00691 
00692 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00693 
00694 StatusCode
00695 HistorySvc::registerSvc(const IService &svc) {
00696 
00697   if ( svc.name() == "HistoryStore" ) {
00698     //    m_log << MSG::WARNING << "not registering store" << endmsg;
00699     return StatusCode(StatusCode::SUCCESS,true);
00700   }
00701 
00702   JobHistory *job = getJobHistory();
00703   const IService* psvc = &svc;
00704   map<const IService*, ServiceHistory*>::const_iterator itr =
00705     m_svcmap.find(psvc);
00706   if (itr == m_svcmap.end()) {
00707 
00708 #ifndef NDEBUG
00709     m_log << MSG::DEBUG << "Registering Service: ";
00710     m_log.setColor(MSG::CYAN);
00711     m_log << svc.name() << endmsg;
00712 #endif
00713 
00714     m_svcs.insert(psvc);
00715 
00716     ServiceHistory *svcHist = new ServiceHistory(&svc, job);
00717     m_svcmap[psvc] = svcHist;
00718 
00719     (const_cast<IService*>(psvc))->addRef();
00720 
00721   }
00722 
00723   m_log.resetColor();
00724   return StatusCode(StatusCode::SUCCESS,true);
00725 
00726 }
00727 
00728 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00729 
00730 ServiceHistory*
00731 HistorySvc::getServiceHistory(const IService &svc) const {
00732 
00733   const IService *psvc = &svc;
00734   map<const IService*, ServiceHistory*>::const_iterator itr =
00735     m_svcmap.find(psvc);
00736   if ( itr == m_svcmap.end() ) {
00737     m_log << MSG::WARNING << "Service " << svc.name() << " not registered"
00738           << endmsg;
00739     return 0;
00740   }
00741 
00742   return ( itr->second );
00743 
00744 }
00745 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00746 
00747 void
00748 HistorySvc::getServiceHistory(std::set<ServiceHistory*>& svcs) const {
00749 
00750   set<const IService*>::const_iterator itr;
00751   for (itr=m_svcs.begin(); itr!=m_svcs.end(); ++itr) {
00752     ServiceHistory *sh = m_svcmap.find( *itr )->second;
00753 
00754     svcs.insert(sh);
00755   }
00756 
00757 }
00758 
00759 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00760 
00761 StatusCode
00762 HistorySvc::listProperties(const IService &svc) const {
00763 
00764   m_log << MSG::INFO << "Dumping properties for " << svc.name() << endl;
00765 
00766   ServiceHistory *hist = getServiceHistory( svc );
00767 
00768   if (hist == 0) {
00769     return StatusCode::FAILURE;
00770   }
00771 
00772   ostringstream ost;
00773   ost << *hist;
00774 
00775   std::string str = ost.str();
00776 
00777   m_log << MSG::INFO << svc.name() << " --> " << endl << str << endmsg;
00778 
00779 
00780 
00781   return StatusCode(StatusCode::SUCCESS,true);
00782 
00783 }
00784 
00785 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00786 
00787 void
00788 HistorySvc::dumpProperties(const IService &svc, std::ofstream &ofs) const {
00789 
00790   ServiceHistory *hist = getServiceHistory( svc );
00791 
00792   if (hist == 0) {
00793     return;
00794   }
00795 
00796   ServiceHistory::PropertyList::const_iterator itr;
00797   for (itr=hist->properties().begin(); itr != hist->properties().end();++itr) {
00798     ofs << svc.name() << "  " << dumpProp(*itr) << std::endl;
00799   }
00800 
00801 }
00802 
00803 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00804 
00805 StatusCode
00806 HistorySvc::registerAlgTool(const IAlgTool& ialg) {
00807 
00808   if (! m_isInitialized) {
00809     if (p_algCtxSvc == 0) {
00810       if ( service("AlgContextSvc",p_algCtxSvc,true).isFailure() ) {
00811         m_log << MSG::ERROR << "unable to get the AlgContextSvc" << endmsg;
00812         return StatusCode::FAILURE;
00813       }
00814     }
00815 
00816     m_ialgtools.insert(&ialg);
00817     return StatusCode::SUCCESS;
00818   }
00819 
00820   const AlgTool *alg = dynamic_cast<const AlgTool*>( &ialg );
00821   if ( alg == 0 ) {
00822     m_log << MSG::ERROR << "Could not dcast IAlgTool \"" << ialg.name()
00823           << "\" to an AlgTool" << endmsg;
00824     return StatusCode::FAILURE;
00825   }
00826 
00827   if (m_algtools.find(alg) != m_algtools.end()) {
00828     m_log << MSG::WARNING << "AlgTool " << ialg.name()
00829           << " already registered in HistorySvc" << endmsg;
00830     return StatusCode::SUCCESS;
00831   }
00832 
00833   m_algtools.insert(alg);
00834   (const_cast<AlgTool*>(alg))->addRef();
00835 
00836   const JobHistory *job = getJobHistory();
00837   AlgToolHistory *algHist = new AlgToolHistory(*alg, job);
00838   m_algtoolmap[alg] = algHist;
00839 
00840 #ifndef NDEBUG
00841   m_log << MSG::DEBUG << "Registering algtool: ";
00842   m_log.setColor(MSG::CYAN);
00843   m_log << alg->name() << endmsg;
00844   m_log.resetColor();
00845 #endif
00846 
00847   return StatusCode::SUCCESS;
00848 
00849 }
00850 
00851 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00852 
00853 StatusCode
00854 HistorySvc::listProperties(const IAlgTool& alg) const {
00855 
00856   m_log << MSG::INFO << "Dumping properties for " << alg.name() << endl;
00857 
00858   AlgToolHistory *hist = getAlgToolHistory( alg );
00859 
00860   if (hist == 0) {
00861     return StatusCode::FAILURE;
00862   }
00863 
00864   ostringstream ost;
00865   ost << *hist;
00866 
00867   std::string str = ost.str();
00868 
00869   m_log << MSG::INFO << alg.name() << " --> " << endl << str << endmsg;
00870 
00871   return StatusCode::SUCCESS;
00872 
00873 }
00874 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00875 
00876 void
00877 HistorySvc::dumpProperties(const IAlgTool& alg, std::ofstream &ofs) const {
00878 
00879   AlgToolHistory *hist = getAlgToolHistory( alg );
00880 
00881   if (hist == 0) {
00882     return;
00883   }
00884 
00885   AlgToolHistory::PropertyList::const_iterator itr;
00886   for (itr=hist->properties().begin(); itr!=hist->properties().end(); ++itr) {
00887     ofs << alg.name() << "  " << dumpProp(*itr) << std::endl;
00888   }
00889 
00890 }
00891 
00892 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00893 
00894 AlgToolHistory*
00895 HistorySvc::getAlgToolHistory(const IAlgTool& alg) const {
00896 
00897   const AlgTool *palg = dynamic_cast<const AlgTool*>(&alg);
00898   set<const AlgTool*>::const_iterator itr = m_algtools.find(palg);
00899   if ( itr == m_algtools.end() ) {
00900     m_log << MSG::WARNING << "AlgTool " << alg.name() << " not registered"
00901           << endmsg;
00902     return 0;
00903   }
00904 
00905   map<const AlgTool*, AlgToolHistory*>::const_iterator itr2;
00906   itr2 = m_algtoolmap.find( *itr );
00907 
00908   return ( itr2->second );
00909 
00910 }
00911 
00912 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00913 
00914 void
00915 HistorySvc::getAlgToolHistory(std::set<AlgToolHistory*>& algs) const {
00916 
00917   set<const AlgTool*>::const_iterator itr;
00918   for (itr=m_algtools.begin(); itr!=m_algtools.end(); ++itr) {
00919     AlgToolHistory *ah = m_algtoolmap.find(*itr)->second;
00920 
00921     algs.insert(ah);
00922   }
00923 
00924 }
00925 
00926 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00927 
00928 void
00929 HistorySvc::handle(const Incident& incident) {
00930 
00931   if (incident.type() == IncidentType::BeginEvent) {
00932     if (captureState().isFailure()) {
00933       m_log << MSG::WARNING << "Error capturing state." << endl
00934             << "Will try again at next BeginEvent incident" << endmsg;
00935     }
00936   }
00937 
00938 }
00939 
00940 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00941 
00942 
00943 std::string
00944 HistorySvc::dumpProp(const Property* prop) const {
00945   std::ostringstream ost;
00946   prop->fillStream(ost);
00947   return ost.str();
00948 }
00949 
00950 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00951 
00952 void
00953 HistorySvc::dumpState(std::ofstream& ofs) const {
00954 
00955 
00956   ofs << "GLOBAL" << std::endl;
00957   const JobHistory::PropertyList props = m_jobHistory->properties();
00958   JobHistory::PropertyList::const_iterator itrj;
00959   for (itrj=props.begin(); itrj != props.end(); ++itrj) {
00960     std::string client = itrj->first;
00961     const Property* prp = itrj->second;
00962     ofs << client << "  " << dumpProp(prp) << std::endl;
00963   }
00964 
00965 
00966   ofs << "SERVICES" << std::endl;
00967   std::map<const IService*, ServiceHistory*>::const_iterator itr_s;
00968   for (itr_s=m_svcmap.begin(); itr_s != m_svcmap.end(); ++itr_s) {
00969     const IService* svc = itr_s->first;
00970 
00971     dumpState( *svc, ofs );
00972 
00973   }
00974 
00975   ofs << "ALGORITHMS" << std::endl;
00976   std::map<const Algorithm*, AlgorithmHistory*>::const_iterator itr;
00977   for (itr=m_algmap.begin(); itr != m_algmap.end(); ++itr) {
00978     const Algorithm* alg = itr->first;
00979 
00980     dumpState( *alg, ofs );
00981 
00982   }
00983 
00984 
00985   ofs << "ALGTOOLS" << std::endl;
00986   std::map<const AlgTool*, AlgToolHistory*>::const_iterator itr_a;
00987   for (itr_a=m_algtoolmap.begin(); itr_a != m_algtoolmap.end(); ++itr_a) {
00988     const AlgTool* alg = itr_a->first;
00989 
00990     dumpState( *alg, ofs );
00991 
00992   }
00993 
00994 }
00995 
00996 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00997 
00998 void
00999 HistorySvc::dumpState(const Algorithm &alg, std::ofstream& ofs) const {
01000 
01001   AlgorithmHistory *hist = getAlgHistory( alg );
01002 
01003   if (hist == 0) {
01004     return;
01005   }
01006 
01007   ofs << ">> " << alg.name() << endl << *hist << endl;
01008 
01009 }
01010 
01011 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
01012 
01013 void
01014 HistorySvc::dumpState(const IService &svc, std::ofstream& ofs) const {
01015 
01016   ServiceHistory *hist = getServiceHistory( svc );
01017 
01018   if (hist == 0) {
01019     return;
01020   }
01021 
01022   ofs << ">> " << svc.name() << endl << *hist << endl;
01023 
01024 }
01025 
01026 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
01027 
01028 void
01029 HistorySvc::dumpState(const IAlgTool &alg, std::ofstream& ofs) const {
01030 
01031   AlgToolHistory *hist = getAlgToolHistory( alg );
01032 
01033   if (hist == 0) {
01034     return;
01035   }
01036 
01037   ofs << ">> " << alg.name() << endl << *hist << endl;
01038 
01039 }

Generated at Wed Mar 17 18:06:45 2010 for Gaudi Framework, version v21r8 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004