EMAN::TranslationalAligner Class Reference
[a function or class that is CUDA enabled]

Translational 2D Alignment using cross correlation. More...

#include <aligner.h>

Inheritance diagram for EMAN::TranslationalAligner:

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

Collaboration graph
[legend]

List of all members.

Public Member Functions

virtual EMDataalign (EMData *this_img, EMData *to_img, const string &cmp_name="dot", const Dict &cmp_params=Dict()) const
 To align 'this_img' with another image passed in through its parameters.
virtual EMDataalign (EMData *this_img, EMData *to_img) const
virtual string get_name () const
 Get the Aligner's name.
virtual string get_desc () const
virtual TypeDict get_param_types () const

Static Public Member Functions

static AlignerNEW ()


Detailed Description

Translational 2D Alignment using cross correlation.

It calculates the shift for a translational alignment, then do the translation.

Parameters:
intonly Integer pixel translations only
maxshift Maximum translation in pixels
nozero Zero translation not permitted (useful for CCD images)

Definition at line 173 of file aligner.h.


Member Function Documentation

EMData * TranslationalAligner::align ( EMData this_img,
EMData to_img,
const string &  cmp_name = "dot",
const Dict cmp_params = Dict() 
) const [virtual]

To align 'this_img' with another image passed in through its parameters.

The alignment uses a user-given comparison method to compare the two images. If none is given, a default one is used.

Parameters:
this_img The image to be compared.
to_img 'this_img" is aligned with 'to_img'.
cmp_name The comparison method to compare the two images.
cmp_params The parameter dictionary for comparison method.
Returns:
The aligned image.

Implements EMAN::Aligner.

Definition at line 72 of file aligner.cpp.

References EMAN::EMData::calc_ccf(), EMAN::EMData::calc_max_location_wrap(), calc_max_location_wrap_cuda(), EMAN::EMData::get_data(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), ImageDimensionException, EMAN::EMUtil::is_same_size(), nx, ny, EMAN::Aligner::params, EMAN::EMData::process(), EMAN::EMData::process_inplace(), EMAN::EMData::set_attr(), EMAN::Dict::set_default(), EMAN::Transform::set_trans(), t, EMAN::EMData::update(), and EMAN::EMData::zero_corner_circulant().

Referenced by align().

00074 {
00075         if (!this_img) {
00076                 return 0;
00077         }
00078 
00079         if (to && !EMUtil::is_same_size(this_img, to))
00080                 throw ImageDimensionException("Images must be the same size to perform translational alignment");
00081 
00082         EMData *cf = 0;
00083         int nx = this_img->get_xsize();
00084         int ny = this_img->get_ysize();
00085         int nz = this_img->get_zsize();
00086 
00087         int masked = params.set_default("masked",0);
00088         bool use_cpu = true;
00089 #ifdef EMAN2_USING_CUDA
00090         if (this_img->gpu_operation_preferred() ) {
00091 //              cout << "Translate on GPU" << endl;
00092                 use_cpu = false;
00093                 cf = this_img->calc_ccf_cuda(to,false,false);
00094         }
00095 #endif // EMAN2_USING_CUDA
00096         if (use_cpu) cf = this_img->calc_ccf(to);
00097 
00098         // This is too expensive
00099         if (masked) {
00100                 EMData *msk=this_img->process("threshold.notzero");
00101                 EMData *sqr=to->process("math.squared");
00102                 EMData *cfn=msk->calc_ccf(sqr);
00103                 cfn->process_inplace("math.sqrt");
00104                 float *d1=cf->get_data();
00105                 float *d2=cfn->get_data();
00106                 for (int i=0; i<nx*ny*nz; i++) {
00107                         if (d2[i]!=0) d1[i]/=d2[i];
00108                 }
00109                 cf->update();
00110                 delete msk;
00111                 delete sqr;
00112                 delete cfn;
00113         }
00114 
00115 //
00116 
00117         int maxshiftx = params.set_default("maxshift",-1);
00118         int maxshifty = params["maxshift"];
00119         int maxshiftz = params["maxshift"];
00120         int nozero = params["nozero"];
00121 
00122         if (maxshiftx <= 0) {
00123                 maxshiftx = nx / 4;
00124                 maxshifty = ny / 4;
00125                 maxshiftz = nz / 4;
00126         }
00127 
00128         if (maxshiftx > nx / 2 - 1) maxshiftx = nx / 2 - 1;
00129         if (maxshifty > ny / 2 - 1)     maxshifty = ny / 2 - 1;
00130         if (maxshiftz > nz / 2 - 1) maxshiftz = nz / 2 - 1;
00131 
00132         if (nx == 1) maxshiftx = 0; // This is justhere for completeness really... plus it saves errors
00133         if (ny == 1) maxshifty = 0;
00134         if (nz == 1) maxshiftz = 0;
00135 
00136         // If nozero the portion of the image in the center (and its 8-connected neighborhood) is zeroed
00137         if (nozero) {
00138                 cf->zero_corner_circulant(1);
00139         }
00140 
00141         IntPoint peak;
00142 #ifdef EMAN2_USING_CUDA
00143         if (!use_cpu) {
00144                 EMDataForCuda tmp = cf->get_data_struct_for_cuda();
00145                 int* p = calc_max_location_wrap_cuda(&tmp,maxshiftx, maxshifty, maxshiftz);
00146                 peak = IntPoint(p[0],p[1],p[2]);
00147                 free(p);
00148         }
00149 #endif // EMAN2_USING_CUDA
00150         if (use_cpu) {
00151                 peak = cf->calc_max_location_wrap(maxshiftx, maxshifty, maxshiftz);
00152         }
00153         Vec3f cur_trans = Vec3f ( (float)-peak[0], (float)-peak[1], (float)-peak[2]);
00154 
00155         if (!to) {
00156                 cur_trans /= 2.0f; // If aligning theimage to itself then only go half way -
00157                 int intonly = params.set_default("intonly",false);
00158                 if (intonly) {
00159                         cur_trans[0] = floor(cur_trans[0] + 0.5f);
00160                         cur_trans[1] = floor(cur_trans[1] + 0.5f);
00161                         cur_trans[2] = floor(cur_trans[2] + 0.5f);
00162                 }
00163         }
00164 
00165         if( cf ){
00166                 delete cf;
00167                 cf = 0;
00168         }
00169         Dict params("trans",static_cast< vector<int> >(cur_trans));
00170         cf=this_img->process("math.translate.int",params);
00171         Transform t;
00172         t.set_trans(cur_trans);
00173         if ( nz != 1 ) {
00174 //              Transform* t = get_set_align_attr("xform.align3d",cf,this_img);
00175 //              t->set_trans(cur_trans);
00176                 cf->set_attr("xform.align3d",&t);
00177         } else if ( ny != 1 ) {
00178                 //Transform* t = get_set_align_attr("xform.align2d",cf,this_img);
00179                 cur_trans[2] = 0; // just make sure of it
00180                 t.set_trans(cur_trans);
00181                 cf->set_attr("xform.align2d",&t);
00182         }
00183 
00184         return cf;
00185 }

virtual EMData* EMAN::TranslationalAligner::align ( EMData this_img,
EMData to_img 
) const [inline, virtual]

Implements EMAN::Aligner.

Definition at line 179 of file aligner.h.

References align().

00180                 {
00181                         return align(this_img, to_img, "", Dict());
00182                 }

virtual string EMAN::TranslationalAligner::get_name (  )  const [inline, virtual]

Get the Aligner's name.

Each Aligner is identified by a unique name.

Returns:
The Aligner's name.

Implements EMAN::Aligner.

Definition at line 184 of file aligner.h.

00185                 {
00186                         return "translational";
00187                 }

virtual string EMAN::TranslationalAligner::get_desc (  )  const [inline, virtual]

Implements EMAN::Aligner.

Definition at line 189 of file aligner.h.

00190                 {
00191                         return "Translational 2D and 3D alignment by cross-correlation";
00192                 }

static Aligner* EMAN::TranslationalAligner::NEW (  )  [inline, static]

Definition at line 194 of file aligner.h.

00195                 {
00196                         return new TranslationalAligner();
00197                 }

virtual TypeDict EMAN::TranslationalAligner::get_param_types (  )  const [inline, virtual]

Implements EMAN::Aligner.

Definition at line 199 of file aligner.h.

References EMAN::EMObject::INT, and EMAN::TypeDict::put().

00200                 {
00201                         TypeDict d;
00202                         d.put("intonly", EMObject::INT,"Integer pixel translations only");
00203                         d.put("maxshift", EMObject::INT,"Maximum translation in pixels");
00204                         d.put("masked", EMObject::INT,"Treat zero pixels in 'this' as a mask for normalization (default false)");
00205                         d.put("nozero", EMObject::INT,"Zero translation not permitted (useful for CCD images)");
00206                         return d;
00207                 }


The documentation for this class was generated from the following files:

Generated on Sat Nov 21 02:20:14 2009 for EMAN2 by  doxygen 1.5.6