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

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

// Header file for class TUnuranEmpDist


#ifndef ROOT_Math_TUnuranEmpDist
#define ROOT_Math_TUnuranEmpDist


#ifndef ROOT_Math_TUnuranBaseDist
#include "TUnuranBaseDist.h"
#endif

#include <vector>

class TH1;

//_______________________________________________________________________________
/**
   TUnuranEmpDist class for describing empiral  distributions. It is used by TUnuran
   to generate double random number according to this distribution via TUnuran::Sample() or
   TUnuran::Sample(double *) in case of multi-dimensional empirical distributions.

   An empirical distribution can be one or multi-dimension constructed from a set of unbinned data,
   (the class can be constructed from an iterator to a vector of data) or by using an histogram
   (with apointer to the TH1 class). If the histogram contains a buffer with the original data they are used by
   default to estimate the empirical distribution, othewise the bins information is used. In this binned case
   only one dimension is now supported.

   In the case of unbinned data the density distribution is estimated by UNURAN using kernel smoothing and
   then random numbers are generated. In the case of bin data (which can only be one dimension)
   the probability density is estimated directly from the histograms and the random numbers are generated according
   to the histogram (like in TH1::GetRandom). This method requires some initialization time but it is faster
   in generating the random numbers than TH1::GetRandom and it becomes convenient to use when generating
   a large amount of data.

*/
///////////////////////////////////////////////////////////////////////

class TUnuranEmpDist : public TUnuranBaseDist {

public:


   /**
      Constructor from a TH1 objects.
      If the histogram has a buffer by default the unbinned data are used
   */
   TUnuranEmpDist (const TH1 * h1 = 0, bool useBuffer = true );

   /**
      Constructor from a set of data using an iterator to specify begin/end of the data
      In the case of multi-dimension the data are assumed to be passed in this order
      x0,y0,...x1,y1,..x2,y2,...
   */
   template<class Iterator>
   TUnuranEmpDist (Iterator begin, Iterator end, unsigned int dim = 1) :
      fData(std::vector<double>(begin,end) ),
      fDim(dim),
      fMin(0), fMax(0),
      fBinned(0)  {}

   /**
      Constructor from a set of 1D data
   */
   TUnuranEmpDist (unsigned int n, double * x);

   /**
      Constructor from a set of 2D data
   */
   TUnuranEmpDist (unsigned int n, double * x, double * y);

   /**
      Constructor from a set of 3D data
   */
   TUnuranEmpDist (unsigned int n, double * x, double * y, double * z);


   /**
      Destructor (no operations)
   */
   virtual ~TUnuranEmpDist () {}


   /**
      Copy constructor
   */
   TUnuranEmpDist(const TUnuranEmpDist &);


   /**
      Assignment operator
   */
   TUnuranEmpDist & operator = (const TUnuranEmpDist & rhs);

   /**
      Clone (required by base class)
    */
   TUnuranEmpDist * Clone() const { return new TUnuranEmpDist(*this); }


   /**
      Return reference to data vector (unbinned or binned data)
    */
   const std::vector<double> & Data() const { return fData; }

   /**
      Flag to control if data are binned
    */
   bool IsBinned() const { return fBinned; }

   /**
      Min value of binned data
      (return 0 for unbinned data)
    */
   double LowerBin() const { return fMin; }

   /**
      upper value of binned data
      (return 0 for unbinned data)
    */
   double UpperBin() const { return fMax; }

   /**
      Number of data dimensions
    */
   unsigned int NDim() const { return fDim; }


private:

   std::vector<double>  fData;       //pointer to the data vector (used for generation from un-binned data)
   unsigned int fDim;                 //data dimensionality
   double fMin;                       // min values (used in the binned case)
   double fMax;                       // max values (used in the binned case)
   bool   fBinned;                    // flag for binned/unbinned data

   ClassDef(TUnuranEmpDist,1)         //Wrapper class for empirical distribution


};



#endif /* ROOT_Math_TUnuranEmpDist */
 TUnuranEmpDist.h:1
 TUnuranEmpDist.h:2
 TUnuranEmpDist.h:3
 TUnuranEmpDist.h:4
 TUnuranEmpDist.h:5
 TUnuranEmpDist.h:6
 TUnuranEmpDist.h:7
 TUnuranEmpDist.h:8
 TUnuranEmpDist.h:9
 TUnuranEmpDist.h:10
 TUnuranEmpDist.h:11
 TUnuranEmpDist.h:12
 TUnuranEmpDist.h:13
 TUnuranEmpDist.h:14
 TUnuranEmpDist.h:15
 TUnuranEmpDist.h:16
 TUnuranEmpDist.h:17
 TUnuranEmpDist.h:18
 TUnuranEmpDist.h:19
 TUnuranEmpDist.h:20
 TUnuranEmpDist.h:21
 TUnuranEmpDist.h:22
 TUnuranEmpDist.h:23
 TUnuranEmpDist.h:24
 TUnuranEmpDist.h:25
 TUnuranEmpDist.h:26
 TUnuranEmpDist.h:27
 TUnuranEmpDist.h:28
 TUnuranEmpDist.h:29
 TUnuranEmpDist.h:30
 TUnuranEmpDist.h:31
 TUnuranEmpDist.h:32
 TUnuranEmpDist.h:33
 TUnuranEmpDist.h:34
 TUnuranEmpDist.h:35
 TUnuranEmpDist.h:36
 TUnuranEmpDist.h:37
 TUnuranEmpDist.h:38
 TUnuranEmpDist.h:39
 TUnuranEmpDist.h:40
 TUnuranEmpDist.h:41
 TUnuranEmpDist.h:42
 TUnuranEmpDist.h:43
 TUnuranEmpDist.h:44
 TUnuranEmpDist.h:45
 TUnuranEmpDist.h:46
 TUnuranEmpDist.h:47
 TUnuranEmpDist.h:48
 TUnuranEmpDist.h:49
 TUnuranEmpDist.h:50
 TUnuranEmpDist.h:51
 TUnuranEmpDist.h:52
 TUnuranEmpDist.h:53
 TUnuranEmpDist.h:54
 TUnuranEmpDist.h:55
 TUnuranEmpDist.h:56
 TUnuranEmpDist.h:57
 TUnuranEmpDist.h:58
 TUnuranEmpDist.h:59
 TUnuranEmpDist.h:60
 TUnuranEmpDist.h:61
 TUnuranEmpDist.h:62
 TUnuranEmpDist.h:63
 TUnuranEmpDist.h:64
 TUnuranEmpDist.h:65
 TUnuranEmpDist.h:66
 TUnuranEmpDist.h:67
 TUnuranEmpDist.h:68
 TUnuranEmpDist.h:69
 TUnuranEmpDist.h:70
 TUnuranEmpDist.h:71
 TUnuranEmpDist.h:72
 TUnuranEmpDist.h:73
 TUnuranEmpDist.h:74
 TUnuranEmpDist.h:75
 TUnuranEmpDist.h:76
 TUnuranEmpDist.h:77
 TUnuranEmpDist.h:78
 TUnuranEmpDist.h:79
 TUnuranEmpDist.h:80
 TUnuranEmpDist.h:81
 TUnuranEmpDist.h:82
 TUnuranEmpDist.h:83
 TUnuranEmpDist.h:84
 TUnuranEmpDist.h:85
 TUnuranEmpDist.h:86
 TUnuranEmpDist.h:87
 TUnuranEmpDist.h:88
 TUnuranEmpDist.h:89
 TUnuranEmpDist.h:90
 TUnuranEmpDist.h:91
 TUnuranEmpDist.h:92
 TUnuranEmpDist.h:93
 TUnuranEmpDist.h:94
 TUnuranEmpDist.h:95
 TUnuranEmpDist.h:96
 TUnuranEmpDist.h:97
 TUnuranEmpDist.h:98
 TUnuranEmpDist.h:99
 TUnuranEmpDist.h:100
 TUnuranEmpDist.h:101
 TUnuranEmpDist.h:102
 TUnuranEmpDist.h:103
 TUnuranEmpDist.h:104
 TUnuranEmpDist.h:105
 TUnuranEmpDist.h:106
 TUnuranEmpDist.h:107
 TUnuranEmpDist.h:108
 TUnuranEmpDist.h:109
 TUnuranEmpDist.h:110
 TUnuranEmpDist.h:111
 TUnuranEmpDist.h:112
 TUnuranEmpDist.h:113
 TUnuranEmpDist.h:114
 TUnuranEmpDist.h:115
 TUnuranEmpDist.h:116
 TUnuranEmpDist.h:117
 TUnuranEmpDist.h:118
 TUnuranEmpDist.h:119
 TUnuranEmpDist.h:120
 TUnuranEmpDist.h:121
 TUnuranEmpDist.h:122
 TUnuranEmpDist.h:123
 TUnuranEmpDist.h:124
 TUnuranEmpDist.h:125
 TUnuranEmpDist.h:126
 TUnuranEmpDist.h:127
 TUnuranEmpDist.h:128
 TUnuranEmpDist.h:129
 TUnuranEmpDist.h:130
 TUnuranEmpDist.h:131
 TUnuranEmpDist.h:132
 TUnuranEmpDist.h:133
 TUnuranEmpDist.h:134
 TUnuranEmpDist.h:135
 TUnuranEmpDist.h:136
 TUnuranEmpDist.h:137
 TUnuranEmpDist.h:138
 TUnuranEmpDist.h:139
 TUnuranEmpDist.h:140
 TUnuranEmpDist.h:141
 TUnuranEmpDist.h:142
 TUnuranEmpDist.h:143
 TUnuranEmpDist.h:144
 TUnuranEmpDist.h:145
 TUnuranEmpDist.h:146
 TUnuranEmpDist.h:147
 TUnuranEmpDist.h:148
 TUnuranEmpDist.h:149
 TUnuranEmpDist.h:150
 TUnuranEmpDist.h:151
 TUnuranEmpDist.h:152
 TUnuranEmpDist.h:153