ROOT  6.06/08
Reference Guide
TBranchElement.h
Go to the documentation of this file.
1 // @(#)root/tree:$Id$
2 // Author: Rene Brun 14/01/2001
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_TBranchElement
13 #define ROOT_TBranchElement
14 
15 
16 //////////////////////////////////////////////////////////////////////////
17 // //
18 // TBranchElement //
19 // //
20 // A Branch for the case of an object. //
21 //////////////////////////////////////////////////////////////////////////
22 
23 
24 #ifndef ROOT_TBranch
25 #include "TBranch.h"
26 #endif
27 
28 #ifndef ROOT_TClassRef
29 #include "TClassRef.h"
30 #endif
31 
32 #ifndef ROOT_TTree
33 #include "TTree.h"
34 #endif
35 
36 #ifndef ROOT_TError
37 #include "TError.h"
38 #endif
39 
40 #include <vector>
41 
42 class TFolder;
43 class TStreamerInfo;
47 class TVirtualArray;
48 
49 namespace TStreamerInfoActions { class TActionSequence; }
50 
51 
52 class TBranchElement : public TBranch {
53 
54 // Friends
55  friend class TTreeCloner;
56 
57 // Types
58 protected:
59  enum {
60  kBranchFolder = BIT(14),
61  kDeleteObject = BIT(16), // We are the owner of fObject.
62  kCache = BIT(18), // Need to pushd/pop fOnfileObject.
63  kOwnOnfileObj = BIT(19), // We are the owner of fOnfileObject.
64  kAddressSet = BIT(20), // The addressing set have been called for this branch
65  kMakeClass = BIT(21), // This branch has been switched to using the MakeClass Mode
66  kDecomposedObj= BIT(21) // More explicit alias for kMakeClass.
67  };
68 
69 // Data Members
70 protected:
71  TString fClassName; // Class name of referenced object
72  TString fParentName; // Name of parent class
73  TString fClonesName; // Name of class in TClonesArray (if any)
74  TVirtualCollectionProxy *fCollProxy; //! collection interface (if any)
75  UInt_t fCheckSum; // CheckSum of class
76  Version_t fClassVersion; // Version number of class
77  Int_t fID; // element serial number in fInfo
78  Int_t fType; // branch type
79  Int_t fStreamerType; // branch streamer type
80  Int_t fMaximum; // Maximum entries for a TClonesArray or variable array
81  Int_t fSTLtype; //! STL container type
82  Int_t fNdata; //! Number of data in this branch
83  TBranchElement *fBranchCount; // pointer to primary branchcount branch
84  TBranchElement *fBranchCount2; // pointer to secondary branchcount branch
85  TStreamerInfo *fInfo; //! Pointer to StreamerInfo
86  char *fObject; //! Pointer to object at *fAddress
87  TVirtualArray *fOnfileObject; //! Place holder for the onfile representation of data members.
88  Bool_t fInit; //! Initialization flag for branch assignment
89  Bool_t fInitOffsets; //! Initialization flag to not endlessly recalculate offsets
90  TClassRef fTargetClass; //! Reference to the target in-memory class
91  TClassRef fCurrentClass; //! Reference to current (transient) class definition
92  TClassRef fParentClass; //! Reference to class definition in fParentName
93  TClassRef fBranchClass; //! Reference to class definition in fClassName
94  TClassRef fClonesClass; //! Reference to class definition in fClonesName
95  Int_t *fBranchOffset; //! Sub-Branch offsets with respect to current transient class
96  Int_t fBranchID; //! ID number assigned by a TRefTable.
97  std::vector<Int_t> fIDs; //! List of the serial number of all the StreamerInfo to be used.
98  TStreamerInfoActions::TActionSequence *fReadActionSequence; //! Set of actions to be executed to extract the data from the basket.
99  TStreamerInfoActions::TActionSequence *fFillActionSequence; //! Set of actions to be executed to write the data to the basket.
100  TVirtualCollectionIterators *fIterators; //! holds the iterators when the branch is of fType==4.
101  TVirtualCollectionIterators *fWriteIterators;//! holds the read (non-staging) iterators when the branch is of fType==4 and associative containers.
102  TVirtualCollectionPtrIterators *fPtrIterators; //! holds the iterators when the branch is of fType==4 and it is a split collection of pointers.
103 
104 // Not implemented
105 private:
106  TBranchElement(const TBranchElement&); // not implemented
107  TBranchElement& operator=(const TBranchElement&); // not implemented
108 
109  static void SwitchContainer(TObjArray *);
110 
111 // Implementation use only functions.
112 protected:
113  void BuildTitle(const char* name);
114  virtual void InitializeOffsets();
115  virtual void InitInfo();
116  Bool_t IsMissingCollection() const;
117  TClass *GetParentClass(); // Class referenced by fParentName
118  TStreamerInfo *GetInfoImp() const;
119  void ReleaseObject();
120  void SetBranchCount(TBranchElement* bre);
121  void SetBranchCount2(TBranchElement* bre) { fBranchCount2 = bre; }
122  Int_t Unroll(const char* name, TClass* cltop, TClass* cl, char* ptr, Int_t basketsize, Int_t splitlevel, Int_t btype);
123  inline void ValidateAddress() const;
124 
125  void Init(TTree *tree, TBranch *parent, const char* name, TStreamerInfo* sinfo, Int_t id, char* pointer, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t btype = 0);
126  void Init(TTree *tree, TBranch *parent, const char* name, TClonesArray* clones, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
127  void Init(TTree *tree, TBranch *parent, const char* name, TVirtualCollectionProxy* cont, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
128 
129  void ReadLeavesImpl(TBuffer& b);
130  void ReadLeavesMakeClass(TBuffer& b);
131  void ReadLeavesCollection(TBuffer& b);
132  void ReadLeavesCollectionSplitPtrMember(TBuffer& b);
133  void ReadLeavesCollectionSplitVectorPtrMember(TBuffer& b);
134  void ReadLeavesCollectionMember(TBuffer& b);
135  void ReadLeavesClones(TBuffer& b);
136  void ReadLeavesClonesMember(TBuffer& b);
137  void ReadLeavesCustomStreamer(TBuffer& b);
138  void ReadLeavesMember(TBuffer& b);
139  void ReadLeavesMemberBranchCount(TBuffer& b);
140  void ReadLeavesMemberCounter(TBuffer& b);
141  void SetReadLeavesPtr();
142  void SetReadActionSequence();
143  void SetupAddressesImpl();
144 
145  void FillLeavesImpl(TBuffer& b);
146  void FillLeavesMakeClass(TBuffer& b);
147  void FillLeavesCollection(TBuffer& b);
148  void FillLeavesCollectionSplitVectorPtrMember(TBuffer& b);
149  void FillLeavesCollectionSplitPtrMember(TBuffer& b);
150  void FillLeavesCollectionMember(TBuffer& b);
151  void FillLeavesAssociativeCollectionMember(TBuffer& b);
152  void FillLeavesClones(TBuffer& b);
153  void FillLeavesClonesMember(TBuffer& b);
154  void FillLeavesCustomStreamer(TBuffer& b);
155  void FillLeavesMemberBranchCount(TBuffer& b);
156  void FillLeavesMemberCounter(TBuffer& b);
157  void FillLeavesMember(TBuffer& b);
158  void SetFillLeavesPtr();
159  void SetFillActionSequence();
160 // Public Interface.
161 public:
162  TBranchElement();
163  TBranchElement(TTree *tree, const char* name, TStreamerInfo* sinfo, Int_t id, char* pointer, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t btype = 0);
164  TBranchElement(TTree *tree, const char* name, TClonesArray* clones, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
165  TBranchElement(TTree *tree, const char* name, TVirtualCollectionProxy* cont, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
166  TBranchElement(TBranch *parent, const char* name, TStreamerInfo* sinfo, Int_t id, char* pointer, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t btype = 0);
167  TBranchElement(TBranch *parent, const char* name, TClonesArray* clones, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
168  TBranchElement(TBranch *parent, const char* name, TVirtualCollectionProxy* cont, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
169 
170  virtual ~TBranchElement();
171 
172  virtual void Browse(TBrowser* b);
173  virtual Int_t Fill();
174  virtual TBranch *FindBranch(const char *name);
175  virtual TLeaf *FindLeaf(const char *name);
176  virtual char *GetAddress() const;
177  TBranchElement *GetBranchCount() const { return fBranchCount; }
178  TBranchElement *GetBranchCount2() const { return fBranchCount2; }
179  Int_t *GetBranchOffset() const { return fBranchOffset; }
180  UInt_t GetCheckSum() { return fCheckSum; }
181  virtual const char *GetClassName() const { return fClassName.Data(); }
182  virtual TClass *GetClass() const { return fBranchClass; }
183  virtual const char *GetClonesName() const { return fClonesName.Data(); }
184  TVirtualCollectionProxy *GetCollectionProxy();
185  TClass *GetCurrentClass(); // Class referenced by transient description
186  virtual Int_t GetEntry(Long64_t entry = 0, Int_t getall = 0);
187  virtual Int_t GetExpectedType(TClass *&clptr,EDataType &type);
188  const char *GetIconName() const;
189  Int_t GetID() const { return fID; }
190  TStreamerInfo *GetInfo() const;
191  Bool_t GetMakeClass() const;
192  char *GetObject() const;
193  virtual const char *GetParentName() const { return fParentName.Data(); }
194  virtual Int_t GetMaximum() const;
195  Int_t GetNdata() const { return fNdata; }
196  Int_t GetType() const { return fType; }
197  Int_t GetStreamerType() const { return fStreamerType; }
198  virtual TClass *GetTargetClass() { return fTargetClass; }
199  virtual const char *GetTypeName() const;
200  Double_t GetValue(Int_t i, Int_t len, Bool_t subarr = kFALSE) const { return GetTypedValue<Double_t>(i, len, subarr); }
201  template<typename T > T GetTypedValue(Int_t i, Int_t len, Bool_t subarr = kFALSE) const;
202  virtual void *GetValuePointer() const;
203  Int_t GetClassVersion() { return fClassVersion; }
204  Bool_t IsBranchFolder() const { return TestBit(kBranchFolder); }
205  Bool_t IsFolder() const;
206  virtual Bool_t IsObjectOwner() const { return TestBit(kDeleteObject); }
207  virtual Bool_t Notify() { if (fAddress) { ResetAddress(); } return 1; }
208  virtual void Print(Option_t* option = "") const;
209  void PrintValue(Int_t i) const;
210  virtual void Reset(Option_t* option = "");
211  virtual void ResetAfterMerge(TFileMergeInfo *);
212  virtual void ResetAddress();
213  virtual void ResetDeleteObject();
214  virtual void SetAddress(void* addobj);
215  virtual Bool_t SetMakeClass(Bool_t decomposeObj = kTRUE);
216  virtual void SetObject(void *objadd);
217  virtual void SetBasketSize(Int_t buffsize);
218  virtual void SetBranchFolder() { SetBit(kBranchFolder); }
219  virtual void SetClassName(const char* name) { fClassName = name; }
220  virtual void SetOffset(Int_t offset);
221  inline void SetParentClass(TClass* clparent);
222  virtual void SetParentName(const char* name) { fParentName = name; }
223  virtual void SetTargetClass(const char *name);
224  virtual void SetupAddresses();
225  virtual void SetType(Int_t btype) { fType = btype; }
226  virtual void UpdateFile();
227 
229  kLeafNode = 0,
230  kBaseClassNode = 1, // -- We are a base class element.
231  // Note: This does not include an STL container class which is
232  // being used as a base class because the streamer element
233  // in that case is not the base streamer element it is the
234  // STL streamer element.
235  kObjectNode = 2,
236  kClonesNode = 3,
237  kSTLNode = 4,
238  kClonesMemberNode = 31,
239  kSTLMemberNode = 41
240  };
241 
242  ClassDef(TBranchElement,10) // Branch in case of an object
243 };
244 
246 {
247  fParentClass = clparent;
248  fParentName = clparent ? clparent->GetName() : "";
249 }
250 
252 {
253  // Check to see if the user changed the object pointer without telling us.
254 
255  if (fID < 0) {
256  // We are a top-level branch.
257  if (!fTree->GetMakeClass() && fAddress && (*((char**) fAddress) != fObject)) {
258  // The semantics of fAddress and fObject are violated.
259  // Assume the user changed the pointer on us.
260  // Note: The cast is here because we want to be able to
261  // be called from the constant get functions.
262 
263  // FIXME: Disable the check/warning TTree until we add a missing interface.
264  if (TestBit(kDeleteObject)) {
265  // This should never happen!
266  Error("ValidateAddress", "We owned an object whose address changed! our ptr: %p new ptr: %p",
267  (void*)fObject, (void*)*((char**) fAddress));
268  const_cast<TBranchElement*>(this)->ResetBit(kDeleteObject);
269  }
270  const_cast<TBranchElement*>(this)->SetAddress(fAddress);
271  }
272  }
273 }
274 
275 #endif // ROOT_TBranchElement
Describe Streamer information for one class version.
Definition: TStreamerInfo.h:47
TClassRef fTargetClass
Initialization flag to not endlessly recalculate offsets.
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:51
A TLeaf describes individual elements of a TBranch See TBranch structure in TTree.
Definition: TLeaf.h:37
TBranchElement * GetBranchCount2() const
A TFolder object is a collection of objects and folders.
Definition: TFolder.h:32
An array of TObjects.
Definition: TObjArray.h:39
TBranchElement * fBranchCount2
long long Long64_t
Definition: RtypesCore.h:69
Int_t GetType() const
short Version_t
Definition: RtypesCore.h:61
virtual TClass * GetTargetClass()
const char Option_t
Definition: RtypesCore.h:62
Double_t GetValue(Int_t i, Int_t len, Bool_t subarr=kFALSE) const
double T(double x)
Definition: ChebyshevPol.h:34
TString fParentName
Int_t * GetBranchOffset() const
#define BIT(n)
Definition: Rtypes.h:120
Int_t GetNdata() const
Buffer base class used for serializing objects.
Definition: TBuffer.h:40
Basic string class.
Definition: TString.h:137
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kFALSE
Definition: Rtypes.h:92
UInt_t fCheckSum
collection interface (if any)
TStreamerInfoActions::TActionSequence * fFillActionSequence
Set of actions to be executed to extract the data from the basket.
Bool_t fInit
Place holder for the onfile representation of data members.
TBranchElement * GetBranchCount() const
virtual void SetBranchFolder()
Int_t fNdata
STL container type.
TVirtualArray * fOnfileObject
Pointer to object at *fAddress.
#define ClassDef(name, id)
Definition: Rtypes.h:254
TStreamerInfoActions::TActionSequence * fReadActionSequence
List of the serial number of all the StreamerInfo to be used.
void Init(TClassEdit::TInterpreterLookupHelper *helper)
Definition: TClassEdit.cxx:118
Int_t * fBranchOffset
Reference to class definition in fClonesName.
TVirtualCollectionProxy * fCollProxy
Int_t GetID() const
Version_t fClassVersion
TString fClassName
void Error(const char *location, const char *msgfmt,...)
virtual const char * GetClonesName() const
TString fClonesName
Using a TBrowser one can browse all ROOT objects.
Definition: TBrowser.h:41
void SetParentClass(TClass *clparent)
void ValidateAddress() const
Small helper class to generically acquire and release iterators.
Wrapper around an object and giving indirect access to its content even if the object is not of a cla...
Definition: TVirtualArray.h:26
virtual void SetType(Int_t btype)
TClassRef fParentClass
Reference to current (transient) class definition.
TBranchElement * fBranchCount
Number of data in this branch.
unsigned int UInt_t
Definition: RtypesCore.h:42
TClassRef fCurrentClass
Reference to the target in-memory class.
The ROOT global object gROOT contains a list of all defined classes.
Definition: TClass.h:81
TClassRef fBranchClass
Reference to class definition in fParentName.
void Reset(Detail::TBranchProxy *x)
A Branch for the case of an object.
PyObject * fType
void Print(std::ostream &os, const OptionType &opt)
virtual void SetClassName(const char *name)
double Double_t
Definition: RtypesCore.h:55
virtual const char * GetClassName() const
Return the name of the user class whose content is stored in this branch, if any. ...
int type
Definition: TGX11.cxx:120
void SetBranchCount2(TBranchElement *bre)
Int_t fBranchID
Sub-Branch offsets with respect to current transient class.
std::vector< Int_t > fIDs
ID number assigned by a TRefTable.
EDataType
Definition: TDataType.h:30
TClassRef fClonesClass
Reference to class definition in fClassName.
UInt_t GetCheckSum()
Bool_t IsBranchFolder() const
#define name(a, b)
Definition: linkTestLib0.cpp:5
Binding & operator=(OUT(*fun)(void))
Bool_t fInitOffsets
Initialization flag for branch assignment.
TClassRef is used to implement a permanent reference to a TClass object.
Definition: TClassRef.h:33
An array of clone (identical) objects.
Definition: TClonesArray.h:32
Class implementing or helping the various TTree cloning method.
Definition: TTreeCloner.h:40
Int_t GetClassVersion()
TVirtualCollectionIterators * fWriteIterators
holds the iterators when the branch is of fType==4.
virtual TClass * GetClass() const
TVirtualCollectionIterators * fIterators
Set of actions to be executed to write the data to the basket.
virtual const char * GetParentName() const
char * fObject
Pointer to StreamerInfo.
A TTree object has a header with a name and a title.
Definition: TTree.h:94
virtual void SetParentName(const char *name)
A TTree is a list of TBranches.
Definition: TBranch.h:58
const Bool_t kTRUE
Definition: Rtypes.h:91
TVirtualCollectionPtrIterators * fPtrIterators
holds the read (non-staging) iterators when the branch is of fType==4 and associative containers...
virtual Bool_t Notify()
This method must be overridden to handle object notification.
Int_t GetStreamerType() const
virtual Bool_t IsObjectOwner() const
TStreamerInfo * fInfo
const char * Data() const
Definition: TString.h:349