#ifndef MODEL_Main_Strong_Coupling_H
#define MODEL_Main_Strong_Coupling_H

#include "MODEL/Main/Running_AlphaS.H"
#include "ATOOLS/Math/Function_Base.H"
#include "ATOOLS/Org/Return_Value.H"

namespace MODEL {

  struct asform {
    enum code {
      constant     = 0,
      frozen       = 1,
      smooth       = 2,
      IR0          = 3,
      GDH_inspired = 10
    };
  };

  class Strong_Coupling : public ATOOLS::Function_Base {
  private:
    Running_AlphaS * p_as; 
    asform::code     m_form;
    double           m_pt02;
    double           m_beta0, m_Lambda, m_Lambda2, m_kappa2, m_pt2max;
    //m_Qas2,m_maxalphaS
    double       m_lastpt2, m_asmax, m_eta;
    double       m_gamma, m_a, m_b, m_c, m_d, m_m2;
    double mg2(const double) const;
    double n(const double)   const;
  public:
    Strong_Coupling(Running_AlphaS * as,const asform::code & asf,
		    const double & pt02);
    double operator()(double q2,bool reweight=false) const;     
    double Weight(const double & pt2,const bool & noless=false) const { 
      return (*this)(noless?ATOOLS::Max(m_pt02,pt2):pt2)/m_asmax; 
    }
    double MaxValue() const { return m_asmax; }
    double PT02()     const { return m_pt02; }
    asform::code Form() const { return m_form; }
  };
}

#endif