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__pifio_h__
00037 #define eman__pifio_h__ 1
00038
00039 #include "imageio.h"
00040
00041 namespace EMAN
00042 {
00056 class PifIO:public ImageIO
00057 {
00058 public:
00059 explicit PifIO(const string & filename, IOMode rw_mode = READ_ONLY);
00060 ~PifIO();
00061
00062 DEFINE_IMAGEIO_FUNC;
00063 static bool is_valid(const void *first_block);
00064
00065 bool is_single_image_format() const
00066 {
00067 return false;
00068 }
00069 int get_nimg();
00070
00071 private:
00072 enum
00073 {
00074 PIF_MAGIC_NUM = 8
00075 };
00076
00077 enum PifDataMode
00078 {
00079 PIF_CHAR = 0,
00080 PIF_SHORT = 1,
00081 PIF_FLOAT_INT = 2,
00082 PIF_SHORT_COMPLEX = 3,
00083 PIF_FLOAT_INT_COMPLEX = 4,
00084 PIF_BOXED_DATA = 6,
00085 PIF_SHORT_FLOAT = 7,
00086 PIF_SHORT_FLOAT_COMPLEX = 8,
00087 PIF_FLOAT = 9,
00088 PIF_FLOAT_COMPLEX = 10,
00089 PIF_MAP_FLOAT_SHORT = 20,
00090 PIF_MAP_FLOAT_INT = 21,
00091 PIF_MAP_FLOAT_INT_2 = 40,
00092 PIF_BOXED_FLOAT_INT = 46,
00093 PIF_INVALID
00094 };
00095
00096
00097
00098 struct PifFileHeader
00099 {
00100 int magic[2];
00101 char scalefactor[16];
00102 int nimg;
00103 int endian;
00104 char program[32];
00105 int htype;
00106 int nx;
00107 int ny;
00108 int nz;
00109 int mode;
00110
00111 int even;
00112 int mrcX;
00113 int mrcY;
00114 int mrcZ;
00115 char scale_fac[16];
00116 char ctf_a0[13];
00117 char ctf_a1[13];
00118 char ctf_a2[13];
00119 char ctf_a3[13];
00120 char ctf_a4[13];
00121 char ctf_a5[13];
00122 char pad[318];
00123 };
00124
00125 struct PifColorMap
00126 {
00127 short r[256];
00128 short g[256];
00129 short b[256];
00130 };
00131
00132 struct PifImageHeader
00133 {
00134 int nx;
00135 int ny;
00136 int nz;
00137 int mode;
00138 int bkg;
00139 int radius;
00140 int xstart;
00141 int ystart;
00142 int zstart;
00143 int mx;
00144 int my;
00145 int mz;
00146 int xlen;
00147 int ylen;
00148 int zlen;
00149 int alpha;
00150 int beta;
00151 int gamma;
00152 int mapc;
00153 int mapr;
00154 int maps;
00155 int min;
00156 int max;
00157 int mean;
00158 int sigma;
00159 int ispg;
00160 int nsymbt;
00161 int xorigin;
00162 int yorigin;
00163 char title[80];
00164 char time[32];
00165 char imagenum[16];
00166 char scannum[8];
00167 int aoverb;
00168 int mapabang;
00169 int pad[63];
00170 };
00171
00172 int get_mode_size(PifDataMode mode);
00173 bool is_float_int(int mode);
00174 void fseek_to(int image_index);
00175 int to_em_datatype(int pif_datatype);
00176 int to_pif_datatype(int em_datatype);
00177
00178 string filename;
00179 IOMode rw_mode;
00180 PifFileHeader pfh;
00181 FILE *pif_file;
00182 int mode_size;
00183 bool is_big_endian;
00184 bool initialized;
00185 bool is_new_file;
00186 float real_scale_factor;
00187 };
00188
00189 }
00190
00191
00192 #endif //eman__pifio_h__