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.
Files changed (66) hide show
  1. {exoiris-0.18.0 → exoiris-0.20.0}/CHANGELOG.md +27 -3
  2. exoiris-0.20.0/ExoIris.egg-info/PKG-INFO +118 -0
  3. {exoiris-0.18.0 → exoiris-0.20.0}/ExoIris.egg-info/SOURCES.txt +1 -0
  4. {exoiris-0.18.0 → exoiris-0.20.0}/ExoIris.egg-info/requires.txt +1 -1
  5. exoiris-0.20.0/PKG-INFO +118 -0
  6. exoiris-0.20.0/README.md +85 -0
  7. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/api/exoiris.rst +45 -9
  8. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/api/tsdata.rst +17 -7
  9. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/conf.py +2 -1
  10. exoiris-0.20.0/doc/source/examples/e01/01a_not_so_short_intro.ipynb +1366 -0
  11. exoiris-0.20.0/doc/source/examples/e01/02_increasing_knot_resolution.ipynb +472 -0
  12. exoiris-0.20.0/doc/source/examples/e01/03_increasing_data_resolution.ipynb +589 -0
  13. exoiris-0.20.0/doc/source/examples/e01/04_gaussian_processes.ipynb +567 -0
  14. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/05a_ldtkldm.ipynb +1 -1
  15. exoiris-0.20.0/doc/source/examples/e01/example1.png +0 -0
  16. exoiris-0.20.0/doc/source/examples/e01/plot_1.ipynb +165 -0
  17. exoiris-0.20.0/doc/source/examples/setup_multiprocessing.py +17 -0
  18. {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/__init__.py +1 -1
  19. {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/exoiris.py +251 -102
  20. {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/ldtkld.py +3 -3
  21. exoiris-0.20.0/exoiris/spotmodel.py +176 -0
  22. {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/tsdata.py +173 -89
  23. {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/tslpf.py +105 -34
  24. {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/wlpf.py +74 -19
  25. {exoiris-0.18.0 → exoiris-0.20.0}/requirements.txt +1 -1
  26. exoiris-0.18.0/ExoIris.egg-info/PKG-INFO +0 -80
  27. exoiris-0.18.0/PKG-INFO +0 -80
  28. exoiris-0.18.0/README.md +0 -48
  29. exoiris-0.18.0/doc/source/examples/e01/01a_not_so_short_intro.ipynb +0 -1556
  30. exoiris-0.18.0/doc/source/examples/e01/02_increasing_knot_resolution.ipynb +0 -483
  31. exoiris-0.18.0/doc/source/examples/e01/03_increasing_data_resolution.ipynb +0 -586
  32. exoiris-0.18.0/doc/source/examples/e01/04_gaussian_processes.ipynb +0 -565
  33. exoiris-0.18.0/doc/source/examples/e01/example1.png +0 -0
  34. exoiris-0.18.0/doc/source/examples/e01/plot_1.ipynb +0 -424
  35. exoiris-0.18.0/doc/source/examples/setup_multiprocessing.py +0 -10
  36. {exoiris-0.18.0 → exoiris-0.20.0}/.github/workflows/python-package.yml +0 -0
  37. {exoiris-0.18.0 → exoiris-0.20.0}/.gitignore +0 -0
  38. {exoiris-0.18.0 → exoiris-0.20.0}/.readthedocs.yaml +0 -0
  39. {exoiris-0.18.0 → exoiris-0.20.0}/CODE_OF_CONDUCT.md +0 -0
  40. {exoiris-0.18.0 → exoiris-0.20.0}/ExoIris.egg-info/dependency_links.txt +0 -0
  41. {exoiris-0.18.0 → exoiris-0.20.0}/ExoIris.egg-info/top_level.txt +0 -0
  42. {exoiris-0.18.0 → exoiris-0.20.0}/LICENSE +0 -0
  43. {exoiris-0.18.0 → exoiris-0.20.0}/doc/Makefile +0 -0
  44. {exoiris-0.18.0 → exoiris-0.20.0}/doc/make.bat +0 -0
  45. {exoiris-0.18.0 → exoiris-0.20.0}/doc/requirements.txt +0 -0
  46. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/_static/css/custom.css +0 -0
  47. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/api/binning.rst +0 -0
  48. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/01b_short_intro.ipynb +0 -0
  49. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/A2_full_data_resolution.ipynb +0 -0
  50. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/appendix_1_data_preparation.ipynb +0 -0
  51. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/data/README.txt +0 -0
  52. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/data/nirHiss_order_1.h5 +0 -0
  53. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/e01/data/nirHiss_order_2.h5 +0 -0
  54. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/figures.ipynb +0 -0
  55. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/friendly_introduction.ipynb +0 -0
  56. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/index.rst +0 -0
  57. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/examples/k_knot_example.svg +0 -0
  58. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/index.rst +0 -0
  59. {exoiris-0.18.0 → exoiris-0.20.0}/doc/source/install.rst +0 -0
  60. {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/binning.py +0 -0
  61. {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/ephemeris.py +0 -0
  62. {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/tsmodel.py +0 -0
  63. {exoiris-0.18.0 → exoiris-0.20.0}/exoiris/util.py +0 -0
  64. {exoiris-0.18.0 → exoiris-0.20.0}/pyproject.toml +0 -0
  65. {exoiris-0.18.0 → exoiris-0.20.0}/setup.cfg +0 -0
  66. {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
- ## [Unreleased]
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 support with GP noise model.
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 `TSDataSet` class to `mask_transit` to reflect the updated naming convention.
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
+ [![Docs](https://readthedocs.org/projects/exoiris/badge/)](https://exoiris.readthedocs.io)
37
+ ![Python package](https://github.com/hpparvi/ExoIris/actions/workflows/python-package.yml/badge.svg)
38
+ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.0-4baaaa.svg)](CODE_OF_CONDUCT.md)
39
+ [![Licence](http://img.shields.io/badge/license-GPLv3-blue.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html)
40
+ [![PyPI version](https://badge.fury.io/py/exoiris.svg)](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
+ ![](doc/source/examples/e01/example1.png)
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
@@ -45,6 +45,7 @@ exoiris/binning.py
45
45
  exoiris/ephemeris.py
46
46
  exoiris/exoiris.py
47
47
  exoiris/ldtkld.py
48
+ exoiris/spotmodel.py
48
49
  exoiris/tsdata.py
49
50
  exoiris/tslpf.py
50
51
  exoiris/tsmodel.py
@@ -1,4 +1,4 @@
1
- pytransit>=2.6.11
1
+ pytransit>=2.6.15
2
2
  ldtk>=1.8.5
3
3
  numpy
4
4
  scipy
@@ -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
+ [![Docs](https://readthedocs.org/projects/exoiris/badge/)](https://exoiris.readthedocs.io)
37
+ ![Python package](https://github.com/hpparvi/ExoIris/actions/workflows/python-package.yml/badge.svg)
38
+ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.0-4baaaa.svg)](CODE_OF_CONDUCT.md)
39
+ [![Licence](http://img.shields.io/badge/license-GPLv3-blue.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html)
40
+ [![PyPI version](https://badge.fury.io/py/exoiris.svg)](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
+ ![](doc/source/examples/e01/example1.png)
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
@@ -0,0 +1,85 @@
1
+ # ExoIris: Fast and Flexible Transmission Spectroscopy in Python
2
+
3
+ [![Docs](https://readthedocs.org/projects/exoiris/badge/)](https://exoiris.readthedocs.io)
4
+ ![Python package](https://github.com/hpparvi/ExoIris/actions/workflows/python-package.yml/badge.svg)
5
+ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.0-4baaaa.svg)](CODE_OF_CONDUCT.md)
6
+ [![Licence](http://img.shields.io/badge/license-GPLv3-blue.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html)
7
+ [![PyPI version](https://badge.fury.io/py/exoiris.svg)](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
+ ![](doc/source/examples/e01/example1.png)
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.TSDataSet` object.
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 `TSModel` is based on `RRModel`, it offers the same flexibility for modeling stellar limb darkening.
24
- The `ldmodel` argument can be one of the following:
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 `RRModel`, such as
27
- `power-2` or `quadratic`,
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 `TSDataSet`
8
- object. `TSData` is a utility class that provides methods for data cleanup, binning, and cropping, while `TSDataSet`
9
- is a container class that can contain many `TSData` objects.
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
- TSDataSet
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
- TSDataSet.export_fits
52
- TSDataSet.import_fits
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
- TSDataSet.plot
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)}