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

EMAN::AutoMask2DProcessor Class Reference

Attempts to automatically mask out the particle, excluding other particles in the box, etc. More...

#include <processor.h>

Inheritance diagram for EMAN::AutoMask2DProcessor:

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

Collaboration graph
[legend]
List of all members.

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 TypeDict get_param_types () const
 Get processor parameter information in a dictionary.
virtual string get_desc () const
 Get the descrition of this specific processor.

Static Public Member Functions

static ProcessorNEW ()

Static Public Attributes

static const string NAME = "mask.auto2d"

Detailed Description

Attempts to automatically mask out the particle, excluding other particles in the box, etc.

Parameters:
threshold runs from ~ -2 to 2, negative numbers for dark protein and positive numbers for light protein (stain).
filter is expressed as a fraction of the fourier radius.

Definition at line 4857 of file processor.h.


Member Function Documentation

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

Get the descrition of this specific processor.

This function must be overwritten by a subclass.

Returns:
The description of this processor.

Implements EMAN::Processor.

Definition at line 4886 of file processor.h.

04887                 {
04888                         return "2D version of mask.auto3d";
04889                 }

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

Get the processor's name.

Each processor is identified by a unique name.

Returns:
The processor's name.

Implements EMAN::Processor.

Definition at line 4862 of file processor.h.

References NAME.

04863                 {
04864                         return NAME;
04865                 }

virtual TypeDict EMAN::AutoMask2DProcessor::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::Processor.

Definition at line 4872 of file processor.h.

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

04873                 {
04874                         TypeDict d;
04875                         d.put("radius", EMObject::INT,"Pixel radius of a ball which is used to seed the flood filling operation. ");
04876                         d.put("nmaxseed",EMObject::INT,"Use the n highest valued pixels in the map as a seed. Alternative to radius. Useful for viruses.");
04877                         d.put("threshold", EMObject::FLOAT, "An isosurface threshold that suitably encases the mass.");
04878                         d.put("sigma", EMObject::FLOAT, "Alternative to threshold based on mean + x*sigma");
04879                         d.put("nshells", EMObject::INT, "The number of dilation operations");
04880                         d.put("nshellsgauss", EMObject::INT, "number of Gaussian pixels to expand, following the dilation operations");
04881                         d.put("return_mask", EMObject::BOOL, "If true the result of the operation will produce the mask, not the masked volume.");
04882                         d.put("verbose", EMObject::INT, "How verbose to be (stdout)");
04883                         return d;
04884                 }

static Processor* EMAN::AutoMask2DProcessor::NEW  )  [inline, static]
 

Definition at line 4867 of file processor.h.

04868                 {
04869                         return new AutoMask2DProcessor();
04870                 }

void AutoMask2DProcessor::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.

Parameters:
image The image to be processed.

Implements EMAN::Processor.

Definition at line 5237 of file processor.cpp.

References abs, EMAN::EMData::calc_n_highest_locations(), EMAN::EMData::get_attr(), EMAN::EMData::get_data(), EMAN::EMData::get_ndim(), EMAN::EMData::get_size(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::Dict::has_key(), ImageDimensionException, LOGWARN, EMAN::EMData::mult(), EMAN::Processor::params, EMAN::EMData::process_inplace(), EMAN::Dict::set_default(), EMAN::EMData::set_size(), EMAN::EMData::set_value_at(), and EMAN::EMData::update().

05238 {
05239         if (!image) {
05240                 LOGWARN("NULL Image");
05241                 return;
05242         }
05243 
05244         if (image->get_ndim() != 2) {
05245                 throw ImageDimensionException("This processor only supports 2D images.");
05246         }
05247 
05248         /*
05249          The mask writing functionality was removed to comply with an EMAN2 policy which dictates that file io is not allowed from within a processor
05250          To get around this just use the return_mask parameter.
05251         string mask_output = params.set_default("write_mask", "");
05252         if ( mask_output != "") {
05253                 if (Util::is_file_exist(mask_output) ) throw InvalidParameterException("The mask output file name already exists. Please remove it if you don't need it.");
05254                 if (!EMUtil::is_valid_filename(mask_output)) throw InvalidParameterException("The mask output file name type is invalid or unrecognized");
05255         }
05256         */
05257 
05258         int radius=0;
05259         if (params.has_key("radius")) {
05260                 radius = params["radius"];
05261         }
05262         int nmaxseed=0;
05263         if (params.has_key("nmaxseed")) {
05264                 nmaxseed = params["nmaxseed"];
05265         }
05266 
05267         float threshold=0.0;
05268         if (params.has_key("sigma")) threshold=(float)(image->get_attr("mean"))+(float)(image->get_attr("sigma"))*(float)params["sigma"];
05269         else threshold=params["threshold"];
05270 
05271 
05272         int nshells = params["nshells"];
05273         int nshellsgauss = params["nshellsgauss"];
05274         int verbose=params.set_default("verbose",0);
05275 
05276         int nx = image->get_xsize();
05277         int ny = image->get_ysize();
05278 
05279         EMData *amask = new EMData();
05280         amask->set_size(nx, ny);
05281 
05282         float *dat = image->get_data();
05283         float *dat2 = amask->get_data();
05284         int i,j,k;
05285         size_t l = 0;
05286 
05287         if (verbose) printf("%f\t%f\t%f\n",(float)image->get_attr("mean"),(float)image->get_attr("sigma"),threshold);
05288 
05289         // Seeds with the highest valued pixels
05290         if (nmaxseed>0) {
05291                 vector<Pixel> maxs=image->calc_n_highest_locations(nmaxseed);
05292 
05293                 for (vector<Pixel>::iterator i=maxs.begin(); i<maxs.end(); i++) {
05294                         amask->set_value_at((*i).x,(*i).y,0,1.0);
05295                         if (verbose) printf("Seed at %d,%d,%d (%1.3f)\n",(*i).x,(*i).y,(*i).z,(*i).value);
05296                 }
05297         }
05298 
05299         // Seeds with a circle
05300         if (radius>0) {
05301                 // start with an initial circle
05302                 l=0;
05303                 for (j = -ny / 2; j < ny / 2; ++j) {
05304                         for (i = -nx / 2; i < nx / 2; ++i,++l) {
05305                                 if ( abs(j) > radius || abs(i) > radius) continue;
05306 //                              if ( (j * j + i * i) > (radius*radius) || dat[l] < threshold) continue;         // torn on the whole threshold issue here. Removing it prevents images from being totally masked out
05307                                 if ( (j * j + i * i) > (radius*radius) ) continue;
05308                                 dat2[l] = 1.0f;
05309                         }
05310                 }
05311         }
05312 
05313         // iteratively 'flood fills' the map... recursion would be better
05314         int done=0;
05315         int iter=0;
05316         while (!done) {
05317                 iter++;
05318                 done=1;
05319                 if (verbose && iter%10==0) printf("%d iterations\n",iter);
05320                 for (j=1; j<ny-1; ++j) {
05321                         for (i=1; i<nx-1; ++i) {
05322                                 l=i+j*nx;
05323                                 if (dat2[l]) continue;
05324                                 if (dat[l]>threshold && (dat2[l-1]||dat2[l+1]||dat2[l+nx]||dat2[l-nx])) {
05325                                         dat2[l]=1.0;
05326                                         done=0;
05327                                 }
05328                         }
05329                 }
05330         }
05331 
05332         amask->update();
05333 
05334         if (verbose) printf("extending mask\n");
05335         amask->process_inplace("mask.addshells.gauss", Dict("val1", nshells, "val2", nshellsgauss));
05336 
05337         bool return_mask = params.set_default("return_mask",false);
05338         if (return_mask) {
05339                 // Yes there is probably a much more efficient way of getting the mask itself, but I am only providing a stop gap at the moment.
05340                 memcpy(dat,dat2,image->get_size()*sizeof(float));
05341         } else {
05342                 image->mult(*amask);
05343         }
05344 
05345         // EMAN2 policy is not to allow file io from with a processor
05346         //if (mask_output != "") {
05347         //      amask->write_image(mask_output);
05348         //}
05349 
05350 
05351         delete amask;
05352 }


Member Data Documentation

const string AutoMask2DProcessor::NAME = "mask.auto2d" [static]
 

Definition at line 4891 of file processor.h.

Referenced by get_name().


The documentation for this class was generated from the following files:
Generated on Tue May 25 17:37:35 2010 for EMAN2 by  doxygen 1.4.4