** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: plotfile.cpp,v 1.3 2000/12/20 20:08:48 kevin Exp $
+** $Id: plotfile.cpp,v 1.5 2000/12/23 18:12:35 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
PlotFile::PlotFile (int nCurves, int nRecords)
{
- initHeaders ();
- setCurveSize (nCurves, nRecords);
+ initHeaders ();
+ setCurveSize (nCurves, nRecords);
}
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;
+ m_strDate = "";
+ 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
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;
}
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
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 (iNPoints);\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
- vec.push_back( m_vecCurves[ iRec + iOffset ] );\r
- }\r
-\r
- vectorNumericStatistics (vec, 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 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;
+ 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
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
+ 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
return ! fs.fail();
}
sys_error (ERR_WARNING, "Tried to write header with ! fs");
return false;
}
-
+
fs.seekp (0);
fs << "<plotfile>\n";\r
- fs << "<header>\n";
+ fs << "<ncolumns>" << m_iNumColumns << "</ncolumns>\n";\r
+ fs << "<nrecords>" << m_iNumRecords << "</nrecords>\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
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";
-
+
+ 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
+ }
+
return ! fs.fail();
}
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();
}
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());
}