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
@@ -58,7 +58,7 @@ default_int32_attrs: &default_int32
58
58
 
59
59
  default_float32_attrs: &default_float32
60
60
  <<: *default
61
- FILLVAL: .NAN
61
+ FILLVAL: -1.0e31
62
62
  FORMAT: F12.6
63
63
  VALIDMIN: -3.4028235e+38
64
64
  VALIDMAX: 3.4028235e+38
@@ -213,13 +213,11 @@ energy_heliosphere:
213
213
  UNITS: keV
214
214
 
215
215
  species:
216
- <<: *default
216
+ <<: *default_uint8
217
217
  DISPLAY_TYPE: no_plot
218
218
  CATDESC: Label species type.
219
219
  FIELDNAM: Label species type.
220
- FILLVAL: "UNKNOWN"
221
- FORMAT: A8
222
- dtype: str
220
+ LABLAXIS: species
223
221
  UNITS: " "
224
222
 
225
223
  front_back_distance:
@@ -236,20 +234,6 @@ path_length:
236
234
  LABLAXIS: path_length
237
235
  UNITS: mm / 100
238
236
 
239
- azimuth:
240
- <<: *default_float32
241
- CATDESC: Azimuth.
242
- FIELDNAM: azimuth
243
- LABLAXIS: azimuth
244
- UNITS: radians
245
-
246
- elevation:
247
- <<: *default_float32
248
- CATDESC: Elevation.
249
- FIELDNAM: elevation
250
- LABLAXIS: elevation
251
- UNITS: radians
252
-
253
237
  phi:
254
238
  <<: *default_float32
255
239
  CATDESC: Ultra instrument frame event phi (azimuth with range -90 -> 90).
@@ -264,6 +248,20 @@ theta:
264
248
  LABLAXIS: theta
265
249
  UNITS: degrees
266
250
 
251
+ phi_fwhm:
252
+ <<: *default_float32
253
+ CATDESC: FWHM of the phi distribution.
254
+ FIELDNAM: phi_fwhm
255
+ LABLAXIS: phi fwhm
256
+ UNITS: degrees
257
+
258
+ theta_fwhm:
259
+ <<: *default_float32
260
+ CATDESC: FWHM of the theta distribution.
261
+ FIELDNAM: phi_fwhm
262
+ LABLAXIS: phi fwhm
263
+ UNITS: degrees
264
+
267
265
  event_efficiency:
268
266
  <<: *default_float32
269
267
  CATDESC: Estimated event efficiency for this path through the instrument.
@@ -271,6 +269,22 @@ event_efficiency:
271
269
  LABLAXIS: event efficiency
272
270
  UNITS: " "
273
271
 
272
+ direct_event_unit_velocity:
273
+ <<: *default_float32
274
+ CATDESC: Unit vector of the direct event velocity in the instrument frame.
275
+ DEPEND_1: component
276
+ FIELDNAM: direct_event_unit_velocity
277
+ LABLAXIS: direct event unit velocity
278
+ UNITS: " "
279
+
280
+ direct_event_unit_position:
281
+ <<: *default_float32
282
+ CATDESC: Unit vector of the direct event position in the instrument frame.
283
+ DEPEND_1: component
284
+ FIELDNAM: direct_event_unit_position
285
+ LABLAXIS: direct event unit position
286
+ UNITS: " "
287
+
274
288
  velocity_sc:
275
289
  <<: *default_float32
276
290
  CATDESC: x,y,z-components of the velocity vector of the ena in the spacecraft frame.
@@ -11,7 +11,7 @@ default_attrs: &default
11
11
 
12
12
  default_float32_attrs: &default_float32
13
13
  <<: *default
14
- FILLVAL: .NAN
14
+ FILLVAL: -1.0e31
15
15
  FORMAT: F12.6
16
16
  VALIDMIN: -3.4028235e+38
17
17
  VALIDMAX: 3.4028235e+38
@@ -31,22 +31,6 @@ longitude:
31
31
  LABLAXIS: longitude
32
32
  UNITS: degrees
33
33
 
34
- spin_angle:
35
- <<: *default
36
- CATDESC: Angular bin defined by central location of the bin
37
- FIELDNAM: spin_angle
38
- LABLAXIS: spin angle
39
- # TODO: come back to format
40
- UNITS: degrees
41
-
42
- time_bin:
43
- <<: *default
44
- CATDESC: Time bin defined by central location of the bin.
45
- FIELDNAM: time_bin
46
- LABLAXIS: time bin
47
- # TODO: come back to format
48
- UNITS: seconds
49
-
50
34
  species_bin:
51
35
  <<: *default
52
36
  CATDESC: Species bin defined by central location.
@@ -95,30 +79,6 @@ sid:
95
79
  # TODO: come back to format
96
80
  UNITS: " "
97
81
 
98
- row:
99
- <<: *default
100
- CATDESC: Row number.
101
- FIELDNAM: row
102
- LABLAXIS: row
103
- # TODO: come back to format
104
- UNITS: " "
105
-
106
- column:
107
- <<: *default
108
- CATDESC: Column number.
109
- FIELDNAM: column
110
- LABLAXIS: column
111
- # TODO: come back to format
112
- UNITS: " "
113
-
114
- spin:
115
- <<: *default
116
- CATDESC: Spin number at integration start.
117
- FIELDNAM: spin
118
- LABLAXIS: spin
119
- # TODO: come back to format
120
- UNITS: " "
121
-
122
82
  shcoarse:
123
83
  <<: *default
124
84
  CATDESC: CCSDS packet timestamp.
@@ -127,10 +87,10 @@ shcoarse:
127
87
  # TODO: come back to format
128
88
  UNITS: seconds
129
89
 
130
- packetdata:
131
- <<: *default
132
- CATDESC: A 2D numpy array representing pixel values. Each pixel is stored as an unsigned 16-bit integer.
133
- FIELDNAM: packetdata
134
- LABLAXIS: packet data
135
- # TODO: come back to format
136
- UNITS: " "
90
+ energy_bin_delta:
91
+ <<: *default_float32
92
+ CATDESC: Difference between the energy bin edges.
93
+ DEPEND_0: energy_bin_geometric_mean
94
+ FIELDNAM: energy_bin_delta
95
+ LABLAXIS: energy bin delta
96
+ UNITS: keV
@@ -1,9 +1,11 @@
1
1
  """Various utility functions to support creation of CDF files."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  import logging
4
6
  import re
7
+ import warnings
5
8
  from pathlib import Path
6
- from typing import Optional
7
9
 
8
10
  import imap_data_access
9
11
  import numpy as np
@@ -19,15 +21,15 @@ logger = logging.getLogger(__name__)
19
21
 
20
22
 
21
23
  def load_cdf(
22
- file_path: Path, remove_xarray_attrs: bool = True, **kwargs: dict
24
+ file_path: Path | str, remove_xarray_attrs: bool = True, **kwargs: dict
23
25
  ) -> xr.Dataset:
24
26
  """
25
27
  Load the contents of a CDF file into an ``xarray`` dataset.
26
28
 
27
29
  Parameters
28
30
  ----------
29
- file_path : Path
30
- The path to the CDF file.
31
+ file_path : Path or ImapFilePath or str
32
+ The path to the CDF file or ImapFilePath object.
31
33
  remove_xarray_attrs : bool
32
34
  Whether to remove the xarray attributes that get injected by the
33
35
  cdf_to_xarray function from the output xarray.Dataset. Default is True.
@@ -39,6 +41,9 @@ def load_cdf(
39
41
  dataset : xarray.Dataset
40
42
  The ``xarray`` dataset for the CDF file.
41
43
  """
44
+ if isinstance(file_path, imap_data_access.ImapFilePath):
45
+ file_path = file_path.construct_path()
46
+
42
47
  dataset = cdf_to_xarray(file_path, kwargs)
43
48
 
44
49
  # cdf_to_xarray converts single-value attributes to lists
@@ -61,7 +66,6 @@ def load_cdf(
61
66
 
62
67
  def write_cdf(
63
68
  dataset: xr.Dataset,
64
- parent_files: Optional[list] = None,
65
69
  **extra_cdf_kwargs: dict,
66
70
  ) -> Path:
67
71
  """
@@ -71,17 +75,19 @@ def write_cdf(
71
75
  fills in the final attributes, and converts the whole dataset to a CDF.
72
76
  The date in the file name is determined by the time of the first epoch in the
73
77
  xarray Dataset. The first 3 file name fields (mission, instrument, level) are
74
- determined by the "Logical_source" attribute. The version is determiend from
78
+ determined by the "Logical_source" attribute. The version is determined from
75
79
  "Data_version".
76
80
 
81
+ The start_date and repointing attributes in the dataset are used to override the
82
+ computed values.
83
+
84
+ If these are not included, start_date is generated from the first epoch in the
85
+ dataset and repointing is not included if the attribute is not present or None.
86
+
77
87
  Parameters
78
88
  ----------
79
89
  dataset : xarray.Dataset
80
90
  The dataset object to convert to a CDF.
81
- parent_files : list of Path, optional
82
- List of parent files that were used to make this file. These get added to
83
- the ``Parents`` global attribute:
84
- https://spdf.gsfc.nasa.gov/istp_guide/gattributes.html.
85
91
  **extra_cdf_kwargs : dict
86
92
  Additional keyword arguments to pass to the ``xarray_to_cdf`` function.
87
93
 
@@ -96,26 +102,36 @@ def write_cdf(
96
102
  # Convert J2000 epoch referenced data to datetime64
97
103
  # TODO: This implementation of epoch to time string results in an error of
98
104
  # 5 seconds due to 5 leap-second occurrences since the J2000 epoch.
99
- dt64 = TTJ2000_EPOCH + dataset["epoch"].values[0].astype("timedelta64[ns]")
100
- start_time = np.datetime_as_string(dt64, unit="D").replace("-", "")
101
-
102
- # Will now accept vXXX or XXX formats, as batch starter sends versions as vXXX.
103
- r = re.compile(r"v\d{3}")
104
- if (
105
- not isinstance(dataset.attrs["Data_version"], str)
106
- or r.match(dataset.attrs["Data_version"]) is None
107
- ):
108
- version = f"v{int(dataset.attrs['Data_version']):03d}" # vXXX
109
- else:
110
- version = dataset.attrs["Data_version"]
105
+ # TODO: Create a ttj2000_to_datetime function to handle this conversion
106
+ start_date = dataset.attrs.get("Start_date", None)
107
+
108
+ if start_date is None:
109
+ # If no start time is included, then use the first epoch in the dataset
110
+ dt64 = TTJ2000_EPOCH + dataset["epoch"].values[0].astype("timedelta64[ns]")
111
+ start_date = np.datetime_as_string(dt64, unit="D").replace("-", "")
112
+
113
+ version = dataset.attrs.get("Data_version", None)
114
+ if version is None:
115
+ warnings.warn(
116
+ "No Data_version attribute found in dataset. Using default v999.",
117
+ stacklevel=2,
118
+ )
119
+ version = "v999"
120
+ elif not re.match(r"v\d{3}", version):
121
+ raise ValueError(
122
+ f"The Data_version attribute {version} does not match expected format vXXX."
123
+ )
124
+
111
125
  repointing = dataset.attrs.get("Repointing", None)
126
+
127
+ repointing_int = int(repointing[-5:]) if repointing else None
112
128
  science_file = imap_data_access.ScienceFilePath.generate_from_inputs(
113
129
  instrument=instrument,
114
130
  data_level=data_level,
115
131
  descriptor=descriptor,
116
- start_time=start_time,
132
+ start_time=start_date,
117
133
  version=version,
118
- repointing=repointing,
134
+ repointing=repointing_int,
119
135
  )
120
136
  file_path = Path(science_file.construct_path())
121
137
  if not file_path.parent.exists():
@@ -128,13 +144,6 @@ def write_cdf(
128
144
  dataset.attrs["Logical_file_id"] = file_path.stem
129
145
  # Add the processing version to the dataset attributes
130
146
  dataset.attrs["ground_software_version"] = imap_processing._version.__version__
131
- # Add any parent files to the dataset attributes
132
- if parent_files:
133
- # Include the current files if there are any and include just the filename
134
- # [file1.txt, file2.cdf, ...]
135
- dataset.attrs["Parents"] = dataset.attrs.get("Parents", []) + [
136
- parent_file.name for parent_file in parent_files
137
- ]
138
147
 
139
148
  # Convert the xarray object to a CDF
140
149
  if "l1" in data_level:
@@ -147,7 +156,6 @@ def write_cdf(
147
156
  extra_cdf_kwargs["istp"] = True # type: ignore
148
157
 
149
158
  xarray_to_cdf(dataset, str(file_path), **extra_cdf_kwargs)
150
-
151
159
  return file_path
152
160
 
153
161
 
@@ -185,7 +193,7 @@ def parse_filename_like(filename_like: str) -> re.Match:
185
193
  r"(?P<descriptor>[^_]+)" # Required descriptor
186
194
  r"(_(?P<start_date>\d{8}))?" # Optional start date
187
195
  r"(-repoint(?P<repointing>\d{5}))?" # Optional repointing field
188
- r"(?:_v(?P<version>\d{3}))?" # Optional version
196
+ r"(?:_(?P<version>v\d{3}))?" # Optional version
189
197
  r"(?:\.(?P<extension>cdf|pkts))?$" # Optional extension
190
198
  )
191
199
  match = re.match(regex_str, filename_like)