#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 2004 of file symmetry.cpp.
References b, get_az_alignment_offset(), EMAN::Vec3< Type >::normalize(), EMAN::PlatonicSym::platonic_params, and t.
02005 { 02006 vector<Vec3f> ret; 02007 02008 Vec3f b = Vec3f(0,0,1); 02009 ret.push_back(b); 02010 float theta_c_on_two = (float)platonic_params["theta_c_on_two"]; // already in radians 02011 float theta_c = 2*theta_c_on_two; 02012 02013 Vec3f c_on_two = Vec3f(0,-sin(theta_c_on_two),cos(theta_c_on_two)); 02014 Vec3f c = Vec3f(0,-sin(theta_c),cos(theta_c)); 02015 ret.push_back(c_on_two); 02016 float cap_sig = platonic_params["az_max"]; 02017 if ( inc_mirror ) { 02018 Vec3f a = Vec3f(sin(theta_c)*sin(cap_sig),-sin(theta_c)*cos(cap_sig),cos(theta_c)); 02019 02020 Vec3f f = a+b+c; 02021 f.normalize(); 02022 02023 ret.push_back(f); 02024 } 02025 02026 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)); 02027 ret.push_back(a_on_two); 02028 02029 02030 if ( get_az_alignment_offset() != 0 ) { 02031 Dict d("type","eman"); 02032 d["az"] = get_az_alignment_offset(); 02033 d["phi"] = 0.0f; 02034 d["alt"] = 0.0f; 02035 Transform t(d); 02036 for (vector<Vec3f>::iterator it = ret.begin(); it != ret.end(); ++it ) 02037 { 02038 *it = (*it)*t; 02039 } 02040 } 02041 02042 return ret; 02043 }
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 1941 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 1976 of file symmetry.cpp.
01977 { 01978 // These rotations courtesy of Phil Baldwin 01979 // It has n=m=3; F=4, E=6=nF/2, V=4=nF/m 01980 static double lvl0=0; // There is a face along z 01981 static double lvl1=109.4712; // that is acos(-1/3) // There are 3 faces at this angle 01982 01983 static double TET[36] = {// This is with the face along z 01984 0,lvl0,0, 0,lvl0,120, 0,lvl0,240, 01985 0,lvl1,60, 0,lvl1,180, 0,lvl1,300, 01986 120,lvl1,60, 120,lvl1,180, 120,lvl1,300, 01987 240,lvl1,60, 240,lvl1,180, 240,lvl1,300 01988 }; 01989 // 01990 int idx = n % 12; 01991 // Transform3D ret; 01992 // ret.set_rotation((float)TET[idx * 3 ],(float)TET[idx * 3 + 1], (float)TET[idx * 3 + 2] ); 01993 // return ret; 01994 01995 Dict d("type","eman"); 01996 d["az"] = (float)TET[idx * 3 ]; 01997 d["alt"] = (float)TET[idx * 3 + 1]; 01998 d["phi"] = (float)TET[idx * 3 + 2]; 01999 return Transform(d); 02000 02001 }
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 1943 of file symmetry.cpp.
References EMAN::EMConsts::deg2rad, EMAN::PlatonicSym::get_delimiters(), EMAN::PlatonicSym::platonic_alt_lower_bound(), and EMAN::PlatonicSym::platonic_params.
01944 { 01945 Dict d = get_delimiters(inc_mirror); 01946 float alt_max = d["alt_max"]; 01947 float az_max = d["az_max"]; 01948 01949 if ( altitude >= 0 && altitude <= alt_max && azimuth <= az_max && azimuth >= 0) { 01950 // convert azimuth to radians 01951 float tmpaz = (float)(EMConsts::deg2rad * azimuth); 01952 01953 float cap_sig = platonic_params["az_max"]; 01954 float alt_max = platonic_params["alt_max"]; 01955 if ( tmpaz > ( cap_sig/2.0f ) )tmpaz = cap_sig - tmpaz; 01956 01957 float lower_alt_bound = platonic_alt_lower_bound(tmpaz, alt_max ); 01958 01959 // convert altitude to radians 01960 float tmpalt = (float)(EMConsts::deg2rad * altitude); 01961 if ( lower_alt_bound > tmpalt ) { 01962 if ( !inc_mirror ) { 01963 float upper_alt_bound = platonic_alt_lower_bound( tmpaz, alt_max/2.0f); 01964 // you could change the "<" to a ">" here to get the other mirror part of the asym unit 01965 if ( upper_alt_bound < tmpalt ) return false; 01966 else return true; 01967 } 01968 else return true; 01969 } 01970 return false; 01971 } 01972 else return false; 01973 }
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().