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) 2018 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.
25  mRes = particleDataPtr->m0(55);
26  GammaRes = particleDataPtr->mWidth(55);
27  m2Res = mRes*mRes;
28 
29  // Set pointer to particle properties and decay table.
30  particlePtr = particleDataPtr->particleDataEntryPtr(55);
31 
32  double mf, mr, psvec, psaxi, betaf;
33  preFac = 0.0;
34 
35  // Loop over all Zp decay channels.
36  for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
37  int idAbs = abs( particlePtr->channel(i).product(0));
38  if (idAbs != 52) {
39  // Set onMode to off
40  particlePtr->channel(i).onMode(0);
41  continue;
42  }
43 
44  mf = particleDataPtr->m0(idAbs);
45 
46  // Check that above threshold. Phase space.
47  if (mRes > 2. * mf + MASSMARGIN) {
48  mr = pow2(mf / mRes);
49  betaf = sqrtpos(1. - 4. * mr);
50  psvec = betaf * (1. + 2. * mr);
51  psaxi = pow3(betaf);
52  double vf = settingsPtr->parm("Zp:vX");
53  double af = settingsPtr->parm("Zp:aX");
54  preFac += (vf * vf * psvec + af * af * psaxi ) ;
55  }
56  }
57 
58 }
59 
60 //--------------------------------------------------------------------------
61 
62 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
63 
64 void Sigma1ffbar2Zp2XX::sigmaKin() {
65 
66  sigma0 = 1. / ( pow2(sH - m2Res) + pow2(mRes * GammaRes) );
67 
68 }
69 
70 //--------------------------------------------------------------------------
71 
72 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
73 
74 double Sigma1ffbar2Zp2XX::sigmaHat() {
75 
76  // Check for allowed flavour combinations
77  if (id1 + id2 != 0 || abs(id1) > 6 ) return 0.;
78 
79  // double trace = 8.0 * pow2(s3 - tH) + pow2(s3 - uH) + 2.0 * s3 * sH ;
80  // double sigma = sigma0 * trace;
81 
82  // // Colour factors.
83  // if (abs(id1) < 7) sigma /= 3.;
84 
85  double vf, af;
86 
87  if (abs(id1) % 2 == 0) {
88  vf = settingsPtr->parm("Zp:vu");
89  af = settingsPtr->parm("Zp:au");
90  }
91  else {
92  vf = settingsPtr->parm("Zp:vd");
93  af = settingsPtr->parm("Zp:ad");
94  }
95 
96  double vf2af2 = vf * vf + af * af;
97  double sigma = preFac * sigma0 * vf2af2;
98 
99  // Answer.
100  return sigma;
101 
102 }
103 
104 //--------------------------------------------------------------------------
105 
106 // Select identity, colour and anticolour.
107 
108 void Sigma1ffbar2Zp2XX::setIdColAcol() {
109 
110  setId(id1, id2, 55);
111  // Colour flow topologies. Swap when antiquarks.
112  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0);
113  else setColAcol( 0, 0, 0, 0, 0, 0);
114  if (id1 < 0) swapColAcol();
115 
116 }
117 
118 //==========================================================================
119 
120 // Sigma2qqbar2Zpg2XXj.
121 // Cross section for q qbar -> Zprime -> XX + jet.
122 
123 //--------------------------------------------------------------------------
124 
125 // Initialize process.
126 
127 void Sigma2qqbar2Zpg2XXj::initProc() {
128 
129  // Store mass and width for propagator.
130  mRes = particleDataPtr->m0(55);
131  GammaRes = particleDataPtr->mWidth(55);
132  m2Res = mRes*mRes;
133 
134  // Set pointer to particle properties and decay table.
135  particlePtr = particleDataPtr->particleDataEntryPtr(55);
136 
137  double mf, mr, psvec, psaxi, betaf;
138  preFac = 0.0;
139 
140  mf = particleDataPtr->m0(52);
141  for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
142  int idAbs = abs( particlePtr->channel(i).product(0));
143  if (idAbs != 52) {
144  // Set onMode to off
145  particlePtr->channel(i).onMode(0);
146  continue;
147  }
148 
149  // Check that above threshold. Phase space.
150  if (m3 > 2. * mf + MASSMARGIN) {
151  mr = pow2(mf / m3);
152  betaf = sqrtpos(1. - 4. * mr);
153  psvec = betaf * (1. + 2. * mr);
154  psaxi = pow3(betaf);
155  double vf = settingsPtr->parm("Zp:vX");
156  double af = settingsPtr->parm("Zp:aX");
157  preFac += (vf * vf * psvec + af * af * psaxi) ;
158  }
159  }
160 }
161 
162 //--------------------------------------------------------------------------
163 
164 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
165 
166 void Sigma2qqbar2Zpg2XXj::sigmaKin() {
167 
168  double propZp = s3 / ( pow2(s3 - m2Res) + pow2(mRes * GammaRes) );
169 
170  // Cross section part common for all incoming flavours.
171  sigma0 = (M_PI / sH2) * (alpEM * alpS) * propZp
172  * (2./9.) * (tH2 + uH2 + 2. * sH * s3) / (tH * uH);
173 
174 }
175 
176 //--------------------------------------------------------------------------
177 
178 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
179 
180 double Sigma2qqbar2Zpg2XXj::sigmaHat() {
181 
182  // Check for allowed flavour combinations
183  if (id1 + id2 != 0 || abs(id1) > 6 ) return 0.;
184 
185  double vf, af;
186 
187  if (abs(id1) % 2 == 0) {
188  vf = settingsPtr->parm("Zp:vu");
189  af = settingsPtr->parm("Zp:au");
190  }
191  else {
192  vf = settingsPtr->parm("Zp:vd");
193  af = settingsPtr->parm("Zp:ad");
194  }
195 
196  double vf2af2 = vf * vf + af * af;
197  double sigma = sigma0 * vf2af2; // * preFac;
198 
199  // Answer.
200  return sigma;
201 
202 }
203 
204 //--------------------------------------------------------------------------
205 
206 // Select identity, colour and anticolour.
207 
208 void Sigma2qqbar2Zpg2XXj::setIdColAcol() {
209 
210  setId(id1, id2, 55, 21);
211 
212  // Colour flow topologies.
213  if (id1 > 0) setColAcol( 1, 0, 0, 2, 0, 0, 1, 2);
214  else setColAcol( 0, 2, 1, 0, 0, 0, 1, 2);
215 
216 }
217 
218 
219 //==========================================================================
220 
221 // Sigma2ffbar2Zp2H.
222 // Cross section for f fbar' -> Zprime H.
223 
224 //--------------------------------------------------------------------------
225 
226 // Initialize process.
227 
228 void Sigma2ffbar2ZpH::initProc() {
229 
230  // Store mass and width for propagator.
231  mRes = particleDataPtr->m0(55);
232  GammaRes = particleDataPtr->mWidth(55);
233  m2Res = mRes*mRes;
234  coupZpH = settingsPtr->parm("Zp:coupH");
235  gZp = settingsPtr->parm("Zp:gZp");
236 
237  // Set pointer to particle properties and decay table.
238  particlePtr = particleDataPtr->particleDataEntryPtr(55);
239  // Secondary open width fraction.
240  openFrac = particleDataPtr->resOpenFrac(55, 25);
241 
242 }
243 
244 //--------------------------------------------------------------------------
245 
246 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
247 
248 void Sigma2ffbar2ZpH::sigmaKin() {
249 
250  double denom = (pow2(sH - m2Res) + pow2(mRes * GammaRes));
251 
252  sigma0 = (M_PI / sH2) * 8. * pow2(gZp * coupZpH)
253  * (tH * uH - s3 * s4 + 2. * sH * s4);
254 
255  sigma0 /= denom;
256 
257 }
258 
259 //--------------------------------------------------------------------------
260 
261 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
262 
263 double Sigma2ffbar2ZpH::sigmaHat() {
264 
265  // Check for allowed flavour combinations
266  if (id1 + id2 != 0 ) return 0.;
267 
268  // Coupling a_f^2 + v_f^2 to s-channel Zp and colour factor.
269  double vf = 0., af = 0.;
270 
271  if (abs(id1) % 2 == 0) {
272  vf = settingsPtr->parm("Zp:vu");
273  af = settingsPtr->parm("Zp:au");
274  }
275  else {
276  vf = settingsPtr->parm("Zp:vd");
277  af = settingsPtr->parm("Zp:ad");
278  }
279 
280  double sigma = sigma0 * (vf * vf + af * af);
281  if (abs(id1) < 9) sigma /= 3.;
282 
283  // Secondary width for Zp and H
284  sigma *= openFrac;
285 
286  // Answer.
287  return sigma;
288 
289 }
290 
291 //--------------------------------------------------------------------------
292 
293 // Select identity, colour and anticolour.
294 
295 void Sigma2ffbar2ZpH::setIdColAcol() {
296 
297  setId(id1, id2, 55, 25);
298  // Colour flow topologies. Swap when antiquarks.
299  if (abs(id1) < 9) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
300  else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
301  if (id1 < 0) swapColAcol();
302 
303 }
304 
305 
306 //==========================================================================
307 
308 // Sigma2ffbar2S2XX.
309 // Cross section for f fbar' -> S -> XX.
310 
311 //--------------------------------------------------------------------------
312 
313 // Initialize process.
314 
315 void Sigma1gg2S2XX::initProc() {
316 
317  // Store mass and width for propagator.
318  mRes = particleDataPtr->m0(54);
319  GammaRes = particleDataPtr->mWidth(54);
320  m2Res = mRes*mRes;
321 
322  // Set pointer to particle properties and decay table.
323  particlePtr = particleDataPtr->particleDataEntryPtr(54);
324 
325  for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
326  int idAbs = abs( particlePtr->channel(i).product(0));
327  if (idAbs != 52) {
328  // Set onMode to off
329  particlePtr->channel(i).onMode(0);
330  }
331  }
332 
333 }
334 
335 //--------------------------------------------------------------------------
336 
337 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
338 
339 void Sigma1gg2S2XX::sigmaKin() {
340 
341  double propS = sH / ( pow2(sH - m2Res) + pow2(mRes * GammaRes) );
342  sigma0 = 8. * M_PI * propS;
343 
344 }
345 
346 //--------------------------------------------------------------------------
347 
348 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
349 
350 double Sigma1gg2S2XX::sigmaHat() {
351 
352  // Check for allowed flavour combinations
353  if (id1 != id2 || abs(id1) != 21 ) return 0.;
354 
355  double widthIn = particlePtr->resWidthChan( mRes, 21, 21) / 64.;
356 
357  // Width out only includes open channels.
358  double widthOut = particlePtr->resWidthChan( mRes, 52, -52);
359 
360  // Done.
361  double sigma = widthIn * sigma0 * widthOut;
362 
363  // Answer.
364  return sigma;
365 
366 }
367 
368 //--------------------------------------------------------------------------
369 
370 // Select identity, colour and anticolour.
371 
372 void Sigma1gg2S2XX::setIdColAcol() {
373 
374  setId(id1, id2, 54);
375  setColAcol( 1, 2, 2, 1, 0, 0);
376 
377 }
378 
379 //==========================================================================
380 
381 // Sigma2gg2Sg2XXj.
382 // Cross section for g g -> S g -> XX + jet.
383 
384 //--------------------------------------------------------------------------
385 
386 // Initialize process.
387 
388 void Sigma2gg2Sg2XXj::initProc() {
389 
390  // Store mass and width for propagator.
391  mRes = particleDataPtr->m0(54);
392  GammaRes = particleDataPtr->mWidth(54);
393  m2Res = mRes*mRes;
394 
395  // Set pointer to particle properties and decay table.
396  particlePtr = particleDataPtr->particleDataEntryPtr(54);
397 
398  for (int i = 0; i < particlePtr->sizeChannels(); ++i) {
399  int idAbs = abs( particlePtr->channel(i).product(0));
400  if (idAbs != 52) {
401  // Set onMode to off
402  particlePtr->channel(i).onMode(0);
403  }
404  }
405 
406 }
407 
408 //--------------------------------------------------------------------------
409 
410 // Evaluate sigmaHat(sHat), part independent of incoming flavour.
411 
412 void Sigma2gg2Sg2XXj::sigmaKin() {
413 
414  double wid = particlePtr->resWidthChan(m3, 21, 21);
415 
416  // Vec4 resonance = p3cm + p4cm;
417  // double sHCalc = resonance.m2Calc();
418  // double sHCalc2 = sHCalc * sHCalc;
419 
420  // Vec4 p1cm = sH * x1Save * Vec4(0., 0., 1., 1.);
421 
422  // Vec4 tChan = resonance - p1cm;
423  // double tHCalc = tChan.m2Calc();
424  // double tHCalc2 = tHCalc * tHCalc;
425  // Vec4 uChan = p5cm - p1cm;
426  // double uHCalc = uChan.m2Calc();
427  // double uHCalc2 = uHCalc * uHCalc;
428 
429  // propS = sHCalc / ( pow2(sHCalc - m2Res) + pow2(mRes * GammaRes) );
430 
431  // Expression adapted from g g -> H g.
432 
433  // sigma0 = (M_PI / sH2) * (3. / 16.) * alpS * (wid / mRes)
434  // * (sH2 * sH2 + tHCalc2 * tHCalc2 + uHCalc2 * uHCalc2 + pow2(sHCalc2))
435  // / (sH * tHCalc * uHCalc * sHCalc);
436 
437  sigma0 = (M_PI / sH2) * (3. / 16.) * alpS * (wid / m3)
438  * (sH2 * sH2 + tH2 * tH2 + uH2 * uH2 + pow2(sH2))
439  / (sH * tH * uH * sH);
440 
441 }
442 
443 //--------------------------------------------------------------------------
444 
445 // Evaluate sigmaHat(sHat), including incoming flavour dependence.
446 
447 double Sigma2gg2Sg2XXj::sigmaHat() {
448 
449  return sigma0 * particlePtr->resWidthChan(mRes, 52, -52);
450 
451 }
452 
453 //--------------------------------------------------------------------------
454 
455 // Select identity, colour and anticolour.
456 
457 void Sigma2gg2Sg2XXj::setIdColAcol() {
458 
459  setId(id1, id2, 54, 21);
460 
461  if( rndmPtr->flat() < 0.5)
462  setColAcol( 1, 2, 3, 1, 0, 0, 3, 2);
463  else
464  setColAcol( 1, 2, 2, 3, 0, 0, 1, 3);
465 
466 }
467 
468 //==========================================================================
469 
470 } // end namespace Pythia8