File: array2dfile.h

package info (click to toggle)
ctsim 4.5.2-1.1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 6,536 kB
  • ctags: 3,720
  • sloc: cpp: 26,768; sh: 3,691; ansic: 1,254; perl: 296; makefile: 263
file content (275 lines) | stat: -rw-r--r-- 7,280 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
/*****************************************************************************
** FILE IDENTIFICATION
**
**	Name:	      array2dfile.h
**      Purpose:      2-dimension array file class
**	Programmer:   Kevin Rosenberg
**	Date Started: June 2000
**
**  This is part of the CTSim program
**  Copyright (c) 1983-2001 Kevin Rosenberg
**
**  $Id: array2dfile.h 7061 2003-09-07 06:34:45Z kevin $
**
**  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
**  published by the Free Software Foundation.
**
**  This program is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**
**  You should have received a copy of the GNU General Public License
**  along with this program; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
******************************************************************************/

#ifndef ARRAY2DFILE_H
#define ARRAY2DFILE_H

#ifndef MSVC
#include <unistd.h>
#endif

#include <sys/types.h>
#include <cstring>
#include <string>
#include <iosfwd>
#include <iomanip>
#include <fstream>
#include <iostream>
#include <vector>
#include "ctsupport.h"
#include "fnetorderstream.h"
#include "array2d.h"

class Array2dFileLabel
{
public:
  enum {
    L_EMPTY = 0,
      L_HISTORY = 1,
      L_USER = 2,
  };
  
  Array2dFileLabel(); 
  
  Array2dFileLabel(const char* const str, double ctime = 0.);
  
  Array2dFileLabel(const int type, const char* const str, double ctime = 0.);
  
  ~Array2dFileLabel();
  
  const std::string& getLabelString (void) const
  { return m_strLabel; }
  
  kfloat64 getCalcTime (void) const
  { return m_calcTime; }
  
  void setCalcTime (kfloat64 calcTime)
  { m_calcTime = calcTime; }
  
  void setLabelType (int labelType)
  { m_labelType = labelType; }
  
  int getLabelType (void) const
  { return m_labelType; }
  
  std::string& setLabelString (const char* const str)
  { m_strLabel = str; return (m_strLabel); }
  
  std::string& setLabelString (const std::string& str)
  { m_strLabel = str; return (m_strLabel); }
  
  void setDateTime (int year, int month, int day, int hour, int minute, int second);
  
  void getDateTime (int& year, int& month, int& day, int& hour, int& minute, int& second) const;
  
  const std::string& getDateString () const;
  
  void print (std::ostream& os) const;
  void printBrief (std::ostream& os) const;
  void printBrief (std::ostringstream& os) const;
  
  Array2dFileLabel (const Array2dFileLabel& rhs);
  
  Array2dFileLabel& operator= (const Array2dFileLabel& rhs);
  
private:
  void init (void);
  
  kuint16 m_labelType;
  kuint16 m_year;
  kuint16 m_month;
  kuint16 m_day;
  kuint16 m_hour;
  kuint16 m_minute;
  kuint16 m_second;
  std::string m_strLabel;
  kfloat64 m_calcTime;
  
  mutable std::string m_strDate;
};


class Array2dFile 
{
public:
  enum {
    PIXEL_INVALID = 0,
      PIXEL_INT8 = 1,
      PIXEL_UINT8 = 2,
      PIXEL_INT16 = 3,
      PIXEL_UINT16 = 4,
      PIXEL_INT32 = 5,
      PIXEL_UINT32 = 6,
      PIXEL_FLOAT32 = 7,
      PIXEL_FLOAT64 = 8,
  };
  
  enum {
    DATA_TYPE_INVALID = 0,
      DATA_TYPE_REAL,
      DATA_TYPE_COMPLEX,
  };
  
  Array2dFile (int nx, int ny, int pixelSize, int pixelFormat = PIXEL_INVALID, int dataType = DATA_TYPE_REAL);
  Array2dFile (void);
  ~Array2dFile ();
  
  void setArraySize (int nx, int ny, int pixelSize, int pixelFormat = PIXEL_INVALID, int dataType = DATA_TYPE_REAL);
  
  void setArraySize (int nx, int ny);
  
  unsigned int getNumLabels (void) const
  { return m_labels.size(); }
  
  const Array2dFileLabel& labelGet (int label_num) const;
  
  void labelAdd (const Array2dFileLabel& label);
  
  void labelAdd (const char* const m_strLabel, double calc_time=0.);
  
  void labelAdd (int type, const char* const m_strLabel, double calc_time=0.);
  
  void labelsCopy (const Array2dFile& file, const char* const idStr = NULL);
  
  void setPixelFormat (int type)
  { m_pixelFormat = type; }
  
  void setPixelSize (int size)
  { m_pixelSize = size; }
  
  kuint32 nx (void) const
  { return m_nx; }
  
  kuint32 ny (void) const
  { return m_ny; }
  
  bool isComplex() const
  { return m_dataType == DATA_TYPE_COMPLEX; }
  
  bool isReal() const
  { return m_dataType == DATA_TYPE_REAL; }
  
  int dataType () const
  { return static_cast<int>(m_dataType); }
  
  void setDataType (int dataType)
  { m_dataType = dataType; }
  
  void setAxisIncrement (double axisIncX, double axisIncY);
  
  bool reallocRealToComplex ();
  
  bool reallocComplexToReal ();
  
  void getPixelValueRange (double& pvmin, double& pvmax) const;
  void setAxisExtent (double minX, double maxX, double minY, double maxY);
  bool getAxisExtent (double& minX, double& maxX, double& minY, double& maxY) const
  { if (! m_axisExtentKnown) return false; minX = m_minX; maxX = m_maxX; minY = m_minY; maxY=m_maxY;
    return true; }

  void doPixelOffsetScale (double offset, double scale);

  kfloat64 axisIncrementX() const {return m_axisIncrementKnown ? m_axisIncrementX : 0.;}
  kfloat64 axisIncrementY() const {return m_axisIncrementKnown ? m_axisIncrementY : 0.;}

  void arrayDataClear (void);
  
  bool fileRead (const char* const filename);
  
  bool fileRead (const std::string& filename);
  
  bool fileWrite (const char* const filename);
  
  bool fileWrite (const std::string& filename);
  
  const std::string& getFilename (void) const 
  {  return m_filename; }
  
  void printLabels (std::ostream& os) const;
  void printLabelsBrief (std::ostream& os) const;
  void printLabelsBrief (std::ostringstream& os) const;
  
  unsigned int nLabels() const
  { return m_labels.size(); }
  
  typedef std::vector<Array2dFileLabel*>::iterator labelIterator;
  typedef std::vector<Array2dFileLabel*>::const_iterator constLabelIterator;
  
protected:
	 typedef std::vector<Array2dFileLabel*> labelContainer;
   
   static const kuint16 m_signature;
   kuint16 m_headersize;
   std::string  m_filename;
   
   kuint16 m_pixelSize;
   kuint16 m_pixelFormat;
   kuint16 m_axisIncrementKnown;
   kfloat64 m_axisIncrementX, m_axisIncrementY;
   kuint16 m_axisExtentKnown;
   kfloat64 m_minX, m_maxX, m_minY, m_maxY;
   kfloat64 m_offsetPV, m_scalePV;
   kuint32 m_nx;
   kuint32 m_ny;
   kuint32 m_arraySize;
   labelContainer m_labels;
   kuint16 m_numFileLabels;
   kuint16 m_dataType;
   unsigned char** m_arrayData;
   unsigned char** m_imaginaryArrayData;
   
private:
  void init (void);
  
  bool headerRead (frnetorderstream& fs);
  
  bool headerWrite (frnetorderstream& fs);
  
  bool arrayDataRead (frnetorderstream& fs);
  
  bool arrayDataWrite (frnetorderstream& fs);
  
  bool labelsRead (frnetorderstream& fs);
  
  bool labelsWrite (frnetorderstream& fs);
  
  bool labelSeek (int label_num);
  
  void allocArrays ();
  void freeArrays ();
  
  void allocArray (unsigned char**& rppData);
  void freeArray (unsigned char**& rppData);
  
  Array2dFile (const Array2dFile& rhs);        // copy constructor
  Array2dFile& operator= (const Array2dFile&); // assignment operator
  
};



#endif