C++ interface¶
Since version 10.1, MCFM offers a dedicated C++ interface to access its analytic one-loop amplitudes. Please cite ref.1 in addition to the main MCFM references when using the C++ interface.
Available Processes¶
The following Standard-Model processes are available:
Process | Order EW | Order QCD |
---|---|---|
pp\to \ell^+\ell^- | 2 | 1 |
pp\to \ell^+\ell^- j | 2 | 2 |
pp\to \ell^+\ell^- j j | 2 | 3 |
pp\to \ell^\pm\nu_\ell | 2 | 1 |
pp\to \ell^\pm\nu_\ell j | 2 | 2 |
pp\to \ell^\pm\nu_\ell j j | 2 | 3 |
pp\to h | 1 | 2 |
pp\to h j | 1 | 3 |
pp\to h j j | 1 | 4 |
pp\to h h | 2 | 2 |
pp\to \ell^+\ell^- h | 3 | 1 |
pp\to \ell^+\ell^- h j | 3 | 2 |
pp\to \ell^\pm\nu_\ell h | 3 | 1 |
pp\to \ell^\pm\nu_\ell h j | 3 | 2 |
pp\to \gamma j | 1 | 2 |
pp\to \gamma j j | 1 | 3 |
pp\to \gamma \gamma | 2 | 1 |
gg\to \gamma \gamma | 2 | 1 |
pp\to \gamma \gamma j | 2 | 2 |
pp\to \gamma \gamma \gamma | 3 | 1 |
pp\to \gamma \gamma \gamma \gamma | 4 | 1 |
pp\to \ell^+\ell^-\gamma | 3 | 1 |
pp\to \ell^\pm\nu_\ell\gamma | 3 | 1 |
pp\to \nu_\ell\bar\nu_\ell\gamma | 3 | 1 |
pp\to \ell^+\ell^{\prime-}\nu_\ell\bar\nu_{\ell'} | 4 | 1 |
pp\to \ell^+\ell^-\nu_{\ell'}\bar\nu_{\ell'} | 4 | 1 |
pp\to \ell^+\ell^-\ell^{\prime+}\ell^{\prime-} | 4 | 1 |
pp\to \ell^+\ell^-\ell^+\ell^- | 4 | 1 |
pp\to \ell^+\ell^-\ell^{\prime\pm}\nu_{\ell'} | 4 | 1 |
pp\to \ell^\pm\nu_\ell\nu_{\ell'}\bar\nu_{\ell'} | 4 | 1 |
pp\to t \bar t | 0 | 3 |
pp\to j j | 0 | 3 |
pp\to \ell^+\ell^-\gamma j | 3 | 2 |
pp\to \ell^\pm\nu_\ell\gamma j | 3 | 2 |
pp\to \nu_\ell\bar\nu_\ell\gamma j | 3 | 2 |
pp\to \ell^+\ell^{\prime-}\nu_\ell\bar\nu_{\ell'} j | 4 | 2 |
pp\to \ell^+\ell^-\nu_{\ell'}\bar\nu_{\ell'} j | 4 | 2 |
pp\to \ell^+\ell^-\ell^{\prime+}\ell^{\prime-} j | 4 | 2 |
pp\to \ell^+\ell^-\ell^+\ell^- j | 4 | 2 |
pp\to \ell^+\ell^-\ell^{\prime\pm}\nu_{\ell'} j | 4 | 2 |
pp\to \ell^\pm\nu_\ell\nu_{\ell'}\bar\nu_{\ell'} j | 4 | 2 |
In addition, the following HEFT processes are available (requires model=heft):
Process | Order EW | Order QCD |
---|---|---|
pp\to h | 1 | 2 |
pp\to h j | 1 | 3 |
pp\to h j j | 1 | 4 |
All processes are crossing invariant.
Further processes as per the
process list <processlist>
{.interpreted-text role=”ref”} may be
implemented in the future. Please contact the authors if interested in a
specific process.
Installation¶
To use the C++ interface, please enable compiling MCFM as a library by
adding the -DWITH_LIBRARY
flag
cmake .. -DWITH_LIBRARY
This will create a shared library libMCFM.so
in the lib/
directory.
Usage¶
Examples showing the basic usage of the interface and how to fill the
complete list of parameters with default values are given in
src/BLHA/text.cxx
and src/BLHA/params.cxx
, respectively.
The MCFM C++ interface is constructed as a C++ class
CXX_Interface mcfm;
included in the header
#include "MCFM/CXX_Interface.h"
It must be initialized on a \texttt{std::map} of \texttt{std::string}, containing all (standard-model) parameters
bool CXX_Interface::Initialize(std::map<std::string,std::string>& parameters);
Prior to use, each process has to be initialized in the interface
int CXX_Interface::InitializeProcess(const Process_Info &pi);
which takes a Process_Info
object as input, which in turn contains the
defining parameters of a given process, i.e. the PDG IDs, number of
incoming particles, and QCD and EW coupling orders
Process_Info(const std::vector<int> &ids, const int nin,const int oqcd, const int oew);
Phase space points are defined using the FourVec
struct, which
represents four-vectors in the ordering (E, p_x, p_y, p_z)
FourVec(double e, double px, double py, double pz);
Given a list of four-vectors in this format, one-loop matrix elements
can be calculated either using the process ID returned by the
InitializeProcess
method
void CXX_Interface::Calc(int procID,const std::vector<FourVec> &p, int oqcd);
or using a Process_Info
struct:
void CXX_Interface::Calc(const Process_Info &pi,const std::vector<FourVec> &p,int oqcd);
In the same way, the result of this calculation can be accessed either via the process ID
const std::vector<double>& CXX_Interface::GetResult(int procID);
or using the Process_Info
struct:
const std::vector<double> &CXX_Interface::GetResult(const Process_Info &pi)
The result is returned as a list of Laurent series coefficients in the format (\mathcal{O}(\varepsilon^0), \mathcal{O}(\varepsilon^{-1}), \mathcal{O}(\varepsilon^{-2}), \mathrm{Born}). However, by default only the \mathcal{O}(\varepsilon^0) coefficient, i.e. the finite part, is returned.
The calculation of the pole terms and the Born can be enabled by setting
the following switch to 1
void CXX_Interface::SetPoleCheck(int check);
Tests¶
A set of programs to test MCFM's amplitudes against
OpenLoops,
Recola, and
MadLoop can be compiled. For example to
compile the OpenLoops test program an additional OpenLoops directory -DOLDIR=$HOME/OpenLoops
must be specified that contains the header files in the include
subdirectory.
For Recola and MadLoops the variables RCLDIR
and MLDIR
must be specified, respectively.
-
John M. Campbell, Stefan Höche, and Christian T. Preuss. Accelerating LHC phenomenology with analytic one-loop amplitudes: A C++ interface to MCFM. Eur. Phys. J. C, 8112:1117, 2021. arXiv:2107.04472, doi:10.1140/epjc/s10052-021-09885-0. ↩