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