diff --git a/src/Wjets.cc b/src/Wjets.cc index dac4bc2..dadae22 100644 --- a/src/Wjets.cc +++ b/src/Wjets.cc @@ -1,520 +1,520 @@ /** * \authors The HEJ collaboration (see AUTHORS for details) - * \date 2020 + * \date 2020-2022 * \copyright GPLv2 or later */ #include "HEJ/Wjets.hh" #include #include #include #include #include #include "HEJ/Constants.hh" #include "HEJ/EWConstants.hh" #include "HEJ/LorentzVector.hh" #include "HEJ/exceptions.hh" // generated headers #include "HEJ/currents/jV_j.hh" #include "HEJ/currents/jV_juno.hh" #include "HEJ/currents/jVuno_j.hh" #include "HEJ/currents/jW_jqqbar.hh" #include "HEJ/currents/jW_qqbar_j.hh" #include "HEJ/currents/jWqqbar_j.hh" #include "HEJ/currents/j_Wqqbar_j.hh" namespace HEJ { namespace currents { namespace { using COM = std::complex; // --- Helper Functions --- // FKL W Helper Functions double WProp(const HLV & plbar, const HLV & pl, ParticleProperties const & wprop ){ COM propW = COM(0.,-1.)/( (pl+plbar).m2() - wprop.mass*wprop.mass + COM(0.,1.)*wprop.mass*wprop.width); double PropFactor=(propW*conj(propW)).real(); return PropFactor; } /** * @brief Contraction of W + unordered jet current with FKL current * * See eq:wunocurrent in the developer manual for the definition * of the W + unordered jet current */ template double jM2Wuno( HLV const & pg, HLV const & p1, HLV const & plbar, HLV const & pl, HLV const & pa, HLV const & p2, HLV const & pb, ParticleProperties const & wprop ){ using helicity::minus; const COM u1 = U1(p1, p2, pa, pb, pg, pl, plbar); const COM u2 = U2(p1, p2, pa, pb, pg, pl, plbar); const COM l = L(p1, p2, pa, pb, pg, pl, plbar); const COM x = u1 - l; const COM y = u2 + l; // eq:VunoSumAveS in developer manual // TODO: use same form as for other uno currents, // extracting at least a factor of K_q = C_F const double amp = C_A*C_F*C_F/2.*(norm(x)+norm(y)) - C_F/2.*(x*conj(y)).real(); return WProp(plbar, pl, wprop) * amp; } /** * @brief Contraction of W + extremal qqbar current with FKL current * * See eq:crossed in the developer manual for the definition * of the W + extremal qqbar current. * */ template double jM2_W_extremal_qqbar( HLV const & pg, HLV const & pq, HLV const & plbar, HLV const & pl, HLV const & pqbar, HLV const & p3, HLV const & pb, ParticleProperties const & wprop ){ const COM u1Xcontr = U1X(pg, pq, plbar, pl, pqbar, p3, pb); const COM u2Xcontr = U2X(pg, pq, plbar, pl, pqbar, p3, pb); const COM lXcontr = LX(pg, pq, plbar, pl, pqbar, p3, pb); const COM x = u1Xcontr - lXcontr; const COM y = u2Xcontr + lXcontr; const double amp = C_A*C_F*C_F/2.*(norm(x)+norm(y)) - C_F/2.*(x*conj(y)).real(); return WProp(plbar, pl, wprop) * amp; } } // Anonymous Namespace //! W+Jets FKL Contributions double ME_W_qQ( HLV const & p1out, HLV const & plbar, HLV const & pl, HLV const & p1in, HLV const & p2out, HLV const & p2in, ParticleProperties const & wprop ){ using helicity::minus; using helicity::plus; const COM ampm = jV_j(p1in,p1out,p2in,p2out,pl,plbar); const COM ampp = jV_j(p1in,p1out,p2in,p2out,pl,plbar); const double Msqr = std::norm(ampm) + std::norm(ampp); return WProp(plbar, pl, wprop) * Msqr; } namespace { // helicity amplitude squares for contraction of W current with unordered // current template double ampsq_jW_juno( HLV const & pa, HLV const & p1, HLV const & pb, HLV const & p2, HLV const & pg, HLV const & pl, HLV const & plbar ){ using helicity::minus; const COM u1 = U1_jV(pa,p1,pb,p2,pg,pl,plbar); const COM u2 = U2_jV(pa,p1,pb,p2,pg,pl,plbar); const COM l = L_jV(pa,p1,pb,p2,pg,pl,plbar); const COM x = u1 - l; const COM y = u2 + l; return C_F*norm(x + y) - C_A*(x*conj(y)).real(); } } // Anonymous Namespace double ME_W_unob_qQ( HLV const & p1out, HLV const & p1in, HLV const & p2out, HLV const & p2in, HLV const & pg, HLV const & plbar, HLV const & pl, ParticleProperties const & wprop ){ using helicity::minus; using helicity::plus; // helicity assignments assume quarks // in the end, this is irrelevant since we sum over all helicities const double ampsq = + ampsq_jW_juno(p2in,p2out,p1in,p1out,pg,pl,plbar) + ampsq_jW_juno (p2in,p2out,p1in,p1out,pg,pl,plbar) + ampsq_jW_juno (p2in,p2out,p1in,p1out,pg,pl,plbar) + ampsq_jW_juno (p2in,p2out,p1in,p1out,pg,pl,plbar) ; return WProp(plbar, pl, wprop)*ampsq; } namespace { // helicity sum helper for jWuno_j(...) template double jWuno_j_helsum( HLV const & pg, HLV const & p1, HLV const & plbar, HLV const & pl, HLV const & pa, HLV const & p2, HLV const & pb, ParticleProperties const & wprop ){ using helicity::minus; using helicity::plus; const double ME2h1pp = jM2Wuno( pg, p1, plbar, pl, pa, p2, pb, wprop ); const double ME2h1pm = jM2Wuno( pg, p1, plbar, pl, pa, p2, pb, wprop ); const double ME2h1mp = jM2Wuno( pg, p1, plbar, pl, pa, p2, pb, wprop ); const double ME2h1mm = jM2Wuno( pg, p1, plbar, pl, pa, p2, pb, wprop ); return ME2h1pp + ME2h1pm + ME2h1mp + ME2h1mm; } } // Anonymous Namespace double ME_Wuno_qQ( HLV const & p1out, HLV const & p1in, HLV const & p2out, HLV const & p2in, HLV const & pg, HLV const & plbar, HLV const & pl, ParticleProperties const & wprop ){ return jWuno_j_helsum( pg, p1out, plbar, pl, p1in, p2out, p2in, wprop )/(4.*C_A*C_A); } // helicity sum helper for jWqqbar_j(...) template double jWqqbar_j_helsum( HLV const & pg, HLV const & pq, HLV const & plbar, HLV const & pl, HLV const & pqbar, HLV const & p3, HLV const & pb, ParticleProperties const & wprop ){ using helicity::minus; using helicity::plus; const double amp_h1pp = jM2_W_extremal_qqbar( pg, pq, plbar, pl, pqbar, p3, pb, wprop ); const double amp_h1pm = jM2_W_extremal_qqbar( pg, pq, plbar, pl, pqbar, p3, pb, wprop ); const double amp_h1mp = jM2_W_extremal_qqbar( pg, pq, plbar, pl, pqbar, p3, pb, wprop ); const double amp_h1mm = jM2_W_extremal_qqbar( pg, pq, plbar, pl, pqbar, p3, pb, wprop ); return amp_h1pp + amp_h1pm + amp_h1mp + amp_h1mm; } double ME_WExqqbar_qqbarQ( HLV const & pgin, HLV const & pqbarout, HLV const & plbar, HLV const & pl, HLV const & pqout, HLV const & p2out, HLV const & p2in, ParticleProperties const & wprop ){ //Helicity sum and average over initial states. double ME2 = jWqqbar_j_helsum( pgin, pqbarout, plbar, pl, pqout, p2out, p2in, wprop )/(4.*C_A*C_A); //Correct colour averaging after crossing: ME2*=(3.0/8.0); return ME2; } namespace { template double jW_jqqbar( HLV const & pb, HLV const & p2, HLV const & p3, HLV const & pa, HLV const & p1, HLV const & pl, HLV const & plbar ){ using std::norm; static constexpr double cm1m1 = 8./3.; static constexpr double cm2m2 = 8./3.; static constexpr double cm3m3 = 6.; static constexpr double cm1m2 =-1./3.; static constexpr COM cm1m3 = COM{0.,-3.}; static constexpr COM cm2m3 = COM{0.,3.}; const COM m1 = jW_qggm1(pb,p2,p3,pa,p1,pl,plbar); const COM m2 = jW_qggm2(pb,p2,p3,pa,p1,pl,plbar); const COM m3 = jW_qggm3(pb,p2,p3,pa,p1,pl,plbar); return + cm1m1*norm(m1) + cm2m2*norm(m2) + cm3m3*norm(m3) + 2.*real(cm1m2*m1*conj(m2)) + 2.*real(cm1m3*m1*conj(m3)) + 2.*real(cm2m3*m2*conj(m3)) ; } } // Anonymous Namespace // contraction of W current with extremal qqbar on the other side double ME_W_Exqqbar_QQq( HLV const & pa, HLV const & pb, HLV const & p1, HLV const & p2, HLV const & p3, HLV const & plbar, HLV const & pl, bool aqlinepa, ParticleProperties const & wprop ){ using helicity::minus; using helicity::plus; const double wPropfact = WProp(plbar, pl, wprop); const double prefactor = 2.*wPropfact/24./4.; if(aqlinepa) { return prefactor*( jW_jqqbar(pb,p2,p3,pa,p1,pl,plbar) + jW_jqqbar(pb,p2,p3,pa,p1,pl,plbar) ); } return prefactor*( jW_jqqbar(pb,p2,p3,pa,p1,pl,plbar) + jW_jqqbar(pb,p2,p3,pa,p1,pl,plbar) ); } namespace { // helper function for matrix element for W + Jets with central qqbar template double amp_WCenqqbar_qq( HLV const & pa, HLV const & p1, HLV const & pb, HLV const & p4, HLV const & pq, HLV const & pqbar, HLV const & pl, HLV const & plbar, HLV const & q11, HLV const & q12 ){ using std::norm; const COM sym = M_sym_W( pa, p1, pb, p4, pq, pqbar, pl, plbar, q11, q12 ); const COM cross = M_cross_W( pa, p1, pb, p4, pq, pqbar, pl, plbar, q11, q12 ); const COM uncross = M_uncross_W( pa, p1, pb, p4, pq, pqbar, pl, plbar, q11, q12 ); // Colour factors static constexpr double cmsms = 3.; static constexpr double cmumu = 4./3.; static constexpr double cmcmc = 4./3.; static constexpr COM cmsmu = COM{0., 3./2.}; static constexpr COM cmsmc = COM{0.,-3./2.}; static constexpr double cmumc = -1./6.; return +cmsms*norm(sym) +cmumu*norm(uncross) +cmcmc*norm(cross) +2.*real(cmsmu*sym*conj(uncross)) +2.*real(cmsmc*sym*conj(cross)) +2.*real(cmumc*uncross*conj(cross)) ; } } // Anonymous Namespace // matrix element for W + Jets with W emission off central qqbar double ME_WCenqqbar_qq( HLV const & pa, HLV const & pb, HLV const & pl, HLV const & plbar, std::vector const & partons, bool /* aqlinepa */, bool /* aqlinepb */, bool qqbar_marker, int nabove, ParticleProperties const & wprop ){ using helicity::plus; using helicity::minus; CLHEP::HepLorentzVector q1 = pa; for(int i = 0; i <= nabove; ++i){ q1 -= partons[i]; } const auto qq = split_into_lightlike(q1); // since q1.m2() < 0 the following assertion is always true // see documentation for split_into_lightlike assert(qq.second.e() < 0); HLV pq; HLV pqbar; if (qqbar_marker){ pqbar = partons[nabove+1]; pq = partons[nabove+2];} else{ pq = partons[nabove+1]; pqbar = partons[nabove+2]; } const HLV p1 = partons.front(); const HLV p4 = partons.back(); // 4 Different Helicity Choices (Differs from Pure Jet Case, where there is // also the choice in qqbar helicity. // the first helicity label is for aqlinepa == true, // the second one for aqlinepb == true // In principle the corresponding helicity should be flipped // if either of them is false, but we sum up all helicities, // so this has no effect in the end. const double amp_mm = amp_WCenqqbar_qq( pa, p1, pb, p4, pq, pqbar, pl, plbar, qq.first, -qq.second ); const double amp_mp = amp_WCenqqbar_qq( pa, p1, pb, p4, pq, pqbar, pl, plbar, qq.first, -qq.second ); const double amp_pm = amp_WCenqqbar_qq( pa, p1, pb, p4, pq, pqbar, pl, plbar, qq.first, -qq.second ); const double amp_pp = amp_WCenqqbar_qq( pa, p1, pb, p4, pq, pqbar, pl, plbar, qq.first, -qq.second ); // Divide by t channels, extremal + adjacent central vertex const double ta = (pa-p1).m2(); const double t1 = q1.m2(); const double t3 = (q1-pl-plbar-pq-pqbar).m2(); const double tb = (p4-pb).m2(); const double amp = WProp(plbar, pl, wprop)*( amp_mm+amp_mp+amp_pm+amp_pp )/(9.*4.*ta*t1*t3*tb); return amp; } // helper function for matrix element for W + Jets with central qqbar // W emitted off extremal parton // @TODO: code duplication with amp_WCenqqbar_qq template double amp_W_Cenqqbar_qq( HLV const & pa, HLV const & p1, HLV const & pb, HLV const & pn, HLV const & pq, HLV const & pqbar, HLV const & pl, HLV const & plbar, HLV const & q11, HLV const & q12 ){ using std::norm; const COM crossed = M_cross( pa, p1, pb, pn, pq, pqbar, pl, plbar, q11, q12 ); const COM uncrossed = M_qbar( pa, p1, pb, pn, pq, pqbar, pl, plbar, q11, q12 ); const COM sym = M_sym( pa, p1, pb, pn, pq, pqbar, pl, plbar, q11, q12 ); //Colour factors: static constexpr double cmsms = 3.; static constexpr double cmumu = 4./3.; static constexpr double cmcmc = 4./3.; static constexpr COM cmsmu = COM{0.,3./2.}; static constexpr COM cmsmc = COM{0.,-3./2.}; static constexpr double cmumc = -1./6.; return +cmsms*norm(sym) +cmumu*norm(uncrossed) +cmcmc*norm(crossed) +2.*real(cmsmu*sym*conj(uncrossed)) +2.*real(cmsmc*sym*conj(crossed)) +2.*real(cmumc*uncrossed*conj(crossed)) ; } // matrix element for W + Jets with W emission *not* off central qqbar double ME_W_Cenqqbar_qq( HLV pa, HLV pb, HLV pl,HLV plbar, std::vector partons, bool aqlinepa, bool aqlinepb, bool qqbar_marker, int nabove, int nbelow, bool forwards, ParticleProperties const & wprop ){ using helicity::minus; using helicity::plus; if (!forwards){ //If Emission from Leg a instead, flip process. std::swap(pa, pb); std::reverse(partons.begin(),partons.end()); std::swap(aqlinepa, aqlinepb); qqbar_marker = !qqbar_marker; std::swap(nabove,nbelow); } HLV q1=pa; for(int i=0;i( pa, p1, pb, pn, pq, pqbar, pl, plbar, qq.first, -qq.second ); const double amp_mp = amp_W_Cenqqbar_qq( pa, p1, pb, pn, pq, pqbar, pl, plbar, qq.first, -qq.second ); const double amp_pm = amp_W_Cenqqbar_qq( pa, p1, pb, pn, pq, pqbar, pl, plbar, qq.first, -qq.second ); const double amp_pp = amp_W_Cenqqbar_qq( pa, p1, pb, pn, pq, pqbar, pl, plbar, qq.first, -qq.second ); // Divide by t channels, extremal + adjacent central vertex const double ta = (pa-p1).m2(); const double t1 = q1.m2(); const double t3 = (q1 - pq - pqbar).m2(); const double tb = (pn+pl+plbar-pb).m2(); const double amp= WProp(plbar, pl, wprop)*( amp_mm+amp_mp+amp_pm+amp_pp )/(9.*4.*ta*t1*t3*tb); return amp; } } // namespace currents } // namespace HEJ diff --git a/src/Zjets.cc b/src/Zjets.cc index d3010dc..7ee4278 100644 --- a/src/Zjets.cc +++ b/src/Zjets.cc @@ -1,456 +1,456 @@ /** * \authors The HEJ collaboration (see AUTHORS for details) - * \date 2020 + * \date 2020-2022 * \copyright GPLv2 or later */ #include #include "HEJ/Constants.hh" #include "HEJ/EWConstants.hh" #include "HEJ/PDG_codes.hh" #include "HEJ/utility.hh" #include "HEJ/Zjets.hh" // generated headers #include "HEJ/currents/jV_j.hh" #include "HEJ/currents/jV_juno.hh" #include "HEJ/currents/jVuno_j.hh" namespace HEJ { namespace currents { namespace { using COM = std::complex; // Z propagator COM ZProp(const double q, ParticleProperties const & zprop){ return 1. / (q - zprop.mass*zprop.mass + COM(0.,1.)*zprop.width*zprop.mass); } // Photon propagator COM GProp(const double q) { return 1. / q; } // Weak charge template double Zq(ParticleID PID, double stw2, double ctw); // Weak charge - Positive Spin template<> double Zq( const ParticleID PID, const double stw2, const double ctw ) { using namespace pid; // quarks if (PID == d || PID == s || PID == b) return (+ 1.0 * stw2 / 3.0) / ctw; if (PID == u || PID == c) return (- 2.0 * stw2 / 3.0) / ctw; // antiquarks if (PID == d_bar || PID == s_bar || PID == b_bar) return (+ 0.5 - 1.0 * stw2 / 3.0) / ctw; if (PID == u_bar || PID == c_bar) return (- 0.5 + 2.0 * stw2 / 3.0) / ctw; // electron if (PID == electron) return stw2 / ctw; throw std::logic_error("ERROR! No weak charge found"); } // Weak charge - Negative Spin template<> double Zq( const ParticleID PID, const double stw2, const double ctw ) { using namespace pid; // quarks if (PID == d || PID == s || PID == b) return (- 0.5 + 1.0 * stw2 / 3.0) / ctw; if (PID == u || PID == c) return (+ 0.5 - 2.0 * stw2 / 3.0) / ctw; // antiquarks if (PID == d_bar || PID == s_bar || PID == b_bar) return (- 1.0 * stw2 / 3.0) / ctw; if (PID == u_bar || PID == c_bar) return (+ 2.0 * stw2 / 3.0) / ctw; // electron if (PID == electron) return (-1.0 / 2.0 + stw2) / ctw; throw std::logic_error("ERROR! No weak charge found"); } // Electric charge double Gq (const ParticleID PID) { using namespace pid; if (PID == d || PID == s || PID == b) return -1./3.; if (PID == u || PID == c) return +2./3.; if (PID == d_bar || PID == s_bar || PID == b_bar) return +1./3.; if (PID == u_bar || PID == c_bar) return -2./3.; throw std::logic_error("ERROR! No electric charge found"); } //! Prefactor for Z+Jets Contributions /** * @brief Z+Jets Contributions Prefactor * @param aptype Incoming Particle 1 type (Z emission) * @param propZ Z Propagator * @param propG Photon Propagator * @param stw2 Value of sin(theta_w)^2 * @param ctw Value of cos(theta_w) * @returns Prefactors for Z+Jets for all helicity combinations * (includes couplings and propagators) */ MultiArray Z_amp_pref( const ParticleID aptype, COM const & propZ, COM const & propG, const double stw2, const double ctw ){ using helicity::plus; using helicity::minus; const double zq_a_p = Zq(aptype, stw2, ctw); const double zq_a_m = Zq(aptype, stw2, ctw); const double ze_p = Zq(pid::electron, stw2, ctw); const double ze_m = Zq(pid::electron, stw2, ctw); const double gq_a = Gq(aptype); MultiArray res; res[ plus][ plus] = -2.*(zq_a_p * ze_p * propZ - gq_a * propG * stw2); res[ plus][minus] = -2.*(zq_a_p * ze_m * propZ - gq_a * propG * stw2); res[minus][minus] = -2.*(zq_a_m * ze_m * propZ - gq_a * propG * stw2); res[minus][ plus] = -2.*(zq_a_m * ze_p * propZ - gq_a * propG * stw2); return res; } //! Z+Jets FKL Contribution /** * @brief Z+Jets FKL Contribution * @param pa Incoming Particle 1 (Z emission) * @param pb Incoming Particle 2 * @param p1 Outgoing Particle 1 (Z emission) * @param p2 Outgoing Particle 2 * @param pep Outgoing positron * @param pem Outgoing electron * @returns j_Z^\mu j_\mu for all helicities h1, hl, h2 */ MultiArray jZ_j( const HLV & pa, const HLV & pb, const HLV & p1, const HLV & p2, const HLV & pep, const HLV & pem ){ using helicity::plus; using helicity::minus; MultiArray res; // NOLINTNEXTLINE #define ASSIGN_HEL(RES, J, H1, HL, H2) \ RES[H1][HL][H2] = J(pa, p1, pb, p2, pem, pep) ASSIGN_HEL(res, jV_j, plus, minus, minus); ASSIGN_HEL(res, jV_j, plus, minus, plus); ASSIGN_HEL(res, jV_j, plus, plus, minus); ASSIGN_HEL(res, jV_j, plus, plus, plus); #undef ASSIGN_HEL for(auto hl: {minus, plus}) { for(auto h2: {minus, plus}) { res[minus][hl][h2] = std::conj(res[plus][flip(hl)][flip(h2)]); } } return res; } // X and Y as used in contractions with unordered currents struct XY { COM X; COM Y; }; /** * @brief Z+Jets Unordered Contribution, unordered on Z side * @tparam h1 Helicity of line 1 (Z emission line) * @tparam hl Lepton Helicity * @tparam h2 Helicity of line 2 * @tparam hg Helicity of unordered gluon * @param pa Incoming Particle 1 (Z and Uno emission) * @param pb Incoming Particle 2 * @param pg Unordered Gluon * @param p1 Outgoing Particle 1 (Z and Uno emission) * @param p2 Outgoing Particle 2 * @param pep Outgoing positron * @param pem Outgoing electron * @returns X: (U1-L), Y: (U2+l) * * Calculates j_Z_{uno}^\mu j_\mu. Ie, unordered with Z emission same side. */ template XY amp_jZuno_j( const HLV & pa, const HLV & pb, const HLV & pg, const HLV & p1, const HLV & p2, const HLV & pep, const HLV & pem ){ const COM u1 = U1(p1, p2, pa, pb, pg, pem, pep); const COM u2 = U2(p1, p2, pa, pb, pg, pem, pep); const COM l = L (p1, p2, pa, pb, pg, pem, pep); return {u1 - l, u2 + l}; } MultiArray jZuno_j( const HLV & pa, const HLV & pb, const HLV & pg, const HLV & p1, const HLV & p2, const HLV & pep, const HLV & pem ){ using helicity::plus; using helicity::minus; MultiArray xy; // NOLINTNEXTLINE #define ASSIGN_HEL(XY, J, H1, H2, H3, H4) \ XY[H1][H2][H3][H4] = J(pa, pb, pg, p1, p2, pep, pem) // NOLINT ASSIGN_HEL(xy, amp_jZuno_j, minus, minus, minus, minus); ASSIGN_HEL(xy, amp_jZuno_j, minus, minus, minus, plus); ASSIGN_HEL(xy, amp_jZuno_j, minus, minus, plus, minus); ASSIGN_HEL(xy, amp_jZuno_j, minus, minus, plus, plus); ASSIGN_HEL(xy, amp_jZuno_j, minus, plus, minus, minus); ASSIGN_HEL(xy, amp_jZuno_j, minus, plus, minus, plus); ASSIGN_HEL(xy, amp_jZuno_j, minus, plus, plus, minus); ASSIGN_HEL(xy, amp_jZuno_j, minus, plus, plus, plus); ASSIGN_HEL(xy, amp_jZuno_j, plus, minus, minus, minus); ASSIGN_HEL(xy, amp_jZuno_j, plus, minus, minus, plus); ASSIGN_HEL(xy, amp_jZuno_j, plus, minus, plus, minus); ASSIGN_HEL(xy, amp_jZuno_j, plus, minus, plus, plus); ASSIGN_HEL(xy, amp_jZuno_j, plus, plus, minus, minus); ASSIGN_HEL(xy, amp_jZuno_j, plus, plus, minus, plus); ASSIGN_HEL(xy, amp_jZuno_j, plus, plus, plus, minus); ASSIGN_HEL(xy, amp_jZuno_j, plus, plus, plus, plus); #undef ASSIGN_HEL return xy; } /** * @brief Z+Jets Unordered Contribution, unordered opposite to Z side * @tparam h1 Helicity of line 1 (Z emission) * @tparam hl Lepton Helicity * @tparam h2 Helicity of line 2 (unordered emission) * @tparam hg Helicity of unordered gluon * @param pa Incoming Particle 1 (Z emission) * @param pb Incoming Particle 2 (unordered emission) * @param p1 Outgoing Particle 1 (Z emission) * @param p2 Outgoing Particle 2 (unordered emission) * @param pg Unordered Gluon * @param pep Outgoing positron * @param pem Outgoing electron * @returns X: (U1-L), Y: (U2+l) * * Calculates j_Z^\mu j_{uno}_\mu. Ie, unordered with Z emission opposite side. */ template XY amp_jZ_juno( const HLV & pa, const HLV & pb, const HLV & p1, const HLV & p2, const HLV & pg, const HLV & pep, const HLV & pem ){ const COM u1 = U1_jV(pa, p1, pb, p2, pg, pem, pep); const COM u2 = U2_jV(pa, p1, pb, p2, pg, pem, pep); const COM l = L_jV (pa, p1, pb, p2, pg, pem, pep); return {u1 - l, u2 + l}; } MultiArray jZ_juno( const HLV & pa, const HLV & pb, const HLV & p1, const HLV & p2, const HLV & pg, const HLV & pep, const HLV & pem ){ using helicity::plus; using helicity::minus; MultiArray xy; // NOLINTNEXTLINE #define ASSIGN_HEL(XY, J, H1, H2, H3, H4) \ XY[H1][H2][H3][H4] = J(pa, pb, p1, p2, pg, pep, pem) ASSIGN_HEL(xy, amp_jZ_juno, minus, minus, minus, minus); ASSIGN_HEL(xy, amp_jZ_juno, minus, minus, minus, plus); ASSIGN_HEL(xy, amp_jZ_juno, minus, minus, plus, minus); ASSIGN_HEL(xy, amp_jZ_juno, minus, minus, plus, plus); ASSIGN_HEL(xy, amp_jZ_juno, minus, plus, minus, minus); ASSIGN_HEL(xy, amp_jZ_juno, minus, plus, minus, plus); ASSIGN_HEL(xy, amp_jZ_juno, minus, plus, plus, minus); ASSIGN_HEL(xy, amp_jZ_juno, minus, plus, plus, plus); ASSIGN_HEL(xy, amp_jZ_juno, plus, minus, minus, minus); ASSIGN_HEL(xy, amp_jZ_juno, plus, minus, minus, plus); ASSIGN_HEL(xy, amp_jZ_juno, plus, minus, plus, minus); ASSIGN_HEL(xy, amp_jZ_juno, plus, minus, plus, plus); ASSIGN_HEL(xy, amp_jZ_juno, plus, plus, minus, minus); ASSIGN_HEL(xy, amp_jZ_juno, plus, plus, minus, plus); ASSIGN_HEL(xy, amp_jZ_juno, plus, plus, plus, minus); ASSIGN_HEL(xy, amp_jZ_juno, plus, plus, plus, plus); #undef ASSIGN_HEL return xy; } } // Anonymous Namespace std::vector ME_Z_qQ(const HLV & pa, const HLV & pb, const HLV & p1, const HLV & p2, const HLV & pep, const HLV & pem, const ParticleID aptype, const ParticleID bptype, ParticleProperties const & zprop, const double stw2, const double ctw ){ using helicity::minus; using helicity::plus; const HLV pZ = pep + pem; const COM propZ = ZProp(pZ.m2(), zprop); const COM propG = GProp(pZ.m2()); MultiArray pref_top = Z_amp_pref(aptype, propZ, propG, stw2, ctw); MultiArray pref_bot = Z_amp_pref(bptype, propZ, propG, stw2, ctw); MultiArray coeff_top = jZ_j(pa, pb, p1, p2, pep, pem); MultiArray coeff_bot = jZ_j(pb, pa, p2, p1, pep, pem); double sum_top=0.; double sum_bot=0.; double sum_mix=0.; for(auto h1: {minus, plus}){ for(auto hl: {minus, plus}){ for(auto h2: {minus, plus}){ const COM res_top = pref_top[h1][hl] * coeff_top[h1][hl][h2]; const COM res_bot = pref_bot[h2][hl] * coeff_bot[h2][hl][h1]; sum_top += norm(res_top); sum_bot += norm(res_bot); sum_mix += 2.0 * real(res_top * conj(res_bot)); } } } return {sum_top, sum_bot, sum_mix}; } double ME_Z_qg(const HLV & pa, const HLV & pb, const HLV & p1, const HLV & p2, const HLV & pep, const HLV & pem, const ParticleID aptype, const ParticleID /*bptype*/, ParticleProperties const & zprop, const double stw2, const double ctw ){ using helicity::minus; using helicity::plus; const HLV pZ = pep + pem; const COM propZ = ZProp(pZ.m2(), zprop); const COM propG = GProp(pZ.m2()); MultiArray pref = Z_amp_pref(aptype, propZ, propG, stw2, ctw); MultiArray coeff = jZ_j(pa, pb, p1, p2, pep, pem); double sum = 0.; for(auto h1: {minus, plus}){ for(auto hl: {minus, plus}){ for(auto h2: {minus, plus}){ sum += norm(pref[h1][hl] * coeff[h1][hl][h2]); } } } return sum; } std::vector ME_Zuno_qQ(const HLV & pa, const HLV & pb, const HLV & pg, const HLV & p1, const HLV & p2, const HLV & pep, const HLV & pem, const ParticleID aptype, const ParticleID bptype, ParticleProperties const & zprop, const double stw2, const double ctw ){ using helicity::minus; using helicity::plus; const HLV pZ = pep + pem; const COM propZ = ZProp(pZ.m2(), zprop); const COM propG = GProp(pZ.m2()); MultiArray prefact_top = Z_amp_pref(aptype, propZ, propG, stw2, ctw); MultiArray prefact_bot = Z_amp_pref(bptype, propZ, propG, stw2, ctw); const MultiArray coeff_top = jZuno_j(pa, pb, pg, p1, p2, pep, pem); const MultiArray coeff_bot = jZ_juno(pb, pa, p2, p1, pg, pep, pem); double sum_top=0.; double sum_bot=0.; double sum_mix=0.; for(auto h1: {minus, plus}){ for(auto hl: {minus, plus}){ for(auto h2: {minus, plus}){ for(auto hg: {minus, plus}){ const COM pref_top = prefact_top[h1][hl]; const COM x_top = coeff_top[h1][hl][h2][hg].X; const COM y_top = coeff_top[h1][hl][h2][hg].Y; const COM pref_bot = prefact_bot[h2][hl]; const COM x_bot = coeff_bot[h2][hl][h1][hg].X; const COM y_bot = coeff_bot[h2][hl][h1][hg].Y; sum_top += norm(pref_top) * (C_A*C_F*C_F/2.*(norm(x_top)+norm(y_top)) - C_F/2.*(x_top*conj(y_top)).real()); sum_bot += norm(pref_bot) * (C_A*C_F*C_F/2.*(norm(x_bot)+norm(y_bot)) - C_F/2.*(x_bot*conj(y_bot)).real()); const COM xx = C_A*C_F*C_F/2. * pref_top * x_top * conj(pref_bot * x_bot); const COM yy = C_A*C_F*C_F/2. * pref_top * y_top * conj(pref_bot * y_bot); const COM xy = -C_F/2. * (pref_top * x_top * conj(pref_bot * y_bot) + pref_top * y_top * conj(pref_bot * x_bot)); sum_mix += 2.0 * real(xx + yy + xy); } } } } //Helicity sum and average over initial states const double pref = 1./(4.*C_A*C_A); return {sum_top*pref, sum_bot*pref, sum_mix*pref}; } double ME_Zuno_qg(const HLV & pa, const HLV & pb, const HLV & pg, const HLV & p1, const HLV & p2, const HLV & pep, const HLV & pem, const ParticleID aptype, const ParticleID /*bptype*/, ParticleProperties const & zprop, const double stw2, const double ctw ){ using helicity::minus; using helicity::plus; const HLV pZ = pep + pem; const COM propZ = ZProp(pZ.m2(), zprop); const COM propG = GProp(pZ.m2()); MultiArray pref = Z_amp_pref(aptype, propZ, propG, stw2, ctw); const auto coeff = jZuno_j(pa, pb, pg, p1, p2, pep, pem); double sum = 0.; for(auto h1: {minus, plus}){ for(auto hl: {minus, plus}){ for(auto h2: {minus, plus}){ for(auto hg: {minus, plus}){ const COM X = coeff[h1][hl][h2][hg].X; const COM Y = coeff[h1][hl][h2][hg].Y; sum += norm(pref[h1][hl]) * (C_A*C_F*C_F/2.*(norm(X)+norm(Y)) - C_F/2.*(X*conj(Y)).real()); } } } } //Helicity sum and average over initial states return sum / (4.*C_A*C_A); } } // namespace currents } // namespace HEJ