#include <symmetry.h>
Inheritance diagram for EMAN::OptimumOrientationGenerator:
Public Member Functions | |
OptimumOrientationGenerator () | |
virtual | ~OptimumOrientationGenerator () |
virtual string | get_name () const |
Return "opt". | |
virtual string | get_desc () const |
Get a description. | |
virtual TypeDict | get_param_types () const |
Get a dictionary containing the permissable parameters of this class. | |
virtual vector< Transform > | gen_orientations (const Symmetry3D *const sym) const |
Generate Saff orientations in the asymmetric unit of the symmetry. | |
Static Public Member Functions | |
OrientationGenerator * | NEW () |
Factory support function NEW. | |
Static Public Attributes | |
const string | NAME = "opt" |
The name of this class - used to access it from factories etc. Should be "icos". | |
Private Member Functions | |
OptimumOrientationGenerator (const OptimumOrientationGenerator &) | |
Disallow copy construction. | |
OptimumOrientationGenerator & | operator= (const OptimumOrientationGenerator &) |
Disallow assignment. | |
virtual int | get_orientations_tally (const Symmetry3D *const sym, const float &delta) const |
This function returns how many orientations will be generated for a given delta (angular spacing) It does this by simulated gen_orientations. | |
vector< Vec3f > | optimize_distances (const vector< Transform > &v) const |
Optimize the distances in separating points on the unit sphere, as described by the the rotations in Transform objects. |
Optimally distributes points on a unit sphere, then slices out a correctly sized asymmetric unit, depending on the symmetry type. The approach relies on an initial distribution of points on the unit sphere, which may be generated using any of the other orientation generators. By default, the Saff orientation generator is used.
Definition at line 1302 of file symmetry.h.
|
Definition at line 1305 of file symmetry.h. 01305 {}
|
|
Definition at line 1306 of file symmetry.h. 01306 {}
|
|
Disallow copy construction.
|
|
Generate Saff orientations in the asymmetric unit of the symmetry.
Implements EMAN::OrientationGenerator. Definition at line 711 of file symmetry.cpp. References EMAN::OrientationGenerator::add_orientation(), angles, EMAN::FactoryBase::copy_relevant_params(), EMAN::OrientationGenerator::gen_orientations(), EMAN::OrientationGenerator::get_optimal_delta(), InvalidParameterException, EMAN::Symmetry3D::is_in_asym_unit(), optimize_distances(), EMAN::Dict::set_default(), and EMAN::FactoryBase::set_params(). 00712 { 00713 float delta = params.set_default("delta", 0.0f); 00714 int n = params.set_default("n", 0); 00715 00716 bool inc_mirror = params.set_default("inc_mirror",false); 00717 00718 if ( delta <= 0 && n <= 0 ) throw InvalidParameterException("Error, you must specify a positive non-zero delta or n"); 00719 if ( delta > 0 && n > 0 ) throw InvalidParameterException("Error, the delta and the n arguments are mutually exclusive"); 00720 00721 string generatorname = params.set_default("use","saff"); 00722 00723 if ( n > 0 && generatorname != RandomOrientationGenerator::NAME ) { 00724 params["delta"] = get_optimal_delta(sym,n); 00725 params["n"] = (int)0; 00726 } 00727 00728 // Force the orientation generator to include the mirror - this is because 00729 // We will enventually use it to generate orientations over the intire sphere 00730 // which is C1 symmetry, with the inc_mirror flag set to true 00731 params["inc_mirror"] = true; 00732 OrientationGenerator* g = Factory < OrientationGenerator >::get(generatorname); 00733 g->set_params(copy_relevant_params(g)); 00734 00735 00736 // get the starting orientation distribution 00737 CSym* unit_sphere = new CSym(); 00738 Dict nsym; nsym["nsym"] = 1; unit_sphere->set_params(nsym); 00739 00740 vector<Transform> unitsphereorientations = g->gen_orientations(unit_sphere); 00741 delete g; g = 0; 00742 delete unit_sphere; unit_sphere = 0; 00743 00744 vector<Vec3f> angles = optimize_distances(unitsphereorientations); 00745 00746 vector<Transform> ret; 00747 for (vector<Vec3f>::const_iterator it = angles.begin(); it != angles.end(); ++it ) { 00748 if ( sym->is_in_asym_unit((*it)[1],(*it)[0],inc_mirror) ) { 00749 add_orientation(ret,(*it)[0],(*it)[1]); 00750 } 00751 } 00752 00753 // reset the params to what they were before they were acted upon by this class 00754 params["inc_mirror"] = inc_mirror; 00755 params["delta"] = delta; 00756 params["n"] = n; 00757 00758 return ret; 00759 }
|
|
Get a description.
Implements EMAN::FactoryBase. Definition at line 1324 of file symmetry.h. 01324 { return "Generate optimally distributed orientations within an asymmetric using a basic optimization technique"; }
|
|
Return "opt".
Implements EMAN::FactoryBase. Definition at line 1319 of file symmetry.h. 01319 { return NAME; }
|
|
This function returns how many orientations will be generated for a given delta (angular spacing) It does this by simulated gen_orientations.
Implements EMAN::OrientationGenerator. Definition at line 696 of file symmetry.cpp. References EMAN::OrientationGenerator::get_orientations_tally(), and EMAN::Dict::set_default(). 00697 { 00698 string deltaoptname = params.set_default("use","saff"); 00699 Dict a; 00700 a["inc_mirror"] = (bool)params.set_default("inc_mirror",false); 00701 OrientationGenerator *g = Factory < OrientationGenerator >::get(deltaoptname,a); 00702 if (g) { 00703 int tally = g->get_orientations_tally(sym,delta); 00704 delete g; 00705 g = 0; 00706 return tally; 00707 } 00708 else throw; 00709 }
|
|
Get a dictionary containing the permissable parameters of this class.
Reimplemented from EMAN::OrientationGenerator. Definition at line 1330 of file symmetry.h. References EMAN::TypeDict::put(). 01331 { 01332 TypeDict d = OrientationGenerator::get_param_types(); 01333 d.put("n", EMObject::INT, "The number of orientations to generate. This option is mutually exclusively of the delta argument.Will attempt to get as close to the number specified as possible."); 01334 d.put("inc_mirror", EMObject::BOOL, "Indicates whether or not to include the mirror portion of the asymmetric unit. Default is false."); 01335 d.put("delta", EMObject::FLOAT, "The angular separation of orientations in degrees. This option is mutually exclusively of the n argument."); 01336 d.put("use", EMObject::STRING, "The orientation generation technique used to generate the initial distribution on the unit sphere."); 01337 return d; 01338 }
|
|
Factory support function NEW.
Definition at line 1311 of file symmetry.h. 01312 { 01313 return new OptimumOrientationGenerator(); 01314 }
|
|
Disallow assignment.
|
|
Optimize the distances in separating points on the unit sphere, as described by the the rotations in Transform objects.
Definition at line 761 of file symmetry.cpp. References EMAN::Vec3< Type >::end(), EMAN::Dict::end(), EMAN::Vec3< Type >::normalize(), v, and EMAN::Vec3f. Referenced by gen_orientations(). 00762 { 00763 vector<Vec3f> points; 00764 00765 for (vector<Transform>::const_iterator it = v.begin(); it != v.end(); ++it ) { 00766 points.push_back(Vec3f(0,0,1)*(*it)); 00767 } 00768 00769 if ( points.size() >= 2 ) { 00770 int max_it = 100; 00771 float percentage = 0.01f; 00772 00773 for ( int i = 0; i < max_it; ++i ){ 00774 unsigned int p1 = 0; 00775 unsigned int p2 = 1; 00776 00777 float distsquared = (points[p1]-points[p2]).squared_length(); 00778 00779 // Find the nearest points 00780 for(unsigned int j = 0; j < points.size(); ++j) { 00781 for(unsigned int k = j+1; k < points.size(); ++k) { 00782 float d = (points[j]-points[k]).squared_length(); 00783 if ( d < distsquared ) { 00784 distsquared = d; 00785 p1 = j; 00786 p2 = k; 00787 } 00788 } 00789 } 00790 00791 // Move them apart by a small fraction 00792 Vec3f delta = percentage*(points[p2]-points[p1]); 00793 00794 points[p2] += delta; 00795 points[p2].normalize(); 00796 points[p1] -= delta; 00797 points[p1].normalize(); 00798 } 00799 } 00800 00801 vector<Vec3f> ret; 00802 for (vector<Vec3f>::const_iterator it = points.begin(); it != points.end(); ++it ) { 00803 float altitude = (float)(EMConsts::rad2deg*acos((*it)[2])); 00804 float azimuth = (float)(EMConsts::rad2deg*atan2((*it)[1],(*it)[0])); 00805 ret.push_back(Vec3f(90.0f+azimuth,altitude,0)); 00806 } 00807 00808 return ret; 00809 }
|
|
The name of this class - used to access it from factories etc. Should be "icos".
Definition at line 50 of file symmetry.cpp. |