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
|
@@ -28,27 +28,19 @@ class TestENAMapMappingUtils:
|
|
|
28
28
|
"""Test coverage for bin_single_array_at_indices function w/ simple 2D input,
|
|
29
29
|
Corresponding to an extra axis that is not spatially binned.
|
|
30
30
|
"""
|
|
31
|
-
# Binning will occur along axis
|
|
31
|
+
# Binning will occur along axis 1 seen below
|
|
32
|
+
# (combining 1, 2, 3 and 4, 5, 6 separately).
|
|
32
33
|
value_array = np.array(
|
|
33
34
|
[
|
|
34
|
-
[1,
|
|
35
|
-
[
|
|
36
|
-
[3, 6],
|
|
35
|
+
[1, 2, 3],
|
|
36
|
+
[4, 5, 6],
|
|
37
37
|
]
|
|
38
38
|
)
|
|
39
39
|
input_indices = np.array([0, 1, 2, 2])
|
|
40
40
|
projection_indices = np.array([1, 0, 1, 6])
|
|
41
41
|
projection_grid_shape = (7, 1)
|
|
42
42
|
expected_projection_values = np.array(
|
|
43
|
-
[
|
|
44
|
-
[2, 5],
|
|
45
|
-
[4, 10],
|
|
46
|
-
[0, 0],
|
|
47
|
-
[0, 0],
|
|
48
|
-
[0, 0],
|
|
49
|
-
[0, 0],
|
|
50
|
-
[3, 6],
|
|
51
|
-
]
|
|
43
|
+
[[2, 4, 0, 0, 0, 0, 3], [5, 10, 0, 0, 0, 0, 6]]
|
|
52
44
|
)
|
|
53
45
|
projection_values = map_utils.bin_single_array_at_indices(
|
|
54
46
|
value_array,
|
|
@@ -76,7 +68,7 @@ class TestENAMapMappingUtils:
|
|
|
76
68
|
extra_axis_size = 11 # Another axis which is not spatially binned, e.g. energy
|
|
77
69
|
input_grid_size = np.prod(input_grid_shape)
|
|
78
70
|
projection_grid_size = np.prod(projection_grid_shape)
|
|
79
|
-
value_array = np.random.rand(
|
|
71
|
+
value_array = np.random.rand(extra_axis_size, input_grid_size)
|
|
80
72
|
input_indices = np.random.randint(0, input_grid_size, size=1000)
|
|
81
73
|
projection_indices = np.random.randint(0, projection_grid_size, size=1000)
|
|
82
74
|
projection_values = map_utils.bin_single_array_at_indices(
|
|
@@ -90,16 +82,16 @@ class TestENAMapMappingUtils:
|
|
|
90
82
|
np.testing.assert_equal(
|
|
91
83
|
projection_values.shape,
|
|
92
84
|
(
|
|
93
|
-
projection_grid_size,
|
|
94
85
|
extra_axis_size,
|
|
86
|
+
projection_grid_size,
|
|
95
87
|
),
|
|
96
88
|
)
|
|
97
89
|
|
|
98
90
|
# Create the expected projection values by summing the input values in a loop
|
|
99
91
|
# This is different from the binning function, which uses np.bincount
|
|
100
|
-
expected_projection_values = np.zeros((
|
|
92
|
+
expected_projection_values = np.zeros((extra_axis_size, projection_grid_size))
|
|
101
93
|
for ii, ip in zip(input_indices, projection_indices):
|
|
102
|
-
expected_projection_values[ip
|
|
94
|
+
expected_projection_values[:, ip] += value_array[:, ii]
|
|
103
95
|
|
|
104
96
|
np.testing.assert_allclose(projection_values, expected_projection_values)
|
|
105
97
|
|
|
@@ -117,7 +109,7 @@ class TestENAMapMappingUtils:
|
|
|
117
109
|
extra_axes_sizes = np.full(num_extra_dims, 3, dtype=int).tolist()
|
|
118
110
|
input_grid_size = np.prod(input_grid_shape)
|
|
119
111
|
projection_grid_size = np.prod(projection_grid_shape)
|
|
120
|
-
value_array = np.random.rand(
|
|
112
|
+
value_array = np.random.rand(*extra_axes_sizes, input_grid_size)
|
|
121
113
|
input_indices = np.random.randint(0, input_grid_size, size=1000)
|
|
122
114
|
projection_indices = np.random.randint(0, projection_grid_size, size=1000)
|
|
123
115
|
projection_values = map_utils.bin_single_array_at_indices(
|
|
@@ -130,14 +122,14 @@ class TestENAMapMappingUtils:
|
|
|
130
122
|
# Explicitly check that the shape of the output is the same as projection grid
|
|
131
123
|
np.testing.assert_equal(
|
|
132
124
|
projection_values.shape,
|
|
133
|
-
(
|
|
125
|
+
(*extra_axes_sizes, projection_grid_size),
|
|
134
126
|
)
|
|
135
127
|
|
|
136
128
|
# Create the expected projection values by summing the input values in a loop
|
|
137
129
|
# This is different from the binning function, which uses np.bincount
|
|
138
|
-
expected_projection_values = np.zeros((
|
|
130
|
+
expected_projection_values = np.zeros((*extra_axes_sizes, projection_grid_size))
|
|
139
131
|
for ii, ip in zip(input_indices, projection_indices):
|
|
140
|
-
expected_projection_values[ip
|
|
132
|
+
expected_projection_values[..., ip] += value_array[..., ii]
|
|
141
133
|
|
|
142
134
|
np.testing.assert_allclose(projection_values, expected_projection_values)
|
|
143
135
|
|
|
@@ -155,28 +147,59 @@ class TestENAMapMappingUtils:
|
|
|
155
147
|
scale_factor_1d = 1.5
|
|
156
148
|
input_values_1d_2 = input_values_1d_1 * scale_factor_1d
|
|
157
149
|
|
|
158
|
-
# 2D input values. The
|
|
150
|
+
# 2D input values. The 0 axis (different rows) will be summed independently
|
|
159
151
|
input_values_2d = np.array(
|
|
160
152
|
[
|
|
161
|
-
[
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
153
|
+
[
|
|
154
|
+
-0.5,
|
|
155
|
+
1,
|
|
156
|
+
4,
|
|
157
|
+
7,
|
|
158
|
+
0,
|
|
159
|
+
0,
|
|
160
|
+
0,
|
|
161
|
+
0,
|
|
162
|
+
0,
|
|
163
|
+
0,
|
|
164
|
+
0,
|
|
165
|
+
0,
|
|
166
|
+
],
|
|
167
|
+
[
|
|
168
|
+
0,
|
|
169
|
+
2,
|
|
170
|
+
5,
|
|
171
|
+
8,
|
|
172
|
+
0,
|
|
173
|
+
0,
|
|
174
|
+
0,
|
|
175
|
+
0,
|
|
176
|
+
0,
|
|
177
|
+
0,
|
|
178
|
+
0,
|
|
179
|
+
0,
|
|
180
|
+
],
|
|
181
|
+
[
|
|
182
|
+
0.5,
|
|
183
|
+
3,
|
|
184
|
+
6,
|
|
185
|
+
9,
|
|
186
|
+
0,
|
|
187
|
+
0,
|
|
188
|
+
0,
|
|
189
|
+
0,
|
|
190
|
+
0,
|
|
191
|
+
0,
|
|
192
|
+
0,
|
|
193
|
+
0,
|
|
194
|
+
],
|
|
173
195
|
]
|
|
174
196
|
)
|
|
175
|
-
|
|
197
|
+
|
|
198
|
+
extra_axis_size_2d = input_values_2d.shape[0]
|
|
176
199
|
|
|
177
200
|
# 3D input values
|
|
178
|
-
input_values_3d = np.zeros((input_values_2d.shape[
|
|
179
|
-
input_values_3d[:2] = np.array(
|
|
201
|
+
input_values_3d = np.zeros((3, 3, input_values_2d.shape[-1]))
|
|
202
|
+
input_values_3d[:, :, :2] = np.array(
|
|
180
203
|
[
|
|
181
204
|
[
|
|
182
205
|
[1, 2, 3],
|
|
@@ -189,8 +212,8 @@ class TestENAMapMappingUtils:
|
|
|
189
212
|
[16, 17, 18],
|
|
190
213
|
],
|
|
191
214
|
]
|
|
192
|
-
)
|
|
193
|
-
extra_axes_size_3d = input_values_3d.shape[1
|
|
215
|
+
).transpose(1, 2, 0)
|
|
216
|
+
extra_axes_size_3d = input_values_3d.shape[:-1]
|
|
194
217
|
|
|
195
218
|
# Set up the expected projection values
|
|
196
219
|
expected_projection_values_1d_1 = np.zeros(projection_grid_shape).ravel()
|
|
@@ -199,13 +222,13 @@ class TestENAMapMappingUtils:
|
|
|
199
222
|
expected_projection_values_1d_1 * scale_factor_1d
|
|
200
223
|
)
|
|
201
224
|
expected_projection_values_2d = np.zeros(
|
|
202
|
-
(np.prod(projection_grid_shape)
|
|
225
|
+
(extra_axis_size_2d, np.prod(projection_grid_shape))
|
|
203
226
|
)
|
|
204
|
-
expected_projection_values_2d[0
|
|
227
|
+
expected_projection_values_2d[:, 0] = np.array([11.5, 15, 18.5])
|
|
205
228
|
expected_projection_values_3d = np.zeros(
|
|
206
|
-
(np.prod(projection_grid_shape)
|
|
229
|
+
(*extra_axes_size_3d, np.prod(projection_grid_shape))
|
|
207
230
|
)
|
|
208
|
-
expected_projection_values_3d[
|
|
231
|
+
expected_projection_values_3d[:, :, 0] = np.array(
|
|
209
232
|
[
|
|
210
233
|
[11, 13, 15],
|
|
211
234
|
[17, 19, 21],
|
|
@@ -7,7 +7,7 @@ import pytest
|
|
|
7
7
|
from imap_processing.ena_maps.utils import spatial_utils
|
|
8
8
|
|
|
9
9
|
# Parameterize with spacings (degrees here):
|
|
10
|
-
valid_spacings = [0.25, 0.5, 1, 5, 10, 20]
|
|
10
|
+
valid_spacings = [0.25, 0.5, 1, 5, 6, 6.666666666666667, 10, 20]
|
|
11
11
|
invalid_spacings = [0, -1, 11]
|
|
12
12
|
invalid_spacings_match_str = [
|
|
13
13
|
"Spacing must be positive valued, non-zero.",
|
|
@@ -26,20 +26,20 @@ def test_build_spatial_bins():
|
|
|
26
26
|
)
|
|
27
27
|
|
|
28
28
|
assert az_bin_edges[0] == 0
|
|
29
|
-
assert az_bin_edges[-1] ==
|
|
29
|
+
assert az_bin_edges[-1] == 360
|
|
30
30
|
assert len(az_bin_edges) == 721
|
|
31
31
|
|
|
32
|
-
assert el_bin_edges[0] == -
|
|
33
|
-
assert el_bin_edges[-1] ==
|
|
32
|
+
assert el_bin_edges[0] == -90
|
|
33
|
+
assert el_bin_edges[-1] == 90
|
|
34
34
|
assert len(el_bin_edges) == 361
|
|
35
35
|
|
|
36
36
|
assert len(az_bin_midpoints) == 720
|
|
37
|
-
np.testing.assert_allclose(az_bin_midpoints[0],
|
|
38
|
-
np.testing.assert_allclose(az_bin_midpoints[-1],
|
|
37
|
+
np.testing.assert_allclose(az_bin_midpoints[0], 0.25, atol=1e-4)
|
|
38
|
+
np.testing.assert_allclose(az_bin_midpoints[-1], 359.75, atol=1e-4)
|
|
39
39
|
|
|
40
40
|
assert len(el_bin_midpoints) == 360
|
|
41
|
-
np.testing.assert_allclose(el_bin_midpoints[0],
|
|
42
|
-
np.testing.assert_allclose(el_bin_midpoints[-1],
|
|
41
|
+
np.testing.assert_allclose(el_bin_midpoints[0], -89.75, atol=1e-4)
|
|
42
|
+
np.testing.assert_allclose(el_bin_midpoints[-1], 89.75, atol=1e-4)
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
@pytest.mark.parametrize("spacing", valid_spacings)
|
|
@@ -91,7 +91,7 @@ def test_rewrap_even_spaced_az_el_grid_1d(order):
|
|
|
91
91
|
)
|
|
92
92
|
rewrapped_grid_known_shape = spatial_utils.rewrap_even_spaced_az_el_grid(
|
|
93
93
|
raveled_values,
|
|
94
|
-
|
|
94
|
+
grid_shape=orig_shape,
|
|
95
95
|
order=order,
|
|
96
96
|
)
|
|
97
97
|
|
|
@@ -102,19 +102,19 @@ def test_rewrap_even_spaced_az_el_grid_1d(order):
|
|
|
102
102
|
@pytest.mark.parametrize("order", ["C", "F"])
|
|
103
103
|
def test_rewrap_even_spaced_az_el_grid_2d(order):
|
|
104
104
|
"""Test rewrap_even_spaced_az_el_grid function, with extra axis."""
|
|
105
|
-
orig_shape = (360 * 12, 180 * 12
|
|
105
|
+
orig_shape = (5, 360 * 12, 180 * 12)
|
|
106
106
|
orig_grid = np.fromfunction(lambda i, j, k: i**2 + j + k, orig_shape, dtype=int)
|
|
107
|
-
raveled_values = orig_grid.reshape(-1,
|
|
107
|
+
raveled_values = orig_grid.reshape(5, -1, order=order)
|
|
108
108
|
rewrapped_grid_infer_shape = spatial_utils.rewrap_even_spaced_az_el_grid(
|
|
109
109
|
raveled_values,
|
|
110
110
|
order=order,
|
|
111
111
|
)
|
|
112
112
|
rewrapped_grid_known_shape = spatial_utils.rewrap_even_spaced_az_el_grid(
|
|
113
113
|
raveled_values,
|
|
114
|
-
|
|
114
|
+
grid_shape=orig_shape[-2:],
|
|
115
115
|
order=order,
|
|
116
116
|
)
|
|
117
|
-
assert raveled_values.shape == (360 * 12 * 180 * 12
|
|
117
|
+
assert raveled_values.shape == (5, 360 * 12 * 180 * 12)
|
|
118
118
|
assert np.array_equal(rewrapped_grid_infer_shape, orig_grid)
|
|
119
119
|
assert np.array_equal(rewrapped_grid_known_shape, orig_grid)
|
|
120
120
|
|
|
@@ -141,21 +141,17 @@ class TestAzElSkyGrid:
|
|
|
141
141
|
)
|
|
142
142
|
npt.assert_allclose(
|
|
143
143
|
grid.az_bin_midpoints,
|
|
144
|
-
|
|
144
|
+
expected_azimuth_bin_midpoints_deg,
|
|
145
145
|
atol=1e-11,
|
|
146
146
|
)
|
|
147
147
|
npt.assert_allclose(
|
|
148
148
|
grid.el_bin_midpoints,
|
|
149
|
-
|
|
149
|
+
expected_elevation_bin_midpoints_deg,
|
|
150
150
|
atol=1e-11,
|
|
151
151
|
)
|
|
152
152
|
|
|
153
153
|
# Check bin edges in degrees, radians
|
|
154
154
|
expected_az_bin_edges_deg = np.arange(0, 360 + spacing, spacing)
|
|
155
155
|
expected_el_bin_edges_deg = np.arange(-90, 90 + spacing, spacing)
|
|
156
|
-
npt.assert_allclose(
|
|
157
|
-
|
|
158
|
-
)
|
|
159
|
-
npt.assert_allclose(
|
|
160
|
-
grid.el_bin_edges, np.deg2rad(expected_el_bin_edges_deg), atol=1e-11
|
|
161
|
-
)
|
|
156
|
+
npt.assert_allclose(grid.az_bin_edges, expected_az_bin_edges_deg, atol=1e-11)
|
|
157
|
+
npt.assert_allclose(grid.el_bin_edges, expected_el_bin_edges_deg, atol=1e-11)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from functools import reduce
|
|
2
1
|
from pathlib import Path
|
|
3
2
|
|
|
4
3
|
import pytest
|
|
@@ -10,13 +9,13 @@ from imap_processing.glows.l1b.glows_l1b import glows_l1b
|
|
|
10
9
|
from imap_processing.glows.l2.glows_l2 import glows_l2
|
|
11
10
|
|
|
12
11
|
|
|
13
|
-
@pytest.fixture
|
|
12
|
+
@pytest.fixture
|
|
14
13
|
def packet_path():
|
|
15
14
|
current_directory = Path(__file__).parent
|
|
16
15
|
return current_directory / "validation_data" / "glows_test_packet_20110921_v01.pkts"
|
|
17
16
|
|
|
18
17
|
|
|
19
|
-
@pytest.fixture
|
|
18
|
+
@pytest.fixture
|
|
20
19
|
def decom_test_data(packet_path):
|
|
21
20
|
"""Read test data from file"""
|
|
22
21
|
|
|
@@ -24,31 +23,28 @@ def decom_test_data(packet_path):
|
|
|
24
23
|
return data_packet_list
|
|
25
24
|
|
|
26
25
|
|
|
27
|
-
@pytest.fixture
|
|
26
|
+
@pytest.fixture
|
|
28
27
|
def l1a_test_data(decom_test_data):
|
|
29
28
|
hist_l1a = []
|
|
30
29
|
|
|
31
30
|
for hist in decom_test_data[0]:
|
|
32
31
|
hist_l1a.append(HistogramL1A(hist))
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
# Flatten the dictionary to one list of DE values
|
|
37
|
-
de_l1a = reduce(list.__add__, [value for value in de_l1a_dict.values()])
|
|
33
|
+
de_l1a = process_de_l0(decom_test_data[1])
|
|
38
34
|
|
|
39
35
|
return hist_l1a, de_l1a
|
|
40
36
|
|
|
41
37
|
|
|
42
|
-
@pytest.fixture
|
|
38
|
+
@pytest.fixture
|
|
43
39
|
def l1a_dataset(packet_path):
|
|
44
|
-
return glows_l1a(packet_path
|
|
40
|
+
return glows_l1a(packet_path)
|
|
45
41
|
|
|
46
42
|
|
|
47
|
-
@pytest.fixture
|
|
43
|
+
@pytest.fixture
|
|
48
44
|
def l1b_hist_dataset(l1a_dataset):
|
|
49
|
-
return glows_l1b(l1a_dataset[
|
|
45
|
+
return glows_l1b(l1a_dataset[0])
|
|
50
46
|
|
|
51
47
|
|
|
52
|
-
@pytest.fixture
|
|
48
|
+
@pytest.fixture
|
|
53
49
|
def l2_hist_dataset(l1b_datasets):
|
|
54
|
-
return glows_l2(l1b_datasets
|
|
50
|
+
return glows_l2(l1b_datasets)
|
|
@@ -45,14 +45,14 @@ def test_glows_hist_data(decom_test_data):
|
|
|
45
45
|
"ELVAR": 0,
|
|
46
46
|
"EVENTS": 95978,
|
|
47
47
|
}
|
|
48
|
-
for key in expected_data.
|
|
49
|
-
assert getattr(decom_test_data[0][0], key) ==
|
|
48
|
+
for key, expected_val in expected_data.items():
|
|
49
|
+
assert getattr(decom_test_data[0][0], key) == expected_val
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
def test_glows_de_data(decom_test_data):
|
|
53
53
|
expected_data = {"MET": 54233694, "SEC": 54232338, "LEN": 1, "SEQ": 0}
|
|
54
|
-
for key in expected_data.
|
|
55
|
-
assert getattr(decom_test_data[1][0], key) ==
|
|
54
|
+
for key, expected_val in expected_data.items():
|
|
55
|
+
assert getattr(decom_test_data[1][0], key) == expected_val
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
def test_bad_header():
|
|
@@ -1,39 +1,18 @@
|
|
|
1
1
|
import dataclasses
|
|
2
|
-
from functools import reduce
|
|
3
2
|
|
|
4
3
|
import numpy as np
|
|
5
|
-
import pytest
|
|
6
4
|
|
|
7
|
-
from imap_processing.glows.l0 import decom_glows
|
|
8
5
|
from imap_processing.glows.l1a.glows_l1a import (
|
|
9
6
|
create_glows_attr_obj,
|
|
10
7
|
generate_de_dataset,
|
|
11
8
|
generate_histogram_dataset,
|
|
12
|
-
process_de_l0,
|
|
13
9
|
)
|
|
14
|
-
from imap_processing.glows.l1a.glows_l1a_data import HistogramL1A
|
|
15
10
|
from imap_processing.glows.utils.constants import TimeTuple
|
|
16
11
|
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
histogram_l0, de_l0 = decom_glows.decom_packets(packet_path)
|
|
23
|
-
|
|
24
|
-
histogram_l1a = [HistogramL1A(hist) for hist in histogram_l0]
|
|
25
|
-
|
|
26
|
-
de_l1a_dict = process_de_l0(de_l0)
|
|
27
|
-
|
|
28
|
-
# Flatten the dictionary to one list of DE values
|
|
29
|
-
de_l1a = reduce(list.__add__, [value for value in de_l1a_dict.values()])
|
|
30
|
-
|
|
31
|
-
return (histogram_l1a, de_l1a)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def test_generate_histogram_dataset(l1a_data):
|
|
35
|
-
histogram_l1a, _ = l1a_data
|
|
36
|
-
glows_attrs = create_glows_attr_obj("v001")
|
|
13
|
+
def test_generate_histogram_dataset(l1a_test_data):
|
|
14
|
+
histogram_l1a, _ = l1a_test_data
|
|
15
|
+
glows_attrs = create_glows_attr_obj()
|
|
37
16
|
dataset = generate_histogram_dataset(histogram_l1a, glows_attrs)
|
|
38
17
|
|
|
39
18
|
assert (dataset["histogram"].data[0] == histogram_l1a[0].histogram).all()
|
|
@@ -62,9 +41,9 @@ def test_generate_histogram_dataset(l1a_data):
|
|
|
62
41
|
assert (dataset["histogram"].data[i] == histogram_l1a[i].histogram).all()
|
|
63
42
|
|
|
64
43
|
|
|
65
|
-
def test_generate_de_dataset(
|
|
66
|
-
_, de_l1a =
|
|
67
|
-
glows_attrs = create_glows_attr_obj(
|
|
44
|
+
def test_generate_de_dataset(l1a_test_data):
|
|
45
|
+
_, de_l1a = l1a_test_data
|
|
46
|
+
glows_attrs = create_glows_attr_obj()
|
|
68
47
|
dataset = generate_de_dataset(de_l1a, glows_attrs)
|
|
69
48
|
assert len(dataset["epoch"].values) == len(de_l1a)
|
|
70
49
|
|
|
@@ -18,14 +18,14 @@ from imap_processing.glows.utils.constants import DirectEvent, GlowsConstants, T
|
|
|
18
18
|
from imap_processing.spice.time import met_to_ttj2000ns
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
@pytest.fixture
|
|
21
|
+
@pytest.fixture
|
|
22
22
|
def histogram_test_data(decom_test_data):
|
|
23
23
|
histl0 = decom_test_data[0][0]
|
|
24
24
|
hist = HistogramL1A(histl0)
|
|
25
25
|
return hist
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
@pytest.fixture
|
|
28
|
+
@pytest.fixture
|
|
29
29
|
def de_test_data(decom_test_data):
|
|
30
30
|
del0 = decom_test_data[1][0]
|
|
31
31
|
de = DirectEventL1A(del0)
|
|
@@ -41,19 +41,17 @@ def test_histogram_list(histogram_test_data, decom_test_data):
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
def test_histogram_obs_day(packet_path):
|
|
44
|
-
l1a = glows_l1a(packet_path
|
|
44
|
+
l1a = glows_l1a(packet_path)
|
|
45
45
|
|
|
46
|
-
assert len(l1a) ==
|
|
46
|
+
assert len(l1a) == 2
|
|
47
47
|
|
|
48
48
|
assert "hist" in l1a[0].attrs["Logical_source"]
|
|
49
|
-
assert "hist" in l1a[1].attrs["Logical_source"]
|
|
50
49
|
|
|
51
50
|
# Numbers pulled from the validation data.
|
|
52
51
|
# this test assumes that the "is_night" flag switching from true to false is the
|
|
53
52
|
# start of the observation day.
|
|
54
53
|
|
|
55
54
|
assert np.array_equal(l1a[0]["imap_start_time"].data[0], 54232215.0)
|
|
56
|
-
assert np.array_equal(l1a[1]["imap_start_time"].data[0], 54232455.0)
|
|
57
55
|
|
|
58
56
|
|
|
59
57
|
def test_histogram_attributes(histogram_test_data):
|
|
@@ -270,7 +268,7 @@ def test_combine_direct_events(decom_test_data):
|
|
|
270
268
|
de1 = DirectEventL1A(de0_first)
|
|
271
269
|
assert not de1.direct_events
|
|
272
270
|
if not de1.direct_events:
|
|
273
|
-
de1.
|
|
271
|
+
de1.merge_de_packets(de0_second)
|
|
274
272
|
|
|
275
273
|
assert de1.direct_events
|
|
276
274
|
|
|
@@ -293,7 +291,7 @@ def test_combine_direct_events_with_missing(decom_test_data):
|
|
|
293
291
|
de1 = DirectEventL1A(de0_first)
|
|
294
292
|
assert not de1.direct_events
|
|
295
293
|
if not de1.direct_events:
|
|
296
|
-
de1.
|
|
294
|
+
de1.merge_de_packets(de0_second)
|
|
297
295
|
|
|
298
296
|
assert de1.direct_events
|
|
299
297
|
# Missing one value
|
|
@@ -15,7 +15,7 @@ from imap_processing.glows.l1b.glows_l1b_data import (
|
|
|
15
15
|
)
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
@pytest.fixture
|
|
18
|
+
@pytest.fixture
|
|
19
19
|
def hist_dataset():
|
|
20
20
|
variables = {
|
|
21
21
|
"flight_software_version": np.zeros((20,)),
|
|
@@ -64,13 +64,13 @@ def hist_dataset():
|
|
|
64
64
|
coords={"epoch": epoch, "bins": bins},
|
|
65
65
|
)
|
|
66
66
|
|
|
67
|
-
for var in variables:
|
|
68
|
-
ds[var] = xr.DataArray(
|
|
67
|
+
for var, data in variables.items():
|
|
68
|
+
ds[var] = xr.DataArray(data, dims=["epoch"], coords={"epoch": epoch})
|
|
69
69
|
|
|
70
70
|
return ds
|
|
71
71
|
|
|
72
72
|
|
|
73
|
-
@pytest.fixture
|
|
73
|
+
@pytest.fixture
|
|
74
74
|
def de_dataset():
|
|
75
75
|
variables = {
|
|
76
76
|
"seq_count_in_pkts_file": np.zeros((20,)),
|
|
@@ -139,13 +139,13 @@ def de_dataset():
|
|
|
139
139
|
},
|
|
140
140
|
)
|
|
141
141
|
|
|
142
|
-
for var in variables:
|
|
143
|
-
ds[var] = xr.DataArray(
|
|
142
|
+
for var, data in variables.items():
|
|
143
|
+
ds[var] = xr.DataArray(data, dims=["epoch"], coords={"epoch": epoch})
|
|
144
144
|
|
|
145
145
|
return ds
|
|
146
146
|
|
|
147
147
|
|
|
148
|
-
@pytest.fixture
|
|
148
|
+
@pytest.fixture
|
|
149
149
|
def ancillary_dict():
|
|
150
150
|
dictionary = {
|
|
151
151
|
"description": "Table for conversion/decoding ancillary parameters collected "
|
|
@@ -289,7 +289,7 @@ def test_process_de(de_dataset, ancillary_dict):
|
|
|
289
289
|
|
|
290
290
|
|
|
291
291
|
def test_glows_l1b(de_dataset, hist_dataset):
|
|
292
|
-
hist_output = glows_l1b(hist_dataset
|
|
292
|
+
hist_output = glows_l1b(hist_dataset)
|
|
293
293
|
|
|
294
294
|
assert hist_output["histogram"].dims == ("epoch", "bins")
|
|
295
295
|
assert hist_output["histogram"].shape == (20, 3600)
|
|
@@ -341,7 +341,7 @@ def test_glows_l1b(de_dataset, hist_dataset):
|
|
|
341
341
|
for key in expected_hist_data:
|
|
342
342
|
assert key in hist_output
|
|
343
343
|
|
|
344
|
-
de_output = glows_l1b(de_dataset
|
|
344
|
+
de_output = glows_l1b(de_dataset)
|
|
345
345
|
|
|
346
346
|
# From table 15 in the algorithm document
|
|
347
347
|
expected_de_data = [
|
|
@@ -364,14 +364,14 @@ def test_glows_l1b(de_dataset, hist_dataset):
|
|
|
364
364
|
|
|
365
365
|
|
|
366
366
|
def test_generate_histogram_dataset(hist_dataset):
|
|
367
|
-
l1b_data = glows_l1b(hist_dataset
|
|
367
|
+
l1b_data = glows_l1b(hist_dataset)
|
|
368
368
|
output_path = write_cdf(l1b_data)
|
|
369
369
|
|
|
370
370
|
assert Path.exists(output_path)
|
|
371
371
|
|
|
372
372
|
|
|
373
373
|
def test_generate_de_dataset(de_dataset):
|
|
374
|
-
l1b_data = glows_l1b(de_dataset
|
|
374
|
+
l1b_data = glows_l1b(de_dataset)
|
|
375
375
|
|
|
376
376
|
output_path = write_cdf(l1b_data)
|
|
377
377
|
|
|
@@ -48,8 +48,8 @@ def test_glows_l1b_ancillary_file():
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
ancillary = AncillaryParameters(fake_good_input)
|
|
51
|
-
for key in fake_good_input:
|
|
52
|
-
assert getattr(ancillary, key) ==
|
|
51
|
+
for key, data in fake_good_input.items():
|
|
52
|
+
assert getattr(ancillary, key) == data
|
|
53
53
|
|
|
54
54
|
fake_bad_input = {
|
|
55
55
|
"version": "0.1",
|
|
@@ -80,7 +80,7 @@ def test_glows_l1b_de():
|
|
|
80
80
|
|
|
81
81
|
|
|
82
82
|
def test_validation_data_histogram(l1a_dataset):
|
|
83
|
-
l1b = [glows_l1b(l1a_dataset[0]
|
|
83
|
+
l1b = [glows_l1b(l1a_dataset[0]), glows_l1b(l1a_dataset[1])]
|
|
84
84
|
end_time = l1b[0]["epoch"].data[-1]
|
|
85
85
|
|
|
86
86
|
validation_data = (
|
|
@@ -147,9 +147,9 @@ def test_validation_data_histogram(l1a_dataset):
|
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
def test_validation_data_de(l1a_dataset):
|
|
150
|
-
de_data = l1a_dataset[
|
|
150
|
+
de_data = l1a_dataset[1]
|
|
151
151
|
|
|
152
|
-
l1b = glows_l1b(de_data
|
|
152
|
+
l1b = glows_l1b(de_data)
|
|
153
153
|
validation_data = (
|
|
154
154
|
Path(__file__).parent / "validation_data" / "imap_glows_l1b_de_output.json"
|
|
155
155
|
)
|
|
@@ -10,7 +10,7 @@ from imap_processing.glows.l2.glows_l2 import (
|
|
|
10
10
|
from imap_processing.glows.l2.glows_l2_data import DailyLightcurve
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
@pytest.fixture
|
|
13
|
+
@pytest.fixture
|
|
14
14
|
def l1b_hists():
|
|
15
15
|
epoch = xr.DataArray(np.arange(4), name="epoch", dims=["epoch"])
|
|
16
16
|
bins = xr.DataArray(np.arange(5), name="bins", dims=["bins"])
|
|
@@ -29,18 +29,12 @@ def l1b_hists():
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
def test_glows_l2(l1b_hist_dataset):
|
|
32
|
-
l2 = glows_l2(l1b_hist_dataset
|
|
32
|
+
l2 = glows_l2(l1b_hist_dataset)[0]
|
|
33
33
|
assert l2.attrs["Logical_source"] == "imap_glows_l2_hist"
|
|
34
34
|
|
|
35
35
|
assert np.allclose(l2["filter_temperature_average"].values, [57.6], rtol=0.1)
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
@pytest.mark.skip(reason="Spin table not yet complete")
|
|
39
|
-
def test_split_by_observational_day(l1b_hist_dataset):
|
|
40
|
-
# TODO: Complete test when spin table is complete
|
|
41
|
-
raise NotImplementedError
|
|
42
|
-
|
|
43
|
-
|
|
44
38
|
def test_filter_good_times():
|
|
45
39
|
active_flags = np.ones((17,))
|
|
46
40
|
active_flags[16] = 0
|
|
@@ -48,7 +48,7 @@ def check_sum(bits_size):
|
|
|
48
48
|
return f"{0:0{bits_size}b}"
|
|
49
49
|
|
|
50
50
|
|
|
51
|
-
@pytest.fixture
|
|
51
|
+
@pytest.fixture
|
|
52
52
|
def create_de_data(tmp_path):
|
|
53
53
|
"""Fixture to create fake direct event data. Note that there has been no
|
|
54
54
|
effort to make simulate this data meaning that packets are not self
|
|
Binary file
|