The Gaudi Framework  v31r0 (aeb156f0)
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 (boost::string_ref sr)
 Convert TES object identifier to ROOT tree name. More...
 
RootRef poolRef (size_t i) const override
 Internal overload to facilitate the access to POOL files. More...
 
int loadRefs (boost::string_ref, boost::string_ref cnt, unsigned long entry, RootObjectRefs &refs) override
 Load references object from file. More...
 
TBranch * getBranch (boost::string_ref, boost::string_ref branch_name) override
 Access data branch by name: Get existing branch in read only mode. More...
 
StatusCode saveRefs () override
 Save references section when closing data file (NOT SUPPORTED) More...
 
StatusCode readRefs () override
 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::stringname () const
 
Sectionssections () const
 
LinkSectionslinkSections () const
 
MergeSectionsmergeSections () const
 
virtual ~Tool ()=default
 Default destructor. 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 ( boost::string_ref  sr)
inline

Convert TES object identifier to ROOT tree name.

Definition at line 26 of file PoolTool.h.

26  {
27  auto t = sr.to_string();
28  std::replace( begin( t ), end( t ), '/', '_' );
29  return t;
30  }
constexpr double sr
T replace(T...args)
AttribStringParser::Iterator begin(const AttribStringParser &parser)
TBranch* Gaudi::PoolTool::getBranch ( boost::string_ref  ,
boost::string_ref  branch_name 
)
inlineoverridevirtual

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

Implements Gaudi::RootDataConnection::Tool.

Definition at line 87 of file PoolTool.h.

87  {
88  auto ti = sections().find( branch_name );
89  TTree* t = ( ti != sections().end() ? ti->second : nullptr );
90  if ( t ) { return (TBranch*)t->GetListOfBranches()->At( 0 ); }
91  string tname = _treeName( branch_name );
92  t = (TTree*)c->file()->Get( tname.c_str() ); // c->getSection(tname);
93  if ( t ) {
94  TBranch* b = (TBranch*)t->GetListOfBranches()->At( 0 );
95  if ( b ) {
96  sections()[branch_name.to_string()] = t;
97  return b;
98  }
99  msgSvc() << MSG::ERROR << "Failed to access POOL branch:" << branch_name << " [" << tname << "]" << endmsg;
100  t->Print();
101  }
102  return nullptr;
103  }
TFile * file() const
Direct access to TFile structure.
string _treeName(boost::string_ref sr)
Convert TES object identifier to ROOT tree name.
Definition: PoolTool.h:26
T end(T...args)
T find(T...args)
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:192
int Gaudi::PoolTool::loadRefs ( boost::string_ref  ,
boost::string_ref  cnt,
unsigned long  entry,
RootObjectRefs refs 
)
inlineoverridevirtual

Load references object from file.

Implements Gaudi::RootDataConnection::Tool.

Definition at line 35 of file PoolTool.h.

36  {
37  auto ti = sections().find( cnt );
38  TTree* t = ( ti != sections().end() ? ti->second : nullptr );
39  if ( !t ) { t = (TTree*)c->file()->Get( _treeName( cnt ).c_str() ); }
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 ) << " Link:" << c->getLink( r.link ) << " CLID:" << hex << r.clid
67  << " Typ:" << hex << int( r.svc ) << " Ent:" << dec << r.entry << endl;
68  }
69  }
70  for ( int i = 0, n = lm.size(); i < n; ++i ) {
71  LinkManager::Link* lnk = lm.link( i );
72  int link_id = c->makeLink( lnk->path() );
73  msg << "Add Link:" << lnk->path() << endl;
74  refs.links.push_back( link_id );
75  }
76  return nb1 + nb2;
77  }
78  }
79  msg << MSG::ERROR << "Failed to access POOL Ref/Link branches:" << cnt << " [" << _treeName( cnt ) << "]"
80  << endmsg;
81  t->Print();
82  }
83  return -1;
84  }
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.
string _treeName(boost::string_ref sr)
Convert TES object identifier to ROOT tree name.
Definition: PoolTool.h:26
int makeLink(boost::string_ref p)
Convert path string to path index.
std::vector< Gaudi::RootRef > m_poolLinks
Image of the POOL ##Links table.
Definition: PoolTool.h:19
T endl(T...args)
MsgStream & dec(MsgStream &log)
Definition: MsgStream.h:267
const std::string & getLink(int which) const
Access link name from saved index.
T end(T...args)
MsgStream & hex(MsgStream &log)
Definition: MsgStream.h:271
const std::string & getCont(int which) const
Access container name from saved index.
T find(T...args)
T size(T...args)
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:192
RootRef Gaudi::PoolTool::poolRef ( size_t  ) const
inlineoverridevirtual

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
StatusCode Gaudi::PoolTool::readRefs ( )
inlineoverridevirtual

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

Implements Gaudi::RootDataConnection::Tool.

Definition at line 109 of file PoolTool.h.

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

Save references section when closing data file (NOT SUPPORTED)

Implements Gaudi::RootDataConnection::Tool.

Definition at line 106 of file PoolTool.h.

106 { return StatusCode::FAILURE; }
constexpr static const auto FAILURE
Definition: StatusCode.h:86

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: