Page MenuHomeHEPForge

No OneTemporary

diff --git a/src/jets.cc b/src/jets.cc
index 0891a67..a64bebc 100644
--- a/src/jets.cc
+++ b/src/jets.cc
@@ -1,715 +1,715 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019-2020
* \copyright GPLv2 or later
*/
#include "HEJ/jets.hh"
#include <algorithm>
#include <cassert>
#include <cmath>
#include "HEJ/Constants.hh"
// generated headers
#include "HEJ/currents/j_j.hh"
#include "HEJ/currents/j_qqbar_j.hh"
using HEJ::Helicity;
namespace helicity = HEJ::helicity;
namespace {
// short hand for math functions
using std::abs;
using std::conj;
using std::pow;
using std::sqrt;
double metric(const size_t mu, const size_t nu) {
if(mu != nu) return 0.;
return (mu == 0)?1.:-1.;
}
} // Anonymous Namespace
namespace HEJ {
namespace currents {
// 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)*(C_A - 1./C_A) + 1./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) const
{
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 {result_c0,result_c1,result_c2,result_c3};
}
CCurrent CCurrent::operator-(const CCurrent& other) const
{
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 {result_c0,result_c1,result_c2,result_c3};
}
CCurrent CCurrent::operator*(const double x) const
{
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 {result_c0,result_c1,result_c2,result_c3};
}
CCurrent CCurrent::operator/(const double x) const
{
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 {result_c0,result_c1,result_c2,result_c3};
}
CCurrent CCurrent::operator*(const COM x) const
{
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 {result_c0,result_c1,result_c2,result_c3};
}
CCurrent CCurrent::operator/(const COM x) const
{
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 {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 const & m)
{
return m*x;
}
CCurrent operator * ( COM const & x, CCurrent const & m)
{
return m*x;
}
CCurrent operator / ( double x, CCurrent const & m)
{
return m/x;
}
CCurrent operator / ( COM const & x, CCurrent const & m)
{
return m/x;
}
COM CCurrent::dot(HLV const & p1) const
{
// 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 const & p1) const
{
return p1.c0*c0-p1.c1*c1-p1.c2*c2-p1.c3*c3;
}
//Current Functions
void joi(HLV const & pout, bool helout,
HLV const & pin, bool helin, current &cur
){
cur[0]=0.;
cur[1]=0.;
cur[2]=0.;
cur[3]=0.;
const double sqpop = sqrt(abs(pout.plus()));
const double sqpom = sqrt(abs(pout.minus()));
// Allow for "jii" format
const COM poperp = (pout.x()==0 && pout.y() ==0) ? -1 : pout.x()+COM(0,1)*pout.y();
if (helout != helin) {
throw std::invalid_argument{"Non-matching helicities"};
}
if (!helout) { // negative helicity
if (pin.plus() > pin.minus()) { // if forward
const double sqpip = sqrt(abs(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(abs(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(abs(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
double sqpim = sqrt(abs(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 const & pout, bool helout, HLV const & pin, bool helin)
{
current cur;
joi(pout, helout, pin, helin, cur);
return {cur[0],cur[1],cur[2],cur[3]};
}
void jio(HLV const & pin, bool helin,
HLV const & pout, bool helout, current &cur
) {
joi(pout, !helout, pin, !helin, cur);
}
CCurrent jio(HLV const & pin, bool helin, HLV const & pout, bool helout){
current cur;
jio(pin, helin, pout, helout, cur);
return {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"};
}
if ( heli ) { // If positive helicity swap momenta
std::swap(pi,pj);
}
const double sqpjp = sqrt(abs(pj.plus() ));
const double sqpjm = sqrt(abs(pj.minus()));
const double sqpip = sqrt(abs(pi.plus() ));
const double sqpim = sqrt(abs(pi.minus()));
// Allow for "jii" format
const COM piperp = (pi.x()==0 && pi.y() ==0) ? -1 : pi.x()+COM(0,1)*pi.y();
const COM pjperp = (pj.x()==0 && pj.y() ==0) ? -1 : 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 const & pi, bool heli, HLV const & pj, bool helj)
{
current cur;
joo(pi, heli, pj, helj, cur);
return {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
*
* Calculates j_\mu j^\mu.
* Handles all possible incoming states. Helicity doesn't matter since we sum
* over all of them. In addition, we only have to distinguish between the two
* possibilities of contracting same-helicity or opposite-helicity currents.
*/
double j_j(HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
COM const Mp = HEJ::j_j<helicity::plus>(p1in, p1out, p2in, p2out);
COM const Mm = HEJ::j_j<helicity::minus>(p1in, p1out, p2in, p2out);
double const sst=abs2(Mm)+abs2(Mp);
HLV const q1=p1in-p1out;
HLV const q2=-(p2in-p2out);
- // Multiply by Cf^2
+ // Multiply by Cf^2 (colour) * 2 (helicities)
return 2.*C_F*C_F*(sst)/(q1.m2()*q2.m2());
}
} // Anonymous Namespace
double ME_qQ(HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return j_j(p1out, p1in, p2out, p2in);
}
double ME_qQbar(HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return j_j(p1out, p1in, p2out, p2in);
}
double ME_qbarQbar(HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return j_j(p1out, p1in, p2out, p2in);
}
double ME_qg(HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return j_j(p1out, p1in, p2out, p2in)*K_g(p2out, p2in)/C_F;
}
double ME_qbarg(HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return j_j(p1out, p1in, p2out, p2in)*K_g(p2out, p2in)/(C_F);
}
double ME_gg(HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return j_j(p1out, p1in, p2out, p2in)*K_g(p1out, p1in)*K_g(p2out, p2in)/(C_F*C_F);
}
//@}
namespace {
double juno_j(HLV const & pg, HLV const & p1out,
HLV const & p1in, HLV const & p2out, HLV const & p2in
){
// This construction is taking rapidity order: pg > p1out >> p2out
HLV q1=p1in-p1out; // Top End
HLV q2=-(p2in-p2out); // Bottom End
HLV qg=p1in-p1out-pg; // Extra bit post-gluon
// Note <p1|eps|pa> current split into two by gauge choice.
// See James C's Thesis (p72). <p1|eps|pa> -> <p1|pg><pg|pa>
CCurrent mj1p=joi(p1out, false, p1in, false);
CCurrent mj1m=joi(p1out, true, p1in, true);
CCurrent jgap=joi(pg, false, p1in, false);
CCurrent jgam=joi(pg, true, p1in, true);
// Note for function joo(): <p1+|pg+> = <pg-|p1->.
CCurrent j2gp=joo(p1out, false, pg, false);
CCurrent j2gm=joo(p1out, true, pg, true);
CCurrent mj2p=joi(p2out, false, p2in, false);
CCurrent mj2m=joi(p2out, true, p2in, true);
// Dot products of these which occur again and again
COM Mmp=mj1m.dot(mj2p);
COM Mmm=mj1m.dot(mj2m);
COM Mpp=mj1p.dot(mj2p);
COM Mpm=mj1p.dot(mj2m);
CCurrent p1o(p1out);
CCurrent p2o(p2out);
CCurrent p2i(p2in);
CCurrent qsum(q1+qg);
CCurrent p1i(p1in);
CCurrent Lmm=(qsum*(Mmm)+(-2.*mj2m.dot(pg))*mj1m+2.*mj1m.dot(pg)*mj2m
+(p2o/pg.dot(p2out) + p2i/pg.dot(p2in))*(qg.m2()*Mmm/2.))/q1.m2();
CCurrent Lmp=(qsum*(Mmp) + (-2.*mj2p.dot(pg))*mj1m+2.*mj1m.dot(pg)*mj2p
+(p2o/pg.dot(p2out) + p2i/pg.dot(p2in))*(qg.m2()*Mmp/2.))/q1.m2();
CCurrent Lpm=(qsum*(Mpm) + (-2.*mj2m.dot(pg))*mj1p+2.*mj1p.dot(pg)*mj2m
+(p2o/pg.dot(p2out) + p2i/pg.dot(p2in))*(qg.m2()*Mpm/2.))/q1.m2();
CCurrent Lpp=(qsum*(Mpp) + (-2.*mj2p.dot(pg))*mj1p+2.*mj1p.dot(pg)*mj2p
+(p2o/pg.dot(p2out) + p2i/pg.dot(p2in))*(qg.m2()*Mpp/2.))/q1.m2();
CCurrent U1mm=(jgam.dot(mj2m)*j2gm+2.*p1o*Mmm)/(p1out+pg).m2();
CCurrent U1mp=(jgam.dot(mj2p)*j2gm+2.*p1o*Mmp)/(p1out+pg).m2();
CCurrent U1pm=(jgap.dot(mj2m)*j2gp+2.*p1o*Mpm)/(p1out+pg).m2();
CCurrent U1pp=(jgap.dot(mj2p)*j2gp+2.*p1o*Mpp)/(p1out+pg).m2();
CCurrent U2mm=((-1.)*j2gm.dot(mj2m)*jgam+2.*p1i*Mmm)/(p1in-pg).m2();
CCurrent U2mp=((-1.)*j2gm.dot(mj2p)*jgam+2.*p1i*Mmp)/(p1in-pg).m2();
CCurrent U2pm=((-1.)*j2gp.dot(mj2m)*jgap+2.*p1i*Mpm)/(p1in-pg).m2();
CCurrent U2pp=((-1.)*j2gp.dot(mj2p)*jgap+2.*p1i*Mpp)/(p1in-pg).m2();
constexpr double cf=C_F;
double amm=cf*(2.*vre(Lmm-U1mm,Lmm+U2mm))+2.*cf*cf/3.*vabs2(U1mm+U2mm);
double amp=cf*(2.*vre(Lmp-U1mp,Lmp+U2mp))+2.*cf*cf/3.*vabs2(U1mp+U2mp);
double apm=cf*(2.*vre(Lpm-U1pm,Lpm+U2pm))+2.*cf*cf/3.*vabs2(U1pm+U2pm);
double app=cf*(2.*vre(Lpp-U1pp,Lpp+U2pp))+2.*cf*cf/3.*vabs2(U1pp+U2pp);
double ampsq=-(amm+amp+apm+app);
//Divide by t-channels
ampsq/=q2.m2()*qg.m2();
ampsq/=16.;
// Factor of (Cf/Ca) for each quark to match j_j.
ampsq*=(C_F*C_F)/(C_A*C_A);
return ampsq;
}
} // Anonymous Namespace
//Unordered bits for pure jet
double ME_unob_qQ(HLV const & pg, HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return juno_j(pg, p1out, p1in, p2out, p2in);
}
double ME_unob_qbarQ(HLV const & pg, HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return juno_j(pg, p1out, p1in, p2out, p2in);
}
double ME_unob_qQbar(HLV const & pg, HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return juno_j(pg, p1out, p1in, p2out, p2in);
}
double ME_unob_qbarQbar(HLV const & pg, HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return juno_j(pg, p1out, p1in, p2out, p2in);
}
double ME_unob_qg( HLV const & pg, HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return juno_j(pg, p1out, p1in, p2out, p2in)*K_g(p2out,p2in)/C_F;
}
double ME_unob_qbarg(HLV const & pg, HLV const & p1out, HLV const & p1in,
HLV const & p2out, HLV const & p2in
){
return juno_j(pg, p1out, p1in, p2out, p2in)*K_g(p2out,p2in)/C_F;
}
namespace {
void eps(HLV const & refmom, HLV const & kb, bool hel, current &ep){
//Positive helicity eps has negative helicity choices for spinors and vice versa
joi(refmom,hel,kb,hel,ep);
double norm = NAN;
if(kb.z()<0.) norm = sqrt(2.*refmom.plus()*kb.minus());
else norm = sqrt(2.*refmom.minus()*kb.plus());
// Normalise
std::for_each(begin(ep), end(ep), [&,norm](auto & val){val/=norm;});
}
COM qggm1(HLV const & pa, HLV const & pb, HLV const & p1, HLV const & p2,
HLV const & p3, bool helchain, bool heltop, bool helb, HLV const & refmom
){
// Since everything is defined with currents, need to use compeleness relation
// to expand p slash. i.e. pslash = |p><p|. Only one helicity 'survives' as
// defined by the helicities of the spinors at the end of the chain.
current cur33;
current cur23;
current curb3;
current cur2b;
current cur1a;
current ep;
joo(p3, helchain, p3, helchain,cur33);
joo(p2,helchain,p3,helchain,cur23);
jio(pb,helchain,p3,helchain,curb3);
joi(p2,helchain,pb,helchain,cur2b);
joi(p1, heltop, pa, heltop,cur1a);
const double t2 = (p3-pb)*(p3-pb);
//Calculate Term 1 in Equation 3.23 in James Cockburn's Thesis.
COM v1[4][4];
for(int u=0; u<4;++u){
for(int v=0; v<4;++v){
v1[u][v]=(cur23[u]*cur33[v]-cur2b[u]*curb3[v])/t2*(-1.);
}
}
//Dot in current and eps
//eps
eps(refmom,pb,helb, ep);
COM M1=0.;
// Perform Contraction: g^{ik} j_{1a}_k * v1_i^j eps^l g_lj
for(int i=0;i<4;++i){
for(int j=0;j<4;++j){
M1+= metric(i,i) *cur1a[i]*(v1[i][j])*ep[j]*metric(j,j);
}
}
return M1;
}
COM qggm2(HLV const & pa, HLV const & pb, HLV const & p1, HLV const & p2,
HLV const & p3, bool helchain, bool heltop, bool helb, HLV const & refmom
){
// Since everything is defined with currents, need to use completeness relation
// to expand p slash. i.e. pslash = |p><p|. Only one helicity 'survives' as
// defined by the helicities of the spinors at the end of the chain.
current cur22;
current cur23;
current curb3;
current cur2b;
current cur1a;
current ep;
joo(p2, helchain, p2, helchain, cur22);
joo(p2, helchain, p3, helchain, cur23);
jio(pb, helchain, p3, helchain, curb3);
joi(p2, helchain, pb, helchain, cur2b);
joi(p1, heltop, pa, heltop, cur1a);
const double t2t = (p2-pb)*(p2-pb);
//Calculate Term 2 in Equation 3.23 in James Cockburn's Thesis.
COM v2[4][4]={};
for(int u=0; u<4;++u){
for(int v=0; v<4; ++v){
v2[u][v]=(cur22[v]*cur23[u]-cur2b[v]*curb3[u])/t2t;
}
}
//Dot in current and eps
//eps
eps(refmom,pb,helb, ep);
COM M2=0.;
// Perform Contraction: g^{ik} j_{1a}_k * v2_i^j eps^l g_lj
for(int i=0;i<4;++i){
for(int j=0;j<4;++j){
M2+= metric(i,i)*cur1a[i]*(v2[i][j])*ep[j]*metric(j,j);
}
}
return M2;
}
COM qggm3(HLV const & pa, HLV const & pb, HLV const & p1, HLV const & p2,
HLV const & p3, bool helchain, bool heltop, bool helb, HLV const & refmom
){
current qqcur;
current ep;
current cur1a;
const double s23 = (p2+p3)*(p2+p3);
joo(p2,helchain,p3,helchain,qqcur);
joi(p1, heltop, pa, heltop,cur1a);
//Redefine relevant momenta as currents - for ease of calling correct part of vector
const current kb{pb.e(), pb.x(), pb.y(), pb.z()};
const current k2{p2.e(), p2.x(), p2.y(), p2.z()};
const current k3{p3.e(), p3.x(), p3.y(), p3.z()};
//Calculate Term 3 in Equation 3.23 in James Cockburn's Thesis.
COM V3g[4][4]={};
const COM kbqq=kb[0]*qqcur[0] -kb[1]*qqcur[1] -kb[2]*qqcur[2] -kb[3]*qqcur[3];
for(int u=0;u<4;++u){
for(int v=0;v<4;++v){
V3g[u][v] += 2.*COM(0.,1.)*(((k2[v]+k3[v])*qqcur[u] - (kb[u])*qqcur[v])+
kbqq*metric(u,v))/s23;
}
}
eps(refmom,pb,helb, ep);
COM M3=0.;
// Perform Contraction: g^{ik} j_{1a}_k * (v2_i^j) eps^l g_lj
for(int i=0;i<4;++i){
for(int j=0;j<4;++j){
M3+= metric(i,i)*cur1a[i]*(V3g[i][j])*ep[j]*metric(j,j);
}
}
return M3;
}
//Now the function to give helicity/colour sum/average
double MqgtqQQ(HLV const & pa, HLV const & pb,
HLV const & p1, HLV const & p2, HLV const & p3
){
// 4 indepedent helicity choices (complex conjugation related).
//Need to evalute each independent hel configuration and store that result somewhere
const COM Mmmm1 = qggm1(pa,pb,p1,p2,p3,false,false,false, pa);
const COM Mmmm2 = qggm2(pa,pb,p1,p2,p3,false,false,false, pa);
const COM Mmmm3 = qggm3(pa,pb,p1,p2,p3,false,false,false, pa);
const COM Mmmp1 = qggm1(pa,pb,p1,p2,p3,false,true, false, pa);
const COM Mmmp2 = qggm2(pa,pb,p1,p2,p3,false,true, false, pa);
const COM Mmmp3 = qggm3(pa,pb,p1,p2,p3,false,true, false, pa);
const COM Mpmm1 = qggm1(pa,pb,p1,p2,p3,false,false,true, pa);
const COM Mpmm2 = qggm2(pa,pb,p1,p2,p3,false,false,true, pa);
const COM Mpmm3 = qggm3(pa,pb,p1,p2,p3,false,false,true, pa);
const COM Mpmp1 = qggm1(pa,pb,p1,p2,p3,false,true, true, pa);
const COM Mpmp2 = qggm2(pa,pb,p1,p2,p3,false,true, true, pa);
const COM Mpmp3 = qggm3(pa,pb,p1,p2,p3,false,true, true, pa);
//Colour factors:
const COM cm1m1 = 8./3.;
const COM cm2m2 = 8./3.;
const COM cm3m3 = 6.;
const COM cm1m2 = -1./3.;
const COM cm1m3 = -3.*COM(0.,1.);
const COM cm2m3 = 3.*COM(0.,1.);
//Sqaure and sum for each helicity config:
const double Mmmm = real(cm1m1*pow(abs(Mmmm1),2)+cm2m2*pow(abs(Mmmm2),2)+
cm3m3*pow(abs(Mmmm3),2)+2.*real(cm1m2*Mmmm1*conj(Mmmm2))+
2.*real(cm1m3*Mmmm1*conj(Mmmm3))+2.*real(cm2m3*Mmmm2*conj(Mmmm3)));
const double Mmmp = real(cm1m1*pow(abs(Mmmp1),2)+cm2m2*pow(abs(Mmmp2),2)+
cm3m3*pow(abs(Mmmp3),2)+2.*real(cm1m2*Mmmp1*conj(Mmmp2))+
2.*real(cm1m3*Mmmp1*conj(Mmmp3))+2.*real(cm2m3*Mmmp2*conj(Mmmp3)));
const double Mpmm = real(cm1m1*pow(abs(Mpmm1),2)+cm2m2*pow(abs(Mpmm2),2)+
cm3m3*pow(abs(Mpmm3),2)+2.*real(cm1m2*Mpmm1*conj(Mpmm2))+
2.*real(cm1m3*Mpmm1*conj(Mpmm3))+2.*real(cm2m3*Mpmm2*conj(Mpmm3)));
const double Mpmp = real(cm1m1*pow(abs(Mpmp1),2)+cm2m2*pow(abs(Mpmp2),2)+
cm3m3*pow(abs(Mpmp3),2)+2.*real(cm1m2*Mpmp1*conj(Mpmp2))+
2.*real(cm1m3*Mpmp1*conj(Mpmp3))+2.*real(cm2m3*Mpmp2*conj(Mpmp3)));
// Factor of 2 for the helicity for conjugate configurations
return (2.*(Mmmm+Mmmp+Mpmm+Mpmp)/3.)/(pa-p1).m2()/(p2+p3-pb).m2();
}
} // Anonymous Namespace
// Extremal qqx
double ME_Exqqx_qbarqQ(HLV const & pgin, HLV const & pqout,
HLV const & pqbarout, HLV const & p2out, HLV const & p2in
){
return MqgtqQQ(p2in, pgin, p2out, pqout, pqbarout);
}
double ME_Exqqx_qqbarQ(HLV const & pgin, HLV const & pqout,
HLV const & pqbarout, HLV const & p2out, HLV const & p2in
){
return MqgtqQQ(p2in, pgin, p2out, pqbarout, pqout);
}
double ME_Exqqx_qbarqg(HLV const & pgin, HLV const & pqout,
HLV const & pqbarout, HLV const & p2out, HLV const & p2in
){
return MqgtqQQ(p2in, pgin, p2out, pqout, pqbarout)*K_g(p2out,p2in)/C_F;
}
double ME_Exqqx_qqbarg(HLV const & pgin, HLV const & pqout,
HLV const & pqbarout, HLV const & p2out, HLV const & p2in
){
return MqgtqQQ(p2in, pgin, p2out, pqbarout, pqout)*K_g(p2out,p2in)/C_F;
}
namespace {
// helicity amplitudes for matrix element with central qqbar
template<Helicity h1a, Helicity h4b>
double amp_Cenqqx_qq(
HLV const & pa, HLV const & p1,
HLV const & pb, HLV const & p4,
HLV const & pq, HLV const & pqbar,
HLV const & q11, HLV const & q12
){
const COM sym = M_sym<h1a, h4b>(
pa, p1, pb, p4, pq, pqbar, q11, q12
);
const COM cross = M_cross<h1a, h4b>(
pa, p1, pb, p4, pq, pqbar, q11, q12
);
const COM uncross = M_qbar<h1a, h4b>(
pa, p1, pb, p4, pq, pqbar, q11, q12
);
// Colour factors
static constexpr COM cmsms = 3.;
static constexpr COM cmumu = 4./3.;
static constexpr COM cmcmc = 4./3.;
static constexpr COM cmsmu = COM{0., 3./2.};
static constexpr COM cmsmc = COM{0.,-3./2.};
static constexpr COM cmumc = -1./6.;
return real(
cmsms*pow(abs(sym),2)
+cmumu*pow(abs(uncross),2)
+cmcmc*pow(abs(cross),2)
)
+2.*real(cmsmu*sym*conj(uncross))
+2.*real(cmsmc*sym*conj(cross))
+2.*real(cmumc*uncross*conj(cross))
;
}
} // Anonymous Namespace
double ME_Cenqqx_qq(
HLV const & pa, HLV const & pb,
std::vector<HLV> const & partons,
bool /* aqlinepa */, bool /* aqlinepb */,
const bool qqxmarker, const std::size_t nabove
){
using helicity::plus;
using helicity::minus;
CLHEP::HepLorentzVector q1 = pa;
for(std::size_t 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 = partons[nabove+1];
HLV pqbar = partons[nabove+2];
if(qqxmarker) std::swap(pq, pqbar);
const HLV p1 = partons.front();
const HLV pn = partons.back();
// 8 helicity choices, but only 4 independent ones
//(complex conjugation related).
// In principle, the proper helicity labeling depends on
// whether we have antiquark lines (aqlinea and aqlineb).
// However, this only corresponds to a relabeling,
// which doesn't change the sum over all helicities below.
const double amp_mm = amp_Cenqqx_qq<minus, minus>(
pa, p1, pb, pn, pq, pqbar, qq.first, -qq.second
);
const double amp_mp = amp_Cenqqx_qq<minus, plus>(
pa, p1, pb, pn, pq, pqbar, qq.first, -qq.second
);
const double amp_pm = amp_Cenqqx_qq<plus, minus>(
pa, p1, pb, pn, pq, pqbar, qq.first, -qq.second
);
const double amp_pp = amp_Cenqqx_qq<plus, plus>(
pa, p1, pb, pn, pq, pqbar, qq.first, -qq.second
);
//Result (averaged, without coupling or t-channel props). Factor of
//2 for the 4 helicity configurations I didn't work out explicitly
const HLV q3 = q1 - pq - pqbar;
return (2.*(amp_mm+amp_mp+amp_pm+amp_pp)/9./4.) /
((pa-p1).m2()*(pb-pn).m2()*q1.m2()*q3.m2());
}
} // namespace currents
} // namespace HEJ

File Metadata

Mime Type
text/x-diff
Expires
Tue, Nov 19, 3:54 PM (1 d, 21 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805045
Default Alt Text
(24 KB)

Event Timeline