PyTransit 2.9.3__tar.gz → 2.10.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.
- {pytransit-2.9.3 → pytransit-2.10.0}/CHANGELOG.md +11 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/PKG-INFO +1 -1
- {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/PKG-INFO +1 -1
- {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/SOURCES.txt +2 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/scm_file_list.json +2 -0
- pytransit-2.10.0/PyTransit.egg-info/scm_version.json +8 -0
- pytransit-2.10.0/docs/source/_figures/tsmodel.py +189 -0
- pytransit-2.10.0/docs/source/features/roadrunner.rst +193 -0
- pytransit-2.10.0/docs/source/features/tsmodel.rst +105 -0
- pytransit-2.10.0/docs/source/models/roadrunner.rst +201 -0
- pytransit-2.10.0/docs/source/models/tsmodel.rst +194 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/_version.py +3 -3
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/common.py +95 -13
- pytransit-2.10.0/pytransit/models/roadrunner/model_trspec.py +154 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/tsmodel.py +2 -1
- pytransit-2.10.0/tests/test_tsmodel.py +113 -0
- pytransit-2.9.3/PyTransit.egg-info/scm_version.json +0 -8
- pytransit-2.9.3/docs/source/features/roadrunner.rst +0 -297
- pytransit-2.9.3/docs/source/features/tsmodel.rst +0 -30
- pytransit-2.9.3/docs/source/models/roadrunner.rst +0 -96
- pytransit-2.9.3/docs/source/models/tsmodel.rst +0 -76
- pytransit-2.9.3/pytransit/models/roadrunner/model_trspec.py +0 -184
- {pytransit-2.9.3 → pytransit-2.10.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/.github/workflows/python-package.yml +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/.github/workflows/python-publish.yml +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/.gitignore +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/.readthedocs.yaml +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/.travis.yml +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/CITATIONS.bib +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/CODE_OF_CONDUCT.md +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/LICENSE +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/MANIFEST.in +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/dependency_links.txt +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/requires.txt +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/top_level.txt +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/README.md +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/_config.yml +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/Makefile +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/requirements.txt +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/_figures/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/_figures/dataset_arrays.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/_figures/highlights.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/_figures/roadrunner.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/_static/.gitkeep +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/api/deprecated.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/api/index.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/api/limb_darkening.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/api/transitmodel.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_1.png +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_1.svg +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_2.png +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_2.svg +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_3.png +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_3.svg +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/conf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/contamination.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/features/chromosphere.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/features/gdmodel.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/features/index.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/features/opmodel.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/data_setup.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/evaluation.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/index.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/interface.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/limb_darkening.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/opencl.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/highlights.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/index.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/installation.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/io.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/chromosphere.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/eclipse.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/gdmodel.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/general.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/index.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/opencl.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/opmodel.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/qpower2.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/quadratic.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/uniform.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/models/roadrunner/common.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/models/roadrunner/roadrunner_model_example_1.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/models/roadrunner/roadrunner_model_example_2.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/models/roadrunner/roadrunner_model_example_3.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/models/roadrunner/roadrunner_model_theory.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/quickstart.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/stars.rst +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/001_simple_broadband_parameter_estimation.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/01_broadband_parameter_estimation.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/A1_impact_parameter_accuracy.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/A2_Supersampling.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/2024_m_dwarf_host_example_plots.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/2024_m_dwarf_host_example_simulations.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/contamination_1_black_body_model.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/contamination_2_physical_model.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/contamination_3_comparison.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/example_1a.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/example_1b.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/example_2a.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/example_2b.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/src/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/src/blendlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/src/core.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/src/mocklc.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/src/plotting.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/core.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/data/obs_data.fits +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_chromosphere_model.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_eclipse_model.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_qpower2_model.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_qpower2_opencl_model.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_quadratic_model.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_uniform_model.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/model_example_1.png +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/oblate_planet_example/figures.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/oblate_planet_example/opmodel_example_1.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/oblate_planet_example/opmodel_geometry.pdf +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/osmodel_1.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/osmodel_example_1.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/osmodel_visualization_example.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/roadrunner/common.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/roadrunner/tsmodel_example_1.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/tess_examples/WASP-4b.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/tess_examples/data/tess2018234235059-s0002-0000000402026209-0121-s_lc.fits +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/tess_examples/data/tess2019032160000-s0008-0000000413248763-0136-s_lc.fits +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/tess_examples/data/wasp_4b_transit_times.csv +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/tsmodel/test_accuracy.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/ttv_model_example.ipynb +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/notes/opencl-rrmodel-pt3-migration.md +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pyproject.toml +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/contamination.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/data/spectra.h5 +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/data/transmission.nc +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/filter.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/instrument.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/plotting.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/limb_darkening.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/baselines/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/baselines/legendrebaseline.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/baselines/linearbaseline.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/baselines/lstsqbaseline.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/cntlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/eclipselpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/celeriteloglikelihood.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/clloglikelihood.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/fmcloglikelihood.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/logisticloglikelihood.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/multiceleriteloglikelihood.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/wnloglikelihood.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/logposteriorfunction.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/lpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/mclpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/mptlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/ocllpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/ocltdvlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/oclttvlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/phasecurvelpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/rvlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tdvlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/ctesslpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/tessttvlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/tgclpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/tgcmplpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/tmpclpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tesslpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tessoclttvlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/transitanalysis.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/transitlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/ttvlpf.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/_deprecation.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/eclipse_model.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/gdmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/general.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ldmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ldtkldm.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/evaluation.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/exponential.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/general.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/linear.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/logarithmic.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/nonlinear.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/power_2.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/quadratic.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/quadratic_tri.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/square_root.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/uniform.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ma_chromosphere.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ma_quadratic.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ma_quadratic_cl.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ma_uniform.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ma_uniform_cl.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/new_eclipse_model.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/gdmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/general_nb.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/ldmodels.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/ldtkldm.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/ma_chromosphere_nb.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/ma_quadratic_nb.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/ma_uniform_nb.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/phasecurves.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/qpower2_nb.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/spmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/udmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/opencl/ma_quadratic.cl +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/opencl/ma_uniform.cl +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/opencl/orbits.cl +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/opencl/qpower2.cl +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/opencltransitmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/osmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/qpower2.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/qpower2_cl.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/ecintersection.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/esmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/model_eclipse.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/model_ecspec.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/model_full.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/model_simple.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/opmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/opmodel_full.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/rrmodel.cl +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/rrmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/rrmodel_cl.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/transitmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/uniform.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/orbits/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/orbits/orbits.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/orbits/orbits_py.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/orbits/taylor_z.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/param/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/param/parameter.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/param/prior.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/param/utilities.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/stars/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/stars/btsettl.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/stars/data/avg_bt_settl.fits +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/stars/data/avg_husser2013.fits +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/stars/husser2013.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/astrometry.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/constants.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/de.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/downsample.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/eclipses.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/io/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/io/base.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/io/lcdata.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/io/rvdata.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/keplerlc.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/mdwarfs.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/misc.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/mocklc.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/octasphere.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/phasecurves.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/physics.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/rv.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/tess.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/requirements.txt +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/setup.cfg +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/__init__.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/conftest.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/reference_flux.npz +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_contamination.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_ecintersection.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_lcdata.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_limb_darkening.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_lpf_plotting.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_lpf_pool.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_lstsqbaseline.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_ma_quadratic.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_ma_quadratic_nb.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_opencl_kernels.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_opencl_set_data.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_opmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_qpower2_nb.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_roadrunner_eclipse.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_rrmodel.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_rrmodel_cl.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_rrmodel_population.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_rrmodel_quadrature.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_rvdata.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_uniform_model.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_uniform_model_nb.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_z.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_zgrid.py +0 -0
- {pytransit-2.9.3 → pytransit-2.10.0}/video1.png +0 -0
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.10.0] - 2026-10-19
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- `TSModel` is about four times faster with many wavelength bins, and with `nthreads > 1` parallelises over the bins
|
|
8
|
+
instead of the exposures.
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- `TSModel` with `nthreads > 1` summing each in-transit exposure once per wavelength bin, giving fluxes near `npb`.
|
|
13
|
+
|
|
3
14
|
## [2.9.3] - 2026-10-15
|
|
4
15
|
|
|
5
16
|
### Changed
|
|
@@ -41,6 +41,7 @@ docs/source/_figures/__init__.py
|
|
|
41
41
|
docs/source/_figures/dataset_arrays.py
|
|
42
42
|
docs/source/_figures/highlights.py
|
|
43
43
|
docs/source/_figures/roadrunner.py
|
|
44
|
+
docs/source/_figures/tsmodel.py
|
|
44
45
|
docs/source/_static/.gitkeep
|
|
45
46
|
docs/source/api/deprecated.rst
|
|
46
47
|
docs/source/api/index.rst
|
|
@@ -279,6 +280,7 @@ tests/test_rrmodel_cl.py
|
|
|
279
280
|
tests/test_rrmodel_population.py
|
|
280
281
|
tests/test_rrmodel_quadrature.py
|
|
281
282
|
tests/test_rvdata.py
|
|
283
|
+
tests/test_tsmodel.py
|
|
282
284
|
tests/test_uniform_model.py
|
|
283
285
|
tests/test_uniform_model_nb.py
|
|
284
286
|
tests/test_z.py
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"docs/source/_figures/dataset_arrays.py",
|
|
21
21
|
"docs/source/_figures/highlights.py",
|
|
22
22
|
"docs/source/_figures/roadrunner.py",
|
|
23
|
+
"docs/source/_figures/tsmodel.py",
|
|
23
24
|
"docs/source/_static/.gitkeep",
|
|
24
25
|
"docs/source/api/deprecated.rst",
|
|
25
26
|
"docs/source/api/index.rst",
|
|
@@ -272,6 +273,7 @@
|
|
|
272
273
|
"tests/test_rrmodel_population.py",
|
|
273
274
|
"tests/test_rrmodel_quadrature.py",
|
|
274
275
|
"tests/test_rvdata.py",
|
|
276
|
+
"tests/test_tsmodel.py",
|
|
275
277
|
"tests/test_uniform_model.py",
|
|
276
278
|
"tests/test_uniform_model_nb.py",
|
|
277
279
|
"tests/test_z.py",
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# PyTransit: fast and easy exoplanet transit modelling in Python.
|
|
2
|
+
# Copyright (C) 2010-2026 Hannu Parviainen
|
|
3
|
+
#
|
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
+
|
|
17
|
+
"""Plotting helpers for the transmission spectroscopy feature page.
|
|
18
|
+
|
|
19
|
+
The page is about many wavelength bins sharing one transit geometry, so the figures show a whole
|
|
20
|
+
spectroscopic dataset at once and measure what sharing the geometry costs in accuracy. Keeping the
|
|
21
|
+
plotting and the toy spectrum here lets the page show only the PyTransit calls.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from matplotlib.pyplot import subplots, setp
|
|
25
|
+
from matplotlib.ticker import MaxNLocator
|
|
26
|
+
from meepmeep.backends.numba.point2d import sep_c, solve2d
|
|
27
|
+
from numpy import abs as npabs, array, exp, geomspace, linspace, pi, stack, tile
|
|
28
|
+
|
|
29
|
+
from pytransit import RoadRunnerModel, TSModel
|
|
30
|
+
|
|
31
|
+
__all__ = ['toy_spectrum', 'plot_spectroscopic_transit', 'plot_accuracy']
|
|
32
|
+
|
|
33
|
+
# The example transit used throughout the page.
|
|
34
|
+
WINDOW = 3.5 / 24
|
|
35
|
+
TIME = linspace(-0.5 * WINDOW, 0.5 * WINDOW, 1500)
|
|
36
|
+
T0, P, A, INC = 0.0, 4.0, 13.0, 0.49 * pi
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _despine(ax):
|
|
40
|
+
ax.spines['top'].set_visible(False)
|
|
41
|
+
ax.spines['right'].set_visible(False)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _gaussian(x, centre, width):
|
|
45
|
+
return exp(-0.5 * ((x - centre) / width) ** 2)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def toy_spectrum(npb, k0=0.1):
|
|
49
|
+
"""A toy near-infrared transmission spectrum with wavelength-dependent limb darkening.
|
|
50
|
+
|
|
51
|
+
The radius ratio has a weak scattering slope and a few absorption bands loosely placed at the
|
|
52
|
+
water and carbon dioxide features, each changing the radius ratio by one to two percent. The
|
|
53
|
+
quadratic limb darkening weakens towards the red. None of it is meant to be physical; it only
|
|
54
|
+
gives the bins something to differ by.
|
|
55
|
+
|
|
56
|
+
Parameters
|
|
57
|
+
----------
|
|
58
|
+
npb : int
|
|
59
|
+
Number of wavelength bins between 0.6 and 5.0 micron.
|
|
60
|
+
k0 : float, optional
|
|
61
|
+
The continuum radius ratio.
|
|
62
|
+
|
|
63
|
+
Returns
|
|
64
|
+
-------
|
|
65
|
+
wl : ndarray
|
|
66
|
+
Bin centres in micron, shape ``(npb,)``.
|
|
67
|
+
k : ndarray
|
|
68
|
+
Radius ratios, shape ``(npb,)``.
|
|
69
|
+
ldc : ndarray
|
|
70
|
+
Quadratic limb darkening coefficients, shape ``(npb, 2)``.
|
|
71
|
+
"""
|
|
72
|
+
wl = linspace(0.6, 5.0, npb)
|
|
73
|
+
k = k0 * (1.0 + 0.004 * (0.6 / wl) ** 4
|
|
74
|
+
+ 0.010 * _gaussian(wl, 1.40, 0.10)
|
|
75
|
+
+ 0.012 * _gaussian(wl, 1.90, 0.12)
|
|
76
|
+
+ 0.015 * _gaussian(wl, 2.70, 0.15)
|
|
77
|
+
+ 0.020 * _gaussian(wl, 4.30, 0.12))
|
|
78
|
+
ldc = stack([0.15 + 0.35 * (0.6 / wl) ** 0.9, 0.12 + 0.10 * (0.6 / wl)], axis=1)
|
|
79
|
+
return wl, k, ldc
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def plot_spectroscopic_transit(wl, k, flux, time=TIME):
|
|
83
|
+
"""Draw the transmission spectrum beside the spectroscopic light curves it produces.
|
|
84
|
+
|
|
85
|
+
The spectrum is drawn as the radius ratio with its mean over the bins marked, since the model
|
|
86
|
+
shares its geometry through that mean. The light curves are shown relative to their mean over
|
|
87
|
+
wavelength, since the transit itself is the same in every bin and would otherwise hide the
|
|
88
|
+
differences between them.
|
|
89
|
+
|
|
90
|
+
Parameters
|
|
91
|
+
----------
|
|
92
|
+
wl : ndarray
|
|
93
|
+
Bin centres in micron.
|
|
94
|
+
k : ndarray
|
|
95
|
+
Radius ratio per bin.
|
|
96
|
+
flux : ndarray
|
|
97
|
+
Modelled flux with shape ``(npb, npt)``.
|
|
98
|
+
time : ndarray, optional
|
|
99
|
+
The mid-exposure times the flux was computed for.
|
|
100
|
+
|
|
101
|
+
Returns
|
|
102
|
+
-------
|
|
103
|
+
matplotlib.figure.Figure
|
|
104
|
+
"""
|
|
105
|
+
fig, (al, ar) = subplots(1, 2, figsize=(9, 3.6), width_ratios=(2, 3))
|
|
106
|
+
al.plot(wl, k, 'k')
|
|
107
|
+
al.axhline(k.mean(), ls='--', c='0.6', zorder=-1)
|
|
108
|
+
al.text(wl[-1], k.mean(), '$\\bar{k}$', color='0.4', ha='right', va='bottom')
|
|
109
|
+
|
|
110
|
+
differential = 1e6 * (flux - flux.mean(0))
|
|
111
|
+
vmax = npabs(differential).max()
|
|
112
|
+
im = ar.pcolormesh(24 * time, wl, differential, cmap='RdBu_r', vmin=-vmax, vmax=vmax,
|
|
113
|
+
shading='nearest', rasterized=True)
|
|
114
|
+
fig.colorbar(im, ax=ar, label='Flux - mean flux [ppm]')
|
|
115
|
+
|
|
116
|
+
setp(al, xlabel='Wavelength [$\\mu$m]', ylabel='Radius ratio $k$',
|
|
117
|
+
title='Transmission spectrum')
|
|
118
|
+
setp(ar, xlabel='Time - $t_c$ [h]', ylabel='Wavelength [$\\mu$m]',
|
|
119
|
+
title='Light curves relative to their mean')
|
|
120
|
+
al.autoscale(axis='x', tight=True)
|
|
121
|
+
al.yaxis.set_major_locator(MaxNLocator(5))
|
|
122
|
+
_despine(al)
|
|
123
|
+
fig.tight_layout()
|
|
124
|
+
return fig
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _bin_errors(kmean, deviation, inc, ldc, time):
|
|
128
|
+
"""Flux error of the two bins at ``kmean * (1 -/+ deviation)``, against per-bin RoadRunner.
|
|
129
|
+
|
|
130
|
+
The third bin sits at the mean so the spread is symmetric and the model's mean radius ratio is
|
|
131
|
+
``kmean`` exactly.
|
|
132
|
+
"""
|
|
133
|
+
k = kmean * array([1.0 - deviation, 1.0, 1.0 + deviation])
|
|
134
|
+
ts = TSModel()
|
|
135
|
+
ts.set_data(time)
|
|
136
|
+
flux = ts.evaluate(k, tile(ldc, (3, 1)), T0, P, A, inc)[0]
|
|
137
|
+
|
|
138
|
+
rr = RoadRunnerModel('quadratic')
|
|
139
|
+
rr.set_data(time)
|
|
140
|
+
reference = array([rr.evaluate(kk, ldc, T0, P, A, inc) for kk in k])
|
|
141
|
+
return 1e6 * (flux - reference)[[0, 2]]
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def plot_accuracy(kmean=0.1, deviation=0.01, ldc=(0.4, 0.2),
|
|
145
|
+
ks=(0.05, 0.1, 0.2), deviations=geomspace(0.002, 0.2, 12)):
|
|
146
|
+
"""Measure the error of sharing the geometry across bins with different radius ratios.
|
|
147
|
+
|
|
148
|
+
The reference is :class:`~pytransit.models.roadrunner.rrmodel.RoadRunnerModel` evaluated bin by
|
|
149
|
+
bin with the same discretisation, so the difference is the error of the shared geometry alone,
|
|
150
|
+
not the quadrature error both models have in common.
|
|
151
|
+
|
|
152
|
+
Returns
|
|
153
|
+
-------
|
|
154
|
+
matplotlib.figure.Figure
|
|
155
|
+
"""
|
|
156
|
+
ldc = list(ldc)
|
|
157
|
+
fig, (al, ar) = subplots(1, 2, figsize=(9, 3.8))
|
|
158
|
+
|
|
159
|
+
# Where along the transit the error lives
|
|
160
|
+
# ---------------------------------------
|
|
161
|
+
xyc = solve2d(0.0, P, A, INC, 0.0, 0.0)
|
|
162
|
+
z = array([sep_c(t, xyc) for t in TIME])
|
|
163
|
+
errors = _bin_errors(kmean, deviation, INC, ldc, TIME)
|
|
164
|
+
al.plot(24 * TIME, errors[0], label=f'$k = \\bar{{k}}\\,(1 - {deviation:g})$')
|
|
165
|
+
al.plot(24 * TIME, errors[1], label=f'$k = \\bar{{k}}\\,(1 + {deviation:g})$')
|
|
166
|
+
al.fill_between(24 * TIME, 0, 1, where=(z > 1.0 - kmean) & (z < 1.0 + kmean), color='0.92',
|
|
167
|
+
transform=al.get_xaxis_transform(), zorder=-1, label='Ingress and egress')
|
|
168
|
+
al.axhline(0.0, c='0.6', lw=0.5, zorder=-1)
|
|
169
|
+
setp(al, xlabel='Time - $t_c$ [h]', ylabel='Flux error [ppm]',
|
|
170
|
+
title=f'$\\bar{{k}} = {kmean:g}$, bins at $\\pm${100 * deviation:g}%')
|
|
171
|
+
al.autoscale(axis='x', tight=True)
|
|
172
|
+
al.legend(fontsize='small', frameon=False, loc='upper center')
|
|
173
|
+
|
|
174
|
+
# How the error scales with the spread
|
|
175
|
+
# ------------------------------------
|
|
176
|
+
time = linspace(0.0, 0.5 * WINDOW, 1000)
|
|
177
|
+
for kk in ks:
|
|
178
|
+
ar.plot(100 * deviations, [npabs(_bin_errors(kk, d, INC, ldc, time)).max() for d in deviations],
|
|
179
|
+
'o-', ms=3, label=f'$\\bar{{k}} = {kk:g}$')
|
|
180
|
+
ar.axhline(1.0, ls='--', c='0.75', zorder=-1)
|
|
181
|
+
ar.text(100 * deviations[-1], 1.1, '1 ppm', color='0.5', fontsize='small', va='bottom', ha='right')
|
|
182
|
+
setp(ar, xlabel='Deviation from the mean radius ratio [%]', ylabel='Maximum flux error [ppm]',
|
|
183
|
+
xscale='log', yscale='log', title='Error against the radius ratio spread')
|
|
184
|
+
ar.legend(fontsize='small', frameon=False)
|
|
185
|
+
|
|
186
|
+
_despine(al)
|
|
187
|
+
_despine(ar)
|
|
188
|
+
fig.tight_layout()
|
|
189
|
+
return fig
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
RoadRunner model
|
|
2
|
+
================
|
|
3
|
+
|
|
4
|
+
:class:`~pytransit.models.roadrunner.rrmodel.RoadRunnerModel` (Parviainen, MNRAS 499, 1633, 2020)
|
|
5
|
+
is PyTransit's recommended general-purpose transit model. Its distinguishing feature is that the
|
|
6
|
+
stellar intensity profile is an *input* to the model rather than something built into its
|
|
7
|
+
derivation. Any radially symmetric profile works, and the choice costs essentially nothing.
|
|
8
|
+
|
|
9
|
+
.. plot::
|
|
10
|
+
:context:
|
|
11
|
+
:nofigs:
|
|
12
|
+
|
|
13
|
+
from _figures.roadrunner import plot_laws, plot_profile_and_transit
|
|
14
|
+
|
|
15
|
+
Geometry and profile, separated
|
|
16
|
+
-------------------------------
|
|
17
|
+
|
|
18
|
+
The classical transit models are analytic solutions to one specific integral: a limb-darkened disk
|
|
19
|
+
overlapped by an opaque circle, solved separately for each limb darkening law. A new law needs a
|
|
20
|
+
new derivation, and some laws have no closed form at all.
|
|
21
|
+
|
|
22
|
+
RoadRunner splits the problem in two. The **geometry** -- which parts of the stellar disk the
|
|
23
|
+
planet covers -- depends only on the radius ratio and the planet's position, not on how bright the
|
|
24
|
+
star is. The model turns it into a handful of points at which to read the stellar intensity, and a
|
|
25
|
+
weight for each reading. The **intensity profile** enters only through those readings, from a table
|
|
26
|
+
computed once per evaluation, so the model never sees the function that produced it.
|
|
27
|
+
|
|
28
|
+
Nothing in this depends on the form of the profile, and the rest of this page shows what follows
|
|
29
|
+
from that. :doc:`../models/roadrunner` describes how the readings and their weights are chosen.
|
|
30
|
+
|
|
31
|
+
The law is a one-line choice
|
|
32
|
+
----------------------------
|
|
33
|
+
|
|
34
|
+
The built-in laws are selected by name in the initialiser. Nothing else about the call changes.
|
|
35
|
+
|
|
36
|
+
.. plot::
|
|
37
|
+
:context: close-figs
|
|
38
|
+
:include-source:
|
|
39
|
+
|
|
40
|
+
from numpy import pi, linspace
|
|
41
|
+
from pytransit import RoadRunnerModel
|
|
42
|
+
|
|
43
|
+
window = 3.5 / 24
|
|
44
|
+
time = linspace(-0.5 * window, 0.5 * window, 1500)
|
|
45
|
+
k, t0, p, a, i = 0.1, 0.0, 4.0, 13.0, 0.49 * pi
|
|
46
|
+
|
|
47
|
+
laws = {'linear': [0.4],
|
|
48
|
+
'quadratic': [0.3, 0.1],
|
|
49
|
+
'power-2': [0.6, 0.5],
|
|
50
|
+
'nonlinear': [0.4, 0.3, 0.2, 0.1]}
|
|
51
|
+
|
|
52
|
+
fluxes = {}
|
|
53
|
+
for name, ldc in laws.items():
|
|
54
|
+
tm = RoadRunnerModel(name)
|
|
55
|
+
tm.set_data(time)
|
|
56
|
+
fluxes[name] = tm.evaluate(k, ldc, t0, p, a, i)
|
|
57
|
+
|
|
58
|
+
plot_laws(laws, fluxes, time)
|
|
59
|
+
|
|
60
|
+
Eleven laws ship with the model, listed in :doc:`../guide/limb_darkening`. Two of them,
|
|
61
|
+
``'quadratic-tri'`` and ``'power-2-pm'``, are not new physics but reparametrisations that behave
|
|
62
|
+
better as free parameters in a fit.
|
|
63
|
+
|
|
64
|
+
Any profile you can write down
|
|
65
|
+
------------------------------
|
|
66
|
+
|
|
67
|
+
Instead of a name, RoadRunner also accepts any Numba-compilable function ``f(mu, pv)`` that returns
|
|
68
|
+
the intensity at :math:`\mu = \cos\gamma`. Nothing requires that function to be a sensible limb
|
|
69
|
+
darkening law. Here is a profile that oscillates across the disk:
|
|
70
|
+
|
|
71
|
+
.. plot::
|
|
72
|
+
:context: close-figs
|
|
73
|
+
:include-source:
|
|
74
|
+
|
|
75
|
+
from numpy import sqrt, sin, ceil
|
|
76
|
+
from numba import njit
|
|
77
|
+
|
|
78
|
+
@njit(fastmath=True)
|
|
79
|
+
def ld_wavy(mu, pv):
|
|
80
|
+
z = sqrt(1.0 - mu**2)
|
|
81
|
+
return 1.0 - (1.0 - z) * sin(ceil(pv[0]) * 2 * pi * z)
|
|
82
|
+
|
|
83
|
+
tm = RoadRunnerModel(ld_wavy, ng=200)
|
|
84
|
+
tm.set_data(time)
|
|
85
|
+
flux = tm.evaluate(k, [5], t0, p, a, i)
|
|
86
|
+
|
|
87
|
+
plot_profile_and_transit(ld_wavy, [5], flux, time, 'A wavy profile')
|
|
88
|
+
|
|
89
|
+
The rings of alternating brightness show up as ripples in the light curve as the planet crosses
|
|
90
|
+
them. No analytic transit model could integrate this profile, but for RoadRunner it is an ordinary
|
|
91
|
+
input.
|
|
92
|
+
|
|
93
|
+
A step in brightness works the same way:
|
|
94
|
+
|
|
95
|
+
.. plot::
|
|
96
|
+
:context: close-figs
|
|
97
|
+
:include-source:
|
|
98
|
+
|
|
99
|
+
from numpy import tanh
|
|
100
|
+
|
|
101
|
+
@njit
|
|
102
|
+
def ld_step(mu, pv):
|
|
103
|
+
z = sqrt(1.0 - mu**2)
|
|
104
|
+
return 0.6 + 0.2 * tanh((0.5 - z) / pv[0])
|
|
105
|
+
|
|
106
|
+
tm = RoadRunnerModel(ld_step, ng=200)
|
|
107
|
+
tm.set_data(time)
|
|
108
|
+
flux = tm.evaluate(k, [0.05], t0, p, a, i)
|
|
109
|
+
|
|
110
|
+
plot_profile_and_transit(ld_step, [0.05], flux, time, 'A step profile')
|
|
111
|
+
|
|
112
|
+
The light curve follows the profile directly. While the planet is entirely over the dim outer
|
|
113
|
+
annulus the flux sits on a flat shelf, and it drops to a deeper minimum as the planet crosses onto
|
|
114
|
+
the bright inner disk at :math:`z = 0.5`. The step is smoothed over :math:`0.05\,R_\star` on
|
|
115
|
+
purpose: the model integrates the profile numerically, and a true discontinuity would leave small
|
|
116
|
+
steps in the light curve.
|
|
117
|
+
|
|
118
|
+
Both profiles are deliberately unphysical. If the model handles them, the realistic cases are
|
|
119
|
+
straightforward: a profile tabulated from a stellar atmosphere grid, a law nobody has derived a
|
|
120
|
+
transit solution for, or a profile with a feature from starspots. :doc:`../guide/limb_darkening`
|
|
121
|
+
describes how to supply your own profile, and how to make it faster by also giving its disk
|
|
122
|
+
integral.
|
|
123
|
+
|
|
124
|
+
The law is nearly free
|
|
125
|
+
----------------------
|
|
126
|
+
|
|
127
|
+
Because the profile enters only through a table of fixed size, the choice of law barely affects
|
|
128
|
+
the cost. Timing a 1500-point light curve on one machine, from the one-coefficient linear law to
|
|
129
|
+
the six-coefficient general one:
|
|
130
|
+
|
|
131
|
+
.. list-table::
|
|
132
|
+
:header-rows: 1
|
|
133
|
+
:widths: 30 20 50
|
|
134
|
+
|
|
135
|
+
* - Law
|
|
136
|
+
- Coefficients
|
|
137
|
+
- Time per evaluation
|
|
138
|
+
* - ``'linear'``
|
|
139
|
+
- 1
|
|
140
|
+
- 0.067 ms
|
|
141
|
+
* - ``'quadratic'``
|
|
142
|
+
- 2
|
|
143
|
+
- 0.067 ms
|
|
144
|
+
* - ``'power-2'``
|
|
145
|
+
- 2
|
|
146
|
+
- 0.070 ms
|
|
147
|
+
* - ``'nonlinear'``
|
|
148
|
+
- 4
|
|
149
|
+
- 0.072 ms
|
|
150
|
+
* - ``'general'``
|
|
151
|
+
- 6
|
|
152
|
+
- 0.072 ms
|
|
153
|
+
|
|
154
|
+
The differences are a few microseconds, about as large as the variation between timing runs.
|
|
155
|
+
Choosing a more flexible law is a modelling decision, not a performance one.
|
|
156
|
+
|
|
157
|
+
Accuracy
|
|
158
|
+
--------
|
|
159
|
+
|
|
160
|
+
The price of the flexibility is that the profile is integrated numerically rather than
|
|
161
|
+
analytically. With the default settings, RoadRunner agrees with the analytic Mandel & Agol
|
|
162
|
+
solution for the quadratic law to 1.5 ppm at :math:`k = 0.1`, and the accuracy can be raised further
|
|
163
|
+
when the science needs it. :doc:`../models/roadrunner` shows how the error depends on the radius
|
|
164
|
+
ratio and on the integration settings.
|
|
165
|
+
|
|
166
|
+
Profiles from stellar atmospheres
|
|
167
|
+
---------------------------------
|
|
168
|
+
|
|
169
|
+
The most physically motivated use of the flexibility is to skip analytic laws entirely.
|
|
170
|
+
:class:`~pytransit.models.ldmodel.LDModel` is an interface for profiles that come from a stellar
|
|
171
|
+
atmosphere model, and :class:`~pytransit.models.ldtkldm.LDTkLDModel` implements it on top of
|
|
172
|
+
`LDTk <https://github.com/hpparvi/ldtk>`_, computing profiles from the Husser et al. (2013) PHOENIX
|
|
173
|
+
specific intensity spectra.
|
|
174
|
+
|
|
175
|
+
.. code-block:: python
|
|
176
|
+
|
|
177
|
+
from pytransit import RoadRunnerModel
|
|
178
|
+
from pytransit.models.ldtkldm import LDTkLDModel
|
|
179
|
+
from pytransit.contamination import sdss_g, sdss_r, sdss_i, sdss_z
|
|
180
|
+
|
|
181
|
+
ldm = LDTkLDModel(pbs=(sdss_g, sdss_r, sdss_i, sdss_z),
|
|
182
|
+
teff=(5500, 100), logg=(4.5, 0.1), metal=(0.0, 0.1))
|
|
183
|
+
|
|
184
|
+
tm = RoadRunnerModel(ldm)
|
|
185
|
+
|
|
186
|
+
The free parameters are then the stellar parameters rather than abstract coefficients, and the
|
|
187
|
+
profile follows the model atmospheres directly.
|
|
188
|
+
|
|
189
|
+
.. seealso::
|
|
190
|
+
|
|
191
|
+
:doc:`../models/roadrunner` for how the model works, its accuracy, and its API;
|
|
192
|
+
:doc:`../guide/limb_darkening` for the built-in laws and how to supply your own; and
|
|
193
|
+
:doc:`../highlights` for what the shared data setup adds on top.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
Transmission spectroscopy model
|
|
2
|
+
===============================
|
|
3
|
+
|
|
4
|
+
A spectroscopic transit observation gives hundreds or thousands of light curves that differ in
|
|
5
|
+
only two things. Every wavelength bin sees the same exposures, the same orbit and the same planet;
|
|
6
|
+
only the radius ratio and the limb darkening change with wavelength.
|
|
7
|
+
|
|
8
|
+
:class:`~pytransit.models.roadrunner.tsmodel.TransmissionSpectroscopyModel`, exported as
|
|
9
|
+
``TSModel``, is the :doc:`RoadRunner model <roadrunner>` built around this. It computes the
|
|
10
|
+
geometry once and evaluates every wavelength bin against it. For a spectrum of a thousand bins,
|
|
11
|
+
this is about twenty times faster than evaluating RoadRunner bin by bin.
|
|
12
|
+
|
|
13
|
+
.. plot::
|
|
14
|
+
:context:
|
|
15
|
+
:nofigs:
|
|
16
|
+
|
|
17
|
+
from _figures.tsmodel import toy_spectrum, plot_spectroscopic_transit
|
|
18
|
+
|
|
19
|
+
One call, a whole spectrum
|
|
20
|
+
--------------------------
|
|
21
|
+
|
|
22
|
+
One radius ratio and one set of limb darkening coefficients per bin go in, and one light curve per
|
|
23
|
+
bin comes out. Here for a toy near-infrared spectrum of 200 bins between 0.6 and 5 micron:
|
|
24
|
+
|
|
25
|
+
.. plot::
|
|
26
|
+
:context: close-figs
|
|
27
|
+
:include-source:
|
|
28
|
+
|
|
29
|
+
from numpy import pi, linspace
|
|
30
|
+
from pytransit import TSModel
|
|
31
|
+
|
|
32
|
+
window = 3.5 / 24
|
|
33
|
+
time = linspace(-0.5 * window, 0.5 * window, 1500)
|
|
34
|
+
t0, p, a, i = 0.0, 4.0, 13.0, 0.49 * pi
|
|
35
|
+
|
|
36
|
+
wl, k, ldc = toy_spectrum(200) # k.shape == (200,), ldc.shape == (200, 2)
|
|
37
|
+
|
|
38
|
+
tm = TSModel('quadratic')
|
|
39
|
+
tm.set_data(time)
|
|
40
|
+
flux = tm.evaluate(k, ldc, t0, p, a, i)
|
|
41
|
+
# flux.shape == (1, 200, 1500)
|
|
42
|
+
|
|
43
|
+
plot_spectroscopic_transit(wl, k, flux[0], time)
|
|
44
|
+
|
|
45
|
+
The left panel is the input spectrum, and the right panel shows how each bin's light curve differs
|
|
46
|
+
from the mean over all bins. The absorption bands show up as horizontal stripes where the transit
|
|
47
|
+
is deeper. The largest differences, however, come from the limb darkening, which is stronger in the
|
|
48
|
+
blue: those bins are deeper at mid-transit and shallower near the limb. A transmission spectrum is
|
|
49
|
+
as much a question of the limb darkening in each bin as of the radius ratios, and the model takes
|
|
50
|
+
both per bin.
|
|
51
|
+
|
|
52
|
+
``set_data`` gets only the times. There are no light curve or passband indices to set up, and the
|
|
53
|
+
number of bins is read from the arrays given to ``evaluate``, so the same model evaluates a white
|
|
54
|
+
light curve, a coarse spectrum or a fine one without being set up again.
|
|
55
|
+
|
|
56
|
+
Cost per wavelength bin
|
|
57
|
+
-----------------------
|
|
58
|
+
|
|
59
|
+
Time per evaluation for a 1000-exposure light curve with the transit covering about half of it, on
|
|
60
|
+
one thread. ``RoadRunnerModel`` is timed both called once per bin and given all the bins at once as
|
|
61
|
+
the passbands of a single dataset:
|
|
62
|
+
|
|
63
|
+
.. list-table::
|
|
64
|
+
:header-rows: 1
|
|
65
|
+
:widths: 16 24 30 30
|
|
66
|
+
|
|
67
|
+
* - Bins
|
|
68
|
+
- ``TSModel``
|
|
69
|
+
- ``RoadRunnerModel``, one call per bin
|
|
70
|
+
- ``RoadRunnerModel``, all bins in one call
|
|
71
|
+
* - 1
|
|
72
|
+
- 0.064 ms
|
|
73
|
+
- 0.058 ms
|
|
74
|
+
- 0.054 ms
|
|
75
|
+
* - 10
|
|
76
|
+
- 0.090 ms
|
|
77
|
+
- 0.59 ms
|
|
78
|
+
- 0.50 ms
|
|
79
|
+
* - 100
|
|
80
|
+
- 0.33 ms
|
|
81
|
+
- 5.7 ms
|
|
82
|
+
- 4.8 ms
|
|
83
|
+
* - 1000
|
|
84
|
+
- 2.6 ms
|
|
85
|
+
- 57 ms
|
|
86
|
+
- 54 ms
|
|
87
|
+
|
|
88
|
+
With one bin there is nothing to share. Beyond that the difference grows with the number of bins:
|
|
89
|
+
about six times at ten bins, fifteen at a hundred, and twenty at a thousand. Each bin adds about
|
|
90
|
+
2.6 µs to an evaluation, where a separate RoadRunner evaluation costs 55 µs. Large spectra can also
|
|
91
|
+
be divided between threads with ``nthreads``: on eight threads, the thousand bins take 0.92 ms.
|
|
92
|
+
|
|
93
|
+
Accuracy
|
|
94
|
+
--------
|
|
95
|
+
|
|
96
|
+
The geometry is shared through the mean radius ratio of the bins, so the result is exact when all
|
|
97
|
+
the bins have the same radius ratio and approximate when they differ. For the toy spectrum above,
|
|
98
|
+
whose radius ratios stay within 2% of their mean, the model agrees with RoadRunner evaluated bin
|
|
99
|
+
by bin to within 6 ppm. :doc:`../models/tsmodel` shows how the error scales with the spread of the
|
|
100
|
+
spectrum and the size of the planet.
|
|
101
|
+
|
|
102
|
+
.. seealso::
|
|
103
|
+
|
|
104
|
+
:doc:`../models/tsmodel` for how the model works, its accuracy, and its API;
|
|
105
|
+
:doc:`roadrunner` for the model it is built on.
|