Warning, file /include/root/TTreeFormula.h was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef ROOT_TTreeFormula
0014 #define ROOT_TTreeFormula
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include "v5/TFormula.h"
0027
0028 #include "TLeaf.h"
0029
0030 #include "TObjArray.h"
0031
0032 #include <string>
0033 #include <vector>
0034
0035 #ifdef R__OLDHPACC
0036 namespace std {
0037 using ::string;
0038 using ::vector;
0039 }
0040 #endif
0041
0042 const Int_t kMAXCODES = kMAXFOUND;
0043 const Int_t kMAXFORMDIM = 5;
0044
0045 class TTree;
0046 class TArrayI;
0047 class TMethodCall;
0048 class TLeafObject;
0049 class TDataMember;
0050 class TStreamerElement;
0051 class TFormLeafInfoMultiVarDim;
0052 class TFormLeafInfo;
0053 class TBranchElement;
0054 class TAxis;
0055 class TTreeFormulaManager;
0056
0057
0058 class TTreeFormula : public ROOT::v5::TFormula {
0059
0060 friend class TTreeFormulaManager;
0061
0062 protected:
0063 enum EStatusBits {
0064 kIsCharacter = BIT(12),
0065 kMissingLeaf = BIT(15),
0066 kIsInteger = BIT(17),
0067 kNeedEntries = BIT(18)
0068 };
0069 enum {
0070 kDirect, kDataMember, kMethod,
0071 kIndexOfEntry, kEntries, kLength, kIteration, kLengthFunc, kSum, kEntryList,
0072 kTreeMember,
0073 kIndexOfLocalEntry,
0074 kMin, kMax,
0075 kLocalEntries
0076
0077 };
0078 enum {
0079 kAlias = 200,
0080 kAliasString = 201,
0081 kAlternate = 202,
0082 kAlternateString = 203,
0083 kMinIf = 204,
0084 kMaxIf = 205
0085 };
0086
0087
0088
0089 struct RealInstanceCache {
0090 Int_t fInstanceCache = 0;
0091 Int_t fLocalIndexCache = 0;
0092 Int_t fVirtAccumCache = 0;
0093 };
0094
0095 TTree *fTree;
0096 Int_t fCodes[kMAXCODES];
0097 Int_t fNdata[kMAXCODES];
0098 Int_t fNcodes;
0099 bool fHasCast;
0100 Int_t fMultiplicity;
0101 Int_t fNindex;
0102 Int_t *fLookupType;
0103 TObjArray fLeaves;
0104 TObjArray fDataMembers;
0105 TObjArray fMethods;
0106 TObjArray fExternalCuts;
0107 TObjArray fAliases;
0108 TObjArray fLeafNames;
0109 TObjArray fBranches;
0110 bool fQuickLoad;
0111 bool fNeedLoading;
0112
0113 Int_t fNdimensions[kMAXCODES];
0114 Int_t fFixedSizes[kMAXCODES][kMAXFORMDIM];
0115 UChar_t fHasMultipleVarDim[kMAXCODES];
0116
0117
0118 Int_t fCumulSizes[kMAXCODES][kMAXFORMDIM];
0119 Int_t fIndexes[kMAXCODES][kMAXFORMDIM];
0120 TTreeFormula *fVarIndexes[kMAXCODES][kMAXFORMDIM];
0121
0122 TAxis *fAxis;
0123 bool fDidBooleanOptimization;
0124 TTreeFormulaManager *fManager;
0125
0126
0127 TList *fDimensionSetup;
0128 std::vector<std::string> fAliasesUsed;
0129
0130 LongDouble_t* fConstLD;
0131
0132 RealInstanceCache fRealInstanceCache;
0133
0134 TTreeFormula(const char *name, const char *formula, TTree *tree, const std::vector<std::string>& aliases);
0135 void Init(const char *name, const char *formula);
0136 bool BranchHasMethod(TLeaf* leaf, TBranch* branch, const char* method,const char* params, Long64_t readentry) const;
0137 Int_t DefineAlternate(const char* expression);
0138 void DefineDimensions(Int_t code, Int_t size, TFormLeafInfoMultiVarDim * info, Int_t& virt_dim);
0139 Int_t FindLeafForExpression(const char* expression, TLeaf *&leaf, TString &leftover, bool &final, UInt_t ¶n_level, TObjArray &castqueue, std::vector<std::string>& aliasUsed, bool &useLeafCollectionObject, const char *fullExpression);
0140 TLeaf* GetLeafWithDatamember(const char* topchoice, const char* nextchice, Long64_t readentry) const;
0141 Int_t ParseWithLeaf(TLeaf *leaf, const char *expression, bool final, UInt_t paran_level, TObjArray &castqueue, bool useLeafCollectionObject, const char *fullExpression);
0142 Int_t RegisterDimensions(Int_t code, Int_t size, TFormLeafInfoMultiVarDim *multidim = nullptr);
0143 Int_t RegisterDimensions(Int_t code, TBranchElement *branch);
0144 Int_t RegisterDimensions(Int_t code, TFormLeafInfo *info, TFormLeafInfo *maininfo, bool useCollectionObject);
0145 Int_t RegisterDimensions(Int_t code, TLeaf *leaf);
0146 Int_t RegisterDimensions(const char *size, Int_t code);
0147
0148 virtual Double_t GetValueFromMethod(Int_t i, TLeaf *leaf) const;
0149 virtual void* GetValuePointerFromMethod(Int_t i, TLeaf *leaf) const;
0150 Int_t GetRealInstance(Int_t instance, Int_t codeindex);
0151
0152 void LoadBranches();
0153 bool LoadCurrentDim();
0154 void ResetDimensions();
0155
0156 virtual TClass* EvalClass(Int_t oper) const;
0157 virtual bool IsLeafInteger(Int_t code) const;
0158 bool IsString(Int_t oper) const override;
0159 virtual bool IsLeafString(Int_t code) const;
0160 virtual bool SwitchToFormLeafInfo(Int_t code);
0161 bool StringToNumber(Int_t code) override;
0162
0163 void Convert(UInt_t fromVersion) override;
0164 Bool_t AnalyzePrimitive(TString &chain, TObjArray &args, Int_t &err, Int_t offset) override;
0165 void Optimize() override;
0166
0167 private:
0168
0169 TTreeFormula(const TTreeFormula&) = delete;
0170 TTreeFormula& operator=(const TTreeFormula&) = delete;
0171
0172 template<typename T> T GetConstant(Int_t k);
0173
0174 public:
0175 TTreeFormula() = delete;
0176 TTreeFormula(TRootIOCtor*);
0177 TTreeFormula(const char *name,const char *formula, TTree *tree);
0178 ~TTreeFormula() override;
0179
0180 Int_t DefinedVariable(TString &variable, Int_t &action) override;
0181 virtual TClass* EvalClass() const;
0182
0183 template<typename T> T EvalInstance(Int_t i=0, const char *stringStack[] = nullptr);
0184
0185 virtual Double_t EvalInstance(Int_t i=0, const char *stringStack[] = nullptr) {return EvalInstance<Double_t>(i, stringStack); }
0186
0187 virtual Long64_t EvalInstance64(Int_t i=0, const char *stringStack[] = nullptr) {return EvalInstance<Long64_t>(i, stringStack); }
0188
0189 virtual LongDouble_t EvalInstanceLD(Int_t i=0, const char *stringStack[] = nullptr) {return EvalInstance<LongDouble_t>(i, stringStack); }
0190
0191 virtual const char *EvalStringInstance(Int_t i=0);
0192 virtual void* EvalObject(Int_t i=0);
0193
0194 TFormLeafInfo *GetLeafInfo(Int_t code) const;
0195 TTreeFormulaManager*GetManager() const { return fManager; }
0196 TMethodCall *GetMethodCall(Int_t code) const;
0197 virtual Int_t GetMultiplicity() const {return fMultiplicity;}
0198 virtual TLeaf *GetLeaf(Int_t n) const;
0199 virtual Int_t GetNcodes() const {return fNcodes;}
0200 virtual Int_t GetNdata();
0201
0202
0203
0204
0205
0206 virtual bool IsInteger(bool fast=true) const;
0207 bool IsQuickLoad() const { return fQuickLoad; }
0208 virtual bool IsString() const;
0209 bool Notify() override { UpdateFormulaLeaves(); return true; }
0210 virtual char *PrintValue(Int_t mode=0) const;
0211 virtual char *PrintValue(Int_t mode, Int_t instance, const char *decform = "9.9") const;
0212 virtual void SetAxis(TAxis *axis = nullptr);
0213 void SetQuickLoad(bool quick) { fQuickLoad = quick; }
0214 virtual void SetTree(TTree *tree) {fTree = tree;}
0215 virtual void ResetLoading();
0216 virtual TTree* GetTree() const {return fTree;}
0217 virtual void UpdateFormulaLeaves();
0218
0219 ClassDefOverride(TTreeFormula, 10);
0220 };
0221
0222 #endif