#include <processor.h>
Inheritance diagram for EMAN::NormalizeByMassProcessor:
Public Member Functions | |
string | get_name () const |
Get the processor's name. | |
string | get_desc () const |
Get the descrition of this specific processor. | |
TypeDict | get_param_types () const |
Get processor parameter information in a dictionary. | |
void | process_inplace (EMData *image) |
To process an image in-place. | |
Static Public Member Functions | |
static Processor * | NEW () |
Static Public Attributes | |
static const string | NAME = "normalize.bymass" |
Only works for 3D images. Essentially a replica of Volume.C in EMAN1.
apix | Angstrom per pixel of the image. If not set will use the apix_x attribute of the image | |
mass | The approximate mass of protein/structure in kilodaltons | |
thr | The isosurface threshold which encapsulates the structure |
Definition at line 4203 of file processor.h.
string EMAN::NormalizeByMassProcessor::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 4216 of file processor.h.
04217 { 04218 return "Normalize the mass of the image assuming a density of 1.35 g/ml (0.81 Da/A^3) (3D only)"; 04219 }
string EMAN::NormalizeByMassProcessor::get_name | ( | ) | const [inline, virtual] |
Get the processor's name.
Each processor is identified by a unique name.
Implements EMAN::Processor.
Definition at line 4206 of file processor.h.
References NAME.
04207 { 04208 return NAME; 04209 }
TypeDict EMAN::NormalizeByMassProcessor::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 4221 of file processor.h.
References EMAN::EMObject::FLOAT, and EMAN::TypeDict::put().
04222 { 04223 TypeDict d; 04224 d.put("apix", EMObject::FLOAT,"Angstrom per pixel of the image. If not set will use the apix_x attribute of the image"); 04225 d.put("mass", EMObject::FLOAT,"The approximate mass of protein/structure in kilodaltons"); 04226 d.put("thr", EMObject::FLOAT,"The isosurface threshold which encapsulates the structure"); 04227 return d; 04228 }
static Processor* EMAN::NormalizeByMassProcessor::NEW | ( | ) | [inline, static] |
Definition at line 4211 of file processor.h.
04212 { 04213 return new NormalizeByMassProcessor(); 04214 }
void NormalizeByMassProcessor::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 3606 of file processor.cpp.
References EMAN::EMData::get_attr(), EMAN::EMData::get_data(), EMAN::EMData::get_size(), EMAN::EMData::has_attr(), InvalidParameterException, max, min, EMAN::EMData::mult(), EMAN::Processor::params, EMAN::Dict::set_default(), and EMAN::EMData::update().
03607 { 03608 float mass = params.set_default("mass",-1.0f); 03609 03610 if (mass <= 0) throw InvalidParameterException("You must specify a positive non zero mass"); 03611 03612 float thr = params.set_default("thr",(float)image->get_attr("mean")+(float)image->get_attr("sigma")); 03613 03614 float apix = params.set_default("apix",-1.123456789f); 03615 if (apix == -1.123456789 ) { 03616 if (image->has_attr("apix_x")) { 03617 apix = image->get_attr("apix_x"); 03618 } 03619 } 03620 03621 if (apix <= 0) throw InvalidParameterException("You must specify a positive non zero apix"); 03622 03623 float step = ((float)image->get_attr("sigma"))/2.0f; 03624 03625 int count=0; 03626 size_t n = image->get_size(); 03627 float* d = image->get_data(); 03628 03629 for (size_t i=0; i<n; ++i) { 03630 if (d[i]>=thr) ++count; 03631 } 03632 03633 float max = image->get_attr("maximum"); 03634 float min = image->get_attr("minimum"); 03635 for (int j=0; j<4; j++) { 03636 while (thr<max && count*apix*apix*apix*.81/1000.0>mass) { 03637 thr+=step; 03638 count=0; 03639 for (size_t i=0; i<n; ++i) { 03640 if (d[i]>=thr) ++count; 03641 } 03642 } 03643 03644 step/=4.0; 03645 03646 while (thr>min && count*apix*apix*apix*.81/1000.0<mass) { 03647 thr-=step; 03648 count=0; 03649 for (size_t i=0; i<n; ++i) { 03650 if (d[i]>=thr) ++count; 03651 } 03652 } 03653 03654 step/=4.0; 03655 } 03656 03657 image->mult((float)1.0/thr); 03658 image->update(); 03659 }
const string NormalizeByMassProcessor::NAME = "normalize.bymass" [static] |