imap-processing 0.6.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.
Files changed (398) hide show
  1. imap_processing/__init__.py +34 -0
  2. imap_processing/_version.py +3 -0
  3. imap_processing/ccsds/__init__.py +0 -0
  4. imap_processing/ccsds/ccsds_data.py +55 -0
  5. imap_processing/ccsds/excel_to_xtce.py +477 -0
  6. imap_processing/cdf/__init__.py +0 -0
  7. imap_processing/cdf/cdf_attribute_manager.py +322 -0
  8. imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +212 -0
  9. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +1358 -0
  10. imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +391 -0
  11. imap_processing/cdf/config/imap_constant_attrs.yaml +33 -0
  12. imap_processing/cdf/config/imap_default_global_cdf_attrs.yaml +17 -0
  13. imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +41 -0
  14. imap_processing/cdf/config/imap_glows_l1a_variable_attrs.yaml +499 -0
  15. imap_processing/cdf/config/imap_glows_l1b_variable_attrs.yaml +334 -0
  16. imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +51 -0
  17. imap_processing/cdf/config/imap_hi_variable_attrs.yaml +435 -0
  18. imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +27 -0
  19. imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +493 -0
  20. imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +564 -0
  21. imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +24 -0
  22. imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +426 -0
  23. imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +90 -0
  24. imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +487 -0
  25. imap_processing/cdf/config/imap_lo_l1b_variable_attrs.yaml +121 -0
  26. imap_processing/cdf/config/imap_lo_l1c_variable_attrs.yaml +179 -0
  27. imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +97 -0
  28. imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +201 -0
  29. imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +33 -0
  30. imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +137 -0
  31. imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +24 -0
  32. imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +234 -0
  33. imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +273 -0
  34. imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +100 -0
  35. imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +52 -0
  36. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +297 -0
  37. imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +121 -0
  38. imap_processing/cdf/config/shared/default_global_cdf_attrs_schema.yaml +246 -0
  39. imap_processing/cdf/config/shared/default_variable_cdf_attrs_schema.yaml +466 -0
  40. imap_processing/cdf/imap_cdf_manager.py +64 -0
  41. imap_processing/cdf/utils.py +147 -0
  42. imap_processing/cli.py +863 -0
  43. imap_processing/codice/__init__.py +1 -0
  44. imap_processing/codice/codice_l0.py +54 -0
  45. imap_processing/codice/codice_l1a.py +558 -0
  46. imap_processing/codice/codice_l1b.py +194 -0
  47. imap_processing/codice/constants.py +986 -0
  48. imap_processing/codice/data/esa_sweep_values.csv +257 -0
  49. imap_processing/codice/data/lo_stepping_values.csv +129 -0
  50. imap_processing/codice/decompress.py +142 -0
  51. imap_processing/codice/packet_definitions/P_COD_NHK.xml +618 -0
  52. imap_processing/codice/packet_definitions/codice_packet_definition.xml +5073 -0
  53. imap_processing/codice/utils.py +95 -0
  54. imap_processing/decom.py +40 -0
  55. imap_processing/glows/__init__.py +1 -0
  56. imap_processing/glows/ancillary/l1b_conversion_table_v001.json +42 -0
  57. imap_processing/glows/l0/__init__.py +0 -0
  58. imap_processing/glows/l0/decom_glows.py +91 -0
  59. imap_processing/glows/l0/glows_l0_data.py +194 -0
  60. imap_processing/glows/l1a/glows_l1a.py +424 -0
  61. imap_processing/glows/l1a/glows_l1a_data.py +555 -0
  62. imap_processing/glows/l1b/glows_l1b.py +270 -0
  63. imap_processing/glows/l1b/glows_l1b_data.py +583 -0
  64. imap_processing/glows/packet_definitions/GLX_COMBINED.xml +254 -0
  65. imap_processing/glows/packet_definitions/P_GLX_TMSCDE.xml +97 -0
  66. imap_processing/glows/packet_definitions/P_GLX_TMSCHIST.xml +215 -0
  67. imap_processing/glows/utils/__init__.py +0 -0
  68. imap_processing/glows/utils/constants.py +105 -0
  69. imap_processing/hi/__init__.py +1 -0
  70. imap_processing/hi/l0/__init__.py +0 -0
  71. imap_processing/hi/l0/decom_hi.py +24 -0
  72. imap_processing/hi/l1a/__init__.py +0 -0
  73. imap_processing/hi/l1a/hi_l1a.py +73 -0
  74. imap_processing/hi/l1a/histogram.py +142 -0
  75. imap_processing/hi/l1a/housekeeping.py +27 -0
  76. imap_processing/hi/l1a/science_direct_event.py +341 -0
  77. imap_processing/hi/l1b/__init__.py +0 -0
  78. imap_processing/hi/l1b/hi_eng_unit_convert_table.csv +154 -0
  79. imap_processing/hi/l1b/hi_l1b.py +127 -0
  80. imap_processing/hi/l1c/__init__.py +0 -0
  81. imap_processing/hi/l1c/hi_l1c.py +228 -0
  82. imap_processing/hi/packet_definitions/__init__.py +0 -0
  83. imap_processing/hi/packet_definitions/hi_packet_definition.xml +482 -0
  84. imap_processing/hi/utils.py +27 -0
  85. imap_processing/hit/__init__.py +1 -0
  86. imap_processing/hit/l0/__init__.py +0 -0
  87. imap_processing/hit/l0/data_classes/housekeeping.py +240 -0
  88. imap_processing/hit/l0/data_classes/science_packet.py +259 -0
  89. imap_processing/hit/l0/decom_hit.py +467 -0
  90. imap_processing/hit/l0/utils/hit_base.py +57 -0
  91. imap_processing/hit/l1a/__init__.py +0 -0
  92. imap_processing/hit/l1a/hit_l1a.py +254 -0
  93. imap_processing/hit/l1b/hit_l1b.py +179 -0
  94. imap_processing/hit/packet_definitions/hit_packet_definitions.xml +1276 -0
  95. imap_processing/ialirt/__init__.py +0 -0
  96. imap_processing/ialirt/l0/__init__.py +0 -0
  97. imap_processing/ialirt/l0/process_hit.py +220 -0
  98. imap_processing/ialirt/packet_definitions/__init__.py +0 -0
  99. imap_processing/ialirt/packet_definitions/ialirt.xml +778 -0
  100. imap_processing/ialirt/packet_definitions/ialirt_hit.xml +186 -0
  101. imap_processing/idex/__init__.py +2 -0
  102. imap_processing/idex/idex_constants.py +27 -0
  103. imap_processing/idex/idex_l0.py +31 -0
  104. imap_processing/idex/idex_l1a.py +631 -0
  105. imap_processing/idex/packet_definitions/idex_packet_definition.xml +3162 -0
  106. imap_processing/lo/__init__.py +1 -0
  107. imap_processing/lo/l0/__init__.py +0 -0
  108. imap_processing/lo/l0/data_classes/science_direct_events.py +215 -0
  109. imap_processing/lo/l0/data_classes/star_sensor.py +98 -0
  110. imap_processing/lo/l0/decompression_tables/12_to_16_bit.csv +4097 -0
  111. imap_processing/lo/l0/decompression_tables/8_to_12_bit.csv +257 -0
  112. imap_processing/lo/l0/decompression_tables/8_to_16_bit.csv +257 -0
  113. imap_processing/lo/l0/decompression_tables/decompression_tables.py +75 -0
  114. imap_processing/lo/l0/lo_apid.py +15 -0
  115. imap_processing/lo/l0/lo_science.py +150 -0
  116. imap_processing/lo/l0/utils/binary_string.py +59 -0
  117. imap_processing/lo/l0/utils/bit_decompression.py +62 -0
  118. imap_processing/lo/l0/utils/lo_base.py +57 -0
  119. imap_processing/lo/l1a/__init__.py +0 -0
  120. imap_processing/lo/l1a/lo_l1a.py +157 -0
  121. imap_processing/lo/l1b/lo_l1b.py +160 -0
  122. imap_processing/lo/l1c/lo_l1c.py +180 -0
  123. imap_processing/lo/packet_definitions/lo_xtce.xml +3541 -0
  124. imap_processing/mag/__init__.py +2 -0
  125. imap_processing/mag/constants.py +108 -0
  126. imap_processing/mag/l0/decom_mag.py +170 -0
  127. imap_processing/mag/l0/mag_l0_data.py +118 -0
  128. imap_processing/mag/l1a/mag_l1a.py +317 -0
  129. imap_processing/mag/l1a/mag_l1a_data.py +1007 -0
  130. imap_processing/mag/l1b/__init__.py +0 -0
  131. imap_processing/mag/l1b/imap_calibration_mag_20240229_v01.cdf +0 -0
  132. imap_processing/mag/l1b/mag_l1b.py +125 -0
  133. imap_processing/mag/l1c/mag_l1c.py +57 -0
  134. imap_processing/mag/packet_definitions/MAG_SCI_COMBINED.xml +235 -0
  135. imap_processing/quality_flags.py +91 -0
  136. imap_processing/spice/__init__.py +1 -0
  137. imap_processing/spice/geometry.py +322 -0
  138. imap_processing/spice/kernels.py +459 -0
  139. imap_processing/spice/time.py +72 -0
  140. imap_processing/swapi/__init__.py +1 -0
  141. imap_processing/swapi/l1/__init__.py +0 -0
  142. imap_processing/swapi/l1/swapi_l1.py +685 -0
  143. imap_processing/swapi/l2/__init__.py +0 -0
  144. imap_processing/swapi/l2/swapi_l2.py +107 -0
  145. imap_processing/swapi/packet_definitions/__init__.py +0 -0
  146. imap_processing/swapi/packet_definitions/swapi_packet_definition.xml +708 -0
  147. imap_processing/swapi/swapi_utils.py +25 -0
  148. imap_processing/swe/__init__.py +1 -0
  149. imap_processing/swe/l1a/__init__.py +0 -0
  150. imap_processing/swe/l1a/swe_l1a.py +48 -0
  151. imap_processing/swe/l1a/swe_science.py +223 -0
  152. imap_processing/swe/l1b/engineering_unit_convert_table.csv +65 -0
  153. imap_processing/swe/l1b/swe_esa_lookup_table.csv +1441 -0
  154. imap_processing/swe/l1b/swe_l1b.py +49 -0
  155. imap_processing/swe/l1b/swe_l1b_science.py +557 -0
  156. imap_processing/swe/packet_definitions/__init__.py +0 -0
  157. imap_processing/swe/packet_definitions/swe_packet_definition.xml +303 -0
  158. imap_processing/swe/utils/__init__.py +0 -0
  159. imap_processing/swe/utils/swe_utils.py +9 -0
  160. imap_processing/tests/__init__.py +0 -0
  161. imap_processing/tests/ccsds/test_data/expected_output.xml +171 -0
  162. imap_processing/tests/ccsds/test_excel_to_xtce.py +285 -0
  163. imap_processing/tests/cdf/__init__.py +0 -0
  164. imap_processing/tests/cdf/imap_default_global_cdf_attrs.yaml +8 -0
  165. imap_processing/tests/cdf/shared/default_global_cdf_attrs_schema.yaml +246 -0
  166. imap_processing/tests/cdf/shared/default_variable_cdf_attrs_schema.yaml +466 -0
  167. imap_processing/tests/cdf/test_cdf_attribute_manager.py +353 -0
  168. imap_processing/tests/cdf/test_data/imap_default_global_test_cdf_attrs.yaml +7 -0
  169. imap_processing/tests/cdf/test_data/imap_instrument1_global_cdf_attrs.yaml +14 -0
  170. imap_processing/tests/cdf/test_data/imap_instrument1_level1_variable_attrs.yaml +23 -0
  171. imap_processing/tests/cdf/test_data/imap_instrument2_global_cdf_attrs.yaml +23 -0
  172. imap_processing/tests/cdf/test_data/imap_instrument2_level2_variable_attrs.yaml +30 -0
  173. imap_processing/tests/cdf/test_data/imap_test_global.yaml +26 -0
  174. imap_processing/tests/cdf/test_data/imap_test_variable.yaml +41 -0
  175. imap_processing/tests/cdf/test_imap_cdf_manager.py +62 -0
  176. imap_processing/tests/cdf/test_utils.py +109 -0
  177. imap_processing/tests/codice/__init__.py +0 -0
  178. imap_processing/tests/codice/conftest.py +56 -0
  179. imap_processing/tests/codice/data/eu_unit_lookup_table.csv +101 -0
  180. imap_processing/tests/codice/data/idle_export_eu.COD_NHK_20230822_122700 2.csv +100 -0
  181. imap_processing/tests/codice/data/idle_export_raw.COD_NHK_20230822_122700.csv +100 -0
  182. imap_processing/tests/codice/data/imap_codice_l0_hi-counters-aggregated_20240429_v001.pkts +0 -0
  183. imap_processing/tests/codice/data/imap_codice_l0_hi-counters-singles_20240429_v001.pkts +0 -0
  184. imap_processing/tests/codice/data/imap_codice_l0_hi-omni_20240429_v001.pkts +0 -0
  185. imap_processing/tests/codice/data/imap_codice_l0_hi-pha_20240429_v001.pkts +0 -0
  186. imap_processing/tests/codice/data/imap_codice_l0_hi-sectored_20240429_v001.pkts +0 -0
  187. imap_processing/tests/codice/data/imap_codice_l0_hskp_20100101_v001.pkts +0 -0
  188. imap_processing/tests/codice/data/imap_codice_l0_lo-counters-aggregated_20240429_v001.pkts +0 -0
  189. imap_processing/tests/codice/data/imap_codice_l0_lo-counters-singles_20240429_v001.pkts +0 -0
  190. imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-angular_20240429_v001.pkts +0 -0
  191. imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-priority_20240429_v001.pkts +0 -0
  192. imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-species_20240429_v001.pkts +0 -0
  193. imap_processing/tests/codice/data/imap_codice_l0_lo-pha_20240429_v001.pkts +0 -0
  194. imap_processing/tests/codice/data/imap_codice_l0_lo-sw-angular_20240429_v001.pkts +0 -0
  195. imap_processing/tests/codice/data/imap_codice_l0_lo-sw-priority_20240429_v001.pkts +0 -0
  196. imap_processing/tests/codice/data/imap_codice_l0_lo-sw-species_20240429_v001.pkts +0 -0
  197. imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-aggregated_20240429_v001.cdf +0 -0
  198. imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-singles_20240429_v001.cdf +0 -0
  199. imap_processing/tests/codice/data/imap_codice_l1a_hi-omni_20240429_v001.cdf +0 -0
  200. imap_processing/tests/codice/data/imap_codice_l1a_hi-sectored_20240429_v001.cdf +0 -0
  201. imap_processing/tests/codice/data/imap_codice_l1a_hskp_20100101_v001.cdf +0 -0
  202. imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-aggregated_20240429_v001.cdf +0 -0
  203. imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-singles_20240429_v001.cdf +0 -0
  204. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-angular_20240429_v001.cdf +0 -0
  205. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-priority_20240429_v001.cdf +0 -0
  206. imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-species_20240429_v001.cdf +0 -0
  207. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-angular_20240429_v001.cdf +0 -0
  208. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-priority_20240429_v001.cdf +0 -0
  209. imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-species_20240429_v001.cdf +0 -0
  210. imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-aggregated_20240429_v001.cdf +0 -0
  211. imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-singles_20240429_v001.cdf +0 -0
  212. imap_processing/tests/codice/data/imap_codice_l1b_hi-omni_20240429_v001.cdf +0 -0
  213. imap_processing/tests/codice/data/imap_codice_l1b_hi-sectored_20240429_v001.cdf +0 -0
  214. imap_processing/tests/codice/data/imap_codice_l1b_hskp_20100101_v001.cdf +0 -0
  215. imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-aggregated_20240429_v001.cdf +0 -0
  216. imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-singles_20240429_v001.cdf +0 -0
  217. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-angular_20240429_v001.cdf +0 -0
  218. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-priority_20240429_v001.cdf +0 -0
  219. imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-species_20240429_v001.cdf +0 -0
  220. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-angular_20240429_v001.cdf +0 -0
  221. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-priority_20240429_v001.cdf +0 -0
  222. imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-species_20240429_v001.cdf +0 -0
  223. imap_processing/tests/codice/test_codice_l0.py +144 -0
  224. imap_processing/tests/codice/test_codice_l1a.py +187 -0
  225. imap_processing/tests/codice/test_codice_l1b.py +60 -0
  226. imap_processing/tests/codice/test_decompress.py +50 -0
  227. imap_processing/tests/conftest.py +372 -0
  228. imap_processing/tests/glows/direct_events_validation_data_l1a.csv +5704 -0
  229. imap_processing/tests/glows/glows_test_packet_20110921_v01.pkts +0 -0
  230. imap_processing/tests/glows/test_glows_decom.py +133 -0
  231. imap_processing/tests/glows/test_glows_l1a_cdf.py +85 -0
  232. imap_processing/tests/glows/test_glows_l1a_data.py +510 -0
  233. imap_processing/tests/glows/test_glows_l1b.py +348 -0
  234. imap_processing/tests/glows/test_glows_l1b_data.py +70 -0
  235. imap_processing/tests/hi/__init__.py +0 -0
  236. imap_processing/tests/hi/conftest.py +133 -0
  237. imap_processing/tests/hi/test_data/l0/20231030_H45_APP_NHK.bin +0 -0
  238. imap_processing/tests/hi/test_data/l0/20231030_H45_APP_NHK.csv +201 -0
  239. imap_processing/tests/hi/test_data/l0/20231030_H45_SCI_CNT.bin +0 -0
  240. imap_processing/tests/hi/test_data/l0/20231030_H45_SCI_DE.bin +0 -0
  241. imap_processing/tests/hi/test_data/l0/README.txt +54 -0
  242. imap_processing/tests/hi/test_decom.py +55 -0
  243. imap_processing/tests/hi/test_hi_l1b.py +31 -0
  244. imap_processing/tests/hi/test_hi_l1c.py +69 -0
  245. imap_processing/tests/hi/test_l1a.py +96 -0
  246. imap_processing/tests/hi/test_l1a_sci_de.py +72 -0
  247. imap_processing/tests/hi/test_utils.py +15 -0
  248. imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1251.pkts +0 -0
  249. imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1252.pkts +0 -0
  250. imap_processing/tests/hit/__init__.py +0 -0
  251. imap_processing/tests/hit/test_data/imap_hit_l0_hk_20100105_v001.pkts +0 -0
  252. imap_processing/tests/hit/test_data/sci_sample.ccsds +0 -0
  253. imap_processing/tests/hit/test_hit_decom.py +230 -0
  254. imap_processing/tests/hit/test_hit_l1a.py +224 -0
  255. imap_processing/tests/hit/test_hit_l1b.py +52 -0
  256. imap_processing/tests/hit/validation_data/hskp_sample_raw.csv +88 -0
  257. imap_processing/tests/ialirt/__init__.py +0 -0
  258. imap_processing/tests/ialirt/test_data/l0/IALiRT Raw Packet Telemetry.txt +33 -0
  259. imap_processing/tests/ialirt/test_data/l0/hit_ialirt_sample.ccsds +0 -0
  260. imap_processing/tests/ialirt/test_data/l0/hit_ialirt_sample.csv +1001 -0
  261. imap_processing/tests/ialirt/unit/__init__.py +0 -0
  262. imap_processing/tests/ialirt/unit/test_decom_ialirt.py +94 -0
  263. imap_processing/tests/ialirt/unit/test_process_hit.py +226 -0
  264. imap_processing/tests/idex/__init__.py +0 -0
  265. imap_processing/tests/idex/conftest.py +22 -0
  266. imap_processing/tests/idex/imap_idex_l0_raw_20230725_v001.pkts +0 -0
  267. imap_processing/tests/idex/impact_14_tof_high_data.txt +8189 -0
  268. imap_processing/tests/idex/test_idex_l0.py +45 -0
  269. imap_processing/tests/idex/test_idex_l1a.py +91 -0
  270. imap_processing/tests/lo/__init__.py +0 -0
  271. imap_processing/tests/lo/test_binary_string.py +21 -0
  272. imap_processing/tests/lo/test_bit_decompression.py +39 -0
  273. imap_processing/tests/lo/test_cdfs/imap_lo_l0_raw_20240627_v001.pkts +0 -0
  274. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20100101_v001.cdf +0 -0
  275. imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20100101_v001.cdf +0 -0
  276. imap_processing/tests/lo/test_cdfs/imap_lo_l1b_de_20100101_v001.cdf +0 -0
  277. imap_processing/tests/lo/test_lo_l1a.py +66 -0
  278. imap_processing/tests/lo/test_lo_l1b.py +74 -0
  279. imap_processing/tests/lo/test_lo_l1c.py +66 -0
  280. imap_processing/tests/lo/test_science_counts.py +41 -0
  281. imap_processing/tests/lo/test_science_direct_events.py +209 -0
  282. imap_processing/tests/lo/test_star_sensor.py +35 -0
  283. imap_processing/tests/mag/imap_mag_l1a_burst-magi_20231025_v001.cdf +0 -0
  284. imap_processing/tests/mag/mag_l0_test_data.pkts +0 -0
  285. imap_processing/tests/mag/mag_l0_test_output.csv +37 -0
  286. imap_processing/tests/mag/mag_l1_test_data.pkts +0 -0
  287. imap_processing/tests/mag/mag_l1a_test_output.csv +97 -0
  288. imap_processing/tests/mag/test_mag_decom.py +117 -0
  289. imap_processing/tests/mag/test_mag_l1a.py +856 -0
  290. imap_processing/tests/mag/test_mag_l1b.py +77 -0
  291. imap_processing/tests/mag/test_mag_l1c.py +40 -0
  292. imap_processing/tests/spice/__init__.py +0 -0
  293. imap_processing/tests/spice/test_data/imap_ena_sim_metakernel.template +4 -0
  294. imap_processing/tests/spice/test_data/imap_science_0001.tf +171 -0
  295. imap_processing/tests/spice/test_data/imap_sclk_0000.tsc +156 -0
  296. imap_processing/tests/spice/test_data/imap_sim_ck_2hr_2secsampling_with_nutation.bc +0 -0
  297. imap_processing/tests/spice/test_data/imap_simple_metakernel.template +3 -0
  298. imap_processing/tests/spice/test_data/imap_spk_demo.bsp +0 -0
  299. imap_processing/tests/spice/test_data/imap_wkcp.tf +1806 -0
  300. imap_processing/tests/spice/test_data/naif0012.tls +150 -0
  301. imap_processing/tests/spice/test_data/sim_1yr_imap_attitude.bc +0 -0
  302. imap_processing/tests/spice/test_data/sim_1yr_imap_pointing_frame.bc +0 -0
  303. imap_processing/tests/spice/test_geometry.py +214 -0
  304. imap_processing/tests/spice/test_kernels.py +272 -0
  305. imap_processing/tests/spice/test_time.py +35 -0
  306. imap_processing/tests/swapi/__init__.py +0 -0
  307. imap_processing/tests/swapi/conftest.py +16 -0
  308. imap_processing/tests/swapi/l0_data/__init__.py +0 -0
  309. imap_processing/tests/swapi/l0_data/imap_swapi_l0_raw_20231012_v001.pkts +0 -0
  310. imap_processing/tests/swapi/l0_validation_data/__init__.py +0 -0
  311. imap_processing/tests/swapi/l0_validation_data/idle_export_eu.SWP_AUT_20231012_125245.csv +124 -0
  312. imap_processing/tests/swapi/l0_validation_data/idle_export_eu.SWP_HK_20231012_125245.csv +98 -0
  313. imap_processing/tests/swapi/l0_validation_data/idle_export_eu.SWP_MG_20231012_125245.csv +9 -0
  314. imap_processing/tests/swapi/l0_validation_data/idle_export_eu.SWP_SCI_20231012_125245.csv +72 -0
  315. imap_processing/tests/swapi/l0_validation_data/idle_export_raw.SWP_AUT_20231012_125245.csv +124 -0
  316. imap_processing/tests/swapi/l0_validation_data/idle_export_raw.SWP_HK_20231012_125245.csv +98 -0
  317. imap_processing/tests/swapi/l0_validation_data/idle_export_raw.SWP_MG_20231012_125245.csv +9 -0
  318. imap_processing/tests/swapi/l0_validation_data/idle_export_raw.SWP_SCI_20231012_125245.csv +72 -0
  319. imap_processing/tests/swapi/test_swapi_decom.py +135 -0
  320. imap_processing/tests/swapi/test_swapi_l1.py +354 -0
  321. imap_processing/tests/swapi/test_swapi_l2.py +21 -0
  322. imap_processing/tests/swe/__init__.py +0 -0
  323. imap_processing/tests/swe/conftest.py +35 -0
  324. imap_processing/tests/swe/decompressed/20230927173238_4th_quarter_decompressed.csv +181 -0
  325. imap_processing/tests/swe/decompressed/20230927173253_1st_quarter_decompressed.csv +181 -0
  326. imap_processing/tests/swe/decompressed/20230927173308_2nd_quarter_decompressed.csv +181 -0
  327. imap_processing/tests/swe/decompressed/20230927173323_3rd_quarter_decompressed.csv +181 -0
  328. imap_processing/tests/swe/l0_data/2024051010_SWE_SCIENCE_packet.bin +0 -0
  329. imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_SCIENCE_20240510_092742.csv +544 -0
  330. imap_processing/tests/swe/l0_validation_data/idle_export_raw.SWE_SCIENCE_20240510_092742.csv +363 -0
  331. imap_processing/tests/swe/test_swe_l1a.py +12 -0
  332. imap_processing/tests/swe/test_swe_l1a_science.py +129 -0
  333. imap_processing/tests/swe/test_swe_l1b.py +61 -0
  334. imap_processing/tests/swe/test_swe_l1b_science.py +65 -0
  335. imap_processing/tests/test_cli.py +229 -0
  336. imap_processing/tests/test_decom.py +66 -0
  337. imap_processing/tests/test_quality_flags.py +71 -0
  338. imap_processing/tests/test_utils.py +107 -0
  339. imap_processing/tests/ultra/__init__.py +0 -0
  340. imap_processing/tests/ultra/test_data/l0/FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50_theta-0.00_20240207T102740.CCSDS +0 -0
  341. imap_processing/tests/ultra/test_data/l0/FM45_7P_Phi0.0_BeamCal_LinearScan_phi0.04_theta-0.01_20230821T121304.CCSDS +0 -0
  342. imap_processing/tests/ultra/test_data/l0/FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.CCSDS +0 -0
  343. imap_processing/tests/ultra/test_data/l0/Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.CCSDS +0 -0
  344. imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_auxdata_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +24 -0
  345. imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_enaphxtofhangimg_FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.csv +105 -0
  346. imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_ultraimgrates_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +24 -0
  347. imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_ultrarawimg_withFSWcalcs_FM45_40P_Phi28p5_BeamCal_LinearScan_phi2850_theta-000_20240207T102740.csv +3314 -0
  348. imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_ultrarawimgevent_FM45_7P_Phi00_BeamCal_LinearScan_phi004_theta-001_20230821T121304.csv +702 -0
  349. imap_processing/tests/ultra/unit/__init__.py +0 -0
  350. imap_processing/tests/ultra/unit/conftest.py +210 -0
  351. imap_processing/tests/ultra/unit/test_decom_apid_880.py +98 -0
  352. imap_processing/tests/ultra/unit/test_decom_apid_881.py +50 -0
  353. imap_processing/tests/ultra/unit/test_decom_apid_883.py +44 -0
  354. imap_processing/tests/ultra/unit/test_decom_apid_896.py +104 -0
  355. imap_processing/tests/ultra/unit/test_lookup_utils.py +68 -0
  356. imap_processing/tests/ultra/unit/test_ultra_l1a.py +338 -0
  357. imap_processing/tests/ultra/unit/test_ultra_l1b.py +122 -0
  358. imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +57 -0
  359. imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +342 -0
  360. imap_processing/tests/ultra/unit/test_ultra_l1c.py +104 -0
  361. imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +35 -0
  362. imap_processing/ultra/__init__.py +1 -0
  363. imap_processing/ultra/constants.py +60 -0
  364. imap_processing/ultra/l0/__init__.py +0 -0
  365. imap_processing/ultra/l0/decom_tools.py +281 -0
  366. imap_processing/ultra/l0/decom_ultra.py +278 -0
  367. imap_processing/ultra/l0/ultra_utils.py +326 -0
  368. imap_processing/ultra/l1a/__init__.py +0 -0
  369. imap_processing/ultra/l1a/ultra_l1a.py +319 -0
  370. imap_processing/ultra/l1b/badtimes.py +26 -0
  371. imap_processing/ultra/l1b/cullingmask.py +26 -0
  372. imap_processing/ultra/l1b/de.py +59 -0
  373. imap_processing/ultra/l1b/extendedspin.py +45 -0
  374. imap_processing/ultra/l1b/lookup_utils.py +165 -0
  375. imap_processing/ultra/l1b/ultra_l1b.py +65 -0
  376. imap_processing/ultra/l1b/ultra_l1b_annotated.py +54 -0
  377. imap_processing/ultra/l1b/ultra_l1b_extended.py +764 -0
  378. imap_processing/ultra/l1c/histogram.py +36 -0
  379. imap_processing/ultra/l1c/pset.py +36 -0
  380. imap_processing/ultra/l1c/ultra_l1c.py +52 -0
  381. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +54 -0
  382. imap_processing/ultra/lookup_tables/EgyNorm.mem.csv +32769 -0
  383. imap_processing/ultra/lookup_tables/FM45_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -0
  384. imap_processing/ultra/lookup_tables/ultra45_back-pos-luts.csv +4097 -0
  385. imap_processing/ultra/lookup_tables/ultra45_tdc_norm.csv +2050 -0
  386. imap_processing/ultra/lookup_tables/ultra90_back-pos-luts.csv +4097 -0
  387. imap_processing/ultra/lookup_tables/ultra90_tdc_norm.csv +2050 -0
  388. imap_processing/ultra/lookup_tables/yadjust.csv +257 -0
  389. imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +547 -0
  390. imap_processing/ultra/packet_definitions/__init__.py +0 -0
  391. imap_processing/ultra/utils/__init__.py +0 -0
  392. imap_processing/ultra/utils/ultra_l1_utils.py +50 -0
  393. imap_processing/utils.py +413 -0
  394. imap_processing-0.6.0.dist-info/LICENSE +21 -0
  395. imap_processing-0.6.0.dist-info/METADATA +107 -0
  396. imap_processing-0.6.0.dist-info/RECORD +398 -0
  397. imap_processing-0.6.0.dist-info/WHEEL +4 -0
  398. imap_processing-0.6.0.dist-info/entry_points.txt +4 -0
@@ -0,0 +1,338 @@
1
+ import pytest
2
+
3
+ from imap_processing import decom
4
+ from imap_processing.cdf.utils import load_cdf, write_cdf
5
+ from imap_processing.ultra.l0.decom_ultra import process_ultra_apids
6
+ from imap_processing.ultra.l0.ultra_utils import (
7
+ ULTRA_AUX,
8
+ ULTRA_EVENTS,
9
+ ULTRA_RATES,
10
+ ULTRA_TOF,
11
+ )
12
+ from imap_processing.ultra.l1a.ultra_l1a import create_dataset, ultra_l1a
13
+ from imap_processing.utils import group_by_apid
14
+
15
+
16
+ @pytest.fixture()
17
+ def decom_ultra_aux(ccsds_path_theta_0, xtce_path):
18
+ """Data for decom_ultra_aux"""
19
+ packets = decom.decom_packets(ccsds_path_theta_0, xtce_path)
20
+ grouped_data = group_by_apid(packets)
21
+
22
+ data_packet_list = process_ultra_apids(
23
+ grouped_data[ULTRA_AUX.apid[0]], ULTRA_AUX.apid[0]
24
+ )
25
+ return data_packet_list
26
+
27
+
28
+ @pytest.mark.parametrize(
29
+ "decom_test_data",
30
+ [
31
+ pytest.param(
32
+ {
33
+ "apid": ULTRA_AUX.apid[0],
34
+ "filename": "FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50"
35
+ "_theta-0.00_20240207T102740.CCSDS",
36
+ }
37
+ )
38
+ ],
39
+ indirect=True,
40
+ )
41
+ @pytest.mark.xfail(reason="Fix CDF attrs")
42
+ def test_xarray_aux(decom_test_data):
43
+ """This function checks that a xarray was
44
+ successfully created from the decom_ultra_aux data."""
45
+ pass
46
+ # decom_ultra_aux, _ = decom_test_data
47
+ # dataset = create_dataset({ULTRA_AUX.apid[0]: decom_ultra_aux})
48
+
49
+ # # Spot check string data and attributes
50
+ # spin_period_valid_list = dataset.variables["SPINPERIODVALID"].values.tolist()
51
+ # spin_period_valid_attr = dataset.variables["SPINPERIODVALID"].attrs
52
+ # expected_spin_period_valid_attr = ultra_cdf_attrs.StringAttrs(
53
+ # depend_0="epoch", catdesc="spinperiodvalid", fieldname="spinperiodvalid"
54
+ # )
55
+
56
+ # assert spin_period_valid_list == decom_ultra_aux["SPINPERIODVALID"]
57
+ # assert spin_period_valid_attr == expected_spin_period_valid_attr.output()
58
+
59
+ # # Spot check support data and attributes
60
+ # version_list = dataset.variables["VERSION"].values.tolist()
61
+ # version_attr = dataset.variables["VERSION"].attrs
62
+ # expected_version_attr = dataclasses.replace(
63
+ # ultra_cdf_attrs.ultra_support_attrs,
64
+ # catdesc="version",
65
+ # fieldname="version",
66
+ # label_axis="version",
67
+ # ).output()
68
+
69
+ # assert version_list == decom_ultra_aux["VERSION"]
70
+ # assert version_attr == expected_version_attr
71
+
72
+ # # Spot check metadata data and attributes
73
+ # shcoarse_list = dataset.variables["SHCOARSE"].values.tolist()
74
+ # shcoarse_attr = dataset.variables["SHCOARSE"].attrs
75
+
76
+ # expected_shcoarse_attr = dataclasses.replace(
77
+ # ultra_cdf_attrs.ultra_support_attrs,
78
+ # catdesc="shcoarse",
79
+ # fieldname="shcoarse",
80
+ # label_axis="shcoarse",
81
+ # ).output()
82
+
83
+ # assert shcoarse_list == decom_ultra_aux["SHCOARSE"]
84
+ # assert shcoarse_attr == expected_shcoarse_attr
85
+
86
+
87
+ @pytest.mark.parametrize(
88
+ "decom_test_data",
89
+ [
90
+ pytest.param(
91
+ {
92
+ "apid": ULTRA_RATES.apid[0],
93
+ "filename": "FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50"
94
+ "_theta-0.00_20240207T102740.CCSDS",
95
+ }
96
+ )
97
+ ],
98
+ indirect=True,
99
+ )
100
+ @pytest.mark.xfail(reason="Fix CDF attrs")
101
+ def test_xarray_rates(decom_test_data):
102
+ """This function checks that a xarray was
103
+ successfully created from the decom_ultra_rates data."""
104
+ pass
105
+ # decom_ultra_rates, _ = decom_test_data
106
+ # dataset = create_dataset({ULTRA_RATES.apid[0]: decom_ultra_rates})
107
+
108
+ # # Spot check metadata data and attributes
109
+ # j2000_time = (
110
+ # np.datetime64("2024-02-07T15:28:37.184000", "ns") - J2000_EPOCH
111
+ # ).astype(np.int64)
112
+ # specific_epoch_data = dataset.sel(epoch=j2000_time)["START_RF"]
113
+ # startrf_list = specific_epoch_data.values.tolist()
114
+ # startrf_attr = dataset.variables["START_RF"].attrs
115
+
116
+ # expected_startrf_attr = dataclasses.replace(
117
+ # ultra_cdf_attrs.ultra_support_attrs,
118
+ # catdesc="start_rf",
119
+ # fieldname="start_rf",
120
+ # label_axis="start_rf",
121
+ # ).output()
122
+
123
+ # assert startrf_list == decom_ultra_rates["START_RF"][0]
124
+ # assert startrf_attr == expected_startrf_attr
125
+
126
+
127
+ @pytest.mark.parametrize(
128
+ "decom_test_data",
129
+ [
130
+ pytest.param(
131
+ {
132
+ "apid": ULTRA_TOF.apid[0],
133
+ "filename": "FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50"
134
+ "_theta-0.00_20240207T102740.CCSDS",
135
+ }
136
+ )
137
+ ],
138
+ indirect=True,
139
+ )
140
+ @pytest.mark.xfail(reason="Fix CDF attrs")
141
+ def test_xarray_tof(decom_test_data):
142
+ """This function checks that a xarray was
143
+ successfully created from the decom_ultra_tof data."""
144
+ pass
145
+ # decom_ultra_tof, _ = decom_test_data
146
+ # dataset = create_dataset({ULTRA_TOF.apid[0]: decom_ultra_tof})
147
+
148
+ # # Spot check metadata data and attributes
149
+ # j2000_time = (
150
+ # np.datetime64("2024-02-07T15:28:36.184000", "ns") - J2000_EPOCH
151
+ # ).astype(np.int64)
152
+ # specific_epoch_data = dataset.sel(epoch=j2000_time, sid=0)["PACKETDATA"]
153
+ # packetdata_attr = dataset.variables["PACKETDATA"].attrs
154
+
155
+ # expected_packetdata_attr = dataclasses.replace(
156
+ # ultra_cdf_attrs.ultra_support_attrs,
157
+ # catdesc="packetdata",
158
+ # fieldname="packetdata",
159
+ # label_axis="packetdata",
160
+ # depend_1="sid",
161
+ # depend_2="row",
162
+ # depend_3="column",
163
+ # units="pixels",
164
+ # variable_purpose="primary_var",
165
+ # ).output()
166
+
167
+ # assert (specific_epoch_data == decom_ultra_tof["PACKETDATA"][0][0]).all()
168
+ # assert packetdata_attr == expected_packetdata_attr
169
+
170
+
171
+ @pytest.mark.parametrize(
172
+ "decom_test_data",
173
+ [
174
+ pytest.param(
175
+ {
176
+ "apid": ULTRA_EVENTS.apid[0],
177
+ "filename": "FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50"
178
+ "_theta-0.00_20240207T102740.CCSDS",
179
+ },
180
+ )
181
+ ],
182
+ indirect=True,
183
+ )
184
+ @pytest.mark.xfail(reason="Fix CDF attrs")
185
+ def test_xarray_events(decom_test_data, decom_ultra_aux, events_test_path):
186
+ """This function checks that a xarray was
187
+ successfully created from the decom_ultra_events data."""
188
+ pass
189
+ # decom_ultra_events, _ = decom_test_data
190
+ # dataset = create_dataset(
191
+ # {
192
+ # ULTRA_EVENTS.apid[0]: decom_ultra_events,
193
+ # ULTRA_AUX.apid[0]: decom_ultra_aux,
194
+ # }
195
+ # )
196
+
197
+ # # Spot check metadata data and attributes
198
+ # j2000_time = (
199
+ # np.datetime64("2024-02-07T15:28:37.184000", "ns") - J2000_EPOCH
200
+ # ).astype(np.int64)
201
+ # specific_epoch_data = dataset.sel(epoch=j2000_time)["COIN_TYPE"]
202
+ # cointype_list = specific_epoch_data.values.tolist()
203
+ # cointype_attr = dataset.variables["COIN_TYPE"].attrs
204
+
205
+ # expected_cointype_attr = dataclasses.replace(
206
+ # ultra_cdf_attrs.ultra_support_attrs,
207
+ # catdesc="coin_type",
208
+ # fieldname="coin_type",
209
+ # label_axis="coin_type",
210
+ # ).output()
211
+
212
+ # assert cointype_list == decom_ultra_events["COIN_TYPE"][0]
213
+ # assert cointype_attr == expected_cointype_attr
214
+
215
+
216
+ def test_cdf_aux(
217
+ ccsds_path_theta_0,
218
+ decom_ultra_aux,
219
+ ):
220
+ """Tests that CDF file is created and contains same attributes as xarray."""
221
+
222
+ test_data = ultra_l1a(
223
+ ccsds_path_theta_0, data_version="001", apid=ULTRA_AUX.apid[0]
224
+ )
225
+ test_data_path = write_cdf(test_data[0])
226
+
227
+ assert test_data_path.exists()
228
+ assert test_data_path.name == "imap_ultra_l1a_45sensor-aux_20240207_v001.cdf"
229
+
230
+ dataset_aux = create_dataset({ULTRA_AUX.apid[0]: decom_ultra_aux})
231
+ input_xarray_aux = load_cdf(test_data_path)
232
+
233
+ # write_cdf() injects some attributes that are not in the xarray
234
+ assert set(dataset_aux.attrs.keys()).issubset(set(input_xarray_aux.attrs.keys()))
235
+
236
+
237
+ @pytest.mark.parametrize(
238
+ "decom_test_data",
239
+ [
240
+ pytest.param(
241
+ {
242
+ "apid": ULTRA_RATES.apid[0],
243
+ "filename": "FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50"
244
+ "_theta-0.00_20240207T102740.CCSDS",
245
+ },
246
+ )
247
+ ],
248
+ indirect=True,
249
+ )
250
+ def test_cdf_rates(ccsds_path_theta_0, decom_test_data):
251
+ """Tests that CDF file is created and contains same attributes as xarray."""
252
+ decom_ultra_rates, _ = decom_test_data
253
+ test_data = ultra_l1a(
254
+ ccsds_path_theta_0, data_version="001", apid=ULTRA_RATES.apid[0]
255
+ )
256
+ # TODO: Dropping duplicates to ignore ISTP for now. Need to update test data
257
+ # or wait for an update to cdflib
258
+ test_data[0] = test_data[0].sortby("epoch").groupby("epoch").first()
259
+ test_data_path = write_cdf(test_data[0])
260
+
261
+ assert test_data_path.exists()
262
+ assert test_data_path.name == "imap_ultra_l1a_45sensor-rates_20240207_v001.cdf"
263
+
264
+ dataset_rates = create_dataset({ULTRA_RATES.apid[0]: decom_ultra_rates})
265
+ input_xarray_rates = load_cdf(test_data_path)
266
+
267
+ # write_cdf() injects some attributes that are not in the xarray
268
+ assert set(dataset_rates.attrs.keys()).issubset(
269
+ set(input_xarray_rates.attrs.keys())
270
+ )
271
+
272
+
273
+ @pytest.mark.parametrize(
274
+ "decom_test_data",
275
+ [
276
+ pytest.param(
277
+ {
278
+ "apid": ULTRA_TOF.apid[0],
279
+ "filename": "FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50"
280
+ "_theta-0.00_20240207T102740.CCSDS",
281
+ },
282
+ )
283
+ ],
284
+ indirect=True,
285
+ )
286
+ def test_cdf_tof(ccsds_path_theta_0, decom_test_data):
287
+ """Tests that CDF file is created and contains same attributes as xarray."""
288
+ decom_ultra_tof, _ = decom_test_data
289
+ test_data = ultra_l1a(
290
+ ccsds_path_theta_0, data_version="001", apid=ULTRA_TOF.apid[0]
291
+ )
292
+ test_data_path = write_cdf(test_data[0])
293
+
294
+ assert test_data_path.exists()
295
+ assert test_data_path.name == "imap_ultra_l1a_45sensor-histogram_20240207_v001.cdf"
296
+
297
+ dataset_tof = create_dataset({ULTRA_TOF.apid[0]: decom_ultra_tof})
298
+ input_xarray_tof = load_cdf(test_data_path)
299
+ # write_cdf() injects some attributes that are not in the xarray
300
+ assert set(dataset_tof.attrs.keys()).issubset(set(input_xarray_tof.attrs.keys()))
301
+
302
+
303
+ @pytest.mark.parametrize(
304
+ "decom_test_data",
305
+ [
306
+ pytest.param(
307
+ {
308
+ "apid": ULTRA_EVENTS.apid[0],
309
+ "filename": "FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50"
310
+ "_theta-0.00_20240207T102740.CCSDS",
311
+ },
312
+ )
313
+ ],
314
+ indirect=True,
315
+ )
316
+ def test_cdf_events(ccsds_path_theta_0, decom_ultra_aux, decom_test_data):
317
+ """Tests that CDF file is created and contains same attributes as xarray."""
318
+ decom_ultra_events, _ = decom_test_data
319
+ test_data = ultra_l1a(
320
+ ccsds_path_theta_0, data_version="001", apid=ULTRA_EVENTS.apid[0]
321
+ )
322
+ # TODO: Dropping duplicates to ignore ISTP for now. Need to update test data
323
+ # or wait for an update to cdflib
324
+ test_data[0] = test_data[0].sortby("epoch").groupby("epoch").first()
325
+ test_data_path = write_cdf(test_data[0])
326
+
327
+ assert test_data_path.exists()
328
+ assert test_data_path.name == "imap_ultra_l1a_45sensor-de_20240207_v001.cdf"
329
+
330
+ dataset_events = create_dataset(
331
+ {ULTRA_EVENTS.apid[0]: decom_ultra_events, ULTRA_AUX.apid[0]: decom_ultra_aux}
332
+ )
333
+ input_xarray_events = load_cdf(test_data_path)
334
+
335
+ # write_cdf() injects some attributes that are not in the xarray
336
+ assert set(dataset_events.attrs.keys()).issubset(
337
+ set(input_xarray_events.attrs.keys())
338
+ )
@@ -0,0 +1,122 @@
1
+ import numpy as np
2
+ import pytest
3
+ import xarray as xr
4
+
5
+ from imap_processing.ultra.l1b.ultra_l1b import ultra_l1b
6
+ from imap_processing.ultra.utils.ultra_l1_utils import create_dataset
7
+
8
+
9
+ @pytest.fixture()
10
+ def mock_data_l1a_rates_dict():
11
+ # Create sample data for the xarray Dataset
12
+ epoch = np.arange(
13
+ "2024-02-07T15:28:37", "2024-02-07T15:28:42", dtype="datetime64[s]"
14
+ ).astype("datetime64[ns]")
15
+
16
+ data_vars = {
17
+ "COIN_TYPE": ("epoch", np.zeros(5)),
18
+ }
19
+
20
+ attrs = {
21
+ "Logical_source": "imap_ultra_l1a_45sensor-rates",
22
+ "Logical_source_description": "IMAP Mission ULTRA Instrument "
23
+ "Level-1A Single-Sensor Data",
24
+ }
25
+
26
+ dataset = xr.Dataset(data_vars, coords={"epoch": epoch}, attrs=attrs)
27
+
28
+ data_dict = {"imap_ultra_l1a_45sensor-rates": dataset}
29
+ return data_dict
30
+
31
+
32
+ @pytest.fixture()
33
+ def mock_data_l1a_de_aux_dict():
34
+ # Create sample data for the xarray Dataset
35
+ epoch = np.arange(
36
+ "2024-02-07T15:28:37", "2024-02-07T15:28:42", dtype="datetime64[s]"
37
+ ).astype("datetime64[ns]")
38
+
39
+ data_vars = {
40
+ "var": ("epoch", np.zeros(5)),
41
+ }
42
+
43
+ attrs = {
44
+ "Logical_source": "imap_ultra_l1a_45sensor-name",
45
+ "Logical_source_description": "IMAP Mission ULTRA Instrument "
46
+ "Level-1A Single-Sensor Data",
47
+ }
48
+
49
+ dataset = xr.Dataset(data_vars, coords={"epoch": epoch}, attrs=attrs)
50
+
51
+ data_dict = {
52
+ "imap_ultra_l1a_45sensor-de": dataset,
53
+ "imap_ultra_l1a_45sensor-aux": dataset,
54
+ }
55
+
56
+ return data_dict
57
+
58
+
59
+ @pytest.fixture()
60
+ def mock_data_l1b_dict():
61
+ epoch = np.array(
62
+ [760591786368000000, 760591787368000000, 760591788368000000],
63
+ dtype="datetime64[ns]",
64
+ )
65
+ data_dict = {"epoch": epoch, "x_front": np.zeros(3), "y_front": np.zeros(3)}
66
+ return data_dict
67
+
68
+
69
+ def test_create_dataset(mock_data_l1b_dict):
70
+ """Tests that dataset is created as expected."""
71
+ dataset = create_dataset(mock_data_l1b_dict, "imap_ultra_l1b_45sensor-de", "l1b")
72
+
73
+ assert "epoch" in dataset.coords
74
+ assert dataset.coords["epoch"].dtype == "datetime64[ns]"
75
+ assert dataset.attrs["Logical_source"] == "imap_ultra_l1b_45sensor-de"
76
+ assert dataset["x_front"].attrs["UNITS"] == "mm"
77
+ np.testing.assert_array_equal(dataset["x_front"], np.zeros(3))
78
+
79
+
80
+ def test_ultra_l1b_rates(mock_data_l1a_rates_dict):
81
+ """Tests that L1b data is created."""
82
+ output_datasets = ultra_l1b(mock_data_l1a_rates_dict, data_version="001")
83
+
84
+ assert len(output_datasets) == 3
85
+ assert (
86
+ output_datasets[0].attrs["Logical_source"]
87
+ == "imap_ultra_l1b_45sensor-extendedspin"
88
+ )
89
+ assert (
90
+ output_datasets[1].attrs["Logical_source"]
91
+ == "imap_ultra_l1b_45sensor-cullingmask"
92
+ )
93
+ assert (
94
+ output_datasets[2].attrs["Logical_source"] == "imap_ultra_l1b_45sensor-badtimes"
95
+ )
96
+ assert (
97
+ output_datasets[0].attrs["Logical_source_description"]
98
+ == "IMAP-Ultra Instrument Level-1B Extended Spin Data."
99
+ )
100
+
101
+
102
+ def test_ultra_l1b_de(mock_data_l1a_de_aux_dict):
103
+ """Tests that L1b data is created."""
104
+ output_datasets = ultra_l1b(mock_data_l1a_de_aux_dict, data_version="001")
105
+
106
+ assert len(output_datasets) == 1
107
+ assert output_datasets[0].attrs["Logical_source"] == "imap_ultra_l1b_45sensor-de"
108
+ assert (
109
+ output_datasets[0].attrs["Logical_source_description"]
110
+ == "IMAP-Ultra Instrument Level-1B Direct Event Data."
111
+ )
112
+
113
+
114
+ def test_ultra_l1b_error(mock_data_l1a_rates_dict):
115
+ """Tests that L1a data throws an error."""
116
+ mock_data_l1a_rates_dict["bad_key"] = mock_data_l1a_rates_dict.pop(
117
+ "imap_ultra_l1a_45sensor-rates"
118
+ )
119
+ with pytest.raises(
120
+ ValueError, match="Data dictionary does not contain the expected keys."
121
+ ):
122
+ ultra_l1b(mock_data_l1a_rates_dict, data_version="001")
@@ -0,0 +1,57 @@
1
+ """Tests coverage for ultra_l1b_annotated.py"""
2
+
3
+ import numpy as np
4
+ import pytest
5
+ import spiceypy as spice
6
+
7
+ from imap_processing.spice.geometry import SpiceFrame
8
+ from imap_processing.ultra.l1b.ultra_l1b_annotated import get_particle_velocity
9
+
10
+
11
+ @pytest.fixture()
12
+ def kernels(spice_test_data_path):
13
+ """List SPICE kernels."""
14
+ required_kernels = [
15
+ "imap_science_0001.tf",
16
+ "imap_sclk_0000.tsc",
17
+ "sim_1yr_imap_attitude.bc",
18
+ "imap_wkcp.tf",
19
+ "naif0012.tls",
20
+ "sim_1yr_imap_pointing_frame.bc",
21
+ ]
22
+ kernels = [str(spice_test_data_path / kernel) for kernel in required_kernels]
23
+
24
+ return kernels
25
+
26
+
27
+ def test_get_particle_velocity(spice_test_data_path, kernels):
28
+ """Tests get_particle_velocity function."""
29
+ spice.furnsh(kernels)
30
+
31
+ pointing_cover = spice.ckcov(
32
+ str(spice_test_data_path / "sim_1yr_imap_pointing_frame.bc"),
33
+ SpiceFrame.IMAP_DPS.value,
34
+ True,
35
+ "SEGMENT",
36
+ 0,
37
+ "TDB",
38
+ )
39
+ # Get start and end time of first interval
40
+ start, _ = spice.wnfetd(pointing_cover, 0)
41
+
42
+ times = np.array([start])
43
+
44
+ instrument_velocity = np.array([[41.18609, -471.24467, -832.8784]])
45
+
46
+ velocity_45 = get_particle_velocity(
47
+ times, instrument_velocity, SpiceFrame.IMAP_ULTRA_45, SpiceFrame.IMAP_DPS
48
+ )
49
+ velocity_90 = get_particle_velocity(
50
+ times, instrument_velocity, SpiceFrame.IMAP_ULTRA_90, SpiceFrame.IMAP_DPS
51
+ )
52
+
53
+ # Compute the magnitude of the velocity vectors in both frames
54
+ magnitude_45 = np.linalg.norm(velocity_45[0])
55
+ magnitude_90 = np.linalg.norm(velocity_90[0])
56
+
57
+ assert np.allclose(magnitude_45, magnitude_90, atol=1e-6)