Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

AlgAdapt.cxx

Go to the documentation of this file.
00001 // $Id: AlgAdapt.cxx,v 1.11 2009/10/15 18:30:13 jyuko Exp $
00002 
00003 // C/C++
00004 #include <cassert>
00005 #include <cstdlib>
00006 #include <fstream>
00007 #include <iomanip>
00008 #include <iostream>
00009 
00010 // MINOS
00011 #include "Registry/Registry.h"
00012 #include "Util/UtilString.h"
00013 
00014 // Local
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 &reg)
00120 {
00121    //
00122    // Read in default and and current error and parameter vectors from
00123    // Registry, if these keys exist in Registry. Use virtual functions Set()
00124    // to set parameter values.
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 &reg) const
00166 {
00167    //
00168    // Extract Registry value stored at key and convert string numbers separated by
00169    // " " or "," or both to vector of doubles.
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    // Parse into individual strings
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 }

Generated on Mon Feb 15 11:06:16 2010 for loon by  doxygen 1.3.9.1