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;
178 r = m_f(
h->objKey() );
179 if ( r !=
h->objKey() )
h->updateKey( r );
182 r = m_f(
h->objKey() );
183 if ( r !=
h->objKey() )
h->updateKey( r );
191 this->m_updateDataHandles = std::make_unique<DHHFixer>( fixLocation );
200 template <
class PBASE>
212 if ( this->msgLevel(
MSG::DEBUG ) || ( statPrint() && !counters().empty() ) ) {
217 if ( m_counterSummarySvc && this->svcLoc()->existsService(
"CounterSummarySvc" ) ) {
218 if ( this->msgLevel(
MSG::DEBUG ) ) this->debug() <<
"adding counters to CounterSummarySvc" <<
endmsg;
223 for (
const auto& i : this->counters() ) {
224 if ( statList.Or( i.first ) )
226 else if ( counterList.Or( i.first ) )
227 m_counterSummarySvc->addCounter( this->name(), i.first, i.second );
232 this->debug() <<
"Tools to release :";
233 for (
const auto& i : m_managedTools ) {
234 this->debug() <<
" " << i->name();
238 while ( !m_managedTools.empty() ) {
239 sc = releaseTool( m_managedTools.back() ) && sc;
244 this->debug() <<
"Services to release :";
245 for (
const auto& i : m_services ) this->debug() <<
" " << i->name();
248 while ( !m_services.empty() ) {
249 sc = releaseSvc( m_services.front() ) && sc;
253 m_counterSummarySvc.reset();
256 if ( !m_errors.empty() || !m_warnings.empty() || !m_exceptions.empty() ) {
257 this->always() <<
"Exceptions/Errors/Warnings/Infos Statistics : " << m_exceptions.size() <<
"/" << m_errors.size()
258 <<
"/" << m_warnings.size() <<
"/" << m_infos.size() <<
endmsg;
259 if ( errorsPrint() ) {
266 m_exceptions.clear();
270 m_counterList.clear();
271 m_statEntityList.clear();
274 return sc && PBASE::finalize();
285 template <
class PBASE>
289 return Error(
"release(IInterface):: IInterface* points to NULL!" );
294 return algTool ? releaseTool( algTool ) : releaseSvc( interface );
301 template <
class PBASE>
305 return Error(
"releaseTool(IAlgTool):: IAlgTool* points to NULL!" );
307 if ( !this->toolSvc() ) {
308 return Error(
"releaseTool(IAlgTool):: IToolSvc* points to NULL!" );
311 auto it =
std::find( m_managedTools.begin(), m_managedTools.end(), algTool );
312 if ( m_managedTools.end() == it ) {
313 return Warning(
"releaseTool(IAlgTool):: IAlgTool* is not active" );
320 this->debug() <<
"Releasing tool '" << name <<
"'" <<
endmsg;
323 PBASE::deregisterTool( t );
324 m_managedTools.erase( it );
328 <<
"' is released" <<
endmsg;
330 const StatusCode sc = this->toolSvc()->releaseTool( t );
331 return sc.
isSuccess() ? sc : Warning(
"releaseTool(IAlgTool):: error from IToolSvc releasing " + name, sc );
338 template <
class PBASE>
341 if ( !Svc )
return Error(
"releaseSvc(IInterface):: IInterface* points to NULL!" );
343 if ( !svc )
return Warning(
"releaseSvc(IInterface):: IInterface* is not a service" );
346 return Warning(
"releaseSvc(IInterface):: IInterface* is not active" );
349 this->debug() <<
"Releasing service '" << ( *it )->name() <<
"'" <<
endmsg;
351 m_services.erase( it );
360 template <
class PBASE>
366 m_services.insert( i,
std::move( svc ) );
368 this->warning() <<
"Service " << svc->name() <<
" already present -- skipping" <<
endmsg;
381 template <
class PBASE>
385 const size_t num = ++m_errors[
msg];
391 return Print(
"The ERROR message is suppressed : '" + msg +
"'", st,
MSG::ERROR );
401 template <
class PBASE>
405 const size_t num = ++m_warnings[
msg];
411 return Print(
"The WARNING message is suppressed : '" + msg +
"'", st,
MSG::WARNING );
421 template <
class PBASE>
425 const size_t num = ++m_infos[
msg];
431 return Print(
"The INFO message is suppressed : '" + msg +
"'", st,
MSG::INFO );
441 template <
class PBASE>
445 if ( !this->msgLevel( lvl ) ) {
461 str <<
" StatusCode=" << st.
getCode();
463 str <<
" StatusCode=FAILURE";
477 template <
class PBASE>
482 Print(
"Exception (re)throw: " + msg, sc,
MSG::FATAL ).ignore();
490 template <
class PBASE>
495 Print(
"Exception (re)throw: " + msg, sc,
MSG::FATAL ).ignore();
503 template <
class PBASE>
508 Print(
"Exception throw: " + msg, sc,
MSG::FATAL ).ignore();
516 template <
class PBASE>
520 if ( counters().empty() ) {
525 msg <<
"Number of counters : " << counters().size();
527 if ( !counters().empty() ) {
531 for (
const auto& entry : counters() ) {
538 return counters().size();
545 template <
class PBASE>
549 boost::format ftm(
" #%|-10s| = %|.8s| %|23t| Message = '%s'" );
552 for (
const auto& i : c ) {
553 this->msgStream( level ) << ( ftm % label % i.second % i.first ) <<
endmsg;
557 print( m_exceptions,
"EXCEPTIONS" );
558 print( m_errors,
"ERRORS" );
559 print( m_warnings,
"WARNINGS" );
560 print( m_infos,
"INFOS" );
563 return m_exceptions.size() + m_errors.size() + m_warnings.size() + m_infos.size();
572 template <
class PBASE>
582 msg <<
"Property ['Name': Value] = " << *
property <<
endmsg;
595 template <
class PBASE>
597 const bool useRootInTES )
const 600 Assert( svc,
"put():: Invalid 'service'!" );
601 Assert(
object,
"put():: Invalid 'Object'!" );
602 Assert( !location.
empty(),
"put():: Invalid 'address' = '' " );
604 const std::string& fullLocation = fullTESLocation( location, useRootInTES );
610 Exception(
"put():: could not register '" +
System::typeinfoName(
typeid( *
object ) ) +
"' at address '" +
615 Print(
"The object of type '" +
System::typeinfoName(
typeid( *
object ) ) +
"' is registered in TS at address '" +
627 template <
class PBASE>
634 if ( this->errorsPrint() ) {
641 template <
class PBASE>
648 if ( this->propsPrint() ) {
655 template <
class PBASE>
662 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
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".
reverse_wrapper< T > reverse(T &&iterable)
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.
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.