ROOT logo
#ifndef ROOT_TKDNodeInfo
#define ROOT_TKDNodeInfo

////////////////////////////////////////////////////////
//
// Bucket representation for TKDInterpolator(Base)
//
// Author Alexandru Bercuci <A.Bercuci@gsi.de>
//
////////////////////////////////////////////////////////

#ifndef ROOT_TObject
#include "TObject.h"
#endif

#ifndef ROOT_TBox
#include "TBox.h"
#endif

#ifndef ROOT_TMarker
#include "TMarker.h"
#endif

template <typename Value> class TVectorT;
typedef class TVectorT<Double_t> TVectorD;
template <typename Value> class TMatrixT;
typedef class TMatrixT<Double_t> TMatrixD;
class TKDNodeInfo : public TObject
{
public:
  friend class TKDPDF;
  friend class TKDInterpolatorBase;
  class TKDNodeDraw : public TBox {
  public:
    TKDNodeDraw();
    ~TKDNodeDraw() {;}
    void  Draw(Option_t* option = "");
    void  Print(const Option_t* option = "") const; // *MENU*
    void  SetNode(TKDNodeInfo*, UChar_t s, UChar_t ax1=0, UChar_t ax2=1);
  private:
    TKDNodeDraw(const TKDNodeDraw & ref);
    TKDNodeDraw& operator=(const TKDNodeDraw & ref);

    TMarker     fCOG;    // COG of the node
    TKDNodeInfo *fNode;  //! node data
    ClassDef(TKDNodeDraw, 1)   // graphical representation of TKDNodeInfo
  };

  TKDNodeInfo(Int_t ndim = 0);
  TKDNodeInfo(const TKDNodeInfo & ref);
  TKDNodeInfo& operator=(const TKDNodeInfo & ref);
  virtual ~TKDNodeInfo();
  Bool_t        CookPDF(const Double_t *point, Double_t &result, Double_t &error) const;
  inline void   GetBoundary(Int_t ax, Float_t &min, Float_t &max) const;
  inline void   GetCOG(Float_t* &p) const;
  Int_t         GetDimension() const { return fNDim/3; }
  void          GetPDF(Float_t &pdf, Float_t &error) const {pdf=fVal[0]; error=fVal[1];}
  Int_t         GetSize() const { return fNDim; }
  Int_t         GetNcov() const { return fNcov; }
  Int_t         GetNpar() const { return fNpar; }
  inline Bool_t Has(const Float_t *p) const;
  void          Print(const Option_t * = "") const;
  void          Store(TVectorD const *par, TMatrixD const *cov=NULL);

  Double_t*      Cov() const  { return fCov; }
  Double_t*      Par() const  { return fPar; }

  void          SetNode(Int_t ndim, Float_t *data, Float_t *pdf);
protected:
  void          Bootstrap();
  void          Build(Int_t ndim);
  void          SetNcov() { fNcov=Int_t(.5*fNpar*(fNpar+1.));}
  void          SetNpar() { Int_t dim=Int_t(fNDim/3); fNpar=Int_t(1 + dim + .5*dim*(dim+1));}
  Float_t*      Data() { return fData;}
  Float_t*      Val()  { return &fVal[0]; }


private:
  Int_t     fNDim;          //! 3 times data dimension
  Float_t   *fData;         //![fNDim] node's data
  Float_t   fVal[2];        //!measured value for node
  Int_t     fNpar;          //number of parameters
  Int_t     fNcov;          //number of covarince elements
  Double_t  *fPar;          //[fNpar] interpolator parameters
  Double_t  *fCov;          //[fNcov] interpolator covariance matrix


  ClassDef(TKDNodeInfo, 2)  // node info for interpolator
};

//_____________________________________________________________________
inline Bool_t TKDNodeInfo::Has(const Float_t *p) const
{
  Int_t ndim = fNDim/3;
  
  Float_t *it = &fData[ndim]; Int_t n(0);
  for(int id=0; id<ndim; id++, it+=2)
    if(p[id]>=it[0] && p[id]<it[1]) n++;
  if(n==ndim) return kTRUE;
  return kFALSE;
}

//_____________________________________________________________________
inline void TKDNodeInfo::GetBoundary(Int_t ax, Float_t &min, Float_t &max) const
{
  Int_t ndim = fNDim/3;
  if(ax<0 || ax>=ndim){
    min=0.; max=0.;
    return;
  }
  Float_t *it = &fData[ndim+(ax<<1)];
  min = it[0]; max = it[1];
}

//_____________________________________________________________________
inline void TKDNodeInfo::GetCOG(Float_t* &p) const
{
  Int_t ndim = fNDim/3;
  memcpy(p, fData, ndim*sizeof(Float_t));
}

#endif

 TKDNodeInfo.h:1
 TKDNodeInfo.h:2
 TKDNodeInfo.h:3
 TKDNodeInfo.h:4
 TKDNodeInfo.h:5
 TKDNodeInfo.h:6
 TKDNodeInfo.h:7
 TKDNodeInfo.h:8
 TKDNodeInfo.h:9
 TKDNodeInfo.h:10
 TKDNodeInfo.h:11
 TKDNodeInfo.h:12
 TKDNodeInfo.h:13
 TKDNodeInfo.h:14
 TKDNodeInfo.h:15
 TKDNodeInfo.h:16
 TKDNodeInfo.h:17
 TKDNodeInfo.h:18
 TKDNodeInfo.h:19
 TKDNodeInfo.h:20
 TKDNodeInfo.h:21
 TKDNodeInfo.h:22
 TKDNodeInfo.h:23
 TKDNodeInfo.h:24
 TKDNodeInfo.h:25
 TKDNodeInfo.h:26
 TKDNodeInfo.h:27
 TKDNodeInfo.h:28
 TKDNodeInfo.h:29
 TKDNodeInfo.h:30
 TKDNodeInfo.h:31
 TKDNodeInfo.h:32
 TKDNodeInfo.h:33
 TKDNodeInfo.h:34
 TKDNodeInfo.h:35
 TKDNodeInfo.h:36
 TKDNodeInfo.h:37
 TKDNodeInfo.h:38
 TKDNodeInfo.h:39
 TKDNodeInfo.h:40
 TKDNodeInfo.h:41
 TKDNodeInfo.h:42
 TKDNodeInfo.h:43
 TKDNodeInfo.h:44
 TKDNodeInfo.h:45
 TKDNodeInfo.h:46
 TKDNodeInfo.h:47
 TKDNodeInfo.h:48
 TKDNodeInfo.h:49
 TKDNodeInfo.h:50
 TKDNodeInfo.h:51
 TKDNodeInfo.h:52
 TKDNodeInfo.h:53
 TKDNodeInfo.h:54
 TKDNodeInfo.h:55
 TKDNodeInfo.h:56
 TKDNodeInfo.h:57
 TKDNodeInfo.h:58
 TKDNodeInfo.h:59
 TKDNodeInfo.h:60
 TKDNodeInfo.h:61
 TKDNodeInfo.h:62
 TKDNodeInfo.h:63
 TKDNodeInfo.h:64
 TKDNodeInfo.h:65
 TKDNodeInfo.h:66
 TKDNodeInfo.h:67
 TKDNodeInfo.h:68
 TKDNodeInfo.h:69
 TKDNodeInfo.h:70
 TKDNodeInfo.h:71
 TKDNodeInfo.h:72
 TKDNodeInfo.h:73
 TKDNodeInfo.h:74
 TKDNodeInfo.h:75
 TKDNodeInfo.h:76
 TKDNodeInfo.h:77
 TKDNodeInfo.h:78
 TKDNodeInfo.h:79
 TKDNodeInfo.h:80
 TKDNodeInfo.h:81
 TKDNodeInfo.h:82
 TKDNodeInfo.h:83
 TKDNodeInfo.h:84
 TKDNodeInfo.h:85
 TKDNodeInfo.h:86
 TKDNodeInfo.h:87
 TKDNodeInfo.h:88
 TKDNodeInfo.h:89
 TKDNodeInfo.h:90
 TKDNodeInfo.h:91
 TKDNodeInfo.h:92
 TKDNodeInfo.h:93
 TKDNodeInfo.h:94
 TKDNodeInfo.h:95
 TKDNodeInfo.h:96
 TKDNodeInfo.h:97
 TKDNodeInfo.h:98
 TKDNodeInfo.h:99
 TKDNodeInfo.h:100
 TKDNodeInfo.h:101
 TKDNodeInfo.h:102
 TKDNodeInfo.h:103
 TKDNodeInfo.h:104
 TKDNodeInfo.h:105
 TKDNodeInfo.h:106
 TKDNodeInfo.h:107
 TKDNodeInfo.h:108
 TKDNodeInfo.h:109
 TKDNodeInfo.h:110
 TKDNodeInfo.h:111
 TKDNodeInfo.h:112
 TKDNodeInfo.h:113
 TKDNodeInfo.h:114
 TKDNodeInfo.h:115
 TKDNodeInfo.h:116
 TKDNodeInfo.h:117
 TKDNodeInfo.h:118
 TKDNodeInfo.h:119
 TKDNodeInfo.h:120
 TKDNodeInfo.h:121
 TKDNodeInfo.h:122
 TKDNodeInfo.h:123