StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
SigmaHiggs.cc
1 // SigmaHiggs.cc is a part of the PYTHIA event generator.
2 // Copyright (C) 2020 Torbjorn Sjostrand.
3 // Part of code written by Marc Montull, CERN summer student 2007.
4 // PYTHIA is licenced under the GNU GPL v2 or later, see COPYING for details.
5 // Please respect the MCnet Guidelines, see GUIDELINES for details.
6 // Function definitions (not found in the header) for the
7 // Higgs simulation classes.
8 
9 #include "Pythia8/SigmaHiggs.h"
10 
11 namespace Pythia8 {
12 
13 //==========================================================================
14 
15 // Sigma1ffbar2H class.
16 // Cross section for f fbar -> H0 , H1, H2 or A3.
17 // (f is quark or lepton, H0 SM Higgs and H1, H2, A3 BSM Higgses ).
18 
19 //--------------------------------------------------------------------------
20 
21 // Initialize process.
22 
23 void Sigma1ffbar2H::initProc() {
24 
25  // Properties specific to Higgs state.
26  if (higgsType == 0) {
27  nameSave = "f fbar -> H (SM)";
28  codeSave = 901;
29  idRes = 25;
30  }
31  else if (higgsType == 1) {
32  nameSave = "f fbar -> h0(H1)";
33  codeSave = 1001;
34  idRes = 25;
35  }
36  else if (higgsType == 2) {
37  nameSave = "f fbar -> H0(H2)";
38  codeSave = 1021;
39  idRes = 35;
40  }
41  else if (higgsType == 3) {
42  nameSave = "f fbar -> A0(A3)";
43  codeSave = 1041;
44  idRes = 36;
45  }
46 
47  // Find pointer to H0, H1, H2 or A3 depending on the value of idRes.
48  HResPtr = particleDataPtr->particleDataEntryPtr(idRes);
49 
50  // Store H0, H1, H2 or A3 mass and width for propagator.
51  mRes = HResPtr->m0();
52  GammaRes = HResPtr->mWidth();
53  m2Res = mRes*mRes;
54  GamMRat = GammaRes / mRes;
55 
56 }
57 
58 
59 //--------------------------------------------------------------------------
60 
61 // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
62 
63 void Sigma1ffbar2H::sigmaKin() {
64 
65  // Set up Breit-Wigner.
66  double width = HResPtr->resWidth(idRes, mH);
67  sigBW = 4. * M_PI/ ( pow2(sH - m2Res) + pow2(mH * width) );
68 
69  // Width out only includes open channels.
70  widthOut = width * HResPtr->resOpenFrac(idRes);
71 
72 }
73 
74 //--------------------------------------------------------------------------
75 
76 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
77 
78 double Sigma1ffbar2H::sigmaHat() {
79 
80  // Calculate mass-dependent incoming width, including colour factor.
81  int idAbs = abs(id1);
82  double widthIn = HResPtr->resWidthChan( mH, idAbs, -idAbs);
83  if (idAbs < 9) widthIn /= 9.;
84 
85  // Done.
86  return widthIn * sigBW * widthOut;
87 
88 }
89 
90 //--------------------------------------------------------------------------
91 
92 // Select identity, colour and anticolour.
93 
94 void Sigma1ffbar2H::setIdColAcol() {
95 
96  // Flavours trivial.
97  setId( id1, id2, idRes);
98 
99  // Colour flow topologies. Swap when antiquarks.
100  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
101  else setColAcol( 0, 0, 0, 0, 0, 0);
102  if (id1 < 0) swapColAcol();
103 
104 }
105 
106 //--------------------------------------------------------------------------
107 
108 // Evaluate weight for decay angles.
109 
110 double Sigma1ffbar2H::weightDecay( Event& process, int iResBeg,
111  int iResEnd) {
112 
113  // Identity of mother of decaying reseonance(s).
114  int idMother = process[process[iResBeg].mother1()].idAbs();
115 
116  // For Higgs decay hand over to standard routine.
117  if (idMother == 25 || idMother == 35 || idMother == 36)
118  return weightHiggsDecay( process, iResBeg, iResEnd);
119 
120  // For top decay hand over to standard routine.
121  if (idMother == 6)
122  return weightTopDecay( process, iResBeg, iResEnd);
123 
124  // Else done.
125  return 1.;
126 
127 }
128 
129 //==========================================================================
130 
131 // Sigma1gg2H class.
132 // Cross section for g g -> H0, H1, H2 or A3 (H0 SM Higgs, H1, H2, A3 BSM).
133 
134 //--------------------------------------------------------------------------
135 
136 // Initialize process.
137 
138 void Sigma1gg2H::initProc() {
139 
140  // Properties specific to Higgs state.
141  if (higgsType == 0) {
142  nameSave = "g g -> H (SM)";
143  codeSave = 902;
144  idRes = 25;
145  }
146  else if (higgsType == 1) {
147  nameSave = "g g -> h0(H1)";
148  codeSave = 1002;
149  idRes = 25;
150  }
151  else if (higgsType == 2) {
152  nameSave = "g g -> H0(H2)";
153  codeSave = 1022;
154  idRes = 35;
155  }
156  else if (higgsType == 3) {
157  nameSave = "g g -> A0(A3)";
158  codeSave = 1042;
159  idRes = 36;
160  }
161 
162  // Find pointer to H0, H1, H2 or A3 depending on idRes.
163  HResPtr = particleDataPtr->particleDataEntryPtr(idRes);
164 
165  // Store H0, H1, H2 or A3 mass and width for propagator.
166  mRes = HResPtr->m0();
167  GammaRes = HResPtr->mWidth();
168  m2Res = mRes*mRes;
169  GamMRat = GammaRes / mRes;
170 
171 }
172 
173 //--------------------------------------------------------------------------
174 
175 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
176 
177 void Sigma1gg2H::sigmaKin() {
178 
179  // Incoming width for gluons, gives colour factor of 1/8 * 1/8.
180  double widthIn = HResPtr->resWidthChan( mH, 21, 21) / 64.;
181 
182  // Set up Breit-Wigner.
183  double width = HResPtr->resWidth(idRes, mH);
184  double sigBW = 8. * M_PI/ ( pow2(sH - m2Res) + pow2(mH * width) );
185 
186  // Width out only includes open channels.
187  double widthOut = width * HResPtr->resOpenFrac(idRes);
188 
189  // Done.
190  sigma = widthIn * sigBW * widthOut;
191 
192 }
193 
194 //--------------------------------------------------------------------------
195 
196 // Select identity, colour and anticolour.
197 
198 void Sigma1gg2H::setIdColAcol() {
199 
200  // Flavours trivial.
201  setId( 21, 21, idRes);
202 
203  // Colour flow topology.
204  setColAcol( 1, 2, 2, 1, 0, 0);
205 
206 }
207 
208 //--------------------------------------------------------------------------
209 
210 // Evaluate weight for decay angles.
211 
212 double Sigma1gg2H::weightDecay( Event& process, int iResBeg,
213  int iResEnd) {
214 
215  // Identity of mother of decaying reseonance(s).
216  int idMother = process[process[iResBeg].mother1()].idAbs();
217 
218  // For Higgs decay hand over to standard routine.
219  if (idMother == 25 || idMother == 35 || idMother == 36)
220  return weightHiggsDecay( process, iResBeg, iResEnd);
221 
222  // For top decay hand over to standard routine.
223  if (idMother == 6)
224  return weightTopDecay( process, iResBeg, iResEnd);
225 
226  // Else done.
227  return 1.;
228 
229 }
230 
231 //==========================================================================
232 
233 // Sigma1gmgm2H class.
234 // Cross section for gamma gamma -> H0, H1, H2 or H3.
235 // (H0 SM Higgs, H1, H2 and A3 BSM Higgses).
236 
237 //--------------------------------------------------------------------------
238 
239 // Initialize process.
240 
241 void Sigma1gmgm2H::initProc() {
242 
243  // Properties specific to Higgs state.
244  if (higgsType == 0) {
245  nameSave = "gamma gamma -> H (SM)";
246  codeSave = 903;
247  idRes = 25;
248  }
249  else if (higgsType == 1) {
250  nameSave = "gamma gamma -> h0(H1)";
251  codeSave = 1003;
252  idRes = 25;
253  }
254  else if (higgsType == 2) {
255  nameSave = "gamma gamma -> H0(H2)";
256  codeSave = 1023;
257  idRes = 35;
258  }
259  else if (higgsType == 3) {
260  nameSave = "gamma gamma -> A0(A3)";
261  codeSave = 1043;
262  idRes = 36;
263  }
264 
265  // Find pointer to H0, H1, H2 or A3.
266  HResPtr = particleDataPtr->particleDataEntryPtr(idRes);
267 
268  // Store H0, H1, H2 or A3 mass and width for propagator.
269  mRes = HResPtr->m0();
270  GammaRes = HResPtr->mWidth();
271  m2Res = mRes*mRes;
272  GamMRat = GammaRes / mRes;
273 
274 }
275 
276 //--------------------------------------------------------------------------
277 
278 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
279 
280 void Sigma1gmgm2H::sigmaKin() {
281 
282  // Incoming width for photons.
283  double widthIn = HResPtr->resWidthChan( mH, 22, 22);
284 
285  // Set up Breit-Wigner.
286  double width = HResPtr->resWidth(idRes, mH);
287  double sigBW = 8. * M_PI/ ( pow2(sH - m2Res) + pow2(mH * width) );
288 
289  // Width out only includes open channels.
290  double widthOut = width * HResPtr->resOpenFrac(idRes);
291 
292  // Done.
293  sigma = widthIn * sigBW * widthOut;
294 
295 }
296 
297 //--------------------------------------------------------------------------
298 
299 // Select identity, colour and anticolour.
300 
301 void Sigma1gmgm2H::setIdColAcol() {
302 
303  // Flavours trivial.
304  setId( 22, 22, idRes);
305 
306  // Colour flow trivial.
307  setColAcol( 0, 0, 0, 0, 0, 0);
308 
309 }
310 
311 //--------------------------------------------------------------------------
312 
313 // Evaluate weight for decay angles.
314 
315 double Sigma1gmgm2H::weightDecay( Event& process, int iResBeg,
316  int iResEnd) {
317 
318  // Identity of mother of decaying reseonance(s).
319  int idMother = process[process[iResBeg].mother1()].idAbs();
320 
321  // For Higgs decay hand over to standard routine.
322  if (idMother == 25 || idMother == 35 || idMother == 36)
323  return weightHiggsDecay( process, iResBeg, iResEnd);
324 
325  // For top decay hand over to standard routine.
326  if (idMother == 6)
327  return weightTopDecay( process, iResBeg, iResEnd);
328 
329  // Else done.
330  return 1.;
331 
332 }
333 
334 //==========================================================================
335 
336 // Sigma2ffbar2HZ class.
337 // Cross section for f fbar -> H0 Z0, H1 Z0, H2 Z0 or A3 Z0.
338 // (H0 SM Higgs, H1, H2 and A3 BSM Higgses).
339 
340 //--------------------------------------------------------------------------
341 
342 // Initialize process.
343 
344 void Sigma2ffbar2HZ::initProc() {
345 
346  // Properties specific to Higgs state.
347  if (higgsType == 0) {
348  nameSave = "f fbar -> H0 Z0 (SM)";
349  codeSave = 904;
350  idRes = 25;
351  coup2Z = 1.;
352  }
353  else if (higgsType == 1) {
354  nameSave = "f fbar -> h0(H1) Z0";
355  codeSave = 1004;
356  idRes = 25;
357  coup2Z = parm("HiggsH1:coup2Z");
358  }
359  else if (higgsType == 2) {
360  nameSave = "f fbar -> H0(H2) Z0";
361  codeSave = 1024;
362  idRes = 35;
363  coup2Z = parm("HiggsH2:coup2Z");
364  }
365  else if (higgsType == 3) {
366  nameSave = "f fbar -> A0(A3) ZO";
367  codeSave = 1044;
368  idRes = 36;
369  coup2Z = parm("HiggsA3:coup2Z");
370  }
371 
372  // Store Z0 mass and width for propagator. Common coupling factor.
373  mZ = particleDataPtr->m0(23);
374  widZ = particleDataPtr->mWidth(23);
375  mZS = mZ*mZ;
376  mwZS = pow2(mZ * widZ);
377  thetaWRat = 1. / (16. * coupSMPtr->sin2thetaW()
378  * coupSMPtr->cos2thetaW());
379 
380  // Secondary open width fraction.
381  openFracPair = particleDataPtr->resOpenFrac(idRes, 23);
382 
383 }
384 
385 //--------------------------------------------------------------------------
386 
387 // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
388 
389 void Sigma2ffbar2HZ::sigmaKin() {
390 
391  // Evaluate differential cross section.
392  sigma0 = (M_PI / sH2) * 8. * pow2(alpEM * thetaWRat * coup2Z)
393  * (tH * uH - s3 * s4 + 2. * sH * s4) / (pow2(sH - mZS) + mwZS);
394 
395 }
396 
397 //--------------------------------------------------------------------------
398 
399 // Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
400 
401 double Sigma2ffbar2HZ::sigmaHat() {
402 
403  // Coupling a_f^2 + v_f^2 to s-channel Z0 and colour factor.
404  int idAbs = abs(id1);
405  double sigma = sigma0 * coupSMPtr->vf2af2(idAbs);
406  if (idAbs < 9) sigma /= 3.;
407 
408  // Secondary width for H0 and Z0 or H1 and Z0 or H2 and Z0 or A3 and Z0.
409  sigma *= openFracPair;
410 
411  // Answer.
412  return sigma;
413 
414 }
415 
416 //--------------------------------------------------------------------------
417 
418 // Select identity, colour and anticolour.
419 
420 void Sigma2ffbar2HZ::setIdColAcol() {
421 
422  // Flavours trivial.
423  setId( id1, id2, idRes, 23);
424 
425  // Colour flow topologies. Swap when antiquarks.
426  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
427  else setColAcol( 0, 0, 0, 0, 0, 0);
428  if (id1 < 0) swapColAcol();
429 
430 }
431 
432 //--------------------------------------------------------------------------
433 
434 // Evaluate weight for decay angles.
435 
436 double Sigma2ffbar2HZ::weightDecay( Event& process, int iResBeg,
437  int iResEnd) {
438 
439  // Identity of mother of decaying reseonance(s).
440  int idMother = process[process[iResBeg].mother1()].idAbs();
441 
442  // For Higgs decay hand over to standard routine.
443  if (idMother == 25 || idMother == 35 || idMother == 36)
444  return weightHiggsDecay( process, iResBeg, iResEnd);
445 
446  // For top decay hand over to standard routine.
447  if (idMother == 6)
448  return weightTopDecay( process, iResBeg, iResEnd);
449 
450  // If not decay of Z0 created along with Higgs then done.
451  if (iResBeg != 5 || iResEnd != 6) return 1.;
452 
453  // Order so that fbar(1) f(2) -> H() f'(3) fbar'(4).
454  int i1 = (process[3].id() < 0) ? 3 : 4;
455  int i2 = 7 - i1;
456  int i3 = process[6].daughter1();
457  int i4 = process[6].daughter2();
458  if (process[i3].id() < 0) swap( i3, i4);
459 
460  // Find left- and righthanded couplings of fermion pairs.
461  int idAbs = process[i1].idAbs();
462  double liS = pow2( coupSMPtr->lf(idAbs) );
463  double riS = pow2( coupSMPtr->rf(idAbs) );
464  idAbs = process[i3].idAbs();
465  double lfS = pow2( coupSMPtr->lf(idAbs) );
466  double rfS = pow2( coupSMPtr->rf(idAbs) );
467 
468  // Evaluate relevant four-products.
469  double pp13 = process[i1].p() * process[i3].p();
470  double pp14 = process[i1].p() * process[i4].p();
471  double pp23 = process[i2].p() * process[i3].p();
472  double pp24 = process[i2].p() * process[i4].p();
473 
474  // Weight and maximum.
475  double wt = (liS * lfS + riS * rfS) * pp13 * pp24
476  + (liS * rfS + riS * lfS) * pp14 * pp23;
477  double wtMax = (liS + riS) * (lfS + rfS) * (pp13 + pp14) * (pp23 + pp24);
478 
479  // Done.
480  return wt / wtMax;
481 
482 }
483 
484 //==========================================================================
485 
486 // Sigma2ffbar2HW class.
487 // Cross section for f fbar -> H0 W+-, H1 W+-, H2 W+- or A3 W+-.
488 // (H0 SM Higgs, H1, H2 and A3 BSM Higgses).
489 
490 //--------------------------------------------------------------------------
491 
492 // Initialize process.
493 
494 void Sigma2ffbar2HW::initProc() {
495 
496  // Properties specific to Higgs state.
497  if (higgsType == 0) {
498  nameSave = "f fbar -> H0 W+- (SM)";
499  codeSave = 905;
500  idRes = 25;
501  coup2W = 1.;
502  }
503  else if (higgsType == 1) {
504  nameSave = "f fbar -> h0(H1) W+-";
505  codeSave = 1005;
506  idRes = 25;
507  coup2W = parm("HiggsH1:coup2W");
508  }
509  else if (higgsType == 2) {
510  nameSave = "f fbar -> H0(H2) W+-";
511  codeSave = 1025;
512  idRes = 35;
513  coup2W = parm("HiggsH2:coup2W");
514  }
515  else if (higgsType == 3) {
516  nameSave = "f fbar -> A0(A3) W+-";
517  codeSave = 1045;
518  idRes = 36;
519  coup2W = parm("HiggsA3:coup2W");
520  }
521 
522  // Store W+- mass and width for propagator. Common coupling factor.
523  mW = particleDataPtr->m0(24);
524  widW = particleDataPtr->mWidth(24);
525  mWS = mW*mW;
526  mwWS = pow2(mW * widW);
527  thetaWRat = 1. / (4. * coupSMPtr->sin2thetaW());
528 
529  // Secondary open width fractions.
530  openFracPairPos = particleDataPtr->resOpenFrac(idRes, 24);
531  openFracPairNeg = particleDataPtr->resOpenFrac(idRes, -24);
532 
533 }
534 
535 //--------------------------------------------------------------------------
536 
537 // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
538 
539 void Sigma2ffbar2HW::sigmaKin() {
540 
541  // Evaluate differential cross section.
542  sigma0 = (M_PI / sH2) * 2. * pow2(alpEM * thetaWRat * coup2W)
543  * (tH * uH - s3 * s4 + 2. * sH * s4) / (pow2(sH - mWS) + mwWS);
544 
545 }
546 
547 //--------------------------------------------------------------------------
548 
549 // Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
550 
551 double Sigma2ffbar2HW::sigmaHat() {
552 
553  // CKM and colour factors.
554  double sigma = sigma0;
555  if (abs(id1) < 9) sigma *= coupSMPtr->V2CKMid(abs(id1), abs(id2)) / 3.;
556 
557  // Secondary width for H0 and W+-.
558  int idUp = (abs(id1)%2 == 0) ? id1 : id2;
559  sigma *= (idUp > 0) ? openFracPairPos : openFracPairNeg;
560 
561  // Answer.
562  return sigma;
563 
564 }
565 
566 //--------------------------------------------------------------------------
567 
568 // Select identity, colour and anticolour.
569 
570 void Sigma2ffbar2HW::setIdColAcol() {
571 
572  // Sign of outgoing W.
573  int sign = 1 - 2 * (abs(id1)%2);
574  if (id1 < 0) sign = -sign;
575  setId( id1, id2, idRes, 24 * sign);
576 
577  // Colour flow topologies. Swap when antiquarks.
578  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
579  else setColAcol( 0, 0, 0, 0, 0, 0);
580  if (id1 < 0) swapColAcol();
581 
582 }
583 
584 //--------------------------------------------------------------------------
585 
586 // Evaluate weight for decay angles.
587 
588 double Sigma2ffbar2HW::weightDecay( Event& process, int iResBeg,
589  int iResEnd) {
590 
591  // Identity of mother of decaying reseonance(s).
592  int idMother = process[process[iResBeg].mother1()].idAbs();
593 
594  // For Higgs decay hand over to standard routine.
595  if (idMother == 25 || idMother == 35 || idMother == 36)
596  return weightHiggsDecay( process, iResBeg, iResEnd);
597 
598  // For top decay hand over to standard routine.
599  if (idMother == 6)
600  return weightTopDecay( process, iResBeg, iResEnd);
601 
602  // If not decay of W+- created along with Higgs then done.
603  if (iResBeg != 5 || iResEnd != 6) return 1.;
604 
605  // Order so that fbar(1) f(2) -> H() f'(3) fbar'(4).
606  int i1 = (process[3].id() < 0) ? 3 : 4;
607  int i2 = 7 - i1;
608  int i3 = process[6].daughter1();
609  int i4 = process[6].daughter2();
610  if (process[i3].id() < 0) swap( i3, i4);
611 
612  // Evaluate relevant four-products.
613  double pp13 = process[i1].p() * process[i3].p();
614  double pp14 = process[i1].p() * process[i4].p();
615  double pp23 = process[i2].p() * process[i3].p();
616  double pp24 = process[i2].p() * process[i4].p();
617 
618  // Weight and maximum.
619  double wt = pp13 * pp24;
620  double wtMax = (pp13 + pp14) * (pp23 + pp24);
621 
622  // Done.
623  return wt / wtMax;
624 
625 }
626 
627 //==========================================================================
628 
629 // Sigma3ff2HfftZZ class.
630 // Cross section for f f' -> H f f' (Z0 Z0 fusion of SM or BSM Higgs).
631 // (H can be H0 SM or H1, H2, A3 from BSM).
632 
633 //--------------------------------------------------------------------------
634 
635 // Initialize process.
636 
637 void Sigma3ff2HfftZZ::initProc() {
638 
639  // Properties specific to Higgs state.
640  if (higgsType == 0) {
641  nameSave = "f f' -> H0 f f'(Z0 Z0 fusion) (SM)";
642  codeSave = 906;
643  idRes = 25;
644  coup2Z = 1.;
645  }
646  else if (higgsType == 1) {
647  nameSave = "f f' -> h0(H1) f f' (Z0 Z0 fusion)";
648  codeSave = 1006;
649  idRes = 25;
650  coup2Z = parm("HiggsH1:coup2Z");
651  }
652  else if (higgsType == 2) {
653  nameSave = "f f' -> H0(H2) f f' (Z0 Z0 fusion)";
654  codeSave = 1026;
655  idRes = 35;
656  coup2Z = parm("HiggsH2:coup2Z");
657  }
658  else if (higgsType == 3) {
659  nameSave = "f f' -> A0(A3) f f' (Z0 Z0 fusion)";
660  codeSave = 1046;
661  idRes = 36;
662  coup2Z = parm("HiggsA3:coup2Z");
663  }
664 
665  // Common fixed mass and coupling factor.
666  mZS = pow2( particleDataPtr->m0(23) );
667  prefac = 0.25 * mZS * pow3( 4. * M_PI / (coupSMPtr->sin2thetaW()
668  * coupSMPtr->cos2thetaW()) );
669 
670  // Secondary open width fraction.
671  openFrac = particleDataPtr->resOpenFrac(idRes);
672 
673 }
674 
675 //--------------------------------------------------------------------------
676 
677 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
678 
679 void Sigma3ff2HfftZZ::sigmaKin() {
680 
681  // Required four-vector products.
682  double pp12 = 0.5 * sH;
683  double pp14 = 0.5 * mH * p4cm.pNeg();
684  double pp15 = 0.5 * mH * p5cm.pNeg();
685  double pp24 = 0.5 * mH * p4cm.pPos();
686  double pp25 = 0.5 * mH * p5cm.pPos();
687  double pp45 = p4cm * p5cm;
688 
689  // Propagator factors and two possible numerators.
690  double prop = pow2( (2. * pp14 + mZS) * (2. * pp25 + mZS) );
691  sigma1 = prefac * pp12 * pp45 / prop;
692  sigma2 = prefac * pp15 * pp24 / prop;
693 
694 }
695 
696 //--------------------------------------------------------------------------
697 
698 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
699 
700 double Sigma3ff2HfftZZ::sigmaHat() {
701 
702  // Flavour-dependent coupling factors for two incoming flavours.
703  int id1Abs = abs(id1);
704  int id2Abs = abs(id2);
705  double lf1S = pow2( coupSMPtr->lf(id1Abs) );
706  double rf1S = pow2( coupSMPtr->rf(id1Abs) );
707  double lf2S = pow2( coupSMPtr->lf(id2Abs) );
708  double rf2S = pow2( coupSMPtr->rf(id2Abs) );
709  double c1 = lf1S * lf2S + rf1S * rf2S;
710  double c2 = lf1S * rf2S + rf1S * lf2S;
711 
712  // Combine couplings and kinematics factors.
713  double sigma = pow3(alpEM) * (c1 * sigma1 + c2 * sigma2) * pow2(coup2Z);
714 
715  // Secondary width for H0, H1, H2 or A3.
716  sigma *= openFrac;
717 
718  // Answer.
719  return sigma;
720 
721 }
722 
723 //--------------------------------------------------------------------------
724 
725 // Select identity, colour and anticolour.
726 
727 void Sigma3ff2HfftZZ::setIdColAcol() {
728 
729  // Trivial flavours: out = in.
730  setId( id1, id2, idRes, id1, id2);
731 
732  // Colour flow topologies. Swap when antiquarks.
733  if (abs(id1) < 9 && abs(id2) < 9 && id1*id2 > 0)
734  setColAcol( 1, 0, 2, 0, 0, 0, 1, 0, 2, 0);
735  else if (abs(id1) < 9 && abs(id2) < 9)
736  setColAcol( 1, 0, 0, 2, 0, 0, 1, 0, 0, 2);
737  else if (abs(id1) < 9) setColAcol( 1, 0, 0, 0, 0, 0, 1, 0, 0, 0);
738  else if (abs(id2) < 9) setColAcol( 0, 0, 1, 0, 0, 0, 0, 0, 1, 0);
739  else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
740  if ( (abs(id1) < 9 && id1 < 0) || (abs(id1) > 10 && id2 < 0) )
741  swapColAcol();
742 
743 }
744 
745 //--------------------------------------------------------------------------
746 
747 // Evaluate weight for decay angles.
748 
749 double Sigma3ff2HfftZZ::weightDecay( Event& process, int iResBeg,
750  int iResEnd) {
751 
752  // Identity of mother of decaying reseonance(s).
753  int idMother = process[process[iResBeg].mother1()].idAbs();
754 
755  // For Higgs decay hand over to standard routine.
756  if (idMother == 25 || idMother == 35 || idMother == 36)
757  return weightHiggsDecay( process, iResBeg, iResEnd);
758 
759  // For top decay hand over to standard routine.
760  if (idMother == 6)
761  return weightTopDecay( process, iResBeg, iResEnd);
762 
763  // Else done.
764  return 1.;
765 
766 }
767 
768 //==========================================================================
769 
770 // Sigma3ff2HfftWW class.
771 // Cross section for f_1 f_2 -> H0 f_3 f_4 (W+ W- fusion of SM or BSM Higgs).
772 
773 //--------------------------------------------------------------------------
774 
775 // Initialize process.
776 
777 void Sigma3ff2HfftWW::initProc() {
778 
779  // Properties specific to Higgs state.
780  if (higgsType == 0) {
781  nameSave = "f_1 f_2 -> H0 f_3 f_4 (W+ W- fusion) (SM)";
782  codeSave = 907;
783  idRes = 25;
784  coup2W = 1.;
785  }
786  else if (higgsType == 1) {
787  nameSave = "f_1 f_2 -> h0(H1) f_3 f_4 (W+ W- fusion)";
788  codeSave = 1007;
789  idRes = 25;
790  coup2W = parm("HiggsH1:coup2W");
791  }
792  else if (higgsType == 2) {
793  nameSave = "f_1 f_2 -> H0(H2) f_3 f_4 (W+ W- fusion)";
794  codeSave = 1027;
795  idRes = 35;
796  coup2W = parm("HiggsH2:coup2W");
797  }
798  else if (higgsType == 3) {
799  nameSave = "f_1 f_2 -> A0(A3) f_3 f_4 (W+ W- fusion)";
800  codeSave = 1047;
801  idRes = 36;
802  coup2W = parm("HiggsA3:coup2W");
803  }
804 
805  // Common fixed mass and coupling factor.
806  mWS = pow2( particleDataPtr->m0(24) );
807  prefac = mWS * pow3( 4. * M_PI / coupSMPtr->sin2thetaW() );
808 
809  // Secondary open width fraction.
810  openFrac = particleDataPtr->resOpenFrac(idRes);
811 
812 }
813 
814 //--------------------------------------------------------------------------
815 
816 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
817 
818 void Sigma3ff2HfftWW::sigmaKin() {
819 
820  // Required four-vector products.
821  double pp12 = 0.5 * sH;
822  double pp14 = 0.5 * mH * p4cm.pNeg();
823  double pp25 = 0.5 * mH * p5cm.pPos();
824  double pp45 = p4cm * p5cm;
825 
826  // Cross section: kinematics part. Combine with couplings.
827  double prop = pow2( (2. * pp14 + mWS) * (2. * pp25 + mWS) );
828  sigma0 = prefac * pp12 * pp45 * pow2(coup2W) / prop;
829 
830 }
831 
832 //--------------------------------------------------------------------------
833 
834 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
835 
836 double Sigma3ff2HfftWW::sigmaHat() {
837 
838  // Some flavour combinations not possible.
839  int id1Abs = abs(id1);
840  int id2Abs = abs(id2);
841  if ( (id1Abs%2 == id2Abs%2 && id1 * id2 > 0)
842  || (id1Abs%2 != id2Abs%2 && id1 * id2 < 0) ) return 0.;
843 
844  // Basic cross section. CKM factors for final states.
845  double sigma = sigma0 * pow3(alpEM) * coupSMPtr->V2CKMsum(id1Abs)
846  * coupSMPtr->V2CKMsum(id2Abs);
847 
848  // Secondary width for H0, H1, H2 or A3.
849  sigma *= openFrac;
850 
851  // Spin-state extra factor 2 per incoming neutrino.
852  if (id1Abs == 12 || id1Abs == 14 || id1Abs == 16) sigma *= 2.;
853  if (id2Abs == 12 || id2Abs == 14 || id2Abs == 16) sigma *= 2.;
854 
855  // Answer.
856  return sigma;
857 
858 }
859 
860 //--------------------------------------------------------------------------
861 
862 // Select identity, colour and anticolour.
863 
864 void Sigma3ff2HfftWW::setIdColAcol() {
865 
866  // Pick out-flavours by relative CKM weights.
867  id4 = coupSMPtr->V2CKMpick(id1);
868  id5 = coupSMPtr->V2CKMpick(id2);
869  setId( id1, id2, idRes, id4, id5);
870 
871  // Colour flow topologies. Swap when antiquarks.
872  if (abs(id1) < 9 && abs(id2) < 9 && id1*id2 > 0)
873  setColAcol( 1, 0, 2, 0, 0, 0, 1, 0, 2, 0);
874  else if (abs(id1) < 9 && abs(id2) < 9)
875  setColAcol( 1, 0, 0, 2, 0, 0, 1, 0, 0, 2);
876  else if (abs(id1) < 9) setColAcol( 1, 0, 0, 0, 0, 0, 1, 0, 0, 0);
877  else if (abs(id2) < 9) setColAcol( 0, 0, 1, 0, 0, 0, 0, 0, 1, 0);
878  else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
879  if ( (abs(id1) < 9 && id1 < 0) || (abs(id1) > 10 && id2 < 0) )
880  swapColAcol();
881 
882 }
883 
884 //--------------------------------------------------------------------------
885 
886 // Evaluate weight for decay angles.
887 
888 double Sigma3ff2HfftWW::weightDecay( Event& process, int iResBeg,
889  int iResEnd) {
890 
891  // Identity of mother of decaying reseonance(s).
892  int idMother = process[process[iResBeg].mother1()].idAbs();
893 
894  // For Higgs decay hand over to standard routine.
895  if (idMother == 25 || idMother == 35 || idMother == 36)
896  return weightHiggsDecay( process, iResBeg, iResEnd);
897 
898  // For top decay hand over to standard routine.
899  if (idMother == 6)
900  return weightTopDecay( process, iResBeg, iResEnd);
901 
902  // Else done.
903  return 1.;
904 
905 }
906 
907 //==========================================================================
908 
909 // Sigma3gg2HQQbar class.
910 // Cross section for g g -> H0 Q Qbar (Q Qbar fusion of SM or BSM Higgs).
911 // REDUCE output and part of the rest courtesy Z. Kunszt,
912 // see Z. Kunszt, Nucl. Phys. B247 (1984) 339.
913 
914 //--------------------------------------------------------------------------
915 
916 // Initialize process.
917 
918 void Sigma3gg2HQQbar::initProc() {
919 
920  // Properties specific to Higgs state for the "g g -> H ttbar" process.
921  // (H can be H0 SM or H1, H2, A3 from BSM).
922  if (higgsType == 0 && idNew == 6) {
923  nameSave = "g g -> H t tbar (SM)";
924  codeSave = 908;
925  idRes = 25;
926  coup2Q = 1.;
927  }
928  else if (higgsType == 1 && idNew == 6) {
929  nameSave = "g g -> h0(H1) t tbar";
930  codeSave = 1008;
931  idRes = 25;
932  coup2Q = parm("HiggsH1:coup2u");
933  }
934  else if (higgsType == 2 && idNew == 6) {
935  nameSave = "g g -> H0(H2) t tbar";
936  codeSave = 1028;
937  idRes = 35;
938  coup2Q = parm("HiggsH2:coup2u");
939  }
940  else if (higgsType == 3 && idNew == 6) {
941  nameSave = "g g -> A0(A3) t tbar";
942  codeSave = 1048;
943  idRes = 36;
944  coup2Q = parm("HiggsA3:coup2u");
945  }
946 
947  // Properties specific to Higgs state for the "g g -> H b bbar" process.
948  // (H can be H0 SM or H1, H2, A3 from BSM).
949  if (higgsType == 0 && idNew == 5) {
950  nameSave = "g g -> H b bbar (SM)";
951  codeSave = 912;
952  idRes = 25;
953  coup2Q = 1.;
954  }
955  else if (higgsType == 1 && idNew == 5) {
956  nameSave = "g g -> h0(H1) b bbar";
957  codeSave = 1012;
958  idRes = 25;
959  coup2Q = parm("HiggsH1:coup2d");
960  }
961  else if (higgsType == 2 && idNew == 5) {
962  nameSave = "g g -> H0(H2) b bbar";
963  codeSave = 1032;
964  idRes = 35;
965  coup2Q = parm("HiggsH2:coup2d");
966  }
967  else if (higgsType == 3 && idNew == 5) {
968  nameSave = "g g -> A0(A3) b bbar";
969  codeSave = 1052;
970  idRes = 36;
971  coup2Q = parm("HiggsA3:coup2d");
972  }
973 
974  // Common mass and coupling factors.
975  double mWS = pow2(particleDataPtr->m0(24));
976  prefac = (4. * M_PI / coupSMPtr->sin2thetaW()) * pow2(4. * M_PI)
977  * 0.25 / mWS;
978 
979  // Secondary open width fraction.
980  openFracTriplet = particleDataPtr->resOpenFrac(idRes, idNew, -idNew);
981 
982 }
983 
984 //--------------------------------------------------------------------------
985 
986 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
987 
988 void Sigma3gg2HQQbar::sigmaKin() {
989 
990  // Running mass of heavy quark.
991  double mQ2run = pow2( particleDataPtr->mRun(idNew, mH) );
992 
993  // Linear combination of p_Q and p_Qbar to ensure common mass.
994  double mQ2 = m4 * m5;
995  double epsi = 0.;
996  if (m4 != m5) {
997  double s45 = (p4cm + p5cm).m2Calc();
998  mQ2 = 0.5 * (s4 + s5) - 0.25 * pow2(s4 - s5) / s45;
999  epsi = 0.5 * (s5 - s4) / s45;
1000  }
1001 
1002  // Set up kinematics: g(4) g(5) -> H(3) Q(1) Qbar(2) in outgoing sense.
1003  Vec4 pTemp[6];
1004  pTemp[4] = Vec4( 0., 0., -0.5* mH, -0.5* mH);
1005  pTemp[5] = Vec4( 0., 0., 0.5* mH, -0.5* mH);
1006  pTemp[1] = p4cm + epsi * (p4cm + p5cm);
1007  pTemp[2] = p5cm - epsi * (p4cm + p5cm);
1008  pTemp[3] = p3cm;
1009 
1010  // Four-product combinations.
1011  double z1 = pTemp[1] * pTemp[2];
1012  double z2 = pTemp[1] * pTemp[3];
1013  double z3 = pTemp[1] * pTemp[4];
1014  double z4 = pTemp[1] * pTemp[5];
1015  double z5 = pTemp[2] * pTemp[3];
1016  double z6 = pTemp[2] * pTemp[4];
1017  double z7 = pTemp[2] * pTemp[5];
1018  double z8 = pTemp[3] * pTemp[4];
1019  double z9 = pTemp[3] * pTemp[5];
1020  double z10 = pTemp[4] * pTemp[5];
1021 
1022  // Powers required as shorthand in matriz elements.
1023  double mQ4 = mQ2 * mQ2;
1024  double mQ6 = mQ2 * mQ4;
1025  double z1S = z1 * z1;
1026  double z2S = z2 * z2;
1027  double z3S = z3 * z3;
1028  double z4S = z4 * z4;
1029  double z5S = z5 * z5;
1030  double z6S = z6 * z6;
1031  double z7S = z7 * z7;
1032  double z8S = z8 * z8;
1033  double z9S = z9 * z9;
1034  double z10S = z10 * z10;
1035 
1036  // Evaluate matriz elements for g + g -> Q + Qbar + H.
1037  // (H can be H0 SM or H1, H2, A3 from BSM).
1038  double fm[9][9];
1039  fm[1][1] = 64*mQ6+16*mQ4*s3+32*mQ4*(z1+2*z2+z4+z9+2*
1040  z7+z5)+8*mQ2*s3*(-z1-z4+2*z7)+16*mQ2*(z2*z9+4*z2*
1041  z7+z2*z5-2*z4*z7-2*z9*z7)+8*s3*z4*z7-16*z2*z9*z7;
1042  fm[1][2] = 16*mQ6+8*mQ4*(-2*z1+z2-2*z3-2*z4-4*z10+z9-z8+2
1043  *z7-4*z6+z5)+8*mQ2*(-2*z1*z2-2*z2*z4-2*z2*z10+z2*z7-2*
1044  z2*z6-2*z3*z7+2*z4*z7+4*z10*z7-z9*z7-z8*z7)+16*z2*z7*(z4+
1045  z10);
1046  fm[1][3] = 16*mQ6-4*mQ4*s3+8*mQ4*(-2*z1+2*z2-2*z3-4*
1047  z4-8*z10+z9+z8-2*z7-4*z6+2*z5)-(4*mQ2*s3)*(z1+z4+z10
1048  +z6)+8*mQ2*(-2*z1*z2-2*z1*z10+z1*z9+z1*z8-2*z1*z5+z2S
1049  -4*z2*z4-5*z2*z10+z2*z8-z2*z7-3*z2*z6+z2*z5+z3*z9+2*z3*z7
1050  -z3*z5+z4*z8+2*z4*z6-3*z4*z5-5*z10*z5+z9*z8+z9*z6+z9*z5+
1051  z8*z7-4*z6*z5+z5S)-(16*z2*z5)*(z1+z4+z10+z6);
1052  fm[1][4] = 16*mQ6+4*mQ4*s3+16*mQ4*(-z1+z2-z3-z4+z10-
1053  z9-z8+2*z7+2*z6-z5)+4*mQ2*s3*(z1+z3+z4+z10+2*z7+2*z6
1054  )+8*mQ2*(4*z1*z10+4*z1*z7+4*z1*z6+2*z2*z10-z2*z9-z2*z8+
1055  4*z2*z7+4*z2*z6-z2*z5+4*z10*z5+4*z7*z5+4*z6*z5)-(8*s3*
1056  z1)*(z10+z7+z6)+16*z2*z5*(z10+z7+z6);
1057  fm[1][5] = 8*mQ4*(-2*z1-2*z4+z10-z9)+4*mQ2*(4*z1S-2*z1*
1058  z2+8*z1*z3+6*z1*z10-2*z1*z9+4*z1*z8+4*z1*z7+4*z1*z6+2*z1*
1059  z5+z2*z10+4*z3*z4-z3*z9+2*z3*z7+3*z4*z8-2*z4*z6+2*z4*z5-4
1060  *z10*z7+3*z10*z5-3*z9*z6+3*z8*z7-4*z7S+4*z7*z5)+8*(z1S
1061  *z9-z1S*z8-z1*z2*z7+z1*z2*z6+z1*z3*z9+z1*z3*z5-z1*z4*
1062  z8-z1*z4*z5+z1*z10*z9+z1*z9*z7+z1*z9*z6-z1*z8*z7-z2*z3*z7
1063  +z2*z4*z6-z2*z10*z7-z2*z7S+z3*z7*z5-z4*z10*z5-z4*z7*z5-
1064  z4*z6*z5);
1065  fm[1][6] = 16*mQ4*(-4*z1-z4+z9-z7)+4*mQ2*s3*(-2*z1-z4-
1066  z7)+16*mQ2*(-2*z1S-3*z1*z2-2*z1*z4-3*z1*z9-2*z1*z7-3*
1067  z1*z5-2*z2*z4-2*z7*z5)-8*s3*z4*z7+8*(-z1*z2*z9-2*z1*z2
1068  *z5-z1*z9S-z1*z9*z5+z2S*z7-z2*z4*z5+z2*z9*z7-z2*z7*z5
1069  +z4*z9*z5+z4*z5S);
1070  fm[1][7] = 8*mQ4*(2*z3+z4+3*z10+z9+2*z8+3*z7+6*z6)+2*mQ2*
1071  s3*(-2*z3-z4+3*z10+3*z7+6*z6)+4*mQ2*(4*z1*z10+4*z1*
1072  z7+8*z1*z6+6*z2*z10+z2*z9+2*z2*z8+6*z2*z7+12*z2*z6-8*z3*
1073  z7+4*z4*z7+4*z4*z6+4*z10*z5+4*z9*z7+4*z9*z6-8*z8*z7+4*z7*
1074  z5+8*z6*z5)+4*s3*(-z1*z10-z1*z7-2*z1*z6+2*z3*z7-z4*z7-
1075  z4*z6)+8*z2*(z10*z5+z9*z7+z9*z6-2*z8*z7+z7*z5+2*z6*z5);
1076  fm[1][8] = 8*mQ4*(2*z3+z4+3*z10+2*z9+z8+3*z7+6*z6)+2*mQ2*
1077  s3*(-2*z3-z4+2*z10+z7+2*z6)+4*mQ2*(4*z1*z10-2*z1*z9+
1078  2*z1*z8+4*z1*z7+8*z1*z6+5*z2*z10+2*z2*z9+z2*z8+4*z2*z7+8*
1079  z2*z6-z3*z9-8*z3*z7+2*z3*z5+2*z4*z9-z4*z8+4*z4*z7+4*z4*z6
1080  +4*z4*z5+5*z10*z5+z9S-z9*z8+2*z9*z7+5*z9*z6+z9*z5-7*z8*
1081  z7+2*z8*z5+2*z7*z5+10*z6*z5)+2*s3*(-z1*z10+z3*z7-2*z4*
1082  z7+z4*z6)+4*(-z1*z9S+z1*z9*z8-2*z1*z9*z5-z1*z8*z5+2*z2*
1083  z10*z5+z2*z9*z7+z2*z9*z6-2*z2*z8*z7+3*z2*z6*z5+z3*z9*z5+
1084  z3*z5S+z4*z9*z5-2*z4*z8*z5+2*z4*z5S);
1085  fm[2][2] = 16*mQ6+16*mQ4*(-z1+z3-z4-z10+z7-z6)+16*mQ2*(
1086  z3*z10+z3*z7+z3*z6+z4*z7+z10*z7)-16*z3*z10*z7;
1087  fm[2][3] = 16*mQ6+8*mQ4*(-2*z1+z2+2*z3-4*z4-4*z10-z9+z8-2
1088  *z7-2*z6+z5)+8*mQ2*(-2*z1*z5+4*z3*z10-z3*z9-z3*z8-2*z3*
1089  z7+2*z3*z6+z3*z5-2*z4*z5-2*z10*z5-2*z6*z5)+16*z3*z5*(z10+
1090  z6);
1091  fm[2][4] = 8*mQ4*(-2*z1-2*z3+z10-z8)+4*mQ2*(4*z1S-2*z1*
1092  z2+8*z1*z4+6*z1*z10+4*z1*z9-2*z1*z8+4*z1*z7+4*z1*z6+2*z1*
1093  z5+z2*z10+4*z3*z4+3*z3*z9-2*z3*z7+2*z3*z5-z4*z8+2*z4*z6-4
1094  *z10*z6+3*z10*z5+3*z9*z6-3*z8*z7-4*z6S+4*z6*z5)+8*(-z1S
1095  *z9+z1S*z8+z1*z2*z7-z1*z2*z6-z1*z3*z9-z1*z3*z5+z1*z4
1096  *z8+z1*z4*z5+z1*z10*z8-z1*z9*z6+z1*z8*z7+z1*z8*z6+z2*z3*
1097  z7-z2*z4*z6-z2*z10*z6-z2*z6S-z3*z10*z5-z3*z7*z5-z3*z6*
1098  z5+z4*z6*z5);
1099  fm[2][5] = 16*mQ4*z10+8*mQ2*(2*z1S+2*z1*z3+2*z1*z4+2*z1
1100  *z10+2*z1*z7+2*z1*z6+z3*z7+z4*z6)+8*(-2*pow3(z1)-2*z1S*z3-
1101  2*z1S*z4-2*z1S*z10-2*z1S*z7-2*z1S*z6-2*z1*z3*z4-
1102  z1*z3*z10-2*z1*z3*z6-z1*z4*z10-2*z1*z4*z7-z1*z10S-z1*
1103  z10*z7-z1*z10*z6-2*z1*z7*z6+z3S*z7-z3*z4*z7-z3*z4*z6+z3
1104  *z10*z7+z3*z7S-z3*z7*z6+z4S*z6+z4*z10*z6-z4*z7*z6+z4*
1105  z6S);
1106  fm[2][6] = 8*mQ4*(-2*z1+z10-z9-2*z7)+4*mQ2*(4*z1S+2*z1*
1107  z2+4*z1*z3+4*z1*z4+6*z1*z10-2*z1*z9+4*z1*z8+8*z1*z6-2*z1*
1108  z5+4*z2*z4+3*z2*z10+2*z2*z7-3*z3*z9-2*z3*z7-4*z4S-4*z4*
1109  z10+3*z4*z8+2*z4*z6+z10*z5-z9*z6+3*z8*z7+4*z7*z6)+8*(z1S
1110  *z9-z1S*z8-z1*z2*z7+z1*z2*z6+z1*z3*z9+z1*z3*z5+z1*z4*
1111  z9-z1*z4*z8-z1*z4*z5+z1*z10*z9+z1*z9*z6-z1*z8*z7-z2*z3*z7
1112  -z2*z4*z7+z2*z4*z6-z2*z10*z7+z3*z7*z5-z4S*z5-z4*z10*z5-
1113  z4*z6*z5);
1114  fm[2][7] = 8*mQ4*(z3+2*z4+3*z10+z7+2*z6)+4*mQ2*(-4*z1*z3-
1115  2*z1*z4-2*z1*z10+z1*z9-z1*z8-4*z1*z7-2*z1*z6+z2*z3+2*z2*
1116  z4+3*z2*z10+z2*z7+2*z2*z6-6*z3*z4-6*z3*z10-2*z3*z9-2*z3*
1117  z7-4*z3*z6-z3*z5-6*z4S-6*z4*z10-3*z4*z9-z4*z8-4*z4*z7-2
1118  *z4*z6-2*z4*z5-3*z10*z9-3*z10*z8-6*z10*z7-6*z10*z6+z10*z5
1119  +z9*z7-2*z8*z7-2*z8*z6-6*z7*z6+z7*z5-6*z6S+2*z6*z5)+4*(
1120  -z1S*z9+z1S*z8-2*z1*z2*z10-3*z1*z2*z7-3*z1*z2*z6+z1*
1121  z3*z9-z1*z3*z5+z1*z4*z9+z1*z4*z8+z1*z4*z5+z1*z10*z9+z1*
1122  z10*z8-z1*z9*z6+z1*z8*z6+z2*z3*z7-3*z2*z4*z7-z2*z4*z6-3*
1123  z2*z10*z7-3*z2*z10*z6-3*z2*z7*z6-3*z2*z6S-2*z3*z4*z5-z3
1124  *z10*z5-z3*z6*z5-z4S*z5-z4*z10*z5+z4*z6*z5);
1125  fm[2][8] = 8*mQ4*(z3+2*z4+3*z10+z7+2*z6)+4*mQ2*(-4*z1*z3-
1126  2*z1*z4-2*z1*z10-z1*z9+z1*z8-4*z1*z7-2*z1*z6+z2*z3+2*z2*
1127  z4+z2*z10-z2*z7-2*z2*z6-6*z3*z4-6*z3*z10-2*z3*z9+z3*z8-2*
1128  z3*z7-4*z3*z6+z3*z5-6*z4S-6*z4*z10-2*z4*z9-4*z4*z7-2*z4
1129  *z6+2*z4*z5-3*z10*z9-3*z10*z8-6*z10*z7-6*z10*z6+3*z10*z5-
1130  z9*z6-2*z8*z7-3*z8*z6-6*z7*z6+z7*z5-6*z6S+2*z6*z5)+4*(
1131  z1S*z9-z1S*z8-z1*z2*z7+z1*z2*z6-3*z1*z3*z5+z1*z4*z9-
1132  z1*z4*z8-3*z1*z4*z5+z1*z10*z9+z1*z10*z8-2*z1*z10*z5+z1*z9
1133  *z6+z1*z8*z7+z1*z8*z6-z2*z4*z7+z2*z4*z6-z2*z10*z7-z2*z10*
1134  z6-2*z2*z7*z6-z2*z6S-3*z3*z4*z5-3*z3*z10*z5+z3*z7*z5-3*
1135  z3*z6*z5-3*z4S*z5-3*z4*z10*z5-z4*z6*z5);
1136  fm[3][3] = 64*mQ6+16*mQ4*s3+32*mQ4*(z1+z2+2*z3+z8+z6
1137  +2*z5)+8*mQ2*s3*(-z1+2*z3-z6)+16*mQ2*(z2*z5-2*z3*
1138  z8-2*z3*z6+4*z3*z5+z8*z5)+8*s3*z3*z6-16*z3*z8*z5;
1139  fm[3][4] = 16*mQ4*(-4*z1-z3+z8-z6)+4*mQ2*s3*(-2*z1-z3-
1140  z6)+16*mQ2*(-2*z1S-3*z1*z2-2*z1*z3-3*z1*z8-2*z1*z6-3*
1141  z1*z5-2*z2*z3-2*z6*z5)-8*s3*z3*z6+8*(-z1*z2*z8-2*z1*z2
1142  *z5-z1*z8S-z1*z8*z5+z2S*z6-z2*z3*z5+z2*z8*z6-z2*z6*z5
1143  +z3*z8*z5+z3*z5S);
1144  fm[3][5] = 8*mQ4*(-2*z1+z10-z8-2*z6)+4*mQ2*(4*z1S+2*z1*
1145  z2+4*z1*z3+4*z1*z4+6*z1*z10+4*z1*z9-2*z1*z8+8*z1*z7-2*z1*
1146  z5+4*z2*z3+3*z2*z10+2*z2*z6-4*z3S-4*z3*z10+3*z3*z9+2*z3
1147  *z7-3*z4*z8-2*z4*z6+z10*z5+3*z9*z6-z8*z7+4*z7*z6)+8*(-z1S
1148  *z9+z1S*z8+z1*z2*z7-z1*z2*z6-z1*z3*z9+z1*z3*z8-z1*z3
1149  *z5+z1*z4*z8+z1*z4*z5+z1*z10*z8-z1*z9*z6+z1*z8*z7+z2*z3*
1150  z7-z2*z3*z6-z2*z4*z6-z2*z10*z6-z3S*z5-z3*z10*z5-z3*z7*
1151  z5+z4*z6*z5);
1152  fm[3][6] = 16*mQ6+4*mQ4*s3+16*mQ4*(-z1-z2+2*z3+2*z4+
1153  z10-z9-z8-z7-z6+z5)+4*mQ2*s3*(z1+2*z3+2*z4+z10+z7+z6
1154  )+8*mQ2*(4*z1*z3+4*z1*z4+4*z1*z10+4*z2*z3+4*z2*z4+4*z2*
1155  z10-z2*z5+4*z3*z5+4*z4*z5+2*z10*z5-z9*z5-z8*z5)-(8*s3*
1156  z1)*(z3+z4+z10)+16*z2*z5*(z3+z4+z10);
1157  fm[3][7] = 8*mQ4*(3*z3+6*z4+3*z10+z9+2*z8+2*z7+z6)+2*mQ2*
1158  s3*(z3+2*z4+2*z10-2*z7-z6)+4*mQ2*(4*z1*z3+8*z1*z4+4*
1159  z1*z10+2*z1*z9-2*z1*z8+2*z2*z3+10*z2*z4+5*z2*z10+2*z2*z9+
1160  z2*z8+2*z2*z7+4*z2*z6-7*z3*z9+2*z3*z8-8*z3*z7+4*z3*z6+4*
1161  z3*z5+5*z4*z8+4*z4*z6+8*z4*z5+5*z10*z5-z9*z8-z9*z6+z9*z5+
1162  z8S-z8*z7+2*z8*z6+2*z8*z5)+2*s3*(-z1*z10+z3*z7-2*z3*
1163  z6+z4*z6)+4*(-z1*z2*z9-2*z1*z2*z8+z1*z9*z8-z1*z8S+z2S
1164  *z7+2*z2S*z6+3*z2*z4*z5+2*z2*z10*z5-2*z2*z9*z6+z2*z8*z7
1165  +z2*z8*z6-2*z3*z9*z5+z3*z8*z5+z4*z8*z5);
1166  fm[3][8] = 8*mQ4*(3*z3+6*z4+3*z10+2*z9+z8+2*z7+z6)+2*mQ2*
1167  s3*(3*z3+6*z4+3*z10-2*z7-z6)+4*mQ2*(4*z1*z3+8*z1*z4+
1168  4*z1*z10+4*z2*z3+8*z2*z4+4*z2*z10-8*z3*z9+4*z3*z8-8*z3*z7
1169  +4*z3*z6+6*z3*z5+4*z4*z8+4*z4*z6+12*z4*z5+6*z10*z5+2*z9*
1170  z5+z8*z5)+4*s3*(-z1*z3-2*z1*z4-z1*z10+2*z3*z7-z3*z6-z4
1171  *z6)+8*z5*(z2*z3+2*z2*z4+z2*z10-2*z3*z9+z3*z8+z4*z8);
1172  fm[4][4] = 64*mQ6+16*mQ4*s3+32*mQ4*(z1+2*z2+z3+z8+2*
1173  z6+z5)+8*mQ2*s3*(-z1-z3+2*z6)+16*mQ2*(z2*z8+4*z2*
1174  z6+z2*z5-2*z3*z6-2*z8*z6)+8*s3*z3*z6-16*z2*z8*z6;
1175  fm[4][5] = 16*mQ6+8*mQ4*(-2*z1+z2-2*z3-2*z4-4*z10-z9+z8-4
1176  *z7+2*z6+z5)+8*mQ2*(-2*z1*z2-2*z2*z3-2*z2*z10-2*z2*z7+
1177  z2*z6+2*z3*z6-2*z4*z6+4*z10*z6-z9*z6-z8*z6)+16*z2*z6*(z3+
1178  z10);
1179  fm[4][6] = 16*mQ6-4*mQ4*s3+8*mQ4*(-2*z1+2*z2-4*z3-2*
1180  z4-8*z10+z9+z8-4*z7-2*z6+2*z5)-(4*mQ2*s3)*(z1+z3+z10
1181  +z7)+8*mQ2*(-2*z1*z2-2*z1*z10+z1*z9+z1*z8-2*z1*z5+z2S
1182  -4*z2*z3-5*z2*z10+z2*z9-3*z2*z7-z2*z6+z2*z5+z3*z9+2*z3*z7
1183  -3*z3*z5+z4*z8+2*z4*z6-z4*z5-5*z10*z5+z9*z8+z9*z6+z8*z7+
1184  z8*z5-4*z7*z5+z5S)-(16*z2*z5)*(z1+z3+z10+z7);
1185  fm[4][7] = 8*mQ4*(-z3-2*z4-3*z10-2*z9-z8-6*z7-3*z6)+2*mQ2
1186  *s3*(z3+2*z4-3*z10-6*z7-3*z6)+4*mQ2*(-4*z1*z10-8*z1*
1187  z7-4*z1*z6-6*z2*z10-2*z2*z9-z2*z8-12*z2*z7-6*z2*z6-4*z3*
1188  z7-4*z3*z6+8*z4*z6-4*z10*z5+8*z9*z6-4*z8*z7-4*z8*z6-8*z7*
1189  z5-4*z6*z5)+4*s3*(z1*z10+2*z1*z7+z1*z6+z3*z7+z3*z6-2*
1190  z4*z6)+8*z2*(-z10*z5+2*z9*z6-z8*z7-z8*z6-2*z7*z5-z6*z5);
1191  fm[4][8] = 8*mQ4*(-z3-2*z4-3*z10-z9-2*z8-6*z7-3*z6)+2*mQ2
1192  *s3*(z3+2*z4-2*z10-2*z7-z6)+4*mQ2*(-4*z1*z10-2*z1*z9
1193  +2*z1*z8-8*z1*z7-4*z1*z6-5*z2*z10-z2*z9-2*z2*z8-8*z2*z7-4
1194  *z2*z6+z3*z9-2*z3*z8-4*z3*z7-4*z3*z6-4*z3*z5+z4*z8+8*z4*
1195  z6-2*z4*z5-5*z10*z5+z9*z8+7*z9*z6-2*z9*z5-z8S-5*z8*z7-2
1196  *z8*z6-z8*z5-10*z7*z5-2*z6*z5)+2*s3*(z1*z10-z3*z7+2*z3
1197  *z6-z4*z6)+4*(-z1*z9*z8+z1*z9*z5+z1*z8S+2*z1*z8*z5-2*z2
1198  *z10*z5+2*z2*z9*z6-z2*z8*z7-z2*z8*z6-3*z2*z7*z5+2*z3*z9*
1199  z5-z3*z8*z5-2*z3*z5S-z4*z8*z5-z4*z5S);
1200  fm[5][5] = 16*mQ6+16*mQ4*(-z1-z3+z4-z10-z7+z6)+16*mQ2*(
1201  z3*z6+z4*z10+z4*z7+z4*z6+z10*z6)-16*z4*z10*z6;
1202  fm[5][6] = 16*mQ6+8*mQ4*(-2*z1+z2-4*z3+2*z4-4*z10+z9-z8-2
1203  *z7-2*z6+z5)+8*mQ2*(-2*z1*z5-2*z3*z5+4*z4*z10-z4*z9-z4*
1204  z8+2*z4*z7-2*z4*z6+z4*z5-2*z10*z5-2*z7*z5)+16*z4*z5*(z10+
1205  z7);
1206  fm[5][7] = 8*mQ4*(-2*z3-z4-3*z10-2*z7-z6)+4*mQ2*(2*z1*z3+
1207  4*z1*z4+2*z1*z10+z1*z9-z1*z8+2*z1*z7+4*z1*z6-2*z2*z3-z2*
1208  z4-3*z2*z10-2*z2*z7-z2*z6+6*z3S+6*z3*z4+6*z3*z10+z3*z9+
1209  3*z3*z8+2*z3*z7+4*z3*z6+2*z3*z5+6*z4*z10+2*z4*z8+4*z4*z7+
1210  2*z4*z6+z4*z5+3*z10*z9+3*z10*z8+6*z10*z7+6*z10*z6-z10*z5+
1211  2*z9*z7+2*z9*z6-z8*z6+6*z7S+6*z7*z6-2*z7*z5-z6*z5)+4*(-
1212  z1S*z9+z1S*z8+2*z1*z2*z10+3*z1*z2*z7+3*z1*z2*z6-z1*z3
1213  *z9-z1*z3*z8-z1*z3*z5-z1*z4*z8+z1*z4*z5-z1*z10*z9-z1*z10*
1214  z8-z1*z9*z7+z1*z8*z7+z2*z3*z7+3*z2*z3*z6-z2*z4*z6+3*z2*
1215  z10*z7+3*z2*z10*z6+3*z2*z7S+3*z2*z7*z6+z3S*z5+2*z3*z4
1216  *z5+z3*z10*z5-z3*z7*z5+z4*z10*z5+z4*z7*z5);
1217  fm[5][8] = 8*mQ4*(-2*z3-z4-3*z10-2*z7-z6)+4*mQ2*(2*z1*z3+
1218  4*z1*z4+2*z1*z10-z1*z9+z1*z8+2*z1*z7+4*z1*z6-2*z2*z3-z2*
1219  z4-z2*z10+2*z2*z7+z2*z6+6*z3S+6*z3*z4+6*z3*z10+2*z3*z8+
1220  2*z3*z7+4*z3*z6-2*z3*z5+6*z4*z10-z4*z9+2*z4*z8+4*z4*z7+2*
1221  z4*z6-z4*z5+3*z10*z9+3*z10*z8+6*z10*z7+6*z10*z6-3*z10*z5+
1222  3*z9*z7+2*z9*z6+z8*z7+6*z7S+6*z7*z6-2*z7*z5-z6*z5)+4*(
1223  z1S*z9-z1S*z8-z1*z2*z7+z1*z2*z6+z1*z3*z9-z1*z3*z8+3*
1224  z1*z3*z5+3*z1*z4*z5-z1*z10*z9-z1*z10*z8+2*z1*z10*z5-z1*z9
1225  *z7-z1*z9*z6-z1*z8*z7-z2*z3*z7+z2*z3*z6+z2*z10*z7+z2*z10*
1226  z6+z2*z7S+2*z2*z7*z6+3*z3S*z5+3*z3*z4*z5+3*z3*z10*z5+
1227  z3*z7*z5+3*z4*z10*z5+3*z4*z7*z5-z4*z6*z5);
1228  fm[6][6] = 64*mQ6+16*mQ4*s3+32*mQ4*(z1+z2+2*z4+z9+z7
1229  +2*z5)+8*mQ2*s3*(-z1+2*z4-z7)+16*mQ2*(z2*z5-2*z4*
1230  z9-2*z4*z7+4*z4*z5+z9*z5)+8*s3*z4*z7-16*z4*z9*z5;
1231  fm[6][7] = 8*mQ4*(-6*z3-3*z4-3*z10-2*z9-z8-z7-2*z6)+2*mQ2
1232  *s3*(-2*z3-z4-2*z10+z7+2*z6)+4*mQ2*(-8*z1*z3-4*z1*z4
1233  -4*z1*z10+2*z1*z9-2*z1*z8-10*z2*z3-2*z2*z4-5*z2*z10-z2*z9
1234  -2*z2*z8-4*z2*z7-2*z2*z6-5*z3*z9-4*z3*z7-8*z3*z5-2*z4*z9+
1235  7*z4*z8-4*z4*z7+8*z4*z6-4*z4*z5-5*z10*z5-z9S+z9*z8-2*z9
1236  *z7+z9*z6-2*z9*z5+z8*z7-z8*z5)+2*s3*(z1*z10-z3*z7+2*z4
1237  *z7-z4*z6)+4*(2*z1*z2*z9+z1*z2*z8+z1*z9S-z1*z9*z8-2*
1238  z2S*z7-z2S*z6-3*z2*z3*z5-2*z2*z10*z5-z2*z9*z7-z2*z9*z6+
1239  2*z2*z8*z7-z3*z9*z5-z4*z9*z5+2*z4*z8*z5);
1240  fm[6][8] = 8*mQ4*(-6*z3-3*z4-3*z10-z9-2*z8-z7-2*z6)+2*mQ2
1241  *s3*(-6*z3-3*z4-3*z10+z7+2*z6)+4*mQ2*(-8*z1*z3-4*z1*
1242  z4-4*z1*z10-8*z2*z3-4*z2*z4-4*z2*z10-4*z3*z9-4*z3*z7-12*
1243  z3*z5-4*z4*z9+8*z4*z8-4*z4*z7+8*z4*z6-6*z4*z5-6*z10*z5-z9
1244  *z5-2*z8*z5)+4*s3*(2*z1*z3+z1*z4+z1*z10+z3*z7+z4*z7-2*
1245  z4*z6)+8*z5*(-2*z2*z3-z2*z4-z2*z10-z3*z9-z4*z9+2*z4*z8);
1246  fm[7][7] = 72*mQ4*z10+18*mQ2*s3*z10+8*mQ2*(z1*z10+9*
1247  z2*z10+7*z3*z7+2*z3*z6+2*z4*z7+7*z4*z6+z10*z5+2*z9*z7+7*
1248  z9*z6+7*z8*z7+2*z8*z6)+2*s3*(-z1*z10-7*z3*z7-2*z3*z6-2
1249  *z4*z7-7*z4*z6)+4*z2*(z10*z5+2*z9*z7+7*z9*z6+7*z8*z7+2*z8
1250  *z6);
1251  fm[7][8] = 72*mQ4*z10+2*mQ2*s3*z10+4*mQ2*(2*z1*z10+
1252  10*z2*z10+7*z3*z9+2*z3*z8+14*z3*z7+4*z3*z6+2*z4*z9+7*z4*
1253  z8+4*z4*z7+14*z4*z6+10*z10*z5+z9S+7*z9*z8+2*z9*z7+7*z9*
1254  z6+z8S+7*z8*z7+2*z8*z6)+2*s3*(7*z1*z10-7*z3*z7-2*z3*
1255  z6-2*z4*z7-7*z4*z6)+2*(-2*z1*z9S-14*z1*z9*z8-2*z1*z8S
1256  +2*z2*z10*z5+2*z2*z9*z7+7*z2*z9*z6+7*z2*z8*z7+2*z2*z8*z6+
1257  7*z3*z9*z5+2*z3*z8*z5+2*z4*z9*z5+7*z4*z8*z5);
1258  fm[8][8] = 72*mQ4*z10+18*mQ2*s3*z10+8*mQ2*(z1*z10+z2
1259  *z10+7*z3*z9+2*z3*z8+7*z3*z7+2*z3*z6+2*z4*z9+7*z4*z8+2*z4
1260  *z7+7*z4*z6+9*z10*z5)+2*s3*(-z1*z10-7*z3*z7-2*z3*z6-2*
1261  z4*z7-7*z4*z6)+4*z5*(z2*z10+7*z3*z9+2*z3*z8+2*z4*z9+7*z4*
1262  z8);
1263  double fm99 = -4*mQ4*z10-mQ2*s3*z10+4*mQ2*(-z1*z10-z2*z10+
1264  z3*z7+z4*z6-z10*z5+z9*z6+z8*z7)+s3*(z1*z10-z3*z7-z4*z6
1265  )+2*z2*(-z10*z5+z9*z6+z8*z7);
1266  double fm910 = -4*mQ4*z10-mQ2*s3*z10+2*mQ2*(-2*z1*z10-2*z2*
1267  z10+2*z3*z9+2*z3*z7+2*z4*z6-2*z10*z5+z9*z8+2*z8*z7)+s3
1268  *(z1*z10-z3*z7-z4*z6)+2*(-z1*z9*z8-z2*z10*z5+z2*z8*z7+z3*
1269  z9*z5);
1270  double fmxx = -4*mQ4*z10-mQ2*s3*z10+2*mQ2*(-2*z1*z10-2*z2*
1271  z10+2*z4*z8+2*z4*z6+2*z3*z7-2*z10*z5+z9*z8+2*z9*z6)+s3
1272  *(z1*z10-z3*z7-z4*z6)+2*(-z1*z9*z8-z2*z10*z5+z2*z9*z6+z4*
1273  z8*z5);
1274  fm910 = 0.5*(fmxx+fm910);
1275  double fm1010 = -4*mQ4*z10-mQ2*s3*z10+4*mQ2*(-z1*z10-z2*z10+
1276  z3*z7+z4*z6-z10*z5+z9*z3+z8*z4)+s3*(z1*z10-z3*z7-z4*z6
1277  )+2*z5*(-z10*z2+z9*z3+z8*z4);
1278  fm[7][7] -= 2. * fm99;
1279  fm[7][8] -= 2. * fm910;
1280  fm[8][8] -= 2. * fm1010;
1281 
1282  // Propagators.
1283  double ss1 = (pTemp[1] + pTemp[3]).m2Calc() - mQ2;
1284  double ss2 = (pTemp[1] + pTemp[4]).m2Calc() - mQ2;
1285  double ss3 = (pTemp[1] + pTemp[5]).m2Calc() - mQ2;
1286  double ss4 = (pTemp[2] + pTemp[3]).m2Calc() - mQ2;
1287  double ss5 = (pTemp[2] + pTemp[4]).m2Calc() - mQ2;
1288  double ss6 = (pTemp[2] + pTemp[5]).m2Calc() - mQ2;
1289  double ss7 = sH;
1290 
1291  // Propagator combinations.
1292  double dz[9];
1293  dz[1] = ss1 * ss6;
1294  dz[2] = ss2 * ss6;
1295  dz[3] = ss2 * ss4;
1296  dz[4] = ss1 * ss5;
1297  dz[5] = ss3 * ss5;
1298  dz[6] = ss3 * ss4;
1299  dz[7] = ss7 * ss1;
1300  dz[8] = ss7 * ss4;
1301 
1302  // Colour factors.
1303  double clr[9][9];
1304  for (int i = 1; i < 4; ++i)
1305  for (int j = 1; j < 4; ++j) {
1306  clr[i][j] = 16. / 3.;
1307  clr[i][j+3] = -2. / 3.;
1308  clr[i+3][j] = -2. / 3.;
1309  clr[i+3][j+3] = 16. / 3.;
1310  }
1311  for (int i = 1; i < 4; ++i)
1312  for (int j = 1; j < 3; ++j) {
1313  clr[i][j+6] = -6.;
1314  clr[i+3][j+6] = 6.;
1315  clr[j+6][i] = -6.;
1316  clr[j+6][i+3] = 6.;
1317  }
1318  for (int i = 1; i < 3; ++i)
1319  for (int j = 1; j < 3; ++j)
1320  clr[i+6][j+6] = 12.;
1321 
1322  // Produce final result: matrix elements * colours * propagators.
1323  double wtSum = 0.;
1324  for (int i = 1; i < 9; ++i)
1325  for (int j = i; j < 9; ++j) {
1326  double fac = (j == i) ? 4. : 8.;
1327  wtSum += fm[i][j] * fac * clr[i][j] / (dz[i] * dz[j]);
1328  }
1329  wtSum *= -1./256.;
1330 
1331  // Combine factors.
1332  sigma = prefac * alpEM * pow2(alpS) * mQ2run * wtSum *pow2(coup2Q);
1333 
1334  // Secondary width for H, Q and Qbar (latter for top only).
1335  // (H can be H0 SM or H1, H2, A3 from BSM).
1336  sigma *= openFracTriplet;
1337 
1338 }
1339 
1340 //--------------------------------------------------------------------------
1341 
1342 // Select identity, colour and anticolour.
1343 
1344 void Sigma3gg2HQQbar::setIdColAcol() {
1345 
1346  // Pick out-flavours by relative CKM weights.
1347  setId( id1, id2, idRes, idNew, -idNew);
1348 
1349  // Colour flow topologies.
1350  if (rndmPtr->flat() < 0.5) setColAcol( 1, 2, 2, 3, 0, 0, 1, 0, 0, 3);
1351  else setColAcol( 1, 2, 3, 1, 0, 0, 3, 0, 0, 2);
1352 
1353 }
1354 
1355 //--------------------------------------------------------------------------
1356 
1357 // Evaluate weight for decay angles.
1358 
1359 double Sigma3gg2HQQbar::weightDecay( Event& process, int iResBeg,
1360  int iResEnd) {
1361 
1362  // Identity of mother of decaying reseonance(s).
1363  int idMother = process[process[iResBeg].mother1()].idAbs();
1364 
1365  // For Higgs decay hand over to standard routine.
1366  if (idMother == 25 || idMother == 35 || idMother == 36)
1367  return weightHiggsDecay( process, iResBeg, iResEnd);
1368 
1369  // For top decay hand over to standard routine.
1370  if (idMother == 6)
1371  return weightTopDecay( process, iResBeg, iResEnd);
1372 
1373  // Else done.
1374  return 1.;
1375 
1376 }
1377 
1378 //==========================================================================
1379 
1380 // Sigma3qqbar2HQQbar class.
1381 // Cross section for q qbar -> H0 Q Qbar (Q Qbar fusion of SM Higgs).
1382 // REDUCE output and part of the rest courtesy Z. Kunszt,
1383 // see Z. Kunszt, Nucl. Phys. B247 (1984) 339.
1384 
1385 //--------------------------------------------------------------------------
1386 
1387 // Initialize process.
1388 
1389 void Sigma3qqbar2HQQbar::initProc() {
1390 
1391  // Properties specific to Higgs state for the "q qbar -> H ttbar" process.
1392  // (H can be H0 SM or H1, H2, A3 from BSM).
1393 
1394  if (higgsType == 0 && idNew == 6) {
1395  nameSave = "q qbar -> H t tbar (SM)";
1396  codeSave = 909;
1397  idRes = 25;
1398  coup2Q = 1.;
1399  }
1400  else if (higgsType == 1 && idNew == 6) {
1401  nameSave = "q qbar -> h0(H1) t tbar";
1402  codeSave = 1009;
1403  idRes = 25;
1404  coup2Q = parm("HiggsH1:coup2u");
1405  }
1406  else if (higgsType == 2 && idNew == 6) {
1407  nameSave = "q qbar -> H0(H2) t tbar";
1408  codeSave = 1029;
1409  idRes = 35;
1410  coup2Q = parm("HiggsH2:coup2u");
1411  }
1412  else if (higgsType == 3 && idNew == 6) {
1413  nameSave = "q qbar -> A0(A3) t tbar";
1414  codeSave = 1049;
1415  idRes = 36;
1416  coup2Q = parm("HiggsA3:coup2u");
1417  }
1418 
1419  // Properties specific to Higgs state for the "q qbar -> H b bbar" process.
1420  // (H can be H0 SM or H1, H2, A3 from BSM).
1421  if (higgsType == 0 && idNew == 5) {
1422  nameSave = "q qbar -> H b bbar (SM)";
1423  codeSave = 913;
1424  idRes = 25;
1425  coup2Q = 1.;
1426  }
1427  else if (higgsType == 1 && idNew == 5) {
1428  nameSave = "q qbar -> h0(H1) b bbar";
1429  codeSave = 1013;
1430  idRes = 25;
1431  coup2Q = parm("HiggsH1:coup2d");
1432  }
1433  else if (higgsType == 2 && idNew == 5) {
1434  nameSave = "q qbar -> H0(H2) b bbar";
1435  codeSave = 1033;
1436  idRes = 35;
1437  coup2Q = parm("HiggsH2:coup2d");
1438  }
1439  else if (higgsType == 3 && idNew == 5) {
1440  nameSave = "q qbar -> A0(A3) b bbar";
1441  codeSave = 1053;
1442  idRes = 36;
1443  coup2Q = parm("HiggsA3:coup2d");
1444  }
1445 
1446  // Common mass and coupling factors.
1447  double mWS = pow2(particleDataPtr->m0(24));
1448  prefac = (4. * M_PI / coupSMPtr->sin2thetaW()) * pow2(4. * M_PI)
1449  * 0.25 / mWS;
1450 
1451  // Secondary open width fraction.
1452  openFracTriplet = particleDataPtr->resOpenFrac(idRes, idNew, -idNew);
1453 
1454 }
1455 
1456 //--------------------------------------------------------------------------
1457 
1458 // Evaluate sigma(sHat), part independent of incoming flavour.
1459 
1460 void Sigma3qqbar2HQQbar::sigmaKin() {
1461 
1462  // Running mass of heavy quark.
1463  double mQ2run = pow2( particleDataPtr->mRun(idNew, mH) );
1464 
1465  // Linear combination of p_Q and p_Qbar to ensure common mass.
1466  double mQ2 = m4 * m5;
1467  double epsi = 0.;
1468  if (m4 != m5) {
1469  double s45 = (p4cm + p5cm).m2Calc();
1470  mQ2 = 0.5 * (s4 + s5) - 0.25 * pow2(s4 - s5) / s45;
1471  epsi = 0.5 * (s5 - s4) / s45;
1472  }
1473 
1474  // Set up kinematics: q(4) qbar(5) -> H(3) Q(1) Qbar(2) in outgoing sense.
1475  Vec4 pTemp[6];
1476  pTemp[4] = Vec4( 0., 0., -0.5* mH, -0.5* mH);
1477  pTemp[5] = Vec4( 0., 0., 0.5* mH, -0.5* mH);
1478  pTemp[1] = p4cm + epsi * (p4cm + p5cm);
1479  pTemp[2] = p5cm - epsi * (p4cm + p5cm);
1480  pTemp[3] = p3cm;
1481 
1482  // Four-product combinations.
1483  double z1 = pTemp[1] * pTemp[2];
1484  double z2 = pTemp[1] * pTemp[3];
1485  double z3 = pTemp[1] * pTemp[4];
1486  double z4 = pTemp[1] * pTemp[5];
1487  double z5 = pTemp[2] * pTemp[3];
1488  double z6 = pTemp[2] * pTemp[4];
1489  double z7 = pTemp[2] * pTemp[5];
1490  double z8 = pTemp[3] * pTemp[4];
1491  double z9 = pTemp[3] * pTemp[5];
1492  double z10 = pTemp[4] * pTemp[5];
1493 
1494  // Powers required as shorthand in matriz elements.
1495  double mQ4 = mQ2 * mQ2;
1496 
1497  // Evaluate matrix elements for q + qbar -> Q + Qbar + H.
1498  // (H can be H0 SM or H1, H2, A3 from BSM).
1499  double a11 = -8.*mQ4*z10-2.*mQ2*s3*z10-(8.*mQ2)*(z2*z10+z3
1500  *z7+z4*z6+z9*z6+z8*z7)+2.*s3*(z3*z7+z4*z6)-(4.*z2)*(z9
1501  *z6+z8*z7);
1502  double a12 = -8.*mQ4*z10+4.*mQ2*(-z2*z10-z3*z9-2.*z3*z7-z4*z8-
1503  2.*z4*z6-z10*z5-z9*z8-z9*z6-z8*z7)+2.*s3*(-z1*z10+z3*z7
1504  +z4*z6)+2.*(2.*z1*z9*z8-z2*z9*z6-z2*z8*z7-z3*z9*z5-z4*z8*
1505  z5);
1506  double a22 = -8.*mQ4*z10-2.*mQ2*s3*z10-(8.*mQ2)*(z3*z9+z3*
1507  z7+z4*z8+z4*z6+z10*z5)+2.*s3*(z3*z7+z4*z6)-(4.*z5)*(z3
1508  *z9+z4*z8);
1509 
1510  // Propagators and propagator combinations.
1511  double ss1 = (pTemp[1] + pTemp[3]).m2Calc() - mQ2;
1512  double ss4 = (pTemp[2] + pTemp[3]).m2Calc() - mQ2;
1513  double ss7 = sH;
1514  double dz7 = ss7 * ss1;
1515  double dz8 = ss7 * ss4;
1516 
1517  // Produce final result: matrix elements * propagators.
1518  a11 /= (dz7 * dz7);
1519  a12 /= (dz7 * dz8);
1520  a22 /= (dz8 * dz8);
1521  double wtSum = -(a11 + a22 + 2.*a12) * (8./9.);
1522 
1523  // Combine factors.
1524  sigma = prefac * alpEM * pow2(alpS) * mQ2run * wtSum * pow2(coup2Q);
1525 
1526  // Secondary width for H, Q and Qbar (latter for top only).
1527  // (H can be H0 SM or H1, H2, A3 from BSM).
1528  sigma *= openFracTriplet;
1529 
1530 }
1531 
1532 //--------------------------------------------------------------------------
1533 
1534 // Select identity, colour and anticolour.
1535 
1536 void Sigma3qqbar2HQQbar::setIdColAcol() {
1537 
1538  // Pick out-flavours by relative CKM weights.
1539  setId( id1, id2, idRes, idNew, -idNew);
1540 
1541  // Colour flow topologies.
1542  if (id1 > 0) setColAcol( 1, 0, 0, 2, 0, 0, 1, 0, 0, 2);
1543  else setColAcol( 0, 1, 2, 0, 0, 0, 2, 0, 0, 1);
1544 
1545 }
1546 
1547 //--------------------------------------------------------------------------
1548 
1549 // Evaluate weight for decay angles.
1550 
1551 double Sigma3qqbar2HQQbar::weightDecay( Event& process, int iResBeg,
1552  int iResEnd) {
1553 
1554  // Identity of mother of decaying reseonance(s).
1555  int idMother = process[process[iResBeg].mother1()].idAbs();
1556 
1557  // For Higgs decay hand over to standard routine.
1558  if (idMother == 25 || idMother == 35 || idMother == 36)
1559  return weightHiggsDecay( process, iResBeg, iResEnd);
1560 
1561  // For top decay hand over to standard routine.
1562  if (idMother == 6)
1563  return weightTopDecay( process, iResBeg, iResEnd);
1564 
1565  // Else done.
1566  return 1.;
1567 
1568 }
1569 
1570 //==========================================================================
1571 
1572 // Sigma2qg2Hq class.
1573 // Cross section for q g -> H q.
1574 // (H can be H0 SM or H1, H2, A3 from BSM).
1575 
1576 //--------------------------------------------------------------------------
1577 
1578 // Initialize process.
1579 
1580 void Sigma2qg2Hq::initProc() {
1581 
1582  // Properties specific to Higgs state for the "c g -> H c" process.
1583  // (H can be H0 SM or H1, H2, A3 from BSM).
1584  if (higgsType == 0 && idNew == 4) {
1585  nameSave = "c g -> H c (SM)";
1586  codeSave = 911;
1587  idRes = 25;
1588  }
1589  else if (higgsType == 1 && idNew == 4) {
1590  nameSave = "c g -> h0(H1) c";
1591  codeSave = 1011;
1592  idRes = 25;
1593  }
1594  else if (higgsType == 2 && idNew == 4) {
1595  nameSave = "c g -> H0(H2) c";
1596  codeSave = 1031;
1597  idRes = 35;
1598  }
1599  else if (higgsType == 3 && idNew == 4) {
1600  nameSave = "c g -> A0(A3) c";
1601  codeSave = 1051;
1602  idRes = 36;
1603  }
1604 
1605  // Properties specific to Higgs state for the "b g -> H b" process.
1606  // (H can be H0 SM or H1, H2, A3 from BSM).
1607  if (higgsType == 0 && idNew == 5) {
1608  nameSave = "b g -> H b (SM)";
1609  codeSave = 911;
1610  idRes = 25;
1611  }
1612  else if (higgsType == 1 && idNew == 5) {
1613  nameSave = "b g -> h0(H1) b";
1614  codeSave = 1011;
1615  idRes = 25;
1616  }
1617  else if (higgsType == 2 && idNew == 5) {
1618  nameSave = "b g -> H0(H2) b";
1619  codeSave = 1031;
1620  idRes = 35;
1621  }
1622  else if (higgsType == 3 && idNew == 5) {
1623  nameSave = "b g -> A0(A3) b";
1624  codeSave = 1051;
1625  idRes = 36;
1626  }
1627 
1628  // Standard parameters.
1629  m2W = pow2( particleDataPtr->m0(24) );
1630  thetaWRat = 1. / (24. * coupSMPtr->sin2thetaW());
1631 
1632  // Secondary open width fraction.
1633  openFrac = particleDataPtr->resOpenFrac(idRes);
1634 
1635 
1636 }
1637 
1638 //--------------------------------------------------------------------------
1639 
1640 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
1641 
1642 void Sigma2qg2Hq::sigmaKin() {
1643 
1644  // Running mass provides coupling.
1645  double m2Run = pow2( particleDataPtr->mRun(idNew, mH) );
1646 
1647  // Cross section, including couplings and kinematics.
1648  sigma = (M_PI / sH2) * alpS * alpEM * thetaWRat * (m2Run/m2W)
1649  * (sH / (s4 - uH) + 2. * s4 * (s3 - uH) / pow2(s4 - uH)
1650  + (s4 - uH) / sH - 2. * s4 / (s4 - uH)
1651  + 2. * (s3 - uH) * (s3 - s4 - sH) / ((s4 - uH) * sH) );
1652 
1653  // Include secondary width for H0, H1, H2 or A3. Done.
1654  sigma *= openFrac;
1655 
1656 }
1657 
1658 //--------------------------------------------------------------------------
1659 
1660 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
1661 
1662 double Sigma2qg2Hq::sigmaHat() {
1663 
1664  // Check that specified flavour present.
1665  if (abs(id1) != idNew && abs(id2) != idNew) return 0.;
1666 
1667  // Answer.
1668  return sigma;
1669 
1670 }
1671 
1672 
1673 //--------------------------------------------------------------------------
1674 
1675 // Select identity, colour and anticolour.
1676 
1677 void Sigma2qg2Hq::setIdColAcol() {
1678 
1679  // Flavour set up for q g -> H0 q.
1680  int idq = (id2 == 21) ? id1 : id2;
1681  setId( id1, id2, idRes, idq);
1682 
1683  // tH defined between f and f': must swap tHat <-> uHat if q g in.
1684  swapTU = (id2 == 21);
1685 
1686  // Colour flow topologies. Swap when antiquarks.
1687  if (id2 == 21) setColAcol( 1, 0, 2, 1, 0, 0, 2, 0);
1688  else setColAcol( 2, 1, 1, 0, 0, 0, 2, 0);
1689  if (idq < 0) swapColAcol();
1690 
1691 }
1692 
1693 //--------------------------------------------------------------------------
1694 
1695 // Evaluate weight for decay angles.
1696 
1697 double Sigma2qg2Hq::weightDecay( Event& process, int iResBeg,
1698  int iResEnd) {
1699 
1700  // Identity of mother of decaying reseonance(s).
1701  int idMother = process[process[iResBeg].mother1()].idAbs();
1702 
1703  // For Higgs decay hand over to standard routine.
1704  if (idMother == 25 || idMother == 35 || idMother == 36)
1705  return weightHiggsDecay( process, iResBeg, iResEnd);
1706 
1707  // For top decay hand over to standard routine.
1708  if (idMother == 6)
1709  return weightTopDecay( process, iResBeg, iResEnd);
1710 
1711  // Else done.
1712  return 1.;
1713 
1714 }
1715 
1716 //==========================================================================
1717 
1718 // Sigma2gg2Hglt class.
1719 // Cross section for g g -> H g (H SM Higgs or BSM Higgs) via top loop.
1720 // (H can be H0 SM or H1, H2, A3 from BSM).
1721 
1722 //--------------------------------------------------------------------------
1723 
1724 // Initialize process.
1725 
1726 void Sigma2gg2Hglt::initProc() {
1727 
1728  // Properties specific to Higgs state.
1729  if (higgsType == 0) {
1730  nameSave = "g g -> H g (SM; top loop)";
1731  codeSave = 914;
1732  idRes = 25;
1733  }
1734  else if (higgsType == 1) {
1735  nameSave = "g g -> h0(H1) g (BSM; top loop)";
1736  codeSave = 1014;
1737  idRes = 25;
1738  }
1739  else if (higgsType == 2) {
1740  nameSave = "g g -> H0(H2) g (BSM; top loop)";
1741  codeSave = 1034;
1742  idRes = 35;
1743  }
1744  else if (higgsType == 3) {
1745  nameSave = "g g -> A0(A3) g (BSM; top loop)";
1746  codeSave = 1054;
1747  idRes = 36;
1748  }
1749 
1750  // Normalization factor by g g -> H partial width.
1751  // (H can be H0 SM or H1, H2, A3 from BSM).
1752  double mHiggs = particleDataPtr->m0(idRes);
1753  widHgg = particleDataPtr->resWidthChan(idRes, mHiggs, 21, 21);
1754 
1755  // Secondary open width fraction.
1756  openFrac = particleDataPtr->resOpenFrac(idRes);
1757 
1758 }
1759 
1760 //--------------------------------------------------------------------------
1761 
1762 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
1763 
1764 void Sigma2gg2Hglt::sigmaKin() {
1765 
1766  // Evaluate cross section. Secondary width for H0, H1, H2 or A3.
1767  sigma = (M_PI / sH2) * (3. / 16.) * alpS * (widHgg / m3)
1768  * (sH2 * sH2 + tH2 * tH2 + uH2 * uH2 + pow4(s3))
1769  / (sH * tH * uH * s3);
1770  sigma *= openFrac;
1771 
1772 }
1773 
1774 //--------------------------------------------------------------------------
1775 
1776 // Select identity, colour and anticolour.
1777 
1778 void Sigma2gg2Hglt::setIdColAcol() {
1779 
1780  // Flavour set up for g g -> H g trivial.
1781  // (H can be H0 SM or H1, H2, A3 from BSM).
1782  setId( 21, 21, idRes, 21);
1783 
1784  // Colour flow topologies: random choice between two mirrors.
1785  if (rndmPtr->flat() < 0.5) setColAcol( 1, 2, 2, 3, 0, 0, 1, 3);
1786  else setColAcol( 1, 2, 3, 1, 0, 0, 3, 2);
1787 
1788 }
1789 
1790 //--------------------------------------------------------------------------
1791 
1792 // Evaluate weight for decay angles.
1793 
1794 double Sigma2gg2Hglt::weightDecay( Event& process, int iResBeg,
1795  int iResEnd) {
1796 
1797  // Identity of mother of decaying reseonance(s).
1798  int idMother = process[process[iResBeg].mother1()].idAbs();
1799 
1800  // For Higgs decay hand over to standard routine.
1801  if (idMother == 25 || idMother == 35 || idMother == 36)
1802  return weightHiggsDecay( process, iResBeg, iResEnd);
1803 
1804  // For top decay hand over to standard routine.
1805  if (idMother == 6)
1806  return weightTopDecay( process, iResBeg, iResEnd);
1807 
1808  // Else done.
1809  return 1.;
1810 
1811 }
1812 
1813 //==========================================================================
1814 
1815 // Sigma2qg2Hqlt class.
1816 // Cross section for q g -> H q (H SM or BSM Higgs) via top loop.
1817 // (H can be H0 SM or H1, H2, A3 from BSM).
1818 
1819 //--------------------------------------------------------------------------
1820 
1821 // Initialize process.
1822 
1823 void Sigma2qg2Hqlt::initProc() {
1824 
1825  // Properties specific to Higgs state.
1826  if (higgsType == 0) {
1827  nameSave = "q g -> H q (SM; top loop)";
1828  codeSave = 915;
1829  idRes = 25;
1830  }
1831  else if (higgsType == 1) {
1832  nameSave = "q g -> h0(H1) q (BSM; top loop)";
1833  codeSave = 1015;
1834  idRes = 25;
1835  }
1836  else if (higgsType == 2) {
1837  nameSave = "q g -> H0(H2) q (BSM; top loop)";
1838  codeSave = 1035;
1839  idRes = 35;
1840  }
1841  else if (higgsType == 3) {
1842  nameSave = "q g -> A0(A3) q (BSM; top loop)";
1843  codeSave = 1055;
1844  idRes = 36;
1845  }
1846 
1847  // Normalization factor by g g -> H partial width.
1848  // (H can be H0 SM or H1, H2, A3 from BSM).
1849  double mHiggs = particleDataPtr->m0(idRes);
1850  widHgg = particleDataPtr->resWidthChan(idRes, mHiggs, 21, 21);
1851 
1852  // Secondary open width fraction.
1853  openFrac = particleDataPtr->resOpenFrac(idRes);
1854 
1855 }
1856 
1857 //--------------------------------------------------------------------------
1858 
1859 // Evaluate sigmaHat(sHat, part independent of incoming flavour).
1860 
1861 void Sigma2qg2Hqlt::sigmaKin() {
1862 
1863  // Evaluate cross section. Secondary width for H0, H1, H2 or A3.
1864  sigma = (M_PI / sH2) * (1. / 12.) * alpS * (widHgg / m3)
1865  * (sH2 + uH2) / (-tH * s3);
1866  sigma *= openFrac;
1867 
1868 }
1869 
1870 //--------------------------------------------------------------------------
1871 
1872 // Select identity, colour and anticolour.
1873 
1874 void Sigma2qg2Hqlt::setIdColAcol() {
1875 
1876  // Flavour set up for q g -> H q.
1877  // (H can be H0 SM or H1, H2, A3 from BSM).
1878  int idq = (id2 == 21) ? id1 : id2;
1879  setId( id1, id2, idRes, idq);
1880 
1881  // tH defined between f and f': must swap tHat <-> uHat if q g in.
1882  swapTU = (id2 == 21);
1883 
1884  // Colour flow topologies. Swap when antiquarks.
1885  if (id2 == 21) setColAcol( 1, 0, 2, 1, 0, 0, 2, 0);
1886  else setColAcol( 2, 1, 1, 0, 0, 0, 2, 0);
1887  if (idq < 0) swapColAcol();
1888 
1889 }
1890 
1891 //--------------------------------------------------------------------------
1892 
1893 // Evaluate weight for decay angles.
1894 
1895 double Sigma2qg2Hqlt::weightDecay( Event& process, int iResBeg,
1896  int iResEnd) {
1897 
1898  // Identity of mother of decaying reseonance(s).
1899  int idMother = process[process[iResBeg].mother1()].idAbs();
1900 
1901  // For Higgs decay hand over to standard routine.
1902  if (idMother == 25 || idMother == 35 || idMother == 36)
1903  return weightHiggsDecay( process, iResBeg, iResEnd);
1904 
1905  // For top decay hand over to standard routine.
1906  if (idMother == 6)
1907  return weightTopDecay( process, iResBeg, iResEnd);
1908 
1909  // Else done.
1910  return 1.;
1911 
1912 }
1913 
1914 //==========================================================================
1915 
1916 // Sigma2qqbar2Hglt class.
1917 // Cross section for q qbar -> H g (H SM or BSM Higgs) via top loop.
1918 // (H can be H0 SM or H1, H2, A3 from BSM).
1919 
1920 //--------------------------------------------------------------------------
1921 
1922 // Initialize process.
1923 
1924 void Sigma2qqbar2Hglt::initProc() {
1925 
1926  // Properties specific to Higgs state.
1927  if (higgsType == 0) {
1928  nameSave = "q qbar -> H g (SM; top loop)";
1929  codeSave = 916;
1930  idRes = 25;
1931  }
1932  else if (higgsType == 1) {
1933  nameSave = "q qbar -> h0(H1) g (BSM; top loop)";
1934  codeSave = 1016;
1935  idRes = 25;
1936  }
1937  else if (higgsType == 2) {
1938  nameSave = "q qbar -> H0(H2) g (BSM; top loop)";
1939  codeSave = 1036;
1940  idRes = 35;
1941  }
1942  else if (higgsType == 3) {
1943  nameSave = "q qbar -> A0(A3) g (BSM; top loop)";
1944  codeSave = 1056;
1945  idRes = 36;
1946  }
1947 
1948  // Normalization factor by g g -> H partial width.
1949  // (H can be H0 SM or H1, H2, A3 from BSM).
1950  double mHiggs = particleDataPtr->m0(idRes);
1951  widHgg = particleDataPtr->resWidthChan(idRes, mHiggs, 21, 21);
1952 
1953  // Secondary open width fraction.
1954  openFrac = particleDataPtr->resOpenFrac(idRes);
1955 
1956 
1957 }
1958 
1959 //--------------------------------------------------------------------------
1960 
1961 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
1962 
1963 void Sigma2qqbar2Hglt::sigmaKin() {
1964 
1965  // Evaluate cross section. Secondary width for H0, H1, H2 or A3.
1966  sigma = (M_PI / sH2) * (2. / 9.) * alpS * (widHgg / m3)
1967  * (tH2 + uH2) / (sH * s3);
1968  sigma *= openFrac;
1969 
1970 }
1971 
1972 //--------------------------------------------------------------------------
1973 
1974 // Select identity, colour and anticolour.
1975 
1976 void Sigma2qqbar2Hglt::setIdColAcol() {
1977 
1978  // Flavours trivial.
1979  setId( id1, id2, idRes, 21);
1980 
1981  // Colour flow topologies. Swap when antiquarks.
1982  setColAcol( 1, 0, 0, 2, 0, 0, 1, 2);
1983  if (id1 < 0) swapColAcol();
1984 
1985 }
1986 
1987 //--------------------------------------------------------------------------
1988 
1989 // Evaluate weight for decay angles.
1990 
1991 double Sigma2qqbar2Hglt::weightDecay( Event& process, int iResBeg,
1992  int iResEnd) {
1993 
1994  // Identity of mother of decaying reseonance(s).
1995  int idMother = process[process[iResBeg].mother1()].idAbs();
1996 
1997  // For Higgs decay hand over to standard routine.
1998  if (idMother == 25 || idMother == 35 || idMother == 36)
1999  return weightHiggsDecay( process, iResBeg, iResEnd);
2000 
2001  // For top decay hand over to standard routine.
2002  if (idMother == 6)
2003  return weightTopDecay( process, iResBeg, iResEnd);
2004 
2005  // Else done.
2006  return 1.;
2007 
2008 }
2009 
2010 
2011 //==========================================================================
2012 
2013 // Sigma1ffbar2Hchg class.
2014 // Cross section for f fbar -> H+- (f is quark or lepton).
2015 
2016 //--------------------------------------------------------------------------
2017 
2018 // Initialize process.
2019 
2020 void Sigma1ffbar2Hchg::initProc() {
2021 
2022  // Find pointer to H+-.
2023  HResPtr = particleDataPtr->particleDataEntryPtr(37);
2024 
2025  // Store H+- mass and width for propagator.
2026  mRes = HResPtr->m0();
2027  GammaRes = HResPtr->mWidth();
2028  m2Res = mRes*mRes;
2029  GamMRat = GammaRes / mRes;
2030 
2031  // Couplings.
2032  m2W = pow2(particleDataPtr->m0(24));
2033  thetaWRat = 1. / (8. * coupSMPtr->sin2thetaW());
2034  tan2Beta = pow2(parm("HiggsHchg:tanBeta"));
2035 
2036 }
2037 
2038 //--------------------------------------------------------------------------
2039 
2040 // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
2041 
2042 void Sigma1ffbar2Hchg::sigmaKin() {
2043 
2044  // Set up Breit-Wigner. Width out only includes open channels.
2045  sigBW = 4. * M_PI / ( pow2(sH - m2Res) + pow2(sH * GamMRat) );
2046  widthOutPos = HResPtr->resWidthOpen( 37, mH);
2047  widthOutNeg = HResPtr->resWidthOpen(-37, mH);
2048 
2049 }
2050 
2051 //--------------------------------------------------------------------------
2052 
2053 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
2054 
2055 double Sigma1ffbar2Hchg::sigmaHat() {
2056 
2057  // Only allow generation-diagonal states.
2058  int id1Abs = abs(id1);
2059  int id2Abs = abs(id2);
2060  int idUp = max(id1Abs, id2Abs);
2061  int idDn = min(id1Abs, id2Abs);
2062  if (idUp%2 != 0 || idUp - idDn != 1) return 0.;
2063 
2064  // Calculate mass-dependent incoming width. Total cross section.
2065  double m2RunUp = pow2(particleDataPtr->mRun(idUp, mH));
2066  double m2RunDn = pow2(particleDataPtr->mRun(idDn, mH));
2067  double widthIn = alpEM * thetaWRat * (mH/m2W)
2068  * (m2RunDn * tan2Beta + m2RunUp / tan2Beta);
2069  int idUpChg = (id1Abs%2 == 0) ? id1 : id2;
2070  double sigma = (idUpChg > 0) ? widthIn * sigBW * widthOutPos
2071  : widthIn * sigBW * widthOutNeg;
2072 
2073  // Colour factor. Answer.
2074  if (idUp < 9) sigma /= 3.;
2075  return sigma;
2076 
2077 }
2078 
2079 //--------------------------------------------------------------------------
2080 
2081 // Select identity, colour and anticolour.
2082 
2083 void Sigma1ffbar2Hchg::setIdColAcol() {
2084 
2085  // Charge of Higgs. Fill flavours.
2086  int idUpChg = (abs(id1)%2 == 0) ? id1 : id2;
2087  int idHchg = (idUpChg > 0) ? 37 : -37;
2088  setId( id1, id2, idHchg);
2089 
2090  // Colour flow topologies. Swap when antiquarks.
2091  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
2092  else setColAcol( 0, 0, 0, 0, 0, 0);
2093  if (id1 < 0) swapColAcol();
2094 
2095 }
2096 
2097 //--------------------------------------------------------------------------
2098 
2099 // Evaluate weight for decay angles.
2100 
2101 double Sigma1ffbar2Hchg::weightDecay( Event& process, int iResBeg,
2102  int iResEnd) {
2103 
2104  // Identity of mother of decaying reseonance(s).
2105  int idMother = process[process[iResBeg].mother1()].idAbs();
2106 
2107  // For Higgs decay hand over to standard routine.
2108  if (idMother == 25 || idMother == 35 || idMother == 36)
2109  return weightHiggsDecay( process, iResBeg, iResEnd);
2110 
2111  // For top decay hand over to standard routine.
2112  if (idMother == 6)
2113  return weightTopDecay( process, iResBeg, iResEnd);
2114 
2115  // Else done.
2116  return 1.;
2117 
2118 }
2119 
2120 //==========================================================================
2121 
2122 // Sigma2qg2Hq class.
2123 // Cross section for q g -> H+- q'.
2124 
2125 //--------------------------------------------------------------------------
2126 
2127 // Initialize process.
2128 
2129 void Sigma2qg2Hchgq::initProc() {
2130 
2131  // Standard parameters.
2132  m2W = pow2( particleDataPtr->m0(24) );
2133  thetaWRat = 1. / (24. * coupSMPtr->sin2thetaW());
2134  tan2Beta = pow2(parm("HiggsHchg:tanBeta"));
2135 
2136  // Incoming flavour within same doublet. Uptype and downtype flavours.
2137  idOld = (idNew%2 == 0) ? idNew - 1 : idNew + 1;
2138  idUp = max(idOld, idNew);
2139  idDn = min(idOld, idNew);
2140 
2141  // Secondary open width fraction.
2142  openFracPos = (idOld%2 == 0) ? particleDataPtr->resOpenFrac( 37, idNew)
2143  : particleDataPtr->resOpenFrac(-37, idNew);
2144  openFracNeg = (idOld%2 == 0) ? particleDataPtr->resOpenFrac(-37, -idNew)
2145  : particleDataPtr->resOpenFrac( 37, -idNew);
2146 
2147 }
2148 
2149 //--------------------------------------------------------------------------
2150 
2151 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
2152 
2153 void Sigma2qg2Hchgq::sigmaKin() {
2154 
2155  // Running masses provides coupling.
2156  double m2RunUp = pow2(particleDataPtr->mRun(idUp, mH));
2157  double m2RunDn = pow2(particleDataPtr->mRun(idDn, mH));
2158 
2159  // Cross section, including couplings and kinematics.
2160  sigma = (M_PI / sH2) * alpS * alpEM * thetaWRat
2161  * (m2RunDn * tan2Beta + m2RunUp / tan2Beta) / m2W
2162  * (sH / (s4 - uH) + 2. * s4 * (s3 - uH) / pow2(s4 - uH)
2163  + (s4 - uH) / sH - 2. * s4 / (s4 - uH)
2164  + 2. * (s3 - uH) * (s3 - s4 - sH) / ((s4 - uH) * sH) );
2165 
2166 }
2167 
2168 //--------------------------------------------------------------------------
2169 
2170 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
2171 
2172 double Sigma2qg2Hchgq::sigmaHat() {
2173 
2174  // Check that specified flavour present.
2175  if (abs(id1) != idOld && abs(id2) != idOld) return 0.;
2176 
2177  // Answer.
2178  return (id1 == idOld || id2 == idOld) ? sigma * openFracPos
2179  : sigma * openFracNeg;
2180 
2181 }
2182 
2183 //--------------------------------------------------------------------------
2184 
2185 // Select identity, colour and anticolour.
2186 
2187 void Sigma2qg2Hchgq::setIdColAcol() {
2188 
2189  // Flavour set up for q g -> H+- q'.
2190  int idq = (id2 == 21) ? id1 : id2;
2191  id3 = ( (idq > 0 && idOld%2 == 0) || (idq < 0 && idOld%2 != 0) )
2192  ? 37 : -37;
2193  id4 = (idq > 0) ? idNew : -idNew;
2194  setId( id1, id2, id3, id4);
2195 
2196  // tH defined between f and f': must swap tHat <-> uHat if q g in.
2197  swapTU = (id2 == 21);
2198 
2199  // Colour flow topologies. Swap when antiquarks.
2200  if (id2 == 21) setColAcol( 1, 0, 2, 1, 0, 0, 2, 0);
2201  else setColAcol( 2, 1, 1, 0, 0, 0, 2, 0);
2202  if (idq < 0) swapColAcol();
2203 
2204 }
2205 
2206 //--------------------------------------------------------------------------
2207 
2208 // Evaluate weight for decay angles.
2209 
2210 double Sigma2qg2Hchgq::weightDecay( Event& process, int iResBeg,
2211  int iResEnd) {
2212 
2213  // Identity of mother of decaying reseonance(s).
2214  int idMother = process[process[iResBeg].mother1()].idAbs();
2215 
2216  // For Higgs decay hand over to standard routine.
2217  if (idMother == 25 || idMother == 35 || idMother == 36)
2218  return weightHiggsDecay( process, iResBeg, iResEnd);
2219 
2220  // For top decay hand over to standard routine.
2221  if (idMother == 6)
2222  return weightTopDecay( process, iResBeg, iResEnd);
2223 
2224  // Else done.
2225  return 1.;
2226 
2227 }
2228 
2229 //==========================================================================
2230 
2231 // Sigma2ffbar2A3H12 class.
2232 // Cross section for f fbar -> A0(H_3) h0(H_1) or A0(H_3) H0(H_2).
2233 
2234 //--------------------------------------------------------------------------
2235 
2236 // Initialize process.
2237 
2238 void Sigma2ffbar2A3H12::initProc() {
2239 
2240  // Set up whether h0(H_1) or H0(H_2).
2241  higgs12 = (higgsType == 1) ? 25 : 35;
2242  codeSave = (higgsType == 1) ? 1081 : 1082;
2243  nameSave = (higgsType == 1) ? "f fbar -> A0(H3) h0(H1)"
2244  : "f fbar -> A0(H3) H0(H2)";
2245  coupZA3H12 = (higgsType == 1) ? parm("HiggsA3:coup2H1Z")
2246  : parm("HiggsA3:coup2H2Z");
2247 
2248  // Standard parameters.
2249  double mZ = particleDataPtr->m0(23);
2250  double GammaZ = particleDataPtr->mWidth(23);
2251  m2Z = mZ * mZ;
2252  mGammaZ = mZ * GammaZ;
2253  thetaWRat = 1. / (4. * coupSMPtr->sin2thetaW()
2254  * coupSMPtr->cos2thetaW());
2255 
2256  // Secondary open width fraction.
2257  openFrac = particleDataPtr->resOpenFrac(36, higgs12);
2258 
2259 }
2260 
2261 //--------------------------------------------------------------------------
2262 
2263 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
2264 
2265 void Sigma2ffbar2A3H12::sigmaKin() {
2266 
2267  // Common kinematics factora.
2268  sigma0 = (M_PI / sH2) * pow2(alpEM * thetaWRat * coupZA3H12)
2269  * (uH * tH - s3 * s4) / ( pow2(sH - m2Z) + pow2(mGammaZ) );
2270 
2271 }
2272 
2273 //--------------------------------------------------------------------------
2274 
2275 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
2276 
2277 double Sigma2ffbar2A3H12::sigmaHat() {
2278 
2279  // Couplings for incoming flavour.
2280  int idAbs = abs(id1);
2281  double lIn = coupSMPtr->lf(idAbs);
2282  double rIn = coupSMPtr->rf(idAbs);
2283 
2284  // Combine to total cross section. Colour factor.
2285  double sigma = (pow2(lIn) + pow2(rIn)) * sigma0 * openFrac;
2286  if (idAbs < 9) sigma /= 3.;
2287  return sigma;
2288 
2289 }
2290 
2291 //--------------------------------------------------------------------------
2292 
2293 // Select identity, colour and anticolour.
2294 
2295 void Sigma2ffbar2A3H12::setIdColAcol() {
2296 
2297  // Flavours trivial
2298  setId( id1, id2, 36, higgs12);
2299 
2300  // Colour flow topologies. Swap when antiquarks.
2301  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
2302  else setColAcol( 0, 0, 0, 0, 0, 0);
2303  if (id1 < 0) swapColAcol();
2304 
2305 }
2306 
2307 //--------------------------------------------------------------------------
2308 
2309 // Evaluate weight for decay angles.
2310 
2311 double Sigma2ffbar2A3H12::weightDecay( Event& process, int iResBeg,
2312  int iResEnd) {
2313 
2314  // Identity of mother of decaying reseonance(s).
2315  int idMother = process[process[iResBeg].mother1()].idAbs();
2316 
2317  // For Higgs decay hand over to standard routine.
2318  if (idMother == 25 || idMother == 35 || idMother == 36)
2319  return weightHiggsDecay( process, iResBeg, iResEnd);
2320 
2321  // For top decay hand over to standard routine.
2322  if (idMother == 6)
2323  return weightTopDecay( process, iResBeg, iResEnd);
2324 
2325  // Else done.
2326  return 1.;
2327 
2328 }
2329 
2330 //==========================================================================
2331 
2332 // Sigma2ffbar2HchgH12 class.
2333 // Cross section for f fbar -> H+- h0(H_1) or H+- H0(H_2).
2334 
2335 //--------------------------------------------------------------------------
2336 
2337 // Initialize process.
2338 
2339 void Sigma2ffbar2HchgH12::initProc() {
2340 
2341  // Set up whether h0(H_1) or H0(H_2).
2342  higgs12 = (higgsType == 1) ? 25 : 35;
2343  codeSave = (higgsType == 1) ? 1083 : 1084;
2344  nameSave = (higgsType == 1) ? "f fbar' -> H+- h0(H1)"
2345  : "f fbar' -> H+- H0(H2)";
2346  coupWHchgH12 = (higgsType == 1) ? parm("HiggsHchg:coup2H1W")
2347  : parm("HiggsHchg:coup2H2W");
2348 
2349  // Standard parameters.
2350  double mW = particleDataPtr->m0(24);
2351  double GammaW = particleDataPtr->mWidth(24);
2352  m2W = mW * mW;
2353  mGammaW = mW * GammaW;
2354  thetaWRat = 1. / (2. * coupSMPtr->sin2thetaW());
2355 
2356  // Secondary open width fraction.
2357  openFracPos = particleDataPtr->resOpenFrac( 37, higgs12);
2358  openFracNeg = particleDataPtr->resOpenFrac(-37, higgs12);
2359 
2360 }
2361 
2362 //--------------------------------------------------------------------------
2363 
2364 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
2365 
2366 void Sigma2ffbar2HchgH12::sigmaKin() {
2367 
2368  // Common kinematics factora.
2369  sigma0 = 0.5 * (M_PI / sH2) * pow2(alpEM * thetaWRat * coupWHchgH12)
2370  * (uH * tH - s3 * s4) / ( pow2(sH - m2W) + pow2(mGammaW) );
2371 
2372 }
2373 
2374 //--------------------------------------------------------------------------
2375 
2376 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
2377 
2378 double Sigma2ffbar2HchgH12::sigmaHat() {
2379 
2380  // Combine to total cross section. CKM and colour factor.
2381  int idUp = (abs(id1)%2 == 0) ? id1 : id2;
2382  double sigma = (idUp > 0) ? sigma0 * openFracPos : sigma0 * openFracNeg;
2383  if (abs(id1) < 9) sigma *= coupSMPtr->V2CKMid(abs(id1), abs(id2)) / 3.;
2384  return sigma;
2385 
2386 }
2387 
2388 //--------------------------------------------------------------------------
2389 
2390 // Select identity, colour and anticolour.
2391 
2392 void Sigma2ffbar2HchgH12::setIdColAcol() {
2393 
2394  // Charge of Higgs. Fill flavours.
2395  int idUpChg = (abs(id1)%2 == 0) ? id1 : id2;
2396  int idHchg = (idUpChg > 0) ? 37 : -37;
2397  setId( id1, id2, idHchg, higgs12);
2398 
2399  // Colour flow topologies. Swap when antiquarks.
2400  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
2401  else setColAcol( 0, 0, 0, 0, 0, 0);
2402  if (id1 < 0) swapColAcol();
2403 
2404 }
2405 
2406 //--------------------------------------------------------------------------
2407 
2408 // Evaluate weight for decay angles.
2409 
2410 double Sigma2ffbar2HchgH12::weightDecay( Event& process, int iResBeg,
2411  int iResEnd) {
2412 
2413  // Identity of mother of decaying reseonance(s).
2414  int idMother = process[process[iResBeg].mother1()].idAbs();
2415 
2416  // For Higgs decay hand over to standard routine.
2417  if (idMother == 25 || idMother == 35 || idMother == 36)
2418  return weightHiggsDecay( process, iResBeg, iResEnd);
2419 
2420  // For top decay hand over to standard routine.
2421  if (idMother == 6)
2422  return weightTopDecay( process, iResBeg, iResEnd);
2423 
2424  // Else done.
2425  return 1.;
2426 
2427 }
2428 
2429 //==========================================================================
2430 
2431 // Sigma2ffbar2HposHneg class.
2432 // Cross section for q g -> H+- q'.
2433 
2434 //--------------------------------------------------------------------------
2435 
2436 // Initialize process.
2437 
2438 void Sigma2ffbar2HposHneg::initProc() {
2439 
2440  // Standard parameters.
2441  double mZ = particleDataPtr->m0(23);
2442  double GammaZ = particleDataPtr->mWidth(23);
2443  m2Z = mZ * mZ;
2444  mGammaZ = mZ * GammaZ;
2445  thetaWRat = 1. / (4. * coupSMPtr->sin2thetaW()
2446  * coupSMPtr->cos2thetaW());
2447 
2448  // Charged Higgs coupling to gamma and Z0.
2449  eH = -1.;
2450  lH = -1. + 2. * coupSMPtr->sin2thetaW();
2451 
2452  // Secondary open width fraction.
2453  openFrac = particleDataPtr->resOpenFrac(37, -37);
2454 
2455 }
2456 
2457 //--------------------------------------------------------------------------
2458 
2459 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
2460 
2461 void Sigma2ffbar2HposHneg::sigmaKin() {
2462 
2463  // Common kinematics factora.
2464  double preFac = M_PI * pow2(alpEM) * ((uH * tH - s3 * s4) / sH2);
2465  double propZ = 1. / ( pow2(sH - m2Z) + pow2(mGammaZ) );
2466 
2467  // Separate parts for gamma*, interference and Z0.
2468  gamSig = preFac * 2. * pow2(eH) / sH2;
2469  intSig = preFac * 2. * eH * lH * thetaWRat * propZ * (sH - m2Z) / sH;
2470  resSig = preFac * pow2(lH * thetaWRat) * propZ;
2471 
2472 }
2473 
2474 //--------------------------------------------------------------------------
2475 
2476 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
2477 
2478 double Sigma2ffbar2HposHneg::sigmaHat() {
2479 
2480  // Couplings for incoming flavour.
2481  int idAbs = abs(id1);
2482  double eIn = coupSMPtr->ef(idAbs);
2483  double lIn = coupSMPtr->lf(idAbs);
2484  double rIn = coupSMPtr->rf(idAbs);
2485 
2486  // Combine to total cross section. Colour factor.
2487  double sigma = (pow2(eIn) * gamSig + eIn * (lIn + rIn) * intSig
2488  + (pow2(lIn) + pow2(rIn)) * resSig) * openFrac;
2489  if (idAbs < 9) sigma /= 3.;
2490  return sigma;
2491 
2492 }
2493 
2494 //--------------------------------------------------------------------------
2495 
2496 // Select identity, colour and anticolour.
2497 
2498 void Sigma2ffbar2HposHneg::setIdColAcol() {
2499 
2500  // Flavours trivial
2501  setId( id1, id2, 37, -37);
2502 
2503  // Colour flow topologies. Swap when antiquarks.
2504  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
2505  else setColAcol( 0, 0, 0, 0, 0, 0);
2506  if (id1 < 0) swapColAcol();
2507 
2508 }
2509 
2510 //--------------------------------------------------------------------------
2511 
2512 // Evaluate weight for decay angles.
2513 
2514 double Sigma2ffbar2HposHneg::weightDecay( Event& process, int iResBeg,
2515  int iResEnd) {
2516 
2517  // Identity of mother of decaying reseonance(s).
2518  int idMother = process[process[iResBeg].mother1()].idAbs();
2519 
2520  // For Higgs decay hand over to standard routine.
2521  if (idMother == 25 || idMother == 35 || idMother == 36)
2522  return weightHiggsDecay( process, iResBeg, iResEnd);
2523 
2524  // For top decay hand over to standard routine.
2525  if (idMother == 6)
2526  return weightTopDecay( process, iResBeg, iResEnd);
2527 
2528  // Else done.
2529  return 1.;
2530 
2531 }
2532 
2533 //==========================================================================
2534 
2535 } // end namespace Pythia8
Definition: AgUStep.h:26