51 bool ConfigFileParser::m_verboseParsing =
false;
55 : m_configurationInfo(
NULL ), m_fitName(
""), m_configFile(
""){
61 : m_configurationInfo(
NULL ), m_fitName(
""){
70 : m_configurationInfo(
NULL ), m_fitName(
""){
79 if (m_configurationInfo)
delete m_configurationInfo;
80 m_configFile = configFile;
83 m_configFileLines = expandConfigFileLines(readConfigFileLines(configFile));
84 setupConfigurationInfo();
91 if (m_configurationInfo)
delete m_configurationInfo;
92 m_configFile =
"stream";
95 m_configFileLines = expandConfigFileLines(readConfigFileLines(input));
96 setupConfigurationInfo();
101 vector<ConfigFileLine>
102 ConfigFileParser::readConfigFileLines(
const string& configfile)
const{
104 if (m_verboseParsing)
105 cout <<
"ConfigFileParser INFO: Reading from the file... " << configfile << endl;
107 vector<ConfigFileLine> configFileLines;
110 ifstream in(configfile.c_str());
112 cout <<
"ConfigFileParser ERROR: Could not open file: " << configfile << endl;
118 configFileLines.push_back(
ConfigFileLine(configfile,++lineNumber, line));
119 if (m_verboseParsing)
120 configFileLines[configFileLines.size()-1].printLine();
124 if (m_verboseParsing)
125 cout <<
"ConfigFileParser INFO: Finished reading from the file... " << configfile << endl;
127 return configFileLines;
132 vector<ConfigFileLine>
133 ConfigFileParser::readConfigFileLines(istream& input)
const{
135 if (m_verboseParsing)
136 cout <<
"ConfigFileParser INFO: Reading from a stream... " << endl;
138 vector<ConfigFileLine> configFileLines;
141 while (!input.eof()){
144 configFileLines.push_back(
ConfigFileLine(
"stream",++lineNumber, line));
145 if (m_verboseParsing)
146 configFileLines[configFileLines.size()-1].printLine();
149 if (m_verboseParsing)
150 cout <<
"ConfigFileParser INFO: Finished reading from a stream " << endl;
152 return configFileLines;
158 vector<ConfigFileLine>
159 ConfigFileParser::expandConfigFileLines(vector<ConfigFileLine> configFileLines)
const{
161 if (m_verboseParsing)
162 cout <<
"ConfigFileParser INFO: Starting to expand config file lines..." << endl;
167 for (vector<ConfigFileLine>::iterator lineItr = configFileLines.begin();
168 lineItr != configFileLines.end(); ++lineItr){
170 if (lineItr->keyword() ==
"include"){
172 if (lineItr->arguments().size() != 1){
173 cout <<
"ConfigFileParser ERROR: Wrong number of arguments for the include statement:" << endl;
174 lineItr->printLine();
180 string inputFile = lineItr->arguments()[0];
181 vector<ConfigFileLine> inputFileLines = readConfigFileLines(inputFile);
185 vector<ConfigFileLine>::iterator inputBegin = inputFileLines.begin();
186 vector<ConfigFileLine>::iterator inputEnd = inputFileLines.end();
187 *lineItr =
ConfigFileLine(
"",0,
"########## INCLUDE FILE " + inputFile +
" ########");
188 configFileLines.insert(++lineItr, inputBegin, inputEnd);
189 lineItr = configFileLines.begin();
198 for (vector<ConfigFileLine>::iterator lineItr = configFileLines.begin();
199 lineItr != configFileLines.end(); ++lineItr){
201 if (lineItr->keyword() ==
"define"){
203 if (lineItr->arguments().size() == 0){
204 cout <<
"ConfigFileParser ERROR: Wrong number of arguments for the define statement:" << endl;
205 lineItr->printLine();
209 vector<string> arguments = lineItr->arguments();
210 string key = arguments[0];
211 vector<string> value (arguments.begin()+1,arguments.end());
213 for (
unsigned int j = 0; j < configFileLines.size(); j++){
214 configFileLines[j].flushDefinition(key,value);
221 if (m_verboseParsing)
222 cout <<
"ConfigFileParser INFO: Finished expanding config file lines..." << endl;
224 if (m_verboseParsing){
225 for (
unsigned int i = 0; i < configFileLines.size(); i++){
226 configFileLines[i].printLine();
230 return configFileLines;
239 ConfigFileParser::setupConfigurationInfo(){
244 if (m_verboseParsing)
245 cout <<
"ConfigFileParser INFO: Starting ZEROTH PASS (finding the fit name)" << endl;
247 for (vector<ConfigFileLine>::iterator lineItr = m_configFileLines.begin();
248 lineItr != m_configFileLines.end(); ++lineItr){
250 if ((*lineItr).keyword() ==
"fit") doFit(*lineItr);
252 if ((*lineItr).keyword() ==
"keyword") m_userKeywords.insert((*lineItr).arguments()[0]);
256 if (m_verboseParsing)
257 cout <<
"ConfigFileParser INFO: Finished ZEROTH PASS" << endl;
264 cout <<
"ConfigFileParser WARNING: use the keyword \"fit\" to define a fit name" << endl;
272 if (m_verboseParsing)
273 cout <<
"ConfigFileParser INFO: Starting FIRST PASS (creating reactions and parameters)" << endl;
275 for (vector<ConfigFileLine>::iterator lineItr = m_configFileLines.begin();
276 lineItr != m_configFileLines.end(); ++lineItr){
278 if ((*lineItr).keyword() ==
"reaction") doReaction(*lineItr);
279 if ((*lineItr).keyword() ==
"parameter") doParameter(*lineItr);
281 if (m_userKeywords.count((*lineItr).keyword())) doKeyword(*lineItr);
285 if (m_verboseParsing)
286 cout <<
"ConfigFileParser INFO: Finished FIRST PASS" << endl;
292 if (m_verboseParsing)
293 cout <<
"ConfigFileParser INFO: Starting SECOND PASS (creating sums and filling reactions)" << endl;
295 for (vector<ConfigFileLine>::iterator lineItr = m_configFileLines.begin();
296 lineItr != m_configFileLines.end(); ++lineItr){
298 if (((*lineItr).keyword() ==
"datafile") ||
299 ((*lineItr).keyword() ==
"genmcfile") ||
300 ((*lineItr).keyword() ==
"accmcfile") ||
301 ((*lineItr).keyword() ==
"data") ||
302 ((*lineItr).keyword() ==
"bkgnd") ||
303 ((*lineItr).keyword() ==
"genmc") ||
304 ((*lineItr).keyword() ==
"accmc")) doData(*lineItr);
306 if ((*lineItr).keyword() ==
"normintfile") doNormInt(*lineItr);
308 if ((*lineItr).keyword() ==
"sum") doSum(*lineItr);
312 if (m_verboseParsing)
313 cout <<
"ConfigFileParser INFO: Finished SECOND PASS" << endl;
319 if (m_verboseParsing)
320 cout <<
"ConfigFileParser INFO: Starting THIRD PASS (creating amplitudes)" << endl;
322 for (vector<ConfigFileLine>::iterator lineItr = m_configFileLines.begin();
323 lineItr != m_configFileLines.end(); ++lineItr){
325 if ((*lineItr).keyword() ==
"amplitude") doAmplitude(*lineItr);
329 if (m_verboseParsing)
330 cout <<
"ConfigFileParser INFO: Finished THIRD PASS" << endl;
336 if (m_verboseParsing)
337 cout <<
"ConfigFileParser INFO: Starting FOURTH PASS (filling amplitudes)" << endl;
339 for (vector<ConfigFileLine>::iterator lineItr = m_configFileLines.begin();
340 lineItr != m_configFileLines.end(); ++lineItr){
342 if ((*lineItr).keyword() ==
"constrain") doConstrain(*lineItr);
344 if ((*lineItr).keyword() ==
"permute") doPermute(*lineItr);
346 if ((*lineItr).keyword() ==
"initialize") doInitialize(*lineItr);
348 if ((*lineItr).keyword() ==
"scale") doScale(*lineItr);
352 if (m_verboseParsing)
353 cout <<
"ConfigFileParser INFO: Finished FOURTH PASS" << endl;
358 if (m_verboseParsing)
359 cout <<
"ConfigFileParser INFO: Begin Syntax Checking " << endl;
363 if (m_verboseParsing)
364 cout <<
"ConfigFileParser INFO: Finished Syntax Checking " << endl;
377 ConfigFileParser::checkSyntax()
const{
379 map<string, pair<int,int> > keywordParameters;
380 keywordParameters[
"define"] = pair<int,int>(1,100);
381 keywordParameters[
"keyword"] = pair<int,int>(3,3);
382 keywordParameters[
"fit"] = pair<int,int>(1,1);
383 keywordParameters[
"reaction"] = pair<int,int>(3,100);
384 keywordParameters[
"data"] = pair<int,int>(2,100);
385 keywordParameters[
"bkgnd"] = pair<int,int>(2,100);
386 keywordParameters[
"genmc"] = pair<int,int>(2,100);
387 keywordParameters[
"accmc"] = pair<int,int>(2,100);
388 keywordParameters[
"normintfile"] = pair<int,int>(2,3);
389 keywordParameters[
"sum"] = pair<int,int>(2,100);
390 keywordParameters[
"amplitude"] = pair<int,int>(4,100);
391 keywordParameters[
"initialize"] = pair<int,int>(6,8);
392 keywordParameters[
"constrain"] = pair<int,int>(6,100);
393 keywordParameters[
"permute"] = pair<int,int>(5,100);
394 keywordParameters[
"parameter"] = pair<int,int>(2,5);
395 keywordParameters[
"scale"] = pair<int,int>(4,4);
397 keywordParameters[
"datafile"] = pair<int,int>(2,100);
398 keywordParameters[
"genmcfile"] = pair<int,int>(2,100);
399 keywordParameters[
"accmcfile"] = pair<int,int>(2,100);
401 for (vector<ConfigFileLine>::const_iterator lineItr = m_configFileLines.begin();
402 lineItr != m_configFileLines.end(); ++lineItr){
403 if (!lineItr->comment()){
404 map<string, pair<int,int> >::const_iterator mapItr = keywordParameters.find(lineItr->keyword());
405 if (mapItr == keywordParameters.end()){
406 cout <<
"ConfigFileParser ERROR: Undefined keyword: " << lineItr->keyword() << endl;
407 lineItr->printLine();
410 else if (((
int)lineItr->arguments().size() > mapItr->second.second) ||
411 ((
int)lineItr->arguments().size() < mapItr->second.first)){
412 cout <<
"ConfigFileParser ERROR: Keyword " << lineItr->keyword() <<
413 " has the wrong number of arguments: " << endl;
414 lineItr->printLine();
417 else if (lineItr->keyword() ==
"keyword"){
418 keywordParameters[lineItr->arguments()[0]] =
419 pair<int,int>(atoi(lineItr->arguments()[1].c_str()),atoi(lineItr->arguments()[2].c_str()));
432 vector<string> arguments = line.
arguments();
433 m_fitName = arguments[0];
440 vector<string> arguments = line.
arguments();
441 string reaction = arguments[0];
442 vector<string> particles (arguments.begin()+1, arguments.end());
456 vector<string> arguments = line.
arguments();
457 string reaction = arguments[0];
458 string classname = arguments[1];
459 vector<string> dataargs (arguments.begin()+2, arguments.end());
462 cout <<
"ConfigFileParser ERROR: Can't associate data with a reaction: " << endl;
466 if (line.
keyword() ==
"datafile"){
467 cout <<
"ConfigFileParser ERROR: datafile is deprecated, use data" << endl;
471 if (line.
keyword() ==
"genmcfile"){
472 cout <<
"ConfigFileParser ERROR: genmcfile is deprecated, use genmc" << endl;
476 if (line.
keyword() ==
"accmcfile"){
477 cout <<
"ConfigFileParser ERROR: accmcfile is deprecated, use accmc" << endl;
481 if (line.
keyword() ==
"data") rct->setData (classname, dataargs);
482 if (line.
keyword() ==
"bkgnd") rct->setBkgnd(classname, dataargs);
483 if (line.
keyword() ==
"genmc") rct->setGenMC(classname, dataargs);
484 if (line.
keyword() ==
"accmc") rct->setAccMC(classname, dataargs);
490 vector<string> arguments = line.
arguments();
491 string reaction = arguments[0];
492 string file = arguments[1];
494 if (arguments.size() > 2 && arguments[2] ==
"input") input =
true;
497 cout <<
"ConfigFileParser ERROR: Can't associate normintfile with a reaction: " << endl;
501 if (line.
keyword() ==
"normintfile"){
510 vector<string> arguments = line.
arguments();
511 string reaction = arguments[0];
514 cout <<
"ConfigFileParser ERROR: Can't associate sum with a reaction: " << endl;
518 for (
unsigned int i = 1; i < arguments.size(); i++){
519 string sum = arguments[i];
527 vector<string> arguments = line.
arguments();
528 string parname = arguments[0];
529 double value = atof((arguments[1]).c_str());
531 string type(
"floating");
534 if (arguments.size() > 2) type = arguments[2];
535 if (arguments.size() > 3) a = atof((arguments[3]).c_str());
536 if (arguments.size() > 4) b = atof((arguments[4]).c_str());
537 if (type ==
"floating"){
539 else if (type ==
"fixed"){
542 else if (type ==
"bounded"){
547 else if (type ==
"gaussian"){
553 cout <<
"ConfigFileParser ERROR: parameter type must be floating, fixed, bounded, or gaussian " << endl;
562 vector<string> arguments = line.
arguments();
563 string reaction = arguments[0];
564 string sumname = arguments[1];
565 string ampname = arguments[2];
566 vector<string> ampargs (arguments.begin()+3, arguments.end());
568 if (!ampinfo) ampinfo = m_configurationInfo->
createAmplitude(reaction,sumname,ampname);
570 for (
unsigned int i = 1; i < ampargs.size(); i++){
571 unsigned int j = ampargs[i].size()-1;
572 if ((ampargs[i][0] ==
'[') && (ampargs[i][j] ==
']')){
574 for (
unsigned int k = 1; k < j; k++){
575 parname += ampargs[i][k];
579 cout <<
"ConfigFileParser ERROR: can't find parameter " << parname << endl;
583 ampinfo->addParameter(parinfo);
591 vector<string> arguments = line.
arguments();
592 if (arguments.size()%3 != 0){
593 cout <<
"ConfigFileParser ERROR: wrong number of arguments for constrain keyword " << endl;
597 string reaction1 = arguments[0];
598 string sumname1 = arguments[1];
599 string ampname1 = arguments[2];
600 for (
unsigned int i = 1; i < arguments.size()/3; i++){
601 string reaction2 = arguments[i*3];
602 string sumname2 = arguments[i*3+1];
603 string ampname2 = arguments[i*3+2];
606 if ((!amplitude1) || (!amplitude2)){
607 cout <<
"ConfigFileParser ERROR: trying to constrain nonexistent amplitude " << endl;
619 vector<string> arguments = line.
arguments();
620 string reaction = arguments[0];
621 string sumname = arguments[1];
622 string ampname = arguments[2];
623 vector<string> permutation(arguments.begin()+3, arguments.end());
626 cout <<
"ConfigFileParser ERROR: trying to permute nonexistent amplitude " << endl;
631 if (permutation.size() != particleList.size()){
632 cout <<
"ConfigFileParser ERROR: wrong number of arguments for permute keyword " << endl;
636 vector<int> intpermutation;
637 for (
unsigned int i = 0; i < permutation.size(); i++){
638 for (
unsigned int j = 0; j < permutation[i].size(); j++){
639 if (!isdigit(permutation[i][j])){
640 cout <<
"ConfigFileParser ERROR: particle index is not an unsigned integer " << endl;
645 int ipart = atoi(permutation[i].c_str());
646 if (ipart < 0 || ipart >= (
int)particleList.size()){
647 cout <<
"ConfigFileParser ERROR: particle index is out of bounds " << endl;
651 intpermutation.push_back(ipart);
653 for (
unsigned int i = 0; i < intpermutation.size(); i++){
654 for (
unsigned int j = i+1; j < intpermutation.size(); j++){
655 if (intpermutation[i] == intpermutation[j]){
656 cout <<
"ConfigFileParser ERROR: particle index repeated " << endl;
662 amplitude->addPermutation(intpermutation);
668 vector<string> arguments = line.
arguments();
669 string reaction = arguments[0];
670 string sumname = arguments[1];
671 string ampname = arguments[2];
672 string type = arguments[3];
673 double value1 = atof(arguments[4].c_str());
674 double value2 = atof(arguments[5].c_str());
675 string fixtype1(
"floating");
677 if (arguments.size() >= 7) fixtype1 = arguments[6];
678 if (arguments.size() == 8) fixtype2 = arguments[7];
681 cout <<
"ConfigFileParser ERROR: trying to initialize nonexistent amplitude " << endl;
685 if (type ==
"cartesian"){
686 amplitude->
setValue(complex<double>(value1,value2));
688 else if (type ==
"polar"){
689 amplitude->
setValue(polar(value1,value2));
691 else if (type ==
"events"){
692 cout <<
"ConfigFileParser ERROR: initializing with events is not yet re-implemented " << endl;
721 cout <<
"ConfigFileParser ERROR: initialize must use cartesian, polar, or events " << endl;
725 if (fixtype1 ==
"floating") {
727 else if (fixtype1 ==
"real"){
730 else if (fixtype1 ==
"fixed"){
734 cout <<
"ConfigFileParser ERROR: initialize must use floating, fixed, or real " << endl;
738 if (fixtype2 ==
"") {
740 else if (fixtype2 ==
"real"){
743 else if (fixtype2 ==
"fixed"){
746 else if (fixtype2 ==
"floating"){
751 cout <<
"ConfigFileParser ERROR: initialize must use floating, fixed, or real " << endl;
760 vector<string> arguments = line.
arguments();
761 string reaction = arguments[0];
762 string sumname = arguments[1];
763 string ampname = arguments[2];
764 string value = arguments[3];
767 cout <<
"ConfigFileParser ERROR: trying to scale nonexistent amplitude " << endl;
771 if ((value.size() > 0) && (value[0] ==
'[') and (value[value.size()-1] ==
']')){
773 for (
unsigned int k = 1; k < value.size()-1; k++){
778 cout <<
"ConfigFileParser ERROR: can't find parameter " << parname << endl;
791 for (
unsigned int i = 0; i < m_configFileLines.size(); i++){
792 m_configFileLines[i].printLine();
809 m_fileName = fileName;
810 m_lineNumber = lineNumber;
816 string newline(line);
817 while (newline.find(
"::") != string::npos){
818 newline.replace(newline.find(
"::"),2,
" ");
822 vector<string> words;
824 for (
unsigned int j = 0; j < newline.size(); j++){
825 if (!isspace(newline[j])){
827 if ((j == (newline.size()-1))&&(!word.empty())){
828 words.push_back(word);
832 else if (!word.empty()){
833 words.push_back(word);
839 if (words.size() > 0) m_keyword = words[0];
842 if (m_keyword.empty()) m_comment =
true;
843 else if (m_keyword[0] ==
'#') m_comment =
true;
844 if (m_comment) m_keyword =
"";
848 for (
unsigned int i = 1; i < words.size(); i++){
849 m_arguments.push_back(words[i]);
857 bool hasWord =
false;
858 for (
unsigned int i = 0; i < m_arguments.size(); i++){
859 if (m_arguments[i] == word) hasWord =
true;
861 if (!hasWord)
return;
862 if ((m_keyword ==
"define") && (m_arguments[0] == word))
return;
863 vector<string> newArguments;
864 for (
unsigned int i = 0; i < m_arguments.size(); i++){
865 if (m_arguments[i] != word){
866 newArguments.push_back(m_arguments[i]);
869 for (
unsigned int j = 0; j < definition.size(); j++){
870 newArguments.push_back(definition[j]);
874 m_arguments = newArguments;
ReactionInfo * reaction(const string &reactionName) const
void setLowerBound(double lowerBound)
void setFixed(bool fixed)
void setCentralValue(double centralValue)
void addFactor(const vector< string > &factor)
void setFixed(bool fixed)
void readConfigFile(const string &configFile)
void addUserKeyword(const string &uesrKeyword, const vector< string > &arguments)
ParameterInfo * parameter(const string &parName) const
const vector< string > & particleList() const
void displayConfigFile() const
void setBounded(bool bounded)
void setUpperBound(double upperBound)
void setGaussianError(double gaussianError)
AmplitudeInfo * amplitude(const string &reactionName, const string &sumName, const string &Name) const
void setGaussianBounded(bool gaussianBounded)
ReactionInfo * createReaction(const string &reactionName, const vector< string > &particleList)
void addParameter(ParameterInfo *parameter)
void setNormIntFile(const string &normIntFile, bool input=false)
void setScale(string scale)
ParameterInfo * createParameter(const string &parName, double value)
ConfigFileLine(const string &fileName, int lineNumber, const string &line)
void setValue(complex< double > value)
void flushDefinition(const string &word, const vector< string > &definition)
vector< string > arguments() const
CoherentSumInfo * createCoherentSum(const string &reactionName, const string &sumName)
AmplitudeInfo * createAmplitude(const string &reactionName, const string &sumName, const string &Name)
void addConstraint(AmplitudeInfo *constraint)