The Gaudi Framework  v29r0 (ff2e7097)
RootDataConnection.h
Go to the documentation of this file.
1 #ifndef GAUDIROOT_ROOTDATACONNECTION_H
2 #define GAUDIROOT_ROOTDATACONNECTION_H
3 
4 // Framework include files
5 #include "GaudiKernel/ClassID.h"
7 #include "GaudiKernel/SmartIF.h"
9 #include <map>
10 #include <set>
11 #include <string>
12 #include <vector>
13 
14 #include "RootCnv/RootRefs.h"
15 #include "TFile.h"
16 #include "TTreePerfStats.h"
17 
18 // Forward declarations
19 class TTree;
20 class TClass;
21 class TBranch;
22 
23 class MsgStream;
24 class IRegistry;
25 class DataObject;
26 class IIncidentSvc;
27 
28 /*
29  * Gaudi namespace declaration
30  */
31 namespace Gaudi
32 {
33 
45  {
46  private:
50  SmartIF<IIncidentSvc> m_incidentSvc = nullptr;
51 
52  public:
55 
57  StringVec cacheBranches;
59  StringVec vetoBranches;
63  int cacheSize;
66 
68  RootConnectionSetup() = default;
69 
71  static long setCompression( const std::string& compression );
73  static int compression();
74 
76  void setMessageSvc( MsgStream* m );
78  MsgStream& msgSvc() const { return *m_msgSvc; }
79 
81  void setIncidentSvc( IIncidentSvc* m );
83  IIncidentSvc* incidentSvc() const { return m_incidentSvc.get(); }
84  };
85 
95  {
96  public:
97  enum { ROOT_READ_ERROR = 0x2, ROOT_OPEN_ERROR = 0x4 };
98 
111  ContainerSection() : start( -1 ), length( 0 ) {}
113  ContainerSection( int s, int l ) : start( s ), length( l ) {}
115  ContainerSection( const ContainerSection& s ) : start( s.start ), length( s.length ) {}
118  {
119  if ( this != &s ) {
120  start = s.start;
121  length = s.length;
122  }
123  return *this;
124  }
126  int start;
128  int length;
129  };
130 
145 
147  MsgStream& msgSvc() const { return m_setup->msgSvc(); }
148 
149  protected:
157  TTree* m_refs = nullptr;
159  Sections m_sections;
161  StringVec m_dbs;
163  StringVec m_conts;
165  StringVec m_links;
167  StringVec m_mergeFIDs;
169  ParamMap m_params;
171  MergeSections m_mergeSects;
173  LinkSections m_linkSects;
175  Clients m_clients;
178 
180  const std::string& empty() const;
181 
183  StatusCode saveRefs();
184 
185  public:
195  class Tool
196  {
197  protected:
205 
208 
209  public:
210  TTree* refs() const { return c->m_refs; }
211  StringVec& dbs() const { return c->m_dbs; }
212  StringVec& conts() const { return c->m_conts; }
213  StringVec& links() const { return c->m_links; }
214  ParamMap& params() const { return c->m_params; }
215  MsgStream& msgSvc() const { return c->msgSvc(); }
216  const std::string& name() const { return c->m_name; }
217  Sections& sections() const { return c->m_sections; }
218  LinkSections& linkSections() const { return c->m_linkSects; }
219  MergeSections& mergeSections() const { return c->m_mergeSects; }
220 
222  virtual ~Tool() = default;
224  virtual TBranch* getBranch( const std::string& section, const std::string& n ) = 0;
226  virtual RootRef poolRef( size_t /* which */ ) const { return RootRef(); }
227 
229  virtual StatusCode readRefs() = 0;
231  virtual StatusCode saveRefs() = 0;
233  virtual int loadRefs( const std::string& section, const std::string& cnt, unsigned long entry,
234  RootObjectRefs& refs ) = 0;
235  };
237  friend class Tool;
238 
240  Tool* makeTool();
241 
242  public:
246  ~RootDataConnection() override = default;
247 
249  TFile* file() const { return m_file.get(); }
251  bool isConnected() const override { return bool( m_file ); }
253  bool isWritable() const { return m_file && m_file->IsWritable(); }
255  Tool* tool() const { return m_tool.get(); }
257  const MergeSections& mergeSections() const { return m_mergeSects; }
259  const StringVec& mergeFIDs() const { return m_mergeFIDs; }
260 
262  void addClient( const IInterface* client );
264  size_t removeClient( const IInterface* client );
266  bool lookupClient( const IInterface* client ) const;
267 
269  void badWriteError( const std::string& msg ) const;
270 
272  std::pair<const RootRef*, const ContainerSection*> getMergeSection( const std::string& container, int entry ) const;
273 
275  void enableStatistics( const std::string& section );
277  void saveStatistics( const std::string& statisticsFile );
278 
280  int loadObj( const std::string& section, const std::string& cnt, unsigned long entry, DataObject*& pObj );
281 
283  int loadRefs( const std::string& section, const std::string& cnt, unsigned long entry, RootObjectRefs& refs );
284 
286  std::pair<int, unsigned long> saveObj( const std::string& section, const std::string& cnt, TClass* cl,
287  DataObject* pObj, int buff_siz, int split_lvl, bool fill_missing = false );
289  std::pair<int, unsigned long> save( const std::string& section, const std::string& cnt, TClass* cl, void* pObj,
290  int buff_siz, int split_lvl, bool fill_missing = false );
291 
293  StatusCode connectRead() override;
295  StatusCode connectWrite( IoType typ ) override;
297  StatusCode disconnect() override;
299  StatusCode read( void* const, size_t ) override { return StatusCode::FAILURE; }
301  StatusCode write( const void*, int ) override { return StatusCode::FAILURE; }
303  long long int seek( long long int, int ) override { return -1; }
304 
306  TTree* getSection( const std::string& sect, bool create = false );
307 
309  TBranch* getBranch( const std::string& section, const std::string& branch_name )
310  {
311  return m_tool->getBranch( section, branch_name );
312  }
314  TBranch* getBranch( const std::string& section, const std::string& branch_name, TClass* cl, void* ptr, int buff_siz,
315  int split_lvl );
316 
318  void makeRef( IRegistry* pA, RootRef& ref );
320  void makeRef( const std::string& name, long clid, int tech, const std::string& db, const std::string& cnt,
321  int entry, RootRef& ref );
322 
324  int makeLink( const std::string& p );
325 
327  const std::string& getDb( int which ) const;
328 
330  const std::string& getCont( int which ) const
331  {
332  return ( which >= 0 ) && ( size_t( which ) < m_conts.size() ) ? *( m_conts.begin() + which ) : empty();
333  }
334 
336  const std::string& getLink( int which ) const
337  {
338  return ( which >= 0 ) && ( size_t( which ) < m_links.size() ) ? *( m_links.begin() + which ) : empty();
339  }
340  };
341 } // End namespace Gaudi
342 #endif // GAUDIROOT_ROOTDATACONNECTION_H
const std::string & name() const
MergeSections m_mergeSects
Database section map for merged files.
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
const MergeSections & mergeSections() const
Access merged data section inventory.
RootDataConnection::Sections Sections
std::vector< ContainerSection > ContainerSections
Definition of container sections to handle merged files.
std::unique_ptr< Tool > m_tool
std::string m_name
Connection name/identifier.
IoType
I/O Connection types.
TFile * file() const
Direct access to TFile structure.
virtual RootRef poolRef(size_t) const
Internal overload to facilitate the access to POOL files.
bool isConnected() const override
Check if connected to data source.
std::map< std::string, ContainerSections > MergeSections
Definition of database section to handle merged files.
long long int seek(long long int, int) override
Seek on the file described by ioDesc. Arguments as in ::seek()
std::unique_ptr< TTreePerfStats > m_statistics
I/O read statistics from TTree.
Clients m_clients
Client list.
RootDataConnection::StringVec StringVec
int start
The start entry of the section.
std::set< const IInterface * > Clients
Client set.
MsgStream & msgSvc() const
Retrieve message service.
const std::string & getLink(int which) const
Access link name from saved index.
std::vector< std::string > StringVec
Type definition for string maps.
int cacheSize
RootCnvSvc Property: Root data cache size.
RootDataConnection::ContainerSections ContainerSections
Persistent reference object containing all leafs and links corresponding to a Gaudi DataObject...
Definition: RootRefs.h:60
StringVec m_links
Map containing internal links names.
ParamMap m_params
Parameter map for file parameters.
STL class.
std::string loadSection
RootCnvSvc Property: Root data cache size.
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:82
StringVec m_mergeFIDs
Map containing merge FIDs.
MergeSections & mergeSections() const
Persistent reference object.
Definition: RootRefs.h:31
StatusCode write(const void *, int) override
Write root byte buffer to output stream.
Helper class to facilitate an abstraction layer for reading POOL style files with this package...
int learnEntries
RootCnvSvc Property: ROOT cache learn entries.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
constexpr double m
Definition: SystemOfUnits.h:94
std::unique_ptr< MsgStream > m_msgSvc
Reference to message service.
Definition of the basic interface.
Definition: IInterface.h:277
TBranch * getBranch(const std::string &section, const std::string &branch_name)
Access data branch by name: Get existing branch in read only mode.
RootDataConnection::ParamMap ParamMap
std::vector< std::pair< std::string, std::string > > ParamMap
Type definition for the parameter map.
StringVec m_conts
Map containing external container names.
Sections m_sections
Tree sections in TFile.
StringVec cacheBranches
Vector of strings with branches to be cached for input files.
start
Definition: IOTest.py:99
std::vector< std::string > StringVec
Type definition for string maps.
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
std::vector< RootRef > LinkSections
Link sections definition.
RootDataConnection::MergeSections MergeSections
const std::string & getCont(int which) const
Access container name from saved index.
Tool * tool() const
Access tool.
ContainerSection(int s, int l)
Initializing constructor.
StringVec vetoBranches
Vector of strings with branches to NOT be cached for input files.
dictionary l
Definition: gaudirun.py:440
const StringVec & mergeFIDs() const
Access merged FIDs.
T get(T...args)
T size(T...args)
ContainerSection & operator=(const ContainerSection &s)
Assignment operator to copy objects.
RootDataConnection::ContainerSection ContainerSection
bool isWritable() const
Is the file writable?
ABC describing basic data connection.
RootDataConnection::LinkSections LinkSections
IIncidentSvc * incidentSvc() const
Retrieve incident service.
std::shared_ptr< RootConnectionSetup > m_setup
Reference to the setup structure.
T begin(T...args)
LinkSections m_linkSects
Database link sections.
def which(executable)
Definition: BaseTest.py:570
MsgStream & msgSvc() const
Allow access to printer service.
string s
Definition: gaudirun.py:253
ContainerSection(const ContainerSection &s)
Copy constructor.
RootDataConnection * c
Pointer to containing data connection object.
std::unique_ptr< TFile > m_file
Reference to ROOT file.
StringVec m_dbs
Map containing external database file names (fids)
std::string m_empty
Buffer for empty string reference.
#define GAUDI_API
Definition: Kernel.h:110
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:29
Concrete implementation of the IDataConnection interface to access ROOT files.
TTree * m_refs
Pointer to the reference tree.
StatusCode read(void *const, size_t) override
Read root byte buffer from input stream.
Helper functions to set/get the application return code.
Definition: __init__.py:1
Internal helper class, which described a TBranch section in a ROOT file.
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:23
LinkSections & linkSections() const
std::map< std::string, TTree * > Sections
Definition of tree sections.