#include <projector.h>
Inheritance diagram for EMAN::FourierGriddingProjector:
Public Member Functions | |
EMData * | project3d (EMData *image) const |
Project an 3D image into a 2D image. | |
EMData * | backproject3d (EMData *image) const |
Back-project a 2D image into a 3D image. | |
string | get_name () const |
Get the projector's name. | |
string | get_desc () const |
TypeDict | get_param_types () const |
Get processor parameter information in a dictionary. | |
Static Public Member Functions | |
Projector * | NEW () |
Static Public Attributes | |
const string | NAME = "fourier_gridding" |
Definition at line 206 of file projector.h.
|
Back-project a 2D image into a 3D image.
Implements EMAN::Projector. Definition at line 2087 of file projector.cpp.
|
|
Implements EMAN::Projector. Definition at line 219 of file projector.h. 00220 { 00221 return "Fourier-space projection using gridding."; 00222 }
|
|
Get the projector's name. Each projector is indentified by unique name.
Implements EMAN::Projector. Definition at line 214 of file projector.h. 00215 {
00216 return NAME;
00217 }
|
|
Get processor parameter information in a dictionary. Each parameter has one record in the dictionary. Each record contains its name, data-type, and description.
Reimplemented from EMAN::Projector. Definition at line 228 of file projector.h. References EMAN::TypeDict::put(). 00229 { 00230 TypeDict d; 00231 d.put("transform", EMObject::TRANSFORM); 00232 d.put("kb_alpha", EMObject::FLOAT); 00233 d.put("kb_K", EMObject::FLOAT); 00234 d.put("angletype", EMObject::STRING); 00235 d.put("anglelist", EMObject::FLOATARRAY); 00236 d.put("theta", EMObject::FLOAT); 00237 d.put("psi", EMObject::FLOAT); 00238 d.put("npad", EMObject::INT); 00239 return d; 00240 }
|
|
Definition at line 224 of file projector.h. 00225 { 00226 return new FourierGriddingProjector(); 00227 }
|
|
Project an 3D image into a 2D image.
Implements EMAN::Projector. Definition at line 1141 of file projector.cpp. References anglelist, EMAN::EMData::center_origin_fft(), EMAN::EMData::copy(), EMAN::EMData::divkbsinh(), EMAN::EMData::do_fft_inplace(), EMAN::EMData::do_ift_inplace(), EMAN::EMData::extract_plane(), EMAN::EMData::fft_shuffle(), EMAN::Util::get_min(), EMAN::EMData::get_ndim(), EMAN::Transform::get_rotation(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), EMAN::Dict::has_key(), ImageDimensionException, ImageFormatException, EMAN::EMData::is_complex(), EMAN::EMData::is_shuffled(), EMAN::EMData::norm_pad(), NullPointerException, nx, ny, phi, proj, EMAN::EMData::set_attr(), EMAN::EMData::set_size(), EMAN::Dict::size(), tf(), theta, EMAN::EMData::to_zero(), EMAN::EMData::update(), and EMAN::EMData::window_center(). 01142 { 01143 if (!image) { 01144 return 0; 01145 } 01146 if (3 != image->get_ndim()) 01147 throw ImageDimensionException( 01148 "FourierGriddingProjector needs a 3-D volume"); 01149 if (image->is_complex()) 01150 throw ImageFormatException( 01151 "FourierGriddingProjector requires a real volume"); 01152 const int npad = params.has_key("npad") ? int(params["npad"]) : 2; 01153 const int nx = image->get_xsize(); 01154 const int ny = image->get_ysize(); 01155 const int nz = image->get_zsize(); 01156 if (nx != ny || nx != nz) 01157 throw ImageDimensionException( 01158 "FourierGriddingProjector requires nx==ny==nz"); 01159 const int m = Util::get_min(nx,ny,nz); 01160 const int n = m*npad; 01161 01162 int K = params["kb_K"]; 01163 if ( K == 0 ) K = 6; 01164 float alpha = params["kb_alpha"]; 01165 if ( alpha == 0 ) alpha = 1.25; 01166 Util::KaiserBessel kb(alpha, K, (float)(m/2), K/(2.0f*n), n); 01167 01168 // divide out gridding weights 01169 EMData* tmpImage = image->copy(); 01170 tmpImage->divkbsinh(kb); 01171 // pad and center volume, then FFT and multiply by (-1)**(i+j+k) 01172 //EMData* imgft = tmpImage->pad_fft(npad); 01173 //imgft->center_padded(); 01174 EMData* imgft = tmpImage->norm_pad(false, npad); 01175 imgft->do_fft_inplace(); 01176 imgft->center_origin_fft(); 01177 imgft->fft_shuffle(); 01178 delete tmpImage; 01179 01180 // Do we have a list of angles? 01181 int nangles = 0; 01182 vector<float> anglelist; 01183 // Do we have a list of angles? 01184 if (params.has_key("anglelist")) { 01185 anglelist = params["anglelist"]; 01186 nangles = anglelist.size() / 3; 01187 } else { 01188 // This part was modified by David Woolford - 01189 // Before this the code worked only for SPIDER and EMAN angles, 01190 // but the framework of the Transform3D allows for a generic implementation 01191 // as specified here. 01192 Transform* t3d = params["transform"]; 01193 if ( t3d == NULL ) throw NullPointerException("The transform object (required for projection), was not specified"); 01194 Dict p = t3d->get_rotation("spider"); 01195 01196 string angletype = "SPIDER"; 01197 float phi = p["phi"]; 01198 float theta = p["theta"]; 01199 float psi = p["psi"]; 01200 anglelist.push_back(phi); 01201 anglelist.push_back(theta); 01202 anglelist.push_back(psi); 01203 nangles = 1; 01204 if(t3d) {delete t3d; t3d=0;} 01205 } 01206 01207 // End David Woolford modifications 01208 01209 // initialize return object 01210 EMData* ret = new EMData(); 01211 ret->set_size(nx, ny, nangles); 01212 ret->to_zero(); 01213 // loop over sets of angles 01214 for (int ia = 0; ia < nangles; ia++) { 01215 int indx = 3*ia; 01216 Dict d("type","spider","phi",anglelist[indx],"theta",anglelist[indx+1],"psi",anglelist[indx+2]); 01217 Transform tf(d); 01218 EMData* proj = imgft->extract_plane(tf, kb); 01219 if (proj->is_shuffled()) proj->fft_shuffle(); 01220 proj->center_origin_fft(); 01221 proj->do_ift_inplace(); 01222 EMData* winproj = proj->window_center(m); 01223 delete proj; 01224 for (int iy=0; iy < ny; iy++) 01225 for (int ix=0; ix < nx; ix++) 01226 (*ret)(ix,iy,ia) = (*winproj)(ix,iy); 01227 delete winproj; 01228 } 01229 delete imgft; 01230 01231 if (!params.has_key("anglelist")) { 01232 Transform* t3d = params["transform"]; 01233 ret->set_attr("xform.projection",t3d); 01234 if(t3d) {delete t3d; t3d=0;} 01235 } 01236 ret->update(); 01237 return ret; 01238 }
|
|
Definition at line 55 of file projector.cpp. |