52 #include "boost/format.hpp" 53 #include "boost/tokenizer.hpp" 54 #include <boost/none.hpp> 55 #include <boost/optional.hpp> 59 #pragma warning( disable : 4661 ) // incomplete explicit templates 66 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();
81 auto jos = PBASE::template service<IJobOptionsSvc>(
"JobOptionsSvc" );
82 if ( !jos ) Exception(
"Cannot get JobOptionsSvc" );
85 const auto myList = jos->getProperties( this->
name() );
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() ) {
150 auto rootName = dataMgrSvc->
rootName();
151 if ( !rootName.empty() &&
'/' != rootName.back() ) rootName +=
"/";
153 auto fixLocation = [
this, rootName](
const DataObjID& id ) -> boost::optional<DataObjID> {
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;
166 if ( fixedLocation == location )
return boost::none;
170 this->debug() <<
"Changing " << location <<
" to " << fixedLocation <<
endmsg;
177 this->m_updateDependencies = fixLocation;
186 template <
class PBASE>
198 if ( this->msgLevel(
MSG::DEBUG ) || ( statPrint() && !m_counters.empty() ) ) {
203 if ( m_counterSummarySvc && this->svcLoc()->existsService(
"CounterSummarySvc" ) ) {
204 if ( this->msgLevel(
MSG::DEBUG ) ) this->debug() <<
"adding counters to CounterSummarySvc" <<
endmsg;
209 for (
const auto& i : m_countersOwn ) {
210 if ( statList.Or( i.first ) )
212 else if ( counterList.Or( i.first ) )
213 m_counterSummarySvc->addCounter( this->name(), i.first, i.second );
218 this->debug() <<
"Tools to release :";
219 for (
const auto& i : m_managedTools ) {
220 this->debug() <<
" " << i->name();
224 while ( !m_managedTools.empty() ) {
230 this->debug() <<
"Services to release :";
231 for (
const auto& i : m_services ) this->debug() <<
" " << i->name();
234 while ( !m_services.empty() ) {
239 m_counterSummarySvc.reset();
242 if ( !m_errors.empty() || !m_warnings.empty() || !m_exceptions.empty() ) {
243 this->always() <<
"Exceptions/Errors/Warnings/Infos Statistics : " << m_exceptions.size() <<
"/" << m_errors.size()
244 <<
"/" << m_warnings.size() <<
"/" << m_infos.size() <<
endmsg;
245 if ( errorsPrint() ) {
252 m_countersOwn.clear();
253 m_exceptions.clear();
257 m_counterList.clear();
258 m_statEntityList.clear();
272 template <
class PBASE>
276 return Error(
"release(IInterface):: IInterface* points to NULL!" );
281 return algTool ? releaseTool( algTool ) : releaseSvc( interface );
288 template <
class PBASE>
292 return Error(
"releaseTool(IAlgTool):: IAlgTool* points to NULL!" );
294 if ( !this->toolSvc() ) {
295 return Error(
"releaseTool(IAlgTool):: IToolSvc* points to NULL!" );
298 auto it =
std::find( m_managedTools.begin(), m_managedTools.end(), algTool );
299 if ( m_managedTools.end() == it ) {
300 return Warning(
"releaseTool(IAlgTool):: IAlgTool* is not active" );
307 this->debug() <<
"Releasing tool '" << name <<
"'" <<
endmsg;
310 PBASE::deregisterTool( t );
311 m_managedTools.erase( it );
315 <<
"' is released" <<
endmsg;
317 const StatusCode sc = this->toolSvc()->releaseTool( t );
318 return sc.
isSuccess() ? sc : Warning(
"releaseTool(IAlgTool):: error from IToolSvc releasing " + name, sc );
325 template <
class PBASE>
328 if ( !Svc )
return Error(
"releaseSvc(IInterface):: IInterface* points to NULL!" );
330 if ( !svc )
return Warning(
"releaseSvc(IInterface):: IInterface* is not a service" );
333 return Warning(
"releaseSvc(IInterface):: IInterface* is not active" );
336 this->debug() <<
"Releasing service '" << ( *it )->name() <<
"'" <<
endmsg;
338 m_services.erase( it );
347 template <
class PBASE>
353 m_services.insert( i,
std::move( svc ) );
355 this->warning() <<
"Service " << svc->name() <<
" already present -- skipping" <<
endmsg;
368 template <
class PBASE>
372 const size_t num = ++m_errors[
msg];
378 return Print(
"The ERROR message is suppressed : '" + msg +
"'", st,
MSG::ERROR );
388 template <
class PBASE>
392 const size_t num = ++m_warnings[
msg];
398 return Print(
"The WARNING message is suppressed : '" + msg +
"'", st,
MSG::WARNING );
408 template <
class PBASE>
412 const size_t num = ++m_infos[
msg];
418 return Print(
"The INFO message is suppressed : '" + msg +
"'", st,
MSG::INFO );
428 template <
class PBASE>
432 if ( !this->msgLevel( lvl ) ) {
448 str <<
" StatusCode=" << st.
getCode();
450 str <<
" StatusCode=FAILURE";
464 template <
class PBASE>
469 Print(
"Exception (re)throw: " + msg, sc,
MSG::FATAL ).ignore();
477 template <
class PBASE>
482 Print(
"Exception (re)throw: " + msg, sc,
MSG::FATAL ).ignore();
490 template <
class PBASE>
495 Print(
"Exception throw: " + msg, sc,
MSG::FATAL ).ignore();
503 template <
class PBASE>
508 unsigned int nbPrintedCounters = 0;
509 if ( !m_printEmptyCounters && !this->msgLevel(
MSG::DEBUG ) ) {
511 m_counters.begin(), m_counters.end(), nbPrintedCounters,
512 [](
unsigned int&
sum,
const auto& entry ) {
return sum + entry.second.get().toBePrinted(); } );
514 nbPrintedCounters = m_counters.size();
517 if ( nbPrintedCounters == 0 ) {
521 msg <<
"Number of counters : " << nbPrintedCounters <<
"\n" << m_header.value();
522 for (
const auto& entry : m_counters ) {
523 if ( m_printEmptyCounters || this->msgLevel(
MSG::DEBUG ) || entry.second.get().toBePrinted() ) {
525 entry.second.get().print( ost, entry.first );
526 msg <<
"\n" << ost.
str();
532 return nbPrintedCounters;
539 template <
class PBASE>
543 boost::format ftm(
" #%|-10s| = %|.8s| %|23t| Message = '%s'" );
546 for (
const auto& i : c ) {
547 this->msgStream( level ) << ( ftm % label % i.second % i.first ) <<
endmsg;
551 print( m_exceptions,
"EXCEPTIONS" );
552 print( m_errors,
"ERRORS" );
553 print( m_warnings,
"WARNINGS" );
554 print( m_infos,
"INFOS" );
557 return m_exceptions.size() + m_errors.size() + m_warnings.size() + m_infos.size();
566 template <
class PBASE>
576 msg <<
"Property ['Name': Value] = " << *
property <<
endmsg;
589 template <
class PBASE>
594 Assert( svc,
"put():: Invalid 'service'!" );
595 Assert( static_cast<bool>(
object ),
"put():: Invalid 'Object'!" );
596 Assert( !location.
empty(),
"put():: Invalid 'address' = '' " );
598 const std::string& fullLocation = fullTESLocation( location, useRootInTES );
604 Exception(
"put():: could not register '" +
System::typeinfoName(
typeid( *
object ) ) +
"' at address '" +
609 Print(
"The object of type '" +
System::typeinfoName(
typeid( *
object ) ) +
"' is registered in TS at address '" +
615 return object.release();
constexpr static const auto FAILURE
Definition of the MsgStream class used to transmit messages.
Define general base for Gaudi exception.
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.
double sum(double x, double y, double z)
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.
::details::reverse_wrapper< T > reverse(T &&iterable)
Header file for class GaudiAlgorithm.
Gaudi::Details::PropertyBase * property(const std::string &name) const
void updateKey(const std::string &key)
Data provider interface definition.
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...
virtual const std::string & rootName() const =0
Get Name of root Event.
constexpr static const auto SUCCESS
StatusCode registerObject(boost::string_ref fullPath, DataObject *pObject)
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.