The Gaudi Framework  v32r2 (46d42edc)
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 <string_view>
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 
62  int cacheSize;
65 
67  RootConnectionSetup() = default;
68 
70  static StatusCode setCompression( std::string_view 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;
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( std::string_view section, std::string_view 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( std::string_view section, std::string_view 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, std::string_view 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( std::string_view msg ) const;
264 
266  std::pair<const RootRef*, const ContainerSection*> getMergeSection( std::string_view container, int entry ) const;
267 
269  void enableStatistics( std::string_view section );
271  void saveStatistics( std::string_view statisticsFile );
272 
274  int loadObj( std::string_view section, std::string_view cnt, unsigned long entry, DataObject*& pObj );
275 
277  int loadRefs( std::string_view section, std::string_view cnt, unsigned long entry, RootObjectRefs& refs );
278 
280  std::pair<int, unsigned long> saveObj( std::string_view section, std::string_view cnt, TClass* cl, DataObject* pObj,
281  int buff_siz, int split_lvl, bool fill_missing = false );
283  std::pair<int, unsigned long> save( std::string_view section, std::string_view 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( std::string_view sect, bool create = false );
301 
303  TBranch* getBranch( std::string_view section, std::string_view branch_name ) {
304  return m_tool->getBranch( section, branch_name );
305  }
307  TBranch* getBranch( std::string_view section, std::string_view 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( std::string_view name, long clid, int tech, std::string_view db, std::string_view cnt, int entry,
314  RootRef& ref );
315 
317  int makeLink( std::string_view 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
MergeSections m_mergeSects
Database section map for merged files.
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
STL class.
TBranch * getBranch(std::string_view section, std::string_view branch_name)
Access data branch by name: Get existing branch in read only mode.
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
Tool * tool() const
Access tool.
MergeSections & mergeSections() const
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.
virtual RootRef poolRef(size_t) const
Internal overload to facilitate the access to POOL files.
Clients m_clients
Client list.
RootDataConnection::StringVec StringVec
int start
The start entry of the section.
std::set< const IInterface * > Clients
Client set.
IIncidentSvc * incidentSvc() const
Retrieve incident service.
std::vector< std::string > StringVec
Type definition for string maps.
LinkSections & linkSections() const
const StringVec & mergeFIDs() const
Access merged FIDs.
int cacheSize
RootCnvSvc Property: Root data cache size.
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:76
def start
Definition: IOTest.py:98
STL class.
RootDataConnection::ContainerSections ContainerSections
Persistent reference object containing all leafs and links corresponding to a Gaudi DataObject.
Definition: extractEvt.C:71
StringVec m_links
Map containing internal links names.
bool isConnected() const override
Check if connected to data source.
MsgStream & msgSvc() const
Allow access to printer service.
ParamMap m_params
Parameter map for file parameters.
STL class.
std::string loadSection
RootCnvSvc Property: Root data cache size.
StringVec m_mergeFIDs
Map containing merge FIDs.
Persistent reference object.
Definition: extractEvt.C:34
StatusCode write(const void *, int) override
Write root byte buffer to output stream.
#define STATUSCODE_ENUM_DECL(ENUM)
Declare an enum to be used as StatusCode value.
Definition: StatusCode.h:239
const std::string & getCont(int which) const
Access container name from saved index.
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.
const std::string & getLink(int which) const
Access link name from saved index.
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.
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
ContainerSection(int s, int l)
Initializing constructor.
StringVec vetoBranches
Vector of strings with branches to NOT be cached for input files.
MsgStream & msgSvc() const
Retrieve message service.
dictionary l
Definition: gaudirun.py:523
T get(T... args)
const std::string & name() const
T size(T... args)
ContainerSection & operator=(const ContainerSection &s)
Assignment operator to copy objects.
RootDataConnection::ContainerSection ContainerSection
ABC describing basic data connection.
RootDataConnection::LinkSections LinkSections
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:655
string s
Definition: gaudirun.py:318
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.
TFile * file() const
Direct access to TFile structure.
std::unique_ptr< TFile > m_file
Reference to ROOT file.
bool isWritable() const
Is the file writable?
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.
StatusCode read(void *const, size_t) override
Read root byte buffer from input stream.
Header file for std:chrono::duration-based Counters.
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