imap-processing 0.11.0__py3-none-any.whl → 0.12.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of imap-processing might be problematic. Click here for more details.

Files changed (288) hide show
  1. imap_processing/__init__.py +10 -11
  2. imap_processing/_version.py +2 -2
  3. imap_processing/ccsds/excel_to_xtce.py +65 -16
  4. imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +6 -28
  5. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +365 -42
  6. imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +0 -5
  7. imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +10 -11
  8. imap_processing/cdf/config/imap_hi_variable_attrs.yaml +17 -19
  9. imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +26 -13
  10. imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +106 -116
  11. imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +120 -145
  12. imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +14 -0
  13. imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +6 -9
  14. imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +1 -1
  15. imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +0 -12
  16. imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +1 -1
  17. imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +9 -21
  18. imap_processing/cdf/config/imap_mag_l1a_variable_attrs.yaml +361 -0
  19. imap_processing/cdf/config/imap_mag_l1b_variable_attrs.yaml +160 -0
  20. imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +160 -0
  21. imap_processing/cdf/config/imap_spacecraft_global_cdf_attrs.yaml +18 -0
  22. imap_processing/cdf/config/imap_spacecraft_variable_attrs.yaml +40 -0
  23. imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +1 -5
  24. imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +12 -4
  25. imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +16 -2
  26. imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +48 -52
  27. imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +71 -47
  28. imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +2 -14
  29. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +51 -2
  30. imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +29 -14
  31. imap_processing/cdf/utils.py +13 -7
  32. imap_processing/cli.py +23 -8
  33. imap_processing/codice/codice_l1a.py +207 -85
  34. imap_processing/codice/constants.py +1322 -568
  35. imap_processing/codice/decompress.py +2 -6
  36. imap_processing/ena_maps/ena_maps.py +480 -116
  37. imap_processing/ena_maps/utils/coordinates.py +19 -0
  38. imap_processing/ena_maps/utils/map_utils.py +14 -17
  39. imap_processing/ena_maps/utils/spatial_utils.py +45 -47
  40. imap_processing/hi/l1a/hi_l1a.py +24 -18
  41. imap_processing/hi/l1a/histogram.py +0 -1
  42. imap_processing/hi/l1a/science_direct_event.py +6 -8
  43. imap_processing/hi/l1b/hi_l1b.py +31 -39
  44. imap_processing/hi/l1c/hi_l1c.py +405 -17
  45. imap_processing/hi/utils.py +58 -12
  46. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt0-factors_20250219_v002.csv +205 -0
  47. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt1-factors_20250219_v002.csv +205 -0
  48. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt2-factors_20250219_v002.csv +205 -0
  49. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt3-factors_20250219_v002.csv +205 -0
  50. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-summed-dt0-factors_20250219_v002.csv +68 -0
  51. imap_processing/hit/hit_utils.py +173 -1
  52. imap_processing/hit/l0/constants.py +20 -11
  53. imap_processing/hit/l0/decom_hit.py +18 -4
  54. imap_processing/hit/l1a/hit_l1a.py +45 -54
  55. imap_processing/hit/l1b/constants.py +317 -0
  56. imap_processing/hit/l1b/hit_l1b.py +367 -18
  57. imap_processing/hit/l2/constants.py +281 -0
  58. imap_processing/hit/l2/hit_l2.py +614 -0
  59. imap_processing/hit/packet_definitions/hit_packet_definitions.xml +1323 -71
  60. imap_processing/ialirt/l0/mag_l0_ialirt_data.py +155 -0
  61. imap_processing/ialirt/l0/parse_mag.py +246 -0
  62. imap_processing/ialirt/l0/process_swe.py +252 -0
  63. imap_processing/ialirt/packet_definitions/ialirt.xml +7 -3
  64. imap_processing/ialirt/packet_definitions/ialirt_mag.xml +115 -0
  65. imap_processing/ialirt/utils/grouping.py +114 -0
  66. imap_processing/ialirt/utils/time.py +29 -0
  67. imap_processing/idex/atomic_masses.csv +22 -0
  68. imap_processing/idex/decode.py +2 -2
  69. imap_processing/idex/idex_constants.py +25 -0
  70. imap_processing/idex/idex_l1a.py +6 -7
  71. imap_processing/idex/idex_l1b.py +4 -31
  72. imap_processing/idex/idex_l2a.py +789 -0
  73. imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +39 -33
  74. imap_processing/lo/l0/lo_science.py +6 -0
  75. imap_processing/lo/l1a/lo_l1a.py +0 -1
  76. imap_processing/lo/l1b/lo_l1b.py +177 -25
  77. imap_processing/mag/constants.py +8 -0
  78. imap_processing/mag/imap_mag_sdc-configuration_v001.yaml +6 -0
  79. imap_processing/mag/l0/decom_mag.py +10 -3
  80. imap_processing/mag/l1a/mag_l1a.py +22 -11
  81. imap_processing/mag/l1a/mag_l1a_data.py +28 -3
  82. imap_processing/mag/l1b/mag_l1b.py +190 -48
  83. imap_processing/mag/l1c/interpolation_methods.py +211 -0
  84. imap_processing/mag/l1c/mag_l1c.py +447 -9
  85. imap_processing/quality_flags.py +1 -0
  86. imap_processing/spacecraft/packet_definitions/scid_x252.xml +538 -0
  87. imap_processing/spacecraft/quaternions.py +123 -0
  88. imap_processing/spice/geometry.py +16 -19
  89. imap_processing/spice/repoint.py +120 -0
  90. imap_processing/swapi/l1/swapi_l1.py +4 -0
  91. imap_processing/swapi/l2/swapi_l2.py +0 -1
  92. imap_processing/swe/l1a/swe_l1a.py +47 -8
  93. imap_processing/swe/l1a/swe_science.py +5 -2
  94. imap_processing/swe/l1b/swe_l1b_science.py +103 -56
  95. imap_processing/swe/l2/swe_l2.py +60 -65
  96. imap_processing/swe/packet_definitions/swe_packet_definition.xml +1121 -1
  97. imap_processing/swe/utils/swe_constants.py +63 -0
  98. imap_processing/swe/utils/swe_utils.py +85 -28
  99. imap_processing/tests/ccsds/test_data/expected_output.xml +40 -1
  100. imap_processing/tests/ccsds/test_excel_to_xtce.py +23 -20
  101. imap_processing/tests/cdf/test_data/imap_instrument2_global_cdf_attrs.yaml +0 -2
  102. imap_processing/tests/codice/conftest.py +1 -1
  103. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
  104. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-singles_20241110193700_v0.0.0.cdf +0 -0
  105. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-ialirt_20241110193700_v0.0.0.cdf +0 -0
  106. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-omni_20241110193700_v0.0.0.cdf +0 -0
  107. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf +0 -0
  108. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-priorities_20241110193700_v0.0.0.cdf +0 -0
  109. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-sectored_20241110193700_v0.0.0.cdf +0 -0
  110. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
  111. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf +0 -0
  112. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
  113. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf +0 -0
  114. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf +0 -0
  115. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf +0 -0
  116. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf +0 -0
  117. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf +0 -0
  118. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf +0 -0
  119. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf +0 -0
  120. imap_processing/tests/codice/test_codice_l1a.py +110 -46
  121. imap_processing/tests/codice/test_decompress.py +4 -4
  122. imap_processing/tests/conftest.py +166 -10
  123. imap_processing/tests/ena_maps/conftest.py +51 -0
  124. imap_processing/tests/ena_maps/test_ena_maps.py +638 -109
  125. imap_processing/tests/ena_maps/test_map_utils.py +66 -43
  126. imap_processing/tests/ena_maps/test_spatial_utils.py +16 -20
  127. imap_processing/tests/hi/data/l0/H45_diag_fee_20250208.bin +0 -0
  128. imap_processing/tests/hi/data/l0/H45_diag_fee_20250208_verify.csv +205 -0
  129. imap_processing/tests/hi/test_hi_l1b.py +12 -15
  130. imap_processing/tests/hi/test_hi_l1c.py +234 -6
  131. imap_processing/tests/hi/test_l1a.py +30 -0
  132. imap_processing/tests/hi/test_science_direct_event.py +1 -1
  133. imap_processing/tests/hi/test_utils.py +24 -2
  134. imap_processing/tests/hit/helpers/l1_validation.py +39 -39
  135. imap_processing/tests/hit/test_data/hskp_sample.ccsds +0 -0
  136. imap_processing/tests/hit/test_data/imap_hit_l0_raw_20100105_v001.pkts +0 -0
  137. imap_processing/tests/hit/test_decom_hit.py +4 -0
  138. imap_processing/tests/hit/test_hit_l1a.py +24 -28
  139. imap_processing/tests/hit/test_hit_l1b.py +304 -40
  140. imap_processing/tests/hit/test_hit_l2.py +454 -0
  141. imap_processing/tests/hit/test_hit_utils.py +112 -2
  142. imap_processing/tests/hit/validation_data/hskp_sample_eu_3_6_2025.csv +89 -0
  143. imap_processing/tests/hit/validation_data/hskp_sample_raw.csv +89 -88
  144. imap_processing/tests/ialirt/test_data/l0/461971383-404.bin +0 -0
  145. imap_processing/tests/ialirt/test_data/l0/461971384-405.bin +0 -0
  146. imap_processing/tests/ialirt/test_data/l0/461971385-406.bin +0 -0
  147. imap_processing/tests/ialirt/test_data/l0/461971386-407.bin +0 -0
  148. imap_processing/tests/ialirt/test_data/l0/461971387-408.bin +0 -0
  149. imap_processing/tests/ialirt/test_data/l0/461971388-409.bin +0 -0
  150. imap_processing/tests/ialirt/test_data/l0/461971389-410.bin +0 -0
  151. imap_processing/tests/ialirt/test_data/l0/461971390-411.bin +0 -0
  152. imap_processing/tests/ialirt/test_data/l0/461971391-412.bin +0 -0
  153. imap_processing/tests/ialirt/test_data/l0/sample_decoded_i-alirt_data.csv +383 -0
  154. imap_processing/tests/ialirt/unit/test_grouping.py +81 -0
  155. imap_processing/tests/ialirt/unit/test_parse_mag.py +168 -0
  156. imap_processing/tests/ialirt/unit/test_process_swe.py +208 -3
  157. imap_processing/tests/ialirt/unit/test_time.py +16 -0
  158. imap_processing/tests/idex/conftest.py +62 -6
  159. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231218_v001.pkts +0 -0
  160. imap_processing/tests/idex/test_data/impact_14_tof_high_data.txt +4508 -4508
  161. imap_processing/tests/idex/test_idex_l1a.py +48 -4
  162. imap_processing/tests/idex/test_idex_l1b.py +3 -3
  163. imap_processing/tests/idex/test_idex_l2a.py +383 -0
  164. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20241022_v002.cdf +0 -0
  165. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20241022_v002.cdf +0 -0
  166. imap_processing/tests/lo/test_lo_l1b.py +148 -4
  167. imap_processing/tests/lo/test_lo_science.py +1 -0
  168. imap_processing/tests/mag/conftest.py +69 -0
  169. imap_processing/tests/mag/test_mag_decom.py +1 -1
  170. imap_processing/tests/mag/test_mag_l1a.py +38 -0
  171. imap_processing/tests/mag/test_mag_l1b.py +34 -53
  172. imap_processing/tests/mag/test_mag_l1c.py +251 -20
  173. imap_processing/tests/mag/test_mag_validation.py +109 -25
  174. imap_processing/tests/mag/validation/L1b/T009/MAGScience-normal-(2,2)-8s-20250204-16h39.csv +17 -0
  175. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-magi-out.csv +16 -16
  176. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-mago-out.csv +16 -16
  177. imap_processing/tests/mag/validation/L1b/T010/MAGScience-normal-(2,2)-8s-20250206-12h05.csv +17 -0
  178. imap_processing/tests/mag/validation/L1b/T011/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
  179. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-magi-out.csv +16 -16
  180. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-mago-out.csv +16 -16
  181. imap_processing/tests/mag/validation/L1b/T012/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
  182. imap_processing/tests/mag/validation/L1b/T012/data.bin +0 -0
  183. imap_processing/tests/mag/validation/L1b/T012/field_like_all_ranges.txt +19200 -0
  184. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-cal.cdf +0 -0
  185. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-in.csv +17 -0
  186. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-magi-out.csv +17 -0
  187. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-mago-out.csv +17 -0
  188. imap_processing/tests/mag/validation/imap_calibration_mag_20240229_v01.cdf +0 -0
  189. imap_processing/tests/spacecraft/__init__.py +0 -0
  190. imap_processing/tests/spacecraft/data/SSR_2024_190_20_08_12_0483851794_2_DA_apid0594_1packet.pkts +0 -0
  191. imap_processing/tests/spacecraft/test_quaternions.py +71 -0
  192. imap_processing/tests/spice/test_data/fake_repoint_data.csv +5 -0
  193. imap_processing/tests/spice/test_geometry.py +6 -9
  194. imap_processing/tests/spice/test_repoint.py +111 -0
  195. imap_processing/tests/swapi/test_swapi_l1.py +7 -3
  196. imap_processing/tests/swe/l0_data/2024051010_SWE_HK_packet.bin +0 -0
  197. imap_processing/tests/swe/l0_data/2024051011_SWE_CEM_RAW_packet.bin +0 -0
  198. imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_APP_HK_20240510_092742.csv +49 -0
  199. imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_CEM_RAW_20240510_092742.csv +593 -0
  200. imap_processing/tests/swe/test_swe_l1a.py +18 -0
  201. imap_processing/tests/swe/test_swe_l1a_cem_raw.py +52 -0
  202. imap_processing/tests/swe/test_swe_l1a_hk.py +68 -0
  203. imap_processing/tests/swe/test_swe_l1b_science.py +23 -4
  204. imap_processing/tests/swe/test_swe_l2.py +112 -30
  205. imap_processing/tests/test_cli.py +2 -2
  206. imap_processing/tests/test_utils.py +138 -16
  207. imap_processing/tests/ultra/data/l0/FM45_UltraFM45_Functional_2024-01-22T0105_20240122T010548.CCSDS +0 -0
  208. imap_processing/tests/ultra/data/l0/ultra45_raw_sc_ultraimgrates_20220530_00.csv +164 -0
  209. imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultrarawimg_withFSWcalcs_FM45_40P_Phi28p5_BeamCal_LinearScan_phi2850_theta-000_20240207T102740.csv +3243 -3243
  210. imap_processing/tests/ultra/data/mock_data.py +341 -0
  211. imap_processing/tests/ultra/unit/conftest.py +69 -26
  212. imap_processing/tests/ultra/unit/test_badtimes.py +2 -0
  213. imap_processing/tests/ultra/unit/test_cullingmask.py +4 -0
  214. imap_processing/tests/ultra/unit/test_de.py +12 -4
  215. imap_processing/tests/ultra/unit/test_decom_apid_881.py +44 -0
  216. imap_processing/tests/ultra/unit/test_spacecraft_pset.py +78 -0
  217. imap_processing/tests/ultra/unit/test_ultra_l1a.py +28 -12
  218. imap_processing/tests/ultra/unit/test_ultra_l1b.py +34 -6
  219. imap_processing/tests/ultra/unit/test_ultra_l1b_culling.py +22 -26
  220. imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +86 -51
  221. imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +94 -52
  222. imap_processing/ultra/l0/decom_tools.py +6 -5
  223. imap_processing/ultra/l1a/ultra_l1a.py +28 -56
  224. imap_processing/ultra/l1b/de.py +72 -28
  225. imap_processing/ultra/l1b/extendedspin.py +12 -14
  226. imap_processing/ultra/l1b/ultra_l1b.py +34 -9
  227. imap_processing/ultra/l1b/ultra_l1b_culling.py +65 -29
  228. imap_processing/ultra/l1b/ultra_l1b_extended.py +64 -19
  229. imap_processing/ultra/l1c/spacecraft_pset.py +86 -0
  230. imap_processing/ultra/l1c/ultra_l1c.py +7 -4
  231. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +112 -61
  232. imap_processing/ultra/lookup_tables/ultra_90_dps_exposure_compressed.cdf +0 -0
  233. imap_processing/ultra/utils/ultra_l1_utils.py +20 -2
  234. imap_processing/utils.py +68 -28
  235. {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/METADATA +8 -5
  236. {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/RECORD +250 -199
  237. imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +0 -237
  238. imap_processing/hi/l1a/housekeeping.py +0 -27
  239. imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-aggregated_20240429_v001.cdf +0 -0
  240. imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-singles_20240429_v001.cdf +0 -0
  241. imap_processing/tests/codice/data/imap_codice_l1a_hi-omni_20240429_v001.cdf +0 -0
  242. imap_processing/tests/codice/data/imap_codice_l1a_hi-sectored_20240429_v001.cdf +0 -0
  243. imap_processing/tests/codice/data/imap_codice_l1a_hskp_20100101_v001.cdf +0 -0
  244. imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-aggregated_20240429_v001.cdf +0 -0
  245. imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-singles_20240429_v001.cdf +0 -0
  246. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-angular_20240429_v001.cdf +0 -0
  247. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-priority_20240429_v001.cdf +0 -0
  248. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-species_20240429_v001.cdf +0 -0
  249. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-angular_20240429_v001.cdf +0 -0
  250. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-priority_20240429_v001.cdf +0 -0
  251. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-species_20240429_v001.cdf +0 -0
  252. imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-aggregated_20240429_v001.cdf +0 -0
  253. imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-singles_20240429_v001.cdf +0 -0
  254. imap_processing/tests/codice/data/imap_codice_l1b_hi-omni_20240429_v001.cdf +0 -0
  255. imap_processing/tests/codice/data/imap_codice_l1b_hi-sectored_20240429_v001.cdf +0 -0
  256. imap_processing/tests/codice/data/imap_codice_l1b_hskp_20100101_v001.cdf +0 -0
  257. imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-aggregated_20240429_v001.cdf +0 -0
  258. imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-singles_20240429_v001.cdf +0 -0
  259. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-angular_20240429_v001.cdf +0 -0
  260. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-priority_20240429_v001.cdf +0 -0
  261. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-species_20240429_v001.cdf +0 -0
  262. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-angular_20240429_v001.cdf +0 -0
  263. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-priority_20240429_v001.cdf +0 -0
  264. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-species_20240429_v001.cdf +0 -0
  265. imap_processing/tests/hi/data/l1/imap_hi_l1b_45sensor-de_20250415_v999.cdf +0 -0
  266. imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1251.pkts +0 -0
  267. imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1252.pkts +0 -0
  268. imap_processing/tests/hit/validation_data/hskp_sample_eu.csv +0 -89
  269. imap_processing/tests/hit/validation_data/sci_sample_raw1.csv +0 -29
  270. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231214_v001.pkts +0 -0
  271. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20100101_v001.cdf +0 -0
  272. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20100101_v001.cdf +0 -0
  273. imap_processing/tests/ultra/test_data/mock_data.py +0 -161
  274. imap_processing/ultra/l1c/pset.py +0 -40
  275. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50_theta-0.00_20240207T102740.CCSDS +0 -0
  276. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_7P_Phi0.0_BeamCal_LinearScan_phi0.04_theta-0.01_20230821T121304.CCSDS +0 -0
  277. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.CCSDS +0 -0
  278. /imap_processing/tests/ultra/{test_data → data}/l0/Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.CCSDS +0 -0
  279. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_auxdata_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
  280. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_enaphxtofhangimg_FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.csv +0 -0
  281. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultraimgrates_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
  282. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultrarawimgevent_FM45_7P_Phi00_BeamCal_LinearScan_phi004_theta-001_20230821T121304.csv +0 -0
  283. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E1.cdf +0 -0
  284. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E12.cdf +0 -0
  285. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E24.cdf +0 -0
  286. {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/LICENSE +0 -0
  287. {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/WHEEL +0 -0
  288. {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/entry_points.txt +0 -0
@@ -8,6 +8,7 @@ import xarray as xr
8
8
  from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
9
9
  from imap_processing.hit.hit_utils import (
10
10
  HitAPID,
11
+ add_energy_variables,
11
12
  get_attribute_manager,
12
13
  get_datasets_by_apid,
13
14
  process_housekeeping_data,
@@ -66,28 +67,28 @@ def subcom_sectorates(sci_dataset: xr.Dataset) -> None:
66
67
  """
67
68
  Subcommutate sectorates data.
68
69
 
69
- Sector rates data contains rates for 5 species and 10
70
- energy ranges. This function subcommutates the sector
71
- rates data by organizing the rates by species. Which
70
+ Sectored rates data contains raw counts for 5 species and 10
71
+ energy ranges. This function subcommutates the sectored
72
+ rates data by organizing the counts by species. Which
72
73
  species and energy range the data belongs to is determined
73
74
  by taking the mod 10 value of the corresponding header
74
75
  minute count value in the dataset. A mapping of mod 10
75
76
  values to species and energy ranges is provided in constants.py.
76
77
 
77
78
  MOD_10_MAPPING = {
78
- 0: {"species": "H", "energy_min": 1.8, "energy_max": 3.6},
79
- 1: {"species": "H", "energy_min": 4, "energy_max": 6},
80
- 2: {"species": "H", "energy_min": 6, "energy_max": 10},
81
- 3: {"species": "4He", "energy_min": 4, "energy_max": 6},
79
+ 0: {"species": "h", "energy_min": 1.8, "energy_max": 3.6},
80
+ 1: {"species": "h", "energy_min": 4, "energy_max": 6},
81
+ 2: {"species": "h", "energy_min": 6, "energy_max": 10},
82
+ 3: {"species": "he4", "energy_min": 4, "energy_max": 6},
82
83
  ...
83
- 9: {"species": "Fe", "energy_min": 4, "energy_max": 12}}
84
+ 9: {"species": "fe", "energy_min": 4, "energy_max": 12}}
84
85
 
85
86
  The data is added to the dataset as new data fields named
86
87
  according to their species. They have 4 dimensions: epoch
87
- energy index, declination, and azimuth. The energy index
88
+ energy mean, azimuth, and declination. The energy mean
88
89
  dimension is used to distinguish between the different energy
89
- ranges the data belongs to. The energy min and max values for
90
- each species are also added to the dataset as new data fields.
90
+ ranges the data belongs to. The energy deltas for each species
91
+ are also added to the dataset as new data fields.
91
92
 
92
93
  Parameters
93
94
  ----------
@@ -98,65 +99,55 @@ def subcom_sectorates(sci_dataset: xr.Dataset) -> None:
98
99
  hdr_min_count_mod_10 = sci_dataset.hdr_minute_cnt.values % 10
99
100
 
100
101
  # Reference mod 10 mapping to initialize data structure for species and
101
- # energy ranges and add 8x15 arrays with fill values for each science frame.
102
+ # energy ranges and add 15x8 arrays with fill values for each science frame.
102
103
  num_frames = len(hdr_min_count_mod_10)
103
- # TODO: add more specific dtype for rates (ex. int16) once this is defined by HIT
104
104
  data_by_species_and_energy_range = {
105
105
  key: {
106
106
  **value,
107
- "rates": np.full((num_frames, 8, 15), fill_value=fillval, dtype=int),
107
+ "counts": np.full((num_frames, 15, 8), fill_value=fillval, dtype=np.int64),
108
108
  }
109
109
  for key, value in MOD_10_MAPPING.items()
110
110
  }
111
111
 
112
- # Update rates for science frames where data is available
112
+ # Update counts for science frames where data is available
113
113
  for i, mod_10 in enumerate(hdr_min_count_mod_10):
114
- data_by_species_and_energy_range[mod_10]["rates"][i] = sci_dataset[
114
+ data_by_species_and_energy_range[mod_10]["counts"][i] = sci_dataset[
115
115
  "sectorates"
116
116
  ].values[i]
117
117
 
118
118
  # H has 3 energy ranges, 4He, CNO, NeMgSi have 2, and Fe has 1.
119
- # Aggregate sector rates and energy min/max values for each species.
119
+ # Aggregate sectored rates and energy min/max values for each species.
120
120
  # First, initialize dictionaries to store rates and min/max energy values by species
121
121
  data_by_species: dict = {
122
- value["species"]: {"rates": [], "energy_min": [], "energy_max": []}
122
+ value["species"]: {"counts": [], "energy_min": [], "energy_max": []}
123
123
  for value in data_by_species_and_energy_range.values()
124
124
  }
125
125
 
126
126
  for value in data_by_species_and_energy_range.values():
127
127
  species = value["species"]
128
- data_by_species[species]["rates"].append(value["rates"])
128
+ data_by_species[species]["counts"].append(value["counts"])
129
129
  data_by_species[species]["energy_min"].append(value["energy_min"])
130
130
  data_by_species[species]["energy_max"].append(value["energy_max"])
131
131
 
132
- # Add sector rates by species to the dataset
133
- for species_type, data in data_by_species.items():
134
- # Rates data has shape: energy_index, epoch, declination, azimuth
132
+ # Add sectored rates by species to the dataset
133
+ for species, data in data_by_species.items():
134
+ # Rates data has shape: energy_mean, epoch, azimuth, declination
135
135
  # Convert rates to numpy array and transpose axes to get
136
- # shape: epoch, energy_index, declination, azimuth
137
- rates_data = np.transpose(np.array(data["rates"]), axes=(1, 0, 2, 3))
136
+ # shape: epoch, energy_mean, azimuth, declination
137
+ rates_data = np.transpose(np.array(data["counts"]), axes=(1, 0, 2, 3))
138
138
 
139
- species = species_type.lower()
140
- sci_dataset[f"{species}_counts_sectored"] = xr.DataArray(
139
+ sci_dataset[f"{species}_sectored_counts"] = xr.DataArray(
141
140
  data=rates_data,
142
- dims=["epoch", f"{species}_energy_index", "declination", "azimuth"],
141
+ dims=["epoch", f"{species}_energy_mean", "azimuth", "declination"],
143
142
  name=f"{species}_counts_sectored",
144
143
  )
145
- sci_dataset[f"{species}_energy_min"] = xr.DataArray(
146
- data=np.array(data["energy_min"], dtype=np.int8),
147
- dims=[f"{species}_energy_index"],
148
- name=f"{species}_energy_min",
149
- )
150
- sci_dataset[f"{species}_energy_max"] = xr.DataArray(
151
- data=np.array(data["energy_max"], dtype=np.int8),
152
- dims=[f"{species}_energy_index"],
153
- name=f"{species}_energy_max",
154
- )
155
- # add energy index coordinate to the dataset
156
- sci_dataset.coords[f"{species}_energy_index"] = xr.DataArray(
157
- np.arange(sci_dataset.sizes[f"{species}_energy_index"], dtype=np.int8),
158
- dims=[f"{species}_energy_index"],
159
- name=f"{species}_energy_index",
144
+
145
+ # Add energy mean and deltas for each species
146
+ sci_dataset = add_energy_variables(
147
+ sci_dataset,
148
+ species,
149
+ np.array(data["energy_min"]),
150
+ np.array(data["energy_max"]),
160
151
  )
161
152
 
162
153
 
@@ -202,16 +193,16 @@ def calculate_uncertainties(dataset: xr.Dataset) -> xr.Dataset:
202
193
  "hdr_code_ok",
203
194
  "hdr_minute_cnt",
204
195
  "livetime_counter",
205
- "h_energy_min",
206
- "h_energy_max",
207
- "he4_energy_min",
208
- "he4_energy_max",
209
- "cno_energy_min",
210
- "cno_energy_max",
211
- "nemgsi_energy_min",
212
- "nemgsi_energy_max",
213
- "fe_energy_min",
214
- "fe_energy_max",
196
+ "h_energy_delta_minus",
197
+ "h_energy_delta_plus",
198
+ "he4_energy_delta_minus",
199
+ "he4_energy_delta_plus",
200
+ "cno_energy_delta_minus",
201
+ "cno_energy_delta_plus",
202
+ "nemgsi_energy_delta_minus",
203
+ "nemgsi_energy_delta_plus",
204
+ "fe_energy_delta_minus",
205
+ "fe_energy_delta_plus",
215
206
  ]
216
207
 
217
208
  # Counts data that need uncertainties calculated
@@ -269,7 +260,7 @@ def process_science(
269
260
  # Decommutate and decompress the science data
270
261
  sci_dataset = decom_hit(dataset)
271
262
 
272
- # Organize sector rates by species type
263
+ # Organize sectored rates by species type
273
264
  subcom_sectorates(sci_dataset)
274
265
 
275
266
  # Split the science data into count rates and event datasets
@@ -282,7 +273,7 @@ def process_science(
282
273
  count_rates_dataset = calculate_uncertainties(count_rates_dataset)
283
274
 
284
275
  # Logical sources for the two products.
285
- logical_sources = ["imap_hit_l1a_count-rates", "imap_hit_l1a_pulse-height-events"]
276
+ logical_sources = ["imap_hit_l1a_counts", "imap_hit_l1a_direct-events"]
286
277
 
287
278
  datasets = []
288
279
  # Update attributes and dimensions
@@ -0,0 +1,317 @@
1
+ """HIT L1B constants."""
2
+
3
+ # Expected number of livestim pulses per integration time.
4
+ # This is used to calculate the fractional livetime
5
+ livestim_pulses = 270
6
+
7
+ # For the L1B summed rates product, counts are summed by particle type,
8
+ # energy range, and detector penetration range (Range 2, Range 3, and Range 4).
9
+ # See section 6.2 of the algorithm document for more details.
10
+
11
+ # The counts to sum are in the L2FGRATES, L3FGRATES, and PENFGRATES data
12
+ # variables in the L1A product. These variables represent different detector
13
+ # ranges for each particle type and energy range.
14
+
15
+ # Indices at each detector range are provided for each particle type
16
+ # and energy range in the dictionary below and the counts at these indices will be
17
+ # summed in l1B processing to produce the summed rates product.
18
+ # R2 = Indices for Range 2 (L2FGRATES)
19
+ # R3 = Indices for Range 3 (L3FGRATES)
20
+ # R4 = Indices for Range 4 (PENFGRATES)
21
+ # energy_units: MeV/n
22
+
23
+ PARTICLE_ENERGY_RANGE_MAPPING = {
24
+ "h": [
25
+ {
26
+ "energy_min": 1.8,
27
+ "energy_max": 3.6,
28
+ "R2": [1, 2, 3, 4],
29
+ "R3": [0, 1],
30
+ "R4": [],
31
+ },
32
+ {"energy_min": 4.0, "energy_max": 6.0, "R2": [6, 7], "R3": [3, 4, 5], "R4": []},
33
+ {"energy_min": 6.0, "energy_max": 10.0, "R2": [], "R3": [6, 7], "R4": []},
34
+ {"energy_min": 10.0, "energy_max": 15.0, "R2": [], "R3": [8, 9], "R4": [1]},
35
+ ],
36
+ "he3": [
37
+ {
38
+ "energy_min": 4.0,
39
+ "energy_max": 6.0,
40
+ "R2": [14, 15, 16],
41
+ "R3": [12, 13, 14],
42
+ "R4": [],
43
+ },
44
+ {"energy_min": 6.0, "energy_max": 10.0, "R2": [], "R3": [15, 16], "R4": []},
45
+ {"energy_min": 10.0, "energy_max": 15.0, "R2": [], "R3": [17, 18], "R4": []},
46
+ ],
47
+ "he4": [
48
+ {
49
+ "energy_min": 1.8,
50
+ "energy_max": 3.6,
51
+ "R2": [19, 20, 21, 22],
52
+ "R3": [21],
53
+ "R4": [],
54
+ },
55
+ {
56
+ "energy_min": 4.0,
57
+ "energy_max": 6.0,
58
+ "R2": [24, 25],
59
+ "R3": [23, 24, 25],
60
+ "R4": [],
61
+ },
62
+ {"energy_min": 6.0, "energy_max": 10.0, "R2": [], "R3": [26, 27], "R4": []},
63
+ {"energy_min": 10.0, "energy_max": 15.0, "R2": [], "R3": [28, 29], "R4": [4]},
64
+ ],
65
+ "he": [
66
+ {
67
+ "energy_min": 4.0,
68
+ "energy_max": 6.0,
69
+ "R2": [14, 15, 16, 24, 25],
70
+ "R3": [12, 13, 14, 23, 24, 25],
71
+ "R4": [],
72
+ },
73
+ {
74
+ "energy_min": 6.0,
75
+ "energy_max": 10.0,
76
+ "R2": [],
77
+ "R3": [15, 16, 26, 27],
78
+ "R4": [],
79
+ },
80
+ {
81
+ "energy_min": 10.0,
82
+ "energy_max": 15.0,
83
+ "R2": [],
84
+ "R3": [17, 18, 28, 29],
85
+ "R4": [4],
86
+ },
87
+ ],
88
+ "c": [
89
+ {
90
+ "energy_min": 4.0,
91
+ "energy_max": 6.0,
92
+ "R2": [30, 31, 32],
93
+ "R3": [32, 33],
94
+ "R4": [],
95
+ },
96
+ {
97
+ "energy_min": 6.0,
98
+ "energy_max": 10.0,
99
+ "R2": [33, 34],
100
+ "R3": [34, 35],
101
+ "R4": [],
102
+ },
103
+ {"energy_min": 10.0, "energy_max": 15.0, "R2": [], "R3": [36, 37], "R4": []},
104
+ {"energy_min": 15.0, "energy_max": 27.0, "R2": [], "R3": [38, 39], "R4": [7]},
105
+ ],
106
+ "n": [
107
+ {
108
+ "energy_min": 4.0,
109
+ "energy_max": 6.0,
110
+ "R2": [39, 40, 41],
111
+ "R3": [43],
112
+ "R4": [],
113
+ },
114
+ {
115
+ "energy_min": 6.0,
116
+ "energy_max": 10.0,
117
+ "R2": [42, 43],
118
+ "R3": [44, 45],
119
+ "R4": [],
120
+ },
121
+ {"energy_min": 10.0, "energy_max": 15.0, "R2": [], "R3": [46, 47], "R4": []},
122
+ {"energy_min": 15.0, "energy_max": 27.0, "R2": [], "R3": [48, 49], "R4": [11]},
123
+ ],
124
+ "o": [
125
+ {
126
+ "energy_min": 4.0,
127
+ "energy_max": 6.0,
128
+ "R2": [48, 49, 50],
129
+ "R3": [53],
130
+ "R4": [],
131
+ },
132
+ {
133
+ "energy_min": 6.0,
134
+ "energy_max": 10.0,
135
+ "R2": [51, 52],
136
+ "R3": [54, 55],
137
+ "R4": [],
138
+ },
139
+ {"energy_min": 10.0, "energy_max": 15.0, "R2": [], "R3": [56, 57], "R4": []},
140
+ {"energy_min": 15.0, "energy_max": 27.0, "R2": [], "R3": [58, 59], "R4": []},
141
+ ],
142
+ "ne": [
143
+ {"energy_min": 4.0, "energy_max": 6.0, "R2": [57, 58, 59], "R3": [], "R4": []},
144
+ {
145
+ "energy_min": 6.0,
146
+ "energy_max": 10.0,
147
+ "R2": [60, 61],
148
+ "R3": [63, 64],
149
+ "R4": [],
150
+ },
151
+ {"energy_min": 10.0, "energy_max": 15.0, "R2": [62], "R3": [65, 66], "R4": []},
152
+ {"energy_min": 15.0, "energy_max": 27.0, "R2": [], "R3": [67, 68], "R4": []},
153
+ ],
154
+ "na": [
155
+ {"energy_min": 10.0, "energy_max": 15.0, "R2": [], "R3": [75, 76], "R4": []},
156
+ {"energy_min": 15.0, "energy_max": 27.0, "R2": [], "R3": [77, 78], "R4": []},
157
+ ],
158
+ "mg": [
159
+ {"energy_min": 4.0, "energy_max": 6.0, "R2": [67, 68, 69], "R3": [], "R4": []},
160
+ {
161
+ "energy_min": 6.0,
162
+ "energy_max": 10.0,
163
+ "R2": [70, 71],
164
+ "R3": [83, 84],
165
+ "R4": [],
166
+ },
167
+ {
168
+ "energy_min": 10.0,
169
+ "energy_max": 15.0,
170
+ "R2": [72, 73],
171
+ "R3": [85, 86],
172
+ "R4": [],
173
+ },
174
+ {"energy_min": 15.0, "energy_max": 27.0, "R2": [], "R3": [87, 88], "R4": []},
175
+ ],
176
+ "al": [
177
+ {"energy_min": 6.0, "energy_max": 10.0, "R2": [], "R3": [94, 95], "R4": []},
178
+ {"energy_min": 10.0, "energy_max": 15.0, "R2": [], "R3": [96, 97], "R4": []},
179
+ {"energy_min": 15.0, "energy_max": 27.0, "R2": [], "R3": [98, 99], "R4": []},
180
+ ],
181
+ "si": [
182
+ {"energy_min": 4.0, "energy_max": 6.0, "R2": [78, 79, 80], "R3": [], "R4": []},
183
+ {
184
+ "energy_min": 6.0,
185
+ "energy_max": 10.0,
186
+ "R2": [81, 82],
187
+ "R3": [105, 106],
188
+ "R4": [],
189
+ },
190
+ {
191
+ "energy_min": 10.0,
192
+ "energy_max": 15.0,
193
+ "R2": [83, 84],
194
+ "R3": [107, 108],
195
+ "R4": [],
196
+ },
197
+ {"energy_min": 15.0, "energy_max": 27.0, "R2": [], "R3": [109, 110], "R4": []},
198
+ {
199
+ "energy_min": 27.0,
200
+ "energy_max": 40.0,
201
+ "R2": [],
202
+ "R3": [111, 112],
203
+ "R4": [26],
204
+ },
205
+ ],
206
+ "s": [
207
+ {"energy_min": 4.0, "energy_max": 6.0, "R2": [88, 89, 90], "R3": [], "R4": []},
208
+ {
209
+ "energy_min": 6.0,
210
+ "energy_max": 10.0,
211
+ "R2": [91, 92],
212
+ "R3": [116, 117],
213
+ "R4": [],
214
+ },
215
+ {
216
+ "energy_min": 10.0,
217
+ "energy_max": 15.0,
218
+ "R2": [93, 94],
219
+ "R3": [118, 119],
220
+ "R4": [],
221
+ },
222
+ {"energy_min": 15.0, "energy_max": 27.0, "R2": [], "R3": [120, 121], "R4": []},
223
+ {"energy_min": 27.0, "energy_max": 40.0, "R2": [], "R3": [122, 123], "R4": []},
224
+ ],
225
+ "ar": [
226
+ {"energy_min": 4.0, "energy_max": 6.0, "R2": [98, 99, 100], "R3": [], "R4": []},
227
+ {
228
+ "energy_min": 6.0,
229
+ "energy_max": 10.0,
230
+ "R2": [101, 102],
231
+ "R3": [127, 128],
232
+ "R4": [],
233
+ },
234
+ {
235
+ "energy_min": 10.0,
236
+ "energy_max": 15.0,
237
+ "R2": [103, 104],
238
+ "R3": [129, 130],
239
+ "R4": [],
240
+ },
241
+ {
242
+ "energy_min": 15.0,
243
+ "energy_max": 27.0,
244
+ "R2": [105],
245
+ "R3": [131, 132],
246
+ "R4": [],
247
+ },
248
+ {"energy_min": 27.0, "energy_max": 40.0, "R2": [], "R3": [133, 134], "R4": []},
249
+ ],
250
+ "ca": [
251
+ {
252
+ "energy_min": 4.0,
253
+ "energy_max": 6.0,
254
+ "R2": [109, 110, 111],
255
+ "R3": [],
256
+ "R4": [],
257
+ },
258
+ {
259
+ "energy_min": 6.0,
260
+ "energy_max": 10.0,
261
+ "R2": [112, 113],
262
+ "R3": [138],
263
+ "R4": [],
264
+ },
265
+ {
266
+ "energy_min": 10.0,
267
+ "energy_max": 15.0,
268
+ "R2": [114, 115],
269
+ "R3": [139, 140],
270
+ "R4": [],
271
+ },
272
+ {
273
+ "energy_min": 15.0,
274
+ "energy_max": 27.0,
275
+ "R2": [116],
276
+ "R3": [141, 142],
277
+ "R4": [],
278
+ },
279
+ {"energy_min": 27.0, "energy_max": 40.0, "R2": [], "R3": [143, 144], "R4": []},
280
+ ],
281
+ "fe": [
282
+ {
283
+ "energy_min": 4.0,
284
+ "energy_max": 6.0,
285
+ "R2": [122, 123, 124],
286
+ "R3": [],
287
+ "R4": [],
288
+ },
289
+ {
290
+ "energy_min": 6.0,
291
+ "energy_max": 10.0,
292
+ "R2": [125, 126],
293
+ "R3": [148],
294
+ "R4": [],
295
+ },
296
+ {
297
+ "energy_min": 10.0,
298
+ "energy_max": 15.0,
299
+ "R2": [127, 128],
300
+ "R3": [149, 150],
301
+ "R4": [],
302
+ },
303
+ {
304
+ "energy_min": 15.0,
305
+ "energy_max": 27.0,
306
+ "R2": [129],
307
+ "R3": [151, 152],
308
+ "R4": [],
309
+ },
310
+ {"energy_min": 27.0, "energy_max": 40.0, "R2": [], "R3": [153, 154], "R4": []},
311
+ ],
312
+ "ni": [
313
+ {"energy_min": 10.0, "energy_max": 15.0, "R2": [], "R3": [159, 160], "R4": []},
314
+ {"energy_min": 15.0, "energy_max": 27.0, "R2": [], "R3": [161, 162], "R4": []},
315
+ {"energy_min": 27.0, "energy_max": 40.0, "R2": [], "R3": [163, 164], "R4": []},
316
+ ],
317
+ }