The Gaudi Framework  v30r2 (9eca68f7)
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 * > Sections
 Definition of tree sections. More...
 
typedef std::vector< ContainerSectionContainerSections
 Definition of container sections to handle merged files. More...
 
typedef std::map< std::string, ContainerSectionsMergeSections
 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, const std::string &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 (const std::string &msg) const
 Error handler when bad write statements occur. More...
 
std::pair< const RootRef *, const ContainerSection * > getMergeSection (const std::string &container, int entry) const
 Access link section for single container and entry. More...
 
void enableStatistics (const std::string &section)
 Enable TTreePerStats. More...
 
void saveStatistics (const std::string &statisticsFile)
 Save TTree access statistics if required. More...
 
int loadObj (const std::string &section, const std::string &cnt, unsigned long entry, DataObject *&pObj)
 Load object. More...
 
int loadRefs (const std::string &section, const std::string &cnt, unsigned long entry, RootObjectRefs &refs)
 Load references object. More...
 
std::pair< int, unsigned long > saveObj (const std::string &section, const std::string &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 (const std::string &section, const std::string &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 (const std::string &sect, bool create=false)
 Access TTree section from section name. The section is created if required. More...
 
TBranch * getBranch (const std::string &section, const std::string &branch_name)
 Access data branch by name: Get existing branch in read only mode. More...
 
TBranch * getBranch (const std::string &section, const std::string &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 (IRegistry *pA, RootRef &ref)
 Create reference object from registry entry. More...
 
void makeRef (const std::string &name, long clid, int tech, const std::string &db, const std::string &cnt, int entry, RootRef &ref)
 Create reference object from values. More...
 
int makeLink (const std::string &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 94 of file RootDataConnection.h.

Member Typedef Documentation

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

Client set.

Definition at line 144 of file RootDataConnection.h.

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

Definition of container sections to handle merged files.

Definition at line 138 of file RootDataConnection.h.

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

Link sections definition.

Definition at line 142 of file RootDataConnection.h.

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

Definition of database section to handle merged files.

Definition at line 140 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 134 of file RootDataConnection.h.

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

Definition of tree sections.

Definition at line 136 of file RootDataConnection.h.

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

Type definition for string maps.

Definition at line 132 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 97 of file RootDataConnection.h.

97 : 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,
const std::string nam,
std::shared_ptr< RootConnectionSetup setup 
)

Standard constructor.

Definition at line 158 of file RootDataConnection.cpp.

160  : IDataConnection( owner, fname ), m_setup( std::move( setup ) )
161 { // 01234567890123456789012345678901234567890
162  // Check if FID: A82A3BD8-7ECB-DC11-8DC0-000423D950B0
163  if ( fname.length() == 36 && fname[8] == '-' && fname[13] == '-' && fname[18] == '-' && fname[23] == '-' ) {
164  m_name = "FID:" + fname;
165  }
166  m_age = 0;
167  m_file.reset();
168  addClient( owner );
169 }
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 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 172 of file RootDataConnection.cpp.

172 { m_clients.insert( client ); }
Clients m_clients
Client list.
T insert(T...args)
void RootDataConnection::badWriteError ( const std::string msg) const

Error handler when bad write statements occur.

Definition at line 190 of file RootDataConnection.cpp.

191 {
192  msgSvc() << MSG::ERROR << "File:" << fid() << "Failed action:" << msg << endmsg;
193 }
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 235 of file RootDataConnection.cpp.

236 {
237  m_file.reset( TFile::Open( m_pfn.c_str() ) );
238  if ( !m_file || m_file->IsZombie() ) {
239  m_file.reset();
240  return StatusCode::FAILURE;
241  }
243  msgSvc() << MSG::DEBUG << "Opened file " << m_pfn << " in mode READ. [" << m_fid << "]" << endmsg << MSG::DEBUG;
244  if ( msgSvc().isActive() ) m_file->ls();
245  msgSvc() << MSG::VERBOSE;
246  if ( msgSvc().isActive() ) m_file->Print();
247  if ( makeTool() ) {
248  sc = m_tool->readRefs();
249  sc.ignore();
250 #if ROOT_VERSION_CODE >= ROOT_VERSION( 5, 33, 0 )
251  if ( sc == Status::ROOT_READ_ERROR ) {
252  IIncidentSvc* inc = m_setup->incidentSvc();
253  if ( inc ) {
254  inc->fireIncident( Incident( pfn(), IncidentType::CorruptedInputFile ) );
255  }
256  }
257 #endif
258  }
259  if ( !sc.isSuccess() ) return sc;
260  bool need_fid = m_fid == m_pfn;
261  string fid = m_fid;
262  m_mergeFIDs.clear();
263  for ( auto& elem : m_params ) {
264  if ( elem.first == "FID" ) {
265  m_mergeFIDs.push_back( elem.second );
266  if ( elem.second != m_fid ) {
267  msgSvc() << MSG::DEBUG << "Check FID param:" << elem.second << endmsg;
268  // if ( m_fid == m_pfn ) {
269  m_fid = elem.second;
270  //}
271  }
272  }
273  }
274  if ( !need_fid && fid != m_fid ) {
275  msgSvc() << MSG::ERROR << "FID mismatch:" << fid << "(Catalog) != " << m_fid << "(file)" << endmsg
276  << "for PFN:" << m_pfn << endmsg;
277  return StatusCode::FAILURE;
278  }
279  msgSvc() << MSG::DEBUG << "Using FID " << m_fid << " from params table...." << endmsg << "for PFN:" << m_pfn
280  << endmsg;
281  return sc;
282 }
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 285 of file RootDataConnection.cpp.

286 {
287  int compress = RootConnectionSetup::compression();
288  msgSvc() << MSG::DEBUG;
289  switch ( typ ) {
290  case CREATE:
291  resetAge();
292  m_file.reset( TFile::Open( m_pfn.c_str(), "CREATE", "Root event data", compress ) );
293  m_refs = new TTree( "Refs", "Root reference data" );
294  msgSvc() << "Opened file " << m_pfn << " in mode CREATE. [" << m_fid << "]" << endmsg;
295  m_params.emplace_back( "PFN", m_pfn );
296  if ( m_fid != m_pfn ) {
297  m_params.emplace_back( "FID", m_fid );
298  }
299  makeTool();
300  break;
301  case RECREATE:
302  resetAge();
303  m_file.reset( TFile::Open( m_pfn.c_str(), "RECREATE", "Root event data", compress ) );
304  msgSvc() << "Opened file " << m_pfn << " in mode RECREATE. [" << m_fid << "]" << endmsg;
305  m_refs = new TTree( "Refs", "Root reference data" );
306  m_params.emplace_back( "PFN", m_pfn );
307  if ( m_fid != m_pfn ) {
308  m_params.emplace_back( "FID", m_fid );
309  }
310  makeTool();
311  break;
312  case UPDATE:
313  resetAge();
314  m_file.reset( TFile::Open( m_pfn.c_str(), "UPDATE", "Root event data", compress ) );
315  msgSvc() << "Opened file " << m_pfn << " in mode UPDATE. [" << m_fid << "]" << endmsg;
316  if ( m_file && !m_file->IsZombie() ) {
317  if ( makeTool() ) {
318  StatusCode sc = m_tool->readRefs();
319  sc.ignore();
320  if ( sc == Status::ROOT_READ_ERROR ) {
321 #if ROOT_VERSION_CODE >= ROOT_VERSION( 5, 33, 0 )
322  IIncidentSvc* inc = m_setup->incidentSvc();
323  if ( inc ) {
324  inc->fireIncident( Incident( pfn(), IncidentType::CorruptedInputFile ) );
325  }
326 #endif
327  }
328  return sc;
329  }
330  TDirectory::TContext ctxt( m_file.get() );
331  m_refs = new TTree( "Refs", "Root reference data" );
332  makeTool();
333  return StatusCode::SUCCESS;
334  }
335  break;
336  default:
337  m_refs = nullptr;
338  m_file.reset();
339  return StatusCode::FAILURE;
340  }
342 }
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 345 of file RootDataConnection.cpp.

346 {
347  if ( m_file ) {
348  if ( !m_file->IsZombie() ) {
349  if ( m_file->IsWritable() ) {
350  msgSvc() << MSG::DEBUG;
351  TDirectory::TContext ctxt( m_file.get() );
352  if ( m_refs ) {
353  if ( !m_tool->saveRefs().isSuccess() ) badWriteError( "Saving References" );
354  if ( m_refs->Write() < 0 ) badWriteError( "Write Reference branch" );
355  }
356  for ( auto& i : m_sections ) {
357  if ( i.second ) {
358  if ( i.second->Write() < 0 ) badWriteError( "Write section:" + i.first );
359  msgSvc() << "Disconnect section " << i.first << " " << i.second->GetName() << endmsg;
360  }
361  }
362  m_sections.clear();
363  }
364  msgSvc() << MSG::DEBUG;
365  if ( msgSvc().isActive() ) m_file->ls();
366  msgSvc() << MSG::VERBOSE;
367  if ( msgSvc().isActive() ) m_file->Print();
368  m_file->Close();
369  }
370  msgSvc() << MSG::DEBUG << "Disconnected file " << m_pfn << " " << m_file->GetName() << endmsg;
371  m_file.reset();
372  m_tool.reset();
373  }
374  return StatusCode::SUCCESS;
375 }
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
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
void badWriteError(const std::string &msg) const
Error handler when bad write statements occur.
CSTR RootDataConnection::empty ( ) const
protected

Empty string reference.

Definition at line 480 of file RootDataConnection.cpp.

480 { return s_empty; }
void RootDataConnection::enableStatistics ( const std::string section)

Enable TTreePerStats.

Definition at line 206 of file RootDataConnection.cpp.

207 {
208  if ( m_statistics ) {
209  TTree* t = getSection( section, false );
210  if ( t ) {
211  m_statistics.reset( new TTreePerfStats( ( section + "_ioperf" ).c_str(), t ) );
212  return;
213  }
214  msgSvc() << MSG::WARNING << "Failed to enable perfstats for tree:" << section << endmsg;
215  return;
216  }
217  msgSvc() << MSG::INFO << "Perfstats are ALREADY ENABLED." << endmsg;
218 }
std::unique_ptr< TTreePerfStats > m_statistics
I/O read statistics from TTree.
TTree * getSection(const std::string &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 247 of file RootDataConnection.h.

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

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

Definition at line 307 of file RootDataConnection.h.

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

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

const std::string& Gaudi::RootDataConnection::getCont ( int  which) const
inline

Access container name from saved index.

Definition at line 328 of file RootDataConnection.h.

329  {
330  return ( which >= 0 ) && ( size_t( which ) < m_conts.size() ) ? *( m_conts.begin() + which ) : empty();
331  }
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 470 of file RootDataConnection.cpp.

471 {
472  if ( ( which >= 0 ) && ( size_t( which ) < m_dbs.size() ) ) {
473  if ( *( m_dbs.begin() + which ) == s_local ) return m_fid;
474  return *( m_dbs.begin() + which );
475  }
476  return s_empty;
477 }
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 334 of file RootDataConnection.h.

335  {
336  return ( which >= 0 ) && ( size_t( which ) < m_links.size() ) ? *( m_links.begin() + which ) : empty();
337  }
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 ( const std::string container,
int  entry 
) const

Access link section for single container and entry.

Definition at line 598 of file RootDataConnection.cpp.

599 {
600  // size_t idx = cont.find('/',1);
601  // string container = cont[0]=='/' ? cont.substr(1,idx==string::npos?idx:idx-1) : cont;
602  auto i = m_mergeSects.find( container );
603  if ( i != m_mergeSects.end() ) {
604  size_t cnt = 0;
605  const ContainerSections& s = ( *i ).second;
606  for ( auto j = s.cbegin(); j != s.cend(); ++j, ++cnt ) {
607  const ContainerSection& c = *j;
608  if ( entry >= c.start && entry < ( c.start + c.length ) ) {
609  if ( m_linkSects.size() > cnt ) {
610  if ( msgSvc().isActive() ) {
611  msgSvc() << MSG::VERBOSE << "MergeSection for:" << container << " [" << entry << "]" << endmsg
612  << "FID:" << m_fid << " -> PFN:" << m_pfn << endmsg;
613  }
614  return {&( m_linkSects[cnt] ), &c};
615  }
616  }
617  }
618  }
619  msgSvc() << MSG::DEBUG << "Return INVALID MergeSection for:" << container << " [" << entry << "]" << endmsg
620  << "FID:" << m_fid << " -> PFN:" << m_pfn << endmsg;
621  return {nullptr, nullptr};
622 }
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 ( const std::string sect,
bool  create = false 
)

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

Definition at line 378 of file RootDataConnection.cpp.

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

249 { 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 251 of file RootDataConnection.h.

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

Load object.

Definition at line 524 of file RootDataConnection.cpp.

525 {
526  TBranch* b = getBranch( section, cnt );
527  if ( b ) {
528  TClass* cl = gROOT->GetClass( b->GetClassName(), kTRUE );
529  if ( cl ) {
530  int nb = -1;
531  pObj = (DataObject*)cl->New();
532  {
533  DataObjectPush push( pObj );
534  b->SetAddress( &pObj );
535  if ( section == m_setup->loadSection ) {
536  TTree* t = b->GetTree();
537  if ( Long64_t( entry ) != t->GetReadEntry() ) {
538  t->LoadTree( Long64_t( entry ) );
539  }
540  }
541  nb = b->GetEntry( entry );
542  msgSvc() << MSG::VERBOSE;
543  if ( msgSvc().isActive() ) {
544  msgSvc() << "Load [" << entry << "] --> " << section << ":" << cnt << " " << nb << " bytes." << endmsg;
545  }
546  if ( nb < 0 ) { // This is definitely an error...ROOT says if reads fail, -1 is issued.
547 #if ROOT_VERSION_CODE >= ROOT_VERSION( 5, 33, 0 )
548  IIncidentSvc* inc = m_setup->incidentSvc();
549  if ( inc ) {
550  inc->fireIncident( Incident( pfn(), IncidentType::CorruptedInputFile ) );
551  }
552 #endif
553  } else if ( nb == 0 && pObj->clID() == CLID_DataObject ) {
554  TFile* f = b->GetFile();
555  int vsn = f->GetVersion();
556  if ( vsn < 52400 ) {
557  // For Gaudi v21r5 (ROOT 5.24.00b) DataObject::m_version was not written!
558  // Still this call be well be successful.
559  nb = 1;
560  } else if ( vsn > 1000000 && ( vsn % 1000000 ) < 52400 ) {
561  // dto. Some POOL files have for unknown reasons a version
562  // not according to ROOT standards. Hack this explicitly.
563  nb = 1;
564  }
565  }
566  if ( nb < 0 ) {
567  delete pObj;
568  pObj = nullptr;
569  }
570  }
571  return nb;
572  }
573  }
574  return -1;
575 }
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(const std::string &section, const std::string &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 ( const std::string section,
const std::string cnt,
unsigned long  entry,
RootObjectRefs refs 
)

Load references object.

Definition at line 578 of file RootDataConnection.cpp.

580 {
581  int nbytes = m_tool->loadRefs( section, cnt, entry, refs );
582 #if ROOT_VERSION_CODE >= ROOT_VERSION( 5, 33, 0 )
583  if ( nbytes < 0 ) {
584  // This is definitely an error:
585  // -- Either branch not preesent at all or
586  // -- ROOT I/O error, which issues -1
587  IIncidentSvc* inc = m_setup->incidentSvc();
588  if ( inc ) {
589  inc->fireIncident( Incident( pfn(), IncidentType::CorruptedInputFile ) );
590  }
591  }
592 #endif
593  return nbytes;
594 }
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 183 of file RootDataConnection.cpp.

184 {
185  auto i = m_clients.find( client );
186  return i != m_clients.end();
187 }
Clients m_clients
Client list.
T end(T...args)
T find(T...args)
int RootDataConnection::makeLink ( const std::string p)

Convert path string to path index.

Definition at line 461 of file RootDataConnection.cpp.

462 {
463  auto ip = std::find( std::begin( m_links ), std::end( m_links ), p );
464  if ( ip != std::end( m_links ) ) return std::distance( std::begin( m_links ), ip );
465  m_links.push_back( p );
466  return m_links.size() - 1;
467 }
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 ( IRegistry pA,
RootRef ref 
)

Create reference object from registry entry.

Definition at line 625 of file RootDataConnection.cpp.

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

Create reference object from values.

RootDataConnection::Tool * RootDataConnection::makeTool ( )

Create file access tool to encapsulate POOL compatibiliy.

Definition at line 221 of file RootDataConnection.cpp.

222 {
223  if ( !m_refs ) m_refs = (TTree*)m_file->Get( "Refs" );
224  if ( m_refs ) m_tool.reset( new RootTool( this ) );
225 #ifdef __POOL_COMPATIBILITY
226  else if ( m_file->Get( "##Links" ) != nullptr )
227  m_tool.reset( new PoolTool( this ) );
228 #endif
229  else
230  m_tool.reset();
231  return m_tool.get();
232 }
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 257 of file RootDataConnection.h.

257 { 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 255 of file RootDataConnection.h.

255 { 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 147 of file RootDataConnection.h.

147 { 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 297 of file RootDataConnection.h.

297 { 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 175 of file RootDataConnection.cpp.

176 {
177  auto i = m_clients.find( client );
178  if ( i != m_clients.end() ) m_clients.erase( i );
179  return m_clients.size();
180 }
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 ( const std::string section,
const std::string 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 491 of file RootDataConnection.cpp.

493 {
494  split_lvl = 0;
495  TBranch* b = getBranch( section, cnt, cl, pObj ? &pObj : nullptr, buff_siz, split_lvl );
496  if ( b ) {
497  Long64_t evt = b->GetEntries();
498  // msgSvc() << MSG::DEBUG << cnt.c_str() << " Obj:" << (void*)pObj
499  // << " Split:" << split_lvl << " Buffer size:" << buff_siz << endl;
500  if ( fill_missing ) {
501  Long64_t num, nevt = b->GetTree()->GetEntries();
502  if ( nevt > evt ) {
503  b->SetAddress( nullptr );
504  num = nevt - evt;
505  while ( num > 0 ) {
506  b->Fill();
507  --num;
508  }
509  msgSvc() << MSG::DEBUG << "Added " << long( nevt - evt ) << " / Tree: " << nevt
510  << " / Branch: " << b->GetEntries() + 1 << " NULL entries to:" << cnt << endmsg;
511  evt = b->GetEntries();
512  }
513  }
514  b->SetAddress( &pObj );
515  return {b->Fill(), evt};
516  }
517  if ( pObj ) {
518  msgSvc() << MSG::ERROR << "Failed to access branch " << m_name << "/" << cnt << endmsg;
519  }
520  return {-1, ~0};
521 }
std::string m_name
Connection name/identifier.
TBranch * getBranch(const std::string &section, const std::string &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 ( const std::string section,
const std::string 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 483 of file RootDataConnection.cpp.

485 {
486  DataObjectPush push( pObj );
487  return save( section, cnt, cl, pObj, buff_siz, split_lvl, fill );
488 }
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(const std::string &section, const std::string &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 ( const std::string statisticsFile)

Save TTree access statistics if required.

Definition at line 196 of file RootDataConnection.cpp.

197 {
198  if ( m_statistics ) {
199  m_statistics->Print();
200  if ( !statisticsFile.empty() ) m_statistics->SaveAs( statisticsFile.c_str() );
202  }
203 }
T empty(T...args)
std::unique_ptr< TTreePerfStats > m_statistics
I/O read statistics from TTree.
T reset(T...args)
T c_str(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 301 of file RootDataConnection.h.

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

Access tool.

Definition at line 253 of file RootDataConnection.h.

253 { 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 299 of file RootDataConnection.h.

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

Friends And Related Function Documentation

friend class Tool
friend

Definition at line 237 of file RootDataConnection.h.

Member Data Documentation

Clients Gaudi::RootDataConnection::m_clients
protected

Client list.

Definition at line 175 of file RootDataConnection.h.

StringVec Gaudi::RootDataConnection::m_conts
protected

Map containing external container names.

Definition at line 163 of file RootDataConnection.h.

StringVec Gaudi::RootDataConnection::m_dbs
protected

Map containing external database file names (fids)

Definition at line 161 of file RootDataConnection.h.

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

Buffer for empty string reference.

Definition at line 177 of file RootDataConnection.h.

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

Reference to ROOT file.

Definition at line 155 of file RootDataConnection.h.

StringVec Gaudi::RootDataConnection::m_links
protected

Map containing internal links names.

Definition at line 165 of file RootDataConnection.h.

LinkSections Gaudi::RootDataConnection::m_linkSects
protected

Database link sections.

Definition at line 173 of file RootDataConnection.h.

StringVec Gaudi::RootDataConnection::m_mergeFIDs
protected

Map containing merge FIDs.

Definition at line 167 of file RootDataConnection.h.

MergeSections Gaudi::RootDataConnection::m_mergeSects
protected

Database section map for merged files.

Definition at line 171 of file RootDataConnection.h.

ParamMap Gaudi::RootDataConnection::m_params
protected

Parameter map for file parameters.

Definition at line 169 of file RootDataConnection.h.

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

Pointer to the reference tree.

Definition at line 157 of file RootDataConnection.h.

Sections Gaudi::RootDataConnection::m_sections
protected

Tree sections in TFile.

Definition at line 159 of file RootDataConnection.h.

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

Reference to the setup structure.

Definition at line 151 of file RootDataConnection.h.

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

I/O read statistics from TTree.

Definition at line 153 of file RootDataConnection.h.

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

Definition at line 236 of file RootDataConnection.h.


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