ExoIris 0.18.0__tar.gz → 0.20.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {exoiris-0.18.0 → exoiris-0.20.0}/CHANGELOG.md +27 -3
- exoiris-0.20.0/ExoIris.egg-info/PKG-INFO +118 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/ExoIris.egg-info/SOURCES.txt +1 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/ExoIris.egg-info/requires.txt +1 -1
- exoiris-0.20.0/PKG-INFO +118 -0
- exoiris-0.20.0/README.md +85 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/api/exoiris.rst +45 -9
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/api/tsdata.rst +17 -7
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/conf.py +2 -1
- exoiris-0.20.0/doc/source/examples/e01/01a_not_so_short_intro.ipynb +1366 -0
- exoiris-0.20.0/doc/source/examples/e01/02_increasing_knot_resolution.ipynb +472 -0
- exoiris-0.20.0/doc/source/examples/e01/03_increasing_data_resolution.ipynb +589 -0
- exoiris-0.20.0/doc/source/examples/e01/04_gaussian_processes.ipynb +567 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/05a_ldtkldm.ipynb +1 -1
- exoiris-0.20.0/doc/source/examples/e01/example1.png +0 -0
- exoiris-0.20.0/doc/source/examples/e01/plot_1.ipynb +165 -0
- exoiris-0.20.0/doc/source/examples/setup_multiprocessing.py +17 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/__init__.py +1 -1
- {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/exoiris.py +251 -102
- {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/ldtkld.py +3 -3
- exoiris-0.20.0/exoiris/spotmodel.py +176 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/tsdata.py +173 -89
- {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/tslpf.py +105 -34
- {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/wlpf.py +74 -19
- {exoiris-0.18.0 → exoiris-0.20.0}/requirements.txt +1 -1
- exoiris-0.18.0/ExoIris.egg-info/PKG-INFO +0 -80
- exoiris-0.18.0/PKG-INFO +0 -80
- exoiris-0.18.0/README.md +0 -48
- exoiris-0.18.0/doc/source/examples/e01/01a_not_so_short_intro.ipynb +0 -1556
- exoiris-0.18.0/doc/source/examples/e01/02_increasing_knot_resolution.ipynb +0 -483
- exoiris-0.18.0/doc/source/examples/e01/03_increasing_data_resolution.ipynb +0 -586
- exoiris-0.18.0/doc/source/examples/e01/04_gaussian_processes.ipynb +0 -565
- exoiris-0.18.0/doc/source/examples/e01/example1.png +0 -0
- exoiris-0.18.0/doc/source/examples/e01/plot_1.ipynb +0 -424
- exoiris-0.18.0/doc/source/examples/setup_multiprocessing.py +0 -10
- {exoiris-0.18.0 → exoiris-0.20.0}/.github/workflows/python-package.yml +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/.gitignore +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/.readthedocs.yaml +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/CODE_OF_CONDUCT.md +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/ExoIris.egg-info/dependency_links.txt +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/ExoIris.egg-info/top_level.txt +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/LICENSE +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/Makefile +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/make.bat +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/requirements.txt +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/_static/css/custom.css +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/api/binning.rst +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/01b_short_intro.ipynb +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/A2_full_data_resolution.ipynb +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/appendix_1_data_preparation.ipynb +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/data/README.txt +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/data/nirHiss_order_1.h5 +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/data/nirHiss_order_2.h5 +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/figures.ipynb +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/friendly_introduction.ipynb +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/index.rst +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/k_knot_example.svg +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/index.rst +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/install.rst +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/binning.py +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/ephemeris.py +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/tsmodel.py +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/util.py +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/pyproject.toml +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/setup.cfg +0 -0
- {exoiris-0.18.0 → exoiris-0.20.0}/tests/test_binning.py +0 -0
|
@@ -5,12 +5,36 @@ All notable changes to ExoIris will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [
|
|
8
|
+
## [0.20.0] - 2025-11-19
|
|
9
9
|
|
|
10
10
|
### Added
|
|
11
|
+
- Added the ability to model star spot crossings. The spots are modeled as generalized Gaussians parameterized by their
|
|
12
|
+
center time, amplitude in a given reference wavelength, full width at half maximum (FWHM), spot temperature in Kelvin,
|
|
13
|
+
and spot shape. The spot amplitude along the wavelength is modeled using the theoretical BT-Settl spectra, the stellar
|
|
14
|
+
effective temperature, the spot temperature, and the reference wavelength in which the spot amplitude is measured.
|
|
15
|
+
- Added the ability to model the contamination from unocculted spots and faculae (the transit light source effect,
|
|
16
|
+
or TLSE).
|
|
17
|
+
- Included two new radius ratio interpolation options: "nearest" and "linear".
|
|
18
|
+
|
|
19
|
+
## [0.19.2] - 2025-09-12
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- Added a support for a free GP noise model. That is, the GP hyperparameters can be free parameters in the model.
|
|
24
|
+
However, this is somewhat slower than using the fixed GP model, since the GP needs to be computed for each model
|
|
25
|
+
evaluation.
|
|
26
|
+
- Added a ``ExoIris.plot_white_gp_predictions`` method to visualize the GP predictions for the white light curves.
|
|
27
|
+
|
|
28
|
+
### Improved
|
|
29
|
+
|
|
30
|
+
- Improved TSData fits io to make sure all the properties (such as the noise and bias groups) are saved and read properly.
|
|
31
|
+
- Fixed a white light curve fitting but where the error array was not filtered correctly.
|
|
32
|
+
- Made `TSData` to raise a `ValueError` if either the time or wavelength array contains any non-finite values.
|
|
11
33
|
|
|
12
34
|
### Changed
|
|
13
35
|
|
|
36
|
+
- Renamed `TSDataSet` to `TSDataGroup`
|
|
37
|
+
|
|
14
38
|
### Removed
|
|
15
39
|
|
|
16
40
|
## [0.18.0] - 2025-02-20
|
|
@@ -25,7 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
25
49
|
|
|
26
50
|
### Added
|
|
27
51
|
|
|
28
|
-
- Added support for masked data
|
|
52
|
+
- Added support for masked data with GP noise model.
|
|
29
53
|
- Added an option to set the GP hyperparameters for an individual data set.
|
|
30
54
|
- Added `white_times`, `white_fluxes`, `white_models`, and `white_errors` properties to `ExoIris` to access white ligth curve data.
|
|
31
55
|
|
|
@@ -42,7 +66,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
42
66
|
|
|
43
67
|
### Changed
|
|
44
68
|
- **Transit Mask Renaming:** Renamed the old `ootmask` attribute to `transit_mask` throughout the codebase for clarity. This change affects plotting, normalization, binning, and file I/O.
|
|
45
|
-
- **Method Renaming:** Renamed `calculate_ootmask` in the `
|
|
69
|
+
- **Method Renaming:** Renamed `calculate_ootmask` in the `TSDataGroup` class to `mask_transit` to reflect the updated naming convention.
|
|
46
70
|
- **Normalization Enhancements:** Updated normalization methods (`normalize_to_poly` and `normalize_to_median`) to utilize the new `transit_mask` and `mask` attributes, improving the reliability of baseline fits.
|
|
47
71
|
- **Cropping Flexibility:** Added an `inplace` parameter to both `crop_wavelength` and `crop_time` methods, allowing users to choose between modifying the existing data or returning a new cropped instance.
|
|
48
72
|
- **Likelihood Function Update:** Modified the `lnlike_normal` function in `TSLPF` to accept an additional `mask` parameter and process only valid data points during likelihood calculations.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ExoIris
|
|
3
|
+
Version: 0.20.0
|
|
4
|
+
Summary: Easy and robust exoplanet transmission spectroscopy.
|
|
5
|
+
Author-email: Hannu Parviainen <hannu@iac.es>
|
|
6
|
+
License: GPLv3
|
|
7
|
+
Project-URL: homepage, https://github.com/hpparvi/ExoIris
|
|
8
|
+
Keywords: astronomy,astrophysics,exoplanets
|
|
9
|
+
Classifier: Topic :: Scientific/Engineering
|
|
10
|
+
Classifier: Intended Audience :: Science/Research
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: pytransit>=2.6.15
|
|
20
|
+
Requires-Dist: ldtk>=1.8.5
|
|
21
|
+
Requires-Dist: numpy
|
|
22
|
+
Requires-Dist: scipy
|
|
23
|
+
Requires-Dist: numba
|
|
24
|
+
Requires-Dist: emcee
|
|
25
|
+
Requires-Dist: matplotlib
|
|
26
|
+
Requires-Dist: celerite2
|
|
27
|
+
Requires-Dist: pandas
|
|
28
|
+
Requires-Dist: xarray
|
|
29
|
+
Requires-Dist: seaborn
|
|
30
|
+
Requires-Dist: astropy
|
|
31
|
+
Requires-Dist: uncertainties
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
# ExoIris: Fast and Flexible Transmission Spectroscopy in Python
|
|
35
|
+
|
|
36
|
+
[](https://exoiris.readthedocs.io)
|
|
37
|
+

|
|
38
|
+
[](CODE_OF_CONDUCT.md)
|
|
39
|
+
[](http://www.gnu.org/licenses/gpl-3.0.html)
|
|
40
|
+
[](https://pypi.org/project/ExoIris/)
|
|
41
|
+
|
|
42
|
+
**ExoIris** is a Python package for modeling exoplanet transmission spectroscopy. ExoIris removes the typical
|
|
43
|
+
limitations of the two-step workflow by modeling the full two-dimensional spectroscopic transit time series *directly*.
|
|
44
|
+
It supports combining transmission spectroscopy datasets from multiple instruments observed in different epochs, yielding
|
|
45
|
+
self-consistent wavelength-independent and wavelength-dependent parameters, simplifying joint analyses, and delivering
|
|
46
|
+
results quickly.
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
50
|
+
## Why ExoIris?
|
|
51
|
+
|
|
52
|
+
Transmission spectroscopy is often done following a **two-step workflow**: (1) fit a white light curve to infer
|
|
53
|
+
wavelength-independent parameters; (2) fit each spectroscopic light curve independently, constrained by the white-light
|
|
54
|
+
solution. This split can introduce approximations and inconsistencies.
|
|
55
|
+
|
|
56
|
+
**ExoIris takes a different approach.** It models spectrophotometric time series *end-to-end*, enabling:
|
|
57
|
+
|
|
58
|
+
- Self-consistent inference of shared (wavelength-independent) and spectral (wavelength-dependent) parameters.
|
|
59
|
+
- **Joint** modeling of multiple datasets from different instruments and epochs.
|
|
60
|
+
- Accounting for **transit timing variations** and dataset-dependent offsets within a unified framework.
|
|
61
|
+
|
|
62
|
+
This design is a natural fit for **JWST-class** data, where correlated noise, multi-epoch observations, and
|
|
63
|
+
cross-instrument combinations are the norm.
|
|
64
|
+
|
|
65
|
+
## Documentation
|
|
66
|
+
|
|
67
|
+
Full documentation and tutorials: <https://exoiris.readthedocs.io>
|
|
68
|
+
|
|
69
|
+
## Installation
|
|
70
|
+
|
|
71
|
+
Install from PyPI:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install exoiris
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Latest development version:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
git clone https://github.com/hpparvi/ExoIris.git
|
|
81
|
+
cd ExoIris
|
|
82
|
+
pip install -e .
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
ExoIris supports Python 3.9+. See the docs for dependency details and optional extras.
|
|
86
|
+
|
|
87
|
+
## Key Features
|
|
88
|
+
|
|
89
|
+
- **Direct modelling of spectroscopic transit time series**
|
|
90
|
+
Built on PyTransit’s `TSModel`, optimised for transmission spectroscopy; scales to hundreds–thousands of light curves simultaneously.
|
|
91
|
+
|
|
92
|
+
- **Flexible limb darkening**
|
|
93
|
+
Use standard analytical laws (quadratic, power-2, non-linear), numerical intensity profiles from stellar atmosphere models, or user-defined radially symmetric functions.
|
|
94
|
+
|
|
95
|
+
- **Robust noise treatment**
|
|
96
|
+
Choose white noise or **time-correlated** noise via a Gaussian Process likelihood, without changing the overall workflow.
|
|
97
|
+
|
|
98
|
+
- **Full control of spectral resolution**
|
|
99
|
+
The transmission spectrum is represented as a cubic spline with user-defined knots, allowing variable resolution across wavelength.
|
|
100
|
+
|
|
101
|
+
- **Reproducible, incremental workflows**
|
|
102
|
+
Save and reload models to refine a low-resolution run into a high-resolution analysis seamlessly.
|
|
103
|
+
|
|
104
|
+
- **Joint multi-dataset analyses**
|
|
105
|
+
Combine instruments and epochs in one fit, with support for transit timing variations and dataset-specific systematics and offsets.
|
|
106
|
+
|
|
107
|
+
## Performance
|
|
108
|
+
|
|
109
|
+
ExoIris is designed for speed and stability:
|
|
110
|
+
|
|
111
|
+
- A transmission spectroscopy analysis of a single JWST/NIRISS dataset at **R ≈ 100** typically runs in **3–5 minutes**
|
|
112
|
+
assuming white noise, or **5–15 minutes** with a GP noise model, on a standard desktop CPU.
|
|
113
|
+
- A high-resolution analysis of the JWST/NIRISS **WASP-39 b** dataset (~3800 spectroscopic light curves; see Feinstein
|
|
114
|
+
et al. 2023) can be optimised and sampled in about **1.5 hours** on an AMD Ryzen 7 5800X (8 cores, ~3-year-old desktop).
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
© 2025 Hannu Parviainen
|
exoiris-0.20.0/PKG-INFO
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ExoIris
|
|
3
|
+
Version: 0.20.0
|
|
4
|
+
Summary: Easy and robust exoplanet transmission spectroscopy.
|
|
5
|
+
Author-email: Hannu Parviainen <hannu@iac.es>
|
|
6
|
+
License: GPLv3
|
|
7
|
+
Project-URL: homepage, https://github.com/hpparvi/ExoIris
|
|
8
|
+
Keywords: astronomy,astrophysics,exoplanets
|
|
9
|
+
Classifier: Topic :: Scientific/Engineering
|
|
10
|
+
Classifier: Intended Audience :: Science/Research
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: pytransit>=2.6.15
|
|
20
|
+
Requires-Dist: ldtk>=1.8.5
|
|
21
|
+
Requires-Dist: numpy
|
|
22
|
+
Requires-Dist: scipy
|
|
23
|
+
Requires-Dist: numba
|
|
24
|
+
Requires-Dist: emcee
|
|
25
|
+
Requires-Dist: matplotlib
|
|
26
|
+
Requires-Dist: celerite2
|
|
27
|
+
Requires-Dist: pandas
|
|
28
|
+
Requires-Dist: xarray
|
|
29
|
+
Requires-Dist: seaborn
|
|
30
|
+
Requires-Dist: astropy
|
|
31
|
+
Requires-Dist: uncertainties
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
# ExoIris: Fast and Flexible Transmission Spectroscopy in Python
|
|
35
|
+
|
|
36
|
+
[](https://exoiris.readthedocs.io)
|
|
37
|
+

|
|
38
|
+
[](CODE_OF_CONDUCT.md)
|
|
39
|
+
[](http://www.gnu.org/licenses/gpl-3.0.html)
|
|
40
|
+
[](https://pypi.org/project/ExoIris/)
|
|
41
|
+
|
|
42
|
+
**ExoIris** is a Python package for modeling exoplanet transmission spectroscopy. ExoIris removes the typical
|
|
43
|
+
limitations of the two-step workflow by modeling the full two-dimensional spectroscopic transit time series *directly*.
|
|
44
|
+
It supports combining transmission spectroscopy datasets from multiple instruments observed in different epochs, yielding
|
|
45
|
+
self-consistent wavelength-independent and wavelength-dependent parameters, simplifying joint analyses, and delivering
|
|
46
|
+
results quickly.
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
50
|
+
## Why ExoIris?
|
|
51
|
+
|
|
52
|
+
Transmission spectroscopy is often done following a **two-step workflow**: (1) fit a white light curve to infer
|
|
53
|
+
wavelength-independent parameters; (2) fit each spectroscopic light curve independently, constrained by the white-light
|
|
54
|
+
solution. This split can introduce approximations and inconsistencies.
|
|
55
|
+
|
|
56
|
+
**ExoIris takes a different approach.** It models spectrophotometric time series *end-to-end*, enabling:
|
|
57
|
+
|
|
58
|
+
- Self-consistent inference of shared (wavelength-independent) and spectral (wavelength-dependent) parameters.
|
|
59
|
+
- **Joint** modeling of multiple datasets from different instruments and epochs.
|
|
60
|
+
- Accounting for **transit timing variations** and dataset-dependent offsets within a unified framework.
|
|
61
|
+
|
|
62
|
+
This design is a natural fit for **JWST-class** data, where correlated noise, multi-epoch observations, and
|
|
63
|
+
cross-instrument combinations are the norm.
|
|
64
|
+
|
|
65
|
+
## Documentation
|
|
66
|
+
|
|
67
|
+
Full documentation and tutorials: <https://exoiris.readthedocs.io>
|
|
68
|
+
|
|
69
|
+
## Installation
|
|
70
|
+
|
|
71
|
+
Install from PyPI:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install exoiris
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Latest development version:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
git clone https://github.com/hpparvi/ExoIris.git
|
|
81
|
+
cd ExoIris
|
|
82
|
+
pip install -e .
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
ExoIris supports Python 3.9+. See the docs for dependency details and optional extras.
|
|
86
|
+
|
|
87
|
+
## Key Features
|
|
88
|
+
|
|
89
|
+
- **Direct modelling of spectroscopic transit time series**
|
|
90
|
+
Built on PyTransit’s `TSModel`, optimised for transmission spectroscopy; scales to hundreds–thousands of light curves simultaneously.
|
|
91
|
+
|
|
92
|
+
- **Flexible limb darkening**
|
|
93
|
+
Use standard analytical laws (quadratic, power-2, non-linear), numerical intensity profiles from stellar atmosphere models, or user-defined radially symmetric functions.
|
|
94
|
+
|
|
95
|
+
- **Robust noise treatment**
|
|
96
|
+
Choose white noise or **time-correlated** noise via a Gaussian Process likelihood, without changing the overall workflow.
|
|
97
|
+
|
|
98
|
+
- **Full control of spectral resolution**
|
|
99
|
+
The transmission spectrum is represented as a cubic spline with user-defined knots, allowing variable resolution across wavelength.
|
|
100
|
+
|
|
101
|
+
- **Reproducible, incremental workflows**
|
|
102
|
+
Save and reload models to refine a low-resolution run into a high-resolution analysis seamlessly.
|
|
103
|
+
|
|
104
|
+
- **Joint multi-dataset analyses**
|
|
105
|
+
Combine instruments and epochs in one fit, with support for transit timing variations and dataset-specific systematics and offsets.
|
|
106
|
+
|
|
107
|
+
## Performance
|
|
108
|
+
|
|
109
|
+
ExoIris is designed for speed and stability:
|
|
110
|
+
|
|
111
|
+
- A transmission spectroscopy analysis of a single JWST/NIRISS dataset at **R ≈ 100** typically runs in **3–5 minutes**
|
|
112
|
+
assuming white noise, or **5–15 minutes** with a GP noise model, on a standard desktop CPU.
|
|
113
|
+
- A high-resolution analysis of the JWST/NIRISS **WASP-39 b** dataset (~3800 spectroscopic light curves; see Feinstein
|
|
114
|
+
et al. 2023) can be optimised and sampled in about **1.5 hours** on an AMD Ryzen 7 5800X (8 cores, ~3-year-old desktop).
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
© 2025 Hannu Parviainen
|
exoiris-0.20.0/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# ExoIris: Fast and Flexible Transmission Spectroscopy in Python
|
|
2
|
+
|
|
3
|
+
[](https://exoiris.readthedocs.io)
|
|
4
|
+

|
|
5
|
+
[](CODE_OF_CONDUCT.md)
|
|
6
|
+
[](http://www.gnu.org/licenses/gpl-3.0.html)
|
|
7
|
+
[](https://pypi.org/project/ExoIris/)
|
|
8
|
+
|
|
9
|
+
**ExoIris** is a Python package for modeling exoplanet transmission spectroscopy. ExoIris removes the typical
|
|
10
|
+
limitations of the two-step workflow by modeling the full two-dimensional spectroscopic transit time series *directly*.
|
|
11
|
+
It supports combining transmission spectroscopy datasets from multiple instruments observed in different epochs, yielding
|
|
12
|
+
self-consistent wavelength-independent and wavelength-dependent parameters, simplifying joint analyses, and delivering
|
|
13
|
+
results quickly.
|
|
14
|
+
|
|
15
|
+

|
|
16
|
+
|
|
17
|
+
## Why ExoIris?
|
|
18
|
+
|
|
19
|
+
Transmission spectroscopy is often done following a **two-step workflow**: (1) fit a white light curve to infer
|
|
20
|
+
wavelength-independent parameters; (2) fit each spectroscopic light curve independently, constrained by the white-light
|
|
21
|
+
solution. This split can introduce approximations and inconsistencies.
|
|
22
|
+
|
|
23
|
+
**ExoIris takes a different approach.** It models spectrophotometric time series *end-to-end*, enabling:
|
|
24
|
+
|
|
25
|
+
- Self-consistent inference of shared (wavelength-independent) and spectral (wavelength-dependent) parameters.
|
|
26
|
+
- **Joint** modeling of multiple datasets from different instruments and epochs.
|
|
27
|
+
- Accounting for **transit timing variations** and dataset-dependent offsets within a unified framework.
|
|
28
|
+
|
|
29
|
+
This design is a natural fit for **JWST-class** data, where correlated noise, multi-epoch observations, and
|
|
30
|
+
cross-instrument combinations are the norm.
|
|
31
|
+
|
|
32
|
+
## Documentation
|
|
33
|
+
|
|
34
|
+
Full documentation and tutorials: <https://exoiris.readthedocs.io>
|
|
35
|
+
|
|
36
|
+
## Installation
|
|
37
|
+
|
|
38
|
+
Install from PyPI:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pip install exoiris
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Latest development version:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
git clone https://github.com/hpparvi/ExoIris.git
|
|
48
|
+
cd ExoIris
|
|
49
|
+
pip install -e .
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
ExoIris supports Python 3.9+. See the docs for dependency details and optional extras.
|
|
53
|
+
|
|
54
|
+
## Key Features
|
|
55
|
+
|
|
56
|
+
- **Direct modelling of spectroscopic transit time series**
|
|
57
|
+
Built on PyTransit’s `TSModel`, optimised for transmission spectroscopy; scales to hundreds–thousands of light curves simultaneously.
|
|
58
|
+
|
|
59
|
+
- **Flexible limb darkening**
|
|
60
|
+
Use standard analytical laws (quadratic, power-2, non-linear), numerical intensity profiles from stellar atmosphere models, or user-defined radially symmetric functions.
|
|
61
|
+
|
|
62
|
+
- **Robust noise treatment**
|
|
63
|
+
Choose white noise or **time-correlated** noise via a Gaussian Process likelihood, without changing the overall workflow.
|
|
64
|
+
|
|
65
|
+
- **Full control of spectral resolution**
|
|
66
|
+
The transmission spectrum is represented as a cubic spline with user-defined knots, allowing variable resolution across wavelength.
|
|
67
|
+
|
|
68
|
+
- **Reproducible, incremental workflows**
|
|
69
|
+
Save and reload models to refine a low-resolution run into a high-resolution analysis seamlessly.
|
|
70
|
+
|
|
71
|
+
- **Joint multi-dataset analyses**
|
|
72
|
+
Combine instruments and epochs in one fit, with support for transit timing variations and dataset-specific systematics and offsets.
|
|
73
|
+
|
|
74
|
+
## Performance
|
|
75
|
+
|
|
76
|
+
ExoIris is designed for speed and stability:
|
|
77
|
+
|
|
78
|
+
- A transmission spectroscopy analysis of a single JWST/NIRISS dataset at **R ≈ 100** typically runs in **3–5 minutes**
|
|
79
|
+
assuming white noise, or **5–15 minutes** with a GP noise model, on a standard desktop CPU.
|
|
80
|
+
- A high-resolution analysis of the JWST/NIRISS **WASP-39 b** dataset (~3800 spectroscopic light curves; see Feinstein
|
|
81
|
+
et al. 2023) can be optimised and sampled in about **1.5 hours** on an AMD Ryzen 7 5800X (8 cores, ~3-year-old desktop).
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
© 2025 Hannu Parviainen
|
|
@@ -11,7 +11,7 @@ Constructor
|
|
|
11
11
|
-----------
|
|
12
12
|
|
|
13
13
|
The `ExoIris` class is initialized by providing a name for the analysis, selecting a limb darkening model, and passing the
|
|
14
|
-
spectroscopic light curves as either a `~exoiris.tsdata.TSData` or `~exoiris.tsdata.
|
|
14
|
+
spectroscopic light curves as either a `~exoiris.tsdata.TSData` or `~exoiris.tsdata.TSDataGroup` object.
|
|
15
15
|
Additional parameters can also be supplied to the initializer to refine the analysis, although these can be set
|
|
16
16
|
later if preferred.
|
|
17
17
|
|
|
@@ -20,11 +20,11 @@ RoadRunner transit model (`pytransit.RRModel`). The RoadRunner model is an advan
|
|
|
20
20
|
efficiently use any radially symmetric function to model stellar limb darkening, as described in
|
|
21
21
|
`Parviainen (2020) <https://ui.adsabs.harvard.edu/link_gateway/2020MNRAS.499.1633P/PUB_HTML>`_.
|
|
22
22
|
|
|
23
|
-
Since
|
|
24
|
-
The
|
|
23
|
+
Since `~pytransit.TSModel` is based on `~pytransit.RRModel`, it offers the same flexibility for modeling stellar limb
|
|
24
|
+
darkening. The ``ldmodel`` argument can be one of the following:
|
|
25
25
|
|
|
26
|
-
- a string representing one of the built-in limb darkening models supported by
|
|
27
|
-
|
|
26
|
+
- a string representing one of the built-in limb darkening models supported by ``RRModel``, such as
|
|
27
|
+
``power-2`` or ``quadratic``,
|
|
28
28
|
- an object that is a subclass of the `pytransit.models.ldmodel.LDModel` limb darkening model class,
|
|
29
29
|
- a tuple of two functions, with the first returning the limb darkening profile as a function of
|
|
30
30
|
:math:`\mu` and the second returning its integral over the stellar disk, or
|
|
@@ -44,7 +44,6 @@ An `ExoIris` instance can be saved to a FITS file using the `ExoIris.save` metho
|
|
|
44
44
|
optimiser state, and MCMC sampler state, allowing the model to be fully recreated later using the `load_model`
|
|
45
45
|
function.
|
|
46
46
|
|
|
47
|
-
|
|
48
47
|
.. autosummary::
|
|
49
48
|
:toctree: api/
|
|
50
49
|
|
|
@@ -59,19 +58,27 @@ where a saved low-resolution analysis can be loaded as a new analysis using the
|
|
|
59
58
|
like the radius ratio and limb darkening knots can be adjusted to increase the resolution of the estimated
|
|
60
59
|
transmission spectrum, and even the observational data can be changed to improve the data resolution.
|
|
61
60
|
|
|
62
|
-
|
|
63
61
|
.. autosummary::
|
|
64
62
|
:toctree: api/
|
|
65
63
|
|
|
66
64
|
ExoIris.set_data
|
|
67
65
|
ExoIris.set_radius_ratio_knots
|
|
68
66
|
ExoIris.add_radius_ratio_knots
|
|
67
|
+
ExoIris.create_dense_radius_ratio_block
|
|
68
|
+
ExoIris.plot_setup
|
|
69
|
+
|
|
70
|
+
Parameterization and priors
|
|
71
|
+
---------------------------
|
|
72
|
+
|
|
73
|
+
.. autosummary::
|
|
74
|
+
:toctree: api/
|
|
75
|
+
|
|
76
|
+
ExoIris.set_prior
|
|
77
|
+
ExoIris.set_baseline_prior
|
|
69
78
|
ExoIris.set_ldtk_prior
|
|
70
79
|
ExoIris.set_radius_ratio_prior
|
|
71
|
-
ExoIris.plot_setup
|
|
72
80
|
ExoIris.print_parameters
|
|
73
81
|
|
|
74
|
-
|
|
75
82
|
Noise model setup
|
|
76
83
|
-----------------
|
|
77
84
|
|
|
@@ -89,6 +96,7 @@ via the `ExoIris.gp` attribute.
|
|
|
89
96
|
ExoIris.set_gp_hyperparameters
|
|
90
97
|
ExoIris.optimize_gp_hyperparameters
|
|
91
98
|
ExoIris.gp
|
|
99
|
+
ExoIris.plot_white_gp_predictions
|
|
92
100
|
|
|
93
101
|
|
|
94
102
|
First steps
|
|
@@ -159,4 +167,32 @@ Utility methods
|
|
|
159
167
|
.. autosummary::
|
|
160
168
|
:toctree: api/
|
|
161
169
|
|
|
170
|
+
ExoIris.reset
|
|
162
171
|
ExoIris.create_initial_population
|
|
172
|
+
ExoIris.lnposterior
|
|
173
|
+
|
|
174
|
+
Properties
|
|
175
|
+
----------
|
|
176
|
+
|
|
177
|
+
The following properties expose key internal states and parameters of the analysis:
|
|
178
|
+
|
|
179
|
+
.. autosummary::
|
|
180
|
+
:toctree: api/
|
|
181
|
+
|
|
182
|
+
ExoIris.name
|
|
183
|
+
ExoIris.data
|
|
184
|
+
ExoIris.k_knots
|
|
185
|
+
ExoIris.ndim
|
|
186
|
+
ExoIris.nk
|
|
187
|
+
ExoIris.nldp
|
|
188
|
+
ExoIris.npb
|
|
189
|
+
ExoIris.ldmodel
|
|
190
|
+
ExoIris.sampler
|
|
191
|
+
ExoIris.optimizer
|
|
192
|
+
ExoIris.optimizer_population
|
|
193
|
+
ExoIris.mcmc_chains
|
|
194
|
+
ExoIris.white_times
|
|
195
|
+
ExoIris.white_fluxes
|
|
196
|
+
ExoIris.white_models
|
|
197
|
+
ExoIris.white_errors
|
|
198
|
+
ExoIris.ps
|
|
@@ -4,9 +4,10 @@ Data handling
|
|
|
4
4
|
=============
|
|
5
5
|
.. currentmodule:: exoiris.tsdata
|
|
6
6
|
|
|
7
|
-
The spectroscopic light curves are given to ExoIris as a `TSData` (Transmission Spectroscopy Data) or `
|
|
8
|
-
object. `TSData` is a utility class that provides methods for data cleanup, binning, and cropping,
|
|
9
|
-
is a container class that can
|
|
7
|
+
The spectroscopic light curves are given to ExoIris as a `TSData` (Transmission Spectroscopy Data) or `TSDataGroup`
|
|
8
|
+
object. `TSData` is a utility class that provides methods for data cleanup, binning, and cropping, and uncertainty
|
|
9
|
+
estimation, while `TSDataGroup` is a container class that can hold multiple `TSData` objects and provides aggregate
|
|
10
|
+
properties and methods.
|
|
10
11
|
|
|
11
12
|
Main classes
|
|
12
13
|
------------
|
|
@@ -15,7 +16,7 @@ Main classes
|
|
|
15
16
|
:toctree: api/
|
|
16
17
|
|
|
17
18
|
TSData
|
|
18
|
-
|
|
19
|
+
TSDataGroup
|
|
19
20
|
|
|
20
21
|
Data wrangling
|
|
21
22
|
--------------
|
|
@@ -32,6 +33,14 @@ Data wrangling
|
|
|
32
33
|
TSData.normalize_to_poly
|
|
33
34
|
TSData.partition_time
|
|
34
35
|
|
|
36
|
+
Uncertainty estimation
|
|
37
|
+
----------------------
|
|
38
|
+
|
|
39
|
+
.. autosummary::
|
|
40
|
+
:toctree: api/
|
|
41
|
+
|
|
42
|
+
TSData.estimate_average_uncertainties
|
|
43
|
+
|
|
35
44
|
Masking
|
|
36
45
|
-------
|
|
37
46
|
|
|
@@ -39,6 +48,7 @@ Masking
|
|
|
39
48
|
:toctree: api/
|
|
40
49
|
|
|
41
50
|
TSData.mask_transit
|
|
51
|
+
TSDataGroup.mask_transit
|
|
42
52
|
|
|
43
53
|
I/O
|
|
44
54
|
---
|
|
@@ -48,8 +58,8 @@ I/O
|
|
|
48
58
|
|
|
49
59
|
TSData.export_fits
|
|
50
60
|
TSData.import_fits
|
|
51
|
-
|
|
52
|
-
|
|
61
|
+
TSDataGroup.export_fits
|
|
62
|
+
TSDataGroup.import_fits
|
|
53
63
|
|
|
54
64
|
|
|
55
65
|
Plotting
|
|
@@ -60,4 +70,4 @@ Plotting
|
|
|
60
70
|
|
|
61
71
|
TSData.plot
|
|
62
72
|
TSData.plot_white
|
|
63
|
-
|
|
73
|
+
TSDataGroup.plot
|
|
@@ -49,4 +49,5 @@ intersphinx_mapping = {'python': ('https://docs.python.org/3/', None),
|
|
|
49
49
|
'matplotlib': ('https://matplotlib.org', None),
|
|
50
50
|
'pandas': ('https://pandas.pydata.org/pandas-docs/stable/', None),
|
|
51
51
|
'astropy': ('https://docs.astropy.org/en/stable/', None),
|
|
52
|
-
'uncertainties': ('https://uncertainties.readthedocs.io/en/latest/', None)
|
|
52
|
+
'uncertainties': ('https://uncertainties.readthedocs.io/en/latest/', None),
|
|
53
|
+
'pytransit': ('https://pytransit.readthedocs.io/en/latest/', None)}
|