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__emutil__h__
00037 #define eman__emutil__h__ 1
00038
00039 #include "emobject.h"
00040 #include "emassert.h"
00041 #include <string.h>
00042
00043 using std::string;
00044 using std::vector;
00045
00046
00047
00048
00049
00050 template <class T>
00051 inline void EMDeletePtr(T & x)
00052 {
00053 #ifdef _WIN32
00054 if(x != NULL) {
00055 delete x;
00056 x = NULL;
00057 }
00058 #else
00059 {Assert(x != NULL);}
00060 delete x;
00061 x = NULL;
00062 #endif
00063 }
00064
00065 template <class T>
00066 inline void EMDeleteArray(T & x)
00067 {
00068 #ifdef _WIN32
00069 if(x != NULL) {
00070 delete x;
00071 x = NULL;
00072 }
00073 #else
00074 {Assert(x != NULL);}
00075 delete [] x;
00076 x = NULL;
00077 #endif
00078 }
00079
00080 namespace EMAN
00081 {
00082 class Region;
00083 class ImageIO;
00084
00085 class EMUtil
00086 {
00087 public:
00092 enum EMDataType
00093 {
00094 EM_UNKNOWN,
00095 EM_CHAR,
00096 EM_UCHAR,
00097 EM_SHORT,
00098 EM_USHORT,
00099 EM_INT,
00100 EM_UINT,
00101 EM_FLOAT,
00102 EM_DOUBLE,
00103 EM_SHORT_COMPLEX,
00104 EM_USHORT_COMPLEX,
00105 EM_FLOAT_COMPLEX
00106 };
00107
00110 enum ImageType
00111 {
00112 IMAGE_UNKNOWN,
00113 IMAGE_MRC,
00114 IMAGE_SPIDER,
00115 IMAGE_SINGLE_SPIDER,
00116 IMAGE_IMAGIC,
00117 IMAGE_HDF,
00118 IMAGE_DM3,
00119 IMAGE_DM4,
00120 IMAGE_TIFF,
00121 IMAGE_PGM,
00122 IMAGE_LST,
00123 IMAGE_PIF,
00124 IMAGE_VTK,
00125 IMAGE_PNG,
00126 IMAGE_SAL,
00127 IMAGE_ICOS,
00128 IMAGE_EMIM,
00129 IMAGE_GATAN2,
00130 IMAGE_AMIRA,
00131 IMAGE_XPLOR,
00132 IMAGE_EM,
00133 IMAGE_V4L,
00134 IMAGE_JPEG,
00135 IMAGE_FITS,
00136 IMAGE_LSTFAST,
00137 IMAGE_DF3,
00138 IMAGE_OMAP,
00139 IMAGE_SITUS,
00140 IMAGE_SER
00141 };
00142
00143 static EMData *vertical_acf(const EMData * image, int maxdy);
00144
00145 static EMData *make_image_median(const vector < EMData * >&image_list);
00146
00151 static ImageType get_image_ext_type(const string & file_ext);
00152
00157 static ImageType get_image_type(const string & filename);
00158
00165 static bool is_valid_filename(const string & filename);
00166
00171 static int get_image_count(const string & filename);
00172
00180 static ImageIO *get_imageio(const string & filename, int rw_mode,
00181 ImageType image_type = IMAGE_UNKNOWN);
00182
00187 static const char *get_imagetype_name(EMUtil::ImageType type);
00188
00193 static const char *get_datatype_string(EMDataType type);
00194
00204 static void get_region_dims(const Region * area, int nx, int *area_x, int ny,
00205 int *area_y, int nz = 1, int *area_z = 0);
00206
00215 static void get_region_origins(const Region * area, int *p_x0, int *p_y0,
00216 int *p_z0 = 0, int nz = 1, int image_index = 0);
00217
00237 static void process_region_io(void *cdata, FILE * file, int rw_mode,
00238 int image_index, size_t mode_size, int nx,
00239 int ny, int nz = 1, const Region * area = 0,
00240 bool need_flip = false, ImageType imgtype=IMAGE_UNKNOWN,
00241 int pre_row = 0, int post_row = 0);
00242
00243
00249 static void process_ascii_region_io(float *data, FILE * file, int rw_mode,
00250 int image_index, size_t mode_size,
00251 int nx, int ny, int nz,
00252 const Region * area, bool has_index_line,
00253 int nitems_per_line, const char *outformat);
00254
00255
00259 static void dump_dict(const Dict & dict);
00260
00266 static bool is_same_size(const EMData * image1, const EMData * image2);
00267
00273 static bool is_same_ctf(const EMData * image1, const EMData * image2);
00274
00275
00276 static bool is_complex_type(EMDataType datatype);
00277
00278 static void jump_lines(FILE * file, int nlines);
00279
00280 static vector<string> get_euler_names(const string & euler_type);
00281
00289 static vector<EMObject> get_all_attributes(const string & file_name, const string & attr_name);
00290
00304 static void getRenderMinMax(float * data, const int nx, const int ny, float& rendermin, float& rendermax, const int nz = 1);
00305
00306 #ifdef EM_HDF5
00307
00314 static EMObject read_hdf_attribute(const string & filename, const string & key, int image_index=0);
00315
00324 static int write_hdf_attribute(const string & filename, const string & key, EMObject value, int image_index=0);
00325
00333 static int delete_hdf_attribute(const string & filename, const string & key, int image_index=0);
00334 #endif //EM_HDF5
00335
00336 static bool cuda_available() {
00337
00338
00339
00340 return false;
00341
00342 }
00343
00344 inline static void* em_malloc(const size_t size) {
00345 return malloc(size);
00346 }
00347
00348 inline static void* em_calloc(const size_t nmemb,const size_t size) {
00349 return calloc(nmemb,size);
00350 }
00351
00352 inline static void* em_realloc(void* data,const size_t new_size) {
00353 return realloc(data, new_size);
00354 }
00355 inline static void em_memset(void* data, const int value, const size_t size) {
00356 memset(data, value, size);
00357 }
00358 inline static void em_free(void*data) {
00359 free(data);
00360 }
00361
00362 inline static void em_memcpy(void* dst,const void* const src,const size_t size) {
00363 memcpy(dst,src,size);
00364 }
00365 private:
00366 static ImageType fast_get_image_type(const string & filename,
00367 const void *first_block,
00368 off_t file_size);
00369
00370 static void jump_lines_by_items(FILE * file, int nitems, int nitems_per_line);
00371
00372
00373
00374 static void process_numbers_io(FILE * file, int rw_mode,
00375 int nitems_per_line,
00376 size_t mode_size, int start, int end,
00377 float *data, int *p_i,
00378 const char *outformat);
00379
00380 static void exclude_numbers_io(FILE * file, int rw_mode,
00381 int nitems_per_line,
00382 size_t mode_size, int start, int end,
00383 float * data, int *p_i,
00384 const char *outformat);
00385
00386 static void process_lines_io(FILE * file, int rw_mode,
00387 int nitems_per_line, size_t mode_size,
00388 int nitems, float *data, int *p_i,
00389 const char *outformat);
00390
00391
00392 };
00393
00394 struct ImageScore {
00395 int index;
00396 float score;
00397 ImageScore(int i=0, float s=0) : index(i), score(s) {}
00398 };
00399
00400 class ImageSort {
00401 public:
00402 ImageSort(int n);
00403 ~ImageSort();
00404
00405 void sort();
00406
00407 void set(int i, float score);
00408 int get_index(int i) const;
00409 float get_score(int i) const;
00410
00411 int size() const;
00412 private:
00413 ImageScore* image_scores;
00414 int n;
00415
00416 };
00417 }
00418
00419 #endif //eman__emutil__h__