#include <reconstructor.h>
Inheritance diagram for EMAN::BackProjectionReconstructor:
Public Member Functions | |
BackProjectionReconstructor () | |
virtual | ~BackProjectionReconstructor () |
virtual void | setup () |
Initialize the reconstructor. | |
virtual int | insert_slice (const EMData *const slice, const Transform &euler, const float weight=1.0) |
Insert an image slice to the reconstructor. | |
virtual EMData * | finish (bool doift=true) |
Finish reconstruction and return the complete model. | |
virtual string | get_name () const |
Get the unique name of this class (especially for factory based instantiation access). | |
virtual string | get_desc () const |
Get a clear, concise description of this class. | |
virtual TypeDict | get_param_types () const |
Static Public Member Functions | |
Reconstructor * | NEW () |
Static Public Attributes | |
const string | NAME = "back_projection" |
Private Member Functions | |
BackProjectionReconstructor (const BackProjectionReconstructor &that) | |
BackProjectionReconstructor & | operator= (const BackProjectionReconstructor &) |
void | load_default_settings () |
EMData * | preprocess_slice (const EMData *const slice, const Transform &t) |
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. |
Back-projection is a method of 3D reconstruction from 2D projections. It is based on superposing 3D functions ("back-projection bodies") obtained by translating the 2D projections along the directions of projection.
Definition at line 720 of file reconstructor.h.
|
Definition at line 723 of file reconstructor.h. 00723 { load_default_settings(); }
|
|
Definition at line 725 of file reconstructor.h. 00725 {}
|
|
|
|
Finish reconstruction and return the complete model.
Reimplemented from EMAN::Reconstructor. Definition at line 1931 of file reconstructor.cpp. References EMAN::EMData::add(), EMAN::Factory< T >::get(), EMAN::Symmetry3D::get_nsym(), EMAN::Symmetry3D::get_syms(), EMAN::EMData::mult(), and EMAN::EMData::transform(). 01932 { 01933 01934 Symmetry3D* sym = Factory<Symmetry3D>::get((string)params["sym"]); 01935 vector<Transform> syms = sym->get_syms(); 01936 01937 for ( vector<Transform>::const_iterator it = syms.begin(); it != syms.end(); ++it ) { 01938 01939 EMData tmpcopy(*image); 01940 tmpcopy.transform(*it); 01941 image->add(tmpcopy); 01942 } 01943 01944 image->mult(1.0f/(float)sym->get_nsym()); 01945 delete sym; 01946 return image; 01947 }
|
|
Get a clear, concise description of this class.
Implements EMAN::FactoryBase. Definition at line 746 of file reconstructor.h. 00747 { 00748 return "Simple (unfiltered) back-projection reconstruction. Weighting by contributing particles in the class average is optional and default behaviour"; 00749 }
|
|
Get the unique name of this class (especially for factory based instantiation access).
Implements EMAN::FactoryBase. Definition at line 741 of file reconstructor.h. 00742 {
00743 return NAME;
00744 }
|
|
Implements EMAN::FactoryBase. Definition at line 756 of file reconstructor.h. References EMAN::TypeDict::put(). 00757 { 00758 TypeDict d; 00759 d.put("size", EMObject::INT, "Necessary. The x and y dimensions of the input images."); 00760 d.put("weight", EMObject::FLOAT, "Optional. A temporary value set prior to slice insertion, indicative of the inserted slice's weight. Default sis 1."); 00761 d.put("sym", EMObject::STRING, "Optional. The symmetry to impose on the final reconstruction. Default is c1"); 00762 d.put("zsample", EMObject::INT, "Optional. The z dimensions of the reconstructed volume."); 00763 return d; 00764 }
|
|
Insert an image slice to the reconstructor. To insert multiple image slices, call this function multiple times.
Reimplemented from EMAN::Reconstructor. Definition at line 1881 of file reconstructor.cpp. References EMAN::EMData::add(), EMAN::EMData::get_attr(), EMAN::EMData::get_data(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::has_attr(), EMAN::Transform::invert(), LOGERR, EMAN::EMData::mult(), preprocess_slice(), EMAN::Transform::set_mirror(), EMAN::Transform::set_scale(), EMAN::EMData::set_size(), EMAN::Transform::set_trans(), t, EMAN::EMData::transform(), and weight. 01882 { 01883 if (!input) { 01884 LOGERR("try to insert NULL slice"); 01885 return 1; 01886 } 01887 01888 if (input->get_xsize() != input->get_ysize() || input->get_xsize() != nx) { 01889 LOGERR("tried to insert image that was not correction dimensions"); 01890 return 1; 01891 } 01892 01893 Transform * transform; 01894 if ( input->has_attr("xform.projection") ) { 01895 transform = (Transform*) (input->get_attr("xform.projection")); // assignment operator 01896 } else { 01897 transform = new Transform(t); // assignment operator 01898 } 01899 EMData* slice = preprocess_slice(input, t); 01900 01901 float weight = params["weight"]; 01902 slice->mult(weight); 01903 01904 EMData *tmp = new EMData(); 01905 tmp->set_size(nx, ny, nz); 01906 01907 float *slice_data = slice->get_data(); 01908 float *tmp_data = tmp->get_data(); 01909 01910 size_t nxy = nx * ny; 01911 size_t nxy_size = nxy * sizeof(float);; 01912 for (int i = 0; i < nz; ++i) { 01913 memcpy(&tmp_data[nxy * i], slice_data, nxy_size); 01914 } 01915 01916 transform->set_scale(1.0); 01917 transform->set_mirror(false); 01918 transform->set_trans(0,0,0); 01919 transform->invert(); 01920 01921 tmp->transform(*transform); 01922 image->add(*tmp); 01923 01924 if(transform) {delete transform; transform=0;} 01925 delete tmp; 01926 delete slice; 01927 01928 return 0; 01929 }
|
|
Definition at line 774 of file reconstructor.h. 00775 { 00776 params["weight"] = 1.0; 00777 params["use_weights"] = true; 00778 params["size"] = 0; 00779 params["sym"] = "c1"; 00780 params["zsample"] = 0; 00781 }
|
|
Definition at line 751 of file reconstructor.h. 00752 { 00753 return new BackProjectionReconstructor(); 00754 }
|
|
|
|
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.
Reimplemented from EMAN::Reconstructor. Definition at line 1861 of file reconstructor.cpp. References EMAN::Transform::get_mirror(), EMAN::Transform::get_scale(), EMAN::Transform::get_trans_2d(), EMAN::EMData::process(), EMAN::EMData::process_inplace(), EMAN::Transform::set_rotation(), t, EMAN::EMData::transform(), and EMAN::Vec2f. Referenced by insert_slice(). 01862 { 01863 01864 EMData* return_slice = slice->process("normalize.edgemean"); 01865 return_slice->process_inplace("filter.linearfourier"); 01866 01867 Transform tmp(t); 01868 tmp.set_rotation(Dict("type","eman")); // resets the rotation to 0 implicitly 01869 Vec2f trans = tmp.get_trans_2d(); 01870 float scale = tmp.get_scale(); 01871 bool mirror = tmp.get_mirror(); 01872 if (trans[0] != 0 || trans[1] != 0 || scale != 1.0 ) { 01873 return_slice->transform(tmp); 01874 } else if ( mirror == true ) { 01875 return_slice = slice->process("xform.flip",Dict("axis","x")); 01876 } 01877 01878 return return_slice; 01879 }
|
|
Initialize the reconstructor.
Implements EMAN::Reconstructor. Definition at line 1850 of file reconstructor.cpp. References EMAN::EMData::set_size(). 01851 { 01852 int size = params["size"]; 01853 image = new EMData(); 01854 nx = size; 01855 ny = size; 01856 if ( (int) params["zsample"] != 0 ) nz = params["zsample"]; 01857 else nz = size; 01858 image->set_size(nx, ny, nz); 01859 }
|
|
Definition at line 76 of file reconstructor.cpp. |