StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
SusyWidthFunctions.cc
1 // SusyWidthFunctions.cc is a part of the PYTHIA event generator.
2 // Copyright (C) 2018 Torbjorn Sjostrand
3 // Authors: N. Desai, P. Skands
4 // PYTHIA is licenced under the GNU GPL v2 or later, see COPYING for details.
5 // Please respect the MCnet Guidelines, see GUIDELINES for details.
6 
7 // Function definitions (not found in the header) for the
8 // SUSY Resonance three-body decay width classes.
9 
10 #include "Pythia8/SusyResonanceWidths.h"
11 #include "Pythia8/SusyWidthFunctions.h"
12 #include "Pythia8/SusyCouplings.h"
13 #include "Pythia8/PythiaComplex.h"
14 
15 namespace Pythia8 {
16 
17 //==========================================================================
18 
19 // The WidthFunctions class.
20 // Functions to be integrated for calculating the 3-body decay widths.
21 
22 //--------------------------------------------------------------------------
23 
24 void WidthFunction::setPointers( ParticleData* particleDataPtrIn,
25  CoupSUSY* coupSUSYPtrIn, Info* infoPtrIn) {
26 
27  particleDataPtr = particleDataPtrIn;
28  coupSUSYPtr = coupSUSYPtrIn;
29  infoPtr = infoPtrIn;
30 }
31 
32 //--------------------------------------------------------------------------
33 
34 double WidthFunction::f(double) {
35 
36  infoPtr->errorMsg("Error in WidthFunction::function: "
37  "using dummy width function");
38  return 0.;
39 }
40 
41 //==========================================================================
42 
43 // The StauWidths class.
44 // Width functions for 3-body stau decays.
45 
46 //--------------------------------------------------------------------------
47 
48 double StauWidths::getWidth(int idResIn, int idIn){
49 
50  setChannel(idResIn, idIn);
51 
52  // Calculate integration limits and return integrated width.
53  if (idResIn % 2 == 0) return 0.0;
54  double width;
55  if (integrateGauss(width, 0.0, 1.0, 1.0e-3)) return width;
56  else return 0.0;
57 
58 }
59 
60 //--------------------------------------------------------------------------
61 
62 void StauWidths::setChannel(int idResIn, int idIn) {
63 
64  // Common masses.
65  idRes = abs(idResIn);
66  idIn = abs(idIn);
67  mRes = particleDataPtr->m0(idRes);
68  m1 = particleDataPtr->m0(1000022);
69  m2 = particleDataPtr->m0(idIn);
70 
71  mInt = particleDataPtr->m0(15);
72  gammaInt = particleDataPtr->mWidth(15);
73 
74  // Couplings etc.
75  f0 = 92.4; //MeV
76  gf = coupSUSYPtr->GF();
77  delm = mRes - m1;
78  cons = pow2(f0)*pow2(gf)*(pow2(delm) - pow2(m2))
79  * coupSUSYPtr->V2CKMid(1,1) / (128.0 * pow(mRes*M_PI,3));
80 
81  if (idIn == 900111) wparam = 1.16;
82  else if (idIn == 113) wparam = 0.808;
83  else wparam = 1.0;
84 
85  double g = coupSUSYPtr->alphaEM(mRes * mRes);
86  int ksusy = 1000000;
87  int isl = (abs(idRes)/ksusy == 2) ? (abs(idRes)%10+1)/2 + 3
88  : (abs(idRes)%10+1)/2;
89 
90  gL = g * coupSUSYPtr->LsllX[isl][3][1] / ( sqrt(2.0) * coupSUSYPtr->cosb);
91  gR = g * coupSUSYPtr->RsllX[isl][3][1] / ( sqrt(2.0) * coupSUSYPtr->cosb);
92 
93  // Set function switch and internal propagators depending on decay product.
94  if (idIn == 111) fnSwitch = 1;
95  else if (idIn == 900111 || idIn == 113) fnSwitch = 2;
96  else if (idIn == 14 || idIn == 12) {
97  m2 = particleDataPtr->m0(idIn-1);
98  fnSwitch = 3;
99  }
100  else {
101  stringstream mess;
102  mess << " unknown decay channel idIn = " << idIn;
103  infoPtr->errorMsg("Warning in StauWidths::setChannel:", mess.str() );
104  }
105 
106  return;
107 }
108 
109 //------------------------------------------------------------------------
110 
111 double StauWidths::f(double x){
112 
113  // Decay width functions documented in arXiv:1212.2886 Citron et. al.
114  double value = 0.0;
115  double qf2 = pow2(delm) - (pow2(delm) - pow2(m2)) * x;
116  double fac = 1.0 / pow3(mRes);
117  double term3 = (norm(gL) * qf2 + norm(gR) * mInt * mInt)
118  * (delm * delm + 2.0 * m1 * delm - qf2);
119  double term4 = -2.0 * real(gL * conj(gR)) * m2 * mInt * qf2;
120 
121  // ~tau -> pi0 nu_tau ~chi0.
122  if (fnSwitch == 1 ) {
123  fac *= pow2(delm) - pow2(m2);
124  double term1 = sqrt((pow2(delm) - qf2) * (pow2(delm + 2 * m1) - qf2));
125  double term2 = pow2(qf2 - pow2(m2)) / qf2 / (pow2(qf2 - pow2(mInt))
126  + pow2(mInt*gammaInt));
127  value = fac * (term1 * term2 * (term3 + term4));
128  }
129 
130  else if (fnSwitch == 2 ) {
131  double term1 = sqrt((pow2(delm) - qf2) * (pow2(delm + 2 * m1) - qf2));
132  double term2 = pow2(qf2 - pow2(m2)) * (qf2 + pow2(m2))
133  / (qf2 * qf2 * (pow2(qf2 - pow2(mInt)) + pow2(mInt*gammaInt)));
134  value = fac * (term1 * term2 * (term3 + term4));
135  }
136 
137  else if (fnSwitch == 3 ) {
138  double qf4 = qf2 * qf2;
139  double m24 = pow2(m2*m2);
140  double term1 = sqrt((pow2(delm) - qf2) * (pow2(delm + 2 * m1) - qf2));
141  double term2a = 1.0 / (pow2(qf2 - pow2(mInt)) + pow2(mInt*gammaInt)) / qf4;
142  double term2b = 12 * m24 * qf4 * log(qf2/pow2(m2))
143  + (qf4 - m24) * (qf4 - 8 * m2 * m2 * qf2 + m24);
144  value = fac * (term1 * term2a * term2b * (term3 + term4));
145  }
146 
147  else {
148  stringstream mess;
149  mess << " unknown decay channel fnSwitch = " << fnSwitch;
150  infoPtr->errorMsg("Warning in StauWidths::function:", mess.str() );
151  }
152 
153  return value;
154 
155 }
156 
157 //==========================================================================
158 
159 } //end namespace Pythia8