imap-processing 0.11.0__py3-none-any.whl → 0.13.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.
Potentially problematic release.
This version of imap-processing might be problematic. Click here for more details.
- imap_processing/__init__.py +11 -11
- imap_processing/_version.py +2 -2
- imap_processing/ccsds/ccsds_data.py +1 -2
- imap_processing/ccsds/excel_to_xtce.py +66 -18
- imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +24 -40
- imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +934 -42
- imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +1846 -128
- imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +0 -5
- imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +10 -11
- imap_processing/cdf/config/imap_hi_variable_attrs.yaml +17 -19
- imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +27 -14
- imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +106 -116
- imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +120 -145
- imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +14 -0
- imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +25 -9
- imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +6 -4
- imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +3 -3
- imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +0 -12
- imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +1 -1
- imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +23 -20
- imap_processing/cdf/config/imap_mag_l1a_variable_attrs.yaml +361 -0
- imap_processing/cdf/config/imap_mag_l1b_variable_attrs.yaml +160 -0
- imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +160 -0
- imap_processing/cdf/config/imap_spacecraft_global_cdf_attrs.yaml +18 -0
- imap_processing/cdf/config/imap_spacecraft_variable_attrs.yaml +40 -0
- imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +1 -5
- imap_processing/cdf/config/imap_swapi_variable_attrs.yaml +22 -0
- imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +12 -4
- imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +16 -2
- imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +64 -52
- imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +71 -47
- imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +180 -19
- imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +5045 -41
- imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +80 -17
- imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +32 -57
- imap_processing/cdf/utils.py +52 -38
- imap_processing/cli.py +477 -233
- imap_processing/codice/codice_l1a.py +466 -131
- imap_processing/codice/codice_l1b.py +51 -152
- imap_processing/codice/constants.py +1360 -569
- imap_processing/codice/decompress.py +2 -6
- imap_processing/ena_maps/ena_maps.py +1103 -146
- imap_processing/ena_maps/utils/coordinates.py +19 -0
- imap_processing/ena_maps/utils/map_utils.py +14 -17
- imap_processing/ena_maps/utils/spatial_utils.py +55 -52
- imap_processing/glows/l1a/glows_l1a.py +28 -99
- imap_processing/glows/l1a/glows_l1a_data.py +2 -2
- imap_processing/glows/l1b/glows_l1b.py +1 -4
- imap_processing/glows/l1b/glows_l1b_data.py +1 -3
- imap_processing/glows/l2/glows_l2.py +2 -5
- imap_processing/hi/l1a/hi_l1a.py +54 -29
- imap_processing/hi/l1a/histogram.py +0 -1
- imap_processing/hi/l1a/science_direct_event.py +6 -8
- imap_processing/hi/l1b/hi_l1b.py +111 -82
- imap_processing/hi/l1c/hi_l1c.py +416 -32
- imap_processing/hi/utils.py +58 -12
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-sector-dt0-factors_20250219_v002.csv +81 -0
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt0-factors_20250219_v002.csv +205 -0
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt1-factors_20250219_v002.csv +205 -0
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt2-factors_20250219_v002.csv +205 -0
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt3-factors_20250219_v002.csv +205 -0
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-summed-dt0-factors_20250219_v002.csv +68 -0
- imap_processing/hit/hit_utils.py +235 -5
- imap_processing/hit/l0/constants.py +20 -11
- imap_processing/hit/l0/decom_hit.py +21 -5
- imap_processing/hit/l1a/hit_l1a.py +71 -75
- imap_processing/hit/l1b/constants.py +321 -0
- imap_processing/hit/l1b/hit_l1b.py +377 -67
- imap_processing/hit/l2/constants.py +318 -0
- imap_processing/hit/l2/hit_l2.py +723 -0
- imap_processing/hit/packet_definitions/hit_packet_definitions.xml +1323 -71
- imap_processing/ialirt/l0/mag_l0_ialirt_data.py +155 -0
- imap_processing/ialirt/l0/parse_mag.py +374 -0
- imap_processing/ialirt/l0/process_swapi.py +69 -0
- imap_processing/ialirt/l0/process_swe.py +548 -0
- imap_processing/ialirt/packet_definitions/ialirt.xml +216 -208
- imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +1 -1
- imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +1 -1
- imap_processing/ialirt/packet_definitions/ialirt_mag.xml +115 -0
- imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +14 -14
- imap_processing/ialirt/utils/grouping.py +114 -0
- imap_processing/ialirt/utils/time.py +29 -0
- imap_processing/idex/atomic_masses.csv +22 -0
- imap_processing/idex/decode.py +2 -2
- imap_processing/idex/idex_constants.py +33 -0
- imap_processing/idex/idex_l0.py +22 -8
- imap_processing/idex/idex_l1a.py +81 -51
- imap_processing/idex/idex_l1b.py +13 -39
- imap_processing/idex/idex_l2a.py +823 -0
- imap_processing/idex/idex_l2b.py +120 -0
- imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +11 -11
- imap_processing/idex/packet_definitions/idex_housekeeping_packet_definition.xml +9130 -0
- imap_processing/lo/l0/lo_science.py +7 -2
- imap_processing/lo/l1a/lo_l1a.py +1 -5
- imap_processing/lo/l1b/lo_l1b.py +702 -29
- imap_processing/lo/l1b/tof_conversions.py +11 -0
- imap_processing/lo/l1c/lo_l1c.py +1 -4
- imap_processing/mag/constants.py +51 -0
- imap_processing/mag/imap_mag_sdc_configuration_v001.py +8 -0
- imap_processing/mag/l0/decom_mag.py +10 -3
- imap_processing/mag/l1a/mag_l1a.py +23 -19
- imap_processing/mag/l1a/mag_l1a_data.py +35 -10
- imap_processing/mag/l1b/mag_l1b.py +259 -50
- imap_processing/mag/l1c/interpolation_methods.py +388 -0
- imap_processing/mag/l1c/mag_l1c.py +621 -17
- imap_processing/mag/l2/mag_l2.py +140 -0
- imap_processing/mag/l2/mag_l2_data.py +288 -0
- imap_processing/quality_flags.py +1 -0
- imap_processing/spacecraft/packet_definitions/scid_x252.xml +538 -0
- imap_processing/spacecraft/quaternions.py +121 -0
- imap_processing/spice/geometry.py +19 -22
- imap_processing/spice/kernels.py +0 -276
- imap_processing/spice/pointing_frame.py +257 -0
- imap_processing/spice/repoint.py +149 -0
- imap_processing/spice/spin.py +38 -33
- imap_processing/spice/time.py +24 -0
- imap_processing/swapi/l1/swapi_l1.py +20 -12
- imap_processing/swapi/l2/swapi_l2.py +116 -5
- imap_processing/swapi/swapi_utils.py +32 -0
- imap_processing/swe/l1a/swe_l1a.py +44 -12
- imap_processing/swe/l1a/swe_science.py +13 -13
- imap_processing/swe/l1b/swe_l1b.py +898 -23
- imap_processing/swe/l2/swe_l2.py +75 -136
- imap_processing/swe/packet_definitions/swe_packet_definition.xml +1121 -1
- imap_processing/swe/utils/swe_constants.py +64 -0
- imap_processing/swe/utils/swe_utils.py +85 -28
- imap_processing/tests/ccsds/test_data/expected_output.xml +40 -1
- imap_processing/tests/ccsds/test_excel_to_xtce.py +24 -21
- imap_processing/tests/cdf/test_data/imap_instrument2_global_cdf_attrs.yaml +0 -2
- imap_processing/tests/cdf/test_utils.py +14 -16
- imap_processing/tests/codice/conftest.py +44 -33
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-singles_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-ialirt_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-omni_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-priorities_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-sectored_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/test_codice_l1a.py +126 -53
- imap_processing/tests/codice/test_codice_l1b.py +6 -7
- imap_processing/tests/codice/test_decompress.py +4 -4
- imap_processing/tests/conftest.py +239 -27
- imap_processing/tests/ena_maps/conftest.py +51 -0
- imap_processing/tests/ena_maps/test_ena_maps.py +1068 -110
- imap_processing/tests/ena_maps/test_map_utils.py +66 -43
- imap_processing/tests/ena_maps/test_spatial_utils.py +17 -21
- imap_processing/tests/glows/conftest.py +10 -14
- imap_processing/tests/glows/test_glows_decom.py +4 -4
- imap_processing/tests/glows/test_glows_l1a_cdf.py +6 -27
- imap_processing/tests/glows/test_glows_l1a_data.py +6 -8
- imap_processing/tests/glows/test_glows_l1b.py +11 -11
- imap_processing/tests/glows/test_glows_l1b_data.py +5 -5
- imap_processing/tests/glows/test_glows_l2.py +2 -8
- imap_processing/tests/hi/conftest.py +1 -1
- imap_processing/tests/hi/data/l0/H45_diag_fee_20250208.bin +0 -0
- imap_processing/tests/hi/data/l0/H45_diag_fee_20250208_verify.csv +205 -0
- imap_processing/tests/hi/test_hi_l1b.py +22 -27
- imap_processing/tests/hi/test_hi_l1c.py +249 -18
- imap_processing/tests/hi/test_l1a.py +35 -7
- imap_processing/tests/hi/test_science_direct_event.py +3 -3
- imap_processing/tests/hi/test_utils.py +24 -2
- imap_processing/tests/hit/helpers/l1_validation.py +74 -73
- imap_processing/tests/hit/test_data/hskp_sample.ccsds +0 -0
- imap_processing/tests/hit/test_data/imap_hit_l0_raw_20100105_v001.pkts +0 -0
- imap_processing/tests/hit/test_decom_hit.py +5 -1
- imap_processing/tests/hit/test_hit_l1a.py +32 -36
- imap_processing/tests/hit/test_hit_l1b.py +300 -81
- imap_processing/tests/hit/test_hit_l2.py +716 -0
- imap_processing/tests/hit/test_hit_utils.py +184 -7
- imap_processing/tests/hit/validation_data/hit_l1b_standard_sample2_nsrl_v4_3decimals.csv +62 -62
- imap_processing/tests/hit/validation_data/hskp_sample_eu_3_6_2025.csv +89 -0
- imap_processing/tests/hit/validation_data/hskp_sample_raw.csv +89 -88
- imap_processing/tests/hit/validation_data/sci_sample_raw.csv +1 -1
- imap_processing/tests/ialirt/data/l0/461971383-404.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971384-405.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971385-406.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971386-407.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971387-408.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971388-409.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971389-410.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971390-411.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971391-412.bin +0 -0
- imap_processing/tests/ialirt/data/l0/sample_decoded_i-alirt_data.csv +383 -0
- imap_processing/tests/ialirt/unit/test_decom_ialirt.py +16 -81
- imap_processing/tests/ialirt/unit/test_grouping.py +81 -0
- imap_processing/tests/ialirt/unit/test_parse_mag.py +223 -0
- imap_processing/tests/ialirt/unit/test_process_codicehi.py +3 -3
- imap_processing/tests/ialirt/unit/test_process_codicelo.py +3 -10
- imap_processing/tests/ialirt/unit/test_process_ephemeris.py +4 -4
- imap_processing/tests/ialirt/unit/test_process_hit.py +3 -3
- imap_processing/tests/ialirt/unit/test_process_swapi.py +24 -16
- imap_processing/tests/ialirt/unit/test_process_swe.py +319 -6
- imap_processing/tests/ialirt/unit/test_time.py +16 -0
- imap_processing/tests/idex/conftest.py +127 -6
- imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231218_v001.pkts +0 -0
- imap_processing/tests/idex/test_data/imap_idex_l0_raw_20241206_v001.pkts +0 -0
- imap_processing/tests/idex/test_data/imap_idex_l0_raw_20250108_v001.pkts +0 -0
- imap_processing/tests/idex/test_data/impact_14_tof_high_data.txt +4508 -4508
- imap_processing/tests/idex/test_idex_l0.py +33 -11
- imap_processing/tests/idex/test_idex_l1a.py +92 -21
- imap_processing/tests/idex/test_idex_l1b.py +106 -27
- imap_processing/tests/idex/test_idex_l2a.py +399 -0
- imap_processing/tests/idex/test_idex_l2b.py +93 -0
- imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20241022_v002.cdf +0 -0
- imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20241022_v002.cdf +0 -0
- imap_processing/tests/lo/test_lo_l1a.py +3 -3
- imap_processing/tests/lo/test_lo_l1b.py +515 -6
- imap_processing/tests/lo/test_lo_l1c.py +1 -1
- imap_processing/tests/lo/test_lo_science.py +7 -7
- imap_processing/tests/lo/test_star_sensor.py +1 -1
- imap_processing/tests/mag/conftest.py +120 -2
- imap_processing/tests/mag/test_mag_decom.py +5 -4
- imap_processing/tests/mag/test_mag_l1a.py +51 -7
- imap_processing/tests/mag/test_mag_l1b.py +40 -59
- imap_processing/tests/mag/test_mag_l1c.py +354 -19
- imap_processing/tests/mag/test_mag_l2.py +130 -0
- imap_processing/tests/mag/test_mag_validation.py +247 -26
- imap_processing/tests/mag/validation/L1b/T009/MAGScience-normal-(2,2)-8s-20250204-16h39.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-magi-out.csv +16 -16
- imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-mago-out.csv +16 -16
- imap_processing/tests/mag/validation/L1b/T010/MAGScience-normal-(2,2)-8s-20250206-12h05.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T011/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-magi-out.csv +16 -16
- imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-mago-out.csv +16 -16
- imap_processing/tests/mag/validation/L1b/T012/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T012/data.bin +0 -0
- imap_processing/tests/mag/validation/L1b/T012/field_like_all_ranges.txt +19200 -0
- imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-cal.cdf +0 -0
- imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-in.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-magi-out.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-mago-out.csv +17 -0
- imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-in.csv +1217 -0
- imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-out.csv +1857 -0
- imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-in.csv +1217 -0
- imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-out.csv +1857 -0
- imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-in.csv +1217 -0
- imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-out.csv +1793 -0
- imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-in.csv +1217 -0
- imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-out.csv +1793 -0
- imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-burst-in.csv +2561 -0
- imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-in.csv +961 -0
- imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-out.csv +1539 -0
- imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-in.csv +1921 -0
- imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-out.csv +2499 -0
- imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-in.csv +865 -0
- imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-out.csv +1196 -0
- imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-in.csv +1729 -0
- imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-out.csv +3053 -0
- imap_processing/tests/mag/validation/L2/imap_mag_l1b_norm-mago_20251017_v002.cdf +0 -0
- imap_processing/tests/mag/validation/calibration/imap_mag_l1b-calibration_20240229_v001.cdf +0 -0
- imap_processing/tests/mag/validation/calibration/imap_mag_l2-calibration-matrices_20251017_v004.cdf +0 -0
- imap_processing/tests/mag/validation/calibration/imap_mag_l2-offsets-norm_20251017_20251017_v001.cdf +0 -0
- imap_processing/tests/spacecraft/data/SSR_2024_190_20_08_12_0483851794_2_DA_apid0594_1packet.pkts +0 -0
- imap_processing/tests/spacecraft/test_quaternions.py +71 -0
- imap_processing/tests/spice/test_data/fake_repoint_data.csv +5 -0
- imap_processing/tests/spice/test_data/fake_spin_data.csv +11 -11
- imap_processing/tests/spice/test_geometry.py +9 -12
- imap_processing/tests/spice/test_kernels.py +1 -200
- imap_processing/tests/spice/test_pointing_frame.py +185 -0
- imap_processing/tests/spice/test_repoint.py +121 -0
- imap_processing/tests/spice/test_spin.py +50 -9
- imap_processing/tests/spice/test_time.py +14 -0
- imap_processing/tests/swapi/lut/imap_swapi_esa-unit-conversion_20250211_v000.csv +73 -0
- imap_processing/tests/swapi/lut/imap_swapi_lut-notes_20250211_v000.csv +1025 -0
- imap_processing/tests/swapi/test_swapi_l1.py +13 -11
- imap_processing/tests/swapi/test_swapi_l2.py +180 -8
- imap_processing/tests/swe/l0_data/2024051010_SWE_HK_packet.bin +0 -0
- imap_processing/tests/swe/l0_data/2024051011_SWE_CEM_RAW_packet.bin +0 -0
- imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_APP_HK_20240510_092742.csv +49 -0
- imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_CEM_RAW_20240510_092742.csv +593 -0
- imap_processing/tests/swe/lut/checker-board-indices.csv +24 -0
- imap_processing/tests/swe/lut/imap_swe_esa-lut_20250301_v000.csv +385 -0
- imap_processing/tests/swe/lut/imap_swe_l1b-in-flight-cal_20240510_20260716_v000.csv +3 -0
- imap_processing/tests/swe/test_swe_l1a.py +20 -2
- imap_processing/tests/swe/test_swe_l1a_cem_raw.py +52 -0
- imap_processing/tests/swe/test_swe_l1a_hk.py +68 -0
- imap_processing/tests/swe/test_swe_l1a_science.py +3 -3
- imap_processing/tests/swe/test_swe_l1b.py +162 -24
- imap_processing/tests/swe/test_swe_l2.py +153 -91
- imap_processing/tests/test_cli.py +171 -88
- imap_processing/tests/test_utils.py +140 -17
- imap_processing/tests/ultra/data/l0/FM45_UltraFM45_Functional_2024-01-22T0105_20240122T010548.CCSDS +0 -0
- imap_processing/tests/ultra/data/l0/ultra45_raw_sc_ultraimgrates_20220530_00.csv +164 -0
- imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultrarawimg_withFSWcalcs_FM45_40P_Phi28p5_BeamCal_LinearScan_phi2850_theta-000_20240207T102740.csv +3243 -3243
- imap_processing/tests/ultra/data/mock_data.py +369 -0
- imap_processing/tests/ultra/unit/conftest.py +115 -89
- imap_processing/tests/ultra/unit/test_badtimes.py +4 -4
- imap_processing/tests/ultra/unit/test_cullingmask.py +8 -6
- imap_processing/tests/ultra/unit/test_de.py +14 -13
- imap_processing/tests/ultra/unit/test_decom_apid_880.py +27 -76
- imap_processing/tests/ultra/unit/test_decom_apid_881.py +54 -11
- imap_processing/tests/ultra/unit/test_decom_apid_883.py +12 -10
- imap_processing/tests/ultra/unit/test_decom_apid_896.py +202 -55
- imap_processing/tests/ultra/unit/test_lookup_utils.py +23 -1
- imap_processing/tests/ultra/unit/test_spacecraft_pset.py +77 -0
- imap_processing/tests/ultra/unit/test_ultra_l1a.py +98 -305
- imap_processing/tests/ultra/unit/test_ultra_l1b.py +60 -14
- imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +2 -2
- imap_processing/tests/ultra/unit/test_ultra_l1b_culling.py +26 -27
- imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +239 -70
- imap_processing/tests/ultra/unit/test_ultra_l1c.py +5 -5
- imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +114 -83
- imap_processing/tests/ultra/unit/test_ultra_l2.py +230 -0
- imap_processing/ultra/constants.py +1 -1
- imap_processing/ultra/l0/decom_tools.py +27 -39
- imap_processing/ultra/l0/decom_ultra.py +168 -204
- imap_processing/ultra/l0/ultra_utils.py +152 -136
- imap_processing/ultra/l1a/ultra_l1a.py +55 -271
- imap_processing/ultra/l1b/badtimes.py +1 -4
- imap_processing/ultra/l1b/cullingmask.py +2 -6
- imap_processing/ultra/l1b/de.py +116 -57
- imap_processing/ultra/l1b/extendedspin.py +20 -18
- imap_processing/ultra/l1b/lookup_utils.py +72 -9
- imap_processing/ultra/l1b/ultra_l1b.py +36 -16
- imap_processing/ultra/l1b/ultra_l1b_culling.py +66 -30
- imap_processing/ultra/l1b/ultra_l1b_extended.py +297 -94
- imap_processing/ultra/l1c/histogram.py +2 -6
- imap_processing/ultra/l1c/spacecraft_pset.py +84 -0
- imap_processing/ultra/l1c/ultra_l1c.py +8 -9
- imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +206 -108
- imap_processing/ultra/l2/ultra_l2.py +299 -0
- imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_LeftSlit.csv +526 -0
- imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_RightSlit.csv +526 -0
- imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_LeftSlit.csv +526 -0
- imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_RightSlit.csv +526 -0
- imap_processing/ultra/lookup_tables/FM45_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -2
- imap_processing/ultra/lookup_tables/FM90_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -0
- imap_processing/ultra/packet_definitions/README.md +38 -0
- imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +15302 -482
- imap_processing/ultra/utils/ultra_l1_utils.py +31 -12
- imap_processing/utils.py +69 -29
- {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/METADATA +10 -6
- imap_processing-0.13.0.dist-info/RECORD +578 -0
- imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +0 -237
- imap_processing/hi/l1a/housekeeping.py +0 -27
- imap_processing/hi/l1b/hi_eng_unit_convert_table.csv +0 -154
- imap_processing/swe/l1b/swe_esa_lookup_table.csv +0 -1441
- imap_processing/swe/l1b/swe_l1b_science.py +0 -652
- 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/hi/data/l1/imap_hi_l1b_45sensor-de_20250415_v999.cdf +0 -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/validation_data/hskp_sample_eu.csv +0 -89
- imap_processing/tests/hit/validation_data/sci_sample_raw1.csv +0 -29
- imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231214_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/swe/test_swe_l1b_science.py +0 -84
- imap_processing/tests/ultra/test_data/mock_data.py +0 -161
- imap_processing/ultra/l1c/pset.py +0 -40
- imap_processing/ultra/lookup_tables/dps_sensitivity45.cdf +0 -0
- imap_processing-0.11.0.dist-info/RECORD +0 -488
- /imap_processing/idex/packet_definitions/{idex_packet_definition.xml → idex_science_packet_definition.xml} +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/20240827095047_SWE_IALIRT_packet.bin +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/BinLog CCSDS_FRAG_TLM_20240826_152323Z_IALIRT_data_for_SDC.bin +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/IALiRT Raw Packet Telemetry.txt +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/apid01152.tlm +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/eu_SWP_IAL_20240826_152033.csv +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/hi_fsw_view_1_ccsds.bin +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.ccsds +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.csv +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/idle_export_eu.SWE_IALIRT_20240827_093852.csv +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_hi-ialirt_20240523200000_v0.0.0.cdf +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
- /imap_processing/{mag/l1b → tests/spacecraft}/__init__.py +0 -0
- /imap_processing/{swe/l1b/engineering_unit_convert_table.csv → tests/swe/lut/imap_swe_eu-conversion_20240510_v000.csv} +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50_theta-0.00_20240207T102740.CCSDS +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/FM45_7P_Phi0.0_BeamCal_LinearScan_phi0.04_theta-0.01_20230821T121304.CCSDS +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.CCSDS +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.CCSDS +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_auxdata_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_enaphxtofhangimg_FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.csv +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultraimgrates_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultrarawimgevent_FM45_7P_Phi00_BeamCal_LinearScan_phi004_theta-001_20230821T121304.csv +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E1.cdf +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E12.cdf +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E24.cdf +0 -0
- {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/LICENSE +0 -0
- {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/WHEEL +0 -0
- {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/entry_points.txt +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""MAG L1B Processing."""
|
|
2
2
|
|
|
3
|
+
import logging
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
|
|
5
6
|
import numpy as np
|
|
@@ -8,9 +9,14 @@ from xarray import Dataset
|
|
|
8
9
|
|
|
9
10
|
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
|
|
10
11
|
from imap_processing.cdf.utils import load_cdf
|
|
12
|
+
from imap_processing.mag.constants import vectors_per_second_from_string
|
|
11
13
|
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
12
15
|
|
|
13
|
-
|
|
16
|
+
|
|
17
|
+
def mag_l1b(
|
|
18
|
+
input_dataset: xr.Dataset, calibration_dataset: xr.Dataset = None
|
|
19
|
+
) -> Dataset:
|
|
14
20
|
"""
|
|
15
21
|
Will process MAG L1B data from L1A data.
|
|
16
22
|
|
|
@@ -18,8 +24,10 @@ def mag_l1b(input_dataset: xr.Dataset, version: str) -> Dataset:
|
|
|
18
24
|
----------
|
|
19
25
|
input_dataset : xr.Dataset
|
|
20
26
|
The input dataset to process.
|
|
21
|
-
|
|
22
|
-
The
|
|
27
|
+
calibration_dataset : xr.Dataset
|
|
28
|
+
The calibration dataset containing calibration matrices and timeshift values for
|
|
29
|
+
mago and magi.
|
|
30
|
+
When None, this defaults to the test calibration file.
|
|
23
31
|
|
|
24
32
|
Returns
|
|
25
33
|
-------
|
|
@@ -28,62 +36,85 @@ def mag_l1b(input_dataset: xr.Dataset, version: str) -> Dataset:
|
|
|
28
36
|
"""
|
|
29
37
|
# TODO:
|
|
30
38
|
# Read in calibration file
|
|
31
|
-
|
|
32
|
-
|
|
39
|
+
|
|
40
|
+
# TODO: This should definitely be loaded from AWS
|
|
41
|
+
if calibration_dataset is None:
|
|
42
|
+
calibration_dataset = load_cdf(
|
|
43
|
+
Path(__file__).parent / "imap_calibration_mag_20240229_v01.cdf"
|
|
44
|
+
)
|
|
45
|
+
logger.info("Using default test calibration file.")
|
|
46
|
+
|
|
47
|
+
source = input_dataset.attrs["Logical_source"]
|
|
48
|
+
if isinstance(source, list):
|
|
49
|
+
source = source[0]
|
|
50
|
+
|
|
51
|
+
if "raw" in source:
|
|
33
52
|
# Raw files should not be processed in L1B.
|
|
34
53
|
raise ValueError("Raw L1A file passed into L1B. Unable to process.")
|
|
35
54
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
# Variable attributes can remain the same as L1A
|
|
42
|
-
input_logical_source = input_dataset.attrs["Logical_source"]
|
|
43
|
-
if isinstance(input_dataset.attrs["Logical_source"], list):
|
|
44
|
-
input_logical_source = input_dataset.attrs["Logical_source"][0]
|
|
55
|
+
mag_attributes = ImapCdfAttributes()
|
|
56
|
+
mag_attributes.add_instrument_global_attrs("mag")
|
|
57
|
+
mag_attributes.add_instrument_variable_attrs("mag", "l1b")
|
|
58
|
+
source = source.replace("l1a", "l1b")
|
|
45
59
|
|
|
46
|
-
|
|
47
|
-
|
|
60
|
+
output_dataset = mag_l1b_processing(
|
|
61
|
+
input_dataset, calibration_dataset, mag_attributes, source
|
|
62
|
+
)
|
|
48
63
|
|
|
49
64
|
return output_dataset
|
|
50
65
|
|
|
51
66
|
|
|
52
|
-
def mag_l1b_processing(
|
|
67
|
+
def mag_l1b_processing(
|
|
68
|
+
input_dataset: xr.Dataset,
|
|
69
|
+
calibration_dataset: xr.Dataset,
|
|
70
|
+
mag_attributes: ImapCdfAttributes,
|
|
71
|
+
logical_source: str,
|
|
72
|
+
) -> xr.Dataset:
|
|
53
73
|
"""
|
|
54
74
|
Will process MAG L1B data from L1A data.
|
|
55
75
|
|
|
56
76
|
MAG L1B is almost identical to L1A, with only the vectors and attributes getting
|
|
57
77
|
updated. All non-vector variables are the same.
|
|
58
78
|
|
|
79
|
+
This step rescales the vector data according to the compression width, and then
|
|
80
|
+
multiplies the vector according to the calibration matrix for a given range. It
|
|
81
|
+
also shifts the timestamps by the values defined in calibration_dataset.
|
|
82
|
+
|
|
59
83
|
Parameters
|
|
60
84
|
----------
|
|
61
85
|
input_dataset : xr.Dataset
|
|
62
86
|
The input dataset to process.
|
|
87
|
+
calibration_dataset : xr.Dataset
|
|
88
|
+
The calibration dataset containing calibration matrices and timeshift values for
|
|
89
|
+
mago and magi.
|
|
90
|
+
mag_attributes : ImapCdfAttributes
|
|
91
|
+
Attribute class for output CDF containing MAG L1B attributes.
|
|
92
|
+
logical_source : str
|
|
93
|
+
The expected logical source of the output file. Should look something like:
|
|
94
|
+
imap_mag_l1b_norm-magi.
|
|
63
95
|
|
|
64
96
|
Returns
|
|
65
97
|
-------
|
|
66
98
|
output_dataset : xr.Dataset
|
|
67
99
|
L1b dataset.
|
|
68
100
|
"""
|
|
69
|
-
|
|
70
|
-
|
|
101
|
+
if "mago" in logical_source:
|
|
102
|
+
is_mago = True
|
|
103
|
+
elif "magi" in logical_source:
|
|
104
|
+
is_mago = False
|
|
105
|
+
else:
|
|
106
|
+
raise ValueError(
|
|
107
|
+
f"Calibration matrix not found, invalid logical source "
|
|
108
|
+
f"{input_dataset.attrs['Logical_source']}"
|
|
109
|
+
)
|
|
71
110
|
|
|
72
|
-
|
|
73
|
-
|
|
111
|
+
# TODO: Check validity of time range for calibration
|
|
112
|
+
calibration_matrix, time_shift = retrieve_matrix_from_l1b_calibration(
|
|
113
|
+
calibration_dataset, is_mago
|
|
114
|
+
)
|
|
74
115
|
|
|
75
116
|
dims = [["direction"], ["compression"]]
|
|
76
117
|
new_dims = [["direction"], ["compression"]]
|
|
77
|
-
# TODO: This should definitely be loaded from AWS
|
|
78
|
-
calibration_dataset = load_cdf(
|
|
79
|
-
Path(__file__).parent / "imap_calibration_mag_20240229_v01.cdf"
|
|
80
|
-
)
|
|
81
|
-
# TODO: add time shift
|
|
82
|
-
# TODO: Check validity of time range for calibration
|
|
83
|
-
if "mago" in input_dataset.attrs["Logical_source"][0]:
|
|
84
|
-
calibration_matrix = calibration_dataset["MFOTOURFO"]
|
|
85
|
-
else:
|
|
86
|
-
calibration_matrix = calibration_dataset["MFITOURFI"]
|
|
87
118
|
|
|
88
119
|
l1b_fields = xr.apply_ufunc(
|
|
89
120
|
update_vector,
|
|
@@ -96,26 +127,121 @@ def mag_l1b_processing(input_dataset: xr.Dataset) -> xr.Dataset:
|
|
|
96
127
|
kwargs={"calibration_matrix": calibration_matrix},
|
|
97
128
|
)
|
|
98
129
|
|
|
99
|
-
|
|
100
|
-
output_dataset["vectors"].data = l1b_fields[0].data
|
|
130
|
+
epoch_time = shift_time(input_dataset["epoch"], time_shift)
|
|
101
131
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
132
|
+
# Update attributes and assemble dataset
|
|
133
|
+
epoch_time.attrs = mag_attributes.get_variable_attributes("epoch")
|
|
134
|
+
|
|
135
|
+
direction = xr.DataArray(
|
|
136
|
+
np.arange(4),
|
|
137
|
+
name="direction",
|
|
138
|
+
dims=["direction"],
|
|
139
|
+
attrs=mag_attributes.get_variable_attributes(
|
|
140
|
+
"direction_attrs", check_schema=False
|
|
141
|
+
),
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
compression = xr.DataArray(
|
|
145
|
+
np.arange(2),
|
|
146
|
+
name="compression",
|
|
147
|
+
dims=["compression"],
|
|
148
|
+
attrs=mag_attributes.get_variable_attributes(
|
|
149
|
+
"compression_attrs", check_schema=False
|
|
150
|
+
),
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
direction_label = xr.DataArray(
|
|
154
|
+
direction.values.astype(str),
|
|
155
|
+
name="direction_label",
|
|
156
|
+
dims=["direction_label"],
|
|
157
|
+
attrs=mag_attributes.get_variable_attributes(
|
|
158
|
+
"direction_label", check_schema=False
|
|
159
|
+
),
|
|
105
160
|
)
|
|
106
|
-
|
|
107
|
-
|
|
161
|
+
|
|
162
|
+
compression_label = xr.DataArray(
|
|
163
|
+
compression.values.astype(str),
|
|
164
|
+
name="compression_label",
|
|
165
|
+
dims=["compression_label"],
|
|
166
|
+
attrs=mag_attributes.get_variable_attributes(
|
|
167
|
+
"compression_label", check_schema=False
|
|
168
|
+
),
|
|
108
169
|
)
|
|
109
|
-
|
|
110
|
-
|
|
170
|
+
|
|
171
|
+
global_attributes = mag_attributes.get_global_attributes(logical_source)
|
|
172
|
+
try:
|
|
173
|
+
global_attributes["is_mago"] = input_dataset.attrs["is_mago"]
|
|
174
|
+
global_attributes["is_active"] = input_dataset.attrs["is_active"]
|
|
175
|
+
global_attributes["vectors_per_second"] = timeshift_vectors_per_second(
|
|
176
|
+
input_dataset.attrs["vectors_per_second"], time_shift
|
|
177
|
+
)
|
|
178
|
+
global_attributes["missing_sequences"] = input_dataset.attrs[
|
|
179
|
+
"missing_sequences"
|
|
180
|
+
]
|
|
181
|
+
except KeyError as e:
|
|
182
|
+
logger.info(
|
|
183
|
+
f"Key error when assigning global attributes, attribute not found in "
|
|
184
|
+
f"L1A file: {e}"
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
output_dataset = xr.Dataset(
|
|
188
|
+
coords={
|
|
189
|
+
"epoch": epoch_time,
|
|
190
|
+
"direction": direction,
|
|
191
|
+
"compression": compression,
|
|
192
|
+
"direction_label": direction_label,
|
|
193
|
+
"compression_label": compression_label,
|
|
194
|
+
},
|
|
195
|
+
attrs=global_attributes,
|
|
111
196
|
)
|
|
112
|
-
|
|
113
|
-
|
|
197
|
+
# Fill the output with data
|
|
198
|
+
output_dataset["vectors"] = xr.DataArray(
|
|
199
|
+
l1b_fields[0].data,
|
|
200
|
+
name="vectors",
|
|
201
|
+
dims=["epoch", "direction"],
|
|
202
|
+
attrs=mag_attributes.get_variable_attributes("vector_attrs"),
|
|
114
203
|
)
|
|
115
204
|
|
|
205
|
+
output_dataset["compression_flags"] = xr.DataArray(
|
|
206
|
+
input_dataset["compression_flags"].data,
|
|
207
|
+
name="compression_flags",
|
|
208
|
+
dims=["epoch", "compression"],
|
|
209
|
+
attrs=mag_attributes.get_variable_attributes("compression_flags_attrs"),
|
|
210
|
+
)
|
|
116
211
|
return output_dataset
|
|
117
212
|
|
|
118
213
|
|
|
214
|
+
def retrieve_matrix_from_l1b_calibration(
|
|
215
|
+
calibration_dataset: xr.Dataset, is_mago: bool = True
|
|
216
|
+
) -> tuple[xr.DataArray, xr.DataArray]:
|
|
217
|
+
"""
|
|
218
|
+
Retrieve the calibration matrix and time shift from the calibration dataset.
|
|
219
|
+
|
|
220
|
+
Parameters
|
|
221
|
+
----------
|
|
222
|
+
calibration_dataset : xarray.Dataset
|
|
223
|
+
The calibration dataset containing the calibration matrices and time shift.
|
|
224
|
+
is_mago : bool
|
|
225
|
+
Whether the calibration is for mago or magi. If True, it retrieves the mago
|
|
226
|
+
calibration matrix and time shift. If False, it retrieves the magi calibration
|
|
227
|
+
matrix and time shift.
|
|
228
|
+
|
|
229
|
+
Returns
|
|
230
|
+
-------
|
|
231
|
+
tuple[xr.DataArray, xr.DataArray]
|
|
232
|
+
The calibration matrix and time shift. These can be passed directly into
|
|
233
|
+
update_vector, calibrate_vector, and shift_time.
|
|
234
|
+
"""
|
|
235
|
+
if is_mago:
|
|
236
|
+
calibration_matrix = calibration_dataset["MFOTOURFO"]
|
|
237
|
+
time_shift = calibration_dataset["OTS"]
|
|
238
|
+
else:
|
|
239
|
+
calibration_matrix = calibration_dataset["MFITOURFI"]
|
|
240
|
+
time_shift = calibration_dataset["ITS"]
|
|
241
|
+
|
|
242
|
+
return calibration_matrix, time_shift
|
|
243
|
+
|
|
244
|
+
|
|
119
245
|
def update_vector(
|
|
120
246
|
input_vector: np.ndarray,
|
|
121
247
|
input_compression: np.ndarray,
|
|
@@ -177,11 +303,13 @@ def rescale_vector(
|
|
|
177
303
|
output_vector : numpy.ndarray
|
|
178
304
|
Updated vector.
|
|
179
305
|
"""
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
306
|
+
output_vector: np.ndarray = input_vector.astype(np.float64)
|
|
307
|
+
|
|
308
|
+
if compression_flags[0]:
|
|
183
309
|
factor = np.float_power(2, (16 - compression_flags[1]))
|
|
184
|
-
|
|
310
|
+
output_vector[:3] = input_vector.astype(np.float64)[:3] * factor
|
|
311
|
+
|
|
312
|
+
return output_vector
|
|
185
313
|
|
|
186
314
|
|
|
187
315
|
def calibrate_vector(
|
|
@@ -206,8 +334,89 @@ def calibrate_vector(
|
|
|
206
334
|
updated_vector : numpy.ndarray
|
|
207
335
|
Calibrated vector.
|
|
208
336
|
"""
|
|
209
|
-
updated_vector = input_vector.copy()
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
337
|
+
updated_vector: np.ndarray = input_vector.copy().astype(np.float64)
|
|
338
|
+
if input_vector[3] % 1 != 0:
|
|
339
|
+
raise ValueError("Range must be an integer.")
|
|
340
|
+
|
|
341
|
+
range = int(input_vector[3])
|
|
342
|
+
x_y_z = updated_vector[:3]
|
|
343
|
+
updated_vector[:3] = np.dot(calibration_matrix.values[:, :, range], x_y_z)
|
|
344
|
+
|
|
213
345
|
return updated_vector
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def shift_time(epoch_times: xr.DataArray, time_shift: xr.DataArray) -> xr.DataArray:
|
|
349
|
+
"""
|
|
350
|
+
Shift epoch times by the provided time_shift calibration value.
|
|
351
|
+
|
|
352
|
+
Sometimes the time values calculated from the sensor vary slightly from the "actual"
|
|
353
|
+
time the data was captured. To correct for this, the MAG team provides time shift
|
|
354
|
+
values in the calibration file. This function applies the time shift to the epoch
|
|
355
|
+
times.
|
|
356
|
+
|
|
357
|
+
The time shift is provided in seconds. A positive shift is adding time, while a
|
|
358
|
+
negative shift subtracts it (so the values move backwards.)
|
|
359
|
+
|
|
360
|
+
This may mean vectors shift out of the specific day that is being processed. To
|
|
361
|
+
manage this, all MAG L0, L1A, L1B, and L1C science data files contain an extra 30
|
|
362
|
+
minute buffer on either side (so the data ranges from
|
|
363
|
+
midnight - 30 minutes to midnight + 24 hours + 30 minutes.)
|
|
364
|
+
The extra buffer is removed at L1D and L2 so those science files are exactly 24
|
|
365
|
+
hours long.
|
|
366
|
+
|
|
367
|
+
For more information please refer to the algorithm document.
|
|
368
|
+
|
|
369
|
+
Parameters
|
|
370
|
+
----------
|
|
371
|
+
epoch_times : xr.DataArray
|
|
372
|
+
The input epoch times, in TT J2000 ns.
|
|
373
|
+
time_shift : xr.DataArray
|
|
374
|
+
The time shift to apply for the given sensor. This should be one value and is
|
|
375
|
+
in seconds.
|
|
376
|
+
|
|
377
|
+
Returns
|
|
378
|
+
-------
|
|
379
|
+
shifted_times : xr.DataArray
|
|
380
|
+
The shifted epoch times, equal to epoch_times with time_shift added to each
|
|
381
|
+
value.
|
|
382
|
+
"""
|
|
383
|
+
if time_shift.size != 1:
|
|
384
|
+
raise ValueError("Time shift must be a single value.")
|
|
385
|
+
# Time shift is in seconds
|
|
386
|
+
time_shift_ns = time_shift.data * 1e9
|
|
387
|
+
|
|
388
|
+
return epoch_times + time_shift_ns
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def timeshift_vectors_per_second(
|
|
392
|
+
vectors_per_second: str, time_shift: xr.DataArray
|
|
393
|
+
) -> str:
|
|
394
|
+
"""
|
|
395
|
+
Shift the vectors per second attribute by the time shift value.
|
|
396
|
+
|
|
397
|
+
This ensures that the vectors per second attribute is aligned with the epoch values
|
|
398
|
+
if the time is shifted.
|
|
399
|
+
|
|
400
|
+
Parameters
|
|
401
|
+
----------
|
|
402
|
+
vectors_per_second : str
|
|
403
|
+
The vectors per second attribute from the input dataset, in the format
|
|
404
|
+
"timestamp:rate,timestamp:rate".
|
|
405
|
+
time_shift : xr.DataArray
|
|
406
|
+
The time shift to apply for the given sensor. This should be one value and is
|
|
407
|
+
in seconds.
|
|
408
|
+
|
|
409
|
+
Returns
|
|
410
|
+
-------
|
|
411
|
+
str
|
|
412
|
+
The updated vectors per second attribute.
|
|
413
|
+
"""
|
|
414
|
+
time_shift_ns = time_shift.data * 1e9
|
|
415
|
+
|
|
416
|
+
vecsec = vectors_per_second_from_string(vectors_per_second)
|
|
417
|
+
new_vecsec = ""
|
|
418
|
+
for time, rate in vecsec.items():
|
|
419
|
+
new_time = time + time_shift_ns
|
|
420
|
+
new_vecsec += f"{new_time.astype(np.int64)}:{rate},"
|
|
421
|
+
|
|
422
|
+
return new_vecsec[:-1]
|