00001
00002
00003
00004
00005
00006
00007 #ifndef ILLUMTABLE_H
00008 #define ILLUMTABLE_H
00009
00010 #include <exception>
00011 #include <map>
00012 #include <string>
00013
00014 typedef struct {
00015 unsigned x1;
00016 unsigned x2;
00017 double val1;
00018 double val2;
00019 } Intervall;
00020
00022 class IllumTable
00023 {
00024 public:
00027 IllumTable(unsigned aNumXi, unsigned aNumEta, std::string aFilterName)
00028 : mNumXi(aNumXi),
00029 mNumEta(aNumEta),
00030 mFilterName(aFilterName),
00031 mDelMagAry(0)
00032 {
00033 mDelMagAry = new double*[mNumXi];
00034 for (unsigned ii = 0; ii < mNumXi; ++ii)
00035 {
00036 mDelMagAry[ii] = new double[mNumEta];
00037 for (unsigned jj = 0; jj < mNumEta; ++jj)
00038 {
00039 mDelMagAry[ii][jj] = 0.0;
00040 }
00041 }
00042 }
00043
00045 ~IllumTable()
00046 {
00047 for (unsigned ii = 0; ii < mNumXi; ++ii)
00048 {
00049 delete[] mDelMagAry[ii];
00050 }
00051 delete[] mDelMagAry;
00052 }
00053
00054
00055
00057 unsigned getNumEtas() const { return mNumEta; }
00058
00060 unsigned getNumXis() const { return mNumXi; }
00061
00063 std::string getFilterName() const { return mFilterName; }
00064
00065
00066 void assignMag(unsigned aCol, unsigned aRow, double aValue)
00067 {
00068 writeToMag(aCol, aRow, aValue);
00069 }
00070
00071
00072 void assignXi(unsigned aIdx, double aValue)
00073 {
00074 writeToXi(aIdx, aValue);
00075 }
00076
00077
00078 void assignEta(unsigned aIdx, double aValue)
00079 {
00080 writeToEta(aIdx, aValue);
00081 }
00082
00084 void setXiIntervall(double aXiVal)
00085 {
00086 writeXiIntervall(aXiVal);
00087 }
00088
00090 void setEtaIntervall(double aEtaVal)
00091 {
00092 writeEtaIntervall(aEtaVal);
00093 }
00094
00096 Intervall& getXiIntervall()
00097 {
00098 return readXiIntervall();
00099 }
00100
00102 Intervall& getEtaIntervall()
00103 {
00104 return readEtaIntervall();
00105 }
00106
00108 const double& getMag(unsigned aCol, unsigned aRow) const
00109 {
00110 return readMag(aCol, aRow);
00111 }
00112
00114 double& getXi(unsigned aIdx)
00115 {
00116 return readXi(aIdx);
00117 }
00118
00120 double& getEta(unsigned aIdx)
00121 {
00122 return readEta(aIdx);
00123 }
00124
00125
00126
00127 private:
00128 typedef std::map<double, unsigned> DoubleUintMap;
00129 typedef std::map<unsigned, double> UintDoubleMap;
00130 unsigned mNumXi;
00131 unsigned mNumEta;
00132 std::string mFilterName;
00133 DoubleUintMap mXi;
00134 UintDoubleMap mXiInv;
00135 DoubleUintMap mEta;
00136 UintDoubleMap mEtaInv;
00137 Intervall mXiIvall, mEtaIvall;
00138
00140 double **mDelMagAry;
00141
00142
00143 void writeToMag(unsigned aCol, unsigned aRow, double aValue)
00144 {
00145
00146 mDelMagAry[aCol][aRow] = aValue;
00147 }
00148
00149 void writeToXi(unsigned aIdx, double aValue)
00150 {
00151 mXi[aValue] = aIdx;
00152 mXiInv[aIdx] = aValue;
00153 }
00154
00155 void writeToEta(unsigned aIdx, double aValue)
00156 {
00157 mEta[aValue] = aIdx;
00158 mEtaInv[aIdx] = aValue;
00159 }
00160
00161 void writeXiIntervall(double aXiVal)
00162 {
00163 mXiIvall.x2 = mXi.lower_bound(aXiVal)->second;
00164 mXiIvall.val2 = mXi.lower_bound(aXiVal)->first;
00165 if (mXiIvall.x2 > 0)
00166 {
00167 mXiIvall.x1 = mXiIvall.x2 - 1;
00168 } else {
00169 mXiIvall.x1 = 0;
00170 }
00171 mXiIvall.val1 = mXiInv[mXiIvall.x1];
00172 }
00173
00174 void writeEtaIntervall(double aEtaVal)
00175 {
00176 mEtaIvall.x2 = mEta.lower_bound(aEtaVal)->second;
00177 mEtaIvall.val2 = mEta.lower_bound(aEtaVal)->first;
00178 if (mEtaIvall.x2 > 0)
00179 {
00180 mEtaIvall.x1 = mEtaIvall.x2 - 1;
00181 } else {
00182 mEtaIvall.x1 = 0;
00183 }
00184 mEtaIvall.val1 = mEtaInv[mEtaIvall.x1];
00185 }
00186
00187 const double& readMag(unsigned aCol, unsigned aRow) const
00188 {
00189
00190 return mDelMagAry[aCol][aRow];
00191 }
00192
00193 double& readXi(unsigned aIdx)
00194 {
00195
00196 return mXiInv[aIdx];
00197 }
00198
00199 double& readEta(unsigned aIdx)
00200 {
00201
00202 return mEtaInv[aIdx];
00203 }
00204
00205 Intervall& readXiIntervall()
00206 {
00207 return mXiIvall;
00208 }
00209
00210 Intervall& readEtaIntervall()
00211 {
00212 return mEtaIvall;
00213 }
00214 };
00215
00216 #endif
00217
00218
00219
00220
00221