imap-processing 0.11.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 (415) hide show
  1. imap_processing/__init__.py +11 -11
  2. imap_processing/_version.py +2 -2
  3. imap_processing/ccsds/ccsds_data.py +1 -2
  4. imap_processing/ccsds/excel_to_xtce.py +66 -18
  5. imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +24 -40
  6. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +934 -42
  7. imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +1846 -128
  8. imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +0 -5
  9. imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +10 -11
  10. imap_processing/cdf/config/imap_hi_variable_attrs.yaml +17 -19
  11. imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +27 -14
  12. imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +106 -116
  13. imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +120 -145
  14. imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +14 -0
  15. imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +25 -9
  16. imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +6 -4
  17. imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +3 -3
  18. imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +0 -12
  19. imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +1 -1
  20. imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +23 -20
  21. imap_processing/cdf/config/imap_mag_l1a_variable_attrs.yaml +361 -0
  22. imap_processing/cdf/config/imap_mag_l1b_variable_attrs.yaml +160 -0
  23. imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +160 -0
  24. imap_processing/cdf/config/imap_spacecraft_global_cdf_attrs.yaml +18 -0
  25. imap_processing/cdf/config/imap_spacecraft_variable_attrs.yaml +40 -0
  26. imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +1 -5
  27. imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +22 -0
  28. imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +12 -4
  29. imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +16 -2
  30. imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +64 -52
  31. imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +71 -47
  32. imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +180 -19
  33. imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +5045 -41
  34. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +80 -17
  35. imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +32 -57
  36. imap_processing/cdf/utils.py +52 -38
  37. imap_processing/cli.py +477 -233
  38. imap_processing/codice/codice_l1a.py +466 -131
  39. imap_processing/codice/codice_l1b.py +51 -152
  40. imap_processing/codice/constants.py +1360 -569
  41. imap_processing/codice/decompress.py +2 -6
  42. imap_processing/ena_maps/ena_maps.py +1103 -146
  43. imap_processing/ena_maps/utils/coordinates.py +19 -0
  44. imap_processing/ena_maps/utils/map_utils.py +14 -17
  45. imap_processing/ena_maps/utils/spatial_utils.py +55 -52
  46. imap_processing/glows/l1a/glows_l1a.py +28 -99
  47. imap_processing/glows/l1a/glows_l1a_data.py +2 -2
  48. imap_processing/glows/l1b/glows_l1b.py +1 -4
  49. imap_processing/glows/l1b/glows_l1b_data.py +1 -3
  50. imap_processing/glows/l2/glows_l2.py +2 -5
  51. imap_processing/hi/l1a/hi_l1a.py +54 -29
  52. imap_processing/hi/l1a/histogram.py +0 -1
  53. imap_processing/hi/l1a/science_direct_event.py +6 -8
  54. imap_processing/hi/l1b/hi_l1b.py +111 -82
  55. imap_processing/hi/l1c/hi_l1c.py +416 -32
  56. imap_processing/hi/utils.py +58 -12
  57. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-sector-dt0-factors_20250219_v002.csv +81 -0
  58. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt0-factors_20250219_v002.csv +205 -0
  59. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt1-factors_20250219_v002.csv +205 -0
  60. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt2-factors_20250219_v002.csv +205 -0
  61. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt3-factors_20250219_v002.csv +205 -0
  62. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-summed-dt0-factors_20250219_v002.csv +68 -0
  63. imap_processing/hit/hit_utils.py +235 -5
  64. imap_processing/hit/l0/constants.py +20 -11
  65. imap_processing/hit/l0/decom_hit.py +21 -5
  66. imap_processing/hit/l1a/hit_l1a.py +71 -75
  67. imap_processing/hit/l1b/constants.py +321 -0
  68. imap_processing/hit/l1b/hit_l1b.py +377 -67
  69. imap_processing/hit/l2/constants.py +318 -0
  70. imap_processing/hit/l2/hit_l2.py +723 -0
  71. imap_processing/hit/packet_definitions/hit_packet_definitions.xml +1323 -71
  72. imap_processing/ialirt/l0/mag_l0_ialirt_data.py +155 -0
  73. imap_processing/ialirt/l0/parse_mag.py +374 -0
  74. imap_processing/ialirt/l0/process_swapi.py +69 -0
  75. imap_processing/ialirt/l0/process_swe.py +548 -0
  76. imap_processing/ialirt/packet_definitions/ialirt.xml +216 -208
  77. imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +1 -1
  78. imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +1 -1
  79. imap_processing/ialirt/packet_definitions/ialirt_mag.xml +115 -0
  80. imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +14 -14
  81. imap_processing/ialirt/utils/grouping.py +114 -0
  82. imap_processing/ialirt/utils/time.py +29 -0
  83. imap_processing/idex/atomic_masses.csv +22 -0
  84. imap_processing/idex/decode.py +2 -2
  85. imap_processing/idex/idex_constants.py +33 -0
  86. imap_processing/idex/idex_l0.py +22 -8
  87. imap_processing/idex/idex_l1a.py +81 -51
  88. imap_processing/idex/idex_l1b.py +13 -39
  89. imap_processing/idex/idex_l2a.py +823 -0
  90. imap_processing/idex/idex_l2b.py +120 -0
  91. imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +11 -11
  92. imap_processing/idex/packet_definitions/idex_housekeeping_packet_definition.xml +9130 -0
  93. imap_processing/lo/l0/lo_science.py +7 -2
  94. imap_processing/lo/l1a/lo_l1a.py +1 -5
  95. imap_processing/lo/l1b/lo_l1b.py +702 -29
  96. imap_processing/lo/l1b/tof_conversions.py +11 -0
  97. imap_processing/lo/l1c/lo_l1c.py +1 -4
  98. imap_processing/mag/constants.py +51 -0
  99. imap_processing/mag/imap_mag_sdc_configuration_v001.py +8 -0
  100. imap_processing/mag/l0/decom_mag.py +10 -3
  101. imap_processing/mag/l1a/mag_l1a.py +23 -19
  102. imap_processing/mag/l1a/mag_l1a_data.py +35 -10
  103. imap_processing/mag/l1b/mag_l1b.py +259 -50
  104. imap_processing/mag/l1c/interpolation_methods.py +388 -0
  105. imap_processing/mag/l1c/mag_l1c.py +621 -17
  106. imap_processing/mag/l2/mag_l2.py +140 -0
  107. imap_processing/mag/l2/mag_l2_data.py +288 -0
  108. imap_processing/quality_flags.py +1 -0
  109. imap_processing/spacecraft/packet_definitions/scid_x252.xml +538 -0
  110. imap_processing/spacecraft/quaternions.py +121 -0
  111. imap_processing/spice/geometry.py +19 -22
  112. imap_processing/spice/kernels.py +0 -276
  113. imap_processing/spice/pointing_frame.py +257 -0
  114. imap_processing/spice/repoint.py +149 -0
  115. imap_processing/spice/spin.py +38 -33
  116. imap_processing/spice/time.py +24 -0
  117. imap_processing/swapi/l1/swapi_l1.py +20 -12
  118. imap_processing/swapi/l2/swapi_l2.py +116 -5
  119. imap_processing/swapi/swapi_utils.py +32 -0
  120. imap_processing/swe/l1a/swe_l1a.py +44 -12
  121. imap_processing/swe/l1a/swe_science.py +13 -13
  122. imap_processing/swe/l1b/swe_l1b.py +898 -23
  123. imap_processing/swe/l2/swe_l2.py +75 -136
  124. imap_processing/swe/packet_definitions/swe_packet_definition.xml +1121 -1
  125. imap_processing/swe/utils/swe_constants.py +64 -0
  126. imap_processing/swe/utils/swe_utils.py +85 -28
  127. imap_processing/tests/ccsds/test_data/expected_output.xml +40 -1
  128. imap_processing/tests/ccsds/test_excel_to_xtce.py +24 -21
  129. imap_processing/tests/cdf/test_data/imap_instrument2_global_cdf_attrs.yaml +0 -2
  130. imap_processing/tests/cdf/test_utils.py +14 -16
  131. imap_processing/tests/codice/conftest.py +44 -33
  132. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
  133. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-singles_20241110193700_v0.0.0.cdf +0 -0
  134. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-ialirt_20241110193700_v0.0.0.cdf +0 -0
  135. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-omni_20241110193700_v0.0.0.cdf +0 -0
  136. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf +0 -0
  137. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-priorities_20241110193700_v0.0.0.cdf +0 -0
  138. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-sectored_20241110193700_v0.0.0.cdf +0 -0
  139. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
  140. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf +0 -0
  141. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
  142. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf +0 -0
  143. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf +0 -0
  144. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf +0 -0
  145. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf +0 -0
  146. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf +0 -0
  147. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf +0 -0
  148. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf +0 -0
  149. imap_processing/tests/codice/test_codice_l1a.py +126 -53
  150. imap_processing/tests/codice/test_codice_l1b.py +6 -7
  151. imap_processing/tests/codice/test_decompress.py +4 -4
  152. imap_processing/tests/conftest.py +239 -27
  153. imap_processing/tests/ena_maps/conftest.py +51 -0
  154. imap_processing/tests/ena_maps/test_ena_maps.py +1068 -110
  155. imap_processing/tests/ena_maps/test_map_utils.py +66 -43
  156. imap_processing/tests/ena_maps/test_spatial_utils.py +17 -21
  157. imap_processing/tests/glows/conftest.py +10 -14
  158. imap_processing/tests/glows/test_glows_decom.py +4 -4
  159. imap_processing/tests/glows/test_glows_l1a_cdf.py +6 -27
  160. imap_processing/tests/glows/test_glows_l1a_data.py +6 -8
  161. imap_processing/tests/glows/test_glows_l1b.py +11 -11
  162. imap_processing/tests/glows/test_glows_l1b_data.py +5 -5
  163. imap_processing/tests/glows/test_glows_l2.py +2 -8
  164. imap_processing/tests/hi/conftest.py +1 -1
  165. imap_processing/tests/hi/data/l0/H45_diag_fee_20250208.bin +0 -0
  166. imap_processing/tests/hi/data/l0/H45_diag_fee_20250208_verify.csv +205 -0
  167. imap_processing/tests/hi/test_hi_l1b.py +22 -27
  168. imap_processing/tests/hi/test_hi_l1c.py +249 -18
  169. imap_processing/tests/hi/test_l1a.py +35 -7
  170. imap_processing/tests/hi/test_science_direct_event.py +3 -3
  171. imap_processing/tests/hi/test_utils.py +24 -2
  172. imap_processing/tests/hit/helpers/l1_validation.py +74 -73
  173. imap_processing/tests/hit/test_data/hskp_sample.ccsds +0 -0
  174. imap_processing/tests/hit/test_data/imap_hit_l0_raw_20100105_v001.pkts +0 -0
  175. imap_processing/tests/hit/test_decom_hit.py +5 -1
  176. imap_processing/tests/hit/test_hit_l1a.py +32 -36
  177. imap_processing/tests/hit/test_hit_l1b.py +300 -81
  178. imap_processing/tests/hit/test_hit_l2.py +716 -0
  179. imap_processing/tests/hit/test_hit_utils.py +184 -7
  180. imap_processing/tests/hit/validation_data/hit_l1b_standard_sample2_nsrl_v4_3decimals.csv +62 -62
  181. imap_processing/tests/hit/validation_data/hskp_sample_eu_3_6_2025.csv +89 -0
  182. imap_processing/tests/hit/validation_data/hskp_sample_raw.csv +89 -88
  183. imap_processing/tests/hit/validation_data/sci_sample_raw.csv +1 -1
  184. imap_processing/tests/ialirt/data/l0/461971383-404.bin +0 -0
  185. imap_processing/tests/ialirt/data/l0/461971384-405.bin +0 -0
  186. imap_processing/tests/ialirt/data/l0/461971385-406.bin +0 -0
  187. imap_processing/tests/ialirt/data/l0/461971386-407.bin +0 -0
  188. imap_processing/tests/ialirt/data/l0/461971387-408.bin +0 -0
  189. imap_processing/tests/ialirt/data/l0/461971388-409.bin +0 -0
  190. imap_processing/tests/ialirt/data/l0/461971389-410.bin +0 -0
  191. imap_processing/tests/ialirt/data/l0/461971390-411.bin +0 -0
  192. imap_processing/tests/ialirt/data/l0/461971391-412.bin +0 -0
  193. imap_processing/tests/ialirt/data/l0/sample_decoded_i-alirt_data.csv +383 -0
  194. imap_processing/tests/ialirt/unit/test_decom_ialirt.py +16 -81
  195. imap_processing/tests/ialirt/unit/test_grouping.py +81 -0
  196. imap_processing/tests/ialirt/unit/test_parse_mag.py +223 -0
  197. imap_processing/tests/ialirt/unit/test_process_codicehi.py +3 -3
  198. imap_processing/tests/ialirt/unit/test_process_codicelo.py +3 -10
  199. imap_processing/tests/ialirt/unit/test_process_ephemeris.py +4 -4
  200. imap_processing/tests/ialirt/unit/test_process_hit.py +3 -3
  201. imap_processing/tests/ialirt/unit/test_process_swapi.py +24 -16
  202. imap_processing/tests/ialirt/unit/test_process_swe.py +319 -6
  203. imap_processing/tests/ialirt/unit/test_time.py +16 -0
  204. imap_processing/tests/idex/conftest.py +127 -6
  205. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231218_v001.pkts +0 -0
  206. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20241206_v001.pkts +0 -0
  207. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20250108_v001.pkts +0 -0
  208. imap_processing/tests/idex/test_data/impact_14_tof_high_data.txt +4508 -4508
  209. imap_processing/tests/idex/test_idex_l0.py +33 -11
  210. imap_processing/tests/idex/test_idex_l1a.py +92 -21
  211. imap_processing/tests/idex/test_idex_l1b.py +106 -27
  212. imap_processing/tests/idex/test_idex_l2a.py +399 -0
  213. imap_processing/tests/idex/test_idex_l2b.py +93 -0
  214. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20241022_v002.cdf +0 -0
  215. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20241022_v002.cdf +0 -0
  216. imap_processing/tests/lo/test_lo_l1a.py +3 -3
  217. imap_processing/tests/lo/test_lo_l1b.py +515 -6
  218. imap_processing/tests/lo/test_lo_l1c.py +1 -1
  219. imap_processing/tests/lo/test_lo_science.py +7 -7
  220. imap_processing/tests/lo/test_star_sensor.py +1 -1
  221. imap_processing/tests/mag/conftest.py +120 -2
  222. imap_processing/tests/mag/test_mag_decom.py +5 -4
  223. imap_processing/tests/mag/test_mag_l1a.py +51 -7
  224. imap_processing/tests/mag/test_mag_l1b.py +40 -59
  225. imap_processing/tests/mag/test_mag_l1c.py +354 -19
  226. imap_processing/tests/mag/test_mag_l2.py +130 -0
  227. imap_processing/tests/mag/test_mag_validation.py +247 -26
  228. imap_processing/tests/mag/validation/L1b/T009/MAGScience-normal-(2,2)-8s-20250204-16h39.csv +17 -0
  229. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-magi-out.csv +16 -16
  230. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-mago-out.csv +16 -16
  231. imap_processing/tests/mag/validation/L1b/T010/MAGScience-normal-(2,2)-8s-20250206-12h05.csv +17 -0
  232. imap_processing/tests/mag/validation/L1b/T011/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
  233. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-magi-out.csv +16 -16
  234. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-mago-out.csv +16 -16
  235. imap_processing/tests/mag/validation/L1b/T012/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
  236. imap_processing/tests/mag/validation/L1b/T012/data.bin +0 -0
  237. imap_processing/tests/mag/validation/L1b/T012/field_like_all_ranges.txt +19200 -0
  238. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-cal.cdf +0 -0
  239. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-in.csv +17 -0
  240. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-magi-out.csv +17 -0
  241. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-mago-out.csv +17 -0
  242. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-in.csv +1217 -0
  243. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-out.csv +1857 -0
  244. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-in.csv +1217 -0
  245. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-out.csv +1857 -0
  246. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-in.csv +1217 -0
  247. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-out.csv +1793 -0
  248. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-in.csv +1217 -0
  249. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-out.csv +1793 -0
  250. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-burst-in.csv +2561 -0
  251. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-in.csv +961 -0
  252. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-out.csv +1539 -0
  253. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-in.csv +1921 -0
  254. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-out.csv +2499 -0
  255. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-in.csv +865 -0
  256. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-out.csv +1196 -0
  257. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-in.csv +1729 -0
  258. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-out.csv +3053 -0
  259. imap_processing/tests/mag/validation/L2/imap_mag_l1b_norm-mago_20251017_v002.cdf +0 -0
  260. imap_processing/tests/mag/validation/calibration/imap_mag_l1b-calibration_20240229_v001.cdf +0 -0
  261. imap_processing/tests/mag/validation/calibration/imap_mag_l2-calibration-matrices_20251017_v004.cdf +0 -0
  262. imap_processing/tests/mag/validation/calibration/imap_mag_l2-offsets-norm_20251017_20251017_v001.cdf +0 -0
  263. imap_processing/tests/spacecraft/data/SSR_2024_190_20_08_12_0483851794_2_DA_apid0594_1packet.pkts +0 -0
  264. imap_processing/tests/spacecraft/test_quaternions.py +71 -0
  265. imap_processing/tests/spice/test_data/fake_repoint_data.csv +5 -0
  266. imap_processing/tests/spice/test_data/fake_spin_data.csv +11 -11
  267. imap_processing/tests/spice/test_geometry.py +9 -12
  268. imap_processing/tests/spice/test_kernels.py +1 -200
  269. imap_processing/tests/spice/test_pointing_frame.py +185 -0
  270. imap_processing/tests/spice/test_repoint.py +121 -0
  271. imap_processing/tests/spice/test_spin.py +50 -9
  272. imap_processing/tests/spice/test_time.py +14 -0
  273. imap_processing/tests/swapi/lut/imap_swapi_esa-unit-conversion_20250211_v000.csv +73 -0
  274. imap_processing/tests/swapi/lut/imap_swapi_lut-notes_20250211_v000.csv +1025 -0
  275. imap_processing/tests/swapi/test_swapi_l1.py +13 -11
  276. imap_processing/tests/swapi/test_swapi_l2.py +180 -8
  277. imap_processing/tests/swe/l0_data/2024051010_SWE_HK_packet.bin +0 -0
  278. imap_processing/tests/swe/l0_data/2024051011_SWE_CEM_RAW_packet.bin +0 -0
  279. imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_APP_HK_20240510_092742.csv +49 -0
  280. imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_CEM_RAW_20240510_092742.csv +593 -0
  281. imap_processing/tests/swe/lut/checker-board-indices.csv +24 -0
  282. imap_processing/tests/swe/lut/imap_swe_esa-lut_20250301_v000.csv +385 -0
  283. imap_processing/tests/swe/lut/imap_swe_l1b-in-flight-cal_20240510_20260716_v000.csv +3 -0
  284. imap_processing/tests/swe/test_swe_l1a.py +20 -2
  285. imap_processing/tests/swe/test_swe_l1a_cem_raw.py +52 -0
  286. imap_processing/tests/swe/test_swe_l1a_hk.py +68 -0
  287. imap_processing/tests/swe/test_swe_l1a_science.py +3 -3
  288. imap_processing/tests/swe/test_swe_l1b.py +162 -24
  289. imap_processing/tests/swe/test_swe_l2.py +153 -91
  290. imap_processing/tests/test_cli.py +171 -88
  291. imap_processing/tests/test_utils.py +140 -17
  292. imap_processing/tests/ultra/data/l0/FM45_UltraFM45_Functional_2024-01-22T0105_20240122T010548.CCSDS +0 -0
  293. imap_processing/tests/ultra/data/l0/ultra45_raw_sc_ultraimgrates_20220530_00.csv +164 -0
  294. imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultrarawimg_withFSWcalcs_FM45_40P_Phi28p5_BeamCal_LinearScan_phi2850_theta-000_20240207T102740.csv +3243 -3243
  295. imap_processing/tests/ultra/data/mock_data.py +369 -0
  296. imap_processing/tests/ultra/unit/conftest.py +115 -89
  297. imap_processing/tests/ultra/unit/test_badtimes.py +4 -4
  298. imap_processing/tests/ultra/unit/test_cullingmask.py +8 -6
  299. imap_processing/tests/ultra/unit/test_de.py +14 -13
  300. imap_processing/tests/ultra/unit/test_decom_apid_880.py +27 -76
  301. imap_processing/tests/ultra/unit/test_decom_apid_881.py +54 -11
  302. imap_processing/tests/ultra/unit/test_decom_apid_883.py +12 -10
  303. imap_processing/tests/ultra/unit/test_decom_apid_896.py +202 -55
  304. imap_processing/tests/ultra/unit/test_lookup_utils.py +23 -1
  305. imap_processing/tests/ultra/unit/test_spacecraft_pset.py +77 -0
  306. imap_processing/tests/ultra/unit/test_ultra_l1a.py +98 -305
  307. imap_processing/tests/ultra/unit/test_ultra_l1b.py +60 -14
  308. imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +2 -2
  309. imap_processing/tests/ultra/unit/test_ultra_l1b_culling.py +26 -27
  310. imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +239 -70
  311. imap_processing/tests/ultra/unit/test_ultra_l1c.py +5 -5
  312. imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +114 -83
  313. imap_processing/tests/ultra/unit/test_ultra_l2.py +230 -0
  314. imap_processing/ultra/constants.py +1 -1
  315. imap_processing/ultra/l0/decom_tools.py +27 -39
  316. imap_processing/ultra/l0/decom_ultra.py +168 -204
  317. imap_processing/ultra/l0/ultra_utils.py +152 -136
  318. imap_processing/ultra/l1a/ultra_l1a.py +55 -271
  319. imap_processing/ultra/l1b/badtimes.py +1 -4
  320. imap_processing/ultra/l1b/cullingmask.py +2 -6
  321. imap_processing/ultra/l1b/de.py +116 -57
  322. imap_processing/ultra/l1b/extendedspin.py +20 -18
  323. imap_processing/ultra/l1b/lookup_utils.py +72 -9
  324. imap_processing/ultra/l1b/ultra_l1b.py +36 -16
  325. imap_processing/ultra/l1b/ultra_l1b_culling.py +66 -30
  326. imap_processing/ultra/l1b/ultra_l1b_extended.py +297 -94
  327. imap_processing/ultra/l1c/histogram.py +2 -6
  328. imap_processing/ultra/l1c/spacecraft_pset.py +84 -0
  329. imap_processing/ultra/l1c/ultra_l1c.py +8 -9
  330. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +206 -108
  331. imap_processing/ultra/l2/ultra_l2.py +299 -0
  332. imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_LeftSlit.csv +526 -0
  333. imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_RightSlit.csv +526 -0
  334. imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_LeftSlit.csv +526 -0
  335. imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_RightSlit.csv +526 -0
  336. imap_processing/ultra/lookup_tables/FM45_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -2
  337. imap_processing/ultra/lookup_tables/FM90_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -0
  338. imap_processing/ultra/packet_definitions/README.md +38 -0
  339. imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +15302 -482
  340. imap_processing/ultra/utils/ultra_l1_utils.py +31 -12
  341. imap_processing/utils.py +69 -29
  342. {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/METADATA +10 -6
  343. imap_processing-0.13.0.dist-info/RECORD +578 -0
  344. imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +0 -237
  345. imap_processing/hi/l1a/housekeeping.py +0 -27
  346. imap_processing/hi/l1b/hi_eng_unit_convert_table.csv +0 -154
  347. imap_processing/swe/l1b/swe_esa_lookup_table.csv +0 -1441
  348. imap_processing/swe/l1b/swe_l1b_science.py +0 -652
  349. imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-aggregated_20240429_v001.cdf +0 -0
  350. imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-singles_20240429_v001.cdf +0 -0
  351. imap_processing/tests/codice/data/imap_codice_l1a_hi-omni_20240429_v001.cdf +0 -0
  352. imap_processing/tests/codice/data/imap_codice_l1a_hi-sectored_20240429_v001.cdf +0 -0
  353. imap_processing/tests/codice/data/imap_codice_l1a_hskp_20100101_v001.cdf +0 -0
  354. imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-aggregated_20240429_v001.cdf +0 -0
  355. imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-singles_20240429_v001.cdf +0 -0
  356. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-angular_20240429_v001.cdf +0 -0
  357. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-priority_20240429_v001.cdf +0 -0
  358. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-species_20240429_v001.cdf +0 -0
  359. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-angular_20240429_v001.cdf +0 -0
  360. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-priority_20240429_v001.cdf +0 -0
  361. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-species_20240429_v001.cdf +0 -0
  362. imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-aggregated_20240429_v001.cdf +0 -0
  363. imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-singles_20240429_v001.cdf +0 -0
  364. imap_processing/tests/codice/data/imap_codice_l1b_hi-omni_20240429_v001.cdf +0 -0
  365. imap_processing/tests/codice/data/imap_codice_l1b_hi-sectored_20240429_v001.cdf +0 -0
  366. imap_processing/tests/codice/data/imap_codice_l1b_hskp_20100101_v001.cdf +0 -0
  367. imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-aggregated_20240429_v001.cdf +0 -0
  368. imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-singles_20240429_v001.cdf +0 -0
  369. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-angular_20240429_v001.cdf +0 -0
  370. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-priority_20240429_v001.cdf +0 -0
  371. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-species_20240429_v001.cdf +0 -0
  372. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-angular_20240429_v001.cdf +0 -0
  373. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-priority_20240429_v001.cdf +0 -0
  374. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-species_20240429_v001.cdf +0 -0
  375. imap_processing/tests/hi/data/l1/imap_hi_l1b_45sensor-de_20250415_v999.cdf +0 -0
  376. imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1251.pkts +0 -0
  377. imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1252.pkts +0 -0
  378. imap_processing/tests/hit/validation_data/hskp_sample_eu.csv +0 -89
  379. imap_processing/tests/hit/validation_data/sci_sample_raw1.csv +0 -29
  380. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231214_v001.pkts +0 -0
  381. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20100101_v001.cdf +0 -0
  382. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20100101_v001.cdf +0 -0
  383. imap_processing/tests/swe/test_swe_l1b_science.py +0 -84
  384. imap_processing/tests/ultra/test_data/mock_data.py +0 -161
  385. imap_processing/ultra/l1c/pset.py +0 -40
  386. imap_processing/ultra/lookup_tables/dps_sensitivity45.cdf +0 -0
  387. imap_processing-0.11.0.dist-info/RECORD +0 -488
  388. /imap_processing/idex/packet_definitions/{idex_packet_definition.xml → idex_science_packet_definition.xml} +0 -0
  389. /imap_processing/tests/ialirt/{test_data → data}/l0/20240827095047_SWE_IALIRT_packet.bin +0 -0
  390. /imap_processing/tests/ialirt/{test_data → data}/l0/BinLog CCSDS_FRAG_TLM_20240826_152323Z_IALIRT_data_for_SDC.bin +0 -0
  391. /imap_processing/tests/ialirt/{test_data → data}/l0/IALiRT Raw Packet Telemetry.txt +0 -0
  392. /imap_processing/tests/ialirt/{test_data → data}/l0/apid01152.tlm +0 -0
  393. /imap_processing/tests/ialirt/{test_data → data}/l0/eu_SWP_IAL_20240826_152033.csv +0 -0
  394. /imap_processing/tests/ialirt/{test_data → data}/l0/hi_fsw_view_1_ccsds.bin +0 -0
  395. /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.ccsds +0 -0
  396. /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.csv +0 -0
  397. /imap_processing/tests/ialirt/{test_data → data}/l0/idle_export_eu.SWE_IALIRT_20240827_093852.csv +0 -0
  398. /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_hi-ialirt_20240523200000_v0.0.0.cdf +0 -0
  399. /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
  400. /imap_processing/{mag/l1b → tests/spacecraft}/__init__.py +0 -0
  401. /imap_processing/{swe/l1b/engineering_unit_convert_table.csv → tests/swe/lut/imap_swe_eu-conversion_20240510_v000.csv} +0 -0
  402. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50_theta-0.00_20240207T102740.CCSDS +0 -0
  403. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_7P_Phi0.0_BeamCal_LinearScan_phi0.04_theta-0.01_20230821T121304.CCSDS +0 -0
  404. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.CCSDS +0 -0
  405. /imap_processing/tests/ultra/{test_data → data}/l0/Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.CCSDS +0 -0
  406. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_auxdata_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
  407. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_enaphxtofhangimg_FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.csv +0 -0
  408. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultraimgrates_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
  409. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultrarawimgevent_FM45_7P_Phi00_BeamCal_LinearScan_phi004_theta-001_20230821T121304.csv +0 -0
  410. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E1.cdf +0 -0
  411. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E12.cdf +0 -0
  412. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E24.cdf +0 -0
  413. {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/LICENSE +0 -0
  414. {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/WHEEL +0 -0
  415. {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,81 @@
1
+ """Tests grouping functions for I-ALiRT instruments."""
2
+
3
+ import numpy as np
4
+ import pytest
5
+ import xarray as xr
6
+
7
+ from imap_processing.ialirt.utils.grouping import filter_valid_groups, find_groups
8
+
9
+
10
+ @pytest.fixture
11
+ def test_data():
12
+ """Creates grouped data for filter_valid_groups test."""
13
+ epoch = np.arange(12)
14
+
15
+ # Example `src_seq_ctr` values for 3 groups:
16
+ # Group 0 - valid, all diffs = 1
17
+ # Group 1 - invalid, has a jump of 5
18
+ # Group 2 - valid, wraps at -16383
19
+ src_seq_ctr = np.concatenate(
20
+ [
21
+ np.arange(100, 104),
22
+ np.array([200, 205, 206, 207]),
23
+ np.array([16382, 16383, 0, 1]),
24
+ ],
25
+ dtype=np.int32,
26
+ )
27
+
28
+ test_data = xr.Dataset(
29
+ data_vars={
30
+ "src_seq_ctr": ("epoch", src_seq_ctr),
31
+ "sequence": ("epoch", np.tile(np.arange(4), 3)),
32
+ "time_seconds": ("epoch", np.arange(12)),
33
+ },
34
+ coords={
35
+ "epoch": epoch,
36
+ },
37
+ )
38
+
39
+ return test_data
40
+
41
+
42
+ @pytest.fixture
43
+ def grouped_data():
44
+ """Creates grouped data for filter_valid_groups test."""
45
+ epoch = np.arange(12)
46
+
47
+ # Example `src_seq_ctr` values for 3 groups:
48
+ # Group 0 - valid, all diffs = 1
49
+ # Group 1 - invalid, has a jump of 5
50
+ # Group 2 - valid, wraps at -16383
51
+ src_seq_ctr = np.concatenate(
52
+ [
53
+ np.arange(100, 104),
54
+ np.array([200, 205, 206, 207]),
55
+ np.array([16382, 16383, 0, 1]),
56
+ ],
57
+ dtype=np.int32,
58
+ )
59
+
60
+ group = np.tile(np.arange(3), 4).reshape(4, 3).T.ravel()
61
+
62
+ grouped_data = xr.Dataset(
63
+ data_vars={"src_seq_ctr": ("epoch", src_seq_ctr)},
64
+ coords={"epoch": epoch, "group": ("epoch", group)},
65
+ )
66
+
67
+ return grouped_data
68
+
69
+
70
+ def test_filter_valid_groups(grouped_data):
71
+ """Tests filter_valid_groups function."""
72
+ filtered_data = filter_valid_groups(grouped_data)
73
+
74
+ assert np.all(np.unique(filtered_data["group"]) == np.array([0, 2]))
75
+
76
+
77
+ def test_find_groups(test_data):
78
+ """Tests the find_groups function."""
79
+ grouped_data = find_groups(test_data, (0, 3), "sequence", "time_seconds")
80
+
81
+ assert np.all(np.unique(grouped_data["group"]) == np.array([1, 3]))
@@ -0,0 +1,223 @@
1
+ """Tests to support I-ALiRT MAG packet parsing."""
2
+
3
+ import numpy as np
4
+ import pandas as pd
5
+ import pytest
6
+ import xarray as xr
7
+
8
+ from imap_processing import imap_module_directory
9
+ from imap_processing.cdf.utils import load_cdf
10
+ from imap_processing.ialirt.l0.parse_mag import (
11
+ calculate_l1b,
12
+ extract_magnetic_vectors,
13
+ get_pkt_counter,
14
+ get_status_data,
15
+ get_time,
16
+ process_packet,
17
+ )
18
+ from imap_processing.mag.l1b.mag_l1b import (
19
+ retrieve_matrix_from_l1b_calibration,
20
+ )
21
+ from imap_processing.utils import packet_file_to_datasets
22
+
23
+
24
+ @pytest.fixture(scope="session")
25
+ def xtce_mag_path():
26
+ """Returns the xtce directory."""
27
+ return imap_module_directory / "ialirt" / "packet_definitions" / "ialirt_mag.xml"
28
+
29
+
30
+ @pytest.fixture(scope="session")
31
+ def binary_packet_path():
32
+ """Returns the paths to the binary packets."""
33
+ directory = imap_module_directory / "tests" / "ialirt" / "data" / "l0"
34
+ filenames = [
35
+ "461971383-404.bin",
36
+ "461971384-405.bin",
37
+ "461971385-406.bin",
38
+ "461971386-407.bin",
39
+ "461971387-408.bin",
40
+ "461971388-409.bin",
41
+ "461971389-410.bin",
42
+ "461971390-411.bin",
43
+ "461971391-412.bin",
44
+ ]
45
+ return tuple(directory / fname for fname in filenames)
46
+
47
+
48
+ @pytest.fixture(scope="session")
49
+ def mag_test_data():
50
+ """Returns the test data directory."""
51
+ data_path = (
52
+ imap_module_directory
53
+ / "tests"
54
+ / "ialirt"
55
+ / "data"
56
+ / "l0"
57
+ / "sample_decoded_i-alirt_data.csv"
58
+ )
59
+ data = pd.read_csv(data_path)
60
+
61
+ return data
62
+
63
+
64
+ @pytest.fixture
65
+ def xarray_data(binary_packet_path, xtce_mag_path):
66
+ """Create xarray data for multiple packets."""
67
+ apid = 1001
68
+
69
+ xarray_data = tuple(
70
+ packet_file_to_datasets(packet, xtce_mag_path, use_derived_value=False)[apid]
71
+ for packet in binary_packet_path
72
+ )
73
+
74
+ merged_xarray_data = xr.concat(xarray_data, dim="epoch")
75
+ return merged_xarray_data
76
+
77
+
78
+ @pytest.fixture
79
+ def grouped_data():
80
+ """Creates grouped data for tests."""
81
+ epoch = np.arange(12)
82
+
83
+ # Example `src_seq_ctr` values for 3 groups:
84
+ # Group 0 - valid, all diffs = 1
85
+ # Group 1 - invalid, has a jump of 5
86
+ # Group 2 - valid, wraps at -16383
87
+ src_seq_ctr = np.concatenate(
88
+ [
89
+ np.arange(100, 104),
90
+ np.array([200, 205, 206, 207]),
91
+ np.array([16382, 16383, 0, 1]),
92
+ ],
93
+ dtype=np.int32,
94
+ )
95
+ mag_acq_tm_coarse = np.repeat(
96
+ np.array([461971382, 461971386, 461971390], dtype=np.uint32), repeats=4
97
+ )
98
+
99
+ mag_acq_tm_fine = np.array(
100
+ [1502, 1502, 1505, 1505, 1500, 1500, 1503, 1503, 1497, 1497, 1491, 1491]
101
+ )
102
+
103
+ group = np.tile(np.arange(3), 4).reshape(4, 3).T.ravel()
104
+
105
+ grouped_data = xr.Dataset(
106
+ data_vars={
107
+ "src_seq_ctr": ("epoch", src_seq_ctr),
108
+ "mag_acq_tm_coarse": ("epoch", mag_acq_tm_coarse),
109
+ "mag_acq_tm_fine": ("epoch", mag_acq_tm_fine),
110
+ },
111
+ coords={"epoch": epoch, "group": ("epoch", group)},
112
+ )
113
+
114
+ return grouped_data
115
+
116
+
117
+ @pytest.fixture
118
+ def calibration_dataset():
119
+ """Returns the calibration data."""
120
+ calibration_dataset = load_cdf(
121
+ imap_module_directory / "mag" / "l1b" / "imap_calibration_mag_20240229_v01.cdf"
122
+ )
123
+ return calibration_dataset
124
+
125
+
126
+ def test_get_pkt_counter(xarray_data):
127
+ """Tests the get_pkt_counter function."""
128
+ status_values = xarray_data["mag_status"].values
129
+ pkt_counter = get_pkt_counter(status_values)
130
+ assert np.array_equal(pkt_counter, np.array([0, 1, 2, 3, 0, 1, 2, 3, 0]))
131
+
132
+
133
+ def test_get_status_data(xarray_data, mag_test_data):
134
+ """Tests the get_status_data function."""
135
+
136
+ status_data = get_status_data(
137
+ xarray_data["mag_status"].values[0:4], np.array([0, 1, 2, 3])
138
+ )
139
+ index = mag_test_data["PRI_COARSETM"] == 461971382
140
+ matching_row = mag_test_data[index]
141
+
142
+ for key in status_data.keys():
143
+ assert status_data[key] == matching_row[key.upper()].values[0]
144
+
145
+
146
+ def test_get_time(grouped_data, calibration_dataset):
147
+ """Tests the get_time function."""
148
+
149
+ calibration_matrix_mago, time_shift_mago = retrieve_matrix_from_l1b_calibration(
150
+ calibration_dataset, is_mago=True
151
+ )
152
+ calibration_matrix_magi, time_shift_magi = retrieve_matrix_from_l1b_calibration(
153
+ calibration_dataset, is_mago=False
154
+ )
155
+
156
+ time_data = get_time(
157
+ grouped_data, 1, np.array([0, 1, 2, 3]), time_shift_mago, time_shift_magi
158
+ )
159
+
160
+ assert time_data["pri_coarsetm"] == 461971386
161
+ assert time_data["pri_fintm"] == 1500
162
+ assert time_data["sec_coarsetm"] == 461971386
163
+ assert time_data["sec_fintm"] == 1503
164
+
165
+
166
+ def test_extract_magnetic_vectors():
167
+ """Tests the extract_magnetic_vectors function."""
168
+ science_values = xr.DataArray(
169
+ data=np.array([15797207, 5750698, 15921110, 2342918], dtype=np.uint32)
170
+ )
171
+
172
+ vectors = extract_magnetic_vectors(science_values)
173
+
174
+ assert vectors == {
175
+ "pri_x": 61707,
176
+ "pri_y": 55127,
177
+ "pri_z": 49066,
178
+ "sec_x": 62191,
179
+ "sec_y": 54819,
180
+ "sec_z": 49158,
181
+ }
182
+
183
+
184
+ def test_calculate_l1b(grouped_data, xarray_data, calibration_dataset):
185
+ """Tests the calculate_l1b function."""
186
+
187
+ pkt_counter = np.array([0.0, 1.0, 2.0, 3.0])
188
+
189
+ science_data = {
190
+ "pri_x": 1.0,
191
+ "pri_y": 2.0,
192
+ "pri_z": 3.0,
193
+ "sec_x": 4.0,
194
+ "sec_y": 5.0,
195
+ "sec_z": 6.0,
196
+ }
197
+
198
+ status_data = {
199
+ "fob_range": 1,
200
+ "fib_range": 1,
201
+ }
202
+
203
+ vec_mago, vec_magi, time_data = calculate_l1b(
204
+ grouped_data, 0, pkt_counter, science_data, status_data, calibration_dataset
205
+ )
206
+
207
+ assert vec_mago.shape == (4,)
208
+ assert vec_magi.shape == (4,)
209
+ assert "primary_epoch" in time_data
210
+ assert "secondary_epoch" in time_data
211
+
212
+
213
+ def test_process_packet(xarray_data, mag_test_data, calibration_dataset):
214
+ """Tests the parse_packet function."""
215
+ parsed_packets = process_packet(xarray_data, calibration_dataset)
216
+
217
+ for packet in parsed_packets:
218
+ index = packet["pri_coarsetm"] == mag_test_data["PRI_COARSETM"]
219
+ matching_rows = mag_test_data[index]
220
+
221
+ for key in packet.keys():
222
+ if key.upper() in matching_rows.keys():
223
+ assert packet[key] == matching_rows[key.upper()].values[0]
@@ -26,7 +26,7 @@ def binary_packet_path():
26
26
  imap_module_directory
27
27
  / "tests"
28
28
  / "ialirt"
29
- / "test_data"
29
+ / "data"
30
30
  / "l0"
31
31
  / "hi_fsw_view_1_ccsds.bin"
32
32
  )
@@ -39,7 +39,7 @@ def codicehi_validation_data():
39
39
  imap_module_directory
40
40
  / "tests"
41
41
  / "ialirt"
42
- / "test_data"
42
+ / "data"
43
43
  / "l0"
44
44
  / "imap_codice_l1a_hi-ialirt_20240523200000_v0.0.0.cdf"
45
45
  )
@@ -48,7 +48,7 @@ def codicehi_validation_data():
48
48
  return data
49
49
 
50
50
 
51
- @pytest.fixture()
51
+ @pytest.fixture
52
52
  def codicehi_test_data(binary_packet_path, xtce_codicehi_path):
53
53
  """Create xarray data"""
54
54
  apid = 1168
@@ -22,14 +22,7 @@ def xtce_codicelo_path():
22
22
  @pytest.fixture(scope="session")
23
23
  def binary_packet_path():
24
24
  """Returns the xtce directory."""
25
- return (
26
- imap_module_directory
27
- / "tests"
28
- / "ialirt"
29
- / "test_data"
30
- / "l0"
31
- / "apid01152.tlm"
32
- )
25
+ return imap_module_directory / "tests" / "ialirt" / "data" / "l0" / "apid01152.tlm"
33
26
 
34
27
 
35
28
  @pytest.fixture(scope="session")
@@ -39,7 +32,7 @@ def codicelo_validation_data():
39
32
  imap_module_directory
40
33
  / "tests"
41
34
  / "ialirt"
42
- / "test_data"
35
+ / "data"
43
36
  / "l0"
44
37
  / "imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf"
45
38
  )
@@ -48,7 +41,7 @@ def codicelo_validation_data():
48
41
  return data
49
42
 
50
43
 
51
- @pytest.fixture()
44
+ @pytest.fixture
52
45
  def codicelo_test_data(binary_packet_path, xtce_codicelo_path):
53
46
  """Create xarray data"""
54
47
  apid = 1152
@@ -7,7 +7,7 @@ from imap_processing.ialirt import process_ephemeris
7
7
  from imap_processing.spice.time import str_to_et
8
8
 
9
9
 
10
- @pytest.mark.external_kernel()
10
+ @pytest.mark.external_kernel
11
11
  def test_calculate_doppler(furnish_kernels):
12
12
  """
13
13
  Test the calculate_doppler() function.
@@ -43,7 +43,7 @@ def test_calculate_doppler(furnish_kernels):
43
43
  assert doppler_result is not None
44
44
 
45
45
 
46
- @pytest.mark.external_kernel()
46
+ @pytest.mark.external_kernel
47
47
  def test_latitude_longitude_to_ecef(furnish_kernels):
48
48
  """
49
49
  Test the latitude_longitude_to_ecef() function.
@@ -63,7 +63,7 @@ def test_latitude_longitude_to_ecef(furnish_kernels):
63
63
  )
64
64
 
65
65
 
66
- @pytest.mark.external_kernel()
66
+ @pytest.mark.external_kernel
67
67
  def test_calculate_azimuth_and_elevation(furnish_kernels):
68
68
  """
69
69
  Test the calculate_azimuth_and_elevation() function.
@@ -101,7 +101,7 @@ def test_calculate_azimuth_and_elevation(furnish_kernels):
101
101
  assert len(azimuth_result) == len(observation_time)
102
102
 
103
103
 
104
- @pytest.mark.external_kernel()
104
+ @pytest.mark.external_kernel
105
105
  def test_build_output(furnish_kernels):
106
106
  """
107
107
  Test the build_output() function.
@@ -25,7 +25,7 @@ def binary_packet_path():
25
25
  imap_module_directory
26
26
  / "tests"
27
27
  / "ialirt"
28
- / "test_data"
28
+ / "data"
29
29
  / "l0"
30
30
  / "hit_ialirt_sample.ccsds"
31
31
  )
@@ -38,7 +38,7 @@ def hit_test_data():
38
38
  imap_module_directory
39
39
  / "tests"
40
40
  / "ialirt"
41
- / "test_data"
41
+ / "data"
42
42
  / "l0"
43
43
  / "hit_ialirt_sample.csv"
44
44
  )
@@ -47,7 +47,7 @@ def hit_test_data():
47
47
  return data
48
48
 
49
49
 
50
- @pytest.fixture()
50
+ @pytest.fixture
51
51
  def xarray_data(binary_packet_path, xtce_hit_path):
52
52
  """Create xarray data"""
53
53
  apid = 1253
@@ -3,6 +3,7 @@ import pandas as pd
3
3
  import pytest
4
4
 
5
5
  from imap_processing import imap_module_directory
6
+ from imap_processing.ialirt.l0.process_swapi import process_swapi_ialirt
6
7
  from imap_processing.utils import packet_file_to_datasets
7
8
 
8
9
 
@@ -14,12 +15,12 @@ def xtce_swapi_path():
14
15
 
15
16
  @pytest.fixture(scope="session")
16
17
  def binary_packet_path():
17
- """Returns the xtce directory."""
18
+ """Returns the binary packet path."""
18
19
  return (
19
20
  imap_module_directory
20
21
  / "tests"
21
22
  / "ialirt"
22
- / "test_data"
23
+ / "data"
23
24
  / "l0"
24
25
  / "BinLog CCSDS_FRAG_TLM_20240826_152323Z_IALIRT_data_for_SDC.bin"
25
26
  )
@@ -27,12 +28,12 @@ def binary_packet_path():
27
28
 
28
29
  @pytest.fixture(scope="session")
29
30
  def swapi_test_data():
30
- """Returns the test data directory."""
31
+ """Returns the l0 validation dataframe."""
31
32
  data_path = (
32
33
  imap_module_directory
33
34
  / "tests"
34
35
  / "ialirt"
35
- / "test_data"
36
+ / "data"
36
37
  / "l0"
37
38
  / "eu_SWP_IAL_20240826_152033.csv"
38
39
  )
@@ -41,34 +42,34 @@ def swapi_test_data():
41
42
  return data
42
43
 
43
44
 
44
- @pytest.fixture()
45
+ @pytest.fixture
45
46
  def xarray_data(binary_packet_path, xtce_swapi_path):
46
- """Create xarray data"""
47
- apid = 1187
47
+ """Create SWAPI xarray dataset for testing."""
48
48
 
49
49
  xarray_data = packet_file_to_datasets(
50
50
  binary_packet_path, xtce_swapi_path, use_derived_value=True
51
- )[apid]
51
+ )[1187]
52
52
  return xarray_data
53
53
 
54
54
 
55
55
  def test_decom_packets(xarray_data, swapi_test_data):
56
- """This function checks that all instrument parameters are accounted for."""
56
+ """Check that all instrument parameters are accounted for after decom."""
57
57
 
58
58
  # TODO: confirm w/ SWAPI team validity_enum flag can be
59
59
  # consistent with other instruments.
60
60
  fields_to_test = {
61
61
  "swapi_flag": "I_ALIRT_STATUS",
62
62
  "swapi_reserved": "INST_RES_ST",
63
- "swapi_seq": "SEQ_NUMBER",
63
+ "swapi_seq_number": "SEQ_NUMBER",
64
64
  "swapi_version": "SWEEP_TABLE",
65
- "swapi_coin_1": "COIN_CNT0",
66
- "swapi_coin_2": "COIN_CNT1",
67
- "swapi_coin_3": "COIN_CNT2",
68
- "swapi_coin_4": "COIN_CNT3",
69
- "swapi_coin_5": "COIN_CNT4",
70
- "swapi_coin_6": "COIN_CNT5",
65
+ "swapi_coin_cnt0": "COIN_CNT0",
66
+ "swapi_coin_cnt1": "COIN_CNT1",
67
+ "swapi_coin_cnt2": "COIN_CNT2",
68
+ "swapi_coin_cnt3": "COIN_CNT3",
69
+ "swapi_coin_cnt4": "COIN_CNT4",
70
+ "swapi_coin_cnt5": "COIN_CNT5",
71
71
  "swapi_spare": "SPARE",
72
+ "swapi_shcoarse": "SHCOARSE",
72
73
  }
73
74
  _, index, test_index = np.intersect1d(
74
75
  xarray_data["swapi_acq"], swapi_test_data["ACQ_TIME"], return_indices=True
@@ -83,3 +84,10 @@ def test_decom_packets(xarray_data, swapi_test_data):
83
84
  f"Mismatch found in {xarray_field}: "
84
85
  f"actual {actual_values}, expected {expected_values}"
85
86
  )
87
+
88
+
89
+ def test_process_swapi_ialirt(xarray_data):
90
+ """Placeholder test for the process_swapi_ialirt function."""
91
+
92
+ swapi_result = process_swapi_ialirt(xarray_data)
93
+ assert swapi_result["met"] is not None