#include "LH_OLE_Communicator.H" #include "PHASIC++/Process/Process_Base.H" #include "PHASIC++/Process/Virtual_ME2_Base.H" #include "MODEL/Main/Model_Base.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Org/Scoped_Settings.H" #include "ATOOLS/Math/Poincare.H" #include #include using namespace OLE; using namespace PHASIC; using namespace ATOOLS; using namespace std; namespace OLE { extern "C" void OLP_Start(const char * filename, int* success); extern "C" void OLP_EvalSubProcess(int,double*,double,double*,double*); extern "C" void OLP_Option(const char * assignment, int* success); class LH_OLE_Interface : public Virtual_ME2_Base { size_t m_pn; bool m_active, m_needcmsboost, m_gosammode; int m_OLE_id, m_oqcd, m_oqed; double* p_momenta; double p_result[4], m_Norm; static int s_oleinit; int m_nf; void RegisterDefaults() const; int m_version; public: LH_OLE_Interface(const Process_Info& pi,const Flavour_Vector& flavs,bool active); ~LH_OLE_Interface() { if (p_momenta) delete[] p_momenta; } void Calc(const ATOOLS::Vec4D_Vector& momenta); bool SetColours(const ATOOLS::Vec4D_Vector& momenta); double Eps_Scheme_Factor(const ATOOLS::Vec4D_Vector& mom); }; } int LH_OLE_Interface::s_oleinit=0; LH_OLE_Interface::LH_OLE_Interface(const Process_Info& pi, const Flavour_Vector& flavs,bool active) : Virtual_ME2_Base(pi, flavs), m_pn(flavs.size()), m_active(active), m_needcmsboost(false), m_gosammode(false), m_OLE_id(-1), p_momenta(NULL), m_nf(0) { RegisterDefaults(); m_Norm = pi.m_ii.ISSymmetryFactor()*pi.m_fi.FSSymmetryFactor(); m_oqcd = pi.m_maxcpl[0]; m_oqed = pi.m_maxcpl[1]; if (!m_active) return; m_mode = 0; m_drmode = 1; for (size_t i(0);i()); string contractfn(s["LHOLE_CONTRACTFILE"].Get()); std::string irr(s["LHOLE_IR_REGULARISATION"].Get()); if (irr=="DRED") m_drmode=1; else if (irr=="CDR") m_drmode=0; else THROW(fatal_error,"Unknown regularisation scheme"); string lholegen(s["LHOLE_OLP"].Get()); if (lholegen=="GoSam") { m_gosammode=true; } m_needcmsboost = s["LHOLE_BOOST_TO_CMS"].Get(); string fname(""); if (access( contractfn.c_str(), F_OK ) != -1) { contract=1; fname=contractfn; } else { fname=orderfn; } m_version=s["LHOLE_BLHA_VERSION"].Get(); if (m_version!=1&&m_version!=2) THROW(fatal_error,"Wrong LHOLE_BLHA_VERSION value. Only 1 or 2 is accepted."); LH_OLE_Communicator lhfile(fname); if (m_version==1) { if (!contract) { if (lhfile.FileStatus()==0) { lhfile.AddParameter("MatrixElementSquareType CHsummed"); std::string corrtype("QCD"); if (pi.m_fi.m_nlocpl[1]) corrtype="EW"; lhfile.AddParameter("CorrectionType "+corrtype); if (m_drmode==1) lhfile.AddParameter("IRregularisation DRED"); else lhfile.AddParameter("IRregularisation CDR"); lhfile.AddParameter("AlphasPower "+ToString(pi.m_maxcpl[0]-pi.m_fi.m_nlocpl[0])); lhfile.AddParameter("AlphaPower "+ToString(pi.m_maxcpl[1]-pi.m_fi.m_nlocpl[1])); lhfile.AddParameter("OperationMode CouplingsStrippedOff"); std::string widthscheme("FixedWidthScheme"); if (MODEL::s_model->ScalarNumber(std::string("WidthScheme"))) widthscheme=std::string("ComplexMassScheme"); lhfile.AddParameter("ResonanceTreatment "+widthscheme); lhfile.AddParameter("EWRenormalisationScheme alphaMZ"); if (pi.m_ckkw&1) { lhfile.AddParameter("SuccessiveMultiplicities QCD"); } if (!m_gosammode) { lhfile.AddParameter(""); lhfile.AddParameter("Z_mass "+ToString(Flavour(kf_Z).Mass())); lhfile.AddParameter("Z_width "+ToString(Flavour(kf_Z).Width())); lhfile.AddParameter("W_mass "+ToString(Flavour(kf_Wplus).Mass())); lhfile.AddParameter("W_width "+ToString(Flavour(kf_Wplus).Width())); lhfile.AddParameter("sin_th_2 "+ToString(std::abs(MODEL::s_model->ComplexConstant(std::string("csin2_thetaW"))))); lhfile.AddParameter("H_mass "+ToString(Flavour(kf_h0).Mass())); lhfile.AddParameter("H_width "+ToString(Flavour(kf_h0).Width())); lhfile.AddParameter("top_mass "+ToString(Flavour(kf_t).Mass())); lhfile.AddParameter("top_width "+ToString(Flavour(kf_t).Width())); lhfile.AddParameter("bottom_mass "+ToString(Flavour(kf_b).Mass())); lhfile.AddParameter("bottom_width "+ToString(Flavour(kf_b).Width())); } lhfile.AddParameter(""); lhfile.AddParameter("# process list"); } if(lhfile.CheckProcess(2,m_pn-2,flavs)==-1) { lhfile.AddProcess(2,m_pn-2,flavs); } return; } } if (m_version==2) { if (!contract) { if (lhfile.FileStatus()==0) { lhfile.AddParameter("InterfaceVersion BLHA2"); /* Should be this fixed?*/ lhfile.AddParameter("CorrectionType QCD"); if (m_drmode==1) lhfile.AddParameter("IRregularisation DRED"); else lhfile.AddParameter("IRregularisation CDR"); lhfile.AddParameter("OperationMode CouplingsStrippedOff"); std::string widthscheme("FixedWidthScheme"); if (MODEL::s_model->ScalarNumber(std::string("WidthScheme"))) widthscheme=std::string("ComplexMassScheme"); lhfile.AddParameter("ResonanceTreatment "+widthscheme); lhfile.AddParameter("EWRenormalisationScheme alphaMZ"); /* Should be quarks only here?*/ int tmparr[] = { kf_c, kf_b, kf_t, kf_Wplus, kf_Z, kf_h0}; vector pdgids (tmparr, tmparr + sizeof(tmparr) / sizeof(tmparr[0]) ); std::string massive_string=""; for (size_t i=0; i0.0) massive_string+=(" "+ToString(pdgids[i])); if (massive_string.length()) lhfile.AddParameter("MassiveParticles "+massive_string); if (!m_gosammode) { lhfile.AddParameter(""); lhfile.AddParameter("Z_mass "+ToString(Flavour(kf_Z).Mass())); lhfile.AddParameter("Z_width "+ToString(Flavour(kf_Z).Width())); lhfile.AddParameter("W_mass "+ToString(Flavour(kf_Wplus).Mass())); lhfile.AddParameter("W_width "+ToString(Flavour(kf_Wplus).Width())); lhfile.AddParameter("sin_th_2 "+ToString(std::abs(MODEL::s_model->ComplexConstant(std::string("csin2_thetaW"))))); lhfile.AddParameter("H_mass "+ToString(Flavour(kf_h0).Mass())); lhfile.AddParameter("H_width "+ToString(Flavour(kf_h0).Width())); lhfile.AddParameter("top_mass "+ToString(Flavour(kf_t).Mass())); lhfile.AddParameter("top_width "+ToString(Flavour(kf_t).Width())); lhfile.AddParameter("bottom_mass "+ToString(Flavour(kf_b).Mass())); lhfile.AddParameter("bottom_width "+ToString(Flavour(kf_b).Width())); } lhfile.AddParameter(""); lhfile.AddParameter("# process list"); } if(lhfile.CheckProcess(2,m_pn-2,flavs)==-1) { lhfile.AddParameter("AmplitudeType Loop"); lhfile.AddParameter("CouplingPower QCD "+ToString(pi.m_maxcpl[0]-1)); lhfile.AddParameter("CouplingPower QED "+ToString(pi.m_maxcpl[1])); lhfile.AddProcess(2,m_pn-2,flavs); } return; } } if (lhfile.CheckParameterStatus()!=1) { THROW(fatal_error,"Bad OLE parameter"); } int pstatus=lhfile.CheckProcess(2,m_pn-2,flavs); std::string pstr(""); switch (pstatus) { case -2: case 0: for (size_t i(0);i(); s["LHOLE_BOOST_TO_CMS"].SetDefault(false); if (olp == "GoSam") s["LHOLE_BOOST_TO_CMS"].OverrideScalar(true); } void LH_OLE_Interface::Calc(const Vec4D_Vector& pp) { if (!m_active) return; if (m_OLE_id<0) return; Vec4D_Vector momenta(pp); msg_Debugging()<<"=============================================="<ScalarFunction("alpha_S",m_mur2),m_oqcd-1); m_born*=pow(4.0*M_PI*MODEL::s_model->ScalarConstant("alpha_QED"),m_oqed); } bool LH_OLE_Interface::SetColours(const ATOOLS::Vec4D_Vector& momenta) { return true; } double LH_OLE_Interface::Eps_Scheme_Factor(const ATOOLS::Vec4D_Vector& mom) { return 4.*M_PI; } DECLARE_VIRTUALME2_GETTER(OLE::LH_OLE_Interface,"LH_OLE_Interface") Virtual_ME2_Base *ATOOLS::Getter:: operator()(const PHASIC::Process_Info &pi) const { DEBUG_FUNC(pi); if (pi.m_loopgenerator!="LHOLE") return NULL; Flavour_Vector fl=pi.ExtractFlavours(); if (pi.m_fi.m_nlotype&nlo_type::loop) { msg_Info()<<"Les Houches One-Loop Generator called.\n"; return new LH_OLE_Interface(pi, fl, true); } else if (pi.m_fi.m_nlotype&nlo_type::vsub) { msg_Info()<<"Les Houches One-Loop Generator called in subtracted mode.\n"; return new LH_OLE_Interface(pi, fl, false); } msg_Info()<<"Les Houches One-Loop Generator could not provide one-loop \n" <<"matrix element for " <