-
Notifications
You must be signed in to change notification settings - Fork 8
Description
I recently computed some triangle and box integrals with QCDLoop and compared them to sector decomposition results from pysecdec. This was actually intended to compute some subtopologies of a pentagon, thus the variables are adapted to that. At a certain point in phase-space, I find disagreement for several triangles and boxes.
For example, if I run the following C++ program:
#include <iostream>
#include <iomanip>
#include <complex>
#include <qcdloop/qcdloop.h>
#include <qcdloop/cache.h>
using namespace std::numbers;
using std::vector;
using std::complex;
using std::cout;
using std::endl;
using std::setprecision;
using std::scientific;
using std::rand;
int main()
{
double mu2 = ql::Pow(1.0,2.0);
complex<double> m12 = complex<double>(1.0,-0.1); // internal mass square
double m22 = 5./2.; // off-shellness of one of the five particles
double s12 = 7.; // five-particle Mandelstam invariants
double s23 = -(7./2.);
double s34 = 23./2.;
double s45 = -(5./2.);
double s15 = 6.;
vector<complex<double>> res(3);
// pysecdec results
complex<double> pysecValue0 = 0;
complex<double> pysecValue1 = 0;
complex<double> pysecValue2 = complex<double>(0.3313048590525264,-0.33478605007189316);
// QCDloop results
/**
* Triangle
*/
vector<complex<double>> m = {m12, 0.0, 0.0};
vector<double> p = {s12, s34, 0.0};
cout << ql::red << "\n====== Triangle 6 ======" << ql::def << endl;
ql::Triangle<complex<double>,complex<double>,double> tr;
tr.integral(res, mu2, m, p);
cout << "QCDLoop - pysecdec:" << endl;
// pysecdec (as I set it up) uses a different normalization than QCDLoop. Hence the "-pow(pi,2)/12. * res[2]".
cout << "eps^(" << 0 << ")\t\t" << (res[0]-pow(pi,2)/12. * res[2] - pysecValue2) << endl;
cout << "eps^(" << -1 << ")\t" << (res[1] - pysecValue1) << endl;
cout << "eps^(" << -2 << ")\t" << (res[2] - pysecValue0) << endl;
cout << "pysecdec:" << endl;
cout << "\teps^(" << 0 << ")\t\t" << (pysecValue2) << endl;
cout << "\teps^(" << -1 << ")\t" << (pysecValue1) << endl;
cout << "\teps^(" << -2 << ")\t" << (pysecValue0) << endl;
return 0;
}
I obtain a deviation of 2.37609 + 0.859857*I - which appears quite huge for me. Moreover, this is just an example, for other diagrams I obtain similar deviations.
My PySecDec setup is
#!/usr/bin/env python3
import pySecDec as psd
if __name__ == "__main__":
li = psd.LoopIntegralFromGraph(
internal_lines = [['m1',[5,1]], ['m1',[1,2]], ['0',[2,3]], ['0',[3,4]], ['0',[4,5]]],
external_lines = [['p1',1], ['p2',2], ['p3',3], ['p4',4], ['p5',5]],
replacement_rules = [
('p1', '-p2-p3-p4-p5'),
('p2*p2', '0'),
('p3*p3', '0'),
('p4*p4', '0'),
('p5*p5', '0'),
('p2*p3', 's23/2'),
('p2*p4', 's15/2-s23/2-s34/2'),
('p2*p5', 'm22/2-s12/2-s15/2+s34/2'),
('p3*p4', 's34/2'),
('p3*p5', 's12/2-s34/2-s45/2'),
('p4*p5', 's45/2'),
('m1**2', 'm12')
],
powerlist = [1, 0, 1, 0, 1]
)
Mandelstam_symbols = ['m22','s12','s23','s34','s45','s15']
mass_symbols = ['m12']
psd.loop_package(
name = 'triangle6',
loop_integral = li,
real_parameters = Mandelstam_symbols,
complex_parameters = mass_symbols,
requested_orders = [2],
additional_prefactor = 'exp(eps*EulerGamma)'
)
(and an integration script which I did not want to attach here because it bloats up the post). To the best of my knowledge, this should define the same diagram. Indeed, if I instead run the very same test with the imaginary part of m12 set to zero, I find agreement.
I have tested also for my relevant configuration several other triangles and boxes. For some of them, I found agreement, for some not; I can share the list with you if you want. Moreover, I have myself written a library to compute these diagrams analytically, which agrees with pysecdec but disagrees with QCDLoop in these cases.
If there is anything more on information that I can provide you, please let me know.
Best regards,
Linus Götzfried