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,322 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Functions for computing geometry, many of which use SPICE.
|
|
3
|
+
|
|
4
|
+
Paradigms for developing this module:
|
|
5
|
+
* Use @ensure_spice decorator on functions that directly wrap spiceypy functions
|
|
6
|
+
* Vectorize everything at the lowest level possible (e.g. the decorated spiceypy
|
|
7
|
+
wrapper function)
|
|
8
|
+
* Always return numpy arrays for vectorized calls.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
import typing
|
|
13
|
+
from enum import IntEnum
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Union
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
import numpy.typing as npt
|
|
19
|
+
import pandas as pd
|
|
20
|
+
import spiceypy as spice
|
|
21
|
+
|
|
22
|
+
from imap_processing.spice.kernels import ensure_spice
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SpiceBody(IntEnum):
|
|
26
|
+
"""Enum containing SPICE IDs for bodies that we use."""
|
|
27
|
+
|
|
28
|
+
# A subset of IMAP Specific bodies as defined in imap_wkcp.tf
|
|
29
|
+
IMAP = -43
|
|
30
|
+
IMAP_SPACECRAFT = -43000
|
|
31
|
+
# IMAP Pointing Frame (Despun) as defined in imap_science_0001.tf
|
|
32
|
+
IMAP_DPS = -43901
|
|
33
|
+
# Standard NAIF bodies
|
|
34
|
+
SOLAR_SYSTEM_BARYCENTER = spice.bodn2c("SOLAR_SYSTEM_BARYCENTER")
|
|
35
|
+
SUN = spice.bodn2c("SUN")
|
|
36
|
+
EARTH = spice.bodn2c("EARTH")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class SpiceFrame(IntEnum):
|
|
40
|
+
"""Enum containing SPICE IDs for reference frames, defined in imap_wkcp.tf."""
|
|
41
|
+
|
|
42
|
+
# Standard SPICE Frames
|
|
43
|
+
J2000 = spice.irfnum("J2000")
|
|
44
|
+
ECLIPJ2000 = spice.irfnum("ECLIPJ2000")
|
|
45
|
+
# IMAP Pointing Frame (Despun) as defined in imap_science_0001.tf
|
|
46
|
+
IMAP_DPS = -43901
|
|
47
|
+
# IMAP specific as defined in imap_wkcp.tf
|
|
48
|
+
IMAP_SPACECRAFT = -43000
|
|
49
|
+
IMAP_LO_BASE = -43100
|
|
50
|
+
IMAP_LO_STAR_SENSOR = -43103
|
|
51
|
+
IMAP_LO = -43105
|
|
52
|
+
IMAP_HI_45 = -43150
|
|
53
|
+
IMAP_HI_90 = -43160
|
|
54
|
+
IMAP_ULTRA_45 = -43200
|
|
55
|
+
IMAP_ULTRA_90 = -43210
|
|
56
|
+
IMAP_MAG = -43250
|
|
57
|
+
IMAP_SWE = -43300
|
|
58
|
+
IMAP_SWAPI = -43350
|
|
59
|
+
IMAP_CODICE = -43400
|
|
60
|
+
IMAP_HIT = -43500
|
|
61
|
+
IMAP_IDEX = -43700
|
|
62
|
+
IMAP_GLOWS = -43750
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@typing.no_type_check
|
|
66
|
+
@ensure_spice
|
|
67
|
+
def imap_state(
|
|
68
|
+
et: Union[np.ndarray, float],
|
|
69
|
+
ref_frame: SpiceFrame = SpiceFrame.ECLIPJ2000,
|
|
70
|
+
observer: SpiceBody = SpiceBody.SUN,
|
|
71
|
+
) -> np.ndarray:
|
|
72
|
+
"""
|
|
73
|
+
Get the state (position and velocity) of the IMAP spacecraft.
|
|
74
|
+
|
|
75
|
+
By default, the state is returned in the ECLIPJ2000 frame as observed by the Sun.
|
|
76
|
+
|
|
77
|
+
Parameters
|
|
78
|
+
----------
|
|
79
|
+
et : np.ndarray or float
|
|
80
|
+
Epoch time(s) [J2000 seconds] to get the IMAP state for.
|
|
81
|
+
ref_frame : SpiceFrame, optional
|
|
82
|
+
Reference frame which the IMAP state is expressed in.
|
|
83
|
+
observer : SpiceBody, optional
|
|
84
|
+
Observing body.
|
|
85
|
+
|
|
86
|
+
Returns
|
|
87
|
+
-------
|
|
88
|
+
state : np.ndarray
|
|
89
|
+
The Cartesian state vector representing the position and velocity of the
|
|
90
|
+
IMAP spacecraft.
|
|
91
|
+
"""
|
|
92
|
+
state, _ = spice.spkezr(
|
|
93
|
+
SpiceBody.IMAP.name, et, ref_frame.name, "NONE", observer.name
|
|
94
|
+
)
|
|
95
|
+
return np.asarray(state)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def get_spin_data() -> pd.DataFrame:
|
|
99
|
+
"""
|
|
100
|
+
Read spin file using environment variable and return spin data.
|
|
101
|
+
|
|
102
|
+
SPIN_DATA_FILEPATH environment variable would be a fixed value.
|
|
103
|
+
It could be s3 filepath that can be used to download the data
|
|
104
|
+
through API or it could be path EFS or Batch volume mount path.
|
|
105
|
+
|
|
106
|
+
Spin data should contains the following fields:
|
|
107
|
+
(
|
|
108
|
+
spin_number,
|
|
109
|
+
spin_start_sec,
|
|
110
|
+
spin_start_subsec,
|
|
111
|
+
spin_period_sec,
|
|
112
|
+
spin_period_valid,
|
|
113
|
+
spin_phase_valid,
|
|
114
|
+
spin_period_source,
|
|
115
|
+
thruster_firing
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
Returns
|
|
119
|
+
-------
|
|
120
|
+
spin_data : pandas.DataFrame
|
|
121
|
+
Spin data.
|
|
122
|
+
"""
|
|
123
|
+
spin_data_filepath = os.getenv("SPIN_DATA_FILEPATH")
|
|
124
|
+
if spin_data_filepath is not None:
|
|
125
|
+
path_to_spin_file = Path(spin_data_filepath)
|
|
126
|
+
else:
|
|
127
|
+
# Handle the case where the environment variable is not set
|
|
128
|
+
raise ValueError("SPIN_DATA_FILEPATH environment variable is not set.")
|
|
129
|
+
|
|
130
|
+
spin_df = pd.read_csv(path_to_spin_file)
|
|
131
|
+
# Combine spin_start_sec and spin_start_subsec to get the spin start
|
|
132
|
+
# time in seconds. The spin start subseconds are in milliseconds.
|
|
133
|
+
spin_df["spin_start_time"] = (
|
|
134
|
+
spin_df["spin_start_sec"] + spin_df["spin_start_subsec"] / 1e3
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
return spin_df
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def get_spacecraft_spin_phase(
|
|
141
|
+
query_met_times: Union[float, npt.NDArray],
|
|
142
|
+
) -> Union[float, npt.NDArray]:
|
|
143
|
+
"""
|
|
144
|
+
Get the spacecraft spin phase for the input query times.
|
|
145
|
+
|
|
146
|
+
Formula to calculate spin phase:
|
|
147
|
+
spin_phase = (query_met_times - spin_start_time) / spin_period_sec
|
|
148
|
+
|
|
149
|
+
Parameters
|
|
150
|
+
----------
|
|
151
|
+
query_met_times : float or np.ndarray
|
|
152
|
+
Query times in Mission Elapsed Time (MET).
|
|
153
|
+
|
|
154
|
+
Returns
|
|
155
|
+
-------
|
|
156
|
+
spin_phase : float or np.ndarray
|
|
157
|
+
Spin phase for the input query times.
|
|
158
|
+
"""
|
|
159
|
+
spin_df = get_spin_data()
|
|
160
|
+
|
|
161
|
+
# Ensure query_met_times is an array
|
|
162
|
+
query_met_times = np.asarray(query_met_times)
|
|
163
|
+
is_scalar = query_met_times.ndim == 0
|
|
164
|
+
if is_scalar:
|
|
165
|
+
# Force scalar to array because np.asarray() will not
|
|
166
|
+
# convert scalar to array
|
|
167
|
+
query_met_times = np.atleast_1d(query_met_times)
|
|
168
|
+
# Empty array check
|
|
169
|
+
if query_met_times.size == 0:
|
|
170
|
+
return query_met_times
|
|
171
|
+
|
|
172
|
+
# Create an empty array to store spin phase results
|
|
173
|
+
spin_phases = np.zeros_like(query_met_times)
|
|
174
|
+
|
|
175
|
+
# Find all spin time that are less or equal to query_met_times.
|
|
176
|
+
# To do that, use side right, a[i-1] <= v < a[i], in the searchsorted.
|
|
177
|
+
# Eg.
|
|
178
|
+
# >>> df['a']
|
|
179
|
+
# array([0, 15, 30, 45, 60])
|
|
180
|
+
# >>> np.searchsorted(df['a'], [0, 13, 15, 32, 70], side='right')
|
|
181
|
+
# array([1, 1, 2, 3, 5])
|
|
182
|
+
last_spin_indices = np.searchsorted(
|
|
183
|
+
spin_df["spin_start_time"], query_met_times, side="right"
|
|
184
|
+
)
|
|
185
|
+
# Make sure input times are within the bounds of spin data
|
|
186
|
+
spin_df_start_time = spin_df["spin_start_time"].values[0]
|
|
187
|
+
spin_df_end_time = (
|
|
188
|
+
spin_df["spin_start_time"].values[-1] + spin_df["spin_period_sec"].values[-1]
|
|
189
|
+
)
|
|
190
|
+
input_start_time = query_met_times.min()
|
|
191
|
+
input_end_time = query_met_times.max()
|
|
192
|
+
if input_start_time < spin_df_start_time or input_end_time > spin_df_end_time:
|
|
193
|
+
raise ValueError(
|
|
194
|
+
f"Query times, {query_met_times} are outside of the spin data range, "
|
|
195
|
+
f"{spin_df_start_time, spin_df_end_time}."
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# Calculate spin phase
|
|
199
|
+
spin_phases = (
|
|
200
|
+
query_met_times - spin_df["spin_start_time"].values[last_spin_indices]
|
|
201
|
+
) / spin_df["spin_period_sec"].values[last_spin_indices]
|
|
202
|
+
|
|
203
|
+
# Check for invalid spin phase using below checks:
|
|
204
|
+
# 1. Check that the spin phase is in valid range, [0, 1).
|
|
205
|
+
# 2. Check invalid spin phase using spin_phase_valid,
|
|
206
|
+
# spin_period_valid columns.
|
|
207
|
+
invalid_spin_phase_range = (spin_phases < 0) | (spin_phases >= 1)
|
|
208
|
+
|
|
209
|
+
invalid_spins = (spin_df["spin_phase_valid"].values[last_spin_indices] == 0) | (
|
|
210
|
+
spin_df["spin_period_valid"].values[last_spin_indices] == 0
|
|
211
|
+
)
|
|
212
|
+
bad_spin_phases = invalid_spin_phase_range | invalid_spins
|
|
213
|
+
spin_phases[bad_spin_phases] = np.nan
|
|
214
|
+
|
|
215
|
+
if is_scalar:
|
|
216
|
+
return spin_phases[0]
|
|
217
|
+
return spin_phases
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
@typing.no_type_check
|
|
221
|
+
@ensure_spice
|
|
222
|
+
def frame_transform(
|
|
223
|
+
et: Union[float, npt.NDArray],
|
|
224
|
+
position: npt.NDArray,
|
|
225
|
+
from_frame: SpiceFrame,
|
|
226
|
+
to_frame: SpiceFrame,
|
|
227
|
+
) -> npt.NDArray:
|
|
228
|
+
"""
|
|
229
|
+
Transform an <x, y, z> vector between reference frames (rotation only).
|
|
230
|
+
|
|
231
|
+
This function is a vectorized equivalent to performing the following SPICE
|
|
232
|
+
calls for each input time and position vector to perform the transform.
|
|
233
|
+
The matrix multiplication step is done using `numpy.matmul` rather than
|
|
234
|
+
`spice.mxv`.
|
|
235
|
+
>>> rotation_matrix = spice.pxform(from_frame, to_frame, et)
|
|
236
|
+
... result = spice.mxv(rotation_matrix, position)
|
|
237
|
+
|
|
238
|
+
Parameters
|
|
239
|
+
----------
|
|
240
|
+
et : float or npt.NDArray
|
|
241
|
+
Ephemeris time(s) corresponding to position(s).
|
|
242
|
+
position : npt.NDArray
|
|
243
|
+
<x, y, z> vector or array of vectors in reference frame `from_frame`.
|
|
244
|
+
from_frame : SpiceFrame
|
|
245
|
+
Reference frame of input vector(s).
|
|
246
|
+
to_frame : SpiceFrame
|
|
247
|
+
Reference frame of output vector(s).
|
|
248
|
+
|
|
249
|
+
Returns
|
|
250
|
+
-------
|
|
251
|
+
result : npt.NDArray
|
|
252
|
+
3d position vector(s) in reference frame `to_frame`.
|
|
253
|
+
"""
|
|
254
|
+
if position.ndim == 1:
|
|
255
|
+
if not len(position) == 3:
|
|
256
|
+
raise ValueError(
|
|
257
|
+
"Position vectors with one dimension must have 3 elements."
|
|
258
|
+
)
|
|
259
|
+
if not isinstance(et, float):
|
|
260
|
+
raise ValueError(
|
|
261
|
+
"Ephemeris time must be float when single position vector is provided."
|
|
262
|
+
)
|
|
263
|
+
elif position.ndim == 2:
|
|
264
|
+
if not position.shape[1] == 3:
|
|
265
|
+
raise ValueError(
|
|
266
|
+
f"Invalid position shape: {position.shape}. "
|
|
267
|
+
f"Each input position vector must have 3 elements."
|
|
268
|
+
)
|
|
269
|
+
if not len(position) == len(et):
|
|
270
|
+
raise ValueError(
|
|
271
|
+
"Mismatch in number of position vectors and Ephemeris times provided."
|
|
272
|
+
f"Position has {len(position)} elements and et has {len(et)} elements."
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
# rotate will have shape = (3, 3) or (n, 3, 3)
|
|
276
|
+
# position will have shape = (3,) or (n, 3)
|
|
277
|
+
rotate = get_rotation_matrix(et, from_frame, to_frame)
|
|
278
|
+
# adding a dimension to position results in the following input and output
|
|
279
|
+
# shapes from matrix multiplication
|
|
280
|
+
# Single et/position: (3, 3),(3, 1) -> (3, 1)
|
|
281
|
+
# Multiple et/positions : (n, 3, 3),(n, 3, 1) -> (n, 3, 1)
|
|
282
|
+
result = np.squeeze(rotate @ position[..., np.newaxis])
|
|
283
|
+
|
|
284
|
+
return result
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def get_rotation_matrix(
|
|
288
|
+
et: Union[float, npt.NDArray],
|
|
289
|
+
from_frame: SpiceFrame,
|
|
290
|
+
to_frame: SpiceFrame,
|
|
291
|
+
) -> npt.NDArray:
|
|
292
|
+
"""
|
|
293
|
+
Get the rotation matrix/matrices that can be used to transform between frames.
|
|
294
|
+
|
|
295
|
+
This is a vectorized wrapper around `spiceypy.pxform`
|
|
296
|
+
"Return the matrix that transforms position vectors from one specified frame
|
|
297
|
+
to another at a specified epoch."
|
|
298
|
+
https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/cspice/pxform_c.html
|
|
299
|
+
|
|
300
|
+
Parameters
|
|
301
|
+
----------
|
|
302
|
+
et : float or npt.NDArray
|
|
303
|
+
Ephemeris time(s) for which to get the rotation matrices.
|
|
304
|
+
from_frame : SpiceFrame
|
|
305
|
+
Reference frame to transform from.
|
|
306
|
+
to_frame : SpiceFrame
|
|
307
|
+
Reference frame to transform to.
|
|
308
|
+
|
|
309
|
+
Returns
|
|
310
|
+
-------
|
|
311
|
+
rotation : npt.NDArray
|
|
312
|
+
If et is a float, the returned rotation matrix is of shape (3, 3). If
|
|
313
|
+
et is a np.ndarray, the returned rotation matrix is of shape (n, 3, 3)
|
|
314
|
+
where n matches the number of elements in et.
|
|
315
|
+
"""
|
|
316
|
+
vec_pxform = np.vectorize(
|
|
317
|
+
spice.pxform,
|
|
318
|
+
excluded=["fromstr", "tostr"],
|
|
319
|
+
signature="(),(),()->(3,3)",
|
|
320
|
+
otypes=[np.float64],
|
|
321
|
+
)
|
|
322
|
+
return vec_pxform(from_frame.name, to_frame.name, et)
|