ComputeObservables.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2013 HEPfit Collaboration
3  * All rights reserved.
4  *
5  * For the licensing terms see doc/COPYING.
6  */
7 
8 #include "Observable.h"
9 #include "Observable2D.h"
10 #include "CorrelatedGaussianObservables.h"
11 #include "ComputeObservables.h"
12 #include <boost/algorithm/string/predicate.hpp>
13 
15  const std::string& ModelConf_i, const int rank_i)
16 : myInputParser(ModelF, ThObsF),
17  rank(rank_i)
18 {
19  std::vector<ModelParameter> ModPars;
20  boost::ptr_vector<Observable> Obs;
21  std::vector<Observable2D> Obs2D;
22  std::vector<CorrelatedGaussianObservables> CGO;
23  std::vector<CorrelatedGaussianParameters> CGP;
24 
25  std::string ModelName = myInputParser.ReadParameters(ModelConf_i, rank, ModPars, Obs, Obs2D, CGO, CGP);
26  std::map<std::string, double> DP;
27  for (std::vector<ModelParameter>::iterator it = ModPars.begin(); it < ModPars.end(); it++) {
28  DP[it->getname()] = it->getave();
29  paraNames.push_back(it->getname());
30  }
31  DPars = DP;
32 
33  for (boost::ptr_vector<Observable>::iterator it = Obs.begin(); it < Obs.end(); it++) {
34  DObs.insert(std::pair<std::string, double> (it->getThname() , 0.));
35  DThObs.insert(std::pair<std::string, ThObservable*> (it->getThname() , it->getTho()));
36  }
37  for (std::vector<CorrelatedGaussianObservables>::iterator it1 = CGO.begin(); it1 < CGO.end(); it1++) {
38  std::vector<Observable> ObsInCGO = it1->getObs();
39  for (std::vector<Observable>::iterator it2 = ObsInCGO.begin(); it2 < ObsInCGO.end(); it2++) {
40  DObs.insert(std::pair<std::string, double> (it2->getThname() , 0.));
41  DThObs.insert(std::pair<std::string, ThObservable*> (it2->getThname() , it2->getTho()));
42  }
43  }
44 
46  if (!Mod->Init(DP))
47  throw std::runtime_error("ERROR: Parameter(s) missing in model initialization.\n");
48 }
49 
51  const std::string& ModelName_i, std::map<std::string, double> DPars_i, const int rank_i)
52 : ModelName(ModelName_i),
53  myInputParser(ModelF, ThObsF),
54  rank(rank_i)
55 {
56  for (std::map<std::string, double>::iterator it = DPars_i.begin(); it != DPars_i.end(); it++) {
57  paraNames.push_back(it->first);
58  }
62  if (Mod->IsModelInitialized()) {
63  if (rank == 0) std::cout << "\nModel Initialized: " << ModelName << std::endl;
64  } else {
65  throw std::runtime_error("\nERROR: " + ModelName + " not initialized successfully.\n");
66  }
67  if (!Mod->Init(DPars_i))
68  throw std::runtime_error("\nERROR: Model cannot be initialized initialization.\n");
69 }
70 
72 {
73 }
74 
75 void ComputeObservables::setFlags(std::map<std::string, std::string> DFlags_i)
76 {
77  for (std::map<std::string, std::string>::iterator it = DFlags_i.begin(); it != DFlags_i.end(); it++) {
78  if (!(boost::iequals(it->second, "true")) && !(boost::iequals(it->second, "false")) && !Mod->setFlagStr(it->first, it->second)) {
79  throw std::runtime_error("ERROR: setFlagStr error for " + it->first);
80  } else if (boost::iequals(it->second, "true") && !Mod->setFlag(it->first, 1)) {
81  throw std::runtime_error("ERROR: setFlag error for " + it->first);
82  } else if (boost::iequals(it->second, "false") && !Mod->setFlag(it->first, 0)) {
83  throw std::runtime_error("ERROR: setFlag error for " + it->first);
84  } else {
85  if (rank == 0) std::cout << "set flag " << it->first << " = " << it->second << std::endl;
86  }
87  }
88 }
89 
90 std::map<std::string, double> ComputeObservables::compute(std::map<std::string, double> DP)
91 {
92  if (DP != DPars)
93  for (std::map<std::string, double>::iterator it = DP.begin(); it != DP.end(); it++) {
94  if(!(std::find(paraNames.begin(), paraNames.end(), it->first) != paraNames.end()))
95  throw std::runtime_error("\nERROR: Incorrect parameter name passed to ComputeObservable");
96  }
97  DPars = DP;
98  Mod->Update(DPars);
99  for (std::map<std::string, double>::iterator it = DObs.begin(); it != DObs.end(); it++) {
100  DObs[it->first] = DThObs[it->first]->computeThValue();
101  }
102  return(DObs);
103 }
104 
105 void ComputeObservables::RemoveObservable(std::string ObsName)
106 {
107  if(DObs.find(ObsName) == DObs.end())
108  throw std::runtime_error("\nERROR: Observable cannot be removed since it has not been added.\n");
109  DObs.erase(ObsName);
110  if(DThObs.find(ObsName) == DThObs.end())
111  throw std::runtime_error("\nERROR: ThObservable cannot be removed since it has not been added.\n");
112  DThObs.erase(ObsName);
113 }
114 
115 void ComputeObservables::AddObservable(std::string ObsName)
116 {
117  DThObs[ObsName] = myInputParser.getObsFactory().CreateThMethod(ObsName, *Mod);
118  DObs.insert(std::pair<std::string, double> (ObsName , 0.));
119 }
120 
121 void ComputeObservables::addCustomObservableType(const std::string name, boost::function<Observable*() > funct){
123 }
std::string ReadParameters(const std::string filename_i, const int rank, std::vector< ModelParameter > &ModelPars, boost::ptr_vector< Observable > &Observables, std::vector< Observable2D > &Observables2D, std::vector< CorrelatedGaussianObservables > &CGO, std::vector< CorrelatedGaussianParameters > &CGP)
The member that parses the Observable2D directives from SomeModel.conf file.
Definition: InputParser.cpp:28
InputParser myInputParser
An object of the InputParser class.
virtual bool setFlagStr(const std::string name, const std::string value)
A method to set a flag of StandardModel.
StandardModel * CreateModel(const std::string &ModelName)
virtual bool Update(const std::map< std::string, double > &DPars)
The update method for StandardModel.
ComputeObservables(ModelFactory &ModelF, ThObsFactory &ThObsF, const std::string &ModelConf_i, const int rank_i=0)
Constructor.
const ThObsFactory & getObsFactory() const
Definition: InputParser.h:115
std::string ModelName
Name of the Model to be used.
A class for.
Definition: ModelFactory.h:25
void AddObservable(std::string ObsName)
A method to remove an observable from the list of observables.
A class for.
Definition: ThObsFactory.h:26
ModelFactory & getModelFactory() const
Definition: InputParser.h:120
virtual bool InitializeModel()
A method to initialize the model.
std::map< std::string, double > DObs
Map of the observables to be computed.
void addCustomObservableType(const std::string name, boost::function< Observable *() > funct)
ThObservable * CreateThMethod(const std::string &name, const StandardModel &model) const
This method checks for the existence of an observable of a specific name in the map thobs and returns...
std::map< std::string, double > DPars
Map of the parameters to be passed to Model.
bool IsModelInitialized() const
A method to check if the model is initialized.
Definition: Model.h:133
A class for observables.
Definition: Observable.h:28
virtual bool Init(const std::map< std::string, double > &DPars)
A method to initialize the model parameters.
void setFlags(std::map< std::string, std::string > DFlags_i)
This method sets the necessary flag for the requested model.
void setModelName(const std::string name)
A method to set the name of the model.
Definition: Model.h:47
std::map< std::string, ThObservable * > DThObs
void RemoveObservable(std::string ObsName)
A method to add an observable to the list of observables.
StandardModel * Mod
Pointer to an object of the class StandardModel.
void addCustomObservableType(const std::string name, boost::function< Observable *() > funct)
std::map< std::string, double > compute(std::map< std::string, double > DP)
The method used to compute observables.
std::vector< std::string > paraNames
The vector of allowed parameter names.
const int rank
< Rank of the MPI process. Set to 0 for serial run.
virtual ~ComputeObservables()
The default destructor.
StandardModel * getModel() const
A get method to access the pointer to the object of the StandardModel class.
Definition: InputParser.h:110
virtual bool setFlag(const std::string name, const bool value)
A method to set a flag of StandardModel.