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
@@ -2,15 +2,133 @@
2
2
 
3
3
  from pathlib import Path
4
4
 
5
+ import numpy as np
5
6
  import pytest
7
+ import xarray as xr
6
8
 
9
+ from imap_processing.cdf.utils import load_cdf
10
+ from imap_processing.mag.constants import VecSec
7
11
  from imap_processing.mag.l1a.mag_l1a import mag_l1a
12
+ from imap_processing.spice.time import TTJ2000_EPOCH
8
13
 
9
14
 
10
- @pytest.fixture()
15
+ @pytest.fixture
11
16
  def validation_l1a():
12
17
  current_directory = Path(__file__).parent
13
18
  test_file = current_directory / "validation" / "mag_l1_test_data.pkts"
14
19
  # Test file contains only normal packets
15
- l1a = mag_l1a(test_file, "v000")
20
+ l1a = mag_l1a(test_file)
16
21
  return l1a
22
+
23
+
24
+ def mag_l1a_dataset_generator(length):
25
+ epoch = xr.DataArray(np.arange(length), name="epoch", dims=["epoch"])
26
+ direction = xr.DataArray(np.arange(4), name="direction", dims=["direction"])
27
+ compression = xr.DataArray(np.arange(2), name="compression", dims=["compression"])
28
+
29
+ direction_label = xr.DataArray(
30
+ direction.values.astype(str),
31
+ name="direction_label",
32
+ dims=["direction_label"],
33
+ )
34
+
35
+ compression_label = xr.DataArray(
36
+ compression.values.astype(str),
37
+ name="compression_label",
38
+ dims=["compression_label"],
39
+ )
40
+
41
+ vectors = xr.DataArray(
42
+ np.zeros((length, 4)),
43
+ dims=["epoch", "direction"],
44
+ coords={"epoch": epoch, "direction": direction},
45
+ )
46
+ compression_flags = xr.DataArray(
47
+ np.zeros((length, 2), dtype=np.int8), dims=["epoch", "compression"]
48
+ )
49
+
50
+ output_dataset = xr.Dataset(
51
+ coords={"epoch": epoch, "direction": direction, "compression": compression},
52
+ )
53
+ output_dataset["vectors"] = vectors
54
+ output_dataset["compression_flags"] = compression_flags
55
+ output_dataset["direction_label"] = direction_label
56
+ output_dataset["compression_label"] = compression_label
57
+ output_dataset.attrs["Logical_source"] = ["imap_mag_l1a_norm-mago"]
58
+
59
+ return output_dataset
60
+
61
+
62
+ @pytest.fixture
63
+ def mag_test_l1b_calibration_data():
64
+ imap_dir = Path(__file__).parent
65
+ cal_file = (
66
+ imap_dir
67
+ / "validation"
68
+ / "calibration"
69
+ / "imap_mag_l1b-calibration_20240229_v001.cdf"
70
+ )
71
+ calibration_data = load_cdf(cal_file)
72
+ return calibration_data
73
+
74
+
75
+ @pytest.fixture
76
+ def mag_test_l2_data():
77
+ imap_dir = Path(__file__).parent
78
+ cal_file = (
79
+ imap_dir
80
+ / "validation"
81
+ / "calibration"
82
+ / "imap_mag_l2-calibration-matrices_20251017_v004.cdf"
83
+ )
84
+ calibration_data = load_cdf(cal_file)
85
+
86
+ offsets_data = load_cdf(
87
+ imap_dir
88
+ / "validation"
89
+ / "calibration"
90
+ / "imap_mag_l2-offsets-norm_20251017_20251017_v001.cdf"
91
+ )
92
+
93
+ return calibration_data, offsets_data
94
+
95
+
96
+ def mag_generate_l1b_from_csv(df, logical_source):
97
+ length = len(df.index)
98
+ dataset = mag_l1a_dataset_generator(length)
99
+
100
+ dataset["vectors"].data = np.array(df[["x", "y", "z", "range"]])
101
+ dataset["compression_flags"].data = np.array(
102
+ df[["compression", "compression_width"]]
103
+ )
104
+
105
+ epoch = [np.datetime64(t) - np.datetime64(TTJ2000_EPOCH) for t in df["t"]]
106
+ epoch_ns = [(e / np.timedelta64(1, "ns")).astype(np.int64) for e in epoch]
107
+ dataset.coords["epoch"] = xr.DataArray(epoch_ns, name="epoch", dims=["epoch"])
108
+
109
+ dataset.attrs["Logical_source"] = logical_source
110
+ dataset.attrs["vectors_per_second"] = f"{epoch_ns[0]}:2"
111
+
112
+ return dataset
113
+
114
+
115
+ def generate_test_epoch(
116
+ end, vectors_per_second: list[VecSec], starting_point=0, gaps=None
117
+ ):
118
+ spacing = 1 / vectors_per_second[0].value
119
+ output = np.array([])
120
+ prev = starting_point
121
+ if gaps:
122
+ for index, gap in enumerate(gaps):
123
+ if len(vectors_per_second) != 1:
124
+ spacing = 1 / vectors_per_second[index].value
125
+ output = np.concatenate(
126
+ (output, np.arange(prev, gap[0] + spacing, step=spacing) * 1e9)
127
+ )
128
+ prev = gap[1]
129
+ spacing = 1 / vectors_per_second[-1].value
130
+ output = np.concatenate(
131
+ (output, np.arange(prev, end + spacing, step=spacing) * 1e9)
132
+ )
133
+
134
+ return output
@@ -9,11 +9,12 @@ from imap_processing.mag.constants import DataMode
9
9
  from imap_processing.mag.l0.decom_mag import decom_packets, generate_dataset
10
10
 
11
11
 
12
- @pytest.fixture()
12
+ @pytest.fixture
13
13
  def cdf_attrs():
14
14
  test_attrs = ImapCdfAttributes()
15
15
  test_attrs.add_instrument_global_attrs("mag")
16
- test_attrs.add_instrument_variable_attrs("mag", "l1")
16
+ test_attrs.add_instrument_variable_attrs("mag", "l1a")
17
+ # Default v001 expected when writing to file and re-loading
17
18
  test_attrs.add_global_attribute("Data_version", "v001")
18
19
  return test_attrs
19
20
 
@@ -75,7 +76,7 @@ def test_mag_raw_xarray(cdf_attrs):
75
76
  [
76
77
  item is not None
77
78
  for key, item in norm_data.attrs.items()
78
- if key != "Logical_file_id"
79
+ if key not in ("Logical_file_id", "Data_version")
79
80
  ]
80
81
  )
81
82
 
@@ -83,7 +84,7 @@ def test_mag_raw_xarray(cdf_attrs):
83
84
  [
84
85
  item is not None
85
86
  for key, item in burst_data.attrs.items()
86
- if key != "Logical_file_id"
87
+ if key not in ("Logical_file_id", "Data_version")
87
88
  ]
88
89
  )
89
90
 
@@ -15,7 +15,7 @@ from imap_processing.mag.l1a.mag_l1a_data import (
15
15
  from imap_processing.spice.time import met_to_ttj2000ns
16
16
 
17
17
 
18
- @pytest.fixture()
18
+ @pytest.fixture
19
19
  def uncompressed_vector_bytearray():
20
20
  input_data = np.array(
21
21
  [
@@ -225,7 +225,7 @@ def uncompressed_vector_bytearray():
225
225
  return input_data
226
226
 
227
227
 
228
- @pytest.fixture()
228
+ @pytest.fixture
229
229
  def expected_vectors():
230
230
  primary_expected = np.array(
231
231
  [
@@ -272,7 +272,7 @@ def expected_vectors():
272
272
  return (primary_expected, secondary_expected)
273
273
 
274
274
 
275
- @pytest.fixture()
275
+ @pytest.fixture
276
276
  def raw_compressed_vectors():
277
277
  # compressed vectors, without the first starting uncompressed vector.
278
278
  # 15 primary vectors and 15 secondary vectors, corresponding to most of
@@ -883,7 +883,7 @@ def test_mag_l1a():
883
883
  current_directory = Path(__file__).parent
884
884
  test_file = current_directory / "validation" / "mag_l1_test_data.pkts"
885
885
 
886
- output_data = mag_l1a(test_file, "v001")
886
+ output_data = mag_l1a(test_file)
887
887
 
888
888
  # Test data is one day's worth of NORM data, so it should return one raw, one MAGO
889
889
  # and one MAGI dataset
@@ -897,9 +897,6 @@ def test_mag_l1a():
897
897
  for data_type in [data.attrs["Logical_source"] for data in output_data]:
898
898
  assert data_type in expected_logical_source
899
899
 
900
- for data in output_data:
901
- assert data.attrs["Data_version"] == "v001"
902
-
903
900
  assert "vectors" in output_data[-1].variables.keys()
904
901
  assert "compression_flags" in output_data[-1].variables.keys()
905
902
 
@@ -910,6 +907,15 @@ def test_mag_l1a():
910
907
  == output_data[-1]["compression_flags"].data.shape[0]
911
908
  )
912
909
 
910
+ assert (
911
+ str(output_data[-1]["epoch"].data[0])
912
+ in output_data[-1].attrs["vectors_per_second"]
913
+ )
914
+ assert (
915
+ str(output_data[-2]["epoch"].data[0])
916
+ in output_data[-2].attrs["vectors_per_second"]
917
+ )
918
+
913
919
 
914
920
  def test_mag_packet_properties():
915
921
  # equal to 01001011
@@ -919,3 +925,41 @@ def test_mag_packet_properties():
919
925
  )
920
926
 
921
927
  assert packet_properties.compression_width == 18
928
+
929
+
930
+ def test_changing_vecsec():
931
+ packet_one = MagL1aPacketProperties(
932
+ 1000,
933
+ TimeTuple(1000, 0),
934
+ 2, # 2 vectors per second
935
+ 1, # 2 seconds of data
936
+ 0,
937
+ 0,
938
+ 1,
939
+ 0,
940
+ )
941
+ packet_two = MagL1aPacketProperties(
942
+ 2000,
943
+ TimeTuple(2000, 0),
944
+ 8, # 8 vectors per second
945
+ 1, # 2 seconds of data
946
+ 1,
947
+ 0,
948
+ 1,
949
+ 0,
950
+ )
951
+
952
+ four_vectors = np.full((4, 5), [1, 2, 3, 4, 2])
953
+ sixteen_vectors = np.full((16, 5), [1, 2, 3, 4, 2])
954
+
955
+ mag_l1a = MagL1a(True, 1, 1, four_vectors, packet_one)
956
+ mag_l1a.append_vectors(sixteen_vectors, packet_two)
957
+
958
+ assert mag_l1a.vectors.shape[0] == 20
959
+ assert len(mag_l1a.packet_definitions.keys()) == 2
960
+ expected = [2, 8]
961
+ for index, value in enumerate(mag_l1a.packet_definitions.values()):
962
+ assert expected[index] == value.vectors_per_second
963
+
964
+ assert ":2," in mag_l1a.vectors_per_second_attribute()
965
+ assert ":8" in mag_l1a.vectors_per_second_attribute()
@@ -4,6 +4,7 @@ import numpy as np
4
4
  import pytest
5
5
  import xarray as xr
6
6
 
7
+ from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
7
8
  from imap_processing.cdf.utils import load_cdf, write_cdf
8
9
  from imap_processing.mag.l1b.mag_l1b import (
9
10
  calibrate_vector,
@@ -11,55 +12,30 @@ from imap_processing.mag.l1b.mag_l1b import (
11
12
  mag_l1b_processing,
12
13
  rescale_vector,
13
14
  )
15
+ from imap_processing.tests.mag.conftest import (
16
+ mag_l1a_dataset_generator,
17
+ )
14
18
 
15
19
 
16
- @pytest.fixture(scope="module")
17
- def mag_l1a_dataset():
18
- epoch = xr.DataArray(np.arange(20), name="epoch", dims=["epoch"])
19
- direction = xr.DataArray(np.arange(4), name="direction", dims=["direction"])
20
- compression = xr.DataArray(np.arange(2), name="compression", dims=["compression"])
21
-
22
- direction_label = xr.DataArray(
23
- direction.values.astype(str),
24
- name="direction_label",
25
- dims=["direction_label"],
26
- )
27
-
28
- compression_label = xr.DataArray(
29
- compression.values.astype(str),
30
- name="compression_label",
31
- dims=["compression_label"],
32
- )
33
-
34
- vectors = xr.DataArray(
35
- np.zeros((20, 4)),
36
- dims=["epoch", "direction"],
37
- coords={"epoch": epoch, "direction": direction},
38
- )
39
- compression_flags = xr.DataArray(
40
- np.zeros((20, 2), dtype=np.int8), dims=["epoch", "compression"]
41
- )
42
- compression_flags[1, :] = np.array([1, 18], dtype=np.int8)
43
-
44
- vectors[0, :] = np.array([1, 1, 1, 0])
45
- vectors[1, :] = np.array([7982, 48671, -68090, 0])
46
-
47
- output_dataset = xr.Dataset(
48
- coords={"epoch": epoch, "direction": direction, "compression": compression},
20
+ def test_mag_processing(mag_test_l1b_calibration_data):
21
+ # All specific test values come from MAG team to accommodate various cases.
22
+ # Each vector is multiplied by the matrix in the calibration data for the given
23
+ # range to get the calibrated vector.
24
+ mag_l1a_dataset = mag_l1a_dataset_generator(20)
25
+ mag_l1a_dataset["compression_flags"].data[1, :] = np.array([1, 18], dtype=np.int8)
26
+
27
+ mag_l1a_dataset["vectors"].data[0, :] = np.array([1, 1, 1, 0])
28
+ mag_l1a_dataset["vectors"].data[1, :] = np.array([7982, 48671, -68090, 0])
29
+ mag_attributes = ImapCdfAttributes()
30
+ mag_attributes.add_instrument_global_attrs("mag")
31
+ mag_attributes.add_instrument_variable_attrs("mag", "l1b")
32
+ mag_l1b = mag_l1b_processing(
33
+ mag_l1a_dataset,
34
+ mag_test_l1b_calibration_data,
35
+ mag_attributes,
36
+ "imap_mag_l1b_norm-mago",
49
37
  )
50
- output_dataset["vectors"] = vectors
51
- output_dataset["compression_flags"] = compression_flags
52
- output_dataset["direction_label"] = direction_label
53
- output_dataset["compression_label"] = compression_label
54
- output_dataset.attrs["Logical_source"] = ["imap_mag_l1a_norm-mago"]
55
38
 
56
- return output_dataset
57
-
58
-
59
- def test_mag_processing(mag_l1a_dataset):
60
- mag_l1a_dataset.attrs["Logical_source"] = ["imap_mag_l1a_norm-mago"]
61
-
62
- mag_l1b = mag_l1b_processing(mag_l1a_dataset)
63
39
  np.testing.assert_allclose(
64
40
  mag_l1b["vectors"][0].values, [2.2972, 2.2415, 2.2381, 0], atol=1e-4
65
41
  )
@@ -68,13 +44,16 @@ def test_mag_processing(mag_l1a_dataset):
68
44
  [4584.1029091, 27238.73161294, -38405.22240195, 0.0],
69
45
  )
70
46
 
71
- # np.testing.assert_allclose(mag_l1b["vectors"][1].values, [0, 0, 0, 0])
47
+ np.testing.assert_allclose(mag_l1b["vectors"][2].values, [0, 0, 0, 0])
72
48
 
73
49
  assert mag_l1b["vectors"].values.shape == mag_l1a_dataset["vectors"].values.shape
74
50
 
75
- mag_l1a_dataset.attrs["Logical_source"] = ["imap_mag_l1a_norm-magi"]
76
-
77
- mag_l1b = mag_l1b_processing(mag_l1a_dataset)
51
+ mag_l1b = mag_l1b_processing(
52
+ mag_l1a_dataset,
53
+ mag_test_l1b_calibration_data,
54
+ mag_attributes,
55
+ "imap_mag_l1b_norm-magi",
56
+ )
78
57
 
79
58
  np.testing.assert_allclose(
80
59
  mag_l1b["vectors"][0].values, [2.27538, 2.23416, 2.23682, 0], atol=1e-5
@@ -83,19 +62,19 @@ def test_mag_processing(mag_l1a_dataset):
83
62
  assert mag_l1b["vectors"].values.shape == mag_l1a_dataset["vectors"].values.shape
84
63
 
85
64
 
86
- def test_mag_attributes(mag_l1a_dataset):
65
+ def test_mag_attributes():
66
+ mag_l1a_dataset = mag_l1a_dataset_generator(20)
67
+
87
68
  mag_l1a_dataset.attrs["Logical_source"] = ["imap_mag_l1a_norm-mago"]
88
69
 
89
- output = mag_l1b(mag_l1a_dataset, "v001")
70
+ output = mag_l1b(mag_l1a_dataset)
90
71
  assert output.attrs["Logical_source"] == "imap_mag_l1b_norm-mago"
91
72
 
92
73
  mag_l1a_dataset.attrs["Logical_source"] = ["imap_mag_l1a_burst-magi"]
93
74
 
94
- output = mag_l1b(mag_l1a_dataset, "v001")
75
+ output = mag_l1b(mag_l1a_dataset)
95
76
  assert output.attrs["Logical_source"] == "imap_mag_l1b_burst-magi"
96
77
 
97
- assert output.attrs["Data_level"] == "L1B"
98
-
99
78
 
100
79
  def test_cdf_output():
101
80
  l1a_cdf = load_cdf(
@@ -103,14 +82,16 @@ def test_cdf_output():
103
82
  / "validation"
104
83
  / "imap_mag_l1a_norm-magi_20251017_v001.cdf"
105
84
  )
106
- l1b_dataset = mag_l1b(l1a_cdf, "v001")
85
+ l1b_dataset = mag_l1b(l1a_cdf)
107
86
 
108
87
  output_path = write_cdf(l1b_dataset)
109
88
 
110
89
  assert Path.exists(output_path)
111
90
 
112
91
 
113
- def test_mag_compression_scale(mag_l1a_dataset):
92
+ def test_mag_compression_scale():
93
+ mag_l1a_dataset = mag_l1a_dataset_generator(20)
94
+
114
95
  test_calibration = np.array(
115
96
  [
116
97
  [2.2972202, 0.0, 0.0],
@@ -129,7 +110,7 @@ def test_mag_compression_scale(mag_l1a_dataset):
129
110
  mag_l1a_dataset["compression_flags"][3, :] = np.array([1, 14], dtype=np.int8)
130
111
 
131
112
  mag_l1a_dataset.attrs["Logical_source"] = ["imap_mag_l1a_norm-mago"]
132
- output = mag_l1b(mag_l1a_dataset, "v001")
113
+ output = mag_l1b(mag_l1a_dataset)
133
114
 
134
115
  calibrated_vectors = np.matmul(test_calibration, np.array([1, 1, 1]))
135
116
  # 16 bit width is the standard
@@ -206,9 +187,9 @@ def test_calibrate_vector():
206
187
  def test_l1a_to_l1b(validation_l1a):
207
188
  # Convert l1a input validation packet file to l1b
208
189
  with pytest.raises(ValueError, match="Raw L1A"):
209
- mag_l1b(validation_l1a[0], "v000")
190
+ mag_l1b(validation_l1a[0])
210
191
 
211
- l1b = [mag_l1b(i, "v000") for i in validation_l1a[1:]]
192
+ l1b = [mag_l1b(i) for i in validation_l1a[1:]]
212
193
 
213
194
  assert len(l1b) == len(validation_l1a) - 1
214
195