21 using namespace complex_literals;
25 namespace MD = MultiDimensional;
27 AmplTau3PiNu::AmplTau3PiNu() {
29 vector<IndexType> dims{{2, 2, 3}};
30 string name{
"AmplTau3PiNu"};
32 addProcessSignature(PID::ANTITAU, {PID::PIMINUS, PID::PIPLUS, PID::PIPLUS, PID::NU_TAUBAR});
43 void AmplTau3PiNu::defineSettings() {
55 if(daughters[0].pdgId() == daughters[1].pdgId()){
56 pPiPlus1 = daughters[0].momentum();
57 pPiPlus2 = daughters[1].momentum();
58 pPiMinus = daughters[2].momentum();
59 }
else if (daughters[1].pdgId() == daughters[2].pdgId()){
60 pPiPlus1 = daughters[1].momentum();
61 pPiPlus2 = daughters[2].momentum();
62 pPiMinus = daughters[0].momentum();
69 if (references.size() >= 2) {
70 pDmes = references[0].momentum();
71 kNuTau = references[1].momentum();
81 const double Mb = pBmes.
mass();
82 const double Mb2 = Mb*Mb;
83 const double Md = pDmes.mass();
84 const double Md2 = Md*Md;
85 const double Mt = pTau.mass();
86 const double Mt2 = Mt*Mt;
87 const double t1 = p1.
mass2();
88 const double t2 = p2.
mass2();
89 const double Sqp = p.
mass2();
90 const double sqSqp = sqrt(Sqp);
91 const double E1 = (p * p1) / sqSqp;
92 const double E12 = E1*E1;
93 const double sqE12t1 = sqrt(E12 - t1);
94 const double E2 = (p * p2) / sqSqp;
95 const double E22 = E2*E2;
96 const double sqE22t2 = sqrt(E22 - t2);
98 const double Sqq = Mb2 + Md2 - 2. * (pBmes * pDmes);
99 const double sqSqq = sqrt(Sqq);
100 const double Ew = (Mb2 - Md2 + Sqq) / (2 * Mb);
101 const double Pw = sqrt(Ew*Ew - Sqq);
102 const double NuTauNuBarTau = (kNuTau * kNuBarTau);
103 const double TauNuBarTau = (pTau * kNuBarTau);
104 const double TauNuTau = (pTau * kNuTau);
105 const double p1Tau = (p1 * pTau);
106 const double p2Tau = (p2 * pTau);
107 const double p1NuTau = (p1 * kNuTau);
108 const double p2NuTau = (p2 * kNuTau);
109 const double p1NuBarTau = (p1 * kNuBarTau);
110 const double p2NuBarTau = (p2 * kNuBarTau);
111 const double p1p = (p1 * p);
112 const double p2p = (p2 * p);
113 const double BNuTau = (pBmes * kNuTau);
114 const double BNuBarTau = (pBmes * kNuBarTau);
115 const double NuTauQ = (pBmes * kNuTau) - (pDmes * kNuTau);
116 const double BQ = Mb2 - (pBmes * pDmes);
117 const double BTau = (pBmes * pTau);
118 const double epsBDNuTauNuBarTau =
epsilon(pBmes, pDmes, kNuTau, kNuBarTau);
121 const double CosTt = -((Ew * (Sqq * BNuTau - NuTauQ * BQ)) / (sqrt(Ew*Ew - Sqq) * NuTauQ * BQ));
122 const double SinTt = sqrt(1. - CosTt*CosTt);
123 const double CscTt = 1. / SinTt;
125 const double CosTW = ((-(Mt2 * NuTauNuBarTau) + TauNuBarTau * TauNuTau) / (TauNuBarTau * TauNuTau));
126 const double SinTW = sqrt(1. - CosTW*CosTW);
127 const double CscTW = 1. / SinTW;
128 const double CosTWHalf = pow((1. + CosTW) / 2., 0.5);
129 const double SinTWHalf = pow((1. - CosTW) / 2., 0.5);
130 const double TanTWHalf = SinTW / (CosTW + 1.);
132 const double CosT1 = (Sqp * (p1NuBarTau)-p1p * TauNuBarTau) / (sqSqp * sqE12t1 * TauNuBarTau);
133 const double SinT1 = sqrt(1. - CosT1*CosT1);
134 const double CscT1 = 1. / SinT1;
136 const double CosT2 = (Sqp * (p2NuBarTau)-p2p * TauNuBarTau) / (sqSqp * sqE22t2 * TauNuBarTau);
137 const double SinT2 = sqrt(1. - CosT2*CosT2);
138 const double CscT2 = 1. / SinT2;
140 const double CosP1PW = (CscT1 * CscTW *
141 (-(Mt2 * p1NuTau) + sqSqp * sqE12t1 * CosT1 * CosTW * TauNuTau +
142 CosTW * p1NuBarTau * TauNuTau + p1Tau * TauNuTau)) /
143 (Mt * sqE12t1 * TauNuTau);
144 const double SinP1PW = -(Mt * CscT1 * CscTW *
epsilon(p1, pTau, kNuTau, p)) / (sqE12t1 * TauNuBarTau * TauNuTau);
145 const complex<double> ExpIP1PW = CosP1PW + 1i * SinP1PW;
147 const double CosP2PW = (CscT2 * CscTW *
148 (-(Mt2 * p2NuTau) + sqSqp * sqE22t2 * CosT2 * CosTW * TauNuTau +
149 CosTW * p2NuBarTau * TauNuTau + p2Tau * TauNuTau)) /
150 (Mt * sqE22t2 * TauNuTau);
151 const double SinP2PW = -(Mt * CscT2 * CscTW *
epsilon(p2, pTau, kNuTau, p)) / (sqE22t2 * TauNuBarTau * TauNuTau);
152 const complex<double> ExpIP2PW = CosP2PW + 1i * SinP2PW;
154 const double CosPtPW = (sqSqq * CscTt * CscTW) / (Mb * Mt * Pw * TauNuBarTau * TauNuTau) *
155 (TauNuTau * (Mt2 * BNuBarTau - BTau * TauNuBarTau) -
156 CosTW * TauNuBarTau * (Mt2 * BNuTau - BTau * TauNuTau));
157 const double SinPtPW = -((sqSqq * CscTt * epsBDNuTauNuBarTau * TanTWHalf) / (Mb * Mt * Pw * NuTauNuBarTau));
158 const complex<double> ExpIPtPW = CosPtPW + 1i * SinPtPW;
160 const double SqTwoGfSq =
sqrt2 *
GFermi * (sqrt(Mt2 - Sqp));
172 t.element({0,0,0}) = sqE12t1/sqSqp*(Mt*CosT1*CosTWHalf - ExpIP1PW*sqSqp*SinT1*SinTWHalf) ;
173 t.element({0,0,1}) = sqE22t2/sqSqp*(Mt*CosT2*CosTWHalf - ExpIP2PW*sqSqp*SinT2*SinTWHalf) ;
174 t.element({0,0,2}) = Mt*CosTWHalf ;
175 t.element({0,1,0}) = (sqE12t1/sqSqp*(ExpIP1PW*sqSqp*CosTWHalf*SinT1 + Mt*CosT1*SinTWHalf))/ExpIPtPW ;
176 t.element({0,1,1}) = (sqE22t2/sqSqp*(ExpIP2PW*sqSqp*CosTWHalf*SinT2 + Mt*CosT2*SinTWHalf))/ExpIPtPW ;
177 t.element({0,1,2}) = (Mt*SinTWHalf)/ExpIPtPW ;
178 t.element({1,0,0}) = ExpIPtPW*sqE12t1/sqSqp*(Mt*CosT1*CosTWHalf - ExpIP1PW*sqSqp*SinT1*SinTWHalf) ;
179 t.element({1,0,1}) = ExpIPtPW*sqE22t2/sqSqp*(Mt*CosT2*CosTWHalf - ExpIP2PW*sqSqp*SinT2*SinTWHalf) ;
180 t.element({1,0,2}) = ExpIPtPW*Mt*CosTWHalf ;
181 t.element({1,1,0}) = sqE12t1/sqSqp*(ExpIP1PW*sqSqp*CosTWHalf*SinT1 + Mt*CosT1*SinTWHalf) ;
182 t.element({1,1,1}) = sqE22t2/sqSqp*(ExpIP2PW*sqSqp*CosTWHalf*SinT2 + Mt*CosT2*SinTWHalf) ;
183 t.element({1,1,2}) = Mt*SinTWHalf ;
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
static constexpr double GFermi
Tensor indices label definitions.
static constexpr double sqrt2
double mass2() const
returns the squared invariant mass
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.