10 #include "Pythia8/SusyResonanceWidths.h"
11 #include "Pythia8/SusyWidthFunctions.h"
12 #include "Pythia8/SusyCouplings.h"
13 #include "Pythia8/PythiaComplex.h"
24 void WidthFunction::setPointers(Info* infoPtrIn) {
27 particleDataPtr = infoPtrIn->particleDataPtr;
28 coupSUSYPtr = infoPtrIn->coupSUSYPtr;
29 coupSMPtr = infoPtr->coupSMPtr;
39 double StauWidths::getWidth(
int idResIn,
int idIn){
41 setChannel(idResIn, idIn);
42 if (idResIn % 2 == 0)
return 0.0;
45 auto integrand = [&](
double x) {
return this->f(x); };
49 if (integrateGauss(width, integrand, 0.0, 1.0, 1.0e-3))
return width;
56 void StauWidths::setChannel(
int idResIn,
int idIn) {
61 mRes = particleDataPtr->m0(idRes);
62 m1 = particleDataPtr->m0(1000022);
63 m2 = particleDataPtr->m0(idIn);
65 mInt = particleDataPtr->m0(15);
66 gammaInt = particleDataPtr->mWidth(15);
72 cons = pow2(f0)*pow2(gf)*(pow2(delm) - pow2(m2))
73 * coupSMPtr->V2CKMid(1,1) / (128.0 * pow(mRes*M_PI,3));
75 if (idIn == 9000211) wparam = 1.16;
76 else if (idIn == 213) wparam = 0.808;
79 double g = coupSMPtr->alphaEM(mRes * mRes);
81 int isl = (abs(idRes)/ksusy == 2) ? (abs(idRes)%10+1)/2 + 3
82 : (abs(idRes)%10+1)/2;
84 gL = g * coupSUSYPtr->LsllX[isl][3][1] / ( sqrt(2.0) * coupSUSYPtr->cosb);
85 gR = g * coupSUSYPtr->RsllX[isl][3][1] / ( sqrt(2.0) * coupSUSYPtr->cosb);
88 if (idIn == 211) fnSwitch = 1;
89 else if (idIn == 9000211 || idIn == 213) fnSwitch = 2;
90 else if (idIn == 14 || idIn == 12) {
91 m2 = particleDataPtr->m0(idIn-1);
96 mess <<
" unknown decay channel idIn = " << idIn;
97 infoPtr->errorMsg(
"Warning in StauWidths::setChannel:", mess.str() );
105 double StauWidths::f(
double x){
109 double qf2 = pow2(delm) - (pow2(delm) - pow2(m2)) * x;
110 double fac = 1.0 / pow3(mRes);
111 double term3 = (norm(gL) * qf2 + norm(gR) * mInt * mInt)
112 * (delm * delm + 2.0 * m1 * delm - qf2);
113 double term4 = -2.0 * real(gL * conj(gR)) * m2 * mInt * qf2;
116 if (fnSwitch == 1 ) {
117 fac *= pow2(delm) - pow2(m2);
118 double term1 = sqrt((pow2(delm) - qf2) * (pow2(delm + 2 * m1) - qf2));
119 double term2 = pow2(qf2 - pow2(m2)) / qf2 / (pow2(qf2 - pow2(mInt))
120 + pow2(mInt*gammaInt));
121 value = fac * (term1 * term2 * (term3 + term4));
124 else if (fnSwitch == 2 ) {
125 double term1 = sqrt((pow2(delm) - qf2) * (pow2(delm + 2 * m1) - qf2));
126 double term2 = pow2(qf2 - pow2(m2)) * (qf2 + pow2(m2))
127 / (qf2 * qf2 * (pow2(qf2 - pow2(mInt)) + pow2(mInt*gammaInt)));
128 value = fac * (term1 * term2 * (term3 + term4));
131 else if (fnSwitch == 3 ) {
132 double qf4 = qf2 * qf2;
133 double m24 = pow2(m2*m2);
134 double term1 = sqrt((pow2(delm) - qf2) * (pow2(delm + 2 * m1) - qf2));
135 double term2a = 1.0 / (pow2(qf2 - pow2(mInt)) + pow2(mInt*gammaInt)) / qf4;
136 double term2b = 12 * m24 * qf4 * log(qf2/pow2(m2))
137 + (qf4 - m24) * (qf4 - 8 * m2 * m2 * qf2 + m24);
138 value = fac * (term1 * term2a * term2b * (term3 + term4));
143 mess <<
" unknown decay channel fnSwitch = " << fnSwitch;
144 infoPtr->errorMsg(
"Warning in StauWidths::function:", mess.str() );