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
@@ -48,16 +48,16 @@ RENAME_COLUMNS = {
48
48
  }
49
49
 
50
50
  MOD_VALUE_TO_SPECIES_ENERGY_MAP = {
51
- 0: {"species": "H", "energy_idx": 0},
52
- 1: {"species": "H", "energy_idx": 1},
53
- 2: {"species": "H", "energy_idx": 2},
54
- 3: {"species": "He4", "energy_idx": 0},
55
- 4: {"species": "He4", "energy_idx": 1},
56
- 5: {"species": "CNO", "energy_idx": 0},
57
- 6: {"species": "CNO", "energy_idx": 1},
58
- 7: {"species": "NeMgSi", "energy_idx": 0},
59
- 8: {"species": "NeMgSi", "energy_idx": 1},
60
- 9: {"species": "Fe", "energy_idx": 0},
51
+ 0: {"species": "h", "energy_bin": 0},
52
+ 1: {"species": "h", "energy_bin": 1},
53
+ 2: {"species": "h", "energy_bin": 2},
54
+ 3: {"species": "he4", "energy_bin": 0},
55
+ 4: {"species": "he4", "energy_bin": 1},
56
+ 5: {"species": "cno", "energy_bin": 0},
57
+ 6: {"species": "cno", "energy_bin": 1},
58
+ 7: {"species": "nemgsi", "energy_bin": 0},
59
+ 8: {"species": "nemgsi", "energy_bin": 1},
60
+ 9: {"species": "fe", "energy_bin": 0},
61
61
  }
62
62
 
63
63
 
@@ -124,8 +124,8 @@ def consolidate_rate_columns(
124
124
 
125
125
  The validation data has each value in a separate column. This
126
126
  function aggregates related data into arrays to match processed
127
- data. Each rate column has a corresponding delta plus and delta
128
- minus column for uncertainty values.
127
+ data. Each rate column has corresponding plus and minus columns
128
+ for uncertainty values.
129
129
 
130
130
  Parameters
131
131
  ----------
@@ -142,16 +142,16 @@ def consolidate_rate_columns(
142
142
  """
143
143
  for new_col, prefix in rate_columns.items():
144
144
  pattern_rates = re.compile(rf"^{prefix}\d+$")
145
- pattern_delta_plus = re.compile(rf"^{prefix}\d+_DELTA_PLUS$")
146
- pattern_delta_minus = re.compile(rf"^{prefix}\d+_DELTA_MINUS$")
145
+ pattern_uncert_plus = re.compile(rf"^{prefix}\d+_STAT_UNCERT_PLUS$")
146
+ pattern_uncert_minus = re.compile(rf"^{prefix}\d+_STAT_UNCERT_MINUS$")
147
147
  data[new_col] = data.filter(regex=pattern_rates.pattern).apply(
148
148
  lambda row: row.values, axis=1
149
149
  )
150
- data[f"{new_col}_delta_plus"] = data.filter(
151
- regex=pattern_delta_plus.pattern
150
+ data[f"{new_col}_stat_uncert_plus"] = data.filter(
151
+ regex=pattern_uncert_plus.pattern
152
152
  ).apply(lambda row: row.values, axis=1)
153
- data[f"{new_col}_delta_minus"] = data.filter(
154
- regex=pattern_delta_minus.pattern
153
+ data[f"{new_col}_stat_uncert_minus"] = data.filter(
154
+ regex=pattern_uncert_minus.pattern
155
155
  ).apply(lambda row: row.values, axis=1)
156
156
  if new_col == "sectorates":
157
157
  data = consolidate_sectorates(data)
@@ -159,10 +159,11 @@ def consolidate_rate_columns(
159
159
  columns=data.filter(regex=pattern_rates.pattern).columns, inplace=True
160
160
  )
161
161
  data.drop(
162
- columns=data.filter(regex=pattern_delta_plus.pattern).columns, inplace=True
162
+ columns=data.filter(regex=pattern_uncert_plus.pattern).columns, inplace=True
163
163
  )
164
164
  data.drop(
165
- columns=data.filter(regex=pattern_delta_minus.pattern).columns, inplace=True
165
+ columns=data.filter(regex=pattern_uncert_minus.pattern).columns,
166
+ inplace=True,
166
167
  )
167
168
  return data
168
169
 
@@ -170,7 +171,7 @@ def consolidate_rate_columns(
170
171
  def consolidate_sectorates(data: pd.DataFrame) -> pd.DataFrame:
171
172
  """Consolidate sector rate data into arrays.
172
173
 
173
- This function distinguishes between sector rate columns with three digits
174
+ This function distinguishes between sectored rate columns with three digits
174
175
  and those with four digits in their names.
175
176
 
176
177
  SECTORATES_000 SECTORATES_000_0 SECTORATES_000_1 SECTORATES_000_2...SECTORATES_120_9
@@ -185,9 +186,9 @@ def consolidate_sectorates(data: pd.DataFrame) -> pd.DataFrame:
185
186
 
186
187
  Columns with four digits (e.g., SECTORATES_000_0) include the sectorate
187
188
  values with a mod 10 value appended (e.g., 0). The mod 10 value determines
188
- the species and energy range the sector rates represent in the science frame.
189
+ the species and energy range the sectored rates represent in the science frame.
189
190
  There are 10 possible species and energy ranges, but only one has data per
190
- science frame. The validation data has 10 columns per 120 sector rates,
191
+ science frame. The validation data has 10 columns per 120 sectored rates,
191
192
  totaling 1200 columns per science frame. Each set of 10 columns will have
192
193
  only one value, resulting in an array that looks like this:
193
194
 
@@ -207,22 +208,22 @@ def consolidate_sectorates(data: pd.DataFrame) -> pd.DataFrame:
207
208
  Validation data with sectorate columns consolidated into arrays
208
209
  """
209
210
  sectorates_three_digits = data.filter(regex=r"^SECTORATES_\d{3}$").columns
210
- sectorates_delta_plus_three_digits = data.filter(
211
- regex=r"^SECTORATES_\d{3}_DELTA_PLUS$"
211
+ sectorates_uncert_plus_three_digits = data.filter(
212
+ regex=r"^SECTORATES_\d{3}_STAT_UNCERT_PLUS$"
212
213
  ).columns
213
- sectorates_delta_minus_three_digits = data.filter(
214
- regex=r"^SECTORATES_\d{3}_DELTA_MINUS$"
214
+ sectorates_uncert_minus_three_digits = data.filter(
215
+ regex=r"^SECTORATES_\d{3}_STAT_UNCERT_MINUS$"
215
216
  ).columns
216
217
 
217
218
  data["sectorates"] = data[sectorates_three_digits].apply(
218
- lambda row: row.values.reshape(8, 15), axis=1
219
- )
220
- data["sectorates_delta_plus"] = data[sectorates_delta_plus_three_digits].apply(
221
- lambda row: row.values.reshape(8, 15), axis=1
222
- )
223
- data["sectorates_delta_minus"] = data[sectorates_delta_minus_three_digits].apply(
224
- lambda row: row.values.reshape(8, 15), axis=1
219
+ lambda row: row.values.reshape(15, 8), axis=1
225
220
  )
221
+ data["sectorates_stat_uncert_plus"] = data[
222
+ sectorates_uncert_plus_three_digits
223
+ ].apply(lambda row: row.values.reshape(15, 8), axis=1)
224
+ data["sectorates_stat_uncert_minus"] = data[
225
+ sectorates_uncert_minus_three_digits
226
+ ].apply(lambda row: row.values.reshape(15, 8), axis=1)
226
227
 
227
228
  sectorates_four_digits = data.filter(regex=r"^SECTORATES_\d{3}_\d{1}$").columns
228
229
  data["sectorates_by_mod_val"] = data[sectorates_four_digits].apply(
@@ -250,15 +251,15 @@ def process_single_rates(data: pd.DataFrame) -> pd.DataFrame:
250
251
  data["sngrates"] = data.apply(
251
252
  lambda row: np.array([row["sngrates_hg"], row["sngrates_lg"]]), axis=1
252
253
  )
253
- data["sngrates_delta_plus"] = data.apply(
254
+ data["sngrates_stat_uncert_plus"] = data.apply(
254
255
  lambda row: np.array(
255
- [row["sngrates_hg_delta_plus"], row["sngrates_lg_delta_plus"]]
256
+ [row["sngrates_hg_stat_uncert_plus"], row["sngrates_lg_stat_uncert_plus"]]
256
257
  ),
257
258
  axis=1,
258
259
  )
259
- data["sngrates_delta_minus"] = data.apply(
260
+ data["sngrates_stat_uncert_minus"] = data.apply(
260
261
  lambda row: np.array(
261
- [row["sngrates_hg_delta_minus"], row["sngrates_lg_delta_minus"]]
262
+ [row["sngrates_hg_stat_uncert_minus"], row["sngrates_lg_stat_uncert_minus"]]
262
263
  ),
263
264
  axis=1,
264
265
  )
@@ -266,10 +267,10 @@ def process_single_rates(data: pd.DataFrame) -> pd.DataFrame:
266
267
  columns=[
267
268
  "sngrates_hg",
268
269
  "sngrates_lg",
269
- "sngrates_hg_delta_plus",
270
- "sngrates_lg_delta_plus",
271
- "sngrates_hg_delta_minus",
272
- "sngrates_lg_delta_minus",
270
+ "sngrates_hg_stat_uncert_plus",
271
+ "sngrates_lg_stat_uncert_plus",
272
+ "sngrates_hg_stat_uncert_minus",
273
+ "sngrates_lg_stat_uncert_minus",
273
274
  ],
274
275
  inplace=True,
275
276
  )
@@ -279,7 +280,7 @@ def process_single_rates(data: pd.DataFrame) -> pd.DataFrame:
279
280
  def add_species_energy(data: pd.DataFrame) -> pd.DataFrame:
280
281
  """Add species and energy index to the validation data.
281
282
 
282
- The sector rate data is organized by species and energy index
283
+ The sectored rate data is organized by species and energy index
283
284
  in the processed data so this function adds this information
284
285
  to each row (i.e. science frame) in the validation data.
285
286
 
@@ -304,12 +305,12 @@ def add_species_energy(data: pd.DataFrame) -> pd.DataFrame:
304
305
  )
305
306
  )
306
307
  data["species"] = data["mod_10"].apply(
307
- lambda row: MOD_VALUE_TO_SPECIES_ENERGY_MAP[row]["species"].lower()
308
+ lambda row: MOD_VALUE_TO_SPECIES_ENERGY_MAP[row]["species"]
308
309
  if row is not None
309
310
  else None
310
311
  )
311
- data["energy_idx"] = data["mod_10"].apply(
312
- lambda row: MOD_VALUE_TO_SPECIES_ENERGY_MAP[row]["energy_idx"]
312
+ data["energy_bin"] = data["mod_10"].apply(
313
+ lambda row: MOD_VALUE_TO_SPECIES_ENERGY_MAP[row]["energy_bin"]
313
314
  if row is not None
314
315
  else None
315
316
  )
@@ -336,55 +337,55 @@ def compare_data(
336
337
  if field not in [
337
338
  "sc_tick_by_frame",
338
339
  "species",
339
- "energy_idx",
340
+ "energy_bin",
340
341
  ]:
341
- assert (
342
- field in actual_data.data_vars.keys()
343
- ), f"Field {field} not found in actual data variables"
342
+ assert field in actual_data.data_vars.keys(), (
343
+ f"Field {field} not found in actual data variables"
344
+ )
344
345
  if field not in skip:
345
346
  for frame in range(expected_data.shape[0]):
346
347
  if field == "species":
347
- # Compare sector rates data using species and energy index.
348
+ # Compare sectored rates data using species and energy index.
348
349
  # which are only present in the validation data. In the actual
349
- # data, sector rates are organized by species in 4D arrays.
350
- # i.e. h_counts_sectored has shape
351
- # (epoch, h_energy_index, declination, azimuth).
350
+ # data, sectored rates are organized by species in 4D arrays.
351
+ # i.e. h_sectored_counts has shape
352
+ # (epoch, h_energy_index, azimuth, declination).
352
353
  # species and energy index are used to find the correct
353
- # array of sector rate data from the actual data for comparison.
354
+ # array of sectored rate data from the actual data for comparison.
354
355
  species = expected_data[field][frame]
355
- energy_idx = expected_data["energy_idx"][frame]
356
- if "sectorates_delta_plus" in expected_data.columns:
356
+ energy_bin = expected_data["energy_bin"][frame]
357
+ if "sectorates_stat_uncert_plus" in expected_data.columns:
357
358
  np.testing.assert_allclose(
358
- actual_data[f"{species}_counts_sectored_delta_plus"][frame][
359
- energy_idx
360
- ].data,
361
- expected_data["sectorates_delta_plus"][frame],
359
+ actual_data[f"{species}_sectored_counts_stat_uncert_plus"][
360
+ frame
361
+ ][energy_bin].data,
362
+ expected_data["sectorates_stat_uncert_plus"][frame],
362
363
  rtol=1e-7, # relative tolerance
363
364
  atol=1e-8, # absolute tolerance
364
- err_msg=f"Mismatch in {species}_counts_sectored_delta_"
365
- f"plus at frame {frame}, energy_idx {energy_idx}",
365
+ err_msg=f"Mismatch in {species}_sectored_counts_stat_uncert"
366
+ f"_plus at frame {frame}, energy_bin {energy_bin}",
366
367
  )
367
- if "sectorates_delta_minus" in expected_data.columns:
368
+ if "sectorates_stat_uncert_minus" in expected_data.columns:
368
369
  np.testing.assert_allclose(
369
- actual_data[f"{species}_counts_sectored_delta_minus"][
370
+ actual_data[f"{species}_sectored_counts_stat_uncert_minus"][
370
371
  frame
371
- ][energy_idx].data,
372
- expected_data["sectorates_delta_minus"][frame],
372
+ ][energy_bin].data,
373
+ expected_data["sectorates_stat_uncert_minus"][frame],
373
374
  rtol=1e-7,
374
375
  atol=1e-8,
375
- err_msg=f"Mismatch in {species}_counts_sectored_delta_"
376
- f"minus at frame {frame}, energy_idx {energy_idx}",
376
+ err_msg=f"Mismatch in {species}_sectored_counts_stat_uncert"
377
+ f"_minus at frame {frame}, energy_bin {energy_bin}",
377
378
  )
378
379
  else:
379
380
  np.testing.assert_allclose(
380
- actual_data[f"{species}_counts_sectored"][frame][
381
- energy_idx
381
+ actual_data[f"{species}_sectored_counts"][frame][
382
+ energy_bin
382
383
  ].data,
383
384
  expected_data["sectorates"][frame],
384
385
  rtol=1e-7,
385
386
  atol=1e-8,
386
- err_msg=f"Mismatch in {species}_counts_sectored at"
387
- f"frame {frame}, energy_idx {energy_idx}",
387
+ err_msg=f"Mismatch in {species}_sectored_counts at"
388
+ f"frame {frame}, energy_bin {energy_bin}",
388
389
  )
389
390
  elif field == "sc_tick_by_frame":
390
391
  # Get the sc_tick values for each frame in the actual data
@@ -7,6 +7,7 @@ from imap_processing import imap_module_directory
7
7
  from imap_processing.hit.hit_utils import (
8
8
  HitAPID,
9
9
  )
10
+ from imap_processing.hit.l0.constants import AZIMUTH_ANGLES, DECLINATION_ANGLES
10
11
  from imap_processing.hit.l0.decom_hit import (
11
12
  assemble_science_frames,
12
13
  decom_hit,
@@ -20,7 +21,7 @@ from imap_processing.hit.l0.decom_hit import (
20
21
  from imap_processing.utils import packet_file_to_datasets
21
22
 
22
23
 
23
- @pytest.fixture()
24
+ @pytest.fixture
24
25
  def sci_dataset():
25
26
  """Create a xarray dataset for testing from sample data."""
26
27
  packet_definition = (
@@ -122,6 +123,9 @@ def test_parse_count_rates(sci_dataset):
122
123
  if count_rate_vars in list(sci_dataset.keys()):
123
124
  assert True
124
125
 
126
+ assert np.allclose(sci_dataset["declination"].values, DECLINATION_ANGLES)
127
+ assert np.allclose(sci_dataset["azimuth"].values, AZIMUTH_ANGLES)
128
+
125
129
 
126
130
  def test_is_sequential():
127
131
  """Test the is_sequential function."""
@@ -27,9 +27,7 @@ from imap_processing.tests.hit.helpers.l1_validation import (
27
27
  @pytest.fixture(scope="module")
28
28
  def hk_packet_filepath():
29
29
  """Set path to test data file"""
30
- return (
31
- imap_module_directory / "tests/hit/test_data/imap_hit_l0_raw_20100105_v001.pkts"
32
- )
30
+ return imap_module_directory / "tests/hit/test_data/hskp_sample.ccsds"
33
31
 
34
32
 
35
33
  @pytest.fixture(scope="module")
@@ -54,7 +52,7 @@ def validation_data():
54
52
  def test_subcom_sectorates(sci_packet_filepath):
55
53
  """Test the subcom_sectorates function.
56
54
 
57
- This function organizes the sector rates data
55
+ This function organizes the sectored rates data
58
56
  by species and adds the data as new variables
59
57
  to the dataset.
60
58
  """
@@ -64,31 +62,31 @@ def test_subcom_sectorates(sci_packet_filepath):
64
62
  sci_dataset = decom_hit(sci_dataset)
65
63
 
66
64
  # Call the function to be tested
67
- subcom_sectorates(sci_dataset)
65
+ sci_dataset = subcom_sectorates(sci_dataset)
68
66
 
69
67
  # Number of science frames in the dataset
70
68
  frames = sci_dataset["epoch"].shape[0]
71
69
 
72
- # Check if the dataset has the expected new variables
73
- for species in ["h", "he4", "cno", "nemgsi", "fe"]:
74
- assert f"{species}_counts_sectored" in sci_dataset
75
- assert f"{species}_energy_min" in sci_dataset
76
- assert f"{species}_energy_max" in sci_dataset
70
+ # Shape of the new data variables
71
+ expected_shapes = {
72
+ "h": (3, 15, 8),
73
+ "he4": (2, 15, 8),
74
+ "cno": (2, 15, 8),
75
+ "nemgsi": (2, 15, 8),
76
+ "fe": (1, 15, 8),
77
+ }
77
78
 
79
+ for species, shape in expected_shapes.items():
80
+ # Check if the dataset has the new data variables
81
+ assert f"{species}_sectored_counts" in sci_dataset
82
+ assert f"{species}_energy_mean" in sci_dataset.coords
83
+ assert f"{species}_energy_delta_minus" in sci_dataset
84
+ assert f"{species}_energy_delta_plus" in sci_dataset
78
85
  # Check the shape of the new data variables
79
- if species == "h":
80
- assert sci_dataset[f"{species}_counts_sectored"].shape == (frames, 3, 8, 15)
81
- assert sci_dataset[f"{species}_energy_min"].shape == (3,)
82
- elif species in ("4he", "cno", "nemgsi"):
83
- assert sci_dataset[f"{species}_counts_sectored"].shape == (frames, 2, 8, 15)
84
- assert sci_dataset[f"{species}_energy_min"].shape == (2,)
85
- elif species == "fe":
86
- assert sci_dataset[f"{species}_counts_sectored"].shape == (frames, 1, 8, 15)
87
- assert sci_dataset[f"{species}_energy_min"].shape == (1,)
88
- assert (
89
- sci_dataset[f"{species}_energy_max"].shape
90
- == sci_dataset[f"{species}_energy_min"].shape
91
- )
86
+ assert sci_dataset[f"{species}_sectored_counts"].shape == (frames, *shape)
87
+ assert sci_dataset[f"{species}_energy_mean"].shape == (shape[0],)
88
+ assert sci_dataset[f"{species}_energy_delta_minus"].shape == (shape[0],)
89
+ assert sci_dataset[f"{species}_energy_delta_plus"].shape == (shape[0],)
92
90
 
93
91
 
94
92
  def test_calculate_uncertainties():
@@ -119,13 +117,13 @@ def test_calculate_uncertainties():
119
117
 
120
118
  # Assertions
121
119
  np.testing.assert_array_almost_equal(
122
- result["counts_delta_plus"].values, expected_delta_plus
120
+ result["counts_stat_uncert_plus"].values, expected_delta_plus
123
121
  )
124
122
  np.testing.assert_array_almost_equal(
125
- result["counts_delta_minus"].values, expected_delta_minus
123
+ result["counts_stat_uncert_minus"].values, expected_delta_minus
126
124
  )
127
- assert "version_delta_plus" not in result
128
- assert "version_delta_minus" not in result
125
+ assert "version_stat_uncert_plus" not in result
126
+ assert "version_stat_uncert_minus" not in result
129
127
 
130
128
 
131
129
  def test_validate_l1a_housekeeping_data(hk_packet_filepath):
@@ -139,7 +137,7 @@ def test_validate_l1a_housekeeping_data(hk_packet_filepath):
139
137
  hk_packet_filepath : str
140
138
  File path to housekeeping ccsds file
141
139
  """
142
- datasets = hit_l1a(hk_packet_filepath, "001")
140
+ datasets = hit_l1a(hk_packet_filepath)
143
141
  hk_dataset = None
144
142
  for dataset in datasets:
145
143
  if dataset.attrs["Logical_source"] == "imap_hit_l1a_hk":
@@ -151,6 +149,7 @@ def test_validate_l1a_housekeeping_data(hk_packet_filepath):
151
149
  )
152
150
  validation_data = pd.read_csv(validation_file)
153
151
  validation_data.columns = validation_data.columns.str.lower()
152
+ validation_data.columns = validation_data.columns.str.strip()
154
153
 
155
154
  # Get a list of leak columns in ascending order
156
155
  # (LEAK_I_00, LEAK_I_01, ..., LEAK_I_63)
@@ -166,7 +165,6 @@ def test_validate_l1a_housekeeping_data(hk_packet_filepath):
166
165
  # Define the keys that should have dropped from the housekeeping dataset
167
166
  dropped_fields = {
168
167
  "pkt_apid",
169
- "sc_tick",
170
168
  "version",
171
169
  "type",
172
170
  "sec_hdr_flg",
@@ -190,7 +188,6 @@ def test_validate_l1a_housekeeping_data(hk_packet_filepath):
190
188
  "ccsds_grp_flag",
191
189
  "ccsds_seq_cnt",
192
190
  "ccsds_length",
193
- "shcoarse",
194
191
  }
195
192
 
196
193
  # Check that dropped variables are not in the dataset
@@ -226,7 +223,7 @@ def test_validate_l1a_counts_data(sci_packet_filepath, validation_data):
226
223
  """
227
224
 
228
225
  # Process the sample data
229
- processed_datasets = hit_l1a(sci_packet_filepath, "001")
226
+ processed_datasets = hit_l1a(sci_packet_filepath)
230
227
  l1a_counts_data = processed_datasets[0]
231
228
 
232
229
  # Prepare validation data for comparison with processed data
@@ -243,7 +240,7 @@ def test_validate_l1a_counts_data(sci_packet_filepath, validation_data):
243
240
  "seq_flgs",
244
241
  "src_seq_ctr",
245
242
  "pkt_len",
246
- "energy_idx",
243
+ "energy_bin",
247
244
  ]
248
245
 
249
246
  # Compare processed data to validation data
@@ -263,7 +260,7 @@ def test_hit_l1a(hk_packet_filepath, sci_packet_filepath):
263
260
  Path to ccsds file for science data
264
261
  """
265
262
  for packet_filepath in [hk_packet_filepath, sci_packet_filepath]:
266
- processed_datasets = hit_l1a(packet_filepath, "001")
263
+ processed_datasets = hit_l1a(packet_filepath)
267
264
  assert isinstance(processed_datasets, list)
268
265
  assert all(isinstance(ds, xr.Dataset) for ds in processed_datasets)
269
266
  if packet_filepath == hk_packet_filepath:
@@ -272,10 +269,9 @@ def test_hit_l1a(hk_packet_filepath, sci_packet_filepath):
272
269
  else:
273
270
  assert len(processed_datasets) == 2
274
271
  assert (
275
- processed_datasets[0].attrs["Logical_source"]
276
- == "imap_hit_l1a_count-rates"
272
+ processed_datasets[0].attrs["Logical_source"] == "imap_hit_l1a_counts"
277
273
  )
278
274
  assert (
279
275
  processed_datasets[1].attrs["Logical_source"]
280
- == "imap_hit_l1a_pulse-height-events"
276
+ == "imap_hit_l1a_direct-events"
281
277
  )