ATLAS Offline Software
Loading...
Searching...
No Matches
AthenaSummarySvc Class Reference

#include <AthenaSummarySvc.h>

Inheritance diagram for AthenaSummarySvc:
Collaboration diagram for AthenaSummarySvc:

Public Member Functions

 AthenaSummarySvc (const std::string &name, ISvcLocator *svc)
virtual StatusCode initialize () override
virtual StatusCode reinitialize () override
virtual StatusCode finalize () override
virtual StatusCode createSummary () override
virtual void setStatus (int s) override
virtual void addListener (const std::string &incident_name) override
virtual void addSummary (const std::string &dict_key, const std::string &data) override
virtual const std::string & getOutputFile () const override

Private Member Functions

void createDict (std::ofstream &)
void createASCII (std::ofstream &)
virtual void handle (const Incident &inc) override

Static Private Member Functions

static void newHandler ()

Private Attributes

StringProperty m_summaryFile
StringProperty m_summaryFormat
StringArrayProperty m_extraInc
StringArrayProperty m_keywords
ServiceHandle< IIncidentSvc > p_incSvc
ILoggedMessageSvcp_logMsg {nullptr}
std::list< std::string > m_inputFilesRead
std::list< std::string > m_outputFiles
std::list< std::string > m_outputFilesError
std::map< std::string, std::map< std::string, int > > m_extraIncidents
std::vector< std::pair< std::string, std::string > > m_extraInfo
std::new_handler m_new {nullptr}
int m_status {0}
unsigned int m_eventsRead {0}
unsigned int m_eventsWritten {0}
unsigned int m_eventsSkipped {0}
unsigned int m_runs {0}

Static Private Attributes

static char *s_block ATLAS_THREAD_SAFE
static bool s_badalloc ATLAS_THREAD_SAFE

Detailed Description

Definition at line 36 of file AthenaSummarySvc.h.

Constructor & Destructor Documentation

◆ AthenaSummarySvc()

AthenaSummarySvc::AthenaSummarySvc ( const std::string & name,
ISvcLocator * svc )

Definition at line 119 of file AthenaSummarySvc.cxx.

120 : base_class( name, svc ),
121 p_incSvc("IncidentSvc",name),
122 m_new (std::set_new_handler( &AthenaSummarySvc::newHandler ))
123{
124}
ServiceHandle< IIncidentSvc > p_incSvc
std::new_handler m_new
static void newHandler()

Member Function Documentation

◆ addListener()

void AthenaSummarySvc::addListener ( const std::string & incident_name)
overridevirtual

Definition at line 224 of file AthenaSummarySvc.cxx.

224 {
225
226 ATH_MSG_DEBUG("now listening to incident " << inc);
227
228 if (m_extraIncidents.find( inc ) == m_extraIncidents.end()) {
229 p_incSvc->addListener( this, inc, 100, true);
230 m_extraIncidents[inc] = map<string,int>();
231 } else {
232 ATH_MSG_INFO("already listening to Incident " << inc);
233 }
234
235}
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
std::map< std::string, std::map< std::string, int > > m_extraIncidents

◆ addSummary()

void AthenaSummarySvc::addSummary ( const std::string & dict_key,
const std::string & data )
overridevirtual

Definition at line 240 of file AthenaSummarySvc.cxx.

240 {
241
242 ATH_MSG_DEBUG("adding extra info: " << dict << "/" << info);
243
244 m_extraInfo.push_back( make_pair(dict,info) );
245
246}
std::vector< std::pair< std::string, std::string > > m_extraInfo

◆ createASCII()

void AthenaSummarySvc::createASCII ( std::ofstream & ofs)
private

Definition at line 373 of file AthenaSummarySvc.cxx.

373 {
374
375 ATH_MSG_DEBUG("createASCII");
376
377 list<string>::const_iterator itr;
378
379 ofs << "Files read: " << m_inputFilesRead.size() << std::endl;
380 for (itr=m_inputFilesRead.begin(); itr != m_inputFilesRead.end(); ++itr) {
381 ofs << " " << *itr << endl;
382 }
383
384 ofs << "Files written: " << m_outputFiles.size() << std::endl;
385 for (itr=m_outputFiles.begin(); itr != m_outputFiles.end(); ++itr) {
386 ofs << " " << *itr << endl;
387 }
388
389 ofs << "File Write Error: " << m_outputFilesError.size() << std::endl;
390 for (itr=m_outputFilesError.begin(); itr != m_outputFilesError.end(); ++itr) {
391 ofs << " " << *itr << endl;
392 }
393
394 ofs << "Events Read: " << m_eventsRead << endl;
395 ofs << "Events Written: " << m_eventsWritten << endl;
396 ofs << "Events Skipped: " << m_eventsSkipped << endl;
397
398 ofs << "Runs: " << m_runs << endl;
399
400
401 ofs << "Message Count: " << endl;
402 ofs << " FATAL: " << msgSvc()->messageCount( MSG::FATAL ) << endl;
403 ofs << " ERROR: " << msgSvc()->messageCount( MSG::ERROR ) << endl;
404 ofs << " WARNING: " << msgSvc()->messageCount( MSG::WARNING ) << endl;
405 ofs << " INFO: " << msgSvc()->messageCount( MSG::INFO ) << endl;
406
407 if (p_logMsg != nullptr) {
408
409 IntegerProperty thresh("loggingLevel",MSG::VERBOSE);
410 IProperty *ip = dynamic_cast<IProperty*>( p_logMsg );
411 if (ip != nullptr) {
412 if (ip->getProperty(&thresh).isFailure()) {
413 ATH_MSG_ERROR("could not get loggingLevel property of LoggedMessageSvc");
414 }
415 } else {
416 ATH_MSG_ERROR("could not dcast LoggedMessageSvc to IProperty");
417 }
418
419
420
421 ofs << "Message Log: " << endl;
422 vector<pair<string,string> > msgs;
423 vector<pair<string,string> >::const_iterator mitr;
424 for (unsigned int l=thresh.value(); l < MSG::ALWAYS; l++) {
425 ofs << " " << levelNames[l];
426 msgs = p_logMsg->getMessages( MSG::Level(l) );
427 ofs << " " << msgs.size() << endl;
428 for (mitr=msgs.begin(); mitr != msgs.end(); ++mitr) {
429 ofs << " " << mitr->first << " : " << mitr->second << endl;
430 }
431 }
432
433 ofs << "Keyword tracked messages: " << endl;
434 for (const auto& msg : p_logMsg->getKeyMessages()) {
435 ofs << " " << levelNames[msg.level]
436 << " " << msg.source
437 << " " << msg.message
438 << endl;
439 }
440
441 }
442
443 if (m_extraInfo.size() > 0) {
444 ofs << "Extra Summary Info:" << endl;
445 vector<pair<string,string> >::const_iterator itr (m_extraInfo.begin() );
446 for (; itr != m_extraInfo.end(); ++itr) {
447 ofs << " " << itr->first << " : " << itr->second << endl;
448 }
449 }
450
451 if (m_extraIncidents.size() > 0) {
452 ofs << "Extra Incident Counts:" << endl;
453 map<string, map<string,int> >::const_iterator itr(m_extraIncidents.begin());
454 for (; itr != m_extraIncidents.end(); ++itr) {
455 ofs << " " << itr->first;
456 if (itr->second.begin() == itr->second.end()) {
457 ofs << " : 0" << endl;
458 } else {
459 for (map<string,int>::const_iterator it=itr->second.begin();
460 it != itr->second.end(); ++it) {
461 ofs << " :: " << it->first << ":" << it->second;
462 }
463 ofs << endl;
464 }
465 }
466 }
467
468 if (s_badalloc) {
469 ofs << "std::bad_alloc caught: out of memory condition detected"
470 << endl;
471 }
472
473 ofs << "Exit Status: " << m_status << endl;
474
475
476}
#define ATH_MSG_ERROR(x)
static const std::string levelNames[MSG::NUM_LEVELS]
std::list< std::string > m_outputFilesError
unsigned int m_eventsWritten
std::list< std::string > m_inputFilesRead
unsigned int m_runs
std::list< std::string > m_outputFiles
ILoggedMessageSvc * p_logMsg
unsigned int m_eventsRead
unsigned int m_eventsSkipped
l
Printing final latex table to .tex output file.
msgSvc
Provide convenience handles for various services.
Definition StdJOSetup.py:36
MsgStream & msg
Definition testRead.cxx:32

◆ createDict()

void AthenaSummarySvc::createDict ( std::ofstream & ofd)
private

Definition at line 480 of file AthenaSummarySvc.cxx.

480 {
481
482 ATH_MSG_DEBUG("createDict");
483
484 list<string>::const_iterator itr;
485
486 PD p;
487
488 PD files;
489 string f;
490 for (itr=m_inputFilesRead.begin(); itr != m_inputFilesRead.end(); ++itr) {
491 if (f.length() > 0) { f += ","; }
492 f += *itr;
493 }
494 files.add("read",f);
495
496 f.clear();
497 for (itr=m_outputFiles.begin(); itr != m_outputFiles.end(); ++itr) {
498 if (f.length() > 0) { f += ","; }
499 f += *itr;
500 }
501 files.add("write",f);
502
503 f.clear();
504 for (itr=m_outputFilesError.begin(); itr != m_outputFilesError.end(); ++itr) {
505 if (f.length() > 0) { f += ","; }
506 f += *itr;
507 }
508 files.add("write error",f);
509
510 p.add("files",files);
511
512 PD events;
513 events.add("read",m_eventsRead);
514 events.add("write",m_eventsWritten);
515 events.add("skip",m_eventsSkipped);
516
517 p.add("events",events);
518
519 p.add("runs",m_runs);
520
521 PD msg;
522 msg.add("FATAL",msgSvc()->messageCount( MSG::FATAL ));
523 msg.add("ERROR",msgSvc()->messageCount( MSG::ERROR ));
524 msg.add("WARNING",msgSvc()->messageCount( MSG::WARNING ));
525 msg.add("INFO",msgSvc()->messageCount( MSG::INFO ));
526
527 p.add("message count",msg);
528
529 if (p_logMsg != nullptr) {
530
531 IntegerProperty thresh("loggingLevel",MSG::VERBOSE);
532 IProperty *ip = dynamic_cast<IProperty*>( p_logMsg );
533 if (ip != nullptr) {
534 if (ip->getProperty(&thresh).isFailure()) {
535 ATH_MSG_ERROR("could not get loggingLevel property of LoggedMessageSvc");
536 }
537 } else {
538 ATH_MSG_ERROR("could not dcast LoggedMessageSvc to IProperty");
539 }
540
541 PD mlog;
542 vector<pair<string,string> > msgs;
543 vector<pair<string,string> >::const_iterator mitr;
544 for (unsigned int l=thresh.value(); l < MSG::ALWAYS; l++) {
545 PD slog;
546 msgs = p_logMsg->getMessages( MSG::Level(l) );
547 for (mitr=msgs.begin(); mitr != msgs.end(); ++mitr) {
548 slog.add(mitr->first, mitr->second);
549 }
550 mlog.add(levelNames[l],slog);
551 }
552
553 p.add("messages",mlog);
554
555 }
556
557 if (m_extraInfo.size() > 0) {
558 PD user;
559 vector<pair<string,string> >::const_iterator itr (m_extraInfo.begin() );
560 for (; itr != m_extraInfo.end(); ++itr) {
561 string dat = itr->second;
562 while( dat.find("\n") != string::npos) {
563 dat.erase(dat.find("\n"),1);
564 }
565 user.add(itr->first, dat);
566 }
567 p.add("user data",user);
568 }
569
570 if (m_extraIncidents.size() > 0) {
571 PD inc;
572 map<string, map<string,int> >::const_iterator itr(m_extraIncidents.begin());
573 for (; itr != m_extraIncidents.end(); ++itr) {
574 if (itr->second.begin() == itr->second.end()) {
575 inc.add(itr->first,0);
576 } else {
577 PD inc2;
578 for (map<string,int>::const_iterator it=itr->second.begin();
579 it != itr->second.end(); ++it) {
580 inc2.add(it->first, it->second);
581 }
582 inc.add(itr->first, inc2);
583 }
584 }
585
586// PD inc;
587// map<string, int>::const_iterator itr(m_extraIncidents.begin());
588// for (; itr != m_extraIncidents.end(); ++itr) {
589// inc.add(itr->first, itr->second);
590// }
591
592 p.add("extra incidents",inc);
593 }
594
595 p.add("exit",m_status);
596 p.add("bad_alloc",s_badalloc);
597
598 ofd << p.dump() << endl;
599
600}
void add(const string &a, const char *b)
std::vector< std::string > files
file names and file pointers
Definition hcg.cxx:50

◆ createSummary()

StatusCode AthenaSummarySvc::createSummary ( )
overridevirtual

Definition at line 342 of file AthenaSummarySvc.cxx.

342 {
343
344 ATH_MSG_DEBUG("createSummary");
345
346 std::ofstream ofs;
347 ofs.open(m_summaryFile.value().c_str());
348 if (!ofs) {
349 ATH_MSG_ERROR("Unable to open output file \"" << m_summaryFile.value() << "\"");
350 return StatusCode::FAILURE;
351 }
352
353 ATH_MSG_DEBUG("Writing to \"" << m_summaryFile.value() << "\"");
354
355 if (m_summaryFormat.value() == "ascii" || m_summaryFormat.value() == "both") {
356 createASCII(ofs);
357 }
358
359 if (m_summaryFormat.value() == "python" || m_summaryFormat.value() == "both") {
360 createDict(ofs);
361 }
362
363 ofs.close();
364
365 return StatusCode::SUCCESS;
366
367
368}
void createASCII(std::ofstream &)
StringProperty m_summaryFile
void createDict(std::ofstream &)
StringProperty m_summaryFormat

◆ finalize()

StatusCode AthenaSummarySvc::finalize ( )
overridevirtual

Definition at line 210 of file AthenaSummarySvc.cxx.

210 {
211
212 createSummary().ignore();
213
214 // cleanup
215 delete[] s_block; s_block = nullptr;
216 std::set_new_handler( m_new );
217
218 return StatusCode::SUCCESS;
219}
virtual StatusCode createSummary() override

◆ getOutputFile()

virtual const std::string & AthenaSummarySvc::getOutputFile ( ) const
inlineoverridevirtual

Definition at line 51 of file AthenaSummarySvc.h.

51{ return m_summaryFile; }

◆ handle()

void AthenaSummarySvc::handle ( const Incident & inc)
overrideprivatevirtual

Definition at line 292 of file AthenaSummarySvc.cxx.

292 {
293
294 ATH_MSG_DEBUG("handle incident: " << inc.type() << " " << inc.source());
295
296 string fileName;
297
298 const FileIncident *fi = dynamic_cast<const FileIncident*>( &inc );
299 if (fi != nullptr) {
300 // FIXME!!! waiting on AthenaPoolKernel-00-00-07
301 ATH_MSG_INFO(" -> file incident: " << fi->fileName() << " [GUID: " << fi->fileGuid() << "]");
302 fileName = fi->fileName();
303 } else {
304 fileName = inc.source();
305 }
306
307 if (inc.type() == "BeginInputFile" ) {
308 m_inputFilesRead.emplace_back( std::move(fileName) );
309 } else if (inc.type() == "BeginOutputFile") {
310 m_outputFiles.emplace_back( std::move(fileName) );
311 } else if (inc.type() == "FailOutputFile") {
312 m_outputFilesError.push_back( std::move(fileName) );
313 } else if (inc.type() == "BeginEvent") {
314 m_eventsRead ++;
315 } else if (inc.type() == "SkipEvent") {
317 } else if (inc.type() == "WriteEvent") {
319 } else if (inc.type() == "BeginRun") {
320 m_runs ++;
321 } else if (inc.type() == "EndRun") {
322 }
323
324 map<std::string, map<string,int> >::iterator itr
325 ( m_extraIncidents.find(inc.type()) );
326
327 if (itr != m_extraIncidents.end()) {
328 map<string,int>::iterator it = itr->second.find(inc.source());
329 if (it != itr->second.end()) {
330 m_extraIncidents[inc.type()][inc.source()]++;
331 } else {
332 m_extraIncidents[inc.type()][inc.source()] = 1;
333 }
334 }
335
336}

◆ initialize()

StatusCode AthenaSummarySvc::initialize ( )
overridevirtual

Definition at line 128 of file AthenaSummarySvc.cxx.

128 {
129
130 ATH_MSG_DEBUG("Initializing AthenaSummarySvc");
131
132 int pri=100;
133 p_incSvc->addListener( this, "BeginInputFile", pri, true);
134 p_incSvc->addListener( this, "EndInputFile", pri, true);
135 p_incSvc->addListener( this, "BeginOutputFile", pri, true);
136 p_incSvc->addListener( this, "FailOutputFile", pri, true);
137 p_incSvc->addListener( this, "WroteToOutputFile", pri, true);
138 p_incSvc->addListener( this, "EndOutputFile", pri, true);
139
140 p_incSvc->addListener( this, "AbortEvent", pri, true);
141
142 p_incSvc->addListener( this, "BeginEvent", pri, true);
143 p_incSvc->addListener( this, "EndEvent", pri, true);
144 p_incSvc->addListener( this, "BeginRun", pri, true);
145 p_incSvc->addListener( this, "EndRun", pri, true);
146
147 p_incSvc->addListener( this, "FirstInputFile", pri, true );
148
149 vector<string>::const_iterator itr;
150 for (itr=m_extraInc.value().begin(); itr != m_extraInc.value().end(); ++itr) {
151 ATH_MSG_DEBUG("Tracking incident \"" << *itr << "\"");
152 addListener(*itr);
153 }
154
155 p_logMsg = dynamic_cast< ILoggedMessageSvc* > ( msgSvc().get() );
156 if (p_logMsg == nullptr) {
157 ATH_MSG_INFO("unable dcast IMessageSvc to ILoggedMessageSvc: "
158 "not scanning for keywords in logs, or printing logged messages");
159 } else {
160
161 if (m_keywords.value().size() > 0) {
162 IProperty *ip = dynamic_cast<IProperty*>( p_logMsg );
163 if (ip != nullptr) {
164 if (ip->setProperty(m_keywords).isFailure()) {
165 ATH_MSG_ERROR("could not set keywords property of LoggedMessageSvc");
166 } else {
167 ATH_MSG_INFO("Scanning log for keyword \"" << m_keywords
168 << "\". CAVEAT EMPTOR - THIS IS VERY SLOW!!");
169 }
170 } else {
171 ATH_MSG_ERROR("could not dcast LoggedMessageSvc to IProperty");
172 }
173 }
174 }
175
176 std::string fmt = m_summaryFormat.value();
177 tolower(fmt);
179
180 // save some space for the summary output if we run out of memory
181 ATH_MSG_DEBUG("allocating block of 100 pages");
182 const long pageSize = sysconf( _SC_PAGESIZE );
183 if (pageSize < 1 || pageSize > 1024*1024*1024) {
184 ATH_MSG_FATAL ("Bad page size from sysconf");
185 return StatusCode::FAILURE;
186 }
187 s_block = new char[ pageSize * 100 ];
188
189
190 return StatusCode(s_block!=nullptr);
191
192}
#define ATH_MSG_FATAL(x)
void tolower(std::string &s)
const char *const fmt
StringArrayProperty m_extraInc
StringArrayProperty m_keywords
virtual void addListener(const std::string &incident_name) override
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ newHandler()

void AthenaSummarySvc::newHandler ( )
staticprivate

Definition at line 252 of file AthenaSummarySvc.cxx.

252 {
253
254 s_badalloc = true;
255
256 if ( ! s_block )
257 throw std::bad_alloc(); // default behavior (no print-out)
258
259 // release our block to create working space for finalize()
260 delete[] s_block; s_block = nullptr;
261
262 // print onto std::cerr rather than MsgStream, as it's more innocuous
263 std::cerr << "AthenaSummarySvc FATAL out of memory: saving summary ..."
264 << std::endl;
265
266 SmartIF<IAthenaSummarySvc> ipa(Gaudi::svcLocator()->service("AthenaSummarySvc"));
267
268 if (ipa) {
269 std::string btrace;
270 if ( System::backTrace(btrace,5,3) ) {
271 ipa->addSummary("badalloc backtrace",btrace);
272 }
273
274 ipa->setStatus(99);
275 ipa->createSummary().ignore();
276 } else {
277 std::cerr << "AthenaSummarySvc ERROR unable to get hold of myself and print summary"
278 << std::endl;
279 }
280
281
282 // in order to abort the job, throw a bad_alloc, which should make its way
283 // through to python, even if the ExceptionSvc is used, and that will shutdown
284 // (finalize/terminate) the application on exit
285 throw std::bad_alloc();
286
287}

◆ reinitialize()

StatusCode AthenaSummarySvc::reinitialize ( )
overridevirtual

Definition at line 196 of file AthenaSummarySvc.cxx.

196 {
197
198 delete[] s_block; s_block = nullptr;
199 long pageSize = sysconf( _SC_PAGESIZE );
200 if (pageSize < 1 || pageSize > 1024*1024*1024) {
201 ATH_MSG_FATAL ("Bad page size from sysconf");
202 return StatusCode::FAILURE;
203 }
204 s_block = new char[ pageSize * 100 ];
205 return s_block ? StatusCode::SUCCESS : StatusCode::FAILURE;
206
207}

◆ setStatus()

virtual void AthenaSummarySvc::setStatus ( int s)
inlineoverridevirtual

Definition at line 48 of file AthenaSummarySvc.h.

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/2]

char* s_block AthenaSummarySvc::ATLAS_THREAD_SAFE
staticprivate

Definition at line 74 of file AthenaSummarySvc.h.

◆ ATLAS_THREAD_SAFE [2/2]

bool s_badalloc AthenaSummarySvc::ATLAS_THREAD_SAFE
staticprivate

Definition at line 75 of file AthenaSummarySvc.h.

◆ m_eventsRead

unsigned int AthenaSummarySvc::m_eventsRead {0}
private

Definition at line 86 of file AthenaSummarySvc.h.

86{0};

◆ m_eventsSkipped

unsigned int AthenaSummarySvc::m_eventsSkipped {0}
private

Definition at line 88 of file AthenaSummarySvc.h.

88{0};

◆ m_eventsWritten

unsigned int AthenaSummarySvc::m_eventsWritten {0}
private

Definition at line 87 of file AthenaSummarySvc.h.

87{0};

◆ m_extraInc

StringArrayProperty AthenaSummarySvc::m_extraInc
private
Initial value:
{this, "ExtraIncidents", {},
"user incidets to monitor"}

Definition at line 65 of file AthenaSummarySvc.h.

65 {this, "ExtraIncidents", {},
66 "user incidets to monitor"};

◆ m_extraIncidents

std::map< std::string, std::map<std::string, int> > AthenaSummarySvc::m_extraIncidents
private

Definition at line 81 of file AthenaSummarySvc.h.

◆ m_extraInfo

std::vector< std::pair<std::string, std::string> > AthenaSummarySvc::m_extraInfo
private

Definition at line 82 of file AthenaSummarySvc.h.

◆ m_inputFilesRead

std::list<std::string> AthenaSummarySvc::m_inputFilesRead
private

Definition at line 77 of file AthenaSummarySvc.h.

◆ m_keywords

StringArrayProperty AthenaSummarySvc::m_keywords
private
Initial value:
{this, "keywords", {},
"kewords to scan for in MessageSvc. WARNING: THIS IS VERY SLOW!!!"}

Definition at line 67 of file AthenaSummarySvc.h.

67 {this, "keywords", {},
68 "kewords to scan for in MessageSvc. WARNING: THIS IS VERY SLOW!!!"};

◆ m_new

std::new_handler AthenaSummarySvc::m_new {nullptr}
private

Definition at line 84 of file AthenaSummarySvc.h.

84{nullptr};

◆ m_outputFiles

std::list<std::string> AthenaSummarySvc::m_outputFiles
private

Definition at line 78 of file AthenaSummarySvc.h.

◆ m_outputFilesError

std::list<std::string> AthenaSummarySvc::m_outputFilesError
private

Definition at line 79 of file AthenaSummarySvc.h.

◆ m_runs

unsigned int AthenaSummarySvc::m_runs {0}
private

Definition at line 89 of file AthenaSummarySvc.h.

89{0};

◆ m_status

int AthenaSummarySvc::m_status {0}
private

Definition at line 85 of file AthenaSummarySvc.h.

85{0};

◆ m_summaryFile

StringProperty AthenaSummarySvc::m_summaryFile
private
Initial value:
{this, "SummaryFile", "AthSummary.txt",
"Output File"}

Definition at line 61 of file AthenaSummarySvc.h.

61 {this, "SummaryFile", "AthSummary.txt",
62 "Output File"};

◆ m_summaryFormat

StringProperty AthenaSummarySvc::m_summaryFormat
private
Initial value:
{this, "SummaryFileFormat", "both",
"output format: one of 'ascii', 'python', 'both'"}

Definition at line 63 of file AthenaSummarySvc.h.

63 {this, "SummaryFileFormat", "both",
64 "output format: one of 'ascii', 'python', 'both'"};

◆ p_incSvc

ServiceHandle<IIncidentSvc> AthenaSummarySvc::p_incSvc
private

Definition at line 71 of file AthenaSummarySvc.h.

◆ p_logMsg

ILoggedMessageSvc* AthenaSummarySvc::p_logMsg {nullptr}
private

Definition at line 72 of file AthenaSummarySvc.h.

72{nullptr};

The documentation for this class was generated from the following files: