00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef ROO_ADAPTIVE_GAUSS_KRONROD_INTEGRATOR_1D
00017 #define ROO_ADAPTIVE_GAUSS_KRONROD_INTEGRATOR_1D
00018
00019 #include "RooAbsIntegrator.h"
00020 #include "RooNumIntConfig.h"
00021
00022 double RooAdaptiveGaussKronrodIntegrator1D_GSL_GlueFunction(double x, void *data) ;
00023
00024 class RooAdaptiveGaussKronrodIntegrator1D : public RooAbsIntegrator {
00025 public:
00026
00027
00028 RooAdaptiveGaussKronrodIntegrator1D() ;
00029 RooAdaptiveGaussKronrodIntegrator1D(const RooAbsFunc& function, const RooNumIntConfig& config) ;
00030 RooAdaptiveGaussKronrodIntegrator1D(const RooAbsFunc& function, Double_t xmin, Double_t xmax,
00031 const RooNumIntConfig& config) ;
00032 virtual RooAbsIntegrator* clone(const RooAbsFunc& function, const RooNumIntConfig& config) const ;
00033 virtual ~RooAdaptiveGaussKronrodIntegrator1D();
00034
00035 virtual Bool_t checkLimits() const;
00036 virtual Double_t integral(const Double_t *yvec=0) ;
00037
00038 using RooAbsIntegrator::setLimits ;
00039 Bool_t setLimits(Double_t* xmin, Double_t* xmax);
00040 virtual Bool_t setUseIntegrandLimits(Bool_t flag) {
00041
00042 _useIntegrandLimits = flag ; return kTRUE ;
00043 }
00044
00045 virtual Bool_t canIntegrate1D() const {
00046
00047 return kTRUE ;
00048 }
00049 virtual Bool_t canIntegrate2D() const {
00050
00051 return kFALSE ;
00052 }
00053 virtual Bool_t canIntegrateND() const {
00054
00055 return kFALSE ;
00056 }
00057 virtual Bool_t canIntegrateOpenEnded() const {
00058
00059 return kTRUE ;
00060 }
00061
00062 protected:
00063
00064 friend class RooNumIntFactory ;
00065 static void registerIntegrator(RooNumIntFactory& fact) ;
00066
00067 enum DomainType { Closed, OpenLo, OpenHi, Open } ;
00068 mutable DomainType _domainType ;
00069
00070 friend double RooAdaptiveGaussKronrodIntegrator1D_GSL_GlueFunction(double x, void *data) ;
00071
00072 Bool_t initialize();
00073
00074 Bool_t _useIntegrandLimits;
00075
00076 Double_t* xvec(Double_t& xx) {
00077
00078 _x[0] = xx ; return _x ;
00079 }
00080 Double_t *_x ;
00081
00082 Double_t _epsAbs ;
00083 Double_t _epsRel ;
00084 Int_t _methodKey ;
00085 Int_t _maxSeg ;
00086 void* _workspace ;
00087
00088 mutable Double_t _xmin;
00089 mutable Double_t _xmax;
00090
00091 ClassDef(RooAdaptiveGaussKronrodIntegrator1D,0)
00092 };
00093
00094 #endif