15#include "Gaudi/Interfaces/IOptionsSvc.h"
16#include "GaudiKernel/IMessageSvc.h"
17#include "GaudiKernel/ISvcLocator.h"
18#include "GaudiKernel/ITHistSvc.h"
19#include "GaudiKernel/MsgStream.h"
20#include "Gaudi/Property.h"
21#include "GaudiKernel/ServiceHandle.h"
61 std::map<IMonitorToolBase*,ToolBench*>::iterator it, itE;
71 typedef std::map<std::string,TObject*>
ObjMap_t;
150 std::map<IMonitorToolBase*,ToolBench*>::iterator it =
m_toolbenchmarks.find(t);
185std::string strToLower(
const std::string&
str );
198 ,
m_d(new
Imp(this, name))
233 std::string lcstr( strToLower(
str) );
235 if( lcstr ==
"user" )
237 else if( lcstr ==
"nooutput" )
239 else if( lcstr ==
"online" )
241 else if( lcstr ==
"tier0" )
243 else if( lcstr ==
"tier0raw" )
245 else if( lcstr ==
"tier0esd" )
247 else if( lcstr ==
"aod" )
249 else if( lcstr ==
"altprod" )
255 MsgStream log( ms,
"AthenaMonManager::envStringToEnum()" );
256 log << MSG::WARNING <<
"Unknown AthenaMonManager::Environment_t \""
257 <<
str <<
"\", returning \"user\"" <<
endmsg;
269 std::string lcstr( strToLower(
str) );
271 if( lcstr ==
"userdefined" )
273 else if( lcstr ==
"montecarlo" )
275 else if( lcstr ==
"collisions" )
277 else if( lcstr ==
"cosmics" )
279 else if( lcstr ==
"heavyioncollisions" )
285 MsgStream log( ms,
"AthenaMonManager::dataTypeStringToEnum()" );
286 log << MSG::WARNING <<
"Unknown AthenaMonManager::DataType_t \""
287 <<
str <<
"\", returning \"userDefined\"" <<
endmsg;
299 return Imp::s_environment;
303 return Imp::s_LBsLowStat;
306 return Imp::s_LBsMedStat;
309 return Imp::s_LBsHigStat;
316 return Imp::s_dataType;
322 return m_d->m_forkedProcess;
330 if (Imp::s_runLBOverridden) {
331 return Imp::s_lumiBlock;
333 return Gaudi::Hive::currentContext().eventID().lumi_block();
342 if (Imp::s_runLBOverridden) {
345 return Gaudi::Hive::currentContext().eventID().run_number();
364 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"AthenaMonManager::initialize():" <<
endmsg;
372 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" --> Initializing static data" <<
endmsg;
375 msg(MSG::DEBUG) <<
" * \"ManualDataTypeSetup\" = " <<
m_d->m_manualDataTypeSetupProp <<
endmsg;
379 if(
m_d->m_manualDataTypeSetupProp ) {
380 Imp::s_dataTypeStr =
m_d->m_dataTypeProp;
386 Imp::s_dataTypeStr =
m_d->m_dataTypeProp;
390 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" * \"DataType\" = " << Imp::s_dataType <<
endmsg;
392 Imp::s_environmentStr =
m_d->m_environmentProp;
395 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" * \"Environment\" = " << Imp::s_environment <<
endmsg;
397 Imp::s_LBsLowStat =
m_d->m_LBsLowStatProp;
398 Imp::s_LBsMedStat =
m_d->m_LBsMedStatProp;
399 Imp::s_LBsHigStat =
m_d->m_LBsHigStatProp;
401 msg(MSG::DEBUG) <<
" * \"LBsInLowStatInterval\" = " << Imp::s_LBsLowStat <<
endmsg;
402 msg(MSG::DEBUG) <<
" * \"LBsInMediumStatInterval\" = " << Imp::s_LBsMedStat <<
endmsg;
403 msg(MSG::DEBUG) <<
" * \"LBsInHighStatInterval\" = " << Imp::s_LBsHigStat <<
endmsg;
406 m_d->m_isPrimaryManager =
true;
409 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" * \"ManualRunLBSetup\" = " <<
m_d->m_manualRunLBProp <<
endmsg;
411 if(
m_d->m_manualRunLBProp ) {
412 Imp::s_run =
m_d->m_runProp;
413 Imp::s_lumiBlock =
m_d->m_lumiBlockProp;
414 Imp::s_runLBOverridden =
true;
416 msg(MSG::DEBUG) <<
" --> using run = " << Imp::s_run <<
", lumiBlock = " << Imp::s_lumiBlock <<
endmsg;
419 msg(MSG::DEBUG) <<
" --> using run = " << Imp::s_run <<
", lumiBlock = " << Imp::s_lumiBlock <<
endmsg;
424 m_d->m_dataTypeProp = Imp::s_dataTypeStr;
425 m_d->m_environmentProp = Imp::s_environmentStr;
432 const std::string client = name() + std::string(
"Properties");
433 ATH_MSG_DEBUG(
" --> Adding properties under name \"" << client <<
"\"");
434 joSvc->set( client +
".FileKey",
m_d->m_fileKeyProp );
435 joSvc->set( client +
".DataType",
m_d->m_dataTypeProp );
436 joSvc->set( client +
".Environment",
m_d->m_environmentProp );
440 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" --> Retrieved AthenaMonTools" <<
endmsg;
443 m_d->m_eventCounter =
m_d->m_everyNevents;
445 ToolHandleArray<IMonitorToolBase>::iterator monToolsEnd =
m_monTools.end();
446 for( ToolHandleArray<IMonitorToolBase>::iterator i =
m_monTools.begin(); i != monToolsEnd; ++i ) {
447 ToolHandle<IMonitorToolBase>& tool = *i;
454 if (
m_d->m_doResourceMon) {
456 tb->m_bench_alginit_retrieve = bench_tmp;
460 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" --> Exiting successfully" <<
endmsg;
462 return StatusCode::SUCCESS;
470 m_d->m_forkedProcess=
false;
471 pid_t currPID=getpid();
473 if (
m_d->m_lastPID!=0 &&
m_d->m_lastPID!=currPID) {
474 m_d->m_forkedProcess=
true;
477 m_d->m_lastPID=currPID;
480 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"AthenaMonManager::execute():" <<
endmsg;
486 if (name() ==
"HLTMonManager") {
487 ATH_MSG_DEBUG(
"HLTMonManager is obtaining the TrigNavigationThinningSvc lock in slot "
488 << Gaudi::Hive::currentContext().slot() <<
" for event " << Gaudi::Hive::currentContext().eventID().event_number() );
494 ToolHandleArray<IMonitorToolBase>::iterator monToolsEnd =
m_monTools.end();
495 for( ToolHandleArray<IMonitorToolBase>::iterator i =
m_monTools.begin(); i != monToolsEnd; ++i ) {
496 ToolHandle<IMonitorToolBase>& tool = *i;
497 m_d->toolAudStart(tool);
499 if (
m_d->m_doResourceMon)
501 if( tool->preSelector() ) {
503 sc = tool->fillHists();
505 if( !
sc.isSuccess() ) {
506 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"IMonitorToolBase::fillHists() unsuccessful" <<
endmsg;
511 if (
m_d->m_doResourceMon) {
514 tb->m_bench_algexec_fillHists += bench_tmp;
515 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" --> m_doResourceMon is True" <<
endmsg;
519 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" --> Done calling IMonitorToolBase::fillHists()" <<
endmsg;
521 if(
m_d->m_eventCounter > 0 ) {
522 m_d->m_eventCounter--;
524 else if(
m_d->m_eventCounter == 0 ) {
525 for( ToolHandleArray<IMonitorToolBase>::iterator i =
m_monTools.begin(); i != monToolsEnd; ++i ) {
526 ToolHandle<IMonitorToolBase>& tool = *i;
527 m_d->toolAudStart(tool);
530 if (
m_d->m_doResourceMon)
532 sc = tool->checkHists(
false);
533 if (
m_d->m_doResourceMon) {
536 tb->m_bench_algexec_checkHists += bench_tmp;
538 if( !
sc.isSuccess() ) {
539 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"IMonitorToolBase::checkHists() unsuccessful" <<
endmsg;
543 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" --> Done calling IMonitorToolBase::checkHists()" <<
endmsg;
545 m_d->m_eventCounter =
m_d->m_everyNevents;
547 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" --> Exiting successfully" <<
endmsg;
549 ATH_MSG_DEBUG(name() <<
" is releasing the TrigNavigationThinningSvc lock");
550 return StatusCode::SUCCESS;
558 return StatusCode::SUCCESS;
566 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"AthenaMonManager::finalize():" <<
endmsg;
570 ToolHandleArray<IMonitorToolBase>::iterator monToolsEnd =
m_monTools.end();
571 for( ToolHandleArray<IMonitorToolBase>::iterator i =
m_monTools.begin(); i != monToolsEnd; ++i ) {
572 ToolHandle<IMonitorToolBase>& tool = *i;
573 m_d->toolAudStart(tool);
575 sc = tool->runStat();
576 if( !
sc.isSuccess() ) {
577 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"IMonitorToolBase::runStat() unsuccessful" <<
endmsg;
582 tb->m_bench_algfin_finalHists.startMeasurement();
583 sc = tool->finalHists();
585 tb->m_bench_algfin_finalHists.finishMeasurement();
586 if( !
sc.isSuccess() ) {
587 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"IMonitorToolBase::finalHists() unsuccessful" <<
endmsg;
590 tb->m_bench_algfin_checkHists.startMeasurement();
591 sc = tool->checkHists(
true);
593 tb->m_bench_algfin_checkHists.finishMeasurement();
594 if( !
sc.isSuccess() ) {
595 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"IMonitorToolBase::checkHists() unsuccessful" <<
endmsg;
602 msg(MSG::DEBUG) <<
" --> Done calling IMonitorToolBase::finalHists() and IMonitorToolBase::checkHists()" <<
endmsg;
603 msg(MSG::DEBUG) <<
" --> Exiting successfully" <<
endmsg;
605 return StatusCode::SUCCESS;
614 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"AthenaMonManager::start():" <<
endmsg;
618 ToolHandleArray<IMonitorToolBase>::iterator monToolsEnd =
m_monTools.end();
619 for( ToolHandleArray<IMonitorToolBase>::iterator i =
m_monTools.begin(); i != monToolsEnd; ++i ) {
620 ToolHandle<IMonitorToolBase>& tool = *i;
621 m_d->toolAudStart(tool);
623 if (
m_d->m_doResourceMon)
625 sc = tool->bookHists();
626 if (
m_d->m_doResourceMon) {
629 tb->m_bench_algexec_bookHists += bench_tmp;
631 if( !
sc.isSuccess() ) {
632 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"IMonitorToolBase::bookHists() unsuccessful" <<
endmsg;
637 msg(MSG::DEBUG) <<
" --> Done calling IMonitorToolBase::bookHists()" <<
endmsg;
638 msg(MSG::DEBUG) <<
" --> Exiting successfully" <<
endmsg;
641 return StatusCode::SUCCESS;
649 return m_d->m_fileKeyProp;
657 m_d->m_objMap.emplace( key,
h );
668 Imp::ObjMap_t::iterator i =
m_d->m_objMap.find( key );
669 if( i !=
m_d->m_objMap.end() ) {
670 TObject* o = i->second;
671 TH1*
h =
dynamic_cast<TH1*
>( o );
677 bool doRecursiveReferenceDelete = gROOT->MustClean();
678 gROOT->SetMustClean(
false);
679 TDirectory* dir =
h->GetDirectory();
680 TDirectory* g = gDirectory;
687 if( !
sc.isSuccess() ) {
688 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"AthenaMonManager::WriteAndDeleteHist(): Failure to deReg( TObject* )" <<
endmsg;
691 gROOT->SetMustClean(doRecursiveReferenceDelete);
692 m_d->m_objMap.erase( key );
707std::string strToLower(
const std::string&
str )
709 std::string lstr(
str);
710 std::string::const_iterator from =
str.begin();
711 std::string::const_iterator strend =
str.end();
712 std::string::iterator to = lstr.begin();
713 while( from != strend ) {
#define ATH_CHECK
Evaluate an expression and check for errors.
void tolower(std::string &s)
Define macros for attributes used to control the static checker.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
bool msgLvl(const MSG::Level lvl) const
Header file for AthHistogramAlgorithm.
static const MSG::Level s_resourceMonThreshold
unsigned m_mgcopies_initval
AthenaMonManager * m_theManager
std::string m_fileKeyProp
std::map< std::string, TObject * > ObjMap_t
unsigned int m_LBsMedStatProp
Imp(AthenaMonManager *man, const std::string &name)
unsigned int m_LBsLowStatProp
std::string m_environmentProp
static std::atomic< bool > s_staticDataAreInit
unsigned m_nMonGroupCopies
std::string m_dataTypeProp
ToolBench * getToolBench(IMonitorToolBase *t)
unsigned int m_LBsHigStatProp
bool m_manualDataTypeSetupProp
static std::string s_dataTypeStr ATLAS_THREAD_SAFE
void toolAudStart(const T &tool)
SmartIF< ISGAudSvc > m_sgAudSvc
std::map< IMonitorToolBase *, ToolBench * > m_toolbenchmarks
unsigned int m_lumiBlockProp
static std::atomic< ISvcLocator * > s_svcLocator
virtual StatusCode start()
virtual StatusCode stop()
static unsigned int getLBsLowStat()
ToolHandleArray< IMonitorToolBase > m_monTools
DataType_t
An enumeration of the different types of data the monitoring application may be running over.
ServiceHandle< ITHistSvc > m_THistSvc
static unsigned int fillNumber()
static Environment_t envStringToEnum(const std::string &str)
Converts a string to an Environment_t of the same name.
static DataType_t dataTypeStringToEnum(const std::string &str)
Converts a string to a DataType_t of the same name.
Environment_t
An enumeration of the different types of running environment the monitoring application may be in.
virtual void writeAndDelete(const std::string &key)
If the TObject is owned by this manager, its Write() method is called and it is deleted.
virtual StatusCode finalize()
static unsigned int getLBsHigStat()
AthenaMonManager(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode execute()
virtual StatusCode initialize()
static unsigned int getLBsMedStat()
static unsigned int lumiBlockNumber()
virtual std::string fileKey() const
static Environment_t environment()
Returns the running environment of the monitoring application to help ManagedMonitorToolBase objects ...
virtual ~AthenaMonManager()
static unsigned int runNumber()
static DataType_t dataType()
Returns the data type that the monitoring application is running over to help ManagedMonitorToolBase ...
virtual void passOwnership(TObject *h, const std::string &key)
Pass ownership of a TObject to this manager so that it will be deleted appropriately.
static std::mutex s_mutex