// @(#)root/unuran:$Id$
// Authors: L. Moneta, J. Leydold Wed Feb 28 2007

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
 *                                                                    *
 *                                                                    *
 **********************************************************************/

// Implementation file for class TUnuranEmpDist

#include "TUnuranEmpDist.h"

#include "TH1.h"

#include <cassert>



TUnuranEmpDist::TUnuranEmpDist (const TH1 * h1, bool useBuffer) :
   fDim(0),
   fMin(0),
   fMax(0),
   fBinned(false)
{
   //Constructor from a TH1 objects.
   //The buffer of the histo, if available, can be used for
   // the estimation of the parent distribution using smoothing

   if (!h1) return;  // in case of default ctor for I/O

   fDim = h1->GetDimension();

   bool unbin = useBuffer &&  h1->GetBufferLength() > 0 ;
   fBinned = !unbin;

   if (fBinned ) {
      int nbins = h1->GetNbinsX();
      fData.reserve(nbins);
      for (int i =0; i < nbins; ++i)
         fData.push_back( h1->GetBinContent(i+1) );

      fMin = h1->GetXaxis()->GetXmin();
      fMax = h1->GetXaxis()->GetXmax();
   }
   else {
      //std::cout << "use kernel smoothing method" << std::endl;

      int n = h1->GetBufferLength();
      const double * bf = h1->GetBuffer();
      fData.reserve(n);
      // fill buffer (assume weights are equal to 1)
      // bugger is : [n,w0,x0,y0,..,w1,x1,y1,...wn,xn,yn]
      // buffer contains size
      for (int i = 0; i < n; ++i) {
         int index = (fDim+1)*i + fDim + 1;
         fData.push_back(  bf[index] );
      }
   }
}

TUnuranEmpDist::TUnuranEmpDist (unsigned int n, double * x) :
   fData(std::vector<double>(x,x+n) ),
   fDim(1),
   fMin(0), fMax(0),
   fBinned(0)
{
   // constructor for 1D unbinned data
}

TUnuranEmpDist::TUnuranEmpDist (unsigned int n, double * x, double * y) :
   fData(std::vector<double>(2*n) ),
   fDim(2),
   fMin(0), fMax(0),
   fBinned(0)
{
   // constructor for 2D unbinned data
   for (unsigned int i = 0; i < n; ++i) {
      fData[i*2]   = x[i];
      fData[i*2+1] = y[i];
   }
}

TUnuranEmpDist::TUnuranEmpDist (unsigned int n, double * x, double * y, double *z) :
   fData(std::vector<double>(3*n) ),
   fDim(3),
   fMin(0), fMax(0),
   fBinned(0)
{
   // constructor for 3D unbinned data
   for (unsigned int i = 0; i < n; ++i) {
      fData[i*3]   = x[i];
      fData[i*3+1] = y[i];
      fData[i*3+2] = z[i];
   }
}



TUnuranEmpDist::TUnuranEmpDist(const TUnuranEmpDist & rhs) :
   TUnuranBaseDist()
{
   // Implementation of copy ctor using aassignment operator
   operator=(rhs);
}

TUnuranEmpDist & TUnuranEmpDist::operator = (const TUnuranEmpDist &rhs)
{
   // Implementation of assignment operator (copy only the function pointer not the function itself)
   if (this == &rhs) return *this;  // time saving self-test
   fData  = rhs.fData;
   fDim   = rhs.fDim;
   fMin   = rhs.fMin;
   fMax   = rhs.fMax;
   fBinned = rhs.fBinned;
   return *this;
}






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