#ifndef AMEGIC_DipoleSubtraction_FF_DipoleSplitting_H
#define AMEGIC_DipoleSubtraction_FF_DipoleSplitting_H

#include "AMEGIC++/DipoleSubtraction/DipoleSplitting_Base.H"

namespace MODEL {
  class Model_Base;
}

namespace AMEGIC {

  class FF_DipoleSplitting : public DipoleSplitting_Base {
    double m_yijk;
    double m_zi,m_zj;
  public:
    FF_DipoleSplitting(ATOOLS::sbt::subtype st,
                       ATOOLS::spt::splittingtype ft,
                       int m,int i,int j,int k) :
      DipoleSplitting_Base(st,ft,ATOOLS::dpt::f_f,m,i,j,k),
      m_yijk(0.), m_zi(0.), m_zj(0.)
    {}
    
    void SetMomenta(const ATOOLS::Vec4D*);
    double GetValue();
    double GetDPSF()   {return m_yijk;}
    void CalcDiPolarizations();
  };

  class FF_MassiveDipoleSplitting : public DipoleSplitting_Base {
    double m_yijk, m_yp;
    double m_zi,m_zj;
    double m_zim,m_zjm;
    double m_mi2,m_mj2,m_mk2,m_mij2,m_Q2;
    double m_vijk,m_zpm;
    ATOOLS::Vec4D m_Q;
  public:
    FF_MassiveDipoleSplitting(ATOOLS::sbt::subtype st,
                              ATOOLS::spt::splittingtype ft,
                              int m,int i,int j,int k,
                              double mi, double mj, double mk, double mij) :
      DipoleSplitting_Base(st,ft,ATOOLS::dpt::f_fm,m,i,j,k),
      m_yijk(0.), m_yp(0.), m_zi(0.), m_zj(0.), m_zim(0.), m_zjm(0.),
      m_mi2(mi*mi), m_mj2(mj*mj), m_mk2(mk*mk), m_mij2(mij*mij),
      m_Q2(0.), m_vijk(0.), m_zpm(0.), m_Q(ATOOLS::Vec4D(0.,0.,0.,0.))
    {}
    
    void SetMomenta(const ATOOLS::Vec4D*);
    double GetValue();
    double GetDPSF()   {return m_yijk;}
    void CalcDiPolarizations();
  };
}
#endif