00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 #ifndef ROO_ACCEPT_REJECT
00017 #define ROO_ACCEPT_REJECT
00018 
00019 #include "RooAbsNumGenerator.h"
00020 #include "RooPrintable.h"
00021 #include "RooArgSet.h"
00022 
00023 class RooAbsReal;
00024 class RooRealVar;
00025 class RooDataSet;
00026 class RooRealBinding;
00027 class RooNumGenFactory ;
00028 
00029 class RooAcceptReject : public RooAbsNumGenerator {
00030 public:
00031   RooAcceptReject() : _nextCatVar(0), _nextRealVar(0) {
00032     
00033   } ; 
00034   RooAcceptReject(const RooAbsReal &func, const RooArgSet &genVars, const RooNumGenConfig& config, Bool_t verbose=kFALSE, const RooAbsReal* maxFuncVal=0);
00035   RooAbsNumGenerator* clone(const RooAbsReal& func, const RooArgSet& genVars, const RooArgSet& , 
00036                             const RooNumGenConfig& config, Bool_t verbose=kFALSE, const RooAbsReal* maxFuncVal=0) const {
00037     return new RooAcceptReject(func,genVars,config,verbose,maxFuncVal) ;
00038   }
00039   virtual ~RooAcceptReject();
00040 
00041   const RooArgSet *generateEvent(UInt_t remaining, Double_t& resampleRatio);
00042   Double_t getFuncMax() ;
00043 
00044 
00045   
00046   virtual Bool_t canSampleConditional() const { return kTRUE ; }
00047   virtual Bool_t canSampleCategories() const { return kTRUE ; }
00048 
00049  
00050 protected:
00051 
00052   friend class RooNumGenFactory ;
00053   static void registerSampler(RooNumGenFactory& fact) ; 
00054 
00055   void addEventToCache();
00056   const RooArgSet *nextAcceptedEvent();
00057 
00058   Double_t _maxFuncVal, _funcSum;      
00059   UInt_t _realSampleDim,_catSampleMult;
00060   UInt_t _minTrials;                   
00061   UInt_t _totalEvents;                 
00062   UInt_t _eventsUsed;                  
00063   TIterator *_nextCatVar;              
00064   TIterator *_nextRealVar;             
00065 
00066   UInt_t _minTrialsArray[4];           
00067 
00068   ClassDef(RooAcceptReject,0) 
00069 };
00070 
00071 #endif