Gaudi Framework, version v20r4

Generated: 8 Jan 2009

Splines.h

Go to the documentation of this file.
00001 // $Id: Splines.h,v 1.2 2005/11/25 10:27:03 mato Exp $
00002 // ============================================================================
00003 #ifndef GAUDIMATH_SPLINES_H 
00004 #define GAUDIMATH_SPLINES_H 1
00005 // ============================================================================
00006 // Include files
00007 // ============================================================================
00008 // STD/STL
00009 // ============================================================================
00010 #include <vector>
00011 #include <utility>
00012 #include <algorithm>
00013 // ============================================================================
00014 // from CLHEP
00015 // ============================================================================
00016 #include "CLHEP/GenericFunctions/GenericFunctions.hh"
00017 #include "CLHEP/GenericFunctions/Argument.hh"
00018 #include "CLHEP/GenericFunctions/AbsFunction.hh"
00019 // ============================================================================
00020 // GaudiGSL/GaudiMath
00021 // ============================================================================
00022 #include "GaudiMath/Interpolation.h"
00023 // ============================================================================
00024 // GSL 
00025 // ============================================================================
00026 #include "gsl/gsl_interp.h"
00027 #include "gsl/gsl_spline.h"
00028 // ============================================================================
00029 
00030 namespace Genfun
00031 {
00032   namespace GaudiMathImplementation
00033   {
00034     
00035     class  SplineBase
00036     {
00037     public: 
00038       typedef std::vector<double>                    Data1D ;
00039       typedef std::vector<std::pair<double,double> > Data2D ;
00040     public:
00046       SplineBase  
00047       ( const Data1D&                        x    , 
00048         const Data1D&                        y    ,  
00049         const GaudiMath::Interpolation::Type type ) ;
00054       SplineBase 
00055       ( const Data2D&                        data , 
00056         const GaudiMath::Interpolation::Type type ) ;
00063       template <class DATAX, class DATAY>
00064       SplineBase  
00065       ( const GaudiMath::Interpolation::Type type    ,
00066         DATAX                                begin_x , 
00067         DATAX                                end_x   , 
00068         DATAY                                begin_y )
00069         : m_init      ( false           ) 
00070         , m_dim       ( end_x - begin_x )
00071         , m_x         ( new double[ end_x - begin_x ] )
00072         , m_y         ( new double[ end_x - begin_x ] )  
00073         , m_spline    ( 0    ) 
00074         , m_accel     ( 0    ) 
00075         , m_type      ( type )
00076       {
00077         std::copy ( begin_x , end_x                         , m_x ) ;
00078         std::copy ( begin_y , begin_y + ( end_x - begin_x ) , m_y ) ;
00079       };
00087       template <class DATA>
00088       SplineBase  
00089       ( const GaudiMath::Interpolation::Type type  ,
00090         DATA                                 begin , 
00091         DATA                                 end   ) 
00092         : m_init      ( false        ) 
00093         , m_dim       ( end - begin  )
00094         , m_x         ( new double[ end - begin ] )
00095         , m_y         ( new double[ end - begin ] ) 
00096         , m_spline    ( 0    ) 
00097         , m_accel     ( 0    ) 
00098         , m_type      ( type ) 
00099       {
00100         double* _x = m_x ;
00101         double* _y = m_y ;
00102         for ( DATA it = begin ; end != it ; ++ it ) 
00103         {
00104           *_x = it -> first  ; ++_x ;
00105           *_y = it -> second ; ++_y ;
00106         };
00107       };
00109       SplineBase( const SplineBase& ) ;  
00111       virtual ~SplineBase();
00112     public:
00114       double eval   ( const double x ) const ;
00116       double deriv  ( const double x ) const ;
00118       double deriv2 ( const double x ) const ;
00120       double integ  ( const double a , const double b ) const ;
00121     protected:
00122       // initialize 
00123       void initialize () const ;
00124     private:
00125       // default constructor is disabled 
00126       SplineBase() ;
00127       // assigenement operator  is disabled 
00128       SplineBase& operator=( const SplineBase& ) ;
00129     private:
00130       mutable bool                   m_init   ;
00131       size_t                         m_dim    ;
00132       double*                        m_x      ;
00133       double*                        m_y      ;
00134       mutable gsl_spline*            m_spline ;
00135       mutable gsl_interp_accel*      m_accel  ;
00136       GaudiMath::Interpolation::Type m_type   ;  
00137     };
00138     
00139     class GSLSpline : public AbsFunction
00140     {
00141     public:
00142       typedef SplineBase::Data1D Data1D ;
00143       typedef SplineBase::Data2D Data2D ;
00144     public:
00146       FUNCTION_OBJECT_DEF( GSLSpline ) ;
00147     public:
00168       GSLSpline 
00169       ( const Data1D&                        x    , 
00170         const Data1D&                        y    ,  
00171         const GaudiMath::Interpolation::Type type ) ;
00190       GSLSpline 
00191       ( const Data2D&                        data , 
00192         const GaudiMath::Interpolation::Type type ) ;
00219       template <class DATAX, class DATAY>
00220       GSLSpline 
00221       ( const GaudiMath::Interpolation::Type type    ,
00222         DATAX                                begin_x , 
00223         DATAX                                end_x   , 
00224         DATAY                                begin_y )
00225         : AbsFunction ( )
00226         , m_spline( type , begin_x , end_x , begin_y ) 
00227       {};
00239       template <class DATA>
00240       GSLSpline 
00241       ( const GaudiMath::Interpolation::Type type  ,
00242         DATA                                 begin , 
00243         DATA                                 end   ) 
00244         : AbsFunction ( )
00245         , m_spline( type , begin , end ) 
00246       {};
00248       GSLSpline ( const SplineBase& ) ;
00250       GSLSpline ( const GSLSpline& ) ;
00252       virtual ~GSLSpline() ;
00253     public:      
00255       virtual double operator() ( double a          ) const ;
00257       virtual double operator() ( const Argument& x ) const ;
00258       virtual unsigned int dimensionality () const { return 1   ; }
00260       virtual bool  hasAnalyticDerivative() const { return true ; }
00262       virtual Genfun::Derivative partial( unsigned int i  ) const ;
00263     public:
00265       inline   const SplineBase& spline() const { return m_spline ; }
00267       operator const SplineBase&       () const { return spline() ; }
00268     private:
00270       GSLSpline() ;
00272       GSLSpline& operator=( const GSLSpline& ) ;
00273     private:
00274       // the actual spline function 
00275       SplineBase m_spline ;
00276     };
00277 
00278     class GSLSplineDeriv : public AbsFunction
00279     {
00280     public:
00281       typedef SplineBase::Data1D Data1D ;
00282       typedef SplineBase::Data2D Data2D ;
00283     public:
00285       FUNCTION_OBJECT_DEF( GSLSplineDeriv ) ;
00286     public:
00307       GSLSplineDeriv
00308       ( const Data1D&                        x    , 
00309         const Data1D&                        y    ,  
00310         const GaudiMath::Interpolation::Type type ) ;
00329       GSLSplineDeriv
00330       ( const Data2D&                        data , 
00331         const GaudiMath::Interpolation::Type type ) ;
00358       template <class DATAX, class DATAY>
00359       GSLSplineDeriv 
00360       ( const GaudiMath::Interpolation::Type type    ,
00361         DATAX                                begin_x , 
00362         DATAX                                end_x   , 
00363         DATAY                                begin_y )
00364         : AbsFunction ( )
00365         , m_spline( type , begin_x , end_x , begin_y ) 
00366       {};
00378       template <class DATA>
00379       GSLSplineDeriv
00380       ( const GaudiMath::Interpolation::Type type  ,
00381         DATA                                 begin , 
00382         DATA                                 end   ) 
00383         : AbsFunction ( )
00384         , m_spline( type , begin , end ) 
00385       {};
00387       GSLSplineDeriv ( const SplineBase&     ) ;
00389       GSLSplineDeriv ( const GSLSplineDeriv& ) ;      
00391       virtual ~GSLSplineDeriv() ;
00392     public:
00394       virtual double operator() ( double a          ) const ;
00396       virtual double operator() ( const Argument& x ) const ;
00397       virtual unsigned int dimensionality () const { return 1   ; }
00399       virtual bool  hasAnalyticDerivative() const { return true ; }
00401       virtual Genfun::Derivative partial( unsigned int i  ) const ;
00402     public:
00404       inline   const SplineBase& spline() const { return m_spline ; }
00406       operator const SplineBase&       () const { return spline() ; }      
00407     private:
00409       GSLSplineDeriv() ;
00411       GSLSplineDeriv& operator=( const GSLSplineDeriv& ) ;
00412     private:
00413       // the actual spline function 
00414       SplineBase m_spline ;
00415     };
00416 
00417     class GSLSplineDeriv2 : public AbsFunction
00418     {
00419     public:
00420       typedef SplineBase::Data1D Data1D ;
00421       typedef SplineBase::Data2D Data2D ;
00422     public:
00424       FUNCTION_OBJECT_DEF( GSLSplineDeriv2 ) ;
00425     public:
00446       GSLSplineDeriv2
00447       ( const Data1D&                        x    , 
00448         const Data1D&                        y    ,  
00449         const GaudiMath::Interpolation::Type type ) ;
00468       GSLSplineDeriv2
00469       ( const Data2D&                        data , 
00470         const GaudiMath::Interpolation::Type type ) ;
00497       template <class DATAX, class DATAY>
00498       GSLSplineDeriv2 
00499       ( const GaudiMath::Interpolation::Type type    ,
00500         DATAX                                begin_x , 
00501         DATAX                                end_x   , 
00502         DATAY                                begin_y )
00503         : AbsFunction ( )
00504         , m_spline( type , begin_x , end_x , begin_y ) 
00505       {};
00517       template <class DATA>
00518       GSLSplineDeriv2
00519       ( const GaudiMath::Interpolation::Type type  ,
00520         DATA                                 begin , 
00521         DATA                                 end   ) 
00522         : AbsFunction ( )
00523         , m_spline( type , begin , end ) 
00524       {};
00526       GSLSplineDeriv2 ( const SplineBase&      ) ;
00528       GSLSplineDeriv2 ( const GSLSplineDeriv2& ) ;      
00530       virtual ~GSLSplineDeriv2() ;
00531     public:
00533       virtual double operator() ( double a          ) const ;
00535       virtual double operator() ( const Argument& x ) const ;
00536       virtual unsigned int dimensionality () const { return 1   ; }
00538       virtual bool  hasAnalyticDerivative() const { return true ; }
00540       virtual Genfun::Derivative partial( unsigned int i  ) const ;
00541     public:
00543       inline   const SplineBase& spline() const { return m_spline ; }
00545       operator const SplineBase&       () const { return spline() ; }      
00546     private:
00548       GSLSplineDeriv2() ;
00550       GSLSplineDeriv2& operator=( const GSLSplineDeriv2& ) ;
00551     private:
00552       // the actual spline function 
00553       SplineBase m_spline ;
00554     };
00555 
00556 
00557     class GSLSplineInteg : public AbsFunction
00558     {
00559     public:
00560       typedef SplineBase::Data1D Data1D ;
00561       typedef SplineBase::Data2D Data2D ;
00562     public:
00564       FUNCTION_OBJECT_DEF( GSLSplineInteg ) ;
00565     public:
00586       GSLSplineInteg
00587       ( const Data1D&                        x        , 
00588         const Data1D&                        y        ,  
00589         const GaudiMath::Interpolation::Type type     , 
00590         const double                         low  = 0 ) ;
00610       GSLSplineInteg
00611       ( const Data2D&                        data     , 
00612         const GaudiMath::Interpolation::Type type     ,
00613         const double                         low  = 0 ) ;
00641       template <class DATAX, class DATAY>
00642       GSLSplineInteg
00643       ( const GaudiMath::Interpolation::Type type    ,
00644         DATAX                                begin_x , 
00645         DATAX                                end_x   , 
00646         DATAY                                begin_y , 
00647         const double                         low     )
00648         : AbsFunction (      )
00649         , m_spline    ( type , begin_x , end_x , begin_y ) 
00650         , m_low       ( low  )
00651       {};
00664       template <class DATA>
00665       GSLSplineInteg
00666       ( const GaudiMath::Interpolation::Type type  ,
00667         DATA                                 begin , 
00668         DATA                                 end   , 
00669         const double                         low   ) 
00670         : AbsFunction (      )
00671         , m_spline    ( type , begin , end ) 
00672         , m_low       ( low  )
00673       {};
00675       GSLSplineInteg ( const SplineBase&              , 
00676                        const double           low = 0 ) ;
00678       GSLSplineInteg ( const GSLSplineInteg&      ) ;      
00680       virtual ~GSLSplineInteg () ;
00681     public:
00683       virtual double operator() ( double a          ) const ;
00685       virtual double operator() ( const Argument& x ) const ;
00686       virtual unsigned int dimensionality () const { return 1   ; }
00688       virtual bool  hasAnalyticDerivative() const { return true ; }
00690       virtual Genfun::Derivative partial( unsigned int i  ) const ;
00691     public:
00693       inline   const SplineBase& spline() const { return m_spline ; }
00695       operator const SplineBase&       () const { return spline() ; }      
00696     private:
00698       GSLSplineInteg () ;
00700       GSLSplineInteg& operator=( const GSLSplineInteg& ) ;
00701     private:
00702       // the actual spline function 
00703       SplineBase m_spline ;
00704       double     m_low    ;
00705     };
00706     
00707   };
00708 };
00709 
00710 
00711 #endif // GAUDIMATH_SPLINES_H
00712 // ============================================================================

Generated at Thu Jan 8 17:44:19 2009 for Gaudi Framework, version v20r4 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004