====== Quickly make a projection ======
To make a projection you must have your 3D model loaded into python, and you must be able to define your projection direction as a Transform object. See [[Eman2TransformInPython|Using the EMAN2 Transform class]] and the Transform [[EMAN2:Tutorials/RotateTranslate|turorial page ]] for more information on the Transform object. Also, for more information on Euler angles see the [[http://macro-em.org/sparxwiki/Euler_angles| Sparx wiki page]].
# get a test model
a = test_image_3d(1)
# alternatively load yours from disk
a = EMData("mymodel.mrc")
# make a projection along the z axis
proj = a.project("standard",Transform())
# Another way of making a projection..
t = Transform({"type":"eman","alt":15})
proj2 = a.project("standard",t)
display([proj,proj2])
====== Generating projections in an asymmetric unit ======
EMAN2 has the concept of a[[http://blake.bcm.edu/doxygen/classEMAN_1_1Symmetry3D.html| Symmetry3D]] object and an[[http://blake.bcm.edu/doxygen/classEMAN_1_1OrientationGenerator.html| Orientation Generation ]] object. These two objects can be used interchangeably for generating orientations in an asymmetric unit. Using the Symmetry3D object is the most common way of generating projections (the first method, below).
===== Using a Symmetry3D object =====
First get a list of Transform objects
sym = Symmetries.get("c3") # works for all symmetries, e.g. "tet", "d8" etc
orients = sym.gen_orientations("eman",{"delta":3})
Then iterate through the list of tranforms (//orients//) and make the projections
a = test_image_3d(1)
data = [a.project("standard",t) for t in orients]
display(data)
Note the EMAN2 is sophisticated enough to exclude or include the mirror portion of the asymmetric unit (by default it is off). To turn it on use syntax like this:
orients = sym.gen_orientations("eman",{"delta":3,"inc_mirror":True}) # include mirror portion of the asymmetric unit
euler_display(orients)
Also, you can have the Symmetry3D object try to generate a specific number of projections using this syntax:
orients = sym.gen_orientations("eman",{"n":101}) # Generate 101 orientations
However the return number maybe slightly fewer or slightly greater than the requested number, depending on the orientation generation strategy used (see below for different strategies).
===== Using an Orientation Generator object =====
Using an Orientation Generator object for generating projections in the asymmetric unit is less favoured than using a Symmetry3D, but it may be more convenient in some situations. To generate orientations over the asymmetric unit using this approach use this syntax:
og = OrientGens.get("eman",{"delta":3,"inc_mirror":True})
sym = Symmetries.get("d7")
orients = og.gen_orientations(sym)
And then iterate through **orients** to generate the projections (as above).
In total there are five orientation generation methodologies. For the purpose of single particle reconstruction it is recommended that people use the **eman** strategy, which is more or less that strategy used in EMAN1. The method used by Sparx is available (but not maintained), it is called **even**. Also the Saff (**saff**) method is available (which is a
spiralling method), a randomized optimization (**opt**) scheme is available which works well for C1 symmetries only. Finally it is possible to generate random orientations inside asymmetric units (**rand**), but note that the random orientation generator can currently not exclude the mirror portion of the asymmetric unit.
ogs = OrientGens.get("saff",{"delta":3,"inc_mirror":True})
oge = OrientGens.get("even",{"delta":3,"inc_mirror":True})
ogo = OrientGens.get("opt",{"delta":3,"inc_mirror":True})
ogr = OrientGens.get("rand",{"n":100}) # rand works only with n, and can not exclude the mirror portion
Also note that the **rand** orientation generator does not work with the "delta" argument.
===== Visualizing Orientation Distributions =====
You can use the EMAN2 function **euler_display** to visualize orientation distributions. For example:
sym = Symmetries.get("c1")
orients = sym.gen_orientations("eman",{"delta":3,"inc_mirror":True})
euler_display(orients)