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__emdata_h__
00037 #define eman__emdata_h__ 1
00038
00039 #ifdef _WIN32
00040 #pragma warning(disable:4819)
00041 #endif //_WIN32
00042
00043 #include <cfloat>
00044 #include <complex>
00045 #include <fstream>
00046
00047 #include "sparx/fundamentals.h"
00048 #include "emutil.h"
00049 #include "util.h"
00050 #include "sparx/emarray.h"
00051 #include "geometry.h"
00052 #include "transform.h"
00053 #ifdef EMAN2_USING_CUDA
00054 #include <cuda_runtime_api.h>
00055 #include "cuda/cuda_util.h"
00056 #endif // EMAN2_USING_CUDA
00057 using std::string;
00058 using std::vector;
00059 using std::map;
00060
00061 using std::ostream;
00062
00063 #include <utility>
00064 using std::pair;
00065
00066 namespace EMAN
00067 {
00068 class ImageIO;
00069 class Ctf;
00070 class XYData;
00071 class Transform;
00072 class GLUtil;
00073
00074 typedef boost::multi_array_ref<float, 2> MArray2D;
00075 typedef boost::multi_array_ref<float, 3> MArray3D;
00076 typedef boost::multi_array_ref<std::complex<float>, 2> MCArray2D;
00077 typedef boost::multi_array_ref<std::complex<float>, 3> MCArray3D;
00078 typedef boost::multi_array<int, 2> MIArray2D;
00079 typedef boost::multi_array<int, 3> MIArray3D;
00080
00087 class EMData
00088 {
00089 friend class GLUtil;
00090
00092 #include "emdata_io.h"
00093
00095 #include "emdata_metadata.h"
00096
00098 #include "emdata_modular.h"
00099
00101 #include "emdata_transform.h"
00102
00104 #include "emdata_core.h"
00105
00107 #include "sparx/emdata_sparx.h"
00108 #ifdef EMAN2_USING_CUDA
00109
00110 #include "emdata_cuda.h"
00111 #endif // EMAN2_USING_CUDA
00112
00113 public:
00114 enum FFTPLACE { FFT_OUT_OF_PLACE, FFT_IN_PLACE };
00115 enum WINDOWPLACE { WINDOW_OUT_OF_PLACE, WINDOW_IN_PLACE };
00116
00118 EMData();
00119 ~ EMData();
00120
00124 explicit EMData(const string& filename, int image_index=0);
00125
00133 EMData(int nx, int ny, int nz=1, bool is_real=true);
00134
00144 EMData(float* data, const int nx, const int ny, const int nz, const Dict& attr_dict = Dict());
00145
00156 EMData(float* data, float* cudadata, const int nx, const int ny, const int nz, const Dict& attr_dict = Dict());
00157
00158
00164 EMData(const EMData& that);
00165
00171 EMData& operator=(const EMData& that);
00172
00173
00181 EMData *get_clip(const Region & area, const float fill = 0) const;
00182
00189 void clip_inplace(const Region & area,const float& fill_value=0);
00190
00195 EMData *get_top_half() const;
00196
00197
00206 EMData *get_rotated_clip(const Transform & xform, const IntSize &size, float scale=1.0);
00207
00218 EMData* window_center(int l);
00219
00220
00235 float *setup4slice(bool redo = true);
00236
00237
00241 void scale(float scale_factor);
00242
00243
00249 void translate(float dx, float dy, float dz);
00250
00251
00255 void translate(const Vec3f &translation);
00256
00257
00264 void translate(int dx, int dy, int dz);
00265
00266
00271 void translate(const Vec3i &translation);
00272
00273
00278 void rotate(const Transform & t);
00279
00280 float max_3D_pixel_error(const Transform &t1, const Transform &t2, float r);
00281
00288 void rotate(float az, float alt, float phi);
00289
00290
00295
00296
00300 inline void transform(const Transform& t) {
00301 ENTERFUNC;
00302 process_inplace("xform",Dict("transform",(Transform*)(&t)));
00303
00304 EXITFUNC;
00305 }
00306
00311 inline void rotate_translate(const Transform & t) {
00312 cout << "Deprecation warning. Please consider using EMData::transform() instead " << endl;
00313 transform(t); }
00314
00324 void rotate_translate(float az, float alt, float phi, float dx, float dy, float dz);
00325
00326
00339 void rotate_translate(float az, float alt, float phi, float dx, float dy,
00340 float dz, float pdx, float pdy, float pdz);
00341
00342
00348 void rotate_x(int dx);
00349
00350
00355 inline void rotate_180() {
00356 ENTERFUNC;
00357 process_inplace("math.rotate.180",Dict());
00358 EXITFUNC;
00359 }
00360
00361
00375 double dot_rotate_translate(EMData * with, float dx, float dy, float da,const bool mirror=false);
00376
00377
00388 EMData *little_big_dot(EMData * little_img, bool do_sigma = false);
00389
00390
00403 EMData *do_radon();
00404
00405
00421 EMData *calc_ccf(EMData * with = 0, fp_flag fpflag = CIRCULANT, bool center=false);
00422
00435 void zero_corner_circulant(const int radius = 0);
00436
00455 EMData *calc_ccfx( EMData * const with, int y0 = 0, int y1 = -1, bool nosum = false, bool flip = false);
00456
00457
00466 EMData *make_rotational_footprint(bool unwrap = true);
00467 EMData *make_rotational_footprint_e1(bool unwrap = true);
00468 EMData *make_rotational_footprint_cmc(bool unwrap = true);
00469
00486 EMData *make_footprint(int type=0);
00487
00488
00501 EMData *calc_mutual_correlation(EMData * with, bool tocorner = false, EMData * filter = 0);
00502
00503
00519 EMData *unwrap(int r1 = -1, int r2 = -1, int xs = -1, int dx = 0,
00520 int dy = 0, bool do360 = false, bool weight_radial=true) const;
00521
00522 EMData * unwrap_largerR(int r1,int r2,int xs, float rmax_f);
00523
00524 EMData *oneDfftPolar(int size, float rmax, float MAXR);
00525
00526
00534 void apply_radial_func(float x0, float dx, vector < float >array, bool interp = true);
00535
00536
00548 vector < float >calc_radial_dist(int n, float x0, float dx,bool inten);
00549
00550
00562 vector < float >calc_radial_dist(int n, float x0, float dx, int nwedge, bool inten);
00563
00564
00568 void cconj();
00569
00570
00578 void add_incoherent(EMData * obj);
00579
00580
00592 vector <float> calc_hist(int hist_size = 128, float hist_min = 0, float hist_max = 0, const float& brt = 0.0f, const float& cont = 1.0f);
00593
00594
00606 vector<float> calc_az_dist(int n, float a0, float da, float rmin,
00607 float rmax);
00608
00609 #if 0
00610 void calc_rcf(EMData * with, vector < float >&sum_array);
00611 #endif
00612
00625 float calc_dist(EMData * second_img, int y_index = 0) const;
00626
00643 EMData *calc_flcf(EMData * with);
00644
00663 EMData *calc_fast_sigma_image( EMData* mask);
00664
00670 EMData *convolute(EMData * with);
00671
00672 #if 0
00673 void create_ctf_map(CtfMapType type, XYData * sf = 0);
00674 #endif
00675
00676
00698 void common_lines(EMData * image1, EMData * image2, int mode = 0,
00699 int steps = 180, bool horizontal = false);
00700
00711 void common_lines_real(EMData * image1, EMData * image2,
00712 int steps = 180, bool horizontal = false);
00713
00727 void cut_slice(const EMData * const map, const Transform& tr, bool interpolate = true);
00728
00743 void uncut_slice(EMData * const map, const Transform& tr) const;
00744
00748 int getResolution() const {
00749 int resolution = 0;
00750 int num = 1;
00751 while(num < get_xsize()) {
00752 resolution++;
00753 num = 1 << resolution;
00754 }
00755
00756 return resolution;
00757 }
00758
00761 void debug_print_parms()
00762 {
00763 std::cout << "Printing EMData params" << std::endl;
00764 for ( Dict::const_iterator it = attr_dict.begin(); it != attr_dict.end(); ++it )
00765 {
00766 std::cout << (it->first) << " " << (it->second).to_str() << std::endl;
00767 }
00768 std::cout << "Done printing EMData params" << std::endl;
00769 }
00770
00776 void set_xyz_origin(float origin_x, float origin_y, float origin_z);
00777
00778 static int totalalloc;
00779 private:
00786 enum EMDataFlags {
00787
00788
00789 EMDATA_BUSY = 1 << 3,
00790 EMDATA_HASCTFF = 1 << 4,
00791 EMDATA_NEEDUPD = 1 << 5,
00792
00793 EMDATA_FLIP = 1 << 7,
00794 EMDATA_PAD = 1 << 8,
00795 EMDATA_FFTODD = 1 << 9,
00796 EMDATA_SHUFFLE = 1 << 10,
00797 EMDATA_FH = 1 << 11,
00798 EMDATA_CPU_NEEDS_UPDATE = 1 << 12,
00799 EMDATA_GPU_NEEDS_UPDATE = 1 << 13,
00800 EMDATA_GPU_RO_NEEDS_UPDATE = 1 << 14
00801 };
00802
00803 void update_stat() const;
00804 void save_byteorder_to_dict(ImageIO * imageio);
00805
00806 private:
00808 mutable Dict attr_dict;
00810 mutable float *rdata;
00812 float *supp;
00813
00816
00817
00819 mutable int flags;
00820
00821 int changecount;
00823 int nx, ny, nz, nxy;
00824 size_t nxyz;
00826 int xoff, yoff, zoff;
00827
00829 Vec3f all_translation;
00830
00831
00832 string path;
00833 int pathnum;
00834
00836 mutable EMData* rot_fp;
00837
00838
00839
00840 class ClipInplaceVariables
00841 {
00842 public:
00843 ClipInplaceVariables(const int p_nx, const int p_ny, const int p_nz, const int n_nx, const int n_ny, const int n_nz,const int xtrans, const int ytrans, const int ztrans) :
00844 prv_nx(p_nx), prv_ny(p_ny), prv_nz(p_nz), new_nx(n_nx), new_ny(n_ny), new_nz(n_nz), xshift(xtrans), yshift(ytrans), zshift(ztrans),
00845 x_iter(prv_nx), y_iter(prv_ny), z_iter(prv_nz), new_z_top(0), new_z_bottom(0), new_y_back(0), new_y_front(0),new_x_left(0), new_x_right(0),
00846 prv_z_top(0), prv_z_bottom(0), prv_y_back(0), prv_y_front(0), prv_x_left(0), prv_x_right(0)
00847 {
00848 if ( xtrans > 0 ) x_iter -= xtrans;
00849 if ( x_iter < 0 ) x_iter = 0;
00850 if ( ytrans > 0 ) y_iter -= ytrans;
00851 if ( y_iter < 0 ) y_iter = 0;
00852 if ( ztrans > 0 ) z_iter -= ztrans;
00853 if ( z_iter < 0 ) z_iter = 0;
00854
00855
00856
00857
00858 if ( (new_nz + ztrans) > prv_nz ) new_z_top = new_nz + ztrans - prv_nz;
00859 if ( (new_ny + ytrans) > prv_ny ) new_y_back = new_ny + ytrans - prv_ny;
00860 if ( (new_nx + xtrans) > prv_nx ) new_x_right = new_nx + xtrans - prv_nx;
00861
00862 if ( (new_nz + ztrans) < prv_nz )
00863 {
00864 prv_z_top = prv_nz - new_nz - ztrans;
00865 z_iter -= prv_z_top;
00866 }
00867 if ( (new_ny + ytrans) < prv_ny )
00868 {
00869 prv_y_back = prv_ny - new_ny - ytrans;
00870 y_iter -= prv_y_back;
00871 }
00872 if ( (new_nx + xtrans) < prv_nx )
00873 {
00874 prv_x_right = prv_nx - new_nx - xtrans;
00875 x_iter -= prv_x_right;
00876 }
00877
00878 if ( xtrans > 0 ) prv_x_left = xtrans;
00879 if ( ytrans > 0 ) prv_y_front = ytrans;
00880 if ( ztrans > 0 ) prv_z_bottom = ztrans;
00881
00882 if ( xtrans < 0 ) new_x_left = -xtrans;
00883 if ( ytrans < 0 ) new_y_front = -ytrans;
00884 if ( ztrans < 0 ) new_z_bottom = -ztrans;
00885
00886 }
00887 ~ClipInplaceVariables() {}
00888
00889 int prv_nx, prv_ny, prv_nz, new_nx, new_ny, new_nz;
00890 int xshift, yshift, zshift;
00891 int x_iter, y_iter, z_iter;
00892 int new_z_top, new_z_bottom, new_y_back, new_y_front, new_x_left, new_x_right;
00893 int prv_z_top, prv_z_bottom, prv_y_back, prv_y_front, prv_x_left, prv_x_right;
00894 };
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965 };
00966
00967
00968 EMData * operator+(const EMData & em, float n);
00969 EMData * operator-(const EMData & em, float n);
00970 EMData * operator*(const EMData & em, float n);
00971 EMData * operator/(const EMData & em, float n);
00972
00973 EMData * operator+(float n, const EMData & em);
00974 EMData * operator-(float n, const EMData & em);
00975 EMData * operator*(float n, const EMData & em);
00976 EMData * operator/(float n, const EMData & em);
00977
00978 EMData * rsub(const EMData & em, float n);
00979 EMData * rdiv(const EMData & em, float n);
00980
00981 EMData * operator+(const EMData & a, const EMData & b);
00982 EMData * operator-(const EMData & a, const EMData & b);
00983 EMData * operator*(const EMData & a, const EMData & b);
00984 EMData * operator/(const EMData & a, const EMData & b);
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997 }
00998
00999
01000 #endif
01001
01002