/*****************************************************************************
** 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.4 2000/12/21 03:40:58 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
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;
+ time_t currentTime = time (NULL);
+ m_strDate = ctime (¤tTime);
+ 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_vecCurves.clear();
- m_vecCurves.reserve (m_iNumColumns * m_iNumRecords);
+ 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)
{
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)
+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
{
- m_strFilename = filename;
+ if (iCol < 0 || iCol >= m_iNumColumns) {
+ sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);
+ return;
+ }
- 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;
+ 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
+PlotFile::fileWrite (const char* const filename)
+{
+ m_strFilename = filename;
- if (! headerWrite(fs) || ! columnsWrite (fs))
- return false;
-
- return true;
+ 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 (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 (! headerRead(fs))
- return false;
-
- setCurveSize (m_iNumColumns, m_iNumRecords);
-
- if (! columnsRead(fs))
- return false;;
-
- return true;
+ if (! columnsRead(fs))
+ return false;;
+
+ return true;
}
bool
return false;
}
+ initHeaders();
fs.seekg (0);
+ bool bFinishedHeaders = false;
- initHeaders();
- bool bInHeaders = true;
-// while (bInHeaders) {
- //}
+ 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();
}
}
fs.seekp (0);
- fs << "<plotfile>\n";\r
- fs << "<header>\n";
-
- if (! m_strDate.empty())
- fs << "<date>" << m_strDate << "</date>\n";
+ fs << m_iNumColumns << " " << m_iNumRecords << "\n";
- if (! m_strTitle.empty())
- fs << "<title>" << m_strTitle << "</title>\n";
+ unsigned int i;
+ for (i = 0; i < m_vecStrEzsetCommands.size(); i++)
+ fs << m_vecStrEzsetCommands[i] << "\n";
- if (! m_strXLabel.empty())
- fs << "<xlabel>" << m_strXLabel << "</xlabel>\n";
+ for (i = 0; i < m_vecStrDescriptions.size(); i++)
+ fs << "# " << m_vecStrDescriptions[i] << "\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";
+ if (! m_strDate.empty())
+ fs << "# Date: " << m_strDate << "\n";
return ! fs.fail();
}
}
fs << "</datapoints>\n";
-\r
- fs << "</plotfile>\n";\r
+
+ fs << "</plotfile>\n";
return ! fs.fail();
}
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;
+
+ 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());
}
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";
}