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,59 @@
1
+ """Calculate Annotated Direct Events."""
2
+
3
+ import numpy as np
4
+ import xarray as xr
5
+
6
+ from imap_processing.ultra.utils.ultra_l1_utils import create_dataset
7
+
8
+
9
+ def calculate_de(de_dataset: xr.Dataset, name: str) -> xr.Dataset:
10
+ """
11
+ Create dataset with defined datatypes for Direct Event Data.
12
+
13
+ Parameters
14
+ ----------
15
+ de_dataset : xarray.Dataset
16
+ Dataset containing direct event data.
17
+ name : str
18
+ Name of the dataset.
19
+
20
+ Returns
21
+ -------
22
+ dataset : xarray.Dataset
23
+ Dataset containing the data.
24
+ """
25
+ de_dict = {}
26
+
27
+ # Placeholder for calculations
28
+ epoch = de_dataset.coords["epoch"].values
29
+
30
+ de_dict["epoch"] = de_dataset["epoch"]
31
+ de_dict["x_front"] = np.zeros(len(epoch), dtype=np.float64)
32
+ de_dict["y_front"] = np.zeros(len(epoch), dtype=np.float64)
33
+ de_dict["x_back"] = np.zeros(len(epoch), dtype=np.float64)
34
+ de_dict["y_back"] = np.zeros(len(epoch), dtype=np.float64)
35
+ de_dict["x_coin"] = np.zeros(len(epoch), dtype=np.float64)
36
+ de_dict["tof_start_stop"] = np.zeros(len(epoch), dtype=np.float64)
37
+ de_dict["tof_stop_coin"] = np.zeros(len(epoch), dtype=np.float64)
38
+ de_dict["tof_corrected"] = np.zeros(len(epoch), dtype=np.float64)
39
+ de_dict["eventtype"] = np.zeros(len(epoch), dtype=np.uint64)
40
+ de_dict["vx_ultra"] = np.zeros(len(epoch), dtype=np.float64)
41
+ de_dict["vy_ultra"] = np.zeros(len(epoch), dtype=np.float64)
42
+ de_dict["vz_ultra"] = np.zeros(len(epoch), dtype=np.float64)
43
+ de_dict["energy"] = np.zeros(len(epoch), dtype=np.float64)
44
+ de_dict["species"] = np.zeros(len(epoch), dtype=np.uint64)
45
+ de_dict["event_efficiency"] = np.zeros(len(epoch), dtype=np.float64)
46
+ de_dict["vx_sc"] = np.zeros(len(epoch), dtype=np.float64)
47
+ de_dict["vy_sc"] = np.zeros(len(epoch), dtype=np.float64)
48
+ de_dict["vz_sc"] = np.zeros(len(epoch), dtype=np.float64)
49
+ de_dict["vx_dps_sc"] = np.zeros(len(epoch), dtype=np.float64)
50
+ de_dict["vy_dps_sc"] = np.zeros(len(epoch), dtype=np.float64)
51
+ de_dict["vz_dps_sc"] = np.zeros(len(epoch), dtype=np.float64)
52
+ de_dict["vx_dps_helio"] = np.zeros(len(epoch), dtype=np.float64)
53
+ de_dict["vy_dps_helio"] = np.zeros(len(epoch), dtype=np.float64)
54
+ de_dict["vz_dps_helio"] = np.zeros(len(epoch), dtype=np.float64)
55
+ de_dict["eventtimes"] = np.zeros(len(epoch), dtype=np.float64)
56
+
57
+ dataset = create_dataset(de_dict, name, "l1b")
58
+
59
+ return dataset
@@ -0,0 +1,45 @@
1
+ """Calculate Extended Spin."""
2
+
3
+ import numpy as np
4
+ import xarray as xr
5
+
6
+ from imap_processing.ultra.utils.ultra_l1_utils import create_dataset
7
+
8
+
9
+ def calculate_extendedspin(rates_dataset: xr.Dataset, name: str) -> xr.Dataset:
10
+ """
11
+ Create dataset with defined datatypes for Extended Spin Data.
12
+
13
+ Parameters
14
+ ----------
15
+ rates_dataset : xarray.Dataset
16
+ Dataset containing rates data.
17
+ name : str
18
+ Name of the dataset.
19
+
20
+ Returns
21
+ -------
22
+ extendedspin_dataset : xarray.Dataset
23
+ Dataset containing the data.
24
+ """
25
+ extendedspin_dict = {}
26
+
27
+ epoch = rates_dataset.coords["epoch"].values
28
+
29
+ # Placeholder for calculations
30
+ extendedspin_dict["epoch"] = epoch
31
+ extendedspin_dict["spin_number"] = np.zeros(len(epoch), dtype=np.uint64)
32
+ extendedspin_dict["spin_start_time"] = np.zeros(len(epoch), dtype=np.float64)
33
+ extendedspin_dict["avg_spin_period"] = np.zeros(len(epoch), dtype=np.float64)
34
+ extendedspin_dict["rate_start_pulses"] = np.zeros(len(epoch), dtype=np.float64)
35
+ extendedspin_dict["rate_stop_pulses"] = np.zeros(len(epoch), dtype=np.float64)
36
+ extendedspin_dict["rate_coin_pulses"] = np.zeros(len(epoch), dtype=np.float64)
37
+ extendedspin_dict["rate_processed_events"] = np.zeros(len(epoch), dtype=np.float64)
38
+ extendedspin_dict["rate_rejected_events"] = np.zeros(len(epoch), dtype=np.float64)
39
+ extendedspin_dict["quality_hk"] = np.zeros(len(epoch), dtype=np.uint16)
40
+ extendedspin_dict["quality_attitude"] = np.zeros(len(epoch), dtype=np.uint16)
41
+ extendedspin_dict["quality_instruments"] = np.zeros(len(epoch), dtype=np.uint16)
42
+
43
+ extendedspin_dataset = create_dataset(extendedspin_dict, name, "l1b")
44
+
45
+ return extendedspin_dataset
@@ -0,0 +1,165 @@
1
+ """Contains tools for lookup tables for l1b."""
2
+
3
+ import numpy as np
4
+ import numpy.typing as npt
5
+ import pandas as pd
6
+ import xarray as xr
7
+
8
+ from imap_processing import imap_module_directory
9
+
10
+ BASE_PATH = imap_module_directory / "ultra" / "lookup_tables"
11
+
12
+ _YADJUST_DF = pd.read_csv(BASE_PATH / "yadjust.csv").set_index("dYLUT")
13
+ _TDC_NORM_DF_ULTRA45 = pd.read_csv(
14
+ BASE_PATH / "ultra45_tdc_norm.csv", header=1, index_col="Index"
15
+ )
16
+ _TDC_NORM_DF_ULTRA90 = pd.read_csv(
17
+ BASE_PATH / "ultra90_tdc_norm.csv", header=1, index_col="Index"
18
+ )
19
+ _BACK_POS_DF_ULTRA45 = pd.read_csv(
20
+ BASE_PATH / "ultra45_back-pos-luts.csv", index_col="Index_offset"
21
+ )
22
+ _BACK_POS_DF_ULTRA90 = pd.read_csv(
23
+ BASE_PATH / "ultra90_back-pos-luts.csv", index_col="Index_offset"
24
+ )
25
+ _ENERGY_NORM_DF = pd.read_csv(BASE_PATH / "EgyNorm.mem.csv")
26
+ _IMAGE_PARAMS_DF = pd.read_csv(BASE_PATH / "FM45_Startup1_ULTRA_IMGPARAMS_20240719.csv")
27
+
28
+
29
+ def get_y_adjust(dy_lut: np.ndarray) -> npt.NDArray:
30
+ """
31
+ Adjust the front yf position based on the particle's trajectory.
32
+
33
+ Instead of using trigonometry, this function utilizes a 256-element lookup table
34
+ to find the Y adjustment. For more details, refer to pages 37-38 of the
35
+ IMAP-Ultra Flight Software Specification document (7523-9009_Rev_-.pdf).
36
+
37
+ Parameters
38
+ ----------
39
+ dy_lut : np.ndarray
40
+ Change in y direction used for the lookup table (mm).
41
+
42
+ Returns
43
+ -------
44
+ yadj : np.ndarray
45
+ Y adjustment (mm).
46
+ """
47
+ return _YADJUST_DF["dYAdj"].iloc[dy_lut].values
48
+
49
+
50
+ def get_norm(dn: xr.DataArray, key: str, file_label: str) -> npt.NDArray:
51
+ """
52
+ Correct mismatches between the stop Time to Digital Converters (TDCs).
53
+
54
+ There are mismatches between the stop TDCs, i.e., SpN, SpS, SpE, and SpW.
55
+ Before these can be used, they must be corrected, or normalized,
56
+ using lookup tables.
57
+
58
+ Further description is available on pages 31-32 of the IMAP-Ultra Flight Software
59
+ Specification document (7523-9009_Rev_-.pdf). This will work for both Tp{key}Norm,
60
+ Bt{key}Norm. This is for getStopNorm and getCoinNorm.
61
+
62
+ Parameters
63
+ ----------
64
+ dn : np.ndarray
65
+ DN of the TDC.
66
+ key : str
67
+ TpSpNNorm, TpSpSNorm, TpSpENorm, or TpSpWNorm.
68
+ BtSpNNorm, BtSpSNorm, BtSpENorm, or BtSpWNorm.
69
+ file_label : str
70
+ Instrument (ultra45 or ultra90).
71
+
72
+ Returns
73
+ -------
74
+ dn_norm : np.ndarray
75
+ Normalized DNs.
76
+ """
77
+ if file_label == "ultra45":
78
+ tdc_norm_df = _TDC_NORM_DF_ULTRA45
79
+ else:
80
+ tdc_norm_df = _TDC_NORM_DF_ULTRA90
81
+
82
+ dn_norm = tdc_norm_df[key].iloc[dn].values
83
+
84
+ return dn_norm
85
+
86
+
87
+ def get_back_position(back_index: np.ndarray, key: str, file_label: str) -> npt.NDArray:
88
+ """
89
+ Convert normalized TDC values using lookup tables.
90
+
91
+ The anodes behave non-linearly near their edges; thus, the use of lookup tables
92
+ instead of linear equations is necessary. The computation will use different
93
+ tables to accommodate variations between the top and bottom anodes.
94
+ Further description is available on page 32 of the
95
+ IMAP-Ultra Flight Software Specification document (7523-9009_Rev_-.pdf).
96
+
97
+ Parameters
98
+ ----------
99
+ back_index : np.ndarray
100
+ Options include SpSNorm - SpNNorm + 2047, SpENorm - SpWNorm + 2047,
101
+ SpSNorm - SpNNorm + 2047, or SpENorm - SpWNorm + 2047.
102
+ key : str
103
+ XBkTp, YBkTp, XBkBt, or YBkBt.
104
+ file_label : str
105
+ Instrument (ultra45 or ultra90).
106
+
107
+ Returns
108
+ -------
109
+ dn_converted : np.ndarray
110
+ Converted DNs to Units of hundredths of a millimeter.
111
+ """
112
+ if file_label == "ultra45":
113
+ back_pos_df = _BACK_POS_DF_ULTRA45
114
+ else:
115
+ back_pos_df = _BACK_POS_DF_ULTRA90
116
+
117
+ return back_pos_df[key].values[back_index]
118
+
119
+
120
+ def get_energy_norm(ssd: np.ndarray, composite_energy: np.ndarray) -> npt.NDArray:
121
+ """
122
+ Normalize composite energy per SSD using a lookup table.
123
+
124
+ Further description is available on page 41 of the
125
+ IMAP-Ultra Flight Software Specification document
126
+ (7523-9009_Rev_-.pdf). Note : There are 8 SSDs containing
127
+ 4096 composite energies each.
128
+
129
+ Parameters
130
+ ----------
131
+ ssd : np.ndarray
132
+ Acts as index 1.
133
+ composite_energy : np.ndarray
134
+ Acts as index 2.
135
+
136
+ Returns
137
+ -------
138
+ norm_composite_energy : np.ndarray
139
+ Normalized composite energy.
140
+ """
141
+ row_number = ssd * 4096 + composite_energy
142
+
143
+ return _ENERGY_NORM_DF["NormEnergy"].iloc[row_number]
144
+
145
+
146
+ def get_image_params(image: str) -> np.float64:
147
+ """
148
+ Lookup table for image parameters.
149
+
150
+ Further description is available starting on
151
+ page 30 of the IMAP-Ultra Flight Software
152
+ Specification document (7523-9009_Rev_-.pdf).
153
+
154
+ Parameters
155
+ ----------
156
+ image : str
157
+ The column name to lookup in the CSV file, e.g., 'XFTLTOFF' or 'XFTRTOFF'.
158
+
159
+ Returns
160
+ -------
161
+ value : np.float64
162
+ Image parameter value from the CSV file.
163
+ """
164
+ value: np.float64 = _IMAGE_PARAMS_DF[image].values[0]
165
+ return value
@@ -0,0 +1,65 @@
1
+ """Calculate ULTRA L1b."""
2
+
3
+ import xarray as xr
4
+
5
+ from imap_processing.ultra.l1b.badtimes import calculate_badtimes
6
+ from imap_processing.ultra.l1b.cullingmask import calculate_cullingmask
7
+ from imap_processing.ultra.l1b.de import calculate_de
8
+ from imap_processing.ultra.l1b.extendedspin import calculate_extendedspin
9
+
10
+
11
+ def ultra_l1b(data_dict: dict, data_version: str) -> list[xr.Dataset]:
12
+ """
13
+ Will process ULTRA L1A data into L1B CDF files at output_filepath.
14
+
15
+ Parameters
16
+ ----------
17
+ data_dict : dict
18
+ The data itself and its dependent data.
19
+ data_version : str
20
+ Version of the data product being created.
21
+
22
+ Returns
23
+ -------
24
+ output_datasets : list[xarray.Dataset]
25
+ List of xarray.Dataset.
26
+ """
27
+ output_datasets = []
28
+ instrument_id = 45 if any("45" in key for key in data_dict.keys()) else 90
29
+
30
+ if f"imap_ultra_l1a_{instrument_id}sensor-rates" in data_dict:
31
+ extendedspin_dataset = calculate_extendedspin(
32
+ data_dict[f"imap_ultra_l1a_{instrument_id}sensor-rates"],
33
+ f"imap_ultra_l1b_{instrument_id}sensor-extendedspin",
34
+ )
35
+ # TODO: move these to use ImapCdfAttributes().add_global_attribute()
36
+ extendedspin_dataset.attrs["Data_version"] = data_version
37
+
38
+ cullingmask_dataset = calculate_cullingmask(
39
+ extendedspin_dataset, f"imap_ultra_l1b_{instrument_id}sensor-cullingmask"
40
+ )
41
+ cullingmask_dataset.attrs["Data_version"] = data_version
42
+
43
+ badtimes_dataset = calculate_badtimes(
44
+ extendedspin_dataset, f"imap_ultra_l1b_{instrument_id}sensor-badtimes"
45
+ )
46
+ badtimes_dataset.attrs["Data_version"] = data_version
47
+
48
+ output_datasets.extend(
49
+ [extendedspin_dataset, cullingmask_dataset, badtimes_dataset]
50
+ )
51
+ elif (
52
+ f"imap_ultra_l1a_{instrument_id}sensor-aux" in data_dict
53
+ and f"imap_ultra_l1a_{instrument_id}sensor-de" in data_dict
54
+ ):
55
+ de_dataset = calculate_de(
56
+ data_dict[f"imap_ultra_l1a_{instrument_id}sensor-de"],
57
+ f"imap_ultra_l1b_{instrument_id}sensor-de",
58
+ )
59
+ de_dataset.attrs["Data_version"] = data_version
60
+
61
+ output_datasets.append(de_dataset)
62
+ else:
63
+ raise ValueError("Data dictionary does not contain the expected keys.")
64
+
65
+ return output_datasets
@@ -0,0 +1,54 @@
1
+ """Calculates Annotated Events for ULTRA L1b."""
2
+
3
+ import typing
4
+
5
+ import numpy as np
6
+ import spiceypy as spice
7
+ from numpy.typing import NDArray
8
+
9
+ from imap_processing.spice.geometry import SpiceFrame
10
+ from imap_processing.spice.kernels import ensure_spice
11
+
12
+
13
+ @ensure_spice
14
+ @typing.no_type_check
15
+ def get_particle_velocity(
16
+ time: np.ndarray,
17
+ instrument_velocity: np.ndarray,
18
+ instrument_frame: SpiceFrame,
19
+ pointing_frame: SpiceFrame,
20
+ ) -> NDArray[np.float64]:
21
+ """
22
+ Get the particle velocity in the pointing (DPS) frame wrt the spacecraft.
23
+
24
+ Parameters
25
+ ----------
26
+ time : np.ndarray
27
+ Ephemeris time.
28
+ instrument_velocity : np.ndarray
29
+ Particle velocity in the instrument frame.
30
+ instrument_frame : SpiceFrame
31
+ Instrument frame.
32
+ pointing_frame : SpiceFrame
33
+ Pointing frame.
34
+
35
+ Returns
36
+ -------
37
+ spacecraft_velocity : np.ndarray
38
+ Particle velocity in the spacecraft frame.
39
+
40
+ References
41
+ ----------
42
+ https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy
43
+ """
44
+ # Particle velocity in the pointing (DPS) frame wrt spacecraft.
45
+ spacecraft_velocity = np.zeros((len(time), 3), dtype=np.float64)
46
+
47
+ for index in range(len(time)):
48
+ # Get and apply the rotation matrix to the particle velocity.
49
+ spacecraft_velocity[index] = spice.mxv(
50
+ spice.pxform(instrument_frame.name, pointing_frame.name, time[index]),
51
+ instrument_velocity[index],
52
+ )
53
+
54
+ return spacecraft_velocity