(11468) Shantanunaidu orbit determination test#

Let’s start by importing the necessary libraries#

[1]:
from grss import fit
import numpy as np
np.set_printoptions(precision=40, linewidth=np.inf)

We’ll then retrieve the cometary state of the asteroid (from JPL SBDB) plus any nongravitational accelerations acting on it.#

[2]:
body_id = '11468'
init_sol, init_cov, nongrav_info = fit.get_sbdb_info(body_id)
de_kernel = 440

Next, we’ll retrieve the observations from different sources (MPC, JPL, Gaia Data Releases) and prepare them for the orbit determination process.#

[3]:
add_gaia_obs = True
optical_obs_file = None
t_min_tdb = None
t_max_tdb = None
debias_lowres = True
deweight = True
eliminate = False
num_obs_per_night = 4
verbose = True
obs_df = fit.get_optical_obs(body_id, optical_obs_file, t_min_tdb, t_max_tdb, debias_lowres, deweight, eliminate, num_obs_per_night, verbose)
obs_df = fit.add_radar_obs(obs_df, t_min_tdb, t_max_tdb, verbose)
if add_gaia_obs:
    gaia_dr = 'gaiafpr'
    obs_df = fit.add_gaia_obs(obs_df, t_min_tdb, t_max_tdb, gaia_dr, verbose)
Read in 1866 observations from the MPC.
        Filtered to 1866 observations that satisfy the time range and accepted observatory constraints.
Applying Eggl et al. (2020) debiasing scheme to the observations.
        Unknown star catalog: GSC
        Unknown star catalog: UNK
        No debiasing needed for 842 observations.
        Debiased 984 observations.
        No bias information for 40 observations.
Applying Vereš et al. (2017) weighting scheme to the observations.
        Using 1538 CCD observations with station-specific weight rules.
Applying sqrt(N/4) deweighting scheme.
        Deweighted 493 observations.
Read in 308 Gaia observations from gaiafpr
        Filtered to 308 observations that satisfy the time range constraints.

All we need to do now is initialize the OD simulation and run the filter.#

[4]:
n_iter_max = 10
fit_sim = fit.FitSimulation(init_sol, obs_df, init_cov, n_iter_max=n_iter_max, de_kernel=de_kernel, nongrav_info=nongrav_info)
[5]:
fit_sim.filter_lsq()
Iteration               Unweighted RMS          Weighted RMS            Chi-squared             Reduced Chi-squared
1                        0.429                   0.565                   1386.899                        0.319
2                        0.429                   0.565                   1386.830                        0.319
Converged without rejecting outliers. Starting outlier rejection now...
3                        0.396                   0.544                   1287.239                        0.297
4                        0.396                   0.544                   1287.191                        0.297
Converged after rejecting outliers. Rejected 6 out of 2174 optical observations.

Let’s print some summary statistics and plot some results.#

[6]:
fit_sim.print_summary()
Summary of the orbit fit calculations after postfit pass:
==============================================================
RMS unweighted: 0.3959048572930057
RMS weighted: 0.5440974902965433
chi-squared: 1287.1909592615432
reduced chi-squared: 0.2972727388594788
square root of reduced chi-squared: 0.5452272359846662
--------------------------------------------------------------
Solution Time: MJD 57860.000 TDB = 2017-04-17 00:00:00.000 TDB
Solution Observation Arc: 16186.66 days (44.32 years)
--------------------------------------------------------------
Fitted Variable         Initial Value                   Uncertainty                     Fitted Value                    Uncertainty                     Change                          Change (sigma)
e                       1.66592142423e-01               2.22715641044e-09               1.66592142604e-01               2.22404561327e-09               +1.80469084121e-10              +0.081
q                       2.56467525705e+00               2.92752895115e-09               2.56467525703e+00               2.93869012856e-09               -1.96012095444e-11              -0.007
tp                      5.75110161496e+04               4.19431752321e-06               5.75110161499e+04               4.19509417178e-06               +2.99420207739e-07              +0.071
om                      2.06382747777e+02               6.73979521456e-06               2.06382747750e+02               6.76876065036e-06               -2.70412670034e-08              -0.004
w                       1.53929133333e+02               6.81013648089e-06               1.53929133431e+02               6.83871682888e-06               +9.85073711490e-08              +0.014
i                       7.89092453408e-01               8.48980314059e-08               7.89092458943e-01               8.50728793919e-08               +5.53498358258e-09              +0.065

[7]:
fit_sim.plot_summary(auto_close=True)
../../../_images/tests_python_fit_shantanunaidu_12_0.png
[8]:
fit_sim.iters[-1].plot_iteration_summary(title='Postfit Residuals', auto_close=True)
../../../_images/tests_python_fit_shantanunaidu_13_0.png
../../../_images/tests_python_fit_shantanunaidu_13_1.png
[9]:
mean_0 = np.array(list(init_sol.values())[1:])
cov_0 = init_cov
mean_f = np.array(list(fit_sim.x_nom.values()))
cov_f = fit_sim.covariance

maha_dist_f, maha_dist_0, bhattacharya, bhatt_coeff = fit.get_similarity_stats(mean_0, cov_0, mean_f, cov_f)
print(f'Mahalonobis distance between JPL and GRSS solution: {maha_dist_f:0.2f}')
print(f'Mahalonobis distance between GRSS and JPL solution: {maha_dist_0:0.2f}')
print(f'Bhattacharya distance between JPL and GRSS solution: {bhattacharya:0.4f}')
print(f'Bhattacharya coefficient between JPL and GRSS solution: {bhatt_coeff:0.4f}')
Mahalonobis distance between JPL and GRSS solution: 0.11
Mahalonobis distance between GRSS and JPL solution: 0.12
Bhattacharya distance between JPL and GRSS solution: 0.0000
Bhattacharya coefficient between JPL and GRSS solution: 1.0000

Finally, we’ll make sure the GRSS solution is statistically consistent with the JPL SBDB solution#

[10]:
assert maha_dist_f < 5.0
assert maha_dist_0 < 5.0
assert bhattacharya < 0.10
assert bhatt_coeff > 0.90
[ ]: