#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. |
1.3.9.1