#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 678 of file symmetry.h.
EMAN::TetrahedralSym::TetrahedralSym | ( | ) | [inline] |
Constructor calls PlatonicSym::init.
Definition at line 683 of file symmetry.h.
References EMAN::PlatonicSym::init().
Referenced by NEW().
00683 {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 1884 of file symmetry.cpp.
References b, get_az_alignment_offset(), EMAN::Vec3< Type >::normalize(), EMAN::PlatonicSym::platonic_params, and t.
01885 { 01886 vector<Vec3f> ret; 01887 01888 Vec3f b = Vec3f(0,0,1); 01889 ret.push_back(b); 01890 float theta_c_on_two = (float)platonic_params["theta_c_on_two"]; // already in radians 01891 float theta_c = 2*theta_c_on_two; 01892 01893 Vec3f c_on_two = Vec3f(0,-sin(theta_c_on_two),cos(theta_c_on_two)); 01894 Vec3f c = Vec3f(0,-sin(theta_c),cos(theta_c)); 01895 ret.push_back(c_on_two); 01896 float cap_sig = platonic_params["az_max"]; 01897 if ( inc_mirror ) { 01898 Vec3f a = Vec3f(sin(theta_c)*sin(cap_sig),-sin(theta_c)*cos(cap_sig),cos(theta_c)); 01899 01900 Vec3f f = a+b+c; 01901 f.normalize(); 01902 01903 ret.push_back(f); 01904 } 01905 01906 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)); 01907 ret.push_back(a_on_two); 01908 01909 01910 if ( get_az_alignment_offset() != 0 ) { 01911 Dict d("type","eman"); 01912 d["az"] = get_az_alignment_offset(); 01913 d["phi"] = 0.0f; 01914 d["alt"] = 0.0f; 01915 Transform t(d); 01916 for (vector<Vec3f>::iterator it = ret.begin(); it != ret.end(); ++it ) 01917 { 01918 *it = (*it)*t; 01919 } 01920 } 01921 01922 return ret; 01923 }
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 1821 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 703 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 709 of file symmetry.h.
virtual string EMAN::TetrahedralSym::get_name | ( | ) | const [inline, virtual] |
Return TetrahedralSym::NAME.
Implements EMAN::FactoryBase.
Definition at line 697 of file symmetry.h.
References NAME.
00697 { 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 739 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 1856 of file symmetry.cpp.
01857 { 01858 // These rotations courtesy of Phil Baldwin 01859 // It has n=m=3; F=4, E=6=nF/2, V=4=nF/m 01860 static double lvl0=0; // There is a face along z 01861 static double lvl1=109.4712; // that is acos(-1/3) // There are 3 faces at this angle 01862 01863 static double TET[36] = {// This is with the face along z 01864 0,lvl0,0, 0,lvl0,120, 0,lvl0,240, 01865 0,lvl1,60, 0,lvl1,180, 0,lvl1,300, 01866 120,lvl1,60, 120,lvl1,180, 120,lvl1,300, 01867 240,lvl1,60, 240,lvl1,180, 240,lvl1,300 01868 }; 01869 // 01870 int idx = n % 12; 01871 // Transform3D ret; 01872 // ret.set_rotation((float)TET[idx * 3 ],(float)TET[idx * 3 + 1], (float)TET[idx * 3 + 2] ); 01873 // return ret; 01874 01875 Dict d("type","eman"); 01876 d["az"] = (float)TET[idx * 3 ]; 01877 d["alt"] = (float)TET[idx * 3 + 1]; 01878 d["phi"] = (float)TET[idx * 3 + 2]; 01879 return Transform(d); 01880 01881 }
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 1823 of file symmetry.cpp.
References EMAN::EMConsts::deg2rad, EMAN::PlatonicSym::get_delimiters(), EMAN::PlatonicSym::platonic_alt_lower_bound(), and EMAN::PlatonicSym::platonic_params.
01824 { 01825 Dict d = get_delimiters(inc_mirror); 01826 float alt_max = d["alt_max"]; 01827 float az_max = d["az_max"]; 01828 01829 if ( altitude >= 0 && altitude <= alt_max && azimuth <= az_max && azimuth >= 0) { 01830 // convert azimuth to radians 01831 float tmpaz = (float)(EMConsts::deg2rad * azimuth); 01832 01833 float cap_sig = platonic_params["az_max"]; 01834 float alt_max = platonic_params["alt_max"]; 01835 if ( tmpaz > ( cap_sig/2.0f ) )tmpaz = cap_sig - tmpaz; 01836 01837 float lower_alt_bound = platonic_alt_lower_bound(tmpaz, alt_max ); 01838 01839 // convert altitude to radians 01840 float tmpalt = (float)(EMConsts::deg2rad * altitude); 01841 if ( lower_alt_bound > tmpalt ) { 01842 if ( !inc_mirror ) { 01843 float upper_alt_bound = platonic_alt_lower_bound( tmpaz, alt_max/2.0f); 01844 // you could change the "<" to a ">" here to get the other mirror part of the asym unit 01845 if ( upper_alt_bound < tmpalt ) return false; 01846 else return true; 01847 } 01848 else return true; 01849 } 01850 return false; 01851 } 01852 else return false; 01853 }
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 761 of file symmetry.h.
static Symmetry3D* EMAN::TetrahedralSym::NEW | ( | ) | [inline, static] |
Factory support function NEW.
Definition at line 689 of file symmetry.h.
References TetrahedralSym().
00690 { 00691 return new TetrahedralSym(); 00692 }
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 750 of file symmetry.h.
Referenced by get_name().