#ifndef SHRIMPS_Ladders_Ladder_Generator_QT_H
#define SHRIMPS_Ladders_Ladder_Generator_QT_H

#include "SHRiMPS/Ladders/Ladder_Generator_Base.H"
#include "SHRiMPS/Ladders/Ladder.H"
#include "SHRiMPS/Cross_Sections/Sigma_Partonic.H"
#include "SHRiMPS/Beam_Remnants/Continued_PDF.H"
#include "MODEL/Main/Strong_Coupling.H"
#include "ATOOLS/Math/Random.H"
#include "ATOOLS/Math/Histogram.H"

namespace SHRIMPS {
  class Ladder_Generator_QT : public Ladder_Generator_Base {
  private:
    double           m_sigmahat, m_seff;
    ATOOLS::Vec4D    m_q[2], m_k[2], m_qini[2];
    ATOOLS::Flavour  m_flavs[2];
    ATOOLS::Poincare m_cms, m_zax;
    double           m_shat, m_yhat;
    
    bool     FixInitialPartons();
    Ladder * InitializeRescatterLadder(Ladder_Particle * parts[2]);
    bool     MakeTrialLadder(Ladder * ladder);
    Ladder * MakeRescatterLadder(LadderMap::iterator lit[2],TPropList::iterator & pit1);
    void     MergeLadders(Ladder * ladder,Ladder * rescatter,
			  LadderMap::iterator lit[2],TPropList::iterator pit);
    bool     TrialEmission(Ladder * ladder,size_t dir,const double & yhat=0);
    bool     LastEmissions(Ladder * ladder);
    void     AddEmission(Ladder * ladder,size_t dir,TPropList::iterator & pit);
    double   AbsorptionWeight(const ATOOLS::Vec4D & k,const double & y);
    double   MEWeight();
    bool     FixSimpleKinematics();
    void     SelectPropagatorColours(Ladder * ladder);
    void     CalculateWeight();
    
    double   QT2Min(size_t dir=2);
    double   QT2Max();
    ATOOLS::Vec4D MakeFSMomentum(size_t dir);
    ATOOLS::Vec4D MakePropMomentum(const double & qt2min,const double & qt2max,
				   Form_Factor * ff=NULL,const bool isrescatter=false);
  public:
    Ladder_Generator_QT();
    ~Ladder_Generator_QT() {}

    Ladder * operator()(const ATOOLS::Vec4D & pos);
    void   AddRescatters(Ladder * ladder);
  };
}
#endif