51 #include "boost/format.hpp" 55 #pragma warning( disable : 4661 ) // incomplete explicit templates 62 template <
class PBASE>
71 if (
const GaudiAlgorithm* gAlg = dynamic_cast<const GaudiAlgorithm*>( parent ) ) {
72 m_context = gAlg->context();
73 m_rootInTES = gAlg->rootInTES();
74 }
else if (
const GaudiTool* gTool = dynamic_cast<const GaudiTool*>( parent ) ) {
75 m_context = gTool->context();
76 m_rootInTES = gTool->rootInTES();
82 if ( !jos.
isValid() ) Exception(
"Cannot get JobOptionsSvc" );
88 for (
const auto& iter : *myList ) {
91 if ( iter->name().compare(
"Context" ) == 0 ) {
92 m_context = sp->
value();
93 }
else if ( iter->name().compare(
"RootInTES" ) == 0 ) {
94 m_rootInTES = sp->
value();
105 template <
class PBASE>
118 return Error(
"Failed to initialise base class PBASE", sc );
124 if ( !context().empty() ) this->debug() <<
"Created with context = '" << context() <<
"'" <<
endmsg;
128 if ( !m_rootInTES.empty() && m_rootInTES[m_rootInTES.size() - 1] !=
'/' ) m_rootInTES = m_rootInTES +
"/";
131 m_counterSummarySvc = this->svcLoc()->service(
"CounterSummarySvc",
false );
133 if ( !m_counterSummarySvc )
134 this->debug() <<
"could not locate CounterSummarySvc, no counter summary will be made" <<
endmsg;
136 this->debug() <<
"found CounterSummarySvc OK" <<
endmsg;
140 if ( propsPrint() ) {
151 if (
"" != rootName &&
'/' != rootName[rootName.size() - 1] ) {
152 rootName = rootName +
"/";
158 result = ( result[0] ==
'/' ? result : rootName + result );
161 this->debug() <<
"Changing " <<
location <<
" to " << result <<
endmsg;
172 if ( idhh == 0 )
return;
176 r = m_f(
h->objKey() );
177 if ( r !=
h->objKey() )
h->updateKey( r );
180 r = m_f(
h->objKey() );
181 if ( r !=
h->objKey() )
h->updateKey( r );
189 this->m_updateDataHandles.reset(
new DHHFixer( fixLocation ) );
198 template <
class PBASE>
210 if ( this->msgLevel(
MSG::DEBUG ) || ( statPrint() && !counters().empty() ) ) {
215 if ( m_counterSummarySvc && this->svcLoc()->existsService(
"CounterSummarySvc" ) ) {
216 if ( this->msgLevel(
MSG::DEBUG ) ) this->debug() <<
"adding counters to CounterSummarySvc" <<
endmsg;
221 for (
const auto& i : this->counters() ) {
222 if ( statList.Or( i.first ) )
224 else if ( counterList.Or( i.first ) )
225 m_counterSummarySvc->addCounter( this->name(), i.first, i.second );
230 this->debug() <<
"Tools to release :";
231 for (
const auto& i : m_managedTools ) {
232 this->debug() <<
" " << i->name();
236 while ( !m_managedTools.empty() ) {
237 sc = releaseTool( m_managedTools.back() ) && sc;
242 this->debug() <<
"Services to release :";
243 for (
const auto& i : m_services ) this->debug() <<
" " << i->name();
246 while ( !m_services.empty() ) {
247 sc = releaseSvc( m_services.front() ) && sc;
251 m_counterSummarySvc.reset();
254 if ( !m_errors.empty() || !m_warnings.empty() || !m_exceptions.empty() ) {
255 this->always() <<
"Exceptions/Errors/Warnings/Infos Statistics : " << m_exceptions.size() <<
"/" << m_errors.size()
256 <<
"/" << m_warnings.size() <<
"/" << m_infos.size() <<
endmsg;
257 if ( errorsPrint() ) {
264 m_exceptions.clear();
268 m_counterList.clear();
269 m_statEntityList.clear();
272 return sc && PBASE::finalize();
283 template <
class PBASE>
287 return Error(
"release(IInterface):: IInterface* points to NULL!" );
292 return algTool ? releaseTool( algTool ) : releaseSvc( interface );
299 template <
class PBASE>
303 return Error(
"releaseTool(IAlgTool):: IAlgTool* points to NULL!" );
305 if ( !this->toolSvc() ) {
306 return Error(
"releaseTool(IAlgTool):: IToolSvc* points to NULL!" );
309 auto it =
std::find( m_managedTools.begin(), m_managedTools.end(), algTool );
310 if ( m_managedTools.end() == it ) {
311 return Warning(
"releaseTool(IAlgTool):: IAlgTool* is not active" );
318 this->debug() <<
"Releasing tool '" << name <<
"'" <<
endmsg;
321 PBASE::deregisterTool( t );
322 m_managedTools.erase( it );
326 <<
"' is released" <<
endmsg;
328 const StatusCode sc = this->toolSvc()->releaseTool( t );
329 return sc.
isSuccess() ? sc : Warning(
"releaseTool(IAlgTool):: error from IToolSvc releasing " + name, sc );
336 template <
class PBASE>
339 if ( !Svc )
return Error(
"releaseSvc(IInterface):: IInterface* points to NULL!" );
341 if ( !svc )
return Warning(
"releaseSvc(IInterface):: IInterface* is not a service" );
344 return Warning(
"releaseSvc(IInterface):: IInterface* is not active" );
347 this->debug() <<
"Releasing service '" << ( *it )->name() <<
"'" <<
endmsg;
349 m_services.erase( it );
358 template <
class PBASE>
364 m_services.insert( i,
std::move( svc ) );
366 this->warning() <<
"Service " << svc->name() <<
" already present -- skipping" <<
endmsg;
379 template <
class PBASE>
383 const size_t num = ++m_errors[
msg];
389 return Print(
"The ERROR message is suppressed : '" + msg +
"'", st,
MSG::ERROR );
399 template <
class PBASE>
403 const size_t num = ++m_warnings[
msg];
409 return Print(
"The WARNING message is suppressed : '" + msg +
"'", st,
MSG::WARNING );
419 template <
class PBASE>
423 const size_t num = ++m_infos[
msg];
429 return Print(
"The INFO message is suppressed : '" + msg +
"'", st,
MSG::INFO );
439 template <
class PBASE>
443 if ( !this->msgLevel( lvl ) ) {
459 str <<
" StatusCode=" << st.
getCode();
461 str <<
" StatusCode=FAILURE";
475 template <
class PBASE>
480 Print(
"Exception (re)throw: " + msg, sc,
MSG::FATAL ).ignore();
488 template <
class PBASE>
493 Print(
"Exception (re)throw: " + msg, sc,
MSG::FATAL ).ignore();
501 template <
class PBASE>
506 Print(
"Exception throw: " + msg, sc,
MSG::FATAL ).ignore();
514 template <
class PBASE>
518 if ( counters().empty() ) {
523 msg <<
"Number of counters : " << counters().size();
525 if ( !counters().empty() ) {
529 for (
const auto& entry : counters() ) {
536 return counters().size();
543 template <
class PBASE>
547 boost::format ftm(
" #%|-10s| = %|.8s| %|23t| Message = '%s'" );
550 for (
const auto& i : c ) {
551 this->msgStream( level ) << ( ftm % label % i.second % i.first ) <<
endmsg;
555 print( m_exceptions,
"EXCEPTIONS" );
556 print( m_errors,
"ERRORS" );
557 print( m_warnings,
"WARNINGS" );
558 print( m_infos,
"INFOS" );
561 return m_exceptions.size() + m_errors.size() + m_warnings.size() + m_infos.size();
570 template <
class PBASE>
580 msg <<
"Property ['Name': Value] = " << *
property <<
endmsg;
593 template <
class PBASE>
595 const bool useRootInTES )
const 598 Assert( svc,
"put():: Invalid 'service'!" );
599 Assert(
object,
"put():: Invalid 'Object'!" );
600 Assert( !location.
empty(),
"put():: Invalid 'address' = '' " );
602 const std::string& fullLocation = fullTESLocation( location, useRootInTES );
608 Exception(
"put():: could not register '" +
System::typeinfoName(
typeid( *
object ) ) +
"' at address '" +
613 Print(
"The object of type '" +
System::typeinfoName(
typeid( *
object ) ) +
"' is registered in TS at address '" +
625 template <
class PBASE>
632 if ( this->errorsPrint() ) {
639 template <
class PBASE>
646 if ( this->propsPrint() ) {
653 template <
class PBASE>
660 if ( this->statPrint() ) {
Definition of the MsgStream class used to transmit messages.
void printErrorHandler(Gaudi::Details::PropertyBase &)
handler for "ErrorPrint" property
virtual const std::string & rootName() const =0
Get Name of root Event.
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
DataObject * put(IDataProviderSvc *svc, DataObject *object, const std::string &location, const bool useRootInTES=true) const
Register a data object or container into Gaudi Event Transient Store.
Implementation of property with value of concrete type.
unsigned long getCode() const
Get the status code by value.
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
bool isSuccess() const
Test for a status code of SUCCESS.
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
void initGaudiCommonConstructor(const IInterface *parent=0)
Constructor initializations.
Data provider interface definition.
bool isFailure() const
Test for a status code of FAILURE.
GAUDI_API std::string formatAsTableRow(const StatEntity &counter, const bool flag, const std::string &format1=" |%|7d| |%|11.7g| |%|#11.5g| |%|#10.5g| |%|#10.5g| |%|#10.5g| |", const std::string &format2="*|%|7d| |%|11.5g| |(%|#9.7g| +- %|-#8.6g|)%%| ----- | ----- |")
print the counter in a form of the table row
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.
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.
The useful base class for data processing algorithms.
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".
virtual const std::vector< const Gaudi::Details::PropertyBase * > * getProperties(const std::string &client) const =0
Get the properties associated to a given client.
reverse_wrapper< T > reverse(T &&iterable)
bool isValid() const
Allow for check if smart pointer is valid.
StatusCode releaseTool(const IAlgTool *tool) const
manual forced (and 'safe') release of the tool
Implements the common functionality between GaudiTools and GaudiAlgorithms.
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 (.
long printStat(const MSG::Level level=MSG::ALWAYS) const
perform the actual printout of statistical counters
virtual StatusCode registerObject(const std::string &fullPath, DataObject *pObject)=0
Register object with the data store.
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.
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.