The Gaudi Framework  v30r3 (a5ef0a68)
Gaudi::RootDataConnection Class Reference

Concrete implementation of the IDataConnection interface to access ROOT files. More...

#include <GaudiRootCnv/RootDataConnection.h>

Inheritance diagram for Gaudi::RootDataConnection:
Collaboration diagram for Gaudi::RootDataConnection:

Classes

class  ContainerSection
 Internal helper class, which described a TBranch section in a ROOT file. More...
 
class  Tool
 Helper class to facilitate an abstraction layer for reading POOL style files with this package. More...
 

Public Types

enum  Status : StatusCode::code_t { Status::ROOT_READ_ERROR = 0x2, Status::ROOT_OPEN_ERROR = 0x4 }
 
typedef std::vector< std::stringStringVec
 Type definition for string maps. More...
 
typedef std::vector< std::pair< std::string, std::string > > ParamMap
 Type definition for the parameter map. More...
 
typedef std::map< std::string, TTree *, std::less<> > Sections
 Definition of tree sections. More...
 
typedef std::vector< ContainerSectionContainerSections
 Definition of container sections to handle merged files. More...
 
typedef std::map< std::string, ContainerSections, std::less<> > MergeSections
 Definition of database section to handle merged files. More...
 
typedef std::vector< RootRefLinkSections
 Link sections definition. More...
 
typedef std::set< const IInterface * > Clients
 Client set. More...
 
- Public Types inherited from Gaudi::IDataConnection
enum  IoType { READ = 1 << 1, UPDATE = 1 << 2, CREATE = 1 << 3, RECREATE = ( 1 << 4 ) + ( 1 << 3 ) }
 I/O Connection types. More...
 
enum  IoStatus { BAD_DATA_CONNECTION = 4 }
 Status Code on bad file connection. More...
 

Public Member Functions

MsgStreammsgSvc () const
 Allow access to printer service. More...
 
ToolmakeTool ()
 Create file access tool to encapsulate POOL compatibiliy. More...
 
 RootDataConnection (const IInterface *own, boost::string_ref nam, std::shared_ptr< RootConnectionSetup > setup)
 Standard constructor. More...
 
TFile * file () const
 Direct access to TFile structure. More...
 
bool isConnected () const override
 Check if connected to data source. More...
 
bool isWritable () const
 Is the file writable? More...
 
Tooltool () const
 Access tool. More...
 
const MergeSectionsmergeSections () const
 Access merged data section inventory. More...
 
const StringVecmergeFIDs () const
 Access merged FIDs. More...
 
void addClient (const IInterface *client)
 Add new client to this data source. More...
 
size_t removeClient (const IInterface *client)
 Remove client from this data source. More...
 
bool lookupClient (const IInterface *client) const
 Lookup client for this data source. More...
 
void badWriteError (boost::string_ref msg) const
 Error handler when bad write statements occur. More...
 
std::pair< const RootRef *, const ContainerSection * > getMergeSection (boost::string_ref container, int entry) const
 Access link section for single container and entry. More...
 
void enableStatistics (boost::string_ref section)
 Enable TTreePerStats. More...
 
void saveStatistics (boost::string_ref statisticsFile)
 Save TTree access statistics if required. More...
 
int loadObj (boost::string_ref section, boost::string_ref cnt, unsigned long entry, DataObject *&pObj)
 Load object. More...
 
int loadRefs (boost::string_ref section, boost::string_ref cnt, unsigned long entry, RootObjectRefs &refs)
 Load references object. More...
 
std::pair< int, unsigned long > saveObj (boost::string_ref section, boost::string_ref cnt, TClass *cl, DataObject *pObj, int buff_siz, int split_lvl, bool fill_missing=false)
 Save object of a given class to section and container. More...
 
std::pair< int, unsigned long > save (boost::string_ref section, boost::string_ref cnt, TClass *cl, void *pObj, int buff_siz, int split_lvl, bool fill_missing=false)
 Save object of a given class to section and container. More...
 
StatusCode connectRead () override
 Open data stream in read mode. More...
 
StatusCode connectWrite (IoType typ) override
 Open data stream in write mode. More...
 
StatusCode disconnect () override
 Release data stream and release implementation dependent resources. More...
 
StatusCode read (void *const, size_t) override
 Read root byte buffer from input stream. More...
 
StatusCode write (const void *, int) override
 Write root byte buffer to output stream. More...
 
long long int seek (long long int, int) override
 Seek on the file described by ioDesc. Arguments as in ::seek() More...
 
TTree * getSection (boost::string_ref sect, bool create=false)
 Access TTree section from section name. The section is created if required. More...
 
TBranch * getBranch (boost::string_ref section, boost::string_ref branch_name)
 Access data branch by name: Get existing branch in read only mode. More...
 
TBranch * getBranch (boost::string_ref section, boost::string_ref branch_name, TClass *cl, void *ptr, int buff_siz, int split_lvl)
 Access data branch by name: Get existing branch in write mode. More...
 
void makeRef (const IRegistry &pA, RootRef &ref)
 Create reference object from registry entry. More...
 
void makeRef (boost::string_ref name, long clid, int tech, boost::string_ref db, boost::string_ref cnt, int entry, RootRef &ref)
 Create reference object from values. More...
 
int makeLink (boost::string_ref p)
 Convert path string to path index. More...
 
const std::stringgetDb (int which) const
 Access database/file name from saved index. More...
 
const std::stringgetCont (int which) const
 Access container name from saved index. More...
 
const std::stringgetLink (int which) const
 Access link name from saved index. More...
 
- Public Member Functions inherited from Gaudi::IDataConnection
 IDataConnection (const IInterface *own, std::string nam)
 Standard constructor. More...
 
virtual ~IDataConnection ()=default
 Standard destructor. More...
 
const std::stringname () const
 Connection name. More...
 
void setFID (std::string fid)
 Set file ID. More...
 
const std::stringfid () const
 Access file id. More...
 
const std::stringpfn () const
 Access physical file name. More...
 
void setPFN (std::string fn)
 Set physical file name. More...
 
int ageFile ()
 Increase age of I/O source. More...
 
void resetAge ()
 Reset age. More...
 
int age () const
 Access age counter. More...
 
const IInterfaceowner () const
 Owner instance. More...
 

Public Attributes

std::unique_ptr< Toolm_tool
 

Protected Member Functions

const std::stringempty () const
 Empty string reference. More...
 
StatusCode saveRefs ()
 Internal helper to save/update reference tables. More...
 

Protected Attributes

std::shared_ptr< RootConnectionSetupm_setup
 Reference to the setup structure. More...
 
std::unique_ptr< TTreePerfStats > m_statistics
 I/O read statistics from TTree. More...
 
std::unique_ptr< TFile > m_file
 Reference to ROOT file. More...
 
TTree * m_refs = nullptr
 Pointer to the reference tree. More...
 
Sections m_sections
 Tree sections in TFile. More...
 
StringVec m_dbs
 Map containing external database file names (fids) More...
 
StringVec m_conts
 Map containing external container names. More...
 
StringVec m_links
 Map containing internal links names. More...
 
StringVec m_mergeFIDs
 Map containing merge FIDs. More...
 
ParamMap m_params
 Parameter map for file parameters. More...
 
MergeSections m_mergeSects
 Database section map for merged files. More...
 
LinkSections m_linkSects
 Database link sections. More...
 
Clients m_clients
 Client list. More...
 
std::string m_empty
 Buffer for empty string reference. More...
 
- Protected Attributes inherited from Gaudi::IDataConnection
std::string m_name
 Connection name/identifier. More...
 
std::string m_fid
 File ID of the connection. More...
 
std::string m_pfn
 Physical file name of the connection. More...
 
int m_age = 0
 Age counter. More...
 
const IInterfacem_owner = nullptr
 Owner pointer. More...
 

Friends

class Tool
 

Detailed Description

Concrete implementation of the IDataConnection interface to access ROOT files.

Author
M.Frank
Version
1.0
Date
20/12/2009

Definition at line 95 of file RootDataConnection.h.

Member Typedef Documentation

typedef std::set<const IInterface*> Gaudi::RootDataConnection::Clients

Client set.

Definition at line 145 of file RootDataConnection.h.

typedef std::vector<ContainerSection> Gaudi::RootDataConnection::ContainerSections

Definition of container sections to handle merged files.

Definition at line 139 of file RootDataConnection.h.

typedef std::vector<RootRef> Gaudi::RootDataConnection::LinkSections

Link sections definition.

Definition at line 143 of file RootDataConnection.h.

typedef std::map<std::string, ContainerSections, std::less<> > Gaudi::RootDataConnection::MergeSections

Definition of database section to handle merged files.

Definition at line 141 of file RootDataConnection.h.

typedef std::vector<std::pair<std::string, std::string> > Gaudi::RootDataConnection::ParamMap

Type definition for the parameter map.

Definition at line 135 of file RootDataConnection.h.

typedef std::map<std::string, TTree*, std::less<> > Gaudi::RootDataConnection::Sections

Definition of tree sections.

Definition at line 137 of file RootDataConnection.h.

typedef std::vector<std::string> Gaudi::RootDataConnection::StringVec

Type definition for string maps.

Definition at line 133 of file RootDataConnection.h.

Member Enumeration Documentation

enum Gaudi::RootDataConnection::Status : StatusCode::code_t
strong
Enumerator
ROOT_READ_ERROR 
ROOT_OPEN_ERROR 

Definition at line 98 of file RootDataConnection.h.

98 : StatusCode::code_t { ROOT_READ_ERROR = 0x2, ROOT_OPEN_ERROR = 0x4 };
unsigned long code_t
type of StatusCode value
Definition: StatusCode.h:54

Constructor & Destructor Documentation

RootDataConnection::RootDataConnection ( const IInterface own,
boost::string_ref  nam,
std::shared_ptr< RootConnectionSetup setup 
)

Standard constructor.

Definition at line 161 of file RootDataConnection.cpp.

163  : IDataConnection( owner, fname.to_string() ), m_setup( std::move( setup ) )
164 { // 01234567890123456789012345678901234567890
165  // Check if FID: A82A3BD8-7ECB-DC11-8DC0-000423D950B0
166  if ( fname.size() == 36 && fname[8] == '-' && fname[13] == '-' && fname[18] == '-' && fname[23] == '-' ) {
167  m_name = "FID:";
168  m_name.append( fname.data(), fname.size() );
169  }
170  m_age = 0;
171  m_file.reset();
172  addClient( owner );
173 }
void addClient(const IInterface *client)
Add new client to this data source.
int m_age
Age counter.
std::string m_name
Connection name/identifier.
IDataConnection(const IInterface *own, std::string nam)
Standard constructor.
T append(T...args)
T reset(T...args)
T move(T...args)
const IInterface * owner() const
Owner instance.
std::shared_ptr< RootConnectionSetup > m_setup
Reference to the setup structure.
std::unique_ptr< TFile > m_file
Reference to ROOT file.

Member Function Documentation

void RootDataConnection::addClient ( const IInterface client)

Add new client to this data source.

Definition at line 176 of file RootDataConnection.cpp.

176 { m_clients.insert( client ); }
Clients m_clients
Client list.
T insert(T...args)
void RootDataConnection::badWriteError ( boost::string_ref  msg) const

Error handler when bad write statements occur.

Definition at line 194 of file RootDataConnection.cpp.

195 {
196  msgSvc() << MSG::ERROR << "File:" << fid() << "Failed action:" << msg << endmsg;
197 }
const std::string & fid() const
Access file id.
MsgStream & msgSvc() const
Allow access to printer service.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
StatusCode RootDataConnection::connectRead ( )
overridevirtual

Open data stream in read mode.

Connect the file in READ mode.

Implements Gaudi::IDataConnection.

Definition at line 239 of file RootDataConnection.cpp.

240 {
241  m_file.reset( TFile::Open( m_pfn.c_str() ) );
242  if ( !m_file || m_file->IsZombie() ) {
243  m_file.reset();
244  return StatusCode::FAILURE;
245  }
247  msgSvc() << MSG::DEBUG << "Opened file " << m_pfn << " in mode READ. [" << m_fid << "]" << endmsg << MSG::DEBUG;
248  if ( msgSvc().isActive() ) m_file->ls();
249  msgSvc() << MSG::VERBOSE;
250  if ( msgSvc().isActive() ) m_file->Print();
251  if ( makeTool() ) {
252  sc = m_tool->readRefs();
253  sc.ignore();
254 #if ROOT_VERSION_CODE >= ROOT_VERSION( 5, 33, 0 )
255  if ( sc == Status::ROOT_READ_ERROR ) {
256  IIncidentSvc* inc = m_setup->incidentSvc();
257  if ( inc ) {
258  inc->fireIncident( Incident( pfn(), IncidentType::CorruptedInputFile ) );
259  }
260  }
261 #endif
262  }
263  if ( !sc.isSuccess() ) return sc;
264  bool need_fid = m_fid == m_pfn;
265  string fid = m_fid;
266  m_mergeFIDs.clear();
267  for ( auto& elem : m_params ) {
268  if ( elem.first == "FID" ) {
269  m_mergeFIDs.push_back( elem.second );
270  if ( elem.second != m_fid ) {
271  msgSvc() << MSG::DEBUG << "Check FID param:" << elem.second << endmsg;
272  // if ( m_fid == m_pfn ) {
273  m_fid = elem.second;
274  //}
275  }
276  }
277  }
278  if ( !need_fid && fid != m_fid ) {
279  msgSvc() << MSG::ERROR << "FID mismatch:" << fid << "(Catalog) != " << m_fid << "(file)" << endmsg
280  << "for PFN:" << m_pfn << endmsg;
281  return StatusCode::FAILURE;
282  }
283  msgSvc() << MSG::DEBUG << "Using FID " << m_fid << " from params table...." << endmsg << "for PFN:" << m_pfn
284  << endmsg;
285  return sc;
286 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
const std::string & fid() const
Access file id.
std::unique_ptr< Tool > m_tool
std::string m_fid
File ID of the connection.
bool isSuccess() const
Definition: StatusCode.h:287
const std::string & pfn() const
Access physical file name.
ParamMap m_params
Parameter map for file parameters.
StringVec m_mergeFIDs
Map containing merge FIDs.
std::string m_pfn
Physical file name of the connection.
T push_back(T...args)
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
T reset(T...args)
T clear(T...args)
Tool * makeTool()
Create file access tool to encapsulate POOL compatibiliy.
std::shared_ptr< RootConnectionSetup > m_setup
Reference to the setup structure.
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:165
T c_str(T...args)
Base class for all Incidents (computing events).
Definition: Incident.h:17
MsgStream & msgSvc() const
Allow access to printer service.
std::unique_ptr< TFile > m_file
Reference to ROOT file.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:23
StatusCode RootDataConnection::connectWrite ( IoType  typ)
overridevirtual

Open data stream in write mode.

Implements Gaudi::IDataConnection.

Definition at line 289 of file RootDataConnection.cpp.

290 {
291  int compress = RootConnectionSetup::compression();
292  msgSvc() << MSG::DEBUG;
293  switch ( typ ) {
294  case CREATE:
295  resetAge();
296  m_file.reset( TFile::Open( m_pfn.c_str(), "CREATE", "Root event data", compress ) );
297  m_refs = new TTree( "Refs", "Root reference data" );
298  msgSvc() << "Opened file " << m_pfn << " in mode CREATE. [" << m_fid << "]" << endmsg;
299  m_params.emplace_back( "PFN", m_pfn );
300  if ( m_fid != m_pfn ) {
301  m_params.emplace_back( "FID", m_fid );
302  }
303  makeTool();
304  break;
305  case RECREATE:
306  resetAge();
307  m_file.reset( TFile::Open( m_pfn.c_str(), "RECREATE", "Root event data", compress ) );
308  msgSvc() << "Opened file " << m_pfn << " in mode RECREATE. [" << m_fid << "]" << endmsg;
309  m_refs = new TTree( "Refs", "Root reference data" );
310  m_params.emplace_back( "PFN", m_pfn );
311  if ( m_fid != m_pfn ) {
312  m_params.emplace_back( "FID", m_fid );
313  }
314  makeTool();
315  break;
316  case UPDATE:
317  resetAge();
318  m_file.reset( TFile::Open( m_pfn.c_str(), "UPDATE", "Root event data", compress ) );
319  msgSvc() << "Opened file " << m_pfn << " in mode UPDATE. [" << m_fid << "]" << endmsg;
320  if ( m_file && !m_file->IsZombie() ) {
321  if ( makeTool() ) {
322  StatusCode sc = m_tool->readRefs();
323  sc.ignore();
324  if ( sc == Status::ROOT_READ_ERROR ) {
325 #if ROOT_VERSION_CODE >= ROOT_VERSION( 5, 33, 0 )
326  IIncidentSvc* inc = m_setup->incidentSvc();
327  if ( inc ) {
328  inc->fireIncident( Incident( pfn(), IncidentType::CorruptedInputFile ) );
329  }
330 #endif
331  }
332  return sc;
333  }
334  TDirectory::TContext ctxt( m_file.get() );
335  m_refs = new TTree( "Refs", "Root reference data" );
336  makeTool();
337  return StatusCode::SUCCESS;
338  }
339  break;
340  default:
341  m_refs = nullptr;
342  m_file.reset();
343  return StatusCode::FAILURE;
344  }
346 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
std::unique_ptr< Tool > m_tool
std::string m_fid
File ID of the connection.
static int compression()
Access to global compression level.
const std::string & pfn() const
Access physical file name.
ParamMap m_params
Parameter map for file parameters.
std::string m_pfn
Physical file name of the connection.
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
T reset(T...args)
Tool * makeTool()
Create file access tool to encapsulate POOL compatibiliy.
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
T get(T...args)
std::shared_ptr< RootConnectionSetup > m_setup
Reference to the setup structure.
void resetAge()
Reset age.
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:165
T c_str(T...args)
Base class for all Incidents (computing events).
Definition: Incident.h:17
MsgStream & msgSvc() const
Allow access to printer service.
std::unique_ptr< TFile > m_file
Reference to ROOT file.
TTree * m_refs
Pointer to the reference tree.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:23
T emplace_back(T...args)
StatusCode RootDataConnection::disconnect ( )
overridevirtual

Release data stream and release implementation dependent resources.

Implements Gaudi::IDataConnection.

Definition at line 349 of file RootDataConnection.cpp.

350 {
351  if ( m_file ) {
352  if ( !m_file->IsZombie() ) {
353  if ( m_file->IsWritable() ) {
354  msgSvc() << MSG::DEBUG;
355  TDirectory::TContext ctxt( m_file.get() );
356  if ( m_refs ) {
357  if ( !m_tool->saveRefs().isSuccess() ) badWriteError( "Saving References" );
358  if ( m_refs->Write() < 0 ) badWriteError( "Write Reference branch" );
359  }
360  for ( auto& i : m_sections ) {
361  if ( i.second ) {
362  if ( i.second->Write() < 0 ) badWriteError( "Write section:" + i.first );
363  msgSvc() << "Disconnect section " << i.first << " " << i.second->GetName() << endmsg;
364  }
365  }
366  m_sections.clear();
367  }
368  msgSvc() << MSG::DEBUG;
369  if ( msgSvc().isActive() ) m_file->ls();
370  msgSvc() << MSG::VERBOSE;
371  if ( msgSvc().isActive() ) m_file->Print();
372  m_file->Close();
373  }
374  msgSvc() << MSG::DEBUG << "Disconnected file " << m_pfn << " " << m_file->GetName() << endmsg;
375  m_file.reset();
376  m_tool.reset();
377  }
378  return StatusCode::SUCCESS;
379 }
std::unique_ptr< Tool > m_tool
std::string m_pfn
Physical file name of the connection.
void clear(STATE_TYPE _i=std::ios_base::failbit)
Definition: MsgStream.h:187
void badWriteError(boost::string_ref msg) const
Error handler when bad write statements occur.
Sections m_sections
Tree sections in TFile.
T reset(T...args)
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
T get(T...args)
MsgStream & msgSvc() const
Allow access to printer service.
std::unique_ptr< TFile > m_file
Reference to ROOT file.
TTree * m_refs
Pointer to the reference tree.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
CSTR RootDataConnection::empty ( ) const
protected

Empty string reference.

Definition at line 485 of file RootDataConnection.cpp.

485 { return s_empty; }
void RootDataConnection::enableStatistics ( boost::string_ref  section)

Enable TTreePerStats.

Definition at line 210 of file RootDataConnection.cpp.

211 {
212  if ( m_statistics ) {
213  TTree* t = getSection( section, false );
214  if ( t ) {
215  m_statistics.reset( new TTreePerfStats( ( section.to_string() + "_ioperf" ).c_str(), t ) );
216  return;
217  }
218  msgSvc() << MSG::WARNING << "Failed to enable perfstats for tree:" << section << endmsg;
219  return;
220  }
221  msgSvc() << MSG::INFO << "Perfstats are ALREADY ENABLED." << endmsg;
222 }
std::unique_ptr< TTreePerfStats > m_statistics
I/O read statistics from TTree.
TTree * getSection(boost::string_ref sect, bool create=false)
Access TTree section from section name. The section is created if required.
T reset(T...args)
MsgStream & msgSvc() const
Allow access to printer service.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
TFile* Gaudi::RootDataConnection::file ( ) const
inline

Direct access to TFile structure.

Definition at line 248 of file RootDataConnection.h.

248 { return m_file.get(); }
T get(T...args)
std::unique_ptr< TFile > m_file
Reference to ROOT file.
TBranch* Gaudi::RootDataConnection::getBranch ( boost::string_ref  section,
boost::string_ref  branch_name 
)
inline

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

Definition at line 308 of file RootDataConnection.h.

309  {
310  return m_tool->getBranch( section, branch_name );
311  }
std::unique_ptr< Tool > m_tool
TBranch * RootDataConnection::getBranch ( boost::string_ref  section,
boost::string_ref  branch_name,
TClass *  cl,
void *  ptr,
int  buff_siz,
int  split_lvl 
)

Access data branch by name: Get existing branch in write mode.

Definition at line 449 of file RootDataConnection.cpp.

451 {
452  string n = branch_name.to_string();
453  std::replace_if( begin( n ), end( n ), []( const char c ) { return !isalnum( c ); }, '_' );
454  n += ".";
455  TTree* t = getSection( section, true );
456  TBranch* b = t->GetBranch( n.c_str() );
457  if ( !b && cl && m_file->IsWritable() ) {
458  b = t->Branch( n.c_str(), cl->GetName(), (void*)( ptr ? &ptr : nullptr ), buff_siz, split_lvl );
459  }
460  if ( !b ) b = t->GetBranch( branch_name.to_string().c_str() );
461  if ( b ) b->SetAutoDelete( kFALSE );
462  return b;
463 }
T isalnum(T...args)
T replace_if(T...args)
TTree * getSection(boost::string_ref sect, bool create=false)
Access TTree section from section name. The section is created if required.
AttribStringParser::Iterator begin(const AttribStringParser &parser)
std::unique_ptr< TFile > m_file
Reference to ROOT file.
const std::string& Gaudi::RootDataConnection::getCont ( int  which) const
inline

Access container name from saved index.

Definition at line 329 of file RootDataConnection.h.

330  {
331  return ( which >= 0 ) && ( size_t( which ) < m_conts.size() ) ? *( m_conts.begin() + which ) : empty();
332  }
StringVec m_conts
Map containing external container names.
const std::string & empty() const
Empty string reference.
T size(T...args)
T begin(T...args)
def which(executable)
Definition: BaseTest.py:571
CSTR RootDataConnection::getDb ( int  which) const

Access database/file name from saved index.

Definition at line 475 of file RootDataConnection.cpp.

476 {
477  if ( ( which >= 0 ) && ( size_t( which ) < m_dbs.size() ) ) {
478  if ( *( m_dbs.begin() + which ) == s_local ) return m_fid;
479  return *( m_dbs.begin() + which );
480  }
481  return s_empty;
482 }
std::string m_fid
File ID of the connection.
T size(T...args)
T begin(T...args)
def which(executable)
Definition: BaseTest.py:571
StringVec m_dbs
Map containing external database file names (fids)
const std::string& Gaudi::RootDataConnection::getLink ( int  which) const
inline

Access link name from saved index.

Definition at line 335 of file RootDataConnection.h.

336  {
337  return ( which >= 0 ) && ( size_t( which ) < m_links.size() ) ? *( m_links.begin() + which ) : empty();
338  }
StringVec m_links
Map containing internal links names.
const std::string & empty() const
Empty string reference.
T size(T...args)
T begin(T...args)
def which(executable)
Definition: BaseTest.py:571
pair< const RootRef *, const RootDataConnection::ContainerSection * > RootDataConnection::getMergeSection ( boost::string_ref  container,
int  entry 
) const

Access link section for single container and entry.

Definition at line 604 of file RootDataConnection.cpp.

605 {
606  // size_t idx = cont.find('/',1);
607  // string container = cont[0]=='/' ? cont.substr(1,idx==string::npos?idx:idx-1) : cont;
608  auto i = m_mergeSects.find( container );
609  if ( i != m_mergeSects.end() ) {
610  size_t cnt = 0;
611  const ContainerSections& s = ( *i ).second;
612  for ( auto j = s.cbegin(); j != s.cend(); ++j, ++cnt ) {
613  const ContainerSection& c = *j;
614  if ( entry >= c.start && entry < ( c.start + c.length ) ) {
615  if ( m_linkSects.size() > cnt ) {
616  if ( msgSvc().isActive() ) {
617  msgSvc() << MSG::VERBOSE << "MergeSection for:" << container << " [" << entry << "]" << endmsg
618  << "FID:" << m_fid << " -> PFN:" << m_pfn << endmsg;
619  }
620  return {&( m_linkSects[cnt] ), &c};
621  }
622  }
623  }
624  }
625  msgSvc() << MSG::DEBUG << "Return INVALID MergeSection for:" << container << " [" << entry << "]" << endmsg
626  << "FID:" << m_fid << " -> PFN:" << m_pfn << endmsg;
627  return {nullptr, nullptr};
628 }
MergeSections m_mergeSects
Database section map for merged files.
std::vector< ContainerSection > ContainerSections
Definition of container sections to handle merged files.
std::string m_fid
File ID of the connection.
bool isActive() const
Accessor: is MsgStream active.
Definition: MsgStream.h:116
T end(T...args)
std::string m_pfn
Physical file name of the connection.
T find(T...args)
T size(T...args)
LinkSections m_linkSects
Database link sections.
MsgStream & msgSvc() const
Allow access to printer service.
string s
Definition: gaudirun.py:253
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
TTree * RootDataConnection::getSection ( boost::string_ref  sect,
bool  create = false 
)

Access TTree section from section name. The section is created if required.

Definition at line 382 of file RootDataConnection.cpp.

383 {
384  auto it = m_sections.find( section );
385  TTree* t = ( it != m_sections.end() ? it->second : nullptr );
386  if ( !t ) {
387  t = (TTree*)m_file->Get( section.to_string().c_str() );
388  if ( !t && create ) {
389  TDirectory::TContext ctxt( m_file.get() );
390  t = new TTree( section.to_string().c_str(), "Root data for Gaudi" );
391  }
392  if ( t ) {
393  int cacheSize = m_setup->cacheSize;
394  if ( create ) {
395  // t->SetAutoFlush(100);
396  }
397  if ( section == m_setup->loadSection && cacheSize > -2 ) {
398  MsgStream& msg = msgSvc();
399  int learnEntries = m_setup->learnEntries;
400  t->SetCacheSize( cacheSize );
401  t->SetCacheLearnEntries( learnEntries );
402  msg << MSG::DEBUG;
403  if ( create ) {
404  msg << "Tree:" << section << "Setting up tree cache:" << cacheSize << endmsg;
405  } else {
406  const StringVec& vB = m_setup->vetoBranches;
407  const StringVec& cB = m_setup->cacheBranches;
408  msg << "Tree:" << section << " Setting up tree cache:" << cacheSize << " Add all branches." << endmsg;
409  msg << "Tree:" << section << " Learn for " << learnEntries << " entries." << endmsg;
410 
411  if ( cB.empty() && vB.empty() ) {
412  msg << "Adding (default) all branches to tree cache." << endmsg;
413  t->AddBranchToCache( "*", kTRUE );
414  }
415  if ( cB.size() == 1 && cB[0] == "*" ) {
416  msg << "Adding all branches to tree cache according to option \"CacheBranches\"." << endmsg;
417  t->AddBranchToCache( "*", kTRUE );
418  } else {
419  for ( TIter it( t->GetListOfBranches() ); it.Next(); ) {
420  const char* n = ( (TNamed*)( *it ) )->GetName();
421  bool add = false, veto = false;
422  for ( const auto& i : cB ) {
423  if ( !match_wild( n, ( i ).c_str() ) ) continue;
424  add = true;
425  break;
426  }
427  for ( auto i = vB.cbegin(); !add && i != vB.cend(); ++i ) {
428  if ( !match_wild( n, ( *i ).c_str() ) ) continue;
429  veto = true;
430  break;
431  }
432  if ( add && !veto ) {
433  msg << "Add " << n << " to branch cache." << endmsg;
434  t->AddBranchToCache( n, kTRUE );
435  } else {
436  msg << "Do not cache branch " << n << endmsg;
437  }
438  }
439  }
440  }
441  }
442  m_sections[section.to_string()] = t;
443  }
444  }
445  return t;
446 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
T end(T...args)
std::vector< std::string > StringVec
Type definition for string maps.
Sections m_sections
Tree sections in TFile.
T get(T...args)
T find(T...args)
std::shared_ptr< RootConnectionSetup > m_setup
Reference to the setup structure.
MsgStream & msgSvc() const
Allow access to printer service.
std::unique_ptr< TFile > m_file
Reference to ROOT file.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
bool Gaudi::RootDataConnection::isConnected ( ) const
inlineoverridevirtual

Check if connected to data source.

Implements Gaudi::IDataConnection.

Definition at line 250 of file RootDataConnection.h.

250 { return bool( m_file ); }
std::unique_ptr< TFile > m_file
Reference to ROOT file.
bool Gaudi::RootDataConnection::isWritable ( ) const
inline

Is the file writable?

Definition at line 252 of file RootDataConnection.h.

252 { return m_file && m_file->IsWritable(); }
std::unique_ptr< TFile > m_file
Reference to ROOT file.
int RootDataConnection::loadObj ( boost::string_ref  section,
boost::string_ref  cnt,
unsigned long  entry,
DataObject *&  pObj 
)

Load object.

Definition at line 529 of file RootDataConnection.cpp.

531 {
532  TBranch* b = getBranch( section, cnt );
533  if ( b ) {
534  TClass* cl = gROOT->GetClass( b->GetClassName(), kTRUE );
535  if ( cl ) {
536  int nb = -1;
537  pObj = (DataObject*)cl->New();
538  {
539  DataObjectPush push( pObj );
540  b->SetAddress( &pObj );
541  if ( section == m_setup->loadSection ) {
542  TTree* t = b->GetTree();
543  if ( Long64_t( entry ) != t->GetReadEntry() ) {
544  t->LoadTree( Long64_t( entry ) );
545  }
546  }
547  nb = b->GetEntry( entry );
548  msgSvc() << MSG::VERBOSE;
549  if ( msgSvc().isActive() ) {
550  msgSvc() << "Load [" << entry << "] --> " << section << ":" << cnt << " " << nb << " bytes." << endmsg;
551  }
552  if ( nb < 0 ) { // This is definitely an error...ROOT says if reads fail, -1 is issued.
553 #if ROOT_VERSION_CODE >= ROOT_VERSION( 5, 33, 0 )
554  IIncidentSvc* inc = m_setup->incidentSvc();
555  if ( inc ) {
556  inc->fireIncident( Incident( pfn(), IncidentType::CorruptedInputFile ) );
557  }
558 #endif
559  } else if ( nb == 0 && pObj->clID() == CLID_DataObject ) {
560  TFile* f = b->GetFile();
561  int vsn = f->GetVersion();
562  if ( vsn < 52400 ) {
563  // For Gaudi v21r5 (ROOT 5.24.00b) DataObject::m_version was not written!
564  // Still this call be well be successful.
565  nb = 1;
566  } else if ( vsn > 1000000 && ( vsn % 1000000 ) < 52400 ) {
567  // dto. Some POOL files have for unknown reasons a version
568  // not according to ROOT standards. Hack this explicitly.
569  nb = 1;
570  }
571  }
572  if ( nb < 0 ) {
573  delete pObj;
574  pObj = nullptr;
575  }
576  }
577  return nb;
578  }
579  }
580  return -1;
581 }
const std::string & pfn() const
Access physical file name.
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
virtual const CLID & clID() const
Retrieve reference to class definition structure.
Definition: DataObject.cpp:62
TBranch * getBranch(boost::string_ref section, boost::string_ref branch_name)
Access data branch by name: Get existing branch in read only mode.
std::shared_ptr< RootConnectionSetup > m_setup
Reference to the setup structure.
Base class for all Incidents (computing events).
Definition: Incident.h:17
MsgStream & msgSvc() const
Allow access to printer service.
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:23
int RootDataConnection::loadRefs ( boost::string_ref  section,
boost::string_ref  cnt,
unsigned long  entry,
RootObjectRefs refs 
)

Load references object.

Definition at line 584 of file RootDataConnection.cpp.

586 {
587  int nbytes = m_tool->loadRefs( section, cnt, entry, refs );
588 #if ROOT_VERSION_CODE >= ROOT_VERSION( 5, 33, 0 )
589  if ( nbytes < 0 ) {
590  // This is definitely an error:
591  // -- Either branch not preesent at all or
592  // -- ROOT I/O error, which issues -1
593  IIncidentSvc* inc = m_setup->incidentSvc();
594  if ( inc ) {
595  inc->fireIncident( Incident( pfn(), IncidentType::CorruptedInputFile ) );
596  }
597  }
598 #endif
599  return nbytes;
600 }
std::unique_ptr< Tool > m_tool
const std::string & pfn() const
Access physical file name.
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
std::shared_ptr< RootConnectionSetup > m_setup
Reference to the setup structure.
Base class for all Incidents (computing events).
Definition: Incident.h:17
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:23
bool RootDataConnection::lookupClient ( const IInterface client) const

Lookup client for this data source.

Definition at line 187 of file RootDataConnection.cpp.

188 {
189  auto i = m_clients.find( client );
190  return i != m_clients.end();
191 }
Clients m_clients
Client list.
T end(T...args)
T find(T...args)
int RootDataConnection::makeLink ( boost::string_ref  p)

Convert path string to path index.

Definition at line 466 of file RootDataConnection.cpp.

467 {
468  auto ip = std::find( std::begin( m_links ), std::end( m_links ), p );
469  if ( ip != std::end( m_links ) ) return std::distance( std::begin( m_links ), ip );
470  m_links.push_back( p.to_string() );
471  return m_links.size() - 1;
472 }
T distance(T...args)
T end(T...args)
StringVec m_links
Map containing internal links names.
T push_back(T...args)
T find(T...args)
T size(T...args)
T begin(T...args)
void RootDataConnection::makeRef ( const IRegistry pA,
RootRef ref 
)

Create reference object from registry entry.

Definition at line 631 of file RootDataConnection.cpp.

632 {
633  IOpaqueAddress* pA = pR.address();
634  makeRef( pR.name(), pA->clID(), pA->svcType(), pA->par()[0], pA->par()[1], -1, ref );
635 }
virtual const CLID & clID() const =0
Retrieve class information from link.
virtual const std::string * par() const =0
Retrieve String parameters.
virtual long svcType() const =0
Retrieve service type.
void makeRef(const IRegistry &pA, RootRef &ref)
Create reference object from registry entry.
Opaque address interface definition.
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
void RootDataConnection::makeRef ( boost::string_ref  name,
long  clid,
int  tech,
boost::string_ref  db,
boost::string_ref  cnt,
int  entry,
RootRef ref 
)

Create reference object from values.

Definition at line 638 of file RootDataConnection.cpp.

640 {
641  auto db = ( dbase == m_fid ? boost::string_ref{s_local} : dbase );
642  ref.entry = entry;
643 
644  int cdb = -1;
645  if ( !db.empty() ) {
646  auto idb = std::find_if( m_dbs.begin(), m_dbs.end(), [&]( const std::string& i ) { return i == db; } );
647  cdb = std::distance( m_dbs.begin(), idb );
648  if ( idb == m_dbs.end() ) m_dbs.push_back( db.to_string() );
649  }
650 
651  int ccnt = -1;
652  if ( !cnt.empty() ) {
653  auto icnt = std::find_if( m_conts.begin(), m_conts.end(), [&]( const std::string& i ) { return i == cnt; } );
654  ccnt = std::distance( m_conts.begin(), icnt );
655  if ( icnt == m_conts.end() ) m_conts.push_back( cnt.to_string() );
656  }
657 
658  int clnk = -1;
659  if ( !name.empty() ) {
660  auto ilnk = std::find_if( m_links.begin(), m_links.end(), [&]( const std::string& i ) { return i == name; } );
661  clnk = std::distance( m_links.begin(), ilnk );
662  if ( ilnk == m_links.end() ) m_links.push_back( name.to_string() );
663  }
664 
665  ref.dbase = cdb;
666  ref.container = ccnt;
667  ref.link = clnk;
668  ref.clid = clid;
669  ref.svc = tech;
670  if ( ref.svc == POOL_ROOT_StorageType || ref.svc == POOL_ROOTKEY_StorageType ||
671  ref.svc == POOL_ROOTTREE_StorageType ) {
672  ref.svc = ROOT_StorageType;
673  }
674 }
T empty(T...args)
T distance(T...args)
std::string m_fid
File ID of the connection.
T end(T...args)
StringVec m_links
Map containing internal links names.
STL class.
const long POOL_ROOTKEY_StorageType
Definition: ClassID.h:69
int dbase
Data members to define object location in the persistent world.
Definition: RootRefs.h:33
T push_back(T...args)
const std::string & name() const
Connection name.
StringVec m_conts
Map containing external container names.
const long ROOT_StorageType
Definition: ClassID.h:52
const long POOL_ROOT_StorageType
Definition: ClassID.h:68
T find_if(T...args)
const long POOL_ROOTTREE_StorageType
Definition: ClassID.h:70
T begin(T...args)
StringVec m_dbs
Map containing external database file names (fids)
RootDataConnection::Tool * RootDataConnection::makeTool ( )

Create file access tool to encapsulate POOL compatibiliy.

Definition at line 225 of file RootDataConnection.cpp.

226 {
227  if ( !m_refs ) m_refs = (TTree*)m_file->Get( "Refs" );
228  if ( m_refs ) m_tool.reset( new RootTool( this ) );
229 #ifdef __POOL_COMPATIBILITY
230  else if ( m_file->Get( "##Links" ) != nullptr )
231  m_tool.reset( new PoolTool( this ) );
232 #endif
233  else
234  m_tool.reset();
235  return m_tool.get();
236 }
std::unique_ptr< Tool > m_tool
Description:
Definition: RootTool.h:17
std::unique_ptr< TFile > m_file
Reference to ROOT file.
TTree * m_refs
Pointer to the reference tree.
const StringVec& Gaudi::RootDataConnection::mergeFIDs ( ) const
inline

Access merged FIDs.

Definition at line 258 of file RootDataConnection.h.

258 { return m_mergeFIDs; }
StringVec m_mergeFIDs
Map containing merge FIDs.
const MergeSections& Gaudi::RootDataConnection::mergeSections ( ) const
inline

Access merged data section inventory.

Definition at line 256 of file RootDataConnection.h.

256 { return m_mergeSects; }
MergeSections m_mergeSects
Database section map for merged files.
MsgStream& Gaudi::RootDataConnection::msgSvc ( ) const
inline

Allow access to printer service.

Definition at line 148 of file RootDataConnection.h.

148 { return m_setup->msgSvc(); }
std::shared_ptr< RootConnectionSetup > m_setup
Reference to the setup structure.
StatusCode Gaudi::RootDataConnection::read ( void *  const,
size_t   
)
inlineoverridevirtual

Read root byte buffer from input stream.

Implements Gaudi::IDataConnection.

Definition at line 298 of file RootDataConnection.h.

298 { return StatusCode::FAILURE; }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
size_t RootDataConnection::removeClient ( const IInterface client)

Remove client from this data source.

Definition at line 179 of file RootDataConnection.cpp.

180 {
181  auto i = m_clients.find( client );
182  if ( i != m_clients.end() ) m_clients.erase( i );
183  return m_clients.size();
184 }
Clients m_clients
Client list.
T end(T...args)
T erase(T...args)
T find(T...args)
T size(T...args)
pair< int, unsigned long > RootDataConnection::save ( boost::string_ref  section,
boost::string_ref  cnt,
TClass *  cl,
void *  pObj,
int  buff_siz,
int  split_lvl,
bool  fill_missing = false 
)

Save object of a given class to section and container.

Definition at line 496 of file RootDataConnection.cpp.

498 {
499  split_lvl = 0;
500  TBranch* b = getBranch( section, cnt, cl, pObj ? &pObj : nullptr, buff_siz, split_lvl );
501  if ( b ) {
502  Long64_t evt = b->GetEntries();
503  // msgSvc() << MSG::DEBUG << cnt.c_str() << " Obj:" << (void*)pObj
504  // << " Split:" << split_lvl << " Buffer size:" << buff_siz << endl;
505  if ( fill_missing ) {
506  Long64_t num, nevt = b->GetTree()->GetEntries();
507  if ( nevt > evt ) {
508  b->SetAddress( nullptr );
509  num = nevt - evt;
510  while ( num > 0 ) {
511  b->Fill();
512  --num;
513  }
514  msgSvc() << MSG::DEBUG << "Added " << long( nevt - evt ) << " / Tree: " << nevt
515  << " / Branch: " << b->GetEntries() + 1 << " NULL entries to:" << cnt << endmsg;
516  evt = b->GetEntries();
517  }
518  }
519  b->SetAddress( &pObj );
520  return {b->Fill(), evt};
521  }
522  if ( pObj ) {
523  msgSvc() << MSG::ERROR << "Failed to access branch " << m_name << "/" << cnt << endmsg;
524  }
525  return {-1, ~0};
526 }
std::string m_name
Connection name/identifier.
TBranch * getBranch(boost::string_ref section, boost::string_ref branch_name)
Access data branch by name: Get existing branch in read only mode.
MsgStream & msgSvc() const
Allow access to printer service.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
evt
Definition: IOTest.py:96
pair< int, unsigned long > RootDataConnection::saveObj ( boost::string_ref  section,
boost::string_ref  cnt,
TClass *  cl,
DataObject pObj,
int  buff_siz,
int  split_lvl,
bool  fill_missing = false 
)

Save object of a given class to section and container.

Definition at line 488 of file RootDataConnection.cpp.

490 {
491  DataObjectPush push( pObj );
492  return save( section, cnt, cl, pObj, buff_siz, split_lvl, fill );
493 }
GAUDI_API void fill(AIDA::IHistogram1D *histo, const double value, const double weight=1.0)
simple function to fill AIDA::IHistogram1D objects
Definition: Fill.cpp:35
std::pair< int, unsigned long > save(boost::string_ref section, boost::string_ref cnt, TClass *cl, void *pObj, int buff_siz, int split_lvl, bool fill_missing=false)
Save object of a given class to section and container.
StatusCode Gaudi::RootDataConnection::saveRefs ( )
protected

Internal helper to save/update reference tables.

void RootDataConnection::saveStatistics ( boost::string_ref  statisticsFile)

Save TTree access statistics if required.

Definition at line 200 of file RootDataConnection.cpp.

201 {
202  if ( m_statistics ) {
203  m_statistics->Print();
204  if ( !statisticsFile.empty() ) m_statistics->SaveAs( statisticsFile.to_string().c_str() );
206  }
207 }
std::unique_ptr< TTreePerfStats > m_statistics
I/O read statistics from TTree.
T reset(T...args)
long long int Gaudi::RootDataConnection::seek ( long long int  ,
int   
)
inlineoverridevirtual

Seek on the file described by ioDesc. Arguments as in ::seek()

Implements Gaudi::IDataConnection.

Definition at line 302 of file RootDataConnection.h.

302 { return -1; }
Tool* Gaudi::RootDataConnection::tool ( ) const
inline

Access tool.

Definition at line 254 of file RootDataConnection.h.

254 { return m_tool.get(); }
std::unique_ptr< Tool > m_tool
StatusCode Gaudi::RootDataConnection::write ( const void *  ,
int   
)
inlineoverridevirtual

Write root byte buffer to output stream.

Implements Gaudi::IDataConnection.

Definition at line 300 of file RootDataConnection.h.

300 { return StatusCode::FAILURE; }
constexpr static const auto FAILURE
Definition: StatusCode.h:88

Friends And Related Function Documentation

friend class Tool
friend

Definition at line 238 of file RootDataConnection.h.

Member Data Documentation

Clients Gaudi::RootDataConnection::m_clients
protected

Client list.

Definition at line 176 of file RootDataConnection.h.

StringVec Gaudi::RootDataConnection::m_conts
protected

Map containing external container names.

Definition at line 164 of file RootDataConnection.h.

StringVec Gaudi::RootDataConnection::m_dbs
protected

Map containing external database file names (fids)

Definition at line 162 of file RootDataConnection.h.

std::string Gaudi::RootDataConnection::m_empty
protected

Buffer for empty string reference.

Definition at line 178 of file RootDataConnection.h.

std::unique_ptr<TFile> Gaudi::RootDataConnection::m_file
protected

Reference to ROOT file.

Definition at line 156 of file RootDataConnection.h.

StringVec Gaudi::RootDataConnection::m_links
protected

Map containing internal links names.

Definition at line 166 of file RootDataConnection.h.

LinkSections Gaudi::RootDataConnection::m_linkSects
protected

Database link sections.

Definition at line 174 of file RootDataConnection.h.

StringVec Gaudi::RootDataConnection::m_mergeFIDs
protected

Map containing merge FIDs.

Definition at line 168 of file RootDataConnection.h.

MergeSections Gaudi::RootDataConnection::m_mergeSects
protected

Database section map for merged files.

Definition at line 172 of file RootDataConnection.h.

ParamMap Gaudi::RootDataConnection::m_params
protected

Parameter map for file parameters.

Definition at line 170 of file RootDataConnection.h.

TTree* Gaudi::RootDataConnection::m_refs = nullptr
protected

Pointer to the reference tree.

Definition at line 158 of file RootDataConnection.h.

Sections Gaudi::RootDataConnection::m_sections
protected

Tree sections in TFile.

Definition at line 160 of file RootDataConnection.h.

std::shared_ptr<RootConnectionSetup> Gaudi::RootDataConnection::m_setup
protected

Reference to the setup structure.

Definition at line 152 of file RootDataConnection.h.

std::unique_ptr<TTreePerfStats> Gaudi::RootDataConnection::m_statistics
protected

I/O read statistics from TTree.

Definition at line 154 of file RootDataConnection.h.

std::unique_ptr<Tool> Gaudi::RootDataConnection::m_tool

Definition at line 237 of file RootDataConnection.h.


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