52 #include "boost/format.hpp" 53 #include "boost/tokenizer.hpp" 57 #pragma warning( disable : 4661 ) // incomplete explicit templates 64 template <
class PBASE>
73 if (
const GaudiAlgorithm* gAlg = dynamic_cast<const GaudiAlgorithm*>( parent ) ) {
74 m_context = gAlg->context();
75 m_rootInTES = gAlg->rootInTES();
76 }
else if (
const GaudiTool* gTool = dynamic_cast<const GaudiTool*>( parent ) ) {
77 m_context = gTool->context();
78 m_rootInTES = gTool->rootInTES();
83 auto jos = PBASE::template service<IJobOptionsSvc>(
"JobOptionsSvc" );
84 if ( !jos ) Exception(
"Cannot get JobOptionsSvc" );
87 const auto myList = jos->getProperties( this->
name() );
90 for (
const auto& iter : *myList ) {
93 if ( iter->name().compare(
"Context" ) == 0 ) {
94 m_context = sp->
value();
95 }
else if ( iter->name().compare(
"RootInTES" ) == 0 ) {
96 m_rootInTES = sp->
value();
107 template <
class PBASE>
120 return Error(
"Failed to initialise base class PBASE", sc );
126 if ( !context().empty() ) this->debug() <<
"Created with context = '" << context() <<
"'" <<
endmsg;
130 if ( !m_rootInTES.empty() && m_rootInTES[m_rootInTES.size() - 1] !=
'/' ) m_rootInTES = m_rootInTES +
"/";
133 m_counterSummarySvc = this->svcLoc()->service(
"CounterSummarySvc",
false );
135 if ( !m_counterSummarySvc )
136 this->debug() <<
"could not locate CounterSummarySvc, no counter summary will be made" <<
endmsg;
138 this->debug() <<
"found CounterSummarySvc OK" <<
endmsg;
142 if ( propsPrint() ) {
152 auto rootName = dataMgrSvc->
rootName();
153 if ( !rootName.empty() &&
'/' != rootName.back() ) rootName +=
"/";
156 auto tokens = boost::tokenizer<boost::char_separator<char>>{
location, boost::char_separator<char>{
":"}};
159 std::string r = fullTESLocation( tok, UseRootInTES );
161 if ( r[0] !=
'/' ) r = rootName + r;
162 return s.
empty() ? r : s +
':' + r;
165 this->debug() <<
"Changing " <<
location <<
" to " << result <<
endmsg;
179 r = m_f( h->objKey() );
180 if ( r != h->objKey() ) h->updateKey( r );
183 r = m_f( h->objKey() );
184 if ( r != h->objKey() ) h->updateKey( r );
192 this->m_updateDataHandles = std::make_unique<DHHFixer>( fixLocation );
201 template <
class PBASE>
213 if ( this->msgLevel(
MSG::DEBUG ) || ( statPrint() && !m_counters.empty() ) ) {
218 if ( m_counterSummarySvc && this->svcLoc()->existsService(
"CounterSummarySvc" ) ) {
219 if ( this->msgLevel(
MSG::DEBUG ) ) this->debug() <<
"adding counters to CounterSummarySvc" <<
endmsg;
224 for (
const auto& i : m_countersOwn ) {
225 if ( statList.Or( i.first ) )
227 else if ( counterList.Or( i.first ) )
228 m_counterSummarySvc->addCounter( this->name(), i.first, i.second );
233 this->debug() <<
"Tools to release :";
234 for (
const auto& i : m_managedTools ) {
235 this->debug() <<
" " << i->name();
239 while ( !m_managedTools.empty() ) {
245 this->debug() <<
"Services to release :";
246 for (
const auto& i : m_services ) this->debug() <<
" " << i->name();
249 while ( !m_services.empty() ) {
254 m_counterSummarySvc.reset();
257 if ( !m_errors.empty() || !m_warnings.empty() || !m_exceptions.empty() ) {
258 this->always() <<
"Exceptions/Errors/Warnings/Infos Statistics : " << m_exceptions.size() <<
"/" << m_errors.size()
259 <<
"/" << m_warnings.size() <<
"/" << m_infos.size() <<
endmsg;
260 if ( errorsPrint() ) {
267 m_countersOwn.clear();
268 m_exceptions.clear();
272 m_counterList.clear();
273 m_statEntityList.clear();
287 template <
class PBASE>
291 return Error(
"release(IInterface):: IInterface* points to NULL!" );
296 return algTool ? releaseTool( algTool ) : releaseSvc( interface );
303 template <
class PBASE>
307 return Error(
"releaseTool(IAlgTool):: IAlgTool* points to NULL!" );
309 if ( !this->toolSvc() ) {
310 return Error(
"releaseTool(IAlgTool):: IToolSvc* points to NULL!" );
313 auto it =
std::find( m_managedTools.begin(), m_managedTools.end(), algTool );
314 if ( m_managedTools.end() == it ) {
315 return Warning(
"releaseTool(IAlgTool):: IAlgTool* is not active" );
322 this->debug() <<
"Releasing tool '" << name <<
"'" <<
endmsg;
325 PBASE::deregisterTool( t );
326 m_managedTools.erase( it );
330 <<
"' is released" <<
endmsg;
332 const StatusCode sc = this->toolSvc()->releaseTool( t );
333 return sc.
isSuccess() ? sc : Warning(
"releaseTool(IAlgTool):: error from IToolSvc releasing " + name, sc );
340 template <
class PBASE>
343 if ( !Svc )
return Error(
"releaseSvc(IInterface):: IInterface* points to NULL!" );
345 if ( !svc )
return Warning(
"releaseSvc(IInterface):: IInterface* is not a service" );
348 return Warning(
"releaseSvc(IInterface):: IInterface* is not active" );
351 this->debug() <<
"Releasing service '" << ( *it )->name() <<
"'" <<
endmsg;
353 m_services.erase( it );
362 template <
class PBASE>
368 m_services.insert( i,
std::move( svc ) );
370 this->warning() <<
"Service " << svc->name() <<
" already present -- skipping" <<
endmsg;
383 template <
class PBASE>
387 const size_t num = ++m_errors[
msg];
393 return Print(
"The ERROR message is suppressed : '" + msg +
"'", st,
MSG::ERROR );
403 template <
class PBASE>
407 const size_t num = ++m_warnings[
msg];
413 return Print(
"The WARNING message is suppressed : '" + msg +
"'", st,
MSG::WARNING );
423 template <
class PBASE>
427 const size_t num = ++m_infos[
msg];
433 return Print(
"The INFO message is suppressed : '" + msg +
"'", st,
MSG::INFO );
443 template <
class PBASE>
447 if ( !this->msgLevel( lvl ) ) {
463 str <<
" StatusCode=" << st.
getCode();
465 str <<
" StatusCode=FAILURE";
479 template <
class PBASE>
484 Print(
"Exception (re)throw: " + msg, sc,
MSG::FATAL ).ignore();
492 template <
class PBASE>
497 Print(
"Exception (re)throw: " + msg, sc,
MSG::FATAL ).ignore();
505 template <
class PBASE>
510 Print(
"Exception throw: " + msg, sc,
MSG::FATAL ).ignore();
518 template <
class PBASE>
522 if ( m_counters.empty() ) {
527 msg <<
"Number of counters : " << m_counters.size();
529 if ( !m_counters.empty() ) {
530 msg <<
"\n" << m_header.value();
533 for (
const auto& entry : m_counters ) {
535 entry.second.get().print( ost, entry.first );
536 msg <<
"\n |" << ost.
str();
541 return m_counters.size();
548 template <
class PBASE>
552 boost::format ftm(
" #%|-10s| = %|.8s| %|23t| Message = '%s'" );
555 for (
const auto& i : c ) {
556 this->msgStream( level ) << ( ftm % label % i.second % i.first ) <<
endmsg;
560 print( m_exceptions,
"EXCEPTIONS" );
561 print( m_errors,
"ERRORS" );
562 print( m_warnings,
"WARNINGS" );
563 print( m_infos,
"INFOS" );
566 return m_exceptions.size() + m_errors.size() + m_warnings.size() + m_infos.size();
575 template <
class PBASE>
585 msg <<
"Property ['Name': Value] = " << *
property <<
endmsg;
598 template <
class PBASE>
603 Assert( svc,
"put():: Invalid 'service'!" );
604 Assert( static_cast<bool>(
object ),
"put():: Invalid 'Object'!" );
605 Assert( !location.
empty(),
"put():: Invalid 'address' = '' " );
607 const std::string& fullLocation = fullTESLocation( location, useRootInTES );
613 Exception(
"put():: could not register '" +
System::typeinfoName(
typeid( *
object ) ) +
"' at address '" +
618 Print(
"The object of type '" +
System::typeinfoName(
typeid( *
object ) ) +
"' is registered in TS at address '" +
624 return object.release();
631 template <
class PBASE>
638 if ( this->errorsPrint() ) {
645 template <
class PBASE>
652 if ( this->propsPrint() ) {
659 template <
class PBASE>
666 if ( this->statPrint() ) {
constexpr static const auto FAILURE
Definition of the MsgStream class used to transmit messages.
void printErrorHandler(Gaudi::Details::PropertyBase &)
handler for "ErrorPrint" property
Define general base for Gaudi exception.
void printStatHandler(Gaudi::Details::PropertyBase &)
handler for "StatPrint" property
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
StatusCode releaseSvc(const IInterface *svc) const
manual forced (and 'safe') release of the service
Implementation of property with value of concrete type.
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
void addToServiceList(SmartIF< IService > svc) const
Add the given service to the list of acquired services.
constexpr const struct GaudiCommon_details::svc_eq_t svc_eq
WARN_UNUSED StatusCode Error(const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
Print the error message and return with the given StatusCode.
Header file for class GaudiAlgorithm.
Gaudi::Details::PropertyBase * property(const std::string &name) const
void printPropsHandler(Gaudi::Details::PropertyBase &)
handler for "PropertiesPrint" property
Data provider interface definition.
virtual std::vector< Gaudi::DataHandle * > inputHandles() const =0
virtual std::vector< Gaudi::DataHandle * > outputHandles() const =0
virtual void visit(const IDataHandleHolder *)=0
constexpr const struct GaudiCommon_details::svc_lt_t svc_lt
This class is used for returning status codes from appropriate routines.
Definition of the basic interface.
WARN_UNUSED StatusCode Print(const std::string &msg, const StatusCode st=StatusCode::SUCCESS, const MSG::Level lev=MSG::INFO) const
Print the message and return with the given StatusCode.
DataObject * put(IDataProviderSvc *svc, std::unique_ptr< DataObject > object, const std::string &location, const bool useRootInTES=true) const
Register a data object or container into Gaudi Event Transient Store.
The useful base class for data processing algorithms.
WARN_UNUSED StatusCode Warning(const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
Print the warning message and return with the given StatusCode.
collection of useful utilities to print certain objects (currently used for implementation in class G...
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
details::reverse_wrapper< T > reverse(T &&iterable)
virtual const std::string & rootName() const =0
Get Name of root Event.
constexpr static const auto SUCCESS
virtual StatusCode registerObject(boost::string_ref fullPath, DataObject *pObject)=0
Register object with the data store.
StatusCode releaseTool(const IAlgTool *tool) const
manual forced (and 'safe') release of the tool
Implements the common functionality between GaudiTools and GaudiAlgorithms.
WARN_UNUSED StatusCode Info(const std::string &msg, const StatusCode st=StatusCode::SUCCESS, const size_t mx=10) const
Print the info message and return with the given StatusCode.
const ValueType & value() const
Backward compatibility (.
code_t getCode() const
Retrieve value ("checks" the StatusCode)
long printStat(const MSG::Level level=MSG::ALWAYS) const
perform the actual printout of statistical counters
const std::vector< Gaudi::Details::PropertyBase * > & getProperties() const override
get all properties
A DataObject is the base class of any identifiable object on any data store.
StatusCode release(const IInterface *interface) const
Manual forced (and 'safe') release of the active tool or service.
long printProps(const MSG::Level level=MSG::ALWAYS) const
perform the actual printout of properties
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
virtual const std::string & name() const =0
Retrieve the name of the instance.
void initGaudiCommonConstructor(const IInterface *parent=nullptr)
Constructor initializations.
long printErrors(const MSG::Level level=MSG::ALWAYS) const
perform the actual printout of error counters
void Exception(const std::string &msg, const GaudiException &exc, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
Create and (re)-throw a given GaudiException.