#ifndef PHASIC_Channels_Simple_Pole_Channels_H
#define PHASIC_Channels_Simple_Pole_Channels_H

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

namespace PHASIC {
  class Simple_Pole_RelicDensity: public ISR_Channel_Base {
  protected:
    double m_exponent;
    bool   m_zchannel;
    ATOOLS::Info_Key m_spkey, m_sgridkey;
  public:
    Simple_Pole_RelicDensity(const double exponent,const std::string cinfo,
            ATOOLS::Integration_Info *info);
    void GeneratePoint(const double *rans);
      void GenerateWeight(const int & mode=0);
  };

  class Simple_Pole_DM_Annihilation: public ISR_Channel_Base {
  protected:
    double m_exponent, m_mass[2];
    bool   m_zchannel;
    ATOOLS::Info_Key m_spkey, m_sgridkey, m_xkey, m_xgridkey, m_cosxikey, m_cosgridkey;
  public:
    Simple_Pole_DM_Annihilation(const double exponent, const double mass1,
				const double mass2, const std::string cinfo,
				ATOOLS::Integration_Info *info);
    void GeneratePoint(const double *rans);
    void GenerateWeight(const int & mode=0);
  };

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

  class Simple_Pole_Uniform: public ISR_Channel_Base {
  protected:
    double m_exponent;
    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:
    Simple_Pole_Uniform(const double exponent,const std::string cinfo,
			ATOOLS::Integration_Info *info,const size_t mode=0);
    void GeneratePoint(const double *rans);
    void GenerateWeight(const int & mode=0);
  };

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

  class Simple_Pole_Central: public ISR_Channel_Base {
  protected:
    double m_exponent;
    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:
    Simple_Pole_Central(const double exponent,const std::string cinfo,
			ATOOLS::Integration_Info *info,const size_t mode=0);
    void GeneratePoint(const double *rans);
    void GenerateWeight(const int & mode=0);
  };

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

  class Simple_Pole_Forward: public ISR_Channel_Base {
  protected :
    double m_sexponent, 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 :
    Simple_Pole_Forward(const double sexponent,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);
  };

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

  class Simple_Pole_Backward: public ISR_Channel_Base {
  protected :
    double m_sexponent, 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 :
    Simple_Pole_Backward(const double sexponent,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);
  };
}
#endif