10 #include "Pythia8/SusyResonanceWidths.h"
11 #include "Pythia8/SusyWidthFunctions.h"
12 #include "Pythia8/SusyCouplings.h"
13 #include "Pythia8/PythiaComplex.h"
24 void WidthFunction::setPointers( ParticleData* particleDataPtrIn,
25 CoupSUSY* coupSUSYPtrIn, Info* infoPtrIn) {
27 particleDataPtr = particleDataPtrIn;
28 coupSUSYPtr = coupSUSYPtrIn;
34 double WidthFunction::f(
double) {
36 infoPtr->errorMsg(
"Error in WidthFunction::function: "
37 "using dummy width function");
48 double StauWidths::getWidth(
int idResIn,
int idIn){
50 setChannel(idResIn, idIn);
53 if (idResIn % 2 == 0)
return 0.0;
55 if (integrateGauss(width, 0.0, 1.0, 1.0e-3))
return width;
62 void StauWidths::setChannel(
int idResIn,
int idIn) {
67 mRes = particleDataPtr->m0(idRes);
68 m1 = particleDataPtr->m0(1000022);
69 m2 = particleDataPtr->m0(idIn);
71 mInt = particleDataPtr->m0(15);
72 gammaInt = particleDataPtr->mWidth(15);
76 gf = coupSUSYPtr->GF();
78 cons = pow2(f0)*pow2(gf)*(pow2(delm) - pow2(m2))
79 * coupSUSYPtr->V2CKMid(1,1) / (128.0 * pow(mRes*M_PI,3));
81 if (idIn == 900111) wparam = 1.16;
82 else if (idIn == 113) wparam = 0.808;
85 double g = coupSUSYPtr->alphaEM(mRes * mRes);
87 int isl = (abs(idRes)/ksusy == 2) ? (abs(idRes)%10+1)/2 + 3
88 : (abs(idRes)%10+1)/2;
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);
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);
102 mess <<
" unknown decay channel idIn = " << idIn;
103 infoPtr->errorMsg(
"Warning in StauWidths::setChannel:", mess.str() );
111 double StauWidths::f(
double x){
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;
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));
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));
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));
149 mess <<
" unknown decay channel fnSwitch = " << fnSwitch;
150 infoPtr->errorMsg(
"Warning in StauWidths::function:", mess.str() );