Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
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
30class TFile;
31class TTree;
32class TBranch;
33
34class TBasket : public TKey {
35friend class TBranch;
36
37private:
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
61protected:
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 fHeaderOnly{false}; ///< 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 fOwnsCompressedBuffer{false}; ///<! Whether or not we own the compressed buffer.
69 bool fReadEntryOffset{false}; ///<!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 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 virtual void ReadResetBuffer(Int_t basketnumber);
83
84public:
85 // The IO bits flag is to provide improved forward-compatibility detection.
86 // Any new non-forward compatibility flags related serialization should be
87 // added here. When a new flag is added, set it in the kSupported field;
88 //
89 // The values and names of this (and EUnsupportedIOBits) enum need not be aligned
90 // with the values of the various TIOFeatures enums, as there's a clean separation
91 // between these two interfaces. Practically, it is reasonable to keep them as aligned
92 // as possible in order to avoid confusion.
93 //
94 // If (fIOBits & ~kSupported) is non-zero -- i.e., an unknown IO flag is set
95 // in the fIOBits -- then the zombie flag will be set for this object.
96 //
97 enum class EIOBits : Char_t {
98 // The following to bits are reserved for now; when supported, set
99 // kSupported = kGenerateOffsetMap | kBasketClassMap
101 // kBasketClassMap = BIT(1),
103 };
104 // This enum covers IOBits that are known to this ROOT release but
105 // not supported; provides a mechanism for us to have experimental
106 // changes that are not going go into a supported release.
107 //
108 // (kUnsupported | kSupported) should result in the '|' of all IOBits.
110 // The number of known, defined IOBits.
111 static constexpr int kIOBitCount = 1;
112
113 TBasket();
114 TBasket(TDirectory *motherDir);
115 TBasket(const char *name, const char *title, TBranch *branch);
116 ~TBasket() override;
117
118 virtual void AdjustSize(Int_t newsize);
119 virtual void DeleteEntryOffset();
120 virtual Int_t DropBuffers();
121 TBranch *GetBranch() const {return fBranch;}
125 {
126 return R__likely(fEntryOffset != reinterpret_cast<Int_t *>(-1)) ? fEntryOffset : GetCalculatedEntryOffset();
127 }
129 Int_t GetNevBuf() const {return fNevBuf;}
131 Int_t GetLast() const {return fLast;}
132 virtual void MoveEntries(Int_t dentries);
133 virtual void PrepareBasket(Long64_t /* entry */) {};
136 virtual void WriteReset();
137
138// Time spent reseting basket sizes (typically, at event cluster boundaries), in microseconds
139#ifdef R__TRACK_BASKET_ALLOC_TIME
140 ULong64_t GetResetAllocationTime() const { return fResetAllocationTime; }
141#endif
142 // Count of resets performed of basket size.
144
145 Int_t LoadBasketBuffers(Long64_t pos, Int_t len, TFile *file, TTree *tree = nullptr);
146 Long64_t CopyTo(TFile *to);
147
148 void SetBranch(TBranch *branch) { fBranch = branch; }
150 virtual void SetReadMode();
151 virtual void SetWriteMode();
152 inline void Update(Int_t newlast) { Update(newlast,newlast); };
153 virtual void Update(Int_t newlast, Int_t skipped);
154 virtual Int_t WriteBuffer();
155
156 ClassDefOverride(TBasket, 3); // the TBranch buffers
157};
158
159#endif
#define R__likely(expr)
Definition RConfig.hxx:604
int Int_t
Definition RtypesCore.h:45
unsigned char UChar_t
Definition RtypesCore.h:38
char Char_t
Definition RtypesCore.h:37
long long Long64_t
Definition RtypesCore.h:80
unsigned long long ULong64_t
Definition RtypesCore.h:81
#define BIT(n)
Definition Rtypes.h:85
#define ClassDefOverride(name, id)
Definition Rtypes.h:341
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
char name[80]
Definition TGX11.cxx:110
Manages buffers for branches of a Tree.
Definition TBasket.h:34
Int_t * fEntryOffset
[fNevBuf] Offset of entries in fBuffer(TKey); generated at runtime.
Definition TBasket.h:71
bool GetResetAllocationCount() const
Definition TBasket.h:143
Int_t GetEntryPointer(Int_t Entry)
Get pointer to buffer for internal entry.
Definition TBasket.cxx:230
void AdoptBuffer(TBuffer *user_buffer)
Adopt a buffer from an external entity.
Definition TBasket.cxx:721
bool fHeaderOnly
True when only the basket header must be read/written.
Definition TBasket.h:66
TBranch * fBranch
Pointer to the basket support branch.
Definition TBasket.h:73
Int_t GetNevBufSize() const
Definition TBasket.h:130
Long64_t CopyTo(TFile *to)
Copy the basket of this branch onto the file to.
Definition TBasket.cxx:146
Int_t * GetEntryOffset()
Definition TBasket.h:124
Int_t * GetDisplacement() const
Definition TBasket.h:123
void InitializeCompressedBuffer(Int_t len, TFile *file)
Initialize the compressed buffer; either from the TTree or create a local one.
Definition TBasket.cxx:432
Int_t GetNevBuf() const
Definition TBasket.h:129
UChar_t fNextBufferSizeRecord
! Index into fLastWriteBufferSize of the last buffer written to disk
Definition TBasket.h:77
Int_t ReadBasketBuffersUnzip(char *, Int_t, bool, TFile *)
We always create the TBuffer for the basket but it hold the buffer from the cache.
Definition TBasket.cxx:380
void DisownBuffer()
Disown all references to the internal buffer - some other object likely now owns it.
Definition TBasket.cxx:713
Int_t fLastWriteBufferSize[3]
! Size of the buffer last three buffers we wrote it to disk
Definition TBasket.h:75
EUnsupportedIOBits
Definition TBasket.h:109
void SetBranch(TBranch *branch)
Definition TBasket.h:148
Int_t ReadBasketBuffers(Long64_t pos, Int_t len, TFile *file)
Read basket buffers in memory and cleanup.
Definition TBasket.cxx:464
UChar_t fIOBits
!IO feature flags. Serialized in custom portion of streamer to avoid forward compat issues unless nee...
Definition TBasket.h:67
virtual Int_t DropBuffers()
Drop buffers of this basket if it is not the current basket.
Definition TBasket.cxx:173
virtual void PrepareBasket(Long64_t)
Definition TBasket.h:133
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:310
bool fOwnsCompressedBuffer
! Whether or not we own the compressed buffer.
Definition TBasket.h:68
void SetNevBufSize(Int_t n)
Definition TBasket.h:149
void ResetEntryOffset()
Definition TBasket.cxx:441
static constexpr int kIOBitCount
Definition TBasket.h:111
Int_t GetBufferSize() const
Definition TBasket.h:122
TBranch * GetBranch() const
Definition TBasket.h:121
TBasket()
Default constructor.
Definition TBasket.cxx:47
virtual void AdjustSize(Int_t newsize)
Increase the size of the current fBuffer up to newsize.
Definition TBasket.cxx:127
virtual void SetReadMode()
Set read mode of basket.
Definition TBasket.cxx:925
virtual void SetWriteMode()
Set write mode of basket.
Definition TBasket.cxx:934
Int_t ReadBasketBuffersUncompressedCase()
By-passing buffer unzipping has been requested and is possible (only 1 entry in this basket).
Definition TBasket.cxx:358
Int_t fBufferSize
fBuffer length in bytes
Definition TBasket.h:62
bool fReadEntryOffset
!Set to true if offset array was read from a file.
Definition TBasket.h:69
Int_t ReadBasketBytes(Long64_t pos, TFile *file)
Read basket buffers in memory and cleanup.
Definition TBasket.cxx:698
virtual void ReadResetBuffer(Int_t basketnumber)
Reset the read basket TBuffer memory allocation if needed.
Definition TBasket.cxx:733
bool fResetAllocation
! True if last reset re-allocated the memory
Definition TBasket.h:76
TBasket & operator=(const TBasket &)
TBasket objects are not copiable.
virtual Int_t WriteBuffer()
Write buffer of this basket on the current file.
Definition TBasket.cxx:1131
Int_t LoadBasketBuffers(Long64_t pos, Int_t len, TFile *file, TTree *tree=nullptr)
Load basket buffers in memory without unziping.
Definition TBasket.cxx:245
Int_t GetLast() const
Definition TBasket.h:131
~TBasket() override
Basket destructor.
Definition TBasket.cxx:104
void Update(Int_t newlast)
Definition TBasket.h:152
TBasket(const TBasket &)
TBasket objects are not copiable.
Int_t fNevBufSize
Length in Int_t of fEntryOffset OR fixed length of each entry if fEntryOffset is null!
Definition TBasket.h:63
Int_t fNevBuf
Number of entries in basket.
Definition TBasket.h:64
Int_t * GetCalculatedEntryOffset()
Calculates the entry offset array, if possible.
Definition TBasket.cxx:195
virtual void DeleteEntryOffset()
Delete fEntryOffset array.
Definition TBasket.cxx:164
TBuffer * fCompressedBufferRef
! Compressed buffer.
Definition TBasket.h:74
Int_t fLast
Pointer to last used byte in basket.
Definition TBasket.h:65
Int_t * fDisplacement
![fNevBuf] Displacement of entries in fBuffer(TKey)
Definition TBasket.h:70
bool CanGenerateOffsetArray()
Determine whether we can generate the offset array when this branch is read.
Definition TBasket.cxx:218
virtual void WriteReset()
Reset the write basket to the starting state.
Definition TBasket.cxx:806
A TTree is a list of TBranches.
Definition TBranch.h:93
Buffer base class used for serializing objects.
Definition TBuffer.h:43
Describe directory structure in memory.
Definition TDirectory.h:45
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
Definition TFile.h:53
Book space in a file, create I/O buffers, to fill them, (un)compress them.
Definition TKey.h:28
A TTree represents a columnar dataset.
Definition TTree.h:79
const Int_t n
Definition legend1.C:16