| The Gaudi Framework v32r1 (f65d50dc)

StoreExplorerAlg.cpp
Go to the documentation of this file.
1 // ====================================================================
2 // StoreExplorerAlg.cpp
3 // --------------------------------------------------------------------
4 //
5 // Author : Markus Frank
6 //
7 // ====================================================================
8 #include "GaudiKernel/Algorithm.h"
9 #include "GaudiKernel/IDataManagerSvc.h"
10 #include "GaudiKernel/IDataProviderSvc.h"
11 #include "GaudiKernel/IOpaqueAddress.h"
12 #include "GaudiKernel/IRegistry.h"
13 #include "GaudiKernel/KeyedContainer.h"
14 #include "GaudiKernel/MsgStream.h"
15 #include "GaudiKernel/ObjectContainerBase.h"
16 #include "GaudiKernel/ObjectList.h"
17 #include "GaudiKernel/ObjectVector.h"
18 #include "GaudiKernel/SmartDataPtr.h"
19 #include "GaudiKernel/SmartIF.h"
20
21 #include <numeric>
22
32 class StoreExplorerAlg : public Algorithm {
33
34 Gaudi::Property<bool> m_load{this, "Load", false, "load non existing items"};
35 Gaudi::Property<long> m_print{this, "PrintEvt", 1, "limit printout to first N events"};
36 Gaudi::Property<long> m_printMissing{this, "PrintMissing", 0, "indicate if missing entities should be printed"};
37 Gaudi::Property<double> m_frequency{this, "PrintFreq", 0.0, "printout frequency"};
38 Gaudi::Property<bool> m_exploreRelations{this, "ExploreRelations", false, "if relations should be followed"};
39 Gaudi::Property<std::string> m_dataSvcName{this, "DataSvc", "EventDataSvc", "name of the data provider service"};
40 Gaudi::Property<bool> m_testAccess{this, "TestAccess", false,
41 "test access to objects (DataObject and ContainedObject)"};
42 Gaudi::Property<bool> m_accessForeign{this, "AccessForeign", false, "indicate if foreign files should be opened"};
43
45 long m_total = 0;
47 long m_frqPrint = 0;
49 SmartIF<IDataProviderSvc> m_dataSvc;
51 std::string m_rootName;
52
53 public:
55 using Algorithm::Algorithm;
56
57 template <class T>
58 std::string access( T* p ) {
59 if ( !p ) return "Access FAILED.";
60 std::string result = std::accumulate(
61 std::begin( *p ), std::end( *p ), std::string{}, [&]( std::string s, typename T::const_reference i ) {
62 return s + std::to_string( p->index( i ) ) + ":" + std::to_string( i->clID() ) + ",";
63 } );
64 return result.substr( 0, result.length() - 2 );
65 }
66
68 void printObj( IRegistry* pReg, std::vector<bool>& flg ) {
69 auto& log = info();
70 for ( size_t j = 1; j < flg.size(); j++ ) {
71 if ( !flg[j - 1] && flg[j] )
72 log << "| ";
73 else if ( flg[j] )
74 log << " ";
75 else
76 log << "| ";
77 }
78 log << "+--> " << pReg->name();
79 if ( pReg->address() ) {
80 log << " [Address: CLID=" << std::showbase << std::hex << pReg->address()->clID()
81 << " Type=" << (void*)pReg->address()->svcType() << "]";
82 } else {
83 log << " [No Address]";
84 }
85 DataObject* p = pReg->object();
86 if ( p ) {
87 try {
88 std::string typ = System::typeinfoName( typeid( *p ) );
89 if ( m_testAccess ) p->clID();
90 log << " " << typ.substr( 0, 32 );
91 } catch ( ... ) { log << "Access test FAILED"; }
92 } else {
93 log << " (Unloaded) ";
94 }
95 ObjectContainerBase* base = dynamic_cast<ObjectContainerBase*>( p );
96 if ( base ) {
97 try {
98 int numObj = base->numberOfObjects();
99 const CLID id = p->clID();
100 log << " [" << numObj << "]";
101 if ( m_testAccess ) {
102 CLID idd = id >> 16;
103 switch ( idd ) {
104 case CLID_ObjectList >> 16: /* ObjectList */
105 access( (ObjectList<ContainedObject>*)base );
106 break;
107 case CLID_ObjectVector >> 16: /* ObjectVector */
108 access( (ObjectVector<ContainedObject>*)base );
109 break;
110 case ( CLID_ObjectVector + 0x00030000 ) >> 16: /* Keyed Map */
111 access( (KeyedContainer<KeyedObject<int>, Containers::Map>*)base );
112 break;
113 case ( CLID_ObjectVector + 0x00040000 ) >> 16: /* Keyed Hashmap */
114 access( (KeyedContainer<KeyedObject<int>, Containers::HashMap>*)base );
115 break;
116 case ( CLID_ObjectVector + 0x00050000 ) >> 16: /* Keyed array */
117 access( (KeyedContainer<KeyedObject<int>, Containers::Array>*)base );
118 break;
119 }
120 }
121 } catch ( ... ) { log << "Access test FAILED"; }
122 }
123 log << endmsg;
124 }
125
126 void explore( IRegistry* pObj, std::vector<bool>& flg ) {
127 printObj( pObj, flg );
128 if ( pObj ) {
129 auto mgr = eventSvc().as<IDataManagerSvc>();
130 if ( mgr ) {
131 std::vector<IRegistry*> leaves;
132 StatusCode sc = mgr->objectLeaves( pObj, leaves );
133 const std::string* par0 = nullptr;
134 if ( pObj->address() ) par0 = pObj->address()->par();
135 if ( sc.isSuccess() ) {
136 for ( auto i = leaves.begin(); i != leaves.end(); i++ ) {
137 const std::string& id = ( *i )->identifier();
138 DataObject* p = nullptr;
139 if ( !m_accessForeign && ( *i )->address() ) {
140 if ( par0 ) {
141 const std::string* par1 = ( *i )->address()->par();
142 if ( par1 && par0[0] != par1[0] ) continue;
143 }
144 }
145 if ( m_load ) {
146 sc = eventSvc()->retrieveObject( id, p );
147 } else {
148 sc = eventSvc()->findObject( id, p );
149 }
150 if ( sc.isSuccess() ) {
151 if ( id != "/Event/Rec/Relations" || m_exploreRelations ) {
152 flg.push_back( i + 1 == leaves.end() );
153 explore( *i, flg );
154 flg.pop_back();
155 }
156 } else {
157 flg.push_back( i + 1 == leaves.end() );
158 printObj( *i, flg );
159 flg.pop_back();
160 }
161 }
162 }
163 }
164 }
165 }
166
168 StatusCode initialize() override {
169 m_rootName.clear();
170 m_dataSvc = service( m_dataSvcName, true );
171 if ( !m_dataSvc ) {
172 error() << "Failed to access service \"" << m_dataSvcName << "\"." << endmsg;
173 return StatusCode::FAILURE;
174 }
175 auto mgr = m_dataSvc.as<IDataManagerSvc>();
176 if ( !mgr ) {
177 error() << "Failed to retrieve IDataManagerSvc interface." << endmsg;
178 return StatusCode::FAILURE;
179 }
180 m_rootName = mgr->rootName();
181 return StatusCode::SUCCESS;
182 }
183
185 StatusCode finalize() override {
186 m_dataSvc.reset();
187 return StatusCode::SUCCESS;
188 }
189
191 StatusCode execute() override {
192 SmartDataPtr<DataObject> root( m_dataSvc.get(), m_rootName );
193 if ( ( ( m_print > m_total++ ) || ( m_frequency * m_total > m_frqPrint ) ) && root ) {
194 if ( m_frequency * m_total > m_frqPrint ) m_frqPrint++;
195 std::string store_name = "Unknown";
196 IRegistry* pReg = root->registry();
197 if ( pReg ) {
198 auto isvc = SmartIF<IService>{pReg->dataSvc()};
199 if ( isvc ) store_name = isvc->name();
200 }
201 info() << "========= " << m_rootName << "[" << std::showbase << std::hex << (unsigned long)root.ptr() << std::dec
202 << "@" << store_name << "]:" << endmsg;
203 std::vector<bool> flg( 1, true );
204 explore( root->registry(), flg );
205 return StatusCode::SUCCESS;
206 } else if ( root ) {
207 return StatusCode::SUCCESS;
208 }
209 error() << "Cannot retrieve \"/Event\"!" << endmsg;
210 return StatusCode::FAILURE;
211 }
212 };
213
214 DECLARE_COMPONENT( StoreExplorerAlg )
IOpaqueAddress::par
virtual const std::string * par() const =0
Retrieve String parameters.
StoreExplorerAlg::initialize
StatusCode initialize() override
Initialize.
Definition: StoreExplorerAlg.cpp:168
Algorithm.h
SmartIF< IDataProviderSvc >
StoreExplorerAlg::m_exploreRelations
Gaudi::Property< bool > m_exploreRelations
Definition: StoreExplorerAlg.cpp:38
Gaudi::Property
Implementation of property with value of concrete type.
Definition: Property.h:352
MsgStream.h
KeyedObject
Definition of the templated KeyedObject class.
Definition: KeyedObject.h:29
StoreExplorerAlg::m_dataSvc
SmartIF< IDataProviderSvc > m_dataSvc
Reference to data provider service.
Definition: StoreExplorerAlg.cpp:49
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:298
IDataManagerSvc
Definition: IDataManagerSvc.h:45
ObjectVector.h
ObjectContainerBase::numberOfObjects
virtual size_type numberOfObjects() const =0
Number of objects in the container.
StoreExplorerAlg::m_accessForeign
Gaudi::Property< bool > m_accessForeign
Definition: StoreExplorerAlg.cpp:42
Gaudi::Algorithm::Algorithm
Algorithm(const std::string &name, ISvcLocator *svcloc, const std::string &version=PACKAGE_VERSION)
Constructor.
Definition: Algorithm.cpp:48
std::to_string
T to_string(T... args)
ObjectVector
ObjectVector is one of the basic Gaudi container classes capable of being registered in Data Stores.
Definition: ContainedObject.h:12
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
SmartIF::as
SmartIF< IFace > as() const
return a new SmartIF instance to another interface
Definition: SmartIF.h:107
KeyedContainer
template class KeyedContainer, KeyedContainer.h
Definition: KeyedContainer.h:64
ObjectContainerBase.h
IRegistry::name
virtual const name_type & name() const =0
Name of the directory (or key)
StoreExplorerAlg::execute
StatusCode execute() override
Execute procedure.
Definition: StoreExplorerAlg.cpp:191
std::showbase
T showbase(T... args)
std::end
T end(T... args)
CommonMessagingBase::info
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
Definition: CommonMessaging.h:104
StoreExplorerAlg::m_dataSvcName
Gaudi::Property< std::string > m_dataSvcName
Definition: StoreExplorerAlg.cpp:39
IOpaqueAddress::svcType
virtual long svcType() const =0
Retrieve service type.
StoreExplorerAlg::m_total
long m_total
Internal counter to trigger printouts.
Definition: StoreExplorerAlg.cpp:45
SmartIF::get
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:76
IDataProviderSvc::findObject
virtual StatusCode findObject(IRegistry *pDirectory, std::string_view path, DataObject *&pObject)=0
Find object identified by its directory entry.
StoreExplorerAlg::m_frequency
Gaudi::Property< double > m_frequency
Definition: StoreExplorerAlg.cpp:37
ObjectList
ObjectList is one of the basic Gaudi container classes capable of being registered in Data Stores.
Definition: ContainedObject.h:14
std::string
STL class.
StoreExplorerAlg::m_testAccess
Gaudi::Property< bool > m_testAccess
Definition: StoreExplorerAlg.cpp:40
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:46
Gaudi::Algorithm::eventSvc
SmartIF< IDataProviderSvc > & eventSvc() const
The standard event data service.
Definition: Algorithm.cpp:678
std::vector::push_back
T push_back(T... args)
CommonMessagingBase::error
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
Definition: CommonMessaging.h:98
IDataManagerSvc.h
IDataProviderSvc.h
SmartDataPtr.h
IOpaqueAddress::clID
virtual const CLID & clID() const =0
Retrieve class information from link.
Gaudi::Algorithm::service
StatusCode service(const std::string &name, T *&psvc, bool createIf=true) const
Access a service by name, creating it if it doesn't already exist.
Definition: Algorithm.h:215
StatusCode
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
StoreExplorerAlg::m_rootName
std::string m_rootName
Name of the root leaf (obtained at initialize)
Definition: StoreExplorerAlg.cpp:51
SmartIF.h
std::vector::pop_back
T pop_back(T... args)
IRegistry.h
IRegistry
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
CLID
unsigned int CLID
Class ID definition.
Definition: ClassID.h:8
std::string::clear
T clear(T... args)
StoreExplorerAlg::printObj
void printObj(IRegistry *pReg, std::vector< bool > &flg)
Print datastore leaf.
Definition: StoreExplorerAlg.cpp:68
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:267
StoreExplorerAlg::m_print
Gaudi::Property< long > m_print
Definition: StoreExplorerAlg.cpp:35
IRegistry::address
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
IRegistry::object
virtual DataObject * object() const =0
Retrieve object behind the link.
IOpaqueAddress.h
StoreExplorerAlg::explore
void explore(IRegistry *pObj, std::vector< bool > &flg)
Definition: StoreExplorerAlg.cpp:126
Algorithm
Alias for backward compatibility.
Definition: Algorithm.h:56
std::string::length
T length(T... args)
ObjectList.h
std::vector< bool >
IDataProviderSvc::retrieveObject
virtual StatusCode retrieveObject(IRegistry *pDirectory, std::string_view path, DataObject *&pObject)=0
Retrieve object identified by its directory entry.
DataObject::clID
virtual const CLID & clID() const
Retrieve reference to class definition structure.
Definition: DataObject.cpp:56
std::begin
T begin(T... args)
StoreExplorerAlg::finalize
StatusCode finalize() override
Finalize.
Definition: StoreExplorerAlg.cpp:185
Containers::KeyedObjectManager
KeyedObjectManager Class to manage keyed objects.
Definition: KeyedObjectManager.h:45
gaudirun.s
string s
Definition: gaudirun.py:316
SmartDataPtr
A small class used to access easily (and efficiently) data items residing in data stores.
Definition: SmartDataPtr.h:47
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:86
StoreExplorerAlg::m_printMissing
Gaudi::Property< long > m_printMissing
Definition: StoreExplorerAlg.cpp:36
std::hex
T hex(T... args)
IRegistry::dataSvc
virtual IDataProviderSvc * dataSvc() const =0
Retrieve pointer to Transient Store.
std::string::substr
T substr(T... args)
gaudiComponentHelp.root
root
Definition: gaudiComponentHelp.py:27
StoreExplorerAlg
Small algorith, which traverses the data store and prints generic information about all leaves,...
Definition: StoreExplorerAlg.cpp:32
SmartIF::reset
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:86
ObjectContainerBase
ObjectContainerBase is the base class for Gaudi container classes.
Definition: ObjectContainerBase.h:19
std::accumulate
T accumulate(T... args)
StoreExplorerAlg::m_frqPrint
long m_frqPrint
Internal counter to adjust printout frequency.
Definition: StoreExplorerAlg.cpp:47
DataObject
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
KeyedContainer.h
StoreExplorerAlg::m_load
Gaudi::Property< bool > m_load
Definition: StoreExplorerAlg.cpp:34
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StoreExplorerAlg::access
std::string access(T *p)
Definition: StoreExplorerAlg.cpp:58
Gaudi.Configuration.log
log
Definition: Configuration.py:13