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
@@ -1,76 +1,82 @@
1
- """Pytest plugin module for test data paths"""
1
+ """Pytest plugin module for test data paths."""
2
2
 
3
3
  from unittest import mock
4
4
 
5
5
  import numpy as np
6
6
  import pytest
7
+ import xarray as xr
7
8
 
8
- from imap_processing import decom, imap_module_directory
9
- from imap_processing.ultra.l0.decom_ultra import process_ultra_apids
9
+ from imap_processing import imap_module_directory
10
+ from imap_processing.ultra.l0.decom_ultra import (
11
+ process_ultra_events,
12
+ process_ultra_rates,
13
+ process_ultra_tof,
14
+ )
10
15
  from imap_processing.ultra.l0.ultra_utils import (
11
16
  ULTRA_AUX,
12
17
  ULTRA_EVENTS,
13
18
  ULTRA_RATES,
19
+ ULTRA_TOF,
14
20
  )
15
- from imap_processing.ultra.l1a import ultra_l1a
21
+ from imap_processing.ultra.l1a.ultra_l1a import ultra_l1a
16
22
  from imap_processing.ultra.l1b.ultra_l1b import ultra_l1b
17
- from imap_processing.utils import group_by_apid
23
+ from imap_processing.utils import packet_file_to_datasets
18
24
 
19
25
 
20
- @pytest.fixture()
26
+ @pytest.fixture
21
27
  def ccsds_path():
22
28
  """Returns the ccsds directory."""
23
29
  return (
24
30
  imap_module_directory
25
31
  / "tests"
26
32
  / "ultra"
27
- / "test_data"
33
+ / "data"
28
34
  / "l0"
29
35
  / "Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.CCSDS"
30
36
  )
31
37
 
32
38
 
33
- @pytest.fixture()
39
+ @pytest.fixture
34
40
  def ccsds_path_events():
35
41
  """Returns the ccsds directory."""
36
42
  return (
37
43
  imap_module_directory
38
44
  / "tests"
39
45
  / "ultra"
40
- / "test_data"
46
+ / "data"
41
47
  / "l0"
42
48
  / "FM45_7P_Phi0.0_BeamCal_LinearScan_phi0.04_theta-0.01_20230821T121304.CCSDS"
43
49
  )
44
50
 
45
51
 
46
- @pytest.fixture()
52
+ @pytest.fixture
47
53
  def ccsds_path_theta_0():
48
54
  """Returns the ccsds directory."""
49
55
  return (
50
56
  imap_module_directory
51
57
  / "tests"
52
58
  / "ultra"
53
- / "test_data"
59
+ / "data"
54
60
  / "l0"
55
61
  / "FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50_theta-0.00"
56
62
  "_20240207T102740.CCSDS"
57
63
  )
58
64
 
59
65
 
60
- @pytest.fixture()
66
+ @pytest.fixture
61
67
  def ccsds_path_tof():
62
68
  """Returns the ccsds directory."""
63
69
  return (
64
70
  imap_module_directory
65
71
  / "tests"
66
72
  / "ultra"
67
- / "test_data"
73
+ / "data"
68
74
  / "l0"
69
75
  / "FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.CCSDS"
70
76
  )
71
77
 
72
78
 
73
- @pytest.fixture()
79
+ @pytest.fixture
74
80
  def xtce_path():
75
81
  """Returns the xtce image rates directory."""
76
82
  return (
@@ -81,143 +87,143 @@ def xtce_path():
81
87
  )
82
88
 
83
89
 
84
- @pytest.fixture()
90
+ @pytest.fixture
85
91
  def rates_test_path():
86
92
  """Returns the xtce image rates test data directory."""
87
93
  filename = (
88
94
  "ultra45_raw_sc_ultraimgrates_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_"
89
95
  "20220530T225054.csv"
90
96
  )
91
- return imap_module_directory / "tests" / "ultra" / "test_data" / "l0" / filename
97
+ return imap_module_directory / "tests" / "ultra" / "data" / "l0" / filename
92
98
 
93
99
 
94
- @pytest.fixture()
100
+ @pytest.fixture
95
101
  def aux_test_path():
96
102
  """Returns the xtce auxiliary test data directory."""
97
103
  filename = (
98
- "ultra45_raw_sc_auxdata_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_"
99
- "20220530T225054.csv"
104
+ "ultra45_raw_sc_auxdata_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv"
100
105
  )
101
- return imap_module_directory / "tests" / "ultra" / "test_data" / "l0" / filename
106
+ return imap_module_directory / "tests" / "ultra" / "data" / "l0" / filename
102
107
 
103
108
 
104
- @pytest.fixture()
109
+ @pytest.fixture
105
110
  def events_test_path():
106
111
  """Returns the xtce auxiliary test data directory."""
107
112
  filename = (
108
113
  "ultra45_raw_sc_ultrarawimgevent_FM45_7P_Phi00_BeamCal_"
109
114
  "LinearScan_phi004_theta-001_20230821T121304.csv"
110
115
  )
111
- return imap_module_directory / "tests" / "ultra" / "test_data" / "l0" / filename
116
+ return imap_module_directory / "tests" / "ultra" / "data" / "l0" / filename
112
117
 
113
118
 
114
- @pytest.fixture()
119
+ @pytest.fixture
115
120
  def tof_test_path():
116
121
  """Returns the xtce auxiliary test data directory."""
117
122
  filename = (
118
123
  "ultra45_raw_sc_enaphxtofhangimg_FM45_TV_Cycle6_Hot_Ops_"
119
124
  "Front212_20240124T063837.csv"
120
125
  )
121
- return imap_module_directory / "tests" / "ultra" / "test_data" / "l0" / filename
126
+ return imap_module_directory / "tests" / "ultra" / "data" / "l0" / filename
122
127
 
123
128
 
124
- @pytest.fixture()
129
+ @pytest.fixture
125
130
  def decom_test_data(request, xtce_path):
126
131
  """Read test data from file"""
127
132
  apid = request.param["apid"]
128
133
  filename = request.param["filename"]
129
- ccsds_path = (
130
- imap_module_directory / "tests" / "ultra" / "test_data" / "l0" / filename
131
- )
134
+ ccsds_path = imap_module_directory / "tests" / "ultra" / "data" / "l0" / filename
135
+
136
+ datasets_by_apid = packet_file_to_datasets(ccsds_path, xtce_path)
132
137
 
133
- packets = decom.decom_packets(ccsds_path, xtce_path)
134
- grouped_data = group_by_apid(packets)
138
+ strategy_dict = {
139
+ ULTRA_TOF.apid[0]: process_ultra_tof,
140
+ ULTRA_EVENTS.apid[0]: process_ultra_events,
141
+ ULTRA_RATES.apid[0]: process_ultra_rates,
142
+ ULTRA_TOF.apid[1]: process_ultra_tof,
143
+ ULTRA_EVENTS.apid[1]: process_ultra_events,
144
+ ULTRA_RATES.apid[1]: process_ultra_rates,
145
+ }
135
146
 
136
- data_packet_list = process_ultra_apids(grouped_data[apid], apid)
137
- return data_packet_list, packets
147
+ process_function = strategy_dict.get(apid, lambda *args: False)
148
+ data_packet_xarray = process_function(datasets_by_apid[apid])
138
149
 
150
+ return data_packet_xarray
139
151
 
140
- @pytest.fixture()
152
+
153
+ @pytest.fixture
141
154
  def events_fsw_comparison_theta_0():
142
155
  """FSW test data."""
143
156
  filename = (
144
157
  "ultra45_raw_sc_ultrarawimg_withFSWcalcs_FM45_40P_Phi28p5_"
145
158
  "BeamCal_LinearScan_phi2850_theta-000_20240207T102740.csv"
146
159
  )
147
- return imap_module_directory / "tests" / "ultra" / "test_data" / "l0" / filename
160
+ return imap_module_directory / "tests" / "ultra" / "data" / "l0" / filename
148
161
 
149
162
 
150
- @pytest.fixture()
163
+ @pytest.fixture
151
164
  def de_dataset(ccsds_path_theta_0, xtce_path):
152
165
  """L1A test data"""
153
- packets = decom.decom_packets(ccsds_path_theta_0, xtce_path)
154
- grouped_data = group_by_apid(packets)
155
- decom_ultra_events = process_ultra_apids(
156
- grouped_data[ULTRA_EVENTS.apid[0]], ULTRA_EVENTS.apid[0]
157
- )
158
- decom_ultra_aux = process_ultra_apids(
159
- grouped_data[ULTRA_AUX.apid[0]], ULTRA_AUX.apid[0]
160
- )
161
- dataset = ultra_l1a.create_dataset(
162
- {
163
- ULTRA_EVENTS.apid[0]: decom_ultra_events,
164
- ULTRA_AUX.apid[0]: decom_ultra_aux,
165
- }
166
- )
167
- # Remove start_type with fill values
168
- l1a_de_dataset = dataset.where(
169
- dataset["START_TYPE"] != np.iinfo(np.int64).min, drop=True
170
- )
171
- return l1a_de_dataset
166
+ test_data = ultra_l1a(ccsds_path_theta_0, apid_input=ULTRA_EVENTS.apid[0])
167
+ return test_data[0]
172
168
 
173
169
 
174
- @pytest.fixture()
175
- def rates_dataset(ccsds_path_theta_0, xtce_path):
170
+ @pytest.fixture
171
+ def rates_dataset(ccsds_path_theta_0):
176
172
  """L1A test data"""
177
- packets = decom.decom_packets(ccsds_path_theta_0, xtce_path)
178
- grouped_data = group_by_apid(packets)
179
- decom_ultra_rates = process_ultra_apids(
180
- grouped_data[ULTRA_RATES.apid[0]], ULTRA_RATES.apid[0]
181
- )
182
- l1a_rates_dataset = ultra_l1a.create_dataset(
183
- {
184
- ULTRA_RATES.apid[0]: decom_ultra_rates,
185
- }
186
- )
187
- return l1a_rates_dataset
173
+ test_data = ultra_l1a(ccsds_path_theta_0, apid_input=ULTRA_RATES.apid[0])
174
+ return test_data[0]
188
175
 
189
176
 
190
- @pytest.fixture()
191
- def aux_dataset(ccsds_path_theta_0, xtce_path):
177
+ @pytest.fixture
178
+ def aux_dataset(ccsds_path_theta_0):
192
179
  """L1A test data"""
193
- packets = decom.decom_packets(ccsds_path_theta_0, xtce_path)
194
- grouped_data = group_by_apid(packets)
195
- decom_ultra_aux = process_ultra_apids(
196
- grouped_data[ULTRA_AUX.apid[0]], ULTRA_AUX.apid[0]
197
- )
198
- l1a_aux_dataset = ultra_l1a.create_dataset(
199
- {
200
- ULTRA_AUX.apid[0]: decom_ultra_aux,
201
- }
180
+ test_data = ultra_l1a(ccsds_path_theta_0, apid_input=ULTRA_AUX.apid[0])
181
+ return test_data[0]
182
+
183
+
184
+ @pytest.fixture
185
+ def faux_aux_dataset():
186
+ """Fixture to compute and return aux test data."""
187
+
188
+ num_spins = 15
189
+ spin_duration = 15 # in seconds
190
+
191
+ epoch = np.arange(0, num_spins, 1)
192
+ spin_number = np.arange(127, 142)
193
+ spin_start_time = np.arange(1905, 2115 + spin_duration, spin_duration)
194
+ spin_period_sec = np.full(num_spins, 15)
195
+ spin_period_sec[-1] = 14
196
+ spin_start_sec = np.arange(1905, 2130, 15)
197
+ spin_start_subsec = np.zeros(num_spins)
198
+
199
+ test_aux_dataset = xr.Dataset(
200
+ data_vars={
201
+ "TIMESPINSTART": ("epoch", spin_start_sec),
202
+ "TIMESPINSTARTSUB": ("epoch", spin_start_subsec),
203
+ "DURATION": ("epoch", spin_period_sec),
204
+ "SPINNUMBER": ("epoch", spin_number),
205
+ "TIMESPINDATA": ("epoch", spin_start_time),
206
+ "SPINPERIOD": ("epoch", spin_period_sec),
207
+ },
208
+ coords={"epoch": ("epoch", epoch)},
202
209
  )
203
- return l1a_aux_dataset
210
+
211
+ return test_aux_dataset
204
212
 
205
213
 
206
- @pytest.fixture()
214
+ @pytest.fixture
207
215
  @mock.patch("imap_processing.ultra.l1b.de.get_annotated_particle_velocity")
208
- def l1b_datasets(
209
- mock_get_annotated_particle_velocity, de_dataset, use_fake_spin_data_for_time
216
+ def l1b_de_dataset(
217
+ mock_get_annotated_particle_velocity,
218
+ de_dataset,
219
+ use_fake_spin_data_for_time,
210
220
  ):
211
221
  """L1B test data"""
212
222
 
213
223
  data_dict = {}
214
224
  data_dict[de_dataset.attrs["Logical_source"]] = de_dataset
215
- # TODO: this is a placeholder for the hk dataset.
216
- data_dict["imap_ultra_l1a_45sensor-hk"] = aux_dataset
217
- data_dict["imap_ultra_l1a_45sensor-rates"] = rates_dataset
218
- use_fake_spin_data_for_time(
219
- de_dataset["EVENTTIMES"][0], de_dataset["EVENTTIMES"][-1]
220
- )
225
+ # Create a spin table that cover spin 0-141
226
+ use_fake_spin_data_for_time(0, 141 * 15)
221
227
 
222
228
  # Mock get_annotated_particle_velocity to avoid needing kernels
223
229
  def side_effect_func(event_times, position, ultra_frame, dps_frame, sc_frame):
@@ -235,6 +241,26 @@ def l1b_datasets(
235
241
 
236
242
  mock_get_annotated_particle_velocity.side_effect = side_effect_func
237
243
 
238
- output_datasets = ultra_l1b(data_dict, data_version="001")
244
+ output_datasets = ultra_l1b(data_dict)
245
+
246
+ return output_datasets
247
+
248
+
249
+ @pytest.fixture
250
+ def l1b_extendedspin_dataset(
251
+ l1b_de_dataset,
252
+ rates_dataset,
253
+ faux_aux_dataset,
254
+ ):
255
+ """L1B de test data"""
256
+ data_dict = {}
257
+ data_dict["imap_ultra_l1b_45sensor-de"] = l1b_de_dataset[0]
258
+ data_dict["imap_ultra_l1a_45sensor-aux"] = faux_aux_dataset
259
+ # TODO: this is a placeholder for the hk dataset.
260
+ data_dict["imap_ultra_l1a_45sensor-hk"] = faux_aux_dataset
261
+ data_dict["imap_ultra_l1a_45sensor-rates"] = rates_dataset
262
+ data_dict["imap_ultra_l1a_45sensor-params"] = l1b_de_dataset[0]
263
+
264
+ output_datasets = ultra_l1b(data_dict)
239
265
 
240
266
  return output_datasets
@@ -11,6 +11,7 @@ def test_calculate_badtimes():
11
11
 
12
12
  spin_numbers = np.array([0, 1, 2, 3])
13
13
  energy_bins = np.array([10, 20, 30, 40])
14
+ spin_start_time = np.array([0, 1, 2, 3])
14
15
 
15
16
  quality_attitude = np.full(
16
17
  spin_numbers.shape, ImapAttitudeUltraFlags.NONE.value, dtype=np.uint16
@@ -31,11 +32,13 @@ def test_calculate_badtimes():
31
32
 
32
33
  ds = xr.Dataset(
33
34
  {
35
+ "epoch": np.array([0, 1, 2, 3], dtype="datetime64[ns]"),
34
36
  "quality_attitude": (("spin_number",), quality_attitude),
35
37
  "quality_ena_rates": (
36
38
  ("energy_bin_geometric_mean", "spin_number"),
37
39
  quality_ena_rates,
38
40
  ),
41
+ "spin_start_time": (("spin_number",), spin_start_time),
39
42
  },
40
43
  coords={
41
44
  "spin_number": spin_numbers,
@@ -43,14 +46,11 @@ def test_calculate_badtimes():
43
46
  },
44
47
  )
45
48
 
46
- culling_ds = calculate_cullingmask(
47
- ds, name="imap_ultra_l1b_45sensor-badtimes", data_version="v1"
48
- )
49
+ culling_ds = calculate_cullingmask(ds, name="imap_ultra_l1b_45sensor-badtimes")
49
50
  badtimes_ds = calculate_badtimes(
50
51
  ds,
51
52
  culling_ds["spin_number"].values,
52
53
  name="imap_ultra_l1b_45sensor-badtimes",
53
- data_version="v1",
54
54
  )
55
55
 
56
56
  assert not np.any(
@@ -10,6 +10,7 @@ def test_calculate_cullingmask_attitude():
10
10
 
11
11
  spin_numbers = np.array([0, 1])
12
12
  energy_bins = np.array([10, 20, 30, 40])
13
+ spin_start_time = np.array([0, 1])
13
14
 
14
15
  quality_attitude = np.full(
15
16
  spin_numbers.shape, ImapAttitudeUltraFlags.NONE.value, dtype=np.uint16
@@ -24,11 +25,13 @@ def test_calculate_cullingmask_attitude():
24
25
 
25
26
  ds = xr.Dataset(
26
27
  {
28
+ "epoch": np.array([0, 1, 2, 3], dtype="datetime64[ns]"),
27
29
  "quality_attitude": (("spin_number",), quality_attitude),
28
30
  "quality_ena_rates": (
29
31
  ("energy_bin_geometric_mean", "spin_number"),
30
32
  quality_ena_rates,
31
33
  ),
34
+ "spin_start_time": (("spin_number",), spin_start_time),
32
35
  },
33
36
  coords={
34
37
  "spin_number": spin_numbers,
@@ -36,9 +39,7 @@ def test_calculate_cullingmask_attitude():
36
39
  },
37
40
  )
38
41
 
39
- result_ds = calculate_cullingmask(
40
- ds, name="imap_ultra_l1b_45sensor-cullingmask", data_version="v1"
41
- )
42
+ result_ds = calculate_cullingmask(ds, name="imap_ultra_l1b_45sensor-cullingmask")
42
43
 
43
44
  np.testing.assert_array_equal(result_ds["spin_number"].values, np.array([0]))
44
45
 
@@ -47,6 +48,7 @@ def test_calculate_cullingmask_rates():
47
48
  """Test calculate_cullingmask for rates culling."""
48
49
  spin_numbers = np.array([0, 1, 2, 3])
49
50
  energy_bins = np.array([10, 20, 30, 40])
51
+ spin_start_time = np.array([0, 1, 2, 3])
50
52
 
51
53
  quality_attitude = np.full(
52
54
  spin_numbers.shape, ImapAttitudeUltraFlags.NONE.value, dtype=np.uint16
@@ -72,16 +74,16 @@ def test_calculate_cullingmask_rates():
72
74
  ("energy_bin_geometric_mean", "spin_number"),
73
75
  quality_ena_rates,
74
76
  ),
77
+ "spin_start_time": (("spin_number",), spin_start_time),
75
78
  },
76
79
  coords={
80
+ "epoch": np.array([0, 1, 2, 3], dtype="datetime64[ns]"),
77
81
  "spin_number": spin_numbers,
78
82
  "energy_bin_geometric_mean": energy_bins,
79
83
  },
80
84
  )
81
85
 
82
- result_ds = calculate_cullingmask(
83
- ds, name="imap_ultra_l1b_45sensor-cullingmask", data_version="v1"
84
- )
86
+ result_ds = calculate_cullingmask(ds, name="imap_ultra_l1b_45sensor-cullingmask")
85
87
 
86
88
  expected_spins = np.array([0, 1])
87
89
  np.testing.assert_array_equal(result_ds["spin_number"].values, expected_spins)
@@ -7,7 +7,7 @@ import pytest
7
7
  from imap_processing.ultra.constants import UltraConstants
8
8
 
9
9
 
10
- @pytest.fixture()
10
+ @pytest.fixture
11
11
  def df_filt(de_dataset, events_fsw_comparison_theta_0):
12
12
  """Fixture to import test dataset."""
13
13
  df = pd.read_csv(events_fsw_comparison_theta_0)
@@ -17,10 +17,13 @@ def df_filt(de_dataset, events_fsw_comparison_theta_0):
17
17
  return df_filt
18
18
 
19
19
 
20
- def test_calculate_de(l1b_datasets, df_filt):
20
+ def test_calculate_de(l1b_de_dataset, df_filt):
21
21
  """Tests calculate_de function."""
22
22
 
23
- l1b_de_dataset = l1b_datasets[0]
23
+ l1b_de_dataset = l1b_de_dataset[0]
24
+ l1b_de_dataset = l1b_de_dataset.where(
25
+ l1b_de_dataset["start_type"] != 255, drop=True
26
+ )
24
27
  # Front and back positions
25
28
  assert np.allclose(l1b_de_dataset["x_front"].data, df_filt["Xf"].astype("float"))
26
29
  assert np.allclose(l1b_de_dataset["y_front"], df_filt["Yf"].astype("float"))
@@ -60,7 +63,7 @@ def test_calculate_de(l1b_datasets, df_filt):
60
63
  & (l1b_de_dataset["tof_corrected"] < UltraConstants.CTOF_SPECIES_MAX)
61
64
  )[0]
62
65
  ]
63
- assert np.all(species_array == "H")
66
+ assert np.all(species_array == 1)
64
67
 
65
68
  # Velocities in various frames
66
69
  test_tof = l1b_de_dataset["tof_start_stop"]
@@ -94,8 +97,13 @@ def test_calculate_de(l1b_datasets, df_filt):
94
97
  rtol=1e-2,
95
98
  )
96
99
  assert np.allclose(
97
- l1b_de_dataset["azimuth"].values[condition],
98
- df_filt["event_phi"].astype("float").values[condition] % (2 * np.pi),
100
+ l1b_de_dataset["phi"].values,
101
+ df_filt["phi"].astype("float").values,
102
+ rtol=1e-2,
103
+ )
104
+ assert np.allclose(
105
+ l1b_de_dataset["theta"].values,
106
+ df_filt["theta"].astype("float").values,
99
107
  rtol=1e-2,
100
108
  )
101
109
 
@@ -105,10 +113,3 @@ def test_calculate_de(l1b_datasets, df_filt):
105
113
  len(l1b_de_dataset["epoch"]),
106
114
  3,
107
115
  )
108
-
109
- # Event efficiency
110
- assert np.allclose(
111
- l1b_de_dataset["event_efficiency"],
112
- np.full(len(l1b_de_dataset["epoch"]), np.nan),
113
- equal_nan=True,
114
- )
@@ -3,96 +3,47 @@ import pandas as pd
3
3
  import pytest
4
4
 
5
5
  from imap_processing.ultra.l0.ultra_utils import ULTRA_AUX
6
- from imap_processing.utils import group_by_apid
6
+ from imap_processing.utils import packet_file_to_datasets
7
7
 
8
8
 
9
- @pytest.mark.parametrize(
10
- "decom_test_data",
11
- [
12
- pytest.param(
13
- {
14
- "apid": ULTRA_AUX.apid[0],
15
- "filename": "Ultra45_EM_SwRI_Cal_Run7_"
16
- "ThetaScan_20220530T225054.CCSDS",
17
- }
18
- )
19
- ],
20
- indirect=True,
21
- )
22
- def test_aux_enumerated(decom_test_data):
23
- """Test if enumerated values derived correctly"""
24
-
25
- _, packets = decom_test_data
26
-
27
- count = 0 # count number of packets with APID 880
28
- total_packets = 23
29
-
30
- grouped_data = group_by_apid(packets)
31
- apid_data = grouped_data[880]
9
+ @pytest.fixture
10
+ def decom_ultra_aux_data(ccsds_path, xtce_path):
11
+ """Data for decom_ultra_aux"""
32
12
 
33
- for packet in apid_data:
34
- assert packet["SPINPERIODVALID"] == "INVALID"
35
- assert packet["SPINPHASEVALID"] == "VALID"
36
- assert packet["SPINPERIODSOURCE"] == "NOMINAL"
37
- assert packet["CATBEDHEATERFLAG"] == "UNFLAGGED"
38
- count += 1
13
+ datasets_by_apid = packet_file_to_datasets(ccsds_path, xtce_path)
14
+ decom_ultra_dataset = datasets_by_apid[ULTRA_AUX.apid[0]]
15
+ return decom_ultra_dataset
39
16
 
40
- assert count == total_packets
41
17
 
42
-
43
- @pytest.mark.parametrize(
44
- "decom_test_data",
45
- [
46
- pytest.param(
47
- {
48
- "apid": ULTRA_AUX.apid[0],
49
- "filename": "Ultra45_EM_SwRI_Cal_Run7_"
50
- "ThetaScan_20220530T225054.CCSDS",
51
- }
52
- )
53
- ],
54
- indirect=True,
55
- )
56
- def test_aux_mode(decom_test_data):
18
+ def test_aux_modes(decom_ultra_aux_data):
57
19
  """Test if enumerated values derived correctly"""
58
20
 
59
- _, packets = decom_test_data
21
+ assert np.all(decom_ultra_aux_data["spinperiodvalid"] == 0)
22
+ assert np.all(decom_ultra_aux_data["spinphasevalid"] == 1)
23
+ assert np.all(decom_ultra_aux_data["spinperiodsource"] == 1)
24
+ assert np.all(decom_ultra_aux_data["catbedheaterflag"] == 0)
25
+ assert np.all(decom_ultra_aux_data["hwmode"] == 0)
26
+ assert np.all(decom_ultra_aux_data["imcenb"] == 0)
27
+ assert np.all(decom_ultra_aux_data["leftdeflectioncharge"] == 0)
28
+ assert np.all(decom_ultra_aux_data["rightdeflectioncharge"] == 0)
60
29
 
61
- for packet in packets:
62
- if packet["PKT_APID"] == 880:
63
- assert packet["HWMODE"] == "MODE0"
64
- assert packet["IMCENB"] == "MODE0"
65
- assert packet["LEFTDEFLECTIONCHARGE"] == "MODE0"
66
- assert packet["RIGHTDEFLECTIONCHARGE"] == "MODE0"
30
+ assert len(decom_ultra_aux_data["shcoarse"]) == 23
67
31
 
68
32
 
69
- @pytest.mark.parametrize(
70
- "decom_test_data",
71
- [
72
- pytest.param(
73
- {
74
- "apid": ULTRA_AUX.apid[0],
75
- "filename": "Ultra45_EM_SwRI_Cal_Run7_"
76
- "ThetaScan_20220530T225054.CCSDS",
77
- }
78
- )
79
- ],
80
- indirect=True,
81
- )
82
- def test_aux_decom(decom_test_data, aux_test_path):
33
+ def test_aux_decom(decom_ultra_aux_data, aux_test_path):
83
34
  """This function reads validation data and checks that
84
35
  decom data matches validation data for auxiliary packet"""
85
36
 
86
- decom_ultra, _ = decom_test_data
87
-
88
37
  df = pd.read_csv(aux_test_path, index_col="MET")
89
38
 
90
- np.testing.assert_array_equal(df.SpinStartSeconds, decom_ultra["TIMESPINSTART"])
91
39
  np.testing.assert_array_equal(
92
- df.SpinStartSubseconds, decom_ultra["TIMESPINSTARTSUB"]
40
+ df.SpinStartSeconds, decom_ultra_aux_data["timespinstart"]
41
+ )
42
+ np.testing.assert_array_equal(
43
+ df.SpinStartSubseconds, decom_ultra_aux_data["timespinstartsub"]
93
44
  )
94
- np.testing.assert_array_equal(df.SpinDuration, decom_ultra["DURATION"])
95
- np.testing.assert_array_equal(df.SpinNumber, decom_ultra["SPINNUMBER"])
96
- np.testing.assert_array_equal(df.SpinDataTime, decom_ultra["TIMESPINDATA"])
97
- np.testing.assert_array_equal(df.SpinPeriod, decom_ultra["SPINPERIOD"])
98
- np.testing.assert_array_equal(df.SpinPhase, decom_ultra["SPINPHASE"])
45
+ np.testing.assert_array_equal(df.SpinDuration, decom_ultra_aux_data["duration"])
46
+ np.testing.assert_array_equal(df.SpinNumber, decom_ultra_aux_data["spinnumber"])
47
+ np.testing.assert_array_equal(df.SpinDataTime, decom_ultra_aux_data["timespindata"])
48
+ np.testing.assert_array_equal(df.SpinPeriod, decom_ultra_aux_data["spinperiod"])
49
+ np.testing.assert_array_equal(df.SpinPhase, decom_ultra_aux_data["spinphase"])