IsisDlm
Version 0.2
|
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