Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-23 08:19:22

0001 // SigmaQCD.h is a part of the PYTHIA event generator.
0002 // Copyright (C) 2025 Torbjorn Sjostrand.
0003 // PYTHIA is licenced under the GNU GPL v2 or later, see COPYING for details.
0004 // Please respect the MCnet Guidelines, see GUIDELINES for details.
0005 
0006 // Header file for QCD process differential cross sections.
0007 // Contains classes derived from SigmaProcess via Sigma(0/2)Process.
0008 
0009 #ifndef Pythia8_SigmaQCD_H
0010 #define Pythia8_SigmaQCD_H
0011 
0012 #include "Pythia8/SigmaProcess.h"
0013 
0014 namespace Pythia8 {
0015 
0016 //==========================================================================
0017 
0018 // A derived class for minimum-bias (inelastic, nondiffractive) events.
0019 
0020 class Sigma0nonDiffractive : public Sigma0Process {
0021 
0022 public:
0023 
0024   // Constructor.
0025   Sigma0nonDiffractive() {}
0026 
0027   // Evaluate sigma.
0028   virtual double sigmaHat() {if (!doVarE) return sigmaTotPtr->sigmaND();
0029     return sigmaCmbPtr->sigmaPartial(idA, idB, infoPtr->eCM(), mA, mB, 1);}
0030 
0031   // Select flavour, colour and anticolour.
0032   virtual void setIdColAcol() {}
0033 
0034   // Info on the subprocess.
0035   virtual string name()      const {return "non-diffractive";}
0036   virtual int    code()      const {return 101;}
0037   virtual bool   isNonDiff() const {return true;}
0038 
0039 private:
0040 
0041 };
0042 
0043 //==========================================================================
0044 
0045 // A derived class for elastic scattering A B -> A B.
0046 
0047 class Sigma0AB2AB : public Sigma0Process {
0048 
0049 public:
0050 
0051   // Constructor.
0052   Sigma0AB2AB() {}
0053 
0054   // Evaluate sigma.
0055   virtual double sigmaHat() {if (!doVarE) return sigmaTotPtr->sigmaEl();
0056     return sigmaCmbPtr->sigmaPartial(idA, idB, infoPtr->eCM(), mA, mB, 2);}
0057 
0058   // Select flavour, colour and anticolour.
0059   virtual void setIdColAcol();
0060 
0061   // Info on the subprocess.
0062   virtual string name()       const {return "A B -> A B elastic";}
0063   virtual int    code()       const {return 102;}
0064   virtual bool   isResolved() const {return false;}
0065 
0066 private:
0067 
0068 };
0069 
0070 //==========================================================================
0071 
0072 // A derived class for single diffractive scattering A B -> X B.
0073 
0074 class Sigma0AB2XB : public Sigma0Process {
0075 
0076 public:
0077 
0078   // Constructor.
0079   Sigma0AB2XB() {}
0080 
0081   // Evaluate sigma.
0082   virtual double sigmaHat() {if (!doVarE) return sigmaTotPtr->sigmaXB();
0083     return sigmaCmbPtr->sigmaPartial(idA, idB, infoPtr->eCM(), mA, mB, 3);}
0084 
0085   // Select flavour, colour and anticolour.
0086   virtual void setIdColAcol();
0087 
0088   // Info on the subprocess.
0089   virtual string name()       const {return "A B -> X B single diffractive";}
0090   virtual int    code()       const {return 103;}
0091   virtual bool   isResolved() const {return false;}
0092   virtual bool   isDiffA()    const {return true;};
0093 
0094 private:
0095 
0096 };
0097 
0098 //==========================================================================
0099 
0100 // A derived class for single diffractive scattering A B -> A X.
0101 
0102 class Sigma0AB2AX : public Sigma0Process {
0103 
0104 public:
0105 
0106   // Constructor.
0107   Sigma0AB2AX() {}
0108 
0109   // Evaluate sigma.
0110   virtual double sigmaHat() {if (!doVarE) return sigmaTotPtr->sigmaAX();
0111     return sigmaCmbPtr->sigmaPartial(idA, idB, infoPtr->eCM(), mA, mB, 4);}
0112 
0113   // Select flavour, colour and anticolour.
0114   virtual void setIdColAcol();
0115 
0116   // Info on the subprocess.
0117   virtual string name()       const {return "A B -> A X single diffractive";}
0118   virtual int    code()       const {return 104;}
0119   virtual bool   isResolved() const {return false;}
0120   virtual bool   isDiffB()    const {return true;};
0121 
0122 private:
0123 
0124 };
0125 
0126 //==========================================================================
0127 
0128 // A derived class for double diffractive scattering A B -> X X.
0129 
0130 class Sigma0AB2XX : public Sigma0Process {
0131 
0132 public:
0133 
0134   // Constructor.
0135   Sigma0AB2XX() {}
0136 
0137   // Evaluate sigma.
0138   virtual double sigmaHat() {if (!doVarE) return sigmaTotPtr->sigmaXX();
0139     return sigmaCmbPtr->sigmaPartial(idA, idB, infoPtr->eCM(), mA, mB, 5);}
0140 
0141   // Select flavour, colour and anticolour.
0142   virtual void setIdColAcol();
0143 
0144   // Info on the subprocess.
0145   virtual string name()       const {return "A B -> X X double diffractive";}
0146   virtual int    code()       const {return 105;}
0147   virtual bool   isResolved() const {return false;}
0148   virtual bool   isDiffA()    const {return true;};
0149   virtual bool   isDiffB()    const {return true;};
0150 
0151 private:
0152 
0153 };
0154 
0155 //==========================================================================
0156 
0157 // A derived class for central diffractive scattering A B -> A X B.
0158 
0159 class Sigma0AB2AXB : public Sigma0Process {
0160 
0161 public:
0162 
0163   // Constructor.
0164   Sigma0AB2AXB() {}
0165 
0166   // Evaluate sigma.
0167   virtual double sigmaHat() {if (!doVarE) return sigmaTotPtr->sigmaAXB();
0168     return sigmaCmbPtr->sigmaPartial(idA, idB, infoPtr->eCM(), mA, mB, 6);}
0169 
0170   // Select flavour, colour and anticolour.
0171   virtual void setIdColAcol();
0172 
0173   // Info on the subprocess.
0174   virtual string name()      const {return "A B -> A X B central diffractive";}
0175   virtual int    code()       const {return 106;}
0176   virtual int    nFinal()     const {return 3;}
0177   virtual bool   isResolved() const {return false;}
0178   virtual bool   isDiffC()    const {return true;};
0179 
0180 private:
0181 
0182 };
0183 
0184 //==========================================================================
0185 
0186 // A derived class for g g -> g g.
0187 
0188 class Sigma2gg2gg : public Sigma2Process {
0189 
0190 public:
0191 
0192   // Constructor.
0193   Sigma2gg2gg() : sigTS(), sigUS(), sigTU(), sigSum(), sigma() {}
0194 
0195   // Calculate flavour-independent parts of cross section.
0196   virtual void sigmaKin();
0197 
0198   // Evaluate d(sigmaHat)/d(tHat).
0199   virtual double sigmaHat() {return sigma;}
0200 
0201   // Select flavour, colour and anticolour.
0202   virtual void setIdColAcol();
0203 
0204   // Info on the subprocess.
0205   virtual string name()   const {return "g g -> g g";}
0206   virtual int    code()   const {return 111;}
0207   virtual string inFlux() const {return "gg";}
0208 
0209 private:
0210 
0211   // Values stored for colour flow selection.
0212   double sigTS, sigUS, sigTU, sigSum, sigma;
0213 
0214 };
0215 
0216 //==========================================================================
0217 
0218 // A derived class for g g -> q qbar (q = u, d, s, i.e. almost massless).
0219 
0220 class Sigma2gg2qqbar : public Sigma2Process {
0221 
0222 public:
0223 
0224   // Constructor.
0225   Sigma2gg2qqbar() : nQuarkNew(), idNew(), mNew(), m2New(), sigTS(), sigUS(),
0226     sigSum(), sigma() {}
0227 
0228   // Initialize process.
0229   virtual void initProc();
0230 
0231   // Calculate flavour-independent parts of cross section.
0232   virtual void sigmaKin();
0233 
0234   // Evaluate d(sigmaHat)/d(tHat).
0235   virtual double sigmaHat() {return sigma;}
0236 
0237   // Select flavour, colour and anticolour.
0238   virtual void setIdColAcol();
0239 
0240   // Info on the subprocess.
0241   virtual string name()   const {return "g g -> q qbar (uds)";}
0242   virtual int    code()   const {return 112;}
0243   virtual string inFlux() const {return "gg";}
0244 
0245 private:
0246 
0247   // Number of quarks to be considered in massless approximation.
0248   int    nQuarkNew;
0249 
0250   // Values stored for colour flow selection.
0251   int    idNew;
0252   double mNew, m2New, sigTS, sigUS, sigSum, sigma;
0253 
0254 };
0255 
0256 //==========================================================================
0257 
0258 // A derived class for q g -> q g (q = u, d, s, c, b).
0259 // Use massless approximation also for Q since no alternative.
0260 
0261 class Sigma2qg2qg : public Sigma2Process {
0262 
0263 public:
0264 
0265   // Constructor.
0266   Sigma2qg2qg() : sigTS(), sigTU(), sigSum(), sigma() {}
0267 
0268   // Calculate flavour-independent parts of cross section.
0269   virtual void sigmaKin();
0270 
0271   // Evaluate d(sigmaHat)/d(tHat).
0272   virtual double sigmaHat() {return sigma;}
0273 
0274   // Select flavour, colour and anticolour.
0275   virtual void setIdColAcol();
0276 
0277   // Info on the subprocess.
0278   virtual string name()   const {return "q g -> q g";}
0279   virtual int    code()   const {return 113;}
0280   virtual string inFlux() const {return "qg";}
0281 
0282 private:
0283 
0284   // Values stored for colour flow selection.
0285   double sigTS, sigTU, sigSum, sigma;
0286 
0287 };
0288 
0289 //==========================================================================
0290 
0291 // A derived class for q qbar' -> q qbar' or q q' -> q q'
0292 // (qbar qbar' -> qbar qbar'), q' may be same as q.
0293 
0294 class Sigma2qq2qq : public Sigma2Process {
0295 
0296 public:
0297 
0298   // Constructor.
0299   Sigma2qq2qq() : sigT(), sigU(), sigTU(), sigST(), sigSum() {}
0300 
0301   // Calculate flavour-independent parts of cross section.
0302   virtual void sigmaKin();
0303 
0304   // Evaluate d(sigmaHat)/d(tHat).
0305   virtual double sigmaHat();
0306 
0307   // Select flavour, colour and anticolour.
0308   virtual void setIdColAcol();
0309 
0310   // Info on the subprocess.
0311   virtual string name()   const {return "q q(bar)' -> q q(bar)'";}
0312   virtual int    code()   const {return 114;}
0313   virtual string inFlux() const {return "qq";}
0314 
0315  private:
0316 
0317   // Values stored for colour flow selection.
0318   double sigT, sigU, sigTU, sigST, sigSum;
0319 
0320 };
0321 
0322 //==========================================================================
0323 
0324 // A derived class for q qbar -> g g.
0325 
0326 class Sigma2qqbar2gg : public Sigma2Process {
0327 
0328 public:
0329 
0330   // Constructor.
0331   Sigma2qqbar2gg() : sigTS(), sigUS(), sigSum(), sigma() {}
0332 
0333   // Calculate flavour-independent parts of cross section.
0334   virtual void sigmaKin();
0335 
0336   // Evaluate d(sigmaHat)/d(tHat).
0337   virtual double sigmaHat() {return sigma;}
0338 
0339   // Select flavour, colour and anticolour.
0340   virtual void setIdColAcol();
0341 
0342   // Info on the subprocess.
0343   virtual string name()   const {return "q qbar -> g g";}
0344   virtual int    code()   const {return 115;}
0345   virtual string inFlux() const {return "qqbarSame";}
0346 
0347  private:
0348 
0349   // Values stored for colour flow selection.
0350   double sigTS, sigUS, sigSum, sigma;
0351 
0352 };
0353 
0354 //==========================================================================
0355 
0356 // A derived class for q qbar -> q' qbar'.
0357 
0358 class Sigma2qqbar2qqbarNew : public Sigma2Process {
0359 
0360 public:
0361 
0362   // Constructor.
0363   Sigma2qqbar2qqbarNew() : nQuarkNew(), idNew(), mNew(), m2New(), sigS(),
0364     sigma() {}
0365 
0366   // Initialize process.
0367   virtual void initProc();
0368 
0369   // Calculate flavour-independent parts of cross section.
0370   virtual void sigmaKin();
0371 
0372   // Evaluate d(sigmaHat)/d(tHat).
0373   virtual double sigmaHat() {return sigma;}
0374 
0375   // Select flavour, colour and anticolour.
0376   virtual void setIdColAcol();
0377 
0378   // Info on the subprocess.
0379   virtual string name()   const {return "q qbar -> q' qbar' (uds)";}
0380   virtual int    code()   const {return 116;}
0381   virtual string inFlux() const {return "qqbarSame";}
0382 
0383  private:
0384 
0385   // Number of quarks to be considered in massless approximation.
0386   int    nQuarkNew;
0387 
0388   // Values stored for colour flow selection.
0389   int    idNew;
0390   double mNew, m2New, sigS, sigma;
0391 
0392 };
0393 
0394 //==========================================================================
0395 
0396 // Auxiliary class for top threshold corrections, based on
0397 // V. Fadin,  V. Khoze and T. Sjostrand, Z. Phys. C48 (1990) 613.
0398 
0399 class TopThreshold {
0400 
0401 public:
0402 
0403   // Trivial constructor and destructor.
0404   TopThreshold()  {}
0405   ~TopThreshold() {}
0406 
0407   // Initialization setup - read in necessary settings.
0408   void setup( int topModelIn, double mtIn, double gammatIn,
0409     double thresholdWidthIn, double singletFracIn,
0410     int alphasOrder, double alphasValue);
0411 
0412   // Cross section enhancement factor, combined.
0413   double multiplySigmaBy( bool inInit, double mHat, double m3, double m4,
0414     double eThr);
0415 
0416   // Imaginary part of Green's function for singlet state.
0417   double imGreenSin(double eNow, double mtNow);
0418 
0419   // Imaginary part of Green's function for octet state.
0420   double imGreenOct(double eNow, double mtNow);
0421 
0422 private:
0423 
0424   // Commonly available variables.
0425   int    topModel;
0426   double mt, gammat, thrWidth, singletFrac, alps;
0427 
0428   // Need alphaStrong with special scale.
0429   AlphaStrong alphas;
0430 
0431 };
0432 
0433 //==========================================================================
0434 
0435 // A derived class for g g -> Q Qbar (Q = c, b or t).
0436 
0437 class Sigma2gg2QQbar : public Sigma2Process {
0438 
0439 public:
0440 
0441   // Constructor.
0442   Sigma2gg2QQbar(int idIn, int codeIn) : idNew(idIn), codeSave(codeIn),
0443     sigTS(), sigUS(), sigSum(), sigma(), openFracPair() {}
0444 
0445   // Initialize process.
0446   virtual void initProc();
0447 
0448   // Calculate flavour-independent parts of cross section.
0449   virtual void sigmaKin();
0450 
0451   // Evaluate d(sigmaHat)/d(tHat).
0452   virtual double sigmaHat() {return sigma;}
0453 
0454   // Select flavour, colour and anticolour.
0455   virtual void setIdColAcol();
0456 
0457   // Evaluate weight for W decay angles in top decay (else inactive).
0458   virtual double weightDecay( Event& process, int iResBeg, int iResEnd);
0459 
0460   // Info on the subprocess.
0461   virtual string name()    const {return nameSave;}
0462   virtual int    code()    const {return codeSave;}
0463   virtual string inFlux()  const {return "gg";}
0464   virtual int    id3Mass() const {return idNew;}
0465   virtual int    id4Mass() const {return idNew;}
0466 
0467  private:
0468 
0469   // Values stored for process type and colour flow selection.
0470   int    idNew, codeSave, topModel;
0471   string nameSave;
0472   double sigTS, sigUS, sigSum, sigma, openFracPair, ggSingletFrac;
0473 
0474   // Class for top threshold corrections.
0475   TopThreshold topThreshold;
0476 
0477 };
0478 
0479 //==========================================================================
0480 
0481 // A derived class for q qbar -> Q Qbar (Q = c, b or t).
0482 
0483 class Sigma2qqbar2QQbar : public Sigma2Process {
0484 
0485 public:
0486 
0487   // Constructor.
0488   Sigma2qqbar2QQbar(int idIn, int codeIn) : idNew(idIn), codeSave(codeIn),
0489     sigma(), openFracPair() {}
0490 
0491   // Initialize process.
0492   virtual void initProc();
0493 
0494   // Calculate flavour-independent parts of cross section.
0495   virtual void sigmaKin();
0496 
0497   // Evaluate d(sigmaHat)/d(tHat).
0498   virtual double sigmaHat() {return sigma;}
0499 
0500   // Select flavour, colour and anticolour.
0501   virtual void setIdColAcol();
0502 
0503   // Evaluate weight for W decay angles in top decay (else inactive).
0504   virtual double weightDecay( Event& process, int iResBeg, int iResEnd);
0505 
0506   // Info on the subprocess.
0507   virtual string name()    const {return nameSave;}
0508   virtual int    code()    const {return codeSave;}
0509   virtual string inFlux()  const {return "qqbarSame";}
0510   virtual int    id3Mass() const {return idNew;}
0511   virtual int    id4Mass() const {return idNew;}
0512 
0513  private:
0514 
0515   // Values stored for process type.
0516   int    idNew, codeSave, topModel;
0517   string nameSave;
0518   double sigma, openFracPair, qqSingletFrac;
0519 
0520   // Class for top threshold corrections.
0521   TopThreshold topThreshold;
0522 
0523 };
0524 
0525 //==========================================================================
0526 
0527 // A derived class for g g -> g g g.
0528 
0529 class Sigma3gg2ggg : public Sigma3Process {
0530 
0531 public:
0532 
0533   // Constructor.
0534   Sigma3gg2ggg() : sigma(), pp() {}
0535 
0536   // Calculate flavour-independent parts of cross section.
0537   virtual void sigmaKin();
0538 
0539   // Evaluate d(sigmaHat)/d(tHat).
0540   virtual double sigmaHat() {return sigma;}
0541 
0542   // Select flavour, colour and anticolour.
0543   virtual void setIdColAcol();
0544 
0545   // Info on the subprocess.
0546   virtual string name()       const {return "g g -> g g g";}
0547   virtual int    code()       const {return 131;}
0548   virtual int    nFinal()     const {return 3;}
0549   virtual string inFlux()     const {return "gg";}
0550   virtual bool   isQCD3body() const {return true;}
0551 
0552 private:
0553 
0554   // Values stored for colour flow selection.
0555   double sigma;
0556 
0557   // Intermediate storage and calculation of four-products.
0558   double pp[6][6];
0559   double cycle(int i1, int i2, int i3, int i4, int i5) {return
0560     pp[i1][i2] * pp[i2][i3] * pp[i3][i4] * pp[i4][i5] * pp[i5][i1];}
0561 
0562 };
0563 
0564 //==========================================================================
0565 
0566 // A derived class for q qbar -> g g g.
0567 
0568 class Sigma3qqbar2ggg : public Sigma3Process {
0569 
0570 public:
0571 
0572   // Constructor.
0573   Sigma3qqbar2ggg() : config(), a(), b(), pp(), ab(), sigma() {}
0574 
0575   // Calculate flavour-independent parts of cross section.
0576   virtual void sigmaKin();
0577 
0578   // Evaluate d(sigmaHat)/d(tHat).
0579   virtual double sigmaHat() {return sigma;}
0580 
0581   // Select flavour, colour and anticolour.
0582   virtual void setIdColAcol();
0583 
0584   // Info on the subprocess.
0585   virtual string name()       const {return "q qbar -> g g g";}
0586   virtual int    code()       const {return 132;}
0587   virtual int    nFinal()     const {return 3;}
0588   virtual string inFlux()     const {return "qqbarSame";}
0589   virtual bool   isQCD3body() const {return true;}
0590 
0591 protected:
0592 
0593   // Pick/map a random final state configuration
0594   int         config;
0595   inline void pickFinal() { config = int( 6 * rndmPtr->flat() ); }
0596   inline void mapFinal();
0597 
0598   // |M|^2 calculation
0599   inline double m2Calc();
0600 
0601   // Four-vectors for |M|^2 calculation
0602   Vec4 pCM[5];
0603 
0604   // Intermediate storage and calculation of four-products
0605   double a[3], b[3], pp[3][3], ab[3][3];
0606 
0607   // Values stored for colour flow selection.
0608   double sigma;
0609 
0610 };
0611 
0612 //==========================================================================
0613 
0614 // A derived class for q g -> q g g
0615 // Derived from Sigma3qqbar2ggg
0616 
0617 class Sigma3qg2qgg : public Sigma3qqbar2ggg {
0618 
0619 public:
0620 
0621   // Constructor.
0622   Sigma3qg2qgg() : sigma() {}
0623 
0624   // Calculate flavour-independent parts of cross section.
0625   virtual void sigmaKin();
0626 
0627   // Evaluate d(sigmaHat)/d(tHat).
0628   virtual double sigmaHat();
0629 
0630   // Select flavour, colour and anticolour.
0631   virtual void setIdColAcol();
0632 
0633   // Info on the subprocess.
0634   virtual string name()       const {return "q g -> q g g";}
0635   virtual int    code()       const {return 133;}
0636   virtual int    nFinal()     const {return 3;}
0637   virtual string inFlux()     const {return "qg";}
0638   virtual bool   isQCD3body() const {return true;}
0639 
0640 private:
0641 
0642   // Sigma for (qg) and (gq) incoming
0643   double sigma[2];
0644 
0645 };
0646 
0647 //==========================================================================
0648 
0649 // A derived class for g g -> q qbar g
0650 // Derived from Sigma3qqbar2ggg
0651 
0652 class Sigma3gg2qqbarg : public Sigma3qqbar2ggg {
0653 
0654 public:
0655 
0656   // Constructor.
0657   Sigma3gg2qqbarg() : nQuarkNew() {}
0658 
0659   // Initialize process.
0660   virtual void initProc();
0661 
0662   // Calculate flavour-independent parts of cross section.
0663   virtual void sigmaKin();
0664 
0665   // Select flavour, colour and anticolour.
0666   virtual void setIdColAcol();
0667 
0668   // Info on the subprocess.
0669   virtual string name()       const {return "g g -> q qbar g";}
0670   virtual int    code()       const {return 138;}
0671   virtual int    nFinal()     const {return 3;}
0672   virtual string inFlux()     const {return "gg";}
0673   virtual bool   isQCD3body() const {return true;}
0674 
0675 private:
0676 
0677   // Number of quarks to be considered in massless approximation.
0678   int    nQuarkNew;
0679 
0680 };
0681 
0682 //==========================================================================
0683 
0684 // A derived class for q q' -> q q' g
0685 
0686 class Sigma3qq2qqgDiff : public Sigma3Process {
0687 
0688 public:
0689 
0690   // Constructor.
0691   Sigma3qq2qqgDiff() : config(), s(), t(), u(), sp(), tp(), up(), sigma() {}
0692 
0693   // Calculate flavour-independent parts of cross section.
0694   virtual void sigmaKin();
0695 
0696   // Evaluate d(sigmaHat)/d(tHat).
0697   virtual double sigmaHat();
0698 
0699   // Select flavour, colour and anticolour.
0700   virtual void setIdColAcol();
0701 
0702   // Info on the subprocess.
0703   virtual string name()       const
0704     {return "q(bar) q(bar)' -> q(bar) q(bar)' g";}
0705   virtual int    code()       const {return 134;}
0706   virtual int    nFinal()     const {return 3;}
0707   virtual string inFlux()     const {return "qq";}
0708   virtual bool   isQCD3body() const {return true;}
0709 
0710 protected:
0711 
0712   // Pick/map a random final state configuration
0713   int         config;
0714   inline void pickFinal() { config = int( 6 * rndmPtr->flat() ); }
0715   inline void mapFinal();
0716 
0717   // |M|^2 calculation
0718   inline double m2Calc();
0719 
0720   // Kinematic configuration
0721   Vec4 pCM[5];
0722 
0723   // Four-products
0724   double s, t, u, sp, tp, up;
0725 
0726   // Cross section
0727   double sigma;
0728 
0729 };
0730 
0731 //==========================================================================
0732 
0733 // A derived class for q qbar -> q' qbar' g
0734 // Derived from Sigma3qq2qqgDiff
0735 
0736 class Sigma3qqbar2qqbargDiff : public Sigma3qq2qqgDiff {
0737 
0738 public:
0739 
0740   // Constructor.
0741   Sigma3qqbar2qqbargDiff() : nQuarkNew() {}
0742 
0743   // Initialize process.
0744   virtual void initProc();
0745 
0746   // Calculate flavour-independent parts of cross section.
0747   virtual void sigmaKin();
0748 
0749   // Evaluate d(sigmaHat)/d(tHat).
0750   virtual double sigmaHat() {return sigma;}
0751 
0752   // Select flavour, colour and anticolour.
0753   virtual void setIdColAcol();
0754 
0755   // Info on the subprocess.
0756   virtual string name()       const {return "q qbar -> q' qbar' g";}
0757   virtual int    code()       const {return 136;}
0758   virtual int    nFinal()     const {return 3;}
0759   virtual string inFlux()     const {return "qqbarSame";}
0760   virtual bool   isQCD3body() const {return true;}
0761 
0762 private:
0763 
0764   // Number of quarks to be considered in massless approximation.
0765   int    nQuarkNew;
0766 
0767 };
0768 
0769 //==========================================================================
0770 
0771 // A derived class for q g -> q q' qbar'
0772 // Derived from Sigma3qq2qqgDiff
0773 
0774 class Sigma3qg2qqqbarDiff : public Sigma3qq2qqgDiff {
0775 
0776 public:
0777 
0778   // Constructor.
0779   Sigma3qg2qqqbarDiff() : nQuarkNew(), sigma() {}
0780 
0781   // Initialize process.
0782   virtual void initProc();
0783 
0784   // Calculate flavour-independent parts of cross section.
0785   virtual void sigmaKin();
0786 
0787   // Evaluate d(sigmaHat)/d(tHat).
0788   virtual double sigmaHat();
0789 
0790   // Select flavour, colour and anticolour.
0791   virtual void setIdColAcol();
0792 
0793   // Info on the subprocess.
0794   virtual string name()       const {return "q g -> q q' qbar'";}
0795   virtual int    code()       const {return 139;}
0796   virtual int    nFinal()     const {return 3;}
0797   virtual string inFlux()     const {return "qg";}
0798   virtual bool   isQCD3body() const {return true;}
0799 
0800 private:
0801 
0802   // Number of quarks to be considered in massless approximation.
0803   int    nQuarkNew;
0804 
0805   // gq and qg incoming
0806   double sigma[2];
0807 
0808 };
0809 
0810 //==========================================================================
0811 
0812 // A derived class for q q -> q q g
0813 
0814 class Sigma3qq2qqgSame : public Sigma3Process {
0815 
0816 public:
0817 
0818   // Constructor.
0819   Sigma3qq2qqgSame() : config(), s(), t(), u(), sp(), tp(), up(), ssp(),
0820     ttp(), uup(), s_sp(), t_tp(), u_up(), sigma() {}
0821 
0822   // Calculate flavour-independent parts of cross section.
0823   virtual void sigmaKin();
0824 
0825   // Evaluate d(sigmaHat)/d(tHat).
0826   virtual double sigmaHat();
0827 
0828   // Select flavour, colour and anticolour.
0829   virtual void setIdColAcol();
0830 
0831   // Info on the subprocess.
0832   virtual string name()       const
0833     {return "q(bar) q(bar) -> q(bar) q(bar) g";}
0834   virtual int    code()       const {return 135;}
0835   virtual int    nFinal()     const {return 3;}
0836   virtual string inFlux()     const {return "qq";}
0837   virtual bool   isQCD3body() const {return true;}
0838 
0839 protected:
0840 
0841   // Pick/map a random final state configuration
0842   int         config;
0843   inline void pickFinal() { config = int( 6 * rndmPtr->flat() ); }
0844   inline void mapFinal();
0845 
0846   // |M|^2 calculation
0847   inline double m2Calc();
0848 
0849   // Kinematic configuration
0850   Vec4 pCM[5];
0851 
0852   // Four-products
0853   double s, t, u, sp, tp, up;
0854   double ssp, ttp, uup, s_sp, t_tp, u_up;
0855 
0856   // Cross section
0857   double sigma;
0858 
0859 };
0860 
0861 //==========================================================================
0862 
0863 // A derived class for q q -> q q g
0864 // Derived from Sigma3qq2qqgSame
0865 
0866 class Sigma3qqbar2qqbargSame : public Sigma3qq2qqgSame {
0867 
0868 public:
0869 
0870   // Constructor.
0871   Sigma3qqbar2qqbargSame() {}
0872 
0873   // Calculate flavour-independent parts of cross section.
0874   virtual void sigmaKin();
0875 
0876   // Evaluate d(sigmaHat)/d(tHat).
0877   virtual double sigmaHat() {return sigma;}
0878 
0879   // Select flavour, colour and anticolour.
0880   virtual void setIdColAcol();
0881 
0882   // Info on the subprocess.
0883   virtual string name()       const {return "q qbar -> q qbar g";}
0884   virtual int    code()       const {return 137;}
0885   virtual int    nFinal()     const {return 3;}
0886   virtual string inFlux()     const {return "qqbarSame";}
0887   virtual bool   isQCD3body() const {return true;}
0888 
0889 private:
0890 
0891 };
0892 
0893 //==========================================================================
0894 
0895 // A derived class for q g -> q qbar q; same flavour.
0896 // Derived from Sigma3qq2qqgSame
0897 
0898 class Sigma3qg2qqqbarSame : public Sigma3qq2qqgSame {
0899 
0900 public:
0901 
0902   // Constructor.
0903   Sigma3qg2qqqbarSame() : sigma() {}
0904 
0905   // Calculate flavour-independent parts of cross section.
0906   virtual void sigmaKin();
0907 
0908   // Evaluate d(sigmaHat)/d(tHat).
0909   virtual double sigmaHat();
0910 
0911   // Select flavour, colour and anticolour.
0912   virtual void setIdColAcol();
0913 
0914   // Info on the subprocess.
0915   virtual string name()       const {return "q g -> q q qbar";}
0916   virtual int    code()       const {return 140;}
0917   virtual int    nFinal()     const {return 3;}
0918   virtual string inFlux()     const {return "qg";}
0919   virtual bool   isQCD3body() const {return true;}
0920 
0921 private:
0922 
0923   // gq and qg incoming
0924   double sigma[2];
0925 
0926 };
0927 
0928 //==========================================================================
0929 
0930 } // end namespace Pythia8
0931 
0932 #endif // Pythia8_SigmaQCD_H