ROOT logo
#ifndef ROOT_TKDInterpolatorBase
#define ROOT_TKDInterpolatorBase

#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif

#ifndef ROOT_TKDNodeInfo
#include "TKDNodeInfo.h"
#endif

///////////////////////////////////////////////////////////////
//
// Base non parametric interpolation algorithm.
// The class implements local polynomial regression (LOWESS).
// The user will work with daughter classes which implements
// particular data configurations.
//
///////////////////////////////////////////////////////////////

template <typename Value> class TVectorT;
typedef class TVectorT<Double_t> TVectorD;
template <typename Value> class TMatrixT;
typedef class TMatrixT<Double_t> TMatrixD;
template <typename Index, typename Value> class TKDTree;
typedef class TKDTree<Int_t, Float_t> TKDTreeIF;
class TLinearFitter;
class TClonesArray;
class TKDInterpolatorBase
{
public:	
  enum EKDInterpolatorBase {
    kdN = 4       // increase in the number of PDF if fit failled
   ,kNhelper = 30 // bucket size in helper kdTree
  };
  enum EKDInterpolatorBaseBits {
    kCOG   = 0  // COG interpolation method
   ,kSTORE = 1  // Store interpolation results
   ,kWEIGHTS = 2 // use weights
  };
  TKDInterpolatorBase(Int_t size = 0);
  virtual ~TKDInterpolatorBase();

  Bool_t        Bootstrap();
  Double_t      Eval(const Double_t *point, Double_t &result, Double_t &error, Bool_t force = kFALSE);
  virtual Int_t GetNodeIndex(const Float_t *p) = 0;
  Float_t       GetAlpha() const {return fAlpha;}
  Int_t         GetLambda() const {return fLambda;}
  Int_t         GetSize() const {return fNSize;}
  Bool_t        GetCOGPoint(Int_t node, Float_t *&coord, Float_t &val, Float_t &error) const;
  TKDNodeInfo*  GetNodeInfo(Int_t inode) const;
  Int_t         GetNTNodes() const;
  Bool_t        GetRange(Int_t ax, Float_t &min, Float_t &max) const;
  void          GetStatus(Option_t *opt="");

  Bool_t        HasStore() const {return TESTBIT(fStatus, kSTORE);}
  Bool_t        UseCOG() const {return TESTBIT(fStatus, kCOG);}
  Bool_t        UseWeights() const {return TESTBIT(fStatus, kWEIGHTS);}

  void          DrawProjection(UInt_t ax1 = 0, UInt_t ax2 = 1);
  void          SetAlpha(Float_t a);
  void          SetCOG(Bool_t on = kTRUE) {on ? SETBIT(fStatus, kCOG) : CLRBIT(fStatus, kCOG);}
  void          SetStore(Bool_t on = kTRUE) {on ? SETBIT(fStatus, kSTORE) : CLRBIT(fStatus, kSTORE);}
  void          SetWeights(Bool_t on = kTRUE) {on ? SETBIT(fStatus, kWEIGHTS) : CLRBIT(fStatus, kWEIGHTS);}

protected:
  virtual Bool_t    Build(Int_t nnodes);


  Int_t         fNSize;       //!data dimension
  TClonesArray  *fNodes;     //interpolation nodes
  TKDNodeInfo::TKDNodeDraw  *fNodesDraw; //!graphical representation of interpolation nodes

//private:
  UChar_t       fStatus;      // status of the interpolator
  UChar_t       fLambda;      //! number of parameters in polynom
  Short_t		    fDepth;       //! depth of the KD Tree structure used
  Float_t       fAlpha;       // parameter controlling the size of the region to interpolate n = (1+alpha)*lambda
  Float_t       **fRefPoints; //! temporary storage of COG data
  Double_t	    *fBuffer;     //! working space [2*fLambda]
  TKDTree<Int_t, Float_t> *fKDhelper;      //! kNN finder
  TLinearFitter *fFitter;     //! linear fitter	

private:
  TKDInterpolatorBase(const TKDInterpolatorBase &);
  TKDInterpolatorBase& operator=(const TKDInterpolatorBase &);

  ClassDef(TKDInterpolatorBase, 3)   // data interpolator based on KD tree
};


#endif

 TKDInterpolatorBase.h:1
 TKDInterpolatorBase.h:2
 TKDInterpolatorBase.h:3
 TKDInterpolatorBase.h:4
 TKDInterpolatorBase.h:5
 TKDInterpolatorBase.h:6
 TKDInterpolatorBase.h:7
 TKDInterpolatorBase.h:8
 TKDInterpolatorBase.h:9
 TKDInterpolatorBase.h:10
 TKDInterpolatorBase.h:11
 TKDInterpolatorBase.h:12
 TKDInterpolatorBase.h:13
 TKDInterpolatorBase.h:14
 TKDInterpolatorBase.h:15
 TKDInterpolatorBase.h:16
 TKDInterpolatorBase.h:17
 TKDInterpolatorBase.h:18
 TKDInterpolatorBase.h:19
 TKDInterpolatorBase.h:20
 TKDInterpolatorBase.h:21
 TKDInterpolatorBase.h:22
 TKDInterpolatorBase.h:23
 TKDInterpolatorBase.h:24
 TKDInterpolatorBase.h:25
 TKDInterpolatorBase.h:26
 TKDInterpolatorBase.h:27
 TKDInterpolatorBase.h:28
 TKDInterpolatorBase.h:29
 TKDInterpolatorBase.h:30
 TKDInterpolatorBase.h:31
 TKDInterpolatorBase.h:32
 TKDInterpolatorBase.h:33
 TKDInterpolatorBase.h:34
 TKDInterpolatorBase.h:35
 TKDInterpolatorBase.h:36
 TKDInterpolatorBase.h:37
 TKDInterpolatorBase.h:38
 TKDInterpolatorBase.h:39
 TKDInterpolatorBase.h:40
 TKDInterpolatorBase.h:41
 TKDInterpolatorBase.h:42
 TKDInterpolatorBase.h:43
 TKDInterpolatorBase.h:44
 TKDInterpolatorBase.h:45
 TKDInterpolatorBase.h:46
 TKDInterpolatorBase.h:47
 TKDInterpolatorBase.h:48
 TKDInterpolatorBase.h:49
 TKDInterpolatorBase.h:50
 TKDInterpolatorBase.h:51
 TKDInterpolatorBase.h:52
 TKDInterpolatorBase.h:53
 TKDInterpolatorBase.h:54
 TKDInterpolatorBase.h:55
 TKDInterpolatorBase.h:56
 TKDInterpolatorBase.h:57
 TKDInterpolatorBase.h:58
 TKDInterpolatorBase.h:59
 TKDInterpolatorBase.h:60
 TKDInterpolatorBase.h:61
 TKDInterpolatorBase.h:62
 TKDInterpolatorBase.h:63
 TKDInterpolatorBase.h:64
 TKDInterpolatorBase.h:65
 TKDInterpolatorBase.h:66
 TKDInterpolatorBase.h:67
 TKDInterpolatorBase.h:68
 TKDInterpolatorBase.h:69
 TKDInterpolatorBase.h:70
 TKDInterpolatorBase.h:71
 TKDInterpolatorBase.h:72
 TKDInterpolatorBase.h:73
 TKDInterpolatorBase.h:74
 TKDInterpolatorBase.h:75
 TKDInterpolatorBase.h:76
 TKDInterpolatorBase.h:77
 TKDInterpolatorBase.h:78
 TKDInterpolatorBase.h:79
 TKDInterpolatorBase.h:80
 TKDInterpolatorBase.h:81
 TKDInterpolatorBase.h:82
 TKDInterpolatorBase.h:83
 TKDInterpolatorBase.h:84
 TKDInterpolatorBase.h:85
 TKDInterpolatorBase.h:86
 TKDInterpolatorBase.h:87
 TKDInterpolatorBase.h:88
 TKDInterpolatorBase.h:89
 TKDInterpolatorBase.h:90
 TKDInterpolatorBase.h:91
 TKDInterpolatorBase.h:92
 TKDInterpolatorBase.h:93