#include "PHASIC++/Process/Massive_Kernels.H" #include "ATOOLS/Math/MathTools.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Phys/Flavour.H" #include "ATOOLS/Phys/NLO_Types.H" #include "MODEL/Main/Model_Base.H" using namespace ATOOLS; using namespace PHASIC; //for equations see hep-ph/0201036 Massive_Kernels::Massive_Kernels(ATOOLS::sbt::subtype st, const size_t &nf, const size_t nmf) : m_stype(st), m_nf(nf), m_nmf(nmf), m_NC(3.), m_CA(3.), m_CF(4./3.), m_TR(0.5), m_TRbyCA(m_TR/m_CA), m_CFbyCA(m_CF/m_CA), m_TRbyCF(m_TR/m_CF), m_g1t(0.), m_g2t(0.), m_g3t(0.), m_K1t(0.), m_K2t(0.), m_K3t(0.), m_beta0qcd(0.), m_beta0qed(0.), m_alpha_ff(1.), m_alpha_fi(1.), m_alpha_if(1.), m_alpha_ii(1.), m_kappa(2./3.), m_logaff(0.), m_logafi(0.), m_logaif(0.), m_logaii(0.), m_VNS(0.), m_gKterm(0.), m_aterm(0.), m_Vsubmode(1) { m_subtype = 0; for (size_t i(1);i<=m_nf+m_nmf;i++) { Flavour flav((kf_code)(i)); if (flav.IsMassive()) m_massflav.push_back(flav.Mass()); } p_VS[0]=p_VS[1]=p_VS[2]=0.; p_Gammat[0]=p_Gammat[1]=0.; } void Massive_Kernels::SetNC(const double &nc) { DEBUG_FUNC(m_stype<<((m_stype==sbt::qcd)?(" Nc="+ToString(nc)):"")); // all massless charged particles in the model, // double sumQ2(0.),sumQ2quark(0.),sumQ2lepton(0.); Flavour_Vector flavs(MODEL::s_model->IncludedFlavours()); for (size_t i(0);i define m_g1, m_K1 m_NC = nc; m_TR = 0.5; m_CA = 2.*m_TR*m_NC; m_CF = m_TR*(m_NC*m_NC-1.0)/m_NC; m_TRbyCA = m_TR/m_CA; m_CFbyCA = m_CF/m_CA; m_TRbyCF = m_TR/m_CF; m_g1t = 1.5; m_g2t = 11./6.-2./3.*m_TRbyCA*m_nf; m_g3t = 2.; m_K1t = 7./2.-sqr(M_PI)/6.; m_K2t = 67./18.-sqr(M_PI)/6.-10./9.*m_TRbyCA*m_nf; m_K3t = 4.-sqr(M_PI)/6.; break; case sbt::qed: // Q_j^2 different for all fermions -> do not define m_TR, m_CA, m_CF m_TR = 1.; m_CA = 1.; m_CF = 1.; m_TRbyCA = 1.; m_CFbyCA = 1.; m_TRbyCF = nc; // this should be 1 for initial state leptons m_g1t = 1.5; m_g2t = -2./3.*sumQ2; m_g3t = 2.; m_K1t = 7./2.-sqr(M_PI)/6.; m_K2t = -10./9.*sumQ2;; m_K3t = 4.-sqr(M_PI)/6.; case sbt::none: break; } m_beta0qcd = 11./6.*m_CA-2./3.*m_TR*m_nf; m_beta0qed = -2./3.*sumQ2; if (msg_LevelIsDebugging()) { if (m_stype==sbt::qcd) msg_Out()<<"Nc="<0.) mgs+=pow(xp,1.5); // TODO: fix for QED } return (m_g2t-m_TRbyCA*2./3.*mgs) + aterm; } } return aterm; } double Massive_Kernels::t2c(int type,int spin,double muq2,double saj) { if (m_subtype==1) { double gc=0.0, muq(sqrt(muq2)); switch(spin) {// FS parton, spectator must be massless case 1:// muq is scaled quark mass if (muq2==0.) gc+=-1./4.; else gc+=-1./4.*(1.+muq2)/(1.-muq2)-muq2/(1.-muq2)*(1.+(2.+muq2)/(1.-muq2)*log(muq2)/2.); case 2:// muq is irrelevant gc+=1./36.-1./18.*m_TR*m_nf/m_CA; for (size_t i(0);i1.0) continue; gc+=m_TR/m_CA*((rho1*(-1.-154.*mui2+64.*pow(mui2,3)-152.*sqr(mui2))+ 12.*mui2*log((1.-rho1)/(1.+rho1))*(-4.-17.*mui2+4.*sqr(mui2)))/(18.*sqr(1.-2.*mui2))); } } switch(type) {// IS parton, must be massless case 1:// muq is scaled spectator mass if (muq2==0.) gc+=-1./4.; else gc+=-(1.-muq)*(1.+3.*muq)/(4.*sqr(1.+muq)); case 2:// muq is scaled spectator mass if (muq2==0.) { gc+=1./36.-1./18.*m_TR*m_nf/m_CA; for (size_t i(0);i1.0) continue; double rho1=sqrt(1.-4.*mui2); gc+=m_TR/m_CA*((rho1*(-1.-154.*mui2+64.*pow(mui2,3)-152.*sqr(mui2))+ 12.*mui2*log((1.-rho1)/(1.+rho1))*(-4.-17.*mui2+4.*sqr(mui2)))/(18.*sqr(1.-2.*mui2))); } } else { gc+=(1./2.-pow(muq/(1.+muq),3))/18. +muq2/(3.*(1.-muq2))*log(2.*muq/(1.+muq))+muq2/(2.*pow(1.+muq,3)); gc+=m_nf*m_TR/m_CA*(-1./18.-muq2*(9.-muq)/(9.*pow(1.+muq,3)) -2.*muq2/(3.*(1.-muq2))*log(2.*muq/(1.+muq))); for (size_t i(0);i1.0) continue; double rho1=sqrt(1.-4.*sqr(m_massflav[i]/(sqrt(saj*(1.+muq2))-sqrt(saj*muq)))); double rho2=sqrt(1.-4.*sqr(m_massflav[i])/saj); gc+=m_TR/m_CA*(-(((3.-2.*mui2)/(3.*(1.-muq2))-(3+2*mui2-(2*mui2*(9+5*mui2))/(1-2*mui2-muq2))/(3.*(1-2*mui2-muq2)))* log((1-rho1)/(1+rho1)))-(2*muq2*((-8*mui2*rho1)/(1-muq2)-log((1-rho1)/(1+rho1))+log((-rho1+rho2)/(rho1+rho2))*pow(rho2,3)))/(3.*(1-muq2))- (rho1*(65./6.-15*mui2+(8*mui2)/(3.*(1-muq))-4*muq+muq2/6.-(2*(36-148*mui2-26*muq+77*mui2*muq+59*sqr(mui2)))/(3.*(1-2*mui2-muq2))+ (4*(-49*mui2+10*(1-muq)+39*mui2*muq-30*pow(mui2,3)+127*sqr(mui2)-77*muq*sqr(mui2)))/(3.*sqr(1-2*mui2-muq2))))/(3.*(1-muq2))); } } } return gc; } return 0.; } double Massive_Kernels::t3(int type,int spin,double muq2,double x) // k(x) { if (m_stype==sbt::qed && type==4) return 0.; double aterm(0.); if (m_alpha_fi<1. || m_alpha_if<1.) aterm = -at3(type, spin, muq2, x); if (IsZero(muq2)) return aterm; if (spin==2) return aterm; double mx=log((1.-x)/(1.-x+muq2)); switch (type) { case 1: return (1.+x)*mx + aterm; case 2: return -m_CFbyCA*((1.+sqr(1.-x))*mx-2.*muq2*log((1.-x)/muq2+1.))/x + aterm; case 3: return -m_TRbyCF*(x*x+sqr(1.-x))*mx + aterm; case 4: return -2.*((1./x-2.+x*(1.-x))*mx-muq2/x*log((1.-x)/muq2+1.)) + aterm; } return aterm; } double Massive_Kernels::t4(int type,int spin,double muq2,double x) // G(x) { if (m_stype==sbt::qed && type==4) return 0.; if (type==2||type==3) return 0.; double aterm(0.); if (m_alpha_fi<1.) aterm = -at4( type, spin, muq2, x); if (IsZero(muq2)) { switch (spin) { case 1: return -m_g1t*log(1.-x) + aterm; case 2: return -m_g2t*log(1.-x) + aterm; } } double y=1.-x; double lny=log(y); switch (spin) { case 0: return sqr(lny)+2.*(DiLog(-y/muq2)-DiLog(-1./muq2)-log(muq2)*lny)-2.*lny; case 1: return sqr(lny)+2.*(DiLog(-y/muq2)-DiLog(-1./muq2)-log(muq2)*lny) +0.5*(muq2*x/((1.+muq2)*(y+muq2))-log((1.+muq2)/(y+muq2)))-2.*lny + aterm; case 2: return -m_g2t*lny + aterm; } return aterm; } double Massive_Kernels::t5(int type,double x,double xp) // g^{xp}(x) { if (m_stype==sbt::qed && type==4) return 0.; if (type==2||type==3) return 0.; if (x>xp) return 0.; x=1.-x; xp=1.-xp; return -2./3.*m_TRbyCA*(x+0.5*xp)/sqr(x)*sqrt(1.-xp/x); } double Massive_Kernels::t6(int type,double xp) // h^{xp} { if (m_stype==sbt::qed && type==4) return 0.; if (type==2||type==3) return 0.; double sxp=sqrt(xp); return -2./3.*m_TRbyCA*(log((1.-sxp)/(1.+sxp))+sxp/3.*(6.-xp)); } double Massive_Kernels::t7(int type,double x,double xp) // G^{xp}(x) { if (m_stype==sbt::qed && type==4) return 0.; if (type==2||type==3) return 0.; if (x>xp) x=xp; return -2./3.*m_TRbyCA*((sqrt(1.-(1.-xp)/(1.-x)) *(5.+(1.-xp)/(1.-x))-sqrt(xp)*(6.-xp))/3. -log((1.+xp)/2.-x+sqrt((1.-x)*(xp-x))) +log((1.+xp)/2.+sqrt(xp))); } double Massive_Kernels::at1(int type,int spin,double muq2,double x) // g(x) { if (m_stype==sbt::qed && type==4) return 0.; if (type==2||type==3) return 0.; double res(0.); if (spin == 0) { if (x<1.-m_alpha_fi) res -= 2.*(log((1.+muq2)/muq2) - 1.)/(1.-x); } else if (spin == 1) { if (x<1.-m_alpha_fi) { if (IsZero(muq2)) res = 2.*log(1.-x)/(1.-x) + 1.5/(1.-x); else res -= 2.*(log((1.+muq2)/muq2) - 1.)/(1.-x); } } else if (spin == 2) { /// final state is gluon - sum over all possible splittings // TODO: fix for QED if (x<1.-m_alpha_fi) res -= m_TRbyCA*m_nf*(2./3./(1.-x)); if (x<1.-m_alpha_fi) res -= (-2./(1.-x)*log(1.-x)-11./6./(1.-x)); size_t nfjk=0; for (size_t i=0;igg) if (x<1.-m_alpha_fi) res -= (2.*log(2.-x)/(1.-x)); } } double zp=(1.-x)/(1.-x+muq2*x); if (spin==2) zp = 1.; switch (type) { case 1: if (zp>m_alpha_if) res-=2./(1.-x)*log(zp*(1.-x+m_alpha_if)/m_alpha_if/(1.-x+zp)) -(1.+x)*log(zp/m_alpha_if); break; case 2: if (zp>m_alpha_if) { if (zp!=1.) res += -m_CFbyCA*((1.+sqr(1.-x))/x*(log(zp/m_alpha_if)) +2.*muq2*log((1.-zp)/(1.-m_alpha_if))); else res += -m_CFbyCA*(2.-2.*x+x*x)/x*log(zp/m_alpha_if); } break; case 3: if (zp>m_alpha_if) res += -m_TRbyCA*(x*x+sqr(1.-x))*log(zp/m_alpha_if); break; case 4: if (zp>m_alpha_if) { if (zp!=1.) res += -2.*((1./x-2.+x*(1.-x))*log(zp/m_alpha_if) +muq2*log((1.-zp)/(1.-m_alpha_if)) -log(m_alpha_if*(1.-x+zp)/(zp*(1.-x+m_alpha_if))) /(1.-x)); else res += -2.*((1./x-2.+x*(1.-x))*log(zp/m_alpha_if) -log(m_alpha_if*(1.-x+zp)/(zp*(1.-x+m_alpha_if))) /(1.-x)); } break; } return res; } double Massive_Kernels::at4(int type,int spin,double muq2,double x) // G(x) { if (m_stype==sbt::qed && type==4) return 0.; if (type==2||type==3) return 0.; double res(0.); if (spin == 0) { /// final state is scalar if (x>1.-m_alpha_fi) res -= - 2.*(log((1.+muq2)/muq2) - 1.)*m_logafi; else res -= - 2.*(log((1.+muq2)/muq2) - 1.)*log(1.-x); } else if (spin == 1) { ///final state is quark if (IsZero(muq2)) { if (x>1.-m_alpha_fi) res -= sqr(m_logafi) + 1.5*m_logafi; else res -= sqr(log(1.-x)) + 1.5*log(1.-x); } else { if (x>1.-m_alpha_fi) res -= - 2.*(log((1.+muq2)/muq2) - 1.)*m_logafi; else res -= - 2.*(log((1.+muq2)/muq2) - 1.)*log(1.-x); } } else if (spin == 2) { /// final state is gluon - sum over all possible splittings // TODO: fix for QED if (x>1.-m_alpha_fi) res -= (-m_TRbyCA*m_nf*2./3.+11./6.)*m_logafi +sqr(m_logafi); else res -= (-m_TRbyCA*m_nf*2./3.+11./6.)*log(1.-x) +sqr(log(1.-x)); size_t nfjk=0; for (size_t i=0;i1.-m_alpha_fi) { double rta = sqrt(1.-4.*muQ2/m_alpha_fi); res += 2./3.*log(2.*m_alpha_fi*(rta +1.)-4.*muQ2) -2./9./m_alpha_fi*rta*(4.*muQ2 +5.*m_alpha_fi) +2./9.*(4.*rt*muQ2+5.*rt-3.*log(-2.*muQ2+rt+1.)-log(8.)); } else { double rta = sqrt(1.-4.*muQ2/(1.-x)); res += 2./3.*log(2.*(1.-x)*(rta +1.)-4.*muQ2) -2./9./(1.-x)*rta*(4.*muQ2 +5.*(1.-x)) +2./9.*(4.*rt*muQ2+5.*rt-3.*log(-2.*muQ2+rt+1.)-log(8.)); } } } return res; }