Splines.h
Go to the documentation of this file.
1 #ifndef GAUDIMATH_SPLINES_H
2 #define GAUDIMATH_SPLINES_H 1
3 // ============================================================================
4 // Include files
5 // ============================================================================
6 // STD/STL
7 // ============================================================================
8 #include <vector>
9 #include <utility>
10 #include <algorithm>
11 #include <memory>
12 // ============================================================================
13 // from CLHEP
14 // ============================================================================
15 #include "CLHEP/GenericFunctions/GenericFunctions.hh"
16 #include "CLHEP/GenericFunctions/Argument.hh"
17 #include "CLHEP/GenericFunctions/AbsFunction.hh"
18 // ============================================================================
19 // GaudiGSL/GaudiMath
20 // ============================================================================
22 // ============================================================================
23 // GSL
24 // ============================================================================
25 #include "gsl/gsl_interp.h"
26 #include "gsl/gsl_spline.h"
27 // ============================================================================
28 #include "GaudiKernel/Kernel.h"
29 
30 namespace Genfun
31 {
32  namespace GaudiMathImplementation
33  {
34 
36  {
37  public:
40  public:
47  ( const Data1D& x ,
48  const Data1D& y ,
55  ( const Data2D& data ,
63  template <class DATAX, class DATAY>
66  DATAX begin_x ,
67  DATAX end_x ,
68  DATAY begin_y )
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 ] )
72  , m_type ( type )
73  {
74  std::copy ( begin_x , end_x , m_x.get() ) ;
75  std::copy ( begin_y , begin_y + ( end_x - begin_x ) , m_y.get() ) ;
76  }
84  template <class DATA>
87  DATA begin ,
88  DATA end )
89  : m_dim ( end - begin )
90  , m_x ( new double[ end - begin ] )
91  , m_y ( new double[ end - begin ] )
92  , m_type ( type )
93  {
94  double* _x = m_x.get() ;
95  double* _y = m_y.get() ;
96  for ( auto it = begin ; end != it ; ++ it )
97  {
98  *_x++ = it -> first ;
99  *_y++ = it -> second ;
100  };
101  }
103  SplineBase( const SplineBase& ) ;
105  virtual ~SplineBase();
106  public:
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 ;
115  protected:
116  // initialize
117  void initialize () const ;
118  private:
119  // default constructor is disabled
120  SplineBase() = delete;
121  // assigenement operator is disabled
122  SplineBase& operator=( const SplineBase& ) = delete;
123  private:
124  mutable bool m_init = false;
125  size_t m_dim ;
128  mutable gsl_spline* m_spline = nullptr;
129  mutable gsl_interp_accel* m_accel = nullptr;
131  };
132 
133  class GAUDI_API GSLSpline : public AbsFunction
134  {
135  public:
138  public:
140  FUNCTION_OBJECT_DEF( GSLSpline )
141  public:
162  GSLSpline
163  ( const Data1D& x ,
164  const Data1D& y ,
165  const GaudiMath::Interpolation::Type type ) ;
184  GSLSpline
185  ( const Data2D& data ,
186  const GaudiMath::Interpolation::Type type ) ;
213  template <class DATAX, class DATAY>
214  GSLSpline
215  ( const GaudiMath::Interpolation::Type type ,
216  DATAX begin_x ,
217  DATAX end_x ,
218  DATAY begin_y )
219  : AbsFunction ( )
220  , m_spline( type , begin_x , end_x , begin_y )
221  {}
233  template <class DATA>
234  GSLSpline
236  DATA begin ,
237  DATA end )
238  : AbsFunction ( )
239  , m_spline( type , begin , end )
240  {}
242  GSLSpline ( const SplineBase& ) ;
244  GSLSpline ( const GSLSpline& ) ;
246  virtual ~GSLSpline() ;
247  public:
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 ; }
256  virtual Genfun::Derivative partial( unsigned int i ) const ;
257  public:
259  inline const SplineBase& spline() const { return m_spline ; }
261  operator const SplineBase& () const { return spline() ; }
262  private:
264  GSLSpline() = delete;
266  GSLSpline& operator=( const GSLSpline& ) = delete;
267  private:
268  // the actual spline function
270  };
271 
272  class GAUDI_API GSLSplineDeriv : public AbsFunction
273  {
274  public:
277  public:
279  FUNCTION_OBJECT_DEF( GSLSplineDeriv )
280  public:
302  ( const Data1D& x ,
303  const Data1D& y ,
304  const GaudiMath::Interpolation::Type type ) ;
324  ( const Data2D& data ,
325  const GaudiMath::Interpolation::Type type ) ;
352  template <class DATAX, class DATAY>
354  ( const GaudiMath::Interpolation::Type type ,
355  DATAX begin_x ,
356  DATAX end_x ,
357  DATAY begin_y )
358  : AbsFunction ( )
359  , m_spline( type , begin_x , end_x , begin_y )
360  {}
372  template <class DATA>
375  DATA begin ,
376  DATA end )
377  : AbsFunction ( )
378  , m_spline( type , begin , end )
379  {}
381  GSLSplineDeriv ( const SplineBase& ) ;
383  GSLSplineDeriv ( const GSLSplineDeriv& ) ;
385  ~GSLSplineDeriv() override;
386  public:
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 ; }
395  Genfun::Derivative partial( unsigned int i ) const override ;
396  public:
398  inline const SplineBase& spline() const { return m_spline ; }
400  operator const SplineBase& () const { return spline() ; }
401  private:
403  GSLSplineDeriv() ;
405  GSLSplineDeriv& operator=( const GSLSplineDeriv& ) ;
406  private:
407  // the actual spline function
409  };
410 
411  class GAUDI_API GSLSplineDeriv2 : public AbsFunction
412  {
413  public:
416  public:
418  FUNCTION_OBJECT_DEF( GSLSplineDeriv2 )
419  public:
441  ( const Data1D& x ,
442  const Data1D& y ,
443  const GaudiMath::Interpolation::Type type ) ;
463  ( const Data2D& data ,
464  const GaudiMath::Interpolation::Type type ) ;
491  template <class DATAX, class DATAY>
493  ( const GaudiMath::Interpolation::Type type ,
494  DATAX begin_x ,
495  DATAX end_x ,
496  DATAY begin_y )
497  : AbsFunction ( )
498  , m_spline( type , begin_x , end_x , begin_y )
499  {}
511  template <class DATA>
514  DATA begin ,
515  DATA end )
516  : AbsFunction ( )
517  , m_spline( type , begin , end )
518  {}
520  GSLSplineDeriv2 ( const SplineBase& ) ;
522  GSLSplineDeriv2 ( const GSLSplineDeriv2& ) ;
524  ~GSLSplineDeriv2() override;
525  public:
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 ; }
534  Genfun::Derivative partial( unsigned int i ) const override;
535  public:
537  inline const SplineBase& spline() const { return m_spline ; }
539  operator const SplineBase& () const { return spline() ; }
540  private:
542  GSLSplineDeriv2() = delete;
544  GSLSplineDeriv2& operator=( const GSLSplineDeriv2& ) = delete;
545  private:
546  // the actual spline function
548  };
549 
550 
551  class GAUDI_API GSLSplineInteg : public AbsFunction
552  {
553  public:
556  public:
558  FUNCTION_OBJECT_DEF( GSLSplineInteg )
559  public:
581  ( const Data1D& x ,
582  const Data1D& y ,
583  const GaudiMath::Interpolation::Type type ,
584  const double low = 0 ) ;
605  ( const Data2D& data ,
606  const GaudiMath::Interpolation::Type type ,
607  const double low = 0 ) ;
635  template <class DATAX, class DATAY>
637  ( const GaudiMath::Interpolation::Type type ,
638  DATAX begin_x ,
639  DATAX end_x ,
640  DATAY begin_y ,
641  const double low )
642  : AbsFunction ( )
643  , m_spline ( type , begin_x , end_x , begin_y )
644  , m_low ( low )
645  {}
658  template <class DATA>
661  DATA&& begin ,
662  DATA&& end ,
663  const double low )
664  : m_spline ( type , std::forward<DATA>(begin) , std::forward<DATA>(end) )
665  , m_low ( low )
666  {}
668  GSLSplineInteg ( const SplineBase& ,
669  const double low = 0 ) ;
671  GSLSplineInteg ( const GSLSplineInteg& ) ;
673  ~GSLSplineInteg () override;
674  public:
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 ; }
683  Genfun::Derivative partial( unsigned int i ) const override;
684  public:
686  inline const SplineBase& spline() const { return m_spline ; }
688  operator const SplineBase& () const { return spline() ; }
689  private:
691  GSLSplineInteg () = delete;
693  GSLSplineInteg& operator=( const GSLSplineInteg& ) = delete;
694  private:
695  // the actual spline function
697  double m_low ;
698  };
699 
700  }
701 }
702 
703 #endif // GAUDIMATH_SPLINES_H
704 // ============================================================================
const SplineBase & spline() const
acess to the spline function
Definition: Splines.h:686
T copy(T...args)
def initialize()
Definition: AnalysisTest.py:12
virtual unsigned int dimensionality() const
Definition: Splines.h:252
const SplineBase & spline() const
acess to the spline function
Definition: Splines.h:259
const SplineBase & spline() const
acess to the spline function
Definition: Splines.h:398
virtual bool hasAnalyticDerivative() const
Does this function have an analytic derivative?
Definition: Splines.h:254
std::unique_ptr< double[]> m_y
Definition: Splines.h:127
Genfun::GaudiMathImplementation::NumericalDerivative Derivative
Definition: GaudiMath.h:29
bool hasAnalyticDerivative() const override
Does this function have an analytic derivative?
Definition: Splines.h:532
bool hasAnalyticDerivative() const override
Does this function have an analytic derivative?
Definition: Splines.h:393
auto begin(reverse_wrapper< T > &w)
Definition: reverse.h:45
constexpr double second
string type
Definition: gaudirun.py:151
unsigned int dimensionality() const override
Definition: Splines.h:530
GaudiMath::Interpolation::Type m_type
Definition: Splines.h:130
std::unique_ptr< double[]> m_x
Definition: Splines.h:126
auto end(reverse_wrapper< T > &w)
Definition: reverse.h:47
bool hasAnalyticDerivative() const override
Does this function have an analytic derivative?
Definition: Splines.h:681
#define class
unsigned int dimensionality() const override
Definition: Splines.h:391
GaudiMath.h GaudiMath/GaudiMath.h.
Definition: Adapters.h:13
unsigned int dimensionality() const override
Definition: Splines.h:679
CLHEP.
Definition: IEqSolver.h:13
const SplineBase & spline() const
acess to the spline function
Definition: Splines.h:537
#define GAUDI_API
Definition: Kernel.h:107
list i
Definition: ana.py:128
Type
the list of available types for ntuples
Definition: TupleObj.h:79
std::vector< std::pair< double, double > > Data2D
Definition: Splines.h:39