1 | // Info.cc 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 | // Function definitions (not found in the header) for the Info class. |
---|
7 | |
---|
8 | #include "Info.h" |
---|
9 | |
---|
10 | namespace Pythia8 { |
---|
11 | |
---|
12 | //========================================================================== |
---|
13 | |
---|
14 | // Info class. |
---|
15 | // This class contains a mixed bag of information on the event generation |
---|
16 | // activity, especially on the current subprocess properties. |
---|
17 | |
---|
18 | //-------------------------------------------------------------------------- |
---|
19 | |
---|
20 | // Constants: could be changed here if desired, but normally should not. |
---|
21 | // These are of technical nature, as described for each. |
---|
22 | |
---|
23 | // Number of times the same error message will be repeated at most. |
---|
24 | const int Info::TIMESTOPRINT = 1; |
---|
25 | |
---|
26 | // LHA convention with cross section in pb may require conversion from mb. |
---|
27 | const double Info::CONVERTMB2PB = 1e9; |
---|
28 | |
---|
29 | //-------------------------------------------------------------------------- |
---|
30 | |
---|
31 | // List (almost) all information currently set. |
---|
32 | |
---|
33 | void Info::list(ostream& os) const { |
---|
34 | |
---|
35 | // Header and beam info. |
---|
36 | os << "\n -------- PYTHIA Info Listing ------------------------" |
---|
37 | << "---------------- \n \n" |
---|
38 | << scientific << setprecision(3) |
---|
39 | << " Beam A: id = " << setw(6) << idASave << ", pz = " << setw(10) |
---|
40 | << pzASave << ", e = " << setw(10) << eASave << ", m = " << setw(10) |
---|
41 | << mASave << ".\n" |
---|
42 | << " Beam B: id = " << setw(6) << idBSave << ", pz = " << setw(10) |
---|
43 | << pzBSave << ", e = " << setw(10) << eBSave << ", m = " << setw(10) |
---|
44 | << mBSave << ".\n\n"; |
---|
45 | |
---|
46 | // Done if no subprocess has been defined. |
---|
47 | if (codeSave == 0 && nFinalSave == 0) { |
---|
48 | os << " No process has been set; something must have gone wrong! \n" |
---|
49 | << "\n -------- End PYTHIA Info Listing --------------------" |
---|
50 | << "----------------" << endl; |
---|
51 | return; |
---|
52 | } |
---|
53 | |
---|
54 | // Colliding parton info. |
---|
55 | if (isRes) { |
---|
56 | os << " In 1: id = " << setw(4) << id1pdfSave[0] << ", x = " |
---|
57 | << setw(10) << x1pdfSave[0] << ", pdf = " << setw(10) << pdf1Save[0] |
---|
58 | << " at Q2 = " << setw(10) << Q2FacSave[0] << ".\n" |
---|
59 | << " In 2: id = " << setw(4) << id2pdfSave[0] << ", x = " |
---|
60 | << setw(10) << x2pdfSave[0] << ", pdf = " << setw(10) << pdf2Save[0] |
---|
61 | << " at same Q2.\n"; |
---|
62 | bool matchIdX = true; |
---|
63 | if (id1pdfSave[0] != id1Save[0] || id2pdfSave[0] != id2Save[0]) |
---|
64 | matchIdX = false; |
---|
65 | if (abs(x1pdfSave[0] - x1Save[0]) > 1e-4 * x1Save[0]) matchIdX = false; |
---|
66 | if (abs(x2pdfSave[0] - x2Save[0]) > 1e-4 * x2Save[0]) matchIdX = false; |
---|
67 | if (!matchIdX) os << " Warning: above flavour/x info does not match" |
---|
68 | << " incoming partons in event!\n"; |
---|
69 | os << "\n"; |
---|
70 | } |
---|
71 | |
---|
72 | // Process name and code. |
---|
73 | os << ((isRes && !hasSubSave[0]) ? " Subprocess " : " Process ") << nameSave |
---|
74 | << " with code " << codeSave << " is 2 -> " << nFinalSave << ".\n"; |
---|
75 | |
---|
76 | // Subprocess name and code for minimum bias processes. |
---|
77 | if (hasSubSave[0]) |
---|
78 | os << " Subprocess " << nameSubSave[0] << " with code " << codeSubSave[0] |
---|
79 | << " is 2 -> " << nFinalSubSave[0] << ".\n"; |
---|
80 | |
---|
81 | // Process-type-specific kinematics information. |
---|
82 | if ( isRes && nFinalSave == 1) |
---|
83 | os << " It has sHat = " << setw(10) << sH[0] << ".\n"; |
---|
84 | else if ( isRes && nFinalSave == 2) |
---|
85 | os << " It has sHat = " << setw(10) << sH[0] << ", tHat = " |
---|
86 | << setw(10) << tH[0] << ", uHat = " << setw(10) << uH[0] << ",\n" |
---|
87 | << " pTHat = " << setw(10) << pTH[0] << ", m3Hat = " |
---|
88 | << setw(10) << m3H[0] << ", m4Hat = " << setw(10) << m4H[0] << ",\n" |
---|
89 | << " thetaHat = " << setw(10) << thetaH[0] << ", phiHat = " |
---|
90 | << setw(10) << phiH[0] << ".\n"; |
---|
91 | else if ( nFinalSave == 2) |
---|
92 | os << " It has s = " << setw(10) << sH[0] << ", t = " << setw(10) |
---|
93 | << tH[0] << ", u = " << setw(10) << uH[0] << ",\n" |
---|
94 | << " pT = " << setw(10) << pTH[0] << ", m3 = " << setw(10) |
---|
95 | << m3H[0] << ", m4 = " << setw(10) << m4H[0] << ",\n" |
---|
96 | << " theta = " << setw(10) << thetaH[0] << ", phi = " << setw(10) |
---|
97 | << phiH[0] << ".\n"; |
---|
98 | else if ( isRes && nFinalSave == 3) |
---|
99 | os << " It has sHat = " << setw(10) << sH[0] << ", <pTHat> = " |
---|
100 | << setw(10) << pTH[0] << ".\n"; |
---|
101 | else if ( nFinalSave == 3) |
---|
102 | os << " It has s = " << setw(10) << sH[0] << ", t_A = " << setw(10) |
---|
103 | << tH[0] << ", t_B = " << setw(10) << uH[0] << ",\n" |
---|
104 | << " <pT> = " << setw(10) << pTH[0] << ".\n"; |
---|
105 | |
---|
106 | // Couplings. |
---|
107 | if (isRes) os << " alphaEM = " << setw(10) << alphaEMSave[0] |
---|
108 | << ", alphaS = " << setw(10) << alphaSSave[0] << " at Q2 = " |
---|
109 | << setw(10) << Q2RenSave[0] << ".\n"; |
---|
110 | |
---|
111 | // Diffractive subsystems. |
---|
112 | for (int iDS = 1; iDS < 4; ++iDS) if (id1Save[iDS] != 0) { |
---|
113 | if (iDS == 1) os << "\n Diffractive system on side A: \n"; |
---|
114 | if (iDS == 2) os << "\n Diffractive system on side B: \n"; |
---|
115 | if (iDS == 3) os << "\n Central diffractive system: \n"; |
---|
116 | os << " In 1: id = " << setw(4) << id1pdfSave[iDS] << ", x = " |
---|
117 | << setw(10) << x1pdfSave[iDS] << ", pdf = " << setw(10) |
---|
118 | << pdf1Save[iDS] << " at Q2 = " << setw(10) << Q2FacSave[iDS] |
---|
119 | << ".\n" << " In 2: id = " << setw(4) << id2pdfSave[iDS] |
---|
120 | << ", x = " << setw(10) << x2pdfSave[iDS] << ", pdf = " |
---|
121 | << setw(10) << pdf2Save[iDS] << " at same Q2.\n"; |
---|
122 | os << " Subprocess " << nameSubSave[iDS] << " with code " |
---|
123 | << codeSubSave[iDS] << " is 2 -> " << nFinalSubSave[iDS] << ".\n"; |
---|
124 | if (nFinalSubSave[iDS] == 1) |
---|
125 | os << " It has sHat = " << setw(10) << sH[iDS] << ".\n"; |
---|
126 | else if (nFinalSubSave[iDS] == 2) |
---|
127 | os << " It has sHat = " << setw(10) << sH[iDS] << ", tHat = " |
---|
128 | << setw(10) << tH[iDS] << ", uHat = " << setw(10) << uH[iDS] |
---|
129 | << ",\n" << " pTHat = " << setw(10) << pTH[iDS] |
---|
130 | << ", m3Hat = " << setw(10) << m3H[iDS] << ", m4Hat = " |
---|
131 | << setw(10) << m4H[iDS] << ",\n" << " thetaHat = " << setw(10) |
---|
132 | << thetaH[iDS] << ", phiHat = " << setw(10) << phiH[iDS] << ".\n"; |
---|
133 | os << " alphaEM = " << setw(10) << alphaEMSave[iDS] |
---|
134 | << ", alphaS = " << setw(10) << alphaSSave[iDS] << " at Q2 = " |
---|
135 | << setw(10) << Q2RenSave[iDS] << ".\n"; |
---|
136 | } |
---|
137 | |
---|
138 | // Impact parameter. |
---|
139 | if (bIsSet) os << "\n Impact parameter b = " << setw(10) << bMPISave |
---|
140 | << " gives enhancement factor = " << setw(10) << enhanceMPISave |
---|
141 | << ".\n"; |
---|
142 | |
---|
143 | // Multiparton interactions and shower evolution. |
---|
144 | if (evolIsSet) os << " Max pT scale for MPI = " << setw(10) << pTmaxMPISave |
---|
145 | << ", ISR = " << setw(10) << pTmaxISRSave << ", FSR = " << setw(10) |
---|
146 | << pTmaxISRSave << ".\n Number of MPI = " << setw(5) << nMPISave |
---|
147 | << ", ISR = " << setw(5) << nISRSave << ", FSRproc = " << setw(5) |
---|
148 | << nFSRinProcSave << ", FSRreson = " << setw(5) << nFSRinResSave |
---|
149 | << ".\n"; |
---|
150 | |
---|
151 | // Listing finished. |
---|
152 | os << "\n -------- End PYTHIA Info Listing --------------------" |
---|
153 | << "----------------" << endl; |
---|
154 | |
---|
155 | } |
---|
156 | |
---|
157 | //-------------------------------------------------------------------------- |
---|
158 | |
---|
159 | // Event weight and accumulated weight. |
---|
160 | |
---|
161 | double Info::weight() const { return (abs(lhaStrategySave) == 4) |
---|
162 | ? CONVERTMB2PB * weightSave : weightSave; |
---|
163 | } |
---|
164 | |
---|
165 | double Info::weightSum() const {return (abs(lhaStrategySave) == 4) |
---|
166 | ? CONVERTMB2PB * wtAccSum : wtAccSum; |
---|
167 | } |
---|
168 | |
---|
169 | //-------------------------------------------------------------------------- |
---|
170 | |
---|
171 | // Print a message the first few times. Insert in database. |
---|
172 | |
---|
173 | void Info::errorMsg(string messageIn, string extraIn, bool showAlways, |
---|
174 | ostream& os) { |
---|
175 | |
---|
176 | // Recover number of times message occured. Also inserts new string. |
---|
177 | int times = messages[messageIn]; |
---|
178 | ++messages[messageIn]; |
---|
179 | |
---|
180 | // Print message the first few times. |
---|
181 | if (times < TIMESTOPRINT || showAlways) os << " PYTHIA " |
---|
182 | << messageIn << " " << extraIn << endl; |
---|
183 | |
---|
184 | } |
---|
185 | |
---|
186 | //-------------------------------------------------------------------------- |
---|
187 | |
---|
188 | // Provide total number of errors/aborts/warnings experienced to date. |
---|
189 | |
---|
190 | int Info::errorTotalNumber() { |
---|
191 | |
---|
192 | int nTot = 0; |
---|
193 | for ( map<string, int>::iterator messageEntry = messages.begin(); |
---|
194 | messageEntry != messages.end(); ++messageEntry) |
---|
195 | nTot += messageEntry->second; |
---|
196 | return nTot; |
---|
197 | |
---|
198 | } |
---|
199 | |
---|
200 | //-------------------------------------------------------------------------- |
---|
201 | |
---|
202 | // Print statistics on errors/aborts/warnings. |
---|
203 | |
---|
204 | void Info::errorStatistics(ostream& os) { |
---|
205 | |
---|
206 | // Header. |
---|
207 | os << "\n *------- PYTHIA Error and Warning Messages Statistics " |
---|
208 | << "----------------------------------------------------------* \n" |
---|
209 | << " | " |
---|
210 | << " | \n" |
---|
211 | << " | times message " |
---|
212 | << " | \n" |
---|
213 | << " | " |
---|
214 | << " | \n"; |
---|
215 | |
---|
216 | // Loop over all messages |
---|
217 | map<string, int>::iterator messageEntry = messages.begin(); |
---|
218 | if (messageEntry == messages.end()) |
---|
219 | os << " | 0 no errors or warnings to report " |
---|
220 | << " | \n"; |
---|
221 | while (messageEntry != messages.end()) { |
---|
222 | // Message printout. |
---|
223 | string temp = messageEntry->first; |
---|
224 | int len = temp.length(); |
---|
225 | temp.insert( len, max(0, 102 - len), ' '); |
---|
226 | os << " | " << setw(6) << messageEntry->second << " " |
---|
227 | << temp << " | \n"; |
---|
228 | ++messageEntry; |
---|
229 | } |
---|
230 | |
---|
231 | // Done. |
---|
232 | os << " | " |
---|
233 | << " | \n" |
---|
234 | << " *------- End PYTHIA Error and Warning Messages Statistics" |
---|
235 | << " ------------------------------------------------------* " |
---|
236 | << endl; |
---|
237 | |
---|
238 | } |
---|
239 | |
---|
240 | //========================================================================== |
---|
241 | |
---|
242 | } // end namespace Pythia8 |
---|