#include "PHASIC++/Process/Process_Info.H" #include "PHASIC++/Process/Virtual_ME2_Base.H" #include "MODEL/Main/Running_AlphaS.H" #include "AddOns/MCFM/MCFM_Wrapper.H" namespace MCFM { // README: // For Higgs production, choose model: MODEL = SMEHC // It is important for the Higgs production to have all five flavours // in the initial state, but the Yukawa coupling of the b must be // switched off: YUKAWA[5] = 0. // Also, MCFM acts in the limit of mt->infinity, // thus a further correction term has been introduced // // We could actually also extend this to BSM models. class MCFM_gg_h: public PHASIC::Virtual_ME2_Base { private: int m_pID; double * p_p, *p_msqv; MODEL::Running_AlphaS * p_as; double m_mh2,m_Gh2,m_mZ2,m_GZ2,m_mW2,m_GW2; double m_ehcscale2,m_cplcorr,m_normcorr; double CallMCFM(const int & i,const int & j); public: MCFM_gg_h(const int & pID, const PHASIC::Process_Info& pi, const ATOOLS::Flavour_Vector& flavs); ~MCFM_gg_h(); void Calc(const ATOOLS::Vec4D_Vector& momenta); double Eps_Scheme_Factor(const ATOOLS::Vec4D_Vector& mom); }; }// end of namespace MCFM extern "C" { void gg_h_v_(double *p,double *msqv); void qqb_hww_v_(double *p,double *msqv); void qqb_hzz_v_(double *p,double *msqv); void gg_hgamgam_v_(double *p,double *msqv); } #include "MODEL/Main/Model_Base.H" #include "ATOOLS/Org/Run_Parameter.H" using namespace MCFM; using namespace PHASIC; using namespace ATOOLS; MCFM_gg_h::MCFM_gg_h(const int & pID,const Process_Info& pi, const Flavour_Vector& flavs) : Virtual_ME2_Base(pi,flavs), m_pID(pID), p_as((MODEL::Running_AlphaS *) MODEL::s_model->GetScalarFunction(std::string("alpha_S"))), m_mh2(sqr(Flavour(kf_h0).Mass())), m_Gh2(sqr(Flavour(kf_h0).Width())), m_mZ2(sqr(Flavour(kf_Z).Mass())), m_GZ2(sqr(Flavour(kf_Z).Width())), m_mW2(sqr(Flavour(kf_Wplus).Mass())), m_GW2(sqr(Flavour(kf_Wplus).Width())), m_ehcscale2(MODEL::s_model->ScalarConstant(std::string("EHC_SCALE2"))), m_cplcorr(ewcouple_.vevsq/ sqr(MODEL::s_model->ScalarConstant(std::string("vev")))* sqr((*p_as)(m_ehcscale2)/qcdcouple_.as)* sqr(MODEL::s_model->ScalarConstant(std::string("h0_gg_fac"))/ (2./3.))), m_normcorr(4.*9./qcdcouple_.ason2pi) { rpa->gen.AddCitation (1,"The NLO matrix elements have been taken from MCFM \\cite{}."); switch (m_pID) { case 112: m_cplcorr *= 1./256. * // wherever this factor comes from sqr(Flavour(kf_tau).Yuk()/masses_.mtau) * 4.*sqr(masses_.wmass)/ewcouple_.gwsq/ sqr(MODEL::s_model->ScalarConstant(std::string("vev"))); break; case 113: case 114: case 115: m_cplcorr *= pow(4.*M_PI*MODEL::s_model->ScalarConstant("alpha_QED")/ std::abs(MODEL::s_model->ComplexConstant("csin2_thetaW"))/ ewcouple_.gwsq,3.); m_cplcorr *= (pID==115)?1./3.:1.; break; case 117: m_cplcorr *= 1./7085.; // corrections necessario if msqgamgam wasn't rigged // sqr(MODEL::s_model->ScalarFunction(std::string("alpha_QED"))/ // (ewcouple_.esq/(4.*M_PI))) * // 1./(sqrt(2.)*ewcouple_.Gf* // sqr(MODEL::s_model->ScalarConstant(std::string("vev")))); break; } p_p = new double[4*MCFM_NMX]; p_msqv = new double[sqr(2*MCFM_NF+1)]; m_mode=1; } MCFM_gg_h::~MCFM_gg_h() { delete [] p_p; delete [] p_msqv; } double MCFM_gg_h::CallMCFM(const int & i,const int & j) { //msg_Out()<:: operator()(const Process_Info &pi) const { return NULL; if (pi.m_loopgenerator!="MCFM") return NULL; if (MODEL::s_model->Name()!=std::string("SMEHC") || Flavour(kf_b).Yuk()>0. || !Flavour(kf_h0).IsOn()) return NULL; if (!(pi.m_fi.m_nlotype&nlo_type::loop)) return NULL; if (pi.m_fi.m_nlocpl[1]!=0.) return NULL; Flavour_Vector fl(pi.ExtractFlavours()); if (!(fl[0].IsGluon() && fl[1].IsGluon())) return NULL; if (pi.m_fi.m_ps.size()!=1) return NULL; Flavour flh(pi.m_fi.m_ps[0].m_fl[0]); if (!flh==Flavour(kf_h0)) return NULL; msg_Out()<<"Check numbers: " <[h->tau tau] (+jet), but tau Yukawa = 0." <0) { zerowidth_.zerowidth=true; if (nproc_.nproc>=0) { if (nproc_.nproc!=pID) THROW(not_implemented, "Only one process class allowed when using MCFM"); } nproc_.nproc=pID; chooser_(); msg_Info()<<"Initialise MCFM with nproc = "<