Logo ROOT   6.21/01
Reference Guide
TBasket.h
Go to the documentation of this file.
1 // @(#)root/tree:$Id$
2 // Author: Rene Brun 19/01/96
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TBasket
13 #define ROOT_TBasket
14 
15 //////////////////////////////////////////////////////////////////////////
16 // //
17 // TBasket //
18 // //
19 // The TBasket objects are created at run time to collect TTree entries //
20 // in buffers. When a Basket is full, it is written to the file. //
21 // The Basket is kept in memory if there is enough space. //
22 // (see the fMaxVirtualsize of TTree). //
23 // //
24 // The Basket class derives from TKey. //
25 //////////////////////////////////////////////////////////////////////////
26 
27 
28 #include "TKey.h"
29 
30 class TFile;
31 class TTree;
32 class TBranch;
33 
34 class TBasket : public TKey {
35 friend class TBranch;
36 
37 private:
38  TBasket(const TBasket&); ///< TBasket objects are not copiable.
39  TBasket& operator=(const TBasket&); ///< TBasket objects are not copiable.
40 
41  // Internal corner cases for ReadBasketBuffers
44 
45  // Helper for managing the compressed buffer.
47 
48  // Handles special logic around deleting / reseting the entry offset pointer.
49  void ResetEntryOffset();
50 
51  // Get entry offset as result of a calculation.
53 
54  // Returns true if the underlying TLeaf can regenerate the entry offsets for us.
56 
57  // Manage buffer ownership.
58  void DisownBuffer();
59  void AdoptBuffer(TBuffer *user_buffer);
60 
61 protected:
62  Int_t fBufferSize{0}; ///< fBuffer length in bytes
63  Int_t fNevBufSize{0}; ///< Length in Int_t of fEntryOffset OR fixed length of each entry if fEntryOffset is null!
64  Int_t fNevBuf{0}; ///< Number of entries in basket
65  Int_t fLast{0}; ///< Pointer to last used byte in basket
66  Bool_t fHeaderOnly{kFALSE}; ///< True when only the basket header must be read/written
67  UChar_t fIOBits{0}; ///<!IO feature flags. Serialized in custom portion of streamer to avoid forward compat issues unless needed.
68  Bool_t fOwnsCompressedBuffer{kFALSE}; ///<! Whether or not we own the compressed buffer.
69  Bool_t fReadEntryOffset{kFALSE}; ///<!Set to true if offset array was read from a file.
70  Int_t *fDisplacement{nullptr}; ///<![fNevBuf] Displacement of entries in fBuffer(TKey)
71  Int_t *fEntryOffset{nullptr}; ///<[fNevBuf] Offset of entries in fBuffer(TKey); generated at runtime. Special value
72  /// of `-1` indicates that the offset generation MUST be performed on first read.
73  TBranch *fBranch{nullptr}; ///<Pointer to the basket support branch
74  TBuffer *fCompressedBufferRef{nullptr}; ///<! Compressed buffer.
75  Int_t fLastWriteBufferSize[3] = {0,0,0}; ///<! Size of the buffer last three buffers we wrote it to disk
76  Bool_t fResetAllocation{false}; ///<! True if last reset re-allocated the memory
77  UChar_t fNextBufferSizeRecord{0}; ///<! Index into fLastWriteBufferSize of the last buffer written to disk
78 #ifdef R__TRACK_BASKET_ALLOC_TIME
79  ULong64_t fResetAllocationTime{0}; ///<! Time spent reallocating baskets in microseconds during last Reset operation.
80 #endif
81 
82 public:
83  // The IO bits flag is to provide improved forward-compatibility detection.
84  // Any new non-forward compatibility flags related serialization should be
85  // added here. When a new flag is added, set it in the kSupported field;
86  //
87  // The values and names of this (and EUnsupportedIOBits) enum need not be aligned
88  // with the values of the various TIOFeatures enums, as there's a clean separation
89  // between these two interfaces. Practically, it is reasonable to keep them as aligned
90  // as possible in order to avoid confusion.
91  //
92  // If (fIOBits & ~kSupported) is non-zero -- i.e., an unknown IO flag is set
93  // in the fIOBits -- then the zombie flag will be set for this object.
94  //
95  enum class EIOBits : Char_t {
96  // The following to bits are reserved for now; when supported, set
97  // kSupported = kGenerateOffsetMap | kBasketClassMap
99  // kBasketClassMap = BIT(1),
101  };
102  // This enum covers IOBits that are known to this ROOT release but
103  // not supported; provides a mechanism for us to have experimental
104  // changes that are not going go into a supported release.
105  //
106  // (kUnsupported | kSupported) should result in the '|' of all IOBits.
107  enum class EUnsupportedIOBits : Char_t { kUnsupported = 0 };
108  // The number of known, defined IOBits.
109  static constexpr int kIOBitCount = 1;
110 
111  TBasket();
112  TBasket(TDirectory *motherDir);
113  TBasket(const char *name, const char *title, TBranch *branch);
114  virtual ~TBasket();
115 
116  virtual void AdjustSize(Int_t newsize);
117  virtual void DeleteEntryOffset();
118  virtual Int_t DropBuffers();
119  TBranch *GetBranch() const {return fBranch;}
120  Int_t GetBufferSize() const {return fBufferSize;}
123  {
124  return R__likely(fEntryOffset != reinterpret_cast<Int_t *>(-1)) ? fEntryOffset : GetCalculatedEntryOffset();
125  }
126  Int_t GetEntryPointer(Int_t Entry);
127  Int_t GetNevBuf() const {return fNevBuf;}
128  Int_t GetNevBufSize() const {return fNevBufSize;}
129  Int_t GetLast() const {return fLast;}
130  virtual void MoveEntries(Int_t dentries);
131  virtual void PrepareBasket(Long64_t /* entry */) {};
134  virtual void Reset();
135 
136 // Time spent reseting basket sizes (typically, at event cluster boundaries), in microseconds
137 #ifdef R__TRACK_BASKET_ALLOC_TIME
138  ULong64_t GetResetAllocationTime() const { return fResetAllocationTime; }
139 #endif
140  // Count of resets performed of basket size.
142 
144  Long64_t CopyTo(TFile *to);
145 
146  void SetBranch(TBranch *branch) { fBranch = branch; }
148  virtual void SetReadMode();
149  virtual void SetWriteMode();
150  inline void Update(Int_t newlast) { Update(newlast,newlast); };
151  virtual void Update(Int_t newlast, Int_t skipped);
152  virtual Int_t WriteBuffer();
153 
154  ClassDef(TBasket, 3); // the TBranch buffers
155 };
156 
157 #endif
void ResetEntryOffset()
Definition: TBasket.cxx:437
Int_t * GetEntryOffset()
Definition: TBasket.h:122
Int_t ReadBasketBytes(Long64_t pos, TFile *file)
Read basket buffers in memory and cleanup.
Definition: TBasket.cxx:694
Bool_t fHeaderOnly
True when only the basket header must be read/written.
Definition: TBasket.h:66
Bool_t fReadEntryOffset
!Set to true if offset array was read from a file.
Definition: TBasket.h:69
virtual void SetReadMode()
Set read mode of basket.
Definition: TBasket.cxx:848
void Update(Int_t newlast)
Definition: TBasket.h:150
Int_t ReadBasketBuffers(Long64_t pos, Int_t len, TFile *file)
Read basket buffers in memory and cleanup.
Definition: TBasket.cxx:460
long long Long64_t
Definition: RtypesCore.h:69
Int_t * fDisplacement
![fNevBuf] Displacement of entries in fBuffer(TKey)
Definition: TBasket.h:70
Int_t GetNevBufSize() const
Definition: TBasket.h:128
Int_t fBufferSize
fBuffer length in bytes
Definition: TBasket.h:62
Int_t * fEntryOffset
[fNevBuf] Offset of entries in fBuffer(TKey); generated at runtime.
Definition: TBasket.h:71
#define BIT(n)
Definition: Rtypes.h:83
TBranch * fBranch
Pointer to the basket support branch.
Definition: TBasket.h:73
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format...
Definition: TFile.h:48
Buffer base class used for serializing objects.
Definition: TBuffer.h:42
#define R__likely(expr)
Definition: RConfig.hxx:605
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
Int_t fNevBuf
Number of entries in basket.
Definition: TBasket.h:64
void SetBranch(TBranch *branch)
Definition: TBasket.h:146
static constexpr int kIOBitCount
Definition: TBasket.h:109
#define ClassDef(name, id)
Definition: Rtypes.h:326
EIOBits
Definition: TBasket.h:95
Bool_t GetResetAllocationCount() const
Definition: TBasket.h:141
virtual void Reset()
Reset the basket to the starting state.
Definition: TBasket.cxx:729
virtual Int_t WriteBuffer()
Write buffer of this basket on the current file.
Definition: TBasket.cxx:1054
Bool_t CanGenerateOffsetArray()
Determine whether we can generate the offset array when this branch is read.
Definition: TBasket.cxx:214
Book space in a file, create I/O buffers, to fill them, (un)compress them.
Definition: TKey.h:24
TBranch * GetBranch() const
Definition: TBasket.h:119
void InitializeCompressedBuffer(Int_t len, TFile *file)
Initialize the compressed buffer; either from the TTree or create a local one.
Definition: TBasket.cxx:428
UChar_t fNextBufferSizeRecord
! Index into fLastWriteBufferSize of the last buffer written to disk
Definition: TBasket.h:77
UChar_t fIOBits
!IO feature flags. Serialized in custom portion of streamer to avoid forward compat issues unless nee...
Definition: TBasket.h:67
Bool_t fOwnsCompressedBuffer
! Whether or not we own the compressed buffer.
Definition: TBasket.h:68
Int_t * GetDisplacement() const
Definition: TBasket.h:121
virtual void AdjustSize(Int_t newsize)
Increase the size of the current fBuffer up to newsize.
Definition: TBasket.cxx:123
Int_t fLastWriteBufferSize[3]
! Size of the buffer last three buffers we wrote it to disk
Definition: TBasket.h:75
Int_t GetLast() const
Definition: TBasket.h:129
Int_t ReadBasketBuffersUncompressedCase()
By-passing buffer unzipping has been requested and is possible (only 1 entry in this basket)...
Definition: TBasket.cxx:354
Int_t GetEntryPointer(Int_t Entry)
Get pointer to buffer for internal entry.
Definition: TBasket.cxx:226
Manages buffers for branches of a Tree.
Definition: TBasket.h:34
TBuffer * fCompressedBufferRef
! Compressed buffer.
Definition: TBasket.h:74
Int_t fNevBufSize
Length in Int_t of fEntryOffset OR fixed length of each entry if fEntryOffset is null! ...
Definition: TBasket.h:63
const Bool_t kFALSE
Definition: RtypesCore.h:88
void AdoptBuffer(TBuffer *user_buffer)
Adopt a buffer from an external entity.
Definition: TBasket.cxx:717
Describe directory structure in memory.
Definition: TDirectory.h:34
unsigned long long ULong64_t
Definition: RtypesCore.h:70
void DisownBuffer()
Disown all references to the internal buffer - some other object likely now owns it.
Definition: TBasket.cxx:709
virtual ~TBasket()
Basket destructor.
Definition: TBasket.cxx:105
TBasket & operator=(const TBasket &)
TBasket objects are not copiable.
char Char_t
Definition: RtypesCore.h:29
Bool_t fResetAllocation
! True if last reset re-allocated the memory
Definition: TBasket.h:76
Int_t GetNevBuf() const
Definition: TBasket.h:127
virtual void DeleteEntryOffset()
Delete fEntryOffset array.
Definition: TBasket.cxx:160
virtual Int_t DropBuffers()
Drop buffers of this basket if it is not the current basket.
Definition: TBasket.cxx:169
virtual void PrepareBasket(Long64_t)
Definition: TBasket.h:131
Definition: file.py:1
Int_t fLast
Pointer to last used byte in basket.
Definition: TBasket.h:65
Int_t * GetCalculatedEntryOffset()
Calculates the entry offset array, if possible.
Definition: TBasket.cxx:191
Int_t GetBufferSize() const
Definition: TBasket.h:120
Definition: tree.py:1
A TTree represents a columnar dataset.
Definition: TTree.h:72
Long64_t CopyTo(TFile *to)
Copy the basket of this branch onto the file to.
Definition: TBasket.cxx:142
unsigned char UChar_t
Definition: RtypesCore.h:34
void SetNevBufSize(Int_t n)
Definition: TBasket.h:147
Int_t ReadBasketBuffersUnzip(char *, Int_t, Bool_t, TFile *)
We always create the TBuffer for the basket but it hold the buffer from the cache.
Definition: TBasket.cxx:376
A TTree is a list of TBranches.
Definition: TBranch.h:90
const Int_t n
Definition: legend1.C:16
TBasket()
Default contructor.
Definition: TBasket.cxx:48
virtual void SetWriteMode()
Set write mode of basket.
Definition: TBasket.cxx:857
char name[80]
Definition: TGX11.cxx:109
EUnsupportedIOBits
Definition: TBasket.h:107
Int_t LoadBasketBuffers(Long64_t pos, Int_t len, TFile *file, TTree *tree=0)
Load basket buffers in memory without unziping.
Definition: TBasket.cxx:241
virtual void MoveEntries(Int_t dentries)
Remove the first dentries of this basket, moving entries at dentries to the start of the buffer...
Definition: TBasket.cxx:306