#include "PHASIC++/Channels/VHAAG_ND.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_s =.3; const double a1_sp =1.; const double s_sp1 =1.; const double s_sp2 =.5; const double a1_i =1.; const double a2_i =1.; const double s_i =1.; const double a1_iF =1.; const double a2_iF =.0; const double s_xx =.3; const bool ap =false; const bool apF=false; VHAAG_ND::VHAAG_ND(int _nin,int _nout,int pn, VHAAG_ND* 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); } void VHAAG_ND::Initialize(int _nin,int _nout,std::vector perm, VHAAG_ND* ovl) { m_nin=_nin; m_nout=_nout; Permutation pp(m_nin+m_nout-1); p_perm = new int[m_nin+m_nout]; p_mrep = new int[m_nin+m_nout]; p_perm[0] = p_mrep[0] = 0; msg_Tracking()<<"Init VHAAG_ND: 0"; m_name = "VHAAG_ND"; for (int i=1;i() ? 1 : 2 }; #ifdef USING__MPI size=mpi->Size(); #endif if (1) { if (p_sharedvegaslist[vs]==NULL) { p_sharedvegaslist[vs] = new Vegas(m_rannum,100,Name()); if (size<2) p_sharedvegaslist[vs]->SetAutoOptimize(Min(int(m_nout),5)*100); if (1) { if (m_type<2) { for (int i=0;i<=m_nout-3;i++) p_sharedvegaslist[vs]->ConstChannel(2+3*i); } else { for (int i=0;i<=m_type-2;i++) p_sharedvegaslist[vs]->ConstChannel(3+3*i); p_sharedvegaslist[vs]->ConstChannel(3*(m_type-1)+2); for (int i=0;iConstChannel(2+3*m_type+3*i); } p_sharedvegaslist[vs]->ConstChannel(m_rannum-1); } m_ownvegas = true; } p_vegas = p_sharedvegaslist[vs]; } else { m_ownvegas = true; p_vegas = new Vegas(m_rannum,100,Name()); if (size<2) p_vegas->SetAutoOptimize(500); } m_s0=-1.; } VHAAG_ND::~VHAAG_ND() { 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(); #endif } void VHAAG_ND::Optimize() { #ifdef USING__MPI if (mpi->Size()<2) return; if (m_ownvegas) p_vegas->Optimize(); #endif } void VHAAG_ND::AddPoint(double Value) { Single_Channel::AddPoint(Value); p_vegas->AddPoint(Value,p_rans); } double VHAAG_ND::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_ND::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-1)*(n1-2)/2)*m_s0; double s2min = double((n2-1)*(n2-2)/2)*m_s0; double s1max = sqr(sqrt(s)-sqrt(s2min)); double exp = s_sp1; if (s1min==0.) exp = s_xx; double s1 = CE.MasslessPropMomenta(exp,s1min,s1max,ran[0]); exp = s_sp2; if (s2min==0.) exp = s_xx; double s2max = sqr(sqrt(s)-sqrt(s1)); 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 = pb0-pb;//Max(0.5*m_s0*(n1-1)/(q1*q2),pb0-pb); double a1max = pb0+pb;//Min(1.-0.5*m_s0*(n2-1)/(q1*q2),pb0+pb); //to check!!! exp = a1_sp; if (a1min==0.) exp = s_xx; double a1 = CE.MasslessPropMomenta(exp,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_ND::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_ND_Channel_Generator(args); } void ATOOLS::Getter:: PrintInfo(std::ostream &str,const size_t width) const { str<<"Vegas-improved HAAG integrator"; }