ssatk 1.1.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.
Files changed (442) hide show
  1. ssatk-1.1.0/LICENSE +28 -0
  2. ssatk-1.1.0/NOTICE +15 -0
  3. ssatk-1.1.0/PKG-INFO +591 -0
  4. ssatk-1.1.0/README.md +496 -0
  5. ssatk-1.1.0/demos/README.md +102 -0
  6. ssatk-1.1.0/demos/__init__.py +1 -0
  7. ssatk-1.1.0/demos/analysis_dashboards/__init__.py +1 -0
  8. ssatk-1.1.0/demos/analysis_dashboards/demo_build_dashboard.py +67 -0
  9. ssatk-1.1.0/demos/analysis_dashboards/demo_divergence_plot.py +154 -0
  10. ssatk-1.1.0/demos/analysis_dashboards/demo_orbital_stats_dashboard.py +82 -0
  11. ssatk-1.1.0/demos/benchmarks/README.md +35 -0
  12. ssatk-1.1.0/demos/benchmarks/__init__.py +1 -0
  13. ssatk-1.1.0/demos/benchmarks/benchmark_report.py +240 -0
  14. ssatk-1.1.0/demos/benchmarks/demo_artemis_benchmark.py +336 -0
  15. ssatk-1.1.0/demos/benchmarks/demo_basilisk_6dof.py +124 -0
  16. ssatk-1.1.0/demos/benchmarks/demo_gmat_benchmark.py +303 -0
  17. ssatk-1.1.0/demos/benchmarks/demo_long_term_propagation_benchmark.py +209 -0
  18. ssatk-1.1.0/demos/benchmarks/demo_nbody_propagation_benchmark.py +377 -0
  19. ssatk-1.1.0/demos/benchmarks/demo_orekit_benchmark.py +199 -0
  20. ssatk-1.1.0/demos/benchmarks/demo_station_keeping_burn.py +66 -0
  21. ssatk-1.1.0/demos/benchmarks/orekit/OrekitJ2.java +72 -0
  22. ssatk-1.1.0/demos/benchmarks/orekit/OrekitNBody.java +79 -0
  23. ssatk-1.1.0/demos/benchmarks/orekit/OrekitTwoBody.java +41 -0
  24. ssatk-1.1.0/demos/benchmarks/orekit/pom.xml +15 -0
  25. ssatk-1.1.0/demos/coordinates/__init__.py +2 -0
  26. ssatk-1.1.0/demos/coordinates/demo_coordinate_frames.py +97 -0
  27. ssatk-1.1.0/demos/coordinates/demo_gcrf_to_latlon.py +68 -0
  28. ssatk-1.1.0/demos/coordinates/demo_gcrs_to_itrs_astropy.py +78 -0
  29. ssatk-1.1.0/demos/coordinates/demo_itrf_to_gcrf.py +57 -0
  30. ssatk-1.1.0/demos/coordinates/demo_ntw_and_gcrf.py +107 -0
  31. ssatk-1.1.0/demos/coordinates/demo_rotate_vector.py +144 -0
  32. ssatk-1.1.0/demos/coordinates/demo_surface.py +80 -0
  33. ssatk-1.1.0/demos/coordinates/demo_surface_rv.py +48 -0
  34. ssatk-1.1.0/demos/data_io/__init__.py +2 -0
  35. ssatk-1.1.0/demos/data_io/demo_sampling.py +228 -0
  36. ssatk-1.1.0/demos/data_io/demo_sphere_generation.py +64 -0
  37. ssatk-1.1.0/demos/data_io/demo_tests_dict_to_from_hdf5.py +114 -0
  38. ssatk-1.1.0/demos/eclipse/__init__.py +1 -0
  39. ssatk-1.1.0/demos/eclipse/demo_eclipse_views.py +129 -0
  40. ssatk-1.1.0/demos/getting_started/__init__.py +2 -0
  41. ssatk-1.1.0/demos/getting_started/demo_data_package_access.py +82 -0
  42. ssatk-1.1.0/demos/getting_started/demo_first_user_workflow.py +51 -0
  43. ssatk-1.1.0/demos/getting_started/demo_get_times.py +87 -0
  44. ssatk-1.1.0/demos/getting_started/demo_parsing_3le.py +74 -0
  45. ssatk-1.1.0/demos/getting_started/demo_plotting_quickstart.py +315 -0
  46. ssatk-1.1.0/demos/orbit_visualization/__init__.py +1 -0
  47. ssatk-1.1.0/demos/orbit_visualization/demo_globe_orbit_daynight.py +52 -0
  48. ssatk-1.1.0/demos/orbit_visualization/demo_globe_plot.py +112 -0
  49. ssatk-1.1.0/demos/orbit_visualization/demo_groundtrack_enhanced.py +130 -0
  50. ssatk-1.1.0/demos/orbit_visualization/demo_groundtrack_plot.py +82 -0
  51. ssatk-1.1.0/demos/orbit_visualization/demo_moon_plot.py +82 -0
  52. ssatk-1.1.0/demos/orbit_visualization/demo_moon_webgl.py +87 -0
  53. ssatk-1.1.0/demos/orbit_visualization/demo_orbit_plot.py +162 -0
  54. ssatk-1.1.0/demos/orbital_mechanics/__init__.py +2 -0
  55. ssatk-1.1.0/demos/orbital_mechanics/demo_all_orbit_quantities.py +94 -0
  56. ssatk-1.1.0/demos/orbital_mechanics/demo_compare_models.py +73 -0
  57. ssatk-1.1.0/demos/orbital_mechanics/demo_ellipse_ae_for_arrival_rv.py +68 -0
  58. ssatk-1.1.0/demos/orbital_mechanics/demo_ellipse_fit.py +295 -0
  59. ssatk-1.1.0/demos/orbital_mechanics/demo_ellipse_fit_against_ssapy.py +236 -0
  60. ssatk-1.1.0/demos/orbital_mechanics/demo_ellipse_from_rv.py +704 -0
  61. ssatk-1.1.0/demos/orbital_mechanics/demo_ellipses.py +56 -0
  62. ssatk-1.1.0/demos/orbital_mechanics/demo_ellipses_rebound.py +67 -0
  63. ssatk-1.1.0/demos/orbital_mechanics/demo_equally_spaced_ta.py +109 -0
  64. ssatk-1.1.0/demos/orbital_mechanics/demo_gamma_and_heading.py +260 -0
  65. ssatk-1.1.0/demos/orbital_mechanics/demo_groundtrack_accuracy.py +111 -0
  66. ssatk-1.1.0/demos/orbital_mechanics/demo_kepler_vs_harmonics.py +81 -0
  67. ssatk-1.1.0/demos/orbital_mechanics/demo_leapfrog.py +48 -0
  68. ssatk-1.1.0/demos/orbital_mechanics/demo_orbital_maneuvers.py +1349 -0
  69. ssatk-1.1.0/demos/orbital_mechanics/demo_ssapy_orbits.py +61 -0
  70. ssatk-1.1.0/demos/orbital_mechanics/demo_station_keeping.py +374 -0
  71. ssatk-1.1.0/demos/orbital_mechanics/demo_structured_transfer_api.py +827 -0
  72. ssatk-1.1.0/demos/photometry/__init__.py +2 -0
  73. ssatk-1.1.0/demos/photometry/demo_faceted_light_curves.py +434 -0
  74. ssatk-1.1.0/demos/photometry/demo_lambertian_brightness.py +378 -0
  75. ssatk-1.1.0/demos/photometry/demo_photometry_application.py +87 -0
  76. ssatk-1.1.0/demos/photometry/demo_ssapy_ground_lambertian_reflectance.py +189 -0
  77. ssatk-1.1.0/demos/sensor_coverage/__init__.py +1 -0
  78. ssatk-1.1.0/demos/sensor_coverage/demo_coverage_analysis.py +123 -0
  79. ssatk-1.1.0/demos/sensor_coverage/demo_satellite_viewer.py +68 -0
  80. ssatk-1.1.0/demos/sensor_coverage/demo_sensor_fov_plot.py +526 -0
  81. ssatk-1.1.0/demos/six_dof/__init__.py +2 -0
  82. ssatk-1.1.0/demos/six_dof/_common.py +94 -0
  83. ssatk-1.1.0/demos/six_dof/demo_6dof_attitude_control.py +112 -0
  84. ssatk-1.1.0/demos/six_dof/demo_6dof_finite_burn.py +292 -0
  85. ssatk-1.1.0/demos/six_dof/demo_6dof_gravity_gradient.py +122 -0
  86. ssatk-1.1.0/demos/six_dof/demo_6dof_srp_facets.py +126 -0
  87. ssatk-1.1.0/demos/space_environment/__init__.py +1 -0
  88. ssatk-1.1.0/demos/space_environment/demo_earth_sun_plot.py +64 -0
  89. ssatk-1.1.0/demos/space_environment/demo_magfield_plot.py +49 -0
  90. ssatk-1.1.0/demos/space_environment/demo_solar_view_plot.py +61 -0
  91. ssatk-1.1.0/demos/space_environment/demo_sun_view.py +153 -0
  92. ssatk-1.1.0/demos/space_environment/demo_van_allen.py +64 -0
  93. ssatk-1.1.0/demos/video_animation/__init__.py +1 -0
  94. ssatk-1.1.0/demos/video_animation/demo_fancy_video.py +277 -0
  95. ssatk-1.1.0/demos/video_animation/demo_gifify.py +221 -0
  96. ssatk-1.1.0/pyproject.toml +154 -0
  97. ssatk-1.1.0/setup.cfg +4 -0
  98. ssatk-1.1.0/ssatk/__init__.py +362 -0
  99. ssatk-1.1.0/ssatk/_callables.py +41 -0
  100. ssatk-1.1.0/ssatk/_namespace.py +72 -0
  101. ssatk-1.1.0/ssatk/_paths.py +53 -0
  102. ssatk-1.1.0/ssatk/_sorting.py +13 -0
  103. ssatk-1.1.0/ssatk/accelerations_6dof/__init__.py +5 -0
  104. ssatk-1.1.0/ssatk/accelerations_6dof/spacecraft.py +1700 -0
  105. ssatk-1.1.0/ssatk/accelerations_6dof/ssapy_models.py +183 -0
  106. ssatk-1.1.0/ssatk/accelerations_6dof/thrust.py +534 -0
  107. ssatk-1.1.0/ssatk/accelerations_orbit/__init__.py +5 -0
  108. ssatk-1.1.0/ssatk/accelerations_orbit/_state.py +47 -0
  109. ssatk-1.1.0/ssatk/accelerations_orbit/accel_add.py +25 -0
  110. ssatk-1.1.0/ssatk/accelerations_orbit/accel_circularize.py +88 -0
  111. ssatk-1.1.0/ssatk/accelerations_orbit/accel_earth_harmonics.py +108 -0
  112. ssatk-1.1.0/ssatk/accelerations_orbit/accel_equatorial.py +44 -0
  113. ssatk-1.1.0/ssatk/accelerations_orbit/accel_inclination.py +43 -0
  114. ssatk-1.1.0/ssatk/accelerations_orbit/accel_moon.py +53 -0
  115. ssatk-1.1.0/ssatk/accelerations_orbit/accel_plane.py +47 -0
  116. ssatk-1.1.0/ssatk/accelerations_orbit/accel_point_earth.py +13 -0
  117. ssatk-1.1.0/ssatk/accelerations_orbit/accel_radial.py +28 -0
  118. ssatk-1.1.0/ssatk/accelerations_orbit/accel_sun.py +51 -0
  119. ssatk-1.1.0/ssatk/accelerations_orbit/accel_uniform_earth.py +32 -0
  120. ssatk-1.1.0/ssatk/accelerations_orbit/accel_velocity.py +26 -0
  121. ssatk-1.1.0/ssatk/asteroids.py +168 -0
  122. ssatk-1.1.0/ssatk/benchmark.py +1775 -0
  123. ssatk-1.1.0/ssatk/compute/__init__.py +5 -0
  124. ssatk-1.1.0/ssatk/compute/_visibility.py +24 -0
  125. ssatk-1.1.0/ssatk/compute/calculate_errors.py +25 -0
  126. ssatk-1.1.0/ssatk/compute/faceted_magnitude.py +381 -0
  127. ssatk-1.1.0/ssatk/compute/fft.py +45 -0
  128. ssatk-1.1.0/ssatk/compute/find_bounding_cube.py +24 -0
  129. ssatk-1.1.0/ssatk/compute/generate_sphere_of_vectors.py +103 -0
  130. ssatk-1.1.0/ssatk/compute/lambertian_magnitude.py +675 -0
  131. ssatk-1.1.0/ssatk/compute/lyapunov_exponent.py +192 -0
  132. ssatk-1.1.0/ssatk/compute/mengos.py +69 -0
  133. ssatk-1.1.0/ssatk/compute/proper_motions.py +123 -0
  134. ssatk-1.1.0/ssatk/compute/sampling.py +538 -0
  135. ssatk-1.1.0/ssatk/compute/segment_intersection.py +46 -0
  136. ssatk-1.1.0/ssatk/constants.py +269 -0
  137. ssatk-1.1.0/ssatk/coordinates/__init__.py +5 -0
  138. ssatk-1.1.0/ssatk/coordinates/angle_units.py +137 -0
  139. ssatk-1.1.0/ssatk/coordinates/attitude.py +130 -0
  140. ssatk-1.1.0/ssatk/coordinates/cartesian.py +19 -0
  141. ssatk-1.1.0/ssatk/coordinates/earth_fixed.py +192 -0
  142. ssatk-1.1.0/ssatk/coordinates/equatorial_ecliptic.py +181 -0
  143. ssatk-1.1.0/ssatk/coordinates/frames.py +337 -0
  144. ssatk-1.1.0/ssatk/coordinates/geodetic.py +130 -0
  145. ssatk-1.1.0/ssatk/coordinates/inertial.py +39 -0
  146. ssatk-1.1.0/ssatk/coordinates/local_equatorial.py +125 -0
  147. ssatk-1.1.0/ssatk/coordinates/lunar.py +121 -0
  148. ssatk-1.1.0/ssatk/coordinates/rotating_frames.py +59 -0
  149. ssatk-1.1.0/ssatk/coordinates/satellite_frames.py +283 -0
  150. ssatk-1.1.0/ssatk/coordinates/sky.py +173 -0
  151. ssatk-1.1.0/ssatk/coordinates/velocity.py +51 -0
  152. ssatk-1.1.0/ssatk/data.py +279 -0
  153. ssatk-1.1.0/ssatk/demo_gallery.py +742 -0
  154. ssatk-1.1.0/ssatk/engines/__init__.py +13 -0
  155. ssatk-1.1.0/ssatk/engines/catalog.py +426 -0
  156. ssatk-1.1.0/ssatk/engines/fuel_usage.py +82 -0
  157. ssatk-1.1.0/ssatk/engines/rescale_burn.py +59 -0
  158. ssatk-1.1.0/ssatk/environment.py +884 -0
  159. ssatk-1.1.0/ssatk/environment_eop.py +244 -0
  160. ssatk-1.1.0/ssatk/environment_space_weather.py +233 -0
  161. ssatk-1.1.0/ssatk/geomagnetics.py +942 -0
  162. ssatk-1.1.0/ssatk/hpc.py +55 -0
  163. ssatk-1.1.0/ssatk/io/__init__.py +5 -0
  164. ssatk-1.1.0/ssatk/io/ccsds_cdm.py +1040 -0
  165. ssatk-1.1.0/ssatk/io/ccsds_omm.py +525 -0
  166. ssatk-1.1.0/ssatk/io/converter_json_hdf5.py +224 -0
  167. ssatk-1.1.0/ssatk/io/csv_utils.py +348 -0
  168. ssatk-1.1.0/ssatk/io/datapath.py +61 -0
  169. ssatk-1.1.0/ssatk/io/demo_data.py +216 -0
  170. ssatk-1.1.0/ssatk/io/dict_to_from_hdf5.py +352 -0
  171. ssatk-1.1.0/ssatk/io/get_memory.py +22 -0
  172. ssatk-1.1.0/ssatk/io/guess_delimiter.py +30 -0
  173. ssatk-1.1.0/ssatk/io/h5cache.py +346 -0
  174. ssatk-1.1.0/ssatk/io/hdf5_to_csv.py +172 -0
  175. ssatk-1.1.0/ssatk/io/hdf5_utils.py +295 -0
  176. ssatk-1.1.0/ssatk/io/html_to_gif.py +207 -0
  177. ssatk-1.1.0/ssatk/io/io_utils.py +167 -0
  178. ssatk-1.1.0/ssatk/io/json_utils.py +102 -0
  179. ssatk-1.1.0/ssatk/io/listfiles.py +48 -0
  180. ssatk-1.1.0/ssatk/io/moon_maps.py +266 -0
  181. ssatk-1.1.0/ssatk/io/orbit_json.py +201 -0
  182. ssatk-1.1.0/ssatk/io/pickle_utils.py +17 -0
  183. ssatk-1.1.0/ssatk/io/pprint_utils.py +447 -0
  184. ssatk-1.1.0/ssatk/io/read_3le.py +357 -0
  185. ssatk-1.1.0/ssatk/io/read_3le_by_bit.py +231 -0
  186. ssatk-1.1.0/ssatk/io/reference_case.py +915 -0
  187. ssatk-1.1.0/ssatk/io/ssatk_cache.py +16 -0
  188. ssatk-1.1.0/ssatk/io/ssatk_data.py +11 -0
  189. ssatk-1.1.0/ssatk/io/ssatk_logging.py +69 -0
  190. ssatk-1.1.0/ssatk/io/ssatk_save.py +490 -0
  191. ssatk-1.1.0/ssatk/io/tle_iter_pairs.py +51 -0
  192. ssatk-1.1.0/ssatk/io/tle_prop_to_time.py +64 -0
  193. ssatk-1.1.0/ssatk/io/tle_updater.py +1246 -0
  194. ssatk-1.1.0/ssatk/io/workspace_io.py +322 -0
  195. ssatk-1.1.0/ssatk/io/xml_utils.py +274 -0
  196. ssatk-1.1.0/ssatk/launch/__init__.py +5 -0
  197. ssatk-1.1.0/ssatk/launch/gravity_turn.py +54 -0
  198. ssatk-1.1.0/ssatk/launch/sites.py +215 -0
  199. ssatk-1.1.0/ssatk/launch/vehicles.py +118 -0
  200. ssatk-1.1.0/ssatk/navigation/__init__.py +34 -0
  201. ssatk-1.1.0/ssatk/navigation/batch.py +286 -0
  202. ssatk-1.1.0/ssatk/navigation/ekf.py +205 -0
  203. ssatk-1.1.0/ssatk/navigation/measurements.py +205 -0
  204. ssatk-1.1.0/ssatk/navigation/sensors.py +242 -0
  205. ssatk-1.1.0/ssatk/operations/__init__.py +5 -0
  206. ssatk-1.1.0/ssatk/operations/timeline.py +60 -0
  207. ssatk-1.1.0/ssatk/orbit_initializer.py +86 -0
  208. ssatk-1.1.0/ssatk/orbital_mechanics/__init__.py +5 -0
  209. ssatk-1.1.0/ssatk/orbital_mechanics/_transfer_result.py +356 -0
  210. ssatk-1.1.0/ssatk/orbital_mechanics/_two_body.py +15 -0
  211. ssatk-1.1.0/ssatk/orbital_mechanics/all_orbit_quantities.py +165 -0
  212. ssatk-1.1.0/ssatk/orbital_mechanics/burn_to_deltav.py +96 -0
  213. ssatk-1.1.0/ssatk/orbital_mechanics/calculate_finite_burn_acceleration.py +38 -0
  214. ssatk-1.1.0/ssatk/orbital_mechanics/deltav_to_burn.py +90 -0
  215. ssatk-1.1.0/ssatk/orbital_mechanics/ellipse_fit.py +953 -0
  216. ssatk-1.1.0/ssatk/orbital_mechanics/ellipse_from_rv.py +182 -0
  217. ssatk-1.1.0/ssatk/orbital_mechanics/ellipse_inject.py +577 -0
  218. ssatk-1.1.0/ssatk/orbital_mechanics/equally_spaced_ta.py +135 -0
  219. ssatk-1.1.0/ssatk/orbital_mechanics/gamma_and_heading.py +134 -0
  220. ssatk-1.1.0/ssatk/orbital_mechanics/keplerian.py +1122 -0
  221. ssatk-1.1.0/ssatk/orbital_mechanics/lagrange_points.py +222 -0
  222. ssatk-1.1.0/ssatk/orbital_mechanics/misc.py +177 -0
  223. ssatk-1.1.0/ssatk/orbital_mechanics/orbital_accel_model_comparisons.py +757 -0
  224. ssatk-1.1.0/ssatk/orbital_mechanics/orbital_comparison_stats.py +986 -0
  225. ssatk-1.1.0/ssatk/orbital_mechanics/rv_to_ellipse.py +190 -0
  226. ssatk-1.1.0/ssatk/orbital_mechanics/synthetic_orbit_population.py +209 -0
  227. ssatk-1.1.0/ssatk/orbital_mechanics/transfer_bielliptic.py +387 -0
  228. ssatk-1.1.0/ssatk/orbital_mechanics/transfer_coplanar_continuous.py +164 -0
  229. ssatk-1.1.0/ssatk/orbital_mechanics/transfer_hohmann.py +226 -0
  230. ssatk-1.1.0/ssatk/orbital_mechanics/transfer_inclination_continuous.py +201 -0
  231. ssatk-1.1.0/ssatk/orbital_mechanics/transfer_optimal_function.py +1717 -0
  232. ssatk-1.1.0/ssatk/orbital_mechanics/transfer_ssapy_function.py +973 -0
  233. ssatk-1.1.0/ssatk/orbital_mechanics/transfer_velocity_and_inclination_continuous.py +246 -0
  234. ssatk-1.1.0/ssatk/orbital_mechanics/transfer_velocity_continuous.py +247 -0
  235. ssatk-1.1.0/ssatk/plots/OrbitControls.js +1045 -0
  236. ssatk-1.1.0/ssatk/plots/__init__.py +5 -0
  237. ssatk-1.1.0/ssatk/plots/_cislunar_plot_core.py +299 -0
  238. ssatk-1.1.0/ssatk/plots/_frames.py +27 -0
  239. ssatk-1.1.0/ssatk/plots/_groundtrack_helpers.py +67 -0
  240. ssatk-1.1.0/ssatk/plots/_legend_handlers.py +22 -0
  241. ssatk-1.1.0/ssatk/plots/_orbit_plot_core.py +437 -0
  242. ssatk-1.1.0/ssatk/plots/_textures.py +51 -0
  243. ssatk-1.1.0/ssatk/plots/accel_thrust.py +129 -0
  244. ssatk-1.1.0/ssatk/plots/base_plot.py +781 -0
  245. ssatk-1.1.0/ssatk/plots/break_plot_lines.py +115 -0
  246. ssatk-1.1.0/ssatk/plots/build_dashboard.py +82 -0
  247. ssatk-1.1.0/ssatk/plots/build_satellite_viewer.py +926 -0
  248. ssatk-1.1.0/ssatk/plots/coverage_analysis.py +1932 -0
  249. ssatk-1.1.0/ssatk/plots/divergence_gif.py +216 -0
  250. ssatk-1.1.0/ssatk/plots/divergence_plot.py +124 -0
  251. ssatk-1.1.0/ssatk/plots/earth_sun_plot.py +489 -0
  252. ssatk-1.1.0/ssatk/plots/eclipse_appearance_strip.py +299 -0
  253. ssatk-1.1.0/ssatk/plots/eclipse_brightness_plot.py +178 -0
  254. ssatk-1.1.0/ssatk/plots/eclipse_space_view_plotly.py +2488 -0
  255. ssatk-1.1.0/ssatk/plots/figpath.py +92 -0
  256. ssatk-1.1.0/ssatk/plots/gifify.py +318 -0
  257. ssatk-1.1.0/ssatk/plots/globe_orbit_daynight_plotly.py +736 -0
  258. ssatk-1.1.0/ssatk/plots/globe_plot.py +367 -0
  259. ssatk-1.1.0/ssatk/plots/groundtrack_dashboard.py +252 -0
  260. ssatk-1.1.0/ssatk/plots/groundtrack_dashboard_gamma_heading.py +245 -0
  261. ssatk-1.1.0/ssatk/plots/groundtrack_enhanced.py +428 -0
  262. ssatk-1.1.0/ssatk/plots/groundtrack_plot.py +326 -0
  263. ssatk-1.1.0/ssatk/plots/groundtrack_video.py +252 -0
  264. ssatk-1.1.0/ssatk/plots/layers.py +1398 -0
  265. ssatk-1.1.0/ssatk/plots/magfield_plot_3d.py +1330 -0
  266. ssatk-1.1.0/ssatk/plots/magnetosphere_core.py +529 -0
  267. ssatk-1.1.0/ssatk/plots/misc_plotting.py +393 -0
  268. ssatk-1.1.0/ssatk/plots/moon_plot_3d.py +702 -0
  269. ssatk-1.1.0/ssatk/plots/moon_render.py +342 -0
  270. ssatk-1.1.0/ssatk/plots/moon_webgl.py +1606 -0
  271. ssatk-1.1.0/ssatk/plots/orbit_animation.py +409 -0
  272. ssatk-1.1.0/ssatk/plots/orbit_plot.py +495 -0
  273. ssatk-1.1.0/ssatk/plots/orbit_plot_rv.py +135 -0
  274. ssatk-1.1.0/ssatk/plots/orbit_state.py +700 -0
  275. ssatk-1.1.0/ssatk/plots/plotutils.py +1124 -0
  276. ssatk-1.1.0/ssatk/plots/rendezvous_plot.py +98 -0
  277. ssatk-1.1.0/ssatk/plots/satellite.min.js +8 -0
  278. ssatk-1.1.0/ssatk/plots/satellite.py +377 -0
  279. ssatk-1.1.0/ssatk/plots/satellite_viewer_scene.js +3361 -0
  280. ssatk-1.1.0/ssatk/plots/satellite_viewer_smoketest.js +216 -0
  281. ssatk-1.1.0/ssatk/plots/scene_primitives.py +446 -0
  282. ssatk-1.1.0/ssatk/plots/sensor_fov_plot.py +833 -0
  283. ssatk-1.1.0/ssatk/plots/set_axes_equal.py +35 -0
  284. ssatk-1.1.0/ssatk/plots/solar_bodies.py +766 -0
  285. ssatk-1.1.0/ssatk/plots/solar_view_plot.py +425 -0
  286. ssatk-1.1.0/ssatk/plots/starfield.py +664 -0
  287. ssatk-1.1.0/ssatk/plots/sun_mpl.py +315 -0
  288. ssatk-1.1.0/ssatk/plots/sun_render.py +278 -0
  289. ssatk-1.1.0/ssatk/plots/sun_view.py +800 -0
  290. ssatk-1.1.0/ssatk/plots/three.min.js +6 -0
  291. ssatk-1.1.0/ssatk/plots/tracking_plot.py +184 -0
  292. ssatk-1.1.0/ssatk/plots/transfer_burn_profile_plot.py +116 -0
  293. ssatk-1.1.0/ssatk/plots/transfer_designer_curves_plot.py +118 -0
  294. ssatk-1.1.0/ssatk/plots/transfer_plot.py +150 -0
  295. ssatk-1.1.0/ssatk/plots/transfer_trajectory_plot.py +172 -0
  296. ssatk-1.1.0/ssatk/plots/van_allen_plot_3d.py +523 -0
  297. ssatk-1.1.0/ssatk/plots/write_gifs.py +220 -0
  298. ssatk-1.1.0/ssatk/plots/write_videos.py +135 -0
  299. ssatk-1.1.0/ssatk/propagators_6dof/__init__.py +5 -0
  300. ssatk-1.1.0/ssatk/propagators_6dof/_constraints.py +65 -0
  301. ssatk-1.1.0/ssatk/propagators_6dof/extended.py +282 -0
  302. ssatk-1.1.0/ssatk/propagators_6dof/high_accuracy.py +347 -0
  303. ssatk-1.1.0/ssatk/propagators_6dof/sixdof.py +1873 -0
  304. ssatk-1.1.0/ssatk/propagators_6dof/targeting.py +690 -0
  305. ssatk-1.1.0/ssatk/propagators_6dof/variational.py +526 -0
  306. ssatk-1.1.0/ssatk/propagators_orbit/__init__.py +5 -0
  307. ssatk-1.1.0/ssatk/propagators_orbit/high_accuracy.py +279 -0
  308. ssatk-1.1.0/ssatk/propagators_orbit/int_utils.py +200 -0
  309. ssatk-1.1.0/ssatk/propagators_orbit/leap_frog.py +216 -0
  310. ssatk-1.1.0/ssatk/propagators_orbit/rk4.py +100 -0
  311. ssatk-1.1.0/ssatk/run_all_demos.py +129 -0
  312. ssatk-1.1.0/ssatk/satellites.py +979 -0
  313. ssatk-1.1.0/ssatk/ssa/__init__.py +25 -0
  314. ssatk-1.1.0/ssatk/ssa/conjunction.py +510 -0
  315. ssatk-1.1.0/ssatk/ssapy_wrappers/__init__.py +5 -0
  316. ssatk-1.1.0/ssatk/ssapy_wrappers/accel_ladder.py +80 -0
  317. ssatk-1.1.0/ssatk/ssapy_wrappers/quick_int.py +190 -0
  318. ssatk-1.1.0/ssatk/ssapy_wrappers/sat_kwargs.py +9 -0
  319. ssatk-1.1.0/ssatk/ssapy_wrappers/ssapy_orbits.py +248 -0
  320. ssatk-1.1.0/ssatk/ssapy_wrappers/ssapy_props.py +141 -0
  321. ssatk-1.1.0/ssatk/time_functions/__init__.py +5 -0
  322. ssatk-1.1.0/ssatk/time_functions/_gps.py +13 -0
  323. ssatk-1.1.0/ssatk/time_functions/absolute_times_to_relative.py +68 -0
  324. ssatk-1.1.0/ssatk/time_functions/convert_dd_and_dms.py +58 -0
  325. ssatk-1.1.0/ssatk/time_functions/convert_dd_and_hms.py +66 -0
  326. ssatk-1.1.0/ssatk/time_functions/convert_gps_to_TT.py +17 -0
  327. ssatk-1.1.0/ssatk/time_functions/convert_to_gps.py +30 -0
  328. ssatk-1.1.0/ssatk/time_functions/get_times.py +185 -0
  329. ssatk-1.1.0/ssatk/time_functions/gmst.py +44 -0
  330. ssatk-1.1.0/ssatk/time_functions/julian_date.py +38 -0
  331. ssatk-1.1.0/ssatk/time_functions/now_time.py +15 -0
  332. ssatk-1.1.0/ssatk/time_functions/relative_times_to_absolute.py +71 -0
  333. ssatk-1.1.0/ssatk/utils.py +741 -0
  334. ssatk-1.1.0/ssatk/vectors.py +271 -0
  335. ssatk-1.1.0/ssatk/yastropy/__init__.py +5 -0
  336. ssatk-1.1.0/ssatk/yastropy/astropy_gcrf_to_llh.py +48 -0
  337. ssatk-1.1.0/ssatk/yastropy/astropy_llh_to_gcrf.py +40 -0
  338. ssatk-1.1.0/ssatk/yastropy/astropy_surface_rv.py +38 -0
  339. ssatk-1.1.0/ssatk.egg-info/PKG-INFO +591 -0
  340. ssatk-1.1.0/ssatk.egg-info/SOURCES.txt +440 -0
  341. ssatk-1.1.0/ssatk.egg-info/dependency_links.txt +1 -0
  342. ssatk-1.1.0/ssatk.egg-info/entry_points.txt +8 -0
  343. ssatk-1.1.0/ssatk.egg-info/requires.txt +80 -0
  344. ssatk-1.1.0/ssatk.egg-info/top_level.txt +2 -0
  345. ssatk-1.1.0/tests/test_6dof_elapsed_time_integration.py +111 -0
  346. ssatk-1.1.0/tests/test_6dof_extended.py +92 -0
  347. ssatk-1.1.0/tests/test_6dof_variational.py +341 -0
  348. ssatk-1.1.0/tests/test_acceleration_helpers.py +12 -0
  349. ssatk-1.1.0/tests/test_adaptive_propagators_elapsed_time.py +71 -0
  350. ssatk-1.1.0/tests/test_asteroid_magnitudes.py +24 -0
  351. ssatk-1.1.0/tests/test_basilisk_6dof_benchmark.py +13 -0
  352. ssatk-1.1.0/tests/test_body_ephemerides.py +34 -0
  353. ssatk-1.1.0/tests/test_burn_conversions.py +49 -0
  354. ssatk-1.1.0/tests/test_catalog_conjunction_screen.py +45 -0
  355. ssatk-1.1.0/tests/test_ccsds_cdm.py +124 -0
  356. ssatk-1.1.0/tests/test_ccsds_omm.py +77 -0
  357. ssatk-1.1.0/tests/test_compute_helpers.py +145 -0
  358. ssatk-1.1.0/tests/test_conic_sampling.py +95 -0
  359. ssatk-1.1.0/tests/test_constants.py +62 -0
  360. ssatk-1.1.0/tests/test_coverage_site_geometry.py +35 -0
  361. ssatk-1.1.0/tests/test_earth_zonal_harmonics.py +65 -0
  362. ssatk-1.1.0/tests/test_eclipse_geometry.py +54 -0
  363. ssatk-1.1.0/tests/test_eclipse_partial_shadow.py +17 -0
  364. ssatk-1.1.0/tests/test_ekf.py +70 -0
  365. ssatk-1.1.0/tests/test_ellipse_fit_helpers.py +86 -0
  366. ssatk-1.1.0/tests/test_ellipse_inject.py +65 -0
  367. ssatk-1.1.0/tests/test_encounter_frame_roundoff.py +46 -0
  368. ssatk-1.1.0/tests/test_engine_budgets.py +30 -0
  369. ssatk-1.1.0/tests/test_environment.py +115 -0
  370. ssatk-1.1.0/tests/test_environment_eop.py +51 -0
  371. ssatk-1.1.0/tests/test_environment_space_weather.py +21 -0
  372. ssatk-1.1.0/tests/test_epoch_comparison_tolerance.py +32 -0
  373. ssatk-1.1.0/tests/test_faceted_magnitude.py +67 -0
  374. ssatk-1.1.0/tests/test_frame_and_state_references.py +410 -0
  375. ssatk-1.1.0/tests/test_gamma_and_heading.py +78 -0
  376. ssatk-1.1.0/tests/test_horizon_frames.py +55 -0
  377. ssatk-1.1.0/tests/test_iers_global_state.py +35 -0
  378. ssatk-1.1.0/tests/test_igrf_wrapper.py +43 -0
  379. ssatk-1.1.0/tests/test_inertial_and_lunar_frames.py +43 -0
  380. ssatk-1.1.0/tests/test_integration_callback_regressions.py +15 -0
  381. ssatk-1.1.0/tests/test_integration_inertia_regressions.py +106 -0
  382. ssatk-1.1.0/tests/test_integration_leapfrog_impact_regressions.py +47 -0
  383. ssatk-1.1.0/tests/test_integration_photometry_regressions.py +35 -0
  384. ssatk-1.1.0/tests/test_integration_profile_regressions.py +15 -0
  385. ssatk-1.1.0/tests/test_integration_rk4_regressions.py +31 -0
  386. ssatk-1.1.0/tests/test_integration_segment_regressions.py +38 -0
  387. ssatk-1.1.0/tests/test_integration_state_continuity_regressions.py +48 -0
  388. ssatk-1.1.0/tests/test_integration_terminal_epoch_regressions.py +47 -0
  389. ssatk-1.1.0/tests/test_integration_terminal_regressions.py +42 -0
  390. ssatk-1.1.0/tests/test_integration_wheel_regressions.py +82 -0
  391. ssatk-1.1.0/tests/test_j2_reference.py +43 -0
  392. ssatk-1.1.0/tests/test_keplerian_helpers.py +99 -0
  393. ssatk-1.1.0/tests/test_lagrange_points.py +42 -0
  394. ssatk-1.1.0/tests/test_lagrange_rotating_frames.py +29 -0
  395. ssatk-1.1.0/tests/test_lambert_reference.py +47 -0
  396. ssatk-1.1.0/tests/test_lambertian_photometry.py +60 -0
  397. ssatk-1.1.0/tests/test_launch_gravity_turn.py +32 -0
  398. ssatk-1.1.0/tests/test_legacy_import_name.py +64 -0
  399. ssatk-1.1.0/tests/test_low_precision_moon.py +30 -0
  400. ssatk-1.1.0/tests/test_lunar_rotating_frame.py +26 -0
  401. ssatk-1.1.0/tests/test_magfield_physics.py +448 -0
  402. ssatk-1.1.0/tests/test_moon_texture_rotation.py +21 -0
  403. ssatk-1.1.0/tests/test_moon_webgl_json.py +117 -0
  404. ssatk-1.1.0/tests/test_navigation_batch.py +106 -0
  405. ssatk-1.1.0/tests/test_navigation_measurements.py +80 -0
  406. ssatk-1.1.0/tests/test_navigation_sensors.py +52 -0
  407. ssatk-1.1.0/tests/test_numeric_mechanics_helpers.py +92 -0
  408. ssatk-1.1.0/tests/test_orbit_absolute_epoch.py +69 -0
  409. ssatk-1.1.0/tests/test_orbit_acceleration_helpers.py +83 -0
  410. ssatk-1.1.0/tests/test_orbit_initializer.py +26 -0
  411. ssatk-1.1.0/tests/test_orbital_maneuver_modes.py +103 -0
  412. ssatk-1.1.0/tests/test_orbital_maneuver_reference_cases.py +173 -0
  413. ssatk-1.1.0/tests/test_orekit_j2_external.py +38 -0
  414. ssatk-1.1.0/tests/test_packaged_eop_reference.py +69 -0
  415. ssatk-1.1.0/tests/test_plot_earth_rotation.py +94 -0
  416. ssatk-1.1.0/tests/test_plot_sun_and_stars.py +80 -0
  417. ssatk-1.1.0/tests/test_propagators.py +136 -0
  418. ssatk-1.1.0/tests/test_propagators_6dof.py +1076 -0
  419. ssatk-1.1.0/tests/test_propagators_6dof_truth.py +65 -0
  420. ssatk-1.1.0/tests/test_proper_motion_radial.py +83 -0
  421. ssatk-1.1.0/tests/test_propulsion_catalog.py +23 -0
  422. ssatk-1.1.0/tests/test_read_3le.py +29 -0
  423. ssatk-1.1.0/tests/test_real_ssapy_force_parity.py +64 -0
  424. ssatk-1.1.0/tests/test_real_ssapy_parity.py +55 -0
  425. ssatk-1.1.0/tests/test_reference_case.py +190 -0
  426. ssatk-1.1.0/tests/test_satellite_frames.py +99 -0
  427. ssatk-1.1.0/tests/test_segment_dense_output.py +87 -0
  428. ssatk-1.1.0/tests/test_spacecraft_force_models.py +132 -0
  429. ssatk-1.1.0/tests/test_ssa_conjunction.py +114 -0
  430. ssatk-1.1.0/tests/test_starfield_epochs.py +18 -0
  431. ssatk-1.1.0/tests/test_state_to_kepler.py +61 -0
  432. ssatk-1.1.0/tests/test_station_keeping_burn_benchmark.py +9 -0
  433. ssatk-1.1.0/tests/test_synthetic_orbit_population.py +22 -0
  434. ssatk-1.1.0/tests/test_targeting.py +154 -0
  435. ssatk-1.1.0/tests/test_thrust_profiles.py +70 -0
  436. ssatk-1.1.0/tests/test_time_and_yastropy_helpers.py +23 -0
  437. ssatk-1.1.0/tests/test_time_functions.py +98 -0
  438. ssatk-1.1.0/tests/test_time_grids_and_orbit_quantities.py +44 -0
  439. ssatk-1.1.0/tests/test_tle_fixed_width_helpers.py +20 -0
  440. ssatk-1.1.0/tests/test_tle_iter_pairs.py +22 -0
  441. ssatk-1.1.0/tests/test_transfer_optimal.py +30 -0
  442. ssatk-1.1.0/tests/test_two_body_closed_forms.py +35 -0
ssatk-1.1.0/LICENSE ADDED
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Lawrence Livermore National Laboratory
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ssatk-1.1.0/NOTICE ADDED
@@ -0,0 +1,15 @@
1
+ This work was produced under the auspices of the U.S. Department of Energy by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344.
2
+
3
+ This work was prepared as an account of work sponsored by an agency of the United States Government. Neither the United States Government nor Lawrence Livermore National Security, LLC, nor any of their employees makes any warranty, expressed or implied, or assumes any legal liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately owned rights.
4
+
5
+ Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise does not necessarily constitute or imply its endorsement, recommendation, or favoring by the United States Government or Lawrence Livermore National Security, LLC.
6
+
7
+ The views and opinions of authors expressed herein do not necessarily state or reflect those of the United States Government or Lawrence Livermore National Security, LLC, and shall not be used for advertising or product endorsement purposes.
8
+
9
+ LLNL-CODE-2015996
10
+
11
+ Third-party JavaScript assets included for the optional satellite viewer:
12
+
13
+ - three.min.js: Three.js r128, Copyright 2010-2021 Three.js Authors, MIT License.
14
+ - OrbitControls.js: Three.js r128, Copyright 2010-2021 Three.js Authors, MIT License.
15
+ - satellite.min.js: satellite-js v4.1.4, Copyright 2013 Shashwat Kandadai and UCSC, MIT License.
ssatk-1.1.0/PKG-INFO ADDED
@@ -0,0 +1,591 @@
1
+ Metadata-Version: 2.4
2
+ Name: ssatk
3
+ Version: 1.1.0
4
+ Summary: Space Situational Awareness Toolkit (SSATK): orbital mechanics, plotting, and data IO built on SSAPy
5
+ Author-email: "Travis R. Yeager" <yeagerastro@gmail.com>
6
+ License-Expression: BSD-3-Clause
7
+ Project-URL: Homepage, https://github.com/LLNL/ssatk
8
+ Project-URL: Repository, https://github.com/LLNL/ssatk
9
+ Project-URL: Issues, https://github.com/LLNL/ssatk/issues
10
+ Project-URL: Documentation, https://ssapy-toolkit.readthedocs.io/
11
+ Keywords: orbital-mechanics,astrodynamics,visualization,utilities
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3 :: Only
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Operating System :: OS Independent
21
+ Classifier: Topic :: Scientific/Engineering :: Astronomy
22
+ Classifier: Topic :: Scientific/Engineering :: Visualization
23
+ Requires-Python: >=3.10
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ License-File: NOTICE
27
+ Requires-Dist: astropy
28
+ Requires-Dist: h5py
29
+ Requires-Dist: imageio
30
+ Requires-Dist: llnl-ssapy>=1.1.11
31
+ Requires-Dist: ssatk-data-core==0.0.1
32
+ Requires-Dist: ssatk-data-gravity==0.0.1
33
+ Requires-Dist: ssatk-data-lunar==0.0.1
34
+ Requires-Dist: ssatk-data-lunar-gravity==0.0.1
35
+ Requires-Dist: matplotlib
36
+ Requires-Dist: numpy
37
+ Requires-Dist: pandas
38
+ Requires-Dist: pillow
39
+ Requires-Dist: plotly
40
+ Requires-Dist: pyerfa
41
+ Requires-Dist: rebound
42
+ Requires-Dist: scipy
43
+ Provides-Extra: monitoring
44
+ Requires-Dist: psutil; extra == "monitoring"
45
+ Provides-Extra: propulsion
46
+ Requires-Dist: ssatk-data-propulsion==0.0.1; extra == "propulsion"
47
+ Provides-Extra: benchmarks
48
+ Requires-Dist: ssatk-data-benchmarks==0.0.1; extra == "benchmarks"
49
+ Provides-Extra: all-data
50
+ Requires-Dist: ssatk-data-core==0.0.1; extra == "all-data"
51
+ Requires-Dist: ssatk-data-gravity==0.0.1; extra == "all-data"
52
+ Requires-Dist: ssatk-data-lunar==0.0.1; extra == "all-data"
53
+ Requires-Dist: ssatk-data-lunar-gravity==0.0.1; extra == "all-data"
54
+ Requires-Dist: ssatk-data-propulsion==0.0.1; extra == "all-data"
55
+ Requires-Dist: ssatk-data-benchmarks==0.0.1; extra == "all-data"
56
+ Provides-Extra: notebook
57
+ Requires-Dist: ipython; extra == "notebook"
58
+ Requires-Dist: ipyvolume; extra == "notebook"
59
+ Provides-Extra: static
60
+ Requires-Dist: kaleido; extra == "static"
61
+ Provides-Extra: browser
62
+ Requires-Dist: selenium; extra == "browser"
63
+ Provides-Extra: pdf
64
+ Requires-Dist: pypdf; extra == "pdf"
65
+ Provides-Extra: video
66
+ Requires-Dist: imageio-ffmpeg; extra == "video"
67
+ Requires-Dist: opencv-python; extra == "video"
68
+ Provides-Extra: geomagnetics
69
+ Requires-Dist: ppigrf; extra == "geomagnetics"
70
+ Requires-Dist: geopack; extra == "geomagnetics"
71
+ Provides-Extra: atmosphere
72
+ Requires-Dist: pymsis>=0.12; extra == "atmosphere"
73
+ Provides-Extra: validation
74
+ Requires-Dist: spacepy; extra == "validation"
75
+ Provides-Extra: dev
76
+ Requires-Dist: coverage; extra == "dev"
77
+ Requires-Dist: ipython; extra == "dev"
78
+ Requires-Dist: ipyvolume; extra == "dev"
79
+ Requires-Dist: kaleido; extra == "dev"
80
+ Requires-Dist: pytest; extra == "dev"
81
+ Requires-Dist: pytest-mpi; extra == "dev"
82
+ Requires-Dist: sphinx; extra == "dev"
83
+ Requires-Dist: sphinx-rtd-theme; extra == "dev"
84
+ Requires-Dist: myst-parser<4.0.0; extra == "dev"
85
+ Requires-Dist: nodeenv; extra == "dev"
86
+ Requires-Dist: imageio-ffmpeg; extra == "dev"
87
+ Requires-Dist: opencv-python; extra == "dev"
88
+ Requires-Dist: pypdf; extra == "dev"
89
+ Requires-Dist: psutil; extra == "dev"
90
+ Requires-Dist: ruff; extra == "dev"
91
+ Requires-Dist: selenium; extra == "dev"
92
+ Requires-Dist: build; extra == "dev"
93
+ Requires-Dist: twine; extra == "dev"
94
+ Dynamic: license-file
95
+
96
+ # Space Situational Awareness Toolkit (SSATK)
97
+
98
+ The **Space Situational Awareness Toolkit (SSATK)** — `pip install ssatk`,
99
+ `import ssatk` — is a collection of higher-level, analysis-ready extensions for the
100
+ [SSAPy](https://github.com/llnl/SSAPy) orbital-modeling ecosystem. Where SSAPy
101
+ provides the core high-fidelity propagation and modeling engine, the Toolkit
102
+ adds astrodynamics utilities, orbital-transfer design, coordinate/time
103
+ conversions, brightness and observables modeling, launch and propulsion
104
+ helpers, orbit and 6-DoF propagators, rich plotting, and data I/O to support day-to-day research and
105
+ engineering workflows.
106
+
107
+ SSAPy itself is a fast, flexible, high-fidelity orbital modeling and analysis
108
+ tool for orbits spanning from low-Earth orbit into the cislunar regime, with
109
+ configurable force models (Earth and lunar gravity, radiation pressure, drag,
110
+ planetary perturbations, maneuvers), multiple propagators, orbit determination,
111
+ Monte Carlo / uncertainty-quantification workflows, and ground/space observer
112
+ models. See the SSAPy repository for full details:
113
+ <https://github.com/llnl/SSAPy>.
114
+
115
+ ## Why SSATK?
116
+
117
+ SSATK is the analyst-facing layer around SSAPy: it keeps common orbital
118
+ mechanics, plotting, transfer-design, data I/O, and early 6-DoF spacecraft
119
+ workflows in one import path while preserving SSAPy as the core propagation
120
+ engine. The benchmarking review compares SSATK against adjacent astrodynamics,
121
+ mission-design, and 6-DoF tools:
122
+ [`docs/benchmarking_ssatk.rst`](docs/benchmarking_ssatk.rst). The 6-DoF design
123
+ study explains why SSATK is adding a lightweight spacecraft body/component
124
+ layer instead of trying to replace established tools such as Basilisk, Tudat,
125
+ GMAT, Orekit, STK, or FreeFlyer:
126
+ [`docs/design/6dof_architecture.rst`](docs/design/6dof_architecture.rst).
127
+
128
+ ---
129
+
130
+ ## Features
131
+
132
+ - **Orbital mechanics & astrodynamics** — Keplerian utilities, ellipse fitting,
133
+ r/v conversions, Lagrange points, and synthetic orbit populations.
134
+ - **Orbital transfers** — a full transfer-design suite: Hohmann, coplanar,
135
+ Lambert, inclination-change, and rendezvous transfers; continuous-thrust
136
+ transfers; shooter and optimal-transfer methods; and burn-to-delta-v
137
+ conversions with finite-burn modeling.
138
+ - **Coordinate transforms & time conversions** — GCRF-to-ITRF, GCRF-to-NTW,
139
+ GCRF-to-LLH/lon-lat, GCRF-to-lunar, J2000-to-GCRF, Cartesian/spherical/
140
+ cylindrical, equatorial/ecliptic, sky-angle helpers, and satellite operation
141
+ frames (NTW, RTN, LVLH, VNB, body, topocentric, and line-of-sight), using a
142
+ right-handed NTW (N = T x W) convention consistent with SSAPy.
143
+ - **Observables & brightness modeling** — Lambertian magnitude / brightness,
144
+ including object thermal emission, Earth-shadow effects, and ground
145
+ reflectance.
146
+ - **Plotting & visualization** — orbit, ground-track, cislunar (2-D and 3-D),
147
+ and transfer plots; interactive dashboards; and animated GIF/video output.
148
+ - **Propagators** — adaptive DOP853 translational propagation, fixed-step RK4/leapfrog helpers, and 6-DoF propagation.
149
+ - **6-DoF dynamics** — coupled translational and rigid-body attitude
150
+ propagation with quaternion attitude states, optional user acceleration and
151
+ torque models, gravity-gradient torque, fixed-facet drag/SRP, thrusters,
152
+ articulated facet transforms, magnetic torquers, reaction wheels, dynamic
153
+ tank mass properties, dry-mass stopping events, and a basic quaternion PD
154
+ controller.
155
+ - **Launch & propulsion** — launch-pad definitions, gravity-turn ascent,
156
+ engine catalogs, thrust profiles, and fuel/burn utilities.
157
+ - **Data I/O** — CCSDS CDM KVN 1.0 and OMM XML 2.0 interoperability, HDF5
158
+ helpers (including dictionary/HDF5 conversion with array handling and
159
+ selective key loading), plus CSV, JSON, XML, pickle, and TLE/3LE parsing.
160
+ OMM XML support covers the `meanElements` and `tleParameters` data-block
161
+ subset; structured covariance and other structured data blocks are rejected
162
+ explicitly.
163
+ - **SSAPy wrappers & HPC helpers** — convenience wrappers around SSAPy orbits,
164
+ propagators, and satellite keyword arguments, plus utilities for HPC
165
+ workflows.
166
+ - **Demo gallery** — a runnable gallery of worked examples with inline output.
167
+
168
+ ---
169
+
170
+ ## Installation
171
+
172
+ SSATK is a standard Python package, published on PyPI as `ssatk`.
173
+
174
+ > **Renamed in 1.1.0.** SSATK was published as `ssapy-toolkit` and imported as
175
+ > `ssapy_toolkit` through 1.0.7. Existing installs can run
176
+ > `python -m pip install -U ssapy-toolkit`: that release is a thin package that
177
+ > pulls in `ssatk` and keeps `import ssapy_toolkit` working (it forwards to
178
+ > `ssatk` and emits a `FutureWarning`). New installs should use
179
+ > `python -m pip install ssatk`. The `ssapy-*` command names remain as aliases
180
+ > of the `ssatk-*` commands.
181
+
182
+ ```
183
+ python -m venv .venv
184
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
185
+ python -m pip install --upgrade pip
186
+ python -m pip install -e .[dev]
187
+ ```
188
+
189
+ This installs the package in editable mode along with development dependencies
190
+ (testing, linting, docs tools, JavaScript validation helpers, etc.). Runtime
191
+ plotting dependencies support HTML, image, and GIF output through Plotly,
192
+ Matplotlib, Pillow, imageio, and split SSATK data assets. Install
193
+ `ssatk[static]` for Plotly static-image export through Kaleido,
194
+ `ssatk[pdf]` for appending pages to existing PDF plots,
195
+ `ssatk[notebook]` for IPython display and ipyvolume Earth/Moon meshes,
196
+ `ssatk[video]` for OpenCV MP4 output and a bundled FFmpeg fallback, and
197
+ `ssatk[browser]` for Selenium browser capture. Node.js 20+ is used only to validate the
198
+ self-contained JavaScript viewer sources; GitHub Actions installs it with
199
+ `actions/setup-node`, and local developers can use system Node.js or `nodeenv`.
200
+ Install `ssatk[monitoring]` to enable the optional current-process RSS
201
+ memory helper.
202
+
203
+ SSATK builds on SSAPy; see the
204
+ [SSAPy](https://github.com/llnl/SSAPy) repository for its installation details.
205
+
206
+ ---
207
+
208
+ ## Usage
209
+
210
+ The Toolkit is intended to be the main user-facing entry point. Shared SSAPy
211
+ constants are available through the Toolkit, so users do not need to know
212
+ whether a constant originates in base SSAPy or Toolkit-specific helpers:
213
+
214
+ ```
215
+ import ssatk
216
+
217
+ print(ssatk.EARTH_MU)
218
+ print(ssatk.constants.RGEO)
219
+
220
+ orbit = ssatk.Orbit.fromKeplerianElements(
221
+ a=ssatk.constants.RGEO,
222
+ e=0.0,
223
+ i=0.0,
224
+ pa=0.0,
225
+ raan=0.0,
226
+ trueAnomaly=0.0,
227
+ t=0.0,
228
+ )
229
+ r, v = ssatk.rv(orbit, time=[0.0, 60.0])
230
+ ```
231
+
232
+ Base SSAPy core objects such as `Orbit`, `rv`, `groundTrack`, and `AccelKepler`
233
+ are lazily available through `ssatk`. Toolkit duplicate helpers take
234
+ precedence at the top level, so names such as `ssatk.norm`,
235
+ `ssatk.deg0to360`, and `ssatk.period` resolve to Toolkit
236
+ implementations. Toolkit submodules also win on collisions such as
237
+ `ssatk.io` and `ssatk.utils`; the base package remains available
238
+ as `ssatk.ssapy` when direct SSAPy module access is needed.
239
+ Earth/Moon helpers formerly provided by `ssapy.plotUtils` are available as
240
+ `ssatk.draw_earth`, `draw_moon`, `load_earth_file`, and
241
+ `load_moon_file`.
242
+
243
+ CCSDS Conjunction Data Message (CDM) KVN 1.0 files use SI values in memory:
244
+
245
+ ```python
246
+ from ssatk.io.ccsds_cdm import read_cdm, write_cdm
247
+
248
+ cdm = read_cdm("conjunction.cdm")
249
+ object1_gcrf = cdm.object1.state_gcrf()
250
+ write_cdm(cdm, "canonical.cdm")
251
+ ```
252
+
253
+ The reader accepts calendar or ordinal Coordinated Universal Time (UTC), all
254
+ three CDM 1.0 state frames (`GCRF`, `EME2000`, and `ITRF`), and the mandatory
255
+ RTN covariance plus complete optional drag, solar-radiation-pressure, and
256
+ thrust rows. Later alternate-covariance extensions are rejected explicitly.
257
+
258
+ For workflow functions, import the specific Toolkit module you need:
259
+
260
+ ```
261
+ from ssatk.orbital_mechanics import keplerian
262
+ from ssatk.orbital_mechanics import transfer_hohmann
263
+ from ssatk.orbital_mechanics import transfer_bielliptic
264
+ from ssatk.coordinates import gcrf_to_itrf
265
+ from ssatk.plots import orbit_plot
266
+ ```
267
+
268
+ For high-accuracy translational propagation, use the adaptive DOP853 wrapper in
269
+ `propagators_orbit` instead of the older fixed-step helpers:
270
+
271
+ ```
272
+ import numpy as np
273
+ from ssatk.constants import EARTH_MU
274
+ from ssatk.propagators_orbit import propagate_orbit_state
275
+
276
+ radius = 7_000_000.0
277
+ speed = np.sqrt(EARTH_MU / radius)
278
+ traj = propagate_orbit_state(
279
+ r0=[radius, 0.0, 0.0],
280
+ v0=[0.0, speed, 0.0],
281
+ times=np.linspace(0.0, 3600.0, 121),
282
+ )
283
+ ```
284
+
285
+ For rigid-body spacecraft dynamics, use `Spacecraft` when you want an
286
+ `Orbit`-like object with attitude, angular rate, inertia, and mass attached.
287
+ Use `Spacecraft.from_orbit(orbit, ...)` to attach 6-DoF state to an SSAPy
288
+ `Orbit`, `spacecraft.to_orbit()` to return the translational state to SSAPy,
289
+ and `propagate_6dof` directly for lower-level numerical propagation.
290
+
291
+ ```
292
+ import numpy as np
293
+ import ssatk
294
+ from ssatk.accelerations_6dof import SpacecraftAccelJ2, constant_body_thrust
295
+ from ssatk.plots import orbit_plot
296
+
297
+ sat = ssatk.Spacecraft(
298
+ r=[7_000_000.0, 0.0, 0.0],
299
+ v=[0.0, 7_500.0, 0.0],
300
+ q=[1.0, 0.0, 0.0, 0.0], # [w, x, y, z], body to inertial
301
+ omega=[0.0, 0.0, 0.001], # body-frame rad/s
302
+ inertia=np.diag([10.0, 12.0, 8.0]),
303
+ mass=100.0,
304
+ )
305
+
306
+ traj = sat.propagate(
307
+ times=np.linspace(0.0, 600.0, 61),
308
+ acceleration=SpacecraftAccelJ2(),
309
+ body_acceleration=constant_body_thrust([0.0, 0.01, 0.0], sat.mass),
310
+ gravity_gradient=True,
311
+ )
312
+
313
+ orbit_plot(traj.r, traj.t, view="3d")
314
+ ```
315
+
316
+ Reusable 6-DoF acceleration models live in ``ssatk.accelerations_6dof`` and
317
+ include SSAPy-like classes for Kepler gravity, J2, third-body gravity,
318
+ cannonball drag, cannonball solar radiation pressure, constant inertial/NTW/body
319
+ accelerations, summed acceleration/torque models, and attitude-dependent
320
+ flat-plate drag/SRP models, facet drag/SRP models, thruster torque, and
321
+ magnetic-dipole and gravity-gradient torque. Reaction wheels and
322
+ ``SpacecraftAttitudePD`` provide a small actuator/control layer for attitude
323
+ studies; reaction-wheel momentum is propagated as an optional state when the
324
+ body defines wheels, and configured ``momentum_capacity`` values prevent
325
+ commands from driving wheels beyond their stored angular-momentum limits.
326
+ ``SpaceEnvironment`` supplies epoch-aware Sun/Moon ephemerides, atmosphere
327
+ density and velocity, magnetic field, and disk-overlap Earth/Moon eclipse
328
+ fractions for environment-backed force models. Use ``third_bodies=True`` for
329
+ Moon/Sun perturbations, ``third_bodies="planets"`` for Mercury through Neptune
330
+ except Earth, or ``third_bodies="all"`` for a full Solar-System perturbation
331
+ set. Optional gravity-gradient torque supports central Earth or Earth/Moon/Sun
332
+ models. Common force-stack presets are available through
333
+ ``SpaceEnvironment.force_models(preset="leo"|"earth_orbit"|"cislunar"|"all")``
334
+ and individual options can still override each preset. The default atmosphere
335
+ velocity is rigid Earth co-rotation; pass ``atmosphere_velocity_model=...`` for
336
+ wind or corotation overrides. The default magnetic field is a dependency-light
337
+ centered Earth dipole; use ``magnetic_field_model="igrf"`` for optional
338
+ ``ppigrf``-backed IGRF field synthesis or pass a callable for mission-specific
339
+ models.
340
+ Thrusters report positive propellant mass flow from thrust and specific impulse;
341
+ ``propagate_6dof`` can propagate mass when a mass-flow model is supplied.
342
+ For bodies with tanks, propagated mass updates tank propellant proportionally so
343
+ center of mass and inertia evolve during finite burns. Use
344
+ `propellant_empty_event` or `mass_floor_event` to stop burns at dry mass.
345
+
346
+ Finite maneuver accelerations use ``SpacecraftManeuverAccel``. Use
347
+ ``frame="rtn"``/``"lvlh"``/``"ric"`` for common radial-transverse-normal
348
+ operations, ``frame="vnb"`` for velocity-normal-binormal commands,
349
+ ``frame="body"`` for body-mounted thrust, or ``frame="ntw"`` for exact SSAPy
350
+ ``[N, T, W]`` convention. Thrust can be constant, trapezoidal, smoothstep,
351
+ exponential, pulsed, callable, or loaded from CSV with ``ThrustCurve``; citable
352
+ engine data belongs in the appropriate split SSATK data repository rather than this source repository and can be
353
+ loaded with ``load_thrust_curve_data(...)`` once packaged.
354
+
355
+ Preset spacecraft bodies live in `ssatk.satellites`. Use
356
+ `satellite_design(...)` to start from a common bus, override dimensions or
357
+ mass, then add components, tanks, facets, or thrusters as needed:
358
+
359
+ ```
360
+ from ssatk.accelerations_6dof import (
361
+ SpacecraftFacetDrag,
362
+ SpacecraftFacetSolRad,
363
+ SpacecraftManeuverAccel,
364
+ SpacecraftThrusterAccel,
365
+ )
366
+
367
+ body = ssatk.satellite_design(
368
+ "earth_observation",
369
+ mass=500.0,
370
+ solar_array_area=10.0,
371
+ ).with_thrusters(
372
+ ssatk.Thruster(thrust=0.2, direction_body=[1, 0, 0], position_body=[0, 0.5, 0]),
373
+ ).with_components(
374
+ ssatk.Component(mass=25.0, position_body=[0.0, 0.0, 0.7], name="payload"),
375
+ ).with_magnetic_dipoles(
376
+ ssatk.MagneticDipole(moment_body=[0.2, 0.0, 0.0], name="x_magnetorquer"),
377
+ ).with_reaction_wheels(
378
+ *ssatk.reaction_wheel_triplet(max_torque=0.02),
379
+ )
380
+
381
+ sat = ssatk.Spacecraft(r=[7e6, 0, 0], v=[0, 7500, 0], body=body)
382
+ q_target = ssatk.attitude_quaternion_from_frame("nadir_velocity", r=sat.r, v=sat.v)
383
+ burn = SpacecraftManeuverAccel(
384
+ ssatk.thrust_profile_trapezoid(0.2, start=120.0, burn_time=60.0, rise_time=5.0),
385
+ frame="rtn",
386
+ direction=[0, 1, 0],
387
+ isp=220.0,
388
+ )
389
+ traj = sat.propagate(
390
+ times=np.linspace(0.0, 600.0, 61),
391
+ models=[
392
+ SpacecraftFacetDrag(density=1e-12),
393
+ SpacecraftFacetSolRad([ssatk.AU, 0, 0]),
394
+ burn,
395
+ ssatk.SpacecraftMagneticTorque([0, 2e-5, 0]),
396
+ ssatk.SpacecraftReactionWheelTorque([0, 0, 0.01]),
397
+ ssatk.SpacecraftAttitudePD(q_target=q_target, kp=0.05, kd=0.2, max_torque=0.02),
398
+ SpacecraftThrusterAccel(),
399
+ ],
400
+ )
401
+ ```
402
+
403
+ `transfer_bielliptic` computes the analytic three-impulse, two-half-ellipse
404
+ transfer between coplanar circular orbits through an intermediate apoapsis
405
+ radius. It is useful for quick radius-to-radius trade studies; use
406
+ `transfer_ssapy` or `transfer_optimal` when fixed epochs, target phasing,
407
+ perturbed propagation, or non-circular boundary states matter.
408
+ Transfer entry points accept either SSAPy `Orbit` objects (`orbit1`/`orbit2`,
409
+ `initial`/`target`) or raw inertial state vectors (`r1, v1, r2, v2`). For
410
+ `transfer_optimal`, set `departure_mode="now"` or `leave_now=True` to depart
411
+ from the supplied state; leave the default `departure_mode="optimize"` to search
412
+ for the best departure phase/time.
413
+ Set `stage_mode="immediate"` or `stage_mode="timed"` to explicitly search
414
+ staged transfers through candidate staging orbits; `stage_mode="best"` compares
415
+ the direct and staged routes. Timed staging allows each post-stage leg to wait
416
+ for an appropriate phase instead of leaving the staging orbit immediately. The
417
+ default `n_stage_stops=1` searches one intermediate staging orbit; increase
418
+ `n_stage_stops` and set `stage_beam_width` for bounded multi-stop searches.
419
+ For larger design trades, `transfer_optimal` also accepts a structured
420
+ `problem={...}` schema that groups boundary conditions, objective, constraints,
421
+ route, and solver controls in one call:
422
+
423
+ ```
424
+ from ssatk.orbital_mechanics import transfer_optimal
425
+
426
+ result = transfer_optimal(
427
+ problem={
428
+ "boundary": {
429
+ "initial": orbit1, # or r1/v1/r2/v2 at top level
430
+ "target": orbit2,
431
+ "departure_mode": "leave now", # or "leave whenever"
432
+ # inject: free-phase/first burn only; intercept: target position only;
433
+ # rendezvous: target position + velocity; insertion: free-phase velocity match
434
+ "arrival_mode": "rendezvous",
435
+ },
436
+ "objective": {"minimize": "delta_v", "delta_v_mode": "total"},
437
+ "constraints": {
438
+ "tof_range": (1800.0, 86400.0),
439
+ "dv_budget": None,
440
+ "perigee_altitude_min": 100e3,
441
+ "max_burns": 4,
442
+ },
443
+ "route": {
444
+ "mode": "multi_stage", # direct, immediate, multi_stage, best
445
+ "timing": "optimized", # immediate or optimized/timed
446
+ "n_stage_stops": 1,
447
+ "stage_candidates": {"radii": [20_000e3, 40_000e3]},
448
+ },
449
+ "solver": {"n_grid": (8, 8), "polish": False, "refine": False},
450
+ },
451
+ )
452
+ ```
453
+
454
+ The result diagnostics include `problem_schema="ssatk.transfer_problem.v1"`
455
+ when the structured interface is used.
456
+
457
+ `orbit_plot` is the main entry point for in-space trajectory plots. It uses a
458
+ four-panel orbit view by default, and also accepts compact selectors for common
459
+ slices and cislunar views:
460
+
461
+ ```
462
+ orbit_plot(r, t, frame="gcrf") # xy, xz, yz, and 3-D
463
+ orbit_plot(r, t, view="xy", frame="itrf") # one 2-D slice
464
+ orbit_plot(r, t, view=("xy", "xz", "3d")) # custom panels
465
+ orbit_plot(r, t, view="lunar_yz") # lunar-fixed YZ slice
466
+ orbit_plot(r, t, view="lunar_xy", coordinate="gcrf") # override coordinates
467
+ orbit_plot(r, t, view="ground track") # wide ground-track map
468
+ orbit_plot(r, t, view=("groundtrack", "globe")) # map + 3-D globe
469
+ orbit_plot(r, t, view="dashboard") # map, globe, and slices
470
+ orbit_plot(r, t, view="cislunar_3d") # lunar-fixed 3-D view
471
+ orbit_plot(r, t, view="cislunar_xy") # GCRF + lunar XY views
472
+ orbit_plot(r, t, view="cislunar_dashboard") # cislunar dashboard
473
+ orbit_plot(r, t, view="xy", save="quicklooks/orbit.mp4") # animated MP4
474
+ orbit_plot(r, t, view="xy", save="quicklooks/orbit.gif") # animated GIF
475
+ ```
476
+
477
+ All plotting helpers accept `save`, `savefig`, `save_fig`, `save_figure`,
478
+ `savepath`, and `save_path` as equivalent save-path keywords. Relative names
479
+ are saved under `~/ssatk_output/figures`; absolute paths are used exactly as
480
+ provided. Set `SSATK_OUTPUT_DIR` to choose a different output root explicitly.
481
+ Use `ssatk_path` and `ssatk_fig` for direct path and figure-save helpers.
482
+
483
+ For general data products, `ssatk_save` and `ssatk_read` choose the storage
484
+ format from the file extension. Bare and relative data filenames are rooted
485
+ under `~/ssatk_output`; bare and relative figure filenames are rooted under
486
+ `~/ssatk_output/figures`; absolute paths are honored.
487
+
488
+ ```
489
+ ssatk.ssatk_save({"r": r, "v": v, "t": t}, "runs/orbit.h5")
490
+ state = ssatk.ssatk_read("runs/orbit.h5")
491
+
492
+ ssatk.ssatk_save(r, "arrays/state.npy")
493
+ ssatk.ssatk_save({"r": r, "v": v}, "arrays/state.npz")
494
+ ssatk.ssatk_save(table, "tables/summary.csv")
495
+ ssatk.ssatk_save(fig, "quicklooks/orbit.png")
496
+ ```
497
+
498
+ For keyed HDF5 or NPZ outputs, pass `key=`. Non-mapping objects default to
499
+ `"data"`; dictionaries use their own keys; nested dictionaries become nested
500
+ HDF5 groups or slash-delimited NPZ members.
501
+
502
+ More detailed examples can be found in the categorized `demos/` directory. The
503
+ demo gallery runner searches those subfolders recursively. To render the full
504
+ demo gallery as a visualization document:
505
+
506
+ ```
507
+ ssatk-demo-gallery
508
+ ```
509
+
510
+ The command can be run from any directory after installation. It writes the
511
+ HTML report to `~/ssatk_output/documents/index.html` by default and prints
512
+ the exact output path when it finishes. Use `--open` to open the report in a
513
+ browser, `--output PATH` to choose a different output directory, or
514
+ `--demos-dir PATH` to run demos from a source checkout explicitly. The default
515
+ does not fall back to the clone directory; set `SSATK_OUTPUT_DIR` if you want
516
+ a non-home output root.
517
+
518
+ ---
519
+
520
+ ## Development
521
+
522
+ To run the test suite:
523
+
524
+ ```
525
+ pytest tests
526
+ ```
527
+
528
+ The current CI lint gate checks fatal Ruff errors in changed Python files; it is
529
+ not a full formatting or style pass:
530
+
531
+ ```bash
532
+ set -euo pipefail
533
+ base_ref="$(git merge-base origin/main HEAD)"
534
+ mapfile -t python_files < <(
535
+ git diff --name-only --diff-filter=ACMR "$base_ref" HEAD -- '*.py'
536
+ )
537
+ if ((${#python_files[@]})); then
538
+ ruff check --select E9,F63,F7,F82 "${python_files[@]}"
539
+ fi
540
+ ```
541
+
542
+ Optional local repo mapping with Graphify:
543
+
544
+ ```
545
+ pipx install graphifyy # or: python -m pip install graphifyy
546
+ bash scripts/install_graphify_hook.sh
547
+ ```
548
+
549
+ The installer writes a local `.git/hooks/post-commit` hook. After each commit,
550
+ the hook runs `graphify . --update --wiki` in the background when the
551
+ `graphify` CLI is available and writes ignored output under `graphify-out/`.
552
+ Disable it for one commit with `SSATK_GRAPHIFY_HOOK=0 git commit ...`, or force
553
+ foreground execution with `SSATK_GRAPHIFY_FOREGROUND=1 git commit ...`.
554
+
555
+ ---
556
+
557
+ ## Documentation
558
+
559
+ Project documentation is built with Sphinx and hosted on Read the Docs.
560
+ Once configured, the latest documentation will be available at:
561
+
562
+ <https://ssapy-toolkit.readthedocs.io>
563
+
564
+ To build the docs locally (after installing dev dependencies):
565
+
566
+ ```
567
+ cd docs
568
+ make html
569
+ ```
570
+
571
+ The built HTML files will be in `docs/_build/html/`.
572
+
573
+ ---
574
+
575
+ ## Contributing
576
+
577
+ Contributions are welcome via pull request against the `main` branch. Work that
578
+ primarily concerns the core propagation/modeling engine should target the
579
+ [SSAPy](https://github.com/llnl/SSAPy) repository instead.
580
+
581
+ ---
582
+
583
+ ## License
584
+
585
+ SSATK is distributed under the terms of the BSD 3-Clause license. All
586
+ new contributions must be made under the same license. See the
587
+ [LICENSE](LICENSE) file for details.
588
+
589
+ SPDX-License-Identifier: BSD-3-Clause
590
+
591
+ LLNL-CODE-2015996