All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Gaudi::PoolTool Class Reference

#include <src/PoolTool.h>

Inheritance diagram for Gaudi::PoolTool:
Collaboration diagram for Gaudi::PoolTool:

Public Member Functions

 PoolTool (RootDataConnection *con)
 Standard constructor. More...
 
string _treeName (string t)
 Convert TES object identifier to ROOT tree name. More...
 
virtual RootRef poolRef (size_t i) const
 Internal overload to facilitate the access to POOL files. More...
 
virtual int loadRefs (CSTR, CSTR cnt, unsigned long entry, RootObjectRefs &refs)
 Load references object from file. More...
 
virtual TBranch * getBranch (CSTR, CSTR branch_name)
 Access data branch by name: Get existing branch in read only mode. More...
 
virtual StatusCode saveRefs ()
 Save references section when closing data file (NOT SUPPORTED) More...
 
StatusCode readRefs ()
 Internal helper to read reference tables ##Params and ##Links. More...
 
- Public Member Functions inherited from Gaudi::RootDataConnection::Tool
TTree * refs () const
 
StringVecdbs () const
 
StringVecconts () const
 
StringVeclinks () const
 
ParamMapparams () const
 
MsgStreammsgSvc () const
 
const std::string & name () const
 
Sectionssections () const
 
LinkSectionslinkSections () const
 
MergeSectionsmergeSections () const
 
virtual ~Tool ()
 Default destructor. More...
 
virtual void release ()
 Use releasePtr() helper to delete object. More...
 
virtual TBranch * getBranch (const std::string &section, const std::string &n)=0
 Access data branch by name: Get existing branch in read only mode. More...
 
virtual int loadRefs (const std::string &section, const std::string &cnt, unsigned long entry, RootObjectRefs &refs)=0
 Load references object. More...
 

Private Attributes

std::vector< Gaudi::RootRefm_poolLinks
 Image of the POOL ##Links table. More...
 

Additional Inherited Members

- Protected Types inherited from Gaudi::RootDataConnection::Tool
typedef
RootDataConnection::StringVec 
StringVec
 
typedef
RootDataConnection::ParamMap 
ParamMap
 
typedef
RootDataConnection::Sections 
Sections
 
typedef
RootDataConnection::MergeSections 
MergeSections
 
typedef
RootDataConnection::LinkSections 
LinkSections
 
typedef
RootDataConnection::ContainerSection 
ContainerSection
 
typedef
RootDataConnection::ContainerSections 
ContainerSections
 
- Protected Attributes inherited from Gaudi::RootDataConnection::Tool
RootDataConnectionc
 Pointer to containing data connection object. More...
 

Detailed Description

Definition at line 17 of file PoolTool.h.

Constructor & Destructor Documentation

Gaudi::PoolTool::PoolTool ( RootDataConnection con)
inline

Standard constructor.

Definition at line 23 of file PoolTool.h.

23 { c = con; }
RootDataConnection * c
Pointer to containing data connection object.

Member Function Documentation

string Gaudi::PoolTool::_treeName ( string  t)
inline

Convert TES object identifier to ROOT tree name.

Definition at line 26 of file PoolTool.h.

26  {
27  for(string::iterator j = t.begin(); j != t.end(); ++j )
28  if ( *j == '/' ) *j = '_';
29  return t;
30  }
virtual TBranch* Gaudi::PoolTool::getBranch ( CSTR  ,
CSTR  branch_name 
)
inlinevirtual

Access data branch by name: Get existing branch in read only mode.

Definition at line 90 of file PoolTool.h.

90  {
91  TTree* t = sections()[branch_name];
92  if ( t ) {
93  return (TBranch*)t->GetListOfBranches()->At(0);
94  }
95  string tname = _treeName(branch_name);
96  t = (TTree*)c->file()->Get(tname.c_str()); // c->getSection(tname);
97  if ( t ) {
98  TBranch* b = (TBranch*)t->GetListOfBranches()->At(0);
99  if ( b ) {
100  sections()[branch_name] = t;
101  return b;
102  }
103  msgSvc() << MSG::ERROR << "Failed to access POOL branch:"
104  << branch_name << " [" << tname << "]" << endmsg;
105  t->Print();
106  }
107  return 0;
108  }
TFile * file() const
Direct access to TFile structure.
string _treeName(string t)
Convert TES object identifier to ROOT tree name.
Definition: PoolTool.h:26
RootDataConnection * c
Pointer to containing data connection object.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:243
virtual int Gaudi::PoolTool::loadRefs ( CSTR  ,
CSTR  cnt,
unsigned long  entry,
RootObjectRefs refs 
)
inlinevirtual

Load references object from file.

Definition at line 35 of file PoolTool.h.

35  {
36  TTree* t = sections()[cnt];
37  if ( !t ) {
38  t = (TTree*)c->file()->Get(_treeName(cnt).c_str());
39  }
40  if ( t ) {
41  TBranch* b1 = t->GetBranch("Links");
42  TBranch* b2 = t->GetBranch("Refs");
43  MsgStream& msg = msgSvc();
44  if ( b1 && b2 ) {
45  LinkManager lm, *plm = &lm;
46  PoolDbLinkManager mgr, *pmgr = &mgr;
47  b1->SetAutoDelete(kFALSE);
48  b2->SetAutoDelete(kFALSE);
49  b1->SetAddress(&plm);
50  b2->SetAddress(&pmgr);
51  int nb1 = b1->GetEvent(entry);
52  int nb2 = b2->GetEvent(entry);
53  if ( nb1>1 && nb2>1 ) {
54  size_t ref_size = mgr.references().size();
55  refs.refs.resize(ref_size);
56  msg << MSG::VERBOSE;
57  for(size_t j = 0; j < ref_size; ++j) {
58  const pair<int, int>& oid = mgr.references()[j]->m_oid;
59  string loc = mgr.links()[j].substr(1);
60  RootRef& r = refs.refs[j];
61  if ( oid.first>=0 ) {
62  r = m_poolLinks[oid.first];
63  r.entry = oid.second;
64  r.link = c->makeLink(loc);
65  msg << "Add leaf:" << oid.first << "->" << loc << " from " << c->getDb(r.dbase)
66  << "#" << c->getCont(r.container)
67  << " Link:" << c->getLink(r.link)
68  << " CLID:" << hex << r.clid
69  << " Typ:" << hex << int(r.svc)
70  << " Ent:" << dec << r.entry << endl;
71  }
72  }
73  for(int i = 0, n=lm.size(); i < n; ++i) {
74  LinkManager::Link* lnk = lm.link(i);
75  int link_id = c->makeLink(lnk->path());
76  msg << "Add Link:" << lnk->path() << endl;
77  refs.links.push_back(link_id);
78  }
79  return nb1 + nb2;
80  }
81  }
82  msg << MSG::ERROR << "Failed to access POOL Ref/Link branches:" << cnt
83  << " [" << _treeName(cnt) << "]" << endmsg;
84  t->Print();
85  }
86  return -1;
87  }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
TFile * file() const
Direct access to TFile structure.
const std::string & getDb(int which) const
Access database/file name from saved index.
std::vector< Gaudi::RootRef > m_poolLinks
Image of the POOL ##Links table.
Definition: PoolTool.h:19
const std::string & getLink(int which) const
Access link name from saved index.
const std::string & getCont(int which) const
Access container name from saved index.
int makeLink(const std::string &p)
Convert path string to path index.
string _treeName(string t)
Convert TES object identifier to ROOT tree name.
Definition: PoolTool.h:26
RootDataConnection * c
Pointer to containing data connection object.
list i
Definition: ana.py:128
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:243
virtual RootRef Gaudi::PoolTool::poolRef ( size_t  ) const
inlinevirtual

Internal overload to facilitate the access to POOL files.

Reimplemented from Gaudi::RootDataConnection::Tool.

Definition at line 32 of file PoolTool.h.

32 { return m_poolLinks[i]; }
std::vector< Gaudi::RootRef > m_poolLinks
Image of the POOL ##Links table.
Definition: PoolTool.h:19
list i
Definition: ana.py:128
StatusCode Gaudi::PoolTool::readRefs ( )
inlinevirtual

Internal helper to read reference tables ##Params and ##Links.

Implements Gaudi::RootDataConnection::Tool.

Definition at line 114 of file PoolTool.h.

114  {
115  int i;
116  char text[2048];
117  msgSvc() << MSG::VERBOSE;
118 
119  // First read ##Params
120  TTree* t = (TTree*)c->file()->Get("##Params");
121  if ( 0 == t ) {
122  return StatusCode::FAILURE;
123  }
124  TBranch* b = t->GetBranch("db_string");
125  if ( 0 == b ) {
126  return StatusCode::FAILURE;
127  }
128  for(i=0,b->SetAddress(text); i < b->GetEntries(); ++i) {
129  b->GetEvent(i);
130  char* id1 = strstr(text,"[NAME=");
131  char* id2 = strstr(text,"[VALUE=");
132  if ( id1 && id2 ) {
133  id1 += 6;
134  id2 += 7;
135  char* id11 = strstr(id1, "]");
136  char* id22 = strstr(id2, "]");
137  if ( id11 && id22 ) {
138  *id11 = 0;
139  *id22 = 0;
140  params().push_back(make_pair(id1,id2));
141  msgSvc() << "Param:" << id1 << "=" << id2 << "." << endmsg;
142  }
143  }
144  }
145 
146  // Read ##Links
147  t = (TTree*)c->file()->Get("##Links");
148  if ( 0 == t ) {
149  return StatusCode::FAILURE;
150  }
151  b = t->GetBranch("db_string");
152  if ( 0 == b ) {
153  return StatusCode::FAILURE;
154  }
155  m_poolLinks.resize((size_t)b->GetEntries()+2); // Take into account the ##Links and ##Shapes entry of POOL!
156  for(i=0,b->SetAddress(text); i < b->GetEntries(); ++i) {
157  b->GetEvent(i);
158  std::string db, container;
159  int clid = 1, technology = 0, ipar[2] = {-1,-1};
160  for(char* p1 = (char*)text; p1; p1 = ::strchr(++p1,'[')) {
161  char* p2 = ::strchr(p1, '=');
162  char* p3 = ::strchr(p1, ']');
163  if ( p2 && p3 ) {
164  if ( ::strncmp("[DB=", p1, 4) == 0 ) {
165  *p3 = 0;
166  db = p1+4;
167  }
168  else if ( ::strncmp("[CNT=", p1, 5) == 0 ) {
169  *p3 = 0;
170  container = p1+5;
171  }
172  else if ( ::strncmp("[OID=", p1, 5) == 0 ) {
173  *p3 = 0;
174  ::sscanf(p1+5,"%08X,%08X",(unsigned int*)&ipar[0],(unsigned int*)&ipar[1]);
175  }
176  else if ( ::strncmp("[CLID=", p1, 6) == 0 ) {
177  *p3 = 0;
178  ::sscanf(p1+6,"%08X",(unsigned int*)&clid);
179  }
180  else if ( ::strncmp("[TECH=", p1, 6) == 0 ) {
181  *p3 = 0;
182  ::sscanf(p1+6,"%08X",(unsigned int*)&technology);
183  }
184  else {
185  *p3 = *p2 = 0;
186  }
187  *p3 = ']';
188  *p2 = '=';
189  }
190  }
191  c->makeRef("",clid,technology,db,container,-1,m_poolLinks[i+2]);
192  RootRef& r = m_poolLinks[i];
193  msgSvc() << "Add link[" << i << "]:" << db << container << " [" << r.dbase << "," << r.container << "] "
194  << " tech:" << hex << setw(8) << r.svc << " CLID:" << setw(8) << r.clid << dec << endmsg;
195  }
196  return StatusCode::SUCCESS;
197  }
TFile * file() const
Direct access to TFile structure.
std::vector< Gaudi::RootRef > m_poolLinks
Image of the POOL ##Links table.
Definition: PoolTool.h:19
void makeRef(IRegistry *pA, RootRef &ref)
Create reference object from registry entry.
RootDataConnection * c
Pointer to containing data connection object.
list i
Definition: ana.py:128
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:243
virtual StatusCode Gaudi::PoolTool::saveRefs ( )
inlinevirtual

Save references section when closing data file (NOT SUPPORTED)

Implements Gaudi::RootDataConnection::Tool.

Definition at line 111 of file PoolTool.h.

Member Data Documentation

std::vector<Gaudi::RootRef> Gaudi::PoolTool::m_poolLinks
private

Image of the POOL ##Links table.

Definition at line 19 of file PoolTool.h.


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