1
// SigmaEW.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
// electroweak simulation classes (including photon processes).
13
//==========================================================================
15
// Sigma2qg2qgamma class.
16
// Cross section for q g -> q gamma.
18
//--------------------------------------------------------------------------
20
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
22
void Sigma2qg2qgamma::sigmaKin() {
24
// Calculate kinematics dependence.
25
sigUS = (1./3.) * (sH2 + uH2) / (-sH * uH);
28
sigma0 = (M_PI/sH2) * alpS * alpEM * sigUS;
32
//--------------------------------------------------------------------------
34
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
36
double Sigma2qg2qgamma::sigmaHat() {
38
// Incoming flavour gives charge factor.
39
int idNow = (id2 == 21) ? id1 : id2;
40
double eNow = couplingsPtr->ef( abs(idNow) );
41
return sigma0 * pow2(eNow);
45
//--------------------------------------------------------------------------
47
// Select identity, colour and anticolour.
49
void Sigma2qg2qgamma::setIdColAcol() {
51
// Construct outgoing flavours.
52
id3 = (id1 == 21) ? 22 : id1;
53
id4 = (id2 == 21) ? 22 : id2;
54
setId( id1, id2, id3, id4);
56
// Colour flow topology. Swap if first is gluon, or when antiquark.
57
setColAcol( 1, 0, 2, 1, 2, 0, 0, 0);
58
if (id1 == 21) swapCol1234();
59
if (id1 < 0 || id2 < 0) swapColAcol();
63
//==========================================================================
65
// Sigma2qqbar2ggamma class.
66
// Cross section for q qbar -> g gamma.
68
//--------------------------------------------------------------------------
70
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
72
void Sigma2qqbar2ggamma::sigmaKin() {
74
// Calculate kinematics dependence.
75
double sigTU = (8./9.) * (tH2 + uH2) / (tH * uH);
78
sigma0 = (M_PI/sH2) * alpS * alpEM * sigTU;
82
//--------------------------------------------------------------------------
84
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
86
double Sigma2qqbar2ggamma::sigmaHat() {
88
// Incoming flavour gives charge factor.
89
double eNow = couplingsPtr->ef( abs(id1) );
90
return sigma0 * pow2(eNow);
94
//--------------------------------------------------------------------------
96
// Select identity, colour and anticolour.
98
void Sigma2qqbar2ggamma::setIdColAcol() {
100
// Outgoing flavours trivial.
101
setId( id1, id2, 21, 22);
103
// One colour flow topology. Swap if first is antiquark.
104
setColAcol( 1, 0, 0, 2, 1, 2, 0, 0);
105
if (id1 < 0) swapColAcol();
109
//==========================================================================
111
// Sigma2gg2ggamma class.
112
// Cross section for g g -> g gamma.
113
// Proceeds through a quark box, by default using 5 massless quarks.
115
//--------------------------------------------------------------------------
117
// Initialize process, especially parton-flux object.
119
void Sigma2gg2ggamma::initProc() {
121
// Maximum quark flavour in loop.
122
int nQuarkLoop = settingsPtr->mode("PromptPhoton:nQuarkLoop");
124
// Calculate charge factor from the allowed quarks in the box.
125
chargeSum = - 1./3. + 2./3. - 1./3.;
126
if (nQuarkLoop >= 4) chargeSum += 2./3.;
127
if (nQuarkLoop >= 5) chargeSum -= 1./3.;
128
if (nQuarkLoop >= 6) chargeSum += 2./3.;
132
//--------------------------------------------------------------------------
134
// Evaluate d(sigmaHat)/d(tHat).
136
void Sigma2gg2ggamma::sigmaKin() {
138
// Logarithms of Mandelstam variable ratios.
139
double logST = log( -sH / tH );
140
double logSU = log( -sH / uH );
141
double logTU = log( tH / uH );
143
// Real and imaginary parts of separate amplitudes.
144
double b0stuRe = 1. + (tH - uH) / sH * logTU
145
+ 0.5 * (tH2 + uH2) / sH2 * (pow2(logTU) + pow2(M_PI));
147
double b0tsuRe = 1. + (sH - uH) / tH * logSU
148
+ 0.5 * (sH2 + uH2) / tH2 * pow2(logSU);
149
double b0tsuIm = -M_PI * ( (sH - uH) / tH + (sH2 + uH2) / tH2 * logSU);
150
double b0utsRe = 1. + (sH - tH) / uH * logST
151
+ 0.5 * (sH2 + tH2) / uH2 * pow2(logST);
152
double b0utsIm = -M_PI * ( (sH - tH) / uH + (sH2 + tH2) / uH2 * logST);
153
double b1stuRe = -1.;
155
double b2stuRe = -1.;
158
// Calculate kinematics dependence.
159
double sigBox = pow2(b0stuRe) + pow2(b0stuIm) + pow2(b0tsuRe)
160
+ pow2(b0tsuIm) + pow2(b0utsRe) + pow2(b0utsIm) + 4. * pow2(b1stuRe)
161
+ 4. * pow2(b1stuIm) + pow2(b2stuRe) + pow2(b2stuIm);
164
sigma = (5. / (192. * M_PI * sH2)) * pow2(chargeSum)
165
* pow3(alpS) * alpEM * sigBox;
169
//--------------------------------------------------------------------------
171
// Select identity, colour and anticolour.
173
void Sigma2gg2ggamma::setIdColAcol() {
175
// Flavours and colours are trivial.
176
setId( id1, id2, 21, 22);
177
setColAcol( 1, 2, 2, 3, 1, 3, 0, 0);
178
if (rndmPtr->flat() > 0.5) swapColAcol();
182
//==========================================================================
184
// Sigma2ffbar2gammagamma class.
185
// Cross section for q qbar -> gamma gamma.
187
//--------------------------------------------------------------------------
189
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
191
void Sigma2ffbar2gammagamma::sigmaKin() {
193
// Calculate kinematics dependence.
194
sigTU = 2. * (tH2 + uH2) / (tH * uH);
196
// Answer contains factor 1/2 from identical photons.
197
sigma0 = (M_PI/sH2) * pow2(alpEM) * 0.5 * sigTU;
201
//--------------------------------------------------------------------------
203
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
205
double Sigma2ffbar2gammagamma::sigmaHat() {
207
// Incoming flavour gives charge and colour factors.
208
double eNow = couplingsPtr->ef( abs(id1) );
209
double colFac = (abs(id1) < 9) ? 1. / 3. : 1.;
210
return sigma0 * pow4(eNow) * colFac;
214
//--------------------------------------------------------------------------
216
// Select identity, colour and anticolour.
218
void Sigma2ffbar2gammagamma::setIdColAcol() {
220
// Outgoing flavours trivial.
221
setId( id1, id2, 22, 22);
223
// No colours at all or one flow topology. Swap if first is antiquark.
224
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
225
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
226
if (id1 < 0) swapColAcol();
230
//==========================================================================
232
// Sigma2gg2gammagamma class.
233
// Cross section for g g -> gamma gamma.
234
// Proceeds through a quark box, by default using 5 massless quarks.
236
//--------------------------------------------------------------------------
238
// Initialize process.
240
void Sigma2gg2gammagamma::initProc() {
242
// Maximum quark flavour in loop.
243
int nQuarkLoop = settingsPtr->mode("PromptPhoton:nQuarkLoop");
245
// Calculate charge factor from the allowed quarks in the box.
246
charge2Sum = 1./9. + 4./9. + 1./9.;
247
if (nQuarkLoop >= 4) charge2Sum += 4./9.;
248
if (nQuarkLoop >= 5) charge2Sum += 1./9.;
249
if (nQuarkLoop >= 6) charge2Sum += 4./9.;
253
//--------------------------------------------------------------------------
255
// Evaluate d(sigmaHat)/d(tHat).
257
void Sigma2gg2gammagamma::sigmaKin() {
259
// Logarithms of Mandelstam variable ratios.
260
double logST = log( -sH / tH );
261
double logSU = log( -sH / uH );
262
double logTU = log( tH / uH );
264
// Real and imaginary parts of separate amplitudes.
265
double b0stuRe = 1. + (tH - uH) / sH * logTU
266
+ 0.5 * (tH2 + uH2) / sH2 * (pow2(logTU) + pow2(M_PI));
268
double b0tsuRe = 1. + (sH - uH) / tH * logSU
269
+ 0.5 * (sH2 + uH2) / tH2 * pow2(logSU);
270
double b0tsuIm = -M_PI * ( (sH - uH) / tH + (sH2 + uH2) / tH2 * logSU);
271
double b0utsRe = 1. + (sH - tH) / uH * logST
272
+ 0.5 * (sH2 + tH2) / uH2 * pow2(logST);
273
double b0utsIm = -M_PI * ( (sH - tH) / uH + (sH2 + tH2) / uH2 * logST);
274
double b1stuRe = -1.;
276
double b2stuRe = -1.;
279
// Calculate kinematics dependence.
280
double sigBox = pow2(b0stuRe) + pow2(b0stuIm) + pow2(b0tsuRe)
281
+ pow2(b0tsuIm) + pow2(b0utsRe) + pow2(b0utsIm) + 4. * pow2(b1stuRe)
282
+ 4. * pow2(b1stuIm) + pow2(b2stuRe) + pow2(b2stuIm);
284
// Answer contains factor 1/2 from identical photons.
285
sigma = (0.5 / (16. * M_PI * sH2)) * pow2(charge2Sum)
286
* pow2(alpS) * pow2(alpEM) * sigBox;
290
//--------------------------------------------------------------------------
292
// Select identity, colour and anticolour.
294
void Sigma2gg2gammagamma::setIdColAcol() {
296
// Flavours and colours are trivial.
297
setId( id1, id2, 22, 22);
298
setColAcol( 1, 2, 2, 1, 0, 0, 0, 0);
302
//==========================================================================
304
// Sigma2ff2fftgmZ class.
305
// Cross section for f f' -> f f' via t-channel gamma*/Z0 exchange
306
// (f is quark or lepton).
308
//--------------------------------------------------------------------------
310
// Initialize process.
312
void Sigma2ff2fftgmZ::initProc() {
314
// Store Z0 mass for propagator. Common coupling factor.
315
gmZmode = settingsPtr->mode("WeakZ0:gmZmode");
316
mZ = particleDataPtr->m0(23);
318
thetaWRat = 1. / (16. * couplingsPtr->sin2thetaW()
319
* couplingsPtr->cos2thetaW());
323
//--------------------------------------------------------------------------
325
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
327
void Sigma2ff2fftgmZ::sigmaKin() {
329
// Cross section part common for all incoming flavours.
330
double sigma0 = (M_PI / sH2) * pow2(alpEM);
332
// Kinematical functions for gamma-gamma, gamma-Z and Z-Z parts.
333
sigmagmgm = sigma0 * 2. * (sH2 + uH2) / tH2;
334
sigmagmZ = sigma0 * 4. * thetaWRat * sH2 / (tH * (tH - mZS));
335
sigmaZZ = sigma0 * 2. * pow2(thetaWRat) * sH2 / pow2(tH - mZS);
336
if (gmZmode == 1) {sigmagmZ = 0.; sigmaZZ = 0.;}
337
if (gmZmode == 2) {sigmagmgm = 0.; sigmagmZ = 0.;}
341
//--------------------------------------------------------------------------
343
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
345
double Sigma2ff2fftgmZ::sigmaHat() {
347
// Couplings for current flavour combination.
348
int id1Abs = abs(id1);
349
double e1 = couplingsPtr->ef(id1Abs);
350
double v1 = couplingsPtr->vf(id1Abs);
351
double a1 = couplingsPtr->af(id1Abs);
352
int id2Abs = abs(id2);
353
double e2 = couplingsPtr->ef(id2Abs);
354
double v2 = couplingsPtr->vf(id2Abs);
355
double a2 = couplingsPtr->af(id2Abs);
357
// Distinguish same-sign and opposite-sign fermions.
358
double epsi = (id1 * id2 > 0) ? 1. : -1.;
360
// Flavour-dependent cross section.
361
double sigma = sigmagmgm * pow2(e1 * e2)
362
+ sigmagmZ * e1 * e2 * (v1 * v2 * (1. + uH2 / sH2)
363
+ a1 * a2 * epsi * (1. - uH2 / sH2))
364
+ sigmaZZ * ((v1*v1 + a1*a1) * (v2*v2 + a2*a2) * (1. + uH2 / sH2)
365
+ 4. * v1 * a1 * v2 * a2 * epsi * (1. - uH2 / sH2));
367
// Spin-state extra factor 2 per incoming neutrino.
368
if (id1Abs == 12 || id1Abs == 14 || id1Abs == 16) sigma *= 2.;
369
if (id2Abs == 12 || id2Abs == 14 || id2Abs == 16) sigma *= 2.;
376
//--------------------------------------------------------------------------
378
// Select identity, colour and anticolour.
380
void Sigma2ff2fftgmZ::setIdColAcol() {
382
// Trivial flavours: out = in.
383
setId( id1, id2, id1, id2);
385
// Colour flow topologies. Swap when antiquarks.
386
if (abs(id1) < 9 && abs(id2) < 9 && id1*id2 > 0)
387
setColAcol( 1, 0, 2, 0, 1, 0, 2, 0);
388
else if (abs(id1) < 9 && abs(id2) < 9)
389
setColAcol( 1, 0, 0, 2, 1, 0, 0, 2);
390
else if (abs(id1) < 9) setColAcol( 1, 0, 0, 0, 1, 0, 0, 0);
391
else if (abs(id2) < 9) setColAcol( 0, 0, 1, 0, 0, 0, 1, 0);
392
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
393
if ( (abs(id1) < 9 && id1 < 0) || (abs(id1) > 10 && id2 < 0) )
398
//==========================================================================
400
// Sigma2ff2fftW class.
401
// Cross section for f_1 f_2 -> f_3 f_4 via t-channel W+- exchange
402
// (f is quark or lepton).
404
//--------------------------------------------------------------------------
406
// Initialize process.
408
void Sigma2ff2fftW::initProc() {
410
// Store W+- mass for propagator. Common coupling factor.
411
mW = particleDataPtr->m0(24);
413
thetaWRat = 1. / (4. * couplingsPtr->sin2thetaW());
417
//--------------------------------------------------------------------------
419
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
421
void Sigma2ff2fftW::sigmaKin() {
423
// Cross section part common for all incoming flavours.
424
sigma0 = (M_PI / sH2) * pow2(alpEM * thetaWRat)
425
* 4. * sH2 / pow2(tH - mWS);
429
//--------------------------------------------------------------------------
431
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
433
double Sigma2ff2fftW::sigmaHat() {
435
// Some flavour combinations not possible.
436
int id1Abs = abs(id1);
437
int id2Abs = abs(id2);
438
if ( (id1Abs%2 == id2Abs%2 && id1 * id2 > 0)
439
|| (id1Abs%2 != id2Abs%2 && id1 * id2 < 0) ) return 0.;
441
// Basic cross section.
442
double sigma = sigma0;
443
if (id1 * id2 < 0) sigma *= uH2 / sH2;
445
// CKM factors for final states.
446
sigma *= couplingsPtr->V2CKMsum(id1Abs) * couplingsPtr->V2CKMsum(id2Abs);
448
// Spin-state extra factor 2 per incoming neutrino.
449
if (id1Abs == 12 || id1Abs == 14 || id1Abs == 16) sigma *= 2.;
450
if (id2Abs == 12 || id2Abs == 14 || id2Abs == 16) sigma *= 2.;
457
//--------------------------------------------------------------------------
459
// Select identity, colour and anticolour.
461
void Sigma2ff2fftW::setIdColAcol() {
463
// Pick out-flavours by relative CKM weights.
464
id3 = couplingsPtr->V2CKMpick(id1);
465
id4 = couplingsPtr->V2CKMpick(id2);
466
setId( id1, id2, id3, id4);
468
// Colour flow topologies. Swap when antiquarks.
469
if (abs(id1) < 9 && abs(id2) < 9 && id1*id2 > 0)
470
setColAcol( 1, 0, 2, 0, 1, 0, 2, 0);
471
else if (abs(id1) < 9 && abs(id2) < 9)
472
setColAcol( 1, 0, 0, 2, 1, 0, 0, 2);
473
else if (abs(id1) < 9) setColAcol( 1, 0, 0, 0, 1, 0, 0, 0);
474
else if (abs(id2) < 9) setColAcol( 0, 0, 1, 0, 0, 0, 1, 0);
475
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
476
if ( (abs(id1) < 9 && id1 < 0) || (abs(id1) > 10 && id2 < 0) )
482
//==========================================================================
484
// Sigma2qq2QqtW class.
485
// Cross section for q q' -> Q q" via t-channel W+- exchange.
486
// Related to Sigma2ff2ffViaW class, but with massive matrix elements.
488
//--------------------------------------------------------------------------
490
// Initialize process.
492
void Sigma2qq2QqtW::initProc() {
495
nameSave = "q q -> Q q (t-channel W+-)";
496
if (idNew == 4) nameSave = "q q -> c q (t-channel W+-)";
497
if (idNew == 5) nameSave = "q q -> b q (t-channel W+-)";
498
if (idNew == 6) nameSave = "q q -> t q (t-channel W+-)";
499
if (idNew == 7) nameSave = "q q -> b' q (t-channel W+-)";
500
if (idNew == 8) nameSave = "q q -> t' q (t-channel W+-)";
502
// Store W+- mass for propagator. Common coupling factor.
503
mW = particleDataPtr->m0(24);
505
thetaWRat = 1. / (4. * couplingsPtr->sin2thetaW());
507
// Secondary open width fractions, relevant for top (or heavier).
508
openFracPos = particleDataPtr->resOpenFrac(idNew);
509
openFracNeg = particleDataPtr->resOpenFrac(-idNew);
513
//--------------------------------------------------------------------------
515
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
517
void Sigma2qq2QqtW::sigmaKin() {
519
// Cross section part common for all incoming flavours.
520
sigma0 = (M_PI / sH2) * pow2(alpEM * thetaWRat) * 4. / pow2(tH - mWS);
524
//--------------------------------------------------------------------------
526
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
528
double Sigma2qq2QqtW::sigmaHat() {
530
// Some flavour combinations not possible.
531
int id1Abs = abs(id1);
532
int id2Abs = abs(id2);
533
bool diff12 = (id1Abs%2 != id2Abs%2);
534
if ( (!diff12 && id1 * id2 > 0)
535
|| ( diff12 && id1 * id2 < 0) ) return 0.;
537
// Basic cross section.
538
double sigma = sigma0;
539
sigma *= (id1 * id2 > 0) ? sH * (sH - s3) : uH * (uH - s3);
541
// Secondary width if t or tbar produced on either side.
542
double openFrac1 = (id1 > 0) ? openFracPos : openFracNeg;
543
double openFrac2 = (id2 > 0) ? openFracPos : openFracNeg;
545
// CKM factors for final states; further impossible case.
546
bool diff1N = (id1Abs%2 != idNew%2);
547
bool diff2N = (id2Abs%2 != idNew%2);
548
if (diff1N && diff2N)
549
sigma *= ( couplingsPtr->V2CKMid(id1Abs, idNew) * openFrac1
550
* couplingsPtr->V2CKMsum(id2Abs) + couplingsPtr->V2CKMsum(id1Abs)
551
* couplingsPtr->V2CKMid(id2Abs, idNew) * openFrac2 );
553
sigma *= couplingsPtr->V2CKMid(id1Abs, idNew) * openFrac1
554
* couplingsPtr->V2CKMsum(id2Abs);
556
sigma *= couplingsPtr->V2CKMsum(id1Abs)
557
* couplingsPtr->V2CKMid(id2Abs, idNew) * openFrac2;
560
// Spin-state extra factor 2 per incoming neutrino.
561
if (id1Abs == 12 || id1Abs == 14 || id1Abs == 16) sigma *= 2.;
562
if (id2Abs == 12 || id2Abs == 14 || id2Abs == 16) sigma *= 2.;
569
//--------------------------------------------------------------------------
571
// Select identity, colour and anticolour.
573
void Sigma2qq2QqtW::setIdColAcol() {
575
// For topologies like d dbar -> (t/c/u) (t/c/u)bar pick side.
576
int id1Abs = abs(id1);
577
int id2Abs = abs(id2);
579
if ( (id1Abs + idNew)%2 == 1 && (id2Abs + idNew)%2 == 1 ) {
580
double prob1 = couplingsPtr->V2CKMid(id1Abs, idNew)
581
* couplingsPtr->V2CKMsum(id2Abs);
582
prob1 *= (id1 > 0) ? openFracPos : openFracNeg;
583
double prob2 = couplingsPtr->V2CKMid(id2Abs, idNew)
584
* couplingsPtr->V2CKMsum(id1Abs);
585
prob2 *= (id2 > 0) ? openFracPos : openFracNeg;
586
if (prob2 > rndmPtr->flat() * (prob1 + prob2)) side = 2;
588
else if ((id2Abs + idNew)%2 == 1) side = 2;
590
// Pick out-flavours by relative CKM weights.
592
// q q' -> t q" : correct order from start.
593
id3 = (id1 > 0) ? idNew : -idNew;
594
id4 = couplingsPtr->V2CKMpick(id2);
595
setId( id1, id2, id3, id4);
597
// q q' -> q" t : stored as t q" so swap tHat <-> uHat.
599
id3 = couplingsPtr->V2CKMpick(id1);
600
id4 = (id2 > 0) ? idNew : -idNew;
601
setId( id1, id2, id4, id3);
604
// Colour flow topologies. Swap when antiquarks on side 1.
605
if (side == 1 && id1 * id2 > 0) setColAcol( 1, 0, 2, 0, 1, 0, 2, 0);
606
else if (id1 * id2 > 0) setColAcol( 1, 0, 2, 0, 2, 0, 1, 0);
607
else if (side == 1) setColAcol( 1, 0, 0, 2, 1, 0, 0, 2);
608
else setColAcol( 1, 0, 0, 2, 0, 2, 1, 0);
609
if (id1 < 0) swapColAcol();
613
//--------------------------------------------------------------------------
615
// Evaluate weight for decay angles of W in top decay.
617
double Sigma2qq2QqtW::weightDecay( Event& process, int iResBeg,
620
// For top decay hand over to standard routine, else done.
621
if (idNew == 6 && process[process[iResBeg].mother1()].idAbs() == 6)
622
return weightTopDecay( process, iResBeg, iResEnd);
627
//==========================================================================
629
// Sigma1ffbar2gmZ class.
630
// Cross section for f fbar -> gamma*/Z0 (f is quark or lepton).
632
//--------------------------------------------------------------------------
634
// Initialize process.
636
void Sigma1ffbar2gmZ::initProc() {
638
// Allow to pick only gamma* or Z0 part of full gamma*/Z0 expression.
639
gmZmode = settingsPtr->mode("WeakZ0:gmZmode");
641
// Store Z0 mass and width for propagator.
642
mRes = particleDataPtr->m0(23);
643
GammaRes = particleDataPtr->mWidth(23);
645
GamMRat = GammaRes / mRes;
646
thetaWRat = 1. / (16. * couplingsPtr->sin2thetaW()
647
* couplingsPtr->cos2thetaW());
649
// Set pointer to particle properties and decay table.
650
particlePtr = particleDataPtr->particleDataEntryPtr(23);
654
//--------------------------------------------------------------------------
656
// Evaluate sigmaHat(sHat), part independent of incoming flavour.
658
void Sigma1ffbar2gmZ::sigmaKin() {
660
// Common coupling factors.
661
double colQ = 3. * (1. + alpS / M_PI);
663
// Reset quantities to sum. Declare variables in loop.
668
double mf, mr, psvec, psaxi, betaf, ef2, efvf, vf2af2, colf;
670
// Loop over all Z0 decay channels.
671
for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
672
idAbs = abs( particlePtr->channel(i).product(0) );
674
// Only contributions from three fermion generations, except top.
675
if ( (idAbs > 0 && idAbs < 6) || ( idAbs > 10 && idAbs < 17)) {
676
mf = particleDataPtr->m0(idAbs);
678
// Check that above threshold. Phase space.
679
if (mH > 2. * mf + MASSMARGIN) {
681
betaf = sqrtpos(1. - 4. * mr);
682
psvec = betaf * (1. + 2. * mr);
685
// Combine phase space with couplings.
686
ef2 = couplingsPtr->ef2(idAbs) * psvec;
687
efvf = couplingsPtr->efvf(idAbs) * psvec;
688
vf2af2 = couplingsPtr->vf2(idAbs) * psvec
689
+ couplingsPtr->af2(idAbs) * psaxi;
690
colf = (idAbs < 6) ? colQ : 1.;
692
// Store sum of combinations. For outstate only open channels.
693
onMode = particlePtr->channel(i).onMode();
694
if (onMode == 1 || onMode == 2) {
695
gamSum += colf * ef2;
696
intSum += colf * efvf;
697
resSum += colf * vf2af2;
700
// End loop over fermions.
705
// Calculate prefactors for gamma/interference/Z0 cross section terms.
706
gamProp = 4. * M_PI * pow2(alpEM) / (3. * sH);
707
intProp = gamProp * 2. * thetaWRat * sH * (sH - m2Res)
708
/ ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
709
resProp = gamProp * pow2(thetaWRat * sH)
710
/ ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
712
// Optionally only keep gamma* or Z0 term.
713
if (gmZmode == 1) {intProp = 0.; resProp = 0.;}
714
if (gmZmode == 2) {gamProp = 0.; intProp = 0.;}
718
//--------------------------------------------------------------------------
720
// Evaluate sigmaHat(sHat), including incoming flavour dependence.
722
double Sigma1ffbar2gmZ::sigmaHat() {
724
// Combine gamma, interference and Z0 parts.
725
int idAbs = abs(id1);
726
double sigma = couplingsPtr->ef2(idAbs) * gamProp * gamSum
727
+ couplingsPtr->efvf(idAbs) * intProp * intSum
728
+ couplingsPtr->vf2af2(idAbs) * resProp * resSum;
730
// Colour factor. Answer.
731
if (idAbs < 9) sigma /= 3.;
736
//--------------------------------------------------------------------------
738
// Select identity, colour and anticolour.
740
void Sigma1ffbar2gmZ::setIdColAcol() {
743
setId( id1, id2, 23);
745
// Colour flow topologies. Swap when antiquarks.
746
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
747
else setColAcol( 0, 0, 0, 0, 0, 0);
748
if (id1 < 0) swapColAcol();
752
//--------------------------------------------------------------------------
754
// Evaluate weight for gamma*/Z0 decay angle.
756
double Sigma1ffbar2gmZ::weightDecay( Event& process, int iResBeg,
759
// Z should sit in entry 5.
760
if (iResBeg != 5 || iResEnd != 5) return 1.;
762
// Couplings for in- and out-flavours.
763
int idInAbs = process[3].idAbs();
764
double ei = couplingsPtr->ef(idInAbs);
765
double vi = couplingsPtr->vf(idInAbs);
766
double ai = couplingsPtr->af(idInAbs);
767
int idOutAbs = process[6].idAbs();
768
double ef = couplingsPtr->ef(idOutAbs);
769
double vf = couplingsPtr->vf(idOutAbs);
770
double af = couplingsPtr->af(idOutAbs);
772
// Phase space factors. (One power of beta left out in formulae.)
773
double mf = process[6].m();
774
double mr = mf*mf / sH;
775
double betaf = sqrtpos(1. - 4. * mr);
777
// Coefficients of angular expression.
778
double coefTran = ei*ei * gamProp * ef*ef + ei * vi * intProp * ef * vf
779
+ (vi*vi + ai*ai) * resProp * (vf*vf + pow2(betaf) * af*af);
780
double coefLong = 4. * mr * ( ei*ei * gamProp * ef*ef
781
+ ei * vi * intProp * ef * vf + (vi*vi + ai*ai) * resProp * vf*vf );
782
double coefAsym = betaf * ( ei * ai * intProp * ef * af
783
+ 4. * vi * ai * resProp * vf * af );
785
// Flip asymmetry for in-fermion + out-antifermion.
786
if (process[3].id() * process[6].id() < 0) coefAsym = -coefAsym;
788
// Reconstruct decay angle and weight for it.
789
double cosThe = (process[3].p() - process[4].p())
790
* (process[7].p() - process[6].p()) / (sH * betaf);
791
double wtMax = 2. * (coefTran + abs(coefAsym));
792
double wt = coefTran * (1. + pow2(cosThe))
793
+ coefLong * (1. - pow2(cosThe)) + 2. * coefAsym * cosThe;
800
//==========================================================================
802
// Sigma1ffbar2W class.
803
// Cross section for f fbar' -> W+- (f is quark or lepton).
805
//--------------------------------------------------------------------------
807
// Initialize process.
809
void Sigma1ffbar2W::initProc() {
811
// Store W+- mass and width for propagator.
812
mRes = particleDataPtr->m0(24);
813
GammaRes = particleDataPtr->mWidth(24);
815
GamMRat = GammaRes / mRes;
816
thetaWRat = 1. / (12. * couplingsPtr->sin2thetaW());
818
// Set pointer to particle properties and decay table.
819
particlePtr = particleDataPtr->particleDataEntryPtr(24);
823
//--------------------------------------------------------------------------
825
// Evaluate sigmaHat(sHat), part independent of incoming flavour.
827
void Sigma1ffbar2W::sigmaKin() {
829
// Set up Breit-Wigner. Cross section for W+ and W- separately.
830
double sigBW = 12. * M_PI / ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
831
double preFac = alpEM * thetaWRat * mH;
832
sigma0Pos = preFac * sigBW * particlePtr->resWidthOpen(24, mH);
833
sigma0Neg = preFac * sigBW * particlePtr->resWidthOpen(-24, mH);
837
//--------------------------------------------------------------------------
839
// Evaluate sigmaHat(sHat), including incoming flavour dependence.
841
double Sigma1ffbar2W::sigmaHat() {
843
// Secondary width for W+ or W-. CKM and colour factors.
844
int idUp = (abs(id1)%2 == 0) ? id1 : id2;
845
double sigma = (idUp > 0) ? sigma0Pos : sigma0Neg;
846
if (abs(id1) < 9) sigma *= couplingsPtr->V2CKMid(abs(id1), abs(id2)) / 3.;
853
//--------------------------------------------------------------------------
855
// Select identity, colour and anticolour.
857
void Sigma1ffbar2W::setIdColAcol() {
859
// Sign of outgoing W.
860
int sign = 1 - 2 * (abs(id1)%2);
861
if (id1 < 0) sign = -sign;
862
setId( id1, id2, 24 * sign);
864
// Colour flow topologies. Swap when antiquarks.
865
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
866
else setColAcol( 0, 0, 0, 0, 0, 0);
867
if (id1 < 0) swapColAcol();
871
//--------------------------------------------------------------------------
873
// Evaluate weight for W decay angle.
875
double Sigma1ffbar2W::weightDecay( Event& process, int iResBeg,
878
// W should sit in entry 5.
879
if (iResBeg != 5 || iResEnd != 5) return 1.;
881
// Phase space factors.
882
double mr1 = pow2(process[6].m()) / sH;
883
double mr2 = pow2(process[7].m()) / sH;
884
double betaf = sqrtpos( pow2(1. - mr1 - mr2) - 4. * mr1 * mr2);
886
// Sign of asymmetry.
887
double eps = (process[3].id() * process[6].id() > 0) ? 1. : -1.;
889
// Reconstruct decay angle and weight for it.
890
double cosThe = (process[3].p() - process[4].p())
891
* (process[7].p() - process[6].p()) / (sH * betaf);
893
double wt = pow2(1. + betaf * eps * cosThe) - pow2(mr1 - mr2);
900
//==========================================================================
902
// Sigma2ffbar2ffbarsgm class.
903
// Cross section f fbar -> gamma* -> f' fbar', for multiparton interactions.
906
//--------------------------------------------------------------------------
908
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
910
void Sigma2ffbar2ffbarsgm::sigmaKin() {
912
// Pick new flavour. Allow three leptons and five quarks.
913
double colQ = 1. + (alpS / M_PI);
914
double flavWt = 3. + colQ * 11. / 3.;
915
double flavRndm = rndmPtr->flat() * flavWt;
917
if (flavRndm < 1.) idNew = 11;
918
else if (flavRndm < 2.) idNew = 13;
921
flavRndm = 3. * (flavRndm - 3.) / colQ;
922
if (flavRndm < 4.) idNew = 2;
923
else if (flavRndm < 8.) idNew = 4;
924
else if (flavRndm < 9.) idNew = 1;
925
else if (flavRndm < 10.) idNew = 3;
928
double mNew = particleDataPtr->m0(idNew);
929
double m2New = mNew*mNew;
931
// Calculate kinematics dependence. Give correct mass factors for
932
// tHat, uHat defined as if massless kinematics, d(sigma)/d(Omega)
933
// = beta (1 + cos^2(theta) + (1 - beta^2) sin^2(theta)).
934
// Special case related to phase space form in multiparton interactions.
936
if (sH > 4. * m2New) {
937
double beta = sqrt(1. - 4. * m2New / sH);
938
sigS = beta * (2.* (tH2 + uH2) + 4. * (1. - beta * beta) * tH * uH)
942
// Answer is proportional to number of outgoing flavours.
943
sigma0 = (M_PI/sH2) * pow2(alpEM) * sigS * flavWt;
947
//--------------------------------------------------------------------------
949
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
951
double Sigma2ffbar2ffbarsgm::sigmaHat() {
953
// Charge and colour factors.
954
double eNow = couplingsPtr->ef( abs(id1) );
955
double sigma = sigma0 * pow2(eNow);
956
if (abs(id1) < 9) sigma /= 3.;
963
//--------------------------------------------------------------------------
965
// Select identity, colour and anticolour.
967
void Sigma2ffbar2ffbarsgm::setIdColAcol() {
969
// Set outgoing flavours.
970
id3 = (id1 > 0) ? idNew : -idNew;
971
setId( id1, id2, id3, -id3);
973
// Colour flow topologies. Swap when antiquarks.
974
if (abs(id1) < 9 && idNew < 9) setColAcol( 1, 0, 0, 1, 2, 0, 0, 2);
975
else if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
976
else if (idNew < 9) setColAcol( 0, 0, 0, 0, 1, 0, 0, 1);
977
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
978
if (id1 < 0) swapColAcol();
982
//==========================================================================
984
// Sigma2ffbar2FFbarsgmZ class.
985
// Cross section f fbar -> gamma*/Z0 -> F Fbar.
987
//--------------------------------------------------------------------------
989
// Initialize process.
991
void Sigma2ffbar2FFbarsgmZ::initProc() {
994
nameSave = "f fbar -> F Fbar (s-channel gamma*/Z0)";
995
if (idNew == 4) nameSave = "f fbar -> c cbar (s-channel gamma*/Z0)";
996
if (idNew == 5) nameSave = "f fbar -> b bbar (s-channel gamma*/Z0)";
997
if (idNew == 6) nameSave = "f fbar -> t tbar (s-channel gamma*/Z0)";
998
if (idNew == 7) nameSave = "f fbar -> b' b'bar (s-channel gamma*/Z0)";
999
if (idNew == 8) nameSave = "f fbar -> t' t'bar (s-channel gamma*/Z0)";
1000
if (idNew == 15) nameSave = "f fbar -> tau+ tau- (s-channel gamma*/Z0)";
1001
if (idNew == 17) nameSave = "f fbar -> tau'+ tau'- (s-channel gamma*/Z0)";
1003
nameSave = "f fbar -> nu'_tau nu'bar_tau (s-channel gamma*/Z0)";
1005
// Allow to pick only gamma* or Z0 part of full gamma*/Z0 expression.
1006
gmZmode = settingsPtr->mode("WeakZ0:gmZmode");
1008
// Store Z0 mass and width for propagator.
1009
mRes = particleDataPtr->m0(23);
1010
GammaRes = particleDataPtr->mWidth(23);
1012
GamMRat = GammaRes / mRes;
1013
thetaWRat = 1. / (16. * couplingsPtr->sin2thetaW()
1014
* couplingsPtr->cos2thetaW());
1016
// Store couplings of F.
1017
ef = couplingsPtr->ef(idNew);
1018
vf = couplingsPtr->vf(idNew);
1019
af = couplingsPtr->af(idNew);
1021
// Secondary open width fraction, relevant for top (or heavier).
1022
openFracPair = particleDataPtr->resOpenFrac(idNew, -idNew);
1026
//--------------------------------------------------------------------------
1028
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
1030
void Sigma2ffbar2FFbarsgmZ::sigmaKin() {
1032
// Check that above threshold.
1034
if (mH < m3 + m4 + MASSMARGIN) {
1039
// Define average F, Fbar mass so same beta. Phase space.
1040
double s34Avg = 0.5 * (s3 + s4) - 0.25 * pow2(s3 - s4) / sH;
1042
betaf = sqrtpos(1. - 4. * mr);
1044
// Final-state colour factor.
1045
double colF = (idNew < 9) ? 3. * (1. + alpS / M_PI) : 1.;
1047
// Reconstruct decay angle so can reuse 2 -> 1 cross section.
1048
cosThe = (tH - uH) / (betaf * sH);
1050
// Calculate prefactors for gamma/interference/Z0 cross section terms.
1051
gamProp = colF * M_PI * pow2(alpEM) / sH2;
1052
intProp = gamProp * 2. * thetaWRat * sH * (sH - m2Res)
1053
/ ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
1054
resProp = gamProp * pow2(thetaWRat * sH)
1055
/ ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
1057
// Optionally only keep gamma* or Z0 term.
1058
if (gmZmode == 1) {intProp = 0.; resProp = 0.;}
1059
if (gmZmode == 2) {gamProp = 0.; intProp = 0.;}
1063
//--------------------------------------------------------------------------
1065
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
1067
double Sigma2ffbar2FFbarsgmZ::sigmaHat() {
1069
// Fail if below threshold.
1070
if (!isPhysical) return 0.;
1072
// Couplings for in-flavours.
1073
int idAbs = abs(id1);
1074
double ei = couplingsPtr->ef(idAbs);
1075
double vi = couplingsPtr->vf(idAbs);
1076
double ai = couplingsPtr->af(idAbs);
1078
// Coefficients of angular expression.
1079
double coefTran = ei*ei * gamProp * ef*ef + ei * vi * intProp * ef * vf
1080
+ (vi*vi + ai*ai) * resProp * (vf*vf + pow2(betaf) * af*af);
1081
double coefLong = 4. * mr * ( ei*ei * gamProp * ef*ef
1082
+ ei * vi * intProp * ef * vf + (vi*vi + ai*ai) * resProp * vf*vf );
1083
double coefAsym = betaf * ( ei * ai * intProp * ef * af
1084
+ 4. * vi * ai * resProp * vf * af );
1086
// Combine gamma, interference and Z0 parts.
1087
double sigma = coefTran * (1. + pow2(cosThe))
1088
+ coefLong * (1. - pow2(cosThe)) + 2. * coefAsym * cosThe;
1090
// Top: corrections for closed decay channels.
1091
sigma *= openFracPair;
1093
// Initial-state colour factor. Answer.
1094
if (idAbs < 9) sigma /= 3.;
1099
//--------------------------------------------------------------------------
1101
// Select identity, colour and anticolour.
1103
void Sigma2ffbar2FFbarsgmZ::setIdColAcol() {
1105
// Set outgoing flavours.
1106
id3 = (id1 > 0) ? idNew : -idNew;
1107
setId( id1, id2, id3, -id3);
1109
// Colour flow topologies. Swap when antiquarks.
1110
if (abs(id1) < 9 && idNew < 9) setColAcol( 1, 0, 0, 1, 2, 0, 0, 2);
1111
else if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
1112
else if (idNew < 9) setColAcol( 0, 0, 0, 0, 1, 0, 0, 1);
1113
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
1114
if (id1 < 0) swapColAcol();
1118
//--------------------------------------------------------------------------
1120
// Evaluate weight for decay angles of W in top decay.
1122
double Sigma2ffbar2FFbarsgmZ::weightDecay( Event& process, int iResBeg,
1125
// For top decay hand over to standard routine, else done.
1126
if (idNew == 6 && process[process[iResBeg].mother1()].idAbs() == 6)
1127
return weightTopDecay( process, iResBeg, iResEnd);
1132
//==========================================================================
1134
// Sigma2ffbar2FfbarsW class.
1135
// Cross section f fbar' -> W+- -> F fbar".
1137
//--------------------------------------------------------------------------
1139
// Initialize process.
1141
void Sigma2ffbar2FfbarsW::initProc() {
1144
nameSave = "f fbar -> F fbar (s-channel W+-)";
1145
if (idNew == 4) nameSave = "f fbar -> c qbar (s-channel W+-)";
1146
if (idNew == 5) nameSave = "f fbar -> b qbar (s-channel W+-)";
1147
if (idNew == 6) nameSave = "f fbar -> t qbar (s-channel W+-)";
1148
if (idNew == 7) nameSave = "f fbar -> b' qbar (s-channel W+-)";
1149
if (idNew == 8) nameSave = "f fbar -> t' qbar (s-channel W+-)";
1150
if (idNew == 7 && idNew2 == 6)
1151
nameSave = "f fbar -> b' tbar (s-channel W+-)";
1152
if (idNew == 8 && idNew2 == 7)
1153
nameSave = "f fbar -> t' b'bar (s-channel W+-)";
1154
if (idNew == 15 || idNew == 16)
1155
nameSave = "f fbar -> tau nu_taubar (s-channel W+-)";
1156
if (idNew == 17 || idNew == 18)
1157
nameSave = "f fbar -> tau' nu'_taubar (s-channel W+-)";
1159
// Store W+- mass and width for propagator.
1160
mRes = particleDataPtr->m0(24);
1161
GammaRes = particleDataPtr->mWidth(24);
1163
GamMRat = GammaRes / mRes;
1164
thetaWRat = 1. / (12. * couplingsPtr->sin2thetaW());
1166
// For t/t' want to use at least b mass.
1168
if ( (idNew == 6 || idNew == 8) && idNew2 == 0 ) idPartner = 5;
1170
// Sum of CKM weights for quarks.
1171
V2New = (idNew < 9) ? couplingsPtr->V2CKMsum(idNew) : 1.;
1172
if (idNew2 != 0) V2New = couplingsPtr->V2CKMid(idNew, idNew2);
1174
// Secondary open width fractions, relevant for top or heavier.
1175
openFracPos = particleDataPtr->resOpenFrac( idNew, -idNew2);
1176
openFracNeg = particleDataPtr->resOpenFrac(-idNew, idNew2);
1180
//--------------------------------------------------------------------------
1182
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
1184
void Sigma2ffbar2FfbarsW::sigmaKin() {
1186
// Check that above threshold.
1188
if (mH < m3 + m4 + MASSMARGIN) {
1193
// Phase space factors.
1194
double mr1 = s3 / sH;
1195
double mr2 = s4 / sH;
1196
double betaf = sqrtpos( pow2(1. - mr1 - mr2) - 4. * mr1 * mr2);
1198
// Reconstruct decay angle so can reuse 2 -> 1 cross section.
1199
double cosThe = (tH - uH) / (betaf * sH);
1201
// Set up Breit-Wigner and in- and out-widths.
1202
double sigBW = 9. * M_PI * pow2(alpEM * thetaWRat)
1203
/ ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
1205
// Initial-state colour factor.
1206
double colF = (idNew < 9) ? 3. * (1. + alpS / M_PI) * V2New : 1.;
1208
// Angular dependence.
1209
double wt = pow2(1. + betaf * cosThe) - pow2(mr1 - mr2);
1211
// Temporary answer.
1212
sigma0 = sigBW * colF * wt;
1216
//--------------------------------------------------------------------------
1218
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
1220
double Sigma2ffbar2FfbarsW::sigmaHat() {
1222
// Fail if below threshold.
1223
if (!isPhysical) return 0.;
1225
// CKM and colour factors.
1226
double sigma = sigma0;
1227
if (abs(id1) < 9) sigma *= couplingsPtr->V2CKMid(abs(id1), abs(id2)) / 3.;
1229
// Correction for secondary width in top (or heavier) decay.
1230
int idSame = ((abs(id1) + idNew)%2 == 0) ? id1 : id2;
1231
sigma *= (idSame > 0) ? openFracPos : openFracNeg;
1238
//--------------------------------------------------------------------------
1240
// Select identity, colour and anticolour.
1242
void Sigma2ffbar2FfbarsW::setIdColAcol() {
1244
// Set outgoing flavours.
1246
id4 = (idNew2 != 0) ? idNew2 : couplingsPtr->V2CKMpick(idNew);
1248
int idInUp = (abs(id1)%2 == 0) ? id1 : id2;
1249
if (idInUp > 0) id4 = -id4;
1252
int idInDn = (abs(id1)%2 == 1) ? id1 : id2;
1253
if (idInDn > 0) id4 = -id4;
1256
setId( id1, id2, id3, id4);
1258
// Swap tHat and uHat for fbar' f -> F f".
1259
if (id1 * id3 < 0) swapTU = true;
1261
// Colour flow topologies. Swap when antiquarks.
1262
if (abs(id1) < 9 && idNew < 9) setColAcol( 1, 0, 0, 1, 2, 0, 0, 2);
1263
else if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
1264
else if (idNew < 9) setColAcol( 0, 0, 0, 0, 1, 0, 0, 1);
1265
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
1266
if (id1 < 0) swapCol12();
1267
if (id3 < 0) swapCol34();
1271
//--------------------------------------------------------------------------
1273
// Evaluate weight for decay angles of W in top decay.
1275
double Sigma2ffbar2FfbarsW::weightDecay( Event& process, int iResBeg,
1278
// For top decay hand over to standard routine, else done.
1279
if (idNew == 6 && process[process[iResBeg].mother1()].idAbs() == 6)
1280
return weightTopDecay( process, iResBeg, iResEnd);
1285
//==========================================================================
1287
// Sigma2ffbargmZWgmZW class.
1288
// Collects common methods for f fbar -> gamma*/Z0/W+- gamma*/Z0/W-+.
1290
//--------------------------------------------------------------------------
1292
// Calculate and store internal products.
1294
void Sigma2ffbargmZWgmZW::setupProd( Event& process, int i1, int i2,
1295
int i3, int i4, int i5, int i6) {
1297
// Store incoming and outgoing momenta,
1298
pRot[1] = process[i1].p();
1299
pRot[2] = process[i2].p();
1300
pRot[3] = process[i3].p();
1301
pRot[4] = process[i4].p();
1302
pRot[5] = process[i5].p();
1303
pRot[6] = process[i6].p();
1305
// Do random rotation to avoid accidental zeroes in HA expressions.
1306
bool smallPT = false;
1309
double thetaNow = acos(2. * rndmPtr->flat() - 1.);
1310
double phiNow = 2. * M_PI * rndmPtr->flat();
1311
for (int i = 1; i <= 6; ++i) {
1312
pRot[i].rot( thetaNow, phiNow);
1313
if (pRot[i].pT2() < 1e-4 * pRot[i].pAbs2()) smallPT = true;
1317
// Calculate internal products.
1318
for (int i = 1; i < 6; ++i) {
1319
for (int j = i + 1; j <= 6; ++j) {
1321
sqrt( (pRot[i].e() - pRot[i].pz()) * (pRot[j].e() + pRot[j].pz())
1322
/ pRot[i].pT2() ) * complex( pRot[i].px(), pRot[i].py() )
1323
- sqrt( (pRot[i].e() + pRot[i].pz()) * (pRot[j].e() - pRot[j].pz())
1324
/ pRot[j].pT2() ) * complex( pRot[j].px(), pRot[j].py() );
1325
hC[i][j] = conj( hA[i][j] );
1327
hA[i][j] *= complex( 0., 1.);
1328
hC[i][j] *= complex( 0., 1.);
1330
hA[j][i] = - hA[i][j];
1331
hC[j][i] = - hC[i][j];
1337
//--------------------------------------------------------------------------
1339
// Evaluate the F function of Gunion and Kunszt.
1341
complex Sigma2ffbargmZWgmZW::fGK(int j1, int j2, int j3, int j4, int j5,
1344
return 4. * hA[j1][j3] * hC[j2][j6]
1345
* ( hA[j1][j5] * hC[j1][j4] + hA[j3][j5] * hC[j3][j4] );
1349
//--------------------------------------------------------------------------
1351
// Evaluate the Xi function of Gunion and Kunszt.
1353
double Sigma2ffbargmZWgmZW::xiGK( double tHnow, double uHnow) {
1355
return - 4. * s3 * s4 + tHnow * (3. * tHnow + 4. * uHnow)
1356
+ tHnow * tHnow * ( tHnow * uHnow / (s3 * s4)
1357
- 2. * (1. / s3 + 1./s4) * (tHnow + uHnow)
1358
+ 2. * (s3 / s4 + s4 / s3) );
1362
//--------------------------------------------------------------------------
1364
// Evaluate the Xj function of Gunion and Kunszt.
1366
double Sigma2ffbargmZWgmZW::xjGK( double tHnow, double uHnow) {
1368
return 8. * pow2(s3 + s4) - 8. * (s3 + s4) * (tHnow + uHnow)
1369
- 6. * tHnow * uHnow - 2. * tHnow * uHnow * ( tHnow * uHnow
1370
/ (s3 * s4) - 2. * (1. / s3 + 1. / s4) * (tHnow + uHnow)
1371
+ 2. * (s3 / s4 + s4 / s3) );
1375
//==========================================================================
1377
// Sigma2ffbar2gmZgmZ class.
1378
// Cross section for f fbar -> gamma*/Z0 gamma*/Z0 (f is quark or lepton).
1380
//--------------------------------------------------------------------------
1382
// Initialize process.
1384
void Sigma2ffbar2gmZgmZ::initProc() {
1386
// Allow to pick only gamma* or Z0 part of full gamma*/Z0 expression.
1387
gmZmode = settingsPtr->mode("WeakZ0:gmZmode");
1389
// Store Z0 mass and width for propagator.
1390
mRes = particleDataPtr->m0(23);
1391
GammaRes = particleDataPtr->mWidth(23);
1393
GamMRat = GammaRes / mRes;
1394
thetaWRat = 1. / (16. * couplingsPtr->sin2thetaW()
1395
* couplingsPtr->cos2thetaW());
1397
// Set pointer to particle properties and decay table.
1398
particlePtr = particleDataPtr->particleDataEntryPtr(23);
1402
//--------------------------------------------------------------------------
1404
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
1406
void Sigma2ffbar2gmZgmZ::sigmaKin() {
1408
// Cross section part common for all incoming flavours.
1409
sigma0 = (M_PI / sH2) * pow2(alpEM) * 0.5
1410
* ( (tH2 + uH2 + 2. * (s3 + s4) * sH) / (tH * uH)
1411
- s3 * s4 * (1./tH2 + 1./uH2) );
1413
// Common coupling factors at the resonance masses
1414
double alpEM3 = couplingsPtr->alphaEM(s3);
1415
double alpS3 = couplingsPtr->alphaS(s3);
1416
double colQ3 = 3. * (1. + alpS3 / M_PI);
1417
double alpEM4 = couplingsPtr->alphaEM(s4);
1418
double alpS4 = couplingsPtr->alphaS(s4);
1419
double colQ4 = 3. * (1. + alpS4 / M_PI);
1421
// Reset quantities to sum. Declare variables in loop.
1429
double mf, mr, psvec, psaxi, betaf, ef2, efvf, vf2af2, colf;
1431
// Loop over all Z0 decay channels.
1432
for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
1433
int idAbs = abs( particlePtr->channel(i).product(0) );
1435
// Only contributions from three fermion generations, except top.
1436
if ( (idAbs > 0 && idAbs < 6) || ( idAbs > 10 && idAbs < 17)) {
1437
mf = particleDataPtr->m0(idAbs);
1438
onMode = particlePtr->channel(i).onMode();
1440
// First Z0: check that above threshold. Phase space.
1441
if (m3 > 2. * mf + MASSMARGIN) {
1443
betaf = sqrtpos(1. - 4. * mr);
1444
psvec = betaf * (1. + 2. * mr);
1445
psaxi = pow3(betaf);
1447
// First Z0: combine phase space with couplings.
1448
ef2 = couplingsPtr->ef2(idAbs) * psvec;
1449
efvf = couplingsPtr->efvf(idAbs) * psvec;
1450
vf2af2 = couplingsPtr->vf2(idAbs) * psvec
1451
+ couplingsPtr->af2(idAbs) * psaxi;
1452
colf = (idAbs < 6) ? colQ3 : 1.;
1454
// First Z0: store sum of combinations for open outstate channels.
1455
if (onMode == 1 || onMode == 2) {
1456
gamSum3 += colf * ef2;
1457
intSum3 += colf * efvf;
1458
resSum3 += colf * vf2af2;
1462
// Second Z0: check that above threshold. Phase space.
1463
if (m4 > 2. * mf + MASSMARGIN) {
1465
betaf = sqrtpos(1. - 4. * mr);
1466
psvec = betaf * (1. + 2. * mr);
1467
psaxi = pow3(betaf);
1469
// Second Z0: combine phase space with couplings.
1470
ef2 = couplingsPtr->ef2(idAbs) * psvec;
1471
efvf = couplingsPtr->efvf(idAbs) * psvec;
1472
vf2af2 = couplingsPtr->vf2(idAbs) * psvec
1473
+ couplingsPtr->af2(idAbs) * psaxi;
1474
colf = (idAbs < 6) ? colQ4 : 1.;
1476
// Second Z0: store sum of combinations for open outstate channels.
1477
if (onMode == 1 || onMode == 2) {
1478
gamSum4 += colf * ef2;
1479
intSum4 += colf * efvf;
1480
resSum4 += colf * vf2af2;
1484
// End loop over fermions.
1488
// First Z0: calculate prefactors for gamma/interference/Z0 terms.
1489
gamProp3 = 4. * alpEM3 / (3. * M_PI * s3);
1490
intProp3 = gamProp3 * 2. * thetaWRat * s3 * (s3 - m2Res)
1491
/ ( pow2(s3 - m2Res) + pow2(s3 * GamMRat) );
1492
resProp3 = gamProp3 * pow2(thetaWRat * s3)
1493
/ ( pow2(s3 - m2Res) + pow2(s3 * GamMRat) );
1495
// First Z0: optionally only keep gamma* or Z0 term.
1496
if (gmZmode == 1) {intProp3 = 0.; resProp3 = 0.;}
1497
if (gmZmode == 2) {gamProp3 = 0.; intProp3 = 0.;}
1499
// Second Z0: calculate prefactors for gamma/interference/Z0 terms.
1500
gamProp4 = 4. * alpEM4 / (3. * M_PI * s4);
1501
intProp4 = gamProp4 * 2. * thetaWRat * s4 * (s4 - m2Res)
1502
/ ( pow2(s4 - m2Res) + pow2(s4 * GamMRat) );
1503
resProp4 = gamProp4 * pow2(thetaWRat * s4)
1504
/ ( pow2(s4 - m2Res) + pow2(s4 * GamMRat) );
1506
// Second Z0: optionally only keep gamma* or Z0 term.
1507
if (gmZmode == 1) {intProp4 = 0.; resProp4 = 0.;}
1508
if (gmZmode == 2) {gamProp4 = 0.; intProp4 = 0.;}
1512
//--------------------------------------------------------------------------
1514
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
1516
double Sigma2ffbar2gmZgmZ::sigmaHat() {
1518
// Charge/2, left- and righthanded couplings for in-fermion.
1519
int idAbs = abs(id1);
1520
double ei = 0.5 * couplingsPtr->ef(idAbs);
1521
double li = couplingsPtr->lf(idAbs);
1522
double ri = couplingsPtr->rf(idAbs);
1524
// Combine left/right gamma, interference and Z0 parts for each Z0.
1525
double left3 = ei * ei * gamProp3 * gamSum3
1526
+ ei * li * intProp3 * intSum3
1527
+ li * li * resProp3 * resSum3;
1528
double right3 = ei * ei * gamProp3 * gamSum3
1529
+ ei * ri * intProp3 * intSum3
1530
+ ri * ri * resProp3 * resSum3;
1531
double left4 = ei * ei * gamProp4 * gamSum4
1532
+ ei * li * intProp4 * intSum4
1533
+ li * li * resProp4 * resSum4;
1534
double right4 = ei * ei * gamProp4 * gamSum4
1535
+ ei * ri * intProp4 * intSum4
1536
+ ri * ri * resProp4 * resSum4;
1538
// Combine left- and right-handed couplings for the two Z0's.
1539
double sigma = sigma0 * (left3 * left4 + right3 * right4);
1541
// Correct for the running-width Z0 propagators weight in PhaseSpace.
1542
sigma /= (runBW3 * runBW4);
1544
// Initial-state colour factor. Answer.
1545
if (idAbs < 9) sigma /= 3.;
1550
//--------------------------------------------------------------------------
1552
// Select identity, colour and anticolour.
1554
void Sigma2ffbar2gmZgmZ::setIdColAcol() {
1556
// Flavours trivial.
1557
setId( id1, id2, 23, 23);
1559
// Colour flow topologies. Swap when antiquarks.
1560
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
1561
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
1562
if (id1 < 0) swapColAcol();
1566
//--------------------------------------------------------------------------
1568
// Evaluate correlated decay flavours of the two gamma*/Z0.
1569
// Unique complication, caused by gamma*/Z0 mix different left/right.
1571
double Sigma2ffbar2gmZgmZ::weightDecayFlav( Event& process) {
1573
// Order so that fbar(1) f(2) -> f'(3) fbar'(4) f"(5) fbar"(6).
1574
i1 = (process[3].id() < 0) ? 3 : 4;
1576
i3 = (process[7].id() > 0) ? 7 : 8;
1578
i5 = (process[9].id() > 0) ? 9 : 10;
1581
// Charge/2, left- and righthanded couplings for in- and out-fermions.
1582
int idAbs = process[i1].idAbs();
1583
double ei = 0.5 * couplingsPtr->ef(idAbs);
1584
double li = couplingsPtr->lf(idAbs);
1585
double ri = couplingsPtr->rf(idAbs);
1586
idAbs = process[i3].idAbs();
1587
double e3 = 0.5 * couplingsPtr->ef(idAbs);
1588
double l3 = couplingsPtr->lf(idAbs);
1589
double r3 = couplingsPtr->rf(idAbs);
1590
idAbs = process[i5].idAbs();
1591
double e4 = 0.5 * couplingsPtr->ef(idAbs);
1592
double l4 = couplingsPtr->lf(idAbs);
1593
double r4 = couplingsPtr->rf(idAbs);
1595
// Left- and righthanded couplings combined with propagators.
1596
c3LL = ei * ei * gamProp3 * e3 * e3
1597
+ ei * li * intProp3 * e3 * l3
1598
+ li * li * resProp3 * l3 * l3;
1599
c3LR = ei * ei * gamProp3 * e3 * e3
1600
+ ei * li * intProp3 * e3 * r3
1601
+ li * li * resProp3 * r3 * r3;
1602
c3RL = ei * ei * gamProp3 * e3 * e3
1603
+ ei * ri * intProp3 * e3 * l3
1604
+ ri * ri * resProp3 * l3 * l3;
1605
c3RR = ei * ei * gamProp3 * e3 * e3
1606
+ ei * ri * intProp3 * e3 * r3
1607
+ ri * ri * resProp3 * r3 * r3;
1608
c4LL = ei * ei * gamProp4 * e4 * e4
1609
+ ei * li * intProp4 * e4 * l4
1610
+ li * li * resProp4 * l4 * l4;
1611
c4LR = ei * ei * gamProp4 * e4 * e4
1612
+ ei * li * intProp4 * e4 * r4
1613
+ li * li * resProp4 * r4 * r4;
1614
c4RL = ei * ei * gamProp4 * e4 * e4
1615
+ ei * ri * intProp4 * e4 * l4
1616
+ ri * ri * resProp4 * l4 * l4;
1617
c4RR = ei * ei * gamProp4 * e4 * e4
1618
+ ei * ri * intProp4 * e4 * r4
1619
+ ri * ri * resProp4 * r4 * r4;
1621
// Flavour weight and maximum.
1622
flavWt = (c3LL + c3LR) * (c4LL + c4LR) + (c3RL + c3RR) * (c4RL + c4RR);
1623
double flavWtMax = (c3LL + c3LR + c3RL + c3RR) * (c4LL + c4LR + c4RL + c4RR);
1626
return flavWt / flavWtMax;
1630
//--------------------------------------------------------------------------
1632
// Evaluate weight for decay angles of the two gamma*/Z0.
1634
double Sigma2ffbar2gmZgmZ::weightDecay( Event& process, int iResBeg,
1637
// Two resonance decays, but with common weight.
1638
if (iResBeg != 5 || iResEnd != 6) return 1.;
1640
// Set up four-products and internal products.
1641
setupProd( process, i1, i2, i3, i4, i5, i6);
1643
// Flip tHat and uHat if first incoming is fermion.
1646
if (process[3].id() > 0) swap( tHres, uHres);
1648
// Kinematics factors (norm(x) = |x|^2).
1649
double fGK135 = norm( fGK( 1, 2, 3, 4, 5, 6) / tHres
1650
+ fGK( 1, 2, 5, 6, 3, 4) / uHres );
1651
double fGK145 = norm( fGK( 1, 2, 4, 3, 5, 6) / tHres
1652
+ fGK( 1, 2, 5, 6, 4, 3) / uHres );
1653
double fGK136 = norm( fGK( 1, 2, 3, 4, 6, 5) / tHres
1654
+ fGK( 1, 2, 6, 5, 3, 4) / uHres );
1655
double fGK146 = norm( fGK( 1, 2, 4, 3, 6, 5) / tHres
1656
+ fGK( 1, 2, 6, 5, 4, 3) / uHres );
1657
double fGK253 = norm( fGK( 2, 1, 5, 6, 3, 4) / tHres
1658
+ fGK( 2, 1, 3, 4, 5, 6) / uHres );
1659
double fGK263 = norm( fGK( 2, 1, 6, 5, 3, 4) / tHres
1660
+ fGK( 2, 1, 3, 4, 6, 5) / uHres );
1661
double fGK254 = norm( fGK( 2, 1, 5, 6, 4, 3) / tHres
1662
+ fGK( 2, 1, 4, 3, 5, 6) / uHres );
1663
double fGK264 = norm( fGK( 2, 1, 6, 5, 4, 3) / tHres
1664
+ fGK( 2, 1, 4, 3, 6, 5) / uHres );
1666
// Weight and maximum.
1667
double wt = c3LL * c4LL * fGK135 + c3LR * c4LL * fGK145
1668
+ c3LL * c4LR * fGK136 + c3LR * c4LR * fGK146
1669
+ c3RL * c4RL * fGK253 + c3RR * c4RL * fGK263
1670
+ c3RL * c4RR * fGK254 + c3RR * c4RR * fGK264;
1671
double wtMax = 16. * s3 * s4 * flavWt
1672
* ( (tHres*tHres + uHres*uHres + 2. * sH * (s3 + s4)) / (tHres * uHres)
1673
- s3 * s4 * (1. / (tHres*tHres) + 1. / (uHres*uHres)) );
1680
//==========================================================================
1682
// Sigma2ffbar2ZW class.
1683
// Cross section for f fbar' -> Z0 W+- (f is quark or lepton).
1685
//--------------------------------------------------------------------------
1687
// Initialize process.
1689
void Sigma2ffbar2ZW::initProc() {
1691
// Store W+- mass and width for propagator.
1692
mW = particleDataPtr->m0(24);
1693
widW = particleDataPtr->mWidth(24);
1695
mwWS = pow2(mW * widW);
1697
// Left-handed couplings for up/nu- and down/e-type quarks.
1698
lun = (hasLeptonBeams) ? couplingsPtr->lf(12) : couplingsPtr->lf(2);
1699
lde = (hasLeptonBeams) ? couplingsPtr->lf(11) : couplingsPtr->lf(1);
1701
// Common weak coupling factor.
1702
sin2thetaW = couplingsPtr->sin2thetaW();
1703
cos2thetaW = couplingsPtr->cos2thetaW();
1704
thetaWRat = 1. / (4. * cos2thetaW);
1705
cotT = sqrt(cos2thetaW / sin2thetaW);
1706
thetaWpt = (9. - 8. * sin2thetaW) / 4.;
1707
thetaWmm = (8. * sin2thetaW - 6.) / 4.;
1709
// Secondary open width fractions.
1710
openFracPos = particleDataPtr->resOpenFrac(23, 24);
1711
openFracNeg = particleDataPtr->resOpenFrac(23, -24);
1715
//--------------------------------------------------------------------------
1717
// Evaluate sigmaHat(sHat), part independent of incoming flavour.
1719
void Sigma2ffbar2ZW::sigmaKin() {
1721
// Evaluate cross section, as programmed by Merlin Kole (after tidying),
1722
// based on Brown, Sahdev, Mikaelian, Phys Rev. D20 (1979) 1069.
1724
double resBW = 1. / (pow2(sH - mWS) + mwWS);
1725
double prefac = 12.0 * M_PI * pow2(alpEM) / (sH2 * 8. * sin2thetaW);
1726
double temp1 = tH * uH - s3 * s4;
1727
double temp2 = temp1 / (s3 * s4);
1728
double temp3 = (s3 + s4) / sH;
1729
double temp4 = s3 * s4 / sH;
1730
double partA = temp2 * (0.25 - 0.5 * temp3
1731
+ (pow2(s3 + s4) + 8. * s3 * s4)/(4. * sH2) )
1732
+ (s3 + s4)/(s3 * s4) * (sH/2. - s3 - s4 + pow2(s3 - s4)/(2. * sH));
1733
double partB1 = lun * (0.25 * temp2 * (1. - temp3 - 4. * temp4 / tH)
1734
+ ((s3 + s4)/(2. * s3 * s4)) * (sH - s3 - s4 + 2. * s3 * s4 / tH) );
1735
double partB2 = lde * ( 0.25 * temp2 * (1.- temp3 - 4. * temp4 / uH)
1736
+ ((s3 + s4)/(2. * s3 * s4)) * (sH - s3 - s4 + 2. * s3 * s4 / uH) );
1737
double partE = 0.25 * temp2 + 0.5 *(s3 + s4) / temp4;
1738
sigma0 = prefac * (pow2(cotT) * sH2 * resBW * partA
1739
+ 2.* sH * cotT * resBW * (sH - mWS) * (partB2 - partB1)
1740
+ pow2(lun - lde) * partE + pow2(lde) * temp1/uH2
1741
+ pow2(lun) * temp1/tH2 + 2. * lun * lde * sH * (s3 + s4) / (uH * tH));
1744
// Evaluate cross section. Expression from EHLQ, with bug fix,
1745
// but can still give negative cross section so suspect.
1746
double resBW = 1. / (pow2(sH - mWS) + mwWS);
1747
sigma0 = (M_PI / sH2) * 0.5 * pow2(alpEM / sin2thetaW);
1748
sigma0 *= sH * resBW * (thetaWpt * pT2 + thetaWmm * (s3 + s4))
1749
+ (sH - mWS) * resBW * sH * (pT2 - s3 - s4) * (lun / tH - lde / uH)
1750
+ thetaWRat * sH * pT2 * ( lun*lun / tH2 + lde*lde / uH2 )
1751
+ 2. * thetaWRat * sH * (s3 + s4) * lun * lde / (tH * uH);
1752
// Need to protect against negative cross sections at times.
1753
sigma0 = max(0., sigma0);
1757
//--------------------------------------------------------------------------
1759
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
1761
double Sigma2ffbar2ZW::sigmaHat() {
1763
// CKM and colour factors.
1764
double sigma = sigma0;
1765
if (abs(id1) < 9) sigma *= couplingsPtr->V2CKMid(abs(id1), abs(id2)) / 3.;
1767
// Corrections for secondary widths in Z0 and W+- decays.
1768
int idUp = (abs(id1)%2 == 0) ? id1 : id2;
1769
sigma *= (idUp > 0) ? openFracPos : openFracNeg;
1776
//--------------------------------------------------------------------------
1778
// Select identity, colour and anticolour.
1780
void Sigma2ffbar2ZW::setIdColAcol() {
1782
// Sign of outgoing W.
1783
int sign = 1 - 2 * (abs(id1)%2);
1784
if (id1 < 0) sign = -sign;
1785
setId( id1, id2, 23, 24 * sign);
1787
// tHat is defined between (f, W-) or (fbar, W+),
1788
// so OK for u/ubar on side 1, but must swap tHat <-> uHat if d/dbar.
1789
if (abs(id1)%2 == 1) swapTU = true;
1791
// Colour flow topologies. Swap when antiquarks.
1792
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
1793
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
1794
if (id1 < 0) swapColAcol();
1798
//--------------------------------------------------------------------------
1800
// Evaluate weight for Z0 and W+- decay angles.
1802
double Sigma2ffbar2ZW::weightDecay( Event& process, int iResBeg, int iResEnd) {
1804
// Two resonance decays, but with common weight.
1805
if (iResBeg != 5 || iResEnd != 6) return 1.;
1807
// Order so that fbar(1) f(2) -> f'(3) fbar'(4) f"(5) fbar"(6)
1808
// with f' fbar' from W+- and f" fbar" from Z0 (note flip Z0 <-> W+-).
1809
int i1 = (process[3].id() < 0) ? 3 : 4;
1811
int i3 = (process[9].id() > 0) ? 9 : 10;
1813
int i5 = (process[7].id() > 0) ? 7 : 8;
1816
// Set up four-products and internal products.
1817
setupProd( process, i1, i2, i3, i4, i5, i6);
1819
// Swap tHat and uHat if incoming fermion is downtype.
1822
if (process[i2].id()%2 == 1) swap( tHres, uHres);
1824
// Couplings of incoming (anti)fermions and outgoing from Z0.
1825
int idAbs = process[i1].idAbs();
1826
double ai = couplingsPtr->af(idAbs);
1827
double li1 = couplingsPtr->lf(idAbs);
1828
idAbs = process[i2].idAbs();
1829
double li2 = couplingsPtr->lf(idAbs);
1830
idAbs = process[i5].idAbs();
1831
double l4 = couplingsPtr->lf(idAbs);
1832
double r4 = couplingsPtr->rf(idAbs);
1834
// W propagator/interference factor.
1835
double Wint = cos2thetaW * (sH - mWS) / (pow2(sH - mWS) + mwWS);
1837
// Combinations of couplings and kinematics (norm(x) = |x|^2).
1838
double aWZ = li2 / tHres - 2. * Wint * ai;
1839
double bWZ = li1 / uHres + 2. * Wint * ai;
1840
double fGK135 = norm( aWZ * fGK( 1, 2, 3, 4, 5, 6)
1841
+ bWZ * fGK( 1, 2, 5, 6, 3, 4) );
1842
double fGK136 = norm( aWZ * fGK( 1, 2, 3, 4, 6, 5)
1843
+ bWZ * fGK( 1, 2, 6, 5, 3, 4) );
1844
double xiT = xiGK( tHres, uHres);
1845
double xiU = xiGK( uHres, tHres);
1846
double xjTU = xjGK( tHres, uHres);
1848
// Weight and maximum weight.
1849
double wt = l4*l4 * fGK135 + r4*r4 * fGK136;
1850
double wtMax = 4. * s3 * s4 * (l4*l4 + r4*r4)
1851
* (aWZ * aWZ * xiT + bWZ * bWZ * xiU + aWZ * bWZ * xjTU);
1858
//==========================================================================
1860
// Sigma2ffbar2WW class.
1861
// Cross section for f fbar -> W- W+ (f is quark or lepton).
1863
//--------------------------------------------------------------------------
1865
// Initialize process.
1867
void Sigma2ffbar2WW::initProc() {
1869
// Store Z0 mass and width for propagator. Common coupling factor.
1870
mZ = particleDataPtr->m0(23);
1871
widZ = particleDataPtr->mWidth(23);
1873
mwZS = pow2(mZ * widZ);
1874
thetaWRat = 1. / (4. * couplingsPtr->sin2thetaW());
1876
// Secondary open width fraction.
1877
openFracPair = particleDataPtr->resOpenFrac(24, -24);
1881
//--------------------------------------------------------------------------
1883
// Evaluate sigmaHat(sHat), part independent of incoming flavour.
1885
void Sigma2ffbar2WW::sigmaKin() {
1887
// Cross section part common for all incoming flavours.
1888
sigma0 = (M_PI / sH2) * pow2(alpEM);
1890
// Z0 propagator and gamma*/Z0 interference.
1891
double Zprop = sH2 / (pow2(sH - mZS) + mwZS);
1892
double Zint = Zprop * (1. - mZS / sH);
1894
// Common coupling factors (g = gamma*, Z = Z0, f = t-channel fermion).
1896
cgZ = thetaWRat * Zint;
1897
cZZ = 0.5 * pow2(thetaWRat) * Zprop;
1899
cfZ = pow2(thetaWRat) * Zint;
1900
cff = pow2(thetaWRat);
1902
// Kinematical functions.
1903
double rat34 = sH * (2. * (s3 + s4) + pT2) / (s3 * s4);
1904
double lambdaS = pow2(sH - s3 - s4) - 4. * s3 * s4;
1905
double intA = (sH - s3 - s4) * rat34 / sH;
1906
double intB = 4. * (s3 + s4 - pT2);
1907
gSS = (lambdaS * rat34 + 12. * sH * pT2) / sH2;
1908
gTT = rat34 + 4. * sH * pT2 / tH2;
1909
gST = intA + intB / tH;
1910
gUU = rat34 + 4. * sH * pT2 / uH2;
1911
gSU = intA + intB / uH;
1915
//--------------------------------------------------------------------------
1917
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
1919
double Sigma2ffbar2WW::sigmaHat() {
1921
// Flavour-specific couplings.
1922
int idAbs = abs(id1);
1923
double ei = couplingsPtr->ef(idAbs);
1924
double vi = couplingsPtr->vf(idAbs);
1925
double ai = couplingsPtr->af(idAbs);
1927
// Combine, with different cases for up- and down-type in-flavours.
1928
double sigma = sigma0;
1929
sigma *= (idAbs%2 == 1)
1930
? (cgg * ei*ei + cgZ * ei * vi + cZZ * (vi*vi + ai*ai)) * gSS
1931
+ (cfg * ei + cfZ * (vi + ai)) * gST + cff * gTT
1932
: (cgg * ei*ei + cgZ * ei * vi + cZZ * (vi*vi + ai*ai)) * gSS
1933
- (cfg * ei + cfZ * (vi + ai)) * gSU + cff * gUU;
1935
// Initial-state colour factor. Correction for secondary widths. Answer.
1936
if (idAbs < 9) sigma /= 3.;
1937
sigma *= openFracPair;
1942
//--------------------------------------------------------------------------
1944
// Select identity, colour and anticolour.
1946
void Sigma2ffbar2WW::setIdColAcol() {
1948
// Always order W- W+, i.e. W- first.
1949
setId( id1, id2, -24, 24);
1951
// tHat is defined between (f, W-) or (fbar, W+),
1952
if (id1 < 0) swapTU = true;
1954
// Colour flow topologies. Swap when antiquarks.
1955
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
1956
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
1957
if (id1 < 0) swapColAcol();
1961
//--------------------------------------------------------------------------
1963
// Evaluate weight for W+ and W- decay angles.
1965
double Sigma2ffbar2WW::weightDecay( Event& process, int iResBeg, int iResEnd) {
1967
// Two resonance decays, but with common weight.
1968
if (iResBeg != 5 || iResEnd != 6) return 1.;
1970
// Order so that fbar(1) f(2) -> f'(3) fbar'(4) f"(5) fbar"(6).
1971
// with f' fbar' from W- and f" fbar" from W+.
1972
int i1 = (process[3].id() < 0) ? 3 : 4;
1974
int i3 = (process[7].id() > 0) ? 7 : 8;
1976
int i5 = (process[9].id() > 0) ? 9 : 10;
1979
// Set up four-products and internal products.
1980
setupProd( process, i1, i2, i3, i4, i5, i6);
1982
// tHat and uHat of fbar f -> W- W+ opposite to previous convention.
1986
// Couplings of incoming (anti)fermion.
1987
int idAbs = process[i1].idAbs();
1988
double ai = couplingsPtr->af(idAbs);
1989
double li = couplingsPtr->lf(idAbs);
1990
double ri = couplingsPtr->rf(idAbs);
1992
// gamma*/Z0 propagator/interference factor.
1993
double Zint = mZS * (sH - mZS) / (pow2(sH - mZS) + mwZS);
1995
// Combinations of couplings and kinematics (norm(x) = |x|^2).
1996
double dWW = (li * Zint + ai) / sH;
1997
double aWW = dWW + 0.5 * (ai + 1.) / tHres;
1998
double bWW = dWW + 0.5 * (ai - 1.) / uHres;
1999
double cWW = ri * Zint / sH;
2000
double fGK135 = norm( aWW * fGK( 1, 2, 3, 4, 5, 6)
2001
- bWW * fGK( 1, 2, 5, 6, 3, 4) );
2002
double fGK253 = norm( cWW * ( fGK( 2, 1, 5, 6, 3, 4)
2003
- fGK( 2, 1, 3, 4, 5, 6) ) );
2004
double xiT = xiGK( tHres, uHres);
2005
double xiU = xiGK( uHres, tHres);
2006
double xjTU = xjGK( tHres, uHres);
2008
// Weight and maximum weight.
2009
double wt = fGK135 + fGK253;
2010
double wtMax = 4. * s3 * s4
2011
* ( aWW * aWW * xiT + bWW * bWW * xiU - aWW * bWW * xjTU
2012
+ cWW * cWW * (xiT + xiU - xjTU) );
2018
//==========================================================================
2020
// Sigma2ffbargmZggm class.
2021
// Collects common methods for f fbar -> gamma*/Z0 g/gamma and permutations.
2023
//--------------------------------------------------------------------------
2025
// Initialize process.
2027
void Sigma2ffbargmZggm::initProc() {
2029
// Allow to pick only gamma* or Z0 part of full gamma*/Z0 expression.
2030
gmZmode = settingsPtr->mode("WeakZ0:gmZmode");
2032
// Store Z0 mass and width for propagator.
2033
mRes = particleDataPtr->m0(23);
2034
GammaRes = particleDataPtr->mWidth(23);
2036
GamMRat = GammaRes / mRes;
2037
thetaWRat = 1. / (16. * couplingsPtr->sin2thetaW()
2038
* couplingsPtr->cos2thetaW());
2040
// Set pointer to particle properties and decay table.
2041
particlePtr = particleDataPtr->particleDataEntryPtr(23);
2045
//--------------------------------------------------------------------------
2047
// Evaluate sum of flavour couplings times phase space.
2049
void Sigma2ffbargmZggm::flavSum() {
2051
// Coupling factors for Z0 subsystem.
2052
double alpSZ = couplingsPtr->alphaS(s3);
2053
double colQZ = 3. * (1. + alpSZ / M_PI);
2055
// Reset quantities to sum. Declare variables in loop.
2060
double mf, mr, psvec, psaxi, betaf, ef2, efvf, vf2af2, colf;
2062
// Loop over all Z0 decay channels.
2063
for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
2064
int idAbs = abs( particlePtr->channel(i).product(0) );
2066
// Only contributions from three fermion generations, except top.
2067
if ( (idAbs > 0 && idAbs < 6) || ( idAbs > 10 && idAbs < 17)) {
2068
mf = particleDataPtr->m0(idAbs);
2070
// Check that above threshold. Phase space.
2071
if (m3 > 2. * mf + MASSMARGIN) {
2073
betaf = sqrtpos(1. - 4. * mr);
2074
psvec = betaf * (1. + 2. * mr);
2075
psaxi = pow3(betaf);
2077
// Combine phase space with couplings.
2078
ef2 = couplingsPtr->ef2(idAbs) * psvec;
2079
efvf = couplingsPtr->efvf(idAbs) * psvec;
2080
vf2af2 = couplingsPtr->vf2(idAbs) * psvec
2081
+ couplingsPtr->af2(idAbs) * psaxi;
2082
colf = (idAbs < 6) ? colQZ : 1.;
2084
// Store sum of combinations. For outstate only open channels.
2085
onMode = particlePtr->channel(i).onMode();
2086
if (onMode == 1 || onMode == 2) {
2087
gamSum += colf * ef2;
2088
intSum += colf * efvf;
2089
resSum += colf * vf2af2;
2092
// End loop over fermions.
2097
// Done. Return values in gamSum, intSum and resSum.
2101
//--------------------------------------------------------------------------
2103
// Calculate common parts of gamma/interference/Z0 propagator terms.
2105
void Sigma2ffbargmZggm::propTerm() {
2107
// Calculate prefactors for gamma/interference/Z0 cross section terms.
2108
gamProp = 4. * alpEM / (3. * M_PI * s3);
2109
intProp = gamProp * 2. * thetaWRat * s3 * (s3 - m2Res)
2110
/ ( pow2(s3 - m2Res) + pow2(s3 * GamMRat) );
2111
resProp = gamProp * pow2(thetaWRat * s3)
2112
/ ( pow2(s3 - m2Res) + pow2(s3 * GamMRat) );
2114
// Optionally only keep gamma* or Z0 term.
2115
if (gmZmode == 1) {intProp = 0.; resProp = 0.;}
2116
if (gmZmode == 2) {gamProp = 0.; intProp = 0.;}
2120
//--------------------------------------------------------------------------
2122
// Evaluate weight for gamma*/Z0 decay angle.
2124
double Sigma2ffbargmZggm::weightDecay( Event& process, int iResBeg,
2127
// Z should sit in entry 5 and one more parton in entry 6.
2128
if (iResBeg != 5 || iResEnd != 6) return 1.;
2130
// In an outgoing sense fermions are labelled f(1) fbar(2) f'(3) fbar'(4)
2131
// where f' fbar' come from gamma*/Z0 decay.
2133
int i3 = (process[7].id() > 0) ? 7 : 8;
2136
// Order so that fbar(1) f(2) -> gamma*/Z0 g/gamma.
2137
if (process[3].idAbs() < 20 && process[4].idAbs() < 20) {
2138
i1 = (process[3].id() < 0) ? 3 : 4;
2141
// Order so that f(2)/fbar(1) g/gamma -> f(1)/fbar(2) f'(3) gamma*/Z0.
2142
} else if (process[3].idAbs() < 20) {
2143
i1 = (process[3].id() < 0) ? 3 : 6;
2146
i1 = (process[4].id() < 0) ? 4 : 6;
2150
// Charge/2, left- and righthanded couplings for in- and out-fermion.
2151
int id1Abs = process[i1].idAbs();
2152
double ei = 0.5 * couplingsPtr->ef(id1Abs);
2153
double li = couplingsPtr->lf(id1Abs);
2154
double ri = couplingsPtr->rf(id1Abs);
2155
int id3Abs = process[i3].idAbs();
2156
double ef = 0.5 * couplingsPtr->ef(id3Abs);
2157
double lf = couplingsPtr->lf(id3Abs);
2158
double rf = couplingsPtr->rf(id3Abs);
2160
// Combinations of left/right for in/out, gamma*/interference/Z0.
2161
double clilf = ei*ei * gamProp * ef*ef + ei*li * intProp * ef*lf
2162
+ li*li * resProp * lf*lf;
2163
double clirf = ei*ei * gamProp * ef*ef + ei*li * intProp * ef*rf
2164
+ li*li * resProp * rf*rf;
2165
double crilf = ei*ei * gamProp * ef*ef + ei*ri * intProp * ef*lf
2166
+ ri*ri * resProp * lf*lf;
2167
double crirf = ei*ei * gamProp * ef*ef + ei*ri * intProp * ef*rf
2168
+ ri*ri * resProp * rf*rf;
2170
// Evaluate four-vector products.
2171
double p13 = process[i1].p() * process[i3].p();
2172
double p14 = process[i1].p() * process[i4].p();
2173
double p23 = process[i2].p() * process[i3].p();
2174
double p24 = process[i2].p() * process[i4].p();
2176
// Calculate weight and its maximum.
2177
double wt = (clilf + crirf) * (p13*p13 + p24*p24)
2178
+ (clirf + crilf) * (p14*p14 + p23*p23) ;
2179
double wtMax = (clilf + clirf + crilf + crirf)
2180
* (pow2(p13 + p14) + pow2(p23 + p24));
2183
return (wt / wtMax);
2187
//==========================================================================
2189
// Sigma2qqbar2gmZg class.
2190
// Cross section for q qbar -> gamma*/Z0 g.
2192
//--------------------------------------------------------------------------
2194
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
2196
void Sigma2qqbar2gmZg::sigmaKin() {
2198
// Cross section part common for all incoming flavours.
2199
sigma0 = (M_PI / sH2) * (alpEM * alpS)
2200
* (2./9.) * (tH2 + uH2 + 2. * sH * s3) / (tH * uH);
2202
// Calculate flavour sums for final state.
2205
// Calculate prefactors for gamma/interference/Z0 cross section terms.
2210
//--------------------------------------------------------------------------
2212
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
2214
double Sigma2qqbar2gmZg::sigmaHat() {
2216
// Combine gamma, interference and Z0 parts.
2217
int idAbs = abs(id1);
2218
double sigma = sigma0
2219
* ( couplingsPtr->ef2(idAbs) * gamProp * gamSum
2220
+ couplingsPtr->efvf(idAbs) * intProp * intSum
2221
+ couplingsPtr->vf2af2(idAbs) * resProp * resSum);
2223
// Correct for the running-width Z0 propagater weight in PhaseSpace.
2231
//--------------------------------------------------------------------------
2233
// Select identity, colour and anticolour.
2235
void Sigma2qqbar2gmZg::setIdColAcol() {
2237
// Flavours trivial.
2238
setId( id1, id2, 23, 21);
2240
// Colour flow topologies. Swap when antiquarks.
2241
setColAcol( 1, 0, 0, 2, 0, 0, 1, 2);
2242
if (id1 < 0) swapColAcol();
2246
//==========================================================================
2248
// Sigma2qg2gmZq class.
2249
// Cross section for q g -> gamma*/Z0 q.
2251
//--------------------------------------------------------------------------
2253
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
2255
void Sigma2qg2gmZq::sigmaKin() {
2257
// Cross section part common for all incoming flavours.
2258
sigma0 = (M_PI / sH2) * (alpEM * alpS)
2259
* (1./12.) * (sH2 + uH2 + 2. * tH * s3) / (-sH * uH);
2261
// Calculate flavour sums for final state.
2264
// Calculate prefactors for gamma/interference/Z0 cross section terms.
2269
//--------------------------------------------------------------------------
2271
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
2273
double Sigma2qg2gmZq::sigmaHat() {
2275
// Combine gamma, interference and Z0 parts.
2276
int idAbs = (id2 == 21) ? abs(id1) : abs(id2);
2277
double sigma = sigma0
2278
* ( couplingsPtr->ef2(idAbs) * gamProp * gamSum
2279
+ couplingsPtr->efvf(idAbs) * intProp * intSum
2280
+ couplingsPtr->vf2af2(idAbs) * resProp * resSum);
2282
// Correct for the running-width Z0 propagater weight in PhaseSpace.
2290
//--------------------------------------------------------------------------
2292
// Select identity, colour and anticolour.
2294
void Sigma2qg2gmZq::setIdColAcol() {
2296
// Flavour set up for q g -> gamma*/Z0 q.
2297
int idq = (id2 == 21) ? id1 : id2;
2298
setId( id1, id2, 23, idq);
2300
// tH defined between f and f': must swap tHat <-> uHat if q g in.
2301
swapTU = (id2 == 21);
2303
// Colour flow topologies. Swap when antiquarks.
2304
if (id2 == 21) setColAcol( 1, 0, 2, 1, 0, 0, 2, 0);
2305
else setColAcol( 2, 1, 1, 0, 0, 0, 2, 0);
2306
if (idq < 0) swapColAcol();
2310
//==========================================================================
2312
// Sigma2ffbar2gmZgm class.
2313
// Cross section for f fbar -> gamma*/Z0 gamma.
2315
//--------------------------------------------------------------------------
2317
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
2319
void Sigma2ffbar2gmZgm::sigmaKin() {
2321
// Cross section part common for all incoming flavours.
2322
sigma0 = (M_PI / sH2) * (alpEM*alpEM)
2323
* 0.5 * (tH2 + uH2 + 2. * sH * s3) / (tH * uH);
2325
// Calculate flavour sums for final state.
2328
// Calculate prefactors for gamma/interference/Z0 cross section terms.
2334
//--------------------------------------------------------------------------
2336
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
2338
double Sigma2ffbar2gmZgm::sigmaHat() {
2340
// Combine gamma, interference and Z0 parts.
2341
int idAbs = abs(id1);
2342
double sigma = sigma0 * couplingsPtr->ef2(idAbs)
2343
* ( couplingsPtr->ef2(idAbs) * gamProp * gamSum
2344
+ couplingsPtr->efvf(idAbs) * intProp * intSum
2345
+ couplingsPtr->vf2af2(idAbs) * resProp * resSum);
2347
// Correct for the running-width Z0 propagater weight in PhaseSpace.
2350
// Colour factor. Answer.
2351
if (idAbs < 9) sigma /= 3.;
2356
//--------------------------------------------------------------------------
2358
// Select identity, colour and anticolour.
2360
void Sigma2ffbar2gmZgm::setIdColAcol() {
2362
// Flavours trivial.
2363
setId( id1, id2, 23, 22);
2365
// Colour flow topologies. Swap when antiquarks.
2366
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
2367
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
2368
if (id1 < 0) swapColAcol();
2372
//==========================================================================
2374
// Sigma2fgm2gmZf class.
2375
// Cross section for f gamma -> gamma*/Z0 f'.
2377
//--------------------------------------------------------------------------
2379
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
2381
void Sigma2fgm2gmZf::sigmaKin() {
2383
// Cross section part common for all incoming flavours.
2384
sigma0 = (M_PI / sH2) * (alpEM*alpEM)
2385
* 0.5 * (sH2 + uH2 + 2. * tH * s3) / (- sH * uH);
2387
// Calculate flavour sums for final state.
2390
// Calculate prefactors for gamma/interference/Z0 cross section terms.
2395
//--------------------------------------------------------------------------
2397
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
2399
double Sigma2fgm2gmZf::sigmaHat() {
2401
// Combine gamma, interference and Z0 parts.
2402
int idAbs = (id2 == 22) ? abs(id1) : abs(id2);
2403
double sigma = sigma0 * couplingsPtr->ef2(idAbs)
2404
* ( couplingsPtr->ef2(idAbs) * gamProp * gamSum
2405
+ couplingsPtr->efvf(idAbs) * intProp * intSum
2406
+ couplingsPtr->vf2af2(idAbs) * resProp * resSum);
2408
// Correct for the running-width Z0 propagater weight in PhaseSpace.
2416
//--------------------------------------------------------------------------
2418
// Select identity, colour and anticolour.
2420
void Sigma2fgm2gmZf::setIdColAcol() {
2422
// Flavour set up for q gamma -> gamma*/Z0 q.
2423
int idq = (id2 == 22) ? id1 : id2;
2424
setId( id1, id2, 23, idq);
2426
// tH defined between f and f': must swap tHat <-> uHat if q gamma in.
2427
swapTU = (id2 == 22);
2429
// Colour flow topologies. Swap when antiquarks.
2430
if (abs(id1) < 9) setColAcol( 1, 0, 0, 0, 0, 0, 1, 0);
2431
else if (abs(id2) < 9) setColAcol( 0, 0, 1, 0, 0, 0, 1, 0);
2432
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
2433
if (idq < 0) swapColAcol();
2437
//==========================================================================
2439
// Sigma2ffbarWggm class.
2440
// Collects common methods for f fbar -> W+- g/gamma and permutations.
2442
//--------------------------------------------------------------------------
2444
// Evaluate weight for W+- decay angle.
2446
double Sigma2ffbarWggm::weightDecay( Event& process, int iResBeg,
2449
// W should sit in entry 5 and one more parton in entry 6.
2450
if (iResBeg != 5 || iResEnd != 6) return 1.;
2452
// In an outgoing sense fermions are labelled f(1) fbar(2) f'(3) fbar'(4)
2453
// where f' fbar' come from W+- decay.
2455
int i3 = (process[7].id() > 0) ? 7 : 8;
2458
// Order so that fbar(1) f(2) -> W+- g/gamma.
2459
if (process[3].idAbs() < 20 && process[4].idAbs() < 20) {
2460
i1 = (process[3].id() < 0) ? 3 : 4;
2463
// Order so that f(2)/fbar(1) g/gamma -> f(1)/fbar(2) f'(3) W+-.
2464
} else if (process[3].idAbs() < 20) {
2465
i1 = (process[3].id() < 0) ? 3 : 6;
2468
i1 = (process[4].id() < 0) ? 4 : 6;
2472
// Evaluate four-vector products.
2473
double p13 = process[i1].p() * process[i3].p();
2474
double p14 = process[i1].p() * process[i4].p();
2475
double p23 = process[i2].p() * process[i3].p();
2476
double p24 = process[i2].p() * process[i4].p();
2478
// Calculate weight and its maximum.
2479
double wt = pow2(p13) + pow2(p24);
2480
double wtMax = pow2(p13 + p14) + pow2(p23 + p24);
2483
return (wt / wtMax);
2487
//==========================================================================
2489
// Sigma2qqbar2Wg class.
2490
// Cross section for q qbar' -> W+- g.
2492
//--------------------------------------------------------------------------
2494
// Initialize process.
2496
void Sigma2qqbar2Wg::initProc() {
2498
// Secondary open width fractions, relevant for top (or heavier).
2499
openFracPos = particleDataPtr->resOpenFrac(24);
2500
openFracNeg = particleDataPtr->resOpenFrac(-24);
2504
//--------------------------------------------------------------------------
2506
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
2508
void Sigma2qqbar2Wg::sigmaKin() {
2510
// Cross section part common for all incoming flavours.
2511
sigma0 = (M_PI / sH2) * (alpEM * alpS / couplingsPtr->sin2thetaW())
2512
* (2./9.) * (tH2 + uH2 + 2. * sH * s3) / (tH * uH);
2516
//--------------------------------------------------------------------------
2518
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
2520
double Sigma2qqbar2Wg::sigmaHat() {
2522
// CKM factor. Secondary width for W+ or W-.
2523
double sigma = sigma0 * couplingsPtr->V2CKMid(abs(id1), abs(id2));
2524
int idUp = (abs(id1)%2 == 0) ? id1 : id2;
2525
sigma *= (idUp > 0) ? openFracPos : openFracNeg;
2532
//--------------------------------------------------------------------------
2534
// Select identity, colour and anticolour.
2536
void Sigma2qqbar2Wg::setIdColAcol() {
2538
// Sign of outgoing W.
2539
int sign = 1 - 2 * (abs(id1)%2);
2540
if (id1 < 0) sign = -sign;
2541
setId( id1, id2, 24 * sign, 21);
2543
// Colour flow topologies. Swap when antiquarks.
2544
setColAcol( 1, 0, 0, 2, 0, 0, 1, 2);
2545
if (id1 < 0) swapColAcol();
2549
//==========================================================================
2551
// Sigma2qg2Wq class.
2552
// Cross section for q g -> W+- q'.
2554
//--------------------------------------------------------------------------
2556
// Initialize process.
2558
void Sigma2qg2Wq::initProc() {
2560
// Secondary open width fractions, relevant for top (or heavier).
2561
openFracPos = particleDataPtr->resOpenFrac(24);
2562
openFracNeg = particleDataPtr->resOpenFrac(-24);
2566
//--------------------------------------------------------------------------
2568
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
2570
void Sigma2qg2Wq::sigmaKin() {
2572
// Cross section part common for all incoming flavours.
2573
sigma0 = (M_PI / sH2) * (alpEM * alpS / couplingsPtr->sin2thetaW())
2574
* (1./12.) * (sH2 + uH2 + 2. * tH * s3) / (-sH * uH);
2578
//--------------------------------------------------------------------------
2580
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
2582
double Sigma2qg2Wq::sigmaHat() {
2584
// CKM factor. Secondary width for W+ or W-.
2585
int idAbs = (id2 == 21) ? abs(id1) : abs(id2);
2586
double sigma = sigma0 * couplingsPtr->V2CKMsum(idAbs);
2587
int idUp = (id2 == 21) ? id1 : id2;
2588
if (idAbs%2 == 1) idUp = -idUp;
2589
sigma *= (idUp > 0) ? openFracPos : openFracNeg;
2596
//--------------------------------------------------------------------------
2598
// Select identity, colour and anticolour.
2600
void Sigma2qg2Wq::setIdColAcol() {
2602
// Sign of outgoing W. Flavour of outgoing quark.
2603
int idq = (id2 == 21) ? id1 : id2;
2604
int sign = 1 - 2 * (abs(idq)%2);
2605
if (idq < 0) sign = -sign;
2606
id4 = couplingsPtr->V2CKMpick(idq);
2608
// Flavour set up for q g -> W q.
2609
setId( id1, id2, 24 * sign, id4);
2611
// tH defined between f and f': must swap tHat <-> uHat if q g in.
2612
swapTU = (id2 == 21);
2614
// Colour flow topologies. Swap when antiquarks.
2615
if (id2 == 21) setColAcol( 1, 0, 2, 1, 0, 0, 2, 0);
2616
else setColAcol( 2, 1, 1, 0, 0, 0, 2, 0);
2617
if (idq < 0) swapColAcol();
2621
//==========================================================================
2623
// Sigma2ffbar2Wgm class.
2624
// Cross section for f fbar' -> W+- gamma.
2626
//--------------------------------------------------------------------------
2628
// Initialize process.
2630
void Sigma2ffbar2Wgm::initProc() {
2632
// Secondary open width fractions, relevant for top (or heavier).
2633
openFracPos = particleDataPtr->resOpenFrac(24);
2634
openFracNeg = particleDataPtr->resOpenFrac(-24);
2638
//--------------------------------------------------------------------------
2640
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
2642
void Sigma2ffbar2Wgm::sigmaKin() {
2644
// Cross section part common for all incoming flavours.
2645
sigma0 = (M_PI / sH2) * (alpEM*alpEM / couplingsPtr->sin2thetaW())
2646
* 0.5 * (tH2 + uH2 + 2. * sH * s3) / (tH * uH);
2649
//--------------------------------------------------------------------------
2651
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
2653
double Sigma2ffbar2Wgm::sigmaHat() {
2655
// Extrafactor different for e nu and q qbar' instate.
2656
int id1Abs = abs(id1);
2657
int id2Abs = abs(id2);
2658
double chgUp = (id1Abs > 10) ? 0. : 2./3.;
2659
double sigma = sigma0 * pow2( chgUp - tH / (tH + uH) );
2661
// CKM and colour factors. Secondary width for W+ or W-.
2662
if (id1Abs < 9) sigma *= couplingsPtr->V2CKMid(id1Abs, id2Abs) / 3.;
2663
int idUp = (abs(id1)%2 == 0) ? id1 : id2;
2664
sigma *= (idUp > 0) ? openFracPos : openFracNeg;
2671
//--------------------------------------------------------------------------
2673
// Select identity, colour and anticolour.
2675
void Sigma2ffbar2Wgm::setIdColAcol() {
2677
// Sign of outgoing W.
2678
int sign = 1 - 2 * (abs(id1)%2);
2679
if (id1 < 0) sign = -sign;
2680
setId( id1, id2, 24 * sign, 22);
2682
// tH defined between (f,W-) or (fbar',W+).
2683
swapTU = (sign * id1 > 0);
2685
// Colour flow topologies. Swap when antiquarks.
2686
if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
2687
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
2688
if (id1 < 0) swapColAcol();
2692
//==========================================================================
2694
// Sigma2fgm2Wf class.
2695
// Cross section for f gamma -> W+- f'.
2697
//--------------------------------------------------------------------------
2699
// Initialize process.
2701
void Sigma2fgm2Wf::initProc() {
2703
// Secondary open width fractions, relevant for top (or heavier).
2704
openFracPos = particleDataPtr->resOpenFrac(24);
2705
openFracNeg = particleDataPtr->resOpenFrac(-24);
2709
//--------------------------------------------------------------------------
2711
// Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
2713
void Sigma2fgm2Wf::sigmaKin() {
2715
// Cross section part common for all incoming flavours.
2716
sigma0 = (M_PI / sH2) * (alpEM*alpEM / couplingsPtr->sin2thetaW())
2717
* 0.5 * (sH2 + uH2 + 2. * tH * s3) / (pT2 * s3 - sH * uH);
2721
//--------------------------------------------------------------------------
2723
// Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
2725
double Sigma2fgm2Wf::sigmaHat() {
2727
// Extrafactor dependent on charge of incoming fermion.
2728
int idAbs = (id2 == 22) ? abs(id1) : abs(id2);
2729
double charge = (idAbs > 10) ? 1. : ( (idAbs%2 == 1) ? 1./3. : 2./3. );
2730
double sigma = sigma0 * pow2( charge - sH / (sH + uH) );
2732
// CKM factor. Secondary width for W+ or W-.
2733
sigma *= couplingsPtr->V2CKMsum(idAbs);
2734
int idUp = (id2 == 22) ? id1 : id2;
2735
if (idAbs%2 == 1) idUp = -idUp;
2736
sigma *= (idUp > 0) ? openFracPos : openFracNeg;
2743
//--------------------------------------------------------------------------
2745
// Select identity, colour and anticolour.
2747
void Sigma2fgm2Wf::setIdColAcol() {
2749
// Sign of outgoing W. Flavour of outgoing fermion.
2750
int idq = (id2 == 22) ? id1 : id2;
2751
int sign = 1 - 2 * (abs(idq)%2);
2752
if (idq < 0) sign = -sign;
2753
id4 = couplingsPtr->V2CKMpick(idq);
2755
// Flavour set up for q gamma -> W q.
2756
setId( id1, id2, 24 * sign, id4);
2758
// tH defined between f and f': must swap tHat <-> uHat if q gamma in.
2759
swapTU = (id2 == 22);
2761
// Colour flow topologies. Swap when antiquarks.
2762
if (abs(id1) < 9) setColAcol( 1, 0, 0, 0, 0, 0, 1, 0);
2763
else if (abs(id2) < 9) setColAcol( 0, 0, 1, 0, 0, 0, 1, 0);
2764
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
2765
if (idq < 0) swapColAcol();
2769
//==========================================================================
2771
// Sigma2gmgm2ffbar class.
2772
// Cross section for gamma gamma -> l lbar.
2774
//--------------------------------------------------------------------------
2776
// Initialize process wrt flavour.
2778
void Sigma2gmgm2ffbar::initProc() {
2781
nameSave = "gamma gamma -> f fbar";
2782
if (idNew == 1) nameSave = "gamma gamma -> q qbar (uds)";
2783
if (idNew == 4) nameSave = "gamma gamma -> c cbar";
2784
if (idNew == 5) nameSave = "gamma gamma -> b bbar";
2785
if (idNew == 6) nameSave = "gamma gamma -> t tbar";
2786
if (idNew == 11) nameSave = "gamma gamma -> e+ e-";
2787
if (idNew == 13) nameSave = "gamma gamma -> mu+ mu-";
2788
if (idNew == 15) nameSave = "gamma gamma -> tau+ tau-";
2790
// Generate massive phase space, except for u+d+s.
2792
if (idNew > 3) idMass = idNew;
2794
// Charge and colour factor.
2796
if (idNew == 1) ef4 = 3. * (pow4(2./3.) + 2. * pow4(1./3.));
2797
if (idNew == 4 || idNew == 6) ef4 = 3. * pow4(2./3.);
2798
if (idNew == 5) ef4 = 3. * pow4(1./3.);
2800
// Secondary open width fraction.
2801
openFracPair = particleDataPtr->resOpenFrac(idNew, -idNew);
2805
//--------------------------------------------------------------------------
2807
// Evaluate d(sigmaHat)/d(tHat) - no incoming flavour dependence.
2809
void Sigma2gmgm2ffbar::sigmaKin() {
2811
// Pick current flavour for u+d+s mix by e_q^4 weights.
2813
double rId = 18. * rndmPtr->flat();
2815
if (rId > 1.) idNow = 2;
2816
if (rId > 17.) idNow = 3;
2817
s34Avg = pow2(particleDataPtr->m0(idNow));
2820
s34Avg = 0.5 * (s3 + s4) - 0.25 * pow2(s3 - s4) / sH;
2823
// Modified Mandelstam variables for massive kinematics with m3 = m4.
2824
double tHQ = -0.5 * (sH - tH + uH);
2825
double uHQ = -0.5 * (sH + tH - uH);
2826
double tHQ2 = tHQ * tHQ;
2827
double uHQ2 = uHQ * uHQ;
2829
// Calculate kinematics dependence.
2830
if (sH < 4. * s34Avg) sigTU = 0.;
2831
else sigTU = 2. * (tHQ * uHQ - s34Avg * sH)
2832
* (tHQ2 + uHQ2 + 2. * s34Avg * sH) / (tHQ2 * uHQ2);
2835
sigma = (M_PI / sH2) * pow2(alpEM) * ef4 * sigTU * openFracPair;
2839
//--------------------------------------------------------------------------
2841
// Select identity, colour and anticolour.
2843
void Sigma2gmgm2ffbar::setIdColAcol() {
2845
// Flavours are trivial.
2846
setId( id1, id2, idNow, -idNow);
2848
// Colour flow in singlet state.
2849
if (idNow < 10) setColAcol( 0, 0, 0, 0, 1, 0, 0, 1);
2850
else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
2854
//==========================================================================
2856
} // end namespace Pythia8