10 #include "SusyResonanceWidths.h"
11 #include "SusyCouplings.h"
12 #include "PythiaComplex.h"
25 void WidthFunction::init( ParticleData* particleDataPtrIn,
26 CoupSUSY* coupSUSYPtrIn) {
28 particleDataPtr = particleDataPtrIn;
29 coupSUSYPtr = coupSUSYPtrIn;
35 void WidthFunction::setInternal2(
int idResIn,
int id1In,
int id2In,
36 int id3In,
int idIntIn) {
45 mRes = particleDataPtr->m0(idRes);
46 m1 = particleDataPtr->m0(id1);
47 m2 = particleDataPtr->m0(id2);
48 m3 = particleDataPtr->m0(id3);
51 mInt = particleDataPtr->m0(idInt);
52 gammaInt = particleDataPtr->mWidth(idInt);
59 double WidthFunction::function(
double) {
61 cout<<
"Warning using dummy width function"<<endl;
67 double WidthFunction::function(
double,
double) {
69 cout<<
"Warning using dummy width function"<<endl;
79 void Psi::setInternal (
int idResIn,
int id1In,
int id2In,
int id3In,
82 setInternal2(idResIn, id1In, id2In, id3In, idIntIn);
84 mInt = particleDataPtr->m0(idInt);
85 gammaInt = particleDataPtr->mWidth(idInt);
86 iX = coupSUSYPtr->typeNeut(idRes);
88 iSq = (idInt>1000000)? 3 + (idInt%10+1)/2 : (idInt%10+1)/2;
89 isSqDown = (idInt % 2 == 1)?
true :
false;
90 m1 = particleDataPtr->m0(id1);
91 m2 = particleDataPtr->m0(id2);
92 m3 = particleDataPtr->m0(id3);
98 void Upsilon::setInternal (
int idResIn,
int id1In,
int id2In,
int id3In,
99 int idIntIn,
int idInt2In) {
101 setInternal2(idResIn, id1In, id2In, id3In, idIntIn);
104 mInt = particleDataPtr->m0(idInt);
105 gammaInt = particleDataPtr->mWidth(idInt);
106 mInt2 = particleDataPtr->m0(idInt2);
107 gammaInt2 = particleDataPtr->mWidth(idInt2);
109 iX = coupSUSYPtr->typeNeut(idRes);
111 iSq = (idInt>1000000)? 3 + (idInt%10+1)/2 : (idInt%10+1)/2;
112 iSq2 = (idInt2>1000000)? 3 + (idInt2%10+1)/2 : (idInt2%10+1)/2;
113 isSqDown = (idIntIn % 2 == 1)?
true :
false;
114 m1 = particleDataPtr->m0(id1);
115 m2 = particleDataPtr->m0(id2);
116 m3 = particleDataPtr->m0(id3);
122 void Phi::setInternal (
int idResIn,
int id1In,
int id2In,
int id3In,
123 int idIntIn,
int idInt2In) {
125 setInternal2(idResIn, id1In, id2In, id3In, idIntIn);
128 mInt = particleDataPtr->m0(idInt);
129 gammaInt = particleDataPtr->mWidth(idInt);
130 mInt2 = particleDataPtr->m0(idInt2);
131 gammaInt2 = particleDataPtr->mWidth(idInt2);
133 iX = coupSUSYPtr->typeNeut(idRes);
135 iSq = (idInt>1000000)? 3 + (idInt%10+1)/2 : (idInt%10+1)/2;
136 iSq2 = (idInt2>1000000)? 3 + (idInt2%10+1)/2 : (idInt2%10+1)/2;
137 isSqDown = (idIntIn % 2 == 1)?
true :
false;
138 m1 = particleDataPtr->m0(id1);
139 m2 = particleDataPtr->m0(id2);
140 m3 = particleDataPtr->m0(id3);
146 double Psi::function(
double m12sq) {
148 double R, factor1, factor2, value;
151 if(m12sq > pow2(mInt) || abs(m12sq - pow2(mInt)) < gammaInt)
return 0;
153 R = 1.0/(pow2(m12sq-pow2(mInt)) + pow2(gammaInt*mInt));
155 factor1 = (norm(coupSUSYPtr->LsddX[iSq][iQ][iX])
156 + norm(coupSUSYPtr->RsddX[iSq][iQ][iX]))*
157 (mRes*mRes + m3*m3 - m12sq);
158 factor2 = 4.0 * real(coupSUSYPtr->LsddX[iSq][iQ][iX]
159 * conj(coupSUSYPtr->RsddX[iSq][iQ][iX])) * m3 * mRes;
162 factor1 = (norm(coupSUSYPtr->LsuuX[iSq][iQ][iX])
163 + norm(coupSUSYPtr->RsuuX[iSq][iQ][iX]))*
164 (mRes*mRes + m3*m3 - m12sq);
165 factor2 = 4.0 * real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
166 * conj(coupSUSYPtr->RsuuX[iSq][iQ][iX])) * m3 * mRes;
169 value = R * (m12sq - m1*m1 - m2*m2) * (factor1+factor2);
177 double Upsilon::function(
double m12sq) {
179 double R1,R2, S, factor1, factor2, value;
182 if(m12sq > pow2(mInt) || abs(m12sq - pow2(mInt)) < gammaInt)
return 0;
183 if(m12sq > pow2(mInt2) || abs(m12sq - pow2(mInt2)) < gammaInt2)
return 0;
185 R1 = 1.0/(pow2(m12sq-pow2(mInt)) + pow2(gammaInt*mInt));
186 R2 = 1.0/(pow2(m12sq-pow2(mInt2)) + pow2(gammaInt2*mInt2));
187 S = R1 * R2 * ((m12sq - pow2(mInt)) * (m12sq - pow2(mInt2))
188 + gammaInt * mInt * gammaInt2 * mInt2);
191 factor1 = real(coupSUSYPtr->LsddX[iSq][iQ][iX]
192 * conj(coupSUSYPtr->LsddX[iSq2][iQ][iX]))
193 + real(coupSUSYPtr->RsddX[iSq][iQ][iX]
194 * conj(coupSUSYPtr->RsddX[iSq2][iQ][iX]));
195 factor2 = real(coupSUSYPtr->LsddX[iSq][iQ][iX]
196 * conj(coupSUSYPtr->RsddX[iSq2][iQ][iX]))
197 + real(coupSUSYPtr->RsddX[iSq][iQ][iX]
198 * conj(coupSUSYPtr->LsddX[iSq2][iQ][iX]));
200 factor1 = real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
201 * conj(coupSUSYPtr->LsuuX[iSq2][iQ][iX]))
202 + real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
203 * conj(coupSUSYPtr->RsuuX[iSq2][iQ][iX]));
204 factor2 = real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
205 * conj(coupSUSYPtr->RsuuX[iSq2][iQ][iX]))
206 + real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
207 * conj(coupSUSYPtr->LsuuX[iSq2][iQ][iX]));
210 value = S * (m12sq - pow2(m1) - pow2(m2)) *
211 ( factor1 * (pow2(mRes) + pow2(m3) - m12sq) + 2.0 * factor2 * m3 * mRes);
222 double Phi::function(
double m12sqIn) {
226 if(m12sq > pow2(mInt) || abs(m12sq - pow2(mInt)) < gammaInt)
return 0;
228 double m23max, m23min, E2, E3;
230 E2 = (m12sq - pow2(m1) - pow2(m2))/(2.0 * sqrt(m12sq));
231 E3 = (pow2(mRes) - m12sq - pow2(m3))/(2.0 * sqrt(m12sq));
232 m23max = pow2(E2+E3) - (sqrt(E2*E2 - m2*m2) - sqrt(E3*E3 - m3*m3)) ;
233 m23min = pow2(E2+E3) - (sqrt(E2*E2 - m2*m2) + sqrt(E3*E3 - m3*m3)) ;
235 if(E2 < m2 || E3 < m3){
236 cout <<
"Error in Phi:function"<<endl;
240 double integral2 = integrateGauss(m23min,m23max,1.0e-4);
246 double Phi::function2(
double m23sq) {
249 if(m23sq > pow2(mInt2) || abs(m23sq - pow2(mInt2)) < gammaInt2)
return 0;
251 double R1, R2, S, factor1, factor2, factor3, factor4, value, fac;
254 R1 = 1.0/(pow2(m12sq-pow2(mInt)) + pow2(gammaInt*mInt));
255 R2 = 1.0/(pow2(m12sq-pow2(mInt2)) + pow2(gammaInt2*mInt2));
256 S = R1 * R2 * ((m12sq - pow2(mInt)) * (m12sq - pow2(mInt2))
257 + gammaInt * mInt * gammaInt2 * mInt2);
263 iQ2 = (id1%2 == 1)? (id1+1)/2 : (id2+1)/2;
265 if(mRes > mInt2 + particleDataPtr->m0(iQ2)) fac = 0.;
267 factor1 = m1 * m3 * real(coupSUSYPtr->LsddX[iSq][iQ][iX]
268 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
269 * (m12sq + m23sq - pow2(m1) - pow2(m3));
270 factor2 = m1 * mRes * real(coupSUSYPtr->RsddX[iSq][iQ][iX]
271 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
272 * (m23sq - pow2(m2) - pow2(m3));
273 factor3 = m3 * mRes * real(coupSUSYPtr->LsddX[iSq][iQ][iX]
274 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
275 * (m12sq - pow2(m1) - pow2(m2));
276 factor4 = m3 * mRes * real(coupSUSYPtr->RsddX[iSq][iQ][iX]
277 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
278 * (m12sq * m23sq - pow2(m1 * m3) - pow2(m2 * mRes));
284 if(mRes > mInt2 + particleDataPtr->m0(iQ2)) fac = 0.;
286 factor1 = m1 * m3 * real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
287 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
288 * (m12sq + m23sq - pow2(m1) - pow2(m3));
289 factor2 = m1 * mRes * real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
290 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
291 * (m23sq - pow2(m2) - pow2(m3));
292 factor3 = m3 * mRes * real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
293 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
294 * (m12sq - pow2(m1) - pow2(m2));
295 factor4 = m3 * mRes * real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
296 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
297 * (m12sq * m23sq - pow2(m1 * m3) - pow2(m2 * mRes));
303 if(mRes > mInt2 + particleDataPtr->m0(iQ2)) fac = 0.;
305 factor1 += m2 * m3 * real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
306 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
307 * (m12sq + m23sq - pow2(m2) - pow2(m3));
308 factor2 += m2 * mRes * real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
309 * conj(coupSUSYPtr->LsddX[iSq2][iQ2][iX]))
310 * (m23sq - pow2(m1) - pow2(m3));
311 factor3 += m3 * mRes * real(coupSUSYPtr->LsuuX[iSq][iQ][iX]
312 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
313 * (m12sq - pow2(m2) - pow2(m1));
314 factor4 += m3 * mRes * real(coupSUSYPtr->RsuuX[iSq][iQ][iX]
315 * conj(coupSUSYPtr->RsddX[iSq2][iQ2][iX]))
316 * (m12sq * m23sq - pow2(m2 * m3) - pow2(m1 * mRes));
319 value = S * (factor1 + factor2 + factor3 + factor4);
324 return (fac * value);
329 double Phi::integrateGauss(
double xlo,
double xhi,
double tol) {
332 static double x8[4]={0.96028985649753623,
335 0.18343464249564980};
336 static double w8[4]={0.10122853629037626,
339 0.36268378337836198};
341 static double x16[8]={0.98940093499164993,
348 0.09501250983763744};
349 static double w16[8]={0.027152459411754095,
350 0.062253523938647893,
351 0.095158511682492785,
356 0.18945061045506850};
359 cerr<<
"xlo = xhi"<<endl;
363 cerr<<
" (integrateGauss:) -> xhi < xlo"<<endl;
368 double c = 0.001/abs(xhi-xlo);
376 double zmi = 0.5*(zhi+zlo);
377 double zmr = 0.5*(zhi-zlo);
381 for (
int i=0;i<4;i++) {
382 double dz = zmr * x8[i];
383 s8 += w8[i]*(function2(zmi+dz) + function2(zmi-dz));
387 for (
int i=0;i<8;i++) {
388 double dz = zmr * x16[i];
389 s16 += w16[i]*(function2(zmi+dz) + function2(zmi-dz));
392 if (abs(s16-s8) < tol*(1+abs(s16))) {
399 if ( zlo == zhi ) nextbin =
false;
402 if (1.0 + c*abs(zmr) == 1.0) {
403 cerr <<
" (integrateGauss:) too high accuracy required"<<endl;
419 const bool SUSYResonanceWidths::DEBUG =
false;
423 bool SUSYResonanceWidths::init(Info* infoPtrIn, Settings* settingsPtrIn,
424 ParticleData* particleDataPtrIn, Couplings* couplingsPtrIn) {
428 settingsPtr = settingsPtrIn;
429 particleDataPtr = particleDataPtrIn;
430 coupSUSYPtr = (couplingsPtrIn->isSUSY ? (CoupSUSY *) couplingsPtrIn: 0 );
433 bool calcWidthAllow =
true;
434 if(!couplingsPtrIn->isSUSY) calcWidthAllow =
false;
437 minWidth = settingsPtr->parm(
"ResonanceWidths:minWidth");
438 minThreshold = settingsPtr->parm(
"ResonanceWidths:minThreshold");
441 particlePtr = particleDataPtr->particleDataEntryPtr(idRes);
442 if (particlePtr == 0) {
443 infoPtr->errorMsg(
"Error in ResonanceWidths::init:"
444 " unknown resonance identity code");
450 if (idRes == 35 || idRes == 36 || idRes == 37
451 || idRes/1000000 == 3) isGeneric =
false;
454 hasAntiRes = particlePtr->hasAnti();
455 mRes = particlePtr->m0();
456 GammaRes = particlePtr->mWidth();
460 if (GammaRes < minWidth) GammaRes = 0.1 * minWidth;
461 GamMRat = GammaRes / mRes;
468 doForceWidth = particlePtr->doForceWidth();
472 if (particlePtr == 0) infoPtr->errorMsg(
"Error in ResonanceWidths::init:"
473 " unknown resonance identity code");
476 bool hasDecayTable =
false;
478 for(
unsigned int iDec = 1; iDec < (coupSUSYPtr->slhaPtr)->decays.size();
480 if(!hasDecayTable) hasDecayTable
481 = ((coupSUSYPtr->slhaPtr)->decays[iDec].getId() == abs(idRes));
484 if(hasDecayTable && settingsPtr->flag(
"SLHA:useDecayTable")) {
485 calcWidthAllow =
false;
486 if(DEBUG) cout<<
"Found decay table for:"<<idRes<<endl;
501 double openSecPos, openSecNeg;
504 for (
int i = 0; i < particlePtr->sizeChannels(); ++i) {
506 onMode = particlePtr->channel(i).onMode();
507 meMode = particlePtr->channel(i).meMode();
508 mult = particlePtr->channel(i).multiplicity();
512 if ( meMode < 0 || meMode > 103 || (isGeneric && meMode < 100) ) {
513 infoPtr->errorMsg(
"Error in ResonanceWidths::init:"
514 " resonance meMode not acceptable");
518 if (meMode == 103 && GammaRes > 0. && calcWidthAllow &&
519 (!settingsPtr->flag(
"SLHA:useDecayTable") || !hasDecayTable)) {
521 id1 = particlePtr->channel(i).product(0);
522 id2 = particlePtr->channel(i).product(1);
527 if (id2Abs > id1Abs) {swap( id1, id2); swap( id1Abs, id2Abs);}
531 id3 = particlePtr->channel(i).product(2);
535 if (id3Abs > id2Abs) {swap( id2, id3); swap( id2Abs, id3Abs);}
536 if (id2Abs > id1Abs) {swap( id1, id2); swap( id1Abs, id2Abs);}
540 mf1 = particleDataPtr->m0(id1Abs);
541 mf2 = particleDataPtr->m0(id2Abs);
542 mr1 = pow2(mf1 / mHat);
543 mr2 = pow2(mf2 / mHat);
544 ps = (mHat < mf1 + mf2 + MASSMARGIN) ? 0.
545 : sqrtpos( pow2(1. - mr1 - mr2) - 4. * mr1 * mr2 ) * pow2(mHat);
547 mf3 = particleDataPtr->m0(id3Abs);
548 mr3 = pow2(mf3 / mHat);
552 if(mHat < mf1 + mf2 + mf3 + MASSMARGIN) ps = 0.;
560 else widNow = GammaRes * particlePtr->channel(i).bRatio();
565 if (widNow > 0.)
for (
int j = 0; j < mult; ++j) {
566 idNow = particlePtr->channel(i).product(j);
567 idAnti = (particleDataPtr->hasAnti(idNow)) ? -idNow : idNow;
570 if (idNow == 23 || abs(idNow) == 24
571 || particleDataPtr->m0(abs(idNow)) < mRes) {
572 openSecPos *= particleDataPtr->resOpenFrac(idNow);
573 openSecNeg *= particleDataPtr->resOpenFrac(idAnti);
578 particlePtr->channel(i).onShellWidth(widNow);
579 particlePtr->channel(i).openSec( idRes, openSecPos);
580 particlePtr->channel(i).openSec(-idRes, openSecNeg);
584 if (onMode == 1 || onMode == 2) widPos += widNow * openSecPos;
585 if (onMode == 1 || onMode == 3) widNeg += widNow * openSecNeg;
589 if (widTot < minWidth) {
590 particlePtr->setMayDecay(
false,
false);
591 particlePtr->setMWidth(0.,
false);
592 for (
int i = 0; i < particlePtr->sizeChannels(); ++i)
593 particlePtr->channel(i).bRatio( 0.,
false);
599 for (
int i = 0; i < particlePtr->sizeChannels(); ++i) {
600 bRatio = particlePtr->channel(i).onShellWidth() / widTot;
601 particlePtr->channel(i).bRatio( bRatio,
false);
606 forceFactor = GammaRes / widTot;
607 for (
int i = 0; i < particlePtr->sizeChannels(); ++i)
608 particlePtr->channel(i).onShellWidthFactor( forceFactor);
613 particlePtr->setMWidth(widTot,
false);
618 GamMRat = GammaRes / mRes;
619 openPos = widPos / widTot;
620 openNeg = widNeg / widTot;
636 void ResonanceSquark::initConstants() {
639 alpS = coupSUSYPtr->alphaS(mHat * mHat );
640 alpEM = coupSUSYPtr->alphaEM(mHat * mHat);
641 s2W = coupSUSYPtr->sin2W;
648 void ResonanceSquark::calcPreFac(
bool) {
651 preFac = 1.0 / (s2W * pow(mHat,3));
659 void ResonanceSquark::calcWidth(
bool) {
663 bool idown = (abs(idRes)%2 == 0 ?
false :
true);
664 int isq = (abs(idRes)/ksusy == 2) ?
665 (abs(idRes)%10+1)/2 + 3: (abs(idRes)%10+1)/2;
672 kinFac = (mHat * mHat - mf1 * mf1 - mf2 * mf2);
674 double fac = 0.0 , wid = 0.0;
678 if(id1Abs < 7 && id2Abs < 7){
681 int iq1 = (id1Abs + 1)/2;
682 int iq2 = (id2Abs + 1)/2;
685 if(!coupSUSYPtr->isUDD) {widNow = 0;
return;}
689 fac = 2.0 * kinFac / (16.0 * M_PI * pow(mHat,3));
692 if ((id1Abs+id2Abs)%2 == 1){
694 for(
int isq2 = 1; isq2 < 4; isq2++)
695 wid += norm(coupSUSYPtr->rvUDD[iq2][iq1][isq2]
696 * coupSUSYPtr->Rdsq[isq][isq2+3]);
698 for(
int isq2 = 1; isq2 < 4; isq2++)
699 wid += norm(coupSUSYPtr->rvUDD[iq1][iq2][isq2]
700 * coupSUSYPtr->Rdsq[isq][isq2+3]);
704 if ((id1Abs+id2Abs)%2 != 0) widNow = 0.0;
706 for(
int isq2 = 1; isq2 < 4; isq2++)
707 wid += norm(coupSUSYPtr->rvUDD[isq2][iq1][iq2]
708 * coupSUSYPtr->Rusq[isq][isq2+3]);
713 else if(id1Abs < 17 && id2Abs < 7){
714 if(!coupSUSYPtr->isLQD) {widNow = 0;
return;}
716 int ilep = (id1Abs - 9)/2;
717 int iq = (id2Abs + 1)/2;
719 fac = kinFac / (16.0 * M_PI * pow(mHat,3));
724 for(
int isq2=1; isq2<3; isq2++)
725 wid += norm(coupSUSYPtr->Rdsq[isq][isq2+3]
726 * coupSUSYPtr->rvLQD[ilep][iq][isq2]);
729 for(
int isq2=1; isq2<3; isq2++)
730 wid += norm(coupSUSYPtr->Rdsq[isq][isq2]
731 * coupSUSYPtr->rvLQD[ilep][isq2][isq2]);
735 if(iq%2 == 0) {widNow = 0.0;
return;}
737 for(
int isq2=1; isq2<3; isq2++)
738 wid += norm(coupSUSYPtr->Rusq[isq][isq2]
739 * coupSUSYPtr->rvLQD[ilep][isq2][iq]);
744 else if (id1Abs > ksusy && id2Abs < 7) {
746 int iq = (id2Abs + 1)/2;
749 if(id1Abs == 1000021 && idRes%10 == id2Abs) {
751 fac = 2.0 * alpS / (3.0 * pow3(mHat));
753 wid = kinFac * (norm(coupSUSYPtr->LsddG[isq][iq])
754 + norm(coupSUSYPtr->RsddG[isq][iq]))
755 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsddG[isq][iq]
756 * conj(coupSUSYPtr->RsddG[isq][iq]));
758 wid = kinFac * (norm(coupSUSYPtr->LsuuG[isq][iq])
759 + norm(coupSUSYPtr->RsuuG[isq][iq]))
760 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsuuG[isq][iq]
761 * conj(coupSUSYPtr->RsuuG[isq][iq]));
764 for(
int i=1; i<6 ; i++){
766 if(coupSUSYPtr->idNeut(i)==id1Abs && idRes%2 == id2Abs%2){
767 fac = alpEM * preFac / (2.0 * (1 - s2W));
769 wid = kinFac * (norm(coupSUSYPtr->LsddX[isq][iq][i])
770 + norm(coupSUSYPtr->RsddX[isq][iq][i]))
771 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsddX[isq][iq][i]
772 * conj(coupSUSYPtr->RsddX[isq][iq][i]));
774 wid = kinFac * (norm(coupSUSYPtr->LsuuX[isq][iq][i])
775 + norm(coupSUSYPtr->RsuuX[isq][iq][i]))
776 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsuuX[isq][iq][i]
777 * conj(coupSUSYPtr->RsuuX[isq][iq][i]));
781 else if (i < 3 && coupSUSYPtr->idChar(i)==id1Abs
782 && idRes%2 != id2Abs%2){
784 fac = alpEM * preFac / (4.0 * (1 - s2W));
786 wid = kinFac * (norm(coupSUSYPtr->LsduX[isq][iq][i])
787 + norm(coupSUSYPtr->RsduX[isq][iq][i]))
788 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsduX[isq][iq][i]
789 * conj(coupSUSYPtr->RsduX[isq][iq][i]));
791 wid = kinFac * (norm(coupSUSYPtr->LsudX[isq][iq][i])
792 + norm(coupSUSYPtr->RsudX[isq][iq][i]))
793 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsudX[isq][iq][i]
794 * conj(coupSUSYPtr->RsudX[isq][iq][i]));
800 else if (id1Abs > ksusy && id1Abs%100 < 7
801 && (id2Abs == 23 || id2Abs == 24)){
804 fac = alpEM * preFac/(16.0 * pow2(particleDataPtr->m0(id2Abs))
805 * (1.0 - s2W)) * pow2(ps) ;
807 int isq2 = (id1Abs/ksusy == 2) ? (id1Abs%10+1)/2 + 3: (id1Abs%10+1)/2;
809 if(id2Abs == 23 && id1Abs%2 == idRes%2){
811 wid = norm(coupSUSYPtr->LsdsdZ[isq][isq2]
812 + coupSUSYPtr->RsdsdZ[isq][isq2]);
814 wid = norm(coupSUSYPtr->LsusuZ[isq][isq2]
815 + coupSUSYPtr->RsusuZ[isq][isq2]);
817 else if (id2Abs == 24 && id1Abs%2 != idRes%2){
819 wid = norm(coupSUSYPtr->LsusdW[isq2][isq]);
821 wid = norm(coupSUSYPtr->LsusdW[isq][isq2]);
826 widNow = fac * wid * ps;
827 if(DEBUG) cout<<idRes<<
":: id1:"<<id1Abs<<
" id2:"<<id2Abs
828 <<
" Width: "<<widNow<<endl;
843 void ResonanceGluino::initConstants() {
846 alpS = coupSUSYPtr->alphaS(mHat * mHat);
854 void ResonanceGluino::calcPreFac(
bool) {
856 preFac = alpS /( 8.0 * pow(mHat,3));
864 void ResonanceGluino::calcWidth(
bool) {
869 kinFac = (mHat * mHat - mf1 * mf1 + mf2 * mf2);
871 if(id1Abs > 1000000 && (id1Abs % 100) < 7 && id2Abs < 7) {
873 int isq = (abs(id1Abs)/1000000 == 2) ? (abs(id1Abs)%10+1)/2 + 3
874 : (abs(id1Abs)%10+1)/2;
875 bool idown = id2Abs%2;
876 int iq = (id2Abs + 1)/2;
880 widNow = kinFac * (norm(coupSUSYPtr->LsddG[isq][iq])
881 + norm(coupSUSYPtr->RsddG[isq][iq]))
882 + 4.0 * mHat * mf2 * real(coupSUSYPtr->LsddG[isq][iq]
883 * conj(coupSUSYPtr->RsddG[isq][iq]));
886 widNow = kinFac * (norm(coupSUSYPtr->LsuuG[isq][iq])
887 + norm(coupSUSYPtr->RsuuG[isq][iq]))
888 + 4.0 * mHat * mf2 * real(coupSUSYPtr->LsuuG[isq][iq]
889 * conj(coupSUSYPtr->RsuuG[isq][iq]));
891 widNow = widNow * preFac * ps;
893 cout<<
"Gluino:: id1:"<<id1Abs<<
" id2:"<<id2Abs<<
" Width: ";
894 cout<<scientific<<widNow<<endl;
908 void ResonanceNeut::initConstants(){
910 alpEM = coupSUSYPtr->alphaEM(mHat * mHat);
911 s2W = coupSUSYPtr->sin2W;
914 psi.init(particleDataPtr,coupSUSYPtr);
915 phi.init(particleDataPtr,coupSUSYPtr);
916 upsil.init(particleDataPtr,coupSUSYPtr);
922 void ResonanceNeut::calcPreFac(
bool){
925 preFac = alpEM / (8.0 * s2W * pow(mHat,3));
932 void ResonanceNeut::calcWidth(
bool){
940 kinFac = mHat * mHat - mf1 * mf1 + mf2 * mf2;
941 kinFac2 = pow(mHat,4) + pow(mf1,4) - 2.0 * pow(mf2,4)
942 + pow2(mHat) * pow2(mf2) + pow2(mf1) * pow2(mf2)
943 - 2.0 * pow2(mHat) * pow2(mf1);
946 if(idRes == 1000022)
return;
949 int iNeut1 = coupSUSYPtr->typeNeut(idRes);
950 int iNeut2 = coupSUSYPtr->typeNeut(id1Abs);
951 int iChar1 = coupSUSYPtr->typeChar(id1Abs);
953 if(iNeut2>0 && id2Abs == 23){
955 fac = kinFac2 * (norm(coupSUSYPtr->OLpp[iNeut1][iNeut2])
956 + norm(coupSUSYPtr->ORpp[iNeut1][iNeut2]));
957 fac -= 12.0 * mHat * mf1 * pow2(mf2)
958 * real(coupSUSYPtr->OLpp[iNeut1][iNeut2]
959 * conj(coupSUSYPtr->ORpp[iNeut1][iNeut2]));
960 fac /= pow2(mf2) * (1.0 - s2W);
962 else if(iChar1>0 && id2Abs==24){
965 fac = kinFac2 * (norm(coupSUSYPtr->OL[iNeut1][iChar1])
966 + norm(coupSUSYPtr->OR[iNeut1][iChar1]));
967 fac -= 12.0 * mHat * mf1 * pow2(mf2)
968 * real(coupSUSYPtr->OL[iNeut1][iChar1]
969 * conj(coupSUSYPtr->OR[iNeut1][iChar1]));
972 else if(id1Abs > 1000000 && id1Abs%100 < 7 && id2Abs < 7){
974 bool idown = (id1Abs%2 == 1);
975 int iq = (id2Abs + 1 )/ 2;
976 int isq = (abs(id1Abs)/1000000 == 2) ? (abs(id1Abs)%10+1)/2 + 3
977 : (abs(id1Abs)%10+1)/2;
980 fac = kinFac * (norm(coupSUSYPtr->LsddX[isq][iq][iNeut1])
981 + norm(coupSUSYPtr->RsddX[isq][iq][iNeut1]));
982 fac += 4.0 * mHat * mf2 * real(coupSUSYPtr->LsddX[isq][iq][iNeut1]
983 * conj(coupSUSYPtr->RsddX[isq][iq][iNeut1]));
986 fac = kinFac * (norm(coupSUSYPtr->LsuuX[isq][iq][iNeut1])
987 + norm(coupSUSYPtr->RsuuX[isq][iq][iNeut1]));
988 fac += 4.0 * mHat * mf2 * real(coupSUSYPtr->LsuuX[isq][iq][iNeut1]
989 * conj(coupSUSYPtr->RsuuX[isq][iq][iNeut1]));
992 fac *= 6.0/(1 - s2W);
994 else if(id1Abs > 1000000 && id1Abs%100 > 10 && id1Abs%100 < 17
997 bool idown = id2Abs%2;
998 int il = (id2Abs - 9)/ 2;
999 int isl = (abs(id1Abs)/1000000 == 2) ? (abs(id1Abs)%10+1)/2 + 3
1000 : (abs(id1Abs)%10+1)/2;
1003 fac = kinFac * (norm(coupSUSYPtr->LsllX[isl][il][iNeut1])
1004 + norm(coupSUSYPtr->RsllX[isl][il][iNeut1]));
1005 fac += 4.0 * mHat * mf2 * real(coupSUSYPtr->LsllX[isl][il][iNeut1]
1006 * conj(coupSUSYPtr->RsllX[isl][il][iNeut1]));
1009 fac = kinFac * (norm(coupSUSYPtr->LsvvX[isl][il][iNeut1]));
1011 fac *= 2.0/(1 - s2W);
1015 widNow = fac * preFac * ps ;
1017 cout<<idRes<<
":: id1:"<<id1Abs<<
" id2:"<<id2Abs<<
" Width: ";
1018 cout<<scientific<<widNow<<endl;
1025 if(!coupSUSYPtr->isUDD)
return;
1027 if(id1Abs < 7 && id2Abs < 7 && id3Abs < 7){
1030 if((id1Abs+id2Abs+id3Abs)%2 == 1)
return;
1031 double rvfac,m12min,m12max,integral;
1035 for(
int idIntRes = 1; idIntRes <= 6; idIntRes++){
1037 for (
int iSq = 1; iSq <= 3; iSq++){
1038 double m1, m2, m3, mixfac1(0.), mixfac2(0.), mixfac3(0.);
1039 int itemp1,itemp2,itemp3;
1041 for(
int itype = 1; itype<=3; itype++){
1045 if(itype ==1 ) idInt = coupSUSYPtr->idSup(idIntRes);
1046 else idInt = coupSUSYPtr->idSdown(idIntRes);
1053 coupSUSYPtr->rvUDD[iSq][(id2Abs+1)/2][(id3Abs+1)/2]);
1054 }
else if (itype ==2){
1059 coupSUSYPtr->rvUDD[(id1Abs+1)/2][iSq][(id3Abs+1)/2]);
1065 coupSUSYPtr->rvUDD[(id1Abs+1)/2][(id2Abs+1)/2][iSq]);
1067 }
else if(id2Abs%2 == 0){
1073 coupSUSYPtr->rvUDD[iSq][(id1Abs+1)/2][(id3Abs+1)/2]);
1074 }
else if (itype ==2){
1079 coupSUSYPtr->rvUDD[(id2Abs+1)/2][iSq][(id3Abs+1)/2]);
1085 coupSUSYPtr->rvUDD[(id2Abs+1)/2][(id2Abs+1)/2][iSq]);
1093 coupSUSYPtr->rvUDD[iSq][(id1Abs+1)/2][(id2Abs+1)/2]);
1094 }
else if (itype ==2){
1099 coupSUSYPtr->rvUDD[(id3Abs+1)/2][iSq][(id2Abs+1)/2]);
1105 coupSUSYPtr->rvUDD[(id3Abs+1)/2][(id1Abs+1)/2][iSq]);
1110 m1 = particleDataPtr->m0(itemp1);
1111 m2 = particleDataPtr->m0(itemp2);
1112 m3 = particleDataPtr->m0(itemp3);
1114 m12min = pow2(m1+m2);
1115 m12max = pow2(mHat-m3);
1118 if(mRes > particleDataPtr->m0(idInt) + particleDataPtr->m0(itemp3))
1122 psi.setInternal(idRes, itemp1, itemp2, itemp3, idInt, 0);
1125 mixfac1 = norm(coupSUSYPtr->Rusq[idIntRes][iSq+3]);
1127 mixfac1 = norm(coupSUSYPtr->Rdsq[idIntRes][iSq+3]);
1129 if(abs(rvfac * mixfac1) > 1.0e-8) {
1130 integral = integrateGauss(&psi,m12min,m12max,1.0e-4);
1131 widNow += rvfac * mixfac1 * integral;
1140 for (
int idIntRes2 = 1; idIntRes2 <= 6; idIntRes2++){
1141 if(idIntRes2 == idIntRes)
continue;
1144 idInt2 = coupSUSYPtr->idSup(idIntRes2);
1145 mixfac2 = 2.0 * real(coupSUSYPtr->Rusq[idIntRes][iSq+3]
1146 * conj(coupSUSYPtr->Rusq[idIntRes2][iSq+3]));
1148 idInt2 = coupSUSYPtr->idSdown(idIntRes2);
1149 mixfac2 = 2.0 * real(coupSUSYPtr->Rdsq[idIntRes][iSq+3]
1150 * conj(coupSUSYPtr->Rdsq[idIntRes2][iSq+3]));
1154 if(mRes > particleDataPtr->m0(idInt2)
1155 + particleDataPtr->m0(itemp3))
continue;
1157 upsil.setInternal(idRes,itemp1, itemp2,itemp3,idInt,idInt2);
1158 if(abs(rvfac * mixfac2) > 0.0) {
1159 integral = integrateGauss(&upsil,m12min,m12max,1.0e-4);
1160 widNow += rvfac * mixfac2 * integral;
1171 for (
int idIntRes2 = 1; idIntRes2 <= 6; idIntRes2++){
1172 if(itype != 1 && idIntRes2 == idIntRes)
continue;
1175 for (
int iSq2 = 1; iSq2 <= 3; iSq2++){
1177 idInt2 = coupSUSYPtr->idSdown(idIntRes2);
1178 mixfac3 = 2.0 * real(coupSUSYPtr->Rusq[idIntRes][iSq+3]
1179 * conj(coupSUSYPtr->Rdsq[idIntRes2][iSq2+3]));
1181 idInt2 = coupSUSYPtr->idSdown(idIntRes2);
1182 mixfac3 = 2.0 * real(coupSUSYPtr->Rdsq[idIntRes][iSq+3]
1183 * conj(coupSUSYPtr->Rdsq[idIntRes2][iSq2+3]));
1186 if(abs(rvfac * mixfac3) > 0.0) {
1187 phi.setInternal(idRes,itemp1, itemp2,itemp3,idInt,idInt2);
1190 integral = integrateGauss(&phi,m12min,m12max,1.0e-4);
1191 widNow -= rvfac * mixfac2 * integral;
1201 widNow *= 12.0 /(pow3(2.0 * M_PI * mHat) * 32.0);
1215 void ResonanceChar::initConstants(){
1217 alpEM = coupSUSYPtr->alphaEM(mHat * mHat);
1218 s2W = coupSUSYPtr->sin2W;
1225 void ResonanceChar::calcPreFac(
bool){
1227 preFac = alpEM / (8.0 * s2W * pow(mHat,3));
1234 void ResonanceChar::calcWidth(
bool){
1237 if(ps == 0.)
return;
1241 kinFac = mHat * mHat - mf1 * mf1 + mf2 * mf2;
1242 kinFac2 = pow(mHat,4) + pow(mf1,4) - 2.0 * pow(mf2,4)
1243 + pow2(mHat) * pow2(mf2) + pow2(mf1)
1244 * pow2(mf2) - 2.0 * pow2(mHat) * pow2(mf1);
1246 int idChar1 = coupSUSYPtr->typeChar(idRes);
1247 int idChar2 = coupSUSYPtr->typeChar(id1Abs);
1248 int idNeut1 = coupSUSYPtr->typeNeut(id1Abs);
1250 if(idChar2>0 && id2Abs == 23){
1252 fac = kinFac2 * (norm(coupSUSYPtr->OLp[idChar1][idChar2])
1253 + norm(coupSUSYPtr->ORp[idChar1][idChar2]));
1254 fac -= 12.0 * mHat * mf1 * pow2(mf2)
1255 * real(coupSUSYPtr->OLp[idChar1][idChar2]
1256 * conj(coupSUSYPtr->ORp[idChar1][idChar2]));
1257 fac /= pow2(mf2) * (1.0 - s2W);
1259 else if(idNeut1>0 && id2Abs==24){
1262 fac = kinFac2 * (norm(coupSUSYPtr->OL[idNeut1][idChar1])
1263 + norm(coupSUSYPtr->OR[idNeut1][idChar1]));
1264 fac -= 12.0 * mHat * mf1 * pow2(mf2)
1265 * real(coupSUSYPtr->OL[idNeut1][idChar1]
1266 * conj(coupSUSYPtr->OR[idNeut1][idChar1]));
1269 else if(id1Abs > 1000000 && id1Abs%100 < 7 && id2Abs < 7){
1271 bool idown = (id1Abs%2 == 1);
1272 int iq = (id2Abs + 1 )/ 2;
1273 int isq = (abs(id1Abs)/1000000 == 2) ? (abs(id1Abs)%10+1)/2 + 3
1274 : (abs(id1Abs)%10+1)/2;
1277 fac = kinFac * (norm(coupSUSYPtr->LsduX[isq][iq][idChar1])
1278 + norm(coupSUSYPtr->RsduX[isq][iq][idChar1]));
1279 fac += 4.0 * mHat * mf2
1280 * real(coupSUSYPtr->LsduX[isq][iq][idChar1]
1281 * conj(coupSUSYPtr->RsduX[isq][iq][idChar1]));
1284 fac = kinFac * (norm(coupSUSYPtr->LsudX[isq][iq][idChar1])
1285 + norm(coupSUSYPtr->RsudX[isq][iq][idChar1]));
1286 fac += 4.0 * mHat * mf2
1287 * real(coupSUSYPtr->LsudX[isq][iq][idChar1]
1288 * conj(coupSUSYPtr->RsudX[isq][iq][idChar1]));
1290 fac *= 6.0/(1 - s2W);
1292 else if(id1Abs > 1000000 && id1Abs%100 > 10 && id1Abs%100 < 17
1295 bool idown = id2Abs%2;
1296 int il = (id2Abs - 9)/ 2;
1297 int isl = (abs(id1Abs)/1000000 == 2) ? (abs(id1Abs)%10+1)/2 + 3
1298 : (abs(id1Abs)%10+1)/2;
1301 fac = kinFac * (norm(coupSUSYPtr->LslvX[isl][il][idChar1])
1302 + norm(coupSUSYPtr->RslvX[isl][il][idChar1]));
1303 fac += 4.0 * mHat * mf2 * real(coupSUSYPtr->LslvX[isl][il][idChar1]
1304 * conj(coupSUSYPtr->RslvX[isl][il][idChar1]));
1307 fac = kinFac * (norm(coupSUSYPtr->LsvlX[isl][il][idChar1]));
1309 fac *= 2.0/(1 - s2W);
1313 widNow = fac * preFac * ps ;
1315 cout<<idRes<<
":: id1:"<<id1Abs<<
" id2:"<<id2Abs<<
" Width: ";
1316 cout<<scientific<<widNow<<endl;
1333 void ResonanceSlepton::initConstants() {
1336 alpEM = coupSUSYPtr->alphaEM(mHat * mHat);
1337 s2W = coupSUSYPtr->sin2W;
1344 void ResonanceSlepton::calcPreFac(
bool) {
1347 preFac = 1.0 / (s2W * pow(mHat,3));
1355 void ResonanceSlepton::calcWidth(
bool) {
1358 int ksusy = 1000000;
1359 int isl = (abs(idRes)/ksusy == 2) ? (abs(idRes)%10+1)/2 + 3
1360 : (abs(idRes)%10+1)/2;
1361 int il = (id2Abs-9)/2;
1362 bool islep = idRes%2;
1365 if(ps == 0.)
return;
1368 kinFac = (mHat * mHat - mf1 * mf1 - mf2 * mf2);
1370 double fac = 0.0 , wid = 0.0;
1375 if (id1Abs > ksusy && id2Abs > 10 && id2Abs < 17) {
1376 for(
int i=1; i<6 ; i++){
1378 if(coupSUSYPtr->idNeut(i)==id1Abs && idRes%2 == id2Abs%2){
1379 fac = alpEM * preFac / (2.0 * (1 - s2W));
1381 wid = kinFac * (norm(coupSUSYPtr->LsllX[isl][il][i])
1382 + norm(coupSUSYPtr->RsllX[isl][il][i]))
1383 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsllX[isl][il][i]
1384 * conj(coupSUSYPtr->RsllX[isl][il][i]));
1386 wid = kinFac * (norm(coupSUSYPtr->LsvvX[isl][il][i])
1387 + norm(coupSUSYPtr->RsvvX[isl][il][i]))
1388 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LsvvX[isl][il][i]
1389 * conj(coupSUSYPtr->RsvvX[isl][il][i]));
1393 else if (i < 3 && coupSUSYPtr->idChar(i)==id1Abs
1394 && idRes%2 != id2Abs%2){
1396 fac = alpEM * preFac / (4.0 * (1 - s2W));
1398 wid = kinFac * (norm(coupSUSYPtr->LslvX[isl][il][i])
1399 + norm(coupSUSYPtr->RslvX[isl][il][i]))
1400 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LslvX[isl][il][i]
1401 * conj(coupSUSYPtr->RslvX[isl][il][i]));
1403 wid = kinFac * (norm(coupSUSYPtr->LslvX[isl][il][i])
1404 + norm(coupSUSYPtr->RslvX[isl][il][i]))
1405 - 4.0 * mHat * mf2 * real(coupSUSYPtr->LslvX[isl][il][i]
1406 * conj(coupSUSYPtr->RslvX[isl][il][i]));
1412 else if (id1Abs > ksusy+10 && id1Abs%100 < 17
1413 && (id2Abs == 23 || id2Abs == 24)){
1416 fac = alpEM * preFac/(16.0 * pow2(mf2) * (1.0 - s2W)) * pow2(ps) ;
1418 int isl2 = (id1Abs/ksusy == 2) ? (id1Abs%10+1)/2 + 3: (id1Abs%10+1)/2;
1420 if(id2Abs == 23 && id1Abs%2 == idRes%2){
1422 wid = norm(coupSUSYPtr->LslslZ[isl][isl2]
1423 + coupSUSYPtr->RslslZ[isl][isl2]);
1425 wid = norm(coupSUSYPtr->LsvsvZ[isl][isl2]
1426 + coupSUSYPtr->RsvsvZ[isl][isl2]);
1428 else if (id2Abs == 24 && id1Abs%2 != idRes%2){
1430 wid = norm(coupSUSYPtr->LslsvW[isl2][isl]);
1432 wid = norm(coupSUSYPtr->LslsvW[isl][isl2]);
1439 widNow = fac * wid * ps;
1440 if(DEBUG) cout<<idRes<<
":: id1:"<<id1Abs<<
" id2:"<<id2Abs
1441 <<
" Width: "<<widNow<<endl;
1451 double SUSYResonanceWidths::integrateGauss(WidthFunction* widthFn,
1452 double xlo,
double xhi,
double tol) {
1455 static double x8[4]={0.96028985649753623,
1456 0.79666647741362674,
1457 0.52553240991632899,
1458 0.18343464249564980};
1459 static double w8[4]={0.10122853629037626,
1460 0.22238103445337447,
1461 0.31370664587788729,
1462 0.36268378337836198};
1464 static double x16[8]={0.98940093499164993,
1465 0.94457502307323258,
1466 0.86563120238783174,
1467 0.75540440835500303,
1468 0.61787624440264375,
1469 0.45801677765722739,
1470 0.28160355077925891,
1471 0.09501250983763744};
1472 static double w16[8]={0.027152459411754095,
1473 0.062253523938647893,
1474 0.095158511682492785,
1475 0.12462897125553387,
1476 0.14959598881657673,
1477 0.16915651939500254,
1478 0.18260341504492359,
1479 0.18945061045506850};
1482 cerr<<
"xlo = xhi"<<endl;
1486 cerr<<
" (integrateGauss:) -> xhi < xlo"<<endl;
1491 double c = 0.001/abs(xhi-xlo);
1495 bool nextbin =
true;
1499 double zmi = 0.5*(zhi+zlo);
1500 double zmr = 0.5*(zhi-zlo);
1504 for (
int i=0;i<4;i++) {
1505 double dz = zmr * x8[i];
1506 s8 += w8[i]*(widthFn->function(zmi+dz) + widthFn->function(zmi-dz));
1510 for (
int i=0;i<8;i++) {
1511 double dz = zmr * x16[i];
1512 s16 += w16[i]*(widthFn->function(zmi+dz) + widthFn->function(zmi-dz));
1515 if (abs(s16-s8) < tol*(1+abs(s16))) {
1522 if ( zlo == zhi ) nextbin =
false;
1525 if (1.0 + c*abs(zmr) == 1.0) {
1526 cerr <<
" (integrateGauss:) too high accuracy required"<<endl;