LCOV - code coverage report
Current view: top level - PYTHIA8/pythia8210dev/include/Pythia8 - SigmaProcess.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 136 0.0 %
Date: 2016-06-14 17:26:59 Functions: 0 125 0.0 %

          Line data    Source code
       1             : // SigmaProcess.h is a part of the PYTHIA event generator.
       2             : // Copyright (C) 2015 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.
       5             : 
       6             : // Header file for hard-process differential cross sections.
       7             : // SigmaProcess: base class for cross sections.
       8             : // Sigma0Process: base class for unresolved processes, derived from above.
       9             : // Sigma1Process: base class for 2 -> 1 processes, derived from above.
      10             : // Sigma2Process: base class for 2 -> 2 processes, derived from above.
      11             : // Sigma3Process: base class for 2 -> 3 processes, derived from above.
      12             : // SigmaLHAProcess: wrapper class for Les Houches Accord external input.
      13             : // Actual physics processes are found in separate files:
      14             : // SigmaQCD for QCD processes;
      15             : // SigmaEW for electroweak processes (including photon production);
      16             : // SigmaOnia for charmonium and bottomonium processes;
      17             : // SigmaHiggs for Higgs processes;
      18             : // SigmaSUSY for supersymmetric production;
      19             : // SigmaLeftRightSym for  processes in left-right-symmetric scenarios;
      20             : // SigmaLeptoquark for leptoquark production.
      21             : // SigmaExtraDim for processes in scenarios for extra dimensions;
      22             : // SigmaGeneric for generic scalar/fermion/vector pair production.
      23             : 
      24             : #ifndef Pythia8_SigmaProcess_H
      25             : #define Pythia8_SigmaProcess_H
      26             : 
      27             : #include "Pythia8/Basics.h"
      28             : #include "Pythia8/BeamParticle.h"
      29             : #include "Pythia8/Event.h"
      30             : #include "Pythia8/Info.h"
      31             : #include "Pythia8/LesHouches.h"
      32             : #include "Pythia8/ParticleData.h"
      33             : #include "Pythia8/PartonDistributions.h"
      34             : #include "Pythia8/PythiaComplex.h"
      35             : #include "Pythia8/PythiaStdlib.h"
      36             : #include "Pythia8/ResonanceWidths.h"
      37             : #include "Pythia8/Settings.h"
      38             : #include "Pythia8/SigmaTotal.h"
      39             : #include "Pythia8/StandardModel.h"
      40             : #include "Pythia8/SLHAinterface.h"
      41             : #include "Pythia8/SusyLesHouches.h"
      42             : 
      43             : namespace Pythia8 {
      44             : 
      45             : //==========================================================================
      46             : 
      47             : // InBeam is a simple helper class for partons and their flux in a beam.
      48             : 
      49             : class InBeam {
      50             : 
      51             : public:
      52             : 
      53             :   // Constructor.
      54           0 :   InBeam( int idIn = 0) : id(idIn), pdf(0.) {}
      55             : 
      56             :   // Values.
      57             :   int    id;
      58             :   double pdf;
      59             : 
      60             : };
      61             : 
      62             : //==========================================================================
      63             : 
      64             : // InPair is a simple helper class for colliding parton pairs and their flux.
      65             : 
      66             : class InPair {
      67             : 
      68             : public:
      69             : 
      70             :   // Constructor.
      71           0 :   InPair( int idAIn = 0, int idBIn = 0) : idA(idAIn), idB(idBIn),
      72           0 :     pdfA(0.), pdfB(0.), pdfSigma(0.) {}
      73             : 
      74             :   // Values.
      75             :   int    idA, idB;
      76             :   double pdfA, pdfB, pdfSigma;
      77             : 
      78             : };
      79             : 
      80             : //==========================================================================
      81             : 
      82             : // SigmaProcess is the base class for cross section calculations.
      83             : 
      84             : class SigmaProcess {
      85             : 
      86             : public:
      87             : 
      88             :   // Destructor.
      89           0 :   virtual ~SigmaProcess() {}
      90             : 
      91             :   // Perform simple initialization and store pointers.
      92             :   void init(Info* infoPtrIn, Settings* settingsPtrIn,
      93             :     ParticleData* particleDataPtrIn, Rndm* rndmPtrIn,
      94             :     BeamParticle* beamAPtrIn, BeamParticle* beamBPtrIn, Couplings* couplings,
      95             :     SigmaTotal* sigmaTotPtrIn = 0, SLHAinterface* slhaInterfacePtrIn = 0);
      96             : 
      97             :   // Store or replace Les Houches pointer.
      98           0 :   void setLHAPtr( LHAup* lhaUpPtrIn) {lhaUpPtr = lhaUpPtrIn;}
      99             : 
     100             :   // Initialize process. Only used for some processes.
     101           0 :   virtual void initProc() {}
     102             : 
     103             :   // Set up allowed flux of incoming partons. Default is no flux.
     104             :   virtual bool initFlux();
     105             : 
     106             :   // Input and complement kinematics for resolved 2 -> 1 process.
     107             :   // Usage: set1Kin( x1in, x2in, sHin).
     108           0 :   virtual void set1Kin( double , double , double ) {}
     109             : 
     110             :   // Input and complement kinematics for resolved 2 -> 2 process.
     111             :   // Usage: set2Kin( x1in, x2in, sHin, tHin, m3in, m4in, runBW3in, runBW4in).
     112             :   virtual void set2Kin( double , double , double , double , double ,
     113           0 :     double, double, double ) {}
     114             : 
     115             :   // Ditto, but for Multiparton Interactions applications, so different input.
     116             :   // Usage: set2KinMPI( x1in, x2in, sHin, tHin, uHin,
     117             :   //                   alpSin, alpEMin, needMasses, m3in, m4in)
     118             :   virtual void set2KinMPI( double , double , double , double ,
     119           0 :     double , double , double , bool , double , double ) {}
     120             : 
     121             :   // Input and complement kinematics for resolved 2 -> 3 process.
     122             :   // Usage: set3Kin( x1in, x2in, sHin, p3prel, p4prel, p5prel,
     123             :   //                 m3in, m4in, m5in, runBW3in, runBW4in, runBW5in);
     124             :   virtual void set3Kin( double , double , double , Vec4 , Vec4 , Vec4 ,
     125           0 :     double , double , double , double , double , double ) {}
     126             : 
     127             :   // Calculate flavour-independent parts of cross section.
     128           0 :   virtual void sigmaKin() {}
     129             : 
     130             :   // Evaluate sigma for unresolved, sigmaHat(sHat) for 2 -> 1 processes,
     131             :   // d(sigmaHat)/d(tHat) for (resolved) 2 -> 2 processes, and |M|^2 for
     132             :   // 2 -> 3 processes. Answer in "native" units, either mb or GeV^-2.
     133           0 :   virtual double sigmaHat() {return 0.;}
     134             : 
     135             :   // Wrapper to sigmaHat, to (a) store current incoming flavours and
     136             :   // (b) convert from GeV^-2 to mb where required.
     137             :   // For 2 -> 1/2 also (c) convert from from |M|^2 to d(sigmaHat)/d(tHat).
     138             :   virtual double sigmaHatWrap(int id1in = 0, int id2in = 0) {
     139           0 :     id1 = id1in; id2 = id2in;
     140           0 :     return ( convert2mb() ? CONVERT2MB * sigmaHat() : sigmaHat() ); }
     141             : 
     142             :   // Convolute above with parton flux and K factor. Sum over open channels.
     143             :   virtual double sigmaPDF();
     144             : 
     145             :   // Select incoming parton channel and extract parton densities (resolved).
     146             :   void pickInState(int id1in = 0, int id2in = 0);
     147             : 
     148             :   // Select flavour, colour and anticolour.
     149           0 :   virtual void setIdColAcol() {}
     150             : 
     151             :   // Perform kinematics for a Multiparton Interaction, in its rest frame.
     152             :   virtual bool final2KinMPI( int = 0, int = 0, Vec4 = 0., Vec4 = 0.,
     153           0 :     double = 0., double = 0.) {return true;}
     154             : 
     155             :   // Evaluate weight for simultaneous flavours (only gamma*/Z0 gamma*/Z0).
     156             :   // Usage: weightDecayFlav( process).
     157           0 :   virtual double weightDecayFlav( Event&) {return 1.;}
     158             : 
     159             :   // Evaluate weight for decay angular configuration.
     160             :   // Usage: weightDecay( process, iResBeg, iResEnd), where
     161             :   // iResBeg <= i < iResEnd is range of sister partons to test decays of.
     162           0 :   virtual double weightDecay( Event&, int, int) {return 1.;}
     163             : 
     164             :   // Set scale, when that is missing for an external LHA process.
     165           0 :   virtual void setScale() {}
     166             : 
     167             :   // Process name and code, and the number of final-state particles.
     168           0 :   virtual string name()            const {return "unnamed process";}
     169           0 :   virtual int    code()            const {return 0;}
     170           0 :   virtual int    nFinal()          const {return 2;}
     171             : 
     172             :   // Need to know which incoming partons to set up interaction for.
     173           0 :   virtual string inFlux()          const {return "unknown";}
     174             : 
     175             :   // Need to know whether to convert cross section answer from GeV^-2 to mb.
     176           0 :   virtual bool   convert2mb()      const {return true;}
     177             : 
     178             :   // For 2 -> 2 process optional conversion from |M|^2 to d(sigmaHat)/d(tHat).
     179           0 :   virtual bool   convertM2()       const {return false;}
     180             : 
     181             :   // Special treatment needed for Les Houches processes.
     182           0 :   virtual bool   isLHA()           const {return false;}
     183             : 
     184             :   // Special treatment needed for elastic and diffractive processes.
     185           0 :   virtual bool   isNonDiff()       const {return false;}
     186           0 :   virtual bool   isResolved()      const {return true;}
     187           0 :   virtual bool   isDiffA()         const {return false;}
     188           0 :   virtual bool   isDiffB()         const {return false;}
     189           0 :   virtual bool   isDiffC()         const {return false;}
     190             : 
     191             :   // Special treatment needed for SUSY processes.
     192           0 :   virtual bool   isSUSY()          const {return false;}
     193             : 
     194             :   // Special treatment needed if negative cross sections allowed.
     195           0 :   virtual bool   allowNegativeSigma() const {return false;}
     196             : 
     197             :   // Flavours in 2 -> 2/3 processes where masses needed from beginning.
     198             :   // (For a light quark masses will be used in the final kinematics,
     199             :   // but not at the matrix-element level. For a gluon no masses at all.)
     200           0 :   virtual int    id3Mass()         const {return 0;}
     201           0 :   virtual int    id4Mass()         const {return 0;}
     202           0 :   virtual int    id5Mass()         const {return 0;}
     203             : 
     204             :   // Special treatment needed if process contains an s-channel resonance.
     205           0 :   virtual int    resonanceA()      const {return 0;}
     206           0 :   virtual int    resonanceB()      const {return 0;}
     207             : 
     208             :   // 2 -> 2 and 2 -> 3 processes only through s-channel exchange.
     209           0 :   virtual bool   isSChannel()      const {return false;}
     210             : 
     211             :   // NOAM: Insert an intermediate resonance in 2 -> 1 -> 2 (or 3) listings.
     212           0 :   virtual int    idSChannel()      const {return 0;}
     213             : 
     214             :   // QCD 2 -> 3 processes need special phase space selection machinery.
     215           0 :   virtual bool   isQCD3body()      const {return false;}
     216             : 
     217             :   // Special treatment in 2 -> 3 with two massive propagators.
     218           0 :   virtual int    idTchan1()        const {return 0;}
     219           0 :   virtual int    idTchan2()        const {return 0;}
     220           0 :   virtual double tChanFracPow1()   const {return 0.3;}
     221           0 :   virtual double tChanFracPow2()   const {return 0.3;}
     222           0 :   virtual bool   useMirrorWeight() const {return false;}
     223             : 
     224             :   // Special process-specific gamma*/Z0 choice if >=0 (e.g. f fbar -> H0 Z0).
     225           0 :   virtual int    gmZmode()         const {return -1;}
     226             : 
     227             :   // Tell whether tHat and uHat are swapped (= same as swap 3 and 4).
     228           0 :   bool swappedTU()          const {return swapTU;}
     229             : 
     230             :   // Give back particle properties: flavours, colours, masses, or all.
     231           0 :   int    id(int i)          const {return idSave[i];}
     232           0 :   int    col(int i)         const {return colSave[i];}
     233           0 :   int    acol(int i)        const {return acolSave[i];}
     234           0 :   double m(int i)           const {return mSave[i];}
     235           0 :   Particle getParton(int i) const {return parton[i];}
     236             : 
     237             :   // Give back couplings and parton densities.
     238             :   // Not all known for nondiffractive.
     239           0 :   double Q2Ren()            const {return Q2RenSave;}
     240           0 :   double alphaEMRen()       const {return alpEM;}
     241           0 :   double alphaSRen()        const {return alpS;}
     242           0 :   double Q2Fac()            const {return Q2FacSave;}
     243           0 :   double pdf1()             const {return pdf1Save;}
     244           0 :   double pdf2()             const {return pdf2Save;}
     245             : 
     246             :   // Give back angles; relevant only for multipe-interactions processes.
     247           0 :   double thetaMPI()         const {return atan2( sinTheta, cosTheta);}
     248           0 :   double phiMPI()           const {return phi;}
     249           0 :   double sHBetaMPI()        const {return sHBeta;}
     250             :   double pT2MPI()           const {return pT2Mass;}
     251           0 :   double pTMPIFin()         const {return pTFin;}
     252             : 
     253             :   // Save and load kinematics for trial interactions
     254             :   void saveKin() {
     255           0 :     for (int i = 0; i < 12; i++) { partonT[i] = parton[i];
     256           0 :       mSaveT[i] = mSave[i]; }
     257           0 :     pTFinT = pTFin; phiT = phi; cosThetaT = cosTheta; sinThetaT = sinTheta; }
     258             :   void loadKin() {
     259             :     for (int i = 0; i < 12; i++) { parton[i] = partonT[i];
     260             :     mSave[i] = mSaveT[i]; }
     261             :     pTFin = pTFinT; cosTheta = cosThetaT; sinTheta = sinThetaT; phi = phiT;
     262             :   }
     263             :   void swapKin() {
     264           0 :     for (int i = 0; i < 12; i++) { swap(parton[i], partonT[i]);
     265           0 :                                   swap(mSave[i], mSaveT[i]); }
     266           0 :     swap(pTFin, pTFinT); swap(cosTheta, cosThetaT);
     267           0 :     swap(sinTheta, sinThetaT); swap(phi, phiT); }
     268             : 
     269             : protected:
     270             : 
     271             :   // Constructor.
     272           0 :   SigmaProcess() : infoPtr(0), settingsPtr(0), particleDataPtr(0),
     273           0 :     rndmPtr(0), beamAPtr(0), beamBPtr(0), couplingsPtr(0), sigmaTotPtr(0),
     274           0 :     slhaPtr(0), lhaUpPtr(0) {for (int i = 0; i < 12; ++i) mSave[i] = 0.;
     275           0 :     Q2RenSave = alpEM = alpS = Q2FacSave = pdf1Save = pdf2Save = 0.; }
     276             : 
     277             :   // Constants: could only be changed in the code itself.
     278             :   static const double CONVERT2MB, MASSMARGIN, COMPRELERR;
     279             :   static const int    NCOMPSTEP;
     280             : 
     281             :   // Pointer to various information on the generation.
     282             :   Info*           infoPtr;
     283             : 
     284             :   // Pointer to the settings database.
     285             :   Settings*       settingsPtr;
     286             : 
     287             :   // Pointer to the particle data table.
     288             :   ParticleData*   particleDataPtr;
     289             : 
     290             :   // Pointer to the random number generator.
     291             :   Rndm*           rndmPtr;
     292             : 
     293             :   // Pointers to incoming beams.
     294             :   BeamParticle*   beamAPtr;
     295             :   BeamParticle*   beamBPtr;
     296             : 
     297             :   // Pointer to Standard Model couplings, including alphaS and alphaEM.
     298             :   Couplings*      couplingsPtr;
     299             : 
     300             :   // Pointer to the total/elastic/diffractive cross section object.
     301             :   SigmaTotal*     sigmaTotPtr;
     302             : 
     303             :   // Pointer to an SLHA object.
     304             :   SusyLesHouches* slhaPtr;
     305             : 
     306             :   // Pointer to LHAup for generating external events.
     307             :   LHAup*          lhaUpPtr;
     308             : 
     309             :   // Initialization data, normally only set once.
     310             :   int    nQuarkIn, renormScale1, renormScale2, renormScale3, renormScale3VV,
     311             :          factorScale1, factorScale2, factorScale3, factorScale3VV;
     312             :   double Kfactor, mcME, mbME, mmuME, mtauME, renormMultFac, renormFixScale,
     313             :          factorMultFac, factorFixScale;
     314             : 
     315             :   // CP violation parameters for Higgs sector, normally only set once.
     316             :   int    higgsH1parity, higgsH2parity, higgsA3parity;
     317             :   double higgsH1eta, higgsH2eta, higgsA3eta, higgsH1phi, higgsH2phi,
     318             :          higgsA3phi;
     319             : 
     320             :   // Information on incoming beams.
     321             :   int    idA, idB;
     322             :   double mA, mB;
     323             :   bool   isLeptonA, isLeptonB, hasLeptonBeams;
     324             : 
     325             :   // Partons in beams, with PDF's.
     326             :   vector<InBeam> inBeamA;
     327             :   vector<InBeam> inBeamB;
     328           0 :   void addBeamA(int idIn) {inBeamA.push_back(InBeam(idIn));}
     329           0 :   void addBeamB(int idIn) {inBeamB.push_back(InBeam(idIn));}
     330           0 :   int sizeBeamA() const {return inBeamA.size();}
     331           0 :   int sizeBeamB() const {return inBeamB.size();}
     332             : 
     333             :   // Allowed colliding parton pairs, with pdf's.
     334             :   vector<InPair> inPair;
     335             :   void addPair(int idAIn, int idBIn) {
     336           0 :     inPair.push_back(InPair(idAIn, idBIn));}
     337           0 :   int sizePair() const {return inPair.size();}
     338             : 
     339             :   // Store common subprocess kinematics quantities.
     340             :   double mH, sH, sH2;
     341             : 
     342             :   // Store Q2 renormalization and factorization scales, and related values.
     343             :   double Q2RenSave, alpEM, alpS, Q2FacSave, x1Save, x2Save, pdf1Save,
     344             :          pdf2Save, sigmaSumSave;
     345             : 
     346             :   // Store flavour, colour, anticolour, mass, angles and the whole particle.
     347             :   int      id1, id2, id3, id4, id5;
     348             :   int      idSave[12], colSave[12], acolSave[12];
     349             :   double   mSave[12], cosTheta, sinTheta, phi, sHMass, sHBeta, pT2Mass, pTFin;
     350             :   Particle parton[12];
     351             : 
     352             :   // Minimal set of saved kinematics for trial interactions when
     353             :   // using the x-dependent matter profile of multiparton interactions.
     354             :   Particle partonT[12];
     355             :   double   mSaveT[12], pTFinT, cosThetaT, sinThetaT, phiT;
     356             : 
     357             :   // Calculate and store all modified masses and four-vectors
     358             :   // intended for matrix elements. Return false if failed.
     359           0 :   virtual bool setupForME() {return true;}
     360             :   bool     setupForMEin();
     361             :   double   mME[12];
     362             :   Vec4     pME[12];
     363             : 
     364             :   // Store whether tHat and uHat are swapped (= same as swap 3 and 4).
     365             :   bool swapTU;
     366             : 
     367             :   // Set flavour, colour and anticolour.
     368             :   void setId( int id1in = 0, int id2in = 0, int id3in = 0, int id4in = 0,
     369           0 :     int id5in = 0) {idSave[1] = id1in; idSave[2] = id2in; idSave[3] = id3in;
     370           0 :     idSave[4] = id4in; idSave[5] = id5in;}
     371             :   void setColAcol( int col1 = 0, int acol1 = 0,
     372             :     int col2 = 0, int acol2 = 0, int col3 = 0, int acol3 = 0,
     373             :     int col4 = 0, int acol4 = 0, int col5 = 0, int acol5 = 0) {
     374           0 :     colSave[1] = col1; acolSave[1] = acol1; colSave[2] = col2;
     375           0 :     acolSave[2] = acol2; colSave[3] = col3; acolSave[3] = acol3;
     376           0 :     colSave[4] = col4; acolSave[4] = acol4; colSave[5] = col5;
     377           0 :     acolSave[5] = acol5; }
     378           0 :   void swapColAcol() { swap(colSave[1], acolSave[1]);
     379           0 :     swap(colSave[2], acolSave[2]); swap(colSave[3], acolSave[3]);
     380           0 :     swap(colSave[4], acolSave[4]); swap(colSave[5], acolSave[5]);}
     381           0 :   void swapCol1234() { swap(colSave[1], colSave[2]);
     382           0 :     swap(colSave[3], colSave[4]); swap(acolSave[1], acolSave[2]);
     383           0 :     swap(acolSave[3], acolSave[4]);}
     384           0 :   void swapCol12() { swap(colSave[1], colSave[2]);
     385           0 :     swap(acolSave[1], acolSave[2]);}
     386           0 :   void swapCol34() { swap(colSave[3], colSave[4]);
     387           0 :     swap(acolSave[3], acolSave[4]);}
     388             : 
     389             :   // Common code for top and Higgs secondary decay angular weights.
     390             :   double weightTopDecay( Event& process, int iResBeg, int iResEnd);
     391             :   double weightHiggsDecay( Event& process, int iResBeg, int iResEnd);
     392             : 
     393             : };
     394             : 
     395             : //==========================================================================
     396             : 
     397             : // Sigma0Process is the base class for unresolved and minimum-bias processes.
     398             : // It is derived from SigmaProcess.
     399             : 
     400             : class Sigma0Process : public SigmaProcess {
     401             : 
     402             : public:
     403             : 
     404             :   // Destructor.
     405           0 :   virtual ~Sigma0Process() {}
     406             : 
     407             :   // Number of final-state particles.
     408           0 :   virtual int    nFinal() const {return 2;};
     409             : 
     410             :   // No partonic flux to be set up.
     411           0 :   virtual bool   initFlux() {return true;}
     412             : 
     413             :   // Evaluate sigma for unresolved processes.
     414           0 :   virtual double sigmaHat() {return 0.;}
     415             : 
     416             :   // Since no PDF's there is no difference from above.
     417           0 :   virtual double sigmaPDF() {return sigmaHat();}
     418             : 
     419             :   // Answer for these processes already in mb, so do not convert.
     420           0 :   virtual bool convert2mb() const {return false;}
     421             : 
     422             : protected:
     423             : 
     424             :   // Constructor.
     425           0 :   Sigma0Process() {}
     426             : 
     427             : };
     428             : 
     429             : //==========================================================================
     430             : 
     431             : // Sigma1Process is the base class for 2 -> 1 processes.
     432             : // It is derived from SigmaProcess.
     433             : 
     434             : class Sigma1Process : public SigmaProcess {
     435             : 
     436             : public:
     437             : 
     438             :   // Destructor.
     439           0 :   virtual ~Sigma1Process() {}
     440             : 
     441             :   // Number of final-state particles.
     442           0 :   virtual int    nFinal() const {return 1;};
     443             : 
     444             :   // Input and complement kinematics for resolved 2 -> 1 process.
     445             :   virtual void   set1Kin( double x1in, double x2in, double sHin) {
     446           0 :     store1Kin( x1in, x2in, sHin); sigmaKin();}
     447             : 
     448             :   // Evaluate sigmaHat(sHat) for resolved 2 -> 1 processes.
     449           0 :   virtual double sigmaHat() {return 0.;}
     450             : 
     451             :   // Wrapper to sigmaHat, to (a) store current incoming flavours,
     452             :   // (b) convert from GeV^-2 to mb where required, and
     453             :   // (c) convert from |M|^2 to d(sigmaHat)/d(tHat) where required.
     454             :   virtual double sigmaHatWrap(int id1in = 0, int id2in = 0);
     455             : 
     456             : protected:
     457             : 
     458             :   // Constructor.
     459           0 :   Sigma1Process() {}
     460             : 
     461             :   // Store kinematics and set scales for resolved 2 -> 1 process.
     462             :   virtual void   store1Kin( double x1in, double x2in, double sHin);
     463             : 
     464             :   // Calculate modified masses and four-vectors for matrix elements.
     465             :   virtual bool   setupForME();
     466             : 
     467             : };
     468             : 
     469             : //==========================================================================
     470             : 
     471             : // Sigma2Process is the base class for 2 -> 2 processes.
     472             : // It is derived from SigmaProcess.
     473             : 
     474             : class Sigma2Process : public SigmaProcess {
     475             : 
     476             : public:
     477             : 
     478             :   // Destructor.
     479           0 :   virtual ~Sigma2Process() {}
     480             : 
     481             :   // Number of final-state particles.
     482           0 :   virtual int    nFinal() const {return 2;};
     483             : 
     484             :   // Input and complement kinematics for resolved 2 -> 2 process.
     485             :   virtual void   set2Kin( double x1in, double x2in, double sHin,
     486             :     double tHin, double m3in, double m4in, double runBW3in,
     487           0 :     double runBW4in) { store2Kin( x1in, x2in, sHin, tHin, m3in, m4in,
     488           0 :     runBW3in, runBW4in); sigmaKin();}
     489             : 
     490             :   // Ditto, but for Multiparton Interactions applications, so different input.
     491             :   virtual void   set2KinMPI( double x1in, double x2in, double sHin,
     492             :     double tHin, double uHin, double alpSin, double alpEMin,
     493             :     bool needMasses, double m3in, double m4in) {
     494           0 :     store2KinMPI( x1in, x2in, sHin, tHin, uHin, alpSin, alpEMin,
     495           0 :     needMasses, m3in, m4in); sigmaKin();}
     496             : 
     497             :   // Evaluate d(sigmaHat)/d(tHat) for resolved 2 -> 2 processes.
     498           0 :   virtual double sigmaHat() {return 0.;}
     499             : 
     500             :   // Wrapper to sigmaHat, to (a) store current incoming flavours,
     501             :   // (b) convert from GeV^-2 to mb where required, and
     502             :   // (c) convert from |M|^2 to d(sigmaHat)/d(tHat) where required.
     503             :   virtual double sigmaHatWrap(int id1in = 0, int id2in = 0) {
     504           0 :     id1 = id1in; id2 = id2in; double sigmaTmp = sigmaHat();
     505           0 :     if (convertM2())  sigmaTmp /= 16. * M_PI * sH2;
     506           0 :     if (convert2mb()) sigmaTmp *= CONVERT2MB; return sigmaTmp;}
     507             : 
     508             :   // Perform kinematics for a Multiparton Interaction, in its rest frame.
     509             :   virtual bool   final2KinMPI( int i1Res = 0, int i2Res = 0, Vec4 p1Res = 0.,
     510             :     Vec4 p2Res = 0., double m1Res = 0., double m2Res = 0.);
     511             : 
     512             : protected:
     513             : 
     514             :   // Constructor.
     515           0 :   Sigma2Process() : tH(0.), uH(0.), tH2(0.), uH2(0.), m3(0.), s3(0.),
     516           0 :     m4(0.), s4(0.), pT2(0.), runBW3(0.), runBW4(0.) {}
     517             : 
     518             :   // Store kinematics and set scales for resolved 2 -> 2 process.
     519             :   virtual void   store2Kin( double x1in, double x2in, double sHin,
     520             :     double tHin, double m3in, double m4in, double runBW3in,
     521             :     double runBW4in);
     522             :   virtual void   store2KinMPI( double x1in, double x2in, double sHin,
     523             :     double tHin, double uHin, double alpSin, double alpEMin,
     524             :     bool needMasses, double m3in, double m4in);
     525             : 
     526             :   // Calculate modified masses and four-vectors for matrix elements.
     527             :   virtual bool   setupForME();
     528             : 
     529             :   // Store subprocess kinematics quantities.
     530             :   double tH, uH, tH2, uH2, m3, s3, m4, s4, pT2, runBW3, runBW4;
     531             : 
     532             : };
     533             : 
     534             : //==========================================================================
     535             : 
     536             : // Sigma3Process is the base class for 2 -> 3 processes.
     537             : // It is derived from SigmaProcess.
     538             : 
     539             : class Sigma3Process : public SigmaProcess {
     540             : 
     541             : public:
     542             : 
     543             :   // Destructor.
     544           0 :   virtual ~Sigma3Process() {}
     545             : 
     546             :   // Number of final-state particles.
     547           0 :   virtual int    nFinal() const {return 3;};
     548             : 
     549             :   // Input and complement kinematics for resolved 2 -> 3 process.
     550             :   virtual void   set3Kin( double x1in, double x2in, double sHin,
     551             :     Vec4 p3cmIn, Vec4 p4cmIn, Vec4 p5cmIn, double m3in, double m4in,
     552             :     double m5in, double runBW3in, double runBW4in, double runBW5in) {
     553           0 :     store3Kin( x1in, x2in, sHin, p3cmIn, p4cmIn, p5cmIn, m3in, m4in, m5in,
     554           0 :     runBW3in, runBW4in, runBW5in); sigmaKin();}
     555             : 
     556             :   // Evaluate d(sigmaHat)/d(tHat) for resolved 2 -> 3 processes.
     557           0 :   virtual double sigmaHat() {return 0.;}
     558             : 
     559             : protected:
     560             : 
     561             :   // Constructor.
     562           0 :   Sigma3Process() {}
     563             : 
     564             :   // Store kinematics and set scales for resolved 2 -> 3 process.
     565             :   virtual void   store3Kin( double x1in, double x2in, double sHin,
     566             :     Vec4 p3cmIn, Vec4 p4cmIn, Vec4 p5cmIn, double m3in, double m4in,
     567             :     double m5in, double runBW3in, double runBW4in, double runBW5in);
     568             : 
     569             :   // Calculate modified masses and four-vectors for matrix elements.
     570             :   virtual bool   setupForME();
     571             : 
     572             :   // Store subprocess kinematics quantities.
     573             :   double m3, s3, m4, s4, m5, s5, runBW3, runBW4, runBW5;
     574             :   Vec4   p3cm, p4cm, p5cm;
     575             : 
     576             : };
     577             : 
     578             : //==========================================================================
     579             : 
     580             : // SigmaLHAProcess is a wrapper class for Les Houches Accord external input.
     581             : // It is derived from SigmaProcess.
     582             : 
     583             : class SigmaLHAProcess : public SigmaProcess {
     584             : 
     585             : public:
     586             : 
     587             :   // Constructor.
     588           0 :   SigmaLHAProcess() {}
     589             : 
     590             :   // Destructor.
     591           0 :   virtual ~SigmaLHAProcess() {}
     592             : 
     593             :   // No partonic flux to be set up.
     594           0 :   virtual bool   initFlux() {return true;}
     595             : 
     596             :   // Dummy function: action is put in PhaseSpaceLHA.
     597           0 :   virtual double sigmaPDF() {return 1.;}
     598             : 
     599             :   // Evaluate weight for decay angular configuration, where relevant.
     600             :   virtual double weightDecay( Event& process, int iResBeg, int iResEnd);
     601             : 
     602             :   // Set scale, when that is missing for an external LHA process.
     603             :   virtual void   setScale();
     604             : 
     605             :   // Info on the subprocess.
     606           0 :   virtual string name()     const {return "Les Houches User Process(es)";}
     607           0 :   virtual int    code()     const {return 9999;}
     608             : 
     609             :   // Number of final-state particles depends on current process choice.
     610             :   virtual int    nFinal()   const;
     611             : 
     612             :   // Answer for these processes not in GeV^-2, so do not do this conversion.
     613           0 :   virtual bool   convert2mb() const {return false;}
     614             : 
     615             :   // Ensure special treatment of Les Houches processes.
     616           0 :   virtual bool   isLHA()    const {return true;}
     617             : 
     618             :   // Special treatment needed if negative cross sections allowed.
     619             :   virtual bool   allowNegativeSigma() const {
     620           0 :     return (lhaUpPtr->strategy() < 0);}
     621             : 
     622             : private:
     623             : 
     624             : };
     625             : 
     626             : //==========================================================================
     627             : 
     628             : } // end namespace Pythia8
     629             : 
     630             : #endif // Pythia8_SigmaProcess_H

Generated by: LCOV version 1.11