Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AmplTau3PiNu.cc
Go to the documentation of this file.
1 ///
2 /// @file AmplTau3PiNu.cc
3 /// @brief \f$ \tau-> \pi\pi\pi\nu \f$ amplitude
4 ///
5 
6 //**** This file is a part of the HAMMER library
7 //**** Copyright (C) 2016 - 2020 The HAMMER Collaboration
8 //**** HAMMER is licensed under version 3 of the GPL; see COPYING for details
9 //**** Please note the MCnet academic guidelines; see GUIDELINES for details
10 
11 // -*- C++ -*-
13 #include "Hammer/IndexLabels.hh"
14 #include "Hammer/Math/Constants.hh"
15 #include "Hammer/Particle.hh"
16 #include "Hammer/Tools/Pdg.hh"
18 #include <cmath>
19 
20 using namespace std;
21 using namespace complex_literals;
22 
23 namespace Hammer {
24 
25  namespace MD = MultiDimensional;
26 
27  AmplTau3PiNu::AmplTau3PiNu() {
28  // Create tensor rank and dimensions
29  vector<IndexType> dims{{2, 2, 3}};
30  string name{"AmplTau3PiNu"};
31  //Ordering is piminus then piplus as anti-tau parent has pdg < 0
32  addProcessSignature(PID::ANTITAU, {PID::PIMINUS, PID::PIPLUS, PID::PIPLUS, PID::NU_TAUBAR});
33  addTensor(Tensor{name, MD::makeEmptySparse(dims, {SPIN_NUTAU_REF, SPIN_TAUP, FF_TAU3PI})});
34 // ///@todo check the amplitude is correct with this ordering below
35 // The 2 pi^0 amplitude has different symmetry factors
36 // addProcessSignature(PID::ANTITAU, {PID::PIPLUS, PID::PI0, PID::PI0, PID::NU_TAUBAR});
37 // addTensor(Tensor{name, MD::makeEmptySparse(dims, {SPIN_NUTAU_REF, SPIN_TAUP, FF_TAU3PI})});
38 
39  setSignatureIndex();
40  _multiplicity = 2ul;
41  }
42 
43  void AmplTau3PiNu::defineSettings() {
44  }
45 
46  void AmplTau3PiNu::eval(const Particle& parent, const ParticleList& daughters,
47  const ParticleList& references) {
48  // Momenta
49  const FourMomentum& pTau = parent.momentum();
50  const FourMomentum& kNuBarTau = daughters[3].momentum();
51 
52  FourMomentum pPiPlus1;
53  FourMomentum pPiPlus2;
54  FourMomentum pPiMinus;
55  if(daughters[0].pdgId() == daughters[1].pdgId()){ // Ordered 211 211 -211
56  pPiPlus1 = daughters[0].momentum();
57  pPiPlus2 = daughters[1].momentum();
58  pPiMinus = daughters[2].momentum();
59  } else if (daughters[1].pdgId() == daughters[2].pdgId()){ // 211 -211 -211
60  pPiPlus1 = daughters[1].momentum();
61  pPiPlus2 = daughters[2].momentum();
62  pPiMinus = daughters[0].momentum();
63  }
64 
65 
66  // Siblings for parent tau case
67  FourMomentum pDmes{1.,0.,0.,0.};
68  FourMomentum kNuTau{1.,0.,0.,1.};
69  if (references.size() >= 2) {
70  pDmes = references[0].momentum();
71  kNuTau = references[1].momentum();
72  }
73  const FourMomentum& pBmes = pDmes + kNuTau + pTau;
74 
75  const FourMomentum p = pTau - kNuBarTau;
76  // Pion subtracted momenta
77  const FourMomentum p1 = pPiPlus1 - pPiMinus;
78  const FourMomentum p2 = pPiPlus2 - pPiMinus;
79 
80  // kinematic objects
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);
97 
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);
119 
120  // Helicity Angles
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;
124 
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.);
131 
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;
135 
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;
139 
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;
146 
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;
153 
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;
159 
160  const double SqTwoGfSq = sqrt2 * GFermi * (sqrt(Mt2 - Sqp));
161 
162 // // Structure Functions
163 // double F1 = 1.;
164 // double F2 = 1.;
165 // double F4 = 1.;
166 
167  // initialize tensor elements to zero
168  Tensor& t = getTensor();
169  t.clearData();
170 
171  // set tensor elements
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 ;
184 
185 // t.element({0, 0}) = F4 * Mt * CosTWHalf +
186 // F1 * sqE12t1 / sqSqp * (Mt * CosT1 * CosTWHalf - ExpIP1PW * sqSqp * SinT1 * SinTWHalf) +
187 // F2 * sqE22t2 / sqSqp * (Mt * CosT2 * CosTWHalf - ExpIP2PW * sqSqp * SinT2 * SinTWHalf);
188 // t.element({0, 1}) =
189 // (F4 * Mt * SinTWHalf) / ExpIPtPW +
190 // (F1 * sqE12t1 / sqSqp * (ExpIP1PW * sqSqp * CosTWHalf * SinT1 + Mt * CosT1 * SinTWHalf)) / ExpIPtPW +
191 // (F2 * sqE22t2 / sqSqp * (ExpIP2PW * sqSqp * CosTWHalf * SinT2 + Mt * CosT2 * SinTWHalf)) / ExpIPtPW;
192 // t.element({1, 0}) =
193 // ExpIPtPW * F4 * Mt * CosTWHalf +
194 // ExpIPtPW * F1 * sqE12t1 / sqSqp * (Mt * CosT1 * CosTWHalf - ExpIP1PW * sqSqp * SinT1 * SinTWHalf) +
195 // ExpIPtPW * F2 * sqE22t2 / sqSqp * (Mt * CosT2 * CosTWHalf - ExpIP2PW * sqSqp * SinT2 * SinTWHalf);
196 // t.element({1, 1}) = F4 * Mt * SinTWHalf +
197 // F1 * sqE12t1 / sqSqp * (ExpIP1PW * sqSqp * CosTWHalf * SinT1 + Mt * CosT1 * SinTWHalf) +
198 // F2 * sqE22t2 / sqSqp * (ExpIP2PW * sqSqp * CosTWHalf * SinT2 + Mt * CosT2 * SinTWHalf);
199 
200  t *= SqTwoGfSq;
201  }
202 
203 } // namespace Hammer
amplitude
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
static constexpr double GFermi
Definition: Constants.hh:29
Tensor indices label definitions.
static constexpr double sqrt2
Definition: Constants.hh:26
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
Definition: Particle.fhh:20
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.
Particle class.
Definition: Particle.hh:30
Multidimensional tensor class with complex numbers as elements.
Definition: Tensor.hh:33
const FourMomentum & momentum() const
Definition: Particle.cc:56
Various numerical constants.
Hammer particle data class.
Hammer particle class.
4-momentum class
Definition: FourMomentum.hh:30