// 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 // MCFM routine for loop and tree MEs. extern "C" { void qqb_wh1jet_v_(double *p,double *msqv); } namespace MCFM { class qqb_wh1jet: public Process { private: int m_id[6]; public: static bool InitializeProcess(CXX_Interface *const interface, const Process_Info &pi, const std::vector &legs) { if (pi.m_oqcd!=2 || pi.m_oew!=3) return false; if (legs.size()!=6) return false; if (pi.m_decids.size()) return false; for (size_t i(1);i10 && legs[1].m_fl<17 && legs[2].m_fl==-legs[1].m_fl-1 && legs[4].m_fl>0 && legs[4].m_fl<6 && legs[5].m_fl==-legs[4].m_fl+1) return interface->AddProcess(pi,new qqb_wh1jet(legs))>-1; if (legs[0].m_fl==25 && legs[3].m_fl==21 && legs[1].m_fl>10 && legs[1].m_fl<17 && legs[2].m_fl==-legs[1].m_fl+1 && legs[4].m_fl>0 && legs[4].m_fl<6 && legs[5].m_fl==-legs[4].m_fl-1) return interface->AddProcess(pi,new qqb_wh1jet(legs))>-1; return false; } inline void SwapIDs(int i1,int i2) { std::swap(m_id[i1],m_id[i2]); m_cfac=ISSymmetryFactor(m_legs,0); } qqb_wh1jet(const std::vector &legs): Process(legs,5,4), m_id{5,4,1,2,0,3} { static int first(true); if (first) { first=false; nproc_.nproc=(legs[1].m_fl%2)?617:612; blha_.useblha=1; chooser_(); std::string hdecaymode="none"; hdecaymode.copy(hdecaymode_.hdecaymode,4); } m_res.resize(4); if (m_legs[4].m_is && m_legs[3].m_is) SwapIDs(0,5); if (m_legs[5].m_is && m_legs[3].m_is) SwapIDs(1,5); } void Calc(const std::vector &p,int oqcd) { // Convert momenta. SetMom(p_p,p,m_legs[m_id[0]],0);// IS q SetMom(p_p,p,m_legs[m_id[1]],1);// IS qb' SetMom(p_p,p,m_legs[m_id[2]],2);// FS e- / v SetMom(p_p,p,m_legs[m_id[3]],3);// FS vb / e+ SetMom(p_p,p,m_legs[m_id[4]],4);// FS h SetMom(p_p,p,m_legs[m_id[5]],6);// FS g GetMom(p_p,5,FourVec(0.,0.,0.,0.));// dummy // Calculate result. blha_.blhafl[0]=-MCFMId(m_legs[m_id[0]].m_fl); blha_.blhafl[1]=-MCFMId(m_legs[m_id[1]].m_fl); epinv_.epinv=epinv2_.epinv2=0.0; qqb_wh1jet_v_(p_p,p_msqv); double res = p_msqv[MSQId(m_legs[m_id[0]],m_legs[m_id[1]])]; m_res[0] = res*m_cfac; if (!m_polecheck) return; epinv_.epinv=1.0; qqb_wh1jet_v_(p_p,p_msqv); double res1 = p_msqv[MSQId(m_legs[m_id[0]],m_legs[m_id[1]])]; epinv2_.epinv2=1.0; qqb_wh1jet_v_(p_p,p_msqv); double res2 = p_msqv[MSQId(m_legs[m_id[0]],m_legs[m_id[1]])]; m_res[1] = (res1-res)*m_cfac; m_res[2] = (res2-res1)*m_cfac; m_res[3] = m_res[2]/(-qcdcouple_.ason2pi*m_bfac); } int GetScheme() const { return 1; } };// end of class qqb_wh1jet }// end of namespace MCFM