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__imagicio_h__
00037 #define eman__imagicio_h__ 1
00038
00039 #include "imageio.h"
00040
00041 namespace EMAN
00042 {
00069 class ImagicIO:public ImageIO
00070 {
00071 public:
00072 static const char *HED_EXT;
00073 static const char *IMG_EXT;
00074
00075 explicit ImagicIO(string filename, IOMode rw_mode = READ_ONLY);
00076 ~ImagicIO();
00077
00078 DEFINE_IMAGEIO_FUNC;
00079 static bool is_valid(const void *first_block);
00080
00081 bool is_single_image_format() const
00082 {
00083 return false;
00084 }
00085
00086 int get_nimg();
00087
00088 private:
00089 static const char *REAL_TYPE_MAGIC;
00090 static const char *CTF_MAGIC;
00091
00092
00093 enum DataType
00094 {
00095 IMAGIC_UCHAR,
00096 IMAGIC_USHORT,
00097 IMAGIC_FLOAT,
00098 IMAGIC_FLOAT_COMPLEX,
00099 IMAGIC_FFT_FLOAT_COMPLEX,
00100 IMAGIC_UNKNOWN_TYPE
00101 };
00102
00103 enum
00104 {
00105 NUM_4BYTES_PRE_IXOLD = 14,
00106 NUM_4BYTES_AFTER_IXOLD = 14,
00107 NUM_4BYTES_AFTER_SPACE = 207
00108 };
00109
00110 struct ImagicHeader
00111 {
00112 int imgnum;
00113 int count;
00114 int error;
00115 int headrec;
00116 int mday;
00117 int month;
00118 int year;
00119 int hour;
00120 int minute;
00121 int sec;
00122 int reals;
00123 int pixels;
00124 int ny;
00125 int nx;
00126 char type[4];
00127 int ixold;
00128 int iyold;
00129 float avdens;
00130 float sigma;
00131 float varia;
00132 float oldav;
00133 float max;
00134 float min;
00135 int complex;
00136 float cellx;
00137 float celly;
00138 float cellz;
00139 float cella1;
00140 float cella2;
00141 char label[80];
00142 int space[8];
00143 float mrc1[4];
00144 int mrc2;
00145 int space2[7];
00146 int lbuf;
00147 int inn;
00148 int iblp;
00149 int ifb;
00150 int lbr;
00151 int lbw;
00152 int lastlr;
00153 int lastlw;
00154 int ncflag;
00155 int num;
00156 int nhalf;
00157 int ibsd;
00158 int ihfl;
00159 int lcbr;
00160 int lcbw;
00161 int imstr;
00162 int imstw;
00163 int istart;
00164 int iend;
00165 int leff;
00166 int linbuf;
00167 int ntotbuf;
00168 int space3[5];
00169 int icstart;
00170 int icend;
00171 int rdonly;
00172 int misc[157];
00173 };
00174
00175 size_t get_datatype_size(DataType t);
00176 int to_em_datatype(DataType t);
00177 void make_header_host_endian(ImagicHeader & hed);
00178 void swap_header(ImagicHeader & hed);
00179 DataType get_datatype_from_name(const char *name);
00180
00182 Ctf * read_ctf(const ImagicHeader& hed) const;
00183 void write_ctf(const Ctf * const ctf, int image_index = 0);
00184
00185 private:
00186 string filename;
00187 string hed_filename;
00188 string img_filename;
00189
00190 IOMode rw_mode;
00191 FILE *hed_file;
00192 FILE *img_file;
00193
00194 ImagicHeader imagich;
00195 bool is_big_endian;
00196 bool initialized;
00197 bool is_new_hed;
00198 bool is_new_img;
00199
00200 DataType datatype;
00201 int nz;
00202 };
00203
00204 }
00205
00206
00207 #endif //eman__imagicio_h__