21 using namespace complex_literals;
25 namespace MD = MultiDimensional;
27 AmplTauPiNu::AmplTauPiNu() {
29 vector<IndexType> dims{{2, 2}};
30 string name{
"AmplTauPiNu"};
31 addProcessSignature(PID::ANTITAU, {PID::PIPLUS, PID::NU_TAUBAR});
38 void AmplTauPiNu::defineSettings() {
51 if (references.size() >= 2) {
52 pDmes = references[0].momentum();
53 kNuTau = references[1].momentum();
58 const double Mb = pBmes.
mass();
59 const double Mb2 = Mb*Mb;
60 const double Md = pDmes.mass();
61 const double Md2 = Md*Md;
62 const double Mt = pTau.mass();
63 const double Mt2 = Mt*Mt;
64 const double Mp = pPion.
mass();
65 const double Mp2 = Mp*Mp;
66 const double Sqq = Mb2 + Md2 - 2. * (pBmes * pDmes);
67 const double sqSqq = sqrt(Sqq);
68 const double Ew = (Mb2 - Md2 + Sqq) / (2 * Mb);
69 const double Pw = sqrt(Ew*Ew - Sqq);
70 const double BNuTau = (pBmes * kNuTau);
71 const double NuTauQ = (pBmes * kNuTau) - (pDmes * kNuTau);
72 const double BQ = Mb2 - (pBmes * pDmes);
74 const double BTau = (pBmes * pTau);
75 const double NuTauNuBarTau = (kNuTau * kNuBarTau);
76 const double TauNuBarTau = (pTau * kNuBarTau);
77 const double TauNuTau = (pTau * kNuTau);
78 const double BNuBarTau = (pBmes * kNuBarTau);
79 const double epsBDNuTauNuBarTau =
epsilon(pBmes, pDmes, kNuTau, kNuBarTau);
81 const double CosTt = -((Ew * (Sqq * BNuTau - NuTauQ * BQ)) / (sqrt(Ew*Ew - Sqq) * NuTauQ * BQ));
82 const double SinTt = sqrt(1. - CosTt*CosTt);
83 const double CscTt = 1. / SinTt;
85 const double CosTW = ((-(Mt2 * NuTauNuBarTau) + TauNuBarTau * TauNuTau) / (TauNuBarTau * TauNuTau));
86 const double SinTW = sqrt(1. - CosTW*CosTW);
87 const double CscTW = 1. / SinTW;
88 const double CosTWHalf = pow((1. + CosTW) / 2., 0.5);
89 const double SinTWHalf = pow((1. - CosTW) / 2., 0.5);
90 const double TanTWHalf = SinTW / (CosTW + 1.);
92 const double CosPtPW = (sqSqq * CscTt * CscTW) / (Mb * Mt * Pw * TauNuBarTau * TauNuTau) *
93 (TauNuTau * (Mt2 * BNuBarTau - BTau * TauNuBarTau) -
94 CosTW * TauNuBarTau * (Mt2 * BNuTau - BTau * TauNuTau));
95 const double SinPtPW = -((sqrt(Sqq) * CscTt * epsBDNuTauNuBarTau * TanTWHalf) / (Mb * Mt * Pw * NuTauNuBarTau));
96 const complex<double> ExpIPtPW = CosPtPW + 1i * SinPtPW;
99 const double TwoSqTwoGfSq = 2 *
sqrt2 *
FPion *
GFermi * (sqrt(Mt2 - Mp2)) * Mt;
106 t.element({0, 0}) = CosTWHalf;
107 t.element({1, 1}) = SinTWHalf;
108 t.element({1, 0}) = (ExpIPtPW)*t.element({0, 0});
109 t.element({0, 1}) = t.element({1, 1}) / (ExpIPtPW);
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
static constexpr double GFermi
Tensor indices label definitions.
static constexpr double FPion
static constexpr double sqrt2
double mass() const
returns the invariant mass if the invariant mass squared is negative returns
std::vector< Particle > ParticleList
Sparse tensor data container.
double epsilon(const FourMomentum &a, const FourMomentum &b, const FourMomentum &c, const FourMomentum &d)
contracts four 4-momenta with an 4D epsilon tensor.
Multidimensional tensor class with complex numbers as elements.
const FourMomentum & momentum() const
Various numerical constants.
Hammer particle data class.