#include "HADRONS++/PS_Library/Two_Body_PSs.H"
#include "PHASIC++/Channels/Channel_Elements.H"
#include "PHASIC++/Channels/Channel_Basics.H"
#include "ATOOLS/Org/Message.H"

using namespace HADRONS; 
using namespace PHASIC; 
using namespace ATOOLS; 
using namespace std; 

Iso2Channel::Iso2Channel(const ATOOLS::Flavour * fl) :
  Single_Channel(1,2,fl),
  m_decvec(Vec4D(fl[0].HadMass(),0.,0.,0.))
{
  for (short int i=0;i<nin+nout;i++) ms[i] = ATOOLS::sqr(fl[i].HadMass());
														// get masses^2
  msg_Tracking()<<"Init Iso2Channel("
	   <<fl[0]<<"->"<<fl[1]<<" "<<fl[2]<<", "
	   <<ms[0]<<"->"<<ms[1]<<" "<<ms[2]<<")"<<endl;
  rannum = 2;
  rans   = new double[rannum];
}


void Iso2Channel::GeneratePoint(ATOOLS::Vec4D * p,PHASIC::Cut_Data *,double * _ran)
{
  CE.Isotropic2Momenta(p[0],ms[1],ms[2],p[1],p[2],_ran[0],_ran[1]);
}


void Iso2Channel::GenerateWeight(ATOOLS::Vec4D * p,PHASIC::Cut_Data *)
{
  double d1, d2;
  weight = 1. / ( CE.Isotropic2Weight(p[1],p[2],d1,d2) * pow(2.*M_PI,2.*3.-4.) );
}


Iso1Channel::Iso1Channel(const ATOOLS::Flavour * fl) :
  Single_Channel(1,1,fl)
{
  msg_Tracking()<<"Init Iso1Channel("
           <<fl[0]<<"->"<<fl[1]<<endl;
}


void Iso1Channel::GeneratePoint(ATOOLS::Vec4D * p,PHASIC::Cut_Data *,double * _ran)
{
  p[1]=p[0];
}


void Iso1Channel::GenerateWeight(ATOOLS::Vec4D * p,PHASIC::Cut_Data *)
{
  weight = 1.0;
}