10 #include "Pythia8/SusyResonanceWidths.h"
11 #include "Pythia8/SusyCouplings.h"
12 #include "Pythia8/ParticleData.h"
13 #include "Pythia8/PythiaComplex.h"
26 void WidthFunction::init( ParticleData* particleDataPtrIn,
27 CoupSUSY* coupSUSYPtrIn) {
29 particleDataPtr = particleDataPtrIn;
30 coupSUSYPtr = coupSUSYPtrIn;
36 void WidthFunction::setInternal2(
int idResIn,
int id1In,
int id2In,
37 int id3In,
int idIntIn) {
46 mRes = particleDataPtr->m0(idRes);
47 m1 = particleDataPtr->m0(id1);
48 m2 = particleDataPtr->m0(id2);
49 m3 = particleDataPtr->m0(id3);
52 mInt = particleDataPtr->m0(idInt);
53 gammaInt = particleDataPtr->mWidth(idInt);
60 double WidthFunction::function(
double) {
62 cout<<
"Warning using dummy width function"<<endl;
68 double WidthFunction::function(
double,
double) {
70 cout<<
"Warning using dummy width function"<<endl;
80 void Psi::setInternal (
int idResIn,
int id1In,
int id2In,
int id3In,
83 setInternal2(idResIn, id1In, id2In, id3In, idIntIn);
85 mInt = particleDataPtr->m0(idInt);
86 gammaInt = particleDataPtr->mWidth(idInt);
87 iX = coupSUSYPtr->typeNeut(idRes);
89 iSq = (idInt>1000000)? 3 + (idInt%10+1)/2 : (idInt%10+1)/2;
90 isSqDown = (idInt % 2 == 1)?
true :
false;
91 m1 = particleDataPtr->m0(id1);
92 m2 = particleDataPtr->m0(id2);
93 m3 = particleDataPtr->m0(id3);
99 void Upsilon::setInternal (
int idResIn,
int id1In,
int id2In,
int id3In,
100 int idIntIn,
int idInt2In) {
102 setInternal2(idResIn, id1In, id2In, id3In, idIntIn);
105 mInt = particleDataPtr->m0(idInt);
106 gammaInt = particleDataPtr->mWidth(idInt);
107 mInt2 = particleDataPtr->m0(idInt2);
108 gammaInt2 = particleDataPtr->mWidth(idInt2);
110 iX = coupSUSYPtr->typeNeut(idRes);
112 iSq = (idInt>1000000)? 3 + (idInt%10+1)/2 : (idInt%10+1)/2;
113 iSq2 = (idInt2>1000000)? 3 + (idInt2%10+1)/2 : (idInt2%10+1)/2;
114 isSqDown = (idIntIn % 2 == 1)?
true :
false;
115 m1 = particleDataPtr->m0(id1);
116 m2 = particleDataPtr->m0(id2);
117 m3 = particleDataPtr->m0(id3);
123 void Phi::setInternal (
int idResIn,
int id1In,
int id2In,
int id3In,
124 int idIntIn,
int idInt2In) {
126 setInternal2(idResIn, id1In, id2In, id3In, idIntIn);
129 mInt = particleDataPtr->m0(idInt);
130 gammaInt = particleDataPtr->mWidth(idInt);
131 mInt2 = particleDataPtr->m0(idInt2);
132 gammaInt2 = particleDataPtr->mWidth(idInt2);
134 iX = coupSUSYPtr->typeNeut(idRes);
136 iSq = (idInt>1000000)? 3 + (idInt%10+1)/2 : (idInt%10+1)/2;
137 iSq2 = (idInt2>1000000)? 3 + (idInt2%10+1)/2 : (idInt2%10+1)/2;
138 isSqDown = (idIntIn % 2 == 1)?
true :
false;
139 m1 = particleDataPtr->m0(id1);
140 m2 = particleDataPtr->m0(id2);
141 m3 = particleDataPtr->m0(id3);
147 double Psi::function(
double m12sq) {
149 double R, factor1, factor2, value;
152 if (m12sq > pow2(mInt) || abs(m12sq - pow2(mInt)) < gammaInt)
return 0;
154 R = 1.0/(pow2(m12sq-pow2(mInt)) + pow2(gammaInt*mInt));
156 factor1 = (norm(coupSUSYPtr->LsddX[iSq][iQ][iX])
157 + norm(coupSUSYPtr->RsddX[iSq][iQ][iX]))*
158 (mRes*mRes + m3*m3 - m12sq);
159 factor2 = 4.0 * real(coupSUSYPtr->LsddX[iSq][iQ][iX]
160 * conj(coupSUSYPtr->RsddX[iSq][iQ][iX])) * m3 * mRes;
163 factor1 = (norm(coupSUSYPtr->LsuuX[iSq][iQ][iX])
164 + norm(coupSUSYPtr->RsuuX[iSq][iQ][iX]))*
165 (mRes*mRes + m3*m3 - m12sq);
166 factor2 = 4.0 * real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
167 * conj(coupSUSYPtr->RsuuX[iSq][iQ][iX])) * m3 * mRes;
170 value = R * (m12sq - m1*m1 - m2*m2) * (factor1+factor2);
178 double Upsilon::function(
double m12sq) {
180 double R1,R2, S, factor1, factor2, value;
183 if (m12sq > pow2(mInt) || abs(m12sq - pow2(mInt)) < gammaInt)
return 0;
184 if (m12sq > pow2(mInt2) || abs(m12sq - pow2(mInt2)) < gammaInt2)
return 0;
186 R1 = 1.0/(pow2(m12sq-pow2(mInt)) + pow2(gammaInt*mInt));
187 R2 = 1.0/(pow2(m12sq-pow2(mInt2)) + pow2(gammaInt2*mInt2));
188 S = R1 * R2 * ((m12sq - pow2(mInt)) * (m12sq - pow2(mInt2))
189 + gammaInt * mInt * gammaInt2 * mInt2);
192 factor1 = real(coupSUSYPtr->LsddX[iSq][iQ][iX]
193 * conj(coupSUSYPtr->LsddX[iSq2][iQ][iX]))
194 + real(coupSUSYPtr->RsddX[iSq][iQ][iX]
195 * conj(coupSUSYPtr->RsddX[iSq2][iQ][iX]));
196 factor2 = real(coupSUSYPtr->LsddX[iSq][iQ][iX]
197 * conj(coupSUSYPtr->RsddX[iSq2][iQ][iX]))
198 + real(coupSUSYPtr->RsddX[iSq][iQ][iX]
199 * conj(coupSUSYPtr->LsddX[iSq2][iQ][iX]));
201 factor1 = real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
202 * conj(coupSUSYPtr->LsuuX[iSq2][iQ][iX]))
203 + real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
204 * conj(coupSUSYPtr->RsuuX[iSq2][iQ][iX]));
205 factor2 = real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
206 * conj(coupSUSYPtr->RsuuX[iSq2][iQ][iX]))
207 + real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
208 * conj(coupSUSYPtr->LsuuX[iSq2][iQ][iX]));
211 value = S * (m12sq - pow2(m1) - pow2(m2)) *
212 ( factor1 * (pow2(mRes) + pow2(m3) - m12sq) + 2.0 * factor2 * m3 * mRes);
223 double Phi::function(
double m12sqIn) {
227 if (m12sq > pow2(mInt) || abs(m12sq - pow2(mInt)) < gammaInt)
return 0;
229 double m23max, m23min, E2, E3;
231 E2 = (m12sq - pow2(m1) - pow2(m2))/(2.0 * sqrt(m12sq));
232 E3 = (pow2(mRes) - m12sq - pow2(m3))/(2.0 * sqrt(m12sq));
233 m23max = pow2(E2+E3) - (sqrt(E2*E2 - m2*m2) - sqrt(E3*E3 - m3*m3)) ;
234 m23min = pow2(E2+E3) - (sqrt(E2*E2 - m2*m2) + sqrt(E3*E3 - m3*m3)) ;
236 if (E2 < m2 || E3 < m3){
237 cout <<
"Error in Phi:function"<<endl;
241 double integral2 = integrateGauss(m23min,m23max,1.0e-4);
247 double Phi::function2(
double m23sq) {
250 if (m23sq > pow2(mInt2) || abs(m23sq - pow2(mInt2)) < gammaInt2)
return 0;
252 double R1, R2, S, factor1, factor2, factor3, factor4, value, fac;
255 R1 = 1.0/(pow2(m12sq-pow2(mInt)) + pow2(gammaInt*mInt));
256 R2 = 1.0/(pow2(m12sq-pow2(mInt2)) + pow2(gammaInt2*mInt2));
257 S = R1 * R2 * ((m12sq - pow2(mInt)) * (m12sq - pow2(mInt2))
258 + gammaInt * mInt * gammaInt2 * mInt2);
264 iQ2 = (id1%2 == 1)? (id1+1)/2 : (id2+1)/2;
266 if (mRes > mInt2 + particleDataPtr->m0(iQ2)) fac = 0.;
268 factor1 = m1 * m3 * real(coupSUSYPtr->LsddX[iSq][iQ][iX]
269 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
270 * (m12sq + m23sq - pow2(m1) - pow2(m3));
271 factor2 = m1 * mRes * real(coupSUSYPtr->RsddX[iSq][iQ][iX]
272 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
273 * (m23sq - pow2(m2) - pow2(m3));
274 factor3 = m3 * mRes * real(coupSUSYPtr->LsddX[iSq][iQ][iX]
275 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
276 * (m12sq - pow2(m1) - pow2(m2));
277 factor4 = m3 * mRes * real(coupSUSYPtr->RsddX[iSq][iQ][iX]
278 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
279 * (m12sq * m23sq - pow2(m1 * m3) - pow2(m2 * mRes));
285 if (mRes > mInt2 + particleDataPtr->m0(iQ2)) fac = 0.;
287 factor1 = m1 * m3 * real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
288 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
289 * (m12sq + m23sq - pow2(m1) - pow2(m3));
290 factor2 = m1 * mRes * real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
291 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
292 * (m23sq - pow2(m2) - pow2(m3));
293 factor3 = m3 * mRes * real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
294 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
295 * (m12sq - pow2(m1) - pow2(m2));
296 factor4 = m3 * mRes * real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
297 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
298 * (m12sq * m23sq - pow2(m1 * m3) - pow2(m2 * mRes));
304 if (mRes > mInt2 + particleDataPtr->m0(iQ2)) fac = 0.;
306 factor1 += m2 * m3 * real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
307 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
308 * (m12sq + m23sq - pow2(m2) - pow2(m3));
309 factor2 += m2 * mRes * real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
310 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
311 * (m23sq - pow2(m1) - pow2(m3));
312 factor3 += m3 * mRes * real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
313 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
314 * (m12sq - pow2(m2) - pow2(m1));
315 factor4 += m3 * mRes * real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
316 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
317 * (m12sq * m23sq - pow2(m2 * m3) - pow2(m1 * mRes));
320 value = S * (factor1 + factor2 + factor3 + factor4);
325 return (fac * value);
330 double Phi::integrateGauss(
double xlo,
double xhi,
double tol) {
333 static double x8[4]={0.96028985649753623,
336 0.18343464249564980};
337 static double w8[4]={0.10122853629037626,
340 0.36268378337836198};
342 static double x16[8]={0.98940093499164993,
349 0.09501250983763744};
350 static double w16[8]={0.027152459411754095,
351 0.062253523938647893,
352 0.095158511682492785,
357 0.18945061045506850};
360 cerr<<
"xlo = xhi"<<endl;
364 cerr<<
" (integrateGauss:) -> xhi < xlo"<<endl;
369 double c = 0.001/abs(xhi-xlo);
377 double zmi = 0.5*(zhi+zlo);
378 double zmr = 0.5*(zhi-zlo);
382 for (
int i=0;i<4;i++) {
383 double dz = zmr * x8[i];
384 s8 += w8[i]*(function2(zmi+dz) + function2(zmi-dz));
388 for (
int i=0;i<8;i++) {
389 double dz = zmr * x16[i];
390 s16 += w16[i]*(function2(zmi+dz) + function2(zmi-dz));
393 if (abs(s16-s8) < tol*(1+abs(s16))) {
400 if ( zlo == zhi ) nextbin =
false;
403 if (1.0 + c*abs(zmr) == 1.0) {
404 cerr <<
" (integrateGauss:) too high accuracy required"<<endl;
420 const bool SUSYResonanceWidths::DBSUSY =
false;
424 bool SUSYResonanceWidths::initBSM(){
426 if (couplingsPtr->isSUSY) {
427 coupSUSYPtr = (CoupSUSY *) couplingsPtr;
437 bool SUSYResonanceWidths::allowCalc(){
440 if ( !couplingsPtr->isSUSY )
return false;
443 if ( !settingsPtr->flag(
"SLHA:useDecayTable") )
return true;
446 for (
int iDec = 1; iDec < int((coupSUSYPtr->slhaPtr)->decays.size());
448 if ( (coupSUSYPtr->slhaPtr)->decays[iDec].getId() == abs(idRes) ) {
449 if (DBSUSY) cout<<
"Using external decay table for:"<<idRes<<endl;
466 void ResonanceSquark::initConstants() {
469 s2W = coupSUSYPtr->sin2W;
477 void ResonanceSquark::calcPreFac(
bool) {
480 alpS = coupSUSYPtr->alphaS(mHat * mHat );
481 alpEM = coupSUSYPtr->alphaEM(mHat * mHat);
482 preFac = 1.0 / (s2W * pow(mHat,3));
491 void ResonanceSquark::calcWidth(
bool) {
495 bool idown = (abs(idRes)%2 == 0 ?
false :
true);
496 int isq = (abs(idRes)/ksusy == 2) ?
497 (abs(idRes)%10+1)/2 + 3: (abs(idRes)%10+1)/2;
501 if (ps == 0.)
return;
504 kinFac = (mHat * mHat - mf1 * mf1 - mf2 * mf2);
506 double fac = 0.0 , wid = 0.0;
510 if (id1Abs < 7 && id2Abs < 7){
513 int iq1 = (id1Abs + 1)/2;
514 int iq2 = (id2Abs + 1)/2;
517 if (!coupSUSYPtr->isUDD) {widNow = 0;
return;}
521 fac = 2.0 * kinFac / (16.0 * M_PI * pow(mHat,3));
524 if ((id1Abs+id2Abs)%2 == 1){
526 for (
int isq2 = 1; isq2 < 4; isq2++)
527 wid += norm(coupSUSYPtr->rvUDD[iq2][iq1][isq2]
528 * coupSUSYPtr->Rdsq[isq][isq2+3]);
530 for (
int isq2 = 1; isq2 < 4; isq2++)
531 wid += norm(coupSUSYPtr->rvUDD[iq1][iq2][isq2]
532 * coupSUSYPtr->Rdsq[isq][isq2+3]);
536 if ((id1Abs+id2Abs)%2 != 0) widNow = 0.0;
538 for (
int isq2 = 1; isq2 < 4; isq2++)
539 wid += norm(coupSUSYPtr->rvUDD[isq2][iq1][iq2]
540 * coupSUSYPtr->Rusq[isq][isq2+3]);
545 else if (id1Abs < 17 && id2Abs < 7){
546 if (!coupSUSYPtr->isLQD) {widNow = 0;
return;}
548 int ilep = (id1Abs - 9)/2;
549 int iq = (id2Abs + 1)/2;
551 fac = kinFac / (16.0 * M_PI * pow(mHat,3));
556 for (
int isq2=1; isq2<3; isq2++)
557 wid += norm(coupSUSYPtr->Rdsq[isq][isq2+3]
558 * coupSUSYPtr->rvLQD[ilep][iq][isq2]);
561 for (
int isq2=1; isq2<3; isq2++)
562 wid += norm(coupSUSYPtr->Rdsq[isq][isq2]
563 * coupSUSYPtr->rvLQD[ilep][isq2][isq2]);
567 if (iq%2 == 0) {widNow = 0.0;
return;}
569 for (
int isq2=1; isq2<3; isq2++)
570 wid += norm(coupSUSYPtr->Rusq[isq][isq2]
571 * coupSUSYPtr->rvLQD[ilep][isq2][iq]);
576 else if (id1Abs > ksusy && id2Abs < 7) {
578 int iq = (id2Abs + 1)/2;
581 if (id1Abs == 1000021 && idRes%10 == id2Abs) {
583 fac = 2.0 * alpS / (3.0 * pow3(mHat));
585 wid = kinFac * (norm(coupSUSYPtr->LsddG[isq][iq])
586 + norm(coupSUSYPtr->RsddG[isq][iq]))
587 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsddG[isq][iq]
588 * conj(coupSUSYPtr->RsddG[isq][iq]));
590 wid = kinFac * (norm(coupSUSYPtr->LsuuG[isq][iq])
591 + norm(coupSUSYPtr->RsuuG[isq][iq]))
592 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsuuG[isq][iq]
593 * conj(coupSUSYPtr->RsuuG[isq][iq]));
596 for (
int i=1; i<6 ; i++){
598 if (coupSUSYPtr->idNeut(i)==id1Abs && idRes%2 == id2Abs%2){
599 fac = alpEM * preFac / (2.0 * (1 - s2W));
601 wid = kinFac * (norm(coupSUSYPtr->LsddX[isq][iq][i])
602 + norm(coupSUSYPtr->RsddX[isq][iq][i]))
603 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsddX[isq][iq][i]
604 * conj(coupSUSYPtr->RsddX[isq][iq][i]));
606 wid = kinFac * (norm(coupSUSYPtr->LsuuX[isq][iq][i])
607 + norm(coupSUSYPtr->RsuuX[isq][iq][i]))
608 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsuuX[isq][iq][i]
609 * conj(coupSUSYPtr->RsuuX[isq][iq][i]));
613 else if (i < 3 && coupSUSYPtr->idChar(i)==id1Abs
614 && idRes%2 != id2Abs%2){
616 fac = alpEM * preFac / (4.0 * (1 - s2W));
618 wid = kinFac * (norm(coupSUSYPtr->LsduX[isq][iq][i])
619 + norm(coupSUSYPtr->RsduX[isq][iq][i]))
620 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsduX[isq][iq][i]
621 * conj(coupSUSYPtr->RsduX[isq][iq][i]));
623 wid = kinFac * (norm(coupSUSYPtr->LsudX[isq][iq][i])
624 + norm(coupSUSYPtr->RsudX[isq][iq][i]))
625 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsudX[isq][iq][i]
626 * conj(coupSUSYPtr->RsudX[isq][iq][i]));
632 else if (id1Abs > ksusy && id1Abs%100 < 7
633 && (id2Abs == 23 || id2Abs == 24)){
636 fac = alpEM * preFac/(16.0 * pow2(particleDataPtr->m0(id2Abs))
637 * (1.0 - s2W)) * pow2(ps) ;
639 int isq2 = (id1Abs/ksusy == 2) ? (id1Abs%10+1)/2 + 3: (id1Abs%10+1)/2;
641 if (id2Abs == 23 && id1Abs%2 == idRes%2){
643 wid = norm(coupSUSYPtr->LsdsdZ[isq][isq2]
644 + coupSUSYPtr->RsdsdZ[isq][isq2]);
646 wid = norm(coupSUSYPtr->LsusuZ[isq][isq2]
647 + coupSUSYPtr->RsusuZ[isq][isq2]);
649 else if (id2Abs == 24 && id1Abs%2 != idRes%2){
651 wid = norm(coupSUSYPtr->LsusdW[isq2][isq]);
653 wid = norm(coupSUSYPtr->LsusdW[isq][isq2]);
658 widNow = fac * wid * ps * pow2(mHat);
659 if (DBSUSY) cout<<idRes<<
":: id1:"<<id1Abs<<
" id2:"<<id2Abs
660 <<
" Width: "<<widNow<<endl;
675 void ResonanceGluino::initConstants() {
683 void ResonanceGluino::calcPreFac(
bool) {
686 alpS = coupSUSYPtr->alphaS(mHat * mHat);
687 preFac = alpS /( 8.0 * pow(mHat,3));
696 void ResonanceGluino::calcWidth(
bool) {
699 if (ps == 0.)
return;
700 kinFac = (mHat * mHat - mf1 * mf1 + mf2 * mf2);
702 if (id1Abs > 1000000 && (id1Abs % 100) < 7 && id2Abs < 7) {
704 int isq = (abs(id1Abs)/1000000 == 2) ? (abs(id1Abs)%10+1)/2 + 3
705 : (abs(id1Abs)%10+1)/2;
706 bool idown = id2Abs%2;
707 int iq = (id2Abs + 1)/2;
711 widNow = kinFac * (norm(coupSUSYPtr->LsddG[isq][iq])
712 + norm(coupSUSYPtr->RsddG[isq][iq]))
713 + 4.0 * mHat * mf2 * real(coupSUSYPtr->LsddG[isq][iq]
714 * conj(coupSUSYPtr->RsddG[isq][iq]));
717 widNow = kinFac * (norm(coupSUSYPtr->LsuuG[isq][iq])
718 + norm(coupSUSYPtr->RsuuG[isq][iq]))
719 + 4.0 * mHat * mf2 * real(coupSUSYPtr->LsuuG[isq][iq]
720 * conj(coupSUSYPtr->RsuuG[isq][iq]));
722 widNow = widNow * preFac * ps * pow2(mHat);
724 cout<<
"Gluino:: id1:"<<id1Abs<<
" id2:"<<id2Abs<<
" Width: ";
725 cout<<scientific<<widNow<<endl;
738 void ResonanceNeut::initConstants() {
740 s2W = coupSUSYPtr->sin2W;
743 psi.init(particleDataPtr,coupSUSYPtr);
744 phi.init(particleDataPtr,coupSUSYPtr);
745 upsil.init(particleDataPtr,coupSUSYPtr);
753 void ResonanceNeut::calcPreFac(
bool) {
756 alpEM = coupSUSYPtr->alphaEM(mHat * mHat);
757 preFac = alpEM / (8.0 * s2W * pow(mHat,3));
765 void ResonanceNeut::calcWidth(
bool){
769 if (ps == 0.)
return;
773 kinFac = mHat * mHat - mf1 * mf1 + mf2 * mf2;
774 kinFac2 = pow(mHat,4) + pow(mf1,4) - 2.0 * pow(mf2,4)
775 + pow2(mHat) * pow2(mf2) + pow2(mf1) * pow2(mf2)
776 - 2.0 * pow2(mHat) * pow2(mf1);
779 if (idRes == 1000022)
return;
782 int iNeut1 = coupSUSYPtr->typeNeut(idRes);
783 int iNeut2 = coupSUSYPtr->typeNeut(id1Abs);
784 int iChar1 = coupSUSYPtr->typeChar(id1Abs);
786 if (iNeut2>0 && id2Abs == 23){
788 fac = kinFac2 * (norm(coupSUSYPtr->OLpp[iNeut1][iNeut2])
789 + norm(coupSUSYPtr->ORpp[iNeut1][iNeut2]));
790 fac -= 12.0 * mHat * mf1 * pow2(mf2)
791 * real(coupSUSYPtr->OLpp[iNeut1][iNeut2]
792 * conj(coupSUSYPtr->ORpp[iNeut1][iNeut2]));
793 fac /= pow2(mf2) * (1.0 - s2W);
795 else if (iChar1>0 && id2Abs==24){
798 fac = kinFac2 * (norm(coupSUSYPtr->OL[iNeut1][iChar1])
799 + norm(coupSUSYPtr->OR[iNeut1][iChar1]));
800 fac -= 12.0 * mHat * mf1 * pow2(mf2)
801 * real(coupSUSYPtr->OL[iNeut1][iChar1]
802 * conj(coupSUSYPtr->OR[iNeut1][iChar1]));
805 else if (id1Abs > 1000000 && id1Abs%100 < 7 && id2Abs < 7){
807 bool idown = (id1Abs%2 == 1);
808 int iq = (id2Abs + 1 )/ 2;
809 int isq = (abs(id1Abs)/1000000 == 2) ? (abs(id1Abs)%10+1)/2 + 3
810 : (abs(id1Abs)%10+1)/2;
813 fac = kinFac * (norm(coupSUSYPtr->LsddX[isq][iq][iNeut1])
814 + norm(coupSUSYPtr->RsddX[isq][iq][iNeut1]));
815 fac += 4.0 * mHat * mf2 * real(coupSUSYPtr->LsddX[isq][iq][iNeut1]
816 * conj(coupSUSYPtr->RsddX[isq][iq][iNeut1]));
819 fac = kinFac * (norm(coupSUSYPtr->LsuuX[isq][iq][iNeut1])
820 + norm(coupSUSYPtr->RsuuX[isq][iq][iNeut1]));
821 fac += 4.0 * mHat * mf2 * real(coupSUSYPtr->LsuuX[isq][iq][iNeut1]
822 * conj(coupSUSYPtr->RsuuX[isq][iq][iNeut1]));
825 fac *= 6.0/(1 - s2W);
827 else if (id1Abs > 2000010 && id1Abs%2 == 0 ) {
831 else if (id1Abs > 1000000 && id1Abs%100 > 10 && id1Abs%100 < 17
834 bool idown = id2Abs%2;
835 int il = (id2Abs - 9)/ 2;
836 int isl = (abs(id1Abs)/1000000 == 2) ? (abs(id1Abs)%10+1)/2 + 3
837 : (abs(id1Abs)%10+1)/2;
840 fac = kinFac * (norm(coupSUSYPtr->LsllX[isl][il][iNeut1])
841 + norm(coupSUSYPtr->RsllX[isl][il][iNeut1]));
842 fac += 4.0 * mHat * mf2 * real(coupSUSYPtr->LsllX[isl][il][iNeut1]
843 * conj(coupSUSYPtr->RsllX[isl][il][iNeut1]));
846 fac = kinFac * (norm(coupSUSYPtr->LsvvX[isl][il][iNeut1]));
848 fac *= 2.0/(1 - s2W);
852 widNow = fac * preFac * ps * pow2(mHat);
854 cout<<idRes<<
":: id1:"<<id1Abs<<
" id2:"<<id2Abs<<
" Width: ";
855 cout<<scientific<<widNow<<endl;
862 if (!coupSUSYPtr->isUDD)
return;
864 if (id1Abs < 7 && id2Abs < 7 && id3Abs < 7){
867 if ((id1Abs+id2Abs+id3Abs)%2 == 1)
return;
868 double rvfac,m12min,m12max,integral;
872 for (
int idIntRes = 1; idIntRes <= 6; idIntRes++){
874 for (
int iSq = 1; iSq <= 3; iSq++){
875 double m1, m2, m3, mixfac1(0.), mixfac2(0.), mixfac3(0.);
876 int itemp1,itemp2,itemp3;
878 for (
int itype = 1; itype<=3; itype++){
882 if (itype ==1 ) idInt = coupSUSYPtr->idSup(idIntRes);
883 else idInt = coupSUSYPtr->idSdown(idIntRes);
890 coupSUSYPtr->rvUDD[iSq][(id2Abs+1)/2][(id3Abs+1)/2]);
891 }
else if (itype ==2){
896 coupSUSYPtr->rvUDD[(id1Abs+1)/2][iSq][(id3Abs+1)/2]);
902 coupSUSYPtr->rvUDD[(id1Abs+1)/2][(id2Abs+1)/2][iSq]);
904 }
else if (id2Abs%2 == 0){
910 coupSUSYPtr->rvUDD[iSq][(id1Abs+1)/2][(id3Abs+1)/2]);
911 }
else if (itype ==2){
916 coupSUSYPtr->rvUDD[(id2Abs+1)/2][iSq][(id3Abs+1)/2]);
922 coupSUSYPtr->rvUDD[(id2Abs+1)/2][(id2Abs+1)/2][iSq]);
930 coupSUSYPtr->rvUDD[iSq][(id1Abs+1)/2][(id2Abs+1)/2]);
931 }
else if (itype ==2){
936 coupSUSYPtr->rvUDD[(id3Abs+1)/2][iSq][(id2Abs+1)/2]);
942 coupSUSYPtr->rvUDD[(id3Abs+1)/2][(id1Abs+1)/2][iSq]);
947 m1 = particleDataPtr->m0(itemp1);
948 m2 = particleDataPtr->m0(itemp2);
949 m3 = particleDataPtr->m0(itemp3);
951 m12min = pow2(m1+m2);
952 m12max = pow2(mHat-m3);
955 if (mRes > particleDataPtr->m0(idInt)
956 + particleDataPtr->m0(itemp3))
continue;
959 psi.setInternal(idRes, itemp1, itemp2, itemp3, idInt, 0);
962 mixfac1 = norm(coupSUSYPtr->Rusq[idIntRes][iSq+3]);
964 mixfac1 = norm(coupSUSYPtr->Rdsq[idIntRes][iSq+3]);
966 if (abs(rvfac * mixfac1) > 1.0e-8) {
967 integral = integrateGauss(&psi,m12min,m12max,1.0e-4);
968 widNow += rvfac * mixfac1 * integral;
977 for (
int idIntRes2 = 1; idIntRes2 <= 6; idIntRes2++){
978 if (idIntRes2 == idIntRes)
continue;
981 idInt2 = coupSUSYPtr->idSup(idIntRes2);
982 mixfac2 = 2.0 * real(coupSUSYPtr->Rusq[idIntRes][iSq+3]
983 * conj(coupSUSYPtr->Rusq[idIntRes2][iSq+3]));
985 idInt2 = coupSUSYPtr->idSdown(idIntRes2);
986 mixfac2 = 2.0 * real(coupSUSYPtr->Rdsq[idIntRes][iSq+3]
987 * conj(coupSUSYPtr->Rdsq[idIntRes2][iSq+3]));
991 if (mRes > particleDataPtr->m0(idInt2)
992 + particleDataPtr->m0(itemp3))
continue;
994 upsil.setInternal(idRes,itemp1, itemp2,itemp3,idInt,idInt2);
995 if (abs(rvfac * mixfac2) > 0.0) {
996 integral = integrateGauss(&upsil,m12min,m12max,1.0e-4);
997 widNow += rvfac * mixfac2 * integral;
1008 for (
int idIntRes2 = 1; idIntRes2 <= 6; idIntRes2++){
1009 if (itype != 1 && idIntRes2 == idIntRes)
continue;
1012 for (
int iSq2 = 1; iSq2 <= 3; iSq2++){
1014 idInt2 = coupSUSYPtr->idSdown(idIntRes2);
1015 mixfac3 = 2.0 * real(coupSUSYPtr->Rusq[idIntRes][iSq+3]
1016 * conj(coupSUSYPtr->Rdsq[idIntRes2][iSq2+3]));
1018 idInt2 = coupSUSYPtr->idSdown(idIntRes2);
1019 mixfac3 = 2.0 * real(coupSUSYPtr->Rdsq[idIntRes][iSq+3]
1020 * conj(coupSUSYPtr->Rdsq[idIntRes2][iSq2+3]));
1023 if (abs(rvfac * mixfac3) > 0.0) {
1024 phi.setInternal(idRes,itemp1, itemp2,itemp3,idInt,idInt2);
1027 integral = integrateGauss(&phi,m12min,m12max,1.0e-4);
1028 widNow -= rvfac * mixfac2 * integral;
1038 widNow *= 12.0 /(pow3(2.0 * M_PI * mHat) * 32.0);
1052 void ResonanceChar::initConstants() {
1054 s2W = coupSUSYPtr->sin2W;
1063 void ResonanceChar::calcPreFac(
bool) {
1065 alpEM = coupSUSYPtr->alphaEM(mHat * mHat);
1066 preFac = alpEM / (8.0 * s2W * pow(mHat,3));
1075 void ResonanceChar::calcWidth(
bool) {
1078 if (ps == 0.)
return;
1082 kinFac = mHat * mHat - mf1 * mf1 + mf2 * mf2;
1083 kinFac2 = pow(mHat,4) + pow(mf1,4) - 2.0 * pow(mf2,4)
1084 + pow2(mHat) * pow2(mf2) + pow2(mf1)
1085 * pow2(mf2) - 2.0 * pow2(mHat) * pow2(mf1);
1087 int idChar1 = coupSUSYPtr->typeChar(idRes);
1088 int idChar2 = coupSUSYPtr->typeChar(id1Abs);
1089 int idNeut1 = coupSUSYPtr->typeNeut(id1Abs);
1091 if (idChar2>0 && id2Abs == 23){
1093 fac = kinFac2 * (norm(coupSUSYPtr->OLp[idChar1][idChar2])
1094 + norm(coupSUSYPtr->ORp[idChar1][idChar2]));
1095 fac -= 12.0 * mHat * mf1 * pow2(mf2)
1096 * real(coupSUSYPtr->OLp[idChar1][idChar2]
1097 * conj(coupSUSYPtr->ORp[idChar1][idChar2]));
1098 fac /= pow2(mf2) * (1.0 - s2W);
1100 else if (idNeut1>0 && id2Abs==24){
1103 fac = kinFac2 * (norm(coupSUSYPtr->OL[idNeut1][idChar1])
1104 + norm(coupSUSYPtr->OR[idNeut1][idChar1]));
1105 fac -= 12.0 * mHat * mf1 * pow2(mf2)
1106 * real(coupSUSYPtr->OL[idNeut1][idChar1]
1107 * conj(coupSUSYPtr->OR[idNeut1][idChar1]));
1110 else if (id1Abs > 1000000 && id1Abs%100 < 7 && id2Abs < 7){
1112 bool idown = (id1Abs%2 == 1);
1113 int iq = (id2Abs + 1 )/ 2;
1114 int isq = (abs(id1Abs)/1000000 == 2) ? (abs(id1Abs)%10+1)/2 + 3
1115 : (abs(id1Abs)%10+1)/2;
1118 fac = kinFac * (norm(coupSUSYPtr->LsduX[isq][iq][idChar1])
1119 + norm(coupSUSYPtr->RsduX[isq][iq][idChar1]));
1120 fac += 4.0 * mHat * mf2
1121 * real(coupSUSYPtr->LsduX[isq][iq][idChar1]
1122 * conj(coupSUSYPtr->RsduX[isq][iq][idChar1]));
1125 fac = kinFac * (norm(coupSUSYPtr->LsudX[isq][iq][idChar1])
1126 + norm(coupSUSYPtr->RsudX[isq][iq][idChar1]));
1127 fac += 4.0 * mHat * mf2
1128 * real(coupSUSYPtr->LsudX[isq][iq][idChar1]
1129 * conj(coupSUSYPtr->RsudX[isq][iq][idChar1]));
1131 fac *= 6.0/(1 - s2W);
1133 else if (id1Abs > 2000010 && id1Abs%2 == 0 ) {
1137 else if (id1Abs > 1000000 && id1Abs%100 > 10 && id1Abs%100 < 17
1140 bool idown = id2Abs%2;
1141 int il = (id2Abs - 9)/ 2;
1142 int isl = (abs(id1Abs)/1000000 == 2) ? (abs(id1Abs)%10+1)/2 + 3
1143 : (abs(id1Abs)%10+1)/2;
1146 fac = kinFac * (norm(coupSUSYPtr->LslvX[isl][il][idChar1])
1147 + norm(coupSUSYPtr->RslvX[isl][il][idChar1]));
1148 fac += 4.0 * mHat * mf2 * real(coupSUSYPtr->LslvX[isl][il][idChar1]
1149 * conj(coupSUSYPtr->RslvX[isl][il][idChar1]));
1152 fac = kinFac * (norm(coupSUSYPtr->LsvlX[isl][il][idChar1]));
1154 fac *= 2.0/(1 - s2W);
1158 widNow = fac * preFac * ps * pow2(mHat);
1160 cout<<idRes<<
":: id1:"<<id1Abs<<
" id2:"<<id2Abs<<
" Width: ";
1161 cout<<scientific<<widNow<<endl;
1178 void ResonanceSlepton::initConstants() {
1181 s2W = coupSUSYPtr->sin2W;
1189 void ResonanceSlepton::calcPreFac(
bool) {
1192 alpEM = coupSUSYPtr->alphaEM(mHat * mHat);
1193 preFac = 1.0 / (s2W * pow(mHat,3));
1201 void ResonanceSlepton::calcWidth(
bool) {
1204 int ksusy = 1000000;
1205 int isl = (abs(idRes)/ksusy == 2) ? (abs(idRes)%10+1)/2 + 3
1206 : (abs(idRes)%10+1)/2;
1207 int il = (id2Abs-9)/2;
1208 bool islep = idRes%2;
1211 if (ps == 0.)
return;
1214 kinFac = (mHat * mHat - mf1 * mf1 - mf2 * mf2);
1216 double fac = 0.0 , wid = 0.0;
1221 if (id1Abs > ksusy && id2Abs > 10 && id2Abs < 17) {
1222 for (
int i=1; i<6 ; i++){
1224 if (coupSUSYPtr->idNeut(i)==id1Abs && idRes%2 == id2Abs%2){
1225 fac = alpEM * preFac / (2.0 * (1 - s2W));
1227 wid = kinFac * (norm(coupSUSYPtr->LsllX[isl][il][i])
1228 + norm(coupSUSYPtr->RsllX[isl][il][i]))
1229 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsllX[isl][il][i]
1230 * conj(coupSUSYPtr->RsllX[isl][il][i]));
1232 wid = kinFac * (norm(coupSUSYPtr->LsvvX[isl][il][i])
1233 + norm(coupSUSYPtr->RsvvX[isl][il][i]))
1234 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsvvX[isl][il][i]
1235 * conj(coupSUSYPtr->RsvvX[isl][il][i]));
1239 else if (i < 3 && coupSUSYPtr->idChar(i)==id1Abs
1240 && idRes%2 != id2Abs%2){
1242 fac = alpEM * preFac / (4.0 * (1 - s2W));
1244 wid = kinFac * (norm(coupSUSYPtr->LslvX[isl][il][i])
1245 + norm(coupSUSYPtr->RslvX[isl][il][i]))
1246 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LslvX[isl][il][i]
1247 * conj(coupSUSYPtr->RslvX[isl][il][i]));
1249 wid = kinFac * (norm(coupSUSYPtr->LslvX[isl][il][i])
1250 + norm(coupSUSYPtr->RslvX[isl][il][i]))
1251 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LslvX[isl][il][i]
1252 * conj(coupSUSYPtr->RslvX[isl][il][i]));
1258 else if (id1Abs > ksusy+10 && id1Abs%100 < 17
1259 && (id2Abs == 23 || id2Abs == 24)){
1262 fac = alpEM * preFac/(16.0 * pow2(mf2) * (1.0 - s2W)) * pow2(ps) ;
1264 int isl2 = (id1Abs/ksusy == 2) ? (id1Abs%10+1)/2 + 3: (id1Abs%10+1)/2;
1266 if (id2Abs == 23 && id1Abs%2 == idRes%2){
1268 wid = norm(coupSUSYPtr->LslslZ[isl][isl2]
1269 + coupSUSYPtr->RslslZ[isl][isl2]);
1271 wid = norm(coupSUSYPtr->LsvsvZ[isl][isl2]
1272 + coupSUSYPtr->RsvsvZ[isl][isl2]);
1274 else if (id2Abs == 24 && id1Abs%2 != idRes%2){
1276 wid = norm(coupSUSYPtr->LslsvW[isl2][isl]);
1278 wid = norm(coupSUSYPtr->LslsvW[isl][isl2]);
1285 widNow = fac * wid * ps * pow2(mHat);
1286 if (DBSUSY) cout<<idRes<<
":: id1:"<<id1Abs<<
" id2:"<<id2Abs
1287 <<
" Width: "<<widNow<<endl;
1297 double SUSYResonanceWidths::integrateGauss(WidthFunction* widthFn,
1298 double xlo,
double xhi,
double tol) {
1301 static double x8[4]={0.96028985649753623,
1302 0.79666647741362674,
1303 0.52553240991632899,
1304 0.18343464249564980};
1305 static double w8[4]={0.10122853629037626,
1306 0.22238103445337447,
1307 0.31370664587788729,
1308 0.36268378337836198};
1310 static double x16[8]={0.98940093499164993,
1311 0.94457502307323258,
1312 0.86563120238783174,
1313 0.75540440835500303,
1314 0.61787624440264375,
1315 0.45801677765722739,
1316 0.28160355077925891,
1317 0.09501250983763744};
1318 static double w16[8]={0.027152459411754095,
1319 0.062253523938647893,
1320 0.095158511682492785,
1321 0.12462897125553387,
1322 0.14959598881657673,
1323 0.16915651939500254,
1324 0.18260341504492359,
1325 0.18945061045506850};
1328 cerr<<
"xlo = xhi"<<endl;
1332 cerr<<
" (integrateGauss:) -> xhi < xlo"<<endl;
1337 double c = 0.001/abs(xhi-xlo);
1341 bool nextbin =
true;
1345 double zmi = 0.5*(zhi+zlo);
1346 double zmr = 0.5*(zhi-zlo);
1350 for (
int i=0;i<4;i++) {
1351 double dz = zmr * x8[i];
1352 s8 += w8[i]*(widthFn->function(zmi+dz) + widthFn->function(zmi-dz));
1356 for (
int i=0;i<8;i++) {
1357 double dz = zmr * x16[i];
1358 s16 += w16[i]*(widthFn->function(zmi+dz) + widthFn->function(zmi-dz));
1361 if (abs(s16-s8) < tol*(1+abs(s16))) {
1368 if ( zlo == zhi ) nextbin =
false;
1371 if (1.0 + c*abs(zmr) == 1.0) {
1372 cerr <<
" (integrateGauss:) too high accuracy required"<<endl;