Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "GaudiKernel/ObjectContainerBase.h"
00010 #include "GaudiKernel/ObjectList.h"
00011 #include "GaudiKernel/ObjectVector.h"
00012 #include "GaudiKernel/KeyedContainer.h"
00013 #include "GaudiKernel/IDataProviderSvc.h"
00014 #include "GaudiKernel/IDataManagerSvc.h"
00015 #include "GaudiKernel/IOpaqueAddress.h"
00016 #include "GaudiKernel/SmartDataPtr.h"
00017 #include "GaudiKernel/AlgFactory.h"
00018 #include "GaudiKernel/Algorithm.h"
00019 #include "GaudiKernel/IRegistry.h"
00020 #include "GaudiKernel/MsgStream.h"
00021 #include "GaudiKernel/SmartIF.h"
00022
00032 class StoreExplorerAlg : public Algorithm {
00034 long m_print;
00036 double m_frequency;
00038 bool m_exploreRelations;
00040 long m_printMissing;
00042 long m_total;
00044 long m_frqPrint;
00046 bool m_load;
00048 bool m_testAccess;
00050 bool m_accessForeign;
00052 IDataProviderSvc* m_dataSvc;
00054 std::string m_dataSvcName;
00056 std::string m_rootName;
00057 public:
00058
00060 StoreExplorerAlg(const std::string& name, ISvcLocator* pSvcLocator)
00061 : Algorithm(name, pSvcLocator), m_dataSvc(0)
00062 {
00063 m_total = m_frqPrint = 0;
00064 declareProperty("Load", m_load = false);
00065 declareProperty("PrintEvt", m_print = 1);
00066 declareProperty("PrintMissing", m_printMissing = 0);
00067 declareProperty("PrintFreq", m_frequency = 0.0);
00068 declareProperty("ExploreRelations", m_exploreRelations = false);
00069 declareProperty("DataSvc", m_dataSvcName="EventDataSvc");
00070 declareProperty("TestAccess", m_testAccess = false);
00071 declareProperty("AccessForeign", m_accessForeign = false);
00072 }
00074 virtual ~StoreExplorerAlg() {
00075 }
00076
00077 template <class T>
00078 std::string access(T* p) {
00079 if ( p ) {
00080 std::stringstream s;
00081 for (typename T::const_iterator i = p->begin(); i != p->end(); ++i ) {
00082 int idx = p->index(*i);
00083 s << idx << ":" << (*i)->clID() << ",";
00084 }
00085 std::string result = s.str();
00086 return result.substr(0, result.length()-2);
00087 }
00088 return "Access FAILED.";
00089 }
00090
00091
00093 void printObj(IRegistry* pReg, std::vector<bool>& flg) {
00094 MsgStream log(msgSvc(), name());
00095 log << MSG::INFO;
00096 for (size_t j = 1; j < flg.size(); j++ ) {
00097 if ( !flg[j-1] && flg[j] ) log << "| ";
00098 else if ( flg[j] ) log << " ";
00099 else log << "| ";
00100 }
00101 log << "+--> " << pReg->name();
00102 if ( pReg->address() ) {
00103 log << " [Address: CLID="
00104 << std::showbase << std::hex << pReg->address()->clID();
00105 log << " Type=" << (void*)pReg->address()->svcType() << "]";
00106 }
00107 else {
00108 log << " [No Address]";
00109 }
00110 DataObject* p = pReg->object();
00111 if ( p ) {
00112 try {
00113 std::string typ = System::typeinfoName(typeid(*p));
00114 if ( m_testAccess ) {
00115 p->clID();
00116 }
00117 log << " " << typ.substr(0,32);
00118 }
00119 catch (...) {
00120 log << "Access test FAILED";
00121 }
00122 }
00123 else {
00124 log << " (Unloaded) ";
00125 }
00126 ObjectContainerBase* base = dynamic_cast<ObjectContainerBase*>(p);
00127 if ( base ) {
00128 try {
00129 int numObj = base->numberOfObjects();
00130 const CLID id = p->clID();
00131 log << " [" << numObj << "]";
00132 if ( m_testAccess ) {
00133 CLID idd = id>>16;
00134 switch(idd) {
00135 case CLID_ObjectList>>16:
00136 access((ObjectList<ContainedObject>*)base);
00137 break;
00138 case CLID_ObjectVector>>16:
00139 access((ObjectVector<ContainedObject>*)base);
00140 break;
00141 case (CLID_ObjectVector+0x00030000)>>16:
00142 access((KeyedContainer<KeyedObject<int>,Containers::Map>*)base);
00143 break;
00144 case (CLID_ObjectVector+0x00040000)>>16:
00145 access((KeyedContainer<KeyedObject<int>,Containers::HashMap>*)base);
00146 break;
00147 case (CLID_ObjectVector+0x00050000)>>16:
00148 access((KeyedContainer<KeyedObject<int>,Containers::Array>*)base);
00149 break;
00150 }
00151 }
00152 }
00153 catch (...) {
00154 log << "Access test FAILED";
00155 }
00156 }
00157 log << endmsg;
00158 }
00159
00160 void explore(IRegistry* pObj, std::vector<bool>& flg) {
00161 printObj(pObj, flg);
00162 if ( 0 != pObj ) {
00163 SmartIF<IDataManagerSvc> mgr(eventSvc());
00164 if ( mgr ) {
00165 typedef std::vector<IRegistry*> Leaves;
00166 Leaves leaves;
00167 StatusCode sc = mgr->objectLeaves(pObj, leaves);
00168 const std::string* par0 = 0;
00169 if ( pObj->address() ) {
00170 par0 = pObj->address()->par();
00171 }
00172 if ( sc.isSuccess() ) {
00173 for ( Leaves::const_iterator i=leaves.begin(); i != leaves.end(); i++ ) {
00174 const std::string& id = (*i)->identifier();
00175 DataObject* p = 0;
00176 if ( !m_accessForeign && (*i)->address() ) {
00177 if ( par0 ) {
00178 const std::string* par1 = (*i)->address()->par();
00179 if ( par1 ) {
00180 if ( par0[0] != par1[0] ) {
00181 continue;
00182 }
00183 }
00184 }
00185 }
00186 if ( m_load ) {
00187 sc = eventSvc()->retrieveObject(id, p);
00188 }
00189 else {
00190 sc = eventSvc()->findObject(id, p);
00191 }
00192 if ( sc.isSuccess() ) {
00193 if ( id != "/Event/Rec/Relations" || m_exploreRelations ) {
00194 flg.push_back(i+1 == leaves.end());
00195 explore(*i, flg);
00196 flg.pop_back();
00197 }
00198 }
00199 else {
00200 flg.push_back(i+1 == leaves.end());
00201 printObj(*i, flg);
00202 flg.pop_back();
00203 }
00204 }
00205 }
00206 }
00207 }
00208 }
00209
00211 virtual StatusCode initialize() {
00212 MsgStream log(msgSvc(), name());
00213 m_rootName = "";
00214 StatusCode sc = service(m_dataSvcName, m_dataSvc, true);
00215 if ( sc.isSuccess() ) {
00216 SmartIF<IDataManagerSvc> mgr(m_dataSvc);
00217 if ( mgr ) {
00218 m_rootName = mgr->rootName();
00219 return sc;
00220 }
00221 log << MSG::ERROR << "Failed to retrieve IDataManagerSvc interface." << endmsg;
00222 return StatusCode::FAILURE;
00223 }
00224 log << MSG::ERROR << "Failed to access service \""
00225 << m_dataSvcName << "\"." << endmsg;
00226 return StatusCode::FAILURE;
00227 }
00228
00230 virtual StatusCode finalize() {
00231 if ( m_dataSvc ) m_dataSvc->release();
00232 m_dataSvc = 0;
00233 return StatusCode::SUCCESS;
00234 }
00235
00237 virtual StatusCode execute() {
00238 MsgStream log(msgSvc(), name());
00239 SmartDataPtr<DataObject> root(m_dataSvc,m_rootName);
00240 if ( ((m_print > m_total++) || (m_frequency*m_total > m_frqPrint)) && root ) {
00241 if ( m_frequency*m_total > m_frqPrint ) {
00242 m_frqPrint++;
00243 }
00244 std::string store_name = "Unknown";
00245 IRegistry* pReg = root->registry();
00246 if ( pReg ) {
00247 SmartIF<IService> isvc(pReg->dataSvc());
00248 if ( isvc ) {
00249 store_name = isvc->name();
00250 }
00251 }
00252 log << MSG::INFO << "========= " << m_rootName << "["
00253 << "0x" << std::hex << (unsigned long) root.ptr() << std::dec
00254 << "@" << store_name << "]:" << endmsg;
00255 std::vector<bool> flg;
00256 flg.push_back(true);
00257 explore(root->registry(), flg);
00258 return StatusCode::SUCCESS;
00259 }
00260 else if ( root ) {
00261 return StatusCode::SUCCESS;
00262 }
00263 log << MSG::ERROR << "Cannot retrieve \"/Event\"!" << endmsg;
00264 return StatusCode::FAILURE;
00265 }
00266 };
00267
00268 DECLARE_ALGORITHM_FACTORY(StoreExplorerAlg)