/*****************************************************************************
** 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.5 2000/12/23 18:12:35 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
{
m_iNumColumns = 0;
m_iNumRecords = 0;
- m_strDate = "";
- m_vecStrDescriptions.clear();\r
+ 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_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)
{
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;
}
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;
}
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();
}
sys_error (ERR_WARNING, "Tried to write header with ! fs");
return false;
}
-
+
fs.seekp (0);
- fs << "<plotfile>\n";\r
- 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
+ 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();
}
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();
}
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());
}
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";
}