You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.3 KiB
132 lines
4.3 KiB
// Copyright (C) 2021 John Campbell, Stefan Hoeche, Christian T Preuss.
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify it under
|
|
// the terms of the GNU General Public License as published by the Free Software
|
|
// Foundation, either version 3 of the License, or (at your option) any later
|
|
// version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
// PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License along with
|
|
// this program. If not, see <http://www.gnu.org/licenses/>
|
|
|
|
|
|
// MCFM routine for loop MEs.
|
|
extern "C" {
|
|
void qqb_zz_v_(double *p,double *msqv);
|
|
void qqb_zz_(double *p,double *msqv);}
|
|
|
|
namespace MCFM {
|
|
|
|
class qqb_zz: public Process {
|
|
private:
|
|
|
|
int m_type, m_dec;
|
|
double m_ccfac;
|
|
|
|
public:
|
|
|
|
static int CheckDecays(const Process_Info &pi,
|
|
const std::vector<Leg> &legs,
|
|
int d0,int d1,int d2,int d3) {
|
|
return 1; // JC hack!
|
|
if (pi.m_decids.size()==0) {
|
|
if (legs[d0].m_fl==-legs[d3].m_fl-1 &&
|
|
legs[d2].m_fl==-legs[d1].m_fl+1) return 0;
|
|
return 1;
|
|
}
|
|
if (pi.m_decids.size()!=2) return 0;
|
|
int decids[2]{((1<<legs[d0].m_id)|(1<<legs[d1].m_id)),
|
|
((1<<legs[d2].m_id)|(1<<legs[d3].m_id))};
|
|
for (int i(0);i<2;++i)
|
|
if (pi.m_decids[0]==decids[i] && pi.m_decids[1]==decids[1-i] &&
|
|
pi.m_decfls[0]==23 && pi.m_decfls[1]==23) return 1;
|
|
return 0;
|
|
}
|
|
|
|
static bool InitializeProcess(CXX_Interface *const interface,
|
|
const Process_Info &pi,
|
|
const std::vector<Leg> &legs) {
|
|
if (pi.m_oqcd!=1 || pi.m_oew!=4) return false;
|
|
if (legs.size()!=6) return false;
|
|
for (size_t i(0);i<legs.size();++i)
|
|
if (legs[i].Mass()) return false;
|
|
if ((legs[0].m_fl%2)==0 && (legs[1].m_fl%2)==0) return false;
|
|
if (legs[0].m_fl>10 && legs[0].m_fl<17 &&
|
|
legs[2].m_fl==-legs[0].m_fl &&
|
|
legs[1].m_fl>10 && legs[1].m_fl<17 &&
|
|
legs[3].m_fl==-legs[1].m_fl &&
|
|
legs[4].m_fl>0 && legs[4].m_fl<6 && legs[5].m_fl==-legs[4].m_fl &&
|
|
CheckDecays(pi,legs,0,2,1,3))
|
|
return interface->AddProcess
|
|
(pi,new qqb_zz(legs,(legs[0].m_fl%2)?0:1,pi.m_decids.size()?1:0))>-1;
|
|
return false;
|
|
}
|
|
|
|
qqb_zz(const std::vector<Leg> &legs,int type,int dec):
|
|
Process(legs,5,4), m_type(type), m_dec(dec),
|
|
m_ccfac(1.) {
|
|
static int first(true);
|
|
if (first) {
|
|
first=false;
|
|
nproc_.nproc=(legs[1-m_type].m_fl%2)?81:82;
|
|
blha_.useblha=1;
|
|
chooser_();
|
|
if (legs[0].m_fl == legs[1].m_fl && !m_dec) {
|
|
interference_.interference=true;
|
|
vsymfact_.vsymfact=0.25;
|
|
}
|
|
if ((legs[0].m_fl==11 && legs[1].m_fl==12
|
|
&& legs[2].m_fl==-11 && legs[3].m_fl==-12) ||
|
|
(legs[0].m_fl==13 && legs[1].m_fl==14
|
|
&& legs[2].m_fl==-13 && legs[3].m_fl==-14)) {
|
|
// Set blhatype = 1 for process with ZZ/WW interference (e- e+ nue nue~)
|
|
blha_.blhatype = 1;
|
|
}
|
|
else {
|
|
blha_.blhatype = 0;
|
|
}
|
|
}
|
|
m_res.resize(4);
|
|
}
|
|
|
|
void Calc(const std::vector<FourVec> &p,int oqcd) {
|
|
// Convert momenta.
|
|
SetMom(p_p,p,m_legs[5],0);// IS q
|
|
SetMom(p_p,p,m_legs[4],1);// IS qb'
|
|
if (m_type) {
|
|
SetMom(p_p,p,m_legs[1],2);// FS e-
|
|
SetMom(p_p,p,m_legs[3],3);// FS e+
|
|
SetMom(p_p,p,m_legs[0],4);// FS mu-/v
|
|
SetMom(p_p,p,m_legs[2],5);// FS mu+/v~
|
|
}
|
|
else {
|
|
SetMom(p_p,p,m_legs[0],2);// FS e-
|
|
SetMom(p_p,p,m_legs[2],3);// FS e+
|
|
SetMom(p_p,p,m_legs[1],4);// FS mu-/v
|
|
SetMom(p_p,p,m_legs[3],5);// FS mu+/v~
|
|
}
|
|
// Calculate result.
|
|
epinv_.epinv=epinv2_.epinv2=0.0;
|
|
qqb_zz_v_(p_p,p_msqv);
|
|
double res = p_msqv[MSQId(m_legs[5],m_legs[4])];
|
|
m_res[0] = res*m_cfac/m_ccfac;
|
|
if (!m_polecheck) return;
|
|
epinv_.epinv=1.0;
|
|
qqb_zz_v_(p_p,p_msqv);
|
|
double res1 = p_msqv[MSQId(m_legs[5],m_legs[4])];
|
|
epinv2_.epinv2=1.0;
|
|
qqb_zz_v_(p_p,p_msqv);
|
|
double res2 = p_msqv[MSQId(m_legs[5],m_legs[4])];
|
|
m_res[1] = (res1-res)*m_cfac/m_ccfac;
|
|
m_res[2] = (res2-res1)*m_cfac/m_ccfac;
|
|
m_res[3] = m_res[2]/(-qcdcouple_.ason2pi*m_bfac);
|
|
}
|
|
|
|
int GetScheme() const { return 1; }
|
|
|
|
};// end of class qqb_zz
|
|
|
|
}// end of namespace MCFM
|