| The Gaudi Framework v29r1 (5cd95fa2)

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

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