PyTransit 2.6.10__tar.gz → 2.6.11__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 (146) hide show
  1. {pytransit-2.6.10 → pytransit-2.6.11}/PKG-INFO +1 -1
  2. {pytransit-2.6.10 → pytransit-2.6.11}/PyTransit.egg-info/PKG-INFO +1 -1
  3. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/__init__.py +1 -1
  4. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/logposteriorfunction.py +20 -15
  5. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/rvlpf.py +16 -9
  6. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/eclipse_model.py +1 -70
  7. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/gdmodel.py +3 -3
  8. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/ldtkldm.py +1 -2
  9. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/udmodel.py +1 -2
  10. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/ecintersection.py +87 -4
  11. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/model_trspec.py +12 -15
  12. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/de.py +1 -1
  13. {pytransit-2.6.10 → pytransit-2.6.11}/LICENSE +0 -0
  14. {pytransit-2.6.10 → pytransit-2.6.11}/MANIFEST.in +0 -0
  15. {pytransit-2.6.10 → pytransit-2.6.11}/PyTransit.egg-info/SOURCES.txt +0 -0
  16. {pytransit-2.6.10 → pytransit-2.6.11}/PyTransit.egg-info/dependency_links.txt +0 -0
  17. {pytransit-2.6.10 → pytransit-2.6.11}/PyTransit.egg-info/requires.txt +0 -0
  18. {pytransit-2.6.10 → pytransit-2.6.11}/PyTransit.egg-info/top_level.txt +0 -0
  19. {pytransit-2.6.10 → pytransit-2.6.11}/README.md +0 -0
  20. {pytransit-2.6.10 → pytransit-2.6.11}/pyproject.toml +0 -0
  21. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/contamination/__init__.py +0 -0
  22. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/contamination/contamination.py +0 -0
  23. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/contamination/data/spectra.h5 +0 -0
  24. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/contamination/data/transmission.nc +0 -0
  25. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/contamination/filter.py +0 -0
  26. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/contamination/instrument.py +0 -0
  27. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/contamination/plotting.py +0 -0
  28. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/limb_darkening.py +0 -0
  29. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/__init__.py +0 -0
  30. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/baselines/__init__.py +0 -0
  31. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/baselines/legendrebaseline.py +0 -0
  32. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/baselines/linearbaseline.py +0 -0
  33. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/cntlpf.py +0 -0
  34. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/eclipselpf.py +0 -0
  35. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/loglikelihood/__init__.py +0 -0
  36. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/loglikelihood/celeriteloglikelihood.py +0 -0
  37. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/loglikelihood/clloglikelihood.py +0 -0
  38. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/loglikelihood/fmcloglikelihood.py +0 -0
  39. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/loglikelihood/logisticloglikelihood.py +0 -0
  40. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/loglikelihood/multiceleriteloglikelihood.py +0 -0
  41. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/loglikelihood/wnloglikelihood.py +0 -0
  42. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/lpf.py +0 -0
  43. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/mclpf.py +0 -0
  44. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/mptlpf.py +0 -0
  45. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/ocllpf.py +0 -0
  46. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/ocltdvlpf.py +0 -0
  47. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/oclttvlpf.py +0 -0
  48. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/phasecurvelpf.py +0 -0
  49. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/tdvlpf.py +0 -0
  50. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/tess/__init__.py +0 -0
  51. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/tess/ctesslpf.py +0 -0
  52. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/tess/tessttvlpf.py +0 -0
  53. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/tess/tgclpf.py +0 -0
  54. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/tess/tgcmplpf.py +0 -0
  55. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/tess/tmpclpf.py +0 -0
  56. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/tesslpf.py +0 -0
  57. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/tessoclttvlpf.py +0 -0
  58. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/transitanalysis.py +0 -0
  59. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/transitlpf.py +0 -0
  60. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/lpf/ttvlpf.py +0 -0
  61. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/__init__.py +0 -0
  62. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/general.py +0 -0
  63. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/ldmodel.py +0 -0
  64. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/limb_darkening/__init__.py +0 -0
  65. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/limb_darkening/general.py +0 -0
  66. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/limb_darkening/linear.py +0 -0
  67. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/limb_darkening/nonlinear.py +0 -0
  68. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/limb_darkening/power_2.py +0 -0
  69. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/limb_darkening/quadratic.py +0 -0
  70. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/limb_darkening/quadratic_tri.py +0 -0
  71. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/limb_darkening/uniform.py +0 -0
  72. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/ma_chromosphere.py +0 -0
  73. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/ma_quadratic.py +0 -0
  74. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/ma_quadratic_cl.py +0 -0
  75. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/ma_uniform.py +0 -0
  76. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/ma_uniform_cl.py +0 -0
  77. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/__init__.py +0 -0
  78. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/gdmodel.py +0 -0
  79. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/general_nb.py +0 -0
  80. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/ldmodels.py +0 -0
  81. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/ldtkldm.py +0 -0
  82. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/ma_chromosphere_nb.py +0 -0
  83. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/ma_quadratic_nb.py +0 -0
  84. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/ma_uniform_nb.py +0 -0
  85. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/phasecurves.py +0 -0
  86. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/qpower2_nb.py +0 -0
  87. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/rrmodel.py +0 -0
  88. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/numba/spmodel.py +0 -0
  89. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/opencl/ma_quadratic.cl +0 -0
  90. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/opencl/ma_uniform.cl +0 -0
  91. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/opencl/orbits.cl +0 -0
  92. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/opencl/qpower2.cl +0 -0
  93. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/osmodel.py +0 -0
  94. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/qpower2.py +0 -0
  95. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/qpower2_cl.py +0 -0
  96. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/__init__.py +0 -0
  97. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/common.py +0 -0
  98. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/model.py +0 -0
  99. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/model_full.py +0 -0
  100. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/model_simple.py +0 -0
  101. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/opmodel.py +0 -0
  102. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/opmodel_full.py +0 -0
  103. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/rrmodel.cl +0 -0
  104. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/rrmodel.py +0 -0
  105. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/rrmodel_cl.py +0 -0
  106. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/roadrunner/tsmodel.py +0 -0
  107. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/transitmodel.py +0 -0
  108. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/models/uniform.py +0 -0
  109. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/orbits/__init__.py +0 -0
  110. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/orbits/orbits.py +0 -0
  111. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/orbits/orbits_py.py +0 -0
  112. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/orbits/taylor_z.py +0 -0
  113. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/param/__init__.py +0 -0
  114. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/param/parameter.py +0 -0
  115. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/param/prior.py +0 -0
  116. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/param/utilities.py +0 -0
  117. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/stars/__init__.py +0 -0
  118. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/stars/btsettl.py +0 -0
  119. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/stars/data/avg_bt_settl.fits +0 -0
  120. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/stars/data/avg_husser2013.fits +0 -0
  121. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/stars/husser2013.py +0 -0
  122. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/__init__.py +0 -0
  123. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/astrometry.py +0 -0
  124. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/constants.py +0 -0
  125. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/downsample.py +0 -0
  126. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/eclipses.py +0 -0
  127. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/io/__init__.py +0 -0
  128. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/io/lightcurvedata.py +0 -0
  129. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/keplerlc.py +0 -0
  130. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/mdwarfs.py +0 -0
  131. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/misc.py +0 -0
  132. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/mocklc.py +0 -0
  133. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/octasphere.py +0 -0
  134. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/phasecurves.py +0 -0
  135. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/physics.py +0 -0
  136. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/rv.py +0 -0
  137. {pytransit-2.6.10 → pytransit-2.6.11}/pytransit/utils/tess.py +0 -0
  138. {pytransit-2.6.10 → pytransit-2.6.11}/requirements.txt +0 -0
  139. {pytransit-2.6.10 → pytransit-2.6.11}/setup.cfg +0 -0
  140. {pytransit-2.6.10 → pytransit-2.6.11}/tests/test_contamination.py +0 -0
  141. {pytransit-2.6.10 → pytransit-2.6.11}/tests/test_ma_quadratic.py +0 -0
  142. {pytransit-2.6.10 → pytransit-2.6.11}/tests/test_ma_quadratic_nb.py +0 -0
  143. {pytransit-2.6.10 → pytransit-2.6.11}/tests/test_qpower2_nb.py +0 -0
  144. {pytransit-2.6.10 → pytransit-2.6.11}/tests/test_uniform_model.py +0 -0
  145. {pytransit-2.6.10 → pytransit-2.6.11}/tests/test_uniform_model_nb.py +0 -0
  146. {pytransit-2.6.10 → pytransit-2.6.11}/tests/test_z.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyTransit
3
- Version: 2.6.10
3
+ Version: 2.6.11
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.1
2
2
  Name: PyTransit
3
- Version: 2.6.10
3
+ Version: 2.6.11
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,7 +41,7 @@ Date
41
41
 
42
42
  """
43
43
 
44
- __version__ = '2.6.10'
44
+ __version__ = '2.6.11'
45
45
 
46
46
  # Generic
47
47
  # -------
@@ -136,11 +136,12 @@ class LogPosteriorFunction:
136
136
 
137
137
  def optimize_global(self, niter=200, npop=50, population=None, pool=None, lnpost=None, vectorize=True,
138
138
  label='Global optimisation', leave=False, plot_convergence: bool = True, use_tqdm: bool = True,
139
- plot_parameters: tuple = (0, 2, 3, 4)):
139
+ plot_parameters: tuple = (0, 2, 3, 4), min_ptp: float = 1e-2):
140
140
 
141
141
  lnpost = lnpost or self.lnposterior
142
142
  if self.de is None:
143
- self.de = DiffEvol(lnpost, clip(self.ps.bounds, -1, 1), npop, maximize=True, vectorize=vectorize, pool=pool)
143
+ self.de = DiffEvol(lnpost, clip(self.ps.bounds, -1, 1), npop, maximize=True, vectorize=vectorize,
144
+ pool=pool, min_ptp=min_ptp)
144
145
  if population is None:
145
146
  self.de._population[:, :] = self.create_pv_population(npop)
146
147
  else:
@@ -179,24 +180,28 @@ class LogPosteriorFunction:
179
180
  raise ValueError('The MCMC sampler is set to save the results, but the result directory is not set.')
180
181
 
181
182
  lnpost = lnpost or self.lnposterior
182
- if self.sampler is None:
183
- if population is not None:
184
- pop0 = population
185
- elif hasattr(self, '_local_minimization') and self._local_minimization is not None:
186
- pop0 = multivariate_normal(self._local_minimization.x, diag(full(len(self.ps), 0.001 ** 2)), size=npop)
187
- elif self.de is not None:
188
- pop0 = self.de.population.copy()
183
+ if population is not None:
184
+ pop0 = population
185
+ else:
186
+ if self.sampler is None:
187
+ if hasattr(self, '_local_minimization') and self._local_minimization is not None:
188
+ pop0 = multivariate_normal(self._local_minimization.x, diag(full(len(self.ps), 0.001 ** 2)), size=npop)
189
+ elif self.de is not None:
190
+ pop0 = self.de.population.copy()
191
+ else:
192
+ raise ValueError('Sample MCMC needs an initial population.')
189
193
  else:
190
- raise ValueError('Sample MCMC needs an initial population.')
194
+ pop0 = self.sampler.chain[:, -1, :].copy()
195
+
196
+ if self.sampler is None:
191
197
  self.sampler = EnsembleSampler(pop0.shape[0], pop0.shape[1], lnpost, vectorize=vectorize, pool=pool)
192
- else:
193
- pop0 = self.sampler.chain[:, -1, :].copy()
194
198
 
195
199
  for i in tqdm(range(repeats), desc=label, disable=(not use_tqdm), leave=leave):
196
- if reset or i > 0:
200
+ if (self.sampler is not None and reset) or i > 0:
197
201
  self.sampler.reset()
198
- for _ in tqdm(self.sampler.sample(pop0, iterations=niter, thin=thin), total=niter,
199
- desc='Run {:d}/{:d}'.format(i + 1, repeats), leave=False, disable=(not use_tqdm)):
202
+ for _ in tqdm(self.sampler.sample(pop0, iterations=niter, thin=thin, skip_initial_state_check=False),
203
+ total=niter, desc='Run {:d}/{:d}'.format(i + 1, repeats), leave=False,
204
+ disable=(not use_tqdm)):
200
205
  pass
201
206
  if save:
202
207
  self.save(self.result_dir)
@@ -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('rv_slope', 'linear rv slope', 'm/s', NP(0.0, 1.0), (-inf, inf))]
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
- return times * pvp[:, self._sl_rv_slope]
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) - squeeze(self.rv_slope(pv, self._timea))
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], fmt='o', marker=markers[iid],
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, 1D vector, or 2D array.
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)
@@ -227,9 +227,9 @@ class GravityDarkenedModel(TransitModel):
227
227
 
228
228
  # Plot the info
229
229
  # -------------
230
- ax.text(0.025, 0.95, f"i$_\star$ = {degrees(istar):.1f}$^\circ$", transform=ax.transAxes)
231
- ax.text(0.025, 0.90, f"i$_\mathrm{{p}}$ = {degrees(inc):.1f}$^\circ$", transform=ax.transAxes)
232
- ax.text(1 - 0.025, 0.95, fr"$\alpha$ = {degrees(alpha):.1f}$^\circ$", transform=ax.transAxes, ha='right')
230
+ ax.text(0.025, 0.95, f"i$_\\star$ = {degrees(istar):.1f}$^\\circ$", transform=ax.transAxes)
231
+ ax.text(0.025, 0.90, f"i$_\\mathrm{{p}}$ = {degrees(inc):.1f}$^\\circ$", transform=ax.transAxes)
232
+ ax.text(1 - 0.025, 0.95, fr"$\\alpha$ = {degrees(alpha):.1f}$^\\circ$", transform=ax.transAxes, ha='right')
233
233
  ax.text(0.025, 0.05, f"f = {f:.1f}", transform=ax.transAxes)
234
234
 
235
235
  setp(ax, xlim=(-1.1, 1.1), ylim=(-1.1, 1.1), xticks=[], yticks=[])
@@ -17,9 +17,8 @@
17
17
  from typing import Tuple, Optional, Union
18
18
  from pathlib import Path
19
19
 
20
+ from numpy import ndarray, linspace, meshgrid, transpose, asarray, newaxis, errstate
20
21
  from numba import njit
21
- from numpy import zeros, interp, pi, ndarray, linspace, meshgrid, transpose, asarray, newaxis, errstate
22
- from scipy.interpolate import interpn, interpnd, RegularGridInterpolator as RGI
23
22
 
24
23
  from .ldmodel import LDModel
25
24
  from .numba.ldtkldm import trilinear_interpolation_set, integrate_profiles_set
@@ -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))
@@ -4,9 +4,93 @@ from numpy import ndarray, fabs, pi, full, arange
4
4
  from numba import njit
5
5
 
6
6
  @njit
7
- def create_ellipse(ny: int, k: float, f: float, a: float) -> (ndarray, ndarray):
7
+ def rotated_ellipse_bbox(a: float, f: float):
8
+ """
9
+ Parameters
10
+ ----------
11
+ a : float
12
+ The angle (in radians) by which the ellipse is rotated.
13
+ f : float
14
+ The eccentricity of the ellipse, with a value between 0 and 1.
15
+
16
+ Returns
17
+ -------
18
+ hw : float
19
+ The half-width of the bounding box of the rotated ellipse.
20
+ hh : float
21
+ The half-height of the bounding box of the rotated ellipse.
22
+
23
+ """
24
+ r1, r2 = 1.0, 1.0-f
25
+ ux = r1 * cos(a)
26
+ uy = r1 * sin(a)
27
+ vx = r2 * cos(a + pi/2)
28
+ vy = r2 * sin(a + pi/2)
29
+ hw = sqrt(ux*ux + vx*vx)
30
+ hh = sqrt(uy*uy + vy*vy)
31
+ return hw, hh
32
+
33
+ @njit
34
+ def rotated_ellipse_x(y: float, a: float, f: float) -> tuple[float, float]:
35
+ """Calculate the x coordinates for a rotated ellipse given the y coordinate and the flattening factor.
36
+
37
+ Parameters
38
+ ----------
39
+ y
40
+ The y-coordinate of the point on the ellipse.
41
+ a
42
+ The angle (in radians) of rotation for the ellipse.
43
+ f
44
+ The flattening parameter of the ellipse.
45
+
46
+ Returns
47
+ -------
48
+ tuple[float, float]
49
+ The ellipse x-coordinates for the given y coordinate.
50
+ """
51
+ ca, sa = cos(a), sin(a)
52
+ b = 1.0 - f
53
+ d = b**2*ca**2 - y**2*sa**4 - 2*y**2*sa**2*ca**2 - y**2*ca**4 + sa**2
54
+ if d >= 0.0:
55
+ xl = (y*(-sa*ca + sa*ca/b**2) - sqrt(d)/b) / (ca**2 + sa**2/b**2)
56
+ xr = (y*(-sa*ca + sa*ca/b**2) + sqrt(d)/b) / (ca**2 + sa**2/b**2)
57
+ return xl, xr
58
+ else:
59
+ return nan, nan
60
+
61
+
62
+ @njit
63
+ def rotated_ellipse_dxdy(y: float, a: float, f: float) -> tuple[float, float]:
64
+ """Calculate dx/dy for a rotated ellipse given the y coordinate and the flattening factor.
65
+
66
+ Parameters
67
+ ----------
68
+ y
69
+ The y-coordinate of the point on the ellipse.
70
+ a
71
+ The angle, in radians, of rotation of the ellipse.
72
+ f
73
+ The flattening parameter of the ellipse.
74
+
75
+ Returns
76
+ -------
77
+ tuple[float, float]
78
+ The ellipse derivatives (dx/dy) for the given y coordinate.
8
79
  """
9
- Create the coordinates for a rotated ellipse.
80
+ ca, sa = cos(a), sin(a)
81
+ b = 1.0 - f
82
+ d = b**2*ca**2 - y**2*sa**4 - 2*y**2*sa**2*ca**2 - y**2*ca**4 + sa**2
83
+ if d >= 0.0:
84
+ dxl = (-sa*ca - (-y*sa**4 - 2*y*sa**2*ca**2 - y*ca**4)/(b*sqrt(d)) + sa*ca/b**2)/(ca**2 + sa**2/b**2)
85
+ dxr = (-sa*ca + (-y*sa**4 - 2*y*sa**2*ca**2 - y*ca**4)/(b*sqrt(d)) + sa*ca/b**2)/(ca**2 + sa**2/b**2)
86
+ return dxl, dxr
87
+ else:
88
+ return nan, nan
89
+
90
+
91
+ @njit
92
+ def create_ellipse(ny: int, k: float, f: float, a: float) -> (ndarray, ndarray):
93
+ """Create the coordinates for a rotated ellipse.
10
94
 
11
95
  Parameters
12
96
  ----------
@@ -54,8 +138,7 @@ def create_ellipse(ny: int, k: float, f: float, a: float) -> (ndarray, ndarray):
54
138
 
55
139
  @njit
56
140
  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.
141
+ """Calculate the intersection area between a rotated ellipse and a circle using a scanline fill approach.
59
142
 
60
143
  Parameters
61
144
  ----------
@@ -93,8 +93,8 @@ def tsmodel_parallel(times: ndarray,
93
93
  weights: ndarray, dk: float, kmin: float, kmax: float, ng: int, dg: float, z_edges: ndarray,
94
94
  nthreads: int) -> ndarray:
95
95
 
96
- nthreads_current = get_num_threads()
97
- set_num_threads(nthreads)
96
+ #nthreads_current = get_num_threads()
97
+ #set_num_threads(nthreads)
98
98
 
99
99
  if k.ndim != 2:
100
100
  raise ValueError(" The radius ratios must be given as a 2D array with shape (npv, npb)")
@@ -115,7 +115,7 @@ def tsmodel_parallel(times: ndarray,
115
115
  ldm = zeros((npb, ng)) # Limb darkening means
116
116
  xyc = zeros((2, 5)) # Taylor series coefficients for the (x, y) position
117
117
 
118
- for ipv in range(npv):
118
+ for ipv in prange(npv):
119
119
  if isnan(a[ipv]) or (a[ipv] <= 1.0) or (e[ipv] < 0.0):
120
120
  flux[ipv, :, :] = nan
121
121
  continue
@@ -133,8 +133,8 @@ def tsmodel_parallel(times: ndarray,
133
133
  ldm[ipb, :] = (1.0 - ak) * dot(weights[ik], ldp[ipv, ipb, :]) + ak * dot(weights[ik + 1],
134
134
  ldp[ipv, ipb, :])
135
135
  else:
136
- dk, dg, wg = calculate_weights_2d(kmean, z_edges, ng)
137
- for ipb in prange(npb):
136
+ _, dg, wg = calculate_weights_2d(kmean, z_edges, ng)
137
+ for ipb in range(npb):
138
138
  ldm[ipb, :] = dot(wg, ldp[ipv, ipb, :])
139
139
 
140
140
  # -----------------------------------------------------#
@@ -151,19 +151,16 @@ def tsmodel_parallel(times: ndarray,
151
151
  # --------------------------#
152
152
  # Calculate the light curve #
153
153
  # --------------------------#
154
- for ipt in prange(npt):
154
+ for ipt in range(npt):
155
155
  epoch = floor((times[ipt] - t0[ipv] + 0.5 * p[ipv]) / p[ipv])
156
156
  tc = times[ipt] - (t0[ipv] + epoch * p[ipv])
157
157
  if fabs(tc) > hww:
158
158
  flux[ipv, :, ipt] = 1.0
159
159
  else:
160
- for isample in range(1, nsamples[0] + 1):
161
- time_offset = exptimes[0] * ((isample - 0.5) / nsamples[0] - 0.5)
162
- z = pd_t15sc(tc + time_offset, xyc)
163
- aplanet = ccia(1.0, kmean, z)[0]
164
- for ipb in range(npb):
165
- iplanet = interpolate_mean_limb_darkening_s(z / (1.0 + kmean), dg, ldm[ipb])
166
- flux[ipv, ipb, ipt] += (istar[ipv, ipb] - iplanet * aplanet * afac[ipb]) / istar[ipv, ipb]
167
- flux[ipv, :, ipt] /= nsamples[0]
168
- set_num_threads(nthreads_current)
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)
169
166
  return flux
@@ -118,7 +118,7 @@ class DiffEvol(object):
118
118
  """
119
119
 
120
120
  def __init__(self, fun, bounds, npop, f=None, c=None, seed=None, maximize=False, vectorize=False, cbounds=(0.25, 1),
121
- fbounds=(0.25, 0.75), pool=None, min_ptp=1e-2, args=[], kwargs={}):
121
+ fbounds=(0.25, 0.75), pool=None, min_ptp=0.01, args=[], kwargs={}):
122
122
  if seed is not None:
123
123
  rseed(seed)
124
124
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes