Gaudi Framework, version v20r4

Generated: 8 Jan 2009

CounterSvc Class Reference

Inheritance diagram for CounterSvc:

Inheritance graph
[legend]
Collaboration diagram for CounterSvc:

Collaboration graph
[legend]

List of all members.


Detailed Description

Simple imeplementation of the abstract interface ICounterSvc.

Author:
Markus FRANK

Vanya BELYAEV ibelyaev@physics.syr.edu

Date:
2007-05-25

Definition at line 27 of file CounterSvc.cpp.


Public Member Functions

 CounterSvc (const std::string &name, ISvcLocator *svcLoc)
 Standard Constructor.
virtual ~CounterSvc ()
 Standard destructor.
virtual StatusCode queryInterface (const InterfaceID &riid, void **ppvI)
 Query interface.
virtual StatusCode finalize ()
 Finalization.
virtual Counterget (const std::string &group, const std::string &name) const
 Access an existing counter object.
virtual ICounterSvc::Counters get (const std::string &group) const
 get all counters form the given group:
virtual StatusCode create (const std::string &group, const std::string &name, longlong initial_value, Counter *&refpCounter)
 Create a new counter object.
virtual CountObject create (const std::string &group, const std::string &name, longlong initial_value=0)
 Create a new counter object.
virtual StatusCode remove (const std::string &group, const std::string &name)
 Remove a counter object.
virtual StatusCode remove (const std::string &group)
 Remove all counters of a givem group.
virtual StatusCode remove ()
 Remove all known counter objects.
virtual StatusCode print (const std::string &group, const std::string &name, Printout &printer) const
 Print counter value.
virtual StatusCode print (const std::string &group, Printout &printer) const
 If no such counter exists the return code is COUNTER_NOT_PRESENT Note: This call is not direct access.
virtual StatusCode print (const Counter *pCounter, Printout &printer) const
 Print counter value.
virtual StatusCode print (const CountObject &pCounter, Printout &printer) const
 Print counter value.
virtual StatusCode print (Printout &printer) const
virtual StatusCode defaultPrintout (MsgStream &log, const Counter *pCounter) const
 Default Printout for counters.
void print () const
 "standard" printout a'la GaudiCommon

Private Types

typedef GaudiUtils::HashMap
< std::string, Counter * > 
NameMap
typedef GaudiUtils::HashMap
< std::string, NameMap
CountMap

Private Member Functions

std::pair< std::string,
std::string > 
_find (const Counter *c) const
size_t num () const

Private Attributes

CountMap m_counts
 the actual map of counters
bool m_print
 boolean flag to print statistics
std::string m_header
 the header row
std::string m_format1
 format for regular statistical printout rows
std::string m_format2
 format for "efficiency" statistical printout rows
bool m_useEffFormat
 flag to use the special "efficiency" format

Member Typedef Documentation

typedef GaudiUtils::HashMap<std::string,Counter*> CounterSvc::NameMap [private]

Definition at line 234 of file CounterSvc.cpp.

typedef GaudiUtils::HashMap<std::string,NameMap> CounterSvc::CountMap [private]

Definition at line 235 of file CounterSvc.cpp.


Constructor & Destructor Documentation

CounterSvc::CounterSvc ( const std::string &  name,
ISvcLocator svcLoc 
) [inline]

Standard Constructor.

Definition at line 33 of file CounterSvc.cpp.

00035     : Service(name, svcLoc)
00036     , m_counts ()
00037     , m_print  ( true )
00038     //
00039     // the header row 
00040     , m_header  ( "       Counter :: Group         |     #     |    sum     | mean/eff^* | rms/err^*  |     min     |     max     |")
00041     // format for regular statistical printout rows
00042     , m_format1 ( " %|15.15s|%|-15.15s|%|32t||%|10d| |%|11.7g| |%|#11.5g| |%|#11.5g| |%|#12.5g| |%|#12.5g| |"         )
00043     // format for "efficiency" statistical printout rows
00044     , m_format2 ( "*%|15.15s|%|-15.15s|%|32t||%|10d| |%|11.5g| |(%|#9.7g| +- %|-#9.7g|)%%|   -------   |   -------   |" ) 
00045     // flag to use the special "efficiency" format 
00046     , m_useEffFormat ( true )
00047     //
00048   {
00049     declareProperty ("PrintStat" , m_print ) ;
00050     // 
00051     declareProperty 
00052       ( "StatTableHeader"        , m_header                          , 
00053         "The header row for the output Stat-table"                   ) ;
00054     //
00055     declareProperty 
00056       ( "RegularRowFormat"       , m_format1                         , 
00057         "The format for the regular row in the output Stat-table"    ) ;
00058     //
00059     declareProperty 
00060       ( "EfficiencyRowFormat"    , m_format2                         , 
00061         "The format for the regular row in the outptu Stat-table"    ) ; 
00062     //
00063     declareProperty 
00064       ( "UseEfficiencyRowFormat" , m_useEffFormat                    , 
00065         "Use the special format for printout of efficiency counters" ) ;
00066   }  

virtual CounterSvc::~CounterSvc (  )  [inline, virtual]

Standard destructor.

Definition at line 68 of file CounterSvc.cpp.

00068 { remove().ignore() ; };


Member Function Documentation

virtual StatusCode CounterSvc::queryInterface ( const InterfaceID riid,
void **  ppvI 
) [inline, virtual]

Query interface.

See also:
IInterface

Reimplemented from Service.

Definition at line 71 of file CounterSvc.cpp.

00072   {
00073     // valid placeholder? 
00074     if ( 0 == ppvI ) { return StatusCode::FAILURE ; }  // RETURN 
00075     if ( ICounterSvc::interfaceID() == riid ) 
00076     {
00077       *ppvI = static_cast<ICounterSvc*>(this);
00078       addRef(); // NB! : inrement the reference count!
00079       return StatusCode::SUCCESS;                     // RETURN
00080     }
00081     // Interface is not directly availible: try out a base class
00082     return Service::queryInterface( riid, ppvI );
00083   }

virtual StatusCode CounterSvc::finalize ( void   )  [inline, virtual]

Finalization.

< finalize the base class

Reimplemented from Service.

Definition at line 85 of file CounterSvc.cpp.

00086   {
00087     if ( outputLevel() <= MSG::DEBUG || m_print ) { print () ; }
00088     remove().ignore() ;
00089     // finalize the base class 
00090     return Service::finalize() ; 
00091   } 

CounterSvc::Counter * CounterSvc::get ( const std::string &  group,
const std::string &  name 
) const [virtual]

Access an existing counter object.

Parameters:
group [IN] Hint for smart printing
name [IN] Counter name
Returns:
Pointer to existing counter object (NULL if non existing).

Implements ICounterSvc.

Definition at line 257 of file CounterSvc.cpp.

00259 {
00260   CountMap::const_iterator i = m_counts.find  ( grp ) ;
00261   if (  m_counts.end() == i ) { return 0 ; }                    // RETURN 
00262   NameMap::const_iterator  j = i->second.find ( nam ) ;
00263   if ( i->second.end() == j ) { return 0 ; }                    // RETURN 
00264   return j->second ;                                            // RETURN 
00265 }

ICounterSvc::Counters CounterSvc::get ( const std::string &  group  )  const [virtual]

get all counters form the given group:

Implements ICounterSvc.

Definition at line 269 of file CounterSvc.cpp.

00270 {
00271   ICounterSvc::Counters result ;
00272   CountMap::const_iterator i = m_counts.find  ( group ) ;
00273   if (  m_counts.end() == i ) { return result ; } // RETURN 
00274   for ( NameMap::const_iterator j = i->second.begin() ; i->second.end() != j ; ++j ) 
00275   { result.push_back( CountObject ( j->second, i->first , j->first ) ) ; }
00276   return result ;
00277 } 

StatusCode CounterSvc::create ( const std::string &  group,
const std::string &  name,
longlong  initial_value,
Counter *&  refpCounter 
) [virtual]

Create a new counter object.

If the counter object exists already the existing object is returned. In this event the return code is COUNTER_EXISTS. The ownership of the actual counter stays with the service.

Parameters:
group [IN] Hint for smart printing
name [IN] Counter name
initial_value [IN] Initial counter value
refpCounter [OUT] Reference to store pointer to counter.
Returns:
StatusCode indicating failure or success.

Implements ICounterSvc.

Definition at line 282 of file CounterSvc.cpp.

00286 {
00287   // try to find existing counter:
00288   refpCounter = get ( grp , nam ) ;
00289   if ( 0 != refpCounter ) { return COUNTER_EXISTS ; }                // RETURN 
00290   // create the new counter 
00291   Counter* newc = new Counter() ;
00292   refpCounter = newc ;
00293   if ( 0 != initial_value ) {
00294         refpCounter->addFlag ( static_cast<double>(initial_value) ) ;
00295   }
00296   // find a proper group 
00297   CountMap::iterator i = m_counts.find  ( grp ) ;
00298   // (create a group if needed)
00299   if (  m_counts.end() == i ) 
00300   { i = m_counts.insert ( std::make_pair ( grp , NameMap() ) ).first ; }
00301   // insert new counter with priper name into proper group:
00302   i->second.insert( std::make_pair( nam , newc ) ).first ;
00303   return StatusCode::SUCCESS ;                                     // RETURN 
00304 }

CounterSvc::CountObject CounterSvc::create ( const std::string &  group,
const std::string &  name,
longlong  initial_value = 0 
) [virtual]

Create a new counter object.

If the counter object exists already, a std::runtime_error exception is thrown. The ownership of the actual counter stays with the service.

Parameters:
group [IN] Hint for smart printing
name [IN] Counter name
initial_value [IN] Initial counter value
refpCounter [OUT] Reference to store pointer to counter.
Returns:
Fully initialized CountObject.

Implements ICounterSvc.

Definition at line 309 of file CounterSvc.cpp.

00312 {
00313   Counter* p = 0;
00314   StatusCode sc = create ( group, name, initial_value, p ) ;
00315   if ( sc.isSuccess() && 0 != p ) { return CountObject ( p , group , name ) ; }
00316   throw std::runtime_error("CounterSvc::Counter('"+group+"::"+name+"') exists already!");
00317 }

StatusCode CounterSvc::remove ( const std::string &  group,
const std::string &  name 
) [virtual]

Remove a counter object.

If the counter object does not exists, the return code is COUNTER_NOT_PRESENT. The counter may not be used anymore after this call.

Parameters:
group [IN] Hint for smart printing
name [IN] Counter name
initial_value [IN] Initial counter value
refpCounter [OUT] Reference to store pointer to counter.
Returns:
StatusCode indicating failure or success.

Implements ICounterSvc.

Definition at line 322 of file CounterSvc.cpp.

00324 {
00325   CountMap::iterator i = m_counts.find  ( grp ) ;
00326   if (  m_counts.end() == i ) { return COUNTER_NOT_PRESENT ; }  // RETURN 
00327   NameMap::iterator  j = i->second.find ( nam ) ;
00328   if ( i->second.end() == j ) { return COUNTER_NOT_PRESENT ; }  // RETURN 
00329   delete j->second ;
00330   i->second.erase ( j ) ;
00331   return StatusCode::SUCCESS ;
00332 }

StatusCode CounterSvc::remove ( const std::string &  group  )  [virtual]

Remove all counters of a givem group.

If no such counter exists the return code is COUNTER_NOT_PRESENT

Parameters:
group [IN] Hint for smart printing
Returns:
StatusCode indicating failure or success.

Implements ICounterSvc.

Definition at line 336 of file CounterSvc.cpp.

00337 {
00338   CountMap::iterator i = m_counts.find ( grp  ) ;
00339   if (  m_counts.end() == i ) { return COUNTER_NOT_PRESENT ; }  // RETURN 
00340   for ( NameMap::iterator j = i->second.begin() ; i->second.end() != j ; ++j ) 
00341   { delete j->second ; }
00342   i->second.clear() ;
00343   return StatusCode::SUCCESS ;
00344 } 

StatusCode CounterSvc::remove (  )  [virtual]

Remove all known counter objects.

Definition at line 348 of file CounterSvc.cpp.

00349 {
00350   // remove group by group
00351   for ( CountMap::iterator i = m_counts.begin() ; m_counts.end() != i ; ++i ) 
00352   { remove ( i->first ).ignore () ; }
00353   m_counts.clear() ;
00354   return StatusCode::SUCCESS;
00355 }

StatusCode CounterSvc::print ( const std::string &  group,
const std::string &  name,
Printout printer 
) const [virtual]

Print counter value.

Parameters:
group [IN] Hint for smart printing
name [IN] Counter name
printer [IN] Print actor
Returns:
StatusCode indicating failure or success.

Implements ICounterSvc.

Definition at line 360 of file CounterSvc.cpp.

00363 {
00364   const Counter* c = get( grp , nam ) ;
00365   if ( 0 == c ) { return COUNTER_NOT_PRESENT ; }                  // RETURN
00366   // create the stream and use it!
00367   MsgStream log ( msgSvc() , name() ) ;
00368   return printer ( log , c ) ;
00369 }

StatusCode CounterSvc::print ( const std::string &  group,
Printout printer 
) const [virtual]

If no such counter exists the return code is COUNTER_NOT_PRESENT Note: This call is not direct access.

Parameters:
group [IN] Hint for smart printing
printer [IN] Print actor
Returns:
StatusCode indicating failure or success.

Implements ICounterSvc.

Definition at line 374 of file CounterSvc.cpp.

00376 {
00377   CountMap::const_iterator i = m_counts.find ( grp ) ;
00378   if ( m_counts.end() == i ) { return COUNTER_NOT_PRESENT ; }
00379   MsgStream log(msgSvc(), name()); 
00380   for ( NameMap::const_iterator  j = i->second.begin() ; i->second.end() != j ; ++j ) 
00381   { printer ( log , j->second ).ignore() ; }
00382   // 
00383   return StatusCode::SUCCESS;   // RETURN 
00384 }

StatusCode CounterSvc::print ( const Counter pCounter,
Printout printer 
) const [virtual]

Print counter value.

Parameters:
pCounter [IN] Pointer to Counter object
printer [IN] Print actor
Returns:
StatusCode indicating failure or success.

Implements ICounterSvc.

Definition at line 389 of file CounterSvc.cpp.

00391 {
00392   MsgStream log(msgSvc(), name() ) ;
00393   return printer ( log , pCounter ) ;
00394 }

StatusCode CounterSvc::print ( const CountObject pCounter,
Printout printer 
) const [virtual]

Print counter value.

Parameters:
refCounter [IN] Reference to CountObject object
printer [IN] Print actor
Returns:
StatusCode indicating failure or success.

Implements ICounterSvc.

Definition at line 399 of file CounterSvc.cpp.

00401 { return print( refCounter.counter() , printer ) ; }

StatusCode CounterSvc::print ( Printout printer  )  const [virtual]

Parameters:
printer [IN] Print actor
Returns:
StatusCode indicating failure or success.

Implements ICounterSvc.

Definition at line 405 of file CounterSvc.cpp.

00406 {
00407   MsgStream log ( msgSvc() , name() ) ;
00408   for( CountMap::const_iterator i = m_counts.begin(); i != m_counts.end(); ++i)  
00409   { 
00410     for ( NameMap::const_iterator j = i->second.begin() ; i->second.end() != j ; ++j ) 
00411     { printer ( log , j->second ).ignore() ; }
00412   }
00413   return StatusCode::SUCCESS;
00414 }

StatusCode CounterSvc::defaultPrintout ( MsgStream log,
const Counter pCounter 
) const [virtual]

Default Printout for counters.

Implements ICounterSvc.

Definition at line 419 of file CounterSvc.cpp.

00421 {
00422   if ( 0 == c ) { return StatusCode::FAILURE ; }
00423   std::pair<std::string,std::string> p = _find ( c ) ;
00424   
00425   log << MSG::ALWAYS 
00426       << CountObject( const_cast<Counter*>(c) , p.first , p.second ) 
00427       << endreq ;
00428   
00429   return StatusCode::SUCCESS;
00430 }

std::pair<std::string,std::string> CounterSvc::_find ( const Counter c  )  const [inline, private]

Definition at line 207 of file CounterSvc.cpp.

00208   {
00209     if ( 0 == c ) { return std::pair<std::string,std::string>() ; }
00210     for ( CountMap::const_iterator i = m_counts.begin() ; m_counts.end() != i ; ++i ) 
00211     {
00212       for ( NameMap::const_iterator j = i->second.begin() ; i->second.end() != j ; ++j ) 
00213       { if ( j->second == c ) { return std::make_pair( i->first , j->first )  ; } }
00214     }
00215     return std::pair<std::string,std::string>() ; 
00216   }

size_t CounterSvc::num (  )  const [inline, private]

Definition at line 218 of file CounterSvc.cpp.

00219   {
00220     size_t result = 0 ;
00221     {
00222       for ( CountMap::const_iterator i = m_counts.begin(); i != m_counts.end(); ++i )  
00223       { 
00224         for ( NameMap::const_iterator j = i->second.begin() ; i->second.end() != j ; ++j ) 
00225         { if ( 0 != j->second ) { ++result ; } ; }
00226       }
00227     }
00228     return result ;
00229   }

void CounterSvc::print (  )  const

"standard" printout a'la GaudiCommon

Definition at line 434 of file CounterSvc.cpp.

00435 {
00436   MsgStream log ( msgSvc() , name() ) ;
00437   // number of counters 
00438   const size_t _num = num() ;
00439   if ( 0 != _num ) 
00440   {
00441     log << MSG::ALWAYS 
00442         << "Number of counters : "  << _num << endreq 
00443         << m_header << endreq ;
00444   }  
00445   for ( CountMap::const_iterator i = m_counts.begin(); i != m_counts.end(); ++i )  
00446   { 
00447     for ( NameMap::const_iterator j = i->second.begin() ; i->second.end() != j ; ++j ) 
00448     {
00449       Counter* c = j->second ;
00450       if ( 0 == c ) { continue ; }
00451       log <<
00452         Gaudi::Utils::formatAsTableRow
00453         ( j->first , i->first , *c , m_useEffFormat , m_format1 , m_format2 ) 
00454           << endreq ;
00455     }
00456   } 
00457 }


Member Data Documentation

the actual map of counters

Definition at line 237 of file CounterSvc.cpp.

bool CounterSvc::m_print [private]

boolean flag to print statistics

Definition at line 239 of file CounterSvc.cpp.

std::string CounterSvc::m_header [private]

the header row

Definition at line 241 of file CounterSvc.cpp.

std::string CounterSvc::m_format1 [private]

format for regular statistical printout rows

Definition at line 243 of file CounterSvc.cpp.

std::string CounterSvc::m_format2 [private]

format for "efficiency" statistical printout rows

Definition at line 245 of file CounterSvc.cpp.

flag to use the special "efficiency" format

Definition at line 247 of file CounterSvc.cpp.


The documentation for this class was generated from the following file:

Generated at Thu Jan 8 17:50:50 2009 for Gaudi Framework, version v20r4 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004