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