Power corrections
Power corrections (also referred to as higher twist corrections for DIS-like
processes) model contributions from non-perturbative effects that scale as
inverse powers of the hard scale. They are implemented in the
theorycovariance module and can be included as a theory covariance matrix in
a fit. Power corrections for jets and higher twists for DIS data have been
determined in [BCS25], based on NNPDF4.0, where the reader can
find further details on the methodology and phenomenological implications.
The implementation is in higher_twist_functions.py and construction.py.
Overview
In NNPDF, power corrections modify theoretical predictions by introducing multiplicative shifts. For a generic observable \(O\), the corrected prediction is
where \(\mathrm{PC}\) is the power correction. The shift to the prediction is therefore
Different functional forms for the power correction are used depending on the process type:
DIS (neutral current and charged current): the correction depends on Bjorken-\(x\) and \(Q^2\), and scales as \(1/Q^2\).
Single-inclusive jets: the correction depends on rapidity and transverse momentum \(p_T\), and scales as \(1/p_T\).
Dijets: the correction depends on a rapidity variable and the dijet invariant mass \(m_{jj}\), and scales as \(1/m_{jj}\).
Parametrisation
Power corrections are parametrised using a piecewise-linear interpolation
between a set of nodes. The node positions (nodes) and the function values
at each node (yshift) are specified in the runcard.
The interpolation is constructed as a sum of triangular basis functions: each
node \(i\) is associated with a triangle that peaks at the node position
with value yshift[i] and drops linearly to zero at the two neighbouring
nodes. The resulting function is continuous and piecewise-linear.
For DIS processes, the nodes are placed in Bjorken-\(x\) and the power correction for a data point at \((x, Q^2)\) is
where \(h(x)\) is the piecewise-linear interpolation.
For jet processes, the nodes are placed in rapidity and the correction at \((y, p_T)\) is
For dijets, the same functional form is used but the suppression scale is the dijet invariant mass \(m_{jj}\).
Dataset routing
Each dataset is mapped to one or more power correction parameter keys via the
function get_pc_type. The mapping depends on the process type and dataset
name:
Process type |
PC type key |
Datasets |
|---|---|---|
DIS NC (proton \(F_2\)) |
|
SLAC, BCDMS proton \(F_2\); NMC, HERA \(\sigma_{\mathrm{red}}\) |
DIS NC (deuteron \(F_2\)) |
|
SLAC, BCDMS deuteron \(F_2\) |
DIS NC (NMC ratio \(F_2^d / F_2^p\)) |
|
NMC ratio dataset |
DIS CC |
|
CHORUS, NuTeV, HERA CC |
Jets |
|
Single-inclusive jet datasets |
Dijets (ATLAS) |
|
ATLAS dijet datasets (falls back to |
Dijets (CMS) |
|
CMS dijet datasets (falls back to |
Special case: NMC ratio
The NMC ratio dataset \(F_2^d / F_2^p\) receives contributions from both the proton and deuteron power corrections. The corrected ratio is
and the shift is
Covariance matrix construction
The theory covariance matrix is constructed from the shifts \(\Delta O\) by taking outer products. For each combination of power correction parameters, a shift vector is computed per dataset. The sub-matrix between datasets \(i\) and \(j\) is then
where \(k\) runs over all parameter combinations (one non-zero yshift
entry at a time, with all others set to zero). This corresponds to the
covmat_power_corrections function in construction.py.
Runcard configuration
Power corrections are included via the theorycovmatconfig section of the
runcard. The key "power corrections" must be added to the
point_prescriptions list, alongside any scale variation prescriptions.
The following keys are used:
pc_parameters: a dictionary mapping PC type keys to their parametrisation (yshiftandnodesarrays). The length ofyshiftmust match the length ofnodes.pc_included_procs: list of process types to which power corrections are applied (e.g.["DIS NC", "DIS CC", "JETS", "DIJET"]).pc_excluded_datasets: list of dataset names to exclude from power corrections even if their process type is included.pdf: the PDF used for computing the theory predictions that enter the multiplicative shifts.
Example
theorycovmatconfig:
point_prescriptions: ["9 point", "power corrections"]
pc_parameters:
f2p:
yshift: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.0]
nodes: [0.0, 0.001, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0]
f2d:
yshift: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.0]
nodes: [0.0, 0.001, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0]
dis_cc:
yshift: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.0]
nodes: [0.0, 0.001, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0]
Hj:
yshift: [2.0, 2.0, 2.0, 2.0, 2.0, 2.0]
nodes: [0.25, 0.75, 1.25, 1.75, 2.25, 2.75]
H2j_ATLAS:
yshift: [2.0, 2.0, 2.0, 2.0, 2.0, 2.0]
nodes: [0.25, 0.75, 1.25, 1.75, 2.25, 2.75]
H2j_CMS:
yshift: [2.0, 2.0, 2.0, 2.0, 2.0]
nodes: [0.25, 0.75, 1.25, 1.75, 2.25]
pc_included_procs: ["JETS", "DIJET", "DIS NC", "DIS CC"]
pc_excluded_datasets:
- HERA_NC_318GEV_EAVG_CHARM-SIGMARED
- HERA_NC_318GEV_EAVG_BOTTOM-SIGMARED
pdf: NNPDF40_nnlo_as_01180
use_thcovmat_in_fitting: true
use_thcovmat_in_sampling: true
Warning
The lengths of yshift and nodes must be equal for each PC type.
A mismatch will raise an error at initialisation time.
Note
Power corrections can be combined with scale variation prescriptions. Both contributions are summed into a single theory covariance matrix. See the tutorial on including a theory covmat in a fit.
Module reference
higher_twist_functions.py provides the following public functions:
get_pc_type(exp_name, process_type, experiment, pc_dict): determines which PC type key(s) apply to a given dataset.linear_bin_function(a, y_shift, bin_edges): evaluates the piecewise-linear triangular interpolation at pointsa.dis_pc_func(delta_h, nodes, x, Q2): computes the DIS power correction \(h(x)/Q^2\).jets_pc_func(delta_h, nodes, pT, rap): computes the jet power correction \(h(y)/p_T\).mult_dis_pc(nodes, x, q2, dataset_sp, pdf): returns a function that computes the multiplicative DIS shift given node values.mult_dis_ratio_pc(p_nodes, d_nodes, x, q2, dataset_sp, pdf): returns a function that computes the shift for the \(F_2^d/F_2^p\) ratio.mult_jet_pc(nodes, pT, rap, dataset_sp, pdf): returns a function that computes the multiplicative jet shift given node values.construct_pars_combs(parameters_dict): builds the list of one-at-a-time parameter combinations used to construct the covariance matrix.compute_deltas_pc(dataset_sp, pdf, pc_dict): computes the full set of shifts for a single dataset.
construction.py provides:
covmat_power_corrections(deltas1, deltas2): computes the theory covariance sub-matrix between two datasets from their shift dictionaries.covs_pt_prescrip_pc(combine_by_type, point_prescription, pdf, pc_parameters, pc_included_procs, pc_excluded_datasets): assembles the full power correction covariance matrix across all datasets.