StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
SigmaDM.cc
1 // SigmaDM.cc is a part of the PYTHIA event generator.
2 // Copyright (C) 2020 Torbjorn Sjostrand.
3 // PYTHIA is licenced under the GNU GPL v2 or later, see COPYING for details.
4 // Please respect the MCnet Guidelines, see GUIDELINES for details.
5 
6 // Function definitions (not found in the header) for the
7 // Dark Matter simulation classes.
8 
9 #include "Pythia8/SigmaDM.h"
10 
11 namespace Pythia8 {
12 
13 //==========================================================================
14 
15 // Sigma2ffbar2Zp2XX.
16 // Cross section for f fbar' -> Zprime -> XX. (Zprime a.k.a. DMmed(s=1).)
17 
18 //--------------------------------------------------------------------------
19 
20 // Initialize process.
21 
22 void Sigma1ffbar2Zp2XX::initProc() {
23 
24  // Store mass and width for propagator, and couplings.
25  kinMix = parm("Zp:kineticMixing");
26  mRes = particleDataPtr->m0(55);
27  GammaRes = particleDataPtr->mWidth(55);
28  m2Res = mRes*mRes;
29  alpEM = coupSMPtr->alphaEM(m2Res);
30  gZp = parm("Zp:gZp");
31  eps = parm("Zp:epsilon");
32 
33  // Set pointer to particle properties and decay table.
34  particlePtr = particleDataPtr->particleDataEntryPtr(55);
35 
36  // Loop over all Zp decay channels.
37  double mf, mr, psvec, psaxi, betaf;
38  int decMode = mode("Zp:decayMode");
39  preFac = 0.0;
40  for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
41  int idAbs = abs( particlePtr->channel(i).product(0));
42  double vf = 0.;
43  double af = 0.;
44 
45  // Turn off decay modes depending on settings.
46  bool turnOff = false;
47  // DM-only.
48  if (idAbs != 52 && decMode == 0) turnOff = true;
49  // Dijet only.
50  else if (decMode == 1 && idAbs > 10) turnOff = true;
51  else if (decMode > 1) {
52  if (idAbs < 10 || idAbs > 20) turnOff = true;
53  // Dilepton.
54  if (decMode == 2 && idAbs %2 == 0 ) turnOff = true;
55  // Invisible to neutrinos.
56  if (decMode == 3 && idAbs %2 ) turnOff = true;
57  }
58  if (turnOff) {
59  particlePtr->channel(i).onMode(0);
60  continue;
61  }
62 
63  // Set couplings: quarks.
64  if (idAbs < 7) {
65  if (abs(id1)%2 == 0) {
66  if (kinMix) {
67  vf = eps * (2./3. + coupSMPtr->vf(2));
68  af = eps * coupSMPtr->af(2);
69  } else {
70  vf = parm("Zp:vu");
71  af = parm("Zp:au");
72  }
73  } else {
74  if (kinMix) {
75  vf = eps * (-1./3. + coupSMPtr->vf(1));
76  af = eps * coupSMPtr->af(1);
77  } else {
78  vf = parm("Zp:vd");
79  af = parm("Zp:ad");
80  }
81  }
82  }
83 
84  // Set couplings: leptons.
85  if (idAbs > 10 && idAbs < 17) {
86  if (abs(id1)%2 == 0) {
87  if (kinMix) {
88  vf = eps * coupSMPtr->vf(12);
89  af = eps * coupSMPtr->af(12);
90  } else {
91  vf = parm("Zp:vv");
92  af = parm("Zp:av");
93  }
94  } else {
95  if (kinMix) {
96  vf = eps * (-1. + coupSMPtr->vf(11));
97  af = eps * coupSMPtr->af(11);
98  } else {
99  vf = parm("Zp:vl");
100  af = parm("Zp:al");
101  }
102  }
103  }
104 
105  // Set couplings: DM.
106  if (idAbs == 52) {
107  vf = parm("Zp:vX");
108  af = parm("Zp:aX");
109  }
110 
111  // Check that mass is above threshold. Calculate phase space.
112  mf = particleDataPtr->m0(idAbs);
113  if (mRes > 2. * mf + MASSMARGIN) {
114  mr = pow2(mf / mRes);
115  betaf = sqrtpos(1. - 4. * mr);
116  psvec = betaf * (1. + 2. * mr);
117  psaxi = pow3(betaf);
118  // For kinetic mixing, coupling to SM fermions is through EM coupling.
119  double fac = (kinMix && idAbs != 52) ? 4.0 * M_PI * alpEM : pow2(gZp);
120  if (idAbs < 10) fac *= 3.0;
121  preFac += fac * (vf * vf * psvec + af * af * psaxi ) ;
122 
123  }
124  }
125 
126 }
127 
128 //--------------------------------------------------------------------------
129 
130 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
131 
132 void Sigma1ffbar2Zp2XX::sigmaKin() {
133 
134  sigma0 = mRes / ( pow2(sH - m2Res) + pow2(mRes * GammaRes) );
135 
136 }
137 
138 //--------------------------------------------------------------------------
139 
140 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
141 
142 double Sigma1ffbar2Zp2XX::sigmaHat() {
143 
144  // Check for allowed flavour combinations.
145  if (id1 + id2 != 0 || abs(id1) > 6 ) return 0.;
146 
147  // Set couplings of incoming quarks.
148  double vf, af;
149  if (abs(id1)%2 == 0) {
150  if (kinMix) {
151  vf = eps * coupSMPtr->vf(2);
152  af = eps * coupSMPtr->af(2);
153  } else {
154  vf = parm("Zp:vu");
155  af = parm("Zp:au");
156  }
157  } else {
158  if (kinMix) {
159  vf = eps * coupSMPtr->vf(1);
160  af = eps * coupSMPtr->af(1);
161  } else {
162  vf = parm("Zp:vd");
163  af = parm("Zp:ad");
164  }
165  }
166 
167  // Combine for cross section.
168  double coup = pow2(gZp);
169  if (kinMix) coup = 4.0 * M_PI * alpEM;
170  double vf2af2 = coup * (vf * vf + af * af);
171  double sigma = preFac * sigma0 * vf2af2;
172 
173  // Colour factor.
174  if (abs(id1) < 7) sigma /= 3;
175 
176  // Answer.
177  return sigma;
178 
179 }
180 
181 //--------------------------------------------------------------------------
182 
183 // Select identity, colour and anticolour.
184 
185 void Sigma1ffbar2Zp2XX::setIdColAcol() {
186 
187  setId(id1, id2, 55);
188  // Colour flow topologies. Swap when antiquarks.
189  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
190  else setColAcol( 0, 0, 0, 0, 0, 0);
191  if (id1 < 0) swapColAcol();
192 
193 }
194 
195 //==========================================================================
196 
197 // Sigma2qqbar2Zpg2XXj.
198 // Cross section for q qbar -> Zprime -> XX + jet. (Zprime a.k.a. DMmed(s=1).)
199 
200 //--------------------------------------------------------------------------
201 
202 // Initialize process.
203 
204 void Sigma2qqbar2Zpg2XXj::initProc() {
205 
206  // Store mass and width for propagator, and couplings.
207  kinMix = flag("Zp:kineticMixing");
208  mRes = particleDataPtr->m0(55);
209  GammaRes = particleDataPtr->mWidth(55);
210  m2Res = mRes*mRes;
211  alpEM = coupSMPtr->alphaEM(m2Res);
212  gZp = parm("Zp:gZp");
213  eps = parm("Zp:epsilon");
214 
215  // Set pointer to particle properties and decay table.
216  particlePtr = particleDataPtr->particleDataEntryPtr(55);
217 
218  // Turn off all decay modes except DM (dark photon).
219  preFac = 0.0;
220  for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
221  int idAbs = abs( particlePtr->channel(i).product(0));
222  if (idAbs < 20) particlePtr->channel(i).onMode(0);
223  }
224  preFac = particleDataPtr->resOpenFrac(52, -52);
225 
226 }
227 
228 //--------------------------------------------------------------------------
229 
230 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
231 
232 void Sigma2qqbar2Zpg2XXj::sigmaKin() {
233 
234  double propZp = s3 / ( pow2(s3 - m2Res) + pow2(mRes * GammaRes) );
235  double alpD = pow2(gZp) / 4.0 / M_PI;
236  if (kinMix) alpD = alpEM;
237  sigma0 = (M_PI / sH2) * (alpD * alpS) * propZp
238  * (2./9.) * (tH2 + uH2 + 2. * sH * s3) / (tH * uH);
239 
240 }
241 
242 //--------------------------------------------------------------------------
243 
244 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
245 
246 double Sigma2qqbar2Zpg2XXj::sigmaHat() {
247 
248  // Check for allowed flavour combinations
249  if (id1 + id2 != 0 || abs(id1) > 6 ) return 0.;
250 
251  // Set couplings of incoming quarks.
252  double vf, af;
253  if (abs(id1)%2 == 0) {
254  if (kinMix) {
255  vf = eps * coupSMPtr->vf(2);
256  af = eps * coupSMPtr->af(2);
257  } else {
258  vf = parm("Zp:vu");
259  af = parm("Zp:au");
260  }
261  } else {
262  if (kinMix) {
263  vf = eps * coupSMPtr->vf(1);
264  af = eps * coupSMPtr->af(1);
265  } else {
266  vf = parm("Zp:vd");
267  af = parm("Zp:ad");
268  }
269  }
270 
271  // Combine for cross section.
272  double vf2af2 = vf * vf + af * af;
273  double sigma = sigma0 * vf2af2 * preFac;
274 
275  // Answer.
276  return sigma;
277 
278 }
279 
280 //--------------------------------------------------------------------------
281 
282 // Select identity, colour and anticolour.
283 
284 void Sigma2qqbar2Zpg2XXj::setIdColAcol() {
285 
286  setId(id1, id2, 55, 21);
287 
288  // Colour flow topologies.
289  if (id1 > 0) setColAcol( 1, 0, 0, 2, 0, 0, 1, 2);
290  else setColAcol( 0, 2, 1, 0, 0, 0, 1, 2);
291 
292 }
293 
294 //==========================================================================
295 
296 // Sigma2ffbar2Zp2H.
297 // Cross section for f fbar' -> Zprime H.
298 
299 //--------------------------------------------------------------------------
300 
301 // Initialize process.
302 
303 void Sigma2ffbar2ZpH::initProc() {
304 
305  // Store mass and width for propagator, and couplings.
306  kinMix = flag("Zp:kineticMixing");
307  mRes = particleDataPtr->m0(55);
308  GammaRes = particleDataPtr->mWidth(55);
309  m2Res = mRes*mRes;
310  coupZpH = parm("Zp:coupH");
311  gZp = parm("Zp:gZp");
312  eps = parm("Zp:epsilon");
313  if (kinMix) coupZpH = eps;
314 
315  // Set pointer to particle properties and decay table.
316  particlePtr = particleDataPtr->particleDataEntryPtr(55);
317 
318  // Secondary open width fraction.
319  openFrac = particleDataPtr->resOpenFrac(55, 25);
320 
321 }
322 
323 //--------------------------------------------------------------------------
324 
325 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
326 
327 void Sigma2ffbar2ZpH::sigmaKin() {
328 
329  double denom = (pow2(sH - m2Res) + pow2(mRes * GammaRes));
330  sigma0 = (M_PI / sH2) * 8. * pow2(gZp * coupZpH)
331  * (tH * uH - s3 * s4 + 2. * sH * s4);
332  sigma0 /= denom;
333 
334 }
335 
336 //--------------------------------------------------------------------------
337 
338 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
339 
340 double Sigma2ffbar2ZpH::sigmaHat() {
341 
342  // Check for allowed flavour combinations.
343  if (id1 + id2 != 0 ) return 0.;
344 
345  // Coupling a_f^2 + v_f^2 to s-channel Zp and colour factor.
346  double vf = 0., af = 0.;
347  if (abs(id1)%2 == 0) {
348  if (kinMix) {
349  vf = eps * coupSMPtr->vf(2);
350  af = eps * coupSMPtr->af(2);
351  } else {
352  vf = parm("Zp:vu");
353  af = parm("Zp:au");
354  }
355  } else {
356  if (kinMix) {
357  vf = eps * coupSMPtr->vf(1);
358  af = eps * coupSMPtr->af(1);
359  } else {
360  vf = parm("Zp:vd");
361  af = parm("Zp:ad");
362  }
363  }
364 
365  // Combine for cross section, inbcluding colour factor.
366  double sigma = sigma0 * (vf * vf + af * af);
367  if (abs(id1) < 9) sigma /= 3.;
368 
369  // Secondary width for Zp and H.
370  sigma *= openFrac;
371 
372  // Answer.
373  return sigma;
374 
375 }
376 
377 //--------------------------------------------------------------------------
378 
379 // Select identity, colour and anticolour.
380 
381 void Sigma2ffbar2ZpH::setIdColAcol() {
382 
383  setId(id1, id2, 55, 25);
384  // Colour flow topologies. Swap when antiquarks.
385  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
386  else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
387  if (id1 < 0) swapColAcol();
388 
389 }
390 
391 //==========================================================================
392 
393 // Sigma2ffbar2S2XX.
394 // Cross section for f fbar' -> S -> XX.
395 
396 //--------------------------------------------------------------------------
397 
398 // Initialize process.
399 
400 void Sigma1gg2S2XX::initProc() {
401 
402  // Store mass and width for propagator.
403  mRes = particleDataPtr->m0(54);
404  GammaRes = particleDataPtr->mWidth(54);
405  m2Res = mRes*mRes;
406 
407  // Set pointer to particle properties and decay table.
408  particlePtr = particleDataPtr->particleDataEntryPtr(54);
409 
410  // Turn off all decay modes except DM.
411  for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
412  int idAbs = abs( particlePtr->channel(i).product(0));
413  if (idAbs != 52) particlePtr->channel(i).onMode(0);
414  }
415 
416 }
417 
418 //--------------------------------------------------------------------------
419 
420 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
421 
422 void Sigma1gg2S2XX::sigmaKin() {
423 
424  double propS = sH / ( pow2(sH - m2Res) + pow2(mRes * GammaRes) );
425  sigma0 = 8. * M_PI * propS;
426 
427 }
428 
429 //--------------------------------------------------------------------------
430 
431 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
432 
433 double Sigma1gg2S2XX::sigmaHat() {
434 
435  // Check for allowed flavour combinations
436  if (id1 != id2 || abs(id1) != 21 ) return 0.;
437 
438  // Incoming gg -> S width, colour-corrected.
439  double widthIn = particlePtr->resWidthChan( mRes, 21, 21) / 64.;
440 
441  // Width out only includes open channels.
442  double widthOut = particlePtr->resWidthChan( mRes, 52, -52);
443 
444  // Done.
445  double sigma = widthIn * sigma0 * widthOut;
446 
447  // Answer.
448  return sigma;
449 
450 }
451 
452 //--------------------------------------------------------------------------
453 
454 // Select identity, colour and anticolour.
455 
456 void Sigma1gg2S2XX::setIdColAcol() {
457 
458  setId(id1, id2, 54);
459  setColAcol( 1, 2, 2, 1, 0, 0);
460 
461 }
462 
463 //==========================================================================
464 
465 // Sigma2gg2Sg2XXj.
466 // Cross section for g g -> S g -> XX + jet.
467 
468 //--------------------------------------------------------------------------
469 
470 // Initialize process.
471 
472 void Sigma2gg2Sg2XXj::initProc() {
473 
474  // Store mass and width for propagator.
475  mRes = particleDataPtr->m0(54);
476  GammaRes = particleDataPtr->mWidth(54);
477  m2Res = mRes*mRes;
478 
479  // Set pointer to particle properties and decay table.
480  particlePtr = particleDataPtr->particleDataEntryPtr(54);
481 
482  // Turn off all decay modes except DM.
483  for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
484  int idAbs = abs( particlePtr->channel(i).product(0));
485  if (idAbs != 52) particlePtr->channel(i).onMode(0);
486  }
487 
488 }
489 
490 //--------------------------------------------------------------------------
491 
492 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
493 
494 void Sigma2gg2Sg2XXj::sigmaKin() {
495 
496  double wid = particlePtr->resWidthChan(m3, 21, 21);
497  sigma0 = (M_PI / sH2) * (3. / 16.) * alpS * (wid / m3)
498  * (sH2 * sH2 + tH2 * tH2 + uH2 * uH2 + pow2(sH2))
499  / (sH * tH * uH * sH);
500 
501 }
502 
503 //--------------------------------------------------------------------------
504 
505 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
506 
507 double Sigma2gg2Sg2XXj::sigmaHat() {
508 
509  return sigma0 * particlePtr->resWidthChan(mRes, 52, -52);
510 
511 }
512 
513 //--------------------------------------------------------------------------
514 
515 // Select identity, colour and anticolour.
516 
517 void Sigma2gg2Sg2XXj::setIdColAcol() {
518 
519  setId(id1, id2, 54, 21);
520 
521  if( rndmPtr->flat() < 0.5)
522  setColAcol( 1, 2, 3, 1, 0, 0, 3, 2);
523  else
524  setColAcol( 1, 2, 2, 3, 0, 0, 1, 3);
525 
526 }
527 
528 //==========================================================================
529 
530 void Sigma2qqbar2DY::initProc() {
531 
532  // Type of model, notably outgoing DM particle pair.
533  type = mode("DM:DYtype");
534  nplet = mode("DM:Nplet");
535  if (type == 1) {
536  nameSave = "q qbar -> Sl(DM) Sl(DM)*";
537  id3 = 56;
538  id4 = -56;
539  } else if (type == 2) {
540  nameSave = "q qbar -> X+ X-";
541  id3 = 57;
542  id4 = -57;
543  } else if (type == 3) {
544  nameSave = "q qbar -> X++ X--";
545  id3 = 59;
546  id4 = -59;
547  } else if (type == 4) {
548  nameSave = "q qbar' -> X2 X+ + c.c.";
549  id3 = 57;
550  id4 = 58;
551  isUD = true;
552  }
553 
554  // Set particle masses based on couplings (next-to-minimal DM).
555  M1 = parm("DM:M1");
556  M2 = parm("DM:M2");
557  Lambda = parm("DM:Lambda");
558 
559  // Mixing parameters.
560  double vev = 174.0;
561  double mixing = vev / Lambda;
562  if (type > 1) mixing *= sqrt(2) * vev;
563  if (type > 2) mixing *= pow2(vev) / pow2(Lambda) / sqrt(12);
564  double term1 = sqrt(pow2(M2 - M1) + pow2(mixing));
565  double sin2th = 0.5 * (1 - abs(M2 - M1) / term1);
566 
567  // Switch to find n-plet neutral partner.
568  if (type >= 2) {
569 
570  // Z couplings for singly and doubly charged partners.
571  coupW11 = sqrt(sin2th); // chi+ chi1
572  coupW12 = sqrt(1.0 - sin2th); // chi+ chi2
573  coupW2 = 1.0; // chi++ chi+
574  if (nplet == 3) {
575  coupW11 *= sqrt(3);
576  coupW12 *= sqrt(3);
577  coupW2 *= sqrt(3);
578  }
579  if (type == 4 && coupW12 < coupW11) {
580  id4 = 52;
581  }
582  }
583 
584  // Set propagator mass.
585  if (!isUD) {
586  mRes = particleDataPtr->m0(23);
587  GammaRes = particleDataPtr->mWidth(23);
588  m2Res = mRes*mRes;
589  } else {
590  mRes = particleDataPtr->m0(24);
591  GammaRes = particleDataPtr->mWidth(24);
592  m2Res = mRes*mRes;
593  }
594  xW = coupSMPtr->sin2thetaW();
595 
596  // Secondary open width fraction.
597  openFracPair = particleDataPtr->resOpenFrac(id3, id4);
598 
599 }
600 //--------------------------------------------------------------------------
601 
602 void Sigma2qqbar2DY::sigmaKin() {
603 
604  // Z/W propagator.
605  double sV = sH - m2Res;
606  double d = pow2(sV) + pow2(mRes * GammaRes);
607  propRes = complex( sV / d, mRes * GammaRes / d);
608 
609  sigma0 = M_PI/(4 * sH2) * openFracPair * pow2(alpEM);
610 
611 }
612 
613 //--------------------------------------------------------------------------
614 
615 double Sigma2qqbar2DY::sigmaHat() {
616 
617  // In-pair must be opposite-sign.
618  if (id1 * id2 > 0) return 0.0;
619 
620  // Common factor for LR and RL contributions.
621  double facTU = uH*tH-s3*s4;
622  int id1A = abs(id1);
623  double eQ = (id1A%2 == 0) ? 2./3. : -1./3. ;
624  double eSl = -1. ;
625  double LqZ = coupSMPtr->lf(abs(id1));
626  double RqZ = coupSMPtr->rf(abs(id1));
627 
628  double sumColS = 0., sumColT = 0., sumInterference = 0.;
629  double LL = 0., RR = 0.;
630 
631  // Couplings for singly charged partners
632  if (nplet == 1) { LL = 1.0 - 2.0 * xW; RR = -2.0 * xW; }
633  if (nplet == 2 || nplet == 3) { LL = 2.0 - 2.0 * xW; RR = -2.0 * xW; }
634 
635  // Coupling for doubly charged partner.
636  if (type == 3) { LL = 4.0 - 2.0 * xW; RR = -2.0 * xW; }
637 
638  // s-channel Z/photon and interference.
639  if (abs(id1) == abs(id2) && abs(id3) == abs(id4)) {
640  double CoupZ;
641  CoupZ = coupSMPtr->rf(11);
642 
643  // Scalar lepton production.
644  if (type == 1) {
645  // s-channel Z.
646  sumColS += sigma0 * facTU / 16.0 / pow2(xW) / pow2(1.0-xW)
647  * norm(propRes) * CoupZ * ( pow2(LqZ) + pow2(RqZ) );
648  // gamma: factor 2 since contributes to both ha != hb helicities.
649  sumColS += (abs(CoupZ) > 0.0) ? 2. * pow2(eQ) * pow2(eSl) * sigma0
650  * facTU / pow2(sH) : 0.0;
651  // Z/gamma interference.
652  sumInterference += eQ * eSl * sigma0 * facTU / 2.0 / xW / (1.-xW)
653  * sqrt(norm(propRes)) / sH * CoupZ * (LqZ + RqZ);
654  }
655 
656  // Production of (singly and doubly) charged partners.
657  if (type > 1 && type < 4) {
658  double fac = (uH - s3) * (uH - s4) + (tH - s3) * (tH - s4)
659  + 2 * m3 * m4 * sH;
660  sumColS += sigma0 * fac * norm(propRes) * (pow2(LL) + pow2(RR))
661  * ( pow2(LqZ) + pow2(RqZ) );
662  sumColS += (abs(CoupZ) > 0.0) ? 2. * pow2(eQ) * pow2(eSl) * sigma0 * fac
663  / pow2(sH) : 0.0;
664  sumInterference += eQ * eSl * sigma0 * fac / 2.0 / xW / (1.-xW)
665  * sqrt(norm(propRes)) / sH * CoupZ * (LqZ + RqZ);
666  }
667 
668  // Production of neutral and singly-charged partners.
669  } else if (type == 4) {
670  if (!isUD || id1 * id2 > 0) return 0.0;
671  if (abs(id1)%2 + abs(id2)%2 != 1) return 0.0 ;
672 
673  // s-channel W contribution
674  double coupW = coupW11 > coupW12 ? coupW11 : coupW12;
675  double fac = pow2(coupW) * norm(propRes) / 2.0;
676  sumColS = (uH - s3) * (uH - s4) + (tH - s3) * (tH - s4) + 2 * m3 * m4 * sH;
677  sumColS *= sigma0 * fac / xW ;
678  }
679 
680  // t-channel for lepton colliders only (TODO)
681 
682  // Cross section.
683  double sigma = sumColS + sumColT + sumInterference;
684 
685  return sigma;
686 
687 }
688 
689 //--------------------------------------------------------------------------
690 
691 void Sigma2qqbar2DY::setIdColAcol() {
692 
693  // Normal or charge conjugate process.
694  int up = abs(id1)%2 == 0 ? id1 : id2;
695  if (up < 0 && abs(id3) == 57 && id4 == 58)
696  setId(id1, id2, -57, 58);
697  else
698  setId(id1, id2, id3, id4);
699 
700  // Colour flow topologies. Swap when antiquarks.
701  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
702  else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
703  if (id1 < 0) swapColAcol();
704 
705 }
706 
707 //==========================================================================
708 
709 } // end namespace Pythia8