Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 "boost/utility/string_ref.hpp"
10 #include <map>
11 #include <set>
12 #include <string>
13 #include <vector>
14 
15 #include "RootCnv/RootRefs.h"
16 #include "TFile.h"
17 #include "TTreePerfStats.h"
18 
19 // Forward declarations
20 class TTree;
21 class TClass;
22 class TBranch;
23 
24 class MsgStream;
25 class IRegistry;
26 class DataObject;
27 class IIncidentSvc;
28 
29 /*
30  * Gaudi namespace declaration
31  */
32 namespace Gaudi {
33 
45  private:
49  SmartIF<IIncidentSvc> m_incidentSvc = nullptr;
50 
51  public:
54 
56  StringVec cacheBranches;
58  StringVec vetoBranches;
62  int cacheSize;
65 
67  RootConnectionSetup() = default;
68 
70  static StatusCode setCompression( boost::string_ref compression );
72  static int compression();
73 
75  void setMessageSvc( MsgStream* m );
77  MsgStream& msgSvc() const { return *m_msgSvc; }
78 
80  void setIncidentSvc( IIncidentSvc* m );
82  IIncidentSvc* incidentSvc() const { return m_incidentSvc.get(); }
83  };
84 
94  public:
95  enum class Status : StatusCode::code_t { ROOT_READ_ERROR = 0x2, ROOT_OPEN_ERROR = 0x4 };
96 
109  ContainerSection() : start( -1 ), length( 0 ) {}
111  ContainerSection( int s, int l ) : start( s ), length( l ) {}
113  ContainerSection( const ContainerSection& s ) : start( s.start ), length( s.length ) {}
116  if ( this != &s ) {
117  start = s.start;
118  length = s.length;
119  }
120  return *this;
121  }
123  int start;
125  int length;
126  };
127 
142 
144  MsgStream& msgSvc() const { return m_setup->msgSvc(); }
145 
146  protected:
154  TTree* m_refs = nullptr;
156  Sections m_sections;
158  StringVec m_dbs;
160  StringVec m_conts;
162  StringVec m_links;
164  StringVec m_mergeFIDs;
166  ParamMap m_params;
168  MergeSections m_mergeSects;
170  LinkSections m_linkSects;
172  Clients m_clients;
175 
177  const std::string& empty() const;
178 
180  StatusCode saveRefs();
181 
182  public:
192  class Tool {
193  protected:
201 
204 
205  public:
206  TTree* refs() const { return c->m_refs; }
207  StringVec& dbs() const { return c->m_dbs; }
208  StringVec& conts() const { return c->m_conts; }
209  StringVec& links() const { return c->m_links; }
210  ParamMap& params() const { return c->m_params; }
211  MsgStream& msgSvc() const { return c->msgSvc(); }
212  const std::string& name() const { return c->m_name; }
213  Sections& sections() const { return c->m_sections; }
214  LinkSections& linkSections() const { return c->m_linkSects; }
215  MergeSections& mergeSections() const { return c->m_mergeSects; }
216 
218  virtual ~Tool() = default;
220  virtual TBranch* getBranch( boost::string_ref section, boost::string_ref n ) = 0;
222  virtual RootRef poolRef( size_t /* which */ ) const { return RootRef(); }
223 
225  virtual StatusCode readRefs() = 0;
227  virtual StatusCode saveRefs() = 0;
229  virtual int loadRefs( boost::string_ref section, boost::string_ref cnt, unsigned long entry,
230  RootObjectRefs& refs ) = 0;
231  };
233  friend class Tool;
234 
236  Tool* makeTool();
237 
238  public:
240  RootDataConnection( const IInterface* own, boost::string_ref nam, std::shared_ptr<RootConnectionSetup> setup );
241 
243  TFile* file() const { return m_file.get(); }
245  bool isConnected() const override { return bool( m_file ); }
247  bool isWritable() const { return m_file && m_file->IsWritable(); }
249  Tool* tool() const { return m_tool.get(); }
251  const MergeSections& mergeSections() const { return m_mergeSects; }
253  const StringVec& mergeFIDs() const { return m_mergeFIDs; }
254 
256  void addClient( const IInterface* client );
258  size_t removeClient( const IInterface* client );
260  bool lookupClient( const IInterface* client ) const;
261 
263  void badWriteError( boost::string_ref msg ) const;
264 
266  std::pair<const RootRef*, const ContainerSection*> getMergeSection( boost::string_ref container, int entry ) const;
267 
269  void enableStatistics( boost::string_ref section );
271  void saveStatistics( boost::string_ref statisticsFile );
272 
274  int loadObj( boost::string_ref section, boost::string_ref cnt, unsigned long entry, DataObject*& pObj );
275 
277  int loadRefs( boost::string_ref section, boost::string_ref cnt, unsigned long entry, RootObjectRefs& refs );
278 
280  std::pair<int, unsigned long> saveObj( boost::string_ref section, boost::string_ref cnt, TClass* cl,
281  DataObject* pObj, int buff_siz, int split_lvl, bool fill_missing = false );
283  std::pair<int, unsigned long> save( boost::string_ref section, boost::string_ref cnt, TClass* cl, void* pObj,
284  int buff_siz, int split_lvl, bool fill_missing = false );
285 
287  StatusCode connectRead() override;
289  StatusCode connectWrite( IoType typ ) override;
291  StatusCode disconnect() override;
293  StatusCode read( void* const, size_t ) override { return StatusCode::FAILURE; }
295  StatusCode write( const void*, int ) override { return StatusCode::FAILURE; }
297  long long int seek( long long int, int ) override { return -1; }
298 
300  TTree* getSection( boost::string_ref sect, bool create = false );
301 
303  TBranch* getBranch( boost::string_ref section, boost::string_ref branch_name ) {
304  return m_tool->getBranch( section, branch_name );
305  }
307  TBranch* getBranch( boost::string_ref section, boost::string_ref branch_name, TClass* cl, void* ptr, int buff_siz,
308  int split_lvl );
309 
311  void makeRef( const IRegistry& pA, RootRef& ref );
313  void makeRef( boost::string_ref name, long clid, int tech, boost::string_ref db, boost::string_ref cnt, int entry,
314  RootRef& ref );
315 
317  int makeLink( boost::string_ref p );
318 
320  const std::string& getDb( int which ) const;
321 
323  const std::string& getCont( int which ) const {
324  return ( which >= 0 ) && ( size_t( which ) < m_conts.size() ) ? *( m_conts.begin() + which ) : empty();
325  }
326 
328  const std::string& getLink( int which ) const {
329  return ( which >= 0 ) && ( size_t( which ) < m_links.size() ) ? *( m_links.begin() + which ) : empty();
330  }
331  };
332 } // End namespace Gaudi
333 
335 
336 #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.
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.
std::map< std::string, ContainerSections, std::less<> > MergeSections
Definition of database section to handle merged files.
Clients m_clients
Client list.
RootDataConnection::StringVec StringVec
int start
The start entry of the section.
std::set< const IInterface * > Clients
Client set.
#define STATUSCODE_ENUM_DECL(ENUM)
Declare an enum to be used as StatusCode value.
Definition: StatusCode.h:239
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.
STL class.
RootDataConnection::ContainerSections ContainerSections
Persistent reference object containing all leafs and links corresponding to a Gaudi DataObject...
Definition: RootRefs.h:58
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:76
StringVec m_mergeFIDs
Map containing merge FIDs.
MergeSections & mergeSections() const
Persistent reference object.
Definition: RootRefs.h:30
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:50
constexpr double m
Definition: SystemOfUnits.h:92
std::unique_ptr< MsgStream > m_msgSvc
Reference to message service.
Definition of the basic interface.
Definition: IInterface.h:244
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:97
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:517
const StringVec & mergeFIDs() const
Access merged FIDs.
T get(T...args)
TBranch * getBranch(boost::string_ref section, boost::string_ref branch_name)
Access data branch by name: Get existing branch in read only mode.
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:632
MsgStream & msgSvc() const
Allow access to printer service.
string s
Definition: gaudirun.py:312
constexpr static const auto FAILURE
Definition: StatusCode.h:86
ContainerSection(const ContainerSection &s)
Copy constructor.
std::map< std::string, TTree *, std::less<> > Sections
Definition of tree sections.
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:71
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
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
unsigned long code_t
type of StatusCode value
Definition: StatusCode.h:52
LinkSections & linkSections() const