imap-processing 0.12.0__py3-none-any.whl → 0.13.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.

Potentially problematic release.


This version of imap-processing might be problematic. Click here for more details.

Files changed (272) hide show
  1. imap_processing/__init__.py +1 -0
  2. imap_processing/_version.py +2 -2
  3. imap_processing/ccsds/ccsds_data.py +1 -2
  4. imap_processing/ccsds/excel_to_xtce.py +1 -2
  5. imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +18 -12
  6. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +569 -0
  7. imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +1846 -128
  8. imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +5 -5
  9. imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +20 -1
  10. imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +6 -4
  11. imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +3 -3
  12. imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +15 -0
  13. imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +22 -0
  14. imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +16 -0
  15. imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +178 -5
  16. imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +5045 -41
  17. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +33 -19
  18. imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +8 -48
  19. imap_processing/cdf/utils.py +41 -33
  20. imap_processing/cli.py +463 -234
  21. imap_processing/codice/codice_l1a.py +260 -47
  22. imap_processing/codice/codice_l1b.py +51 -152
  23. imap_processing/codice/constants.py +38 -1
  24. imap_processing/ena_maps/ena_maps.py +658 -65
  25. imap_processing/ena_maps/utils/coordinates.py +1 -1
  26. imap_processing/ena_maps/utils/spatial_utils.py +10 -5
  27. imap_processing/glows/l1a/glows_l1a.py +28 -99
  28. imap_processing/glows/l1a/glows_l1a_data.py +2 -2
  29. imap_processing/glows/l1b/glows_l1b.py +1 -4
  30. imap_processing/glows/l1b/glows_l1b_data.py +1 -3
  31. imap_processing/glows/l2/glows_l2.py +2 -5
  32. imap_processing/hi/l1a/hi_l1a.py +31 -12
  33. imap_processing/hi/l1b/hi_l1b.py +80 -43
  34. imap_processing/hi/l1c/hi_l1c.py +12 -16
  35. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-sector-dt0-factors_20250219_v002.csv +81 -0
  36. imap_processing/hit/hit_utils.py +93 -35
  37. imap_processing/hit/l0/decom_hit.py +3 -1
  38. imap_processing/hit/l1a/hit_l1a.py +30 -25
  39. imap_processing/hit/l1b/constants.py +6 -2
  40. imap_processing/hit/l1b/hit_l1b.py +279 -318
  41. imap_processing/hit/l2/constants.py +37 -0
  42. imap_processing/hit/l2/hit_l2.py +373 -264
  43. imap_processing/ialirt/l0/parse_mag.py +138 -10
  44. imap_processing/ialirt/l0/process_swapi.py +69 -0
  45. imap_processing/ialirt/l0/process_swe.py +318 -22
  46. imap_processing/ialirt/packet_definitions/ialirt.xml +216 -212
  47. imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +1 -1
  48. imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +1 -1
  49. imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +14 -14
  50. imap_processing/ialirt/utils/grouping.py +1 -1
  51. imap_processing/idex/idex_constants.py +9 -1
  52. imap_processing/idex/idex_l0.py +22 -8
  53. imap_processing/idex/idex_l1a.py +75 -44
  54. imap_processing/idex/idex_l1b.py +9 -8
  55. imap_processing/idex/idex_l2a.py +79 -45
  56. imap_processing/idex/idex_l2b.py +120 -0
  57. imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +33 -39
  58. imap_processing/idex/packet_definitions/idex_housekeeping_packet_definition.xml +9130 -0
  59. imap_processing/lo/l0/lo_science.py +1 -2
  60. imap_processing/lo/l1a/lo_l1a.py +1 -4
  61. imap_processing/lo/l1b/lo_l1b.py +527 -6
  62. imap_processing/lo/l1b/tof_conversions.py +11 -0
  63. imap_processing/lo/l1c/lo_l1c.py +1 -4
  64. imap_processing/mag/constants.py +43 -0
  65. imap_processing/mag/imap_mag_sdc_configuration_v001.py +8 -0
  66. imap_processing/mag/l1a/mag_l1a.py +2 -9
  67. imap_processing/mag/l1a/mag_l1a_data.py +10 -10
  68. imap_processing/mag/l1b/mag_l1b.py +84 -17
  69. imap_processing/mag/l1c/interpolation_methods.py +180 -3
  70. imap_processing/mag/l1c/mag_l1c.py +236 -70
  71. imap_processing/mag/l2/mag_l2.py +140 -0
  72. imap_processing/mag/l2/mag_l2_data.py +288 -0
  73. imap_processing/spacecraft/quaternions.py +1 -3
  74. imap_processing/spice/geometry.py +3 -3
  75. imap_processing/spice/kernels.py +0 -276
  76. imap_processing/spice/pointing_frame.py +257 -0
  77. imap_processing/spice/repoint.py +48 -19
  78. imap_processing/spice/spin.py +38 -33
  79. imap_processing/spice/time.py +24 -0
  80. imap_processing/swapi/l1/swapi_l1.py +16 -12
  81. imap_processing/swapi/l2/swapi_l2.py +116 -4
  82. imap_processing/swapi/swapi_utils.py +32 -0
  83. imap_processing/swe/l1a/swe_l1a.py +2 -9
  84. imap_processing/swe/l1a/swe_science.py +8 -11
  85. imap_processing/swe/l1b/swe_l1b.py +898 -23
  86. imap_processing/swe/l2/swe_l2.py +21 -77
  87. imap_processing/swe/utils/swe_constants.py +1 -0
  88. imap_processing/tests/ccsds/test_excel_to_xtce.py +1 -1
  89. imap_processing/tests/cdf/test_utils.py +14 -16
  90. imap_processing/tests/codice/conftest.py +44 -33
  91. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf +0 -0
  92. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf +0 -0
  93. imap_processing/tests/codice/test_codice_l1a.py +20 -11
  94. imap_processing/tests/codice/test_codice_l1b.py +6 -7
  95. imap_processing/tests/conftest.py +78 -22
  96. imap_processing/tests/ena_maps/test_ena_maps.py +462 -33
  97. imap_processing/tests/ena_maps/test_spatial_utils.py +1 -1
  98. imap_processing/tests/glows/conftest.py +10 -14
  99. imap_processing/tests/glows/test_glows_decom.py +4 -4
  100. imap_processing/tests/glows/test_glows_l1a_cdf.py +6 -27
  101. imap_processing/tests/glows/test_glows_l1a_data.py +6 -8
  102. imap_processing/tests/glows/test_glows_l1b.py +11 -11
  103. imap_processing/tests/glows/test_glows_l1b_data.py +5 -5
  104. imap_processing/tests/glows/test_glows_l2.py +2 -8
  105. imap_processing/tests/hi/conftest.py +1 -1
  106. imap_processing/tests/hi/test_hi_l1b.py +10 -12
  107. imap_processing/tests/hi/test_hi_l1c.py +27 -24
  108. imap_processing/tests/hi/test_l1a.py +7 -9
  109. imap_processing/tests/hi/test_science_direct_event.py +2 -2
  110. imap_processing/tests/hit/helpers/l1_validation.py +44 -43
  111. imap_processing/tests/hit/test_decom_hit.py +1 -1
  112. imap_processing/tests/hit/test_hit_l1a.py +9 -9
  113. imap_processing/tests/hit/test_hit_l1b.py +172 -217
  114. imap_processing/tests/hit/test_hit_l2.py +380 -118
  115. imap_processing/tests/hit/test_hit_utils.py +122 -55
  116. imap_processing/tests/hit/validation_data/hit_l1b_standard_sample2_nsrl_v4_3decimals.csv +62 -62
  117. imap_processing/tests/hit/validation_data/sci_sample_raw.csv +1 -1
  118. imap_processing/tests/ialirt/unit/test_decom_ialirt.py +16 -81
  119. imap_processing/tests/ialirt/unit/test_grouping.py +2 -2
  120. imap_processing/tests/ialirt/unit/test_parse_mag.py +71 -16
  121. imap_processing/tests/ialirt/unit/test_process_codicehi.py +3 -3
  122. imap_processing/tests/ialirt/unit/test_process_codicelo.py +3 -10
  123. imap_processing/tests/ialirt/unit/test_process_ephemeris.py +4 -4
  124. imap_processing/tests/ialirt/unit/test_process_hit.py +3 -3
  125. imap_processing/tests/ialirt/unit/test_process_swapi.py +24 -16
  126. imap_processing/tests/ialirt/unit/test_process_swe.py +115 -7
  127. imap_processing/tests/idex/conftest.py +72 -7
  128. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20241206_v001.pkts +0 -0
  129. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20250108_v001.pkts +0 -0
  130. imap_processing/tests/idex/test_idex_l0.py +33 -11
  131. imap_processing/tests/idex/test_idex_l1a.py +50 -23
  132. imap_processing/tests/idex/test_idex_l1b.py +104 -25
  133. imap_processing/tests/idex/test_idex_l2a.py +48 -32
  134. imap_processing/tests/idex/test_idex_l2b.py +93 -0
  135. imap_processing/tests/lo/test_lo_l1a.py +3 -3
  136. imap_processing/tests/lo/test_lo_l1b.py +371 -6
  137. imap_processing/tests/lo/test_lo_l1c.py +1 -1
  138. imap_processing/tests/lo/test_lo_science.py +6 -7
  139. imap_processing/tests/lo/test_star_sensor.py +1 -1
  140. imap_processing/tests/mag/conftest.py +58 -9
  141. imap_processing/tests/mag/test_mag_decom.py +4 -3
  142. imap_processing/tests/mag/test_mag_l1a.py +13 -7
  143. imap_processing/tests/mag/test_mag_l1b.py +9 -9
  144. imap_processing/tests/mag/test_mag_l1c.py +151 -47
  145. imap_processing/tests/mag/test_mag_l2.py +130 -0
  146. imap_processing/tests/mag/test_mag_validation.py +144 -7
  147. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-in.csv +1217 -0
  148. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-out.csv +1857 -0
  149. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-in.csv +1217 -0
  150. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-out.csv +1857 -0
  151. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-in.csv +1217 -0
  152. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-out.csv +1793 -0
  153. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-in.csv +1217 -0
  154. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-out.csv +1793 -0
  155. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-burst-in.csv +2561 -0
  156. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-in.csv +961 -0
  157. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-out.csv +1539 -0
  158. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-in.csv +1921 -0
  159. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-out.csv +2499 -0
  160. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-in.csv +865 -0
  161. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-out.csv +1196 -0
  162. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-in.csv +1729 -0
  163. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-out.csv +3053 -0
  164. imap_processing/tests/mag/validation/L2/imap_mag_l1b_norm-mago_20251017_v002.cdf +0 -0
  165. imap_processing/tests/mag/validation/calibration/imap_mag_l2-calibration-matrices_20251017_v004.cdf +0 -0
  166. imap_processing/tests/mag/validation/calibration/imap_mag_l2-offsets-norm_20251017_20251017_v001.cdf +0 -0
  167. imap_processing/tests/spacecraft/test_quaternions.py +1 -1
  168. imap_processing/tests/spice/test_data/fake_repoint_data.csv +4 -4
  169. imap_processing/tests/spice/test_data/fake_spin_data.csv +11 -11
  170. imap_processing/tests/spice/test_geometry.py +3 -3
  171. imap_processing/tests/spice/test_kernels.py +1 -200
  172. imap_processing/tests/spice/test_pointing_frame.py +185 -0
  173. imap_processing/tests/spice/test_repoint.py +20 -10
  174. imap_processing/tests/spice/test_spin.py +50 -9
  175. imap_processing/tests/spice/test_time.py +14 -0
  176. imap_processing/tests/swapi/lut/imap_swapi_esa-unit-conversion_20250211_v000.csv +73 -0
  177. imap_processing/tests/swapi/lut/imap_swapi_lut-notes_20250211_v000.csv +1025 -0
  178. imap_processing/tests/swapi/test_swapi_l1.py +7 -9
  179. imap_processing/tests/swapi/test_swapi_l2.py +180 -8
  180. imap_processing/tests/swe/lut/checker-board-indices.csv +24 -0
  181. imap_processing/tests/swe/lut/imap_swe_esa-lut_20250301_v000.csv +385 -0
  182. imap_processing/tests/swe/lut/imap_swe_l1b-in-flight-cal_20240510_20260716_v000.csv +3 -0
  183. imap_processing/tests/swe/test_swe_l1a.py +6 -6
  184. imap_processing/tests/swe/test_swe_l1a_science.py +3 -3
  185. imap_processing/tests/swe/test_swe_l1b.py +162 -24
  186. imap_processing/tests/swe/test_swe_l2.py +82 -102
  187. imap_processing/tests/test_cli.py +171 -88
  188. imap_processing/tests/test_utils.py +2 -1
  189. imap_processing/tests/ultra/data/mock_data.py +49 -21
  190. imap_processing/tests/ultra/unit/conftest.py +53 -70
  191. imap_processing/tests/ultra/unit/test_badtimes.py +2 -4
  192. imap_processing/tests/ultra/unit/test_cullingmask.py +4 -6
  193. imap_processing/tests/ultra/unit/test_de.py +3 -10
  194. imap_processing/tests/ultra/unit/test_decom_apid_880.py +27 -76
  195. imap_processing/tests/ultra/unit/test_decom_apid_881.py +15 -16
  196. imap_processing/tests/ultra/unit/test_decom_apid_883.py +12 -10
  197. imap_processing/tests/ultra/unit/test_decom_apid_896.py +202 -55
  198. imap_processing/tests/ultra/unit/test_lookup_utils.py +23 -1
  199. imap_processing/tests/ultra/unit/test_spacecraft_pset.py +3 -4
  200. imap_processing/tests/ultra/unit/test_ultra_l1a.py +84 -307
  201. imap_processing/tests/ultra/unit/test_ultra_l1b.py +30 -12
  202. imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +2 -2
  203. imap_processing/tests/ultra/unit/test_ultra_l1b_culling.py +4 -1
  204. imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +163 -29
  205. imap_processing/tests/ultra/unit/test_ultra_l1c.py +5 -5
  206. imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +32 -43
  207. imap_processing/tests/ultra/unit/test_ultra_l2.py +230 -0
  208. imap_processing/ultra/constants.py +1 -1
  209. imap_processing/ultra/l0/decom_tools.py +21 -34
  210. imap_processing/ultra/l0/decom_ultra.py +168 -204
  211. imap_processing/ultra/l0/ultra_utils.py +152 -136
  212. imap_processing/ultra/l1a/ultra_l1a.py +55 -243
  213. imap_processing/ultra/l1b/badtimes.py +1 -4
  214. imap_processing/ultra/l1b/cullingmask.py +2 -6
  215. imap_processing/ultra/l1b/de.py +62 -47
  216. imap_processing/ultra/l1b/extendedspin.py +8 -4
  217. imap_processing/ultra/l1b/lookup_utils.py +72 -9
  218. imap_processing/ultra/l1b/ultra_l1b.py +3 -8
  219. imap_processing/ultra/l1b/ultra_l1b_culling.py +4 -4
  220. imap_processing/ultra/l1b/ultra_l1b_extended.py +236 -78
  221. imap_processing/ultra/l1c/histogram.py +2 -6
  222. imap_processing/ultra/l1c/spacecraft_pset.py +2 -4
  223. imap_processing/ultra/l1c/ultra_l1c.py +1 -5
  224. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +107 -60
  225. imap_processing/ultra/l2/ultra_l2.py +299 -0
  226. imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_LeftSlit.csv +526 -0
  227. imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_RightSlit.csv +526 -0
  228. imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_LeftSlit.csv +526 -0
  229. imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_RightSlit.csv +526 -0
  230. imap_processing/ultra/lookup_tables/FM45_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -2
  231. imap_processing/ultra/lookup_tables/FM90_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -0
  232. imap_processing/ultra/packet_definitions/README.md +38 -0
  233. imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +15302 -482
  234. imap_processing/ultra/utils/ultra_l1_utils.py +13 -12
  235. imap_processing/utils.py +1 -1
  236. {imap_processing-0.12.0.dist-info → imap_processing-0.13.0.dist-info}/METADATA +3 -2
  237. {imap_processing-0.12.0.dist-info → imap_processing-0.13.0.dist-info}/RECORD +264 -225
  238. imap_processing/hi/l1b/hi_eng_unit_convert_table.csv +0 -154
  239. imap_processing/mag/imap_mag_sdc-configuration_v001.yaml +0 -6
  240. imap_processing/mag/l1b/__init__.py +0 -0
  241. imap_processing/swe/l1b/swe_esa_lookup_table.csv +0 -1441
  242. imap_processing/swe/l1b/swe_l1b_science.py +0 -699
  243. imap_processing/tests/swe/test_swe_l1b_science.py +0 -103
  244. imap_processing/ultra/lookup_tables/dps_sensitivity45.cdf +0 -0
  245. imap_processing/ultra/lookup_tables/ultra_90_dps_exposure_compressed.cdf +0 -0
  246. /imap_processing/idex/packet_definitions/{idex_packet_definition.xml → idex_science_packet_definition.xml} +0 -0
  247. /imap_processing/tests/ialirt/{test_data → data}/l0/20240827095047_SWE_IALIRT_packet.bin +0 -0
  248. /imap_processing/tests/ialirt/{test_data → data}/l0/461971383-404.bin +0 -0
  249. /imap_processing/tests/ialirt/{test_data → data}/l0/461971384-405.bin +0 -0
  250. /imap_processing/tests/ialirt/{test_data → data}/l0/461971385-406.bin +0 -0
  251. /imap_processing/tests/ialirt/{test_data → data}/l0/461971386-407.bin +0 -0
  252. /imap_processing/tests/ialirt/{test_data → data}/l0/461971387-408.bin +0 -0
  253. /imap_processing/tests/ialirt/{test_data → data}/l0/461971388-409.bin +0 -0
  254. /imap_processing/tests/ialirt/{test_data → data}/l0/461971389-410.bin +0 -0
  255. /imap_processing/tests/ialirt/{test_data → data}/l0/461971390-411.bin +0 -0
  256. /imap_processing/tests/ialirt/{test_data → data}/l0/461971391-412.bin +0 -0
  257. /imap_processing/tests/ialirt/{test_data → data}/l0/BinLog CCSDS_FRAG_TLM_20240826_152323Z_IALIRT_data_for_SDC.bin +0 -0
  258. /imap_processing/tests/ialirt/{test_data → data}/l0/IALiRT Raw Packet Telemetry.txt +0 -0
  259. /imap_processing/tests/ialirt/{test_data → data}/l0/apid01152.tlm +0 -0
  260. /imap_processing/tests/ialirt/{test_data → data}/l0/eu_SWP_IAL_20240826_152033.csv +0 -0
  261. /imap_processing/tests/ialirt/{test_data → data}/l0/hi_fsw_view_1_ccsds.bin +0 -0
  262. /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.ccsds +0 -0
  263. /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.csv +0 -0
  264. /imap_processing/tests/ialirt/{test_data → data}/l0/idle_export_eu.SWE_IALIRT_20240827_093852.csv +0 -0
  265. /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_hi-ialirt_20240523200000_v0.0.0.cdf +0 -0
  266. /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
  267. /imap_processing/tests/ialirt/{test_data → data}/l0/sample_decoded_i-alirt_data.csv +0 -0
  268. /imap_processing/tests/mag/validation/{imap_calibration_mag_20240229_v01.cdf → calibration/imap_mag_l1b-calibration_20240229_v001.cdf} +0 -0
  269. /imap_processing/{swe/l1b/engineering_unit_convert_table.csv → tests/swe/lut/imap_swe_eu-conversion_20240510_v000.csv} +0 -0
  270. {imap_processing-0.12.0.dist-info → imap_processing-0.13.0.dist-info}/LICENSE +0 -0
  271. {imap_processing-0.12.0.dist-info → imap_processing-0.13.0.dist-info}/WHEEL +0 -0
  272. {imap_processing-0.12.0.dist-info → imap_processing-0.13.0.dist-info}/entry_points.txt +0 -0
@@ -17,7 +17,7 @@ import requests
17
17
  import spiceypy
18
18
 
19
19
  from imap_processing import imap_module_directory
20
- from imap_processing.spice.time import met_to_ttj2000ns
20
+ from imap_processing.spice.time import TTJ2000_EPOCH, met_to_ttj2000ns
21
21
 
22
22
 
23
23
  @pytest.fixture(autouse=True)
@@ -94,7 +94,7 @@ def _download_external_kernels(spice_test_data_path):
94
94
 
95
95
  @pytest.fixture(scope="session")
96
96
  def _download_test_data():
97
- _download_external_data(test_data_paths())
97
+ _download_external_data(_test_data_paths())
98
98
 
99
99
 
100
100
  def _download_external_data(test_data_path_list):
@@ -125,10 +125,14 @@ def _download_external_data(test_data_path_list):
125
125
  logger.info(f"File already exists: {destination}")
126
126
 
127
127
 
128
- def test_data_paths():
128
+ def _test_data_paths():
129
129
  """Defines a list of test data files to download from the AWS S3 bucket
130
130
  and the corresponding location in which to store the downloaded file"""
131
131
  test_data_path_list = [
132
+ (
133
+ "apid_478.bin",
134
+ imap_module_directory / "tests" / "ialirt" / "data" / "l0" / "apid_478.bin",
135
+ ),
132
136
  (
133
137
  "imap_codice_l0_raw_20241110_v001.pkts",
134
138
  imap_module_directory
@@ -155,6 +159,15 @@ def test_data_paths():
155
159
  / "l1"
156
160
  / "imap_hi_l1b_45sensor-de_20250415_v999.cdf",
157
161
  ),
162
+ (
163
+ "imap_hi_l1c_45sensor-pset_20250415_v999.cdf",
164
+ imap_module_directory
165
+ / "tests"
166
+ / "hi"
167
+ / "data"
168
+ / "l1"
169
+ / "imap_hi_l1c_45sensor-pset_20250415_v999.cdf",
170
+ ),
158
171
  (
159
172
  "idex_l1a_validation_file.h5",
160
173
  imap_module_directory
@@ -163,6 +176,14 @@ def test_data_paths():
163
176
  / "test_data"
164
177
  / "idex_l1a_validation_file.h5",
165
178
  ),
179
+ (
180
+ "idex_l1b_validation_file.h5",
181
+ imap_module_directory
182
+ / "tests"
183
+ / "idex"
184
+ / "test_data"
185
+ / "idex_l1b_validation_file.h5",
186
+ ),
166
187
  (
167
188
  "ultra-90_raw_event_data_shortened.csv",
168
189
  imap_module_directory
@@ -199,7 +220,17 @@ def test_data_paths():
199
220
  / "l1"
200
221
  / "ultra_90_dps_exposure.csv",
201
222
  ),
223
+ (
224
+ "Ultra_efficiencies_45_combined_logistic_interpolation.csv",
225
+ imap_module_directory
226
+ / "tests"
227
+ / "ultra"
228
+ / "data"
229
+ / "l1"
230
+ / "Ultra_efficiencies_45_combined_logistic_interpolation.csv",
231
+ ),
202
232
  ]
233
+
203
234
  return test_data_path_list
204
235
 
205
236
 
@@ -241,7 +272,7 @@ def spice_test_data_path(imap_tests_path):
241
272
  return imap_tests_path / "spice/test_data"
242
273
 
243
274
 
244
- @pytest.fixture()
275
+ @pytest.fixture
245
276
  def furnish_time_kernels(spice_test_data_path):
246
277
  """Furnishes (temporarily) the testing LSK and SCLK"""
247
278
  spiceypy.kclear()
@@ -253,7 +284,7 @@ def furnish_time_kernels(spice_test_data_path):
253
284
  spiceypy.kclear()
254
285
 
255
286
 
256
- @pytest.fixture()
287
+ @pytest.fixture
257
288
  def furnish_sclk(spice_test_data_path):
258
289
  """Furnishes (temporarily) the SCLK for JPSS stored in the package data directory"""
259
290
  test_sclk = spice_test_data_path / "imap_sclk_0000.tsc"
@@ -262,7 +293,7 @@ def furnish_sclk(spice_test_data_path):
262
293
  spiceypy.kclear()
263
294
 
264
295
 
265
- @pytest.fixture()
296
+ @pytest.fixture
266
297
  def furnish_kernels(spice_test_data_path):
267
298
  """Return a function that will furnish an arbitrary list of kernels."""
268
299
 
@@ -364,7 +395,7 @@ def session_test_metakernel(monkeypatch_session, tmpdir_factory, spice_test_data
364
395
  spiceypy.kclear()
365
396
 
366
397
 
367
- @pytest.fixture()
398
+ @pytest.fixture
368
399
  def use_test_metakernel(
369
400
  request, monkeypatch, spice_test_data_path, session_test_metakernel
370
401
  ):
@@ -414,14 +445,14 @@ def use_test_metakernel(
414
445
  spiceypy.kclear()
415
446
 
416
447
 
417
- @pytest.fixture()
448
+ @pytest.fixture
418
449
  def _unset_metakernel_path(monkeypatch):
419
450
  """Temporarily unsets the SPICE_METAKERNEL environment variable"""
420
451
  if os.getenv("SPICE_METAKERNEL", None) is not None:
421
452
  monkeypatch.delenv("SPICE_METAKERNEL")
422
453
 
423
454
 
424
- @pytest.fixture()
455
+ @pytest.fixture
425
456
  def use_test_spin_data_csv(monkeypatch):
426
457
  """Sets the SPIN_DATA_FILEPATH environment variable to input path."""
427
458
 
@@ -431,7 +462,7 @@ def use_test_spin_data_csv(monkeypatch):
431
462
  return wrapped_set_spin_data_filepath
432
463
 
433
464
 
434
- @pytest.fixture()
465
+ @pytest.fixture
435
466
  def use_fake_spin_data_for_time(
436
467
  request, use_test_spin_data_csv, tmpdir, generate_spin_data
437
468
  ):
@@ -468,7 +499,7 @@ def use_fake_spin_data_for_time(
468
499
  return wrapped_set_spin_data_filepath
469
500
 
470
501
 
471
- @pytest.fixture()
502
+ @pytest.fixture
472
503
  def generate_spin_data():
473
504
  def make_data(start_met: float, end_met: Optional[float] = None) -> pd.DataFrame:
474
505
  """
@@ -476,8 +507,9 @@ def generate_spin_data():
476
507
  Spin table contains the following fields:
477
508
  (
478
509
  spin_number,
479
- spin_start_sec,
480
- spin_start_subsec,
510
+ spin_start_sec_sclk,
511
+ spin_start_subsec_sclk,
512
+ spin_start_utc,
481
513
  spin_period_sec,
482
514
  spin_period_valid,
483
515
  spin_phase_valid,
@@ -505,18 +537,25 @@ def generate_spin_data():
505
537
  end_met = start_met + 86400
506
538
 
507
539
  # Create spin start second data of 15 seconds increment
508
- spin_start_sec = np.arange(np.floor(start_met), end_met + 1, 15)
509
- spin_start_subsec = int((start_met - spin_start_sec[0]) * 1000)
540
+ spin_start_met = np.arange(start_met, end_met + 1, 15)
541
+ spin_start_sec = np.floor(spin_start_met).astype(int)
542
+ spin_start_subsec = int((start_met - spin_start_sec[0]) * 1e6)
543
+
544
+ # Calculate UTC times without spice (accepting ~5 second inaccuracy)
545
+ spin_start_dt64 = TTJ2000_EPOCH + (spin_start_met * 1e9).astype(
546
+ "timedelta64[ns]"
547
+ )
510
548
 
511
549
  nspins = len(spin_start_sec)
512
550
 
513
551
  spin_df = pd.DataFrame.from_dict(
514
552
  {
515
553
  "spin_number": np.arange(nspins, dtype=np.uint32),
516
- "spin_start_sec": spin_start_sec,
517
- "spin_start_subsec": np.full(
554
+ "spin_start_sec_sclk": spin_start_sec,
555
+ "spin_start_subsec_sclk": np.full(
518
556
  nspins, spin_start_subsec, dtype=np.uint32
519
557
  ),
558
+ "spin_start_utc": np.datetime_as_string(spin_start_dt64, unit="us"),
520
559
  "spin_period_sec": np.full(nspins, 15.0, dtype=np.float32),
521
560
  "spin_period_valid": np.ones(nspins, dtype=np.uint8),
522
561
  "spin_phase_valid": np.ones(nspins, dtype=np.uint8),
@@ -526,7 +565,7 @@ def generate_spin_data():
526
565
  )
527
566
 
528
567
  # Convert spin_start_sec to datetime to set repointing times flags
529
- spin_start_dates = met_to_ttj2000ns(spin_start_sec + spin_start_subsec / 1000)
568
+ spin_start_dates = met_to_ttj2000ns(spin_start_sec + spin_start_subsec / 1e6)
530
569
  spin_start_dates = cdflib.cdfepoch.to_datetime(spin_start_dates)
531
570
 
532
571
  # Convert DatetimeIndex to Series for using .dt accessor
@@ -550,7 +589,7 @@ def generate_spin_data():
550
589
  return make_data
551
590
 
552
591
 
553
- @pytest.fixture()
592
+ @pytest.fixture
554
593
  def use_test_repoint_data_csv(monkeypatch):
555
594
  """Sets the REPOINT_DATA_FILEPATH environment variable to input path."""
556
595
 
@@ -588,10 +627,21 @@ def generate_repoint_data(
588
627
  repoint_start_times = np.array(repoint_start_met)
589
628
  if repoint_end_met is None:
590
629
  repoint_end_met = repoint_start_times + 15 * 60
630
+ # Calculate UTC times without spice (accepting ~5 second inaccuracy)
631
+ repoint_start_dt64 = TTJ2000_EPOCH + (repoint_start_times * 1e9).astype(
632
+ "timedelta64[ns]"
633
+ )
634
+ repoint_end_dt64 = TTJ2000_EPOCH + (repoint_end_met * 1e9).astype("timedelta64[ns]")
591
635
  repoint_df = pd.DataFrame.from_dict(
592
636
  {
593
- "repoint_start_time": repoint_start_times,
594
- "repoint_end_time": np.array(repoint_end_met),
637
+ "repoint_start_sec_sclk": repoint_start_times.astype(int),
638
+ "repoint_start_subsec_sclk": ((repoint_start_times % 1.0) * 1e6).astype(
639
+ int
640
+ ),
641
+ "repoint_start_utc": np.datetime_as_string(repoint_start_dt64, unit="us"),
642
+ "repoint_end_sec_sclk": repoint_end_met.astype(int),
643
+ "repoint_end_subsec_sclk": ((repoint_end_met % 1.0) * 1e6).astype(int),
644
+ "repoint_end_utc": np.datetime_as_string(repoint_end_dt64, unit="us"),
595
645
  "repoint_id": np.arange(repoint_start_times.size, dtype=int)
596
646
  + repoint_id_start,
597
647
  }
@@ -599,7 +649,7 @@ def generate_repoint_data(
599
649
  return repoint_df
600
650
 
601
651
 
602
- @pytest.fixture()
652
+ @pytest.fixture
603
653
  def use_fake_repoint_data_for_time(use_test_repoint_data_csv, tmpdir):
604
654
  """
605
655
  Generate and use fake spin data for testing.
@@ -641,3 +691,9 @@ def use_fake_repoint_data_for_time(use_test_repoint_data_csv, tmpdir):
641
691
  use_test_repoint_data_csv(repoint_csv_file_path)
642
692
 
643
693
  return wrapped_repoint_data_filepath
694
+
695
+
696
+ if __name__ == "__main__":
697
+ # This is to enable downloading files easier by letting us
698
+ # run this file directly
699
+ _download_external_data(_test_data_paths())