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
@@ -28,27 +28,19 @@ class TestENAMapMappingUtils:
28
28
  """Test coverage for bin_single_array_at_indices function w/ simple 2D input,
29
29
  Corresponding to an extra axis that is not spatially binned.
30
30
  """
31
- # Binning will occur along axis 0 (combining 1, 2, 3 and 4, 5, 6 separately)
31
+ # Binning will occur along axis 1 seen below
32
+ # (combining 1, 2, 3 and 4, 5, 6 separately).
32
33
  value_array = np.array(
33
34
  [
34
- [1, 4],
35
- [2, 5],
36
- [3, 6],
35
+ [1, 2, 3],
36
+ [4, 5, 6],
37
37
  ]
38
38
  )
39
39
  input_indices = np.array([0, 1, 2, 2])
40
40
  projection_indices = np.array([1, 0, 1, 6])
41
41
  projection_grid_shape = (7, 1)
42
42
  expected_projection_values = np.array(
43
- [
44
- [2, 5],
45
- [4, 10],
46
- [0, 0],
47
- [0, 0],
48
- [0, 0],
49
- [0, 0],
50
- [3, 6],
51
- ]
43
+ [[2, 4, 0, 0, 0, 0, 3], [5, 10, 0, 0, 0, 0, 6]]
52
44
  )
53
45
  projection_values = map_utils.bin_single_array_at_indices(
54
46
  value_array,
@@ -76,7 +68,7 @@ class TestENAMapMappingUtils:
76
68
  extra_axis_size = 11 # Another axis which is not spatially binned, e.g. energy
77
69
  input_grid_size = np.prod(input_grid_shape)
78
70
  projection_grid_size = np.prod(projection_grid_shape)
79
- value_array = np.random.rand(input_grid_size, extra_axis_size)
71
+ value_array = np.random.rand(extra_axis_size, input_grid_size)
80
72
  input_indices = np.random.randint(0, input_grid_size, size=1000)
81
73
  projection_indices = np.random.randint(0, projection_grid_size, size=1000)
82
74
  projection_values = map_utils.bin_single_array_at_indices(
@@ -90,16 +82,16 @@ class TestENAMapMappingUtils:
90
82
  np.testing.assert_equal(
91
83
  projection_values.shape,
92
84
  (
93
- projection_grid_size,
94
85
  extra_axis_size,
86
+ projection_grid_size,
95
87
  ),
96
88
  )
97
89
 
98
90
  # Create the expected projection values by summing the input values in a loop
99
91
  # This is different from the binning function, which uses np.bincount
100
- expected_projection_values = np.zeros((projection_grid_size, extra_axis_size))
92
+ expected_projection_values = np.zeros((extra_axis_size, projection_grid_size))
101
93
  for ii, ip in zip(input_indices, projection_indices):
102
- expected_projection_values[ip, :] += value_array[ii, :]
94
+ expected_projection_values[:, ip] += value_array[:, ii]
103
95
 
104
96
  np.testing.assert_allclose(projection_values, expected_projection_values)
105
97
 
@@ -117,7 +109,7 @@ class TestENAMapMappingUtils:
117
109
  extra_axes_sizes = np.full(num_extra_dims, 3, dtype=int).tolist()
118
110
  input_grid_size = np.prod(input_grid_shape)
119
111
  projection_grid_size = np.prod(projection_grid_shape)
120
- value_array = np.random.rand(input_grid_size, *extra_axes_sizes)
112
+ value_array = np.random.rand(*extra_axes_sizes, input_grid_size)
121
113
  input_indices = np.random.randint(0, input_grid_size, size=1000)
122
114
  projection_indices = np.random.randint(0, projection_grid_size, size=1000)
123
115
  projection_values = map_utils.bin_single_array_at_indices(
@@ -130,14 +122,14 @@ class TestENAMapMappingUtils:
130
122
  # Explicitly check that the shape of the output is the same as projection grid
131
123
  np.testing.assert_equal(
132
124
  projection_values.shape,
133
- (projection_grid_size, *extra_axes_sizes),
125
+ (*extra_axes_sizes, projection_grid_size),
134
126
  )
135
127
 
136
128
  # Create the expected projection values by summing the input values in a loop
137
129
  # This is different from the binning function, which uses np.bincount
138
- expected_projection_values = np.zeros((projection_grid_size, *extra_axes_sizes))
130
+ expected_projection_values = np.zeros((*extra_axes_sizes, projection_grid_size))
139
131
  for ii, ip in zip(input_indices, projection_indices):
140
- expected_projection_values[ip, ...] += value_array[ii, ...]
132
+ expected_projection_values[..., ip] += value_array[..., ii]
141
133
 
142
134
  np.testing.assert_allclose(projection_values, expected_projection_values)
143
135
 
@@ -155,28 +147,59 @@ class TestENAMapMappingUtils:
155
147
  scale_factor_1d = 1.5
156
148
  input_values_1d_2 = input_values_1d_1 * scale_factor_1d
157
149
 
158
- # 2D input values. The second axis (different cols) will be summed independently
150
+ # 2D input values. The 0 axis (different rows) will be summed independently
159
151
  input_values_2d = np.array(
160
152
  [
161
- [-0.5, 0, 0.5],
162
- [1, 2, 3],
163
- [4, 5, 6],
164
- [7, 8, 9],
165
- [0, 0, 0],
166
- [0, 0, 0],
167
- [0, 0, 0],
168
- [0, 0, 0],
169
- [0, 0, 0],
170
- [0, 0, 0],
171
- [0, 0, 0],
172
- [0, 0, 0],
153
+ [
154
+ -0.5,
155
+ 1,
156
+ 4,
157
+ 7,
158
+ 0,
159
+ 0,
160
+ 0,
161
+ 0,
162
+ 0,
163
+ 0,
164
+ 0,
165
+ 0,
166
+ ],
167
+ [
168
+ 0,
169
+ 2,
170
+ 5,
171
+ 8,
172
+ 0,
173
+ 0,
174
+ 0,
175
+ 0,
176
+ 0,
177
+ 0,
178
+ 0,
179
+ 0,
180
+ ],
181
+ [
182
+ 0.5,
183
+ 3,
184
+ 6,
185
+ 9,
186
+ 0,
187
+ 0,
188
+ 0,
189
+ 0,
190
+ 0,
191
+ 0,
192
+ 0,
193
+ 0,
194
+ ],
173
195
  ]
174
196
  )
175
- extra_axis_size_2d = input_values_2d.shape[1]
197
+
198
+ extra_axis_size_2d = input_values_2d.shape[0]
176
199
 
177
200
  # 3D input values
178
- input_values_3d = np.zeros((input_values_2d.shape[0], 3, 3))
179
- input_values_3d[:2] = np.array(
201
+ input_values_3d = np.zeros((3, 3, input_values_2d.shape[-1]))
202
+ input_values_3d[:, :, :2] = np.array(
180
203
  [
181
204
  [
182
205
  [1, 2, 3],
@@ -189,8 +212,8 @@ class TestENAMapMappingUtils:
189
212
  [16, 17, 18],
190
213
  ],
191
214
  ]
192
- )
193
- extra_axes_size_3d = input_values_3d.shape[1:]
215
+ ).transpose(1, 2, 0)
216
+ extra_axes_size_3d = input_values_3d.shape[:-1]
194
217
 
195
218
  # Set up the expected projection values
196
219
  expected_projection_values_1d_1 = np.zeros(projection_grid_shape).ravel()
@@ -199,13 +222,13 @@ class TestENAMapMappingUtils:
199
222
  expected_projection_values_1d_1 * scale_factor_1d
200
223
  )
201
224
  expected_projection_values_2d = np.zeros(
202
- (np.prod(projection_grid_shape), extra_axis_size_2d)
225
+ (extra_axis_size_2d, np.prod(projection_grid_shape))
203
226
  )
204
- expected_projection_values_2d[0, :] = np.array([11.5, 15, 18.5])
227
+ expected_projection_values_2d[:, 0] = np.array([11.5, 15, 18.5])
205
228
  expected_projection_values_3d = np.zeros(
206
- (np.prod(projection_grid_shape), *extra_axes_size_3d)
229
+ (*extra_axes_size_3d, np.prod(projection_grid_shape))
207
230
  )
208
- expected_projection_values_3d[0, :, :] = np.array(
231
+ expected_projection_values_3d[:, :, 0] = np.array(
209
232
  [
210
233
  [11, 13, 15],
211
234
  [17, 19, 21],
@@ -7,7 +7,7 @@ import pytest
7
7
  from imap_processing.ena_maps.utils import spatial_utils
8
8
 
9
9
  # Parameterize with spacings (degrees here):
10
- valid_spacings = [0.25, 0.5, 1, 5, 10, 20]
10
+ valid_spacings = [0.25, 0.5, 1, 5, 6, 6.666666666666667, 10, 20]
11
11
  invalid_spacings = [0, -1, 11]
12
12
  invalid_spacings_match_str = [
13
13
  "Spacing must be positive valued, non-zero.",
@@ -26,20 +26,20 @@ def test_build_spatial_bins():
26
26
  )
27
27
 
28
28
  assert az_bin_edges[0] == 0
29
- assert az_bin_edges[-1] == 2 * np.pi
29
+ assert az_bin_edges[-1] == 360
30
30
  assert len(az_bin_edges) == 721
31
31
 
32
- assert el_bin_edges[0] == -np.pi / 2
33
- assert el_bin_edges[-1] == np.pi / 2
32
+ assert el_bin_edges[0] == -90
33
+ assert el_bin_edges[-1] == 90
34
34
  assert len(el_bin_edges) == 361
35
35
 
36
36
  assert len(az_bin_midpoints) == 720
37
- np.testing.assert_allclose(az_bin_midpoints[0], np.deg2rad(0.25), atol=1e-4)
38
- np.testing.assert_allclose(az_bin_midpoints[-1], np.deg2rad(359.75), atol=1e-4)
37
+ np.testing.assert_allclose(az_bin_midpoints[0], 0.25, atol=1e-4)
38
+ np.testing.assert_allclose(az_bin_midpoints[-1], 359.75, atol=1e-4)
39
39
 
40
40
  assert len(el_bin_midpoints) == 360
41
- np.testing.assert_allclose(el_bin_midpoints[0], np.deg2rad(-89.75), atol=1e-4)
42
- np.testing.assert_allclose(el_bin_midpoints[-1], np.deg2rad(89.75), atol=1e-4)
41
+ np.testing.assert_allclose(el_bin_midpoints[0], -89.75, atol=1e-4)
42
+ np.testing.assert_allclose(el_bin_midpoints[-1], 89.75, atol=1e-4)
43
43
 
44
44
 
45
45
  @pytest.mark.parametrize("spacing", valid_spacings)
@@ -91,7 +91,7 @@ def test_rewrap_even_spaced_az_el_grid_1d(order):
91
91
  )
92
92
  rewrapped_grid_known_shape = spatial_utils.rewrap_even_spaced_az_el_grid(
93
93
  raveled_values,
94
- shape=orig_shape,
94
+ grid_shape=orig_shape,
95
95
  order=order,
96
96
  )
97
97
 
@@ -102,19 +102,19 @@ def test_rewrap_even_spaced_az_el_grid_1d(order):
102
102
  @pytest.mark.parametrize("order", ["C", "F"])
103
103
  def test_rewrap_even_spaced_az_el_grid_2d(order):
104
104
  """Test rewrap_even_spaced_az_el_grid function, with extra axis."""
105
- orig_shape = (360 * 12, 180 * 12, 5)
105
+ orig_shape = (5, 360 * 12, 180 * 12)
106
106
  orig_grid = np.fromfunction(lambda i, j, k: i**2 + j + k, orig_shape, dtype=int)
107
- raveled_values = orig_grid.reshape(-1, 5, order=order)
107
+ raveled_values = orig_grid.reshape(5, -1, order=order)
108
108
  rewrapped_grid_infer_shape = spatial_utils.rewrap_even_spaced_az_el_grid(
109
109
  raveled_values,
110
110
  order=order,
111
111
  )
112
112
  rewrapped_grid_known_shape = spatial_utils.rewrap_even_spaced_az_el_grid(
113
113
  raveled_values,
114
- shape=orig_shape,
114
+ grid_shape=orig_shape[-2:],
115
115
  order=order,
116
116
  )
117
- assert raveled_values.shape == (360 * 12 * 180 * 12, 5)
117
+ assert raveled_values.shape == (5, 360 * 12 * 180 * 12)
118
118
  assert np.array_equal(rewrapped_grid_infer_shape, orig_grid)
119
119
  assert np.array_equal(rewrapped_grid_known_shape, orig_grid)
120
120
 
@@ -141,21 +141,17 @@ class TestAzElSkyGrid:
141
141
  )
142
142
  npt.assert_allclose(
143
143
  grid.az_bin_midpoints,
144
- np.deg2rad(expected_azimuth_bin_midpoints_deg),
144
+ expected_azimuth_bin_midpoints_deg,
145
145
  atol=1e-11,
146
146
  )
147
147
  npt.assert_allclose(
148
148
  grid.el_bin_midpoints,
149
- np.deg2rad(expected_elevation_bin_midpoints_deg),
149
+ expected_elevation_bin_midpoints_deg,
150
150
  atol=1e-11,
151
151
  )
152
152
 
153
153
  # Check bin edges in degrees, radians
154
154
  expected_az_bin_edges_deg = np.arange(0, 360 + spacing, spacing)
155
155
  expected_el_bin_edges_deg = np.arange(-90, 90 + spacing, spacing)
156
- npt.assert_allclose(
157
- grid.az_bin_edges, np.deg2rad(expected_az_bin_edges_deg), atol=1e-11
158
- )
159
- npt.assert_allclose(
160
- grid.el_bin_edges, np.deg2rad(expected_el_bin_edges_deg), atol=1e-11
161
- )
156
+ npt.assert_allclose(grid.az_bin_edges, expected_az_bin_edges_deg, atol=1e-11)
157
+ npt.assert_allclose(grid.el_bin_edges, expected_el_bin_edges_deg, atol=1e-11)
@@ -1,4 +1,3 @@
1
- from functools import reduce
2
1
  from pathlib import Path
3
2
 
4
3
  import pytest
@@ -10,13 +9,13 @@ from imap_processing.glows.l1b.glows_l1b import glows_l1b
10
9
  from imap_processing.glows.l2.glows_l2 import glows_l2
11
10
 
12
11
 
13
- @pytest.fixture()
12
+ @pytest.fixture
14
13
  def packet_path():
15
14
  current_directory = Path(__file__).parent
16
15
  return current_directory / "validation_data" / "glows_test_packet_20110921_v01.pkts"
17
16
 
18
17
 
19
- @pytest.fixture()
18
+ @pytest.fixture
20
19
  def decom_test_data(packet_path):
21
20
  """Read test data from file"""
22
21
 
@@ -24,31 +23,28 @@ def decom_test_data(packet_path):
24
23
  return data_packet_list
25
24
 
26
25
 
27
- @pytest.fixture()
26
+ @pytest.fixture
28
27
  def l1a_test_data(decom_test_data):
29
28
  hist_l1a = []
30
29
 
31
30
  for hist in decom_test_data[0]:
32
31
  hist_l1a.append(HistogramL1A(hist))
33
32
 
34
- de_l1a_dict = process_de_l0(decom_test_data[1])
35
-
36
- # Flatten the dictionary to one list of DE values
37
- de_l1a = reduce(list.__add__, [value for value in de_l1a_dict.values()])
33
+ de_l1a = process_de_l0(decom_test_data[1])
38
34
 
39
35
  return hist_l1a, de_l1a
40
36
 
41
37
 
42
- @pytest.fixture()
38
+ @pytest.fixture
43
39
  def l1a_dataset(packet_path):
44
- return glows_l1a(packet_path, "v001")
40
+ return glows_l1a(packet_path)
45
41
 
46
42
 
47
- @pytest.fixture()
43
+ @pytest.fixture
48
44
  def l1b_hist_dataset(l1a_dataset):
49
- return glows_l1b(l1a_dataset[1], "v001")
45
+ return glows_l1b(l1a_dataset[0])
50
46
 
51
47
 
52
- @pytest.fixture()
48
+ @pytest.fixture
53
49
  def l2_hist_dataset(l1b_datasets):
54
- return glows_l2(l1b_datasets, "v001")
50
+ return glows_l2(l1b_datasets)
@@ -45,14 +45,14 @@ def test_glows_hist_data(decom_test_data):
45
45
  "ELVAR": 0,
46
46
  "EVENTS": 95978,
47
47
  }
48
- for key in expected_data.keys():
49
- assert getattr(decom_test_data[0][0], key) == expected_data[key]
48
+ for key, expected_val in expected_data.items():
49
+ assert getattr(decom_test_data[0][0], key) == expected_val
50
50
 
51
51
 
52
52
  def test_glows_de_data(decom_test_data):
53
53
  expected_data = {"MET": 54233694, "SEC": 54232338, "LEN": 1, "SEQ": 0}
54
- for key in expected_data.keys():
55
- assert getattr(decom_test_data[1][0], key) == expected_data[key]
54
+ for key, expected_val in expected_data.items():
55
+ assert getattr(decom_test_data[1][0], key) == expected_val
56
56
 
57
57
 
58
58
  def test_bad_header():
@@ -1,39 +1,18 @@
1
1
  import dataclasses
2
- from functools import reduce
3
2
 
4
3
  import numpy as np
5
- import pytest
6
4
 
7
- from imap_processing.glows.l0 import decom_glows
8
5
  from imap_processing.glows.l1a.glows_l1a import (
9
6
  create_glows_attr_obj,
10
7
  generate_de_dataset,
11
8
  generate_histogram_dataset,
12
- process_de_l0,
13
9
  )
14
- from imap_processing.glows.l1a.glows_l1a_data import HistogramL1A
15
10
  from imap_processing.glows.utils.constants import TimeTuple
16
11
 
17
12
 
18
- @pytest.fixture()
19
- def l1a_data(packet_path):
20
- """Read test data from file"""
21
-
22
- histogram_l0, de_l0 = decom_glows.decom_packets(packet_path)
23
-
24
- histogram_l1a = [HistogramL1A(hist) for hist in histogram_l0]
25
-
26
- de_l1a_dict = process_de_l0(de_l0)
27
-
28
- # Flatten the dictionary to one list of DE values
29
- de_l1a = reduce(list.__add__, [value for value in de_l1a_dict.values()])
30
-
31
- return (histogram_l1a, de_l1a)
32
-
33
-
34
- def test_generate_histogram_dataset(l1a_data):
35
- histogram_l1a, _ = l1a_data
36
- glows_attrs = create_glows_attr_obj("v001")
13
+ def test_generate_histogram_dataset(l1a_test_data):
14
+ histogram_l1a, _ = l1a_test_data
15
+ glows_attrs = create_glows_attr_obj()
37
16
  dataset = generate_histogram_dataset(histogram_l1a, glows_attrs)
38
17
 
39
18
  assert (dataset["histogram"].data[0] == histogram_l1a[0].histogram).all()
@@ -62,9 +41,9 @@ def test_generate_histogram_dataset(l1a_data):
62
41
  assert (dataset["histogram"].data[i] == histogram_l1a[i].histogram).all()
63
42
 
64
43
 
65
- def test_generate_de_dataset(l1a_data):
66
- _, de_l1a = l1a_data
67
- glows_attrs = create_glows_attr_obj("v001")
44
+ def test_generate_de_dataset(l1a_test_data):
45
+ _, de_l1a = l1a_test_data
46
+ glows_attrs = create_glows_attr_obj()
68
47
  dataset = generate_de_dataset(de_l1a, glows_attrs)
69
48
  assert len(dataset["epoch"].values) == len(de_l1a)
70
49
 
@@ -18,14 +18,14 @@ from imap_processing.glows.utils.constants import DirectEvent, GlowsConstants, T
18
18
  from imap_processing.spice.time import met_to_ttj2000ns
19
19
 
20
20
 
21
- @pytest.fixture()
21
+ @pytest.fixture
22
22
  def histogram_test_data(decom_test_data):
23
23
  histl0 = decom_test_data[0][0]
24
24
  hist = HistogramL1A(histl0)
25
25
  return hist
26
26
 
27
27
 
28
- @pytest.fixture()
28
+ @pytest.fixture
29
29
  def de_test_data(decom_test_data):
30
30
  del0 = decom_test_data[1][0]
31
31
  de = DirectEventL1A(del0)
@@ -41,19 +41,17 @@ def test_histogram_list(histogram_test_data, decom_test_data):
41
41
 
42
42
 
43
43
  def test_histogram_obs_day(packet_path):
44
- l1a = glows_l1a(packet_path, "v001")
44
+ l1a = glows_l1a(packet_path)
45
45
 
46
- assert len(l1a) == 3
46
+ assert len(l1a) == 2
47
47
 
48
48
  assert "hist" in l1a[0].attrs["Logical_source"]
49
- assert "hist" in l1a[1].attrs["Logical_source"]
50
49
 
51
50
  # Numbers pulled from the validation data.
52
51
  # this test assumes that the "is_night" flag switching from true to false is the
53
52
  # start of the observation day.
54
53
 
55
54
  assert np.array_equal(l1a[0]["imap_start_time"].data[0], 54232215.0)
56
- assert np.array_equal(l1a[1]["imap_start_time"].data[0], 54232455.0)
57
55
 
58
56
 
59
57
  def test_histogram_attributes(histogram_test_data):
@@ -270,7 +268,7 @@ def test_combine_direct_events(decom_test_data):
270
268
  de1 = DirectEventL1A(de0_first)
271
269
  assert not de1.direct_events
272
270
  if not de1.direct_events:
273
- de1.append(de0_second)
271
+ de1.merge_de_packets(de0_second)
274
272
 
275
273
  assert de1.direct_events
276
274
 
@@ -293,7 +291,7 @@ def test_combine_direct_events_with_missing(decom_test_data):
293
291
  de1 = DirectEventL1A(de0_first)
294
292
  assert not de1.direct_events
295
293
  if not de1.direct_events:
296
- de1.append(de0_second)
294
+ de1.merge_de_packets(de0_second)
297
295
 
298
296
  assert de1.direct_events
299
297
  # Missing one value
@@ -15,7 +15,7 @@ from imap_processing.glows.l1b.glows_l1b_data import (
15
15
  )
16
16
 
17
17
 
18
- @pytest.fixture()
18
+ @pytest.fixture
19
19
  def hist_dataset():
20
20
  variables = {
21
21
  "flight_software_version": np.zeros((20,)),
@@ -64,13 +64,13 @@ def hist_dataset():
64
64
  coords={"epoch": epoch, "bins": bins},
65
65
  )
66
66
 
67
- for var in variables:
68
- ds[var] = xr.DataArray(variables[var], dims=["epoch"], coords={"epoch": epoch})
67
+ for var, data in variables.items():
68
+ ds[var] = xr.DataArray(data, dims=["epoch"], coords={"epoch": epoch})
69
69
 
70
70
  return ds
71
71
 
72
72
 
73
- @pytest.fixture()
73
+ @pytest.fixture
74
74
  def de_dataset():
75
75
  variables = {
76
76
  "seq_count_in_pkts_file": np.zeros((20,)),
@@ -139,13 +139,13 @@ def de_dataset():
139
139
  },
140
140
  )
141
141
 
142
- for var in variables:
143
- ds[var] = xr.DataArray(variables[var], dims=["epoch"], coords={"epoch": epoch})
142
+ for var, data in variables.items():
143
+ ds[var] = xr.DataArray(data, dims=["epoch"], coords={"epoch": epoch})
144
144
 
145
145
  return ds
146
146
 
147
147
 
148
- @pytest.fixture()
148
+ @pytest.fixture
149
149
  def ancillary_dict():
150
150
  dictionary = {
151
151
  "description": "Table for conversion/decoding ancillary parameters collected "
@@ -289,7 +289,7 @@ def test_process_de(de_dataset, ancillary_dict):
289
289
 
290
290
 
291
291
  def test_glows_l1b(de_dataset, hist_dataset):
292
- hist_output = glows_l1b(hist_dataset, "V001")
292
+ hist_output = glows_l1b(hist_dataset)
293
293
 
294
294
  assert hist_output["histogram"].dims == ("epoch", "bins")
295
295
  assert hist_output["histogram"].shape == (20, 3600)
@@ -341,7 +341,7 @@ def test_glows_l1b(de_dataset, hist_dataset):
341
341
  for key in expected_hist_data:
342
342
  assert key in hist_output
343
343
 
344
- de_output = glows_l1b(de_dataset, "V001")
344
+ de_output = glows_l1b(de_dataset)
345
345
 
346
346
  # From table 15 in the algorithm document
347
347
  expected_de_data = [
@@ -364,14 +364,14 @@ def test_glows_l1b(de_dataset, hist_dataset):
364
364
 
365
365
 
366
366
  def test_generate_histogram_dataset(hist_dataset):
367
- l1b_data = glows_l1b(hist_dataset, "v001")
367
+ l1b_data = glows_l1b(hist_dataset)
368
368
  output_path = write_cdf(l1b_data)
369
369
 
370
370
  assert Path.exists(output_path)
371
371
 
372
372
 
373
373
  def test_generate_de_dataset(de_dataset):
374
- l1b_data = glows_l1b(de_dataset, "v001")
374
+ l1b_data = glows_l1b(de_dataset)
375
375
 
376
376
  output_path = write_cdf(l1b_data)
377
377
 
@@ -48,8 +48,8 @@ def test_glows_l1b_ancillary_file():
48
48
  }
49
49
 
50
50
  ancillary = AncillaryParameters(fake_good_input)
51
- for key in fake_good_input:
52
- assert getattr(ancillary, key) == fake_good_input[key]
51
+ for key, data in fake_good_input.items():
52
+ assert getattr(ancillary, key) == data
53
53
 
54
54
  fake_bad_input = {
55
55
  "version": "0.1",
@@ -80,7 +80,7 @@ def test_glows_l1b_de():
80
80
 
81
81
 
82
82
  def test_validation_data_histogram(l1a_dataset):
83
- l1b = [glows_l1b(l1a_dataset[0], "v001"), glows_l1b(l1a_dataset[1], "v001")]
83
+ l1b = [glows_l1b(l1a_dataset[0]), glows_l1b(l1a_dataset[1])]
84
84
  end_time = l1b[0]["epoch"].data[-1]
85
85
 
86
86
  validation_data = (
@@ -147,9 +147,9 @@ def test_validation_data_histogram(l1a_dataset):
147
147
 
148
148
 
149
149
  def test_validation_data_de(l1a_dataset):
150
- de_data = l1a_dataset[2]
150
+ de_data = l1a_dataset[1]
151
151
 
152
- l1b = glows_l1b(de_data, "v001")
152
+ l1b = glows_l1b(de_data)
153
153
  validation_data = (
154
154
  Path(__file__).parent / "validation_data" / "imap_glows_l1b_de_output.json"
155
155
  )
@@ -10,7 +10,7 @@ from imap_processing.glows.l2.glows_l2 import (
10
10
  from imap_processing.glows.l2.glows_l2_data import DailyLightcurve
11
11
 
12
12
 
13
- @pytest.fixture()
13
+ @pytest.fixture
14
14
  def l1b_hists():
15
15
  epoch = xr.DataArray(np.arange(4), name="epoch", dims=["epoch"])
16
16
  bins = xr.DataArray(np.arange(5), name="bins", dims=["bins"])
@@ -29,18 +29,12 @@ def l1b_hists():
29
29
 
30
30
 
31
31
  def test_glows_l2(l1b_hist_dataset):
32
- l2 = glows_l2(l1b_hist_dataset, "v001")[0]
32
+ l2 = glows_l2(l1b_hist_dataset)[0]
33
33
  assert l2.attrs["Logical_source"] == "imap_glows_l2_hist"
34
34
 
35
35
  assert np.allclose(l2["filter_temperature_average"].values, [57.6], rtol=0.1)
36
36
 
37
37
 
38
- @pytest.mark.skip(reason="Spin table not yet complete")
39
- def test_split_by_observational_day(l1b_hist_dataset):
40
- # TODO: Complete test when spin table is complete
41
- raise NotImplementedError
42
-
43
-
44
38
  def test_filter_good_times():
45
39
  active_flags = np.ones((17,))
46
40
  active_flags[16] = 0
@@ -48,7 +48,7 @@ def check_sum(bits_size):
48
48
  return f"{0:0{bits_size}b}"
49
49
 
50
50
 
51
- @pytest.fixture()
51
+ @pytest.fixture
52
52
  def create_de_data(tmp_path):
53
53
  """Fixture to create fake direct event data. Note that there has been no
54
54
  effort to make simulate this data meaning that packets are not self