// @(#)root/mathcore:$Id$
// Author: L. Moneta Fri Sep 22 15:06:47 2006

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
 *                                                                    *
 *                                                                    *
 **********************************************************************/
// Header file for class TUnuranSampler

#ifndef ROOT_TUnuranSampler
#define ROOT_TUnuranSampler


#ifndef ROOT_Math_DistSampler
#include "Math/DistSampler.h"
#endif


namespace ROOT {

   namespace Fit {

      class DataRange;
      class BinData;
      class UnBinData;
   }

   namespace Math {
   }
}



//_______________________________________________________________________________
/**
   TUnuranSampler class
   class implementing  the ROOT::Math::DistSampler interface using the UNU.RAN
   package for sampling distributions.


*/

class TRandom;
class TF1;
class TUnuran;

class TUnuranSampler : public ROOT::Math::DistSampler {

public:

   /// default constructor
   TUnuranSampler();


   /// virtual destructor
   virtual ~TUnuranSampler();


   using DistSampler::SetFunction;

   /// set the parent function distribution to use for random sampling (one dim case)
   void SetFunction(const ROOT::Math::IGenFunction & func)  {
      fFunc1D = &func;
      SetFunction<const ROOT::Math::IGenFunction>(func, 1);
   }

   /// set the Function using a TF1 pointer
   void SetFunction(TF1 * pdf);


   /**
      initialize the generators with the given algorithm
      If no algorithm is passed used the default one for the type of distribution
   */
   bool Init(const char * algo ="");


   /**
      initialize the generators with the given algorithm
      If no algorithm is passed used the default one for the type of distribution
   */
   bool Init(const ROOT::Math::DistSamplerOptions & opt );

   /**
       Set the random engine to be used
       Needs to be called before Init to have effect
   */
   void SetRandom(TRandom * r);

   /**
       Set the random seed for the TRandom instances used by the sampler
       classes
       Needs to be called before Init to have effect
   */
   void SetSeed(unsigned int seed);

   /**
      Set the print level
      (if level=-1 use default)
    */
   void SetPrintLevel(int level) {fLevel = level;}

   /*
      set the mode
    */
   void SetMode(double mode) {
      fMode = mode;
      fHasMode = true;
   }

   /*
     set the area
    */
   void SetArea(double area) {
      fArea = area;
      fHasArea = true;
   }

   /**
      Get the random engine used by the sampler
    */
   TRandom * GetRandom();

   /**
      sample one event in one dimension
      better implementation could be provided by the derived classes
   */
   double Sample1D();//  {
//       return fUnuran->Sample();
//    }

   /**
      sample one event in multi-dimension by filling the given array
      return false if sampling failed
   */
   bool Sample(double * x);
//  {
//       if (!fOneDim) return fUnuran->SampleMulti(x);
//       x[0] = Sample1D();
//       return true;
//    }

   /**
      sample one bin given an estimated of the pdf in the bin
      (this can be function value at the center or its integral in the bin
      divided by the bin width)
      By default do not do random sample, just return the function values
    */
   bool SampleBin(double prob, double & value, double *error = 0);



protected:

   //initialization for 1D distributions
   bool DoInit1D(const char * algo);
   //initialization for 1D discrete distributions
   bool DoInitDiscrete1D(const char * algo);
   //initialization for multi-dim distributions
   bool DoInitND(const char * algo);


private:

   // private member
   bool                              fOneDim;      // flag to indicate if the function is 1 dimension
   bool                              fDiscrete;    // flag to indicate if the function is discrete
   bool                              fHasMode;     // flag to indicate if a mode is set
   bool                              fHasArea;     // flag to indicate if a area is set
   int                               fLevel;       // debug level
   double                            fMode;        // mode of dist
   double                            fArea;        // area of dist
   const ROOT::Math::IGenFunction *  fFunc1D;      // 1D function pointer
   TUnuran *                         fUnuran;      // unuran engine class

   //ClassDef(TUnuranSampler,1)  //Distribution sampler class based on UNU.RAN

};



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