1 // LesHouches.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.
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.
13 #ifndef Pythia8_LesHouches_H
14 #define Pythia8_LesHouches_H
18 #include "PythiaStdlib.h"
23 //==========================================================================
25 // A class for the processes stored in LHAup.
32 LHAProcess() : idProc(0), xSecProc(0.), xErrProc(0.), xMaxProc(0.) { }
33 LHAProcess(int idProcIn, double xSecIn, double xErrIn, double xMaxIn) :
34 idProc(idProcIn), xSecProc(xSecIn), xErrProc(xErrIn),
37 // Process properties.
39 double xSecProc, xErrProc, xMaxProc;
43 //==========================================================================
45 // A class for the particles stored in LHAup.
52 LHAParticle() : idPart(0), statusPart(0), mother1Part(0),
53 mother2Part(0), col1Part(0), col2Part(0), pxPart(0.), pyPart(0.),
54 pzPart(0.), ePart(0.), mPart(0.), tauPart(0.), spinPart(9.) { }
55 LHAParticle(int idIn, int statusIn, int mother1In, int mother2In,
56 int col1In, int col2In, double pxIn, double pyIn, double pzIn,
57 double eIn, double mIn, double tauIn, double spinIn) :
58 idPart(idIn), statusPart(statusIn), mother1Part(mother1In),
59 mother2Part(mother2In), col1Part(col1In), col2Part(col2In),
60 pxPart(pxIn), pyPart(pyIn), pzPart(pzIn), ePart(eIn), mPart(mIn),
61 tauPart(tauIn), spinPart(spinIn) { }
63 // Particle properties.
64 int idPart, statusPart, mother1Part, mother2Part, col1Part, col2Part;
65 double pxPart, pyPart, pzPart, ePart, mPart, tauPart, spinPart;
69 //==========================================================================
71 // LHAup is base class for initialization and event information
72 // from an external parton-level generator.
82 void setPtr(Info* infoPtrIn) {infoPtr = infoPtrIn;}
84 // Method to be used for LHAupLHEF derived class.
85 virtual void newEventFile(const char*) {}
86 virtual bool fileFound() {return true;}
88 // A pure virtual method setInit, wherein all initialization information
89 // is supposed to be set in the derived class. Can do this by reading a
90 // file or some other way, as desired. Returns false if it did not work.
91 virtual bool setInit() = 0;
93 // Give back info on beams.
94 int idBeamA() const {return idBeamASave;}
95 int idBeamB() const {return idBeamBSave;}
96 double eBeamA() const {return eBeamASave;}
97 double eBeamB() const {return eBeamBSave;}
98 int pdfGroupBeamA() const {return pdfGroupBeamASave;}
99 int pdfGroupBeamB() const {return pdfGroupBeamBSave;}
100 int pdfSetBeamA() const {return pdfSetBeamASave;}
101 int pdfSetBeamB() const {return pdfSetBeamBSave;}
103 // Give back weight strategy.
104 int strategy() const {return strategySave;}
106 // Give back info on processes.
107 int sizeProc() const {return processes.size();}
108 int idProcess(int proc) const {return processes[proc].idProc;}
109 double xSec(int proc) const {return processes[proc].xSecProc;}
110 double xErr(int proc) const {return processes[proc].xErrProc;}
111 double xMax(int proc) const {return processes[proc].xMaxProc;}
112 double xSecSum() const {return xSecSumSave;}
113 double xErrSum() const {return xErrSumSave;}
115 // Print the initialization info; useful to check that setting it worked.
116 void listInit(ostream& os = cout);
118 // A pure virtual method setEvent, wherein information on the next event
119 // is supposed to be set in the derived class.
120 // Strategies +-1 and +-2: idProcIn is the process type, selected by PYTHIA.
121 // Strategies +-3 and +-4: idProcIn is dummy; process choice is made locally.
122 // The method can find the next event by a runtime interface to another
123 // program, or by reading a file, as desired.
124 // The method should return false if it did not work.
125 virtual bool setEvent(int idProcIn = 0) = 0;
127 // Give back process number, weight, scale, alpha_em, alpha_s.
128 int idProcess() const {return idProc;}
129 double weight() const {return weightProc;}
130 double scale() const {return scaleProc;}
131 double alphaQED() const {return alphaQEDProc;}
132 double alphaQCD() const {return alphaQCDProc;}
134 // Give back info on separate particle.
135 int sizePart() const {return particles.size();}
136 int id(int part) const {return particles[part].idPart;}
137 int status(int part) const {return particles[part].statusPart;}
138 int mother1(int part) const {return particles[part].mother1Part;}
139 int mother2(int part) const {return particles[part].mother2Part;}
140 int col1(int part) const {return particles[part].col1Part;}
141 int col2(int part) const {return particles[part].col2Part;}
142 double px(int part) const {return particles[part].pxPart;}
143 double py(int part) const {return particles[part].pyPart;}
144 double pz(int part) const {return particles[part].pzPart;}
145 double e(int part) const {return particles[part].ePart;}
146 double m(int part) const {return particles[part].mPart;}
147 double tau(int part) const {return particles[part].tauPart;}
148 double spin(int part) const {return particles[part].spinPart;}
150 // Give back info on flavour and x values of hard-process initiators.
151 int id1() const {return id1Save;}
152 int id2() const {return id2Save;}
153 double x1() const {return x1Save;}
154 double x2() const {return x2Save;}
156 // Optional: give back info on parton density values of event.
157 bool pdfIsSet() const {return pdfIsSetSave;}
158 int id1pdf() const {return id1pdfSave;}
159 int id2pdf() const {return id2pdfSave;}
160 double x1pdf() const {return x1pdfSave;}
161 double x2pdf() const {return x2pdfSave;}
162 double scalePDF() const {return scalePDFSave;}
163 double pdf1() const {return pdf1Save;}
164 double pdf2() const {return pdf2Save;}
166 // Print the info; useful to check that reading an event worked.
167 void listEvent(ostream& os = cout);
169 // Skip ahead a number of events, which are not considered further.
170 // Mainly intended for debug when using the LHAupLHEF class.
171 virtual bool skipEvent(int nSkip) {
172 for (int iSkip = 0; iSkip < nSkip; ++iSkip)
173 if (!setEvent()) return false; return true;}
175 // Four routines to write a Les Houches Event file in steps.
176 bool openLHEF(string fileNameIn);
178 bool eventLHEF(bool verbose = true);
179 bool closeLHEF(bool updateInit = false);
183 // Constructor. Sets default to be that events come with unit weight.
184 LHAup(int strategyIn = 3) : strategySave(strategyIn)
185 { processes.reserve(10); particles.reserve(20); }
187 // Allow conversion from mb to pb.
188 static const double CONVERTMB2PB;
190 // Pointer to various information on the generation.
194 void setBeamA(int idIn, double eIn, int pdfGroupIn = 0, int pdfSetIn = 0)
195 { idBeamASave = idIn; eBeamASave = eIn; pdfGroupBeamASave = pdfGroupIn;
196 pdfSetBeamASave = pdfSetIn;}
197 void setBeamB(int idIn, double eIn, int pdfGroupIn = 0, int pdfSetIn = 0)
198 { idBeamBSave = idIn; eBeamBSave = eIn; pdfGroupBeamBSave = pdfGroupIn;
199 pdfSetBeamBSave = pdfSetIn;}
201 // Input process weight strategy.
202 void setStrategy(int strategyIn) {strategySave = strategyIn;}
204 // Input process info.
205 void addProcess(int idProcIn, double xSecIn = 1., double xErrIn = 0.,
206 double xMaxIn = 1.) { processes.push_back( LHAProcess( idProcIn,
207 xSecIn, xErrIn, xMaxIn)); }
209 // Possibility to update some cross section info at end of run.
210 void setXSec(int iP, double xSecIn) {processes[iP].xSecProc = xSecIn;}
211 void setXErr(int iP, double xErrIn) {processes[iP].xErrProc = xErrIn;}
212 void setXMax(int iP, double xMaxIn) {processes[iP].xMaxProc = xMaxIn;}
214 // Input info on the selected process.
215 void setProcess(int idProcIn = 0, double weightIn = 1., double
216 scaleIn = 0., double alphaQEDIn = 0.0073, double alphaQCDIn = 0.12) {
217 idProc = idProcIn; weightProc = weightIn; scaleProc = scaleIn;
218 alphaQEDProc = alphaQEDIn; alphaQCDProc = alphaQCDIn;
219 // Clear particle list. Add empty zeroth particle for correct indices.
220 particles.clear(); addParticle(0); pdfIsSetSave = false;}
222 // Input particle info, one particle at the time.
223 void addParticle(LHAParticle particleIn) {
224 particles.push_back(particleIn);}
225 void addParticle(int idIn, int statusIn = 0, int mother1In = 0,
226 int mother2In = 0, int col1In = 0, int col2In = 0, double pxIn = 0.,
227 double pyIn = 0., double pzIn = 0., double eIn = 0., double mIn = 0.,
228 double tauIn = 0., double spinIn = 9.) {
229 particles.push_back( LHAParticle( idIn, statusIn, mother1In, mother2In,
230 col1In, col2In, pxIn, pyIn, pzIn, eIn, mIn, tauIn, spinIn)); }
232 // Input info on flavour and x values of hard-process initiators.
233 void setIdX(int id1In, int id2In, double x1In, double x2In)
234 { id1Save = id1In; id2Save = id2In; x1Save = x1In; x2Save = x2In;}
236 // Optionally input info on parton density values of event.
237 void setPdf(int id1pdfIn, int id2pdfIn, double x1pdfIn, double x2pdfIn,
238 double scalePDFIn, double pdf1In, double pdf2In, bool pdfIsSetIn)
239 { id1pdfSave = id1pdfIn; id2pdfSave = id2pdfIn; x1pdfSave = x1pdfIn;
240 x2pdfSave = x2pdfIn; scalePDFSave = scalePDFIn; pdf1Save = pdf1In;
241 pdf2Save = pdf2In; pdfIsSetSave = pdfIsSetIn;}
243 // Three routines for LHEF files, but put here for flexibility.
244 bool setInitLHEF(istream& is, bool readHeaders = false);
245 bool setNewEventLHEF(istream& is);
246 bool setOldEventLHEF();
248 // Helper routines to open and close a file handling GZIPSUPPORT:
250 // istream *is = openFile("myFile.txt", ifs);
251 // -- Process file using is --
252 // closeFile(is, ifs);
253 istream* openFile(const char *fn, ifstream &ifs);
254 void closeFile(istream *&is, ifstream &ifs);
256 // LHAup is a friend class to infoPtr, but derived classes
257 // are not. This wrapper function can be used by derived classes
258 // to set headers in the Info class.
259 void setInfoHeader(const string &key, const string &val) {
260 infoPtr->setHeader(key, val); }
262 // Event properties from LHEF files, for repeated use.
263 int nupSave, idprupSave;
264 double xwgtupSave, scalupSave, aqedupSave, aqcdupSave, xSecSumSave,
266 vector<LHAParticle> particlesSave;
268 int id1InSave, id2InSave, id1pdfInSave, id2pdfInSave;
269 double x1InSave, x2InSave, x1pdfInSave, x2pdfInSave, scalePDFInSave,
270 pdf1InSave, pdf2InSave;
274 // Event weighting and mixing strategy.
277 // Beam particle properties.
278 int idBeamASave, idBeamBSave;
279 double eBeamASave, eBeamBSave;
280 int pdfGroupBeamASave, pdfGroupBeamBSave, pdfSetBeamASave, pdfSetBeamBSave;
282 // The process list, stored as a vector of processes.
283 vector<LHAProcess> processes;
285 // Store info on the selected process.
287 double weightProc, scaleProc, alphaQEDProc, alphaQCDProc;
289 // The particle list, stored as a vector of particles.
290 vector<LHAParticle> particles;
292 // Info on initiators and optionally on parton density values of event.
294 int id1Save, id2Save, id1pdfSave, id2pdfSave;
295 double x1Save, x2Save, x1pdfSave, x2pdfSave, scalePDFSave, pdf1Save,
298 // File to which to write Les Houches Event File information.
306 //==========================================================================
308 // A derived class with information read from a Les Houches Event File.
310 class LHAupLHEF : public LHAup {
315 LHAupLHEF(const char* fileIn, const char* headerIn = NULL,
316 bool readHeaders = false);
321 // Helper routine to correctly close files
322 void closeAllFiles() {
323 // Close header file if separate, and close main file
324 if (isHead != is) closeFile(isHead, ifsHead);
328 // Want to use new file with events, but without reinitialization.
329 void newEventFile(const char* fileIn) {
330 // Close files and then open new file
332 is = openFile(fileIn, ifs);
334 // Set isHead to is to keep expected behaviour in
335 // fileFound() and closeAllFiles()
339 // Confirm that file was found and opened as expected.
340 bool fileFound() { return (isHead->good() && is->good()); }
342 // Routine for doing the job of reading and setting initialization info.
343 bool setInit() {return setInitLHEF(*isHead, readHeaders);}
345 // Routine for doing the job of reading and setting info on next event.
346 bool setEvent(int = 0) {if (!setNewEventLHEF(*is)) return false;
347 return setOldEventLHEF();}
349 // Skip ahead a number of events, which are not considered further.
350 bool skipEvent(int nSkip) {for (int iSkip = 0; iSkip < nSkip; ++iSkip)
351 if (!setNewEventLHEF(*is)) return false; return true;}
355 // File from which to read (or a stringstream).
356 // Optionally also a file from which to read the LHEF header.
357 ifstream ifs, ifsHead;
358 istream *is, *isHead;
360 // Flag to read headers or not
364 //==========================================================================
366 // A derived class with information read from PYTHIA 8 itself, for output.
368 class LHAupFromPYTHIA8 : public LHAup {
373 LHAupFromPYTHIA8(Event* processPtrIn, Info* infoPtrIn) {
374 processPtr = processPtrIn; infoPtr = infoPtrIn;}
377 ~LHAupFromPYTHIA8() {}
379 // Routine for doing the job of reading and setting initialization info.
382 // Routine for doing the job of reading and setting info on next event.
383 bool setEvent(int = 0);
385 // Update cross-section information at the end of the run.
390 // Pointers to process event record and further information.
396 //==========================================================================
398 } // end namespace Pythia8
400 #endif // Pythia8_LesHouches_H