#include "DIRE/Shower/Lorentz_IF.H" #include "MODEL/Main/Single_Vertex.H" #include "DIRE/Shower/Kernel.H" #include "ATOOLS/Math/Random.H" using namespace ATOOLS; namespace DIRE { class FFFF_IF: public Lorentz_IF_123 { private: double m_jmax; public: inline FFFF_IF(const Kernel_Key &key): Lorentz_IF_123(key), m_jmax(5.0) {} double Value(const Splitting &s) const { if (m_fl[1].Kfcode()>p_sk->GF()->Nf(s)) return 0.0; double TR(0.5), B2(0.0); double s123(-s.m_t/s.m_z2-s.m_s+s.m_mj2); double cf(s.m_q2/(s.m_q2+s.m_t/s.m_z2+s.m_s-s.m_mj2-s.m_mk2)); double z3(1.0-s.m_z2/s.m_z*cf), z2((2.0*s.m_pl*s.m_pk)/s.m_q2*cf), z1(1.0-z2-z3); if (z1<1.0 || z2>0.0 || z3>0.0 || -s.m_q2/cfGF()->Coupling(s)/(2.0*M_PI); // desymmetrization if (m_fl[1]==m_fl[0].Bar()) B2*=(1.0-s.m_z2)/(1.0-s.m_z); return s.m_z*B2; } double Integral(const Splitting &s) const { double k(sqrt(s.m_t0/s.m_Q2)); double I=20.0/9.0*0.5*(atan(1.0/k)-atan(s.m_eta/k))/k; return I*p_sk->GF()->CplMax(s)/(2.0*M_PI)*m_jmax*PDFEstimate(s); } double Estimate(const Splitting &s) const { double E=20.0/9.0*0.5/(sqr(s.m_z)+s.m_t0/s.m_Q2); return E*p_sk->GF()->CplMax(s)/(2.0*M_PI)*m_jmax*PDFEstimate(s); } bool GeneratePoint(Splitting &s) const { double k(sqrt(s.m_t0/s.m_Q2)); s.m_z=k*tan(atan(1.0/k)-ran->Get()*(atan(1.0/k)-atan(s.m_eta/k))); s.m_phi=2.0*M_PI*ran->Get(); s.m_z2=pow(s.m_z,ran->Get()); double v(s.m_z/s.m_z2*ran->Get()); s.m_s=v/(s.m_z/s.m_z2-v)*(s.m_t/s.m_z2-s.m_mj2); s.m_phi2=2.0*M_PI*ran->Get(); s.m_mode=ran->Get()>0.5; return true; } };// end of class FFFF_IF }// end of namespace DIRE using namespace DIRE; DECLARE_GETTER(FFFF_IF,"IF_FFFF",Lorentz,Kernel_Key); Lorentz *ATOOLS::Getter:: operator()(const Parameter_Type &args) const { if (args.m_type!=1 || args.p_v) return NULL; if (args.m_lfid=="FFFF") { return new FFFF_IF(args); } return NULL; } void ATOOLS::Getter:: PrintInfo(std::ostream &str,const size_t width) const { str<<"FFFF Lorentz Function"; }