1
// SigmaLeftRightSym.cc is a part of the PYTHIA event generator.
2
// Copyright (C) 2012 Torbjorn Sjostrand.
3
// PYTHIA is licenced under the GNU GPL version 2, see COPYING for details.
4
// Please respect the MCnet Guidelines, see GUIDELINES for details.
6
// Function definitions (not found in the header) for the
7
// left-right-symmetry simulation classes.
9
#include "SigmaLeftRightSym.h"
13
//==========================================================================
15
// Sigma1ffbar2ZRight class.
16
// Cross section for f fbar -> Z_R^0 (righthanded gauge boson).
18
//--------------------------------------------------------------------------
20
// Initialize process.
22
void Sigma1ffbar2ZRight::initProc() {
24
// Store Z_R mass and width for propagator.
26
mRes = particleDataPtr->m0(idZR);
27
GammaRes = particleDataPtr->mWidth(idZR);
29
GamMRat = GammaRes / mRes;
30
sin2tW = couplingsPtr->sin2thetaW();
32
// Set pointer to particle properties and decay table.
33
ZRPtr = particleDataPtr->particleDataEntryPtr(idZR);
37
//--------------------------------------------------------------------------
39
// Evaluate sigmaHat(sHat), part independent of incoming flavour.
41
void Sigma1ffbar2ZRight::sigmaKin() {
43
// Set up Breit-Wigner. Width out only includes open channels.
44
double sigBW = 12. * M_PI/ ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
45
double widthOut = ZRPtr->resWidthOpen(idZR, mH);
47
// Prefactor for incoming widths. Combine. Done.
48
double preFac = alpEM * mH / ( 48. * sin2tW * (1. - sin2tW)
49
* (1. - 2. * sin2tW) );
50
sigma0 = preFac * sigBW * widthOut;
54
//--------------------------------------------------------------------------
56
// Evaluate sigmaHat(sHat), including incoming flavour dependence.
58
double Sigma1ffbar2ZRight::sigmaHat() {
60
// Vector and axial couplings of incoming fermion pair.
64
if (idAbs < 9 && idAbs%2 == 1) {
65
af = -1. + 2. * sin2tW;
66
vf = -1. + 4. * sin2tW / 3.;
67
} else if (idAbs < 9) {
68
af = 1. - 2. * sin2tW;
69
vf = 1. - 8. * sin2tW / 3.;
70
} else if (idAbs < 19 && idAbs%2 == 1) {
71
af = -1. + 2. * sin2tW;
72
vf = -1. + 4. * sin2tW;
75
// Colour factor. Answer.
76
double sigma = (vf*vf + af*af) * sigma0;
77
if (idAbs < 9) sigma /= 3.;
82
//--------------------------------------------------------------------------
84
// Select identity, colour and anticolour.
86
void Sigma1ffbar2ZRight::setIdColAcol() {
89
setId( id1, id2, idZR);
91
// Colour flow topologies. Swap when antiquarks.
92
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
93
else setColAcol( 0, 0, 0, 0, 0, 0);
94
if (id1 < 0) swapColAcol();
98
//--------------------------------------------------------------------------
100
// Evaluate weight for Z_R decay angle.
102
double Sigma1ffbar2ZRight::weightDecay( Event& process, int iResBeg,
105
// Identity of mother of decaying reseonance(s).
106
int idMother = process[process[iResBeg].mother1()].idAbs();
108
// For top decay hand over to standard routine.
110
return weightTopDecay( process, iResBeg, iResEnd);
112
// Z_R should sit in entry 5.
113
if (iResBeg != 5 || iResEnd != 5) return 1.;
115
// Couplings for in- and out-flavours.
116
double ai, vi, af, vf;
117
int idInAbs = process[3].idAbs();
118
if (idInAbs < 9 && idInAbs%2 == 1) {
119
ai = -1. + 2. * sin2tW;
120
vi = -1. + 4. * sin2tW / 3.;
121
} else if (idInAbs < 9) {
122
ai = 1. - 2. * sin2tW;
123
vi = 1. - 8. * sin2tW / 3.;
125
ai = -1. + 2. * sin2tW;
126
vi = -1. + 4. * sin2tW;
128
int idOutAbs = process[6].idAbs();
129
if (idOutAbs < 9 && idOutAbs%2 == 1) {
130
af = -1. + 2. * sin2tW;
131
vf = -1. + 4. * sin2tW / 3.;
132
} else if (idOutAbs < 9) {
133
af = 1. - 2. * sin2tW;
134
vf = 1. - 8. * sin2tW / 3.;
136
af = -1. + 2. * sin2tW;
137
vf = -1. + 4. * sin2tW;
140
// Phase space factors. Reconstruct decay angle.
141
double mr1 = pow2(process[6].m()) / sH;
142
double mr2 = pow2(process[7].m()) / sH;
143
double betaf = sqrtpos( pow2(1. - mr1 - mr2) - 4. * mr1 * mr2);
144
double cosThe = (process[3].p() - process[4].p())
145
* (process[7].p() - process[6].p()) / (sH * betaf);
147
// Angular weight and its maximum.
148
double wt1 = (vi*vi + ai*ai) * (vf*vf + af*af * betaf*betaf);
149
double wt2 = (1. - betaf*betaf) * (vi*vi + ai*ai) * vf*vf;
150
double wt3 = betaf * 4. * vi * ai * vf * af;
151
if (process[3].id() * process[6].id() < 0) wt3 = -wt3;
152
double wt = wt1 * (1. + cosThe*cosThe) + wt2 * (1. - cosThe*cosThe)
154
double wtMax = 2. * (wt1 + abs(wt3));
161
//==========================================================================
163
// Sigma1ffbar2WRight class.
164
// Cross section for f fbar' -> W_R^+- (righthanded gauge boson).
166
//--------------------------------------------------------------------------
168
// Initialize process.
170
void Sigma1ffbar2WRight::initProc() {
172
// Store W_R^+- mass and width for propagator.
174
mRes = particleDataPtr->m0(idWR);
175
GammaRes = particleDataPtr->mWidth(idWR);
177
GamMRat = GammaRes / mRes;
178
thetaWRat = 1. / (12. * couplingsPtr->sin2thetaW());
180
// Set pointer to particle properties and decay table.
181
particlePtr = particleDataPtr->particleDataEntryPtr(idWR);
185
//--------------------------------------------------------------------------
187
// Evaluate sigmaHat(sHat), part independent of incoming flavour.
189
void Sigma1ffbar2WRight::sigmaKin() {
191
// Common coupling factors.
192
double colQ = 3. * (1. + alpS / M_PI);
194
// Reset quantities to sum. Declare variables inside loop.
195
double widOutPos = 0.;
196
double widOutNeg = 0.;
197
int id1Now, id2Now, id1Abs, id2Abs, id1Neg, id2Neg, onMode;
198
double widNow, widSecPos, widSecNeg, mf1, mf2, mr1, mr2, kinFac;
200
// Loop over all W_R^+- decay channels.
201
for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
202
id1Now = particlePtr->channel(i).product(0);
203
id2Now = particlePtr->channel(i).product(1);
204
id1Abs = abs(id1Now);
205
id2Abs = abs(id2Now);
207
// Check that above threshold. Phase space.
208
mf1 = particleDataPtr->m0(id1Abs);
209
mf2 = particleDataPtr->m0(id2Abs);
210
if (mH > mf1 + mf2 + MASSMARGIN) {
211
mr1 = pow2(mf1 / mH);
212
mr2 = pow2(mf2 / mH);
213
kinFac = (1. - 0.5 * (mr1 + mr2) - 0.5 * pow2(mr1 - mr2))
214
* sqrtpos( pow2(1. - mr1 - mr2) - 4. * mr1 * mr2 );
216
// Combine kinematics with colour factor and CKM couplings.
218
if (id1Abs < 9) widNow *= colQ * couplingsPtr->V2CKMid(id1Abs, id2Abs);
220
// Secondary width from top and righthanded neutrino decay.
221
id1Neg = (id1Abs < 19) ? -id1Now : id1Abs;
222
id2Neg = (id2Abs < 19) ? -id2Now : id2Abs;
223
widSecPos = particleDataPtr->resOpenFrac(id1Now, id2Now);
224
widSecNeg = particleDataPtr->resOpenFrac(id1Neg, id2Neg);
226
// Add weight for channels on for all, W_R^+ and W_R^-, respectively.
227
onMode = particlePtr->channel(i).onMode();
228
if (onMode == 1 || onMode == 2) widOutPos += widNow * widSecPos;
229
if (onMode == 1 || onMode == 3) widOutNeg += widNow * widSecNeg;
231
// End loop over fermions.
235
// Set up Breit-Wigner. Cross section for W_R^+ and W_R^- separately.
236
double sigBW = 12. * M_PI * pow2(alpEM * thetaWRat) * sH
237
/ ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
238
sigma0Pos = sigBW * widOutPos;
239
sigma0Neg = sigBW * widOutNeg;
243
//--------------------------------------------------------------------------
245
// Evaluate sigmaHat(sHat), including incoming flavour dependence.
247
double Sigma1ffbar2WRight::sigmaHat() {
249
// Secondary width for W_R^+ or W_R^-. CKM and colour factors.
250
int idUp = (abs(id1)%2 == 0) ? id1 : id2;
251
double sigma = (idUp > 0) ? sigma0Pos : sigma0Neg;
252
if (abs(id1) < 9) sigma *= couplingsPtr->V2CKMid(abs(id1), abs(id2)) / 3.;
259
//--------------------------------------------------------------------------
261
// Select identity, colour and anticolour.
263
void Sigma1ffbar2WRight::setIdColAcol() {
265
// Sign of outgoing W_R.
266
int sign = (abs(id1)%2 == 0) ? 1 : -1;
267
if (id1 < 0) sign = -sign;
268
setId( id1, id2, idWR * sign);
270
// Colour flow topologies. Swap when antiquarks.
271
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
272
else setColAcol( 0, 0, 0, 0, 0, 0);
273
if (id1 < 0) swapColAcol();
277
//--------------------------------------------------------------------------
279
// Evaluate weight for W_R decay angle.
281
double Sigma1ffbar2WRight::weightDecay( Event& process, int iResBeg,
284
// Identity of mother of decaying reseonance(s).
285
int idMother = process[process[iResBeg].mother1()].idAbs();
287
// For top decay hand over to standard routine.
289
return weightTopDecay( process, iResBeg, iResEnd);
291
// W_R should sit in entry 5.
292
if (iResBeg != 5 || iResEnd != 5) return 1.;
294
// Phase space factors.
295
double mr1 = pow2(process[6].m()) / sH;
296
double mr2 = pow2(process[7].m()) / sH;
297
double betaf = sqrtpos( pow2(1. - mr1 - mr2) - 4. * mr1 * mr2);
299
// Sign of asymmetry.
300
double eps = (process[3].id() * process[6].id() > 0) ? 1. : -1.;
302
// Reconstruct decay angle and weight for it.
303
double cosThe = (process[3].p() - process[4].p())
304
* (process[7].p() - process[6].p()) / (sH * betaf);
306
double wt = pow2(1. + betaf * eps * cosThe) - pow2(mr1 - mr2);
313
//==========================================================================
315
// Sigma1ll2Hchgchg class.
316
// Cross section for l l -> H_L^++-- or H_R^++-- (doubly charged Higgs).
318
//--------------------------------------------------------------------------
320
// Initialize process.
322
void Sigma1ll2Hchgchg::initProc() {
324
// Set process properties: H_L^++-- or H_R^++--.
325
if (leftRight == 1) {
328
nameSave = "l l -> H_L^++--";
332
nameSave = "l l -> H_R^++--";
335
// Read in Yukawa matrix for couplings to a lepton pair.
336
yukawa[1][1] = settingsPtr->parm("LeftRightSymmmetry:coupHee");
337
yukawa[2][1] = settingsPtr->parm("LeftRightSymmmetry:coupHmue");
338
yukawa[2][2] = settingsPtr->parm("LeftRightSymmmetry:coupHmumu");
339
yukawa[3][1] = settingsPtr->parm("LeftRightSymmmetry:coupHtaue");
340
yukawa[3][2] = settingsPtr->parm("LeftRightSymmmetry:coupHtaumu");
341
yukawa[3][3] = settingsPtr->parm("LeftRightSymmmetry:coupHtautau");
343
// Store H_L/R mass and width for propagator.
344
mRes = particleDataPtr->m0(idHLR);
345
GammaRes = particleDataPtr->mWidth(idHLR);
347
GamMRat = GammaRes / mRes;
349
// Set pointer to particle properties and decay table.
350
particlePtr = particleDataPtr->particleDataEntryPtr(idHLR);
354
//--------------------------------------------------------------------------
356
// Evaluate sigmaHat(sHat), including incoming flavour dependence.
358
double Sigma1ll2Hchgchg::sigmaHat() {
360
// Initial state must consist of two identical-sign leptons.
361
if (id1 * id2 < 0) return 0.;
362
int id1Abs = abs(id1);
363
int id2Abs = abs(id2);
364
if (id1Abs != 11 && id1Abs != 13 && id1Abs != 15) return 0.;
365
if (id2Abs != 11 && id2Abs != 13 && id2Abs != 15) return 0.;
367
// Set up Breit-Wigner, inwidth and outwidth.
368
double sigBW = 8. * M_PI / ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
369
double widIn = pow2(yukawa[(id1Abs-9)/2][(id2Abs-9)/2])
371
int idSgn = (id1 < 0) ? idHLR : -idHLR;
372
double widOut = particlePtr->resWidthOpen( idSgn, mH);
375
return widIn * sigBW * widOut;
379
//--------------------------------------------------------------------------
381
// Select identity, colour and anticolour.
383
void Sigma1ll2Hchgchg::setIdColAcol() {
385
// Sign of outgoing H_L/R.
386
int idSgn = (id1 < 0) ? idHLR : -idHLR;
387
setId( id1, id2, idSgn);
389
// No colours whatsoever.
390
setColAcol( 0, 0, 0, 0, 0, 0);
394
//--------------------------------------------------------------------------
396
// Evaluate weight for H_L/R sequential decay angles.
398
double Sigma1ll2Hchgchg::weightDecay( Event& process, int iResBeg,
401
// Identity of mother of decaying reseonance(s).
402
int idMother = process[process[iResBeg].mother1()].idAbs();
404
// For top decay hand over to standard routine.
406
return weightTopDecay( process, iResBeg, iResEnd);
408
// Else isotropic decay.
413
//==========================================================================
415
// Sigma2lgm2Hchgchgl class.
416
// Cross section for l l -> H_L^++-- or H_R^++-- (doubly charged Higgs).
418
//--------------------------------------------------------------------------
420
// Initialize process.
422
void Sigma2lgm2Hchgchgl::initProc() {
424
// Set process properties: H_L^++-- or H_R^++-- and e/mu/tau.
425
idHLR = (leftRight == 1) ? 9900041 : 9900042;
426
codeSave = (leftRight == 1) ? 3122 : 3142;
427
if (idLep == 13) codeSave += 2;
428
if (idLep == 15) codeSave += 4;
429
if (codeSave == 3122) nameSave = "l^+- gamma -> H_L^++-- e^-+";
430
else if (codeSave == 3123) nameSave = "l^+- gamma -> H_L^++-- mu^-+";
431
else if (codeSave == 3124) nameSave = "l^+- gamma -> H_L^++-- tau^-+";
432
else if (codeSave == 3142) nameSave = "l^+- gamma -> H_R^++-- e^-+";
433
else if (codeSave == 3143) nameSave = "l^+- gamma -> H_R^++-- mu^-+";
434
else nameSave = "l^+- gamma -> H_R^++-- tau^-+";
436
// Read in relevantYukawa matrix for couplings to a lepton pair.
438
yukawa[1] = settingsPtr->parm("LeftRightSymmmetry:coupHee");
439
yukawa[2] = settingsPtr->parm("LeftRightSymmmetry:coupHmue");
440
yukawa[3] = settingsPtr->parm("LeftRightSymmmetry:coupHtaue");
441
} else if (idLep == 13) {
442
yukawa[1] = settingsPtr->parm("LeftRightSymmmetry:coupHmue");
443
yukawa[2] = settingsPtr->parm("LeftRightSymmmetry:coupHmumu");
444
yukawa[3] = settingsPtr->parm("LeftRightSymmmetry:coupHtaumu");
446
yukawa[1] = settingsPtr->parm("LeftRightSymmmetry:coupHtaue");
447
yukawa[2] = settingsPtr->parm("LeftRightSymmmetry:coupHtaumu");
448
yukawa[3] = settingsPtr->parm("LeftRightSymmmetry:coupHtautau");
451
// Secondary open width fractions.
452
openFracPos = particleDataPtr->resOpenFrac( idHLR);
453
openFracNeg = particleDataPtr->resOpenFrac(-idHLR);
457
//--------------------------------------------------------------------------
459
// Evaluate sigmaHat(sHat), including incoming flavour dependence.
461
double Sigma2lgm2Hchgchgl::sigmaHat() {
463
// Initial state must consist of a lepton and a photon.
464
int idIn = (id2 == 22) ? id1 : id2;
465
int idInAbs = abs(idIn);
466
if (idInAbs != 11 && idInAbs != 13 && idInAbs != 15) return 0.;
468
// Incoming squared lepton mass.
469
double s1 = pow2( particleDataPtr->m0(idInAbs) );
471
// Kinematical expressions.
472
double smm1 = 8. * (sH + tH - s3) * (sH + tH - 2. * s3 - s1 - s4)
474
double smm2 = 2. * ( (2. * s3 - 3. * s1) * s4 + (s1 - 2. * s4) * tH
475
- (tH - s4) * sH ) / pow2(tH - s4);
476
double smm3 = 2. * ( (2. * s3 - 3. * s4 + tH) * s1
477
- (2. * s1 - s4 + tH) * sH ) / pow2(sH - s1);
478
double smm12 = 4. * ( (2. * s1 - s4 - 2. * s3 + tH) * sH
479
+ (tH - 3. * s3 - 3. * s4) * tH + (2. * s3 - 2. * s1
480
+ 3. * s4) * s3 ) / ( (uH - s3) * (tH - s4) );
481
double smm13 = -4. * ( (tH + s1 - 2. * s4) * tH - (s3 + 3. * s1 - 2. * s4)
482
* s3 + (s3 + 3. * s1 + tH) * sH - pow2(tH - s3 + sH) )
483
/ ( (uH - s3) * (sH - s1) );
484
double smm23 = -4. * ( (s1 - s4 + s3) * tH - s3*s3 + s3 * (s1 + s4)
485
- 3. * s1 * s4 - (s1 - s4 - s3 + tH) * sH)
486
/ ( (sH - s1) * (tH - s4) );
487
double sigma = alpEM * pow2(sH / (sH - s1) ) * (smm1 + smm2 + smm3
488
+ smm12 + smm13 + smm23) / (4. * sH2);
490
// Lepton Yukawa and secondary widths.
491
sigma *= pow2(yukawa[(idInAbs-9)/2]);
492
sigma *= (idIn < 0) ? openFracPos : openFracNeg;
499
//--------------------------------------------------------------------------
501
// Select identity, colour and anticolour.
503
void Sigma2lgm2Hchgchgl::setIdColAcol() {
505
// Sign of outgoing H_L/R.
506
int idIn = (id2 == 22) ? id1 : id2;
507
int idSgn = (idIn < 0) ? idHLR : -idHLR;
508
int idOut = (idIn < 0) ? idLep : -idLep;
509
setId( id1, id2, idSgn, idOut);
511
// tHat is defined between incoming lepton and outgoing Higgs.
512
if (id1 == 22) swapTU = true;
514
// No colours whatsoever.
515
setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
519
//--------------------------------------------------------------------------
521
// Evaluate weight for H_L/R sequential decay angles.
523
double Sigma2lgm2Hchgchgl::weightDecay( Event& process, int iResBeg,
526
// Identity of mother of decaying reseonance(s).
527
int idMother = process[process[iResBeg].mother1()].idAbs();
529
// For top decay hand over to standard routine.
531
return weightTopDecay( process, iResBeg, iResEnd);
533
// Else isotropic decay.
538
//==========================================================================
540
// Sigma3ff2HchgchgfftWW class.
541
// Cross section for f_1 f_2 -> H_(L/R)^++-- f_3 f_4 (W+- W+- fusion).
543
//--------------------------------------------------------------------------
545
// Initialize process.
547
void Sigma3ff2HchgchgfftWW::initProc() {
549
// Set process properties: H_L^++-- or H_R^++--.
550
if (leftRight == 1) {
553
nameSave = "f_1 f_2 -> H_L^++-- f_3 f_4 (W+- W+- fusion)";
557
nameSave = "f_1 f_2 -> H_R^++-- f_3 f_4 (W+- W+- fusion)";
560
// Common fixed mass and coupling factor.
561
double mW = particleDataPtr->m0(24);
562
double mWR = particleDataPtr->m0(9900024);
563
mWS = (leftRight == 1) ? pow2(mW) : pow2(mWR);
564
double gL = settingsPtr->parm("LeftRightSymmmetry:gL");
565
double gR = settingsPtr->parm("LeftRightSymmmetry:gR");
566
double vL = settingsPtr->parm("LeftRightSymmmetry:vL");
567
prefac = (leftRight == 1) ? pow2(pow4(gL) * vL)
568
: 2. * pow2(pow3(gR) * mWR);
569
// Secondary open width fractions.
570
openFracPos = particleDataPtr->resOpenFrac( idHLR);
571
openFracNeg = particleDataPtr->resOpenFrac(-idHLR);
575
//--------------------------------------------------------------------------
577
// Evaluate sigmaHat(sHat), part independent of incoming flavour.
579
void Sigma3ff2HchgchgfftWW::sigmaKin() {
581
// Required four-vector products.
582
double pp12 = 0.5 * sH;
583
double pp14 = 0.5 * mH * p4cm.pNeg();
584
double pp15 = 0.5 * mH * p5cm.pNeg();
585
double pp24 = 0.5 * mH * p4cm.pPos();
586
double pp25 = 0.5 * mH * p5cm.pPos();
587
double pp45 = p4cm * p5cm;
589
// Cross section: kinematics part. Combine with couplings.
590
double propT = 1. / ( (2. * pp14 + mWS) * (2. * pp25 + mWS) );
591
double propU = 1. / ( (2. * pp24 + mWS) * (2. * pp15 + mWS) );
592
sigma0TU = prefac * pp12 * pp45 * pow2(propT + propU);
593
sigma0T = prefac * pp12 * pp45 * 2. * pow2(propT);
597
//--------------------------------------------------------------------------
599
// Evaluate sigmaHat(sHat), including incoming flavour dependence.
601
double Sigma3ff2HchgchgfftWW::sigmaHat() {
603
// Do not allow creation of righthanded neutrinos for H_R.
604
int id1Abs = abs(id1);
605
int id2Abs = abs(id2);
606
if ( leftRight == 2 && (id1Abs > 10 || id2Abs > 10) ) return 0.;
608
// Many flavour combinations not possible because of charge.
609
int chg1 = (( id1Abs%2 == 0 && id1 > 0)
610
|| (id1Abs%2 == 1 && id1 < 0) ) ? 1 : -1;
611
int chg2 = (( id2Abs%2 == 0 && id2 > 0)
612
|| (id2Abs%2 == 1 && id2 < 0) ) ? 1 : -1;
613
if (abs(chg1 + chg2) != 2) return 0.;
615
// Basic cross section. CKM factors for final states.
616
double sigma = (id2 == id1 && id1Abs > 10) ? sigma0TU : sigma0T;
617
sigma *= couplingsPtr->V2CKMsum(id1Abs)
618
* couplingsPtr->V2CKMsum(id2Abs);
620
// Secondary width for H0.
621
sigma *= (chg1 + chg2 == 2) ? openFracPos : openFracNeg;
623
// Spin-state extra factor 2 per incoming neutrino.
624
if (id1Abs == 12 || id1Abs == 14 || id1Abs == 16) sigma *= 2.;
625
if (id2Abs == 12 || id2Abs == 14 || id2Abs == 16) sigma *= 2.;
632
//--------------------------------------------------------------------------
634
// Select identity, colour and anticolour.
636
void Sigma3ff2HchgchgfftWW::setIdColAcol() {
638
// Pick out-flavours by relative CKM weights.
639
int id1Abs = abs(id1);
640
int id2Abs = abs(id2);
641
id4 = couplingsPtr->V2CKMpick(id1);
642
id5 = couplingsPtr->V2CKMpick(id2);
644
// Find charge of Higgs .
645
id3 = (( id1Abs%2 == 0 && id1 > 0) || (id1Abs%2 == 1 && id1 < 0) )
647
setId( id1, id2, id3, id4, id5);
649
// Colour flow topologies. Swap when antiquarks.
650
if (id1Abs < 9 && id2Abs < 9 && id1*id2 > 0)
651
setColAcol( 1, 0, 2, 0, 0, 0, 1, 0, 2, 0);
652
else if (id1Abs < 9 && id2Abs < 9)
653
setColAcol( 1, 0, 0, 2, 0, 0, 1, 0, 0, 2);
654
else if (id1Abs < 9) setColAcol( 1, 0, 0, 0, 0, 0, 1, 0, 0, 0);
655
else if (id2Abs < 9) setColAcol( 0, 0, 1, 0, 0, 0, 0, 0, 1, 0);
656
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
657
if ( (id1Abs < 9 && id1 < 0) || (id1Abs > 10 && id2 < 0) )
662
//--------------------------------------------------------------------------
664
// Evaluate weight for decay angles.
666
double Sigma3ff2HchgchgfftWW::weightDecay( Event& process, int iResBeg,
669
// Identity of mother of decaying reseonance(s).
670
int idMother = process[process[iResBeg].mother1()].idAbs();
672
// For top decay hand over to standard routine.
674
return weightTopDecay( process, iResBeg, iResEnd);
681
//==========================================================================
683
// Sigma2ffbar2HchgchgHchgchg class.
684
// Cross section for f fbar -> H_(L/R)^++ H_(L/R)^-- (doubly charged Higgs).
686
//--------------------------------------------------------------------------
688
// Initialize process.
690
void Sigma2ffbar2HchgchgHchgchg::initProc() {
692
// Set process properties: H_L^++ H_L^-- or H_R^++ H_R^--.
693
if (leftRight == 1) {
696
nameSave = "f fbar -> H_L^++ H_L^--";
700
nameSave = "f fbar -> H_R^++ H_R^--";
703
// Read in Yukawa matrix for couplings to a lepton pair.
704
yukawa[1][1] = settingsPtr->parm("LeftRightSymmmetry:coupHee");
705
yukawa[2][1] = settingsPtr->parm("LeftRightSymmmetry:coupHmue");
706
yukawa[2][2] = settingsPtr->parm("LeftRightSymmmetry:coupHmumu");
707
yukawa[3][1] = settingsPtr->parm("LeftRightSymmmetry:coupHtaue");
708
yukawa[3][2] = settingsPtr->parm("LeftRightSymmmetry:coupHtaumu");
709
yukawa[3][3] = settingsPtr->parm("LeftRightSymmmetry:coupHtautau");
711
// Electroweak parameters.
712
mRes = particleDataPtr->m0(23);
713
GammaRes = particleDataPtr->mWidth(23);
715
GamMRat = GammaRes / mRes;
716
sin2tW = couplingsPtr->sin2thetaW();
717
preFac = (1. - 2. * sin2tW) / ( 8. * sin2tW * (1. - sin2tW) );
719
// Open fraction from secondary widths.
720
openFrac = particleDataPtr->resOpenFrac( idHLR, -idHLR);
724
//--------------------------------------------------------------------------
726
// Evaluate sigmaHat(sHat), including incoming flavour dependence.
728
double Sigma2ffbar2HchgchgHchgchg::sigmaHat() {
730
// Electroweak couplings to gamma^*/Z^0.
731
int idAbs = abs(id1);
732
double ei = couplingsPtr->ef(idAbs);
733
double vi = couplingsPtr->vf(idAbs);
734
double ai = couplingsPtr->af(idAbs);
736
// Part via gamma^*/Z^0 propagator.No Z^0 coupling to H_R.
737
double resProp = 1. / ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
738
double sigma = 8. * pow2(alpEM) * ei*ei / sH2;
739
if (leftRight == 1) sigma += 8. * pow2(alpEM)
740
* (2. * ei * vi * preFac * (sH - m2Res) * resProp / sH
741
+ (vi * vi + ai * ai) * pow2(preFac) * resProp);
743
// Part via t-channel lepton + interference; sum over possibilities.
744
if (idAbs == 11 || idAbs == 13 || idAbs == 15) {
746
if (idAbs == 11) yuk2Sum
747
= pow2(yukawa[1][1]) + pow2(yukawa[2][1]) + pow2(yukawa[3][1]);
748
else if (idAbs == 13) yuk2Sum
749
= pow2(yukawa[2][1]) + pow2(yukawa[2][2]) + pow2(yukawa[3][2]);
751
= pow2(yukawa[3][1]) + pow2(yukawa[3][2]) + pow2(yukawa[3][3]);
752
yuk2Sum /= 4. * M_PI;
753
sigma += 8. * alpEM * ei * yuk2Sum / (sH * tH)
754
+ 4. * pow2(yuk2Sum) / tH2;
755
if (leftRight == 1) sigma += 8. * alpEM * (vi + ai) * yuk2Sum
756
* preFac * (sH - m2Res) * resProp / tH;
759
// Common kinematical factor. Colour factor.
760
sigma *= M_PI * (tH * uH - s3 * s4) / sH2;
761
if (idAbs < 9) sigma /= 3.;
768
//--------------------------------------------------------------------------
770
// Select identity, colour and anticolour.
772
void Sigma2ffbar2HchgchgHchgchg::setIdColAcol() {
774
// Outgoing flavours trivial.
775
setId( id1, id2, idHLR, -idHLR);
777
// tHat is defined between incoming fermion and outgoing H--.
778
if (id1 > 0) swapTU = true;
780
// No colours at all or one flow topology. Swap if first is antiquark.
781
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
782
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
783
if (id1 < 0) swapColAcol();
787
//--------------------------------------------------------------------------
789
// Evaluate weight for H_L/R sequential decay angles.
791
double Sigma2ffbar2HchgchgHchgchg::weightDecay( Event& process,
792
int iResBeg, int iResEnd) {
794
// Identity of mother of decaying reseonance(s).
795
int idMother = process[process[iResBeg].mother1()].idAbs();
797
// For top decay hand over to standard routine.
799
return weightTopDecay( process, iResBeg, iResEnd);
801
// Else isotropic decay.
806
//==========================================================================
808
} // end namespace Pythia8