3 #ifndef GAUDIMATH_SPLINES_H
4 #define GAUDIMATH_SPLINES_H 1
16 #include "CLHEP/GenericFunctions/GenericFunctions.hh"
17 #include "CLHEP/GenericFunctions/Argument.hh"
18 #include "CLHEP/GenericFunctions/AbsFunction.hh"
22 #include "GaudiMath/Interpolation.h"
26 #include "gsl/gsl_interp.h"
27 #include "gsl/gsl_spline.h"
29 #include "GaudiKernel/Kernel.h"
33 namespace GaudiMathImplementation
39 typedef std::vector<double> Data1D ;
40 typedef std::vector<std::pair<double,double> > Data2D ;
56 (
const Data2D& data ,
64 template <
class DATAX,
class DATAY>
71 , m_dim ( end_x - begin_x )
72 , m_x ( new double[ end_x - begin_x ] )
73 , m_y ( new double[ end_x - begin_x ] )
78 std::copy ( begin_x , end_x , m_x ) ;
79 std::copy ( begin_y , begin_y + ( end_x - begin_x ) , m_y ) ;
94 , m_dim ( end - begin )
95 , m_x ( new double[ end - begin ] )
96 , m_y ( new double[ end - begin ] )
103 for ( DATA it = begin ; end != it ; ++ it )
105 *_x = it -> first ; ++_x ;
106 *_y = it ->
second ; ++_y ;
110 SplineBase(
const SplineBase& ) ;
112 virtual ~SplineBase();
115 double eval (
const double x )
const ;
117 double deriv (
const double x )
const ;
119 double deriv2 (
const double x )
const ;
121 double integ (
const double a ,
const double b )
const ;
129 SplineBase& operator=(
const SplineBase& ) ;
131 mutable bool m_init ;
135 mutable gsl_spline* m_spline ;
136 mutable gsl_interp_accel* m_accel ;
140 class GAUDI_API GSLSpline :
public AbsFunction
147 FUNCTION_OBJECT_DEF( GSLSpline )
192 ( const Data2D& data ,
227 , m_spline( type , begin_x , end_x , begin_y )
240 template <
class DATA>
246 , m_spline( type , begin , end )
249 GSLSpline (
const SplineBase& ) ;
251 GSLSpline (
const GSLSpline& ) ;
253 virtual ~GSLSpline() ;
256 virtual double operator() (
double a )
const ;
258 virtual double operator() (
const Argument& x )
const ;
259 virtual unsigned int dimensionality ()
const {
return 1 ; }
261 virtual bool hasAnalyticDerivative()
const {
return true ; }
266 inline const SplineBase& spline()
const {
return m_spline ; }
268 operator const SplineBase& ()
const {
return spline() ; }
273 GSLSpline& operator=(
const GSLSpline& ) ;
276 SplineBase m_spline ;
279 class GAUDI_API GSLSplineDeriv :
public AbsFunction
286 FUNCTION_OBJECT_DEF( GSLSplineDeriv )
331 ( const Data2D& data ,
366 , m_spline( type , begin_x , end_x , begin_y )
379 template <
class DATA>
385 , m_spline( type , begin , end )
388 GSLSplineDeriv (
const SplineBase& ) ;
390 GSLSplineDeriv (
const GSLSplineDeriv& ) ;
392 virtual ~GSLSplineDeriv() ;
395 virtual double operator() (
double a )
const ;
397 virtual double operator() (
const Argument& x )
const ;
398 virtual unsigned int dimensionality ()
const {
return 1 ; }
400 virtual bool hasAnalyticDerivative()
const {
return true ; }
405 inline const SplineBase& spline()
const {
return m_spline ; }
407 operator const SplineBase& ()
const {
return spline() ; }
412 GSLSplineDeriv& operator=(
const GSLSplineDeriv& ) ;
415 SplineBase m_spline ;
418 class GAUDI_API GSLSplineDeriv2 :
public AbsFunction
425 FUNCTION_OBJECT_DEF( GSLSplineDeriv2 )
470 ( const Data2D& data ,
505 , m_spline( type , begin_x , end_x , begin_y )
518 template <
class DATA>
524 , m_spline( type , begin , end )
527 GSLSplineDeriv2 (
const SplineBase& ) ;
529 GSLSplineDeriv2 (
const GSLSplineDeriv2& ) ;
531 virtual ~GSLSplineDeriv2() ;
534 virtual double operator() (
double a )
const ;
536 virtual double operator() (
const Argument& x )
const ;
537 virtual unsigned int dimensionality ()
const {
return 1 ; }
539 virtual bool hasAnalyticDerivative()
const {
return true ; }
544 inline const SplineBase& spline()
const {
return m_spline ; }
546 operator const SplineBase& ()
const {
return spline() ; }
551 GSLSplineDeriv2& operator=(
const GSLSplineDeriv2& ) ;
554 SplineBase m_spline ;
558 class GAUDI_API GSLSplineInteg :
public AbsFunction
565 FUNCTION_OBJECT_DEF( GSLSplineInteg )
591 const
double low = 0 ) ;
612 ( const Data2D& data ,
614 const
double low = 0 ) ;
650 , m_spline ( type , begin_x , end_x , begin_y )
665 template <
class DATA>
672 , m_spline ( type , begin , end )
676 GSLSplineInteg (
const SplineBase& ,
677 const double low = 0 ) ;
679 GSLSplineInteg (
const GSLSplineInteg& ) ;
681 virtual ~GSLSplineInteg () ;
684 virtual double operator() (
double a )
const ;
686 virtual double operator() (
const Argument& x )
const ;
687 virtual unsigned int dimensionality ()
const {
return 1 ; }
689 virtual bool hasAnalyticDerivative()
const {
return true ; }
694 inline const SplineBase& spline()
const {
return m_spline ; }
696 operator const SplineBase& ()
const {
return spline() ; }
701 GSLSplineInteg& operator=(
const GSLSplineInteg& ) ;
704 SplineBase m_spline ;
712 #endif // GAUDIMATH_SPLINES_H
Genfun::GaudiMathImplementation::NumericalDerivative Derivative
std::vector< double > Data1D
GaudiMath.h GaudiMath/GaudiMath.h.
Type
the list of available types for ntuples
std::vector< std::pair< double, double > > Data2D