X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Fimagefile.h;h=ccf376905fe670c38a1233c52cbdb10e2260db25;hp=098d0c7272c585291cbe9998c148786f06c067ad;hb=f4a23943110823118f35756dd41fbd6707f04511;hpb=44988be2820a83554d63ba264383c9e87807abc8 diff --git a/include/imagefile.h b/include/imagefile.h index 098d0c7..ccf3769 100644 --- a/include/imagefile.h +++ b/include/imagefile.h @@ -3,6 +3,8 @@ #include #include "kstddef.h" +#include +#include #include using namespace std; @@ -11,17 +13,20 @@ class Array2dFileLabel { private: void init (void); + Array2dFileLabel (const Array2dFileLabel&); + Array2dFileLabel& operator= (const Array2dFileLabel&); public: - kfloat64 calc_time; - kuint16 label_type; - kuint16 year; - kuint16 month; - kuint16 day; - kuint16 hour; - kuint16 minute; - kuint16 second; - string label_str; + kfloat64 m_calcTime; + kuint16 m_labelType; + kuint16 m_year; + kuint16 m_month; + kuint16 m_day; + kuint16 m_hour; + kuint16 m_minute; + kuint16 m_second; + string m_strLabel; + mutable string m_strDate; static const int L_EMPTY = 0; static const int L_HISTORY = 1; @@ -36,15 +41,21 @@ public: ~Array2dFileLabel(); const string& getLabelString (void) const - { return label_str; } + { return m_strLabel; } kfloat64 getCalcTime (void) const - { return calc_time; } + { return m_calcTime; } kfloat64 getLabelType (void) const - { return label_type; } + { return m_labelType; } - void getDateString (string& str) const; + string& setLabelString (const char* const str) + { m_strLabel = str; return (m_strLabel); } + + string& setLabelString (const string& str) + { m_strLabel = str; return (m_strLabel); } + + const string& getDateString () const; }; @@ -70,19 +81,22 @@ private: bool labelSeek (unsigned int label_num); -public: - kuint16 pixel_size; - kuint16 pixel_type; - kuint32 nx; - kuint32 ny; - + kuint16 mPixelSize; kuint16 axis_increment_known; - kfloat64 xinc, yinc; + kfloat64 mIncX, mIncY; kuint16 axis_extent_known; - kfloat64 xmin, xmax, ymin, ymax; - kfloat64 pv_offset, pv_scale; + kfloat64 mMinX, mMaxX, mMinY, mMaxY; + kfloat64 mOffsetPV, mScalePV; + kuint16 mPixelType; + kuint32 mNX; + kuint32 mNY; - Array2d *array; + Array2dFile (const Array2dFile&); + Array2dFile& operator= (const Array2dFile&); + +public: + + Array2d array; static const int INT8 = 1; static const int UINT8 = 2; @@ -105,25 +119,38 @@ public: void labelAdd (const Array2dFileLabel& label); - void labelAdd (const char* const label_str, double calc_time=0.); + void labelAdd (const char* const m_strLabel, double calc_time=0.); + + void labelAdd (int type, const char* const m_strLabel, double calc_time=0.); - void labelAdd (int type, const char* const label_str, double calc_time=0.); + void labelsCopy (Array2dFile& file, const char* const idStr = NULL); void fileClose (void); - void set_axis_increment (double xinc, double yinc); + void setPixelType (int type) + { mPixelType = type; } - void set_axis_extent (double xmin, double xmax, double ymin, double ymax); + kuint32 nx (void) const + { return mNX; } - void get_pixel_extent (T& pvmin, T& pvmax); + kuint32 ny (void) const + { return mNY; } + + void setAxisIncrement (double mIncX, double mIncY); + + void setAxisExtent (double mMinX, double mMaxX, double mMinY, double mMaxY); + + void getPixelValueRange (T& pvmin, T& pvmax) const; - void set_pixel_offset_extent (double offset, double scale); + void doPixelOffsetScale (double offset, double scale); T** getArray (void) const - { return (array == NULL ? NULL : array->getArray()); } + { return (array.getArray()); } bool arrayDataWrite (void); + void arrayDataClear (void); + bool fileRead (void); bool fileCreate (void); @@ -134,67 +161,48 @@ public: template -void -Array2dFile::set_axis_increment (double xinc, double yinc) -{ - axis_increment_known = true; - this.xinc = xinc; - this.yinc = yinc; -} - -template -void -Array2dFile::set_axis_extent (double xmin, double xmax, double ymin, double ymax) +Array2dFile::Array2dFile (unsigned int x, unsigned int y) { - axis_extent_known = true; - this.xmin = xmin; - this.ymax = xmax; - this.xmin = xmin; - this.ymax = ymax; + init(); + mNX = x; + mNY = y; + array.initSetSize(mNX, mNY); } template -void -Array2dFile::get_pixel_extent (T& pvmin, T& pvmax) +Array2dFile::Array2dFile (const char * const str, unsigned int x, unsigned int y) + : filename(str) { - if (array != NULL) { - T** da = array.GetArray(); - pvmax = pvmin = da[0][0]; - for (int ix = 0; ix < nx; ix++) - for (int iy = 0; iy < ny; iy++) - if (pvmax < da[ix][iy]) - pvmax = da[ix][iy]; - else if (pvmin > da[ix][iy]) - pvmin = da[ix][iy]; - } + init(); + mNX = x; + mNY = y; + array.initSetSize(mNX, mNY); } template -void -Array2dFile::set_pixel_offset_extent (double offset, double scale) +Array2dFile::Array2dFile (const char * const str) + : filename(str) { - pv_offset = offset; - pv_scale = scale; + init(); } template void Array2dFile::init (void) { - pixel_size = sizeof(T); + mPixelSize = sizeof(T); signature = ('I' * 256 + 'F'); file_id = -1; - nx = 0; - ny = 0; + mNX = 0; + mNY = 0; headersize = 0; num_labels = 0; axis_increment_known = false; axis_extent_known = false; - xinc = ymin = 0; - xmin = xmax = ymin = ymax = 0; - pv_offset = 0; - pv_scale = 1; - array = NULL; + mIncX = mMinY = 0; + mMinX = mMaxX = mMinY = mMaxY = 0; + mOffsetPV = 0; + mScalePV = 1; io = NULL; #if 0 @@ -203,53 +211,45 @@ Array2dFile::init (void) const type_info& comp_id = typeid(T); if (t_id == comp_id) - pixel_type = FLOAT64; + mPixelType = FLOAT64; else if (t_id == typeid(kfloat32)) - pixel_type = FLOAT32; + mPixelType = FLOAT32; else if (t_id == typeid(kint32)) - pixel_type = INT32; + mPixelType = INT32; else if (t_id == typeid(kuint32)) - pixel_type = UINT32; + mPixelType = UINT32; else if (t_id == typeid(kint16)) - pixel_type = INT16; + mPixelType = INT16; else if (t_id == typeid(kuint16)) - pixel_type = UINT16; + mPixelType = UINT16; else if (t_id == typeid(kint8)) - pixel_type = INT8; + mPixelType = INT8; else if (t_id == typeid(kuint8)) - pixel_type = UINT8; + mPixelType = UINT8; else #endif - pixel_type = 0; + mPixelType = 0; bHeaderWritten = false; bDataWritten = false; } template -Array2dFile::Array2dFile (unsigned int x, unsigned int y) +Array2dFile::~Array2dFile (void) { - init(); - nx = x; - ny = y; - array = new Array2d (nx, ny); + fileClose (); } -template -Array2dFile::Array2dFile (const char * const str, unsigned int x, unsigned int y) - : filename(str) -{ - init(); - nx = x; - ny = y; - array = new Array2d (nx, ny); -} template -Array2dFile::Array2dFile (const char * const str) - : filename(str) +void +Array2dFile::fileClose (void) { - init(); + if (file_id >= 0) { + headerWrite (); + close (file_id); + file_id = -1; + } } template @@ -276,16 +276,65 @@ Array2dFile::fileRead (void) } headerRead(); - if (array != NULL) - delete array; - array = new Array2d (nx, ny); + array.initSetSize(mNX, mNY); arrayDataRead(); return (true); } +template +void +Array2dFile::setAxisIncrement (double incX, double incY) +{ + axis_increment_known = true; + mIncX = incX; + mIncY = incY; +} + +template +void +Array2dFile::setAxisExtent (double minX, double maxX, double minY, double maxY) +{ + axis_extent_known = true; + mMinX = minX; + mMaxY = maxX; + mMinX = minX; + mMaxY = maxY; +} + +template +void +Array2dFile::getPixelValueRange (T& pvmin, T& pvmax) const +{ + T** da = array.getArray(); + if (da) { + pvmax = pvmin = da[0][0]; + for (int ix = 0; ix < mNX; ix++) + for (int iy = 0; iy < mNY; iy++) + if (pvmax < da[ix][iy]) + pvmax = da[ix][iy]; + else if (pvmin > da[ix][iy]) + pvmin = da[ix][iy]; + } +} + +template +void +Array2dFile::doPixelOffsetScale (double offset, double scale) +{ + T** ad = array.getArray(); + if (ad) { + mOffsetPV = offset; + mScalePV = scale; + + for (unsigned int ix = 0; ix < mNX; ix++) + for (unsigned int iy = 0; iy < mNY; iy++) + ad[ix][iy] = (ad[ix][iy] - offset) * scale; + } +} + template bool Array2dFile::headerRead (void) @@ -297,26 +346,26 @@ Array2dFile::headerRead (void) lseek (file_id, 0, SEEK_SET); kuint16 file_signature; - kuint16 file_pixel_size; - kuint16 file_pixel_type; + kuint16 file_mPixelSize; + kuint16 file_mPixelType; read_nint16 (&headersize, file_id); read_nint16 (&file_signature, file_id); read_nint16 (&num_labels, file_id); - read_nint16 (&file_pixel_type, file_id); - read_nint16 (&file_pixel_size, file_id); - read_nint32 (&nx, file_id); - read_nint32 (&ny, file_id); + read_nint16 (&file_mPixelType, file_id); + read_nint16 (&file_mPixelSize, file_id); + read_nint32 (&mNX, file_id); + read_nint32 (&mNY, file_id); read_nint16 (&axis_increment_known, file_id); - read_nfloat64 (&xinc, file_id); - read_nfloat64 (&yinc, file_id); + read_nfloat64 (&mIncX, file_id); + read_nfloat64 (&mIncY, file_id); read_nint16 (&axis_extent_known, file_id); - read_nfloat64 (&xmin, file_id); - read_nfloat64 (&xmax, file_id); - read_nfloat64 (&ymin, file_id); - read_nfloat64 (&ymax, file_id); - read_nfloat64 (&pv_offset, file_id); - read_nfloat64 (&pv_scale, file_id); + read_nfloat64 (&mMinX, file_id); + read_nfloat64 (&mMaxX, file_id); + read_nfloat64 (&mMinY, file_id); + read_nfloat64 (&mMaxY, file_id); + read_nfloat64 (&mOffsetPV, file_id); + read_nfloat64 (&mScalePV, file_id); int read_headersize = lseek (file_id, 0, SEEK_CUR); if (read_headersize != headersize) { @@ -327,12 +376,12 @@ Array2dFile::headerRead (void) sys_error (ERR_WARNING, "File signature %d != true signature %d", file_signature, signature); return (false); } - if (file_pixel_type != pixel_type) { - sys_error (ERR_WARNING, "File pixel type %d != class pixel type %d", file_pixel_type, pixel_type); + if (file_mPixelType != mPixelType) { + sys_error (ERR_WARNING, "File pixel type %d != class pixel type %d", file_mPixelType, mPixelType); return (false); } - if (file_pixel_size != pixel_size) { - sys_error (ERR_WARNING, "File pixel size %d != class pixel size %d", file_pixel_size, pixel_size); + if (file_mPixelSize != mPixelSize) { + sys_error (ERR_WARNING, "File pixel size %d != class pixel size %d", file_mPixelSize, mPixelSize); return (false); } @@ -352,20 +401,20 @@ Array2dFile::headerWrite (void) write_nint16 (&headersize, file_id); write_nint16 (&signature, file_id); write_nint16 (&num_labels, file_id); - write_nint16 (&pixel_type, file_id); - write_nint16 (&pixel_size, file_id); - write_nint32 (&nx, file_id); - write_nint32 (&ny, file_id); + write_nint16 (&mPixelType, file_id); + write_nint16 (&mPixelSize, file_id); + write_nint32 (&mNX, file_id); + write_nint32 (&mNY, file_id); write_nint16 (&axis_increment_known, file_id); - write_nfloat64 (&xinc, file_id); - write_nfloat64 (&yinc, file_id); + write_nfloat64 (&mIncX, file_id); + write_nfloat64 (&mIncY, file_id); write_nint16 (&axis_extent_known, file_id); - write_nfloat64 (&xmin, file_id); - write_nfloat64 (&xmax, file_id); - write_nfloat64 (&ymin, file_id); - write_nfloat64 (&ymax, file_id); - write_nfloat64 (&pv_offset, file_id); - write_nfloat64 (&pv_scale, file_id); + write_nfloat64 (&mMinX, file_id); + write_nfloat64 (&mMaxX, file_id); + write_nfloat64 (&mMinY, file_id); + write_nfloat64 (&mMaxY, file_id); + write_nfloat64 (&mOffsetPV, file_id); + write_nfloat64 (&mScalePV, file_id); headersize = lseek (file_id, 0, SEEK_CUR); lseek (file_id, 0, SEEK_SET); @@ -383,34 +432,21 @@ Array2dFile::arrayDataWrite (void) return (false); } + T** da = array.getArray(); + if (! da) + return (false); + lseek (file_id, headersize, SEEK_SET); - for (unsigned int ix = 0; ix < nx; ix++) - { - write (file_id, array->array_data[ix], ny * pixel_size); - } + for (unsigned int ix = 0; ix < mNX; ix++) + for (unsigned int iy = 0; iy < mNY; iy++) { + T value = da[ix][iy]; + ConvertReverseNetworkOrder (&value, sizeof(T)); + write (file_id, &value, mPixelSize); + } return (true); } -template -void -Array2dFile::fileClose (void) -{ - headerWrite (); - if (file_id >= 0 && array != NULL) { - arrayDataWrite (); - close (file_id); - file_id = -1; - } -} - -template -Array2dFile::~Array2dFile (void) -{ - fileClose (); -} - - template bool Array2dFile::arrayDataRead (void) @@ -420,11 +456,18 @@ Array2dFile::arrayDataRead (void) return (false); } + T** da = array.getArray(); + if (! da) + return (false); + lseek (file_id, headersize, SEEK_SET); - for (int ix = 0; ix < nx; ix++) - { - read (file_id, array->array_data[ix], ny * pixel_size); - } + T pixelBuffer; + for (int ix = 0; ix < mNX; ix++) + for (unsigned int iy = 0; iy < mNY; iy++) { + read (file_id, &pixelBuffer, mPixelSize); + ConvertReverseNetworkOrder (&pixelBuffer, sizeof(T)); + da[ix][iy] = pixelBuffer; + } return (true); } @@ -438,12 +481,12 @@ Array2dFile::labelSeek (unsigned int label_num) return (false); } - if (array == NULL) { // Could not have written data if array not allocated + if (array.getArray() == NULL) { // Could not have written data if array not allocated sys_error (ERR_WARNING, "array == NULL [labelSeek]"); return (false); } - off_t pos = headersize + array->sizeofArray(); + off_t pos = headersize + array.sizeofArray(); if (lseek (file_id, pos, SEEK_SET) != pos) { sys_error (ERR_WARNING, "Can't seek to end of data array"); return (false); @@ -482,20 +525,21 @@ Array2dFile::labelRead (Array2dFileLabel& label, unsigned int label_num) return (false); } - read_nint16 (&label.label_type, file_id); - read_nint16 (&label.year, file_id); - read_nint16 (&label.month, file_id); - read_nint16 (&label.day, file_id); - read_nint16 (&label.hour, file_id); - read_nint16 (&label.minute, file_id); - read_nint16 (&label.second, file_id); - read_nfloat64 (&label.calc_time, file_id); + read_nint16 (&label.m_labelType, file_id); + read_nint16 (&label.m_year, file_id); + read_nint16 (&label.m_month, file_id); + read_nint16 (&label.m_day, file_id); + read_nint16 (&label.m_hour, file_id); + read_nint16 (&label.m_minute, file_id); + read_nint16 (&label.m_second, file_id); + read_nfloat64 (&label.m_calcTime, file_id); kuint16 strlength; read_nint16 (&strlength, file_id); - char *str = new char [strlength+1]; + char str [strlength+1]; read (file_id, str, strlength); - label.label_str = str; + str[strlength] = 0; + label.m_strLabel = str; return (true); } @@ -523,17 +567,17 @@ Array2dFile::labelAdd (const Array2dFileLabel& label) { labelSeek (num_labels); - write_nint16 (&label.label_type, file_id); - write_nint16 (&label.year, file_id); - write_nint16 (&label.month, file_id); - write_nint16 (&label.day, file_id); - write_nint16 (&label.hour, file_id); - write_nint16 (&label.minute, file_id); - write_nint16 (&label.second, file_id); - write_nfloat64 (&label.calc_time, file_id); - kuint16 strlength = label.label_str.length(); + write_nint16 (&label.m_labelType, file_id); + write_nint16 (&label.m_year, file_id); + write_nint16 (&label.m_month, file_id); + write_nint16 (&label.m_day, file_id); + write_nint16 (&label.m_hour, file_id); + write_nint16 (&label.m_minute, file_id); + write_nint16 (&label.m_second, file_id); + write_nfloat64 (&label.m_calcTime, file_id); + kuint16 strlength = label.m_strLabel.length(); write_nint16 (&strlength, file_id); - write (file_id, static_cast(label.label_str.c_str()), strlength); + write (file_id, static_cast(label.m_strLabel.c_str()), strlength); num_labels++; @@ -541,69 +585,108 @@ Array2dFile::labelAdd (const Array2dFileLabel& label) fsync(file_id); } +template +void +Array2dFile::labelsCopy (Array2dFile& copyFile, const char* const idStr) +{ + string id = idStr; + for (int i = 0; i < copyFile.getNumLabels(); i++) { + Array2dFileLabel l; + copyFile.labelRead (l, i); + string lstr = l.getLabelString(); + lstr = idStr + lstr; + l.setLabelString (lstr); + labelAdd (l); + } +} + +template +void +Array2dFile::arrayDataClear (void) +{ + T** v = array.getArray(); + if (v) { + for (unsigned int ix = 0; ix < mNX; ix++) + for (unsigned int iy = 0; iy < mNY; iy++) + v[ix][iy] = 0; + } +} -#endif -#ifdef MPI_CT -#include +#ifdef HAVE_MPI +#include #endif -class F32Image +class F32Image : public Array2dFile { public: - Array2dFile adf; - - F32Image (const char* const fname, unsigned int nx, unsigned int ny) : adf (fname, nx, ny) + F32Image (const char* const fname, unsigned int nx, unsigned int ny) + : Array2dFile::Array2dFile (fname, nx, ny) { - adf.pixel_type = Array2dFile::FLOAT32; + setPixelType (FLOAT32); } - F32Image (unsigned int nx, unsigned int ny) : adf (nx, ny) + F32Image (unsigned int nx, unsigned int ny) + : Array2dFile::Array2dFile (nx, ny) { - adf.pixel_type = Array2dFile::FLOAT32; + setPixelType (FLOAT32); } - F32Image (const char* const fname) : adf (fname) + F32Image (const char* const fname) + : Array2dFile::Array2dFile (fname) { - adf.pixel_type = Array2dFile::FLOAT32; + setPixelType (FLOAT32); } -#ifdef MPI_CT - MPI_Datatype getMPIDataType (void) const - { return MPI_FLOAT; } +#ifdef HAVE_MPI + MPI::Datatype getMPIDataType (void) const + { return MPI::FLOAT; } #endif }; -class F64Image -{ -public: - Array2dFile adf; -#ifdef MPI_CT - MPI_Datatype getMPIDataType (void) const - { return MPI_DOUBLE; } -#endif +class F64Image : public Array2dFile +{ + public: - F64Image (const char* const fname, unsigned int nx, unsigned int ny) : adf (fname, nx, ny) + F64Image (const char* const fname, unsigned int nx, unsigned int ny) + : Array2dFile::Array2dFile (fname, nx, ny) { - adf.pixel_type = Array2dFile::FLOAT64; + setPixelType (FLOAT64); } - F64Image (unsigned int nx, unsigned int ny) : adf (nx, ny) + F64Image (unsigned int nx, unsigned int ny) + : Array2dFile::Array2dFile (nx, ny) { - adf.pixel_type = Array2dFile::FLOAT64; + setPixelType (FLOAT64); } - F64Image (const char* const fname) : adf (fname) + F64Image (const char* const fname) + : Array2dFile::Array2dFile (fname) { - adf.pixel_type = Array2dFile::FLOAT64; + setPixelType (FLOAT64); } + +#ifdef HAVE_MPI + MPI::Datatype getMPIDataType (void) const + { return MPI::DOUBLE; } +#endif }; +#define IMAGEFILE_64_BITS 1 +#ifdef IMAGEFILE_64_BITS typedef F64Image ImageFile; typedef kfloat64 ImageFileValue; typedef kfloat64* ImageFileColumn; typedef kfloat64** ImageFileArray; +#else +typedef F32Image ImageFile; +typedef kfloat32 ImageFileValue; +typedef kfloat32* ImageFileColumn; +typedef kfloat32** ImageFileArray; +#endif + +#endif