Python AO end-to-end simulator
SPECULA is a Python-based, object-oriented software derived from PASSATA and developed by the Adaptive Optics group at the Arcetri Observatory for end-to-end Monte-Carlo simulations of adaptive optics systems. It can be accelerated using GPU-CUDA via CuPy.
See the documentation here: specula.readthedocs.io
- docs: contains the documentation.
- config: contains functions and parameter files to calibrate and run a closed loop of an adaptive optics system (single-conjugated, multi-conjugated, natural, laser, ...).
- specula: the main library, structured as follows:
- data: data required by utility functions.
- data_objects: classes that wrap the data and provide methods to access them.
- display: classes for data visualization.
- lib: utility functions used by multiple objects.
- processing_objects: classes that model the simulation elements as a function of inputs and time.
- scripts: various scripts.
- test: contains functions to test SPECULA using the
unittestframework.
- Python 3.8+
- numpy
- scipy
- matplotlib
- flask
- flask-socketio
- socketio
- cupy (for GPU acceleration, optional)
Some features require additional libraries:
- orthogram: for automatic block diagram creation (see orthogram, requires pycairo)
- control: for conversion of transfer function system in SPECULA format and vice-versa and analysis of transfer function
To contribute to SPECULA, follow these steps:
- Fork this repository.
- Create a branch:
git checkout -b <branch_name> - Make your changes and add tests for the new functionality.
- Commit your changes:
git commit -m '<commit_message>' - Push to the branch:
git push - Create the pull request.
We require tests for all new features to ensure the stability of the project.
If you use SPECULA in your research, please cite:
@article{specula2026,
author = {Fabio Rossi and Alfio Puglisi and Guido Agapito},
title = {{Introducing a new generation adaptive optics simulation framework: from PASSATA to SPECULA}},
volume = {12},
journal = {Journal of Astronomical Telescopes, Instruments, and Systems},
number = {1},
publisher = {SPIE},
pages = {019001},
year = {2026},
doi = {10.1117/1.JATIS.12.1.019001},
URL = {https://doi.org/10.1117/1.JATIS.12.1.019001}
}