00001
00002
00003
00004 #include <cassert>
00005 #include <cstdlib>
00006 #include <fstream>
00007 #include <iomanip>
00008 #include <iostream>
00009
00010
00011 #include "Registry/Registry.h"
00012 #include "Util/UtilString.h"
00013
00014
00015 #include "PhysicsNtuple/AlgAdapt.h"
00016
00017 using namespace std;
00018
00019
00020 Anp::AlgAdapt::AlgAdapt()
00021 {
00022 }
00023
00024
00025 Anp::AlgAdapt::~AlgAdapt()
00026 {
00027 }
00028
00029
00030 long double Anp::AlgAdapt::GetPT() const
00031 {
00032 if(fCurPar.size() != fDefPar.size() || fCurPar.size() != fDefErr.size())
00033 {
00034 cerr << "AlgAdapt::GetPT - parameter and/or error vectors have different size" << endl;
00035 return 0.0;
00036 }
00037
00038 long double pterm = 0.0;
00039
00040 for(unsigned int ipar = 0; ipar < fCurPar.size(); ++ipar)
00041 {
00042 const double cur_par = fCurPar[ipar];
00043 const double def_par = fDefPar[ipar];
00044 const double def_err = fDefErr[ipar];
00045
00046 if(def_err > 0.0)
00047 {
00048 pterm += (cur_par - def_par)*(cur_par - def_par)/(def_err*def_err);
00049 }
00050 }
00051
00052 return pterm;
00053 }
00054
00055
00056 const vector<double>& Anp::AlgAdapt::Get(const string &key) const
00057 {
00058 if(key == "CurErr")
00059 {
00060 return fCurErr;
00061 }
00062 else if(key == "CurPar")
00063 {
00064 return fCurPar;
00065 }
00066 else if(key == "DefErr")
00067 {
00068 return fDefErr;
00069 }
00070 else if(key == "DefPar")
00071 {
00072 return fDefPar;
00073 }
00074
00075 cerr << "AlgAdapt::Get - unknown key: " << key << endl;
00076
00077 assert(false && "unknown key");
00078
00079 return fCurPar;
00080 }
00081
00082
00083 void Anp::AlgAdapt::Set(const vector<double> &dvec, const string &key)
00084 {
00085 if(dvec.size() != GetNPar())
00086 {
00087 cerr << "AlgAdapt::Set - number of parameters and size of input vector do not match: "
00088 << " GetNPar() = " << GetNPar() << " and dvec.size() = " << dvec.size() << endl;
00089 return;
00090 }
00091
00092 if(key == "CurErr")
00093 {
00094 fCurErr = dvec;
00095 return;
00096 }
00097 else if(key == "CurPar")
00098 {
00099 fCurPar = dvec;
00100 return;
00101 }
00102 else if(key == "DefErr")
00103 {
00104 fDefErr = dvec;
00105 return;
00106 }
00107 else if(key == "DefPar")
00108 {
00109 fDefPar = dvec;
00110 return;
00111 }
00112
00113 cerr << "AlgAdapt::Set - unknown key: " << key << endl;
00114
00115 assert(false && "unknown key");
00116 }
00117
00118
00119 void Anp::AlgAdapt::ReadVec(const string &prefix, const Registry ®)
00120 {
00121
00122
00123
00124
00125
00126
00127 const vector<double> pvec = GetVec(prefix + "Par", reg);
00128 if(!pvec.empty())
00129 {
00130 Set(pvec, "CurPar");
00131 }
00132
00133 const vector<double> evec = GetVec(prefix + "Err", reg);
00134 if(!evec.empty())
00135 {
00136 Set(evec, "CurErr");
00137 }
00138
00139 const vector<double> evec_def = GetVec(prefix + "DefErr", reg);
00140 if(!evec_def.empty())
00141 {
00142 Set(evec_def, "DefErr");
00143 }
00144
00145 const vector<double> pvec_def = GetVec(prefix + "DefPar", reg);
00146 if(!pvec_def.empty())
00147 {
00148 Set(pvec_def, "DefPar");
00149 }
00150
00151 const vector<double> pvec_cur = GetVec(prefix + "CurPar", reg);
00152 if(!pvec_cur.empty())
00153 {
00154 Set(pvec_cur, "CurPar");
00155 }
00156
00157 const vector<double> evec_cur = GetVec(prefix + "CurErr", reg);
00158 if(!evec_cur.empty())
00159 {
00160 Set(evec_cur, "CurErr");
00161 }
00162 }
00163
00164
00165 const vector<double> Anp::AlgAdapt::GetVec(const string &key, const Registry ®) const
00166 {
00167
00168
00169
00170
00171
00172 vector<double> dvec;
00173
00174 const char *value_char = 0;
00175 if(!reg.Get(key.c_str(), value_char) || !value_char)
00176 {
00177 return dvec;
00178 }
00179
00180 vector<string> svec;
00181 UtilString::StringTok(svec, string(value_char), ", ");
00182
00183 dvec = vector<double>(svec.size(), 0.0);
00184
00185 for(unsigned int i = 0; i < svec.size(); ++i)
00186 {
00187 if(!svec[i].empty())
00188 {
00189 dvec[i] = std::atof(svec[i].c_str());
00190 }
00191 }
00192
00193 return dvec;
00194 }
00195
00196
00197 void Anp::AlgAdapt::PrintVec(std::ostream &o, const int w, const int p) const
00198 {
00199 if(!fCurPar.empty())
00200 {
00201 o << " CurPar = ";
00202 PrintVec(fCurPar, o, w, p);
00203 }
00204
00205 if(!fCurErr.empty())
00206 {
00207 o << " CurErr = ";
00208 PrintVec(fCurErr, o, w, p);
00209 }
00210
00211 if(!fDefPar.empty())
00212 {
00213 o << " DefPar = ";
00214 PrintVec(fDefPar, o, w, p);
00215 }
00216
00217 if(!fDefErr.empty())
00218 {
00219 o << " DefErr = ";
00220 PrintVec(fDefErr, o, w, p);
00221 }
00222 }
00223
00224
00225 void Anp::AlgAdapt::PrintVec(const vector<double> &v, ostream &o, const int w, const int p) const
00226 {
00227 for(unsigned int i = 0; i < v.size(); ++i)
00228 {
00229 if(i == 0)
00230 {
00231 o << "(";
00232 }
00233 else
00234 {
00235 o << ", ";
00236 }
00237
00238 if(p > 0)
00239 {
00240 o << setprecision(p);
00241 }
00242 if(w > 0)
00243 {
00244 o << setw(w);
00245 }
00246
00247 o << v[i];
00248
00249 if(i + 1 == v.size())
00250 {
00251 o << ")";
00252 }
00253 }
00254
00255 o << endl;
00256 }
00257
00258
00259 void Anp::AlgAdapt::Print(std::ostream &os) const
00260 {
00261 os << "AlgAdapt::Print - this function is not implemented for this class" << endl;
00262 }
00263
00264
00265 void Anp::AlgAdapt::Save(const string &fname)
00266 {
00267 if(fCurErr.size() != fCurPar.size() ||
00268 fCurErr.size() != fDefErr.size() ||
00269 fCurErr.size() != fDefPar.size() || fCurErr.empty())
00270 {
00271 cerr << "AlgAdapt::Save - invalid internal state" << endl;
00272 return;
00273 }
00274
00275 ofstream ofile(fname.c_str());
00276 if(!ofile.is_open())
00277 {
00278 cerr << "AlgAdapt::Save - failed to open output file:\n " << fname << endl;
00279 return;
00280 }
00281
00282 ofile << "CurErr = " << Anp::ConvertVector2String(fCurErr) << endl
00283 << "CurPar = " << Anp::ConvertVector2String(fCurPar) << endl
00284 << "DefErr = " << Anp::ConvertVector2String(fDefErr) << endl
00285 << "DefPar = " << Anp::ConvertVector2String(fDefPar) << endl;
00286 }
00287
00288
00289 void Anp::AlgAdapt::Read(const string &fname)
00290 {
00291 std::ifstream infile(fname.c_str());
00292 if(!infile.is_open())
00293 {
00294 cerr << "AlgAdapt::Read - failed to open input file:\n " << fname << endl;
00295 return;
00296 }
00297
00298 vector<double> cur_err, cur_par, def_err, def_par;
00299
00300 while(!infile.eof())
00301 {
00302 std::string line;
00303 std::getline(infile, line);
00304
00305 if(line.empty())
00306 {
00307 continue;
00308 }
00309
00310 const std::size_t ipos = line.find_last_of("=");
00311 if(ipos == string::npos)
00312 {
00313 cerr << "AlgAdapt::Read - failed to find equal sign:" << endl << line << endl;
00314 continue;
00315 }
00316
00317 const string name = line.substr(0, ipos - 1);
00318 const string data = line.substr(ipos + 1);
00319
00320 if (name == "CurErr") cur_err = Anp::ConvertString2Vector(data);
00321 else if(name == "CurPar") cur_par = Anp::ConvertString2Vector(data);
00322 else if(name == "DefErr") def_err = Anp::ConvertString2Vector(data);
00323 else if(name == "DefPar") def_par = Anp::ConvertString2Vector(data);
00324 }
00325
00326 if(cur_err.size() != cur_par.size() ||
00327 cur_err.size() != def_err.size() ||
00328 cur_err.size() != def_par.size() || cur_err.empty())
00329 {
00330 cerr << "AlgAdapt::Read - input vectors do not match" << endl;
00331 return;
00332 }
00333
00334 Set(cur_err, "CurErr");
00335 Set(cur_par, "CurPar");
00336 Set(def_par, "DefErr");
00337 Set(def_par, "DefPar");
00338 }
00339
00340
00341 const string Anp::ConvertVector2String(const vector<double> &dvec)
00342 {
00343 stringstream dstr;
00344 for(vector<double>::const_iterator dit = dvec.begin(); dit != dvec.end(); ++dit)
00345 {
00346 dstr << setprecision(9) << fixed << *dit;
00347 if(dit + 1 != dvec.end()) dstr << ", ";
00348 }
00349
00350 return dstr.str();
00351 }
00352
00353
00354 const vector<double> Anp::ConvertString2Vector(const string &dstr)
00355 {
00356 vector<double> dvec;
00357
00358
00359
00360
00361 vector<string> svec;
00362 UtilString::StringTok(svec, dstr, ", ");
00363
00364 if(svec.empty())
00365 {
00366 cerr << " Anp::ConvertString2Vector - input string has no data:\n " << dstr << endl;
00367 return dvec;
00368 }
00369
00370 for(unsigned int i = 0; i < svec.size(); ++i)
00371 {
00372 stringstream temp;
00373 temp << svec[i];
00374
00375 double value = -1.0e9;
00376 temp >> value;
00377
00378 if(!temp.fail())
00379 {
00380 dvec.push_back(value);
00381 }
00382 else
00383 {
00384 cerr << " Anp::ConvertString2Vector - stringstream >> failed for " << svec[i] << endl;
00385 }
00386 }
00387
00388 return dvec;
00389 }