imap-processing 0.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- imap_processing/__init__.py +34 -0
- imap_processing/_version.py +3 -0
- imap_processing/ccsds/__init__.py +0 -0
- imap_processing/ccsds/ccsds_data.py +55 -0
- imap_processing/ccsds/excel_to_xtce.py +477 -0
- imap_processing/cdf/__init__.py +0 -0
- imap_processing/cdf/cdf_attribute_manager.py +322 -0
- imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +212 -0
- imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +1358 -0
- imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +391 -0
- imap_processing/cdf/config/imap_constant_attrs.yaml +33 -0
- imap_processing/cdf/config/imap_default_global_cdf_attrs.yaml +17 -0
- imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +41 -0
- imap_processing/cdf/config/imap_glows_l1a_variable_attrs.yaml +499 -0
- imap_processing/cdf/config/imap_glows_l1b_variable_attrs.yaml +334 -0
- imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +51 -0
- imap_processing/cdf/config/imap_hi_variable_attrs.yaml +435 -0
- imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +27 -0
- imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +493 -0
- imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +564 -0
- imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +24 -0
- imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +426 -0
- imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +90 -0
- imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +487 -0
- imap_processing/cdf/config/imap_lo_l1b_variable_attrs.yaml +121 -0
- imap_processing/cdf/config/imap_lo_l1c_variable_attrs.yaml +179 -0
- imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +97 -0
- imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +201 -0
- imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +33 -0
- imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +137 -0
- imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +24 -0
- imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +234 -0
- imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +273 -0
- imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +100 -0
- imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +52 -0
- imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +297 -0
- imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +121 -0
- imap_processing/cdf/config/shared/default_global_cdf_attrs_schema.yaml +246 -0
- imap_processing/cdf/config/shared/default_variable_cdf_attrs_schema.yaml +466 -0
- imap_processing/cdf/imap_cdf_manager.py +64 -0
- imap_processing/cdf/utils.py +147 -0
- imap_processing/cli.py +863 -0
- imap_processing/codice/__init__.py +1 -0
- imap_processing/codice/codice_l0.py +54 -0
- imap_processing/codice/codice_l1a.py +558 -0
- imap_processing/codice/codice_l1b.py +194 -0
- imap_processing/codice/constants.py +986 -0
- imap_processing/codice/data/esa_sweep_values.csv +257 -0
- imap_processing/codice/data/lo_stepping_values.csv +129 -0
- imap_processing/codice/decompress.py +142 -0
- imap_processing/codice/packet_definitions/P_COD_NHK.xml +618 -0
- imap_processing/codice/packet_definitions/codice_packet_definition.xml +5073 -0
- imap_processing/codice/utils.py +95 -0
- imap_processing/decom.py +40 -0
- imap_processing/glows/__init__.py +1 -0
- imap_processing/glows/ancillary/l1b_conversion_table_v001.json +42 -0
- imap_processing/glows/l0/__init__.py +0 -0
- imap_processing/glows/l0/decom_glows.py +91 -0
- imap_processing/glows/l0/glows_l0_data.py +194 -0
- imap_processing/glows/l1a/glows_l1a.py +424 -0
- imap_processing/glows/l1a/glows_l1a_data.py +555 -0
- imap_processing/glows/l1b/glows_l1b.py +270 -0
- imap_processing/glows/l1b/glows_l1b_data.py +583 -0
- imap_processing/glows/packet_definitions/GLX_COMBINED.xml +254 -0
- imap_processing/glows/packet_definitions/P_GLX_TMSCDE.xml +97 -0
- imap_processing/glows/packet_definitions/P_GLX_TMSCHIST.xml +215 -0
- imap_processing/glows/utils/__init__.py +0 -0
- imap_processing/glows/utils/constants.py +105 -0
- imap_processing/hi/__init__.py +1 -0
- imap_processing/hi/l0/__init__.py +0 -0
- imap_processing/hi/l0/decom_hi.py +24 -0
- imap_processing/hi/l1a/__init__.py +0 -0
- imap_processing/hi/l1a/hi_l1a.py +73 -0
- imap_processing/hi/l1a/histogram.py +142 -0
- imap_processing/hi/l1a/housekeeping.py +27 -0
- imap_processing/hi/l1a/science_direct_event.py +341 -0
- imap_processing/hi/l1b/__init__.py +0 -0
- imap_processing/hi/l1b/hi_eng_unit_convert_table.csv +154 -0
- imap_processing/hi/l1b/hi_l1b.py +127 -0
- imap_processing/hi/l1c/__init__.py +0 -0
- imap_processing/hi/l1c/hi_l1c.py +228 -0
- imap_processing/hi/packet_definitions/__init__.py +0 -0
- imap_processing/hi/packet_definitions/hi_packet_definition.xml +482 -0
- imap_processing/hi/utils.py +27 -0
- imap_processing/hit/__init__.py +1 -0
- imap_processing/hit/l0/__init__.py +0 -0
- imap_processing/hit/l0/data_classes/housekeeping.py +240 -0
- imap_processing/hit/l0/data_classes/science_packet.py +259 -0
- imap_processing/hit/l0/decom_hit.py +467 -0
- imap_processing/hit/l0/utils/hit_base.py +57 -0
- imap_processing/hit/l1a/__init__.py +0 -0
- imap_processing/hit/l1a/hit_l1a.py +254 -0
- imap_processing/hit/l1b/hit_l1b.py +179 -0
- imap_processing/hit/packet_definitions/hit_packet_definitions.xml +1276 -0
- imap_processing/ialirt/__init__.py +0 -0
- imap_processing/ialirt/l0/__init__.py +0 -0
- imap_processing/ialirt/l0/process_hit.py +220 -0
- imap_processing/ialirt/packet_definitions/__init__.py +0 -0
- imap_processing/ialirt/packet_definitions/ialirt.xml +778 -0
- imap_processing/ialirt/packet_definitions/ialirt_hit.xml +186 -0
- imap_processing/idex/__init__.py +2 -0
- imap_processing/idex/idex_constants.py +27 -0
- imap_processing/idex/idex_l0.py +31 -0
- imap_processing/idex/idex_l1a.py +631 -0
- imap_processing/idex/packet_definitions/idex_packet_definition.xml +3162 -0
- imap_processing/lo/__init__.py +1 -0
- imap_processing/lo/l0/__init__.py +0 -0
- imap_processing/lo/l0/data_classes/science_direct_events.py +215 -0
- imap_processing/lo/l0/data_classes/star_sensor.py +98 -0
- imap_processing/lo/l0/decompression_tables/12_to_16_bit.csv +4097 -0
- imap_processing/lo/l0/decompression_tables/8_to_12_bit.csv +257 -0
- imap_processing/lo/l0/decompression_tables/8_to_16_bit.csv +257 -0
- imap_processing/lo/l0/decompression_tables/decompression_tables.py +75 -0
- imap_processing/lo/l0/lo_apid.py +15 -0
- imap_processing/lo/l0/lo_science.py +150 -0
- imap_processing/lo/l0/utils/binary_string.py +59 -0
- imap_processing/lo/l0/utils/bit_decompression.py +62 -0
- imap_processing/lo/l0/utils/lo_base.py +57 -0
- imap_processing/lo/l1a/__init__.py +0 -0
- imap_processing/lo/l1a/lo_l1a.py +157 -0
- imap_processing/lo/l1b/lo_l1b.py +160 -0
- imap_processing/lo/l1c/lo_l1c.py +180 -0
- imap_processing/lo/packet_definitions/lo_xtce.xml +3541 -0
- imap_processing/mag/__init__.py +2 -0
- imap_processing/mag/constants.py +108 -0
- imap_processing/mag/l0/decom_mag.py +170 -0
- imap_processing/mag/l0/mag_l0_data.py +118 -0
- imap_processing/mag/l1a/mag_l1a.py +317 -0
- imap_processing/mag/l1a/mag_l1a_data.py +1007 -0
- imap_processing/mag/l1b/__init__.py +0 -0
- imap_processing/mag/l1b/imap_calibration_mag_20240229_v01.cdf +0 -0
- imap_processing/mag/l1b/mag_l1b.py +125 -0
- imap_processing/mag/l1c/mag_l1c.py +57 -0
- imap_processing/mag/packet_definitions/MAG_SCI_COMBINED.xml +235 -0
- imap_processing/quality_flags.py +91 -0
- imap_processing/spice/__init__.py +1 -0
- imap_processing/spice/geometry.py +322 -0
- imap_processing/spice/kernels.py +459 -0
- imap_processing/spice/time.py +72 -0
- imap_processing/swapi/__init__.py +1 -0
- imap_processing/swapi/l1/__init__.py +0 -0
- imap_processing/swapi/l1/swapi_l1.py +685 -0
- imap_processing/swapi/l2/__init__.py +0 -0
- imap_processing/swapi/l2/swapi_l2.py +107 -0
- imap_processing/swapi/packet_definitions/__init__.py +0 -0
- imap_processing/swapi/packet_definitions/swapi_packet_definition.xml +708 -0
- imap_processing/swapi/swapi_utils.py +25 -0
- imap_processing/swe/__init__.py +1 -0
- imap_processing/swe/l1a/__init__.py +0 -0
- imap_processing/swe/l1a/swe_l1a.py +48 -0
- imap_processing/swe/l1a/swe_science.py +223 -0
- imap_processing/swe/l1b/engineering_unit_convert_table.csv +65 -0
- imap_processing/swe/l1b/swe_esa_lookup_table.csv +1441 -0
- imap_processing/swe/l1b/swe_l1b.py +49 -0
- imap_processing/swe/l1b/swe_l1b_science.py +557 -0
- imap_processing/swe/packet_definitions/__init__.py +0 -0
- imap_processing/swe/packet_definitions/swe_packet_definition.xml +303 -0
- imap_processing/swe/utils/__init__.py +0 -0
- imap_processing/swe/utils/swe_utils.py +9 -0
- imap_processing/tests/__init__.py +0 -0
- imap_processing/tests/ccsds/test_data/expected_output.xml +171 -0
- imap_processing/tests/ccsds/test_excel_to_xtce.py +285 -0
- imap_processing/tests/cdf/__init__.py +0 -0
- imap_processing/tests/cdf/imap_default_global_cdf_attrs.yaml +8 -0
- imap_processing/tests/cdf/shared/default_global_cdf_attrs_schema.yaml +246 -0
- imap_processing/tests/cdf/shared/default_variable_cdf_attrs_schema.yaml +466 -0
- imap_processing/tests/cdf/test_cdf_attribute_manager.py +353 -0
- imap_processing/tests/cdf/test_data/imap_default_global_test_cdf_attrs.yaml +7 -0
- imap_processing/tests/cdf/test_data/imap_instrument1_global_cdf_attrs.yaml +14 -0
- imap_processing/tests/cdf/test_data/imap_instrument1_level1_variable_attrs.yaml +23 -0
- imap_processing/tests/cdf/test_data/imap_instrument2_global_cdf_attrs.yaml +23 -0
- imap_processing/tests/cdf/test_data/imap_instrument2_level2_variable_attrs.yaml +30 -0
- imap_processing/tests/cdf/test_data/imap_test_global.yaml +26 -0
- imap_processing/tests/cdf/test_data/imap_test_variable.yaml +41 -0
- imap_processing/tests/cdf/test_imap_cdf_manager.py +62 -0
- imap_processing/tests/cdf/test_utils.py +109 -0
- imap_processing/tests/codice/__init__.py +0 -0
- imap_processing/tests/codice/conftest.py +56 -0
- imap_processing/tests/codice/data/eu_unit_lookup_table.csv +101 -0
- imap_processing/tests/codice/data/idle_export_eu.COD_NHK_20230822_122700 2.csv +100 -0
- imap_processing/tests/codice/data/idle_export_raw.COD_NHK_20230822_122700.csv +100 -0
- imap_processing/tests/codice/data/imap_codice_l0_hi-counters-aggregated_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_hi-counters-singles_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_hi-omni_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_hi-pha_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_hi-sectored_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_hskp_20100101_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_lo-counters-aggregated_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_lo-counters-singles_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-angular_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-priority_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-species_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_lo-pha_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_lo-sw-angular_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_lo-sw-priority_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l0_lo-sw-species_20240429_v001.pkts +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-aggregated_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-singles_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_hi-omni_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_hi-sectored_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_hskp_20100101_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-aggregated_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-singles_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-angular_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-priority_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-species_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-angular_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-priority_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-species_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-aggregated_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-singles_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_hi-omni_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_hi-sectored_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_hskp_20100101_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-aggregated_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-singles_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-angular_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-priority_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-species_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-angular_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-priority_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-species_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/test_codice_l0.py +144 -0
- imap_processing/tests/codice/test_codice_l1a.py +187 -0
- imap_processing/tests/codice/test_codice_l1b.py +60 -0
- imap_processing/tests/codice/test_decompress.py +50 -0
- imap_processing/tests/conftest.py +372 -0
- imap_processing/tests/glows/direct_events_validation_data_l1a.csv +5704 -0
- imap_processing/tests/glows/glows_test_packet_20110921_v01.pkts +0 -0
- imap_processing/tests/glows/test_glows_decom.py +133 -0
- imap_processing/tests/glows/test_glows_l1a_cdf.py +85 -0
- imap_processing/tests/glows/test_glows_l1a_data.py +510 -0
- imap_processing/tests/glows/test_glows_l1b.py +348 -0
- imap_processing/tests/glows/test_glows_l1b_data.py +70 -0
- imap_processing/tests/hi/__init__.py +0 -0
- imap_processing/tests/hi/conftest.py +133 -0
- imap_processing/tests/hi/test_data/l0/20231030_H45_APP_NHK.bin +0 -0
- imap_processing/tests/hi/test_data/l0/20231030_H45_APP_NHK.csv +201 -0
- imap_processing/tests/hi/test_data/l0/20231030_H45_SCI_CNT.bin +0 -0
- imap_processing/tests/hi/test_data/l0/20231030_H45_SCI_DE.bin +0 -0
- imap_processing/tests/hi/test_data/l0/README.txt +54 -0
- imap_processing/tests/hi/test_decom.py +55 -0
- imap_processing/tests/hi/test_hi_l1b.py +31 -0
- imap_processing/tests/hi/test_hi_l1c.py +69 -0
- imap_processing/tests/hi/test_l1a.py +96 -0
- imap_processing/tests/hi/test_l1a_sci_de.py +72 -0
- imap_processing/tests/hi/test_utils.py +15 -0
- imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1251.pkts +0 -0
- imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1252.pkts +0 -0
- imap_processing/tests/hit/__init__.py +0 -0
- imap_processing/tests/hit/test_data/imap_hit_l0_hk_20100105_v001.pkts +0 -0
- imap_processing/tests/hit/test_data/sci_sample.ccsds +0 -0
- imap_processing/tests/hit/test_hit_decom.py +230 -0
- imap_processing/tests/hit/test_hit_l1a.py +224 -0
- imap_processing/tests/hit/test_hit_l1b.py +52 -0
- imap_processing/tests/hit/validation_data/hskp_sample_raw.csv +88 -0
- imap_processing/tests/ialirt/__init__.py +0 -0
- imap_processing/tests/ialirt/test_data/l0/IALiRT Raw Packet Telemetry.txt +33 -0
- imap_processing/tests/ialirt/test_data/l0/hit_ialirt_sample.ccsds +0 -0
- imap_processing/tests/ialirt/test_data/l0/hit_ialirt_sample.csv +1001 -0
- imap_processing/tests/ialirt/unit/__init__.py +0 -0
- imap_processing/tests/ialirt/unit/test_decom_ialirt.py +94 -0
- imap_processing/tests/ialirt/unit/test_process_hit.py +226 -0
- imap_processing/tests/idex/__init__.py +0 -0
- imap_processing/tests/idex/conftest.py +22 -0
- imap_processing/tests/idex/imap_idex_l0_raw_20230725_v001.pkts +0 -0
- imap_processing/tests/idex/impact_14_tof_high_data.txt +8189 -0
- imap_processing/tests/idex/test_idex_l0.py +45 -0
- imap_processing/tests/idex/test_idex_l1a.py +91 -0
- imap_processing/tests/lo/__init__.py +0 -0
- imap_processing/tests/lo/test_binary_string.py +21 -0
- imap_processing/tests/lo/test_bit_decompression.py +39 -0
- imap_processing/tests/lo/test_cdfs/imap_lo_l0_raw_20240627_v001.pkts +0 -0
- imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20100101_v001.cdf +0 -0
- imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20100101_v001.cdf +0 -0
- imap_processing/tests/lo/test_cdfs/imap_lo_l1b_de_20100101_v001.cdf +0 -0
- imap_processing/tests/lo/test_lo_l1a.py +66 -0
- imap_processing/tests/lo/test_lo_l1b.py +74 -0
- imap_processing/tests/lo/test_lo_l1c.py +66 -0
- imap_processing/tests/lo/test_science_counts.py +41 -0
- imap_processing/tests/lo/test_science_direct_events.py +209 -0
- imap_processing/tests/lo/test_star_sensor.py +35 -0
- imap_processing/tests/mag/imap_mag_l1a_burst-magi_20231025_v001.cdf +0 -0
- imap_processing/tests/mag/mag_l0_test_data.pkts +0 -0
- imap_processing/tests/mag/mag_l0_test_output.csv +37 -0
- imap_processing/tests/mag/mag_l1_test_data.pkts +0 -0
- imap_processing/tests/mag/mag_l1a_test_output.csv +97 -0
- imap_processing/tests/mag/test_mag_decom.py +117 -0
- imap_processing/tests/mag/test_mag_l1a.py +856 -0
- imap_processing/tests/mag/test_mag_l1b.py +77 -0
- imap_processing/tests/mag/test_mag_l1c.py +40 -0
- imap_processing/tests/spice/__init__.py +0 -0
- imap_processing/tests/spice/test_data/imap_ena_sim_metakernel.template +4 -0
- imap_processing/tests/spice/test_data/imap_science_0001.tf +171 -0
- imap_processing/tests/spice/test_data/imap_sclk_0000.tsc +156 -0
- imap_processing/tests/spice/test_data/imap_sim_ck_2hr_2secsampling_with_nutation.bc +0 -0
- imap_processing/tests/spice/test_data/imap_simple_metakernel.template +3 -0
- imap_processing/tests/spice/test_data/imap_spk_demo.bsp +0 -0
- imap_processing/tests/spice/test_data/imap_wkcp.tf +1806 -0
- imap_processing/tests/spice/test_data/naif0012.tls +150 -0
- imap_processing/tests/spice/test_data/sim_1yr_imap_attitude.bc +0 -0
- imap_processing/tests/spice/test_data/sim_1yr_imap_pointing_frame.bc +0 -0
- imap_processing/tests/spice/test_geometry.py +214 -0
- imap_processing/tests/spice/test_kernels.py +272 -0
- imap_processing/tests/spice/test_time.py +35 -0
- imap_processing/tests/swapi/__init__.py +0 -0
- imap_processing/tests/swapi/conftest.py +16 -0
- imap_processing/tests/swapi/l0_data/__init__.py +0 -0
- imap_processing/tests/swapi/l0_data/imap_swapi_l0_raw_20231012_v001.pkts +0 -0
- imap_processing/tests/swapi/l0_validation_data/__init__.py +0 -0
- imap_processing/tests/swapi/l0_validation_data/idle_export_eu.SWP_AUT_20231012_125245.csv +124 -0
- imap_processing/tests/swapi/l0_validation_data/idle_export_eu.SWP_HK_20231012_125245.csv +98 -0
- imap_processing/tests/swapi/l0_validation_data/idle_export_eu.SWP_MG_20231012_125245.csv +9 -0
- imap_processing/tests/swapi/l0_validation_data/idle_export_eu.SWP_SCI_20231012_125245.csv +72 -0
- imap_processing/tests/swapi/l0_validation_data/idle_export_raw.SWP_AUT_20231012_125245.csv +124 -0
- imap_processing/tests/swapi/l0_validation_data/idle_export_raw.SWP_HK_20231012_125245.csv +98 -0
- imap_processing/tests/swapi/l0_validation_data/idle_export_raw.SWP_MG_20231012_125245.csv +9 -0
- imap_processing/tests/swapi/l0_validation_data/idle_export_raw.SWP_SCI_20231012_125245.csv +72 -0
- imap_processing/tests/swapi/test_swapi_decom.py +135 -0
- imap_processing/tests/swapi/test_swapi_l1.py +354 -0
- imap_processing/tests/swapi/test_swapi_l2.py +21 -0
- imap_processing/tests/swe/__init__.py +0 -0
- imap_processing/tests/swe/conftest.py +35 -0
- imap_processing/tests/swe/decompressed/20230927173238_4th_quarter_decompressed.csv +181 -0
- imap_processing/tests/swe/decompressed/20230927173253_1st_quarter_decompressed.csv +181 -0
- imap_processing/tests/swe/decompressed/20230927173308_2nd_quarter_decompressed.csv +181 -0
- imap_processing/tests/swe/decompressed/20230927173323_3rd_quarter_decompressed.csv +181 -0
- imap_processing/tests/swe/l0_data/2024051010_SWE_SCIENCE_packet.bin +0 -0
- imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_SCIENCE_20240510_092742.csv +544 -0
- imap_processing/tests/swe/l0_validation_data/idle_export_raw.SWE_SCIENCE_20240510_092742.csv +363 -0
- imap_processing/tests/swe/test_swe_l1a.py +12 -0
- imap_processing/tests/swe/test_swe_l1a_science.py +129 -0
- imap_processing/tests/swe/test_swe_l1b.py +61 -0
- imap_processing/tests/swe/test_swe_l1b_science.py +65 -0
- imap_processing/tests/test_cli.py +229 -0
- imap_processing/tests/test_decom.py +66 -0
- imap_processing/tests/test_quality_flags.py +71 -0
- imap_processing/tests/test_utils.py +107 -0
- imap_processing/tests/ultra/__init__.py +0 -0
- imap_processing/tests/ultra/test_data/l0/FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50_theta-0.00_20240207T102740.CCSDS +0 -0
- imap_processing/tests/ultra/test_data/l0/FM45_7P_Phi0.0_BeamCal_LinearScan_phi0.04_theta-0.01_20230821T121304.CCSDS +0 -0
- imap_processing/tests/ultra/test_data/l0/FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.CCSDS +0 -0
- imap_processing/tests/ultra/test_data/l0/Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.CCSDS +0 -0
- imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_auxdata_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +24 -0
- imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_enaphxtofhangimg_FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.csv +105 -0
- imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_ultraimgrates_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +24 -0
- imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_ultrarawimg_withFSWcalcs_FM45_40P_Phi28p5_BeamCal_LinearScan_phi2850_theta-000_20240207T102740.csv +3314 -0
- imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_ultrarawimgevent_FM45_7P_Phi00_BeamCal_LinearScan_phi004_theta-001_20230821T121304.csv +702 -0
- imap_processing/tests/ultra/unit/__init__.py +0 -0
- imap_processing/tests/ultra/unit/conftest.py +210 -0
- imap_processing/tests/ultra/unit/test_decom_apid_880.py +98 -0
- imap_processing/tests/ultra/unit/test_decom_apid_881.py +50 -0
- imap_processing/tests/ultra/unit/test_decom_apid_883.py +44 -0
- imap_processing/tests/ultra/unit/test_decom_apid_896.py +104 -0
- imap_processing/tests/ultra/unit/test_lookup_utils.py +68 -0
- imap_processing/tests/ultra/unit/test_ultra_l1a.py +338 -0
- imap_processing/tests/ultra/unit/test_ultra_l1b.py +122 -0
- imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +57 -0
- imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +342 -0
- imap_processing/tests/ultra/unit/test_ultra_l1c.py +104 -0
- imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +35 -0
- imap_processing/ultra/__init__.py +1 -0
- imap_processing/ultra/constants.py +60 -0
- imap_processing/ultra/l0/__init__.py +0 -0
- imap_processing/ultra/l0/decom_tools.py +281 -0
- imap_processing/ultra/l0/decom_ultra.py +278 -0
- imap_processing/ultra/l0/ultra_utils.py +326 -0
- imap_processing/ultra/l1a/__init__.py +0 -0
- imap_processing/ultra/l1a/ultra_l1a.py +319 -0
- imap_processing/ultra/l1b/badtimes.py +26 -0
- imap_processing/ultra/l1b/cullingmask.py +26 -0
- imap_processing/ultra/l1b/de.py +59 -0
- imap_processing/ultra/l1b/extendedspin.py +45 -0
- imap_processing/ultra/l1b/lookup_utils.py +165 -0
- imap_processing/ultra/l1b/ultra_l1b.py +65 -0
- imap_processing/ultra/l1b/ultra_l1b_annotated.py +54 -0
- imap_processing/ultra/l1b/ultra_l1b_extended.py +764 -0
- imap_processing/ultra/l1c/histogram.py +36 -0
- imap_processing/ultra/l1c/pset.py +36 -0
- imap_processing/ultra/l1c/ultra_l1c.py +52 -0
- imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +54 -0
- imap_processing/ultra/lookup_tables/EgyNorm.mem.csv +32769 -0
- imap_processing/ultra/lookup_tables/FM45_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -0
- imap_processing/ultra/lookup_tables/ultra45_back-pos-luts.csv +4097 -0
- imap_processing/ultra/lookup_tables/ultra45_tdc_norm.csv +2050 -0
- imap_processing/ultra/lookup_tables/ultra90_back-pos-luts.csv +4097 -0
- imap_processing/ultra/lookup_tables/ultra90_tdc_norm.csv +2050 -0
- imap_processing/ultra/lookup_tables/yadjust.csv +257 -0
- imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +547 -0
- imap_processing/ultra/packet_definitions/__init__.py +0 -0
- imap_processing/ultra/utils/__init__.py +0 -0
- imap_processing/ultra/utils/ultra_l1_utils.py +50 -0
- imap_processing/utils.py +413 -0
- imap_processing-0.6.0.dist-info/LICENSE +21 -0
- imap_processing-0.6.0.dist-info/METADATA +107 -0
- imap_processing-0.6.0.dist-info/RECORD +398 -0
- imap_processing-0.6.0.dist-info/WHEEL +4 -0
- imap_processing-0.6.0.dist-info/entry_points.txt +4 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""Module for constants and useful shared classes used in GLOWS."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass(frozen=True)
|
|
9
|
+
class TimeTuple:
|
|
10
|
+
"""
|
|
11
|
+
Spacecraft clock time, a float divided into seconds and subseconds.
|
|
12
|
+
|
|
13
|
+
Attributes
|
|
14
|
+
----------
|
|
15
|
+
seconds: int
|
|
16
|
+
Seconds of clock, integer
|
|
17
|
+
subseconds: int
|
|
18
|
+
Subseconds of clock, defined as 1/SUB_SECOND_LIMIT th of a second. Will
|
|
19
|
+
always be less than SUB_SECOND_LIMIT. If the class is initialized with a
|
|
20
|
+
subsecond value above SUB_SECOND_LIMIT, the subseconds above the limit will be
|
|
21
|
+
converted to seconds.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
seconds: int
|
|
25
|
+
subseconds: int
|
|
26
|
+
|
|
27
|
+
def __post_init__(self) -> None:
|
|
28
|
+
"""Add any subseconds over the limit into the seconds field."""
|
|
29
|
+
final_seconds = self.seconds
|
|
30
|
+
final_subseconds = self.subseconds
|
|
31
|
+
if final_subseconds >= GlowsConstants.SUBSECOND_LIMIT:
|
|
32
|
+
final_seconds += self.subseconds // GlowsConstants.SUBSECOND_LIMIT
|
|
33
|
+
final_subseconds = self.subseconds % GlowsConstants.SUBSECOND_LIMIT
|
|
34
|
+
|
|
35
|
+
object.__setattr__(self, "seconds", final_seconds)
|
|
36
|
+
object.__setattr__(self, "subseconds", final_subseconds)
|
|
37
|
+
|
|
38
|
+
def to_seconds(self) -> np.single:
|
|
39
|
+
"""
|
|
40
|
+
Convert the TimeTuple to seconds.
|
|
41
|
+
|
|
42
|
+
Returns
|
|
43
|
+
-------
|
|
44
|
+
np.single
|
|
45
|
+
TimeTuple in seconds.
|
|
46
|
+
"""
|
|
47
|
+
return np.single(
|
|
48
|
+
self.seconds + self.subseconds / GlowsConstants.SUBSECOND_LIMIT
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True)
|
|
53
|
+
class GlowsConstants:
|
|
54
|
+
"""
|
|
55
|
+
Constants for GLOWS which can be used across different levels or classes.
|
|
56
|
+
|
|
57
|
+
Attributes
|
|
58
|
+
----------
|
|
59
|
+
SUBSECOND_LIMIT: int
|
|
60
|
+
subsecond limit for GLOWS clock (and consequently also onboard-interpolated
|
|
61
|
+
IMAP clock)
|
|
62
|
+
SCAN_CIRCLE_ANGULAR_RADIUS: float
|
|
63
|
+
angular radius of IMAP/GLOWS scanning circle [deg]
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
SUBSECOND_LIMIT: int = 2_000_000
|
|
67
|
+
SCAN_CIRCLE_ANGULAR_RADIUS: float = 75.0
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@dataclass
|
|
71
|
+
class DirectEvent:
|
|
72
|
+
"""
|
|
73
|
+
DirectEvent() class for IMAP/GLOWS.
|
|
74
|
+
|
|
75
|
+
Authors: Marek Strumik, maro@cbk.waw.pl, Maxine Hartnett
|
|
76
|
+
|
|
77
|
+
Attributes
|
|
78
|
+
----------
|
|
79
|
+
timestamp: TimeTuple
|
|
80
|
+
Timestamp for the direct event
|
|
81
|
+
impulse_length: int
|
|
82
|
+
Direct event data
|
|
83
|
+
multi_event: bool
|
|
84
|
+
If the event was a multi event. Defaults to False.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
timestamp: TimeTuple
|
|
88
|
+
impulse_length: int
|
|
89
|
+
multi_event: bool = False
|
|
90
|
+
|
|
91
|
+
def to_list(self) -> list:
|
|
92
|
+
"""
|
|
93
|
+
Convert object to list [seconds, subseconds, impulse length, multievent].
|
|
94
|
+
|
|
95
|
+
Returns
|
|
96
|
+
-------
|
|
97
|
+
list
|
|
98
|
+
Converted object to list.
|
|
99
|
+
"""
|
|
100
|
+
return [
|
|
101
|
+
self.timestamp.seconds,
|
|
102
|
+
self.timestamp.subseconds,
|
|
103
|
+
self.impulse_length,
|
|
104
|
+
self.multi_event,
|
|
105
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "001"
|
|
File without changes
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Decom IMAP-Hi data."""
|
|
2
|
+
|
|
3
|
+
from imap_processing import decom, imap_module_directory
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def decom_packets(packet_file_path: str) -> list:
|
|
7
|
+
"""
|
|
8
|
+
Decom IMAP-Hi data using its packet definition.
|
|
9
|
+
|
|
10
|
+
Parameters
|
|
11
|
+
----------
|
|
12
|
+
packet_file_path : str
|
|
13
|
+
File path to the packet.
|
|
14
|
+
|
|
15
|
+
Returns
|
|
16
|
+
-------
|
|
17
|
+
list
|
|
18
|
+
Decompressed file packets.
|
|
19
|
+
"""
|
|
20
|
+
packet_def_file = (
|
|
21
|
+
imap_module_directory / "hi/packet_definitions/hi_packet_definition.xml"
|
|
22
|
+
)
|
|
23
|
+
decom_file_packets: list = decom.decom_packets(packet_file_path, packet_def_file)
|
|
24
|
+
return decom_file_packets
|
|
File without changes
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""IMAP-HI L1A processing module."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Union
|
|
6
|
+
|
|
7
|
+
import xarray as xr
|
|
8
|
+
|
|
9
|
+
from imap_processing import imap_module_directory
|
|
10
|
+
from imap_processing.hi.l1a.histogram import create_dataset as hist_create_dataset
|
|
11
|
+
from imap_processing.hi.l1a.housekeeping import process_housekeeping
|
|
12
|
+
from imap_processing.hi.l1a.science_direct_event import science_direct_event
|
|
13
|
+
from imap_processing.hi.utils import HIAPID
|
|
14
|
+
from imap_processing.utils import packet_file_to_datasets
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def hi_l1a(packet_file_path: Union[str, Path], data_version: str) -> list[xr.Dataset]:
|
|
20
|
+
"""
|
|
21
|
+
Will process IMAP raw data to l1a.
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
packet_file_path : str
|
|
26
|
+
Data packet file path.
|
|
27
|
+
data_version : str
|
|
28
|
+
Version of the data product being created.
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
processed_data : list[xarray.Dataset]
|
|
33
|
+
List of processed xarray dataset.
|
|
34
|
+
"""
|
|
35
|
+
packet_def_file = (
|
|
36
|
+
imap_module_directory / "hi/packet_definitions/hi_packet_definition.xml"
|
|
37
|
+
)
|
|
38
|
+
datasets_by_apid = packet_file_to_datasets(
|
|
39
|
+
packet_file=packet_file_path, xtce_packet_definition=packet_def_file
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
# Process science to l1a.
|
|
43
|
+
processed_data = []
|
|
44
|
+
for apid in datasets_by_apid:
|
|
45
|
+
if apid == HIAPID.H45_SCI_CNT:
|
|
46
|
+
logger.info(
|
|
47
|
+
"Processing histogram data for [%s] packets", HIAPID.H45_SCI_CNT.name
|
|
48
|
+
)
|
|
49
|
+
data = hist_create_dataset(datasets_by_apid[apid])
|
|
50
|
+
elif apid == HIAPID.H45_SCI_DE:
|
|
51
|
+
logger.info(
|
|
52
|
+
"Processing direct event data for [%s] packets", HIAPID.H45_SCI_DE.name
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
data = science_direct_event(datasets_by_apid[apid])
|
|
56
|
+
elif apid == HIAPID.H45_APP_NHK:
|
|
57
|
+
logger.info(
|
|
58
|
+
"Processing housekeeping data for [%s] packets", HIAPID.H45_APP_NHK.name
|
|
59
|
+
)
|
|
60
|
+
data = process_housekeeping(datasets_by_apid[apid])
|
|
61
|
+
else:
|
|
62
|
+
raise RuntimeError(f"Encountered unexpected APID [{apid}]")
|
|
63
|
+
|
|
64
|
+
# TODO: revisit this
|
|
65
|
+
data.attrs["Data_version"] = data_version
|
|
66
|
+
|
|
67
|
+
# set the sensor string in Logical_source
|
|
68
|
+
sensor_str = HIAPID(apid).sensor
|
|
69
|
+
data.attrs["Logical_source"] = data.attrs["Logical_source"].format(
|
|
70
|
+
sensor=sensor_str
|
|
71
|
+
)
|
|
72
|
+
processed_data.append(data)
|
|
73
|
+
return processed_data
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"""Unpack IMAP-Hi histogram data."""
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
import xarray as xr
|
|
5
|
+
|
|
6
|
+
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
|
|
7
|
+
|
|
8
|
+
# define the names of the 24 counter arrays
|
|
9
|
+
# contained in the histogram packet
|
|
10
|
+
QUALIFIED_COUNTERS = (
|
|
11
|
+
"qual_ab",
|
|
12
|
+
"qual_c1c2",
|
|
13
|
+
"qual_ac1",
|
|
14
|
+
"qual_bc1",
|
|
15
|
+
"qual_abc1",
|
|
16
|
+
"qual_ac1c2",
|
|
17
|
+
"qual_bc1c2",
|
|
18
|
+
"qual_abc1c2",
|
|
19
|
+
)
|
|
20
|
+
LONG_COUNTERS = (
|
|
21
|
+
"long_a",
|
|
22
|
+
"long_b",
|
|
23
|
+
"long_c",
|
|
24
|
+
"long_ab",
|
|
25
|
+
"long_c1c2",
|
|
26
|
+
"long_ac1",
|
|
27
|
+
"long_bc1",
|
|
28
|
+
"long_abc1",
|
|
29
|
+
"long_ac1c2",
|
|
30
|
+
"long_bc1c2",
|
|
31
|
+
"long_abc1c2",
|
|
32
|
+
)
|
|
33
|
+
TOTAL_COUNTERS = ("total_a", "total_b", "total_c", "fee_de_sent", "fee_de_recd")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def create_dataset(input_ds: xr.Dataset) -> xr.Dataset:
|
|
37
|
+
"""
|
|
38
|
+
Create dataset for a number of Hi Histogram packets.
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
input_ds : xarray.Dataset
|
|
43
|
+
Dataset of packets.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
dataset : xarray.Dataset
|
|
48
|
+
Dataset with all metadata field data in xr.DataArray.
|
|
49
|
+
"""
|
|
50
|
+
dataset = allocate_histogram_dataset(len(input_ds.epoch))
|
|
51
|
+
|
|
52
|
+
# TODO: Move into the allocate dataset function?
|
|
53
|
+
dataset["epoch"].data[:] = input_ds["epoch"].data
|
|
54
|
+
dataset["ccsds_met"].data = input_ds["ccsds_met"].data
|
|
55
|
+
dataset["esa_stepping_num"].data = input_ds["esa_step"].data
|
|
56
|
+
|
|
57
|
+
# unpack the packets data into the Dataset
|
|
58
|
+
# (npackets, 24 * 90 * 12)
|
|
59
|
+
# TODO: Look into avoiding the for-loops below
|
|
60
|
+
# It seems like we could try to reshape the arrays and do some numpy
|
|
61
|
+
# broadcasting rather than for-loops directly here
|
|
62
|
+
for i_epoch, counters_binary_data in enumerate(input_ds["counters"].data):
|
|
63
|
+
# unpack 24 arrays of 90 12-bit unsigned integers
|
|
64
|
+
counter_ints = [
|
|
65
|
+
int(counters_binary_data[i * 12 : (i + 1) * 12], 2) for i in range(90 * 24)
|
|
66
|
+
]
|
|
67
|
+
# populate the dataset with the unpacked integers
|
|
68
|
+
for i_counter, counter in enumerate(
|
|
69
|
+
(*QUALIFIED_COUNTERS, *LONG_COUNTERS, *TOTAL_COUNTERS)
|
|
70
|
+
):
|
|
71
|
+
dataset[counter][i_epoch] = counter_ints[
|
|
72
|
+
i_counter * 90 : (i_counter + 1) * 90
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
return dataset
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def allocate_histogram_dataset(num_packets: int) -> xr.Dataset:
|
|
79
|
+
"""
|
|
80
|
+
Allocate empty xarray.Dataset for specified number of Hi Histogram packets.
|
|
81
|
+
|
|
82
|
+
Parameters
|
|
83
|
+
----------
|
|
84
|
+
num_packets : int
|
|
85
|
+
The number of Hi Histogram packets to allocate space for
|
|
86
|
+
in the xarray.Dataset.
|
|
87
|
+
|
|
88
|
+
Returns
|
|
89
|
+
-------
|
|
90
|
+
dataset : xarray.Dataset
|
|
91
|
+
Empty xarray.Dataset ready to be filled with packet data.
|
|
92
|
+
"""
|
|
93
|
+
attr_mgr = ImapCdfAttributes()
|
|
94
|
+
attr_mgr.add_instrument_global_attrs(instrument="hi")
|
|
95
|
+
attr_mgr.load_variable_attributes("imap_hi_variable_attrs.yaml")
|
|
96
|
+
# preallocate the xr.DataArrays for all CDF attributes based on number of packets
|
|
97
|
+
coords = dict()
|
|
98
|
+
coords["epoch"] = xr.DataArray(
|
|
99
|
+
np.empty(num_packets, dtype="datetime64[ns]"),
|
|
100
|
+
name="epoch",
|
|
101
|
+
dims=["epoch"],
|
|
102
|
+
attrs=attr_mgr.get_variable_attributes("epoch"),
|
|
103
|
+
)
|
|
104
|
+
# Histogram data is binned in 90, 4-degree bins
|
|
105
|
+
coords["angle"] = xr.DataArray(
|
|
106
|
+
np.arange(2, 360, 4),
|
|
107
|
+
name="angle",
|
|
108
|
+
dims=["angle"],
|
|
109
|
+
attrs=attr_mgr.get_variable_attributes("hi_hist_angle"),
|
|
110
|
+
)
|
|
111
|
+
data_vars = dict()
|
|
112
|
+
data_vars["ccsds_met"] = xr.DataArray(
|
|
113
|
+
np.empty(num_packets, dtype=np.uint32),
|
|
114
|
+
dims=["epoch"],
|
|
115
|
+
attrs=attr_mgr.get_variable_attributes("hi_hist_ccsds_met"),
|
|
116
|
+
)
|
|
117
|
+
data_vars["esa_stepping_num"] = xr.DataArray(
|
|
118
|
+
np.empty(num_packets, dtype=np.uint8),
|
|
119
|
+
dims=["epoch"],
|
|
120
|
+
attrs=attr_mgr.get_variable_attributes("hi_hist_esa_stepping_num"),
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
# Allocate xarray.DataArray objects for the 24 90-element histogram counters
|
|
124
|
+
default_counter_attrs = attr_mgr.get_variable_attributes("hi_hist_counters")
|
|
125
|
+
for counter_name in (*QUALIFIED_COUNTERS, *LONG_COUNTERS, *TOTAL_COUNTERS):
|
|
126
|
+
# Inject counter name into generic counter attributes
|
|
127
|
+
counter_attrs = default_counter_attrs.copy()
|
|
128
|
+
for key, val in counter_attrs.items():
|
|
129
|
+
if isinstance(val, str) and "{counter_name}" in val:
|
|
130
|
+
counter_attrs[key] = val.format(counter_name=counter_name)
|
|
131
|
+
data_vars[counter_name] = xr.DataArray(
|
|
132
|
+
data=np.empty((num_packets, len(coords["angle"])), np.uint16),
|
|
133
|
+
dims=["epoch", "angle"],
|
|
134
|
+
attrs=counter_attrs,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
dataset = xr.Dataset(
|
|
138
|
+
data_vars=data_vars,
|
|
139
|
+
coords=coords,
|
|
140
|
+
attrs=attr_mgr.get_global_attributes("imap_hi_l1a_hist_attrs"),
|
|
141
|
+
)
|
|
142
|
+
return dataset
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Unpack IMAP-Hi housekeeping data."""
|
|
2
|
+
|
|
3
|
+
import xarray as xr
|
|
4
|
+
|
|
5
|
+
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def process_housekeeping(dataset: xr.Dataset) -> xr.Dataset:
|
|
9
|
+
"""
|
|
10
|
+
Create dataset for each metadata field.
|
|
11
|
+
|
|
12
|
+
Parameters
|
|
13
|
+
----------
|
|
14
|
+
dataset : xarray.Dataset
|
|
15
|
+
Packet input dataset.
|
|
16
|
+
|
|
17
|
+
Returns
|
|
18
|
+
-------
|
|
19
|
+
dataset : xarray.Dataset
|
|
20
|
+
Dataset with all metadata field data in xr.DataArray.
|
|
21
|
+
"""
|
|
22
|
+
# Load the CDF attributes
|
|
23
|
+
attr_mgr = ImapCdfAttributes()
|
|
24
|
+
attr_mgr.add_instrument_global_attrs("hi")
|
|
25
|
+
# Add datalevel attrs
|
|
26
|
+
dataset.attrs.update(attr_mgr.get_global_attributes("imap_hi_l1a_hk_attrs"))
|
|
27
|
+
return dataset
|