GENIEGenerator
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
HNLBRCalculator.h
Go to the documentation of this file.
1 //----------------------------------------------------------------------------
2 /*!
3 
4  An Algorithm that manages the calculations of production and decay
5  branching ratios for HNL.
6 
7 \class genie::hnl::BRCalculator
8 
9 \brief Manages HNL BR (prod and decay)
10 
11 \author John Plows <komninos-john.plows@physics.ox.ac.uk>
12 
13 \created December 3rd, 2021
14 
15 \cpright Copyright (c) 2003-2024, The GENIE Collaboration
16  For the full text of the license visit http://copyright.genie-mc.org
17 
18 */
19 //----------------------------------------------------------------------------
20 
21 #ifndef _HNL_BRFUNCTIONS_H_
22 #define _HNL_BRFUNCTIONS_H_
23 
24 // -- C++ includes
25 #include <iterator>
26 #include <sstream>
27 
28 // -- ROOT includes
29 #include "TF1.h"
30 #include "TF2.h"
31 #include "TMath.h"
32 
33 // -- GENIE includes
39 
41 
46 
47 namespace genie {
48 
49  class PDGLibrary;
50 
51  namespace hnl {
52 
54 
55  public:
56 
57  BRCalculator();
58  BRCalculator(string name);
59  BRCalculator(string name, string config);
60  ~BRCalculator();
61 
62  // -- implement the ChannelCalculatorI interface
63 
64  // overload the Algorithm::Configure() methods to load private data
65  // members from configuration options
66  void Configure(const Registry & config);
67  void Configure(string config);
68 
69  // return the kinematic scaling for a production channel
70  double KinematicScaling( genie::hnl::HNLProd_t hnlprod ) const;
71 
72  // return the integrated decay width for a decay channel
73  double DecayWidth( genie::hnl::HNLDecayMode_t hnldm ) const;
74 
75  private:
76 
77  void LoadConfig(void);
78 
79  //============================================
80  // total decay widths, parents to HNL
81  //============================================
82 
83  double KScale_Global( genie::hnl::HNLProd_t hnldm, const double M ) const;
84 
85  // P --> N + \ell_{\alpha}
86  double DWidth_PseudoscalarToLepton( const double mP, const double M, const double Ua42, const double ma ) const;
87  double KScale_PseudoscalarToLepton( const double mP, const double M, const double ma ) const; // uses formulae (2.12)-(2.14) from Shrock, Phys. Rev. D 24 (1981) 5
88 
89  // P --> N + \ell_{\alpha} + \pi^0
90  double DWidth_PseudoscalarToPiLepton( const double mP, const double M, const double Ua42, const double ma ) const;
91  double KScale_PseudoscalarToPiLepton( const double mP, const double M, const double ma ) const;
92 
93  // mu --> N + \nu_{\alpha} + e
94  double DWidth_MuonToNuAndElectron( const double M, const double Ue42, const double Umu42, const double Ut42 ) const;
95  double KScale_MuonToNuAndElectron( const double M ) const;
96 
97  //============================================
98  // total decay widths for HNL channels
99  //============================================
100 
101  double DWidth_Global( genie::hnl::HNLDecayMode_t hnldm, const double M ) const;
102 
103  // N --> pi0 + nu_\alpha
104  double DWidth_PiZeroAndNu( const double M, const double Ue42, const double Umu42, const double Ut42 ) const;
105 
106  // N --> pi^{\pm} + \ell_{\alpha}
107  double DWidth_PiAndLepton( const double M, const double Ua42, const double ma ) const;
108 
109  // invisible
110  double DWidth_Invisible( const double M, const double Ue42, const double Umu42, const double Ut42 ) const;
111 
112  // N --> nu + \ell_{\beta} \ell_{\beta} , \beta = e or mu
113  double DWidth_SameLepton( const double M, const double Ue42, const double Umu42, const double Ut42, const double mb, bool bIsMu ) const;
114 
115  // N --> nu + \ell_{\alpha}^{-} + \ell_{\beta}^{+}, \alpha != \beta, \alpha = e or mu
116  // alpha is the "correct" lepton number sign ( Q < 0 for N, Q > 0 for Nbar)
117  double DWidth_DiffLepton( const double M, const double Ua42, const double Ub42, const int IsMajorana ) const;
118 
119  // N --> pi^\pm + pi^0 + \ell_{\alpha}^\mp, \alpha = e or mu
120  double DWidth_PiPi0Ell( const double M, const double ml,
121  const double Ue42, const double Umu42, const double Ut42,
122  const bool isElectron = false ) const;
123 
124  // N --> pi^0 + pi^0 + \nu (all flavours summed up)
125  double DWidth_Pi0Pi0Nu( const double M,
126  const double Ue42, const double Umu42, const double Ut42 ) const;
127 
128  static double PiPi0EllForm( double *x, double *par );
129  static double Pi0Pi0NuForm( double *x, double *par );
130 
131  // kinematic functions
132  double GetFormfactorF1( double x ) const;
133  double GetFormfactorF2( double x ) const;
134 
135  bool fIsConfigLoaded = false;
136 
137  // physical constants
138  double wAng, s2w;
139  const double GF = genie::constants::kGF; // GeV^{-2}
140  const double GF2 = GF*GF;
141  const double pi = genie::constants::kPi;
142  double fpi, fpi2;
143  double BR_C1, BR_C2;
144 
145  double mPi0, mPi, mMu, mK, mK0, mE;
146  double fMass;
147  std::vector< double > fCouplings; double fUe42, fUm42, fUt42;
148  bool fMajorana;
149 
150  double Vud, Vud2;
151 
152  // PMNS matrix elements
153  double Ue1, Ue2, Ue3, Um1, Um2, Um3, Ut1, Ut2, Ut3;
154 
155  // scaling factors (3-body decays) from Ballett et al, JHEP 2020 (2019) 3 Fig. 2
156  // this figure was digitised so write as map between x = HNL mass [GeV] and y = scaling
157  // Digitisation done using WebPlotDigitizer (https://apps.automeris.io/wpd ; https://github.com/ankitrohatgi/WebPlotDigitizer)
158  std::map< double, double > kscale_K3mu, kscale_K3e, kscale_mu3e;
159 
160  }; // class BRCalculator
161 
162 } // namespace hnl
163 } // namespace genie
164 
165 #endif // #ifndef _HNL_BRFUNCTIONS_H_
enum genie::hnl::t_HNLProd HNLProd_t
double DWidth_PseudoscalarToPiLepton(const double mP, const double M, const double Ua42, const double ma) const
double DWidth_PseudoscalarToLepton(const double mP, const double M, const double Ua42, const double ma) const
double DWidth_Pi0Pi0Nu(const double M, const double Ue42, const double Umu42, const double Ut42) const
Manages HNL BR (prod and decay)
double DWidth_PiZeroAndNu(const double M, const double Ue42, const double Umu42, const double Ut42) const
std::map< double, double > kscale_K3e
double DWidth_PiPi0Ell(const double M, const double ml, const double Ue42, const double Umu42, const double Ut42, const bool isElectron=false) const
double KScale_Global(genie::hnl::HNLProd_t hnldm, const double M) const
double DWidth_PiAndLepton(const double M, const double Ua42, const double ma) const
double KinematicScaling(genie::hnl::HNLProd_t hnlprod) const
double KScale_PseudoscalarToPiLepton(const double mP, const double M, const double ma) const
static constexpr double mb
Definition: Units.h:79
enum genie::hnl::EHNLDecayMode HNLDecayMode_t
double DWidth_Global(genie::hnl::HNLDecayMode_t hnldm, const double M) const
double DWidth_Invisible(const double M, const double Ue42, const double Umu42, const double Ut42) const
double DWidth_SameLepton(const double M, const double Ue42, const double Umu42, const double Ut42, const double mb, bool bIsMu) const
double KScale_MuonToNuAndElectron(const double M) const
static double PiPi0EllForm(double *x, double *par)
double DecayWidth(genie::hnl::HNLDecayMode_t hnldm) const
double DWidth_DiffLepton(const double M, const double Ua42, const double Ub42, const int IsMajorana) const
A registry. Provides the container for algorithm configuration parameters.
Definition: Registry.h:65
std::map< double, double > kscale_K3mu
std::map< double, double > kscale_mu3e
double GetFormfactorF2(double x) const
Pure abstract base class. Defines the ChannelCalculatorI interface to be implemented by BRCalculator ...
void Configure(const Registry &config)
std::vector< double > fCouplings
double GetFormfactorF1(double x) const
double DWidth_MuonToNuAndElectron(const double M, const double Ue42, const double Umu42, const double Ut42) const
double KScale_PseudoscalarToLepton(const double mP, const double M, const double ma) const
static double Pi0Pi0NuForm(double *x, double *par)
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils...