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
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""Module to run MAG L2 processing."""
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
import xarray as xr
|
|
5
|
+
|
|
6
|
+
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
|
|
7
|
+
from imap_processing.mag import imap_mag_sdc_configuration_v001 as configuration
|
|
8
|
+
from imap_processing.mag.constants import DataMode
|
|
9
|
+
from imap_processing.mag.l1b.mag_l1b import calibrate_vector
|
|
10
|
+
from imap_processing.mag.l2.mag_l2_data import MagL2
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def mag_l2(
|
|
14
|
+
calibration_datasets: list[xr.Dataset],
|
|
15
|
+
offsets_dataset: xr.Dataset,
|
|
16
|
+
input_data: xr.Dataset,
|
|
17
|
+
) -> list[xr.Dataset]:
|
|
18
|
+
"""
|
|
19
|
+
Complete MAG L2 processing.
|
|
20
|
+
|
|
21
|
+
Processing uses 4 data input sources:
|
|
22
|
+
1. Calibration dataset
|
|
23
|
+
These calibration files are ancillary files and may require multiple files to
|
|
24
|
+
cover the entire timespan. They are not expected to change often. They are used
|
|
25
|
+
to provide rotation matrices to correct the frame of the vectors. The same
|
|
26
|
+
file(s) are used for both burst and norm calculations.
|
|
27
|
+
2. Offsets dataset
|
|
28
|
+
This is one, hand-created file which must correspond exactly to an L1B
|
|
29
|
+
(for burst) or L1C (for norm) data file. For each vector, this file includes
|
|
30
|
+
offsets, timedelta, and quality flags. The offsets are added to the vectors,
|
|
31
|
+
the timedelta is used to correct the epoch time, and the quality flags are
|
|
32
|
+
directly passed into the output file.
|
|
33
|
+
3. Input data
|
|
34
|
+
This is the L1B or L1C data file. It is used to provide the vectors and epoch
|
|
35
|
+
time. It should always be MAGo in the nominal case, but it is possible that we
|
|
36
|
+
will switch permanently to using MAGi (in the case of sensor failure, for
|
|
37
|
+
example.) The offsets dataset and the input
|
|
38
|
+
data are tightly related, so the input data filename is actually retrieved from
|
|
39
|
+
the offset dataset to ensure they always match.
|
|
40
|
+
4. sdc-configuration
|
|
41
|
+
This is a local configuration file for changes we never expect to make in
|
|
42
|
+
flight. This is in the IMAP local repo because changes to these settings will
|
|
43
|
+
require other code updates to validate the changes. In L2, the only setting used
|
|
44
|
+
is "always_output_mago", which indicates whether we should always output MAGo.
|
|
45
|
+
Note that if this ever is set to False, we will need to update the dependency
|
|
46
|
+
system to set MAGi files as an upstream dependency.
|
|
47
|
+
|
|
48
|
+
Input data can be burst or normal mode, but MUST match the file in offset_dataset.
|
|
49
|
+
TODO: retrieve the file from offset_dataset in cli.py.
|
|
50
|
+
Calibration dataset is the same for all runs.
|
|
51
|
+
|
|
52
|
+
MAGi data is not used unless we indicate it.
|
|
53
|
+
|
|
54
|
+
Parameters
|
|
55
|
+
----------
|
|
56
|
+
calibration_datasets : list[xr.Dataset]
|
|
57
|
+
Calibration ancillary file inputs.
|
|
58
|
+
offsets_dataset : xr.Dataset
|
|
59
|
+
Offset ancillary file input.
|
|
60
|
+
input_data : xr.Dataset
|
|
61
|
+
Input data from MAG L1C or L1B.
|
|
62
|
+
|
|
63
|
+
Returns
|
|
64
|
+
-------
|
|
65
|
+
list[xr.Dataset]
|
|
66
|
+
List of xarray datasets ready to write to CDF file. Expected to be four outputs
|
|
67
|
+
for different frames.
|
|
68
|
+
"""
|
|
69
|
+
# TODO we may need to combine multiple calibration datasets into one timeline.
|
|
70
|
+
|
|
71
|
+
always_output_mago = configuration.ALWAYS_OUTPUT_MAGO
|
|
72
|
+
|
|
73
|
+
# TODO Check that the input file matches the offsets file
|
|
74
|
+
if not np.array_equal(input_data["epoch"].data, offsets_dataset["epoch"].data):
|
|
75
|
+
raise ValueError("Input file and offsets file must have the same timestamps.")
|
|
76
|
+
|
|
77
|
+
calibration_matrix = retrieve_matrix_from_l2_calibration(
|
|
78
|
+
calibration_datasets, always_output_mago
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
vectors = np.apply_along_axis(
|
|
82
|
+
func1d=calibrate_vector,
|
|
83
|
+
axis=1,
|
|
84
|
+
arr=input_data["vectors"].data,
|
|
85
|
+
calibration_matrix=calibration_matrix,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
basic_test_data = MagL2(
|
|
89
|
+
vectors[:, :3], # level 2 vectors don't include range
|
|
90
|
+
input_data["epoch"].data,
|
|
91
|
+
input_data["vectors"].data[:, 3],
|
|
92
|
+
{},
|
|
93
|
+
np.zeros(len(input_data["epoch"].data)),
|
|
94
|
+
np.zeros(len(input_data["epoch"].data)),
|
|
95
|
+
DataMode.NORM,
|
|
96
|
+
offsets=offsets_dataset["offsets"].data,
|
|
97
|
+
timedelta=offsets_dataset["timedeltas"].data,
|
|
98
|
+
)
|
|
99
|
+
attributes = ImapCdfAttributes()
|
|
100
|
+
attributes.add_instrument_global_attrs("mag")
|
|
101
|
+
# temporarily point to l1c
|
|
102
|
+
attributes.add_instrument_variable_attrs("mag", "l1c")
|
|
103
|
+
return [basic_test_data.generate_dataset(attributes)]
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def retrieve_matrix_from_l2_calibration(
|
|
107
|
+
calibration_datasets: list[xr.Dataset], use_mago: bool = True
|
|
108
|
+
) -> xr.DataArray:
|
|
109
|
+
"""
|
|
110
|
+
Get the calibration matrix for the file.
|
|
111
|
+
|
|
112
|
+
Parameters
|
|
113
|
+
----------
|
|
114
|
+
calibration_datasets : list[xr.Dataset]
|
|
115
|
+
Ancillary file inputs for calibration.
|
|
116
|
+
use_mago : bool
|
|
117
|
+
Use the MAGo calibration matrix. Default is True.
|
|
118
|
+
|
|
119
|
+
Returns
|
|
120
|
+
-------
|
|
121
|
+
np.ndarray
|
|
122
|
+
Calibration matrix in the shape (3, 3, 4) to rotate vectors.
|
|
123
|
+
"""
|
|
124
|
+
# TODO: allow for multiple inputs
|
|
125
|
+
if isinstance(calibration_datasets, list):
|
|
126
|
+
calibration_dataset = calibration_datasets[0]
|
|
127
|
+
if len(calibration_datasets) > 1:
|
|
128
|
+
raise NotImplementedError
|
|
129
|
+
else:
|
|
130
|
+
calibration_dataset = calibration_datasets
|
|
131
|
+
|
|
132
|
+
if use_mago:
|
|
133
|
+
calibration_data = calibration_dataset["URFTOORFO"]
|
|
134
|
+
else:
|
|
135
|
+
calibration_data = calibration_dataset["URFTOORFI"]
|
|
136
|
+
|
|
137
|
+
# TODO will need to combine multiple files here
|
|
138
|
+
# TODO: Check validity of the calibration file?
|
|
139
|
+
|
|
140
|
+
return calibration_data
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"""Data structures for MAG L2 and L1D processing."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import InitVar, dataclass, field
|
|
4
|
+
from enum import Enum
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
import xarray as xr
|
|
8
|
+
|
|
9
|
+
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
|
|
10
|
+
from imap_processing.mag.constants import DataMode
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ValidFrames(Enum):
|
|
14
|
+
"""SPICE reference frames for output."""
|
|
15
|
+
|
|
16
|
+
dsrf = "dsrf"
|
|
17
|
+
srf = "srf"
|
|
18
|
+
rtn = "rtn"
|
|
19
|
+
gse = "gse"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class MagL2:
|
|
24
|
+
"""
|
|
25
|
+
Dataclass for MAG L2 data.
|
|
26
|
+
|
|
27
|
+
Since L2 and L1D should have the same structure, this can be used for either level.
|
|
28
|
+
|
|
29
|
+
Some of the methods are also static, so they can be used in i-ALiRT processing.
|
|
30
|
+
|
|
31
|
+
Attributes
|
|
32
|
+
----------
|
|
33
|
+
vectors: np.ndarray
|
|
34
|
+
Magnetic field vectors of size (n, 3) where n is the number of vectors.
|
|
35
|
+
Describes (x, y, z) components of the magnetic field.
|
|
36
|
+
epoch: np.ndarray
|
|
37
|
+
Time of each vector in J2000 seconds. Should be of length n.
|
|
38
|
+
range: np.ndarray
|
|
39
|
+
Range of each vector. Should be of length n.
|
|
40
|
+
global_attributes: dict
|
|
41
|
+
Any global attributes we want to carry forward into the output CDF file.
|
|
42
|
+
quality_flags: np.ndarray
|
|
43
|
+
Quality flags for each vector. Should be of length n.
|
|
44
|
+
quality_bitmask: np.ndarray
|
|
45
|
+
Quality bitmask for each vector. Should be of length n. Copied from offset
|
|
46
|
+
file in L2, marked as good always in L1D.
|
|
47
|
+
magnitude: np.ndarray
|
|
48
|
+
Magnitude of each vector. Should be of length n. Calculated from L2 vectors.
|
|
49
|
+
is_l1d: bool
|
|
50
|
+
Flag to indicate if the data is L1D. Defaults to False.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
vectors: np.ndarray
|
|
54
|
+
epoch: np.ndarray
|
|
55
|
+
range: np.ndarray
|
|
56
|
+
global_attributes: dict
|
|
57
|
+
quality_flags: np.ndarray
|
|
58
|
+
quality_bitmask: np.ndarray
|
|
59
|
+
data_mode: DataMode
|
|
60
|
+
magnitude: np.ndarray = field(init=False)
|
|
61
|
+
is_l1d: bool = False
|
|
62
|
+
offsets: InitVar[np.ndarray] = None
|
|
63
|
+
timedelta: InitVar[np.ndarray] = None
|
|
64
|
+
|
|
65
|
+
def __post_init__(self, offsets: np.ndarray, timedelta: np.ndarray) -> None:
|
|
66
|
+
"""
|
|
67
|
+
Calculate the magnitude of the vectors after initialization.
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
offsets : np.ndarray
|
|
72
|
+
Offsets to apply to the vectors. Should be of shape (n, 3) where n is the
|
|
73
|
+
number of vectors.
|
|
74
|
+
timedelta : np.ndarray
|
|
75
|
+
Time deltas to shift the timestamps by. Should be of length n.
|
|
76
|
+
Given in seconds.
|
|
77
|
+
"""
|
|
78
|
+
if offsets is not None:
|
|
79
|
+
self.vectors = self.apply_offsets(self.vectors, offsets)
|
|
80
|
+
if timedelta is not None:
|
|
81
|
+
self.epoch = self.shift_timestamps(self.epoch, timedelta)
|
|
82
|
+
|
|
83
|
+
self.magnitude = self.calculate_magnitude(self.vectors)
|
|
84
|
+
|
|
85
|
+
@staticmethod
|
|
86
|
+
def calculate_magnitude(
|
|
87
|
+
vectors: np.ndarray,
|
|
88
|
+
) -> np.ndarray:
|
|
89
|
+
"""
|
|
90
|
+
Given a list of vectors (x, y, z), calculate the magnitude of each vector.
|
|
91
|
+
|
|
92
|
+
For an input list of vectors of size (n, 3) returns a list of magnitudes of
|
|
93
|
+
size (n,).
|
|
94
|
+
|
|
95
|
+
Parameters
|
|
96
|
+
----------
|
|
97
|
+
vectors : np.ndarray
|
|
98
|
+
Array of vectors to calculate the magnitude of.
|
|
99
|
+
|
|
100
|
+
Returns
|
|
101
|
+
-------
|
|
102
|
+
np.ndarray
|
|
103
|
+
Array of magnitudes of the input vectors.
|
|
104
|
+
"""
|
|
105
|
+
return np.zeros(vectors.shape[0]) # type: ignore
|
|
106
|
+
|
|
107
|
+
@staticmethod
|
|
108
|
+
def apply_offsets(vectors: np.ndarray, offsets: np.ndarray) -> np.ndarray:
|
|
109
|
+
"""
|
|
110
|
+
Apply the offsets to the vectors by adding them together.
|
|
111
|
+
|
|
112
|
+
These offsets are used to shift the vectors in the x, y, and z directions.
|
|
113
|
+
They can either be provided through a custom offsets datafile, or calculated
|
|
114
|
+
using a gradiometry algorithm.
|
|
115
|
+
|
|
116
|
+
Parameters
|
|
117
|
+
----------
|
|
118
|
+
vectors : np.ndarray
|
|
119
|
+
Array of vectors to apply the offsets to. Should be of shape (n, 3) where n
|
|
120
|
+
is the number of vectors.
|
|
121
|
+
offsets : np.ndarray
|
|
122
|
+
Array of offsets to apply to the vectors. Should be of shape (n, 3) where n
|
|
123
|
+
is the number of vectors.
|
|
124
|
+
|
|
125
|
+
Returns
|
|
126
|
+
-------
|
|
127
|
+
np.ndarray
|
|
128
|
+
Array of vectors with offsets applied. Should be of shape (n, 3).
|
|
129
|
+
"""
|
|
130
|
+
if vectors.shape[0] != offsets.shape[0]:
|
|
131
|
+
raise ValueError("Vectors and offsets must have the same length.")
|
|
132
|
+
|
|
133
|
+
offset_vectors: np.ndarray = vectors[:, :3] + offsets
|
|
134
|
+
|
|
135
|
+
# TODO: CDF files don't have NaNs. Emailed MAG to ask what this will look like.
|
|
136
|
+
# Any values where offsets is nan must also be nan
|
|
137
|
+
offset_vectors[np.isnan(offsets).any(axis=1)] = np.nan
|
|
138
|
+
|
|
139
|
+
return offset_vectors
|
|
140
|
+
|
|
141
|
+
@staticmethod
|
|
142
|
+
def shift_timestamps(epoch: np.ndarray, timedelta: np.ndarray) -> np.ndarray:
|
|
143
|
+
"""
|
|
144
|
+
Shift the timestamps by the given timedelta.
|
|
145
|
+
|
|
146
|
+
If timedelta is positive, the epochs are shifted forward in time.
|
|
147
|
+
|
|
148
|
+
Parameters
|
|
149
|
+
----------
|
|
150
|
+
epoch : np.ndarray
|
|
151
|
+
Array of timestamps to shift. Should be of length n.
|
|
152
|
+
timedelta : np.ndarray
|
|
153
|
+
Array of time deltas to shift the timestamps by. Should be the same length
|
|
154
|
+
as epoch. Given in seconds.
|
|
155
|
+
|
|
156
|
+
Returns
|
|
157
|
+
-------
|
|
158
|
+
np.ndarray
|
|
159
|
+
Shifted timestamps.
|
|
160
|
+
"""
|
|
161
|
+
if epoch.shape[0] != timedelta.shape[0]:
|
|
162
|
+
raise ValueError(
|
|
163
|
+
"Input Epoch and offsets timedeltas must be the same length."
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
timedelta_ns = timedelta * 1e9
|
|
167
|
+
shifted_timestamps = epoch + timedelta_ns
|
|
168
|
+
return shifted_timestamps
|
|
169
|
+
|
|
170
|
+
def truncate_to_24h(self, timestamp: str) -> None:
|
|
171
|
+
"""
|
|
172
|
+
Truncate all data to a 24 hour period.
|
|
173
|
+
|
|
174
|
+
24 hours is given by timestamp in the format YYYYmmdd.
|
|
175
|
+
|
|
176
|
+
Parameters
|
|
177
|
+
----------
|
|
178
|
+
timestamp : str
|
|
179
|
+
Timestamp in the format YYYYMMDD.
|
|
180
|
+
"""
|
|
181
|
+
pass
|
|
182
|
+
|
|
183
|
+
def generate_dataset(
|
|
184
|
+
self,
|
|
185
|
+
attribute_manager: ImapCdfAttributes,
|
|
186
|
+
frame: ValidFrames = ValidFrames.dsrf,
|
|
187
|
+
) -> xr.Dataset:
|
|
188
|
+
"""
|
|
189
|
+
Generate an xarray dataset from the dataclass.
|
|
190
|
+
|
|
191
|
+
This method can be used for L2 and L1D, since they have extremely similar
|
|
192
|
+
output.
|
|
193
|
+
|
|
194
|
+
Parameters
|
|
195
|
+
----------
|
|
196
|
+
attribute_manager : ImapCdfAttributes
|
|
197
|
+
CDF attributes object for the correct level.
|
|
198
|
+
frame : ValidFrames
|
|
199
|
+
SPICE reference frame to rotate the data into.
|
|
200
|
+
|
|
201
|
+
Returns
|
|
202
|
+
-------
|
|
203
|
+
xr.Dataset
|
|
204
|
+
Complete dataset ready to write to CDF file.
|
|
205
|
+
"""
|
|
206
|
+
logical_source_id = f"imap_mag_l2_{self.data_mode.value.lower()}-{frame.name}"
|
|
207
|
+
direction = xr.DataArray(
|
|
208
|
+
np.arange(3),
|
|
209
|
+
name="direction",
|
|
210
|
+
dims=["direction"],
|
|
211
|
+
attrs=attribute_manager.get_variable_attributes(
|
|
212
|
+
"direction_attrs", check_schema=False
|
|
213
|
+
),
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
direction_label = xr.DataArray(
|
|
217
|
+
direction.values.astype(str),
|
|
218
|
+
name="direction_label",
|
|
219
|
+
dims=["direction_label"],
|
|
220
|
+
attrs=attribute_manager.get_variable_attributes(
|
|
221
|
+
"direction_label", check_schema=False
|
|
222
|
+
),
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
epoch_time = xr.DataArray(
|
|
226
|
+
self.epoch,
|
|
227
|
+
name="epoch",
|
|
228
|
+
dims=["epoch"],
|
|
229
|
+
attrs=attribute_manager.get_variable_attributes("epoch"),
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
vectors = xr.DataArray(
|
|
233
|
+
self.vectors,
|
|
234
|
+
name="vectors",
|
|
235
|
+
dims=["epoch", "direction"],
|
|
236
|
+
attrs=attribute_manager.get_variable_attributes("vector_attrs"),
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
quality_flags = xr.DataArray(
|
|
240
|
+
self.quality_flags,
|
|
241
|
+
name="quality_flags",
|
|
242
|
+
dims=["epoch"],
|
|
243
|
+
attrs=attribute_manager.get_variable_attributes("compression"),
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
quality_bitmask = xr.DataArray(
|
|
247
|
+
self.quality_flags,
|
|
248
|
+
name="quality_flags",
|
|
249
|
+
dims=["epoch"],
|
|
250
|
+
attrs=attribute_manager.get_variable_attributes("compression"),
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
rng = xr.DataArray(
|
|
254
|
+
self.range,
|
|
255
|
+
name="range",
|
|
256
|
+
dims=["epoch"],
|
|
257
|
+
# TODO temp attrs
|
|
258
|
+
attrs=attribute_manager.get_variable_attributes("compression_width"),
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
magnitude = xr.DataArray(
|
|
262
|
+
self.magnitude,
|
|
263
|
+
name="magnitude",
|
|
264
|
+
dims=["epoch"],
|
|
265
|
+
attrs=attribute_manager.get_variable_attributes("compression_width"),
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
global_attributes = (
|
|
269
|
+
attribute_manager.get_global_attributes(logical_source_id)
|
|
270
|
+
| self.global_attributes
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
output = xr.Dataset(
|
|
274
|
+
coords={
|
|
275
|
+
"epoch": epoch_time,
|
|
276
|
+
"direction": direction,
|
|
277
|
+
"direction_label": direction_label,
|
|
278
|
+
},
|
|
279
|
+
attrs=global_attributes,
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
output["vectors"] = vectors
|
|
283
|
+
output["quality_flags"] = quality_flags
|
|
284
|
+
output["quality_bitmask"] = quality_bitmask
|
|
285
|
+
output["range"] = rng
|
|
286
|
+
output["magnitude"] = magnitude
|
|
287
|
+
|
|
288
|
+
return output
|
imap_processing/quality_flags.py
CHANGED