#ifndef FCT1DFIT_SEEN
#define FCT1DFIT_SEEN

#include "generalfit.h"

namespace SOPHYA {

//================================================================
// CLASSES DE FONCTIONS 1D AVEC PARAMETRES POUR LE FIT
//================================================================

//////////////////////////////////////////////////////////////////
//! Gaussienne + polynome
class Gauss1DPol : public GeneralFunction {
public:
  Gauss1DPol(unsigned int ndegpol,bool polcenter=false);
  Gauss1DPol(bool polcenter=false);
  virtual ~Gauss1DPol();

  virtual double Value(double const xp[], double const* Par);
  virtual double Val_Der(double const xp[],double const* Par,double* DgDpar);

  inline int NDegP() const {return NDegPol;}

protected:
  int NDegPol;    // degre du polynome
  bool PolCenter; // centrage du polynome
};

//////////////////////////////////////////////////////////////////
//! Gaussienne_Normalisee+polynome
class GaussN1DPol : public GeneralFunction {
public:
  GaussN1DPol(unsigned int ndegpol,bool polcenter=false);
  GaussN1DPol(bool polcenter=false);
  virtual ~GaussN1DPol();

  virtual double Value(double const xp[], double const* Par);
  virtual double Val_Der(double const xp[],double const* Par,double* DgDpar);

  inline int NDegP() const {return NDegPol;}

protected:
  int NDegPol;    // degre du polynome
  bool PolCenter; // centrage du polynome
};

//////////////////////////////////////////////////////////////////
//! Exponentielle + polynome
class Exp1DPol : public GeneralFunction {
public:
  Exp1DPol(unsigned int ndegpol,double x0=0.);
  Exp1DPol(double x0=0.);
  virtual ~Exp1DPol();

  virtual double Value(double const xp[], double const* Par);
  virtual double Val_Der(double const xp[],double const* Par,double* DgDpar);

  inline int NDegP() const {return NDegPol;}
  inline double XCenter() {return X_Center;}

protected:
  int NDegPol;     // degre du polynome
  double X_Center; // Centrage en X pour stabilitee
};

//////////////////////////////////////////////////////////////////
//! polynome 1D
class Polyn1D : public GeneralFunction {
public:
  Polyn1D(unsigned int ndegpol,double x0=0.);
  virtual ~Polyn1D();

  virtual double Value(double const xp[], double const* Par);
  virtual double Val_Der(double const xp[],double const* Par,double* DgDpar);

  inline int NDegP() const {return NDegPol;}
  inline double XCenter() {return X_Center;}

protected:
  int NDegPol;     // degre du polynome
  double X_Center; // Centrage en X pour stabilitee
};

//////////////////////////////////////////////////////////////////
//! Analyse harmonique
class HarmonieNu : public GeneralFunction {
public:
  HarmonieNu(unsigned int nharm=0, double t0=0.);
  virtual ~HarmonieNu();

  virtual double Value(double const xp[], double const* Par);
  virtual double Val_Der(double const xp[],double const* Par,double* DgDpar);

  inline int NHarmonic()  {return NHarm;}
  inline double  T0Center() const {return T0;}
  inline double& T0Center()       {return T0;}

protected:
  int NHarm;
  double T0;
};

//////////////////////////////////////////////////////////////////
//! Analyse harmonique
class HarmonieT : public GeneralFunction {
public:
  HarmonieT(unsigned int nharm=0, double t0=0.);
  virtual ~HarmonieT();

  virtual double Value(double const xp[], double const* Par);
  virtual double Val_Der(double const xp[],double const* Par,double* DgDpar);

  inline int NHarmonic()  {return NHarm;}
  inline double  T0Center() const {return T0;}
  inline double& T0Center()       {return T0;}

protected:
  int NHarm;
  double T0;
};

//================================================================
// CLASSES DE FONCTIONS 2D AVEC PARAMETRES POUR LE FIT
//================================================================

//////////////////////////////////////////////////////////////////
//! polynome 2D
class Polyn2D : public GeneralFunction {
public:
  Polyn2D(unsigned int ndegpol,double x0=0.,double y0=0.);
  virtual ~Polyn2D();

  virtual double Value(double const xp[], double const* Par);
  virtual double Val_Der(double const xp[],double const* Par,double* DgDpar);

  inline int NDegP() const {return NDegPol;}

protected:
  int NDegPol;     // degre du polynome
  double X_Center; // Centrage en X pour stabilitee
  double Y_Center; // Centrage en Y pour stabilitee
};

} // Fin du namespace

#endif
