Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

EMAN::SaffOrientationGenerator Class Reference

Saff orientation generator - based on the work of Saff and Kuijlaars, 1997 E.B. More...

#include <symmetry.h>

Inheritance diagram for EMAN::SaffOrientationGenerator:

Inheritance graph
[legend]
Collaboration diagram for EMAN::SaffOrientationGenerator:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 SaffOrientationGenerator ()
virtual ~SaffOrientationGenerator ()
virtual string get_name () const
 Return "saff".
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< Transformgen_orientations (const Symmetry3D *const sym) const
 Generate Saff orientations in the asymmetric unit of the symmetry.

Static Public Member Functions

OrientationGeneratorNEW ()
 Factory support function NEW.

Static Public Attributes

const string NAME = "saff"
 The name of this class - used to access it from factories etc. Should be "icos".

Private Member Functions

 SaffOrientationGenerator (const SaffOrientationGenerator &)
 Disallow copy construction.
SaffOrientationGeneratoroperator= (const SaffOrientationGenerator &)
 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.

Detailed Description

Saff orientation generator - based on the work of Saff and Kuijlaars, 1997 E.B.

Saff and A.B.J. Kuijlaars, Distributing many points on a sphere, Mathematical Intelligencer 19 (1997), pp. 5–11. This is a spiral based approach

Author:
David Woolford (ported directly from Sparx utilities.py, which is written by Pawel Penczek)
Date:
March 2008

Definition at line 1296 of file symmetry.h.


Constructor & Destructor Documentation

EMAN::SaffOrientationGenerator::SaffOrientationGenerator  )  [inline]
 

Definition at line 1299 of file symmetry.h.

01299 {}

virtual EMAN::SaffOrientationGenerator::~SaffOrientationGenerator  )  [inline, virtual]
 

Definition at line 1300 of file symmetry.h.

01300 {}

EMAN::SaffOrientationGenerator::SaffOrientationGenerator const SaffOrientationGenerator  )  [private]
 

Disallow copy construction.


Member Function Documentation

vector< Transform > SaffOrientationGenerator::gen_orientations const Symmetry3D *const   sym  )  const [virtual]
 

Generate Saff orientations in the asymmetric unit of the symmetry.

Parameters:
sym the symmetry which defines the interesting asymmetric unit
Returns:
a vector of Transform objects containing the set of evenly distributed orientations

Implements EMAN::OrientationGenerator.

Definition at line 696 of file symmetry.cpp.

References EMAN::OrientationGenerator::add_orientation(), EMAN::Symmetry3D::get_az_alignment_offset(), EMAN::Symmetry3D::get_delimiters(), EMAN::OrientationGenerator::get_optimal_delta(), EMAN::FactoryBase::get_params(), InvalidParameterException, EMAN::Symmetry3D::is_h_sym(), EMAN::Symmetry3D::is_in_asym_unit(), EMAN::Symmetry3D::is_platonic_sym(), EMAN::Dict::set_default(), and sqrt().

00697 {
00698         float delta = params.set_default("delta", 0.0f);
00699         int n = params.set_default("n", 0);
00700 
00701         if ( delta <= 0 && n <= 0 ) throw InvalidParameterException("Error, you must specify a positive non-zero delta or n");
00702         if ( delta > 0 && n > 0 ) throw InvalidParameterException("Error, the delta and the n arguments are mutually exclusive");
00703 
00704         if ( n > 0 ) {
00705                 delta = get_optimal_delta(sym,n);
00706         }
00707 
00708 //      if ( sym->is_platonic_sym() ) return gen_platonic_orientations(sym, delta);
00709 
00710         bool inc_mirror = params.set_default("inc_mirror",false);
00711         Dict delimiters = sym->get_delimiters(inc_mirror);
00712         float altmax = delimiters["alt_max"];
00713         float azmax = delimiters["az_max"];
00714 
00715         float altmin = 0.0f;
00716         // #If it's a h symmetry then the alt iterator starts at very close
00717         // #to the altmax... the object is a h symmetry then it knows its alt_min...
00718         if (sym->is_h_sym()){
00719                 altmin = delimiters["alt_min"];
00720                 if (inc_mirror) {
00721                         altmin -= (float) sym->get_params()["maxtilt"];
00722                 }
00723         }
00724 
00725         float Deltaz = (float)(cos(altmax*EMConsts::deg2rad)-cos(altmin*EMConsts::deg2rad));
00726         float s = delta*M_PI/180.0f;
00727         float NFactor = 3.6f/s;
00728         float wedgeFactor = fabs( Deltaz*(azmax)/720.0f) ;
00729         int NumPoints   =  static_cast<int> (NFactor*NFactor*wedgeFactor);
00730 
00731         vector<Transform> ret;
00732 
00733         if (!sym->is_h_sym()) add_orientation(ret,0,0);
00734         float az = 0.0f;
00735         float dz = (float)cos(altmin*EMConsts::deg2rad);
00736         for(int i = 1; i < NumPoints; ++i ){
00737                 float z = dz + Deltaz* (float)i/ float(NumPoints-1);
00738                 float r= sqrt(1.0f-z*z);
00739                 az = fmod(az + delta/r,azmax);
00740                 float alt = (float)(acos(z)*EMConsts::rad2deg);
00741                 if (sym->is_platonic_sym()) {
00742                         if ( sym->is_in_asym_unit(alt,az,inc_mirror) == false ) continue;
00743                         else {
00744                                 az += sym->get_az_alignment_offset(); // Align to the symmetry axes
00745                         }
00746                 }
00747                 add_orientation(ret,az,alt);
00748         }
00749 
00750         return ret;
00751 }

virtual string EMAN::SaffOrientationGenerator::get_desc  )  const [inline, virtual]
 

Get a description.

Returns:
a clear desciption of this class

Implements EMAN::FactoryBase.

Definition at line 1318 of file symmetry.h.

01318 { return "Generate quasi-evenly distributed orientations within an asymmetric unit using a spiraling method attributed to Saff"; }

virtual string EMAN::SaffOrientationGenerator::get_name  )  const [inline, virtual]
 

Return "saff".

Returns:
the unique name of this class

Implements EMAN::FactoryBase.

Definition at line 1313 of file symmetry.h.

01313 { return NAME; }

int SaffOrientationGenerator::get_orientations_tally const Symmetry3D *const   sym,
const float &  delta
const [private, virtual]
 

This function returns how many orientations will be generated for a given delta (angular spacing) It does this by simulated gen_orientations.

Parameters:
sym the symmetry which defines the interesting asymmetric unit
delta the desired angular spacing of the orientations
Returns:
the number of orientations that will be generated using these parameters

Implements EMAN::OrientationGenerator.

Definition at line 655 of file symmetry.cpp.

References EMAN::Symmetry3D::get_delimiters(), EMAN::FactoryBase::get_params(), EMAN::Symmetry3D::is_h_sym(), EMAN::Symmetry3D::is_in_asym_unit(), EMAN::Symmetry3D::is_platonic_sym(), EMAN::Dict::set_default(), and sqrt().

00656 {
00657         bool inc_mirror = params.set_default("inc_mirror",false);
00658         Dict delimiters = sym->get_delimiters(inc_mirror);
00659         float altmax = delimiters["alt_max"];
00660         float azmax = delimiters["az_max"];
00661 
00662         float altmin = 0.0f;
00663         // #If it's a h symmetry then the alt iterator starts at very close
00664         // #to the altmax... the object is a h symmetry then it knows its alt_min...
00665         if (sym->is_h_sym()){
00666                 altmin = delimiters["alt_min"];
00667                 if (inc_mirror) {
00668                         altmin -= (float) sym->get_params()["maxtilt"];
00669                 }
00670         }
00671 
00672         float Deltaz = (float)(cos(altmax*EMConsts::deg2rad)-cos(altmin*EMConsts::deg2rad));
00673         float s = delta*M_PI/180.0f;
00674         float NFactor = 3.6f/s;
00675         float wedgeFactor = fabs( Deltaz*(azmax)/720.0f) ;
00676         int NumPoints   =  static_cast<int> (NFactor*NFactor*wedgeFactor);
00677 
00678         int tally = 0;
00679         if (!sym->is_h_sym()) ++tally;
00680         float az = 0.0f;
00681         float dz = (float)cos(altmin*EMConsts::deg2rad);
00682         for(int i = 1; i < NumPoints; ++i ){
00683                 float z = dz + Deltaz* (float)i/ float(NumPoints-1);
00684                 float r= sqrt(1.0f-z*z);
00685                 az = fmod(az + delta/r,azmax);
00686                 float alt = (float)(acos(z)*EMConsts::rad2deg);
00687                 if (sym->is_platonic_sym()) {
00688                         if ( sym->is_in_asym_unit(alt,az,inc_mirror) == false ) continue;
00689                 }
00690                 tally++;
00691         }
00692 
00693         return tally;
00694 }

virtual TypeDict EMAN::SaffOrientationGenerator::get_param_types  )  const [inline, virtual]
 

Get a dictionary containing the permissable parameters of this class.

Returns:
a dictionary containing the permissable parameters of this class parameters are explained in the dictionary itself

Reimplemented from EMAN::OrientationGenerator.

Definition at line 1324 of file symmetry.h.

References EMAN::TypeDict::put().

01325                 {
01326                         TypeDict d = OrientationGenerator::get_param_types();
01327                         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.");
01328                         d.put("inc_mirror", EMObject::BOOL, "Indicates whether or not to include the mirror portion of the asymmetric unit. Default is false.");
01329                         d.put("delta", EMObject::FLOAT, "The angular separation of orientations in degrees. This option is mutually exclusively of the n argument.");
01330                         return d;
01331                 }

OrientationGenerator* EMAN::SaffOrientationGenerator::NEW  )  [inline, static]
 

Factory support function NEW.

Returns:
a newly instantiated class of this type

Definition at line 1305 of file symmetry.h.

01306                 {
01307                         return new SaffOrientationGenerator();
01308                 }

SaffOrientationGenerator& EMAN::SaffOrientationGenerator::operator= const SaffOrientationGenerator  )  [private]
 

Disallow assignment.


Member Data Documentation

const string SaffOrientationGenerator::NAME = "saff" [static]
 

The name of this class - used to access it from factories etc. Should be "icos".

Definition at line 48 of file symmetry.cpp.


The documentation for this class was generated from the following files:
Generated on Tue Jun 11 13:43:12 2013 for EMAN2 by  doxygen 1.3.9.1