IsisDlm  Version 0.2
CubeIoPolicy.h
Go to the documentation of this file.
00001 
00002 //_Title CubeIoPolicy.h Definition of basic ISIS support structure
00003 //
00004 //_Descr ISIS3 file/functionality definition.
00005 //
00006 //_Hist Jul 24 2004 Kris Becker, USGS
00007 //      Apr 18 2013 Kris Becker - Modified to comply with recent API changes
00008 //_Version: $Id: CubeIoPolicy.h,v 1.3 2009/07/30 00:15:37 kbecker Exp $
00009 //_End
00011 #if !defined(CubeIoPolicy_h)
00012 #define CubeIoPolicy_h
00013 #include <string>
00014 #include "Idl.h"
00015 #include "IdlVariable.h"
00016 
00017 #include "AlphaCube.h"
00018 #include "Cube.h"
00019 #include "Pvl.h"
00020 #include "PvlGroup.h"
00021 #include "Brick.h"
00022 #include "SpecialPixel.h"
00023 #include "SubArea.h"
00024 
00025 #include "tnt/tnt_array3d.h"
00026 
00027 namespace ISISDLM {
00028 
00029   using Isis::Brick;
00030   using Isis::Buffer;
00031   using Isis::Cube;
00032   using Isis::PvlGroup;
00033   using Isis::SubArea;
00034 
00035 
00036 template <class T> struct RawIO {
00037   protected:
00038   void Extract(Brick &b,  T *data, Cube &cube) {
00039     T *ptr(static_cast<T *> (b.RawBuffer()));
00040     for (int i = 0 ; i < b.size() ; i++) {
00041       data[i] = ptr[i];
00042     }
00043     return;
00044   }
00045 
00046   void Inject(Brick &b, T *data, Cube &cube) {
00047     T *ptr(static_cast<T *> (b.RawBuffer()));
00048     for (int i = 0 ; i < b.size() ; i++) {
00049       ptr[i] = data[i];
00050     }
00051     ToDouble(b, cube);
00052     return;
00053   }
00054 
00055   void ToDouble(Buffer &rbuf, Cube &cube) {
00056     if (rbuf.PixelType() == Isis::UnsignedByte) {
00057       double *dbuf = rbuf.DoubleBuffer();
00058       unsigned char *cbuf = (unsigned char *) rbuf.RawBuffer();
00059       for (int i=0; i<rbuf.size(); i++) {
00060         if (cbuf[i] == Isis::NULL1) {
00061           dbuf[i] = Isis::NULL8;
00062         }
00063         else if (cbuf[i] == Isis::HIGH_REPR_SAT1) {
00064           dbuf[i] = Isis::HIGH_REPR_SAT8;
00065         }
00066         else {
00067           dbuf[i] = (double) cbuf[i] * cube.multiplier() + cube.base();
00068         }
00069       }
00070     }
00071     else if (rbuf.PixelType() == Isis::SignedWord) {
00072       double *dbuf = rbuf.DoubleBuffer();
00073       short int *sbuf = (short *) rbuf.RawBuffer();
00074       for (int i=0; i<rbuf.size(); i++) {
00075         if (sbuf[i] < Isis::VALID_MIN2) {
00076           if (sbuf[i] == Isis::NULL2) dbuf[i] = Isis::NULL8;
00077           else if (sbuf[i] == Isis::LOW_INSTR_SAT2) dbuf[i] = Isis::LOW_INSTR_SAT8;
00078           else if (sbuf[i] == Isis::LOW_REPR_SAT2) dbuf[i] = Isis::LOW_REPR_SAT8;
00079           else if (sbuf[i] == Isis::HIGH_INSTR_SAT2) dbuf[i] = Isis::HIGH_INSTR_SAT8;
00080           else if (sbuf[i] == Isis::HIGH_REPR_SAT2) dbuf[i] = Isis::HIGH_REPR_SAT8;
00081           else dbuf[i] = Isis::LOW_REPR_SAT8;
00082         }
00083         else {
00084           dbuf[i] = (double) sbuf[i] * cube.multiplier() + cube.base();
00085         }
00086       }
00087     }
00088     else {
00089       double *dbuf = rbuf.DoubleBuffer();
00090       float *fbuf = (float *) rbuf.RawBuffer();
00091       for (int i=0; i<rbuf.size(); i++) {
00092         if (fbuf[i] < Isis::VALID_MIN4) {
00093           if (fbuf[i] == Isis::NULL4) dbuf[i] = Isis::NULL8;
00094           else if (fbuf[i] == Isis::LOW_INSTR_SAT4) dbuf[i] = Isis::LOW_INSTR_SAT8;
00095           else if (fbuf[i] == Isis::LOW_REPR_SAT4) dbuf[i] = Isis::LOW_REPR_SAT8;
00096           else if (fbuf[i] == Isis::HIGH_INSTR_SAT4) dbuf[i] = Isis::HIGH_INSTR_SAT8;
00097           else if (fbuf[i] == Isis::HIGH_REPR_SAT4) dbuf[i] = Isis::HIGH_REPR_SAT8;
00098           else dbuf[i] = Isis::LOW_REPR_SAT8;
00099         }
00100         else {
00101           dbuf[i] = (double) fbuf[i];
00102         }
00103       }
00104     }
00105   }
00106 
00107 };
00108 
00109 template <class T> struct StdIO {
00110   protected:
00111   void Extract(Brick &b, T *data, Cube &cube) {
00112     T *ptr(static_cast<T *> (b.DoubleBuffer()));
00113     for (int i = 0 ; i < b.size() ; i++) {
00114       data[i] = ptr[i];
00115     }
00116     return;
00117   }
00118 
00119   void Inject(Brick &b, T *data, Cube &cube) {
00120     T *ptr(static_cast<T *> (b.DoubleBuffer()));
00121     for (int i = 0 ; i < b.size() ; i++) {
00122       ptr[i] = data[i];
00123     }
00124     return;
00125   }
00126 
00127 };
00128 
00129 
00130 struct CubeDims {
00131     CubeDims() : _ssamp(1), _nsamps(0), _sline(1), _nlines(0),
00132                  _sband(1), _nbands(0) { }
00133     CubeDims(const int &ns, const int &nl, const int &nb = 1) :
00134              _ssamp(1), _nsamps(ns), _sline(1), _nlines(nl),
00135              _sband(1), _nbands(nb) { }
00136 
00137     void setSampleSpecs(int ssamp, int ns = 0) { 
00138       _ssamp = ssamp; _nsamps = ns;
00139     };
00140 
00141     void setLineSpecs(int sline, int nl = 0) {
00142       _sline = sline; _nlines = nl;
00143     };
00144 
00145     void setBandSpecs(int sband, int nb = 0) {
00146       _sband = sband; _nbands = nb;
00147     };
00148 
00149     int _ssamp;
00150     int _nsamps;
00151     int _sline;
00152     int _nlines;
00153     int _sband;
00154     int _nbands;
00155 };
00156 
00157 
00158 inline PvlGroup setAlphaCube(Cube *icube, Cube *ocube, const CubeDims &specs) {
00159   SubArea s;
00160   s.SetSubArea(icube->lineCount(), icube->sampleCount(), 
00161                specs._sline, specs._ssamp, 
00162                (specs._sline+specs._nlines-1), (specs._ssamp+specs._nsamps-1),
00163                1.0, 1.0);
00164   PvlGroup results("IDL_History");
00165   s.UpdateLabel(icube, ocube, results);
00166   return (results);
00167 }
00168 
00173 template <
00174  class T, int TYPEID,
00175  template <class> class IOPolicy
00176  >
00177  class CubeIoPolicy : public IOPolicy<T> {
00178    public:
00179      typedef T   DataType;
00180      CubeIoPolicy() : dims() { };
00181      CubeIoPolicy(const CubeDims &d) : dims(d) { }
00182      virtual ~CubeIoPolicy() { };
00183 
00184      int getVarType() const { return (TYPEID); }
00185 
00186      void Read(Isis::Cube &cube, TNT::Array3D<T> &data) {
00187        int ss,sl,sb;
00188        ss = (dims._ssamp <= 0) ? 1 : dims._ssamp;
00189        sl = (dims._sline <= 0) ? 1 : dims._sline;
00190        sb = (dims._sband <= 0) ? 1 : dims._sband;
00191 
00192        int ns,nl,nb;
00193        ns = (dims._nsamps <= 0) ? cube.sampleCount() - ss + 1 : dims._nsamps;
00194        nl = (dims._nlines <= 0) ? cube.lineCount()   - sl + 1 : dims._nlines;
00195        nb = (dims._nbands <= 0) ? cube.bandCount()   - sb + 1 : dims._nbands;
00196 
00197        Brick brick(cube, ns, 1, 1);
00198        for (int b = 0 ; b < nb ; b++) {
00199          for (int l = 0 ; l < nl ; l++) {
00200            brick.SetBasePosition(ss,sl+l,sb+b);
00201            cube.read(brick);
00202            this->Extract(brick, data[b][l], cube);
00203          }
00204        }
00205      };
00206 
00207      void Write(TNT::Array3D<T> &data, Isis::Cube &cube) {
00208        int ss,sl,sb;
00209        ss = (dims._ssamp <= 0) ? 1 : dims._ssamp;
00210        sl = (dims._sline <= 0) ? 1 : dims._sline;
00211        sb = (dims._sband <= 0) ? 1 : dims._sband;
00212 
00213        int ns,nl,nb;
00214        ns = data.dim3();
00215        nl = data.dim2();
00216        nb = data.dim1();
00217 
00218        Brick brick(cube, ns, 1, 1);
00219        for (int b = 0 ; b < nb ; b++) {
00220          for (int l = 0 ; l < nl ; l++) {
00221            brick.SetBasePosition(ss,sl+l,sb+b);
00222            this->Inject(brick, data[b][l], cube);
00223            cube.write(brick);
00224            brick++;
00225          }
00226        }
00227      };
00228 
00229    private:
00230      CubeDims dims;           
00231 
00232  };
00233 
00234 
00235 
00236  }
00237  #endif