asteroid_spinprops 0.2.20__tar.gz → 0.2.21__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.
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/PKG-INFO +1 -1
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/periodest.py +124 -12
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/pyproject.toml +1 -1
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/README.md +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/__init__.py +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/__init__.py +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/dataprep.py +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/modelfit.py +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/pipetools.py +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/ssptools.py +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/atlas_x_ztf_testing/test_pqfile_1.parquet +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/atlas_x_ztf_testing/test_pqfile_2.parquet +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2000 WL152 +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2001 PC +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2001 SG276 +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2008 GX32 +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2009 BE185 +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2011 EY17 +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2134 T-1 +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Bellmore +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Dermott +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Duke +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Izenberg +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Lermontov +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Poullain +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Sonneberga +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/testing_ssoname_keys.pkl +0 -0
- {asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/utils.py +0 -0
{asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/periodest.py
RENAMED
|
@@ -86,6 +86,106 @@ def get_period_estimate(residuals_dataframe, p_min=0.03, p_max=2):
|
|
|
86
86
|
)
|
|
87
87
|
|
|
88
88
|
|
|
89
|
+
def get_multiband_period_estimate(
|
|
90
|
+
residuals_dataframe, p_min=0.03, p_max=2, k_free=True, k_val=None
|
|
91
|
+
):
|
|
92
|
+
period_min, period_max = p_min, p_max
|
|
93
|
+
period_range = (period_min, period_max)
|
|
94
|
+
results = []
|
|
95
|
+
residuals = np.zeros(len(residuals_dataframe["filters"].values))
|
|
96
|
+
bands = np.unique(residuals_dataframe["filters"].values)
|
|
97
|
+
if k_free:
|
|
98
|
+
for k in range(1, 11):
|
|
99
|
+
model = LombScargleMultiband(
|
|
100
|
+
residuals_dataframe["jd"].values,
|
|
101
|
+
residuals_dataframe["residuals"].values,
|
|
102
|
+
residuals_dataframe["filters"].values,
|
|
103
|
+
residuals_dataframe["sigma"].values,
|
|
104
|
+
normalization="standard",
|
|
105
|
+
fit_mean=True,
|
|
106
|
+
nterms_base=k,
|
|
107
|
+
nterms_band=1,
|
|
108
|
+
)
|
|
109
|
+
frequency, power = model.autopower(
|
|
110
|
+
method="fast",
|
|
111
|
+
sb_method="fastnifty_chi2",
|
|
112
|
+
minimum_frequency=1 / period_range[1],
|
|
113
|
+
maximum_frequency=1 / period_range[0],
|
|
114
|
+
samples_per_peak=5,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
f_best = frequency[np.argmax(power)]
|
|
118
|
+
y_model = model.model(
|
|
119
|
+
residuals_dataframe["jd"].values, f_best, bands_fit=bands
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# y_model.shape is (n_bands, len(time))
|
|
123
|
+
|
|
124
|
+
for n, f in enumerate(bands):
|
|
125
|
+
bindex = np.where(residuals_dataframe["filters"].values == f)
|
|
126
|
+
residuals[bindex] = (
|
|
127
|
+
residuals_dataframe["residuals"].values[bindex] - y_model[n][bindex]
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
rms = np.sqrt(np.mean(residuals**2))
|
|
131
|
+
n_params = 2 * k + 1 + 3 * len(bands)
|
|
132
|
+
dof = len(residuals) - n_params
|
|
133
|
+
|
|
134
|
+
results.append((k, f_best, rms, dof, n_params))
|
|
135
|
+
|
|
136
|
+
model_comparison = pd.DataFrame()
|
|
137
|
+
|
|
138
|
+
for i in range(len(results) - 1):
|
|
139
|
+
k, f_best, rss, dof, n_params = results[i]
|
|
140
|
+
k_next, f_best_next, rss_next, dof_next, n_params_next = results[i + 1]
|
|
141
|
+
F = ((rss - rss_next) / (dof - dof_next)) / (rss_next / dof_next)
|
|
142
|
+
|
|
143
|
+
# Here crit = Fstat value for which model_2 (more complex) is in fact better than model_1 (less complex)
|
|
144
|
+
crit = f.ppf(
|
|
145
|
+
q=0.99,
|
|
146
|
+
dfn=n_params_next - n_params,
|
|
147
|
+
dfd=len(residuals) - n_params_next,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
model_comparison.loc[i, "k"] = k
|
|
151
|
+
model_comparison.loc[i, "k_next"] = k_next
|
|
152
|
+
model_comparison.loc[i, "f_best"] = f_best
|
|
153
|
+
model_comparison.loc[i, "Fstat"] = F
|
|
154
|
+
model_comparison.loc[i, "alpha_crit"] = crit
|
|
155
|
+
|
|
156
|
+
cond = model_comparison["Fstat"] > model_comparison["alpha_crit"]
|
|
157
|
+
model_comparison = model_comparison[
|
|
158
|
+
~cond
|
|
159
|
+
] # don't go for the more complex model
|
|
160
|
+
f_chosen = model_comparison[
|
|
161
|
+
model_comparison.k == model_comparison.k.min()
|
|
162
|
+
].f_best[0] # Simplest model
|
|
163
|
+
if not k_free:
|
|
164
|
+
model = LombScargleMultiband(
|
|
165
|
+
residuals_dataframe["jd"].values,
|
|
166
|
+
residuals_dataframe["residuals"].values,
|
|
167
|
+
residuals_dataframe["filters"].values,
|
|
168
|
+
residuals_dataframe["sigma"].values,
|
|
169
|
+
normalization="standard",
|
|
170
|
+
fit_mean=True,
|
|
171
|
+
nterms_base=k_val,
|
|
172
|
+
nterms_band=1,
|
|
173
|
+
)
|
|
174
|
+
frequency, power = model.autopower(
|
|
175
|
+
method="fast",
|
|
176
|
+
sb_method="fastnifty_chi2",
|
|
177
|
+
minimum_frequency=1 / period_range[1],
|
|
178
|
+
maximum_frequency=1 / period_range[0],
|
|
179
|
+
samples_per_peak=5,
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
f_best = frequency[np.argmax(power)]
|
|
183
|
+
f_chosen = f_best
|
|
184
|
+
period_in = 2 * (1 / f_chosen)
|
|
185
|
+
|
|
186
|
+
return period_in
|
|
187
|
+
|
|
188
|
+
|
|
89
189
|
def plot_periodograms(signal, window, name=None, axis="frequency"):
|
|
90
190
|
if name is not None:
|
|
91
191
|
r = rocks.Rock(name, datacloud="spins")
|
|
@@ -231,18 +331,30 @@ def plot_periodograms(signal, window, name=None, axis="frequency"):
|
|
|
231
331
|
plt.tight_layout()
|
|
232
332
|
|
|
233
333
|
|
|
234
|
-
def perform_residual_resampling(resid_df):
|
|
235
|
-
|
|
236
|
-
|
|
334
|
+
def perform_residual_resampling(resid_df, p_min, p_max, k=1):
|
|
335
|
+
if k == 1:
|
|
336
|
+
sg, w, _ = get_period_estimate(resid_df)
|
|
337
|
+
Pog = 48 / sg[2][0] # in hours
|
|
237
338
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
cond = np.abs(Pog - Pbs) / Pog < 1e-2
|
|
246
|
-
Nbs = np.sum(np.ones(25)[cond])
|
|
339
|
+
# Bootstrap residuals:
|
|
340
|
+
Pbs = np.zeros(25)
|
|
341
|
+
for n in range(25):
|
|
342
|
+
BS_df = resid_df.sample(n=len(resid_df), replace=True)
|
|
343
|
+
sg, w, _ = get_period_estimate(BS_df)
|
|
344
|
+
Pbs[n] = 48 / sg[2][0]
|
|
247
345
|
|
|
346
|
+
cond = np.abs(Pog - Pbs) / Pog < 1e-2
|
|
347
|
+
Nbs = np.sum(np.ones(25)[cond])
|
|
348
|
+
if k > 1:
|
|
349
|
+
Pog = 24 / get_multiband_period_estimate(
|
|
350
|
+
resid_df, p_min=p_min, p_max=p_max, k_free=False, k_val=k
|
|
351
|
+
)
|
|
352
|
+
Pbs = np.zeros(25)
|
|
353
|
+
for n in range(25):
|
|
354
|
+
BS_df = resid_df.sample(n=len(resid_df), replace=True)
|
|
355
|
+
Pbs[n] = 24 / get_multiband_period_estimate(
|
|
356
|
+
BS_df, p_min=p_min, p_max=p_max, k_free=False, k_val=k
|
|
357
|
+
)
|
|
358
|
+
cond = np.abs(Pog - Pbs) / Pog < 1e-2
|
|
359
|
+
Nbs = np.sum(np.ones(25)[cond])
|
|
248
360
|
return BS_df, Nbs
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "asteroid_spinprops"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.21"
|
|
4
4
|
description = "Collection of tools used for fitting sHG1G2 and ssHG1G2 photometric models to sparse asteroid photometry"
|
|
5
5
|
authors = [
|
|
6
6
|
{name = "Odysseas",email = "odysseas.xenos@proton.me"}
|
|
File without changes
|
|
File without changes
|
{asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/__init__.py
RENAMED
|
File without changes
|
{asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/dataprep.py
RENAMED
|
File without changes
|
{asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/modelfit.py
RENAMED
|
File without changes
|
{asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/pipetools.py
RENAMED
|
File without changes
|
{asteroid_spinprops-0.2.20 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/ssptools.py
RENAMED
|
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
|
|
File without changes
|
|
File without changes
|