Applied initial patches for wx2.8 compatibility
[ctsim.git] / libctsupport / plotfile.cpp
index 706fce1d352bcd367e22e257965c7ea4c3ebbb2b..86298701b3135122a9bf08db8bc11306cae9ad69 100644 (file)
@@ -1,15 +1,15 @@
 /*****************************************************************************
 ** FILE IDENTIFICATION
 **
-**     Name:         plotfile.cpp
+**      Name:         plotfile.cpp
 **      Purpose:      plotfile class
-**     Programmer:   Kevin Rosenberg
-**     Date Started: Dec 2000
+**      Programmer:   Kevin Rosenberg
+**      Date Started: Dec 2000
 **
 **  This is part of the CTSim program
-**  Copyright (C) 1983-2000 Kevin Rosenberg
+**  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: plotfile.cpp,v 1.6 2000/12/27 03:16:02 kevin Exp $
+**  $Id$
 **
 **  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
@@ -57,23 +57,24 @@ PlotFile::initHeaders ()
 {
   m_iNumColumns = 0;
   m_iNumRecords = 0;
-  m_strDate = "";
-  m_vecStrDescriptions.clear();\r
+  time_t currentTime = time (NULL);
+  m_strDate = ctime (&currentTime);
+  m_vecStrDescriptions.clear();
   m_vecStrEzsetCommands.clear();
 }
 
 void
-PlotFile::setCurveSize (int nCols, int nRecords)
+PlotFile::setCurveSize (int nCols, int nRecords, bool bScatterPlot)
 {
   m_iNumColumns = nCols;
   m_iNumRecords = nRecords;
+  m_bScatterPlot = bScatterPlot;
   m_vecCurves.clear();
   m_vecCurves.reserve (m_iNumColumns * m_iNumRecords);
 }
-\r
-// Storage format\r
-//   a Column's records are stored sequentially. It begins at iCol * m_iNumRecords\r
 
+// Storage format
+//   a Column's records are stored sequentially. It begins at iCol * m_iNumRecords
 bool
 PlotFile::addColumn (int iCol, const double* const pdColData)
 {
@@ -81,105 +82,104 @@ PlotFile::addColumn (int iCol, const double* const pdColData)
     sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);
     return (false);
   }
-  
+
+  for (int iRec = 0; iRec < m_iNumRecords; iRec++)
+    m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = pdColData [iRec];
+
+  return true;
+}
+
+bool
+PlotFile::addColumn (int iCol, const float* const pdColData)
+{
+  if (iCol < 0 || iCol >= m_iNumColumns) {
+    sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);
+    return (false);
+  }
+
   for (int iRec = 0; iRec < m_iNumRecords; iRec++)
     m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = pdColData [iRec];
-  
+
+  return true;
+}
+
+void
+PlotFile::getColumn (int iCol, double* pdColData) const
+{
+  if (iCol < 0 || iCol >= m_iNumColumns) {
+    sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);
+    return;
+  }
+
+  for (int iRec = 0; iRec < m_iNumRecords; iRec++)
+    pdColData[iRec] = m_vecCurves[ iRec + (iCol * m_iNumRecords) ];
+
+}
+
+bool
+PlotFile::getMinMax (int iStartingCol, double& dMin, double& dMax) const
+{
+  if (iStartingCol >= m_iNumColumns) {
+    sys_error (ERR_WARNING, "iStartingCol >= iNumColumns");
+    return false;
+  }
+
+  int iOffset = iStartingCol * m_iNumRecords;
+  dMin = m_vecCurves[ 0 + iOffset ];
+  dMax = dMin;
+
+  for (int iCol = iStartingCol; iCol < m_iNumColumns; iCol++) {
+    int iOffset = iCol * m_iNumRecords;
+    for (int iRec = 0; iRec < m_iNumRecords; iRec++) {
+      double dVal = m_vecCurves[ iRec + iOffset ];
+      if (dVal < dMin)
+        dMin = dVal;
+      else if (dVal > dMax)
+        dMax = dVal;
+    }
+  }
+
+  return true;
+}
+
+bool
+PlotFile::statistics (int iStartingCol, double& min, double& max, double& mean, double& mode, double& median, double &stddev) const
+{
+  if (iStartingCol >= m_iNumColumns) {
+    sys_error (ERR_WARNING, "iStartingCol >= iNumColumns");
+    return false;
+  }
+
+  int iNPoints = (m_iNumColumns - iStartingCol) * m_iNumRecords;
+  std::vector<double> vec;
+  vec.resize (iNPoints);
+
+  int iVec = 0;
+  for (int iCol = iStartingCol; iCol < m_iNumColumns; iCol++) {
+    int iOffset = iCol * m_iNumRecords;
+    for (int iRec = 0; iRec < m_iNumRecords; iRec++)
+      vec[iVec++] = m_vecCurves[ iRec + iOffset ];
+  }
+
+  vectorNumericStatistics (vec, iNPoints, min, max, mean, mode, median, stddev);
+
   return true;
 }
 
-bool\r
-PlotFile::addColumn (int iCol, const float* const pdColData)\r
-{\r
-  if (iCol < 0 || iCol >= m_iNumColumns) {\r
-    sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);\r
-    return (false);\r
-  }\r
-  \r
-  for (int iRec = 0; iRec < m_iNumRecords; iRec++)\r
-    m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = pdColData [iRec];\r
-  \r
-  return true;\r
-}\r
-\r
-void\r
-PlotFile::getColumn (int iCol, double* pdColData) const\r
-{\r
-  if (iCol < 0 || iCol >= m_iNumColumns) {\r
-    sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);\r
-    return;\r
-  }\r
-  \r
-  for (int iRec = 0; iRec < m_iNumRecords; iRec++)\r
-    pdColData[iRec] = m_vecCurves[ iRec + (iCol * m_iNumRecords) ];\r
-  \r
-}\r
-\r
-bool\r
-PlotFile::getMinMax (int iStartingCol, double& dMin, double& dMax) const\r
-{\r
-  if (iStartingCol >= m_iNumColumns) {\r
-    sys_error (ERR_WARNING, "iStartingCol >= iNumColumns");\r
-    return false;\r
-  }\r
-  \r
-  int iOffset = iStartingCol * m_iNumRecords;\r
-  dMin = m_vecCurves[ 0 + iOffset ];\r
-  dMax = dMin;\r
-  \r
-  for (int iCol = iStartingCol; iCol < m_iNumColumns; iCol++) {\r
-    int iOffset = iCol * m_iNumRecords;\r
-    for (int iRec = 0; iRec < m_iNumRecords; iRec++) {\r
-      double dVal = m_vecCurves[ iRec + iOffset ];\r
-      if (dVal < dMin)\r
-        dMin = dVal;\r
-      else if (dVal > dMax)\r
-        dMax = dVal;\r
-    }\r
-  }\r
-  \r
-  return true;\r
-}\r
-\r
-bool \r
-PlotFile::statistics (int iStartingCol, double& min, double& max, double& mean, double& mode, double& median, double &stddev) const\r
-{\r
-  if (iStartingCol >= m_iNumColumns) {\r
-    sys_error (ERR_WARNING, "iStartingCol >= iNumColumns");\r
-    return false;\r
-  }\r
-  \r
-  int iOffset = iStartingCol * m_iNumRecords;\r
-  int iNPoints = (m_iNumColumns - iStartingCol) * m_iNumRecords;\r
-  std::vector<double> vec;\r
-  vec.resize (iNPoints);\r
-  \r
-  int iVec = 0;\r
-  for (int iCol = iStartingCol; iCol < m_iNumColumns; iCol++) {\r
-    int iOffset = iCol * m_iNumRecords;\r
-    for (int iRec = 0; iRec < m_iNumRecords; iRec++)\r
-      vec[iVec++] = m_vecCurves[ iRec + iOffset ];\r
-  }\r
-  \r
-  vectorNumericStatistics (vec, iNPoints, min, max, mean, mode, median, stddev);\r
-  \r
-  return true;\r
-}\r
-\r
 bool
 PlotFile::fileWrite (const char* const filename)
 {
   m_strFilename = filename;
-  
+
   fstream fs (m_strFilename.c_str(), std::ios::out | std::ios::trunc);
   if (fs.fail()) {
     sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", m_strFilename.c_str());
     return false;
   }
-  
+
   if (! headerWrite(fs) || ! columnsWrite (fs))
     return false;
-  
+
   return true;
 }
 
@@ -187,26 +187,26 @@ bool
 PlotFile::fileRead (const char* const filename)
 {
   m_strFilename = filename;
-  
+
 #ifdef MSVC
   fstream fs (m_strFilename.c_str(), std::ios::in);
 #else
-  fstream fs (m_strFilename.c_str(), std::ios::in | std::ios::nocreate);
+  fstream fs (m_strFilename.c_str(), std::ios::in); // | std::ios::nocreate);
 #endif
-  
+
   if (fs.fail()) {
     sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", m_strFilename.c_str());
     return false;
   }
-  
+
   if (! headerRead(fs))
     return false;
-  
+
   setCurveSize (m_iNumColumns, m_iNumRecords);
-  
+
   if (! columnsRead(fs))
     return false;;
-  
+
   return true;
 }
 
@@ -217,17 +217,38 @@ PlotFile::headerRead (std::iostream& fs)
     sys_error (ERR_WARNING, "Tried to read header with file closed [headerRead]");
     return false;
   }
-  
-  initHeaders();\r
-  fs.seekg (0);\r
-  bool bFinishedHeaders = false;\r
-\r
-  while (! bFinishedHeaders && ! fs.eof() && ! fs.fail()) {\r
-    char line[1024];\r
-    fs.getline (line, sizeof(line));\r
-    if (strstr (line, "<datapoints>") != NULL)\r
-         bFinishedHeaders = true;\r
-  }\r
+
+  initHeaders();
+  fs.seekg (0);
+  bool bFinishedHeaders = false;
+
+  fs >> m_iNumColumns;
+  fs >> m_iNumRecords;
+
+  if (fs.fail() || m_iNumColumns == 0 || m_iNumRecords == 0)
+    return false;
+
+  while (! bFinishedHeaders && ! fs.eof() && ! fs.fail()) {
+    char line[1024];
+    fs.getline (line, sizeof(line));
+    int iSP = 0;
+    while (line[iSP] == ' ')
+      iSP++;
+    if (line[iSP] == '\n' || ! line[iSP])
+      ;
+    else if (line[iSP] == '#') {
+      iSP++;
+      while (line[iSP] == ' ')
+        iSP++;
+      if (line[iSP] == '\n' || ! line[iSP])
+        ;
+      else
+        addDescription (&line[iSP]);
+    } else if (strstr (&line[iSP], "<datapoints>") != NULL) {
+         bFinishedHeaders = true;
+    } else
+      addEzsetCommand (&line[iSP]);
+  }
 
   return ! fs.fail();
 }
@@ -240,29 +261,20 @@ PlotFile::headerWrite (std::iostream& fs)
     sys_error (ERR_WARNING, "Tried to write header with ! fs");
     return false;
   }
-  
+
   fs.seekp (0);
-  fs << "<plotfile " << m_iNumColumns << " " << m_iNumRecords << " >\n";\r
-  
-  int iNEzset = m_vecStrEzsetCommands.size();\r
-  if (iNEzset > 0) {\r
-    fs << "<ezset>\n";\r
-    for (int i = 0; i < iNEzset; i++)\r
-      fs << m_vecStrEzsetCommands[i] << "\n";\r
-    fs << "</ezset>\n";\r
-  }\r
-  \r
+  fs << m_iNumColumns << " " << m_iNumRecords << "\n";
+
+  unsigned int i;
+  for (i = 0; i < m_vecStrEzsetCommands.size(); i++)
+      fs << m_vecStrEzsetCommands[i] << "\n";
+
+  for (i = 0; i < m_vecStrDescriptions.size(); i++)
+      fs << "# " << m_vecStrDescriptions[i] << "\n";
+
   if (! m_strDate.empty())
-    fs << "<date>" << m_strDate << "</date>\n";
-  
-  int iNDesc = m_vecStrDescriptions.size();\r
-  if (iNDesc > 0) {\r
-    fs << "<description>\n";
-    for (int i = 0; i < iNDesc; i++)
-      fs << m_vecStrDescriptions[i] << "\n";\r
-    fs << "</description>\n";\r
-  }
-  
+    fs << "# Date: " << m_strDate << "\n";
+
   return ! fs.fail();
 }
 
@@ -274,20 +286,20 @@ PlotFile::columnsWrite (std::iostream& fs)
     sys_error (ERR_WARNING, "Tried to columnWrite with !fs");
     return false;
   }
-  
+
   fs << "<datapoints>\n";
-  
+
   int iStride = m_iNumRecords;
   for (int iRec = 0; iRec < m_iNumRecords; iRec++) {
     for (int iCol = 0; iCol < m_iNumColumns; iCol++)
       fs << m_vecCurves [iRec + (iCol * iStride)] << " ";
     fs << "\n";
   }
-  
+
   fs << "</datapoints>\n";
-  \r
-  fs << "</plotfile>\n";\r
-  
+
+  fs << "</plotfile>\n";
+
   return ! fs.fail();
 }
 
@@ -299,28 +311,26 @@ PlotFile::columnsRead (std::iostream& fs)
     sys_error (ERR_WARNING, "Tried to arrayDataRead with ! fs");
     return false;
   }
-  
-  return ! fs.fail();
-  
+
   if (m_iNumColumns == 0 || m_iNumRecords == 0) {
     sys_error (ERR_WARNING, "Called PlotFile::columnsRead with 0 columns or records");
     return false;
   }
-\r
-  bool bTerminateEarly = false;\r
-  for (int iRec = 0; iRec < m_iNumRecords; iRec++) {\r
-    for (int iCol = 0; iCol < m_iNumColumns; iCol++) {\r
-      if (fs.eof()) {\r
-        bTerminateEarly = true;\r
-        break;\r
-      }\r
-      if (fs.fail())\r
-        break;\r
-      double d;\r
-      fs >> d;\r
-      m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = d;\r
-    }\r
-  }\r
+
+  bool bTerminateEarly = false;
+  for (int iRec = 0; iRec < m_iNumRecords; iRec++) {
+    for (int iCol = 0; iCol < m_iNumColumns; iCol++) {
+      if (fs.eof()) {
+        bTerminateEarly = true;
+        break;
+      }
+      if (fs.fail())
+        break;
+      double d;
+      fs >> d;
+      m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = d;
+    }
+  }
 
   return ! (bTerminateEarly || fs.fail());
 }
@@ -329,4 +339,51 @@ PlotFile::columnsRead (std::iostream& fs)
 void
 PlotFile::printHeaders (std::ostream& os) const
 {
+  os << "EZSet Commands\n";
+  for (unsigned int iEZ = 0; iEZ < m_vecStrEzsetCommands.size(); iEZ++)
+    os << m_vecStrEzsetCommands[iEZ] << "\n";
+
+  os << "Descriptions\n";
+  for (unsigned int iDesc = 0; iDesc < m_vecStrDescriptions.size(); iDesc++)
+    os << m_vecStrDescriptions[iDesc] << "\n";
+}
+
+void
+PlotFile::printHeaders (std::ostringstream& os) const
+{
+  os << "EZSet Commands\n";
+  for (unsigned int iEZ = 0; iEZ < m_vecStrEzsetCommands.size(); iEZ++)
+    os << m_vecStrEzsetCommands[iEZ] << "\n";
+
+  os << "Descriptions\n";
+  for (unsigned int iDesc = 0; iDesc < m_vecStrDescriptions.size(); iDesc++)
+    os << m_vecStrDescriptions[iDesc] << "\n";
+}
+
+void
+PlotFile::printHeadersBrief (std::ostream& os) const
+{
+  os << "EZSet Commands\n";
+  for (unsigned int iEZ = 0; iEZ < m_vecStrEzsetCommands.size(); iEZ++)
+    os << m_vecStrEzsetCommands[iEZ] << "; ";
+  if (m_vecStrEzsetCommands.size() > 0)
+    os << "\n";
+
+  os << "Descriptions\n";
+  for (unsigned int iDesc = 0; iDesc < m_vecStrDescriptions.size(); iDesc++)
+    os << m_vecStrDescriptions[iDesc] << "\n";
+}
+
+void
+PlotFile::printHeadersBrief (std::ostringstream& os) const
+{
+  os << "EZSet Commands\n";
+  for (unsigned int iEZ = 0; iEZ < m_vecStrEzsetCommands.size(); iEZ++)
+    os << m_vecStrEzsetCommands[iEZ] << "; ";
+  if (m_vecStrEzsetCommands.size() > 0)
+    os << "\n";
+
+  os << "Descriptions\n";
+  for (unsigned int iDesc = 0; iDesc < m_vecStrDescriptions.size(); iDesc++)
+    os << m_vecStrDescriptions[iDesc] << "\n";
 }