1 #ifndef GAUDIMATH_SPLINES_H
2 #define GAUDIMATH_SPLINES_H 1
15 #include "CLHEP/GenericFunctions/GenericFunctions.hh"
16 #include "CLHEP/GenericFunctions/Argument.hh"
17 #include "CLHEP/GenericFunctions/AbsFunction.hh"
21 #include "GaudiMath/Interpolation.h"
25 #include "gsl/gsl_interp.h"
26 #include "gsl/gsl_spline.h"
28 #include "GaudiKernel/Kernel.h"
32 namespace GaudiMathImplementation
38 typedef std::vector<double> Data1D ;
39 typedef std::vector<std::pair<double,double> > Data2D ;
55 (
const Data2D& data ,
63 template <
class DATAX,
class DATAY>
69 : m_dim ( end_x - begin_x )
70 , m_x ( new double[ end_x - begin_x ] )
71 , m_y ( new double[ end_x - begin_x ] )
74 std::copy ( begin_x , end_x , m_x.get() ) ;
75 std::copy ( begin_y , begin_y + ( end_x - begin_x ) , m_y.get() ) ;
89 : m_dim ( end - begin )
90 , m_x ( new double[ end - begin ] )
91 , m_y ( new double[ end - begin ] )
94 double* _x = m_x.get() ;
95 double* _y = m_y.get() ;
96 for (
auto it = begin ; end != it ; ++ it )
103 SplineBase(
const SplineBase& ) ;
105 virtual ~SplineBase();
108 double eval (
const double x )
const ;
110 double deriv (
const double x )
const ;
112 double deriv2 (
const double x )
const ;
114 double integ (
const double a ,
const double b )
const ;
120 SplineBase() =
delete;
122 SplineBase& operator=(
const SplineBase& ) =
delete;
124 mutable bool m_init =
false;
126 std::unique_ptr<double[]> m_x ;
127 std::unique_ptr<double[]> m_y ;
128 mutable gsl_spline* m_spline =
nullptr;
129 mutable gsl_interp_accel* m_accel =
nullptr;
133 class GAUDI_API GSLSpline :
public AbsFunction
140 FUNCTION_OBJECT_DEF( GSLSpline )
185 ( const Data2D& data ,
220 , m_spline( type , begin_x , end_x , begin_y )
233 template <
class DATA>
239 , m_spline( type , begin , end )
242 GSLSpline (
const SplineBase& ) ;
244 GSLSpline (
const GSLSpline& ) ;
246 virtual ~GSLSpline() ;
249 virtual double operator() (
double a )
const ;
251 virtual double operator() (
const Argument& x )
const ;
252 virtual unsigned int dimensionality ()
const {
return 1 ; }
254 virtual bool hasAnalyticDerivative()
const {
return true ; }
259 inline const SplineBase& spline()
const {
return m_spline ; }
261 operator const SplineBase& ()
const {
return spline() ; }
264 GSLSpline() =
delete;
266 GSLSpline& operator=(
const GSLSpline& ) =
delete;
269 SplineBase m_spline ;
272 class GAUDI_API GSLSplineDeriv :
public AbsFunction
279 FUNCTION_OBJECT_DEF( GSLSplineDeriv )
324 ( const Data2D& data ,
359 , m_spline( type , begin_x , end_x , begin_y )
372 template <
class DATA>
378 , m_spline( type , begin , end )
381 GSLSplineDeriv (
const SplineBase& ) ;
383 GSLSplineDeriv (
const GSLSplineDeriv& ) ;
385 ~GSLSplineDeriv()
override;
388 double operator() (
double a )
const override;
390 double operator() (
const Argument& x )
const override;
391 unsigned int dimensionality ()
const override {
return 1 ; }
393 bool hasAnalyticDerivative()
const override {
return true ; }
398 inline const SplineBase& spline()
const {
return m_spline ; }
400 operator const SplineBase& ()
const {
return spline() ; }
405 GSLSplineDeriv& operator=(
const GSLSplineDeriv& ) ;
408 SplineBase m_spline ;
411 class GAUDI_API GSLSplineDeriv2 :
public AbsFunction
418 FUNCTION_OBJECT_DEF( GSLSplineDeriv2 )
463 ( const Data2D& data ,
498 , m_spline( type , begin_x , end_x , begin_y )
511 template <
class DATA>
517 , m_spline( type , begin , end )
520 GSLSplineDeriv2 (
const SplineBase& ) ;
522 GSLSplineDeriv2 (
const GSLSplineDeriv2& ) ;
524 ~GSLSplineDeriv2()
override;
527 double operator() (
double a )
const override;
529 double operator() (
const Argument& x )
const override;
530 unsigned int dimensionality ()
const override {
return 1 ; }
532 bool hasAnalyticDerivative()
const override {
return true ; }
537 inline const SplineBase& spline()
const {
return m_spline ; }
539 operator const SplineBase& ()
const {
return spline() ; }
542 GSLSplineDeriv2() =
delete;
544 GSLSplineDeriv2& operator=(
const GSLSplineDeriv2& ) =
delete;
547 SplineBase m_spline ;
551 class GAUDI_API GSLSplineInteg :
public AbsFunction
558 FUNCTION_OBJECT_DEF( GSLSplineInteg )
584 const
double low = 0 ) ;
605 ( const Data2D& data ,
607 const
double low = 0 ) ;
643 , m_spline ( type , begin_x , end_x , begin_y )
658 template <
class DATA>
664 : m_spline ( type ,
std::forward<DATA>(begin) ,
std::forward<DATA>(end) )
668 GSLSplineInteg (
const SplineBase& ,
669 const double low = 0 ) ;
671 GSLSplineInteg (
const GSLSplineInteg& ) ;
673 ~GSLSplineInteg ()
override;
676 double operator() (
double a )
const override;
678 double operator() (
const Argument& x )
const override;
679 unsigned int dimensionality ()
const override {
return 1 ; }
681 bool hasAnalyticDerivative()
const override {
return true ; }
686 inline const SplineBase& spline()
const {
return m_spline ; }
688 operator const SplineBase& ()
const {
return spline() ; }
691 GSLSplineInteg () =
delete;
693 GSLSplineInteg& operator=(
const GSLSplineInteg& ) =
delete;
696 SplineBase m_spline ;
703 #endif // GAUDIMATH_SPLINES_H
auto begin(reverse_wrapper< T > &w)
Genfun::GaudiMathImplementation::NumericalDerivative Derivative
std::vector< double > Data1D
auto end(reverse_wrapper< T > &w)
GaudiMath.h GaudiMath/GaudiMath.h.
Type
the list of available types for ntuples
std::vector< std::pair< double, double > > Data2D