imap-processing 1.0.31__tar.gz → 1.0.32__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 (297) hide show
  1. {imap_processing-1.0.31 → imap_processing-1.0.32}/PKG-INFO +1 -1
  2. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/_version.py +2 -2
  3. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +2 -0
  4. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cli.py +14 -0
  5. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a.py +0 -12
  6. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_lo_species.py +2 -25
  7. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1b.py +0 -3
  8. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l2.py +0 -209
  9. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/constants.py +0 -19
  10. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l1a/glows_l1a.py +19 -0
  11. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/calculate_ingest.py +1 -1
  12. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_l2a.py +96 -18
  13. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_l2b.py +32 -0
  14. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/constants.py +13 -8
  15. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l1b/lo_l1b.py +7 -6
  16. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/time.py +22 -0
  17. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/utils.py +86 -1
  18. {imap_processing-1.0.31 → imap_processing-1.0.32}/pyproject.toml +2 -2
  19. imap_processing-1.0.31/imap_processing/codice/codice_l1a_lo_angular.py +0 -536
  20. {imap_processing-1.0.31 → imap_processing-1.0.32}/LICENSE +0 -0
  21. {imap_processing-1.0.31 → imap_processing-1.0.32}/README.md +0 -0
  22. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/__init__.py +0 -0
  23. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ancillary/__init__.py +0 -0
  24. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ancillary/ancillary_dataset_combiner.py +0 -0
  25. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ccsds/__init__.py +0 -0
  26. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ccsds/ccsds_data.py +0 -0
  27. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ccsds/excel_to_xtce.py +0 -0
  28. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/__init__.py +0 -0
  29. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +0 -0
  30. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l2-hi-direct-events_variable_attrs.yaml +0 -0
  31. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l2-hi-omni_variable_attrs.yaml +0 -0
  32. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l2-hi-sectored_variable_attrs.yaml +0 -0
  33. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l2-lo-angular_variable_attrs.yaml +0 -0
  34. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l2-lo-direct-events_variable_attrs.yaml +0 -0
  35. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l2-lo-species_variable_attrs.yaml +0 -0
  36. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_constant_attrs.yaml +0 -0
  37. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_default_global_cdf_attrs.yaml +0 -0
  38. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_enamaps_l2-common_variable_attrs.yaml +0 -0
  39. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_enamaps_l2-healpix_variable_attrs.yaml +0 -0
  40. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_enamaps_l2-rectangular_variable_attrs.yaml +0 -0
  41. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +0 -0
  42. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_glows_l1a_variable_attrs.yaml +0 -0
  43. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_glows_l1b_variable_attrs.yaml +0 -0
  44. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_glows_l2_variable_attrs.yaml +0 -0
  45. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +0 -0
  46. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hi_variable_attrs.yaml +0 -0
  47. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +0 -0
  48. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +0 -0
  49. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +0 -0
  50. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +0 -0
  51. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ialirt_global_cdf_attrs.yaml +0 -0
  52. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ialirt_l1_variable_attrs.yaml +0 -0
  53. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +0 -0
  54. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +0 -0
  55. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +0 -0
  56. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_l2a_variable_attrs.yaml +0 -0
  57. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_l2b_variable_attrs.yaml +0 -0
  58. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_l2c_variable_attrs.yaml +0 -0
  59. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +0 -0
  60. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +0 -0
  61. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_lo_l1b_variable_attrs.yaml +0 -0
  62. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_lo_l1c_variable_attrs.yaml +0 -0
  63. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +0 -0
  64. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_mag_l1a_variable_attrs.yaml +0 -0
  65. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_mag_l1b_variable_attrs.yaml +0 -0
  66. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +0 -0
  67. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_mag_l2_variable_attrs.yaml +0 -0
  68. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_spacecraft_global_cdf_attrs.yaml +0 -0
  69. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_spacecraft_variable_attrs.yaml +0 -0
  70. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +0 -0
  71. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +0 -0
  72. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +0 -0
  73. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +0 -0
  74. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +0 -0
  75. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +0 -0
  76. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +0 -0
  77. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +0 -0
  78. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +0 -0
  79. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +0 -0
  80. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_variable_schema.yaml +0 -0
  81. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/imap_cdf_manager.py +0 -0
  82. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/utils.py +0 -0
  83. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/__init__.py +0 -0
  84. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_de.py +0 -0
  85. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_hi_counters_aggregated.py +0 -0
  86. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_hi_counters_singles.py +0 -0
  87. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_hi_omni.py +0 -0
  88. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_hi_priority.py +0 -0
  89. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_hi_sectored.py +0 -0
  90. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_ialirt_hi.py +0 -0
  91. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_lo_counters_aggregated.py +0 -0
  92. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_lo_counters_singles.py +0 -0
  93. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_lo_priority.py +0 -0
  94. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/data/esa_sweep_values.csv +0 -0
  95. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/data/lo_stepping_values.csv +0 -0
  96. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/decompress.py +0 -0
  97. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/packet_definitions/P_COD_NHK.xml +0 -0
  98. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/packet_definitions/imap_codice_packet-definition_20250101_v001.xml +0 -0
  99. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/packet_definitions/imap_codice_packet-definition_20260129_v001.xml +0 -0
  100. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/utils.py +0 -0
  101. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/__init__.py +0 -0
  102. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/ena_maps.py +0 -0
  103. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/__init__.py +0 -0
  104. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/coordinates.py +0 -0
  105. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/corrections.py +0 -0
  106. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/map_utils.py +0 -0
  107. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/naming.py +0 -0
  108. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/spatial_utils.py +0 -0
  109. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/__init__.py +0 -0
  110. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/imap_glows_exclusions-by-instr-team_20250923_v002.dat +0 -0
  111. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/imap_glows_map-of-excluded-regions_20250923_v002.dat +0 -0
  112. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/imap_glows_map-of-uv-sources_20250923_v002.dat +0 -0
  113. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/imap_glows_pipeline-settings_20250923_v002.json +0 -0
  114. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/imap_glows_pipeline_settings_v001.json +0 -0
  115. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/imap_glows_suspected-transients_20250923_v002.dat +0 -0
  116. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/l1b_conversion_table_v001.json +0 -0
  117. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l0/__init__.py +0 -0
  118. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l0/decom_glows.py +0 -0
  119. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l0/glows_l0_data.py +0 -0
  120. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l1a/glows_l1a_data.py +0 -0
  121. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l1b/glows_l1b.py +0 -0
  122. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l1b/glows_l1b_data.py +0 -0
  123. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l2/glows_l2.py +0 -0
  124. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l2/glows_l2_data.py +0 -0
  125. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/packet_definitions/GLX_COMBINED.xml +0 -0
  126. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/packet_definitions/P_GLX_TMSCDE.xml +0 -0
  127. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/packet_definitions/P_GLX_TMSCHIST.xml +0 -0
  128. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/utils/__init__.py +0 -0
  129. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/utils/constants.py +0 -0
  130. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/__init__.py +0 -0
  131. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/hi_goodtimes.py +0 -0
  132. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/hi_l1a.py +0 -0
  133. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/hi_l1b.py +0 -0
  134. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/hi_l1c.py +0 -0
  135. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/hi_l2.py +0 -0
  136. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/packet_definitions/TLM_HI_COMBINED_SCI.xml +0 -0
  137. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/packet_definitions/__init__.py +0 -0
  138. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/utils.py +0 -0
  139. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/__init__.py +0 -0
  140. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/hit_utils.py +0 -0
  141. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l0/__init__.py +0 -0
  142. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l0/constants.py +0 -0
  143. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l0/decom_hit.py +0 -0
  144. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l1a/__init__.py +0 -0
  145. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l1a/hit_l1a.py +0 -0
  146. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l1b/constants.py +0 -0
  147. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l1b/hit_l1b.py +0 -0
  148. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l2/constants.py +0 -0
  149. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l2/hit_l2.py +0 -0
  150. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/packet_definitions/hit_packet_definitions.xml +0 -0
  151. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/__init__.py +0 -0
  152. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/constants.py +0 -0
  153. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/generate_coverage.py +0 -0
  154. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/__init__.py +0 -0
  155. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/ialirt_spice.py +0 -0
  156. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/mag_l0_ialirt_data.py +0 -0
  157. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/parse_mag.py +0 -0
  158. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/process_codice.py +0 -0
  159. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/process_hit.py +0 -0
  160. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/process_status.py +0 -0
  161. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/process_swapi.py +0 -0
  162. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/process_swe.py +0 -0
  163. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/__init__.py +0 -0
  164. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt.xml +0 -0
  165. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +0 -0
  166. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +0 -0
  167. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_hit.xml +0 -0
  168. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_mag.xml +0 -0
  169. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +0 -0
  170. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_swe.xml +0 -0
  171. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/process_ephemeris.py +0 -0
  172. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/utils/constants.py +0 -0
  173. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/utils/create_xarray.py +0 -0
  174. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/utils/grouping.py +0 -0
  175. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/utils/time.py +0 -0
  176. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/__init__.py +0 -0
  177. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/atomic_masses.csv +0 -0
  178. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/decode.py +0 -0
  179. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/evt_msg_decode_utils.py +0 -0
  180. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_constants.py +0 -0
  181. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_evt_msg_parsing_dictionaries.json +0 -0
  182. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_l0.py +0 -0
  183. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_l1a.py +0 -0
  184. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_l1b.py +0 -0
  185. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_utils.py +0 -0
  186. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +0 -0
  187. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/packet_definitions/idex_housekeeping_packet_definition.xml +0 -0
  188. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/packet_definitions/idex_science_packet_definition.xml +0 -0
  189. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/__init__.py +0 -0
  190. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/ancillary_data/imap_lo_bootstrap-correction-factors_v001.csv +0 -0
  191. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/ancillary_data/imap_lo_hydrogen-geometric-factor_v001.csv +0 -0
  192. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/ancillary_data/imap_lo_oxygen-geometric-factor_v001.csv +0 -0
  193. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/ancillary_data/imap_lo_sputter-correction-factors_v001.csv +0 -0
  194. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/__init__.py +0 -0
  195. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/decompression_tables/decompression_tables.py +0 -0
  196. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/decompression_tables/log10_12_to_16_bit_uncompress.csv +0 -0
  197. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/decompression_tables/log10_8_to_12_bit_uncompress.csv +0 -0
  198. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/decompression_tables/log10_8_to_16_bit_uncompress.csv +0 -0
  199. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/lo_apid.py +0 -0
  200. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/lo_science.py +0 -0
  201. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/lo_star_sensor.py +0 -0
  202. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/utils/binary_string.py +0 -0
  203. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/utils/bit_decompression.py +0 -0
  204. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l1a/__init__.py +0 -0
  205. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l1a/lo_l1a.py +0 -0
  206. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l1b/tof_conversions.py +0 -0
  207. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l1c/lo_l1c.py +0 -0
  208. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l2/lo_l2.py +0 -0
  209. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/lo_ancillary.py +0 -0
  210. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/packet_definitions/lo_xtce.xml +0 -0
  211. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/__init__.py +0 -0
  212. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/constants.py +0 -0
  213. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/imap_mag_sdc_configuration_v001.py +0 -0
  214. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l0/decom_mag.py +0 -0
  215. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l0/mag_l0_data.py +0 -0
  216. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1a/mag_l1a.py +0 -0
  217. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1a/mag_l1a_data.py +0 -0
  218. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1b/imap_mag_l1b-calibration_20240229_v002.cdf +0 -0
  219. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1b/mag_l1b.py +0 -0
  220. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1c/interpolation_methods.py +0 -0
  221. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1c/mag_l1c.py +0 -0
  222. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1d/__init__.py +0 -0
  223. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1d/mag_l1d.py +0 -0
  224. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1d/mag_l1d_data.py +0 -0
  225. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l2/__init__.py +0 -0
  226. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l2/mag_l2.py +0 -0
  227. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l2/mag_l2_data.py +0 -0
  228. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/packet_definitions/MAG_SCI_COMBINED.xml +0 -0
  229. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/quality_flags.py +0 -0
  230. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spacecraft/packet_definitions/scid_x252.xml +0 -0
  231. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spacecraft/quaternions.py +0 -0
  232. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/__init__.py +0 -0
  233. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/config.py +0 -0
  234. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/geometry.py +0 -0
  235. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/pointing_frame.py +0 -0
  236. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/repoint.py +0 -0
  237. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/spin.py +0 -0
  238. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/__init__.py +0 -0
  239. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/constants.py +0 -0
  240. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/l1/__init__.py +0 -0
  241. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/l1/swapi_l1.py +0 -0
  242. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/l2/__init__.py +0 -0
  243. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/l2/swapi_l2.py +0 -0
  244. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/packet_definitions/__init__.py +0 -0
  245. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/packet_definitions/swapi_packet_definition.xml +0 -0
  246. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/swapi_utils.py +0 -0
  247. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/__init__.py +0 -0
  248. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/l1a/__init__.py +0 -0
  249. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/l1a/swe_l1a.py +0 -0
  250. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/l1a/swe_science.py +0 -0
  251. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/l1b/swe_l1b.py +0 -0
  252. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/l2/swe_l2.py +0 -0
  253. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/packet_definitions/__init__.py +0 -0
  254. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/packet_definitions/swe_packet_definition.xml +0 -0
  255. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/utils/__init__.py +0 -0
  256. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/utils/swe_constants.py +0 -0
  257. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/utils/swe_utils.py +0 -0
  258. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/__init__.py +0 -0
  259. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/constants.py +0 -0
  260. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l0/__init__.py +0 -0
  261. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l0/decom_tools.py +0 -0
  262. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l0/decom_ultra.py +0 -0
  263. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l0/ultra_utils.py +0 -0
  264. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1a/__init__.py +0 -0
  265. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1a/ultra_l1a.py +0 -0
  266. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/badtimes.py +0 -0
  267. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/de.py +0 -0
  268. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/extendedspin.py +0 -0
  269. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/goodtimes.py +0 -0
  270. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/lookup_utils.py +0 -0
  271. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/quality_flag_filters.py +0 -0
  272. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/ultra_l1b.py +0 -0
  273. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/ultra_l1b_annotated.py +0 -0
  274. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/ultra_l1b_culling.py +0 -0
  275. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/ultra_l1b_extended.py +0 -0
  276. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/helio_pset.py +0 -0
  277. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/l1c_lookup_utils.py +0 -0
  278. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/make_helio_index_maps.py +0 -0
  279. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/imap_001.tf +0 -0
  280. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/imap_science_100.tf +0 -0
  281. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/imap_science_120.tf +0 -0
  282. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/imap_sclk_0000.tsc +0 -0
  283. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/imap_spk_demo.bsp +0 -0
  284. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/naif0012.tls +0 -0
  285. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/sim_1yr_imap_attitude.bc +0 -0
  286. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/sim_1yr_imap_pointing_frame.bc +0 -0
  287. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/spacecraft_pset.py +0 -0
  288. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/ultra_l1c.py +0 -0
  289. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/ultra_l1c_culling.py +0 -0
  290. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +0 -0
  291. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l2/__init__.py +0 -0
  292. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l2/ultra_l2.py +0 -0
  293. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/packet_definitions/README.md +0 -0
  294. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +0 -0
  295. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/packet_definitions/__init__.py +0 -0
  296. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/utils/__init__.py +0 -0
  297. {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/utils/ultra_l1_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: imap-processing
3
- Version: 1.0.31
3
+ Version: 1.0.32
4
4
  Summary: IMAP Science Operations Center Processing
5
5
  License: 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.31"
3
- __version_tuple__ = (1, 0, 31)
2
+ __version__ = "1.0.32"
3
+ __version_tuple__ = (1, 0, 32)
@@ -902,6 +902,7 @@ de_2d_attrs:
902
902
  DEPEND_0: epoch
903
903
  DEPEND_1: priority
904
904
  DICT_KEY: SPASE>Support>SupportQuantity:Other
905
+ DISPLAY_TYPE: spectogram
905
906
  FIELDNAM: Direct Event Data
906
907
  FILLVAL: -9223372036854775808
907
908
  FORMAT: I5
@@ -919,6 +920,7 @@ de_3d_attrs:
919
920
  DEPEND_1: priority
920
921
  DEPEND_2: event_num
921
922
  DICT_KEY: SPASE>Support>SupportQuantity:Other
923
+ DISPLAY_TYPE: spectogram
922
924
  FIELDNAM: Direct Event Data
923
925
  FILLVAL: -9223372036854775808
924
926
  FORMAT: I{num_digits}
@@ -87,6 +87,10 @@ from imap_processing.ultra.l1a import ultra_l1a
87
87
  from imap_processing.ultra.l1b import ultra_l1b
88
88
  from imap_processing.ultra.l1c import ultra_l1c
89
89
  from imap_processing.ultra.l2 import ultra_l2
90
+ from imap_processing.utils import (
91
+ check_epochs_within_day_offsets,
92
+ filter_day_boundary_data,
93
+ )
90
94
 
91
95
  logger = logging.getLogger(__name__)
92
96
 
@@ -618,6 +622,8 @@ class Codice(ProcessInstrument):
618
622
  if self.data_level == "l1a":
619
623
  # process data
620
624
  datasets = codice_l1a.process_l1a(dependencies)
625
+ for i, ds in enumerate(datasets):
626
+ datasets[i] = filter_day_boundary_data(ds, self.start_date)
621
627
 
622
628
  if self.data_level == "l1b":
623
629
  science_files = dependencies.get_file_paths(source="codice")
@@ -1406,6 +1412,10 @@ class Mag(ProcessInstrument):
1406
1412
  f"Timestamps for output file {ds.attrs['Logical_source']} are not "
1407
1413
  f"monotonically increasing."
1408
1414
  )
1415
+
1416
+ # Will raise an error if any timestamps are outside the current day
1417
+ check_epochs_within_day_offsets(datasets, current_day)
1418
+
1409
1419
  return datasets
1410
1420
 
1411
1421
  def post_processing(
@@ -1568,6 +1578,8 @@ class Swapi(ProcessInstrument):
1568
1578
 
1569
1579
  # process science or housekeeping data
1570
1580
  datasets = swapi_l1(dependencies, descriptor=self.descriptor)
1581
+ for i, ds in enumerate(datasets):
1582
+ datasets[i] = filter_day_boundary_data(ds, self.start_date)
1571
1583
  elif self.data_level == "l2":
1572
1584
  if len(dependency_list) != 3:
1573
1585
  raise ValueError(
@@ -1624,6 +1636,8 @@ class Swe(ProcessInstrument):
1624
1636
  )
1625
1637
  science_files = dependencies.get_file_paths(source="swe")
1626
1638
  datasets = swe_l1a(str(science_files[0]))
1639
+ for i, ds in enumerate(datasets):
1640
+ datasets[i] = filter_day_boundary_data(ds, self.start_date)
1627
1641
  # Right now, we only process science data. Therefore,
1628
1642
  # we expect only one dataset to be returned.
1629
1643
 
@@ -19,7 +19,6 @@ from imap_processing.codice.codice_l1a_hi_counters_singles import (
19
19
  from imap_processing.codice.codice_l1a_hi_omni import l1a_hi_omni
20
20
  from imap_processing.codice.codice_l1a_hi_priority import l1a_hi_priority
21
21
  from imap_processing.codice.codice_l1a_hi_sectored import l1a_hi_sectored
22
- from imap_processing.codice.codice_l1a_lo_angular import l1a_lo_angular
23
22
  from imap_processing.codice.codice_l1a_lo_counters_aggregated import (
24
23
  l1a_lo_counters_aggregated,
25
24
  )
@@ -83,17 +82,6 @@ def process_l1a( # noqa: PLR0912
83
82
  datasets.append(
84
83
  process_by_table_id(datasets_by_apid[apid], lut_file, l1a_lo_species)
85
84
  )
86
- elif apid == CODICEAPID.COD_LO_NSW_SPECIES_COUNTS:
87
- logger.info("Processing Lo NSW Species Counts")
88
- datasets.append(
89
- process_by_table_id(datasets_by_apid[apid], lut_file, l1a_lo_species)
90
- )
91
- elif apid == CODICEAPID.COD_LO_SW_ANGULAR_COUNTS:
92
- logger.info("Processing Lo SW Angular Counts")
93
- datasets.append(l1a_lo_angular(datasets_by_apid[apid], lut_file))
94
- elif apid == CODICEAPID.COD_LO_NSW_ANGULAR_COUNTS:
95
- logger.info("Processing Lo NSW Angular Counts")
96
- datasets.append(l1a_lo_angular(datasets_by_apid[apid], lut_file))
97
85
  elif apid == CODICEAPID.COD_HI_OMNI_SPECIES_COUNTS:
98
86
  datasets.append(
99
87
  process_by_table_id(datasets_by_apid[apid], lut_file, l1a_hi_omni)
@@ -11,7 +11,6 @@ from imap_processing.codice import constants
11
11
  from imap_processing.codice.constants import (
12
12
  HALF_SPIN_FILLVAL,
13
13
  LO_IALIRT_VARIABLE_NAMES,
14
- LO_NSW_SPECIES_VARIABLE_NAMES,
15
14
  LO_SW_SPECIES_VARIABLE_NAMES,
16
15
  )
17
16
  from imap_processing.codice.decompress import decompress
@@ -28,7 +27,7 @@ from imap_processing.spice.time import met_to_ttj2000ns
28
27
  logger = logging.getLogger(__name__)
29
28
 
30
29
 
31
- def l1a_lo_species( # noqa: PLR0912
30
+ def l1a_lo_species(
32
31
  group_ds: xr.Dataset,
33
32
  lut_file: Path,
34
33
  table_id: str,
@@ -73,7 +72,7 @@ def l1a_lo_species( # noqa: PLR0912
73
72
  raise ValueError("Unsupported sensor ID for Lo species processing.")
74
73
 
75
74
  # ========= Decompress and Reshape Data ===========
76
- # Lookup SW or NSW species based on APID
75
+ # Lookup SW species based on APID
77
76
  if view_tab_obj.apid == CODICEAPID.COD_LO_SW_SPECIES_COUNTS:
78
77
  actual_species_names = sci_lut_data["data_product_lo_tab"]["0"]["species"][
79
78
  "sw"
@@ -85,28 +84,6 @@ def l1a_lo_species( # noqa: PLR0912
85
84
  + LO_SW_SPECIES_VARIABLE_NAMES
86
85
  )
87
86
  logical_source_id = "imap_codice_l1a_lo-sw-species"
88
- elif view_tab_obj.apid == CODICEAPID.COD_LO_NSW_SPECIES_COUNTS:
89
- actual_species_names = sci_lut_data["data_product_lo_tab"]["0"]["species"][
90
- "nsw"
91
- ]["species_names"]
92
- desired_species_names = set(
93
- sci_lut_data["data_product_lo_tab"]["0"]["species"]["nsw"][
94
- "desired_species_names"
95
- ]
96
- + LO_NSW_SPECIES_VARIABLE_NAMES
97
- )
98
- logical_source_id = "imap_codice_l1a_lo-nsw-species"
99
- # Rename "cnoplus" to "junk" if we are processing NSW angular data. Although
100
- # cnoplus is in desired, and actual species name in the LUT, it is referencing
101
- # different "cnoplus" data his is to handle the bug in which the spacecraft was
102
- # sending data down "off by one" and getting mislabeled. The cnoplus data we
103
- # are referencing is actually data that we want to toss out and fill with
104
- # fill vals. This only affects data before the LUT was updated
105
- # (table_id 3978152295).
106
- if int(table_id) <= 3978152295:
107
- actual_species_names = [
108
- "junk" if name == "cnoplus" else name for name in actual_species_names
109
- ]
110
87
  elif view_tab_obj.apid == CODICEAPID.COD_LO_IAL:
111
88
  actual_species_names = sci_lut_data["data_product_lo_tab"]["0"]["ialirt"]["sw"][
112
89
  "species_names"
@@ -67,8 +67,6 @@ def convert_to_rates(dataset: xr.Dataset, descriptor: str) -> np.ndarray:
67
67
  if descriptor in [
68
68
  "lo-counters-aggregated",
69
69
  "lo-counters-singles",
70
- "lo-nsw-angular",
71
- "lo-sw-angular",
72
70
  "lo-nsw-priority",
73
71
  "lo-sw-priority",
74
72
  ]:
@@ -93,7 +91,6 @@ def convert_to_rates(dataset: xr.Dataset, descriptor: str) -> np.ndarray:
93
91
  ]
94
92
  dataset = dataset.drop_vars(drop_variables)
95
93
  elif descriptor in [
96
- "lo-nsw-species",
97
94
  "lo-sw-species",
98
95
  "lo-ialirt",
99
96
  ]:
@@ -28,18 +28,13 @@ from imap_processing.codice.constants import (
28
28
  HI_OMNI_VARIABLE_NAMES,
29
29
  HI_SECTORED_VARIABLE_NAMES,
30
30
  L2_HI_SECTORED_ANGLE,
31
- LO_NSW_ANGULAR_VARIABLE_NAMES,
32
- LO_NSW_SPECIES_VARIABLE_NAMES,
33
31
  LO_POSITION_TO_ELEVATION_ANGLE,
34
- LO_SW_ANGULAR_VARIABLE_NAMES,
35
32
  LO_SW_PICKUP_ION_SPECIES_VARIABLE_NAMES,
36
33
  LO_SW_SOLAR_WIND_SPECIES_VARIABLE_NAMES,
37
- NSW_POSITIONS,
38
34
  PUI_POSITIONS,
39
35
  SOLAR_WIND_POSITIONS,
40
36
  SSD_ID_TO_ELEVATION,
41
37
  SSD_ID_TO_SPIN_ANGLE,
42
- SW_POSITIONS,
43
38
  )
44
39
  from imap_processing.codice.utils import apply_replacements_to_attrs
45
40
 
@@ -571,156 +566,6 @@ def process_lo_species_intensity(
571
566
  return dataset
572
567
 
573
568
 
574
- def process_lo_angular_intensity(
575
- dataset: xr.Dataset,
576
- species_list: list,
577
- geometric_factors: xr.DataArray,
578
- efficiency: pd.DataFrame,
579
- positions: list,
580
- ) -> xr.Dataset:
581
- """
582
- Process the lo-species L2 dataset to calculate angular intensities.
583
-
584
- Parameters
585
- ----------
586
- dataset : xarray.Dataset
587
- The L2 dataset to process.
588
- species_list : list
589
- List of species variable names to calculate intensity.
590
- geometric_factors : xarray.DataArray
591
- The geometric factors array with shape (epoch, esa_steps).
592
- efficiency : pandas.DataFrame
593
- The efficiency lookup table.
594
- positions : list
595
- A list of position indices to select from the geometric factor and
596
- efficiency lookup tables.
597
-
598
- Returns
599
- -------
600
- xarray.Dataset
601
- The updated L2 dataset with angular intensities calculated.
602
- """
603
- # Calculate the angular intensities using the provided geometric factors and
604
- # efficiency.
605
- dataset = calculate_intensity(
606
- dataset,
607
- species_list,
608
- geometric_factors,
609
- efficiency,
610
- positions,
611
- average_across_positions=False,
612
- )
613
-
614
- # transform positions to elevation angles
615
- if positions == SW_POSITIONS:
616
- pos_to_el = LO_POSITION_TO_ELEVATION_ANGLE["sw"]
617
- position_index_to_adjust = 0
618
- direction = "Sunward"
619
- elif positions == NSW_POSITIONS:
620
- pos_to_el = LO_POSITION_TO_ELEVATION_ANGLE["nsw"]
621
- position_index_to_adjust = 9
622
- direction = "Non-Sunward"
623
- else:
624
- raise ValueError("Unknown positions for elevation angle mapping.")
625
-
626
- # Create a new coordinate for elevation_angle based on inst_az
627
- dataset = dataset.assign_coords(
628
- elevation_angle=(
629
- "inst_az",
630
- [pos_to_el[pos] for pos in dataset["inst_az"].data],
631
- )
632
- )
633
- # add uncertainties to species list
634
- species_list = species_list + [f"unc_{var}" for var in species_list]
635
-
636
- # Take the mean across elevation angles and restore the original dimension order
637
- dataset_converted = (
638
- dataset[species_list]
639
- .groupby("elevation_angle")
640
- .sum(keep_attrs=True, skipna=False) # One position should always contain zeros
641
- # so sum is safe
642
- # Restore original dimension order because groupby moves the grouped
643
- # dimension to the front
644
- .transpose("epoch", "esa_step", "spin_sector", "elevation_angle", ...)
645
- )
646
- # Create a new coordinate for spin angle based on spin_sector
647
- # Use equation from section 11.2.2 of algorithm document
648
- dataset = dataset.assign_coords(
649
- spin_angle=("spin_sector", dataset["spin_sector"].data * 15.0 + 7.5)
650
- )
651
- dataset = dataset.drop_vars(species_list).merge(dataset_converted)
652
-
653
- # Positions 0 and 10 only observe half of the 24 spins for each esa step.
654
- # To account for this, we replicate the counts observed in position 0 and 10 for
655
- # each esa step to either spin angles 0-11 or 12-23, depending on the pixel
656
- # orientation (A/B). See section 11.2.2 of the CoDICE algorithm document
657
- # Use the variable "half_spin_per_esa_step" to determine the pixel orientations.
658
- # When the half spin number is even, the configuration is A and when the half spin
659
- # is odd, the configuration is B.
660
- # TODO handle when half_spin_per_esa_step changes in the middle of the dataset
661
- half_spin_per_esa_step = dataset["half_spin_per_esa_step"].data[0]
662
- # only consider valid half spin values
663
- valid_half_spin = half_spin_per_esa_step != HALF_SPIN_FILLVAL
664
- a_inds = np.nonzero(valid_half_spin & (half_spin_per_esa_step % 2 == 0))[0]
665
- b_inds = np.nonzero(valid_half_spin & (half_spin_per_esa_step % 2 == 1))[0]
666
-
667
- position_index = position_index_to_adjust
668
- for species in species_list:
669
- # Create a copy of the dataset to avoid modifying the original
670
- species_data = dataset[species].data.copy()
671
- # Determine the correct spin indices based on the position
672
- spin_sectors = dataset["spin_sector"].data
673
- spin_inds_1 = np.where(spin_sectors >= 12)[0]
674
- spin_inds_2 = np.where(spin_sectors < 12)[0]
675
-
676
- # if position_index is 9, swap the spin indices
677
- if position_index == 9:
678
- spin_inds_1, spin_inds_2 = spin_inds_2, spin_inds_1
679
-
680
- # Assign the values to the correct positions and spin sectors
681
- dataset[species].values[
682
- :, a_inds[:, np.newaxis], spin_inds_1, position_index
683
- ] = species_data[:, a_inds[:, np.newaxis], spin_inds_2, position_index]
684
-
685
- dataset[species].values[
686
- :, b_inds[:, np.newaxis], spin_inds_2, position_index
687
- ] = species_data[:, b_inds[:, np.newaxis], spin_inds_1, position_index]
688
- cdf_attrs = ImapCdfAttributes()
689
- cdf_attrs.add_instrument_variable_attrs("codice", "l2-lo-angular")
690
- species_attrs = cdf_attrs.get_variable_attributes("lo-angular-attrs")
691
- unc_attrs = cdf_attrs.get_variable_attributes("lo-angular-unc-attrs")
692
-
693
- # update species attrs
694
- for species in species_list:
695
- attrs = unc_attrs if "unc" in species else species_attrs
696
- # Replace {species} and {direction} in attrs
697
- attrs = apply_replacements_to_attrs(
698
- attrs, {"species": species, "direction": direction}
699
- )
700
- dataset[species].attrs.update(attrs)
701
-
702
- # make sure elevation_angle is a coordinate and has the right attrs
703
- dataset["elevation_angle"].attrs.update(
704
- cdf_attrs.get_variable_attributes("elevation_angle", check_schema=False)
705
- )
706
- dataset["elevation_angle_label"] = xr.DataArray(
707
- dataset["elevation_angle"].data.astype(str),
708
- dims=("elevation_angle",),
709
- attrs=cdf_attrs.get_variable_attributes(
710
- "elevation_angle_label", check_schema=False
711
- ),
712
- )
713
- # update spin angle attributes
714
- dataset["spin_angle"].attrs = cdf_attrs.get_variable_attributes(
715
- "spin_angle", check_schema=False
716
- )
717
- # update spin sector attributes
718
- dataset["spin_sector"].attrs = cdf_attrs.get_variable_attributes(
719
- "spin_sector", check_schema=False
720
- )
721
- return dataset
722
-
723
-
724
569
  def process_hi_omni(dependencies: ProcessingInputCollection) -> xr.Dataset:
725
570
  """
726
571
  Process the hi-omni L1B dataset to calculate omni-directional intensities.
@@ -1517,9 +1362,6 @@ def process_codice_l2(
1517
1362
  # Compute geometric factors needed for intensity calculations
1518
1363
  if dataset_name in [
1519
1364
  "imap_codice_l2_lo-sw-species",
1520
- "imap_codice_l2_lo-nsw-species",
1521
- "imap_codice_l2_lo-nsw-angular",
1522
- "imap_codice_l2_lo-sw-angular",
1523
1365
  ]:
1524
1366
  cdf_attrs = ImapCdfAttributes()
1525
1367
  cdf_attrs.add_instrument_global_attrs("codice")
@@ -1556,57 +1398,6 @@ def process_codice_l2(
1556
1398
  l2_dataset.attrs.update(
1557
1399
  cdf_attrs.get_global_attributes("imap_codice_l2_lo-sw-species")
1558
1400
  )
1559
- elif dataset_name == "imap_codice_l2_lo-nsw-species":
1560
- geometric_factors = compute_geometric_factors(
1561
- l2_dataset, geometric_factor_lookup
1562
- )
1563
- # Filter the efficiency lookup table for non-solar wind efficiencies
1564
- efficiencies = efficiency_lookup[efficiency_lookup["product"] == "nsw"]
1565
- # Calculate the non-sunward species intensities using equation
1566
- # described in section 11.2.3 of algorithm document.
1567
- l2_dataset = process_lo_species_intensity(
1568
- l2_dataset,
1569
- LO_NSW_SPECIES_VARIABLE_NAMES,
1570
- geometric_factors,
1571
- efficiencies,
1572
- NSW_POSITIONS,
1573
- )
1574
- l2_dataset.attrs.update(
1575
- cdf_attrs.get_global_attributes("imap_codice_l2_lo-nsw-species")
1576
- )
1577
- elif dataset_name == "imap_codice_l2_lo-sw-angular":
1578
- geometric_factors = compute_geometric_factors(
1579
- l2_dataset, geometric_factor_lookup, angular_product=True
1580
- )
1581
- efficiencies = efficiency_lookup[efficiency_lookup["product"] == "sw"]
1582
- # Calculate the sunward solar wind angular intensities using equation
1583
- # described in section 11.2.2 of algorithm document.
1584
- l2_dataset = process_lo_angular_intensity(
1585
- l2_dataset,
1586
- LO_SW_ANGULAR_VARIABLE_NAMES,
1587
- geometric_factors,
1588
- efficiencies,
1589
- SW_POSITIONS,
1590
- )
1591
- l2_dataset.attrs.update(
1592
- cdf_attrs.get_global_attributes("imap_codice_l2_lo-sw-angular")
1593
- )
1594
- if dataset_name == "imap_codice_l2_lo-nsw-angular":
1595
- geometric_factors = compute_geometric_factors(
1596
- l2_dataset, geometric_factor_lookup, angular_product=True
1597
- )
1598
- # Calculate the non sunward angular intensities
1599
- efficiencies = efficiency_lookup[efficiency_lookup["product"] == "nsw"]
1600
- l2_dataset = process_lo_angular_intensity(
1601
- l2_dataset,
1602
- LO_NSW_ANGULAR_VARIABLE_NAMES,
1603
- geometric_factors,
1604
- efficiencies,
1605
- NSW_POSITIONS,
1606
- )
1607
- l2_dataset.attrs.update(
1608
- cdf_attrs.get_global_attributes("imap_codice_l2_lo-nsw-angular")
1609
- )
1610
1401
 
1611
1402
  if dataset_name in [
1612
1403
  "imap_codice_l2_hi-counters-singles",
@@ -846,21 +846,12 @@ L1B_DATA_PRODUCT_CONFIGURATIONS: dict[str, dict] = {
846
846
  "lo-counters-singles": {
847
847
  "num_spin_sectors": 2,
848
848
  },
849
- "lo-nsw-angular": {
850
- "num_spin_sectors": 1,
851
- },
852
- "lo-sw-angular": {
853
- "num_spin_sectors": 1,
854
- },
855
849
  "lo-nsw-priority": {
856
850
  "num_spin_sectors": 1,
857
851
  },
858
852
  "lo-sw-priority": {
859
853
  "num_spin_sectors": 1,
860
854
  },
861
- "lo-nsw-species": {
862
- "num_spin_sectors": 12,
863
- },
864
855
  "lo-sw-species": {
865
856
  "num_spin_sectors": 12,
866
857
  },
@@ -890,16 +881,6 @@ LO_SW_PICKUP_ION_SPECIES_VARIABLE_NAMES = [
890
881
  "heplus",
891
882
  "cnoplus",
892
883
  ]
893
- LO_NSW_SPECIES_VARIABLE_NAMES = [
894
- "hplus",
895
- "heplusplus",
896
- "c",
897
- "o",
898
- "ne_si_mg",
899
- "fe",
900
- "heplus",
901
- "cnoplus",
902
- ]
903
884
  HI_OMNI_VARIABLE_NAMES = ["h", "he3", "he4", "c", "o", "ne_mg_si", "fe", "uh", "junk"]
904
885
  HI_SECTORED_VARIABLE_NAMES = ["h", "he3he4", "cno", "fe"]
905
886
  HI_PRIORITY_VARIABLE_NAMES = [
@@ -338,6 +338,25 @@ def generate_histogram_dataset(
338
338
  )
339
339
  hist_l1a_list = valid_hists
340
340
 
341
+ # Deduplicate by (imap_start_time, imap_time_offset), keeping the first occurrence.
342
+ seen_times: dict = {}
343
+ for hist in hist_l1a_list:
344
+ key = (
345
+ hist.imap_start_time.seconds,
346
+ hist.imap_start_time.subseconds,
347
+ hist.imap_time_offset.seconds,
348
+ hist.imap_time_offset.subseconds,
349
+ )
350
+ if key not in seen_times:
351
+ seen_times[key] = hist
352
+ dedup_hists = list(seen_times.values())
353
+ if len(dedup_hists) < len(hist_l1a_list):
354
+ logger.warning(
355
+ f"GLOWS: Filtered out {len(hist_l1a_list) - len(dedup_hists)} "
356
+ f"duplicate histogram(s) by imap_start_time and imap_time_offset."
357
+ )
358
+ hist_l1a_list = dedup_hists
359
+
341
360
  # Store timestamps for each HistogramL1A object.
342
361
  time_data: np.ndarray = np.zeros(len(hist_l1a_list), dtype=np.int64)
343
362
  # Data in lists, for each of the 25 time varying datapoints in HistogramL1A
@@ -50,7 +50,7 @@ def packets_created(start_file_creation: datetime, lines: list) -> dict:
50
50
  # Handle end of year rollover
51
51
  prev = prev_doy[station]
52
52
 
53
- if prev is not None and doy < prev:
53
+ if prev is not None and doy < prev and prev > 300 and doy < 30:
54
54
  station_year[station] += 1
55
55
 
56
56
  prev_doy[station] = doy
@@ -300,6 +300,48 @@ def idex_l2a(l1b_dataset: xr.Dataset, ancillary_files: dict) -> xr.Dataset:
300
300
  "target_fit_parameter_labels", check_schema=False
301
301
  ),
302
302
  )
303
+
304
+ # We're inserting a NaN block here for the 2026 June release while the
305
+ # IDEX science team works through validating the fitting routines and
306
+ # derived values.
307
+
308
+ # Ion Grid Fitting:
309
+ l2a_dataset["ion_grid_dust_mass_estimate"].data = np.full(
310
+ l2a_dataset["ion_grid_dust_mass_estimate"].shape, np.nan
311
+ )
312
+
313
+ l2a_dataset["ion_grid_velocity_estimate"].data = np.full(
314
+ l2a_dataset["ion_grid_velocity_estimate"].shape, np.nan
315
+ )
316
+
317
+ # TOF / Mass-spec Fitting
318
+ l2a_dataset["tof_peak_area_under_fit"].data = np.full(
319
+ l2a_dataset["tof_peak_area_under_fit"].shape, np.nan
320
+ )
321
+
322
+ l2a_dataset["tof_peak_chi_square"].data = np.full(
323
+ l2a_dataset["tof_peak_chi_square"].shape, np.nan
324
+ )
325
+
326
+ l2a_dataset["tof_peak_fit_parameters"].data = np.full(
327
+ l2a_dataset["tof_peak_fit_parameters"].shape, np.nan
328
+ )
329
+
330
+ l2a_dataset["tof_peak_kappa"].data = np.full(
331
+ l2a_dataset["tof_peak_kappa"].shape, np.nan
332
+ )
333
+
334
+ l2a_dataset["tof_peak_reduced_chi_square"].data = np.full(
335
+ l2a_dataset["tof_peak_reduced_chi_square"].shape, np.nan
336
+ )
337
+
338
+ l2a_dataset["tof_snr"].data = np.full(l2a_dataset["tof_snr"].shape, np.nan)
339
+
340
+ l2a_dataset["mass"].data = np.full(l2a_dataset["mass"].shape, np.nan)
341
+
342
+ l2a_dataset["mass_scale"].data = np.full(l2a_dataset["mass_scale"].shape, np.nan)
343
+ # End NaN block
344
+
303
345
  logger.info("IDEX L2A science data processing completed.")
304
346
  l2a_dataset.attrs.update(idex_attrs.get_global_attributes("imap_idex_l2a_sci"))
305
347
  return l2a_dataset
@@ -334,29 +376,66 @@ def calculate_velocity_and_mass(
334
376
  mass_est : float
335
377
  Estimated mass.
336
378
  """
379
+ v_est = invert_rise_time_to_velocity(t_rise, t_rise_params)
380
+ if not np.isfinite(v_est):
381
+ return np.nan, np.nan
382
+
383
+ log_a_y: float = float(yield_params[0])
384
+ yield_val = 10 ** log_smooth_powerlaw(np.log10(v_est), log_a_y, yield_params[1:])
385
+ sig_amp_coulombs = sig_amp * idex_constants.PICOCOULOMB_TO_COULOMB
386
+ mass_est = sig_amp_coulombs / yield_val
387
+
388
+ return v_est, mass_est
389
+
390
+
391
+ def invert_rise_time_to_velocity(t_rise: float, t_rise_params: np.ndarray) -> float:
392
+ """
393
+ Invert the rise-time calibration to estimate impact velocity.
394
+
395
+ The rise-time calibration is defined in the forward direction as
396
+ rise_time = f(velocity). This helper numerically inverts that relation to recover
397
+ velocity from a fitted rise time.
398
+
399
+ Parameters
400
+ ----------
401
+ t_rise : float
402
+ Fitted target rise time in microseconds.
403
+ t_rise_params : np.ndarray
404
+ Calibration parameters for the forward rise-time curve
405
+ [A, a1, a2, a3, vb, vc, k, m].
406
+
407
+ Returns
408
+ -------
409
+ float
410
+ Estimated impact velocity in km/s, or NaN if the inversion fails.
411
+ """
412
+ if not np.isfinite(t_rise) or t_rise <= 0.0:
413
+ logger.error(
414
+ "Unable to calculate velocity estimate from rise time %.6g. "
415
+ "Rise time must be finite and positive. Returning nan.",
416
+ t_rise,
417
+ )
418
+ return np.nan
419
+
337
420
  log_a_t: float = float(t_rise_params[0])
421
+ target_log_t_rise = np.log10(t_rise)
338
422
  try:
339
423
  root = root_scalar(
340
- lambda lv: (
341
- log_smooth_powerlaw(lv, log_a_t, t_rise_params[1:]) - np.log10(t_rise)
424
+ lambda log_v: (
425
+ log_smooth_powerlaw(log_v, log_a_t, t_rise_params[1:])
426
+ - target_log_t_rise
342
427
  ),
343
428
  bracket=[-1, 2],
429
+ method="brentq",
344
430
  )
345
- v_est = 10**root.root
431
+ return 10**root.root
346
432
  except Exception:
347
433
  logger.error(
348
- "Unable to calculate velocity and mass estimate. "
349
- "The root finding failed for power law function. "
350
- "Returning nans for the estimate."
434
+ "Unable to calculate velocity estimate from rise time %.6g. "
435
+ "The rise-time calibration inversion failed. Returning nan.",
436
+ t_rise,
351
437
  )
352
- return np.nan, np.nan
353
-
354
- log_a_y: float = float(yield_params[0])
355
- yield_val = 10 ** log_smooth_powerlaw(np.log10(v_est), log_a_y, yield_params[1:])
356
- sig_amp_coulombs = sig_amp * idex_constants.PICOCOULOMB_TO_COULOMB
357
- mass_est = sig_amp_coulombs / yield_val
358
-
359
- return v_est, mass_est
438
+ return np.nan
360
439
 
361
440
 
362
441
  def log_smooth_powerlaw(log_v: float, log_a: float, params: np.ndarray) -> float:
@@ -364,15 +443,14 @@ def log_smooth_powerlaw(log_v: float, log_a: float, params: np.ndarray) -> float
364
443
  Define a smoothly transitioning power law used by the IDEX calibration curves.
365
444
 
366
445
  This helper is used in two ways:
367
- - rise-time calibration: log10(rise_time [us]) to log10(velocity [km/s])
446
+ - rise-time calibration: log10(velocity [km/s]) to log10(rise_time [us])
368
447
  - yield calibration: log10(velocity [km/s]) to log10(charge_yield [C/kg])
369
448
 
370
449
  Parameters
371
450
  ----------
372
451
  log_v : float
373
452
  The log10 input to the calibration curve.
374
- This is either log10(rise_time [us]) for the rise-time case or
375
- Log10(velocity [km/s]) for the yield case.
453
+ This is log10(velocity [km/s]) for both the rise-time and yield cases.
376
454
  log_a : float
377
455
  Log10 of the calibration scale factor A.
378
456
  params : np.ndarray
@@ -383,7 +461,7 @@ def log_smooth_powerlaw(log_v: float, log_a: float, params: np.ndarray) -> float
383
461
  -------
384
462
  float
385
463
  The calibrated log10 output.
386
- This is either log10(velocity [km/s]) for the rise-time case or
464
+ This is either log10(rise_time [us]) for the rise-time case or
387
465
  log10(charge_yield [C/kg]) for the yield case.
388
466
  """
389
467
  # Unpack the rest of the calibration parameters