# Linking *Package*-X to LoopTools

*Package*‐X provided by LoopTools has been superceded by the CollierLink package.

This tutorial explains how to link *Package*-X to LoopTools v2.14 or later so that the Passarino-Veltman functions can be numerically evaluated. This tutorial assumes that you have the LoopTools *MathLink* executable on your machine (either by downloading the ready-made executable, or by compiling the source code).

## Motivation

Consider the following integral:

By default, the Passarino-Veltman functions PVA, PVB, PVC and PVD generated by LoopIntegrate do not numerically evaluate in *Package*-X:

Instead, these symbols must be converted to analytic expressions by LoopRefine before a numerical evaluation can be made:

For more complicated one-loop integrals (such as those for computing fully differential collision cross sections), analytic expressions generated by LoopRefine are usually too verbose to be useful. By defining PVA, PVB, PVC and PVD to call the corresponding LoopTools functions, we can numerically evaluate loop integrals without needing to generate an analytic expression first.

## Linking to LoopTools

Initialize *Package*-X and LoopTools in the same session:

In[5]:= |

Define PVA, PVB, PVC and PVD to call the appropriate LoopTools function for numerical arguments (it may be convenient for you to copy the following code block to your working notebook):

Unprotect[X`PVA,X`PVB,X`PVC,X`PVD];

SetDelayed[

X`PVA[Floor[StringCount[#,"0"]/2],m0_?NumericQ],LoopTools`A0i[Symbol[#],m0^{2}]

]& /@ Names["LoopTools`aa*"];

SetDelayed[

X`PVB[Floor[StringCount[#,"0"]/2],StringCount[#,"1"],p1_?NumericQ,m0_?NumericQ,m1_?NumericQ],LoopTools`B0i[Symbol[#],p1,m0^{2},m1^{2}]

]& /@ Names["LoopTools`bb*"];

SetDelayed[

X`PVC[Floor[StringCount[#,"0"]/2],StringCount[#,"1"],StringCount[#,"2"],p1_?NumericQ,q_?NumericQ,p2_?NumericQ,m0_?NumericQ,m1_?NumericQ,m2_?NumericQ],LoopTools`C0i[Symbol[#],p1,q,p2,m0^{2},m1^{2},m2^{2}]

]& /@ Names["LoopTools`cc*"];

SetDelayed[

X`PVD[Floor[StringCount[#,"0"]/2],StringCount[#,"1"],StringCount[#,"2"],StringCount[#,"3"],s1_?NumericQ,s2_?NumericQ,s3_?NumericQ,s4_?NumericQ,s12_?NumericQ,s23_?NumericQ,m0_?NumericQ,m1_?NumericQ,m2_?NumericQ,m3_?NumericQ],LoopTools`D0i[Symbol[#],s1,s2,s3,s4,s12,s23,m0^{2},m1^{2},m2^{2},m3^{2}]

]& /@ Names["LoopTools`dd*"];

Protect[PVA,PVB,PVC,PVD];

## Example

Now the Passarino-Veltman coefficient functions can be evaluated numerically:

Compare with *Package*-X result by applying LoopRefine:

LoopTools regulates UV divergences in dimensional regularization. The UV divergent Passarino-Veltman coefficients are minimally subtracted ( pole removed), with the renormalization scale µ set to 1. by default (controlled by SetMudim[val]).

Infrared divergent Passarino-Veltman functions are regulated with a small mass, and therefore cannot be directly compared with the output of LoopRefine.

## Possible Issues

Since LoopTools minimally subtracts UV divergences, finite contributions arising from the multiplication of ϵ with UV-divergent Passarino-Veltman coefficient functions may be missed. Consider the same integral, this time generated by setting the option CancelFalse to LoopIntegrate:

The third term contains the product . Compare the result of evaluating the Passarino-Veltman functions directly with LoopTools with that of evaluating the analytic expression generated by LoopRefine:

The finite contribution missed in the first evaluation:

Numerical results generated by evaluating the Passarino-Veltman functions directly are guarenteed to be correct only if the expression is free of and ϵ.