1 // SigmaOnia.cc is a part of the PYTHIA event generator.
2 // Copyright (C) 2008 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 // charmonia/bottomonia simulation classes.
13 //**************************************************************************
15 // Sigma2gg2QQbar3S11g class.
16 // Cross section g g -> QQbar[3S1(1)] g (Q = c or b).
20 // Initialize process.
22 void Sigma2gg2QQbar3S11g::initProc() {
24 // Produced state. Process name. Onium matrix element.
25 idHad = (idNew == 4) ? 443 : 553;
26 nameSave = (idNew == 4) ? "g g -> ccbar[3S1(1)] g"
27 : "g g -> bbbar[3S1(1)] g";
28 oniumME = (idNew == 4) ? Settings::parm("Charmonium:OJpsi3S11")
29 : Settings::parm("Bottomonium:OUpsilon3S11");
35 // Evaluate d(sigmaHat)/d(tHat); no explicit flavour dependence.
37 void Sigma2gg2QQbar3S11g::sigmaKin() {
39 // Calculate kinematics dependence.
43 double sig = (10. * M_PI / 81.) * m3 * ( pow2(sH * tuH)
44 + pow2(tH * usH) + pow2(uH * stH) ) / pow2( stH * tuH * usH );
47 sigma = (M_PI/sH2) * pow3(alpS) * oniumME * sig;
53 // Select identity, colour and anticolour.
55 void Sigma2gg2QQbar3S11g::setIdColAcol() {
57 // Flavours are trivial.
58 setId( id1, id2, idHad, 21);
60 // Two orientations of colour flow..
61 setColAcol( 1, 2, 2, 3, 0, 0, 1, 3);
62 if (Rndm::flat() > 0.5) swapColAcol();
66 //**************************************************************************
68 // Sigma2gg2QQbar3PJ1g class.
69 // Cross section g g -> QQbar[3PJ(1)] g (Q = c or b, J = 0, 1 or 2).
73 // Initialize process.
75 void Sigma2gg2QQbar3PJ1g::initProc() {
77 // Produced state. Process name. Onium matrix element.
79 nameSave = "illegal process";
81 idHad = (idNew == 4) ? 10441 : 10551;
82 nameSave = (idNew == 4) ? "g g -> ccbar[3P0(1)] g"
83 : "g g -> bbbar[3P0(1)] g";
84 } else if (jSave == 1) {
85 idHad = (idNew == 4) ? 20443 : 20553;
86 nameSave = (idNew == 4) ? "g g -> ccbar[3P1(1)] g"
87 : "g g -> bbbar[3P1(1)] g";
88 } else if (jSave == 2) {
89 idHad = (idNew == 4) ? 445 : 555;
90 nameSave = (idNew == 4) ? "g g -> ccbar[3P2(1)] g"
91 : "g g -> bbbar[3P2(1)] g";
93 oniumME = (idNew == 4) ? Settings::parm("Charmonium:Ochic03P01")
94 : Settings::parm("Bottomonium:Ochib03P01");
100 // Evaluate d(sigmaHat)/d(tHat); no explicit flavour dependence.
102 void Sigma2gg2QQbar3PJ1g::sigmaKin() {
104 // Useful derived kinematics quantities.
105 double pRat = (sH * uH + uH * tH + tH * sH)/ sH2;
106 double qRat = tH * uH / sH2;
107 double rRat = s3 / sH;
108 double pRat2 = pRat * pRat;
109 double pRat3 = pRat2 * pRat;
110 double pRat4 = pRat3 * pRat;
111 double qRat2 = qRat * qRat;
112 double qRat3 = qRat2 * qRat;
113 double qRat4 = qRat3 * qRat;
114 double rRat2 = rRat * rRat;
115 double rRat3 = rRat2 * rRat;
116 double rRat4 = rRat3 * rRat;
118 // Calculate kinematics dependence.
121 sig = (8. * M_PI / (9. * m3 * sH))
122 * ( 9. * rRat2 * pRat4 * (rRat4 - 2. * rRat2 * pRat + pRat2)
123 - 6. * rRat * pRat3 * qRat * (2. * rRat4 - 5. * rRat2 * pRat
124 + pRat2) - pRat2 * qRat2 * (rRat4 + 2. * rRat2 * pRat - pRat2)
125 + 2. * rRat * pRat * qRat3 * (rRat2 - pRat) + 6. * rRat2 * qRat4)
126 / (qRat * pow4(qRat - rRat * pRat));
127 } else if (jSave == 1) {
128 sig = (8. * M_PI / (3.* m3 * sH)) * pRat2
129 * (rRat * pRat2 * (rRat2 - 4. * pRat)
130 + 2. * qRat * (-rRat4 + 5. * rRat2 * pRat + pRat2)
131 - 15. * rRat * qRat2) / pow4(qRat - rRat * pRat);
132 } else if (jSave == 2) {
133 sig = (8. * M_PI / (9. * m3 * sH))
134 * (12. * rRat2 * pRat4 * (rRat4 - 2. * rRat2 * pRat + pRat2)
135 - 3. * rRat * pRat3 * qRat * (8. * rRat4 - rRat2 * pRat + 4. * pRat2)
136 + 2. * pRat2 * qRat2 * (-7. * rRat4 + 43. * rRat2 * pRat + pRat2)
137 + rRat * pRat * qRat3 * (16. * rRat2 - 61. * pRat)
138 + 12. * rRat2 * qRat4) / (qRat * pow4(qRat-rRat * pRat));
142 sigma = (M_PI/sH2) * pow3(alpS) * oniumME * sig;
148 // Select identity, colour and anticolour.
150 void Sigma2gg2QQbar3PJ1g::setIdColAcol() {
152 // Flavours are trivial.
153 setId( id1, id2, idHad, 21);
155 // Two orientations of colour flow.
156 setColAcol( 1, 2, 2, 3, 0, 0, 1, 3);
157 if (Rndm::flat() > 0.5) swapColAcol();
161 //**************************************************************************
163 // Sigma2qg2QQbar3PJ1q class.
164 // Cross section q g -> QQbar[3PJ(1)] q (Q = c or b, J = 0, 1 or 2).
168 // Initialize process.
170 void Sigma2qg2QQbar3PJ1q::initProc() {
172 // Produced state. Process name. Onium matrix element.
174 nameSave = "illegal process";
176 idHad = (idNew == 4) ? 10441 : 10551;
177 nameSave = (idNew == 4) ? "q g -> ccbar[3P0(1)] q"
178 : "q g -> bbbar[3P0(1)] q";
179 } else if (jSave == 1) {
180 idHad = (idNew == 4) ? 20443 : 20553;
181 nameSave = (idNew == 4) ? "q g -> ccbar[3P1(1)] q"
182 : "q g -> bbbar[3P1(1)] q";
183 } else if (jSave == 2) {
184 idHad = (idNew == 4) ? 445 : 555;
185 nameSave = (idNew == 4) ? "q g -> ccbar[3P2(1)] q"
186 : "q g -> bbbar[3P2(1)] q";
188 oniumME = (idNew == 4) ? Settings::parm("Charmonium:Ochic03P01")
189 : Settings::parm("Bottomonium:Ochib03P01");
195 // Evaluate d(sigmaHat)/d(tHat); no explicit flavour dependence.
197 void Sigma2qg2QQbar3PJ1q::sigmaKin() {
199 // Calculate kinematics dependence.
200 double usH = uH + sH;
203 sig = - (16. * M_PI / 81.) * pow2(tH - 3. * s3) * (sH2 + uH2)
204 / (m3 * tH * pow4(usH));
205 } else if (jSave == 1) {
206 sig = - (32. * M_PI / 27.) * (4. * s3 * sH * uH + tH * (sH2 + uH2))
208 } else if (jSave == 2) {
209 sig = - (32. *M_PI / 81.) * ( (6. * s3*s3 + tH2) * pow2(usH)
210 - 2. * sH * uH * (tH2 + 6. * s3 * usH)) / (m3 * tH * pow4(usH));
214 sigma = (M_PI/sH2) * pow3(alpS) * oniumME * sig;
220 // Select identity, colour and anticolour.
222 void Sigma2qg2QQbar3PJ1q::setIdColAcol() {
224 // Flavours are trivial.
225 int idq = (id2 == 21) ? id1 : id2;
226 setId( id1, id2, idHad, idq);
228 // tH defined between q_in and q_out: must swap tHat <-> uHat if q g in.
229 swapTU = (id2 == 21);
231 // Colour flow topologies. Swap when antiquarks.
232 if (id2 == 21) setColAcol( 1, 0, 2, 1, 0, 0, 2, 0);
233 else setColAcol( 2, 1, 1, 0, 0, 0, 2, 0);
234 if (idq < 0) swapColAcol();
238 //**************************************************************************
240 // Sigma2qqbar2QQbar3PJ1g class.
241 // Cross section q qbar -> QQbar[3PJ(1)] g (Q = c or b, J = 0, 1 or 2).
245 // Initialize process.
247 void Sigma2qqbar2QQbar3PJ1g::initProc() {
249 // Produced state. Process name. Onium matrix element.
251 nameSave = "illegal process";
253 idHad = (idNew == 4) ? 10441 : 10551;
254 nameSave = (idNew == 4) ? "q qbar -> ccbar[3P0(1)] g"
255 : "q qbar -> bbbar[3P0(1)] g";
256 } else if (jSave == 1) {
257 idHad = (idNew == 4) ? 20443 : 20553;
258 nameSave = (idNew == 4) ? "q qbar -> ccbar[3P1(1)] g"
259 : "q qbar -> bbbar[3P1(1)] g";
260 } else if (jSave == 2) {
261 idHad = (idNew == 4) ? 445 : 555;
262 nameSave = (idNew == 4) ? "q qbar -> ccbar[3P2(1)] g"
263 : "q qbar -> bbbar[3P2(1)] g";
265 oniumME = (idNew == 4) ? Settings::parm("Charmonium:Ochic03P01")
266 : Settings::parm("Bottomonium:Ochib03P01");
272 // Evaluate d(sigmaHat)/d(tHat); no explicit flavour dependence.
274 void Sigma2qqbar2QQbar3PJ1g::sigmaKin() {
276 // Calculate kinematics dependence.
277 double tuH = tH + uH;
280 sig =(128. * M_PI / 243.) * pow2(sH - 3. * s3) * (tH2 + uH2)
281 / (m3 * sH * pow4(tuH));
282 } else if (jSave == 1) {
283 sig = (256. * M_PI / 81.) * (4. * s3 * tH * uH + sH * (tH2 + uH2))
285 } else if (jSave == 2) {
286 sig = (256. * M_PI / 243.) * ( (6. * s3*s3 + sH2) * pow2(tuH)
287 - 2. * tH * uH * (sH2 + 6. * s3 * tuH) )/ (m3 * sH * pow4(tuH));
291 sigma = (M_PI/sH2) * pow3(alpS) * oniumME * sig;
297 // Select identity, colour and anticolour.
299 void Sigma2qqbar2QQbar3PJ1g::setIdColAcol() {
301 // Flavours are trivial.
302 setId( id1, id2, idHad, 21);
304 // Colour flow topologies. Swap when antiquarks.
305 setColAcol( 1, 0, 0, 2, 0, 0, 1, 2);
306 if (id1 < 0) swapColAcol();
310 //**************************************************************************
312 // Sigma2gg2QQbarX8g class.
313 // Cross section g g -> QQbar[X(8)] g (Q = c or b, X = 3S1, 1S0 or 3PJ).
317 // Initialize process.
319 void Sigma2gg2QQbarX8g::initProc() {
321 // Produced state. Process name. Onium matrix element.
323 nameSave = "illegal process";
324 if (stateSave == 0) {
325 idHad = (idNew == 4) ? 9900443 : 9900553;
326 nameSave = (idNew == 4) ? "g g -> ccbar[3S1(8)] g"
327 : "g g -> bbbar[3S1(8)] g";
328 oniumME = (idNew == 4) ? Settings::parm("Charmonium:OJpsi3S18")
329 : Settings::parm("Bottomonium:OUpsilon3S18");
330 } else if (stateSave == 1) {
331 idHad = (idNew == 4) ? 9900441 : 9900551;
332 nameSave = (idNew == 4) ? "g g -> ccbar[1S0(8)] g"
333 : "g g -> bbbar[1S0(8)] g";
334 oniumME = (idNew == 4) ? Settings::parm("Charmonium:OJpsi1S08")
335 : Settings::parm("Bottomonium:OUpsilon1S08");
336 } else if (stateSave == 2) {
337 idHad = (idNew == 4) ? 9910441 : 9910551;
338 nameSave = (idNew == 4) ? "g g -> ccbar[3PJ(8)] g"
339 : "g g -> bbbar[3PJ(8)] g";
340 oniumME = (idNew == 4) ? Settings::parm("Charmonium:OJpsi3P08")
341 : Settings::parm("Bottomonium:OUpsilon3P08");
348 // Evaluate d(sigmaHat)/d(tHat); no explicit flavour dependence.
350 void Sigma2gg2QQbarX8g::sigmaKin() {
352 // Calculate kinematics dependence.
353 double stH = sH + tH;
354 double tuH = tH + uH;
355 double usH = uH + sH;
357 if (stateSave == 0) {
358 sig = (M_PI / 72.) * m3 * ( 27. * (pow2(stH) + pow2(tuH)
359 + pow2(usH)) / (s3*s3) - 16. ) * ( pow2(sH * tuH)
360 + pow2(tH * usH) + pow2(uH * stH) ) / pow2( stH * tuH * usH );
361 } else if (stateSave == 1) {
362 sig = (5. * M_PI / 16.) * m3 * ( pow2(uH / (tuH * usH))
363 + pow2(sH / (stH * usH)) + pow2(tH / (stH * tuH)) ) * ( 12.
364 + (pow4(stH) + pow4(tuH) + pow4(usH)) / (s3 * sH * tH * uH) );
365 } else if (stateSave == 2) {
366 double sH3 = sH2 * sH;
367 double sH4 = sH3 * sH;
368 double sH5 = sH4 * sH;
369 double sH6 = sH5 * sH;
370 double sH7 = sH6 * sH;
371 double sH8 = sH7 * sH;
372 double tH3 = tH2 * tH;
373 double tH4 = tH3 * tH;
374 double tH5 = tH4 * tH;
375 double tH6 = tH5 * tH;
376 double tH7 = tH6 * tH;
377 double tH8 = tH7 * tH;
378 double ssttH = sH * sH + sH * tH + tH * tH;
379 sig = 5. * M_PI * (3. * sH * tH * stH * pow4(ssttH)
380 - s3 * pow2(ssttH) * (7. * sH6 + 36. * sH5 * tH + 45. * sH4 * tH2
381 + 28. * sH3 * tH3 + 45. * sH2 * tH4 + 36. * sH * tH5 + 7. * tH6)
382 + pow2(s3) * stH * (35. *sH8 + 169. * sH7 * tH + 299. * sH6 * tH2
383 + 401. * sH5 * tH3 + 418. * sH4 * tH4 + 401. * sH3 * tH5
384 + 299. * sH2 * tH6 + 169. * sH * tH7 + 35. * tH8)
385 - pow3(s3) * (84. *sH8+432. *sH7*tH+905. *sH6*tH2
386 + 1287. * sH5 * tH3 + 1436. * sH4 * tH4 +1287. * sH3 * tH5
387 + 905. * sH2 * tH6 + 432. * sH * tH7 + 84. * tH8)
388 + pow4(s3) * stH * (126. * sH6 + 451. * sH5 * tH +677. * sH4 * tH2
389 + 836. * sH3 * tH3 + 677. * sH2 * tH4 + 451. * sH * tH5
391 - pow5(s3) * 3. * (42. * sH6 + 171. * sH5 * tH + 304. * sH4 * tH2
392 + 362. * sH3 * tH3 + 304. * sH2 * tH4 + 171. * sH * tH5
394 + pow3(s3 * s3) * 2. * stH * (42. * sH4 + 106. * sH3 * tH
395 + 119. * sH2 * tH2 + 106. * sH * tH3 + 42. * tH4)
396 - pow4(s3) * pow3(s3) * (35. * sH4 + 99. * sH3 * tH
397 + 120. * sH2 * tH2 + 99. * sH * tH3 + 35. * tH4)
398 + pow4(s3 * s3) * 7. * stH * ssttH)
399 / (sH * tH * uH * s3 * m3 * pow3(stH * tuH * usH));
403 sigma = (M_PI/sH2) * pow3(alpS) * oniumME * sig;
409 // Select identity, colour and anticolour.
411 void Sigma2gg2QQbarX8g::setIdColAcol() {
413 // Flavours are trivial.
414 setId( id1, id2, idHad, 21);
416 // Split total contribution into different colour flows just like in
417 // g g -> g g (with kinematics recalculated for massless partons).
418 double sHr = - (tH + uH);
419 double sH2r = sHr * sHr;
420 double sigTS = tH2/sH2r + 2.*tH/sHr + 3. + 2.*sHr/tH + sH2r/tH2;
421 double sigUS = uH2/sH2r + 2.*uH/sHr + 3. + 2.*sHr/uH + sH2r/uH2;
422 double sigTU = tH2/uH2 + 2.*tH/uH + 3. + 2.*uH/tH + uH2/tH2;
423 double sigSum = sigTS + sigUS + sigTU;
425 // Three colour flow topologies, each with two orientations.
426 double sigRand = sigSum * Rndm::flat();
427 if (sigRand < sigTS) setColAcol( 1, 2, 2, 3, 1, 4, 4, 3);
428 else if (sigRand < sigTS + sigUS)
429 setColAcol( 1, 2, 3, 1, 3, 4, 4, 2);
430 else setColAcol( 1, 2, 3, 4, 1, 4, 3, 2);
431 if (Rndm::flat() > 0.5) swapColAcol();
436 //**************************************************************************
438 // Sigma2qg2QQbarX8q class.
439 // Cross section q g -> QQbar[X(8)] q (Q = c or b, X = 3S1, 1S0 or 3PJ).
443 // Initialize process.
445 void Sigma2qg2QQbarX8q::initProc() {
447 // Produced state. Process name. Onium matrix element.
449 nameSave = "illegal process";
450 if (stateSave == 0) {
451 idHad = (idNew == 4) ? 9900443 : 9900553;
452 nameSave = (idNew == 4) ? "q g -> ccbar[3S1(8)] q"
453 : "q g -> bbbar[3S1(8)] q";
454 oniumME = (idNew == 4) ? Settings::parm("Charmonium:OJpsi3S18")
455 : Settings::parm("Bottomonium:OUpsilon3S18");
456 } else if (stateSave == 1) {
457 idHad = (idNew == 4) ? 9900441 : 9900551;
458 nameSave = (idNew == 4) ? "q g -> ccbar[1S0(8)] q"
459 : "q g -> bbbar[1S0(8)] q";
460 oniumME = (idNew == 4) ? Settings::parm("Charmonium:OJpsi1S08")
461 : Settings::parm("Bottomonium:OUpsilon1S08");
462 } else if (stateSave == 2) {
463 idHad = (idNew == 4) ? 9910441 : 9910551;
464 nameSave = (idNew == 4) ? "q g -> ccbar[3PJ(8)] q"
465 : "q g -> bbbar[3PJ(8)] q";
466 oniumME = (idNew == 4) ? Settings::parm("Charmonium:OJpsi3P08")
467 : Settings::parm("Bottomonium:OUpsilon3P08");
474 // Evaluate d(sigmaHat)/d(tHat); no explicit flavour dependence.
476 void Sigma2qg2QQbarX8q::sigmaKin() {
478 // Calculate kinematics dependence.
479 double stH = sH + tH;
480 double tuH = tH + uH;
481 double usH = uH + sH;
482 double stH2 = stH * stH;
483 double tuH2 = tuH * tuH;
484 double usH2 = usH * usH;
486 if (stateSave == 0) {
487 sig = - (M_PI / 27.)* (4. * (sH2 + uH2) - sH * uH) * (stH2 +tuH2)
488 / (s3 * m3 * sH * uH * usH2);
489 } else if (stateSave == 1) {
490 sig = - (5. * M_PI / 18.) * (sH2 + uH2) / (m3 * tH * usH2);
491 } else if (stateSave == 2) {
492 sig = - (10. * M_PI / 9.) * ( (7. * usH + 8. * tH) * (sH2 + uH2)
493 + 4. * tH * (2. * pow2(s3) - stH2 - tuH2) )
494 / (s3 * m3 * tH * usH2 * usH);
498 sigma = (M_PI/sH2) * pow3(alpS) * oniumME * sig;
504 // Select identity, colour and anticolour.
506 void Sigma2qg2QQbarX8q::setIdColAcol() {
508 // Flavours are trivial.
509 int idq = (id2 == 21) ? id1 : id2;
510 setId( id1, id2, idHad, idq);
512 // tH defined between q_in and q_out: must swap tHat <-> uHat if q g in.
513 swapTU = (id2 == 21);
515 // Split total contribution into different colour flows just like in
516 // q g -> q g (with kinematics recalculated for massless partons).
517 double sHr = - (tH + uH);
518 double sH2r = sHr * sHr;
519 double sigTS = uH2/tH2 - (4./9.) * uH/sHr;
520 double sigTU = sH2r/tH2 - (4./9.) * sHr/uH;
521 double sigSum = sigTS + sigTU;
523 // Two colour flow topologies. Swap if first is gluon, or when antiquark.
524 double sigRand = sigSum * Rndm::flat();
525 if (sigRand < sigTS) setColAcol( 1, 0, 2, 1, 2, 3, 3, 0);
526 else setColAcol( 1, 0, 2, 3, 1, 3, 2, 0);
527 if (id1 == 21) swapCol12();
528 if (idq < 0) swapColAcol();
532 //**************************************************************************
534 // Sigma2qqbar2QQbarX8g class.
535 // Cross section q qbar -> QQbar[X(8)] g (Q = c or b, X = 3S1, 1S0 or 3PJ).
539 // Initialize process.
541 void Sigma2qqbar2QQbarX8g::initProc() {
543 // Produced state. Process name. Onium matrix element.
545 nameSave = "illegal process";
546 if (stateSave == 0) {
547 idHad = (idNew == 4) ? 9900443 : 9900553;
548 nameSave = (idNew == 4) ? "q qbar -> ccbar[3S1(8)] g"
549 : "q qbar -> bbbar[3S1(8)] g";
550 oniumME = (idNew == 4) ? Settings::parm("Charmonium:OJpsi3S18")
551 : Settings::parm("Bottomonium:OUpsilon3S18");
552 } else if (stateSave == 1) {
553 idHad = (idNew == 4) ? 9900441 : 9900551;
554 nameSave = (idNew == 4) ? "q qbar -> ccbar[1S0(8)] g"
555 : "q qbar -> bbbar[1S0(8)] g";
556 oniumME = (idNew == 4) ? Settings::parm("Charmonium:OJpsi1S08")
557 : Settings::parm("Bottomonium:OUpsilon1S08");
558 } else if (stateSave == 2) {
559 idHad = (idNew == 4) ? 9910441 : 9910551;
560 nameSave = (idNew == 4) ? "q qbar -> ccbar[3PJ(8)] g"
561 : "q qbar -> bbbar[3PJ(8)] g";
562 oniumME = (idNew == 4) ? Settings::parm("Charmonium:OJpsi3P08")
563 : Settings::parm("Bottomonium:OUpsilon3P08");
570 // Evaluate d(sigmaHat)/d(tHat); no explicit flavour dependence.
572 void Sigma2qqbar2QQbarX8g::sigmaKin() {
574 // Calculate kinematics dependence.
575 double stH = sH + tH;
576 double tuH = tH + uH;
577 double usH = uH + sH;
578 double stH2 = stH * stH;
579 double tuH2 = tuH * tuH;
580 double usH2 = usH * usH;
582 if (stateSave == 0) {
583 sig = (8. * M_PI / 81.) * (4. * (tH2 + uH2) - tH * uH)
584 * (stH2 + usH2) / (s3 * m3 * tH * uH * tuH2);
585 } else if (stateSave == 1) {
586 sig = (20. * M_PI / 27.) * (tH2 + uH2) / (m3 * sH * tuH2);
587 } else if (stateSave == 2) {
588 sig = (80. * M_PI / 27.) * ( (7. * tuH + 8. * sH) * (tH2 + uH2)
589 + 4. * sH * (2. * pow2(s3) - stH2 -usH2) )
590 / (s3 * m3 * sH * tuH2 * tuH);
594 sigma = (M_PI/sH2) * pow3(alpS) * oniumME * sig;
600 // Select identity, colour and anticolour.
602 void Sigma2qqbar2QQbarX8g::setIdColAcol() {
604 // Flavours are trivial.
605 setId( id1, id2, idHad, 21);
607 // Split total contribution into different colour flows just like in
608 // q qbar -> g g (with kinematics recalculated for massless partons).
609 double sHr = - (tH + uH);
610 double sH2r = sHr * sHr;
611 double sigTS = (4. / 9.) * uH / tH - uH2 / sH2r;
612 double sigUS = (4. / 9.) * tH / uH - tH2 / sH2r;
613 double sigSum = sigTS + sigUS;
615 // Two colour flow topologies. Swap if first is antiquark.
616 double sigRand = sigSum * Rndm::flat();
617 if (sigRand < sigTS) setColAcol( 1, 0, 0, 2, 1, 3, 3, 2);
618 else setColAcol( 1, 0, 0, 2, 3, 2, 1, 3);
619 if (id1 < 0) swapColAcol();
623 //**************************************************************************
625 } // end namespace Pythia8