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.
Files changed (295) hide show
  1. {pytransit-2.9.3 → pytransit-2.10.0}/CHANGELOG.md +11 -0
  2. {pytransit-2.9.3 → pytransit-2.10.0}/PKG-INFO +1 -1
  3. {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/PKG-INFO +1 -1
  4. {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/SOURCES.txt +2 -0
  5. {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/scm_file_list.json +2 -0
  6. pytransit-2.10.0/PyTransit.egg-info/scm_version.json +8 -0
  7. pytransit-2.10.0/docs/source/_figures/tsmodel.py +189 -0
  8. pytransit-2.10.0/docs/source/features/roadrunner.rst +193 -0
  9. pytransit-2.10.0/docs/source/features/tsmodel.rst +105 -0
  10. pytransit-2.10.0/docs/source/models/roadrunner.rst +201 -0
  11. pytransit-2.10.0/docs/source/models/tsmodel.rst +194 -0
  12. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/_version.py +3 -3
  13. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/common.py +95 -13
  14. pytransit-2.10.0/pytransit/models/roadrunner/model_trspec.py +154 -0
  15. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/tsmodel.py +2 -1
  16. pytransit-2.10.0/tests/test_tsmodel.py +113 -0
  17. pytransit-2.9.3/PyTransit.egg-info/scm_version.json +0 -8
  18. pytransit-2.9.3/docs/source/features/roadrunner.rst +0 -297
  19. pytransit-2.9.3/docs/source/features/tsmodel.rst +0 -30
  20. pytransit-2.9.3/docs/source/models/roadrunner.rst +0 -96
  21. pytransit-2.9.3/docs/source/models/tsmodel.rst +0 -76
  22. pytransit-2.9.3/pytransit/models/roadrunner/model_trspec.py +0 -184
  23. {pytransit-2.9.3 → pytransit-2.10.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  24. {pytransit-2.9.3 → pytransit-2.10.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  25. {pytransit-2.9.3 → pytransit-2.10.0}/.github/workflows/python-package.yml +0 -0
  26. {pytransit-2.9.3 → pytransit-2.10.0}/.github/workflows/python-publish.yml +0 -0
  27. {pytransit-2.9.3 → pytransit-2.10.0}/.gitignore +0 -0
  28. {pytransit-2.9.3 → pytransit-2.10.0}/.readthedocs.yaml +0 -0
  29. {pytransit-2.9.3 → pytransit-2.10.0}/.travis.yml +0 -0
  30. {pytransit-2.9.3 → pytransit-2.10.0}/CITATIONS.bib +0 -0
  31. {pytransit-2.9.3 → pytransit-2.10.0}/CODE_OF_CONDUCT.md +0 -0
  32. {pytransit-2.9.3 → pytransit-2.10.0}/LICENSE +0 -0
  33. {pytransit-2.9.3 → pytransit-2.10.0}/MANIFEST.in +0 -0
  34. {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/dependency_links.txt +0 -0
  35. {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/requires.txt +0 -0
  36. {pytransit-2.9.3 → pytransit-2.10.0}/PyTransit.egg-info/top_level.txt +0 -0
  37. {pytransit-2.9.3 → pytransit-2.10.0}/README.md +0 -0
  38. {pytransit-2.9.3 → pytransit-2.10.0}/_config.yml +0 -0
  39. {pytransit-2.9.3 → pytransit-2.10.0}/docs/Makefile +0 -0
  40. {pytransit-2.9.3 → pytransit-2.10.0}/docs/requirements.txt +0 -0
  41. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/_figures/__init__.py +0 -0
  42. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/_figures/dataset_arrays.py +0 -0
  43. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/_figures/highlights.py +0 -0
  44. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/_figures/roadrunner.py +0 -0
  45. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/_static/.gitkeep +0 -0
  46. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/api/deprecated.rst +0 -0
  47. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/api/index.rst +0 -0
  48. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/api/limb_darkening.rst +0 -0
  49. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/api/transitmodel.rst +0 -0
  50. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_1.png +0 -0
  51. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_1.svg +0 -0
  52. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_2.png +0 -0
  53. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_2.svg +0 -0
  54. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_3.png +0 -0
  55. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/basic_example_3.svg +0 -0
  56. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/conf.py +0 -0
  57. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/contamination.rst +0 -0
  58. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/features/chromosphere.rst +0 -0
  59. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/features/gdmodel.rst +0 -0
  60. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/features/index.rst +0 -0
  61. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/features/opmodel.rst +0 -0
  62. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/data_setup.rst +0 -0
  63. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/evaluation.rst +0 -0
  64. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/index.rst +0 -0
  65. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/interface.rst +0 -0
  66. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/limb_darkening.rst +0 -0
  67. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/guide/opencl.rst +0 -0
  68. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/highlights.rst +0 -0
  69. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/index.rst +0 -0
  70. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/installation.rst +0 -0
  71. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/io.rst +0 -0
  72. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/chromosphere.rst +0 -0
  73. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/eclipse.rst +0 -0
  74. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/gdmodel.rst +0 -0
  75. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/general.rst +0 -0
  76. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/index.rst +0 -0
  77. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/opencl.rst +0 -0
  78. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/opmodel.rst +0 -0
  79. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/qpower2.rst +0 -0
  80. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/quadratic.rst +0 -0
  81. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/models/uniform.rst +0 -0
  82. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/models/roadrunner/common.py +0 -0
  83. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/models/roadrunner/roadrunner_model_example_1.ipynb +0 -0
  84. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/models/roadrunner/roadrunner_model_example_2.ipynb +0 -0
  85. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/models/roadrunner/roadrunner_model_example_3.ipynb +0 -0
  86. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/models/roadrunner/roadrunner_model_theory.ipynb +0 -0
  87. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/notebooks/quickstart.ipynb +0 -0
  88. {pytransit-2.9.3 → pytransit-2.10.0}/docs/source/stars.rst +0 -0
  89. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/001_simple_broadband_parameter_estimation.ipynb +0 -0
  90. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/01_broadband_parameter_estimation.ipynb +0 -0
  91. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/A1_impact_parameter_accuracy.ipynb +0 -0
  92. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/A2_Supersampling.ipynb +0 -0
  93. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/2024_m_dwarf_host_example_plots.ipynb +0 -0
  94. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/2024_m_dwarf_host_example_simulations.ipynb +0 -0
  95. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/contamination_1_black_body_model.ipynb +0 -0
  96. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/contamination_2_physical_model.ipynb +0 -0
  97. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/contamination_3_comparison.ipynb +0 -0
  98. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/example_1a.ipynb +0 -0
  99. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/example_1b.ipynb +0 -0
  100. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/example_2a.ipynb +0 -0
  101. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/example_2b.ipynb +0 -0
  102. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/src/__init__.py +0 -0
  103. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/src/blendlpf.py +0 -0
  104. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/src/core.py +0 -0
  105. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/src/mocklc.py +0 -0
  106. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/contamination/src/plotting.py +0 -0
  107. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/core.py +0 -0
  108. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/data/obs_data.fits +0 -0
  109. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_chromosphere_model.ipynb +0 -0
  110. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_eclipse_model.ipynb +0 -0
  111. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_qpower2_model.ipynb +0 -0
  112. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_qpower2_opencl_model.ipynb +0 -0
  113. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_quadratic_model.ipynb +0 -0
  114. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/example_uniform_model.ipynb +0 -0
  115. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/model_example_1.png +0 -0
  116. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/oblate_planet_example/figures.ipynb +0 -0
  117. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/oblate_planet_example/opmodel_example_1.ipynb +0 -0
  118. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/oblate_planet_example/opmodel_geometry.pdf +0 -0
  119. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/osmodel_1.ipynb +0 -0
  120. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/osmodel_example_1.ipynb +0 -0
  121. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/osmodel_visualization_example.ipynb +0 -0
  122. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/roadrunner/common.py +0 -0
  123. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/roadrunner/tsmodel_example_1.ipynb +0 -0
  124. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/tess_examples/WASP-4b.ipynb +0 -0
  125. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/tess_examples/data/tess2018234235059-s0002-0000000402026209-0121-s_lc.fits +0 -0
  126. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/tess_examples/data/tess2019032160000-s0008-0000000413248763-0136-s_lc.fits +0 -0
  127. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/tess_examples/data/wasp_4b_transit_times.csv +0 -0
  128. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/tsmodel/test_accuracy.ipynb +0 -0
  129. {pytransit-2.9.3 → pytransit-2.10.0}/notebooks/ttv_model_example.ipynb +0 -0
  130. {pytransit-2.9.3 → pytransit-2.10.0}/notes/opencl-rrmodel-pt3-migration.md +0 -0
  131. {pytransit-2.9.3 → pytransit-2.10.0}/pyproject.toml +0 -0
  132. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/__init__.py +0 -0
  133. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/__init__.py +0 -0
  134. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/contamination.py +0 -0
  135. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/data/spectra.h5 +0 -0
  136. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/data/transmission.nc +0 -0
  137. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/filter.py +0 -0
  138. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/instrument.py +0 -0
  139. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/contamination/plotting.py +0 -0
  140. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/limb_darkening.py +0 -0
  141. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/__init__.py +0 -0
  142. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/baselines/__init__.py +0 -0
  143. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/baselines/legendrebaseline.py +0 -0
  144. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/baselines/linearbaseline.py +0 -0
  145. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/baselines/lstsqbaseline.py +0 -0
  146. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/cntlpf.py +0 -0
  147. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/eclipselpf.py +0 -0
  148. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/__init__.py +0 -0
  149. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/celeriteloglikelihood.py +0 -0
  150. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/clloglikelihood.py +0 -0
  151. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/fmcloglikelihood.py +0 -0
  152. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/logisticloglikelihood.py +0 -0
  153. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/multiceleriteloglikelihood.py +0 -0
  154. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/loglikelihood/wnloglikelihood.py +0 -0
  155. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/logposteriorfunction.py +0 -0
  156. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/lpf.py +0 -0
  157. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/mclpf.py +0 -0
  158. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/mptlpf.py +0 -0
  159. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/ocllpf.py +0 -0
  160. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/ocltdvlpf.py +0 -0
  161. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/oclttvlpf.py +0 -0
  162. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/phasecurvelpf.py +0 -0
  163. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/rvlpf.py +0 -0
  164. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tdvlpf.py +0 -0
  165. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/__init__.py +0 -0
  166. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/ctesslpf.py +0 -0
  167. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/tessttvlpf.py +0 -0
  168. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/tgclpf.py +0 -0
  169. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/tgcmplpf.py +0 -0
  170. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tess/tmpclpf.py +0 -0
  171. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tesslpf.py +0 -0
  172. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/tessoclttvlpf.py +0 -0
  173. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/transitanalysis.py +0 -0
  174. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/transitlpf.py +0 -0
  175. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/lpf/ttvlpf.py +0 -0
  176. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/__init__.py +0 -0
  177. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/_deprecation.py +0 -0
  178. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/eclipse_model.py +0 -0
  179. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/gdmodel.py +0 -0
  180. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/general.py +0 -0
  181. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ldmodel.py +0 -0
  182. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ldtkldm.py +0 -0
  183. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/__init__.py +0 -0
  184. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/evaluation.py +0 -0
  185. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/exponential.py +0 -0
  186. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/general.py +0 -0
  187. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/linear.py +0 -0
  188. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/logarithmic.py +0 -0
  189. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/nonlinear.py +0 -0
  190. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/power_2.py +0 -0
  191. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/quadratic.py +0 -0
  192. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/quadratic_tri.py +0 -0
  193. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/square_root.py +0 -0
  194. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/limb_darkening/uniform.py +0 -0
  195. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ma_chromosphere.py +0 -0
  196. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ma_quadratic.py +0 -0
  197. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ma_quadratic_cl.py +0 -0
  198. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ma_uniform.py +0 -0
  199. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/ma_uniform_cl.py +0 -0
  200. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/new_eclipse_model.py +0 -0
  201. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/__init__.py +0 -0
  202. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/gdmodel.py +0 -0
  203. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/general_nb.py +0 -0
  204. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/ldmodels.py +0 -0
  205. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/ldtkldm.py +0 -0
  206. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/ma_chromosphere_nb.py +0 -0
  207. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/ma_quadratic_nb.py +0 -0
  208. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/ma_uniform_nb.py +0 -0
  209. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/phasecurves.py +0 -0
  210. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/qpower2_nb.py +0 -0
  211. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/spmodel.py +0 -0
  212. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/numba/udmodel.py +0 -0
  213. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/opencl/ma_quadratic.cl +0 -0
  214. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/opencl/ma_uniform.cl +0 -0
  215. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/opencl/orbits.cl +0 -0
  216. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/opencl/qpower2.cl +0 -0
  217. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/opencltransitmodel.py +0 -0
  218. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/osmodel.py +0 -0
  219. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/qpower2.py +0 -0
  220. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/qpower2_cl.py +0 -0
  221. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/__init__.py +0 -0
  222. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/ecintersection.py +0 -0
  223. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/esmodel.py +0 -0
  224. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/model_eclipse.py +0 -0
  225. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/model_ecspec.py +0 -0
  226. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/model_full.py +0 -0
  227. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/model_simple.py +0 -0
  228. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/opmodel.py +0 -0
  229. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/opmodel_full.py +0 -0
  230. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/rrmodel.cl +0 -0
  231. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/rrmodel.py +0 -0
  232. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/roadrunner/rrmodel_cl.py +0 -0
  233. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/transitmodel.py +0 -0
  234. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/models/uniform.py +0 -0
  235. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/orbits/__init__.py +0 -0
  236. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/orbits/orbits.py +0 -0
  237. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/orbits/orbits_py.py +0 -0
  238. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/orbits/taylor_z.py +0 -0
  239. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/param/__init__.py +0 -0
  240. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/param/parameter.py +0 -0
  241. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/param/prior.py +0 -0
  242. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/param/utilities.py +0 -0
  243. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/stars/__init__.py +0 -0
  244. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/stars/btsettl.py +0 -0
  245. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/stars/data/avg_bt_settl.fits +0 -0
  246. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/stars/data/avg_husser2013.fits +0 -0
  247. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/stars/husser2013.py +0 -0
  248. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/__init__.py +0 -0
  249. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/astrometry.py +0 -0
  250. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/constants.py +0 -0
  251. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/de.py +0 -0
  252. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/downsample.py +0 -0
  253. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/eclipses.py +0 -0
  254. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/io/__init__.py +0 -0
  255. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/io/base.py +0 -0
  256. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/io/lcdata.py +0 -0
  257. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/io/rvdata.py +0 -0
  258. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/keplerlc.py +0 -0
  259. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/mdwarfs.py +0 -0
  260. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/misc.py +0 -0
  261. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/mocklc.py +0 -0
  262. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/octasphere.py +0 -0
  263. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/phasecurves.py +0 -0
  264. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/physics.py +0 -0
  265. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/rv.py +0 -0
  266. {pytransit-2.9.3 → pytransit-2.10.0}/pytransit/utils/tess.py +0 -0
  267. {pytransit-2.9.3 → pytransit-2.10.0}/requirements.txt +0 -0
  268. {pytransit-2.9.3 → pytransit-2.10.0}/setup.cfg +0 -0
  269. {pytransit-2.9.3 → pytransit-2.10.0}/tests/__init__.py +0 -0
  270. {pytransit-2.9.3 → pytransit-2.10.0}/tests/conftest.py +0 -0
  271. {pytransit-2.9.3 → pytransit-2.10.0}/tests/reference_flux.npz +0 -0
  272. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_contamination.py +0 -0
  273. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_ecintersection.py +0 -0
  274. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_lcdata.py +0 -0
  275. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_limb_darkening.py +0 -0
  276. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_lpf_plotting.py +0 -0
  277. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_lpf_pool.py +0 -0
  278. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_lstsqbaseline.py +0 -0
  279. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_ma_quadratic.py +0 -0
  280. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_ma_quadratic_nb.py +0 -0
  281. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_opencl_kernels.py +0 -0
  282. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_opencl_set_data.py +0 -0
  283. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_opmodel.py +0 -0
  284. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_qpower2_nb.py +0 -0
  285. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_roadrunner_eclipse.py +0 -0
  286. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_rrmodel.py +0 -0
  287. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_rrmodel_cl.py +0 -0
  288. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_rrmodel_population.py +0 -0
  289. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_rrmodel_quadrature.py +0 -0
  290. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_rvdata.py +0 -0
  291. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_uniform_model.py +0 -0
  292. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_uniform_model_nb.py +0 -0
  293. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_z.py +0 -0
  294. {pytransit-2.9.3 → pytransit-2.10.0}/tests/test_zgrid.py +0 -0
  295. {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyTransit
3
- Version: 2.9.3
3
+ Version: 2.10.0
4
4
  Summary: Fast and painless exoplanet transit light curve modelling.
5
5
  Author-email: Hannu Parviainen <hpparvi@gmail.com>
6
6
  License: GPLv2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyTransit
3
- Version: 2.9.3
3
+ Version: 2.10.0
4
4
  Summary: Fast and painless exoplanet transit light curve modelling.
5
5
  Author-email: Hannu Parviainen <hpparvi@gmail.com>
6
6
  License: GPLv2
@@ -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,8 @@
1
+ {
2
+ "tag": "2.10.0",
3
+ "distance": 0,
4
+ "node": "gd00e4aa7f2acddc4def8914ba5a45656e7419b4c",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-19"
8
+ }
@@ -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.