HighLAND
Parameters.cxx
1 #include "Parameters.hxx"
2 #include <cstdlib>
3 
4 using namespace std;
5 
6 Parameters* Parameters::fParameters = NULL;
7 
8 Parameters& ND::params() {
9  return Parameters::Get();
10 }
11 
12 Parameters::Parameters() {
13  // Build the set of units.
14  fUnitsParser = new UnitsParser();
15 
16  // We do not open any parameter files by default in the constructor.
17  // Instead, parameter files are open automatically when an entry
18  // in the file is requested by the user.
19 
20  // The point in which the overwride parameters file is read is not yet passed
21  fReadParamOverrideFilePointPassed=false;
22 }
23 
24 Parameters::~Parameters() {
25 }
26 
27 /// Read in each parameter file.
28 void Parameters::ReadInputFile(TString fileName, TString dirName, UInt_t tryFileMode, bool fixParameters) {
29  TString fullFileName;
30 
31  // Make full file name.
32  if (!dirName.CompareTo(""))
33  fullFileName = fileName.Data();
34  else
35  fullFileName = dirName.Data() + TString("/") + fileName.Data();
36 
37  ifstream inputFile(fullFileName.Data(), ios::in);
38 
39  // If input file doesn't exist.
40  if (!inputFile) {
41  // Just return if 'tryFile' is specified.
42  if (tryFileMode==0) {
43  std::cout << "\n***** Parameters::ReadInputFile *****\n" << "Cannot open input file '" << fullFileName.Data() << "'." << std::endl;
44  return;
45  }
46  if (tryFileMode==1) {
47  std::cout << " --> " << "This package has no parameters file !!!" << std::endl;
48  } else { // Otherwise, throw exception.
49  std::cerr << "\n***** Parameters::ReadInputFile *****\n" << "Cannot open input file '" << fullFileName.Data() << "'." << std::endl;
51  }
52  }
53  else{
54  if (tryFileMode==1) {
55  std::cout << std::endl;
56  }
57  }
58 
59  int inputState = 0;
60  string inputString;
61  string parameterName;
62  string parameterValueUnit;
63  string parameterValue;
64 
65  while (inputFile >> inputString) {
66  if (inputState == 0) {
67  if (inputString == "<")
68  inputState = 1;
69  } else if (inputState == 1) {
70  parameterName = inputString;
71  inputState = 2;
72  } else if (inputState == 2) {
73  if (inputString == "=")
74  inputState = 3;
75  else {
76  std::cerr << "\n***** Parameters::ReadInputFile *****\n"
77  "Input file '" << fileName << "'. Last parameter '" << parameterName << "'.\n" << "Cannot find symbol '='.\n"
78  << "Badly formatted parameters file." << std::endl;
80  }
81  } else if (inputState == 3) {
82  // parameterValue = atof(inputString.c_str());
83  parameterValue = inputString.c_str();
84  parameterValueUnit = inputString;
85  inputState = 4;
86  } else if (inputState == 4) {
87  if (inputString == ">") {
88  // Finished reading. Save parameter; but only if the parameter
89  // isn't already 'fixed'
90  if (fixedParameters.find(parameterName) == fixedParameters.end()) {
91  mapOfParameters[parameterName] = parameterValue;
92  // If fixParameters bool is set, fix this parameter now.
93  if (fixParameters)
94  fixedParameters.insert(parameterName);
95  }
96  inputState = 0;
97  } else if (inputString == "<") {
98  std::cerr << "\n***** Parameters::ReadInputFile *****\n" << "Input file '" << fileName << "'. Last parameter '" << parameterName
99  << "'.\n" << "Unexpected symbol '<'.\n" << "Badly formatted parameters file." << std::endl;
101  } else {
102  // The parameter must have a unit. Resave the value with the correct unit.
103  parameterValueUnit.append(" ");
104  parameterValueUnit.append(inputString);
105 
106  // Use ND::TUnitsTableParser class to convert string of value+unit to
107  // a double with value+unit.
108  parameterValue = fUnitsParser->Convert2DoubleWithUnit(parameterValueUnit);
109  }
110  }
111  }
112 
113  if (inputState != 0) {
114  std::cerr << "\n***** Parameters::ReadInputFile *****\n" << "Input file '" << fileName << "'. Last parameter '" << parameterName
115  << "'.\n" << "Cannot find symbol '>' at the end of file.\n" << "Badly formatted parameters file." << std::endl;
117  }
118 
119  inputFile.close();
120 }
121 
122 void Parameters::PrintListOfParameters() {
123 
124  std::cout << "***** Parameters::PrintListOfParameters *****" << std::endl;
125  std::cout << "List of parameters:" << std::endl;
126 
127  for (mapIterator i = mapOfParameters.begin(); i != mapOfParameters.end(); i++)
128  std::cout << " " << (*i).first << " = " << (*i).second << std::endl;
129 
130  std::cout << std::endl;
131 }
132 
133 void Parameters::LoadParametersFiles(const std::vector<std::string>& packageNames, bool fixed) {
134 
135  // The one given as argument reffers to the message printed when the parameters file is not found
136 
137  std::cout << "Load parameters file for a list of packages package: fixed = " << fixed << std::endl;
138  for (std::vector<std::string>::const_iterator it=packageNames.begin();it!=packageNames.end();it++){
139  LoadParametersFile(*it, 1, fixed);
140  }
141 }
142 
143 int Parameters::LoadParametersFile(TString packageName, UInt_t tryFileMode, bool fixed) {
144 
145  std::cout << "Trying to load parameters file for package: " << packageName;
146  if (tryFileMode!=1){
147  std::cout << std::endl;
148  }
149 
150  // and the file name for parameters file
151  TString fileName = packageName + ".parameters.dat";
152  // and the directory of parameters file.
153  packageName.ToUpper();
154 
155  TString packageROOT = packageName + "ROOT";
156  TString dirName = getenv(packageROOT.Data()) + TString("/parameters");
157 
158  // Now try reading in this file. Last input variable is set to true,
159  // indicating that we don't want to throw exception if a file is not found.
160  ReadInputFile(fileName, dirName, tryFileMode, fixed);
161  return 1;
162 }
163 
164 int Parameters::TryLoadingParametersFile(std::string parameterName) {
165 
166  std::cout << "Trying to load parameters file for parameter: " << parameterName << std::endl;
167 
168  // Figure out the name of the package
169  int pos = parameterName.find(".");
170  TString packageName(parameterName.c_str(), pos);
171 
172  // and the file name for parameters file
173  TString fileName = packageName + ".parameters.dat";
174 
175  // and the directory of parameters file.
176  packageName.ToUpper();
177  TString packageROOT = packageName + "ROOT";
178  TString dirName = getenv(packageROOT.Data()) + TString("/parameters/");
179  // Now try reading in this file. Last input variable is set to 0,
180  // indicating that we don't want to throw exception if a file is not found.
181  ReadInputFile(fileName, dirName, 0);
182 
183  // Now try to find this parameter again
184  mapIterator i = mapOfParameters.find(parameterName);
185  if (i != mapOfParameters.end())
186  return 1;
187  else {
188  return 0;
189  }
190 }
191 
192 void Parameters::ReadParamOverrideFile(TString filename) {
193 
194  std::cout << "Using Parameters override file = " << filename << std::endl;
195 
196  // Setting final input variable to true forces the parameters
197  // that are loaded to be 'fixed'; ie immutable.
198  // The 2 means that an exception is thrown if the file is not found
199  ReadInputFile(filename, "", 2, true);
200 }
201 
202 bool Parameters::HasParameter(string parameterName) {
203 
204  mapIterator i = mapOfParameters.find(parameterName);
205 
206  if (i != mapOfParameters.end())
207  return 1;
208  else {
209  // Okay, we didn't find this parameter on the first try.
210  // Let's see if we can try loading the parameters file.
211  // The function will return whether this parameter
212  // was found afterwards.
213  return TryLoadingParametersFile(parameterName);
214  }
215 }
216 
217 int Parameters::GetParameterI(string parameterName) {
218  if (HasParameter(parameterName)) {
219  CheckReadParamOverrideFilePointPassed(parameterName);
220  return atoi(mapOfParameters[parameterName].c_str());
221  } else {
222  std::cerr << "\n***** Parameters::GetParameterAsInteger *****\n" << "Cannot find parameter '" << parameterName << "'." << std::endl;
223  throw NoSuchParameterException();
224  }
225 
226  return -1;
227 }
228 
229 double Parameters::GetParameterD(string parameterName) {
230  if (HasParameter(parameterName)) {
231  CheckReadParamOverrideFilePointPassed(parameterName);
232  return atof(mapOfParameters[parameterName].c_str());
233  } else {
234  std::cerr << "\n***** Parameters::GetParameterAsDouble *****\n" << "Cannot find parameter '" << parameterName << "'." << std::endl;
235  throw NoSuchParameterException();
236  }
237 
238  return -1;
239 
240 }
241 
242 std::string Parameters::GetParameterS(string parameterName) {
243  if (HasParameter(parameterName)) {
244  CheckReadParamOverrideFilePointPassed(parameterName);
245  return mapOfParameters[parameterName];
246  } else {
247  std::cerr << "\n***** Parameters::GetParameterAsString *****\n" << "Cannot find parameter '" << parameterName << "'." << std::endl;
248  throw NoSuchParameterException();
249  }
250 
251  return std::string();
252 }
253 
255  mapOfParameters.clear();
256 }
257 
258 
260 
261  if (!fReadParamOverrideFilePointPassed){
262  std::cerr << "ERROR: Parameter '" << parameterName << "'" << std::endl
263  << "should no be accessed in analysis algorithm constructors or globally" << std::endl
264  << "since it will not be overwritten when an override parameter file is used (-p option)" << std::endl
265  << "Please move the GetParameter calls to the Initialize method of the analysis algorithm." << std::endl;
266  exit(1);
267  }
268 
269 }
int GetParameterI(std::string)
Get parameter. Value is returned as integer.
Definition: Parameters.cxx:217
void LoadParametersFiles(const std::vector< std::string > &packageNames, bool fixed=false)
Load the parameters for a list of packages.
Definition: Parameters.cxx:133
std::string GetParameterS(std::string)
Get parameter. Value is returned as string.
Definition: Parameters.cxx:242
This exception class indicates an error when reading a parameters file.
Definition: Parameters.hxx:14
void ReadParamOverrideFile(TString filename)
Definition: Parameters.cxx:192
bool HasParameter(std::string)
Check if Parameter is stored in database.
Definition: Parameters.cxx:202
double GetParameterD(std::string)
Get parameter. Value is returned as double.
Definition: Parameters.cxx:229
static Parameters & Get(void)
Definition: Parameters.hxx:69
int LoadParametersFile(TString packageName, UInt_t tryFileMode=0, bool fixParameters=false)
Load the parameters for a given package - needed for multi-threading.
Definition: Parameters.cxx:143
void ClearMapOfParameters()
Clear all the parameters that have been read.
Definition: Parameters.cxx:254
void CheckReadParamOverrideFilePointPassed(std::string parameterName)
Definition: Parameters.cxx:259