EMAN2
Public Member Functions | Static Public Member Functions | Static Public Attributes | Private Member Functions | Private Attributes | List of all members
EMAN::RealMedianReconstructor Class Reference

Real space 3D reconstruction using per-voxel median. More...

#include <reconstructor.h>

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

Public Member Functions

 RealMedianReconstructor ()
 
virtual ~RealMedianReconstructor ()
 
virtual void setup ()
 Initialize the reconstructor. More...
 
virtual EMDatapreprocess_slice (const EMData *const slice, const Transform &t=Transform())
 While you can just insert unprocessed slices, if you call preprocess_slice yourself, and insert the returned slice instead, repeatedly, it can save a fair bit of computation. More...
 
virtual int insert_slice (const EMData *const slice, const Transform &euler, const float weight)
 Insert an image slice to the reconstructor. More...
 
virtual int determine_slice_agreement (EMData *slice, const Transform &euler, const float weight=1.0, bool sub=true)
 Dummy function which always returns the same values. More...
 
virtual EMDatafinish (bool doift=true)
 Finish reconstruction and return the complete model. More...
 
virtual string get_name () const
 Get the unique name of this class (especially for factory based instantiation access) More...
 
virtual string get_desc () const
 Get a clear, concise description of this class. More...
 
virtual TypeDict get_param_types () const
 
- Public Member Functions inherited from EMAN::Reconstructor
 Reconstructor ()
 
virtual ~Reconstructor ()
 
virtual void setup_seed (EMData *seed, float seed_weight)
 Initialize the reconstructor with a seed volume. More...
 
virtual void setup_seedandweights (EMData *seed, EMData *weight)
 Initialize the reconstructor with a seed volume, as above. More...
 
int insert_slice (const EMData *const slice, const Transform &euler)
 
virtual EMDataprojection (const Transform &euler, int ret_fourier=1)
 This will create a projection from the current reconstruction. More...
 
virtual void clear ()
 set the volume and tmp_volume data to zero, for use in Monte Carlo reconstructors More...
 
void print_params () const
 Print the current parameters to std::out. More...
 
EMObjectoperator[] (const string &key)
 
- Public Member Functions inherited from EMAN::FactoryBase
 FactoryBase ()
 
virtual ~FactoryBase ()
 
Dict get_params () const
 get a copy of the parameters of this class More...
 
void set_params (const Dict &new_params)
 Set new parameters. More...
 
void set_param (const string key, const EMObject val)
 
void insert_params (const Dict &new_params)
 Insert parameters. More...
 
Dict copy_relevant_params (const FactoryBase *const that) const
 
- Public Member Functions inherited from EMAN::ReconstructorVolumeData
 ReconstructorVolumeData ()
 Only constructor All member variables are zeroed. More...
 
virtual ~ReconstructorVolumeData ()
 Destructor safely frees memory. More...
 
const EMDataget_emdata ()
 Get the main image pointer, probably redundant (not used) More...
 

Static Public Member Functions

static ReconstructorNEW ()
 

Static Public Attributes

static const string NAME = "real_median"
 

Private Member Functions

 RealMedianReconstructor (const RealMedianReconstructor &that)
 
RealMedianReconstructoroperator= (const RealMedianReconstructor &)
 

Private Attributes

vector< EMData * > slices
 
vector< Transformxforms
 

Additional Inherited Members

- Protected Member Functions inherited from EMAN::ReconstructorVolumeData
void free_memory ()
 Free allocated memorys The inherited class may have allocated image of tmp_data In either case you can safely call this function to delete either of those pointers, even if they bdb:refine_03::threed_00are NULL. More...
 
virtual void normalize_threed (const bool sqrt_damp=false, const bool wiener=false)
 Normalize on the assumption that image is a Fourier volume and that tmp_data is a volume of weights corresponding in size to this Fourier volume. More...
 
virtual void zero_memory ()
 Sends the pixels in tmp_data and image to zero Convenience only. More...
 
- Protected Attributes inherited from EMAN::FactoryBase
Dict params
 This is the dictionary the stores the parameters of the object. More...
 
- Protected Attributes inherited from EMAN::ReconstructorVolumeData
EMDataimage
 Inheriting class allocates this, probably in setup(). More...
 
EMDatatmp_data
 Inheriting class may allocate this, probably in setup() More...
 
int nx
 
int nx2
 
int ny
 
int ny2
 
int nz
 
int nz2
 
int subnx
 
int subny
 
int subnz
 
int subx0
 
int suby0
 
int subz0
 

Detailed Description

Real space 3D reconstruction using per-voxel median.

Real-space reconstruction similar to unfiltered back-projection, but computing the median rather than the mean value.

Definition at line 921 of file reconstructor.h.

Constructor & Destructor Documentation

◆ RealMedianReconstructor() [1/2]

EMAN::RealMedianReconstructor::RealMedianReconstructor ( )
inline

Definition at line 924 of file reconstructor.h.

924{ }

Referenced by NEW().

◆ ~RealMedianReconstructor()

virtual EMAN::RealMedianReconstructor::~RealMedianReconstructor ( )
inlinevirtual

Definition at line 926 of file reconstructor.h.

926{}

◆ RealMedianReconstructor() [2/2]

EMAN::RealMedianReconstructor::RealMedianReconstructor ( const RealMedianReconstructor that)
private

Member Function Documentation

◆ determine_slice_agreement()

int RealMedianReconstructor::determine_slice_agreement ( EMData slice,
const Transform euler,
const float  weight = 1.0,
bool  sub = true 
)
virtual

Dummy function which always returns the same values.

Parameters
input_sliceThe EMData slice to be compared
eulerThe orientation of the slice as a Transform object
weightA weighting factor for this slice, generally the number of particles in a class-average. May be ignored by some reconstructors
subFlag indicating whether to subtract the slice from the volume before comparing. May be ignored by some reconstructors
Returns
0 if OK. 1 if error.
Exceptions
NullPointerExceptionif the input EMData pointer is null
ImageFormatExceptionif the image is complex as opposed to real

Reimplemented from EMAN::Reconstructor.

Definition at line 2569 of file reconstructor.cpp.

2570{
2571 // Are these exceptions really necessary? (d.woolford)
2572 if (!input_slice) throw NullPointerException("EMData pointer (input image) is NULL");
2573
2574 input_slice->set_attr("reconstruct_norm",1.0f);
2575 input_slice->set_attr("reconstruct_absqual",1.0f);
2576 input_slice->set_attr("reconstruct_weight",1.0f);
2577
2578 return 0;
2579
2580}
#define NullPointerException(desc)
Definition: exception.h:241

References NullPointerException.

◆ finish()

EMData * RealMedianReconstructor::finish ( bool  doift = true)
virtual

Finish reconstruction and return the complete model.

Parameters
doiftA flag indicating whether the returned object should be guaranteed to be in real-space (true) or should be left in whatever space the reconstructor generated
Returns
The result 3D model.

Reimplemented from EMAN::Reconstructor.

Definition at line 2582 of file reconstructor.cpp.

2583{
2584
2585 int mode = params.set_default("mode",0); // confusing, mode means mode of operation
2586
2587 // We do the actual reconstruction here from all of the slices
2588 for (int z=0; z<nz; z++) {
2589 for (int y=0; y<ny; y++) {
2590 for (int x=0; x<nx; x++) {
2591 std::vector<float> vals;
2592 std::vector<Transform>::iterator itt = xforms.begin();
2593 for (std::vector<EMData *>::iterator it = slices.begin() ; it != slices.end(); ++it,++itt) {
2594 Vec3f imvec = itt->transform(x-nx/2.0f,y-ny/2.0f,z-nz/2.0f);
2595
2596 // single interpolated value from 2-D
2597 float val=(*it)->sget_value_at_interp(imvec[0]+nx/2,imvec[1]+ny/2);
2598 if (val!=0) vals.push_back(val);
2599
2600 // uses all 4 of the nearest values from the 2-D image
2601// int xx=floor(imvec[0]+nx/2);
2602// int yy=floor(imvec[1]+ny/2);
2603// float val=(*it)->sget_value_at(xx,yy);
2604// if (val!=0) vals.push_back(val);
2605// val=(*it)->sget_value_at(xx+1,yy);
2606// if (val!=0) vals.push_back(val);
2607// val=(*it)->sget_value_at(xx+1,yy+1);
2608// if (val!=0) vals.push_back(val);
2609// val=(*it)->sget_value_at(xx,yy+1);
2610// if (val!=0) vals.push_back(val);
2611 }
2612 if (vals.size()==0) continue;
2613
2614// // debugging, save all values for specific voxels to look at statistics
2615// if ((x==515&&y==461&&z==281) ||
2616// (x==516&&y==462&&z==299) ||
2617// (x==516&&y==461&&z==262) ||
2618// (x==212&&y==409&&z==304)) {
2619// char fsp[80];
2620// sprintf(fsp,"stat_%d_%d_%d.txt",x,y,z);
2621// FILE *out=fopen(fsp,"w");
2622// for (std::vector<float>::iterator v = vals.begin(); v!=vals.end(); ++v) fprintf(out,"%f\n",*v);
2623// fclose(out);
2624// }
2625
2626 switch(mode) {
2627 // median, the namesake of the reconstructor
2628 case 0:
2629 std::sort(vals.begin(),vals.end());
2630 //printf("%d %d %d %d\n",x,y,z,vals.size());
2631 image->set_value_at(x,y,z,vals[vals.size()/2]); // for even sizes, not quite right, and should include possibility of local average
2632 break;
2633
2634 // This is something like a mode. It progressively subdivides the numeric axis in halves
2635 // until reaching a small number of values which are then averaged
2636 case 1:
2637 {
2638 // We only use this method if we have at least 6 possible values for the voxel, otherwise we just average
2639 if (vals.size()<6) {
2640 float val=0;
2641 for (int i=0; i<vals.size(); i++) val+=vals[i];
2642 image->set_value_at(x,y,z,val/vals.size());
2643 break;
2644 }
2645 // Sort the list to simplify the remaining logic
2646 std::sort(vals.begin(),vals.end());
2647 int v0=0,v1=vals.size(),vs=v1/2; // bracket values, v0 first, v1 last+1, vs is first value in second zone
2648
2649 // we continue until we have a zone containing 4 or fewer values
2650 //int count=0;
2651 while (v1-v0>8) {
2652 float cen=(vals[v0]+vals[v1-1])/2.0f; // value halfway between the extremes
2653 for (vs=v0; vs<v1; vs++) { if (vals[vs]>=cen) break; } // find the first value in the upper zone
2654 // shift to the zone containing more values
2655 if (v1-vs>vs-v0) v0=vs;
2656 else v1=vs;
2657 //printf("%d %d %d %d\t%g\t%g\t%g\t%g\t%g\t%g\t%g\n",v0,vs,v1,vals.size(),cen,vals[0],vals[v0],vals[vs-1],vals[vs],vals[v1],vals[vals.size()-1]);
2658 //count++;
2659 //if (count>20) exit(1);
2660 }
2661 float val=0;
2662 for (int i=v0; i<v1; i++) val+=vals[i];
2663 image->set_value_at(x,y,z,val/(v1-v0));
2664 break;
2665 }
2666 // median with a bias towards zero (positive and negative), using 1/3 or 2/3 position in the sorted array
2667 case 2:
2668 {
2669 if (vals.size()<6) {
2670 float val=0;
2671 for (int i=0; i<vals.size(); i++) val+=vals[i];
2672 image->set_value_at(x,y,z,val/vals.size());
2673 break;
2674 }
2675 std::sort(vals.begin(),vals.end());
2676 //printf("%d %d %d %d\n",x,y,z,vals.size());
2677 int p1=vals.size()/3-1;
2678 int p2=vals.size()*2/3;
2679 float v=(fabs(vals[p1])<fabs(vals[p2]))?(vals[p1]+vals[p1-1]+vals[p1+1])/3.0f:(vals[p2]+vals[p2-1]+vals[p2+1])/3.0f;
2680 image->set_value_at(x,y,z,v); // for even sizes, not quite right, and should include possibility of local average
2681 break;
2682 }
2683 // bias the median towards the half of the points spanning the narrower range
2684 case 3:
2685 {
2686 if (vals.size()<6) {
2687 float val=0;
2688 for (int i=0; i<vals.size(); i++) val+=vals[i];
2689 image->set_value_at(x,y,z,val/vals.size());
2690 break;
2691 }
2692 std::sort(vals.begin(),vals.end());
2693 //printf("%d %d %d %d\n",x,y,z,vals.size());
2694 int p1=vals.size()/3-1;
2695 int p2=vals.size()/2;
2696 int p3=vals.size()*2/3;
2697 float v=(vals[p2]-vals[0]<vals[vals.size()-1]-vals[p2])?(vals[p1]+vals[p1-1]+vals[p1+1])/3.0f:(vals[p3]+vals[p3-1]+vals[p3+1])/3.0f;
2698 image->set_value_at(x,y,z,v); // for even sizes, not quite right, and should include possibility of local average
2699 break;
2700 }
2701 case 4:
2702 {
2703 // too few values, return median
2704 if (vals.size()<10) {
2705 std::sort(vals.begin(),vals.end());
2706 image->set_value_at(x,y,z,vals[vals.size()/2]); // for even sizes, not quite right, and should include possibility of local average
2707 break;
2708 }
2709
2710 //compute stats
2711 int n=vals.size();
2712 float mean=0,sigma=0;
2713 for (int i=0; i<n; i++) { mean+=vals[i]; sigma+=vals[i]*vals[i]; }
2714 mean/=n;
2715 sigma=sqrt(sigma/n-mean);
2716 // low & high refer to angle not value
2717 float low=(vals[0]+vals[1]+vals[2]+vals[3])/4.0f;
2718 float high=(vals[n-1]+vals[n-2]+vals[n-3]+vals[n-4])/4.0f;
2719
2720 // If both extreme tilts roughly agree, then we assume that's the right range to use and we average values near that
2721 // by computing the mean of all values within 1 sigma of all values
2722 if (fabs(low-high)<sigma) {
2723 mean=(low+high)*4.0f;
2724 int c=8;
2725 for (int i=4; i<n-4; i++) {
2726 if (fabs(vals[i]-mean/c)<sigma) { mean+=vals[i]; c++; }
2727 }
2728 image->set_value_at(x,y,z,mean/c);
2729 }
2730 // This means the extremes disagree and we have to pick which value is best, we go with min(fabs)
2731 else {
2732 if (fabs(low)<fabs(high)) mean=low*4.0;
2733 else mean=high*4.0;
2734 int c=4;
2735 for (int i=4; i<n-4; i++) {
2736 if (fabs(vals[i]-mean/c)<sigma) { mean+=vals[i]; c++; }
2737 }
2738 image->set_value_at(x,y,z,mean/c);
2739 }
2740 break;
2741 }
2742 }
2743 }
2744 }
2745 }
2746
2747
2748// transform->set_scale(1.0);
2749// transform->set_mirror(false);
2750// transform->set_trans(0,0,0);
2751// transform->invert();
2752
2753// tmp->transform(t.inverse()); // This was incorrect. inverse() was missing
2754// image->add(*tmp);
2755
2756// if(transform) {delete transform; transform=0;}
2757
2758 // apply symmetry if requested
2759 Symmetry3D* sym = Factory<Symmetry3D>::get((string)params["sym"]);
2760 vector<Transform> syms = sym->get_syms();
2761
2762 for ( vector<Transform>::const_iterator it = syms.begin(); it != syms.end(); ++it ) {
2763
2764// it->printme();
2765 Transform t=*it;
2766 EMData *tmpcopy = image->process("xform",Dict("transform",(EMObject)&t));
2767 image->add(*tmpcopy);
2768 delete tmpcopy;
2769 }
2770
2771 image->mult(1.0f/(float)sym->get_nsym());
2772 delete sym;
2773// if (image->get_xsize()==image->get_ysize() && image->get_ysize()==image->get_zsize()) {
2774// image->process_inplace("mask.sharp",Dict("outer_radius",image->get_xsize()/2-1));
2775// }
2776// else printf("No masking %d %d %d\n",image->get_xsize(),image->get_ysize(),image->get_zsize());
2777
2778 // erase out copy of the projection data
2779 if (!slices.empty()) {
2780 for (std::vector<EMData *>::iterator it = slices.begin() ; it != slices.end(); ++it) delete *it;
2781 slices.clear();
2782 }
2783 xforms.clear();
2784
2785 EMData *ret = image;
2786 if (!doift) {
2787 ret=image->do_fft();
2788 ret->process_inplace("xform.phaseorigin.tocorner");
2789 delete image;
2790 }
2791 image = 0 ;
2792 return ret;
2793}
#define v0(i)
Definition: analyzer.cpp:698
Dict is a dictionary to store <string, EMObject> pair.
Definition: emobject.h:385
type set_default(const string &key, type val)
Default setting behavior This can be achieved using a template - d.woolford Jan 2008 (before there wa...
Definition: emobject.h:569
EMData stores an image's data and defines core image processing routines.
Definition: emdata.h:82
EMObject is a wrapper class for types including int, float, double, etc as defined in ObjectType.
Definition: emobject.h:123
Dict params
This is the dictionary the stores the parameters of the object.
Definition: emobject.h:953
static T * get(const string &instance_name)
Definition: emobject.h:781
vector< Transform > xforms
EMData * image
Inheriting class allocates this, probably in setup().
Symmetry3D - A base class for 3D Symmetry objects.
Definition: symmetry.h:57
virtual int get_nsym() const =0
The total number of unique symmetry operations that will be return by this object when a calling prog...
virtual vector< Transform > get_syms() const
Definition: symmetry.cpp:1224
A Transform object is a somewhat specialized object designed specifically for EMAN2/Sparx storage of ...
Definition: transform.h:75
EMData * sqrt() const
return square root of current image
#define y(i, j)
Definition: projector.cpp:1516
#define x(i)
Definition: projector.cpp:1517

References EMAN::Factory< T >::get(), EMAN::Symmetry3D::get_nsym(), EMAN::Symmetry3D::get_syms(), EMAN::ReconstructorVolumeData::image, EMAN::ReconstructorVolumeData::nx, EMAN::ReconstructorVolumeData::ny, EMAN::ReconstructorVolumeData::nz, EMAN::FactoryBase::params, EMAN::Dict::set_default(), slices, sqrt(), v0, x, xforms, and y.

◆ get_desc()

virtual string EMAN::RealMedianReconstructor::get_desc ( ) const
inlinevirtual

Get a clear, concise description of this class.

Returns
a clear, concise description of this class

Implements EMAN::FactoryBase.

Definition at line 968 of file reconstructor.h.

969 {
970 return "A back projection reconstructor with alternative statistics. mode:\n\
9710 - median rather than mean per voxel (default)\n\
9721 - similar to a mode. progressive subdivision of numeric axis to find dense value cluster\n\
9732 - median with a bias towands zero (postive and negative)\n\
9743 - median with a bias towards the 1/2 of the values spanning a narrower range\n\
9754 - specifically for tomography, requires slices to be in order by tilt\n\
976";
977 }

◆ get_name()

virtual string EMAN::RealMedianReconstructor::get_name ( ) const
inlinevirtual

Get the unique name of this class (especially for factory based instantiation access)

Returns
the unique name of this class

Implements EMAN::FactoryBase.

Definition at line 963 of file reconstructor.h.

964 {
965 return NAME;
966 }
static const string NAME

References NAME.

◆ get_param_types()

virtual TypeDict EMAN::RealMedianReconstructor::get_param_types ( ) const
inlinevirtual
Returns
a TypeDict defining and describing the feasible parameters of this class

Implements EMAN::FactoryBase.

Definition at line 984 of file reconstructor.h.

985 {
986 TypeDict d;
987 d.put("mode", EMObject::INT, "Default is 0, median. 1 - compute estimated statistical mode.");
988 d.put("size", EMObject::INTARRAY, "Required. The dimensions of the real-space output volume, including any padding (must be handled by the calling application). Assumed that apix x/y/z identical.");
989 d.put("weight", EMObject::FLOAT, "Optional. A temporary value set prior to slice insertion, indicative of the inserted slice's weight. Default sis 1.");
990 d.put("sym", EMObject::STRING, "Optional. The symmetry to impose on the final reconstruction. Default is c1");
991 d.put("verbose", EMObject::INT, "Optional. Toggles writing diagnostic information to standard out. Default is 0.");
992 return d;
993 }

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

◆ insert_slice()

int RealMedianReconstructor::insert_slice ( const EMData *const  slice,
const Transform euler,
const float  weight 
)
virtual

Insert an image slice to the reconstructor.

To insert multiple image slices, call this function multiple times.

Parameters
sliceImage slice.
eulerEuler angle of this image slice.
weightA weighting factor for this slice, generally the number of particles in a class-average. May be ignored by some reconstructors
Returns
0 if OK. 1 if error.

Reimplemented from EMAN::Reconstructor.

Definition at line 2550 of file reconstructor.cpp.

2551{
2552 if (!input) {
2553 LOGERR("try to insert NULL slice");
2554 return 1;
2555 }
2556
2557 if (input->get_xsize() != input->get_ysize() || input->get_xsize() != nx) {
2558 LOGERR("tried to insert image that was not correction dimensions");
2559 return 1;
2560 }
2561
2562 slices.push_back(input->copy());
2563 xforms.push_back(t);
2564
2565 return 0;
2566}
#define LOGERR
Definition: log.h:51

References LOGERR, EMAN::ReconstructorVolumeData::nx, slices, and xforms.

◆ NEW()

static Reconstructor * EMAN::RealMedianReconstructor::NEW ( )
inlinestatic

Definition at line 979 of file reconstructor.h.

980 {
981 return new RealMedianReconstructor();
982 }

References RealMedianReconstructor().

◆ operator=()

RealMedianReconstructor & EMAN::RealMedianReconstructor::operator= ( const RealMedianReconstructor )
private

◆ preprocess_slice()

EMData * RealMedianReconstructor::preprocess_slice ( const EMData *const  slice,
const Transform t = Transform() 
)
virtual

While you can just insert unprocessed slices, if you call preprocess_slice yourself, and insert the returned slice instead, repeatedly, it can save a fair bit of computation.

The default operation just returns a copy of the image, as the preprocessing is reconstructor-specific.

Returns
the processed slice
Parameters
slicethe slice to be prepocessed
ttransform
Exceptions
InvalidValueExceptionwhen the specified padding value is less than the size of the images

Reimplemented from EMAN::Reconstructor.

Definition at line 2524 of file reconstructor.cpp.

2525{
2526
2527// EMData* return_slice = slice->process("normalize.edgemean");
2528// return_slice->process_inplace("filter.linearfourier");
2529
2530 EMData* return_slice;
2531
2532// return_slice = slice->process("filter.linearfourier");
2533 return_slice = slice->copy();
2534
2535// Transform tmp(t);
2536// tmp.set_rotation(Dict("type","eman")); // resets the rotation to 0 implicitly
2537// Vec2f trans = tmp.get_trans_2d();
2538// float scale = tmp.get_scale();
2539// bool mirror = tmp.get_mirror();
2540// if (trans[0] != 0 || trans[1] != 0 || scale != 1.0 ) {
2541// return_slice->transform(tmp);
2542// }
2543// if ( mirror == true ) {
2544// return_slice->process_inplace("xform.flip",Dict("axis","x"));
2545// }
2546
2547 return return_slice;
2548}

◆ setup()

void RealMedianReconstructor::setup ( )
virtual

Initialize the reconstructor.

Implements EMAN::Reconstructor.

Definition at line 2508 of file reconstructor.cpp.

2509{
2510 vector<int> size=params["size"];
2511 nx = size[0];
2512 ny = size[1];
2513 nz = size[2];
2514 image = new EMData(nx,ny,nz);
2515 image->to_zero();
2516
2517 if (!slices.empty()) {
2518 for (std::vector<EMData *>::iterator it = slices.begin() ; it != slices.end(); ++it) delete *it;
2519 slices.clear();
2520 }
2521 xforms.clear();
2522}

References EMAN::ReconstructorVolumeData::image, EMAN::ReconstructorVolumeData::nx, EMAN::ReconstructorVolumeData::ny, EMAN::ReconstructorVolumeData::nz, EMAN::FactoryBase::params, slices, and xforms.

Member Data Documentation

◆ NAME

const string RealMedianReconstructor::NAME = "real_median"
static

Definition at line 995 of file reconstructor.h.

Referenced by get_name().

◆ slices

vector<EMData *> EMAN::RealMedianReconstructor::slices
private

Definition at line 1003 of file reconstructor.h.

Referenced by finish(), insert_slice(), and setup().

◆ xforms

vector<Transform> EMAN::RealMedianReconstructor::xforms
private

Definition at line 1004 of file reconstructor.h.

Referenced by finish(), insert_slice(), and setup().


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