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
|
@@ -48,16 +48,16 @@ RENAME_COLUMNS = {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
MOD_VALUE_TO_SPECIES_ENERGY_MAP = {
|
|
51
|
-
0: {"species": "
|
|
52
|
-
1: {"species": "
|
|
53
|
-
2: {"species": "
|
|
54
|
-
3: {"species": "
|
|
55
|
-
4: {"species": "
|
|
56
|
-
5: {"species": "
|
|
57
|
-
6: {"species": "
|
|
58
|
-
7: {"species": "
|
|
59
|
-
8: {"species": "
|
|
60
|
-
9: {"species": "
|
|
51
|
+
0: {"species": "h", "energy_bin": 0},
|
|
52
|
+
1: {"species": "h", "energy_bin": 1},
|
|
53
|
+
2: {"species": "h", "energy_bin": 2},
|
|
54
|
+
3: {"species": "he4", "energy_bin": 0},
|
|
55
|
+
4: {"species": "he4", "energy_bin": 1},
|
|
56
|
+
5: {"species": "cno", "energy_bin": 0},
|
|
57
|
+
6: {"species": "cno", "energy_bin": 1},
|
|
58
|
+
7: {"species": "nemgsi", "energy_bin": 0},
|
|
59
|
+
8: {"species": "nemgsi", "energy_bin": 1},
|
|
60
|
+
9: {"species": "fe", "energy_bin": 0},
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
|
|
@@ -124,8 +124,8 @@ def consolidate_rate_columns(
|
|
|
124
124
|
|
|
125
125
|
The validation data has each value in a separate column. This
|
|
126
126
|
function aggregates related data into arrays to match processed
|
|
127
|
-
data. Each rate column has
|
|
128
|
-
|
|
127
|
+
data. Each rate column has corresponding plus and minus columns
|
|
128
|
+
for uncertainty values.
|
|
129
129
|
|
|
130
130
|
Parameters
|
|
131
131
|
----------
|
|
@@ -142,16 +142,16 @@ def consolidate_rate_columns(
|
|
|
142
142
|
"""
|
|
143
143
|
for new_col, prefix in rate_columns.items():
|
|
144
144
|
pattern_rates = re.compile(rf"^{prefix}\d+$")
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
pattern_uncert_plus = re.compile(rf"^{prefix}\d+_STAT_UNCERT_PLUS$")
|
|
146
|
+
pattern_uncert_minus = re.compile(rf"^{prefix}\d+_STAT_UNCERT_MINUS$")
|
|
147
147
|
data[new_col] = data.filter(regex=pattern_rates.pattern).apply(
|
|
148
148
|
lambda row: row.values, axis=1
|
|
149
149
|
)
|
|
150
|
-
data[f"{new_col}
|
|
151
|
-
regex=
|
|
150
|
+
data[f"{new_col}_stat_uncert_plus"] = data.filter(
|
|
151
|
+
regex=pattern_uncert_plus.pattern
|
|
152
152
|
).apply(lambda row: row.values, axis=1)
|
|
153
|
-
data[f"{new_col}
|
|
154
|
-
regex=
|
|
153
|
+
data[f"{new_col}_stat_uncert_minus"] = data.filter(
|
|
154
|
+
regex=pattern_uncert_minus.pattern
|
|
155
155
|
).apply(lambda row: row.values, axis=1)
|
|
156
156
|
if new_col == "sectorates":
|
|
157
157
|
data = consolidate_sectorates(data)
|
|
@@ -159,10 +159,11 @@ def consolidate_rate_columns(
|
|
|
159
159
|
columns=data.filter(regex=pattern_rates.pattern).columns, inplace=True
|
|
160
160
|
)
|
|
161
161
|
data.drop(
|
|
162
|
-
columns=data.filter(regex=
|
|
162
|
+
columns=data.filter(regex=pattern_uncert_plus.pattern).columns, inplace=True
|
|
163
163
|
)
|
|
164
164
|
data.drop(
|
|
165
|
-
columns=data.filter(regex=
|
|
165
|
+
columns=data.filter(regex=pattern_uncert_minus.pattern).columns,
|
|
166
|
+
inplace=True,
|
|
166
167
|
)
|
|
167
168
|
return data
|
|
168
169
|
|
|
@@ -170,7 +171,7 @@ def consolidate_rate_columns(
|
|
|
170
171
|
def consolidate_sectorates(data: pd.DataFrame) -> pd.DataFrame:
|
|
171
172
|
"""Consolidate sector rate data into arrays.
|
|
172
173
|
|
|
173
|
-
This function distinguishes between
|
|
174
|
+
This function distinguishes between sectored rate columns with three digits
|
|
174
175
|
and those with four digits in their names.
|
|
175
176
|
|
|
176
177
|
SECTORATES_000 SECTORATES_000_0 SECTORATES_000_1 SECTORATES_000_2...SECTORATES_120_9
|
|
@@ -185,9 +186,9 @@ def consolidate_sectorates(data: pd.DataFrame) -> pd.DataFrame:
|
|
|
185
186
|
|
|
186
187
|
Columns with four digits (e.g., SECTORATES_000_0) include the sectorate
|
|
187
188
|
values with a mod 10 value appended (e.g., 0). The mod 10 value determines
|
|
188
|
-
the species and energy range the
|
|
189
|
+
the species and energy range the sectored rates represent in the science frame.
|
|
189
190
|
There are 10 possible species and energy ranges, but only one has data per
|
|
190
|
-
science frame. The validation data has 10 columns per 120
|
|
191
|
+
science frame. The validation data has 10 columns per 120 sectored rates,
|
|
191
192
|
totaling 1200 columns per science frame. Each set of 10 columns will have
|
|
192
193
|
only one value, resulting in an array that looks like this:
|
|
193
194
|
|
|
@@ -207,22 +208,22 @@ def consolidate_sectorates(data: pd.DataFrame) -> pd.DataFrame:
|
|
|
207
208
|
Validation data with sectorate columns consolidated into arrays
|
|
208
209
|
"""
|
|
209
210
|
sectorates_three_digits = data.filter(regex=r"^SECTORATES_\d{3}$").columns
|
|
210
|
-
|
|
211
|
-
regex=r"^SECTORATES_\d{3}
|
|
211
|
+
sectorates_uncert_plus_three_digits = data.filter(
|
|
212
|
+
regex=r"^SECTORATES_\d{3}_STAT_UNCERT_PLUS$"
|
|
212
213
|
).columns
|
|
213
|
-
|
|
214
|
-
regex=r"^SECTORATES_\d{3}
|
|
214
|
+
sectorates_uncert_minus_three_digits = data.filter(
|
|
215
|
+
regex=r"^SECTORATES_\d{3}_STAT_UNCERT_MINUS$"
|
|
215
216
|
).columns
|
|
216
217
|
|
|
217
218
|
data["sectorates"] = data[sectorates_three_digits].apply(
|
|
218
|
-
lambda row: row.values.reshape(
|
|
219
|
-
)
|
|
220
|
-
data["sectorates_delta_plus"] = data[sectorates_delta_plus_three_digits].apply(
|
|
221
|
-
lambda row: row.values.reshape(8, 15), axis=1
|
|
222
|
-
)
|
|
223
|
-
data["sectorates_delta_minus"] = data[sectorates_delta_minus_three_digits].apply(
|
|
224
|
-
lambda row: row.values.reshape(8, 15), axis=1
|
|
219
|
+
lambda row: row.values.reshape(15, 8), axis=1
|
|
225
220
|
)
|
|
221
|
+
data["sectorates_stat_uncert_plus"] = data[
|
|
222
|
+
sectorates_uncert_plus_three_digits
|
|
223
|
+
].apply(lambda row: row.values.reshape(15, 8), axis=1)
|
|
224
|
+
data["sectorates_stat_uncert_minus"] = data[
|
|
225
|
+
sectorates_uncert_minus_three_digits
|
|
226
|
+
].apply(lambda row: row.values.reshape(15, 8), axis=1)
|
|
226
227
|
|
|
227
228
|
sectorates_four_digits = data.filter(regex=r"^SECTORATES_\d{3}_\d{1}$").columns
|
|
228
229
|
data["sectorates_by_mod_val"] = data[sectorates_four_digits].apply(
|
|
@@ -250,15 +251,15 @@ def process_single_rates(data: pd.DataFrame) -> pd.DataFrame:
|
|
|
250
251
|
data["sngrates"] = data.apply(
|
|
251
252
|
lambda row: np.array([row["sngrates_hg"], row["sngrates_lg"]]), axis=1
|
|
252
253
|
)
|
|
253
|
-
data["
|
|
254
|
+
data["sngrates_stat_uncert_plus"] = data.apply(
|
|
254
255
|
lambda row: np.array(
|
|
255
|
-
[row["
|
|
256
|
+
[row["sngrates_hg_stat_uncert_plus"], row["sngrates_lg_stat_uncert_plus"]]
|
|
256
257
|
),
|
|
257
258
|
axis=1,
|
|
258
259
|
)
|
|
259
|
-
data["
|
|
260
|
+
data["sngrates_stat_uncert_minus"] = data.apply(
|
|
260
261
|
lambda row: np.array(
|
|
261
|
-
[row["
|
|
262
|
+
[row["sngrates_hg_stat_uncert_minus"], row["sngrates_lg_stat_uncert_minus"]]
|
|
262
263
|
),
|
|
263
264
|
axis=1,
|
|
264
265
|
)
|
|
@@ -266,10 +267,10 @@ def process_single_rates(data: pd.DataFrame) -> pd.DataFrame:
|
|
|
266
267
|
columns=[
|
|
267
268
|
"sngrates_hg",
|
|
268
269
|
"sngrates_lg",
|
|
269
|
-
"
|
|
270
|
-
"
|
|
271
|
-
"
|
|
272
|
-
"
|
|
270
|
+
"sngrates_hg_stat_uncert_plus",
|
|
271
|
+
"sngrates_lg_stat_uncert_plus",
|
|
272
|
+
"sngrates_hg_stat_uncert_minus",
|
|
273
|
+
"sngrates_lg_stat_uncert_minus",
|
|
273
274
|
],
|
|
274
275
|
inplace=True,
|
|
275
276
|
)
|
|
@@ -279,7 +280,7 @@ def process_single_rates(data: pd.DataFrame) -> pd.DataFrame:
|
|
|
279
280
|
def add_species_energy(data: pd.DataFrame) -> pd.DataFrame:
|
|
280
281
|
"""Add species and energy index to the validation data.
|
|
281
282
|
|
|
282
|
-
The
|
|
283
|
+
The sectored rate data is organized by species and energy index
|
|
283
284
|
in the processed data so this function adds this information
|
|
284
285
|
to each row (i.e. science frame) in the validation data.
|
|
285
286
|
|
|
@@ -304,12 +305,12 @@ def add_species_energy(data: pd.DataFrame) -> pd.DataFrame:
|
|
|
304
305
|
)
|
|
305
306
|
)
|
|
306
307
|
data["species"] = data["mod_10"].apply(
|
|
307
|
-
lambda row: MOD_VALUE_TO_SPECIES_ENERGY_MAP[row]["species"]
|
|
308
|
+
lambda row: MOD_VALUE_TO_SPECIES_ENERGY_MAP[row]["species"]
|
|
308
309
|
if row is not None
|
|
309
310
|
else None
|
|
310
311
|
)
|
|
311
|
-
data["
|
|
312
|
-
lambda row: MOD_VALUE_TO_SPECIES_ENERGY_MAP[row]["
|
|
312
|
+
data["energy_bin"] = data["mod_10"].apply(
|
|
313
|
+
lambda row: MOD_VALUE_TO_SPECIES_ENERGY_MAP[row]["energy_bin"]
|
|
313
314
|
if row is not None
|
|
314
315
|
else None
|
|
315
316
|
)
|
|
@@ -336,55 +337,55 @@ def compare_data(
|
|
|
336
337
|
if field not in [
|
|
337
338
|
"sc_tick_by_frame",
|
|
338
339
|
"species",
|
|
339
|
-
"
|
|
340
|
+
"energy_bin",
|
|
340
341
|
]:
|
|
341
|
-
assert (
|
|
342
|
-
field in
|
|
343
|
-
)
|
|
342
|
+
assert field in actual_data.data_vars.keys(), (
|
|
343
|
+
f"Field {field} not found in actual data variables"
|
|
344
|
+
)
|
|
344
345
|
if field not in skip:
|
|
345
346
|
for frame in range(expected_data.shape[0]):
|
|
346
347
|
if field == "species":
|
|
347
|
-
# Compare
|
|
348
|
+
# Compare sectored rates data using species and energy index.
|
|
348
349
|
# which are only present in the validation data. In the actual
|
|
349
|
-
# data,
|
|
350
|
-
# i.e.
|
|
351
|
-
# (epoch, h_energy_index,
|
|
350
|
+
# data, sectored rates are organized by species in 4D arrays.
|
|
351
|
+
# i.e. h_sectored_counts has shape
|
|
352
|
+
# (epoch, h_energy_index, azimuth, declination).
|
|
352
353
|
# species and energy index are used to find the correct
|
|
353
|
-
# array of
|
|
354
|
+
# array of sectored rate data from the actual data for comparison.
|
|
354
355
|
species = expected_data[field][frame]
|
|
355
|
-
|
|
356
|
-
if "
|
|
356
|
+
energy_bin = expected_data["energy_bin"][frame]
|
|
357
|
+
if "sectorates_stat_uncert_plus" in expected_data.columns:
|
|
357
358
|
np.testing.assert_allclose(
|
|
358
|
-
actual_data[f"{species}
|
|
359
|
-
|
|
360
|
-
].data,
|
|
361
|
-
expected_data["
|
|
359
|
+
actual_data[f"{species}_sectored_counts_stat_uncert_plus"][
|
|
360
|
+
frame
|
|
361
|
+
][energy_bin].data,
|
|
362
|
+
expected_data["sectorates_stat_uncert_plus"][frame],
|
|
362
363
|
rtol=1e-7, # relative tolerance
|
|
363
364
|
atol=1e-8, # absolute tolerance
|
|
364
|
-
err_msg=f"Mismatch in {species}
|
|
365
|
-
f"
|
|
365
|
+
err_msg=f"Mismatch in {species}_sectored_counts_stat_uncert"
|
|
366
|
+
f"_plus at frame {frame}, energy_bin {energy_bin}",
|
|
366
367
|
)
|
|
367
|
-
if "
|
|
368
|
+
if "sectorates_stat_uncert_minus" in expected_data.columns:
|
|
368
369
|
np.testing.assert_allclose(
|
|
369
|
-
actual_data[f"{species}
|
|
370
|
+
actual_data[f"{species}_sectored_counts_stat_uncert_minus"][
|
|
370
371
|
frame
|
|
371
|
-
][
|
|
372
|
-
expected_data["
|
|
372
|
+
][energy_bin].data,
|
|
373
|
+
expected_data["sectorates_stat_uncert_minus"][frame],
|
|
373
374
|
rtol=1e-7,
|
|
374
375
|
atol=1e-8,
|
|
375
|
-
err_msg=f"Mismatch in {species}
|
|
376
|
-
f"
|
|
376
|
+
err_msg=f"Mismatch in {species}_sectored_counts_stat_uncert"
|
|
377
|
+
f"_minus at frame {frame}, energy_bin {energy_bin}",
|
|
377
378
|
)
|
|
378
379
|
else:
|
|
379
380
|
np.testing.assert_allclose(
|
|
380
|
-
actual_data[f"{species}
|
|
381
|
-
|
|
381
|
+
actual_data[f"{species}_sectored_counts"][frame][
|
|
382
|
+
energy_bin
|
|
382
383
|
].data,
|
|
383
384
|
expected_data["sectorates"][frame],
|
|
384
385
|
rtol=1e-7,
|
|
385
386
|
atol=1e-8,
|
|
386
|
-
err_msg=f"Mismatch in {species}
|
|
387
|
-
f"frame {frame},
|
|
387
|
+
err_msg=f"Mismatch in {species}_sectored_counts at"
|
|
388
|
+
f"frame {frame}, energy_bin {energy_bin}",
|
|
388
389
|
)
|
|
389
390
|
elif field == "sc_tick_by_frame":
|
|
390
391
|
# Get the sc_tick values for each frame in the actual data
|
|
Binary file
|
|
Binary file
|
|
@@ -7,6 +7,7 @@ from imap_processing import imap_module_directory
|
|
|
7
7
|
from imap_processing.hit.hit_utils import (
|
|
8
8
|
HitAPID,
|
|
9
9
|
)
|
|
10
|
+
from imap_processing.hit.l0.constants import AZIMUTH_ANGLES, DECLINATION_ANGLES
|
|
10
11
|
from imap_processing.hit.l0.decom_hit import (
|
|
11
12
|
assemble_science_frames,
|
|
12
13
|
decom_hit,
|
|
@@ -20,7 +21,7 @@ from imap_processing.hit.l0.decom_hit import (
|
|
|
20
21
|
from imap_processing.utils import packet_file_to_datasets
|
|
21
22
|
|
|
22
23
|
|
|
23
|
-
@pytest.fixture
|
|
24
|
+
@pytest.fixture
|
|
24
25
|
def sci_dataset():
|
|
25
26
|
"""Create a xarray dataset for testing from sample data."""
|
|
26
27
|
packet_definition = (
|
|
@@ -122,6 +123,9 @@ def test_parse_count_rates(sci_dataset):
|
|
|
122
123
|
if count_rate_vars in list(sci_dataset.keys()):
|
|
123
124
|
assert True
|
|
124
125
|
|
|
126
|
+
assert np.allclose(sci_dataset["declination"].values, DECLINATION_ANGLES)
|
|
127
|
+
assert np.allclose(sci_dataset["azimuth"].values, AZIMUTH_ANGLES)
|
|
128
|
+
|
|
125
129
|
|
|
126
130
|
def test_is_sequential():
|
|
127
131
|
"""Test the is_sequential function."""
|
|
@@ -27,9 +27,7 @@ from imap_processing.tests.hit.helpers.l1_validation import (
|
|
|
27
27
|
@pytest.fixture(scope="module")
|
|
28
28
|
def hk_packet_filepath():
|
|
29
29
|
"""Set path to test data file"""
|
|
30
|
-
return
|
|
31
|
-
imap_module_directory / "tests/hit/test_data/imap_hit_l0_raw_20100105_v001.pkts"
|
|
32
|
-
)
|
|
30
|
+
return imap_module_directory / "tests/hit/test_data/hskp_sample.ccsds"
|
|
33
31
|
|
|
34
32
|
|
|
35
33
|
@pytest.fixture(scope="module")
|
|
@@ -54,7 +52,7 @@ def validation_data():
|
|
|
54
52
|
def test_subcom_sectorates(sci_packet_filepath):
|
|
55
53
|
"""Test the subcom_sectorates function.
|
|
56
54
|
|
|
57
|
-
This function organizes the
|
|
55
|
+
This function organizes the sectored rates data
|
|
58
56
|
by species and adds the data as new variables
|
|
59
57
|
to the dataset.
|
|
60
58
|
"""
|
|
@@ -64,31 +62,31 @@ def test_subcom_sectorates(sci_packet_filepath):
|
|
|
64
62
|
sci_dataset = decom_hit(sci_dataset)
|
|
65
63
|
|
|
66
64
|
# Call the function to be tested
|
|
67
|
-
subcom_sectorates(sci_dataset)
|
|
65
|
+
sci_dataset = subcom_sectorates(sci_dataset)
|
|
68
66
|
|
|
69
67
|
# Number of science frames in the dataset
|
|
70
68
|
frames = sci_dataset["epoch"].shape[0]
|
|
71
69
|
|
|
72
|
-
#
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
70
|
+
# Shape of the new data variables
|
|
71
|
+
expected_shapes = {
|
|
72
|
+
"h": (3, 15, 8),
|
|
73
|
+
"he4": (2, 15, 8),
|
|
74
|
+
"cno": (2, 15, 8),
|
|
75
|
+
"nemgsi": (2, 15, 8),
|
|
76
|
+
"fe": (1, 15, 8),
|
|
77
|
+
}
|
|
77
78
|
|
|
79
|
+
for species, shape in expected_shapes.items():
|
|
80
|
+
# Check if the dataset has the new data variables
|
|
81
|
+
assert f"{species}_sectored_counts" in sci_dataset
|
|
82
|
+
assert f"{species}_energy_mean" in sci_dataset.coords
|
|
83
|
+
assert f"{species}_energy_delta_minus" in sci_dataset
|
|
84
|
+
assert f"{species}_energy_delta_plus" in sci_dataset
|
|
78
85
|
# Check the shape of the new data variables
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
assert sci_dataset[f"{species}_counts_sectored"].shape == (frames, 2, 8, 15)
|
|
84
|
-
assert sci_dataset[f"{species}_energy_min"].shape == (2,)
|
|
85
|
-
elif species == "fe":
|
|
86
|
-
assert sci_dataset[f"{species}_counts_sectored"].shape == (frames, 1, 8, 15)
|
|
87
|
-
assert sci_dataset[f"{species}_energy_min"].shape == (1,)
|
|
88
|
-
assert (
|
|
89
|
-
sci_dataset[f"{species}_energy_max"].shape
|
|
90
|
-
== sci_dataset[f"{species}_energy_min"].shape
|
|
91
|
-
)
|
|
86
|
+
assert sci_dataset[f"{species}_sectored_counts"].shape == (frames, *shape)
|
|
87
|
+
assert sci_dataset[f"{species}_energy_mean"].shape == (shape[0],)
|
|
88
|
+
assert sci_dataset[f"{species}_energy_delta_minus"].shape == (shape[0],)
|
|
89
|
+
assert sci_dataset[f"{species}_energy_delta_plus"].shape == (shape[0],)
|
|
92
90
|
|
|
93
91
|
|
|
94
92
|
def test_calculate_uncertainties():
|
|
@@ -119,13 +117,13 @@ def test_calculate_uncertainties():
|
|
|
119
117
|
|
|
120
118
|
# Assertions
|
|
121
119
|
np.testing.assert_array_almost_equal(
|
|
122
|
-
result["
|
|
120
|
+
result["counts_stat_uncert_plus"].values, expected_delta_plus
|
|
123
121
|
)
|
|
124
122
|
np.testing.assert_array_almost_equal(
|
|
125
|
-
result["
|
|
123
|
+
result["counts_stat_uncert_minus"].values, expected_delta_minus
|
|
126
124
|
)
|
|
127
|
-
assert "
|
|
128
|
-
assert "
|
|
125
|
+
assert "version_stat_uncert_plus" not in result
|
|
126
|
+
assert "version_stat_uncert_minus" not in result
|
|
129
127
|
|
|
130
128
|
|
|
131
129
|
def test_validate_l1a_housekeeping_data(hk_packet_filepath):
|
|
@@ -139,7 +137,7 @@ def test_validate_l1a_housekeeping_data(hk_packet_filepath):
|
|
|
139
137
|
hk_packet_filepath : str
|
|
140
138
|
File path to housekeeping ccsds file
|
|
141
139
|
"""
|
|
142
|
-
datasets = hit_l1a(hk_packet_filepath
|
|
140
|
+
datasets = hit_l1a(hk_packet_filepath)
|
|
143
141
|
hk_dataset = None
|
|
144
142
|
for dataset in datasets:
|
|
145
143
|
if dataset.attrs["Logical_source"] == "imap_hit_l1a_hk":
|
|
@@ -151,6 +149,7 @@ def test_validate_l1a_housekeeping_data(hk_packet_filepath):
|
|
|
151
149
|
)
|
|
152
150
|
validation_data = pd.read_csv(validation_file)
|
|
153
151
|
validation_data.columns = validation_data.columns.str.lower()
|
|
152
|
+
validation_data.columns = validation_data.columns.str.strip()
|
|
154
153
|
|
|
155
154
|
# Get a list of leak columns in ascending order
|
|
156
155
|
# (LEAK_I_00, LEAK_I_01, ..., LEAK_I_63)
|
|
@@ -166,7 +165,6 @@ def test_validate_l1a_housekeeping_data(hk_packet_filepath):
|
|
|
166
165
|
# Define the keys that should have dropped from the housekeeping dataset
|
|
167
166
|
dropped_fields = {
|
|
168
167
|
"pkt_apid",
|
|
169
|
-
"sc_tick",
|
|
170
168
|
"version",
|
|
171
169
|
"type",
|
|
172
170
|
"sec_hdr_flg",
|
|
@@ -190,7 +188,6 @@ def test_validate_l1a_housekeeping_data(hk_packet_filepath):
|
|
|
190
188
|
"ccsds_grp_flag",
|
|
191
189
|
"ccsds_seq_cnt",
|
|
192
190
|
"ccsds_length",
|
|
193
|
-
"shcoarse",
|
|
194
191
|
}
|
|
195
192
|
|
|
196
193
|
# Check that dropped variables are not in the dataset
|
|
@@ -226,7 +223,7 @@ def test_validate_l1a_counts_data(sci_packet_filepath, validation_data):
|
|
|
226
223
|
"""
|
|
227
224
|
|
|
228
225
|
# Process the sample data
|
|
229
|
-
processed_datasets = hit_l1a(sci_packet_filepath
|
|
226
|
+
processed_datasets = hit_l1a(sci_packet_filepath)
|
|
230
227
|
l1a_counts_data = processed_datasets[0]
|
|
231
228
|
|
|
232
229
|
# Prepare validation data for comparison with processed data
|
|
@@ -243,7 +240,7 @@ def test_validate_l1a_counts_data(sci_packet_filepath, validation_data):
|
|
|
243
240
|
"seq_flgs",
|
|
244
241
|
"src_seq_ctr",
|
|
245
242
|
"pkt_len",
|
|
246
|
-
"
|
|
243
|
+
"energy_bin",
|
|
247
244
|
]
|
|
248
245
|
|
|
249
246
|
# Compare processed data to validation data
|
|
@@ -263,7 +260,7 @@ def test_hit_l1a(hk_packet_filepath, sci_packet_filepath):
|
|
|
263
260
|
Path to ccsds file for science data
|
|
264
261
|
"""
|
|
265
262
|
for packet_filepath in [hk_packet_filepath, sci_packet_filepath]:
|
|
266
|
-
processed_datasets = hit_l1a(packet_filepath
|
|
263
|
+
processed_datasets = hit_l1a(packet_filepath)
|
|
267
264
|
assert isinstance(processed_datasets, list)
|
|
268
265
|
assert all(isinstance(ds, xr.Dataset) for ds in processed_datasets)
|
|
269
266
|
if packet_filepath == hk_packet_filepath:
|
|
@@ -272,10 +269,9 @@ def test_hit_l1a(hk_packet_filepath, sci_packet_filepath):
|
|
|
272
269
|
else:
|
|
273
270
|
assert len(processed_datasets) == 2
|
|
274
271
|
assert (
|
|
275
|
-
processed_datasets[0].attrs["Logical_source"]
|
|
276
|
-
== "imap_hit_l1a_count-rates"
|
|
272
|
+
processed_datasets[0].attrs["Logical_source"] == "imap_hit_l1a_counts"
|
|
277
273
|
)
|
|
278
274
|
assert (
|
|
279
275
|
processed_datasets[1].attrs["Logical_source"]
|
|
280
|
-
== "
|
|
276
|
+
== "imap_hit_l1a_direct-events"
|
|
281
277
|
)
|