#include "PHASIC++/Process/KP_Terms.H" #include "PHASIC++/Main/Process_Integrator.H" #include "PDF/Main/ISR_Handler.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/Scoped_Settings.H" using namespace PHASIC; using namespace ATOOLS; KP_Terms::KP_Terms(Process_Base *const proc,const sbt::subtype st, const std::vector& partonlist): m_stype(st), m_itype(cs_itype::K|cs_itype::P), m_kcontrib(cs_kcontrib::Kb|cs_kcontrib::KFS|cs_kcontrib::t|cs_kcontrib::Kt), m_subtype(subscheme::CS), p_proc(proc), p_nlomc(NULL), p_kernel(NULL), p_cpl(NULL), m_flavs(p_proc->Flavours()), m_massive(true), m_cemode(false), m_cpldef(0.), m_NC(3.), m_Vsubmode(1), m_facscheme(0), m_sa(false), m_sb(false), m_typea(m_flavs[0].IntSpin()), m_typeb(m_flavs[1].IntSpin()), m_plist(partonlist) { DEBUG_FUNC(""); RegisterDefaults(); Settings& s = Settings::GetMainSettings(); Scoped_Settings kpsettings{ s["KP"] }; m_subtype = s["DIPOLES"]["SCHEME"].Get(); const size_t nf(Flavour(kf_quark).Size()/2); const auto nfgs = s["DIPOLES"]["NF_GSPLIT"].GetScalarWithOtherDefault(nf); if (nfgsqq splitting (" +ToString(nfgs) +") smaller than number of light flavours (" +ToString(nf)+")."); const size_t nmf(nfgs-nf); p_kernel=new Massive_Kernels(st,nf,nmf); p_kernel->SetSubType(m_subtype); m_kcontrib=ToType( kpsettings["KCONTRIB"].Get()); msg_Tracking()<<"Set K-Term contribution to "<(); msg_Tracking()<<"Set KP-term energy check mode "<(); msg_Tracking()<<"Set KP-term accepts negative PDF "<(); std::string fs(""); switch (m_facscheme) { case 0: fs="MSbar"; break; case 1: fs="DIS"; THROW(not_implemented,"DIS factorisation scheme not implemented yet."); break; default: THROW(fatal_error,"Unknown factorisation scheme."); break; } msg_Tracking()<<"Set KP-term factorisation scheme to "<(); if (m_NC!=3.) msg_Out()<<"Set N_color="<SetNC(m_NC); SetColourFactors(); double dalpha(s["DIPOLES"]["ALPHA"].Get()); double dalpha_ff(s["DIPOLES"]["ALPHA_FF"].Get()); double dalpha_fi(s["DIPOLES"]["ALPHA_FI"].Get()); double dalpha_if(s["DIPOLES"]["ALPHA_IF"].Get()); double dalpha_ii(s["DIPOLES"]["ALPHA_II"].Get()); const double kappa = s["DIPOLES"]["KAPPA"].Get(); msg_Tracking()<<"Set FF dipole alpha="<(); msg_Tracking()<<"Use "<<(m_Vsubmode?"fermionic":"scalar") <<" V->VP subtraction term."<SetVSubtractionMode(m_Vsubmode); int collVFF = s["DIPOLES"]["COLLINEAR_VFF_SPLITTINGS"].Get(); if (!s["DIPOLES"]["COLLINEAR_VFF_SPLITTINGS"].IsSetExplicitly() && m_stype == sbt::qed) { collVFF = 0; // overwrite default for QED splittings } msg_Tracking()<<"Switch collinear VFF splittings "<<(collVFF?"on":"off") <<"."<SetCollinearVFFSplitting(collVFF); SetMassive(); m_sa=((m_stype==sbt::qcd && m_flavs[0].Strong()) || (m_stype==sbt::qed && (m_flavs[0].Charge() || m_flavs[0].IsPhoton()))); m_sb=((m_stype==sbt::qcd && m_flavs[1].Strong()) || (m_stype==sbt::qed && (m_flavs[1].Charge() || m_flavs[1].IsPhoton()))); for (int i=0;i<8;i++) m_kpca[i]=0.; for (int i=0;i<8;i++) m_kpcb[i]=0.; } KP_Terms::~KP_Terms() { if (p_kernel) { delete p_kernel; p_kernel=NULL; } } void KP_Terms::RegisterDefaults() const { Scoped_Settings s{ Settings::GetMainSettings()["KP"] }; s["KCONTRIB"].SetDefault("BSGT"); s["CHECK_ENERGY"].SetDefault(false); s["ACCEPT_NEGATIVE_PDF"].SetDefault(true); s["FACTORISATION_SCHEME"].SetDefault(0); } void KP_Terms::SetColourFactors() { DEBUG_FUNC(m_stype); std::vector cpls(m_flavs.size(),0.); for (size_t i(0);iCF(); else if (abs(m_flavs[i].StrongCharge())==8) cpls[i]=p_kernel->CA(); else THROW(fatal_error,"Unknown colour charge."); } else if (m_stype==sbt::qed) { if (m_flavs[i].Charge()) cpls[i]=sqr(m_flavs[i].Charge()); else if (m_flavs[i].IsPhoton()) cpls[i]=1.; else cpls[i]=0.; } msg_Debugging()<SetCpls(cpls); } void KP_Terms::SetNLOMC(PDF::NLOMC_Base *const nlomc) { p_nlomc=nlomc; m_subtype=p_nlomc->SubtractionType(); p_kernel->SetSubType(m_subtype); if (m_subtype==subscheme::Dire) p_kernel->SetKappa(1.0); } void KP_Terms::SetMassive() { // determine whether massive, // count number of FS gluons/photons that can split into massive partons size_t fsgluons(0); for (size_t i=p_proc->NIn();iNmf()>0) m_massive=true; m_xpa.resize(p_kernel->Nmf()*fsgluons); m_xpb.resize(p_kernel->Nmf()*fsgluons); } void KP_Terms::SetCoupling(const MODEL::Coupling_Map *cpls) { std::string cplname(""); if (m_stype==sbt::qcd) cplname="Alpha_QCD"; else if (m_stype==sbt::qed) cplname="Alpha_QED"; else THROW(fatal_error,"Cannot set coupling for subtraction type" +ToString(m_stype)); if (cpls->find(cplname)!=cpls->end()) p_cpl=cpls->find(cplname)->second; else THROW(fatal_error,"Coupling not found"); msg_Tracking()<Kb1(m_typea,x0) +p_kernel->Kb2(m_typea) -p_kernel->Kb4(m_typea,eta0); m_kpca[1]=w*(p_kernel->Kb1(m_typea,x0) +p_kernel->Kb3(m_typea,x0)); m_kpca[2]=-w*p_kernel->Kb1(m_typea+2,x0) +p_kernel->Kb2(m_typea+2) -p_kernel->Kb4(m_typea+2,eta0); m_kpca[3]=w*(p_kernel->Kb1(m_typea+2,x0) +p_kernel->Kb3(m_typea+2,x0)); } if (m_kcontrib&cs_kcontrib::KFS) { // KFS terms (only if not MSbar) if (m_facscheme>0) { msg_Debugging()<<"sa: KFS"<KFS1(m_typea,x0) +p_kernel->KFS2(m_typea) -p_kernel->KFS4(m_typea,eta0); m_kpca[1]+=w*(p_kernel->KFS1(m_typea,x0) +p_kernel->KFS3(m_typea,x0)); m_kpca[2]+=-w*p_kernel->KFS1(m_typea+2,x0) +p_kernel->KFS2(m_typea+2) -p_kernel->KFS4(m_typea+2,eta0); m_kpca[3]+=w*(p_kernel->KFS1(m_typea+2,x0) +p_kernel->KFS3(m_typea+2,x0)); } } for (int i=0;i<4;i++) m_kpca[i]*=p_kernel->Cpl(0)*dsij[0][0]; msg_Debugging() <<" kpca[0]="<t1(m_typea,spin,muq2,x0) +p_kernel->t2(m_typea,spin,muq2) -p_kernel->t4(m_typea,spin,muq2,eta0)); m_kpca[1]+=dsij[0][i]*(w*(p_kernel->t1(m_typea,spin,muq2x,x0) +p_kernel->t3(m_typea,spin,muq2x,x0))); m_kpca[2]+=dsij[0][i]*(-w*p_kernel->t1(m_typea+2,spin,muq2,x0) +p_kernel->t2(m_typea+2,spin,muq2) -p_kernel->t4(m_typea+2,spin,muq2,eta0)); m_kpca[3]+=dsij[0][i]*(w*(p_kernel->t1(m_typea+2,spin,muq2x,x0) +p_kernel->t3(m_typea+2,spin,muq2x,x0))); m_kpca[m_typea*2-2]+=dsij[0][i]*p_kernel->t2c (m_typea,spin,sqr(m_flavs[m_plist[i]].Mass())/saj,saj); if (spin!=2) { m_kpca[1]-=dsij[0][i]*w*p_kernel->Kbc3(m_typea,muq2x,x0); m_kpca[3]-=dsij[0][i]*w*p_kernel->Kbc3(m_typea+2,muq2x,x0); } if (spin==2) { for (size_t j=0;jNmf();j++) { m_xpa[xpcnt].xp=1.-4.*sqr(p_kernel->FMass(j))/saj; if (m_xpa[xpcnt].xp>eta0) { m_kpca[0]+=dsij[0][i]*p_kernel->t6(m_typea,m_xpa[xpcnt].xp); m_kpca[1]+=dsij[0][i]*w*p_kernel->t5(m_typea,x0,m_xpa[xpcnt].xp); m_kpca[2]+=dsij[0][i]*p_kernel->t6(m_typea+2,m_xpa[xpcnt].xp); m_kpca[3]+=dsij[0][i]*w*p_kernel->t5(m_typea+2,x0,m_xpa[xpcnt].xp); m_xpa[xpcnt].kpc=dsij[0][i]*(-w*p_kernel->t5(m_typea,x0,m_xpa[xpcnt].xp) -p_kernel->t6(m_typea,m_xpa[xpcnt].xp) -p_kernel->t7(m_typea,eta0,m_xpa[xpcnt].xp)); } xpcnt++; } } } msg_Debugging() <<" kpca[0]="<Kt1(m_typea,x0) +p_kernel->Kt2(m_typea) -p_kernel->Kt4(m_typea,eta0)); m_kpca[1]-=dsij[0][1]*w*(p_kernel->Kt1(m_typea,x0) +p_kernel->Kt3(m_typea,x0)); m_kpca[2]-=dsij[0][1]*(-w*p_kernel->Kt1(m_typea+2,x0) +p_kernel->Kt2(m_typea+2) -p_kernel->Kt4(m_typea+2,eta0)); m_kpca[3]-=dsij[0][1]*w*(p_kernel->Kt1(m_typea+2,x0) +p_kernel->Kt3(m_typea+2,x0)); m_kpca[m_typeb*2-2]+=dsij[0][1]*p_kernel->t2c(m_typea,m_typeb,0.,0.); } msg_Debugging() <<" kpca[0]="<P1(m_typea,x0) +p_kernel->P2(m_typea) -p_kernel->P4(m_typea,eta0)); double p5(w*(p_kernel->P1(m_typea,x0) +p_kernel->P3(m_typea,x0))); double p6(-w*p_kernel->P1(m_typea+2,x0) +p_kernel->P2(m_typea+2) -p_kernel->P4(m_typea+2,eta0)); double p7(w*(p_kernel->P1(m_typea+2,x0) +p_kernel->P3(m_typea+2,x0))); // TODO: fix muf2 dependence m_kpca[0]+=asum*p4; m_kpca[1]+=asum*p5; m_kpca[2]+=asum*p6; m_kpca[3]+=asum*p7; m_kpca[4]=fsum*p4; m_kpca[5]=fsum*p5; m_kpca[6]=fsum*p6; m_kpca[7]=fsum*p7; msg_Debugging() <<" kpca[0]="<Kb1(m_typeb,x1) +p_kernel->Kb2(m_typeb) -p_kernel->Kb4(m_typeb,eta1); m_kpcb[1]=w*(p_kernel->Kb1(m_typeb,x1) +p_kernel->Kb3(m_typeb,x1)); m_kpcb[2]=-w*p_kernel->Kb1(m_typeb+2,x1) +p_kernel->Kb2(m_typeb+2) -p_kernel->Kb4(m_typeb+2,eta1); m_kpcb[3]=w*(p_kernel->Kb1(m_typeb+2,x1) +p_kernel->Kb3(m_typeb+2,x1)); } if (m_kcontrib&cs_kcontrib::KFS) { // KFS terms (only if not MSbar) if (m_facscheme>0) { msg_Debugging()<<"sb: KFS"<KFS1(m_typeb,x1) +p_kernel->KFS2(m_typeb) -p_kernel->KFS4(m_typeb,eta1); m_kpcb[1]+=w*(p_kernel->KFS1(m_typeb,x1) +p_kernel->KFS3(m_typeb,x1)); m_kpcb[2]+=-w*p_kernel->KFS1(m_typeb+2,x1) +p_kernel->KFS2(m_typeb+2) -p_kernel->KFS4(m_typeb+2,eta1); m_kpcb[3]+=w*(p_kernel->KFS1(m_typeb+2,x1) +p_kernel->KFS3(m_typeb+2,x1)); } } for (int i=0;i<4;i++) m_kpcb[i]*=p_kernel->Cpl(1)*dsij[0][0]; msg_Debugging() <<" kpcb[0]="<t1(m_typeb,spin,muq2,x1) +p_kernel->t2(m_typeb,spin,muq2) -p_kernel->t4(m_typeb,spin,muq2,eta1)); m_kpcb[1]+=dsij[pls-1][i]*(w*(p_kernel->t1(m_typeb,spin,muq2x,x1) +p_kernel->t3(m_typeb,spin,muq2x,x1))); m_kpcb[2]+=dsij[pls-1][i]*(-w*p_kernel->t1(m_typeb+2,spin,muq2,x1) +p_kernel->t2(m_typeb+2,spin,muq2) -p_kernel->t4(m_typeb+2,spin,muq2,eta1)); m_kpcb[3]+=dsij[pls-1][i]*(w*(p_kernel->t1(m_typeb+2,spin,muq2x,x1) +p_kernel->t3(m_typeb+2,spin,muq2x,x1))); m_kpcb[m_typeb*2-2]+=dsij[pls-1][i]*p_kernel->t2c (m_typeb,spin,sqr(m_flavs[m_plist[i]].Mass())/saj,saj); if (spin!=2) { m_kpcb[1]-=dsij[pls-1][i]*w*p_kernel->Kbc3(m_typeb,muq2x,x1); m_kpcb[3]-=dsij[pls-1][i]*w*p_kernel->Kbc3(m_typeb+2,muq2x,x1); } if (spin==2) { for (size_t j=0;jNmf();j++) { m_xpb[xpcnt].xp=1.-4.*sqr(p_kernel->FMass(j))/saj; if (m_xpb[xpcnt].xp>eta1) { m_kpcb[0]+=dsij[pls-1][i]*p_kernel->t6(m_typeb,m_xpb[xpcnt].xp); m_kpcb[1]+=dsij[pls-1][i]*w*p_kernel->t5(m_typeb,x1,m_xpb[xpcnt].xp); m_kpcb[2]+=dsij[pls-1][i]*p_kernel->t6(m_typeb+2,m_xpb[xpcnt].xp); m_kpcb[3]+=dsij[pls-1][i]*w*p_kernel->t5(m_typeb+2,x1,m_xpb[xpcnt].xp); m_xpb[xpcnt].kpc=dsij[pls-1][i]*(-w*p_kernel->t5(m_typeb,x1,m_xpb[xpcnt].xp) -p_kernel->t6(m_typeb,m_xpb[xpcnt].xp) -p_kernel->t7(m_typeb,eta1,m_xpb[xpcnt].xp)); } xpcnt++; } } } msg_Debugging() <<" kpcb[0]="<Kt1(m_typeb,x1) +p_kernel->Kt2(m_typeb) -p_kernel->Kt4(m_typeb,eta1)); m_kpcb[1]-=dsij[0][1]*w*(p_kernel->Kt1(m_typeb,x1) +p_kernel->Kt3(m_typeb,x1)); m_kpcb[2]-=dsij[0][1]*(-w*p_kernel->Kt1(m_typeb+2,x1) +p_kernel->Kt2(m_typeb+2) -p_kernel->Kt4(m_typeb+2,eta1)); m_kpcb[3]-=dsij[0][1]*w*(p_kernel->Kt1(m_typeb+2,x1) +p_kernel->Kt3(m_typeb+2,x1)); } msg_Debugging() <<" kpcb[0]="<P1(m_typeb,x1) +p_kernel->P2(m_typeb) -p_kernel->P4(m_typeb,eta1)); double p5(w*(p_kernel->P1(m_typeb,x1) +p_kernel->P3(m_typeb,x1))); double p6(-w*p_kernel->P1(m_typeb+2,x1) +p_kernel->P2(m_typeb+2) -p_kernel->P4(m_typeb+2,eta1)); double p7(w*(p_kernel->P1(m_typeb+2,x1) +p_kernel->P3(m_typeb+2,x1))); // TODO: fix muf2 dependence m_kpcb[0]+=asum*p4; m_kpcb[1]+=asum*p5; m_kpcb[2]+=asum*p6; m_kpcb[3]+=asum*p7; m_kpcb[4]=fsum*p4; m_kpcb[5]=fsum*p5; m_kpcb[6]=fsum*p6; m_kpcb[7]=fsum*p7; msg_Debugging() <<" kpcb[0]="<gen.PBunch(0)[0]gen.PBunch(0)[0] <<" vs. "<Calculate(eta0/x0,muf02*muf02fac); // a' = gluon/photon if (pdfa->Contains(gluon)) fagx = pdfa->GetXPDF(gluon)/eta0; // a' = quark (if a = quark) if (fl0.IsQuark() && pdfa->Contains(fl0)) faqx = pdfa->GetXPDF(fl0)/eta0; // a' = quark (if a = gluon,photon) // in QCD CF/CA already in kpca/b[1] // in QED -Q_i^2 needs to be multiplied in else { for (size_t i=0;iContains(quark[i])) { if (m_stype==sbt::qcd) faqx += pdfa->GetXPDF(quark[i]); else faqx += sqr(quark[i].Charge()) *pdfa->GetXPDF(quark[i]); } faqx/=eta0; } // f_a(eta), f_a'(eta) pdfa->Calculate(eta0,muf02*muf02fac); if (pdfa->Contains(fl0)) fa = pdfa->GetXPDF(fl0)/eta0; // TODO: check whether this check is sensible (fa>0.) if (m_cemode && IsZero(fa,1.0e-16)) { msg_Tracking()<gen.PBunch(1)[0]gen.PBunch(1)[0] <<" vs. "<Calculate(eta1/x1,muf12*muf12fac); // b' = gluon/photon if (pdfb->Contains(gluon)) fbgx = pdfb->GetXPDF(gluon)/eta1; // b' = quark (if b = quark) if (fl1.IsQuark() && pdfb->Contains(fl1)) fbqx = pdfb->GetXPDF(fl1)/eta1; // b' = quark (if b = gluon) // in QCD CF/CA already in kpca/b[1] // in QED -Q_i^2 needs to be multiplied in else { for (size_t i=0;iContains(quark[i])) { if (m_stype==sbt::qcd) fbqx += pdfb->GetXPDF(quark[i]); else fbqx += sqr(quark[i].Charge()) *pdfb->GetXPDF(quark[i]); } fbqx/=eta1; } // f_a(eta), f_a'(eta) pdfb->Calculate(eta1,muf12*muf12fac); if (pdfb->Contains(fl1)) fb = pdfb->GetXPDF(fl1)/eta1; // TODO: check whether this check is sensible (fa>0.) if (m_cemode && IsZero(fb,1.0e-16)) { msg_Tracking()<SetPrecision(16); msg_Out()<<" "< "<<(m_kpca[0]*faq+m_kpca[1]*faqx +m_kpca[2]*fag+m_kpca[3]*fagx)*fb< "<<(m_kpcb[0]*fbq+m_kpcb[1]*fbqx +m_kpcb[2]*fbg+m_kpcb[3]*fbgx)*fa< "<SetPrecision(precision); } return res; } void KP_Terms::FillMEwgts(ATOOLS::ME_Weight_Info &wgtinfo) { if (wgtinfo.m_type&mewgttype::KP) { size_t offset(m_stype==sbt::qed?16:0); for (int i=0;i<4;i++) { wgtinfo.m_wfac[i+offset]=wgtinfo.m_swap?m_kpcb[i]:m_kpca[i]; wgtinfo.m_wfac[i+offset+4]=wgtinfo.m_swap?m_kpca[i]:m_kpcb[i]; wgtinfo.m_wfac[i+offset+8]=wgtinfo.m_swap?m_kpcb[i+4]:m_kpca[i+4]; wgtinfo.m_wfac[i+offset+12]=wgtinfo.m_swap?m_kpca[i+4]:m_kpcb[i+4]; } } }