1 // SigmaGeneric.cc is a part of the PYTHIA event generator.
2 // Copyright (C) 2010 Johan Bijnens, 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 various generic
7 // production processes, to be used as building blocks for some BSM processes.
8 // Currently represented by QCD pair production of colour triplet objects,
9 // with spin either 0, 1/2 or 1.
11 // Cross sections are only provided for fixed m3 = m4, so do some gymnastics:
12 // i) s34Avg picked so that beta34 same when s3, s4 -> s34Avg.
13 // ii) tHQ = tH - mQ^2 = -0.5 sH (1 - beta34 cos(thetaH)) for m3 = m4 = mQ,
14 // but tH - uH = sH beta34 cos(thetaH) also for m3 != m4, so use
15 // tH, uH selected for m3 != m4 to derive tHQ, uHQ valid for m3 = m4.
17 #include "SigmaGeneric.h"
21 //==========================================================================
23 // Sigma2gg2qGqGbar class.
24 // Cross section for g g -> qG qGbar (generic quark of spin 0, 1/2 or 1).
26 //--------------------------------------------------------------------------
28 // Initialize process.
30 void Sigma2gg2qGqGbar::initProc() {
32 // Number of colours. Anomalous coupling kappa - 1 used for vector state.
33 nCHV = settingsPtr->mode("HiddenValley:Ngauge");
34 kappam1 = settingsPtr->parm("HiddenValley:kappa") - 1.;
35 hasKappa = (abs(kappam1) > 1e-8);
37 // Secondary open width fraction.
38 openFracPair = particleDataPtr->resOpenFrac(idNew, -idNew);
42 //--------------------------------------------------------------------------
44 // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
46 void Sigma2gg2qGqGbar::sigmaKin() {
48 // Modified Mandelstam variables for massive kinematics with m3 = m4.
49 double delta = 0.25 * pow2(s3 - s4) / sH;
50 double s34Avg = 0.5 * (s3 + s4) - delta;
51 double tHavg = tH - delta;
52 double uHavg = uH - delta;
53 double tHQ = -0.5 * (sH - tH + uH);
54 double uHQ = -0.5 * (sH + tH - uH);
55 double tHQ2 = tHQ * tHQ;
56 double uHQ2 = uHQ * uHQ;
58 // Evaluate cross section for spin 0 colour triplet.
60 sigSum = 0.5 * ( 7. / 48. + 3. * pow2(uHavg - tHavg) / (16. * sH2) )
61 * ( 1. + 2. * s34Avg * tHavg / pow2(tHavg - s34Avg)
62 + 2. * s34Avg * uHavg / pow2(uHavg - s34Avg)
63 + 4. * pow2(s34Avg) / ((tHavg - s34Avg) * (uHavg - s34Avg)) );
65 // Equal probability for two possible colour flows.
70 // Evaluate cross section for spin 1/2 colour triplet.
71 else if (spinSave == 1) {
72 double tumHQ = tHQ * uHQ - s34Avg * sH;
73 sigTS = ( uHQ / tHQ - 2.25 * uHQ2 / sH2 + 4.5 * s34Avg * tumHQ
74 / ( sH * tHQ2) + 0.5 * s34Avg * (tHQ + s34Avg) / tHQ2
75 - s34Avg*s34Avg / (sH * tHQ) ) / 6.;
76 sigUS = ( tHQ / uHQ - 2.25 * tHQ2 / sH2 + 4.5 * s34Avg * tumHQ
77 / ( sH * uHQ2) + 0.5 * s34Avg * (uHQ + s34Avg) / uHQ2
78 - s34Avg*s34Avg / (sH * uHQ) ) / 6.;
79 sigSum = sigTS + sigUS;
82 // Evaluate cross section for spin 1 colour triplet.
84 double tmu = tHavg - uHavg;
85 double s34Pos = s34Avg / sH;
86 double s34Pos2 = s34Pos * s34Pos;
87 double s34Neg = sH / s34Avg;
88 double s34Neg2 = s34Neg * s34Neg;
89 sigSum = pow2(tmu) * sH2 * (241./1536. - 1./32. * s34Pos
91 + pow4(tmu) * (37./512. + 9./64. * s34Pos)
92 + pow6(tmu) * (9./512. / sH2)
93 + sH2 * sH2 * (133./1536. - 7./64. * s34Pos + 7./16. * s34Pos2);
95 // Anomalous coupling.
97 sigSum += pow2(tmu) * sH2 * (kappam1 * (143./384. - 7./3072 * s34Neg)
98 + pow2(kappam1) * (- 1./768. * s34Neg + 185./768.)
99 + pow3(kappam1) * (- 7./3072. * s34Neg2
100 - 25./3072. * s34Neg + 67./1536.)
101 + pow4(kappam1) * (- 37./49152. * s34Neg2
102 - 25./6144. * s34Neg + 5./1536.) )
103 + pow4(tmu) * (kappam1 * 3./32.
104 + pow2(kappam1) * (7./6144. * s34Neg2 - 7./768. * s34Neg + 3./128.)
105 + pow3(kappam1) * (7./6144. * s34Neg2 - 7./1536. * s34Neg)
106 + pow4(kappam1) * (- 1./49152. * s34Neg2 + 5./6144. * s34Neg) )
107 + pow6(tmu) * pow4(kappam1) * 13./49152. / pow2(s34Avg)
108 + sH2 * sH2 * ( kappam1 * 77./384.
109 + pow2(kappam1) * (7./6144. * s34Neg2 + 1./96.* s34Neg + 39./256.)
110 + pow3(kappam1) * (7./6144. * s34Neg2 + 13./1024. * s34Neg + 61./1536.)
111 + pow4(kappam1) * (25./49152. * s34Neg2 + 5./1536. * s34Neg + 1./512.)
114 // Equal probability for two possible colour flows.
115 sigSum /= pow2( (uHavg-s34Avg) * (tHavg-s34Avg) );
116 sigTS = 0.5 * sigSum;
120 // Final answer, with common factors.
121 sigma = (M_PI / sH2) * pow2(alpS) * sigSum * nCHV * openFracPair;
125 //--------------------------------------------------------------------------
127 // Select identity, colour and anticolour.
129 void Sigma2gg2qGqGbar::setIdColAcol() {
132 setId( 21, 21, idNew, -idNew);
134 // Two colour flow topologies.
135 double sigRand = sigSum * rndmPtr->flat();
136 if (sigRand < sigTS) setColAcol( 1, 2, 2, 3, 1, 0, 0, 3);
137 else setColAcol( 1, 2, 3, 1, 3, 0, 0, 2);
141 //==========================================================================
143 // Sigma2qqbar2qGqGbar class.
144 // Cross section for q qbar -> qG qGbar (generic quark of spin 0, 1/2 or 1).
146 //--------------------------------------------------------------------------
148 // Initialize process.
150 void Sigma2qqbar2qGqGbar::initProc() {
152 // Number of colours. Coupling kappa used for vector state.
153 nCHV = settingsPtr->mode("HiddenValley:Ngauge");
154 kappa = settingsPtr->parm("HiddenValley:kappa");
156 // Secondary open width fraction.
157 openFracPair = particleDataPtr->resOpenFrac(idNew, -idNew);
161 //--------------------------------------------------------------------------
163 // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
165 void Sigma2qqbar2qGqGbar::sigmaKin() {
167 // Modified Mandelstam variables for massive kinematics with m3 = m4.
168 double delta = 0.25 * pow2(s3 - s4) / sH;
169 double s34Avg = 0.5 * (s3 + s4) - delta;
170 double tHavg = tH - delta;
171 double uHavg = uH - delta;
172 double tHQ = -0.5 * (sH - tH + uH);
173 double uHQ = -0.5 * (sH + tH - uH);
174 double tHQ2 = tHQ * tHQ;
175 double uHQ2 = uHQ * uHQ;
177 // Evaluate cross section for spin 0 colour triplet.
179 sigSum = (1./9.) * (sH * (sH - 4. * s34Avg)
180 - pow2(uHavg - tHavg)) / sH2;
183 // Evaluate cross section for spin 1/2 colour triplet.
184 else if (spinSave == 1) {
185 sigSum = (4./9.) * ((tHQ2 + uHQ2) / sH2 + 2. * s34Avg / sH);
188 // Evaluate cross section for spin 1 colour triplet.
190 double tuH34 = (tHavg + uHavg) / s34Avg;
192 pow2(1. + kappa) * sH * s34Avg * (pow2(tuH34) - 4.)
193 + (tHavg * uHavg - pow2(s34Avg)) * (8. + 2. * (1. - pow2(kappa)) * tuH34
194 + pow2(kappa) * pow2(tuH34)) ) / sH2;
197 // Final answer, with common factors.
198 sigma = (M_PI / sH2) * pow2(alpS) * sigSum * nCHV * openFracPair;
202 //--------------------------------------------------------------------------
204 // Select identity, colour and anticolour.
206 void Sigma2qqbar2qGqGbar::setIdColAcol() {
209 setId( id1, id2, idNew, -idNew);
211 // tH defined between f and qG: must swap tHat <-> uHat if qbar q in.
214 // Colour flow topologies.
215 if (id1 > 0) setColAcol( 1, 0, 0, 2, 1, 0, 0, 2);
216 else setColAcol( 0, 2, 1, 0, 1, 0, 0, 2);
221 //==========================================================================
223 // Sigma2ffbar2fGfGbar class.
224 // Cross section for f fbar -> qG qGbar (generic quark of spin 0, 1/2 or 1)
225 // via gamma^*/Z^* s-channel exchange. Still under development!! ??
227 //--------------------------------------------------------------------------
229 // Initialize process.
231 void Sigma2ffbar2fGfGbar::initProc() {
233 // Charge and number of colours. Coupling kappa used for vector state.
234 eQHV2 = pow2( particleDataPtr->charge(idNew) );
235 nCHV = settingsPtr->mode("HiddenValley:Ngauge");
236 kappa = settingsPtr->parm("HiddenValley:kappa");
238 // Coloured or uncoloured particle.
239 hasColour = (particleDataPtr->colType(idNew) != 0);
240 colFac = (hasColour) ? 3. : 1.;
242 // Secondary open width fraction.
243 openFracPair = particleDataPtr->resOpenFrac(idNew, -idNew);
247 //--------------------------------------------------------------------------
249 // Evaluate d(sigmaHat)/d(tHat), part independent of incoming flavour.
251 void Sigma2ffbar2fGfGbar::sigmaKin() {
253 // Modified Mandelstam variables for massive kinematics with m3 = m4.
254 double delta = 0.25 * pow2(s3 - s4) / sH;
255 double s34Avg = 0.5 * (s3 + s4) - delta;
256 double tHavg = tH - delta;
257 double uHavg = uH - delta;
258 double tHQ = -0.5 * (sH - tH + uH);
259 double uHQ = -0.5 * (sH + tH - uH);
260 double tHQ2 = tHQ * tHQ;
261 double uHQ2 = uHQ * uHQ;
263 // Evaluate cross section for spin 0 colour triplet.
265 sigSum = 0.5 * (sH * (sH - 4. * s34Avg) - pow2(uHavg - tHavg)) / sH2;
268 // Evaluate cross section for spin 1/2 colour triplet.
269 else if (spinSave == 1) {
270 sigSum = 2. * ((tHQ2 + uHQ2) / sH2 + 2. * s34Avg / sH);
273 // Evaluate cross section for spin 1 colour triplet.
275 double tuH34 = (tHavg + uHavg) / s34Avg;
276 sigSum = 0.5 * ( pow2(1. + kappa) * sH * s34Avg * (pow2(tuH34) - 4.)
277 + (tHavg * uHavg - pow2(s34Avg)) * (8. + 2. * (1. - pow2(kappa)) * tuH34
278 + pow2(kappa) * pow2(tuH34)) ) / sH2;
281 // Final-state charge factors.
282 sigSum *= colFac * eQHV2 * (1. + alpS / M_PI);
284 // Final answer, except for initial-state weight
285 sigma0 = (M_PI / sH2) * pow2(alpEM) * sigSum * nCHV * openFracPair;
289 //--------------------------------------------------------------------------
291 // Evaluate d(sigmaHat)/d(tHat), including incoming flavour dependence.
293 double Sigma2ffbar2fGfGbar::sigmaHat() {
295 // Charge and colour factors.
296 double eNow = couplingsPtr->ef( abs(id1) );
297 double sigma = sigma0 * pow2(eNow);
298 if (abs(id1) < 9) sigma /= 3.;
305 //--------------------------------------------------------------------------
307 // Select identity, colour and anticolour.
309 void Sigma2ffbar2fGfGbar::setIdColAcol() {
312 setId( id1, id2, idNew, -idNew);
314 // tH defined between f and qG: must swap tHat <-> uHat if fbar f in.
317 // Colour flow topologies.
319 if (id1 > 0 && id1 < 7) setColAcol( 1, 0, 0, 1, 2, 0, 0, 2);
320 else if (id1 > -7 && id1 < 0) setColAcol( 0, 1, 1, 0, 2, 0, 0, 2);
321 else setColAcol( 0, 0, 0, 0, 1, 0, 0, 1);
323 if (id1 > 0 && id1 < 7) setColAcol( 1, 0, 0, 1, 0, 0, 0, 0);
324 else if (id1 > -7 && id1 < 0) setColAcol( 0, 1, 1, 0, 0, 0, 0, 0);
325 else setColAcol( 0, 0, 0, 0, 0, 0, 0, 0);
331 //==========================================================================
333 } // end namespace Pythia8