Software

PANORAMA

Package for ANalysis Of RApidly rotating MAssive stars: one environment from the observing plan to the 3D model.

Why PANORAMA

Massive stars often spin fast and live in binaries. Rotation flattens them into a Roche shape, makes temperature and gravity depend on latitude, and broadens and reshapes their spectral lines, so standard 1D, non-rotating analyses fall short.

I wrote PANORAMA from scratch to keep the whole analysis in one consistent place: planning the observations, reading and measuring the spectra, modelling the rotating star in 3D, and preparing the results for publication. At its core it computes the Roche shape of the star and derives gravity, temperature, gravity darkening (von Zeipel 1924; Espinosa Lara & Rieutord 2011) and brightness across the surface. Those surfaces go directly into SPAMMS for spectra, and PANORAMA predicts interferometric observables from the same brightness map, so both kinds of data can be fitted together.

That joint approach is being applied to the Be star γ Cas with the MAGIC + CTAO LST-1 intensity interferometer. Radiation pressure and differential rotation are being added, the focus of my 2027 research stay at IRAP, Toulouse.

Modules

Each module is independent, exposes a few public functions and has its own README and demo script.

rot

Physics of rotating stars

Polar, equatorial, volume- and surface-equivalent radii of Roche-distorted stars, critical velocities and rotation rates with error propagation, and full 3D models with gravity darkening and optional radiation pressure.

rpole_to_requator, rpole_to_requiv, vrot_crit, rot_rate, rot_params

iacob_broad

Line broadening (IACOB-BROAD)

Python port of IACOB-BROAD (Simón-Díaz & Herrero 2014): v sin i and macroturbulence from the Fourier transform and goodness-of-fit methods combined.

iacob_broad

fitline

Spectral line fitting

Iterative fits with Gaussian, Lorentzian, Voigt and rotation + macroturbulence profiles; equivalent width, FWHM, radial velocity, MCMC uncertainties and an automatic PASS / WARN / FAIL assessment.

fitline

spec

Spectra handling

Read 1D spectra in common ASCII and FITS layouts, overplot them, remove artefacts interactively and normalise the continuum IRAF-style.

readspec, plotspec, rmvspec, normspec

obs

Observation planning

Exposure times and SNR, upcoming eclipses and orbital phases per night, telescope pointing, FITS observing logs, and BinarAlt, a browser-based planner with live observatory weather.

periodic_event, obs_phase_night, telescope_pointing, binaralt

units

Physical conversions

Classical and relativistic Doppler shifts, vacuum–air wavelengths, resolving power to velocity, and Eddington-limit quantities.

wl2kmps, vac2air, R2kmps, eddington

tex

Manuscript utilities

Find uncited BibTeX entries, query VizieR for a list of targets, and reopen pickled matplotlib figures.

nobib, queryviz, read_pkl

broad

Spectral degradation (in development)

SNR degradation, resampling, resolution degradation, and rotational and macroturbulent broadening.

planned

Quick start

git clone https://github.com/DGalanDieguez/PANORAMA
cd PANORAMA
pip install -e .            # editable install, Python 3.10+
import panorama
panorama.functions()        # every public function, by module

from panorama import vrot_crit, rot_params, iacob_broad

vrot_crit(mass=15., r_pole=5.0)["vrot_crit"]          # break-up velocity [km/s]

star = rot_params(teff=25000, mass=15., r_pole=5.0,    # 3D model of the star
                  rot_rate=0.8, inclination=60., plot=True)
star["teff_pole"], star["teff_equator"]

res = iacob_broad("data/HD37042", res=46000., line="SiIII")
res["vft"], res["vsgof"], res["vmgof"]                 # vsini and vmac

Every public function checks its inputs, has a NumPy-style docstring (help(panorama.fitline)) and has a demo in Demos/.

How to cite

The PANORAMA paper (Galán-Diéguez et al.) is in preparation. Until it is out, please cite the GitHub repository and contact me. Modules that implement published methods, such as IACOB-BROAD, list the original papers to cite in their README.