imap-processing 0.11.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 (415) hide show
  1. imap_processing/__init__.py +11 -11
  2. imap_processing/_version.py +2 -2
  3. imap_processing/ccsds/ccsds_data.py +1 -2
  4. imap_processing/ccsds/excel_to_xtce.py +66 -18
  5. imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +24 -40
  6. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +934 -42
  7. imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +1846 -128
  8. imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +0 -5
  9. imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +10 -11
  10. imap_processing/cdf/config/imap_hi_variable_attrs.yaml +17 -19
  11. imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +27 -14
  12. imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +106 -116
  13. imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +120 -145
  14. imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +14 -0
  15. imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +25 -9
  16. imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +6 -4
  17. imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +3 -3
  18. imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +0 -12
  19. imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +1 -1
  20. imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +23 -20
  21. imap_processing/cdf/config/imap_mag_l1a_variable_attrs.yaml +361 -0
  22. imap_processing/cdf/config/imap_mag_l1b_variable_attrs.yaml +160 -0
  23. imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +160 -0
  24. imap_processing/cdf/config/imap_spacecraft_global_cdf_attrs.yaml +18 -0
  25. imap_processing/cdf/config/imap_spacecraft_variable_attrs.yaml +40 -0
  26. imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +1 -5
  27. imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +22 -0
  28. imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +12 -4
  29. imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +16 -2
  30. imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +64 -52
  31. imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +71 -47
  32. imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +180 -19
  33. imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +5045 -41
  34. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +80 -17
  35. imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +32 -57
  36. imap_processing/cdf/utils.py +52 -38
  37. imap_processing/cli.py +477 -233
  38. imap_processing/codice/codice_l1a.py +466 -131
  39. imap_processing/codice/codice_l1b.py +51 -152
  40. imap_processing/codice/constants.py +1360 -569
  41. imap_processing/codice/decompress.py +2 -6
  42. imap_processing/ena_maps/ena_maps.py +1103 -146
  43. imap_processing/ena_maps/utils/coordinates.py +19 -0
  44. imap_processing/ena_maps/utils/map_utils.py +14 -17
  45. imap_processing/ena_maps/utils/spatial_utils.py +55 -52
  46. imap_processing/glows/l1a/glows_l1a.py +28 -99
  47. imap_processing/glows/l1a/glows_l1a_data.py +2 -2
  48. imap_processing/glows/l1b/glows_l1b.py +1 -4
  49. imap_processing/glows/l1b/glows_l1b_data.py +1 -3
  50. imap_processing/glows/l2/glows_l2.py +2 -5
  51. imap_processing/hi/l1a/hi_l1a.py +54 -29
  52. imap_processing/hi/l1a/histogram.py +0 -1
  53. imap_processing/hi/l1a/science_direct_event.py +6 -8
  54. imap_processing/hi/l1b/hi_l1b.py +111 -82
  55. imap_processing/hi/l1c/hi_l1c.py +416 -32
  56. imap_processing/hi/utils.py +58 -12
  57. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-sector-dt0-factors_20250219_v002.csv +81 -0
  58. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt0-factors_20250219_v002.csv +205 -0
  59. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt1-factors_20250219_v002.csv +205 -0
  60. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt2-factors_20250219_v002.csv +205 -0
  61. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt3-factors_20250219_v002.csv +205 -0
  62. imap_processing/hit/ancillary/imap_hit_l1b-to-l2-summed-dt0-factors_20250219_v002.csv +68 -0
  63. imap_processing/hit/hit_utils.py +235 -5
  64. imap_processing/hit/l0/constants.py +20 -11
  65. imap_processing/hit/l0/decom_hit.py +21 -5
  66. imap_processing/hit/l1a/hit_l1a.py +71 -75
  67. imap_processing/hit/l1b/constants.py +321 -0
  68. imap_processing/hit/l1b/hit_l1b.py +377 -67
  69. imap_processing/hit/l2/constants.py +318 -0
  70. imap_processing/hit/l2/hit_l2.py +723 -0
  71. imap_processing/hit/packet_definitions/hit_packet_definitions.xml +1323 -71
  72. imap_processing/ialirt/l0/mag_l0_ialirt_data.py +155 -0
  73. imap_processing/ialirt/l0/parse_mag.py +374 -0
  74. imap_processing/ialirt/l0/process_swapi.py +69 -0
  75. imap_processing/ialirt/l0/process_swe.py +548 -0
  76. imap_processing/ialirt/packet_definitions/ialirt.xml +216 -208
  77. imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +1 -1
  78. imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +1 -1
  79. imap_processing/ialirt/packet_definitions/ialirt_mag.xml +115 -0
  80. imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +14 -14
  81. imap_processing/ialirt/utils/grouping.py +114 -0
  82. imap_processing/ialirt/utils/time.py +29 -0
  83. imap_processing/idex/atomic_masses.csv +22 -0
  84. imap_processing/idex/decode.py +2 -2
  85. imap_processing/idex/idex_constants.py +33 -0
  86. imap_processing/idex/idex_l0.py +22 -8
  87. imap_processing/idex/idex_l1a.py +81 -51
  88. imap_processing/idex/idex_l1b.py +13 -39
  89. imap_processing/idex/idex_l2a.py +823 -0
  90. imap_processing/idex/idex_l2b.py +120 -0
  91. imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +11 -11
  92. imap_processing/idex/packet_definitions/idex_housekeeping_packet_definition.xml +9130 -0
  93. imap_processing/lo/l0/lo_science.py +7 -2
  94. imap_processing/lo/l1a/lo_l1a.py +1 -5
  95. imap_processing/lo/l1b/lo_l1b.py +702 -29
  96. imap_processing/lo/l1b/tof_conversions.py +11 -0
  97. imap_processing/lo/l1c/lo_l1c.py +1 -4
  98. imap_processing/mag/constants.py +51 -0
  99. imap_processing/mag/imap_mag_sdc_configuration_v001.py +8 -0
  100. imap_processing/mag/l0/decom_mag.py +10 -3
  101. imap_processing/mag/l1a/mag_l1a.py +23 -19
  102. imap_processing/mag/l1a/mag_l1a_data.py +35 -10
  103. imap_processing/mag/l1b/mag_l1b.py +259 -50
  104. imap_processing/mag/l1c/interpolation_methods.py +388 -0
  105. imap_processing/mag/l1c/mag_l1c.py +621 -17
  106. imap_processing/mag/l2/mag_l2.py +140 -0
  107. imap_processing/mag/l2/mag_l2_data.py +288 -0
  108. imap_processing/quality_flags.py +1 -0
  109. imap_processing/spacecraft/packet_definitions/scid_x252.xml +538 -0
  110. imap_processing/spacecraft/quaternions.py +121 -0
  111. imap_processing/spice/geometry.py +19 -22
  112. imap_processing/spice/kernels.py +0 -276
  113. imap_processing/spice/pointing_frame.py +257 -0
  114. imap_processing/spice/repoint.py +149 -0
  115. imap_processing/spice/spin.py +38 -33
  116. imap_processing/spice/time.py +24 -0
  117. imap_processing/swapi/l1/swapi_l1.py +20 -12
  118. imap_processing/swapi/l2/swapi_l2.py +116 -5
  119. imap_processing/swapi/swapi_utils.py +32 -0
  120. imap_processing/swe/l1a/swe_l1a.py +44 -12
  121. imap_processing/swe/l1a/swe_science.py +13 -13
  122. imap_processing/swe/l1b/swe_l1b.py +898 -23
  123. imap_processing/swe/l2/swe_l2.py +75 -136
  124. imap_processing/swe/packet_definitions/swe_packet_definition.xml +1121 -1
  125. imap_processing/swe/utils/swe_constants.py +64 -0
  126. imap_processing/swe/utils/swe_utils.py +85 -28
  127. imap_processing/tests/ccsds/test_data/expected_output.xml +40 -1
  128. imap_processing/tests/ccsds/test_excel_to_xtce.py +24 -21
  129. imap_processing/tests/cdf/test_data/imap_instrument2_global_cdf_attrs.yaml +0 -2
  130. imap_processing/tests/cdf/test_utils.py +14 -16
  131. imap_processing/tests/codice/conftest.py +44 -33
  132. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
  133. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-singles_20241110193700_v0.0.0.cdf +0 -0
  134. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-ialirt_20241110193700_v0.0.0.cdf +0 -0
  135. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-omni_20241110193700_v0.0.0.cdf +0 -0
  136. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf +0 -0
  137. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-priorities_20241110193700_v0.0.0.cdf +0 -0
  138. imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-sectored_20241110193700_v0.0.0.cdf +0 -0
  139. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
  140. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf +0 -0
  141. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
  142. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf +0 -0
  143. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf +0 -0
  144. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf +0 -0
  145. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf +0 -0
  146. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf +0 -0
  147. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf +0 -0
  148. imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf +0 -0
  149. imap_processing/tests/codice/test_codice_l1a.py +126 -53
  150. imap_processing/tests/codice/test_codice_l1b.py +6 -7
  151. imap_processing/tests/codice/test_decompress.py +4 -4
  152. imap_processing/tests/conftest.py +239 -27
  153. imap_processing/tests/ena_maps/conftest.py +51 -0
  154. imap_processing/tests/ena_maps/test_ena_maps.py +1068 -110
  155. imap_processing/tests/ena_maps/test_map_utils.py +66 -43
  156. imap_processing/tests/ena_maps/test_spatial_utils.py +17 -21
  157. imap_processing/tests/glows/conftest.py +10 -14
  158. imap_processing/tests/glows/test_glows_decom.py +4 -4
  159. imap_processing/tests/glows/test_glows_l1a_cdf.py +6 -27
  160. imap_processing/tests/glows/test_glows_l1a_data.py +6 -8
  161. imap_processing/tests/glows/test_glows_l1b.py +11 -11
  162. imap_processing/tests/glows/test_glows_l1b_data.py +5 -5
  163. imap_processing/tests/glows/test_glows_l2.py +2 -8
  164. imap_processing/tests/hi/conftest.py +1 -1
  165. imap_processing/tests/hi/data/l0/H45_diag_fee_20250208.bin +0 -0
  166. imap_processing/tests/hi/data/l0/H45_diag_fee_20250208_verify.csv +205 -0
  167. imap_processing/tests/hi/test_hi_l1b.py +22 -27
  168. imap_processing/tests/hi/test_hi_l1c.py +249 -18
  169. imap_processing/tests/hi/test_l1a.py +35 -7
  170. imap_processing/tests/hi/test_science_direct_event.py +3 -3
  171. imap_processing/tests/hi/test_utils.py +24 -2
  172. imap_processing/tests/hit/helpers/l1_validation.py +74 -73
  173. imap_processing/tests/hit/test_data/hskp_sample.ccsds +0 -0
  174. imap_processing/tests/hit/test_data/imap_hit_l0_raw_20100105_v001.pkts +0 -0
  175. imap_processing/tests/hit/test_decom_hit.py +5 -1
  176. imap_processing/tests/hit/test_hit_l1a.py +32 -36
  177. imap_processing/tests/hit/test_hit_l1b.py +300 -81
  178. imap_processing/tests/hit/test_hit_l2.py +716 -0
  179. imap_processing/tests/hit/test_hit_utils.py +184 -7
  180. imap_processing/tests/hit/validation_data/hit_l1b_standard_sample2_nsrl_v4_3decimals.csv +62 -62
  181. imap_processing/tests/hit/validation_data/hskp_sample_eu_3_6_2025.csv +89 -0
  182. imap_processing/tests/hit/validation_data/hskp_sample_raw.csv +89 -88
  183. imap_processing/tests/hit/validation_data/sci_sample_raw.csv +1 -1
  184. imap_processing/tests/ialirt/data/l0/461971383-404.bin +0 -0
  185. imap_processing/tests/ialirt/data/l0/461971384-405.bin +0 -0
  186. imap_processing/tests/ialirt/data/l0/461971385-406.bin +0 -0
  187. imap_processing/tests/ialirt/data/l0/461971386-407.bin +0 -0
  188. imap_processing/tests/ialirt/data/l0/461971387-408.bin +0 -0
  189. imap_processing/tests/ialirt/data/l0/461971388-409.bin +0 -0
  190. imap_processing/tests/ialirt/data/l0/461971389-410.bin +0 -0
  191. imap_processing/tests/ialirt/data/l0/461971390-411.bin +0 -0
  192. imap_processing/tests/ialirt/data/l0/461971391-412.bin +0 -0
  193. imap_processing/tests/ialirt/data/l0/sample_decoded_i-alirt_data.csv +383 -0
  194. imap_processing/tests/ialirt/unit/test_decom_ialirt.py +16 -81
  195. imap_processing/tests/ialirt/unit/test_grouping.py +81 -0
  196. imap_processing/tests/ialirt/unit/test_parse_mag.py +223 -0
  197. imap_processing/tests/ialirt/unit/test_process_codicehi.py +3 -3
  198. imap_processing/tests/ialirt/unit/test_process_codicelo.py +3 -10
  199. imap_processing/tests/ialirt/unit/test_process_ephemeris.py +4 -4
  200. imap_processing/tests/ialirt/unit/test_process_hit.py +3 -3
  201. imap_processing/tests/ialirt/unit/test_process_swapi.py +24 -16
  202. imap_processing/tests/ialirt/unit/test_process_swe.py +319 -6
  203. imap_processing/tests/ialirt/unit/test_time.py +16 -0
  204. imap_processing/tests/idex/conftest.py +127 -6
  205. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231218_v001.pkts +0 -0
  206. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20241206_v001.pkts +0 -0
  207. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20250108_v001.pkts +0 -0
  208. imap_processing/tests/idex/test_data/impact_14_tof_high_data.txt +4508 -4508
  209. imap_processing/tests/idex/test_idex_l0.py +33 -11
  210. imap_processing/tests/idex/test_idex_l1a.py +92 -21
  211. imap_processing/tests/idex/test_idex_l1b.py +106 -27
  212. imap_processing/tests/idex/test_idex_l2a.py +399 -0
  213. imap_processing/tests/idex/test_idex_l2b.py +93 -0
  214. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20241022_v002.cdf +0 -0
  215. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20241022_v002.cdf +0 -0
  216. imap_processing/tests/lo/test_lo_l1a.py +3 -3
  217. imap_processing/tests/lo/test_lo_l1b.py +515 -6
  218. imap_processing/tests/lo/test_lo_l1c.py +1 -1
  219. imap_processing/tests/lo/test_lo_science.py +7 -7
  220. imap_processing/tests/lo/test_star_sensor.py +1 -1
  221. imap_processing/tests/mag/conftest.py +120 -2
  222. imap_processing/tests/mag/test_mag_decom.py +5 -4
  223. imap_processing/tests/mag/test_mag_l1a.py +51 -7
  224. imap_processing/tests/mag/test_mag_l1b.py +40 -59
  225. imap_processing/tests/mag/test_mag_l1c.py +354 -19
  226. imap_processing/tests/mag/test_mag_l2.py +130 -0
  227. imap_processing/tests/mag/test_mag_validation.py +247 -26
  228. imap_processing/tests/mag/validation/L1b/T009/MAGScience-normal-(2,2)-8s-20250204-16h39.csv +17 -0
  229. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-magi-out.csv +16 -16
  230. imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-mago-out.csv +16 -16
  231. imap_processing/tests/mag/validation/L1b/T010/MAGScience-normal-(2,2)-8s-20250206-12h05.csv +17 -0
  232. imap_processing/tests/mag/validation/L1b/T011/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
  233. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-magi-out.csv +16 -16
  234. imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-mago-out.csv +16 -16
  235. imap_processing/tests/mag/validation/L1b/T012/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
  236. imap_processing/tests/mag/validation/L1b/T012/data.bin +0 -0
  237. imap_processing/tests/mag/validation/L1b/T012/field_like_all_ranges.txt +19200 -0
  238. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-cal.cdf +0 -0
  239. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-in.csv +17 -0
  240. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-magi-out.csv +17 -0
  241. imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-mago-out.csv +17 -0
  242. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-in.csv +1217 -0
  243. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-out.csv +1857 -0
  244. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-in.csv +1217 -0
  245. imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-out.csv +1857 -0
  246. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-in.csv +1217 -0
  247. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-out.csv +1793 -0
  248. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-in.csv +1217 -0
  249. imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-out.csv +1793 -0
  250. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-burst-in.csv +2561 -0
  251. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-in.csv +961 -0
  252. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-out.csv +1539 -0
  253. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-in.csv +1921 -0
  254. imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-out.csv +2499 -0
  255. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-in.csv +865 -0
  256. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-out.csv +1196 -0
  257. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-in.csv +1729 -0
  258. imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-out.csv +3053 -0
  259. imap_processing/tests/mag/validation/L2/imap_mag_l1b_norm-mago_20251017_v002.cdf +0 -0
  260. imap_processing/tests/mag/validation/calibration/imap_mag_l1b-calibration_20240229_v001.cdf +0 -0
  261. imap_processing/tests/mag/validation/calibration/imap_mag_l2-calibration-matrices_20251017_v004.cdf +0 -0
  262. imap_processing/tests/mag/validation/calibration/imap_mag_l2-offsets-norm_20251017_20251017_v001.cdf +0 -0
  263. imap_processing/tests/spacecraft/data/SSR_2024_190_20_08_12_0483851794_2_DA_apid0594_1packet.pkts +0 -0
  264. imap_processing/tests/spacecraft/test_quaternions.py +71 -0
  265. imap_processing/tests/spice/test_data/fake_repoint_data.csv +5 -0
  266. imap_processing/tests/spice/test_data/fake_spin_data.csv +11 -11
  267. imap_processing/tests/spice/test_geometry.py +9 -12
  268. imap_processing/tests/spice/test_kernels.py +1 -200
  269. imap_processing/tests/spice/test_pointing_frame.py +185 -0
  270. imap_processing/tests/spice/test_repoint.py +121 -0
  271. imap_processing/tests/spice/test_spin.py +50 -9
  272. imap_processing/tests/spice/test_time.py +14 -0
  273. imap_processing/tests/swapi/lut/imap_swapi_esa-unit-conversion_20250211_v000.csv +73 -0
  274. imap_processing/tests/swapi/lut/imap_swapi_lut-notes_20250211_v000.csv +1025 -0
  275. imap_processing/tests/swapi/test_swapi_l1.py +13 -11
  276. imap_processing/tests/swapi/test_swapi_l2.py +180 -8
  277. imap_processing/tests/swe/l0_data/2024051010_SWE_HK_packet.bin +0 -0
  278. imap_processing/tests/swe/l0_data/2024051011_SWE_CEM_RAW_packet.bin +0 -0
  279. imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_APP_HK_20240510_092742.csv +49 -0
  280. imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_CEM_RAW_20240510_092742.csv +593 -0
  281. imap_processing/tests/swe/lut/checker-board-indices.csv +24 -0
  282. imap_processing/tests/swe/lut/imap_swe_esa-lut_20250301_v000.csv +385 -0
  283. imap_processing/tests/swe/lut/imap_swe_l1b-in-flight-cal_20240510_20260716_v000.csv +3 -0
  284. imap_processing/tests/swe/test_swe_l1a.py +20 -2
  285. imap_processing/tests/swe/test_swe_l1a_cem_raw.py +52 -0
  286. imap_processing/tests/swe/test_swe_l1a_hk.py +68 -0
  287. imap_processing/tests/swe/test_swe_l1a_science.py +3 -3
  288. imap_processing/tests/swe/test_swe_l1b.py +162 -24
  289. imap_processing/tests/swe/test_swe_l2.py +153 -91
  290. imap_processing/tests/test_cli.py +171 -88
  291. imap_processing/tests/test_utils.py +140 -17
  292. imap_processing/tests/ultra/data/l0/FM45_UltraFM45_Functional_2024-01-22T0105_20240122T010548.CCSDS +0 -0
  293. imap_processing/tests/ultra/data/l0/ultra45_raw_sc_ultraimgrates_20220530_00.csv +164 -0
  294. 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
  295. imap_processing/tests/ultra/data/mock_data.py +369 -0
  296. imap_processing/tests/ultra/unit/conftest.py +115 -89
  297. imap_processing/tests/ultra/unit/test_badtimes.py +4 -4
  298. imap_processing/tests/ultra/unit/test_cullingmask.py +8 -6
  299. imap_processing/tests/ultra/unit/test_de.py +14 -13
  300. imap_processing/tests/ultra/unit/test_decom_apid_880.py +27 -76
  301. imap_processing/tests/ultra/unit/test_decom_apid_881.py +54 -11
  302. imap_processing/tests/ultra/unit/test_decom_apid_883.py +12 -10
  303. imap_processing/tests/ultra/unit/test_decom_apid_896.py +202 -55
  304. imap_processing/tests/ultra/unit/test_lookup_utils.py +23 -1
  305. imap_processing/tests/ultra/unit/test_spacecraft_pset.py +77 -0
  306. imap_processing/tests/ultra/unit/test_ultra_l1a.py +98 -305
  307. imap_processing/tests/ultra/unit/test_ultra_l1b.py +60 -14
  308. imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +2 -2
  309. imap_processing/tests/ultra/unit/test_ultra_l1b_culling.py +26 -27
  310. imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +239 -70
  311. imap_processing/tests/ultra/unit/test_ultra_l1c.py +5 -5
  312. imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +114 -83
  313. imap_processing/tests/ultra/unit/test_ultra_l2.py +230 -0
  314. imap_processing/ultra/constants.py +1 -1
  315. imap_processing/ultra/l0/decom_tools.py +27 -39
  316. imap_processing/ultra/l0/decom_ultra.py +168 -204
  317. imap_processing/ultra/l0/ultra_utils.py +152 -136
  318. imap_processing/ultra/l1a/ultra_l1a.py +55 -271
  319. imap_processing/ultra/l1b/badtimes.py +1 -4
  320. imap_processing/ultra/l1b/cullingmask.py +2 -6
  321. imap_processing/ultra/l1b/de.py +116 -57
  322. imap_processing/ultra/l1b/extendedspin.py +20 -18
  323. imap_processing/ultra/l1b/lookup_utils.py +72 -9
  324. imap_processing/ultra/l1b/ultra_l1b.py +36 -16
  325. imap_processing/ultra/l1b/ultra_l1b_culling.py +66 -30
  326. imap_processing/ultra/l1b/ultra_l1b_extended.py +297 -94
  327. imap_processing/ultra/l1c/histogram.py +2 -6
  328. imap_processing/ultra/l1c/spacecraft_pset.py +84 -0
  329. imap_processing/ultra/l1c/ultra_l1c.py +8 -9
  330. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +206 -108
  331. imap_processing/ultra/l2/ultra_l2.py +299 -0
  332. imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_LeftSlit.csv +526 -0
  333. imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_RightSlit.csv +526 -0
  334. imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_LeftSlit.csv +526 -0
  335. imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_RightSlit.csv +526 -0
  336. imap_processing/ultra/lookup_tables/FM45_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -2
  337. imap_processing/ultra/lookup_tables/FM90_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -0
  338. imap_processing/ultra/packet_definitions/README.md +38 -0
  339. imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +15302 -482
  340. imap_processing/ultra/utils/ultra_l1_utils.py +31 -12
  341. imap_processing/utils.py +69 -29
  342. {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/METADATA +10 -6
  343. imap_processing-0.13.0.dist-info/RECORD +578 -0
  344. imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +0 -237
  345. imap_processing/hi/l1a/housekeeping.py +0 -27
  346. imap_processing/hi/l1b/hi_eng_unit_convert_table.csv +0 -154
  347. imap_processing/swe/l1b/swe_esa_lookup_table.csv +0 -1441
  348. imap_processing/swe/l1b/swe_l1b_science.py +0 -652
  349. imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-aggregated_20240429_v001.cdf +0 -0
  350. imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-singles_20240429_v001.cdf +0 -0
  351. imap_processing/tests/codice/data/imap_codice_l1a_hi-omni_20240429_v001.cdf +0 -0
  352. imap_processing/tests/codice/data/imap_codice_l1a_hi-sectored_20240429_v001.cdf +0 -0
  353. imap_processing/tests/codice/data/imap_codice_l1a_hskp_20100101_v001.cdf +0 -0
  354. imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-aggregated_20240429_v001.cdf +0 -0
  355. imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-singles_20240429_v001.cdf +0 -0
  356. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-angular_20240429_v001.cdf +0 -0
  357. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-priority_20240429_v001.cdf +0 -0
  358. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-species_20240429_v001.cdf +0 -0
  359. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-angular_20240429_v001.cdf +0 -0
  360. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-priority_20240429_v001.cdf +0 -0
  361. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-species_20240429_v001.cdf +0 -0
  362. imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-aggregated_20240429_v001.cdf +0 -0
  363. imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-singles_20240429_v001.cdf +0 -0
  364. imap_processing/tests/codice/data/imap_codice_l1b_hi-omni_20240429_v001.cdf +0 -0
  365. imap_processing/tests/codice/data/imap_codice_l1b_hi-sectored_20240429_v001.cdf +0 -0
  366. imap_processing/tests/codice/data/imap_codice_l1b_hskp_20100101_v001.cdf +0 -0
  367. imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-aggregated_20240429_v001.cdf +0 -0
  368. imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-singles_20240429_v001.cdf +0 -0
  369. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-angular_20240429_v001.cdf +0 -0
  370. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-priority_20240429_v001.cdf +0 -0
  371. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-species_20240429_v001.cdf +0 -0
  372. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-angular_20240429_v001.cdf +0 -0
  373. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-priority_20240429_v001.cdf +0 -0
  374. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-species_20240429_v001.cdf +0 -0
  375. imap_processing/tests/hi/data/l1/imap_hi_l1b_45sensor-de_20250415_v999.cdf +0 -0
  376. imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1251.pkts +0 -0
  377. imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1252.pkts +0 -0
  378. imap_processing/tests/hit/validation_data/hskp_sample_eu.csv +0 -89
  379. imap_processing/tests/hit/validation_data/sci_sample_raw1.csv +0 -29
  380. imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231214_v001.pkts +0 -0
  381. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20100101_v001.cdf +0 -0
  382. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20100101_v001.cdf +0 -0
  383. imap_processing/tests/swe/test_swe_l1b_science.py +0 -84
  384. imap_processing/tests/ultra/test_data/mock_data.py +0 -161
  385. imap_processing/ultra/l1c/pset.py +0 -40
  386. imap_processing/ultra/lookup_tables/dps_sensitivity45.cdf +0 -0
  387. imap_processing-0.11.0.dist-info/RECORD +0 -488
  388. /imap_processing/idex/packet_definitions/{idex_packet_definition.xml → idex_science_packet_definition.xml} +0 -0
  389. /imap_processing/tests/ialirt/{test_data → data}/l0/20240827095047_SWE_IALIRT_packet.bin +0 -0
  390. /imap_processing/tests/ialirt/{test_data → data}/l0/BinLog CCSDS_FRAG_TLM_20240826_152323Z_IALIRT_data_for_SDC.bin +0 -0
  391. /imap_processing/tests/ialirt/{test_data → data}/l0/IALiRT Raw Packet Telemetry.txt +0 -0
  392. /imap_processing/tests/ialirt/{test_data → data}/l0/apid01152.tlm +0 -0
  393. /imap_processing/tests/ialirt/{test_data → data}/l0/eu_SWP_IAL_20240826_152033.csv +0 -0
  394. /imap_processing/tests/ialirt/{test_data → data}/l0/hi_fsw_view_1_ccsds.bin +0 -0
  395. /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.ccsds +0 -0
  396. /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.csv +0 -0
  397. /imap_processing/tests/ialirt/{test_data → data}/l0/idle_export_eu.SWE_IALIRT_20240827_093852.csv +0 -0
  398. /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_hi-ialirt_20240523200000_v0.0.0.cdf +0 -0
  399. /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
  400. /imap_processing/{mag/l1b → tests/spacecraft}/__init__.py +0 -0
  401. /imap_processing/{swe/l1b/engineering_unit_convert_table.csv → tests/swe/lut/imap_swe_eu-conversion_20240510_v000.csv} +0 -0
  402. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50_theta-0.00_20240207T102740.CCSDS +0 -0
  403. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_7P_Phi0.0_BeamCal_LinearScan_phi0.04_theta-0.01_20230821T121304.CCSDS +0 -0
  404. /imap_processing/tests/ultra/{test_data → data}/l0/FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.CCSDS +0 -0
  405. /imap_processing/tests/ultra/{test_data → data}/l0/Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.CCSDS +0 -0
  406. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_auxdata_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
  407. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_enaphxtofhangimg_FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.csv +0 -0
  408. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultraimgrates_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
  409. /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultrarawimgevent_FM45_7P_Phi00_BeamCal_LinearScan_phi004_theta-001_20230821T121304.csv +0 -0
  410. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E1.cdf +0 -0
  411. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E12.cdf +0 -0
  412. /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E24.cdf +0 -0
  413. {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/LICENSE +0 -0
  414. {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/WHEEL +0 -0
  415. {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,64 @@
1
+ """Module containing constants used in the SWE processing pipeline."""
2
+
3
+ import numpy as np
4
+
5
+ N_ESA_STEPS = 24
6
+ N_ANGLE_SECTORS = 30
7
+ N_CEMS = 7
8
+ N_QUARTER_CYCLES = 4
9
+ N_ANGLE_BINS = 30
10
+ N_QUARTER_CYCLE_STEPS = 180
11
+
12
+ MICROSECONDS_IN_SECOND = 1e6
13
+
14
+ # TODO: add these to instrument status summary
15
+ ENERGY_CONVERSION_FACTOR = 4.75
16
+ # 7 CEMs geometric factors in cm^2 sr eV/eV units.
17
+ GEOMETRIC_FACTORS = np.array(
18
+ [
19
+ 435e-6,
20
+ 599e-6,
21
+ 808e-6,
22
+ 781e-6,
23
+ 876e-6,
24
+ 548e-6,
25
+ 432e-6,
26
+ ]
27
+ )
28
+
29
+ ELECTRON_MASS = 9.10938356e-31 # kg
30
+
31
+ # See doc string of calculate_phase_space_density() for more details.
32
+ VELOCITY_CONVERSION_FACTOR = 1.237e31
33
+ # See doc string of calculate_flux() for more details.
34
+ FLUX_CONVERSION_FACTOR = 6.187e30
35
+
36
+ CEM_DETECTORS_ANGLE = np.array([-63, -42, -21, 0, 21, 42, 63])
37
+
38
+ # ESA voltage and index in the final data table
39
+ ESA_VOLTAGE_ROW_INDEX_DICT = {
40
+ 0.56: 0,
41
+ 0.78: 1,
42
+ 1.08: 2,
43
+ 1.51: 3,
44
+ 2.10: 4,
45
+ 2.92: 5,
46
+ 4.06: 6,
47
+ 5.64: 7,
48
+ 7.85: 8,
49
+ 10.92: 9,
50
+ 15.19: 10,
51
+ 21.13: 11,
52
+ 29.39: 12,
53
+ 40.88: 13,
54
+ 56.87: 14,
55
+ 79.10: 15,
56
+ 110.03: 16,
57
+ 153.05: 17,
58
+ 212.89: 18,
59
+ 296.14: 19,
60
+ 411.93: 20,
61
+ 572.99: 21,
62
+ 797.03: 22,
63
+ 1108.66: 23,
64
+ }
@@ -2,43 +2,20 @@
2
2
 
3
3
  from enum import IntEnum
4
4
 
5
+ import numpy as np
6
+ import numpy.typing as npt
5
7
  import pandas as pd
6
8
 
7
9
  from imap_processing import imap_module_directory
8
-
9
- # ESA voltage and index in the final data table
10
- ESA_VOLTAGE_ROW_INDEX_DICT = {
11
- 0.56: 0,
12
- 0.78: 1,
13
- 1.08: 2,
14
- 1.51: 3,
15
- 2.10: 4,
16
- 2.92: 5,
17
- 4.06: 6,
18
- 5.64: 7,
19
- 7.85: 8,
20
- 10.92: 9,
21
- 15.19: 10,
22
- 21.13: 11,
23
- 29.39: 12,
24
- 40.88: 13,
25
- 56.87: 14,
26
- 79.10: 15,
27
- 110.03: 16,
28
- 153.05: 17,
29
- 212.89: 18,
30
- 296.14: 19,
31
- 411.93: 20,
32
- 572.99: 21,
33
- 797.03: 22,
34
- 1108.66: 23,
35
- }
10
+ from imap_processing.swe.utils import swe_constants
36
11
 
37
12
 
38
13
  class SWEAPID(IntEnum):
39
14
  """Create ENUM for apid."""
40
15
 
41
16
  SWE_SCIENCE = 1344
17
+ SWE_APP_HK = 1330
18
+ SWE_CEM_RAW = 1334
42
19
 
43
20
 
44
21
  def read_lookup_table() -> pd.DataFrame:
@@ -54,3 +31,83 @@ def read_lookup_table() -> pd.DataFrame:
54
31
  lookup_table_path = imap_module_directory / "swe/l1b/swe_esa_lookup_table.csv"
55
32
  esa_table = pd.read_csv(lookup_table_path)
56
33
  return esa_table
34
+
35
+
36
+ def combine_acquisition_time(
37
+ acq_start_coarse: np.ndarray, acq_start_fine: np.ndarray
38
+ ) -> npt.NDArray:
39
+ """
40
+ Combine acquisition time of each quarter cycle measurement.
41
+
42
+ Each quarter cycle data should have same acquisition start time coarse
43
+ and fine value. We will use that as base time to calculate each
44
+ acquisition time for each count data.
45
+ base_quarter_cycle_acq_time = acq_start_coarse +
46
+ | acq_start_fine / 1000000
47
+
48
+ Parameters
49
+ ----------
50
+ acq_start_coarse : np.ndarray
51
+ Acq start coarse. It is in seconds.
52
+ acq_start_fine : np.ndarray
53
+ Acq start fine. It is in microseconds.
54
+
55
+ Returns
56
+ -------
57
+ np.ndarray
58
+ Acquisition time in seconds.
59
+ """
60
+ epoch_center_time = acq_start_coarse + (
61
+ acq_start_fine / swe_constants.MICROSECONDS_IN_SECOND
62
+ )
63
+ return epoch_center_time
64
+
65
+
66
+ def calculate_data_acquisition_time(
67
+ acq_start_time: np.ndarray,
68
+ esa_step_number: int,
69
+ acq_duration: int,
70
+ settle_duration: int,
71
+ ) -> npt.NDArray:
72
+ """
73
+ Calculate center acquisition time of each science data point.
74
+
75
+ Center acquisition time (in seconds) of each count data
76
+ point at each energy and at angle step will be
77
+ calculated using this formula:
78
+ | each_count_acq_time = acq_start_time +
79
+ | (step * ( acq_duration + settle_duration) / 1000000 )
80
+ where 'step' goes from 0 to 179, acq_start_time is in seconds and
81
+ settle_duration and acq_duration are in microseconds.
82
+
83
+ To calculate center time of data acquisition time, we will add
84
+ | each_count_acq_time + (acq_duration / 1000000) / 2
85
+
86
+ Parameters
87
+ ----------
88
+ acq_start_time : np.ndarray
89
+ Start acquisition time in seconds.
90
+ esa_step_number : int
91
+ Energy step.
92
+ acq_duration : int
93
+ Acquisition duration in microseconds.
94
+ settle_duration : int
95
+ Settle duration in microseconds.
96
+
97
+ Returns
98
+ -------
99
+ esa_step_number_acq_time : np.ndarray
100
+ ESA step number acquisition center time in seconds.
101
+ """
102
+ # Calculate time for each ESA step
103
+ esa_step_number_acq_time = (
104
+ acq_start_time
105
+ + (
106
+ esa_step_number
107
+ * (acq_duration + settle_duration)
108
+ / swe_constants.MICROSECONDS_IN_SECOND
109
+ )
110
+ + (acq_duration / swe_constants.MICROSECONDS_IN_SECOND) / 2
111
+ )
112
+
113
+ return esa_step_number_acq_time
@@ -48,7 +48,7 @@
48
48
  <xtce:SizeInBits>
49
49
  <xtce:DynamicValue>
50
50
  <xtce:ParameterInstanceRef parameterRef="PKT_LEN" />
51
- <xtce:LinearAdjustment slope="8" intercept="-71" />
51
+ <xtce:LinearAdjustment slope="8" intercept="-79" />
52
52
  </xtce:DynamicValue>
53
53
  </xtce:SizeInBits>
54
54
  </xtce:BinaryDataEncoding>
@@ -67,6 +67,41 @@
67
67
  <xtce:Enumeration value="2" label="NONE" />
68
68
  </xtce:EnumerationList>
69
69
  </xtce:EnumeratedParameterType>
70
+ <xtce:IntegerParameterType name="TEST_PACKET.VAR_SEGMENTED" signed="false">
71
+ <xtce:IntegerDataEncoding sizeInBits="8" encoding="unsigned">
72
+ <xtce:ContextCalibratorList>
73
+ <xtce:ContextCalibrator>
74
+ <xtce:ContextMatch>
75
+ <xtce:ComparisonList>
76
+ <xtce:Comparison comparisonOperator="&gt;=" value="0" parameterRef="TEST_PACKET.VAR_SEGMENTED" useCalibratedValue="false" />
77
+ <xtce:Comparison comparisonOperator="&lt;=" value="19" parameterRef="TEST_PACKET.VAR_SEGMENTED" useCalibratedValue="false" />
78
+ </xtce:ComparisonList>
79
+ </xtce:ContextMatch>
80
+ <xtce:Calibrator>
81
+ <xtce:PolynomialCalibrator>
82
+ <xtce:Term coefficient="1.1" exponent="0" />
83
+ <xtce:Term coefficient="3.3" exponent="1" />
84
+ </xtce:PolynomialCalibrator>
85
+ </xtce:Calibrator>
86
+ </xtce:ContextCalibrator>
87
+ <xtce:ContextCalibrator>
88
+ <xtce:ContextMatch>
89
+ <xtce:ComparisonList>
90
+ <xtce:Comparison comparisonOperator="&gt;=" value="20" parameterRef="TEST_PACKET.VAR_SEGMENTED" useCalibratedValue="false" />
91
+ <xtce:Comparison comparisonOperator="&lt;=" value="40" parameterRef="TEST_PACKET.VAR_SEGMENTED" useCalibratedValue="false" />
92
+ </xtce:ComparisonList>
93
+ </xtce:ContextMatch>
94
+ <xtce:Calibrator>
95
+ <xtce:PolynomialCalibrator>
96
+ <xtce:Term coefficient="2.2" exponent="0" />
97
+ <xtce:Term coefficient="4.4" exponent="1" />
98
+ <xtce:Term coefficient="5.5" exponent="2" />
99
+ </xtce:PolynomialCalibrator>
100
+ </xtce:Calibrator>
101
+ </xtce:ContextCalibrator>
102
+ </xtce:ContextCalibratorList>
103
+ </xtce:IntegerDataEncoding>
104
+ </xtce:IntegerParameterType>
70
105
  <xtce:IntegerParameterType name="TEST_PACKET2.SHCOARSE" signed="false">
71
106
  <xtce:IntegerDataEncoding sizeInBits="32" encoding="unsigned" />
72
107
  </xtce:IntegerParameterType>
@@ -120,6 +155,9 @@
120
155
  <xtce:Parameter name="TEST_PACKET.VAR_STATE" parameterTypeRef="TEST_PACKET.VAR_STATE">
121
156
  <xtce:LongDescription>State data</xtce:LongDescription>
122
157
  </xtce:Parameter>
158
+ <xtce:Parameter name="TEST_PACKET.VAR_SEGMENTED" parameterTypeRef="TEST_PACKET.VAR_SEGMENTED">
159
+ <xtce:LongDescription>Segmented polynomial conversion</xtce:LongDescription>
160
+ </xtce:Parameter>
123
161
  <xtce:Parameter name="TEST_PACKET2.SHCOARSE" parameterTypeRef="TEST_PACKET2.SHCOARSE">
124
162
  <xtce:LongDescription>Mission elapsed time</xtce:LongDescription>
125
163
  </xtce:Parameter>
@@ -154,6 +192,7 @@
154
192
  <xtce:ParameterRefEntry parameterRef="TEST_PACKET.VAR_FILL" />
155
193
  <xtce:ParameterRefEntry parameterRef="TEST_PACKET.VAR_FLOAT" />
156
194
  <xtce:ParameterRefEntry parameterRef="TEST_PACKET.VAR_STATE" />
195
+ <xtce:ParameterRefEntry parameterRef="TEST_PACKET.VAR_SEGMENTED" />
157
196
  </xtce:EntryList>
158
197
  </xtce:SequenceContainer>
159
198
  <xtce:SequenceContainer name="TEST_PACKET2">
@@ -12,7 +12,7 @@ from imap_processing.ccsds import excel_to_xtce
12
12
  pytest.importorskip("openpyxl")
13
13
 
14
14
 
15
- @pytest.fixture()
15
+ @pytest.fixture
16
16
  def xtce_excel_file(tmp_path):
17
17
  """Create an excel file for testing.
18
18
 
@@ -27,7 +27,7 @@ def xtce_excel_file(tmp_path):
27
27
  packets = {"packetName": ["TEST_PACKET", "TEST_PACKET2"], "apIdHex": ["0x1", "0xF"]}
28
28
 
29
29
  test_packet1 = {
30
- "packetName": ["TEST_PACKET"] * 15,
30
+ "packetName": ["TEST_PACKET"] * 16,
31
31
  "mnemonic": [
32
32
  "PHVERNO",
33
33
  "PHTYPE",
@@ -44,8 +44,9 @@ def xtce_excel_file(tmp_path):
44
44
  "VAR_FILL",
45
45
  "VAR_FLOAT",
46
46
  "VAR_STATE",
47
+ "VAR_SEGMENTED",
47
48
  ],
48
- "lengthInBits": [3, 1, 1, 11, 2, 14, 16, 32, 2, 4, 5, 10000, 3, 32, 1],
49
+ "lengthInBits": [3, 1, 1, 11, 2, 14, 16, 32, 2, 4, 5, 10000, 3, 32, 1, 8],
49
50
  "dataType": [
50
51
  "UINT",
51
52
  "UINT",
@@ -62,6 +63,7 @@ def xtce_excel_file(tmp_path):
62
63
  "FILL",
63
64
  "FLOAT",
64
65
  "UINT",
66
+ "UINT",
65
67
  ],
66
68
  "convertAs": [
67
69
  "NONE",
@@ -79,6 +81,7 @@ def xtce_excel_file(tmp_path):
79
81
  "NONE",
80
82
  "NONE",
81
83
  "STATE",
84
+ "ANALOG",
82
85
  ],
83
86
  "units": [
84
87
  "DN",
@@ -96,6 +99,7 @@ def xtce_excel_file(tmp_path):
96
99
  "DN",
97
100
  "DN",
98
101
  "DN",
102
+ "DN",
99
103
  ],
100
104
  "longDescription": [
101
105
  "CCSDS Packet Version Number",
@@ -113,6 +117,7 @@ def xtce_excel_file(tmp_path):
113
117
  "Fill data",
114
118
  "Float data",
115
119
  "State data",
120
+ "Segmented polynomial conversion",
116
121
  ],
117
122
  }
118
123
 
@@ -178,27 +183,27 @@ def xtce_excel_file(tmp_path):
178
183
  }
179
184
 
180
185
  analog_conversions = {
181
- "packetName": ["TEST_PACKET"],
182
- "mnemonic": ["VAR_UINT"],
183
- "convertAs": ["UNSEGMENTED_POLY"],
184
- "segNumber": [1],
185
- "lowValue": [0],
186
- "highValue": [100],
187
- "c0": [1.5],
188
- "c1": [2.5],
189
- "c2": [0],
190
- "c3": [0],
191
- "c4": [0],
192
- "c5": [0],
193
- "c6": [0],
194
- "c7": [0],
186
+ "packetName": ["TEST_PACKET", "TEST_PACKET", "TEST_PACKET"],
187
+ "mnemonic": ["VAR_UINT", "VAR_SEGMENTED", "VAR_SEGMENTED"],
188
+ "convertAs": ["UNSEGMENTED_POLY", "SEGMENTED_POLY", "SEGMENTED_POLY"],
189
+ "segNumber": [1, 1, 2],
190
+ "lowValue": [0, 0, 20],
191
+ "highValue": [100, 19, 40],
192
+ "c0": [1.5, 1.1, 2.2],
193
+ "c1": [2.5, 3.3, 4.4],
194
+ "c2": [0, 0, 5.5],
195
+ "c3": [0] * 3,
196
+ "c4": [0] * 3,
197
+ "c5": [0] * 3,
198
+ "c6": [0] * 3,
199
+ "c7": [0] * 3,
195
200
  }
196
201
 
197
202
  states = {
198
203
  "packetName": ["TEST_PACKET"] * 3,
199
204
  "mnemonic": ["VAR_STATE"] * 3,
200
205
  "value": [0, 1, "0x2"],
201
- "state": ["OFF", "ON", "NONE"],
206
+ "state": ["OFF ", "ON", "NONE"],
202
207
  }
203
208
 
204
209
  # Write the DataFrame to an excel file
@@ -228,9 +233,7 @@ def xtce_excel_file(tmp_path):
228
233
  def test_generated_xml(xtce_excel_file):
229
234
  """Make sure we are producing the expected contents within the XML file.
230
235
 
231
- To produce a new expected output file the following command can be used.
232
- imap_xtce imap_processing/tests/ccsds/test_data/excel_to_xtce_test_file.xlsx
233
- --output imap_processing/tests/ccsds/test_data/expected_output.xml
236
+ To produce a new expected output file, uncomment the line mentioned below.
234
237
  """
235
238
  generator = excel_to_xtce.XTCEGenerator(xtce_excel_file)
236
239
  output_file = xtce_excel_file.parent / "output.xml"
@@ -10,14 +10,12 @@ instrument_base: &instrument_base
10
10
 
11
11
  imap_swe_l1a_sci:
12
12
  <<: *instrument_base
13
- Data_level: 1A
14
13
  Data_type: L1A_SCI>Level-1A Science data
15
14
  Logical_source: imap_swe_l1a_sci
16
15
  Logical_source_description: SWE Instrument Level-1A Science Data
17
16
 
18
17
  imap_swe_l1b_sci:
19
18
  <<: *instrument_base
20
- Data_level: 1A
21
19
  Data_type: L1B_SCI>Level-1B Science data
22
20
  Logical_source: imap_swe_l1b_sci
23
21
  Logical_source_description: SWE Instrument Level-1B Science Data
@@ -1,7 +1,5 @@
1
1
  """Tests for the ``cdf.utils`` module."""
2
2
 
3
- from pathlib import Path
4
-
5
3
  import imap_data_access
6
4
  import numpy as np
7
5
  import pytest
@@ -16,7 +14,7 @@ from imap_processing.cdf.utils import (
16
14
  from imap_processing.spice.time import met_to_ttj2000ns
17
15
 
18
16
 
19
- @pytest.fixture()
17
+ @pytest.fixture
20
18
  def test_dataset():
21
19
  """Create a simple ``xarray`` dataset to be used in testing
22
20
 
@@ -28,7 +26,7 @@ def test_dataset():
28
26
  # Load the CDF attrs
29
27
  swe_attrs = ImapCdfAttributes()
30
28
  swe_attrs.add_instrument_global_attrs("swe")
31
- swe_attrs.add_global_attribute("Data_version", "001")
29
+ swe_attrs.add_global_attribute("Data_version", "v001")
32
30
 
33
31
  dataset = xr.Dataset(
34
32
  {
@@ -97,17 +95,17 @@ def test_written_and_loaded_dataset(test_dataset):
97
95
  assert str(test_dataset) == str(new_dataset)
98
96
 
99
97
 
100
- def test_parents_injection(test_dataset):
101
- """Tests the ``write_cdf`` function for Parents attribute injection.
98
+ def test_repoint_start_date(test_dataset):
99
+ output_file_path = write_cdf(test_dataset)
100
+ assert "imap_swe_l1a_sci_20100101_v001.cdf" in output_file_path.name
101
+ test_dataset.attrs["Start_date"] = "20001212"
102
102
 
103
- Parameters
104
- ----------
105
- test_dataset : xarray.Dataset
106
- An ``xarray`` dataset object to test with
107
- """
108
- parent_paths = [Path("test_parent1.cdf"), Path("/abc/test_parent2.cdf")]
109
- new_dataset = load_cdf(write_cdf(test_dataset, parent_files=parent_paths))
110
- assert new_dataset.attrs["Parents"] == [p.name for p in parent_paths]
103
+ output_file_path = write_cdf(test_dataset)
104
+ assert "imap_swe_l1a_sci_20001212_v001.cdf" in output_file_path.name
105
+
106
+ test_dataset.attrs["Repointing"] = "12345"
107
+ output_file_path = write_cdf(test_dataset)
108
+ assert "imap_swe_l1a_sci_20001212-repoint12345_v001.cdf" in output_file_path.name
111
109
 
112
110
 
113
111
  @pytest.mark.parametrize(
@@ -131,7 +129,7 @@ def test_parents_injection(test_dataset):
131
129
  "data_level": "l1a",
132
130
  "descriptor": "hist",
133
131
  "start_date": "20250415",
134
- "version": "001",
132
+ "version": "v001",
135
133
  },
136
134
  ),
137
135
  (
@@ -144,7 +142,7 @@ def test_parents_injection(test_dataset):
144
142
  "descriptor": "pset",
145
143
  "start_date": "20250415",
146
144
  "repointing": "12345",
147
- "version": "001",
145
+ "version": "v001",
148
146
  "extension": "cdf",
149
147
  },
150
148
  ),
@@ -1,43 +1,54 @@
1
1
  from imap_processing import imap_module_directory
2
2
 
3
- TEST_DATA_PATH = imap_module_directory / "tests" / "codice" / "data"
3
+ TEST_L0_DATA_PATH = imap_module_directory / "tests" / "codice" / "data"
4
+ TEST_L0_FILE = TEST_L0_DATA_PATH / "imap_codice_l0_raw_20241110_v001.pkts"
5
+ TEST_L1A_DATA_PATH = (
6
+ imap_module_directory
7
+ / "codice"
8
+ / "data"
9
+ / "imap"
10
+ / "codice"
11
+ / "l1a"
12
+ / "2024"
13
+ / "11"
14
+ )
4
15
 
5
- TEST_L0_FILE = TEST_DATA_PATH / "imap_codice_l0_raw_20241110_v001.pkts"
6
16
 
7
17
  TEST_L1A_FILES = [
8
- TEST_DATA_PATH / "imap_codice_l1a_hskp_20100101_v001.pkts",
9
- TEST_DATA_PATH / "imap_codice_l1a_hi-counters-aggregated_20240429_v001.pkts",
10
- TEST_DATA_PATH / "imap_codice_l1a_hi-counters-singles_20240429_v001.pkts",
11
- TEST_DATA_PATH / "imap_codice_l1a_hi-omni_20240429_v001.pkts",
12
- TEST_DATA_PATH / "imap_codice_l1a_hi-sectored_20240429_v001.pkts",
13
- TEST_DATA_PATH / "imap_codice_l1a_lo-counters-aggregated_20240429_v001.pkts",
14
- TEST_DATA_PATH / "imap_codice_l1a_lo-counters-singles_20240429_v001.pkts",
15
- TEST_DATA_PATH / "imap_codice_l1a_lo-sw-angular_20240429_v001.pkts",
16
- TEST_DATA_PATH / "imap_codice_l1a_lo-nsw-angular_20240429_v001.pkts",
17
- TEST_DATA_PATH / "imap_codice_l1a_lo-sw-priority_20240429_v001.pkts",
18
- TEST_DATA_PATH / "imap_codice_l1a_lo-nsw-priority_20240429_v001.pkts",
19
- TEST_DATA_PATH / "imap_codice_l1a_lo-sw-species_20240429_v001.pkts",
20
- TEST_DATA_PATH / "imap_codice_l1a_lo-nsw-species_20240429_v001.pkts",
18
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hskp_20241110_v001.cdf",
19
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hi-counters-aggregated_20241110_v001.cdf",
20
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hi-counters-singles_20241110_v001.cdf",
21
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hi-omni_20241110_v001.cdf",
22
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hi-priority_20241110_v001.cdf",
23
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_hi-sectored_20241110_v001.cdf",
24
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-counters-aggregated_20241110_v001.cdf",
25
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-counters-singles_20241110_v001.cdf",
26
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-sw-angular_20241110_v001.cdf",
27
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-nsw-angular_20241110_v001.cdf",
28
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-sw-priority_20241110_v001.cdf",
29
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-nsw-priority_20241110_v001.cdf",
30
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-sw-species_20241110_v001.cdf",
31
+ TEST_L1A_DATA_PATH / "imap_codice_l1a_lo-nsw-species_20241110_v001.cdf",
21
32
  ]
22
33
 
23
34
  # ruff: noqa
24
35
  VALIDATION_DATA = [
25
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-ialirt_20241110193700_v0.0.0.cdf",
26
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf",
27
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hskp_20241110193622_v0.0.0.cdf",
28
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf",
29
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf",
30
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf",
31
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf",
32
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf",
33
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf",
34
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf",
35
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf",
36
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-counters-aggregated_20241110193700_v0.0.0.cdf",
37
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-counters-singles_20241110193700_v0.0.0.cdf",
38
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-omni_20241110193700_v0.0.0.cdf",
39
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-sectored_20241110193700_v0.0.0.cdf",
40
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-priority_20241110193700_v0.0.0.cdf",
41
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf",
42
- TEST_DATA_PATH / "validation" / "imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf",
36
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-ialirt_20241110193700_v0.0.0.cdf",
37
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf",
38
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hskp_20241110193622_v0.0.0.cdf",
39
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf",
40
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf",
41
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf",
42
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf",
43
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf",
44
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf",
45
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf",
46
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf",
47
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-counters-aggregated_20241110193700_v0.0.0.cdf",
48
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-counters-singles_20241110193700_v0.0.0.cdf",
49
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-omni_20241110193700_v0.0.0.cdf",
50
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-sectored_20241110193700_v0.0.0.cdf",
51
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-priorities_20241110193700_v0.0.0.cdf",
52
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf",
53
+ TEST_L0_DATA_PATH / "validation" / "imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf",
43
54
  ] # fmt: skip