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