#include <symmetry.h>
Inheritance diagram for EMAN::Symmetry3D:
Public Types | |
typedef vector< vector< Vec3f > >::const_iterator | cit |
typedef vector< vector< Vec3f > >::iterator | ncit |
Public Member Functions | |
Symmetry3D () | |
virtual | ~Symmetry3D () |
virtual Dict | get_delimiters (const bool inc_mirror=false) const =0 |
Every Symmetry3D object must return a dictionary containing the delimiters that define its asymmetric unit (this is not strictly true in the case of the PlatonicSym class). | |
virtual Transform | get_sym (const int n) const =0 |
Every Symmetry3D object must provide access to the full set of its symmetry operators via this function. | |
virtual int | get_nsym () const =0 |
The total number of unique symmetry operations that will be return by this object when a calling program access Symmetry3D::get_sym. | |
virtual float | get_az_alignment_offset () const |
This functionality is only relevant to platonic symmetries. | |
virtual bool | is_platonic_sym () const |
A function that is used to determine if this is a platonic symmetry object This function is only virtually overidden by the PlatonicSym symmetry, which returns true, not false. | |
virtual bool | is_h_sym () const |
A function that is used to determine if this is a Helical symmetry object This function is only virtually overidden by the HSym symmetry, which returns true, not false. | |
virtual bool | is_c_sym () const |
A function that is used to determine if this is a c symmetry object This function is only virtually overidden by the CSym object, which returns true. | |
virtual bool | is_d_sym () const |
A function that is used to determine if this is a d symmetry object This function is only virtually overidden by the DSym object, which returns true. | |
virtual bool | is_tet_sym () const |
A function that is used to determine if this is the tetrahedral symmetry object This function is only virtually overidden by the TetSym object, which returns true. | |
virtual int | get_max_csym () const =0 |
The Symmetry3D object must return the maximum degree of symmetry it exhibits about any one axis. | |
virtual vector< Vec3f > | get_asym_unit_points (bool inc_mirror) const =0 |
The Symmetry3D object must be capable of returning an ordered list of points on the unit sphere that define its asymmetric unit (with mirror considerations). | |
vector< Transform > | gen_orientations (const string &generatorname="eman", const Dict &parms=Dict()) |
Ask the Symmetry3D object to generate a set of orientations in its asymmetric unit using an OrientationGenerator constructed from the given parameters (using a Factory). | |
virtual bool | is_in_asym_unit (const float &altitude, const float &azimuth, const bool inc_mirror) const =0 |
A function to be used when generating orientations over portion of the unit sphere defined by parameters returned by get_delimiters. | |
virtual Transform | reduce (const Transform &t3d, int n=0) const |
A function that will reduce an orientation, as characterized by Euler anges, into a specific asymmetric unit. | |
virtual int | in_which_asym_unit (const Transform &t3d) const |
A function that will determine in which asymmetric unit a given orientation resides The asymmetric unit 'number' will depend entirely on the order in which different symmetry operations are return by the Symmetry3D::get_sym function. | |
virtual int | point_in_which_asym_unit (const Vec3f &v) const |
A function that will determine in which asymmetric unit a given vector resides The asymmetric unit 'number' will depend entirely on the order in which different symmetry operations are return by the Symmetry3D::get_sym function The vector is a point. | |
virtual vector< vector< Vec3f > > | get_asym_unit_triangles (bool inc_mirror) const =0 |
Get triangles that precisely occlude the projection area of the default asymmetric unit. | |
virtual vector< Transform > | get_touching_au_transforms (bool inc_mirror=true) const |
Gets a vector of Transform objects that define the set of asymmetric units that touch the default asymmetric unit. | |
virtual vector< Transform > | get_syms () const |
Static Public Member Functions | |
static vector< Transform > | get_symmetries (const string &symmetry) |
Protected Member Functions | |
void | cache_au_planes () const |
Establish the asymmetric unit planes cache. | |
void | delete_au_planes () |
Clear the asymmetric unit planes cache. | |
Protected Attributes | |
float ** | cached_au_planes |
The asymmetric unit planes are cached to provide a great speed up the point_in_which_asym_unit function, which is called by reduce and by in_which_asym_unit. | |
int | cache_size |
Have to remember the cache size. | |
int | num_triangles |
This is stores the number of triangles returned by get_asym_unit_triangles(true). | |
vector< vector< Vec3f > > | au_sym_triangles |
This cache is of size cache_size. | |
Private Member Functions | |
Symmetry3D (const Symmetry3D &) | |
Disallow copy construction. | |
Symmetry3D & | operator= (const Symmetry3D &) |
Disallow assignment. |
Objects of this type must provide delimiters for the asymmetric unit (get_delimiters), and must also provide all of the rotational symmetric operations (get_sym(const int n)). They must also provide the total number of unique symmetric operations with get_nsym (except in helical symmetry). get_delimiter returns a dictionary with "alt_max" and "az_max" keys, which correspond to the encompassing azimuth and altitude angles of the asymmetric unit. These can be interpreted in a relatively straight forward fashion when dealing with C and D symmetries to demarcate the asymmetric unit, however when dealing with Platonic symmetries the asymmetric unit is not so trivial. see http://blake.bcm.edu/emanwiki/EMAN2/Symmetry for figures and description of what we're doing here, for all the symmetries, and look in the comments of the PlatonicSym classes themselves. It inherits from a factory base, making it amenable to incorporation in EMAN2 style factories
Definition at line 56 of file symmetry.h.
typedef vector<vector<Vec3f> >::const_iterator EMAN::Symmetry3D::cit |
Definition at line 59 of file symmetry.h.
typedef vector<vector<Vec3f> >::iterator EMAN::Symmetry3D::ncit |
Definition at line 60 of file symmetry.h.
Symmetry3D::Symmetry3D | ( | ) |
Definition at line 879 of file symmetry.cpp.
00879 : cached_au_planes(0),cache_size(0),num_triangles(0),au_sym_triangles() {}
Symmetry3D::~Symmetry3D | ( | ) | [virtual] |
Definition at line 880 of file symmetry.cpp.
References cached_au_planes, and delete_au_planes().
00880 { 00881 if (cached_au_planes != 0 ) { 00882 delete_au_planes(); 00883 } 00884 }
EMAN::Symmetry3D::Symmetry3D | ( | const Symmetry3D & | ) | [private] |
Disallow copy construction.
void Symmetry3D::cache_au_planes | ( | ) | const [protected] |
Establish the asymmetric unit planes cache.
Definition at line 936 of file symmetry.cpp.
References au_sym_triangles, cache_size, cached_au_planes, EMAN::Util::equation_of_plane(), fit, get_asym_unit_triangles(), get_nsym(), get_sym(), num_triangles, t, and UnexpectedBehaviorException.
Referenced by point_in_which_asym_unit().
00936 { 00937 if (cached_au_planes == 0 ) { 00938 vector< vector<Vec3f> > au_triangles = get_asym_unit_triangles(true); 00939 num_triangles = au_triangles.size(); 00940 cache_size = get_nsym()*au_triangles.size(); 00941 00942 cached_au_planes = new float*[cache_size]; 00943 float** fit = cached_au_planes; 00944 for(int i =0; i < cache_size; ++i,++fit) { 00945 float *t = new float[4]; 00946 *fit = t; 00947 } 00948 00949 00950 int k = 0; 00951 for(int i = 0; i < get_nsym(); ++i) { 00952 00953 for( ncit it = au_triangles.begin(); it != au_triangles.end(); ++it, ++k) 00954 { 00955 // For each given triangle 00956 vector<Vec3f> points = *it; 00957 if ( i != 0 ) { 00958 for (vector<Vec3f>::iterator iit = points.begin(); iit != points.end(); ++iit ) { 00959 // Rotate the points in the triangle so that the triangle occupies the 00960 // space of the current asymmetric unit 00961 *iit = (*iit)*get_sym(i); 00962 } 00963 } 00964 00965 au_sym_triangles.push_back(points); 00966 00967 // Determine the equation of the plane for the points, store it in plane 00968 Util::equation_of_plane(points[0],points[2],points[1],cached_au_planes[k]); 00969 } 00970 } 00971 } 00972 else throw UnexpectedBehaviorException("Attempt to generate a cache when cache exists"); 00973 }
void Symmetry3D::delete_au_planes | ( | ) | [protected] |
Clear the asymmetric unit planes cache.
Definition at line 975 of file symmetry.cpp.
References cache_size, cached_au_planes, fit, and UnexpectedBehaviorException.
Referenced by ~Symmetry3D().
00975 { 00976 if (cached_au_planes == 0 ) throw UnexpectedBehaviorException("Attempt to delete a cache that does not exist"); 00977 float** fit = cached_au_planes; 00978 for(int i =0; i < cache_size; ++i,++fit) { 00979 if (*fit == 0) throw UnexpectedBehaviorException("Attempt to delete a cache that does not exist"); 00980 delete [] *fit; 00981 *fit = 0; 00982 } 00983 00984 delete [] cached_au_planes; 00985 cached_au_planes = 0; 00986 }
vector< Transform > Symmetry3D::gen_orientations | ( | const string & | generatorname = "eman" , |
|
const Dict & | parms = Dict() | |||
) |
Ask the Symmetry3D object to generate a set of orientations in its asymmetric unit using an OrientationGenerator constructed from the given parameters (using a Factory).
This is reminiscent of the strategy design pattern
generatorname | the string name of the OrientationGenerator, as accessed for the OrientationGenerator factory | |
parms | the parameters handed to OrientationGenerator::set_params after initial construction |
Definition at line 146 of file symmetry.cpp.
References ENTERFUNC, EXITFUNC, EMAN::OrientationGenerator::gen_orientations(), and EMAN::Util::str_to_lower().
Referenced by EMAN::RT3DSphereAligner::xform_align_nbest().
00147 { 00148 ENTERFUNC; 00149 vector<Transform> ret; 00150 OrientationGenerator *g = Factory < OrientationGenerator >::get(Util::str_to_lower(generatorname), parms); 00151 if (g) { 00152 ret = g->gen_orientations(this); 00153 if( g ) 00154 { 00155 delete g; 00156 g = 0; 00157 } 00158 } 00159 else throw; 00160 00161 EXITFUNC; 00162 00163 return ret; 00164 }
virtual vector<Vec3f> EMAN::Symmetry3D::get_asym_unit_points | ( | bool | inc_mirror | ) | const [pure virtual] |
The Symmetry3D object must be capable of returning an ordered list of points on the unit sphere that define its asymmetric unit (with mirror considerations).
The list can be any length, and must be constructed carefully. If the list consists of points A B and C, then arcs on the unit sphere connecting A to B, then B to C, then C to A must define the asymmetric unit (with or without its mirror portion). i.e. it is a cyclic list, on any length
inc_mirror | whether or not to include the mirror portion of the asymmetric unit |
Implemented in EMAN::CSym, EMAN::DSym, EMAN::HSym, EMAN::PlatonicSym, and EMAN::TetrahedralSym.
Referenced by get_touching_au_transforms().
virtual vector<vector<Vec3f> > EMAN::Symmetry3D::get_asym_unit_triangles | ( | bool | inc_mirror | ) | const [pure virtual] |
Get triangles that precisely occlude the projection area of the default asymmetric unit.
This will be used for collision detection in Symmetry3D::reduce
inc_mirror | whether to include the mirror portion of the asymmetric unit |
Implemented in EMAN::CSym, EMAN::DSym, EMAN::HSym, and EMAN::PlatonicSym.
Referenced by cache_au_planes().
virtual float EMAN::Symmetry3D::get_az_alignment_offset | ( | ) | const [inline, virtual] |
This functionality is only relevant to platonic symmetries.
But it could grow into functionality for the other symmetries.
Reimplemented in EMAN::TetrahedralSym, and EMAN::IcosahedralSym.
Definition at line 86 of file symmetry.h.
Referenced by EMAN::SaffOrientationGenerator::gen_orientations(), EMAN::EvenOrientationGenerator::gen_orientations(), EMAN::EmanOrientationGenerator::gen_orientations(), and EMAN::PlatonicSym::get_asym_unit_points().
virtual Dict EMAN::Symmetry3D::get_delimiters | ( | const bool | inc_mirror = false |
) | const [pure virtual] |
Every Symmetry3D object must return a dictionary containing the delimiters that define its asymmetric unit (this is not strictly true in the case of the PlatonicSym class).
inc_mirror | whether or not the mirror part of the asymmetric unit should be included in the consideration |
Implemented in EMAN::CSym, EMAN::DSym, EMAN::HSym, and EMAN::PlatonicSym.
Referenced by EMAN::SaffOrientationGenerator::gen_orientations(), EMAN::EvenOrientationGenerator::gen_orientations(), EMAN::EmanOrientationGenerator::gen_orientations(), EMAN::SaffOrientationGenerator::get_orientations_tally(), EMAN::EvenOrientationGenerator::get_orientations_tally(), EMAN::EmanOrientationGenerator::get_orientations_tally(), and get_touching_au_transforms().
virtual int EMAN::Symmetry3D::get_max_csym | ( | ) | const [pure virtual] |
The Symmetry3D object must return the maximum degree of symmetry it exhibits about any one axis.
This function is only called in the AsymmUnitOrientationGenerator.
Implemented in EMAN::CSym, EMAN::DSym, EMAN::HSym, EMAN::TetrahedralSym, EMAN::OctahedralSym, and EMAN::IcosahedralSym.
Referenced by EMAN::EmanOrientationGenerator::gen_orientations(), EMAN::EmanOrientationGenerator::get_orientations_tally(), and EMAN::PlatonicSym::init().
virtual int EMAN::Symmetry3D::get_nsym | ( | ) | const [pure virtual] |
The total number of unique symmetry operations that will be return by this object when a calling program access Symmetry3D::get_sym.
However in the case of HSym, this is really something else.
Implemented in EMAN::CSym, EMAN::DSym, EMAN::HSym, EMAN::TetrahedralSym, EMAN::OctahedralSym, and EMAN::IcosahedralSym.
Referenced by cache_au_planes(), EMAN::BackProjectionReconstructor::finish(), EMAN::RandomOrientationGenerator::gen_orientations(), EMAN::OrientationGenerator::get_az_max(), EMAN::Transform::get_nsym(), get_syms(), get_touching_au_transforms(), and point_in_which_asym_unit().
virtual Transform EMAN::Symmetry3D::get_sym | ( | const int | n | ) | const [pure virtual] |
Every Symmetry3D object must provide access to the full set of its symmetry operators via this function.
n | the symmetry operator number |
Implemented in EMAN::CSym, EMAN::DSym, EMAN::HSym, EMAN::TetrahedralSym, EMAN::OctahedralSym, and EMAN::IcosahedralSym.
Referenced by cache_au_planes(), EMAN::Transform::get_sym(), get_syms(), get_touching_au_transforms(), and reduce().
vector< Transform > Symmetry3D::get_symmetries | ( | const string & | symmetry | ) | [static] |
Definition at line 1140 of file symmetry.cpp.
References get_syms(), and EMAN::Util::str_to_lower().
Referenced by EMAN::FourierReconstructor::do_compare_slice_work(), EMAN::FourierReconstructor::do_insert_slice_work(), and EMAN::SymSearchProcessor::process_inplace().
01141 { 01142 Symmetry3D* sym = Factory<Symmetry3D>::get(Util::str_to_lower(symmetry)); 01143 vector<Transform> ret = sym->get_syms(); 01144 delete sym; 01145 return ret; 01146 }
vector< Transform > Symmetry3D::get_syms | ( | ) | const [virtual] |
Definition at line 1124 of file symmetry.cpp.
References get_nsym(), and get_sym().
Referenced by EMAN::BackProjectionReconstructor::finish(), and get_symmetries().
01125 { 01126 01127 vector<Transform> ret; 01128 // if (t.is_identity()) { 01129 for(int i = 0; i < get_nsym(); ++i ) { 01130 ret.push_back(get_sym(i)); 01131 } 01132 // } else { 01133 // for(int i = 0; i < get_nsym(); ++i ) { 01134 // ret.push_back(get_sym(i)*t); 01135 // } 01136 // } 01137 return ret; 01138 }
vector< Transform > Symmetry3D::get_touching_au_transforms | ( | bool | inc_mirror = true |
) | const [virtual] |
Gets a vector of Transform objects that define the set of asymmetric units that touch the default asymmetric unit.
The 'default asymmetric unit' is defined by the results of Symmetry3d::get_asym_unit_points and is sensitive to whether or not you want to include the mirror part of the asymmetric unit. This function is useful when used in conjunction with Symmetry3D::reduce, and particularly when finding the angular deviation of particles through different stages of iterative Single Particle Reconstruction This function could be expanded to work for an asymmetric unit number supplied by the user.
inc_mirror | whether or not to include the mirror portion of the asymmetric unit |
Definition at line 1055 of file symmetry.cpp.
References EMAN::EMConsts::deg2rad, get_asym_unit_points(), get_delimiters(), get_nsym(), get_sym(), is_d_sym(), is_platonic_sym(), EMAN::Vec3< Type >::squared_length(), t, x, and y.
01056 { 01057 vector<Transform> ret; 01058 vector<int> hit_cache; 01059 01060 vector<Vec3f> points = get_asym_unit_points(inc_mirror); 01061 // Warning, this is a gross hack because it is assuming that the asym_unit_points 01062 // returned by DSym are in a particular orientation with respect to symmetric axes 01063 // if the internals of DSym change it could change what we should do here... 01064 // but for the time being it will do 01065 if (inc_mirror && is_d_sym() && (get_nsym()/2 % 2 == 0)) { 01066 Dict delim = get_delimiters(false); 01067 float angle = (float)(EMConsts::deg2rad*float(delim["az_max"])); 01068 float y = -cos(angle); 01069 float x = sin(angle); 01070 points.push_back(Vec3f(x,y,0)); 01071 } 01072 else if ( is_d_sym() && (get_nsym()/2 % 2 == 1)) { 01073 Dict delim = get_delimiters(false); 01074 float angle = float(delim["az_max"])/2.0f; 01075 // cout << "Odd dsym using " << angle << endl; 01076 angle *= (float)EMConsts::deg2rad; 01077 float y = -cos(angle); 01078 float x = sin(angle); 01079 points.push_back(Vec3f(x,y,0)); 01080 01081 if ( inc_mirror ) { 01082 angle = 3.0f*(float(delim["az_max"]))/2.0f; 01083 angle *= (float)EMConsts::deg2rad; 01084 float y = -cos(angle); 01085 float x = sin(angle); 01086 points.push_back(Vec3f(x,y,0)); 01087 } 01088 } 01089 01090 typedef vector<Vec3f>::const_iterator const_point_it; 01091 for(const_point_it point = points.begin(); point != points.end(); ++point ) { 01092 01093 for(int i = 1; i < get_nsym(); ++i) { 01094 01095 if ( find(hit_cache.begin(),hit_cache.end(),i) != hit_cache.end() ) continue; 01096 Transform t = get_sym(i); 01097 Vec3f result = (*point)*t; 01098 01099 if (is_platonic_sym()) { 01100 for(const_point_it tmp = points.begin(); tmp != points.end(); ++tmp ) { 01101 Vec3f tt = result-(*tmp); 01102 if (tt.squared_length() < 0.01f) { 01103 hit_cache.push_back(i); 01104 ret.push_back(t); 01105 } 01106 01107 } 01108 } 01109 else { 01110 result -= *point; 01111 if (result.squared_length() < 0.05f) { 01112 hit_cache.push_back(i); 01113 ret.push_back(t); 01114 } 01115 } 01116 } 01117 01118 } 01119 01120 return ret; 01121 }
int Symmetry3D::in_which_asym_unit | ( | const Transform & | t3d | ) | const [virtual] |
A function that will determine in which asymmetric unit a given orientation resides The asymmetric unit 'number' will depend entirely on the order in which different symmetry operations are return by the Symmetry3D::get_sym function.
t3d | a Transform characterizing an orientation |
Definition at line 917 of file symmetry.cpp.
References EMAN::Transform::invert(), and point_in_which_asym_unit().
Referenced by reduce().
00918 { 00919 // Here it is assumed that final destination of the orientation (as encapsulated in the t3d object) is 00920 // in the z direction, so in essence we will start in the direction z and 'undo' the orientation to get the real 00921 // direction 00922 Vec3f p(0,0,1); 00923 00924 Transform o(t3d); 00925 // Orientations are alway transposed when dealing with asymmetric units, projections,etc 00926 // We take the transpose to 'undo' the transform and get the true direction of the point. 00927 o.invert(); 00928 // Figure out where the point would end up. No we could just as easily not transpose and do 00929 // left multiplation (as in what occurs in the FourierReconstructor during slice insertion) 00930 p = o*p; 00931 00932 return point_in_which_asym_unit(p); 00933 }
virtual bool EMAN::Symmetry3D::is_c_sym | ( | ) | const [inline, virtual] |
A function that is used to determine if this is a c symmetry object This function is only virtually overidden by the CSym object, which returns true.
Reimplemented in EMAN::CSym.
Definition at line 106 of file symmetry.h.
Referenced by EMAN::RandomOrientationGenerator::gen_orientations(), and EMAN::OrientationGenerator::get_az_max().
virtual bool EMAN::Symmetry3D::is_d_sym | ( | ) | const [inline, virtual] |
A function that is used to determine if this is a d symmetry object This function is only virtually overidden by the DSym object, which returns true.
Reimplemented in EMAN::DSym.
Definition at line 112 of file symmetry.h.
Referenced by EMAN::OrientationGenerator::get_az_max(), and get_touching_au_transforms().
virtual bool EMAN::Symmetry3D::is_h_sym | ( | ) | const [inline, virtual] |
A function that is used to determine if this is a Helical symmetry object This function is only virtually overidden by the HSym symmetry, which returns true, not false.
Reimplemented in EMAN::HSym.
Definition at line 100 of file symmetry.h.
Referenced by EMAN::SaffOrientationGenerator::gen_orientations(), EMAN::EvenOrientationGenerator::gen_orientations(), EMAN::EmanOrientationGenerator::gen_orientations(), EMAN::SaffOrientationGenerator::get_orientations_tally(), EMAN::EvenOrientationGenerator::get_orientations_tally(), and EMAN::EmanOrientationGenerator::get_orientations_tally().
virtual bool EMAN::Symmetry3D::is_in_asym_unit | ( | const float & | altitude, | |
const float & | azimuth, | |||
const bool | inc_mirror | |||
) | const [pure virtual] |
A function to be used when generating orientations over portion of the unit sphere defined by parameters returned by get_delimiters.
In platonic symmetry altitude and azimuth alone are not enough to correctly demarcate the asymmetric unit. See the get_delimiters comments.
altitude | the EMAN style altitude of the 3D orientation in degrees | |
azimuth | the EMAN style azimuth of the 3D orientation in degrees | |
inc_mirror | whether or not to include orientations if they are in the mirror portion of the asymmetric unit |
Implemented in EMAN::CSym, EMAN::DSym, EMAN::HSym, EMAN::PlatonicSym, and EMAN::TetrahedralSym.
Referenced by EMAN::OptimumOrientationGenerator::gen_orientations(), EMAN::SaffOrientationGenerator::gen_orientations(), EMAN::EvenOrientationGenerator::gen_orientations(), EMAN::RandomOrientationGenerator::gen_orientations(), EMAN::EmanOrientationGenerator::gen_orientations(), EMAN::SaffOrientationGenerator::get_orientations_tally(), EMAN::EvenOrientationGenerator::get_orientations_tally(), and EMAN::EmanOrientationGenerator::get_orientations_tally().
virtual bool EMAN::Symmetry3D::is_platonic_sym | ( | ) | const [inline, virtual] |
A function that is used to determine if this is a platonic symmetry object This function is only virtually overidden by the PlatonicSym symmetry, which returns true, not false.
Reimplemented in EMAN::PlatonicSym.
Definition at line 94 of file symmetry.h.
Referenced by EMAN::SaffOrientationGenerator::gen_orientations(), EMAN::EvenOrientationGenerator::gen_orientations(), EMAN::EmanOrientationGenerator::gen_orientations(), EMAN::OrientationGenerator::get_az_max(), EMAN::SaffOrientationGenerator::get_orientations_tally(), EMAN::EvenOrientationGenerator::get_orientations_tally(), EMAN::EmanOrientationGenerator::get_orientations_tally(), and get_touching_au_transforms().
virtual bool EMAN::Symmetry3D::is_tet_sym | ( | ) | const [inline, virtual] |
A function that is used to determine if this is the tetrahedral symmetry object This function is only virtually overidden by the TetSym object, which returns true.
Reimplemented in EMAN::TetrahedralSym.
Definition at line 118 of file symmetry.h.
Referenced by EMAN::OrientationGenerator::get_az_max().
Symmetry3D& EMAN::Symmetry3D::operator= | ( | const Symmetry3D & | ) | [private] |
Disallow assignment.
int Symmetry3D::point_in_which_asym_unit | ( | const Vec3f & | v | ) | const [virtual] |
A function that will determine in which asymmetric unit a given vector resides The asymmetric unit 'number' will depend entirely on the order in which different symmetry operations are return by the Symmetry3D::get_sym function The vector is a point.
v | a Vec3f characterizing a point |
Definition at line 988 of file symmetry.cpp.
References au_sym_triangles, cache_au_planes(), cached_au_planes, EMAN::Vec3< Type >::dot(), EMAN::Transform::ERR_LIMIT, get_nsym(), num_triangles, t, and v.
Referenced by in_which_asym_unit(), and EMAN::AutoMaskAsymUnit::process_inplace().
00989 { 00990 if (cached_au_planes == 0) { 00991 cache_au_planes(); 00992 } 00993 00994 int k = 0; 00995 for(int i = 0; i < get_nsym(); ++i) { 00996 for( int j = 0; j < num_triangles; ++j,++k) { 00997 vector<Vec3f> points = au_sym_triangles[k]; 00998 00999 float* plane = cached_au_planes[k]; 01000 Vec3f tmp = p; 01001 01002 // Determine the intersection of p with the plane - do this by finding out how much p should be scaled by 01003 float scale = plane[0]*tmp[0]+plane[1]*tmp[1]+plane[2]*tmp[2]; 01004 if ( scale != 0 ) 01005 scale = -plane[3]/scale; 01006 else { 01007 // parralel! 01008 continue; 01009 } 01010 01011 // If the scale factor is less than zero, then p is definitely not in this asymmetric unit 01012 if (scale <= 0) continue; 01013 01014 // This is the intersection point 01015 Vec3f pp = tmp*scale; 01016 01017 // Now we have to see if the point p is inside the region bounded by the points, or if it is outside 01018 // If it is inside the region then p is in this asymmetric unit. 01019 01020 // This formula take from FIXME fill in once I get to work 01021 Vec3f v = points[2]-points[0]; 01022 Vec3f u = points[1]-points[0]; 01023 Vec3f w = pp - points[0]; 01024 01025 float udotu = u.dot(u); 01026 float udotv = u.dot(v); 01027 float udotw = u.dot(w); 01028 float vdotv = v.dot(v); 01029 float vdotw = v.dot(w); 01030 01031 float d = 1.0f/(udotv*udotv - udotu*vdotv); 01032 float s = udotv*vdotw - vdotv*udotw; 01033 s *= d; 01034 01035 float t = udotv*udotw - udotu*vdotw; 01036 t *= d; 01037 01038 // We've done a few multiplications, so detect when there are tiny residuals that may throw off the final 01039 // decision 01040 if (fabs(s) < Transform::ERR_LIMIT ) s = 0; 01041 if (fabs(t) < Transform::ERR_LIMIT ) t = 0; 01042 01043 if ( fabs((fabs(s)-1.0)) < Transform::ERR_LIMIT ) s = 1; 01044 if ( fabs((fabs(t)-1.0)) < Transform::ERR_LIMIT ) t = 1; 01045 01046 // The final decision, if this is true then we've hit the jackpot 01047 if ( s >= 0 && t >= 0 && (s+t) <= 1 ) { 01048 return i; 01049 } 01050 } 01051 } 01052 01053 return -1; 01054 }
vector< vector<Vec3f> > EMAN::Symmetry3D::au_sym_triangles [mutable, protected] |
This cache is of size cache_size.
Definition at line 214 of file symmetry.h.
Referenced by cache_au_planes(), and point_in_which_asym_unit().
int EMAN::Symmetry3D::cache_size [mutable, protected] |
Have to remember the cache size.
Definition at line 210 of file symmetry.h.
Referenced by cache_au_planes(), and delete_au_planes().
float** EMAN::Symmetry3D::cached_au_planes [mutable, protected] |
The asymmetric unit planes are cached to provide a great speed up the point_in_which_asym_unit function, which is called by reduce and by in_which_asym_unit.
Definition at line 207 of file symmetry.h.
Referenced by cache_au_planes(), delete_au_planes(), point_in_which_asym_unit(), and ~Symmetry3D().
int EMAN::Symmetry3D::num_triangles [mutable, protected] |
This is stores the number of triangles returned by get_asym_unit_triangles(true).
Definition at line 212 of file symmetry.h.
Referenced by cache_au_planes(), and point_in_which_asym_unit().