emcQAFEM.C

Go to the documentation of this file.
00001 #include "emcQAFEM.h"
00002 #include "emcDefines.h"
00003 #include "emcCalFEMFactory.h"
00004 #include <cassert>
00005 #include <iostream>
00006 #include <iomanip>
00007 #include <map>
00008 #include <vector>
00009 #include <iterator>
00010 #include <string>
00011 
00012 using namespace std;
00013 
00014 namespace
00015 {
00016   static string name = "emcQAFEM";
00017   static string title = "Q&A calibration data";
00018   static string classname = "emcQAFEM";
00019 
00020   emcCalFEM* creator(int absPosition,
00021                      const PHTimeStamp& start,
00022                      const PHTimeStamp& end,
00023                      bool isDefault)
00024   {
00025     if ( isDefault )
00026       {
00027         return emcQAFEM::Default(absPosition,start,end);
00028       }
00029     else
00030       {
00031         return new emcQAFEM(absPosition,start,end);
00032       }
00033   }
00034 
00035   static bool r = emcCalFEMFactory::registerCreator("QAs",
00036                                                     creator);
00037 
00038 }
00039 
00040 //_____________________________________________________________________________
00041 emcQAFEM::emcQAFEM(int absPosition)
00042   : emcCalFEM(absPosition)
00043 {
00044   NameIt(name, title, classname);
00045   First();
00046 }
00047 
00048 //_____________________________________________________________________________
00049 emcQAFEM::emcQAFEM(int absPosition,
00050                    const PHTimeStamp& t1, const PHTimeStamp& t2)
00051   : emcCalFEM(absPosition, t1, t2)
00052 {
00053   NameIt(name, title, classname);
00054   First();
00055 }
00056 
00057 //_____________________________________________________________________________
00058 emcQAFEM::emcQAFEM(const emcQAFEM& o)
00059   : emcCalFEM(o.AbsolutePosition())
00060 {
00061   o.Copy(*this);
00062   First();
00063 }
00064 
00065 //_____________________________________________________________________________
00066 emcQAFEM&
00067 emcQAFEM::operator=(const emcQAFEM& o)
00068 {
00069   if ( this == &o )
00070     return * this;
00071   Reset();
00072   o.Copy(*this);
00073   First();
00074   return *this;
00075 }
00076 
00077 //_____________________________________________________________________________
00078 void
00079 emcQAFEM::Copy(emcQAFEM& o) const
00080 {
00081   emcCalFEM::Copy(o);
00082   o.Reset();
00083 
00084   map<int, vector<INT32> >::const_iterator p;
00085 
00086   for ( p = fQA.begin(); p != fQA.end(); p++)
00087     {
00088       o.fQA[p->first] = p->second;
00089     }
00090 }
00091 
00092 //_____________________________________________________________________________
00093 emcQAFEM::~emcQAFEM()
00094 {
00095   Reset();
00096 }
00097 
00098 //_____________________________________________________________________________
00099 void emcQAFEM::AppendOneChannel(int channel, INT32 error, INT32 warning)
00100 {
00101   assert(channel >= 0 && channel < 144);
00102   vector<INT32> one;
00103   one.push_back(error);
00104   one.push_back(warning);
00105   fQA[channel] = one;
00106 }
00107 
00108 //_____________________________________________________________________________
00109 emcQAFEM*
00110 emcQAFEM::Default(int absPosition,
00111                   const PHTimeStamp& tStart, const PHTimeStamp& tEnd)
00112 {
00113   emcQAFEM* fem = new emcQAFEM(absPosition, tStart, tEnd);
00114 
00115   size_t i;
00116 
00117   for ( i = 0; i < 144; i++)
00118     {
00119       fem->AppendOneChannel(i, 0, 0);
00120     }
00121   return fem;
00122 
00123 }
00124 
00125 //_____________________________________________________________________________
00126 void emcQAFEM::First(void)
00127 {
00128   fIterator = fQA.begin();
00129 }
00130 
00131 //_____________________________________________________________________________
00132 float
00133 emcQAFEM::getValue(int ichannel, int what) const
00134 {
00135   if (what != 0 && what != 1)
00136     {
00137 
00138       cerr << EMC_WARNING_MSG
00139            << " emcQAFEM::getValue(ichannel,what) : what="
00140            << what << " is incorrect. Returning default value of "
00141            << DefaultReturnValue() << " instead" << endl;
00142 
00143       return DefaultReturnValue();
00144 
00145     }
00146 
00147   return getValueFast(ichannel, what);
00148 }
00149 
00150 //_____________________________________________________________________________
00151 float
00152 emcQAFEM::getValueFast(int ichannel, int what) const
00153 {
00154   if (what == 0)
00155     return static_cast<float>(GetError(ichannel));
00156   if (what == 1)
00157     return static_cast<float>(GetWarning(ichannel));
00158   assert(0 == 1);
00159   return 0;
00160 }
00161 
00162 //_____________________________________________________________________________
00163 INT32 emcQAFEM::GetError(int channel) const
00164 {
00165   map<int, vector<INT32> >::const_iterator p = fQA.find(channel);
00166   if (p != fQA.end())
00167     {
00168       return (p->second)[0];
00169     }
00170   else
00171     {
00172       return static_cast<INT32>(0);
00173     }
00174 }
00175 
00176 //_____________________________________________________________________________
00177 INT32 emcQAFEM::GetWarning(int channel) const
00178 {
00179   map<int, vector<INT32> >::const_iterator p = fQA.find(channel);
00180   if (p != fQA.end())
00181     {
00182       return (p->second)[1];
00183     }
00184   else
00185     {
00186       return static_cast<INT32>(0);
00187     }
00188 }
00189 
00190 //_____________________________________________________________________________
00191 bool
00192 emcQAFEM::IsEqual(const emcCalFEM& obj) const
00193 {
00194   if ( !dynamic_cast<const emcQAFEM*>(&obj) )
00195     return false;
00196 
00197   if ( size() != obj.size() )
00198     return false;
00199 
00200   for ( size_t i = 0; i < size(); i++)
00201     {
00202       for ( int j = 0; j < 2; j++ )
00203         {
00204           if ( getValue(i, j) != obj.getValue(i, j) )
00205             return false;
00206         }
00207     }
00208   return true;
00209 }
00210 
00211 //_____________________________________________________________________________
00212 bool emcQAFEM::Next(int& channel, INT32& error, INT32& warning)
00213 {
00214   if (fIterator != fQA.end())
00215     {
00216       vector<INT32> vec = fIterator->second;
00217       channel = fIterator->first;
00218       error = vec[0];
00219       warning = vec[1];
00220       fIterator++;
00221       return true;
00222     }
00223   else
00224     {
00225       return false;
00226     }
00227 }
00228 
00229 //_____________________________________________________________________________
00230 ostream&
00231 emcQAFEM::Print(ostream& out, int level) const
00232 {
00233   emcCalFEM::Print(out, level);
00234 
00235   if (level)
00236     {
00237       ostream::fmtflags oldflags = out.flags();
00238       
00239       map<int, vector<INT32> >::const_iterator p;
00240       
00241       for (p = fQA.begin();p != fQA.end();p++ )
00242         {
00243           vector<INT32> vec = p->second;
00244           out << dec << "Channel #" << p->first 
00245               << " Error=0x" << hex << vec[0]
00246               << " Warning=0x" << hex << vec[1] << endl;
00247         }
00248       out.setf(oldflags);
00249     }
00250   return out;
00251 }
00252 
00253 //_____________________________________________________________________________
00254 void emcQAFEM::Reset(void)
00255 {
00256   fQA.clear();
00257 }