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
@@ -6,38 +6,38 @@ import xarray as xr
6
6
  from imap_processing import imap_module_directory
7
7
 
8
8
 
9
- def test_idex_decom_length(decom_test_data: xr.Dataset):
9
+ def test_idex_decom_length(decom_test_data_sci: xr.Dataset):
10
10
  """Verify that the output data has the expected number of data variables.
11
11
 
12
12
  Parameters
13
13
  ----------
14
- decom_test_data : xarray.Dataset
14
+ decom_test_data_sci : xarray.Dataset
15
15
  The dataset to test with
16
16
  """
17
- assert len(decom_test_data) == 110
17
+ assert len(decom_test_data_sci) == 110
18
18
 
19
19
 
20
- def test_idex_decom_event_num(decom_test_data: xr.Dataset):
20
+ def test_idex_decom_event_num(decom_test_data_sci: xr.Dataset):
21
21
  """Verify that 14 impacts were gathered by the test data.
22
22
 
23
23
  Parameters
24
24
  ----------
25
- decom_test_data : xarray.Dataset
25
+ decom_test_data_sci : xarray.Dataset
26
26
  The dataset to test with
27
27
  """
28
- for var in decom_test_data:
29
- if "epoch" in decom_test_data[var].dims:
30
- assert len(decom_test_data[var]) == 14
28
+ for var in decom_test_data_sci:
29
+ if "epoch" in decom_test_data_sci[var].dims:
30
+ assert len(decom_test_data_sci[var]) == 14
31
31
 
32
32
 
33
- def test_idex_tof_high_data(decom_test_data: xr.Dataset):
33
+ def test_idex_tof_high_data(decom_test_data_sci: xr.Dataset):
34
34
  """Verify that a sample of the data is correct.
35
35
 
36
36
  ``impact_14_tof_high_data.txt`` has been verified correct by the IDEX team
37
37
 
38
38
  Parameters
39
39
  ----------
40
- decom_test_data : xarray.Dataset
40
+ decom_test_data_sci : xarray.Dataset
41
41
  The dataset to test with
42
42
  """
43
43
 
@@ -45,4 +45,26 @@ def test_idex_tof_high_data(decom_test_data: xr.Dataset):
45
45
  f"{imap_module_directory}/tests/idex/test_data/impact_14_tof_high_data.txt"
46
46
  ) as f:
47
47
  data = np.array([int(line.rstrip("\n")) for line in f])
48
- assert (decom_test_data["TOF_High"][13].data == data).all()
48
+ assert (decom_test_data_sci["TOF_High"][13].data == data).all()
49
+
50
+
51
+ def test_catlst_event_num(decom_test_data_catlst: xr.Dataset):
52
+ """Verify that a sample of the data is correct.
53
+
54
+ Parameters
55
+ ----------
56
+ decom_test_data_catlst : xarray.Dataset
57
+ The dataset to test with
58
+ """
59
+ assert len(decom_test_data_catlst["epoch"]) == 1
60
+
61
+
62
+ def test_evt_event_num(decom_test_data_evt: xr.Dataset):
63
+ """Verify that a sample of the data is correct.
64
+
65
+ Parameters
66
+ ----------
67
+ decom_test_data_evt : xarray.Dataset
68
+ The dataset to test with
69
+ """
70
+ assert len(decom_test_data_evt["epoch"]) == 28
@@ -14,45 +14,44 @@ from imap_processing.idex.decode import _decode_sub_frame, read_bits, rice_decod
14
14
  from imap_processing.idex.idex_l1a import PacketParser
15
15
 
16
16
 
17
- def test_idex_cdf_file(decom_test_data: xr.Dataset):
17
+ def test_idex_cdf_file(decom_test_data_sci: xr.Dataset):
18
18
  """Verify the CDF file can be created with no errors.
19
19
 
20
20
  Parameters
21
21
  ----------
22
- decom_test_data : xarray.Dataset
22
+ decom_test_data_sci : xarray.Dataset
23
23
  The dataset to test with
24
24
  """
25
-
26
- file_name = write_cdf(decom_test_data)
25
+ file_name = write_cdf(decom_test_data_sci)
27
26
 
28
27
  assert file_name.exists()
29
- assert file_name.name == "imap_idex_l1a_sci_20231214_v001.cdf"
28
+ assert file_name.name == "imap_idex_l1a_sci-1week_20231218_v999.cdf"
30
29
 
31
30
 
32
- def test_bad_cdf_attributes(decom_test_data: xr.Dataset):
31
+ def test_bad_cdf_attributes(decom_test_data_sci: xr.Dataset):
33
32
  """Ensure an ``ISTPError`` is raised when using bad CDF attributes.
34
33
 
35
34
  Parameters
36
35
  ----------
37
- decom_test_data : xarray.Dataset
36
+ decom_test_data_sci : xarray.Dataset
38
37
  The dataset to test with
39
38
  """
40
- tof_catdesc = decom_test_data["TOF_High"].attrs["CATDESC"]
41
- del decom_test_data["TOF_High"].attrs["CATDESC"]
39
+ tof_catdesc = decom_test_data_sci["TOF_High"].attrs["CATDESC"]
40
+ del decom_test_data_sci["TOF_High"].attrs["CATDESC"]
42
41
 
43
42
  with pytest.raises(ISTPError):
44
- write_cdf(decom_test_data)
43
+ write_cdf(decom_test_data_sci, istp=True, terminate_on_warning=True)
45
44
 
46
45
  # Add attributes back so future tests do not fail
47
- decom_test_data["TOF_High"].attrs["CATDESC"] = tof_catdesc
46
+ decom_test_data_sci["TOF_High"].attrs["CATDESC"] = tof_catdesc
48
47
 
49
48
 
50
- def test_bad_cdf_file_data(decom_test_data: xr.Dataset):
49
+ def test_bad_cdf_file_data(decom_test_data_sci: xr.Dataset):
51
50
  """Ensure an ``ISTPError`` is raised when using bad data.
52
51
 
53
52
  Parameters
54
53
  ----------
55
- decom_test_data : xarray.Dataset
54
+ decom_test_data_sci : xarray.Dataset
56
55
  The dataset to test with
57
56
  """
58
57
  bad_data_attrs = {
@@ -76,22 +75,22 @@ def test_bad_cdf_file_data(decom_test_data: xr.Dataset):
76
75
  dims=("bad_data"),
77
76
  attrs=bad_data_attrs,
78
77
  )
79
- decom_test_data["Bad_data"] = bad_data_xr
78
+ decom_test_data_sci["Bad_data"] = bad_data_xr
80
79
 
81
80
  with pytest.raises(ISTPError):
82
- write_cdf(decom_test_data)
81
+ write_cdf(decom_test_data_sci, istp=True, terminate_on_warning=True)
83
82
 
84
- del decom_test_data["Bad_data"]
83
+ del decom_test_data_sci["Bad_data"]
85
84
 
86
85
 
87
- def test_idex_tof_high_data_from_cdf(decom_test_data: xr.Dataset):
86
+ def test_idex_tof_high_data_from_cdf(decom_test_data_sci: xr.Dataset):
88
87
  """Verify that a sample of the data is correct inside the CDF file.
89
88
 
90
89
  ``impact_14_tof_high_data.txt`` has been verified correct by the IDEX team
91
90
 
92
91
  Parameters
93
92
  ----------
94
- decom_test_data : xarray.Dataset
93
+ decom_test_data_sci : xarray.Dataset
95
94
  The dataset to test with
96
95
  """
97
96
  with open(
@@ -99,11 +98,57 @@ def test_idex_tof_high_data_from_cdf(decom_test_data: xr.Dataset):
99
98
  ) as f:
100
99
  data = np.array([int(line.rstrip()) for line in f])
101
100
 
102
- file_name = write_cdf(decom_test_data)
101
+ file_name = write_cdf(decom_test_data_sci)
103
102
  l1_data = load_cdf(file_name)
104
103
  assert (l1_data["TOF_High"][13].data == data).all()
105
104
 
106
105
 
106
+ @pytest.mark.external_test_data
107
+ def test_validate_l1a_idex_data_variables(
108
+ decom_test_data_sci: xr.Dataset, l1a_example_data: xr.Dataset
109
+ ):
110
+ """
111
+ Verify that each of the 6 waveform and telemetry arrays are equal to the
112
+ corresponding array produced by the IDEX team using the same l0 file.
113
+
114
+
115
+ Parameters
116
+ ----------
117
+ decom_test_data_sci : xarray.Dataset
118
+ The dataset to test with
119
+ l1a_example_data: xarray.Dataset
120
+ A dataset containing the 6 waveform and telemetry arrays
121
+ """
122
+ # Lookup table to match the SDS array names to the Idex Team array names
123
+ match_variables = {
124
+ "TOF L": "TOF_Low",
125
+ "TOF H": "TOF_High",
126
+ "TOF M": "TOF_Mid",
127
+ "Target H": "Target_High",
128
+ "Target L": "Target_Low",
129
+ "Ion Grid": "Ion_Grid",
130
+ "Time (high sampling)": "time_high_sample_rate",
131
+ "Time (low sampling)": "time_low_sample_rate",
132
+ }
133
+ # The Engineering data is converting to UTC, and the SDC is converting to J2000,
134
+ # for 'epoch' and 'Timestamp' so this test is using the raw time value 'SCHOARSE' to
135
+ # validate time
136
+ arrays_to_skip = ["Timestamp", "Epoch", "event"]
137
+
138
+ # loop through all keys from the l1a example dict
139
+ for var in l1a_example_data.variables:
140
+ if var not in arrays_to_skip:
141
+ # Find the corresponding array name
142
+ cdf_var = match_variables.get(var, var.lower())
143
+
144
+ np.testing.assert_array_equal(
145
+ decom_test_data_sci[cdf_var],
146
+ l1a_example_data[var],
147
+ f"The array '{cdf_var}' does not equal the expected example "
148
+ f"array '{var}' produced by the IDEX team",
149
+ )
150
+
151
+
107
152
  def test_compressed_packet():
108
153
  """
109
154
  Test compressed data decompression against known non-compressed data.
@@ -113,8 +158,8 @@ def test_compressed_packet():
113
158
  compressed = Path(f"{test_data_dir}/compressed_2023_102_14_24_55.pkts")
114
159
  non_compressed = Path(f"{test_data_dir}/non_compressed_2023_102_14_22_26.pkts")
115
160
 
116
- decompressed = PacketParser(compressed, "001").data
117
- expected = PacketParser(non_compressed, "001").data
161
+ decompressed = PacketParser(compressed).data[0]
162
+ expected = PacketParser(non_compressed).data[0]
118
163
 
119
164
  waveforms = [
120
165
  "TOF_High",
@@ -245,3 +290,29 @@ def test_decode_sub_frame_psel_3():
245
290
  bstring = warmup1 + warmup2 + residual_1 + residual_2 + residual_3
246
291
  ints, bp = _decode_sub_frame(bstring, bp=0, psel=psel, k=k, n_bits=10)
247
292
  assert ints == [1, 2, 4, 1, 5]
293
+
294
+
295
+ def test_cdf_creation_catlst(decom_test_data_catlst: xr.Dataset):
296
+ """Verify that a sample of the data can be written to a cdf without errors.
297
+
298
+ Parameters
299
+ ----------
300
+ decom_test_data_catlst : xarray.Dataset
301
+ The dataset to test with
302
+ """
303
+ filename = write_cdf(decom_test_data_catlst)
304
+
305
+ assert filename.name == "imap_idex_l1a_catlst_20241206_v999.cdf"
306
+
307
+
308
+ def test_cdf_creation_evt(decom_test_data_evt: xr.Dataset):
309
+ """Verify that a sample of the data can be written to a cdf without errors.
310
+
311
+ Parameters
312
+ ----------
313
+ decom_test_data_evt : xarray.Dataset
314
+ The dataset to test with
315
+ """
316
+ filename = write_cdf(decom_test_data_evt)
317
+
318
+ assert filename.name == "imap_idex_l1a_evt_20250108_v999.cdf"
@@ -20,9 +20,9 @@ from imap_processing.tests.idex import conftest
20
20
  from imap_processing.tests.idex.conftest import get_spice_data_side_effect_func
21
21
 
22
22
 
23
- @pytest.fixture(scope="module")
23
+ @pytest.fixture
24
24
  @mock.patch("imap_processing.idex.idex_l1b.get_spice_data")
25
- def l1b_dataset(mock_get_spice_data, decom_test_data: xr.Dataset) -> xr.Dataset:
25
+ def l1b_dataset(mock_get_spice_data, decom_test_data_sci: xr.Dataset) -> xr.Dataset:
26
26
  """Return a ``xarray`` dataset containing test data.
27
27
 
28
28
  Returns
@@ -32,12 +32,11 @@ def l1b_dataset(mock_get_spice_data, decom_test_data: xr.Dataset) -> xr.Dataset:
32
32
  """
33
33
 
34
34
  mock_get_spice_data.side_effect = get_spice_data_side_effect_func
35
-
36
- dataset = idex_l1b(decom_test_data, data_version="001")
35
+ dataset = idex_l1b(decom_test_data_sci)
37
36
  return dataset
38
37
 
39
38
 
40
- @pytest.fixture()
39
+ @pytest.fixture
41
40
  def mock_spice_functions():
42
41
  """Mock spice functions to avoid loading kernels."""
43
42
  with (
@@ -56,7 +55,7 @@ def mock_spice_functions():
56
55
  yield mock_state, mock_pointing, mock_lon
57
56
 
58
57
 
59
- def test_l1b_cdf_filenames(l1b_dataset: xr.Dataset):
58
+ def test_l1b_logical_source(l1b_dataset: xr.Dataset):
60
59
  """Tests that the ``idex_l1b`` function generates datasets
61
60
  with the expected logical source.
62
61
 
@@ -65,7 +64,7 @@ def test_l1b_cdf_filenames(l1b_dataset: xr.Dataset):
65
64
  l1b_dataset : xr.Dataset
66
65
  A ``xarray`` dataset containing the test data
67
66
  """
68
- expected_src = "imap_idex_l1b_sci"
67
+ expected_src = "imap_idex_l1b_sci-1week"
69
68
  assert l1b_dataset.attrs["Logical_source"] == expected_src
70
69
 
71
70
 
@@ -81,7 +80,7 @@ def test_idex_cdf_file(l1b_dataset: xr.Dataset):
81
80
  file_name = write_cdf(l1b_dataset)
82
81
 
83
82
  assert file_name.exists()
84
- assert file_name.name == "imap_idex_l1b_sci_20231214_v001.cdf"
83
+ assert file_name.name == "imap_idex_l1b_sci-1week_20231218_v999.cdf"
85
84
 
86
85
 
87
86
  def test_idex_waveform_units(l1b_dataset: xr.Dataset):
@@ -100,7 +99,7 @@ def test_idex_waveform_units(l1b_dataset: xr.Dataset):
100
99
  # Check instrument setting units
101
100
  for _, row in cdf_var_defs.iterrows():
102
101
  var_name = row["mnemonic"]
103
- assert l1b_dataset[var_name].attrs["units"] == row["unit"]
102
+ assert l1b_dataset[var_name].attrs["UNITS"] == row["unit"]
104
103
 
105
104
  # Check waveform units
106
105
  waveform_var_names = [
@@ -156,27 +155,27 @@ def test_unpack_instrument_settings():
156
155
  assert np.all(unpacked_dict["test_var1"] == 4)
157
156
 
158
157
 
159
- def test_get_trigger_settings_success(decom_test_data):
158
+ def test_get_trigger_settings_success(decom_test_data_sci):
160
159
  """
161
160
  Check that the output to 'get_trigger_mode_and_level' matches expected arrays.
162
161
 
163
162
  Parameters
164
163
  ----------
165
- decom_test_data : xarray.Dataset
164
+ decom_test_data_sci : xarray.Dataset
166
165
  L1a dataset
167
166
  """
168
167
  # Change the trigger mode and level for the first event to check that output is
169
168
  # correct when the modes and levels vary from event to event
170
- decom_test_data["idx__txhdrmgtrigmode"][0] = 1
171
- decom_test_data["idx__txhdrhgtrigmode"][0] = 0
169
+ decom_test_data_sci["idx__txhdrmgtrigmode"][0] = 1
170
+ decom_test_data_sci["idx__txhdrhgtrigmode"][0] = 0
172
171
 
173
- n_epochs = len(decom_test_data["epoch"])
174
- trigger_settings = get_trigger_mode_and_level(decom_test_data)
172
+ n_epochs = len(decom_test_data_sci["epoch"])
173
+ trigger_settings = get_trigger_mode_and_level(decom_test_data_sci)
175
174
 
176
175
  expected_modes = np.full(n_epochs, "HGThreshold")
177
176
  expected_modes[0] = "MGThreshold"
178
177
  expected_levels = np.full(n_epochs, 0.16762)
179
- expected_levels[0] = 1023.0
178
+ expected_levels[0] = 1023.0 * 1.13e-2
180
179
 
181
180
  assert (trigger_settings["triggermode"].data == expected_modes).all(), (
182
181
  f"The dict entry 'triggermode' values did not match the expected values: "
@@ -185,22 +184,22 @@ def test_get_trigger_settings_success(decom_test_data):
185
184
 
186
185
  assert (trigger_settings["triggerlevel"].data == expected_levels).all(), (
187
186
  f"The dict entry 'triggerlevel' values did not match the expected values: "
188
- f"{expected_levels}. Found: {trigger_settings['triggerlevels'].data}"
187
+ f"{expected_levels}. Found: {trigger_settings['triggerlevel'].data}"
189
188
  )
190
189
 
191
190
 
192
- def test_get_trigger_settings_failure(decom_test_data):
191
+ def test_get_trigger_settings_failure(decom_test_data_sci):
193
192
  """
194
193
  Check that an error is thrown when there are more than one valid trigger for an
195
194
  event
196
195
 
197
196
  Parameters
198
197
  ----------
199
- decom_test_data : xarray.Dataset
198
+ decom_test_data_sci : xarray.Dataset
200
199
  L1a dataset
201
200
  """
202
- decom_test_data["idx__txhdrhgtrigmode"][0] = 1
203
- decom_test_data["idx__txhdrmgtrigmode"][0] = 2
201
+ decom_test_data_sci["idx__txhdrhgtrigmode"][0] = 1
202
+ decom_test_data_sci["idx__txhdrmgtrigmode"][0] = 2
204
203
 
205
204
  error_ms = (
206
205
  "Only one channel can trigger a dust event. Please make sure there is "
@@ -210,14 +209,14 @@ def test_get_trigger_settings_failure(decom_test_data):
210
209
  )
211
210
 
212
211
  with pytest.raises(ValueError, match=error_ms):
213
- get_trigger_mode_and_level(decom_test_data)
212
+ get_trigger_mode_and_level(decom_test_data_sci)
214
213
 
215
214
 
216
215
  @pytest.mark.usefixtures("use_fake_spin_data_for_time")
217
216
  def test_get_spice_data(
218
217
  mock_spice_functions,
219
218
  use_fake_spin_data_for_time,
220
- decom_test_data,
219
+ decom_test_data_sci,
221
220
  furnish_kernels,
222
221
  ):
223
222
  """
@@ -225,11 +224,11 @@ def test_get_spice_data(
225
224
 
226
225
  Parameters
227
226
  ----------
228
- decom_test_data : xarray.Dataset
227
+ decom_test_data_sci : xarray.Dataset
229
228
  L1a dataset
230
229
  """
231
230
  kernels = ["naif0012.tls"]
232
- times = decom_test_data["shcoarse"].data
231
+ times = decom_test_data_sci["shcoarse"].data
233
232
  use_fake_spin_data_for_time(np.min(times), np.max(times))
234
233
 
235
234
  # Mock attribute manager variable attrs
@@ -241,8 +240,88 @@ def test_get_spice_data(
241
240
  ):
242
241
  mock_attrs.return_value = {"CATDESC": "Test var"}
243
242
 
244
- spice_data = get_spice_data(decom_test_data, idex_attrs)
243
+ spice_data = get_spice_data(decom_test_data_sci, idex_attrs)
245
244
 
246
245
  for array in conftest.SPICE_ARRAYS:
247
246
  assert array in spice_data
248
- assert len(spice_data[array]) == len(decom_test_data["epoch"])
247
+ assert len(spice_data[array]) == len(decom_test_data_sci["epoch"])
248
+
249
+
250
+ @pytest.mark.external_test_data
251
+ def test_validate_l1b_idex_data_variables(
252
+ l1b_dataset: xr.Dataset, l1b_example_data: xr.Dataset
253
+ ):
254
+ """
255
+ Verify that each of the 6 waveform and telemetry arrays are equal to the
256
+ corresponding array produced by the IDEX team using the same l0 file.
257
+
258
+ Parameters
259
+ ----------
260
+ l1b_dataset : xarray.Dataset
261
+ The dataset to test with
262
+ l1b_example_data: xr.Dataset
263
+ A dataset containing the 6 waveform and telemetry arrays
264
+ """
265
+ # Lookup table to match the SDC array names to the Idex Team array names
266
+
267
+ match_variables = {
268
+ "TOF L": "TOF_Low",
269
+ "TOF H": "TOF_High",
270
+ "TOF M": "TOF_Mid",
271
+ "Target H": "Target_High",
272
+ "Target L": "Target_Low",
273
+ "Ion Grid": "Ion_Grid",
274
+ "Time (high sampling)": "time_high_sample_rate",
275
+ "Time (low sampling)": "time_low_sample_rate",
276
+ "current_2V5_bus": "current_2p5v_bus",
277
+ "current_3V3_bus": "current_3p3v_bus",
278
+ "current_neg2V5_bus": "current_neg2p5v_bus",
279
+ "voltage_3V3_op_ref": "voltage_3p3_op_ref",
280
+ "voltage_3V3_ref": "voltage_3p3_ref",
281
+ "voltage_pos3V3_bus": "voltage_pos3p3v_bus",
282
+ }
283
+
284
+ # The Engineering data is converting to UTC, and the SDC is converting to J2000,
285
+ # for 'epoch' and 'Timestamp' so this test is using the raw time value 'SCHOARSE' to
286
+ # validate time
287
+ # SPICE data is mocked.
288
+ arrays_to_skip = [
289
+ "Timestamp",
290
+ "Epoch",
291
+ "Pitch",
292
+ "Roll",
293
+ "Yaw",
294
+ "Declination",
295
+ "PositionX",
296
+ "PositionY",
297
+ "PositionZ",
298
+ "VelocityX",
299
+ "VelocityY",
300
+ "VelocityZ",
301
+ "RightAscension",
302
+ ]
303
+ # Compare each corresponding variable
304
+ for var in l1b_example_data.data_vars:
305
+ if var not in arrays_to_skip:
306
+ # Get the corresponding array name
307
+ cdf_var = match_variables.get(var, var.lower().replace(".", "p"))
308
+
309
+ warning = (
310
+ f"The array '{cdf_var}' does not equal the expected example array "
311
+ )
312
+ f"'{var}' produced by the IDEX team"
313
+
314
+ if l1b_dataset[cdf_var].dtype == object:
315
+ assert (l1b_dataset[cdf_var].data == l1b_example_data[var]).all(), (
316
+ warning
317
+ )
318
+
319
+ else:
320
+ (
321
+ np.testing.assert_array_almost_equal(
322
+ l1b_dataset[cdf_var].data,
323
+ l1b_example_data[var],
324
+ decimal=1e-04,
325
+ ),
326
+ warning,
327
+ )