imap-processing 0.9.0__py3-none-any.whl → 0.11.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 (243) hide show
  1. imap_processing/_version.py +2 -2
  2. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +749 -442
  3. imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +7 -0
  4. imap_processing/cdf/config/imap_glows_l1a_variable_attrs.yaml +8 -2
  5. imap_processing/cdf/config/imap_glows_l1b_variable_attrs.yaml +0 -1
  6. imap_processing/cdf/config/imap_glows_l2_variable_attrs.yaml +358 -0
  7. imap_processing/cdf/config/imap_hi_variable_attrs.yaml +59 -25
  8. imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +22 -0
  9. imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +32 -8
  10. imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +94 -5
  11. imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +65 -37
  12. imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +16 -1
  13. imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +7 -0
  14. imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +14 -14
  15. imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +25 -24
  16. imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +238 -0
  17. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +100 -92
  18. imap_processing/cdf/utils.py +2 -2
  19. imap_processing/cli.py +45 -9
  20. imap_processing/codice/codice_l1a.py +104 -58
  21. imap_processing/codice/constants.py +111 -155
  22. imap_processing/codice/data/esa_sweep_values.csv +256 -256
  23. imap_processing/codice/data/lo_stepping_values.csv +128 -128
  24. imap_processing/ena_maps/ena_maps.py +519 -0
  25. imap_processing/ena_maps/utils/map_utils.py +145 -0
  26. imap_processing/ena_maps/utils/spatial_utils.py +226 -0
  27. imap_processing/glows/__init__.py +3 -0
  28. imap_processing/glows/ancillary/imap_glows_pipeline_settings_v001.json +52 -0
  29. imap_processing/glows/l1a/glows_l1a.py +72 -14
  30. imap_processing/glows/l1b/glows_l1b.py +2 -1
  31. imap_processing/glows/l1b/glows_l1b_data.py +25 -1
  32. imap_processing/glows/l2/glows_l2.py +324 -0
  33. imap_processing/glows/l2/glows_l2_data.py +156 -51
  34. imap_processing/hi/l1a/science_direct_event.py +57 -51
  35. imap_processing/hi/l1b/hi_l1b.py +43 -28
  36. imap_processing/hi/l1c/hi_l1c.py +225 -42
  37. imap_processing/hi/utils.py +20 -3
  38. imap_processing/hit/l0/constants.py +2 -2
  39. imap_processing/hit/l0/decom_hit.py +1 -1
  40. imap_processing/hit/l1a/hit_l1a.py +94 -13
  41. imap_processing/hit/l1b/hit_l1b.py +158 -9
  42. imap_processing/ialirt/l0/process_codicehi.py +156 -0
  43. imap_processing/ialirt/l0/process_codicelo.py +5 -2
  44. imap_processing/ialirt/packet_definitions/ialirt.xml +28 -20
  45. imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +241 -0
  46. imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +170 -0
  47. imap_processing/ialirt/packet_definitions/ialirt_swe.xml +258 -0
  48. imap_processing/ialirt/process_ephemeris.py +72 -40
  49. imap_processing/idex/decode.py +241 -0
  50. imap_processing/idex/idex_l1a.py +143 -81
  51. imap_processing/idex/idex_l1b.py +244 -10
  52. imap_processing/lo/l0/lo_science.py +61 -0
  53. imap_processing/lo/l1a/lo_l1a.py +98 -10
  54. imap_processing/lo/l1b/lo_l1b.py +2 -2
  55. imap_processing/lo/l1c/lo_l1c.py +2 -2
  56. imap_processing/lo/packet_definitions/lo_xtce.xml +1082 -9178
  57. imap_processing/mag/l0/decom_mag.py +2 -2
  58. imap_processing/mag/l1a/mag_l1a.py +7 -7
  59. imap_processing/mag/l1a/mag_l1a_data.py +62 -30
  60. imap_processing/mag/l1b/mag_l1b.py +11 -6
  61. imap_processing/quality_flags.py +18 -3
  62. imap_processing/spice/geometry.py +149 -177
  63. imap_processing/spice/kernels.py +26 -26
  64. imap_processing/spice/spin.py +233 -0
  65. imap_processing/spice/time.py +96 -31
  66. imap_processing/swapi/l1/swapi_l1.py +60 -31
  67. imap_processing/swapi/packet_definitions/swapi_packet_definition.xml +363 -384
  68. imap_processing/swe/l1a/swe_l1a.py +8 -3
  69. imap_processing/swe/l1a/swe_science.py +24 -24
  70. imap_processing/swe/l1b/swe_l1b.py +2 -1
  71. imap_processing/swe/l1b/swe_l1b_science.py +181 -122
  72. imap_processing/swe/l2/swe_l2.py +337 -70
  73. imap_processing/swe/utils/swe_utils.py +28 -0
  74. imap_processing/tests/cdf/test_utils.py +2 -2
  75. imap_processing/tests/codice/conftest.py +20 -17
  76. imap_processing/tests/codice/data/validation/imap_codice_l1a_hskp_20241110193622_v0.0.0.cdf +0 -0
  77. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
  78. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf +0 -0
  79. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf +0 -0
  80. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf +0 -0
  81. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf +0 -0
  82. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf +0 -0
  83. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf +0 -0
  84. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf +0 -0
  85. imap_processing/tests/codice/test_codice_l0.py +55 -121
  86. imap_processing/tests/codice/test_codice_l1a.py +147 -59
  87. imap_processing/tests/conftest.py +81 -22
  88. imap_processing/tests/ena_maps/test_ena_maps.py +309 -0
  89. imap_processing/tests/ena_maps/test_map_utils.py +286 -0
  90. imap_processing/tests/ena_maps/test_spatial_utils.py +161 -0
  91. imap_processing/tests/glows/conftest.py +7 -1
  92. imap_processing/tests/glows/test_glows_l1a_cdf.py +3 -7
  93. imap_processing/tests/glows/test_glows_l1a_data.py +34 -6
  94. imap_processing/tests/glows/test_glows_l1b_data.py +29 -17
  95. imap_processing/tests/glows/test_glows_l2.py +101 -0
  96. imap_processing/tests/hi/conftest.py +3 -3
  97. imap_processing/tests/hi/data/l1/imap_hi_l1b_45sensor-de_20250415_v999.cdf +0 -0
  98. imap_processing/tests/hi/data/l1/imap_his_pset-calibration-prod-config_20240101_v001.csv +31 -0
  99. imap_processing/tests/hi/test_hi_l1b.py +14 -9
  100. imap_processing/tests/hi/test_hi_l1c.py +136 -36
  101. imap_processing/tests/hi/test_l1a.py +0 -2
  102. imap_processing/tests/hi/test_science_direct_event.py +18 -14
  103. imap_processing/tests/hi/test_utils.py +16 -11
  104. imap_processing/tests/hit/helpers/__init__.py +0 -0
  105. imap_processing/tests/hit/helpers/l1_validation.py +405 -0
  106. imap_processing/tests/hit/test_data/sci_sample.ccsds +0 -0
  107. imap_processing/tests/hit/test_decom_hit.py +8 -10
  108. imap_processing/tests/hit/test_hit_l1a.py +117 -180
  109. imap_processing/tests/hit/test_hit_l1b.py +149 -55
  110. imap_processing/tests/hit/validation_data/hit_l1b_standard_sample2_nsrl_v4_3decimals.csv +62 -0
  111. imap_processing/tests/hit/validation_data/sci_sample_raw.csv +62 -0
  112. imap_processing/tests/ialirt/test_data/l0/20240827095047_SWE_IALIRT_packet.bin +0 -0
  113. imap_processing/tests/ialirt/test_data/l0/BinLog CCSDS_FRAG_TLM_20240826_152323Z_IALIRT_data_for_SDC.bin +0 -0
  114. imap_processing/tests/ialirt/test_data/l0/eu_SWP_IAL_20240826_152033.csv +644 -0
  115. imap_processing/tests/ialirt/test_data/l0/hi_fsw_view_1_ccsds.bin +0 -0
  116. imap_processing/tests/ialirt/test_data/l0/idle_export_eu.SWE_IALIRT_20240827_093852.csv +914 -0
  117. imap_processing/tests/ialirt/test_data/l0/imap_codice_l1a_hi-ialirt_20240523200000_v0.0.0.cdf +0 -0
  118. imap_processing/tests/ialirt/unit/test_process_codicehi.py +106 -0
  119. imap_processing/tests/ialirt/unit/test_process_ephemeris.py +33 -5
  120. imap_processing/tests/ialirt/unit/test_process_swapi.py +85 -0
  121. imap_processing/tests/ialirt/unit/test_process_swe.py +106 -0
  122. imap_processing/tests/idex/conftest.py +29 -1
  123. imap_processing/tests/idex/test_data/compressed_2023_102_14_24_55.pkts +0 -0
  124. imap_processing/tests/idex/test_data/non_compressed_2023_102_14_22_26.pkts +0 -0
  125. imap_processing/tests/idex/test_idex_l0.py +6 -3
  126. imap_processing/tests/idex/test_idex_l1a.py +151 -1
  127. imap_processing/tests/idex/test_idex_l1b.py +124 -2
  128. imap_processing/tests/lo/test_lo_l1a.py +62 -2
  129. imap_processing/tests/lo/test_lo_science.py +85 -0
  130. imap_processing/tests/lo/validation_data/Instrument_FM1_T104_R129_20240803_ILO_SPIN_EU.csv +2 -0
  131. imap_processing/tests/mag/conftest.py +16 -0
  132. imap_processing/tests/mag/test_mag_decom.py +6 -4
  133. imap_processing/tests/mag/test_mag_l1a.py +36 -7
  134. imap_processing/tests/mag/test_mag_l1b.py +55 -4
  135. imap_processing/tests/mag/test_mag_validation.py +148 -0
  136. imap_processing/tests/mag/validation/L1a/T001/all_p_ones.txt +19200 -0
  137. imap_processing/tests/mag/validation/L1a/T001/mag-l0-l1a-t001-in.bin +0 -0
  138. imap_processing/tests/mag/validation/L1a/T001/mag-l0-l1a-t001-out.csv +17 -0
  139. imap_processing/tests/mag/validation/L1a/T002/all_n_ones.txt +19200 -0
  140. imap_processing/tests/mag/validation/L1a/T002/mag-l0-l1a-t002-in.bin +0 -0
  141. imap_processing/tests/mag/validation/L1a/T002/mag-l0-l1a-t002-out.csv +17 -0
  142. imap_processing/tests/mag/validation/L1a/T003/field_like.txt +19200 -0
  143. imap_processing/tests/mag/validation/L1a/T003/mag-l0-l1a-t003-in.bin +0 -0
  144. imap_processing/tests/mag/validation/L1a/T003/mag-l0-l1a-t003-out.csv +17 -0
  145. imap_processing/tests/mag/validation/L1a/T004/field_like.txt +19200 -0
  146. imap_processing/tests/mag/validation/L1a/T004/mag-l0-l1a-t004-in.bin +0 -0
  147. imap_processing/tests/mag/validation/L1a/T004/mag-l0-l1a-t004-out.csv +17 -0
  148. imap_processing/tests/mag/validation/L1a/T005/field_like_range_change.txt +19200 -0
  149. imap_processing/tests/mag/validation/L1a/T005/mag-l0-l1a-t005-in.bin +0 -0
  150. imap_processing/tests/mag/validation/L1a/T005/mag-l0-l1a-t005-out.csv +17 -0
  151. imap_processing/tests/mag/validation/L1a/T006/hdr_field.txt +19200 -0
  152. imap_processing/tests/mag/validation/L1a/T006/mag-l0-l1a-t006-in.bin +0 -0
  153. imap_processing/tests/mag/validation/L1a/T006/mag-l0-l1a-t006-out.csv +17 -0
  154. imap_processing/tests/mag/validation/L1a/T007/hdr_field_and_range_change.txt +19200 -0
  155. imap_processing/tests/mag/validation/L1a/T007/mag-l0-l1a-t007-in.bin +0 -0
  156. imap_processing/tests/mag/validation/L1a/T007/mag-l0-l1a-t007-out.csv +17 -0
  157. imap_processing/tests/mag/validation/L1a/T008/field_like_range_change.txt +19200 -0
  158. imap_processing/tests/mag/validation/L1a/T008/mag-l0-l1a-t008-in.bin +0 -0
  159. imap_processing/tests/mag/validation/L1a/T008/mag-l0-l1a-t008-out.csv +17 -0
  160. imap_processing/tests/mag/validation/L1b/T009/data.bin +0 -0
  161. imap_processing/tests/mag/validation/L1b/T009/field_like_all_ranges.txt +19200 -0
  162. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-in.csv +17 -0
  163. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-magi-out.csv +17 -0
  164. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-mago-out.csv +17 -0
  165. imap_processing/tests/mag/validation/L1b/T010/data.bin +0 -0
  166. imap_processing/tests/mag/validation/L1b/T010/field_like_all_ranges.txt +19200 -0
  167. imap_processing/tests/mag/validation/L1b/T010/mag-l1a-l1b-t010-in.csv +17 -0
  168. imap_processing/tests/mag/validation/L1b/T010/mag-l1a-l1b-t010-magi-out.csv +17 -0
  169. imap_processing/tests/mag/validation/L1b/T010/mag-l1a-l1b-t010-mago-out.csv +17 -0
  170. imap_processing/tests/mag/validation/L1b/T011/data.bin +0 -0
  171. imap_processing/tests/mag/validation/L1b/T011/field_like_all_ranges.txt +19200 -0
  172. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-in.csv +17 -0
  173. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-magi-out.csv +17 -0
  174. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-mago-out.csv +17 -0
  175. imap_processing/tests/spice/test_geometry.py +128 -133
  176. imap_processing/tests/spice/test_kernels.py +37 -37
  177. imap_processing/tests/spice/test_spin.py +184 -0
  178. imap_processing/tests/spice/test_time.py +43 -20
  179. imap_processing/tests/swapi/test_swapi_l1.py +11 -10
  180. imap_processing/tests/swapi/test_swapi_l2.py +13 -3
  181. imap_processing/tests/swe/test_swe_l1a.py +1 -1
  182. imap_processing/tests/swe/test_swe_l1b.py +20 -3
  183. imap_processing/tests/swe/test_swe_l1b_science.py +54 -35
  184. imap_processing/tests/swe/test_swe_l2.py +148 -5
  185. imap_processing/tests/test_cli.py +39 -7
  186. imap_processing/tests/test_quality_flags.py +19 -19
  187. imap_processing/tests/test_utils.py +3 -2
  188. imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_ultrarawimg_withFSWcalcs_FM45_40P_Phi28p5_BeamCal_LinearScan_phi2850_theta-000_20240207T102740.csv +3314 -3314
  189. imap_processing/tests/ultra/test_data/mock_data.py +161 -0
  190. imap_processing/tests/ultra/unit/conftest.py +73 -0
  191. imap_processing/tests/ultra/unit/test_badtimes.py +58 -0
  192. imap_processing/tests/ultra/unit/test_cullingmask.py +87 -0
  193. imap_processing/tests/ultra/unit/test_de.py +61 -60
  194. imap_processing/tests/ultra/unit/test_ultra_l1a.py +3 -3
  195. imap_processing/tests/ultra/unit/test_ultra_l1b.py +51 -77
  196. imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +5 -5
  197. imap_processing/tests/ultra/unit/test_ultra_l1b_culling.py +114 -0
  198. imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +86 -26
  199. imap_processing/tests/ultra/unit/test_ultra_l1c.py +1 -1
  200. imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +3 -3
  201. imap_processing/ultra/constants.py +11 -1
  202. imap_processing/ultra/l1a/ultra_l1a.py +2 -2
  203. imap_processing/ultra/l1b/badtimes.py +22 -5
  204. imap_processing/ultra/l1b/cullingmask.py +31 -5
  205. imap_processing/ultra/l1b/de.py +32 -37
  206. imap_processing/ultra/l1b/extendedspin.py +44 -20
  207. imap_processing/ultra/l1b/ultra_l1b.py +21 -22
  208. imap_processing/ultra/l1b/ultra_l1b_culling.py +190 -0
  209. imap_processing/ultra/l1b/ultra_l1b_extended.py +81 -30
  210. imap_processing/ultra/l1c/histogram.py +6 -2
  211. imap_processing/ultra/l1c/pset.py +6 -2
  212. imap_processing/ultra/l1c/ultra_l1c.py +2 -3
  213. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +4 -3
  214. imap_processing/ultra/utils/ultra_l1_utils.py +70 -14
  215. imap_processing/utils.py +2 -2
  216. {imap_processing-0.9.0.dist-info → imap_processing-0.11.0.dist-info}/METADATA +7 -2
  217. {imap_processing-0.9.0.dist-info → imap_processing-0.11.0.dist-info}/RECORD +235 -152
  218. imap_processing/tests/codice/data/eu_unit_lookup_table.csv +0 -101
  219. imap_processing/tests/codice/data/idle_export_eu.COD_NHK_20230822_122700 2.csv +0 -100
  220. imap_processing/tests/codice/data/idle_export_raw.COD_NHK_20230822_122700.csv +0 -100
  221. imap_processing/tests/codice/data/imap_codice_l0_raw_20241110_v001.pkts +0 -0
  222. imap_processing/tests/hi/test_data/l1a/imap_hi_l1a_45sensor-de_20250415_v000.cdf +0 -0
  223. imap_processing/tests/hit/test_data/sci_sample1.ccsds +0 -0
  224. imap_processing/tests/ultra/unit/test_spatial_utils.py +0 -125
  225. imap_processing/ultra/utils/spatial_utils.py +0 -221
  226. /imap_processing/tests/hi/{test_data → data}/l0/20231030_H45_APP_NHK.bin +0 -0
  227. /imap_processing/tests/hi/{test_data → data}/l0/20231030_H45_APP_NHK.csv +0 -0
  228. /imap_processing/tests/hi/{test_data → data}/l0/20231030_H45_SCI_CNT.bin +0 -0
  229. /imap_processing/tests/hi/{test_data → data}/l0/20231030_H45_SCI_DE.bin +0 -0
  230. /imap_processing/tests/hi/{test_data → data}/l0/H90_NHK_20241104.bin +0 -0
  231. /imap_processing/tests/hi/{test_data → data}/l0/H90_sci_cnt_20241104.bin +0 -0
  232. /imap_processing/tests/hi/{test_data → data}/l0/H90_sci_de_20241104.bin +0 -0
  233. /imap_processing/tests/hi/{test_data → data}/l0/README.txt +0 -0
  234. /imap_processing/tests/idex/{imap_idex_l0_raw_20231214_v001.pkts → test_data/imap_idex_l0_raw_20231214_v001.pkts} +0 -0
  235. /imap_processing/tests/idex/{impact_14_tof_high_data.txt → test_data/impact_14_tof_high_data.txt} +0 -0
  236. /imap_processing/tests/mag/{imap_mag_l1a_norm-magi_20251017_v001.cdf → validation/imap_mag_l1a_norm-magi_20251017_v001.cdf} +0 -0
  237. /imap_processing/tests/mag/{mag_l0_test_data.pkts → validation/mag_l0_test_data.pkts} +0 -0
  238. /imap_processing/tests/mag/{mag_l0_test_output.csv → validation/mag_l0_test_output.csv} +0 -0
  239. /imap_processing/tests/mag/{mag_l1_test_data.pkts → validation/mag_l1_test_data.pkts} +0 -0
  240. /imap_processing/tests/mag/{mag_l1a_test_output.csv → validation/mag_l1a_test_output.csv} +0 -0
  241. {imap_processing-0.9.0.dist-info → imap_processing-0.11.0.dist-info}/LICENSE +0 -0
  242. {imap_processing-0.9.0.dist-info → imap_processing-0.11.0.dist-info}/WHEEL +0 -0
  243. {imap_processing-0.9.0.dist-info → imap_processing-0.11.0.dist-info}/entry_points.txt +0 -0
@@ -6,7 +6,9 @@ import xarray as xr
6
6
  from imap_processing.ultra.utils.ultra_l1_utils import create_dataset
7
7
 
8
8
 
9
- def calculate_pset(pset_dataset: xr.Dataset, name: str) -> xr.Dataset:
9
+ def calculate_pset(
10
+ pset_dataset: xr.Dataset, name: str, data_version: str
11
+ ) -> xr.Dataset:
10
12
  """
11
13
  Create dictionary with defined datatype for Pointing Set Grid Data.
12
14
 
@@ -16,6 +18,8 @@ def calculate_pset(pset_dataset: xr.Dataset, name: str) -> xr.Dataset:
16
18
  Dataset containing histogram data.
17
19
  name : str
18
20
  Name of the dataset.
21
+ data_version : str
22
+ Version of the data.
19
23
 
20
24
  Returns
21
25
  -------
@@ -31,6 +35,6 @@ def calculate_pset(pset_dataset: xr.Dataset, name: str) -> xr.Dataset:
31
35
  pset_dict["epoch"] = epoch
32
36
  pset_dict["esa_step"] = np.zeros(len(epoch), dtype=np.uint8)
33
37
 
34
- dataset = create_dataset(pset_dict, name, "l1c")
38
+ dataset = create_dataset(pset_dict, name, "l1c", data_version)
35
39
 
36
40
  return dataset
@@ -31,9 +31,8 @@ def ultra_l1c(data_dict: dict, data_version: str) -> list[xr.Dataset]:
31
31
  histogram_dataset = calculate_histogram(
32
32
  data_dict[f"imap_ultra_l1a_{instrument_id}sensor-histogram"],
33
33
  f"imap_ultra_l1c_{instrument_id}sensor-histogram",
34
+ data_version,
34
35
  )
35
- # TODO: move these to use ImapCdfAttributes().add_global_attribute()
36
- histogram_dataset.attrs["Data_version"] = data_version
37
36
  output_datasets = [histogram_dataset]
38
37
  elif (
39
38
  f"imap_ultra_l1b_{instrument_id}sensor-cullingmask" in data_dict
@@ -43,8 +42,8 @@ def ultra_l1c(data_dict: dict, data_version: str) -> list[xr.Dataset]:
43
42
  pset_dataset = calculate_pset(
44
43
  data_dict[f"imap_ultra_l1b_{instrument_id}sensor-de"],
45
44
  f"imap_ultra_l1c_{instrument_id}sensor-pset",
45
+ data_version,
46
46
  )
47
- pset_dataset.attrs["Data_version"] = data_version
48
47
  output_datasets = [pset_dataset]
49
48
  else:
50
49
  raise ValueError("Data dictionary does not contain the expected keys.")
@@ -6,6 +6,7 @@ import cdflib
6
6
  import numpy as np
7
7
  from numpy.typing import NDArray
8
8
 
9
+ from imap_processing.ena_maps.utils.spatial_utils import build_spatial_bins
9
10
  from imap_processing.spice.geometry import (
10
11
  SpiceFrame,
11
12
  cartesian_to_spherical,
@@ -13,7 +14,6 @@ from imap_processing.spice.geometry import (
13
14
  spherical_to_cartesian,
14
15
  )
15
16
  from imap_processing.ultra.constants import UltraConstants
16
- from imap_processing.ultra.utils.spatial_utils import build_spatial_bins
17
17
 
18
18
  # TODO: add species binning.
19
19
 
@@ -154,11 +154,12 @@ def get_helio_exposure_times(
154
154
  -----
155
155
  These calculations are performed once per pointing.
156
156
  """
157
- # Get bins and midpoints.
157
+ # Get bins and midpoints, and convert from radians to degrees.
158
158
  _, energy_midpoints = build_energy_bins()
159
159
  az_bin_edges, el_bin_edges, az_bin_midpoints, el_bin_midpoints = (
160
- build_spatial_bins()
160
+ np.rad2deg(angle_radians) for angle_radians in (build_spatial_bins())
161
161
  )
162
+
162
163
  # Initialize the exposure grid.
163
164
  exposure_3d = np.zeros(
164
165
  (len(el_bin_midpoints), len(az_bin_midpoints), len(energy_midpoints))
@@ -5,7 +5,9 @@ import xarray as xr
5
5
  from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
6
6
 
7
7
 
8
- def create_dataset(data_dict: dict, name: str, level: str) -> xr.Dataset:
8
+ def create_dataset(
9
+ data_dict: dict, name: str, level: str, data_version: str
10
+ ) -> xr.Dataset:
9
11
  """
10
12
  Create xarray for L1b data.
11
13
 
@@ -17,6 +19,8 @@ def create_dataset(data_dict: dict, name: str, level: str) -> xr.Dataset:
17
19
  Name of the dataset.
18
20
  level : str
19
21
  Level of the dataset.
22
+ data_version : str
23
+ Version of the data.
20
24
 
21
25
  Returns
22
26
  -------
@@ -26,25 +30,77 @@ def create_dataset(data_dict: dict, name: str, level: str) -> xr.Dataset:
26
30
  cdf_manager = ImapCdfAttributes()
27
31
  cdf_manager.add_instrument_global_attrs("ultra")
28
32
  cdf_manager.add_instrument_variable_attrs("ultra", level)
29
- epoch_time = xr.DataArray(
30
- data_dict["epoch"],
31
- name="epoch",
32
- dims=["epoch"],
33
- attrs=cdf_manager.get_variable_attributes("epoch"),
34
- )
33
+ cdf_manager.add_global_attribute("Data_version", data_version)
34
+
35
+ if "spin_number" in data_dict.keys():
36
+ coords = {
37
+ "spin_number": data_dict["spin_number"],
38
+ "energy_bin_geometric_mean": data_dict["energy_bin_geometric_mean"],
39
+ }
40
+ default_dimension = "spin_number"
41
+
42
+ else:
43
+ epoch_time = xr.DataArray(
44
+ data_dict["epoch"],
45
+ name="epoch",
46
+ dims=["epoch"],
47
+ attrs=cdf_manager.get_variable_attributes("epoch"),
48
+ )
49
+ if "sensor-de" in name:
50
+ component = xr.DataArray(
51
+ ["vx", "vy", "vz"],
52
+ name="component",
53
+ dims=["component"],
54
+ attrs=cdf_manager.get_variable_attributes("component"),
55
+ )
56
+ coords = {"epoch": epoch_time, "component": component}
57
+ else:
58
+ coords = {"epoch": epoch_time}
59
+ default_dimension = "epoch"
35
60
 
36
61
  dataset = xr.Dataset(
37
- coords={"epoch": epoch_time},
62
+ coords=coords,
38
63
  attrs=cdf_manager.get_global_attributes(name),
39
64
  )
40
65
 
66
+ velocity_keys = {
67
+ "direct_event_velocity",
68
+ "velocity_sc",
69
+ "velocity_dps_sc",
70
+ "velocity_dps_helio",
71
+ }
72
+ rates_keys = {
73
+ "ena_rates",
74
+ "ena_rates_threshold",
75
+ "quality_ena_rates",
76
+ }
77
+
41
78
  for key in data_dict.keys():
42
- if key == "epoch":
79
+ if key in ["epoch", "spin_number", "energy_bin_geometric_mean"]:
43
80
  continue
44
- dataset[key] = xr.DataArray(
45
- data_dict[key],
46
- dims=["epoch"],
47
- attrs=cdf_manager.get_variable_attributes(key),
48
- )
81
+ elif key in velocity_keys:
82
+ dataset[key] = xr.DataArray(
83
+ data_dict[key],
84
+ dims=["epoch", "component"],
85
+ attrs=cdf_manager.get_variable_attributes(key),
86
+ )
87
+ elif key == "ena_rates_threshold":
88
+ dataset[key] = xr.DataArray(
89
+ data_dict[key],
90
+ dims=["energy_bin_geometric_mean"],
91
+ attrs=cdf_manager.get_variable_attributes(key),
92
+ )
93
+ elif key in rates_keys:
94
+ dataset[key] = xr.DataArray(
95
+ data_dict[key],
96
+ dims=["energy_bin_geometric_mean", "spin_number"],
97
+ attrs=cdf_manager.get_variable_attributes(key),
98
+ )
99
+ else:
100
+ dataset[key] = xr.DataArray(
101
+ data_dict[key],
102
+ dims=[default_dimension],
103
+ attrs=cdf_manager.get_variable_attributes(key),
104
+ )
49
105
 
50
106
  return dataset
imap_processing/utils.py CHANGED
@@ -10,7 +10,7 @@ import pandas as pd
10
10
  import xarray as xr
11
11
  from space_packet_parser import definitions, encodings, parameters
12
12
 
13
- from imap_processing.spice.time import met_to_j2000ns
13
+ from imap_processing.spice.time import met_to_ttj2000ns
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
@@ -295,7 +295,7 @@ def packet_file_to_datasets(
295
295
  # The time key is always the first key in the data dictionary on IMAP
296
296
  time_key = next(iter(data.keys()))
297
297
  # Convert to J2000 time and use that as our primary dimension
298
- time_data = met_to_j2000ns(data[time_key])
298
+ time_data = met_to_ttj2000ns(data[time_key])
299
299
  ds = xr.Dataset(
300
300
  {
301
301
  key.lower(): (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: imap-processing
3
- Version: 0.9.0
3
+ Version: 0.11.0
4
4
  Summary: IMAP Science Operations Center Processing
5
5
  License: MIT
6
6
  Keywords: IMAP,SDC,SOC,Science Operations
@@ -41,7 +41,7 @@ Requires-Dist: pytest-cov (>=4.0.0,<5.0.0) ; extra == "test"
41
41
  Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
42
42
  Requires-Dist: requests (>=2.32.3,<3.0.0) ; extra == "test"
43
43
  Requires-Dist: ruff (==0.2.1) ; extra == "dev"
44
- Requires-Dist: sammi-cdf (>=0.1.2,<0.2.0)
44
+ Requires-Dist: sammi-cdf (>=1.0,<2.0)
45
45
  Requires-Dist: space_packet_parser (>=5.0.1,<6.0.0)
46
46
  Requires-Dist: sphinx ; extra == "doc"
47
47
  Requires-Dist: sphinxcontrib-openapi (>=0.8.3,<0.9.0) ; extra == "doc"
@@ -98,7 +98,12 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
98
98
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/subagonsouth"><img src="https://avatars.githubusercontent.com/u/16110870?v=4?s=100" width="100px;" alt="Tim Plummer"/><br /><sub><b>Tim Plummer</b></sub></a><br /></td>
99
99
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/daralynnrhode"><img src="https://avatars.githubusercontent.com/u/143308810?v=4?s=100" width="100px;" alt="Daralynn Rhode"/><br /><sub><b>Daralynn Rhode</b></sub></a><br /></td>
100
100
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/anamanica"><img src="https://avatars.githubusercontent.com/u/171708990?v=4?s=100" width="100px;" alt="Ana Manica"/><br /><sub><b>Ana Manica</b></sub></a><br /></td>
101
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/lacoak21"><img src="https://avatars.githubusercontent.com/u/48064300?v=4?s=100" width="100px;" alt="Luisa Coakley"/><br /><sub><b>Luisa Coakley</b></sub></a><br /></td>
101
102
  </tr>
103
+ <tr>
104
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/nkerman"><img src="https://avatars.githubusercontent.com/u/13221946?v=4?s=100" width="100px;" alt="Nat Kerman"/><br /><sub><b>Nat Kerman</b></sub></a><br /></td>
105
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/torimarbois"><img src="https://avatars.githubusercontent.com/u/65727848?v=4?s=100" width="100px;" alt="Tori Marbois"/><br /><sub><b>Tori Marbois</b></sub></a><br /></td>
106
+ </tr>
102
107
  </tbody>
103
108
  </table>
104
109