How to generate APPLgrids

Author: Rabah Abdul Khalek

APPLgrids are the partonic cross sections needed to compute hadronic observables (proton-proton collisions). These QCD-perturbative components are generated by Monte-Carlo simulation and tabulated in .root format.

After installing MCFM-6.8 interfaced with mcfm-bridge-0.0.34-nnpdf (see Installation in~). Follow the following steps to generate APPLgrids.

Configuration in mcfm-bridge-0.0.34-nnpdf

The first step is to setup the kinematics of the cross-section distribution you’re interested in. To do that, you have to edit mcfm-bridge-0.0.34-nnpdf/src/mcfm_interface.cxx by doing the following:

  1. Binning:

    In void book_grid(), you should dictate the:

    • Type of process: mcfm-z for z production, mcfm-TT for ttbar, etc.

    • q2Low, q2Up, nQ2bins and qorder are binning information for the grid constructor.

    • Ngrids the number of grids generated. For example, if your cross-section is double differential in var1(10 bins) and var2(3 bins). You can generate 3 grids corresponding to var2 that each contain 10 bins of var1.

    • strcpy(gridFiles[0],"_yZ.root"); this dictates the name of the output grid. In our example LHCBZ13TEV_yZ.root.

    • nObsBins[0] = 17; the number of bins.

    • static const double _y[18] the breakdown of binning.

    • obsBins[0] = { _y }; append the observable.

    example:

        else if ( glabel == "LHCBZ13TEV" )
        {
            std::cout << "LHCb Z -> e+ e- rapidity distribution, 294 pb-1, 13 TeV" << std::endl;
            pdf_function = "mcfm-z";
            q2Low   = 8315.17, q2Up = 8315.19;
            nQ2bins = 3;
            qorder  = 1;
    
            Ngrids  = 1;
            strcpy(gridFiles[0],"_yZ.root");
    
            nObsBins[0] = 17;
    
            static const double _y[18] = { 2.000, 2.125, 2.250, 
                                        2.375, 2.500, 2.625, 
                                        2.750, 2.875, 3.000, 
                                        3.125, 3.250, 3.375, 
                                        3.500, 3.625, 3.750, 
                                        3.875, 4.000, 4.250 };
    
            obsBins[0] = { _y };
    
        }
    
  2. Specify the distribution (here, it’s a distribution in rapidity of the outcoming particles 3 and 4):

    In void getObservable(const double evt[][mxpart]), you should add the name of your dataset and determine the kinematic variable that the cross-section will span over. example:

    else if (glabel == "LHCBZ13TEV")
        {
        Observable [ 0 ] = rapidity34;
        }
    

Configuration of RunCard in MCFM-6.8

For this, you need to duplicate the default run card: cp MCFM-6.8/Bin/input.DAT MCFM-6.8/Bin/LHCBZ13TEV.dat. and edit the later according to the information in the paper, e.g the kinematic cuts, update the masses and theory settings etc.

Generation

**/!\ To change according to the conda installation via conda /!\ **

You need to make again mcfm-bridge after editing mcfm_interface.cxx:

cd external/mcfm-bridge-0.0.34-nnpdf
make install

cd external/MCFM-6.8
make -j
./runmcfm <InputCard.Dat> #once to create the grids
./runmcfm <InputCard.Dat> #once to fill them

Run MCFM-6.8