User Guide
This guide covers the main concepts and features in more detail.
Configuration structure
TIPTOP configurations are organised into sections, each controlling a different part of the AO simulation:
Section |
Description |
|---|---|
|
Turbulence profile: seeing, outer scale, Cn2 layer heights/weights, wind |
|
Pupil geometry: diameter, obscuration, resolution, static aberrations |
|
Where and at what wavelength to compute PSFs |
|
High-order guide star positions and wavelength |
|
Low-order guide star positions and wavelength (optional) |
|
Focus sensor source wavelength (MCAO systems only) |
|
Science detector: pixel scale, field of view |
|
High-order wavefront sensor: type, lenslets, photon flux |
|
Low-order wavefront sensor (optional) |
|
Focus sensor parameters (MCAO systems only) |
|
Deformable mirror: actuators, pitch, conjugation altitude |
|
Real-time controller: loop gain, frame rate, delay |
For full parameter descriptions, see the TIPTOP parameter documentation.
Tuple indexing
TipTop uses tuple indexing for clean parameter access:
# Read
tt["atmosphere", "Seeing"] # single value
tt["atmosphere"] # whole section dict
# Write
tt["atmosphere", "Seeing"] = 0.6 # single value
tt["atmosphere"] = {...} # replace whole section
SCAO vs MCAO systems
Single-conjugate AO (SCAO) systems like ERIS, MICADO_SCAO, and SPHERE use a
single guide star and deformable mirror. Their configurations are simpler: no
sources_LO, no sources_Focus/sensor_Focus sections.
Multi-conjugate AO (MCAO) systems like MORFEO and MAVIS use multiple laser guide stars, multiple natural guide stars, and multiple deformable mirrors. Their configurations include additional sections for low-order and focus sensing.
Both types work identically with TipTop — the optional sections are simply
absent from SCAO templates.
Multi-wavelength PSFs
Request PSFs at multiple wavelengths by providing a list:
tt["sources_science", "Wavelength"] = [1.2e-6, 1.65e-6, 2.2e-6]
result = tt.generate_psf()
result.n_wavelengths # 3
j_psf = result.psf_cube(0) # J-band
h_psf = result.psf_cube(1) # H-band
k_psf = result.psf_cube(2) # K-band
Multi-position PSFs
Request PSFs at multiple field positions:
tt["sources_science", "Zenith"] = [0, 10, 20] # arcsec from axis
tt["sources_science", "Azimuth"] = [0, 90, 180] # degrees
result = tt.generate_psf()
result.x # cartesian x-coordinates (arcsec)
result.y # cartesian y-coordinates (arcsec)
# Get the PSF nearest to a specific position
psf = result.nearest_psf(x=5.0, y=0.0)
Plotting
TipTopResult.plot() provides a quick visualisation:
# Default: log scale, inferno colormap
result.plot()
# Linear scale
result.plot(log_scale=False)
# Specific wavelength and position
result.plot(wavelength_index=1, position_index=2)
# Pass kwargs to imshow
result.plot(cmap="viridis", vmin=-5, vmax=0)
For more control, access the numpy array directly:
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
for i in range(3):
axes[i].imshow(result.psf_cube(i)[0], norm=LogNorm())
axes[i].set_title(f"Wavelength {i}")
Reproducibility with diff()
The diff() method tracks exactly what you changed from the template, making
it easy to document your simulation setup:
tt = TipTop("MICADO_SCAO")
tt["atmosphere", "Seeing"] = 0.5
tt["atmosphere", "L0"] = 30.0
tt["telescope", "ZenithAngle"] = 45.0
tt.diff()
# {'atmosphere': {'Seeing': (0.644, 0.5), 'L0': (25.0, 30.0)},
# 'telescope': {'ZenithAngle': (0.0, 45.0)}}
Keeping templates up to date
The check_ini_updates.py utility syncs instrument templates with the
upstream TIPTOP repository on GitHub:
# Check for differences
python -m tiptop_ipy.check_ini_updates
# Update local files
python -m tiptop_ipy.check_ini_updates --update