nrl-tracker 0.22.5__py3-none-any.whl → 1.8.0__py3-none-any.whl

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 (86) hide show
  1. {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.8.0.dist-info}/METADATA +57 -10
  2. {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.8.0.dist-info}/RECORD +86 -69
  3. pytcl/__init__.py +4 -3
  4. pytcl/assignment_algorithms/__init__.py +28 -0
  5. pytcl/assignment_algorithms/dijkstra_min_cost.py +184 -0
  6. pytcl/assignment_algorithms/gating.py +10 -10
  7. pytcl/assignment_algorithms/jpda.py +40 -40
  8. pytcl/assignment_algorithms/nd_assignment.py +379 -0
  9. pytcl/assignment_algorithms/network_flow.py +464 -0
  10. pytcl/assignment_algorithms/network_simplex.py +167 -0
  11. pytcl/assignment_algorithms/three_dimensional/assignment.py +3 -3
  12. pytcl/astronomical/__init__.py +104 -3
  13. pytcl/astronomical/ephemerides.py +14 -11
  14. pytcl/astronomical/reference_frames.py +865 -56
  15. pytcl/astronomical/relativity.py +6 -5
  16. pytcl/astronomical/sgp4.py +710 -0
  17. pytcl/astronomical/special_orbits.py +532 -0
  18. pytcl/astronomical/tle.py +558 -0
  19. pytcl/atmosphere/__init__.py +43 -1
  20. pytcl/atmosphere/ionosphere.py +512 -0
  21. pytcl/atmosphere/nrlmsise00.py +809 -0
  22. pytcl/clustering/dbscan.py +2 -2
  23. pytcl/clustering/gaussian_mixture.py +3 -3
  24. pytcl/clustering/hierarchical.py +15 -15
  25. pytcl/clustering/kmeans.py +4 -4
  26. pytcl/containers/__init__.py +24 -0
  27. pytcl/containers/base.py +219 -0
  28. pytcl/containers/cluster_set.py +12 -2
  29. pytcl/containers/covertree.py +26 -29
  30. pytcl/containers/kd_tree.py +94 -29
  31. pytcl/containers/rtree.py +200 -1
  32. pytcl/containers/vptree.py +21 -28
  33. pytcl/coordinate_systems/conversions/geodetic.py +272 -5
  34. pytcl/coordinate_systems/jacobians/jacobians.py +2 -2
  35. pytcl/coordinate_systems/projections/__init__.py +1 -1
  36. pytcl/coordinate_systems/projections/projections.py +2 -2
  37. pytcl/coordinate_systems/rotations/rotations.py +10 -6
  38. pytcl/core/__init__.py +18 -0
  39. pytcl/core/validation.py +333 -2
  40. pytcl/dynamic_estimation/__init__.py +26 -0
  41. pytcl/dynamic_estimation/gaussian_sum_filter.py +434 -0
  42. pytcl/dynamic_estimation/imm.py +14 -14
  43. pytcl/dynamic_estimation/kalman/__init__.py +30 -0
  44. pytcl/dynamic_estimation/kalman/constrained.py +382 -0
  45. pytcl/dynamic_estimation/kalman/extended.py +8 -8
  46. pytcl/dynamic_estimation/kalman/h_infinity.py +613 -0
  47. pytcl/dynamic_estimation/kalman/square_root.py +60 -573
  48. pytcl/dynamic_estimation/kalman/sr_ukf.py +302 -0
  49. pytcl/dynamic_estimation/kalman/ud_filter.py +410 -0
  50. pytcl/dynamic_estimation/kalman/unscented.py +8 -6
  51. pytcl/dynamic_estimation/particle_filters/bootstrap.py +15 -15
  52. pytcl/dynamic_estimation/rbpf.py +589 -0
  53. pytcl/gravity/egm.py +13 -0
  54. pytcl/gravity/spherical_harmonics.py +98 -37
  55. pytcl/gravity/tides.py +6 -6
  56. pytcl/logging_config.py +328 -0
  57. pytcl/magnetism/__init__.py +7 -0
  58. pytcl/magnetism/emm.py +10 -3
  59. pytcl/magnetism/wmm.py +260 -23
  60. pytcl/mathematical_functions/combinatorics/combinatorics.py +5 -5
  61. pytcl/mathematical_functions/geometry/geometry.py +5 -5
  62. pytcl/mathematical_functions/numerical_integration/quadrature.py +6 -6
  63. pytcl/mathematical_functions/signal_processing/detection.py +24 -24
  64. pytcl/mathematical_functions/signal_processing/filters.py +14 -14
  65. pytcl/mathematical_functions/signal_processing/matched_filter.py +12 -12
  66. pytcl/mathematical_functions/special_functions/bessel.py +15 -3
  67. pytcl/mathematical_functions/special_functions/debye.py +136 -26
  68. pytcl/mathematical_functions/special_functions/error_functions.py +3 -1
  69. pytcl/mathematical_functions/special_functions/gamma_functions.py +4 -4
  70. pytcl/mathematical_functions/special_functions/hypergeometric.py +81 -15
  71. pytcl/mathematical_functions/transforms/fourier.py +8 -8
  72. pytcl/mathematical_functions/transforms/stft.py +12 -12
  73. pytcl/mathematical_functions/transforms/wavelets.py +9 -9
  74. pytcl/navigation/geodesy.py +246 -160
  75. pytcl/navigation/great_circle.py +101 -19
  76. pytcl/plotting/coordinates.py +7 -7
  77. pytcl/plotting/tracks.py +2 -2
  78. pytcl/static_estimation/maximum_likelihood.py +16 -14
  79. pytcl/static_estimation/robust.py +5 -5
  80. pytcl/terrain/loaders.py +5 -5
  81. pytcl/trackers/hypothesis.py +1 -1
  82. pytcl/trackers/mht.py +9 -9
  83. pytcl/trackers/multi_target.py +1 -1
  84. {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.8.0.dist-info}/LICENSE +0 -0
  85. {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.8.0.dist-info}/WHEEL +0 -0
  86. {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.8.0.dist-info}/top_level.txt +0 -0
@@ -77,30 +77,46 @@ from pytcl.astronomical.orbital_mechanics import (
77
77
  vis_viva,
78
78
  )
79
79
  from pytcl.astronomical.reference_frames import (
80
- earth_rotation_angle, # Time utilities; Precession; Nutation; Earth rotation; Polar motion; Full transformations; Ecliptic/equatorial
80
+ earth_rotation_angle, # Time utilities; Precession; Nutation
81
81
  )
82
+ from pytcl.astronomical.reference_frames import ecef_to_eci # Time utilities
82
83
  from pytcl.astronomical.reference_frames import (
83
- ecef_to_eci,
84
84
  eci_to_ecef,
85
85
  ecliptic_to_equatorial,
86
86
  equation_of_equinoxes,
87
87
  equatorial_to_ecliptic,
88
88
  gast_iau82,
89
89
  gcrf_to_itrf,
90
+ gcrf_to_mod,
91
+ gcrf_to_teme,
92
+ gcrf_to_tod,
90
93
  gmst_iau82,
91
94
  itrf_to_gcrf,
95
+ itrf_to_teme,
96
+ itrf_to_teme_with_velocity,
97
+ itrf_to_tod,
92
98
  julian_centuries_j2000,
93
99
  mean_obliquity_iau80,
100
+ mod_to_gcrf,
101
+ mod_to_tod,
94
102
  nutation_angles_iau80,
95
103
  nutation_matrix,
104
+ pef_to_teme,
96
105
  polar_motion_matrix,
97
106
  precession_angles_iau76,
98
107
  precession_matrix_iau76,
99
108
  sidereal_rotation_matrix,
109
+ teme_to_gcrf,
110
+ teme_to_itrf,
111
+ teme_to_itrf_with_velocity,
112
+ teme_to_pef,
113
+ tod_to_gcrf,
114
+ tod_to_itrf,
115
+ tod_to_mod,
100
116
  true_obliquity,
101
117
  )
102
118
  from pytcl.astronomical.relativity import (
103
- C_LIGHT, # Physical constants; Schwarzschild metric; Time dilation; Shapiro delay; Precession; PN effects; Range corrections
119
+ C_LIGHT, # Physical constants; Schwarzschild metric; Time dilation
104
120
  )
105
121
  from pytcl.astronomical.relativity import (
106
122
  G_GRAV,
@@ -114,6 +130,30 @@ from pytcl.astronomical.relativity import (
114
130
  schwarzschild_radius,
115
131
  shapiro_delay,
116
132
  )
133
+ from pytcl.astronomical.sgp4 import (
134
+ SGP4Satellite,
135
+ SGP4State,
136
+ sgp4_propagate,
137
+ sgp4_propagate_batch,
138
+ )
139
+ from pytcl.astronomical.special_orbits import (
140
+ OrbitType,
141
+ classify_orbit,
142
+ eccentricity_vector,
143
+ escape_velocity_at_radius,
144
+ hyperbolic_anomaly_to_true_anomaly,
145
+ hyperbolic_asymptote_angle,
146
+ hyperbolic_deflection_angle,
147
+ hyperbolic_excess_velocity,
148
+ mean_to_parabolic_anomaly,
149
+ mean_to_true_anomaly_parabolic,
150
+ parabolic_anomaly_to_true_anomaly,
151
+ radius_parabolic,
152
+ semi_major_axis_from_energy,
153
+ true_anomaly_to_hyperbolic_anomaly,
154
+ true_anomaly_to_parabolic_anomaly,
155
+ velocity_parabolic,
156
+ )
117
157
  from pytcl.astronomical.time_systems import (
118
158
  JD_GPS_EPOCH, # Julian dates; Time scales; Unix time; GPS week; Sidereal time; Leap seconds; Constants
119
159
  )
@@ -145,6 +185,17 @@ from pytcl.astronomical.time_systems import (
145
185
  utc_to_tai,
146
186
  utc_to_tt,
147
187
  )
188
+ from pytcl.astronomical.tle import (
189
+ TLE,
190
+ format_tle,
191
+ is_deep_space,
192
+ orbital_period_from_tle,
193
+ parse_tle,
194
+ parse_tle_3line,
195
+ semi_major_axis_from_mean_motion,
196
+ tle_epoch_to_datetime,
197
+ tle_epoch_to_jd,
198
+ )
148
199
 
149
200
  __all__ = [
150
201
  # Time systems - Julian dates
@@ -251,6 +302,39 @@ __all__ = [
251
302
  # Reference frames - Ecliptic/equatorial
252
303
  "ecliptic_to_equatorial",
253
304
  "equatorial_to_ecliptic",
305
+ # Reference frames - TEME (for SGP4/SDP4)
306
+ "teme_to_pef",
307
+ "pef_to_teme",
308
+ "teme_to_itrf",
309
+ "itrf_to_teme",
310
+ "teme_to_gcrf",
311
+ "gcrf_to_teme",
312
+ "teme_to_itrf_with_velocity",
313
+ "itrf_to_teme_with_velocity",
314
+ # Reference frames - TOD/MOD (legacy conventions)
315
+ "gcrf_to_mod",
316
+ "mod_to_gcrf",
317
+ "gcrf_to_tod",
318
+ "tod_to_gcrf",
319
+ "mod_to_tod",
320
+ "tod_to_mod",
321
+ "tod_to_itrf",
322
+ "itrf_to_tod",
323
+ # TLE parsing
324
+ "TLE",
325
+ "parse_tle",
326
+ "parse_tle_3line",
327
+ "tle_epoch_to_jd",
328
+ "tle_epoch_to_datetime",
329
+ "format_tle",
330
+ "is_deep_space",
331
+ "semi_major_axis_from_mean_motion",
332
+ "orbital_period_from_tle",
333
+ # SGP4/SDP4 propagation
334
+ "SGP4State",
335
+ "SGP4Satellite",
336
+ "sgp4_propagate",
337
+ "sgp4_propagate_batch",
254
338
  # Ephemerides - Classes
255
339
  "DEEphemeris",
256
340
  # Ephemerides - Functions
@@ -271,4 +355,21 @@ __all__ = [
271
355
  "geodetic_precession",
272
356
  "lense_thirring_precession",
273
357
  "relativistic_range_correction",
358
+ # Special orbits - Parabolic and hyperbolic
359
+ "OrbitType",
360
+ "classify_orbit",
361
+ "mean_to_parabolic_anomaly",
362
+ "parabolic_anomaly_to_true_anomaly",
363
+ "true_anomaly_to_parabolic_anomaly",
364
+ "mean_to_true_anomaly_parabolic",
365
+ "radius_parabolic",
366
+ "velocity_parabolic",
367
+ "hyperbolic_anomaly_to_true_anomaly",
368
+ "true_anomaly_to_hyperbolic_anomaly",
369
+ "escape_velocity_at_radius",
370
+ "hyperbolic_excess_velocity",
371
+ "semi_major_axis_from_energy",
372
+ "hyperbolic_asymptote_angle",
373
+ "hyperbolic_deflection_angle",
374
+ "eccentricity_vector",
274
375
  ]
@@ -49,9 +49,10 @@ References
49
49
 
50
50
  """
51
51
 
52
- from typing import Literal, Optional, Tuple
52
+ from typing import Any, Literal, Optional, Tuple
53
53
 
54
54
  import numpy as np
55
+ from numpy.typing import NDArray
55
56
 
56
57
  # Constants for unit conversion
57
58
  AU_PER_KM = 1.0 / 149597870.7 # 1 AU in km
@@ -152,10 +153,10 @@ class DEEphemeris:
152
153
  self.version = version
153
154
  self._jplephem = jplephem
154
155
  self._kernel: Optional[object] = None
155
- self._cache: dict = {}
156
+ self._cache: dict[str, Any] = {}
156
157
 
157
158
  @property
158
- def kernel(self):
159
+ def kernel(self) -> Optional[object]:
159
160
  """Lazy-load ephemeris kernel on first access.
160
161
 
161
162
  Note: This requires jplephem to be installed and the kernel file
@@ -204,7 +205,7 @@ class DEEphemeris:
204
205
 
205
206
  def sun_position(
206
207
  self, jd: float, frame: Literal["icrf", "ecliptic"] = "icrf"
207
- ) -> Tuple[np.ndarray, np.ndarray]:
208
+ ) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
208
209
  """Compute Sun position and velocity.
209
210
 
210
211
  Parameters
@@ -253,7 +254,7 @@ class DEEphemeris:
253
254
 
254
255
  def moon_position(
255
256
  self, jd: float, frame: Literal["icrf", "ecliptic", "earth_centered"] = "icrf"
256
- ) -> Tuple[np.ndarray, np.ndarray]:
257
+ ) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
257
258
  """Compute Moon position and velocity.
258
259
 
259
260
  Parameters
@@ -323,7 +324,7 @@ class DEEphemeris:
323
324
  ],
324
325
  jd: float,
325
326
  frame: Literal["icrf", "ecliptic"] = "icrf",
326
- ) -> Tuple[np.ndarray, np.ndarray]:
327
+ ) -> Tuple[np.ndarray[Any, Any], np.ndarray[Any, Any]]:
327
328
  """Compute planet position and velocity.
328
329
 
329
330
  Parameters
@@ -379,7 +380,7 @@ class DEEphemeris:
379
380
 
380
381
  def barycenter_position(
381
382
  self, body: str, jd: float
382
- ) -> Tuple[np.ndarray, np.ndarray]:
383
+ ) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
383
384
  """Compute position of any body relative to Solar System Barycenter.
384
385
 
385
386
  Parameters
@@ -424,7 +425,7 @@ def _get_default_ephemeris() -> DEEphemeris:
424
425
 
425
426
  def sun_position(
426
427
  jd: float, frame: Literal["icrf", "ecliptic"] = "icrf"
427
- ) -> Tuple[np.ndarray, np.ndarray]:
428
+ ) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
428
429
  """Convenience function: Compute Sun position and velocity.
429
430
 
430
431
  Parameters
@@ -451,7 +452,7 @@ def sun_position(
451
452
 
452
453
  def moon_position(
453
454
  jd: float, frame: Literal["icrf", "ecliptic", "earth_centered"] = "icrf"
454
- ) -> Tuple[np.ndarray, np.ndarray]:
455
+ ) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
455
456
  """Convenience function: Compute Moon position and velocity.
456
457
 
457
458
  Parameters
@@ -482,7 +483,7 @@ def planet_position(
482
483
  ],
483
484
  jd: float,
484
485
  frame: Literal["icrf", "ecliptic"] = "icrf",
485
- ) -> Tuple[np.ndarray, np.ndarray]:
486
+ ) -> Tuple[np.ndarray[Any, Any], np.ndarray[Any, Any]]:
486
487
  """Convenience function: Compute planet position and velocity.
487
488
 
488
489
  Parameters
@@ -509,7 +510,9 @@ def planet_position(
509
510
  return _get_default_ephemeris().planet_position(planet, jd, frame=frame)
510
511
 
511
512
 
512
- def barycenter_position(body: str, jd: float) -> Tuple[np.ndarray, np.ndarray]:
513
+ def barycenter_position(
514
+ body: str, jd: float
515
+ ) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
513
516
  """Convenience function: Position relative to Solar System Barycenter.
514
517
 
515
518
  Parameters