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

static OrientationGeneratorNEW ()
 Factory support function NEW.

Static Public Attributes

static 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.

Referenced by NEW().

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::EMConsts::deg2rad, 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::FactoryBase::params, EMAN::EMConsts::rad2deg, 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.

References NAME.

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::EMConsts::deg2rad, 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::FactoryBase::params, EMAN::EMConsts::rad2deg, 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::EMObject::BOOL, EMAN::EMObject::FLOAT, EMAN::OrientationGenerator::get_param_types(), EMAN::EMObject::INT, and 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                 }

static 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.

References SaffOrientationGenerator().

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

Referenced by get_name().


The documentation for this class was generated from the following files:
Generated on Mon Jul 19 13:08:03 2010 for EMAN2 by  doxygen 1.4.4