tkmatrix 0.9.2__tar.gz → 0.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 (24) hide show
  1. {tkmatrix-0.9.2/tkmatrix.egg-info → tkmatrix-0.10.0}/PKG-INFO +1 -1
  2. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/setup.py +2 -2
  3. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/custom_algorithms/BlsCustomSearchAlgorithm.py +2 -1
  4. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/tests/test_tkmatrix.py +31 -31
  5. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/tkmatrix_class.py +324 -184
  6. {tkmatrix-0.9.2 → tkmatrix-0.10.0/tkmatrix.egg-info}/PKG-INFO +1 -1
  7. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix.egg-info/requires.txt +1 -1
  8. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/LICENSE +0 -0
  9. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/MANIFEST.in +0 -0
  10. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/README.md +0 -0
  11. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/setup.cfg +0 -0
  12. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/__init__.py +0 -0
  13. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/__main__.py +0 -0
  14. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/custom_algorithms/__init__.py +0 -0
  15. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/custom_algorithms/custom_search.py +0 -0
  16. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/inject_model.py +0 -0
  17. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/inject_rv_model.py +0 -0
  18. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/programmatic.py +0 -0
  19. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/properties.yaml +0 -0
  20. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/rv.py +0 -0
  21. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/tests/__init__.py +0 -0
  22. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix.egg-info/SOURCES.txt +0 -0
  23. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix.egg-info/dependency_links.txt +0 -0
  24. {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tkmatrix
3
- Version: 0.9.2
3
+ Version: 0.10.0
4
4
  Summary: ToolKit for Multi-phAse Transits Recovery from Injected eXoplanets
5
5
  Home-page: https://github.com/PlanetHunters/tkmatrix
6
6
  Author: M. Dévora-Pajares & F.J. Pozuelos
@@ -2,7 +2,7 @@ import setuptools
2
2
 
3
3
  with open("README.md", "r") as fh:
4
4
  long_description = fh.read()
5
- version = "0.9.2"
5
+ version = "0.10.0"
6
6
  setuptools.setup(
7
7
  name="tkmatrix",
8
8
  version=version,
@@ -25,7 +25,7 @@ setuptools.setup(
25
25
  'configparser==5.0.1',
26
26
  "corner==2.1.0",
27
27
  "ellc==1.8.5",
28
- "lcbuilder==0.18.2",
28
+ "lcbuilder==0.18.3",
29
29
  "mock==4.0.3",
30
30
  'pyparsing==2.4.7', # Matplotlib dependency
31
31
  "seaborn==0.11.1",
@@ -51,7 +51,8 @@ class BlsCustomSearchAlgorithm(CustomSearchAlgorithm):
51
51
  intransit_result = transit_mask(time, found_period, 2 * duration, t0)
52
52
  real_intransit_result = transit_mask(time, found_period, duration, t0)
53
53
  oot_flux = flux[~real_intransit_result]
54
- snr = np.abs(np.nanmean(1 - real_intransit_result)) / np.nanstd(oot_flux) * (len(real_intransit_result) ** 0.5)
54
+ it_flux = flux[real_intransit_result]
55
+ snr = np.abs(np.nanmean(1 - it_flux)) / np.nanstd(oot_flux) * (len(it_flux) ** 0.5)
55
56
  if snr >= min_snr:
56
57
  time = time[~intransit_result]
57
58
  flux = flux[~intransit_result]
@@ -17,22 +17,22 @@ class TestsMatrix(unittest.TestCase):
17
17
  try:
18
18
  inject_dir, period_grid, radius_grid = matrix.inject(1, 5, 5, 1, 3, 3, 1)
19
19
  self.assertEqual(10, len(os.listdir(inject_dir)))
20
- self.assertEqual([1], matrix.sectors)
21
- self.assertAlmostEqual(0.47, matrix.mass, 2)
22
- self.assertAlmostEqual(0.44, matrix.massmin, 2)
23
- self.assertAlmostEqual(0.5, matrix.massmax, 2)
24
- self.assertAlmostEqual(0.18, matrix.radius, 2)
25
- self.assertAlmostEqual(0.076, matrix.radiusmin, 3)
26
- self.assertAlmostEqual(0.284, matrix.radiusmax, 3)
20
+ self.assertEqual([1], matrix.search_input.sectors)
21
+ self.assertAlmostEqual(0.47, matrix.search_input.star_info.mass, 2)
22
+ self.assertAlmostEqual(0.44, matrix.search_input.star_info.mass_min, 2)
23
+ self.assertAlmostEqual(0.5, matrix.search_input.star_info.mass_max, 2)
24
+ self.assertAlmostEqual(0.18, matrix.search_input.star_info.radius, 2)
25
+ self.assertAlmostEqual(0.076, matrix.search_input.star_info.radius_min, 3)
26
+ self.assertAlmostEqual(0.284, matrix.search_input.star_info.radius_max, 3)
27
27
  self.assertEqual("TIC 220513363", matrix.object_info.mission_id())
28
- self.assertEqual("TIC 220513363", matrix.id)
29
- self.assertAlmostEqual(0.47, matrix.mstar.value, 2)
30
- self.assertAlmostEqual(0.44, matrix.mstar_min.value, 2)
31
- self.assertAlmostEqual(0.5, matrix.mstar_max.value, 2)
32
- self.assertAlmostEqual(0.18, matrix.rstar.value, 2)
33
- self.assertAlmostEqual(0.076, matrix.rstar_min.value, 3)
34
- self.assertAlmostEqual(0.284, matrix.rstar_max.value, 3)
35
- self.assertEqual(".", matrix.dir)
28
+ self.assertEqual("TIC 220513363", matrix.search_input.target)
29
+ self.assertAlmostEqual(0.47, matrix.search_input.mstar.value, 2)
30
+ self.assertAlmostEqual(0.44, matrix.search_input.mstar_min.value, 2)
31
+ self.assertAlmostEqual(0.5, matrix.search_input.mstar_max.value, 2)
32
+ self.assertAlmostEqual(0.18, matrix.search_input.rstar.value, 2)
33
+ self.assertAlmostEqual(0.076, matrix.search_input.rstar_min.value, 3)
34
+ self.assertAlmostEqual(0.284, matrix.search_input.rstar_max.value, 3)
35
+ self.assertEqual(".", matrix.search_input.dir)
36
36
  matrix.recovery(inject_dir, 5, detrend_ws=0, oversampling=0.1)
37
37
  matrix.plot_results(target, inject_dir)
38
38
  self.assertEqual(9, len(os.listdir(inject_dir)))
@@ -136,14 +136,14 @@ class TestsMatrix(unittest.TestCase):
136
136
  try:
137
137
  inject_dir, period_grid, radius_grid = matrix.inject(1, 5, 5, 1, 3, 3, 1)
138
138
  self.assertEqual(10, len(os.listdir(inject_dir)))
139
- self.assertEqual((0.2, 0.5), matrix.star_info.ld_coefficients)
140
- self.assertEqual(2000, matrix.star_info.teff)
141
- self.assertAlmostEqual(0.7, matrix.star_info.mass)
142
- self.assertAlmostEqual(0.55, matrix.star_info.mass_min)
143
- self.assertAlmostEqual(0.75, matrix.star_info.mass_max)
144
- self.assertAlmostEqual(0.5, matrix.star_info.radius)
145
- self.assertAlmostEqual(0.4, matrix.star_info.radius_min)
146
- self.assertAlmostEqual(0.7, matrix.star_info.radius_max)
139
+ self.assertEqual((0.2, 0.5), matrix.search_input.star_info.ld_coefficients)
140
+ self.assertEqual(2000, matrix.search_input.star_info.teff)
141
+ self.assertAlmostEqual(0.7, matrix.search_input.star_info.mass)
142
+ self.assertAlmostEqual(0.55, matrix.search_input.star_info.mass_min)
143
+ self.assertAlmostEqual(0.75, matrix.search_input.star_info.mass_max)
144
+ self.assertAlmostEqual(0.5, matrix.search_input.star_info.radius)
145
+ self.assertAlmostEqual(0.4, matrix.search_input.star_info.radius_min)
146
+ self.assertAlmostEqual(0.7, matrix.search_input.star_info.radius_max)
147
147
  finally:
148
148
  if inject_dir is not None:
149
149
  shutil.rmtree(inject_dir, ignore_errors=True)
@@ -152,14 +152,14 @@ class TestsMatrix(unittest.TestCase):
152
152
  try:
153
153
  inject_dir, period_grid, radius_grid = matrix.inject(1, 5, 5, 1, 3, 3, 1)
154
154
  self.assertEqual(10, len(os.listdir(inject_dir)))
155
- self.assertEqual((0.1258, 0.235), matrix.star_info.ld_coefficients)
156
- self.assertEqual(31000.0, matrix.star_info.teff)
157
- self.assertAlmostEqual(0.47, matrix.star_info.mass)
158
- self.assertAlmostEqual(0.44, matrix.star_info.mass_min)
159
- self.assertAlmostEqual(0.5, matrix.star_info.mass_max)
160
- self.assertAlmostEqual(0.18, matrix.star_info.radius)
161
- self.assertAlmostEqual(0.076, matrix.star_info.radius_min)
162
- self.assertAlmostEqual(0.284, matrix.star_info.radius_max)
155
+ self.assertEqual((0.1258, 0.235), matrix.search_input.star_info.ld_coefficients)
156
+ self.assertEqual(31000.0, matrix.search_input.star_info.teff)
157
+ self.assertAlmostEqual(0.47, matrix.search_input.star_info.mass)
158
+ self.assertAlmostEqual(0.44, matrix.search_input.star_info.mass_min)
159
+ self.assertAlmostEqual(0.5, matrix.search_input.star_info.mass_max)
160
+ self.assertAlmostEqual(0.18, matrix.search_input.star_info.radius)
161
+ self.assertAlmostEqual(0.076, matrix.search_input.star_info.radius_min)
162
+ self.assertAlmostEqual(0.284, matrix.search_input.star_info.radius_max)
163
163
  finally:
164
164
  if inject_dir is not None:
165
165
  shutil.rmtree(inject_dir, ignore_errors=True)
@@ -1,8 +1,11 @@
1
+ import copy
2
+ import dataclasses
1
3
  import logging
2
4
  import multiprocessing
3
5
  import sys
4
6
  import traceback
5
7
  from multiprocessing import Pool
8
+ from pathlib import Path
6
9
 
7
10
  import lightkurve
8
11
  import numpy as np
@@ -12,6 +15,7 @@ from lcbuilder.helper import LcbuilderHelper
12
15
  from lcbuilder.lcbuilder_class import LcBuilder
13
16
  import wotan
14
17
  from lcbuilder.star.HabitabilityCalculator import HabitabilityCalculator
18
+ from lcbuilder.star.starinfo import StarInfo
15
19
  from matplotlib.ticker import FormatStrFormatter
16
20
  from foldedleastsquares import transitleastsquares
17
21
  from foldedleastsquares import transit_mask, cleaned_array
@@ -27,6 +31,61 @@ from tkmatrix.inject_rv_model import InjectRvModel
27
31
  from tkmatrix.rv import RvFitter
28
32
 
29
33
 
34
+ @dataclasses.dataclass
35
+ class SearchInput:
36
+ target: str
37
+ sectors: list[int] | str
38
+ author: str
39
+ dir: str
40
+ star_info: StarInfo
41
+ file: str
42
+ initial_transit_mask: list
43
+ preserve: bool = False
44
+ exposure_time: int = None
45
+ initial_mask: list = None
46
+ eleanor_corr_flux: str = 'pca_flux'
47
+ outliers_sigma: float = None
48
+ high_rms_enabled: bool = True
49
+ high_rms_threshold: float = 2.5,
50
+ high_rms_bin_hours: float = 4
51
+ smooth_enabled: bool = False
52
+ auto_detrend_enabled: bool = False
53
+ auto_detrend_method: str = "cosine"
54
+ auto_detrend_ratio: float = 0.25,
55
+ auto_detrend_period: float = None
56
+ prepare_algorithm = None
57
+ cache_dir: str = os.path.expanduser('~') + "/"
58
+ oscillation_reduction: bool = False
59
+ oscillation_min_snr: float = 4
60
+ oscillation_amplitude_threshold: float = 0.001
61
+ oscillation_ws_percent: float = 0.01
62
+ oscillation_min_period: float = 0.002
63
+ oscillation_max_period: float = 0.2,
64
+ cores: int = multiprocessing.cpu_count() - 1
65
+ search_engine: str = 'cpu'
66
+ ab: tuple[float] = None
67
+ rstar = None
68
+ mstar = None
69
+ mstar_min = None
70
+ mstar_max = None
71
+ rstar_min = None
72
+ rstar_max = None
73
+ period: float = None
74
+ r_planet: float = None
75
+ epoch: float = None
76
+ inject_file_dir: str = None
77
+ use_search_cache: bool = False
78
+ max_period_search: float = None
79
+ snr_threshold: float = None
80
+ transit_template = None
81
+ detrend_method: str = 'biweight'
82
+ detrend_ws: float = None
83
+ run_limit: int = 1
84
+ custom_search_algorithm = None
85
+ oversampling: float = None
86
+ signal_selection_mode: str = None
87
+
88
+
30
89
  class MATRIX:
31
90
  """
32
91
  MATRIX: Multi-phAse Transits Recovery from Injected eXoplanets
@@ -52,106 +111,83 @@ class MATRIX:
52
111
  assert sectors is not None and (sectors == 'all' or isinstance(sectors, list))
53
112
  assert exposure_time is not None and isinstance(exposure_time, (int, float))
54
113
  assert initial_transit_mask is None or isinstance(initial_transit_mask, list)
55
- self.id = target
56
- self.dir = dir
57
- self.sectors = sectors
58
- self.author = author
59
- self.star_info = star_info
60
- self.exposure_time = exposure_time
61
- self.preserve = preserve
62
- self.file = file
63
- self.eleanor_corr_flux = eleanor_corr_flux
64
- self.initial_mask = initial_mask
65
- self.initial_transit_mask = initial_transit_mask
66
- self.star_info = star_info
67
- self.outliers_sigma = outliers_sigma
68
- self.high_rms_enabled = high_rms_enabled
69
- self.high_rms_threshold = high_rms_threshold
70
- self.high_rms_bin_hours = high_rms_bin_hours
71
- self.smooth_enabled = smooth_enabled
72
- self.auto_detrend_enabled = auto_detrend_enabled
73
- self.auto_detrend_method = auto_detrend_method
74
- self.auto_detrend_ratio = auto_detrend_ratio
75
- self.auto_detrend_period = auto_detrend_period
76
- self.oscillation_reduction = oscillation_reduction
77
- self.oscillation_min_snr = oscillation_min_snr
78
- self.oscillation_amplitude_threshold = oscillation_amplitude_threshold
79
- self.oscillation_ws_percent = oscillation_ws_percent
80
- self.oscillation_min_period = oscillation_min_period
81
- self.oscillation_max_period = oscillation_max_period
82
- self.prepare_algorithm = prepare_algorithm
83
- self.cache_dir = cache_dir
84
- self.cores = cores
85
- self.search_engine = search_engine
114
+ self.search_input = SearchInput(target, sectors, author, dir, star_info, file, initial_transit_mask, preserve, exposure_time, initial_mask,
115
+ eleanor_corr_flux, outliers_sigma, high_rms_enabled, high_rms_threshold, high_rms_bin_hours, smooth_enabled,
116
+ auto_detrend_enabled, auto_detrend_method, auto_detrend_ratio, auto_detrend_period, cache_dir,
117
+ oscillation_reduction, oscillation_min_snr, oscillation_amplitude_threshold, oscillation_ws_percent,
118
+ oscillation_min_period, oscillation_max_period, cores, search_engine)
86
119
 
87
- def retrieve_object_data(self, inject_dir=None):
88
- self.object_info = self.lcbuilder.build_object_info(self.id, self.author, self.sectors, self.file, self.exposure_time,
89
- None, None,
90
- self.star_info, None,
91
- self.eleanor_corr_flux, self.outliers_sigma,
92
- False, self.high_rms_threshold,
93
- self.high_rms_bin_hours, False,
94
- False, self.auto_detrend_method,
95
- self.auto_detrend_ratio, self.auto_detrend_period,
96
- self.prepare_algorithm, False,
97
- self.oscillation_min_snr, self.oscillation_amplitude_threshold,
98
- self.oscillation_ws_percent, self.oscillation_min_period,
99
- self.oscillation_max_period)
120
+ @staticmethod
121
+ def retrieve_object_data(search_input: SearchInput, inject_dir=None):
122
+ lcbuilder_object = LcBuilder()
123
+ object_info = lcbuilder_object.build_object_info(search_input.target, search_input.author, search_input.sectors,
124
+ search_input.file, search_input.exposure_time,
125
+ None, None, search_input.star_info, None,
126
+ search_input.eleanor_corr_flux, search_input.outliers_sigma,
127
+ False, search_input.high_rms_threshold,
128
+ search_input.high_rms_bin_hours, False,
129
+ False, search_input.auto_detrend_method,
130
+ search_input.auto_detrend_ratio, search_input.auto_detrend_period,
131
+ search_input.prepare_algorithm, False,
132
+ search_input.oscillation_min_snr, search_input.oscillation_amplitude_threshold,
133
+ search_input.oscillation_ws_percent, search_input.oscillation_min_period,
134
+ search_input.oscillation_max_period)
100
135
  if inject_dir is None:
101
- inject_dir = self.build_inject_dir()
102
- self.lc_build = self.lcbuilder.build(self.object_info, inject_dir, self.cache_dir, self.cores)
103
- if self.star_info is None:
104
- self.star_info = self.lc_build.star_info
105
- self.ab = self.star_info.ld_coefficients
106
- if self.ab is None:
136
+ inject_dir = MATRIX.build_inject_dir(search_input.dir, object_info)
137
+ lcbuilder_object = LcBuilder()
138
+ lc_build = lcbuilder_object.build(object_info, inject_dir, search_input.cache_dir, search_input.cores)
139
+ search_input_result = copy.deepcopy(search_input)
140
+ if search_input_result.star_info is None:
141
+ search_input_result.star_info = lc_build.star_info
142
+ search_input_result.ab = search_input_result.star_info.ld_coefficients
143
+ if search_input_result.ab is None:
107
144
  raise ValueError("Limb Darkening parameters were not found. Please provide them in the STAR properties.")
108
- self.mass = self.star_info.mass
109
- self.massmin = self.star_info.mass_min
110
- self.massmax = self.star_info.mass_max
111
- self.radius = self.star_info.radius
112
- self.radiusmin = self.star_info.radius_min
113
- self.radiusmax = self.star_info.radius_max
114
145
  # units for ellc
115
- self.rstar = self.star_info.radius * u.R_sun
116
- self.mstar = self.star_info.mass * u.M_sun
117
- self.mstar_min = self.star_info.mass_min * u.M_sun
118
- self.mstar_max = self.star_info.mass_max * u.M_sun
119
- self.rstar_min = self.star_info.radius_min * u.R_sun
120
- self.rstar_max = self.star_info.radius_max * u.R_sun
121
- return inject_dir
146
+ search_input_result.rstar = search_input_result.star_info.radius * u.R_sun
147
+ search_input_result.mstar = search_input_result.star_info.mass * u.M_sun
148
+ search_input_result.mstar_min = search_input_result.star_info.mass_min * u.M_sun
149
+ search_input_result.mstar_max = search_input_result.star_info.mass_max * u.M_sun
150
+ search_input_result.rstar_min = search_input_result.star_info.radius_min * u.R_sun
151
+ search_input_result.rstar_max = search_input_result.star_info.radius_max * u.R_sun
152
+ return inject_dir, object_info, lc_build, search_input_result
122
153
 
123
- def retrieve_object_data_for_recovery(self, inject_dir, recovery_file):
124
- self.__setup_logging(inject_dir)
125
- self.object_info = self.lcbuilder.build_object_info("", None, None, recovery_file, self.exposure_time,
126
- self.initial_mask, self.initial_transit_mask,
127
- self.star_info, None,
128
- self.eleanor_corr_flux, self.outliers_sigma,
129
- self.high_rms_enabled, self.high_rms_threshold,
130
- self.high_rms_bin_hours, self.smooth_enabled,
131
- self.auto_detrend_enabled, self.auto_detrend_method,
132
- self.auto_detrend_ratio, self.auto_detrend_period,
133
- self.prepare_algorithm, self.oscillation_reduction,
134
- self.oscillation_min_snr, self.oscillation_amplitude_threshold,
135
- self.oscillation_ws_percent, self.oscillation_min_period,
136
- self.oscillation_max_period)
154
+ @staticmethod
155
+ def retrieve_object_data_for_recovery(inject_dir, recovery_file, search_input: SearchInput):
156
+ MATRIX.setup_logging(inject_dir)
157
+ lcbuilder_object = LcBuilder()
158
+ object_info = lcbuilder_object.build_object_info("", None, None, recovery_file, search_input.exposure_time,
159
+ search_input.initial_mask, search_input.initial_transit_mask,
160
+ search_input.star_info, None,
161
+ search_input.eleanor_corr_flux, search_input.outliers_sigma,
162
+ search_input.high_rms_enabled, search_input.high_rms_threshold,
163
+ search_input.high_rms_bin_hours, search_input.smooth_enabled,
164
+ search_input.auto_detrend_enabled, search_input.auto_detrend_method,
165
+ search_input.auto_detrend_ratio, search_input.auto_detrend_period,
166
+ search_input.prepare_algorithm, search_input.oscillation_reduction,
167
+ search_input.oscillation_min_snr, search_input.oscillation_amplitude_threshold,
168
+ search_input.oscillation_ws_percent, search_input.oscillation_min_period,
169
+ search_input.oscillation_max_period)
137
170
 
138
- if self.object_info.reduce_simple_oscillations and \
139
- self.object_info.oscillation_max_period < self.object_info.oscillation_min_period:
171
+ if object_info.reduce_simple_oscillations and \
172
+ object_info.oscillation_max_period < object_info.oscillation_min_period:
140
173
  logging.info("Stellar oscillation period has been set to empty. Defaulting to 1/3 the minimum search period")
141
- self.object_info.oscillation_max_period = self.MIN_SEARCH_PERIOD / 3
142
- self.lc_build = self.lcbuilder.build(self.object_info, inject_dir, self.cache_dir, self.cores)
174
+ object_info.oscillation_max_period = MATRIX.MIN_SEARCH_PERIOD / 3
175
+ lc_build = lcbuilder_object.build(object_info, inject_dir, search_input.cache_dir, search_input.cores)
176
+ return lc_build, object_info
143
177
 
144
- def build_inject_dir(self):
145
- inject_dir = self.dir + "/" + self.object_info.mission_id().replace(" ", "") + "_ir/"
178
+ @staticmethod
179
+ def build_inject_dir(dir, object_info):
180
+ inject_dir = dir + "/" + object_info.mission_id().replace(" ", "") + "_ir/"
146
181
  index = 0
147
182
  while os.path.exists(inject_dir) or os.path.isdir(inject_dir):
148
- inject_dir = self.dir + "/" + self.object_info.mission_id().replace(" ", "") + "_ir_" + str(index) + "/"
183
+ inject_dir = dir + "/" + object_info.mission_id().replace(" ", "") + "_ir_" + str(index) + "/"
149
184
  index = index + 1
150
185
  os.mkdir(inject_dir)
151
- self.__setup_logging(inject_dir)
186
+ MATRIX.setup_logging(inject_dir)
152
187
  return inject_dir
153
188
 
154
- def __setup_logging(self, inject_dir):
189
+ @staticmethod
190
+ def setup_logging(inject_dir):
155
191
  file_dir = inject_dir + "matrix.log"
156
192
  formatter = logging.Formatter('%(message)s')
157
193
  logger = logging.getLogger()
@@ -208,12 +244,13 @@ class MATRIX:
208
244
  assert max_mass >= min_mass
209
245
  mass_grid = np.linspace(min_mass, max_mass, steps_mass) if mass_grid_geom == "lin" \
210
246
  else np.logspace(np.log10(min_mass), np.log10(max_mass), steps_period)
211
- inject_dir = inject_dir if inject_dir is not None else self.retrieve_object_data()
247
+ if inject_dir is None:
248
+ inject_dir, object_info, lc_build, self.search_input = MATRIX.retrieve_object_data(self.search_input)
212
249
  habitability_calculator = HabitabilityCalculator()
213
- semimajor_axis = HabitabilityCalculator().calculate_semi_major_axis(min_period, self.mstar.value)
214
- rstar_au = self.rstar.to(u.au).value
250
+ semimajor_axis = HabitabilityCalculator().calculate_semi_major_axis(min_period, self.search_input.mstar.value)
251
+ rstar_au = self.search_input.rstar.to(u.au).value
215
252
  if rstar_au / semimajor_axis >= 1:
216
- period_for_rstar = habitability_calculator.au_to_period(self.mstar.value, rstar_au)
253
+ period_for_rstar = habitability_calculator.au_to_period(self.search_input.mstar.value, rstar_au)
217
254
  raise ValueError(
218
255
  "Your minimum period is in a shorter orbit than the star radius. The minimum period for this star should be > " + str(
219
256
  round(period_for_rstar, 2)) + ' days')
@@ -227,9 +264,9 @@ class MATRIX:
227
264
  for t0 in np.linspace(time[0], time[0] + period, phases + 2)[1:-1]:
228
265
  for mplanet in mass_grid:
229
266
  mplanet = np.around(mplanet, decimals=2) * u.M_earth
230
- inject_models.append(InjectRvModel(inject_dir, time, rv, rv_err, self.rstar, self.mstar, t0,
267
+ inject_models.append(InjectRvModel(inject_dir, time, rv, rv_err, self.search_input.rstar, self.search_input.mstar, t0,
231
268
  period, mplanet))
232
- with Pool(processes=self.cores) as pool:
269
+ with Pool(processes=self.search_input.cores) as pool:
233
270
  pool.map(InjectRvModel.make_model, inject_models)
234
271
  return inject_dir, period_grid, mass_grid
235
272
 
@@ -270,41 +307,42 @@ class MATRIX:
270
307
  assert max_radius >= min_radius
271
308
  radius_grid = np.linspace(min_radius, max_radius, steps_radius) if radius_grid_geom == "lin" \
272
309
  else np.logspace(np.log10(min_radius), np.log10(max_radius), steps_period)
273
- inject_dir = inject_dir if inject_dir is not None else self.retrieve_object_data()
310
+ if inject_dir is None:
311
+ inject_dir, self.object_info, lc_build, self.search_input = MATRIX.retrieve_object_data(self.search_input)
274
312
  habitability_calculator = HabitabilityCalculator()
275
- semimajor_axis = HabitabilityCalculator().calculate_semi_major_axis(min_period, self.mstar.value)
276
- rstar_au = self.rstar.to(u.au).value
313
+ semimajor_axis = HabitabilityCalculator().calculate_semi_major_axis(min_period, self.search_input.mstar.value)
314
+ rstar_au = self.search_input.rstar.to(u.au).value
277
315
  if rstar_au / semimajor_axis >= 1:
278
- period_for_rstar = habitability_calculator.au_to_period(self.mstar.value, rstar_au)
316
+ period_for_rstar = habitability_calculator.au_to_period(self.search_input.mstar.value, rstar_au)
279
317
  raise ValueError(
280
318
  "Your minimum period is in a shorter orbit than the star radius. The minimum period for this star should be > " + str(
281
319
  round(period_for_rstar, 2)) + ' days')
282
- flux0 = self.lc_build.lc.flux.value
283
- time = self.lc_build.lc.time.value
284
- flux_err = self.lc_build.lc.flux_err.value
320
+ flux0 = lc_build.lc.flux.value
321
+ time = lc_build.lc.time.value
322
+ flux_err = lc_build.lc.flux_err.value
285
323
  inject_models = []
286
324
  for period in period_grid:
287
325
  for t0 in np.linspace(time[0], time[0] + period, phases + 2)[1:-1]:
288
326
  for rplanet in radius_grid:
289
327
  rplanet = np.around(rplanet, decimals=2) * u.R_earth
290
- inject_models.append(InjectModel(inject_dir, time, np.array(flux0), np.array(flux_err), self.rstar, self.mstar, t0,
291
- period, rplanet, self.exposure_time, self.ab))
292
- with Pool(processes=self.cores) as pool:
328
+ inject_models.append(InjectModel(inject_dir, time, np.array(flux0), np.array(flux_err), self.search_input.rstar, self.search_input.mstar, t0,
329
+ period, rplanet, self.search_input.exposure_time, self.search_input.ab))
330
+ with Pool(processes=self.search_input.cores) as pool:
293
331
  pool.map(InjectModel.make_model, inject_models)
294
332
  return inject_dir, period_grid, radius_grid
295
333
 
296
334
  def recovery_rv_periods(self, filename, max_period_search, rv_masks=None, oversampling=1,
297
335
  cores=os.cpu_count() - 1):
298
- inject_dir = self.retrieve_object_data()
336
+ inject_dir = MATRIX.retrieve_object_data(self.search_input)
299
337
  if rv_masks is None:
300
338
  rv_masks = {}
301
339
  rv_df = pd.read_csv(filename)
302
340
  rv_df = rv_df.dropna()
303
341
  rv_df = rv_df.sort_values(by=['bjd'], ascending=True)
304
- period_grid_size = int((max_period_search - self.MIN_SEARCH_PERIOD) * 100 * oversampling)
342
+ period_grid_size = int((max_period_search - MATRIX.MIN_SEARCH_PERIOD) * 100 * oversampling)
305
343
  rv_data, period_grid, k_grid, omega_grid, msin_grid, least_squares_grid, argmax_sde, power, snr, SDE = \
306
344
  RvFitter.recover_periods(rv_df, period_grid_geom='log', steps_period=period_grid_size, period_min=0.5,
307
- max_period=max_period_search, rv_masks=rv_masks, star_mass=self.star_info.mass,
345
+ max_period=max_period_search, rv_masks=rv_masks, star_mass=self.search_input.star_info.mass,
308
346
  cpus=cores)
309
347
  positive_power_mask = power > np.percentile(power, 1)
310
348
  power = np.array(power)[positive_power_mask]
@@ -412,75 +450,175 @@ class MATRIX:
412
450
  transit_template = 'default'
413
451
  elif transit_template == 'bls':
414
452
  transit_template = 'box'
453
+ self.search_input.use_search_cache = use_search_cache
454
+ self.search_input.snr_threshold = snr_threshold
455
+ self.search_input.detrend_method = detrend_method
456
+ self.search_input.detrend_ws = detrend_ws
457
+ self.search_input.run_limit = run_limit
458
+ self.search_input.oversampling = oversampling
459
+ self.search_input.custom_search_algorithm = custom_search_algorithm
460
+ self.search_input.max_period_search = max_period_search
461
+ self.search_input.transit_template = transit_template
462
+ self.search_input.signal_selection_mode = signal_selection_mode
463
+ self.search_input.use_search_cache = use_search_cache
415
464
  reports_df = pd.DataFrame(columns=['period', 'radius', 'epoch', 'duration_found', 'period_found', 'epoch_found',
416
465
  'found', 'snr', 'sde', 'run'])
417
466
  run_reports_df = pd.DataFrame(columns=['period', 'radius', 'epoch', 'duration_found', 'period_found', 'epoch_found',
418
467
  'found', 'snr', 'sde', 'run'])
419
- for file in sorted(os.listdir(inject_dir)):
420
- file_name_matches = re.search("P([0-9]+\\.*[0-9]*)+_R([0-9]+\\.*[0-9]*)_T([0-9]+\\.*[0-9]*)\\.csv", file)
421
- if file_name_matches is not None:
422
- try:
423
- period = float(file_name_matches[1])
424
- r_planet = float(file_name_matches[2])
425
- epoch = float(file_name_matches[3])
426
- df = pd.read_csv(inject_dir + file, float_precision='round_trip', sep=',',
427
- usecols=['#time', 'flux', 'flux_err'])
428
- if len(df) == 0:
429
- founds = [True]
430
- snrs = [20]
431
- sdes = [self.SDE_ROCHE]
432
- runs = [1]
433
- durations_found = [20]
434
- epochs_found = [0]
435
- periods_found = [0]
436
- else:
437
- found_entries = reports_df.loc[(reports_df['period'] == period) &
438
- (reports_df['epoch'] == epoch) &
439
- (reports_df['radius'] <= r_planet) &
440
- (reports_df['found'] == True)]
441
- if not use_search_cache or len(found_entries) == 0:
442
- self.retrieve_object_data_for_recovery(inject_dir + "/", inject_dir + file)
443
- founds, snrs, sdes, runs, durations_found, periods_found, epochs_found = \
444
- self.__search(self.lc_build.lc.time.value, self.lc_build.lc.flux.value, self.radius,
445
- self.radiusmin, self.radiusmax, self.mass, self.massmin,
446
- self.massmax, self.ab, epoch, period, self.MIN_SEARCH_PERIOD,
447
- max_period_search, snr_threshold,
448
- transit_template, detrend_method, detrend_ws,
449
- self.lc_build.transits_min_count, run_limit, custom_search_algorithm,
450
- oversampling, signal_selection_mode)
451
- else:
468
+ m = multiprocessing.Manager()
469
+ lock = m.Lock()
470
+ if transit_template == 'bls-periodogram':
471
+ search_inputs: list = []
472
+ reports_df.to_csv(inject_dir + '/a_tls_report.csv', index=False)
473
+ run_reports_df.to_csv(inject_dir + '/a_tls_report_per_run.csv', index=False)
474
+ for file in sorted(os.listdir(inject_dir)):
475
+ file_name_matches = re.search("P([0-9]+\\.*[0-9]*)+_R([0-9]+\\.*[0-9]*)_T([0-9]+\\.*[0-9]*)\\.csv", file)
476
+ if file_name_matches is not None:
477
+ search_input = copy.deepcopy(self.search_input)
478
+ search_input.period = float(file_name_matches[1])
479
+ search_input.r_planet = float(file_name_matches[2])
480
+ search_input.epoch = float(file_name_matches[3])
481
+ search_input.inject_file_dir = inject_dir + file
482
+ search_input.dir = inject_dir
483
+ search_inputs = search_inputs + [search_input]
484
+ with Pool(processes=self.search_input.cores) as pool:
485
+ pool.starmap(MATRIX.recover_period, [(search_input, lock) for search_input in search_inputs])
486
+ else:
487
+ search_input = self.search_input
488
+ for file in sorted(os.listdir(inject_dir)):
489
+ file_name_matches = re.search("P([0-9]+\\.*[0-9]*)+_R([0-9]+\\.*[0-9]*)_T([0-9]+\\.*[0-9]*)\\.csv", file)
490
+ if file_name_matches is not None:
491
+ try:
492
+ period = float(file_name_matches[1])
493
+ r_planet = float(file_name_matches[2])
494
+ epoch = float(file_name_matches[3])
495
+ df = pd.read_csv(inject_dir + file, float_precision='round_trip', sep=',', usecols=['#time', 'flux', 'flux_err'])
496
+ if len(df) == 0:
452
497
  founds = [True]
453
- snrs = [float(str(found_entries.iloc[0]['snr']).split(',')[-1])]
454
- sdes = [float(str(found_entries.iloc[0]['sde']).split(',')[-1])]
455
- runs = [int(str(found_entries.iloc[0]['run']).split(',')[-1])]
456
- durations_found = [float(str(found_entries.iloc[0]['duration_found']).split(',')[-1])]
457
- periods_found = [float(str(found_entries.iloc[0]['period_found']).split(',')[-1])]
458
- epochs_found = [float(str(found_entries.iloc[0]['epoch_found']).split(',')[-1])]
459
- new_report = {"period": period, "radius": r_planet, "epoch": epoch,
460
- "found": founds[-1], "snr": ','.join([str(i) for i in snrs]),
461
- "sde": ','.join([str(i) for i in sdes]), "run": ','.join([str(i) for i in runs]),
462
- "duration_found": ','.join([str(i) for i in durations_found]),
463
- "period_found": ','.join([str(i) for i in periods_found]),
464
- "epoch_found": ','.join([str(i) for i in epochs_found])}
465
- reports_df = reports_df.append(new_report, ignore_index=True)
466
- for i in np.arange(0, len(founds)):
467
- run_reports_df = run_reports_df.append(
468
- {"period": period, "radius": r_planet, "epoch": epoch, "found": founds[i], "snr": snrs[i],
469
- "sde": sdes[i], "run": runs[i], "duration_found": durations_found[i],
470
- "period_found": periods_found[i], "epoch_found": epochs_found[i]}, ignore_index=True)
471
- print("P=" + str(period) + ", R=" + str(r_planet) + ", T0=" + str(epoch) + ", FOUND WAS " + str(
472
- founds[-1]) +
473
- " WITH SNRs " + str(snrs) + " AND SDEs " + str(sdes))
474
- reports_df = reports_df.sort_values(['period', 'radius', 'epoch'], ascending=[True, True, True])
475
- run_reports_df = run_reports_df.sort_values(['period', 'radius', 'epoch', 'run'],
476
- ascending=[True, True, True, True])
477
- reports_df.to_csv(inject_dir + "a_tls_report.csv", index=False)
478
- run_reports_df.to_csv(inject_dir + "a_tls_report_per_run.csv", index=False)
479
- except Exception as e:
480
- traceback.print_exc()
481
- print("File not valid: " + file)
498
+ snrs = [20]
499
+ sdes = [MATRIX.SDE_ROCHE]
500
+ runs = [1]
501
+ durations_found = [20]
502
+ epochs_found = [0]
503
+ periods_found = [0]
504
+ else:
505
+ found_entries = reports_df.loc[(reports_df['period'] == period) &
506
+ (reports_df['epoch'] == epoch) &
507
+ (reports_df['radius'] <= r_planet) &
508
+ (reports_df['found'] == True)]
509
+ if not use_search_cache or len(found_entries) == 0:
510
+ lc_build, object_info = MATRIX.retrieve_object_data_for_recovery(inject_dir + "/", inject_dir + file, search_input)
511
+ founds, snrs, sdes, runs, durations_found, periods_found, epochs_found = \
512
+ MATRIX.search(lc_build.lc.time.value, lc_build.lc.flux.value, search_input.star_info.radius,
513
+ search_input.star_info.radius_min, search_input.star_info.radius_max,
514
+ search_input.star_info.mass, search_input.star_info.mass_min, search_input.star_info.mass_max,
515
+ search_input.ab, epoch, period, MATRIX.MIN_SEARCH_PERIOD, max_period_search, snr_threshold,
516
+ transit_template, detrend_method, detrend_ws, lc_build.transits_min_count, run_limit,
517
+ custom_search_algorithm, oversampling, signal_selection_mode, search_input.star_info,
518
+ search_input.cores, search_input.search_engine)
519
+ else:
520
+ founds = [True]
521
+ snrs = [float(str(found_entries.iloc[0]['snr']).split(',')[-1])]
522
+ sdes = [float(str(found_entries.iloc[0]['sde']).split(',')[-1])]
523
+ runs = [int(str(found_entries.iloc[0]['run']).split(',')[-1])]
524
+ durations_found = [float(str(found_entries.iloc[0]['duration_found']).split(',')[-1])]
525
+ periods_found = [float(str(found_entries.iloc[0]['period_found']).split(',')[-1])]
526
+ epochs_found = [float(str(found_entries.iloc[0]['epoch_found']).split(',')[-1])]
527
+ new_report = {"period": period, "radius": r_planet, "epoch": epoch,
528
+ "found": founds[-1], "snr": ','.join([str(i) for i in snrs]),
529
+ "sde": ','.join([str(i) for i in sdes]), "run": ','.join([str(i) for i in runs]),
530
+ "duration_found": ','.join([str(i) for i in durations_found]),
531
+ "period_found": ','.join([str(i) for i in periods_found]),
532
+ "epoch_found": ','.join([str(i) for i in epochs_found])}
533
+ reports_df = reports_df.append(new_report, ignore_index=True)
534
+ for i in np.arange(0, len(founds)):
535
+ run_reports_df = run_reports_df.append(
536
+ {"period": period, "radius": r_planet, "epoch": epoch, "found": founds[i], "snr": snrs[i],
537
+ "sde": sdes[i], "run": runs[i], "duration_found": durations_found[i],
538
+ "period_found": periods_found[i], "epoch_found": epochs_found[i]}, ignore_index=True)
539
+ print("P=" + str(period) + ", R=" + str(r_planet) + ", T0=" + str(epoch) + ", FOUND WAS " + str(
540
+ founds[-1]) +
541
+ " WITH SNRs " + str(snrs) + " AND SDEs " + str(sdes))
542
+ reports_df = reports_df.sort_values(['period', 'radius', 'epoch'], ascending=[True, True, True])
543
+ run_reports_df = run_reports_df.sort_values(['period', 'radius', 'epoch', 'run'],
544
+ ascending=[True, True, True, True])
545
+ reports_df.to_csv(inject_dir + "a_tls_report.csv", index=False)
546
+ run_reports_df.to_csv(inject_dir + "a_tls_report_per_run.csv", index=False)
547
+ except Exception as e:
548
+ traceback.print_exc()
549
+ print("File not valid: " + file)
482
550
  self.remove_non_results_files(inject_dir)
483
551
 
552
+ @staticmethod
553
+ def recover_period(search_input: SearchInput, lock):
554
+ try:
555
+ df = pd.read_csv(search_input.inject_file_dir, float_precision='round_trip', sep=',',
556
+ usecols=['#time', 'flux', 'flux_err'])
557
+ if len(df) == 0:
558
+ founds = [True]
559
+ snrs = [20]
560
+ sdes = [MATRIX.SDE_ROCHE]
561
+ runs = [1]
562
+ durations_found = [20]
563
+ epochs_found = [0]
564
+ periods_found = [0]
565
+ else:
566
+ with lock:
567
+ reports_df = pd.read_csv(search_input.dir + "a_tls_report.csv")
568
+ run_reports_df = pd.read_csv(search_input.dir + "a_tls_report_per_run.csv")
569
+ found_entries = reports_df.loc[(reports_df['period'] == search_input.period) &
570
+ (reports_df['epoch'] == search_input.epoch) &
571
+ (reports_df['radius'] <= search_input.r_planet) &
572
+ (reports_df['found'] == True)]
573
+ if not search_input.use_search_cache or len(found_entries) == 0:
574
+ lc_build, object_info = MATRIX.retrieve_object_data_for_recovery(search_input.dir + "/",
575
+ search_input.inject_file_dir, search_input)
576
+ founds, snrs, sdes, runs, durations_found, periods_found, epochs_found = \
577
+ MATRIX.search(lc_build.lc.time.value, lc_build.lc.flux.value, search_input.star_info.radius,
578
+ search_input.star_info.radius_min, search_input.star_info.radius_max,
579
+ search_input.star_info.mass, search_input.star_info.mass_min,
580
+ search_input.star_info.mass_max,
581
+ search_input.ab, search_input.epoch, search_input.period, MATRIX.MIN_SEARCH_PERIOD,
582
+ search_input.max_period_search, search_input.snr_threshold, search_input.transit_template,
583
+ search_input.detrend_method, search_input.detrend_ws, lc_build.transits_min_count,
584
+ search_input.run_limit, search_input.custom_search_algorithm, search_input.oversampling,
585
+ search_input.signal_selection_mode, search_input.star_info, search_input.cores,
586
+ search_input.search_engine)
587
+ else:
588
+ founds = [True]
589
+ snrs = [float(str(found_entries.iloc[0]['snr']).split(',')[-1])]
590
+ sdes = [float(str(found_entries.iloc[0]['sde']).split(',')[-1])]
591
+ runs = [int(str(found_entries.iloc[0]['run']).split(',')[-1])]
592
+ durations_found = [float(str(found_entries.iloc[0]['duration_found']).split(',')[-1])]
593
+ periods_found = [float(str(found_entries.iloc[0]['period_found']).split(',')[-1])]
594
+ epochs_found = [float(str(found_entries.iloc[0]['epoch_found']).split(',')[-1])]
595
+ new_report = {"period": search_input.period, "radius": search_input.r_planet, "epoch": search_input.epoch,
596
+ "found": founds[-1], "snr": ','.join([str(i) for i in snrs]),
597
+ "sde": ','.join([str(i) for i in sdes]), "run": ','.join([str(i) for i in runs]),
598
+ "duration_found": ','.join([str(i) for i in durations_found]),
599
+ "period_found": ','.join([str(i) for i in periods_found]),
600
+ "epoch_found": ','.join([str(i) for i in epochs_found])}
601
+ with lock:
602
+ reports_df = pd.read_csv(search_input.dir + "a_tls_report.csv")
603
+ run_reports_df = pd.read_csv(search_input.dir + "a_tls_report_per_run.csv")
604
+ reports_df = reports_df.append(new_report, ignore_index=True)
605
+ for i in np.arange(0, len(founds)):
606
+ run_reports_df = run_reports_df.append(
607
+ {"period": search_input.period, "radius": search_input.r_planet, "epoch": search_input.epoch, "found": founds[i], "snr": snrs[i],
608
+ "sde": sdes[i], "run": runs[i], "duration_found": durations_found[i],
609
+ "period_found": periods_found[i], "epoch_found": epochs_found[i]}, ignore_index=True)
610
+ print("P=" + str(search_input.period) + ", R=" + str(search_input.r_planet) + ", T0=" + str(search_input.epoch) + ", FOUND WAS " + str(
611
+ founds[-1]) +
612
+ " WITH SNRs " + str(snrs) + " AND SDEs " + str(sdes))
613
+ reports_df = reports_df.sort_values(['period', 'radius', 'epoch'], ascending=[True, True, True])
614
+ run_reports_df = run_reports_df.sort_values(['period', 'radius', 'epoch', 'run'],
615
+ ascending=[True, True, True, True])
616
+ reports_df.to_csv(search_input.dir + "a_tls_report.csv", index=False)
617
+ run_reports_df.to_csv(search_input.dir + "a_tls_report_per_run.csv", index=False)
618
+ except Exception as e:
619
+ traceback.print_exc()
620
+ print("File not valid: " + search_input.inject_file_dir)
621
+
484
622
  def remove_non_results_files(self, inject_dir):
485
623
  """
486
624
  Deletes all the files that belong to the injection stage are hence are not necessary for the results
@@ -491,7 +629,7 @@ class MATRIX:
491
629
  for file in os.listdir(inject_dir):
492
630
  if "rv_thresholds" not in file and "inj-rec" not in file and file.endswith(".png"):
493
631
  os.remove(inject_dir + file)
494
- if not self.preserve:
632
+ if not self.search_input.preserve:
495
633
  for file in os.listdir(inject_dir):
496
634
  if file.endswith(".csv") and (file.startswith("P") or file.startswith("RV_P")):
497
635
  os.remove(inject_dir + file)
@@ -608,42 +746,44 @@ class MATRIX:
608
746
  plt.savefig(output_dir + '/inj-rec-diff.png', bbox_inches='tight', dpi=200)
609
747
  plt.close()
610
748
 
611
- def __search(self, time, flux, rstar, rstar_min, rstar_max, mass, mstar_min, mstar_max, ab, epoch,
612
- period, min_period, max_period, min_snr, transit_template, detrend_method, ws, transits_min_count,
613
- run_limit, custom_search_algorithm, oversampling, signal_selection_mode):
749
+ @staticmethod
750
+ def search(time, flux, rstar, rstar_min, rstar_max, mass, mstar_min, mstar_max, ab, epoch,
751
+ period, min_period, max_period, min_snr, transit_template, detrend_method, ws, transits_min_count,
752
+ run_limit, custom_search_algorithm, oversampling, signal_selection_mode, star_info, cores, search_engine):
614
753
  tls_period_grid, oversampling = LcbuilderHelper.calculate_period_grid(time, min_period, max_period,
615
- oversampling, self.star_info,
754
+ oversampling, star_info,
616
755
  transits_min_count)
617
756
  if custom_search_algorithm is not None:
618
757
  return custom_search_algorithm.search(time, flux, rstar, rstar_min, rstar_max, mass, mstar_min, mstar_max,
619
- ab, epoch, period, min_period, max_period, min_snr, self.cores,
758
+ ab, epoch, period, min_period, max_period, min_snr, cores,
620
759
  transit_template, detrend_method, ws, transits_min_count,
621
760
  signal_selection_mode, run_limit)
622
761
  elif transit_template == 'bls-periodogram':
623
762
  return BlsCustomSearchAlgorithm()\
624
763
  .search(time, flux, rstar, rstar_min, rstar_max, mass, mstar_min, mstar_max,
625
- ab, epoch, period, min_period, max_period, min_snr, self.cores,
764
+ ab, epoch, period, min_period, max_period, min_snr, cores,
626
765
  transit_template, detrend_method, ws, transits_min_count,
627
766
  signal_selection_mode, run_limit, oversampling)
628
767
  else:
629
- return self.__tls_search(time, flux, rstar, rstar_min, rstar_max, mass, mstar_min, mstar_max, ab, epoch,
630
- period, min_period, max_period, min_snr, self.cores, transit_template,
768
+ return MATRIX.tls_search(time, flux, rstar, rstar_min, rstar_max, mass, mstar_min, mstar_max, ab, epoch,
769
+ period, min_period, max_period, min_snr, cores, transit_template,
631
770
  detrend_method, ws, transits_min_count, run_limit, tls_period_grid,
632
- signal_selection_mode)
771
+ signal_selection_mode, search_engine)
633
772
 
634
- def __tls_search(self, time, flux, rstar, rstar_min, rstar_max, mass, mstar_min, mstar_max, ab, epoch,
773
+ @staticmethod
774
+ def tls_search(time, flux, rstar, rstar_min, rstar_max, mass, mstar_min, mstar_max, ab, epoch,
635
775
  period, min_period, max_period, min_snr, cores, transit_template, detrend_method, ws,
636
- transits_min_count, run_limit, tls_period_grid, signal_selection_mode):
776
+ transits_min_count, run_limit, tls_period_grid, signal_selection_mode, search_engine):
637
777
  snr = 1e12
638
778
  found_signal = False
639
779
  time, flux = cleaned_array(time, flux)
640
780
  run = 0
641
781
  if ws > 0:
642
- if detrend_method == self.DETREND_BIWEIGHT:
782
+ if detrend_method == MATRIX.DETREND_BIWEIGHT:
643
783
  flux = wotan.flatten(time, flux, window_length=ws, return_trend=False, method=detrend_method,
644
784
  break_tolerance=0.5)
645
- elif detrend_method == self.DETREND_GP:
646
- flux = wotan.flatten(time, flux, method=self.DETREND_GP, kernel='matern', kernel_size=ws,
785
+ elif detrend_method == MATRIX.DETREND_GP:
786
+ flux = wotan.flatten(time, flux, method=MATRIX.DETREND_GP, kernel='matern', kernel_size=ws,
647
787
  return_trend=False, break_tolerance=0.5)
648
788
  found_signals = []
649
789
  snrs = []
@@ -669,8 +809,8 @@ class MATRIX:
669
809
  use_threads=cores,
670
810
  transit_template=transit_template,
671
811
  period_grid=tls_period_grid,
672
- use_gpu=self.search_engine == 'gpu' or self.search_engine == 'gpu_approximate',
673
- gpu_approximate=self.search_engine == 'gpu_approximate'
812
+ use_gpu=search_engine == 'gpu' or search_engine == 'gpu_approximate',
813
+ gpu_approximate=search_engine == 'gpu_approximate'
674
814
  )
675
815
  snr = results.snr
676
816
  if results.snr >= min_snr:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tkmatrix
3
- Version: 0.9.2
3
+ Version: 0.10.0
4
4
  Summary: ToolKit for Multi-phAse Transits Recovery from Injected eXoplanets
5
5
  Home-page: https://github.com/PlanetHunters/tkmatrix
6
6
  Author: M. Dévora-Pajares & F.J. Pozuelos
@@ -3,7 +3,7 @@ beautifulsoup4==4.9.3
3
3
  configparser==5.0.1
4
4
  corner==2.1.0
5
5
  ellc==1.8.5
6
- lcbuilder==0.18.2
6
+ lcbuilder==0.18.3
7
7
  mock==4.0.3
8
8
  pyparsing==2.4.7
9
9
  seaborn==0.11.1
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes