X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Farray2dfile.cpp;h=3a75f286bb4a53db8531671f75cad7869208fed0;hp=ca45d8b820eaea485272a6e6f824243c01ac0b89;hb=f13a8c004b8f182b42d9e4df2bcd7c7f030bf1ad;hpb=67a6c34b5a6f38d34e8cbe66091853f453fd2d7a diff --git a/libctsim/array2dfile.cpp b/libctsim/array2dfile.cpp index ca45d8b..3a75f28 100644 --- a/libctsim/array2dfile.cpp +++ b/libctsim/array2dfile.cpp @@ -1,15 +1,13 @@ /***************************************************************************** ** FILE IDENTIFICATION ** -** Name: array2dfile.cpp +** Name: array2dfile.cpp ** Purpose: 2-dimension array file class -** Programmer: Kevin Rosenberg -** Date Started: June 2000 +** Programmer: Kevin Rosenberg +** Date Started: June 2000 ** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg -** -** $Id: array2dfile.cpp,v 1.22 2000/12/29 19:30:08 kevin Exp $ +** Copyright (c) 1983-2009 Kevin Rosenberg ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -26,11 +24,12 @@ ******************************************************************************/ #include "array2dfile.h" -#include -#ifdef MSVC -typedef long off_t; +#include +#ifdef MSVC +typedef long off_t; #endif +#include const kuint16 Array2dFile::m_signature = ('I'*256+'F'); @@ -56,7 +55,7 @@ Array2dFileLabel::init (void) m_second = lt->tm_sec; } -Array2dFileLabel::Array2dFileLabel() +Array2dFileLabel::Array2dFileLabel() { init(); } @@ -65,7 +64,7 @@ Array2dFileLabel::Array2dFileLabel(const char* const str, double ctime) : m_strLabel (str) { init(); - + m_labelType = L_USER; m_calcTime = ctime; } @@ -74,7 +73,7 @@ Array2dFileLabel::Array2dFileLabel(const int type, const char* const str, double : m_strLabel (str) { init(); - + m_labelType = type; m_calcTime = ctime; } @@ -83,7 +82,7 @@ Array2dFileLabel::~Array2dFileLabel() { } -void +void Array2dFileLabel::setDateTime (int year, int month, int day, int hour, int minute, int second) { m_year = year; @@ -94,7 +93,7 @@ Array2dFileLabel::setDateTime (int year, int month, int day, int hour, int minut m_second = second; } -void +void Array2dFileLabel::getDateTime (int& year, int& month, int& day, int& hour, int& minute, int& second) const { year = m_year; @@ -105,11 +104,11 @@ Array2dFileLabel::getDateTime (int& year, int& month, int& day, int& hour, int& second = m_second; } -const std::string& +const std::string& Array2dFileLabel::getDateString (void) const { - char szDate [128]; - snprintf (szDate, sizeof(szDate), "%2d/%02d/%4d %02d:%02d:%02d", + char szDate [128]; + snprintf (szDate, sizeof(szDate), "%2d/%02d/%4d %02d:%02d:%02d", m_month + 1, m_day, m_year + 1900, m_hour, m_minute, m_second); m_strDate = szDate; return m_strDate; @@ -133,7 +132,7 @@ Array2dFileLabel::operator= (const Array2dFileLabel& rhs) m_strLabel = rhs.m_strLabel; m_year = rhs.m_year; m_month = rhs.m_month; m_day = rhs.m_day; m_hour = rhs.m_hour; m_minute = rhs.m_minute; m_second = rhs.m_second; - + return (*this); } @@ -154,6 +153,36 @@ Array2dFileLabel::print (std::ostream& os) const } } +void +Array2dFileLabel::printBrief (std::ostream& os) const +{ + if (m_labelType == L_HISTORY) { + os << "History ("; + if (m_calcTime > 0) + os << m_calcTime << " secs, "; + os << getDateString() << "): " << m_strLabel << std::endl; + } else if (m_labelType == L_USER) { + os << "Note (" << getDateString() << "): " << m_strLabel << std::endl; + } else { + os << "Unknown (" << getDateString() << "): " << m_strLabel << std::endl; + } +} + +void +Array2dFileLabel::printBrief (std::ostringstream& os) const +{ + if (m_labelType == L_HISTORY) { + os << "History ("; + if (m_calcTime > 0) + os << m_calcTime << " secs, "; + os << getDateString().c_str() << "): " << m_strLabel.c_str() << "\n"; + } else if (m_labelType == L_USER) { + os << "Note (" << getDateString() << "): " << m_strLabel << "\n"; + } else { + os << "Unknown (" << getDateString() << "): " << m_strLabel << "\n"; + } +} + /////////////////////////////////////////////////////////////////////////// // CLASS IMPLEMENTATION @@ -186,8 +215,8 @@ Array2dFile::init (void) { m_pixelSize = 0; m_pixelFormat = PIXEL_INVALID; - m_arrayData = NULL; - m_imaginaryArrayData = NULL; + m_arrayData = NULL; + m_imaginaryArrayData = NULL; m_dataType = DATA_TYPE_INVALID; m_nx = 0; m_ny = 0; @@ -205,7 +234,7 @@ void Array2dFile::setArraySize (int x, int y, int pixelSize, int pixelFormat, int dataType) { m_pixelSize = pixelSize; - m_pixelFormat = pixelFormat; + m_pixelFormat = pixelFormat; m_dataType = dataType; setArraySize (x, y); } @@ -216,78 +245,78 @@ Array2dFile::setArraySize (int x, int y) m_nx = x; m_ny = y; allocArrays (); -} - -bool -Array2dFile::reallocComplexToReal () -{ - if (m_dataType != DATA_TYPE_COMPLEX) - return false; - - freeArray (m_imaginaryArrayData); - m_dataType = DATA_TYPE_REAL; - - return true; -} - - -bool -Array2dFile::reallocRealToComplex () -{ - if (m_dataType != DATA_TYPE_REAL) - return false; - - allocArray (m_imaginaryArrayData); - m_dataType = DATA_TYPE_COMPLEX; - - return true; -} - - - -void +} + +bool +Array2dFile::reallocComplexToReal () +{ + if (m_dataType != DATA_TYPE_COMPLEX) + return false; + + freeArray (m_imaginaryArrayData); + m_dataType = DATA_TYPE_REAL; + + return true; +} + + +bool +Array2dFile::reallocRealToComplex () +{ + if (m_dataType != DATA_TYPE_REAL) + return false; + + allocArray (m_imaginaryArrayData); + m_dataType = DATA_TYPE_COMPLEX; + + return true; +} + + + +void Array2dFile::allocArrays () { - if (m_arrayData) - freeArray (m_arrayData); - if (m_imaginaryArrayData) - freeArray (m_imaginaryArrayData); - - allocArray (m_arrayData); - if (m_dataType == DATA_TYPE_COMPLEX) - allocArray (m_imaginaryArrayData); -} - -void -Array2dFile::allocArray (unsigned char**& rppData) -{ + if (m_arrayData) + freeArray (m_arrayData); + if (m_imaginaryArrayData) + freeArray (m_imaginaryArrayData); + + allocArray (m_arrayData); + if (m_dataType == DATA_TYPE_COMPLEX) + allocArray (m_imaginaryArrayData); +} + +void +Array2dFile::allocArray (unsigned char**& rppData) +{ m_arraySize = m_nx * m_ny * m_pixelSize; - rppData = new unsigned char* [m_nx]; + rppData = new unsigned char* [m_nx]; int columnBytes = m_ny * m_pixelSize; for (unsigned int i = 0; i < m_nx; i++) - rppData[i] = new unsigned char [columnBytes]; + rppData[i] = new unsigned char [columnBytes]; } -void +void Array2dFile::freeArrays () { - if (m_arrayData) - freeArray (m_arrayData); - - if (m_imaginaryArrayData) - freeArray (m_imaginaryArrayData); - -} - -void -Array2dFile::freeArray (unsigned char**& rppData) -{ - for (unsigned int i = 0; i < m_nx; i++) - delete rppData[i]; - delete rppData; - rppData = NULL; -} - + if (m_arrayData) + freeArray (m_arrayData); + + if (m_imaginaryArrayData) + freeArray (m_imaginaryArrayData); + +} + +void +Array2dFile::freeArray (unsigned char**& rppData) +{ + for (unsigned int i = 0; i < m_nx; i++) + delete rppData[i]; + delete rppData; + rppData = NULL; +} + bool Array2dFile::fileWrite (const std::string& filename) @@ -299,7 +328,7 @@ bool Array2dFile::fileWrite (const char* const filename) { m_filename = filename; - + frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::trunc | std::ios::binary); if (fs.fail()) { sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", m_filename.c_str()); @@ -307,13 +336,13 @@ Array2dFile::fileWrite (const char* const filename) } if (! headerWrite(fs)) return false; - + if (! arrayDataWrite (fs)) return false; - + if (! labelsWrite (fs)) return false; - + return true; } @@ -327,28 +356,25 @@ bool Array2dFile::fileRead (const char* const filename) { m_filename = filename; - -#ifdef MSVC - frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary); -#else - frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary | std::ios::nocreate); -#endif + + frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary); + if (fs.fail()) { sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", m_filename.c_str()); return false; } - + if (! headerRead(fs)) return false; - + allocArrays (); - + if (! arrayDataRead(fs)) return false;; - + if (! labelsRead (fs)) return false; - + return true; } @@ -360,7 +386,7 @@ Array2dFile::setAxisIncrement (double incX, double incY) m_axisIncrementY = incY; } -void +void Array2dFile::setAxisExtent (double minX, double maxX, double minY, double maxY) { m_axisExtentKnown = true; @@ -377,17 +403,17 @@ Array2dFile::headerRead (frnetorderstream& fs) sys_error (ERR_WARNING, "Tried to read header with file closed [headerRead]"); return false; } - + fs.seekg (0); kuint16 file_signature; - + fs.readInt16 (m_headersize); fs.readInt16 (file_signature); fs.readInt16 (m_pixelFormat); fs.readInt16 (m_pixelSize); fs.readInt16 (m_numFileLabels); fs.readInt32 (m_nx); - fs.readInt32 (m_ny); + fs.readInt32 (m_ny); fs.readInt16 (m_dataType); fs.readInt16 (m_axisIncrementKnown); fs.readFloat64 (m_axisIncrementX); @@ -399,7 +425,7 @@ Array2dFile::headerRead (frnetorderstream& fs) fs.readFloat64 (m_maxY); fs.readFloat64 (m_offsetPV); fs.readFloat64 (m_scalePV); - + int read_m_headersize = fs.tellg(); if (read_m_headersize != m_headersize) { sys_error (ERR_WARNING, "Read m_headersize %d != file m_headersize %d", read_m_headersize, m_headersize); @@ -409,8 +435,8 @@ Array2dFile::headerRead (frnetorderstream& fs) sys_error (ERR_WARNING, "File signature %d != true signature %d", file_signature, m_signature); return false; } - - return true; + + return ! fs.fail(); } @@ -421,9 +447,9 @@ Array2dFile::headerWrite (frnetorderstream& fs) sys_error (ERR_WARNING, "Tried to write header with ! fs"); return false; } - + m_numFileLabels = m_labels.size(); - + fs.seekp (0); fs.writeInt16 (m_headersize); fs.writeInt16 (m_signature); @@ -431,7 +457,7 @@ Array2dFile::headerWrite (frnetorderstream& fs) fs.writeInt16 (m_pixelSize); fs.writeInt16 (m_numFileLabels); fs.writeInt32 (m_nx); - fs.writeInt32 (m_ny); + fs.writeInt32 (m_ny); fs.writeInt16 (m_dataType); fs.writeInt16 (m_axisIncrementKnown); fs.writeFloat64 (m_axisIncrementX); @@ -443,12 +469,12 @@ Array2dFile::headerWrite (frnetorderstream& fs) fs.writeFloat64 (m_maxY); fs.writeFloat64 (m_offsetPV); fs.writeFloat64 (m_scalePV); - + m_headersize = static_cast(fs.tellp()); fs.seekp (0); fs.writeInt16 (m_headersize); - - return true; + + return ! fs.fail(); } @@ -459,37 +485,37 @@ Array2dFile::arrayDataWrite (frnetorderstream& fs) sys_error (ERR_WARNING, "Tried to arrayDataWrite with !fs"); return false; } - - if (! m_arrayData) + + if (! m_arrayData) return false; - + fs.seekp (m_headersize); int columnSize = m_ny * m_pixelSize; - for (unsigned int ix = 0; ix < m_nx; ix++) { - unsigned char* ptrColumn = m_arrayData[ix]; - if (NativeBigEndian()) { - for (unsigned int iy = 0; iy < m_ny; iy++) { - ConvertReverseNetworkOrder (ptrColumn, m_pixelSize); - fs.write (reinterpret_cast(ptrColumn), m_pixelSize); - ptrColumn += m_pixelSize; - } - } else - fs.write (reinterpret_cast(ptrColumn), columnSize); - } - if (m_dataType == DATA_TYPE_COMPLEX) { - for (unsigned int ix = 0; ix < m_nx; ix++) { - unsigned char* ptrColumn = m_imaginaryArrayData[ix]; - if (NativeBigEndian()) { - for (unsigned int iy = 0; iy < m_ny; iy++) { - ConvertReverseNetworkOrder (ptrColumn, m_pixelSize); - fs.write (reinterpret_cast(ptrColumn), m_pixelSize); - ptrColumn += m_pixelSize; - } - } else - fs.write (reinterpret_cast(ptrColumn), columnSize); - } - } - + for (unsigned int ix = 0; ix < m_nx; ix++) { + unsigned char* ptrColumn = m_arrayData[ix]; + if (NativeBigEndian()) { + for (unsigned int iy = 0; iy < m_ny; iy++) { + ConvertReverseNetworkOrder (ptrColumn, m_pixelSize); + fs.write (reinterpret_cast(ptrColumn), m_pixelSize); + ptrColumn += m_pixelSize; + } + } else + fs.write (reinterpret_cast(ptrColumn), columnSize); + } + if (m_dataType == DATA_TYPE_COMPLEX) { + for (unsigned int ix = 0; ix < m_nx; ix++) { + unsigned char* ptrColumn = m_imaginaryArrayData[ix]; + if (NativeBigEndian()) { + for (unsigned int iy = 0; iy < m_ny; iy++) { + ConvertReverseNetworkOrder (ptrColumn, m_pixelSize); + fs.write (reinterpret_cast(ptrColumn), m_pixelSize); + ptrColumn += m_pixelSize; + } + } else + fs.write (reinterpret_cast(ptrColumn), columnSize); + } + } + return true; } @@ -501,37 +527,37 @@ Array2dFile::arrayDataRead (frnetorderstream& fs) sys_error (ERR_WARNING, "Tried to arrayDataRead with ! fs"); return false; } - + if (! m_arrayData) return false; - + fs.seekg (m_headersize); int columnSize = m_ny * m_pixelSize; - for (unsigned int ix = 0; ix < m_nx; ix++) { - unsigned char* ptrColumn = m_arrayData[ix]; - if (NativeBigEndian()) { - for (unsigned int iy = 0; iy < m_ny; iy++) { - fs.read (reinterpret_cast(ptrColumn), m_pixelSize); - ConvertReverseNetworkOrder (ptrColumn, m_pixelSize); - ptrColumn += m_pixelSize; - } - } else - fs.read (reinterpret_cast(ptrColumn), columnSize); - } - if (m_dataType == DATA_TYPE_COMPLEX) { - for (unsigned int ix = 0; ix < m_nx; ix++) { - unsigned char* ptrColumn = m_imaginaryArrayData[ix]; - if (NativeBigEndian()) { - for (unsigned int iy = 0; iy < m_ny; iy++) { - fs.read (reinterpret_cast(ptrColumn), m_pixelSize); - ConvertReverseNetworkOrder (ptrColumn, m_pixelSize); - ptrColumn += m_pixelSize; - } - } else - fs.read (reinterpret_cast(ptrColumn), columnSize); - } - } - + for (unsigned int ix = 0; ix < m_nx; ix++) { + unsigned char* ptrColumn = m_arrayData[ix]; + if (NativeBigEndian()) { + for (unsigned int iy = 0; iy < m_ny; iy++) { + fs.read (reinterpret_cast(ptrColumn), m_pixelSize); + ConvertReverseNetworkOrder (ptrColumn, m_pixelSize); + ptrColumn += m_pixelSize; + } + } else + fs.read (reinterpret_cast(ptrColumn), columnSize); + } + if (m_dataType == DATA_TYPE_COMPLEX) { + for (unsigned int ix = 0; ix < m_nx; ix++) { + unsigned char* ptrColumn = m_imaginaryArrayData[ix]; + if (NativeBigEndian()) { + for (unsigned int iy = 0; iy < m_ny; iy++) { + fs.read (reinterpret_cast(ptrColumn), m_pixelSize); + ConvertReverseNetworkOrder (ptrColumn, m_pixelSize); + ptrColumn += m_pixelSize; + } + } else + fs.read (reinterpret_cast(ptrColumn), columnSize); + } + } + return true; } @@ -542,11 +568,11 @@ Array2dFile::labelsRead (frnetorderstream& fs) fs.seekg (pos); if (fs.fail()) return false; - + for (int i = 0; i < m_numFileLabels; i++) { kuint16 labelType, year, month, day, hour, minute, second; kfloat64 calcTime; - + fs.readInt16 (labelType); fs.readInt16 (year); fs.readInt16 (month); @@ -555,20 +581,20 @@ Array2dFile::labelsRead (frnetorderstream& fs) fs.readInt16 (minute); fs.readInt16 (second); fs.readFloat64 (calcTime); - + kuint16 strLength; fs.readInt16 (strLength); char* pszLabelStr = new char [strLength+1]; fs.read (pszLabelStr, strLength); pszLabelStr[strLength] = 0; - + Array2dFileLabel* pLabel = new Array2dFileLabel (labelType, pszLabelStr, calcTime); - delete pszLabelStr; - + delete pszLabelStr; + pLabel->setDateTime (year, month, day, hour, minute, second); - m_labels.push_back (pLabel); + m_labels.push_back (pLabel); } - + return true; } @@ -577,7 +603,7 @@ Array2dFile::labelsWrite (frnetorderstream& fs) { off_t pos = m_headersize + m_arraySize; fs.seekp (pos); - + for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) { const Array2dFileLabel& label = **l; kuint16 labelType = label.getLabelType(); @@ -585,11 +611,11 @@ Array2dFile::labelsWrite (frnetorderstream& fs) const char* const labelString = label.getLabelString().c_str(); int year, month, day, hour, minute, second; kuint16 yearBuf, monthBuf, dayBuf, hourBuf, minuteBuf, secondBuf; - + label.getDateTime (year, month, day, hour, minute, second); yearBuf = year; monthBuf = month; dayBuf = day; hourBuf = hour; minuteBuf = minute; secondBuf = second; - + fs.writeInt16 (labelType); fs.writeInt16 (yearBuf); fs.writeInt16 (monthBuf); @@ -602,7 +628,7 @@ Array2dFile::labelsWrite (frnetorderstream& fs) fs.writeInt16 (strlength); fs.write (labelString, strlength); } - + return true; } @@ -617,7 +643,7 @@ void Array2dFile::labelAdd (int type, const char* const lstr, double calc_time) { Array2dFileLabel label (type, lstr, calc_time); - + labelAdd (label); } @@ -626,12 +652,12 @@ void Array2dFile::labelAdd (const Array2dFileLabel& label) { Array2dFileLabel* pLabel = new Array2dFileLabel(label); - + m_labels.push_back (pLabel); } void -Array2dFile::labelsCopy (Array2dFile& copyFile, const char* const pszId) +Array2dFile::labelsCopy (const Array2dFile& copyFile, const char* const pszId) { std::string id; if (pszId) @@ -645,19 +671,19 @@ Array2dFile::labelsCopy (Array2dFile& copyFile, const char* const pszId) } } -void +void Array2dFile::arrayDataClear (void) { - if (m_arrayData) { - int columnSize = m_ny * m_pixelSize; - for (unsigned int ix = 0; ix < m_nx; ix++) - memset (m_arrayData[ix], 0, columnSize); - } - if (m_imaginaryArrayData) { - int columnSize = m_ny * m_pixelSize; - for (unsigned int ix = 0; ix < m_nx; ix++) - memset (m_arrayData[ix], 0, columnSize); - } + if (m_arrayData) { + int columnSize = m_ny * m_pixelSize; + for (unsigned int ix = 0; ix < m_nx; ix++) + memset (m_arrayData[ix], 0, columnSize); + } + if (m_imaginaryArrayData) { + int columnSize = m_ny * m_pixelSize; + for (unsigned int ix = 0; ix < m_nx; ix++) + memset (m_arrayData[ix], 0, columnSize); + } } void @@ -665,12 +691,32 @@ Array2dFile::printLabels (std::ostream& os) const { for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) { const Array2dFileLabel& label = **l; - + label.print (os); os << std::endl; } } +void +Array2dFile::printLabelsBrief (std::ostream& os) const +{ + for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) { + const Array2dFileLabel& label = **l; + + label.printBrief (os); + } +} + +void +Array2dFile::printLabelsBrief (std::ostringstream& os) const +{ + for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) { + const Array2dFileLabel& label = **l; + + label.printBrief (os); + } +} + const Array2dFileLabel& Array2dFile::labelGet (int i) const