#include "PHASIC++/Channels/VHAAG.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Org/Scoped_Settings.H" #include "ATOOLS/Math/Random.H" #include "ATOOLS/Math/Permutation.H" #include "ATOOLS/Math/Poincare.H" #include "PHASIC++/Channels/Channel_Elements.H" #include "PHASIC++/Channels/FSR_Channel.H" #include "PHASIC++/Channels/Channel_Generator.H" #include "PHASIC++/Process/Process_Base.H" #include "PHASIC++/Channels/Multi_Channel.H" #include "ATOOLS/Org/My_MPI.H" #include using namespace PHASIC; using namespace ATOOLS; const double a1_s =1.5; const double s_s0o =.7; const double s_s0d =-.1; const double s_s1o =1.2; const double s_s1d =-0.3; const double a1_sp =1.; const double s_sp1 =1.; const double s_sp2o =.9; const double s_sp2d =-.2; const double a1_i =1.; const double a2_i =1.; const double s_io =1.3; const double s_id =-0.3; const double a1_iF =.7; const double a2_iF =.0; const bool ap =false; const bool apF=false; VHAAG::VHAAG(int _nin,int _nout,int pn, VHAAG* ovl) { Permutation pp(_nin+_nout-1); int* tp=pp.Get(pn); std::vector perm(_nin+_nout); perm[0] = 0; for (int i=1;i<_nin+_nout;i++) perm[i] = tp[i-1]+1; Initialize(_nin,_nout,perm,ovl); } VHAAG::VHAAG(int _nin,int _nout,std::vector tp, VHAAG* ovl) { size_t zero(0); for (;zero perm(tp.size()); for (size_t i(0);i perm, VHAAG* ovl) { nin=_nin; nout=_nout; Permutation pp(nin+nout-1); p_perm = new int[nin+nout]; p_mrep = new int[nin+nout]; p_perm[0] = p_mrep[0] = 0; msg_Tracking()<<"Init VHAAG: 0"; name = "VHAAG"; char hlp[4]; for (int i=1;iGetSharedVegasList(); else p_sharedvegaslist = NULL; if (p_sharedvegaslist==NULL) { p_sharedvegaslist = new Vegas*[nout]; for (int i=0;i(); } VHAAG::~VHAAG() { delete[] p_perm; delete[] p_mrep; delete[] m_q; if (m_ownvegas) { delete p_vegas; if (p_sharedvegaslist) p_sharedvegaslist[m_type]=0; } if (p_sharedvegaslist) { int empty=1; for (int i=0;iMPISync(); } void VHAAG::Optimize() { if (m_ownvegas) p_vegas->Optimize(); } void VHAAG::AddPoint(double Value) { Single_Channel::AddPoint(Value); p_vegas->AddPoint(Value,rans); } double VHAAG::PiFunc(double a1,double a2, double s1b,double s2b,double c) { return 4.*(1.-c*c)*((1.-a2+s2b-s1b)*a2-s2b) -sqr((1.-2.*a1+s1b-s2b)+(1.-2.*a2-s1b+s2b)*c); } void VHAAG::Split(ATOOLS::Vec4D q1,ATOOLS::Vec4D q2, ATOOLS::Vec4D& p1,ATOOLS::Vec4D& p2,int n1, int n2,double *ran) { double s = (q1+q2).Abs2(); double s1min = double(n1*(n1-1)/2)*m_s0; double s2min = double(n2*(n2-1)/2)*m_s0; double s1max = Min(s-double(n2*(n2+2*n1-1)/2)*m_s0,sqr(sqrt(s)-sqrt(s2min))); double s1 = CE.MasslessPropMomenta(s_sp1,s1min,s1max,ran[0]); double s2max = Min(s-s1-double(n1*n2)*m_s0,sqr(sqrt(s)-sqrt(s1))); double exp = s_sp2o+double(Max(n1,n2))*s_sp2d; double s2 = CE.MasslessPropMomenta(exp,s2min,s2max,ran[1]); double pb0 =0.5*(s+s1-s2)/s; double pb =sqrt(pb0*pb0-s1/s); double a1min = Max(0.5*m_s0*n1/(q1*q2),pb0-pb); double a1max = Min(1.-0.5*m_s0*n2/(q1*q2),pb0+pb); //to check!!! double a1 = CE.MasslessPropMomenta(a1_sp,a1min,a1max,ran[2]); double phi=2.*M_PI*ran[3]; ConstructMomenta(a1,phi,s1,s2,s,q1,p1,p2); // std::cout<<"Split generated: "<Get()<0.5) eps=-eps; Vec3D pv = a*e1+b*e2+eps*ee; p1 = Vec4D(sqrt(ps+s1),pv); p2 = Vec4D(sqrt(ps+s2),-1.*pv); } void VHAAG::ConstructMomenta(double a1,double phi, double s1,double s2,double s, ATOOLS::Vec4D q1,ATOOLS::Vec4D& p1,ATOOLS::Vec4D& p2) { double ps = 0.25*(sqr(s-s1-s2)-4.*s1*s2)/s; if (q1.PPerp()!=0.) { msg_Error()<<" Error in"<:: operator()(const Channel_Generator_Key &args) const { return new VHAAG_Channel_Generator(args); } void ATOOLS::Getter:: PrintInfo(std::ostream &str,const size_t width) const { str<<"Vegas-improved HAAG integrator"; }