21 using namespace complex_literals;
25 namespace MD = MultiDimensional;
27 AmplTauEllNuNu::AmplTauEllNuNu() {
29 vector<IndexType> dims{{2, 2}};
30 string name{
"AmplTauEllNuNu"};
31 addProcessSignature(PID::ANTITAU, {PID::NU_TAUBAR, PID::NU_MU, PID::ANTIMUON});
34 addProcessSignature(PID::ANTITAU, {PID::NU_TAUBAR, PID::NU_E, PID::POSITRON});
41 void AmplTauEllNuNu::defineSettings() {
55 if (references.size() >= 2) {
56 pDmes = references[0].momentum();
57 kNuTau = references[1].momentum();
62 const double Mb = pBmes.
mass();
63 const double Mb2 = Mb*Mb;
64 const double Md = pDmes.mass();
65 const double Md2 = Md*Md;
66 const double Mt = pTau.mass();
67 const double Mt2 = Mt*Mt;
68 const double Sqq = Mb2 + Md2 - 2. * (pBmes * pDmes);
69 const double sqSqq = sqrt(Sqq);
70 const double Ew = (Mb2 - Md2 + Sqq) / (2 * Mb);
71 const double Pw = sqrt(Ew*Ew - Sqq);
72 const double BNuTau = (pBmes * kNuTau);
73 const double NuTauQ = (pBmes * kNuTau) - (pDmes * kNuTau);
74 const double BQ = Mb2 - (pBmes * pDmes);
77 const double Sqp = 2. * (kMuon * kNuMuon);
78 const double sqSqp = sqrt(Sqp);
79 const double BTau = (pBmes * pTau);
80 const double MuonNuBarTau = (kMuon * kNuBarTau);
81 const double NuMuonNuBarTau = (kNuMuon * kNuBarTau);
82 const double NuMuonNuTau = (kNuMuon * kNuTau);
83 const double NuTauNuBarTau = (kNuTau * kNuBarTau);
84 const double TauNuBarTau = (pTau * kNuBarTau);
85 const double TauNuTau = (pTau * kNuTau);
86 const double BNuBarTau = (pBmes * kNuBarTau);
87 const double epsBDNuTauNuBarTau =
epsilon(pBmes, pDmes, kNuTau, kNuBarTau);
88 const double epsNuTauNuBarTauEllonNuMuon =
epsilon(kNuTau, kNuBarTau, kMuon, kNuMuon);
90 const double CosTt = -((Ew * (Sqq * BNuTau - NuTauQ * BQ)) / (sqrt(Ew*Ew - Sqq) * NuTauQ * BQ));
91 const double SinTt = sqrt(1. - CosTt*CosTt);
92 const double CscTt = 1. / SinTt;
94 const double CosTW = ((-(Mt2 * NuTauNuBarTau) + TauNuBarTau * TauNuTau) / (TauNuBarTau * TauNuTau));
95 const double SinTW = sqrt(1. - CosTW*CosTW);
96 const double CscTW = 1. / SinTW;
97 const double CosTWHalf = pow((1. + CosTW) / 2., 0.5);
98 const double SinTWHalf = pow((1. - CosTW) / 2., 0.5);
99 const double TanTWHalf = SinTW / (CosTW + 1.);
101 const double CosTm = (2. * (MuonNuBarTau - NuMuonNuBarTau)) / (Mt2 - Sqp);
102 const double SinTm = sqrt(1. - CosTm*CosTm);
103 const double CscTm = 1. / SinTm;
104 const double CosTmHalf = pow((1. + CosTm) / 2., 0.5);
107 const double CosPtPW = (sqSqq * CscTt * CscTW) / (Mb * Mt * Pw * TauNuBarTau * TauNuTau) *
108 (TauNuTau * (Mt2 * BNuBarTau - BTau * TauNuBarTau) -
109 CosTW * TauNuBarTau * (Mt2 * BNuTau - BTau * TauNuTau));
110 const double SinPtPW = -((sqSqq * CscTt * epsBDNuTauNuBarTau * TanTWHalf) / (Mb * Mt * Pw * NuTauNuBarTau));
111 const complex<double> ExpIPtPW = CosPtPW + 1i * SinPtPW;
113 const double CosPmPW = (CscTm * CscTW) / (Mt * sqSqp * TauNuTau) *
114 (Mt2 * (2 * NuMuonNuTau + (CosTm * CosTW - 1) * TauNuTau) +
115 (1 - CosTW) * (1 + CosTm) * TauNuTau * TauNuBarTau);
116 const double SinPmPW = ((2. * CscTm * epsNuTauNuBarTauEllonNuMuon * TanTWHalf) / (Mt * sqSqp * NuTauNuBarTau));
117 const complex<double> ExpIPmPW = CosPmPW + 1i * SinPmPW;
126 t.element({0, 0}) = -(Mt * CosTWHalf * SinTm + 2. * ExpIPmPW * sqSqp * pow(CosTmHalf, 2.) * SinTWHalf);
128 (2. * ExpIPmPW * sqSqp * pow(CosTmHalf, 2.) * CosTWHalf - Mt * SinTm * SinTWHalf) / (ExpIPtPW);
129 t.element({1, 0}) = (ExpIPtPW)*t.element({0, 0});
130 t.element({1, 1}) = (ExpIPtPW)*t.element({0, 1});
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
Tensor indices label definitions.
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.
static constexpr double TwoSqTwoGFermi