r328: *** empty log message ***
[ctsim.git] / libctsupport / plotfile.cpp
index b9e8ac641b5a80a3b5e905600634bf4f41605473..ef8d26420a5dfb95aec58445d17eac3d4667c4ea 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: plotfile.cpp,v 1.4 2000/12/21 03:40:58 kevin Exp $
+**  $Id: plotfile.cpp,v 1.8 2001/01/02 05:34:57 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
@@ -39,8 +39,8 @@
 
 PlotFile::PlotFile (int nCurves, int nRecords)
 {
-    initHeaders ();
-    setCurveSize (nCurves, nRecords);
+  initHeaders ();
+  setCurveSize (nCurves, nRecords);\r
 }
 
 PlotFile::PlotFile ()
@@ -55,22 +55,21 @@ PlotFile::~PlotFile ()
 void
 PlotFile::initHeaders ()
 {
-    m_iNumColumns = 0;
-    m_iNumRecords = 0;
-    m_strTitle = "";
-    m_strXLabel = "";
-    m_strYLabel = "";
-    m_strDate = "";
-    m_vecStrDescriptions.clear();
+  m_iNumColumns = 0;
+  m_iNumRecords = 0;
+  time_t currentTime = time (NULL);\r
+  m_strDate = ctime (&currentTime);\r
+  m_vecStrDescriptions.clear();\r
+  m_vecStrEzsetCommands.clear();
 }
 
 void
 PlotFile::setCurveSize (int nCols, int nRecords)
 {
-    m_iNumColumns = nCols;
-    m_iNumRecords = nRecords;
-    m_vecCurves.clear();
-    m_vecCurves.reserve (m_iNumColumns * m_iNumRecords);
+  m_iNumColumns = nCols;
+  m_iNumRecords = nRecords;
+  m_vecCurves.clear();
+  m_vecCurves.reserve (m_iNumColumns * m_iNumRecords);
 }
 \r
 // Storage format\r
@@ -83,10 +82,10 @@ 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;
 }
 
@@ -97,10 +96,10 @@ PlotFile::addColumn (int iCol, const float* const pdColData)
     sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);\r
     return (false);\r
   }\r
-\r
+  \r
   for (int iRec = 0; iRec < m_iNumRecords; iRec++)\r
     m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = pdColData [iRec];\r
-\r
+  \r
   return true;\r
 }\r
 \r
@@ -111,105 +110,104 @@ PlotFile::getColumn (int iCol, double* pdColData) const
     sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);\r
     return;\r
   }\r
-\r
+  \r
   for (int iRec = 0; iRec < m_iNumRecords; iRec++)\r
     pdColData[iRec] = m_vecCurves[ iRec + (iCol * m_iNumRecords) ];\r
-\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
+  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
+  if (iStartingCol >= m_iNumColumns) {\r
+    sys_error (ERR_WARNING, "iStartingCol >= iNumColumns");\r
+    return false;\r
+  }\r
\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;
+  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;
 }
 
 bool
 PlotFile::fileRead (const char* const filename)
 {
-    m_strFilename = filename;
-
+  m_strFilename = filename;
+  
 #ifdef MSVC
-    fstream fs (m_strFilename.c_str(), std::ios::in);
+  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;
+  
+  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;
 }
 
 bool
@@ -219,13 +217,38 @@ PlotFile::headerRead (std::iostream& fs)
     sys_error (ERR_WARNING, "Tried to read header with file closed [headerRead]");
     return false;
   }
-
-  fs.seekg (0);
-
-  initHeaders();
-  bool bInHeaders = true;
-//  while (bInHeaders) {
-  //}
+  
+  initHeaders();\r
+  fs.seekg (0);\r
+  bool bFinishedHeaders = false;\r
+\r
+  fs >> m_iNumColumns;\r
+  fs >> m_iNumRecords;\r
+\r
+  if (fs.fail() || m_iNumColumns == 0 || m_iNumRecords == 0)\r
+    return false;\r
+\r
+  while (! bFinishedHeaders && ! fs.eof() && ! fs.fail()) {\r
+    char line[1024];\r
+    fs.getline (line, sizeof(line));\r
+    int iSP = 0;\r
+    while (line[iSP] == ' ')\r
+      iSP++;\r
+    if (line[iSP] == '\n' || ! line[iSP])\r
+      ;\r
+    else if (line[iSP] == '#') {\r
+      iSP++;\r
+      while (line[iSP] == ' ')\r
+        iSP++;\r
+      if (line[iSP] == '\n' || ! line[iSP])\r
+        ;\r
+      else\r
+        addDescription (&line[iSP]);\r
+    } else if (strstr (&line[iSP], "<datapoints>") != NULL) {\r
+         bFinishedHeaders = true;\r
+    } else\r
+      addEzsetCommand (&line[iSP]);\r
+  }\r
 
   return ! fs.fail();
 }
@@ -238,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>\n";\r
-  fs << "<header>\n";
   
+  fs.seekp (0);
+  fs << m_iNumColumns << " " << m_iNumRecords << "\n";\r
+\r
+  int i;
+  for (i = 0; i < m_vecStrEzsetCommands.size(); i++)\r
+      fs << m_vecStrEzsetCommands[i] << "\n";\r
+  \r
+  for (i = 0; i < m_vecStrDescriptions.size(); i++)\r
+      fs << "# " << m_vecStrDescriptions[i] << "\n";\r
+  \r
   if (! m_strDate.empty())
-    fs << "<date>" << m_strDate << "</date>\n";
-
-  if (! m_strTitle.empty())
-    fs << "<title>" << m_strTitle << "</title>\n";
-
-  if (! m_strXLabel.empty())
-    fs << "<xlabel>" << m_strXLabel << "</xlabel>\n";
-
-  if (! m_strYLabel.empty())
-    fs << "<ylabel>" << m_strYLabel << "</ylabel>\n";
-
-  int iNDesc = m_vecStrDescriptions.size();
-  for (int i = 0; i < iNDesc; i++)
-    fs << "<description>" << m_vecStrDescriptions[i] << "</description>\n";
-
-  fs << "</header>\n";
-
+    fs << "# Date: " << m_strDate << "\n";
+    
   return ! fs.fail();
 }
 
@@ -272,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
+  \r
   fs << "</plotfile>\n";\r
-
+  
   return ! fs.fail();
 }
 
@@ -297,19 +311,39 @@ 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;
   }
-  
-  return true;
+\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
+
+  return ! (bTerminateEarly || fs.fail());
 }
 
 
 void
 PlotFile::printHeaders (std::ostream& os) const
-{
+{\r
+  os << "EZSet Commands\n";\r
+  for (unsigned int iEZ = 0; iEZ < m_vecStrEzsetCommands.size(); iEZ++)\r
+    os << m_vecStrEzsetCommands[iEZ] << "\n";\r
+\r
+  os << "Descriptions\n";\r
+  for (unsigned int iDesc = 0; iDesc < m_vecStrDescriptions.size(); iDesc++)\r
+    os << m_vecStrDescriptions[iDesc] << "\n";
 }