Line data Source code
1 : #ifndef ROOT_TKDInterpolatorBase
2 : #define ROOT_TKDInterpolatorBase
3 :
4 : #ifndef ROOT_Rtypes
5 : #include "Rtypes.h"
6 : #endif
7 :
8 : #ifndef ROOT_TKDNodeInfo
9 : #include "TKDNodeInfo.h"
10 : #endif
11 :
12 : ///////////////////////////////////////////////////////////////
13 : //
14 : // Base non parametric interpolation algorithm.
15 : // The class implements local polynomial regression (LOWESS).
16 : // The user will work with daughter classes which implements
17 : // particular data configurations.
18 : //
19 : ///////////////////////////////////////////////////////////////
20 :
21 : template <typename Value> class TVectorT;
22 : typedef class TVectorT<Double_t> TVectorD;
23 : template <typename Value> class TMatrixT;
24 : typedef class TMatrixT<Double_t> TMatrixD;
25 : template <typename Index, typename Value> class TKDTree;
26 : typedef class TKDTree<Int_t, Float_t> TKDTreeIF;
27 : class TLinearFitter;
28 : class TClonesArray;
29 : class TKDInterpolatorBase
30 : {
31 : public:
32 : enum EKDInterpolatorBase {
33 : kdN = 4 // increase in the number of PDF if fit failled
34 : ,kNhelper = 30 // bucket size in helper kdTree
35 : };
36 : enum EKDInterpolatorBaseBits {
37 : kCOG = 0 // COG interpolation method
38 : ,kSTORE = 1 // Store interpolation results
39 : ,kWEIGHTS = 2 // use weights
40 : };
41 : TKDInterpolatorBase(Int_t size = 0);
42 : virtual ~TKDInterpolatorBase();
43 :
44 : Bool_t Bootstrap();
45 : Double_t Eval(const Double_t *point, Double_t &result, Double_t &error, Bool_t force = kFALSE);
46 : virtual Int_t GetNodeIndex(const Float_t *p) = 0;
47 0 : Float_t GetAlpha() const {return fAlpha;}
48 0 : Int_t GetLambda() const {return fLambda;}
49 0 : Int_t GetSize() const {return fNSize;}
50 : Bool_t GetCOGPoint(Int_t node, Float_t *&coord, Float_t &val, Float_t &error) const;
51 : TKDNodeInfo* GetNodeInfo(Int_t inode) const;
52 : Int_t GetNTNodes() const;
53 : Bool_t GetRange(Int_t ax, Float_t &min, Float_t &max) const;
54 : void GetStatus(Option_t *opt="");
55 :
56 0 : Bool_t HasStore() const {return TESTBIT(fStatus, kSTORE);}
57 0 : Bool_t UseCOG() const {return TESTBIT(fStatus, kCOG);}
58 440 : Bool_t UseWeights() const {return TESTBIT(fStatus, kWEIGHTS);}
59 :
60 : void DrawProjection(UInt_t ax1 = 0, UInt_t ax2 = 1);
61 : void SetAlpha(Float_t a);
62 0 : void SetCOG(Bool_t on = kTRUE) {on ? SETBIT(fStatus, kCOG) : CLRBIT(fStatus, kCOG);}
63 0 : void SetStore(Bool_t on = kTRUE) {on ? SETBIT(fStatus, kSTORE) : CLRBIT(fStatus, kSTORE);}
64 0 : void SetWeights(Bool_t on = kTRUE) {on ? SETBIT(fStatus, kWEIGHTS) : CLRBIT(fStatus, kWEIGHTS);}
65 :
66 : protected:
67 : virtual Bool_t Build(Int_t nnodes);
68 :
69 :
70 : Int_t fNSize; //!data dimension
71 : TClonesArray *fNodes; //interpolation nodes
72 : TKDNodeInfo::TKDNodeDraw *fNodesDraw; //!graphical representation of interpolation nodes
73 :
74 : //private:
75 : UChar_t fStatus; // status of the interpolator
76 : UChar_t fLambda; //! number of parameters in polynom
77 : Short_t fDepth; //! depth of the KD Tree structure used
78 : Float_t fAlpha; // parameter controlling the size of the region to interpolate n = (1+alpha)*lambda
79 : Float_t **fRefPoints; //! temporary storage of COG data
80 : Double_t *fBuffer; //! working space [2*fLambda]
81 : TKDTree<Int_t, Float_t> *fKDhelper; //! kNN finder
82 : TLinearFitter *fFitter; //! linear fitter
83 :
84 : private:
85 : TKDInterpolatorBase(const TKDInterpolatorBase &);
86 : TKDInterpolatorBase& operator=(const TKDInterpolatorBase &);
87 :
88 140 : ClassDef(TKDInterpolatorBase, 3) // data interpolator based on KD tree
89 : };
90 :
91 :
92 : #endif
93 :
|