Gaudi Framework, version v25r2

Home   Generated: Wed Jun 4 2014
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
StoreExplorerAlg.cpp
Go to the documentation of this file.
1 // ====================================================================
2 // StoreExplorerAlg.cpp
3 // --------------------------------------------------------------------
4 //
5 // Author : Markus Frank
6 //
7 // ====================================================================
16 #include "GaudiKernel/Algorithm.h"
17 #include "GaudiKernel/IRegistry.h"
18 #include "GaudiKernel/MsgStream.h"
19 #include "GaudiKernel/SmartIF.h"
20 
30 class StoreExplorerAlg : public Algorithm {
32  long m_print;
34  double m_frequency;
40  long m_total;
42  long m_frqPrint;
44  bool m_load;
52  std::string m_dataSvcName;
54  std::string m_rootName;
55 public:
56 
58  StoreExplorerAlg(const std::string& name, ISvcLocator* pSvcLocator)
59  : Algorithm(name, pSvcLocator), m_dataSvc(0)
60  {
61  m_total = m_frqPrint = 0;
62  declareProperty("Load", m_load = false);
63  declareProperty("PrintEvt", m_print = 1);
64  declareProperty("PrintMissing", m_printMissing = 0);
65  declareProperty("PrintFreq", m_frequency = 0.0);
66  declareProperty("ExploreRelations", m_exploreRelations = false);
67  declareProperty("DataSvc", m_dataSvcName="EventDataSvc");
68  declareProperty("TestAccess", m_testAccess = false);
69  declareProperty("AccessForeign", m_accessForeign = false);
70  }
72  virtual ~StoreExplorerAlg() {
73  }
74 
75  template <class T>
76  std::string access(T* p) {
77  if ( p ) {
78  std::stringstream s;
79  for (typename T::const_iterator i = p->begin(); i != p->end(); ++i ) {
80  int idx = p->index(*i);
81  s << idx << ":" << (*i)->clID() << ",";
82  }
83  std::string result = s.str();
84  return result.substr(0, result.length()-2);
85  }
86  return "Access FAILED.";
87  }
88 
89 
91  void printObj(IRegistry* pReg, std::vector<bool>& flg) {
92  MsgStream log(msgSvc(), name());
93  log << MSG::INFO;
94  for (size_t j = 1; j < flg.size(); j++ ) {
95  if ( !flg[j-1] && flg[j] ) log << "| ";
96  else if ( flg[j] ) log << " ";
97  else log << "| ";
98  }
99  log << "+--> " << pReg->name();
100  if ( pReg->address() ) {
101  log << " [Address: CLID="
102  << std::showbase << std::hex << pReg->address()->clID();
103  log << " Type=" << (void*)pReg->address()->svcType() << "]";
104  }
105  else {
106  log << " [No Address]";
107  }
108  DataObject* p = pReg->object();
109  if ( p ) {
110  try {
111  std::string typ = System::typeinfoName(typeid(*p));
112  if ( m_testAccess ) {
113  p->clID();
114  }
115  log << " " << typ.substr(0,32);
116  }
117  catch (...) {
118  log << "Access test FAILED";
119  }
120  }
121  else {
122  log << " (Unloaded) ";
123  }
124  ObjectContainerBase* base = dynamic_cast<ObjectContainerBase*>(p);
125  if ( base ) {
126  try {
127  int numObj = base->numberOfObjects();
128  const CLID id = p->clID();
129  log << " [" << numObj << "]";
130  if ( m_testAccess ) {
131  CLID idd = id>>16;
132  switch(idd) {
133  case CLID_ObjectList>>16: /* ObjectList */
135  break;
136  case CLID_ObjectVector>>16: /* ObjectVector */
138  break;
139  case (CLID_ObjectVector+0x00030000)>>16: /* Keyed Map */
141  break;
142  case (CLID_ObjectVector+0x00040000)>>16: /* Keyed Hashmap */
144  break;
145  case (CLID_ObjectVector+0x00050000)>>16: /* Keyed array */
147  break;
148  }
149  }
150  }
151  catch (...) {
152  log << "Access test FAILED";
153  }
154  }
155  log << endmsg;
156  }
157 
158  void explore(IRegistry* pObj, std::vector<bool>& flg) {
159  printObj(pObj, flg);
160  if ( 0 != pObj ) {
162  if ( mgr ) {
163  typedef std::vector<IRegistry*> Leaves;
164  Leaves leaves;
165  StatusCode sc = mgr->objectLeaves(pObj, leaves);
166  const std::string* par0 = 0;
167  if ( pObj->address() ) {
168  par0 = pObj->address()->par();
169  }
170  if ( sc.isSuccess() ) {
171  for ( Leaves::const_iterator i=leaves.begin(); i != leaves.end(); i++ ) {
172  const std::string& id = (*i)->identifier();
173  DataObject* p = 0;
174  if ( !m_accessForeign && (*i)->address() ) {
175  if ( par0 ) {
176  const std::string* par1 = (*i)->address()->par();
177  if ( par1 ) {
178  if ( par0[0] != par1[0] ) {
179  continue;
180  }
181  }
182  }
183  }
184  if ( m_load ) {
185  sc = eventSvc()->retrieveObject(id, p);
186  }
187  else {
188  sc = eventSvc()->findObject(id, p);
189  }
190  if ( sc.isSuccess() ) {
191  if ( id != "/Event/Rec/Relations" || m_exploreRelations ) {
192  flg.push_back(i+1 == leaves.end());
193  explore(*i, flg);
194  flg.pop_back();
195  }
196  }
197  else {
198  flg.push_back(i+1 == leaves.end());
199  printObj(*i, flg);
200  flg.pop_back();
201  }
202  }
203  }
204  }
205  }
206  }
207 
209  virtual StatusCode initialize() {
210  MsgStream log(msgSvc(), name());
211  m_rootName = "";
213  if ( sc.isSuccess() ) {
215  if ( mgr ) {
216  m_rootName = mgr->rootName();
217  return sc;
218  }
219  log << MSG::ERROR << "Failed to retrieve IDataManagerSvc interface." << endmsg;
220  return StatusCode::FAILURE;
221  }
222  log << MSG::ERROR << "Failed to access service \""
223  << m_dataSvcName << "\"." << endmsg;
224  return StatusCode::FAILURE;
225  }
226 
228  virtual StatusCode finalize() {
229  if ( m_dataSvc ) m_dataSvc->release();
230  m_dataSvc = 0;
231  return StatusCode::SUCCESS;
232  }
233 
235  virtual StatusCode execute() {
236  MsgStream log(msgSvc(), name());
238  if ( ((m_print > m_total++) || (m_frequency*m_total > m_frqPrint)) && root ) {
239  if ( m_frequency*m_total > m_frqPrint ) {
240  m_frqPrint++;
241  }
242  std::string store_name = "Unknown";
243  IRegistry* pReg = root->registry();
244  if ( pReg ) {
245  SmartIF<IService> isvc(pReg->dataSvc());
246  if ( isvc ) {
247  store_name = isvc->name();
248  }
249  }
250  log << MSG::INFO << "========= " << m_rootName << "["
251  << "0x" << std::hex << (unsigned long) root.ptr() << std::dec
252  << "@" << store_name << "]:" << endmsg;
253  std::vector<bool> flg;
254  flg.push_back(true);
255  explore(root->registry(), flg);
256  return StatusCode::SUCCESS;
257  }
258  else if ( root ) {
259  return StatusCode::SUCCESS;
260  }
261  log << MSG::ERROR << "Cannot retrieve \"/Event\"!" << endmsg;
262  return StatusCode::FAILURE;
263  }
264 };
265 

Generated at Wed Jun 4 2014 14:48:56 for Gaudi Framework, version v25r2 by Doxygen version 1.8.2 written by Dimitri van Heesch, © 1997-2004