#include <symmetry.h>
Inheritance diagram for EMAN::TetrahedralSym:
Public Member Functions | |
TetrahedralSym () | |
Constructor calls PlatonicSym::init. | |
virtual | ~TetrahedralSym () |
virtual string | get_name () const |
Return TetrahedralSym::NAME. | |
virtual string | get_desc () const |
Get a description. | |
virtual int | get_max_csym () const |
Gets the maximum symmetry of this object. | |
virtual Transform | get_sym (const int n) const |
This function provides access to the unique rotational symmetries of a tetrahedron. | |
virtual bool | is_in_asym_unit (const float &altitude, const float &azimuth, const bool inc_mirror) const |
In tetrahedral symmetry special consideration must be taken when generating orientations in the asymmetric unit. | |
virtual int | get_nsym () const |
Gets the total number of unique roational symmetry operations associated with this symmetry For tetrahedral symmetry symmetry, this is 12. | |
virtual float | get_az_alignment_offset () const |
Get the azimuth alignment offset required to ensure that orientations align correctly with symmetric axes of the tetrahedron. | |
virtual vector< Vec3f > | get_asym_unit_points (bool inc_mirror=false) const |
virtual bool | is_tet_sym () const |
A function that is used to determine if this is the tetrahedral symmetry object. | |
Static Public Member Functions | |
static Symmetry3D * | NEW () |
Factory support function NEW. | |
Static Public Attributes | |
static const string | NAME = "tet" |
The name of this class - used to access it from factories etc. Should be "tet". | |
Private Member Functions | |
TetrahedralSym (const TetrahedralSym &) | |
Disallow copy construction. | |
TetrahedralSym & | operator= (const TetrahedralSym &) |
Disallow assignment. |
The tetrahedron has n=m=3; F=4, E=6=nF/2, V=4=nF/m. It is composed of four triangles."
Definition at line 675 of file symmetry.h.
EMAN::TetrahedralSym::TetrahedralSym | ( | ) | [inline] |
Constructor calls PlatonicSym::init.
Definition at line 680 of file symmetry.h.
References EMAN::PlatonicSym::init().
Referenced by NEW().
00680 {init();}
virtual EMAN::TetrahedralSym::~TetrahedralSym | ( | ) | [inline, virtual] |
EMAN::TetrahedralSym::TetrahedralSym | ( | const TetrahedralSym & | ) | [private] |
Disallow copy construction.
vector< Vec3f > TetrahedralSym::get_asym_unit_points | ( | bool | inc_mirror = false |
) | const [virtual] |
inc_mirror | whether or not to include the mirror portion of the asymmetric unit |
Reimplemented from EMAN::PlatonicSym.
Definition at line 1918 of file symmetry.cpp.
References b, get_az_alignment_offset(), EMAN::Vec3< Type >::normalize(), EMAN::PlatonicSym::platonic_params, and t.
01919 { 01920 vector<Vec3f> ret; 01921 01922 Vec3f b = Vec3f(0,0,1); 01923 ret.push_back(b); 01924 float theta_c_on_two = (float)platonic_params["theta_c_on_two"]; // already in radians 01925 float theta_c = 2*theta_c_on_two; 01926 01927 Vec3f c_on_two = Vec3f(0,-sin(theta_c_on_two),cos(theta_c_on_two)); 01928 Vec3f c = Vec3f(0,-sin(theta_c),cos(theta_c)); 01929 ret.push_back(c_on_two); 01930 float cap_sig = platonic_params["az_max"]; 01931 if ( inc_mirror ) { 01932 Vec3f a = Vec3f(sin(theta_c)*sin(cap_sig),-sin(theta_c)*cos(cap_sig),cos(theta_c)); 01933 01934 Vec3f f = a+b+c; 01935 f.normalize(); 01936 01937 ret.push_back(f); 01938 } 01939 01940 Vec3f a_on_two = Vec3f(sin(theta_c_on_two)*sin(cap_sig),-sin(theta_c_on_two)*cos(cap_sig),cos(theta_c_on_two)); 01941 ret.push_back(a_on_two); 01942 01943 01944 if ( get_az_alignment_offset() != 0 ) { 01945 Dict d("type","eman"); 01946 d["az"] = get_az_alignment_offset(); 01947 d["phi"] = 0.0f; 01948 d["alt"] = 0.0f; 01949 Transform t(d); 01950 for (vector<Vec3f>::iterator it = ret.begin(); it != ret.end(); ++it ) 01951 { 01952 *it = (*it)*t; 01953 } 01954 } 01955 01956 return ret; 01957 }
float TetrahedralSym::get_az_alignment_offset | ( | ) | const [virtual] |
Get the azimuth alignment offset required to ensure that orientations align correctly with symmetric axes of the tetrahedron.
This offset is directly related to the way the symmetric operations are generated by get_sym. All orientations generated as a result of using the delimiters supplied by this class should by offset by this azimuth to ensure proper alignment with tetrahedral objects in EMAN2
Reimplemented from EMAN::Symmetry3D.
Definition at line 1855 of file symmetry.cpp.
Referenced by get_asym_unit_points().
virtual string EMAN::TetrahedralSym::get_desc | ( | ) | const [inline, virtual] |
Get a description.
Implements EMAN::FactoryBase.
Definition at line 700 of file symmetry.h.
virtual int EMAN::TetrahedralSym::get_max_csym | ( | ) | const [inline, virtual] |
Gets the maximum symmetry of this object.
This is used by OrientationGenerators, and is probably not something a general user would utilize.
Implements EMAN::Symmetry3D.
Definition at line 706 of file symmetry.h.
virtual string EMAN::TetrahedralSym::get_name | ( | ) | const [inline, virtual] |
Return TetrahedralSym::NAME.
Implements EMAN::FactoryBase.
Definition at line 694 of file symmetry.h.
References NAME.
00694 { return NAME; }
virtual int EMAN::TetrahedralSym::get_nsym | ( | ) | const [inline, virtual] |
Gets the total number of unique roational symmetry operations associated with this symmetry For tetrahedral symmetry symmetry, this is 12.
Implements EMAN::Symmetry3D.
Definition at line 736 of file symmetry.h.
Transform TetrahedralSym::get_sym | ( | const int | n | ) | const [virtual] |
This function provides access to the unique rotational symmetries of a tetrahedron.
In this implementation, the tetrahedral symmetry group has a face along the z-axis. In all, there are 12 (accessed by get_nysm) unique rotational symmetric operations for the tetrahedron. In the terminology defined Append A (titled Symmetry Elements) in the manuscript Baldwin and Penczek, 2007. The Transform Class in SPARX and EMAN2. JSB 157(250-261), Doctor Phil has this to say: "B^3=A^3=1; BABA=1; implies A^2=BAB, ABA=B^2 , AB^2A = B^2AB^2 and 12 words with at most a single A 1 B BB A BA AB BBA BAB ABB BBAB BABB BBABB at most one A is necessary"
n | the symmetric operation number |
Implements EMAN::Symmetry3D.
Definition at line 1890 of file symmetry.cpp.
01891 { 01892 // These rotations courtesy of Phil Baldwin 01893 // It has n=m=3; F=4, E=6=nF/2, V=4=nF/m 01894 static double lvl0=0; // There is a face along z 01895 static double lvl1=109.4712; // that is acos(-1/3) // There are 3 faces at this angle 01896 01897 static double TET[36] = {// This is with the face along z 01898 0,lvl0,0, 0,lvl0,120, 0,lvl0,240, 01899 0,lvl1,60, 0,lvl1,180, 0,lvl1,300, 01900 120,lvl1,60, 120,lvl1,180, 120,lvl1,300, 01901 240,lvl1,60, 240,lvl1,180, 240,lvl1,300 01902 }; 01903 // 01904 int idx = n % 12; 01905 // Transform3D ret; 01906 // ret.set_rotation((float)TET[idx * 3 ],(float)TET[idx * 3 + 1], (float)TET[idx * 3 + 2] ); 01907 // return ret; 01908 01909 Dict d("type","eman"); 01910 d["az"] = (float)TET[idx * 3 ]; 01911 d["alt"] = (float)TET[idx * 3 + 1]; 01912 d["phi"] = (float)TET[idx * 3 + 2]; 01913 return Transform(d); 01914 01915 }
bool TetrahedralSym::is_in_asym_unit | ( | const float & | altitude, | |
const float & | azimuth, | |||
const bool | inc_mirror | |||
) | const [virtual] |
In tetrahedral symmetry special consideration must be taken when generating orientations in the asymmetric unit.
This function is a specialization of the functionality in PlatonicSym::is_in_asym_unit
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 |
Reimplemented from EMAN::PlatonicSym.
Definition at line 1857 of file symmetry.cpp.
References EMAN::EMConsts::deg2rad, EMAN::PlatonicSym::get_delimiters(), EMAN::PlatonicSym::platonic_alt_lower_bound(), and EMAN::PlatonicSym::platonic_params.
01858 { 01859 Dict d = get_delimiters(inc_mirror); 01860 float alt_max = d["alt_max"]; 01861 float az_max = d["az_max"]; 01862 01863 if ( altitude >= 0 && altitude <= alt_max && azimuth <= az_max && azimuth >= 0) { 01864 // convert azimuth to radians 01865 float tmpaz = (float)(EMConsts::deg2rad * azimuth); 01866 01867 float cap_sig = platonic_params["az_max"]; 01868 float alt_max = platonic_params["alt_max"]; 01869 if ( tmpaz > ( cap_sig/2.0f ) )tmpaz = cap_sig - tmpaz; 01870 01871 float lower_alt_bound = platonic_alt_lower_bound(tmpaz, alt_max ); 01872 01873 // convert altitude to radians 01874 float tmpalt = (float)(EMConsts::deg2rad * altitude); 01875 if ( lower_alt_bound > tmpalt ) { 01876 if ( !inc_mirror ) { 01877 float upper_alt_bound = platonic_alt_lower_bound( tmpaz, alt_max/2.0f); 01878 // you could change the "<" to a ">" here to get the other mirror part of the asym unit 01879 if ( upper_alt_bound < tmpalt ) return false; 01880 else return true; 01881 } 01882 else return true; 01883 } 01884 return false; 01885 } 01886 else return false; 01887 }
virtual bool EMAN::TetrahedralSym::is_tet_sym | ( | ) | const [inline, virtual] |
A function that is used to determine if this is the tetrahedral symmetry object.
Reimplemented from EMAN::Symmetry3D.
Definition at line 758 of file symmetry.h.
static Symmetry3D* EMAN::TetrahedralSym::NEW | ( | ) | [inline, static] |
Factory support function NEW.
Definition at line 686 of file symmetry.h.
References TetrahedralSym().
00687 { 00688 return new TetrahedralSym(); 00689 }
TetrahedralSym& EMAN::TetrahedralSym::operator= | ( | const TetrahedralSym & | ) | [private] |
Disallow assignment.
const string TetrahedralSym::NAME = "tet" [static] |
The name of this class - used to access it from factories etc. Should be "tet".
Definition at line 747 of file symmetry.h.
Referenced by get_name().