10 #include "Pythia8/ResonanceWidthsDM.h"
11 #include "Pythia8/PythiaComplex.h"
24 void ResonanceS::initConstants() {
27 double vq = settingsPtr->parm(
"Sdm:vf");
28 double vX = settingsPtr->parm(
"Sdm:vX");
29 double aq = settingsPtr->parm(
"Sdm:af");
30 double aX = settingsPtr->parm(
"Sdm:aX");
32 gq = abs(aq) > 0 ? aq : vq;
33 gX = abs(aX) > 0 ? aX : vX;
35 if (abs(aX) > 0) pScalar =
true;
44 void ResonanceS::calcPreFac(
bool) {
47 preFac = 1.0 / (12.0 * M_PI * mRes);
48 alpS = coupSMPtr->alphaS(mHat * mHat);
56 void ResonanceS::calcWidth(
bool ) {
62 double mRat2 = pow2(mf1 / mRes);
63 double kinfac = (1 - 4 * mRat2) * (1. + 2 * mRat2);
65 if (id1Abs < 7) widNow = 3. * pow2(gq * mf1) * preFac * kinfac;
66 if (id1Abs == 21) widNow = pow2(gq) * preFac * pow2(alpS / M_PI) * eta2gg();
67 if (id1Abs == 52) widNow = pow2(gX * mf1) * preFac * kinfac;
75 double ResonanceS::eta2gg() {
78 complex eta = complex(0., 0.);
79 double mLoop, epsilon, root, rootLog;
83 for (
int idNow = 3; idNow < 7; ++idNow) {
84 mLoop = particleDataPtr->m0(idNow);
85 epsilon = pow2(2. * mLoop / mHat);
89 root = sqrt(1. - epsilon);
90 rootLog = (epsilon < 1e-4) ? log(4. / epsilon - 2.)
91 : log( (1. + root) / (1. - root) );
92 phi = complex( -0.25 * (pow2(rootLog) - pow2(M_PI)),
93 0.5 * M_PI * rootLog );
95 else phi = complex( pow2( asin(1. / sqrt(epsilon)) ), 0.);
98 if (!pScalar) etaNow = -0.5 * epsilon
99 * (complex(1., 0.) + (1. - epsilon) * phi);
100 else etaNow = -0.5 * epsilon * phi;
106 return (pow2(eta.real()) + pow2(eta.imag()));
119 void ResonanceZp::initConstants() {
122 kinMix = settingsPtr->flag(
"Zp:kineticMixing");
123 gZp = settingsPtr->parm(
"Zp:gZp");
124 eps = settingsPtr->parm(
"Zp:epsilon");
125 vX = settingsPtr->parm(
"Zp:vX");
126 aX = settingsPtr->parm(
"Zp:aX");
130 vu = eps * (2./3. + coupSMPtr->vf(2));
131 au = eps * coupSMPtr->af(2);
132 vd = eps * (-1./3. + coupSMPtr->vf(1));
133 ad = eps * coupSMPtr->af(1);
134 vl = eps * (-1. + coupSMPtr->vf(11));
135 al = eps * coupSMPtr->af(11);
136 vv = eps * coupSMPtr->vf(12);
137 av = eps * coupSMPtr->af(12);
141 vu = settingsPtr->parm(
"Zp:vu");
142 vd = settingsPtr->parm(
"Zp:vd");
143 vl = settingsPtr->parm(
"Zp:vl");
144 vv = settingsPtr->parm(
"Zp:vv");
145 au = settingsPtr->parm(
"Zp:au");
146 ad = settingsPtr->parm(
"Zp:ad");
147 al = settingsPtr->parm(
"Zp:al");
148 av = settingsPtr->parm(
"Zp:av");
157 void ResonanceZp::calcPreFac(
bool) {
160 preFac = mRes / 12.0 / M_PI;
168 void ResonanceZp::calcWidth(
bool) {
171 if (ps == 0. || id1 * id2 > 0)
return;
174 double kinFacA = pow3(ps);
175 double kinFacV = ps * (1. + 2. * mr1);
179 if (id1Abs%2 == 0) fac = vu * vu * kinFacV + au * au * kinFacA;
180 else fac = vd * vd * kinFacV + ad * ad * kinFacA;
182 }
else if (id1Abs > 10 && id1Abs < 17) {
183 if (id1Abs%2 == 1) fac = vl * vl * kinFacV + al * al * kinFacA;
184 else fac = vv * vv * kinFacV + av * av * kinFacA;
185 }
else if (id1Abs == 52) fac = vX * vX * kinFacV + aX * aX * kinFacA;
188 double coup = pow2(gZp);
189 if (kinMix && id1Abs != 52)
190 coup = coupSMPtr->alphaEM(mRes * mRes) * 4.0 * M_PI;
191 widNow = coup * fac * preFac;
204 void ResonanceSl::initConstants() {
208 yuk[1] = settingsPtr->parm(
"DM:yuk1");
209 yuk[2] = settingsPtr->parm(
"DM:yuk2");
210 yuk[3] = settingsPtr->parm(
"DM:yuk3");
218 void ResonanceSl::calcPreFac(
bool) {
221 preFac = 1. / (mRes * 16.0 * M_PI);
229 void ResonanceSl::calcWidth(
bool) {
232 if (ps == 0.)
return;
235 kinFac = (mRes * mRes - mf1 * mf1 - mf2 * mf2);
237 if(abs(id2) == 11) coup = yuk[1];
238 if(abs(id2) == 13) coup = yuk[2];
239 if(abs(id2) == 15) coup = yuk[3];
240 widNow = pow2(coup) * preFac * kinFac * ps;
253 void ResonanceCha::setMassMix(){
257 doDY = settingsPtr->flag(
"DM:qqbar2DY") &&
258 settingsPtr->mode(
"DM:DYtype") > 1;
262 double M1 = settingsPtr->parm(
"DM:M1");
263 double M2 = settingsPtr->parm(
"DM:M2");
264 int type = settingsPtr->mode(
"DM:Nplet");
265 double Lambda = settingsPtr->parm(
"DM:Lambda");
269 mixing = vev / Lambda;
270 if (type > 1) mixing *= sqrt(2) * vev;
271 if (type > 2) mixing *= pow2(vev) /pow2(Lambda) / sqrt(12);
272 double term1 = sqrt(pow2(M2 - M1) + pow2(mixing));
273 double sin2th = 0.5 * (1 - abs(M2 - M1) / term1);
274 mixN1 = (M1 > M2) ? sqrt(sin2th) : sqrt(1. - sin2th);
275 mixN2 = (M1 > M2) ? sqrt(1. - sin2th) : sqrt(sin2th);
278 double m1m = 0.5 * (M1 + M2 - term1);
279 double m2p = 0.5 * (M1 + M2 + term1);
280 double mplet = (M1 < M2) ? m2p : m1m;
282 particleDataPtr->m0(52, m1m);
283 particleDataPtr->m0(58, m2p);
285 particleDataPtr->m0(57, mplet + 0.16);
286 particleDataPtr->m0(59, mplet + 0.16 + 0.49);
296 void ResonanceCha::calcPreFac(
bool) {
299 preFac = mRes / (16.0 * M_PI);
307 void ResonanceCha::calcWidth(
bool) {
314 if (mHat < mf1 + mf2 + 0.01)
return;
319 double mix = (abs(id2) == 58) ? mixN2 : mixN1;
320 double mpion = 0.1396;
324 dm = particleDataPtr->m0(57) - particleDataPtr->m0(abs(id2));
326 if (dm > mpion) widNow = 2.0 * pow2(mix) * 6.993e-13
327 * sqrt(1. - pow2(mpion/dm)) * pow3(dm);
329 else if (dm > particleDataPtr->m0(24)) ;
349 void ResonanceDM2::initConstants() {
352 mHiggs = particleDataPtr->m0(25);
353 wHiggs = particleDataPtr->mWidth(25);
361 void ResonanceDM2::calcPreFac(
bool) {
369 void ResonanceDM2::calcWidth(
bool) {
375 if (ps == 0.)
return;
390 void ResonanceChaD::calcPreFac(
bool) {
393 double dm = particleDataPtr->m0(59) - particleDataPtr->m0(57);
394 preFac = (dm > 0.) ? 4.0 * 6.993e-13 * sqrtpos(1. - pow2(0.1396/dm))
403 void ResonanceChaD::calcWidth(
bool) {