imap-processing 0.11.0__py3-none-any.whl → 0.12.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 (288) hide show
  1. imap_processing/__init__.py +10 -11
  2. imap_processing/_version.py +2 -2
  3. imap_processing/ccsds/excel_to_xtce.py +65 -16
  4. imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +6 -28
  5. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +365 -42
  6. imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +0 -5
  7. imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +10 -11
  8. imap_processing/cdf/config/imap_hi_variable_attrs.yaml +17 -19
  9. imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +26 -13
  10. imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +106 -116
  11. imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +120 -145
  12. imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +14 -0
  13. imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +6 -9
  14. imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +1 -1
  15. imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +0 -12
  16. imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +1 -1
  17. imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +9 -21
  18. imap_processing/cdf/config/imap_mag_l1a_variable_attrs.yaml +361 -0
  19. imap_processing/cdf/config/imap_mag_l1b_variable_attrs.yaml +160 -0
  20. imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +160 -0
  21. imap_processing/cdf/config/imap_spacecraft_global_cdf_attrs.yaml +18 -0
  22. imap_processing/cdf/config/imap_spacecraft_variable_attrs.yaml +40 -0
  23. imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +1 -5
  24. imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +12 -4
  25. imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +16 -2
  26. imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +48 -52
  27. imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +71 -47
  28. imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +2 -14
  29. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +51 -2
  30. imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +29 -14
  31. imap_processing/cdf/utils.py +13 -7
  32. imap_processing/cli.py +23 -8
  33. imap_processing/codice/codice_l1a.py +207 -85
  34. imap_processing/codice/constants.py +1322 -568
  35. imap_processing/codice/decompress.py +2 -6
  36. imap_processing/ena_maps/ena_maps.py +480 -116
  37. imap_processing/ena_maps/utils/coordinates.py +19 -0
  38. imap_processing/ena_maps/utils/map_utils.py +14 -17
  39. imap_processing/ena_maps/utils/spatial_utils.py +45 -47
  40. imap_processing/hi/l1a/hi_l1a.py +24 -18
  41. imap_processing/hi/l1a/histogram.py +0 -1
  42. imap_processing/hi/l1a/science_direct_event.py +6 -8
  43. imap_processing/hi/l1b/hi_l1b.py +31 -39
  44. imap_processing/hi/l1c/hi_l1c.py +405 -17
  45. imap_processing/hi/utils.py +58 -12
  46. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt0-factors_20250219_v002.csv +205 -0
  47. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt1-factors_20250219_v002.csv +205 -0
  48. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt2-factors_20250219_v002.csv +205 -0
  49. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt3-factors_20250219_v002.csv +205 -0
  50. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-summed-dt0-factors_20250219_v002.csv +68 -0
  51. imap_processing/hit/hit_utils.py +173 -1
  52. imap_processing/hit/l0/constants.py +20 -11
  53. imap_processing/hit/l0/decom_hit.py +18 -4
  54. imap_processing/hit/l1a/hit_l1a.py +45 -54
  55. imap_processing/hit/l1b/constants.py +317 -0
  56. imap_processing/hit/l1b/hit_l1b.py +367 -18
  57. imap_processing/hit/l2/constants.py +281 -0
  58. imap_processing/hit/l2/hit_l2.py +614 -0
  59. imap_processing/hit/packet_definitions/hit_packet_definitions.xml +1323 -71
  60. imap_processing/ialirt/l0/mag_l0_ialirt_data.py +155 -0
  61. imap_processing/ialirt/l0/parse_mag.py +246 -0
  62. imap_processing/ialirt/l0/process_swe.py +252 -0
  63. imap_processing/ialirt/packet_definitions/ialirt.xml +7 -3
  64. imap_processing/ialirt/packet_definitions/ialirt_mag.xml +115 -0
  65. imap_processing/ialirt/utils/grouping.py +114 -0
  66. imap_processing/ialirt/utils/time.py +29 -0
  67. imap_processing/idex/atomic_masses.csv +22 -0
  68. imap_processing/idex/decode.py +2 -2
  69. imap_processing/idex/idex_constants.py +25 -0
  70. imap_processing/idex/idex_l1a.py +6 -7
  71. imap_processing/idex/idex_l1b.py +4 -31
  72. imap_processing/idex/idex_l2a.py +789 -0
  73. imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +39 -33
  74. imap_processing/lo/l0/lo_science.py +6 -0
  75. imap_processing/lo/l1a/lo_l1a.py +0 -1
  76. imap_processing/lo/l1b/lo_l1b.py +177 -25
  77. imap_processing/mag/constants.py +8 -0
  78. imap_processing/mag/imap_mag_sdc-configuration_v001.yaml +6 -0
  79. imap_processing/mag/l0/decom_mag.py +10 -3
  80. imap_processing/mag/l1a/mag_l1a.py +22 -11
  81. imap_processing/mag/l1a/mag_l1a_data.py +28 -3
  82. imap_processing/mag/l1b/mag_l1b.py +190 -48
  83. imap_processing/mag/l1c/interpolation_methods.py +211 -0
  84. imap_processing/mag/l1c/mag_l1c.py +447 -9
  85. imap_processing/quality_flags.py +1 -0
  86. imap_processing/spacecraft/packet_definitions/scid_x252.xml +538 -0
  87. imap_processing/spacecraft/quaternions.py +123 -0
  88. imap_processing/spice/geometry.py +16 -19
  89. imap_processing/spice/repoint.py +120 -0
  90. imap_processing/swapi/l1/swapi_l1.py +4 -0
  91. imap_processing/swapi/l2/swapi_l2.py +0 -1
  92. imap_processing/swe/l1a/swe_l1a.py +47 -8
  93. imap_processing/swe/l1a/swe_science.py +5 -2
  94. imap_processing/swe/l1b/swe_l1b_science.py +103 -56
  95. imap_processing/swe/l2/swe_l2.py +60 -65
  96. imap_processing/swe/packet_definitions/swe_packet_definition.xml +1121 -1
  97. imap_processing/swe/utils/swe_constants.py +63 -0
  98. imap_processing/swe/utils/swe_utils.py +85 -28
  99. imap_processing/tests/ccsds/test_data/expected_output.xml +40 -1
  100. imap_processing/tests/ccsds/test_excel_to_xtce.py +23 -20
  101. imap_processing/tests/cdf/test_data/imap_instrument2_global_cdf_attrs.yaml +0 -2
  102. imap_processing/tests/codice/conftest.py +1 -1
  103. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
  104. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-singles_20241110193700_v0.0.0.cdf +0 -0
  105. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-ialirt_20241110193700_v0.0.0.cdf +0 -0
  106. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-omni_20241110193700_v0.0.0.cdf +0 -0
  107. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf +0 -0
  108. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-priorities_20241110193700_v0.0.0.cdf +0 -0
  109. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-sectored_20241110193700_v0.0.0.cdf +0 -0
  110. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
  111. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf +0 -0
  112. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
  113. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf +0 -0
  114. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf +0 -0
  115. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf +0 -0
  116. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf +0 -0
  117. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf +0 -0
  118. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf +0 -0
  119. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf +0 -0
  120. imap_processing/tests/codice/test_codice_l1a.py +110 -46
  121. imap_processing/tests/codice/test_decompress.py +4 -4
  122. imap_processing/tests/conftest.py +166 -10
  123. imap_processing/tests/ena_maps/conftest.py +51 -0
  124. imap_processing/tests/ena_maps/test_ena_maps.py +638 -109
  125. imap_processing/tests/ena_maps/test_map_utils.py +66 -43
  126. imap_processing/tests/ena_maps/test_spatial_utils.py +16 -20
  127. imap_processing/tests/hi/data/l0/H45_diag_fee_20250208.bin +0 -0
  128. imap_processing/tests/hi/data/l0/H45_diag_fee_20250208_verify.csv +205 -0
  129. imap_processing/tests/hi/test_hi_l1b.py +12 -15
  130. imap_processing/tests/hi/test_hi_l1c.py +234 -6
  131. imap_processing/tests/hi/test_l1a.py +30 -0
  132. imap_processing/tests/hi/test_science_direct_event.py +1 -1
  133. imap_processing/tests/hi/test_utils.py +24 -2
  134. imap_processing/tests/hit/helpers/l1_validation.py +39 -39
  135. imap_processing/tests/hit/test_data/hskp_sample.ccsds +0 -0
  136. imap_processing/tests/hit/test_data/imap_hit_l0_raw_20100105_v001.pkts +0 -0
  137. imap_processing/tests/hit/test_decom_hit.py +4 -0
  138. imap_processing/tests/hit/test_hit_l1a.py +24 -28
  139. imap_processing/tests/hit/test_hit_l1b.py +304 -40
  140. imap_processing/tests/hit/test_hit_l2.py +454 -0
  141. imap_processing/tests/hit/test_hit_utils.py +112 -2
  142. imap_processing/tests/hit/validation_data/hskp_sample_eu_3_6_2025.csv +89 -0
  143. imap_processing/tests/hit/validation_data/hskp_sample_raw.csv +89 -88
  144. imap_processing/tests/ialirt/test_data/l0/461971383-404.bin +0 -0
  145. imap_processing/tests/ialirt/test_data/l0/461971384-405.bin +0 -0
  146. imap_processing/tests/ialirt/test_data/l0/461971385-406.bin +0 -0
  147. imap_processing/tests/ialirt/test_data/l0/461971386-407.bin +0 -0
  148. imap_processing/tests/ialirt/test_data/l0/461971387-408.bin +0 -0
  149. imap_processing/tests/ialirt/test_data/l0/461971388-409.bin +0 -0
  150. imap_processing/tests/ialirt/test_data/l0/461971389-410.bin +0 -0
  151. imap_processing/tests/ialirt/test_data/l0/461971390-411.bin +0 -0
  152. imap_processing/tests/ialirt/test_data/l0/461971391-412.bin +0 -0
  153. imap_processing/tests/ialirt/test_data/l0/sample_decoded_i-alirt_data.csv +383 -0
  154. imap_processing/tests/ialirt/unit/test_grouping.py +81 -0
  155. imap_processing/tests/ialirt/unit/test_parse_mag.py +168 -0
  156. imap_processing/tests/ialirt/unit/test_process_swe.py +208 -3
  157. imap_processing/tests/ialirt/unit/test_time.py +16 -0
  158. imap_processing/tests/idex/conftest.py +62 -6
  159. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231218_v001.pkts +0 -0
  160. imap_processing/tests/idex/test_data/impact_14_tof_high_data.txt +4508 -4508
  161. imap_processing/tests/idex/test_idex_l1a.py +48 -4
  162. imap_processing/tests/idex/test_idex_l1b.py +3 -3
  163. imap_processing/tests/idex/test_idex_l2a.py +383 -0
  164. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20241022_v002.cdf +0 -0
  165. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20241022_v002.cdf +0 -0
  166. imap_processing/tests/lo/test_lo_l1b.py +148 -4
  167. imap_processing/tests/lo/test_lo_science.py +1 -0
  168. imap_processing/tests/mag/conftest.py +69 -0
  169. imap_processing/tests/mag/test_mag_decom.py +1 -1
  170. imap_processing/tests/mag/test_mag_l1a.py +38 -0
  171. imap_processing/tests/mag/test_mag_l1b.py +34 -53
  172. imap_processing/tests/mag/test_mag_l1c.py +251 -20
  173. imap_processing/tests/mag/test_mag_validation.py +109 -25
  174. imap_processing/tests/mag/validation/L1b/T009/MAGScience-normal-(2,2)-8s-20250204-16h39.csv +17 -0
  175. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-magi-out.csv +16 -16
  176. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-mago-out.csv +16 -16
  177. imap_processing/tests/mag/validation/L1b/T010/MAGScience-normal-(2,2)-8s-20250206-12h05.csv +17 -0
  178. imap_processing/tests/mag/validation/L1b/T011/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
  179. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-magi-out.csv +16 -16
  180. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-mago-out.csv +16 -16
  181. imap_processing/tests/mag/validation/L1b/T012/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
  182. imap_processing/tests/mag/validation/L1b/T012/data.bin +0 -0
  183. imap_processing/tests/mag/validation/L1b/T012/field_like_all_ranges.txt +19200 -0
  184. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-cal.cdf +0 -0
  185. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-in.csv +17 -0
  186. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-magi-out.csv +17 -0
  187. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-mago-out.csv +17 -0
  188. imap_processing/tests/mag/validation/imap_calibration_mag_20240229_v01.cdf +0 -0
  189. imap_processing/tests/spacecraft/__init__.py +0 -0
  190. imap_processing/tests/spacecraft/data/SSR_2024_190_20_08_12_0483851794_2_DA_apid0594_1packet.pkts +0 -0
  191. imap_processing/tests/spacecraft/test_quaternions.py +71 -0
  192. imap_processing/tests/spice/test_data/fake_repoint_data.csv +5 -0
  193. imap_processing/tests/spice/test_geometry.py +6 -9
  194. imap_processing/tests/spice/test_repoint.py +111 -0
  195. imap_processing/tests/swapi/test_swapi_l1.py +7 -3
  196. imap_processing/tests/swe/l0_data/2024051010_SWE_HK_packet.bin +0 -0
  197. imap_processing/tests/swe/l0_data/2024051011_SWE_CEM_RAW_packet.bin +0 -0
  198. imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_APP_HK_20240510_092742.csv +49 -0
  199. imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_CEM_RAW_20240510_092742.csv +593 -0
  200. imap_processing/tests/swe/test_swe_l1a.py +18 -0
  201. imap_processing/tests/swe/test_swe_l1a_cem_raw.py +52 -0
  202. imap_processing/tests/swe/test_swe_l1a_hk.py +68 -0
  203. imap_processing/tests/swe/test_swe_l1b_science.py +23 -4
  204. imap_processing/tests/swe/test_swe_l2.py +112 -30
  205. imap_processing/tests/test_cli.py +2 -2
  206. imap_processing/tests/test_utils.py +138 -16
  207. imap_processing/tests/ultra/data/l0/FM45_UltraFM45_Functional_2024-01-22T0105_20240122T010548.CCSDS +0 -0
  208. imap_processing/tests/ultra/data/l0/ultra45_raw_sc_ultraimgrates_20220530_00.csv +164 -0
  209. 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
  210. imap_processing/tests/ultra/data/mock_data.py +341 -0
  211. imap_processing/tests/ultra/unit/conftest.py +69 -26
  212. imap_processing/tests/ultra/unit/test_badtimes.py +2 -0
  213. imap_processing/tests/ultra/unit/test_cullingmask.py +4 -0
  214. imap_processing/tests/ultra/unit/test_de.py +12 -4
  215. imap_processing/tests/ultra/unit/test_decom_apid_881.py +44 -0
  216. imap_processing/tests/ultra/unit/test_spacecraft_pset.py +78 -0
  217. imap_processing/tests/ultra/unit/test_ultra_l1a.py +28 -12
  218. imap_processing/tests/ultra/unit/test_ultra_l1b.py +34 -6
  219. imap_processing/tests/ultra/unit/test_ultra_l1b_culling.py +22 -26
  220. imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +86 -51
  221. imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +94 -52
  222. imap_processing/ultra/l0/decom_tools.py +6 -5
  223. imap_processing/ultra/l1a/ultra_l1a.py +28 -56
  224. imap_processing/ultra/l1b/de.py +72 -28
  225. imap_processing/ultra/l1b/extendedspin.py +12 -14
  226. imap_processing/ultra/l1b/ultra_l1b.py +34 -9
  227. imap_processing/ultra/l1b/ultra_l1b_culling.py +65 -29
  228. imap_processing/ultra/l1b/ultra_l1b_extended.py +64 -19
  229. imap_processing/ultra/l1c/spacecraft_pset.py +86 -0
  230. imap_processing/ultra/l1c/ultra_l1c.py +7 -4
  231. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +112 -61
  232. imap_processing/ultra/lookup_tables/ultra_90_dps_exposure_compressed.cdf +0 -0
  233. imap_processing/ultra/utils/ultra_l1_utils.py +20 -2
  234. imap_processing/utils.py +68 -28
  235. {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/METADATA +8 -5
  236. {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/RECORD +250 -199
  237. imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +0 -237
  238. imap_processing/hi/l1a/housekeeping.py +0 -27
  239. imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-aggregated_20240429_v001.cdf +0 -0
  240. imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-singles_20240429_v001.cdf +0 -0
  241. imap_processing/tests/codice/data/imap_codice_l1a_hi-omni_20240429_v001.cdf +0 -0
  242. imap_processing/tests/codice/data/imap_codice_l1a_hi-sectored_20240429_v001.cdf +0 -0
  243. imap_processing/tests/codice/data/imap_codice_l1a_hskp_20100101_v001.cdf +0 -0
  244. imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-aggregated_20240429_v001.cdf +0 -0
  245. imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-singles_20240429_v001.cdf +0 -0
  246. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-angular_20240429_v001.cdf +0 -0
  247. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-priority_20240429_v001.cdf +0 -0
  248. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-species_20240429_v001.cdf +0 -0
  249. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-angular_20240429_v001.cdf +0 -0
  250. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-priority_20240429_v001.cdf +0 -0
  251. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-species_20240429_v001.cdf +0 -0
  252. imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-aggregated_20240429_v001.cdf +0 -0
  253. imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-singles_20240429_v001.cdf +0 -0
  254. imap_processing/tests/codice/data/imap_codice_l1b_hi-omni_20240429_v001.cdf +0 -0
  255. imap_processing/tests/codice/data/imap_codice_l1b_hi-sectored_20240429_v001.cdf +0 -0
  256. imap_processing/tests/codice/data/imap_codice_l1b_hskp_20100101_v001.cdf +0 -0
  257. imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-aggregated_20240429_v001.cdf +0 -0
  258. imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-singles_20240429_v001.cdf +0 -0
  259. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-angular_20240429_v001.cdf +0 -0
  260. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-priority_20240429_v001.cdf +0 -0
  261. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-species_20240429_v001.cdf +0 -0
  262. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-angular_20240429_v001.cdf +0 -0
  263. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-priority_20240429_v001.cdf +0 -0
  264. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-species_20240429_v001.cdf +0 -0
  265. imap_processing/tests/hi/data/l1/imap_hi_l1b_45sensor-de_20250415_v999.cdf +0 -0
  266. imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1251.pkts +0 -0
  267. imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1252.pkts +0 -0
  268. imap_processing/tests/hit/validation_data/hskp_sample_eu.csv +0 -89
  269. imap_processing/tests/hit/validation_data/sci_sample_raw1.csv +0 -29
  270. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231214_v001.pkts +0 -0
  271. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20100101_v001.cdf +0 -0
  272. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20100101_v001.cdf +0 -0
  273. imap_processing/tests/ultra/test_data/mock_data.py +0 -161
  274. imap_processing/ultra/l1c/pset.py +0 -40
  275. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50_theta-0.00_20240207T102740.CCSDS +0 -0
  276. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_7P_Phi0.0_BeamCal_LinearScan_phi0.04_theta-0.01_20230821T121304.CCSDS +0 -0
  277. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.CCSDS +0 -0
  278. /imap_processing/tests/ultra/{test_data → data}/l0/Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.CCSDS +0 -0
  279. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_auxdata_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
  280. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_enaphxtofhangimg_FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.csv +0 -0
  281. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultraimgrates_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
  282. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultrarawimgevent_FM45_7P_Phi00_BeamCal_LinearScan_phi004_theta-001_20230821T121304.csv +0 -0
  283. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E1.cdf +0 -0
  284. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E12.cdf +0 -0
  285. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E24.cdf +0 -0
  286. {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/LICENSE +0 -0
  287. {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/WHEEL +0 -0
  288. {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,168 @@
1
+ import numpy as np
2
+ import pandas as pd
3
+ import pytest
4
+ import xarray as xr
5
+
6
+ from imap_processing import imap_module_directory
7
+ from imap_processing.ialirt.l0.parse_mag import (
8
+ extract_magnetic_vectors,
9
+ get_pkt_counter,
10
+ get_status_data,
11
+ get_time,
12
+ parse_packet,
13
+ )
14
+ from imap_processing.utils import packet_file_to_datasets
15
+
16
+
17
+ @pytest.fixture(scope="session")
18
+ def xtce_mag_path():
19
+ """Returns the xtce directory."""
20
+ return imap_module_directory / "ialirt" / "packet_definitions" / "ialirt_mag.xml"
21
+
22
+
23
+ @pytest.fixture(scope="session")
24
+ def binary_packet_path():
25
+ """Returns the paths to the binary packets."""
26
+ directory = imap_module_directory / "tests" / "ialirt" / "test_data" / "l0"
27
+ filenames = [
28
+ "461971383-404.bin",
29
+ "461971384-405.bin",
30
+ "461971385-406.bin",
31
+ "461971386-407.bin",
32
+ "461971387-408.bin",
33
+ "461971388-409.bin",
34
+ "461971389-410.bin",
35
+ "461971390-411.bin",
36
+ "461971391-412.bin",
37
+ ]
38
+ return tuple(directory / fname for fname in filenames)
39
+
40
+
41
+ @pytest.fixture(scope="session")
42
+ def mag_test_data():
43
+ """Returns the test data directory."""
44
+ data_path = (
45
+ imap_module_directory
46
+ / "tests"
47
+ / "ialirt"
48
+ / "test_data"
49
+ / "l0"
50
+ / "sample_decoded_i-alirt_data.csv"
51
+ )
52
+ data = pd.read_csv(data_path)
53
+
54
+ return data
55
+
56
+
57
+ @pytest.fixture()
58
+ def xarray_data(binary_packet_path, xtce_mag_path):
59
+ """Create xarray data for multiple packets."""
60
+ apid = 1001
61
+
62
+ xarray_data = tuple(
63
+ packet_file_to_datasets(packet, xtce_mag_path, use_derived_value=False)[apid]
64
+ for packet in binary_packet_path
65
+ )
66
+
67
+ merged_xarray_data = xr.concat(xarray_data, dim="epoch")
68
+ return merged_xarray_data
69
+
70
+
71
+ @pytest.fixture()
72
+ def grouped_data():
73
+ """Creates grouped data for tests."""
74
+ epoch = np.arange(12)
75
+
76
+ # Example `src_seq_ctr` values for 3 groups:
77
+ # Group 0 - valid, all diffs = 1
78
+ # Group 1 - invalid, has a jump of 5
79
+ # Group 2 - valid, wraps at -16383
80
+ src_seq_ctr = np.concatenate(
81
+ [
82
+ np.arange(100, 104),
83
+ np.array([200, 205, 206, 207]),
84
+ np.array([16382, 16383, 0, 1]),
85
+ ],
86
+ dtype=np.int32,
87
+ )
88
+ mag_acq_tm_coarse = np.repeat(
89
+ np.array([461971382, 461971386, 461971390], dtype=np.uint32), repeats=4
90
+ )
91
+
92
+ mag_acq_tm_fine = np.array(
93
+ [1502, 1502, 1505, 1505, 1500, 1500, 1503, 1503, 1497, 1497, 1491, 1491]
94
+ )
95
+
96
+ group = np.tile(np.arange(3), 4).reshape(4, 3).T.ravel()
97
+
98
+ grouped_data = xr.Dataset(
99
+ data_vars={
100
+ "src_seq_ctr": ("epoch", src_seq_ctr),
101
+ "mag_acq_tm_coarse": ("epoch", mag_acq_tm_coarse),
102
+ "mag_acq_tm_fine": ("epoch", mag_acq_tm_fine),
103
+ },
104
+ coords={"epoch": epoch, "group": ("epoch", group)},
105
+ )
106
+
107
+ return grouped_data
108
+
109
+
110
+ def test_get_pkt_counter(xarray_data):
111
+ """Tests the get_pkt_counter function."""
112
+ status_values = xarray_data["mag_status"].values
113
+ pkt_counter = get_pkt_counter(status_values)
114
+ assert np.array_equal(pkt_counter, np.array([0, 1, 2, 3, 0, 1, 2, 3, 0]))
115
+
116
+
117
+ def test_get_status_data(xarray_data, mag_test_data):
118
+ """Tests the get_status_data function."""
119
+
120
+ status_data = get_status_data(
121
+ xarray_data["mag_status"].values[0:4], np.array([0, 1, 2, 3])
122
+ )
123
+ index = mag_test_data["PRI_COARSETM"] == 461971382
124
+ matching_row = mag_test_data[index]
125
+
126
+ for key in status_data.keys():
127
+ assert status_data[key] == matching_row[key.upper()].values[0]
128
+
129
+
130
+ def test_get_time(grouped_data):
131
+ """Tests the get_time function."""
132
+ time_data = get_time(grouped_data, 1, np.array([0, 1, 2, 3]))
133
+ assert time_data == {
134
+ "pri_coarsetm": 461971386,
135
+ "pri_fintm": 1500,
136
+ "sec_coarsetm": 461971386,
137
+ "sec_fintm": 1503,
138
+ }
139
+
140
+
141
+ def test_extract_magnetic_vectors():
142
+ """Tests the extract_magnetic_vectors function."""
143
+ science_values = xr.DataArray(
144
+ data=np.array([15797207, 5750698, 15921110, 2342918], dtype=np.uint32)
145
+ )
146
+
147
+ vectors = extract_magnetic_vectors(science_values)
148
+
149
+ assert vectors == {
150
+ "pri_x": 61707,
151
+ "pri_y": 55127,
152
+ "pri_z": 49066,
153
+ "sec_x": 62191,
154
+ "sec_y": 54819,
155
+ "sec_z": 49158,
156
+ }
157
+
158
+
159
+ def test_parse_packet(xarray_data, mag_test_data):
160
+ """Tests the parse_packet function."""
161
+ parsed_packets = parse_packet(xarray_data)
162
+
163
+ for packet in parsed_packets:
164
+ index = packet["pri_coarsetm"] == mag_test_data["PRI_COARSETM"]
165
+ matching_rows = mag_test_data[index]
166
+
167
+ for key in packet.keys():
168
+ assert packet[key] == matching_rows[key.upper()].values[0]
@@ -1,8 +1,23 @@
1
+ from unittest.mock import patch
2
+
1
3
  import numpy as np
2
4
  import pandas as pd
3
5
  import pytest
6
+ import xarray as xr
4
7
 
5
8
  from imap_processing import imap_module_directory
9
+ from imap_processing.ialirt.l0.process_swe import (
10
+ decompress_counts,
11
+ get_ialirt_energies,
12
+ normalize_counts,
13
+ phi_to_bin,
14
+ prepare_raw_counts,
15
+ process_swe,
16
+ )
17
+ from imap_processing.swe.utils.swe_constants import (
18
+ ESA_VOLTAGE_ROW_INDEX_DICT,
19
+ GEOMETRIC_FACTORS,
20
+ )
6
21
  from imap_processing.utils import packet_file_to_datasets
7
22
 
8
23
 
@@ -52,9 +67,9 @@ def xarray_data(binary_packet_path, xtce_swe_path):
52
67
  return xarray_data
53
68
 
54
69
 
55
- def test_decom_packets(xarray_data, swe_test_data):
56
- """This function checks that all instrument parameters are accounted for."""
57
-
70
+ @pytest.fixture()
71
+ def fields_to_test():
72
+ """Create a dictionary to convert names"""
58
73
  fields_to_test = {
59
74
  "swe_shcoarse": "SHCOARSE",
60
75
  "swe_acq_sec": "ACQUISITION_TIME",
@@ -91,6 +106,19 @@ def test_decom_packets(xarray_data, swe_test_data):
91
106
  "swe_cem7_e3": "ELEC_COUNTS_SPIN_I_POL_6_E_2J",
92
107
  "swe_cem7_e4": "ELEC_COUNTS_SPIN_I_POL_6_E_3J",
93
108
  }
109
+ return fields_to_test
110
+
111
+
112
+ def test_get_energy():
113
+ """Tests get_alirt_energies function."""
114
+ energies = get_ialirt_energies()
115
+
116
+ for i in range(len(energies)):
117
+ assert i + 11 == ESA_VOLTAGE_ROW_INDEX_DICT[energies[i]]
118
+
119
+
120
+ def test_decom_packets(xarray_data, swe_test_data, fields_to_test):
121
+ """This function checks that all instrument parameters are accounted for."""
94
122
  _, index, test_index = np.intersect1d(
95
123
  xarray_data["swe_shcoarse"], swe_test_data["SHCOARSE"], return_indices=True
96
124
  )
@@ -104,3 +132,180 @@ def test_decom_packets(xarray_data, swe_test_data):
104
132
  f"Mismatch found in {xarray_field}: "
105
133
  f"actual {actual_values}, expected {expected_values}"
106
134
  )
135
+
136
+
137
+ def test_decompress_counts():
138
+ """Test that we get correct decompressed counts from the algorithm."""
139
+ expected_value = 24063
140
+ input_count = 230
141
+ returned_value = decompress_counts(np.array([input_count]))
142
+ assert np.all(expected_value == returned_value)
143
+
144
+
145
+ def test_phi_to_bin():
146
+ """Test phi_to_bin function."""
147
+
148
+ # Define expected phi-to-bin mapping for one full spin
149
+ phis = np.arange(12, 361, 12).tolist()
150
+
151
+ expected_bins = np.arange(30)
152
+
153
+ for phi, expected_bin in zip(phis, expected_bins):
154
+ assert phi_to_bin(phi) == expected_bin
155
+
156
+
157
+ def test_prepare_raw_counts():
158
+ """Test that prepare_raw_counts correctly bins counts into (30, 7, 4) array."""
159
+
160
+ # 2 rows = 4 phis (12, 24, 36, 48)
161
+ epochs = [0, 1]
162
+
163
+ data = {
164
+ "group": ("epoch", [1, 1]), # Both rows belong to group 1
165
+ # CEM 1 (Phi 12, 24, 36, 48)
166
+ "swe_cem1_e1": ("epoch", [1, 9]),
167
+ "swe_cem1_e2": ("epoch", [2, 10]),
168
+ "swe_cem1_e3": ("epoch", [3, 11]),
169
+ "swe_cem1_e4": ("epoch", [4, 12]),
170
+ # CEM 2
171
+ "swe_cem2_e1": ("epoch", [5, 13]),
172
+ "swe_cem2_e2": ("epoch", [6, 14]),
173
+ "swe_cem2_e3": ("epoch", [7, 15]),
174
+ "swe_cem2_e4": ("epoch", [8, 16]),
175
+ "swe_seq": ("epoch", [0, 1]),
176
+ }
177
+
178
+ grouped_data = xr.Dataset(data, coords={"epoch": epochs})
179
+ group_mask = grouped_data["group"] == 1
180
+ grouped = grouped_data.sel(epoch=group_mask)
181
+
182
+ raw_counts = prepare_raw_counts(grouped, cem_number=2)
183
+
184
+ # Expected shape (8, 7, 30) but only some CEMs are used.
185
+ expected = np.zeros((8, 2, 30), dtype=np.uint8)
186
+
187
+ # Phi bins for 12, 24, 36, 48)
188
+ phi_bin_12 = 0 # Phi 12
189
+ phi_bin_24 = 1 # Phi 24
190
+ phi_bin_36 = 2 # Phi 36
191
+ phi_bin_48 = 3 # Phi 48
192
+
193
+ # CEM 1, Phi 12 (E1, E2)
194
+ expected[1, 0, phi_bin_12] = 1
195
+ expected[5, 0, phi_bin_12] = 2
196
+
197
+ # CEM 1, Phi 24 (E3, E4)
198
+ expected[7, 0, phi_bin_24] = 3
199
+ expected[3, 0, phi_bin_24] = 4
200
+
201
+ # CEM 1, Phi 36 (E1, E2)
202
+ expected[1, 0, phi_bin_36] = 9
203
+ expected[5, 0, phi_bin_36] = 10
204
+
205
+ # CEM 1, Phi 48 (E3, E4)
206
+ expected[7, 0, phi_bin_48] = 11
207
+ expected[3, 0, phi_bin_48] = 12
208
+
209
+ # CEM 2, Phi 12 (E1, E2)
210
+ expected[1, 1, phi_bin_12] = 5
211
+ expected[5, 1, phi_bin_12] = 6
212
+
213
+ # CEM 2, Phi 24 (E3, E4)
214
+ expected[7, 1, phi_bin_24] = 7
215
+ expected[3, 1, phi_bin_24] = 8
216
+
217
+ # CEM 2, Phi 36 (E1, E2)
218
+ expected[1, 1, phi_bin_36] = 13
219
+ expected[5, 1, phi_bin_36] = 14
220
+
221
+ # CEM 2, Phi 48 (E3, E4)
222
+ expected[7, 1, phi_bin_48] = 15
223
+ expected[3, 1, phi_bin_48] = 16
224
+
225
+ assert np.array_equal(raw_counts, expected)
226
+
227
+
228
+ def test_norm_counts():
229
+ """Tests normalize_counts function"""
230
+
231
+ # Shape (2, 7, 3) for a small test case
232
+ corrected_counts = np.array(
233
+ [
234
+ [
235
+ [1, 2, 3],
236
+ [4, 5, 6],
237
+ [7, 8, 9],
238
+ [10, 11, 12],
239
+ [13, 14, 15],
240
+ [16, 17, 18],
241
+ [19, 20, 21],
242
+ ],
243
+ [
244
+ [2, 4, 6],
245
+ [8, 10, 12],
246
+ [14, 16, 18],
247
+ [20, 22, 24],
248
+ [26, 28, 30],
249
+ [32, 34, 36],
250
+ [38, 40, 42],
251
+ ],
252
+ ],
253
+ dtype=np.uint8,
254
+ )
255
+
256
+ latest_cal = pd.Series(
257
+ [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0],
258
+ index=[
259
+ "cem1",
260
+ "cem2",
261
+ "cem3",
262
+ "cem4",
263
+ "cem5",
264
+ "cem6",
265
+ "cem7",
266
+ ], # Simulating real data structure
267
+ dtype=np.float64,
268
+ )
269
+ expected = np.zeros((2, 7, 3), dtype=np.float64)
270
+
271
+ for i in range(2):
272
+ for j in range(7):
273
+ for k in range(3):
274
+ if corrected_counts[i][j][k] < 0:
275
+ expected[i][j][k] = 0.0
276
+ else:
277
+ expected[i][j][k] = (
278
+ corrected_counts[i][j][k] * latest_cal[j] / GEOMETRIC_FACTORS[j]
279
+ )
280
+
281
+ norm_counts = normalize_counts(corrected_counts, latest_cal)
282
+
283
+ assert np.allclose(norm_counts, expected, atol=1e-9)
284
+
285
+
286
+ @patch(
287
+ "imap_processing.ialirt.l0.process_swe.read_in_flight_cal_data",
288
+ return_value=pd.DataFrame(
289
+ {
290
+ "met_time": [453051300, 453051900],
291
+ "cem1": [1, 2],
292
+ "cem2": [1, 2],
293
+ "cem3": [1, 2],
294
+ "cem4": [1, 2],
295
+ "cem5": [1, 2],
296
+ "cem6": [1, 2],
297
+ "cem7": [1, 2],
298
+ }
299
+ ),
300
+ )
301
+ def test_process_swe(mock_read_cal, swe_test_data, fields_to_test):
302
+ """Test processing for swe."""
303
+ swe_test_data = swe_test_data.rename(
304
+ columns={v: k for k, v in fields_to_test.items()}
305
+ )
306
+ swe_test_data.index.name = "epoch"
307
+ ds = swe_test_data.to_xarray()
308
+ ds["src_seq_ctr"] = ("epoch", np.arange(len(ds["swe_shcoarse"])))
309
+ swe_data = process_swe(ds)
310
+
311
+ assert swe_data == []
@@ -0,0 +1,16 @@
1
+ """Tests grouping functions for I-ALiRT instruments."""
2
+
3
+ import numpy as np
4
+
5
+ from imap_processing.ialirt.utils.time import calculate_time
6
+
7
+
8
+ def test_calculate_time():
9
+ """Tests calculate_time function."""
10
+
11
+ coarse = np.array([1, 2, 3, 4, 5])
12
+ fine = np.array([0, 1, 2, 3, 4])
13
+
14
+ time = calculate_time(coarse, fine, 6553)
15
+
16
+ np.testing.assert_allclose(time, coarse + fine / 65535.0, atol=1e-03, rtol=0)
@@ -1,5 +1,3 @@
1
- from pathlib import Path
2
-
3
1
  import numpy as np
4
2
  import pytest
5
3
  import xarray as xr
@@ -7,6 +5,13 @@ import xarray as xr
7
5
  from imap_processing import imap_module_directory
8
6
  from imap_processing.idex.idex_l1a import PacketParser
9
7
 
8
+ TEST_DATA_PATH = imap_module_directory / "tests" / "idex" / "test_data"
9
+
10
+ TEST_L0_FILE = TEST_DATA_PATH / "imap_idex_l0_raw_20231218_v001.pkts"
11
+ L1A_EXAMPLE_FILE = TEST_DATA_PATH / "idex_l1a_validation_file.h5"
12
+
13
+ pytestmark = pytest.mark.external_test_data
14
+
10
15
  SPICE_ARRAYS = [
11
16
  "ephemeris_position_x",
12
17
  "ephemeris_position_y",
@@ -30,10 +35,20 @@ def decom_test_data() -> xr.Dataset:
30
35
  dataset : xarray.Dataset
31
36
  A ``xarray`` dataset containing the test data
32
37
  """
33
- test_file = Path(
34
- f"{imap_module_directory}/tests/idex/test_data/imap_idex_l0_raw_20231214_v001.pkts"
35
- )
36
- return PacketParser(test_file, "001").data
38
+ return PacketParser(TEST_L0_FILE, "001").data
39
+
40
+
41
+ @pytest.fixture(scope="session")
42
+ def l1a_example_data(_download_test_data):
43
+ """
44
+ Pytest fixture to load example L1A data (produced by the IDEX team) for testing.
45
+
46
+ Returns
47
+ -------
48
+ dict
49
+ A dictionary containing the 6 waveform and telemetry arrays
50
+ """
51
+ return load_hdf_file(L1A_EXAMPLE_FILE)
37
52
 
38
53
 
39
54
  def get_spice_data_side_effect_func(l1a_ds, idex_attrs):
@@ -48,3 +63,44 @@ def get_spice_data_side_effect_func(l1a_ds, idex_attrs):
48
63
  )
49
64
  for name in SPICE_ARRAYS
50
65
  }
66
+
67
+
68
+ def load_hdf_file(path: str) -> xr.Dataset:
69
+ """
70
+ Loads an HDF5 file produced by the IDEX team into a dataset.
71
+
72
+ Parameters
73
+ ----------
74
+ path : str
75
+ The file path to the HDF5 file.
76
+
77
+ Returns
78
+ -------
79
+ dataset
80
+ A dataset containing the extracted data.
81
+ """
82
+ # Load hdf5 data into a datatree
83
+ datatree = xr.open_datatree(path, engine="netcdf4")
84
+ datasets = []
85
+ # Sort datatree by the event number
86
+ datatree = sorted(datatree.items(), key=lambda x: int(x[0]))
87
+ # Iterate through every nested tree in the datatree (Each nested tree represents
88
+ # data from one event).
89
+ # Rename the dimensions across every tree to be the same
90
+ # Add an "event" dimension which will allow them all to be concatenated together.
91
+ for event, tree in datatree:
92
+ event_num = int(event)
93
+ # Extract the metadata
94
+ metadata = tree.Metadata.to_dataset().expand_dims({"event": [event_num]})
95
+ ds = tree.to_dataset()
96
+ # Sort dimensions by shape. The high sampling time dimension is always less
97
+ # than the low sampling time.
98
+ dims = [k for k, v in sorted(ds.dims.items(), key=lambda item: item[1])]
99
+ ds = ds.rename({dims[0]: "time_low", dims[1]: "time_high"}).expand_dims(
100
+ {"event": [event_num]}
101
+ )
102
+ datasets.append(xr.merge([ds, metadata]))
103
+
104
+ example_dataset = xr.concat(datasets, dim="event")
105
+
106
+ return example_dataset