#include <processor.h>
Inheritance diagram for EMAN::ToMassCenterProcessor:
Public Member Functions | |
virtual void | process_inplace (EMData *image) |
To process an image in-place. | |
virtual string | get_name () const |
Get the processor's name. | |
virtual string | get_desc () const |
Get the descrition of this specific processor. | |
virtual TypeDict | get_param_types () const |
Get processor parameter information in a dictionary. | |
Static Public Member Functions | |
static Processor * | NEW () |
Static Public Attributes | |
static const string | NAME = "xform.centerofmass" |
int_shift_only | set to 1 only shift by integer, no interpolation |
Definition at line 5166 of file processor.h.
virtual string EMAN::ToMassCenterProcessor::get_desc | ( | ) | const [inline, virtual] |
Get the descrition of this specific processor.
This function must be overwritten by a subclass.
Implements EMAN::Processor.
Definition at line 5181 of file processor.h.
05182 { 05183 return "ToMassCenterProcessor centers image at center of mass, with a threshold. Only values higher than the threshold are considered."; 05184 }
virtual string EMAN::ToMassCenterProcessor::get_name | ( | ) | const [inline, virtual] |
Get the processor's name.
Each processor is identified by a unique name.
Implements EMAN::Processor.
Definition at line 5171 of file processor.h.
References NAME.
05172 { 05173 return NAME; 05174 }
virtual TypeDict EMAN::ToMassCenterProcessor::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.
Reimplemented from EMAN::Processor.
Definition at line 5186 of file processor.h.
References EMAN::EMObject::FLOAT, EMAN::EMObject::INT, and EMAN::TypeDict::put().
05187 { 05188 TypeDict d; 05189 d.put("int_shift_only", EMObject::INT, "set to 1 only shift by integer, no interpolation"); 05190 d.put("threshold", EMObject::FLOAT, "Only values larger than the threshold are included in the center of mass computation. Default is 0."); 05191 // d.put("positive", EMObject::INT, "uses only densities >0 for the calculatton"); 05192 return d; 05193 }
static Processor* EMAN::ToMassCenterProcessor::NEW | ( | ) | [inline, static] |
Definition at line 5176 of file processor.h.
05177 { 05178 return new ToMassCenterProcessor(); 05179 }
void ToMassCenterProcessor::process_inplace | ( | EMData * | image | ) | [virtual] |
To process an image in-place.
For those processors which can only be processed out-of-place, override this function to just print out some error message to remind user call the out-of-place version.
image | The image to be processed. |
Implements EMAN::Processor.
Definition at line 5734 of file processor.cpp.
References EMAN::EMData::calc_center_of_mass(), EMAN::EMObject::f, EMAN::EMData::get_attr(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), LOGWARN, EMAN::Processor::params, EMAN::EMData::set_attr(), EMAN::Dict::set_default(), t, and EMAN::EMData::translate().
05735 { 05736 if (!image) { 05737 LOGWARN("NULL Image"); 05738 return; 05739 } 05740 05741 int int_shift_only = params.set_default("int_shift_only",1); 05742 float threshold = params.set_default("threshold",0.0f); 05743 // int positive = params.set_default("positive",0); 05744 05745 if ((float)image->get_attr("sigma")==0.0f) return; // Can't center a constant valued image 05746 if (threshold>(float)image->get_attr("maximum")) { 05747 printf("Warning, centering threshold %1.2f, but image max %1.2f. Adjusting.",threshold,(float)image->get_attr("maximum")); 05748 threshold=(float)image->get_attr("mean")+(float)image->get_attr("sigma"); 05749 } 05750 05751 FloatPoint com = image->calc_center_of_mass(threshold); 05752 05753 int nx = image->get_xsize(); 05754 int ny = image->get_ysize(); 05755 int nz = image->get_zsize(); 05756 05757 if (int_shift_only) { 05758 int dx = -(int)(floor(com[0] + 0.5f) - nx / 2); 05759 int dy = -(int)(floor(com[1] + 0.5f) - ny / 2); 05760 int dz = 0; 05761 if (nz > 1) { 05762 dz = -(int)(floor(com[2] + 0.5f) - nz / 2); 05763 } 05764 image->translate(dx, dy, dz); 05765 05766 Transform t; 05767 t.set_trans((float)dx,(float)dy,(float)dz); 05768 05769 if (nz > 1) { 05770 image->set_attr("xform.align3d",&t); 05771 } else { 05772 image->set_attr("xform.align2d",&t); 05773 } 05774 } 05775 else { 05776 float dx = -(com[0] - nx / 2); 05777 float dy = -(com[1] - ny / 2); 05778 float dz = 0; 05779 if (nz > 1) { 05780 dz = -(com[2] - nz / 2); 05781 } 05782 image->translate(dx, dy, dz); 05783 05784 Transform t; 05785 t.set_trans(dx,dy,dz); 05786 05787 if (nz > 1) { 05788 image->set_attr("xform.align3d",&t); 05789 } else { 05790 image->set_attr("xform.align2d",&t); 05791 } 05792 } 05793 }
const string ToMassCenterProcessor::NAME = "xform.centerofmass" [static] |