The Gaudi Framework  v36r1 (3e2fb5a8)
HistorySvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #include "HistorySvc.h"
12 
13 #include <functional>
14 
15 #include "GaudiKernel/HistoryObj.h"
17 
21 #include "GaudiKernel/JobHistory.h"
23 
25 
26 #include "GaudiKernel/AlgTool.h"
27 #include "GaudiKernel/Bootstrap.h"
29 #include "GaudiKernel/IAlgTool.h"
30 #include "GaudiKernel/IAlgorithm.h"
31 #include "GaudiKernel/IAppMgrUI.h"
33 #include "GaudiKernel/IService.h"
34 #include "GaudiKernel/IToolSvc.h"
36 #include "GaudiKernel/System.h"
37 #include <Gaudi/Algorithm.h>
38 
40 
41 #include "boost/algorithm/string/predicate.hpp"
42 namespace ba = boost::algorithm;
43 
44 #include <fstream>
45 #include <iostream>
46 #include <limits>
47 #include <sstream>
48 
49 #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) )
50 #define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) )
51 
52 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
54 
55 using namespace std;
56 
57 //
59 //
60 
61 namespace {
62  template <typename MAP, typename SET>
63  inline void map_to_set( const MAP& m, SET& s ) {
66  }
67 } // namespace
68 
69 struct DHH {
72 
73  DHH( const CLID& i, std::string k ) : id( i ), key( std::move( k ) ) {}
74 
75  bool operator<( DHH const& rhs ) const {
76  if ( id != rhs.id ) {
77  return ( id < rhs.id );
78  } else {
79  return ( key < rhs.key );
80  }
81  }
82 };
83 
84 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
85 
87 
88  clearState();
90  return initialize();
91 }
92 
93 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
94 
95 namespace {
96  constexpr struct clear_t {
97  template <typename T1, typename T2>
98  void operator()( std::pair<const T1* const, T2*>& p ) {
99  const_cast<T1*>( p.first )->release();
100  delete p.second;
101  }
102  } clear_{};
103  template <typename M>
104  void clear( M& m ) {
105  std::for_each( std::begin( m ), std::end( m ), clear_ );
106  m.clear();
107  }
108 } // namespace
110  clear( m_algmap );
111 
112  m_ialgtools.clear();
113  clear( m_algtoolmap );
114 
115  clear( m_svcmap );
116 }
117 
118 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
119 
121 
122  StatusCode status = Service::initialize();
123  if ( status.isFailure() ) {
124  ON_DEBUG
125  debug() << "Failed to initialize the base class (Service)" << endmsg;
126  return status;
127  }
128 
129  ON_DEBUG
130  debug() << "Initializing HistorySvc" << endmsg;
131 
132  if ( !m_activate ) return StatusCode::SUCCESS;
133 
134  static const bool CREATEIF( true );
135 
136  if ( service( "AlgContextSvc", p_algCtxSvc, CREATEIF ).isFailure() ) {
137  error() << "unable to get the AlgContextSvc" << endmsg;
138  return StatusCode::FAILURE;
139  }
140 
141  if ( service( "IncidentSvc", m_incidentSvc, CREATEIF ).isFailure() ) {
142  error() << "unable to get the IncidentSvc" << endmsg;
143  return StatusCode::FAILURE;
144  }
145 
146  // create a weak dependency on the ToolSvc, so that it doesn't get deleted
147  // before we're done with it in finalize
148  m_toolSvc = serviceLocator()->service( "ToolSvc" );
149  if ( !m_toolSvc ) {
150  error() << "could not retrieve the ToolSvc handle !" << endmsg;
151  return StatusCode::FAILURE;
152  }
153 
154  // add listener to be triggered by first BeginEvent with low priority
155  // so it gets called first
156  const bool rethrow = false;
157  const bool oneShot = true; // make the listener called only once
158  m_incidentSvc->addListener( this, IncidentType::BeginEvent, std::numeric_limits<long>::min(), rethrow, oneShot );
159 
160  m_outputFileTypeXML = ba::iends_with( m_outputFile.value(), ".xml" );
161  ON_DEBUG if ( m_outputFileTypeXML ) { debug() << "output format is XML" << endmsg; }
162 
163  m_isInitialized = true;
164 
165  return StatusCode::SUCCESS;
166 }
167 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
168 
170 
171  if ( !m_jobHistory ) {
172  m_jobHistory = std::make_unique<JobHistory>();
173 
174  bool foundAppMgr( false );
175  for ( const auto& item : serviceLocator()->getOptsSvc().items() ) {
176  m_jobHistory->addProperty( get<0>( item ), get<1>( item ) );
177  foundAppMgr |= get<0>( item ).compare( 0, 15, "ApplicationMgr." ) == 0;
178  }
179 
180  if ( !foundAppMgr ) {
181  auto ap = service<IProperty>( "ApplicationMgr" );
182  if ( !ap ) {
183  error() << "could not get the ApplicationMgr" << endmsg;
184  } else {
185  for ( auto prop : ap->getProperties() ) {
186  m_jobHistory->addProperty( "ApplicationMgr." + prop->name(), prop->toString() );
187  }
188  }
189  }
190  }
191 
193 
194  auto algMgr = Gaudi::svcLocator()->as<IAlgManager>();
195  if ( !algMgr ) {
196  error() << "Could not get AlgManager" << endmsg;
197  return StatusCode::FAILURE;
198  }
199 
200  size_t count = 0;
201  for ( auto ialg : algMgr->getAlgorithms() ) {
202  Gaudi::Algorithm* alg = dynamic_cast<Gaudi::Algorithm*>( ialg );
203  if ( !alg ) {
204  warning() << "Algorithm " << ialg->name() << " does not inherit from Gaudi::Algorithm. Not registering it."
205  << endmsg;
206  } else {
207  ++count;
208  registerAlg( *alg ).ignore();
209  }
210  }
211 
212  info() << "Registered " << count << " Algorithms" << endmsg;
213 
215 
216  m_isInitialized = true;
217  for ( auto algtool : m_ialgtools ) {
218  ( const_cast<IAlgTool*>( algtool ) )->addRef();
219  registerAlgTool( *algtool ).ignore();
220  }
221 
222  info() << "Registered " << m_algtoolmap.size() << " AlgTools" << endmsg;
223 
225 
226  for ( auto svc : Gaudi::svcLocator()->getServices() ) {
227  svc->addRef();
228  registerSvc( *svc ).ignore();
229  }
230 
231  info() << "Registered " << Gaudi::svcLocator()->getServices().size() << " Services" << endmsg;
232 
233  return StatusCode::SUCCESS;
234 }
235 
236 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
237 
239 
240  if ( !m_activate ) return StatusCode::SUCCESS;
241 
242  if ( m_dump ) { listProperties().ignore(); }
243 
244  if ( !m_outputFile.empty() ) {
245  std::ofstream ofs( m_outputFile );
246  if ( !ofs ) {
247  error() << "Unable to open output file \"m_outputFile\"" << endmsg;
248  } else {
249  // dumpProperties(ofs);
250  dumpState( ofs );
251  }
252  }
253 
254  clearState();
255 
256  return StatusCode::SUCCESS;
257 }
258 
259 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
260 
262 
263  ON_VERBOSE
264  verbose() << "HistorySvc::finalize()" << endmsg;
265 
266  clearState();
267 
268  StatusCode status = Service::finalize();
269 
270  if ( status.isSuccess() ) info() << "Service finalised successfully" << endmsg;
271 
272  return status;
273 }
274 
275 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
276 
277 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
278 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
279 
281 
282  JobHistory* job = getJobHistory();
283  if ( m_algmap.find( &alg ) != m_algmap.end() ) {
284  warning() << "Algorithm " << alg.name() << " already registered with HistorySvc" << endmsg;
285  return StatusCode::SUCCESS;
286  }
287 
288  ( const_cast<Gaudi::Algorithm*>( &alg ) )->addRef();
289 
290  m_algmap[&alg] = new AlgorithmHistory( alg, job );
291 
292  ON_DEBUG {
293  auto& log = debug();
294  log << "Registering algorithm: ";
295  log.setColor( MSG::CYAN );
296  log << alg.name() << endmsg;
297  log.resetColor();
298  }
299 
300  return StatusCode::SUCCESS;
301 }
302 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
303 
305 
306  info() << "Dumping properties for " << alg.name() << endl;
307 
308  AlgorithmHistory* hist = getAlgHistory( alg );
309 
310  if ( !hist ) { return StatusCode::FAILURE; }
311 
312  info() << alg.name() << " --> " << endl << *hist << endmsg;
313 
314  return StatusCode::SUCCESS;
315 }
316 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
317 
319 
320  AlgorithmHistory* hist = getAlgHistory( alg );
321 
322  if ( !hist ) { return; }
323 
324  for ( auto prop : hist->properties() ) { ofs << alg.name() << " " << dumpProp( prop ) << std::endl; }
325 }
326 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
327 
329 
330  auto itr = m_algmap.find( &alg );
331  if ( itr == m_algmap.end() ) {
332  warning() << "Algorithm " << alg.name() << " not registered" << endmsg;
333  return nullptr;
334  }
335  return itr->second;
336 }
337 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
338 
339 void HistorySvc::getAlgHistory( std::set<AlgorithmHistory*>& algs ) const { map_to_set( m_algmap, algs ); }
340 
341 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
343 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
344 
346 
347  auto& log = info();
348 
349  log.setColor( MSG::CYAN );
350  log << "Dumping properties for all Algorithms (" << m_algmap.size() << ")" << endmsg;
351 
352  for ( auto& alg : m_algmap ) { listProperties( *alg.first ).ignore(); }
353 
354  log << MSG::INFO;
355  log.setColor( MSG::CYAN );
356  log << "Dumping properties for all AlgTools (" << m_algtoolmap.size() << ")" << endmsg;
357 
358  for ( auto& algtool : m_algtoolmap ) {
359  ON_DEBUG
360  debug() << " --> " << algtool.second->algtool_name() << endmsg;
361  listProperties( *algtool.first ).ignore();
362  }
363 
364  log << MSG::INFO;
365  log.setColor( MSG::CYAN );
366  log << "Dumping properties for all Services (" << m_svcmap.size() << ")" << endmsg;
367 
368  for ( auto& svc : m_svcmap ) { listProperties( *svc.first ).ignore(); }
369 
370  log << MSG::INFO;
371  log.setColor( MSG::CYAN );
372  log << "Dumping properties for Job";
373  log.resetColor();
374 
375  log << std::endl << *m_jobHistory << endmsg;
376 
377  return StatusCode::SUCCESS;
378 }
379 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
380 
382 
383  ofs << "GLOBAL" << std::endl;
384  for ( const auto& prop : m_jobHistory->propertyPairs() ) {
385  ofs << prop.first << " " << dumpProp( prop.second.get() ) << std::endl;
386  }
387 
388  ofs << std::endl << "SERVICES" << std::endl;
389  for ( const auto& s : m_svcmap ) dumpProperties( *s.first, ofs );
390 
391  ofs << std::endl << "ALGORITHMS" << std::endl;
392  for ( const auto& alg : m_algmap ) dumpProperties( *alg.first, ofs );
393 
394  ofs << std::endl << "ALGTOOLS" << std::endl;
395  for ( const auto& tool : m_algtoolmap ) dumpProperties( *tool.first, ofs );
396 }
397 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
398 
399 JobHistory* HistorySvc::getJobHistory() const { return m_jobHistory.get(); }
400 
401 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
403  if ( p_algCtxSvc ) return p_algCtxSvc->currentAlg();
404  warning() << "trying to create DataHistoryObj before "
405  << "HistorySvc has been initialized" << endmsg;
406  return nullptr;
407 }
408 
409 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
410 
412  const std::string& /* storeName */ ) {
413 
414  if ( !m_activate ) return nullptr;
415 
416  AlgorithmHistory* algHist = nullptr;
417 
418  IAlgorithm* ialg = getCurrentIAlg();
419  if ( !ialg ) {
420  ON_DEBUG
421  debug() << "Could not discover current Algorithm:" << endl
422  << " object CLID: " << id << " key: \"" << key << "\"" << endmsg;
423  algHist = nullptr;
424  } else {
425  Gaudi::Algorithm* alg = dynamic_cast<Gaudi::Algorithm*>( ialg );
426  if ( alg ) {
427  algHist = getAlgHistory( *alg );
428  } else {
429  warning() << "Could not extract concrete Algorithm:" << endl
430  << " object CLID: " << id << " key: \"" << key << "\"" << endmsg;
431  algHist = nullptr;
432  }
433  }
434  return new DataHistory( id, key, algHist );
435 }
436 
437 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
439 
440  DHH dhh( id, key );
441 
442  auto boundaries = m_datMap.equal_range( dhh );
443  auto match = boundaries.second;
444 
445  if ( boundaries.first != boundaries.second ) {
446  // there is something in the map, let's look for the specific entry
447 
448  std::string algName;
449  IAlgorithm* ialg = getCurrentIAlg();
450  if ( ialg ) {
451  algName = ialg->name();
452  } else {
453  algName = "UNKNOWN";
454  }
455 
456  match = std::find_if( boundaries.first, boundaries.second,
457  [&algName]( decltype( boundaries )::first_type::reference p ) -> bool {
458  return p.second->algorithmHistory()->algorithm_name() == algName;
459  } );
460  }
461 
462  if ( match == boundaries.second ) { // not found, crete the entry
463  DataHistory* dh = createDataHistoryObj( id, key, storeName );
464  m_datMap.insert( pair<DHH, DataHistory*>( dhh, dh ) );
465  }
466 
467  return StatusCode::SUCCESS;
468 }
469 
470 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
472  const std::string& /*storeName*/ ) const {
473 
474  DHH dhh( id, key );
475 
476  auto mitr = m_datMap.equal_range( dhh );
477  return ( mitr.first != mitr.second ) ? mitr.first->second : nullptr;
478 }
479 
480 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
481 
482 int HistorySvc::getDataHistory( const CLID& id, const std::string& key, const std::string& /*storeName*/,
483  std::list<DataHistory*>& dhlist ) const {
484 
485  DHH dhh( id, key );
486 
487  int n( 0 );
488 
489  auto mitr = m_datMap.equal_range( dhh );
490  for ( auto itr = mitr.first; itr != mitr.second; ++itr ) {
491  dhlist.push_back( itr->second );
492  ++n;
493  }
494  return n;
495 }
496 
497 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
498 
500 
501  if ( svc.name() == "HistoryStore" ) { return StatusCode::SUCCESS; }
502 
503  JobHistory* job = getJobHistory();
504  const IService* psvc = &svc;
505  auto itr = m_svcmap.find( psvc );
506  if ( itr == m_svcmap.end() ) {
507 
508  ON_DEBUG {
509  auto& log = debug();
510  log << "Registering Service: ";
511  log.setColor( MSG::CYAN );
512  log << svc.name() << endmsg;
513  log.resetColor();
514  }
515 
516  m_svcmap[psvc] = new ServiceHistory( &svc, job );
517 
518  ( const_cast<IService*>( psvc ) )->addRef();
519  }
520 
521  return StatusCode::SUCCESS;
522 }
523 
524 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
525 
527 
528  const IService* psvc = &svc;
529  auto itr = m_svcmap.find( psvc );
530  if ( itr != m_svcmap.end() ) return itr->second;
531 
532  warning() << "Service " << svc.name() << " not registered" << endmsg;
533  return nullptr;
534 }
535 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
536 
537 void HistorySvc::getServiceHistory( std::set<ServiceHistory*>& svcs ) const { map_to_set( m_svcmap, svcs ); }
538 
539 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
540 
542 
543  info() << "Dumping properties for " << svc.name() << endl;
544 
545  ServiceHistory* hist = getServiceHistory( svc );
546 
547  if ( !hist ) return StatusCode::FAILURE;
548 
549  info() << svc.name() << " --> " << endl << *hist << endmsg;
550 
551  return StatusCode::SUCCESS;
552 }
553 
554 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
555 
556 void HistorySvc::dumpProperties( const IService& svc, std::ofstream& ofs ) const {
557 
558  ServiceHistory* hist = getServiceHistory( svc );
559 
560  if ( !hist ) return;
561 
562  for ( auto& prop : hist->properties() ) { ofs << svc.name() << " " << dumpProp( prop ) << std::endl; }
563 }
564 
565 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
566 
568 
569  if ( !m_isInitialized ) {
570  if ( !p_algCtxSvc ) {
571  if ( service( "AlgContextSvc", p_algCtxSvc, true ).isFailure() ) {
572  error() << "unable to get the AlgContextSvc" << endmsg;
573  return StatusCode::FAILURE;
574  }
575  }
576  m_ialgtools.insert( &ialg );
577  return StatusCode::SUCCESS;
578  }
579 
580  const AlgTool* alg = dynamic_cast<const AlgTool*>( &ialg );
581  if ( !alg ) {
582  error() << "Could not dcast IAlgTool \"" << ialg.name() << "\" to an AlgTool" << endmsg;
583  return StatusCode::FAILURE;
584  }
585 
586  if ( m_algtoolmap.find( alg ) != m_algtoolmap.end() ) {
587  warning() << "AlgTool " << ialg.name() << " already registered in HistorySvc" << endmsg;
588  return StatusCode::SUCCESS;
589  }
590 
591  const JobHistory* job = getJobHistory();
592  m_algtoolmap[alg] = new AlgToolHistory( *alg, job );
593 
594  ON_DEBUG {
595  auto& log = debug();
596  log << "Registering algtool: ";
597  log.setColor( MSG::CYAN );
598  log << alg->name() << endmsg;
599  log.resetColor();
600  }
601 
602  return StatusCode::SUCCESS;
603 }
604 
605 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
606 
608 
609  info() << "Dumping properties for " << alg.name() << endl;
610 
611  AlgToolHistory* hist = getAlgToolHistory( alg );
612 
613  if ( !hist ) return StatusCode::FAILURE;
614 
615  info() << alg.name() << " --> " << endl << *hist << endmsg;
616 
617  return StatusCode::SUCCESS;
618 }
619 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
620 
622 
623  AlgToolHistory* hist = getAlgToolHistory( alg );
624 
625  if ( !hist ) return;
626 
627  for ( auto& prop : hist->properties() ) { ofs << alg.name() << " " << dumpProp( prop ) << std::endl; }
628 }
629 
630 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
631 
633 
634  const AlgTool* palg = dynamic_cast<const AlgTool*>( &alg );
635  auto itr = m_algtoolmap.find( palg );
636  if ( itr == m_algtoolmap.end() ) {
637  warning() << "AlgTool " << alg.name() << " not registered" << endmsg;
638  return nullptr;
639  }
640  return itr->second;
641 }
642 
643 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
644 
645 void HistorySvc::getAlgToolHistory( std::set<AlgToolHistory*>& algs ) const { map_to_set( m_algtoolmap, algs ); }
646 
647 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
648 
649 void HistorySvc::handle( const Incident& incident ) {
650 
651  if ( incident.type() == IncidentType::BeginEvent ) {
652  if ( captureState().isFailure() ) {
653  warning() << "Error capturing state." << endl << "Will try again at next BeginEvent incident" << endmsg;
654  }
655  }
656 }
657 
658 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
659 
660 std::string HistorySvc::dumpProp( const Gaudi::Details::PropertyBase* prop, bool isXML, int ind ) const {
661  std::ostringstream ost;
662  if ( isXML ) {
663  while ( ind > 0 ) {
664  ost << " ";
665  ind--;
666  }
667  ost << "<PROPERTY name=\"" << prop->name() << "\" value=\"" << HistoryObj::convert_string( prop->toString() )
668  << "\" documentation=\"" << HistoryObj::convert_string( prop->documentation() ) << "\">";
669  } else {
670  prop->fillStream( ost );
671  }
672  return ost.str();
673 }
674 
675 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
676 
678 
679  if ( m_outputFileTypeXML ) {
680  // xml header
681  ofs << "<?xml version=\"1.0\" ?> " << std::endl;
682  ofs << "<!--Test-xml-->" << std::endl;
683  ofs << "<SETUP>" << std::endl;
684  ofs << " <GLOBAL>" << std::endl;
685  } else {
686  ofs << "GLOBAL" << std::endl;
687  }
688 
689  std::string client_currently_open = "start";
690  for ( auto& item : m_jobHistory->propertyPairs() ) {
691  // client is the name of the component of the current property
692  const auto& client = item.first;
693  const auto& prp = item.second;
694 
695  if ( m_outputFileTypeXML ) {
696 
697  if ( client != client_currently_open ) {
698  if ( client_currently_open != "start" ) ofs << " </COMPONENT>" << endl;
699  ofs << " <COMPONENT name=\"" << client << "\" class=\"undefined\">" << std::endl;
700  }
701  } else {
702  ofs << client << " ";
703  }
704 
705  ofs << dumpProp( prp.get(), m_outputFileTypeXML, 6 ) << endl;
706 
707  client_currently_open = client;
708 
709  if ( m_outputFileTypeXML ) ofs << " </COMPONENT>" << endl;
710  }
711 
712  if ( m_outputFileTypeXML ) {
713  ofs << "</GLOBAL>" << endl << "<SERVICES>" << endl;
714  } else {
715  ofs << "SERVICES" << std::endl;
716  }
717 
718  // helper to dump monitored components sorted by name
719  auto sortedDump = [&ofs, this]( const auto& map ) {
721  for ( const auto& item : map ) sorted[item.first->name()] = item.first;
722  for ( const auto& item : sorted ) dumpState( item.second, ofs );
723  };
724 
725  sortedDump( m_svcmap );
726 
727  if ( m_outputFileTypeXML ) {
728  ofs << "</SERVICES>" << endl << "<ALGORITHMS> " << endl;
729  } else {
730  ofs << "ALGORITHMS" << std::endl;
731  }
732 
733  sortedDump( m_algmap );
734 
735  if ( m_outputFileTypeXML ) {
736  ofs << "</ALGORITHMS>" << endl << "<ALGTOOLS> " << endl;
737  } else {
738  ofs << "ALGTOOLS" << std::endl;
739  }
740 
741  sortedDump( m_algtoolmap );
742 
743  if ( m_outputFileTypeXML ) { ofs << "</ALGTOOLS>" << endl << "</SETUP>" << endl; }
744 }
745 
746 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
747 
748 void HistorySvc::dumpState( const INamedInterface* in, std::ofstream& ofs ) const {
749 
750  HistoryObj* hist = nullptr;
751  IVersHistoryObj* vhist = nullptr;
752 
753  const IService* is = nullptr;
754  const Gaudi::Algorithm* ia = nullptr;
755  const IAlgTool* it = nullptr;
756  if ( ( is = dynamic_cast<const IService*>( in ) ) != nullptr ) {
757  ON_VERBOSE
758  verbose() << in->name() << " is Service" << endmsg;
759  ServiceHistory* o = getServiceHistory( *is );
760  hist = dynamic_cast<HistoryObj*>( o );
761  vhist = dynamic_cast<IVersHistoryObj*>( o );
762  } else if ( ( ia = dynamic_cast<const Gaudi::Algorithm*>( in ) ) != nullptr ) {
763  ON_VERBOSE
764  verbose() << in->name() << " is Alg" << endmsg;
765  AlgorithmHistory* o = getAlgHistory( *ia );
766  hist = dynamic_cast<HistoryObj*>( o );
767  vhist = dynamic_cast<IVersHistoryObj*>( o );
768  } else if ( ( it = dynamic_cast<const IAlgTool*>( in ) ) != nullptr ) {
769  ON_VERBOSE
770  verbose() << in->name() << " is AlgTool" << endmsg;
771  AlgToolHistory* o = getAlgToolHistory( *it );
772  hist = dynamic_cast<HistoryObj*>( o );
773  vhist = dynamic_cast<IVersHistoryObj*>( o );
774  } else {
775  error() << "Could not dcast interface to accepted History Obj type for " << in->name() << endmsg;
776  return;
777  }
778 
779  if ( !hist || !vhist ) {
780  error() << "Could not dcast recognized object to HistoryObj or IVersHistoryObj. This should never happen."
781  << endmsg;
782  return;
783  }
784 
785  if ( m_outputFileTypeXML ) {
786  hist->dump( ofs, true );
787  } else {
788  ofs << ">> " << vhist->name() << endl << *hist << endl;
789  }
790 }
HistorySvc
Definition: HistorySvc.h:46
IService
Definition: IService.h:28
Gaudi::Details::PropertyBase
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: PropertyBase.h:35
Gaudi::Details::PropertyBase::name
const std::string name() const
property name
Definition: PropertyBase.h:39
HistorySvc::listProperties
StatusCode listProperties() const override
Definition: HistorySvc.cpp:345
DHH::DHH
DHH(const CLID &i, std::string k)
Definition: HistorySvc.cpp:73
std::for_each
T for_each(T... args)
IAlgManager.h
HistorySvc::initialize
StatusCode initialize() override
Definition: HistorySvc.cpp:120
ISvcLocator::getServices
virtual const std::list< IService * > & getServices() const =0
Get a reference to a service and create it if it does not exists.
Service::initialize
StatusCode initialize() override
Definition: Service.cpp:118
AlgorithmHistory::properties
const PropertyList & properties() const override
Definition: AlgorithmHistory.h:93
DHH
Definition: HistorySvc.cpp:69
IService.h
std::string
STL class.
IAlgTool
Definition: IAlgTool.h:33
HistorySvc::reinitialize
StatusCode reinitialize() override
Definition: HistorySvc.cpp:86
AlgToolHistory::properties
const PropertyList & properties() const override
Definition: AlgToolHistory.h:76
HistorySvc::registerDataHistory
virtual StatusCode registerDataHistory(const CLID &id, const std::string &key, const std::string &store)
Definition: HistorySvc.cpp:438
HistorySvc::getJobHistory
JobHistory * getJobHistory() const override
Definition: HistorySvc.cpp:399
std::list
STL class.
std::move
T move(T... args)
Gaudi::Algorithm::name
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:542
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:355
HistorySvc::stop
StatusCode stop() override
Definition: HistorySvc.cpp:238
MSG::INFO
@ INFO
Definition: IMessageSvc.h:25
System.h
std::pair
HistorySvc::createDataHistoryObj
DataHistory * createDataHistoryObj(const CLID &id, const std::string &key, const std::string &store) override
Definition: HistorySvc.cpp:411
Gaudi::Details::PropertyBase::documentation
std::string documentation() const
property documentation
Definition: PropertyBase.h:41
gaudirun.s
string s
Definition: gaudirun.py:328
std::find_if
T find_if(T... args)
std::list::size
T size(T... args)
HistorySvc::registerSvc
StatusCode registerSvc(const IService &) override
Definition: HistorySvc.cpp:499
DHH::id
CLID id
Definition: HistorySvc.cpp:70
std::mem_fn
T mem_fn(T... args)
INamedInterface::name
virtual const std::string & name() const =0
Retrieve the name of the instance.
HistorySvc::getCurrentIAlg
IAlgorithm * getCurrentIAlg() const
Definition: HistorySvc.cpp:402
HistorySvc::registerJob
StatusCode registerJob() override
Definition: HistorySvc.cpp:342
conf.release
string release
Definition: conf.py:28
AlgToolHistory
Definition: AlgToolHistory.h:32
Gaudi::Units::second
constexpr double second
Definition: SystemOfUnits.h:139
HistorySvc::dumpProp
std::string dumpProp(const Gaudi::Details::PropertyBase *, const bool isXML=false, int indent=0) const
Definition: HistorySvc.cpp:660
ServiceHandle.h
Containers::map
struct GAUDI_API map
Parametrisation class for map-like implementation.
Definition: KeyedObjectManager.h:35
HistorySvc::getServiceHistory
ServiceHistory * getServiceHistory(const IService &) const override
Definition: HistorySvc.cpp:526
IAppMgrUI.h
Service::finalize
StatusCode finalize() override
Definition: Service.cpp:222
ON_VERBOSE
#define ON_VERBOSE
Definition: HistorySvc.cpp:50
HistorySvc::clearState
void clearState()
Definition: HistorySvc.cpp:109
ServiceHistory.h
basic.alg
alg
Definition: basic.py:15
IIncidentSvc.h
std::list::push_back
T push_back(T... args)
IToolSvc.h
IAlgManager
Definition: IAlgManager.h:37
Gaudi::svcLocator
GAUDI_API ISvcLocator * svcLocator()
HistorySvc::getAlgHistory
AlgorithmHistory * getAlgHistory(const Gaudi::Algorithm &) const override
Definition: HistorySvc.cpp:328
HistoryObj
Definition: HistoryObj.h:31
bug_34121.tool
tool
Definition: bug_34121.py:17
AlgorithmHistory
Definition: AlgorithmHistory.h:38
Gaudi::Details::PropertyBase::fillStream
virtual std::ostream & fillStream(std::ostream &) const
the printout of the property value
Definition: Property.cpp:60
StatusCode
Definition: StatusCode.h:65
std::log
T log(T... args)
IVersHistoryObj::name
virtual const std::string & name() const =0
IAlgorithm
Definition: IAlgorithm.h:38
IVersHistoryObj.h
Gaudi::Units::m
constexpr double m
Definition: SystemOfUnits.h:108
std::ofstream
STL class.
ServiceHistory
Definition: ServiceHistory.h:31
IAlgTool.h
Gaudi::StateMachine::OFFLINE
@ OFFLINE
Definition: StateMachine.h:23
HistorySvc::getDataHistory
DataHistory * getDataHistory(const CLID &id, const std::string &key, const std::string &store) const override
Definition: HistorySvc.cpp:471
Gaudi::Algorithm
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:90
HistorySvc.h
HistorySvc::finalize
StatusCode finalize() override
Definition: HistorySvc.cpp:261
Algorithm.h
HistoryObj::convert_string
static std::string convert_string(const std::string &)
Definition: HistoryObj.cpp:30
CLID
unsigned int CLID
Class ID definition.
Definition: ClassID.h:18
Histograms.algs
list algs
Definition: Histograms.py:26
genconfuser.verbose
verbose
Definition: genconfuser.py:29
JobHistory.h
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:203
std::map
STL class.
HistorySvc::dumpState
void dumpState(std::ofstream &) const
Definition: HistorySvc.cpp:677
std::transform
T transform(T... args)
IVersHistoryObj
Definition: IVersHistoryObj.h:28
GaudiPluginService.cpluginsvc.n
n
Definition: cpluginsvc.py:221
AlgToolHistory.h
HistorySvc::registerAlgTool
StatusCode registerAlgTool(const IAlgTool &) override
Definition: HistorySvc.cpp:567
std::ostringstream
STL class.
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:142
HistoryObj::dump
virtual std::ostream & dump(std::ostream &, bool isXML=false, int indent=0) const =0
INamedInterface
Definition: INamedInterface.h:25
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
std::endl
T endl(T... args)
IAlgContextSvc.h
AlgTool
Definition: AlgTool.h:62
AlgorithmHistory.h
std::begin
T begin(T... args)
Gaudi::Details::PropertyBase::toString
virtual std::string toString() const =0
value -> string
ISvcLocator::as
SmartIF< IFace > as()
Definition: ISvcLocator.h:124
HistoryObj.h
std
STL namespace.
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:46
HistorySvc::registerAlg
StatusCode registerAlg(const Gaudi::Algorithm &) override
Definition: HistorySvc.cpp:280
MSG::CYAN
@ CYAN
Definition: IMessageSvc.h:26
JobHistory
Definition: JobHistory.h:33
DataHistory.h
DataHistory
Definition: DataHistory.h:33
std::count
T count(T... args)
Bootstrap.h
AlgTool.h
std::ostringstream::str
T str(T... args)
HistorySvc::getAlgToolHistory
AlgToolHistory * getAlgToolHistory(const IAlgTool &) const override
Definition: HistorySvc.cpp:632
Incident::type
const std::string & type() const
Access to the incident type.
Definition: Incident.h:48
std::end
T end(T... args)
IAlgorithm.h
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
HistorySvc::handle
void handle(const Incident &inc) override
Definition: HistorySvc.cpp:649
HistorySvc::dumpProperties
void dumpProperties(std::ofstream &) const
Definition: HistorySvc.cpp:381
ISvcLocator.h
ArrayProperties.ap
ap
Definition: ArrayProperties.py:37
ServiceHistory::properties
const PropertyList & properties() const override
Definition: ServiceHistory.h:43
std::inserter
T inserter(T... args)
Incident
Definition: Incident.h:27
ProduceConsume.key
key
Definition: ProduceConsume.py:52
std::numeric_limits
std::set
STL class.
SET
#define SET(x)
ON_DEBUG
#define ON_DEBUG
Definition: HistorySvc.cpp:49
DHH::operator<
bool operator<(DHH const &rhs) const
Definition: HistorySvc.cpp:75
GaudiPython.Pythonizations.items
items
Definition: Pythonizations.py:526
HistorySvc::captureState
virtual StatusCode captureState()
Definition: HistorySvc.cpp:169
DHH::key
std::string key
Definition: HistorySvc.cpp:71