Documentation for POPPY

POPPY (Physical Optics Propagation in PYthon) simulates physical optical propagation including diffraction. It implements a flexible framework for modeling Fraunhofer and Fresnel diffraction and point spread function formation, particularly in the context of astronomical telescopes. POPPY was developed as part of a simulation package for JWST, but is broadly applicable to many kinds of imaging simulations.



What this software does:

  • Allows users to define an optical system consisting of multiple planes, such as pupils and images.

  • Provides flexible and extensible optical element classes, including a wide variety of stops, masks, lenses and more.

  • Propagates wavefronts between planes using either the Fraunhofer or Fresnel approximations of scalar electromagnetic theory.

  • Computes monochromatic and polychromatic point spread functions through those optics.

  • Provides an extensible framework for defining models of optical instruments, including selection of broad- and narrow-band filters, selectable optical components such as pupil stops, models of optical aberrations defined by Zernike polynomials, etc.

That said, Poppy does not implement full Rayleigh-Sommerfeld electromagnetic propagation, vector electromagnetic field propagation such as would be needed for modeling polarization effects, nor modelling of any kind of detector noise or imperfections.

Getting Started:

See Example Code and Getting Started

Quickstart IPython Notebook

This documentation is complemented by an IPython Notebook quickstart tutorial.

Downloading and running that notebook is a great way to get started using POPPY. The documentation following here provides greater details on the algorithms and API.

What’s New in the latest version?


Getting Help

POPPY is developed and maintained by Marshall Perrin and collaborators. Questions, comments, and pull requests always welcome, either via the Github repository or email to