#ifndef PHASIC_Channels_Threshold_Channels_H
#define PHASIC_Channels_Threshold_Channels_H

#include "PHASIC++/Channels/ISR_Channel_Base.H"
#include "PHASIC++/Channels/Vegas.H"


namespace PHASIC {
  class Threshold_Uniform: public ISR_Channel_Base {
  protected:
    double m_mass,m_sexp;
    bool   m_zchannel;
    size_t m_mode;
    ATOOLS::Info_Key m_spkey, m_xkey, m_ykey, m_sgridkey, m_ygridkey;
    ATOOLS::Info_Key m_kp1key, m_kp2key;
  public:
    Threshold_Uniform(const double mass,const double sexp,
		      const std::string cinfo,ATOOLS::Integration_Info *info,
		      const size_t mode=0);
    void GeneratePoint(const double *rans);
    void GenerateWeight(const int & mode=0);
    inline void   SetMass(const double mass) { m_mass=mass; }
    inline double Mass() const { return m_mass; }
  };

  ////////////////////////////////////////////////////////////////////////

  class Threshold_Forward: public ISR_Channel_Base {
  protected :
    double m_mass,m_sexp, m_yexponent;
    bool   m_zchannel;
    size_t m_mode;
    ATOOLS::Info_Key m_spkey, m_xkey, m_ykey, m_sgridkey, m_ygridkey;
    ATOOLS::Info_Key m_kp1key, m_kp2key;
  public :
    Threshold_Forward(const double mass,const double sexp,
		      const double yexponent,
		      const std::string cinfo,ATOOLS::Integration_Info *info,
		      const size_t mode=0);
    void GeneratePoint(const double *rans);
    void GenerateWeight(const int & mode=0);
    inline void   SetMass(const double mass) { m_mass=mass; }
    inline const double Mass()         const { return m_mass; }
  };

  ////////////////////////////////////////////////////////////////////////

  class Threshold_Backward: public ISR_Channel_Base {
  protected :
    double m_mass,m_sexp, m_yexponent;
    bool   m_zchannel;
    size_t m_mode;
    ATOOLS::Info_Key m_spkey, m_xkey, m_ykey, m_sgridkey, m_ygridkey;
    ATOOLS::Info_Key m_kp1key, m_kp2key;
  public :
    Threshold_Backward(const double mass,const double sexp,
		       const double yexponent,
		       const std::string cinfo,ATOOLS::Integration_Info *info,
		       const size_t mode=0);
    void GeneratePoint(const double *rans);
    void GenerateWeight(const int & mode=0);
    inline void   SetMass(const double mass) { m_mass=mass; }
    inline const double Mass()         const { return m_mass; }
  };

  ////////////////////////////////////////////////////////////////////////

  class Threshold_Central: public ISR_Channel_Base {
  protected:
    double m_mass,m_sexp;
    bool   m_zchannel;
    size_t m_mode;
    ATOOLS::Info_Key m_spkey, m_xkey, m_ykey, m_sgridkey, m_ygridkey;
    ATOOLS::Info_Key m_kp1key, m_kp2key;
  public:
    Threshold_Central(const double mass,const double sexp,
		      const std::string cinfo,ATOOLS::Integration_Info *info,
		      const size_t mode=0);
    void GeneratePoint(const double *rans);
    void GenerateWeight(const int & mode=0);
    inline void   SetMass(const double mass) { m_mass=mass; }
    inline const double Mass()         const { return m_mass; }
  };

}
#endif