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 }