====== 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)