1 /*****************************************************************************
5 ** Purpose: plotfile class
6 ** Programmer: Kevin Rosenberg
7 ** Date Started: Dec 2000
9 ** This is part of the CTSim program
10 ** Copyright (C) 1983-2000 Kevin Rosenberg
12 ** $Id: plotfile.cpp,v 1.7 2000/12/29 20:09:46 kevin Exp $
14 ** This program is free software; you can redistribute it and/or modify
15 ** it under the terms of the GNU General Public License (version 2) as
16 ** published by the Free Software Foundation.
18 ** This program is distributed in the hope that it will be useful,
19 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ** GNU General Public License for more details.
23 ** You should have received a copy of the GNU General Public License
24 ** along with this program; if not, write to the Free Software
25 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 ******************************************************************************/
32 ///////////////////////////////////////////////////////////////////////////
33 // CLASS IMPLEMENTATION
36 // Purpose: Plot File storage
37 ///////////////////////////////////////////////////////////////////////////
40 PlotFile::PlotFile (int nCurves, int nRecords)
43 setCurveSize (nCurves, nRecords);
51 PlotFile::~PlotFile ()
56 PlotFile::initHeaders ()
61 m_vecStrDescriptions.clear();
\r
62 m_vecStrEzsetCommands.clear();
66 PlotFile::setCurveSize (int nCols, int nRecords)
68 m_iNumColumns = nCols;
69 m_iNumRecords = nRecords;
71 m_vecCurves.reserve (m_iNumColumns * m_iNumRecords);
75 // a Column's records are stored sequentially. It begins at iCol * m_iNumRecords
\r
78 PlotFile::addColumn (int iCol, const double* const pdColData)
80 if (iCol < 0 || iCol >= m_iNumColumns) {
81 sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);
85 for (int iRec = 0; iRec < m_iNumRecords; iRec++)
86 m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = pdColData [iRec];
92 PlotFile::addColumn (int iCol, const float* const pdColData)
\r
94 if (iCol < 0 || iCol >= m_iNumColumns) {
\r
95 sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);
\r
99 for (int iRec = 0; iRec < m_iNumRecords; iRec++)
\r
100 m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = pdColData [iRec];
\r
106 PlotFile::getColumn (int iCol, double* pdColData) const
\r
108 if (iCol < 0 || iCol >= m_iNumColumns) {
\r
109 sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol);
\r
113 for (int iRec = 0; iRec < m_iNumRecords; iRec++)
\r
114 pdColData[iRec] = m_vecCurves[ iRec + (iCol * m_iNumRecords) ];
\r
119 PlotFile::getMinMax (int iStartingCol, double& dMin, double& dMax) const
\r
121 if (iStartingCol >= m_iNumColumns) {
\r
122 sys_error (ERR_WARNING, "iStartingCol >= iNumColumns");
\r
126 int iOffset = iStartingCol * m_iNumRecords;
\r
127 dMin = m_vecCurves[ 0 + iOffset ];
\r
130 for (int iCol = iStartingCol; iCol < m_iNumColumns; iCol++) {
\r
131 int iOffset = iCol * m_iNumRecords;
\r
132 for (int iRec = 0; iRec < m_iNumRecords; iRec++) {
\r
133 double dVal = m_vecCurves[ iRec + iOffset ];
\r
136 else if (dVal > dMax)
\r
145 PlotFile::statistics (int iStartingCol, double& min, double& max, double& mean, double& mode, double& median, double &stddev) const
\r
147 if (iStartingCol >= m_iNumColumns) {
\r
148 sys_error (ERR_WARNING, "iStartingCol >= iNumColumns");
\r
152 int iNPoints = (m_iNumColumns - iStartingCol) * m_iNumRecords;
\r
153 std::vector<double> vec;
\r
154 vec.resize (iNPoints);
\r
157 for (int iCol = iStartingCol; iCol < m_iNumColumns; iCol++) {
\r
158 int iOffset = iCol * m_iNumRecords;
\r
159 for (int iRec = 0; iRec < m_iNumRecords; iRec++)
\r
160 vec[iVec++] = m_vecCurves[ iRec + iOffset ];
\r
163 vectorNumericStatistics (vec, iNPoints, min, max, mean, mode, median, stddev);
\r
169 PlotFile::fileWrite (const char* const filename)
171 m_strFilename = filename;
173 fstream fs (m_strFilename.c_str(), std::ios::out | std::ios::trunc);
175 sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", m_strFilename.c_str());
179 if (! headerWrite(fs) || ! columnsWrite (fs))
186 PlotFile::fileRead (const char* const filename)
188 m_strFilename = filename;
191 fstream fs (m_strFilename.c_str(), std::ios::in);
193 fstream fs (m_strFilename.c_str(), std::ios::in | std::ios::nocreate);
197 sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", m_strFilename.c_str());
201 if (! headerRead(fs))
204 setCurveSize (m_iNumColumns, m_iNumRecords);
206 if (! columnsRead(fs))
213 PlotFile::headerRead (std::iostream& fs)
216 sys_error (ERR_WARNING, "Tried to read header with file closed [headerRead]");
222 bool bFinishedHeaders = false;
\r
224 while (! bFinishedHeaders && ! fs.eof() && ! fs.fail()) {
\r
226 fs.getline (line, sizeof(line));
\r
227 if (strstr (line, "<datapoints>") != NULL)
\r
228 bFinishedHeaders = true;
\r
236 PlotFile::headerWrite (std::iostream& fs)
239 sys_error (ERR_WARNING, "Tried to write header with ! fs");
244 fs << "<plotfile " << m_iNumColumns << " " << m_iNumRecords << " >\n";
\r
246 int iNEzset = m_vecStrEzsetCommands.size();
\r
249 for (int i = 0; i < iNEzset; i++)
\r
250 fs << m_vecStrEzsetCommands[i] << "\n";
\r
251 fs << "</ezset>\n";
\r
254 if (! m_strDate.empty())
255 fs << "<date>" << m_strDate << "</date>\n";
257 int iNDesc = m_vecStrDescriptions.size();
\r
259 fs << "<description>\n";
260 for (int i = 0; i < iNDesc; i++)
261 fs << m_vecStrDescriptions[i] << "\n";
\r
262 fs << "</description>\n";
\r
270 PlotFile::columnsWrite (std::iostream& fs)
273 sys_error (ERR_WARNING, "Tried to columnWrite with !fs");
277 fs << "<datapoints>\n";
279 int iStride = m_iNumRecords;
280 for (int iRec = 0; iRec < m_iNumRecords; iRec++) {
281 for (int iCol = 0; iCol < m_iNumColumns; iCol++)
282 fs << m_vecCurves [iRec + (iCol * iStride)] << " ";
286 fs << "</datapoints>\n";
288 fs << "</plotfile>\n";
\r
295 PlotFile::columnsRead (std::iostream& fs)
298 sys_error (ERR_WARNING, "Tried to arrayDataRead with ! fs");
304 if (m_iNumColumns == 0 || m_iNumRecords == 0) {
305 sys_error (ERR_WARNING, "Called PlotFile::columnsRead with 0 columns or records");
309 bool bTerminateEarly = false;
\r
310 for (int iRec = 0; iRec < m_iNumRecords; iRec++) {
\r
311 for (int iCol = 0; iCol < m_iNumColumns; iCol++) {
\r
313 bTerminateEarly = true;
\r
320 m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = d;
\r
324 return ! (bTerminateEarly || fs.fail());
329 PlotFile::printHeaders (std::ostream& os) const