The Gaudi Framework  master (b9786168)
Loading...
Searching...
No Matches
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
17
23
25
26#include <Gaudi/Algorithm.h>
27#include <GaudiKernel/AlgTool.h>
37#include <GaudiKernel/System.h>
38
40
41#include <boost/algorithm/string/predicate.hpp>
42namespace 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
55using namespace std;
56
57//
59//
60
61namespace {
62 template <typename MAP, typename SET>
63 inline void map_to_set( const MAP& m, SET& s ) {
64 std::transform( std::begin( m ), std::end( m ), std::inserter( s, s.begin() ),
65 std::mem_fn( &MAP::value_type::second ) );
66 }
67} // namespace
68
69struct DHH {
71 std::string key;
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
92
93/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
94
95namespace {
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
123 if ( status.isFailure() ) {
125 debug() << "Failed to initialize the base class (Service)" << endmsg;
126 return status;
127 }
128
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
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
317void HistorySvc::dumpProperties( const Gaudi::Algorithm& alg, std::ofstream& ofs ) const {
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
338void 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 ) {
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
380void HistorySvc::dumpProperties( std::ofstream& ofs ) const {
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
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
410DataHistory* HistorySvc::createDataHistoryObj( const CLID& id, const std::string& key,
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 ) {
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/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
437StatusCode HistorySvc::registerDataHistory( const CLID& id, const std::string& key, const std::string& storeName ) {
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/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
470DataHistory* HistorySvc::getDataHistory( const CLID& id, const std::string& key,
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
481int 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
536void 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
555void 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
620void HistorySvc::dumpProperties( const IAlgTool& alg, std::ofstream& ofs ) const {
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
644void HistorySvc::getAlgToolHistory( std::set<AlgToolHistory*>& algs ) const { map_to_set( m_algtoolmap, algs ); }
645
646/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
647
648void 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
659std::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
676void HistorySvc::dumpState( std::ofstream& ofs ) const {
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 ) {
719 std::map<std::string, const INamedInterface*> sorted;
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
747void 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 ) {
757 verbose() << in->name() << " is Service" << endmsg;
759 hist = dynamic_cast<HistoryObj*>( o );
760 vhist = dynamic_cast<IVersHistoryObj*>( o );
761 } else if ( ( ia = dynamic_cast<const Gaudi::Algorithm*>( in ) ) != nullptr ) {
763 verbose() << in->name() << " is Alg" << endmsg;
765 hist = dynamic_cast<HistoryObj*>( o );
766 vhist = dynamic_cast<IVersHistoryObj*>( o );
767 } else if ( ( it = dynamic_cast<const IAlgTool*>( in ) ) != nullptr ) {
769 verbose() << in->name() << " is AlgTool" << endmsg;
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}
#define ON_VERBOSE
unsigned int CLID
Class ID definition.
Definition ClassID.h:16
#define SET(x)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition MsgStream.h:198
#define ON_DEBUG
#define DECLARE_COMPONENT(type)
AlgToolHistory class definition.
const PropertyList & properties() const override
Base class from which all the concrete tool classes should be derived.
Definition AlgTool.h:55
AlgorithmHistory class definition.
const PropertyList & properties() const override
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
DataHistory class definition.
Definition DataHistory.h:32
Base class from which all concrete algorithm classes should be derived.
Definition Algorithm.h:87
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
std::string documentation() const
property documentation
virtual std::string toString() const =0
value -> string
virtual std::ostream & fillStream(std::ostream &) const
the printout of the property value
Definition Property.cpp:45
const std::string name() const
property name
Base class for History Objects.
Definition HistoryObj.h:30
virtual std::ostream & dump(std::ostream &, bool isXML=false, int indent=0) const =0
static std::string convert_string(const std::string &)
HistorySvc class definition.
Definition HistorySvc.h:46
Gaudi::Property< bool > m_activate
Definition HistorySvc.h:95
virtual StatusCode registerDataHistory(const CLID &id, const std::string &key, const std::string &store)
StatusCode listProperties() const override
StatusCode registerAlgTool(const IAlgTool &) override
Gaudi::Property< std::string > m_outputFile
Definition HistorySvc.h:96
ServiceHandle< IAlgContextSvc > p_algCtxSvc
Definition HistorySvc.h:97
bool m_isInitialized
Definition HistorySvc.h:101
virtual StatusCode captureState()
void dumpState(std::ofstream &) const
void clearState()
StatusCode registerJob() override
std::map< const Gaudi::Algorithm *, AlgorithmHistory * > m_algmap
Definition HistorySvc.h:103
Gaudi::Property< bool > m_dump
Definition HistorySvc.h:94
std::set< const IAlgTool * > m_ialgtools
Definition HistorySvc.h:105
StatusCode initialize() override
DataHistory * getDataHistory(const CLID &id, const std::string &key, const std::string &store) const override
IAlgorithm * getCurrentIAlg() const
StatusCode registerSvc(const IService &) override
std::multimap< DHH, DataHistory * > m_datMap
Definition HistorySvc.h:109
ServiceHistory * getServiceHistory(const IService &) const override
JobHistory * getJobHistory() const override
StatusCode registerAlg(const Gaudi::Algorithm &) override
std::unique_ptr< JobHistory > m_jobHistory
Definition HistorySvc.h:111
std::map< const IService *, ServiceHistory * > m_svcmap
Definition HistorySvc.h:107
DataHistory * createDataHistoryObj(const CLID &id, const std::string &key, const std::string &store) override
StatusCode stop() override
StatusCode reinitialize() override
void dumpProperties(std::ofstream &) const
std::string dumpProp(const Gaudi::Details::PropertyBase *, const bool isXML=false, int indent=0) const
std::map< const AlgTool *, AlgToolHistory * > m_algtoolmap
Definition HistorySvc.h:106
AlgorithmHistory * getAlgHistory(const Gaudi::Algorithm &) const override
bool m_outputFileTypeXML
Definition HistorySvc.h:127
AlgToolHistory * getAlgToolHistory(const IAlgTool &) const override
StatusCode finalize() override
SmartIF< IToolSvc > m_toolSvc
Definition HistorySvc.h:125
void handle(const Incident &inc) override
The IAlgManager is the interface implemented by the Algorithm Factory in the Application Manager to s...
Definition IAlgManager.h:34
The interface implemented by the AlgTool base class.
Definition IAlgTool.h:29
The IAlgorithm is the interface implemented by the Algorithm base class.
Definition IAlgorithm.h:36
IInterface compliant class extending IInterface with the name() method.
virtual const std::string & name() const =0
Retrieve the name of the instance.
General service interface definition.
Definition IService.h:26
virtual const std::list< IService * > & getServices() const =0
Return the list of Services.
virtual SmartIF< IService > & service(const Gaudi::Utils::TypeNameString &typeName, const bool createIf=true)=0
Returns a smart pointer to a service.
SmartIF< IFace > as()
Definition ISvcLocator.h:64
Interface for Versioned History Objects.
virtual const std::string & name() const =0
Base class for all Incidents (computing events).
Definition Incident.h:24
const std::string & type() const
Access to the incident type.
Definition Incident.h:43
JobHistory class definition.
Definition JobHistory.h:32
ServiceHistory class definition.
const PropertyList & properties() const override
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition Service.cpp:336
StatusCode finalize() override
Definition Service.cpp:223
Gaudi::StateMachine::State m_state
Service state.
Definition Service.h:155
SmartIF< IFace > service(const std::string &name, bool createIf=true) const
Definition Service.h:79
StatusCode initialize() override
Definition Service.cpp:118
This class is used for returning status codes from appropriate routines.
Definition StatusCode.h:64
bool isFailure() const
Definition StatusCode.h:129
const StatusCode & ignore() const
Allow discarding a StatusCode without warning.
Definition StatusCode.h:139
bool isSuccess() const
Definition StatusCode.h:314
constexpr static const auto SUCCESS
Definition StatusCode.h:99
constexpr static const auto FAILURE
Definition StatusCode.h:100
constexpr double m
GAUDI_API ISvcLocator * svcLocator()
@ CYAN
Definition IMessageSvc.h:23
@ INFO
Definition IMessageSvc.h:22
STL namespace.
std::string key
bool operator<(DHH const &rhs) const
DHH(const CLID &i, std::string k)
CLID id