imap-processing 0.12.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 (272) hide show
  1. imap_processing/__init__.py +1 -0
  2. imap_processing/_version.py +2 -2
  3. imap_processing/ccsds/ccsds_data.py +1 -2
  4. imap_processing/ccsds/excel_to_xtce.py +1 -2
  5. imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +18 -12
  6. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +569 -0
  7. imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +1846 -128
  8. imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +5 -5
  9. imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +20 -1
  10. imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +6 -4
  11. imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +3 -3
  12. imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +15 -0
  13. imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +22 -0
  14. imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +16 -0
  15. imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +178 -5
  16. imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +5045 -41
  17. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +33 -19
  18. imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +8 -48
  19. imap_processing/cdf/utils.py +41 -33
  20. imap_processing/cli.py +463 -234
  21. imap_processing/codice/codice_l1a.py +260 -47
  22. imap_processing/codice/codice_l1b.py +51 -152
  23. imap_processing/codice/constants.py +38 -1
  24. imap_processing/ena_maps/ena_maps.py +658 -65
  25. imap_processing/ena_maps/utils/coordinates.py +1 -1
  26. imap_processing/ena_maps/utils/spatial_utils.py +10 -5
  27. imap_processing/glows/l1a/glows_l1a.py +28 -99
  28. imap_processing/glows/l1a/glows_l1a_data.py +2 -2
  29. imap_processing/glows/l1b/glows_l1b.py +1 -4
  30. imap_processing/glows/l1b/glows_l1b_data.py +1 -3
  31. imap_processing/glows/l2/glows_l2.py +2 -5
  32. imap_processing/hi/l1a/hi_l1a.py +31 -12
  33. imap_processing/hi/l1b/hi_l1b.py +80 -43
  34. imap_processing/hi/l1c/hi_l1c.py +12 -16
  35. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-sector-dt0-factors_20250219_v002.csv +81 -0
  36. imap_processing/hit/hit_utils.py +93 -35
  37. imap_processing/hit/l0/decom_hit.py +3 -1
  38. imap_processing/hit/l1a/hit_l1a.py +30 -25
  39. imap_processing/hit/l1b/constants.py +6 -2
  40. imap_processing/hit/l1b/hit_l1b.py +279 -318
  41. imap_processing/hit/l2/constants.py +37 -0
  42. imap_processing/hit/l2/hit_l2.py +373 -264
  43. imap_processing/ialirt/l0/parse_mag.py +138 -10
  44. imap_processing/ialirt/l0/process_swapi.py +69 -0
  45. imap_processing/ialirt/l0/process_swe.py +318 -22
  46. imap_processing/ialirt/packet_definitions/ialirt.xml +216 -212
  47. imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +1 -1
  48. imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +1 -1
  49. imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +14 -14
  50. imap_processing/ialirt/utils/grouping.py +1 -1
  51. imap_processing/idex/idex_constants.py +9 -1
  52. imap_processing/idex/idex_l0.py +22 -8
  53. imap_processing/idex/idex_l1a.py +75 -44
  54. imap_processing/idex/idex_l1b.py +9 -8
  55. imap_processing/idex/idex_l2a.py +79 -45
  56. imap_processing/idex/idex_l2b.py +120 -0
  57. imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +33 -39
  58. imap_processing/idex/packet_definitions/idex_housekeeping_packet_definition.xml +9130 -0
  59. imap_processing/lo/l0/lo_science.py +1 -2
  60. imap_processing/lo/l1a/lo_l1a.py +1 -4
  61. imap_processing/lo/l1b/lo_l1b.py +527 -6
  62. imap_processing/lo/l1b/tof_conversions.py +11 -0
  63. imap_processing/lo/l1c/lo_l1c.py +1 -4
  64. imap_processing/mag/constants.py +43 -0
  65. imap_processing/mag/imap_mag_sdc_configuration_v001.py +8 -0
  66. imap_processing/mag/l1a/mag_l1a.py +2 -9
  67. imap_processing/mag/l1a/mag_l1a_data.py +10 -10
  68. imap_processing/mag/l1b/mag_l1b.py +84 -17
  69. imap_processing/mag/l1c/interpolation_methods.py +180 -3
  70. imap_processing/mag/l1c/mag_l1c.py +236 -70
  71. imap_processing/mag/l2/mag_l2.py +140 -0
  72. imap_processing/mag/l2/mag_l2_data.py +288 -0
  73. imap_processing/spacecraft/quaternions.py +1 -3
  74. imap_processing/spice/geometry.py +3 -3
  75. imap_processing/spice/kernels.py +0 -276
  76. imap_processing/spice/pointing_frame.py +257 -0
  77. imap_processing/spice/repoint.py +48 -19
  78. imap_processing/spice/spin.py +38 -33
  79. imap_processing/spice/time.py +24 -0
  80. imap_processing/swapi/l1/swapi_l1.py +16 -12
  81. imap_processing/swapi/l2/swapi_l2.py +116 -4
  82. imap_processing/swapi/swapi_utils.py +32 -0
  83. imap_processing/swe/l1a/swe_l1a.py +2 -9
  84. imap_processing/swe/l1a/swe_science.py +8 -11
  85. imap_processing/swe/l1b/swe_l1b.py +898 -23
  86. imap_processing/swe/l2/swe_l2.py +21 -77
  87. imap_processing/swe/utils/swe_constants.py +1 -0
  88. imap_processing/tests/ccsds/test_excel_to_xtce.py +1 -1
  89. imap_processing/tests/cdf/test_utils.py +14 -16
  90. imap_processing/tests/codice/conftest.py +44 -33
  91. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf +0 -0
  92. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf +0 -0
  93. imap_processing/tests/codice/test_codice_l1a.py +20 -11
  94. imap_processing/tests/codice/test_codice_l1b.py +6 -7
  95. imap_processing/tests/conftest.py +78 -22
  96. imap_processing/tests/ena_maps/test_ena_maps.py +462 -33
  97. imap_processing/tests/ena_maps/test_spatial_utils.py +1 -1
  98. imap_processing/tests/glows/conftest.py +10 -14
  99. imap_processing/tests/glows/test_glows_decom.py +4 -4
  100. imap_processing/tests/glows/test_glows_l1a_cdf.py +6 -27
  101. imap_processing/tests/glows/test_glows_l1a_data.py +6 -8
  102. imap_processing/tests/glows/test_glows_l1b.py +11 -11
  103. imap_processing/tests/glows/test_glows_l1b_data.py +5 -5
  104. imap_processing/tests/glows/test_glows_l2.py +2 -8
  105. imap_processing/tests/hi/conftest.py +1 -1
  106. imap_processing/tests/hi/test_hi_l1b.py +10 -12
  107. imap_processing/tests/hi/test_hi_l1c.py +27 -24
  108. imap_processing/tests/hi/test_l1a.py +7 -9
  109. imap_processing/tests/hi/test_science_direct_event.py +2 -2
  110. imap_processing/tests/hit/helpers/l1_validation.py +44 -43
  111. imap_processing/tests/hit/test_decom_hit.py +1 -1
  112. imap_processing/tests/hit/test_hit_l1a.py +9 -9
  113. imap_processing/tests/hit/test_hit_l1b.py +172 -217
  114. imap_processing/tests/hit/test_hit_l2.py +380 -118
  115. imap_processing/tests/hit/test_hit_utils.py +122 -55
  116. imap_processing/tests/hit/validation_data/hit_l1b_standard_sample2_nsrl_v4_3decimals.csv +62 -62
  117. imap_processing/tests/hit/validation_data/sci_sample_raw.csv +1 -1
  118. imap_processing/tests/ialirt/unit/test_decom_ialirt.py +16 -81
  119. imap_processing/tests/ialirt/unit/test_grouping.py +2 -2
  120. imap_processing/tests/ialirt/unit/test_parse_mag.py +71 -16
  121. imap_processing/tests/ialirt/unit/test_process_codicehi.py +3 -3
  122. imap_processing/tests/ialirt/unit/test_process_codicelo.py +3 -10
  123. imap_processing/tests/ialirt/unit/test_process_ephemeris.py +4 -4
  124. imap_processing/tests/ialirt/unit/test_process_hit.py +3 -3
  125. imap_processing/tests/ialirt/unit/test_process_swapi.py +24 -16
  126. imap_processing/tests/ialirt/unit/test_process_swe.py +115 -7
  127. imap_processing/tests/idex/conftest.py +72 -7
  128. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20241206_v001.pkts +0 -0
  129. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20250108_v001.pkts +0 -0
  130. imap_processing/tests/idex/test_idex_l0.py +33 -11
  131. imap_processing/tests/idex/test_idex_l1a.py +50 -23
  132. imap_processing/tests/idex/test_idex_l1b.py +104 -25
  133. imap_processing/tests/idex/test_idex_l2a.py +48 -32
  134. imap_processing/tests/idex/test_idex_l2b.py +93 -0
  135. imap_processing/tests/lo/test_lo_l1a.py +3 -3
  136. imap_processing/tests/lo/test_lo_l1b.py +371 -6
  137. imap_processing/tests/lo/test_lo_l1c.py +1 -1
  138. imap_processing/tests/lo/test_lo_science.py +6 -7
  139. imap_processing/tests/lo/test_star_sensor.py +1 -1
  140. imap_processing/tests/mag/conftest.py +58 -9
  141. imap_processing/tests/mag/test_mag_decom.py +4 -3
  142. imap_processing/tests/mag/test_mag_l1a.py +13 -7
  143. imap_processing/tests/mag/test_mag_l1b.py +9 -9
  144. imap_processing/tests/mag/test_mag_l1c.py +151 -47
  145. imap_processing/tests/mag/test_mag_l2.py +130 -0
  146. imap_processing/tests/mag/test_mag_validation.py +144 -7
  147. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-in.csv +1217 -0
  148. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-out.csv +1857 -0
  149. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-in.csv +1217 -0
  150. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-out.csv +1857 -0
  151. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-in.csv +1217 -0
  152. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-out.csv +1793 -0
  153. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-in.csv +1217 -0
  154. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-out.csv +1793 -0
  155. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-burst-in.csv +2561 -0
  156. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-in.csv +961 -0
  157. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-out.csv +1539 -0
  158. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-in.csv +1921 -0
  159. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-out.csv +2499 -0
  160. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-in.csv +865 -0
  161. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-out.csv +1196 -0
  162. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-in.csv +1729 -0
  163. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-out.csv +3053 -0
  164. imap_processing/tests/mag/validation/L2/imap_mag_l1b_norm-mago_20251017_v002.cdf +0 -0
  165. imap_processing/tests/mag/validation/calibration/imap_mag_l2-calibration-matrices_20251017_v004.cdf +0 -0
  166. imap_processing/tests/mag/validation/calibration/imap_mag_l2-offsets-norm_20251017_20251017_v001.cdf +0 -0
  167. imap_processing/tests/spacecraft/test_quaternions.py +1 -1
  168. imap_processing/tests/spice/test_data/fake_repoint_data.csv +4 -4
  169. imap_processing/tests/spice/test_data/fake_spin_data.csv +11 -11
  170. imap_processing/tests/spice/test_geometry.py +3 -3
  171. imap_processing/tests/spice/test_kernels.py +1 -200
  172. imap_processing/tests/spice/test_pointing_frame.py +185 -0
  173. imap_processing/tests/spice/test_repoint.py +20 -10
  174. imap_processing/tests/spice/test_spin.py +50 -9
  175. imap_processing/tests/spice/test_time.py +14 -0
  176. imap_processing/tests/swapi/lut/imap_swapi_esa-unit-conversion_20250211_v000.csv +73 -0
  177. imap_processing/tests/swapi/lut/imap_swapi_lut-notes_20250211_v000.csv +1025 -0
  178. imap_processing/tests/swapi/test_swapi_l1.py +7 -9
  179. imap_processing/tests/swapi/test_swapi_l2.py +180 -8
  180. imap_processing/tests/swe/lut/checker-board-indices.csv +24 -0
  181. imap_processing/tests/swe/lut/imap_swe_esa-lut_20250301_v000.csv +385 -0
  182. imap_processing/tests/swe/lut/imap_swe_l1b-in-flight-cal_20240510_20260716_v000.csv +3 -0
  183. imap_processing/tests/swe/test_swe_l1a.py +6 -6
  184. imap_processing/tests/swe/test_swe_l1a_science.py +3 -3
  185. imap_processing/tests/swe/test_swe_l1b.py +162 -24
  186. imap_processing/tests/swe/test_swe_l2.py +82 -102
  187. imap_processing/tests/test_cli.py +171 -88
  188. imap_processing/tests/test_utils.py +2 -1
  189. imap_processing/tests/ultra/data/mock_data.py +49 -21
  190. imap_processing/tests/ultra/unit/conftest.py +53 -70
  191. imap_processing/tests/ultra/unit/test_badtimes.py +2 -4
  192. imap_processing/tests/ultra/unit/test_cullingmask.py +4 -6
  193. imap_processing/tests/ultra/unit/test_de.py +3 -10
  194. imap_processing/tests/ultra/unit/test_decom_apid_880.py +27 -76
  195. imap_processing/tests/ultra/unit/test_decom_apid_881.py +15 -16
  196. imap_processing/tests/ultra/unit/test_decom_apid_883.py +12 -10
  197. imap_processing/tests/ultra/unit/test_decom_apid_896.py +202 -55
  198. imap_processing/tests/ultra/unit/test_lookup_utils.py +23 -1
  199. imap_processing/tests/ultra/unit/test_spacecraft_pset.py +3 -4
  200. imap_processing/tests/ultra/unit/test_ultra_l1a.py +84 -307
  201. imap_processing/tests/ultra/unit/test_ultra_l1b.py +30 -12
  202. imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +2 -2
  203. imap_processing/tests/ultra/unit/test_ultra_l1b_culling.py +4 -1
  204. imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +163 -29
  205. imap_processing/tests/ultra/unit/test_ultra_l1c.py +5 -5
  206. imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +32 -43
  207. imap_processing/tests/ultra/unit/test_ultra_l2.py +230 -0
  208. imap_processing/ultra/constants.py +1 -1
  209. imap_processing/ultra/l0/decom_tools.py +21 -34
  210. imap_processing/ultra/l0/decom_ultra.py +168 -204
  211. imap_processing/ultra/l0/ultra_utils.py +152 -136
  212. imap_processing/ultra/l1a/ultra_l1a.py +55 -243
  213. imap_processing/ultra/l1b/badtimes.py +1 -4
  214. imap_processing/ultra/l1b/cullingmask.py +2 -6
  215. imap_processing/ultra/l1b/de.py +62 -47
  216. imap_processing/ultra/l1b/extendedspin.py +8 -4
  217. imap_processing/ultra/l1b/lookup_utils.py +72 -9
  218. imap_processing/ultra/l1b/ultra_l1b.py +3 -8
  219. imap_processing/ultra/l1b/ultra_l1b_culling.py +4 -4
  220. imap_processing/ultra/l1b/ultra_l1b_extended.py +236 -78
  221. imap_processing/ultra/l1c/histogram.py +2 -6
  222. imap_processing/ultra/l1c/spacecraft_pset.py +2 -4
  223. imap_processing/ultra/l1c/ultra_l1c.py +1 -5
  224. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +107 -60
  225. imap_processing/ultra/l2/ultra_l2.py +299 -0
  226. imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_LeftSlit.csv +526 -0
  227. imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_RightSlit.csv +526 -0
  228. imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_LeftSlit.csv +526 -0
  229. imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_RightSlit.csv +526 -0
  230. imap_processing/ultra/lookup_tables/FM45_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -2
  231. imap_processing/ultra/lookup_tables/FM90_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -0
  232. imap_processing/ultra/packet_definitions/README.md +38 -0
  233. imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +15302 -482
  234. imap_processing/ultra/utils/ultra_l1_utils.py +13 -12
  235. imap_processing/utils.py +1 -1
  236. {imap_processing-0.12.0.dist-info → imap_processing-0.13.0.dist-info}/METADATA +3 -2
  237. {imap_processing-0.12.0.dist-info → imap_processing-0.13.0.dist-info}/RECORD +264 -225
  238. imap_processing/hi/l1b/hi_eng_unit_convert_table.csv +0 -154
  239. imap_processing/mag/imap_mag_sdc-configuration_v001.yaml +0 -6
  240. imap_processing/mag/l1b/__init__.py +0 -0
  241. imap_processing/swe/l1b/swe_esa_lookup_table.csv +0 -1441
  242. imap_processing/swe/l1b/swe_l1b_science.py +0 -699
  243. imap_processing/tests/swe/test_swe_l1b_science.py +0 -103
  244. imap_processing/ultra/lookup_tables/dps_sensitivity45.cdf +0 -0
  245. imap_processing/ultra/lookup_tables/ultra_90_dps_exposure_compressed.cdf +0 -0
  246. /imap_processing/idex/packet_definitions/{idex_packet_definition.xml → idex_science_packet_definition.xml} +0 -0
  247. /imap_processing/tests/ialirt/{test_data → data}/l0/20240827095047_SWE_IALIRT_packet.bin +0 -0
  248. /imap_processing/tests/ialirt/{test_data → data}/l0/461971383-404.bin +0 -0
  249. /imap_processing/tests/ialirt/{test_data → data}/l0/461971384-405.bin +0 -0
  250. /imap_processing/tests/ialirt/{test_data → data}/l0/461971385-406.bin +0 -0
  251. /imap_processing/tests/ialirt/{test_data → data}/l0/461971386-407.bin +0 -0
  252. /imap_processing/tests/ialirt/{test_data → data}/l0/461971387-408.bin +0 -0
  253. /imap_processing/tests/ialirt/{test_data → data}/l0/461971388-409.bin +0 -0
  254. /imap_processing/tests/ialirt/{test_data → data}/l0/461971389-410.bin +0 -0
  255. /imap_processing/tests/ialirt/{test_data → data}/l0/461971390-411.bin +0 -0
  256. /imap_processing/tests/ialirt/{test_data → data}/l0/461971391-412.bin +0 -0
  257. /imap_processing/tests/ialirt/{test_data → data}/l0/BinLog CCSDS_FRAG_TLM_20240826_152323Z_IALIRT_data_for_SDC.bin +0 -0
  258. /imap_processing/tests/ialirt/{test_data → data}/l0/IALiRT Raw Packet Telemetry.txt +0 -0
  259. /imap_processing/tests/ialirt/{test_data → data}/l0/apid01152.tlm +0 -0
  260. /imap_processing/tests/ialirt/{test_data → data}/l0/eu_SWP_IAL_20240826_152033.csv +0 -0
  261. /imap_processing/tests/ialirt/{test_data → data}/l0/hi_fsw_view_1_ccsds.bin +0 -0
  262. /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.ccsds +0 -0
  263. /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.csv +0 -0
  264. /imap_processing/tests/ialirt/{test_data → data}/l0/idle_export_eu.SWE_IALIRT_20240827_093852.csv +0 -0
  265. /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_hi-ialirt_20240523200000_v0.0.0.cdf +0 -0
  266. /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
  267. /imap_processing/tests/ialirt/{test_data → data}/l0/sample_decoded_i-alirt_data.csv +0 -0
  268. /imap_processing/tests/mag/validation/{imap_calibration_mag_20240229_v01.cdf → calibration/imap_mag_l1b-calibration_20240229_v001.cdf} +0 -0
  269. /imap_processing/{swe/l1b/engineering_unit_convert_table.csv → tests/swe/lut/imap_swe_eu-conversion_20240510_v000.csv} +0 -0
  270. {imap_processing-0.12.0.dist-info → imap_processing-0.13.0.dist-info}/LICENSE +0 -0
  271. {imap_processing-0.12.0.dist-info → imap_processing-0.13.0.dist-info}/WHEEL +0 -0
  272. {imap_processing-0.12.0.dist-info → imap_processing-0.13.0.dist-info}/entry_points.txt +0 -0
@@ -12,35 +12,9 @@ from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
12
12
  from imap_processing.spice.geometry import SpiceFrame
13
13
  from imap_processing.spice.spin import get_instrument_spin_phase, get_spin_angle
14
14
  from imap_processing.swe.utils import swe_constants
15
- from imap_processing.swe.utils.swe_utils import (
16
- read_lookup_table,
17
- )
18
15
 
19
16
 
20
- def get_particle_energy() -> npt.NDArray:
21
- """
22
- Get particle energy.
23
-
24
- Calculate particle energy and add to the lookup table.
25
- To convert Volts to Energy, multiply ESA voltage in Volts by
26
- energy conversion factor to get electron energy in eV.
27
-
28
- Returns
29
- -------
30
- lookup_table : pandas.DataFrame
31
- Lookup table with energy column added.
32
- """
33
- # The lookup table gives voltage applied to analyzers.
34
- lookup_table = read_lookup_table()
35
-
36
- # Convert voltage to electron energy in eV by apply conversion factor.
37
- lookup_table["energy"] = (
38
- lookup_table["esa_v"].values * swe_constants.ENERGY_CONVERSION_FACTOR
39
- )
40
- return lookup_table
41
-
42
-
43
- def calculate_phase_space_density(l1b_dataset: xr.Dataset) -> xr.Dataset:
17
+ def calculate_phase_space_density(l1b_dataset: xr.Dataset) -> npt.NDArray:
44
18
  """
45
19
  Convert counts to phase space density.
46
20
 
@@ -52,7 +26,7 @@ def calculate_phase_space_density(l1b_dataset: xr.Dataset) -> xr.Dataset:
52
26
  Where:
53
27
  C / tau = corrected count rate which in the input L1B science data.
54
28
  G = geometric factor, in (cm^2 * ster). 7 CEMs geometric factor value.
55
- eV = eV in electron-volts, calculated by get_particle_energy().
29
+ eV = eV in electron-volts.
56
30
  E = Energy in Joules. eV * 1.60219e-19(J/eV).
57
31
  m = mass of electron (9.10938356e-31 kg).
58
32
  s = second.
@@ -80,25 +54,12 @@ def calculate_phase_space_density(l1b_dataset: xr.Dataset) -> xr.Dataset:
80
54
 
81
55
  Returns
82
56
  -------
83
- phase_space_density_dataset : xarray.Dataset
57
+ phase_space_density : np.ndarray
84
58
  Phase space density. We need to call this phase space density because
85
59
  there will be density in L3 processing.
86
60
  """
87
- # Get esa_table_num for each full sweep.
88
- esa_table_nums = l1b_dataset["esa_table_num"].values[:, 0]
89
- # Get energy values from lookup table.
90
- particle_energy = get_particle_energy()
91
- # Get 720 (24 energy steps x 30 angle) particle energy for each full
92
- # sweep data.
93
- particle_energy_data = np.array(
94
- [
95
- particle_energy[particle_energy["table_index"] == val]["energy"].tolist()
96
- for val in esa_table_nums
97
- ]
98
- )
99
- particle_energy_data = particle_energy_data.reshape(
100
- -1, swe_constants.N_ESA_STEPS, swe_constants.N_ANGLE_SECTORS
101
- )
61
+ # Get energy values.
62
+ particle_energy_data = l1b_dataset["esa_energy"].values
102
63
 
103
64
  # Calculate phase space density using formula:
104
65
  # 2 * (C/tau) / (G * 1.237e31 * eV^2)
@@ -108,27 +69,14 @@ def calculate_phase_space_density(l1b_dataset: xr.Dataset) -> xr.Dataset:
108
69
  * swe_constants.VELOCITY_CONVERSION_FACTOR
109
70
  * particle_energy_data[:, :, :, np.newaxis] ** 2
110
71
  )
72
+ phase_space_density = density.data
111
73
 
112
- # Return density as xr.dataset with phase space density and
113
- # energy in eV value that flux calculation can use.
114
- phase_space_density_dataset = xr.Dataset(
115
- {
116
- "phase_space_density": (
117
- ["epoch", "esa_step", "spin_sector", "cem_id"],
118
- density.data,
119
- ),
120
- "energy_in_eV": (
121
- ["epoch", "esa_step", "spin_sector"],
122
- particle_energy_data,
123
- ),
124
- },
125
- coords=l1b_dataset.coords,
126
- )
74
+ return phase_space_density
127
75
 
128
- return phase_space_density_dataset
129
76
 
130
-
131
- def calculate_flux(l1b_dataset: xr.Dataset) -> npt.NDArray:
77
+ def calculate_flux(
78
+ phase_space_density: np.ndarray, esa_energy: np.ndarray
79
+ ) -> npt.NDArray:
132
80
  """
133
81
  Calculate flux.
134
82
 
@@ -140,7 +88,7 @@ def calculate_flux(l1b_dataset: xr.Dataset) -> npt.NDArray:
140
88
  Where:
141
89
  fv = the phase space density of solar wind electrons
142
90
  given by calculate_phase_space_density() result.
143
- eV = Energy in electron-volts, calculated by get_particle_energy().
91
+ eV = Energy in electron-volts.
144
92
  E = Energy in Joules. eV * 1.60219e-19(J/eV).
145
93
  v = sqrt( (3.20438 * 10e-15 / 9.10938e-31) * eV ) cm/s. See
146
94
  calculate_phase_space_density() for this calculation.
@@ -165,19 +113,20 @@ def calculate_flux(l1b_dataset: xr.Dataset) -> npt.NDArray:
165
113
 
166
114
  Parameters
167
115
  ----------
168
- l1b_dataset : xarray.Dataset
169
- The L1B dataset to process.
116
+ phase_space_density : numpy.ndarray
117
+ The phase space density.
118
+ esa_energy : numpy.ndarray
119
+ The energy values in eV.
170
120
 
171
121
  Returns
172
122
  -------
173
123
  flux : numpy.ndarray
174
124
  Flux values.
175
125
  """
176
- phase_space_density_ds = calculate_phase_space_density(l1b_dataset)
177
126
  flux = (
178
127
  swe_constants.FLUX_CONVERSION_FACTOR
179
- * phase_space_density_ds["energy_in_eV"].data[:, :, :, np.newaxis]
180
- * phase_space_density_ds["phase_space_density"].data
128
+ * esa_energy[:, :, :, np.newaxis]
129
+ * phase_space_density
181
130
  )
182
131
  return flux
183
132
 
@@ -303,7 +252,7 @@ def find_angle_bin_indices(
303
252
  return spin_angle_bins_indices
304
253
 
305
254
 
306
- def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
255
+ def swe_l2(l1b_dataset: xr.Dataset) -> xr.Dataset:
307
256
  """
308
257
  Will process data to L2.
309
258
 
@@ -311,8 +260,6 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
311
260
  ----------
312
261
  l1b_dataset : xarray.Dataset
313
262
  The L1B dataset to process.
314
- data_version : str
315
- Version of the data product being created.
316
263
 
317
264
  Returns
318
265
  -------
@@ -322,7 +269,6 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
322
269
  cdf_attributes = ImapCdfAttributes()
323
270
  cdf_attributes.add_instrument_global_attrs("swe")
324
271
  cdf_attributes.add_instrument_variable_attrs("swe", "l2")
325
- cdf_attributes.add_global_attribute("Data_version", data_version)
326
272
 
327
273
  # Energy values in eV.
328
274
  energy_xr = xr.DataArray(
@@ -397,9 +343,7 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
397
343
  # Calculate phase space density and flux. Store data in shape
398
344
  # (epoch, esa_step, spin_sector, cem_id). This is for L3 purposes.
399
345
  ############################################################
400
- phase_space_density = calculate_phase_space_density(l1b_dataset)[
401
- "phase_space_density"
402
- ]
346
+ phase_space_density = calculate_phase_space_density(l1b_dataset)
403
347
  dataset["phase_space_density_spin_sector"] = xr.DataArray(
404
348
  phase_space_density,
405
349
  name="phase_space_density_spin_sector",
@@ -407,7 +351,7 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
407
351
  attrs=cdf_attributes.get_variable_attributes("phase_space_density_spin_sector"),
408
352
  )
409
353
 
410
- flux = calculate_flux(l1b_dataset)
354
+ flux = calculate_flux(phase_space_density, l1b_dataset["esa_energy"].data)
411
355
  dataset["flux_spin_sector"] = xr.DataArray(
412
356
  flux,
413
357
  name="flux_spin_sector",
@@ -466,7 +410,7 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
466
410
 
467
411
  # Put phase space density data in its spin angle bins using the indices.
468
412
  phase_space_density_binned_data = put_data_into_angle_bins(
469
- phase_space_density.data, spin_angle_bins_indices
413
+ phase_space_density, spin_angle_bins_indices
470
414
  )
471
415
  dataset["phase_space_density"] = xr.DataArray(
472
416
  phase_space_density_binned_data,
@@ -7,6 +7,7 @@ N_ANGLE_SECTORS = 30
7
7
  N_CEMS = 7
8
8
  N_QUARTER_CYCLES = 4
9
9
  N_ANGLE_BINS = 30
10
+ N_QUARTER_CYCLE_STEPS = 180
10
11
 
11
12
  MICROSECONDS_IN_SECOND = 1e6
12
13
 
@@ -12,7 +12,7 @@ from imap_processing.ccsds import excel_to_xtce
12
12
  pytest.importorskip("openpyxl")
13
13
 
14
14
 
15
- @pytest.fixture()
15
+ @pytest.fixture
16
16
  def xtce_excel_file(tmp_path):
17
17
  """Create an excel file for testing.
18
18
 
@@ -1,7 +1,5 @@
1
1
  """Tests for the ``cdf.utils`` module."""
2
2
 
3
- from pathlib import Path
4
-
5
3
  import imap_data_access
6
4
  import numpy as np
7
5
  import pytest
@@ -16,7 +14,7 @@ from imap_processing.cdf.utils import (
16
14
  from imap_processing.spice.time import met_to_ttj2000ns
17
15
 
18
16
 
19
- @pytest.fixture()
17
+ @pytest.fixture
20
18
  def test_dataset():
21
19
  """Create a simple ``xarray`` dataset to be used in testing
22
20
 
@@ -28,7 +26,7 @@ def test_dataset():
28
26
  # Load the CDF attrs
29
27
  swe_attrs = ImapCdfAttributes()
30
28
  swe_attrs.add_instrument_global_attrs("swe")
31
- swe_attrs.add_global_attribute("Data_version", "001")
29
+ swe_attrs.add_global_attribute("Data_version", "v001")
32
30
 
33
31
  dataset = xr.Dataset(
34
32
  {
@@ -97,17 +95,17 @@ def test_written_and_loaded_dataset(test_dataset):
97
95
  assert str(test_dataset) == str(new_dataset)
98
96
 
99
97
 
100
- def test_parents_injection(test_dataset):
101
- """Tests the ``write_cdf`` function for Parents attribute injection.
98
+ def test_repoint_start_date(test_dataset):
99
+ output_file_path = write_cdf(test_dataset)
100
+ assert "imap_swe_l1a_sci_20100101_v001.cdf" in output_file_path.name
101
+ test_dataset.attrs["Start_date"] = "20001212"
102
102
 
103
- Parameters
104
- ----------
105
- test_dataset : xarray.Dataset
106
- An ``xarray`` dataset object to test with
107
- """
108
- parent_paths = [Path("test_parent1.cdf"), Path("/abc/test_parent2.cdf")]
109
- new_dataset = load_cdf(write_cdf(test_dataset, parent_files=parent_paths))
110
- assert new_dataset.attrs["Parents"] == [p.name for p in parent_paths]
103
+ output_file_path = write_cdf(test_dataset)
104
+ assert "imap_swe_l1a_sci_20001212_v001.cdf" in output_file_path.name
105
+
106
+ test_dataset.attrs["Repointing"] = "12345"
107
+ output_file_path = write_cdf(test_dataset)
108
+ assert "imap_swe_l1a_sci_20001212-repoint12345_v001.cdf" in output_file_path.name
111
109
 
112
110
 
113
111
  @pytest.mark.parametrize(
@@ -131,7 +129,7 @@ def test_parents_injection(test_dataset):
131
129
  "data_level": "l1a",
132
130
  "descriptor": "hist",
133
131
  "start_date": "20250415",
134
- "version": "001",
132
+ "version": "v001",
135
133
  },
136
134
  ),
137
135
  (
@@ -144,7 +142,7 @@ def test_parents_injection(test_dataset):
144
142
  "descriptor": "pset",
145
143
  "start_date": "20250415",
146
144
  "repointing": "12345",
147
- "version": "001",
145
+ "version": "v001",
148
146
  "extension": "cdf",
149
147
  },
150
148
  ),
@@ -1,43 +1,54 @@
1
1
  from imap_processing import imap_module_directory
2
2
 
3
- TEST_DATA_PATH = imap_module_directory / "tests" / "codice" / "data"
3
+ TEST_L0_DATA_PATH = imap_module_directory / "tests" / "codice" / "data"
4
+ TEST_L0_FILE = TEST_L0_DATA_PATH / "imap_codice_l0_raw_20241110_v001.pkts"
5
+ TEST_L1A_DATA_PATH = (
6
+ imap_module_directory
7
+ / "codice"
8
+ / "data"
9
+ / "imap"
10
+ / "codice"
11
+ / "l1a"
12
+ / "2024"
13
+ / "11"
14
+ )
4
15
 
5
- TEST_L0_FILE = TEST_DATA_PATH / "imap_codice_l0_raw_20241110_v001.pkts"
6
16
 
7
17
  TEST_L1A_FILES = [
8
- TEST_DATA_PATH / "imap_codice_l1a_hskp_20100101_v001.pkts",
9
- TEST_DATA_PATH / "imap_codice_l1a_hi-counters-aggregated_20240429_v001.pkts",
10
- TEST_DATA_PATH / "imap_codice_l1a_hi-counters-singles_20240429_v001.pkts",
11
- TEST_DATA_PATH / "imap_codice_l1a_hi-omni_20240429_v001.pkts",
12
- TEST_DATA_PATH / "imap_codice_l1a_hi-sectored_20240429_v001.pkts",
13
- TEST_DATA_PATH / "imap_codice_l1a_lo-counters-aggregated_20240429_v001.pkts",
14
- TEST_DATA_PATH / "imap_codice_l1a_lo-counters-singles_20240429_v001.pkts",
15
- TEST_DATA_PATH / "imap_codice_l1a_lo-sw-angular_20240429_v001.pkts",
16
- TEST_DATA_PATH / "imap_codice_l1a_lo-nsw-angular_20240429_v001.pkts",
17
- TEST_DATA_PATH / "imap_codice_l1a_lo-sw-priority_20240429_v001.pkts",
18
- TEST_DATA_PATH / "imap_codice_l1a_lo-nsw-priority_20240429_v001.pkts",
19
- TEST_DATA_PATH / "imap_codice_l1a_lo-sw-species_20240429_v001.pkts",
20
- TEST_DATA_PATH / "imap_codice_l1a_lo-nsw-species_20240429_v001.pkts",
18
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hskp_20241110_v001.cdf",
19
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hi-counters-aggregated_20241110_v001.cdf",
20
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hi-counters-singles_20241110_v001.cdf",
21
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hi-omni_20241110_v001.cdf",
22
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hi-priority_20241110_v001.cdf",
23
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hi-sectored_20241110_v001.cdf",
24
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-counters-aggregated_20241110_v001.cdf",
25
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-counters-singles_20241110_v001.cdf",
26
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-sw-angular_20241110_v001.cdf",
27
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-nsw-angular_20241110_v001.cdf",
28
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-sw-priority_20241110_v001.cdf",
29
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-nsw-priority_20241110_v001.cdf",
30
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-sw-species_20241110_v001.cdf",
31
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-nsw-species_20241110_v001.cdf",
21
32
  ]
22
33
 
23
34
  # ruff: noqa
24
35
  VALIDATION_DATA = [
25
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-ialirt_20241110193700_v0.0.0.cdf",
26
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf",
27
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hskp_20241110193622_v0.0.0.cdf",
28
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf",
29
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf",
30
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf",
31
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf",
32
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf",
33
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf",
34
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf",
35
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf",
36
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-counters-aggregated_20241110193700_v0.0.0.cdf",
37
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-counters-singles_20241110193700_v0.0.0.cdf",
38
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-omni_20241110193700_v0.0.0.cdf",
39
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-sectored_20241110193700_v0.0.0.cdf",
40
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-priorities_20241110193700_v0.0.0.cdf",
41
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf",
42
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf",
36
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-ialirt_20241110193700_v0.0.0.cdf",
37
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf",
38
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hskp_20241110193622_v0.0.0.cdf",
39
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf",
40
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf",
41
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf",
42
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf",
43
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf",
44
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf",
45
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf",
46
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf",
47
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-counters-aggregated_20241110193700_v0.0.0.cdf",
48
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-counters-singles_20241110193700_v0.0.0.cdf",
49
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-omni_20241110193700_v0.0.0.cdf",
50
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-sectored_20241110193700_v0.0.0.cdf",
51
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-priorities_20241110193700_v0.0.0.cdf",
52
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf",
53
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf",
43
54
  ] # fmt: skip
@@ -1,6 +1,7 @@
1
1
  """Tests the L1a processing for decommutated CoDICE data"""
2
2
 
3
3
  import logging
4
+ import re
4
5
 
5
6
  import numpy as np
6
7
  import pytest
@@ -9,6 +10,7 @@ import xarray as xr
9
10
  from imap_processing.cdf.utils import load_cdf, write_cdf
10
11
  from imap_processing.codice import constants
11
12
  from imap_processing.codice.codice_l1a import process_codice_l1a
13
+ from imap_processing.tests.conftest import _download_external_data, _test_data_paths
12
14
 
13
15
  from .conftest import TEST_L0_FILE, VALIDATION_DATA
14
16
 
@@ -55,7 +57,7 @@ EXPECTED_ARRAY_SHAPES = [
55
57
  (77, 15, 4), # hi-omni
56
58
  (77, 8, 12, 12), # hi-sectored
57
59
  (77,), # hi-priority
58
- (), # lo-pha # TODO: Need to implement
60
+ (77, 10000), # lo-pha
59
61
  (), # hi-pha # TODO: Need to implement
60
62
  ]
61
63
 
@@ -76,7 +78,7 @@ EXPECTED_NUM_VARIABLES = [
76
78
  10, # hi-omni
77
79
  6, # hi-sectored
78
80
  8, # hi-priority
79
- 0, # lo-pha # TODO: Need to implement
81
+ 80, # lo-pha
80
82
  0, # hi-pha # TODO: Need to implement
81
83
  ]
82
84
 
@@ -112,8 +114,11 @@ def test_l1a_data() -> xr.Dataset:
112
114
  processed_datasets : list[xarray.Dataset]
113
115
  A list of ``xarray`` datasets containing the test data
114
116
  """
115
-
116
- processed_datasets = process_codice_l1a(file_path=TEST_L0_FILE, data_version="001")
117
+ # Make sure we have the data available here. This test collection gets
118
+ # skipped at the module level if the mark isn't present. We can't decorate
119
+ # a fixture, so add the needed call directly here instead.
120
+ _download_external_data(_test_data_paths())
121
+ processed_datasets = process_codice_l1a(file_path=TEST_L0_FILE)
117
122
 
118
123
  return processed_datasets
119
124
 
@@ -135,9 +140,10 @@ def test_l1a_data_array_shape(test_l1a_data, index):
135
140
 
136
141
  # Mark currently broken/unsupported datasets as expected to fail
137
142
  # TODO: Remove these once they are supported
138
- if index in [0, 1, 16, 17]:
143
+ if index in [0, 1, 17]:
139
144
  pytest.xfail("Data product is currently unsupported")
140
145
 
146
+ # There are exceptions for some variables
141
147
  for variable in processed_dataset:
142
148
  # For variables with energy dimensions
143
149
  if variable in ["energy_table", "acquisition_time_per_step"]:
@@ -154,7 +160,10 @@ def test_l1a_data_array_shape(test_l1a_data, index):
154
160
  assert processed_dataset[variable].data.shape == (
155
161
  len(processed_dataset["epoch"].data),
156
162
  )
157
- # For counter variables
163
+ # For some direct event variables:
164
+ elif re.match(r"P[0-7]_(NumEvents|DataQuality)", variable):
165
+ assert processed_dataset[variable].data.shape == (77,)
166
+ # For nominal variables
158
167
  else:
159
168
  assert processed_dataset[variable].data.shape == expected_shape
160
169
 
@@ -179,7 +188,7 @@ def test_l1a_logical_sources(test_l1a_data, index):
179
188
 
180
189
  # Mark currently broken/unsupported datasets as expected to fail
181
190
  # TODO: Remove these once they are supported
182
- if index in [0, 1, 16, 17]:
191
+ if index in [0, 1, 17]:
183
192
  pytest.xfail("Data product is currently unsupported")
184
193
 
185
194
  # Write the dataset to a file to set the logical source attribute
@@ -207,7 +216,7 @@ def test_l1a_num_data_variables(test_l1a_data, index):
207
216
 
208
217
  # Mark currently broken/unsupported datasets as expected to fail
209
218
  # TODO: Remove these once they are supported
210
- if index in [0, 1, 16, 17]:
219
+ if index in [0, 1, 17]:
211
220
  pytest.xfail("Data product is currently unsupported")
212
221
 
213
222
  assert len(processed_dataset) == EXPECTED_NUM_VARIABLES[index]
@@ -245,12 +254,12 @@ def test_l1a_validate_data_arrays(test_l1a_data: xr.Dataset, index):
245
254
  "lo-nsw-priority",
246
255
  "lo-sw-species",
247
256
  "lo-nsw-species",
248
- "hi-sectored",
257
+ "lo_pha",
249
258
  ]
250
259
 
251
260
  if descriptor in able_to_be_validated:
252
261
  counters = getattr(
253
- constants, f'{descriptor.upper().replace("-","_")}_VARIABLE_NAMES'
262
+ constants, f"{descriptor.upper().replace('-', '_')}_VARIABLE_NAMES"
254
263
  )
255
264
  processed_dataset = test_l1a_data[index]
256
265
  validation_dataset = load_cdf(VALIDATION_DATA[index])
@@ -356,7 +365,7 @@ def test_l1a_validate_support_variables(test_l1a_data, index):
356
365
  def test_l1a_multiple_packets():
357
366
  """Tests that an input L0 file containing multiple APIDs can be processed."""
358
367
 
359
- processed_datasets = process_codice_l1a(file_path=TEST_L0_FILE, data_version="001")
368
+ processed_datasets = process_codice_l1a(file_path=TEST_L0_FILE)
360
369
 
361
370
  # TODO: Could add some more checks here?
362
371
  assert len(processed_datasets) == 18
@@ -3,16 +3,16 @@
3
3
  import pytest
4
4
  import xarray as xr
5
5
 
6
- from imap_processing.cdf.utils import load_cdf
7
6
  from imap_processing.codice.codice_l1b import process_codice_l1b
8
7
 
9
8
  from .conftest import TEST_L1A_FILES
10
9
 
11
- EXPECTED_LOGICAL_SOURCE = [
10
+ EXPECTED_LOGICAL_SOURCES = [
12
11
  "imap_codice_l1b_hskp",
13
12
  "imap_codice_l1b_hi-counters-aggregated",
14
13
  "imap_codice_l1b_hi-counters-singles",
15
14
  "imap_codice_l1b_hi-omni",
15
+ "imap_codice_l1b_hi-priority",
16
16
  "imap_codice_l1b_hi-sectored",
17
17
  "imap_codice_l1b_lo-counters-aggregated",
18
18
  "imap_codice_l1b_lo-counters-singles",
@@ -34,18 +34,17 @@ def test_l1b_data(request) -> xr.Dataset:
34
34
  dataset : xr.Dataset
35
35
  A ``xarray`` dataset containing the test data
36
36
  """
37
- input_dataset = load_cdf(request.param)
38
- dataset = process_codice_l1b(input_dataset, data_version="001")
37
+ dataset = process_codice_l1b(request.param)
39
38
  return dataset
40
39
 
41
40
 
42
41
  @pytest.mark.skip("Awaiting proper implementation of L1B")
43
42
  @pytest.mark.parametrize(
44
43
  "test_l1b_data, expected_logical_source",
45
- list(zip(TEST_L1A_FILES, EXPECTED_LOGICAL_SOURCE)),
44
+ list(zip(TEST_L1A_FILES, EXPECTED_LOGICAL_SOURCES)),
46
45
  indirect=["test_l1b_data"],
47
46
  )
48
- def test_l1b_cdf_filenames(test_l1b_data: xr.Dataset, expected_logical_source: str):
47
+ def test_l1b_logical_sources(test_l1b_data: xr.Dataset, expected_logical_source: str):
49
48
  """Tests that the ``process_codice_l1b`` function generates datasets
50
49
  with the expected logical source.
51
50
 
@@ -53,7 +52,7 @@ def test_l1b_cdf_filenames(test_l1b_data: xr.Dataset, expected_logical_source: s
53
52
  ----------
54
53
  test_l1b_data : xr.Dataset
55
54
  A ``xarray`` dataset containing the test data
56
- expected_filename : str
55
+ expected_logical_source : str
57
56
  The expected CDF filename
58
57
  """
59
58