10 class Array2dFileLabel
26 static const int L_EMPTY = 0;
27 static const int L_HISTORY = 1;
28 static const int L_USER = 2;
32 Array2dFileLabel(const char* const str, double ctime = 0.);
34 Array2dFileLabel(const int type, const char* const str, double ctime = 0.);
38 const string& getLabelString (void) const
41 kfloat64 getCalcTime (void) const
44 kfloat64 getLabelType (void) const
45 { return label_type; }
47 void getDateString (string& str) const;
65 bool headerWrite (void);
67 bool headerRead (void);
69 bool arrayDataRead (void);
71 bool labelSeek (unsigned int label_num);
74 kuint16 axis_increment_known;
75 kfloat64 mIncX, mIncY;
76 kuint16 axis_extent_known;
77 kfloat64 mMinX, mMaxX, mMinY, mMaxY;
78 kfloat64 mOffsetPV, mScalePV;
87 static const int INT8 = 1;
88 static const int UINT8 = 2;
89 static const int INT16 = 3;
90 static const int UINT16 = 4;
91 static const int INT32 = 5;
92 static const int UINT32 = 6;
93 static const int FLOAT32 = 7;
94 static const int FLOAT64 = 8;
96 Array2dFile (unsigned int nx, unsigned int ny);
97 Array2dFile (const char* const filename);
98 Array2dFile (const char* const filename, unsigned int nx, unsigned int ny);
101 unsigned int getNumLabels (void) const
102 { return num_labels; }
104 bool labelRead (Array2dFileLabel& label, unsigned int label_num);
106 void labelAdd (const Array2dFileLabel& label);
108 void labelAdd (const char* const label_str, double calc_time=0.);
110 void labelAdd (int type, const char* const label_str, double calc_time=0.);
112 void fileClose (void);
114 void setPixelType (int type)
115 { mPixelType = type; }
117 kuint32 nx (void) const
120 kuint32 ny (void) const
123 void setAxisIncrement (double mIncX, double mIncY);
125 void setAxisExtent (double mMinX, double mMaxX, double mMinY, double mMaxY);
127 void getPixelValueRange (T& pvmin, T& pvmax);
129 void doPixelOffsetScale (double offset, double scale);
131 T** getArray (void) const
132 { return (array == NULL ? NULL : array->getArray()); }
134 bool arrayDataWrite (void);
136 bool fileRead (void);
138 bool fileCreate (void);
140 const string& GetFilename (void) const
146 Array2dFile<T>::Array2dFile (unsigned int x, unsigned int y)
151 array = new Array2d<T> (mNX, mNY);
155 Array2dFile<T>::Array2dFile (const char * const str, unsigned int x, unsigned int y)
161 array = new Array2d<T> (mNX, mNY);
165 Array2dFile<T>::Array2dFile (const char * const str)
173 Array2dFile<T>::init (void)
175 mPixelSize = sizeof(T);
176 signature = ('I' * 256 + 'F');
182 axis_increment_known = false;
183 axis_extent_known = false;
185 mMinX = mMaxX = mMinY = mMaxY = 0;
192 const type_info& t_id = typeid(T);
193 cout << t_id.name() << endl;
194 const type_info& comp_id = typeid(T);
197 mPixelType = FLOAT64;
198 else if (t_id == typeid(kfloat32))
199 mPixelType = FLOAT32;
200 else if (t_id == typeid(kint32))
202 else if (t_id == typeid(kuint32))
204 else if (t_id == typeid(kint16))
206 else if (t_id == typeid(kuint16))
208 else if (t_id == typeid(kint8))
210 else if (t_id == typeid(kuint8))
216 bHeaderWritten = false;
217 bDataWritten = false;
221 Array2dFile<T>::~Array2dFile (void)
229 Array2dFile<T>::fileClose (void)
232 if (file_id >= 0 && array != NULL) {
241 Array2dFile<T>::fileCreate (void)
243 // io = new iostream(filename, ios::out | ios::in | ios::trunc | io::binary);
244 if ((file_id = open (filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) < 0) {
245 sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", filename.c_str());
254 Array2dFile<T>::fileRead (void)
256 // io = new iostream(filename, ios::out | ios::in | io::binary);
257 if ((file_id = open (filename.c_str(), O_RDONLY | O_BINARY)) < 0) {
258 sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", filename.c_str());
266 array = new Array2d<T> (mNX, mNY);
275 Array2dFile<T>::setAxisIncrement (double incX, double incY)
277 axis_increment_known = true;
284 Array2dFile<T>::setAxisExtent (double minX, double maxX, double minY, double maxY)
286 axis_extent_known = true;
295 Array2dFile<T>::getPixelValueRange (T& pvmin, T& pvmax)
298 T** da = array.GetArray();
299 pvmax = pvmin = da[0][0];
300 for (int ix = 0; ix < mNX; ix++)
301 for (int iy = 0; iy < mNY; iy++)
302 if (pvmax < da[ix][iy])
304 else if (pvmin > da[ix][iy])
311 Array2dFile<T>::doPixelOffsetScale (double offset, double scale)
317 T** ad = adf->getArray();
318 for (unsigned int ix = 0; ix < mNX; ix++)
319 for (unsigned int iy = 0; iy < mNY; iy++)
320 ad[ix][iy] = (ad[ix][iy] - offset) * scale;
326 Array2dFile<T>::headerRead (void)
329 sys_error (ERR_WARNING, "Tried to read header with file closed [headerRead]");
333 lseek (file_id, 0, SEEK_SET);
334 kuint16 file_signature;
335 kuint16 file_mPixelSize;
336 kuint16 file_mPixelType;
338 read_nint16 (&headersize, file_id);
339 read_nint16 (&file_signature, file_id);
340 read_nint16 (&num_labels, file_id);
341 read_nint16 (&file_mPixelType, file_id);
342 read_nint16 (&file_mPixelSize, file_id);
343 read_nint32 (&mNX, file_id);
344 read_nint32 (&mNY, file_id);
345 read_nint16 (&axis_increment_known, file_id);
346 read_nfloat64 (&mIncX, file_id);
347 read_nfloat64 (&mIncY, file_id);
348 read_nint16 (&axis_extent_known, file_id);
349 read_nfloat64 (&mMinX, file_id);
350 read_nfloat64 (&mMaxX, file_id);
351 read_nfloat64 (&mMinY, file_id);
352 read_nfloat64 (&mMaxY, file_id);
353 read_nfloat64 (&mOffsetPV, file_id);
354 read_nfloat64 (&mScalePV, file_id);
356 int read_headersize = lseek (file_id, 0, SEEK_CUR);
357 if (read_headersize != headersize) {
358 sys_error (ERR_WARNING, "Read headersize %d != file headersize %d", read_headersize, headersize);
361 if (file_signature != signature) {
362 sys_error (ERR_WARNING, "File signature %d != true signature %d", file_signature, signature);
365 if (file_mPixelType != mPixelType) {
366 sys_error (ERR_WARNING, "File pixel type %d != class pixel type %d", file_mPixelType, mPixelType);
369 if (file_mPixelSize != mPixelSize) {
370 sys_error (ERR_WARNING, "File pixel size %d != class pixel size %d", file_mPixelSize, mPixelSize);
379 Array2dFile<T>::headerWrite (void)
382 sys_error (ERR_WARNING, "Tried to write header with file closed");
386 lseek (file_id, 0, SEEK_SET);
387 write_nint16 (&headersize, file_id);
388 write_nint16 (&signature, file_id);
389 write_nint16 (&num_labels, file_id);
390 write_nint16 (&mPixelType, file_id);
391 write_nint16 (&mPixelSize, file_id);
392 write_nint32 (&mNX, file_id);
393 write_nint32 (&mNY, file_id);
394 write_nint16 (&axis_increment_known, file_id);
395 write_nfloat64 (&mIncX, file_id);
396 write_nfloat64 (&mIncY, file_id);
397 write_nint16 (&axis_extent_known, file_id);
398 write_nfloat64 (&mMinX, file_id);
399 write_nfloat64 (&mMaxX, file_id);
400 write_nfloat64 (&mMinY, file_id);
401 write_nfloat64 (&mMaxY, file_id);
402 write_nfloat64 (&mOffsetPV, file_id);
403 write_nfloat64 (&mScalePV, file_id);
405 headersize = lseek (file_id, 0, SEEK_CUR);
406 lseek (file_id, 0, SEEK_SET);
407 write_nint16 (&headersize, file_id);
414 Array2dFile<T>::arrayDataWrite (void)
417 sys_error (ERR_WARNING, "Tried to arrayDataWrite with file_id < 0");
421 lseek (file_id, headersize, SEEK_SET);
422 for (unsigned int ix = 0; ix < mNX; ix++)
423 for (unsigned int iy = 0; iy < mNY; iy++) {
424 T value = array->array_data[ix][iy];
425 ConvertNetworkOrder (&value, sizeof(T));
426 write (file_id, &value, mPixelSize);
434 Array2dFile<T>::arrayDataRead (void)
437 sys_error (ERR_WARNING, "Tried to arrayDataRead with file_id < 0");
441 lseek (file_id, headersize, SEEK_SET);
443 for (int ix = 0; ix < mNX; ix++)
444 for (unsigned int iy = 0; iy < mNY; iy++) {
445 read (file_id, &pixelBuffer, mPixelSize);
446 ConvertNetworkOrder (&pixelBuffer, sizeof(T));
447 array->array_data[ix][iy] = pixelBuffer;
455 Array2dFile<T>::labelSeek (unsigned int label_num)
457 if (label_num > num_labels) {
458 sys_error (ERR_WARNING, "label_num %d > num_labels %d [labelSeek]");
462 if (array == NULL) { // Could not have written data if array not allocated
463 sys_error (ERR_WARNING, "array == NULL [labelSeek]");
467 off_t pos = headersize + array->sizeofArray();
468 if (lseek (file_id, pos, SEEK_SET) != pos) {
469 sys_error (ERR_WARNING, "Can't seek to end of data array");
473 for (int i = 0; i < label_num; i++)
475 pos += 22; // Skip to string length
476 if (lseek (file_id, pos, SEEK_SET) != pos) {
477 sys_error (ERR_WARNING, "Can't seek to string length");
481 read_nint16 (&strlength, file_id);
482 pos += 2 + strlength; // Skip label string length + data
483 if (lseek (file_id, pos, SEEK_SET) != pos) {
484 sys_error (ERR_WARNING, "Can't seek past label string");
494 Array2dFile<T>::labelRead (Array2dFileLabel& label, unsigned int label_num)
496 if (label_num >= num_labels) {
497 sys_error (ERR_WARNING, "Trying to read past number of labels [labelRead]");
501 if (! labelSeek (label_num)) {
502 sys_error (ERR_WARNING, "Error calling labelSeek");
506 read_nint16 (&label.label_type, file_id);
507 read_nint16 (&label.year, file_id);
508 read_nint16 (&label.month, file_id);
509 read_nint16 (&label.day, file_id);
510 read_nint16 (&label.hour, file_id);
511 read_nint16 (&label.minute, file_id);
512 read_nint16 (&label.second, file_id);
513 read_nfloat64 (&label.calc_time, file_id);
516 read_nint16 (&strlength, file_id);
517 char *str = new char [strlength+1];
518 read (file_id, str, strlength);
519 label.label_str = str;
527 Array2dFile<T>::labelAdd (const char* const lstr, double calc_time=0.)
529 labelAdd (Array2dFileLabel::L_HISTORY, lstr, calc_time);
534 Array2dFile<T>::labelAdd (int type, const char* const lstr, double calc_time=0.)
536 Array2dFileLabel label (type, lstr, calc_time);
543 Array2dFile<T>::labelAdd (const Array2dFileLabel& label)
545 labelSeek (num_labels);
547 write_nint16 (&label.label_type, file_id);
548 write_nint16 (&label.year, file_id);
549 write_nint16 (&label.month, file_id);
550 write_nint16 (&label.day, file_id);
551 write_nint16 (&label.hour, file_id);
552 write_nint16 (&label.minute, file_id);
553 write_nint16 (&label.second, file_id);
554 write_nfloat64 (&label.calc_time, file_id);
555 kuint16 strlength = label.label_str.length();
556 write_nint16 (&strlength, file_id);
557 write (file_id, static_cast<const void*>(label.label_str.c_str()), strlength);
575 Array2dFile<kfloat32> adf;
577 F32Image (const char* const fname, unsigned int nx, unsigned int ny) : adf (fname, nx, ny)
579 adf.setPixelType (Array2dFile<kfloat64>::FLOAT32);
582 F32Image (unsigned int nx, unsigned int ny) : adf (nx, ny)
584 adf.setPixelType (Array2dFile<kfloat64>::FLOAT32);
587 F32Image (const char* const fname) : adf (fname)
589 adf.setPixelType (Array2dFile<kfloat64>::FLOAT32);
593 MPI_Datatype getMPIDataType (void) const
594 { return MPI_FLOAT; }
601 Array2dFile<kfloat64> adf;
604 MPI_Datatype getMPIDataType (void) const
605 { return MPI_DOUBLE; }
608 F64Image (const char* const fname, unsigned int nx, unsigned int ny) : adf (fname, nx, ny)
610 adf.setPixelType (Array2dFile<kfloat64>::FLOAT64);
613 F64Image (unsigned int nx, unsigned int ny) : adf (nx, ny)
615 adf.setPixelType (Array2dFile<kfloat64>::FLOAT64);
618 F64Image (const char* const fname) : adf (fname)
620 adf.setPixelType (Array2dFile<kfloat64>::FLOAT64);
624 typedef F64Image ImageFile;
625 typedef kfloat64 ImageFileValue;
626 typedef kfloat64* ImageFileColumn;
627 typedef kfloat64** ImageFileArray;