#ifndef ROO_NUM_CONV_PDF
#define ROO_NUM_CONV_PDF
#include "RooAbsPdf.h"
#include "RooNumConvolution.h"
class TH2 ;
class RooArgSet ;
class RooDataSet ;
class RooNumConvPdf : public RooAbsPdf {
public:
RooNumConvPdf() ;
RooNumConvPdf(const char *name, const char *title,
RooRealVar& convVar, RooAbsPdf& pdf, RooAbsPdf& resmodel) ;
RooNumConvPdf(const RooNumConvPdf& other, const char* name=0) ;
virtual TObject* clone(const char* newname) const { return new RooNumConvPdf(*this,newname) ; }
virtual ~RooNumConvPdf() ;
virtual Double_t evaluate() const ;
inline RooNumIntConfig& convIntConfig() { return conv().convIntConfig() ; }
inline void clearConvolutionWindow() { conv().clearConvolutionWindow() ; }
inline void setConvolutionWindow(RooAbsReal& centerParam, RooAbsReal& widthParam, Double_t widthScaleFactor=1)
{ conv().setConvolutionWindow(centerParam,widthParam,widthScaleFactor) ; }
inline void setCallWarning(Int_t threshold=2000) { conv().setCallWarning(threshold) ; }
inline void setCallProfiling(Bool_t flag, Int_t nbinX = 40, Int_t nbinCall = 40, Int_t nCallHigh=1000)
{ conv().setCallProfiling(flag,nbinX,nbinCall,nCallHigh) ; }
inline const TH2* profileData() const { return conv().profileData() ; }
RooRealVar& var() const { return (RooRealVar&)(const_cast<RooAbsReal&>(_origVar.arg())) ; }
RooAbsReal& pdf() const { return const_cast<RooAbsReal&>(_origPdf.arg()) ; }
RooAbsReal& model() const { return const_cast<RooAbsReal&>(_origModel.arg()) ; }
void printMetaArgs(ostream& os) const ;
protected:
RooNumConvolution& conv() const { if (!_init) initialize() ; return *_conv ; }
mutable Bool_t _init ;
void initialize() const ;
mutable RooNumConvolution* _conv ;
RooRealProxy _origVar ;
RooRealProxy _origPdf ;
RooRealProxy _origModel ;
virtual RooAbsGenContext* genContext(const RooArgSet &vars, const RooDataSet *prototype=0,
const RooArgSet* auxProto=0, Bool_t verbose= kFALSE) const ;
friend class RooConvGenContext ;
ClassDef(RooNumConvPdf,1)
};
#endif