Line data Source code
1 : // Settings.cc is a part of the PYTHIA event generator.
2 : // Copyright (C) 2015 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 Settings class.
7 :
8 : #include "Pythia8/Settings.h"
9 :
10 : // Allow string and character manipulation.
11 : #include <cctype>
12 :
13 : namespace Pythia8 {
14 :
15 : //==========================================================================
16 :
17 : // Settings class.
18 : // This class contains flags, modes, parms and words used in generation.
19 :
20 : //--------------------------------------------------------------------------
21 :
22 : // Read in database from specific file.
23 :
24 : bool Settings::init(string startFile, bool append, ostream& os) {
25 :
26 : // Don't initialize if it has already been done and not in append mode.
27 0 : if (isInit && !append) return true;
28 : int nError = 0;
29 :
30 : // List of files to be checked. Start with input file.
31 0 : vector<string> files;
32 0 : files.push_back(startFile);
33 :
34 : // If nontrivial startfile path, then use that for other files as well.
35 0 : string pathName = "";
36 0 : if (startFile.rfind("/") != string::npos)
37 0 : pathName = startFile.substr(0, startFile.rfind("/") + 1);
38 :
39 : // Loop over files. Open them for read.
40 0 : for (int i = 0; i < int(files.size()); ++i) {
41 0 : const char* cstring = files[i].c_str();
42 0 : ifstream is(cstring);
43 :
44 : // Check that instream is OK.
45 0 : if (!is.good()) {
46 0 : os << "\n PYTHIA Error: settings file " << files[i]
47 0 : << " not found" << endl;
48 0 : return false;
49 : }
50 :
51 : // Read in one line at a time.
52 0 : string line;
53 0 : while ( getline(is, line) ) {
54 :
55 : // Get first word of a line, to interpret it as tag.
56 0 : istringstream getfirst(line);
57 0 : string tag;
58 0 : getfirst >> tag;
59 :
60 : // Skip ahead if not interesting. Only look for new files in startfile.
61 0 : if (tag != "<flag" && tag != "<flagfix" && tag != "<mode"
62 0 : && tag != "<modeopen" && tag != "<modepick" && tag != "<modefix"
63 0 : && tag != "<parm" && tag != "<parmfix" && tag != "<word"
64 0 : && tag != "<wordfix" && tag != "<fvec" && tag != "<fvecfix"
65 0 : && tag != "<mvec" && tag != "<mvecfix"
66 0 : && tag != "<pvec" && tag != "<pvecfix" && tag != "<aidx") continue;
67 :
68 : // Read and append continuation line(s) if line does not contain >.
69 0 : while (line.find(">") == string::npos) {
70 0 : string addLine;
71 0 : getline(is, addLine);
72 0 : line += " " + addLine;
73 0 : }
74 :
75 : // Remove extra blanks before an = sign.
76 0 : while (line.find(" =") != string::npos) line.erase( line.find(" ="), 1);
77 :
78 : // Add file also to be read.
79 0 : if (tag == "<aidx") {
80 0 : string name = attributeValue( line, "href");
81 0 : if (name == "") {
82 0 : os << " PYTHIA Error: failed to find name attribute in line "
83 0 : << line << endl;
84 0 : ++nError;
85 0 : continue;
86 : }
87 0 : files.push_back(pathName + name + ".xml");
88 0 : continue;
89 0 : }
90 :
91 : // Find name attribute.
92 0 : string name = attributeValue( line, "name=");
93 0 : if (name == "") {
94 0 : os << " PYTHIA Error: failed to find name attribute in line "
95 0 : << line << endl;
96 0 : ++nError;
97 0 : continue;
98 : }
99 :
100 : // Check that default value attribute present, and whether max and min.
101 0 : if (line.find("default=") == string::npos) {
102 0 : os << " PYTHIA Error: failed to find default value token in line "
103 0 : << line << endl;
104 0 : ++nError;
105 0 : continue;
106 : }
107 0 : bool hasMin = (line.find("min=") != string::npos);
108 0 : bool hasMax = (line.find("max=") != string::npos);
109 :
110 : // Check for occurence of a bool and add to flag map.
111 0 : if (tag == "<flag" || tag == "<flagfix") {
112 0 : bool value = boolAttributeValue( line, "default=");
113 0 : addFlag( name, value);
114 :
115 : // Check for occurence of an int and add to mode map.
116 0 : } else if (tag == "<mode" || tag == "<modeopen"
117 0 : || tag == "<modepick" || tag == "<modefix") {
118 0 : int value = intAttributeValue( line, "default=");
119 0 : int minVal = intAttributeValue( line, "min=");
120 0 : int maxVal = intAttributeValue( line, "max=");
121 : // Enforce check that only allowed options are accepted.
122 : bool optOnly = false;
123 0 : if (tag == "<modepick" && hasMin && hasMax) optOnly = true;
124 0 : if (tag == "<modefix") {
125 : hasMin = true;
126 : hasMax = true;
127 : minVal = value;
128 : maxVal = value;
129 : optOnly = true;
130 0 : }
131 0 : addMode( name, value, hasMin, hasMax, minVal, maxVal, optOnly);
132 :
133 : // Check for occurence of a double and add to parm map.
134 0 : } else if (tag == "<parm" || tag == "<parmfix") {
135 0 : double value = doubleAttributeValue( line, "default=");
136 0 : double minVal = doubleAttributeValue( line, "min=");
137 0 : double maxVal = doubleAttributeValue( line, "max=");
138 0 : addParm( name, value, hasMin, hasMax, minVal, maxVal);
139 :
140 : // Check for occurence of a string and add to word map.
141 0 : } else if (tag == "<word" || tag == "<wordfix") {
142 0 : string value = attributeValue( line, "default=");
143 0 : addWord( name, value);
144 :
145 : // Check for occurence of a bool vector and add to fvec map.
146 0 : } else if (tag == "<fvec" || tag == "<fvecfix") {
147 0 : vector<bool> value = boolVectorAttributeValue( line, "default=");
148 0 : addFVec( name, value);
149 :
150 : // Check for occurence of an int vector and add to mvec map.
151 0 : } else if (tag == "<mvec" || tag == "<mvecfix") {
152 0 : vector<int> value = intVectorAttributeValue( line, "default=");
153 0 : int minVal = intAttributeValue( line, "min=");
154 0 : int maxVal = intAttributeValue( line, "max=");
155 0 : addMVec( name, value, hasMin, hasMax, minVal, maxVal);
156 :
157 : // Check for occurence of a double vector and add to pvec map.
158 0 : } else if (tag == "<pvec" || tag == "<pvecfix") {
159 0 : vector<double> value = doubleVectorAttributeValue( line, "default=");
160 0 : double minVal = doubleAttributeValue( line, "min=");
161 0 : double maxVal = doubleAttributeValue( line, "max=");
162 0 : addPVec( name, value, hasMin, hasMax, minVal, maxVal);
163 0 : }
164 :
165 : // End of loop over lines in input file and loop over files.
166 0 : };
167 0 : };
168 :
169 : // Set up default e+e- and pp tunes, if positive.
170 0 : int eeTune = mode("Tune:ee");
171 0 : if (eeTune > 0) initTuneEE( eeTune);
172 0 : int ppTune = mode("Tune:pp");
173 0 : if (ppTune > 0) initTunePP( ppTune);
174 :
175 : // Done.
176 0 : if (nError > 0) return false;
177 0 : isInit = true;
178 0 : return true;
179 :
180 0 : }
181 :
182 : //--------------------------------------------------------------------------
183 :
184 : // Overwrite existing database by reading from specific file.
185 :
186 : bool Settings::reInit(string startFile, ostream& os) {
187 :
188 : // Reset maps to empty.
189 0 : flags.clear();
190 0 : modes.clear();
191 0 : parms.clear();
192 0 : words.clear();
193 0 : fvecs.clear();
194 0 : mvecs.clear();
195 0 : pvecs.clear();
196 :
197 : // Then let normal init do the rest.
198 0 : isInit = false;
199 0 : return init(startFile, false, os);
200 :
201 0 : }
202 :
203 : //--------------------------------------------------------------------------
204 :
205 : // Read in updates from a character string, like a line of a file.
206 : // Is used by readString (and readFile) in Pythia.
207 :
208 : bool Settings::readString(string line, bool warn, ostream& os) {
209 :
210 : // If empty line then done.
211 0 : if (line.find_first_not_of(" \n\t\v\b\r\f\a") == string::npos) return true;
212 :
213 : // If first character is not a letter, then taken to be a comment line.
214 0 : string lineNow = line;
215 0 : int firstChar = lineNow.find_first_not_of(" \n\t\v\b\r\f\a");
216 0 : if (!isalpha(lineNow[firstChar])) return true;
217 :
218 : // Replace an equal sign by a blank to make parsing simpler.
219 0 : while (lineNow.find("=") != string::npos) {
220 0 : int firstEqual = lineNow.find_first_of("=");
221 0 : lineNow.replace(firstEqual, 1, " ");
222 : }
223 :
224 : // Get first word of a line.
225 0 : istringstream splitLine(lineNow);
226 0 : string name;
227 0 : splitLine >> name;
228 :
229 : // Replace two colons by one (:: -> :) to allow for such mistakes.
230 0 : while (name.find("::") != string::npos) {
231 0 : int firstColonColon = name.find_first_of("::");
232 0 : name.replace(firstColonColon, 2, ":");
233 : }
234 :
235 : // Check whether this is in the database.
236 : int inDataBase = 0;
237 0 : if (isFlag(name)) inDataBase = 1;
238 0 : else if (isMode(name)) inDataBase = 2;
239 0 : else if (isParm(name)) inDataBase = 3;
240 0 : else if (isWord(name)) inDataBase = 4;
241 0 : else if (isFVec(name)) inDataBase = 5;
242 0 : else if (isMVec(name)) inDataBase = 6;
243 0 : else if (isPVec(name)) inDataBase = 7;
244 :
245 : // For backwards compatibility: old (parts of) names mapped onto new ones.
246 : // This code currently has no use, but is partly preserved for the day
247 : // it may be needed again.
248 : /*
249 : if (inDataBase == 0) {
250 : bool retry = false;
251 : string nameLower = toLower(name);
252 : if (!retry && nameLower.find("minbias") != string::npos) {
253 : int firstMB = nameLower.find_first_of("minbias");
254 : name.replace(firstMB, 7, "nonDiffractive");
255 : retry = true;
256 : }
257 : if (retry) {
258 : if (isFlag(name)) inDataBase = 1;
259 : else if (isMode(name)) inDataBase = 2;
260 : else if (isParm(name)) inDataBase = 3;
261 : else if (isWord(name)) inDataBase = 4;
262 : else if (isFVec(name)) inDataBase = 5;
263 : else if (isMVec(name)) inDataBase = 6;
264 : else if (isPVec(name)) inDataBase = 7;
265 : }
266 : }
267 : */
268 :
269 : // Warn and done if not in database.
270 0 : if (inDataBase == 0) {
271 0 : if (warn) os << "\n PYTHIA Error: input string not found in settings"
272 0 : << " databases::\n " << line << endl;
273 0 : readingFailedSave = true;
274 0 : return false;
275 : }
276 :
277 : // Find value. Warn if none found.
278 0 : string valueString;
279 0 : splitLine >> valueString;
280 0 : if (!splitLine) {
281 0 : if (warn) os << "\n PYTHIA Error: variable recognized, but its value"
282 0 : << " not meaningful:\n " << line << endl;
283 0 : readingFailedSave = true;
284 0 : return false;
285 : }
286 :
287 : // If value is a ? then echo the current value.
288 0 : if (valueString == "?") {
289 0 : os << output(name);
290 0 : return true;
291 : }
292 :
293 : // Update flag map; allow many ways to say yes.
294 0 : if (inDataBase == 1) {
295 0 : bool value = boolString(valueString);
296 0 : flag(name, value);
297 :
298 : // Update mode map.
299 0 : } else if (inDataBase == 2) {
300 0 : istringstream modeData(valueString);
301 0 : int value;
302 0 : modeData >> value;
303 0 : if (!modeData) {
304 0 : if (warn) os << "\n PYTHIA Error: variable recognized, but its value"
305 0 : << " not meaningful:\n " << line << endl;
306 0 : readingFailedSave = true;
307 0 : return false;
308 : }
309 0 : if (!mode(name, value)) {
310 0 : if (warn) os << "\n PYTHIA Error: variable recognized, but its value"
311 0 : << " non-existing option:\n " << line << endl;
312 0 : readingFailedSave = true;
313 0 : return false;
314 : }
315 :
316 : // Update parm map.
317 0 : } else if (inDataBase == 3) {
318 0 : istringstream parmData(valueString);
319 0 : double value;
320 0 : parmData >> value;
321 0 : if (!parmData) {
322 0 : if (warn) os << "\n PYTHIA Error: variable recognized, but its value"
323 0 : << " not meaningful:\n " << line << endl;
324 0 : readingFailedSave = true;
325 0 : return false;
326 : }
327 0 : parm(name, value);
328 :
329 : // Update word map.
330 0 : } else if (inDataBase == 4) {
331 0 : word(name, valueString);
332 :
333 : // Update fvec map.
334 0 : } else if (inDataBase == 5) {
335 0 : istringstream fvecData(valueString);
336 0 : vector<bool> value(boolVectorAttributeValue(
337 0 : "value=\"" + valueString + "\"", "value="));
338 0 : if (!fvecData) {
339 0 : if (warn) os << "\n PYTHIA Error: variable recognized, but its value"
340 0 : << " not meaningful:\n " << line << endl;
341 0 : readingFailedSave = true;
342 0 : return false;
343 : }
344 0 : fvec(name, value);
345 :
346 : // Update mvec map.
347 0 : } else if (inDataBase == 6) {
348 0 : istringstream mvecData(valueString);
349 0 : vector<int> value(intVectorAttributeValue(
350 0 : "value=\"" + valueString + "\"", "value="));
351 0 : if (!mvecData) {
352 0 : if (warn) os << "\n PYTHIA Error: variable recognized, but its value"
353 0 : << " not meaningful:\n " << line << endl;
354 0 : readingFailedSave = true;
355 0 : return false;
356 : }
357 0 : mvec(name, value);
358 :
359 : // Update pvec map.
360 0 : } else if (inDataBase == 7) {
361 0 : istringstream pvecData(valueString);
362 0 : vector<double> value(doubleVectorAttributeValue(
363 0 : "value=\"" + valueString + "\"", "value="));
364 0 : if (!pvecData) {
365 0 : if (warn) os << "\n PYTHIA Error: variable recognized, but its value"
366 0 : << " not meaningful:\n " << line << endl;
367 0 : readingFailedSave = true;
368 0 : return false;
369 : }
370 0 : pvec(name, value);
371 0 : }
372 :
373 : // Done.
374 0 : return true;
375 0 : }
376 :
377 : //--------------------------------------------------------------------------
378 :
379 : // Write updates or everything to user-defined file.
380 :
381 : bool Settings::writeFile(string toFile, bool writeAll) {
382 :
383 : // Open file for writing.
384 0 : const char* cstring = toFile.c_str();
385 0 : ofstream os(cstring);
386 0 : if (!os) {
387 0 : infoPtr->errorMsg("Error in Settings::writeFile:"
388 0 : " could not open file", toFile);
389 0 : return false;
390 : }
391 :
392 : // Hand over real work to next method.
393 0 : return writeFile( os, writeAll);
394 :
395 0 : }
396 :
397 : //--------------------------------------------------------------------------
398 :
399 : // Write updates or everything to user-defined stream (or file).
400 :
401 : bool Settings::writeFile(ostream& os, bool writeAll) {
402 :
403 : // Write simple header as comment.
404 0 : if (writeAll) os << "! List of all current PYTHIA ";
405 0 : else os << "! List of all modified PYTHIA ";
406 0 : os << fixed << setprecision(3) << parm("Pythia:versionNumber")
407 0 : << " settings.\n";
408 :
409 : // Iterators for the flag, mode and parm tables.
410 0 : map<string, Flag>::iterator flagEntry = flags.begin();
411 0 : map<string, Mode>::iterator modeEntry = modes.begin();
412 0 : map<string, Parm>::iterator parmEntry = parms.begin();
413 0 : map<string, Word>::iterator wordEntry = words.begin();
414 0 : map<string, FVec>::iterator fvecEntry = fvecs.begin();
415 0 : map<string, MVec>::iterator mvecEntry = mvecs.begin();
416 0 : map<string, PVec>::iterator pvecEntry = pvecs.begin();
417 :
418 : // Loop while there is something left to do.
419 0 : while (flagEntry != flags.end() || modeEntry != modes.end()
420 0 : || parmEntry != parms.end() || wordEntry != words.end()
421 0 : || fvecEntry != fvecs.end() || mvecEntry != mvecs.end()
422 0 : || pvecEntry != pvecs.end() ) {
423 :
424 : // Check if a flag is next in lexigraphical order; if so print it.
425 0 : if ( flagEntry != flags.end()
426 0 : && ( modeEntry == modes.end() || flagEntry->first < modeEntry->first )
427 0 : && ( parmEntry == parms.end() || flagEntry->first < parmEntry->first )
428 0 : && ( wordEntry == words.end() || flagEntry->first < wordEntry->first )
429 0 : && ( fvecEntry == fvecs.end() || flagEntry->first < fvecEntry->first )
430 0 : && ( mvecEntry == mvecs.end() || flagEntry->first < mvecEntry->first )
431 0 : && ( pvecEntry == pvecs.end() || flagEntry->first < pvecEntry->first )
432 : ) {
433 0 : string state[2] = {"off", "on"};
434 0 : bool valNow = flagEntry->second.valNow;
435 0 : bool valDefault = flagEntry->second.valDefault;
436 0 : if ( writeAll || valNow != valDefault )
437 0 : os << flagEntry->second.name << " = " << state[valNow] << "\n";
438 0 : ++flagEntry;
439 :
440 : // Else check if mode is next, and if so print it.
441 0 : } else if ( modeEntry != modes.end()
442 0 : && ( parmEntry == parms.end() || modeEntry->first < parmEntry->first )
443 0 : && ( wordEntry == words.end() || modeEntry->first < wordEntry->first )
444 0 : && ( fvecEntry == fvecs.end() || modeEntry->first < fvecEntry->first )
445 0 : && ( mvecEntry == mvecs.end() || modeEntry->first < mvecEntry->first )
446 0 : && ( pvecEntry == pvecs.end() || modeEntry->first < pvecEntry->first )
447 : ) {
448 0 : int valNow = modeEntry->second.valNow;
449 0 : int valDefault = modeEntry->second.valDefault;
450 0 : if ( writeAll || valNow != valDefault )
451 0 : os << modeEntry->second.name << " = " << valNow << "\n";
452 0 : ++modeEntry;
453 :
454 : // Else check if parm is next, and if so print it;
455 : // fixed or scientific depending on value.
456 0 : } else if ( parmEntry != parms.end()
457 0 : && ( wordEntry == words.end() || parmEntry->first < wordEntry->first )
458 0 : && ( fvecEntry == fvecs.end() || parmEntry->first < fvecEntry->first )
459 0 : && ( mvecEntry == mvecs.end() || parmEntry->first < mvecEntry->first )
460 0 : && ( pvecEntry == pvecs.end() || parmEntry->first < pvecEntry->first )
461 : ) {
462 0 : double valNow = parmEntry->second.valNow;
463 0 : double valDefault = parmEntry->second.valDefault;
464 0 : if ( writeAll || valNow != valDefault ) {
465 0 : os << parmEntry->second.name << " = ";
466 0 : if ( valNow == 0. ) os << fixed << setprecision(1);
467 0 : else if ( abs(valNow) < 0.001 ) os << scientific << setprecision(4);
468 0 : else if ( abs(valNow) < 0.1 ) os << fixed << setprecision(7);
469 0 : else if ( abs(valNow) < 1000. ) os << fixed << setprecision(5);
470 0 : else if ( abs(valNow) < 1000000. ) os << fixed << setprecision(3);
471 0 : else os << scientific << setprecision(4);
472 0 : os << valNow << "\n";
473 0 : }
474 0 : ++parmEntry;
475 :
476 : // Else check if word is next, and if so print it.
477 0 : } else if ( wordEntry != words.end()
478 0 : && ( fvecEntry == fvecs.end() || wordEntry->first < fvecEntry->first )
479 0 : && ( mvecEntry == mvecs.end() || wordEntry->first < mvecEntry->first )
480 0 : && ( pvecEntry == pvecs.end() || wordEntry->first < pvecEntry->first )
481 : ) {
482 0 : string valNow = wordEntry->second.valNow;
483 0 : string valDefault = wordEntry->second.valDefault;
484 0 : if ( writeAll || valNow != valDefault )
485 0 : os << wordEntry->second.name << " = " << valNow << "\n";
486 0 : ++wordEntry;
487 :
488 : // Else check if fvec is next, and if so print it.
489 0 : } else if ( fvecEntry != fvecs.end()
490 0 : && ( mvecEntry == mvecs.end() || fvecEntry->first < mvecEntry->first )
491 0 : && ( pvecEntry == pvecs.end() || fvecEntry->first < pvecEntry->first )
492 : ) {
493 0 : string state[2] = {"off", "on"};
494 0 : vector<bool> valNow = fvecEntry->second.valNow;
495 0 : vector<bool> valDefault = fvecEntry->second.valDefault;
496 0 : if ( writeAll || valNow != valDefault ) {
497 0 : os << fvecEntry->second.name << " = ";
498 0 : for (vector<bool>::iterator val = valNow.begin();
499 0 : val != --valNow.end(); ++val) os << state[*val] << ",";
500 0 : os << *(--valNow.end()) << "\n";
501 : }
502 0 : ++fvecEntry;
503 :
504 : // Else check if mvec is next, and if so print it.
505 0 : } else if ( mvecEntry != mvecs.end()
506 0 : && ( pvecEntry == pvecs.end() || mvecEntry->first < pvecEntry->first )
507 : ) {
508 0 : vector<int> valNow = mvecEntry->second.valNow;
509 0 : vector<int> valDefault = mvecEntry->second.valDefault;
510 0 : if ( writeAll || valNow != valDefault ) {
511 0 : os << mvecEntry->second.name << " = ";
512 0 : for (vector<int>::iterator val = valNow.begin();
513 0 : val != --valNow.end(); ++val) os << *val << ",";
514 0 : os << *(--valNow.end()) << "\n";
515 : }
516 0 : ++mvecEntry;
517 :
518 : // Else print pvec; fixed or scientific depending on value.
519 0 : } else {
520 0 : vector<double> valNow = pvecEntry->second.valNow;
521 0 : vector<double> valDefault = pvecEntry->second.valDefault;
522 0 : if ( writeAll || valNow != valDefault ) {
523 0 : os << pvecEntry->second.name << " = ";
524 0 : for (vector<double>::iterator val = valNow.begin();
525 0 : val != --valNow.end(); ++val) {
526 0 : if ( *val == 0. ) os << fixed << setprecision(1);
527 0 : else if ( abs(*val) < 0.001 ) os << scientific << setprecision(4);
528 0 : else if ( abs(*val) < 0.1 ) os << fixed << setprecision(7);
529 0 : else if ( abs(*val) < 1000. ) os << fixed << setprecision(5);
530 0 : else if ( abs(*val) < 1000000. ) os << fixed << setprecision(3);
531 0 : else os << scientific << setprecision(4);
532 0 : os << *val << ",";
533 0 : } os << *(--valNow.end()) << "\n";
534 : }
535 0 : ++pvecEntry;
536 0 : }
537 : } ;
538 :
539 : // Done.
540 0 : return true;
541 0 : }
542 :
543 : //--------------------------------------------------------------------------
544 :
545 : // Print out table of database in lexigraphical order.
546 :
547 : void Settings::list(bool doListAll, bool doListString, string match,
548 : ostream& os) {
549 :
550 : // Table header; output for bool as off/on.
551 0 : if (doListAll)
552 0 : os << "\n *------- PYTHIA Flag + Mode + Parm + Word + FVec + MVec + PVec "
553 0 : << "Settings (all) ----------------------------------* \n";
554 0 : else if (!doListString)
555 0 : os << "\n *------- PYTHIA Flag + Mode + Parm + Word + FVec + MVec + PVec "
556 0 : << "Settings (changes only) -------------------------* \n" ;
557 : else
558 0 : os << "\n *------- PYTHIA Flag + Mode + Parm + Word + FVec + MVec + PVec "
559 0 : << "Settings (with requested string) -----------------* \n" ;
560 0 : os << " | "
561 0 : << " | \n"
562 0 : << " | Name | "
563 0 : << " Now | Default Min Max | \n"
564 0 : << " | | "
565 0 : << " | | \n";
566 :
567 : // Convert input string to lowercase for match.
568 0 : match = toLower(match);
569 0 : if (match == "") match = " ";
570 :
571 : // Iterators for the flag, mode and parm tables.
572 0 : map<string, Flag>::iterator flagEntry = flags.begin();
573 0 : map<string, Mode>::iterator modeEntry = modes.begin();
574 0 : map<string, Parm>::iterator parmEntry = parms.begin();
575 0 : map<string, Word>::iterator wordEntry = words.begin();
576 0 : map<string, FVec>::iterator fvecEntry = fvecs.begin();
577 0 : map<string, MVec>::iterator mvecEntry = mvecs.begin();
578 0 : map<string, PVec>::iterator pvecEntry = pvecs.begin();
579 :
580 : // Loop while there is something left to do.
581 0 : while (flagEntry != flags.end() || modeEntry != modes.end()
582 0 : || parmEntry != parms.end() || wordEntry != words.end()
583 0 : || fvecEntry != fvecs.end() || mvecEntry != mvecs.end()
584 0 : || pvecEntry != pvecs.end() ) {
585 :
586 : // Check if a flag is next in lexigraphical order; if so print it.
587 0 : if ( flagEntry != flags.end()
588 0 : && ( modeEntry == modes.end() || flagEntry->first < modeEntry->first )
589 0 : && ( parmEntry == parms.end() || flagEntry->first < parmEntry->first )
590 0 : && ( wordEntry == words.end() || flagEntry->first < wordEntry->first )
591 0 : && ( fvecEntry == fvecs.end() || flagEntry->first < fvecEntry->first )
592 0 : && ( mvecEntry == mvecs.end() || flagEntry->first < mvecEntry->first )
593 0 : && ( pvecEntry == pvecs.end() || flagEntry->first < pvecEntry->first )
594 : ) {
595 0 : string state[2] = {"off", "on"};
596 0 : bool valNow = flagEntry->second.valNow;
597 0 : bool valDefault = flagEntry->second.valDefault;
598 0 : if ( doListAll || (!doListString && valNow != valDefault)
599 0 : || (doListString && flagEntry->first.find(match) != string::npos) )
600 0 : os << " | " << setw(45) << left
601 0 : << flagEntry->second.name << " | " << setw(24) << right
602 0 : << state[valNow] << " | " << setw(12) << state[valDefault]
603 0 : << " | \n";
604 0 : ++flagEntry;
605 :
606 : // Else check if mode is next, and if so print it.
607 0 : } else if ( modeEntry != modes.end()
608 0 : && ( parmEntry == parms.end() || modeEntry->first < parmEntry->first )
609 0 : && ( wordEntry == words.end() || modeEntry->first < wordEntry->first )
610 0 : && ( fvecEntry == fvecs.end() || modeEntry->first < fvecEntry->first )
611 0 : && ( mvecEntry == mvecs.end() || modeEntry->first < mvecEntry->first )
612 0 : && ( pvecEntry == pvecs.end() || modeEntry->first < pvecEntry->first )
613 : ) {
614 0 : int valNow = modeEntry->second.valNow;
615 0 : int valDefault = modeEntry->second.valDefault;
616 0 : if ( doListAll || (!doListString && valNow != valDefault)
617 0 : || (doListString && modeEntry->first.find(match) != string::npos) ) {
618 0 : os << " | " << setw(45) << left
619 0 : << modeEntry->second.name << " | " << setw(24) << right
620 0 : << valNow << " | " << setw(12) << valDefault;
621 0 : if (modeEntry->second.hasMin)
622 0 : os << setw(12) << modeEntry->second.valMin;
623 0 : else os << " ";
624 0 : if (modeEntry->second.hasMax)
625 0 : os << setw(12) << modeEntry->second.valMax;
626 0 : else os << " ";
627 0 : os << " | \n";
628 0 : }
629 0 : ++modeEntry;
630 :
631 : // Else check if parm is next, and if so print it;
632 : // fixed or scientific depending on value.
633 0 : } else if ( parmEntry != parms.end()
634 0 : && ( wordEntry == words.end() || parmEntry->first < wordEntry->first )
635 0 : && ( fvecEntry == fvecs.end() || parmEntry->first < fvecEntry->first )
636 0 : && ( mvecEntry == mvecs.end() || parmEntry->first < mvecEntry->first )
637 0 : && ( pvecEntry == pvecs.end() || parmEntry->first < pvecEntry->first )
638 : ) {
639 0 : double valNow = parmEntry->second.valNow;
640 0 : double valDefault = parmEntry->second.valDefault;
641 0 : if ( doListAll || (!doListString && valNow != valDefault )
642 0 : || (doListString && parmEntry->first.find(match) != string::npos) ) {
643 0 : os << " | " << setw(45) << left
644 0 : << parmEntry->second.name << right << " | ";
645 0 : for (int i = 0; i < 4; ++i) {
646 0 : if (i == 1) valNow = valDefault;
647 0 : if (i == 2) valNow = parmEntry->second.valMin;
648 0 : if (i == 3) valNow = parmEntry->second.valMax;
649 0 : if ( (i == 2 && !parmEntry->second.hasMin)
650 0 : || (i == 3 && !parmEntry->second.hasMax) )
651 0 : os << " ";
652 0 : else if ( valNow == 0. )
653 0 : os << fixed << setprecision(1) << setw(12) << valNow;
654 0 : else if ( abs(valNow) < 0.001 )
655 0 : os << scientific << setprecision(4) << setw(12) << valNow;
656 0 : else if ( abs(valNow) < 0.1 )
657 0 : os << fixed << setprecision(7) << setw(12) << valNow;
658 0 : else if ( abs(valNow) < 1000. )
659 0 : os << fixed << setprecision(5) << setw(12) << valNow;
660 0 : else if ( abs(valNow) < 1000000. )
661 0 : os << fixed << setprecision(3) << setw(12) << valNow;
662 : else
663 0 : os << scientific << setprecision(4) << setw(12) << valNow;
664 0 : if (i == 0) os << " | ";
665 : }
666 0 : os << " | \n";
667 0 : }
668 0 : ++parmEntry;
669 :
670 : // Else check if word is next, and if so print it.
671 0 : } else if ( wordEntry != words.end()
672 0 : && ( fvecEntry == fvecs.end() || wordEntry->first < fvecEntry->first )
673 0 : && ( mvecEntry == mvecs.end() || wordEntry->first < mvecEntry->first )
674 0 : && ( pvecEntry == pvecs.end() || wordEntry->first < pvecEntry->first )
675 : ) {
676 0 : string valNow = wordEntry->second.valNow;
677 0 : string valDefault = wordEntry->second.valDefault;
678 0 : int blankLeft = max(0, 60 - max(24, int(valNow.length()) )
679 0 : - max(12, int(valDefault.length()) ) );
680 0 : string blankPad( blankLeft, ' ');
681 0 : if ( doListAll || (!doListString && valNow != valDefault)
682 0 : || (doListString && wordEntry->first.find(match) != string::npos) )
683 0 : os << " | " << setw(45) << left
684 0 : << wordEntry->second.name << " | " << setw(24) << right
685 0 : << valNow << " | " << setw(12) << valDefault << blankPad
686 0 : << " | \n";
687 0 : ++wordEntry;
688 :
689 : // Else check if fvec is next, and if so print it.
690 0 : } else if ( fvecEntry != fvecs.end()
691 0 : && ( mvecEntry == mvecs.end() || fvecEntry->first < mvecEntry->first )
692 0 : && ( pvecEntry == pvecs.end() || fvecEntry->first < pvecEntry->first )
693 : ) {
694 0 : string state[2] = {"off", "on"};
695 0 : vector<bool> valsNow = fvecEntry->second.valNow;
696 0 : vector<bool> valsDefault = fvecEntry->second.valDefault;
697 : bool valNow(false), valDefault(false);
698 0 : if ( doListAll || (!doListString && valsNow != valsDefault )
699 0 : || (doListString && fvecEntry->first.find(match) != string::npos) ) {
700 0 : for (unsigned int i = 0; i < valsNow.size() || i < valsDefault.size();
701 0 : ++i) {
702 0 : if ( i == 0 )
703 0 : os << " | " << setw(45) << left
704 0 : << fvecEntry->second.name << right << " | ";
705 : else
706 0 : os << " | " << setw(45) << " " << right << " | ";
707 0 : for (int j = 0; j < 4; ++j) {
708 0 : if (i < valsNow.size()) valNow = valsNow[i];
709 0 : if (i < valsDefault.size()) valDefault = valsDefault[i];
710 0 : if (j == 1) valNow = valDefault;
711 0 : if ( (j == 0 && i >= valsNow.size())
712 0 : || (j == 1 && i >= valsDefault.size()) || (j > 1) )
713 0 : os << " ";
714 0 : else os << setw(12) << state[valNow];
715 0 : if (j == 0) os << " | ";
716 : }
717 0 : os << " | \n";
718 : }
719 0 : }
720 0 : ++fvecEntry;
721 :
722 : // Else check if mvec is next, and if so print it.
723 0 : } else if ( mvecEntry != mvecs.end()
724 0 : && ( pvecEntry == pvecs.end() || mvecEntry->first < pvecEntry->first )
725 : ) {
726 0 : vector<int> valsNow = mvecEntry->second.valNow;
727 0 : vector<int> valsDefault = mvecEntry->second.valDefault;
728 : int valNow(0), valDefault(0);
729 0 : if ( doListAll || (!doListString && valsNow != valsDefault )
730 0 : || (doListString && mvecEntry->first.find(match) != string::npos) ) {
731 0 : for (unsigned int i = 0; i < valsNow.size() || i < valsDefault.size();
732 0 : ++i) {
733 0 : if ( i == 0 )
734 0 : os << " | " << setw(45) << left
735 0 : << mvecEntry->second.name << right << " | ";
736 : else
737 0 : os << " | " << setw(45) << " " << right << " | ";
738 0 : for (int j = 0; j < 4; ++j) {
739 0 : if (i < valsNow.size()) valNow = valsNow[i];
740 0 : if (i < valsDefault.size()) valDefault = valsDefault[i];
741 0 : if (j == 1) valNow = valDefault;
742 0 : if (j == 2) valNow = mvecEntry->second.valMin;
743 0 : if (j == 3) valNow = mvecEntry->second.valMax;
744 0 : if ( (j == 0 && i >= valsNow.size())
745 0 : || (j == 1 && i >= valsDefault.size())
746 0 : || (j == 2 && !mvecEntry->second.hasMin)
747 0 : || (j == 3 && !mvecEntry->second.hasMax) )
748 0 : os << " ";
749 0 : else os << setw(12) << valNow;
750 0 : if (j == 0) os << " | ";
751 : }
752 0 : os << " | \n";
753 : }
754 0 : }
755 0 : ++mvecEntry;
756 :
757 : // Else print pvec; fixed or scientific depending on value.
758 0 : } else {
759 0 : vector<double> valsNow = pvecEntry->second.valNow;
760 0 : vector<double> valsDefault = pvecEntry->second.valDefault;
761 : double valNow(0), valDefault(0);
762 0 : if ( doListAll || (!doListString && valsNow != valsDefault )
763 0 : || (doListString && pvecEntry->first.find(match) != string::npos) ) {
764 0 : for (unsigned int i = 0; i < valsNow.size() || i < valsDefault.size();
765 0 : ++i) {
766 0 : if ( i == 0 )
767 0 : os << " | " << setw(45) << left
768 0 : << pvecEntry->second.name << right << " | ";
769 : else
770 0 : os << " | " << setw(45) << " " << right << " | ";
771 0 : for (int j = 0; j < 4; ++j) {
772 0 : if (i < valsNow.size()) valNow = valsNow[i];
773 0 : if (i < valsDefault.size()) valDefault = valsDefault[i];
774 0 : if (j == 1) valNow = valDefault;
775 0 : if (j == 2) valNow = pvecEntry->second.valMin;
776 0 : if (j == 3) valNow = pvecEntry->second.valMax;
777 0 : if ( (j == 0 && i >= valsNow.size())
778 0 : || (j == 1 && i >= valsDefault.size())
779 0 : || (j == 2 && !pvecEntry->second.hasMin)
780 0 : || (j == 3 && !pvecEntry->second.hasMax) )
781 0 : os << " ";
782 0 : else if ( valNow == 0. )
783 0 : os << fixed << setprecision(1) << setw(12) << valNow;
784 0 : else if ( abs(valNow) < 0.001 )
785 0 : os << scientific << setprecision(4) << setw(12) << valNow;
786 0 : else if ( abs(valNow) < 0.1 )
787 0 : os << fixed << setprecision(7) << setw(12) << valNow;
788 0 : else if ( abs(valNow) < 1000. )
789 0 : os << fixed << setprecision(5) << setw(12) << valNow;
790 0 : else if ( abs(valNow) < 1000000. )
791 0 : os << fixed << setprecision(3) << setw(12) << valNow;
792 : else
793 0 : os << scientific << setprecision(4) << setw(12) << valNow;
794 0 : if (j == 0) os << " | ";
795 : }
796 0 : os << " | \n";
797 : }
798 0 : }
799 0 : ++pvecEntry;
800 :
801 0 : }
802 : } ;
803 :
804 : // End of loop over database contents.
805 0 : os << " | "
806 0 : << " | \n"
807 0 : << " *------- End PYTHIA Flag + Mode + Parm + Word + FVec + MVec + PVec "
808 0 : << "Settings ------------------------------------* " << endl;
809 :
810 0 : }
811 :
812 : //--------------------------------------------------------------------------
813 :
814 : // Give back current value(s) as a string, whatever the type.
815 :
816 : string Settings::output(string keyIn, bool fullLine) {
817 :
818 : // Default string echoes input key =.
819 0 : string outVal = (fullLine) ? " " + keyIn + " = " : "";
820 :
821 : // Identify flag, mode, parm or word, and convert to string.
822 0 : if (isFlag(keyIn)) {
823 0 : outVal += (flag(keyIn)) ? "true" : "false";
824 0 : } else if (isMode(keyIn)) {
825 0 : ostringstream ostr;
826 0 : ostr << mode(keyIn);
827 0 : outVal += ostr.str();
828 0 : } else if (isParm(keyIn)) {
829 0 : ostringstream ostr;
830 0 : ostr << scientific << setprecision(5) << parm(keyIn);
831 0 : outVal += ostr.str();
832 0 : } else if (isWord(keyIn)) {
833 0 : outVal += word(keyIn);
834 :
835 : // Identify fvec, mvec or pvec, and convert to string.
836 0 : } else if (isFVec(keyIn)) {
837 0 : vector<bool> outVec = fvec(keyIn);
838 0 : for (int i = 0; i < int(outVec.size()); ++i) {
839 0 : outVal += (outVec[i]) ? "true" : "false";
840 0 : if (i != int(outVec.size()) - 1) outVal += " ";
841 : }
842 0 : } else if (isMVec(keyIn)) {
843 0 : vector<int> outVec = mvec(keyIn);
844 0 : for (int i = 0; i < int(outVec.size()); ++i) {
845 0 : ostringstream ostr;
846 0 : ostr << outVec[i];
847 0 : outVal += ostr.str();
848 0 : if (i != int(outVec.size()) - 1) outVal += " ";
849 0 : }
850 0 : } else if (isPVec(keyIn)) {
851 0 : vector<double> outVec = pvec(keyIn);
852 0 : for (int i = 0; i < int(outVec.size()); ++i) {
853 0 : ostringstream ostr;
854 0 : ostr << scientific << setprecision(5) << outVec[i];
855 0 : outVal += ostr.str();
856 0 : if (i != int(outVec.size()) - 1) outVal += " ";
857 0 : }
858 :
859 : // Default value, possible endline and done.
860 0 : } else outVal += "unknown";
861 0 : if (fullLine) outVal += "\n";
862 : return outVal;
863 :
864 0 : }
865 :
866 : //--------------------------------------------------------------------------
867 :
868 : // Reset all values to their defaults.
869 :
870 : void Settings::resetAll() {
871 :
872 : // Loop through the flags table, resetting all entries.
873 0 : for (map<string, Flag>::iterator flagEntry = flags.begin();
874 0 : flagEntry != flags.end(); ++flagEntry) {
875 0 : string name = flagEntry->first;
876 0 : resetFlag(name);
877 0 : }
878 :
879 : // Loop through the modes table, resetting all entries.
880 0 : for (map<string, Mode>::iterator modeEntry = modes.begin();
881 0 : modeEntry != modes.end(); ++modeEntry) {
882 0 : string name = modeEntry->first;
883 0 : resetMode(name);
884 0 : }
885 :
886 : // Loop through the parms table, resetting all entries.
887 0 : for (map<string, Parm>::iterator parmEntry = parms.begin();
888 0 : parmEntry != parms.end(); ++parmEntry) {
889 0 : string name = parmEntry->first;
890 0 : resetParm(name);
891 0 : }
892 :
893 : // Loop through the words table, resetting all entries.
894 0 : for (map<string, Word>::iterator wordEntry = words.begin();
895 0 : wordEntry != words.end(); ++wordEntry) {
896 0 : string name = wordEntry->first;
897 0 : resetWord(name);
898 0 : }
899 :
900 : // Loop through the fvecs table, resetting all entries.
901 0 : for (map<string, FVec>::iterator fvecEntry = fvecs.begin();
902 0 : fvecEntry != fvecs.end(); ++fvecEntry) {
903 0 : string name = fvecEntry->first;
904 0 : resetFVec(name);
905 0 : }
906 :
907 : // Loop through the mvecs table, resetting all entries.
908 0 : for (map<string, MVec>::iterator mvecEntry = mvecs.begin();
909 0 : mvecEntry != mvecs.end(); ++mvecEntry) {
910 0 : string name = mvecEntry->first;
911 0 : resetMVec(name);
912 0 : }
913 :
914 : // Loop through the pvecs table, resetting all entries.
915 0 : for (map<string, PVec>::iterator pvecEntry = pvecs.begin();
916 0 : pvecEntry != pvecs.end(); ++pvecEntry) {
917 0 : string name = pvecEntry->first;
918 0 : resetPVec(name);
919 0 : }
920 :
921 0 : }
922 :
923 : //--------------------------------------------------------------------------
924 :
925 : // Give back current value, with check that key exists.
926 :
927 : bool Settings::flag(string keyIn) {
928 0 : if (isFlag(keyIn)) return flags[toLower(keyIn)].valNow;
929 0 : infoPtr->errorMsg("Error in Settings::flag: unknown key", keyIn);
930 0 : return false;
931 0 : }
932 :
933 : int Settings::mode(string keyIn) {
934 0 : if (isMode(keyIn)) return modes[toLower(keyIn)].valNow;
935 0 : infoPtr->errorMsg("Error in Settings::mode: unknown key", keyIn);
936 0 : return 0;
937 0 : }
938 :
939 : double Settings::parm(string keyIn) {
940 0 : if (isParm(keyIn)) return parms[toLower(keyIn)].valNow;
941 0 : infoPtr->errorMsg("Error in Settings::parm: unknown key", keyIn);
942 0 : return 0.;
943 0 : }
944 :
945 : string Settings::word(string keyIn) {
946 0 : if (isWord(keyIn)) return words[toLower(keyIn)].valNow;
947 0 : infoPtr->errorMsg("Error in Settings::word: unknown key", keyIn);
948 0 : return " ";
949 0 : }
950 :
951 : vector<bool> Settings::fvec(string keyIn) {
952 0 : if (isFVec(keyIn)) return fvecs[toLower(keyIn)].valNow;
953 0 : infoPtr->errorMsg("Error in Settings::fvec: unknown key", keyIn);
954 0 : return vector<bool>(1, false);
955 0 : }
956 :
957 : vector<int> Settings::mvec(string keyIn) {
958 0 : if (isMVec(keyIn)) return mvecs[toLower(keyIn)].valNow;
959 0 : infoPtr->errorMsg("Error in Settings::mvec: unknown key", keyIn);
960 0 : return vector<int>(1, 0);
961 0 : }
962 :
963 : vector<double> Settings::pvec(string keyIn) {
964 0 : if (isPVec(keyIn)) return pvecs[toLower(keyIn)].valNow;
965 0 : infoPtr->errorMsg("Error in Settings::pvec: unknown key", keyIn);
966 0 : return vector<double>(1, 0.);
967 0 : }
968 :
969 : //--------------------------------------------------------------------------
970 :
971 : // Give back default value, with check that key exists.
972 :
973 : bool Settings::flagDefault(string keyIn) {
974 0 : if (isFlag(keyIn)) return flags[toLower(keyIn)].valDefault;
975 0 : infoPtr->errorMsg("Error in Settings::flagDefault: unknown key", keyIn);
976 0 : return false;
977 0 : }
978 :
979 : int Settings::modeDefault(string keyIn) {
980 0 : if (isMode(keyIn)) return modes[toLower(keyIn)].valDefault;
981 0 : infoPtr->errorMsg("Error in Settings::modeDefault: unknown key", keyIn);
982 0 : return 0;
983 0 : }
984 :
985 : double Settings::parmDefault(string keyIn) {
986 0 : if (isParm(keyIn)) return parms[toLower(keyIn)].valDefault;
987 0 : infoPtr->errorMsg("Error in Settings::parmDefault: unknown key", keyIn);
988 0 : return 0.;
989 0 : }
990 :
991 : string Settings::wordDefault(string keyIn) {
992 0 : if (isWord(keyIn)) return words[toLower(keyIn)].valDefault;
993 0 : infoPtr->errorMsg("Error in Settings::wordDefault: unknown key", keyIn);
994 0 : return " ";
995 0 : }
996 :
997 : vector<bool> Settings::fvecDefault(string keyIn) {
998 0 : if (isFVec(keyIn)) return fvecs[toLower(keyIn)].valDefault;
999 0 : infoPtr->errorMsg("Error in Settings::fvecDefault: unknown key", keyIn);
1000 0 : return vector<bool>(1, false);
1001 0 : }
1002 :
1003 : vector<int> Settings::mvecDefault(string keyIn) {
1004 0 : if (isMVec(keyIn)) return mvecs[toLower(keyIn)].valDefault;
1005 0 : infoPtr->errorMsg("Error in Settings::mvecDefault: unknown key", keyIn);
1006 0 : return vector<int>(1, 0);
1007 0 : }
1008 :
1009 : vector<double> Settings::pvecDefault(string keyIn) {
1010 0 : if (isPVec(keyIn)) return pvecs[toLower(keyIn)].valDefault;
1011 0 : infoPtr->errorMsg("Error in Settings::pvecDefault: unknown key", keyIn);
1012 0 : return vector<double>(1, 0.);
1013 0 : }
1014 :
1015 : //--------------------------------------------------------------------------
1016 :
1017 : // Get a map of entries whose names contain the string "match".
1018 :
1019 : map<string, Flag> Settings::getFlagMap(string match) {
1020 : // Make the match string lower case. Start with an empty map.
1021 0 : match = toLower(match);
1022 0 : map<string, Flag> flagMap;
1023 : // Loop over the flag map (using iterator).
1024 0 : for (map<string,Flag>::iterator flagEntry = flags.begin();
1025 0 : flagEntry != flags.end(); ++flagEntry)
1026 0 : if (flagEntry->first.find(match) != string::npos)
1027 0 : flagMap[flagEntry->first] = flagEntry->second;
1028 : return flagMap;
1029 0 : }
1030 :
1031 : map<string, Mode> Settings::getModeMap(string match) {
1032 : // Make the match string lower case. Start with an empty map.
1033 0 : match = toLower(match);
1034 0 : map<string, Mode> modeMap;
1035 : // Loop over the mode map (using iterator).
1036 0 : for (map<string,Mode>::iterator modeEntry = modes.begin();
1037 0 : modeEntry != modes.end(); ++modeEntry)
1038 0 : if (modeEntry->first.find(match) != string::npos)
1039 0 : modeMap[modeEntry->first] = modeEntry->second;
1040 : return modeMap;
1041 0 : }
1042 :
1043 : map<string, Parm> Settings::getParmMap(string match) {
1044 : // Make the match string lower case. Start with an empty map.
1045 0 : match = toLower(match);
1046 0 : map<string, Parm> parmMap;
1047 : // Loop over the parm map (using iterator).
1048 0 : for (map<string,Parm>::iterator parmEntry = parms.begin();
1049 0 : parmEntry != parms.end(); ++parmEntry)
1050 0 : if (parmEntry->first.find(match) != string::npos)
1051 0 : parmMap[parmEntry->first] = parmEntry->second;
1052 : return parmMap;
1053 0 : }
1054 :
1055 : map<string, Word> Settings::getWordMap(string match) {
1056 : // Make the match string lower case. Start with an empty map.
1057 0 : match = toLower(match);
1058 0 : map<string, Word> wordMap;
1059 : // Loop over the word map (using iterator).
1060 0 : for (map<string,Word>::iterator wordEntry = words.begin();
1061 0 : wordEntry != words.end(); ++wordEntry)
1062 0 : if (wordEntry->first.find(match) != string::npos)
1063 0 : wordMap[wordEntry->first] = wordEntry->second;
1064 : return wordMap;
1065 0 : }
1066 :
1067 : map<string, FVec> Settings::getFVecMap(string match) {
1068 : // Make the match string lower case. Start with an empty map.
1069 0 : match = toLower(match);
1070 0 : map<string, FVec> fvecMap;
1071 : // Loop over the fvec map (using iterator).
1072 0 : for (map<string,FVec>::iterator fvecEntry = fvecs.begin();
1073 0 : fvecEntry != fvecs.end(); ++fvecEntry)
1074 0 : if (fvecEntry->first.find(match) != string::npos)
1075 0 : fvecMap[fvecEntry->first] = fvecEntry->second;
1076 : return fvecMap;
1077 0 : }
1078 :
1079 : map<string, MVec> Settings::getMVecMap(string match) {
1080 : // Make the match string lower case. Start with an empty map.
1081 0 : match = toLower(match);
1082 0 : map<string, MVec> mvecMap;
1083 : // Loop over the mvec map (using iterator).
1084 0 : for (map<string,MVec>::iterator mvecEntry = mvecs.begin();
1085 0 : mvecEntry != mvecs.end(); ++mvecEntry)
1086 0 : if (mvecEntry->first.find(match) != string::npos)
1087 0 : mvecMap[mvecEntry->first] = mvecEntry->second;
1088 : return mvecMap;
1089 0 : }
1090 :
1091 : map<string, PVec> Settings::getPVecMap(string match) {
1092 : // Make the match string lower case. Start with an empty map.
1093 0 : match = toLower(match);
1094 0 : map<string, PVec> pvecMap;
1095 : // Loop over the pvec map (using iterator).
1096 0 : for (map<string,PVec>::iterator pvecEntry = pvecs.begin();
1097 0 : pvecEntry != pvecs.end(); ++pvecEntry)
1098 0 : if (pvecEntry->first.find(match) != string::npos)
1099 0 : pvecMap[pvecEntry->first] = pvecEntry->second;
1100 : return pvecMap;
1101 0 : }
1102 :
1103 : //--------------------------------------------------------------------------
1104 :
1105 : // Change current value, respecting limits.
1106 :
1107 : void Settings::flag(string keyIn, bool nowIn) {
1108 0 : string keyLower = toLower(keyIn);
1109 0 : if (isFlag(keyIn)) flags[keyLower].valNow = nowIn;
1110 : // Print:quiet triggers a whole set of changes.
1111 0 : if (keyLower == "print:quiet") printQuiet( nowIn);
1112 0 : }
1113 :
1114 : bool Settings:: mode(string keyIn, int nowIn) {
1115 0 : if (isMode(keyIn)) {
1116 0 : string keyLower = toLower(keyIn);
1117 0 : Mode& modeNow = modes[keyLower];
1118 : // For modepick and modefix fail if values are outside range.
1119 0 : if (modeNow.optOnly && (nowIn < modeNow.valMin || nowIn > modeNow.valMax) )
1120 0 : return false;
1121 0 : if (modeNow.hasMin && nowIn < modeNow.valMin)
1122 0 : modeNow.valNow = modeNow.valMin;
1123 0 : else if (modeNow.hasMax && nowIn > modeNow.valMax)
1124 0 : modeNow.valNow = modeNow.valMax;
1125 0 : else modeNow.valNow = nowIn;
1126 : // Tune:ee and Tune:pp each trigger a whole set of changes.
1127 0 : if (keyLower == "tune:ee") initTuneEE( modeNow.valNow);
1128 0 : if (keyLower == "tune:pp") initTunePP( modeNow.valNow);
1129 0 : }
1130 0 : return true;
1131 :
1132 0 : }
1133 :
1134 : void Settings::parm(string keyIn, double nowIn) {
1135 0 : if (isParm(keyIn)) {
1136 0 : Parm& parmNow = parms[toLower(keyIn)];
1137 0 : if (parmNow.hasMin && nowIn < parmNow.valMin)
1138 0 : parmNow.valNow = parmNow.valMin;
1139 0 : else if (parmNow.hasMax && nowIn > parmNow.valMax)
1140 0 : parmNow.valNow = parmNow.valMax;
1141 0 : else parmNow.valNow = nowIn;
1142 0 : }
1143 0 : }
1144 :
1145 : void Settings::word(string keyIn, string nowIn) {
1146 0 : if (isWord(keyIn)) words[toLower(keyIn)].valNow = nowIn;
1147 0 : }
1148 :
1149 : void Settings::fvec(string keyIn, vector<bool> nowIn) {
1150 0 : if (isFVec(keyIn)) {
1151 0 : FVec& fvecNow = fvecs[toLower(keyIn)];
1152 0 : fvecNow.valNow.clear();
1153 0 : for(vector<bool>::iterator now = nowIn.begin();
1154 0 : now != nowIn.end(); now++)
1155 0 : fvecNow.valNow.push_back(*now);
1156 0 : }
1157 0 : }
1158 :
1159 : void Settings::mvec(string keyIn, vector<int> nowIn) {
1160 0 : if (isMVec(keyIn)) {
1161 0 : MVec& mvecNow = mvecs[toLower(keyIn)];
1162 0 : mvecNow.valNow.clear();
1163 0 : for(vector<int>::iterator now = nowIn.begin();
1164 0 : now != nowIn.end(); now++) {
1165 0 : if (mvecNow.hasMin && *now < mvecNow.valMin)
1166 0 : mvecNow.valNow.push_back(mvecNow.valMin);
1167 0 : else if (mvecNow.hasMax && *now > mvecNow.valMax)
1168 0 : mvecNow.valNow.push_back(mvecNow.valMax);
1169 0 : else mvecNow.valNow.push_back(*now);
1170 : }
1171 0 : }
1172 0 : }
1173 :
1174 : void Settings::pvec(string keyIn, vector<double> nowIn) {
1175 0 : if (isPVec(keyIn)) {
1176 0 : PVec& pvecNow = pvecs[toLower(keyIn)];
1177 0 : pvecNow.valNow.clear();
1178 0 : for(vector<double>::iterator now = nowIn.begin();
1179 0 : now != nowIn.end(); now++) {
1180 0 : if (pvecNow.hasMin && *now < pvecNow.valMin)
1181 0 : pvecNow.valNow.push_back(pvecNow.valMin);
1182 0 : else if (pvecNow.hasMax && *now > pvecNow.valMax)
1183 0 : pvecNow.valNow.push_back(pvecNow.valMax);
1184 0 : else pvecNow.valNow.push_back(*now);
1185 : }
1186 0 : }
1187 0 : }
1188 :
1189 : //--------------------------------------------------------------------------
1190 :
1191 : // Change current value, disregarding limits.
1192 :
1193 : void Settings::forceMode(string keyIn, int nowIn) {
1194 0 : if (isMode(keyIn)) {
1195 0 : string keyLower = toLower(keyIn);
1196 0 : Mode& modeNow = modes[keyLower];
1197 0 : modeNow.valNow = nowIn;
1198 : // Tune:ee and Tune:pp each trigger a whole set of changes.
1199 0 : if (keyLower == "tune:ee") initTuneEE( modeNow.valNow);
1200 0 : if (keyLower == "tune:pp") initTunePP( modeNow.valNow);
1201 0 : }
1202 0 : }
1203 :
1204 : void Settings::forceParm(string keyIn, double nowIn) {
1205 0 : if (isParm(keyIn)) parms[toLower(keyIn)].valNow = nowIn;
1206 0 : }
1207 :
1208 : void Settings::forceMVec(string keyIn, vector<int> nowIn) {
1209 0 : if (isMVec(keyIn)) mvecs[toLower(keyIn)].valNow = nowIn;
1210 0 : }
1211 :
1212 : void Settings::forcePVec(string keyIn, vector<double> nowIn) {
1213 0 : if (isPVec(keyIn)) pvecs[toLower(keyIn)].valNow = nowIn;
1214 0 : }
1215 :
1216 : //--------------------------------------------------------------------------
1217 :
1218 : // Restore current value to default.
1219 :
1220 : void Settings::resetFlag(string keyIn) {
1221 0 : if (isFlag(keyIn)) flags[toLower(keyIn)].valNow
1222 0 : = flags[toLower(keyIn)].valDefault ;
1223 0 : }
1224 :
1225 : void Settings::resetMode(string keyIn) {
1226 0 : string keyLower = toLower(keyIn);
1227 0 : if (isMode(keyIn)) modes[keyLower].valNow
1228 0 : = modes[toLower(keyIn)].valDefault ;
1229 : // For Tune:ee and Tune:pp must also restore variables involved in tunes.
1230 0 : if (keyLower == "tune:ee") resetTuneEE();
1231 0 : if (keyLower == "tune:pp") resetTunePP();
1232 0 : }
1233 :
1234 : void Settings::resetParm(string keyIn) {
1235 0 : if (isParm(keyIn)) parms[toLower(keyIn)].valNow
1236 0 : = parms[toLower(keyIn)].valDefault ;
1237 0 : }
1238 :
1239 : void Settings::resetWord(string keyIn) {
1240 0 : if (isWord(keyIn)) words[toLower(keyIn)].valNow
1241 0 : = words[toLower(keyIn)].valDefault ;
1242 0 : }
1243 :
1244 : void Settings::resetFVec(string keyIn) {
1245 0 : if (isFVec(keyIn)) fvecs[toLower(keyIn)].valNow
1246 0 : = fvecs[toLower(keyIn)].valDefault ;
1247 0 : }
1248 :
1249 : void Settings::resetMVec(string keyIn) {
1250 0 : if (isMVec(keyIn)) mvecs[toLower(keyIn)].valNow
1251 0 : = mvecs[toLower(keyIn)].valDefault ;
1252 0 : }
1253 :
1254 : void Settings::resetPVec(string keyIn) {
1255 0 : if (isPVec(keyIn)) pvecs[toLower(keyIn)].valNow
1256 0 : = pvecs[toLower(keyIn)].valDefault ;
1257 0 : }
1258 :
1259 : //--------------------------------------------------------------------------
1260 :
1261 : // Regulate level of printout by overall change of settings.
1262 :
1263 : void Settings::printQuiet(bool quiet) {
1264 :
1265 : // Switch off as much output as possible.
1266 0 : if (quiet) {
1267 0 : flag("Init:showProcesses", false );
1268 0 : flag("Init:showMultipartonInteractions", false );
1269 0 : flag("Init:showChangedSettings", false );
1270 0 : flag("Init:showAllSettings", false );
1271 0 : flag("Init:showChangedParticleData", false );
1272 0 : flag("Init:showChangedResonanceData", false );
1273 0 : flag("Init:showAllParticleData", false );
1274 0 : mode("Init:showOneParticleData", 0 );
1275 0 : mode("Next:numberCount", 0 );
1276 0 : mode("Next:numberShowLHA", 0 );
1277 0 : mode("Next:numberShowInfo", 0 );
1278 0 : mode("Next:numberShowProcess", 0 );
1279 0 : mode("Next:numberShowEvent", 0 );
1280 :
1281 : // Restore ouput settings to default.
1282 0 : } else {
1283 0 : resetFlag("Init:showProcesses");
1284 0 : resetFlag("Init:showMultipartonInteractions");
1285 0 : resetFlag("Init:showChangedSettings");
1286 0 : resetFlag("Init:showAllSettings");
1287 0 : resetFlag("Init:showChangedParticleData");
1288 0 : resetFlag("Init:showChangedResonanceData");
1289 0 : resetFlag("Init:showAllParticleData");
1290 0 : resetMode("Init:showOneParticleData");
1291 0 : resetMode("Next:numberCount");
1292 0 : resetMode("Next:numberShowLHA");
1293 0 : resetMode("Next:numberShowInfo");
1294 0 : resetMode("Next:numberShowProcess");
1295 0 : resetMode("Next:numberShowEvent");
1296 : }
1297 :
1298 0 : }
1299 :
1300 : //--------------------------------------------------------------------------
1301 :
1302 : // Restore all e+e- settings to their original values.
1303 :
1304 : void Settings::resetTuneEE() {
1305 :
1306 : // Flavour composition.
1307 0 : resetParm("StringFlav:probStoUD");
1308 0 : resetParm("StringFlav:probQQtoQ");
1309 0 : resetParm("StringFlav:probSQtoQQ");
1310 0 : resetParm("StringFlav:probQQ1toQQ0");
1311 0 : resetParm("StringFlav:mesonUDvector");
1312 0 : resetParm("StringFlav:mesonSvector");
1313 0 : resetParm("StringFlav:mesonCvector");
1314 0 : resetParm("StringFlav:mesonBvector");
1315 0 : resetParm("StringFlav:etaSup");
1316 0 : resetParm("StringFlav:etaPrimeSup");
1317 0 : resetParm("StringFlav:popcornSpair");
1318 0 : resetParm("StringFlav:popcornSmeson");
1319 0 : resetFlag("StringFlav:suppressLeadingB");
1320 :
1321 : // String breaks: z.
1322 0 : resetParm("StringZ:aLund");
1323 0 : resetParm("StringZ:bLund");
1324 0 : resetParm("StringZ:aExtraSquark");
1325 0 : resetParm("StringZ:aExtraDiquark");
1326 0 : resetParm("StringZ:rFactC");
1327 0 : resetParm("StringZ:rFactB");
1328 :
1329 : // String breaks: pT.
1330 0 : resetParm("StringPT:sigma");
1331 0 : resetParm("StringPT:enhancedFraction");
1332 0 : resetParm("StringPT:enhancedWidth");
1333 :
1334 : // FSR: strong coupling, IR cutoff.
1335 0 : resetParm("TimeShower:alphaSvalue");
1336 0 : resetMode("TimeShower:alphaSorder");
1337 0 : resetFlag("TimeShower:alphaSuseCMW");
1338 0 : resetParm("TimeShower:pTmin");
1339 0 : resetParm("TimeShower:pTminChgQ");
1340 :
1341 0 : }
1342 :
1343 : //--------------------------------------------------------------------------
1344 :
1345 : // Restore all pp settings to their original values.
1346 :
1347 : void Settings::resetTunePP() {
1348 :
1349 : // PDF set.
1350 0 : resetWord("PDF:pSet");
1351 :
1352 : // Hard matrix elements alpha_s value.
1353 0 : resetParm("SigmaProcess:alphaSvalue");
1354 :
1355 : // Diffraction: cross sections and mass distributions.
1356 0 : resetFlag("SigmaTotal:zeroAXB");
1357 0 : resetFlag("SigmaDiffractive:dampen");
1358 0 : resetParm("SigmaDiffractive:maxXB");
1359 0 : resetParm("SigmaDiffractive:maxAX");
1360 0 : resetParm("SigmaDiffractive:maxXX");
1361 0 : resetParm("Diffraction:largeMassSuppress");
1362 :
1363 : // FSR: dipoles to beam, spin correlations.
1364 0 : resetFlag("TimeShower:dampenBeamRecoil");
1365 0 : resetFlag("TimeShower:phiPolAsym");
1366 :
1367 : // ISR: strong coupling, IR cutoff, coherence and spin correlations.
1368 0 : resetParm("SpaceShower:alphaSvalue");
1369 0 : resetMode("SpaceShower:alphaSorder");
1370 0 : resetParm("SpaceShower:alphaSuseCMW");
1371 0 : resetFlag("SpaceShower:samePTasMPI");
1372 0 : resetParm("SpaceShower:pT0Ref");
1373 0 : resetParm("SpaceShower:ecmRef");
1374 0 : resetParm("SpaceShower:ecmPow");
1375 0 : resetParm("SpaceShower:pTmaxFudge");
1376 0 : resetParm("SpaceShower:pTdampFudge");
1377 0 : resetFlag("SpaceShower:rapidityOrder");
1378 0 : resetFlag("SpaceShower:phiPolAsym");
1379 0 : resetFlag("SpaceShower:phiIntAsym");
1380 :
1381 : // MPI: strong coupling, IR regularization, energy scaling.
1382 0 : resetParm("MultipartonInteractions:alphaSvalue");
1383 0 : resetParm("MultipartonInteractions:pT0Ref");
1384 0 : resetParm("MultipartonInteractions:ecmRef");
1385 0 : resetParm("MultipartonInteractions:ecmPow");
1386 0 : resetMode("MultipartonInteractions:bProfile");
1387 0 : resetParm("MultipartonInteractions:expPow");
1388 0 : resetParm("MultipartonInteractions:a1");
1389 :
1390 : // Beam remnant parameters.
1391 0 : resetParm("BeamRemnants:primordialKTsoft");
1392 0 : resetParm("BeamRemnants:primordialKThard");
1393 0 : resetParm("BeamRemnants:halfScaleForKT");
1394 0 : resetParm("BeamRemnants:halfMassForKT");
1395 :
1396 : // Colour reconnection parameters.
1397 0 : resetMode("ColourReconnection:mode");
1398 0 : resetParm("ColourReconnection:range");
1399 :
1400 0 : }
1401 :
1402 : //--------------------------------------------------------------------------
1403 :
1404 : // Set the values related to a tune of e+e- data,
1405 : // i.e. mainly for final-state radiation and hadronization.
1406 :
1407 : void Settings::initTuneEE( int eeTune) {
1408 :
1409 : // Restore all e+e- settings to their original values.
1410 : // Is first step for setting up a specific tune.
1411 0 : if (eeTune != 0) resetTuneEE();
1412 :
1413 : // Old flavour and FSR defaults carried over from very old JETSET tune,
1414 : // only with alphaS roughly tuned for "new" pT-ordered shower.
1415 0 : if (eeTune == 1) {
1416 0 : parm("StringFlav:probStoUD", 0.30 );
1417 0 : parm("StringFlav:probQQtoQ", 0.10 );
1418 0 : parm("StringFlav:probSQtoQQ", 0.40 );
1419 0 : parm("StringFlav:probQQ1toQQ0", 0.05 );
1420 0 : parm("StringFlav:mesonUDvector", 1.00 );
1421 0 : parm("StringFlav:mesonSvector", 1.50 );
1422 0 : parm("StringFlav:mesonCvector", 2.50 );
1423 0 : parm("StringFlav:mesonBvector", 3.00 );
1424 0 : parm("StringFlav:etaSup", 1.00 );
1425 0 : parm("StringFlav:etaPrimeSup", 0.40 );
1426 0 : parm("StringFlav:popcornSpair", 0.50 );
1427 0 : parm("StringFlav:popcornSmeson", 0.50 );
1428 0 : flag("StringFlav:suppressLeadingB", false );
1429 0 : parm("StringZ:aLund", 0.30 );
1430 0 : parm("StringZ:bLund", 0.58 );
1431 0 : parm("StringZ:aExtraSquark", 0.00 );
1432 0 : parm("StringZ:aExtraDiquark", 0.50 );
1433 0 : parm("StringZ:rFactC", 1.00 );
1434 0 : parm("StringZ:rFactB", 1.00 );
1435 0 : parm("StringPT:sigma", 0.36 );
1436 0 : parm("StringPT:enhancedFraction", 0.01 );
1437 0 : parm("StringPT:enhancedWidth", 2.0 );
1438 0 : parm("TimeShower:alphaSvalue", 0.137 );
1439 0 : mode("TimeShower:alphaSorder", 1 );
1440 0 : flag("TimeShower:alphaSuseCMW", false );
1441 0 : parm("TimeShower:pTmin", 0.5 );
1442 0 : parm("TimeShower:pTminChgQ", 0.5 );
1443 0 : }
1444 :
1445 : // Marc Montull's tune to particle composition at LEP1 (August 2007).
1446 0 : else if (eeTune == 2) {
1447 0 : parm("StringFlav:probStoUD", 0.22 );
1448 0 : parm("StringFlav:probQQtoQ", 0.08 );
1449 0 : parm("StringFlav:probSQtoQQ", 0.75 );
1450 0 : parm("StringFlav:probQQ1toQQ0", 0.025 );
1451 0 : parm("StringFlav:mesonUDvector", 0.5 );
1452 0 : parm("StringFlav:mesonSvector", 0.6 );
1453 0 : parm("StringFlav:mesonCvector", 1.5 );
1454 0 : parm("StringFlav:mesonBvector", 2.5 );
1455 0 : parm("StringFlav:etaSup", 0.60 );
1456 0 : parm("StringFlav:etaPrimeSup", 0.15 );
1457 0 : parm("StringFlav:popcornSpair", 1.0 );
1458 0 : parm("StringFlav:popcornSmeson", 1.0 );
1459 0 : flag("StringFlav:suppressLeadingB", false ); // kept fixed
1460 0 : parm("StringZ:aLund", 0.76 );
1461 0 : parm("StringZ:bLund", 0.58 ); // kept fixed
1462 0 : parm("StringZ:aExtraSquark", 0.00 ); // kept fixed
1463 0 : parm("StringZ:aExtraDiquark", 0.50 ); // kept fixed
1464 0 : parm("StringZ:rFactC", 1.00 ); // kept fixed
1465 0 : parm("StringZ:rFactB", 1.00 ); // kept fixed
1466 0 : parm("StringPT:sigma", 0.36 ); // kept fixed
1467 0 : parm("StringPT:enhancedFraction", 0.01 ); // kept fixed
1468 0 : parm("StringPT:enhancedWidth", 2.0 ); // kept fixed
1469 0 : parm("TimeShower:alphaSvalue", 0.137 ); // kept fixed
1470 0 : mode("TimeShower:alphaSorder", 1 ); // kept fixed
1471 0 : flag("TimeShower:alphaSuseCMW", false ); // kept fixed
1472 0 : parm("TimeShower:pTmin", 0.5 ); // kept fixed
1473 0 : parm("TimeShower:pTminChgQ", 0.5 ); // kept fixed
1474 0 : }
1475 :
1476 : // Full e+e- tune of flavours and FSR to LEP1 data within the
1477 : // Rivet + Professor framework, by Hendrik Hoeth (June 2009).
1478 0 : else if (eeTune == 3) {
1479 0 : parm("StringFlav:probStoUD", 0.19 );
1480 0 : parm("StringFlav:probQQtoQ", 0.09 );
1481 0 : parm("StringFlav:probSQtoQQ", 1.00 );
1482 0 : parm("StringFlav:probQQ1toQQ0", 0.027 );
1483 0 : parm("StringFlav:mesonUDvector", 0.62 );
1484 0 : parm("StringFlav:mesonSvector", 0.725 );
1485 0 : parm("StringFlav:mesonCvector", 1.06 );
1486 0 : parm("StringFlav:mesonBvector", 3.0 );
1487 0 : parm("StringFlav:etaSup", 0.63 );
1488 0 : parm("StringFlav:etaPrimeSup", 0.12 );
1489 0 : parm("StringFlav:popcornSpair", 0.5 ); // kept fixed
1490 0 : parm("StringFlav:popcornSmeson", 0.5 ); // kept fixed
1491 0 : flag("StringFlav:suppressLeadingB", false ); // kept fixed
1492 0 : parm("StringZ:aLund", 0.3 ); // kept fixed
1493 0 : parm("StringZ:bLund", 0.8 );
1494 0 : parm("StringZ:aExtraSquark", 0.00 ); // kept fixed
1495 0 : parm("StringZ:aExtraDiquark", 0.50 ); // kept fixed
1496 0 : parm("StringZ:rFactC", 1.00 ); // kept fixed
1497 0 : parm("StringZ:rFactB", 0.67 );
1498 0 : parm("StringPT:sigma", 0.304 );
1499 0 : parm("StringPT:enhancedFraction", 0.01 ); // kept fixed
1500 0 : parm("StringPT:enhancedWidth", 2.0 ); // kept fixed
1501 0 : parm("TimeShower:alphaSvalue", 0.1383);
1502 0 : mode("TimeShower:alphaSorder", 1 ); // kept fixed
1503 0 : flag("TimeShower:alphaSuseCMW", false ); // kept fixed
1504 0 : parm("TimeShower:pTmin", 0.4 ); // kept fixed (near limit)
1505 0 : parm("TimeShower:pTminChgQ", 0.4 ); // kept same as pTmin
1506 0 : }
1507 :
1508 : // Full e+e- tune of flavours and FSR to LEP1 data, by Peter Skands
1509 : // (September 2013). Note use of CMW convention for shower.
1510 0 : else if (eeTune == 4) {
1511 0 : parm("StringFlav:probStoUD", 0.21 );
1512 0 : parm("StringFlav:probQQtoQ", 0.086 );
1513 0 : parm("StringFlav:probSQtoQQ", 1.00 );
1514 0 : parm("StringFlav:probQQ1toQQ0", 0.031 );
1515 0 : parm("StringFlav:mesonUDvector", 0.45 );
1516 0 : parm("StringFlav:mesonSvector", 0.60 );
1517 0 : parm("StringFlav:mesonCvector", 0.95 );
1518 0 : parm("StringFlav:mesonBvector", 3.0 ); // kept fixed
1519 0 : parm("StringFlav:etaSup", 0.65 );
1520 0 : parm("StringFlav:etaPrimeSup", 0.08 );
1521 0 : parm("StringFlav:popcornSpair", 0.5 ); // kept fixed
1522 0 : parm("StringFlav:popcornSmeson", 0.5 ); // kept fixed
1523 0 : flag("StringFlav:suppressLeadingB", false ); // kept fixed
1524 0 : parm("StringZ:aLund", 0.55 );
1525 0 : parm("StringZ:bLund", 1.08 );
1526 0 : parm("StringZ:aExtraSquark", 0.00 ); // kept fixed
1527 0 : parm("StringZ:aExtraDiquark", 1.00 );
1528 0 : parm("StringZ:rFactC", 1.00 ); // kept fixed
1529 0 : parm("StringZ:rFactB", 0.85 );
1530 0 : parm("StringPT:sigma", 0.305 );
1531 0 : parm("StringPT:enhancedFraction", 0.01 ); // kept fixed
1532 0 : parm("StringPT:enhancedWidth", 2.0 ); // kept fixed
1533 0 : parm("TimeShower:alphaSvalue", 0.127 );
1534 0 : mode("TimeShower:alphaSorder", 1 ); // kept fixed
1535 0 : flag("TimeShower:alphaSuseCMW", true );
1536 0 : parm("TimeShower:pTmin", 0.4 );
1537 0 : parm("TimeShower:pTminChgQ", 0.4 ); // kept same as pTmin
1538 0 : }
1539 :
1540 : // First e+e- tune by Nadine Fischer, using eeTune = 3 for flavour
1541 : // composition (September 2013).
1542 0 : else if (eeTune == 5) {
1543 0 : parm("StringFlav:probStoUD", 0.19 ); // kept fixed
1544 0 : parm("StringFlav:probQQtoQ", 0.09 ); // kept fixed
1545 0 : parm("StringFlav:probSQtoQQ", 1.00 ); // kept fixed
1546 0 : parm("StringFlav:probQQ1toQQ0", 0.027 ); // kept fixed
1547 0 : parm("StringFlav:mesonUDvector", 0.62 ); // kept fixed
1548 0 : parm("StringFlav:mesonSvector", 0.725 ); // kept fixed
1549 0 : parm("StringFlav:mesonCvector", 1.06 ); // kept fixed
1550 0 : parm("StringFlav:mesonBvector", 3.0 ); // kept fixed
1551 0 : parm("StringFlav:etaSup", 0.63 ); // kept fixed
1552 0 : parm("StringFlav:etaPrimeSup", 0.12 ); // kept fixed
1553 0 : parm("StringFlav:popcornSpair", 0.5 ); // kept fixed
1554 0 : parm("StringFlav:popcornSmeson", 0.5 ); // kept fixed
1555 0 : flag("StringFlav:suppressLeadingB", false ); // kept fixed
1556 0 : parm("StringZ:aLund", 0.386 );
1557 0 : parm("StringZ:bLund", 0.977 );
1558 0 : parm("StringZ:aExtraSquark", 0.00 ); // kept fixed
1559 0 : parm("StringZ:aExtraDiquark", 0.940 );
1560 0 : parm("StringZ:rFactC", 1.00 ); // kept fixed
1561 0 : parm("StringZ:rFactB", 0.67 ); // kept fixed
1562 0 : parm("StringPT:sigma", 0.286 );
1563 0 : parm("StringPT:enhancedFraction", 0.01 ); // kept fixed
1564 0 : parm("StringPT:enhancedWidth", 2.0 ); // kept fixed
1565 0 : parm("TimeShower:alphaSvalue", 0.139 );
1566 0 : mode("TimeShower:alphaSorder", 1 ); // kept fixed
1567 0 : flag("TimeShower:alphaSuseCMW", false ); // kept fixed
1568 0 : parm("TimeShower:pTmin", 0.409 );
1569 0 : parm("TimeShower:pTminChgQ", 0.409 ); // kept same as pTmin
1570 0 : }
1571 :
1572 : // Second e+e- tune by Nadine Fischer, using eeTune = 3 for flavour
1573 : // composition (September 2013).
1574 0 : else if (eeTune == 6) {
1575 0 : parm("StringFlav:probStoUD", 0.19 ); // kept fixed
1576 0 : parm("StringFlav:probQQtoQ", 0.09 ); // kept fixed
1577 0 : parm("StringFlav:probSQtoQQ", 1.00 ); // kept fixed
1578 0 : parm("StringFlav:probQQ1toQQ0", 0.027 ); // kept fixed
1579 0 : parm("StringFlav:mesonUDvector", 0.62 ); // kept fixed
1580 0 : parm("StringFlav:mesonSvector", 0.725 ); // kept fixed
1581 0 : parm("StringFlav:mesonCvector", 1.06 ); // kept fixed
1582 0 : parm("StringFlav:mesonBvector", 3.0 ); // kept fixed
1583 0 : parm("StringFlav:etaSup", 0.63 ); // kept fixed
1584 0 : parm("StringFlav:etaPrimeSup", 0.12 ); // kept fixed
1585 0 : parm("StringFlav:popcornSpair", 0.5 ); // kept fixed
1586 0 : parm("StringFlav:popcornSmeson", 0.5 ); // kept fixed
1587 0 : flag("StringFlav:suppressLeadingB", false ); // kept fixed
1588 0 : parm("StringZ:aLund", 0.351 );
1589 0 : parm("StringZ:bLund", 0.942 );
1590 0 : parm("StringZ:aExtraSquark", 0.00 ); // kept fixed
1591 0 : parm("StringZ:aExtraDiquark", 0.547 );
1592 0 : parm("StringZ:rFactC", 1.00 ); // kept fixed
1593 0 : parm("StringZ:rFactB", 0.67 ); // kept fixed
1594 0 : parm("StringPT:sigma", 0.283 );
1595 0 : parm("StringPT:enhancedFraction", 0.01 ); // kept fixed
1596 0 : parm("StringPT:enhancedWidth", 2.0 ); // kept fixed
1597 0 : parm("TimeShower:alphaSvalue", 0.139);
1598 0 : mode("TimeShower:alphaSorder", 1 ); // kept fixed
1599 0 : flag("TimeShower:alphaSuseCMW", false ); // kept fixed
1600 0 : parm("TimeShower:pTmin", 0.406 );
1601 0 : parm("TimeShower:pTminChgQ", 0.406 ); // kept same as pTmin
1602 0 : }
1603 :
1604 : // The Monash 2013 tune by Peter Skands, the e+e- part (January 2014).
1605 0 : else if (eeTune == 7) {
1606 0 : parm("StringFlav:probStoUD", 0.217 );
1607 0 : parm("StringFlav:probQQtoQ", 0.081 );
1608 0 : parm("StringFlav:probSQtoQQ", 0.915 );
1609 0 : parm("StringFlav:probQQ1toQQ0", 0.0275);
1610 0 : parm("StringFlav:mesonUDvector", 0.50 );
1611 0 : parm("StringFlav:mesonSvector", 0.55 );
1612 0 : parm("StringFlav:mesonCvector", 0.88 );
1613 0 : parm("StringFlav:mesonBvector", 2.20 );
1614 0 : parm("StringFlav:etaSup", 0.60 );
1615 0 : parm("StringFlav:etaPrimeSup", 0.12 );
1616 0 : parm("StringFlav:popcornSpair", 0.90 );
1617 0 : parm("StringFlav:popcornSmeson", 0.50 );
1618 0 : flag("StringFlav:suppressLeadingB", false ); // kept fixed
1619 0 : parm("StringZ:aLund", 0.68 );
1620 0 : parm("StringZ:bLund", 0.98 );
1621 0 : parm("StringZ:aExtraSquark", 0.00 ); // kept fixed
1622 0 : parm("StringZ:aExtraDiquark", 0.97 );
1623 0 : parm("StringZ:rFactC", 1.32 );
1624 0 : parm("StringZ:rFactB", 0.855 );
1625 0 : parm("StringPT:sigma", 0.335 );
1626 0 : parm("StringPT:enhancedFraction", 0.01 ); // kept fixed
1627 0 : parm("StringPT:enhancedWidth", 2.0 ); // kept fixed
1628 0 : parm("TimeShower:alphaSvalue", 0.1365);
1629 0 : mode("TimeShower:alphaSorder", 1 ); // kept fixed
1630 0 : flag("TimeShower:alphaSuseCMW", false ); // kept fixed
1631 0 : parm("TimeShower:pTmin", 0.5 ); // kept fixed
1632 0 : parm("TimeShower:pTminChgQ", 0.5 ); // kept fixed
1633 0 : }
1634 :
1635 0 : }
1636 :
1637 : //--------------------------------------------------------------------------
1638 :
1639 : // Set the values related to a tune of pp/ppbar data,
1640 : // i.e. mainly for initial-state radiation and multiparton interactions.
1641 :
1642 : void Settings::initTunePP( int ppTune) {
1643 :
1644 : // Restore all pp/ppbar settings to their original values.
1645 : // Is first step for setting up a specific tune.
1646 0 : if (ppTune != 0) resetTunePP();
1647 :
1648 : // Set up e+e- tune that goes with the corresponding pp tune.
1649 0 : if (ppTune > 0) {
1650 : int eeTune = 3;
1651 0 : if (ppTune == 14 || ppTune >= 18) eeTune = 7;
1652 : // The mode setting is for documentation, the real action is by initTuneEE.
1653 0 : mode("Tune:ee", eeTune );
1654 0 : initTuneEE( eeTune);
1655 0 : }
1656 :
1657 : // Decide whether to use LHAPFD where possible.
1658 0 : int preferLHAPDF = mode("Tune:preferLHAPDF");
1659 :
1660 : // Old ISR and MPI defaults from early and primitive comparisons with data.
1661 0 : if (ppTune == 1) {
1662 0 : word("PDF:pSet", "2" );
1663 0 : parm("SigmaProcess:alphaSvalue", 0.1265);
1664 0 : flag("SigmaTotal:zeroAXB", true );
1665 0 : flag("SigmaDiffractive:dampen", false );
1666 0 : parm("Diffraction:largeMassSuppress", 2.0 );
1667 0 : flag("TimeShower:dampenBeamRecoil", false );
1668 0 : flag("TimeShower:phiPolAsym", false );
1669 0 : parm("SpaceShower:alphaSvalue", 0.127 );
1670 0 : mode("SpaceShower:alphaSorder", 1 );
1671 0 : flag("SpaceShower:alphaSuseCMW", false );
1672 0 : flag("SpaceShower:samePTasMPI", true );
1673 0 : parm("SpaceShower:pT0Ref", 2.2 );
1674 0 : parm("SpaceShower:ecmRef", 1800.0);
1675 0 : parm("SpaceShower:ecmPow", 0.16 );
1676 0 : parm("SpaceShower:pTmaxFudge", 1.0 );
1677 0 : parm("SpaceShower:pTdampFudge", 1.0 );
1678 0 : flag("SpaceShower:rapidityOrder", false );
1679 0 : flag("SpaceShower:phiPolAsym", false );
1680 0 : flag("SpaceShower:phiIntAsym", false );
1681 0 : parm("MultipartonInteractions:alphaSvalue", 0.127 );
1682 0 : parm("MultipartonInteractions:pT0Ref", 2.15 );
1683 0 : parm("MultipartonInteractions:ecmRef", 1800. );
1684 0 : parm("MultipartonInteractions:ecmPow", 0.16 );
1685 0 : mode("MultipartonInteractions:bProfile", 2 );
1686 0 : parm("MultipartonInteractions:expPow", 1.0 );
1687 0 : parm("MultipartonInteractions:a1", 0.15 );
1688 0 : parm("BeamRemnants:primordialKTsoft", 0.4 );
1689 0 : parm("BeamRemnants:primordialKThard", 2.1 );
1690 0 : parm("BeamRemnants:halfScaleForKT", 7.0 );
1691 0 : parm("BeamRemnants:halfMassForKT", 2.0 );
1692 0 : mode("ColourReconnection:mode", 0 );
1693 0 : parm("ColourReconnection:range", 2.5 );
1694 0 : }
1695 :
1696 : // "Tune 1" simple first tune by Peter Skands to ISR and MPI, July 2009.
1697 0 : else if (ppTune == 2) {
1698 0 : word("PDF:pSet", "2" );
1699 0 : parm("SigmaProcess:alphaSvalue", 0.1265);
1700 0 : flag("SigmaTotal:zeroAXB", true );
1701 0 : flag("SigmaDiffractive:dampen", false );
1702 0 : parm("Diffraction:largeMassSuppress", 2.0 );
1703 0 : flag("TimeShower:dampenBeamRecoil", false );
1704 0 : flag("TimeShower:phiPolAsym", false );
1705 0 : parm("SpaceShower:alphaSvalue", 0.137 );
1706 0 : mode("SpaceShower:alphaSorder", 1 );
1707 0 : flag("SpaceShower:alphaSuseCMW", false );
1708 0 : flag("SpaceShower:samePTasMPI", false );
1709 0 : parm("SpaceShower:pT0Ref", 2.0 );
1710 0 : parm("SpaceShower:ecmRef", 1800.0);
1711 0 : parm("SpaceShower:ecmPow", 0.0 );
1712 0 : parm("SpaceShower:pTmaxFudge", 1.0 );
1713 0 : parm("SpaceShower:pTdampFudge", 1.0 );
1714 0 : flag("SpaceShower:rapidityOrder", false );
1715 0 : flag("SpaceShower:phiPolAsym", false );
1716 0 : flag("SpaceShower:phiIntAsym", false );
1717 0 : parm("MultipartonInteractions:alphaSvalue", 0.127 );
1718 0 : parm("MultipartonInteractions:pT0Ref", 2.25 );
1719 0 : parm("MultipartonInteractions:ecmRef", 1800. );
1720 0 : parm("MultipartonInteractions:ecmPow", 0.24 );
1721 0 : mode("MultipartonInteractions:bProfile", 1 );
1722 0 : parm("MultipartonInteractions:expPow", 1.0 );
1723 0 : parm("MultipartonInteractions:a1", 0.15 );
1724 0 : parm("BeamRemnants:primordialKTsoft", 0.5 );
1725 0 : parm("BeamRemnants:primordialKThard", 2.0 );
1726 0 : parm("BeamRemnants:halfScaleForKT", 1.0 );
1727 0 : parm("BeamRemnants:halfMassForKT", 1.0 );
1728 0 : mode("ColourReconnection:mode", 0 );
1729 0 : parm("ColourReconnection:range", 10.0 );
1730 0 : }
1731 :
1732 : // Tune 2C, July 2010.
1733 0 : else if (ppTune == 3) {
1734 0 : word("PDF:pSet", "8" );
1735 0 : parm("SigmaProcess:alphaSvalue", 0.135 );
1736 0 : flag("SigmaTotal:zeroAXB", true );
1737 0 : flag("SigmaDiffractive:dampen", false );
1738 0 : parm("Diffraction:largeMassSuppress", 2.0 );
1739 0 : flag("TimeShower:dampenBeamRecoil", true );
1740 0 : flag("TimeShower:phiPolAsym", true );
1741 0 : parm("SpaceShower:alphaSvalue", 0.137 );
1742 0 : mode("SpaceShower:alphaSorder", 1 );
1743 0 : flag("SpaceShower:alphaSuseCMW", false );
1744 0 : flag("SpaceShower:samePTasMPI", false );
1745 0 : parm("SpaceShower:pT0Ref", 2.0 );
1746 0 : parm("SpaceShower:ecmRef", 1800.0);
1747 0 : parm("SpaceShower:ecmPow", 0.0 );
1748 0 : parm("SpaceShower:pTmaxFudge", 1.0 );
1749 0 : parm("SpaceShower:pTdampFudge", 1.0 );
1750 0 : flag("SpaceShower:rapidityOrder", true );
1751 0 : flag("SpaceShower:phiPolAsym", true );
1752 0 : flag("SpaceShower:phiIntAsym", true );
1753 0 : parm("MultipartonInteractions:alphaSvalue", 0.135 );
1754 0 : parm("MultipartonInteractions:pT0Ref", 2.32 );
1755 0 : parm("MultipartonInteractions:ecmRef", 1800. );
1756 0 : parm("MultipartonInteractions:ecmPow", 0.21 );
1757 0 : mode("MultipartonInteractions:bProfile", 3 );
1758 0 : parm("MultipartonInteractions:expPow", 1.6 );
1759 0 : parm("MultipartonInteractions:a1", 0.15 );
1760 0 : parm("BeamRemnants:primordialKTsoft", 0.5 );
1761 0 : parm("BeamRemnants:primordialKThard", 2.0 );
1762 0 : parm("BeamRemnants:halfScaleForKT", 1.0 );
1763 0 : parm("BeamRemnants:halfMassForKT", 1.0 );
1764 0 : mode("ColourReconnection:mode", 0 );
1765 0 : parm("ColourReconnection:range", 3.0 );
1766 0 : }
1767 :
1768 : // Tune 2M, July 2010.
1769 0 : else if (ppTune == 4) {
1770 0 : word("PDF:pSet", "4" );
1771 0 : parm("SigmaProcess:alphaSvalue", 0.1265);
1772 0 : flag("SigmaTotal:zeroAXB", true );
1773 0 : flag("SigmaDiffractive:dampen", false );
1774 0 : parm("Diffraction:largeMassSuppress", 2.0 );
1775 0 : flag("TimeShower:dampenBeamRecoil", true );
1776 0 : flag("TimeShower:phiPolAsym", true );
1777 0 : parm("SpaceShower:alphaSvalue", 0.130 );
1778 0 : mode("SpaceShower:alphaSorder", 1 );
1779 0 : flag("SpaceShower:alphaSuseCMW", false );
1780 0 : flag("SpaceShower:samePTasMPI", false );
1781 0 : parm("SpaceShower:pT0Ref", 2.0 );
1782 0 : parm("SpaceShower:ecmRef", 1800.0);
1783 0 : parm("SpaceShower:ecmPow", 0.0 );
1784 0 : parm("SpaceShower:pTmaxFudge", 1.0 );
1785 0 : parm("SpaceShower:pTdampFudge", 1.0 );
1786 0 : flag("SpaceShower:rapidityOrder", true );
1787 0 : flag("SpaceShower:phiPolAsym", true );
1788 0 : flag("SpaceShower:phiIntAsym", true );
1789 0 : parm("MultipartonInteractions:alphaSvalue", 0.127 );
1790 0 : parm("MultipartonInteractions:pT0Ref", 2.455 );
1791 0 : parm("MultipartonInteractions:ecmRef", 1800. );
1792 0 : parm("MultipartonInteractions:ecmPow", 0.26 );
1793 0 : mode("MultipartonInteractions:bProfile", 3 );
1794 0 : parm("MultipartonInteractions:expPow", 1.15 );
1795 0 : parm("MultipartonInteractions:a1", 0.15 );
1796 0 : parm("BeamRemnants:primordialKTsoft", 0.5 );
1797 0 : parm("BeamRemnants:primordialKThard", 2.0 );
1798 0 : parm("BeamRemnants:halfScaleForKT", 1.0 );
1799 0 : parm("BeamRemnants:halfMassForKT", 1.0 );
1800 0 : mode("ColourReconnection:mode", 0 );
1801 0 : parm("ColourReconnection:range", 3.0 );
1802 0 : }
1803 :
1804 : // Tune 4C, October 2010.
1805 0 : else if (ppTune == 5) {
1806 0 : word("PDF:pSet", "8" );
1807 0 : parm("SigmaProcess:alphaSvalue", 0.135 );
1808 0 : flag("SigmaTotal:zeroAXB", true );
1809 0 : flag("SigmaDiffractive:dampen", true );
1810 0 : parm("SigmaDiffractive:maxXB", 65.0 );
1811 0 : parm("SigmaDiffractive:maxAX", 65.0 );
1812 0 : parm("SigmaDiffractive:maxXX", 65.0 );
1813 0 : parm("Diffraction:largeMassSuppress", 2.0 );
1814 0 : flag("TimeShower:dampenBeamRecoil", true );
1815 0 : flag("TimeShower:phiPolAsym", true );
1816 0 : parm("SpaceShower:alphaSvalue", 0.137 );
1817 0 : mode("SpaceShower:alphaSorder", 1 );
1818 0 : flag("SpaceShower:alphaSuseCMW", false );
1819 0 : flag("SpaceShower:samePTasMPI", false );
1820 0 : parm("SpaceShower:pT0Ref", 2.0 );
1821 0 : parm("SpaceShower:ecmRef", 1800.0);
1822 0 : parm("SpaceShower:ecmPow", 0.0 );
1823 0 : parm("SpaceShower:pTmaxFudge", 1.0 );
1824 0 : parm("SpaceShower:pTdampFudge", 1.0 );
1825 0 : flag("SpaceShower:rapidityOrder", true );
1826 0 : flag("SpaceShower:phiPolAsym", true );
1827 0 : flag("SpaceShower:phiIntAsym", true );
1828 0 : parm("MultipartonInteractions:alphaSvalue", 0.135 );
1829 0 : parm("MultipartonInteractions:pT0Ref", 2.085 );
1830 0 : parm("MultipartonInteractions:ecmRef", 1800. );
1831 0 : parm("MultipartonInteractions:ecmPow", 0.19 );
1832 0 : mode("MultipartonInteractions:bProfile", 3 );
1833 0 : parm("MultipartonInteractions:expPow", 2.0 );
1834 0 : parm("MultipartonInteractions:a1", 0.15 );
1835 0 : parm("BeamRemnants:primordialKTsoft", 0.5 );
1836 0 : parm("BeamRemnants:primordialKThard", 2.0 );
1837 0 : parm("BeamRemnants:halfScaleForKT", 1.0 );
1838 0 : parm("BeamRemnants:halfMassForKT", 1.0 );
1839 0 : mode("ColourReconnection:mode", 0 );
1840 0 : parm("ColourReconnection:range", 1.5 );
1841 0 : }
1842 :
1843 : // Tune 4Cx, January 2011.
1844 0 : else if (ppTune == 6) {
1845 0 : word("PDF:pSet", "8" );
1846 0 : parm("SigmaProcess:alphaSvalue", 0.135 );
1847 0 : flag("SigmaTotal:zeroAXB", true );
1848 0 : flag("SigmaDiffractive:dampen", true );
1849 0 : parm("SigmaDiffractive:maxXB", 65.0 );
1850 0 : parm("SigmaDiffractive:maxAX", 65.0 );
1851 0 : parm("SigmaDiffractive:maxXX", 65.0 );
1852 0 : parm("Diffraction:largeMassSuppress", 2.0 );
1853 0 : flag("TimeShower:dampenBeamRecoil", true );
1854 0 : flag("TimeShower:phiPolAsym", true );
1855 0 : parm("SpaceShower:alphaSvalue", 0.137 );
1856 0 : mode("SpaceShower:alphaSorder", 1 );
1857 0 : flag("SpaceShower:alphaSuseCMW", false );
1858 0 : flag("SpaceShower:samePTasMPI", false );
1859 0 : parm("SpaceShower:pT0Ref", 2.0 );
1860 0 : parm("SpaceShower:ecmRef", 1800.0);
1861 0 : parm("SpaceShower:ecmPow", 0.0 );
1862 0 : parm("SpaceShower:pTmaxFudge", 1.0 );
1863 0 : parm("SpaceShower:pTdampFudge", 1.0 );
1864 0 : flag("SpaceShower:rapidityOrder", true );
1865 0 : flag("SpaceShower:phiPolAsym", true );
1866 0 : flag("SpaceShower:phiIntAsym", true );
1867 0 : parm("MultipartonInteractions:alphaSvalue", 0.135 );
1868 0 : parm("MultipartonInteractions:pT0Ref", 2.15 );
1869 0 : parm("MultipartonInteractions:ecmRef", 1800. );
1870 0 : parm("MultipartonInteractions:ecmPow", 0.19 );
1871 0 : mode("MultipartonInteractions:bProfile", 4 );
1872 0 : parm("MultipartonInteractions:expPow", 1.0 );
1873 0 : parm("MultipartonInteractions:a1", 0.15 );
1874 0 : parm("BeamRemnants:primordialKTsoft", 0.5 );
1875 0 : parm("BeamRemnants:primordialKThard", 2.0 );
1876 0 : parm("BeamRemnants:halfScaleForKT", 1.0 );
1877 0 : parm("BeamRemnants:halfMassForKT", 1.0 );
1878 0 : mode("ColourReconnection:mode", 0 );
1879 0 : parm("ColourReconnection:range", 1.5 );
1880 0 : }
1881 :
1882 : // The Monash 2013 tune by Peter Skands, the pp part (January 2014).
1883 0 : else if (ppTune == 14) {
1884 0 : word("PDF:pSet", "13" ); // NNPDF
1885 0 : parm("SigmaProcess:alphaSvalue", 0.130 ); // same as PDF
1886 0 : flag("SigmaTotal:zeroAXB", true );
1887 0 : flag("SigmaDiffractive:dampen", true );
1888 0 : parm("SigmaDiffractive:maxXB", 65.0 );
1889 0 : parm("SigmaDiffractive:maxAX", 65.0 );
1890 0 : parm("SigmaDiffractive:maxXX", 65.0 );
1891 0 : parm("Diffraction:largeMassSuppress", 4.0 );
1892 0 : flag("TimeShower:dampenBeamRecoil", true );
1893 0 : flag("TimeShower:phiPolAsym", true );
1894 0 : parm("SpaceShower:alphaSvalue", 0.1365); // same as FSR
1895 0 : mode("SpaceShower:alphaSorder", 1 );
1896 0 : flag("SpaceShower:alphaSuseCMW", false );
1897 0 : flag("SpaceShower:samePTasMPI", false );
1898 0 : parm("SpaceShower:pT0Ref", 2.0 );
1899 0 : parm("SpaceShower:ecmRef", 7000.0);
1900 0 : parm("SpaceShower:ecmPow", 0.0 );
1901 0 : parm("SpaceShower:pTmaxFudge", 1.0 );
1902 0 : parm("SpaceShower:pTdampFudge", 1.0 );
1903 0 : flag("SpaceShower:rapidityOrder", true );
1904 0 : flag("SpaceShower:phiPolAsym", true );
1905 0 : flag("SpaceShower:phiIntAsym", true );
1906 0 : parm("MultipartonInteractions:alphaSvalue", 0.130 ); // same as PDF
1907 0 : parm("MultipartonInteractions:pT0Ref", 2.28 );
1908 0 : parm("MultipartonInteractions:ecmRef", 7000. );
1909 0 : parm("MultipartonInteractions:ecmPow", 0.215 );
1910 0 : mode("MultipartonInteractions:bProfile", 3 );
1911 0 : parm("MultipartonInteractions:expPow", 1.85 );
1912 0 : parm("MultipartonInteractions:a1", 0.15 );
1913 0 : parm("BeamRemnants:primordialKTsoft", 0.9 );
1914 0 : parm("BeamRemnants:primordialKThard", 1.8 );
1915 0 : parm("BeamRemnants:halfScaleForKT", 1.5 );
1916 0 : parm("BeamRemnants:halfMassForKT", 1.0 );
1917 0 : mode("ColourReconnection:mode", 0 );
1918 0 : parm("ColourReconnection:range", 1.80 );
1919 0 : }
1920 :
1921 : // Several ATLAS and CMS tunes start out from Tune 4C.
1922 0 : else if (ppTune < 18) {
1923 0 : parm("SigmaProcess:alphaSvalue", 0.135 );
1924 0 : flag("SigmaTotal:zeroAXB", true );
1925 0 : flag("SigmaDiffractive:dampen", true );
1926 0 : parm("SigmaDiffractive:maxXB", 65.0 );
1927 0 : parm("SigmaDiffractive:maxAX", 65.0 );
1928 0 : parm("SigmaDiffractive:maxXX", 65.0 );
1929 0 : parm("Diffraction:largeMassSuppress", 2.0 );
1930 0 : flag("TimeShower:dampenBeamRecoil", true );
1931 0 : flag("TimeShower:phiPolAsym", true );
1932 0 : parm("SpaceShower:alphaSvalue", 0.137 );
1933 0 : mode("SpaceShower:alphaSorder", 1 );
1934 0 : flag("SpaceShower:alphaSuseCMW", false );
1935 0 : flag("SpaceShower:samePTasMPI", false );
1936 0 : parm("SpaceShower:pT0Ref", 2.0 );
1937 0 : parm("SpaceShower:ecmRef", 1800.0);
1938 0 : parm("SpaceShower:ecmPow", 0.0 );
1939 0 : parm("SpaceShower:pTmaxFudge", 1.0 );
1940 0 : parm("SpaceShower:pTdampFudge", 1.0 );
1941 0 : flag("SpaceShower:rapidityOrder", true );
1942 0 : flag("SpaceShower:phiPolAsym", true );
1943 0 : flag("SpaceShower:phiIntAsym", true );
1944 0 : parm("MultipartonInteractions:alphaSvalue", 0.135 );
1945 0 : parm("MultipartonInteractions:pT0Ref", 2.085 );
1946 0 : parm("MultipartonInteractions:ecmRef", 1800. );
1947 0 : parm("MultipartonInteractions:ecmPow", 0.19 );
1948 0 : mode("MultipartonInteractions:bProfile", 3 );
1949 0 : parm("MultipartonInteractions:expPow", 2.0 );
1950 0 : parm("MultipartonInteractions:a1", 0.15 );
1951 0 : parm("BeamRemnants:primordialKTsoft", 0.5 );
1952 0 : parm("BeamRemnants:primordialKThard", 2.0 );
1953 0 : parm("BeamRemnants:halfScaleForKT", 1.0 );
1954 0 : parm("BeamRemnants:halfMassForKT", 1.0 );
1955 0 : mode("ColourReconnection:mode", 0 );
1956 0 : parm("ColourReconnection:range", 1.5 );
1957 :
1958 : // Several ATLAS tunes in the A2 and AU2 series, see
1959 : // ATLAS note ATL-PHYS-PUB-2012-003 (August 2012).
1960 : // ATLAS MB tune A2-CTEQ6L1.
1961 0 : if (ppTune == 7) {
1962 0 : if (preferLHAPDF == 1)
1963 0 : word("PDF:pSet", "LHAPDF5:cteq6ll.LHpdf");
1964 0 : else if (preferLHAPDF == 2)
1965 0 : word("PDF:pSet", "LHAPDF6:cteq6l1");
1966 0 : else word("PDF:pSet", "8" );
1967 0 : flag("SpaceShower:rapidityOrder", false );
1968 0 : parm("MultipartonInteractions:pT0Ref", 2.18 );
1969 0 : parm("MultipartonInteractions:ecmPow", 0.22 );
1970 0 : mode("MultipartonInteractions:bProfile", 4 );
1971 0 : parm("MultipartonInteractions:expPow", 1.0 );
1972 0 : parm("MultipartonInteractions:a1", 0.06 );
1973 0 : parm("ColourReconnection:range", 1.55 );
1974 0 : }
1975 :
1976 : // ATLAS MB tune A2-MSTW2008LO.
1977 0 : else if (ppTune == 8) {
1978 0 : if (preferLHAPDF == 1)
1979 0 : word("PDF:pSet", "LHAPDF5:MSTW2008lo68cl.LHgrid");
1980 0 : else if (preferLHAPDF == 2)
1981 0 : word("PDF:pSet", "LHAPDF6:MSTW2008lo68cl");
1982 0 : else word("PDF:pSet", "5" );
1983 0 : flag("SpaceShower:rapidityOrder", false );
1984 0 : parm("MultipartonInteractions:pT0Ref", 1.90 );
1985 0 : parm("MultipartonInteractions:ecmPow", 0.30 );
1986 0 : mode("MultipartonInteractions:bProfile", 4 );
1987 0 : parm("MultipartonInteractions:expPow", 1.0 );
1988 0 : parm("MultipartonInteractions:a1", 0.03 );
1989 0 : parm("ColourReconnection:range", 2.28 );
1990 0 : }
1991 :
1992 : // ATLAS UE tune AU2-CTEQ6L1.
1993 0 : if (ppTune == 9) {
1994 0 : if (preferLHAPDF == 1)
1995 0 : word("PDF:pSet", "LHAPDF5:cteq6ll.LHpdf");
1996 0 : else if (preferLHAPDF == 2)
1997 0 : word("PDF:pSet", "LHAPDF6:cteq6l1");
1998 0 : else word("PDF:pSet", "8" );
1999 0 : flag("SpaceShower:rapidityOrder", false );
2000 0 : parm("MultipartonInteractions:pT0Ref", 2.13 );
2001 0 : parm("MultipartonInteractions:ecmPow", 0.21 );
2002 0 : mode("MultipartonInteractions:bProfile", 4 );
2003 0 : parm("MultipartonInteractions:expPow", 1.0 );
2004 0 : parm("MultipartonInteractions:a1", 0.00 );
2005 0 : parm("ColourReconnection:range", 2.21 );
2006 0 : }
2007 :
2008 : // ATLAS UE tune AU2-MSTW2008LO.
2009 0 : else if (ppTune == 10) {
2010 0 : if (preferLHAPDF == 1)
2011 0 : word("PDF:pSet", "LHAPDF5:MSTW2008lo68cl.LHgrid");
2012 0 : else if (preferLHAPDF == 2)
2013 0 : word("PDF:pSet", "LHAPDF6:MSTW2008lo68cl");
2014 0 : else word("PDF:pSet", "5" );
2015 0 : flag("SpaceShower:rapidityOrder", false );
2016 0 : parm("MultipartonInteractions:pT0Ref", 1.87 );
2017 0 : parm("MultipartonInteractions:ecmPow", 0.28 );
2018 0 : mode("MultipartonInteractions:bProfile", 4 );
2019 0 : parm("MultipartonInteractions:expPow", 1.0 );
2020 0 : parm("MultipartonInteractions:a1", 0.01 );
2021 0 : parm("ColourReconnection:range", 5.32 );
2022 0 : }
2023 :
2024 : // ATLAS UE tune AU2-CT10.
2025 0 : else if (ppTune == 11) {
2026 0 : if (preferLHAPDF == 2)
2027 0 : word("PDF:pSet", "LHAPDF6:CT10");
2028 : else
2029 0 : word("PDF:pSet", "LHAPDF5:CT10.LHgrid");
2030 0 : flag("SpaceShower:rapidityOrder", false );
2031 0 : parm("MultipartonInteractions:pT0Ref", 1.70 );
2032 0 : parm("MultipartonInteractions:ecmPow", 0.16 );
2033 0 : mode("MultipartonInteractions:bProfile", 4 );
2034 0 : parm("MultipartonInteractions:expPow", 1.0 );
2035 0 : parm("MultipartonInteractions:a1", 0.10 );
2036 0 : parm("ColourReconnection:range", 4.67 );
2037 0 : }
2038 :
2039 : // ATLAS UE tune AU2-MRST2007LO*.
2040 0 : else if (ppTune == 12) {
2041 0 : if (preferLHAPDF == 1)
2042 0 : word("PDF:pSet", "LHAPDF5:MRST2007lomod.LHgrid");
2043 0 : else if (preferLHAPDF == 2)
2044 0 : word("PDF:pSet", "LHAPDF6:MRST2007lomod");
2045 0 : else word("PDF:pSet", "3" );
2046 0 : flag("SpaceShower:rapidityOrder", false );
2047 0 : parm("MultipartonInteractions:pT0Ref", 2.39 );
2048 0 : parm("MultipartonInteractions:ecmPow", 0.24 );
2049 0 : mode("MultipartonInteractions:bProfile", 4 );
2050 0 : parm("MultipartonInteractions:expPow", 1.0 );
2051 0 : parm("MultipartonInteractions:a1", 0.01 );
2052 0 : parm("ColourReconnection:range", 1.76 );
2053 0 : }
2054 :
2055 : // ATLAS UE tune AU2-MRST2007LO**.
2056 0 : else if (ppTune == 13) {
2057 0 : if (preferLHAPDF == 1)
2058 0 : word("PDF:pSet", "LHAPDF5:MRSTMCal.LHgrid");
2059 0 : else if (preferLHAPDF == 2)
2060 0 : word("PDF:pSet", "LHAPDF6:MRSTMCal");
2061 0 : else word("PDF:pSet", "4" );
2062 0 : flag("SpaceShower:rapidityOrder", false );
2063 0 : parm("MultipartonInteractions:pT0Ref", 2.57 );
2064 0 : parm("MultipartonInteractions:ecmPow", 0.23 );
2065 0 : mode("MultipartonInteractions:bProfile", 4 );
2066 0 : parm("MultipartonInteractions:expPow", 1.0 );
2067 0 : parm("MultipartonInteractions:a1", 0.01 );
2068 0 : parm("ColourReconnection:range", 1.47 );
2069 0 : }
2070 :
2071 : // The CMS UE tunes CUETP8S1-CTEQ6L1 and CUETP8S1-HERAPDF1.5LO,
2072 : // see the note CMS PAS GEN-14-001 (April 2014).
2073 : // CMS UE tune CUETP8S1-CTEQ6L1.
2074 0 : else if (ppTune == 15) {
2075 0 : if (preferLHAPDF == 1)
2076 0 : word("PDF:pSet", "LHAPDF5:cteq6ll.LHpdf");
2077 0 : else if (preferLHAPDF == 2)
2078 0 : word("PDF:pSet", "LHAPDF6:cteq6l1");
2079 0 : else word("PDF:pSet", "8" );
2080 0 : parm("MultipartonInteractions:pT0Ref", 2.1006);
2081 0 : parm("MultipartonInteractions:ecmPow", 0.2106);
2082 0 : parm("MultipartonInteractions:expPow", 1.6089);
2083 0 : parm("MultipartonInteractions:a1", 0.00 );
2084 0 : parm("ColourReconnection:range", 3.3126);
2085 0 : }
2086 :
2087 : // CMS UE tune CUETP8S1-HERAPDF1.5LO.
2088 0 : else if (ppTune == 16) {
2089 0 : if (preferLHAPDF == 2)
2090 0 : word("PDF:pSet", "LHAPDF6:HERAPDF15LO_EIG");
2091 : else
2092 0 : word("PDF:pSet", "LHAPDF5:HERAPDF1.5LO_EIG.LHgrid");
2093 0 : parm("MultipartonInteractions:pT0Ref", 2.0001);
2094 0 : parm("MultipartonInteractions:ecmPow", 0.2499);
2095 0 : parm("MultipartonInteractions:expPow", 1.6905);
2096 0 : parm("MultipartonInteractions:a1", 0.00 );
2097 0 : parm("ColourReconnection:range", 6.0964);
2098 0 : }
2099 :
2100 : // ATLAS tune AZ to the Z0/gamma* pTspectrum, see the note
2101 : // CERN-PH-EP-2014-075 [arXiv:1406.3660 [hep-ex]] (June 2014).
2102 0 : else if (ppTune == 17) {
2103 0 : parm("SpaceShower:alphaSvalue", 0.1237);
2104 0 : parm("SpaceShower:pT0Ref", 0.59 );
2105 0 : parm("MultipartonInteractions:pT0Ref", 2.18 );
2106 0 : parm("BeamRemnants:primordialKThard", 2.0 );
2107 0 : }
2108 : }
2109 :
2110 : // Several ATLAS and CMS tunes start out from Monash 2013 tune.
2111 0 : else if (ppTune >= 18) {
2112 0 : word("PDF:pSet", "13" ); // NNPDF
2113 0 : parm("SigmaProcess:alphaSvalue", 0.130 ); // same as PDF
2114 0 : flag("SigmaTotal:zeroAXB", true );
2115 0 : flag("SigmaDiffractive:dampen", true );
2116 0 : parm("SigmaDiffractive:maxXB", 65.0 );
2117 0 : parm("SigmaDiffractive:maxAX", 65.0 );
2118 0 : parm("SigmaDiffractive:maxXX", 65.0 );
2119 0 : parm("Diffraction:largeMassSuppress", 4.0 );
2120 0 : flag("TimeShower:dampenBeamRecoil", true );
2121 0 : flag("TimeShower:phiPolAsym", true );
2122 0 : parm("SpaceShower:alphaSvalue", 0.1365); // same as FSR
2123 0 : mode("SpaceShower:alphaSorder", 1 );
2124 0 : flag("SpaceShower:alphaSuseCMW", false );
2125 0 : flag("SpaceShower:samePTasMPI", false );
2126 0 : parm("SpaceShower:pT0Ref", 2.0 );
2127 0 : parm("SpaceShower:ecmRef", 7000.0);
2128 0 : parm("SpaceShower:ecmPow", 0.0 );
2129 0 : parm("SpaceShower:pTmaxFudge", 1.0 );
2130 0 : parm("SpaceShower:pTdampFudge", 1.0 );
2131 0 : flag("SpaceShower:rapidityOrder", true );
2132 0 : flag("SpaceShower:phiPolAsym", true );
2133 0 : flag("SpaceShower:phiIntAsym", true );
2134 0 : parm("MultipartonInteractions:alphaSvalue", 0.130 ); // same as PDF
2135 0 : parm("MultipartonInteractions:pT0Ref", 2.28 );
2136 0 : parm("MultipartonInteractions:ecmRef", 7000. );
2137 0 : parm("MultipartonInteractions:ecmPow", 0.215 );
2138 0 : mode("MultipartonInteractions:bProfile", 3 );
2139 0 : parm("MultipartonInteractions:expPow", 1.85 );
2140 0 : parm("MultipartonInteractions:a1", 0.15 );
2141 0 : parm("BeamRemnants:primordialKTsoft", 0.9 );
2142 0 : parm("BeamRemnants:primordialKThard", 1.8 );
2143 0 : parm("BeamRemnants:halfScaleForKT", 1.5 );
2144 0 : parm("BeamRemnants:halfMassForKT", 1.0 );
2145 0 : mode("ColourReconnection:mode", 0 );
2146 0 : parm("ColourReconnection:range", 1.80 );
2147 :
2148 : // CMS tune MonashStar = CUETP8M1-NNPDF2.3LO.
2149 : // See R.D. Field, presentation at MPI@LHC 2014, Krakow, Poland.
2150 0 : if (ppTune == 18) {
2151 0 : parm("MultipartonInteractions:pT0Ref", 2.4024);
2152 0 : parm("MultipartonInteractions:ecmPow", 0.2521);
2153 0 : parm("MultipartonInteractions:expPow", 1.60 );
2154 0 : }
2155 :
2156 : // The ATLAS A14 tunes, central tune with CTEQL1.
2157 : // See ATL-PHYS-PUB-2014-021 (November 2014).
2158 : // Warning: note that TimeShower:alphaSvalue is set here, although
2159 : // normally it would be in the domain of ee tunes. This makes the
2160 : // order of Tune:ee and Tune:pp commands relevant.
2161 0 : else if (ppTune == 19) {
2162 0 : if (preferLHAPDF == 1)
2163 0 : word("PDF:pSet", "LHAPDF5:cteq6ll.LHpdf");
2164 0 : else if (preferLHAPDF == 2)
2165 0 : word("PDF:pSet", "LHAPDF6:cteq6l1");
2166 0 : else word("PDF:pSet", "8" );
2167 0 : parm("SigmaProcess:alphaSvalue", 0.144 );
2168 0 : parm("TimeShower:alphaSvalue", 0.126 );
2169 0 : parm("SpaceShower:alphaSvalue", 0.125 );
2170 0 : parm("SpaceShower:pT0Ref", 1.3 );
2171 0 : parm("SpaceShower:pTmaxFudge", 0.95 );
2172 0 : parm("SpaceShower:pTdampFudge", 1.21 );
2173 0 : parm("MultipartonInteractions:alphaSvalue",0.118);
2174 0 : parm("MultipartonInteractions:pT0Ref", 1.98 );
2175 0 : parm("BeamRemnants:primordialKThard", 1.72 );
2176 0 : parm("ColourReconnection:range", 2.08 );
2177 0 : }
2178 :
2179 : // The ATLAS A14 tunes, central tune with MSTW2008LO.
2180 0 : else if (ppTune == 20) {
2181 0 : if (preferLHAPDF == 1)
2182 0 : word("PDF:pSet", "LHAPDF5:MSTW2008lo68cl.LHgrid");
2183 0 : else if (preferLHAPDF == 2)
2184 0 : word("PDF:pSet", "LHAPDF6:MSTW2008lo68cl");
2185 0 : else word("PDF:pSet", "5" );
2186 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2187 0 : parm("TimeShower:alphaSvalue", 0.129 );
2188 0 : parm("SpaceShower:alphaSvalue", 0.129 );
2189 0 : parm("SpaceShower:pT0Ref", 1.62 );
2190 0 : parm("SpaceShower:pTmaxFudge", 0.92 );
2191 0 : parm("SpaceShower:pTdampFudge", 1.14 );
2192 0 : parm("MultipartonInteractions:alphaSvalue",0.130);
2193 0 : parm("MultipartonInteractions:pT0Ref", 2.28 );
2194 0 : parm("BeamRemnants:primordialKThard", 1.82 );
2195 0 : parm("ColourReconnection:range", 1.87 );
2196 0 : }
2197 :
2198 : // The ATLAS A14 tunes, central tune with NNPDF2.3LO.
2199 0 : else if (ppTune == 21) {
2200 0 : word("PDF:pSet", "13" );
2201 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2202 0 : parm("TimeShower:alphaSvalue", 0.127 );
2203 0 : parm("SpaceShower:alphaSvalue", 0.127 );
2204 0 : parm("SpaceShower:pT0Ref", 1.56 );
2205 0 : parm("SpaceShower:pTmaxFudge", 0.91 );
2206 0 : parm("SpaceShower:pTdampFudge", 1.05 );
2207 0 : parm("MultipartonInteractions:alphaSvalue",0.126);
2208 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2209 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2210 0 : parm("ColourReconnection:range", 1.71 );
2211 0 : }
2212 :
2213 : // The ATLAS A14 tunes, central tune with HERAPDF1.5LO.
2214 0 : else if (ppTune == 22) {
2215 0 : if (preferLHAPDF == 2)
2216 0 : word("PDF:pSet", "LHAPDF6:HERAPDF15LO_EIG");
2217 : else
2218 0 : word("PDF:pSet", "LHAPDF5:HERAPDF1.5LO_EIG.LHgrid");
2219 0 : parm("SigmaProcess:alphaSvalue", 0.141 );
2220 0 : parm("TimeShower:alphaSvalue", 0.130 );
2221 0 : parm("SpaceShower:alphaSvalue", 0.128);
2222 0 : parm("SpaceShower:pT0Ref", 1.61 );
2223 0 : parm("SpaceShower:pTmaxFudge", 0.95 );
2224 0 : parm("SpaceShower:pTdampFudge", 1.10 );
2225 0 : parm("MultipartonInteractions:alphaSvalue",0.123);
2226 0 : parm("MultipartonInteractions:pT0Ref", 2.14 );
2227 0 : parm("BeamRemnants:primordialKThard", 1.83 );
2228 0 : parm("ColourReconnection:range", 1.78 );
2229 0 : }
2230 :
2231 : // The ATLAS A14 tunes, variation 1+.
2232 0 : else if (ppTune == 23) {
2233 0 : word("PDF:pSet", "13" );
2234 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2235 0 : parm("TimeShower:alphaSvalue", 0.127 );
2236 0 : parm("SpaceShower:alphaSvalue", 0.127 );
2237 0 : parm("SpaceShower:pT0Ref", 1.56 );
2238 0 : parm("SpaceShower:pTmaxFudge", 0.91 );
2239 0 : parm("SpaceShower:pTdampFudge", 1.05 );
2240 0 : parm("MultipartonInteractions:alphaSvalue",0.131);
2241 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2242 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2243 0 : parm("ColourReconnection:range", 1.73 );
2244 0 : }
2245 :
2246 : // The ATLAS A14 tunes, variation 1-.
2247 0 : else if (ppTune == 24) {
2248 0 : word("PDF:pSet", "13" );
2249 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2250 0 : parm("TimeShower:alphaSvalue", 0.127 );
2251 0 : parm("SpaceShower:alphaSvalue", 0.127 );
2252 0 : parm("SpaceShower:pT0Ref", 1.56 );
2253 0 : parm("SpaceShower:pTmaxFudge", 0.91 );
2254 0 : parm("SpaceShower:pTdampFudge", 1.05 );
2255 0 : parm("MultipartonInteractions:alphaSvalue",0.121);
2256 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2257 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2258 0 : parm("ColourReconnection:range", 1.69 );
2259 0 : }
2260 :
2261 : // The ATLAS A14 tunes, variation 2+.
2262 0 : else if (ppTune == 25) {
2263 0 : word("PDF:pSet", "13" );
2264 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2265 0 : parm("TimeShower:alphaSvalue", 0.139 );
2266 0 : parm("SpaceShower:alphaSvalue", 0.127 );
2267 0 : parm("SpaceShower:pT0Ref", 1.60 );
2268 0 : parm("SpaceShower:pTmaxFudge", 0.91 );
2269 0 : parm("SpaceShower:pTdampFudge", 1.04 );
2270 0 : parm("MultipartonInteractions:alphaSvalue",0.126);
2271 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2272 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2273 0 : parm("ColourReconnection:range", 1.71 );
2274 0 : }
2275 :
2276 : // The ATLAS A14 tunes, variation 2-.
2277 0 : else if (ppTune == 26) {
2278 0 : word("PDF:pSet", "13" );
2279 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2280 0 : parm("TimeShower:alphaSvalue", 0.111 );
2281 0 : parm("SpaceShower:alphaSvalue", 0.127 );
2282 0 : parm("SpaceShower:pT0Ref", 1.50 );
2283 0 : parm("SpaceShower:pTmaxFudge", 0.91 );
2284 0 : parm("SpaceShower:pTdampFudge", 1.08 );
2285 0 : parm("MultipartonInteractions:alphaSvalue",0.126);
2286 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2287 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2288 0 : parm("ColourReconnection:range", 1.71 );
2289 0 : }
2290 :
2291 : // The ATLAS A14 tunes, variation 3a+.
2292 0 : else if (ppTune == 27) {
2293 0 : word("PDF:pSet", "13" );
2294 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2295 0 : parm("TimeShower:alphaSvalue", 0.136 );
2296 0 : parm("SpaceShower:alphaSvalue", 0.127 );
2297 0 : parm("SpaceShower:pT0Ref", 1.67 );
2298 0 : parm("SpaceShower:pTmaxFudge", 0.98 );
2299 0 : parm("SpaceShower:pTdampFudge", 1.36 );
2300 0 : parm("MultipartonInteractions:alphaSvalue",0.125);
2301 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2302 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2303 0 : parm("ColourReconnection:range", 1.71 );
2304 0 : }
2305 :
2306 : // The ATLAS A14 tunes, variation 3a-.
2307 0 : else if (ppTune == 28) {
2308 0 : word("PDF:pSet", "13" );
2309 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2310 0 : parm("TimeShower:alphaSvalue", 0.124 );
2311 0 : parm("SpaceShower:alphaSvalue", 0.127 );
2312 0 : parm("SpaceShower:pT0Ref", 1.51 );
2313 0 : parm("SpaceShower:pTmaxFudge", 0.88 );
2314 0 : parm("SpaceShower:pTdampFudge", 0.93 );
2315 0 : parm("MultipartonInteractions:alphaSvalue",0.127);
2316 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2317 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2318 0 : parm("ColourReconnection:range", 1.71 );
2319 0 : }
2320 :
2321 : // The ATLAS A14 tunes, variation 3b+.
2322 0 : else if (ppTune == 29) {
2323 0 : word("PDF:pSet", "13" );
2324 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2325 0 : parm("TimeShower:alphaSvalue", 0.114 );
2326 0 : parm("SpaceShower:alphaSvalue", 0.129 );
2327 0 : parm("SpaceShower:pT0Ref", 1.56 );
2328 0 : parm("SpaceShower:pTmaxFudge", 1.00 );
2329 0 : parm("SpaceShower:pTdampFudge", 1.04 );
2330 0 : parm("MultipartonInteractions:alphaSvalue",0.126);
2331 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2332 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2333 0 : parm("ColourReconnection:range", 1.71 );
2334 0 : }
2335 :
2336 : // The ATLAS A14 tunes, variation 3b-.
2337 0 : else if (ppTune == 30) {
2338 0 : word("PDF:pSet", "13" );
2339 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2340 0 : parm("TimeShower:alphaSvalue", 0.138 );
2341 0 : parm("SpaceShower:alphaSvalue", 0.126 );
2342 0 : parm("SpaceShower:pT0Ref", 1.56 );
2343 0 : parm("SpaceShower:pTmaxFudge", 0.83 );
2344 0 : parm("SpaceShower:pTdampFudge", 1.07 );
2345 0 : parm("MultipartonInteractions:alphaSvalue",0.126);
2346 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2347 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2348 0 : parm("ColourReconnection:range", 1.71 );
2349 0 : }
2350 :
2351 : // The ATLAS A14 tunes, variation 3c+.
2352 0 : else if (ppTune == 31) {
2353 0 : word("PDF:pSet", "13" );
2354 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2355 0 : parm("TimeShower:alphaSvalue", 0.127 );
2356 0 : parm("SpaceShower:alphaSvalue", 0.140 );
2357 0 : parm("SpaceShower:pT0Ref", 1.56 );
2358 0 : parm("SpaceShower:pTmaxFudge", 0.91 );
2359 0 : parm("SpaceShower:pTdampFudge", 1.05 );
2360 0 : parm("MultipartonInteractions:alphaSvalue",0.126);
2361 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2362 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2363 0 : parm("ColourReconnection:range", 1.71 );
2364 0 : }
2365 :
2366 : // The ATLAS A14 tunes, variation 3c-.
2367 0 : else if (ppTune == 32) {
2368 0 : word("PDF:pSet", "13" );
2369 0 : parm("SigmaProcess:alphaSvalue", 0.140 );
2370 0 : parm("TimeShower:alphaSvalue", 0.127 );
2371 0 : parm("SpaceShower:alphaSvalue", 0.115 );
2372 0 : parm("SpaceShower:pT0Ref", 1.56 );
2373 0 : parm("SpaceShower:pTmaxFudge", 0.91 );
2374 0 : parm("SpaceShower:pTdampFudge", 1.05 );
2375 0 : parm("MultipartonInteractions:alphaSvalue",0.126);
2376 0 : parm("MultipartonInteractions:pT0Ref", 2.09 );
2377 0 : parm("BeamRemnants:primordialKThard", 1.88 );
2378 0 : parm("ColourReconnection:range", 1.71 );
2379 0 : }
2380 :
2381 : }
2382 :
2383 0 : }
2384 :
2385 : //--------------------------------------------------------------------------
2386 :
2387 : // Convert string to lowercase for case-insensitive comparisons.
2388 : // Also remove initial and trailing blanks, if any.
2389 :
2390 : string Settings::toLower(const string& name) {
2391 :
2392 : // Copy string without initial and trailing blanks.
2393 0 : if (name.find_first_not_of(" \n\t\v\b\r\f\a") == string::npos) return "";
2394 0 : int firstChar = name.find_first_not_of(" \n\t\v\b\r\f\a");
2395 0 : int lastChar = name.find_last_not_of(" \n\t\v\b\r\f\a");
2396 0 : string temp = name.substr( firstChar, lastChar + 1 - firstChar);
2397 :
2398 : // Convert to lowercase letter by letter.
2399 0 : for (int i = 0; i < int(temp.length()); ++i) temp[i] = tolower(temp[i]);
2400 0 : return temp;
2401 :
2402 0 : }
2403 :
2404 : //--------------------------------------------------------------------------
2405 :
2406 : // Allow several alternative inputs for true/false.
2407 :
2408 : bool Settings::boolString(string tag) {
2409 :
2410 0 : string tagLow = toLower(tag);
2411 0 : return ( tagLow == "true" || tagLow == "1" || tagLow == "on"
2412 0 : || tagLow == "yes" || tagLow == "ok" );
2413 :
2414 0 : }
2415 :
2416 : //--------------------------------------------------------------------------
2417 :
2418 : // Extract XML value string following XML attribute.
2419 :
2420 : string Settings::attributeValue(string line, string attribute) {
2421 :
2422 0 : if (line.find(attribute) == string::npos) return "";
2423 0 : int iBegAttri = line.find(attribute);
2424 0 : int iBegQuote = line.find("\"", iBegAttri + 1);
2425 0 : int iEndQuote = line.find("\"", iBegQuote + 1);
2426 0 : return line.substr(iBegQuote + 1, iEndQuote - iBegQuote - 1);
2427 :
2428 0 : }
2429 :
2430 : //--------------------------------------------------------------------------
2431 :
2432 : // Extract XML bool value following XML attribute.
2433 :
2434 : bool Settings::boolAttributeValue(string line, string attribute) {
2435 :
2436 0 : string valString = attributeValue(line, attribute);
2437 0 : if (valString == "") return false;
2438 0 : return boolString(valString);
2439 :
2440 0 : }
2441 :
2442 : //--------------------------------------------------------------------------
2443 :
2444 : // Extract XML int value following XML attribute.
2445 :
2446 : int Settings::intAttributeValue(string line, string attribute) {
2447 0 : string valString = attributeValue(line, attribute);
2448 0 : if (valString == "") return 0;
2449 0 : istringstream valStream(valString);
2450 0 : int intVal;
2451 0 : valStream >> intVal;
2452 0 : return intVal;
2453 :
2454 0 : }
2455 :
2456 : //--------------------------------------------------------------------------
2457 :
2458 : // Extract XML double value following XML attribute.
2459 :
2460 : double Settings::doubleAttributeValue(string line, string attribute) {
2461 0 : string valString = attributeValue(line, attribute);
2462 0 : if (valString == "") return 0.;
2463 0 : istringstream valStream(valString);
2464 0 : double doubleVal;
2465 0 : valStream >> doubleVal;
2466 0 : return doubleVal;
2467 :
2468 0 : }
2469 :
2470 : //--------------------------------------------------------------------------
2471 :
2472 : // Extract XML bool vector value following XML attribute.
2473 :
2474 : vector<bool> Settings::boolVectorAttributeValue(string line,
2475 : string attribute) {
2476 0 : string valString = attributeValue(line, attribute);
2477 0 : if (valString == "") return vector<bool>(1, false);
2478 0 : vector<bool> vectorVal;
2479 : size_t stringPos(0);
2480 0 : while (stringPos != string::npos) {
2481 0 : stringPos = valString.find(",");
2482 0 : istringstream valStream(valString.substr(0, stringPos));
2483 0 : valString = valString.substr(stringPos + 1);
2484 0 : vectorVal.push_back(boolString(valStream.str()));
2485 0 : }
2486 0 : return vectorVal;
2487 :
2488 0 : }
2489 :
2490 : //--------------------------------------------------------------------------
2491 :
2492 : // Extract XML int vector value following XML attribute.
2493 :
2494 : vector<int> Settings::intVectorAttributeValue(string line,
2495 : string attribute) {
2496 0 : string valString = attributeValue(line, attribute);
2497 0 : if (valString == "") return vector<int>(1, 0);
2498 0 : int intVal;
2499 0 : vector<int> vectorVal;
2500 : size_t stringPos(0);
2501 0 : while (stringPos != string::npos) {
2502 0 : stringPos = valString.find(",");
2503 0 : istringstream valStream(valString.substr(0, stringPos));
2504 0 : valString = valString.substr(stringPos + 1);
2505 0 : valStream >> intVal;
2506 0 : vectorVal.push_back(intVal);
2507 0 : }
2508 0 : return vectorVal;
2509 :
2510 0 : }
2511 :
2512 : //--------------------------------------------------------------------------
2513 :
2514 : // Extract XML double vector value following XML attribute.
2515 :
2516 : vector<double> Settings::doubleVectorAttributeValue(string line,
2517 : string attribute) {
2518 0 : string valString = attributeValue(line, attribute);
2519 0 : if (valString == "") return vector<double>(1, 0.);
2520 0 : double doubleVal;
2521 0 : vector<double> vectorVal;
2522 : size_t stringPos(0);
2523 0 : while (stringPos != string::npos) {
2524 0 : stringPos = valString.find(",");
2525 0 : istringstream valStream(valString.substr(0, stringPos));
2526 0 : valString = valString.substr(stringPos + 1);
2527 0 : valStream >> doubleVal;
2528 0 : vectorVal.push_back(doubleVal);
2529 0 : }
2530 0 : return vectorVal;
2531 :
2532 0 : }
2533 :
2534 : //==========================================================================
2535 :
2536 : } // end namespace Pythia8
|