imap-processing 1.0.27__tar.gz → 1.0.29__tar.gz

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 (294) hide show
  1. {imap_processing-1.0.27 → imap_processing-1.0.29}/PKG-INFO +1 -1
  2. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/_version.py +2 -2
  3. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +48 -0
  4. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cli.py +31 -4
  5. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_hi_sectored.py +6 -0
  6. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l2.py +10 -0
  7. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ena_maps/ena_maps.py +12 -2
  8. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/l2/glows_l2.py +1 -1
  9. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/l2/glows_l2_data.py +103 -10
  10. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hi/hi_l1c.py +223 -24
  11. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hi/utils.py +194 -53
  12. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/generate_coverage.py +1 -68
  13. imap_processing-1.0.29/imap_processing/ialirt/l0/process_status.py +77 -0
  14. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/constants.py +32 -2
  15. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1b/extendedspin.py +58 -4
  16. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1b/goodtimes.py +9 -0
  17. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1b/quality_flag_filters.py +3 -0
  18. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1b/ultra_l1b.py +23 -4
  19. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1b/ultra_l1b_culling.py +143 -3
  20. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/helio_pset.py +30 -19
  21. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/l1c_lookup_utils.py +109 -26
  22. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/spacecraft_pset.py +31 -17
  23. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/ultra_l1c.py +5 -0
  24. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +1 -1
  25. {imap_processing-1.0.27 → imap_processing-1.0.29}/pyproject.toml +1 -1
  26. {imap_processing-1.0.27 → imap_processing-1.0.29}/LICENSE +0 -0
  27. {imap_processing-1.0.27 → imap_processing-1.0.29}/README.md +0 -0
  28. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/__init__.py +0 -0
  29. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ancillary/__init__.py +0 -0
  30. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ancillary/ancillary_dataset_combiner.py +0 -0
  31. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ccsds/__init__.py +0 -0
  32. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ccsds/ccsds_data.py +0 -0
  33. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ccsds/excel_to_xtce.py +0 -0
  34. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/__init__.py +0 -0
  35. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +0 -0
  36. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +0 -0
  37. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_codice_l2-hi-direct-events_variable_attrs.yaml +0 -0
  38. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_codice_l2-hi-omni_variable_attrs.yaml +0 -0
  39. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_codice_l2-hi-sectored_variable_attrs.yaml +0 -0
  40. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_codice_l2-lo-angular_variable_attrs.yaml +0 -0
  41. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_codice_l2-lo-direct-events_variable_attrs.yaml +0 -0
  42. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_codice_l2-lo-species_variable_attrs.yaml +0 -0
  43. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_constant_attrs.yaml +0 -0
  44. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_default_global_cdf_attrs.yaml +0 -0
  45. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_enamaps_l2-common_variable_attrs.yaml +0 -0
  46. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_enamaps_l2-healpix_variable_attrs.yaml +0 -0
  47. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_enamaps_l2-rectangular_variable_attrs.yaml +0 -0
  48. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +0 -0
  49. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_glows_l1a_variable_attrs.yaml +0 -0
  50. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_glows_l1b_variable_attrs.yaml +0 -0
  51. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_glows_l2_variable_attrs.yaml +0 -0
  52. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +0 -0
  53. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_hi_variable_attrs.yaml +0 -0
  54. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +0 -0
  55. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +0 -0
  56. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +0 -0
  57. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +0 -0
  58. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_ialirt_global_cdf_attrs.yaml +0 -0
  59. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_ialirt_l1_variable_attrs.yaml +0 -0
  60. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +0 -0
  61. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +0 -0
  62. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +0 -0
  63. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_idex_l2a_variable_attrs.yaml +0 -0
  64. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_idex_l2b_variable_attrs.yaml +0 -0
  65. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_idex_l2c_variable_attrs.yaml +0 -0
  66. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +0 -0
  67. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +0 -0
  68. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_lo_l1b_variable_attrs.yaml +0 -0
  69. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_lo_l1c_variable_attrs.yaml +0 -0
  70. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +0 -0
  71. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_mag_l1a_variable_attrs.yaml +0 -0
  72. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_mag_l1b_variable_attrs.yaml +0 -0
  73. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +0 -0
  74. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_mag_l2_variable_attrs.yaml +0 -0
  75. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_spacecraft_global_cdf_attrs.yaml +0 -0
  76. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_spacecraft_variable_attrs.yaml +0 -0
  77. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +0 -0
  78. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +0 -0
  79. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +0 -0
  80. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +0 -0
  81. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +0 -0
  82. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +0 -0
  83. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +0 -0
  84. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +0 -0
  85. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +0 -0
  86. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/config/imap_variable_schema.yaml +0 -0
  87. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/imap_cdf_manager.py +0 -0
  88. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/cdf/utils.py +0 -0
  89. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/__init__.py +0 -0
  90. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a.py +0 -0
  91. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_de.py +0 -0
  92. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_hi_counters_aggregated.py +0 -0
  93. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_hi_counters_singles.py +0 -0
  94. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_hi_omni.py +0 -0
  95. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_hi_priority.py +0 -0
  96. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_ialirt_hi.py +0 -0
  97. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_lo_angular.py +0 -0
  98. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_lo_counters_aggregated.py +0 -0
  99. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_lo_counters_singles.py +0 -0
  100. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_lo_priority.py +0 -0
  101. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1a_lo_species.py +0 -0
  102. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/codice_l1b.py +0 -0
  103. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/constants.py +0 -0
  104. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/data/esa_sweep_values.csv +0 -0
  105. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/data/lo_stepping_values.csv +0 -0
  106. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/decompress.py +0 -0
  107. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/packet_definitions/P_COD_NHK.xml +0 -0
  108. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/packet_definitions/imap_codice_packet-definition_20250101_v001.xml +0 -0
  109. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/packet_definitions/imap_codice_packet-definition_20260129_v001.xml +0 -0
  110. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/codice/utils.py +0 -0
  111. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ena_maps/__init__.py +0 -0
  112. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ena_maps/utils/__init__.py +0 -0
  113. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ena_maps/utils/coordinates.py +0 -0
  114. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ena_maps/utils/corrections.py +0 -0
  115. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ena_maps/utils/map_utils.py +0 -0
  116. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ena_maps/utils/naming.py +0 -0
  117. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ena_maps/utils/spatial_utils.py +0 -0
  118. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/__init__.py +0 -0
  119. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/ancillary/imap_glows_exclusions-by-instr-team_20250923_v002.dat +0 -0
  120. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/ancillary/imap_glows_map-of-excluded-regions_20250923_v002.dat +0 -0
  121. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/ancillary/imap_glows_map-of-uv-sources_20250923_v002.dat +0 -0
  122. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/ancillary/imap_glows_pipeline-settings_20250923_v002.json +0 -0
  123. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/ancillary/imap_glows_pipeline_settings_v001.json +0 -0
  124. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/ancillary/imap_glows_suspected-transients_20250923_v002.dat +0 -0
  125. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/ancillary/l1b_conversion_table_v001.json +0 -0
  126. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/l0/__init__.py +0 -0
  127. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/l0/decom_glows.py +0 -0
  128. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/l0/glows_l0_data.py +0 -0
  129. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/l1a/glows_l1a.py +0 -0
  130. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/l1a/glows_l1a_data.py +0 -0
  131. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/l1b/glows_l1b.py +0 -0
  132. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/l1b/glows_l1b_data.py +0 -0
  133. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/packet_definitions/GLX_COMBINED.xml +0 -0
  134. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/packet_definitions/P_GLX_TMSCDE.xml +0 -0
  135. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/packet_definitions/P_GLX_TMSCHIST.xml +0 -0
  136. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/utils/__init__.py +0 -0
  137. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/glows/utils/constants.py +0 -0
  138. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hi/__init__.py +0 -0
  139. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hi/hi_goodtimes.py +0 -0
  140. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hi/hi_l1a.py +0 -0
  141. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hi/hi_l1b.py +0 -0
  142. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hi/hi_l2.py +0 -0
  143. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hi/packet_definitions/TLM_HI_COMBINED_SCI.xml +0 -0
  144. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hi/packet_definitions/__init__.py +0 -0
  145. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/__init__.py +0 -0
  146. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/hit_utils.py +0 -0
  147. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/l0/__init__.py +0 -0
  148. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/l0/constants.py +0 -0
  149. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/l0/decom_hit.py +0 -0
  150. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/l1a/__init__.py +0 -0
  151. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/l1a/hit_l1a.py +0 -0
  152. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/l1b/constants.py +0 -0
  153. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/l1b/hit_l1b.py +0 -0
  154. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/l2/constants.py +0 -0
  155. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/l2/hit_l2.py +0 -0
  156. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/hit/packet_definitions/hit_packet_definitions.xml +0 -0
  157. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/__init__.py +0 -0
  158. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/calculate_ingest.py +0 -0
  159. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/constants.py +0 -0
  160. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/l0/__init__.py +0 -0
  161. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/l0/ialirt_spice.py +0 -0
  162. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/l0/mag_l0_ialirt_data.py +0 -0
  163. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/l0/parse_mag.py +0 -0
  164. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/l0/process_codice.py +0 -0
  165. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/l0/process_hit.py +0 -0
  166. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/l0/process_swapi.py +0 -0
  167. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/l0/process_swe.py +0 -0
  168. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/packet_definitions/__init__.py +0 -0
  169. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/packet_definitions/ialirt.xml +0 -0
  170. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +0 -0
  171. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +0 -0
  172. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/packet_definitions/ialirt_hit.xml +0 -0
  173. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/packet_definitions/ialirt_mag.xml +0 -0
  174. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +0 -0
  175. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/packet_definitions/ialirt_swe.xml +0 -0
  176. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/process_ephemeris.py +0 -0
  177. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/utils/constants.py +0 -0
  178. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/utils/create_xarray.py +0 -0
  179. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/utils/grouping.py +0 -0
  180. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ialirt/utils/time.py +0 -0
  181. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/__init__.py +0 -0
  182. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/atomic_masses.csv +0 -0
  183. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/decode.py +0 -0
  184. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/evt_msg_decode_utils.py +0 -0
  185. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/idex_constants.py +0 -0
  186. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/idex_evt_msg_parsing_dictionaries.json +0 -0
  187. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/idex_l0.py +0 -0
  188. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/idex_l1a.py +0 -0
  189. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/idex_l1b.py +0 -0
  190. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/idex_l2a.py +0 -0
  191. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/idex_l2b.py +0 -0
  192. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/idex_utils.py +0 -0
  193. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +0 -0
  194. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/packet_definitions/idex_housekeeping_packet_definition.xml +0 -0
  195. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/idex/packet_definitions/idex_science_packet_definition.xml +0 -0
  196. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/__init__.py +0 -0
  197. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/ancillary_data/imap_lo_hydrogen-geometric-factor_v001.csv +0 -0
  198. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/ancillary_data/imap_lo_oxygen-geometric-factor_v001.csv +0 -0
  199. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l0/__init__.py +0 -0
  200. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l0/decompression_tables/decompression_tables.py +0 -0
  201. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l0/decompression_tables/log10_12_to_16_bit_uncompress.csv +0 -0
  202. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l0/decompression_tables/log10_8_to_12_bit_uncompress.csv +0 -0
  203. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l0/decompression_tables/log10_8_to_16_bit_uncompress.csv +0 -0
  204. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l0/lo_apid.py +0 -0
  205. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l0/lo_science.py +0 -0
  206. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l0/lo_star_sensor.py +0 -0
  207. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l0/utils/binary_string.py +0 -0
  208. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l0/utils/bit_decompression.py +0 -0
  209. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l1a/__init__.py +0 -0
  210. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l1a/lo_l1a.py +0 -0
  211. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l1b/lo_l1b.py +0 -0
  212. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l1b/tof_conversions.py +0 -0
  213. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l1c/lo_l1c.py +0 -0
  214. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/l2/lo_l2.py +0 -0
  215. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/lo_ancillary.py +0 -0
  216. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/lo/packet_definitions/lo_xtce.xml +0 -0
  217. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/__init__.py +0 -0
  218. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/constants.py +0 -0
  219. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/imap_mag_sdc_configuration_v001.py +0 -0
  220. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l0/decom_mag.py +0 -0
  221. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l0/mag_l0_data.py +0 -0
  222. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l1a/mag_l1a.py +0 -0
  223. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l1a/mag_l1a_data.py +0 -0
  224. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l1b/imap_mag_l1b-calibration_20240229_v002.cdf +0 -0
  225. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l1b/mag_l1b.py +0 -0
  226. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l1c/interpolation_methods.py +0 -0
  227. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l1c/mag_l1c.py +0 -0
  228. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l1d/__init__.py +0 -0
  229. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l1d/mag_l1d.py +0 -0
  230. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l1d/mag_l1d_data.py +0 -0
  231. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l2/__init__.py +0 -0
  232. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l2/mag_l2.py +0 -0
  233. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/l2/mag_l2_data.py +0 -0
  234. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/mag/packet_definitions/MAG_SCI_COMBINED.xml +0 -0
  235. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/quality_flags.py +0 -0
  236. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/spacecraft/packet_definitions/scid_x252.xml +0 -0
  237. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/spacecraft/quaternions.py +0 -0
  238. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/spice/__init__.py +0 -0
  239. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/spice/config.py +0 -0
  240. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/spice/geometry.py +0 -0
  241. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/spice/pointing_frame.py +0 -0
  242. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/spice/repoint.py +0 -0
  243. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/spice/spin.py +0 -0
  244. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/spice/time.py +0 -0
  245. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swapi/__init__.py +0 -0
  246. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swapi/constants.py +0 -0
  247. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swapi/l1/__init__.py +0 -0
  248. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swapi/l1/swapi_l1.py +0 -0
  249. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swapi/l2/__init__.py +0 -0
  250. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swapi/l2/swapi_l2.py +0 -0
  251. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swapi/packet_definitions/__init__.py +0 -0
  252. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swapi/packet_definitions/swapi_packet_definition.xml +0 -0
  253. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swapi/swapi_utils.py +0 -0
  254. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/__init__.py +0 -0
  255. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/l1a/__init__.py +0 -0
  256. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/l1a/swe_l1a.py +0 -0
  257. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/l1a/swe_science.py +0 -0
  258. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/l1b/swe_l1b.py +0 -0
  259. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/l2/swe_l2.py +0 -0
  260. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/packet_definitions/__init__.py +0 -0
  261. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/packet_definitions/swe_packet_definition.xml +0 -0
  262. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/utils/__init__.py +0 -0
  263. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/utils/swe_constants.py +0 -0
  264. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/swe/utils/swe_utils.py +0 -0
  265. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/__init__.py +0 -0
  266. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l0/__init__.py +0 -0
  267. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l0/decom_tools.py +0 -0
  268. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l0/decom_ultra.py +0 -0
  269. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l0/ultra_utils.py +0 -0
  270. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1a/__init__.py +0 -0
  271. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1a/ultra_l1a.py +0 -0
  272. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1b/badtimes.py +0 -0
  273. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1b/de.py +0 -0
  274. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1b/lookup_utils.py +0 -0
  275. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1b/ultra_l1b_annotated.py +0 -0
  276. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1b/ultra_l1b_extended.py +0 -0
  277. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/make_helio_index_maps.py +0 -0
  278. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/sim_spice_kernels/imap_001.tf +0 -0
  279. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/sim_spice_kernels/imap_science_100.tf +0 -0
  280. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/sim_spice_kernels/imap_science_120.tf +0 -0
  281. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/sim_spice_kernels/imap_sclk_0000.tsc +0 -0
  282. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/sim_spice_kernels/imap_spk_demo.bsp +0 -0
  283. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/sim_spice_kernels/naif0012.tls +0 -0
  284. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/sim_spice_kernels/sim_1yr_imap_attitude.bc +0 -0
  285. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/sim_spice_kernels/sim_1yr_imap_pointing_frame.bc +0 -0
  286. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l1c/ultra_l1c_culling.py +0 -0
  287. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l2/__init__.py +0 -0
  288. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/l2/ultra_l2.py +0 -0
  289. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/packet_definitions/README.md +0 -0
  290. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +0 -0
  291. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/packet_definitions/__init__.py +0 -0
  292. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/utils/__init__.py +0 -0
  293. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/ultra/utils/ultra_l1_utils.py +0 -0
  294. {imap_processing-1.0.27 → imap_processing-1.0.29}/imap_processing/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: imap-processing
3
- Version: 1.0.27
3
+ Version: 1.0.29
4
4
  Summary: IMAP Science Operations Center Processing
5
5
  License: MIT
6
6
  Keywords: IMAP,SDC,SOC,Science Operations
@@ -1,3 +1,3 @@
1
1
  # These version placeholders will be replaced later during substitution.
2
- __version__ = "1.0.27"
3
- __version_tuple__ = (1, 0, 27)
2
+ __version__ = "1.0.29"
3
+ __version_tuple__ = (1, 0, 29)
@@ -212,6 +212,54 @@ imap_ultra_l1b_90sensor-de:
212
212
  Logical_source: imap_ultra_l1b_90sensor-de
213
213
  Logical_source_description: IMAP-Ultra Instrument Level-1B Direct Event Data.
214
214
 
215
+ imap_ultra_l1b_45sensor-priority-1-de:
216
+ <<: *instrument_base
217
+ Data_type: L1B_PRIORITY_1_DE>Level-1B Priority 1 Direct Event
218
+ Logical_source: imap_ultra_l1b_45sensor-priority-1-de
219
+ Logical_source_description: IMAP-Ultra Instrument Level-1B Priority 1 Direct Event Data.
220
+
221
+ imap_ultra_l1b_90sensor-priority-1-de:
222
+ <<: *instrument_base
223
+ Data_type: L1B_PRIORITY_1_DE>Level-1B Priority 1 Direct Event
224
+ Logical_source: imap_ultra_l1b_90sensor-priority-1-de
225
+ Logical_source_description: IMAP-Ultra Instrument Level-1B Priority 1 Direct Event Data.
226
+
227
+ imap_ultra_l1b_45sensor-priority-2-de:
228
+ <<: *instrument_base
229
+ Data_type: L1B_PRIORITY_2_DE>Level-1B Priority 2 Direct Event
230
+ Logical_source: imap_ultra_l1b_45sensor-priority-2-de
231
+ Logical_source_description: IMAP-Ultra Instrument Level-1B Priority 2 Direct Event Data.
232
+
233
+ imap_ultra_l1b_90sensor-priority-2-de:
234
+ <<: *instrument_base
235
+ Data_type: L1B_PRIORITY_2_DE>Level-1B Priority 2 Direct Event
236
+ Logical_source: imap_ultra_l1b_90sensor-priority-2-de
237
+ Logical_source_description: IMAP-Ultra Instrument Level-1B Priority 2 Direct Event Data.
238
+
239
+ imap_ultra_l1b_45sensor-priority-3-de:
240
+ <<: *instrument_base
241
+ Data_type: L1B_PRIORITY_3_DE>Level-1B Priority 3 Direct Event
242
+ Logical_source: imap_ultra_l1b_45sensor-priority-3-de
243
+ Logical_source_description: IMAP-Ultra Instrument Level-1B Priority 3 Direct Event Data.
244
+
245
+ imap_ultra_l1b_90sensor-priority-3-de:
246
+ <<: *instrument_base
247
+ Data_type: L1B_PRIORITY_3_DE>Level-1B Priority 3 Direct Event
248
+ Logical_source: imap_ultra_l1b_90sensor-priority-3-de
249
+ Logical_source_description: IMAP-Ultra Instrument Level-1B Priority 3 Direct Event Data.
250
+
251
+ imap_ultra_l1b_45sensor-priority-4-de:
252
+ <<: *instrument_base
253
+ Data_type: L1B_PRIORITY_4_DE>Level-1B Priority 4 Direct Event
254
+ Logical_source: imap_ultra_l1b_45sensor-priority-4-de
255
+ Logical_source_description: IMAP-Ultra Instrument Level-1B Priority 4 Direct Event Data.
256
+
257
+ imap_ultra_l1b_90sensor-priority-4-de:
258
+ <<: *instrument_base
259
+ Data_type: L1B_PRIORITY_4_DE>Level-1B Priority 4 Direct Event
260
+ Logical_source: imap_ultra_l1b_90sensor-priority-4-de
261
+ Logical_source_description: IMAP-Ultra Instrument Level-1B Priority 4 Direct Event Data.
262
+
215
263
  imap_ultra_l1b_45sensor-extendedspin:
216
264
  <<: *instrument_base
217
265
  Data_type: L1B_45Sensor-ExtendedSpin>Level-1B Extended Spin for Ultra45
@@ -879,11 +879,36 @@ class Hi(ProcessInstrument):
879
879
  f"Expected exactly one DE science dependency. "
880
880
  f"Got {l1b_de_paths}"
881
881
  )
882
- anc_paths = dependencies.get_file_paths(data_type="ancillary")
883
- if len(anc_paths) != 1:
882
+
883
+ # Get ancillary dependencies
884
+ anc_dependencies = dependencies.get_processing_inputs(
885
+ data_type="ancillary"
886
+ )
887
+ if len(anc_dependencies) != 2:
888
+ raise ValueError(
889
+ f"Expected two ancillary dependencies (cal-prod and "
890
+ f"backgrounds). Got "
891
+ f"{[anc_dep.descriptor for anc_dep in anc_dependencies]}"
892
+ )
893
+
894
+ # Create mapping from descriptor to path
895
+ anc_path_dict = {
896
+ dep.descriptor.split("-", 1)[1]: dep.imap_file_paths[
897
+ 0
898
+ ].construct_path()
899
+ for dep in anc_dependencies
900
+ }
901
+
902
+ # Verify we have both required ancillary files
903
+ if (
904
+ "cal-prod" not in anc_path_dict
905
+ or "backgrounds" not in anc_path_dict
906
+ ):
884
907
  raise ValueError(
885
- f"Expected exactly one ancillary dependency. Got {anc_paths}"
908
+ f"Missing required ancillary files. Expected 'cal-prod' and "
909
+ f"'backgrounds', got {list(anc_path_dict.keys())}"
886
910
  )
911
+
887
912
  # Load goodtimes dependency
888
913
  goodtimes_paths = dependencies.get_file_paths(
889
914
  source="hi", data_type="l1b", descriptor="goodtimes"
@@ -893,10 +918,12 @@ class Hi(ProcessInstrument):
893
918
  f"Expected exactly one goodtimes dependency. "
894
919
  f"Got {goodtimes_paths}"
895
920
  )
921
+
896
922
  datasets = hi_l1c.hi_l1c(
897
923
  load_cdf(l1b_de_paths[0]),
898
- anc_paths[0],
924
+ anc_path_dict["cal-prod"],
899
925
  load_cdf(goodtimes_paths[0]),
926
+ anc_path_dict["backgrounds"],
900
927
  )
901
928
  elif self.data_level == "l2":
902
929
  science_paths = dependencies.get_file_paths(source="hi", data_type="l1c")
@@ -234,7 +234,13 @@ def l1a_hi_sectored(unpacked_dataset: xr.Dataset, lut_file: Path) -> xr.Dataset:
234
234
 
235
235
  # Extract species data from decompressed data:
236
236
  # - (num_packets, energy_bins, spin_sector, inst_az)
237
+ # Unpacked data is in this order:
238
+ # (epoch, number_species, energy_{species}, inst_az, spin_sector)
237
239
  species_data = decompressed_data[:, species_index, :, :, :]
240
+ # Now transpose to put data in the correct order for writing to CDF:
241
+ # (epoch, energy_{species}, spin_sector, inst_az)
242
+ species_data = np.transpose(species_data, [0, 1, 3, 2])
243
+
238
244
  species_attrs = cdf_attrs.get_variable_attributes("hi-species-attrs")
239
245
  species_attrs = apply_replacements_to_attrs(
240
246
  species_attrs, {"species": species_name}
@@ -1166,6 +1166,16 @@ def process_hi_sectored(dependencies: ProcessingInputCollection) -> xr.Dataset:
1166
1166
  base_angles = np.asarray(L2_HI_SECTORED_ANGLE, dtype=float).reshape(n_spin, 1)
1167
1167
 
1168
1168
  spin_angle = (base_angles + elevation_offsets) % 360.0
1169
+ # We need to transpose spin_angle to put spin_angle data into correct
1170
+ # dimensions. Eg.
1171
+ # spin_angle[0,0] - 285
1172
+ # spin_angle[1,0] - 315
1173
+ # ....
1174
+ # This is expected behavior per CoDICE because the spin angle should increments
1175
+ # at 30 degree spin angle per elevation angle. Due to that, in the example, the
1176
+ # column remained same but spin angle incremented by 30 degrees for each
1177
+ # elevation angle.
1178
+ spin_angle = spin_angle.T
1169
1179
  # Add spin angle variable using the new elevation_angle dimension
1170
1180
  l2_dataset["spin_angle"] = (("spin_sector", "elevation_angle"), spin_angle)
1171
1181
  l2_dataset["spin_angle"].attrs = cdf_attrs.get_variable_attributes(
@@ -627,6 +627,14 @@ class UltraPointingSet(HealpixPointingSet):
627
627
  nside of the input pset counts variable (e.g. 128) to the nside of the pset.
628
628
  """
629
629
  pset_data = self.data
630
+ # TODO remove this check once we reprocess all psets
631
+ # going forward, all psets should have counts_pixel_index as a coordinate.
632
+ if "counts_pixel_index" not in pset_data.dims:
633
+ logger.info(
634
+ "No counts_pixel_index found in the dataset. Skipping counts "
635
+ "downsampling."
636
+ )
637
+ return
630
638
  counts_n_pix = pset_data.sizes["counts_pixel_index"]
631
639
  pset_n_pix = hp.nside2npix(self.nside)
632
640
  if counts_n_pix != pset_n_pix:
@@ -647,9 +655,11 @@ class UltraPointingSet(HealpixPointingSet):
647
655
  # Get counts in nested ordering. In nested ordering, the
648
656
  # pixels that need to be binned together to go from the counts nside to
649
657
  # the pset nside are contiguous in the array.
658
+ # Use nest2ring to get the indices to convert from ring to nest ordering if
659
+ # necessary.
650
660
  if not self.nested:
651
661
  counts_n = counts[
652
- :, hp.ring2nest(counts_nside, np.arange(counts_n_pix))
662
+ :, hp.nest2ring(counts_nside, np.arange(counts_n_pix))
653
663
  ]
654
664
  else:
655
665
  counts_n = counts
@@ -667,7 +677,7 @@ class UltraPointingSet(HealpixPointingSet):
667
677
  # convert back to ring ordering if necessary and store in the
668
678
  # downsampled counts array
669
679
  binned_counts_n = binned_counts_n[
670
- :, hp.nest2ring(self.nside, np.arange(pset_n_pix))
680
+ :, hp.ring2nest(self.nside, np.arange(pset_n_pix))
671
681
  ]
672
682
 
673
683
  self.data["counts"] = xr.DataArray(
@@ -59,7 +59,7 @@ def glows_l2(
59
59
  pipeline_settings_dataset.sel(epoch=day, method="nearest")
60
60
  )
61
61
 
62
- l2 = HistogramL2(input_dataset, pipeline_settings)
62
+ l2 = HistogramL2(input_dataset, pipeline_settings, calibration_dataset)
63
63
  if l2.number_of_good_l1b_inputs == 0:
64
64
  logger.warning("No good data found in L1B dataset. Returning empty list.")
65
65
  return []
@@ -14,7 +14,12 @@ from imap_processing.spice.geometry import (
14
14
  frame_transform_az_el,
15
15
  get_instrument_mounting_az_el,
16
16
  )
17
- from imap_processing.spice.time import met_to_sclkticks, sct_to_et
17
+ from imap_processing.spice.time import (
18
+ et_to_datetime64,
19
+ met_to_sclkticks,
20
+ sct_to_et,
21
+ ttj2000ns_to_et,
22
+ )
18
23
 
19
24
 
20
25
  @dataclass
@@ -46,6 +51,8 @@ class DailyLightcurve:
46
51
  number of bins in lightcurve
47
52
  l1b_data : xarray.Dataset
48
53
  L1B data filtered by good times, good angles, and good bins.
54
+ calibration_factor : float | None
55
+ Rayleigh calibration factor used for flux calculations.
49
56
  """
50
57
 
51
58
  # All variables should have n_bin elements
@@ -55,14 +62,19 @@ class DailyLightcurve:
55
62
  exposure_times: np.ndarray = field(init=False)
56
63
  flux_uncertainties: np.ndarray = field(init=False)
57
64
  histogram_flag_array: np.ndarray = field(init=False)
58
- # TODO: ecliptic coordinates
59
65
  ecliptic_lon: np.ndarray = field(init=False)
60
66
  ecliptic_lat: np.ndarray = field(init=False)
61
67
  number_of_bins: int = field(init=False)
62
68
  l1b_data: InitVar[xr.Dataset]
63
69
  position_angle: InitVar[float]
64
-
65
- def __post_init__(self, l1b_data: xr.Dataset, position_angle: float) -> None:
70
+ calibration_factor: InitVar[float | None]
71
+
72
+ def __post_init__(
73
+ self,
74
+ l1b_data: xr.Dataset,
75
+ position_angle: float,
76
+ calibration_factor: float | None,
77
+ ) -> None:
66
78
  """
67
79
  Compute all the daily lightcurve variables from L1B data.
68
80
 
@@ -74,6 +86,10 @@ class DailyLightcurve:
74
86
  position_angle : float
75
87
  The offset angle of the GLOWS instrument from the north spin point - this
76
88
  is used in spin angle calculations.
89
+ calibration_factor : float
90
+ Calibration factor used for flux calculations, in units of counts per second
91
+ per Rayleigh. This is used to convert from raw histograms and exposure times
92
+ to physical photon flux units.
77
93
  """
78
94
  # number_of_bins_per_histogram is the count of valid (non-FILLVAL) bins.
79
95
  # Histogram arrays from L1B are always GlowsConstants.STANDARD_BIN_COUNT
@@ -107,12 +123,16 @@ class DailyLightcurve:
107
123
  self.flux_uncertainties = np.zeros(self.number_of_bins)
108
124
 
109
125
  if (
110
- len(self.exposure_times) != 0
126
+ self.number_of_bins > 0
111
127
  and self.exposure_times[0] > 0
112
- and len(np.unique(self.exposure_times)) == 1
128
+ and calibration_factor
113
129
  ):
114
- self.photon_flux = self.raw_histograms / self.exposure_times
115
- self.flux_uncertainties = raw_uncertainties / self.exposure_times
130
+ self.photon_flux = (
131
+ self.raw_histograms / self.exposure_times
132
+ ) / calibration_factor
133
+ self.flux_uncertainties = (
134
+ raw_uncertainties / self.exposure_times
135
+ ) / calibration_factor
116
136
 
117
137
  self.spin_angle = np.zeros(0)
118
138
 
@@ -244,6 +264,8 @@ class HistogramL2:
244
264
  GLOWS histogram L1B dataset, as produced by glows_l1b.py.
245
265
  pipeline_settings : PipelineSettings
246
266
  Pipeline settings object read from ancillary file.
267
+ calibration_dataset : xr.Dataset
268
+ The cps-to-Rayleigh calibration dataset needed for flux calculations.
247
269
 
248
270
  Attributes
249
271
  ----------
@@ -327,7 +349,12 @@ class HistogramL2:
327
349
  spin_axis_orientation_average: np.ndarray[np.double]
328
350
  bad_time_flag_occurrences: np.ndarray
329
351
 
330
- def __init__(self, l1b_dataset: xr.Dataset, pipeline_settings: PipelineSettings):
352
+ def __init__(
353
+ self,
354
+ l1b_dataset: xr.Dataset,
355
+ pipeline_settings: PipelineSettings,
356
+ calibration_dataset: xr.Dataset,
357
+ ) -> None:
331
358
  """
332
359
  Given an L1B dataset, process data into an output HistogramL2 object.
333
360
 
@@ -337,6 +364,9 @@ class HistogramL2:
337
364
  GLOWS histogram L1B dataset, as produced by glows_l1b.py.
338
365
  pipeline_settings : PipelineSettings
339
366
  Pipeline settings object read from ancillary file.
367
+ calibration_dataset : xr.Dataset
368
+ cps-to-Rayleigh calibration dataset used for flux calculations.
369
+ coords: start_time_utc, data_vars: cps_per_r
340
370
  """
341
371
  active_flags = np.array(pipeline_settings.active_bad_time_flags, dtype=float)
342
372
 
@@ -438,7 +468,17 @@ class HistogramL2:
438
468
  .data[np.newaxis, :]
439
469
  )
440
470
 
441
- self.daily_lightcurve = DailyLightcurve(good_data, position_angle)
471
+ # Select calibration factor corresponding to the mid-epoch in the L1B data.
472
+ if len(good_data["epoch"].data) != 0:
473
+ calibration_factor = self.get_calibration_factor(
474
+ good_data["epoch"].data, calibration_dataset
475
+ )
476
+ else:
477
+ calibration_factor = None # No good data available. Still proceed
478
+
479
+ self.daily_lightcurve = DailyLightcurve(
480
+ good_data, position_angle, calibration_factor
481
+ )
442
482
 
443
483
  def filter_bad_bins(self, histograms: NDArray, bin_exclusions: NDArray) -> NDArray:
444
484
  """
@@ -517,3 +557,56 @@ class HistogramL2:
517
557
  # doesn't move from the SPICE determined mounting angle.
518
558
  glows_mounting_azimuth, _ = get_instrument_mounting_az_el(SpiceFrame.IMAP_GLOWS)
519
559
  return (360.0 - glows_mounting_azimuth) % 360.0
560
+
561
+ @staticmethod
562
+ def get_calibration_factor(
563
+ epoch_values: np.ndarray, calibration_dataset: xr.Dataset
564
+ ) -> float:
565
+ """
566
+ Select calibration factor for an observational day.
567
+
568
+ The calibration factor is needed to compute flux in Rayleigh units.
569
+ There is a strong assumption that the calibration is constant for
570
+ a given observational day.
571
+
572
+ Parameters
573
+ ----------
574
+ epoch_values : np.ndarray
575
+ Array of epoch values from the L1B dataset, in TT J2000 nanoseconds.
576
+ calibration_dataset : xr.Dataset
577
+ Dataset containing calibration data with the following structure:
578
+ Coords: epoch (datetime64[s])
579
+ Dims: epoch, cps_per_r_dim_0, start_time_utc_dim_0
580
+ Data vars: "cps_per_r" and "start_time_utc" are 2D (epoch, *_dim_0)
581
+
582
+ Note: epoch and start_time_utc do not necessarily match in size or
583
+ values
584
+ - epoch contains timestamps in the calibration data up to a defined
585
+ day buffer and start_time_utc are the timestamps for all the
586
+ calibration data entries.
587
+ - epoch is used for selecting the time block, and start_time_utc is
588
+ used for selecting the calibration value within that block.
589
+
590
+ Returns
591
+ -------
592
+ float
593
+ The calibration factor needed to compute flux in Rayleigh units.
594
+ """
595
+ # Use the midpoint epoch for the observation day
596
+ mid_idx = len(epoch_values) // 2
597
+ mid_epoch_utc = et_to_datetime64(ttj2000ns_to_et(epoch_values[mid_idx].item()))
598
+
599
+ # Select calibration data before or equal to mid_epoch_utc using "pad" to find
600
+ # the nearest preceding entry in the calibration dataset's epoch
601
+ # coordinate which is in UTC datetime64 format.
602
+ cal_at_epoch = calibration_dataset.sel(epoch=mid_epoch_utc, method="pad")
603
+
604
+ # start_time_utc is a data variable with its own index dimension.
605
+ # Use searchsorted to find the last entry whose start_time_utc <= mid_epoch_utc.
606
+ start_times = np.array(
607
+ cal_at_epoch["start_time_utc"].values, dtype="datetime64[ns]"
608
+ )
609
+ nearest_idx = np.searchsorted(start_times, mid_epoch_utc, side="right") - 1
610
+
611
+ # Select the calibration value at the nearest index.
612
+ return float(cal_at_epoch["cps_per_r"].isel(cps_per_r_dim_0=nearest_idx))