StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
LesHouches.h
1 // LesHouches.h is a part of the PYTHIA event generator.
2 // Copyright (C) 2020 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 Les Houches Accord user process information.
7 // LHAProcess: stores a single process; used by the other classes.
8 // LHAParticle: stores a single particle; used by the other classes.
9 // LHAup: base class for initialization and event information.
10 // LHAupLHEF: derived class for reading from an Les Houches Event File.
11 // Code for interfacing with Fortran commonblocks is found in LHAFortran.h.
12 
13 #ifndef Pythia8_LesHouches_H
14 #define Pythia8_LesHouches_H
15 
16 #include "Pythia8/Event.h"
17 #include "Pythia8/Info.h"
18 #include "Pythia8/PythiaStdlib.h"
19 #include "Pythia8/Settings.h"
20 #include "Pythia8/Streams.h"
21 
22 namespace Pythia8 {
23 
24 //==========================================================================
25 
26 // A class for the processes stored in LHAup.
27 
28 class LHAProcess {
29 
30 public:
31 
32  // Constructors.
33  LHAProcess() : idProc(0), xSecProc(0.), xErrProc(0.), xMaxProc(0.) { }
34  LHAProcess(int idProcIn, double xSecIn, double xErrIn, double xMaxIn) :
35  idProc(idProcIn), xSecProc(xSecIn), xErrProc(xErrIn),
36  xMaxProc(xMaxIn) { }
37 
38  // Process properties.
39  int idProc;
40  double xSecProc, xErrProc, xMaxProc;
41 
42 } ;
43 
44 //==========================================================================
45 
46 // A class for the particles stored in LHAup.
47 
48 class LHAParticle {
49 
50 public:
51 
52  // Constructors.
53  LHAParticle() : idPart(0), statusPart(0), mother1Part(0),
54  mother2Part(0), col1Part(0), col2Part(0), pxPart(0.), pyPart(0.),
55  pzPart(0.), ePart(0.), mPart(0.), tauPart(0.), spinPart(9.),
56  scalePart(-1.) { }
57  LHAParticle(int idIn, int statusIn, int mother1In, int mother2In,
58  int col1In, int col2In, double pxIn, double pyIn, double pzIn,
59  double eIn, double mIn, double tauIn, double spinIn,
60  double scaleIn) :
61  idPart(idIn), statusPart(statusIn), mother1Part(mother1In),
62  mother2Part(mother2In), col1Part(col1In), col2Part(col2In),
63  pxPart(pxIn), pyPart(pyIn), pzPart(pzIn), ePart(eIn), mPart(mIn),
64  tauPart(tauIn), spinPart(spinIn), scalePart(scaleIn) { }
65 
66  // Particle properties.
67  int idPart, statusPart, mother1Part, mother2Part, col1Part, col2Part;
68  double pxPart, pyPart, pzPart, ePart, mPart, tauPart, spinPart,
69  scalePart;
70 
71 } ;
72 
73 //==========================================================================
74 
75 // LHAup is base class for initialization and event information
76 // from an external parton-level generator.
77 
78 class LHAup {
79 
80 public:
81 
82  // Destructor.
83  virtual ~LHAup() {}
84 
85  // Set info pointer.
86  void setPtr(Info* infoPtrIn) {infoPtr = infoPtrIn;}
87 
88  // Method to be used for LHAupLHEF derived class.
89  virtual void newEventFile(const char*) {}
90  virtual bool fileFound() {return true;}
91  virtual bool useExternal() {return false;}
92 
93  // A pure virtual method setInit, wherein all initialization information
94  // is supposed to be set in the derived class. Can do this by reading a
95  // file or some other way, as desired. Returns false if it did not work.
96  virtual bool setInit() = 0;
97 
98  // Give back info on beams.
99  int idBeamA() const {return idBeamASave;}
100  int idBeamB() const {return idBeamBSave;}
101  double eBeamA() const {return eBeamASave;}
102  double eBeamB() const {return eBeamBSave;}
103  int pdfGroupBeamA() const {return pdfGroupBeamASave;}
104  int pdfGroupBeamB() const {return pdfGroupBeamBSave;}
105  int pdfSetBeamA() const {return pdfSetBeamASave;}
106  int pdfSetBeamB() const {return pdfSetBeamBSave;}
107 
108  // Give back weight strategy.
109  int strategy() const {return strategySave;}
110 
111  // Give back info on processes.
112  int sizeProc() const {return processes.size();}
113  int idProcess(int proc) const {return processes[proc].idProc;}
114  double xSec(int proc) const {return processes[proc].xSecProc;}
115  double xErr(int proc) const {return processes[proc].xErrProc;}
116  double xMax(int proc) const {return processes[proc].xMaxProc;}
117  double xSecSum() const {return xSecSumSave;}
118  double xErrSum() const {return xErrSumSave;}
119 
120  // Print the initialization info; useful to check that setting it worked.
121  void listInit();
122 
123  // A pure virtual method setEvent, wherein information on the next event
124  // is supposed to be set in the derived class.
125  // Strategies +-1 and +-2: idProcIn is the process type, selected by PYTHIA.
126  // Strategies +-3 and +-4: idProcIn is dummy; process choice is made locally.
127  // The method can find the next event by a runtime interface to another
128  // program, or by reading a file, as desired.
129  // The method should return false if it did not work.
130  virtual bool setEvent(int idProcIn = 0) = 0;
131 
132  // Give back process number, weight, scale, alpha_em, alpha_s.
133  int idProcess() const {return idProc;}
134  double weight() const {return weightProc;}
135  double scale() const {return scaleProc;}
136  double alphaQED() const {return alphaQEDProc;}
137  double alphaQCD() const {return alphaQCDProc;}
138 
139  // Give back info on separate particle.
140  int sizePart() const {return particles.size();}
141  int id(int part) const {return particles[part].idPart;}
142  int status(int part) const {return particles[part].statusPart;}
143  int mother1(int part) const {return particles[part].mother1Part;}
144  int mother2(int part) const {return particles[part].mother2Part;}
145  int col1(int part) const {return particles[part].col1Part;}
146  int col2(int part) const {return particles[part].col2Part;}
147  double px(int part) const {return particles[part].pxPart;}
148  double py(int part) const {return particles[part].pyPart;}
149  double pz(int part) const {return particles[part].pzPart;}
150  double e(int part) const {return particles[part].ePart;}
151  double m(int part) const {return particles[part].mPart;}
152  double tau(int part) const {return particles[part].tauPart;}
153  double spin(int part) const {return particles[part].spinPart;}
154  double scale(int part) const {return particles[part].scalePart;}
155 
156  // Give back info on flavour and x values of hard-process initiators.
157  int id1() const {return id1Save;}
158  int id2() const {return id2Save;}
159  double x1() const {return x1Save;}
160  double x2() const {return x2Save;}
161 
162  // Optional: give back info on parton density values of event.
163  bool pdfIsSet() const {return pdfIsSetSave;}
164  int id1pdf() const {return id1pdfSave;}
165  int id2pdf() const {return id2pdfSave;}
166  double x1pdf() const {return x1pdfSave;}
167  double x2pdf() const {return x2pdfSave;}
168  double scalePDF() const {return scalePDFSave;}
169  double pdf1() const {return pdf1Save;}
170  double pdf2() const {return pdf2Save;}
171 
172  // Optional: give back info on parton shower scales.
173  bool scaleShowersIsSet() const {return scaleShowersIsSetSave;}
174  double scaleShowers(int i) const {return scaleShowersSave[i];}
175 
176  // Print the info; useful to check that reading an event worked.
177  void listEvent();
178 
179  // Skip ahead a number of events, which are not considered further.
180  // Mainly intended for debug when using the LHAupLHEF class.
181  virtual bool skipEvent(int nSkip) {
182  for (int iSkip = 0; iSkip < nSkip; ++iSkip) if (!setEvent()) return false;
183  return true;}
184 
185  // Four routines to write a Les Houches Event file in steps.
186  virtual bool openLHEF(string fileNameIn);
187  virtual bool closeLHEF(bool updateInit = false);
188  bool initLHEF();
189  bool eventLHEF(bool verbose = true);
190 
191  // Get access to the Les Houches Event file name.
192  string getFileName() const {return fileName;}
193 
194 protected:
195 
196  // Constructor. Sets default to be that events come with unit weight.
197  LHAup(int strategyIn = 3) : infoPtr(), nupSave(), idprupSave(),
198  xwgtupSave(), scalupSave(), aqedupSave(), aqcdupSave(), xSecSumSave(),
199  xErrSumSave(), getPDFSave(), getScale(), getScaleShowers(),
200  id1InSave(), id2InSave(), id1pdfInSave(), id2pdfInSave(), x1InSave(),
201  x2InSave(), x1pdfInSave(), x2pdfInSave(), scalePDFInSave(),
202  pdf1InSave(), pdf2InSave(), scaleShowersInSave(), fileName("void"),
203  dateNow(), timeNow(), strategySave(strategyIn), idBeamASave(),
204  idBeamBSave(), eBeamASave(), eBeamBSave(), pdfGroupBeamASave(),
205  pdfGroupBeamBSave(), pdfSetBeamASave(), pdfSetBeamBSave(), idProc(),
206  weightProc(), scaleProc(), alphaQEDProc(), alphaQCDProc(),
207  pdfIsSetSave(), scaleShowersIsSetSave(false), id1Save(),
208  id2Save(), id1pdfSave(), id2pdfSave(), x1Save(), x2Save(), x1pdfSave(),
209  x2pdfSave(), scalePDFSave(), pdf1Save(), pdf2Save(), scaleShowersSave() {
210  processes.reserve(10); particles.reserve(20);
211  setBeamA( 0, 0., 0, 0); setBeamB( 0, 0., 0, 0); }
212 
213  // Allow conversion from mb to pb.
214  static const double CONVERTMB2PB;
215 
216  // Pointer to various information on the generation.
217  Info* infoPtr;
218 
219  // Input beam info.
220  void setBeamA(int idIn, double eIn, int pdfGroupIn = 0, int pdfSetIn = 0)
221  { idBeamASave = idIn; eBeamASave = eIn; pdfGroupBeamASave = pdfGroupIn;
222  pdfSetBeamASave = pdfSetIn;}
223  void setBeamB(int idIn, double eIn, int pdfGroupIn = 0, int pdfSetIn = 0)
224  { idBeamBSave = idIn; eBeamBSave = eIn; pdfGroupBeamBSave = pdfGroupIn;
225  pdfSetBeamBSave = pdfSetIn;}
226 
227  // Input process weight strategy.
228  void setStrategy(int strategyIn) {strategySave = strategyIn;}
229 
230  // Input process info.
231  void addProcess(int idProcIn, double xSecIn = 1., double xErrIn = 0.,
232  double xMaxIn = 1.) { processes.push_back( LHAProcess( idProcIn,
233  xSecIn, xErrIn, xMaxIn)); }
234 
235  // Possibility to update some cross section info at end of run.
236  void setXSec(int iP, double xSecIn) {processes[iP].xSecProc = xSecIn;}
237  void setXErr(int iP, double xErrIn) {processes[iP].xErrProc = xErrIn;}
238  void setXMax(int iP, double xMaxIn) {processes[iP].xMaxProc = xMaxIn;}
239 
240  // Input info on the selected process.
241  void setProcess(int idProcIn = 0, double weightIn = 1., double
242  scaleIn = 0., double alphaQEDIn = 0.0073, double alphaQCDIn = 0.12) {
243  idProc = idProcIn; weightProc = weightIn; scaleProc = scaleIn;
244  alphaQEDProc = alphaQEDIn; alphaQCDProc = alphaQCDIn;
245  // Clear particle list. Add empty zeroth particle for correct indices.
246  particles.clear(); addParticle(0); pdfIsSetSave = false;
247  scaleShowersIsSetSave = false;}
248 
249  // Input particle info, one particle at the time.
250  void addParticle(LHAParticle particleIn) {
251  particles.push_back(particleIn);}
252  void addParticle(int idIn, int statusIn = 0, int mother1In = 0,
253  int mother2In = 0, int col1In = 0, int col2In = 0, double pxIn = 0.,
254  double pyIn = 0., double pzIn = 0., double eIn = 0., double mIn = 0.,
255  double tauIn = 0., double spinIn = 9., double scaleIn = -1.) {
256  particles.push_back( LHAParticle( idIn, statusIn, mother1In, mother2In,
257  col1In, col2In, pxIn, pyIn, pzIn, eIn, mIn, tauIn, spinIn,
258  scaleIn) ); }
259 
260  // Input info on flavour and x values of hard-process initiators.
261  void setIdX(int id1In, int id2In, double x1In, double x2In)
262  { id1Save = id1In; id2Save = id2In; x1Save = x1In; x2Save = x2In;}
263 
264  // Optionally input info on parton density values of event.
265  void setPdf(int id1pdfIn, int id2pdfIn, double x1pdfIn, double x2pdfIn,
266  double scalePDFIn, double pdf1In, double pdf2In, bool pdfIsSetIn)
267  { id1pdfSave = id1pdfIn; id2pdfSave = id2pdfIn; x1pdfSave = x1pdfIn;
268  x2pdfSave = x2pdfIn; scalePDFSave = scalePDFIn; pdf1Save = pdf1In;
269  pdf2Save = pdf2In; pdfIsSetSave = pdfIsSetIn;}
270 
271  // Optionally input info on parton shower starting scale; two for DPS.
272  void setScaleShowers( double scaleIn1, double scaleIn2 = 0.)
273  { scaleShowersSave[0] = scaleIn1; scaleShowersSave[1] = scaleIn2;
274  scaleShowersIsSetSave = true;}
275 
276  // Three routines for LHEF files, but put here for flexibility.
277  bool setInitLHEF(istream& is, bool readHeaders = false);
278  bool setNewEventLHEF(istream& is);
279  bool setOldEventLHEF();
280 
281  // Helper routines to open and close a file handling GZIP:
282  // ifstream ifs;
283  // istream *is = openFile("myFile.txt", ifs);
284  // -- Process file using is --
285  // closeFile(is, ifs);
286  istream* openFile(const char *fn, ifstream &ifs);
287  void closeFile(istream *&is, ifstream &ifs);
288 
289  // LHAup is a friend class to infoPtr, but derived classes
290  // are not. This wrapper function can be used by derived classes
291  // to set headers in the Info class.
292  void setInfoHeader(const string &key, const string &val) {
293  infoPtr->setHeader(key, val); }
294 
295  // Event properties from LHEF files, for repeated use.
296  int nupSave, idprupSave;
297  double xwgtupSave, scalupSave, aqedupSave, aqcdupSave, xSecSumSave,
298  xErrSumSave;
299  vector<LHAParticle> particlesSave;
300  bool getPDFSave, getScale, getScaleShowers;
301  int id1InSave, id2InSave, id1pdfInSave, id2pdfInSave;
302  double x1InSave, x2InSave, x1pdfInSave, x2pdfInSave, scalePDFInSave,
303  pdf1InSave, pdf2InSave, scaleShowersInSave[2];
304 
305  // File to which to write Les Houches Event File information.
306  string fileName;
307  fstream osLHEF;
308  char dateNow[12];
309  char timeNow[9];
310 
311 private:
312 
313  // Event weighting and mixing strategy.
314  int strategySave;
315 
316  // Beam particle properties.
317  int idBeamASave, idBeamBSave;
318  double eBeamASave, eBeamBSave;
319  int pdfGroupBeamASave, pdfGroupBeamBSave, pdfSetBeamASave,
320  pdfSetBeamBSave;
321 
322  // The process list, stored as a vector of processes.
323  vector<LHAProcess> processes;
324 
325  // Store info on the selected process.
326  int idProc;
327  double weightProc, scaleProc, alphaQEDProc, alphaQCDProc;
328 
329  // The particle list, stored as a vector of particles.
330  vector<LHAParticle> particles;
331 
332  // Info on initiators and optionally on parton density values of event.
333  bool pdfIsSetSave, scaleShowersIsSetSave;
334  int id1Save, id2Save, id1pdfSave, id2pdfSave;
335  double x1Save, x2Save, x1pdfSave, x2pdfSave, scalePDFSave, pdf1Save,
336  pdf2Save, scaleShowersSave[2];
337 
338 };
339 
340 //==========================================================================
341 
342 // A derived class with information read from a Les Houches Event File.
343 
344 class LHAupLHEF : public LHAup {
345 
346 public:
347 
348  // Constructor.
349  LHAupLHEF(Pythia8::Info* infoPtrIn, istream* isIn, istream* isHeadIn,
350  bool readHeadersIn = false, bool setScalesFromLHEFIn = false ) :
351  filename(""), headerfile(""),
352  is(isIn), is_gz(NULL), isHead(isHeadIn), isHead_gz(NULL),
353  readHeaders(readHeadersIn), reader(is),
354  setScalesFromLHEF(setScalesFromLHEFIn), hasExtFileStream(true),
355  hasExtHeaderStream(true) {setPtr(infoPtrIn);}
356 
357  LHAupLHEF(Pythia8::Info* infoPtrIn, const char* filenameIn,
358  const char* headerIn = NULL, bool readHeadersIn = false,
359  bool setScalesFromLHEFIn = false ) :
360  filename(filenameIn), headerfile(headerIn),
361  is(NULL), is_gz(NULL), isHead(NULL), isHead_gz(NULL),
362  readHeaders(readHeadersIn), reader(filenameIn),
363  setScalesFromLHEF(setScalesFromLHEFIn), hasExtFileStream(false),
364  hasExtHeaderStream(false) {
365  setPtr(infoPtrIn);
366  is = (openFile(filenameIn, ifs));
367  isHead = (headerfile == NULL) ? is : openFile(headerfile, ifsHead);
368  is_gz = new igzstream(filename);
369  isHead_gz = (headerfile == NULL) ? is_gz : new igzstream(headerfile);
370  }
371 
372  // Destructor.
373  ~LHAupLHEF() {
374  // Close files
375  closeAllFiles();
376  }
377 
378  // Helper routine to correctly close files.
379  void closeAllFiles() {
380 
381  if (!hasExtHeaderStream && isHead_gz != is_gz) isHead_gz->close();
382  if (isHead_gz != is_gz) delete isHead_gz;
383  if (is_gz) is_gz->close();
384  if (is_gz) delete is_gz;
385 
386  // Close header file if separate, and close main file.
387  if (!hasExtHeaderStream && isHead != is) closeFile(isHead, ifsHead);
388  if (!hasExtFileStream) closeFile(is, ifs);
389  }
390 
391  // Want to use new file with events, but without reinitialization.
392  void newEventFile(const char* filenameIn) {
393  // Close files and then open new file.
394  closeAllFiles();
395  is = (openFile(filenameIn, ifs));
396  is_gz = new igzstream(filenameIn);
397  // Re-initialise Les Houches file reader.
398  reader.setup(filenameIn);
399  // Set isHead to is to keep expected behaviour in
400  // fileFound() and closeAllFiles().
401  isHead = is;
402  isHead_gz = is_gz;
403  }
404 
405  // Confirm that file was found and opened as expected.
406  bool fileFound() {return (useExternal() || (isHead->good() && is->good()));}
407  bool useExternal() {return (hasExtHeaderStream && hasExtFileStream);}
408 
409  // Routine for doing the job of reading and setting initialization info.
410  bool setInit() {
411  return setInitLHEF(*isHead, readHeaders);
412  }
413 
414  // Routine for doing the job of reading and setting initialization info.
415  bool setInitLHEF( istream & isIn, bool readHead);
416 
417  // Routine for doing the job of reading and setting info on next event.
418  bool setEvent(int = 0) {
419  if (!setNewEventLHEF()) return false;
420  return setOldEventLHEF();
421  }
422 
423  // Skip ahead a number of events, which are not considered further.
424  bool skipEvent(int nSkip) {
425  for (int iSkip = 0; iSkip < nSkip; ++iSkip)
426  if (!setNewEventLHEF()) return false;
427  return true;
428  }
429 
430  // Routine for doing the job of reading and setting info on next event.
431  bool setNewEventLHEF();
432 
433  // Update cross-section information at the end of the run.
434  bool updateSigma() {return true;}
435 
436 protected:
437 
438  // Used internally to read a single line from the stream.
439  bool getLine(string & line, bool header = true) {
440 #ifdef GZIP
441  if ( isHead_gz && header && !getline(*isHead_gz, line)) return false;
442  else if ( is_gz && !header && !getline(*is_gz, line)) return false;
443  if (header && !getline(*isHead, line)) return false;
444  else if (!header && !getline(*is, line)) return false;
445 #else
446  if (header && !getline(*isHead, line)) return false;
447  else if (!header && !getline(*is, line)) return false;
448 #endif
449  // Replace single by double quotes
450  replace(line.begin(),line.end(),'\'','\"');
451  return true;
452  }
453 
454 private:
455 
456  const char* filename;
457  const char* headerfile;
458 
459  // File from which to read (or a stringstream).
460  // Optionally also a file from which to read the LHEF header.
461  istream *is;
462  igzstream *is_gz;
463  ifstream ifs;
464  istream *isHead;
465  igzstream *isHead_gz;
466  ifstream ifsHead;
467 
468  // Flag to read headers or not
469  bool readHeaders;
470 
471  Reader reader;
472 
473  // Flag to set particle production scales or not.
474  bool setScalesFromLHEF, hasExtFileStream, hasExtHeaderStream;
475 
476 };
477 
478 //==========================================================================
479 
480 // A derived class to be loaded as a plugin library.
481 class Pythia;
482 class LHAupPlugin : public LHAup {
483 
484 public:
485 
486  // Constructor and destructor.
487  LHAupPlugin(string nameIn = "", Pythia *pythiaPtr = nullptr);
488  ~LHAupPlugin();
489 
490  // Routine for doing the job of setting initialization info.
491  bool setInit() override {
492  return lhaPtr != nullptr ? lhaPtr->setInit() : false;}
493  // Routine for doing the job of setting info on next event.
494  bool setEvent(int idProcIn = 0) override {
495  return lhaPtr != nullptr ? lhaPtr->setEvent(idProcIn) : false;}
496 
497 private:
498 
499  // Typedefs of the hooks used to access the plugin.
500  typedef LHAup* NewLHAup(Pythia*);
501  typedef void DeleteLHAup(LHAup*);
502 
503  // The loaded MEs object, plugin library, and plugin name.
504  LHAup *lhaPtr;
505  PluginPtr libPtr;
506  string name;
507 
508 };
509 
510 //==========================================================================
511 
512 // A derived class with information read from PYTHIA 8 itself, for output.
513 
514 class LHAupFromPYTHIA8 : public LHAup {
515 
516 public:
517 
518  // Constructor.
519  LHAupFromPYTHIA8(Event* processPtrIn, const Info* infoPtrIn) {
520  processPtr = processPtrIn; infoPtr = infoPtrIn;}
521 
522  // Destructor.
523  ~LHAupFromPYTHIA8() {}
524 
525  // Routine for doing the job of reading and setting initialization info.
526  bool setInit();
527 
528  // Routine for doing the job of reading and setting info on next event.
529  bool setEvent(int = 0);
530 
531  // Update cross-section information at the end of the run.
532  bool updateSigma();
533 
534 private:
535 
536  // Pointers to process event record and further information.
537  Event* processPtr;
538  const Info* infoPtr;
539 
540 };
541 
542 //==========================================================================
543 
544 // A derived class with LHEF 3.0 information read from PYTHIA 8 itself, for
545 // output.
546 
547 class LHEF3FromPythia8 : public LHAup {
548 
549 public:
550 
551  // Constructor.
552  LHEF3FromPythia8(Event* eventPtrIn, const Info* infoPtrIn,
553  int pDigitsIn = 15, bool writeToFileIn = true) :
554  eventPtr(eventPtrIn),infoPtr(infoPtrIn),
555  settingsPtr(infoPtrIn->settingsPtr),
556  particleDataPtr(infoPtrIn->particleDataPtr), writer(osLHEF),
557  pDigits(pDigitsIn), writeToFile(writeToFileIn) {}
558 
559  // Routine for reading, setting and printing the initialisation info.
560  bool setInit();
561 
562  // Routine for reading, setting and printing the next event.
563  void setEventPtr(Event* evPtr) { eventPtr = evPtr; }
564  bool setEvent(int = 0);
565  string getEventString() { return writer.getEventString(&hepeup); }
566 
567  // Function to open the output file.
568  bool openLHEF(string fileNameIn);
569 
570  // Function to close (and possibly update) the output file.
571  bool closeLHEF(bool updateInit = false);
572 
573 private:
574 
575  // Pointer to event that should be printed.
576  Event* eventPtr;
577 
578  // Pointer to settings and info objects.
579  const Info* infoPtr;
580  Settings* settingsPtr;
581  ParticleData* particleDataPtr;
582 
583  // LHEF3 writer
584  Writer writer;
585 
586  // Number of digits to set width of double write out
587  int pDigits;
588  bool writeToFile;
589 
590  // Some internal init and event block objects for convenience.
591  HEPRUP heprup;
592  HEPEUP hepeup;
593 
594 };
595 
596 //==========================================================================
597 
598 } // end namespace Pythia8
599 
600 #endif // Pythia8_LesHouches_H
Definition: AgUStep.h:26