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
@@ -7,6 +7,7 @@ from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
7
7
  from imap_processing.hit.hit_utils import (
8
8
  HitAPID,
9
9
  add_energy_variables,
10
+ add_summed_particle_data_to_dataset,
10
11
  concatenate_leak_variables,
11
12
  get_attribute_manager,
12
13
  get_datasets_by_apid,
@@ -29,9 +30,8 @@ def packet_filepath():
29
30
  @pytest.fixture(scope="module")
30
31
  def attribute_manager():
31
32
  """Create the attribute manager"""
32
- data_version = "001"
33
33
  level = "l1a"
34
- attr_mgr = get_attribute_manager(data_version, level)
34
+ attr_mgr = get_attribute_manager(level)
35
35
  return attr_mgr
36
36
 
37
37
 
@@ -43,6 +43,23 @@ def housekeeping_dataset(packet_filepath):
43
43
  return datasets_by_apid[HitAPID.HIT_HSKP]
44
44
 
45
45
 
46
+ @pytest.fixture
47
+ def sample_dataset():
48
+ """Create a sample dataset for summing particle data"""
49
+ data = {
50
+ "l2fgrates": (("epoch", "energy"), np.random.rand(10, 5)),
51
+ "l3fgrates": (("epoch", "energy"), np.random.rand(10, 5)),
52
+ "penfgrates": (("epoch", "energy"), np.random.rand(10, 5)),
53
+ "l2fgrates_stat_uncert_minus": (("epoch", "energy"), np.random.rand(10, 5)),
54
+ "l3fgrates_stat_uncert_minus": (("epoch", "energy"), np.random.rand(10, 5)),
55
+ "penfgrates_stat_uncert_minus": (("epoch", "energy"), np.random.rand(10, 5)),
56
+ "l2fgrates_stat_uncert_plus": (("epoch", "energy"), np.random.rand(10, 5)),
57
+ "l3fgrates_stat_uncert_plus": (("epoch", "energy"), np.random.rand(10, 5)),
58
+ "penfgrates_stat_uncert_plus": (("epoch", "energy"), np.random.rand(10, 5)),
59
+ }
60
+ return xr.Dataset(data)
61
+
62
+
46
63
  def test_get_datasets_by_apid(packet_filepath):
47
64
  result = get_datasets_by_apid(packet_filepath)
48
65
 
@@ -52,9 +69,8 @@ def test_get_datasets_by_apid(packet_filepath):
52
69
 
53
70
 
54
71
  def test_get_attribute_manager():
55
- data_version = "001"
56
72
  level = "l1a"
57
- attr_mgr = get_attribute_manager(data_version, level)
73
+ attr_mgr = get_attribute_manager(level)
58
74
 
59
75
  assert isinstance(attr_mgr, ImapCdfAttributes)
60
76
 
@@ -179,7 +195,7 @@ def test_process_housekeeping(housekeeping_dataset, attribute_manager):
179
195
  "Investigator, Prof. David J. McComas of Princeton "
180
196
  "University.\n",
181
197
  "Data_type": "L1A_HK>Level-1A Housekeeping",
182
- "Data_version": "001",
198
+ "Data_version": None,
183
199
  "Descriptor": "HIT>IMAP High-energy Ion Telescope",
184
200
  "Discipline": "Solar Physics>Heliospheric Physics",
185
201
  "File_naming_convention": "source_descriptor_datatype_yyyyMMdd_vNNN",
@@ -223,43 +239,37 @@ def test_process_housekeeping(housekeeping_dataset, attribute_manager):
223
239
 
224
240
 
225
241
  def test_add_energy_variables():
242
+ """Test adding energy variables to a dataset"""
243
+ # Create an empty dataset
226
244
  dataset = xr.Dataset()
245
+
246
+ # Create sample data
227
247
  particle = "test_particle"
228
248
  energy_min = np.array([1.8, 4.0, 6.0], dtype=np.float32)
229
249
  energy_max = np.array([2.2, 6.0, 10.0], dtype=np.float32)
230
250
  energy_mean = np.mean([energy_min, energy_max], axis=0)
231
- result = add_energy_variables(dataset, particle, energy_min, energy_max)
232
- assert f"{particle}_energy_delta_minus" in result.data_vars
233
- assert f"{particle}_energy_delta_plus" in result.data_vars
234
- assert f"{particle}_energy_mean" in result.coords
251
+
252
+ # Call the function
253
+ dataset = add_energy_variables(dataset, particle, energy_min, energy_max)
254
+
255
+ # Assertions
256
+ assert f"{particle}_energy_delta_minus" in dataset.data_vars
257
+ assert f"{particle}_energy_delta_plus" in dataset.data_vars
258
+ assert f"{particle}_energy_mean" in dataset.coords
235
259
  assert np.all(
236
- result[f"{particle}_energy_delta_minus"].values
260
+ dataset[f"{particle}_energy_delta_minus"].values
237
261
  == np.array(energy_mean - np.array(energy_min), dtype=np.float32)
238
262
  )
239
263
  assert np.all(
240
- result[f"{particle}_energy_delta_plus"].values
264
+ dataset[f"{particle}_energy_delta_plus"].values
241
265
  == np.array(energy_max - energy_mean, dtype=np.float32)
242
266
  )
243
- assert np.all(
244
- result[f"{particle}_energy_mean"].values
245
- == np.mean([energy_min, energy_max], axis=0)
246
- )
267
+ assert np.all(dataset[f"{particle}_energy_mean"].values == energy_mean)
247
268
 
248
269
 
249
- def test_sum_particle_data():
270
+ def test_sum_particle_data(sample_dataset):
250
271
  # Create a sample dataset
251
- data = {
252
- "l2fgrates": (("epoch", "energy"), np.random.rand(10, 5)),
253
- "l3fgrates": (("epoch", "energy"), np.random.rand(10, 5)),
254
- "penfgrates": (("epoch", "energy"), np.random.rand(10, 5)),
255
- "l2fgrates_delta_minus": (("epoch", "energy"), np.random.rand(10, 5)),
256
- "l3fgrates_delta_minus": (("epoch", "energy"), np.random.rand(10, 5)),
257
- "penfgrates_delta_minus": (("epoch", "energy"), np.random.rand(10, 5)),
258
- "l2fgrates_delta_plus": (("epoch", "energy"), np.random.rand(10, 5)),
259
- "l3fgrates_delta_plus": (("epoch", "energy"), np.random.rand(10, 5)),
260
- "penfgrates_delta_plus": (("epoch", "energy"), np.random.rand(10, 5)),
261
- }
262
- dataset = xr.Dataset(data)
272
+ dataset = xr.Dataset(sample_dataset)
263
273
 
264
274
  # Define indices for summing
265
275
  indices = {
@@ -269,14 +279,14 @@ def test_sum_particle_data():
269
279
  }
270
280
 
271
281
  # Call the function
272
- summed_data, summed_uncertainty_delta_minus, summed_uncertainty_delta_plus = (
273
- sum_particle_data(dataset, indices)
282
+ summed_data, summed_uncertainty_minus, summed_uncertainty_plus = sum_particle_data(
283
+ dataset, indices
274
284
  )
275
285
 
276
286
  # Assertions
277
287
  assert summed_data.shape == (10,)
278
- assert summed_uncertainty_delta_minus.shape == (10,)
279
- assert summed_uncertainty_delta_plus.shape == (10,)
288
+ assert summed_uncertainty_minus.shape == (10,)
289
+ assert summed_uncertainty_plus.shape == (10,)
280
290
  assert np.all(
281
291
  summed_data
282
292
  == dataset["l2fgrates"][:, indices["R2"]].sum(axis=1)
@@ -284,16 +294,67 @@ def test_sum_particle_data():
284
294
  + dataset["penfgrates"][:, indices["R4"]].sum(axis=1)
285
295
  )
286
296
  assert np.all(
287
- summed_uncertainty_delta_minus
288
- == dataset["l2fgrates_delta_minus"][:, indices["R2"]].sum(axis=1)
289
- + dataset["l3fgrates_delta_minus"][:, indices["R3"]].sum(axis=1)
290
- + dataset["penfgrates_delta_minus"][:, indices["R4"]].sum(axis=1)
297
+ summed_uncertainty_minus
298
+ == dataset["l2fgrates_stat_uncert_minus"][:, indices["R2"]].sum(axis=1)
299
+ + dataset["l3fgrates_stat_uncert_minus"][:, indices["R3"]].sum(axis=1)
300
+ + dataset["penfgrates_stat_uncert_minus"][:, indices["R4"]].sum(axis=1)
291
301
  )
292
302
  assert np.all(
293
- summed_uncertainty_delta_plus
294
- == dataset["l2fgrates_delta_plus"][:, indices["R2"]].sum(axis=1)
295
- + dataset["l3fgrates_delta_plus"][:, indices["R3"]].sum(axis=1)
296
- + dataset["penfgrates_delta_plus"][:, indices["R4"]].sum(axis=1)
303
+ summed_uncertainty_plus
304
+ == dataset["l2fgrates_stat_uncert_plus"][:, indices["R2"]].sum(axis=1)
305
+ + dataset["l3fgrates_stat_uncert_plus"][:, indices["R3"]].sum(axis=1)
306
+ + dataset["penfgrates_stat_uncert_plus"][:, indices["R4"]].sum(axis=1)
307
+ )
308
+
309
+
310
+ def test_add_summed_particle_data_to_dataset(sample_dataset):
311
+ """Test adding summed particle data to a dataset"""
312
+ # Create a sample source dataset
313
+ source_dataset = xr.Dataset(sample_dataset)
314
+
315
+ # Create an empty dataset to update
316
+ dataset_to_update = xr.Dataset()
317
+
318
+ # Define particle and energy ranges
319
+ particle = "test_particle"
320
+ energy_ranges = [
321
+ {"energy_min": 1.8, "energy_max": 2.2, "R2": [0], "R3": [1], "R4": [2]},
322
+ {"energy_min": 4.0, "energy_max": 6.0, "R2": [3], "R3": [4], "R4": []},
323
+ ]
324
+
325
+ # Call the function
326
+ dataset_to_update = add_summed_particle_data_to_dataset(
327
+ dataset_to_update, source_dataset, particle, energy_ranges
328
+ )
329
+
330
+ # Assertions
331
+ assert f"{particle}" in dataset_to_update.data_vars
332
+ assert f"{particle}_stat_uncert_minus" in dataset_to_update.data_vars
333
+ assert f"{particle}_stat_uncert_plus" in dataset_to_update.data_vars
334
+ assert f"{particle}_energy_delta_minus" in dataset_to_update.data_vars
335
+ assert f"{particle}_energy_delta_plus" in dataset_to_update.data_vars
336
+ assert f"{particle}_energy_mean" in dataset_to_update.coords
337
+
338
+ assert dataset_to_update[f"{particle}"].shape == (10, len(energy_ranges))
339
+ assert dataset_to_update[f"{particle}_stat_uncert_minus"].shape == (
340
+ 10,
341
+ len(energy_ranges),
342
+ )
343
+ assert dataset_to_update[f"{particle}_stat_uncert_plus"].shape == (
344
+ 10,
345
+ len(energy_ranges),
346
+ )
347
+ assert dataset_to_update[f"{particle}_energy_mean"].shape == (len(energy_ranges),)
348
+ assert dataset_to_update[f"{particle}_energy_delta_minus"].shape == (
349
+ len(energy_ranges),
350
+ )
351
+ assert dataset_to_update[f"{particle}_energy_delta_plus"].shape == (
352
+ len(energy_ranges),
353
+ )
354
+
355
+ assert np.all(
356
+ dataset_to_update[f"{particle}_energy_mean"].values
357
+ == np.mean([[1.8, 4.0], [2.2, 6.0]], axis=0)
297
358
  )
298
359
 
299
360
 
@@ -307,22 +368,28 @@ def test_initialize_particle_data_arrays():
307
368
  epoch_size = 10
308
369
 
309
370
  # Call the function
310
- result = initialize_particle_data_arrays(
371
+ dataset = initialize_particle_data_arrays(
311
372
  dataset, particle, num_energy_ranges, epoch_size
312
373
  )
313
374
 
314
375
  # Assertions
315
- assert f"{particle}" in result.data_vars
316
- assert f"{particle}_delta_minus" in result.data_vars
317
- assert f"{particle}_delta_plus" in result.data_vars
318
- assert f"{particle}_energy_mean" in result.coords
319
-
320
- assert result[f"{particle}"].shape == (epoch_size, num_energy_ranges)
321
- assert result[f"{particle}_delta_minus"].shape == (epoch_size, num_energy_ranges)
322
- assert result[f"{particle}_delta_plus"].shape == (epoch_size, num_energy_ranges)
323
- assert result[f"{particle}_energy_mean"].shape == (num_energy_ranges,)
324
-
325
- assert np.all(result[f"{particle}"].values == 0)
326
- assert np.all(result[f"{particle}_delta_minus"].values == 0)
327
- assert np.all(result[f"{particle}_delta_plus"].values == 0)
328
- assert np.all(result[f"{particle}_energy_mean"].values == 0)
376
+ assert f"{particle}" in dataset.data_vars
377
+ assert f"{particle}_stat_uncert_minus" in dataset.data_vars
378
+ assert f"{particle}_stat_uncert_plus" in dataset.data_vars
379
+ assert f"{particle}_energy_mean" in dataset.coords
380
+
381
+ assert dataset[f"{particle}"].shape == (epoch_size, num_energy_ranges)
382
+ assert dataset[f"{particle}_stat_uncert_minus"].shape == (
383
+ epoch_size,
384
+ num_energy_ranges,
385
+ )
386
+ assert dataset[f"{particle}_stat_uncert_plus"].shape == (
387
+ epoch_size,
388
+ num_energy_ranges,
389
+ )
390
+ assert dataset[f"{particle}_energy_mean"].shape == (num_energy_ranges,)
391
+
392
+ assert np.all(dataset[f"{particle}"].values == 0)
393
+ assert np.all(dataset[f"{particle}_stat_uncert_minus"].values == 0)
394
+ assert np.all(dataset[f"{particle}_stat_uncert_plus"].values == 0)
395
+ assert np.all(dataset[f"{particle}_energy_mean"].values == 0)