The Gaudi Framework  master (37c0b60a)
HistorySvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 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 <Gaudi/Algorithm.h>
27 #include <GaudiKernel/AlgTool.h>
28 #include <GaudiKernel/Bootstrap.h>
30 #include <GaudiKernel/IAlgTool.h>
31 #include <GaudiKernel/IAlgorithm.h>
32 #include <GaudiKernel/IAppMgrUI.h>
34 #include <GaudiKernel/IService.h>
35 #include <GaudiKernel/IToolSvc.h>
37 #include <GaudiKernel/System.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  if ( p_algCtxSvc.retrieve().isFailure() ) {
135  error() << "unable to get the AlgContextSvc" << endmsg;
136  return StatusCode::FAILURE;
137  }
138 
139  auto incidentSvc = service<IIncidentSvc>( "IncidentSvc", true );
140  if ( !incidentSvc ) {
141  error() << "unable to get the IncidentSvc" << endmsg;
142  return StatusCode::FAILURE;
143  }
144 
145  // create a weak dependency on the ToolSvc, so that it doesn't get deleted
146  // before we're done with it in finalize
147  m_toolSvc = serviceLocator()->service( "ToolSvc" );
148  if ( !m_toolSvc ) {
149  error() << "could not retrieve the ToolSvc handle !" << endmsg;
150  return StatusCode::FAILURE;
151  }
152 
153  // add listener to be triggered by first BeginEvent with low priority
154  // so it gets called first
155  const bool rethrow = false;
156  const bool oneShot = true; // make the listener called only once
157  incidentSvc->addListener( this, IncidentType::BeginEvent, std::numeric_limits<long>::min(), rethrow, oneShot );
158 
159  m_outputFileTypeXML = ba::iends_with( m_outputFile.value(), ".xml" );
160  ON_DEBUG if ( m_outputFileTypeXML ) { debug() << "output format is XML" << endmsg; }
161 
162  m_isInitialized = true;
163 
164  return StatusCode::SUCCESS;
165 }
166 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
167 
169 
170  if ( !m_jobHistory ) {
171  m_jobHistory = std::make_unique<JobHistory>();
172 
173  bool foundAppMgr( false );
174  for ( const auto& item : serviceLocator()->getOptsSvc().items() ) {
175  m_jobHistory->addProperty( get<0>( item ), get<1>( item ) );
176  foundAppMgr |= get<0>( item ).compare( 0, 15, "ApplicationMgr." ) == 0;
177  }
178 
179  if ( !foundAppMgr ) {
180  auto ap = service<IProperty>( "ApplicationMgr" );
181  if ( !ap ) {
182  error() << "could not get the ApplicationMgr" << endmsg;
183  } else {
184  for ( auto prop : ap->getProperties() ) {
185  m_jobHistory->addProperty( "ApplicationMgr." + prop->name(), prop->toString() );
186  }
187  }
188  }
189  }
190 
192 
193  auto algMgr = Gaudi::svcLocator()->as<IAlgManager>();
194  if ( !algMgr ) {
195  error() << "Could not get AlgManager" << endmsg;
196  return StatusCode::FAILURE;
197  }
198 
199  size_t count = 0;
200  for ( auto ialg : algMgr->getAlgorithms() ) {
201  Gaudi::Algorithm* alg = dynamic_cast<Gaudi::Algorithm*>( ialg );
202  if ( !alg ) {
203  warning() << "Algorithm " << ialg->name() << " does not inherit from Gaudi::Algorithm. Not registering it."
204  << endmsg;
205  } else {
206  ++count;
207  registerAlg( *alg ).ignore();
208  }
209  }
210 
211  info() << "Registered " << count << " Algorithms" << endmsg;
212 
214 
215  m_isInitialized = true;
216  for ( auto algtool : m_ialgtools ) {
217  ( const_cast<IAlgTool*>( algtool ) )->addRef();
218  registerAlgTool( *algtool ).ignore();
219  }
220 
221  info() << "Registered " << m_algtoolmap.size() << " AlgTools" << endmsg;
222 
224 
225  for ( auto svc : Gaudi::svcLocator()->getServices() ) {
226  svc->addRef();
227  registerSvc( *svc ).ignore();
228  }
229 
230  info() << "Registered " << Gaudi::svcLocator()->getServices().size() << " Services" << endmsg;
231 
232  return StatusCode::SUCCESS;
233 }
234 
235 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
236 
238 
239  if ( !m_activate ) return StatusCode::SUCCESS;
240 
241  if ( m_dump ) { listProperties().ignore(); }
242 
243  if ( !m_outputFile.empty() ) {
244  std::ofstream ofs( m_outputFile );
245  if ( !ofs ) {
246  error() << "Unable to open output file \"m_outputFile\"" << endmsg;
247  } else {
248  // dumpProperties(ofs);
249  dumpState( ofs );
250  }
251  }
252 
253  clearState();
254 
255  return StatusCode::SUCCESS;
256 }
257 
258 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
259 
261 
262  ON_VERBOSE
263  verbose() << "HistorySvc::finalize()" << endmsg;
264 
265  clearState();
266 
267  StatusCode status = Service::finalize();
268 
269  if ( status.isSuccess() ) info() << "Service finalised successfully" << endmsg;
270 
271  return status;
272 }
273 
274 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
275 
276 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
277 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
278 
280 
281  JobHistory* job = getJobHistory();
282  if ( m_algmap.find( &alg ) != m_algmap.end() ) {
283  warning() << "Algorithm " << alg.name() << " already registered with HistorySvc" << endmsg;
284  return StatusCode::SUCCESS;
285  }
286 
287  ( const_cast<Gaudi::Algorithm*>( &alg ) )->addRef();
288 
289  m_algmap[&alg] = new AlgorithmHistory( alg, job );
290 
291  ON_DEBUG {
292  auto& log = debug();
293  log << "Registering algorithm: ";
294  log.setColor( MSG::CYAN );
295  log << alg.name() << endmsg;
296  log.resetColor();
297  }
298 
299  return StatusCode::SUCCESS;
300 }
301 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
302 
304 
305  info() << "Dumping properties for " << alg.name() << endl;
306 
307  AlgorithmHistory* hist = getAlgHistory( alg );
308 
309  if ( !hist ) { return StatusCode::FAILURE; }
310 
311  info() << alg.name() << " --> " << endl << *hist << endmsg;
312 
313  return StatusCode::SUCCESS;
314 }
315 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
316 
318 
319  AlgorithmHistory* hist = getAlgHistory( alg );
320 
321  if ( !hist ) { return; }
322 
323  for ( auto prop : hist->properties() ) { ofs << alg.name() << " " << dumpProp( prop ) << std::endl; }
324 }
325 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
326 
328 
329  auto itr = m_algmap.find( &alg );
330  if ( itr == m_algmap.end() ) {
331  warning() << "Algorithm " << alg.name() << " not registered" << endmsg;
332  return nullptr;
333  }
334  return itr->second;
335 }
336 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
337 
338 void HistorySvc::getAlgHistory( std::set<AlgorithmHistory*>& algs ) const { map_to_set( m_algmap, algs ); }
339 
340 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
342 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
343 
345 
346  auto& log = info();
347 
348  log.setColor( MSG::CYAN );
349  log << "Dumping properties for all Algorithms (" << m_algmap.size() << ")" << endmsg;
350 
351  for ( auto& alg : m_algmap ) { listProperties( *alg.first ).ignore(); }
352 
353  log << MSG::INFO;
354  log.setColor( MSG::CYAN );
355  log << "Dumping properties for all AlgTools (" << m_algtoolmap.size() << ")" << endmsg;
356 
357  for ( auto& algtool : m_algtoolmap ) {
358  ON_DEBUG
359  debug() << " --> " << algtool.second->algtool_name() << endmsg;
360  listProperties( *algtool.first ).ignore();
361  }
362 
363  log << MSG::INFO;
364  log.setColor( MSG::CYAN );
365  log << "Dumping properties for all Services (" << m_svcmap.size() << ")" << endmsg;
366 
367  for ( auto& svc : m_svcmap ) { listProperties( *svc.first ).ignore(); }
368 
369  log << MSG::INFO;
370  log.setColor( MSG::CYAN );
371  log << "Dumping properties for Job";
372  log.resetColor();
373 
374  log << std::endl << *m_jobHistory << endmsg;
375 
376  return StatusCode::SUCCESS;
377 }
378 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
379 
381 
382  ofs << "GLOBAL" << std::endl;
383  for ( const auto& prop : m_jobHistory->propertyPairs() ) {
384  ofs << prop.first << " " << dumpProp( prop.second.get() ) << std::endl;
385  }
386 
387  ofs << std::endl << "SERVICES" << std::endl;
388  for ( const auto& s : m_svcmap ) dumpProperties( *s.first, ofs );
389 
390  ofs << std::endl << "ALGORITHMS" << std::endl;
391  for ( const auto& alg : m_algmap ) dumpProperties( *alg.first, ofs );
392 
393  ofs << std::endl << "ALGTOOLS" << std::endl;
394  for ( const auto& tool : m_algtoolmap ) dumpProperties( *tool.first, ofs );
395 }
396 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
397 
398 JobHistory* HistorySvc::getJobHistory() const { return m_jobHistory.get(); }
399 
400 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
402  if ( p_algCtxSvc.isSet() ) return p_algCtxSvc->currentAlg();
403  warning() << "trying to create DataHistoryObj before "
404  << "HistorySvc has been initialized" << endmsg;
405  return nullptr;
406 }
407 
408 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
409 
411  const std::string& /* storeName */ ) {
412 
413  if ( !m_activate ) return nullptr;
414 
415  AlgorithmHistory* algHist = nullptr;
416 
417  IAlgorithm* ialg = getCurrentIAlg();
418  if ( !ialg ) {
419  ON_DEBUG
420  debug() << "Could not discover current Algorithm:" << endl
421  << " object CLID: " << id << " key: \"" << key << "\"" << endmsg;
422  algHist = nullptr;
423  } else {
424  Gaudi::Algorithm* alg = dynamic_cast<Gaudi::Algorithm*>( ialg );
425  if ( alg ) {
426  algHist = getAlgHistory( *alg );
427  } else {
428  warning() << "Could not extract concrete Algorithm:" << endl
429  << " object CLID: " << id << " key: \"" << key << "\"" << endmsg;
430  algHist = nullptr;
431  }
432  }
433  return new DataHistory( id, key, algHist );
434 }
435 
436 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
438 
439  DHH dhh( id, key );
440 
441  auto boundaries = m_datMap.equal_range( dhh );
442  auto match = boundaries.second;
443 
444  if ( boundaries.first != boundaries.second ) {
445  // there is something in the map, let's look for the specific entry
446 
447  std::string algName;
448  IAlgorithm* ialg = getCurrentIAlg();
449  if ( ialg ) {
450  algName = ialg->name();
451  } else {
452  algName = "UNKNOWN";
453  }
454 
455  match = std::find_if( boundaries.first, boundaries.second,
456  [&algName]( decltype( boundaries )::first_type::reference p ) -> bool {
457  return p.second->algorithmHistory()->algorithm_name() == algName;
458  } );
459  }
460 
461  if ( match == boundaries.second ) { // not found, crete the entry
462  DataHistory* dh = createDataHistoryObj( id, key, storeName );
463  m_datMap.insert( pair<DHH, DataHistory*>( dhh, dh ) );
464  }
465 
466  return StatusCode::SUCCESS;
467 }
468 
469 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
471  const std::string& /*storeName*/ ) const {
472 
473  DHH dhh( id, key );
474 
475  auto mitr = m_datMap.equal_range( dhh );
476  return ( mitr.first != mitr.second ) ? mitr.first->second : nullptr;
477 }
478 
479 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
480 
481 int HistorySvc::getDataHistory( const CLID& id, const std::string& key, const std::string& /*storeName*/,
482  std::list<DataHistory*>& dhlist ) const {
483 
484  DHH dhh( id, key );
485 
486  int n( 0 );
487 
488  auto mitr = m_datMap.equal_range( dhh );
489  for ( auto itr = mitr.first; itr != mitr.second; ++itr ) {
490  dhlist.push_back( itr->second );
491  ++n;
492  }
493  return n;
494 }
495 
496 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
497 
499 
500  if ( svc.name() == "HistoryStore" ) { return StatusCode::SUCCESS; }
501 
502  JobHistory* job = getJobHistory();
503  const IService* psvc = &svc;
504  auto itr = m_svcmap.find( psvc );
505  if ( itr == m_svcmap.end() ) {
506 
507  ON_DEBUG {
508  auto& log = debug();
509  log << "Registering Service: ";
510  log.setColor( MSG::CYAN );
511  log << svc.name() << endmsg;
512  log.resetColor();
513  }
514 
515  m_svcmap[psvc] = new ServiceHistory( &svc, job );
516 
517  ( const_cast<IService*>( psvc ) )->addRef();
518  }
519 
520  return StatusCode::SUCCESS;
521 }
522 
523 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
524 
526 
527  const IService* psvc = &svc;
528  auto itr = m_svcmap.find( psvc );
529  if ( itr != m_svcmap.end() ) return itr->second;
530 
531  warning() << "Service " << svc.name() << " not registered" << endmsg;
532  return nullptr;
533 }
534 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
535 
536 void HistorySvc::getServiceHistory( std::set<ServiceHistory*>& svcs ) const { map_to_set( m_svcmap, svcs ); }
537 
538 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
539 
541 
542  info() << "Dumping properties for " << svc.name() << endl;
543 
544  ServiceHistory* hist = getServiceHistory( svc );
545 
546  if ( !hist ) return StatusCode::FAILURE;
547 
548  info() << svc.name() << " --> " << endl << *hist << endmsg;
549 
550  return StatusCode::SUCCESS;
551 }
552 
553 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
554 
555 void HistorySvc::dumpProperties( const IService& svc, std::ofstream& ofs ) const {
556 
557  ServiceHistory* hist = getServiceHistory( svc );
558 
559  if ( !hist ) return;
560 
561  for ( auto& prop : hist->properties() ) { ofs << svc.name() << " " << dumpProp( prop ) << std::endl; }
562 }
563 
564 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
565 
567 
568  if ( !m_isInitialized ) {
569  if ( !p_algCtxSvc.isSet() ) {
570  if ( p_algCtxSvc.retrieve().isFailure() ) {
571  error() << "unable to get the AlgContextSvc" << endmsg;
572  return StatusCode::FAILURE;
573  }
574  }
575  m_ialgtools.insert( &ialg );
576  return StatusCode::SUCCESS;
577  }
578 
579  const AlgTool* alg = dynamic_cast<const AlgTool*>( &ialg );
580  if ( !alg ) {
581  error() << "Could not dcast IAlgTool \"" << ialg.name() << "\" to an AlgTool" << endmsg;
582  return StatusCode::FAILURE;
583  }
584 
585  if ( m_algtoolmap.find( alg ) != m_algtoolmap.end() ) {
586  warning() << "AlgTool " << ialg.name() << " already registered in HistorySvc" << endmsg;
587  return StatusCode::SUCCESS;
588  }
589 
590  const JobHistory* job = getJobHistory();
591  m_algtoolmap[alg] = new AlgToolHistory( *alg, job );
592 
593  ON_DEBUG {
594  auto& log = debug();
595  log << "Registering algtool: ";
596  log.setColor( MSG::CYAN );
597  log << alg->name() << endmsg;
598  log.resetColor();
599  }
600 
601  return StatusCode::SUCCESS;
602 }
603 
604 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
605 
607 
608  info() << "Dumping properties for " << alg.name() << endl;
609 
610  AlgToolHistory* hist = getAlgToolHistory( alg );
611 
612  if ( !hist ) return StatusCode::FAILURE;
613 
614  info() << alg.name() << " --> " << endl << *hist << endmsg;
615 
616  return StatusCode::SUCCESS;
617 }
618 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
619 
621 
622  AlgToolHistory* hist = getAlgToolHistory( alg );
623 
624  if ( !hist ) return;
625 
626  for ( auto& prop : hist->properties() ) { ofs << alg.name() << " " << dumpProp( prop ) << std::endl; }
627 }
628 
629 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
630 
632 
633  const AlgTool* palg = dynamic_cast<const AlgTool*>( &alg );
634  auto itr = m_algtoolmap.find( palg );
635  if ( itr == m_algtoolmap.end() ) {
636  warning() << "AlgTool " << alg.name() << " not registered" << endmsg;
637  return nullptr;
638  }
639  return itr->second;
640 }
641 
642 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
643 
644 void HistorySvc::getAlgToolHistory( std::set<AlgToolHistory*>& algs ) const { map_to_set( m_algtoolmap, algs ); }
645 
646 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
647 
648 void HistorySvc::handle( const Incident& incident ) {
649 
650  if ( incident.type() == IncidentType::BeginEvent ) {
651  if ( captureState().isFailure() ) {
652  warning() << "Error capturing state." << endl << "Will try again at next BeginEvent incident" << endmsg;
653  }
654  }
655 }
656 
657 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
658 
659 std::string HistorySvc::dumpProp( const Gaudi::Details::PropertyBase* prop, bool isXML, int ind ) const {
660  std::ostringstream ost;
661  if ( isXML ) {
662  while ( ind > 0 ) {
663  ost << " ";
664  ind--;
665  }
666  ost << "<PROPERTY name=\"" << prop->name() << "\" value=\"" << HistoryObj::convert_string( prop->toString() )
667  << "\" documentation=\"" << HistoryObj::convert_string( prop->documentation() ) << "\">";
668  } else {
669  prop->fillStream( ost );
670  }
671  return ost.str();
672 }
673 
674 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
675 
677 
678  if ( m_outputFileTypeXML ) {
679  // xml header
680  ofs << "<?xml version=\"1.0\" ?> " << std::endl;
681  ofs << "<!--Test-xml-->" << std::endl;
682  ofs << "<SETUP>" << std::endl;
683  ofs << " <GLOBAL>" << std::endl;
684  } else {
685  ofs << "GLOBAL" << std::endl;
686  }
687 
688  std::string client_currently_open = "start";
689  for ( auto& item : m_jobHistory->propertyPairs() ) {
690  // client is the name of the component of the current property
691  const auto& client = item.first;
692  const auto& prp = item.second;
693 
694  if ( m_outputFileTypeXML ) {
695 
696  if ( client != client_currently_open ) {
697  if ( client_currently_open != "start" ) ofs << " </COMPONENT>" << endl;
698  ofs << " <COMPONENT name=\"" << client << "\" class=\"undefined\">" << std::endl;
699  }
700  } else {
701  ofs << client << " ";
702  }
703 
704  ofs << dumpProp( prp.get(), m_outputFileTypeXML, 6 ) << endl;
705 
706  client_currently_open = client;
707 
708  if ( m_outputFileTypeXML ) ofs << " </COMPONENT>" << endl;
709  }
710 
711  if ( m_outputFileTypeXML ) {
712  ofs << "</GLOBAL>" << endl << "<SERVICES>" << endl;
713  } else {
714  ofs << "SERVICES" << std::endl;
715  }
716 
717  // helper to dump monitored components sorted by name
718  auto sortedDump = [&ofs, this]( const auto& map ) {
720  for ( const auto& item : map ) sorted[item.first->name()] = item.first;
721  for ( const auto& item : sorted ) dumpState( item.second, ofs );
722  };
723 
724  sortedDump( m_svcmap );
725 
726  if ( m_outputFileTypeXML ) {
727  ofs << "</SERVICES>" << endl << "<ALGORITHMS> " << endl;
728  } else {
729  ofs << "ALGORITHMS" << std::endl;
730  }
731 
732  sortedDump( m_algmap );
733 
734  if ( m_outputFileTypeXML ) {
735  ofs << "</ALGORITHMS>" << endl << "<ALGTOOLS> " << endl;
736  } else {
737  ofs << "ALGTOOLS" << std::endl;
738  }
739 
740  sortedDump( m_algtoolmap );
741 
742  if ( m_outputFileTypeXML ) { ofs << "</ALGTOOLS>" << endl << "</SETUP>" << endl; }
743 }
744 
745 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
746 
747 void HistorySvc::dumpState( const INamedInterface* in, std::ofstream& ofs ) const {
748 
749  HistoryObj* hist = nullptr;
750  IVersHistoryObj* vhist = nullptr;
751 
752  const IService* is = nullptr;
753  const Gaudi::Algorithm* ia = nullptr;
754  const IAlgTool* it = nullptr;
755  if ( ( is = dynamic_cast<const IService*>( in ) ) != nullptr ) {
756  ON_VERBOSE
757  verbose() << in->name() << " is Service" << endmsg;
758  ServiceHistory* o = getServiceHistory( *is );
759  hist = dynamic_cast<HistoryObj*>( o );
760  vhist = dynamic_cast<IVersHistoryObj*>( o );
761  } else if ( ( ia = dynamic_cast<const Gaudi::Algorithm*>( in ) ) != nullptr ) {
762  ON_VERBOSE
763  verbose() << in->name() << " is Alg" << endmsg;
764  AlgorithmHistory* o = getAlgHistory( *ia );
765  hist = dynamic_cast<HistoryObj*>( o );
766  vhist = dynamic_cast<IVersHistoryObj*>( o );
767  } else if ( ( it = dynamic_cast<const IAlgTool*>( in ) ) != nullptr ) {
768  ON_VERBOSE
769  verbose() << in->name() << " is AlgTool" << endmsg;
770  AlgToolHistory* o = getAlgToolHistory( *it );
771  hist = dynamic_cast<HistoryObj*>( o );
772  vhist = dynamic_cast<IVersHistoryObj*>( o );
773  } else {
774  error() << "Could not dcast interface to accepted History Obj type for " << in->name() << endmsg;
775  return;
776  }
777 
778  if ( !hist || !vhist ) {
779  error() << "Could not dcast recognized object to HistoryObj or IVersHistoryObj. This should never happen."
780  << endmsg;
781  return;
782  }
783 
784  if ( m_outputFileTypeXML ) {
785  hist->dump( ofs, true );
786  } else {
787  ofs << ">> " << vhist->name() << endl << *hist << endl;
788  }
789 }
HistorySvc
Definition: HistorySvc.h:47
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:344
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:437
HistorySvc::getJobHistory
JobHistory * getJobHistory() const override
Definition: HistorySvc.cpp:398
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:526
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
HistorySvc::stop
StatusCode stop() override
Definition: HistorySvc.cpp:237
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:410
Gaudi::Details::PropertyBase::documentation
std::string documentation() const
property documentation
Definition: PropertyBase.h:41
gaudirun.s
string s
Definition: gaudirun.py:346
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:498
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:401
HistorySvc::registerJob
StatusCode registerJob() override
Definition: HistorySvc.cpp:341
conf.release
string release
Definition: conf.py:27
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:659
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:525
GaudiPartProp.tests.id
id
Definition: tests.py:111
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
IIncidentSvc.h
std::list::push_back
T push_back(T... args)
IToolSvc.h
ManySmallAlgs.alg
alg
Definition: ManySmallAlgs.py:81
IAlgManager
Definition: IAlgManager.h:37
Gaudi::svcLocator
GAUDI_API ISvcLocator * svcLocator()
HistorySvc::getAlgHistory
AlgorithmHistory * getAlgHistory(const Gaudi::Algorithm &) const override
Definition: HistorySvc.cpp:327
HistoryObj
Definition: HistoryObj.h:31
bug_34121.tool
tool
Definition: bug_34121.py:18
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:470
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:260
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
genconfuser.verbose
verbose
Definition: genconfuser.py:28
JobHistory.h
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
std::map
STL class.
HistorySvc::dumpState
void dumpState(std::ofstream &) const
Definition: HistorySvc.cpp:676
std::transform
T transform(T... args)
IVersHistoryObj
Definition: IVersHistoryObj.h:28
AlgToolHistory.h
cpluginsvc.n
n
Definition: cpluginsvc.py:234
HistorySvc::registerAlgTool
StatusCode registerAlgTool(const IAlgTool &) override
Definition: HistorySvc.cpp:566
std::ostringstream
STL class.
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
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:126
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:279
MSG::CYAN
@ CYAN
Definition: IMessageSvc.h:26
JobHistory
Definition: JobHistory.h:33
DataHistory.h
DataHistory
Definition: DataHistory.h:33
fixtures.reference
Generator[dict, None, None] reference(request, Optional[Path] reference_path)
Definition: fixtures.py:211
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:631
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:648
HistorySvc::dumpProperties
void dumpProperties(std::ofstream &) const
Definition: HistorySvc.cpp:380
ISvcLocator.h
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:84
std::numeric_limits
std::set
STL class.
CollWrite.algs
algs
Definition: CollWrite.py:33
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
HistorySvc::captureState
virtual StatusCode captureState()
Definition: HistorySvc.cpp:168
DHH::key
std::string key
Definition: HistorySvc.cpp:71