All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HNLDecayDalitz.cpp
Go to the documentation of this file.
1 #include "HNLDecayDalitz.h"
3 
4 
5 // STUB
6 double evgen::ldm::HNLNuDiLepLNVDalitz(TLorentzVector K, TLorentzVector LA, TLorentzVector LB, TLorentzVector LBD, TLorentzVector NU) {
7 
8  auto pcross = [K, LA](TLorentzVector F) {
9  return 2. * LA.Dot(K) * F.Dot(K) - LA.Dot(F) * K.Dot(K);
10  };
11 
12  double A1 = 0.;
13  double A2 = 0.;
14  double A3 = 0.;
15 
16  return A1*2*NU.Dot(LB)*pcross(LBD) + A2*2*NU.Dot(LBD)*pcross(LB) + A3*LB.Dot(LB)*pcross(NU);
17 }
18 
19 // Implementation of Dalitz weighting taken from:
20 // https://arxiv.org/abs/1912.05520
21 // (with math checked and worked out in XXXXX)
22 
23 double evgen::ldm::HNLLepPiLNCDalitz(TLorentzVector K, TLorentzVector LA, TLorentzVector N, TLorentzVector PI, TLorentzVector LB) {
24  return 8 * K.Dot(LA) * PI.Dot(LB) * K.Dot(N) * PI.Dot(N) \
25  -4 * K.Dot(LA) * PI.Dot(LB) * K.Dot(PI) * N.Dot(N) \
26  -4 * K.Dot(K) * PI.Dot(LB) * LA.Dot(N) * PI.Dot(N) \
27  +2 * K.Dot(K) * PI.Dot(LB) * LA.Dot(PI) * N.Dot(N) \
28  -4 * K.Dot(LA) * PI.Dot(PI) * K.Dot(N) * LB.Dot(N) \
29  +2 * K.Dot(LA) * PI.Dot(PI) * K.Dot(LB) * N.Dot(N) \
30  +2 * K.Dot(K) * PI.Dot(PI) * LA.Dot(N) * LB.Dot(N) \
31  -1 * K.Dot(K) * PI.Dot(PI) * LA.Dot(LB) * N.Dot(N);
32 }
33 
34 double evgen::ldm::HNLLepPiLNVDalitz(TLorentzVector K, TLorentzVector LA, TLorentzVector N, TLorentzVector PI, TLorentzVector LB) {
35  return N.Dot(N) * (
36  4 * K.Dot(LA) * K.Dot(PI) * LB.Dot(PI) \
37  -2 * K.Dot(K) * LA.Dot(PI) * LB.Dot(PI) \
38  -2 * K.Dot(LA) * K.Dot(LB) * PI.Dot(PI) \
39  +1 * K.Dot(K) * LA.Dot(LB) * PI.Dot(PI)
40  );
41 }
42 
43 // Work in the X frame
44 // For the process: K -> lA + (N -> pi + lB)
45 // >
46 // lB -
47 // -
48 // lA N - K
49 // <-----o<-----
50 // -
51 // - pi
52 // -
53 // <
54 //
55 double evgen::ldm::HNLLepPiDalitzMax(double mK, double mA, double mN, double mP, double mB) {
56  double pNA = evgen::ldm::twobody_momentum(mK, mA, mN);
57  double pPB = evgen::ldm::twobody_momentum(mN, mP, mB);
58 
59  TLorentzVector K(TVector3(0, 0, pNA * mK / mN), mK * sqrt(1 + pNA * pNA / (mN*mN)));
60  TLorentzVector LA(TVector3(0, 0, pNA * mK / mN), sqrt(mA*mA + pNA * pNA * mK * mK / (mN * mN)));
61  TLorentzVector N(TVector3(0, 0, 0), mN);
62  // In the LNC case, if mN > mA, then the direction of lB wants to be aligned with lA (+z)
63  // (because of angular momentum conservation)
64  // Flipping the mass ordering or LNC/LNV flips the sign
65  double sign = mN > mA ? 1 : -1;
66  TLorentzVector LB(TVector3(0, 0, sign * pPB), sqrt(mB * mB + pPB * pPB));
67  TLorentzVector PI(TVector3(0, 0, -sign * pPB), sqrt(mP * mP + pPB * pPB));
68 
69  return HNLLepPiLNCDalitz(K, LA, N, PI, LB);
70 }
double twobody_momentum(double parent_mass, double childA_mass, double childB_mass)
Definition: Constants.cpp:73
double HNLNuDiLepLNVDalitz(TLorentzVector K, TLorentzVector LA, TLorentzVector LB, TLorentzVector LBD, TLorentzVector NU)
constexpr double PI
double HNLLepPiLNVDalitz(TLorentzVector K, TLorentzVector LA, TLorentzVector N, TLorentzVector PI, TLorentzVector LB)
int sign(double val)
Definition: UtilFunc.cxx:104
process_name largeant stream1 can override from command line with o or output physics producers generator N
double HNLLepPiDalitzMax(double mK, double mA, double mN, double mP, double mB)
double HNLLepPiLNCDalitz(TLorentzVector K, TLorentzVector LA, TLorentzVector N, TLorentzVector PI, TLorentzVector LB)