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.
- {tkmatrix-0.9.2/tkmatrix.egg-info → tkmatrix-0.10.0}/PKG-INFO +1 -1
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/setup.py +2 -2
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/custom_algorithms/BlsCustomSearchAlgorithm.py +2 -1
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/tests/test_tkmatrix.py +31 -31
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/tkmatrix_class.py +324 -184
- {tkmatrix-0.9.2 → tkmatrix-0.10.0/tkmatrix.egg-info}/PKG-INFO +1 -1
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix.egg-info/requires.txt +1 -1
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/LICENSE +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/MANIFEST.in +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/README.md +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/setup.cfg +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/__init__.py +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/__main__.py +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/custom_algorithms/__init__.py +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/custom_algorithms/custom_search.py +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/inject_model.py +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/inject_rv_model.py +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/programmatic.py +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/properties.yaml +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/rv.py +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix/tests/__init__.py +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix.egg-info/SOURCES.txt +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix.egg-info/dependency_links.txt +0 -0
- {tkmatrix-0.9.2 → tkmatrix-0.10.0}/tkmatrix.egg-info/top_level.txt +0 -0
|
@@ -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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
23
|
-
self.assertAlmostEqual(0.5, matrix.
|
|
24
|
-
self.assertAlmostEqual(0.18, matrix.radius, 2)
|
|
25
|
-
self.assertAlmostEqual(0.076, matrix.
|
|
26
|
-
self.assertAlmostEqual(0.284, matrix.
|
|
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.
|
|
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.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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 =
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
139
|
-
|
|
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
|
-
|
|
142
|
-
|
|
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
|
-
|
|
145
|
-
|
|
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 =
|
|
183
|
+
inject_dir = dir + "/" + object_info.mission_id().replace(" ", "") + "_ir_" + str(index) + "/"
|
|
149
184
|
index = index + 1
|
|
150
185
|
os.mkdir(inject_dir)
|
|
151
|
-
|
|
186
|
+
MATRIX.setup_logging(inject_dir)
|
|
152
187
|
return inject_dir
|
|
153
188
|
|
|
154
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
283
|
-
time =
|
|
284
|
-
flux_err =
|
|
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 =
|
|
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 -
|
|
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
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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 = [
|
|
454
|
-
sdes = [
|
|
455
|
-
runs = [
|
|
456
|
-
durations_found = [
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
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
|
-
|
|
612
|
-
|
|
613
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
630
|
-
period, min_period, max_period, min_snr,
|
|
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
|
-
|
|
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 ==
|
|
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 ==
|
|
646
|
-
flux = wotan.flatten(time, flux, method=
|
|
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=
|
|
673
|
-
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:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|