PyTransit 2.6.3__tar.gz → 2.6.5__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.6.3 → pytransit-2.6.5}/MANIFEST.in +2 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/PKG-INFO +3 -2
- {pytransit-2.6.3 → pytransit-2.6.5}/PyTransit.egg-info/PKG-INFO +3 -2
- {pytransit-2.6.3 → pytransit-2.6.5}/PyTransit.egg-info/SOURCES.txt +5 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/README.md +2 -1
- {pytransit-2.6.3 → pytransit-2.6.5}/pyproject.toml +1 -1
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/rvlpf.py +16 -9
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/eclipse_model.py +1 -70
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ldtkldm.py +12 -4
- pytransit-2.6.5/pytransit/models/numba/ldtkldm.py +91 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/udmodel.py +1 -2
- pytransit-2.6.5/pytransit/models/roadrunner/ecintersection.py +137 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/model_trspec.py +24 -19
- pytransit-2.6.5/pytransit/models/roadrunner/opmodel.py +111 -0
- pytransit-2.6.5/pytransit/models/roadrunner/opmodel_full.py +245 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/rrmodel.py +38 -17
- pytransit-2.6.5/pytransit/models/roadrunner/rrmodel_cl.py +369 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/tsmodel.py +14 -5
- pytransit-2.6.5/pytransit/utils/io/__init__.py +0 -0
- pytransit-2.6.3/pytransit/models/roadrunner/__init__.py +0 -1
- {pytransit-2.6.3 → pytransit-2.6.5}/LICENSE +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/PyTransit.egg-info/dependency_links.txt +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/PyTransit.egg-info/requires.txt +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/PyTransit.egg-info/top_level.txt +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/contamination.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/data/spectra.h5 +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/data/transmission.nc +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/filter.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/instrument.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/contamination/plotting.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/limb_darkening.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/baselines/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/baselines/legendrebaseline.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/baselines/linearbaseline.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/cntlpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/eclipselpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/celeriteloglikelihood.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/clloglikelihood.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/fmcloglikelihood.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/logisticloglikelihood.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/multiceleriteloglikelihood.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/loglikelihood/wnloglikelihood.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/logposteriorfunction.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/lpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/mclpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/mptlpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/ocllpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/ocltdvlpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/oclttvlpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/phasecurvelpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tdvlpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/ctesslpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/tessttvlpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/tgclpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/tgcmplpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tess/tmpclpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tesslpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/tessoclttvlpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/transitanalysis.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/transitlpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/lpf/ttvlpf.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/gdmodel.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/general.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ldmodel.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/general.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/linear.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/nonlinear.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/power_2.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/quadratic.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/quadratic_tri.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/limb_darkening/uniform.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ma_chromosphere.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ma_quadratic.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ma_quadratic_cl.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ma_uniform.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/ma_uniform_cl.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/gdmodel.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/general_nb.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/ldmodels.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/ma_chromosphere_nb.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/ma_quadratic_nb.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/ma_uniform_nb.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/phasecurves.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/qpower2_nb.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/rrmodel.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/numba/spmodel.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/opencl/ma_quadratic.cl +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/opencl/ma_uniform.cl +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/opencl/orbits.cl +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/opencl/qpower2.cl +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/osmodel.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/qpower2.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/qpower2_cl.py +0 -0
- {pytransit-2.6.3/pytransit/utils/io → pytransit-2.6.5/pytransit/models/roadrunner}/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/common.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/model.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/model_full.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/model_simple.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/roadrunner/rrmodel.cl +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/transitmodel.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/models/uniform.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/orbits/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/orbits/orbits.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/orbits/orbits_py.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/orbits/taylor_z.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/param/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/param/parameter.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/param/prior.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/param/utilities.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/stars/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/stars/btsettl.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/stars/data/avg_bt_settl.fits +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/stars/data/avg_husser2013.fits +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/stars/husser2013.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/__init__.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/astrometry.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/constants.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/de.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/downsample.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/eclipses.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/io/lightcurvedata.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/keplerlc.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/mdwarfs.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/misc.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/mocklc.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/octasphere.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/phasecurves.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/physics.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/rv.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/utils/tess.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/pytransit/version.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/setup.cfg +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_contamination.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_ma_quadratic.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_ma_quadratic_nb.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_qpower2_nb.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_uniform_model.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_uniform_model_nb.py +0 -0
- {pytransit-2.6.3 → pytransit-2.6.5}/tests/test_z.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: PyTransit
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.5
|
|
4
4
|
Summary: Fast and painless exoplanet transit light curve modelling.
|
|
5
5
|
Author-email: Hannu Parviainen <hpparvi@gmail.com>
|
|
6
6
|
License: GPLv2
|
|
@@ -43,7 +43,8 @@ PyTransit
|
|
|
43
43
|
|
|
44
44
|
*PyTransit: fast and versatile exoplanet transit light curve modelling in Python.* PyTransit provides a set of optimised
|
|
45
45
|
transit models with a unified API that makes modelling complex sets of heterogeneous light curve (nearly) as easy as
|
|
46
|
-
modelling individual transit light curves.
|
|
46
|
+
modelling individual transit light curves. The models are optimised with Numba which allows for model evaluation speeds
|
|
47
|
+
paralleling Fortran and C-implementations but with hassle-free platform-independent multithreading.
|
|
47
48
|
|
|
48
49
|
The package has been under continuous development since 2009, and is described in [Parviainen (2015)](http://arxiv.org/abs/1504.07433),
|
|
49
50
|
[Parviainen (2020a)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.1633P/abstract), and [Parviainen (2020b)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.3356P/abstract).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: PyTransit
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.5
|
|
4
4
|
Summary: Fast and painless exoplanet transit light curve modelling.
|
|
5
5
|
Author-email: Hannu Parviainen <hpparvi@gmail.com>
|
|
6
6
|
License: GPLv2
|
|
@@ -43,7 +43,8 @@ PyTransit
|
|
|
43
43
|
|
|
44
44
|
*PyTransit: fast and versatile exoplanet transit light curve modelling in Python.* PyTransit provides a set of optimised
|
|
45
45
|
transit models with a unified API that makes modelling complex sets of heterogeneous light curve (nearly) as easy as
|
|
46
|
-
modelling individual transit light curves.
|
|
46
|
+
modelling individual transit light curves. The models are optimised with Numba which allows for model evaluation speeds
|
|
47
|
+
paralleling Fortran and C-implementations but with hassle-free platform-independent multithreading.
|
|
47
48
|
|
|
48
49
|
The package has been under continuous development since 2009, and is described in [Parviainen (2015)](http://arxiv.org/abs/1504.07433),
|
|
49
50
|
[Parviainen (2020a)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.1633P/abstract), and [Parviainen (2020b)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.3356P/abstract).
|
|
@@ -79,6 +79,7 @@ pytransit/models/numba/__init__.py
|
|
|
79
79
|
pytransit/models/numba/gdmodel.py
|
|
80
80
|
pytransit/models/numba/general_nb.py
|
|
81
81
|
pytransit/models/numba/ldmodels.py
|
|
82
|
+
pytransit/models/numba/ldtkldm.py
|
|
82
83
|
pytransit/models/numba/ma_chromosphere_nb.py
|
|
83
84
|
pytransit/models/numba/ma_quadratic_nb.py
|
|
84
85
|
pytransit/models/numba/ma_uniform_nb.py
|
|
@@ -93,12 +94,16 @@ pytransit/models/opencl/orbits.cl
|
|
|
93
94
|
pytransit/models/opencl/qpower2.cl
|
|
94
95
|
pytransit/models/roadrunner/__init__.py
|
|
95
96
|
pytransit/models/roadrunner/common.py
|
|
97
|
+
pytransit/models/roadrunner/ecintersection.py
|
|
96
98
|
pytransit/models/roadrunner/model.py
|
|
97
99
|
pytransit/models/roadrunner/model_full.py
|
|
98
100
|
pytransit/models/roadrunner/model_simple.py
|
|
99
101
|
pytransit/models/roadrunner/model_trspec.py
|
|
102
|
+
pytransit/models/roadrunner/opmodel.py
|
|
103
|
+
pytransit/models/roadrunner/opmodel_full.py
|
|
100
104
|
pytransit/models/roadrunner/rrmodel.cl
|
|
101
105
|
pytransit/models/roadrunner/rrmodel.py
|
|
106
|
+
pytransit/models/roadrunner/rrmodel_cl.py
|
|
102
107
|
pytransit/models/roadrunner/tsmodel.py
|
|
103
108
|
pytransit/orbits/__init__.py
|
|
104
109
|
pytransit/orbits/orbits.py
|
|
@@ -9,7 +9,8 @@ PyTransit
|
|
|
9
9
|
|
|
10
10
|
*PyTransit: fast and versatile exoplanet transit light curve modelling in Python.* PyTransit provides a set of optimised
|
|
11
11
|
transit models with a unified API that makes modelling complex sets of heterogeneous light curve (nearly) as easy as
|
|
12
|
-
modelling individual transit light curves.
|
|
12
|
+
modelling individual transit light curves. The models are optimised with Numba which allows for model evaluation speeds
|
|
13
|
+
paralleling Fortran and C-implementations but with hassle-free platform-independent multithreading.
|
|
13
14
|
|
|
14
15
|
The package has been under continuous development since 2009, and is described in [Parviainen (2015)](http://arxiv.org/abs/1504.07433),
|
|
15
16
|
[Parviainen (2020a)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.1633P/abstract), and [Parviainen (2020b)](https://ui.adsabs.harvard.edu/abs/2020MNRAS.499.3356P/abstract).
|
|
@@ -57,7 +57,7 @@ def lnlike_normal(o, m, e):
|
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
class RVLPF(LogPosteriorFunction):
|
|
60
|
-
def __init__(self, name: str, nplanets: int, times, rvs, rves, rvis=None):
|
|
60
|
+
def __init__(self, name: str, nplanets: int, times, rvs, rves, rvis=None, slope_order: int = 1):
|
|
61
61
|
super().__init__(name)
|
|
62
62
|
|
|
63
63
|
def transform_input(a):
|
|
@@ -77,7 +77,7 @@ class RVLPF(LogPosteriorFunction):
|
|
|
77
77
|
rvis = zeros(len(times), 'int')
|
|
78
78
|
|
|
79
79
|
self._tref = concatenate(times).mean()
|
|
80
|
-
self.rvm: RVModel = RVModel(self, nplanets, times, rvs, rves, rvis)
|
|
80
|
+
self.rvm: RVModel = RVModel(self, nplanets, times, rvs, rves, rvis, slope_order=slope_order)
|
|
81
81
|
|
|
82
82
|
def model(self, pv):
|
|
83
83
|
return self.rvm.rv_model(pv)
|
|
@@ -103,7 +103,7 @@ class RVModel:
|
|
|
103
103
|
|
|
104
104
|
def __init__(self, lpf: LogPosteriorFunction, nplanets: int,
|
|
105
105
|
times, rvs: Iterable, rves: Iterable, rvis: Iterable,
|
|
106
|
-
tref: Optional[float] = None):
|
|
106
|
+
tref: Optional[float] = None, slope_order: int = 1):
|
|
107
107
|
self.lpf = lpf
|
|
108
108
|
|
|
109
109
|
if hasattr(lpf, 'nplanets'):
|
|
@@ -125,6 +125,7 @@ class RVModel:
|
|
|
125
125
|
self._rva = None
|
|
126
126
|
self._rvea = None
|
|
127
127
|
self._rv_ids = None
|
|
128
|
+
self.slope_order = slope_order
|
|
128
129
|
|
|
129
130
|
self.setup_data(times, rvs, rves, rvis)
|
|
130
131
|
|
|
@@ -183,7 +184,7 @@ class RVModel:
|
|
|
183
184
|
self._start_rvk = ps.blocks[-1].start
|
|
184
185
|
self._sl_rvk = ps.blocks[-1].slice
|
|
185
186
|
|
|
186
|
-
psl = [GParameter('
|
|
187
|
+
psl = [GParameter(f'rv_slope_{i}', 'rv slope', '', NP(0.0, 1.0), (-inf, inf)) for i in range(1, self.slope_order+1)]
|
|
187
188
|
ps.add_global_block('rv_slope', psl)
|
|
188
189
|
self._start_rv_slope = ps.blocks[-1].start
|
|
189
190
|
self._sl_rv_slope = ps.blocks[-1].slice
|
|
@@ -202,7 +203,10 @@ class RVModel:
|
|
|
202
203
|
|
|
203
204
|
def rv_slope(self, pvp, times):
|
|
204
205
|
pvp = atleast_2d(pvp)
|
|
205
|
-
|
|
206
|
+
slope = times * pvp[:, self._start_rv_slope : self._start_rv_slope + 1]
|
|
207
|
+
if self.slope_order == 2:
|
|
208
|
+
slope += times**2 * pvp[:, self._start_rv_slope + 1: self._start_rv_slope + 2]
|
|
209
|
+
return slope
|
|
206
210
|
|
|
207
211
|
def rv_model(self, pvp, times=None, planets=None, add_sv=True, add_slope=True):
|
|
208
212
|
times = self._timea if times is None else times - self._tref
|
|
@@ -264,10 +268,10 @@ class RVModel:
|
|
|
264
268
|
rv_time = linspace(self._timea.min() - 1, self._timea.max() + 1, num=ntimes) + self._tref
|
|
265
269
|
|
|
266
270
|
if pvp is None:
|
|
267
|
-
rv_model = self.rv_model(pv, rv_time, add_sv=False)
|
|
271
|
+
rv_model = self.rv_model(pv, rv_time, add_sv=False, add_slope=slope)
|
|
268
272
|
rv_model_limits = None
|
|
269
273
|
else:
|
|
270
|
-
rv_percentiles = percentile(self.rv_model(pvp, rv_time, add_sv=False), [50, 16, 84, 2.5, 97.5], 0)
|
|
274
|
+
rv_percentiles = percentile(self.rv_model(pvp, rv_time, add_sv=False, add_slope=slope), [50, 16, 84, 2.5, 97.5], 0)
|
|
271
275
|
rv_model = rv_percentiles[0]
|
|
272
276
|
rv_model_limits = rv_percentiles[1:]
|
|
273
277
|
|
|
@@ -279,10 +283,13 @@ class RVModel:
|
|
|
279
283
|
colors = len(self.rvis) * ['k']
|
|
280
284
|
if markers is None:
|
|
281
285
|
markers = len(self.rvis) * ['.']
|
|
282
|
-
rvs = self._rva - self.rv_shifts(pv)
|
|
286
|
+
rvs = self._rva - self.rv_shifts(pv)
|
|
287
|
+
if not slope:
|
|
288
|
+
rvs -= squeeze(self.rv_slope(pv, self._timea))
|
|
289
|
+
|
|
283
290
|
for iid, instrument in enumerate(self.rvis):
|
|
284
291
|
m = self._rv_ids == iid
|
|
285
|
-
axs[0].errorbar(self._timea[m] + self._tref, rvs[m], self._rvea[m],
|
|
292
|
+
axs[0].errorbar(self._timea[m] + self._tref, rvs[m], self._rvea[m], marker=markers[iid], ls='',
|
|
286
293
|
c=colors[iid], ms=4, label=instrument)
|
|
287
294
|
axs[1].errorbar(self._timea[m] + self._tref, self._rva[m] - squeeze(self.rv_model(pv))[m], self._rvea[m],
|
|
288
295
|
fmt='ok', ms=4)
|
|
@@ -38,7 +38,7 @@ class EclipseModel(TransitModel):
|
|
|
38
38
|
Parameters
|
|
39
39
|
----------
|
|
40
40
|
k
|
|
41
|
-
Radius ratio(s) either as a single float
|
|
41
|
+
Radius ratio(s) either as a single float or a 1D vector.
|
|
42
42
|
t0
|
|
43
43
|
Transit center(s) as a float or a 1D vector.
|
|
44
44
|
p
|
|
@@ -97,72 +97,3 @@ class EclipseModel(TransitModel):
|
|
|
97
97
|
flux = 1.0 + (flux - 1.0) / k**2
|
|
98
98
|
|
|
99
99
|
return squeeze(flux)
|
|
100
|
-
|
|
101
|
-
def evaluate_ps(self, k: float, t0: float, p: float, a: float, i: float, e: float = 0., w: float = 0., fr: Optional[float] = None) -> ndarray:
|
|
102
|
-
"""Evaluate the transit model for a set of scalar parameters.
|
|
103
|
-
|
|
104
|
-
Parameters
|
|
105
|
-
----------
|
|
106
|
-
k : array-like
|
|
107
|
-
Radius ratio(s) either as a single float or an 1D array.
|
|
108
|
-
t0 : float
|
|
109
|
-
Transit center as a float.
|
|
110
|
-
p : float
|
|
111
|
-
Orbital period as a float.
|
|
112
|
-
a : float
|
|
113
|
-
Orbital semi-major axis divided by the stellar radius as a float.
|
|
114
|
-
i : float
|
|
115
|
-
Orbital inclination(s) as a float.
|
|
116
|
-
e : float, optional
|
|
117
|
-
Orbital eccentricity as a float.
|
|
118
|
-
w : float, optional
|
|
119
|
-
Argument of periastron as a float.
|
|
120
|
-
fr : float, optional
|
|
121
|
-
Planet-star flux ratio as a float.
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
Notes
|
|
125
|
-
-----
|
|
126
|
-
This version of the `evaluate` method is optimized for calculating a single transit model (such as when using a
|
|
127
|
-
local optimizer). If you want to evaluate the model for a large number of parameters simultaneously, use either
|
|
128
|
-
`evaluate` or `evaluate_pv`.
|
|
129
|
-
|
|
130
|
-
Returns
|
|
131
|
-
-------
|
|
132
|
-
ndarray
|
|
133
|
-
Modelled flux as a 1D ndarray.
|
|
134
|
-
"""
|
|
135
|
-
if self.time is None:
|
|
136
|
-
raise ValueError("Need to set the data before calling the transit model.")
|
|
137
|
-
|
|
138
|
-
k = asarray(k)
|
|
139
|
-
flux = uniform_model_s(self.time, k, t0, p, a, i, e, w, self.lcids, self.pbids, self.nsamples, self.exptimes, zsign=-1.0)
|
|
140
|
-
if fr is not None:
|
|
141
|
-
flux = 1.0 + (flux - 1.0) * fr
|
|
142
|
-
return squeeze(flux)
|
|
143
|
-
|
|
144
|
-
def evaluate_pv(self, pvp: ndarray, fr = None) -> ndarray:
|
|
145
|
-
"""Evaluate the transit model for a 2D parameter array.
|
|
146
|
-
|
|
147
|
-
Parameters
|
|
148
|
-
----------
|
|
149
|
-
pvp
|
|
150
|
-
Parameter array with a shape `(npv, npar)` where `npv` is the number of parameter vectors, and each row
|
|
151
|
-
contains a set of parameters `[k, t0, p, a, i, e, w]`. The radius ratios can also be given per passband,
|
|
152
|
-
in which case the row should be structured as `[k_0, k_1, k_2, ..., k_npb, t0, p, a, i, e, w]`.
|
|
153
|
-
|
|
154
|
-
Notes
|
|
155
|
-
-----
|
|
156
|
-
This version of the `evaluate` method is optimized for calculating several models in parallel, such as when
|
|
157
|
-
using *emcee* for MCMC sampling.
|
|
158
|
-
|
|
159
|
-
Returns
|
|
160
|
-
-------
|
|
161
|
-
ndarray
|
|
162
|
-
Modelled flux either as a 1D or 2D ndarray.
|
|
163
|
-
"""
|
|
164
|
-
assert self.time is not None, "Need to set the data before calling the transit model."
|
|
165
|
-
flux = uniform_model_pv(self.time, pvp, self.lcids, self.pbids, self.nsamples, self.exptimes, zsign=-1.0)
|
|
166
|
-
if fr is not None:
|
|
167
|
-
flux = 1.0 + (flux - 1.0) * fr
|
|
168
|
-
return squeeze(flux)
|
|
@@ -18,7 +18,7 @@ from typing import Tuple, Optional, Union
|
|
|
18
18
|
from pathlib import Path
|
|
19
19
|
|
|
20
20
|
from numba import njit
|
|
21
|
-
from numpy import zeros, interp, pi, ndarray, linspace, meshgrid, transpose
|
|
21
|
+
from numpy import zeros, interp, pi, ndarray, linspace, meshgrid, transpose, asarray, newaxis, errstate
|
|
22
22
|
from scipy.interpolate import interpn, interpnd, RegularGridInterpolator as RGI
|
|
23
23
|
|
|
24
24
|
from .ldmodel import LDModel
|
|
@@ -67,13 +67,21 @@ class LDTkLDModel(LDModel):
|
|
|
67
67
|
self.logg0, self.dlogg, self.nlogg = loggs[0], loggs[1]-loggs[0], self.sc.client.nlogg
|
|
68
68
|
self.metal0, self.dmetal, self.nmetal = zs[0], zs[1]-zs[0], self.sc.client.nz
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
with errstate(divide='ignore'):
|
|
71
|
+
self.ps = self.sc.create_profiles(teff=teffg.ravel(), logg=loggg.ravel(), metal=zg.ravel())
|
|
72
|
+
self.ps.resample(mu=self.mu)
|
|
73
|
+
self.profiles = transpose(self.ps._ldps.copy(), axes=(1, 0, 2)).reshape((self.nteff, self.nlogg, self.nmetal, self.npb, self.nmu))
|
|
73
74
|
|
|
74
75
|
def __call__(self, mu: ndarray, x: ndarray) -> Tuple[ndarray, ndarray]:
|
|
75
76
|
if self.mu is None or id(mu) != id(self.mu):
|
|
76
77
|
self._init_interpolation(mu)
|
|
78
|
+
|
|
79
|
+
x = asarray(x)
|
|
80
|
+
if x.ndim == 1:
|
|
81
|
+
x = x[newaxis, newaxis, :]
|
|
82
|
+
elif x.ndim == 2:
|
|
83
|
+
x = x[:, newaxis, :]
|
|
84
|
+
|
|
77
85
|
ldp = trilinear_interpolation_set(self.profiles, x[:, 0, 0], x[:, 0, 1], x[:, 0, 2],
|
|
78
86
|
self.teff0, self.dteff, self.nteff,
|
|
79
87
|
self.logg0, self.dlogg, self.nlogg,
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from numba import njit, prange
|
|
2
|
+
from numpy import zeros, floor, sqrt, pi
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@njit
|
|
6
|
+
def trilinear_interpolation_unit_cube(data, x, y, z):
|
|
7
|
+
"""Trilinear interpolation inside a unit cube.
|
|
8
|
+
|
|
9
|
+
Implementation taken from Paul Bourke's notes
|
|
10
|
+
https://paulbourke.net/miscellaneous/interpolation
|
|
11
|
+
"""
|
|
12
|
+
n1 = data.shape[3]
|
|
13
|
+
n2 = data.shape[4]
|
|
14
|
+
ldp = zeros((n1, n2))
|
|
15
|
+
rx, ry, rz = (1.0 - x), (1.0 - y), (1.0 - z)
|
|
16
|
+
|
|
17
|
+
a1 = rx * ry * rz
|
|
18
|
+
a2 = x * ry * rz
|
|
19
|
+
b1 = rx * y * rz
|
|
20
|
+
b2 = rx * ry * z
|
|
21
|
+
c1 = x * ry * z
|
|
22
|
+
c2 = rx * y * z
|
|
23
|
+
d1 = x * y * rz
|
|
24
|
+
d2 = x * y * z
|
|
25
|
+
|
|
26
|
+
for i1 in range(n1):
|
|
27
|
+
for i2 in range(n2):
|
|
28
|
+
ldp[i1, i2] = (data[0, 0, 0, i1, i2] * a1 +
|
|
29
|
+
data[1, 0, 0, i1, i2] * a2 +
|
|
30
|
+
data[0, 1, 0, i1, i2] * b1 +
|
|
31
|
+
data[0, 0, 1, i1, i2] * b2 +
|
|
32
|
+
data[1, 0, 1, i1, i2] * c1 +
|
|
33
|
+
data[0, 1, 1, i1, i2] * c2 +
|
|
34
|
+
data[1, 1, 0, i1, i2] * d1 +
|
|
35
|
+
data[1, 1, 1, i1, i2] * d2)
|
|
36
|
+
return ldp
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@njit
|
|
40
|
+
def trilinear_interpolation_single(data, x, y, z, x0, dx, nx, y0, dy, ny, z0, dz, nz):
|
|
41
|
+
x = min(max(x, x0), x0 + nx * dx)
|
|
42
|
+
y = min(max(y, y0), y0 + ny * dy)
|
|
43
|
+
z = min(max(z, z0), z0 + nz * dz)
|
|
44
|
+
ix = int(floor((x - x0) / dx))
|
|
45
|
+
iy = int(floor((y - y0) / dy))
|
|
46
|
+
iz = int(floor((z - z0) / dz))
|
|
47
|
+
ax = (x - x0 - ix * dx) / dx
|
|
48
|
+
ay = (y - y0 - iy * dy) / dy
|
|
49
|
+
az = (z - z0 - iz * dz) / dz
|
|
50
|
+
return trilinear_interpolation_unit_cube(data[ix:ix + 2, iy:iy + 2, iz:iz + 2, :, :], ax, ay, az)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@njit(parallel=True)
|
|
54
|
+
def trilinear_interpolation_set(data, xs, ys, zs, x0, dx, nx, y0, dy, ny, z0, dz, nz):
|
|
55
|
+
npv = xs.shape[0]
|
|
56
|
+
ldp = zeros((npv, data.shape[3], data.shape[4]))
|
|
57
|
+
for ipv in prange(npv):
|
|
58
|
+
ldp[ipv, :, :] = trilinear_interpolation_single(data, xs[ipv], ys[ipv], zs[ipv], x0, dx, nx, y0, dy, ny, z0, dz,
|
|
59
|
+
nz)
|
|
60
|
+
return ldp
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@njit
|
|
64
|
+
def integrate_profiles_single(mu, ldp):
|
|
65
|
+
nmu = mu.size
|
|
66
|
+
npb = ldp.shape[0]
|
|
67
|
+
ldi = zeros(npb)
|
|
68
|
+
|
|
69
|
+
z = sqrt(1.0 - mu ** 2)
|
|
70
|
+
dz = z[1:] - z[:-1]
|
|
71
|
+
for ipb in range(npb):
|
|
72
|
+
for i in range(1, nmu):
|
|
73
|
+
ldi[ipb] += dz[i - 1] * 0.5 * (z[i] * ldp[ipb, i] + z[i - 1] * ldp[ipb, i - 1])
|
|
74
|
+
return 2.0 * pi * ldi
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@njit(parallel=True)
|
|
78
|
+
def integrate_profiles_set(mu, ldp):
|
|
79
|
+
nmu = mu.size
|
|
80
|
+
npv = ldp.shape[0]
|
|
81
|
+
npb = ldp.shape[1]
|
|
82
|
+
ldi = zeros((npv, npb))
|
|
83
|
+
|
|
84
|
+
z = sqrt(1.0 - mu ** 2)
|
|
85
|
+
dz = z[1:] - z[:-1]
|
|
86
|
+
for j in prange(npv * npb):
|
|
87
|
+
ipv = j // npb
|
|
88
|
+
ipb = j % npb
|
|
89
|
+
for i in range(1, nmu):
|
|
90
|
+
ldi[ipv, ipb] += dz[i - 1] * 0.5 * (z[i] * ldp[ipv, ipb, i] + z[i - 1] * ldp[ipv, ipb, i - 1])
|
|
91
|
+
return 2.0 * pi * ldi
|
|
@@ -80,8 +80,7 @@ def uniform_model_simple(times, k, t0, p, a, i, e, w, with_derivatives):
|
|
|
80
80
|
|
|
81
81
|
|
|
82
82
|
@njit
|
|
83
|
-
def uniform_model_v(times, k, t0, p, dkdp, cfs, dcfs, with_derivatives,
|
|
84
|
-
lcids, pbids, epids, nsamples, exptimes):
|
|
83
|
+
def uniform_model_v(times, k, t0, p, dkdp, cfs, dcfs, with_derivatives, lcids, pbids, epids, nsamples, exptimes):
|
|
85
84
|
k = atleast_1d(asarray(k))
|
|
86
85
|
dkdp = atleast_1d(asarray(dkdp))
|
|
87
86
|
t0 = atleast_1d(asarray(t0))
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
from math import cos, sin, sqrt, isfinite, nan
|
|
2
|
+
|
|
3
|
+
from numpy import ndarray, fabs, pi, full, arange
|
|
4
|
+
from numba import njit
|
|
5
|
+
|
|
6
|
+
@njit
|
|
7
|
+
def create_ellipse(ny: int, k: float, f: float, a: float) -> (ndarray, ndarray):
|
|
8
|
+
"""
|
|
9
|
+
Create the coordinates for a rotated ellipse.
|
|
10
|
+
|
|
11
|
+
Parameters
|
|
12
|
+
----------
|
|
13
|
+
ny : int
|
|
14
|
+
The number of sample points along the y-axis.
|
|
15
|
+
k : float
|
|
16
|
+
Scale factor for the ellipse.
|
|
17
|
+
f : float
|
|
18
|
+
Flattening factor for the ellipse. Determines the extent to which the ellipse is squashed along the y-axis.
|
|
19
|
+
a : float
|
|
20
|
+
The angle of rotation for the ellipse in radians.
|
|
21
|
+
|
|
22
|
+
Returns
|
|
23
|
+
-------
|
|
24
|
+
(ndarray, ndarray)
|
|
25
|
+
A tuple containing two ndarrays. The first ndarray is a 1D array of y-coordinates, and the second is a 2D array of x-coordinates
|
|
26
|
+
corresponding to the left and right intersections of the ellipse with vertical lines through the y-coordinates.
|
|
27
|
+
|
|
28
|
+
Notes
|
|
29
|
+
-----
|
|
30
|
+
The ellipse is initially defined with its major axis aligned with the x-axis. It is then rotated by an angle `a` and scaled by a factor `k`.
|
|
31
|
+
The flattening factor `f` adjusts the size of the minor axis relative to the major axis, with a smaller value indicating a more flattened ellipse.
|
|
32
|
+
"""
|
|
33
|
+
dy = 2 / (ny+1)
|
|
34
|
+
ys = arange(1, 1+ny)*dy - 1
|
|
35
|
+
xs = full((ny, 2), nan)
|
|
36
|
+
ca, sa = cos(a), sin(a)
|
|
37
|
+
b = 1.0 - f
|
|
38
|
+
b2 = b * b
|
|
39
|
+
ca2 = ca * ca
|
|
40
|
+
sa2 = sa * sa
|
|
41
|
+
|
|
42
|
+
for i in range(ny):
|
|
43
|
+
y = ys[i]
|
|
44
|
+
y2 = y * y
|
|
45
|
+
d = b2 * ca2 + ca2 * ca2 * (-y2) - 2 * ca2 * sa2 * y2 - sa2 * sa2 * y2 + sa2
|
|
46
|
+
if d >= 0:
|
|
47
|
+
d = sqrt(d) / b
|
|
48
|
+
u = (ca * sa * y) / b2 - ca * sa * y
|
|
49
|
+
v = sa2 / b2 + ca2
|
|
50
|
+
xs[i, 0] = (-d + u) / v
|
|
51
|
+
xs[i, 1] = (d + u) / v
|
|
52
|
+
return k*ys, k*xs
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@njit
|
|
56
|
+
def ellipse_circle_intersection_area(cx: float, cy: float, z: float, k: float, f: float, xs: ndarray, ys: ndarray) -> float:
|
|
57
|
+
"""
|
|
58
|
+
Calculate the intersection area between a rotated ellipse and a circle using a scanline fill approach.
|
|
59
|
+
|
|
60
|
+
Parameters
|
|
61
|
+
----------
|
|
62
|
+
cx : float
|
|
63
|
+
The ellipse's center x coordinate.
|
|
64
|
+
cy : float
|
|
65
|
+
The ellipse's center y coordinate.
|
|
66
|
+
z : float
|
|
67
|
+
The center-center distance.
|
|
68
|
+
k : float
|
|
69
|
+
Radius ratio.
|
|
70
|
+
f : float
|
|
71
|
+
Flattening factor for the ellipse. Determines the extent to which the ellipse is squashed along the y-axis.
|
|
72
|
+
xs : ndarray
|
|
73
|
+
2D array of x-coordinates corresponding to the left and right intersections of the ellipse with vertical lines through the y-coordinates.
|
|
74
|
+
ys : ndarray
|
|
75
|
+
1D array of y-coordinates.
|
|
76
|
+
|
|
77
|
+
Returns
|
|
78
|
+
-------
|
|
79
|
+
float
|
|
80
|
+
The area of the intersection between the given ellipse and circle.
|
|
81
|
+
|
|
82
|
+
Notes
|
|
83
|
+
-----
|
|
84
|
+
This function employs a numerical method that iterates over a set of horizontal lines (scanlines)
|
|
85
|
+
to approximate the area of intersection between a circle and a rotated ellipse. The calculation considers
|
|
86
|
+
the rotation of the ellipse, its eccentricity, and the relative position of the ellipse to the circle.
|
|
87
|
+
The approach is based on the principles of scanline fill in computer graphics, adapted to the mathematical
|
|
88
|
+
properties of ellipses and circles.
|
|
89
|
+
|
|
90
|
+
The algorithm calculates the intersection points between each scanline and the ellipse, then integrates these
|
|
91
|
+
intersections over the range of y-coordinates to find the total area. It handles different cases based on the
|
|
92
|
+
relative position and size of the ellipse to optimize calculations.
|
|
93
|
+
"""
|
|
94
|
+
if z <= 1.0 - k:
|
|
95
|
+
return pi * k * (1.0 - f) * k
|
|
96
|
+
elif z >= 1.0 + k:
|
|
97
|
+
return 0.0
|
|
98
|
+
else:
|
|
99
|
+
ny = ys.size
|
|
100
|
+
dy = (ys[1] - ys[0])
|
|
101
|
+
l = 0.0
|
|
102
|
+
if cx < -k:
|
|
103
|
+
for i in range(ny):
|
|
104
|
+
if isfinite(xs[i, 0]):
|
|
105
|
+
xstar = -sqrt(1.0 - (ys[i] + cy) ** 2) - cx
|
|
106
|
+
if xstar <= xs[i, 0]:
|
|
107
|
+
l += xs[i, 1] - xs[i, 0]
|
|
108
|
+
elif xstar <= xs[i, 1]:
|
|
109
|
+
l += xs[i, 1] - xstar
|
|
110
|
+
elif cx > k:
|
|
111
|
+
for i in range(ny):
|
|
112
|
+
if isfinite(xs[i, 0]):
|
|
113
|
+
xstar = sqrt(1.0 - (ys[i] + cy) ** 2) - cx
|
|
114
|
+
if xstar >= xs[i, 1]:
|
|
115
|
+
l += xs[i, 1] - xs[i, 0]
|
|
116
|
+
elif xstar >= xs[i, 0]:
|
|
117
|
+
l += xstar - xs[i, 0]
|
|
118
|
+
else:
|
|
119
|
+
for i in range(ny):
|
|
120
|
+
if isfinite(xs[i, 0]):
|
|
121
|
+
if fabs(ys[i] + cy) <= 1.0:
|
|
122
|
+
xstar = sqrt(1.0 - (ys[i] + cy) ** 2)
|
|
123
|
+
xst1 = -xstar - cx
|
|
124
|
+
xst2 = xstar - cx
|
|
125
|
+
if xst1 <= xs[i, 0]:
|
|
126
|
+
l += min(xst2, xs[i, 1]) - xs[i, 0]
|
|
127
|
+
elif xst1 > xs[i, 0]:
|
|
128
|
+
l += min(xst2, xs[i, 1]) - xst1
|
|
129
|
+
return l*dy
|
|
130
|
+
|
|
131
|
+
#else:
|
|
132
|
+
# for i in range(ny):
|
|
133
|
+
# if isfinite(xs[i,0]):
|
|
134
|
+
# xstar = sqrt(1.0 - (ys[i])**2) - b
|
|
135
|
+
# if xstar < xs[i,1]:
|
|
136
|
+
# l += xs[i,1]- max(xstar, xs[i,0])
|
|
137
|
+
# return pi*k*k*(1.0-f) - l*dy
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from math import fabs, floor
|
|
2
|
-
from numba import njit, prange
|
|
2
|
+
from numba import njit, prange, get_num_threads, set_num_threads
|
|
3
3
|
from numpy import zeros, dot, ndarray, isnan, full, nan, mean, floor, fabs
|
|
4
4
|
|
|
5
5
|
from meepmeep.xy.position import solve_xy_p5s, pd_t15sc
|
|
@@ -13,7 +13,7 @@ from .common import circle_circle_intersection_area_kite as ccia
|
|
|
13
13
|
def tsmodel_serial(times: ndarray,
|
|
14
14
|
k: ndarray, t0: ndarray, p: ndarray, a: ndarray, i: ndarray, e: ndarray, w: ndarray,
|
|
15
15
|
nsamples: ndarray, exptimes: ndarray, ldp: ndarray, istar: ndarray,
|
|
16
|
-
weights: ndarray, dk: float, kmin: float, kmax: float, dg: float, z_edges: ndarray) -> ndarray:
|
|
16
|
+
weights: ndarray, dk: float, kmin: float, kmax: float, ng: int, dg: float, z_edges: ndarray) -> ndarray:
|
|
17
17
|
if k.ndim != 2:
|
|
18
18
|
raise ValueError(" The radius ratios must be given as a 2D array with shape (npv, npb)")
|
|
19
19
|
|
|
@@ -26,7 +26,9 @@ def tsmodel_serial(times: ndarray,
|
|
|
26
26
|
npt = times.size
|
|
27
27
|
npv = k.shape[0]
|
|
28
28
|
npb = k.shape[1]
|
|
29
|
-
|
|
29
|
+
|
|
30
|
+
if weights is not None:
|
|
31
|
+
ng = weights.shape[1]
|
|
30
32
|
|
|
31
33
|
flux = zeros((npv, npb, npt)) # Model flux
|
|
32
34
|
ldm = zeros((npb, ng)) # Limb darkening means
|
|
@@ -43,14 +45,13 @@ def tsmodel_serial(times: ndarray,
|
|
|
43
45
|
# -----------------------------------#
|
|
44
46
|
# Calculate the limb darkening means #
|
|
45
47
|
# -----------------------------------#
|
|
46
|
-
if kmin <= kmean <= kmax:
|
|
48
|
+
if weights is not None and kmin <= kmean <= kmax:
|
|
47
49
|
ik = int(floor((kmean - kmin) / dk))
|
|
48
50
|
ak = (kmean - kmin - ik * dk) / dk
|
|
49
51
|
for ipb in range(npb):
|
|
50
|
-
ldm[ipb, :] = (1.0 - ak) * dot(weights[ik], ldp[ipv, ipb, :]) + ak * dot(weights[ik + 1],
|
|
51
|
-
ldp[ipv, ipb, :])
|
|
52
|
+
ldm[ipb, :] = (1.0 - ak) * dot(weights[ik], ldp[ipv, ipb, :]) + ak * dot(weights[ik + 1], ldp[ipv, ipb, :])
|
|
52
53
|
else:
|
|
53
|
-
_,
|
|
54
|
+
_, dg, wg = calculate_weights_2d(kmean, z_edges, ng)
|
|
54
55
|
for ipb in range(npb):
|
|
55
56
|
ldm[ipb, :] = dot(wg, ldp[ipv, ipb, :])
|
|
56
57
|
|
|
@@ -89,7 +90,12 @@ def tsmodel_serial(times: ndarray,
|
|
|
89
90
|
def tsmodel_parallel(times: ndarray,
|
|
90
91
|
k: ndarray, t0: ndarray, p: ndarray, a: ndarray, i: ndarray, e: ndarray, w: ndarray,
|
|
91
92
|
nsamples: ndarray, exptimes: ndarray, ldp: ndarray, istar: ndarray,
|
|
92
|
-
weights: ndarray, dk: float, kmin: float, kmax: float, dg: float, z_edges: ndarray
|
|
93
|
+
weights: ndarray, dk: float, kmin: float, kmax: float, ng: int, dg: float, z_edges: ndarray,
|
|
94
|
+
nthreads: int) -> ndarray:
|
|
95
|
+
|
|
96
|
+
#nthreads_current = get_num_threads()
|
|
97
|
+
#set_num_threads(nthreads)
|
|
98
|
+
|
|
93
99
|
if k.ndim != 2:
|
|
94
100
|
raise ValueError(" The radius ratios must be given as a 2D array with shape (npv, npb)")
|
|
95
101
|
|
|
@@ -102,7 +108,8 @@ def tsmodel_parallel(times: ndarray,
|
|
|
102
108
|
npt = times.size
|
|
103
109
|
npv = k.shape[0]
|
|
104
110
|
npb = k.shape[1]
|
|
105
|
-
|
|
111
|
+
if weights is not None:
|
|
112
|
+
ng = weights.shape[1]
|
|
106
113
|
|
|
107
114
|
flux = zeros((npv, npb, npt)) # Model flux
|
|
108
115
|
ldm = zeros((npb, ng)) # Limb darkening means
|
|
@@ -119,14 +126,14 @@ def tsmodel_parallel(times: ndarray,
|
|
|
119
126
|
# -----------------------------------#
|
|
120
127
|
# Calculate the limb darkening means #
|
|
121
128
|
# -----------------------------------#
|
|
122
|
-
if kmin <= kmean <= kmax:
|
|
129
|
+
if weights is not None and kmin <= kmean <= kmax:
|
|
123
130
|
ik = int(floor((kmean - kmin) / dk))
|
|
124
131
|
ak = (kmean - kmin - ik * dk) / dk
|
|
125
132
|
for ipb in range(npb):
|
|
126
133
|
ldm[ipb, :] = (1.0 - ak) * dot(weights[ik], ldp[ipv, ipb, :]) + ak * dot(weights[ik + 1],
|
|
127
134
|
ldp[ipv, ipb, :])
|
|
128
135
|
else:
|
|
129
|
-
_,
|
|
136
|
+
_, dg, wg = calculate_weights_2d(kmean, z_edges, ng)
|
|
130
137
|
for ipb in range(npb):
|
|
131
138
|
ldm[ipb, :] = dot(wg, ldp[ipv, ipb, :])
|
|
132
139
|
|
|
@@ -150,12 +157,10 @@ def tsmodel_parallel(times: ndarray,
|
|
|
150
157
|
if fabs(tc) > hww:
|
|
151
158
|
flux[ipv, :, ipt] = 1.0
|
|
152
159
|
else:
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
flux[ipv, ipb, ipt] += (istar[ipv, ipb] - iplanet * aplanet * afac[ipb]) / istar[ipv, ipb]
|
|
160
|
-
flux[ipv, :, ipt] /= nsamples[0]
|
|
160
|
+
z = pd_t15sc(tc, xyc)
|
|
161
|
+
aplanet = ccia(1.0, kmean, z)[0]
|
|
162
|
+
for ipb in range(npb):
|
|
163
|
+
iplanet = interpolate_mean_limb_darkening_s(z / (1.0 + kmean), dg, ldm[ipb])
|
|
164
|
+
flux[ipv, ipb, ipt] += (istar[ipv, ipb] - iplanet * aplanet * afac[ipb]) / istar[ipv, ipb]
|
|
165
|
+
#set_num_threads(nthreads_current)
|
|
161
166
|
return flux
|