diff --git a/src/jets.cc b/src/jets.cc index 3344d1d..8f66c91 100644 --- a/src/jets.cc +++ b/src/jets.cc @@ -1,275 +1,276 @@ /** * \authors The HEJ collaboration (see AUTHORS for details) * \date 2019 * \copyright GPLv2 or later */ #include "HEJ/currents.hh" #include "HEJ/Constants.hh" // Colour acceleration multiplier for gluons see eq. (7) in arXiv:0910.5113 // @TODO: this is not a current and should be moved somewhere else double K_g(double p1minus, double paminus) { return 1./2.*(p1minus/paminus + paminus/p1minus)*(HEJ::C_A - 1./HEJ::C_A) + 1./HEJ::C_A; } double K_g( HLV const & pout, HLV const & pin ) { if(pin.z() > 0) return K_g(pout.plus(), pin.plus()); return K_g(pout.minus(), pin.minus()); } CCurrent CCurrent::operator+(const CCurrent& other) { COM result_c0=c0 + other.c0; COM result_c1=c1 + other.c1; COM result_c2=c2 + other.c2; COM result_c3=c3 + other.c3; return CCurrent(result_c0,result_c1,result_c2,result_c3); } CCurrent CCurrent::operator-(const CCurrent& other) { COM result_c0=c0 - other.c0; COM result_c1=c1 - other.c1; COM result_c2=c2 - other.c2; COM result_c3=c3 - other.c3; return CCurrent(result_c0,result_c1,result_c2,result_c3); } CCurrent CCurrent::operator*(const double x) { COM result_c0=x*CCurrent::c0; COM result_c1=x*CCurrent::c1; COM result_c2=x*CCurrent::c2; COM result_c3=x*CCurrent::c3; return CCurrent(result_c0,result_c1,result_c2,result_c3); } CCurrent CCurrent::operator/(const double x) { COM result_c0=CCurrent::c0/x; COM result_c1=CCurrent::c1/x; COM result_c2=CCurrent::c2/x; COM result_c3=CCurrent::c3/x; return CCurrent(result_c0,result_c1,result_c2,result_c3); } CCurrent CCurrent::operator*(const COM x) { COM result_c0=x*CCurrent::c0; COM result_c1=x*CCurrent::c1; COM result_c2=x*CCurrent::c2; COM result_c3=x*CCurrent::c3; return CCurrent(result_c0,result_c1,result_c2,result_c3); } CCurrent CCurrent::operator/(const COM x) { COM result_c0=(CCurrent::c0)/x; COM result_c1=(CCurrent::c1)/x; COM result_c2=(CCurrent::c2)/x; COM result_c3=(CCurrent::c3)/x; return CCurrent(result_c0,result_c1,result_c2,result_c3); } std::ostream& operator <<(std::ostream& os, const CCurrent& cur) { os << "("<<cur.c0<< " ; "<<cur.c1<<" , "<<cur.c2<<" , "<<cur.c3<<")"; return os; } CCurrent operator * ( double x, CCurrent& m) { return m*x; } CCurrent operator * ( COM x, CCurrent& m) { return m*x; } CCurrent operator / ( double x, CCurrent& m) { return m/x; } CCurrent operator / ( COM x, CCurrent& m) { return m/x; } COM CCurrent::dot(HLV p1) { // Current goes (E,px,py,pz) // Vector goes (px,py,pz,E) return p1[3]*c0-p1[0]*c1-p1[1]*c2-p1[2]*c3; } COM CCurrent::dot(CCurrent p1) { return p1.c0*c0-p1.c1*c1-p1.c2*c2-p1.c3*c3; } //Current Functions void joi(HLV pout, bool helout, HLV pin, bool helin, current &cur) { cur[0]=0.; cur[1]=0.; cur[2]=0.; cur[3]=0.; const double sqpop = sqrt(pout.plus()); const double sqpom = sqrt(pout.minus()); const COM poperp = pout.x() + COM(0, 1) * pout.y(); if (helout != helin) { throw std::invalid_argument{"Non-matching helicities"}; } else if (helout == false) { // negative helicity if (pin.plus() > pin.minus()) { // if forward const double sqpip = sqrt(pin.plus()); cur[0] = sqpop * sqpip; cur[1] = sqpom * sqpip * poperp / abs(poperp); cur[2] = -COM(0,1) * cur[1]; cur[3] = cur[0]; } else { // if backward const double sqpim = sqrt(pin.minus()); cur[0] = -sqpom * sqpim * poperp / abs(poperp); cur[1] = -sqpim * sqpop; cur[2] = COM(0,1) * cur[1]; cur[3] = -cur[0]; } } else { // positive helicity if (pin.plus() > pin.minus()) { // if forward const double sqpip = sqrt(pin.plus()); cur[0] = sqpop * sqpip; cur[1] = sqpom * sqpip * conj(poperp) / abs(poperp); cur[2] = COM(0,1) * cur[1]; cur[3] = cur[0]; } else { // if backward const double sqpim = sqrt(pin.minus()); cur[0] = -sqpom * sqpim * conj(poperp) / abs(poperp); cur[1] = -sqpim * sqpop; cur[2] = -COM(0,1) * cur[1]; cur[3] = -cur[0]; } } } CCurrent joi (HLV pout, bool helout, HLV pin, bool helin) { current cur; joi(pout, helout, pin, helin, cur); return CCurrent(cur[0],cur[1],cur[2],cur[3]); } void jio(HLV pin, bool helin, HLV pout, bool helout, current &cur) { joi(pout, !helout, pin, !helin, cur); } CCurrent jio (HLV pin, bool helin, HLV pout, bool helout) { current cur; jio(pin, helin, pout, helout, cur); return CCurrent(cur[0],cur[1],cur[2],cur[3]); } void joo(HLV pi, bool heli, HLV pj, bool helj, current &cur) { // Zero our current cur[0] = 0.0; cur[1] = 0.0; cur[2] = 0.0; cur[3] = 0.0; if (heli!=helj) { throw std::invalid_argument{"Non-matching helicities"}; } else if ( heli == true ) { // If positive helicity swap momenta std::swap(pi,pj); } const double sqpjp = sqrt(pj.plus()); const double sqpjm = sqrt(pj.minus()); const double sqpip = sqrt(pi.plus()); const double sqpim = sqrt(pi.minus()); const COM piperp = pi.x() + COM(0,1) * pi.y(); const COM pjperp = pj.x() + COM(0,1) * pj.y(); const COM phasei = piperp / abs(piperp); const COM phasej = pjperp / abs(pjperp); cur[0] = sqpim * sqpjm * phasei * conj(phasej) + sqpip * sqpjp; cur[1] = sqpim * sqpjp * phasei + sqpip * sqpjm * conj(phasej); cur[2] = -COM(0, 1) * (sqpim * sqpjp * phasei - sqpip * sqpjm * conj(phasej)); cur[3] = -sqpim * sqpjm * phasei * conj(phasej) + sqpip * sqpjp; } CCurrent joo (HLV pi, bool heli, HLV pj, bool helj) { current cur; joo(pi, heli, pj, helj, cur); return CCurrent(cur[0],cur[1],cur[2],cur[3]); } +namespace{ //@{ -/** - * @brief Pure Jet FKL Contributions, function to handle all incoming types. - * @param p1out Outgoing Particle 1. - * @param p1in Incoming Particle 1. - * @param p2out Outgoing Particle 2 - * @param p2in Incoming Particle 2 - * @param aqlineb Bool. Is Backwards quark line an anti-quark line? - * @param aqlinef Bool. Is Forwards quark line an anti-quark line? - * - * Calculates j_\mu j^\mu. - * Handles all possible incoming states. - */ -double j_j(HLV p1out, HLV p1in, HLV p2out, HLV p2in, bool aqlineb, bool aqlinef){ - HLV q1=p1in-p1out; - HLV q2=-(p2in-p2out); - current mj1m,mj1p,mj2m,mj2p; - - // Note need to flip helicities in anti-quark case. - joi(p1out,!aqlineb, p1in,!aqlineb, mj1p); - joi(p1out, aqlineb, p1in, aqlineb, mj1m); - joi(p2out,!aqlinef, p2in,!aqlinef, mj2p); - joi(p2out, aqlinef, p2in, aqlinef, mj2m); - - COM Mmp=cdot(mj1m,mj2p); - COM Mmm=cdot(mj1m,mj2m); - COM Mpp=cdot(mj1p,mj2p); - COM Mpm=cdot(mj1p,mj2m); - - double sst=abs2(Mmm)+abs2(Mmp)+abs2(Mpp)+abs2(Mpm); - - // Multiply by Cf^2 - return HEJ::C_F*HEJ::C_F*(sst)/(q1.m2()*q2.m2()); -} - + /** + * @brief Pure Jet FKL Contributions, function to handle all incoming types. + * @param p1out Outgoing Particle 1. + * @param p1in Incoming Particle 1. + * @param p2out Outgoing Particle 2 + * @param p2in Incoming Particle 2 + * @param aqlineb Bool. Is Backwards quark line an anti-quark line? + * @param aqlinef Bool. Is Forwards quark line an anti-quark line? + * + * Calculates j_\mu j^\mu. + * Handles all possible incoming states. + */ + double j_j(HLV p1out, HLV p1in, HLV p2out, HLV p2in, bool aqlineb, bool aqlinef){ + HLV q1=p1in-p1out; + HLV q2=-(p2in-p2out); + current mj1m,mj1p,mj2m,mj2p; + + // Note need to flip helicities in anti-quark case. + joi(p1out,!aqlineb, p1in,!aqlineb, mj1p); + joi(p1out, aqlineb, p1in, aqlineb, mj1m); + joi(p2out,!aqlinef, p2in,!aqlinef, mj2p); + joi(p2out, aqlinef, p2in, aqlinef, mj2m); + + COM Mmp=cdot(mj1m,mj2p); + COM Mmm=cdot(mj1m,mj2m); + COM Mpp=cdot(mj1p,mj2p); + COM Mpm=cdot(mj1p,mj2m); + + double sst=abs2(Mmm)+abs2(Mmp)+abs2(Mpp)+abs2(Mpm); + + // Multiply by Cf^2 + return HEJ::C_F*HEJ::C_F*(sst)/(q1.m2()*q2.m2()); + } +} //anonymous namespace double ME_qQ(HLV p1out, HLV p1in, HLV p2out, HLV p2in){ return j_j(p1out, p1in, p2out, p2in, false, false); } double ME_qQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in){ return j_j(p1out, p1in, p2out, p2in, false, true); } double ME_qbarQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in){ return j_j(p1out, p1in, p2out, p2in, true, true); } double ME_qg(HLV p1out, HLV p1in, HLV p2out, HLV p2in){ return j_j(p1out, p1in, p2out, p2in, false, false)*K_g(p2out, p2in)/HEJ::C_F; } double ME_qbarg(HLV p1out, HLV p1in, HLV p2out, HLV p2in){ return j_j(p1out, p1in, p2out, p2in, true, false)*K_g(p2out, p2in)/(HEJ::C_F); } double ME_gg(HLV p1out, HLV p1in, HLV p2out, HLV p2in){ return j_j(p1out, p1in, p2out, p2in, false, false)*K_g(p1out, p1in)*K_g(p2out, p2in)/(HEJ::C_F*HEJ::C_F); } //@}