13 #ifndef ROOT_TTreeFormula
14 #define ROOT_TTreeFormula
42 const Int_t kMAXCODES = kMAXFOUND;
43 const Int_t kMAXFORMDIM = 5;
50 class TStreamerElement;
51 class TFormLeafInfoMultiVarDim;
55 class TTreeFormulaManager;
58 class TTreeFormula :
public ROOT::v5::TFormula {
60 friend class TTreeFormulaManager;
64 kIsCharacter = BIT(12),
65 kMissingLeaf = BIT(15),
67 kNeedEntries = BIT(18)
70 kDirect, kDataMember, kMethod,
71 kIndexOfEntry, kEntries, kLength, kIteration, kLengthFunc, kSum, kEntryList,
82 kAlternateString = 203,
89 struct RealInstanceCache {
90 Int_t fInstanceCache = 0;
91 Int_t fLocalIndexCache = 0;
92 Int_t fVirtAccumCache = 0;
96 Int_t fCodes[kMAXCODES];
97 Int_t fNdata[kMAXCODES];
104 TObjArray fDataMembers;
106 TObjArray fExternalCuts;
108 TObjArray fLeafNames;
113 Int_t fNdimensions[kMAXCODES];
114 Int_t fFixedSizes[kMAXCODES][kMAXFORMDIM];
115 UChar_t fHasMultipleVarDim[kMAXCODES];
118 Int_t fCumulSizes[kMAXCODES][kMAXFORMDIM];
119 Int_t fIndexes[kMAXCODES][kMAXFORMDIM];
120 TTreeFormula *fVarIndexes[kMAXCODES][kMAXFORMDIM];
123 Bool_t fDidBooleanOptimization;
124 TTreeFormulaManager *fManager;
127 TList *fDimensionSetup;
128 std::vector<std::string> fAliasesUsed;
130 LongDouble_t* fConstLD;
132 RealInstanceCache fRealInstanceCache;
134 TTreeFormula(
const char *name,
const char *formula, TTree *tree,
const std::vector<std::string>& aliases);
135 void Init(
const char *name,
const char *formula);
136 Bool_t BranchHasMethod(TLeaf* leaf, TBranch* branch,
const char* method,
const char* params, Long64_t readentry)
const;
137 Int_t DefineAlternate(
const char* expression);
138 void DefineDimensions(Int_t code, Int_t size, TFormLeafInfoMultiVarDim * info, Int_t& virt_dim);
139 Int_t FindLeafForExpression(
const char* expression, TLeaf *&leaf, TString &leftover, Bool_t &
final, UInt_t ¶n_level, TObjArray &castqueue, std::vector<std::string>& aliasUsed, Bool_t &useLeafCollectionObject,
const char *fullExpression);
140 TLeaf* GetLeafWithDatamember(
const char* topchoice,
const char* nextchice, Long64_t readentry)
const;
141 Int_t ParseWithLeaf(TLeaf *leaf,
const char *expression, Bool_t
final, UInt_t paran_level, TObjArray &castqueue, Bool_t useLeafCollectionObject,
const char *fullExpression);
142 Int_t RegisterDimensions(Int_t code, Int_t size, TFormLeafInfoMultiVarDim * multidim = 0);
143 Int_t RegisterDimensions(Int_t code, TBranchElement *branch);
144 Int_t RegisterDimensions(Int_t code, TFormLeafInfo *info, TFormLeafInfo *maininfo, Bool_t useCollectionObject);
145 Int_t RegisterDimensions(Int_t code, TLeaf *leaf);
146 Int_t RegisterDimensions(
const char *size, Int_t code);
148 virtual Double_t GetValueFromMethod(Int_t i, TLeaf *leaf)
const;
149 virtual void* GetValuePointerFromMethod(Int_t i, TLeaf *leaf)
const;
150 Int_t GetRealInstance(Int_t instance, Int_t codeindex);
153 Bool_t LoadCurrentDim();
154 void ResetDimensions();
156 virtual TClass* EvalClass(Int_t oper)
const;
157 virtual Bool_t IsLeafInteger(Int_t code)
const;
158 virtual Bool_t IsString(Int_t oper)
const;
159 virtual Bool_t IsLeafString(Int_t code)
const;
160 virtual Bool_t SwitchToFormLeafInfo(Int_t code);
161 virtual Bool_t StringToNumber(Int_t code);
163 void Convert(UInt_t fromVersion);
167 TTreeFormula(
const TTreeFormula&) =
delete;
168 TTreeFormula& operator=(
const TTreeFormula&) =
delete;
170 template<
typename T> T GetConstant(Int_t k);
174 TTreeFormula(
const char *name,
const char *formula, TTree *tree);
175 virtual ~TTreeFormula();
177 virtual Int_t DefinedVariable(TString &variable, Int_t &action);
178 virtual TClass* EvalClass()
const;
180 template<
typename T> T EvalInstance(Int_t i=0,
const char *stringStack[]=0);
181 virtual Double_t EvalInstance(Int_t i=0,
const char *stringStack[]=0) {
return EvalInstance<Double_t>(i, stringStack); }
182 virtual Long64_t EvalInstance64(Int_t i=0,
const char *stringStack[]=0) {
return EvalInstance<Long64_t>(i, stringStack); }
183 virtual LongDouble_t EvalInstanceLD(Int_t i=0,
const char *stringStack[]=0) {
return EvalInstance<LongDouble_t>(i, stringStack); }
185 virtual const char *EvalStringInstance(Int_t i=0);
186 virtual void* EvalObject(Int_t i=0);
188 TFormLeafInfo *GetLeafInfo(Int_t code)
const;
189 TTreeFormulaManager*GetManager()
const {
return fManager; }
190 TMethodCall *GetMethodCall(Int_t code)
const;
191 virtual Int_t GetMultiplicity()
const {
return fMultiplicity;}
192 virtual TLeaf *GetLeaf(Int_t n)
const;
193 virtual Int_t GetNcodes()
const {
return fNcodes;}
194 virtual Int_t GetNdata();
200 virtual Bool_t IsInteger(Bool_t fast=kTRUE)
const;
201 Bool_t IsQuickLoad()
const {
return fQuickLoad; }
202 virtual Bool_t IsString()
const;
203 virtual Bool_t Notify() { UpdateFormulaLeaves();
return kTRUE; }
204 virtual char *PrintValue(Int_t mode=0)
const;
205 virtual char *PrintValue(Int_t mode, Int_t instance,
const char *decform =
"9.9")
const;
206 virtual void SetAxis(TAxis *axis=0);
207 void SetQuickLoad(Bool_t quick) { fQuickLoad = quick; }
208 virtual void SetTree(TTree *tree) {fTree = tree;}
209 virtual void ResetLoading();
210 virtual TTree* GetTree()
const {
return fTree;}
211 virtual void UpdateFormulaLeaves();
213 ClassDef(TTreeFormula, 10);