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,229 @@
1
+ """Tests coverage for imap_processing.cli."""
2
+
3
+ import sys
4
+ from unittest import mock
5
+
6
+ import pytest
7
+ import xarray as xr
8
+
9
+ from imap_processing.cli import Codice, Hi, Hit, Ultra, _validate_args, main
10
+
11
+
12
+ @pytest.fixture()
13
+ def mock_instrument_dependencies():
14
+ with (
15
+ mock.patch("imap_processing.cli.imap_data_access.query") as mock_query,
16
+ mock.patch("imap_processing.cli.imap_data_access.download") as mock_download,
17
+ mock.patch("imap_processing.cli.imap_data_access.upload") as mock_upload,
18
+ mock.patch("imap_processing.cli.write_cdf") as mock_write_cdf,
19
+ mock.patch("imap_processing.cli.load_cdf") as mock_load_cdf,
20
+ ):
21
+ mocks = {
22
+ "mock_query": mock_query,
23
+ "mock_download": mock_download,
24
+ "mock_upload": mock_upload,
25
+ "mock_write_cdf": mock_write_cdf,
26
+ "mock_load_cdf": mock_load_cdf,
27
+ }
28
+ yield mocks
29
+
30
+
31
+ @mock.patch("imap_processing.cli.Mag")
32
+ def test_main(mock_instrument):
33
+ """Test imap_processing.cli.main()"""
34
+ test_args = [
35
+ "imap_cli",
36
+ "--instrument",
37
+ "mag",
38
+ "--dependency",
39
+ (
40
+ '[{"instrument": "mag", '
41
+ '"data_level": "l0", '
42
+ '"descriptor": "sci", '
43
+ '"version": "v001", '
44
+ '"start_date": "20240430"}]'
45
+ ),
46
+ "--data-level",
47
+ "l1a",
48
+ "--start-date",
49
+ "20240430",
50
+ "--end-date",
51
+ "20240501",
52
+ "--version",
53
+ "v001",
54
+ "--upload-to-sdc",
55
+ ]
56
+ with mock.patch.object(sys, "argv", test_args):
57
+ # Running without raising an exception is a pass.
58
+ # No asserts needed.
59
+ main()
60
+
61
+
62
+ @pytest.mark.parametrize(
63
+ "instrument, data_level, raises_value_error",
64
+ [
65
+ ("mag", "l0", ""),
66
+ ("foo", "l0", "foo is not in the supported .*"),
67
+ ("codice", "l1z", "l1z is not a supported .*"),
68
+ ],
69
+ )
70
+ def test_validate_args(instrument, data_level, raises_value_error):
71
+ """Test coverage for imap_processing.cli._validate_args()"""
72
+ args = mock.Mock
73
+ args.instrument = instrument
74
+ args.data_level = data_level
75
+
76
+ if raises_value_error:
77
+ with pytest.raises(ValueError, match=raises_value_error):
78
+ _validate_args(args)
79
+ else:
80
+ _validate_args(args)
81
+
82
+
83
+ @mock.patch("imap_processing.cli.codice_l1a.process_codice_l1a")
84
+ def test_codice(mock_codice_l1a, mock_instrument_dependencies):
85
+ """Test coverage for cli.CoDICE class"""
86
+
87
+ test_dataset = xr.Dataset({}, attrs={"cdf_filename": "file0"})
88
+
89
+ mocks = mock_instrument_dependencies
90
+ mocks["mock_query"].return_value = [{"file_path": "/path/to/file0"}]
91
+ mocks["mock_download"].return_value = "file0"
92
+ mock_codice_l1a.return_value = test_dataset
93
+ mocks["mock_write_cdf"].side_effect = ["/path/to/file0"]
94
+
95
+ dependency_str = (
96
+ "[{"
97
+ "'instrument': 'codice',"
98
+ "'data_level': 'l0',"
99
+ "'descriptor': 'hskp',"
100
+ "'version': 'v001',"
101
+ "'start_date': '20230822'"
102
+ "}]"
103
+ )
104
+ instrument = Codice("l1a", dependency_str, "20230822", "20230822", "v001", True)
105
+ instrument.process()
106
+ assert mocks["mock_query"].call_count == 1
107
+ assert mocks["mock_download"].call_count == 1
108
+ assert mock_codice_l1a.call_count == 1
109
+ assert mocks["mock_upload"].call_count == 1
110
+
111
+
112
+ @pytest.mark.parametrize("data_level, n_prods", [("l1a", 2), ("l1b", 1), ("l1c", 1)])
113
+ def test_hi_l1(mock_instrument_dependencies, data_level, n_prods):
114
+ """Test coverage for cli.Hi class"""
115
+ mocks = mock_instrument_dependencies
116
+ mocks["mock_query"].return_value = [{"file_path": "/path/to/file0"}]
117
+ mocks["mock_download"].return_value = "file0"
118
+ mocks["mock_write_cdf"].side_effect = ["/path/to/file0", "/path/to/file1"]
119
+ mocks["mock_load_cdf"].return_value = xr.Dataset()
120
+
121
+ # patch autospec=True makes this test confirm that the function call in cli.py
122
+ # matches the mocked function signature.
123
+ with mock.patch(
124
+ f"imap_processing.cli.hi_{data_level}.hi_{data_level}", autospec=True
125
+ ) as mock_hi:
126
+ mock_hi.return_value = [f"{data_level}_file{n}" for n in range(n_prods)]
127
+ dependency_str = (
128
+ "[{"
129
+ "'instrument': 'lo',"
130
+ "'data_level': 'l0',"
131
+ "'descriptor': 'sci',"
132
+ "'version': 'v00-01',"
133
+ "'start_date': '20231212'"
134
+ "}]"
135
+ )
136
+ instrument = Hi(
137
+ data_level, dependency_str, "20231212", "20231213", "v005", True
138
+ )
139
+ instrument.process()
140
+ assert mocks["mock_query"].call_count == 1
141
+ assert mocks["mock_download"].call_count == 1
142
+ assert mock_hi.call_count == 1
143
+ assert mocks["mock_upload"].call_count == n_prods
144
+
145
+
146
+ @mock.patch("imap_processing.cli.ultra_l1a.ultra_l1a")
147
+ def test_ultra_l1a(mock_ultra_l1a, mock_instrument_dependencies):
148
+ """Test coverage for cli.Ultra class with l1a data level"""
149
+ mocks = mock_instrument_dependencies
150
+ mocks["mock_query"].return_value = [{"file_path": "/path/to/file0"}]
151
+ mocks["mock_download"].return_value = "dependency0"
152
+ mock_ultra_l1a.return_value = ["l1a_dataset0", "l1a_dataset1"]
153
+ mocks["mock_write_cdf"].side_effect = ["/path/to/product0", "/path/to/product1"]
154
+
155
+ dependency_str = (
156
+ "[{"
157
+ "'instrument': 'ultra',"
158
+ "'data_level': 'l0',"
159
+ "'descriptor': 'raw',"
160
+ "'version': 'v001',"
161
+ "'start_date': '20240207'"
162
+ "}]"
163
+ )
164
+ instrument = Ultra("l1a", dependency_str, "20240207", "20240208", "v001", True)
165
+ instrument.process()
166
+ assert mocks["mock_query"].call_count == 1
167
+ assert mocks["mock_download"].call_count == 1
168
+ assert mock_ultra_l1a.call_count == 1
169
+ assert mocks["mock_upload"].call_count == 2
170
+
171
+
172
+ @mock.patch("imap_processing.cli.ultra_l1b.ultra_l1b")
173
+ def test_ultra_l1b(mock_ultra_l1b, mock_instrument_dependencies):
174
+ """Test coverage for cli.Ultra class with l1b data level"""
175
+ mocks = mock_instrument_dependencies
176
+ mocks["mock_query"].return_value = [{"file_path": "/path/to/file0"}]
177
+ mocks["mock_download"].return_value = "dependency0"
178
+ mock_ultra_l1b.return_value = ["l1b_dataset0", "l1b_dataset1"]
179
+ mocks["mock_write_cdf"].side_effect = ["/path/to/product0", "/path/to/product1"]
180
+
181
+ instrument = Ultra("l1b", "[]", "20240207", "20240208", "v001", True)
182
+ instrument.process()
183
+ assert mocks["mock_query"].call_count == 0
184
+ assert mocks["mock_download"].call_count == 0
185
+ assert mock_ultra_l1b.call_count == 1
186
+ assert mocks["mock_upload"].call_count == 2
187
+
188
+
189
+ @mock.patch("imap_processing.cli.ultra_l1c.ultra_l1c")
190
+ def test_ultra_l1c(mock_ultra_l1c, mock_instrument_dependencies):
191
+ """Test coverage for cli.Ultra class with l1c data level"""
192
+ mocks = mock_instrument_dependencies
193
+ mocks["mock_query"].return_value = [{"file_path": "/path/to/file0"}]
194
+ mocks["mock_download"].return_value = "dependency0"
195
+ mock_ultra_l1c.return_value = ["l1c_dataset0", "l1c_dataset1"]
196
+ mocks["mock_write_cdf"].side_effect = ["/path/to/product0", "/path/to/product1"]
197
+
198
+ instrument = Ultra("l1c", "[]", "20240207", "20240208", "v001", True)
199
+ instrument.process()
200
+ assert mocks["mock_query"].call_count == 0
201
+ assert mocks["mock_download"].call_count == 0
202
+ assert mock_ultra_l1c.call_count == 1
203
+ assert mocks["mock_upload"].call_count == 2
204
+
205
+
206
+ @mock.patch("imap_processing.cli.hit_l1a")
207
+ def test_hit_l1a(mock_hit_l1a, mock_instrument_dependencies):
208
+ """Test coverage for cli.Hit class with l1a data level"""
209
+ mocks = mock_instrument_dependencies
210
+ mocks["mock_query"].return_value = [{"file_path": "/path/to/file0"}]
211
+ mocks["mock_download"].return_value = "dependency0"
212
+ mock_hit_l1a.return_value = ["l1a_dataset0", "l1a_dataset1"]
213
+ mocks["mock_write_cdf"].side_effect = ["/path/to/product0", "/path/to/product1"]
214
+
215
+ dependency_str = (
216
+ "[{"
217
+ "'instrument': 'hit',"
218
+ "'data_level': 'l0',"
219
+ "'descriptor': 'raw',"
220
+ "'version': 'v001',"
221
+ "'start_date': '20100105'"
222
+ "}]"
223
+ )
224
+ instrument = Hit("l1a", dependency_str, "20100105", "20100101", "v001", True)
225
+ instrument.process()
226
+ assert mocks["mock_query"].call_count == 1
227
+ assert mocks["mock_download"].call_count == 1
228
+ assert mock_hit_l1a.call_count == 1
229
+ assert mocks["mock_upload"].call_count == 2
@@ -0,0 +1,66 @@
1
+ """Tests aspects of the decommutation process that is generic to all instruments"""
2
+
3
+ import pytest
4
+
5
+ from imap_processing import imap_module_directory
6
+
7
+ # Scrape the repo for all packet definition XML files
8
+ xtce_document_list = imap_module_directory.glob("*/packet_definitions/*.xml")
9
+
10
+
11
+ @pytest.mark.parametrize("xtce_document", xtce_document_list)
12
+ def test_ccsds_header(xtce_document):
13
+ """Test if the XTCE document contains the proper CCSDS header information"""
14
+
15
+ # Define what is expected in the XTCE document
16
+ header_keys = [
17
+ ("VERSION", "3"),
18
+ ("TYPE", "1"),
19
+ ("SEC_HDR_FLG", "1"),
20
+ ("PKT_APID", "11"),
21
+ ("SEQ_FLGS", "2"),
22
+ ("SRC_SEQ_CTR", "14"),
23
+ ("PKT_LEN", "16"),
24
+ ]
25
+ header_entry_list = (
26
+ "<xtce:EntryList>"
27
+ ' <xtce:ParameterRefEntry parameterRef="VERSION" />'
28
+ ' <xtce:ParameterRefEntry parameterRef="TYPE" />'
29
+ ' <xtce:ParameterRefEntry parameterRef="SEC_HDR_FLG" />'
30
+ ' <xtce:ParameterRefEntry parameterRef="PKT_APID" />'
31
+ ' <xtce:ParameterRefEntry parameterRef="SEQ_FLGS" />'
32
+ ' <xtce:ParameterRefEntry parameterRef="SRC_SEQ_CTR" />'
33
+ ' <xtce:ParameterRefEntry parameterRef="PKT_LEN" />'
34
+ "</xtce:EntryList>"
35
+ )
36
+
37
+ # Read in the XTCE document
38
+ with open(xtce_document) as f:
39
+ document = f.read()
40
+
41
+ # Check that each header key is defined as a Parameter
42
+ for key in header_keys:
43
+ # Format for old XTCE generation format
44
+ old_xtce_gen = (
45
+ f'<xtce:Parameter name="{key[0]}" parameterTypeRef="UINT{key[1]}"'
46
+ in document
47
+ or f'<xtce:Parameter name="{key[0]}" parameterTypeRef="uint{key[1]}"'
48
+ in document
49
+ )
50
+ # Format for new XTCE generation format
51
+ new_xtce_gen = (
52
+ f'<xtce:IntegerParameterType name="{key[0]}" signed="false">'
53
+ f"\n\t\t\t\t"
54
+ f'<xtce:IntegerDataEncoding sizeInBits="{key[1]}" '
55
+ f'encoding="unsigned" />' in document
56
+ )
57
+
58
+ assert any((old_xtce_gen, new_xtce_gen))
59
+
60
+ # Check that the header is defined as a SequenceContainer in the XTCE file
61
+ # First remove discrepancies in whitespace, tabs, and newlines
62
+ header_entry_list = (
63
+ header_entry_list.replace(" ", "").replace("\t", "").replace("\n", "")
64
+ )
65
+ document = document.replace(" ", "").replace("\t", "").replace("\n", "")
66
+ assert header_entry_list in document
@@ -0,0 +1,71 @@
1
+ """Test bitwise flagging."""
2
+
3
+ import numpy as np
4
+
5
+ from imap_processing.quality_flags import HitFlags, ImapLoFlags, ImapUltraFlags
6
+
7
+
8
+ def test_quality_flags():
9
+ """Test the bitwise operations."""
10
+
11
+ # Test individual flags
12
+ assert HitFlags.NONE == 0x0
13
+ assert ImapUltraFlags.NONE == 0x0
14
+ assert ImapLoFlags.NONE == 0x0
15
+ assert HitFlags.INF == 2**0
16
+ assert ImapUltraFlags.INF == 2**0
17
+ assert ImapLoFlags.INF == 2**0
18
+ assert HitFlags.NEG == 2**1
19
+ assert ImapUltraFlags.NEG == 2**1
20
+ assert ImapLoFlags.NEG == 2**1
21
+ assert ImapUltraFlags.BADSPIN == 2**2
22
+ assert ImapLoFlags.BADSPIN == 2**2
23
+ assert ImapUltraFlags.FLAG1 == 2**3
24
+ assert ImapLoFlags.FLAG2 == 2**3
25
+ assert HitFlags.FLAG3 == 2**2
26
+
27
+ # Test combined flags for Ultra
28
+ flag = (
29
+ ImapUltraFlags.INF
30
+ | ImapUltraFlags.NEG
31
+ | ImapUltraFlags.BADSPIN
32
+ | ImapUltraFlags.FLAG1
33
+ )
34
+ assert flag & ImapUltraFlags.INF
35
+ assert flag & ImapUltraFlags.BADSPIN
36
+ assert flag & ImapUltraFlags.FLAG1
37
+ assert flag.name == "INF|NEG|BADSPIN|FLAG1"
38
+ assert flag.value == 15
39
+
40
+ # Test combined flags for Lo
41
+ flag = ImapLoFlags.INF | ImapLoFlags.NEG | ImapLoFlags.BADSPIN | ImapLoFlags.FLAG2
42
+ assert flag & ImapLoFlags.INF
43
+ assert flag & ImapLoFlags.BADSPIN
44
+ assert flag & ImapLoFlags.FLAG2
45
+ assert flag.name == "INF|NEG|BADSPIN|FLAG2"
46
+ assert flag.value == 15
47
+
48
+ # Test combined flags for HIT
49
+ flag = HitFlags.INF | HitFlags.NEG | HitFlags.FLAG3
50
+ assert flag & HitFlags.INF
51
+ assert flag & HitFlags.FLAG3
52
+ assert flag.name == "INF|NEG|FLAG3"
53
+ assert flag.value == 7
54
+
55
+ # Test use-case for Ultra
56
+ data = np.array([-6, np.inf, 2, 3])
57
+ quality = np.array(
58
+ [
59
+ ImapUltraFlags.INF | ImapUltraFlags.NEG,
60
+ ImapUltraFlags.INF,
61
+ ImapUltraFlags.NONE,
62
+ ImapUltraFlags.NONE,
63
+ ]
64
+ )
65
+ # Select data without INF flags
66
+ non_inf_mask = (quality & ImapUltraFlags.INF.value) == 0
67
+ np.array_equal(data[non_inf_mask], np.array([-6, 2, 3]))
68
+
69
+ # Select data without NEG or INF flags
70
+ non_neg_mask = (quality & ImapUltraFlags.NEG.value) == 0
71
+ np.array_equal(data[non_inf_mask & non_neg_mask], np.array([2, 3]))
@@ -0,0 +1,107 @@
1
+ """Tests coverage for imap_processing/utils.py"""
2
+
3
+ import numpy as np
4
+ import pandas as pd
5
+ import pytest
6
+ import xarray as xr
7
+
8
+ from imap_processing import imap_module_directory, utils
9
+
10
+
11
+ def test_convert_raw_to_eu(tmp_path):
12
+ """Test coverage for utils.convert_raw_to_eu()"""
13
+ # Generate a csv for testing
14
+ test_df = pd.DataFrame(
15
+ data={
16
+ "packetName": ["PACKET_0", "PACKET_0", "PACKET_1"],
17
+ "mnemonic": ["FIELD_0", "FIELD_1", "FIELD_0"],
18
+ "convertAs": ["UNSEGMENTED_POLY", "UNSEGMENTED_POLY", "FOO_METHOD"],
19
+ "c0": [0, 1, 2],
20
+ "c1": [0, 1, 2],
21
+ "c2": [0, 0, 2],
22
+ "c3": [0, 0, 2],
23
+ "c4": [0, 0, 2],
24
+ "c5": [0, 1, 2],
25
+ "c6": [0, 0, 2],
26
+ "c7": [0, 0, 2],
27
+ "unit": ["a", "b", "c"],
28
+ }
29
+ )
30
+ test_csv = tmp_path / "test_convert_table.csv"
31
+ with open(test_csv, "w") as f:
32
+ f.write("# Comment on first line of file\n")
33
+ test_df.to_csv(f, index=False)
34
+
35
+ # Generate a fake dataset for testing
36
+ n_packets = 3
37
+ field_0 = np.arange(n_packets)
38
+ field_1 = np.arange(n_packets) + 10
39
+ time = np.arange(n_packets) + 1000
40
+ dn_dataset = xr.Dataset(
41
+ data_vars=dict(
42
+ FIELD_0=(["time"], field_0),
43
+ FIELD_1=(["time"], field_1),
44
+ ),
45
+ coords=dict(
46
+ time=time,
47
+ ),
48
+ )
49
+
50
+ eu_dataset = utils.convert_raw_to_eu(
51
+ dn_dataset.copy(), test_csv.absolute(), "PACKET_0", comment="#"
52
+ )
53
+
54
+ # Check the converted values by manually doing the polynomial math
55
+ np.testing.assert_array_equal(eu_dataset["FIELD_0"].data, np.zeros(n_packets))
56
+ assert eu_dataset["FIELD_0"].attrs["units"] == test_df["unit"].iloc[0]
57
+
58
+ field_1_coeffs = (
59
+ test_df[test_df["mnemonic"] == "FIELD_1"].filter(regex=r"c\d").values[0]
60
+ )
61
+ field_1_compare = np.zeros(n_packets)
62
+ for p, coeff in enumerate(field_1_coeffs):
63
+ field_1_compare += coeff * np.power(field_1, p)
64
+ np.testing.assert_array_equal(eu_dataset["FIELD_1"].data, field_1_compare)
65
+
66
+ # Check that a ValueError is raised for unexpected conversion specified in
67
+ # conversion table "convertAs" column
68
+ with pytest.raises(ValueError, match=r"Unexpected conversion type: .*"):
69
+ eu_dataset = utils.convert_raw_to_eu(
70
+ dn_dataset.copy(), test_csv.absolute(), "PACKET_1", comment="#"
71
+ )
72
+
73
+
74
+ @pytest.mark.parametrize(
75
+ "use_derived_value, expected_mode", [(True, "HVENG"), (False, 2)]
76
+ )
77
+ def test_packet_file_to_datasets(use_derived_value, expected_mode):
78
+ """
79
+ Test that all datatypes aren't all int64 and that we get
80
+ uint8/uint16 from header items as expected.
81
+
82
+ Test that we get multiple apids in the output.
83
+ """
84
+ test_file = "tests/swapi/l0_data/imap_swapi_l0_raw_20231012_v001.pkts"
85
+ packet_files = imap_module_directory / test_file
86
+ packet_definition = (
87
+ imap_module_directory / "swapi/packet_definitions/swapi_packet_definition.xml"
88
+ )
89
+ datasets_by_apid = utils.packet_file_to_datasets(
90
+ packet_files, packet_definition, use_derived_value=use_derived_value
91
+ )
92
+ # 3 apids in the test data
93
+ assert len(datasets_by_apid) == 3
94
+ data = datasets_by_apid[1188]
95
+ assert data["sec_hdr_flg"].dtype == np.uint8
96
+ assert data["pkt_apid"].dtype == np.uint16
97
+ np.testing.assert_array_equal(data["mode"], [expected_mode] * len(data["mode"]))
98
+
99
+
100
+ def test_packet_file_to_datasets_flat_definition():
101
+ test_file = "tests/idex/imap_idex_l0_raw_20230725_v001.pkts"
102
+ packet_files = imap_module_directory / test_file
103
+ packet_definition = (
104
+ imap_module_directory / "idex/packet_definitions/idex_packet_definition.xml"
105
+ )
106
+ with pytest.raises(ValueError, match="Packet fields do not match"):
107
+ utils.packet_file_to_datasets(packet_files, packet_definition)
File without changes
@@ -0,0 +1,24 @@
1
+ epoch,MET,Type,SequenceCount,SpinStartSeconds,SpinStartSubseconds,SpinDuration,SpinNumber,SpinDataTime,SpinPeriod,SpinPhase,SpinPeriodValid,SpinPhaseValid,SpinPeriodSource,CatbedHeater,Spins,IntegrationMultiplier1,IntegrationMultiplier2,HardwareMode,IMCEnb,LeftDeflection,RightDeflection
2
+ 2022-150T22:50:52.000, 391647054,AuxiliaryData,794,391647054,836,14001,26109934,391647055,43750,766,0,1,1,0,1,1,1,0,0,0,0
3
+ 2022-150T22:51:06.000, 391647068,AuxiliaryData,795,391647068,837,13999,26109935,391647069,43750,766,0,1,1,0,1,1,1,0,0,0,0
4
+ 2022-150T22:51:20.000, 391647082,AuxiliaryData,796,391647082,836,13999,26109936,391647083,43750,766,0,1,1,0,1,1,1,0,0,0,0
5
+ 2022-150T22:51:34.000, 391647096,AuxiliaryData,797,391647096,835,14001,26109937,391647097,43750,766,0,1,1,0,1,1,1,0,0,0,0
6
+ 2022-150T22:51:48.000, 391647110,AuxiliaryData,798,391647110,837,13998,26109938,391647111,43750,766,0,1,1,0,1,1,1,0,0,0,0
7
+ 2022-150T22:52:02.000, 391647124,AuxiliaryData,799,391647124,835,14001,26109939,391647125,43750,766,0,1,1,0,1,1,1,0,0,0,0
8
+ 2022-150T22:52:16.000, 391647138,AuxiliaryData,800,391647138,837,13998,26109940,391647139,43750,766,0,1,1,0,1,1,1,0,0,0,0
9
+ 2022-150T22:52:30.000, 391647152,AuxiliaryData,801,391647152,836,13999,26109941,391647153,43750,766,0,1,1,0,1,1,1,0,0,0,0
10
+ 2022-150T22:52:44.000, 391647166,AuxiliaryData,802,391647166,835,14002,26109942,391647167,43750,766,0,1,1,0,1,1,1,0,0,0,0
11
+ 2022-150T22:52:58.000, 391647180,AuxiliaryData,803,391647180,837,13999,26109943,391647181,43750,766,0,1,1,0,1,1,1,0,0,0,0
12
+ 2022-150T22:53:12.000, 391647194,AuxiliaryData,804,391647194,836,14000,26109944,391647195,43750,766,0,1,1,0,1,1,1,0,0,0,0
13
+ 2022-150T22:53:26.000, 391647208,AuxiliaryData,805,391647208,836,13999,26109945,391647209,43750,766,0,1,1,0,1,1,1,0,0,0,0
14
+ 2022-150T22:53:40.000, 391647222,AuxiliaryData,806,391647222,836,13999,26109946,391647223,43750,766,0,1,1,0,1,1,1,0,0,0,0
15
+ 2022-150T22:53:54.000, 391647236,AuxiliaryData,807,391647236,835,14001,26109947,391647237,43750,766,0,1,1,0,1,1,1,0,0,0,0
16
+ 2022-150T22:54:08.000, 391647250,AuxiliaryData,808,391647250,837,13998,26109948,391647251,43750,766,0,1,1,0,1,1,1,0,0,0,0
17
+ 2022-150T22:54:22.000, 391647264,AuxiliaryData,809,391647264,835,14001,26109949,391647265,43750,766,0,1,1,0,1,1,1,0,0,0,0
18
+ 2022-150T22:54:36.000, 391647278,AuxiliaryData,810,391647278,837,13999,26109950,391647279,43750,766,0,1,1,0,1,1,1,0,0,0,0
19
+ 2022-150T22:54:50.000, 391647292,AuxiliaryData,811,391647292,836,14000,26109951,391647293,43750,766,0,1,1,0,1,1,1,0,0,0,0
20
+ 2022-150T22:55:04.000, 391647306,AuxiliaryData,812,391647306,836,14000,26109952,391647307,43750,766,0,1,1,0,1,1,1,0,0,0,0
21
+ 2022-150T22:55:18.000, 391647320,AuxiliaryData,813,391647320,836,13999,26109953,391647321,43750,766,0,1,1,0,1,1,1,0,0,0,0
22
+ 2022-150T22:55:32.000, 391647334,AuxiliaryData,814,391647334,836,13999,26109954,391647335,43750,766,0,1,1,0,1,1,1,0,0,0,0
23
+ 2022-150T22:55:46.000, 391647348,AuxiliaryData,815,391647348,835,14001,26109955,391647349,43750,766,0,1,1,0,1,1,1,0,0,0,0
24
+ 2022-150T22:56:00.000, 391647362,AuxiliaryData,816,391647362,836,14000,26109956,391647363,43750,766,0,1,1,0,1,1,1,0,0,0,0