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,45 @@
1
+ """Tests the decommutation process for IDEX CCSDS Packets."""
2
+
3
+ import numpy as np
4
+ import xarray as xr
5
+
6
+ from imap_processing import imap_module_directory
7
+
8
+
9
+ def test_idex_decom_length(decom_test_data: xr.Dataset):
10
+ """Verify that there are 6 data variables in the output.
11
+
12
+ Parameters
13
+ ----------
14
+ decom_test_data : xarray.Dataset
15
+ The dataset to test with
16
+ """
17
+ assert len(decom_test_data) == 42
18
+
19
+
20
+ def test_idex_decom_event_num(decom_test_data: xr.Dataset):
21
+ """Verify that 19 impacts were gathered by the test data.
22
+
23
+ Parameters
24
+ ----------
25
+ decom_test_data : xarray.Dataset
26
+ The dataset to test with
27
+ """
28
+ for var in decom_test_data:
29
+ assert len(decom_test_data[var]) == 19
30
+
31
+
32
+ def test_idex_tof_high_data(decom_test_data: xr.Dataset):
33
+ """Verify that a sample of the data is correct.
34
+
35
+ ``impact_14_tof_high_data.txt`` has been verified correct by the IDEX team
36
+
37
+ Parameters
38
+ ----------
39
+ decom_test_data : xarray.Dataset
40
+ The dataset to test with
41
+ """
42
+
43
+ with open(f"{imap_module_directory}/tests/idex/impact_14_tof_high_data.txt") as f:
44
+ data = np.array([int(line.rstrip("\n")) for line in f])
45
+ assert (decom_test_data["TOF_High"][13].data == data).all()
@@ -0,0 +1,91 @@
1
+ """Tests the L1 processing for decommutated IDEX data"""
2
+
3
+ import numpy as np
4
+ import pytest
5
+ import xarray as xr
6
+ from cdflib.xarray.xarray_to_cdf import ISTPError
7
+
8
+ from imap_processing import imap_module_directory
9
+ from imap_processing.cdf.utils import load_cdf, write_cdf
10
+
11
+
12
+ def test_idex_cdf_file(decom_test_data: xr.Dataset):
13
+ """Verify the CDF file can be created with no errors.
14
+
15
+ Parameters
16
+ ----------
17
+ decom_test_data : xarray.Dataset
18
+ The dataset to test with
19
+ """
20
+
21
+ file_name = write_cdf(decom_test_data)
22
+
23
+ assert file_name.exists()
24
+ assert file_name.name == "imap_idex_l1_sci_20230725_v001.cdf"
25
+
26
+
27
+ def test_bad_cdf_attributes(decom_test_data: xr.Dataset):
28
+ """Ensure an ``ISTPError`` is raised when using bad CDF attributes.
29
+
30
+ Parameters
31
+ ----------
32
+ decom_test_data : xarray.Dataset
33
+ The dataset to test with
34
+ """
35
+ del decom_test_data["TOF_High"].attrs["DEPEND_1"]
36
+
37
+ with pytest.raises(ISTPError):
38
+ write_cdf(decom_test_data)
39
+
40
+
41
+ def test_bad_cdf_file_data(decom_test_data: xr.Dataset):
42
+ """Ensure an ``ISTPError`` is raised when using bad data.
43
+
44
+ Parameters
45
+ ----------
46
+ decom_test_data : xarray.Dataset
47
+ The dataset to test with
48
+ """
49
+ bad_data_attrs = {
50
+ "CATDESC": "Bad_Data",
51
+ "DEPEND_0": "epoch",
52
+ "DISPLAY_TYPE": "no_plot",
53
+ "FIELDNAM": "Bad_Data",
54
+ "FILLVAL": "",
55
+ "FORMAT": "E12.2",
56
+ "LABLAXIS": "Bad_Data",
57
+ "UNITS": "",
58
+ "VALIDMIN": "1",
59
+ "VALIDMAX": "50",
60
+ "VAR_TYPE": "support_data",
61
+ "VAR_NOTES": """How did this data end up in here?
62
+ The CDF creation better fail.""",
63
+ }
64
+ bad_data_xr = xr.DataArray(
65
+ name="bad_data",
66
+ data=np.linspace(1, 50, 50),
67
+ dims=("bad_data"),
68
+ attrs=bad_data_attrs,
69
+ )
70
+ decom_test_data["Bad_data"] = bad_data_xr
71
+
72
+ with pytest.raises(ISTPError):
73
+ write_cdf(decom_test_data)
74
+
75
+
76
+ def test_idex_tof_high_data_from_cdf(decom_test_data: xr.Dataset):
77
+ """Verify that a sample of the data is correct inside the CDF file.
78
+
79
+ ``impact_14_tof_high_data.txt`` has been verified correct by the IDEX team
80
+
81
+ Parameters
82
+ ----------
83
+ decom_test_data : xarray.Dataset
84
+ The dataset to test with
85
+ """
86
+ with open(f"{imap_module_directory}/tests/idex/impact_14_tof_high_data.txt") as f:
87
+ data = np.array([int(line.rstrip()) for line in f])
88
+
89
+ file_name = write_cdf(decom_test_data)
90
+ l1_data = load_cdf(file_name)
91
+ assert (l1_data["TOF_High"][13].data == data).all()
File without changes
@@ -0,0 +1,21 @@
1
+ from imap_processing.lo.l0.utils.binary_string import BinaryString
2
+
3
+
4
+ def test_binary_string_init():
5
+ binary = "00101"
6
+
7
+ data = BinaryString(binary)
8
+
9
+ assert data.bin == "00101"
10
+ assert data.bit_pos == 0
11
+
12
+
13
+ def test_get_bits():
14
+ binary = "0001110"
15
+ data = BinaryString(binary)
16
+
17
+ first_three_bits = data.next_bits(3)
18
+ next_four_bits = data.next_bits(4)
19
+
20
+ assert first_three_bits == "000"
21
+ assert next_four_bits == "1110"
@@ -0,0 +1,39 @@
1
+ import numpy as np
2
+ import pytest
3
+
4
+ from imap_processing.lo.l0.utils.bit_decompression import (
5
+ DECOMPRESSION_TABLES,
6
+ Decompress,
7
+ decompress_int,
8
+ )
9
+
10
+
11
+ @pytest.mark.parametrize(
12
+ ("decompression", "compressed_value", "expected_decompressed_int"),
13
+ [
14
+ (Decompress.DECOMPRESS8TO16, [209, 250], [9537, 53016]),
15
+ (Decompress.DECOMPRESS8TO12, [205], [1229]),
16
+ (Decompress.DECOMPRESS12TO16, [4068], [62908]),
17
+ ],
18
+ )
19
+ def test_decompress_int(decompression, compressed_value, expected_decompressed_int):
20
+ """Test decompression for 8to16, 8to12, 12to16."""
21
+
22
+ ## Act
23
+ decompressed_int = decompress_int(
24
+ compressed_value, decompression, DECOMPRESSION_TABLES
25
+ )
26
+
27
+ ## Assert
28
+ np.testing.assert_equal(decompressed_int, expected_decompressed_int)
29
+
30
+
31
+ def test_decompress_int_invalid_decompression():
32
+ """Test receiving an invalid decompression input."""
33
+ ## Arrange
34
+ decompression = "invalid decompression"
35
+ compressed_value = 4068
36
+
37
+ ## Act / Assert
38
+ with pytest.raises(ValueError, match="Invalid decompression method"):
39
+ decompress_int(compressed_value, decompression, DECOMPRESSION_TABLES)
@@ -0,0 +1,66 @@
1
+ from pathlib import Path
2
+
3
+ import numpy as np
4
+ import pytest
5
+
6
+ from imap_processing import imap_module_directory
7
+ from imap_processing.lo.l1a.lo_l1a import lo_l1a
8
+
9
+
10
+ @pytest.mark.skip(reason="not implemented")
11
+ @pytest.mark.parametrize(
12
+ ("dependency", "expected_logical_source"),
13
+ [
14
+ (Path("imap_lo_l0_de_20100101_v001.pkts"), "imap_lo_l1a_de"),
15
+ (
16
+ Path("imap_lo_l0_spin_20100101_v001.pkt"),
17
+ "imap_lo_l1a_spin",
18
+ ),
19
+ ],
20
+ )
21
+ def test_lo_l1a(dependency, expected_logical_source):
22
+ # Act
23
+ output_dataset = lo_l1a(dependency, "001")
24
+
25
+ # Assert
26
+ assert expected_logical_source == output_dataset.attrs["Logical_source"]
27
+
28
+
29
+ def test_lo_l1a_dataset():
30
+ # Arrange
31
+ dependency = (
32
+ imap_module_directory / "tests/lo/test_cdfs/imap_lo_l0_raw_20240627_v001.pkts"
33
+ )
34
+
35
+ histogram_fields = [
36
+ "SHCOARSE",
37
+ "START_A",
38
+ "START_C",
39
+ "STOP_B0",
40
+ "STOP_B3",
41
+ "TOF0_COUNT",
42
+ "TOF1_COUNT",
43
+ "TOF2_COUNT",
44
+ "TOF3_COUNT",
45
+ "TOF0_TOF1",
46
+ "TOF0_TOF2",
47
+ "TOF1_TOF2",
48
+ "SILVER",
49
+ "DISC_TOF0",
50
+ "DISC_TOF1",
51
+ "DISC_TOF2",
52
+ "DISC_TOF3",
53
+ "POS0",
54
+ "POS1",
55
+ "POS2",
56
+ "POS3",
57
+ "HYDROGEN",
58
+ "OXYGEN",
59
+ ]
60
+ hist_fields_lower = [field.lower() for field in histogram_fields]
61
+
62
+ # Act
63
+ output_datasets = lo_l1a(dependency, "001")
64
+
65
+ # Assert
66
+ np.testing.assert_array_equal(hist_fields_lower, output_datasets[0].data_vars)
@@ -0,0 +1,74 @@
1
+ from collections import namedtuple
2
+
3
+ from imap_processing import imap_module_directory
4
+ from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
5
+ from imap_processing.cdf.utils import load_cdf
6
+ from imap_processing.lo.l1b.lo_l1b import create_datasets, lo_l1b
7
+
8
+
9
+ def test_lo_l1b():
10
+ # Arrange
11
+ de_file = (
12
+ imap_module_directory / "tests/lo/test_cdfs/imap_lo_l1a_de_20100101_v001.cdf"
13
+ )
14
+ spin_file = (
15
+ imap_module_directory / "tests/lo/test_cdfs/imap_lo_l1a_spin_20100101_v001.cdf"
16
+ )
17
+ data = {}
18
+ for file in [de_file, spin_file]:
19
+ dataset = load_cdf(file)
20
+ data[dataset.attrs["Logical_source"]] = dataset
21
+
22
+ expected_logical_source = "imap_lo_l1b_de"
23
+ # Act
24
+ output_file = lo_l1b(data, "001")
25
+
26
+ # Assert
27
+ assert expected_logical_source == output_file.attrs["Logical_source"]
28
+
29
+
30
+ def test_create_datasets():
31
+ attr_mgr = ImapCdfAttributes()
32
+ attr_mgr.add_instrument_global_attrs(instrument="lo")
33
+ attr_mgr.add_instrument_variable_attrs(instrument="lo", level="l1b")
34
+
35
+ logical_source = "imap_lo_l1b_de"
36
+
37
+ data_field_tup = namedtuple("data_field_tup", ["name"])
38
+ data_fields = [
39
+ data_field_tup("ESA_STEP"),
40
+ data_field_tup("MODE"),
41
+ data_field_tup("TOF0"),
42
+ data_field_tup("TOF1"),
43
+ data_field_tup("TOF2"),
44
+ data_field_tup("TOF3"),
45
+ data_field_tup("COINCIDENCE_TYPE"),
46
+ data_field_tup("POS"),
47
+ data_field_tup("COINCIDENCE"),
48
+ data_field_tup("BADTIME"),
49
+ data_field_tup("DIRECTION"),
50
+ ]
51
+
52
+ dataset = create_datasets(attr_mgr, logical_source, data_fields)
53
+
54
+ assert len(dataset.tof0.shape) == 1
55
+ assert dataset.tof0.shape[0] == 3
56
+ assert len(dataset.tof1.shape) == 1
57
+ assert dataset.tof1.shape[0] == 3
58
+ assert len(dataset.tof2.shape) == 1
59
+ assert dataset.tof2.shape[0] == 3
60
+ assert len(dataset.tof3.shape) == 1
61
+ assert dataset.tof3.shape[0] == 3
62
+ assert len(dataset.mode.shape) == 1
63
+ assert dataset.mode.shape[0] == 3
64
+ assert len(dataset.coincidence_type.shape) == 1
65
+ assert dataset.coincidence_type.shape[0] == 3
66
+ assert len(dataset.pos.shape) == 1
67
+ assert dataset.pos.shape[0] == 3
68
+ assert len(dataset.direction.shape) == 2
69
+ assert dataset.direction.shape[0] == 3
70
+ assert dataset.direction.shape[1] == 3
71
+ assert len(dataset.badtime.shape) == 1
72
+ assert dataset.badtime.shape[0] == 3
73
+ assert len(dataset.esa_step.shape) == 1
74
+ assert dataset.esa_step.shape[0] == 3
@@ -0,0 +1,66 @@
1
+ from collections import namedtuple
2
+
3
+ import numpy as np
4
+
5
+ from imap_processing import imap_module_directory
6
+ from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
7
+ from imap_processing.cdf.utils import load_cdf
8
+ from imap_processing.lo.l1c.lo_l1c import create_datasets, lo_l1c
9
+
10
+
11
+ def test_lo_l1c():
12
+ # Arrange
13
+ de_file = (
14
+ imap_module_directory / "tests/lo/test_cdfs/imap_lo_l1b_de_20100101_v001.cdf"
15
+ )
16
+ data = {}
17
+ dataset = load_cdf(de_file)
18
+ data[dataset.attrs["Logical_source"]] = dataset
19
+
20
+ expected_logical_source = "imap_lo_l1c_pset"
21
+ # Act
22
+ output_dataset = lo_l1c(data, "001")
23
+
24
+ # Assert
25
+ assert expected_logical_source == output_dataset.attrs["Logical_source"]
26
+
27
+
28
+ def test_create_dataset():
29
+ attr_mgr = ImapCdfAttributes()
30
+ attr_mgr.add_instrument_global_attrs(instrument="lo")
31
+ attr_mgr.add_instrument_variable_attrs(instrument="lo", level="l1c")
32
+
33
+ logical_source = "imap_lo_l1c_pset"
34
+
35
+ data_field_tup = namedtuple("data_field_tup", ["name"])
36
+ data_fields = [
37
+ data_field_tup("POINTING_START"),
38
+ data_field_tup("POINTING_END"),
39
+ data_field_tup("MODE"),
40
+ data_field_tup("PIVOT_ANGLE"),
41
+ data_field_tup("TRIPLES_COUNTS"),
42
+ data_field_tup("TRIPLES_RATES"),
43
+ data_field_tup("DOUBLES_COUNTS"),
44
+ data_field_tup("DOUBLES_RATES"),
45
+ data_field_tup("HYDROGEN_COUNTS"),
46
+ data_field_tup("HYDROGEN_RATES"),
47
+ data_field_tup("OXYGEN_COUNTS"),
48
+ data_field_tup("OXYGEN_RATES"),
49
+ data_field_tup("EXPOSURE_TIME"),
50
+ ]
51
+
52
+ dataset = create_datasets(attr_mgr, logical_source, data_fields)
53
+
54
+ np.testing.assert_array_equal(dataset.pointing_start, np.ones(1))
55
+ np.testing.assert_array_equal(dataset.pointing_end, np.ones(1))
56
+ np.testing.assert_array_equal(dataset.mode, np.ones(1))
57
+ np.testing.assert_array_equal(dataset.pivot_angle, np.ones(1))
58
+ np.testing.assert_array_equal(dataset.triples_counts, np.ones((1, 3600, 7)))
59
+ np.testing.assert_array_equal(dataset.triples_rates, np.ones((1, 3600, 7)))
60
+ np.testing.assert_array_equal(dataset.doubles_counts, np.ones((1, 3600, 7)))
61
+ np.testing.assert_array_equal(dataset.doubles_rates, np.ones((1, 3600, 7)))
62
+ np.testing.assert_array_equal(dataset.hydrogen_counts, np.ones((1, 3600, 7)))
63
+ np.testing.assert_array_equal(dataset.hydrogen_rates, np.ones((1, 3600, 7)))
64
+ np.testing.assert_array_equal(dataset.oxygen_counts, np.ones((1, 3600, 7)))
65
+ np.testing.assert_array_equal(dataset.oxygen_rates, np.ones((1, 3600, 7)))
66
+ np.testing.assert_array_equal(dataset.exposure_time, np.ones((1, 7)))
@@ -0,0 +1,41 @@
1
+ import numpy as np
2
+
3
+ from imap_processing.lo.l0.lo_science import decompress
4
+
5
+
6
+ def test_decompress_8_to_16_bit():
7
+ # Arrange
8
+ # 174 in binary (= 2206 decompressed)
9
+ idx0 = "10101110"
10
+ # 20 in binary (= 20 decompressed)
11
+ idx1 = "00010100"
12
+ bin_str = idx0 + idx1
13
+ bits_per_index = 8
14
+ section_start = 0
15
+ section_length = 16
16
+ expected = [2206, 20]
17
+
18
+ # Act
19
+ out = decompress(bin_str, bits_per_index, section_start, section_length)
20
+
21
+ # Assert
22
+ np.testing.assert_equal(out, expected)
23
+
24
+
25
+ def test_decompress_12_to_16_bit():
26
+ # Arrange
27
+ # 3643 in binary (= 33400 decompressed)
28
+ idx0 = "111000111011"
29
+ # 20 in binary (= 20 decompressed
30
+ idx1 = "000000010100"
31
+ bin_str = idx0 + idx1
32
+ bits_per_index = 12
33
+ section_start = 0
34
+ section_length = 24
35
+ expected = [33400, 20]
36
+
37
+ # Act
38
+ out = decompress(bin_str, bits_per_index, section_start, section_length)
39
+
40
+ # Assert
41
+ np.testing.assert_equal(out, expected)
@@ -0,0 +1,209 @@
1
+ from collections import namedtuple
2
+
3
+ import numpy as np
4
+ import pytest
5
+
6
+ from imap_processing.lo.l0.data_classes.science_direct_events import (
7
+ ScienceDirectEvents,
8
+ )
9
+
10
+
11
+ @pytest.fixture()
12
+ def fake_packet_data():
13
+ fake_data_type = namedtuple("fake_data_cats", ["header", "data"])
14
+ fake_data_field = namedtuple("fake_packet", ["raw_value", "derived_value"])
15
+ return fake_data_type(
16
+ {
17
+ "VERSION": fake_data_field(0, 0),
18
+ "TYPE": fake_data_field(0, 0),
19
+ "SEC_HDR_FLG": fake_data_field(0, 0),
20
+ "PKT_APID": fake_data_field(0, 0),
21
+ "SEQ_FLGS": fake_data_field(0, 0),
22
+ "SRC_SEQ_CTR": fake_data_field(0, 0),
23
+ "PKT_LEN": fake_data_field(0, 0),
24
+ },
25
+ {
26
+ "SHCOARSE": fake_data_field(0, 0),
27
+ "DE_COUNT": fake_data_field(0, 0),
28
+ "DATA": fake_data_field("00", "00"),
29
+ "CHKSUM": fake_data_field(0, 0),
30
+ },
31
+ )
32
+
33
+
34
+ @pytest.fixture()
35
+ def single_de(fake_packet_data):
36
+ de = ScienceDirectEvents(fake_packet_data, "0", "fakepacketname")
37
+ de.DE_COUNT = 1
38
+ de.DE_TIME = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
39
+ de.ESA_STEP = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
40
+ de.MODE = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
41
+ de.TOF0 = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
42
+ de.TOF1 = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
43
+ de.TOF2 = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
44
+ de.TOF3 = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
45
+ de.CKSM = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
46
+ de.POS = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
47
+ return de
48
+
49
+
50
+ @pytest.fixture()
51
+ def multi_de(fake_packet_data):
52
+ de = ScienceDirectEvents(fake_packet_data, "0", "fakepacketname")
53
+ de.DE_COUNT = 2
54
+ de.DE_TIME = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
55
+ de.ESA_STEP = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
56
+ de.MODE = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
57
+ de.TOF0 = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
58
+ de.TOF1 = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
59
+ de.TOF2 = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
60
+ de.TOF3 = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
61
+ de.CKSM = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
62
+ de.POS = np.ones(de.DE_COUNT) * np.float64(-1.0e31)
63
+ return de
64
+
65
+
66
+ def test_parse_data_case_0(single_de):
67
+ # Arrange
68
+ absent = "0000" # case 0
69
+ time = "000001100100" # 100
70
+ energy = "010" # 2
71
+ mode = "1"
72
+ tof0 = "0000000000"
73
+ # TOF1 not transmitted
74
+ tof2 = "000000010" # 2
75
+ tof3 = "000011" # 3
76
+ cksm = "000" # 0
77
+ # POS not transmitted
78
+ single_de.DATA = absent + time + energy + mode + tof0 + tof2 + tof3 + cksm
79
+
80
+ expected_time = np.array([100])
81
+ expected_energy = np.array([2])
82
+ expected_mode = np.array([1])
83
+ # tofs and cksm are bit shifted to the left by 1 during decompression
84
+ expected_tof0 = np.array([0 << 1])
85
+ expected_tof1 = np.array([np.float64(-1.0e31)])
86
+ expected_tof2 = np.array([2 << 1])
87
+ expected_tof3 = np.array([3 << 1])
88
+ expected_cksm = np.array([0 << 1])
89
+ expected_pos = np.array([np.float64(-1.0e31)])
90
+
91
+ # Act
92
+ single_de._decompress_data()
93
+
94
+ # Assert
95
+ np.testing.assert_array_equal(single_de.DE_TIME, expected_time)
96
+ np.testing.assert_array_equal(single_de.ESA_STEP, expected_energy)
97
+ np.testing.assert_array_equal(single_de.MODE, expected_mode)
98
+ np.testing.assert_array_equal(single_de.TOF0, expected_tof0)
99
+ np.testing.assert_array_equal(single_de.TOF1, expected_tof1)
100
+ np.testing.assert_array_equal(single_de.TOF2, expected_tof2)
101
+ np.testing.assert_array_equal(single_de.TOF3, expected_tof3)
102
+ np.testing.assert_array_equal(single_de.CKSM, expected_cksm)
103
+ np.testing.assert_array_equal(single_de.POS, expected_pos)
104
+
105
+
106
+ def test_parse_data_case_10(single_de):
107
+ # Arrange
108
+ absent = "1010" # case 10
109
+ time = "000001100100" # 100
110
+ energy = "010" # 2
111
+ mode = "1"
112
+ # TOF0 not transmitted
113
+ tof1 = "000000001" # 1
114
+ # TOF2, TOF3, CKSM not transmitted
115
+ pos = "00" # 0
116
+ single_de.DATA = absent + time + energy + mode + tof1 + pos
117
+
118
+ expected_time = np.array([100])
119
+ expected_energy = np.array([2])
120
+ expected_mode = np.array([1])
121
+ expected_tof0 = np.array([np.float64(-1.0e31)])
122
+ # tofs and cksm are bit shifted to the left by 1 during decompression
123
+ expected_tof1 = np.array([1 << 1])
124
+ expected_tof2 = np.array([np.float64(-1.0e31)])
125
+ expected_tof3 = np.array([np.float64(-1.0e31)])
126
+ expected_cksm = np.array([np.float64(-1.0e31)])
127
+ expected_pos = np.array([0])
128
+
129
+ # Act
130
+ single_de._decompress_data()
131
+
132
+ # Assert
133
+ np.testing.assert_array_equal(single_de.DE_TIME, expected_time)
134
+ np.testing.assert_array_equal(single_de.ESA_STEP, expected_energy)
135
+ np.testing.assert_array_equal(single_de.MODE, expected_mode)
136
+ np.testing.assert_array_equal(single_de.TOF0, expected_tof0)
137
+ np.testing.assert_array_equal(single_de.TOF1, expected_tof1)
138
+ np.testing.assert_array_equal(single_de.TOF2, expected_tof2)
139
+ np.testing.assert_array_equal(single_de.TOF3, expected_tof3)
140
+ np.testing.assert_array_equal(single_de.CKSM, expected_cksm)
141
+ np.testing.assert_array_equal(single_de.POS, expected_pos)
142
+
143
+
144
+ def test_decompress_data_multi_de(multi_de):
145
+ # Arrange
146
+
147
+ # DE One
148
+ absent_1 = "0000" # case 0
149
+ time_1 = "000001100100" # 100
150
+ energy_1 = "010" # 2
151
+ mode_1 = "1"
152
+ tof0_1 = "0000000000"
153
+ # TOF1 not transmitted
154
+ tof2_1 = "000000010" # 2
155
+ tof3_1 = "000011" # 3
156
+ cksm_1 = "000" # 0
157
+ # POS not transmitted
158
+
159
+ # DE Two
160
+ absent_2 = "1010" # case 10
161
+ time_2 = "000001100100" # 100
162
+ energy_2 = "010" # 2
163
+ mode_2 = "1"
164
+ # TOF0 not transmitted
165
+ tof1_2 = "000000001" # 1
166
+ # TOF2, TOF3, CKSM not transmitted
167
+ pos_2 = "00" # 0
168
+
169
+ multi_de.DATA = (
170
+ absent_1
171
+ + time_1
172
+ + energy_1
173
+ + mode_1
174
+ + tof0_1
175
+ + tof2_1
176
+ + tof3_1
177
+ + cksm_1
178
+ + absent_2
179
+ + time_2
180
+ + energy_2
181
+ + mode_2
182
+ + tof1_2
183
+ + pos_2
184
+ )
185
+
186
+ expected_time = np.array([100, 100])
187
+ expected_energy = np.array([2, 2])
188
+ expected_mode = np.array([1, 1])
189
+ # tofs and cksm are bit shifted to the left by 1 during decompression
190
+ expected_tof0 = np.array([0 << 1, np.float64(-1.0e31)])
191
+ expected_tof1 = np.array([np.float64(-1.0e31), 1 << 1])
192
+ expected_tof2 = np.array([2 << 1, np.float64(-1.0e31)])
193
+ expected_tof3 = np.array([3 << 1, np.float64(-1.0e31)])
194
+ expected_cksm = np.array([0 << 1, np.float64(-1.0e31)])
195
+ expected_pos = np.array([np.float64(-1.0e31), 0])
196
+
197
+ # Act
198
+ multi_de._decompress_data()
199
+
200
+ # Assert
201
+ np.testing.assert_array_equal(multi_de.DE_TIME, expected_time)
202
+ np.testing.assert_array_equal(multi_de.ESA_STEP, expected_energy)
203
+ np.testing.assert_array_equal(multi_de.MODE, expected_mode)
204
+ np.testing.assert_array_equal(multi_de.TOF0, expected_tof0)
205
+ np.testing.assert_array_equal(multi_de.TOF1, expected_tof1)
206
+ np.testing.assert_array_equal(multi_de.TOF2, expected_tof2)
207
+ np.testing.assert_array_equal(multi_de.TOF3, expected_tof3)
208
+ np.testing.assert_array_equal(multi_de.CKSM, expected_cksm)
209
+ np.testing.assert_array_equal(multi_de.POS, expected_pos)