12#include <gsl/gsl_complex.h>
13#include <gsl/gsl_sf.h>
28 if ( mu2<=0.0 || m2<0.0 )
29 throw std::runtime_error(
"PVfunctions::A0(): Invalid argument!");
31 const double Tolerance = 1.0e-10;
32 const bool m2zero = (m2 <= mu2*Tolerance);
42 const double m02,
const double m12)
const
45 return myLT.PV_B0(mu2, p2, m02, m12);
47 if ( mu2<=0.0 || p2<0.0 || m02<0.0 || m12<0.0 )
48 throw std::runtime_error(
"PVfunctions::B0(): Invalid argument!");
50 const double Tolerance = 1.0e-8;
51 const double maxM2 = std::max(p2, std::max(m02, m12));
52 const bool p2zero = (p2 <= maxM2*Tolerance);
53 const bool m02zero = (m02 <= maxM2*Tolerance);
54 const bool m12zero = (m12 <= maxM2*Tolerance);
55 const bool m02_eq_m12 = (fabs(m02 - m12) <= (m02 + m12)*Tolerance);
57 gslpp::complex
B0(0.0, 0.0,
false);
59 if ( !m02zero && !m12zero ) {
63 B0 = - m02/(m02-m12)*log(m02/mu2) + m12/(m02-m12)*log(m12/mu2) + 1.0;
64 }
else if ( m02zero && !m12zero )
65 B0 = - log(m12/mu2) + 1.0;
66 else if ( !m02zero && m12zero )
67 B0 = - log(m02/mu2) + 1.0;
68 else if ( m02zero && m12zero )
69 throw std::runtime_error(
"PVfunctions::B0(): IR divergent! (vanishes in DR)");
71 throw std::runtime_error(
"PVfunctions::B0(): Undefined!");
73 if ( !m02zero && !m12zero ) {
74 double m0 = sqrt(m02), m1 = sqrt(m12);
75 double Lambda = sqrt( fabs((p2-m02-m12)*(p2-m02-m12) - 4.0*m02*m12) );
77 if ( p2 > (m0-m1)*(m0-m1) && p2 < (m0+m1)*(m0+m1) ) {
78 if ( p2-m02-m12 > 0.0 ) {
79 if ( p2-m02-m12 > Lambda*Tolerance )
80 R = - Lambda/p2*(atan(Lambda/(p2-m02-m12)) - M_PI);
82 R = - Lambda/p2*(M_PI/2.0 - M_PI);
84 if ( - (p2-m02-m12) > Lambda*Tolerance )
85 R = - Lambda/p2*atan(Lambda/(p2-m02-m12));
87 R = - Lambda/p2*( -M_PI/2.0 );
90 R = Lambda/p2*log( fabs((p2-m02-m12+Lambda)/2.0/m0/m1) );
91 B0 = - log(m0*m1/mu2) + (m02-m12)/2.0/p2*log(m12/m02) - R + 2.0;
92 if ( p2 > (m0+m1)*(m0+m1) )
93 B0 += M_PI*Lambda/p2*gslpp::complex::i();
94 }
else if ( (m02zero && !m12zero) || (!m02zero && m12zero) ) {
96 if (!m02zero) M2 = m02;
98 B0 = - log(M2/mu2) + 2.0;
100 B0 += - (1.0 - M2/p2)*log(1.0 - p2/M2);
101 else if ( p2 > M2 ) {
102 B0 += - (1.0 - M2/p2)*log(p2/M2 - 1.0);
103 B0 += (1.0 - M2/p2)*M_PI*gslpp::complex::i();
106 }
else if ( m02zero && m12zero ) {
108 B0 = - log(-p2/mu2) + 2.0;
110 B0 = - log(p2/mu2) + 2.0;
111 B0 += M_PI*gslpp::complex::i();
114 throw std::runtime_error(
"PVfunctions::B0(): Undefined!");
121 const double m02,
const double m12)
const
124 return myLT.PV_B1(mu2, p2, m02, m12);
126 if ( mu2<=0.0 || p2<0.0 || m02<0.0 || m12<0.0 )
127 throw std::runtime_error(
"PVfunctions::B1(): Invalid argument!");
129 const double Tolerance = 1.0e-8;
130 const double maxM2 = std::max(p2, std::max(m02, m12));
131 const bool p2zero = (p2 <= maxM2*Tolerance);
132 const bool m02zero = (m02 <= maxM2*Tolerance);
133 const bool m12zero = (m12 <= maxM2*Tolerance);
134 const bool m02_eq_m12 = (fabs(m02 - m12) <= (m02 + m12)*Tolerance);
136 gslpp::complex
B1(0.0, 0.0,
false);
137 double DeltaM2 = m02 - m12;
139 if ( !m02zero && !m12zero ) {
141 B1.real() = 1.0/2.0*log(m12/mu2);
143 double F0 = - log(m12/m02);
144 double F1 = - 1.0 + m02/DeltaM2*
F0;
145 double F2 = - 1.0/2.0 + m02/DeltaM2*F1;
146 B1.real() = 1.0/2.0*( log(m12/mu2) + F2 );
148 }
else if ( m02zero && !m12zero )
149 B1.real() = 1.0/2.0*log(m12/mu2) - 1.0/4.0;
150 else if ( !m02zero && m12zero )
151 B1.real() = 1.0/2.0*log(m02/mu2) - 1.0/4.0;
157 + (DeltaM2 + p2)*
B0(mu2,p2,m02,m12));
163 const double m02,
const double m12)
const
166 return myLT.PV_B11(mu2, p2, m02, m12);
168 if ( mu2<=0.0 || p2<0.0 || m02<0.0 || m12<0.0 )
169 throw std::runtime_error(
"PVfunctions::B11(): Invalid argument!");
171 const double Tolerance = 1.0e-8;
172 const double maxM2 = std::max(p2, std::max(m02, m12));
173 const bool p2zero = (p2 <= maxM2*Tolerance);
174 const bool m02zero = (m02 <= maxM2*Tolerance);
175 const bool m12zero = (m12 <= maxM2*Tolerance);
176 const bool m02_eq_m12 = (fabs(m02 - m12) <= (m02 + m12)*Tolerance);
178 gslpp::complex
B11(0.0, 0.0,
false);
179 double DeltaM2 = m02 - m12;
181 if ( !m02zero && !m12zero ) {
183 B11.real() = - 1.0/3.0*log(m12/mu2);
185 double F0 = - log(m12/m02);
186 double F1 = - 1.0 + m02/DeltaM2*
F0;
187 double F2 = - 1.0/2.0 + m02/DeltaM2*F1;
188 double F3 = - 1.0/3.0 + m02/DeltaM2*F2;
189 B11.real() = - 1.0/3.0*( log(m12/mu2) + F3 );
191 }
else if ( m02zero && !m12zero )
192 B11.real() = - 1.0/3.0*log(m12/mu2) + 1.0/9.0;
193 else if ( !m02zero && m12zero )
194 B11.real() = - 1.0/3.0*log(m02/mu2) + 1.0/9.0;
196 throw std::runtime_error(
"PVfunctions::B11(): Undefined!");
198 double Lambdabar2 = (p2-m02-m12)*(p2-m02-m12) - 4.0*m02*m12;
199 B11 = - (3.0*(m02 + m12) - p2)/18.0/p2
202 + (Lambdabar2 + 3.0*p2*m02)/3.0/p2/p2*
B0(mu2,p2,m02,m12);
209 const double m02,
const double m12)
const
212 return myLT.PV_B00(mu2, p2, m02, m12);
214 if ( mu2<=0.0 || p2<0.0 || m02<0.0 || m12<0.0 )
215 throw std::runtime_error(
"PVfunctions::B00(): Invalid argument!");
217 const double Tolerance = 1.0e-8;
218 const double maxM2 = std::max(p2, std::max(m02, m12));
219 const bool p2zero = (p2 <= maxM2*Tolerance);
220 const bool m02zero = (m02 <= maxM2*Tolerance);
221 const bool m12zero = (m12 <= maxM2*Tolerance);
222 const bool m02_eq_m12 = (fabs(m02 - m12) <= (m02 + m12)*Tolerance);
224 gslpp::complex
B00(0.0, 0.0,
false);
226 if ( !m02zero && !m12zero ) {
228 B00 = m02/2.0*(- log(m02/mu2) + 1.0);
230 B00 = 1.0/4.0*(m02 + m12)*(- log(sqrt(m02)*sqrt(m12)/mu2) + 3.0/2.0)
231 - (m02*m02 + m12*m12)/8.0/(m02 - m12)*log(m02/m12);
232 }
else if ( (!m02zero && m12zero) || (m02zero && !m12zero) ) {
234 if ( !m02zero ) M2 = m02;
236 B00 = M2/4.0*(- log(M2/mu2) + 3.0/2.0);
240 if ( !m02zero && !m12zero ) {
243 - (p2 - 4.0*m02)/12.0*
B0(mu2,p2,m02,m12);
245 double DeltaM2 = m02 - m12;
246 double Lambdabar2 = (p2-m02-m12)*(p2-m02-m12) - 4.0*m02*m12;
247 B00 = (3.0*(m02 + m12) - p2)/18.0
250 - Lambdabar2*
B0(mu2,p2,m02,m12)/12.0/p2;
252 }
else if ( (!m02zero && m12zero) || (m02zero && !m12zero) ) {
254 if ( !m02zero ) M2 = m02;
257 - (M2 - p2)*(M2 - p2)/12.0/p2*
B0(mu2,p2,M2,0.0);
259 B00 = - p2/18.0 - p2/12.0*
B0(mu2,p2,0.0,0.0);
266 const double m02,
const double m12)
const
268 if ( mu2<=0.0 || p2<0.0 || m02<0.0 || m12<0.0 )
269 throw std::runtime_error(
"PVfunctions::Bf(): Invalid argument!");
271 gslpp::complex
Bf(0.0, 0.0,
false);
272 Bf = 2.0*(
B11(mu2,p2,m02,m12) +
B1(mu2,p2,m02,m12));
277 const double m02,
const double m12)
const
280 return myLT.PV_B0p(muIR2, p2, m02, m12);
282 if ( muIR2<=0.0 || p2<0.0 || m02<0.0 || m12<0.0 )
283 throw std::runtime_error(
"PVfunctions::B0p(): Invalid argument!");
285 const double Tolerance = 1.0e-8;
286 const double maxM2 = std::max(p2, std::max(m02, m12));
287 const bool p2zero = (p2 <= maxM2*Tolerance);
288 const bool m02zero = (m02 <= maxM2*Tolerance);
289 const bool m12zero = (m12 <= maxM2*Tolerance);
290 const bool m02_eq_m12 = (fabs(m02 - m12) <= (m02 + m12)*Tolerance);
292 gslpp::complex
B0p(0.0, 0.0,
false);
294 if ( !m02zero && !m12zero ) {
298 double DeltaM2 = m02 - m12;
299 B0p = (m02 + m12)/2.0/pow(DeltaM2,2.0)
300 + m02*m12/pow(DeltaM2,3.0)*log(m12/m02);
302 }
else if ( !m02zero && m12zero )
304 else if ( m02zero && !m12zero )
307 throw std::runtime_error(
"PVfunctions::B0p(): Undefined!");
309 if ( !m02zero && !m12zero ) {
310 double m0 = sqrt(m02), m1 = sqrt(m12);
311 double Lambda = sqrt( fabs((p2-m02-m12)*(p2-m02-m12) - 4.0*m02*m12) );
313 if ( p2 > (m0-m1)*(m0-m1) && p2 < (m0+m1)*(m0+m1) ) {
314 if ( p2-m02-m12 > 0.0 ) {
315 if ( p2-m02-m12 > Lambda*Tolerance )
316 Rprime = ((p2 - m02 - m12)/Lambda + Lambda/p2)
317 *(atan(Lambda/(p2-m02-m12)) - M_PI);
319 Rprime = ((p2 - m02 - m12)/Lambda + Lambda/p2)
322 if ( - (p2-m02-m12) > Lambda*Tolerance )
323 Rprime = ((p2 - m02 - m12)/Lambda + Lambda/p2)
324 *atan(Lambda/(p2-m02-m12));
326 Rprime = ((p2 - m02 - m12)/Lambda + Lambda/p2)
330 Rprime = ((p2 - m02 - m12)/Lambda - Lambda/p2)
331 *log( fabs((p2-m02-m12+Lambda)/2.0/m0/m1) );
332 B0p = - (m02 - m12)/2.0/p2/p2*log(m12/m02) - (Rprime + 1.0)/p2;
333 if ( p2 > (m0+m1)*(m0+m1) )
334 B0p += M_PI/p2*((p2 - m02 - m12)/Lambda - Lambda/p2)
335 *gslpp::complex::i();
336 }
else if ( (m02zero && !m12zero) || (!m02zero && m12zero) ) {
338 if ( !m02zero ) M2 = m02;
341 B0p = - M2/p2/p2*log(1.0 - p2/M2) - 1.0/p2;
342 else if ( p2 > M2 ) {
343 B0p = - M2/p2/p2*log(p2/M2 - 1.0) - 1.0/p2;
344 B0p += M2/p2/p2*M_PI*gslpp::complex::i();
346 B0p = 1.0/2.0/M2*(log(M2/muIR2) - 2.0);
347 }
else if ( m02zero && m12zero )
350 throw std::runtime_error(
"PVfunctions::B0p(): Undefined!");
357 const double m02,
const double m12)
const
360 return myLT.PV_B1p(mu2, p2, m02, m12);
362 if ( mu2<=0.0 || p2<0.0 || m02<0.0 || m12<0.0 )
363 throw std::runtime_error(
"PVfunctions::B1p(): Invalid argument!");
365 const double Tolerance = 1.0e-8;
366 const double maxM2 = std::max(p2, std::max(m02, m12));
367 const bool p2zero = (p2 <= maxM2*Tolerance);
369 gslpp::complex
B1p(0.0, 0.0,
false);
371 throw std::runtime_error(
"PVfunctions::B1p(): Undefined!");
373 double DeltaM2 = m02 - m12;
374 B1p = - ( 2.0*
B1(mu2,p2,m02,m12) +
B0(mu2,p2,m02,m12)
375 + (DeltaM2 + p2)*
B0p(mu2,p2,m02,m12) )/2.0/p2;
382 const double m02,
const double m12)
const
385 return myLT.PV_B11p(mu2, p2, m02, m12);
387 if ( mu2<=0.0 || p2<0.0 || m02<0.0 || m12<0.0 )
388 throw std::runtime_error(
"PVfunctions::B11p(): Invalid argument!");
390 const double Tolerance = 1.0e-8;
391 const double maxM2 = std::max(p2, std::max(m02, m12));
392 const bool p2zero = (p2 <= maxM2*Tolerance);
394 double p4 = p2*p2, p6=p2*p2*p2;
395 double DeltaM2 = m02 - m12;
396 gslpp::complex
B11p(0.0, 0.0,
false);
398 throw std::runtime_error(
"PVfunctions::B11p(): Undefined!");
400 double Lambdabar2 = (p2-m02-m12)*(p2-m02-m12) - 4.0*m02*m12;
403 - (2.0*DeltaM2*DeltaM2 + p2*m02 - 2.0*p2*m12)/3.0/p6*
B0(mu2,p2,m02,m12)
404 + (Lambdabar2 + 3.0*p2*m02)/3.0/p4*
B0p(mu2,p2,m02,m12);
411 const double m02,
const double m12)
const
414 return myLT.PV_B00p(mu2, p2, m02, m12);
416 if ( mu2<=0.0 || p2<0.0 || m02<0.0 || m12<0.0 )
417 throw std::runtime_error(
"PVfunctions::B00p(): Invalid argument!");
419 const double Tolerance = 1.0e-8;
420 const double maxM2 = std::max(p2, std::max(m02, m12));
421 const bool p2zero = (p2 <= maxM2*Tolerance);
422 const bool m02zero = (m02 <= maxM2*Tolerance);
423 const bool m12zero = (m12 <= maxM2*Tolerance);
424 const bool m02_eq_m12 = (fabs(m02 - m12) <= (m02 + m12)*Tolerance);
426 gslpp::complex
B00p(0.0, 0.0,
false);
427 double DeltaM2 = m02 - m12;
430 B00p = - 1.0/18.0 - 1.0/12.0*
B0(mu2,0.0,m02,m12)
431 + (m02 + m12)/6.0*
B0p(mu2,0.0,m02,m12);
432 else if ( m02zero || m12zero )
433 B00p = - 1.0/18.0 - 1.0/12.0*
B0(mu2,0.0,m02,m12)
434 + (m02 + m12)/6.0*
B0p(mu2,0.0,m02,m12) - 1.0/72.0;
436 B00p = - 1.0/18.0 - 1.0/12.0*
B0(mu2,0.0,m02,m12)
437 + (m02 + m12)/6.0*
B0p(mu2,0.0,m02,m12)
439 *( (m02*m02 + 10.0*m02*m12 + m12*m12)/3.0/DeltaM2/DeltaM2
440 + 2.0*m02*m12*(m02 + m12)/DeltaM2/DeltaM2/DeltaM2*log(m12/m02) );
442 double Lambdabar2 = (p2-m02-m12)*(p2-m02-m12) - 4.0*m02*m12;
444 B00p = - 1.0/18.0 -
B0(mu2,p2,m02,m12)/12.0
445 - Lambdabar2/12.0/p2*
B0p(mu2,p2,m02,m12);
450 + DeltaM2*
B0(mu2,p2,m02,m12))
451 -
B0(mu2,p2,m02,m12)/12.0
452 - Lambdabar2/12.0/p2*
B0p(mu2,p2,m02,m12);
459 const double m02,
const double m12)
const
461 if ( mu2<=0.0 || p2<0.0 || m02<0.0 || m12<0.0 )
462 throw std::runtime_error(
"PVfunctions::Bfp(): Invalid argument!");
464 gslpp::complex
Bfp(0.0, 0.0,
false);
465 Bfp = 2.0*(
B11p(mu2,p2,m02,m12) +
B1p(mu2,p2,m02,m12));
470 const double m02,
const double m12,
const double m22)
const
475 throw std::runtime_error(
"PVfunctions::C0(p1,p2,p1p22,m02,m12,m22): Only available with LoopTools.");
480 const double m02,
const double m12,
const double m22)
const
485 if ( p2<0.0 || m02<0.0 || m12<0.0 || m22<0.0 )
486 throw std::runtime_error(
"PVfunctions::C0(): Invalid argument!");
488 const double Tolerance = 1.0e-8;
489 const double maxM2 = std::max(p2, std::max(m02, std::max(m12, m22)));
490 const bool p2zero = (p2 <= maxM2*Tolerance);
491 const bool m02zero = (m02 <= maxM2*Tolerance);
492 const bool m12zero = (m12 <= maxM2*Tolerance);
493 const bool m22zero = (m22 <= maxM2*Tolerance);
494 bool diff01 = (fabs(m02 - m12) > (m02 + m12)*Tolerance);
495 bool diff12 = (fabs(m12 - m22) > (m12 + m22)*Tolerance);
496 bool diff20 = (fabs(m22 - m02) > (m22 + m02)*Tolerance);
498 gslpp::complex
C0(0.0, 0.0,
false);
500 if ( !m02zero && !m12zero && !m22zero ) {
501 if ( diff01 && diff12 && diff20 )
502 return ( - ( m12/(m02 - m12)*log(m12/m02)
503 - m22/(m02 - m22)*log(m22/m02) )/(m12 - m22) );
504 else if ( !diff01 && diff12 && diff20 )
505 return ( - (- m02 + m22 - m22*log(m22/m02))/(m02 - m22)/(m02 - m22) );
506 else if ( diff01 && !diff12 && diff20 )
507 return ( - ( m02 - m12 + m02*log(m12/m02))/(m02 - m12)/(m02 - m12) );
508 else if ( diff01 && diff12 && !diff20 )
509 return ( - (- m02 + m12 - m12*log(m12/m02))/(m02 - m12)/(m02 - m12) );
511 return ( 1.0/2.0/m02 );
514 if ( !diff20 && diff01 ) {
515 double epsilon = 1.0e-12;
516 gsl_complex tmp = gsl_complex_rect(1.0 - 4.0*m02/p2, epsilon);
517 tmp = gsl_complex_sqrt(tmp);
518 gslpp::complex tmp_complex(GSL_REAL(tmp), GSL_IMAG(tmp),
false);
519 gslpp::complex x0 = 1.0 - (m02 - m12)/p2;
520 gslpp::complex x1 = (1.0 + tmp_complex)/2.0;
521 gslpp::complex x2 = (1.0 - tmp_complex)/2.0;
522 gslpp::complex x3 = m02/(m02 - m12);
524 if ( x0==x1 || x0==x2 || x0==x3)
525 throw std::runtime_error(
"PVfunctions::C0(): Undefined-2!");
527 gslpp::complex arg[6];
528 arg[0] = (x0 - 1.0)/(x0 - x1);
529 arg[1] = x0/(x0 - x1);
530 arg[2] = (x0 - 1.0)/(x0 - x2);
531 arg[3] = x0/(x0 - x2);
532 arg[4] = (x0 - 1.0)/(x0 - x3);
533 arg[5] = x0/(x0 - x3);
535 gslpp::complex
Li2[6];
536 for (
int i=0; i<6; i++) {
537 gsl_sf_result re, im;
538 gsl_sf_complex_dilog_xy_e(arg[i].real(), arg[i].imag(), &re, &im);
539 Li2[i].real() = re.val;
540 Li2[i].imag() = im.val;
547 }
else if ( !m02zero && !m22zero && diff20 && m12zero ) {
548 double epsilon = 1.0e-12;
549 double tmp_real = pow((m02+m22-p2),2.0) - 4.0*m02*m22;
550 gsl_complex tmp = gsl_complex_rect(tmp_real, epsilon);
551 tmp = gsl_complex_sqrt(tmp);
552 gslpp::complex tmp_complex(GSL_REAL(tmp), GSL_IMAG(tmp),
false);
553 gslpp::complex x1 = (p2 - m02 + m22 + tmp_complex)/2.0/p2;
554 gslpp::complex x2 = (p2 - m02 + m22 - tmp_complex)/2.0/p2;
556 if ( x1==0.0 || x1==1.0 || x2==0.0 || x2==1.0 )
557 throw std::runtime_error(
"PVfunctions::C0(): Undefined-3!");
559 gslpp::complex arg1 = (x1 - 1.0)/x1;
560 gslpp::complex arg2 = x2/(x2 - 1.0);
561 gsl_complex arg1_tmp = gsl_complex_rect(arg1.real(), arg1.imag());
562 gsl_complex arg2_tmp = gsl_complex_rect(arg2.real(), arg2.imag());
563 C0.real() = - 1.0/p2*( GSL_REAL(gsl_complex_log(arg1_tmp))
564 *GSL_REAL(gsl_complex_log(arg2_tmp))
565 - GSL_IMAG(gsl_complex_log(arg1_tmp))
566 *GSL_IMAG(gsl_complex_log(arg2_tmp)) );
567 C0.imag() = - 1.0/p2*( GSL_REAL(gsl_complex_log(arg1_tmp))
568 *GSL_IMAG(gsl_complex_log(arg2_tmp))
569 + GSL_IMAG(gsl_complex_log(arg1_tmp))
570 *GSL_REAL(gsl_complex_log(arg2_tmp)) );
571 }
else if ( m02zero && !m12zero && !m22zero ) {
572 gslpp::complex arg[2];
573 arg[0] = 1.0 - m22/m12;
574 arg[1] = 1.0 - (-p2+m22)/m12;
575 gslpp::complex
Li2[2];
576 for (
int i=0; i<2; i++) {
577 gsl_sf_result re, im;
578 gsl_sf_complex_dilog_xy_e(arg[i].real(), arg[i].imag(), &re, &im);
579 Li2[i].real() = re.val;
580 Li2[i].imag() = im.val;
583 }
else if ( !m02zero && !m12zero && !m22zero && diff01 && diff12 ) {
584 double x0 = 1.0 - (m02-m12)/p2;
585 double x1 = -(-p2+m02-m22-sqrt(fabs((m02+m22-p2)*(m02+m22-p2) - 4.*m02*m22)))/p2/2.0;
586 double x2 = -(-p2+m02-m22+sqrt(fabs((m02+m22-p2)*(m02+m22-p2) - 4.*m02*m22)))/p2/2.0;
587 double x3 = m22/(m22-m12);
589 gslpp::complex arg[6];
590 arg[0] = (x0-1.0)/(x0-x1);
592 arg[2] = (x0-1.0)/(x0-x2);
594 arg[4] = (x0-1.0)/(x0-x3);
597 gslpp::complex
Li2[6];
598 for (
int i=0; i<2; i++) {
599 gsl_sf_result re, im;
600 gsl_sf_complex_dilog_xy_e(arg[i].real(), arg[i].imag(), &re, &im);
601 Li2[i].real() = re.val;
602 Li2[i].imag() = im.val;
607 throw std::runtime_error(
"PVfunctions::C0(): Undefined-4!");
615 if ( m12<=0.0 || m22<=0.0 || m32<=0.0 )
616 throw std::runtime_error(
"PVfunctions::C11(): Argument is not positive!");
618 const double Tolerance = 2.5e-3;
621 if ( 2.0*fabs(m12-m22) > (m12+m22)*Tolerance && 2.0*fabs(m12-m32) > (m12+m32)*Tolerance && 2.0*fabs(m22-m32) > (m22+m32)*Tolerance ) {
622 C11=(-m12*(m12-m22)*(m12-m32)*(m22-m32)
623 +m12*m12*m22*(2.0*m12-m22)*log(m12/m22)
624 +m12*m12*m32*(-2.0*m12+m32)*log(m12/m32)
625 +m22*m32*(-2.0*m12+m22)*(-2.0*m12+m32)*log(m22/m32))
626 /(2.0*(m12-m22)*(m12-m22)*(m12-m32)*(m12-m32)*(m22-m32));
628 else if ( 2.0*fabs(m12-m22) > (m12+m22)*Tolerance && 2.0*fabs(m12-m32) > (m12+m32)*Tolerance && 2.0*fabs(m22-m32) <= (m22+m32)*Tolerance ) {
629 C11=-((-12.0*m12*m12+8.0*m12*(m22+m32)-(m22+m32)*(m22+m32)+8.0*m12*m12*log((2.0*m12)/(m22+m32)))
630 /pow(-2.0*m12+m22+m32,3));
632 else if ( 2.0*fabs(m12-m22) > (m12+m22)*Tolerance && 2.0*fabs(m12-m32) <= (m12+m32)*Tolerance && 2.0*fabs(m22-m32) > (m22+m32)*Tolerance ) {
633 C11=(3.0*m12*m12-8.0*m12*m22+4.0*m22*m22+6.0*m12*m32-8.0*m22*m32+3.0*m32*m32+8.0*m22*(m12-m22+m32)*log((2.0*m22)/(m12+m32)))
634 /(2.0*pow(m12-2.0*m22+m32,3));
636 else if ( 2.0*fabs(m12-m22) <= (m12+m22)*Tolerance && 2.0*fabs(m12-m32) <= (m12+m32)*Tolerance && 2.0*fabs(m22-m32) <= (m22+m32)*Tolerance ) {
640 C11=(3.0*m12*m12+6.0*m12*m22+3.0*m22*m22-8.0*m12*m32-8.0*m22*m32+4.0*m32*m32-8.0*m32*(m12+m22-m32)*log((m12+m22)/(2.0*m32)))
641 /(2.0*pow(m12+m22-2.0*m32,3));
649 if ( m12<=0.0 || m22<=0.0 || m32<=0.0 )
650 throw std::runtime_error(
"PVfunctions::C12(): Argument is not positive!");
652 const double Tolerance = 2.5e-3;
655 if ( 2.0*fabs(m12-m22) > (m12+m22)*Tolerance && 2.0*fabs(m12-m32) > (m12+m32)*Tolerance && 2.0*fabs(m22-m32) > (m22+m32)*Tolerance ) {
656 C12=((m12-m22)*(m12-m32)*(m22-m32)*m32
657 +m12*m12*(m22*m22*log(m12/m22) +m32*(-2.0*m22+m32)*log(m12/m32))
658 +m22*m22*(2.0*m12-m32)*m32*log(m22/m32))
659 /(2.0*(m12-m22)*(m12-m32)*(m12-m32)*(m22-m32)*(m22-m32));
661 else if ( 2.0*fabs(m12-m22) > (m12+m22)*Tolerance && 2.0*fabs(m12-m32) > (m12+m32)*Tolerance && 2.0*fabs(m22-m32) <= (m22+m32)*Tolerance ) {
662 C12=-(-12.0*m12*m12+8.0*m12*(m22+m32)-(m22+m32)*(m22+m32)+8.0*m12*m12*log((2.0*m12)/(m22+m32)))
663 /(2.0*pow(-2.0*m12+m22+m32,3));
665 else if ( 2.0*fabs(m12-m22) > (m12+m22)*Tolerance && 2.0*fabs(m12-m32) <= (m12+m32)*Tolerance && 2.0*fabs(m22-m32) > (m22+m32)*Tolerance ) {
666 C12=(m12*m12-8.0*m12*m22+12.0*m22*m22+2.0*m12*m32-8.0*m22*m32+m32*m32-8.0*m22*m22*log((2.0*m22)/(m12+m32)))
667 /(2.0*pow(m12-2.0*m22+m32,3));
669 else if ( 2.0*fabs(m12-m22) <= (m12+m22)*Tolerance && 2.0*fabs(m12-m32) <= (m12+m32)*Tolerance && 2.0*fabs(m22-m32) <= (m22+m32)*Tolerance ) {
670 C12=1.0/(2.0*(m12+m22+m32));
673 C12=(m12*m12+2.0*m12*m22+m22*m22-4.0*m32*m32-4.0*(m12+m22)*m32*log((m12+m22)/(2.0*m32)))
674 /pow(m12+m22-2.0*m32,3);
681 const double m12,
const double m22,
const double m32)
const
683 if ( m02<0.0 || m12<0.0 || m22<0.0 || m32<0.0 )
684 throw std::runtime_error(
"PVfunctions::D0(): Invalid argument!");
686 const double Tolerance = 1.0e-8;
687 const double maxM2 = std::max(
s, std::max(
t, std::max(m02, std::max(m12, std::max(m22, m32)))));
688 const bool szero = (
s <= maxM2*Tolerance);
689 const bool tzero = (
t <= maxM2*Tolerance);
690 const bool m02zero = (m02 <= maxM2*Tolerance);
691 const bool m12zero = (m12 <= maxM2*Tolerance);
692 const bool m22zero = (m22 <= maxM2*Tolerance);
693 const bool m32zero = (m32 <= maxM2*Tolerance);
694 bool diff01 = (fabs(m02 - m12) > (m02 + m12)*Tolerance);
695 bool diff02 = (fabs(m02 - m22) > (m02 + m22)*Tolerance);
696 bool diff03 = (fabs(m02 - m32) > (m02 + m32)*Tolerance);
697 bool diff23 = (fabs(m22 - m32) > (m22 + m32)*Tolerance);
699 if ( szero && tzero ) {
704 if ( !m02zero && !m12zero && !m22zero && !m32zero ) {
705 if ( diff02 && diff03 && diff23 )
706 return ( - 1.0/(m02 - m22)/(m02 - m32)
707 + m22/(m02 - m22)/(m02 - m22)/(m32 - m22)*log(m22/m02)
708 + m32/(m02 - m32)/(m02 - m32)/(m22 - m32)*log(m32/m02) );
709 else if ( !diff02 && diff03 && diff23 )
710 return ( (m02*m02 - m32*m32 + 2.0*m02*m32*log(m32/m02))
711 /2.0/m02/(m02 - m32)/(m02 - m32)/(m02 - m32) );
712 else if ( diff02 && !diff03 && diff23 )
713 return ( (m02*m02 - m22*m22 + 2.0*m02*m22*log(m22/m02))
714 /2.0/m02/(m02 - m22)/(m02 - m22)/(m02 - m22) );
715 else if ( diff02 && diff03 && !diff23 )
716 return ( ( - 2.0*m02 + 2.0*m22 - (m02 + m22)*log(m22/m02))
717 /(m02 - m22)/(m02 - m22)/(m02 - m22) );
719 return ( 1.0/6.0/m02/m02 );
721 throw std::runtime_error(
"PVfunctions::D0(): Undefined!");
726 return myLT.PV_D0(
s,
t, m02, m12, m22, m32);
728 gslpp::complex
D0(0.0, 0.0,
false);
730 if (
s>0.0 &&
t<0.0 && !m02zero && m12zero && !diff02 && !m32zero
731 && m02!=m32 &&
t-m32+m02!=0.0 &&
t-m32!=0.0 ) {
756 throw std::runtime_error(
"PVfunctions::D0(): Undefined!");
757 }
else if (
s>0.0 &&
t<0.0 && !m02zero && m12zero && !diff02 && m32zero ) {
760 throw std::runtime_error(
"PVfunctions::D0(): Undefined!");
762 throw std::runtime_error(
"PVfunctions::D0(): Undefined!");
769 const double m12,
const double m22,
const double m32)
const
771 if ( m02<0.0 || m12<0.0 || m22<0.0 || m32<0.0 )
772 throw std::runtime_error(
"PVfunctions::D00(): Invalid argument!");
774 const double Tolerance = 1.0e-8;
775 const double maxM2 = std::max(
s, std::max(
t, std::max(m02, std::max(m12, std::max(m22, m32)))));
776 const bool szero = (
s <= maxM2*Tolerance);
777 const bool tzero = (
t <= maxM2*Tolerance);
778 const bool m02zero = (m02 <= maxM2*Tolerance);
779 const bool m12zero = (m12 <= maxM2*Tolerance);
780 const bool m22zero = (m22 <= maxM2*Tolerance);
781 const bool m32zero = (m32 <= maxM2*Tolerance);
782 bool diff01 = (fabs(m02 - m12) > (m02 + m12)*Tolerance);
783 bool diff02 = (fabs(m02 - m22) > (m02 + m22)*Tolerance);
784 bool diff03 = (fabs(m02 - m32) > (m02 + m32)*Tolerance);
785 bool diff23 = (fabs(m22 - m32) > (m22 + m32)*Tolerance);
787 if ( szero && tzero ) {
792 if ( !m02zero && !m12zero && !m22zero && !m32zero ) {
793 if ( diff02 && diff03 && diff23 )
794 return ( m02/4.0/(m02 - m22)/(m32 - m02)
795 + m22*m22/4.0/(m02 - m22)/(m02 - m22)/(m32 - m22)*log(m22/m02)
796 + m32*m32/4.0/(m02 - m32)/(m02 - m32)/(m22 - m32)*log(m32/m02) );
797 else if ( !diff02 && diff03 && diff23 )
798 return ( ( - m02*m02 + 4.0*m02*m32 - 3.0*m32*m32
799 + 2.0*m32*m32*log(m32/m02) )
800 /8.0/(m02 - m32)/(m02 - m32)/(m02 - m32) );
801 else if ( diff02 && !diff03 && diff23 )
802 return ( ( - m02*m02 + 4.0*m02*m22 - 3.0*m22*m22
803 + 2.0*m22*m22*log(m22/m02) )
804 /8.0/(m02 - m22)/(m02 - m22)/(m02 - m22) );
805 else if ( diff02 && diff03 && !diff23 )
806 return ( ( - m02*m02 + m22*m22 - 2.0*m02*m22*log(m22/m02) )
807 /4.0/(m02 - m22)/(m02 - m22)/(m02 - m22) );
809 return ( - 1.0/12.0/m02 );
811 throw std::runtime_error(
"PVfunctions::D00(): Undefined!");
816 return myLT.PV_D00(
s,
t, m02, m12, m22, m32);
818 gslpp::complex
D00(0.0, 0.0,
false);
820 throw std::runtime_error(
"PVfunctions::D00(): Undefined!");
double C12(const double m12, const double m22, const double m32) const
.
gslpp::complex B1(const double mu2, const double p2, const double m02, const double m12) const
.
gslpp::complex D00(const double s, const double t, const double m02, const double m12, const double m22, const double m32) const
.
LoopToolsWrapper myLT
An object of type LoopToolsWrapper.
gslpp::complex B00(const double mu2, const double p2, const double m02, const double m12) const
.
gslpp::complex B0(const double mu2, const double p2, const double m02, const double m12) const
.
gslpp::complex B00p(const double mu2, const double p2, const double m02, const double m12) const
.
double C11(const double m12, const double m22, const double m32) const
.
PVfunctions(const bool bExtraMinusSign)
Constructor.
gslpp::complex B11(const double mu2, const double p2, const double m02, const double m12) const
.
gslpp::complex B0p(const double muIR2, const double p2, const double m02, const double m12) const
.
gslpp::complex Bfp(const double mu2, const double p2, const double m02, const double m12) const
.
gslpp::complex B11p(const double mu2, const double p2, const double m02, const double m12) const
.
gslpp::complex Bf(const double mu2, const double p2, const double m02, const double m12) const
.
double A0(const double mu2, const double m2) const
.
gslpp::complex C0(const double p2, const double m02, const double m12, const double m22) const
.
double ExtraMinusSign
An overall factor for the one-point and three-point functions, initialized in PVfunctions().
gslpp::complex B1p(const double mu2, const double p2, const double m02, const double m12) const
.
gslpp::complex D0(const double s, const double t, const double m02, const double m12, const double m22, const double m32) const
.