r319: add complex-valued imagefile support
authorKevin M. Rosenberg <kevin@rosenberg.net>
Fri, 29 Dec 2000 19:30:08 +0000 (19:30 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Fri, 29 Dec 2000 19:30:08 +0000 (19:30 +0000)
12 files changed:
ChangeLog
include/array2dfile.h
include/imagefile.h
libctsim/array2dfile.cpp
libctsim/imagefile.cpp
msvc/ctsim/ctsim.dsp
msvc/ctsim/ctsim.plg
src/ctsim.h
src/views.cpp
src/views.h
tools/if1.cpp
tools/ifinfo.cpp

index 91c26bc..029264e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
 TODO
        Read PlotFile's.
-
+       Add to ctsim export of imagefiles to standard graphic formats.
+       Use FFTW library in imagefile.cpp
        
 3.0alpha1 - Released 12/30/00
 
@@ -15,14 +16,19 @@ TODO
        files.
 
        * ctsim: Added "Process" menu to image file display with math
-       functions. Added 2-dimensional inverse Fourier to math functions.
+       functions. Added 2-dimensional inverse Fourier to math
+       functions. Added support for complex (real/imaginary) images.
 
        * mathfuncs.cpp: Reworked statistics algorithm to share between
        imagefile and plotfile classes.
 
        * imagefile.cpp: Fixed scaling bug when rasterizing Phantom with
        nsamples > 2.  Added generic mage math functions, moved from
-       if1.cpp and if2.cpp to imagefile.cpp
+       if1.cpp and if2.cpp to imagefile.cpp. Added support complex
+       images.
+
+       * array2dfile.cpp: Added code to support complex (real/imaginary)
+       images.
 
        * if1: Updated to handle error conditions, such as sqrt of a
        negative number. Converted to use new ImageFile math functions.
index 21023dc..754ad93 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: array2dfile.h,v 1.12 2000/12/16 06:12:47 kevin Exp $
+**  $Id: array2dfile.h,v 1.13 2000/12/29 19:30:08 kevin Exp $
 **
 **  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
@@ -125,12 +125,18 @@ public:
     PIXEL_FLOAT32 = 7,
     PIXEL_FLOAT64 = 8,
   };
-
-  Array2dFile (int nx, int ny, int pixelSize, int pixelFormat = PIXEL_INVALID);
+\r
+  enum {\r
+    DATA_TYPE_INVALID = 0,\r
+    DATA_TYPE_REAL,\r
+    DATA_TYPE_COMPLEX,\r
+  };\r
+
+  Array2dFile (int nx, int ny, int pixelSize, int pixelFormat = PIXEL_INVALID, int dataType = DATA_TYPE_REAL);
   Array2dFile (void);
   ~Array2dFile ();
 
-  void setArraySize (int nx, int ny, int pixelSize, int pixelFormat = PIXEL_INVALID);
+  void setArraySize (int nx, int ny, int pixelSize, int pixelFormat = PIXEL_INVALID, int dataType = DATA_TYPE_REAL);
 
   void setArraySize (int nx, int ny);
 
@@ -158,12 +164,21 @@ public:
 
   kuint32 ny (void) const
       { return m_ny; }
+\r
+  int dataType () const\r
+  { return static_cast<int>(m_dataType); }\r
+\r
+  void setDataType (int dataType)\r
+  { m_dataType = dataType; }\r
 
   void setAxisIncrement (double axisIncX, double axisIncY);
 
-  void setAxisExtent (double minX, double maxX, double minY, double maxY);
+  bool reallocRealToComplex ();\r
+\r
+  bool reallocComplexToReal ();\r
 
-  void getPixelValueRange (double& pvmin, double& pvmax) const;
+  void getPixelValueRange (double& pvmin, double& pvmax) const;\r
+  void setAxisExtent (double minX, double maxX, double minY, double maxY);
       
   void doPixelOffsetScale (double offset, double scale);
 
@@ -203,8 +218,10 @@ public:
   kuint32 m_ny;
   kuint32 m_arraySize;
   labelContainer m_labels;
-  kuint16 m_numFileLabels;
+  kuint16 m_numFileLabels;\r
+  kuint16 m_dataType;
   unsigned char** m_arrayData;
+  unsigned char** m_imaginaryArrayData;\r
 
 private:
   void init (void);
@@ -223,9 +240,11 @@ private:
 
   bool labelSeek (int label_num);
 
-  void allocArray (void);
-  
-  void freeArray (void);
+  void allocArrays ();
+  void freeArrays ();
+\r
+  void allocArray (unsigned char**& rppData);\r
+  void freeArray (unsigned char**& rppData);\r
 
   Array2dFile (const Array2dFile& rhs);        // copy constructor
   Array2dFile& operator= (const Array2dFile&); // assignment operator
index 7c7daba..57d093f 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: imagefile.h,v 1.24 2000/12/29 15:45:06 kevin Exp $
+**  $Id: imagefile.h,v 1.25 2000/12/29 19:30:08 kevin Exp $
 **
 **  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
 class F32Image : public Array2dFile
 {
 public:
-  F32Image (int nx, int ny);     
+  F32Image (int nx, int ny, int dataType = Array2dFile::DATA_TYPE_REAL);     
   F32Image (void);\r
 
-  kfloat32** getArray (void)
-      { return (kfloat32**) (m_arrayData); }
-
-  kfloat32** const getArray (void) const
-       { return (kfloat32** const) (m_arrayData); }
-
+  kfloat32** getArray (void)\r
+      { return (kfloat32**) (m_arrayData); }\r
+\r
+  kfloat32** const getArray (void) const\r
+       { return (kfloat32** const) (m_arrayData); }\r
+\r
+  kfloat32** getImaginaryArray (void)\r
+      { return (kfloat32**) (m_imaginaryArrayData); }\r
+\r
+  kfloat32** const getImaginaryArray (void) const\r
+       { return (kfloat32** const) (m_imaginaryArrayData); }\r
+\r
 #ifdef HAVE_MPI
   MPI::Datatype getMPIDataType (void) const
       { return MPI::FLOAT; }
@@ -70,15 +76,21 @@ class F64Image : public Array2dFile
 {
  public:
 
-  F64Image (int nx, int ny);
+   F64Image (int nx, int ny, int dataType = Array2dFile::DATA_TYPE_REAL);
   F64Image (void);
 
-  kfloat64** getArray (void)
-      { return (kfloat64**) (m_arrayData); }
-
-  kfloat64** const getArray (void) const
-      { return (kfloat64** const) (m_arrayData); }
-
+  kfloat64** getArray (void)\r
+      { return (kfloat64**) (m_arrayData); }\r
+\r
+  kfloat64** const getArray (void) const\r
+      { return (kfloat64** const) (m_arrayData); }\r
+\r
+  kfloat64** getImaginaryArray (void)\r
+      { return (kfloat64**) (m_imaginaryArrayData); }\r
+\r
+  kfloat64** const getImaginaryArray (void) const\r
+      { return (kfloat64** const) (m_imaginaryArrayData); }\r
+\r
 #ifdef HAVE_MPI
   MPI::Datatype getMPIDataType (void) const
       { return MPI::DOUBLE; }
@@ -116,10 +128,14 @@ class ImageFile : public ImageFileBase
   ImageFile (void)
       : ImageFileBase ()
   {}
+\r
+  bool convertRealToComplex ();\r
+  bool convertComplexToReal ();\r
 
   void filterResponse (const char* const domainName, double bw, const char* const filterName, double filt_param);
 
-  void statistics (double& min, double& max, double& mean, double& mode, double& median, double& stddev) const;
+  void statistics (double& min, double& max, double& mean, double& mode, double& median, double& stddev) const;\r
+  void statistics (ImageFileArrayConst& v, double& min, double& max, double& mean, double& mode, double& median, double& stddev) const;\r
   void getMinMax (double& min, double& max) const;
   void printStatistics (std::ostream& os) const;
   bool comparativeStatistics (const ImageFile& imComp, double& d, double& r, double& e) const;
@@ -135,8 +151,10 @@ class ImageFile : public ImageFileBase
   bool square (ImageFile& result) const;\r
   bool log (ImageFile& result) const;\r
   bool exp (ImageFile& result) const;\r
-  bool FFTMagnitude (ImageFile& result) const;\r
-  bool FFTPhase (ImageFile& result) const;\r
+  bool fourier (ImageFile& result) const;\r
+  bool inverseFourier (ImageFile& result) const;\r
+  bool magnitude (ImageFile& result) const;\r
+  bool phase (ImageFile& result) const;\r
 \r
   int display (void) const;
   int displayScaling (const int scaleFactor, ImageFileValue pmin, ImageFileValue pmax) const;
index 6c400ad..ca45d8b 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: array2dfile.cpp,v 1.21 2000/12/16 06:12:47 kevin Exp $
+**  $Id: array2dfile.cpp,v 1.22 2000/12/29 19:30:08 kevin Exp $
 **
 **  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
@@ -44,39 +44,39 @@ const kuint16 Array2dFile::m_signature = ('I'*256+'F');
 void
 Array2dFileLabel::init (void)
 {
-    m_calcTime = 0;
-    m_labelType = L_EMPTY;
-    time_t t = time(0);
-    tm* lt = localtime(&t);
-    m_year = lt->tm_year;
-    m_month = lt->tm_mon;
-    m_day = lt->tm_mday;
-    m_hour = lt->tm_hour;
-    m_minute = lt->tm_min;
-    m_second = lt->tm_sec;
+  m_calcTime = 0;
+  m_labelType = L_EMPTY;
+  time_t t = time(0);
+  tm* lt = localtime(&t);
+  m_year = lt->tm_year;
+  m_month = lt->tm_mon;
+  m_day = lt->tm_mday;
+  m_hour = lt->tm_hour;
+  m_minute = lt->tm_min;
+  m_second = lt->tm_sec;
 }
 
 Array2dFileLabel::Array2dFileLabel() 
 {
-    init();
+  init();
 }
 
 Array2dFileLabel::Array2dFileLabel(const char* const str, double ctime)
-    : m_strLabel (str)
+: m_strLabel (str)
 {
-    init();
-
-    m_labelType = L_USER;
-    m_calcTime = ctime;
+  init();
+  
+  m_labelType = L_USER;
+  m_calcTime = ctime;
 }
 
 Array2dFileLabel::Array2dFileLabel(const int type, const char* const str, double ctime)
-  :  m_strLabel (str)
+:  m_strLabel (str)
 {
-    init();
-
-    m_labelType = type;
-    m_calcTime = ctime;
+  init();
+  
+  m_labelType = type;
+  m_calcTime = ctime;
 }
 
 Array2dFileLabel::~Array2dFileLabel()
@@ -110,7 +110,7 @@ Array2dFileLabel::getDateString (void) const
 {
   char szDate [128];\r
   snprintf (szDate, sizeof(szDate), "%2d/%02d/%4d %02d:%02d:%02d",\r
-         m_month + 1, m_day, m_year + 1900, m_hour, m_minute, m_second);
+    m_month + 1, m_day, m_year + 1900, m_hour, m_minute, m_second);
   m_strDate = szDate;
   return m_strDate;
 }
@@ -118,30 +118,30 @@ Array2dFileLabel::getDateString (void) const
 
 Array2dFileLabel::Array2dFileLabel (const Array2dFileLabel& rhs)
 {
-    m_calcTime = rhs.m_calcTime;
-    m_labelType = rhs.m_labelType;
-    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;
+  m_calcTime = rhs.m_calcTime;
+  m_labelType = rhs.m_labelType;
+  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;
 }
 
 Array2dFileLabel&
 Array2dFileLabel::operator= (const Array2dFileLabel& rhs)
 {
-    m_calcTime = rhs.m_calcTime;
-    m_labelType = rhs.m_labelType;
-    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);
+  m_calcTime = rhs.m_calcTime;
+  m_labelType = rhs.m_labelType;
+  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);
 }
 
 void
 Array2dFileLabel::print (std::ostream& os) const
 {
   if (m_labelType == L_HISTORY) {
-         os << "History: " << std::endl;
+    os << "History: " << std::endl;
     os << "  " << m_strLabel << std::endl;
     os << "  calc time = " << m_calcTime << " secs" << std::endl;
     os << "  Timestamp = " << getDateString() << std::endl;
@@ -163,22 +163,22 @@ Array2dFileLabel::print (std::ostream& os) const
 ///////////////////////////////////////////////////////////////////////////
 
 
-Array2dFile::Array2dFile (int x, int y, int pixelSize, int pixelFormat)
+Array2dFile::Array2dFile (int x, int y, int pixelSize, int pixelFormat, int dataType)
 {
-    init();
-    setArraySize (x, y, pixelSize, pixelFormat);
+  init();
+  setArraySize (x, y, pixelSize, pixelFormat, dataType);
 }
 
 Array2dFile::~Array2dFile (void)
 {
-    freeArray ();
-    for (labelIterator l = m_labels.begin(); l != m_labels.end(); l++)
-      delete *l;
+  freeArrays ();
+  for (labelIterator l = m_labels.begin(); l != m_labels.end(); l++)
+    delete *l;
 }
 
 Array2dFile::Array2dFile (void)
 {
-    init();
+  init();
 }
 
 void
@@ -186,7 +186,9 @@ Array2dFile::init (void)
 {
   m_pixelSize = 0;
   m_pixelFormat = PIXEL_INVALID;
-  m_arrayData = NULL;
+  m_arrayData = NULL;\r
+  m_imaginaryArrayData = NULL;\r
+  m_dataType = DATA_TYPE_INVALID;
   m_nx = 0;
   m_ny = 0;
   m_headersize = 0;
@@ -200,45 +202,92 @@ Array2dFile::init (void)
 
 
 void
-Array2dFile::setArraySize (int x, int y, int pixelSize, int pixelFormat)
+Array2dFile::setArraySize (int x, int y, int pixelSize, int pixelFormat, int dataType)
 {
-    m_pixelSize = pixelSize;
-    m_pixelFormat = pixelFormat;
-    setArraySize (x, y);
+  m_pixelSize = pixelSize;
+  m_pixelFormat = pixelFormat;\r
+  m_dataType = dataType;
+  setArraySize (x, y);
 }
 
 void
 Array2dFile::setArraySize (int x, int y)
 {
-    m_nx = x;
-    m_ny = y;
-    allocArray ();
-}
+  m_nx = x;
+  m_ny = y;
+  allocArrays ();
+}\r
+\r
+bool\r
+Array2dFile::reallocComplexToReal ()\r
+{\r
+  if (m_dataType != DATA_TYPE_COMPLEX)\r
+    return false;\r
+\r
+  freeArray (m_imaginaryArrayData);\r
+  m_dataType = DATA_TYPE_REAL;\r
+\r
+  return true;\r
+}\r
+\r
+\r
+bool\r
+Array2dFile::reallocRealToComplex ()\r
+{\r
+  if (m_dataType != DATA_TYPE_REAL)\r
+    return false;\r
+\r
+  allocArray (m_imaginaryArrayData);\r
+  m_dataType = DATA_TYPE_COMPLEX;\r
+\r
+  return true;\r
+}\r
+\r
+
 
 void 
-Array2dFile::allocArray (void)
+Array2dFile::allocArrays ()
 {
-    if (m_arrayData)
-       freeArray();
-
-    m_arraySize = m_nx * m_ny * m_pixelSize;
-    m_arrayData = new unsigned char* [m_nx];
-    
-    int columnBytes = m_ny * m_pixelSize;
-    for (unsigned int i = 0; i < m_nx; i++)
-       m_arrayData[i] = new unsigned char [columnBytes];
+  if (m_arrayData) \r
+    freeArray (m_arrayData);\r
+  if (m_imaginaryArrayData)\r
+    freeArray (m_imaginaryArrayData);\r
+\r
+  allocArray (m_arrayData);\r
+  if (m_dataType == DATA_TYPE_COMPLEX)\r
+    allocArray (m_imaginaryArrayData);\r
+}\r
+\r
+void\r
+Array2dFile::allocArray (unsigned char**& rppData)\r
+{\r
+  m_arraySize = m_nx * m_ny * m_pixelSize;
+  rppData = new unsigned char* [m_nx];\r
+  int columnBytes = m_ny * m_pixelSize;
+  for (unsigned int i = 0; i < m_nx; i++)
+    rppData[i] = new unsigned char [columnBytes];\r
 }
 
 void 
-Array2dFile::freeArray (void)
-{
-    if (m_arrayData) {
-       for (unsigned int i = 0; i < m_nx; i++)
-           delete m_arrayData[i];
-       delete m_arrayData;
-       m_arrayData = NULL;
-    }
-}
+Array2dFile::freeArrays ()
+{
+  if (m_arrayData) \r
+    freeArray (m_arrayData);\r
+  \r
+  if (m_imaginaryArrayData) \r
+    freeArray (m_imaginaryArrayData);\r
+  \r
+}\r
+\r
+void\r
+Array2dFile::freeArray (unsigned char**& rppData)\r
+{\r
+   for (unsigned int i = 0; i < m_nx; i++)\r
+      delete rppData[i];\r
+    delete rppData;\r
+    rppData = NULL;\r
+}\r
+\r
 
 bool
 Array2dFile::fileWrite (const std::string& filename)
@@ -249,23 +298,23 @@ Array2dFile::fileWrite (const std::string& filename)
 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());
-      return false;
-    }
-    if (! headerWrite(fs))
-       return false;
-    
-    if (! arrayDataWrite (fs))
-       return false;
-    
-    if (! labelsWrite (fs))
-       return false;
-
-    return true;
+  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());
+    return false;
+  }
+  if (! headerWrite(fs))
+    return false;
+  
+  if (! arrayDataWrite (fs))
+    return false;
+  
+  if (! labelsWrite (fs))
+    return false;
+  
+  return true;
 }
 
 bool
@@ -277,30 +326,30 @@ Array2dFile::fileRead (const std::string& filename)
 bool
 Array2dFile::fileRead (const char* const filename)
 {
-    m_filename = filename;
-
+  m_filename = filename;
+  
 #ifdef MSVC\r
-    frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary);\r
+  frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary);\r
 #else\r
-    frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary | std::ios::nocreate);\r
+  frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary | std::ios::nocreate);\r
 #endif\r
-    if (fs.fail()) {
-      sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", m_filename.c_str());
-      return false;
-    }
-
-    if (! headerRead(fs))
-      return false;
-    
-    allocArray ();
-    
-    if (! arrayDataRead(fs))
-      return false;;
-
-    if (! labelsRead (fs))
-      return false;
-    
-    return true;
+  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;
 }
 
 void
@@ -314,11 +363,11 @@ Array2dFile::setAxisIncrement (double incX, double incY)
 void 
 Array2dFile::setAxisExtent (double minX, double maxX, double minY, double maxY)
 {
-    m_axisExtentKnown = true;
-    m_minX = minX;
-    m_maxY = maxX;
-    m_minX = minX;
-    m_maxY = maxY;
+  m_axisExtentKnown = true;
+  m_minX = minX;
+  m_maxY = maxX;
+  m_minX = minX;
+  m_maxY = maxY;
 }
 
 bool
@@ -328,17 +377,18 @@ 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);\r
+  fs.readInt16 (m_dataType);
   fs.readInt16 (m_axisIncrementKnown);
   fs.readFloat64 (m_axisIncrementX);
   fs.readFloat64 (m_axisIncrementY);
@@ -349,7 +399,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);
@@ -359,7 +409,7 @@ Array2dFile::headerRead (frnetorderstream& fs)
     sys_error (ERR_WARNING, "File signature %d != true signature %d", file_signature, m_signature);
     return false;
   }
-
+  
   return true;
 }
 
@@ -371,9 +421,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);
@@ -381,7 +431,8 @@ Array2dFile::headerWrite (frnetorderstream& fs)
   fs.writeInt16 (m_pixelSize);
   fs.writeInt16 (m_numFileLabels);
   fs.writeInt32 (m_nx);
-  fs.writeInt32 (m_ny);
+  fs.writeInt32 (m_ny);\r
+  fs.writeInt16 (m_dataType);
   fs.writeInt16 (m_axisIncrementKnown);
   fs.writeFloat64 (m_axisIncrementX);
   fs.writeFloat64 (m_axisIncrementY);
@@ -392,7 +443,7 @@ Array2dFile::headerWrite (frnetorderstream& fs)
   fs.writeFloat64 (m_maxY);
   fs.writeFloat64 (m_offsetPV);
   fs.writeFloat64 (m_scalePV);
-
+  
   m_headersize = static_cast<kuint16>(fs.tellp());
   fs.seekp (0);
   fs.writeInt16 (m_headersize);
@@ -408,24 +459,37 @@ Array2dFile::arrayDataWrite (frnetorderstream& fs)
     sys_error (ERR_WARNING, "Tried to arrayDataWrite with !fs");
     return false;
   }
-
+  
   if (! m_arrayData) 
-      return false;
-
+    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<const char*>(ptrColumn), m_pixelSize);
-             ptrColumn += m_pixelSize;
-         }
-      } else 
-         fs.write (reinterpret_cast<const char*>(ptrColumn), columnSize);
-  }
-
+  for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+    unsigned char* ptrColumn = m_arrayData[ix];\r
+    if (NativeBigEndian()) {\r
+      for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+        ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+        fs.write (reinterpret_cast<const char*>(ptrColumn), m_pixelSize);\r
+        ptrColumn += m_pixelSize;\r
+      }\r
+    } else \r
+      fs.write (reinterpret_cast<const char*>(ptrColumn), columnSize);\r
+  }\r
+  if (m_dataType == DATA_TYPE_COMPLEX) {\r
+    for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+      unsigned char* ptrColumn = m_imaginaryArrayData[ix];\r
+      if (NativeBigEndian()) {\r
+        for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+          ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+          fs.write (reinterpret_cast<const char*>(ptrColumn), m_pixelSize);\r
+          ptrColumn += m_pixelSize;\r
+        }\r
+      } else \r
+        fs.write (reinterpret_cast<const char*>(ptrColumn), columnSize);\r
+    }\r
+  }\r
+  
   return true;
 }
 
@@ -437,96 +501,109 @@ Array2dFile::arrayDataRead (frnetorderstream& fs)
     sys_error (ERR_WARNING, "Tried to arrayDataRead with ! fs");
     return false;
   }
-
+  
   if (! m_arrayData)
-      return false;
-
+    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<char*>(ptrColumn), m_pixelSize);
-             ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);
-             ptrColumn += m_pixelSize;
-         } 
-      } else
-         fs.read (reinterpret_cast<char*>(ptrColumn), columnSize);
-  }
-
+  for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+    unsigned char* ptrColumn = m_arrayData[ix];\r
+    if (NativeBigEndian()) {\r
+      for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+        fs.read (reinterpret_cast<char*>(ptrColumn), m_pixelSize);\r
+        ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+        ptrColumn += m_pixelSize;\r
+      } \r
+    } else\r
+      fs.read (reinterpret_cast<char*>(ptrColumn), columnSize);\r
+  }\r
+  if (m_dataType == DATA_TYPE_COMPLEX) {\r
+    for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+      unsigned char* ptrColumn = m_imaginaryArrayData[ix];\r
+      if (NativeBigEndian()) {\r
+        for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+          fs.read (reinterpret_cast<char*>(ptrColumn), m_pixelSize);\r
+          ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+          ptrColumn += m_pixelSize;\r
+        } \r
+      } else\r
+        fs.read (reinterpret_cast<char*>(ptrColumn), columnSize);\r
+    }\r
+  }\r
+  
   return true;
 }
 
 bool
 Array2dFile::labelsRead (frnetorderstream& fs)
 {
-    off_t pos = m_headersize + m_arraySize;
-    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);
-       fs.readInt16 (day);
-       fs.readInt16 (hour);
-       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;\r
-\r
-       pLabel->setDateTime (year, month, day, hour, minute, second);
-       m_labels.push_back (pLabel);\r
-    }
-
-    return true;
+  off_t pos = m_headersize + m_arraySize;
+  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);
+    fs.readInt16 (day);
+    fs.readInt16 (hour);
+    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;\r
+    \r
+    pLabel->setDateTime (year, month, day, hour, minute, second);
+    m_labels.push_back (pLabel);\r
+  }
+  
+  return true;
 }
 
 bool
 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();
-       kfloat64 calcTime = label.getCalcTime();
-       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);
-       fs.writeInt16 (dayBuf);
-       fs.writeInt16 (hourBuf);
-       fs.writeInt16 (minuteBuf);
-       fs.writeInt16 (secondBuf);
-       fs.writeFloat64 (calcTime);
-       kuint16 strlength = strlen (labelString);
-       fs.writeInt16 (strlength);
-       fs.write (labelString, strlength);
-    }
-
-    return true;
+  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();
+    kfloat64 calcTime = label.getCalcTime();
+    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);
+    fs.writeInt16 (dayBuf);
+    fs.writeInt16 (hourBuf);
+    fs.writeInt16 (minuteBuf);
+    fs.writeInt16 (secondBuf);
+    fs.writeFloat64 (calcTime);
+    kuint16 strlength = strlen (labelString);
+    fs.writeInt16 (strlength);
+    fs.write (labelString, strlength);
+  }
+  
+  return true;
 }
 
 void
@@ -540,7 +617,7 @@ void
 Array2dFile::labelAdd (int type, const char* const lstr, double calc_time)
 {
   Array2dFileLabel label (type, lstr, calc_time);
-
+  
   labelAdd (label);
 }
 
@@ -548,45 +625,50 @@ Array2dFile::labelAdd (int type, const char* const lstr, double calc_time)
 void
 Array2dFile::labelAdd (const Array2dFileLabel& label)
 {
-    Array2dFileLabel* pLabel = new Array2dFileLabel(label);
-
-    m_labels.push_back (pLabel);
+  Array2dFileLabel* pLabel = new Array2dFileLabel(label);
+  
+  m_labels.push_back (pLabel);
 }
 
 void
 Array2dFile::labelsCopy (Array2dFile& copyFile, const char* const pszId)
 {
-       std::string id;
-    if (pszId)
-      id = pszId;
-    for (unsigned int i = 0; i < copyFile.getNumLabels(); i++) {
-      Array2dFileLabel l (copyFile.labelGet (i));
-         std::string lstr = l.getLabelString();
-      lstr = id + lstr;
-      l.setLabelString (lstr);
-      labelAdd (l);
-    }
+  std::string id;
+  if (pszId)
+    id = pszId;
+  for (unsigned int i = 0; i < copyFile.getNumLabels(); i++) {
+    Array2dFileLabel l (copyFile.labelGet (i));
+    std::string lstr = l.getLabelString();
+    lstr = id + lstr;
+    l.setLabelString (lstr);
+    labelAdd (l);
+  }
 }
 
 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_arrayData) {\r
+    int columnSize = m_ny * m_pixelSize;\r
+    for (unsigned int ix = 0; ix < m_nx; ix++)\r
+      memset (m_arrayData[ix], 0, columnSize);\r
+  }\r
+  if (m_imaginaryArrayData) {\r
+    int columnSize = m_ny * m_pixelSize;\r
+    for (unsigned int ix = 0; ix < m_nx; ix++)\r
+      memset (m_arrayData[ix], 0, columnSize);\r
+  }\r
 }
 
 void
 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;
-    }
+  for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) {
+    const Array2dFileLabel& label = **l;
+    
+    label.print (os);
+    os << std::endl;
+  }
 }
 
 
index 54f38a1..84c6674 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: imagefile.cpp,v 1.25 2000/12/29 15:45:06 kevin Exp $
+**  $Id: imagefile.cpp,v 1.26 2000/12/29 19:30:08 kevin Exp $
 **
 **  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
@@ -28,8 +28,8 @@
 #include "ct.h"
 
 
-F32Image::F32Image (int nx, int ny)\r
-: Array2dFile (nx, ny, sizeof(kfloat32), Array2dFile::PIXEL_FLOAT32)\r
+F32Image::F32Image (int nx, int ny, int dataType)\r
+: Array2dFile (nx, ny, sizeof(kfloat32), Array2dFile::PIXEL_FLOAT32, dataType)\r
 {\r
 }\r
 \r
@@ -38,10 +38,11 @@ F32Image::F32Image (void)
 {\r
        setPixelFormat (Array2dFile::PIXEL_FLOAT32);\r
        setPixelSize (sizeof(kfloat32));\r
+  setDataType (Array2dFile::DATA_TYPE_REAL);\r
 }\r
 \r
-F64Image::F64Image (int nx, int ny)\r
-: Array2dFile (nx, ny, sizeof(kfloat64), Array2dFile::PIXEL_FLOAT64)\r
+F64Image::F64Image (int nx, int ny, int dataType)\r
+: Array2dFile (nx, ny, sizeof(kfloat64), Array2dFile::PIXEL_FLOAT64, dataType)\r
 {\r
 }\r
 \r
@@ -50,6 +51,7 @@ F64Image::F64Image (void)
 {\r
        setPixelFormat (PIXEL_FLOAT64);\r
        setPixelSize (sizeof(kfloat64));\r
+  setDataType (Array2dFile::DATA_TYPE_REAL);\r
 }\r
 
 void 
@@ -212,26 +214,46 @@ ImageFile::printStatistics (std::ostream& os) const
 {
     double min, max, mean, mode, median, stddev;
        
-    statistics (min, max, mean, mode, median, stddev);
-       
+    statistics (min, max, mean, mode, median, stddev);\r
+    if (dataType() == Array2dFile::DATA_TYPE_COMPLEX)\r
+      os << "Real Component Statistics" << std::endl;\r
+
     os << "   min: " << min << std::endl;
     os << "   max: " << max << std::endl;
     os << "  mean: " << mean << std::endl;
     os << "  mode: " << mode << std::endl;
     os << "median: " << median << std::endl;
-    os << "stddev: " << stddev << std::endl;
+    os << "stddev: " << stddev << std::endl;\r
+\r
+    if (dataType() == Array2dFile::DATA_TYPE_COMPLEX) {\r
+      statistics (getImaginaryArray(), min, max, mean, mode, median, stddev);\r
+      os << std::endl << "Imaginary Component Statistics" << std::endl;
+    os << "   min: " << min << std::endl;\r
+    os << "   max: " << max << std::endl;\r
+    os << "  mean: " << mean << std::endl;\r
+    os << "  mode: " << mode << std::endl;\r
+    os << "median: " << median << std::endl;\r
+    os << "stddev: " << stddev << std::endl;\r
+    }\r
 }
 
 
 void
 ImageFile::statistics (double& min, double& max, double& mean, double& mode, double& median, double& stddev) const
-{
-    int nx = m_nx;
-    int ny = m_ny;
-    ImageFileArrayConst v = getArray();
-    
-    if (v == NULL || nx == 0 || ny == 0)
-               return;
+{\r
+  ImageFileArrayConst v = getArray();\r
+  statistics (v, min, max, mean, mode, median, stddev);\r
+}
+
+
+void\r
+ImageFile::statistics (ImageFileArrayConst& v, double& min, double& max, double& mean, double& mode, double& median, double& stddev) const\r
+{\r
+    int nx = m_nx;\r
+    int ny = m_ny;\r
+    \r
+    if (v == NULL || nx == 0 || ny == 0)\r
+               return;\r
 \r
        std::vector<double> vecImage;\r
        int iVec = 0;\r
@@ -242,9 +264,8 @@ ImageFile::statistics (double& min, double& max, double& mean, double& mode, dou
        }\r
 \r
        vectorNumericStatistics (vecImage, nx * ny, min, max, mean, mode, median, stddev);\r
-}
-
-
+}\r
+\r
 void
 ImageFile::getMinMax (double& min, double& max) const
 {
@@ -267,6 +288,46 @@ ImageFile::getMinMax (double& min, double& max) const
     }
 }
 \r
+bool\r
+ImageFile::convertRealToComplex ()\r
+{\r
+  if (dataType() != Array2dFile::DATA_TYPE_REAL)\r
+    return false;\r
+\r
+  if (! reallocRealToComplex())\r
+    return false;\r
+\r
+  ImageFileArray vImag = getImaginaryArray();\r
+  for (int ix = 0; ix < m_nx; ix++) {\r
+    ImageFileColumn vCol = vImag[ix];\r
+    for (int iy = 0; iy < m_ny; iy++)\r
+      *vCol++ = 0;\r
+  }\r
+\r
+  return true;\r
+}\r
+\r
+bool\r
+ImageFile::convertComplexToReal ()\r
+{\r
+  if (dataType() != Array2dFile::DATA_TYPE_COMPLEX)\r
+    return false;\r
+\r
+  ImageFileArray vReal = getArray();\r
+  ImageFileArray vImag = getImaginaryArray();\r
+  for (int ix = 0; ix < m_nx; ix++) {\r
+    ImageFileColumn vRealCol = vReal[ix];\r
+    ImageFileColumn vImagCol = vImag[ix];\r
+    for (int iy = 0; iy < m_ny; iy++) {\r
+      std::complex<double> c (*vRealCol, *vImagCol);\r
+      *vRealCol++ = std::abs (c);\r
+      vImagCol++;\r
+    }\r
+  }\r
+\r
+  return reallocComplexToReal();\r
+}\r
+\r
 bool\r
 ImageFile::subtractImages (const ImageFile& rRHS, ImageFile& result) const\r
 {\r
@@ -455,15 +516,32 @@ ImageFile::exp (ImageFile& result) const
 }\r
 \r
 bool\r
-ImageFile::FFTMagnitude (ImageFile& result) const\r
+ImageFile::inverseFourier (ImageFile& result) const\r
+{\r
+  if (m_nx != result.nx() || m_ny != result.ny()) {\r
+    sys_error (ERR_WARNING, "Difference sizes of images [ImageFile::invertPixelValues]");\r
+    return false;\r
+  }\r
+\r
+  return true;\r
+}\r
+\r
+bool\r
+ImageFile::fourier (ImageFile& result) const\r
 {\r
   if (m_nx != result.nx() || m_ny != result.ny()) {\r
     sys_error (ERR_WARNING, "Difference sizes of images [ImageFile::invertPixelValues]");\r
     return false;\r
   }\r
 \r
+  if (result.dataType() == Array2dFile::DATA_TYPE_REAL) {\r
+    if (! result.reallocRealToComplex ())\r
+      return false;\r
+  }\r
+\r
   ImageFileArrayConst vLHS = getArray();\r
-  ImageFileArray vResult = result.getArray();\r
+  ImageFileArray vRealResult = result.getArray();\r
+  ImageFileArray vImagResult = result.getImaginaryArray();\r
 \r
   int ix, iy;\r
   double* pY = new double [m_ny];\r
@@ -504,8 +582,10 @@ ImageFile::FFTMagnitude (ImageFile& result) const
   delete [] complexOutCol;\r
 \r
   for (ix = 0; ix < m_nx; ix++)\r
-    for (iy = 0; iy < m_ny; iy++)\r
-      vResult[ix][iy] = std::abs (complexOut[ix][iy]);\r
+    for (iy = 0; iy < m_ny; iy++) {\r
+      vRealResult[ix][iy] = complexOut[ix][iy].real();\r
+      vImagResult[ix][iy] = complexOut[ix][iy].imag();\r
+    }\r
 \r
   for (ix = 0; ix < m_nx; ix++)\r
     delete [] complexOut[ix];\r
@@ -516,62 +596,65 @@ ImageFile::FFTMagnitude (ImageFile& result) const
 }\r
 \r
 bool\r
-ImageFile::FFTPhase (ImageFile& result) const\r
+ImageFile::magnitude (ImageFile& result) const\r
 {\r
   if (m_nx != result.nx() || m_ny != result.ny()) {\r
     sys_error (ERR_WARNING, "Difference sizes of images [ImageFile::invertPixelValues]");\r
     return false;\r
   }\r
 \r
-  ImageFileArrayConst vLHS = getArray();\r
-  ImageFileArray vResult = result.getArray();\r
-\r
-  int ix, iy;\r
-  double* pY = new double [m_ny];\r
-  std::complex<double>** complexOut = new std::complex<double>* [m_nx];\r
-  for (ix = 0; ix < m_nx; ix++)\r
-    complexOut[ix] = new std::complex<double> [m_ny];\r
-\r
-  for (ix = 0; ix < m_nx; ix++) {\r
-    for (iy = 0; iy < m_ny; iy++)\r
-      pY[iy] = vLHS[ix][iy];\r
-    ProcessSignal::finiteFourierTransform (pY, complexOut[ix], m_ny,  ProcessSignal::FORWARD);\r
+  ImageFileArray vReal = getArray();\r
+  ImageFileArray vImag = NULL;\r
+  if (dataType() == Array2dFile::DATA_TYPE_COMPLEX)\r
+    vImag = getImaginaryArray();\r
+\r
+  ImageFileArray vRealResult = result.getArray();\r
+  if (result.dataType() == Array2dFile::DATA_TYPE_COMPLEX) {\r
+    ImageFileArray vImagResult = result.getImaginaryArray();\r
+    for (int ix = 0; ix < m_nx; ix++)\r
+      for (int iy = 0; iy < m_ny; iy++)\r
+        vImagResult[ix][iy] = 0;\r
   }\r
-  delete pY;\r
-\r
-  std::complex<double>* pX = new std::complex<double> [m_nx];\r
-  std::complex<double>* complexOutCol = new std::complex<double> [m_nx];\r
-  for (iy = 0; iy < m_ny; iy++) {\r
-    for (ix = 0; ix < m_nx; ix++)\r
-      pX[ix] = complexOut[ix][iy];\r
-    ProcessSignal::finiteFourierTransform (pX, complexOutCol, m_nx, ProcessSignal::FORWARD);\r
-    for (ix = 0; ix < m_nx; ix++)\r
-      complexOut[ix][iy] = complexOutCol[ix];\r
-  }\r
-  delete [] pX;\r
 \r
-  for (ix = 0; ix < m_nx; ix++)\r
-    ProcessSignal::shuffleFourierToNaturalOrder (complexOut[ix], m_ny);\r
+  for (int ix = 0; ix < m_nx; ix++)\r
+    for (int iy = 0; iy < m_ny; iy++) {\r
+      if (dataType() == Array2dFile::DATA_TYPE_COMPLEX) \r
+        vRealResult[ix][iy] = ::sqrt (vReal[ix][iy] * vReal[ix][iy] + vImag[ix][iy] * vImag[ix][iy]);\r
+      else\r
+        vRealResult[ix][iy] = vReal[ix][iy];\r
+    }\r
 \r
-  \r
-  for (iy = 0; iy < m_ny; iy++) {\r
-    for (ix = 0; ix < m_nx; ix++)\r
-      complexOutCol[ix] = complexOut[ix][iy];\r
-    ProcessSignal::shuffleFourierToNaturalOrder (complexOutCol, m_nx);;\r
-    for (ix = 0; ix < m_nx; ix++)\r
-      complexOut[ix][iy] = complexOutCol[ix];\r
+  return true;\r
+}\r
 \r
+bool\r
+ImageFile::phase (ImageFile& result) const\r
+{\r
+  if (m_nx != result.nx() || m_ny != result.ny()) {\r
+    sys_error (ERR_WARNING, "Difference sizes of images [ImageFile::invertPixelValues]");\r
+    return false;\r
   }\r
-  delete [] complexOutCol;\r
-\r
-  for (ix = 0; ix < m_nx; ix++)\r
-    for (iy = 0; iy < m_ny; iy++)\r
-      vResult[ix][iy] = atan (complexOut[ix][iy].imag / complexOut[ix][iy].real);\r
 \r
-  for (ix = 0; ix < m_nx; ix++)\r
-    delete [] complexOut[ix];\r
+  ImageFileArray vReal = getArray();\r
+  ImageFileArray vImag = NULL;\r
+  if (dataType() == Array2dFile::DATA_TYPE_COMPLEX)\r
+    vImag = getImaginaryArray();\r
+\r
+  ImageFileArray vRealResult = result.getArray();\r
+  if (result.dataType() == Array2dFile::DATA_TYPE_COMPLEX) {\r
+    ImageFileArray vImagResult = result.getImaginaryArray();\r
+    for (int ix = 0; ix < m_nx; ix++)\r
+      for (int iy = 0; iy < m_ny; iy++)\r
+        vImagResult[ix][iy] = 0;\r
+  }\r
 \r
-  delete [] complexOut;\r
+  for (int ix = 0; ix < m_nx; ix++)\r
+    for (int iy = 0; iy < m_ny; iy++) {\r
+      if (dataType() == Array2dFile::DATA_TYPE_COMPLEX) \r
+        vRealResult[ix][iy] = ::atan (vImag[ix][iy] / vReal[ix][iy]);\r
+      else\r
+        vRealResult[ix][iy] = vReal[ix][iy];\r
+    }\r
 \r
   return true;\r
 }\r
index 6c6220f..d393449 100644 (file)
@@ -158,6 +158,7 @@ SOURCE=..\..\..\wx2\include\wx\msw\wx.rc
 # ADD BASE RSC /l 0x409 /i "\wx2\include\wx\msw"\r
 # SUBTRACT BASE RSC /i "\wx2\include\wx\msw" /i "\wx2\include"\r
 # ADD RSC /l 0x409 /i "\wx2\include\wx\msw"\r
+# SUBTRACT RSC /i "\wx2\include\wx\msw" /i "\wx2\include"\r
 \r
 !ENDIF \r
 \r
index 1487b05..7a190d2 100644 (file)
@@ -6,13 +6,13 @@
 --------------------Configuration: libctsim - Win32 Debug--------------------\r
 </h3>\r
 <h3>Command Lines</h3>\r
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP34.tmp" with contents\r
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8B.tmp" with contents\r
 [\r
 /nologo /G6 /MTd /W3 /Gm /GR /GX /ZI /Od /I "..\..\..\zlib" /I "..\..\INCLUDE" /I "..\..\getopt" /I "..\..\..\lpng108" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2\include" /D "_DEBUG" /D "HAVE_WXWIN" /D "HAVE_STRING_H" /D "HAVE_GETOPT_H" /D "WIN32" /D "_MBCS" /D "_LIB" /D "MSVC" /D "HAVE_FFTW" /D "HAVE_PNG" /D "HAVE_SGP" /D "HAVE_WXWINDOWS" /D "__WXMSW__" /FR"Debug/" /Fp"Debug/libctsim.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c \r
 "C:\ctsim-2.0.6\libctsim\imagefile.cpp"\r
 ]\r
-Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP34.tmp" \r
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP35.tmp" with contents\r
+Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8B.tmp" \r
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8C.tmp" with contents\r
 [\r
 /nologo /out:"Debug\libctsim.lib" \r
 ".\Debug\array2dfile.obj"\r
@@ -43,7 +43,7 @@ Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP35.tmp" with content
 ".\Debug\transformmatrix.obj"\r
 ".\Debug\xform.obj"\r
 ]\r
-Creating command line "link.exe -lib @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP35.tmp"\r
+Creating command line "link.exe -lib @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8C.tmp"\r
 <h3>Output Window</h3>\r
 Compiling...\r
 imagefile.cpp\r
@@ -52,7 +52,7 @@ Creating library...
 --------------------Configuration: ctsim - Win32 Debug--------------------\r
 </h3>\r
 <h3>Command Lines</h3>\r
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP36.tmp" with contents\r
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8D.tmp" with contents\r
 [\r
 comctl32.lib winmm.lib rpcrt4.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../libctsim/Debug/libctsim.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\..\lpng108\msvc\win32\libpng\lib_dbg\libpng.lib ..\..\..\lpng108\msvc\win32\zlib\lib_dbg\zlib.lib libcmtd.lib ..\..\..\fftw-2.1.3\Win32\FFTW2st\Debug\FFTW2st.lib ..\..\..\fftw-2.1.3\Win32\RFFTW2st\Debug\RFFTW2st.lib ../../../wx2/lib/wxd.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/ctsim.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrtd.lib" /out:"Debug/ctsim.exe" /pdbtype:sept /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" \r
 ".\Debug\ctsim.obj"\r
@@ -67,7 +67,7 @@ comctl32.lib winmm.lib rpcrt4.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib w
 "\fftw-2.1.3\Win32\RFFTW2st\Debug\RFFTW2st.lib"\r
 "\wx2\lib\wxd.lib"\r
 ]\r
-Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP36.tmp"\r
+Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8D.tmp"\r
 <h3>Output Window</h3>\r
 Linking...\r
 \r
index bbd7f83..b944560 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: ctsim.h,v 1.14 2000/12/29 15:45:06 kevin Exp $
+**  $Id: ctsim.h,v 1.15 2000/12/29 19:30:08 kevin Exp $
 **
 **  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
@@ -152,8 +152,10 @@ enum {
   IFMENU_PROCESS_SQUARE,\r
   IFMENU_PROCESS_LOG,\r
   IFMENU_PROCESS_EXP,\r
-  IFMENU_PROCESS_FFT_MAGNITUDE,\r
-  IFMENU_PROCESS_FFT_PHASE,\r
+  IFMENU_PROCESS_FOURIER,\r
+  IFMENU_PROCESS_INVERSE_FOURIER,\r
+  IFMENU_PROCESS_MAGNITUDE,\r
+  IFMENU_PROCESS_PHASE,\r
     PHMMENU_PROCESS_RASTERIZE,
     PHMMENU_PROCESS_PROJECTIONS,\r
        PLOTMENU_VIEW_SCALE_MINMAX,\r
index 8c53e4c..307d6c0 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: views.cpp,v 1.40 2000/12/29 15:45:06 kevin Exp $
+**  $Id: views.cpp,v 1.41 2000/12/29 19:30:08 kevin Exp $
 **
 **  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
@@ -169,8 +169,10 @@ EVT_MENU(IFMENU_PROCESS_SQUARE, ImageFileView::OnSquare)
 EVT_MENU(IFMENU_PROCESS_SQRT, ImageFileView::OnSquareRoot)\r
 EVT_MENU(IFMENU_PROCESS_LOG, ImageFileView::OnLog)\r
 EVT_MENU(IFMENU_PROCESS_EXP, ImageFileView::OnExp)\r
-EVT_MENU(IFMENU_PROCESS_FFT_MAGNITUDE, ImageFileView::OnFFTMagnitude)\r
-EVT_MENU(IFMENU_PROCESS_FFT_PHASE, ImageFileView::OnFFTPhase)\r
+EVT_MENU(IFMENU_PROCESS_FOURIER, ImageFileView::OnFourier)\r
+EVT_MENU(IFMENU_PROCESS_INVERSE_FOURIER, ImageFileView::OnInverseFourier)\r
+EVT_MENU(IFMENU_PROCESS_MAGNITUDE, ImageFileView::OnMagnitude)\r
+EVT_MENU(IFMENU_PROCESS_PHASE, ImageFileView::OnPhase)\r
 EVT_MENU(IFMENU_PLOT_ROW, ImageFileView::OnPlotRow)\r
 EVT_MENU(IFMENU_PLOT_COL, ImageFileView::OnPlotCol)\r
 END_EVENT_TABLE()
@@ -187,15 +189,26 @@ ImageFileView::~ImageFileView(void)
 void
 ImageFileView::OnProperties (wxCommandEvent& event)
 {
-  double min, max, mean, mode, median, stddev;
   const ImageFile& rIF = GetDocument()->getImageFile();
   if (rIF.nx() == 0 || rIF.ny() == 0)
     *theApp->getLog() << "Properties: empty imagefile\n";
   else {
     const std::string& rFilename = rIF.getFilename();
-    rIF.statistics (min, max, mean, mode, median, stddev);
     std::ostringstream os;
-    os << "file: " << rFilename << "\nmin: "<<min<<"\nmax: "<<max<<"\nmean: "<<mean<<"\nmedian: "<<median<<"\nmode: "<<mode<<"\nstddev: "<<stddev << "\n";
+    double min, max, mean, mode, median, stddev;\r
+    rIF.statistics (min, max, mean, mode, median, stddev);\r
+    os << "Filename: " << rFilename << "\n";\r
+    os << "Size: (" << rIF.nx() << "," << rIF.ny() << ")\n";\r
+    os << "Data type: ";\r
+    if (rIF.dataType() == Array2dFile::DATA_TYPE_COMPLEX)\r
+      os << "Complex\n";\r
+    else\r
+      os << "Real\n";\r
+    os << "\nMinimum: "<<min<<"\nMaximum: "<<max<<"\nMean: "<<mean<<"\nMedian: "<<median<<"\nMode: "<<mode<<"\nStandard Deviation: "<<stddev << "\n";
+    if (rIF.dataType() == Array2dFile::DATA_TYPE_COMPLEX) {\r
+      rIF.statistics (rIF.getImaginaryArray(), min, max, mean, mode, median, stddev);\r
+      os << "\nImaginary: min: "<<min<<"\nmax: "<<max<<"\nmean: "<<mean<<"\nmedian: "<<median<<"\nmode: "<<mode<<"\nstddev: "<<stddev << "\n";\r
+    }\r
     *theApp->getLog() << os.str().c_str();
     wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Imagefile Properties", wxOK | wxICON_INFORMATION);
     dialogMsg.ShowModal();
@@ -348,20 +361,48 @@ ImageFileView::OnExp (wxCommandEvent& event)
 }\r
 \r
 void\r
-ImageFileView::OnFFTMagnitude (wxCommandEvent& event)\r
+ImageFileView::OnFourier (wxCommandEvent& event)\r
 {\r
   ImageFile& rIF = GetDocument()->getImageFile();\r
-  rIF.FFTMagnitude (rIF);\r
+  rIF.fourier (rIF);\r
+  m_bMinSpecified = false;\r
+  m_bMaxSpecified = false;\r
+  if (theApp->getSetModifyNewDocs())\r
+    GetDocument()->Modify(TRUE);\r
+  GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnInverseFourier (wxCommandEvent& event)\r
+{\r
+  ImageFile& rIF = GetDocument()->getImageFile();\r
+  rIF.inverseFourier (rIF);\r
+  m_bMinSpecified = false;\r
+  m_bMaxSpecified = false;\r
   if (theApp->getSetModifyNewDocs())\r
     GetDocument()->Modify(TRUE);\r
   GetDocument()->UpdateAllViews(this);\r
 }\r
 \r
 void\r
-ImageFileView::OnFFTPhase (wxCommandEvent& event)\r
+ImageFileView::OnMagnitude (wxCommandEvent& event)\r
 {\r
   ImageFile& rIF = GetDocument()->getImageFile();\r
-  rIF.FFTPhase (rIF);\r
+  rIF.magnitude (rIF);\r
+  m_bMinSpecified = false;\r
+  m_bMaxSpecified = false;\r
+  if (theApp->getSetModifyNewDocs())\r
+    GetDocument()->Modify(TRUE);\r
+  GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnPhase (wxCommandEvent& event)\r
+{\r
+  ImageFile& rIF = GetDocument()->getImageFile();\r
+  rIF.phase (rIF);\r
+  m_bMinSpecified = false;\r
+  m_bMaxSpecified = false;\r
   if (theApp->getSetModifyNewDocs())\r
     GetDocument()->Modify(TRUE);\r
   GetDocument()->UpdateAllViews(this);\r
@@ -415,8 +456,11 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   process_menu->Append (IFMENU_PROCESS_SQRT, "Square &Root");\r
   process_menu->Append (IFMENU_PROCESS_LOG, "&Log");\r
   process_menu->Append (IFMENU_PROCESS_EXP, "&Exp");\r
-  process_menu->Append (IFMENU_PROCESS_FFT_MAGNITUDE, "&FFT Magnitude");\r
-  process_menu->Append (IFMENU_PROCESS_FFT_PHASE, "FFT &Phase");\r
+  process_menu->AppendSeparator();\r
+  process_menu->Append (IFMENU_PROCESS_FOURIER, "&Fourier");\r
+  process_menu->Append (IFMENU_PROCESS_INVERSE_FOURIER, "&Inverse Fourier");\r
+  process_menu->Append (IFMENU_PROCESS_MAGNITUDE, "&Magnitude");\r
+  process_menu->Append (IFMENU_PROCESS_PHASE, "&Phase");\r
 \r
   wxMenu *plot_menu = new wxMenu;\r
   plot_menu->Append (IFMENU_PLOT_ROW, "Plot &Row");\r
index 8bb5e6d..79b154c 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: views.h,v 1.17 2000/12/29 15:45:06 kevin Exp $
+**  $Id: views.h,v 1.18 2000/12/29 19:30:08 kevin Exp $
 **
 **  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
@@ -71,8 +71,10 @@ public:
     void OnSquareRoot (wxCommandEvent& event);\r
     void OnLog (wxCommandEvent& event);\r
     void OnExp (wxCommandEvent& event);\r
-    void OnFFTMagnitude (wxCommandEvent& event);\r
-    void OnFFTPhase (wxCommandEvent& event);\r
+    void OnFourier (wxCommandEvent& event);\r
+    void OnInverseFourier (wxCommandEvent& event);\r
+    void OnMagnitude (wxCommandEvent& event);\r
+    void OnPhase (wxCommandEvent& event);\r
     void OnScaleAuto (wxCommandEvent& event);
     void OnScaleMinMax (wxCommandEvent& event);
          void OnPlotRow (wxCommandEvent& event);\r
index 9e4c169..cac6df3 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: if1.cpp,v 1.3 2000/12/29 15:45:06 kevin Exp $
+**  $Id: if1.cpp,v 1.4 2000/12/29 19:30:08 kevin Exp $
 **
 **  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
@@ -46,7 +46,7 @@ static struct option my_options[] =
   {0, 0, 0, 0}
 };
 
-static const char* g_szIdStr = "$Id: if1.cpp,v 1.3 2000/12/29 15:45:06 kevin Exp $";
+static const char* g_szIdStr = "$Id: if1.cpp,v 1.4 2000/12/29 19:30:08 kevin Exp $";
 
 void 
 if1_usage (const char *program)
@@ -59,7 +59,7 @@ if1_usage (const char *program)
   std::cout << "     --exp      Natural exponential of image" << std::endl;
   std::cout << "     --sqr      Square of image" << std::endl;
   std::cout << "     --sqrt     Square root of image" << std::endl;
-  std::cout << "     --verbose  Verbose modem" << std::endl;
+  std::cout << "     --verbose  Verbose mode" << std::endl;
   std::cout << "     --version  Print version" << std::endl;
   std::cout << "     --help     Print this help message" << std::endl;
 }
index f423460..1e98db0 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: ifinfo.cpp,v 1.5 2000/12/17 23:30:48 kevin Exp $
+**  $Id: ifinfo.cpp,v 1.6 2000/12/29 19:30:08 kevin Exp $
 **
 **  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
@@ -46,7 +46,7 @@ static struct option my_options[] =
   {0, 0, 0, 0}
 };
 
-static const char* g_szIdStr = "$Id: ifinfo.cpp,v 1.5 2000/12/17 23:30:48 kevin Exp $";
+static const char* g_szIdStr = "$Id: ifinfo.cpp,v 1.6 2000/12/29 19:30:08 kevin Exp $";
 
 
 void 
@@ -138,7 +138,13 @@ ifinfo_main (int argc, char *const argv[])
     im->printLabels (std::cout);
 
   if (opt_stats) {
-    std::cout << "Size: (" << im->nx() << "," << im->ny() << ")\n";
+    std::cout << "Size: (" << im->nx() << "," << im->ny() << ")\n";\r
+    std::cout << "Data type: ";\r
+    if (im->dataType() == Array2dFile::DATA_TYPE_COMPLEX)\r
+      std::cout << "Complex\n";\r
+    else \r
+      std::cout << "Real\n";\r
+
     im->printStatistics (std::cout);
   }