28 #ifndef ROOT_TMVA_PDEFoam
29 #define ROOT_TMVA_PDEFoam
47 class PDEFoamDensityBase;
48 class PDEFoamKernelBase;
52 enum EDTSeparation { kFoam, kGiniIndex, kMisClassificationError,
53 kCrossEntropy, kGiniIndexWithLaplace, kSdivSqrtSplusB };
56 enum EFoamType { kSeparate, kDiscr, kMonoTarget, kMultiTarget, kMultiClass };
67 enum ECellValue { kValue, kValueError, kValueDensity, kMeanValue,
68 kRms, kRmsOvMean, kCellVolume };
77 class PDEFoam :
public TObject {
110 Bool_t fFillFoamWithOrigWeights;
111 EDTSeparation fDTSeparation;
113 PDEFoamDensityBase *fDistr;
115 TObjArray *fVariableNames;
116 mutable MsgLogger* fLogger;
125 void OutputGrow(Bool_t finished =
false );
131 Int_t CellFill(Int_t, PDEFoamCell*);
132 virtual void Explore(PDEFoamCell *Cell);
133 void Varedu(Double_t [], Int_t&, Double_t&,Double_t&);
137 Int_t Divide(PDEFoamCell *);
138 Double_t Eval(Double_t *xRand, Double_t &event_density);
143 Double_t GetCellElement(
const PDEFoamCell *cell, UInt_t i)
const;
144 void SetCellElement(PDEFoamCell *cell, UInt_t i, Double_t value);
147 virtual Bool_t CellValueIsUndefined( PDEFoamCell* );
150 PDEFoamCell* FindCell(
const std::vector<Float_t>&)
const ;
151 std::vector<TMVA::PDEFoamCell*> FindCells(
const std::vector<Float_t>&)
const;
152 std::vector<TMVA::PDEFoamCell*> FindCells(
const std::map<Int_t,Float_t>&)
const;
153 void FindCells(
const std::map<Int_t, Float_t>&, PDEFoamCell*, std::vector<PDEFoamCell*> &)
const;
156 PDEFoamDensityBase* GetDistr()
const { assert(fDistr);
return fDistr; }
159 template<
typename T> T Sqr(T x)
const {
return x*x; }
161 PDEFoam(
const PDEFoam&);
166 PDEFoam(
const TString&);
172 void FillBinarySearchTree(
const Event* ev );
176 virtual void FillFoamCells(
const Event* ev, Float_t wt);
179 void ResetCellElements();
182 virtual void Finalize() {}
186 void SetDim(Int_t kDim);
187 void SetnCells(Long_t nCells){fNCells =nCells;}
188 void SetnSampl(Long_t nSampl){fNSampl =nSampl;}
189 void SetnBin(Int_t nBin){fNBin = nBin;}
190 void SetEvPerBin(Int_t EvPerBin){fEvPerBin =EvPerBin;}
191 void SetInhiDiv(Int_t, Int_t );
192 void SetDensity(PDEFoamDensityBase *dens) { fDistr = dens; }
195 Int_t GetTotDim()
const {
return fDim; }
196 TString GetFoamName()
const {
return fName; }
197 UInt_t GetNActiveCells()
const {
return fNoAct;}
198 UInt_t GetNInActiveCells()
const {
return GetNCells()-GetNActiveCells();}
199 UInt_t GetNCells()
const {
return fNCells;}
200 PDEFoamCell* GetRootCell()
const {
return fCells[0];}
203 void SetNmin(UInt_t val) { fNmin=val; }
204 UInt_t GetNmin() {
return fNmin; }
205 void SetMaxDepth(UInt_t maxdepth) { fMaxDepth = maxdepth; }
206 UInt_t GetMaxDepth()
const {
return fMaxDepth; }
209 void SetXmin(Int_t idim, Double_t wmin);
210 void SetXmax(Int_t idim, Double_t wmax);
211 Double_t GetXmin(Int_t idim)
const {
return fXmin[idim];}
212 Double_t GetXmax(Int_t idim)
const {
return fXmax[idim];}
215 void AddVariableName(
const char *s) { AddVariableName(
new TObjString(s)); }
216 void AddVariableName(TObjString *s) { fVariableNames->Add(s); }
217 TObjString* GetVariableName(Int_t idx) {
return dynamic_cast<TObjString*
>(fVariableNames->At(idx));}
221 void DeleteBinarySearchTree();
226 Float_t VarTransform(Int_t idim, Float_t x)
const;
227 std::vector<Float_t> VarTransform(
const std::vector<Float_t> &invec)
const;
228 Float_t VarTransformInvers(Int_t idim, Float_t x)
const;
229 std::vector<Float_t> VarTransformInvers(
const std::vector<Float_t> &invec)
const;
233 void CheckAll(Int_t);
234 void PrintCell(Long_t iCell=0);
238 MsgLogger& Log()
const {
return *fLogger; }
243 virtual TH2D* Project2(Int_t idim1, Int_t idim2, ECellValue cell_value=kValue,
244 PDEFoamKernelBase *kernel=NULL, UInt_t nbin=50);
247 TH1D* Draw1Dim(ECellValue cell_value, Int_t nbin, PDEFoamKernelBase *kernel=NULL);
250 void RootPlot2dim(
const TString& filename, TString opt,
251 Bool_t createCanvas = kTRUE, Bool_t colors = kTRUE );
256 virtual Float_t GetCellValue(
const std::vector<Float_t>& xvec, ECellValue cv, PDEFoamKernelBase* );
259 virtual std::vector<Float_t> GetCellValue(
const std::map<Int_t,Float_t>& xvec, ECellValue cv );
262 virtual Float_t GetCellValue(
const PDEFoamCell* cell, ECellValue cv );
265 friend class PDEFoamKernelBase;
266 friend class PDEFoamKernelTrivial;
267 friend class PDEFoamKernelLinN;
268 friend class PDEFoamKernelGauss;
279 inline Float_t TMVA::PDEFoam::VarTransform(Int_t idim, Float_t x)
const
282 return (x-fXmin[idim])/(fXmax[idim]-fXmin[idim]);
286 inline std::vector<Float_t> TMVA::PDEFoam::VarTransform(
const std::vector<Float_t> &invec)
const
289 std::vector<Float_t> outvec;
290 for(UInt_t i=0; i<invec.size(); i++)
291 outvec.push_back(VarTransform(i, invec.at(i)));
296 inline Float_t TMVA::PDEFoam::VarTransformInvers(Int_t idim, Float_t x)
const
299 return x*(fXmax[idim]-fXmin[idim]) + fXmin[idim];
303 inline std::vector<Float_t> TMVA::PDEFoam::VarTransformInvers(
const std::vector<Float_t> &invec)
const
306 std::vector<Float_t> outvec;
307 for(UInt_t i=0; i<invec.size(); i++)
308 outvec.push_back(VarTransformInvers(i, invec.at(i)));