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
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
|
|
5
|
+
import numpy as np
|
|
6
|
+
import numpy.typing as npt
|
|
7
|
+
import pandas as pd
|
|
5
8
|
import xarray as xr
|
|
6
9
|
|
|
7
10
|
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
|
|
@@ -12,7 +15,96 @@ logger = logging.getLogger(__name__)
|
|
|
12
15
|
TIME_PER_BIN = 0.167 # seconds
|
|
13
16
|
|
|
14
17
|
|
|
15
|
-
def
|
|
18
|
+
def solve_full_sweep_energy(
|
|
19
|
+
esa_lvl5_data: np.ndarray, esa_table_df: pd.DataFrame, lut_notes_df: pd.DataFrame
|
|
20
|
+
) -> npt.NDArray:
|
|
21
|
+
"""
|
|
22
|
+
Calculate the energy of each full sweep data.
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
esa_lvl5_data : numpy.ndarray
|
|
27
|
+
The L1 data input.
|
|
28
|
+
esa_table_df : pandas.DataFrame
|
|
29
|
+
The ESA unit conversion table that contains first 63 energies.
|
|
30
|
+
lut_notes_df : pandas.DataFrame
|
|
31
|
+
The LUT notes table that contains the last 9 fine energies.
|
|
32
|
+
|
|
33
|
+
Returns
|
|
34
|
+
-------
|
|
35
|
+
energy : numpy.ndarray
|
|
36
|
+
The energy of each full sweep data.
|
|
37
|
+
"""
|
|
38
|
+
# Read 0 - 62 energy steps' fixed energy value
|
|
39
|
+
fixed_energy_values = esa_table_df["Energy"].values[:63]
|
|
40
|
+
|
|
41
|
+
# Find last 9 fine energy values of all sweeps data
|
|
42
|
+
# -------------------------------------------------
|
|
43
|
+
# First, verify that all values in the LUT-notes table's 'ESA DAC (Hex)' column
|
|
44
|
+
# exactly matches a value in the esa_lvl5_data.
|
|
45
|
+
has_exact_match = np.isin(esa_lvl5_data, lut_notes_df["ESA DAC (Hex)"].values)
|
|
46
|
+
if not np.all(has_exact_match):
|
|
47
|
+
raise ValueError(
|
|
48
|
+
"These ESA_LVL5 values not found in lut-notes table: "
|
|
49
|
+
f"{esa_lvl5_data[np.where(~has_exact_match)[0]]} "
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Find index of 71st energy step for all sweeps data in lut-notes table.
|
|
53
|
+
# Tried using np.where(np.isin(...)) or df.index[np.isin(...)] to find the index
|
|
54
|
+
# of each value in esa_lvl5_data within the LUT table. However, these methods
|
|
55
|
+
# return only the unique matching indices — not one index per input value.
|
|
56
|
+
# For example, given the input:
|
|
57
|
+
# ['12F1', '12F1', '12F1', '12F1']
|
|
58
|
+
# np.where(np.isin(...)) would return:
|
|
59
|
+
# [336]
|
|
60
|
+
# because it finds that '12F1' exists in the LUT and only returns its position once.
|
|
61
|
+
# What we actually need is:
|
|
62
|
+
# [336, 336, 336, 336]
|
|
63
|
+
# — one index for *each* occurrence in the input, preserving its shape and order.
|
|
64
|
+
# Therefore, instead of relying on np.isin or similar, we explicitly use
|
|
65
|
+
# np.where in a loop to find the index of each value in esa_lvl5_data individually,
|
|
66
|
+
# ensuring the output array has the same shape as the input.
|
|
67
|
+
|
|
68
|
+
last_energy_step_indices = np.array(
|
|
69
|
+
[
|
|
70
|
+
np.where(lut_notes_df["ESA DAC (Hex)"].values == val)[0][0]
|
|
71
|
+
for val in esa_lvl5_data
|
|
72
|
+
]
|
|
73
|
+
)
|
|
74
|
+
# Use back tracking steps to find all 9 fine energy value indices
|
|
75
|
+
# Eg. [0, -4, -8, ..., -28, -32]
|
|
76
|
+
steps = np.arange(9) * -4
|
|
77
|
+
|
|
78
|
+
# Find indices of last 9 fine energy values of all sweeps data
|
|
79
|
+
fine_energy_indices = last_energy_step_indices[:, None] + steps
|
|
80
|
+
|
|
81
|
+
# NOTE: Per SWAPI instruction, set every index that result in negative
|
|
82
|
+
# indices during back tracking to zero index. SWAPI calls this
|
|
83
|
+
# "flooring" the index. For example, if the 71st energy step index results
|
|
84
|
+
# in less than 32, then it would result in some negative indices. Eg.
|
|
85
|
+
# 71st index = 31
|
|
86
|
+
# nine fine energy indices = [31, 27, 23, 19, 15, 11, 7, 3, -1]
|
|
87
|
+
# flooring = [31, 27, 23, 19, 15, 11, 7, 3, 0]
|
|
88
|
+
fine_energy_indices[fine_energy_indices < 0] = 0
|
|
89
|
+
|
|
90
|
+
energy_values = lut_notes_df["Energy"].values[fine_energy_indices]
|
|
91
|
+
|
|
92
|
+
# Expand to match the number of rows in energy_values
|
|
93
|
+
first_63_values = np.tile(
|
|
94
|
+
fixed_energy_values, (energy_values.shape[0], 1)
|
|
95
|
+
) # (epoch, 63)
|
|
96
|
+
|
|
97
|
+
# Append the first_63_values in front of energy_values
|
|
98
|
+
sweeps_energy_value = np.hstack((first_63_values, energy_values))
|
|
99
|
+
|
|
100
|
+
return sweeps_energy_value
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def swapi_l2(
|
|
104
|
+
l1_dataset: xr.Dataset,
|
|
105
|
+
esa_table_df: pd.DataFrame,
|
|
106
|
+
lut_notes_df: pd.DataFrame,
|
|
107
|
+
) -> xr.Dataset:
|
|
16
108
|
"""
|
|
17
109
|
Produce science data to L2.
|
|
18
110
|
|
|
@@ -32,8 +124,10 @@ def swapi_l2(l1_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
32
124
|
----------
|
|
33
125
|
l1_dataset : xarray.Dataset
|
|
34
126
|
The L1 data input.
|
|
35
|
-
|
|
36
|
-
|
|
127
|
+
esa_table_df : pandas.DataFrame
|
|
128
|
+
The ESA unit conversion table that contains first 63 energies.
|
|
129
|
+
lut_notes_df : pandas.DataFrame
|
|
130
|
+
The LUT notes table that contains the last 9 fine energies.
|
|
37
131
|
|
|
38
132
|
Returns
|
|
39
133
|
-------
|
|
@@ -56,13 +150,30 @@ def swapi_l2(l1_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
56
150
|
"lut_choice",
|
|
57
151
|
"fpga_type",
|
|
58
152
|
"fpga_rev",
|
|
153
|
+
"esa_lvl5",
|
|
59
154
|
]
|
|
60
155
|
l2_dataset = l1_dataset[l1_data_keys]
|
|
61
156
|
|
|
157
|
+
# Find energy of each full sweep data
|
|
158
|
+
# -----------------------------------
|
|
159
|
+
# Convert unpacked ESA_LVL5 values to hex to match the LUT table
|
|
160
|
+
# value
|
|
161
|
+
esa_lvl5_hex = np.vectorize(lambda x: format(x, "X"))(l1_dataset["esa_lvl5"].values)
|
|
162
|
+
esa_energy = solve_full_sweep_energy(
|
|
163
|
+
esa_lvl5_hex,
|
|
164
|
+
esa_table_df=esa_table_df,
|
|
165
|
+
lut_notes_df=lut_notes_df,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
l2_dataset["swp_esa_energy"] = xr.DataArray(
|
|
169
|
+
esa_energy,
|
|
170
|
+
name="esa_energy",
|
|
171
|
+
dims=["epoch", "energy"],
|
|
172
|
+
attrs=cdf_manager.get_variable_attributes("esa_energy"),
|
|
173
|
+
)
|
|
174
|
+
|
|
62
175
|
# Update L2 specific attributes
|
|
63
|
-
l2_dataset.attrs["Data_version"] = data_version
|
|
64
176
|
l2_global_attrs = cdf_manager.get_global_attributes("imap_swapi_l2_sci")
|
|
65
|
-
l2_dataset.attrs["Data_level"] = l2_global_attrs["Data_level"]
|
|
66
177
|
l2_dataset.attrs["Data_type"] = l2_global_attrs["Data_type"]
|
|
67
178
|
l2_dataset.attrs["Logical_source"] = l2_global_attrs["Logical_source"]
|
|
68
179
|
l2_dataset.attrs["Logical_source_description"] = l2_global_attrs[
|
|
@@ -6,6 +6,10 @@ other SWAPI processing modules.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
from enum import IntEnum
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
import pandas as pd
|
|
9
13
|
|
|
10
14
|
|
|
11
15
|
class SWAPIAPID(IntEnum):
|
|
@@ -23,3 +27,31 @@ class SWAPIMODE(IntEnum):
|
|
|
23
27
|
LVSCI = 1
|
|
24
28
|
HVENG = 2
|
|
25
29
|
HVSCI = 3
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def read_swapi_lut_table(file_path: Path) -> pd.DataFrame:
|
|
33
|
+
"""
|
|
34
|
+
Read the LUT table from a CSV file.
|
|
35
|
+
|
|
36
|
+
Parameters
|
|
37
|
+
----------
|
|
38
|
+
file_path : pathlib.Path
|
|
39
|
+
The path to the LUT table CSV file.
|
|
40
|
+
|
|
41
|
+
Returns
|
|
42
|
+
-------
|
|
43
|
+
pandas.DataFrame
|
|
44
|
+
The LUT table as a DataFrame.
|
|
45
|
+
"""
|
|
46
|
+
df = pd.read_csv(file_path)
|
|
47
|
+
|
|
48
|
+
# Clean and convert 'Energy' column from comma-separated strings to integers
|
|
49
|
+
df["Energy"] = (
|
|
50
|
+
df["Energy"]
|
|
51
|
+
.astype(str)
|
|
52
|
+
.str.replace(",", "", regex=False)
|
|
53
|
+
.replace("Solve", -1)
|
|
54
|
+
.astype(np.int64)
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
return df
|
|
@@ -5,6 +5,7 @@ import logging
|
|
|
5
5
|
import xarray as xr
|
|
6
6
|
|
|
7
7
|
from imap_processing import imap_module_directory
|
|
8
|
+
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
|
|
8
9
|
from imap_processing.swe.l1a.swe_science import swe_science
|
|
9
10
|
from imap_processing.swe.utils.swe_utils import (
|
|
10
11
|
SWEAPID,
|
|
@@ -14,7 +15,7 @@ from imap_processing.utils import packet_file_to_datasets
|
|
|
14
15
|
logger = logging.getLogger(__name__)
|
|
15
16
|
|
|
16
17
|
|
|
17
|
-
def swe_l1a(packet_file: str
|
|
18
|
+
def swe_l1a(packet_file: str) -> xr.Dataset:
|
|
18
19
|
"""
|
|
19
20
|
Will process SWE l0 data into l1a data.
|
|
20
21
|
|
|
@@ -26,9 +27,6 @@ def swe_l1a(packet_file: str, data_version: str) -> xr.Dataset:
|
|
|
26
27
|
----------
|
|
27
28
|
packet_file : str
|
|
28
29
|
Path where the raw packet file is stored.
|
|
29
|
-
data_version : str
|
|
30
|
-
Data version to write to CDF files and the Data_version CDF attribute.
|
|
31
|
-
Should be in the format Vxxx.
|
|
32
30
|
|
|
33
31
|
Returns
|
|
34
32
|
-------
|
|
@@ -42,12 +40,46 @@ def swe_l1a(packet_file: str, data_version: str) -> xr.Dataset:
|
|
|
42
40
|
packet_file, xtce_document, use_derived_value=False
|
|
43
41
|
)
|
|
44
42
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
processed_data = []
|
|
44
|
+
|
|
45
|
+
if SWEAPID.SWE_SCIENCE in datasets_by_apid:
|
|
46
|
+
logger.info("Processing SWE science data.")
|
|
47
|
+
processed_data.append(
|
|
48
|
+
swe_science(l0_dataset=datasets_by_apid[SWEAPID.SWE_SCIENCE])
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# Process non-science data
|
|
52
|
+
# Define minimal CDF attrs for the non science dataset
|
|
53
|
+
imap_attrs = ImapCdfAttributes()
|
|
54
|
+
imap_attrs.add_instrument_global_attrs("swe")
|
|
55
|
+
imap_attrs.add_instrument_variable_attrs("swe", "l1a")
|
|
56
|
+
non_science_attrs = imap_attrs.get_variable_attributes("non_science_attrs")
|
|
57
|
+
epoch_attrs = imap_attrs.get_variable_attributes("epoch", check_schema=False)
|
|
58
|
+
|
|
59
|
+
if SWEAPID.SWE_APP_HK in datasets_by_apid:
|
|
60
|
+
logger.info("Processing SWE housekeeping data.")
|
|
61
|
+
hk_ds = datasets_by_apid[SWEAPID.SWE_APP_HK]
|
|
62
|
+
hk_ds.attrs.update(imap_attrs.get_global_attributes("imap_swe_l1a_hk"))
|
|
63
|
+
hk_ds["epoch"].attrs.update(epoch_attrs)
|
|
64
|
+
# Add attrs to HK data variables
|
|
65
|
+
for var_name in hk_ds.data_vars:
|
|
66
|
+
hk_ds[var_name].attrs.update(non_science_attrs)
|
|
67
|
+
processed_data.append(hk_ds)
|
|
68
|
+
|
|
69
|
+
if SWEAPID.SWE_CEM_RAW in datasets_by_apid:
|
|
70
|
+
logger.info("Processing SWE CEM raw data.")
|
|
71
|
+
cem_raw_ds = datasets_by_apid[SWEAPID.SWE_CEM_RAW]
|
|
72
|
+
cem_raw_ds.attrs.update(
|
|
73
|
+
imap_attrs.get_global_attributes("imap_swe_l1a_cem-raw")
|
|
52
74
|
)
|
|
53
|
-
|
|
75
|
+
cem_raw_ds["epoch"].attrs.update(epoch_attrs)
|
|
76
|
+
|
|
77
|
+
# Add attrs to CEM raw data variables
|
|
78
|
+
for var_name in cem_raw_ds.data_vars:
|
|
79
|
+
cem_raw_ds[var_name].attrs.update(non_science_attrs)
|
|
80
|
+
processed_data.append(cem_raw_ds)
|
|
81
|
+
|
|
82
|
+
if len(processed_data) == 0:
|
|
83
|
+
logger.info("Data contains unknown APID.")
|
|
84
|
+
|
|
85
|
+
return processed_data
|
|
@@ -6,6 +6,7 @@ import numpy as np
|
|
|
6
6
|
import xarray as xr
|
|
7
7
|
|
|
8
8
|
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
|
|
9
|
+
from imap_processing.swe.utils import swe_constants
|
|
9
10
|
from imap_processing.swe.utils.swe_utils import SWEAPID
|
|
10
11
|
|
|
11
12
|
logger = logging.getLogger(__name__)
|
|
@@ -63,7 +64,7 @@ def decompressed_counts(cem_count: int) -> int:
|
|
|
63
64
|
)
|
|
64
65
|
|
|
65
66
|
|
|
66
|
-
def swe_science(l0_dataset: xr.Dataset
|
|
67
|
+
def swe_science(l0_dataset: xr.Dataset) -> xr.Dataset:
|
|
67
68
|
"""
|
|
68
69
|
SWE L1a science processing.
|
|
69
70
|
|
|
@@ -96,10 +97,6 @@ def swe_science(l0_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
96
97
|
l0_dataset : xarray.Dataset
|
|
97
98
|
Raw packet data from SWE stored as an xarray dataset.
|
|
98
99
|
|
|
99
|
-
data_version : str
|
|
100
|
-
Data version for the 'Data_version' CDF attribute. This is the version of the
|
|
101
|
-
output file.
|
|
102
|
-
|
|
103
100
|
Returns
|
|
104
101
|
-------
|
|
105
102
|
dataset : xarray.Dataset
|
|
@@ -119,7 +116,9 @@ def swe_science(l0_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
119
116
|
# 4. Reshape the data to 180 x 7
|
|
120
117
|
raw_science_array = np.array(
|
|
121
118
|
[
|
|
122
|
-
np.frombuffer(binary_string, dtype=np.uint8).reshape(
|
|
119
|
+
np.frombuffer(binary_string, dtype=np.uint8).reshape(
|
|
120
|
+
180, swe_constants.N_CEMS
|
|
121
|
+
)
|
|
123
122
|
for binary_string in l0_dataset["science_data"].values
|
|
124
123
|
]
|
|
125
124
|
)
|
|
@@ -132,20 +131,19 @@ def swe_science(l0_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
132
131
|
cdf_attrs = ImapCdfAttributes()
|
|
133
132
|
cdf_attrs.add_instrument_global_attrs("swe")
|
|
134
133
|
cdf_attrs.add_instrument_variable_attrs("swe", "l1a")
|
|
135
|
-
cdf_attrs.add_global_attribute("Data_version", data_version)
|
|
136
134
|
|
|
137
135
|
epoch_time = xr.DataArray(
|
|
138
136
|
l0_dataset["epoch"],
|
|
139
137
|
name="epoch",
|
|
140
138
|
dims=["epoch"],
|
|
141
|
-
attrs=cdf_attrs.get_variable_attributes("epoch"),
|
|
139
|
+
attrs=cdf_attrs.get_variable_attributes("epoch", check_schema=False),
|
|
142
140
|
)
|
|
143
141
|
|
|
144
142
|
spin_sector = xr.DataArray(
|
|
145
143
|
np.arange(180),
|
|
146
144
|
name="spin_sector",
|
|
147
145
|
dims=["spin_sector"],
|
|
148
|
-
attrs=cdf_attrs.get_variable_attributes("spin_sector"),
|
|
146
|
+
attrs=cdf_attrs.get_variable_attributes("spin_sector", check_schema=False),
|
|
149
147
|
)
|
|
150
148
|
|
|
151
149
|
# NOTE: LABL_PTR_1 should be CDF_CHAR.
|
|
@@ -153,14 +151,16 @@ def swe_science(l0_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
153
151
|
spin_sector.values.astype(str),
|
|
154
152
|
name="spin_sector_label",
|
|
155
153
|
dims=["spin_sector"],
|
|
156
|
-
attrs=cdf_attrs.get_variable_attributes(
|
|
154
|
+
attrs=cdf_attrs.get_variable_attributes(
|
|
155
|
+
"spin_sector_label", check_schema=False
|
|
156
|
+
),
|
|
157
157
|
)
|
|
158
158
|
|
|
159
159
|
cem_id = xr.DataArray(
|
|
160
|
-
np.arange(
|
|
160
|
+
np.arange(swe_constants.N_CEMS),
|
|
161
161
|
name="cem_id",
|
|
162
162
|
dims=["cem_id"],
|
|
163
|
-
attrs=cdf_attrs.get_variable_attributes("cem_id"),
|
|
163
|
+
attrs=cdf_attrs.get_variable_attributes("cem_id", check_schema=False),
|
|
164
164
|
)
|
|
165
165
|
|
|
166
166
|
# NOTE: LABL_PTR_2 should be CDF_CHAR.
|
|
@@ -168,7 +168,7 @@ def swe_science(l0_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
168
168
|
cem_id.values.astype(str),
|
|
169
169
|
name="cem_id_label",
|
|
170
170
|
dims=["cem_id"],
|
|
171
|
-
attrs=cdf_attrs.get_variable_attributes("cem_id_label"),
|
|
171
|
+
attrs=cdf_attrs.get_variable_attributes("cem_id_label", check_schema=False),
|
|
172
172
|
)
|
|
173
173
|
|
|
174
174
|
science_xarray = xr.DataArray(
|