]>
Commit | Line | Data |
---|---|---|
63ba5337 | 1 | // SusyResonanceWidths.cc is a part of the PYTHIA event generator. |
2 | // Copyright (C) 2012 Torbjorn Sjostrand | |
3 | // Authors: N. Desai, P. Skands | |
4 | // PYTHIA is licenced under the GNU GPL version 2, see COPYING for details. | |
5 | // Please respect the MCnet Guidelines, see GUIDELINES for details. | |
6 | ||
7 | // Function definitions (not found in the header) for the | |
8 | // SUSY Resonance widths classes. | |
9 | ||
10 | #include "SusyResonanceWidths.h" | |
11 | #include "SusyCouplings.h" | |
12 | #include "PythiaComplex.h" | |
13 | ||
14 | namespace Pythia8 { | |
15 | ||
16 | //========================================================================== | |
17 | ||
18 | // WidthFunctions Class | |
19 | ||
20 | // Contains functions to be integrated for calculating the 3-body | |
21 | // decay widths | |
22 | ||
23 | //-------------------------------------------------------------------------- | |
24 | ||
25 | void WidthFunction::init( ParticleData* particleDataPtrIn, | |
26 | CoupSUSY* coupSUSYPtrIn) { | |
27 | ||
28 | particleDataPtr = particleDataPtrIn; | |
29 | coupSUSYPtr = coupSUSYPtrIn; | |
30 | ||
31 | } | |
32 | ||
33 | //-------------------------------------------------------------------------- | |
34 | ||
35 | void WidthFunction::setInternal2(int idResIn, int id1In, int id2In, | |
36 | int id3In, int idIntIn) { | |
37 | ||
38 | // Res -> 1,2,3 | |
39 | idRes = idResIn; | |
40 | id1 = id1In; | |
41 | id2 = id2In; | |
42 | id3 = id3In; | |
43 | idInt = idIntIn; | |
44 | ||
45 | mRes = particleDataPtr->m0(idRes); | |
46 | m1 = particleDataPtr->m0(id1); | |
47 | m2 = particleDataPtr->m0(id2); | |
48 | m3 = particleDataPtr->m0(id3); | |
49 | ||
50 | // Internal propagator | |
51 | mInt = particleDataPtr->m0(idInt); | |
52 | gammaInt = particleDataPtr->mWidth(idInt); | |
53 | ||
54 | return; | |
55 | } | |
56 | ||
57 | //-------------------------------------------------------------------------- | |
58 | ||
59 | double WidthFunction::function(double) { | |
60 | ||
61 | cout<<"Warning using dummy width function"<<endl; | |
62 | return 0.; | |
63 | } | |
64 | ||
65 | //-------------------------------------------------------------------------- | |
66 | ||
67 | double WidthFunction::function(double,double) { | |
68 | ||
69 | cout<<"Warning using dummy width function"<<endl; | |
70 | return 0.; | |
71 | } | |
72 | ||
73 | //========================================================================== | |
74 | ||
75 | // Psi, Upsilon and Phi classes. | |
76 | ||
77 | //-------------------------------------------------------------------------- | |
78 | ||
79 | void Psi::setInternal (int idResIn, int id1In, int id2In, int id3In, | |
80 | int idIntIn, int) { | |
81 | ||
82 | setInternal2(idResIn, id1In, id2In, id3In, idIntIn); | |
83 | ||
84 | mInt = particleDataPtr->m0(idInt); | |
85 | gammaInt = particleDataPtr->mWidth(idInt); | |
86 | iX = coupSUSYPtr->typeNeut(idRes); | |
87 | iQ = (id3+1)/2; | |
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); | |
93 | return; | |
94 | } | |
95 | ||
96 | //-------------------------------------------------------------------------- | |
97 | ||
98 | void Upsilon::setInternal (int idResIn, int id1In, int id2In, int id3In, | |
99 | int idIntIn, int idInt2In) { | |
100 | ||
101 | setInternal2(idResIn, id1In, id2In, id3In, idIntIn); | |
102 | ||
103 | idInt2 = idInt2In; | |
104 | mInt = particleDataPtr->m0(idInt); | |
105 | gammaInt = particleDataPtr->mWidth(idInt); | |
106 | mInt2 = particleDataPtr->m0(idInt2); | |
107 | gammaInt2 = particleDataPtr->mWidth(idInt2); | |
108 | ||
109 | iX = coupSUSYPtr->typeNeut(idRes); | |
110 | iQ = (id3+1)/2; | |
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); | |
117 | return; | |
118 | } | |
119 | ||
120 | //-------------------------------------------------------------------------- | |
121 | ||
122 | void Phi::setInternal (int idResIn, int id1In, int id2In, int id3In, | |
123 | int idIntIn, int idInt2In) { | |
124 | ||
125 | setInternal2(idResIn, id1In, id2In, id3In, idIntIn); | |
126 | ||
127 | idInt2 = idInt2In; | |
128 | mInt = particleDataPtr->m0(idInt); | |
129 | gammaInt = particleDataPtr->mWidth(idInt); | |
130 | mInt2 = particleDataPtr->m0(idInt2); | |
131 | gammaInt2 = particleDataPtr->mWidth(idInt2); | |
132 | ||
133 | iX = coupSUSYPtr->typeNeut(idRes); | |
134 | iQ = (id3+1)/2; | |
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); | |
141 | return; | |
142 | } | |
143 | ||
144 | //-------------------------------------------------------------------------- | |
145 | ||
146 | double Psi::function(double m12sq) { | |
147 | ||
148 | double R, factor1, factor2, value; | |
149 | ||
150 | // Check that the propagators are offshell | |
151 | if(m12sq > pow2(mInt) || abs(m12sq - pow2(mInt)) < gammaInt) return 0; | |
152 | ||
153 | R = 1.0/(pow2(m12sq-pow2(mInt)) + pow2(gammaInt*mInt)); | |
154 | if(isSqDown){ | |
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; | |
160 | ||
161 | } else { | |
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; | |
167 | } | |
168 | ||
169 | value = R * (m12sq - m1*m1 - m2*m2) * (factor1+factor2); | |
170 | ||
171 | return value; | |
172 | } | |
173 | ||
174 | ||
175 | //-------------------------------------------------------------------------- | |
176 | ||
177 | double Upsilon::function(double m12sq) { | |
178 | ||
179 | double R1,R2, S, factor1, factor2, value; | |
180 | ||
181 | // Check that the propagators are offshell | |
182 | if(m12sq > pow2(mInt) || abs(m12sq - pow2(mInt)) < gammaInt) return 0; | |
183 | if(m12sq > pow2(mInt2) || abs(m12sq - pow2(mInt2)) < gammaInt2) return 0; | |
184 | ||
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); | |
189 | ||
190 | if(isSqDown){ | |
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])); | |
199 | }else{ | |
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])); | |
208 | } | |
209 | ||
210 | value = S * (m12sq - pow2(m1) - pow2(m2)) * | |
211 | ( factor1 * (pow2(mRes) + pow2(m3) - m12sq) + 2.0 * factor2 * m3 * mRes); | |
212 | ||
213 | // cout<<"I1: "<<idInt<<" I2:"<<idInt2<<" factor1: "<<factor1 | |
214 | // <<" factor2:"<<factor2<<" value:"<<value<<endl; | |
215 | ||
216 | return value; | |
217 | ||
218 | } | |
219 | ||
220 | //-------------------------------------------------------------------------- | |
221 | ||
222 | double Phi::function(double m12sqIn) { | |
223 | ||
224 | m12sq = m12sqIn; | |
225 | // Check that the propagators are offshell | |
226 | if(m12sq > pow2(mInt) || abs(m12sq - pow2(mInt)) < gammaInt) return 0; | |
227 | ||
228 | double m23max, m23min, E2, E3; | |
229 | ||
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)) ; | |
234 | ||
235 | if(E2 < m2 || E3 < m3){ | |
236 | cout <<"Error in Phi:function"<<endl; | |
237 | return 0.; | |
238 | } | |
239 | ||
240 | double integral2 = integrateGauss(m23min,m23max,1.0e-4); | |
241 | return integral2; | |
242 | } | |
243 | ||
244 | //-------------------------------------------------------------------------- | |
245 | ||
246 | double Phi::function2(double m23sq) { | |
247 | ||
248 | // Check that the propagators are offshell | |
249 | if(m23sq > pow2(mInt2) || abs(m23sq - pow2(mInt2)) < gammaInt2) return 0; | |
250 | ||
251 | double R1, R2, S, factor1, factor2, factor3, factor4, value, fac; | |
252 | int iQ2; | |
253 | ||
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); | |
258 | ||
259 | fac = 1.0; | |
260 | ||
261 | if(isSqDown){ | |
262 | // Only factor is when both d_i and d_j are near. | |
263 | iQ2 = (id1%2 == 1)? (id1+1)/2 : (id2+1)/2; | |
264 | ||
265 | if(mRes > mInt2 + particleDataPtr->m0(iQ2)) fac = 0.; | |
266 | ||
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)); | |
279 | ||
280 | }else{ | |
281 | // Factor A: u and d_1 | |
282 | iQ2 = (id1+1)/2; | |
283 | ||
284 | if(mRes > mInt2 + particleDataPtr->m0(iQ2)) fac = 0.; | |
285 | ||
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)); | |
298 | ||
299 | ||
300 | // Factor B: u and d_2; change 1 <=> 2 | |
301 | iQ2 = (id2+1)/2; | |
302 | ||
303 | if(mRes > mInt2 + particleDataPtr->m0(iQ2)) fac = 0.; | |
304 | ||
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)); | |
317 | } | |
318 | ||
319 | value = S * (factor1 + factor2 + factor3 + factor4); | |
320 | ||
321 | // cout<<"I1: "<<idInt<<" I2:"<<idInt2<<" factor1: "<<factor1 | |
322 | // <<" factor2:"<<factor2<<" value:"<<value<<endl; | |
323 | ||
324 | return (fac * value); | |
325 | } | |
326 | ||
327 | //-------------------------------------------------------------------------- | |
328 | ||
329 | double Phi::integrateGauss(double xlo, double xhi, double tol) { | |
330 | ||
331 | //8-point unweighted | |
332 | static double x8[4]={0.96028985649753623, | |
333 | 0.79666647741362674, | |
334 | 0.52553240991632899, | |
335 | 0.18343464249564980}; | |
336 | static double w8[4]={0.10122853629037626, | |
337 | 0.22238103445337447, | |
338 | 0.31370664587788729, | |
339 | 0.36268378337836198}; | |
340 | //16-point unweighted | |
341 | static double x16[8]={0.98940093499164993, | |
342 | 0.94457502307323258, | |
343 | 0.86563120238783174, | |
344 | 0.75540440835500303, | |
345 | 0.61787624440264375, | |
346 | 0.45801677765722739, | |
347 | 0.28160355077925891, | |
348 | 0.09501250983763744}; | |
349 | static double w16[8]={0.027152459411754095, | |
350 | 0.062253523938647893, | |
351 | 0.095158511682492785, | |
352 | 0.12462897125553387, | |
353 | 0.14959598881657673, | |
354 | 0.16915651939500254, | |
355 | 0.18260341504492359, | |
356 | 0.18945061045506850}; | |
357 | //boundary checks | |
358 | if (xlo == xhi) { | |
359 | cerr<<"xlo = xhi"<<endl; | |
360 | return 0.0; | |
361 | } | |
362 | if ( xlo > xhi ) { | |
363 | cerr<<" (integrateGauss:) -> xhi < xlo"<<endl; | |
364 | return 0.0; | |
365 | } | |
366 | //initialize | |
367 | double sum = 0.0; | |
368 | double c = 0.001/abs(xhi-xlo); | |
369 | double zlo = xlo; | |
370 | double zhi = xhi; | |
371 | ||
372 | bool nextbin = true; | |
373 | ||
374 | while ( nextbin ) { | |
375 | ||
376 | double zmi = 0.5*(zhi+zlo); // midpoint | |
377 | double zmr = 0.5*(zhi-zlo); // midpoint, relative to zlo | |
378 | ||
379 | //calculate 8-point and 16-point quadratures | |
380 | double s8=0.0; | |
381 | for (int i=0;i<4;i++) { | |
382 | double dz = zmr * x8[i]; | |
383 | s8 += w8[i]*(function2(zmi+dz) + function2(zmi-dz)); | |
384 | } | |
385 | s8 *= zmr; | |
386 | double s16=0.0; | |
387 | for (int i=0;i<8;i++) { | |
388 | double dz = zmr * x16[i]; | |
389 | s16 += w16[i]*(function2(zmi+dz) + function2(zmi-dz)); | |
390 | } | |
391 | s16 *= zmr; | |
392 | if (abs(s16-s8) < tol*(1+abs(s16))) { | |
393 | //precision in this bin OK, add to cumulative and go to next | |
394 | nextbin=true; | |
395 | sum += s16; | |
396 | //next bin: LO = end of current, HI = end of integration region. | |
397 | zlo=zhi; | |
398 | zhi=xhi; | |
399 | if ( zlo == zhi ) nextbin = false; | |
400 | } else { | |
401 | //precision in this bin not OK, subdivide. | |
402 | if (1.0 + c*abs(zmr) == 1.0) { | |
403 | cerr << " (integrateGauss:) too high accuracy required"<<endl; | |
404 | sum = 0.0 ; | |
405 | break; | |
406 | } | |
407 | zhi=zmi; | |
408 | nextbin=true; | |
409 | } | |
410 | } | |
411 | return sum; | |
412 | } | |
413 | ||
414 | //========================================================================== | |
415 | ||
416 | // The SUSYResonanceWidths Class | |
417 | // Derived class for SUSY resonances | |
418 | ||
419 | const bool SUSYResonanceWidths::DEBUG = false; | |
420 | ||
421 | //-------------------------------------------------------------------------- | |
422 | ||
423 | bool SUSYResonanceWidths::init(Info* infoPtrIn, Settings* settingsPtrIn, | |
424 | ParticleData* particleDataPtrIn, Couplings* couplingsPtrIn) { | |
425 | ||
426 | // Save pointers. | |
427 | infoPtr = infoPtrIn; | |
428 | settingsPtr = settingsPtrIn; | |
429 | particleDataPtr = particleDataPtrIn; | |
430 | coupSUSYPtr = (couplingsPtrIn->isSUSY ? (CoupSUSY *) couplingsPtrIn: 0 ); | |
431 | ||
432 | // No width calculation necessary for SM-only | |
433 | bool calcWidthAllow = true; | |
434 | if(!couplingsPtrIn->isSUSY) calcWidthAllow = false; | |
435 | ||
436 | // Minimal decaying-resonance width. Minimal phase space for meMode = 103. | |
437 | minWidth = settingsPtr->parm("ResonanceWidths:minWidth"); | |
438 | minThreshold = settingsPtr->parm("ResonanceWidths:minThreshold"); | |
439 | ||
440 | // Pointer to particle species. | |
441 | particlePtr = particleDataPtr->particleDataEntryPtr(idRes); | |
442 | if (particlePtr == 0) { | |
443 | infoPtr->errorMsg("Error in ResonanceWidths::init:" | |
444 | " unknown resonance identity code"); | |
445 | return false; | |
446 | } | |
447 | ||
448 | // Generic particles should not have meMode < 100, but allow | |
449 | // some exceptions: not used Higgses and not used Technicolor. | |
450 | if (idRes == 35 || idRes == 36 || idRes == 37 | |
451 | || idRes/1000000 == 3) isGeneric = false; | |
452 | ||
453 | // Resonance properties: antiparticle, mass, width | |
454 | hasAntiRes = particlePtr->hasAnti(); | |
455 | mRes = particlePtr->m0(); | |
456 | GammaRes = particlePtr->mWidth(); | |
457 | m2Res = mRes*mRes; | |
458 | ||
459 | // For very narrow resonances assign fictitious small width. | |
460 | if (GammaRes < minWidth) GammaRes = 0.1 * minWidth; | |
461 | GamMRat = GammaRes / mRes; | |
462 | ||
463 | // Secondary decay chains by default all on. | |
464 | openPos = 1.; | |
465 | openNeg = 1.; | |
466 | ||
467 | // Allow option where on-shell width is forced to current value. | |
468 | doForceWidth = particlePtr->doForceWidth(); | |
469 | forceFactor = 1.; | |
470 | ||
471 | // Check that resonance OK. | |
472 | if (particlePtr == 0) infoPtr->errorMsg("Error in ResonanceWidths::init:" | |
473 | " unknown resonance identity code"); | |
474 | ||
475 | // Check if decay table was read in via SLHA | |
476 | bool hasDecayTable = false; | |
477 | if(calcWidthAllow) { | |
478 | for(unsigned int iDec = 1; iDec < (coupSUSYPtr->slhaPtr)->decays.size(); | |
479 | iDec++) | |
480 | if(!hasDecayTable) hasDecayTable | |
481 | = ((coupSUSYPtr->slhaPtr)->decays[iDec].getId() == abs(idRes)); | |
482 | } | |
483 | ||
484 | if(hasDecayTable && settingsPtr->flag("SLHA:useDecayTable")) { | |
485 | calcWidthAllow = false; | |
486 | if(DEBUG) cout<<"Found decay table for:"<<idRes<<endl; | |
487 | } | |
488 | ||
489 | // Initialize constants used for a resonance. | |
490 | if(calcWidthAllow) { | |
491 | mHat = mRes; | |
492 | initConstants(); | |
493 | calcPreFac(true); | |
494 | } | |
495 | ||
496 | // Reset quantities to sum. Declare variables inside loop. | |
497 | double widTot = 0.; | |
498 | double widPos = 0.; | |
499 | double widNeg = 0.; | |
500 | int idNow, idAnti; | |
501 | double openSecPos, openSecNeg; | |
502 | ||
503 | // Loop over all decay channels. Basic properties of channel. | |
504 | for (int i = 0; i < particlePtr->sizeChannels(); ++i) { | |
505 | iChannel = i; | |
506 | onMode = particlePtr->channel(i).onMode(); | |
507 | meMode = particlePtr->channel(i).meMode(); | |
508 | mult = particlePtr->channel(i).multiplicity(); | |
509 | widNow = 0.; | |
510 | ||
511 | // Warn if not relevant meMode. | |
512 | if ( meMode < 0 || meMode > 103 || (isGeneric && meMode < 100) ) { | |
513 | infoPtr->errorMsg("Error in ResonanceWidths::init:" | |
514 | " resonance meMode not acceptable"); | |
515 | } | |
516 | ||
517 | // Calculation of SUSY particle widths | |
518 | if (meMode == 103 && GammaRes > 0. && calcWidthAllow && | |
519 | (!settingsPtr->flag("SLHA:useDecayTable") || !hasDecayTable)) { | |
520 | // Read out information on channel: primarily use first two. | |
521 | id1 = particlePtr->channel(i).product(0); | |
522 | id2 = particlePtr->channel(i).product(1); | |
523 | id1Abs = abs(id1); | |
524 | id2Abs = abs(id2); | |
525 | ||
526 | // Order first two in descending order of absolute values. | |
527 | if (id2Abs > id1Abs) {swap( id1, id2); swap( id1Abs, id2Abs);} | |
528 | ||
529 | // Allow for third product to be treated in derived classes. | |
530 | if (mult > 2) { | |
531 | id3 = particlePtr->channel(i).product(2); | |
532 | id3Abs = abs(id3); | |
533 | ||
534 | // Also order third into descending order of absolute values. | |
535 | if (id3Abs > id2Abs) {swap( id2, id3); swap( id2Abs, id3Abs);} | |
536 | if (id2Abs > id1Abs) {swap( id1, id2); swap( id1Abs, id2Abs);} | |
537 | } | |
538 | ||
539 | // Read out masses. Calculate two-body phase space. | |
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); | |
546 | if (mult > 2) { | |
547 | mf3 = particleDataPtr->m0(id3Abs); | |
548 | mr3 = pow2(mf3 / mHat); | |
549 | ||
550 | //Check phase space | |
551 | ps = 1.0; | |
552 | if(mHat < mf1 + mf2 + mf3 + MASSMARGIN) ps = 0.; | |
553 | } | |
554 | ||
555 | // Let derived class calculate width for channel provided. | |
556 | calcWidth(true); | |
557 | } | |
558 | ||
559 | // Width calculated based on stored values. | |
560 | else widNow = GammaRes * particlePtr->channel(i).bRatio(); | |
561 | ||
562 | // Find secondary open fractions of partial width. | |
563 | openSecPos = 1.; | |
564 | openSecNeg = 1.; | |
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; | |
568 | // Secondary widths not yet initialized for heavier states, | |
569 | // so have to assume unit open fraction there. | |
570 | if (idNow == 23 || abs(idNow) == 24 | |
571 | || particleDataPtr->m0(abs(idNow)) < mRes) { | |
572 | openSecPos *= particleDataPtr->resOpenFrac(idNow); | |
573 | openSecNeg *= particleDataPtr->resOpenFrac(idAnti); | |
574 | } | |
575 | } | |
576 | ||
577 | // Store partial widths and secondary open fractions. | |
578 | particlePtr->channel(i).onShellWidth(widNow); | |
579 | particlePtr->channel(i).openSec( idRes, openSecPos); | |
580 | particlePtr->channel(i).openSec(-idRes, openSecNeg); | |
581 | ||
582 | // Update sum over all channnels and over open channels only. | |
583 | widTot += widNow; | |
584 | if (onMode == 1 || onMode == 2) widPos += widNow * openSecPos; | |
585 | if (onMode == 1 || onMode == 3) widNeg += widNow * openSecNeg; | |
586 | } | |
587 | ||
588 | // If no decay channels are open then set particle stable and done. | |
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); | |
594 | return true; | |
595 | } | |
596 | ||
597 | // Normalize branching ratios to unity. | |
598 | double bRatio; | |
599 | for (int i = 0; i < particlePtr->sizeChannels(); ++i) { | |
600 | bRatio = particlePtr->channel(i).onShellWidth() / widTot; | |
601 | particlePtr->channel(i).bRatio( bRatio, false); | |
602 | } | |
603 | ||
604 | // Optionally force total width by rescaling of all partial ones. | |
605 | if (doForceWidth) { | |
606 | forceFactor = GammaRes / widTot; | |
607 | for (int i = 0; i < particlePtr->sizeChannels(); ++i) | |
608 | particlePtr->channel(i).onShellWidthFactor( forceFactor); | |
609 | } | |
610 | ||
611 | // Else update newly calculated partial width. | |
612 | else { | |
613 | particlePtr->setMWidth(widTot, false); | |
614 | GammaRes = widTot; | |
615 | } | |
616 | ||
617 | // Updated width-to-mass ratio. Secondary widths for open. | |
618 | GamMRat = GammaRes / mRes; | |
619 | openPos = widPos / widTot; | |
620 | openNeg = widNeg / widTot; | |
621 | ||
622 | // Done. | |
623 | return true; | |
624 | ||
625 | } | |
626 | ||
627 | //========================================================================== | |
628 | ||
629 | // The ResonanceSquark class | |
630 | // Derived class for Squark resonances | |
631 | ||
632 | //-------------------------------------------------------------------------- | |
633 | ||
634 | // Initialize constants. | |
635 | ||
636 | void ResonanceSquark::initConstants() { | |
637 | ||
638 | // Locally stored properties and couplings. | |
639 | alpS = coupSUSYPtr->alphaS(mHat * mHat ); | |
640 | alpEM = coupSUSYPtr->alphaEM(mHat * mHat); | |
641 | s2W = coupSUSYPtr->sin2W; | |
642 | } | |
643 | ||
644 | //-------------------------------------------------------------------------- | |
645 | ||
646 | // Calculate various common prefactors for the current mass. | |
647 | ||
648 | void ResonanceSquark::calcPreFac(bool) { | |
649 | ||
650 | // Common coupling factors. | |
651 | preFac = 1.0 / (s2W * pow(mHat,3)); | |
652 | ||
653 | } | |
654 | ||
655 | //-------------------------------------------------------------------------- | |
656 | ||
657 | // Calculate width for currently considered channel. | |
658 | ||
659 | void ResonanceSquark::calcWidth(bool) { | |
660 | ||
661 | // Squark type -- in u_i/d_i and generation | |
662 | int ksusy = 1000000; | |
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; | |
666 | // int isqgen = (abs(idRes)%10 + 1)/2; | |
667 | ||
668 | // Check that mass is above threshold. | |
669 | if(ps == 0.) return; | |
670 | else{ | |
671 | // Two-body decays | |
672 | kinFac = (mHat * mHat - mf1 * mf1 - mf2 * mf2); | |
673 | ||
674 | double fac = 0.0 , wid = 0.0; | |
675 | ||
676 | //RPV decays | |
677 | //Case 1a: UDD-type | |
678 | if(id1Abs < 7 && id2Abs < 7){ | |
679 | ||
680 | // Quark generations | |
681 | int iq1 = (id1Abs + 1)/2; | |
682 | int iq2 = (id2Abs + 1)/2; | |
683 | ||
684 | // Check for RPV UDD couplings | |
685 | if(!coupSUSYPtr->isUDD) {widNow = 0; return;} | |
686 | ||
687 | // ~q -> q_i + q_j | |
688 | ||
689 | fac = 2.0 * kinFac / (16.0 * M_PI * pow(mHat,3)); | |
690 | wid = 0.0; | |
691 | if(idown) { | |
692 | if ((id1Abs+id2Abs)%2 == 1){ | |
693 | if(id1Abs%2==1) | |
694 | for(int isq2 = 1; isq2 < 4; isq2++) | |
695 | wid += norm(coupSUSYPtr->rvUDD[iq2][iq1][isq2] | |
696 | * coupSUSYPtr->Rdsq[isq][isq2+3]); | |
697 | else | |
698 | for(int isq2 = 1; isq2 < 4; isq2++) | |
699 | wid += norm(coupSUSYPtr->rvUDD[iq1][iq2][isq2] | |
700 | * coupSUSYPtr->Rdsq[isq][isq2+3]); | |
701 | } | |
702 | } | |
703 | else { | |
704 | if ((id1Abs+id2Abs)%2 != 0) widNow = 0.0; | |
705 | else | |
706 | for(int isq2 = 1; isq2 < 4; isq2++) | |
707 | wid += norm(coupSUSYPtr->rvUDD[isq2][iq1][iq2] | |
708 | * coupSUSYPtr->Rusq[isq][isq2+3]); | |
709 | } | |
710 | } | |
711 | ||
712 | //Case 1b: LQD-type | |
713 | else if(id1Abs < 17 && id2Abs < 7){ | |
714 | if(!coupSUSYPtr->isLQD) {widNow = 0; return;} | |
715 | ||
716 | int ilep = (id1Abs - 9)/2; | |
717 | int iq = (id2Abs + 1)/2; | |
718 | ||
719 | fac = kinFac / (16.0 * M_PI * pow(mHat,3)); | |
720 | wid = 0.0; | |
721 | if(idown){ | |
722 | if(iq%2 == 0){ | |
723 | // q is up-type; ~q is right-handed down type | |
724 | for(int isq2=1; isq2<3; isq2++) | |
725 | wid += norm(coupSUSYPtr->Rdsq[isq][isq2+3] | |
726 | * coupSUSYPtr->rvLQD[ilep][iq][isq2]); | |
727 | }else{ | |
728 | //q is down type; ~q left-handed down-type | |
729 | for(int isq2=1; isq2<3; isq2++) | |
730 | wid += norm(coupSUSYPtr->Rdsq[isq][isq2] | |
731 | * coupSUSYPtr->rvLQD[ilep][isq2][isq2]); | |
732 | } | |
733 | } | |
734 | else{ | |
735 | if(iq%2 == 0) {widNow = 0.0; return;} | |
736 | // q is down type; ~q is left-handed up-type | |
737 | for(int isq2=1; isq2<3; isq2++) | |
738 | wid += norm(coupSUSYPtr->Rusq[isq][isq2] | |
739 | * coupSUSYPtr->rvLQD[ilep][isq2][iq]); | |
740 | } | |
741 | } | |
742 | ||
743 | //Case 2: quark + gaugino | |
744 | else if (id1Abs > ksusy && id2Abs < 7) { | |
745 | ||
746 | int iq = (id2Abs + 1)/2; | |
747 | ||
748 | // ~q -> ~g + q | |
749 | if(id1Abs == 1000021 && idRes%10 == id2Abs) { | |
750 | // Removed factor of s2W in denominator: strong process -- no EW | |
751 | fac = 2.0 * alpS / (3.0 * pow3(mHat)); | |
752 | if(idown) | |
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])); | |
757 | else | |
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])); | |
762 | } | |
763 | else | |
764 | for(int i=1; i<6 ; i++){ | |
765 | // ~q -> ~chi0 + q | |
766 | if(coupSUSYPtr->idNeut(i)==id1Abs && idRes%2 == id2Abs%2){ | |
767 | fac = alpEM * preFac / (2.0 * (1 - s2W)); | |
768 | if(idown) | |
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])); | |
773 | else | |
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])); | |
778 | } | |
779 | ||
780 | // ~q -> chi- + q | |
781 | else if (i < 3 && coupSUSYPtr->idChar(i)==id1Abs | |
782 | && idRes%2 != id2Abs%2){ | |
783 | ||
784 | fac = alpEM * preFac / (4.0 * (1 - s2W)); | |
785 | if(idown) | |
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])); | |
790 | else | |
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])); | |
795 | } | |
796 | } | |
797 | } | |
798 | ||
799 | //Case 3: ~q_i -> ~q_j + Z/W | |
800 | else if (id1Abs > ksusy && id1Abs%100 < 7 | |
801 | && (id2Abs == 23 || id2Abs == 24)){ | |
802 | ||
803 | // factor of lambda^(3/2) = ps^(3/2) ; | |
804 | fac = alpEM * preFac/(16.0 * pow2(particleDataPtr->m0(id2Abs)) | |
805 | * (1.0 - s2W)) * pow2(ps) ; | |
806 | ||
807 | int isq2 = (id1Abs/ksusy == 2) ? (id1Abs%10+1)/2 + 3: (id1Abs%10+1)/2; | |
808 | ||
809 | if(id2Abs == 23 && id1Abs%2 == idRes%2){ | |
810 | if(idown) | |
811 | wid = norm(coupSUSYPtr->LsdsdZ[isq][isq2] | |
812 | + coupSUSYPtr->RsdsdZ[isq][isq2]); | |
813 | else | |
814 | wid = norm(coupSUSYPtr->LsusuZ[isq][isq2] | |
815 | + coupSUSYPtr->RsusuZ[isq][isq2]); | |
816 | } | |
817 | else if (id2Abs == 24 && id1Abs%2 != idRes%2){ | |
818 | if(idown) | |
819 | wid = norm(coupSUSYPtr->LsusdW[isq2][isq]); | |
820 | else | |
821 | wid = norm(coupSUSYPtr->LsusdW[isq][isq2]); | |
822 | } | |
823 | } | |
824 | ||
825 | // TODO: Case ~q_i -> ~q_j + h/H | |
826 | widNow = fac * wid * ps; | |
827 | if(DEBUG) cout<<idRes<<":: id1:"<<id1Abs<<" id2:"<<id2Abs | |
828 | <<" Width: "<<widNow<<endl; | |
829 | return; | |
830 | } | |
831 | ||
832 | } | |
833 | ||
834 | //========================================================================== | |
835 | ||
836 | // The ResonanceGluino class | |
837 | // Derived class for Gluino resonances | |
838 | ||
839 | //-------------------------------------------------------------------------- | |
840 | ||
841 | // Initialize constants. | |
842 | ||
843 | void ResonanceGluino::initConstants() { | |
844 | ||
845 | // Locally stored properties and couplings. | |
846 | alpS = coupSUSYPtr->alphaS(mHat * mHat); | |
847 | return; | |
848 | } | |
849 | ||
850 | //-------------------------------------------------------------------------- | |
851 | ||
852 | // Calculate various common prefactors for the current mass. | |
853 | ||
854 | void ResonanceGluino::calcPreFac(bool) { | |
855 | // Common coupling factors. | |
856 | preFac = alpS /( 8.0 * pow(mHat,3)); | |
857 | return; | |
858 | } | |
859 | ||
860 | //-------------------------------------------------------------------------- | |
861 | ||
862 | // Calculate width for currently considered channel. | |
863 | ||
864 | void ResonanceGluino::calcWidth(bool) { | |
865 | ||
866 | ||
867 | widNow = 0.0; | |
868 | if(ps == 0.) return; | |
869 | kinFac = (mHat * mHat - mf1 * mf1 + mf2 * mf2); | |
870 | ||
871 | if(id1Abs > 1000000 && (id1Abs % 100) < 7 && id2Abs < 7) { | |
872 | ||
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; | |
877 | ||
878 | // ~g -> ~q + q | |
879 | if(idown){ | |
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])); | |
884 | } | |
885 | else{ | |
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])); | |
890 | } | |
891 | widNow = widNow * preFac * ps; | |
892 | if(DEBUG) { | |
893 | cout<<"Gluino:: id1:"<<id1Abs<<" id2:"<<id2Abs<<" Width: "; | |
894 | cout<<scientific<<widNow<<endl; | |
895 | } | |
896 | return; | |
897 | } | |
898 | } | |
899 | ||
900 | //========================================================================== | |
901 | ||
902 | // Class ResonanceNeut | |
903 | // Derived class for Neutralino Resonances | |
904 | // | |
905 | //-------------------------------------------------------------------------- | |
906 | ||
907 | ||
908 | void ResonanceNeut::initConstants(){ | |
909 | ||
910 | alpEM = coupSUSYPtr->alphaEM(mHat * mHat); | |
911 | s2W = coupSUSYPtr->sin2W; | |
912 | ||
913 | // Initialize functions for calculating 3-body widths | |
914 | psi.init(particleDataPtr,coupSUSYPtr); | |
915 | phi.init(particleDataPtr,coupSUSYPtr); | |
916 | upsil.init(particleDataPtr,coupSUSYPtr); | |
917 | } | |
918 | ||
919 | //-------------------------------------------------------------------------- | |
920 | ||
921 | // Calculate various common prefactors for the current mass. | |
922 | void ResonanceNeut::calcPreFac(bool){ | |
923 | ||
924 | // Common coupling factors. | |
925 | preFac = alpEM / (8.0 * s2W * pow(mHat,3)); | |
926 | return; | |
927 | } | |
928 | ||
929 | //-------------------------------------------------------------------------- | |
930 | ||
931 | // Calculate width for currently considered channel. | |
932 | void ResonanceNeut::calcWidth(bool){ | |
933 | ||
934 | widNow = 0.0; | |
935 | ||
936 | if(ps ==0.) return; | |
937 | else if(mult ==2){ | |
938 | // Two-body decays | |
939 | ||
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); | |
944 | ||
945 | // Stable lightest neutralino | |
946 | if(idRes == 1000022) return; | |
947 | ||
948 | double fac = 0.0; | |
949 | int iNeut1 = coupSUSYPtr->typeNeut(idRes); | |
950 | int iNeut2 = coupSUSYPtr->typeNeut(id1Abs); | |
951 | int iChar1 = coupSUSYPtr->typeChar(id1Abs); | |
952 | ||
953 | if(iNeut2>0 && id2Abs == 23){ | |
954 | // ~chi0_i -> chi0_j + Z | |
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); | |
961 | } | |
962 | else if(iChar1>0 && id2Abs==24){ | |
963 | // ~chi0_i -> chi+_j + W- (or c.c.) | |
964 | ||
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])); | |
970 | fac /= pow2(mf2); | |
971 | } | |
972 | else if(id1Abs > 1000000 && id1Abs%100 < 7 && id2Abs < 7){ | |
973 | // ~chi0_k -> ~q + q | |
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; | |
978 | ||
979 | if(idown){ | |
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])); | |
984 | } | |
985 | else{ | |
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])); | |
990 | } | |
991 | // Extra multiplicative factor of 3 over sleptons | |
992 | fac *= 6.0/(1 - s2W); | |
993 | } | |
994 | else if(id1Abs > 1000000 && id1Abs%100 > 10 && id1Abs%100 < 17 | |
995 | && id2Abs < 17){ | |
996 | // ~chi0_k -> ~l + l | |
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; | |
1001 | ||
1002 | if(idown){ | |
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])); | |
1007 | } | |
1008 | else{ | |
1009 | fac = kinFac * (norm(coupSUSYPtr->LsvvX[isl][il][iNeut1])); | |
1010 | } | |
1011 | fac *= 2.0/(1 - s2W); | |
1012 | } | |
1013 | // TODO: Decays in higgs | |
1014 | // Final width for 2-body decays | |
1015 | widNow = fac * preFac * ps ; | |
1016 | if(DEBUG) { | |
1017 | cout<<idRes<<":: id1:"<<id1Abs<<" id2:"<<id2Abs<<" Width: "; | |
1018 | cout<<scientific<<widNow<<endl; | |
1019 | } | |
1020 | } | |
1021 | else { | |
1022 | //RPV 3-body decays | |
1023 | //Case: UDD-type | |
1024 | ||
1025 | if(!coupSUSYPtr->isUDD) return; | |
1026 | ||
1027 | if(id1Abs < 7 && id2Abs < 7 && id3Abs < 7){ | |
1028 | ||
1029 | // Check that quarks compatible with UDD structure | |
1030 | if((id1Abs+id2Abs+id3Abs)%2 == 1) return; | |
1031 | double rvfac,m12min,m12max,integral; | |
1032 | int idInt; | |
1033 | ||
1034 | // Loop over mass eigenstate in actual propagator | |
1035 | for(int idIntRes = 1; idIntRes <= 6; idIntRes++){ | |
1036 | // Right handed field in the UDD coupling | |
1037 | for (int iSq = 1; iSq <= 3; iSq++){ | |
1038 | double m1, m2, m3, mixfac1(0.), mixfac2(0.), mixfac3(0.); | |
1039 | int itemp1,itemp2,itemp3; | |
1040 | // up/down-type internal lines | |
1041 | for(int itype = 1; itype<=3; itype++){ | |
1042 | //itype = 1: up | |
1043 | //itype = 2: down1 | |
1044 | //itype = 3: down2 | |
1045 | if(itype ==1 ) idInt = coupSUSYPtr->idSup(idIntRes); | |
1046 | else idInt = coupSUSYPtr->idSdown(idIntRes); | |
1047 | if(id1Abs%2 == 0){ | |
1048 | if(itype == 1){ | |
1049 | itemp3 = id1Abs; | |
1050 | itemp1 = id2Abs; | |
1051 | itemp2 = id3Abs; | |
1052 | rvfac = pow2( | |
1053 | coupSUSYPtr->rvUDD[iSq][(id2Abs+1)/2][(id3Abs+1)/2]); | |
1054 | }else if (itype ==2){ | |
1055 | itemp3 = id2Abs; | |
1056 | itemp1 = id1Abs; | |
1057 | itemp2 = id3Abs; | |
1058 | rvfac = pow2( | |
1059 | coupSUSYPtr->rvUDD[(id1Abs+1)/2][iSq][(id3Abs+1)/2]); | |
1060 | } else{ | |
1061 | itemp3 = id3Abs; | |
1062 | itemp1 = id1Abs; | |
1063 | itemp2 = id2Abs; | |
1064 | rvfac = pow2( | |
1065 | coupSUSYPtr->rvUDD[(id1Abs+1)/2][(id2Abs+1)/2][iSq]); | |
1066 | } | |
1067 | }else if(id2Abs%2 == 0){ | |
1068 | if(itype==1){ | |
1069 | itemp3 = id2Abs; | |
1070 | itemp1 = id1Abs; | |
1071 | itemp2 = id3Abs; | |
1072 | rvfac = pow2( | |
1073 | coupSUSYPtr->rvUDD[iSq][(id1Abs+1)/2][(id3Abs+1)/2]); | |
1074 | }else if (itype ==2){ | |
1075 | itemp3 = id1Abs; | |
1076 | itemp1 = id2Abs; | |
1077 | itemp2 = id3Abs; | |
1078 | rvfac = pow2( | |
1079 | coupSUSYPtr->rvUDD[(id2Abs+1)/2][iSq][(id3Abs+1)/2]); | |
1080 | } else{ | |
1081 | itemp3 = id3Abs; | |
1082 | itemp1 = id2Abs; | |
1083 | itemp2 = id1Abs; | |
1084 | rvfac = pow2( | |
1085 | coupSUSYPtr->rvUDD[(id2Abs+1)/2][(id2Abs+1)/2][iSq]); | |
1086 | } | |
1087 | }else{ | |
1088 | if(itype==1){ | |
1089 | itemp3 = id3Abs; | |
1090 | itemp1 = id1Abs; | |
1091 | itemp2 = id2Abs; | |
1092 | rvfac = pow2( | |
1093 | coupSUSYPtr->rvUDD[iSq][(id1Abs+1)/2][(id2Abs+1)/2]); | |
1094 | }else if (itype ==2){ | |
1095 | itemp3 = id2Abs; | |
1096 | itemp1 = id1Abs; | |
1097 | itemp2 = id3Abs; | |
1098 | rvfac = pow2( | |
1099 | coupSUSYPtr->rvUDD[(id3Abs+1)/2][iSq][(id2Abs+1)/2]); | |
1100 | } else{ | |
1101 | itemp3 = id3Abs; | |
1102 | itemp1 = id1Abs; | |
1103 | itemp2 = id2Abs; | |
1104 | rvfac = pow2( | |
1105 | coupSUSYPtr->rvUDD[(id3Abs+1)/2][(id1Abs+1)/2][iSq]); | |
1106 | } | |
1107 | ||
1108 | } | |
1109 | ||
1110 | m1 = particleDataPtr->m0(itemp1); | |
1111 | m2 = particleDataPtr->m0(itemp2); | |
1112 | m3 = particleDataPtr->m0(itemp3); | |
1113 | ||
1114 | m12min = pow2(m1+m2); | |
1115 | m12max = pow2(mHat-m3); | |
1116 | ||
1117 | // Ignore mode when 2-body decay is possible | |
1118 | if(mRes > particleDataPtr->m0(idInt) + particleDataPtr->m0(itemp3)) | |
1119 | continue; | |
1120 | ||
1121 | // Single diagram squared terms | |
1122 | psi.setInternal(idRes, itemp1, itemp2, itemp3, idInt, 0); | |
1123 | // Mixing with R-states | |
1124 | if(itype == 1) | |
1125 | mixfac1 = norm(coupSUSYPtr->Rusq[idIntRes][iSq+3]); | |
1126 | else | |
1127 | mixfac1 = norm(coupSUSYPtr->Rdsq[idIntRes][iSq+3]); | |
1128 | ||
1129 | if(abs(rvfac * mixfac1) > 1.0e-8) { | |
1130 | integral = integrateGauss(&psi,m12min,m12max,1.0e-4); | |
1131 | widNow += rvfac * mixfac1 * integral; | |
1132 | // if(DEBUG || idRes == 1000023) | |
1133 | // cout << scientific << setw(10) <<"Psi: intRes: "<<idInt | |
1134 | // <<" integral:"<<integral<<" mixfac:"<<mixfac1 | |
1135 | // <<" widNow:"<<widNow<<endl; | |
1136 | } | |
1137 | ||
1138 | // Mixing of diagrams with different internal squarks | |
1139 | // of same isospin | |
1140 | for (int idIntRes2 = 1; idIntRes2 <= 6; idIntRes2++){ | |
1141 | if(idIntRes2 == idIntRes) continue; | |
1142 | int idInt2; | |
1143 | if(itype == 1 ){ | |
1144 | idInt2 = coupSUSYPtr->idSup(idIntRes2); | |
1145 | mixfac2 = 2.0 * real(coupSUSYPtr->Rusq[idIntRes][iSq+3] | |
1146 | * conj(coupSUSYPtr->Rusq[idIntRes2][iSq+3])); | |
1147 | } else { | |
1148 | idInt2 = coupSUSYPtr->idSdown(idIntRes2); | |
1149 | mixfac2 = 2.0 * real(coupSUSYPtr->Rdsq[idIntRes][iSq+3] | |
1150 | * conj(coupSUSYPtr->Rdsq[idIntRes2][iSq+3])); | |
1151 | } | |
1152 | ||
1153 | // Ignore mode when 2-body decay is possible | |
1154 | if(mRes > particleDataPtr->m0(idInt2) | |
1155 | + particleDataPtr->m0(itemp3)) continue; | |
1156 | ||
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; | |
1161 | // if(DEBUG || idRes == 1000023) | |
1162 | // cout << scientific << setw(10) <<"Upsilon: intRes: " | |
1163 | // <<idInt<<" intRes2:"<<idInt2<<" integral:"<<integral | |
1164 | // <<" mixfac:"<<mixfac2<<" widNow:"<<widNow<<endl; | |
1165 | } | |
1166 | } | |
1167 | ||
1168 | // Interference between two diagrams with quarks | |
1169 | // of different isospin | |
1170 | ||
1171 | for (int idIntRes2 = 1; idIntRes2 <= 6; idIntRes2++){ | |
1172 | if(itype != 1 && idIntRes2 == idIntRes) continue; | |
1173 | int idInt2; | |
1174 | ||
1175 | for (int iSq2 = 1; iSq2 <= 3; iSq2++){ | |
1176 | if(itype == 1 ){ | |
1177 | idInt2 = coupSUSYPtr->idSdown(idIntRes2); | |
1178 | mixfac3 = 2.0 * real(coupSUSYPtr->Rusq[idIntRes][iSq+3] | |
1179 | * conj(coupSUSYPtr->Rdsq[idIntRes2][iSq2+3])); | |
1180 | } else { | |
1181 | idInt2 = coupSUSYPtr->idSdown(idIntRes2); | |
1182 | mixfac3 = 2.0 * real(coupSUSYPtr->Rdsq[idIntRes][iSq+3] | |
1183 | * conj(coupSUSYPtr->Rdsq[idIntRes2][iSq2+3])); | |
1184 | } | |
1185 | ||
1186 | if(abs(rvfac * mixfac3) > 0.0) { | |
1187 | phi.setInternal(idRes,itemp1, itemp2,itemp3,idInt,idInt2); | |
1188 | //integral = 0; | |
1189 | //if(idIntRes == 2 && iSq2 ==4) | |
1190 | integral = integrateGauss(&phi,m12min,m12max,1.0e-4); | |
1191 | widNow -= rvfac * mixfac2 * integral; | |
1192 | } | |
1193 | } | |
1194 | } | |
1195 | } | |
1196 | } | |
1197 | } | |
1198 | } | |
1199 | // Normalisation. Extra factor of 2 to account for the fact that | |
1200 | // d_i, d_j will always be ordered in ascending order. N_c! = 6 | |
1201 | widNow *= 12.0 /(pow3(2.0 * M_PI * mHat) * 32.0); | |
1202 | } | |
1203 | ||
1204 | return; | |
1205 | } | |
1206 | ||
1207 | //========================================================================== | |
1208 | ||
1209 | // Class ResonanceChar | |
1210 | // Derived class for Neutralino Resonances | |
1211 | // Decays into higgses/sleptons not yet implemented | |
1212 | ||
1213 | //-------------------------------------------------------------------------- | |
1214 | ||
1215 | void ResonanceChar::initConstants(){ | |
1216 | ||
1217 | alpEM = coupSUSYPtr->alphaEM(mHat * mHat); | |
1218 | s2W = coupSUSYPtr->sin2W; | |
1219 | return; | |
1220 | } | |
1221 | ||
1222 | //-------------------------------------------------------------------------- | |
1223 | ||
1224 | // Calculate various common prefactors for the current mass. | |
1225 | void ResonanceChar::calcPreFac(bool){ | |
1226 | ||
1227 | preFac = alpEM / (8.0 * s2W * pow(mHat,3)); | |
1228 | return; | |
1229 | } | |
1230 | ||
1231 | //-------------------------------------------------------------------------- | |
1232 | ||
1233 | // Calculate width for currently considered channel. | |
1234 | void ResonanceChar::calcWidth(bool){ | |
1235 | ||
1236 | widNow = 0.0; | |
1237 | if(ps == 0.) return; | |
1238 | ||
1239 | if(mult ==2){ | |
1240 | double fac = 0.0; | |
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); | |
1245 | ||
1246 | int idChar1 = coupSUSYPtr->typeChar(idRes); | |
1247 | int idChar2 = coupSUSYPtr->typeChar(id1Abs); | |
1248 | int idNeut1 = coupSUSYPtr->typeNeut(id1Abs); | |
1249 | ||
1250 | if(idChar2>0 && id2Abs == 23){ | |
1251 | // ~chi_i -> chi_j + Z | |
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); | |
1258 | } | |
1259 | else if(idNeut1>0 && id2Abs==24){ | |
1260 | // ~chi_i -> chi0_j + W- (or c.c.) | |
1261 | ||
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])); | |
1267 | fac /= pow2(mf2); | |
1268 | } | |
1269 | else if(id1Abs > 1000000 && id1Abs%100 < 7 && id2Abs < 7){ | |
1270 | // ~chi0_k -> ~q + q | |
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; | |
1275 | ||
1276 | if(idown){ | |
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])); | |
1282 | } | |
1283 | else{ | |
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])); | |
1289 | } | |
1290 | fac *= 6.0/(1 - s2W); | |
1291 | } | |
1292 | else if(id1Abs > 1000000 && id1Abs%100 > 10 && id1Abs%100 < 17 | |
1293 | && id2Abs < 17){ | |
1294 | // ~chi+_k -> ~l + l | |
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; | |
1299 | ||
1300 | if(idown){ | |
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])); | |
1305 | } | |
1306 | else{ | |
1307 | fac = kinFac * (norm(coupSUSYPtr->LsvlX[isl][il][idChar1])); | |
1308 | } | |
1309 | fac *= 2.0/(1 - s2W); | |
1310 | } | |
1311 | ||
1312 | // TODO: Decays in higgs | |
1313 | widNow = fac * preFac * ps ; | |
1314 | if(DEBUG) { | |
1315 | cout<<idRes<<":: id1:"<<id1Abs<<" id2:"<<id2Abs<<" Width: "; | |
1316 | cout<<scientific<<widNow<<endl; | |
1317 | } | |
1318 | }else{ | |
1319 | //TODO: Implement Chargino 3-body decays | |
1320 | } | |
1321 | return; | |
1322 | } | |
1323 | ||
1324 | ||
1325 | //========================================================================== | |
1326 | // The ResonanceSlepton class | |
1327 | // Derived class for Slepton (and sneutrino) resonances | |
1328 | ||
1329 | //-------------------------------------------------------------------------- | |
1330 | ||
1331 | // Initialize constants. | |
1332 | ||
1333 | void ResonanceSlepton::initConstants() { | |
1334 | ||
1335 | // Locally stored properties and couplings. | |
1336 | alpEM = coupSUSYPtr->alphaEM(mHat * mHat); | |
1337 | s2W = coupSUSYPtr->sin2W; | |
1338 | } | |
1339 | ||
1340 | //-------------------------------------------------------------------------- | |
1341 | ||
1342 | // Calculate various common prefactors for the current mass. | |
1343 | ||
1344 | void ResonanceSlepton::calcPreFac(bool) { | |
1345 | ||
1346 | // Common coupling factors. | |
1347 | preFac = 1.0 / (s2W * pow(mHat,3)); | |
1348 | ||
1349 | } | |
1350 | ||
1351 | //-------------------------------------------------------------------------- | |
1352 | ||
1353 | // Calculate width for currently considered channel. | |
1354 | ||
1355 | void ResonanceSlepton::calcWidth(bool) { | |
1356 | ||
1357 | // Slepton type -- in u_i/d_i and generation | |
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; | |
1363 | ||
1364 | // Check that mass is above threshold. | |
1365 | if(ps == 0.) return; | |
1366 | else{ | |
1367 | // Two-body decays | |
1368 | kinFac = (mHat * mHat - mf1 * mf1 - mf2 * mf2); | |
1369 | ||
1370 | double fac = 0.0 , wid = 0.0; | |
1371 | ||
1372 | //Case 1: RPV: To be implemented | |
1373 | //Case 2: slepton + gaugino | |
1374 | ||
1375 | if (id1Abs > ksusy && id2Abs > 10 && id2Abs < 17) { | |
1376 | for(int i=1; i<6 ; i++){ | |
1377 | // ~ell/~nu -> ~chi0 + ell/nu | |
1378 | if(coupSUSYPtr->idNeut(i)==id1Abs && idRes%2 == id2Abs%2){ | |
1379 | fac = alpEM * preFac / (2.0 * (1 - s2W)); | |
1380 | if(islep) | |
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])); | |
1385 | else | |
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])); | |
1390 | } | |
1391 | ||
1392 | // ~ell/~nu -> ~chi- + nu/ell | |
1393 | else if (i < 3 && coupSUSYPtr->idChar(i)==id1Abs | |
1394 | && idRes%2 != id2Abs%2){ | |
1395 | ||
1396 | fac = alpEM * preFac / (4.0 * (1 - s2W)); | |
1397 | if(islep) | |
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])); | |
1402 | else | |
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])); | |
1407 | } | |
1408 | } | |
1409 | } | |
1410 | ||
1411 | //Case 3: ~l_i -> ~l_j + Z/W | |
1412 | else if (id1Abs > ksusy+10 && id1Abs%100 < 17 | |
1413 | && (id2Abs == 23 || id2Abs == 24)){ | |
1414 | ||
1415 | // factor of lambda^(3/2) = ps^3; | |
1416 | fac = alpEM * preFac/(16.0 * pow2(mf2) * (1.0 - s2W)) * pow2(ps) ; | |
1417 | ||
1418 | int isl2 = (id1Abs/ksusy == 2) ? (id1Abs%10+1)/2 + 3: (id1Abs%10+1)/2; | |
1419 | ||
1420 | if(id2Abs == 23 && id1Abs%2 == idRes%2){ | |
1421 | if(islep) | |
1422 | wid = norm(coupSUSYPtr->LslslZ[isl][isl2] | |
1423 | + coupSUSYPtr->RslslZ[isl][isl2]); | |
1424 | else | |
1425 | wid = norm(coupSUSYPtr->LsvsvZ[isl][isl2] | |
1426 | + coupSUSYPtr->RsvsvZ[isl][isl2]); | |
1427 | } | |
1428 | else if (id2Abs == 24 && id1Abs%2 != idRes%2){ | |
1429 | if(islep) | |
1430 | wid = norm(coupSUSYPtr->LslsvW[isl2][isl]); | |
1431 | else | |
1432 | wid = norm(coupSUSYPtr->LslsvW[isl][isl2]); | |
1433 | } | |
1434 | } | |
1435 | ||
1436 | // TODO: Case ~l_i -> ~l_j + h/H | |
1437 | ||
1438 | ||
1439 | widNow = fac * wid * ps; | |
1440 | if(DEBUG) cout<<idRes<<":: id1:"<<id1Abs<<" id2:"<<id2Abs | |
1441 | <<" Width: "<<widNow<<endl; | |
1442 | return; | |
1443 | } | |
1444 | ||
1445 | } | |
1446 | ||
1447 | //========================================================================== | |
1448 | ||
1449 | // Gaussian Integrator for 3-body decay widths | |
1450 | ||
1451 | double SUSYResonanceWidths::integrateGauss(WidthFunction* widthFn, | |
1452 | double xlo, double xhi, double tol) { | |
1453 | ||
1454 | //8-point unweighted | |
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}; | |
1463 | //16-point unweighted | |
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}; | |
1480 | //boundary checks | |
1481 | if (xlo == xhi) { | |
1482 | cerr<<"xlo = xhi"<<endl; | |
1483 | return 0.0; | |
1484 | } | |
1485 | if ( xlo > xhi ) { | |
1486 | cerr<<" (integrateGauss:) -> xhi < xlo"<<endl; | |
1487 | return 0.0; | |
1488 | } | |
1489 | //initialize | |
1490 | double sum = 0.0; | |
1491 | double c = 0.001/abs(xhi-xlo); | |
1492 | double zlo = xlo; | |
1493 | double zhi = xhi; | |
1494 | ||
1495 | bool nextbin = true; | |
1496 | ||
1497 | while ( nextbin ) { | |
1498 | ||
1499 | double zmi = 0.5*(zhi+zlo); // midpoint | |
1500 | double zmr = 0.5*(zhi-zlo); // midpoint, relative to zlo | |
1501 | ||
1502 | //calculate 8-point and 16-point quadratures | |
1503 | double s8=0.0; | |
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)); | |
1507 | } | |
1508 | s8 *= zmr; | |
1509 | double s16=0.0; | |
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)); | |
1513 | } | |
1514 | s16 *= zmr; | |
1515 | if (abs(s16-s8) < tol*(1+abs(s16))) { | |
1516 | //precision in this bin OK, add to cumulative and go to next | |
1517 | nextbin=true; | |
1518 | sum += s16; | |
1519 | //next bin: LO = end of current, HI = end of integration region. | |
1520 | zlo=zhi; | |
1521 | zhi=xhi; | |
1522 | if ( zlo == zhi ) nextbin = false; | |
1523 | } else { | |
1524 | //precision in this bin not OK, subdivide. | |
1525 | if (1.0 + c*abs(zmr) == 1.0) { | |
1526 | cerr << " (integrateGauss:) too high accuracy required"<<endl; | |
1527 | sum = 0.0 ; | |
1528 | break; | |
1529 | } | |
1530 | zhi=zmi; | |
1531 | nextbin=true; | |
1532 | } | |
1533 | } | |
1534 | ||
1535 | return sum; | |
1536 | } | |
1537 | ||
1538 | //====================================================================== | |
1539 | ||
1540 | } //end namespace Pythia8 | |
1541 | ||
1542 |