// @(#)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 TFoamSampler

#ifndef ROOT_TFoamSampler
#define ROOT_TFoamSampler


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


namespace ROOT {

   namespace Fit {

      class DataRange;
      class BinData;
      class UnBinData;
   }

   namespace Math {
   }
}

class TFoamIntegrand;


class TRandom;
class TF1;
class TFoam;


//_______________________________________________________________________________
/**
   TFoamSampler class
   class implementing  the ROOT::Math::DistSampler interface using FOAM
   for sampling arbitrary distributions.


*/
class TFoamSampler : public ROOT::Math::DistSampler {

public:

   /// default constructor
   TFoamSampler();


   /// virtual destructor
   virtual ~TFoamSampler();


   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 default options
   */
   bool Init(const char * = "");

   /**
      initialize the generators with the fiven options
   */
   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);


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


   /**
      sample one event in multi-dimension by filling the given array
      return false if sampling failed
   */
   bool Sample(double * x);

   /**
      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:


private:

   // private member
//    bool                              fOneDim;      // flag to indicate if the function is 1 dimension
//    bool                              fHasMode;     // flag to indicate if a mode is set
//    bool                              fHasArea;     // flag to indicate if a area is set
//    double                            fMode;        // mode of dist
//    double                            fArea;        // area of dist
   const ROOT::Math::IGenFunction *  fFunc1D;      // 1D function pointer
   TFoam *                           fFoam;        // foam engine class
   TFoamIntegrand *                  fFoamDist;    // foam distribution interface

   //ClassDef(TFoamSampler,1)  //Distribution sampler class based on FOAM

};



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