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.
- {imap_processing-1.0.31 → imap_processing-1.0.32}/PKG-INFO +1 -1
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/_version.py +2 -2
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +2 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cli.py +14 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a.py +0 -12
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_lo_species.py +2 -25
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1b.py +0 -3
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l2.py +0 -209
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/constants.py +0 -19
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l1a/glows_l1a.py +19 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/calculate_ingest.py +1 -1
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_l2a.py +96 -18
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_l2b.py +32 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/constants.py +13 -8
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l1b/lo_l1b.py +7 -6
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/time.py +22 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/utils.py +86 -1
- {imap_processing-1.0.31 → imap_processing-1.0.32}/pyproject.toml +2 -2
- imap_processing-1.0.31/imap_processing/codice/codice_l1a_lo_angular.py +0 -536
- {imap_processing-1.0.31 → imap_processing-1.0.32}/LICENSE +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/README.md +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ancillary/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ancillary/ancillary_dataset_combiner.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ccsds/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ccsds/ccsds_data.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ccsds/excel_to_xtce.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +0 -0
- {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
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l2-hi-omni_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l2-hi-sectored_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l2-lo-angular_variable_attrs.yaml +0 -0
- {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
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_codice_l2-lo-species_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_constant_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_default_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_enamaps_l2-common_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_enamaps_l2-healpix_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_enamaps_l2-rectangular_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_glows_l1a_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_glows_l1b_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_glows_l2_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hi_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ialirt_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ialirt_l1_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_l2a_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_l2b_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_idex_l2c_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_lo_l1b_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_lo_l1c_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_mag_l1a_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_mag_l1b_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_mag_l2_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_spacecraft_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_spacecraft_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/config/imap_variable_schema.yaml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/imap_cdf_manager.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/cdf/utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_de.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_hi_counters_aggregated.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_hi_counters_singles.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_hi_omni.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_hi_priority.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_hi_sectored.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_ialirt_hi.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_lo_counters_aggregated.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_lo_counters_singles.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_lo_priority.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/data/esa_sweep_values.csv +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/data/lo_stepping_values.csv +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/decompress.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/packet_definitions/P_COD_NHK.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/packet_definitions/imap_codice_packet-definition_20250101_v001.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/packet_definitions/imap_codice_packet-definition_20260129_v001.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/ena_maps.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/coordinates.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/corrections.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/map_utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/naming.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ena_maps/utils/spatial_utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/__init__.py +0 -0
- {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
- {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
- {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
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/imap_glows_pipeline-settings_20250923_v002.json +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/imap_glows_pipeline_settings_v001.json +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/imap_glows_suspected-transients_20250923_v002.dat +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/ancillary/l1b_conversion_table_v001.json +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l0/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l0/decom_glows.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l0/glows_l0_data.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l1a/glows_l1a_data.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l1b/glows_l1b.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l1b/glows_l1b_data.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l2/glows_l2.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/l2/glows_l2_data.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/packet_definitions/GLX_COMBINED.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/packet_definitions/P_GLX_TMSCDE.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/packet_definitions/P_GLX_TMSCHIST.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/utils/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/glows/utils/constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/hi_goodtimes.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/hi_l1a.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/hi_l1b.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/hi_l1c.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/hi_l2.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/packet_definitions/TLM_HI_COMBINED_SCI.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/packet_definitions/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hi/utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/hit_utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l0/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l0/constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l0/decom_hit.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l1a/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l1a/hit_l1a.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l1b/constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l1b/hit_l1b.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l2/constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/l2/hit_l2.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/hit/packet_definitions/hit_packet_definitions.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/generate_coverage.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/ialirt_spice.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/mag_l0_ialirt_data.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/parse_mag.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/process_codice.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/process_hit.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/process_status.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/process_swapi.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/l0/process_swe.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_hit.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_mag.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/packet_definitions/ialirt_swe.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/process_ephemeris.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/utils/constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/utils/create_xarray.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/utils/grouping.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/utils/time.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/atomic_masses.csv +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/decode.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/evt_msg_decode_utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_evt_msg_parsing_dictionaries.json +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_l0.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_l1a.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_l1b.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/packet_definitions/idex_housekeeping_packet_definition.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/idex/packet_definitions/idex_science_packet_definition.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/ancillary_data/imap_lo_bootstrap-correction-factors_v001.csv +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/ancillary_data/imap_lo_hydrogen-geometric-factor_v001.csv +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/ancillary_data/imap_lo_oxygen-geometric-factor_v001.csv +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/ancillary_data/imap_lo_sputter-correction-factors_v001.csv +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/decompression_tables/decompression_tables.py +0 -0
- {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
- {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
- {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
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/lo_apid.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/lo_science.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/lo_star_sensor.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/utils/binary_string.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l0/utils/bit_decompression.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l1a/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l1a/lo_l1a.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l1b/tof_conversions.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l1c/lo_l1c.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/l2/lo_l2.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/lo_ancillary.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/lo/packet_definitions/lo_xtce.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/imap_mag_sdc_configuration_v001.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l0/decom_mag.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l0/mag_l0_data.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1a/mag_l1a.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1a/mag_l1a_data.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1b/imap_mag_l1b-calibration_20240229_v002.cdf +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1b/mag_l1b.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1c/interpolation_methods.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1c/mag_l1c.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1d/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1d/mag_l1d.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l1d/mag_l1d_data.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l2/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l2/mag_l2.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/l2/mag_l2_data.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/mag/packet_definitions/MAG_SCI_COMBINED.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/quality_flags.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spacecraft/packet_definitions/scid_x252.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spacecraft/quaternions.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/config.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/geometry.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/pointing_frame.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/repoint.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/spice/spin.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/l1/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/l1/swapi_l1.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/l2/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/l2/swapi_l2.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/packet_definitions/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/packet_definitions/swapi_packet_definition.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swapi/swapi_utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/l1a/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/l1a/swe_l1a.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/l1a/swe_science.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/l1b/swe_l1b.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/l2/swe_l2.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/packet_definitions/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/packet_definitions/swe_packet_definition.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/utils/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/utils/swe_constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/swe/utils/swe_utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/constants.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l0/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l0/decom_tools.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l0/decom_ultra.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l0/ultra_utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1a/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1a/ultra_l1a.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/badtimes.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/de.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/extendedspin.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/goodtimes.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/lookup_utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/quality_flag_filters.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/ultra_l1b.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/ultra_l1b_annotated.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/ultra_l1b_culling.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1b/ultra_l1b_extended.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/helio_pset.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/l1c_lookup_utils.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/make_helio_index_maps.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/imap_001.tf +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/imap_science_100.tf +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/imap_science_120.tf +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/imap_sclk_0000.tsc +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/imap_spk_demo.bsp +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/naif0012.tls +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/sim_spice_kernels/sim_1yr_imap_attitude.bc +0 -0
- {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
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/spacecraft_pset.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/ultra_l1c.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/ultra_l1c_culling.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l2/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/l2/ultra_l2.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/packet_definitions/README.md +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/packet_definitions/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/utils/__init__.py +0 -0
- {imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ultra/utils/ultra_l1_utils.py +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
# These version placeholders will be replaced later during substitution.
|
|
2
|
-
__version__ = "1.0.
|
|
3
|
-
__version_tuple__ = (1, 0,
|
|
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)
|
{imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/codice/codice_l1a_lo_species.py
RENAMED
|
@@ -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(
|
|
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
|
|
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
|
{imap_processing-1.0.31 → imap_processing-1.0.32}/imap_processing/ialirt/calculate_ingest.py
RENAMED
|
@@ -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
|
|
341
|
-
log_smooth_powerlaw(
|
|
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
|
-
|
|
431
|
+
return 10**root.root
|
|
346
432
|
except Exception:
|
|
347
433
|
logger.error(
|
|
348
|
-
"Unable to calculate velocity
|
|
349
|
-
"The
|
|
350
|
-
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|