27 return ([Mp](
const vector<double>& vals) -> pair<double, double> {
28 return make_pair(4.*Mp*Mp, pow(sqrt(vals[0]) - Mp,2.) );
33 return ([Mp](
const vector<double>& vals) -> pair<double, double> {
35 double E12 = (vals[0] - Mp2 - vals[1])/(2*sqrt(vals[1]));
36 double sqTerm = (vals[0] - vals[1])/2. + 3.*Mp2/2.;
37 double cosTerm = 2.*sqrt(E12*E12 - Mp2)*sqrt(vals[1]/4. - Mp2);
38 return make_pair(sqTerm - cosTerm, sqTerm + cosTerm);
43 namespace MD = MultiDimensional;
45 RateTau3PiNu::RateTau3PiNu() {
47 string name{
"RateTau3PiInt"};
49 vector<IndexType> dims{{3, 3, totNumPoints}};
50 auto& pdg = PID::instance();
52 addProcessSignature(PID::ANTITAU, {PID::PIMINUS, PID::PIPLUS, PID::PIPLUS, PID::NU_TAUBAR});
53 addIntegrationBoundaries({
PS::makeQ2Function(3. * pdg.getMass(PID::PIPLUS), pdg.getMass(PID::TAU)),
61 Tensor RateTau3PiNu::evalAtPSPoint(
const vector<double>& point) {
62 auto labs = getTensor().
labels();
64 auto dimensions = getTensor().dims();
65 dimensions.pop_back();
68 const double Mt = masses()[0];
69 const double Mp = masses()[1];
70 const double Mt2 = Mt*Mt;
71 const double Mp2 = Mp*Mp;
73 const double Sqp = point[0];
74 const double s1 = point[1];
75 const double s2 = point[2];
77 const double Ep1 = (Sqp - s1 + Mp2)/(2*sqrt(Sqp));
78 const double Ep2 = (Sqp - s2 + Mp2)/(2*sqrt(Sqp));
79 const double Kp12 = Ep1*Ep1 - Mp2;
81 const double Kp22 = Ep2*Ep2 - Mp2;
84 const double Kp1Kp2CosTp12 = (2*Ep1*Ep2 + Mp2 - 2*(Ep1 + Ep2)*sqrt(Sqp) + Sqp)/2.;
86 double RateNorm = pow(
GFermi,2.)*pow(Mt2 - Sqp,2.)/(4096.*pow(Mt,3.)*pow(
pi,5.)*Sqp);
89 result.element({0, 0}) = ((Mt2 + 2.*Sqp)*(4.*Kp12 + Kp22 + 4.*Kp1Kp2CosTp12))/(3.*Sqp);
90 result.element({0, 1}) = ((Mt2 + 2.*Sqp)*(2.*(Kp12 + Kp22) + 5.*Kp1Kp2CosTp12))/(3.*Sqp);
91 result.element({1, 0}) = ((Mt2 + 2.*Sqp)*(2.*(Kp12 + Kp22) + 5.*Kp1Kp2CosTp12))/(3.*Sqp);
92 result.element({1, 1}) = ((Mt2 + 2.*Sqp)*(Kp12 + 4.*Kp22 + 4.*Kp1Kp2CosTp12))/(3.*Sqp);
93 result.element({2, 2}) = Mt2;
96 result *= 0.5*(RateNorm);
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
LabelsList labels() const
get the labels of all the indices at once
static constexpr double GFermi
Tensor indices label definitions.
std::function< std::pair< double, double >(const std::vector< double > &)> BoundaryFunction
BoundaryFunction makeS2Function(double Mp)
Sparse tensor data container.
Multidimensional tensor class with complex numbers as elements.
Various numerical constants.
BoundaryFunction makeS1Function(double Mp)
Hammer particle data class.
BoundaryFunction makeQ2Function(double qmin, double qmax)
static constexpr double pi