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
@@ -124,8 +124,8 @@ def consolidate_rate_columns(
124
124
 
125
125
  The validation data has each value in a separate column. This
126
126
  function aggregates related data into arrays to match processed
127
- data. Each rate column has a corresponding delta plus and delta
128
- minus column for uncertainty values.
127
+ data. Each rate column has corresponding plus and minus columns
128
+ for uncertainty values.
129
129
 
130
130
  Parameters
131
131
  ----------
@@ -142,16 +142,16 @@ def consolidate_rate_columns(
142
142
  """
143
143
  for new_col, prefix in rate_columns.items():
144
144
  pattern_rates = re.compile(rf"^{prefix}\d+$")
145
- pattern_delta_plus = re.compile(rf"^{prefix}\d+_DELTA_PLUS$")
146
- pattern_delta_minus = re.compile(rf"^{prefix}\d+_DELTA_MINUS$")
145
+ pattern_uncert_plus = re.compile(rf"^{prefix}\d+_STAT_UNCERT_PLUS$")
146
+ pattern_uncert_minus = re.compile(rf"^{prefix}\d+_STAT_UNCERT_MINUS$")
147
147
  data[new_col] = data.filter(regex=pattern_rates.pattern).apply(
148
148
  lambda row: row.values, axis=1
149
149
  )
150
- data[f"{new_col}_delta_plus"] = data.filter(
151
- regex=pattern_delta_plus.pattern
150
+ data[f"{new_col}_stat_uncert_plus"] = data.filter(
151
+ regex=pattern_uncert_plus.pattern
152
152
  ).apply(lambda row: row.values, axis=1)
153
- data[f"{new_col}_delta_minus"] = data.filter(
154
- regex=pattern_delta_minus.pattern
153
+ data[f"{new_col}_stat_uncert_minus"] = data.filter(
154
+ regex=pattern_uncert_minus.pattern
155
155
  ).apply(lambda row: row.values, axis=1)
156
156
  if new_col == "sectorates":
157
157
  data = consolidate_sectorates(data)
@@ -159,10 +159,11 @@ def consolidate_rate_columns(
159
159
  columns=data.filter(regex=pattern_rates.pattern).columns, inplace=True
160
160
  )
161
161
  data.drop(
162
- columns=data.filter(regex=pattern_delta_plus.pattern).columns, inplace=True
162
+ columns=data.filter(regex=pattern_uncert_plus.pattern).columns, inplace=True
163
163
  )
164
164
  data.drop(
165
- columns=data.filter(regex=pattern_delta_minus.pattern).columns, inplace=True
165
+ columns=data.filter(regex=pattern_uncert_minus.pattern).columns,
166
+ inplace=True,
166
167
  )
167
168
  return data
168
169
 
@@ -207,22 +208,22 @@ def consolidate_sectorates(data: pd.DataFrame) -> pd.DataFrame:
207
208
  Validation data with sectorate columns consolidated into arrays
208
209
  """
209
210
  sectorates_three_digits = data.filter(regex=r"^SECTORATES_\d{3}$").columns
210
- sectorates_delta_plus_three_digits = data.filter(
211
- regex=r"^SECTORATES_\d{3}_DELTA_PLUS$"
211
+ sectorates_uncert_plus_three_digits = data.filter(
212
+ regex=r"^SECTORATES_\d{3}_STAT_UNCERT_PLUS$"
212
213
  ).columns
213
- sectorates_delta_minus_three_digits = data.filter(
214
- regex=r"^SECTORATES_\d{3}_DELTA_MINUS$"
214
+ sectorates_uncert_minus_three_digits = data.filter(
215
+ regex=r"^SECTORATES_\d{3}_STAT_UNCERT_MINUS$"
215
216
  ).columns
216
217
 
217
218
  data["sectorates"] = data[sectorates_three_digits].apply(
218
219
  lambda row: row.values.reshape(15, 8), axis=1
219
220
  )
220
- data["sectorates_delta_plus"] = data[sectorates_delta_plus_three_digits].apply(
221
- lambda row: row.values.reshape(15, 8), axis=1
222
- )
223
- data["sectorates_delta_minus"] = data[sectorates_delta_minus_three_digits].apply(
224
- lambda row: row.values.reshape(15, 8), axis=1
225
- )
221
+ data["sectorates_stat_uncert_plus"] = data[
222
+ sectorates_uncert_plus_three_digits
223
+ ].apply(lambda row: row.values.reshape(15, 8), axis=1)
224
+ data["sectorates_stat_uncert_minus"] = data[
225
+ sectorates_uncert_minus_three_digits
226
+ ].apply(lambda row: row.values.reshape(15, 8), axis=1)
226
227
 
227
228
  sectorates_four_digits = data.filter(regex=r"^SECTORATES_\d{3}_\d{1}$").columns
228
229
  data["sectorates_by_mod_val"] = data[sectorates_four_digits].apply(
@@ -250,15 +251,15 @@ def process_single_rates(data: pd.DataFrame) -> pd.DataFrame:
250
251
  data["sngrates"] = data.apply(
251
252
  lambda row: np.array([row["sngrates_hg"], row["sngrates_lg"]]), axis=1
252
253
  )
253
- data["sngrates_delta_plus"] = data.apply(
254
+ data["sngrates_stat_uncert_plus"] = data.apply(
254
255
  lambda row: np.array(
255
- [row["sngrates_hg_delta_plus"], row["sngrates_lg_delta_plus"]]
256
+ [row["sngrates_hg_stat_uncert_plus"], row["sngrates_lg_stat_uncert_plus"]]
256
257
  ),
257
258
  axis=1,
258
259
  )
259
- data["sngrates_delta_minus"] = data.apply(
260
+ data["sngrates_stat_uncert_minus"] = data.apply(
260
261
  lambda row: np.array(
261
- [row["sngrates_hg_delta_minus"], row["sngrates_lg_delta_minus"]]
262
+ [row["sngrates_hg_stat_uncert_minus"], row["sngrates_lg_stat_uncert_minus"]]
262
263
  ),
263
264
  axis=1,
264
265
  )
@@ -266,10 +267,10 @@ def process_single_rates(data: pd.DataFrame) -> pd.DataFrame:
266
267
  columns=[
267
268
  "sngrates_hg",
268
269
  "sngrates_lg",
269
- "sngrates_hg_delta_plus",
270
- "sngrates_lg_delta_plus",
271
- "sngrates_hg_delta_minus",
272
- "sngrates_lg_delta_minus",
270
+ "sngrates_hg_stat_uncert_plus",
271
+ "sngrates_lg_stat_uncert_plus",
272
+ "sngrates_hg_stat_uncert_minus",
273
+ "sngrates_lg_stat_uncert_minus",
273
274
  ],
274
275
  inplace=True,
275
276
  )
@@ -338,9 +339,9 @@ def compare_data(
338
339
  "species",
339
340
  "energy_bin",
340
341
  ]:
341
- assert (
342
- field in actual_data.data_vars.keys()
343
- ), f"Field {field} not found in actual data variables"
342
+ assert field in actual_data.data_vars.keys(), (
343
+ f"Field {field} not found in actual data variables"
344
+ )
344
345
  if field not in skip:
345
346
  for frame in range(expected_data.shape[0]):
346
347
  if field == "species":
@@ -353,27 +354,27 @@ def compare_data(
353
354
  # array of sectored rate data from the actual data for comparison.
354
355
  species = expected_data[field][frame]
355
356
  energy_bin = expected_data["energy_bin"][frame]
356
- if "sectorates_delta_plus" in expected_data.columns:
357
+ if "sectorates_stat_uncert_plus" in expected_data.columns:
357
358
  np.testing.assert_allclose(
358
- actual_data[f"{species}_sectored_counts_delta_plus"][frame][
359
- energy_bin
360
- ].data,
361
- expected_data["sectorates_delta_plus"][frame],
359
+ actual_data[f"{species}_sectored_counts_stat_uncert_plus"][
360
+ frame
361
+ ][energy_bin].data,
362
+ expected_data["sectorates_stat_uncert_plus"][frame],
362
363
  rtol=1e-7, # relative tolerance
363
364
  atol=1e-8, # absolute tolerance
364
- err_msg=f"Mismatch in {species}_sectored_counts_delta_"
365
- f"plus at frame {frame}, energy_bin {energy_bin}",
365
+ err_msg=f"Mismatch in {species}_sectored_counts_stat_uncert"
366
+ f"_plus at frame {frame}, energy_bin {energy_bin}",
366
367
  )
367
- if "sectorates_delta_minus" in expected_data.columns:
368
+ if "sectorates_stat_uncert_minus" in expected_data.columns:
368
369
  np.testing.assert_allclose(
369
- actual_data[f"{species}_sectored_counts_delta_minus"][
370
+ actual_data[f"{species}_sectored_counts_stat_uncert_minus"][
370
371
  frame
371
372
  ][energy_bin].data,
372
- expected_data["sectorates_delta_minus"][frame],
373
+ expected_data["sectorates_stat_uncert_minus"][frame],
373
374
  rtol=1e-7,
374
375
  atol=1e-8,
375
- err_msg=f"Mismatch in {species}_sectored_counts_delta_"
376
- f"minus at frame {frame}, energy_bin {energy_bin}",
376
+ err_msg=f"Mismatch in {species}_sectored_counts_stat_uncert"
377
+ f"_minus at frame {frame}, energy_bin {energy_bin}",
377
378
  )
378
379
  else:
379
380
  np.testing.assert_allclose(
@@ -21,7 +21,7 @@ from imap_processing.hit.l0.decom_hit import (
21
21
  from imap_processing.utils import packet_file_to_datasets
22
22
 
23
23
 
24
- @pytest.fixture()
24
+ @pytest.fixture
25
25
  def sci_dataset():
26
26
  """Create a xarray dataset for testing from sample data."""
27
27
  packet_definition = (
@@ -62,7 +62,7 @@ def test_subcom_sectorates(sci_packet_filepath):
62
62
  sci_dataset = decom_hit(sci_dataset)
63
63
 
64
64
  # Call the function to be tested
65
- subcom_sectorates(sci_dataset)
65
+ sci_dataset = subcom_sectorates(sci_dataset)
66
66
 
67
67
  # Number of science frames in the dataset
68
68
  frames = sci_dataset["epoch"].shape[0]
@@ -79,7 +79,7 @@ def test_subcom_sectorates(sci_packet_filepath):
79
79
  for species, shape in expected_shapes.items():
80
80
  # Check if the dataset has the new data variables
81
81
  assert f"{species}_sectored_counts" in sci_dataset
82
- assert f"{species}_energy_mean" in sci_dataset
82
+ assert f"{species}_energy_mean" in sci_dataset.coords
83
83
  assert f"{species}_energy_delta_minus" in sci_dataset
84
84
  assert f"{species}_energy_delta_plus" in sci_dataset
85
85
  # Check the shape of the new data variables
@@ -117,13 +117,13 @@ def test_calculate_uncertainties():
117
117
 
118
118
  # Assertions
119
119
  np.testing.assert_array_almost_equal(
120
- result["counts_delta_plus"].values, expected_delta_plus
120
+ result["counts_stat_uncert_plus"].values, expected_delta_plus
121
121
  )
122
122
  np.testing.assert_array_almost_equal(
123
- result["counts_delta_minus"].values, expected_delta_minus
123
+ result["counts_stat_uncert_minus"].values, expected_delta_minus
124
124
  )
125
- assert "version_delta_plus" not in result
126
- assert "version_delta_minus" not in result
125
+ assert "version_stat_uncert_plus" not in result
126
+ assert "version_stat_uncert_minus" not in result
127
127
 
128
128
 
129
129
  def test_validate_l1a_housekeeping_data(hk_packet_filepath):
@@ -137,7 +137,7 @@ def test_validate_l1a_housekeeping_data(hk_packet_filepath):
137
137
  hk_packet_filepath : str
138
138
  File path to housekeeping ccsds file
139
139
  """
140
- datasets = hit_l1a(hk_packet_filepath, "001")
140
+ datasets = hit_l1a(hk_packet_filepath)
141
141
  hk_dataset = None
142
142
  for dataset in datasets:
143
143
  if dataset.attrs["Logical_source"] == "imap_hit_l1a_hk":
@@ -223,7 +223,7 @@ def test_validate_l1a_counts_data(sci_packet_filepath, validation_data):
223
223
  """
224
224
 
225
225
  # Process the sample data
226
- processed_datasets = hit_l1a(sci_packet_filepath, "001")
226
+ processed_datasets = hit_l1a(sci_packet_filepath)
227
227
  l1a_counts_data = processed_datasets[0]
228
228
 
229
229
  # Prepare validation data for comparison with processed data
@@ -260,7 +260,7 @@ def test_hit_l1a(hk_packet_filepath, sci_packet_filepath):
260
260
  Path to ccsds file for science data
261
261
  """
262
262
  for packet_filepath in [hk_packet_filepath, sci_packet_filepath]:
263
- processed_datasets = hit_l1a(packet_filepath, "001")
263
+ processed_datasets = hit_l1a(packet_filepath)
264
264
  assert isinstance(processed_datasets, list)
265
265
  assert all(isinstance(ds, xr.Dataset) for ds in processed_datasets)
266
266
  if packet_filepath == hk_packet_filepath: