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 1233 of file symmetry.h.


Constructor & Destructor Documentation

EMAN::SaffOrientationGenerator::SaffOrientationGenerator  )  [inline]
 

Definition at line 1236 of file symmetry.h.

01236 {}

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

Definition at line 1237 of file symmetry.h.

01237 {}

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 659 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().

00660 {
00661         float delta = params.set_default("delta", 0.0f);
00662         int n = params.set_default("n", 0);
00663 
00664         if ( delta <= 0 && n <= 0 ) throw InvalidParameterException("Error, you must specify a positive non-zero delta or n");
00665         if ( delta > 0 && n > 0 ) throw InvalidParameterException("Error, the delta and the n arguments are mutually exclusive");
00666 
00667         if ( n > 0 ) {
00668                 delta = get_optimal_delta(sym,n);
00669         }
00670 
00671 //      if ( sym->is_platonic_sym() ) return gen_platonic_orientations(sym, delta);
00672 
00673         bool inc_mirror = params.set_default("inc_mirror",false);
00674         Dict delimiters = sym->get_delimiters(inc_mirror);
00675         float altmax = delimiters["alt_max"];
00676         float azmax = delimiters["az_max"];
00677 
00678         float altmin = 0.0f;
00679         // #If it's a h symmetry then the alt iterator starts at very close
00680         // #to the altmax... the object is a h symmetry then it knows its alt_min...
00681         if (sym->is_h_sym()){
00682                 altmin = delimiters["alt_min"];
00683                 if (inc_mirror) {
00684                         altmin -= (float) sym->get_params()["equator_range"];
00685                 }
00686         }
00687 
00688         float Deltaz = (float)(cos(altmax*EMConsts::deg2rad)-cos(altmin*EMConsts::deg2rad));
00689         float s = delta*M_PI/180.0f;
00690         float NFactor = 3.6f/s;
00691         float wedgeFactor = fabs( Deltaz*(azmax)/720.0f) ;
00692         int NumPoints   =  static_cast<int> (NFactor*NFactor*wedgeFactor);
00693 
00694         vector<Transform> ret;
00695 
00696         if (!sym->is_h_sym()) add_orientation(ret,0,0);
00697         float az = 0.0f;
00698         float dz = (float)cos(altmin*EMConsts::deg2rad);
00699         for(int i = 1; i < NumPoints; ++i ){
00700                 float z = dz + Deltaz* (float)i/ float(NumPoints-1);
00701                 float r= sqrt(1.0f-z*z);
00702                 az = fmod(az + delta/r,azmax);
00703                 float alt = (float)(acos(z)*EMConsts::rad2deg);
00704                 if (sym->is_platonic_sym()) {
00705                         if ( sym->is_in_asym_unit(alt,az,inc_mirror) == false ) continue;
00706                         else {
00707                                 az += sym->get_az_alignment_offset(); // Align to the symmetry axes
00708                         }
00709                 }
00710                 add_orientation(ret,az,alt);
00711         }
00712 
00713         return ret;
00714 }

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 1255 of file symmetry.h.

01255 { 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 1250 of file symmetry.h.

01250 { 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 618 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().

00619 {
00620         bool inc_mirror = params.set_default("inc_mirror",false);
00621         Dict delimiters = sym->get_delimiters(inc_mirror);
00622         float altmax = delimiters["alt_max"];
00623         float azmax = delimiters["az_max"];
00624 
00625         float altmin = 0.0f;
00626         // #If it's a h symmetry then the alt iterator starts at very close
00627         // #to the altmax... the object is a h symmetry then it knows its alt_min...
00628         if (sym->is_h_sym()){
00629                 altmin = delimiters["alt_min"];
00630                 if (inc_mirror) {
00631                         altmin -= (float) sym->get_params()["equator_range"];
00632                 }
00633         }
00634 
00635         float Deltaz = (float)(cos(altmax*EMConsts::deg2rad)-cos(altmin*EMConsts::deg2rad));
00636         float s = delta*M_PI/180.0f;
00637         float NFactor = 3.6f/s;
00638         float wedgeFactor = fabs( Deltaz*(azmax)/720.0f) ;
00639         int NumPoints   =  static_cast<int> (NFactor*NFactor*wedgeFactor);
00640 
00641         int tally = 0;
00642         if (!sym->is_h_sym()) ++tally;
00643         float az = 0.0f;
00644         float dz = (float)cos(altmin*EMConsts::deg2rad);
00645         for(int i = 1; i < NumPoints; ++i ){
00646                 float z = dz + Deltaz* (float)i/ float(NumPoints-1);
00647                 float r= sqrt(1.0f-z*z);
00648                 az = fmod(az + delta/r,azmax);
00649                 float alt = (float)(acos(z)*EMConsts::rad2deg);
00650                 if (sym->is_platonic_sym()) {
00651                         if ( sym->is_in_asym_unit(alt,az,inc_mirror) == false ) continue;
00652                 }
00653                 tally++;
00654         }
00655 
00656         return tally;
00657 }

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 1261 of file symmetry.h.

References EMAN::TypeDict::put().

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

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

Factory support function NEW.

Returns:
a newly instantiated class of this type

Definition at line 1242 of file symmetry.h.

01243                 {
01244                         return new SaffOrientationGenerator();
01245                 }

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 47 of file symmetry.cpp.


The documentation for this class was generated from the following files:
Generated on Tue Jul 12 13:52:01 2011 for EMAN2 by  doxygen 1.3.9.1