imap-processing 1.0.35__tar.gz → 1.0.36__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 (304) hide show
  1. {imap_processing-1.0.35 → imap_processing-1.0.36}/PKG-INFO +1 -1
  2. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/_version.py +2 -2
  3. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_hi_variable_attrs.yaml +22 -2
  4. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cli.py +174 -63
  5. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ena_maps/ena_maps.py +19 -3
  6. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ena_maps/utils/naming.py +180 -23
  7. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hi/hi_goodtimes.py +24 -16
  8. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hi/hi_l1b.py +366 -29
  9. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hi/hi_l1c.py +68 -1
  10. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hi/utils.py +199 -0
  11. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/l1a/hit_l1a.py +4 -4
  12. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/calculate_ingest.py +1 -1
  13. imap_processing-1.0.36/imap_processing/lo/ancillary_data/imap_lo_hydrogen-geometric-factor_v004.csv +16 -0
  14. imap_processing-1.0.36/imap_processing/lo/ancillary_data/imap_lo_oxygen-geometric-factor_v004.csv +16 -0
  15. imap_processing-1.0.36/imap_processing/lo/constants.py +165 -0
  16. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l1b/lo_l1b.py +6 -4
  17. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l1c/lo_l1c.py +58 -13
  18. imap_processing-1.0.36/imap_processing/lo/l2/lo_l2.py +955 -0
  19. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/quality_flags.py +4 -0
  20. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l2/ultra_l2.py +23 -1
  21. {imap_processing-1.0.35 → imap_processing-1.0.36}/pyproject.toml +1 -1
  22. imap_processing-1.0.35/imap_processing/lo/ancillary_data/imap_lo_hydrogen-geometric-factor_v004.csv +0 -16
  23. imap_processing-1.0.35/imap_processing/lo/ancillary_data/imap_lo_oxygen-geometric-factor_v004.csv +0 -16
  24. imap_processing-1.0.35/imap_processing/lo/constants.py +0 -91
  25. imap_processing-1.0.35/imap_processing/lo/l2/lo_l2.py +0 -1455
  26. {imap_processing-1.0.35 → imap_processing-1.0.36}/LICENSE +0 -0
  27. {imap_processing-1.0.35 → imap_processing-1.0.36}/README.md +0 -0
  28. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/__init__.py +0 -0
  29. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ancillary/__init__.py +0 -0
  30. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ancillary/ancillary_dataset_combiner.py +0 -0
  31. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ccsds/__init__.py +0 -0
  32. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ccsds/ccsds_data.py +0 -0
  33. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ccsds/excel_to_xtce.py +0 -0
  34. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/__init__.py +0 -0
  35. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +0 -0
  36. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +0 -0
  37. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_codice_l2-hi-direct-events_variable_attrs.yaml +0 -0
  38. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_codice_l2-hi-omni_variable_attrs.yaml +0 -0
  39. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_codice_l2-hi-sectored_variable_attrs.yaml +0 -0
  40. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_codice_l2-lo-angular_variable_attrs.yaml +0 -0
  41. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_codice_l2-lo-direct-events_variable_attrs.yaml +0 -0
  42. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_codice_l2-lo-species_variable_attrs.yaml +0 -0
  43. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_constant_attrs.yaml +0 -0
  44. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_default_global_cdf_attrs.yaml +0 -0
  45. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_enamaps_l2-common_variable_attrs.yaml +0 -0
  46. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_enamaps_l2-healpix_variable_attrs.yaml +0 -0
  47. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_enamaps_l2-rectangular_variable_attrs.yaml +0 -0
  48. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +0 -0
  49. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_glows_l1a_variable_attrs.yaml +0 -0
  50. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_glows_l1b_variable_attrs.yaml +0 -0
  51. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_glows_l2_variable_attrs.yaml +0 -0
  52. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +0 -0
  53. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +0 -0
  54. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +0 -0
  55. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +0 -0
  56. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +0 -0
  57. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_ialirt_global_cdf_attrs.yaml +0 -0
  58. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_ialirt_l1_variable_attrs.yaml +0 -0
  59. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +0 -0
  60. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +0 -0
  61. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +0 -0
  62. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_idex_l2a_variable_attrs.yaml +0 -0
  63. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_idex_l2b_variable_attrs.yaml +0 -0
  64. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_idex_l2c_variable_attrs.yaml +0 -0
  65. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +0 -0
  66. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +0 -0
  67. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_lo_l1b_variable_attrs.yaml +0 -0
  68. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_lo_l1c_variable_attrs.yaml +0 -0
  69. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +0 -0
  70. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_mag_l1a_variable_attrs.yaml +0 -0
  71. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_mag_l1b_variable_attrs.yaml +0 -0
  72. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +0 -0
  73. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_mag_l2_variable_attrs.yaml +0 -0
  74. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_spacecraft_global_cdf_attrs.yaml +0 -0
  75. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_spacecraft_variable_attrs.yaml +0 -0
  76. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +0 -0
  77. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +0 -0
  78. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +0 -0
  79. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +0 -0
  80. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +0 -0
  81. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +0 -0
  82. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +0 -0
  83. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +0 -0
  84. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +0 -0
  85. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +0 -0
  86. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/config/imap_variable_schema.yaml +0 -0
  87. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/imap_cdf_manager.py +0 -0
  88. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/cdf/utils.py +0 -0
  89. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/__init__.py +0 -0
  90. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a.py +0 -0
  91. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_de.py +0 -0
  92. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_hi_counters_aggregated.py +0 -0
  93. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_hi_counters_singles.py +0 -0
  94. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_hi_omni.py +0 -0
  95. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_hi_priority.py +0 -0
  96. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_hi_sectored.py +0 -0
  97. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_ialirt_hi.py +0 -0
  98. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_lo_counters_aggregated.py +0 -0
  99. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_lo_counters_singles.py +0 -0
  100. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_lo_priority.py +0 -0
  101. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1a_lo_species.py +0 -0
  102. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l1b.py +0 -0
  103. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/codice_l2.py +0 -0
  104. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/constants.py +0 -0
  105. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/data/esa_sweep_values.csv +0 -0
  106. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/data/lo_stepping_values.csv +0 -0
  107. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/decompress.py +0 -0
  108. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/packet_definitions/P_COD_NHK.xml +0 -0
  109. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/packet_definitions/imap_codice_packet-definition_20250101_v001.xml +0 -0
  110. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/packet_definitions/imap_codice_packet-definition_20260129_v001.xml +0 -0
  111. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/codice/utils.py +0 -0
  112. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ena_maps/__init__.py +0 -0
  113. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ena_maps/utils/__init__.py +0 -0
  114. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ena_maps/utils/coordinates.py +0 -0
  115. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ena_maps/utils/corrections.py +0 -0
  116. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ena_maps/utils/map_utils.py +0 -0
  117. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ena_maps/utils/spatial_utils.py +0 -0
  118. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/__init__.py +0 -0
  119. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/ancillary/imap_glows_exclusions-by-instr-team_20250923_v002.dat +0 -0
  120. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/ancillary/imap_glows_map-of-excluded-regions_20250923_v002.dat +0 -0
  121. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/ancillary/imap_glows_map-of-uv-sources_20250923_v002.dat +0 -0
  122. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/ancillary/imap_glows_pipeline-settings_20250923_v002.json +0 -0
  123. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/ancillary/imap_glows_pipeline_settings_v001.json +0 -0
  124. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/ancillary/imap_glows_suspected-transients_20250923_v002.dat +0 -0
  125. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/ancillary/l1b_conversion_table_v001.json +0 -0
  126. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/l0/__init__.py +0 -0
  127. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/l0/decom_glows.py +0 -0
  128. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/l0/glows_l0_data.py +0 -0
  129. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/l1a/glows_l1a.py +0 -0
  130. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/l1a/glows_l1a_data.py +0 -0
  131. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/l1b/glows_l1b.py +0 -0
  132. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/l1b/glows_l1b_data.py +0 -0
  133. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/l2/glows_l2.py +0 -0
  134. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/l2/glows_l2_data.py +0 -0
  135. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/packet_definitions/GLX_COMBINED.xml +0 -0
  136. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/packet_definitions/P_GLX_TMSCDE.xml +0 -0
  137. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/packet_definitions/P_GLX_TMSCHIST.xml +0 -0
  138. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/utils/__init__.py +0 -0
  139. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/glows/utils/constants.py +0 -0
  140. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hi/__init__.py +0 -0
  141. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hi/hi_l1a.py +0 -0
  142. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hi/hi_l2.py +0 -0
  143. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hi/packet_definitions/TLM_HI_COMBINED_SCI.xml +0 -0
  144. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hi/packet_definitions/__init__.py +0 -0
  145. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/__init__.py +0 -0
  146. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/hit_utils.py +0 -0
  147. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/l0/__init__.py +0 -0
  148. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/l0/constants.py +0 -0
  149. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/l0/decom_hit.py +0 -0
  150. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/l1a/__init__.py +0 -0
  151. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/l1b/constants.py +0 -0
  152. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/l1b/hit_l1b.py +0 -0
  153. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/l2/constants.py +0 -0
  154. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/l2/hit_l2.py +0 -0
  155. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/hit/packet_definitions/hit_packet_definitions.xml +0 -0
  156. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/__init__.py +0 -0
  157. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/constants.py +0 -0
  158. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/generate_coverage.py +0 -0
  159. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/l0/__init__.py +0 -0
  160. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/l0/ialirt_spice.py +0 -0
  161. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/l0/mag_l0_ialirt_data.py +0 -0
  162. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/l0/parse_mag.py +0 -0
  163. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/l0/process_codice.py +0 -0
  164. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/l0/process_hit.py +0 -0
  165. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/l0/process_status.py +0 -0
  166. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/l0/process_swapi.py +0 -0
  167. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/l0/process_swe.py +0 -0
  168. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/packet_definitions/__init__.py +0 -0
  169. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/packet_definitions/ialirt.xml +0 -0
  170. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +0 -0
  171. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +0 -0
  172. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/packet_definitions/ialirt_hit.xml +0 -0
  173. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/packet_definitions/ialirt_mag.xml +0 -0
  174. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +0 -0
  175. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/packet_definitions/ialirt_swe.xml +0 -0
  176. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/process_ephemeris.py +0 -0
  177. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/utils/constants.py +0 -0
  178. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/utils/create_xarray.py +0 -0
  179. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/utils/grouping.py +0 -0
  180. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ialirt/utils/time.py +0 -0
  181. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/__init__.py +0 -0
  182. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/atomic_masses.csv +0 -0
  183. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/decode.py +0 -0
  184. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/evt_msg_decode_utils.py +0 -0
  185. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/idex_10_day_CDF_names.csv +0 -0
  186. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/idex_constants.py +0 -0
  187. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/idex_evt_msg_parsing_dictionaries.json +0 -0
  188. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/idex_l0.py +0 -0
  189. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/idex_l1a.py +0 -0
  190. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/idex_l1b.py +0 -0
  191. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/idex_l2a.py +0 -0
  192. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/idex_l2b.py +0 -0
  193. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/idex_utils.py +0 -0
  194. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +0 -0
  195. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/packet_definitions/idex_housekeeping_packet_definition.xml +0 -0
  196. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/idex/packet_definitions/idex_science_packet_definition.xml +0 -0
  197. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/__init__.py +0 -0
  198. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/ancillary_data/imap_lo_bootstrap-correction-factors_v001.csv +0 -0
  199. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/ancillary_data/imap_lo_hydrogen-geometric-factor_v001.csv +0 -0
  200. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/ancillary_data/imap_lo_oxygen-geometric-factor_v001.csv +0 -0
  201. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/ancillary_data/imap_lo_sputter-correction-factors_v001.csv +0 -0
  202. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l0/__init__.py +0 -0
  203. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l0/decompression_tables/decompression_tables.py +0 -0
  204. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l0/decompression_tables/log10_12_to_16_bit_uncompress.csv +0 -0
  205. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l0/decompression_tables/log10_8_to_12_bit_uncompress.csv +0 -0
  206. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l0/decompression_tables/log10_8_to_16_bit_uncompress.csv +0 -0
  207. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l0/lo_apid.py +0 -0
  208. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l0/lo_science.py +0 -0
  209. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l0/lo_star_sensor.py +0 -0
  210. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l0/utils/binary_string.py +0 -0
  211. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l0/utils/bit_decompression.py +0 -0
  212. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l1a/__init__.py +0 -0
  213. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l1a/lo_l1a.py +0 -0
  214. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/l1b/tof_conversions.py +0 -0
  215. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/lo_ancillary.py +0 -0
  216. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/lo/packet_definitions/lo_xtce.xml +0 -0
  217. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/__init__.py +0 -0
  218. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/constants.py +0 -0
  219. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/imap_mag_sdc_configuration_v001.py +0 -0
  220. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l0/decom_mag.py +0 -0
  221. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l0/mag_l0_data.py +0 -0
  222. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l1a/mag_l1a.py +0 -0
  223. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l1a/mag_l1a_data.py +0 -0
  224. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l1b/imap_mag_l1b-calibration_20240229_v002.cdf +0 -0
  225. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l1b/mag_l1b.py +0 -0
  226. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l1c/interpolation_methods.py +0 -0
  227. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l1c/mag_l1c.py +0 -0
  228. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l1d/__init__.py +0 -0
  229. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l1d/mag_l1d.py +0 -0
  230. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l1d/mag_l1d_data.py +0 -0
  231. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l2/__init__.py +0 -0
  232. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l2/mag_l2.py +0 -0
  233. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/l2/mag_l2_data.py +0 -0
  234. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/mag/packet_definitions/MAG_SCI_COMBINED.xml +0 -0
  235. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/spacecraft/packet_definitions/scid_x252.xml +0 -0
  236. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/spacecraft/quaternions.py +0 -0
  237. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/spice/__init__.py +0 -0
  238. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/spice/config.py +0 -0
  239. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/spice/geometry.py +0 -0
  240. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/spice/pointing_frame.py +0 -0
  241. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/spice/repoint.py +0 -0
  242. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/spice/spin.py +0 -0
  243. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/spice/time.py +0 -0
  244. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swapi/__init__.py +0 -0
  245. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swapi/constants.py +0 -0
  246. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swapi/l1/__init__.py +0 -0
  247. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swapi/l1/swapi_l1.py +0 -0
  248. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swapi/l2/__init__.py +0 -0
  249. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swapi/l2/swapi_l2.py +0 -0
  250. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swapi/packet_definitions/__init__.py +0 -0
  251. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swapi/packet_definitions/swapi_packet_definition.xml +0 -0
  252. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swapi/swapi_utils.py +0 -0
  253. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/__init__.py +0 -0
  254. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/l1a/__init__.py +0 -0
  255. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/l1a/swe_l1a.py +0 -0
  256. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/l1a/swe_science.py +0 -0
  257. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/l1b/swe_l1b.py +0 -0
  258. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/l2/swe_l2.py +0 -0
  259. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/packet_definitions/__init__.py +0 -0
  260. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/packet_definitions/swe_packet_definition.xml +0 -0
  261. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/utils/__init__.py +0 -0
  262. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/utils/swe_constants.py +0 -0
  263. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/swe/utils/swe_utils.py +0 -0
  264. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/__init__.py +0 -0
  265. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/constants.py +0 -0
  266. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l0/__init__.py +0 -0
  267. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l0/decom_tools.py +0 -0
  268. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l0/decom_ultra.py +0 -0
  269. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l0/ultra_utils.py +0 -0
  270. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1a/__init__.py +0 -0
  271. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1a/ultra_l1a.py +0 -0
  272. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1b/badtimes.py +0 -0
  273. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1b/de.py +0 -0
  274. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1b/extendedspin.py +0 -0
  275. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1b/goodtimes.py +0 -0
  276. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1b/lookup_utils.py +0 -0
  277. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1b/quality_flag_filters.py +0 -0
  278. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1b/ultra_l1b.py +0 -0
  279. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1b/ultra_l1b_annotated.py +0 -0
  280. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1b/ultra_l1b_culling.py +0 -0
  281. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1b/ultra_l1b_extended.py +0 -0
  282. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/helio_pset.py +0 -0
  283. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/l1c_lookup_utils.py +0 -0
  284. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/make_helio_index_maps.py +0 -0
  285. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/sim_spice_kernels/imap_001.tf +0 -0
  286. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/sim_spice_kernels/imap_science_100.tf +0 -0
  287. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/sim_spice_kernels/imap_science_120.tf +0 -0
  288. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/sim_spice_kernels/imap_sclk_0000.tsc +0 -0
  289. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/sim_spice_kernels/imap_spk_demo.bsp +0 -0
  290. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/sim_spice_kernels/naif0012.tls +0 -0
  291. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/sim_spice_kernels/sim_1yr_imap_attitude.bc +0 -0
  292. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/sim_spice_kernels/sim_1yr_imap_pointing_frame.bc +0 -0
  293. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/spacecraft_pset.py +0 -0
  294. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/ultra_l1c.py +0 -0
  295. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/ultra_l1c_culling.py +0 -0
  296. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +0 -0
  297. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l2/__init__.py +0 -0
  298. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/l2/ultra_l2_systematic_uncertainties.csv +0 -0
  299. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/packet_definitions/README.md +0 -0
  300. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +0 -0
  301. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/packet_definitions/__init__.py +0 -0
  302. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/utils/__init__.py +0 -0
  303. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/ultra/utils/ultra_l1_utils.py +0 -0
  304. {imap_processing-1.0.35 → imap_processing-1.0.36}/imap_processing/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: imap-processing
3
- Version: 1.0.35
3
+ Version: 1.0.36
4
4
  Summary: IMAP Science Operations Center Processing
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -1,3 +1,3 @@
1
1
  # These version placeholders will be replaced later during substitution.
2
- __version__ = "1.0.35"
3
- __version_tuple__ = (1, 0, 35)
2
+ __version__ = "1.0.36"
3
+ __version_tuple__ = (1, 0, 36)
@@ -446,8 +446,10 @@ hi_de_ccsds_qf:
446
446
  VALIDMIN: 0
447
447
  VAR_NOTES: >
448
448
  Bitwise quality flag for CCSDS packet. Bit 0 (value 1): packet was full
449
- (contained 664 events). Bit 2 (value 4): packet contained events from an
450
- invalid spin.
449
+ (contained 664 events). Bit 1 (value 2): ESA (inner/outer) voltage did not
450
+ match any known esa_energy_step. Bit 2 (value 4): packet contained events
451
+ from an invalid spin. Bit 3 (value 8): detector high voltage (CEM/MCP/U-Can/
452
+ deflector) did not match the pointing's classified gain configuration.
451
453
 
452
454
  # ======= L1C PSET Section =======
453
455
 
@@ -477,6 +479,24 @@ hi_pset_esa_energy_step:
477
479
  VAR_TYPE: support_data
478
480
  dtype: uint8
479
481
 
482
+ hi_pset_geometric_factor:
483
+ <<: *default_float32
484
+ CATDESC: Geometric factor for the detector gain configuration active during this pointing
485
+ DEPEND_0: epoch
486
+ DEPEND_1: esa_energy_step
487
+ DISPLAY_TYPE: no_plot
488
+ FIELDNAM: Geometric factor
489
+ FORMAT: E12.5
490
+ LABLAXIS: Geometric Factor
491
+ LABL_PTR_1: esa_energy_step_label
492
+ UNITS: cm^2 sr
493
+ VALIDMAX: 1.0
494
+ VALIDMIN: 0.0
495
+ VAR_NOTES: >
496
+ Geometric factor per esa_energy_step, looked up from the gain-configuration
497
+ ancillary file using the l1b_de's classified gain configuration.
498
+ VAR_TYPE: support_data
499
+
480
500
  hi_pset_calibration_prod:
481
501
  CATDESC: Coincidence types are combined into various calibration products
482
502
  FIELDNAM: Calibration product number
@@ -18,6 +18,7 @@ import logging
18
18
  import sys
19
19
  from abc import ABC, abstractmethod
20
20
  from pathlib import Path
21
+ from time import sleep
21
22
  from typing import final
22
23
 
23
24
  import imap_data_access
@@ -53,6 +54,7 @@ from imap_processing.cdf.utils import load_cdf, write_cdf
53
54
  # In code:
54
55
  # call cdf.utils.write_cdf
55
56
  from imap_processing.codice import codice_l1a, codice_l1b, codice_l2
57
+ from imap_processing.ena_maps.utils.naming import MapDescriptor
56
58
  from imap_processing.glows.l1a.glows_l1a import glows_l1a
57
59
  from imap_processing.glows.l1b.glows_l1b import glows_l1b, glows_l1b_de
58
60
  from imap_processing.glows.l2.glows_l2 import glows_l2
@@ -95,6 +97,9 @@ from imap_processing.utils import (
95
97
 
96
98
  logger = logging.getLogger(__name__)
97
99
 
100
+ RETRY_EXIT_CODE = 75 # Exit code indicating the job should be retried
101
+ # (e.g., imap-data-access 503 SlowDown).
102
+
98
103
 
99
104
  def _parse_args() -> argparse.Namespace:
100
105
  """
@@ -201,8 +206,9 @@ def _parse_args() -> argparse.Namespace:
201
206
  '{"major_version": 2, "minor_version": 1}}'
202
207
  "}'"
203
208
  " A path to a JSON file containing this same information may also be"
204
- "passed in. If dependency is a string ending in '.json', it will be interpreted"
205
- " as such a file path."
209
+ " passed in. If dependency is a string ending in '.json', it will be"
210
+ " interpreted as such a file path: an existing local file is used as-is,"
211
+ " otherwise the file is downloaded from the IMAP SDC."
206
212
  )
207
213
 
208
214
  parser = argparse.ArgumentParser(prog="imap_cli", description=description)
@@ -288,7 +294,10 @@ def _parse_args() -> argparse.Namespace:
288
294
  logger.info(
289
295
  f"Interpreting dependency argument as a JSON file: {args.dependency}"
290
296
  )
291
- dependency_filepath = download(args.dependency)
297
+ if not Path(args.dependency).exists():
298
+ dependency_filepath = download(args.dependency)
299
+ else:
300
+ dependency_filepath = args.dependency
292
301
  with open(dependency_filepath) as f:
293
302
  args.dependency = f.read()
294
303
 
@@ -468,6 +477,8 @@ class ProcessInstrument(ABC):
468
477
  """
469
478
  Upload data products to the IMAP SDC.
470
479
 
480
+ If a 503 SlowDown error is reported from the Upload API, a retry will be made
481
+
471
482
  Parameters
472
483
  ----------
473
484
  products : list[Path]
@@ -479,18 +490,42 @@ class ProcessInstrument(ABC):
479
490
  return
480
491
 
481
492
  for filename in products:
482
- try:
483
- logger.info(f"Uploading file: {filename}")
484
- imap_data_access.upload(filename)
485
- except IMAPDataAccessError as e:
486
- message = str(e)
487
- if "FileAlreadyExists" in message and "409" in message:
488
- logger.warning("Skipping upload of existing file, %s", filename)
489
- continue
490
- else:
493
+ max_retries = 3
494
+
495
+ for attempt in range(max_retries):
496
+ try:
497
+ logger.info(f"Uploading file: {filename}")
498
+ imap_data_access.upload(filename)
499
+ break
500
+
501
+ except IMAPDataAccessError as e:
502
+ message = str(e)
503
+
504
+ if "FileAlreadyExists" in message and "409" in message:
505
+ logger.warning(
506
+ "Skipping upload of existing file, %s", filename
507
+ )
508
+ break
509
+ elif "503" in message and "SlowDown" in message:
510
+ if attempt < max_retries - 1:
511
+ logger.warning(
512
+ "Upload busy. Waiting 5 seconds before retrying..."
513
+ )
514
+ sleep(5)
515
+ continue
516
+
517
+ logger.error(
518
+ f"Upload failed after {max_retries} attempts. Exiting "
519
+ f"with code {RETRY_EXIT_CODE}."
520
+ )
521
+ sys.exit(RETRY_EXIT_CODE)
522
+
491
523
  logger.error(f"Upload failed with error: {message}")
492
- except Exception as e:
493
- logger.error(f"Upload failed unknown error: {e}")
524
+ raise
525
+
526
+ except Exception as e:
527
+ logger.error(f"Upload failed unknown error: {e}")
528
+ raise
494
529
 
495
530
  @final
496
531
  def process(self) -> None:
@@ -937,9 +972,17 @@ class Hi(ProcessInstrument):
937
972
  l1b_hk_file = dependencies.get_file_paths(
938
973
  source="hi", data_type="l1b", descriptor="hk"
939
974
  )[0]
940
- esa_energies_csv = dependencies.get_file_paths(data_type="ancillary")[0]
975
+ esa_energies_csv = dependencies.get_file_paths(
976
+ data_type="ancillary", descriptor="esa-energies"
977
+ )[0]
978
+ gain_config_csv = dependencies.get_file_paths(
979
+ data_type="ancillary", descriptor="gain-configuration"
980
+ )[0]
941
981
  datasets = hi_l1b.annotate_direct_events(
942
- load_cdf(l1a_de_file), load_cdf(l1b_hk_file), esa_energies_csv
982
+ load_cdf(l1a_de_file),
983
+ load_cdf(l1b_hk_file),
984
+ esa_energies_csv,
985
+ gain_config_csv,
943
986
  )
944
987
  elif self.data_level == "l1c":
945
988
  if "pset" in self.descriptor:
@@ -957,10 +1000,10 @@ class Hi(ProcessInstrument):
957
1000
  anc_dependencies = dependencies.get_processing_inputs(
958
1001
  data_type="ancillary"
959
1002
  )
960
- if len(anc_dependencies) != 2:
1003
+ if len(anc_dependencies) != 3:
961
1004
  raise ValueError(
962
- f"Expected two ancillary dependencies (cal-prod and "
963
- f"backgrounds). Got "
1005
+ f"Expected three ancillary dependencies (cal-prod, "
1006
+ f"backgrounds, and gain-configuration). Got "
964
1007
  f"{[anc_dep.descriptor for anc_dep in anc_dependencies]}"
965
1008
  )
966
1009
 
@@ -972,14 +1015,16 @@ class Hi(ProcessInstrument):
972
1015
  for dep in anc_dependencies
973
1016
  }
974
1017
 
975
- # Verify we have both required ancillary files
1018
+ # Verify we have all required ancillary files
976
1019
  if (
977
1020
  "cal-prod" not in anc_path_dict
978
1021
  or "backgrounds" not in anc_path_dict
1022
+ or "gain-configuration" not in anc_path_dict
979
1023
  ):
980
1024
  raise ValueError(
981
- f"Missing required ancillary files. Expected 'cal-prod' and "
982
- f"'backgrounds', got {list(anc_path_dict.keys())}"
1025
+ f"Missing required ancillary files. Expected 'cal-prod', "
1026
+ f"'backgrounds', and 'gain-configuration', got "
1027
+ f"{list(anc_path_dict.keys())}"
983
1028
  )
984
1029
 
985
1030
  # Load goodtimes dependency
@@ -997,6 +1042,7 @@ class Hi(ProcessInstrument):
997
1042
  anc_path_dict["cal-prod"],
998
1043
  load_cdf(goodtimes_paths[0]),
999
1044
  anc_path_dict["backgrounds"],
1045
+ anc_path_dict["gain-configuration"],
1000
1046
  )
1001
1047
  elif self.data_level == "l2":
1002
1048
  science_paths = dependencies.get_file_paths(source="hi", data_type="l1c")
@@ -1208,52 +1254,109 @@ class Idex(ProcessInstrument):
1208
1254
  class Lo(ProcessInstrument):
1209
1255
  """Process IMAP-Lo."""
1210
1256
 
1257
+ @staticmethod
1258
+ def _pointings_at_pivot_angle(
1259
+ dependencies: ProcessingInputCollection, map_pivot_angle: int
1260
+ ) -> set[int]:
1261
+ """
1262
+ Find the pointings that were taken at the pivot angle of a map.
1263
+
1264
+ A pointing's pivot angle is recorded in its goodtimes product, which is
1265
+ also the product the other inputs of that pointing are selected by.
1266
+
1267
+ Parameters
1268
+ ----------
1269
+ dependencies : ProcessingInputCollection
1270
+ Object containing dependencies to process.
1271
+ map_pivot_angle : int
1272
+ The pivot angle [degrees] of the map being made.
1273
+
1274
+ Returns
1275
+ -------
1276
+ set[int]
1277
+ The repointings whose pivot angle is that of the map.
1278
+ """
1279
+ at_pivot_angle = set()
1280
+ for goodtimes_path in dependencies.get_file_paths(
1281
+ source="lo", descriptor="goodtimes"
1282
+ ):
1283
+ goodtimes = load_cdf(goodtimes_path)
1284
+ repointing = imap_data_access.ScienceFilePath(
1285
+ goodtimes_path.name
1286
+ ).repointing
1287
+ if "pivot" not in goodtimes:
1288
+ logger.info(f"Dropping {goodtimes_path.name} - no pivot angle.")
1289
+ continue
1290
+
1291
+ pivot_angle = np.atleast_1d(goodtimes["pivot"].values)[0]
1292
+ if (
1293
+ abs(pivot_angle - map_pivot_angle)
1294
+ < LoConstants.PSET_PIVOT_ANGLE_TOLERANCE
1295
+ ):
1296
+ at_pivot_angle.add(repointing)
1297
+ else:
1298
+ logger.info(
1299
+ f"Dropping repoint{repointing}, its pivot angle {pivot_angle} "
1300
+ f"is not the {map_pivot_angle} degree pivot angle of the map."
1301
+ )
1302
+
1303
+ return at_pivot_angle
1304
+
1211
1305
  def pre_processing(self) -> ProcessingInputCollection:
1212
1306
  """
1213
1307
  Complete pre-processing.
1214
1308
 
1215
- Extends the base pre-processing by filtering Lo PSET science inputs to
1216
- only those whose ``pivot_angle`` is within
1217
- ``LoConstants.PSET_PIVOT_ANGLE_TOLERANCE`` of
1218
- ``LoConstants.PSET_PIVOT_ANGLE``. PSET files that fall outside this
1219
- range are dropped before processing begins.
1309
+ Extends the base pre-processing by dropping, for map products, the Lo
1310
+ science inputs of the pointings that were not taken at the pivot angle
1311
+ of the map being made. A pointing is dropped whole: its goodtimes give
1312
+ the pivot angle, and its other inputs go with them.
1313
+
1314
+ Filtering here, rather than during processing, keeps the `Parents`
1315
+ attribute of the produced map limited to the files it was made from.
1220
1316
 
1221
1317
  Returns
1222
1318
  -------
1223
1319
  dependencies : ProcessingInputCollection
1224
1320
  Object containing dependencies to process.
1225
1321
  """
1226
- datasets = super().pre_processing()
1227
- new_datasets = ProcessingInputCollection()
1322
+ dependencies = super().pre_processing()
1323
+ if self.data_level != "l2":
1324
+ return dependencies
1325
+
1326
+ try:
1327
+ map_pivot_angle = MapDescriptor.from_string(self.descriptor).sensor
1328
+ except ValueError:
1329
+ # Not a map product, so there is no pivot angle to select inputs with
1330
+ logger.info(
1331
+ f"Not filtering inputs by pivot angle, {self.descriptor} is not a "
1332
+ f"map descriptor."
1333
+ )
1334
+ return dependencies
1335
+
1336
+ if not isinstance(map_pivot_angle, int):
1337
+ # A map of no particular pivot angle, e.g. "ilo-ena-h-sf-nsp-ram-..."
1338
+ return dependencies
1339
+
1340
+ at_pivot_angle = self._pointings_at_pivot_angle(dependencies, map_pivot_angle)
1228
1341
 
1229
- for processing_input in datasets.get_processing_inputs():
1342
+ filtered_dependencies = ProcessingInputCollection()
1343
+ for processing_input in dependencies.get_processing_inputs():
1230
1344
  if (
1231
- processing_input.source == "lo"
1232
- and processing_input.descriptor == "pset"
1345
+ processing_input.input_type != ProcessingInputType.SCIENCE_FILE
1346
+ or processing_input.source != "lo"
1233
1347
  ):
1234
- valid_filenames = []
1235
- for imap_file_path in processing_input.imap_file_paths:
1236
- pset = load_cdf(imap_file_path.construct_path())
1237
- if "pivot_angle" in pset:
1238
- if (
1239
- abs(
1240
- pset["pivot_angle"].item()
1241
- - LoConstants.PSET_PIVOT_ANGLE
1242
- )
1243
- < LoConstants.PSET_PIVOT_ANGLE_TOLERANCE
1244
- ):
1245
- valid_filenames.append(str(imap_file_path.filename))
1246
- else:
1247
- logger.info(
1248
- f"Dropping pset {imap_file_path.filename} because "
1249
- f"pivot angle is not in range."
1250
- )
1251
- if valid_filenames:
1252
- new_datasets.add(type(processing_input)(*valid_filenames))
1253
- else:
1254
- new_datasets.add(processing_input)
1348
+ filtered_dependencies.add(processing_input)
1349
+ continue
1255
1350
 
1256
- return new_datasets
1351
+ kept_filenames = [
1352
+ str(imap_file_path.filename)
1353
+ for imap_file_path in processing_input.imap_file_paths
1354
+ if imap_file_path.repointing in at_pivot_angle
1355
+ ]
1356
+ if kept_filenames:
1357
+ filtered_dependencies.add(type(processing_input)(*kept_filenames))
1358
+
1359
+ return filtered_dependencies
1257
1360
 
1258
1361
  def do_processing(
1259
1362
  self, dependencies: ProcessingInputCollection
@@ -1319,18 +1422,26 @@ class Lo(ProcessInstrument):
1319
1422
  datasets = lo_l1c.lo_l1c(data_dict, anc_dependencies)
1320
1423
 
1321
1424
  elif self.data_level == "l2":
1322
- data_dict = {}
1323
- science_files = dependencies.get_file_paths(source="lo", descriptor="pset")
1324
1425
  anc_dependencies = dependencies.get_file_paths(data_type="ancillary")
1325
1426
 
1326
- # Load all pset files into datasets
1327
- if not science_files:
1328
- logger.info("No valid psets found for L2 processing.")
1329
- return datasets
1427
+ # Load every pointing of the map window, grouped into the products
1428
+ # of each pointing.
1429
+ sci_dependencies: dict[int, dict[str, xr.Dataset]] = {}
1430
+ for descriptor in lo_l2.REQUIRED_PRODUCTS:
1431
+ for file in dependencies.get_file_paths(
1432
+ source="lo", data_type="l1b", descriptor=descriptor
1433
+ ):
1434
+ repointing = imap_data_access.ScienceFilePath(file.name).repointing
1435
+ if repointing is None:
1436
+ logger.warning(
1437
+ f"Dropping {file.name}, it covers no single pointing."
1438
+ )
1439
+ continue
1440
+ sci_dependencies.setdefault(repointing, {})[descriptor] = load_cdf(
1441
+ file
1442
+ )
1330
1443
 
1331
- psets = [load_cdf(file) for file in science_files]
1332
- data_dict[psets[0].attrs["Logical_source"]] = psets
1333
- datasets = lo_l2.lo_l2(data_dict, anc_dependencies, self.descriptor)
1444
+ datasets = lo_l2.lo_l2(sci_dependencies, anc_dependencies, self.descriptor)
1334
1445
  return datasets
1335
1446
 
1336
1447
 
@@ -1498,11 +1498,25 @@ class RectangularSkyMap(AbstractSkyMap):
1498
1498
  # Now set global attributes
1499
1499
  map_attrs = cdf_attrs.get_global_attributes(f"imap_{instrument}_{level}_enamap")
1500
1500
  map_attrs["Spacing_degrees"] = str(self.spacing_deg)
1501
- for key in ["Data_type", "Logical_source", "Logical_source_description"]:
1501
+ for key in ["Data_type", "Logical_source"]:
1502
1502
  map_attrs[key] = map_attrs[key].format(
1503
1503
  descriptor=descriptor,
1504
1504
  sensor=sensor,
1505
1505
  )
1506
+ # Use the MapDescriptor to generate the Logical_source_description
1507
+ # when possible, but preserve previous behavior for non-descriptor
1508
+ # strings so later validation still raises the intended errors.
1509
+ try:
1510
+ md = naming.MapDescriptor.from_string(descriptor)
1511
+ except ValueError:
1512
+ map_attrs["Logical_source_description"] = map_attrs[
1513
+ "Logical_source_description"
1514
+ ].format(
1515
+ descriptor=descriptor,
1516
+ sensor=sensor,
1517
+ )
1518
+ else:
1519
+ map_attrs["Logical_source_description"] = md.to_logical_source_description()
1506
1520
  # Always add the following attributes to the map
1507
1521
  map_attrs.update(
1508
1522
  {
@@ -1804,8 +1818,10 @@ class HealpixSkyMap(AbstractSkyMap):
1804
1818
  )
1805
1819
  # Log the mean pixel value and the number of subdivisions for debugging
1806
1820
  logger.debug(
1807
- f" Mean pixel value at Number of subdivisions: {num_subdivisions}: "
1808
- f"array of shape {mean_pixel_value.shape}: {mean_pixel_value}"
1821
+ " Mean pixel value at Number of subdivisions: %s: array of shape %s: %s",
1822
+ num_subdivisions,
1823
+ mean_pixel_value.shape,
1824
+ mean_pixel_value,
1809
1825
  )
1810
1826
  return mean_pixel_value
1811
1827