Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

EMAN::FourierGriddingProjector Class Reference

Fourier gridding projection routine. More...

#include <projector.h>

Inheritance diagram for EMAN::FourierGriddingProjector:

Inheritance graph
[legend]
Collaboration diagram for EMAN::FourierGriddingProjector:

Collaboration graph
[legend]
List of all members.

Public Member Functions

EMDataproject3d (EMData *image) const
 Project an 3D image into a 2D image.
EMDatabackproject3d (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

ProjectorNEW ()

Static Public Attributes

const string NAME = "fourier_gridding"

Detailed Description

Fourier gridding projection routine.

See also:
P. A. Penczek, R. Renka, and H. Schomberg, J. Opt. Soc. Am. A _21_, 499-509 (2004)

Definition at line 206 of file projector.h.


Member Function Documentation

EMData * FourierGriddingProjector::backproject3d EMData image  )  const [virtual]
 

Back-project a 2D image into a 3D image.

Returns:
A 3D image from the backprojection.

Implements EMAN::Projector.

Definition at line 2087 of file projector.cpp.

02088 {
02089    // no implementation yet
02090    EMData *ret = new EMData();
02091    return ret;
02092 }

string EMAN::FourierGriddingProjector::get_desc  )  const [inline, virtual]
 

Implements EMAN::Projector.

Definition at line 219 of file projector.h.

00220                 {
00221                         return "Fourier-space projection using gridding.";
00222                 }

string EMAN::FourierGriddingProjector::get_name  )  const [inline, virtual]
 

Get the projector's name.

Each projector is indentified by unique name.

Returns:
The projector's name.

Implements EMAN::Projector.

Definition at line 214 of file projector.h.

00215                 {
00216                         return NAME;
00217                 }

TypeDict EMAN::FourierGriddingProjector::get_param_types  )  const [inline, virtual]
 

Get processor parameter information in a dictionary.

Each parameter has one record in the dictionary. Each record contains its name, data-type, and description.

Returns:
A dictionary containing the parameter info.

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                 }

Projector* EMAN::FourierGriddingProjector::NEW  )  [inline, static]
 

Definition at line 224 of file projector.h.

00225                 {
00226                         return new FourierGriddingProjector();
00227                 }

EMData * FourierGriddingProjector::project3d EMData image  )  const [virtual]
 

Project an 3D image into a 2D image.

Returns:
A 2D image from the projection.

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 }


Member Data Documentation

const string FourierGriddingProjector::NAME = "fourier_gridding" [static]
 

Definition at line 55 of file projector.cpp.


The documentation for this class was generated from the following files:
Generated on Thu Mar 10 23:00:38 2011 for EMAN2 by  doxygen 1.3.9.1