Conventions

Here, we will outline some of the conventions used by prysm. These will be useful to understand if extending the library, or performing custom analysis.

prysm uses a large number of classes which carry data and metadata about the signals with their namesakes. They can be divided loosely into two caregories,

  • phases

  • images

Both have common properties of x and y, which are one dimensional arrays giving the gridded coordinates in x and y.

[1]:
# an example of a phase-type object and an image-type object
from prysm import Pupil, Slit

pu = Pupil()
sl = Slit(1, sample_spacing=0.075, samples=64)

pu.x[:3], sl.y[:3]  # only first three elements for brevity
[1]:
(array([-0.5       , -0.49212598, -0.48425197]),
 array([-2.4  , -2.325, -2.25 ]))

Each has an array that holds the numerical representation of the signal itself, for phaes-type objects this is phase and for image-type objects this is data. The convention is y,x indices, consistent with numpy. This is the opposite convention used by matlab.

[2]:
pu.phase[:3,:3], sl.data[:3,:3]
[2]:
(array([[nan, nan, nan],
        [nan, nan, nan],
        [nan, nan, nan]]), array([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]))

both inherit from BasicData (in fact, just about every class in prysm does) which imbues them with a brevy of properties:

[3]:
from prysm._basicdata import BasicData
help(BasicData)
Help on class BasicData in module prysm._basicdata:

class BasicData(builtins.object)
 |  BasicData(x, y, data)
 |
 |  Abstract base class holding some data properties.
 |
 |  Methods defined here:
 |
 |  __init__(self, x, y, data)
 |      Initialize a new BasicData instance.
 |
 |      Parameters
 |      ----------
 |      x : `numpy.ndarray`
 |          x unit axis
 |      y : `numpy.ndarray`
 |          y unit axis
 |      data : `numpy.ndarray`
 |          data
 |
 |      Returns
 |      -------
 |      BasicData
 |          the BasicData instance
 |
 |  copy(self)
 |      Return a (deep) copy of this instance.
 |
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |
 |  __dict__
 |      dictionary for instance variables (if defined)
 |
 |  __weakref__
 |      list of weak references to the object (if defined)
 |
 |  center_x
 |      Center "pixel" in x.
 |
 |  center_y
 |      Center "pixel" in y.
 |
 |  sample_spacing
 |      center-to-center sample spacing.
 |
 |  samples_x
 |      Number of samples in the x dimension.
 |
 |  samples_y
 |      Number of samples in the y dimension.
 |
 |  shape
 |      Proxy to phase or data shape.
 |
 |  size
 |      Proxy to phase or data size.
 |
 |  slice_x
 |      Retrieve a slice through the X axis of the phase.
 |
 |      Returns
 |      -------
 |      self.unit : `numpy.ndarray`
 |          ordinate axis
 |      slice of self.phase or self.data : `numpy.ndarray`
 |
 |  slice_y
 |      Retrieve a slice through the Y axis of the phase.
 |
 |      Returns
 |      -------
 |      self.unit : `numpy.ndarray`
 |          ordinate axis
 |      slice of self.phase or self.data : `numpy.ndarray`
 |
 |  unit_x
 |
 |  unit_y

prysm is a metadata-heavy library, with many functions and procedures taking a several arguments, most of which populated with sane default values. A number of these defaults can be controlled through prysm’s config object,

[4]:
from prysm import config
[5]:
controlled_properties = [i for i in dir(config) if not i.startswith('_') and not i == 'initialized']
print(controlled_properties)
['Q', 'backend', 'chbackend_observers', 'image_colormap', 'lw', 'phase_colormap', 'precision', 'precision_complex', 'zernike_base', 'zorder']

To change the value used by prysm, simply assign to the property,

[6]:
# use 32-bit floats instead of 64-bit, ~50% speedup to all operations in exchange for accuracy
config.precision = 32