#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 2090 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 1144 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(). 01145 {
01146 if (!image) {
01147 return 0;
01148 }
01149 if (3 != image->get_ndim())
01150 throw ImageDimensionException(
01151 "FourierGriddingProjector needs a 3-D volume");
01152 if (image->is_complex())
01153 throw ImageFormatException(
01154 "FourierGriddingProjector requires a real volume");
01155 const int npad = params.has_key("npad") ? int(params["npad"]) : 2;
01156 const int nx = image->get_xsize();
01157 const int ny = image->get_ysize();
01158 const int nz = image->get_zsize();
01159 if (nx != ny || nx != nz)
01160 throw ImageDimensionException(
01161 "FourierGriddingProjector requires nx==ny==nz");
01162 const int m = Util::get_min(nx,ny,nz);
01163 const int n = m*npad;
01164
01165 int K = params["kb_K"];
01166 if ( K == 0 ) K = 6;
01167 float alpha = params["kb_alpha"];
01168 if ( alpha == 0 ) alpha = 1.25;
01169 Util::KaiserBessel kb(alpha, K, (float)(m/2), K/(2.0f*n), n);
01170
01171 // divide out gridding weights
01172 EMData* tmpImage = image->copy();
01173 tmpImage->divkbsinh(kb);
01174 // pad and center volume, then FFT and multiply by (-1)**(i+j+k)
01175 //EMData* imgft = tmpImage->pad_fft(npad);
01176 //imgft->center_padded();
01177 EMData* imgft = tmpImage->norm_pad(false, npad);
01178 imgft->do_fft_inplace();
01179 imgft->center_origin_fft();
01180 imgft->fft_shuffle();
01181 delete tmpImage;
01182
01183 // Do we have a list of angles?
01184 int nangles = 0;
01185 vector<float> anglelist;
01186 // Do we have a list of angles?
01187 if (params.has_key("anglelist")) {
01188 anglelist = params["anglelist"];
01189 nangles = anglelist.size() / 3;
01190 } else {
01191 // This part was modified by David Woolford -
01192 // Before this the code worked only for SPIDER and EMAN angles,
01193 // but the framework of the Transform3D allows for a generic implementation
01194 // as specified here.
01195 Transform* t3d = params["transform"];
01196 if ( t3d == NULL ) throw NullPointerException("The transform object (required for projection), was not specified");
01197 Dict p = t3d->get_rotation("spider");
01198
01199 string angletype = "SPIDER";
01200 float phi = p["phi"];
01201 float theta = p["theta"];
01202 float psi = p["psi"];
01203 anglelist.push_back(phi);
01204 anglelist.push_back(theta);
01205 anglelist.push_back(psi);
01206 nangles = 1;
01207 if(t3d) {delete t3d; t3d=0;}
01208 }
01209
01210 // End David Woolford modifications
01211
01212 // initialize return object
01213 EMData* ret = new EMData();
01214 ret->set_size(nx, ny, nangles);
01215 ret->to_zero();
01216 // loop over sets of angles
01217 for (int ia = 0; ia < nangles; ia++) {
01218 int indx = 3*ia;
01219 Dict d("type","spider","phi",anglelist[indx],"theta",anglelist[indx+1],"psi",anglelist[indx+2]);
01220 Transform tf(d);
01221 EMData* proj = imgft->extract_plane(tf, kb);
01222 if (proj->is_shuffled()) proj->fft_shuffle();
01223 proj->center_origin_fft();
01224 proj->do_ift_inplace();
01225 EMData* winproj = proj->window_center(m);
01226 delete proj;
01227 for (int iy=0; iy < ny; iy++)
01228 for (int ix=0; ix < nx; ix++)
01229 (*ret)(ix,iy,ia) = (*winproj)(ix,iy);
01230 delete winproj;
01231 }
01232 delete imgft;
01233
01234 if (!params.has_key("anglelist")) {
01235 Transform* t3d = params["transform"];
01236 ret->set_attr("xform.projection",t3d);
01237 if(t3d) {delete t3d; t3d=0;}
01238 }
01239 ret->update();
01240 return ret;
01241 }
|
|
|
Definition at line 55 of file projector.cpp. |
1.3.9.1