LCOV - code coverage report
Current view: top level - PYTHIA8/pythia8210dev/src - Settings.cc (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 1826 0.0 %
Date: 2016-06-14 17:26:59 Functions: 0 61 0.0 %

          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

Generated by: LCOV version 1.11