asteroid_spinprops 0.2.19__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.
Files changed (28) hide show
  1. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/PKG-INFO +6 -8
  2. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/periodest.py +124 -12
  3. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/pyproject.toml +6 -8
  4. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/README.md +0 -0
  5. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/__init__.py +0 -0
  6. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/__init__.py +0 -0
  7. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/dataprep.py +0 -0
  8. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/modelfit.py +0 -0
  9. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/pipetools.py +0 -0
  10. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/ssptools.py +0 -0
  11. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/atlas_x_ztf_testing/test_pqfile_1.parquet +0 -0
  12. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/atlas_x_ztf_testing/test_pqfile_2.parquet +0 -0
  13. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2000 WL152 +0 -0
  14. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2001 PC +0 -0
  15. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2001 SG276 +0 -0
  16. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2008 GX32 +0 -0
  17. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2009 BE185 +0 -0
  18. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2011 EY17 +0 -0
  19. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/2134 T-1 +0 -0
  20. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Bellmore +0 -0
  21. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Dermott +0 -0
  22. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Duke +0 -0
  23. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Izenberg +0 -0
  24. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Lermontov +0 -0
  25. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Poullain +0 -0
  26. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/ephemeris_testing/Sonneberga +0 -0
  27. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/testing/testing_ssoname_keys.pkl +0 -0
  28. {asteroid_spinprops-0.2.19 → asteroid_spinprops-0.2.21}/asteroid_spinprops/ssolib/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: asteroid_spinprops
3
- Version: 0.2.19
3
+ Version: 0.2.21
4
4
  Summary: Collection of tools used for fitting sHG1G2 and ssHG1G2 photometric models to sparse asteroid photometry
5
5
  License: MIT
6
6
  Author: Odysseas
@@ -13,14 +13,12 @@ Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Classifier: Programming Language :: Python :: 3.14
15
15
  Requires-Dist: astropy (==7.0.0)
16
- Requires-Dist: fink-utils (==0.41.0)
16
+ Requires-Dist: fink-utils (==0.43.0)
17
17
  Requires-Dist: matplotlib (==3.10.1)
18
- Requires-Dist: nifty-ls (==1.0.1)
19
- Requires-Dist: numpy (==2.2.5)
20
- Requires-Dist: pandas (==2.2.3)
21
- Requires-Dist: requests (==2.32.3)
22
- Requires-Dist: scipy (==1.15.2)
23
- Requires-Dist: space-rocks (==1.9.13)
18
+ Requires-Dist: nifty-ls (==1.1.0)
19
+ Requires-Dist: pandas (==2.3.3)
20
+ Requires-Dist: scipy (==1.16.2)
21
+ Requires-Dist: space-rocks (==1.9.14)
24
22
  Requires-Dist: tqdm (==4.67.1)
25
23
  Project-URL: Homepage, https://gitlab.com/odysseas_xenos/asteroid-spinprops
26
24
  Project-URL: Repository, https://gitlab.com/odysseas_xenos/asteroid-spinprops
@@ -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
- sg, w, _ = get_period_estimate(resid_df)
236
- Pog = 48 / sg[2][0] # in hours
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
- # Bootstrap residuals:
239
- Pbs = np.zeros(25)
240
- for n in range(25):
241
- BS_df = resid_df.sample(n=len(resid_df), replace=True)
242
- sg, w, _ = get_period_estimate(BS_df)
243
- Pbs[n] = 48 / sg[2][0]
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.19"
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"}
@@ -10,15 +10,13 @@ readme = "README.md"
10
10
  requires-python = ">=3.11"
11
11
  dependencies = [
12
12
  "astropy (==7.0.0)",
13
- "fink-utils (==0.41.0)",
13
+ "fink-utils (==0.43.0)",
14
14
  "matplotlib (==3.10.1)",
15
- "nifty-ls (==1.0.1)",
16
- "numpy (==2.2.5)",
17
- "pandas (==2.2.3)",
18
- "requests (==2.32.3)",
19
- "scipy (==1.15.2)",
15
+ "nifty-ls (==1.1.0)",
16
+ "pandas (==2.3.3)",
17
+ "scipy (==1.16.2)",
20
18
  "tqdm (==4.67.1)",
21
- "space-rocks (==1.9.13)"
19
+ "space-rocks (==1.9.14)"
22
20
  ]
23
21
 
24
22
  [tool.poetry]