1 | // SusyCouplings.cc is a part of the PYTHIA event generator. |
---|
2 | // Copyright (C) 2012 Torbjorn Sjostrand. |
---|
3 | // Main authors of this file: 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 | // supersymmetric couplings class. |
---|
9 | |
---|
10 | #include "SusyCouplings.h" |
---|
11 | |
---|
12 | namespace Pythia8 { |
---|
13 | |
---|
14 | //========================================================================== |
---|
15 | |
---|
16 | // The CoupSUSY class. |
---|
17 | |
---|
18 | //-------------------------------------------------------------------------- |
---|
19 | |
---|
20 | // Constants: could be changed here if desired, but normally should not. |
---|
21 | // These are of technical nature, as described for each. |
---|
22 | |
---|
23 | // Allow verbose printout for debug purposes. |
---|
24 | const bool CoupSUSY::DEBUG = false; |
---|
25 | |
---|
26 | //-------------------------------------------------------------------------- |
---|
27 | |
---|
28 | // Initialize SM+SUSY couplings (only performed once). |
---|
29 | |
---|
30 | void CoupSUSY::initSUSY (SusyLesHouches* slhaPtrIn, Settings* settingsPtrIn, |
---|
31 | ParticleData* particleDataPtrIn) { |
---|
32 | |
---|
33 | // Save pointers. |
---|
34 | slhaPtr = slhaPtrIn; |
---|
35 | settingsPtr = settingsPtrIn; |
---|
36 | particleDataPtr = particleDataPtrIn; |
---|
37 | |
---|
38 | // Only initialize SUSY parts if SUSY is actually switched on |
---|
39 | if (!slhaPtr->modsel.exists()) return; |
---|
40 | |
---|
41 | // Is NMSSM switched on? |
---|
42 | isNMSSM = (slhaPtr->modsel(3) != 1 ? false : true); |
---|
43 | settingsPtr->flag("SLHA:NMSSM",isNMSSM); |
---|
44 | int nNeut = (isNMSSM ? 5 : 4); |
---|
45 | int nChar = 2; |
---|
46 | |
---|
47 | // Initialize pole masses |
---|
48 | mZpole = particleDataPtr->m0(23); |
---|
49 | wZpole = particleDataPtr->mWidth(23); |
---|
50 | mWpole = particleDataPtr->m0(24); |
---|
51 | wWpole = particleDataPtr->mWidth(24); |
---|
52 | |
---|
53 | // Running masses and weak mixing angle |
---|
54 | // (default to pole values if no running available) |
---|
55 | mW = mWpole; |
---|
56 | mZ = mZpole; |
---|
57 | sin2W = sin2thetaW(); |
---|
58 | |
---|
59 | if (settingsPtr->mode("SUSY:sin2thetaWMode") == 3) { |
---|
60 | // Possibility to force on-shell sin2W definition, mostly intended for |
---|
61 | // cross-checks |
---|
62 | sin2W = 1.0 - pow(mW/mZ,2); |
---|
63 | } else if (settingsPtr->mode("SUSY:sin2thetaWMode") == 2){ |
---|
64 | // Possibility to use running sin2W definition, derived from gauge |
---|
65 | // couplings in running SLHA blocks (normally defined at SUSY scale) |
---|
66 | if(slhaPtr->gauge.exists(1) && slhaPtr->gauge.exists(2) |
---|
67 | && slhaPtr->hmix.exists(3)) { |
---|
68 | double gp=slhaPtr->gauge(1); |
---|
69 | double g =slhaPtr->gauge(2); |
---|
70 | double v =slhaPtr->hmix(3); |
---|
71 | mW = g * v / 2.0; |
---|
72 | mZ = sqrt(pow(gp,2)+pow(g,2)) * v / 2.0; |
---|
73 | //double tan2W = pow2(gp)/pow2(g); |
---|
74 | //if (DEBUG) cout << " tan2W = " << tan2W << endl; |
---|
75 | sin2W = pow2(gp)/(pow2(g)+pow2(gp)); |
---|
76 | } else { |
---|
77 | slhaPtr->message(1,"initSUSY", |
---|
78 | "Block GAUGE not found or incomplete; using sin(thetaW) at mZ"); |
---|
79 | } |
---|
80 | } |
---|
81 | |
---|
82 | // Overload the SM value of sin2thetaW |
---|
83 | s2tW = sin2W; |
---|
84 | |
---|
85 | sinW = sqrt(sin2W); |
---|
86 | cosW = sqrt(1.0-sin2W); |
---|
87 | |
---|
88 | // Tan(beta) |
---|
89 | // By default, use the running one in HMIX (if not found, use MINPAR) |
---|
90 | |
---|
91 | if(slhaPtr->hmix.exists(2)) |
---|
92 | tanb = slhaPtr->hmix(2); |
---|
93 | else{ |
---|
94 | slhaPtr->minpar(3); |
---|
95 | slhaPtr->message(1,"initSUSY", |
---|
96 | "Block HMIX not found or incomplete; using MINPAR tan(beta)"); |
---|
97 | } |
---|
98 | cosb = sqrt( 1.0 / (1.0 + tanb*tanb) ); |
---|
99 | sinb = sqrt(max(0.0,1.0-cosb*cosb)); |
---|
100 | |
---|
101 | // Verbose output |
---|
102 | if (DEBUG) { |
---|
103 | cout << " sin2W(Q) = " << sin2W << " mW(Q) = " << mW |
---|
104 | << " mZ(Q) = " << mZ << endl; |
---|
105 | cout << " vev(Q) = " << slhaPtr->hmix(3) << " tanb(Q) = " << tanb |
---|
106 | << endl; |
---|
107 | for (int i=1;i<=3;i++) { |
---|
108 | for (int j=1;j<=3;j++) { |
---|
109 | cout << " VCKM [" << i << "][" << j << "] = " |
---|
110 | << scientific << setw(10) << VCKMgen(i,j) << endl; |
---|
111 | } |
---|
112 | } |
---|
113 | } |
---|
114 | |
---|
115 | // Higgs sector |
---|
116 | if(slhaPtr->alpha.exists()) { |
---|
117 | alphaHiggs = slhaPtr->alpha(); |
---|
118 | } |
---|
119 | // If RPV, assume alpha = asin(RVHMIX(1,2)) (ignore Higgs-Sneutrino mixing) |
---|
120 | else if (slhaPtr->modsel(4) == 1) { |
---|
121 | alphaHiggs = asin(slhaPtr->rvhmix(1,2)); |
---|
122 | slhaPtr->message(0,"initSUSY","Extracting angle alpha from RVHMIX"); |
---|
123 | } else { |
---|
124 | slhaPtr->message(1,"initSUSY","Block ALPHA not found; using alpha = beta."); |
---|
125 | // Define approximate alpha by simple SM limit |
---|
126 | alphaHiggs = atan(tanb); |
---|
127 | } |
---|
128 | |
---|
129 | if(slhaPtr->hmix.exists(1) && slhaPtr->hmix.exists(4)){ |
---|
130 | muHiggs = slhaPtr->hmix(1); |
---|
131 | mAHiggs = sqrt(slhaPtr->hmix(4)); |
---|
132 | } else{ |
---|
133 | slhaPtr->message(1,"initSUSY", |
---|
134 | "Block HMIX not found or incomplete; setting mu = mA = 0."); |
---|
135 | muHiggs = 0.0; |
---|
136 | mAHiggs = 0.0; |
---|
137 | } |
---|
138 | |
---|
139 | // Shorthand for squark mixing matrices |
---|
140 | LHmatrixBlock<6> Ru(slhaPtr->usqmix); |
---|
141 | LHmatrixBlock<6> Rd(slhaPtr->dsqmix); |
---|
142 | LHmatrixBlock<6> imRu(slhaPtr->imusqmix); |
---|
143 | LHmatrixBlock<6> imRd(slhaPtr->imdsqmix); |
---|
144 | |
---|
145 | // Construct ~g couplings |
---|
146 | for (int i=1; i<=6; i++) { |
---|
147 | for (int j=1; j<=3; j++) { |
---|
148 | LsddG[i][j] = complex( Rd(i,j) , imRd(i,j)); |
---|
149 | RsddG[i][j] = complex(-Rd(i,j+3), -imRd(i,j+3)); |
---|
150 | LsuuG[i][j] = complex( Ru(i,j) , imRu(i,j)); |
---|
151 | RsuuG[i][j] = complex(-Ru(i,j+3), -imRu(i,j+3)); |
---|
152 | |
---|
153 | if (DEBUG) { |
---|
154 | cout << " Lsddg [" << i << "][" << j << "] = " |
---|
155 | << scientific << setw(10) << LsddG[i][j] |
---|
156 | << " RsddG [" << i << "][" << j << "] = " |
---|
157 | << scientific << setw(10) << RsddG[i][j] << endl; |
---|
158 | cout << " Lsuug [" << i << "][" << j << "] = " |
---|
159 | << scientific << setw(10) << LsuuG[i][j] |
---|
160 | << " RsuuG [" << i << "][" << j << "] = " |
---|
161 | << scientific << setw(10) << RsuuG[i][j] << endl; |
---|
162 | } |
---|
163 | } |
---|
164 | } |
---|
165 | |
---|
166 | // Construct qqZ couplings |
---|
167 | for (int i=1 ; i<=6 ; i++) { |
---|
168 | |
---|
169 | // q[i] q[i] Z (def with extra factor 2 compared to [Okun]) |
---|
170 | LqqZ[i] = af(i) - 2.0*ef(i)*sin2W ; |
---|
171 | RqqZ[i] = - 2.0*ef(i)*sin2W ; |
---|
172 | |
---|
173 | // tmp: verbose output |
---|
174 | if (DEBUG) { |
---|
175 | cout << " LqqZ [" << i << "][" << i << "] = " |
---|
176 | << scientific << setw(10) << LqqZ[i] |
---|
177 | << " RqqZ [" << i << "][" << i << "] = " |
---|
178 | << scientific << setw(10) << RqqZ[i] << endl; |
---|
179 | } |
---|
180 | } |
---|
181 | |
---|
182 | // Construct ~q~qZ couplings |
---|
183 | for (int i=1 ; i<=6 ; i++) { |
---|
184 | |
---|
185 | // Squarks can have off-diagonal couplings as well |
---|
186 | for (int j=1 ; j<=6 ; j++) { |
---|
187 | |
---|
188 | // ~d[i] ~d[j] Z |
---|
189 | LsdsdZ[i][j] = 0.0; |
---|
190 | RsdsdZ[i][j] = 0.0; |
---|
191 | for (int k=1;k<=3;k++) { |
---|
192 | complex Rdik = complex(Rd(i,k), imRd(i,k) ); |
---|
193 | complex Rdjk = complex(Rd(j,k), imRd(j,k) ); |
---|
194 | complex Rdik3 = complex(Rd(i,k+3),imRd(i,k+3)); |
---|
195 | complex Rdjk3 = complex(Rd(j,k+3),imRd(j,k+3)); |
---|
196 | LsdsdZ[i][j] += LqqZ[1] * (Rdik*conj(Rdjk)); |
---|
197 | RsdsdZ[i][j] += RqqZ[1] * (Rdik3*conj(Rdjk3)); |
---|
198 | } |
---|
199 | |
---|
200 | // ~u[i] ~u[j] Z |
---|
201 | LsusuZ[i][j] = 0.0; |
---|
202 | RsusuZ[i][j] = 0.0; |
---|
203 | for (int k=1;k<=3;k++) { |
---|
204 | complex Ruik = complex(Ru(i,k) ,imRu(i,k) ); |
---|
205 | complex Rujk = complex(Ru(j,k) ,imRu(j,k) ); |
---|
206 | complex Ruik3 = complex(Ru(i,k+3),imRu(i,k+3)); |
---|
207 | complex Rujk3 = complex(Ru(j,k+3),imRu(j,k+3)); |
---|
208 | LsusuZ[i][j] += LqqZ[2] * (Ruik*conj(Rujk)); |
---|
209 | RsusuZ[i][j] += RqqZ[2] * (Ruik3*conj(Rujk3)); |
---|
210 | } |
---|
211 | |
---|
212 | // tmp: verbose output |
---|
213 | if (DEBUG) { |
---|
214 | if (max(abs(LsdsdZ[i][j]),abs(RsdsdZ[i][j])) > 1e-6) { |
---|
215 | cout << " LsdsdZ[" << i << "][" << j << "] = " |
---|
216 | << scientific << setw(10) << LsdsdZ[i][j] |
---|
217 | << " RsdsdZ[" << i << "][" << j << "] = " |
---|
218 | << scientific << setw(10) << RsdsdZ[i][j] << endl; |
---|
219 | } |
---|
220 | if (max(abs(LsusuZ[i][j]),abs(RsusuZ[i][j]))> 1e-6) { |
---|
221 | cout << " LsusuZ[" << i << "][" << j << "] = " |
---|
222 | << scientific << setw(10) << LsusuZ[i][j] |
---|
223 | << " RsusuZ[" << i << "][" << j << "] = " |
---|
224 | << scientific << setw(10) << RsusuZ[i][j] << endl; |
---|
225 | } |
---|
226 | } |
---|
227 | } |
---|
228 | } |
---|
229 | |
---|
230 | LHmatrixBlock<6> Rsl(slhaPtr->selmix); |
---|
231 | LHmatrixBlock<3> Rsv(slhaPtr->snumix); |
---|
232 | |
---|
233 | // In RPV, the slepton mixing matrices include Higgs bosons |
---|
234 | // Here we just extract the entries corresponding to the slepton PDG codes |
---|
235 | // I.e., slepton-Higgs mixing is not supported. |
---|
236 | |
---|
237 | // Charged sleptons |
---|
238 | if (slhaPtr->modsel(4) >= 1 && slhaPtr->rvlmix.exists()) { |
---|
239 | for (int i=1; i<=6; ++i) |
---|
240 | for (int j=1; j<=6; ++j) |
---|
241 | Rsl.set(i,j,slhaPtr->rvlmix(i+1,j+2)); |
---|
242 | // Check for Higgs-slepton mixing in RVLMIX |
---|
243 | bool hasCrossTerms = false; |
---|
244 | for (int i=2; i<=7; ++i) |
---|
245 | for (int j=1; j<=2; ++j) |
---|
246 | if (abs(slhaPtr->rvlmix(i,j)) > 1e-5) { |
---|
247 | hasCrossTerms = true; |
---|
248 | break; |
---|
249 | } |
---|
250 | if (hasCrossTerms) |
---|
251 | slhaPtr->message(0,"initSUSY", |
---|
252 | "Note: slepton-Higgs mixing not supported in PYTHIA"); |
---|
253 | } |
---|
254 | |
---|
255 | // Neutral sleptons |
---|
256 | if (slhaPtr->modsel(4) >= 1 && slhaPtr->rvhmix.exists()) { |
---|
257 | for (int i=1; i<=3; ++i) |
---|
258 | for (int j=1; j<=3; ++j) |
---|
259 | Rsv.set(i,j,slhaPtr->rvhmix(i+2,j+2)); |
---|
260 | // Check for Higgs-sneutrino mixing in RVHMIX |
---|
261 | bool hasCrossTerms = false; |
---|
262 | for (int i=3; i<=7; ++i) |
---|
263 | for (int j=1; j<=2; ++j) |
---|
264 | if (abs(slhaPtr->rvhmix(i,j)) > 1e-5) { |
---|
265 | hasCrossTerms = true; |
---|
266 | break; |
---|
267 | } |
---|
268 | if (hasCrossTerms) |
---|
269 | slhaPtr->message(0,"initSUSY", |
---|
270 | "Note: sneutrino-Higgs mixing not supported in PYTHIA"); |
---|
271 | } |
---|
272 | |
---|
273 | // Construct llZ couplings; |
---|
274 | for (int i=11 ; i<=16 ; i++) { |
---|
275 | |
---|
276 | LllZ[i-10] = af(i) - 2.0*ef(i)*sin2W ; |
---|
277 | RllZ[i-10] = - 2.0*ef(i)*sin2W ; |
---|
278 | |
---|
279 | // tmp: verbose output |
---|
280 | if (DEBUG) { |
---|
281 | cout << " LllZ [" << i-10 << "][" << i-10 << "] = " |
---|
282 | << scientific << setw(10) << LllZ[i-10] |
---|
283 | << " RllZ [" << i-10 << "][" << i-10 << "] = " |
---|
284 | << scientific << setw(10) << RllZ[i-10] << endl; |
---|
285 | } |
---|
286 | } |
---|
287 | |
---|
288 | // Construct ~l~lZ couplings |
---|
289 | // Initialize |
---|
290 | for(int i=1;i<=6;i++){ |
---|
291 | for(int j=1;j<=6;j++){ |
---|
292 | LslslZ[i][j] = 0.0; |
---|
293 | RslslZ[i][j] = 0.0; |
---|
294 | |
---|
295 | for (int k=1;k<=3;k++) { |
---|
296 | LsdsdZ[i][j] += LllZ[1] * Rsl(i,k) * Rsl(j,k); |
---|
297 | RsdsdZ[i][j] += RllZ[1] * Rsl(i,k+3) * Rsl(j,k+3); |
---|
298 | } |
---|
299 | |
---|
300 | // ~v[i] ~v[j] Z |
---|
301 | LsvsvZ[i][j] = 0.0; |
---|
302 | RsvsvZ[i][j] = 0.0; |
---|
303 | for (int k=1;k<=3;k++) |
---|
304 | LsusuZ[i][j] += LllZ[2] * Rsv(i,k)*Rsv(j,k); |
---|
305 | } |
---|
306 | } |
---|
307 | |
---|
308 | for(int i=1;i<=6;i++){ |
---|
309 | for(int j=1;j<=6;j++){ |
---|
310 | if (DEBUG) { |
---|
311 | if (max(abs(LsvsvZ[i][j]),abs(RsvsvZ[i][j])) > 1e-6) { |
---|
312 | cout << " LsvsvZ[" << i << "][" << j << "] = " |
---|
313 | << scientific << setw(10) << LsvsvZ[i][j] |
---|
314 | << " RsvsvZ[" << i << "][" << j << "] = " |
---|
315 | << scientific << setw(10) << RsvsvZ[i][j] << endl; |
---|
316 | } |
---|
317 | if (max(abs(LslslZ[i][j]),abs(RslslZ[i][j]))> 1e-6) { |
---|
318 | cout << " LslslZ[" << i << "][" << j << "] = " |
---|
319 | << scientific << setw(10) << LslslZ[i][j] |
---|
320 | << " RslslZ[" << i << "][" << j << "] = " |
---|
321 | << scientific << setw(10) << RslslZ[i][j] << endl; |
---|
322 | } |
---|
323 | } |
---|
324 | } |
---|
325 | } |
---|
326 | |
---|
327 | // Construct udW couplings |
---|
328 | // Loop over up [i] and down [j] quark generation |
---|
329 | for (int i=1;i<=3;i++) { |
---|
330 | for (int j=1;j<=3;j++) { |
---|
331 | |
---|
332 | // CKM matrix (use Pythia one if no SLHA) |
---|
333 | // (NB: could also try input one if no running one found, but |
---|
334 | // would then need to compute from Wolfenstein) |
---|
335 | complex Vij=VCKMgen(i,j); |
---|
336 | if (slhaPtr->vckm.exists()) { |
---|
337 | Vij=complex(slhaPtr->vckm(i,j),slhaPtr->imvckm(i,j)); |
---|
338 | } |
---|
339 | |
---|
340 | // u[i] d[j] W |
---|
341 | LudW[i][j] = sqrt(2.0) * cosW * Vij; |
---|
342 | RudW[i][j] = 0.0; |
---|
343 | |
---|
344 | // tmp: verbose output |
---|
345 | if (DEBUG) { |
---|
346 | cout << " LudW [" << i << "][" << j << "] = " |
---|
347 | << scientific << setw(10) << LudW[i][j] |
---|
348 | << " RudW [" << i << "][" << j << "] = " |
---|
349 | << scientific << setw(10) << RudW[i][j] << endl; |
---|
350 | } |
---|
351 | } |
---|
352 | } |
---|
353 | |
---|
354 | |
---|
355 | // Construct ~u~dW couplings |
---|
356 | // Loop over ~u[k] and ~d[l] flavours |
---|
357 | for (int k=1;k<=6;k++) { |
---|
358 | for (int l=1;l<=6;l++) { |
---|
359 | |
---|
360 | LsusdW[k][l]=0.0; |
---|
361 | RsusdW[k][l]=0.0; |
---|
362 | |
---|
363 | // Loop over u[i] and d[j] flavours |
---|
364 | for (int i=1;i<=3;i++) { |
---|
365 | for (int j=1;j<=3;j++) { |
---|
366 | |
---|
367 | // CKM matrix (use Pythia one if no SLHA) |
---|
368 | // (NB: could also try input one if no running one found, but |
---|
369 | // would then need to compute from Wolfenstein) |
---|
370 | complex Vij=VCKMgen(i,j); |
---|
371 | if (slhaPtr->vckm.exists()) { |
---|
372 | Vij=complex(slhaPtr->vckm(i,j),slhaPtr->imvckm(i,j)); |
---|
373 | } |
---|
374 | |
---|
375 | // ~u[k] ~d[l] W (add one term for each quark flavour i,j) |
---|
376 | complex Ruki = complex(Ru(k,i),imRu(k,i)); |
---|
377 | complex Rdlj = complex(Rd(l,j),imRd(l,j)); |
---|
378 | LsusdW[k][l] += sqrt(2.0) * cosW * Vij * Ruki * conj(Rdlj); |
---|
379 | RsusdW[k][l] += 0.0; |
---|
380 | |
---|
381 | } |
---|
382 | } |
---|
383 | |
---|
384 | // tmp: verbose output |
---|
385 | if (DEBUG) { |
---|
386 | if (max(abs(LsusdW[k][l]),abs(RsusdW[k][l]))> 1e-6) { |
---|
387 | cout << " LsusdW[" << k << "][" << l << "] = " |
---|
388 | << scientific << setw(10) << LsusdW[k][l] |
---|
389 | << " RsusdW[" << k << "][" << l << "] = " |
---|
390 | << scientific << setw(10) << RsusdW[k][l] << endl; |
---|
391 | } |
---|
392 | } |
---|
393 | |
---|
394 | } |
---|
395 | } |
---|
396 | |
---|
397 | |
---|
398 | |
---|
399 | // Construct lvW couplings |
---|
400 | for (int i=1;i<=3;i++){ |
---|
401 | LlvW[i] = sqrt(2.0) * cosW; |
---|
402 | RlvW[i] = 0.0; |
---|
403 | |
---|
404 | // tmp: verbose output |
---|
405 | if (DEBUG) { |
---|
406 | cout << " LlvW [" << i << "] = " |
---|
407 | << scientific << setw(10) << LlvW[i] |
---|
408 | << " RlvW [" << i << "] = " |
---|
409 | << scientific << setw(10) << RlvW[i] << endl; |
---|
410 | } |
---|
411 | } |
---|
412 | |
---|
413 | // Construct ~l~vW couplings |
---|
414 | for (int k=1;k<=6;k++) { |
---|
415 | for (int l=1;l<=6;l++) { |
---|
416 | LslsvW[k][l]=0.0; |
---|
417 | RslsvW[k][l]=0.0; |
---|
418 | |
---|
419 | if(l<=3) // Only left-handed sneutrinos |
---|
420 | for(int i=1;i<=3;i++) |
---|
421 | LslsvW[k][l] += sqrt(2.0) * cosW * Rsl(k,i) * Rsl(l,i); |
---|
422 | |
---|
423 | |
---|
424 | // tmp: verbose output |
---|
425 | if (DEBUG) { |
---|
426 | cout << " LslsvW [" << k << "][" << l << "] = " |
---|
427 | << scientific << setw(10) << LslsvW[k][l] |
---|
428 | << " RslsvW [" << k << "][" << l << "] = " |
---|
429 | << scientific << setw(10) << RslsvW[k][l] << endl; |
---|
430 | } |
---|
431 | } |
---|
432 | } |
---|
433 | |
---|
434 | // Now we come to the ones with really many indices |
---|
435 | |
---|
436 | // RPV: check for lepton-neutralino mixing (not supported) |
---|
437 | if (slhaPtr->modsel(4) >= 1 && slhaPtr->rvnmix.exists()) { |
---|
438 | bool hasCrossTerms = false; |
---|
439 | for (int i=1; i<=3; ++i) |
---|
440 | for (int j=4; j<=7; ++j) |
---|
441 | if (abs(slhaPtr->rvnmix(i,j)) > 1e-5) { |
---|
442 | hasCrossTerms = true; |
---|
443 | break; |
---|
444 | } |
---|
445 | if (hasCrossTerms) |
---|
446 | slhaPtr->message(1,"initSUSY", |
---|
447 | "Neutrino-Neutralino mixing not supported!"); |
---|
448 | } |
---|
449 | |
---|
450 | // Construct ~chi0 couplings (allow for 5 neutralinos in NMSSM) |
---|
451 | for (int i=1;i<=nNeut;i++) { |
---|
452 | |
---|
453 | // Ni1, Ni2, Ni3, Ni4, Ni5 |
---|
454 | complex ni1,ni2,ni3,ni4,ni5; |
---|
455 | |
---|
456 | // In RPV, ignore neutralino-neutralino mixing |
---|
457 | if (slhaPtr->modsel(4) >= 1 && slhaPtr->rvnmix.exists()) { |
---|
458 | ni1=complex( slhaPtr->rvnmix(i+3,4), 0.0 ); |
---|
459 | ni2=complex( slhaPtr->rvnmix(i+3,5), 0.0 ); |
---|
460 | ni3=complex( slhaPtr->rvnmix(i+3,6), 0.0 ); |
---|
461 | ni4=complex( slhaPtr->rvnmix(i+3,7), 0.0 ); |
---|
462 | ni5=complex( 0.0, 0.0); |
---|
463 | } |
---|
464 | else if (not isNMSSM) { |
---|
465 | ni1=complex( slhaPtr->nmix(i,1), slhaPtr->imnmix(i,1) ); |
---|
466 | ni2=complex( slhaPtr->nmix(i,2), slhaPtr->imnmix(i,2) ); |
---|
467 | ni3=complex( slhaPtr->nmix(i,3), slhaPtr->imnmix(i,3) ); |
---|
468 | ni4=complex( slhaPtr->nmix(i,4), slhaPtr->imnmix(i,4) ); |
---|
469 | ni5=complex( 0.0, 0.0); |
---|
470 | } else { |
---|
471 | ni1=complex( slhaPtr->nmnmix(i,1), slhaPtr->imnmnmix(i,1) ); |
---|
472 | ni2=complex( slhaPtr->nmnmix(i,2), slhaPtr->imnmnmix(i,2) ); |
---|
473 | ni3=complex( slhaPtr->nmnmix(i,3), slhaPtr->imnmnmix(i,3) ); |
---|
474 | ni4=complex( slhaPtr->nmnmix(i,4), slhaPtr->imnmnmix(i,4) ); |
---|
475 | ni5=complex( slhaPtr->nmnmix(i,5), slhaPtr->imnmnmix(i,5) ); |
---|
476 | } |
---|
477 | |
---|
478 | // Change to positive mass convention |
---|
479 | complex iRot( 0., 1.); |
---|
480 | if (slhaPtr->mass(idNeut(i)) < 0.) { |
---|
481 | ni1 *= iRot; |
---|
482 | ni2 *= iRot; |
---|
483 | ni3 *= iRot; |
---|
484 | ni4 *= iRot; |
---|
485 | ni5 *= iRot; |
---|
486 | } |
---|
487 | |
---|
488 | // ~chi0 [i] ~chi0 [j] Z : loop over [j] |
---|
489 | for (int j=1; j<=nNeut; j++) { |
---|
490 | |
---|
491 | // neutralino [j] higgsino components |
---|
492 | complex nj3, nj4; |
---|
493 | if (slhaPtr->modsel(4) >= 1 && slhaPtr->rvnmix.exists()) { |
---|
494 | nj3=complex( slhaPtr->rvnmix(i+3,6), 0.0 ); |
---|
495 | nj4=complex( slhaPtr->rvnmix(i+3,7), 0.0 ); |
---|
496 | } |
---|
497 | else if (not isNMSSM) { |
---|
498 | nj3=complex( slhaPtr->nmix(j,3), slhaPtr->imnmix(j,3) ); |
---|
499 | nj4=complex( slhaPtr->nmix(j,4), slhaPtr->imnmix(j,4) ); |
---|
500 | } else { |
---|
501 | nj3=complex( slhaPtr->nmnmix(j,3), slhaPtr->imnmnmix(j,3) ); |
---|
502 | nj4=complex( slhaPtr->nmnmix(j,4), slhaPtr->imnmnmix(j,4) ); |
---|
503 | } |
---|
504 | // Change to positive mass convention |
---|
505 | if (slhaPtr->mass(idNeut(j)) < 0.) { |
---|
506 | nj3 *= iRot; |
---|
507 | nj4 *= iRot; |
---|
508 | } |
---|
509 | |
---|
510 | // ~chi0 [i] ~chi0 [j] Z : couplings |
---|
511 | OLpp[i][j] = -0.5 * ni3 * conj(nj3) + 0.5 * ni4 * conj(nj4); |
---|
512 | ORpp[i][j] = 0.5 * conj(ni3) * nj3 - 0.5 * conj(ni4) * nj4; |
---|
513 | |
---|
514 | // tmp: verbose output |
---|
515 | if (DEBUG) { |
---|
516 | cout << " OL'' [" << i << "][" << j << "] = " |
---|
517 | << scientific << setw(10) << OLpp[i][j] |
---|
518 | << " OR'' [" << i << "][" << j << "] = " |
---|
519 | << scientific << setw(10) << ORpp[i][j] << endl; |
---|
520 | } |
---|
521 | |
---|
522 | } |
---|
523 | |
---|
524 | // ~chi0 [i] ~chi+ [j] W : loop over [j] |
---|
525 | for (int j=1; j<=nChar; j++) { |
---|
526 | |
---|
527 | // Chargino mixing |
---|
528 | complex uj1, uj2, vj1, vj2; |
---|
529 | if (slhaPtr->modsel(4)<1 || not slhaPtr->rvumix.exists()) { |
---|
530 | uj1=complex( slhaPtr->umix(j,1), slhaPtr->imumix(j,1) ); |
---|
531 | uj2=complex( slhaPtr->umix(j,2), slhaPtr->imumix(j,2) ); |
---|
532 | vj1=complex( slhaPtr->vmix(j,1), slhaPtr->imvmix(j,1) ); |
---|
533 | vj2=complex( slhaPtr->vmix(j,2), slhaPtr->imvmix(j,2) ); |
---|
534 | } |
---|
535 | // RPV: ignore lepton-chargino mixing |
---|
536 | else { |
---|
537 | uj1=complex( slhaPtr->rvumix(j+3,4), 0.0 ); |
---|
538 | uj2=complex( slhaPtr->rvumix(j+3,5), 0.0 ); |
---|
539 | vj1=complex( slhaPtr->rvvmix(j+3,4), 0.0 ); |
---|
540 | vj2=complex( slhaPtr->rvvmix(j+3,5), 0.0 ); |
---|
541 | } |
---|
542 | |
---|
543 | // ~chi0 [i] ~chi+ [j] W : couplings |
---|
544 | OL[i][j] = -1.0/sqrt(2.0)*ni4*conj(vj2)+ni2*conj(vj1); |
---|
545 | OR[i][j] = 1.0/sqrt(2.0)*conj(ni3)*uj2+conj(ni2)*uj1; |
---|
546 | |
---|
547 | // tmp: verbose output |
---|
548 | if (DEBUG) { |
---|
549 | cout << " OL [" << i << "][" << j << "] = " |
---|
550 | << scientific << setw(10) << OL[i][j] |
---|
551 | << " OR [" << i << "][" << j << "] = " |
---|
552 | << scientific << setw(10) << OR[i][j] << endl; |
---|
553 | } |
---|
554 | } |
---|
555 | |
---|
556 | |
---|
557 | // ~qqX couplings |
---|
558 | // Quark Charges |
---|
559 | double ed = -1.0/3.0; |
---|
560 | double T3d = -0.5; |
---|
561 | double eu = 2.0/3.0; |
---|
562 | double T3u = 0.5; |
---|
563 | |
---|
564 | // Loop over quark [k] generation |
---|
565 | for (int k=1;k<=3;k++) { |
---|
566 | |
---|
567 | // Set quark masses |
---|
568 | // Initial guess 0,0,0,mc,mb,mt with the latter from the PDT |
---|
569 | double mu = particleDataPtr->m0(2*k); |
---|
570 | double md = particleDataPtr->m0(2*k-1); |
---|
571 | if (k == 1) { mu=0.0 ; md=0.0; } |
---|
572 | if (k == 2) { md=0.0 ; mu=0.0; } |
---|
573 | |
---|
574 | // Compute running mass from Yukawas and vevs if possible. |
---|
575 | if (slhaPtr->yd.exists() && slhaPtr->hmix.exists(3)) { |
---|
576 | double ykk=slhaPtr->yd(k,k); |
---|
577 | double v1=slhaPtr->hmix(3)/sqrt(1+pow(tanb,2)); |
---|
578 | if (ykk > 0.0) md = ykk * v1 / sqrt(2.0) ; |
---|
579 | } |
---|
580 | if (slhaPtr->yu.exists() && slhaPtr->hmix.exists(3)) { |
---|
581 | double ykk=slhaPtr->yu(k,k); |
---|
582 | double v2=slhaPtr->hmix(3)/sqrt(1.0+1.0/pow(tanb,2)); |
---|
583 | if (ykk > 0.0) mu = ykk * v2 / sqrt(2.0) ; |
---|
584 | } |
---|
585 | |
---|
586 | // tmp: verbose output |
---|
587 | if (DEBUG) { |
---|
588 | cout << " Gen = " << k << " mu = " << mu << " md = " << md |
---|
589 | << " yUU,DD = " << slhaPtr->yu(k,k) << "," |
---|
590 | << slhaPtr->yd(k,k) << endl; |
---|
591 | } |
---|
592 | |
---|
593 | // Loop over squark [j] flavour |
---|
594 | for (int j=1;j<=6;j++) { |
---|
595 | |
---|
596 | // Squark mixing |
---|
597 | complex Rdjk = complex(Rd(j,k), imRd(j,k) ); |
---|
598 | complex Rdjk3 = complex(Rd(j,k+3),imRd(j,k+3)); |
---|
599 | complex Rujk = complex(Ru(j,k), imRu(j,k) ); |
---|
600 | complex Rujk3 = complex(Ru(j,k+3),imRu(j,k+3)); |
---|
601 | |
---|
602 | // ~d[j] d[k] ~chi0[i] |
---|
603 | // Changed according to new notation |
---|
604 | LsddX[j][k][i] = ((ed-T3d)*sinW*ni1 + T3d*cosW*ni2)*conj(Rdjk) |
---|
605 | + md*cosW*ni3*conj(Rdjk3)/2.0/mW/cosb; |
---|
606 | RsddX[j][k][i] = -ed*sinW*conj(ni1)*conj(Rdjk3) |
---|
607 | + md*cosW*conj(ni3)*conj(Rdjk)/2.0/mW/cosb; |
---|
608 | |
---|
609 | // ~u[j] u[k] ~chi0[i] |
---|
610 | LsuuX[j][k][i] = ((eu-T3u)*sinW*ni1 + T3u*cosW*ni2)*conj(Rujk) |
---|
611 | + mu*cosW*ni4*conj(Rujk3)/2.0/mW/sinb; |
---|
612 | RsuuX[j][k][i] = -eu*sinW*conj(ni1)*conj(Rujk3) |
---|
613 | + mu*cosW*conj(ni4)*conj(Rujk)/2.0/mW/sinb; |
---|
614 | |
---|
615 | if (DEBUG) { |
---|
616 | if (abs(LsddX[j][k][i]) > 1e-6) { |
---|
617 | // tmp: verbose output |
---|
618 | cout << " LsddX[" << j << "][" << k << "][" << i << "] = " |
---|
619 | << scientific << setw(10) << LsddX[j][k][i] << endl; |
---|
620 | } |
---|
621 | if (abs(RsddX[j][k][i]) > 1e-6) { |
---|
622 | // tmp: verbose output |
---|
623 | cout << " RsddX[" << j << "][" << k << "][" << i << "] = " |
---|
624 | << scientific << setw(10) << RsddX[j][k][i] << endl; |
---|
625 | } |
---|
626 | if (abs(LsuuX[j][k][i]) > 1e-6) { |
---|
627 | // tmp: verbose output |
---|
628 | cout << " LsuuX[" << j << "][" << k << "][" << i << "] = " |
---|
629 | << scientific << setw(10) << LsuuX[j][k][i] << endl; |
---|
630 | } |
---|
631 | if (abs(RsuuX[j][k][i]) > 1e-6) { |
---|
632 | // tmp: verbose output |
---|
633 | cout << " RsuuX[" << j << "][" << k << "][" << i << "] = " |
---|
634 | << scientific << setw(10) << RsuuX[j][k][i] << endl; |
---|
635 | } |
---|
636 | } |
---|
637 | } |
---|
638 | } |
---|
639 | |
---|
640 | // Start slepton couplings |
---|
641 | // Lepton Charges |
---|
642 | double el = -1.0; |
---|
643 | double T3l = -0.5; |
---|
644 | double ev = 0.0; |
---|
645 | double T3v = 0.5; |
---|
646 | |
---|
647 | // Need to define lepton mass |
---|
648 | for (int k=1;k<=3;k++) { |
---|
649 | // Set lepton masses |
---|
650 | double ml(0.0); |
---|
651 | if(k==3) ml = particleDataPtr->m0(15); |
---|
652 | |
---|
653 | for(int j=1;j<=6;j++){ |
---|
654 | LsllX[j][k][i] = 0; |
---|
655 | RsllX[j][k][i] = 0; |
---|
656 | LsvvX[j][k][i] = 0; |
---|
657 | RsvvX[j][k][i] = 0; |
---|
658 | |
---|
659 | // ~l[j] l[k] ~chi0[i] |
---|
660 | // Changed according to new notation |
---|
661 | LsllX[j][k][i] = ((el-T3l)*sinW*ni1 + T3l*cosW*ni2)*Rsl(j,k) |
---|
662 | + ml*cosW*ni3/2.0/mW/cosb*Rsl(j,k+3); |
---|
663 | RsllX[j][k][i] = -el*sinW*conj(ni1)*Rsl(j,k+3) |
---|
664 | + ml*cosW*conj(ni3)/2.0/mW/cosb*Rsl(j,k); |
---|
665 | |
---|
666 | if(j<3 && j==k){ |
---|
667 | // No sneutrino mixing; only left handed |
---|
668 | // ~v[j] v[k] ~chi0[i] |
---|
669 | LsvvX[j][k][i] = ((ev-T3v)*sinW*ni1 + T3v*cosW*ni2); |
---|
670 | } |
---|
671 | |
---|
672 | if (DEBUG) { |
---|
673 | if (abs(LsllX[j][k][i]) > 1e-6) { |
---|
674 | // tmp: verbose output |
---|
675 | cout << " LsllX[" << j << "][" << k << "][" << i << "] = " |
---|
676 | << scientific << setw(10) << LsllX[j][k][i] << endl; |
---|
677 | } |
---|
678 | if (abs(RsllX[j][k][i]) > 1e-6) { |
---|
679 | // tmp: verbose output |
---|
680 | cout << " RsllX[" << j << "][" << k << "][" << i << "] = " |
---|
681 | << scientific << setw(10) << RsllX[j][k][i] << endl; |
---|
682 | } |
---|
683 | if (abs(LsvvX[j][k][i]) > 1e-6) { |
---|
684 | // tmp: verbose output |
---|
685 | cout << " LsvvX[" << j << "][" << k << "][" << i << "] = " |
---|
686 | << scientific << setw(10) << LsvvX[j][k][i] << endl; |
---|
687 | } |
---|
688 | } |
---|
689 | } |
---|
690 | } |
---|
691 | } |
---|
692 | |
---|
693 | // RPV: check for lepton-chargino mixing (not supported) |
---|
694 | if (slhaPtr->modsel(4) >= 1 && slhaPtr->rvumix.exists()) { |
---|
695 | bool hasCrossTerms = false; |
---|
696 | for (int i=1; i<=3; ++i) |
---|
697 | for (int j=4; j<=5; ++j) |
---|
698 | if (abs(slhaPtr->rvumix(i,j)) > 1e-5 |
---|
699 | || abs(slhaPtr->rvvmix(i,j)) > 1e-5) { |
---|
700 | hasCrossTerms = true; |
---|
701 | break; |
---|
702 | } |
---|
703 | if (hasCrossTerms) |
---|
704 | slhaPtr->message(1,"initSUSY", |
---|
705 | "Lepton-Chargino mixing not supported!"); |
---|
706 | } |
---|
707 | |
---|
708 | // Construct ~chi+ couplings |
---|
709 | // sqrt(2) |
---|
710 | double rt2 = sqrt(2.0); |
---|
711 | |
---|
712 | for (int i=1;i<=nChar;i++) { |
---|
713 | |
---|
714 | // Ui1, Ui2, Vi1, Vi2 |
---|
715 | complex ui1,ui2,vi1,vi2; |
---|
716 | ui1=complex( slhaPtr->umix(i,1), slhaPtr->imumix(i,1) ); |
---|
717 | ui2=complex( slhaPtr->umix(i,2), slhaPtr->imumix(i,2) ); |
---|
718 | vi1=complex( slhaPtr->vmix(i,1), slhaPtr->imvmix(i,1) ); |
---|
719 | vi2=complex( slhaPtr->vmix(i,2), slhaPtr->imvmix(i,2) ); |
---|
720 | |
---|
721 | // ~chi+ [i] ~chi- [j] Z : loop over [j] |
---|
722 | for (int j=1; j<=nChar; j++) { |
---|
723 | |
---|
724 | // Chargino mixing |
---|
725 | complex uj1, uj2, vj1, vj2; |
---|
726 | uj1=complex( slhaPtr->umix(j,1), slhaPtr->imumix(j,1) ); |
---|
727 | uj2=complex( slhaPtr->umix(j,2), slhaPtr->imumix(j,2) ); |
---|
728 | vj1=complex( slhaPtr->vmix(j,1), slhaPtr->imvmix(j,1) ); |
---|
729 | vj2=complex( slhaPtr->vmix(j,2), slhaPtr->imvmix(j,2) ); |
---|
730 | |
---|
731 | // ~chi+ [i] ~chi- [j] Z : couplings |
---|
732 | OLp[i][j] = -vi1*conj(vj1) - 0.5*vi2*conj(vj2) |
---|
733 | + ( (i == j) ? sin2W : 0.0); |
---|
734 | ORp[i][j] = -conj(ui1)*uj1 - 0.5*conj(ui2)*uj2 |
---|
735 | + ( (i == j) ? sin2W : 0.0); |
---|
736 | |
---|
737 | if (DEBUG) { |
---|
738 | // tmp: verbose output |
---|
739 | cout << " OL' [" << i << "][" << j << "] = " |
---|
740 | << scientific << setw(10) << OLp[i][j] |
---|
741 | << " OR' [" << i << "][" << j << "] = " |
---|
742 | << scientific << setw(10) << ORp[i][j] << endl; |
---|
743 | } |
---|
744 | } |
---|
745 | |
---|
746 | // Loop over quark [l] flavour |
---|
747 | for (int l=1;l<=3;l++) { |
---|
748 | |
---|
749 | // Set quark [l] masses |
---|
750 | // Initial guess 0,0,0,mc,mb,mt with the latter from the PDT |
---|
751 | double mul = particleDataPtr->m0(2*l); |
---|
752 | double mdl = particleDataPtr->m0(2*l-1); |
---|
753 | if (l == 1 || l == 2) { mul=0.0 ; mdl=0.0; } |
---|
754 | |
---|
755 | // Compute running mass from Yukawas and vevs if possible. |
---|
756 | if (slhaPtr->yd.exists() && slhaPtr->hmix.exists(3)) { |
---|
757 | double yll=slhaPtr->yd(l,l); |
---|
758 | double v1=slhaPtr->hmix(3)/sqrt(1+pow(tanb,2)); |
---|
759 | if (yll > 0.0) mdl = yll * v1 / sqrt(2.0) ; |
---|
760 | } |
---|
761 | if (slhaPtr->yu.exists() && slhaPtr->hmix.exists(3)) { |
---|
762 | double yll=slhaPtr->yu(l,l); |
---|
763 | double v2=slhaPtr->hmix(3)/sqrt(1.0+1.0/pow(tanb,2)); |
---|
764 | if (yll > 0.0) mul = yll * v2 / sqrt(2.0) ; |
---|
765 | } |
---|
766 | |
---|
767 | // Loop over squark [j] flavour |
---|
768 | for (int j=1;j<=6;j++) { |
---|
769 | |
---|
770 | // Loop over off-diagonal quark [k] generation |
---|
771 | for (int k=1;k<=3;k++) { |
---|
772 | |
---|
773 | // Set quark [k] masses |
---|
774 | // Initial guess 0,0,0,0,mb,mt with the latter from the PDT |
---|
775 | double muk = particleDataPtr->m0(2*k); |
---|
776 | double mdk = particleDataPtr->m0(2*k-1); |
---|
777 | if (k == 1) { muk=0.0 ; mdk=0.0; } |
---|
778 | if (k == 2) { mdk=0.0 ; muk=0.0; } |
---|
779 | |
---|
780 | // Compute running mass from Yukawas and vevs if possible. |
---|
781 | if (slhaPtr->yd.exists() && slhaPtr->hmix.exists(3)) { |
---|
782 | double ykk=slhaPtr->yd(k,k); |
---|
783 | double v1=slhaPtr->hmix(3)/sqrt(1+pow(tanb,2)); |
---|
784 | if (ykk > 0.0) mdk = ykk * v1 / sqrt(2.0) ; |
---|
785 | } |
---|
786 | if (slhaPtr->yu.exists() && slhaPtr->hmix.exists(3)) { |
---|
787 | double ykk=slhaPtr->yu(k,k); |
---|
788 | double v2=slhaPtr->hmix(3)/sqrt(1.0+1.0/pow(tanb,2)); |
---|
789 | if (ykk > 0.0) muk = ykk * v2 / sqrt(2.0) ; |
---|
790 | } |
---|
791 | |
---|
792 | // CKM matrix (use Pythia one if no SLHA) |
---|
793 | // (NB: could also try input one if no running one found, but |
---|
794 | // would then need to compute from Wolfenstein) |
---|
795 | complex Vlk=VCKMgen(l,k); |
---|
796 | complex Vkl=VCKMgen(k,l); |
---|
797 | if (slhaPtr->vckm.exists()) { |
---|
798 | Vlk=complex(slhaPtr->vckm(l,k),slhaPtr->imvckm(l,k)); |
---|
799 | Vkl=complex(slhaPtr->vckm(k,l),slhaPtr->imvckm(k,l)); |
---|
800 | } |
---|
801 | |
---|
802 | // Squark mixing |
---|
803 | complex Rdjk = complex(Rd(j,k), imRd(j,k) ); |
---|
804 | complex Rdjk3 = complex(Rd(j,k+3),imRd(j,k+3)); |
---|
805 | complex Rujk = complex(Ru(j,k), imRu(j,k) ); |
---|
806 | complex Rujk3 = complex(Ru(j,k+3),imRu(j,k+3)); |
---|
807 | |
---|
808 | |
---|
809 | // ~d[j] u[l] ~chi+[i] |
---|
810 | LsduX[j][l][i] += (ui1*conj(Rdjk) |
---|
811 | - mdk*ui2*conj(Rdjk3)/rt2/mW/cosb)*Vlk; |
---|
812 | RsduX[j][l][i] -= mul*conj(vi2)*Vlk*conj(Rdjk)/rt2/mW/sinb; |
---|
813 | |
---|
814 | // ~u[j] d[l] ~chi+[i] |
---|
815 | LsudX[j][l][i] += (conj(vi1)*Rujk |
---|
816 | - muk*conj(vi2)*Rujk3/rt2/mW/sinb)*Vkl; |
---|
817 | RsudX[j][l][i] -= mdl*ui2*Vkl*Rujk/rt2/mW/cosb; |
---|
818 | |
---|
819 | } |
---|
820 | |
---|
821 | if (DEBUG) { |
---|
822 | if (max(abs(LsduX[j][l][i]),abs(RsduX[j][l][i])) > 1e-6) { |
---|
823 | // tmp: verbose output |
---|
824 | cout << " LsduX[" << j << "][" << l << "][" << i << "] = " |
---|
825 | << scientific << setw(10) << LsduX[j][l][i]; |
---|
826 | cout << " RsduX[" << j << "][" << l << "][" << i << "] = " |
---|
827 | << scientific << setw(10) << RsduX[j][l][i] << endl; |
---|
828 | } |
---|
829 | if (max(abs(LsudX[j][l][i]),abs(RsudX[j][l][i])) > 1e-6) { |
---|
830 | // tmp: verbose output |
---|
831 | cout << " LsudX[" << j << "][" << l << "][" << i << "] = " |
---|
832 | << scientific << setw(10) << LsudX[j][l][i]; |
---|
833 | cout << " RsudX[" << j << "][" << l << "][" << i << "] = " |
---|
834 | << scientific << setw(10) << RsudX[j][l][i] << endl; |
---|
835 | } |
---|
836 | } |
---|
837 | } |
---|
838 | } |
---|
839 | |
---|
840 | // Loop over slepton [j] flavour |
---|
841 | for (int j=1;j<=6;j++) { |
---|
842 | for (int k=1;k<=3;k++) { |
---|
843 | |
---|
844 | LslvX[j][k][i] = 0.0; |
---|
845 | RslvX[j][k][i] = 0.0; |
---|
846 | LsvlX[j][k][i] = 0.0; |
---|
847 | RsvlX[j][k][i] = 0.0; |
---|
848 | |
---|
849 | // Set lepton [k] masses |
---|
850 | double ml = 0.0; |
---|
851 | if (k == 3) ml = particleDataPtr->m0(15); |
---|
852 | |
---|
853 | if(j==k || j==k+3){ // No lepton mixing |
---|
854 | |
---|
855 | // ~l[j] v[l] ~chi+[i] |
---|
856 | LslvX[j][k][i] += ui1- ml*ui2/rt2/mW/cosb; |
---|
857 | RslvX[j][k][i] -= ml*conj(vi2)/rt2/mW/sinb; |
---|
858 | |
---|
859 | // ~v[j] l[l] ~chi+[i] |
---|
860 | if(j<=3){ // No right handed sneutrinos |
---|
861 | LsvlX[j][k][i] += conj(vi1) - ml*conj(vi2)/rt2/mW/sinb; |
---|
862 | } |
---|
863 | } |
---|
864 | |
---|
865 | if (DEBUG) { |
---|
866 | if (max(abs(LslvX[j][k][i]),abs(RslvX[j][k][i])) > 1e-6) { |
---|
867 | // tmp: verbose output |
---|
868 | cout << " LslvX[" << j << "][" << k << "][" << i << "] = " |
---|
869 | << scientific << setw(10) << LslvX[j][k][i]; |
---|
870 | cout << " RslvX[" << j << "][" << k << "][" << i << "] = " |
---|
871 | << scientific << setw(10) << RslvX[j][k][i] << endl; |
---|
872 | } |
---|
873 | if (max(abs(LsvlX[j][k][i]),abs(RsvlX[j][k][i])) > 1e-6) { |
---|
874 | // tmp: verbose output |
---|
875 | cout << " LsvlX[" << j << "][" << k << "][" << i << "] = " |
---|
876 | << scientific << setw(10) << LsvlX[j][k][i]; |
---|
877 | cout << " RsvlX[" << j << "][" << k << "][" << i << "] = " |
---|
878 | << scientific << setw(10) << RsvlX[j][k][i] << endl; |
---|
879 | } |
---|
880 | } |
---|
881 | } |
---|
882 | } |
---|
883 | } |
---|
884 | |
---|
885 | // SLHA2 compatibility |
---|
886 | // Check whether scalar particle masses are ordered |
---|
887 | bool orderedQ = true; |
---|
888 | bool orderedL = true; |
---|
889 | for (int j=1;j<=5;j++) { |
---|
890 | if (particleDataPtr->m0(idSlep(j+1)) < particleDataPtr->m0(idSlep(j))) |
---|
891 | orderedL = false; |
---|
892 | if (particleDataPtr->m0(idSup(j+1)) < particleDataPtr->m0(idSup(j))) |
---|
893 | orderedQ = false; |
---|
894 | if (particleDataPtr->m0(idSdown(j+1)) <particleDataPtr->m0(idSdown(j))) |
---|
895 | orderedQ = false; |
---|
896 | } |
---|
897 | |
---|
898 | // If ordered, change sparticle labels to mass-ordered enumeration |
---|
899 | for (int i=1;i<=6;i++) { |
---|
900 | ostringstream indx; |
---|
901 | indx << i; |
---|
902 | string uName = "~u_"+indx.str(); |
---|
903 | string dName = "~d_"+indx.str(); |
---|
904 | string lName = "~e_"+indx.str(); |
---|
905 | ParticleDataEntry* pdePtr; |
---|
906 | if (orderedQ) { |
---|
907 | pdePtr = particleDataPtr->particleDataEntryPtr(idSup(i)); |
---|
908 | pdePtr->setNames(uName,uName+"bar"); |
---|
909 | pdePtr = particleDataPtr->particleDataEntryPtr(idSdown(i)); |
---|
910 | pdePtr->setNames(dName,dName+"bar"); |
---|
911 | } |
---|
912 | if (orderedL) { |
---|
913 | pdePtr = particleDataPtr->particleDataEntryPtr(idSlep(i)); |
---|
914 | pdePtr->setNames(lName,lName+"bar"); |
---|
915 | } |
---|
916 | } |
---|
917 | |
---|
918 | // Shorthand for RPV couplings |
---|
919 | // The input LNV lambda couplings |
---|
920 | LHtensor3Block<3> rvlle(slhaPtr->rvlamlle); |
---|
921 | // The input LNV lambda' couplings |
---|
922 | LHtensor3Block<3> rvlqd(slhaPtr->rvlamlqd); |
---|
923 | // The input BNV lambda'' couplings |
---|
924 | LHtensor3Block<3> rvudd(slhaPtr->rvlamudd); |
---|
925 | |
---|
926 | isLLE = false; |
---|
927 | isLQD = false; |
---|
928 | isUDD = false; |
---|
929 | |
---|
930 | // Symmetry properties |
---|
931 | if(rvlle.exists()){ |
---|
932 | isLLE = true; |
---|
933 | for(int i=1;i<=3;i++){ |
---|
934 | for(int j=i;j<=3;j++){ |
---|
935 | //lambda(i,j,k)=-lambda(j,i,k) |
---|
936 | for(int k=1;k<=3;k++){ |
---|
937 | if(i==j){ |
---|
938 | rvLLE[i][j][k] = 0.0; |
---|
939 | }else{ |
---|
940 | rvLLE[i][j][k] = rvlle(i,j,k); |
---|
941 | rvLLE[j][i][k] = -rvlle(i,j,k); |
---|
942 | } |
---|
943 | } |
---|
944 | } |
---|
945 | } |
---|
946 | } |
---|
947 | |
---|
948 | if(rvlqd.exists()){ |
---|
949 | isLQD=true; |
---|
950 | for(int i=1;i<=3;i++){ |
---|
951 | for(int j=1;j<=3;j++){ |
---|
952 | for(int k=1;k<=3;k++){ |
---|
953 | rvLQD[i][j][k] = rvlqd(i,j,k); |
---|
954 | } |
---|
955 | } |
---|
956 | } |
---|
957 | } |
---|
958 | |
---|
959 | //lambda''(k,j,i)=-lambda''(k,i,j) |
---|
960 | |
---|
961 | if(rvudd.exists()){ |
---|
962 | isUDD = true; |
---|
963 | for(int i=1;i<=3;i++){ |
---|
964 | for(int j=i;j<=3;j++){ |
---|
965 | for(int k=1;k<=3;k++){ |
---|
966 | if(i==j){ |
---|
967 | rvUDD[k][i][j] = 0.0; |
---|
968 | }else{ |
---|
969 | rvUDD[k][i][j] = rvudd(k,i,j); |
---|
970 | rvUDD[k][j][i] = -rvudd(k,i,j); |
---|
971 | } |
---|
972 | } |
---|
973 | } |
---|
974 | } |
---|
975 | } |
---|
976 | |
---|
977 | if(DEBUG){ |
---|
978 | for(int i=1;i<=3;i++){ |
---|
979 | for(int j=1;j<=3;j++){ |
---|
980 | for(int k=1;k<=3;k++){ |
---|
981 | if(rvlle.exists()) |
---|
982 | cout<<"LambdaLLE["<<i<<"]["<<j<<"]["<<k<<"]="<<rvLLE[i][j][k]<<" "; |
---|
983 | if(rvlqd.exists()) |
---|
984 | cout<<"LambdaLQD["<<i<<"]["<<j<<"]["<<k<<"]="<<rvLQD[i][j][k]<<" "; |
---|
985 | if(rvudd.exists()) |
---|
986 | cout<<"LambdaUDD["<<i<<"]["<<j<<"]["<<k<<"]="<<rvUDD[i][j][k] |
---|
987 | <<"\n"; |
---|
988 | } |
---|
989 | } |
---|
990 | } |
---|
991 | } |
---|
992 | |
---|
993 | // Store the squark mixing matrix |
---|
994 | for(int i=1;i<=6;i++){ |
---|
995 | for(int j=1;j<=3;j++){ |
---|
996 | Rusq[i][j] = complex(Ru(i,j), imRu(i,j) ); |
---|
997 | Rusq[i][j+3] = complex(Ru(i,j+3),imRu(i,j+3)); |
---|
998 | Rdsq[i][j] = complex(Rd(i,j), imRd(i,j) ); |
---|
999 | Rdsq[i][j+3] = complex(Rd(i,j+3),imRd(i,j+3)); |
---|
1000 | } |
---|
1001 | } |
---|
1002 | |
---|
1003 | if(DEBUG){ |
---|
1004 | cout<<"Ru"<<endl; |
---|
1005 | for(int i=1;i<=6;i++){ |
---|
1006 | for(int j=1;j<=6;j++){ |
---|
1007 | cout << real(Rusq[i][j])<<" "; |
---|
1008 | } |
---|
1009 | cout<<endl; |
---|
1010 | } |
---|
1011 | cout<<"Rd"<<endl; |
---|
1012 | for(int i=1;i<=6;i++){ |
---|
1013 | for(int j=1;j<=6;j++){ |
---|
1014 | cout << real(Rdsq[i][j])<<" "; |
---|
1015 | } |
---|
1016 | cout<<endl; |
---|
1017 | } |
---|
1018 | } |
---|
1019 | |
---|
1020 | // Let everyone know we are ready |
---|
1021 | isInit = true; |
---|
1022 | } |
---|
1023 | |
---|
1024 | //-------------------------------------------------------------------------- |
---|
1025 | |
---|
1026 | // Return neutralino flavour codes. |
---|
1027 | |
---|
1028 | int CoupSUSY::idNeut(int idChi) { |
---|
1029 | |
---|
1030 | int id = 0; |
---|
1031 | if (idChi == 1) id = 1000022; |
---|
1032 | else if (idChi == 2) id = 1000023; |
---|
1033 | else if (idChi == 3) id = 1000025; |
---|
1034 | else if (idChi == 4) id = 1000035; |
---|
1035 | else if (idChi == 5) id = 1000045; |
---|
1036 | return id; |
---|
1037 | } |
---|
1038 | |
---|
1039 | //-------------------------------------------------------------------------- |
---|
1040 | |
---|
1041 | // Return chargino flavour codes. |
---|
1042 | |
---|
1043 | int CoupSUSY::idChar(int idChi) { |
---|
1044 | |
---|
1045 | int id = 0; |
---|
1046 | if (idChi == 1) id = 1000024; |
---|
1047 | else if (idChi == -1) id = -1000024; |
---|
1048 | else if (idChi == 2) id = 1000037; |
---|
1049 | else if (idChi == -2) id = -1000037; |
---|
1050 | return id; |
---|
1051 | } |
---|
1052 | |
---|
1053 | //-------------------------------------------------------------------------- |
---|
1054 | |
---|
1055 | // Return sup flavour codes. |
---|
1056 | |
---|
1057 | int CoupSUSY::idSup(int iSup) { |
---|
1058 | |
---|
1059 | int id = 0; |
---|
1060 | int sgn = ( iSup > 0 ) ? 1 : -1; |
---|
1061 | iSup = abs(iSup); |
---|
1062 | if (iSup == 1) id = 1000002; |
---|
1063 | else if (iSup == 2) id = 1000004; |
---|
1064 | else if (iSup == 3) id = 1000006; |
---|
1065 | else if (iSup == 4) id = 2000002; |
---|
1066 | else if (iSup == 5) id = 2000004; |
---|
1067 | else if (iSup == 6) id = 2000006; |
---|
1068 | return sgn*id; |
---|
1069 | } |
---|
1070 | |
---|
1071 | //-------------------------------------------------------------------------- |
---|
1072 | |
---|
1073 | // Return sdown flavour codes |
---|
1074 | |
---|
1075 | int CoupSUSY::idSdown(int iSdown) { |
---|
1076 | |
---|
1077 | int id = 0; |
---|
1078 | int sgn = ( iSdown > 0 ) ? 1 : -1; |
---|
1079 | iSdown = abs(iSdown); |
---|
1080 | if (iSdown == 1) id = 1000001; |
---|
1081 | else if (iSdown == 2) id = 1000003; |
---|
1082 | else if (iSdown == 3) id = 1000005; |
---|
1083 | else if (iSdown == 4) id = 2000001; |
---|
1084 | else if (iSdown == 5) id = 2000003; |
---|
1085 | else if (iSdown == 6) id = 2000005; |
---|
1086 | return sgn*id; |
---|
1087 | } |
---|
1088 | |
---|
1089 | //-------------------------------------------------------------------------- |
---|
1090 | |
---|
1091 | // Function to return slepton flavour codes |
---|
1092 | |
---|
1093 | int CoupSUSY::idSlep(int iSlep) { |
---|
1094 | |
---|
1095 | int id = 0; |
---|
1096 | int sgn = ( iSlep > 0 ) ? 1 : -1; |
---|
1097 | iSlep = abs(iSlep); |
---|
1098 | if (iSlep == 1) id = 1000011; |
---|
1099 | else if (iSlep == 2) id = 1000013; |
---|
1100 | else if (iSlep == 3) id = 1000015; |
---|
1101 | else if (iSlep == 4) id = 2000011; |
---|
1102 | else if (iSlep == 5) id = 2000013; |
---|
1103 | else if (iSlep == 6) id = 2000015; |
---|
1104 | return sgn*id; |
---|
1105 | } |
---|
1106 | |
---|
1107 | //-------------------------------------------------------------------------- |
---|
1108 | |
---|
1109 | // Return a particle name, given the PDG code. |
---|
1110 | |
---|
1111 | string CoupSUSY::getName(int pdgCode) { |
---|
1112 | |
---|
1113 | // Absolute value and corresponding SM code |
---|
1114 | int codeA = abs(pdgCode); |
---|
1115 | int idSM = codeA % 1000000; |
---|
1116 | |
---|
1117 | // Name |
---|
1118 | string name; |
---|
1119 | |
---|
1120 | // Flag to indicate whether SLHA1 or SLHA2 |
---|
1121 | bool slha1 = false; |
---|
1122 | |
---|
1123 | // SM particles |
---|
1124 | if (codeA == idSM) { |
---|
1125 | // Neutrinos |
---|
1126 | if (!slhaPtr->upmns.exists()) slha1=true; |
---|
1127 | if (codeA == 12) name = (slha1) ? "nu_e" : "nu_1"; |
---|
1128 | if (codeA == 14) name = (slha1) ? "nu_mu" : "nu_2"; |
---|
1129 | if (codeA == 16) name = (slha1) ? "nu_tau" : "nu_3"; |
---|
1130 | } |
---|
1131 | |
---|
1132 | // Squarks |
---|
1133 | else if ( idSM <= 6) { |
---|
1134 | // up squarks |
---|
1135 | if (idSM % 2 == 0) { |
---|
1136 | // If SLHA1, return old PDG names |
---|
1137 | if (slhaPtr->stopmix.exists()) slha1 = true; |
---|
1138 | if (codeA == 1000002) name = (slha1) ? "~u_L" : "~u_1"; |
---|
1139 | if (codeA == 1000004) name = (slha1) ? "~c_L" : "~u_2"; |
---|
1140 | if (codeA == 1000006) name = (slha1) ? "~t_1" : "~u_3"; |
---|
1141 | if (codeA == 2000002) name = (slha1) ? "~u_R" : "~u_4"; |
---|
1142 | if (codeA == 2000004) name = (slha1) ? "~c_R" : "~u_5"; |
---|
1143 | if (codeA == 2000006) name = (slha1) ? "~t_2" : "~u_6"; |
---|
1144 | } |
---|
1145 | // down squarks |
---|
1146 | else { |
---|
1147 | // If SLHA1, return old PDG names |
---|
1148 | if (slhaPtr->sbotmix.exists()) slha1 = true; |
---|
1149 | if (codeA == 1000001) name = (slha1) ? "~d_L" : "~d_1"; |
---|
1150 | if (codeA == 1000003) name = (slha1) ? "~s_L" : "~d_2"; |
---|
1151 | if (codeA == 1000005) name = (slha1) ? "~b_1" : "~d_3"; |
---|
1152 | if (codeA == 2000001) name = (slha1) ? "~d_R" : "~d_4"; |
---|
1153 | if (codeA == 2000003) name = (slha1) ? "~s_R" : "~d_5"; |
---|
1154 | if (codeA == 2000005) name = (slha1) ? "~b_2" : "~d_6"; |
---|
1155 | } |
---|
1156 | if (pdgCode < 0) name += "bar"; |
---|
1157 | } |
---|
1158 | |
---|
1159 | // Sleptons |
---|
1160 | else if ( idSM <= 19 ) { |
---|
1161 | |
---|
1162 | // Sneutrinos |
---|
1163 | if (idSM % 2 == 0) { |
---|
1164 | // If SLHA1, return old PDG names |
---|
1165 | if (slhaPtr->staumix.exists()) slha1 = true; |
---|
1166 | if (codeA == 1000012) name = (slha1) ? "~nu_eL" : "~nu_1"; |
---|
1167 | if (codeA == 1000014) name = (slha1) ? "~nu_muL" : "~nu_2"; |
---|
1168 | if (codeA == 1000016) name = (slha1) ? "~nu_tauL" : "~nu_3"; |
---|
1169 | if (codeA == 2000012) name = (slha1) ? "~nu_eR" : "~nu_4"; |
---|
1170 | if (codeA == 2000014) name = (slha1) ? "~nu_muR" : "~nu_5"; |
---|
1171 | if (codeA == 2000016) name = (slha1) ? "~nu_tauR" : "~nu_6"; |
---|
1172 | if (pdgCode < 0) name += "bar"; |
---|
1173 | } |
---|
1174 | // charged sleptons |
---|
1175 | else { |
---|
1176 | // If SLHA1, return old PDG names |
---|
1177 | if (slhaPtr->staumix.exists()) slha1 = true; |
---|
1178 | if (codeA == 1000011) name = (slha1) ? "~e_L" : "~e_1"; |
---|
1179 | if (codeA == 1000013) name = (slha1) ? "~mu_L" : "~e_2"; |
---|
1180 | if (codeA == 1000015) name = (slha1) ? "~tau_1" : "~e_3"; |
---|
1181 | if (codeA == 2000011) name = (slha1) ? "~e_R" : "~e_4"; |
---|
1182 | if (codeA == 2000013) name = (slha1) ? "~mu_R" : "~e_5"; |
---|
1183 | if (codeA == 2000015) name = (slha1) ? "~tau_2" : "~e_6"; |
---|
1184 | if (pdgCode < 0) name += "-"; |
---|
1185 | else name += "+"; |
---|
1186 | } |
---|
1187 | } |
---|
1188 | |
---|
1189 | else if (codeA == 1000021) name = "~g"; |
---|
1190 | else if (codeA == 1000022) name = "~chi_10"; |
---|
1191 | else if (codeA == 1000023) name = "~chi_20"; |
---|
1192 | else if (codeA == 1000024) name = (pdgCode > 0) ? "~chi_1+" : "~chi_1-"; |
---|
1193 | else if (codeA == 1000025) name = "~chi_30"; |
---|
1194 | else if (codeA == 1000035) name = "~chi_40"; |
---|
1195 | else if (codeA == 1000037) name = (pdgCode > 0) ? "~chi_2+" : "~chi_2-"; |
---|
1196 | |
---|
1197 | return name; |
---|
1198 | |
---|
1199 | } |
---|
1200 | |
---|
1201 | //-------------------------------------------------------------------------- |
---|
1202 | |
---|
1203 | // Return neutralino code; zero if not a neutralino |
---|
1204 | |
---|
1205 | int CoupSUSY::typeNeut(int idPDG) { |
---|
1206 | int type = 0; |
---|
1207 | int idAbs = abs(idPDG); |
---|
1208 | if(idAbs == 1000022) type = 1; |
---|
1209 | else if(idAbs == 1000023) type = 2; |
---|
1210 | else if(idAbs == 1000025) type = 3; |
---|
1211 | else if(idAbs == 1000035) type = 4; |
---|
1212 | else if(isNMSSM && idAbs == 1000045) type = 5; |
---|
1213 | return type; |
---|
1214 | |
---|
1215 | } |
---|
1216 | |
---|
1217 | //-------------------------------------------------------------------------- |
---|
1218 | |
---|
1219 | // Check whether particle is a Chargino |
---|
1220 | |
---|
1221 | int CoupSUSY::typeChar(int idPDG) { |
---|
1222 | int type = 0; |
---|
1223 | if(abs(idPDG) == 1000024) type = 1; |
---|
1224 | else if (abs(idPDG) == 1000037)type = 2; |
---|
1225 | return type; |
---|
1226 | } |
---|
1227 | |
---|
1228 | //========================================================================== |
---|
1229 | |
---|
1230 | } // end namespace Pythia8 |
---|
1231 | |
---|
1232 | |
---|
1233 | |
---|