00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef eman__serio_h__
00037 #define eman__serio_h__ 1
00038
00039 #include "imageio.h"
00040
00041 namespace EMAN
00042 {
00053 class SerIO : public ImageIO
00054 {
00055 public:
00056 explicit SerIO(const string & filename, IOMode rw_mode = READ_ONLY);
00057 ~SerIO();
00058
00059 DEFINE_IMAGEIO_FUNC;
00060 static bool is_valid(const void *first_block);
00061 int get_nimg();
00062
00063 private:
00064 enum SerImgMode {
00065 oneD = 0x4120,
00066 twoD = 0x4122
00067 };
00068
00069 enum SerTagType {
00070 timeOnly = 0x4152,
00071 posTime = 0x4122
00072 };
00073
00074 enum SerDataMode {
00075 SER_UCHAR = 1,
00076 SER_USHORT,
00077 SER_UINT,
00078 SER_CHAR,
00079 SER_SHORT,
00080 SER_INT,
00081 SER_FLOAT,
00082 SER_DOUBLE,
00083 SER_COMPLEX8,
00084 SER_COMPLEX16,
00085 UNKNOWN
00086 };
00087
00088
00089
00090 struct SerHeader {
00091 short ByteOrder;
00092 short SeriesID;
00093 short SeriesVersion;
00094 int DataTypeID;
00095 int TagTypeID;
00096 int TotalNumberElements;
00097 int ValidNumberElements;
00098 int OffsetArrayOffset;
00099 int NumberDimensions;
00100 };
00101
00102 string filename;
00103 IOMode rw_mode;
00104 FILE * serfile;
00105 bool initialized;
00106 bool is_new_file;
00107
00108 SerHeader serh;
00109
00110 int * data_offset_array;
00111 int * tag_offset_array;
00112 int nimg;
00113 int nx;
00114 int ny;
00115 int nz;
00116 int datatypeid;
00117 int datamode;
00118
00120 void read_dim_arr(Dict & dict, int idx);
00121
00123 void read_data_element(Dict & dict);
00124
00126 void read_data_tag(Dict & dict);
00127 };
00128
00129 }
00130
00131 #endif //eman__serio_h__